From 122d7fe18fa6d82a76ccbc5cee4055ec7be9f428 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 27 Jul 2020 10:44:19 +0200 Subject: [PATCH 001/126] [Graph] Unskip graph tests (#72291) --- x-pack/test/functional/apps/graph/graph.ts | 28 ++++++++++--------- .../functional/page_objects/graph_page.ts | 12 +------- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/x-pack/test/functional/apps/graph/graph.ts b/x-pack/test/functional/apps/graph/graph.ts index 803e5e8f80d70..c2500dca78444 100644 --- a/x-pack/test/functional/apps/graph/graph.ts +++ b/x-pack/test/functional/apps/graph/graph.ts @@ -13,8 +13,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const browser = getService('browser'); - // FLAKY: https://github.com/elastic/kibana/issues/53749 - describe.skip('graph', function () { + describe('graph', function () { before(async () => { await browser.setWindowSize(1600, 1000); log.debug('load graph/secrepo data'); @@ -132,14 +131,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await buildGraph(); const { edges } = await PageObjects.graph.getGraphObjects(); - const blogAdminBlogEdge = edges.find( + await PageObjects.graph.isolateEdge('test', '/test/wp-admin/'); + + await PageObjects.graph.stopLayout(); + await PageObjects.common.sleep(1000); + const testTestWpAdminBlogEdge = edges.find( ({ sourceNode, targetNode }) => - sourceNode.label === '/blog/wp-admin/' && targetNode.label === 'blog' + targetNode.label === '/test/wp-admin/' && sourceNode.label === 'test' )!; - - await PageObjects.graph.isolateEdge(blogAdminBlogEdge); - - await PageObjects.graph.clickEdge(blogAdminBlogEdge); + await testTestWpAdminBlogEdge.element.click(); + await PageObjects.common.sleep(1000); + await PageObjects.graph.startLayout(); const vennTerm1 = await PageObjects.graph.getVennTerm1(); log.debug('vennTerm1 = ' + vennTerm1); @@ -156,11 +158,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const smallVennTerm2 = await PageObjects.graph.getSmallVennTerm2(); log.debug('smallVennTerm2 = ' + smallVennTerm2); - expect(vennTerm1).to.be('/blog/wp-admin/'); - expect(vennTerm2).to.be('blog'); - expect(smallVennTerm1).to.be('5'); - expect(smallVennTerm12).to.be(' (5) '); - expect(smallVennTerm2).to.be('8'); + expect(vennTerm1).to.be('/test/wp-admin/'); + expect(vennTerm2).to.be('test'); + expect(smallVennTerm1).to.be('4'); + expect(smallVennTerm12).to.be(' (4) '); + expect(smallVennTerm2).to.be('4'); }); it('should delete graph', async function () { diff --git a/x-pack/test/functional/page_objects/graph_page.ts b/x-pack/test/functional/page_objects/graph_page.ts index 0d3e2c10579f5..fe049327fe38b 100644 --- a/x-pack/test/functional/page_objects/graph_page.ts +++ b/x-pack/test/functional/page_objects/graph_page.ts @@ -83,10 +83,7 @@ export function GraphPageProvider({ getService, getPageObjects }: FtrProviderCon return [this.getPositionAsString(x1, y1), this.getPositionAsString(x2, y2)]; } - async isolateEdge(edge: Edge) { - const from = edge.sourceNode.label; - const to = edge.targetNode.label; - + async isolateEdge(from: string, to: string) { // select all nodes await testSubjects.click('graphSelectAll'); @@ -109,13 +106,6 @@ export function GraphPageProvider({ getService, getPageObjects }: FtrProviderCon await testSubjects.click('graphRemoveSelection'); } - async clickEdge(edge: Edge) { - await this.stopLayout(); - await PageObjects.common.sleep(1000); - await edge.element.click(); - await this.startLayout(); - } - async stopLayout() { if (await testSubjects.exists('graphPauseLayout')) { await testSubjects.click('graphPauseLayout'); From 6a53b0021e63383a6202a8f5814701e9a719b82a Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 27 Jul 2020 10:45:23 +0200 Subject: [PATCH 002/126] Convert functional vega tests to ts and unskip tests (#72238) * convert to ts and unskip tests * relax tests and remove unused imports * remove test exclusion * remove inspector test Co-authored-by: Elastic Machine --- .../{_vega_chart.js => _vega_chart.ts} | 35 +++++++--- .../page_objects/vega_chart_page.ts | 61 +++++++----------- .../screenshots/baseline/vega_chart.png | Bin 59257 -> 0 bytes .../baseline/vega_chart_filtered.png | Bin 59342 -> 0 bytes 4 files changed, 52 insertions(+), 44 deletions(-) rename test/functional/apps/visualize/{_vega_chart.js => _vega_chart.ts} (59%) delete mode 100644 test/functional/screenshots/baseline/vega_chart.png delete mode 100644 test/functional/screenshots/baseline/vega_chart_filtered.png diff --git a/test/functional/apps/visualize/_vega_chart.js b/test/functional/apps/visualize/_vega_chart.ts similarity index 59% rename from test/functional/apps/visualize/_vega_chart.js rename to test/functional/apps/visualize/_vega_chart.ts index c530c6f823133..6c0b77411ae99 100644 --- a/test/functional/apps/visualize/_vega_chart.js +++ b/test/functional/apps/visualize/_vega_chart.ts @@ -18,9 +18,17 @@ */ import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; -export default function ({ getService, getPageObjects }) { - const PageObjects = getPageObjects(['timePicker', 'visualize', 'visChart', 'vegaChart']); +// eslint-disable-next-line import/no-default-export +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const PageObjects = getPageObjects([ + 'timePicker', + 'visualize', + 'visChart', + 'visEditor', + 'vegaChart', + ]); const filterBar = getService('filterBar'); const log = getService('log'); @@ -30,13 +38,15 @@ export default function ({ getService, getPageObjects }) { await PageObjects.visualize.navigateToNewVisualization(); log.debug('clickVega'); await PageObjects.visualize.clickVega(); + await PageObjects.visChart.waitForVisualizationRenderingStabilized(); }); describe('vega chart', () => { describe('initial render', () => { - it.skip('should have some initial vega spec text', async function () { + it('should have some initial vega spec text', async function () { const vegaSpec = await PageObjects.vegaChart.getSpec(); - expect(vegaSpec).to.contain('{').and.to.contain('data'); + expect(vegaSpec).to.contain('{'); + expect(vegaSpec).to.contain('data'); expect(vegaSpec.length).to.be.above(500); }); @@ -44,7 +54,8 @@ export default function ({ getService, getPageObjects }) { const view = await PageObjects.vegaChart.getViewContainer(); expect(view).to.be.ok(); const size = await view.getSize(); - expect(size).to.have.property('width').and.to.have.property('height'); + expect(size).to.have.property('width'); + expect(size).to.have.property('height'); expect(size.width).to.be.above(0); expect(size.height).to.be.above(0); @@ -63,10 +74,18 @@ export default function ({ getService, getPageObjects }) { await filterBar.removeAllFilters(); }); - it.skip('should render different data in response to filter change', async function () { - await PageObjects.vegaChart.expectVisToMatchScreenshot('vega_chart'); + it('should render different data in response to filter change', async function () { + await PageObjects.vegaChart.typeInSpec('"config": { "kibana": {"renderer": "svg"} },'); + await PageObjects.visEditor.clickGo(); + await PageObjects.visChart.waitForVisualizationRenderingStabilized(); + const fullDataLabels = await PageObjects.vegaChart.getYAxisLabels(); + expect(fullDataLabels[0]).to.eql('0'); + expect(fullDataLabels[fullDataLabels.length - 1]).to.eql('1,600'); await filterBar.addFilter('@tags.raw', 'is', 'error'); - await PageObjects.vegaChart.expectVisToMatchScreenshot('vega_chart_filtered'); + await PageObjects.visChart.waitForVisualizationRenderingStabilized(); + const filteredDataLabels = await PageObjects.vegaChart.getYAxisLabels(); + expect(filteredDataLabels[0]).to.eql('0'); + expect(filteredDataLabels[filteredDataLabels.length - 1]).to.eql('90'); }); }); }); diff --git a/test/functional/page_objects/vega_chart_page.ts b/test/functional/page_objects/vega_chart_page.ts index 488f4cfd0d0ce..b9906911b00f1 100644 --- a/test/functional/page_objects/vega_chart_page.ts +++ b/test/functional/page_objects/vega_chart_page.ts @@ -17,20 +17,17 @@ * under the License. */ -import expect from '@kbn/expect'; +import { Key } from 'selenium-webdriver'; import { FtrProviderContext } from '../ftr_provider_context'; export function VegaChartPageProvider({ getService, getPageObjects, - updateBaselines, }: FtrProviderContext & { updateBaselines: boolean }) { const find = getService('find'); const testSubjects = getService('testSubjects'); const browser = getService('browser'); - const screenshot = getService('screenshots'); - const log = getService('log'); - const { visEditor, visChart } = getPageObjects(['visEditor', 'visChart']); + const { common } = getPageObjects(['common']); class VegaChartPage { public async getSpec() { @@ -45,6 +42,19 @@ export function VegaChartPageProvider({ return linesText.join('\n'); } + public async typeInSpec(text: string) { + const editor = await testSubjects.find('vega-editor'); + const textarea = await editor.findByClassName('ace_content'); + await textarea.click(); + let repeats = 20; + while (--repeats > 0) { + await browser.pressKeys(Key.ARROW_UP); + await common.sleep(50); + } + await browser.pressKeys(Key.ARROW_RIGHT); + await browser.pressKeys(text); + } + public async getViewContainer() { return await find.byCssSelector('div.vgaVis__view'); } @@ -53,37 +63,16 @@ export function VegaChartPageProvider({ return await find.byCssSelector('div.vgaVis__controls'); } - /** - * Removes chrome and takes a small screenshot of a vis to compare against a baseline. - * @param {string} name The name of the baseline image. - * @param {object} opts Options object. - * @param {number} opts.threshold Threshold for allowed variance when comparing images. - */ - public async expectVisToMatchScreenshot(name: string, opts = { threshold: 0.05 }) { - log.debug(`expectVisToMatchScreenshot(${name})`); - - // Collapse sidebar and inject some CSS to hide the nav so we have a focused screenshot - await visEditor.clickEditorSidebarCollapse(); - await visChart.waitForVisualizationRenderingStabilized(); - await browser.execute(` - var el = document.createElement('style'); - el.id = '__data-test-style'; - el.innerHTML = '[data-test-subj="headerGlobalNav"] { display: none; } '; - el.innerHTML += '[data-test-subj="top-nav"] { display: none; } '; - el.innerHTML += '[data-test-subj="experimentalVisInfo"] { display: none; } '; - document.body.appendChild(el); - `); - - const percentDifference = await screenshot.compareAgainstBaseline(name, updateBaselines); - - // Reset the chart to its original state - await browser.execute(` - var el = document.getElementById('__data-test-style'); - document.body.removeChild(el); - `); - await visEditor.clickEditorSidebarCollapse(); - await visChart.waitForVisualizationRenderingStabilized(); - expect(percentDifference).to.be.lessThan(opts.threshold); + public async getYAxisLabels() { + const chart = await testSubjects.find('visualizationLoader'); + const yAxis = await chart.findByCssSelector('[aria-label^="Y-axis"]'); + const tickGroup = await yAxis.findByClassName('role-axis-label'); + const labels = await tickGroup.findAllByCssSelector('text'); + const labelTexts: string[] = []; + for (const label of labels) { + labelTexts.push(await label.getVisibleText()); + } + return labelTexts; } } diff --git a/test/functional/screenshots/baseline/vega_chart.png b/test/functional/screenshots/baseline/vega_chart.png deleted file mode 100644 index 5288bd9c7b924b4cd94885f45aa28b3543aa3257..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59257 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 Date: Mon, 27 Jul 2020 11:58:11 +0200 Subject: [PATCH 003/126] Remove flaky note from gauge tests (#73240) --- test/functional/apps/visualize/_gauge_chart.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/functional/apps/visualize/_gauge_chart.js b/test/functional/apps/visualize/_gauge_chart.js index aa94e596319c2..0f870b1fb545f 100644 --- a/test/functional/apps/visualize/_gauge_chart.js +++ b/test/functional/apps/visualize/_gauge_chart.js @@ -26,7 +26,6 @@ export default function ({ getService, getPageObjects }) { const testSubjects = getService('testSubjects'); const PageObjects = getPageObjects(['visualize', 'visEditor', 'visChart', 'timePicker']); - // FLAKY: https://github.com/elastic/kibana/issues/45089 describe('gauge chart', function indexPatternCreation() { async function initGaugeVis() { log.debug('navigateToApp visualize'); From 9d5b1bf20b5c5f48f9b9c6e4b8bfaee426e6f364 Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Mon, 27 Jul 2020 12:10:16 +0100 Subject: [PATCH 004/126] simplified buffer tests to reduce flakyness (#73024) Co-authored-by: Elastic Machine --- .../server/lib/bulk_operation_buffer.test.ts | 80 ++++++++----------- 1 file changed, 32 insertions(+), 48 deletions(-) diff --git a/x-pack/plugins/task_manager/server/lib/bulk_operation_buffer.test.ts b/x-pack/plugins/task_manager/server/lib/bulk_operation_buffer.test.ts index 3a21f622cec17..f32a755515a95 100644 --- a/x-pack/plugins/task_manager/server/lib/bulk_operation_buffer.test.ts +++ b/x-pack/plugins/task_manager/server/lib/bulk_operation_buffer.test.ts @@ -33,8 +33,7 @@ function errorAttempts(task: TaskInstance): Err { +describe('Bulk Operation Buffer', () => { describe('createBuffer()', () => { test('batches up multiple Operation calls', async () => { const bulkUpdate: jest.Mocked> = jest.fn( @@ -67,8 +66,6 @@ describe.skip('Bulk Operation Buffer', () => { const task2 = createTask(); const task3 = createTask(); const task4 = createTask(); - const task5 = createTask(); - const task6 = createTask(); return new Promise((resolve) => { Promise.all([bufferedUpdate(task1), bufferedUpdate(task2)]).then((_) => { @@ -79,22 +76,18 @@ describe.skip('Bulk Operation Buffer', () => { setTimeout(() => { // on next tick - setTimeout(() => { - // on next tick - expect(bulkUpdate).toHaveBeenCalledTimes(2); - Promise.all([bufferedUpdate(task5), bufferedUpdate(task6)]).then((_) => { - expect(bulkUpdate).toHaveBeenCalledTimes(3); - expect(bulkUpdate).toHaveBeenCalledWith([task5, task6]); - resolve(); - }); - }, bufferMaxDuration + 1); - expect(bulkUpdate).toHaveBeenCalledTimes(1); Promise.all([bufferedUpdate(task3), bufferedUpdate(task4)]).then((_) => { expect(bulkUpdate).toHaveBeenCalledTimes(2); expect(bulkUpdate).toHaveBeenCalledWith([task3, task4]); }); - }, bufferMaxDuration + 1); + + setTimeout(() => { + // on next tick + expect(bulkUpdate).toHaveBeenCalledTimes(2); + resolve(); + }, bufferMaxDuration * 1.1); + }, bufferMaxDuration * 1.1); }); }); @@ -103,8 +96,9 @@ describe.skip('Bulk Operation Buffer', () => { return Promise.resolve(tasks.map(incrementAttempts)); }); + const bufferMaxDuration = 1000; const bufferedUpdate = createBuffer(bulkUpdate, { - bufferMaxDuration: 100, + bufferMaxDuration, bufferMaxOperations: 2, }); @@ -114,26 +108,19 @@ describe.skip('Bulk Operation Buffer', () => { const task4 = createTask(); const task5 = createTask(); - return new Promise((resolve) => { - bufferedUpdate(task1); - bufferedUpdate(task2); - bufferedUpdate(task3); - bufferedUpdate(task4); - - setTimeout(() => { - expect(bulkUpdate).toHaveBeenCalledTimes(2); - expect(bulkUpdate).toHaveBeenCalledWith([task1, task2]); - expect(bulkUpdate).toHaveBeenCalledWith([task3, task4]); - - setTimeout(() => { - expect(bulkUpdate).toHaveBeenCalledTimes(2); - bufferedUpdate(task5).then((_) => { - expect(bulkUpdate).toHaveBeenCalledTimes(3); - expect(bulkUpdate).toHaveBeenCalledWith([task5]); - resolve(); - }); - }, 50); - }, 50); + return Promise.all([ + bufferedUpdate(task1), + bufferedUpdate(task2), + bufferedUpdate(task3), + bufferedUpdate(task4), + ]).then(() => { + expect(bulkUpdate).toHaveBeenCalledTimes(2); + expect(bulkUpdate).toHaveBeenCalledWith([task1, task2]); + expect(bulkUpdate).toHaveBeenCalledWith([task3, task4]); + return bufferedUpdate(task5).then((_) => { + expect(bulkUpdate).toHaveBeenCalledTimes(3); + expect(bulkUpdate).toHaveBeenCalledWith([task5]); + }); }); }); @@ -153,29 +140,26 @@ describe.skip('Bulk Operation Buffer', () => { const task3 = createTask(); const task4 = createTask(); - return new Promise((resolve) => { - bufferedUpdate(task1); - bufferedUpdate(task2); - - setTimeout(() => { - expect(bulkUpdate).toHaveBeenCalledTimes(1); - expect(bulkUpdate).toHaveBeenCalledWith([task1, task2]); + return Promise.all([bufferedUpdate(task1), bufferedUpdate(task2)]).then(() => { + expect(bulkUpdate).toHaveBeenCalledTimes(1); + expect(bulkUpdate).toHaveBeenCalledWith([task1, task2]); - bufferedUpdate(task3); - bufferedUpdate(task4); + return new Promise((resolve) => { + const futureUpdates = Promise.all([bufferedUpdate(task3), bufferedUpdate(task4)]); setTimeout(() => { expect(bulkUpdate).toHaveBeenCalledTimes(1); - setTimeout(() => { + futureUpdates.then(() => { expect(bulkUpdate).toHaveBeenCalledTimes(2); expect(bulkUpdate).toHaveBeenCalledWith([task3, task4]); resolve(); - }, bufferMaxDuration / 2); + }); }, bufferMaxDuration / 2); - }, bufferMaxDuration + 1); + }); }); }); + test('handles both resolutions and rejections at individual task level', async (done) => { const bulkUpdate: jest.Mocked> = jest.fn( ([task1, task2, task3]) => { From d3ddcd2027442dd11136b4307f65ba4e693654de Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 27 Jul 2020 08:18:36 -0500 Subject: [PATCH 005/126] [APM] APM & Observability plugin lint improvements (#72702) * [APM] APM & Observability plugin lint improvements This is a large change, but most of it is automatic `eslint --fix` changes. * Apply the same ESLint ovderrides in APM and Observability plugins. * Remove the `no-unused-vars` rule. We can turn on the TypeScript check if needed. * Check both JS and TS files. * Add a rule for react function component definitions * Upgrade eslint-plugin-react to include that rule --- .eslintrc.js | 21 +-- package.json | 2 +- .../views/data/components/data_view.test.tsx | 4 +- .../plugins/apm/e2e/cypress/plugins/index.js | 2 + .../plugins/apm/public/application/index.tsx | 10 +- .../app/ErrorGroupOverview/List/index.tsx | 4 +- .../app/ErrorGroupOverview/index.tsx | 4 +- .../Breakdowns/BreakdownFilter.tsx | 6 +- .../Breakdowns/BreakdownGroup.tsx | 6 +- .../app/RumDashboard/ChartWrapper/index.tsx | 9 +- .../RumDashboard/Charts/PageLoadDistChart.tsx | 1 + .../Charts/VisitorBreakdownChart.tsx | 4 +- .../PageLoadDistribution/BreakdownSeries.tsx | 8 +- .../PercentileAnnotations.tsx | 10 +- .../PageLoadDistribution/index.tsx | 4 +- .../app/RumDashboard/PageViewsTrend/index.tsx | 4 +- .../app/RumDashboard/RumDashboard.tsx | 4 +- .../app/RumDashboard/RumHeader/index.tsx | 24 ++-- .../RumDashboard/VisitorBreakdown/index.tsx | 4 +- .../app/ServiceMap/EmptyBanner.test.tsx | 36 +++-- .../app/ServiceMap/LoadingOverlay.tsx | 48 +++---- .../app/ServiceMap/Popover/Contents.tsx | 11 +- .../components/app/ServiceMap/index.test.tsx | 6 +- .../components/app/ServiceMap/index.tsx | 4 +- .../app/ServiceNodeOverview/index.tsx | 4 +- .../AgentConfigurations/List/index.tsx | 4 +- .../CustomLink/CreateCustomLinkButton.tsx | 22 ++- .../CustomLinkFlyout/Documentation.tsx | 16 ++- .../CustomLinkFlyout/FiltersSection.tsx | 38 ++--- .../CustomLinkFlyout/FlyoutFooter.tsx | 6 +- .../CustomLinkFlyout/LinkPreview.tsx | 4 +- .../CustomLinkFlyout/LinkSection.tsx | 9 +- .../CustomLink/CustomLinkFlyout/index.tsx | 6 +- .../CustomLink/CustomLinkTable.tsx | 39 +++--- .../CustomizeUI/CustomLink/EmptyPrompt.tsx | 6 +- .../Settings/CustomizeUI/CustomLink/Title.tsx | 62 +++++---- .../Settings/CustomizeUI/CustomLink/index.tsx | 4 +- .../app/Settings/CustomizeUI/index.tsx | 4 +- .../anomaly_detection/add_environments.tsx | 6 +- .../app/Settings/anomaly_detection/index.tsx | 4 +- .../Settings/anomaly_detection/jobs_list.tsx | 4 +- .../public/components/app/Settings/index.tsx | 6 +- .../public/components/app/TraceLink/index.tsx | 4 +- .../TransactionDetails/Distribution/index.tsx | 10 +- .../WaterfallWithSummmary/ErrorCount.tsx | 38 ++--- .../SpanFlyout/TruncateHeightSection.tsx | 10 +- .../Waterfall/WaterfallFlyout.tsx | 7 +- .../Waterfall/WaterfallItem.tsx | 10 +- .../WaterfallContainer/Waterfall/index.tsx | 10 +- .../WaterfallWithSummmary/index.tsx | 6 +- .../components/shared/ApmHeader/index.tsx | 42 +++--- .../DatePicker/__test__/DatePicker.test.tsx | 30 ++-- .../public/components/shared/EmptyMessage.tsx | 6 +- .../shared/EnvironmentBadge/index.tsx | 4 +- .../shared/EnvironmentFilter/index.tsx | 4 +- .../public/components/shared/EuiTabLink.tsx | 4 +- .../shared/HeightRetainer/index.tsx | 9 +- .../components/shared/KueryBar/index.tsx | 1 - .../components/shared/LicensePrompt/index.tsx | 4 +- .../Links/DiscoverLinks/DiscoverErrorLink.tsx | 13 +- .../Links/DiscoverLinks/DiscoverSpanLink.tsx | 12 +- .../DiscoverLinks/DiscoverTransactionLink.tsx | 12 +- .../Links/MachineLearningLinks/MLJobLink.tsx | 9 +- .../shared/Links/apm/ErrorDetailLink.tsx | 4 +- .../shared/Links/apm/ErrorOverviewLink.tsx | 4 +- .../components/shared/Links/apm/HomeLink.tsx | 4 +- .../shared/Links/apm/MetricOverviewLink.tsx | 4 +- .../shared/Links/apm/ServiceMapLink.tsx | 4 +- .../apm/ServiceNodeMetricOverviewLink.tsx | 6 +- .../Links/apm/ServiceNodeOverviewLink.tsx | 4 +- .../shared/Links/apm/ServiceOverviewLink.tsx | 4 +- .../shared/Links/apm/SettingsLink.tsx | 4 +- .../shared/Links/apm/TraceOverviewLink.tsx | 4 +- .../Links/apm/TransactionDetailLink.tsx | 6 +- .../Links/apm/TransactionOverviewLink.tsx | 4 +- .../LocalUIFilters/Filter/FilterBadgeList.tsx | 40 +++--- .../Filter/FilterTitleButton.tsx | 4 +- .../shared/LocalUIFilters/Filter/index.tsx | 11 +- .../ServiceNameFilter/index.tsx | 4 +- .../TransactionTypeFilter/index.tsx | 4 +- .../shared/LocalUIFilters/index.tsx | 6 +- .../components/shared/MetadataTable/index.tsx | 32 +++-- .../shared/SelectWithPlaceholder/index.tsx | 1 + .../PopoverExpression/index.tsx | 4 +- .../shared/Stacktrace/FrameHeading.tsx | 4 +- .../shared/Stacktrace/Variables.tsx | 4 +- .../shared/Summary/DurationSummaryItem.tsx | 8 +- .../Summary/ErrorCountSummaryItemBadge.tsx | 4 +- .../shared/Summary/TransactionSummary.tsx | 12 +- .../components/shared/Summary/index.tsx | 4 +- .../CustomLink/CustomLinkPopover.tsx | 6 +- .../CustomLink/CustomLinkSection.tsx | 42 +++--- .../CustomLink/ManageCustomLink.tsx | 74 +++++----- .../CustomLink/index.tsx | 6 +- .../TransactionActionMenu.tsx | 34 ++--- .../TransactionBreakdownGraph/index.tsx | 4 +- .../TransactionBreakdownKpiList.tsx | 11 +- .../shared/TransactionBreakdown/index.tsx | 4 +- .../charts/CustomPlot/AnnotationsPlot.tsx | 4 +- .../ErroneousTransactionsRateChart/index.tsx | 4 +- .../components/shared/charts/Legend/index.tsx | 6 +- .../charts/Timeline/Marker/AgentMarker.tsx | 4 +- .../charts/Timeline/Marker/ErrorMarker.tsx | 4 +- .../shared/charts/Timeline/Marker/index.tsx | 4 +- .../shared/charts/Timeline/TimelineAxis.tsx | 6 +- .../shared/charts/Timeline/VerticalLines.tsx | 6 +- .../ChoroplethMap/ChoroplethToolTip.tsx | 10 +- .../TransactionCharts/ChoroplethMap/index.tsx | 4 +- .../DurationByCountryMap/index.tsx | 4 +- .../TransactionLineChart/index.tsx | 4 +- .../apm/public/context/ChartsSyncContext.tsx | 6 +- .../MockUrlParamsContextProvider.tsx | 6 +- .../public/utils/getRangeFromTimeSeries.ts | 4 +- .../plugins/apm/public/utils/testHelpers.tsx | 8 +- .../public/application/index.tsx | 4 +- .../components/app/chart_container/index.tsx | 6 +- .../components/app/empty_section/index.tsx | 4 +- .../public/components/app/header/index.tsx | 6 +- .../app/ingest_manager_panel/index.tsx | 4 +- .../components/app/layout/with_header.tsx | 30 ++-- .../public/components/app/news_feed/index.tsx | 8 +- .../public/components/app/resources/index.tsx | 4 +- .../components/app/section/alerts/index.tsx | 4 +- .../components/app/section/apm/index.tsx | 6 +- .../app/section/error_panel/index.tsx | 4 +- .../public/components/app/section/index.tsx | 4 +- .../components/app/section/logs/index.tsx | 6 +- .../components/app/section/metrics/index.tsx | 12 +- .../components/app/section/uptime/index.tsx | 12 +- .../components/app/styled_stat/index.tsx | 4 +- .../components/shared/action_menu/index.tsx | 74 +++++----- .../components/shared/data_picker/index.tsx | 4 +- .../observability/public/pages/home/index.tsx | 4 +- .../public/pages/landing/index.tsx | 4 +- .../public/pages/overview/index.tsx | 8 +- .../pages/overview/loading_observability.tsx | 4 +- .../public/typings/eui_styled_components.tsx | 24 ++-- .../components/rules/mitre/index.tsx | 2 +- .../tags_filter_popover.tsx | 1 + yarn.lock | 130 +++++++++++------- 140 files changed, 824 insertions(+), 733 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index e2674e8d7b407..c9f9d96f9ddae 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -771,19 +771,22 @@ module.exports = { }, /** - * APM overrides + * APM and Observability overrides */ { - files: ['x-pack/plugins/apm/**/*.js'], + files: [ + 'x-pack/plugins/apm/**/*.{js,mjs,ts,tsx}', + 'x-pack/plugins/observability/**/*.{js,mjs,ts,tsx}', + ], rules: { - 'no-unused-vars': ['error', { ignoreRestSiblings: true }], 'no-console': ['warn', { allow: ['error'] }], - }, - }, - { - plugins: ['react-hooks'], - files: ['x-pack/plugins/apm/**/*.{ts,tsx}'], - rules: { + 'react/function-component-definition': [ + 'warn', + { + namedComponents: 'function-declaration', + unnamedComponents: 'arrow-function', + }, + ], 'react-hooks/rules-of-hooks': 'error', // Checks rules of Hooks 'react-hooks/exhaustive-deps': ['error', { additionalHooks: '^useFetcher$' }], }, diff --git a/package.json b/package.json index 594f0ce583987..ee91c59a8fda6 100644 --- a/package.json +++ b/package.json @@ -435,7 +435,7 @@ "eslint-plugin-node": "^11.0.0", "eslint-plugin-prefer-object-spread": "^1.2.1", "eslint-plugin-prettier": "^3.1.3", - "eslint-plugin-react": "^7.17.0", + "eslint-plugin-react": "^7.20.3", "eslint-plugin-react-hooks": "^4.0.4", "eslint-plugin-react-perf": "^3.2.3", "exit-hook": "^2.2.0", diff --git a/src/plugins/inspector/public/views/data/components/data_view.test.tsx b/src/plugins/inspector/public/views/data/components/data_view.test.tsx index 2772069d36877..bd78bca42c479 100644 --- a/src/plugins/inspector/public/views/data/components/data_view.test.tsx +++ b/src/plugins/inspector/public/views/data/components/data_view.test.tsx @@ -51,13 +51,13 @@ describe('Inspector Data View', () => { }); it('should render loading state', () => { - const component = mountWithIntl(); + const component = mountWithIntl(); // eslint-disable-line react/jsx-pascal-case expect(component).toMatchSnapshot(); }); it('should render empty state', async () => { - const component = mountWithIntl(); + const component = mountWithIntl(); // eslint-disable-line react/jsx-pascal-case const tabularLoader = Promise.resolve(null); adapters.data.setTabularLoader(() => tabularLoader); await tabularLoader; diff --git a/x-pack/plugins/apm/e2e/cypress/plugins/index.js b/x-pack/plugins/apm/e2e/cypress/plugins/index.js index 540b887d55df5..c5529c747adcd 100644 --- a/x-pack/plugins/apm/e2e/cypress/plugins/index.js +++ b/x-pack/plugins/apm/e2e/cypress/plugins/index.js @@ -29,6 +29,8 @@ module.exports = (on) => { // readFileMaybe on('task', { + // ESLint thinks this is a react component for some reason. + // eslint-disable-next-line react/function-component-definition readFileMaybe(filename) { if (fs.existsSync(filename)) { return fs.readFileSync(filename, 'utf8'); diff --git a/x-pack/plugins/apm/public/application/index.tsx b/x-pack/plugins/apm/public/application/index.tsx index c39afe6da215e..0c9c6eb86225b 100644 --- a/x-pack/plugins/apm/public/application/index.tsx +++ b/x-pack/plugins/apm/public/application/index.tsx @@ -37,7 +37,7 @@ const MainContainer = styled.div` height: 100%; `; -const App = () => { +function App() { const [darkMode] = useUiSetting$('theme:darkMode'); return ( @@ -59,9 +59,9 @@ const App = () => { ); -}; +} -const ApmAppRoot = ({ +function ApmAppRoot({ core, deps, routerHistory, @@ -71,7 +71,7 @@ const ApmAppRoot = ({ deps: ApmPluginSetupDeps; routerHistory: typeof history; config: ConfigSchema; -}) => { +}) { const i18nCore = core.i18n; const plugins = deps; const apmPluginContextValue = { @@ -111,7 +111,7 @@ const ApmAppRoot = ({ ); -}; +} /** * This module is rendered asynchronously in the Kibana platform. diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/index.tsx b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/index.tsx index 1096c0c77db30..5c16bf0f324be 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/index.tsx +++ b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/index.tsx @@ -53,7 +53,7 @@ interface Props { items: ErrorGroupListAPIResponse; } -const ErrorGroupList: React.FC = (props) => { +function ErrorGroupList(props: Props) { const { items } = props; const { urlParams } = useUrlParams(); const { serviceName } = urlParams; @@ -213,6 +213,6 @@ const ErrorGroupList: React.FC = (props) => { sortItems={false} /> ); -}; +} export { ErrorGroupList }; diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/index.tsx b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/index.tsx index b9a28c1c1841f..fe2303d645ec9 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/index.tsx @@ -22,7 +22,7 @@ import { LocalUIFilters } from '../../shared/LocalUIFilters'; import { ErrorDistribution } from '../ErrorGroupDetails/Distribution'; import { ErrorGroupList } from './List'; -const ErrorGroupOverview: React.FC = () => { +function ErrorGroupOverview() { const { urlParams, uiFilters } = useUrlParams(); const { serviceName, start, end, sortField, sortDirection } = urlParams; @@ -123,6 +123,6 @@ const ErrorGroupOverview: React.FC = () => { ); -}; +} export { ErrorGroupOverview }; diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/Breakdowns/BreakdownFilter.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/Breakdowns/BreakdownFilter.tsx index 332cf40a465f9..7e5e7cdc53c55 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/Breakdowns/BreakdownFilter.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/Breakdowns/BreakdownFilter.tsx @@ -20,11 +20,11 @@ interface Props { onBreakdownChange: (values: BreakdownItem[]) => void; } -export const BreakdownFilter = ({ +export function BreakdownFilter({ id, selectedBreakdowns, onBreakdownChange, -}: Props) => { +}: Props) { const categories: BreakdownItem[] = [ { name: 'Browser', @@ -65,4 +65,4 @@ export const BreakdownFilter = ({ }} /> ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/Breakdowns/BreakdownGroup.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/Breakdowns/BreakdownGroup.tsx index 5bf84b6c918c5..d4f80667ce98b 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/Breakdowns/BreakdownGroup.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/Breakdowns/BreakdownGroup.tsx @@ -22,12 +22,12 @@ export interface BreakdownGroupProps { onChange: (values: BreakdownItem[]) => void; } -export const BreakdownGroup = ({ +export function BreakdownGroup({ id, disabled, onChange, items, -}: BreakdownGroupProps) => { +}: BreakdownGroupProps) { const [isOpen, setIsOpen] = useState(false); const [activeItems, setActiveItems] = useState(items); @@ -97,4 +97,4 @@ export const BreakdownGroup = ({ ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/ChartWrapper/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/ChartWrapper/index.tsx index a3cfbb28abee2..970365779a0a2 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/ChartWrapper/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/ChartWrapper/index.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { FC, HTMLAttributes } from 'react'; +import React, { HTMLAttributes, ReactNode } from 'react'; import { EuiErrorBoundary, EuiFlexGroup, @@ -13,6 +13,7 @@ import { } from '@elastic/eui'; interface Props { + children?: ReactNode; /** * Height for the chart */ @@ -27,12 +28,12 @@ interface Props { 'aria-label'?: string; } -export const ChartWrapper: FC = ({ +export function ChartWrapper({ loading = false, height = '100%', children, ...rest -}) => { +}: Props) { const opacity = loading === true ? 0.3 : 1; return ( @@ -60,4 +61,4 @@ export const ChartWrapper: FC = ({ )} ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx index 6c5b539fcecfa..b2b5e66d06ac6 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx @@ -70,6 +70,7 @@ export function PageLoadDistChart({ onPercentileChange(minX, maxX); }; + // eslint-disable-next-line react/function-component-definition const headerFormatter: TooltipValueFormatter = (tooltip: TooltipValue) => { return (
diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/VisitorBreakdownChart.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/VisitorBreakdownChart.tsx index 1e28fde4aa2b4..9f9ffdf7168b8 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/VisitorBreakdownChart.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/VisitorBreakdownChart.tsx @@ -29,7 +29,7 @@ interface Props { }>; } -export const VisitorBreakdownChart = ({ options }: Props) => { +export function VisitorBreakdownChart({ options }: Props) { const [darkMode] = useUiSetting$('theme:darkMode'); return ( @@ -93,4 +93,4 @@ export const VisitorBreakdownChart = ({ options }: Props) => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/BreakdownSeries.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/BreakdownSeries.tsx index 0c47ad24128ef..475a235ef5eed 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/BreakdownSeries.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/BreakdownSeries.tsx @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { FC, useEffect } from 'react'; import { CurveType, LineSeries, ScaleType } from '@elastic/charts'; +import React, { useEffect } from 'react'; import { PercentileRange } from './index'; import { useBreakdowns } from './use_breakdowns'; @@ -16,12 +16,12 @@ interface Props { onLoadingChange: (loading: boolean) => void; } -export const BreakdownSeries: FC = ({ +export function BreakdownSeries({ field, value, percentileRange, onLoadingChange, -}) => { +}: Props) { const { data, status } = useBreakdowns({ field, value, @@ -47,4 +47,4 @@ export const BreakdownSeries: FC = ({ ))} ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/PercentileAnnotations.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/PercentileAnnotations.tsx index 9066dd73159b1..407ec42f03ff5 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/PercentileAnnotations.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/PercentileAnnotations.tsx @@ -33,7 +33,7 @@ const PercentileMarker = styled.span` bottom: 205px; `; -export const PercentileAnnotations = ({ percentiles }: Props) => { +export function PercentileAnnotations({ percentiles }: Props) { const dataValues = generateAnnotationData(percentiles) ?? []; const style: Partial = { @@ -44,17 +44,17 @@ export const PercentileAnnotations = ({ percentiles }: Props) => { }, }; - const PercentileTooltip = ({ + function PercentileTooltip({ annotation, }: { annotation: LineAnnotationDatum; - }) => { + }) { return ( {annotation.details}th Percentile ); - }; + } return ( <> @@ -82,4 +82,4 @@ export const PercentileAnnotations = ({ percentiles }: Props) => { ))} ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/index.tsx index adeff2b31fd93..c7545ff9a2764 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/index.tsx @@ -24,7 +24,7 @@ export interface PercentileRange { max?: number | null; } -export const PageLoadDistribution = () => { +export function PageLoadDistribution() { const { urlParams, uiFilters } = useUrlParams(); const { start, end, serviceName } = urlParams; @@ -115,4 +115,4 @@ export const PageLoadDistribution = () => { />
); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx index c6ef319f8a666..0f43c0ddf540d 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx @@ -13,7 +13,7 @@ import { BreakdownFilter } from '../Breakdowns/BreakdownFilter'; import { PageViewsChart } from '../Charts/PageViewsChart'; import { BreakdownItem } from '../../../../../typings/ui_filters'; -export const PageViewsTrend = () => { +export function PageViewsTrend() { const { urlParams, uiFilters } = useUrlParams(); const { start, end, serviceName } = urlParams; @@ -68,4 +68,4 @@ export const PageViewsTrend = () => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumDashboard.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumDashboard.tsx index 2eb79257334d7..8c8164972328f 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumDashboard.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumDashboard.tsx @@ -18,7 +18,7 @@ import { PageLoadDistribution } from './PageLoadDistribution'; import { I18LABELS } from './translations'; import { VisitorBreakdown } from './VisitorBreakdown'; -export const RumDashboard = () => { +export function RumDashboard() { return ( @@ -54,4 +54,4 @@ export const RumDashboard = () => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHeader/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHeader/index.tsx index b1ff38fdd2d79..6b3fcb3b03466 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHeader/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHeader/index.tsx @@ -5,16 +5,18 @@ */ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import React from 'react'; +import React, { ReactNode } from 'react'; import { DatePicker } from '../../../shared/DatePicker'; -export const RumHeader: React.FC = ({ children }) => ( - <> - - {children} - - - - - -); +export function RumHeader({ children }: { children: ReactNode }) { + return ( + <> + + {children} + + + + + + ); +} diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdown/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdown/index.tsx index 2e17e27587b63..5c68ebb1667ab 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdown/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdown/index.tsx @@ -11,7 +11,7 @@ import { VisitorBreakdownLabel } from '../translations'; import { useFetcher } from '../../../../hooks/useFetcher'; import { useUrlParams } from '../../../../hooks/useUrlParams'; -export const VisitorBreakdown = () => { +export function VisitorBreakdown() { const { urlParams, uiFilters } = useUrlParams(); const { start, end, serviceName } = urlParams; @@ -62,4 +62,4 @@ export const VisitorBreakdown = () => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/EmptyBanner.test.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/EmptyBanner.test.tsx index b330129f83785..f314fbbb1fba0 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/EmptyBanner.test.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/EmptyBanner.test.tsx @@ -4,32 +4,38 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { FunctionComponent } from 'react'; import { act, wait } from '@testing-library/react'; import cytoscape from 'cytoscape'; -import { CytoscapeContext } from './Cytoscape'; -import { EmptyBanner } from './EmptyBanner'; +import React, { ReactNode } from 'react'; import { MockApmPluginContextWrapper } from '../../../context/ApmPluginContext/MockApmPluginContext'; import { renderWithTheme } from '../../../utils/testHelpers'; +import { CytoscapeContext } from './Cytoscape'; +import { EmptyBanner } from './EmptyBanner'; const cy = cytoscape({}); -const wrapper: FunctionComponent = ({ children }) => ( - - {children} - -); +function wrapper({ children }: { children: ReactNode }) { + return ( + + + {children} + + + ); +} describe('EmptyBanner', () => { describe('when cy is undefined', () => { it('renders null', () => { - const noCytoscapeWrapper: FunctionComponent = ({ children }) => ( - - - {children} - - - ); + function noCytoscapeWrapper({ children }: { children: ReactNode }) { + return ( + + + {children} + + + ); + } const component = renderWithTheme(, { wrapper: noCytoscapeWrapper, }); diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/LoadingOverlay.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/LoadingOverlay.tsx index 9e805058e8cb5..8557c3f0c0798 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/LoadingOverlay.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/LoadingOverlay.tsx @@ -34,26 +34,28 @@ interface Props { percentageLoaded: number; } -export const LoadingOverlay = ({ isLoading, percentageLoaded }: Props) => ( - - {isLoading && ( - - - - - - - {i18n.translate('xpack.apm.loadingServiceMap', { - defaultMessage: - 'Loading service map... This might take a short while.', - })} - - - )} - -); +export function LoadingOverlay({ isLoading, percentageLoaded }: Props) { + return ( + + {isLoading && ( + + + + + + + {i18n.translate('xpack.apm.loadingServiceMap', { + defaultMessage: + 'Loading service map... This might take a short while.', + })} + + + )} + + ); +} diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Contents.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Contents.tsx index 78466b2659bb7..4911d7f147d7c 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Contents.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Contents.tsx @@ -34,20 +34,21 @@ interface ContentsProps { // @ts-ignore `documentMode` is not recognized as a valid property of `document`. const isIE11 = !!window.MSInputMethodContext && !!document.documentMode; -const FlexColumnGroup = (props: { +function FlexColumnGroup(props: { children: React.ReactNode; style: React.CSSProperties; direction: 'column'; gutterSize: 's'; -}) => { +}) { if (isIE11) { const { direction, gutterSize, ...rest } = props; return
; } return ; -}; -const FlexColumnItem = (props: { children: React.ReactNode }) => - isIE11 ?
: ; +} +function FlexColumnItem(props: { children: React.ReactNode }) { + return isIE11 ?
: ; +} export function Contents({ selectedNodeData, diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/index.test.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/index.test.tsx index f36b94f2971cd..4a56f75b05de9 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/index.test.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/index.test.tsx @@ -5,7 +5,7 @@ */ import { render } from '@testing-library/react'; -import React, { FunctionComponent } from 'react'; +import React, { ReactNode } from 'react'; import { License } from '../../../../../licensing/common/license'; import { LicenseContext } from '../../../context/LicenseContext'; import { ServiceMap } from './'; @@ -22,13 +22,13 @@ const expiredLicense = new License({ }, }); -const Wrapper: FunctionComponent = ({ children }) => { +function Wrapper({ children }: { children?: ReactNode }) { return ( {children} ); -}; +} describe('ServiceMap', () => { describe('with an inactive license', () => { diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/index.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/index.tsx index 7f3d25efa6f44..d4be4da2ae1c5 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/index.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/index.tsx @@ -29,7 +29,7 @@ interface ServiceMapProps { serviceName?: string; } -export const ServiceMap = ({ serviceName }: ServiceMapProps) => { +export function ServiceMap({ serviceName }: ServiceMapProps) { const theme = useTheme(); const license = useLicense(); const { urlParams } = useUrlParams(); @@ -101,4 +101,4 @@ export const ServiceMap = ({ serviceName }: ServiceMapProps) => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/ServiceNodeOverview/index.tsx b/x-pack/plugins/apm/public/components/app/ServiceNodeOverview/index.tsx index 62ea3bc42860a..5537a73d228e8 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceNodeOverview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceNodeOverview/index.tsx @@ -36,7 +36,7 @@ const ServiceNodeName = styled.div` ${truncate(px(8 * unit))} `; -const ServiceNodeOverview = () => { +function ServiceNodeOverview() { const { uiFilters, urlParams } = useUrlParams(); const { serviceName, start, end } = urlParams; @@ -182,6 +182,6 @@ const ServiceNodeOverview = () => { ); -}; +} export { ServiceNodeOverview }; diff --git a/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/List/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/List/index.tsx index 0f23e230733b4..ce325a57426f5 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/List/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/List/index.tsx @@ -38,7 +38,7 @@ interface Props { refetch: () => void; } -export const AgentConfigurationList = ({ status, data, refetch }: Props) => { +export function AgentConfigurationList({ status, data, refetch }: Props) { const theme = useTheme(); const [configToBeDeleted, setConfigToBeDeleted] = useState( null @@ -219,4 +219,4 @@ export const AgentConfigurationList = ({ status, data, refetch }: Props) => { /> ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateCustomLinkButton.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateCustomLinkButton.tsx index 919cc4debe4d8..2e860ebe22c0f 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateCustomLinkButton.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateCustomLinkButton.tsx @@ -7,15 +7,13 @@ import React from 'react'; import { EuiButton } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -export const CreateCustomLinkButton = ({ - onClick, -}: { - onClick: () => void; -}) => ( - - {i18n.translate( - 'xpack.apm.settings.customizeUI.customLink.createCustomLink', - { defaultMessage: 'Create custom link' } - )} - -); +export function CreateCustomLinkButton({ onClick }: { onClick: () => void }) { + return ( + + {i18n.translate( + 'xpack.apm.settings.customizeUI.customLink.createCustomLink', + { defaultMessage: 'Create custom link' } + )} + + ); +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/Documentation.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/Documentation.tsx index 48a0288f11ae5..262d22be25272 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/Documentation.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/Documentation.tsx @@ -9,8 +9,14 @@ import { ElasticDocsLink } from '../../../../../shared/Links/ElasticDocsLink'; interface Props { label: string; } -export const Documentation = ({ label }: Props) => ( - - {label} - -); +export function Documentation({ label }: Props) { + return ( + + {label} + + ); +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/FiltersSection.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/FiltersSection.tsx index daadc1bace9c4..8cf0f03175fc2 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/FiltersSection.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/FiltersSection.tsx @@ -26,13 +26,13 @@ import { getSelectOptions, } from './helper'; -export const FiltersSection = ({ +export function FiltersSection({ filters, onChangeFilters, }: { filters: Filter[]; onChangeFilters: (filters: Filter[]) => void; -}) => { +}) { const onChangeFilter = ( key: Filter['key'], value: Filter['value'], @@ -147,25 +147,27 @@ export const FiltersSection = ({ /> ); -}; +} -const AddFilterButton = ({ +function AddFilterButton({ onClick, isDisabled, }: { onClick: () => void; isDisabled: boolean; -}) => ( - - {i18n.translate( - 'xpack.apm.settings.customizeUI.customLink.flyout.filters.addAnotherFilter', - { - defaultMessage: 'Add another filter', - } - )} - -); +}) { + return ( + + {i18n.translate( + 'xpack.apm.settings.customizeUI.customLink.flyout.filters.addAnotherFilter', + { + defaultMessage: 'Add another filter', + } + )} + + ); +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/FlyoutFooter.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/FlyoutFooter.tsx index 4fde75602990c..17c3fb265bca5 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/FlyoutFooter.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/FlyoutFooter.tsx @@ -14,7 +14,7 @@ import { import { i18n } from '@kbn/i18n'; import { DeleteButton } from './DeleteButton'; -export const FlyoutFooter = ({ +export function FlyoutFooter({ onClose, isSaving, onDelete, @@ -26,7 +26,7 @@ export const FlyoutFooter = ({ onDelete: () => void; customLinkId?: string; isSaveButtonEnabled: boolean; -}) => { +}) { return ( @@ -61,4 +61,4 @@ export const FlyoutFooter = ({ ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/LinkPreview.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/LinkPreview.tsx index b229157d1b1a8..b7250bda30966 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/LinkPreview.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/LinkPreview.tsx @@ -41,7 +41,7 @@ const fetchTransaction = debounce( const getTextColor = (value?: string) => (value ? 'default' : 'subdued'); -export const LinkPreview = ({ label, url, filters }: Props) => { +export function LinkPreview({ label, url, filters }: Props) { const [transaction, setTransaction] = useState(); useEffect(() => { @@ -128,4 +128,4 @@ export const LinkPreview = ({ label, url, filters }: Props) => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/LinkSection.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/LinkSection.tsx index 6a31752d11705..49307cbb8efba 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/LinkSection.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/LinkSection.tsx @@ -31,12 +31,7 @@ interface Props { onChangeUrl: (url: string) => void; } -export const LinkSection = ({ - label, - onChangeLabel, - url, - onChangeUrl, -}: Props) => { +export function LinkSection({ label, onChangeLabel, url, onChangeUrl }: Props) { const inputFields: InputField[] = [ { name: 'label', @@ -145,4 +140,4 @@ export const LinkSection = ({ })} ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/index.tsx index ccd98bd005666..9687846d6c520 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/index.tsx @@ -37,13 +37,13 @@ interface Props { const filtersEmptyState: Filter[] = [{ key: '', value: '' }]; -export const CustomLinkFlyout = ({ +export function CustomLinkFlyout({ onClose, onSave, onDelete, defaults, customLinkId, -}: Props) => { +}: Props) { const { toasts } = useApmPluginContext().core.notifications; const [isSaving, setIsSaving] = useState(false); @@ -139,4 +139,4 @@ export const CustomLinkFlyout = ({ ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkTable.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkTable.tsx index f2aabc878bf2d..d512ea19c7892 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkTable.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkTable.tsx @@ -24,10 +24,7 @@ interface Props { onCustomLinkSelected: (customLink: CustomLink) => void; } -export const CustomLinkTable = ({ - items = [], - onCustomLinkSelected, -}: Props) => { +export function CustomLinkTable({ items = [], onCustomLinkSelected }: Props) { const [searchTerm, setSearchTerm] = useState(''); const columns = [ @@ -121,20 +118,22 @@ export const CustomLinkTable = ({ /> ); -}; +} -const NoResultFound = ({ value }: { value: string }) => ( - - - - {i18n.translate( - 'xpack.apm.settings.customizeUI.customLink.table.noResultFound', - { - defaultMessage: `No results for "{value}".`, - values: { value }, - } - )} - - - -); +function NoResultFound({ value }: { value: string }) { + return ( + + + + {i18n.translate( + 'xpack.apm.settings.customizeUI.customLink.table.noResultFound', + { + defaultMessage: `No results for "{value}".`, + values: { value }, + } + )} + + + + ); +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/EmptyPrompt.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/EmptyPrompt.tsx index ee9350e320e1a..9411043c0b716 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/EmptyPrompt.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/EmptyPrompt.tsx @@ -8,11 +8,11 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { CreateCustomLinkButton } from './CreateCustomLinkButton'; -export const EmptyPrompt = ({ +export function EmptyPrompt({ onCreateCustomLinkClick, }: { onCreateCustomLinkClick: () => void; -}) => { +}) { return ( } /> ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/Title.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/Title.tsx index 95b8adb403981..22d8749d78834 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/Title.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/Title.tsx @@ -7,34 +7,36 @@ import { EuiFlexGroup, EuiFlexItem, EuiIconTip, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; -export const Title = () => ( - - - - - -

- {i18n.translate('xpack.apm.settings.customizeUI.customLink', { - defaultMessage: 'Custom Links', - })} -

-
+export function Title() { + return ( + + + + + +

+ {i18n.translate('xpack.apm.settings.customizeUI.customLink', { + defaultMessage: 'Custom Links', + })} +

+
- - - -
-
-
-
-); + + + +
+
+
+
+ ); +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.tsx index b4acc783d08ed..aa34515ea460a 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.tsx @@ -18,7 +18,7 @@ import { Title } from './Title'; import { CreateCustomLinkButton } from './CreateCustomLinkButton'; import { LicensePrompt } from '../../../../shared/LicensePrompt'; -export const CustomLinkOverview = () => { +export function CustomLinkOverview() { const license = useLicense(); const hasValidLicense = license?.isActive && license?.hasAtLeast('gold'); @@ -107,4 +107,4 @@ export const CustomLinkOverview = () => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/index.tsx index c88eba1c87b57..84408a7624403 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/index.tsx @@ -9,7 +9,7 @@ import { EuiTitle, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { CustomLinkOverview } from './CustomLink'; -export const CustomizeUI = () => { +export function CustomizeUI() { return ( <> @@ -23,4 +23,4 @@ export const CustomizeUI = () => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/add_environments.tsx b/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/add_environments.tsx index c9328c4988e5f..cb2090d1cbe2b 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/add_environments.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/add_environments.tsx @@ -31,11 +31,11 @@ interface Props { onCreateJobSuccess: () => void; onCancel: () => void; } -export const AddEnvironments = ({ +export function AddEnvironments({ currentEnvironments, onCreateJobSuccess, onCancel, -}: Props) => { +}: Props) { const { notifications, application } = useApmPluginContext().core; const canCreateJob = !!application.capabilities.ml.canCreateJob; const { toasts } = notifications; @@ -175,4 +175,4 @@ export const AddEnvironments = ({ ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/index.tsx index abbe1e2c83c7b..dab30761c6ebe 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/index.tsx @@ -28,7 +28,7 @@ const DEFAULT_VALUE: AnomalyDetectionApiResponse = { errorCode: undefined, }; -export const AnomalyDetection = () => { +export function AnomalyDetection() { const plugin = useApmPluginContext(); const canGetJobs = !!plugin.core.application.capabilities.ml.canGetJobs; const license = useLicense(); @@ -112,4 +112,4 @@ export const AnomalyDetection = () => { )} ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/jobs_list.tsx b/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/jobs_list.tsx index f3b8822010f59..8494004ae5639 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/jobs_list.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/jobs_list.tsx @@ -65,7 +65,7 @@ interface Props { status: FETCH_STATUS; onAddEnvironments: () => void; } -export const JobsList = ({ data, status, onAddEnvironments }: Props) => { +export function JobsList({ data, status, onAddEnvironments }: Props) { const { jobs, hasLegacyJobs, errorCode } = data; return ( @@ -127,7 +127,7 @@ export const JobsList = ({ data, status, onAddEnvironments }: Props) => { {hasLegacyJobs && } ); -}; +} function getNoItemsMessage({ status, diff --git a/x-pack/plugins/apm/public/components/app/Settings/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/index.tsx index 6d8571bf57767..bd2ea706e492d 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/index.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { ReactNode } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonEmpty, @@ -17,7 +17,7 @@ import { HomeLink } from '../../shared/Links/apm/HomeLink'; import { useLocation } from '../../../hooks/useLocation'; import { getAPMHref } from '../../shared/Links/apm/APMLink'; -export const Settings: React.FC = (props) => { +export function Settings(props: { children: ReactNode }) { const { search, pathname } = useLocation(); return ( <> @@ -84,4 +84,4 @@ export const Settings: React.FC = (props) => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/TraceLink/index.tsx b/x-pack/plugins/apm/public/components/app/TraceLink/index.tsx index 3eb5a855ee3b4..55ab275002b4e 100644 --- a/x-pack/plugins/apm/public/components/app/TraceLink/index.tsx +++ b/x-pack/plugins/apm/public/components/app/TraceLink/index.tsx @@ -58,7 +58,7 @@ const redirectToTracePage = ({ }, }); -export const TraceLink = () => { +export function TraceLink() { const { urlParams } = useUrlParams(); const { traceIdLink: traceId, rangeFrom, rangeTo } = urlParams; @@ -93,4 +93,4 @@ export const TraceLink = () => { Fetching trace...} /> ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/TransactionDetails/Distribution/index.tsx b/x-pack/plugins/apm/public/components/app/TransactionDetails/Distribution/index.tsx index 1244dd01a3b43..90bbe0a5a2135 100644 --- a/x-pack/plugins/apm/public/components/app/TransactionDetails/Distribution/index.tsx +++ b/x-pack/plugins/apm/public/components/app/TransactionDetails/Distribution/index.tsx @@ -7,19 +7,19 @@ import { EuiIconTip, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import d3 from 'd3'; -import React, { FunctionComponent, useCallback } from 'react'; import { isEmpty } from 'lodash'; +import React, { useCallback } from 'react'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { TransactionDistributionAPIResponse } from '../../../../../server/lib/transactions/distribution'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { IBucket } from '../../../../../server/lib/transactions/distribution/get_buckets/transform'; import { IUrlParams } from '../../../../context/UrlParamsContext/types'; import { getDurationFormatter } from '../../../../utils/formatters'; +import { history } from '../../../../utils/history'; // @ts-ignore import Histogram from '../../../shared/charts/Histogram'; import { EmptyMessage } from '../../../shared/EmptyMessage'; import { fromQuery, toQuery } from '../../../shared/Links/url_helpers'; -import { history } from '../../../../utils/history'; import { LoadingStatePrompt } from '../../../shared/LoadingStatePrompt'; interface IChartPoint { @@ -99,9 +99,7 @@ interface Props { bucketIndex: number; } -export const TransactionDistribution: FunctionComponent = ( - props: Props -) => { +export function TransactionDistribution(props: Props) { const { distribution, urlParams: { transactionType }, @@ -211,4 +209,4 @@ export const TransactionDistribution: FunctionComponent = ( />
); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/ErrorCount.tsx b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/ErrorCount.tsx index 89757b227f8fd..20f93bce29ca8 100644 --- a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/ErrorCount.tsx +++ b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/ErrorCount.tsx @@ -12,21 +12,23 @@ interface Props { count: number; } -export const ErrorCount = ({ count }: Props) => ( - -

- { - e.stopPropagation(); - }} - > - {i18n.translate('xpack.apm.transactionDetails.errorCount', { - defaultMessage: - '{errorCount, number} {errorCount, plural, one {Error} other {Errors}}', - values: { errorCount: count }, - })} - -

-
-); +export function ErrorCount({ count }: Props) { + return ( + +

+ { + e.stopPropagation(); + }} + > + {i18n.translate('xpack.apm.transactionDetails.errorCount', { + defaultMessage: + '{errorCount, number} {errorCount, plural, one {Error} other {Errors}}', + values: { errorCount: count }, + })} + +

+
+ ); +} diff --git a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/TruncateHeightSection.tsx b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/TruncateHeightSection.tsx index 64e20cf10d8aa..4f32df2b3115e 100644 --- a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/TruncateHeightSection.tsx +++ b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/TruncateHeightSection.tsx @@ -6,7 +6,7 @@ import { EuiIcon, EuiLink } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import React, { Fragment, useEffect, useRef, useState } from 'react'; +import React, { Fragment, ReactNode, useEffect, useRef, useState } from 'react'; import styled from 'styled-components'; import { px, units } from '../../../../../../../style/variables'; @@ -16,13 +16,11 @@ const ToggleButtonContainer = styled.div` `; interface Props { + children: ReactNode; previewHeight: number; } -export const TruncateHeightSection: React.FC = ({ - children, - previewHeight, -}) => { +export function TruncateHeightSection({ children, previewHeight }: Props) { const contentContainerEl = useRef(null); const [showToggle, setShowToggle] = useState(true); @@ -73,4 +71,4 @@ export const TruncateHeightSection: React.FC = ({ ) : null} ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallFlyout.tsx b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallFlyout.tsx index f0150e5a1b758..7e1dbddf56025 100644 --- a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallFlyout.tsx +++ b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallFlyout.tsx @@ -15,12 +15,13 @@ interface Props { location: Location; toggleFlyout: ({ location }: { location: Location }) => void; } -export const WaterfallFlyout: React.FC = ({ + +export function WaterfallFlyout({ waterfallItemId, waterfall, location, toggleFlyout, -}) => { +}: Props) { const currentItem = waterfall.items.find( (item) => item.id === waterfallItemId ); @@ -58,4 +59,4 @@ export const WaterfallFlyout: React.FC = ({ default: return null; } -}; +} diff --git a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallItem.tsx b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallItem.tsx index a25ae71947f21..a4d42bcf51d01 100644 --- a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallItem.tsx +++ b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallItem.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { ReactNode } from 'react'; import styled from 'styled-components'; import { EuiIcon, EuiText, EuiTitle, EuiToolTip } from '@elastic/eui'; @@ -109,13 +109,11 @@ function PrefixIcon({ item }: { item: IWaterfallItem }) { } interface SpanActionToolTipProps { + children: ReactNode; item?: IWaterfallItem; } -const SpanActionToolTip: React.FC = ({ - item, - children, -}) => { +function SpanActionToolTip({ item, children }: SpanActionToolTipProps) { if (item?.docType === 'span') { return ( @@ -124,7 +122,7 @@ const SpanActionToolTip: React.FC = ({ ); } return <>{children}; -}; +} function Duration({ item }: { item: IWaterfallItem }) { return ( diff --git a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/index.tsx b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/index.tsx index 78235594f40ec..1fd0ec761b1ae 100644 --- a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/index.tsx +++ b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/index.tsx @@ -67,12 +67,12 @@ interface Props { exceedsMax: boolean; } -export const Waterfall: React.FC = ({ +export function Waterfall({ waterfall, exceedsMax, waterfallItemId, location, -}) => { +}: Props) { const itemContainerHeight = 58; // TODO: This is a nasty way to calculate the height of the svg element. A better approach should be found const waterfallHeight = itemContainerHeight * waterfall.items.length; @@ -81,7 +81,7 @@ export const Waterfall: React.FC = ({ const agentMarks = getAgentMarks(waterfall.entryTransaction); const errorMarks = getErrorMarks(waterfall.errorItems, serviceColors); - const renderWaterfallItem = (item: IWaterfallItem) => { + function renderWaterfallItem(item: IWaterfallItem) { const errorCount = item.docType === 'transaction' ? waterfall.errorsPerTransaction[item.doc.transaction.id] @@ -99,7 +99,7 @@ export const Waterfall: React.FC = ({ onClick={() => toggleFlyout({ item, location })} /> ); - }; + } return ( @@ -134,4 +134,4 @@ export const Waterfall: React.FC = ({ /> ); -}; +} diff --git a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/index.tsx b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/index.tsx index beb0c03f37f8f..12676b7c15f1c 100644 --- a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/index.tsx +++ b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/index.tsx @@ -37,14 +37,14 @@ interface Props { traceSamples: IBucket['samples']; } -export const WaterfallWithSummmary: React.FC = ({ +export function WaterfallWithSummmary({ urlParams, location, waterfall, exceedsMax, isLoading, traceSamples, -}) => { +}: Props) { const [sampleActivePage, setSampleActivePage] = useState(0); useEffect(() => { @@ -135,4 +135,4 @@ export const WaterfallWithSummmary: React.FC = ({ /> ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/ApmHeader/index.tsx b/x-pack/plugins/apm/public/components/shared/ApmHeader/index.tsx index cccbdc8d86d91..4ffd422801816 100644 --- a/x-pack/plugins/apm/public/components/shared/ApmHeader/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/ApmHeader/index.tsx @@ -5,29 +5,31 @@ */ import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; -import React from 'react'; +import React, { ReactNode } from 'react'; import { KueryBar } from '../KueryBar'; import { DatePicker } from '../DatePicker'; import { EnvironmentFilter } from '../EnvironmentFilter'; -export const ApmHeader: React.FC = ({ children }) => ( - <> - - {children} - - - - +export function ApmHeader({ children }: { children: ReactNode }) { + return ( + <> + + {children} + + + + - + - - - - - - - - - -); + + + + + + + + + + ); +} diff --git a/x-pack/plugins/apm/public/components/shared/DatePicker/__test__/DatePicker.test.tsx b/x-pack/plugins/apm/public/components/shared/DatePicker/__test__/DatePicker.test.tsx index 215e97aebf646..36e33fba89fbb 100644 --- a/x-pack/plugins/apm/public/components/shared/DatePicker/__test__/DatePicker.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/DatePicker/__test__/DatePicker.test.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { ReactNode } from 'react'; import { LocationProvider } from '../../../../context/LocationContext'; import { UrlParamsContext, @@ -21,18 +21,24 @@ import { MockApmPluginContextWrapper } from '../../../../context/ApmPluginContex const mockHistoryPush = jest.spyOn(history, 'push'); const mockRefreshTimeRange = jest.fn(); -const MockUrlParamsProvider: React.FC<{ +function MockUrlParamsProvider({ + params = {}, + children, +}: { + children: ReactNode; params?: IUrlParams; -}> = ({ params = {}, children }) => ( - -); +}) { + return ( + + ); +} function mountDatePicker(params?: IUrlParams) { return mount( diff --git a/x-pack/plugins/apm/public/components/shared/EmptyMessage.tsx b/x-pack/plugins/apm/public/components/shared/EmptyMessage.tsx index f300ed9d65aac..296df901d309e 100644 --- a/x-pack/plugins/apm/public/components/shared/EmptyMessage.tsx +++ b/x-pack/plugins/apm/public/components/shared/EmptyMessage.tsx @@ -14,7 +14,7 @@ interface Props { hideSubheading?: boolean; } -const EmptyMessage: React.FC = ({ +function EmptyMessage({ heading = i18n.translate('xpack.apm.emptyMessage.noDataFoundLabel', { defaultMessage: 'No data found.', }), @@ -22,7 +22,7 @@ const EmptyMessage: React.FC = ({ defaultMessage: 'Try another time range or reset the search filter.', }), hideSubheading = false, -}) => { +}: Props) { return ( = ({ body={!hideSubheading && subheading} /> ); -}; +} export { EmptyMessage }; diff --git a/x-pack/plugins/apm/public/components/shared/EnvironmentBadge/index.tsx b/x-pack/plugins/apm/public/components/shared/EnvironmentBadge/index.tsx index 47e52285b6851..a430eea1cf40c 100644 --- a/x-pack/plugins/apm/public/components/shared/EnvironmentBadge/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/EnvironmentBadge/index.tsx @@ -11,7 +11,7 @@ import { EuiBadge, EuiToolTip } from '@elastic/eui'; interface Props { environments: string[]; } -export const EnvironmentBadge: React.FC = ({ environments = [] }) => { +export function EnvironmentBadge({ environments = [] }: Props) { if (environments.length < 3) { return ( <> @@ -42,4 +42,4 @@ export const EnvironmentBadge: React.FC = ({ environments = [] }) => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/EnvironmentFilter/index.tsx b/x-pack/plugins/apm/public/components/shared/EnvironmentFilter/index.tsx index 28dd5e7a5a363..1490ca42679b9 100644 --- a/x-pack/plugins/apm/public/components/shared/EnvironmentFilter/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/EnvironmentFilter/index.tsx @@ -65,7 +65,7 @@ function getOptions(environments: string[]) { ]; } -export const EnvironmentFilter: React.FC = () => { +export function EnvironmentFilter() { const location = useLocation(); const { uiFilters, urlParams } = useUrlParams(); @@ -90,4 +90,4 @@ export const EnvironmentFilter: React.FC = () => { isLoading={status === 'loading'} /> ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/EuiTabLink.tsx b/x-pack/plugins/apm/public/components/shared/EuiTabLink.tsx index 8538ea6a510ce..d29ccd8abcd42 100644 --- a/x-pack/plugins/apm/public/components/shared/EuiTabLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/EuiTabLink.tsx @@ -32,7 +32,7 @@ const Wrapper = styled.div<{ isSelected: boolean }>` } `; -const EuiTabLink = (props: Props) => { +function EuiTabLink(props: Props) { const { isSelected, children } = props; const className = cls('euiTab', { @@ -44,6 +44,6 @@ const EuiTabLink = (props: Props) => { {children} ); -}; +} export { EuiTabLink }; diff --git a/x-pack/plugins/apm/public/components/shared/HeightRetainer/index.tsx b/x-pack/plugins/apm/public/components/shared/HeightRetainer/index.tsx index be8ff87617c80..5c8755f9f586f 100644 --- a/x-pack/plugins/apm/public/components/shared/HeightRetainer/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/HeightRetainer/index.tsx @@ -6,7 +6,12 @@ import React, { useEffect, useRef } from 'react'; -export const HeightRetainer: React.FC = (props) => { +export function HeightRetainer( + props: React.DetailedHTMLProps< + React.HTMLAttributes, + HTMLDivElement + > +) { const containerElement = useRef(null); const minHeight = useRef(0); @@ -26,4 +31,4 @@ export const HeightRetainer: React.FC = (props) => { style={{ minHeight: minHeight.current }} /> ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/KueryBar/index.tsx b/x-pack/plugins/apm/public/components/shared/KueryBar/index.tsx index 6ddc4eecba7ed..502f5f0034b5f 100644 --- a/x-pack/plugins/apm/public/components/shared/KueryBar/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/KueryBar/index.tsx @@ -112,7 +112,6 @@ export function KueryBar() { setState({ ...state, suggestions, isLoadingSuggestions: false }); } catch (e) { - // eslint-disable-next-line no-console console.error('Error while fetching suggestions', e); } } diff --git a/x-pack/plugins/apm/public/components/shared/LicensePrompt/index.tsx b/x-pack/plugins/apm/public/components/shared/LicensePrompt/index.tsx index d8464fdfa8481..50be268d9ccd0 100644 --- a/x-pack/plugins/apm/public/components/shared/LicensePrompt/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/LicensePrompt/index.tsx @@ -14,7 +14,7 @@ interface Props { showBetaBadge?: boolean; } -export const LicensePrompt = ({ text, showBetaBadge = false }: Props) => { +export function LicensePrompt({ text, showBetaBadge = false }: Props) { const licensePageUrl = useKibanaUrl( '/app/kibana', '/management/stack/license_management/home' @@ -60,4 +60,4 @@ export const LicensePrompt = ({ text, showBetaBadge = false }: Props) => { ); return <>{showBetaBadge ? renderWithBetaBadge : renderLicenseBody}; -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/DiscoverErrorLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/DiscoverErrorLink.tsx index 5679e31a9898b..d83f10cf1975f 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/DiscoverErrorLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/DiscoverErrorLink.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { ReactNode } from 'react'; import { ERROR_GROUP_ID, SERVICE_NAME, @@ -32,13 +32,18 @@ function getDiscoverQuery(error: APMError, kuery?: string) { }; } -const DiscoverErrorLink: React.FC<{ +function DiscoverErrorLink({ + error, + kuery, + children, +}: { + children?: ReactNode; readonly error: APMError; readonly kuery?: string; -}> = ({ error, kuery, children }) => { +}) { return ( ); -}; +} export { DiscoverErrorLink }; diff --git a/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/DiscoverSpanLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/DiscoverSpanLink.tsx index 5fce3e842d8da..d7751c43b5943 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/DiscoverSpanLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/DiscoverSpanLink.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { ReactNode } from 'react'; import { SPAN_ID } from '../../../../../common/elasticsearch_fieldnames'; import { Span } from '../../../../../typings/es_schemas/ui/span'; import { DiscoverLink } from './DiscoverLink'; @@ -22,8 +22,12 @@ function getDiscoverQuery(span: Span) { }; } -export const DiscoverSpanLink: React.FC<{ +export function DiscoverSpanLink({ + span, + children, +}: { readonly span: Span; -}> = ({ span, children }) => { + children?: ReactNode; +}) { return ; -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/DiscoverTransactionLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/DiscoverTransactionLink.tsx index e2500617155c1..223fabbdb0d6f 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/DiscoverTransactionLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/DiscoverTransactionLink.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { ReactNode } from 'react'; import { PROCESSOR_EVENT, TRACE_ID, @@ -32,10 +32,14 @@ export function getDiscoverQuery(transaction: Transaction) { }; } -export const DiscoverTransactionLink: React.FC<{ +export function DiscoverTransactionLink({ + transaction, + children, +}: { readonly transaction: Transaction; -}> = ({ transaction, children }) => { + children?: ReactNode; +}) { return ( ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLJobLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLJobLink.tsx index f3c5b49287293..887ac2ff6bbb9 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLJobLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLJobLink.tsx @@ -4,24 +4,25 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { ReactNode } from 'react'; import { EuiLink } from '@elastic/eui'; import { useTimeSeriesExplorerHref } from './useTimeSeriesExplorerHref'; interface Props { + children?: ReactNode; jobId: string; external?: boolean; serviceName?: string; transactionType?: string; } -export const MLJobLink: React.FC = ({ +export function MLJobLink({ jobId, serviceName, transactionType, external, children, -}) => { +}: Props) { const href = useTimeSeriesExplorerHref({ jobId, serviceName, @@ -36,4 +37,4 @@ export const MLJobLink: React.FC = ({ target={external ? '_blank' : undefined} /> ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/ErrorDetailLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/ErrorDetailLink.tsx index c788da6a0d240..1ff32b17f3245 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/apm/ErrorDetailLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/apm/ErrorDetailLink.tsx @@ -11,13 +11,13 @@ interface Props extends APMLinkExtendProps { errorGroupId: string; } -const ErrorDetailLink = ({ serviceName, errorGroupId, ...rest }: Props) => { +function ErrorDetailLink({ serviceName, errorGroupId, ...rest }: Props) { return ( ); -}; +} export { ErrorDetailLink }; diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/ErrorOverviewLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/ErrorOverviewLink.tsx index 684531d50897c..862b1ac649648 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/apm/ErrorOverviewLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/apm/ErrorOverviewLink.tsx @@ -14,7 +14,7 @@ interface Props extends APMLinkExtendProps { query?: APMQueryParams; } -const ErrorOverviewLink = ({ serviceName, query, ...rest }: Props) => { +function ErrorOverviewLink({ serviceName, query, ...rest }: Props) { const { urlParams } = useUrlParams(); const persistedFilters = pickKeys( @@ -35,6 +35,6 @@ const ErrorOverviewLink = ({ serviceName, query, ...rest }: Props) => { {...rest} /> ); -}; +} export { ErrorOverviewLink }; diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/HomeLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/HomeLink.tsx index 92ff3164880e8..724b9536dfaa3 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/apm/HomeLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/apm/HomeLink.tsx @@ -6,8 +6,8 @@ import React from 'react'; import { APMLink, APMLinkExtendProps } from './APMLink'; -const HomeLink = (props: APMLinkExtendProps) => { +function HomeLink(props: APMLinkExtendProps) { return ; -}; +} export { HomeLink }; diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/MetricOverviewLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/MetricOverviewLink.tsx index bd3e3b36a8601..35ba5db68d507 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/apm/MetricOverviewLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/apm/MetricOverviewLink.tsx @@ -12,7 +12,7 @@ interface Props extends APMLinkExtendProps { serviceName: string; } -const MetricOverviewLink = ({ serviceName, ...rest }: Props) => { +function MetricOverviewLink({ serviceName, ...rest }: Props) { const { urlParams } = useUrlParams(); const persistedFilters = pickKeys( @@ -30,6 +30,6 @@ const MetricOverviewLink = ({ serviceName, ...rest }: Props) => { {...rest} /> ); -}; +} export { MetricOverviewLink }; diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceMapLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceMapLink.tsx index 36c108160bdb2..ff8b1354daeb5 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceMapLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceMapLink.tsx @@ -16,11 +16,11 @@ interface ServiceMapLinkProps extends APMLinkExtendProps { serviceName?: string; } -const ServiceMapLink = ({ serviceName, ...rest }: ServiceMapLinkProps) => { +function ServiceMapLink({ serviceName, ...rest }: ServiceMapLinkProps) { const path = serviceName ? `/services/${serviceName}/service-map` : '/service-map'; return ; -}; +} export { ServiceMapLink }; diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceNodeMetricOverviewLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceNodeMetricOverviewLink.tsx index 1473221cca2be..2553ec4353194 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceNodeMetricOverviewLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceNodeMetricOverviewLink.tsx @@ -13,11 +13,11 @@ interface Props extends APMLinkExtendProps { serviceNodeName: string; } -const ServiceNodeMetricOverviewLink = ({ +function ServiceNodeMetricOverviewLink({ serviceName, serviceNodeName, ...rest -}: Props) => { +}: Props) { const { urlParams } = useUrlParams(); const persistedFilters = pickKeys( @@ -37,6 +37,6 @@ const ServiceNodeMetricOverviewLink = ({ {...rest} /> ); -}; +} export { ServiceNodeMetricOverviewLink }; diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceNodeOverviewLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceNodeOverviewLink.tsx index b479ab77e1127..111c2391cd54f 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceNodeOverviewLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceNodeOverviewLink.tsx @@ -12,7 +12,7 @@ interface Props extends APMLinkExtendProps { serviceName: string; } -const ServiceNodeOverviewLink = ({ serviceName, ...rest }: Props) => { +function ServiceNodeOverviewLink({ serviceName, ...rest }: Props) { const { urlParams } = useUrlParams(); const persistedFilters = pickKeys( @@ -30,6 +30,6 @@ const ServiceNodeOverviewLink = ({ serviceName, ...rest }: Props) => { {...rest} /> ); -}; +} export { ServiceNodeOverviewLink }; diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceOverviewLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceOverviewLink.tsx index 577209a26e46b..2081fc4767903 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceOverviewLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/apm/ServiceOverviewLink.tsx @@ -14,12 +14,12 @@ import { APMLink, APMLinkExtendProps } from './APMLink'; import { useUrlParams } from '../../../../hooks/useUrlParams'; import { pickKeys } from '../../../../../common/utils/pick_keys'; -const ServiceOverviewLink = (props: APMLinkExtendProps) => { +function ServiceOverviewLink(props: APMLinkExtendProps) { const { urlParams } = useUrlParams(); const persistedFilters = pickKeys(urlParams, 'host', 'agentName'); return ; -}; +} export { ServiceOverviewLink }; diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/SettingsLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/SettingsLink.tsx index 853972f4df402..80f3053b86f93 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/apm/SettingsLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/apm/SettingsLink.tsx @@ -6,8 +6,8 @@ import React from 'react'; import { APMLink, APMLinkExtendProps } from './APMLink'; -const SettingsLink = (props: APMLinkExtendProps) => { +function SettingsLink(props: APMLinkExtendProps) { return ; -}; +} export { SettingsLink }; diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/TraceOverviewLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/TraceOverviewLink.tsx index dc4519365cbc2..8f3ea191fab1a 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/apm/TraceOverviewLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/apm/TraceOverviewLink.tsx @@ -14,7 +14,7 @@ import { APMLink, APMLinkExtendProps } from './APMLink'; import { useUrlParams } from '../../../../hooks/useUrlParams'; import { pickKeys } from '../../../../../common/utils/pick_keys'; -const TraceOverviewLink = (props: APMLinkExtendProps) => { +function TraceOverviewLink(props: APMLinkExtendProps) { const { urlParams } = useUrlParams(); const persistedFilters = pickKeys( @@ -26,6 +26,6 @@ const TraceOverviewLink = (props: APMLinkExtendProps) => { ); return ; -}; +} export { TraceOverviewLink }; diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/TransactionDetailLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/TransactionDetailLink.tsx index c7eba1984472e..2ca3dce5da9ce 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/apm/TransactionDetailLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/apm/TransactionDetailLink.tsx @@ -17,14 +17,14 @@ interface Props extends APMLinkExtendProps { transactionType: string; } -export const TransactionDetailLink = ({ +export function TransactionDetailLink({ serviceName, traceId, transactionId, transactionName, transactionType, ...rest -}: Props) => { +}: Props) { const { urlParams } = useUrlParams(); const persistedFilters = pickKeys( @@ -46,4 +46,4 @@ export const TransactionDetailLink = ({ {...rest} /> ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/TransactionOverviewLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/TransactionOverviewLink.tsx index ccef83ee73fb8..adc64f5a2d3dc 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/apm/TransactionOverviewLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/apm/TransactionOverviewLink.tsx @@ -12,7 +12,7 @@ interface Props extends APMLinkExtendProps { serviceName: string; } -const TransactionOverviewLink = ({ serviceName, ...rest }: Props) => { +function TransactionOverviewLink({ serviceName, ...rest }: Props) { const { urlParams } = useUrlParams(); const persistedFilters = pickKeys( @@ -31,6 +31,6 @@ const TransactionOverviewLink = ({ serviceName, ...rest }: Props) => { {...rest} /> ); -}; +} export { TransactionOverviewLink }; diff --git a/x-pack/plugins/apm/public/components/shared/LocalUIFilters/Filter/FilterBadgeList.tsx b/x-pack/plugins/apm/public/components/shared/LocalUIFilters/Filter/FilterBadgeList.tsx index 9191f4e797637..2090a92bf0de4 100644 --- a/x-pack/plugins/apm/public/components/shared/LocalUIFilters/Filter/FilterBadgeList.tsx +++ b/x-pack/plugins/apm/public/components/shared/LocalUIFilters/Filter/FilterBadgeList.tsx @@ -20,24 +20,26 @@ interface Props { onRemove: (val: string) => void; } -const FilterBadgeList = ({ onRemove, value }: Props) => ( - - {value.map((val) => ( - - - - ))} - -); +function FilterBadgeList({ onRemove, value }: Props) { + return ( + + {value.map((val) => ( + + + + ))} + + ); +} export { FilterBadgeList }; diff --git a/x-pack/plugins/apm/public/components/shared/LocalUIFilters/Filter/FilterTitleButton.tsx b/x-pack/plugins/apm/public/components/shared/LocalUIFilters/Filter/FilterTitleButton.tsx index 26125ab0f5343..0d306f5133716 100644 --- a/x-pack/plugins/apm/public/components/shared/LocalUIFilters/Filter/FilterTitleButton.tsx +++ b/x-pack/plugins/apm/public/components/shared/LocalUIFilters/Filter/FilterTitleButton.tsx @@ -24,7 +24,7 @@ const Button = styled(EuiButtonEmpty).attrs(() => ({ type Props = React.ComponentProps; -export const FilterTitleButton = (props: Props) => { +export function FilterTitleButton(props: Props) { return ( ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/LocalUIFilters/Filter/index.tsx b/x-pack/plugins/apm/public/components/shared/LocalUIFilters/Filter/index.tsx index 167574f9aa00d..c13439a3c5928 100644 --- a/x-pack/plugins/apm/public/components/shared/LocalUIFilters/Filter/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/LocalUIFilters/Filter/index.tsx @@ -66,14 +66,7 @@ interface Props { type Option = EuiSelectable['props']['options'][0]; -const Filter = ({ - name, - title, - options, - onChange, - value, - showCount, -}: Props) => { +function Filter({ name, title, options, onChange, value, showCount }: Props) { const [showPopover, setShowPopover] = useState(false); const toggleShowPopover = () => setShowPopover((show) => !show); @@ -176,6 +169,6 @@ const Filter = ({ ) : null} ); -}; +} export { Filter }; diff --git a/x-pack/plugins/apm/public/components/shared/LocalUIFilters/ServiceNameFilter/index.tsx b/x-pack/plugins/apm/public/components/shared/LocalUIFilters/ServiceNameFilter/index.tsx index 405a4cacae714..99656b05db450 100644 --- a/x-pack/plugins/apm/public/components/shared/LocalUIFilters/ServiceNameFilter/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/LocalUIFilters/ServiceNameFilter/index.tsx @@ -21,7 +21,7 @@ interface Props { loading: boolean; } -const ServiceNameFilter = ({ loading, serviceNames }: Props) => { +function ServiceNameFilter({ loading, serviceNames }: Props) { const { urlParams: { serviceName }, } = useUrlParams(); @@ -72,6 +72,6 @@ const ServiceNameFilter = ({ loading, serviceNames }: Props) => { /> ); -}; +} export { ServiceNameFilter }; diff --git a/x-pack/plugins/apm/public/components/shared/LocalUIFilters/TransactionTypeFilter/index.tsx b/x-pack/plugins/apm/public/components/shared/LocalUIFilters/TransactionTypeFilter/index.tsx index 0e6b1c5904fc5..afd2d023d16ba 100644 --- a/x-pack/plugins/apm/public/components/shared/LocalUIFilters/TransactionTypeFilter/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/LocalUIFilters/TransactionTypeFilter/index.tsx @@ -20,7 +20,7 @@ interface Props { transactionTypes: string[]; } -const TransactionTypeFilter = ({ transactionTypes }: Props) => { +function TransactionTypeFilter({ transactionTypes }: Props) { const { urlParams: { transactionType }, } = useUrlParams(); @@ -59,6 +59,6 @@ const TransactionTypeFilter = ({ transactionTypes }: Props) => { /> ); -}; +} export { TransactionTypeFilter }; diff --git a/x-pack/plugins/apm/public/components/shared/LocalUIFilters/index.tsx b/x-pack/plugins/apm/public/components/shared/LocalUIFilters/index.tsx index 020b7481c68ea..fedf96b4cc4ea 100644 --- a/x-pack/plugins/apm/public/components/shared/LocalUIFilters/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/LocalUIFilters/index.tsx @@ -31,13 +31,13 @@ const ButtonWrapper = styled.div` display: inline-block; `; -const LocalUIFilters = ({ +function LocalUIFilters({ projection, params, filterNames, children, showCount = true, -}: Props) => { +}: Props) { const { filters, setFilterValue, clearValues } = useLocalUIFilters({ filterNames, projection, @@ -91,6 +91,6 @@ const LocalUIFilters = ({ ) : null} ); -}; +} export { LocalUIFilters }; diff --git a/x-pack/plugins/apm/public/components/shared/MetadataTable/index.tsx b/x-pack/plugins/apm/public/components/shared/MetadataTable/index.tsx index eace3035a3555..8dfb1e0ce960d 100644 --- a/x-pack/plugins/apm/public/components/shared/MetadataTable/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/MetadataTable/index.tsx @@ -91,18 +91,20 @@ export function MetadataTable({ sections }: Props) { ); } -const NoResultFound = ({ value }: { value: string }) => ( - - - - {i18n.translate( - 'xpack.apm.propertiesTable.agentFeature.noResultFound', - { - defaultMessage: `No results for "{value}".`, - values: { value }, - } - )} - - - -); +function NoResultFound({ value }: { value: string }) { + return ( + + + + {i18n.translate( + 'xpack.apm.propertiesTable.agentFeature.noResultFound', + { + defaultMessage: `No results for "{value}".`, + values: { value }, + } + )} + + + + ); +} diff --git a/x-pack/plugins/apm/public/components/shared/SelectWithPlaceholder/index.tsx b/x-pack/plugins/apm/public/components/shared/SelectWithPlaceholder/index.tsx index e0da91fae2ba7..02939b18401fe 100644 --- a/x-pack/plugins/apm/public/components/shared/SelectWithPlaceholder/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/SelectWithPlaceholder/index.tsx @@ -19,6 +19,7 @@ const DEFAULT_PLACEHOLDER = i18n.translate('xpack.apm.selectPlaceholder', { * with `hasNoInitialSelection`. It uses the `placeholder` prop to populate * the first option as the initial, not selected option. */ +// eslint-disable-next-line react/function-component-definition export const SelectWithPlaceholder: typeof EuiSelect = (props) => { const placeholder = props.placeholder || DEFAULT_PLACEHOLDER; return ( diff --git a/x-pack/plugins/apm/public/components/shared/ServiceAlertTrigger/PopoverExpression/index.tsx b/x-pack/plugins/apm/public/components/shared/ServiceAlertTrigger/PopoverExpression/index.tsx index 1abdb94c8313e..b07672eeaee06 100644 --- a/x-pack/plugins/apm/public/components/shared/ServiceAlertTrigger/PopoverExpression/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/ServiceAlertTrigger/PopoverExpression/index.tsx @@ -13,7 +13,7 @@ interface Props { children?: React.ReactNode; } -export const PopoverExpression = (props: Props) => { +export function PopoverExpression(props: Props) { const { title, value, children } = props; const [popoverOpen, setPopoverOpen] = useState(false); @@ -36,4 +36,4 @@ export const PopoverExpression = (props: Props) => { {children} ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/Stacktrace/FrameHeading.tsx b/x-pack/plugins/apm/public/components/shared/Stacktrace/FrameHeading.tsx index 48580146c6fe1..5891895629318 100644 --- a/x-pack/plugins/apm/public/components/shared/Stacktrace/FrameHeading.tsx +++ b/x-pack/plugins/apm/public/components/shared/Stacktrace/FrameHeading.tsx @@ -29,7 +29,7 @@ interface Props { isLibraryFrame: boolean; } -const FrameHeading: React.FC = ({ stackframe, isLibraryFrame }) => { +function FrameHeading({ stackframe, isLibraryFrame }: Props) { const FileDetail = isLibraryFrame ? LibraryFrameFileDetail : AppFrameFileDetail; @@ -50,6 +50,6 @@ const FrameHeading: React.FC = ({ stackframe, isLibraryFrame }) => { )} ); -}; +} export { FrameHeading }; diff --git a/x-pack/plugins/apm/public/components/shared/Stacktrace/Variables.tsx b/x-pack/plugins/apm/public/components/shared/Stacktrace/Variables.tsx index 4bd6d361d6714..07b5ed6868df5 100644 --- a/x-pack/plugins/apm/public/components/shared/Stacktrace/Variables.tsx +++ b/x-pack/plugins/apm/public/components/shared/Stacktrace/Variables.tsx @@ -23,7 +23,7 @@ interface Props { vars: IStackframe['vars']; } -export const Variables = ({ vars }: Props) => { +export function Variables({ vars }: Props) { if (!vars) { return null; } @@ -46,4 +46,4 @@ export const Variables = ({ vars }: Props) => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/Summary/DurationSummaryItem.tsx b/x-pack/plugins/apm/public/components/shared/Summary/DurationSummaryItem.tsx index 831f72e3925af..7858bebead408 100644 --- a/x-pack/plugins/apm/public/components/shared/Summary/DurationSummaryItem.tsx +++ b/x-pack/plugins/apm/public/components/shared/Summary/DurationSummaryItem.tsx @@ -15,11 +15,7 @@ interface Props { parentType: 'trace' | 'transaction'; } -const DurationSummaryItem = ({ - duration, - totalDuration, - parentType, -}: Props) => { +function DurationSummaryItem({ duration, totalDuration, parentType }: Props) { const calculatedTotalDuration = totalDuration === undefined ? duration : totalDuration; @@ -41,6 +37,6 @@ const DurationSummaryItem = ({ ); -}; +} export { DurationSummaryItem }; diff --git a/x-pack/plugins/apm/public/components/shared/Summary/ErrorCountSummaryItemBadge.tsx b/x-pack/plugins/apm/public/components/shared/Summary/ErrorCountSummaryItemBadge.tsx index b6ea6a714017d..ed33c59af36f4 100644 --- a/x-pack/plugins/apm/public/components/shared/Summary/ErrorCountSummaryItemBadge.tsx +++ b/x-pack/plugins/apm/public/components/shared/Summary/ErrorCountSummaryItemBadge.tsx @@ -19,7 +19,7 @@ const Badge = (styled(EuiBadge)` margin-top: ${px(units.eighth)}; ` as unknown) as typeof EuiBadge; -export const ErrorCountSummaryItemBadge = ({ count }: Props) => { +export function ErrorCountSummaryItemBadge({ count }: Props) { const theme = useTheme(); return ( @@ -31,4 +31,4 @@ export const ErrorCountSummaryItemBadge = ({ count }: Props) => { })} ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/Summary/TransactionSummary.tsx b/x-pack/plugins/apm/public/components/shared/Summary/TransactionSummary.tsx index 86b42844f1fa7..98543ffaa9218 100644 --- a/x-pack/plugins/apm/public/components/shared/Summary/TransactionSummary.tsx +++ b/x-pack/plugins/apm/public/components/shared/Summary/TransactionSummary.tsx @@ -20,7 +20,7 @@ interface Props { errorCount: number; } -const getTransactionResultSummaryItem = (transaction: Transaction) => { +function getTransactionResultSummaryItem(transaction: Transaction) { const result = transaction.transaction.result; const isRumAgent = isRumAgentName(transaction.agent.name); const url = isRumAgent @@ -39,13 +39,9 @@ const getTransactionResultSummaryItem = (transaction: Transaction) => { } return null; -}; +} -const TransactionSummary = ({ - transaction, - totalDuration, - errorCount, -}: Props) => { +function TransactionSummary({ transaction, totalDuration, errorCount }: Props) { const items = [ , ; -}; +} export { TransactionSummary }; diff --git a/x-pack/plugins/apm/public/components/shared/Summary/index.tsx b/x-pack/plugins/apm/public/components/shared/Summary/index.tsx index 55ac525d71192..aea62c88f5833 100644 --- a/x-pack/plugins/apm/public/components/shared/Summary/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/Summary/index.tsx @@ -26,7 +26,7 @@ const Item = styled(EuiFlexItem)` } `; -const Summary = ({ items }: Props) => { +function Summary({ items }: Props) { const filteredItems = items.filter(Boolean) as React.ReactElement[]; return ( @@ -38,6 +38,6 @@ const Summary = ({ items }: Props) => { ))} ); -}; +} export { Summary }; diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/CustomLinkPopover.tsx b/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/CustomLinkPopover.tsx index 00a839adc2fdd..27c6aa82ac674 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/CustomLinkPopover.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/CustomLinkPopover.tsx @@ -24,7 +24,7 @@ const ScrollableContainer = styled.div` overflow: scroll; `; -export const CustomLinkPopover = ({ +export function CustomLinkPopover({ customLinks, onCreateCustomLinkClick, onClose, @@ -34,7 +34,7 @@ export const CustomLinkPopover = ({ onCreateCustomLinkClick: () => void; onClose: () => void; transaction: Transaction; -}) => { +}) { return ( <> @@ -71,4 +71,4 @@ export const CustomLinkPopover = ({ ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/CustomLinkSection.tsx b/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/CustomLinkSection.tsx index 40143b53f17c5..6b421bc370332 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/CustomLinkSection.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/CustomLinkSection.tsx @@ -24,28 +24,30 @@ const TruncateText = styled(EuiText)` ${truncate(px(units.unit * 25))} `; -export const CustomLinkSection = ({ +export function CustomLinkSection({ customLinks, transaction, }: { customLinks: CustomLink[]; transaction: Transaction; -}) => ( -
    - {customLinks.map((link) => { - let href = link.url; - try { - href = Mustache.render(link.url, transaction); - } catch (e) { - // ignores any error that happens - } - return ( - - - {link.label} - - - ); - })} -
-); +}) { + return ( +
    + {customLinks.map((link) => { + let href = link.url; + try { + href = Mustache.render(link.url, transaction); + } catch (e) { + // ignores any error that happens + } + return ( + + + {link.label} + + + ); + })} +
+ ); +} diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/ManageCustomLink.tsx b/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/ManageCustomLink.tsx index 9740a9f1ee847..09cdaa26004bb 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/ManageCustomLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/ManageCustomLink.tsx @@ -14,46 +14,48 @@ import { import { i18n } from '@kbn/i18n'; import { APMLink } from '../../Links/apm/APMLink'; -export const ManageCustomLink = ({ +export function ManageCustomLink({ onCreateCustomLinkClick, showCreateCustomLinkButton = true, }: { onCreateCustomLinkClick: () => void; showCreateCustomLinkButton?: boolean; -}) => ( - - - - - - - - - - - {showCreateCustomLinkButton && ( - - - {i18n.translate('xpack.apm.customLink.buttom.create.title', { - defaultMessage: 'Create', +}) { + return ( + + + + + + > + + + + - )} - - - -); + {showCreateCustomLinkButton && ( + + + {i18n.translate('xpack.apm.customLink.buttom.create.title', { + defaultMessage: 'Create', + })} + + + )} + + + + ); +} diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/index.tsx b/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/index.tsx index 40ac3c31d1d43..d6484f52e84f9 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLink/index.tsx @@ -37,7 +37,7 @@ const SeeMoreButton = styled.button<{ show: boolean }>` } `; -export const CustomLink = ({ +export function CustomLink({ customLinks, status, onCreateCustomLinkClick, @@ -49,7 +49,7 @@ export const CustomLink = ({ onCreateCustomLinkClick: () => void; onSeeMoreClick: () => void; transaction: Transaction; -}) => { +}) { const renderEmptyPrompt = ( <> @@ -125,4 +125,4 @@ export const CustomLink = ({ )} ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/TransactionActionMenu.tsx b/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/TransactionActionMenu.tsx index 2507eca9ff663..77d70c626183f 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/TransactionActionMenu.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/TransactionActionMenu.tsx @@ -6,10 +6,8 @@ import { EuiButtonEmpty } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import React, { FunctionComponent, useMemo, useState, MouseEvent } from 'react'; +import React, { MouseEvent, useMemo, useState } from 'react'; import url from 'url'; -import { Filter } from '../../../../common/custom_link/custom_link_types'; -import { Transaction } from '../../../../typings/es_schemas/ui/transaction'; import { ActionMenu, ActionMenuDivider, @@ -19,32 +17,34 @@ import { SectionSubtitle, SectionTitle, } from '../../../../../observability/public'; +import { Filter } from '../../../../common/custom_link/custom_link_types'; +import { Transaction } from '../../../../typings/es_schemas/ui/transaction'; import { useApmPluginContext } from '../../../hooks/useApmPluginContext'; import { useFetcher } from '../../../hooks/useFetcher'; +import { useLicense } from '../../../hooks/useLicense'; import { useLocation } from '../../../hooks/useLocation'; import { useUrlParams } from '../../../hooks/useUrlParams'; import { CustomLinkFlyout } from '../../app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout'; +import { convertFiltersToQuery } from '../../app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/helper'; import { CustomLink } from './CustomLink'; import { CustomLinkPopover } from './CustomLink/CustomLinkPopover'; import { getSections } from './sections'; -import { useLicense } from '../../../hooks/useLicense'; -import { convertFiltersToQuery } from '../../app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/helper'; interface Props { readonly transaction: Transaction; } -const ActionMenuButton = ({ onClick }: { onClick: () => void }) => ( - - {i18n.translate('xpack.apm.transactionActionMenu.actionsButtonLabel', { - defaultMessage: 'Actions', - })} - -); - -export const TransactionActionMenu: FunctionComponent = ({ - transaction, -}: Props) => { +function ActionMenuButton({ onClick }: { onClick: () => void }) { + return ( + + {i18n.translate('xpack.apm.transactionActionMenu.actionsButtonLabel', { + defaultMessage: 'Actions', + })} + + ); +} + +export function TransactionActionMenu({ transaction }: Props) { const license = useLicense(); const hasValidLicense = license?.isActive && license?.hasAtLeast('gold'); @@ -211,4 +211,4 @@ export const TransactionActionMenu: FunctionComponent = ({ ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/TransactionBreakdown/TransactionBreakdownGraph/index.tsx b/x-pack/plugins/apm/public/components/shared/TransactionBreakdown/TransactionBreakdownGraph/index.tsx index 2cb3696f88002..209657971620b 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionBreakdown/TransactionBreakdownGraph/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionBreakdown/TransactionBreakdownGraph/index.tsx @@ -29,7 +29,7 @@ const formatTooltipValue = (coordinate: Coordinate) => { : NOT_AVAILABLE_LABEL; }; -const TransactionBreakdownGraph: React.FC = (props) => { +function TransactionBreakdownGraph(props: Props) { const { timeseries } = props; const trackApmEvent = useUiTracker({ app: 'apm' }); const handleHover = useMemo( @@ -49,6 +49,6 @@ const TransactionBreakdownGraph: React.FC = (props) => { onHover={handleHover} /> ); -}; +} export { TransactionBreakdownGraph }; diff --git a/x-pack/plugins/apm/public/components/shared/TransactionBreakdown/TransactionBreakdownKpiList.tsx b/x-pack/plugins/apm/public/components/shared/TransactionBreakdown/TransactionBreakdownKpiList.tsx index 3898679f83537..d3761cf0fe38e 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionBreakdown/TransactionBreakdownKpiList.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionBreakdown/TransactionBreakdownKpiList.tsx @@ -31,10 +31,7 @@ const Description = styled.span` } `; -const KpiDescription: React.FC<{ - name: string; - color: string; -}> = ({ name, color }) => { +function KpiDescription({ name, color }: { name: string; color: string }) { return ( ); -}; +} -const TransactionBreakdownKpiList: React.FC = ({ kpis }) => { +function TransactionBreakdownKpiList({ kpis }: Props) { return ( {kpis.map((kpi) => ( @@ -73,6 +70,6 @@ const TransactionBreakdownKpiList: React.FC = ({ kpis }) => { ))} ); -}; +} export { TransactionBreakdownKpiList }; diff --git a/x-pack/plugins/apm/public/components/shared/TransactionBreakdown/index.tsx b/x-pack/plugins/apm/public/components/shared/TransactionBreakdown/index.tsx index 51cad6bc65a85..80ed9163ec08d 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionBreakdown/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionBreakdown/index.tsx @@ -21,7 +21,7 @@ const emptyMessage = i18n.translate('xpack.apm.transactionBreakdown.noData', { defaultMessage: 'No data within this time range.', }); -const TransactionBreakdown = () => { +function TransactionBreakdown() { const { data, status } = useTransactionBreakdown(); const { kpis, timeseries } = data; const noHits = data.kpis.length === 0 && status === FETCH_STATUS.SUCCESS; @@ -51,6 +51,6 @@ const TransactionBreakdown = () => { ); -}; +} export { TransactionBreakdown }; diff --git a/x-pack/plugins/apm/public/components/shared/charts/CustomPlot/AnnotationsPlot.tsx b/x-pack/plugins/apm/public/components/shared/charts/CustomPlot/AnnotationsPlot.tsx index ed57692d70a65..d02c5a5d08927 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/CustomPlot/AnnotationsPlot.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/CustomPlot/AnnotationsPlot.tsx @@ -26,7 +26,7 @@ interface Props { overlay: Maybe; } -export const AnnotationsPlot = ({ plotValues, annotations }: Props) => { +export function AnnotationsPlot({ plotValues, annotations }: Props) { const theme = useTheme(); const tickValues = annotations.map((annotation) => annotation['@timestamp']); @@ -70,4 +70,4 @@ export const AnnotationsPlot = ({ plotValues, annotations }: Props) => { ))} ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/ErroneousTransactionsRateChart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/ErroneousTransactionsRateChart/index.tsx index f87be32b43fc1..a433b0b507239 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/ErroneousTransactionsRateChart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/ErroneousTransactionsRateChart/index.tsx @@ -21,7 +21,7 @@ const tickFormatY = (y?: number) => { return asPercent(y || 0, 1); }; -export const ErroneousTransactionsRateChart = () => { +export function ErroneousTransactionsRateChart() { const { urlParams, uiFilters } = useUrlParams(); const syncedChartsProps = useChartsSync(); @@ -105,4 +105,4 @@ export const ErroneousTransactionsRateChart = () => { /> ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/Legend/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/Legend/index.tsx index a00c46bcf324d..1a2a90c9fb3c3 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Legend/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Legend/index.tsx @@ -60,7 +60,7 @@ interface Props { indicator?: () => React.ReactNode; } -export const Legend: React.FC = ({ +export function Legend({ onClick, text, color, @@ -71,7 +71,7 @@ export const Legend: React.FC = ({ shape = Shape.circle, indicator, ...rest -}) => { +}: Props) { const theme = useTheme(); const indicatorColor = color || theme.eui.euiColorVis1; @@ -96,4 +96,4 @@ export const Legend: React.FC = ({ {text} ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/AgentMarker.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/AgentMarker.tsx index d2dea39b83d82..64e0fe33c982f 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/AgentMarker.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/AgentMarker.tsx @@ -27,7 +27,7 @@ interface Props { mark: AgentMark; } -export const AgentMarker: React.FC = ({ mark }) => { +export function AgentMarker({ mark }: Props) { const theme = useTheme(); return ( @@ -46,4 +46,4 @@ export const AgentMarker: React.FC = ({ mark }) => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/ErrorMarker.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/ErrorMarker.tsx index d8e056deb769a..4567bc3f0f0b7 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/ErrorMarker.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/ErrorMarker.tsx @@ -53,7 +53,7 @@ function truncateMessage(errorMessage?: string) { } } -export const ErrorMarker: React.FC = ({ mark }) => { +export function ErrorMarker({ mark }: Props) { const theme = useTheme(); const { urlParams } = useUrlParams(); const [isPopoverOpen, showPopover] = useState(false); @@ -123,4 +123,4 @@ export const ErrorMarker: React.FC = ({ mark }) => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/index.tsx index 03124952c3f88..71a1639af6dcc 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/index.tsx @@ -22,7 +22,7 @@ const MarkerContainer = styled.div` bottom: 0; `; -export const Marker: React.FC = ({ mark, x }) => { +export function Marker({ mark, x }: Props) { const legendWidth = 11; return ( @@ -33,4 +33,4 @@ export const Marker: React.FC = ({ mark, x }) => { )} ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/TimelineAxis.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/TimelineAxis.tsx index a9c36634381d4..5cbfcc695e012 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/TimelineAxis.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/TimelineAxis.tsx @@ -42,11 +42,11 @@ interface TimelineAxisProps { topTraceDuration: number; } -export const TimelineAxis = ({ +export function TimelineAxis({ plotValues, marks = [], topTraceDuration, -}: TimelineAxisProps) => { +}: TimelineAxisProps) { const theme = useTheme(); const { margins, tickValues, width, xDomain, xMax, xScale } = plotValues; const tickFormatter = getDurationFormatter(xMax); @@ -107,4 +107,4 @@ export const TimelineAxis = ({ }} ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/VerticalLines.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/VerticalLines.tsx index 0753cb318d3a4..5ea2e4cfedf18 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/VerticalLines.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/VerticalLines.tsx @@ -16,11 +16,11 @@ interface VerticalLinesProps { topTraceDuration: number; } -export const VerticalLines = ({ +export function VerticalLines({ topTraceDuration, plotValues, marks = [], -}: VerticalLinesProps) => { +}: VerticalLinesProps) { const { width, height, margins, xDomain, tickValues } = plotValues; const markTimes = marks @@ -63,4 +63,4 @@ export const VerticalLines = ({
); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/ChoroplethToolTip.tsx b/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/ChoroplethToolTip.tsx index 9d13b23904b36..69d4e8109dfbf 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/ChoroplethToolTip.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/ChoroplethToolTip.tsx @@ -9,11 +9,15 @@ import { i18n } from '@kbn/i18n'; import { asDuration, asInteger } from '../../../../../utils/formatters'; import { fontSizes } from '../../../../../style/variables'; -export const ChoroplethToolTip: React.FC<{ +export function ChoroplethToolTip({ + name, + value, + docCount, +}: { name: string; value: number; docCount: number; -}> = ({ name, value, docCount }) => { +}) { return (
{name}
@@ -41,4 +45,4 @@ export const ChoroplethToolTip: React.FC<{
); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/index.tsx index a9a9343dde6be..965cb2ae4f50a 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/ChoroplethMap/index.tsx @@ -66,7 +66,7 @@ const getMin = (items: ChoroplethItem[]) => const getMax = (items: ChoroplethItem[]) => Math.max(...items.map((item) => item.value)); -export const ChoroplethMap: React.FC = (props) => { +export function ChoroplethMap(props: Props) { const theme = useTheme(); const { items } = props; const containerRef = useRef(null); @@ -267,4 +267,4 @@ export const ChoroplethMap: React.FC = (props) => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/DurationByCountryMap/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/DurationByCountryMap/index.tsx index 61030679f45fd..2dd3d058e98b8 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/DurationByCountryMap/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/DurationByCountryMap/index.tsx @@ -11,7 +11,7 @@ import { useAvgDurationByCountry } from '../../../../../hooks/useAvgDurationByCo import { ChoroplethMap } from '../ChoroplethMap'; -export const DurationByCountryMap: React.FC = () => { +export function DurationByCountryMap() { const { data } = useAvgDurationByCountry(); return ( @@ -30,4 +30,4 @@ export const DurationByCountryMap: React.FC = () => { ); -}; +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/TransactionLineChart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/TransactionLineChart/index.tsx index cee74c81325ba..eaad883d2f9f6 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/TransactionLineChart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/TransactionCharts/TransactionLineChart/index.tsx @@ -30,7 +30,7 @@ interface Props { onHover?: () => void; } -const TransactionLineChart: React.FC = (props: Props) => { +function TransactionLineChart(props: Props) { const { series, tickFormatY, @@ -68,6 +68,6 @@ const TransactionLineChart: React.FC = (props: Props) => { {...(stacked ? { stackBy: 'y' } : {})} /> ); -}; +} export { TransactionLineChart }; diff --git a/x-pack/plugins/apm/public/context/ChartsSyncContext.tsx b/x-pack/plugins/apm/public/context/ChartsSyncContext.tsx index c00fc95f1f4f2..f93b69a877057 100644 --- a/x-pack/plugins/apm/public/context/ChartsSyncContext.tsx +++ b/x-pack/plugins/apm/public/context/ChartsSyncContext.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useMemo, useState } from 'react'; +import React, { ReactNode, useMemo, useState } from 'react'; import { toQuery, fromQuery } from '../components/shared/Links/url_helpers'; import { history } from '../utils/history'; import { useUrlParams } from '../hooks/useUrlParams'; @@ -17,7 +17,7 @@ const ChartsSyncContext = React.createContext<{ onSelectionEnd: (range: { start: number; end: number }) => void; } | null>(null); -const ChartsSyncContextProvider: React.FC = ({ children }) => { +function ChartsSyncContextProvider({ children }: { children: ReactNode }) { const [time, setTime] = useState(null); const { urlParams, uiFilters } = useUrlParams(); @@ -78,6 +78,6 @@ const ChartsSyncContextProvider: React.FC = ({ children }) => { }, [time, data.annotations]); return ; -}; +} export { ChartsSyncContext, ChartsSyncContextProvider }; diff --git a/x-pack/plugins/apm/public/context/UrlParamsContext/MockUrlParamsContextProvider.tsx b/x-pack/plugins/apm/public/context/UrlParamsContext/MockUrlParamsContextProvider.tsx index 4e4fbabf5571a..fd01e057ac3de 100644 --- a/x-pack/plugins/apm/public/context/UrlParamsContext/MockUrlParamsContextProvider.tsx +++ b/x-pack/plugins/apm/public/context/UrlParamsContext/MockUrlParamsContextProvider.tsx @@ -21,11 +21,11 @@ interface Props { refreshTimeRange?: (time: any) => void; } -export const MockUrlParamsContextProvider = ({ +export function MockUrlParamsContextProvider({ params, children, refreshTimeRange = () => undefined, -}: Props) => { +}: Props) { const urlParams = { ...defaultUrlParams, ...params }; return ( ); -}; +} diff --git a/x-pack/plugins/apm/public/utils/getRangeFromTimeSeries.ts b/x-pack/plugins/apm/public/utils/getRangeFromTimeSeries.ts index 8ec81616ccff8..71024edc9815c 100644 --- a/x-pack/plugins/apm/public/utils/getRangeFromTimeSeries.ts +++ b/x-pack/plugins/apm/public/utils/getRangeFromTimeSeries.ts @@ -7,7 +7,7 @@ import { flatten } from 'lodash'; import { TimeSeries } from '../../typings/timeseries'; -export const getRangeFromTimeSeries = (timeseries: TimeSeries[]) => { +export function getRangeFromTimeSeries(timeseries: TimeSeries[]) { const dataPoints = flatten(timeseries.map((series) => series.data)); if (dataPoints.length) { @@ -18,4 +18,4 @@ export const getRangeFromTimeSeries = (timeseries: TimeSeries[]) => { } return null; -}; +} diff --git a/x-pack/plugins/apm/public/utils/testHelpers.tsx b/x-pack/plugins/apm/public/utils/testHelpers.tsx index 8e7f987966783..418312743c324 100644 --- a/x-pack/plugins/apm/public/utils/testHelpers.tsx +++ b/x-pack/plugins/apm/public/utils/testHelpers.tsx @@ -197,9 +197,11 @@ export function mountWithTheme( tree: React.ReactElement, { darkMode = false } = {} ) { - const WrappingThemeProvider = (props: any) => ( - {props.children} - ); + function WrappingThemeProvider(props: any) { + return ( + {props.children} + ); + } return mount(tree, { wrappingComponent: WrappingThemeProvider, diff --git a/x-pack/plugins/observability/public/application/index.tsx b/x-pack/plugins/observability/public/application/index.tsx index d76c033a41756..b0134ed8b746b 100644 --- a/x-pack/plugins/observability/public/application/index.tsx +++ b/x-pack/plugins/observability/public/application/index.tsx @@ -29,7 +29,7 @@ function getTitleFromBreadCrumbs(breadcrumbs: Breadcrumbs) { .join(' | '); } -const App = () => { +function App() { return ( <> @@ -53,7 +53,7 @@ const App = () => { ); -}; +} export const renderApp = (core: CoreStart, { element }: AppMountParameters) => { const i18nCore = core.i18n; diff --git a/x-pack/plugins/observability/public/components/app/chart_container/index.tsx b/x-pack/plugins/observability/public/components/app/chart_container/index.tsx index 2a0c25773eae5..b68ddbd06c778 100644 --- a/x-pack/plugins/observability/public/components/app/chart_container/index.tsx +++ b/x-pack/plugins/observability/public/components/app/chart_container/index.tsx @@ -18,12 +18,12 @@ interface Props { const CHART_HEIGHT = 170; -export const ChartContainer = ({ +export function ChartContainer({ isInitialLoad, children, iconSize = 'xl', height = CHART_HEIGHT, -}: Props) => { +}: Props) { if (isInitialLoad) { return (
:first-child { - flex-basis: 40% !important; - } - > :nth-child(2) { - order: 3; - } - > :nth-child(3) { - flex-basis: 60% !important; - } - } - } + position: relative; `; export const MonitorListHeader: React.FC = () => { @@ -48,18 +38,12 @@ export const MonitorListHeader: React.FC = () => { - - -
- - - -
-
-
+ + + ); }; From e9fa2f35427926dde0421242e067c02ebcf96e10 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Mon, 27 Jul 2020 12:15:56 -0500 Subject: [PATCH 017/126] [build] fix chmod errors (#72768) * inherit data permisions * tmp add all-platforms flag * Revert "inherit data permisions" This reverts commit ce30dd7b3aae1ee92acb3a2b49cc4ce681d0975c. * silent chmod, move to configure sectino * simplify chown and fix babel cache * rm empty lines * Revert "tmp add all-platforms flag" This reverts commit f1ae815ca9966b873fc735fde03fd8bfdc256aa4. Co-authored-by: Elastic Machine --- .../package_scripts/post_install.sh | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/dev/build/tasks/os_packages/package_scripts/post_install.sh b/src/dev/build/tasks/os_packages/package_scripts/post_install.sh index 10f11ff51874e..c49b291d1a0c9 100644 --- a/src/dev/build/tasks/os_packages/package_scripts/post_install.sh +++ b/src/dev/build/tasks/os_packages/package_scripts/post_install.sh @@ -3,6 +3,22 @@ set -e export KBN_PATH_CONF=${KBN_PATH_CONF:-<%= configDir %>} +set_chmod() { + chmod -f 660 ${KBN_PATH_CONF}/kibana.yml || true + chmod -f 2750 <%= dataDir %> || true + chmod -f 2750 ${KBN_PATH_CONF} || true +} + +set_chown() { + chown -R <%= user %>:<%= group %> <%= dataDir %> + chown -R root:<%= group %> ${KBN_PATH_CONF} +} + +set_access() { + set_chmod + set_chown +} + case $1 in # Debian configure) @@ -14,6 +30,8 @@ case $1 in adduser --quiet --system --no-create-home --disabled-password \ --ingroup "<%= group %>" --shell /bin/false "<%= user %>" fi + + set_access ;; abort-deconfigure|abort-upgrade|abort-remove) ;; @@ -28,6 +46,8 @@ case $1 in useradd -r -g "<%= group %>" -M -s /sbin/nologin \ -c "kibana service user" "<%= user %>" fi + + set_access ;; *) @@ -35,12 +55,3 @@ case $1 in exit 1 ;; esac - -chown -R <%= user %>:<%= group %> <%= dataDir %> -chmod 2750 <%= dataDir %> -chmod -R 2755 <%= dataDir %>/* - -chown :<%= group %> ${KBN_PATH_CONF} -chown :<%= group %> ${KBN_PATH_CONF}/kibana.yml -chmod 2750 ${KBN_PATH_CONF} -chmod 660 ${KBN_PATH_CONF}/kibana.yml From 6631a296ef8ee2934a5d93e160c4465f47874bee Mon Sep 17 00:00:00 2001 From: Poff Poffenberger Date: Mon, 27 Jul 2020 12:18:33 -0500 Subject: [PATCH 018/126] [Canvas] Fix top left elements being automatically selected on workpad page loads (#72121) * Fix top left elements being automatically selected on workpad page loads * Remove unnecessary code Co-authored-by: Elastic Machine --- .../components/workpad_page/workpad_interactive_page/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/canvas/public/components/workpad_page/workpad_interactive_page/index.js b/x-pack/plugins/canvas/public/components/workpad_page/workpad_interactive_page/index.js index 41f78165a7394..632ec1ad5e004 100644 --- a/x-pack/plugins/canvas/public/components/workpad_page/workpad_interactive_page/index.js +++ b/x-pack/plugins/canvas/public/components/workpad_page/workpad_interactive_page/index.js @@ -127,7 +127,7 @@ const componentLayoutState = ({ gestureState: aeroStore ? aeroStore.getCurrentState().currentScene.gestureState : { - cursor: { x: 0, y: 0 }, + cursor: { x: Infinity, y: Infinity }, mouseIsDown: false, mouseButtonState: { buttonState: 'up', downX: null, downY: null }, }, From d66cc3515c227cfe81def49d52dc2dda3ba20f30 Mon Sep 17 00:00:00 2001 From: Spencer Date: Mon, 27 Jul 2020 10:43:18 -0700 Subject: [PATCH 019/126] [canvas] migrate tests away from karma (#73121) Co-authored-by: spalger Co-authored-by: Elastic Machine --- .../components/loading/__tests__/loading.js | 25 -- .../components/loading/loading.test.tsx | 36 +++ .../public/functions/__tests__/asset.js | 28 -- .../lib/__tests__/find_expression_type.js | 95 ------- .../public/lib/__tests__/history_provider.js | 240 ------------------ .../public/lib/__tests__/modify_path.js | 34 --- .../get_pretty_shortcut.test.ts | 2 +- .../canvas/public/lib/modify_path.test.ts | 33 +++ .../lib/{modify_path.js => modify_path.ts} | 8 +- .../{__tests__ => }/readable_color.test.ts | 2 +- .../resolved_arg.js => resolved_arg.test.ts} | 22 +- .../lib/{resolved_arg.js => resolved_arg.ts} | 6 +- .../lib/{__tests__ => }/time_interval.test.ts | 2 +- .../__tests__/elements.get_sibling_context.js | 107 -------- .../public/state/actions/elements.test.js | 106 ++++++++ .../public/state/middleware/in_flight.ts | 1 - .../action_creator.js | 0 .../elements.js => elements.test.js} | 10 +- ...resolved_args.js => resolved_args.test.js} | 126 +++++---- ...resolved_args.js => resolved_args.test.js} | 22 +- .../public/state/selectors/resolved_args.ts | 2 - .../{__tests__/workpad.js => workpad.test.js} | 60 ++--- .../canvas/public/state/selectors/workpad.ts | 1 - 23 files changed, 311 insertions(+), 657 deletions(-) delete mode 100644 x-pack/plugins/canvas/public/components/loading/__tests__/loading.js create mode 100644 x-pack/plugins/canvas/public/components/loading/loading.test.tsx delete mode 100644 x-pack/plugins/canvas/public/functions/__tests__/asset.js delete mode 100644 x-pack/plugins/canvas/public/lib/__tests__/find_expression_type.js delete mode 100644 x-pack/plugins/canvas/public/lib/__tests__/history_provider.js delete mode 100644 x-pack/plugins/canvas/public/lib/__tests__/modify_path.js rename x-pack/plugins/canvas/public/lib/{__tests__ => }/get_pretty_shortcut.test.ts (98%) create mode 100644 x-pack/plugins/canvas/public/lib/modify_path.test.ts rename x-pack/plugins/canvas/public/lib/{modify_path.js => modify_path.ts} (61%) rename x-pack/plugins/canvas/public/lib/{__tests__ => }/readable_color.test.ts (94%) rename x-pack/plugins/canvas/public/lib/{__tests__/resolved_arg.js => resolved_arg.test.ts} (57%) rename x-pack/plugins/canvas/public/lib/{resolved_arg.js => resolved_arg.ts} (75%) rename x-pack/plugins/canvas/public/lib/{__tests__ => }/time_interval.test.ts (98%) delete mode 100644 x-pack/plugins/canvas/public/state/actions/__tests__/elements.get_sibling_context.js create mode 100644 x-pack/plugins/canvas/public/state/actions/elements.test.js rename x-pack/plugins/canvas/public/state/reducers/{__tests__/fixtures => __fixtures__}/action_creator.js (100%) rename x-pack/plugins/canvas/public/state/reducers/{__tests__/elements.js => elements.test.js} (78%) rename x-pack/plugins/canvas/public/state/reducers/{__tests__/resolved_args.js => resolved_args.test.js} (62%) rename x-pack/plugins/canvas/public/state/selectors/{__tests__/resolved_args.js => resolved_args.test.js} (55%) rename x-pack/plugins/canvas/public/state/selectors/{__tests__/workpad.js => workpad.test.js} (80%) diff --git a/x-pack/plugins/canvas/public/components/loading/__tests__/loading.js b/x-pack/plugins/canvas/public/components/loading/__tests__/loading.js deleted file mode 100644 index c159f478766ce..0000000000000 --- a/x-pack/plugins/canvas/public/components/loading/__tests__/loading.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import expect from '@kbn/expect'; -import { shallow } from 'enzyme'; -import { EuiLoadingSpinner, EuiIcon } from '@elastic/eui'; -import { Loading } from '../loading'; - -describe('', () => { - it('uses EuiIcon by default', () => { - const wrapper = shallow(); - expect(wrapper.contains()).to.be.ok; - expect(wrapper.contains()).to.not.be.ok; - }); - - it('uses EuiLoadingSpinner when animating', () => { - const wrapper = shallow(); - expect(wrapper.contains()).to.not.be.ok; - expect(wrapper.contains()).to.be.ok; - }); -}); diff --git a/x-pack/plugins/canvas/public/components/loading/loading.test.tsx b/x-pack/plugins/canvas/public/components/loading/loading.test.tsx new file mode 100644 index 0000000000000..004ecc19c42e2 --- /dev/null +++ b/x-pack/plugins/canvas/public/components/loading/loading.test.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; +import { Loading } from './loading'; + +describe('', () => { + it('uses EuiIcon by default', () => { + expect(shallow()).toMatchInlineSnapshot(` +
+ +
+ `); + }); + + it('uses EuiLoadingSpinner when animating', () => { + expect(shallow()).toMatchInlineSnapshot(` +
+ +
+ `); + }); +}); diff --git a/x-pack/plugins/canvas/public/functions/__tests__/asset.js b/x-pack/plugins/canvas/public/functions/__tests__/asset.js deleted file mode 100644 index c21faf9a2e227..0000000000000 --- a/x-pack/plugins/canvas/public/functions/__tests__/asset.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { functionWrapper } from '../../../__tests__/helpers/function_wrapper'; -import { asset } from '../asset'; - -// TODO: restore this test -// will require the ability to mock the store, or somehow remove the function's dependency on getState -describe.skip('asset', () => { - const fn = functionWrapper(asset); - - it('throws if asset could not be retrieved by ID', () => { - const throwsErr = () => { - return fn(null, { id: 'boo' }); - }; - expect(throwsErr).to.throwException((err) => { - expect(err.message).to.be('Could not get the asset by ID: boo'); - }); - }); - - it('returns the asset for found asset ID', () => { - expect(fn(null, { id: 'yay' })).to.be('here is your image'); - }); -}); diff --git a/x-pack/plugins/canvas/public/lib/__tests__/find_expression_type.js b/x-pack/plugins/canvas/public/lib/__tests__/find_expression_type.js deleted file mode 100644 index 58f5c5eb303bd..0000000000000 --- a/x-pack/plugins/canvas/public/lib/__tests__/find_expression_type.js +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -// import expect from 'expect.js'; -// import proxyquire from 'proxyquire'; -// import { Registry } from '../../../common/lib/registry'; - -// const registries = { -// datasource: new Registry(), -// transform: new Registry(), -// model: new Registry(), -// view: new Registry(), -// }; - -// const { findExpressionType } = proxyquire.noCallThru().load('../find_expression_type', { -// '../expression_types/datasource': { -// datasourceRegistry: registries.datasource, -// }, -// '../expression_types/transform': { -// transformRegistry: registries.transform, -// }, -// '../expression_types/model': { -// modelRegistry: registries.model, -// }, -// '../expression_types/view': { -// viewRegistry: registries.view, -// }, -// }); - -// describe('findExpressionType', () => { -// let expTypes; - -// beforeEach(() => { -// expTypes = []; -// const keys = Object.keys(registries); -// keys.forEach(key => { -// const reg = registries[key]; -// reg.reset(); - -// const expObj = () => ({ -// name: `__test_${key}`, -// key, -// }); -// expTypes.push(expObj); -// reg.register(expObj); -// }); -// }); - -// describe('all types', () => { -// it('returns the matching item, by name', () => { -// const match = findExpressionType('__test_model'); -// expect(match).to.eql(expTypes[2]()); -// }); - -// it('returns null when nothing is found', () => { -// const match = findExpressionType('@@nope_nope_nope'); -// expect(match).to.equal(null); -// }); - -// it('throws with multiple matches', () => { -// const commonName = 'commonName'; -// registries.transform.register(() => ({ -// name: commonName, -// })); -// registries.model.register(() => ({ -// name: commonName, -// })); - -// const check = () => { -// findExpressionType(commonName); -// }; -// expect(check).to.throwException(/Found multiple expressions/i); -// }); -// }); - -// describe('specific type', () => { -// it('return the match item, by name and type', () => { -// const match = findExpressionType('__test_view', 'view'); -// expect(match).to.eql(expTypes[3]()); -// }); - -// it('returns null with no match by name and type', () => { -// const match = findExpressionType('__test_view', 'datasource'); -// expect(match).to.equal(null); -// }); -// }); -// }); - -// TODO: restore this test -// proxyquire can not be used to inject mock registries - -describe.skip('findExpressionType', () => {}); diff --git a/x-pack/plugins/canvas/public/lib/__tests__/history_provider.js b/x-pack/plugins/canvas/public/lib/__tests__/history_provider.js deleted file mode 100644 index 99d8305768240..0000000000000 --- a/x-pack/plugins/canvas/public/lib/__tests__/history_provider.js +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import lzString from 'lz-string'; -import { historyProvider } from '../history_provider'; - -function createState() { - return { - transient: { - selectedPage: 'page-f3ce-4bb7-86c8-0417606d6592', - selectedToplevelNodes: ['element-d88c-4bbd-9453-db22e949b92e'], - resolvedArgs: {}, - }, - persistent: { - schemaVersion: 0, - time: new Date().getTime(), - }, - }; -} - -describe.skip('historyProvider', () => { - let history; - let state; - - beforeEach(() => { - history = historyProvider(); - state = createState(); - }); - - describe('instances', () => { - it('should return the same instance for the same window object', () => { - expect(historyProvider()).to.equal(history); - }); - - it('should return different instance for different window object', () => { - const newWindow = {}; - expect(historyProvider(newWindow)).not.to.be(history); - }); - }); - - describe('push updates', () => { - beforeEach(() => { - history.push(state); - }); - - afterEach(() => { - // reset state back to initial after each test - history.undo(); - }); - - describe('push', () => { - it('should add state to location', () => { - expect(history.getLocation().state).to.eql(state); - }); - - it('should push compressed state into history', () => { - const hist = history.historyInstance; - expect(hist.location.state).to.equal(lzString.compress(JSON.stringify(state))); - }); - }); - - describe.skip('undo', () => { - it('should move history back', () => { - // pushed location has state value - expect(history.getLocation().state).to.eql(state); - - // back to initial location with null state - history.undo(); - expect(history.getLocation().state).to.be(null); - }); - }); - - describe.skip('redo', () => { - it('should move history forward', () => { - // back to initial location, with null state - history.undo(); - expect(history.getLocation().state).to.be(null); - - // return to pushed location, with state value - history.redo(); - expect(history.getLocation().state).to.eql(state); - }); - }); - }); - - describe.skip('replace updates', () => { - beforeEach(() => { - history.replace(state); - }); - - afterEach(() => { - // reset history to default after each test - history.replace(null); - }); - - describe('replace', () => { - it('should replace state in window history', () => { - expect(history.getLocation().state).to.eql(state); - }); - - it('should replace compressed state into history', () => { - const hist = history.historyInstance; - expect(hist.location.state).to.equal(lzString.compress(JSON.stringify(state))); - }); - }); - }); - - describe('onChange', () => { - const createOnceHandler = (history, done, fn) => { - const teardown = history.onChange((location, prevLocation) => { - if (typeof fn === 'function') { - fn(location, prevLocation); - } - teardown(); - done(); - }); - }; - - it('should return a method to remove the listener', () => { - const handler = () => 'hello world'; - const teardownFn = history.onChange(handler); - - expect(teardownFn).to.be.a('function'); - - // teardown the listener - teardownFn(); - }); - - it('should call handler on state change', (done) => { - createOnceHandler(history, done, (loc) => { - expect(loc).to.be.a('object'); - }); - - history.push({}); - }); - - it('should pass location object to handler', (done) => { - createOnceHandler(history, done, (location) => { - expect(location.pathname).to.be.a('string'); - expect(location.hash).to.be.a('string'); - expect(location.state).to.be.an('object'); - expect(location.action).to.equal('push'); - }); - - history.push(state); - }); - - it('should pass decompressed state to handler', (done) => { - createOnceHandler(history, done, ({ state: curState }) => { - expect(curState).to.eql(state); - }); - - history.push(state); - }); - - it('should pass in the previous location object to handler', (done) => { - createOnceHandler(history, done, (location, prevLocation) => { - expect(prevLocation.pathname).to.be.a('string'); - expect(prevLocation.hash).to.be.a('string'); - expect(prevLocation.state).to.be(null); - expect(prevLocation.action).to.equal('push'); - }); - - history.push(state); - }); - }); - - describe('resetOnChange', () => { - // the history onChange handler was made async and now there's no way to know when the handler was called - // TODO: restore these tests. - it.skip('removes listeners', () => { - const createHandler = () => { - let callCount = 0; - - function handlerFn() { - callCount += 1; - } - handlerFn.getCallCount = () => callCount; - - return handlerFn; - }; - - const handler1 = createHandler(); - const handler2 = createHandler(); - - // attach and test the first handler - history.onChange(handler1); - - expect(handler1.getCallCount()).to.equal(0); - history.push({}); - expect(handler1.getCallCount()).to.equal(1); - - // attach and test the second handler - history.onChange(handler2); - - expect(handler2.getCallCount()).to.equal(0); - history.push({}); - expect(handler1.getCallCount()).to.equal(2); - expect(handler2.getCallCount()).to.equal(1); - - // remove all handlers - history.resetOnChange(); - history.push({}); - expect(handler1.getCallCount()).to.equal(2); - expect(handler2.getCallCount()).to.equal(1); - }); - }); - - describe('parse', () => { - it('returns the decompressed object', () => { - history.push(state); - - const hist = history.historyInstance; - const rawState = hist.location.state; - - expect(rawState).to.be.a('string'); - expect(history.parse(rawState)).to.eql(state); - }); - - it('returns null with invalid JSON', () => { - expect(history.parse('hello')).to.be(null); - }); - }); - - describe('encode', () => { - it('returns the compressed string', () => { - history.push(state); - - const hist = history.historyInstance; - const rawState = hist.location.state; - - expect(rawState).to.be.a('string'); - expect(history.encode(state)).to.eql(rawState); - }); - }); -}); diff --git a/x-pack/plugins/canvas/public/lib/__tests__/modify_path.js b/x-pack/plugins/canvas/public/lib/__tests__/modify_path.js deleted file mode 100644 index 75454890f9717..0000000000000 --- a/x-pack/plugins/canvas/public/lib/__tests__/modify_path.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { prepend, append } from '../modify_path'; - -describe('modify paths', () => { - describe('prepend', () => { - it('prepends a string path', () => { - expect(prepend('a.b.c', '0')).to.eql([0, 'a', 'b', 'c']); - expect(prepend('a.b.c', ['0', '1'])).to.eql([0, 1, 'a', 'b', 'c']); - }); - - it('prepends an array path', () => { - expect(prepend(['a', 1, 'last'], '0')).to.eql([0, 'a', 1, 'last']); - expect(prepend(['a', 1, 'last'], [0, 1])).to.eql([0, 1, 'a', 1, 'last']); - }); - }); - - describe('append', () => { - it('appends to a string path', () => { - expect(append('one.2.3', 'zero')).to.eql(['one', 2, 3, 'zero']); - expect(append('one.2.3', ['zero', 'one'])).to.eql(['one', 2, 3, 'zero', 'one']); - }); - - it('appends to an array path', () => { - expect(append(['testString'], 'huzzah')).to.eql(['testString', 'huzzah']); - expect(append(['testString'], ['huzzah', 'yosh'])).to.eql(['testString', 'huzzah', 'yosh']); - }); - }); -}); diff --git a/x-pack/plugins/canvas/public/lib/__tests__/get_pretty_shortcut.test.ts b/x-pack/plugins/canvas/public/lib/get_pretty_shortcut.test.ts similarity index 98% rename from x-pack/plugins/canvas/public/lib/__tests__/get_pretty_shortcut.test.ts rename to x-pack/plugins/canvas/public/lib/get_pretty_shortcut.test.ts index 783b085f3da7e..95cffefde7b1c 100644 --- a/x-pack/plugins/canvas/public/lib/__tests__/get_pretty_shortcut.test.ts +++ b/x-pack/plugins/canvas/public/lib/get_pretty_shortcut.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getPrettyShortcut } from '../get_pretty_shortcut'; +import { getPrettyShortcut } from './get_pretty_shortcut'; describe('getPrettyShortcut', () => { test('uppercases shortcuts', () => { diff --git a/x-pack/plugins/canvas/public/lib/modify_path.test.ts b/x-pack/plugins/canvas/public/lib/modify_path.test.ts new file mode 100644 index 0000000000000..245b91ca4ccd4 --- /dev/null +++ b/x-pack/plugins/canvas/public/lib/modify_path.test.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { prepend, append } from './modify_path'; + +describe('modify paths', () => { + describe('prepend', () => { + it('prepends a string path', () => { + expect(prepend('a.b.c', '0')).toEqual(['0', 'a', 'b', 'c']); + expect(prepend('a.b.c', ['0', '1'])).toEqual(['0', '1', 'a', 'b', 'c']); + }); + + it('prepends an array path', () => { + expect(prepend(['a', 1, 'last'], '0')).toEqual(['0', 'a', '1', 'last']); + expect(prepend(['a', 1, 'last'], [0, 1])).toEqual(['0', '1', 'a', '1', 'last']); + }); + }); + + describe('append', () => { + it('appends to a string path', () => { + expect(append('one.2.3', 'zero')).toEqual(['one', '2', '3', 'zero']); + expect(append('one.2.3', ['zero', 'one'])).toEqual(['one', '2', '3', 'zero', 'one']); + }); + + it('appends to an array path', () => { + expect(append(['testString'], 'huzzah')).toEqual(['testString', 'huzzah']); + expect(append(['testString'], ['huzzah', 'yosh'])).toEqual(['testString', 'huzzah', 'yosh']); + }); + }); +}); diff --git a/x-pack/plugins/canvas/public/lib/modify_path.js b/x-pack/plugins/canvas/public/lib/modify_path.ts similarity index 61% rename from x-pack/plugins/canvas/public/lib/modify_path.js rename to x-pack/plugins/canvas/public/lib/modify_path.ts index 714a616679bc9..a5b8f0316d23e 100644 --- a/x-pack/plugins/canvas/public/lib/modify_path.js +++ b/x-pack/plugins/canvas/public/lib/modify_path.ts @@ -6,14 +6,16 @@ import { toPath } from 'lodash'; -export function prepend(path, value) { +export type Path = Array; + +export function prepend(path: string | Path, value: string | Path): Path { return toPath(value).concat(toPath(path)); } -export function append(path, value) { +export function append(path: string | Path, value: string | Path): Path { return toPath(path).concat(toPath(value)); } -export function convert(path) { +export function convert(path: string | Path): Path { return toPath(path); } diff --git a/x-pack/plugins/canvas/public/lib/__tests__/readable_color.test.ts b/x-pack/plugins/canvas/public/lib/readable_color.test.ts similarity index 94% rename from x-pack/plugins/canvas/public/lib/__tests__/readable_color.test.ts rename to x-pack/plugins/canvas/public/lib/readable_color.test.ts index bd79655ca727b..ce7cf03c2889c 100644 --- a/x-pack/plugins/canvas/public/lib/__tests__/readable_color.test.ts +++ b/x-pack/plugins/canvas/public/lib/readable_color.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { readableColor } from '../readable_color'; +import { readableColor } from './readable_color'; describe('readableColor', () => { test('light', () => { diff --git a/x-pack/plugins/canvas/public/lib/__tests__/resolved_arg.js b/x-pack/plugins/canvas/public/lib/resolved_arg.test.ts similarity index 57% rename from x-pack/plugins/canvas/public/lib/__tests__/resolved_arg.js rename to x-pack/plugins/canvas/public/lib/resolved_arg.test.ts index 9e582ddd1858b..fac2023fb2ce5 100644 --- a/x-pack/plugins/canvas/public/lib/__tests__/resolved_arg.js +++ b/x-pack/plugins/canvas/public/lib/resolved_arg.test.ts @@ -4,39 +4,38 @@ * you may not use this file except in compliance with the Elastic License. */ -import expect from '@kbn/expect'; -import { getState, getValue, getError } from '../resolved_arg'; +import { getState, getValue, getError } from './resolved_arg'; describe('resolved arg helper', () => { describe('getState', () => { it('returns pending by default', () => { - expect(getState()).to.be(null); + expect(getState()).toBe(null); }); it('returns the state', () => { - expect(getState({ state: 'pending' })).to.equal('pending'); - expect(getState({ state: 'ready' })).to.equal('ready'); - expect(getState({ state: 'error' })).to.equal('error'); + expect(getState({ state: 'pending' })).toEqual('pending'); + expect(getState({ state: 'ready' })).toEqual('ready'); + expect(getState({ state: 'error' })).toEqual('error'); }); }); describe('getValue', () => { it('returns null by default', () => { - expect(getValue()).to.be(null); + expect(getValue()).toBe(null); }); it('returns the value', () => { - expect(getValue({ value: 'hello test' })).to.equal('hello test'); + expect(getValue({ value: 'hello test' })).toEqual('hello test'); }); }); describe('getError', () => { it('returns null by default', () => { - expect(getError()).to.be(null); + expect(getError()).toBe(null); }); it('returns null when state is not error', () => { - expect(getError({ state: 'pending', error: 'nope' })).to.be(null); + expect(getError({ state: 'pending', error: 'nope' })).toBe(null); }); it('returns the error', () => { @@ -46,8 +45,7 @@ describe('resolved arg helper', () => { error: new Error('i failed'), }; - expect(getError(arg)).to.be.an(Error); - expect(getError(arg).toString()).to.match(/i failed/); + expect(getError(arg)).toMatchInlineSnapshot(`[Error: i failed]`); }); }); }); diff --git a/x-pack/plugins/canvas/public/lib/resolved_arg.js b/x-pack/plugins/canvas/public/lib/resolved_arg.ts similarity index 75% rename from x-pack/plugins/canvas/public/lib/resolved_arg.js rename to x-pack/plugins/canvas/public/lib/resolved_arg.ts index 8a9da8e466f7e..77f8a6cf8e5e0 100644 --- a/x-pack/plugins/canvas/public/lib/resolved_arg.js +++ b/x-pack/plugins/canvas/public/lib/resolved_arg.ts @@ -6,15 +6,15 @@ import { get } from 'lodash'; -export function getState(resolvedArg) { +export function getState(resolvedArg?: any): any { return get(resolvedArg, 'state', null); } -export function getValue(resolvedArg) { +export function getValue(resolvedArg?: any): any { return get(resolvedArg, 'value', null); } -export function getError(resolvedArg) { +export function getError(resolvedArg?: any): any { if (getState(resolvedArg) !== 'error') { return null; } diff --git a/x-pack/plugins/canvas/public/lib/__tests__/time_interval.test.ts b/x-pack/plugins/canvas/public/lib/time_interval.test.ts similarity index 98% rename from x-pack/plugins/canvas/public/lib/__tests__/time_interval.test.ts rename to x-pack/plugins/canvas/public/lib/time_interval.test.ts index 2dab00631cce1..8a057793ead79 100644 --- a/x-pack/plugins/canvas/public/lib/__tests__/time_interval.test.ts +++ b/x-pack/plugins/canvas/public/lib/time_interval.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getTimeInterval, createTimeInterval, isValidTimeInterval } from '../time_interval'; +import { getTimeInterval, createTimeInterval, isValidTimeInterval } from './time_interval'; describe('time_interval', () => { test('getTimeInterval', () => { diff --git a/x-pack/plugins/canvas/public/state/actions/__tests__/elements.get_sibling_context.js b/x-pack/plugins/canvas/public/state/actions/__tests__/elements.get_sibling_context.js deleted file mode 100644 index 198ccb2ffc381..0000000000000 --- a/x-pack/plugins/canvas/public/state/actions/__tests__/elements.get_sibling_context.js +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { getSiblingContext } from '../elements'; - -const state = { - transient: { - resolvedArgs: { - 'element-foo': { - expressionContext: { - '0': { - state: 'ready', - value: { - type: 'datatable', - columns: [ - { name: 'project', type: 'string' }, - { name: 'cost', type: 'string' }, - { name: 'age', type: 'string' }, - ], - rows: [ - { project: 'pandas', cost: '500', age: '18' }, - { project: 'tigers', cost: '200', age: '12' }, - ], - }, - error: null, - }, - '1': { - state: 'ready', - value: { - type: 'datatable', - columns: [ - { name: 'project', type: 'string' }, - { name: 'cost', type: 'string' }, - { name: 'age', type: 'string' }, - ], - rows: [ - { project: 'tigers', cost: '200', age: '12' }, - { project: 'pandas', cost: '500', age: '18' }, - ], - }, - error: null, - }, - '2': { - state: 'ready', - value: { - type: 'pointseries', - columns: { - x: { type: 'string', role: 'dimension', expression: 'cost' }, - y: { type: 'string', role: 'dimension', expression: 'project' }, - color: { type: 'string', role: 'dimension', expression: 'project' }, - }, - rows: [ - { x: '200', y: 'tigers', color: 'tigers' }, - { x: '500', y: 'pandas', color: 'pandas' }, - ], - }, - error: null, - }, - }, - }, - }, - }, -}; - -describe('actions/elements getSiblingContext', () => { - it('should find context when a previous context value is found', () => { - // pointseries map - expect(getSiblingContext(state, 'element-foo', 2)).to.eql({ - index: 2, - context: { - type: 'pointseries', - columns: { - x: { type: 'string', role: 'dimension', expression: 'cost' }, - y: { type: 'string', role: 'dimension', expression: 'project' }, - color: { type: 'string', role: 'dimension', expression: 'project' }, - }, - rows: [ - { x: '200', y: 'tigers', color: 'tigers' }, - { x: '500', y: 'pandas', color: 'pandas' }, - ], - }, - }); - }); - - it('should find context when a previous context value is not found', () => { - // pointseries map - expect(getSiblingContext(state, 'element-foo', 1000)).to.eql({ - index: 2, - context: { - type: 'pointseries', - columns: { - x: { type: 'string', role: 'dimension', expression: 'cost' }, - y: { type: 'string', role: 'dimension', expression: 'project' }, - color: { type: 'string', role: 'dimension', expression: 'project' }, - }, - rows: [ - { x: '200', y: 'tigers', color: 'tigers' }, - { x: '500', y: 'pandas', color: 'pandas' }, - ], - }, - }); - }); -}); diff --git a/x-pack/plugins/canvas/public/state/actions/elements.test.js b/x-pack/plugins/canvas/public/state/actions/elements.test.js new file mode 100644 index 0000000000000..a790e81e65e25 --- /dev/null +++ b/x-pack/plugins/canvas/public/state/actions/elements.test.js @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getSiblingContext } from './elements'; + +describe('getSiblingContext', () => { + const state = { + transient: { + resolvedArgs: { + 'element-foo': { + expressionContext: { + '0': { + state: 'ready', + value: { + type: 'datatable', + columns: [ + { name: 'project', type: 'string' }, + { name: 'cost', type: 'string' }, + { name: 'age', type: 'string' }, + ], + rows: [ + { project: 'pandas', cost: '500', age: '18' }, + { project: 'tigers', cost: '200', age: '12' }, + ], + }, + error: null, + }, + '1': { + state: 'ready', + value: { + type: 'datatable', + columns: [ + { name: 'project', type: 'string' }, + { name: 'cost', type: 'string' }, + { name: 'age', type: 'string' }, + ], + rows: [ + { project: 'tigers', cost: '200', age: '12' }, + { project: 'pandas', cost: '500', age: '18' }, + ], + }, + error: null, + }, + '2': { + state: 'ready', + value: { + type: 'pointseries', + columns: { + x: { type: 'string', role: 'dimension', expression: 'cost' }, + y: { type: 'string', role: 'dimension', expression: 'project' }, + color: { type: 'string', role: 'dimension', expression: 'project' }, + }, + rows: [ + { x: '200', y: 'tigers', color: 'tigers' }, + { x: '500', y: 'pandas', color: 'pandas' }, + ], + }, + error: null, + }, + }, + }, + }, + }, + }; + + it('should find context when a previous context value is found', () => { + // pointseries map + expect(getSiblingContext(state, 'element-foo', 2)).toEqual({ + index: 2, + context: { + type: 'pointseries', + columns: { + x: { type: 'string', role: 'dimension', expression: 'cost' }, + y: { type: 'string', role: 'dimension', expression: 'project' }, + color: { type: 'string', role: 'dimension', expression: 'project' }, + }, + rows: [ + { x: '200', y: 'tigers', color: 'tigers' }, + { x: '500', y: 'pandas', color: 'pandas' }, + ], + }, + }); + }); + + it('should find context when a previous context value is not found', () => { + // pointseries map + expect(getSiblingContext(state, 'element-foo', 1000)).toEqual({ + index: 2, + context: { + type: 'pointseries', + columns: { + x: { type: 'string', role: 'dimension', expression: 'cost' }, + y: { type: 'string', role: 'dimension', expression: 'project' }, + color: { type: 'string', role: 'dimension', expression: 'project' }, + }, + rows: [ + { x: '200', y: 'tigers', color: 'tigers' }, + { x: '500', y: 'pandas', color: 'pandas' }, + ], + }, + }); + }); +}); diff --git a/x-pack/plugins/canvas/public/state/middleware/in_flight.ts b/x-pack/plugins/canvas/public/state/middleware/in_flight.ts index 028b9f214133f..d564a44b0b5f7 100644 --- a/x-pack/plugins/canvas/public/state/middleware/in_flight.ts +++ b/x-pack/plugins/canvas/public/state/middleware/in_flight.ts @@ -9,7 +9,6 @@ import { loadingIndicator as defaultLoadingIndicator, LoadingIndicatorInterface, } from '../../lib/loading_indicator'; -// @ts-expect-error import { convert } from '../../lib/modify_path'; interface InFlightMiddlewareOptions { diff --git a/x-pack/plugins/canvas/public/state/reducers/__tests__/fixtures/action_creator.js b/x-pack/plugins/canvas/public/state/reducers/__fixtures__/action_creator.js similarity index 100% rename from x-pack/plugins/canvas/public/state/reducers/__tests__/fixtures/action_creator.js rename to x-pack/plugins/canvas/public/state/reducers/__fixtures__/action_creator.js diff --git a/x-pack/plugins/canvas/public/state/reducers/__tests__/elements.js b/x-pack/plugins/canvas/public/state/reducers/elements.test.js similarity index 78% rename from x-pack/plugins/canvas/public/state/reducers/__tests__/elements.js rename to x-pack/plugins/canvas/public/state/reducers/elements.test.js index e1f7509325a7a..23f684879ce06 100644 --- a/x-pack/plugins/canvas/public/state/reducers/__tests__/elements.js +++ b/x-pack/plugins/canvas/public/state/reducers/elements.test.js @@ -4,10 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import expect from '@kbn/expect'; -import { get } from 'lodash'; -import { elementsReducer } from '../elements'; -import { actionCreator } from './fixtures/action_creator'; +import { elementsReducer } from './elements'; +import { actionCreator } from './__fixtures__/action_creator'; describe('elements reducer', () => { let state; @@ -46,8 +44,8 @@ describe('elements reducer', () => { }); const newState = elementsReducer(state, action); - const newElement = get(newState, ['pages', 0, 'elements', 1]); + const newElement = newState?.pages?.[0]?.elements?.[1]; - expect(newElement).to.eql(expected); + expect(newElement).toEqual(expected); }); }); diff --git a/x-pack/plugins/canvas/public/state/reducers/__tests__/resolved_args.js b/x-pack/plugins/canvas/public/state/reducers/resolved_args.test.js similarity index 62% rename from x-pack/plugins/canvas/public/state/reducers/__tests__/resolved_args.js rename to x-pack/plugins/canvas/public/state/reducers/resolved_args.test.js index ee1d0fc1ca9ba..74f1544403e67 100644 --- a/x-pack/plugins/canvas/public/state/reducers/__tests__/resolved_args.js +++ b/x-pack/plugins/canvas/public/state/reducers/resolved_args.test.js @@ -4,11 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import expect from '@kbn/expect'; -import * as actions from '../../actions/resolved_args'; -import { flushContextAfterIndex } from '../../actions/elements'; -import { resolvedArgsReducer } from '../resolved_args'; -import { actionCreator } from './fixtures/action_creator'; +import * as actions from '../actions/resolved_args'; +import { flushContextAfterIndex } from '../actions/elements'; +import { resolvedArgsReducer } from './resolved_args'; +import { actionCreator } from './__fixtures__/action_creator'; describe('resolved args reducer', () => { let state; @@ -41,13 +40,15 @@ describe('resolved args reducer', () => { }); const newState = resolvedArgsReducer(state, action); - expect(newState.resolvedArgs['element-1']).to.eql([ - { - state: 'pending', - value: null, - error: null, - }, - ]); + expect(newState.resolvedArgs['element-1']).toMatchInlineSnapshot(` + Object { + "0": Object { + "error": null, + "state": "pending", + "value": null, + }, + } + `); }); it('sets state to loading, with array path', () => { @@ -56,13 +57,15 @@ describe('resolved args reducer', () => { }); const newState = resolvedArgsReducer(state, action); - expect(newState.resolvedArgs['element-1']).to.eql([ - { - state: 'pending', - value: null, - error: null, - }, - ]); + expect(newState.resolvedArgs['element-1']).toMatchInlineSnapshot(` + Object { + "0": Object { + "error": null, + "state": "pending", + "value": null, + }, + } + `); }); }); @@ -75,13 +78,15 @@ describe('resolved args reducer', () => { }); const newState = resolvedArgsReducer(state, action); - expect(newState.resolvedArgs['element-1']).to.eql([ - { - state: 'ready', - value, - error: null, - }, - ]); + expect(newState.resolvedArgs['element-1']).toMatchInlineSnapshot(` + Object { + "0": Object { + "error": null, + "state": "ready", + "value": "hello world", + }, + } + `); }); it('handles error values', () => { @@ -92,13 +97,15 @@ describe('resolved args reducer', () => { }); const newState = resolvedArgsReducer(state, action); - expect(newState.resolvedArgs['element-1']).to.eql([ - { - state: 'error', - value: null, - error: err, - }, - ]); + expect(newState.resolvedArgs['element-1']).toMatchInlineSnapshot(` + Object { + "0": Object { + "error": [Error: farewell world], + "state": "error", + "value": null, + }, + } + `); }); it('preserves old value on error', () => { @@ -109,11 +116,13 @@ describe('resolved args reducer', () => { }); const newState = resolvedArgsReducer(state, action); - expect(newState.resolvedArgs['element-0'][0]).to.eql({ - state: 'error', - value: 'testing', - error: err, - }); + expect(newState.resolvedArgs['element-0'][0]).toMatchInlineSnapshot(` + Object { + "error": [Error: farewell world], + "state": "error", + "value": "testing", + } + `); }); }); @@ -124,14 +133,15 @@ describe('resolved args reducer', () => { }); const newState = resolvedArgsReducer(state, action); - expect(newState.resolvedArgs['element-0']).to.have.length(1); - expect(newState.resolvedArgs['element-0']).to.eql([ - { - state: 'ready', - value: 'testing', - error: null, - }, - ]); + expect(newState.resolvedArgs['element-0']).toMatchInlineSnapshot(` + Array [ + Object { + "error": null, + "state": "ready", + "value": "testing", + }, + ] + `); }); it('deeply removes resolved values', () => { @@ -140,7 +150,7 @@ describe('resolved args reducer', () => { }); const newState = resolvedArgsReducer(state, action); - expect(newState.resolvedArgs['element-0']).to.be(undefined); + expect(newState.resolvedArgs['element-0']).toBe(undefined); }); }); @@ -183,12 +193,22 @@ describe('resolved args reducer', () => { }); const newState = resolvedArgsReducer(state, action); - expect(newState.resolvedArgs['element-1']).to.eql({ - expressionContext: { - '1': { state: 'ready', value: 'test-1', error: null }, - '2': { state: 'ready', value: 'test-2', error: null }, - }, - }); + expect(newState.resolvedArgs['element-1']).toMatchInlineSnapshot(` + Object { + "expressionContext": Object { + "1": Object { + "error": null, + "state": "ready", + "value": "test-1", + }, + "2": Object { + "error": null, + "state": "ready", + "value": "test-2", + }, + }, + } + `); }); }); }); diff --git a/x-pack/plugins/canvas/public/state/selectors/__tests__/resolved_args.js b/x-pack/plugins/canvas/public/state/selectors/resolved_args.test.js similarity index 55% rename from x-pack/plugins/canvas/public/state/selectors/__tests__/resolved_args.js rename to x-pack/plugins/canvas/public/state/selectors/resolved_args.test.js index 3157201927854..1710d6704f980 100644 --- a/x-pack/plugins/canvas/public/state/selectors/__tests__/resolved_args.js +++ b/x-pack/plugins/canvas/public/state/selectors/resolved_args.test.js @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import expect from '@kbn/expect'; -import * as selector from '../resolved_args'; +import * as selector from './resolved_args'; describe('resolved args selector', () => { let state; @@ -35,21 +34,20 @@ describe('resolved args selector', () => { }); it('getValue returns the state', () => { - expect(selector.getState(state, 'test1')).to.equal('ready'); - expect(selector.getState(state, 'test2')).to.equal('pending'); - expect(selector.getState(state, 'test3')).to.equal('error'); + expect(selector.getState(state, 'test1')).toEqual('ready'); + expect(selector.getState(state, 'test2')).toEqual('pending'); + expect(selector.getState(state, 'test3')).toEqual('error'); }); it('getValue returns the value', () => { - expect(selector.getValue(state, 'test1')).to.equal('test value'); - expect(selector.getValue(state, 'test2')).to.equal(null); - expect(selector.getValue(state, 'test3')).to.equal('some old value'); + expect(selector.getValue(state, 'test1')).toEqual('test value'); + expect(selector.getValue(state, 'test2')).toEqual(null); + expect(selector.getValue(state, 'test3')).toEqual('some old value'); }); it('getError returns the error', () => { - expect(selector.getError(state, 'test1')).to.equal(null); - expect(selector.getError(state, 'test2')).to.equal(null); - expect(selector.getError(state, 'test3')).to.be.an(Error); - expect(selector.getError(state, 'test3').toString()).to.match(/i\ have\ failed$/); + expect(selector.getError(state, 'test1')).toEqual(null); + expect(selector.getError(state, 'test2')).toEqual(null); + expect(selector.getError(state, 'test3')).toMatchInlineSnapshot(`[Error: i have failed]`); }); }); diff --git a/x-pack/plugins/canvas/public/state/selectors/resolved_args.ts b/x-pack/plugins/canvas/public/state/selectors/resolved_args.ts index 770d4403f8587..b557ff04921ca 100644 --- a/x-pack/plugins/canvas/public/state/selectors/resolved_args.ts +++ b/x-pack/plugins/canvas/public/state/selectors/resolved_args.ts @@ -5,9 +5,7 @@ */ import { get } from 'lodash'; -// @ts-expect-error untyped local import * as argHelper from '../../lib/resolved_arg'; -// @ts-expect-error untyped local import { prepend } from '../../lib/modify_path'; import { State } from '../../../types'; diff --git a/x-pack/plugins/canvas/public/state/selectors/__tests__/workpad.js b/x-pack/plugins/canvas/public/state/selectors/workpad.test.js similarity index 80% rename from x-pack/plugins/canvas/public/state/selectors/__tests__/workpad.js rename to x-pack/plugins/canvas/public/state/selectors/workpad.test.js index 5fdc662c592cc..d5f7e003af858 100644 --- a/x-pack/plugins/canvas/public/state/selectors/__tests__/workpad.js +++ b/x-pack/plugins/canvas/public/state/selectors/workpad.test.js @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import expect from '@kbn/expect'; -import * as selector from '../workpad'; +import * as selector from './workpad'; describe('workpad selectors', () => { let asts; @@ -125,42 +124,42 @@ describe('workpad selectors', () => { describe('empty state', () => { it('returns undefined', () => { - expect(selector.getSelectedPage({})).to.be(undefined); - expect(selector.getPageById({}, 'page-1')).to.be(undefined); - expect(selector.getSelectedElement({})).to.be(undefined); - expect(selector.getElementById({}, 'element-1')).to.be(undefined); - expect(selector.getResolvedArgs({}, 'element-1')).to.be(undefined); - expect(selector.getSelectedResolvedArgs({})).to.be(undefined); - expect(selector.isWriteable({})).to.be(true); + expect(selector.getSelectedPage({})).toBe(undefined); + expect(selector.getPageById({}, 'page-1')).toBe(undefined); + expect(selector.getSelectedElement({})).toBe(undefined); + expect(selector.getElementById({}, 'element-1')).toBe(undefined); + expect(selector.getResolvedArgs({}, 'element-1')).toBe(undefined); + expect(selector.getSelectedResolvedArgs({})).toBe(undefined); + expect(selector.isWriteable({})).toBe(true); }); }); describe('getSelectedPage', () => { it('returns the selected page', () => { - expect(selector.getSelectedPage(state)).to.equal('page-1'); + expect(selector.getSelectedPage(state)).toEqual('page-1'); }); }); describe('getPages', () => { it('return an empty array with no pages', () => { - expect(selector.getPages({})).to.eql([]); + expect(selector.getPages({})).toEqual([]); }); it('returns all pages in persisent state', () => { - expect(selector.getPages(state)).to.eql(state.persistent.workpad.pages); + expect(selector.getPages(state)).toEqual(state.persistent.workpad.pages); }); }); describe('getPageById', () => { it('should return matching page', () => { - expect(selector.getPageById(state, 'page-1')).to.eql(state.persistent.workpad.pages[0]); + expect(selector.getPageById(state, 'page-1')).toEqual(state.persistent.workpad.pages[0]); }); }); describe('getSelectedElement', () => { it('returns selected element', () => { const { elements } = state.persistent.workpad.pages[0]; - expect(selector.getSelectedElement(state)).to.eql({ + expect(selector.getSelectedElement(state)).toEqual({ ...elements[1], ast: asts['element-1'], }); @@ -169,7 +168,7 @@ describe('workpad selectors', () => { describe('getElements', () => { it('is an empty array with no state', () => { - expect(selector.getElements({})).to.eql([]); + expect(selector.getElements({})).toEqual([]); }); it('returns all elements on the page', () => { @@ -179,18 +178,18 @@ describe('workpad selectors', () => { ...element, ast: asts[element.id], })); - expect(selector.getElements(state)).to.eql(expected); + expect(selector.getElements(state)).toEqual(expected); }); }); describe('getElementById', () => { it('returns element matching id', () => { const { elements } = state.persistent.workpad.pages[0]; - expect(selector.getElementById(state, 'element-0')).to.eql({ + expect(selector.getElementById(state, 'element-0')).toEqual({ ...elements[0], ast: asts['element-0'], }); - expect(selector.getElementById(state, 'element-1')).to.eql({ + expect(selector.getElementById(state, 'element-1')).toEqual({ ...elements[1], ast: asts['element-1'], }); @@ -199,18 +198,18 @@ describe('workpad selectors', () => { describe('getResolvedArgs', () => { it('returns resolved args by element id', () => { - expect(selector.getResolvedArgs(state, 'element-0')).to.equal('test resolved arg, el 0'); + expect(selector.getResolvedArgs(state, 'element-0')).toEqual('test resolved arg, el 0'); }); it('returns resolved args at given path', () => { const arg = selector.getResolvedArgs(state, 'element-2', 'example1'); - expect(arg).to.equal('first thing'); + expect(arg).toEqual('first thing'); }); }); describe('getSelectedResolvedArgs', () => { it('returns resolved args for selected element', () => { - expect(selector.getSelectedResolvedArgs(state)).to.equal('test resolved arg, el 1'); + expect(selector.getSelectedResolvedArgs(state)).toEqual('test resolved arg, el 1'); }); it('returns resolved args at given path', () => { @@ -222,7 +221,7 @@ describe('workpad selectors', () => { }, }; const arg = selector.getSelectedResolvedArgs(tmpState, 'example2'); - expect(arg).to.eql(['why not', 'an array?']); + expect(arg).toEqual(['why not', 'an array?']); }); it('returns resolved args at given deep path', () => { @@ -234,14 +233,14 @@ describe('workpad selectors', () => { }, }; const arg = selector.getSelectedResolvedArgs(tmpState, ['example3', 'deeper', 'object']); - expect(arg).to.be(true); + expect(arg).toBe(true); }); }); describe('getGlobalFilters', () => { it('gets filters from all elements', () => { const filters = selector.getGlobalFilters(state); - expect(filters).to.eql([ + expect(filters).toEqual([ 'exactly value="beats" column="project"', 'timefilter filterGroup=one column=@timestamp from=now-24h to=now', ]); @@ -249,17 +248,14 @@ describe('workpad selectors', () => { it('gets returns empty array with no elements', () => { const filters = selector.getGlobalFilters({}); - expect(filters).to.be.an(Array); - expect(filters).to.have.length(0); + expect(filters).toEqual([]); }); }); describe('getGlobalFilterGroups', () => { it('gets filter group from elements', () => { const filterGroups = selector.getGlobalFilterGroups(state); - expect(filterGroups).to.be.an(Array); - expect(filterGroups).to.have.length(1); - expect(filterGroups[0]).to.equal('one'); + expect(filterGroups).toEqual(['one']); }); it('gets all unique filter groups', () => { @@ -282,7 +278,7 @@ describe('workpad selectors', () => { }); // filters are alphabetical - expect(filterGroups).to.eql(['one', 'two']); + expect(filterGroups).toEqual(['one', 'two']); }); it('gets filter groups in filter function args', () => { @@ -311,13 +307,13 @@ describe('workpad selectors', () => { // {string two} is skipped, only primitive values are extracted // filterGroup=one and {filters one} are de-duped // filters are alphabetical - expect(filterGroups).to.eql(['four', 'one', 'three']); + expect(filterGroups).toEqual(['four', 'one', 'three']); }); }); describe('isWriteable', () => { it('returns boolean for if the workpad is writeable', () => { - expect(selector.isWriteable(state)).to.equal(false); + expect(selector.isWriteable(state)).toEqual(false); }); }); }); diff --git a/x-pack/plugins/canvas/public/state/selectors/workpad.ts b/x-pack/plugins/canvas/public/state/selectors/workpad.ts index a677bcaf29e61..b05615b7930c5 100644 --- a/x-pack/plugins/canvas/public/state/selectors/workpad.ts +++ b/x-pack/plugins/canvas/public/state/selectors/workpad.ts @@ -7,7 +7,6 @@ import { get, omit } from 'lodash'; // @ts-expect-error untyped local import { safeElementFromExpression, fromExpression } from '@kbn/interpreter/common'; -// @ts-expect-error untyped local import { append } from '../../lib/modify_path'; import { getAssets } from './assets'; import { From dd4796cfdd2a7e6081a8c16d0e5fe0c8593b87f3 Mon Sep 17 00:00:00 2001 From: Spencer Date: Mon, 27 Jul 2020 11:07:58 -0700 Subject: [PATCH 020/126] Remove karma (#73126) Co-authored-by: spalger --- .../contributing/development-tests.asciidoc | 2 - .../development-unit-tests.asciidoc | 33 - package.json | 11 - .../lib/get_webpack_config.js | 4 - packages/kbn-plugin-generator/README.md | 4 - packages/kbn-plugin-helpers/README.md | 1 - packages/kbn-plugin-helpers/src/cli.ts | 19 - packages/kbn-plugin-helpers/src/lib/tasks.ts | 6 - .../src/tasks/test/all/README.md | 3 - .../src/tasks/test/all/index.ts | 20 - .../src/tasks/test/all/test_all_task.ts | 25 - .../src/tasks/test/karma/README.md | 60 -- .../src/tasks/test/karma/index.ts | 20 - .../src/tasks/test/karma/test_karma_task.ts | 42 -- .../__fixtures__/index.ts | 1 - .../__fixtures__/karma_report.xml | 33 - .../add_messages_to_report.test.ts | 84 +-- .../get_failures.test.ts | 27 +- .../report_metadata.test.ts | 5 +- packages/kbn-ui-shared-deps/theme.ts | 2 +- src/core/MIGRATION.md | 8 - src/core/public/legacy/legacy_service.ts | 2 +- src/core/server/http/http_config.ts | 16 +- src/dev/build/tasks/copy_source_task.ts | 1 - src/dev/jest/config.js | 1 - src/dev/precommit_hook/casing_check_config.js | 1 - .../tests_bundle/find_source_files.js | 64 -- src/legacy/core_plugins/tests_bundle/index.js | 180 ----- .../core_plugins/tests_bundle/package.json | 4 - .../tests_bundle/public/index.scss | 4 - .../tests_bundle/tests_entry_template.js | 158 ----- .../webpackShims/angular-mocks.js | 21 - src/legacy/ui/public/test_harness/.eslintrc | 2 - src/legacy/ui/public/test_harness/index.js | 20 - .../ui/public/test_harness/test_harness.css | 22 - .../ui/public/test_harness/test_harness.js | 89 --- .../test_sharding/find_test_bundle_url.js | 39 -- .../test_sharding/get_shard_num.js | 47 -- .../get_sharding_params_from_url.js | 45 -- .../test_harness/test_sharding/index.js | 20 - .../test_sharding/setup_test_sharding.js | 69 -- .../setup_top_level_describe_filter.js | 125 ---- .../ui/ui_exports/ui_export_defaults.js | 1 - tasks/config/karma.js | 207 ------ tasks/config/run.js | 72 +- tasks/jenkins.js | 1 - tasks/test.js | 27 +- test/scripts/jenkins_xpack.sh | 6 +- x-pack/README.md | 8 - x-pack/gulpfile.js | 4 - x-pack/package.json | 2 - x-pack/plugins/canvas/scripts/test_browser.js | 7 - x-pack/plugins/canvas/scripts/test_dev.js | 7 - x-pack/tasks/test.ts | 31 - yarn.lock | 629 ++---------------- 55 files changed, 76 insertions(+), 2266 deletions(-) delete mode 100644 packages/kbn-plugin-helpers/src/tasks/test/all/README.md delete mode 100644 packages/kbn-plugin-helpers/src/tasks/test/all/index.ts delete mode 100644 packages/kbn-plugin-helpers/src/tasks/test/all/test_all_task.ts delete mode 100644 packages/kbn-plugin-helpers/src/tasks/test/karma/README.md delete mode 100644 packages/kbn-plugin-helpers/src/tasks/test/karma/index.ts delete mode 100644 packages/kbn-plugin-helpers/src/tasks/test/karma/test_karma_task.ts delete mode 100644 packages/kbn-test/src/failed_tests_reporter/__fixtures__/karma_report.xml delete mode 100644 src/legacy/core_plugins/tests_bundle/find_source_files.js delete mode 100644 src/legacy/core_plugins/tests_bundle/index.js delete mode 100644 src/legacy/core_plugins/tests_bundle/package.json delete mode 100644 src/legacy/core_plugins/tests_bundle/public/index.scss delete mode 100644 src/legacy/core_plugins/tests_bundle/tests_entry_template.js delete mode 100644 src/legacy/core_plugins/tests_bundle/webpackShims/angular-mocks.js delete mode 100644 src/legacy/ui/public/test_harness/.eslintrc delete mode 100644 src/legacy/ui/public/test_harness/index.js delete mode 100644 src/legacy/ui/public/test_harness/test_harness.css delete mode 100644 src/legacy/ui/public/test_harness/test_harness.js delete mode 100644 src/legacy/ui/public/test_harness/test_sharding/find_test_bundle_url.js delete mode 100644 src/legacy/ui/public/test_harness/test_sharding/get_shard_num.js delete mode 100644 src/legacy/ui/public/test_harness/test_sharding/get_sharding_params_from_url.js delete mode 100644 src/legacy/ui/public/test_harness/test_sharding/index.js delete mode 100644 src/legacy/ui/public/test_harness/test_sharding/setup_test_sharding.js delete mode 100644 src/legacy/ui/public/test_harness/test_sharding/setup_top_level_describe_filter.js delete mode 100644 tasks/config/karma.js delete mode 100644 x-pack/plugins/canvas/scripts/test_browser.js delete mode 100644 x-pack/plugins/canvas/scripts/test_dev.js delete mode 100644 x-pack/tasks/test.ts diff --git a/docs/developer/contributing/development-tests.asciidoc b/docs/developer/contributing/development-tests.asciidoc index 78a2a90b69ce5..2e40f664faba9 100644 --- a/docs/developer/contributing/development-tests.asciidoc +++ b/docs/developer/contributing/development-tests.asciidoc @@ -26,8 +26,6 @@ root) |Functional |`test/*integration/**/config.js` `test/*functional/**/config.js` `test/accessibility/config.js` |`yarn test:ftr:server --config test/[directory]/config.js``yarn test:ftr:runner --config test/[directory]/config.js --grep=regexp` - -|Karma |`src/**/public/__tests__/*.js` |`yarn test:karma:debug` |=== For X-Pack tests located in `x-pack/` see diff --git a/docs/developer/contributing/development-unit-tests.asciidoc b/docs/developer/contributing/development-unit-tests.asciidoc index 8b4954150bb5b..5322106b17ac1 100644 --- a/docs/developer/contributing/development-unit-tests.asciidoc +++ b/docs/developer/contributing/development-unit-tests.asciidoc @@ -95,38 +95,6 @@ to proceed in this mode. node scripts/mocha --debug ---- -With `yarn test:karma`, you can run only the browser tests. Coverage -reports are available for browser tests by running -`yarn test:coverage`. You can find the results under the `coverage/` -directory that will be created upon completion. - -[source,bash] ----- -yarn test:karma ----- - -Using `yarn test:karma:debug` initializes an environment for debugging -the browser tests. Includes an dedicated instance of the {kib} server -for building the test bundle, and a karma server. When running this task -the build is optimized for the first time and then a karma-owned -instance of the browser is opened. Click the "`debug`" button to open a -new tab that executes the unit tests. - -[source,bash] ----- -yarn test:karma:debug ----- - -In the screenshot below, you’ll notice the URL is -`localhost:9876/debug.html`. You can append a `grep` query parameter -to this URL and set it to a string value which will be used to exclude -tests which don’t match. For example, if you changed the URL to -`localhost:9876/debug.html?query=my test` and then refreshed the -browser, you’d only see tests run which contain "`my test`" in the test -description. - -image:http://i.imgur.com/DwHxgfq.png[Browser test debugging] - [discrete] === Unit Testing Plugins @@ -141,5 +109,4 @@ command from your plugin: [source,bash] ---- yarn test:mocha -yarn test:karma:debug # remove the debug flag to run them once and close ---- \ No newline at end of file diff --git a/package.json b/package.json index ee91c59a8fda6..0c49ec26be194 100644 --- a/package.json +++ b/package.json @@ -41,8 +41,6 @@ "kbn": "node scripts/kbn", "es": "node scripts/es", "test": "grunt test", - "test:karma": "grunt test:karma", - "test:karma:debug": "grunt test:karmaDebug", "test:jest": "node scripts/jest", "test:jest_integration": "node scripts/jest_integration", "test:mocha": "node scripts/mocha", @@ -447,7 +445,6 @@ "grunt-available-tasks": "^0.6.3", "grunt-cli": "^1.2.0", "grunt-contrib-watch": "^1.1.0", - "grunt-karma": "^3.0.2", "grunt-peg": "^2.0.1", "grunt-run": "0.8.1", "gulp-babel": "^8.0.0", @@ -465,14 +462,6 @@ "jest-raw-loader": "^1.0.1", "jimp": "^0.9.6", "json5": "^1.0.1", - "karma": "5.0.2", - "karma-chrome-launcher": "2.2.0", - "karma-coverage": "1.1.2", - "karma-firefox-launcher": "1.1.0", - "karma-ie-launcher": "1.0.0", - "karma-junit-reporter": "1.2.0", - "karma-mocha": "2.0.0", - "karma-safari-launcher": "1.0.0", "license-checker": "^16.0.0", "listr": "^0.14.1", "load-grunt-config": "^3.0.1", diff --git a/packages/kbn-eslint-import-resolver-kibana/lib/get_webpack_config.js b/packages/kbn-eslint-import-resolver-kibana/lib/get_webpack_config.js index 6cb2f3d2901d3..baf5baaf916aa 100755 --- a/packages/kbn-eslint-import-resolver-kibana/lib/get_webpack_config.js +++ b/packages/kbn-eslint-import-resolver-kibana/lib/get_webpack_config.js @@ -28,13 +28,9 @@ exports.getWebpackConfig = function (kibanaPath, projectRoot, config) { const alias = { // Kibana defaults https://github.com/elastic/kibana/blob/6998f074542e8c7b32955db159d15661aca253d7/src/legacy/ui/ui_bundler_env.js#L30-L36 ui: fromKibana('src/legacy/ui/public'), - test_harness: fromKibana('src/test_harness/public'), // Dev defaults for test bundle https://github.com/elastic/kibana/blob/6998f074542e8c7b32955db159d15661aca253d7/src/core_plugins/tests_bundle/index.js#L73-L78 ng_mock$: fromKibana('src/test_utils/public/ng_mock'), - 'angular-mocks$': fromKibana( - 'src/legacy/core_plugins/tests_bundle/webpackShims/angular-mocks.js' - ), fixtures: fromKibana('src/fixtures'), test_utils: fromKibana('src/test_utils/public'), }; diff --git a/packages/kbn-plugin-generator/README.md b/packages/kbn-plugin-generator/README.md index 95de0e93fd075..6ad665f9b87f8 100644 --- a/packages/kbn-plugin-generator/README.md +++ b/packages/kbn-plugin-generator/README.md @@ -71,10 +71,6 @@ Generated plugins receive a handful of scripts that can be used during developme Build a distributable archive of your plugin. - - `yarn test:karma` - - Run the browser tests in a real web browser. - - `yarn test:mocha` Run the server tests using mocha. diff --git a/packages/kbn-plugin-helpers/README.md b/packages/kbn-plugin-helpers/README.md index 4c648fd9bde8c..d7ed3106c1ceb 100644 --- a/packages/kbn-plugin-helpers/README.md +++ b/packages/kbn-plugin-helpers/README.md @@ -30,7 +30,6 @@ $ plugin-helpers help start Start kibana and have it include this plugin build [options] [files...] Build a distributable archive test Run the server and browser tests - test:karma [options] Run the browser tests in a real web browser test:mocha [files...] Run the server tests using mocha Options: diff --git a/packages/kbn-plugin-helpers/src/cli.ts b/packages/kbn-plugin-helpers/src/cli.ts index b894f854a484f..18ddc62cba8a6 100644 --- a/packages/kbn-plugin-helpers/src/cli.ts +++ b/packages/kbn-plugin-helpers/src/cli.ts @@ -62,25 +62,6 @@ program })) ); -program - .command('test') - .description('Run the server and browser tests') - .on('--help', docs('test/all')) - .action(createCommanderAction('testAll')); - -program - .command('test:karma') - .description('Run the browser tests in a real web browser') - .option('--dev', 'Enable dev mode, keeps the test server running') - .option('-p, --plugins ', "Manually specify which plugins' test bundles to run") - .on('--help', docs('test/karma')) - .action( - createCommanderAction('testKarma', (command) => ({ - dev: Boolean(command.dev), - plugins: command.plugins, - })) - ); - program .command('test:mocha [files...]') .description('Run the server tests using mocha') diff --git a/packages/kbn-plugin-helpers/src/lib/tasks.ts b/packages/kbn-plugin-helpers/src/lib/tasks.ts index 7817838760a2e..bd86bb670ff39 100644 --- a/packages/kbn-plugin-helpers/src/lib/tasks.ts +++ b/packages/kbn-plugin-helpers/src/lib/tasks.ts @@ -19,23 +19,17 @@ import { buildTask } from '../tasks/build'; import { startTask } from '../tasks/start'; -import { testAllTask } from '../tasks/test/all'; -import { testKarmaTask } from '../tasks/test/karma'; import { testMochaTask } from '../tasks/test/mocha'; // define a tasks interface that we can extend in the tests export interface Tasks { build: typeof buildTask; start: typeof startTask; - testAll: typeof testAllTask; - testKarma: typeof testKarmaTask; testMocha: typeof testMochaTask; } export const tasks: Tasks = { build: buildTask, start: startTask, - testAll: testAllTask, - testKarma: testKarmaTask, testMocha: testMochaTask, }; diff --git a/packages/kbn-plugin-helpers/src/tasks/test/all/README.md b/packages/kbn-plugin-helpers/src/tasks/test/all/README.md deleted file mode 100644 index 4f5a72ac0d523..0000000000000 --- a/packages/kbn-plugin-helpers/src/tasks/test/all/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Runs both the mocha and karma tests, in that order. - -This is just a simple caller to both `test/mocha` and `test/karma` \ No newline at end of file diff --git a/packages/kbn-plugin-helpers/src/tasks/test/all/index.ts b/packages/kbn-plugin-helpers/src/tasks/test/all/index.ts deleted file mode 100644 index be8db50825fc9..0000000000000 --- a/packages/kbn-plugin-helpers/src/tasks/test/all/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -export * from './test_all_task'; diff --git a/packages/kbn-plugin-helpers/src/tasks/test/all/test_all_task.ts b/packages/kbn-plugin-helpers/src/tasks/test/all/test_all_task.ts deleted file mode 100644 index d07c19291d2cb..0000000000000 --- a/packages/kbn-plugin-helpers/src/tasks/test/all/test_all_task.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { TaskContext } from '../../../lib'; - -export function testAllTask({ run }: TaskContext) { - run('testMocha'); - run('testKarma'); -} diff --git a/packages/kbn-plugin-helpers/src/tasks/test/karma/README.md b/packages/kbn-plugin-helpers/src/tasks/test/karma/README.md deleted file mode 100644 index 8d921e8312344..0000000000000 --- a/packages/kbn-plugin-helpers/src/tasks/test/karma/README.md +++ /dev/null @@ -1,60 +0,0 @@ -writing tests -============= - -Browser tests are written just like server tests, they are just executed differently. - - - place tests near the code they test, in `__tests__` directories throughout - the public directory - - - Use the same bdd-style `describe()` and `it()` - api to define the suites and cases of your tests. - - ```js - describe('some portion of your code', function () { - it('should do this thing', function () { - expect(true).to.be(false); - }); - }); - ``` - - -starting the test runner -======================== - -Under the covers this command uses the `test:karma` task from kibana. This will execute -your tasks once and exit when complete. - -When run with the `--dev` option, the command uses the `test:karma:debug` task from kibana. -This task sets-up a test runner that will watch your code for changes and rebuild your -tests when necessary. You access the test runner through a browser that it starts itself -(via Karma). - -If your plugin consists of a number of internal plugins, you may wish to keep the tests -isolated to a specific plugin or plugins, instead of executing all of the tests. To do this, -use `--plugins` and passing the plugins you would like to test. Multiple plugins can be -specified by separating them with commas. - - -running the tests -================= - -Once the test runner has started you a new browser window should be opened and you should -see a message saying "connected". Next to that is a "DEBUG" button. This button will open -an interactive version of your tests that you can refresh, inspects, and otherwise debug -while you write your tests. - - -focus on the task at hand -========================= - -To limit the tests that run you can either: - - 1. use the ?grep= query string to filter the test cases/suites by name - 2. Click the suite title or (play) button next to test output - 3. Add `.only` to your `describe()` or `it()` calls: - - ```js - describe.only('suite name', function () { - // ... - }); - ``` diff --git a/packages/kbn-plugin-helpers/src/tasks/test/karma/index.ts b/packages/kbn-plugin-helpers/src/tasks/test/karma/index.ts deleted file mode 100644 index 3089357b49991..0000000000000 --- a/packages/kbn-plugin-helpers/src/tasks/test/karma/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -export * from './test_karma_task'; diff --git a/packages/kbn-plugin-helpers/src/tasks/test/karma/test_karma_task.ts b/packages/kbn-plugin-helpers/src/tasks/test/karma/test_karma_task.ts deleted file mode 100644 index 2fe8134209894..0000000000000 --- a/packages/kbn-plugin-helpers/src/tasks/test/karma/test_karma_task.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { execFileSync } from 'child_process'; - -import { TaskContext } from '../../../lib'; -import { winCmd } from '../../../lib/win_cmd'; - -export function testKarmaTask({ plugin, options }: TaskContext) { - options = options || {}; - - const kbnServerArgs = ['--kbnServer.plugin-path=' + plugin.root]; - - if (options.plugins) { - kbnServerArgs.push('--kbnServer.tests_bundle.pluginId=' + options.plugins); - } else { - kbnServerArgs.push('--kbnServer.tests_bundle.pluginId=' + plugin.id); - } - - const task = options.dev ? 'test:karma:debug' : 'test:karma'; - const args = [task].concat(kbnServerArgs); - execFileSync(winCmd('yarn'), args, { - cwd: plugin.kibanaRoot, - stdio: ['ignore', 1, 2], - }); -} diff --git a/packages/kbn-test/src/failed_tests_reporter/__fixtures__/index.ts b/packages/kbn-test/src/failed_tests_reporter/__fixtures__/index.ts index 16ebe10ad5426..11d6cb6a2b47b 100644 --- a/packages/kbn-test/src/failed_tests_reporter/__fixtures__/index.ts +++ b/packages/kbn-test/src/failed_tests_reporter/__fixtures__/index.ts @@ -21,6 +21,5 @@ const Fs = jest.requireActual('fs'); export const FTR_REPORT = Fs.readFileSync(require.resolve('./ftr_report.xml'), 'utf8'); export const JEST_REPORT = Fs.readFileSync(require.resolve('./jest_report.xml'), 'utf8'); -export const KARMA_REPORT = Fs.readFileSync(require.resolve('./karma_report.xml'), 'utf8'); export const MOCHA_REPORT = Fs.readFileSync(require.resolve('./mocha_report.xml'), 'utf8'); export const CYPRESS_REPORT = Fs.readFileSync(require.resolve('./cypress_report.xml'), 'utf8'); diff --git a/packages/kbn-test/src/failed_tests_reporter/__fixtures__/karma_report.xml b/packages/kbn-test/src/failed_tests_reporter/__fixtures__/karma_report.xml deleted file mode 100644 index 5c4bdb9f50adf..0000000000000 --- a/packages/kbn-test/src/failed_tests_reporter/__fixtures__/karma_report.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - Error: expected 7069 to be below 64 - at Assertion.__kbnBundles__.tests../packages/kbn-expect/expect.js.Assertion.assert (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:13671:11) - at Assertion.__kbnBundles__.tests../packages/kbn-expect/expect.js.Assertion.lessThan.Assertion.below (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:13891:8) - at Function.lessThan (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:14078:15) - at _callee3$ (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:158985:60) - at tryCatch (webpack://%5Bname%5D/./node_modules/regenerator-runtime/runtime.js?:62:40) - at Generator.invoke [as _invoke] (webpack://%5Bname%5D/./node_modules/regenerator-runtime/runtime.js?:288:22) - at Generator.prototype.<computed> [as next] (webpack://%5Bname%5D/./node_modules/regenerator-runtime/runtime.js?:114:21) - at asyncGeneratorStep (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:158772:103) - at _next (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:158774:194) - - - - - - - - - diff --git a/packages/kbn-test/src/failed_tests_reporter/add_messages_to_report.test.ts b/packages/kbn-test/src/failed_tests_reporter/add_messages_to_report.test.ts index 53a74f6cc6af2..505e898c62adf 100644 --- a/packages/kbn-test/src/failed_tests_reporter/add_messages_to_report.test.ts +++ b/packages/kbn-test/src/failed_tests_reporter/add_messages_to_report.test.ts @@ -39,13 +39,7 @@ jest.mock('fs', () => { }; }); -import { - FTR_REPORT, - JEST_REPORT, - MOCHA_REPORT, - KARMA_REPORT, - CYPRESS_REPORT, -} from './__fixtures__'; +import { FTR_REPORT, JEST_REPORT, MOCHA_REPORT, CYPRESS_REPORT } from './__fixtures__'; import { parseTestReport } from './test_report'; import { addMessagesToReport } from './add_messages_to_report'; @@ -338,79 +332,3 @@ it('rewrites cypress reports with minimal changes', async () => { `); }); - -it('rewrites karma reports with minimal changes', async () => { - const xml = await addMessagesToReport({ - report: await parseTestReport(KARMA_REPORT), - messages: [ - { - name: - 'CoordinateMapsVisualizationTest CoordinateMapsVisualization - basics should initialize OK', - classname: 'Browser Unit Tests.CoordinateMapsVisualizationTest', - message: 'foo bar', - }, - ], - log, - reportPath: Path.resolve(__dirname, './__fixtures__/karma_report.xml'), - }); - - expect(createPatch('karma.xml', KARMA_REPORT, xml, { context: 0 })).toMatchInlineSnapshot(` - Index: karma.xml - =================================================================== - --- karma.xml [object Object] - +++ karma.xml - @@ -1,5 +1,5 @@ - -‹?xml version="1.0"?› - +‹?xml version="1.0" encoding="utf-8"?› - ‹testsuite name="Chrome 75.0.3770 (Mac OS X 10.14.5)" package="" timestamp="2019-07-02T19:53:21" id="0" hostname="spalger.lan" tests="648" errors="0" failures="4" time="1.759"› - ‹properties› - ‹property name="browser.fullName" value="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"/› - ‹/properties› - @@ -7,27 +7,31 @@ - ‹testcase name="Vis-Editor-Agg-Params plugin directive should hide custom label parameter" time="0" classname="Browser Unit Tests.Vis-Editor-Agg-Params plugin directive"› - ‹skipped/› - ‹/testcase› - ‹testcase name="CoordinateMapsVisualizationTest CoordinateMapsVisualization - basics should initialize OK" time="0.265" classname="Browser Unit Tests.CoordinateMapsVisualizationTest"› - - ‹failure type=""›Error: expected 7069 to be below 64 - - at Assertion.__kbnBundles__.tests../packages/kbn-expect/expect.js.Assertion.assert (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:13671:11) - - at Assertion.__kbnBundles__.tests../packages/kbn-expect/expect.js.Assertion.lessThan.Assertion.below (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:13891:8) - - at Function.lessThan (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:14078:15) - - at _callee3$ (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:158985:60) - + ‹failure type=""›‹![CDATA[Error: expected 7069 to be below 64 - + at Assertion.__kbnBundles__.tests../packages/kbn-expect/expect.js.Assertion.assert (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:13671:11) - + at Assertion.__kbnBundles__.tests../packages/kbn-expect/expect.js.Assertion.lessThan.Assertion.below (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:13891:8) - + at Function.lessThan (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:14078:15) - + at _callee3$ (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:158985:60) - at tryCatch (webpack://%5Bname%5D/./node_modules/regenerator-runtime/runtime.js?:62:40) - at Generator.invoke [as _invoke] (webpack://%5Bname%5D/./node_modules/regenerator-runtime/runtime.js?:288:22) - - at Generator.prototype.<computed> [as next] (webpack://%5Bname%5D/./node_modules/regenerator-runtime/runtime.js?:114:21) - - at asyncGeneratorStep (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:158772:103) - - at _next (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:158774:194) - -‹/failure› - + at Generator.prototype.‹computed› [as next] (webpack://%5Bname%5D/./node_modules/regenerator-runtime/runtime.js?:114:21) - + at asyncGeneratorStep (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:158772:103) - + at _next (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:158774:194) - +]]›‹/failure› - + ‹system-out›Failed Tests Reporter: - + - foo bar - + - +‹/system-out› - ‹/testcase› - ‹testcase name="CoordinateMapsVisualizationTest CoordinateMapsVisualization - basics should toggle to Heatmap OK" time="0.055" classname="Browser Unit Tests.CoordinateMapsVisualizationTest"/› - ‹testcase name="VegaParser._parseSchema should warn on vega-lite version too new to be supported" time="0.001" classname="Browser Unit Tests.VegaParser·_parseSchema"/› - ‹system-out› - - ‹![CDATA[Chrome 75.0.3770 (Mac OS X 10.14.5) LOG: 'ready to load tests for shard 1 of 4' - + Chrome 75.0.3770 (Mac OS X 10.14.5) LOG: 'ready to load tests for shard 1 of 4' - ,Chrome 75.0.3770 (Mac OS X 10.14.5) WARN: 'Unmatched GET to http://localhost:9876/api/interpreter/fns' - ... - - -]]› - + - ‹/system-out› - ‹system-err/› - -‹/testsuite› - +‹/testsuite› - \\ No newline at end of file - - `); -}); diff --git a/packages/kbn-test/src/failed_tests_reporter/get_failures.test.ts b/packages/kbn-test/src/failed_tests_reporter/get_failures.test.ts index 23d9805727f32..f570ed36111b3 100644 --- a/packages/kbn-test/src/failed_tests_reporter/get_failures.test.ts +++ b/packages/kbn-test/src/failed_tests_reporter/get_failures.test.ts @@ -19,7 +19,7 @@ import { getFailures } from './get_failures'; import { parseTestReport } from './test_report'; -import { FTR_REPORT, JEST_REPORT, KARMA_REPORT, MOCHA_REPORT } from './__fixtures__'; +import { FTR_REPORT, JEST_REPORT, MOCHA_REPORT } from './__fixtures__'; it('discovers failures in ftr report', async () => { const failures = getFailures(await parseTestReport(FTR_REPORT)); @@ -85,31 +85,6 @@ it('discovers failures in jest report', async () => { `); }); -it('discovers failures in karma report', async () => { - const failures = getFailures(await parseTestReport(KARMA_REPORT)); - expect(failures).toMatchInlineSnapshot(` - Array [ - Object { - "classname": "Browser Unit Tests.CoordinateMapsVisualizationTest", - "failure": "Error: expected 7069 to be below 64 - at Assertion.__kbnBundles__.tests../packages/kbn-expect/expect.js.Assertion.assert (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:13671:11) - at Assertion.__kbnBundles__.tests../packages/kbn-expect/expect.js.Assertion.lessThan.Assertion.below (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:13891:8) - at Function.lessThan (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:14078:15) - at _callee3$ (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:158985:60) - at tryCatch (webpack://%5Bname%5D/./node_modules/regenerator-runtime/runtime.js?:62:40) - at Generator.invoke [as _invoke] (webpack://%5Bname%5D/./node_modules/regenerator-runtime/runtime.js?:288:22) - at Generator.prototype. [as next] (webpack://%5Bname%5D/./node_modules/regenerator-runtime/runtime.js?:114:21) - at asyncGeneratorStep (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:158772:103) - at _next (http://localhost:5610/bundles/tests.bundle.js?shards=4&shard_num=1:158774:194) - ", - "likelyIrrelevant": false, - "name": "CoordinateMapsVisualizationTest CoordinateMapsVisualization - basics should initialize OK", - "time": "0.265", - }, - ] - `); -}); - it('discovers failures in mocha report', async () => { const failures = getFailures(await parseTestReport(MOCHA_REPORT)); expect(failures).toMatchInlineSnapshot(` diff --git a/packages/kbn-test/src/failed_tests_reporter/report_metadata.test.ts b/packages/kbn-test/src/failed_tests_reporter/report_metadata.test.ts index 729d80ddfcb44..c079084965609 100644 --- a/packages/kbn-test/src/failed_tests_reporter/report_metadata.test.ts +++ b/packages/kbn-test/src/failed_tests_reporter/report_metadata.test.ts @@ -19,7 +19,7 @@ import { getReportMessageIter } from './report_metadata'; import { parseTestReport } from './test_report'; -import { FTR_REPORT, JEST_REPORT, KARMA_REPORT, MOCHA_REPORT } from './__fixtures__'; +import { FTR_REPORT, JEST_REPORT, MOCHA_REPORT } from './__fixtures__'; it('reads messages and screenshots from metadata-json properties', async () => { const ftrReport = await parseTestReport(FTR_REPORT); @@ -43,7 +43,4 @@ it('reads messages and screenshots from metadata-json properties', async () => { const mochaReport = await parseTestReport(MOCHA_REPORT); expect(Array.from(getReportMessageIter(mochaReport))).toMatchInlineSnapshot(`Array []`); - - const karmaReport = await parseTestReport(KARMA_REPORT); - expect(Array.from(getReportMessageIter(karmaReport))).toMatchInlineSnapshot(`Array []`); }); diff --git a/packages/kbn-ui-shared-deps/theme.ts b/packages/kbn-ui-shared-deps/theme.ts index 4b2758516fc26..a810e1de0a21f 100644 --- a/packages/kbn-ui-shared-deps/theme.ts +++ b/packages/kbn-ui-shared-deps/theme.ts @@ -24,7 +24,7 @@ const globals: any = typeof window === 'undefined' ? {} : window; export type Theme = typeof LightTheme; // in the Kibana app we can rely on this global being defined, but in -// some cases (like jest, or karma tests) the global is undefined +// some cases (like jest) the global is undefined export const tag: string = globals.__kbnThemeTag__ || 'v7light'; export const version = tag.startsWith('v7') ? 7 : 8; export const darkMode = tag.endsWith('dark'); diff --git a/src/core/MIGRATION.md b/src/core/MIGRATION.md index f7acff14915a7..72945597758e2 100644 --- a/src/core/MIGRATION.md +++ b/src/core/MIGRATION.md @@ -1620,14 +1620,6 @@ If others are consuming your plugin's new platform contracts via the `ui/new_pla > Note: The `ui/new_platform` mock is only designed for use by old Jest tests. If you are writing new tests, you should structure your code and tests such that you don't need this mock. Instead, you should import the `core` mock directly and instantiate it. -#### What about karma tests? - -While our plan is to only provide first-class mocks for Jest tests, there are many legacy karma tests that cannot be quickly or easily converted to Jest -- particularly those which are still relying on mocking Angular services via `ngMock`. - -For these tests, we are maintaining a separate set of mocks. Files with a `.karma_mock.{js|ts|tsx}` extension will be loaded _globally_ before karma tests are run. - -It is important to note that this behavior is different from `jest.mock('ui/new_platform')`, which only mocks tests on an individual basis. If you encounter any failures in karma tests as a result of new platform migration efforts, you may need to add a `.karma_mock.js` file for the affected services, or add to the existing karma mock we are maintaining in `ui/new_platform`. - ### Provide Legacy Platform API to the New platform plugin #### On the server side diff --git a/src/core/public/legacy/legacy_service.ts b/src/core/public/legacy/legacy_service.ts index d77676b350f93..78a9219f3d694 100644 --- a/src/core/public/legacy/legacy_service.ts +++ b/src/core/public/legacy/legacy_service.ts @@ -53,7 +53,7 @@ interface BootstrapModule { * The LegacyPlatformService is responsible for initializing * the legacy platform by injecting parts of the new platform * services into the legacy platform modules, like ui/modules, - * and then bootstrapping the ui/chrome or ui/test_harness to + * and then bootstrapping the ui/chrome or ~~ui/test_harness~~ to * setup either the app or browser tests. */ export class LegacyPlatformService { diff --git a/src/core/server/http/http_config.ts b/src/core/server/http/http_config.ts index 83a2e712b424f..e74f6d32e92b0 100644 --- a/src/core/server/http/http_config.ts +++ b/src/core/server/http/http_config.ts @@ -42,21 +42,7 @@ export const config = { validate: match(validBasePathRegex, "must start with a slash, don't end with one"), }) ), - cors: schema.conditional( - schema.contextRef('dev'), - true, - schema.object( - { - origin: schema.arrayOf(schema.string()), - }, - { - defaultValue: { - origin: ['*://localhost:9876'], // karma test server - }, - } - ), - schema.boolean({ defaultValue: false }) - ), + cors: schema.boolean({ defaultValue: false }), customResponseHeaders: schema.recordOf(schema.string(), schema.any(), { defaultValue: {}, }), diff --git a/src/dev/build/tasks/copy_source_task.ts b/src/dev/build/tasks/copy_source_task.ts index 221c9162bd2a9..c8489673b83af 100644 --- a/src/dev/build/tasks/copy_source_task.ts +++ b/src/dev/build/tasks/copy_source_task.ts @@ -33,7 +33,6 @@ export const CopySource: Task = { '!src/**/{__tests__,__snapshots__,__mocks__}/**', '!src/test_utils/**', '!src/fixtures/**', - '!src/legacy/core_plugins/tests_bundle/**', '!src/legacy/core_plugins/console/public/tests/**', '!src/cli/cluster/**', '!src/cli/repl/**', diff --git a/src/dev/jest/config.js b/src/dev/jest/config.js index e11668ab57f55..5249b7d652790 100644 --- a/src/dev/jest/config.js +++ b/src/dev/jest/config.js @@ -52,7 +52,6 @@ export default { '!packages/kbn-ui-framework/src/services/**/*/index.js', 'src/legacy/core_plugins/**/*.{js,mjs,jsx,ts,tsx}', '!src/legacy/core_plugins/**/{__test__,__snapshots__}/**/*', - '!src/legacy/core_plugins/tests_bundle/**', ], moduleNameMapper: { '@elastic/eui$': '/node_modules/@elastic/eui/test-env', diff --git a/src/dev/precommit_hook/casing_check_config.js b/src/dev/precommit_hook/casing_check_config.js index 1e4f048be8ea4..864bf7515053c 100644 --- a/src/dev/precommit_hook/casing_check_config.js +++ b/src/dev/precommit_hook/casing_check_config.js @@ -124,7 +124,6 @@ export const IGNORE_DIRECTORY_GLOBS = [ export const TEMPORARILY_IGNORED_PATHS = [ 'src/legacy/core_plugins/console/public/src/directives/helpExample.txt', 'src/legacy/core_plugins/console/public/src/sense_editor/theme-sense-dark.js', - 'src/legacy/core_plugins/tests_bundle/webpackShims/angular-mocks.js', 'src/legacy/core_plugins/tile_map/public/__tests__/scaledCircleMarkers.png', 'src/legacy/core_plugins/tile_map/public/__tests__/shadedCircleMarkers.png', 'src/legacy/core_plugins/tile_map/public/__tests__/shadedGeohashGrid.png', diff --git a/src/legacy/core_plugins/tests_bundle/find_source_files.js b/src/legacy/core_plugins/tests_bundle/find_source_files.js deleted file mode 100644 index eed88a5ecb8b0..0000000000000 --- a/src/legacy/core_plugins/tests_bundle/find_source_files.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { fromRoot } from '../../../core/server/utils'; -import { chain } from 'lodash'; -import { resolve } from 'path'; -import { fromNode } from 'bluebird'; -import glob from 'glob-all'; - -const findSourceFiles = async (patterns, cwd = fromRoot('.')) => { - patterns = [].concat(patterns || []); - - const matches = await fromNode((cb) => { - glob( - patterns, - { - cwd: cwd, - ignore: [ - 'node_modules/**/*', - 'bower_components/**/*', - '**/_*.js', - '**/*.test.js', - '**/*.test.mocks.js', - '**/__mocks__/**/*', - ], - symlinks: findSourceFiles.symlinks, - statCache: findSourceFiles.statCache, - realpathCache: findSourceFiles.realpathCache, - cache: findSourceFiles.cache, - }, - cb - ); - }); - - return chain(matches) - .flatten() - .uniq() - .map((match) => resolve(cwd, match)) - .value(); -}; - -findSourceFiles.symlinks = {}; -findSourceFiles.statCache = {}; -findSourceFiles.realpathCache = {}; -findSourceFiles.cache = {}; - -export default findSourceFiles; diff --git a/src/legacy/core_plugins/tests_bundle/index.js b/src/legacy/core_plugins/tests_bundle/index.js deleted file mode 100644 index da7c1c4f4527e..0000000000000 --- a/src/legacy/core_plugins/tests_bundle/index.js +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { createReadStream } from 'fs'; -import { resolve } from 'path'; - -import globby from 'globby'; -import MultiStream from 'multistream'; -import webpackMerge from 'webpack-merge'; - -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { fromRoot } from '../../../core/server/utils'; -import { replacePlaceholder } from '../../../optimize/public_path_placeholder'; -import findSourceFiles from './find_source_files'; -import { createTestEntryTemplate } from './tests_entry_template'; - -export default (kibana) => { - return new kibana.Plugin({ - config: (Joi) => { - return Joi.object({ - enabled: Joi.boolean().default(true), - instrument: Joi.boolean().default(false), - pluginId: Joi.string(), - }).default(); - }, - - uiExports: { - styleSheetPaths: resolve(__dirname, 'public/index.scss'), - async __bundleProvider__(kbnServer) { - const modules = new Set(); - - const { - config, - uiApps, - uiBundles, - plugins, - uiExports: { uiSettingDefaults = {} }, - } = kbnServer; - - const testGlobs = []; - - const testingPluginIds = config.get('tests_bundle.pluginId'); - - if (testingPluginIds) { - testingPluginIds.split(',').forEach((pluginId) => { - const plugin = plugins.find((plugin) => plugin.id === pluginId); - - if (!plugin) { - throw new Error('Invalid testingPluginId :: unknown plugin ' + pluginId); - } - - // add the modules from all of this plugins apps - for (const app of uiApps) { - if (app.getPluginId() === pluginId) { - modules.add(app.getMainModuleId()); - } - } - - testGlobs.push(`${plugin.publicDir}/**/__tests__/**/*.js`); - }); - } else { - // add all since we are not just focused on specific plugins - testGlobs.push('src/legacy/ui/public/**/*.js', '!src/legacy/ui/public/flot-charts/**/*'); - // add the modules from all of the apps - for (const app of uiApps) { - modules.add(app.getMainModuleId()); - } - - for (const plugin of plugins) { - testGlobs.push(`${plugin.publicDir}/**/__tests__/**/*.js`); - } - } - - const testFiles = await findSourceFiles(testGlobs); - for (const f of testFiles) modules.add(f); - - if (config.get('tests_bundle.instrument')) { - uiBundles.addPostLoader({ - test: /\.js$/, - exclude: /[\/\\](__tests__|node_modules|bower_components|webpackShims)[\/\\]/, - loader: 'istanbul-instrumenter-loader', - }); - } - - uiBundles.add({ - id: 'tests', - modules: [...modules], - template: createTestEntryTemplate(uiSettingDefaults), - extendConfig(webpackConfig) { - const mergedConfig = webpackMerge( - { - resolve: { - extensions: ['.karma_mock.js', '.karma_mock.tsx', '.karma_mock.ts'], - }, - node: { - fs: 'empty', - child_process: 'empty', - dns: 'empty', - net: 'empty', - tls: 'empty', - }, - }, - webpackConfig - ); - - /** - * [..] it removes the commons bundle creation from the webpack - * config when we're building the bundle for the browser tests. It - * shouldn't be created, and by default isn't, but something is - * triggering it in webpack which breaks the tests so if we just - * remove the optimization config it will never happen and the tests - * will keep working [..] - * - * TLDR: If you have any questions about this line, ask Spencer. - */ - delete mergedConfig.optimization.splitChunks.cacheGroups.commons; - - return mergedConfig; - }, - }); - - kbnServer.server.route({ - method: 'GET', - path: '/test_bundle/built_css.css', - async handler(_, h) { - const cssFiles = await globby( - testingPluginIds - ? testingPluginIds.split(',').map((id) => `built_assets/css/plugins/${id}/**/*.css`) - : `built_assets/css/**/*.css`, - { cwd: fromRoot('.'), absolute: true } - ); - - const stream = replacePlaceholder( - new MultiStream(cssFiles.map((path) => createReadStream(path))), - '/built_assets/css/' - ); - - return h.response(stream).code(200).type('text/css'); - }, - }); - - // Sets global variables normally set by the bootstrap.js script - kbnServer.server.route({ - path: '/test_bundle/karma/globals.js', - method: 'GET', - async handler(req, h) { - const basePath = config.get('server.basePath'); - - const file = `window.__kbnPublicPath__ = { 'kbn-ui-shared-deps': "${basePath}/bundles/kbn-ui-shared-deps/" };`; - - return h.response(file).header('content-type', 'application/json'); - }, - }); - }, - - __globalImportAliases__: { - ng_mock$: fromRoot('src/test_utils/public/ng_mock'), - 'angular-mocks$': require.resolve('./webpackShims/angular-mocks'), - fixtures: fromRoot('src/fixtures'), - test_utils: fromRoot('src/test_utils/public'), - }, - }, - }); -}; diff --git a/src/legacy/core_plugins/tests_bundle/package.json b/src/legacy/core_plugins/tests_bundle/package.json deleted file mode 100644 index 4d2df048d4164..0000000000000 --- a/src/legacy/core_plugins/tests_bundle/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "tests_bundle", - "version": "kibana" -} diff --git a/src/legacy/core_plugins/tests_bundle/public/index.scss b/src/legacy/core_plugins/tests_bundle/public/index.scss deleted file mode 100644 index d8dbf8d6dc885..0000000000000 --- a/src/legacy/core_plugins/tests_bundle/public/index.scss +++ /dev/null @@ -1,4 +0,0 @@ -// This file pulls some styles of NP plugins into the legacy test stylesheet -// so they are available for karma browser tests. -@import '../../../../plugins/vis_type_vislib/public/index'; -@import '../../../../plugins/visualizations/public/index'; diff --git a/src/legacy/core_plugins/tests_bundle/tests_entry_template.js b/src/legacy/core_plugins/tests_bundle/tests_entry_template.js deleted file mode 100644 index 28c26f08621eb..0000000000000 --- a/src/legacy/core_plugins/tests_bundle/tests_entry_template.js +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { Type } from '@kbn/config-schema'; -import pkg from '../../../../package.json'; - -export const createTestEntryTemplate = (defaultUiSettings) => (bundle) => ` -/** - * Test entry file - * - * This is programmatically created and updated, do not modify - * - * context: ${bundle.getContext()} - * - */ - -import fetchMock from 'fetch-mock/es5/client'; -import { CoreSystem } from '__kibanaCore__'; - -// Fake uiCapabilities returned to Core in browser tests -const uiCapabilities = { - navLinks: { - myLink: true, - notMyLink: true, - }, - discover: { - showWriteControls: true - }, - visualize: { - save: true - }, - dashboard: { - showWriteControls: true - }, - timelion: { - save: true - }, - management: { - kibana: { - settings: true, - index_patterns: true, - objects: true - } - } -}; - -// Mock fetch for CoreSystem calls. -fetchMock.config.fallbackToNetwork = true; -fetchMock.post(/\\/api\\/core\\/capabilities/, { - status: 200, - body: JSON.stringify(uiCapabilities), - headers: { 'Content-Type': 'application/json' }, -}); - -// render the core system in a element not attached to the document as the -// default children of the body in the browser tests are needed for mocha and -// other test components to work -const rootDomElement = document.createElement('div'); - -const coreSystem = new CoreSystem({ - injectedMetadata: { - version: '1.2.3', - buildNumber: 1234, - legacyMode: true, - legacyMetadata: { - app: { - id: 'karma', - title: 'Karma', - }, - nav: [], - version: '1.2.3', - buildNum: 1234, - devMode: true, - uiSettings: { - defaults: ${JSON.stringify( - defaultUiSettings, - (key, value) => { - if (value instanceof Type) return null; - return value; - }, - 2 - ) - .split('\n') - .join('\n ')}, - user: {} - }, - nav: [] - }, - csp: { - warnLegacyBrowsers: false, - }, - capabilities: uiCapabilities, - uiPlugins: [], - vars: { - kbnIndex: '.kibana', - esShardTimeout: 1500, - esApiVersion: ${JSON.stringify(pkg.branch)}, - esRequestTimeout: '300000', - tilemapsConfig: { - deprecated: { - isOverridden: false, - config: { - options: { - } - } - } - }, - regionmapsConfig: { - layers: [] - }, - mapConfig: { - includeElasticMapsService: true, - emsFileApiUrl: 'https://vector-staging.maps.elastic.co', - emsTileApiUrl: 'https://tiles.maps.elastic.co', - }, - vegaConfig: { - enabled: true, - enableExternalUrls: true - }, - }, - }, - rootDomElement, - requireLegacyBootstrapModule: () => { - // wrapped in NODE_ENV check so the 'ui/test_harness' module - // is not included in the distributable - if (process.env.IS_KIBANA_DISTRIBUTABLE !== 'true') { - return require('ui/test_harness'); - } - - throw new Error('tests bundle is not available in the distributable'); - }, - requireNewPlatformShimModule: () => require('ui/new_platform'), - requireLegacyFiles: () => { - ${bundle.getRequires().join('\n ')} - } -}) - -coreSystem - .setup() - .then(() => { - return coreSystem.start(); - }); -`; diff --git a/src/legacy/core_plugins/tests_bundle/webpackShims/angular-mocks.js b/src/legacy/core_plugins/tests_bundle/webpackShims/angular-mocks.js deleted file mode 100644 index 24f794cb32990..0000000000000 --- a/src/legacy/core_plugins/tests_bundle/webpackShims/angular-mocks.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -require('angular'); -require('../../../../../node_modules/angular-mocks/angular-mocks.js'); diff --git a/src/legacy/ui/public/test_harness/.eslintrc b/src/legacy/ui/public/test_harness/.eslintrc deleted file mode 100644 index b1b85968796dd..0000000000000 --- a/src/legacy/ui/public/test_harness/.eslintrc +++ /dev/null @@ -1,2 +0,0 @@ -rules: - no-console: 0 diff --git a/src/legacy/ui/public/test_harness/index.js b/src/legacy/ui/public/test_harness/index.js deleted file mode 100644 index d66a4b1d67214..0000000000000 --- a/src/legacy/ui/public/test_harness/index.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -export { bootstrap } from './test_harness'; diff --git a/src/legacy/ui/public/test_harness/test_harness.css b/src/legacy/ui/public/test_harness/test_harness.css deleted file mode 100644 index d0a0f50c55b9b..0000000000000 --- a/src/legacy/ui/public/test_harness/test_harness.css +++ /dev/null @@ -1,22 +0,0 @@ -/** - * This file is only for tests so it is it's own CSS - * to be imported directly by and only by this module. - */ - -body#test-harness-body { - /** - now that tests include the kibana styles, we have - to override the body { display: flex; } rule as it - prevents the visualizations from properly testing - their sizing - */ - display: block; -} - -body#test-harness-body #mocha-stats .progress { - /* bootstrap thinks it is the only one who will use ".progress" */ - height: auto; - background-color: transparent; - overflow: auto; - border-radius: 0; -} diff --git a/src/legacy/ui/public/test_harness/test_harness.js b/src/legacy/ui/public/test_harness/test_harness.js deleted file mode 100644 index 22c981fe0cf54..0000000000000 --- a/src/legacy/ui/public/test_harness/test_harness.js +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -// chrome expects to be loaded first, let it get its way -import chrome from '../chrome'; - -import { parse as parseUrl } from 'url'; -import { Subject } from 'rxjs'; -import sinon from 'sinon'; -import { metadata } from '../metadata'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { UiSettingsClient } from '../../../../core/public/ui_settings'; - -import './test_harness.css'; -import 'ng_mock'; -import { setupTestSharding } from './test_sharding'; - -const { query } = parseUrl(window.location.href, true); -if (query && query.mocha) { - try { - window.mocha.setup(JSON.parse(query.mocha)); - } catch (error) { - throw new Error( - `'?mocha=${query.mocha}' query string param provided but it could not be parsed as json` - ); - } -} - -setupTestSharding(); - -before(() => { - // prevent accidental ajax requests - sinon.useFakeXMLHttpRequest(); -}); - -let stubUiSettings; -let done$; -function createStubUiSettings() { - if (stubUiSettings) { - done$.complete(); - } - done$ = new Subject(); - - stubUiSettings = new UiSettingsClient({ - api: { - async batchSet() { - return { settings: stubUiSettings.getAll() }; - }, - }, - onUpdateError: () => {}, - defaults: metadata.uiSettings.defaults, - initialSettings: {}, - done$, - }); -} - -createStubUiSettings(); -sinon.stub(chrome, 'getUiSettingsClient').callsFake(() => stubUiSettings); - -afterEach(function () { - createStubUiSettings(); -}); - -// Kick off mocha, called at the end of test entry files -export function bootstrap(targetDomElement) { - // allows test_harness.less to have higher priority selectors - targetDomElement.setAttribute('id', 'test-harness-body'); - - // load the hacks since we aren't actually bootstrapping the - // chrome, which is where the hacks would normally be loaded - require('uiExports/hacks'); - chrome.setupAngular(); -} diff --git a/src/legacy/ui/public/test_harness/test_sharding/find_test_bundle_url.js b/src/legacy/ui/public/test_harness/test_sharding/find_test_bundle_url.js deleted file mode 100644 index 53800d08ca05b..0000000000000 --- a/src/legacy/ui/public/test_harness/test_sharding/find_test_bundle_url.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** - * We don't have a lot of options for passing arguments to the page that karma - * creates, so we tack some query string params onto the test bundle script url. - * - * This function finds that url by looking for a script tag that has - * the "/tests.bundle.js" segment - * - * @return {string} url - */ -export function findTestBundleUrl() { - const scriptTags = document.querySelectorAll('script[src]'); - const scriptUrls = [].map.call(scriptTags, (el) => el.getAttribute('src')); - const testBundleUrl = scriptUrls.find((url) => url.includes('/tests.bundle.js')); - - if (!testBundleUrl) { - throw new Error("test bundle url couldn't be found"); - } - - return testBundleUrl; -} diff --git a/src/legacy/ui/public/test_harness/test_sharding/get_shard_num.js b/src/legacy/ui/public/test_harness/test_sharding/get_shard_num.js deleted file mode 100644 index 55a33fc295191..0000000000000 --- a/src/legacy/ui/public/test_harness/test_sharding/get_shard_num.js +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import murmurHash3 from 'murmurhash3js'; - -// murmur hashes are 32bit unsigned integers -const MAX_HASH = Math.pow(2, 32); - -/** - * Determine the shard number for a suite by hashing - * its name and placing it based on the hash - * - * @param {number} shardTotal - the total number of shards - * @param {string} suiteName - the suite name to hash - * @return {number} shardNum - 1-based shard number - */ -export function getShardNum(shardTotal, suiteName) { - const hashIntsPerShard = MAX_HASH / shardTotal; - - const hashInt = murmurHash3.x86.hash32(suiteName); - - // murmur3 produces 32bit integers, so we devide it by the number of chunks - // to determine which chunk the suite should fall in. +1 because the current - // chunk is 1-based - const shardNum = Math.floor(hashInt / hashIntsPerShard) + 1; - - // It's not clear if hash32 can produce the MAX_HASH or not, - // but this just ensures that shard numbers don't go out of bounds - // and cause tests to be ignored unnecessarily - return Math.max(1, Math.min(shardNum, shardTotal)); -} diff --git a/src/legacy/ui/public/test_harness/test_sharding/get_sharding_params_from_url.js b/src/legacy/ui/public/test_harness/test_sharding/get_sharding_params_from_url.js deleted file mode 100644 index 65e41dbc84b63..0000000000000 --- a/src/legacy/ui/public/test_harness/test_sharding/get_sharding_params_from_url.js +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { parse as parseUrl } from 'url'; - -/** - * This function extracts the relevant "shards" and "shard_num" - * params from the url. - * - * @param {string} testBundleUrl - * @return {object} params - * @property {number} params.shards - the total number of shards - * @property {number} params.shard_num - the current shard number, 1 based - */ -export function getShardingParamsFromUrl(url) { - const parsedUrl = parseUrl(url, true); - const parsedQuery = parsedUrl.query || {}; - - const params = {}; - if (parsedQuery.shards) { - params.shards = parseInt(parsedQuery.shards, 10); - } - - if (parsedQuery.shard_num) { - params.shard_num = parseInt(parsedQuery.shard_num, 10); - } - - return params; -} diff --git a/src/legacy/ui/public/test_harness/test_sharding/index.js b/src/legacy/ui/public/test_harness/test_sharding/index.js deleted file mode 100644 index cdca50725a058..0000000000000 --- a/src/legacy/ui/public/test_harness/test_sharding/index.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -export { setupTestSharding } from './setup_test_sharding'; diff --git a/src/legacy/ui/public/test_harness/test_sharding/setup_test_sharding.js b/src/legacy/ui/public/test_harness/test_sharding/setup_test_sharding.js deleted file mode 100644 index fce1876162387..0000000000000 --- a/src/legacy/ui/public/test_harness/test_sharding/setup_test_sharding.js +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { uniq, defaults } from 'lodash'; - -import { findTestBundleUrl } from './find_test_bundle_url'; -import { getShardingParamsFromUrl } from './get_sharding_params_from_url'; -import { setupTopLevelDescribeFilter } from './setup_top_level_describe_filter'; -import { getShardNum } from './get_shard_num'; - -const DEFAULT_PARAMS = { - shards: 1, - shard_num: 1, -}; - -export function setupTestSharding() { - const pageUrl = window.location.href; - const bundleUrl = findTestBundleUrl(); - - // supports overriding params via the debug page - // url in dev mode - const params = defaults( - {}, - getShardingParamsFromUrl(pageUrl), - getShardingParamsFromUrl(bundleUrl), - DEFAULT_PARAMS - ); - - const { shards: shardTotal, shard_num: shardNum } = params; - if (shardNum < 1 || shardNum > shardTotal) { - throw new TypeError( - `shard_num param of ${shardNum} must be greater 0 and less than the total, ${shardTotal}` - ); - } - - // track and log the number of ignored describe calls - const ignoredDescribeShards = []; - before(() => { - const ignoredCount = ignoredDescribeShards.length; - const ignoredFrom = uniq(ignoredDescribeShards).join(', '); - console.log(`Ignored ${ignoredCount} top-level suites from ${ignoredFrom}`); - }); - - // Filter top-level describe statements as they come - setupTopLevelDescribeFilter((describeName) => { - const describeShardNum = getShardNum(shardTotal, describeName); - if (describeShardNum === shardNum) return true; - // track shard numbers that we ignore - ignoredDescribeShards.push(describeShardNum); - }); - - console.log(`ready to load tests for shard ${shardNum} of ${shardTotal}`); -} diff --git a/src/legacy/ui/public/test_harness/test_sharding/setup_top_level_describe_filter.js b/src/legacy/ui/public/test_harness/test_sharding/setup_top_level_describe_filter.js deleted file mode 100644 index 726f890077b94..0000000000000 --- a/src/legacy/ui/public/test_harness/test_sharding/setup_top_level_describe_filter.js +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** - * Intercept all calls to mocha.describe() and determine - * which calls make it through using a filter function. - * - * The filter function is also only called for top-level - * describe() calls; all describe calls nested within another - * are allowed based on the filter value for the parent - * describe - * - * ## example - * - * assume tests that look like this: - * - * ```js - * describe('section 1', () => { - * describe('item 1', () => { - * - * }) - * }) - * ``` - * - * If the filter function returned true for "section 1" then "item 1" - * would automatically be defined. If it returned false for "section 1" - * then "section 1" would be ignored and "item 1" would never be defined - * - * @param {function} test - a function that takes the first argument - * passed to describe, the sections name, and - * returns true if the describe call should - * be delegated to mocha, any other value causes - * the describe call to be ignored - * @return {undefined} - */ -export function setupTopLevelDescribeFilter(test) { - const originalDescribe = window.describe; - - if (!originalDescribe) { - throw new TypeError( - 'window.describe must be defined by mocha before test sharding can be setup' - ); - } - - /** - * When describe is called it is likely to make additional, nested, - * calls to describe. We track how deeply nested we are at any time - * with a depth counter, `describeCallDepth`. - * - * Before delegating a describe call to mocha we increment - * that counter, and once mocha is done we decrement it. - * - * This way, we can check if `describeCallDepth > 0` at any time - * to know if we are already within a describe call. - * - * ```js - * // +1 - * describe('section 1', () => { - * // describeCallDepth = 1 - * // +1 - * describe('item 1', () => { - * // describeCallDepth = 2 - * }) - * // -1 - * }) - * // -1 - * // describeCallDepth = 0 - * ``` - * - * @type {Number} - */ - let describeCallDepth = 0; - - const describeInterceptor = function (describeName, describeBody) { - const context = this; - - const isTopLevelCall = describeCallDepth === 0; - const shouldIgnore = isTopLevelCall && Boolean(test(describeName)) === false; - if (shouldIgnore) return; - - /** - * we wrap the delegation to mocha in a try/finally block - * to ensure that our describeCallDepth counter stays up - * to date even if the call throws an error. - * - * note that try/finally won't actually catch the error, it - * will continue to propagate up the call stack - */ - let result; - try { - describeCallDepth += 1; - result = originalDescribe.call(context, describeName, describeBody); - } finally { - describeCallDepth -= 1; - } - return result; - }; - - // to allow describe.only calls. we dont need interceptor as it will call describe internally - describeInterceptor.only = originalDescribe.only; - describeInterceptor.skip = originalDescribe.skip; - - // ensure that window.describe isn't messed with by other code - Object.defineProperty(window, 'describe', { - configurable: false, - enumerable: true, - value: describeInterceptor, - }); -} diff --git a/src/legacy/ui/ui_exports/ui_export_defaults.js b/src/legacy/ui/ui_exports/ui_export_defaults.js index f7ee9aa056762..348f4ee77fab4 100644 --- a/src/legacy/ui/ui_exports/ui_export_defaults.js +++ b/src/legacy/ui/ui_exports/ui_export_defaults.js @@ -30,7 +30,6 @@ export const UI_EXPORT_DEFAULTS = { webpackAliases: { ui: resolve(ROOT, 'src/legacy/ui/public'), __kibanaCore__$: resolve(ROOT, 'src/core/public'), - test_harness: resolve(ROOT, 'src/test_harness/public'), }, styleSheetPaths: ['light', 'dark'].map((theme) => ({ diff --git a/tasks/config/karma.js b/tasks/config/karma.js deleted file mode 100644 index 114e09876406c..0000000000000 --- a/tasks/config/karma.js +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { dirname } from 'path'; -import { times } from 'lodash'; -import { makeJunitReportPath } from '@kbn/test'; -import * as UiSharedDeps from '@kbn/ui-shared-deps'; - -const TOTAL_CI_SHARDS = 4; -const ROOT = dirname(require.resolve('../../package.json')); -const buildHash = String(Number.MAX_SAFE_INTEGER); - -module.exports = function (grunt) { - function pickBrowser() { - if (grunt.option('browser')) { - return grunt.option('browser'); - } - if (process.env.TEST_BROWSER_HEADLESS === '1') { - return 'Chrome_Headless'; - } - return 'Chrome'; - } - - function pickReporters() { - // available reporters: https://npmjs.org/browse/keyword/karma-reporter - if (process.env.CI && process.env.DISABLE_JUNIT_REPORTER) { - return ['dots']; - } - - if (process.env.CI) { - return ['dots', 'junit']; - } - - return ['progress']; - } - - function getKarmaFiles(shardNum) { - return [ - 'http://localhost:5610/test_bundle/built_css.css', - // Sets global variables normally set by the bootstrap.js script - 'http://localhost:5610/test_bundle/karma/globals.js', - - ...UiSharedDeps.jsDepFilenames.map( - (chunkFilename) => - `http://localhost:5610/${buildHash}/bundles/kbn-ui-shared-deps/${chunkFilename}` - ), - `http://localhost:5610/${buildHash}/bundles/kbn-ui-shared-deps/${UiSharedDeps.jsFilename}`, - - shardNum === undefined - ? `http://localhost:5610/${buildHash}/bundles/tests.bundle.js` - : `http://localhost:5610/${buildHash}/bundles/tests.bundle.js?shards=${TOTAL_CI_SHARDS}&shard_num=${shardNum}`, - - `http://localhost:5610/${buildHash}/bundles/kbn-ui-shared-deps/${UiSharedDeps.baseCssDistFilename}`, - // this causes tilemap tests to fail, probably because the eui styles haven't been - // included in the karma harness a long some time, if ever - // `http://localhost:5610/bundles/kbn-ui-shared-deps/${UiSharedDeps.lightCssDistFilename}`, - `http://localhost:5610/${buildHash}/bundles/tests.style.css`, - ]; - } - - const config = { - options: { - // base path that will be used to resolve all patterns (eg. files, exclude) - basePath: '', - - captureTimeout: 30000, - browserNoActivityTimeout: 120000, - frameworks: ['mocha'], - plugins: [ - 'karma-chrome-launcher', - 'karma-coverage', - 'karma-firefox-launcher', - 'karma-ie-launcher', - 'karma-junit-reporter', - 'karma-mocha', - 'karma-safari-launcher', - ], - port: 9876, - colors: true, - logLevel: grunt.option('debug') || grunt.option('verbose') ? 'DEBUG' : 'INFO', - autoWatch: false, - browsers: [pickBrowser()], - customLaunchers: { - Chrome_Headless: { - base: 'Chrome', - flags: ['--headless', '--disable-gpu', '--remote-debugging-port=9222'], - }, - }, - - reporters: pickReporters(), - - junitReporter: { - outputFile: makeJunitReportPath(ROOT, 'karma'), - useBrowserName: false, - nameFormatter: (_, result) => [...result.suite, result.description].join(' '), - classNameFormatter: (_, result) => { - const rootSuite = result.suite[0] || result.description; - return `Browser Unit Tests.${rootSuite.replace(/\./g, '·')}`; - }, - }, - - // list of files / patterns to load in the browser - files: getKarmaFiles(), - - proxies: { - '/tests/': 'http://localhost:5610/tests/', - '/test_bundle/': 'http://localhost:5610/test_bundle/', - [`/${buildHash}/bundles/`]: `http://localhost:5610/${buildHash}/bundles/`, - }, - - client: { - mocha: { - reporter: 'html', // change Karma's debug.html to the mocha web reporter - timeout: 10000, - slow: 5000, - }, - }, - }, - - dev: { singleRun: false }, - unit: { singleRun: true }, - coverage: { - singleRun: true, - reporters: ['coverage'], - coverageReporter: { - reporters: [{ type: 'html', dir: 'coverage' }, { type: 'text-summary' }], - }, - }, - }; - - /** - * ------------------------------------------------------------ - * CI sharding - * ------------------------------------------------------------ - * - * Every test retains nearly all of the memory it causes to be allocated, - * which has started to kill the test browser as the size of the test suite - * increases. This is a deep-rooted problem that will take some serious - * work to fix. - * - * CI sharding is a short-term solution that splits the top-level describe - * calls into different "shards" and instructs karma to only run one shard - * at a time, reloading the browser in between each shard and forcing the - * memory from the previous shard to be released. - * - * ## how - * - * Rather than modify the bundling process to produce multiple testing - * bundles, top-level describe calls are sharded by their first argument, - * the suite name. - * - * The number of shards to create is controlled with the TOTAL_CI_SHARDS - * constant defined at the top of this file. - * - * ## controlling sharding - * - * To control sharding in a specific karma configuration, the total number - * of shards to create (?shards=X), and the current shard number - * (&shard_num=Y), are added to the testing bundle url and read by the - * test_harness/setup_test_sharding[1] module. This allows us to use a - * different number of shards in different scenarios (ie. running - * `yarn test:karma` runs the tests in a single shard, effectively - * disabling sharding) - * - * These same parameters can also be defined in the URL/query string of the - * karma debug page (started when you run `yarn test:karma:debug`). - * - * ## debugging - * - * It is *possible* that some tests will only pass if run after/with certain - * other suites. To debug this, make sure that your tests pass in isolation - * (by clicking the suite name on the karma debug page) and that it runs - * correctly in it's given shard (using the `?shards=X&shard_num=Y` query - * string params on the karma debug page). You can spot the shard number - * a test is running in by searching for the "ready to load tests for shard X" - * log message. - * - * [1]: src/legacy/ui/public/test_harness/test_sharding/setup_test_sharding.js - */ - times(TOTAL_CI_SHARDS, (i) => { - const n = i + 1; - config[`ciShard-${n}`] = { - singleRun: true, - options: { - files: getKarmaFiles(n), - }, - }; - }); - - return config; -}; diff --git a/tasks/config/run.js b/tasks/config/run.js index 98a1226834bc6..9ac8f72d56d4a 100644 --- a/tasks/config/run.js +++ b/tasks/config/run.js @@ -17,7 +17,6 @@ * under the License. */ -import { resolve } from 'path'; import { getFunctionalTestGroupRunConfigs } from '../function_test_groups'; const { version } = require('../../package.json'); @@ -25,44 +24,7 @@ const KIBANA_INSTALL_DIR = process.env.KIBANA_INSTALL_DIR || `./build/oss/kibana-${version}-SNAPSHOT-${process.platform}-x86_64`; -module.exports = function (grunt) { - function createKbnServerTask({ runBuild, flags = [] }) { - return { - options: { - wait: false, - ready: /http server running/, - quiet: false, - failOnError: false, - }, - cmd: runBuild ? `./build/${runBuild}/bin/kibana` : process.execPath, - args: [ - ...(runBuild ? [] : [require.resolve('../../scripts/kibana'), '--oss']), - - '--logging.json=false', - - ...flags, - - // allow the user to override/inject flags by defining cli args starting with `--kbnServer.` - ...grunt.option.flags().reduce(function (flags, flag) { - if (flag.startsWith('--kbnServer.')) { - flags.push(`--${flag.slice(12)}`); - } - - return flags; - }, []), - ], - }; - } - - const karmaTestServerFlags = [ - '--env.name=development', - '--plugins.initialize=false', - '--optimize.bundleFilter=tests', - '--optimize.validateSyntaxOfNodeModules=false', - '--server.port=5610', - '--migrations.skip=true', - ]; - +module.exports = function () { const NODE = 'node'; const YARN = 'yarn'; const scriptWithGithubChecks = ({ title, options, cmd, args }) => @@ -177,37 +139,6 @@ module.exports = function (grunt) { ], }), - // used by the test:karma task - // runs the kibana server to serve the browser test bundle - karmaTestServer: createKbnServerTask({ - flags: [...karmaTestServerFlags], - }), - browserSCSS: createKbnServerTask({ - flags: [...karmaTestServerFlags, '--optimize', '--optimize.enabled=false'], - }), - - // used by the test:coverage task - // runs the kibana server to serve the instrumented version of the browser test bundle - karmaTestCoverageServer: createKbnServerTask({ - flags: [...karmaTestServerFlags, '--tests_bundle.instrument=true'], - }), - - // used by the test:karma:debug task - // runs the kibana server to serve the browser test bundle, but listens for changes - // to the public/browser code and rebuilds the test bundle on changes - karmaTestDebugServer: createKbnServerTask({ - flags: [ - ...karmaTestServerFlags, - '--dev', - '--no-dev-config', - '--no-watch', - '--no-base-path', - '--optimize.watchPort=5611', - '--optimize.watchPrebuild=true', - '--optimize.bundleDir=' + resolve(__dirname, '../../data/optimize/testdev'), - ], - }), - verifyNotice: scriptWithGithubChecks({ title: 'Verify NOTICE.txt', options: { @@ -325,7 +256,6 @@ module.exports = function (grunt) { 'test:jest_integration' ), test_projects: gruntTaskWithGithubChecks('Project tests', 'test:projects'), - test_karma_ci: gruntTaskWithGithubChecks('Browser tests', 'test:karma-ci'), ...getFunctionalTestGroupRunConfigs({ kibanaInstallDir: KIBANA_INSTALL_DIR, diff --git a/tasks/jenkins.js b/tasks/jenkins.js index eece5df61a7d1..adfb6f0f46868 100644 --- a/tasks/jenkins.js +++ b/tasks/jenkins.js @@ -37,7 +37,6 @@ module.exports = function (grunt) { 'run:test_jest', 'run:test_jest_integration', 'run:test_projects', - 'run:test_karma_ci', 'run:test_hardening', 'run:test_package_safer_lodash_set', 'run:apiIntegrationTests', diff --git a/tasks/test.js b/tasks/test.js index 09821b97fe2e8..f370ea0b948c6 100644 --- a/tasks/test.js +++ b/tasks/test.js @@ -17,8 +17,6 @@ * under the License. */ -import _, { keys } from 'lodash'; - import { run } from '../utilities/visual_regression'; module.exports = function (grunt) { @@ -31,25 +29,6 @@ module.exports = function (grunt) { } ); - grunt.registerTask('test:karma', [ - 'checkPlugins', - 'run:browserSCSS', - 'run:karmaTestServer', - 'karma:unit', - ]); - - grunt.registerTask('test:karma-ci', () => { - const ciShardTasks = keys(grunt.config.get('karma')) - .filter((key) => key.startsWith('ciShard-')) - .map((key) => `karma:${key}`); - - grunt.log.ok(`Running UI tests in ${ciShardTasks.length} shards`); - grunt.task.run(['run:browserSCSS']); - grunt.task.run(['run:karmaTestServer', ...ciShardTasks]); - }); - - grunt.registerTask('test:coverage', ['run:karmaTestCoverageServer', 'karma:coverage']); - grunt.registerTask('test:quick', [ 'checkPlugins', 'run:mocha', @@ -57,18 +36,16 @@ module.exports = function (grunt) { 'test:jest', 'test:jest_integration', 'test:projects', - 'test:karma', 'run:apiIntegrationTests', ]); - grunt.registerTask('test:karmaDebug', ['checkPlugins', 'run:karmaTestDebugServer', 'karma:dev']); grunt.registerTask('test:mochaCoverage', ['run:mochaCoverage']); grunt.registerTask('test', (subTask) => { if (subTask) grunt.fail.fatal(`invalid task "test:${subTask}"`); grunt.task.run( - _.compact([ + [ !grunt.option('quick') && 'run:eslint', !grunt.option('quick') && 'run:sasslint', !grunt.option('quick') && 'run:checkTsProjects', @@ -78,7 +55,7 @@ module.exports = function (grunt) { 'run:checkFileCasing', 'run:licenses', 'test:quick', - ]) + ].filter(Boolean) ); }); diff --git a/test/scripts/jenkins_xpack.sh b/test/scripts/jenkins_xpack.sh index bc927b1ed7b4d..77480554f738c 100755 --- a/test/scripts/jenkins_xpack.sh +++ b/test/scripts/jenkins_xpack.sh @@ -3,9 +3,9 @@ source test/scripts/jenkins_test_setup.sh if [[ -z "$CODE_COVERAGE" ]] ; then - echo " -> Running mocha tests" - cd "$XPACK_DIR" - checks-reporter-with-killswitch "X-Pack Karma Tests" yarn test:karma + echo " -> Building legacy styles for x-pack canvas storyshot tests" + cd "$KIBANA_DIR" + node scripts/build_sass echo "" echo "" diff --git a/x-pack/README.md b/x-pack/README.md index 03d2e3287c0f0..0449f1fc1bdab 100644 --- a/x-pack/README.md +++ b/x-pack/README.md @@ -44,14 +44,6 @@ If you want to run tests only for a specific plugin (to save some time), you can yarn test --plugins [,]* # where is "reporting", etc. ``` -#### Debugging browser tests -``` -yarn test:karma:debug -``` -Initializes an environment for debugging the browser tests. Includes an dedicated instance of the kibana server for building the test bundle, and a karma server. When running this task the build is optimized for the first time and then a karma-owned instance of the browser is opened. Click the "debug" button to open a new tab that executes the unit tests. - -Run single tests by appending `grep` parameter to the end of the URL. For example `http://localhost:9876/debug.html?grep=ML%20-%20Explorer%20Controller` will only run tests with 'ML - Explorer Controller' in the describe block. - #### Running server unit tests You can run mocha unit tests by running: diff --git a/x-pack/gulpfile.js b/x-pack/gulpfile.js index 7e5ab9b18f019..78ed2bff8cb01 100644 --- a/x-pack/gulpfile.js +++ b/x-pack/gulpfile.js @@ -8,7 +8,6 @@ require('../src/setup_node_env'); const { buildTask } = require('./tasks/build'); const { devTask } = require('./tasks/dev'); -const { testTask, testKarmaTask, testKarmaDebugTask } = require('./tasks/test'); const { downloadChromium } = require('./tasks/download_chromium'); // export the tasks that are runnable from the CLI @@ -16,7 +15,4 @@ module.exports = { build: buildTask, dev: devTask, downloadChromium, - test: testTask, - 'test:karma': testKarmaTask, - 'test:karma:debug': testKarmaDebugTask, }; diff --git a/x-pack/package.json b/x-pack/package.json index 39bdb76ac7a73..d1f638ccad8d0 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -11,8 +11,6 @@ "build": "gulp build", "testonly": "echo 'Deprecated, use `yarn test`' && gulp test", "test": "gulp test", - "test:karma:debug": "gulp test:karma:debug", - "test:karma": "gulp test:karma", "test:jest": "node scripts/jest", "test:mocha": "node scripts/mocha" }, diff --git a/x-pack/plugins/canvas/scripts/test_browser.js b/x-pack/plugins/canvas/scripts/test_browser.js deleted file mode 100644 index e04fac0615284..0000000000000 --- a/x-pack/plugins/canvas/scripts/test_browser.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -require('./_helpers').runGulpTask('canvas:test:karma'); diff --git a/x-pack/plugins/canvas/scripts/test_dev.js b/x-pack/plugins/canvas/scripts/test_dev.js deleted file mode 100644 index 8b03d7930d473..0000000000000 --- a/x-pack/plugins/canvas/scripts/test_dev.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -require('./_helpers').runGulpTask('canvas:karma:debug'); diff --git a/x-pack/tasks/test.ts b/x-pack/tasks/test.ts deleted file mode 100644 index 0d990bff9f44e..0000000000000 --- a/x-pack/tasks/test.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import * as pluginHelpers from '@kbn/plugin-helpers'; -import gulp from 'gulp'; - -import { getEnabledPlugins } from './helpers/flags'; - -export const testServerTask = async () => { - throw new Error('server mocha tests are now included in the `node scripts/mocha` script'); -}; - -export const testKarmaTask = async () => { - const plugins = await getEnabledPlugins(); - await pluginHelpers.run('testKarma', { - plugins: plugins.join(','), - }); -}; - -export const testKarmaDebugTask = async () => { - const plugins = await getEnabledPlugins(); - await pluginHelpers.run('testKarma', { - dev: true, - plugins: plugins.join(','), - }); -}; - -export const testTask = gulp.series(testKarmaTask, testServerTask); diff --git a/yarn.lock b/yarn.lock index fd6019750dda5..0638a019a9402 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6544,11 +6544,6 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abbrev@1.0.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= - abort-controller@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-2.0.3.tgz#b174827a732efadff81227ed4b8d1cc569baf20a" @@ -6706,11 +6701,6 @@ after-all-results@^2.0.0: resolved "https://registry.yarnpkg.com/after-all-results/-/after-all-results-2.0.0.tgz#6ac2fc202b500f88da8f4f5530cfa100f4c6a2d0" integrity sha1-asL8ICtQD4jaj09VMM+hAPTGotA= -after@0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= - agent-base@4: version "4.2.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce" @@ -7661,11 +7651,6 @@ array.prototype.flatmap@^1.2.3: es-abstract "^1.17.0-next.1" function-bind "^1.1.1" -arraybuffer.slice@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" - integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== - arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -7831,11 +7816,6 @@ async-value@^1.2.2: resolved "https://registry.yarnpkg.com/async-value/-/async-value-1.2.2.tgz#84517a1e7cb6b1a5b5e181fa31be10437b7fb125" integrity sha1-hFF6Hny2saW14YH6Mb4QQ3t/sSU= -async@1.x, async@^1.4.2, async@^1.5.2, async@~1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - async@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/async/-/async-2.4.0.tgz#4990200f18ea5b837c2cc4f8c031a6985c385611" @@ -7843,6 +7823,11 @@ async@2.4.0: dependencies: lodash "^4.14.0" +async@^1.4.2, async@^1.5.2, async@~1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + async@^2.0.0, async@^2.1.4: version "2.6.0" resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" @@ -7857,7 +7842,7 @@ async@^2.6.0, async@^2.6.1: dependencies: lodash "^4.17.10" -async@^2.6.2, async@^2.6.3: +async@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -8546,11 +8531,6 @@ bach@^1.0.0: async-settle "^1.0.0" now-and-later "^2.0.0" -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= - backport@5.5.1: version "5.5.1" resolved "https://registry.yarnpkg.com/backport/-/backport-5.5.1.tgz#2eeddbdc4cfc0530119bdb2b0c3c30bc7ef574dd" @@ -8582,11 +8562,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-arraybuffer@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" - integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= - base64-js@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" @@ -8602,11 +8577,6 @@ base64-js@^1.1.2, base64-js@^1.2.1, base64-js@^1.3.0, base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== -base64id@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" - integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= - base64url@^3.0.0, base64url@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" @@ -8654,13 +8624,6 @@ before-after-hook@^1.4.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.4.0.tgz#2b6bf23dca4f32e628fd2747c10a37c74a4b484d" integrity sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg== -better-assert@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" - integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= - dependencies: - callsite "1.0.0" - big-integer@^1.6.16: version "1.6.48" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" @@ -8739,11 +8702,6 @@ bl@^3.0.0: dependencies: readable-stream "^3.0.1" -blob@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" - integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== - block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -8828,22 +8786,6 @@ body-parser@1.19.0, body-parser@^1.18.1, body-parser@^1.18.3: raw-body "2.4.0" type-is "~1.6.17" -body-parser@^1.16.1: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" - integrity sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ= - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" - on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" - body@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" @@ -8987,7 +8929,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -9491,11 +9433,6 @@ caller-path@^2.0.0: dependencies: caller-callsite "^2.0.0" -callsite@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" - integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= - callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" @@ -9962,7 +9899,7 @@ chokidar@^2.0.0, chokidar@^2.1.2, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.0.0, chokidar@^3.2.2: +chokidar@^3.2.2: version "3.3.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== @@ -10493,16 +10430,16 @@ colors@1.0.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@^1.1.0, colors@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" - integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== - colors@^1.1.2, colors@^1.3.2: version "1.3.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== +colors@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" + integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== + colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -10619,21 +10556,11 @@ compare-versions@3.5.1: resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.5.1.tgz#26e1f5cf0d48a77eced5046b9f67b6b61075a393" integrity sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg== -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= - -component-emitter@1.2.1, component-emitter@^1.2.0, component-emitter@^1.2.1: +component-emitter@^1.2.0, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= - compose-function@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" @@ -10817,16 +10744,6 @@ connect@^3.4.0: parseurl "~1.3.3" utils-merge "1.0.1" -connect@^3.6.0: - version "3.6.6" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" - integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= - dependencies: - debug "2.6.9" - finalhandler "1.1.0" - parseurl "~1.3.2" - utils-merge "1.0.1" - console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" @@ -11559,11 +11476,6 @@ custom-event-polyfill@^0.3.0: resolved "https://registry.yarnpkg.com/custom-event-polyfill/-/custom-event-polyfill-0.3.0.tgz#99807839be62edb446b645832e0d80ead6fa1888" integrity sha1-mYB4Ob5i7bRGtkWDLg2A6tb6GIg= -custom-event@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" - integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= - cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -11882,24 +11794,11 @@ date-fns@^1.27.2: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" integrity sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw== -date-format@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" - integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== - date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -dateformat@^1.0.6, dateformat@~1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - dateformat@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" @@ -11910,6 +11809,14 @@ dateformat@^3.0.2: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== +dateformat@~1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + debug-fabulous@1.X: version "1.1.0" resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e" @@ -11926,7 +11833,7 @@ debug@2.6.9, debug@^2.0.0, debug@^2.1.0, debug@^2.1.1, debug@^2.2.0, debug@^2.3. dependencies: ms "2.0.0" -debug@3.1.0, debug@=3.1.0, debug@~3.1.0: +debug@3.1.0, debug@=3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== @@ -12300,7 +12207,7 @@ depd@1.1.1: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= -depd@~1.1.1, depd@~1.1.2: +depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= @@ -12509,11 +12416,6 @@ dfa@^1.2.0: resolved "https://registry.yarnpkg.com/dfa/-/dfa-1.2.0.tgz#96ac3204e2d29c49ea5b57af8d92c2ae12790657" integrity sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q== -di@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" - integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= - diacritics@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/diacritics/-/diacritics-1.3.0.tgz#3efa87323ebb863e6696cebb0082d48ff3d6f7a1" @@ -12668,16 +12570,6 @@ dom-helpers@^5.0.0: "@babel/runtime" "^7.6.3" csstype "^2.6.7" -dom-serialize@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" - integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= - dependencies: - custom-event "~1.0.0" - ent "~2.2.0" - extend "^3.0.0" - void-elements "^2.0.0" - dom-serializer@0, dom-serializer@~0.1.0, dom-serializer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" @@ -13130,7 +13022,7 @@ enabled@2.0.x: resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== -encodeurl@^1.0.2, encodeurl@~1.0.1, encodeurl@~1.0.2: +encodeurl@^1.0.2, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= @@ -13156,46 +13048,6 @@ end-of-stream@^1.4.1, end-of-stream@^1.4.4: dependencies: once "^1.4.0" -engine.io-client@~3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36" - integrity sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw== - dependencies: - component-emitter "1.2.1" - component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.1.1" - has-cors "1.1.0" - indexof "0.0.1" - parseqs "0.0.5" - parseuri "0.0.5" - ws "~3.3.1" - xmlhttprequest-ssl "~1.5.4" - yeast "0.1.2" - -engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" - integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== - dependencies: - after "0.8.2" - arraybuffer.slice "~0.0.7" - base64-arraybuffer "0.1.5" - blob "0.0.5" - has-binary2 "~1.0.2" - -engine.io@~3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.1.tgz#b60281c35484a70ee0351ea0ebff83ec8c9522a2" - integrity sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w== - dependencies: - accepts "~1.3.4" - base64id "1.0.0" - cookie "0.3.1" - debug "~3.1.0" - engine.io-parser "~2.1.0" - ws "~3.3.1" - enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" @@ -13214,11 +13066,6 @@ enhanced-resolve@~0.9.0: memory-fs "^0.2.0" tapable "^0.1.8" -ent@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= - entities@^1.1.1, entities@^1.1.2, entities@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -13570,18 +13417,6 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@1.8.x: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= - dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.2.0" - escodegen@^1.11.0: version "1.14.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" @@ -13983,11 +13818,6 @@ espree@^6.1.2: acorn-jsx "^5.1.0" eslint-visitor-keys "^1.1.0" -esprima@2.7.x, esprima@^2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= - esprima@^3.1.3, esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -14017,11 +13847,6 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= - estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -14075,11 +13900,6 @@ eventemitter2@~0.4.13: resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab" integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas= -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" - integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= - eventemitter3@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" @@ -14876,19 +14696,6 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= -finalhandler@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" - integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= - dependencies: - debug "2.6.9" - encodeurl "~1.0.1" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.3.1" - unpipe "~1.0.0" - finalhandler@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" @@ -15340,13 +15147,6 @@ front-matter@2.1.2: dependencies: js-yaml "^3.4.6" -fs-access@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" - integrity sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o= - dependencies: - null-check "^1.0.0" - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -15875,17 +15675,6 @@ glob@7.1.4, glob@~7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^5.0.15, glob@~5.0.0: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^6.0.1, glob@^6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" @@ -15909,6 +15698,17 @@ glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@~5.0.0: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@~7.0.0: version "7.0.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" @@ -16620,13 +16420,6 @@ grunt-contrib-watch@^1.1.0: lodash "^4.17.10" tiny-lr "^1.1.1" -grunt-karma@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/grunt-karma/-/grunt-karma-3.0.2.tgz#4f14386d43ee45f8f6b98081862e4910f5056764" - integrity sha512-imNhQO1bR1O7X6/3F5vO0o7mKy4xdkpSd40QVfxGO70cBAFcOqjv2Zu5QzsfEsSrppuu3N0vIQPbfBRjeGdpWg== - dependencies: - lodash "^4.17.10" - grunt-known-options@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.0.tgz#a4274eeb32fa765da5a7a3b1712617ce3b144149" @@ -16917,23 +16710,11 @@ has-ansi@^3.0.0: dependencies: ansi-regex "^3.0.0" -has-binary2@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" - integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== - dependencies: - isarray "2.0.1" - has-color@~0.1.0: version "0.1.7" resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" integrity sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8= -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= - has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -17348,16 +17129,6 @@ http-deceiver@^1.2.7: resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.6.2, http-errors@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= - dependencies: - depd "1.1.1" - inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" - http-errors@1.6.3, http-errors@~1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -17379,6 +17150,16 @@ http-errors@1.7.2, http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" +http-errors@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + http-errors@~1.7.0: version "1.7.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" @@ -17425,14 +17206,6 @@ http-proxy-middleware@0.19.1: lodash "^4.17.11" micromatch "^3.1.10" -http-proxy@^1.13.0: - version "1.16.2" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" - integrity sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I= - dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" - http-proxy@^1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" @@ -18929,11 +18702,6 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isarray@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" - integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -18944,11 +18712,6 @@ isbinaryfile@4.0.2: resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.2.tgz#bfc45642da645681c610cca831022e30af426488" integrity sha512-C3FSxJdNrEr2F4z6uFtNzECDM5hXk+46fxaa+cwBe5/XrWSmzdG8DDgyjfX6/NRdBB21q2JXuRAzPCUs+fclnQ== -isbinaryfile@^4.0.2: - version "4.0.6" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b" - integrity sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg== - isemail@3.x.x: version "3.1.4" resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.1.4.tgz#76e2187ff7bee59d57522c6fd1c3f09a331933cf" @@ -19106,26 +18869,6 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -istanbul@^0.4.0: - version "0.4.5" - resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" - integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - handlebars "^4.0.1" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "^3.1.0" - which "^1.1.1" - wordwrap "^1.0.0" - istextorbinary@^2.1.0: version "2.2.1" resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53" @@ -19798,7 +19541,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1, js-yaml@3.x, js-yaml@^3.10.0, js-yaml@^3.13.1, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.9.0, js-yaml@~3.13.0, js-yaml@~3.13.1: +js-yaml@3.13.1, js-yaml@^3.10.0, js-yaml@^3.13.1, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.9.0, js-yaml@~3.13.0, js-yaml@~3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -20209,87 +19952,6 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" -karma-chrome-launcher@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" - integrity sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w== - dependencies: - fs-access "^1.0.0" - which "^1.2.1" - -karma-coverage@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-1.1.2.tgz#cc09dceb589a83101aca5fe70c287645ef387689" - integrity sha512-eQawj4Cl3z/CjxslYy9ariU4uDh7cCNFZHNWXWRpl0pNeblY/4wHR7M7boTYXWrn9bY0z2pZmr11eKje/S/hIw== - dependencies: - dateformat "^1.0.6" - istanbul "^0.4.0" - lodash "^4.17.0" - minimatch "^3.0.0" - source-map "^0.5.1" - -karma-firefox-launcher@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-1.1.0.tgz#2c47030452f04531eb7d13d4fc7669630bb93339" - integrity sha512-LbZ5/XlIXLeQ3cqnCbYLn+rOVhuMIK9aZwlP6eOLGzWdo1UVp7t6CN3DP4SafiRLjexKwHeKHDm0c38Mtd3VxA== - -karma-ie-launcher@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/karma-ie-launcher/-/karma-ie-launcher-1.0.0.tgz#497986842c490190346cd89f5494ca9830c6d59c" - integrity sha1-SXmGhCxJAZA0bNifVJTKmDDG1Zw= - dependencies: - lodash "^4.6.1" - -karma-junit-reporter@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/karma-junit-reporter/-/karma-junit-reporter-1.2.0.tgz#4f9c40cedfb1a395f8aef876abf96189917c6396" - integrity sha1-T5xAzt+xo5X4rvh2q/lhiZF8Y5Y= - dependencies: - path-is-absolute "^1.0.0" - xmlbuilder "8.2.2" - -karma-mocha@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.0.tgz#ad6b56b6a72e9b191e4c432dd30f4a44fc2435bc" - integrity sha512-qiZkZDJnn2kb9t2m4LoM4cYJHJVPoxvAYYe0B+go5s+A/3vc/3psUT05zW4yFz4vT0xHf+XzTTery8zdr8GWgA== - dependencies: - minimist "^1.2.3" - -karma-safari-launcher@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/karma-safari-launcher/-/karma-safari-launcher-1.0.0.tgz#96982a2cc47d066aae71c553babb28319115a2ce" - integrity sha1-lpgqLMR9BmquccVTursoMZEVos4= - -karma@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/karma/-/karma-5.0.2.tgz#e404373dac6e3fa08409ae4d9eda7d83adb43ee5" - integrity sha512-RpUuCuGJfN3WnjYPGIH+VBF8023Lfm3TQH6D1kcNL+FxtEPc2UUz/nVjbVAGXH4Pm+Q7FVOAQjdAeFUpXpQ3IA== - dependencies: - body-parser "^1.16.1" - braces "^3.0.2" - chokidar "^3.0.0" - colors "^1.1.0" - connect "^3.6.0" - di "^0.0.1" - dom-serialize "^2.2.0" - flatted "^2.0.0" - glob "^7.1.1" - graceful-fs "^4.1.2" - http-proxy "^1.13.0" - isbinaryfile "^4.0.2" - lodash "^4.17.14" - log4js "^4.0.0" - mime "^2.3.1" - minimatch "^3.0.2" - qjobs "^1.1.4" - range-parser "^1.2.0" - rimraf "^2.6.0" - socket.io "2.1.1" - source-map "^0.6.1" - tmp "0.0.33" - ua-parser-js "0.7.21" - yargs "^15.3.1" - kdbush@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" @@ -21127,7 +20789,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.11, lodash@4.17.15, lodash@>4.17.4, lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.6.1, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.5: +lodash@4.17.11, lodash@4.17.15, lodash@>4.17.4, lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.5: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -21200,17 +20862,6 @@ log-update@^1.0.2: ansi-escapes "^1.0.0" cli-cursor "^1.0.2" -log4js@^4.0.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-4.5.1.tgz#e543625e97d9e6f3e6e7c9fc196dd6ab2cae30b5" - integrity sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw== - dependencies: - date-format "^2.0.0" - debug "^4.1.1" - flatted "^2.0.0" - rfdc "^1.1.4" - streamroller "^1.0.6" - logform@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/logform/-/logform-2.1.2.tgz#957155ebeb67a13164069825ce67ddb5bb2dd360" @@ -22048,7 +21699,7 @@ minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2 resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minimist@1.2.5, minimist@^1.2.3, minimist@^1.2.5: +minimist@1.2.5, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -22970,7 +22621,7 @@ nodemon@^2.0.2: chalk "~0.4.0" underscore "~1.6.0" -"nopt@2 || 3", nopt@3.x, nopt@~3.0.1, nopt@~3.0.6: +"nopt@2 || 3", nopt@~3.0.1, nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= @@ -23172,11 +22823,6 @@ nth-check@^1.0.2, nth-check@~1.0.1: dependencies: boolbase "~1.0.0" -null-check@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" - integrity sha1-l33/1xdgErnsMNKjnbXPcqBDnt0= - null-loader@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-3.0.0.tgz#3e2b6c663c5bda8c73a54357d8fa0708dc61b245" @@ -23262,11 +22908,6 @@ object-assign@^3.0.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I= -object-component@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" - integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= - object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" @@ -23484,7 +23125,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -24177,20 +23818,6 @@ parse5@^3.0.1: dependencies: "@types/node" "*" -parseqs@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" - integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= - dependencies: - better-assert "~1.0.0" - -parseuri@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" - integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= - dependencies: - better-assert "~1.0.0" - parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -25334,16 +24961,6 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qjobs@^1.1.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" - integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== - -qs@6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== - qs@6.5.2, qs@^6.4.0, qs@^6.5.1, qs@~6.5.1, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -25492,25 +25109,15 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@^1.2.0, range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= - range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" - integrity sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k= - dependencies: - bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" - unpipe "1.0.0" +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= raw-body@2.3.3: version "2.3.3" @@ -27396,7 +27003,7 @@ requirejs@^2.3.5: resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.6.tgz#e5093d9601c2829251258c0b9445d4d19fa9e7c9" integrity sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg== -requires-port@1.x.x, requires-port@^1.0.0: +requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= @@ -27515,7 +27122,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.7, resolve@1.1.x, resolve@~1.1.0, resolve@~1.1.7: +resolve@1.1.7, resolve@~1.1.0, resolve@~1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= @@ -27633,11 +27240,6 @@ rework@1.0.1: convert-source-map "^0.3.3" css "^2.0.0" -rfdc@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" - integrity sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug== - right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" @@ -27645,7 +27247,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.0, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2, rimraf@^2.2.0, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== @@ -28716,52 +28318,6 @@ socket-location@^1.0.0: dependencies: await-event "^2.1.0" -socket.io-adapter@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" - integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= - -socket.io-client@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f" - integrity sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ== - dependencies: - backo2 "1.0.2" - base64-arraybuffer "0.1.5" - component-bind "1.0.0" - component-emitter "1.2.1" - debug "~3.1.0" - engine.io-client "~3.2.0" - has-binary2 "~1.0.2" - has-cors "1.1.0" - indexof "0.0.1" - object-component "0.0.3" - parseqs "0.0.5" - parseuri "0.0.5" - socket.io-parser "~3.2.0" - to-array "0.1.4" - -socket.io-parser@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077" - integrity sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA== - dependencies: - component-emitter "1.2.1" - debug "~3.1.0" - isarray "2.0.1" - -socket.io@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980" - integrity sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA== - dependencies: - debug "~3.1.0" - engine.io "~3.2.0" - has-binary2 "~1.0.2" - socket.io-adapter "~1.1.0" - socket.io-client "2.1.1" - socket.io-parser "~3.2.0" - sockjs-client@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177" @@ -28893,13 +28449,6 @@ source-map@~0.1.30: dependencies: amdefine ">=0.0.4" -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= - dependencies: - amdefine ">=0.0.4" - sourcemap-codec@^1.4.1: version "1.4.6" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" @@ -29242,11 +28791,6 @@ stats-lite@^2.2.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= - stdout-stream@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" @@ -29320,17 +28864,6 @@ stream-spigot@~2.1.2: dependencies: readable-stream "~1.1.0" -streamroller@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-1.0.6.tgz#8167d8496ed9f19f05ee4b158d9611321b8cacd9" - integrity sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg== - dependencies: - async "^2.6.2" - date-format "^2.0.0" - debug "^3.2.6" - fs-extra "^7.0.1" - lodash "^4.17.14" - strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -29834,7 +29367,7 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.1.0, supports-color@^3.1.2: +supports-color@^3.1.2: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= @@ -30531,7 +30064,7 @@ tmp@0.0.30: dependencies: os-tmpdir "~1.0.1" -tmp@0.0.33, tmp@0.0.x, tmp@^0.0.33: +tmp@0.0.x, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== @@ -30565,11 +30098,6 @@ to-absolute-glob@^2.0.0: is-absolute "^1.0.0" is-negated-glob "^1.0.0" -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -31463,7 +30991,7 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@~1.6.15, type-is@~1.6.16: +type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== @@ -31544,7 +31072,7 @@ typings-tester@^0.3.2: dependencies: commander "^2.12.2" -ua-parser-js@0.7.21, ua-parser-js@^0.7.18, ua-parser-js@^0.7.9: +ua-parser-js@^0.7.18, ua-parser-js@^0.7.9: version "0.7.21" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== @@ -31594,11 +31122,6 @@ uid-safe@2.1.5: dependencies: random-bytes "~1.0.0" -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - unbzip2-stream@^1.0.9: version "1.2.5" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz#73a033a567bbbde59654b193c44d48a7e4f43c47" @@ -32825,7 +32348,7 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== -void-elements@^2.0.0, void-elements@^2.0.1: +void-elements@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= @@ -33250,7 +32773,7 @@ which@1, which@1.3.1, which@^1.2.9, which@^1.3.1, which@~1.3.0: dependencies: isexe "^2.0.0" -which@^1.1.1, which@^1.2.1, which@^1.2.14, which@^1.2.8: +which@^1.2.14, which@^1.2.8: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== @@ -33590,15 +33113,6 @@ ws@^7.0.0: dependencies: async-limiter "^1.0.0" -ws@~3.3.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - x-is-function@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/x-is-function/-/x-is-function-1.0.4.tgz#5d294dc3d268cbdd062580e0c5df77a391d1fa1e" @@ -33681,11 +33195,6 @@ xmlbuilder@13.0.2: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== -xmlbuilder@8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" - integrity sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M= - xmlbuilder@~11.0.0: version "11.0.1" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" @@ -33706,11 +33215,6 @@ xmldom@0.1.27: resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= -xmlhttprequest-ssl@~1.5.4: - version "1.5.5" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" - integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= - xpath@0.0.27: version "0.0.27" resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.27.tgz#dd3421fbdcc5646ac32c48531b4d7e9d0c2cfa92" @@ -34010,11 +33514,6 @@ yazl@^2.5.1: dependencies: buffer-crc32 "~0.2.3" -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= - yeoman-character@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/yeoman-character/-/yeoman-character-1.1.0.tgz#90d4b5beaf92759086177015b2fdfa2e0684d7c7" From 867a672c7a0be1b1c447c9ceaf84ec4883061b10 Mon Sep 17 00:00:00 2001 From: Jonathan Buttner <56361221+jonathan-buttner@users.noreply.github.com> Date: Mon, 27 Jul 2020 14:13:50 -0400 Subject: [PATCH 021/126] [Security Solution] Use docker for endpoint tests (#73092) * Copying api integration tests into their own directory * Removing api integration tests and using ingest docker image * Fixing typo * Fixing type errors and empty string and reenabling tests * Rebuilding docs * Renaming url override variable Co-authored-by: Elastic Machine --- .../architecture/code-exploration.asciidoc | 4 +- x-pack/plugins/security_solution/README.md | 130 ++++++++++++++++++ x-pack/scripts/functional_tests.js | 1 + .../api_integration/apis/endpoint/index.ts | 22 --- x-pack/test/api_integration/apis/index.js | 1 - x-pack/test/api_integration/services/index.ts | 2 - .../ingest_manager_api_integration/config.ts | 9 +- .../apps/endpoint/endpoint_list.ts | 2 +- .../apps/endpoint/index.ts | 18 ++- .../test/security_solution_endpoint/config.ts | 7 + .../apis}/artifacts/index.ts | 8 +- .../apis}/data_stream_helper.ts | 2 +- .../apis/fixtures/package_registry_config.yml | 2 + .../apis/index.ts | 34 +++++ .../apis}/metadata.ts | 2 +- .../apis}/policy.ts | 2 +- .../apis}/resolver.ts | 10 +- .../config.ts | 31 +++++ .../ftr_provider_context.d.ts | 11 ++ .../registry.ts | 77 +++++++++++ .../services/index.ts | 13 ++ .../services/resolver.ts | 0 22 files changed, 341 insertions(+), 47 deletions(-) create mode 100644 x-pack/plugins/security_solution/README.md delete mode 100644 x-pack/test/api_integration/apis/endpoint/index.ts rename x-pack/test/{api_integration/apis/endpoint => security_solution_endpoint_api_int/apis}/artifacts/index.ts (98%) rename x-pack/test/{api_integration/apis/endpoint => security_solution_endpoint_api_int/apis}/data_stream_helper.ts (94%) create mode 100644 x-pack/test/security_solution_endpoint_api_int/apis/fixtures/package_registry_config.yml create mode 100644 x-pack/test/security_solution_endpoint_api_int/apis/index.ts rename x-pack/test/{api_integration/apis/endpoint => security_solution_endpoint_api_int/apis}/metadata.ts (99%) rename x-pack/test/{api_integration/apis/endpoint => security_solution_endpoint_api_int/apis}/policy.ts (96%) rename x-pack/test/{api_integration/apis/endpoint => security_solution_endpoint_api_int/apis}/resolver.ts (98%) create mode 100644 x-pack/test/security_solution_endpoint_api_int/config.ts create mode 100644 x-pack/test/security_solution_endpoint_api_int/ftr_provider_context.d.ts create mode 100644 x-pack/test/security_solution_endpoint_api_int/registry.ts create mode 100644 x-pack/test/security_solution_endpoint_api_int/services/index.ts rename x-pack/test/{api_integration => security_solution_endpoint_api_int}/services/resolver.ts (100%) diff --git a/docs/developer/architecture/code-exploration.asciidoc b/docs/developer/architecture/code-exploration.asciidoc index f18a6c2f14926..4481dea44795c 100644 --- a/docs/developer/architecture/code-exploration.asciidoc +++ b/docs/developer/architecture/code-exploration.asciidoc @@ -524,9 +524,9 @@ WARNING: Missing README. See Configuring security in Kibana. -- {kib-repo}blob/{branch}/x-pack/plugins/security_solution[securitySolution] +- {kib-repo}blob/{branch}/x-pack/plugins/security_solution/README.md[securitySolution] -WARNING: Missing README. +Welcome to the Kibana Security Solution plugin! This README will go over getting started with development and testing. - {kib-repo}blob/{branch}/x-pack/plugins/snapshot_restore/README.md[snapshotRestore] diff --git a/x-pack/plugins/security_solution/README.md b/x-pack/plugins/security_solution/README.md new file mode 100644 index 0000000000000..6680dbf1a149b --- /dev/null +++ b/x-pack/plugins/security_solution/README.md @@ -0,0 +1,130 @@ +# Security Solution + +Welcome to the Kibana Security Solution plugin! This README will go over getting started with development and testing. + +## Development + +## Tests + +The endpoint specific tests leverage the ingest manager to install the endpoint package. Before the api integration +and functional tests are run the ingest manager is initialized. This initialization process includes reaching out to +a package registry service to install the endpoint package. The endpoint tests support three different ways to run +the tests given the constraint on an available package registry. + +1. Using Docker +2. Running your own local package registry +3. Using the default external package registry + +These scenarios will be outlined the sections below. + +### Endpoint API Integration Tests Location + +The endpoint api integration tests are located [here](../../test/security_solution_endpoint_api_int) + +### Endpoint Functional Tests Location + +The endpoint functional tests are located [here](../../test/security_solution_endpoint) + +### Using Docker + +To run the tests using the recommended docker image version you must have `docker` installed. The testing infrastructure +will stand up a docker container using the image defined [here](../../test/ingest_manager_api_integration/config.ts#L15) + +Make sure you're in the Kibana root directory. + +#### Endpoint API Integration Tests + +In one terminal, run: + +```bash +INGEST_MANAGEMENT_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:server --config x-pack/test/security_solution_endpoint_api_int/config.ts +``` + +In another terminal, run: + +```bash +INGEST_MANAGEMENT_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:runner --config x-pack/test/security_solution_endpoint_api_int/config.ts +``` + +#### Endpoint Functional Tests + +In one terminal, run: + +```bash +INGEST_MANAGEMENT_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:server --config x-pack/test/security_solution_endpoint/config.ts +``` + +In another terminal, run: + +```bash +INGEST_MANAGEMENT_PACKAGE_REGISTRY_PORT=12345 yarn test:ftr:runner --config x-pack/test/security_solution_endpoint/config.ts +``` + +### Running your own package registry + +If you are doing endpoint package development it will be useful to run your own package registry to serve the latest package you're building. +To do this use the following commands: + +Make sure you're in the Kibana root directory. + +#### Endpoint API Integration Tests + +In one terminal, run: + +```bash +PACKAGE_REGISTRY_URL_OVERRIDE= yarn test:ftr:server --config x-pack/test/security_solution_endpoint_api_int/config.ts +``` + +In another terminal, run: + +```bash +PACKAGE_REGISTRY_URL_OVERRIDE= yarn test:ftr:runner --config x-pack/test/security_solution_endpoint_api_int/config.ts +``` + +#### Endpoint Functional Tests + +In one terminal, run: + +```bash +PACKAGE_REGISTRY_URL_OVERRIDE= yarn test:ftr:server --config x-pack/test/security_solution_endpoint/config.ts +``` + +In another terminal, run: + +```bash +PACKAGE_REGISTRY_URL_OVERRIDE= yarn test:ftr:runner --config x-pack/test/security_solution_endpoint/config.ts +``` + +### Using the default public registry + +If you don't have docker installed and don't want to run your own registry, you can run the tests using the ingest manager's default public package registry. The actual package registry used is [here](../../plugins/ingest_manager/common/constants/epm.ts#L9) + +Make sure you're in the Kibana root directory. + +#### Endpoint API Integration Tests + +In one terminal, run: + +```bash +yarn test:ftr:server --config x-pack/test/security_solution_endpoint_api_int/config.ts +``` + +In another terminal, run: + +```bash +yarn test:ftr:runner --config x-pack/test/security_solution_endpoint_api_int/config.ts +``` + +#### Endpoint Functional Tests + +In one terminal, run: + +```bash +yarn test:ftr:server --config x-pack/test/security_solution_endpoint/config.ts +``` + +In another terminal, run: + +```bash +yarn test:ftr:runner --config x-pack/test/security_solution_endpoint/config.ts +``` diff --git a/x-pack/scripts/functional_tests.js b/x-pack/scripts/functional_tests.js index c568b92e85515..eeff81d492d26 100644 --- a/x-pack/scripts/functional_tests.js +++ b/x-pack/scripts/functional_tests.js @@ -53,6 +53,7 @@ const onlyNotInCoverageTests = [ require.resolve('../test/licensing_plugin/config.legacy.ts'), require.resolve('../test/endpoint_api_integration_no_ingest/config.ts'), require.resolve('../test/reporting_api_integration/config.js'), + require.resolve('../test/security_solution_endpoint_api_int/config.ts'), require.resolve('../test/ingest_manager_api_integration/config.ts'), ]; diff --git a/x-pack/test/api_integration/apis/endpoint/index.ts b/x-pack/test/api_integration/apis/endpoint/index.ts deleted file mode 100644 index 5ada2bd094d4b..0000000000000 --- a/x-pack/test/api_integration/apis/endpoint/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default function endpointAPIIntegrationTests({ - loadTestFile, - getService, -}: FtrProviderContext) { - describe('Endpoint plugin', function () { - const ingestManager = getService('ingestManager'); - this.tags(['endpoint']); - before(async () => { - await ingestManager.setup(); - }); - loadTestFile(require.resolve('./resolver')); - loadTestFile(require.resolve('./metadata')); - loadTestFile(require.resolve('./policy')); - }); -} diff --git a/x-pack/test/api_integration/apis/index.js b/x-pack/test/api_integration/apis/index.js index 05b305ccd833f..23532d1311754 100644 --- a/x-pack/test/api_integration/apis/index.js +++ b/x-pack/test/api_integration/apis/index.js @@ -28,7 +28,6 @@ export default function ({ loadTestFile }) { loadTestFile(require.resolve('./lens')); loadTestFile(require.resolve('./ml')); loadTestFile(require.resolve('./transform')); - loadTestFile(require.resolve('./endpoint')); loadTestFile(require.resolve('./lists')); loadTestFile(require.resolve('./upgrade_assistant')); }); diff --git a/x-pack/test/api_integration/services/index.ts b/x-pack/test/api_integration/services/index.ts index 75cc2b451ea2e..7113e117582dd 100644 --- a/x-pack/test/api_integration/services/index.ts +++ b/x-pack/test/api_integration/services/index.ts @@ -27,7 +27,6 @@ import { InfraOpsSourceConfigurationProvider } from './infraops_source_configura import { InfraLogSourceConfigurationProvider } from './infra_log_source_configuration'; import { MachineLearningProvider } from './ml'; import { IngestManagerProvider } from '../../common/services/ingest_manager'; -import { ResolverGeneratorProvider } from './resolver'; import { TransformProvider } from './transform'; export const services = { @@ -48,6 +47,5 @@ export const services = { usageAPI: UsageAPIProvider, ml: MachineLearningProvider, ingestManager: IngestManagerProvider, - resolverGenerator: ResolverGeneratorProvider, transform: TransformProvider, }; diff --git a/x-pack/test/ingest_manager_api_integration/config.ts b/x-pack/test/ingest_manager_api_integration/config.ts index 2aa2e62a4b9e1..ddb49a09a7afa 100644 --- a/x-pack/test/ingest_manager_api_integration/config.ts +++ b/x-pack/test/ingest_manager_api_integration/config.ts @@ -9,6 +9,11 @@ import path from 'path'; import { FtrConfigProviderContext } from '@kbn/test/types/ftr'; import { defineDockerServersConfig } from '@kbn/test'; +// Docker image to use for Ingest Manager API integration tests. +// This hash comes from the commit hash here: https://github.com/elastic/package-storage/commit/48f3935a72b0c5aacc6fec8ef36d559b089a238b +export const dockerImage = + 'docker.elastic.co/package-registry/distribution:48f3935a72b0c5aacc6fec8ef36d559b089a238b'; + export default async function ({ readConfigFile }: FtrConfigProviderContext) { const xPackAPITestsConfig = await readConfigFile(require.resolve('../api_integration/config.ts')); @@ -29,10 +34,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { )}:/packages/test-packages`, ]; - // Docker image to use for Ingest Manager API integration tests. - const dockerImage = - 'docker.elastic.co/package-registry/distribution:184b85f19e8fd14363e36150173d338ff9659f01'; - return { testFiles: [require.resolve('./apis')], servers: xPackAPITestsConfig.get('servers'), diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts index 6971d9f523e7e..07667a140d090 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts @@ -6,7 +6,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -import { deleteMetadataStream } from '../../../api_integration/apis/endpoint/data_stream_helper'; +import { deleteMetadataStream } from '../../../security_solution_endpoint_api_int/apis/data_stream_helper'; export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'endpoint', 'header', 'endpointPageUtils']); diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts index bd933c9a136f2..eec3da4ce1c5e 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts @@ -3,12 +3,28 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { DEFAULT_REGISTRY_URL } from '../../../../plugins/ingest_manager/common'; import { FtrProviderContext } from '../../ftr_provider_context'; +import { + isRegistryEnabled, + getRegistryUrl, +} from '../../../security_solution_endpoint_api_int/registry'; + +export default function (providerContext: FtrProviderContext) { + const { loadTestFile, getService } = providerContext; -export default function ({ loadTestFile, getService }: FtrProviderContext) { describe('endpoint', function () { this.tags('ciGroup7'); const ingestManager = getService('ingestManager'); + const log = getService('log'); + + if (!isRegistryEnabled()) { + log.warning('These tests are being run with an external package registry'); + } + + const registryUrl = getRegistryUrl() ?? DEFAULT_REGISTRY_URL; + log.info(`Package registry URL for tests: ${registryUrl}`); + before(async () => { await ingestManager.setup(); }); diff --git a/x-pack/test/security_solution_endpoint/config.ts b/x-pack/test/security_solution_endpoint/config.ts index 2d94163fa1018..5aa5e42ffd4ee 100644 --- a/x-pack/test/security_solution_endpoint/config.ts +++ b/x-pack/test/security_solution_endpoint/config.ts @@ -8,6 +8,10 @@ import { resolve } from 'path'; import { FtrConfigProviderContext } from '@kbn/test/types/ftr'; import { pageObjects } from './page_objects'; import { services } from './services'; +import { + getRegistryUrlAsArray, + createEndpointDockerConfig, +} from '../security_solution_endpoint_api_int/registry'; export default async function ({ readConfigFile }: FtrConfigProviderContext) { const xpackFunctionalConfig = await readConfigFile(require.resolve('../functional/config.js')); @@ -16,6 +20,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { ...xpackFunctionalConfig.getAll(), pageObjects, testFiles: [resolve(__dirname, './apps/endpoint')], + dockerServers: createEndpointDockerConfig(), junit: { reportName: 'X-Pack Endpoint Functional Tests', }, @@ -31,6 +36,8 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { serverArgs: [ ...xpackFunctionalConfig.get('kbnTestServer.serverArgs'), '--xpack.ingestManager.enabled=true', + // if you return an empty string here the kibana server will not start properly but an empty array works + ...getRegistryUrlAsArray(), ], }, }; diff --git a/x-pack/test/api_integration/apis/endpoint/artifacts/index.ts b/x-pack/test/security_solution_endpoint_api_int/apis/artifacts/index.ts similarity index 98% rename from x-pack/test/api_integration/apis/endpoint/artifacts/index.ts rename to x-pack/test/security_solution_endpoint_api_int/apis/artifacts/index.ts index b37522ed52b5c..a4a8de418157f 100644 --- a/x-pack/test/api_integration/apis/endpoint/artifacts/index.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/artifacts/index.ts @@ -8,11 +8,8 @@ import expect from '@kbn/expect'; import { createHash } from 'crypto'; import { inflateSync } from 'zlib'; -import { FtrProviderContext } from '../../../ftr_provider_context'; -import { - getSupertestWithoutAuth, - setupIngest, -} from '../../../../ingest_manager_api_integration/apis/fleet/agents/services'; +import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; +import { getSupertestWithoutAuth } from '../../../ingest_manager_api_integration/apis/fleet/agents/services'; export default function (providerContext: FtrProviderContext) { const { getService } = providerContext; @@ -22,7 +19,6 @@ export default function (providerContext: FtrProviderContext) { let agentAccessAPIKey: string; describe('artifact download', () => { - setupIngest(providerContext); before(async () => { await esArchiver.load('endpoint/artifacts/api_feature', { useCreate: true }); diff --git a/x-pack/test/api_integration/apis/endpoint/data_stream_helper.ts b/x-pack/test/security_solution_endpoint_api_int/apis/data_stream_helper.ts similarity index 94% rename from x-pack/test/api_integration/apis/endpoint/data_stream_helper.ts rename to x-pack/test/security_solution_endpoint_api_int/apis/data_stream_helper.ts index b239ab41e41f1..b16da16b3137f 100644 --- a/x-pack/test/api_integration/apis/endpoint/data_stream_helper.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/data_stream_helper.ts @@ -10,7 +10,7 @@ import { eventsIndexPattern, alertsIndexPattern, policyIndexPattern, -} from '../../../../plugins/security_solution/common/endpoint/constants'; +} from '../../../plugins/security_solution/common/endpoint/constants'; export async function deleteDataStream(getService: (serviceName: 'es') => Client, index: string) { const client = getService('es'); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/fixtures/package_registry_config.yml b/x-pack/test/security_solution_endpoint_api_int/apis/fixtures/package_registry_config.yml new file mode 100644 index 0000000000000..4d93386b4d4e1 --- /dev/null +++ b/x-pack/test/security_solution_endpoint_api_int/apis/fixtures/package_registry_config.yml @@ -0,0 +1,2 @@ +package_paths: + - /packages/production diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/index.ts b/x-pack/test/security_solution_endpoint_api_int/apis/index.ts new file mode 100644 index 0000000000000..fb11a7c52fd35 --- /dev/null +++ b/x-pack/test/security_solution_endpoint_api_int/apis/index.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { FtrProviderContext } from '../ftr_provider_context'; +import { isRegistryEnabled, getRegistryUrl } from '../registry'; +import { DEFAULT_REGISTRY_URL } from '../../../plugins/ingest_manager/common'; + +export default function endpointAPIIntegrationTests(providerContext: FtrProviderContext) { + const { loadTestFile, getService } = providerContext; + + describe('Endpoint plugin', function () { + const ingestManager = getService('ingestManager'); + + this.tags('ciGroup7'); + const log = getService('log'); + + if (!isRegistryEnabled()) { + log.warning('These tests are being run with an external package registry'); + } + + const registryUrl = getRegistryUrl() ?? DEFAULT_REGISTRY_URL; + log.info(`Package registry URL for tests: ${registryUrl}`); + + before(async () => { + await ingestManager.setup(); + }); + loadTestFile(require.resolve('./resolver')); + loadTestFile(require.resolve('./metadata')); + loadTestFile(require.resolve('./policy')); + loadTestFile(require.resolve('./artifacts')); + }); +} diff --git a/x-pack/test/api_integration/apis/endpoint/metadata.ts b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts similarity index 99% rename from x-pack/test/api_integration/apis/endpoint/metadata.ts rename to x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts index 41531269ddeb9..719327e5f9b79 100644 --- a/x-pack/test/api_integration/apis/endpoint/metadata.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import expect from '@kbn/expect/expect.js'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; import { deleteMetadataStream } from './data_stream_helper'; /** diff --git a/x-pack/test/api_integration/apis/endpoint/policy.ts b/x-pack/test/security_solution_endpoint_api_int/apis/policy.ts similarity index 96% rename from x-pack/test/api_integration/apis/endpoint/policy.ts rename to x-pack/test/security_solution_endpoint_api_int/apis/policy.ts index e33423d172567..66bcc0e759916 100644 --- a/x-pack/test/api_integration/apis/endpoint/policy.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/policy.ts @@ -5,7 +5,7 @@ */ import expect from '@kbn/expect/expect.js'; -import { FtrProviderContext } from '../../ftr_provider_context'; +import { FtrProviderContext } from '../ftr_provider_context'; import { deletePolicyStream } from './data_stream_helper'; export default function ({ getService }: FtrProviderContext) { diff --git a/x-pack/test/api_integration/apis/endpoint/resolver.ts b/x-pack/test/security_solution_endpoint_api_int/apis/resolver.ts similarity index 98% rename from x-pack/test/api_integration/apis/endpoint/resolver.ts rename to x-pack/test/security_solution_endpoint_api_int/apis/resolver.ts index fa980aed30502..3b515f86c6761 100644 --- a/x-pack/test/api_integration/apis/endpoint/resolver.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/resolver.ts @@ -16,12 +16,12 @@ import { LegacyEndpointEvent, ResolverNodeStats, ResolverRelatedAlerts, -} from '../../../../plugins/security_solution/common/endpoint/types'; +} from '../../../plugins/security_solution/common/endpoint/types'; import { parentEntityId, eventId, -} from '../../../../plugins/security_solution/common/endpoint/models/event'; -import { FtrProviderContext } from '../../ftr_provider_context'; +} from '../../../plugins/security_solution/common/endpoint/models/event'; +import { FtrProviderContext } from '../ftr_provider_context'; import { Event, Tree, @@ -29,8 +29,8 @@ import { RelatedEventCategory, RelatedEventInfo, categoryMapping, -} from '../../../../plugins/security_solution/common/endpoint/generate_data'; -import { Options, GeneratedTrees } from '../../services/resolver'; +} from '../../../plugins/security_solution/common/endpoint/generate_data'; +import { Options, GeneratedTrees } from '../services/resolver'; /** * Check that the given lifecycle is in the resolver tree's corresponding map diff --git a/x-pack/test/security_solution_endpoint_api_int/config.ts b/x-pack/test/security_solution_endpoint_api_int/config.ts new file mode 100644 index 0000000000000..726059a8d73fe --- /dev/null +++ b/x-pack/test/security_solution_endpoint_api_int/config.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FtrConfigProviderContext } from '@kbn/test/types/ftr'; +import { createEndpointDockerConfig, getRegistryUrlAsArray } from './registry'; +import { services } from './services'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const xPackAPITestsConfig = await readConfigFile(require.resolve('../api_integration/config.ts')); + + return { + ...xPackAPITestsConfig.getAll(), + testFiles: [require.resolve('./apis')], + dockerServers: createEndpointDockerConfig(), + services, + junit: { + reportName: 'X-Pack Endpoint API Integration Tests', + }, + kbnTestServer: { + ...xPackAPITestsConfig.get('kbnTestServer'), + serverArgs: [ + ...xPackAPITestsConfig.get('kbnTestServer.serverArgs'), + // if you return an empty string here the kibana server will not start properly but an empty array works + ...getRegistryUrlAsArray(), + ], + }, + }; +} diff --git a/x-pack/test/security_solution_endpoint_api_int/ftr_provider_context.d.ts b/x-pack/test/security_solution_endpoint_api_int/ftr_provider_context.d.ts new file mode 100644 index 0000000000000..e3add3748f56d --- /dev/null +++ b/x-pack/test/security_solution_endpoint_api_int/ftr_provider_context.d.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { GenericFtrProviderContext } from '@kbn/test/types/ftr'; + +import { services } from './services'; + +export type FtrProviderContext = GenericFtrProviderContext; diff --git a/x-pack/test/security_solution_endpoint_api_int/registry.ts b/x-pack/test/security_solution_endpoint_api_int/registry.ts new file mode 100644 index 0000000000000..cc474cbf29aaf --- /dev/null +++ b/x-pack/test/security_solution_endpoint_api_int/registry.ts @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import path from 'path'; + +import { defineDockerServersConfig } from '@kbn/test'; +import { dockerImage as ingestDockerImage } from '../ingest_manager_api_integration/config'; + +/** + * This is used by CI to set the docker registry port + * you can also define this environment variable locally when running tests which + * will spin up a local docker package registry locally for you + * if this is defined it takes precedence over the `packageRegistryOverride` variable + */ +const dockerRegistryPort: string | undefined = process.env.INGEST_MANAGEMENT_PACKAGE_REGISTRY_PORT; + +/** + * If you don't want to use the docker image version pinned below and instead want to run your own + * registry or use an external registry you can define this environment variable when running + * the tests to use that registry url instead. + * + * This is particularly useful when a developer needs to test a new package against the kibana + * integration or functional tests. Instead of having to publish a whole new docker image we + * can set this environment variable which will point to the location of where your package registry + * is serving the updated package. + * + * This variable will not and should not be used by CI. CI should always use the pinned docker image below. + */ +const packageRegistryOverride: string | undefined = process.env.PACKAGE_REGISTRY_URL_OVERRIDE; + +const defaultRegistryConfigPath = path.join( + __dirname, + './apis/fixtures/package_registry_config.yml' +); + +export function createEndpointDockerConfig( + packageRegistryConfig: string = defaultRegistryConfigPath, + dockerImage: string = ingestDockerImage, + dockerArgs: string[] = [] +) { + const args: string[] = [ + '-v', + `${packageRegistryConfig}:/package-registry/config.yml`, + ...dockerArgs, + ]; + return defineDockerServersConfig({ + registry: { + enabled: !!dockerRegistryPort, + image: dockerImage, + portInContainer: 8080, + port: dockerRegistryPort, + args, + waitForLogLine: 'package manifests loaded', + }, + }); +} + +export function getRegistryUrl(): string | undefined { + let registryUrl: string | undefined; + if (dockerRegistryPort !== undefined) { + registryUrl = `--xpack.ingestManager.registryUrl=http://localhost:${dockerRegistryPort}`; + } else if (packageRegistryOverride !== undefined) { + registryUrl = `--xpack.ingestManager.registryUrl=${packageRegistryOverride}`; + } + return registryUrl; +} + +export function getRegistryUrlAsArray(): string[] { + const registryUrl: string | undefined = getRegistryUrl(); + return registryUrl !== undefined ? [registryUrl] : []; +} + +export function isRegistryEnabled() { + return getRegistryUrl() !== undefined; +} diff --git a/x-pack/test/security_solution_endpoint_api_int/services/index.ts b/x-pack/test/security_solution_endpoint_api_int/services/index.ts new file mode 100644 index 0000000000000..47d45557022d3 --- /dev/null +++ b/x-pack/test/security_solution_endpoint_api_int/services/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { services as xPackAPIServices } from '../../api_integration/services'; +import { ResolverGeneratorProvider } from './resolver'; + +export const services = { + ...xPackAPIServices, + resolverGenerator: ResolverGeneratorProvider, +}; diff --git a/x-pack/test/api_integration/services/resolver.ts b/x-pack/test/security_solution_endpoint_api_int/services/resolver.ts similarity index 100% rename from x-pack/test/api_integration/services/resolver.ts rename to x-pack/test/security_solution_endpoint_api_int/services/resolver.ts From 34fd7b301d3e1b3eec0eac6b2ce33d02e93166b9 Mon Sep 17 00:00:00 2001 From: Marshall Main <55718608+marshallmain@users.noreply.github.com> Date: Mon, 27 Jul 2020 14:17:19 -0400 Subject: [PATCH 022/126] Increase limit on exception items to 10k (#73117) Co-authored-by: Elastic Machine --- .../server/lib/detection_engine/signals/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts index 1c59a4b7ea5d0..90373ee676121 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts @@ -183,7 +183,7 @@ export const getExceptions = async ({ listId: foundList.list_id, namespaceType, page: 1, - perPage: 5000, + perPage: 10000, filter: undefined, sortOrder: undefined, sortField: undefined, From 7c24a61c435099acfe751b0379a8092df4d5b5e3 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Mon, 27 Jul 2020 15:19:42 -0400 Subject: [PATCH 023/126] Make ingest node pipelines api tests more robust (#73289) --- .../ingest_pipelines/ingest_pipelines.ts | 90 +++++++++++++------ .../ingest_pipelines/lib/elasticsearch.ts | 21 ++++- 2 files changed, 82 insertions(+), 29 deletions(-) diff --git a/x-pack/test/api_integration/apis/management/ingest_pipelines/ingest_pipelines.ts b/x-pack/test/api_integration/apis/management/ingest_pipelines/ingest_pipelines.ts index 6a827298521dd..b3fab42a46114 100644 --- a/x-pack/test/api_integration/apis/management/ingest_pipelines/ingest_pipelines.ts +++ b/x-pack/test/api_integration/apis/management/ingest_pipelines/ingest_pipelines.ts @@ -14,16 +14,26 @@ const API_BASE_PATH = '/api/ingest_pipelines'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); - const { createPipeline, deletePipeline } = registerEsHelpers(getService); + const { createPipeline, deletePipeline, cleanupPipelines } = registerEsHelpers(getService); + + describe('Pipelines', function () { + after(async () => { + await cleanupPipelines(); + }); - describe.skip('Pipelines', function () { describe('Create', () => { const PIPELINE_ID = 'test_create_pipeline'; const REQUIRED_FIELDS_PIPELINE_ID = 'test_create_required_fields_pipeline'; - after(() => { - deletePipeline(PIPELINE_ID); - deletePipeline(REQUIRED_FIELDS_PIPELINE_ID); + after(async () => { + // Clean up any pipelines created in test cases + await Promise.all([PIPELINE_ID, REQUIRED_FIELDS_PIPELINE_ID].map(deletePipeline)).catch( + (err) => { + // eslint-disable-next-line no-console + console.log(`[Cleanup error] Error deleting pipelines: ${err.message}`); + throw err; + } + ); }); it('should create a pipeline', async () => { @@ -127,8 +137,16 @@ export default function ({ getService }: FtrProviderContext) { ], }; - before(() => createPipeline({ body: PIPELINE, id: PIPELINE_ID })); - after(() => deletePipeline(PIPELINE_ID)); + before(async () => { + // Create pipeline that can be used to test PUT request + try { + await createPipeline({ body: PIPELINE, id: PIPELINE_ID }, true); + } catch (err) { + // eslint-disable-next-line no-console + console.log('[Setup error] Error creating ingest node pipeline'); + throw err; + } + }); it('should allow an existing pipeline to be updated', async () => { const uri = `${API_BASE_PATH}/${PIPELINE_ID}`; @@ -185,7 +203,7 @@ export default function ({ getService }: FtrProviderContext) { }); describe('Get', () => { - const PIPELINE_ID = 'test_pipeline'; + const PIPELINE_ID = 'test_get_pipeline'; const PIPELINE = { description: 'test pipeline description', processors: [ @@ -198,8 +216,16 @@ export default function ({ getService }: FtrProviderContext) { version: 1, }; - before(() => createPipeline({ body: PIPELINE, id: PIPELINE_ID })); - after(() => deletePipeline(PIPELINE_ID)); + before(async () => { + // Create pipeline that can be used to test GET request + try { + await createPipeline({ body: PIPELINE, id: PIPELINE_ID }, true); + } catch (err) { + // eslint-disable-next-line no-console + console.log('[Setup error] Error creating ingest node pipeline'); + throw err; + } + }); describe('all pipelines', () => { it('should return an array of pipelines', async () => { @@ -245,29 +271,40 @@ export default function ({ getService }: FtrProviderContext) { version: 1, }; + const pipelineA = { body: PIPELINE, id: 'test_delete_pipeline_a' }; + const pipelineB = { body: PIPELINE, id: 'test_delete_pipeline_b' }; + const pipelineC = { body: PIPELINE, id: 'test_delete_pipeline_c' }; + const pipelineD = { body: PIPELINE, id: 'test_delete_pipeline_d' }; + + before(async () => { + // Create several pipelines that can be used to test deletion + await Promise.all( + [pipelineA, pipelineB, pipelineC, pipelineD].map((pipeline) => createPipeline(pipeline)) + ).catch((err) => { + // eslint-disable-next-line no-console + console.log(`[Setup error] Error creating pipelines: ${err.message}`); + throw err; + }); + }); + it('should delete a pipeline', async () => { - // Create pipeline to be deleted - const PIPELINE_ID = 'test_delete_pipeline'; - createPipeline({ body: PIPELINE, id: PIPELINE_ID }); + const { id } = pipelineA; - const uri = `${API_BASE_PATH}/${PIPELINE_ID}`; + const uri = `${API_BASE_PATH}/${id}`; const { body } = await supertest.delete(uri).set('kbn-xsrf', 'xxx').expect(200); expect(body).to.eql({ - itemsDeleted: [PIPELINE_ID], + itemsDeleted: [id], errors: [], }); }); it('should delete multiple pipelines', async () => { - // Create pipelines to be deleted - const PIPELINE_ONE_ID = 'test_delete_pipeline_1'; - const PIPELINE_TWO_ID = 'test_delete_pipeline_2'; - createPipeline({ body: PIPELINE, id: PIPELINE_ONE_ID }); - createPipeline({ body: PIPELINE, id: PIPELINE_TWO_ID }); + const { id: pipelineBId } = pipelineB; + const { id: pipelineCId } = pipelineC; - const uri = `${API_BASE_PATH}/${PIPELINE_ONE_ID},${PIPELINE_TWO_ID}`; + const uri = `${API_BASE_PATH}/${pipelineBId},${pipelineCId}`; const { body: { itemsDeleted, errors }, @@ -276,24 +313,21 @@ export default function ({ getService }: FtrProviderContext) { expect(errors).to.eql([]); // The itemsDeleted array order isn't guaranteed, so we assert against each pipeline name instead - [PIPELINE_ONE_ID, PIPELINE_TWO_ID].forEach((pipelineName) => { + [pipelineBId, pipelineCId].forEach((pipelineName) => { expect(itemsDeleted.includes(pipelineName)).to.be(true); }); }); it('should return an error for any pipelines not sucessfully deleted', async () => { const PIPELINE_DOES_NOT_EXIST = 'pipeline_does_not_exist'; + const { id: existingPipelineId } = pipelineD; - // Create pipeline to be deleted - const PIPELINE_ONE_ID = 'test_delete_pipeline_1'; - createPipeline({ body: PIPELINE, id: PIPELINE_ONE_ID }); - - const uri = `${API_BASE_PATH}/${PIPELINE_ONE_ID},${PIPELINE_DOES_NOT_EXIST}`; + const uri = `${API_BASE_PATH}/${existingPipelineId},${PIPELINE_DOES_NOT_EXIST}`; const { body } = await supertest.delete(uri).set('kbn-xsrf', 'xxx').expect(200); expect(body).to.eql({ - itemsDeleted: [PIPELINE_ONE_ID], + itemsDeleted: [existingPipelineId], errors: [ { name: PIPELINE_DOES_NOT_EXIST, diff --git a/x-pack/test/api_integration/apis/management/ingest_pipelines/lib/elasticsearch.ts b/x-pack/test/api_integration/apis/management/ingest_pipelines/lib/elasticsearch.ts index 2f42596a66b54..6de91e1154a85 100644 --- a/x-pack/test/api_integration/apis/management/ingest_pipelines/lib/elasticsearch.ts +++ b/x-pack/test/api_integration/apis/management/ingest_pipelines/lib/elasticsearch.ts @@ -26,14 +26,33 @@ interface Pipeline { * @param {ElasticsearchClient} es The Elasticsearch client instance */ export const registerEsHelpers = (getService: FtrProviderContext['getService']) => { + let pipelinesCreated: string[] = []; + const es = getService('legacyEs'); - const createPipeline = (pipeline: Pipeline) => es.ingest.putPipeline(pipeline); + const createPipeline = (pipeline: Pipeline, cachePipeline?: boolean) => { + if (cachePipeline) { + pipelinesCreated.push(pipeline.id); + } + + return es.ingest.putPipeline(pipeline); + }; const deletePipeline = (pipelineId: string) => es.ingest.deletePipeline({ id: pipelineId }); + const cleanupPipelines = () => + Promise.all(pipelinesCreated.map(deletePipeline)) + .then(() => { + pipelinesCreated = []; + }) + .catch((err) => { + // eslint-disable-next-line no-console + console.log(`[Cleanup error] Error deleting ES resources: ${err.message}`); + }); + return { createPipeline, deletePipeline, + cleanupPipelines, }; }; From f23359c099ece3807f68b9b8ab24a72ff005d911 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 27 Jul 2020 14:20:26 -0500 Subject: [PATCH 024/126] [APM] Fix license management URL (#73294) The URL to license management has changed, so update our links, both in the prompt on the Service Map, and in the app-wide expired license message. Use `useKibanaUrl` in both places and update that hook to make the `hash` argument optional, since many apps don't use a hash now. I looked for a more reliable way to get the URL for that app but couldn't come up with anything. I'd appreciate any suggestions if there's a better method. --- .../apm/public/components/shared/LicensePrompt/index.tsx | 3 +-- .../context/LicenseContext/InvalidLicenseNotification.tsx | 5 ++--- x-pack/plugins/apm/public/hooks/useKibanaUrl.ts | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/apm/public/components/shared/LicensePrompt/index.tsx b/x-pack/plugins/apm/public/components/shared/LicensePrompt/index.tsx index 50be268d9ccd0..8409326243614 100644 --- a/x-pack/plugins/apm/public/components/shared/LicensePrompt/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/LicensePrompt/index.tsx @@ -16,8 +16,7 @@ interface Props { export function LicensePrompt({ text, showBetaBadge = false }: Props) { const licensePageUrl = useKibanaUrl( - '/app/kibana', - '/management/stack/license_management/home' + '/app/management/stack/license_management' ); const renderLicenseBody = ( diff --git a/x-pack/plugins/apm/public/context/LicenseContext/InvalidLicenseNotification.tsx b/x-pack/plugins/apm/public/context/LicenseContext/InvalidLicenseNotification.tsx index 481e89e09685e..1195038a6b753 100644 --- a/x-pack/plugins/apm/public/context/LicenseContext/InvalidLicenseNotification.tsx +++ b/x-pack/plugins/apm/public/context/LicenseContext/InvalidLicenseNotification.tsx @@ -6,11 +6,10 @@ import { EuiButton, EuiEmptyPrompt } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; -import { useApmPluginContext } from '../../hooks/useApmPluginContext'; +import { useKibanaUrl } from '../../hooks/useKibanaUrl'; export function InvalidLicenseNotification() { - const { core } = useApmPluginContext(); - const manageLicenseURL = core.http.basePath.prepend( + const manageLicenseURL = useKibanaUrl( '/app/management/stack/license_management' ); diff --git a/x-pack/plugins/apm/public/hooks/useKibanaUrl.ts b/x-pack/plugins/apm/public/hooks/useKibanaUrl.ts index 186a752f52487..b4a354c231633 100644 --- a/x-pack/plugins/apm/public/hooks/useKibanaUrl.ts +++ b/x-pack/plugins/apm/public/hooks/useKibanaUrl.ts @@ -9,7 +9,7 @@ import { useApmPluginContext } from './useApmPluginContext'; export function useKibanaUrl( /** The path to the plugin */ path: string, - /** The hash path */ hash: string + /** The hash path */ hash?: string ) { const { core } = useApmPluginContext(); return url.format({ From 1c690c68af6ea05248ca04b259fb1f01970a044c Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Mon, 27 Jul 2020 15:39:52 -0400 Subject: [PATCH 025/126] [Uptime] Increase timeout in attempt to fix skipped a11y test (#73078) * Increase timeout in attempt to fix skipped a11y test. * Temporarily only run uptime tests for faster flaky testing. * Uncomment other test suites. * Unskip test and delete comment. Co-authored-by: Elastic Machine --- x-pack/test/accessibility/apps/uptime.ts | 3 +-- x-pack/test/functional/services/uptime/navigation.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/x-pack/test/accessibility/apps/uptime.ts b/x-pack/test/accessibility/apps/uptime.ts index e6ef1cfe8cfe2..ebd120fa0feea 100644 --- a/x-pack/test/accessibility/apps/uptime.ts +++ b/x-pack/test/accessibility/apps/uptime.ts @@ -17,8 +17,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const es = getService('es'); - // FLAKY: https://github.com/elastic/kibana/issues/72994 - describe.skip('uptime', () => { + describe('uptime', () => { before(async () => { await esArchiver.load('uptime/blank'); await makeChecks(es, A11Y_TEST_MONITOR_ID, 150, 1, 1000, { diff --git a/x-pack/test/functional/services/uptime/navigation.ts b/x-pack/test/functional/services/uptime/navigation.ts index f8e0c0cff41f4..ab511abf130a5 100644 --- a/x-pack/test/functional/services/uptime/navigation.ts +++ b/x-pack/test/functional/services/uptime/navigation.ts @@ -41,7 +41,7 @@ export function UptimeNavigationProvider({ getService, getPageObjects }: FtrProv goToSettings: async () => { await goToUptimeRoot(); await testSubjects.click('settings-page-link', 5000); - await testSubjects.existOrFail('uptimeSettingsPage', { timeout: 2000 }); + await testSubjects.existOrFail('uptimeSettingsPage', { timeout: 10000 }); }, checkIfOnMonitorPage: async (monitorId: string) => { From 2ae470e897976abb939c31708bff41fd0d0dcd07 Mon Sep 17 00:00:00 2001 From: Scotty Bollinger Date: Mon, 27 Jul 2020 16:04:10 -0500 Subject: [PATCH 026/126] Add Kea.js support to Enterprise Search plugin (#72160) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add Kea packages - kea and kea-waitfor * Add Kea declarations and types Hopefully TypeScript support coming soon from author * Add Kea to entry point * Add logic for overview * Update components to use Kea * Fix a couple of tests that weren’t getting complete coverage * Remove kea-waitfor Turns out we don’t need it * Remove unused declaration * Update x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview_logic.ts Co-authored-by: Constance * Update x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview_logic.ts Co-authored-by: Constance * Update x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/__mocks__/overview_logic.mock.ts Co-authored-by: Constance * Update x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview_logic.test.ts Co-authored-by: Constance * [Opinionated] Remove extra actions defs - they're already being defined in IOverviewActions, so no need to repeat them * DRY out a new reusable/generics IKeaLogic/Listeners interface - Multiple logic files can now do IKeaListeners and not have to declare their own IListenerParams! + bonus IKeaSelectors just for consistency * DRY out Kea reducers definitions to generics interface * [Refactor] Improve KeaReducers generic to actually type-check/check key names - Typescript will now throw an error if you put in a key name that isn't declared in your actions/values interface - default & new states now will be type checked!! :tada: * [Refactor] Update selectors() and listeners() to also check types and keys * [Refactor] Move param defs to bottom of file instead of inline - so that inline definitions mostly focus on type checks, and more boilerplate defs are DRYed out - I played around with 2.1 obj definitions and got terrible results here :( * Update tests and remove selectors per code review * Remove last statsColumns instance * Remove last instance of hideOnboarding Co-authored-by: Constance Co-authored-by: Constance Chen Co-authored-by: Elastic Machine --- x-pack/package.json | 3 +- .../public/applications/kea.d.ts | 13 ++ .../public/applications/shared/types.ts | 56 ++++++ .../components/overview/__mocks__/index.ts | 7 + .../overview/__mocks__/overview_logic.mock.ts | 47 +++++ .../overview/onboarding_steps.test.tsx | 77 ++++---- .../components/overview/onboarding_steps.tsx | 27 +-- .../overview/organization_stats.test.tsx | 8 +- .../overview/organization_stats.tsx | 115 ++++++------ .../components/overview/overview.test.tsx | 45 +++-- .../components/overview/overview.tsx | 97 ++-------- .../overview/overview_logic.test.ts | 141 +++++++++++++++ .../components/overview/overview_logic.ts | 168 ++++++++++++++++++ .../overview/recent_activity.test.tsx | 21 ++- .../components/overview/recent_activity.tsx | 13 +- .../content_section/content_section.test.tsx | 3 +- .../view_content_header.test.tsx | 3 +- .../applications/workplace_search/index.tsx | 11 +- .../applications/workplace_search/types.ts | 11 ++ yarn.lock | 5 + 20 files changed, 634 insertions(+), 237 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/kea.d.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/__mocks__/index.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/__mocks__/overview_logic.mock.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview_logic.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview_logic.ts diff --git a/x-pack/package.json b/x-pack/package.json index d1f638ccad8d0..dee99d6f0ddac 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -282,6 +282,7 @@ "json-stable-stringify": "^1.0.1", "jsonwebtoken": "^8.5.1", "jsts": "^1.6.2", + "kea": "^2.0.1", "lodash": "^4.17.15", "lz-string": "^1.4.4", "mapbox-gl": "^1.10.0", @@ -384,4 +385,4 @@ "cypress-multi-reporters" ] } -} \ No newline at end of file +} diff --git a/x-pack/plugins/enterprise_search/public/applications/kea.d.ts b/x-pack/plugins/enterprise_search/public/applications/kea.d.ts new file mode 100644 index 0000000000000..961d93ccc12e6 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/kea.d.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +declare module 'kea' { + export function useValues(logic?: object): object; + export function useActions(logic?: object): object; + export function getContext(): { store: object }; + export function resetContext(context: object): object; + export function kea(logic: object): object; +} diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/types.ts b/x-pack/plugins/enterprise_search/public/applications/shared/types.ts index 3f28710d92295..74bb53ef3a954 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/types.ts @@ -12,3 +12,59 @@ export interface IFlashMessagesProps { isWrapped?: boolean; children?: React.ReactNode; } + +export interface IKeaLogic { + mount(): void; + values: IKeaValues; + actions: IKeaActions; +} + +/** + * This reusable interface mostly saves us a few characters / allows us to skip + * defining params inline. Unfortunately, the return values *do not work* as + * expected (hence the voids). While I can tell selectors to use TKeaSelectors, + * the return value is *not* properly type checked if it's not declared inline. :/ + * + * Also note that if you switch to Kea 2.1's plain object notation - + * `selectors: {}` vs. `selectors: () => ({})` + * - type checking also stops working and type errors become significantly less + * helpful - showing less specific error messages and highlighting. 👎 + */ +export interface IKeaParams { + selectors?(params: { selectors: IKeaValues }): void; + listeners?(params: { actions: IKeaActions; values: IKeaValues }): void; +} + +/** + * This reducers() type checks that: + * + * 1. The value object keys are defined within IKeaValues + * 2. The default state (array[0]) matches the type definition within IKeaValues + * 3. The action object keys (array[1]) are defined within IKeaActions + * 3. The new state returned by the action matches the type definition within IKeaValues + */ +export type TKeaReducers = { + [Value in keyof IKeaValues]?: [ + IKeaValues[Value], + { + [Action in keyof IKeaActions]?: (state: IKeaValues, payload: IKeaValues) => IKeaValues[Value]; + } + ]; +}; + +/** + * This selectors() type checks that: + * + * 1. The object keys are defined within IKeaValues + * 2. The selected values are defined within IKeaValues + * 3. The returned value match the type definition within IKeaValues + * + * The unknown[] and any[] are unfortunately because I have no idea how to + * assert for arbitrary type/values as an array + */ +export type TKeaSelectors = { + [Value in keyof IKeaValues]?: [ + (selectors: IKeaValues) => unknown[], + (...args: any[]) => IKeaValues[Value] // eslint-disable-line @typescript-eslint/no-explicit-any + ]; +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/__mocks__/index.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/__mocks__/index.ts new file mode 100644 index 0000000000000..e5169a51ce522 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/__mocks__/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { setMockValues, mockLogicValues, mockLogicActions } from './overview_logic.mock'; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/__mocks__/overview_logic.mock.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/__mocks__/overview_logic.mock.ts new file mode 100644 index 0000000000000..43cff5de6668d --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/__mocks__/overview_logic.mock.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { IOverviewValues } from '../overview_logic'; +import { IAccount, IOrganization, IUser } from '../../../types'; + +export const mockLogicValues = { + accountsCount: 0, + activityFeed: [], + canCreateContentSources: false, + canCreateInvitations: false, + currentUser: {} as IUser, + fpAccount: {} as IAccount, + hasOrgSources: false, + hasUsers: false, + isFederatedAuth: true, + isOldAccount: false, + organization: {} as IOrganization, + pendingInvitationsCount: 0, + personalSourcesCount: 0, + sourcesCount: 0, + dataLoading: true, + hasErrorConnecting: false, + flashMessages: {}, +} as IOverviewValues; + +export const mockLogicActions = { + initializeOverview: jest.fn(() => ({})), +}; + +jest.mock('kea', () => ({ + ...(jest.requireActual('kea') as object), + useActions: jest.fn(() => ({ ...mockLogicActions })), + useValues: jest.fn(() => ({ ...mockLogicValues })), +})); + +import { useValues } from 'kea'; + +export const setMockValues = (values: object) => { + (useValues as jest.Mock).mockImplementationOnce(() => ({ + ...mockLogicValues, + ...values, + })); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/onboarding_steps.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/onboarding_steps.test.tsx index 6174dc1c795eb..3cf88cf120cc4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/onboarding_steps.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/onboarding_steps.test.tsx @@ -5,6 +5,8 @@ */ import '../../../__mocks__/shallow_usecontext.mock'; +import './__mocks__/overview_logic.mock'; +import { setMockValues } from './__mocks__'; import React from 'react'; import { shallow } from 'enzyme'; @@ -16,7 +18,6 @@ import { sendTelemetry } from '../../../shared/telemetry'; import { OnboardingSteps, OrgNameOnboarding } from './onboarding_steps'; import { OnboardingCard } from './onboarding_card'; -import { defaultServerData } from './overview'; const account = { id: '1', @@ -30,7 +31,8 @@ const account = { describe('OnboardingSteps', () => { describe('Shared Sources', () => { it('renders 0 sources state', () => { - const wrapper = shallow(); + setMockValues({ canCreateContentSources: true }); + const wrapper = shallow(); expect(wrapper.find(OnboardingCard)).toHaveLength(1); expect(wrapper.find(OnboardingCard).prop('actionPath')).toBe(ORG_SOURCES_PATH); @@ -40,9 +42,8 @@ describe('OnboardingSteps', () => { }); it('renders completed sources state', () => { - const wrapper = shallow( - - ); + setMockValues({ sourcesCount: 2, hasOrgSources: true }); + const wrapper = shallow(); expect(wrapper.find(OnboardingCard).prop('description')).toEqual( 'You have added 2 shared sources. Happy searching.' @@ -50,9 +51,8 @@ describe('OnboardingSteps', () => { }); it('disables link when the user cannot create sources', () => { - const wrapper = shallow( - - ); + setMockValues({ canCreateContentSources: false }); + const wrapper = shallow(); expect(wrapper.find(OnboardingCard).prop('actionPath')).toBe(undefined); }); @@ -60,15 +60,14 @@ describe('OnboardingSteps', () => { describe('Users & Invitations', () => { it('renders 0 users when not on federated auth', () => { - const wrapper = shallow( - - ); + setMockValues({ + canCreateInvitations: true, + isFederatedAuth: false, + fpAccount: account, + accountsCount: 0, + hasUsers: false, + }); + const wrapper = shallow(); expect(wrapper.find(OnboardingCard)).toHaveLength(2); expect(wrapper.find(OnboardingCard).last().prop('actionPath')).toBe(USERS_PATH); @@ -78,15 +77,13 @@ describe('OnboardingSteps', () => { }); it('renders completed users state', () => { - const wrapper = shallow( - - ); + setMockValues({ + isFederatedAuth: false, + fpAccount: account, + accountsCount: 1, + hasUsers: true, + }); + const wrapper = shallow(); expect(wrapper.find(OnboardingCard).last().prop('description')).toEqual( 'Nice, you’ve invited colleagues to search with you.' @@ -94,21 +91,15 @@ describe('OnboardingSteps', () => { }); it('disables link when the user cannot create invitations', () => { - const wrapper = shallow( - - ); - + setMockValues({ isFederatedAuth: false, canCreateInvitations: false }); + const wrapper = shallow(); expect(wrapper.find(OnboardingCard).last().prop('actionPath')).toBe(undefined); }); }); describe('Org Name', () => { it('renders button to change name', () => { - const wrapper = shallow(); + const wrapper = shallow(); const button = wrapper .find(OrgNameOnboarding) @@ -120,15 +111,13 @@ describe('OnboardingSteps', () => { }); it('hides card when name has been changed', () => { - const wrapper = shallow( - - ); + setMockValues({ + organization: { + name: 'foo', + defaultOrgName: 'bar', + }, + }); + const wrapper = shallow(); expect(wrapper.find(OrgNameOnboarding)).toHaveLength(0); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/onboarding_steps.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/onboarding_steps.tsx index 1b00347437338..7fe1eae502329 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/onboarding_steps.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/onboarding_steps.tsx @@ -7,6 +7,7 @@ import React, { useContext } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; +import { useValues } from 'kea'; import { EuiSpacer, @@ -28,7 +29,7 @@ import { ORG_SOURCES_PATH, USERS_PATH, ORG_SETTINGS_PATH } from '../../routes'; import { ContentSection } from '../shared/content_section'; -import { IAppServerData } from './overview'; +import { OverviewLogic, IOverviewValues } from './overview_logic'; import { OnboardingCard } from './onboarding_card'; @@ -57,17 +58,19 @@ const ONBOARDING_USERS_CARD_DESCRIPTION = i18n.translate( { defaultMessage: 'Invite your colleagues into this organization to search with you.' } ); -export const OnboardingSteps: React.FC = ({ - hasUsers, - hasOrgSources, - canCreateContentSources, - canCreateInvitations, - accountsCount, - sourcesCount, - fpAccount: { isCurated }, - organization: { name, defaultOrgName }, - isFederatedAuth, -}) => { +export const OnboardingSteps: React.FC = () => { + const { + hasUsers, + hasOrgSources, + canCreateContentSources, + canCreateInvitations, + accountsCount, + sourcesCount, + fpAccount: { isCurated }, + organization: { name, defaultOrgName }, + isFederatedAuth, + } = useValues(OverviewLogic) as IOverviewValues; + const accountsPath = !isFederatedAuth && (canCreateInvitations || isCurated) ? USERS_PATH : undefined; const sourcesPath = canCreateContentSources || isCurated ? ORG_SOURCES_PATH : undefined; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/organization_stats.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/organization_stats.test.tsx index 112e9a910667a..d9b05c5da777d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/organization_stats.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/organization_stats.test.tsx @@ -5,6 +5,8 @@ */ import '../../../__mocks__/shallow_usecontext.mock'; +import './__mocks__/overview_logic.mock'; +import { setMockValues } from './__mocks__'; import React from 'react'; import { shallow } from 'enzyme'; @@ -12,18 +14,18 @@ import { EuiFlexGrid } from '@elastic/eui'; import { OrganizationStats } from './organization_stats'; import { StatisticCard } from './statistic_card'; -import { defaultServerData } from './overview'; describe('OrganizationStats', () => { it('renders', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find(StatisticCard)).toHaveLength(2); expect(wrapper.find(EuiFlexGrid).prop('columns')).toEqual(2); }); it('renders additional cards for federated auth', () => { - const wrapper = shallow(); + setMockValues({ isFederatedAuth: false }); + const wrapper = shallow(); expect(wrapper.find(StatisticCard)).toHaveLength(4); expect(wrapper.find(EuiFlexGrid).prop('columns')).toEqual(4); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/organization_stats.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/organization_stats.tsx index aa9be81f32bae..4c5efce9baf12 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/organization_stats.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/organization_stats.tsx @@ -6,6 +6,7 @@ import React from 'react'; import { EuiFlexGrid } from '@elastic/eui'; +import { useValues } from 'kea'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; @@ -13,62 +14,66 @@ import { i18n } from '@kbn/i18n'; import { ContentSection } from '../shared/content_section'; import { ORG_SOURCES_PATH, USERS_PATH } from '../../routes'; -import { IAppServerData } from './overview'; +import { OverviewLogic, IOverviewValues } from './overview_logic'; import { StatisticCard } from './statistic_card'; -export const OrganizationStats: React.FC = ({ - sourcesCount, - pendingInvitationsCount, - accountsCount, - personalSourcesCount, - isFederatedAuth, -}) => ( - - } - headerSpacer="m" - > - - - {!isFederatedAuth && ( - <> - - - - )} - { + const { + sourcesCount, + pendingInvitationsCount, + accountsCount, + personalSourcesCount, + isFederatedAuth, + } = useValues(OverviewLogic) as IOverviewValues; + + return ( + + } + headerSpacer="m" + > + + + {!isFederatedAuth && ( + <> + + + )} - count={personalSourcesCount} - /> - - -); + + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview.test.tsx index e5e5235c52368..744fd8aeb1951 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview.test.tsx @@ -5,11 +5,11 @@ */ import '../../../__mocks__/react_router_history.mock'; +import './__mocks__/overview_logic.mock'; +import { mockLogicActions, setMockValues } from './__mocks__'; import React from 'react'; -import { shallow } from 'enzyme'; - -import { mountWithAsyncContext, mockKibanaContext } from '../../../__mocks__'; +import { shallow, mount } from 'enzyme'; import { ErrorState } from '../error_state'; import { Loading } from '../shared/loading'; @@ -18,11 +18,9 @@ import { ViewContentHeader } from '../shared/view_content_header'; import { OnboardingSteps } from './onboarding_steps'; import { OrganizationStats } from './organization_stats'; import { RecentActivity } from './recent_activity'; -import { Overview, defaultServerData } from './overview'; +import { Overview } from './overview'; describe('Overview', () => { - const mockHttp = mockKibanaContext.http; - describe('non-happy-path states', () => { it('isLoading', () => { const wrapper = shallow(); @@ -30,24 +28,24 @@ describe('Overview', () => { expect(wrapper.find(Loading)).toHaveLength(1); }); - it('hasErrorConnecting', async () => { - const wrapper = await mountWithAsyncContext(, { - http: { - ...mockHttp, - get: () => Promise.reject({ invalidPayload: true }), - }, - }); + it('hasErrorConnecting', () => { + setMockValues({ hasErrorConnecting: true }); + const wrapper = shallow(); expect(wrapper.find(ErrorState)).toHaveLength(1); }); }); describe('happy-path states', () => { - it('renders onboarding state', async () => { - const mockApi = jest.fn(() => defaultServerData); - const wrapper = await mountWithAsyncContext(, { - http: { ...mockHttp, get: mockApi }, - }); + it('calls initialize function', async () => { + mount(); + + expect(mockLogicActions.initializeOverview).toHaveBeenCalled(); + }); + + it('renders onboarding state', () => { + setMockValues({ dataLoading: false }); + const wrapper = shallow(); expect(wrapper.find(ViewContentHeader)).toHaveLength(1); expect(wrapper.find(OnboardingSteps)).toHaveLength(1); @@ -55,9 +53,9 @@ describe('Overview', () => { expect(wrapper.find(RecentActivity)).toHaveLength(1); }); - it('renders when onboarding complete', async () => { - const obCompleteData = { - ...defaultServerData, + it('renders when onboarding complete', () => { + setMockValues({ + dataLoading: false, hasUsers: true, hasOrgSources: true, isOldAccount: true, @@ -65,11 +63,8 @@ describe('Overview', () => { name: 'foo', defaultOrgName: 'bar', }, - }; - const mockApi = jest.fn(() => obCompleteData); - const wrapper = await mountWithAsyncContext(, { - http: { ...mockHttp, get: mockApi }, }); + const wrapper = shallow(); expect(wrapper.find(OnboardingSteps)).toHaveLength(0); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview.tsx index bacd65a2be75f..b75a2841dad9b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview.tsx @@ -4,15 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useContext, useEffect, useState } from 'react'; +import React, { useContext, useEffect } from 'react'; import { EuiPage, EuiPageBody, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { useActions, useValues } from 'kea'; import { SetWorkplaceSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; import { SendWorkplaceSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; import { KibanaContext, IKibanaContext } from '../../../index'; -import { IAccount } from '../../types'; +import { OverviewLogic, IOverviewActions, IOverviewValues } from './overview_logic'; import { ErrorState } from '../error_state'; @@ -22,57 +23,7 @@ import { ViewContentHeader } from '../shared/view_content_header'; import { OnboardingSteps } from './onboarding_steps'; import { OrganizationStats } from './organization_stats'; -import { RecentActivity, IFeedActivity } from './recent_activity'; - -export interface IAppServerData { - hasUsers: boolean; - hasOrgSources: boolean; - canCreateContentSources: boolean; - canCreateInvitations: boolean; - isOldAccount: boolean; - sourcesCount: number; - pendingInvitationsCount: number; - accountsCount: number; - personalSourcesCount: number; - activityFeed: IFeedActivity[]; - organization: { - name: string; - defaultOrgName: string; - }; - isFederatedAuth: boolean; - currentUser: { - firstName: string; - email: string; - name: string; - color: string; - }; - fpAccount: IAccount; -} - -export const defaultServerData = { - accountsCount: 1, - activityFeed: [], - canCreateContentSources: true, - canCreateInvitations: true, - currentUser: { - firstName: '', - email: '', - name: '', - color: '', - }, - fpAccount: {} as IAccount, - hasOrgSources: false, - hasUsers: false, - isFederatedAuth: true, - isOldAccount: false, - organization: { - name: '', - defaultOrgName: '', - }, - pendingInvitationsCount: 0, - personalSourcesCount: 0, - sourcesCount: 0, -} as IAppServerData; +import { RecentActivity } from './recent_activity'; const ONBOARDING_HEADER_TITLE = i18n.translate( 'xpack.enterpriseSearch.workplaceSearch.overviewOnboardingHeader.title', @@ -96,34 +47,24 @@ const HEADER_DESCRIPTION = i18n.translate( export const Overview: React.FC = () => { const { http } = useContext(KibanaContext) as IKibanaContext; - const [isLoading, setIsLoading] = useState(true); - const [hasErrorConnecting, setHasErrorConnecting] = useState(false); - const [appData, setAppData] = useState(defaultServerData); - - const getAppData = async () => { - try { - const response = await http.get('/api/workplace_search/overview'); - setAppData(response); - } catch (error) { - setHasErrorConnecting(true); - } finally { - setIsLoading(false); - } - }; - - useEffect(() => { - getAppData(); - }, []); - - if (hasErrorConnecting) return ; - if (isLoading) return ; + const { initializeOverview } = useActions(OverviewLogic) as IOverviewActions; const { + dataLoading, + hasErrorConnecting, hasUsers, hasOrgSources, isOldAccount, organization: { name: orgName, defaultOrgName }, - } = appData as IAppServerData; + } = useValues(OverviewLogic) as IOverviewValues; + + useEffect(() => { + initializeOverview({ http }); + }, [initializeOverview]); + + if (hasErrorConnecting) return ; + if (dataLoading) return ; + const hideOnboarding = hasUsers && hasOrgSources && isOldAccount && orgName !== defaultOrgName; const headerTitle = hideOnboarding ? HEADER_TITLE : ONBOARDING_HEADER_TITLE; @@ -140,11 +81,11 @@ export const Overview: React.FC = () => { description={headerDescription} action={} /> - {!hideOnboarding && } + {!hideOnboarding && } - + - + ); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview_logic.test.ts new file mode 100644 index 0000000000000..285ec9b973378 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview_logic.test.ts @@ -0,0 +1,141 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { resetContext } from 'kea'; +import { act } from 'react-dom/test-utils'; + +import { mockKibanaContext } from '../../../__mocks__'; + +import { mockLogicValues } from './__mocks__'; +import { OverviewLogic } from './overview_logic'; + +describe('OverviewLogic', () => { + let unmount: any; + + beforeEach(() => { + resetContext({}); + unmount = OverviewLogic.mount() as any; + jest.clearAllMocks(); + }); + + afterEach(() => { + unmount(); + }); + + it('has expected default values', () => { + expect(OverviewLogic.values).toEqual(mockLogicValues); + }); + + describe('setServerData', () => { + const feed = [{ foo: 'bar' }] as any; + const user = { firstName: 'Joe', email: 'e@e.e', name: 'Joe Jo', color: 'pearl' }; + const account = { + name: 'Jane doe', + id: '1243', + isAdmin: true, + canCreatePersonalSources: true, + groups: [], + supportEligible: true, + }; + const org = { name: 'ACME', defaultOrgName: 'Org' }; + + const data = { + accountsCount: 1, + activityFeed: feed, + canCreateContentSources: true, + canCreateInvitations: true, + currentUser: user, + fpAccount: account, + hasOrgSources: true, + hasUsers: true, + isFederatedAuth: false, + isOldAccount: true, + organization: org, + pendingInvitationsCount: 1, + personalSourcesCount: 1, + sourcesCount: 1, + }; + + beforeEach(() => { + OverviewLogic.actions.setServerData(data); + }); + + it('will set `dataLoading` to false', () => { + expect(OverviewLogic.values.dataLoading).toEqual(false); + }); + + it('will set server values', () => { + expect(OverviewLogic.values.organization).toEqual(org); + expect(OverviewLogic.values.isFederatedAuth).toEqual(false); + expect(OverviewLogic.values.currentUser).toEqual(user); + expect(OverviewLogic.values.fpAccount).toEqual(account); + expect(OverviewLogic.values.canCreateInvitations).toEqual(true); + expect(OverviewLogic.values.hasUsers).toEqual(true); + expect(OverviewLogic.values.hasOrgSources).toEqual(true); + expect(OverviewLogic.values.canCreateContentSources).toEqual(true); + expect(OverviewLogic.values.isOldAccount).toEqual(true); + expect(OverviewLogic.values.sourcesCount).toEqual(1); + expect(OverviewLogic.values.pendingInvitationsCount).toEqual(1); + expect(OverviewLogic.values.accountsCount).toEqual(1); + expect(OverviewLogic.values.personalSourcesCount).toEqual(1); + expect(OverviewLogic.values.activityFeed).toEqual(feed); + }); + }); + + describe('setFlashMessages', () => { + it('will set `flashMessages`', () => { + const flashMessages = { error: ['error'] }; + OverviewLogic.actions.setFlashMessages(flashMessages); + + expect(OverviewLogic.values.flashMessages).toEqual(flashMessages); + }); + }); + + describe('setHasErrorConnecting', () => { + it('will set `hasErrorConnecting`', () => { + OverviewLogic.actions.setHasErrorConnecting(true); + + expect(OverviewLogic.values.hasErrorConnecting).toEqual(true); + expect(OverviewLogic.values.dataLoading).toEqual(false); + }); + }); + + describe('initializeOverview', () => { + it('calls API and sets values', async () => { + const mockHttp = mockKibanaContext.http; + const mockApi = jest.fn(() => mockLogicValues as any); + const setServerDataSpy = jest.spyOn(OverviewLogic.actions, 'setServerData'); + + await act(async () => + OverviewLogic.actions.initializeOverview({ + http: { + ...mockHttp, + get: mockApi, + }, + }) + ); + + expect(mockApi).toHaveBeenCalledWith('/api/workplace_search/overview'); + expect(setServerDataSpy).toHaveBeenCalled(); + }); + + it('handles error state', async () => { + const mockHttp = mockKibanaContext.http; + const setHasErrorConnectingSpy = jest.spyOn(OverviewLogic.actions, 'setHasErrorConnecting'); + + await act(async () => + OverviewLogic.actions.initializeOverview({ + http: { + ...mockHttp, + get: () => Promise.reject(), + }, + }) + ); + + expect(setHasErrorConnectingSpy).toHaveBeenCalled(); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview_logic.ts new file mode 100644 index 0000000000000..f1b4f447f7445 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/overview_logic.ts @@ -0,0 +1,168 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { HttpSetup } from 'src/core/public'; + +import { kea } from 'kea'; + +import { IAccount, IOrganization, IUser } from '../../types'; +import { IFlashMessagesProps, IKeaLogic, TKeaReducers, IKeaParams } from '../../../shared/types'; + +import { IFeedActivity } from './recent_activity'; + +export interface IOverviewServerData { + hasUsers: boolean; + hasOrgSources: boolean; + canCreateContentSources: boolean; + canCreateInvitations: boolean; + isOldAccount: boolean; + sourcesCount: number; + pendingInvitationsCount: number; + accountsCount: number; + personalSourcesCount: number; + activityFeed: IFeedActivity[]; + organization: IOrganization; + isFederatedAuth: boolean; + currentUser: IUser; + fpAccount: IAccount; +} + +export interface IOverviewActions { + setServerData(serverData: IOverviewServerData): void; + setFlashMessages(flashMessages: IFlashMessagesProps): void; + setHasErrorConnecting(hasErrorConnecting: boolean): void; + initializeOverview({ http }: { http: HttpSetup }): void; +} + +export interface IOverviewValues extends IOverviewServerData { + dataLoading: boolean; + hasErrorConnecting: boolean; + flashMessages: IFlashMessagesProps; +} + +export const OverviewLogic = kea({ + actions: (): IOverviewActions => ({ + setServerData: (serverData) => serverData, + setFlashMessages: (flashMessages) => ({ flashMessages }), + setHasErrorConnecting: (hasErrorConnecting) => ({ hasErrorConnecting }), + initializeOverview: ({ http }) => ({ http }), + }), + reducers: (): TKeaReducers => ({ + organization: [ + {} as IOrganization, + { + setServerData: (_, { organization }) => organization, + }, + ], + isFederatedAuth: [ + true, + { + setServerData: (_, { isFederatedAuth }) => isFederatedAuth, + }, + ], + currentUser: [ + {} as IUser, + { + setServerData: (_, { currentUser }) => currentUser, + }, + ], + fpAccount: [ + {} as IAccount, + { + setServerData: (_, { fpAccount }) => fpAccount, + }, + ], + canCreateInvitations: [ + false, + { + setServerData: (_, { canCreateInvitations }) => canCreateInvitations, + }, + ], + flashMessages: [ + {}, + { + setFlashMessages: (_, { flashMessages }) => flashMessages, + }, + ], + hasUsers: [ + false, + { + setServerData: (_, { hasUsers }) => hasUsers, + }, + ], + hasOrgSources: [ + false, + { + setServerData: (_, { hasOrgSources }) => hasOrgSources, + }, + ], + canCreateContentSources: [ + false, + { + setServerData: (_, { canCreateContentSources }) => canCreateContentSources, + }, + ], + isOldAccount: [ + false, + { + setServerData: (_, { isOldAccount }) => isOldAccount, + }, + ], + sourcesCount: [ + 0, + { + setServerData: (_, { sourcesCount }) => sourcesCount, + }, + ], + pendingInvitationsCount: [ + 0, + { + setServerData: (_, { pendingInvitationsCount }) => pendingInvitationsCount, + }, + ], + accountsCount: [ + 0, + { + setServerData: (_, { accountsCount }) => accountsCount, + }, + ], + personalSourcesCount: [ + 0, + { + setServerData: (_, { personalSourcesCount }) => personalSourcesCount, + }, + ], + activityFeed: [ + [], + { + setServerData: (_, { activityFeed }) => activityFeed, + }, + ], + dataLoading: [ + true, + { + setServerData: () => false, + setHasErrorConnecting: () => false, + }, + ], + hasErrorConnecting: [ + false, + { + setHasErrorConnecting: (_, { hasErrorConnecting }) => hasErrorConnecting, + }, + ], + }), + listeners: ({ actions }): Partial => ({ + initializeOverview: async ({ http }: { http: HttpSetup }) => { + try { + const response = await http.get('/api/workplace_search/overview'); + actions.setServerData(response); + } catch (error) { + actions.setHasErrorConnecting(true); + } + }, + }), +} as IKeaParams) as IKeaLogic; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/recent_activity.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/recent_activity.test.tsx index e9bdedb199dad..22a82af18527d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/recent_activity.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/recent_activity.test.tsx @@ -5,6 +5,8 @@ */ import '../../../__mocks__/shallow_usecontext.mock'; +import './__mocks__/overview_logic.mock'; +import { setMockValues } from './__mocks__'; import React from 'react'; import { shallow } from 'enzyme'; @@ -12,14 +14,13 @@ import { shallow } from 'enzyme'; import { EuiEmptyPrompt, EuiLink } from '@elastic/eui'; import { RecentActivity, RecentActivityItem } from './recent_activity'; -import { defaultServerData } from './overview'; jest.mock('../../../shared/telemetry', () => ({ sendTelemetry: jest.fn() })); import { sendTelemetry } from '../../../shared/telemetry'; -const org = { name: 'foo', defaultOrgName: 'bar' }; +const organization = { name: 'foo', defaultOrgName: 'bar' }; -const feed = [ +const activityFeed = [ { id: 'demo', sourceId: 'd2d2d23d', @@ -30,17 +31,19 @@ const feed = [ ]; describe('RecentActivity', () => { - it('renders with no feed data', () => { - const wrapper = shallow(); + it('renders with no activityFeed data', () => { + const wrapper = shallow(); expect(wrapper.find(EuiEmptyPrompt)).toHaveLength(1); // Branch coverage - renders without error for custom org name - shallow(); + setMockValues({ organization }); + shallow(); }); - it('renders an activity feed with links', () => { - const wrapper = shallow(); + it('renders an activityFeed with links', () => { + setMockValues({ activityFeed }); + const wrapper = shallow(); const activity = wrapper.find(RecentActivityItem).dive(); expect(activity).toHaveLength(1); @@ -51,7 +54,7 @@ describe('RecentActivity', () => { }); it('renders activity item error state', () => { - const props = { ...feed[0], status: 'error' }; + const props = { ...activityFeed[0], status: 'error' }; const wrapper = shallow(); expect(wrapper.find('.activity--error')).toHaveLength(1); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/recent_activity.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/recent_activity.tsx index 8d69582c93684..2c0fbe1275cbf 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/recent_activity.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/overview/recent_activity.tsx @@ -7,6 +7,7 @@ import React, { useContext } from 'react'; import moment from 'moment'; +import { useValues } from 'kea'; import { EuiEmptyPrompt, EuiLink, EuiPanel, EuiSpacer, EuiLinkProps } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -17,7 +18,7 @@ import { sendTelemetry } from '../../../shared/telemetry'; import { KibanaContext, IKibanaContext } from '../../../index'; import { getSourcePath } from '../../routes'; -import { IAppServerData } from './overview'; +import { OverviewLogic, IOverviewValues } from './overview_logic'; import './recent_activity.scss'; @@ -29,10 +30,12 @@ export interface IFeedActivity { sourceId: string; } -export const RecentActivity: React.FC = ({ - organization: { name, defaultOrgName }, - activityFeed, -}) => { +export const RecentActivity: React.FC = () => { + const { + organization: { name, defaultOrgName }, + activityFeed, + } = useValues(OverviewLogic) as IOverviewValues; + return ( , testSubj: 'contentSection', - className: 'test', }; describe('ContentSection', () => { it('renders', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.prop('data-test-subj')).toEqual('contentSection'); expect(wrapper.prop('className')).toEqual('test'); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/view_content_header/view_content_header.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/view_content_header/view_content_header.test.tsx index 4680f15771caa..b0b07c46b4ea8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/view_content_header/view_content_header.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/view_content_header/view_content_header.test.tsx @@ -26,9 +26,10 @@ describe('ViewContentHeader', () => { }); it('shows description, when present', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find('p').text()).toEqual('Hello World'); + expect(wrapper.find(EuiFlexGroup).prop('alignItems')).toEqual('center'); }); it('shows action, when present', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx index 36b1a56ecba26..cfa70ea29eca8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx @@ -6,6 +6,13 @@ import React, { useContext } from 'react'; import { Route, Redirect } from 'react-router-dom'; +import { Provider } from 'react-redux'; +import { Store } from 'redux'; +import { getContext, resetContext } from 'kea'; + +resetContext({ createStore: true }); + +const store = getContext().store as Store; import { KibanaContext, IKibanaContext } from '../index'; @@ -17,13 +24,13 @@ import { Overview } from './components/overview'; export const WorkplaceSearch: React.FC = () => { const { enterpriseSearchUrl } = useContext(KibanaContext) as IKibanaContext; return ( - <> + {!enterpriseSearchUrl ? : } - + ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts index b448c59c52f3e..77c35adef3300 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts @@ -13,4 +13,15 @@ export interface IAccount { supportEligible: boolean; } +export interface IOrganization { + name: string; + defaultOrgName: string; +} +export interface IUser { + firstName: string; + email: string; + name: string; + color: string; +} + export type TSpacerSize = 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl'; diff --git a/yarn.lock b/yarn.lock index 0638a019a9402..899bc45fbe3fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19957,6 +19957,11 @@ kdbush@^3.0.0: resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== +kea@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/kea/-/kea-2.1.1.tgz#6e3c65c4873b67d270a2ec7bf73b0d178937234c" + integrity sha512-W9o4lHLOcEDIu3ASHPrWJJJzL1bMkGyxaHn9kuaDgI96ztBShVrf52R0QPGlQ2k9ca3XnkB/dnVHio1UB8kGWA== + kew@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/kew/-/kew-0.1.7.tgz#0a32a817ff1a9b3b12b8c9bacf4bc4d679af8e72" From 88aebc9fe17fa0583b7c5b9af17520511c9b18ad Mon Sep 17 00:00:00 2001 From: liza-mae Date: Mon, 27 Jul 2020 15:10:33 -0600 Subject: [PATCH 027/126] Remove ca cert path for cloud testing (#73317) --- test/common/services/elasticsearch.ts | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/test/common/services/elasticsearch.ts b/test/common/services/elasticsearch.ts index 0436dc901292d..a01f9ff3c8da5 100644 --- a/test/common/services/elasticsearch.ts +++ b/test/common/services/elasticsearch.ts @@ -27,11 +27,18 @@ import { FtrProviderContext } from '../ftr_provider_context'; export function ElasticsearchProvider({ getService }: FtrProviderContext) { const config = getService('config'); - return new Client({ - ssl: { - ca: fs.readFileSync(CA_CERT_PATH, 'utf-8'), - }, - nodes: [formatUrl(config.get('servers.elasticsearch'))], - requestTimeout: config.get('timeouts.esRequestTimeout'), - }); + if (process.env.TEST_CLOUD) { + return new Client({ + nodes: [formatUrl(config.get('servers.elasticsearch'))], + requestTimeout: config.get('timeouts.esRequestTimeout'), + }); + } else { + return new Client({ + ssl: { + ca: fs.readFileSync(CA_CERT_PATH, 'utf-8'), + }, + nodes: [formatUrl(config.get('servers.elasticsearch'))], + requestTimeout: config.get('timeouts.esRequestTimeout'), + }); + } } From 5a472189715931012096b99b95651ffd5791179c Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 27 Jul 2020 16:24:45 -0500 Subject: [PATCH 028/126] [APM] Fix focus map link on service map (#73338) The link was including `serviceName` from the `urlParams` so it was linking to the wrong service. Overwrite the service name so the link is correct. Fixes #72911. --- .../app/ServiceMap/Popover/Buttons.test.tsx | 32 +++++++++++++++++++ .../app/ServiceMap/Popover/Buttons.tsx | 7 +++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Buttons.test.tsx diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Buttons.test.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Buttons.test.tsx new file mode 100644 index 0000000000000..4146266b17916 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Buttons.test.tsx @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Buttons } from './Buttons'; +import { render } from '@testing-library/react'; + +describe('Popover Buttons', () => { + it('renders', () => { + expect(() => + render() + ).not.toThrowError(); + }); + + it('handles focus click', async () => { + const onFocusClick = jest.fn(); + const result = render( + + ); + const focusButton = await result.findByText('Focus map'); + + focusButton.click(); + + expect(onFocusClick).toHaveBeenCalledTimes(1); + }); +}); diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Buttons.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Buttons.tsx index d67447e04ef81..cb33fb32f3b0d 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Buttons.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Buttons.tsx @@ -22,7 +22,12 @@ export function Buttons({ onFocusClick = () => {}, selectedNodeServiceName, }: ButtonsProps) { - const urlParams = useUrlParams().urlParams as APMQueryParams; + // The params may contain the service name. We want to use the selected node's + // service name in the button URLs, so make a copy and set the + // `serviceName` property. + const urlParams = { ...useUrlParams().urlParams } as APMQueryParams; + urlParams.serviceName = selectedNodeServiceName; + const detailsUrl = getAPMHref( `/services/${selectedNodeServiceName}/transactions`, '', From 157fb097a9aeed8a9e167efa91347617a258ca5b Mon Sep 17 00:00:00 2001 From: Spencer Date: Mon, 27 Jul 2020 14:31:02 -0700 Subject: [PATCH 029/126] [dev/build/docker_generator] convert to typescript (#73339) Co-authored-by: spalger --- ...e_dockerfiles.js => bundle_dockerfiles.ts} | 28 ++++++++-------- .../os_packages/docker_generator/index.ts | 1 - .../docker_generator/{run.js => run.ts} | 19 ++++++++--- .../docker_generator/template_context.ts | 33 +++++++++++++++++++ ...emplate.js => build_docker_sh.template.ts} | 4 ++- ...ile.template.js => dockerfile.template.ts} | 4 ++- .../templates/{index.js => index.ts} | 0 ...yml.template.js => kibana_yml.template.ts} | 4 ++- 8 files changed, 71 insertions(+), 22 deletions(-) rename src/dev/build/tasks/os_packages/docker_generator/{bundle_dockerfiles.js => bundle_dockerfiles.ts} (80%) rename src/dev/build/tasks/os_packages/docker_generator/{run.js => run.ts} (90%) create mode 100644 src/dev/build/tasks/os_packages/docker_generator/template_context.ts rename src/dev/build/tasks/os_packages/docker_generator/templates/{build_docker_sh.template.js => build_docker_sh.template.ts} (94%) rename src/dev/build/tasks/os_packages/docker_generator/templates/{dockerfile.template.js => dockerfile.template.ts} (98%) rename src/dev/build/tasks/os_packages/docker_generator/templates/{index.js => index.ts} (100%) rename src/dev/build/tasks/os_packages/docker_generator/templates/{kibana_yml.template.js => kibana_yml.template.ts} (91%) diff --git a/src/dev/build/tasks/os_packages/docker_generator/bundle_dockerfiles.js b/src/dev/build/tasks/os_packages/docker_generator/bundle_dockerfiles.ts similarity index 80% rename from src/dev/build/tasks/os_packages/docker_generator/bundle_dockerfiles.js rename to src/dev/build/tasks/os_packages/docker_generator/bundle_dockerfiles.ts index 3f34a84057668..7a8f7316913be 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/bundle_dockerfiles.js +++ b/src/dev/build/tasks/os_packages/docker_generator/bundle_dockerfiles.ts @@ -18,10 +18,14 @@ */ import { resolve } from 'path'; -import { compressTar, copyAll, mkdirp, write } from '../../../lib'; + +import { ToolingLog } from '@kbn/dev-utils'; + +import { compressTar, copyAll, mkdirp, write, Config } from '../../../lib'; import { dockerfileTemplate } from './templates'; +import { TemplateContext } from './template_context'; -export async function bundleDockerFiles(config, log, build, scope) { +export async function bundleDockerFiles(config: Config, log: ToolingLog, scope: TemplateContext) { log.info( `Generating kibana${scope.imageFlavor}${scope.ubiImageFlavor} docker build context bundle` ); @@ -50,17 +54,15 @@ export async function bundleDockerFiles(config, log, build, scope) { // Compress dockerfiles dir created inside // docker build dir as output it as a target // on targets folder - await compressTar( - { - archiverOptions: { - gzip: true, - gzipOptions: { - level: 9, - }, + await compressTar({ + source: dockerFilesBuildDir, + destination: dockerFilesOutputDir, + archiverOptions: { + gzip: true, + gzipOptions: { + level: 9, }, - createRootDirectory: false, }, - dockerFilesBuildDir, - dockerFilesOutputDir - ); + createRootDirectory: false, + }); } diff --git a/src/dev/build/tasks/os_packages/docker_generator/index.ts b/src/dev/build/tasks/os_packages/docker_generator/index.ts index 78d2b197dc7b2..dff56585fc704 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/index.ts +++ b/src/dev/build/tasks/os_packages/docker_generator/index.ts @@ -17,5 +17,4 @@ * under the License. */ -// @ts-expect-error not ts yet export { runDockerGenerator, runDockerGeneratorForUBI } from './run'; diff --git a/src/dev/build/tasks/os_packages/docker_generator/run.js b/src/dev/build/tasks/os_packages/docker_generator/run.ts similarity index 90% rename from src/dev/build/tasks/os_packages/docker_generator/run.js rename to src/dev/build/tasks/os_packages/docker_generator/run.ts index b6dab43887f14..0a26729f3502d 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/run.js +++ b/src/dev/build/tasks/os_packages/docker_generator/run.ts @@ -20,8 +20,12 @@ import { access, link, unlink, chmod } from 'fs'; import { resolve } from 'path'; import { promisify } from 'util'; -import { write, copyAll, mkdirp, exec } from '../../../lib'; + +import { ToolingLog } from '@kbn/dev-utils'; + +import { write, copyAll, mkdirp, exec, Config, Build } from '../../../lib'; import * as dockerTemplates from './templates'; +import { TemplateContext } from './template_context'; import { bundleDockerFiles } from './bundle_dockerfiles'; const accessAsync = promisify(access); @@ -29,7 +33,12 @@ const linkAsync = promisify(link); const unlinkAsync = promisify(unlink); const chmodAsync = promisify(chmod); -export async function runDockerGenerator(config, log, build, ubi = false) { +export async function runDockerGenerator( + config: Config, + log: ToolingLog, + build: Build, + ubi: boolean = false +) { // UBI var config const baseOSImage = ubi ? 'registry.access.redhat.com/ubi7/ubi-minimal:7.7' : 'centos:7'; const ubiVersionTag = 'ubi7'; @@ -52,7 +61,7 @@ export async function runDockerGenerator(config, log, build, ubi = false) { const dockerOutputDir = config.resolveFromTarget( `kibana${imageFlavor}${ubiImageFlavor}-${versionTag}-docker.tar.gz` ); - const scope = { + const scope: TemplateContext = { artifactTarball, imageFlavor, versionTag, @@ -112,10 +121,10 @@ export async function runDockerGenerator(config, log, build, ubi = false) { }); // Pack Dockerfiles and create a target for them - await bundleDockerFiles(config, log, build, scope); + await bundleDockerFiles(config, log, scope); } -export async function runDockerGeneratorForUBI(config, log, build) { +export async function runDockerGeneratorForUBI(config: Config, log: ToolingLog, build: Build) { // Only run ubi docker image build for default distribution if (build.isOss()) { return; diff --git a/src/dev/build/tasks/os_packages/docker_generator/template_context.ts b/src/dev/build/tasks/os_packages/docker_generator/template_context.ts new file mode 100644 index 0000000000000..115d4c6927c30 --- /dev/null +++ b/src/dev/build/tasks/os_packages/docker_generator/template_context.ts @@ -0,0 +1,33 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface TemplateContext { + artifactTarball: string; + imageFlavor: string; + versionTag: string; + license: string; + artifactsDir: string; + imageTag: string; + dockerBuildDir: string; + dockerOutputDir: string; + baseOSImage: string; + ubiImageFlavor: string; + dockerBuildDate: string; + usePublicArtifact?: boolean; +} diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/build_docker_sh.template.js b/src/dev/build/tasks/os_packages/docker_generator/templates/build_docker_sh.template.ts similarity index 94% rename from src/dev/build/tasks/os_packages/docker_generator/templates/build_docker_sh.template.js rename to src/dev/build/tasks/os_packages/docker_generator/templates/build_docker_sh.template.ts index 4e8dfe188b867..ff6fcf7548d9d 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/templates/build_docker_sh.template.js +++ b/src/dev/build/tasks/os_packages/docker_generator/templates/build_docker_sh.template.ts @@ -19,6 +19,8 @@ import dedent from 'dedent'; +import { TemplateContext } from '../template_context'; + function generator({ imageTag, imageFlavor, @@ -26,7 +28,7 @@ function generator({ dockerOutputDir, baseOSImage, ubiImageFlavor, -}) { +}: TemplateContext) { return dedent(` #!/usr/bin/env bash # diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/dockerfile.template.js b/src/dev/build/tasks/os_packages/docker_generator/templates/dockerfile.template.ts similarity index 98% rename from src/dev/build/tasks/os_packages/docker_generator/templates/dockerfile.template.js rename to src/dev/build/tasks/os_packages/docker_generator/templates/dockerfile.template.ts index 5832d00162b20..ea2f881768c8f 100755 --- a/src/dev/build/tasks/os_packages/docker_generator/templates/dockerfile.template.js +++ b/src/dev/build/tasks/os_packages/docker_generator/templates/dockerfile.template.ts @@ -19,6 +19,8 @@ import dedent from 'dedent'; +import { TemplateContext } from '../template_context'; + function generator({ artifactTarball, versionTag, @@ -27,7 +29,7 @@ function generator({ baseOSImage, ubiImageFlavor, dockerBuildDate, -}) { +}: TemplateContext) { const copyArtifactTarballInsideDockerOptFolder = () => { if (usePublicArtifact) { return `RUN cd /opt && curl --retry 8 -s -L -O https://artifacts.elastic.co/downloads/kibana/${artifactTarball} && cd -`; diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/index.js b/src/dev/build/tasks/os_packages/docker_generator/templates/index.ts similarity index 100% rename from src/dev/build/tasks/os_packages/docker_generator/templates/index.js rename to src/dev/build/tasks/os_packages/docker_generator/templates/index.ts diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.js b/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.ts similarity index 91% rename from src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.js rename to src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.ts index c80f9334cfaeb..240ec6f4e9326 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.js +++ b/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.ts @@ -19,7 +19,9 @@ import dedent from 'dedent'; -function generator({ imageFlavor }) { +import { TemplateContext } from '../template_context'; + +function generator({ imageFlavor }: TemplateContext) { return dedent(` # # ** THIS IS AN AUTO-GENERATED FILE ** From 57997beed8f7eaf7f67cd17d397eb4abcd6abf36 Mon Sep 17 00:00:00 2001 From: Constance Date: Mon, 27 Jul 2020 15:06:42 -0700 Subject: [PATCH 030/126] [Enterprise Search] Error state UI tweaks to account for current Cloud SSO behavior (#73324) * Do not disable the Launch App Search button on the error page - so users always have access to App Search * Add troubleshooting steps that mention user authentication - more info can be found in setup guide * Tweak styling/spacing on troubleshooting steps * Copyedits (thanks Chris!) --- .../components/empty_states/error_state.tsx | 2 +- .../engine_overview_header.test.tsx | 8 ------- .../engine_overview_header.tsx | 23 +++++------------- .../error_state/error_state_prompt.scss | 12 ++++++++++ .../shared/error_state/error_state_prompt.tsx | 24 ++++++++++++++++++- 5 files changed, 42 insertions(+), 27 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/error_state/error_state_prompt.scss diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/error_state.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/error_state.tsx index 7ac02082ee75c..346e70d32f7b1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/error_state.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/empty_states/error_state.tsx @@ -21,7 +21,7 @@ export const ErrorState: React.FC = () => { - + diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview_header/engine_overview_header.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview_header/engine_overview_header.test.tsx index 2e49540270ef0..7d2106f2a56f7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview_header/engine_overview_header.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview_header/engine_overview_header.test.tsx @@ -30,12 +30,4 @@ describe('EngineOverviewHeader', () => { button.simulate('click'); expect(sendTelemetry).toHaveBeenCalled(); }); - - it('renders a disabled button when isButtonDisabled is true', () => { - const wrapper = shallow(); - const button = wrapper.find('[data-test-subj="launchButton"]'); - - expect(button.prop('isDisabled')).toBe(true); - expect(button.prop('href')).toBeUndefined(); - }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview_header/engine_overview_header.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview_header/engine_overview_header.tsx index 9aafa8ec0380c..cc480d241ad50 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview_header/engine_overview_header.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview_header/engine_overview_header.tsx @@ -18,34 +18,23 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { sendTelemetry } from '../../../shared/telemetry'; import { KibanaContext, IKibanaContext } from '../../../index'; -interface IEngineOverviewHeaderProps { - isButtonDisabled?: boolean; -} - -export const EngineOverviewHeader: React.FC = ({ - isButtonDisabled, -}) => { +export const EngineOverviewHeader: React.FC = () => { const { enterpriseSearchUrl, http } = useContext(KibanaContext) as IKibanaContext; const buttonProps = { fill: true, iconType: 'popout', 'data-test-subj': 'launchButton', - } as EuiButtonProps & EuiLinkProps; - - if (isButtonDisabled) { - buttonProps.isDisabled = true; - } else { - buttonProps.href = `${enterpriseSearchUrl}/as`; - buttonProps.target = '_blank'; - buttonProps.onClick = () => + href: `${enterpriseSearchUrl}/as`, + target: '_blank', + onClick: () => sendTelemetry({ http, product: 'app_search', action: 'clicked', metric: 'header_launch_button', - }); - } + }), + } as EuiButtonProps & EuiLinkProps; return ( diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/error_state/error_state_prompt.scss b/x-pack/plugins/enterprise_search/public/applications/shared/error_state/error_state_prompt.scss new file mode 100644 index 0000000000000..0d9926ab147bf --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/error_state/error_state_prompt.scss @@ -0,0 +1,12 @@ +.troubleshootingSteps { + text-align: left; + + li { + margin: $euiSizeS auto; + } + + ul, + ol { + margin-bottom: 0; + } +} diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/error_state/error_state_prompt.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/error_state/error_state_prompt.tsx index 81455cea0b497..ccd5beff66e70 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/error_state/error_state_prompt.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/error_state/error_state_prompt.tsx @@ -11,6 +11,8 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { EuiButton } from '../react_router_helpers'; import { KibanaContext, IKibanaContext } from '../../index'; +import './error_state_prompt.scss'; + export const ErrorStatePrompt: React.FC = () => { const { enterpriseSearchUrl } = useContext(KibanaContext) as IKibanaContext; @@ -38,7 +40,7 @@ export const ErrorStatePrompt: React.FC = () => { }} />

-
    +
    1. { defaultMessage="Confirm that the Enterprise Search server is responsive." />
    2. +
    3. + +
        +
      • + +
      • +
      • + +
      • +
      +
    4. Date: Mon, 27 Jul 2020 18:19:16 -0400 Subject: [PATCH 031/126] [Security Solution][Exceptions] - Update exception item comments to include id (#73129) ## Summary This PR is somewhat of an intermediary step. Comments on exception list items are denormalized. We initially decided that we would not add `uuid` to comments, but found that it is in fact necessary. This is intermediary in the sense that what we ideally want to have is a dedicated `comments` CRUD route. Also just note that I added a callout for when a version conflict occurs (ie: exception item was updated by someone else while a user is editing the same item). With this PR users are able to: - Create comments when creating exception list items - Add new comments on exception item update Users will currently be blocked from: - Deleting comments - Updating comments - Updating exception item if version conflict is found --- x-pack/plugins/lists/common/constants.mock.ts | 1 + .../create_endpoint_list_item_schema.test.ts | 36 +- .../create_exception_list_item_schema.test.ts | 36 +- ...ate_exception_list_item_validation.test.ts | 43 ++ .../update_exception_list_item_validation.ts | 40 ++ .../{comments.mock.ts => comment.mock.ts} | 7 +- .../{comments.test.ts => comment.test.ts} | 109 +++-- .../schemas/types/{comments.ts => comment.ts} | 23 +- ...omments.mock.ts => create_comment.mock.ts} | 4 +- ...omments.test.ts => create_comment.test.ts} | 50 +-- .../{create_comments.ts => create_comment.ts} | 11 +- .../types/default_comments_array.test.ts | 21 +- .../schemas/types/default_comments_array.ts | 6 +- .../default_create_comments_array.test.ts | 30 +- .../types/default_create_comments_array.ts | 6 +- .../default_update_comments_array.test.ts | 23 +- .../types/default_update_comments_array.ts | 2 +- .../lists/common/schemas/types/index.ts | 6 +- ...omments.mock.ts => update_comment.mock.ts} | 15 +- .../schemas/types/update_comment.test.ts | 150 +++++++ .../{update_comments.ts => update_comment.ts} | 20 +- .../schemas/types/update_comments.test.ts | 108 ----- x-pack/plugins/lists/common/shared_exports.ts | 5 +- .../update_exception_list_item_route.ts | 6 + .../server/saved_objects/exception_list.ts | 3 + .../updates/simple_update_item.json | 25 +- .../create_exception_list_item.ts | 5 +- .../services/exception_lists/utils.test.ts | 390 ++---------------- .../server/services/exception_lists/utils.ts | 115 +----- .../common/shared_imports.ts | 5 +- .../exceptions/add_exception_comments.tsx | 4 +- .../exceptions/add_exception_modal/index.tsx | 4 +- .../components/exceptions/builder/index.tsx | 2 +- .../exceptions/edit_exception_modal/index.tsx | 40 +- .../edit_exception_modal/translations.ts | 15 + .../components/exceptions/helpers.test.tsx | 55 ++- .../common/components/exceptions/helpers.tsx | 55 ++- .../exception_item/exception_details.test.tsx | 2 +- .../viewer/exception_item/index.stories.tsx | 2 +- .../viewer/exception_item/index.test.tsx | 2 +- .../components/exceptions/viewer/index.tsx | 3 +- 41 files changed, 702 insertions(+), 783 deletions(-) create mode 100644 x-pack/plugins/lists/common/schemas/request/update_exception_list_item_validation.test.ts create mode 100644 x-pack/plugins/lists/common/schemas/request/update_exception_list_item_validation.ts rename x-pack/plugins/lists/common/schemas/types/{comments.mock.ts => comment.mock.ts} (71%) rename x-pack/plugins/lists/common/schemas/types/{comments.test.ts => comment.test.ts} (56%) rename x-pack/plugins/lists/common/schemas/types/{comments.ts => comment.ts} (56%) rename x-pack/plugins/lists/common/schemas/types/{create_comments.mock.ts => create_comment.mock.ts} (73%) rename x-pack/plugins/lists/common/schemas/types/{create_comments.test.ts => create_comment.test.ts} (72%) rename x-pack/plugins/lists/common/schemas/types/{create_comments.ts => create_comment.ts} (64%) rename x-pack/plugins/lists/common/schemas/types/{update_comments.mock.ts => update_comment.mock.ts} (54%) create mode 100644 x-pack/plugins/lists/common/schemas/types/update_comment.test.ts rename x-pack/plugins/lists/common/schemas/types/{update_comments.ts => update_comment.ts} (58%) delete mode 100644 x-pack/plugins/lists/common/schemas/types/update_comments.test.ts diff --git a/x-pack/plugins/lists/common/constants.mock.ts b/x-pack/plugins/lists/common/constants.mock.ts index 30f219c3ec101..22706890e2020 100644 --- a/x-pack/plugins/lists/common/constants.mock.ts +++ b/x-pack/plugins/lists/common/constants.mock.ts @@ -6,6 +6,7 @@ import { EntriesArray } from './schemas/types'; export const DATE_NOW = '2020-04-20T15:25:31.830Z'; +export const OLD_DATE_RELATIVE_TO_DATE_NOW = '2020-04-19T15:25:31.830Z'; export const USER = 'some user'; export const LIST_INDEX = '.lists'; export const LIST_ITEM_INDEX = '.items'; diff --git a/x-pack/plugins/lists/common/schemas/request/create_endpoint_list_item_schema.test.ts b/x-pack/plugins/lists/common/schemas/request/create_endpoint_list_item_schema.test.ts index 5de9fbb0d5b50..75e0410be610a 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_endpoint_list_item_schema.test.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_endpoint_list_item_schema.test.ts @@ -8,8 +8,8 @@ import { left } from 'fp-ts/lib/Either'; import { pipe } from 'fp-ts/lib/pipeable'; import { exactCheck, foldLeftRight, getPaths } from '../../siem_common_deps'; -import { getCreateCommentsArrayMock } from '../types/create_comments.mock'; -import { getCommentsMock } from '../types/comments.mock'; +import { getCreateCommentsArrayMock } from '../types/create_comment.mock'; +import { getCommentsMock } from '../types/comment.mock'; import { CommentsArray } from '../types'; import { @@ -19,7 +19,7 @@ import { import { getCreateEndpointListItemSchemaMock } from './create_endpoint_list_item_schema.mock'; describe('create_endpoint_list_item_schema', () => { - test('it should validate a typical list item request not counting the auto generated uuid', () => { + test('it should pass validation when supplied a typical list item request not counting the auto generated uuid', () => { const payload = getCreateEndpointListItemSchemaMock(); const decoded = createEndpointListItemSchema.decode(payload); const checked = exactCheck(payload, decoded); @@ -29,7 +29,7 @@ describe('create_endpoint_list_item_schema', () => { expect(message.schema).toEqual(payload); }); - test('it should not validate an undefined for "description"', () => { + test('it should fail validation when supplied an undefined for "description"', () => { const payload = getCreateEndpointListItemSchemaMock(); delete payload.description; const decoded = createEndpointListItemSchema.decode(payload); @@ -41,7 +41,7 @@ describe('create_endpoint_list_item_schema', () => { expect(message.schema).toEqual({}); }); - test('it should not validate an undefined for "name"', () => { + test('it should fail validation when supplied an undefined for "name"', () => { const payload = getCreateEndpointListItemSchemaMock(); delete payload.name; const decoded = createEndpointListItemSchema.decode(payload); @@ -53,7 +53,7 @@ describe('create_endpoint_list_item_schema', () => { expect(message.schema).toEqual({}); }); - test('it should not validate an undefined for "type"', () => { + test('it should fail validation when supplied an undefined for "type"', () => { const payload = getCreateEndpointListItemSchemaMock(); delete payload.type; const decoded = createEndpointListItemSchema.decode(payload); @@ -65,7 +65,7 @@ describe('create_endpoint_list_item_schema', () => { expect(message.schema).toEqual({}); }); - test('it should not validate a "list_id" since it does not required one', () => { + test('it should fail validation when supplied a "list_id" since it does not required one', () => { const inputPayload: CreateEndpointListItemSchema & { list_id: string } = { ...getCreateEndpointListItemSchemaMock(), list_id: 'list-123', @@ -77,7 +77,7 @@ describe('create_endpoint_list_item_schema', () => { expect(message.schema).toEqual({}); }); - test('it should not validate a "namespace_type" since it does not required one', () => { + test('it should fail validation when supplied a "namespace_type" since it does not required one', () => { const inputPayload: CreateEndpointListItemSchema & { namespace_type: string } = { ...getCreateEndpointListItemSchemaMock(), namespace_type: 'single', @@ -89,7 +89,7 @@ describe('create_endpoint_list_item_schema', () => { expect(message.schema).toEqual({}); }); - test('it should validate an undefined for "meta" but strip it out and generate a correct body not counting the auto generated uuid', () => { + test('it should pass validation when supplied an undefined for "meta" but strip it out and generate a correct body not counting the auto generated uuid', () => { const payload = getCreateEndpointListItemSchemaMock(); const outputPayload = getCreateEndpointListItemSchemaMock(); delete payload.meta; @@ -102,7 +102,7 @@ describe('create_endpoint_list_item_schema', () => { expect(message.schema).toEqual(outputPayload); }); - test('it should validate an undefined for "comments" but return an array and generate a correct body not counting the auto generated uuid', () => { + test('it should pass validation when supplied an undefined for "comments" but return an array and generate a correct body not counting the auto generated uuid', () => { const inputPayload = getCreateEndpointListItemSchemaMock(); const outputPayload = getCreateEndpointListItemSchemaMock(); delete inputPayload.comments; @@ -115,7 +115,7 @@ describe('create_endpoint_list_item_schema', () => { expect(message.schema).toEqual(outputPayload); }); - test('it should validate "comments" array', () => { + test('it should pass validation when supplied "comments" array', () => { const inputPayload = { ...getCreateEndpointListItemSchemaMock(), comments: getCreateCommentsArrayMock(), @@ -128,7 +128,7 @@ describe('create_endpoint_list_item_schema', () => { expect(message.schema).toEqual(inputPayload); }); - test('it should NOT validate "comments" with "created_at" or "created_by" values', () => { + test('it should fail validation when supplied "comments" with "created_at", "created_by", or "id" values', () => { const inputPayload: Omit & { comments?: CommentsArray; } = { @@ -138,11 +138,11 @@ describe('create_endpoint_list_item_schema', () => { const decoded = createEndpointListItemSchema.decode(inputPayload); const checked = exactCheck(inputPayload, decoded); const message = pipe(checked, foldLeftRight); - expect(getPaths(left(message.errors))).toEqual(['invalid keys "created_at,created_by"']); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "created_at,created_by,id"']); expect(message.schema).toEqual({}); }); - test('it should NOT validate an undefined for "entries"', () => { + test('it should fail validation when supplied an undefined for "entries"', () => { const inputPayload = getCreateEndpointListItemSchemaMock(); const outputPayload = getCreateEndpointListItemSchemaMock(); delete inputPayload.entries; @@ -157,7 +157,7 @@ describe('create_endpoint_list_item_schema', () => { expect(message.schema).toEqual({}); }); - test('it should validate an undefined for "tags" but return an array and generate a correct body not counting the auto generated uuid', () => { + test('it should pass validation when supplied an undefined for "tags" but return an array and generate a correct body not counting the auto generated uuid', () => { const inputPayload = getCreateEndpointListItemSchemaMock(); const outputPayload = getCreateEndpointListItemSchemaMock(); delete inputPayload.tags; @@ -170,7 +170,7 @@ describe('create_endpoint_list_item_schema', () => { expect(message.schema).toEqual(outputPayload); }); - test('it should validate an undefined for "_tags" but return an array and generate a correct body not counting the auto generated uuid', () => { + test('it should pass validation when supplied an undefined for "_tags" but return an array and generate a correct body not counting the auto generated uuid', () => { const inputPayload = getCreateEndpointListItemSchemaMock(); const outputPayload = getCreateEndpointListItemSchemaMock(); delete inputPayload._tags; @@ -183,7 +183,7 @@ describe('create_endpoint_list_item_schema', () => { expect(message.schema).toEqual(outputPayload); }); - test('it should validate an undefined for "item_id" and auto generate a uuid', () => { + test('it should pass validation when supplied an undefined for "item_id" and auto generate a uuid', () => { const inputPayload = getCreateEndpointListItemSchemaMock(); delete inputPayload.item_id; const decoded = createEndpointListItemSchema.decode(inputPayload); @@ -195,7 +195,7 @@ describe('create_endpoint_list_item_schema', () => { ); }); - test('it should validate an undefined for "item_id" and generate a correct body not counting the uuid', () => { + test('it should pass validation when supplied an undefined for "item_id" and generate a correct body not counting the uuid', () => { const inputPayload = getCreateEndpointListItemSchemaMock(); delete inputPayload.item_id; const decoded = createEndpointListItemSchema.decode(inputPayload); diff --git a/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.test.ts b/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.test.ts index 08f3966af08d9..cf4c1fea0306f 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.test.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.test.ts @@ -8,8 +8,8 @@ import { left } from 'fp-ts/lib/Either'; import { pipe } from 'fp-ts/lib/pipeable'; import { exactCheck, foldLeftRight, getPaths } from '../../siem_common_deps'; -import { getCreateCommentsArrayMock } from '../types/create_comments.mock'; -import { getCommentsMock } from '../types/comments.mock'; +import { getCreateCommentsArrayMock } from '../types/create_comment.mock'; +import { getCommentsMock } from '../types/comment.mock'; import { CommentsArray } from '../types'; import { @@ -19,7 +19,7 @@ import { import { getCreateExceptionListItemSchemaMock } from './create_exception_list_item_schema.mock'; describe('create_exception_list_item_schema', () => { - test('it should validate a typical exception list item request not counting the auto generated uuid', () => { + test('it should pass validation when supplied a typical exception list item request not counting the auto generated uuid', () => { const payload = getCreateExceptionListItemSchemaMock(); const decoded = createExceptionListItemSchema.decode(payload); const checked = exactCheck(payload, decoded); @@ -29,7 +29,7 @@ describe('create_exception_list_item_schema', () => { expect(message.schema).toEqual(payload); }); - test('it should not validate an undefined for "description"', () => { + test('it should fail validation when supplied an undefined for "description"', () => { const payload = getCreateExceptionListItemSchemaMock(); delete payload.description; const decoded = createExceptionListItemSchema.decode(payload); @@ -41,7 +41,7 @@ describe('create_exception_list_item_schema', () => { expect(message.schema).toEqual({}); }); - test('it should not validate an undefined for "name"', () => { + test('it should fail validation when supplied an undefined for "name"', () => { const payload = getCreateExceptionListItemSchemaMock(); delete payload.name; const decoded = createExceptionListItemSchema.decode(payload); @@ -53,7 +53,7 @@ describe('create_exception_list_item_schema', () => { expect(message.schema).toEqual({}); }); - test('it should not validate an undefined for "type"', () => { + test('it should fail validation when supplied an undefined for "type"', () => { const payload = getCreateExceptionListItemSchemaMock(); delete payload.type; const decoded = createExceptionListItemSchema.decode(payload); @@ -65,7 +65,7 @@ describe('create_exception_list_item_schema', () => { expect(message.schema).toEqual({}); }); - test('it should not validate an undefined for "list_id"', () => { + test('it should fail validation when supplied an undefined for "list_id"', () => { const inputPayload = getCreateExceptionListItemSchemaMock(); delete inputPayload.list_id; const decoded = createExceptionListItemSchema.decode(inputPayload); @@ -77,7 +77,7 @@ describe('create_exception_list_item_schema', () => { expect(message.schema).toEqual({}); }); - test('it should validate an undefined for "meta" but strip it out and generate a correct body not counting the auto generated uuid', () => { + test('it should pass validation when supplied an undefined for "meta" but strip it out and generate a correct body not counting the auto generated uuid', () => { const payload = getCreateExceptionListItemSchemaMock(); const outputPayload = getCreateExceptionListItemSchemaMock(); delete payload.meta; @@ -90,7 +90,7 @@ describe('create_exception_list_item_schema', () => { expect(message.schema).toEqual(outputPayload); }); - test('it should validate an undefined for "comments" but return an array and generate a correct body not counting the auto generated uuid', () => { + test('it should pass validation when supplied an undefined for "comments" but return an array and generate a correct body not counting the auto generated uuid', () => { const inputPayload = getCreateExceptionListItemSchemaMock(); const outputPayload = getCreateExceptionListItemSchemaMock(); delete inputPayload.comments; @@ -103,7 +103,7 @@ describe('create_exception_list_item_schema', () => { expect(message.schema).toEqual(outputPayload); }); - test('it should validate "comments" array', () => { + test('it should pass validation when supplied "comments" array', () => { const inputPayload = { ...getCreateExceptionListItemSchemaMock(), comments: getCreateCommentsArrayMock(), @@ -116,7 +116,7 @@ describe('create_exception_list_item_schema', () => { expect(message.schema).toEqual(inputPayload); }); - test('it should NOT validate "comments" with "created_at" or "created_by" values', () => { + test('it should fail validation when supplied "comments" with "created_at" or "created_by" values', () => { const inputPayload: Omit & { comments?: CommentsArray; } = { @@ -126,11 +126,11 @@ describe('create_exception_list_item_schema', () => { const decoded = createExceptionListItemSchema.decode(inputPayload); const checked = exactCheck(inputPayload, decoded); const message = pipe(checked, foldLeftRight); - expect(getPaths(left(message.errors))).toEqual(['invalid keys "created_at,created_by"']); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "created_at,created_by,id"']); expect(message.schema).toEqual({}); }); - test('it should NOT validate an undefined for "entries"', () => { + test('it should fail validation when supplied an undefined for "entries"', () => { const inputPayload = getCreateExceptionListItemSchemaMock(); const outputPayload = getCreateExceptionListItemSchemaMock(); delete inputPayload.entries; @@ -145,7 +145,7 @@ describe('create_exception_list_item_schema', () => { expect(message.schema).toEqual({}); }); - test('it should validate an undefined for "namespace_type" but return enum "single" and generate a correct body not counting the auto generated uuid', () => { + test('it should pass validation when supplied an undefined for "namespace_type" but return enum "single" and generate a correct body not counting the auto generated uuid', () => { const inputPayload = getCreateExceptionListItemSchemaMock(); const outputPayload = getCreateExceptionListItemSchemaMock(); delete inputPayload.namespace_type; @@ -158,7 +158,7 @@ describe('create_exception_list_item_schema', () => { expect(message.schema).toEqual(outputPayload); }); - test('it should validate an undefined for "tags" but return an array and generate a correct body not counting the auto generated uuid', () => { + test('it should pass validation when supplied an undefined for "tags" but return an array and generate a correct body not counting the auto generated uuid', () => { const inputPayload = getCreateExceptionListItemSchemaMock(); const outputPayload = getCreateExceptionListItemSchemaMock(); delete inputPayload.tags; @@ -171,7 +171,7 @@ describe('create_exception_list_item_schema', () => { expect(message.schema).toEqual(outputPayload); }); - test('it should validate an undefined for "_tags" but return an array and generate a correct body not counting the auto generated uuid', () => { + test('it should pass validation when supplied an undefined for "_tags" but return an array and generate a correct body not counting the auto generated uuid', () => { const inputPayload = getCreateExceptionListItemSchemaMock(); const outputPayload = getCreateExceptionListItemSchemaMock(); delete inputPayload._tags; @@ -184,7 +184,7 @@ describe('create_exception_list_item_schema', () => { expect(message.schema).toEqual(outputPayload); }); - test('it should validate an undefined for "item_id" and auto generate a uuid', () => { + test('it should pass validation when supplied an undefined for "item_id" and auto generate a uuid', () => { const inputPayload = getCreateExceptionListItemSchemaMock(); delete inputPayload.item_id; const decoded = createExceptionListItemSchema.decode(inputPayload); @@ -196,7 +196,7 @@ describe('create_exception_list_item_schema', () => { ); }); - test('it should validate an undefined for "item_id" and generate a correct body not counting the uuid', () => { + test('it should pass validation when supplied an undefined for "item_id" and generate a correct body not counting the uuid', () => { const inputPayload = getCreateExceptionListItemSchemaMock(); delete inputPayload.item_id; const decoded = createExceptionListItemSchema.decode(inputPayload); diff --git a/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_validation.test.ts b/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_validation.test.ts new file mode 100644 index 0000000000000..3358582786cc7 --- /dev/null +++ b/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_validation.test.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getUpdateExceptionListItemSchemaMock } from './update_exception_list_item_schema.mock'; +import { validateComments } from './update_exception_list_item_validation'; + +describe('update_exception_list_item_validation', () => { + describe('#validateComments', () => { + test('it returns no errors if comments is undefined', () => { + const payload = getUpdateExceptionListItemSchemaMock(); + delete payload.comments; + const output = validateComments(payload); + + expect(output).toEqual([]); + }); + + test('it returns no errors if new comments are append only', () => { + const payload = getUpdateExceptionListItemSchemaMock(); + payload.comments = [ + { comment: 'Im an old comment', id: '1' }, + { comment: 'Im a new comment' }, + ]; + const output = validateComments(payload); + + expect(output).toEqual([]); + }); + + test('it returns error if comments are not append only', () => { + const payload = getUpdateExceptionListItemSchemaMock(); + payload.comments = [ + { comment: 'Im an old comment', id: '1' }, + { comment: 'Im a new comment modifying the order of existing comments' }, + { comment: 'Im an old comment', id: '2' }, + ]; + const output = validateComments(payload); + + expect(output).toEqual(['item "comments" are append only']); + }); + }); +}); diff --git a/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_validation.ts b/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_validation.ts new file mode 100644 index 0000000000000..5e44c4e9f73e7 --- /dev/null +++ b/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_validation.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UpdateExceptionListItemSchema } from './update_exception_list_item_schema'; + +export const validateComments = (item: UpdateExceptionListItemSchema): string[] => { + if (item.comments == null) { + return []; + } + + const [appendOnly] = item.comments.reduce( + (acc, comment) => { + const [, hasNewComments] = acc; + if (comment.id == null) { + return [true, true]; + } + + if (hasNewComments && comment.id != null) { + return [false, true]; + } + + return acc; + }, + [true, false] + ); + if (!appendOnly) { + return ['item "comments" are append only']; + } else { + return []; + } +}; + +export const updateExceptionListItemValidate = ( + schema: UpdateExceptionListItemSchema +): string[] => { + return [...validateComments(schema)]; +}; diff --git a/x-pack/plugins/lists/common/schemas/types/comments.mock.ts b/x-pack/plugins/lists/common/schemas/types/comment.mock.ts similarity index 71% rename from x-pack/plugins/lists/common/schemas/types/comments.mock.ts rename to x-pack/plugins/lists/common/schemas/types/comment.mock.ts index 9e56ac292f8b5..213259b3cce29 100644 --- a/x-pack/plugins/lists/common/schemas/types/comments.mock.ts +++ b/x-pack/plugins/lists/common/schemas/types/comment.mock.ts @@ -4,14 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { DATE_NOW, USER } from '../../constants.mock'; +import { DATE_NOW, ID, USER } from '../../constants.mock'; -import { Comments, CommentsArray } from './comments'; +import { Comment, CommentsArray } from './comment'; -export const getCommentsMock = (): Comments => ({ +export const getCommentsMock = (): Comment => ({ comment: 'some old comment', created_at: DATE_NOW, created_by: USER, + id: ID, }); export const getCommentsArrayMock = (): CommentsArray => [getCommentsMock(), getCommentsMock()]; diff --git a/x-pack/plugins/lists/common/schemas/types/comments.test.ts b/x-pack/plugins/lists/common/schemas/types/comment.test.ts similarity index 56% rename from x-pack/plugins/lists/common/schemas/types/comments.test.ts rename to x-pack/plugins/lists/common/schemas/types/comment.test.ts index 29bfde03abcc8..c7c945277f756 100644 --- a/x-pack/plugins/lists/common/schemas/types/comments.test.ts +++ b/x-pack/plugins/lists/common/schemas/types/comment.test.ts @@ -10,56 +10,79 @@ import { left } from 'fp-ts/lib/Either'; import { DATE_NOW } from '../../constants.mock'; import { foldLeftRight, getPaths } from '../../siem_common_deps'; -import { getCommentsArrayMock, getCommentsMock } from './comments.mock'; +import { getCommentsArrayMock, getCommentsMock } from './comment.mock'; import { - Comments, + Comment, CommentsArray, CommentsArrayOrUndefined, - comments, + comment, commentsArray, commentsArrayOrUndefined, -} from './comments'; +} from './comment'; -describe('Comments', () => { - describe('comments', () => { - test('it should validate a comments', () => { +describe('Comment', () => { + describe('comment', () => { + test('it fails validation when "id" is undefined', () => { + const payload = { ...getCommentsMock(), id: undefined }; + const decoded = comment.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "id"', + ]); + expect(message.schema).toEqual({}); + }); + + test('it passes validation with a typical comment', () => { const payload = getCommentsMock(); - const decoded = comments.decode(payload); + const decoded = comment.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); expect(message.schema).toEqual(payload); }); - test('it should validate with "updated_at" and "updated_by"', () => { + test('it passes validation with "updated_at" and "updated_by" fields included', () => { const payload = getCommentsMock(); payload.updated_at = DATE_NOW; payload.updated_by = 'someone'; - const decoded = comments.decode(payload); + const decoded = comment.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); expect(message.schema).toEqual(payload); }); - test('it should not validate when undefined', () => { + test('it fails validation when undefined', () => { const payload = undefined; - const decoded = comments.decode(payload); + const decoded = comment.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "undefined" supplied to "({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>)"', - 'Invalid value "undefined" supplied to "({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>)"', + 'Invalid value "undefined" supplied to "({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)"', + 'Invalid value "undefined" supplied to "({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)"', ]); expect(message.schema).toEqual({}); }); - test('it should not validate when "comment" is not a string', () => { - const payload: Omit & { comment: string[] } = { + test('it fails validation when "comment" is an empty string', () => { + const payload: Omit & { comment: string } = { + ...getCommentsMock(), + comment: '', + }; + const decoded = comment.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "" supplied to "comment"']); + expect(message.schema).toEqual({}); + }); + + test('it fails validation when "comment" is not a string', () => { + const payload: Omit & { comment: string[] } = { ...getCommentsMock(), comment: ['some value'], }; - const decoded = comments.decode(payload); + const decoded = comment.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ @@ -68,12 +91,12 @@ describe('Comments', () => { expect(message.schema).toEqual({}); }); - test('it should not validate when "created_at" is not a string', () => { - const payload: Omit & { created_at: number } = { + test('it fails validation when "created_at" is not a string', () => { + const payload: Omit & { created_at: number } = { ...getCommentsMock(), created_at: 1, }; - const decoded = comments.decode(payload); + const decoded = comment.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ @@ -82,12 +105,12 @@ describe('Comments', () => { expect(message.schema).toEqual({}); }); - test('it should not validate when "created_by" is not a string', () => { - const payload: Omit & { created_by: number } = { + test('it fails validation when "created_by" is not a string', () => { + const payload: Omit & { created_by: number } = { ...getCommentsMock(), created_by: 1, }; - const decoded = comments.decode(payload); + const decoded = comment.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ @@ -96,12 +119,12 @@ describe('Comments', () => { expect(message.schema).toEqual({}); }); - test('it should not validate when "updated_at" is not a string', () => { - const payload: Omit & { updated_at: number } = { + test('it fails validation when "updated_at" is not a string', () => { + const payload: Omit & { updated_at: number } = { ...getCommentsMock(), updated_at: 1, }; - const decoded = comments.decode(payload); + const decoded = comment.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ @@ -110,12 +133,12 @@ describe('Comments', () => { expect(message.schema).toEqual({}); }); - test('it should not validate when "updated_by" is not a string', () => { - const payload: Omit & { updated_by: number } = { + test('it fails validation when "updated_by" is not a string', () => { + const payload: Omit & { updated_by: number } = { ...getCommentsMock(), updated_by: 1, }; - const decoded = comments.decode(payload); + const decoded = comment.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ @@ -125,11 +148,11 @@ describe('Comments', () => { }); test('it should strip out extra keys', () => { - const payload: Comments & { + const payload: Comment & { extraKey?: string; } = getCommentsMock(); payload.extraKey = 'some value'; - const decoded = comments.decode(payload); + const decoded = comment.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); @@ -138,7 +161,7 @@ describe('Comments', () => { }); describe('commentsArray', () => { - test('it should validate an array of comments', () => { + test('it passes validation an array of Comment', () => { const payload = getCommentsArrayMock(); const decoded = commentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -147,7 +170,7 @@ describe('Comments', () => { expect(message.schema).toEqual(payload); }); - test('it should validate when a comments includes "updated_at" and "updated_by"', () => { + test('it passes validation when a Comment includes "updated_at" and "updated_by"', () => { const commentsPayload = getCommentsMock(); commentsPayload.updated_at = DATE_NOW; commentsPayload.updated_by = 'someone'; @@ -159,32 +182,32 @@ describe('Comments', () => { expect(message.schema).toEqual(payload); }); - test('it should not validate when undefined', () => { + test('it fails validation when undefined', () => { const payload = undefined; const decoded = commentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "undefined" supplied to "Array<({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>)>"', + 'Invalid value "undefined" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', ]); expect(message.schema).toEqual({}); }); - test('it should not validate when array includes non comments types', () => { + test('it fails validation when array includes non Comment types', () => { const payload = ([1] as unknown) as CommentsArray; const decoded = commentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "1" supplied to "Array<({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>)>"', - 'Invalid value "1" supplied to "Array<({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>)>"', + 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', + 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', ]); expect(message.schema).toEqual({}); }); }); describe('commentsArrayOrUndefined', () => { - test('it should validate an array of comments', () => { + test('it passes validation an array of Comment', () => { const payload = getCommentsArrayMock(); const decoded = commentsArrayOrUndefined.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -193,7 +216,7 @@ describe('Comments', () => { expect(message.schema).toEqual(payload); }); - test('it should validate when undefined', () => { + test('it passes validation when undefined', () => { const payload = undefined; const decoded = commentsArrayOrUndefined.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -202,14 +225,14 @@ describe('Comments', () => { expect(message.schema).toEqual(payload); }); - test('it should not validate when array includes non comments types', () => { + test('it fails validation when array includes non Comment types', () => { const payload = ([1] as unknown) as CommentsArrayOrUndefined; const decoded = commentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "1" supplied to "Array<({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>)>"', - 'Invalid value "1" supplied to "Array<({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>)>"', + 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', + 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', ]); expect(message.schema).toEqual({}); }); diff --git a/x-pack/plugins/lists/common/schemas/types/comments.ts b/x-pack/plugins/lists/common/schemas/types/comment.ts similarity index 56% rename from x-pack/plugins/lists/common/schemas/types/comments.ts rename to x-pack/plugins/lists/common/schemas/types/comment.ts index 0ee3b05c8102f..6b0b0166b9ee1 100644 --- a/x-pack/plugins/lists/common/schemas/types/comments.ts +++ b/x-pack/plugins/lists/common/schemas/types/comment.ts @@ -3,26 +3,33 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + +/* eslint-disable @typescript-eslint/camelcase */ + import * as t from 'io-ts'; -export const comments = t.intersection([ +import { NonEmptyString } from '../../siem_common_deps'; +import { created_at, created_by, id, updated_at, updated_by } from '../common/schemas'; + +export const comment = t.intersection([ t.exact( t.type({ - comment: t.string, - created_at: t.string, // TODO: Make this into an ISO Date string check, - created_by: t.string, + comment: NonEmptyString, + created_at, + created_by, + id, }) ), t.exact( t.partial({ - updated_at: t.string, - updated_by: t.string, + updated_at, + updated_by, }) ), ]); -export const commentsArray = t.array(comments); +export const commentsArray = t.array(comment); export type CommentsArray = t.TypeOf; -export type Comments = t.TypeOf; +export type Comment = t.TypeOf; export const commentsArrayOrUndefined = t.union([commentsArray, t.undefined]); export type CommentsArrayOrUndefined = t.TypeOf; diff --git a/x-pack/plugins/lists/common/schemas/types/create_comments.mock.ts b/x-pack/plugins/lists/common/schemas/types/create_comment.mock.ts similarity index 73% rename from x-pack/plugins/lists/common/schemas/types/create_comments.mock.ts rename to x-pack/plugins/lists/common/schemas/types/create_comment.mock.ts index 60a59432275ca..689d4ccdc2c2e 100644 --- a/x-pack/plugins/lists/common/schemas/types/create_comments.mock.ts +++ b/x-pack/plugins/lists/common/schemas/types/create_comment.mock.ts @@ -3,9 +3,9 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { CreateComments, CreateCommentsArray } from './create_comments'; +import { CreateComment, CreateCommentsArray } from './create_comment'; -export const getCreateCommentsMock = (): CreateComments => ({ +export const getCreateCommentsMock = (): CreateComment => ({ comment: 'some comments', }); diff --git a/x-pack/plugins/lists/common/schemas/types/create_comments.test.ts b/x-pack/plugins/lists/common/schemas/types/create_comment.test.ts similarity index 72% rename from x-pack/plugins/lists/common/schemas/types/create_comments.test.ts rename to x-pack/plugins/lists/common/schemas/types/create_comment.test.ts index d2680750e05e4..366bf84d48bbf 100644 --- a/x-pack/plugins/lists/common/schemas/types/create_comments.test.ts +++ b/x-pack/plugins/lists/common/schemas/types/create_comment.test.ts @@ -9,44 +9,44 @@ import { left } from 'fp-ts/lib/Either'; import { foldLeftRight, getPaths } from '../../siem_common_deps'; -import { getCreateCommentsArrayMock, getCreateCommentsMock } from './create_comments.mock'; +import { getCreateCommentsArrayMock, getCreateCommentsMock } from './create_comment.mock'; import { - CreateComments, + CreateComment, CreateCommentsArray, CreateCommentsArrayOrUndefined, - createComments, + createComment, createCommentsArray, createCommentsArrayOrUndefined, -} from './create_comments'; +} from './create_comment'; -describe('CreateComments', () => { - describe('createComments', () => { - test('it should validate a comments', () => { +describe('CreateComment', () => { + describe('createComment', () => { + test('it passes validation with a default comment', () => { const payload = getCreateCommentsMock(); - const decoded = createComments.decode(payload); + const decoded = createComment.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); expect(message.schema).toEqual(payload); }); - test('it should not validate when undefined', () => { + test('it fails validation when undefined', () => { const payload = undefined; - const decoded = createComments.decode(payload); + const decoded = createComment.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "undefined" supplied to "{| comment: string |}"', + 'Invalid value "undefined" supplied to "{| comment: NonEmptyString |}"', ]); expect(message.schema).toEqual({}); }); - test('it should not validate when "comment" is not a string', () => { - const payload: Omit & { comment: string[] } = { + test('it fails validation when "comment" is not a string', () => { + const payload: Omit & { comment: string[] } = { ...getCreateCommentsMock(), comment: ['some value'], }; - const decoded = createComments.decode(payload); + const decoded = createComment.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ @@ -56,11 +56,11 @@ describe('CreateComments', () => { }); test('it should strip out extra keys', () => { - const payload: CreateComments & { + const payload: CreateComment & { extraKey?: string; } = getCreateCommentsMock(); payload.extraKey = 'some value'; - const decoded = createComments.decode(payload); + const decoded = createComment.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([]); @@ -69,7 +69,7 @@ describe('CreateComments', () => { }); describe('createCommentsArray', () => { - test('it should validate an array of comments', () => { + test('it passes validation an array of comments', () => { const payload = getCreateCommentsArrayMock(); const decoded = createCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -78,31 +78,31 @@ describe('CreateComments', () => { expect(message.schema).toEqual(payload); }); - test('it should not validate when undefined', () => { + test('it fails validation when undefined', () => { const payload = undefined; const decoded = createCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "undefined" supplied to "Array<{| comment: string |}>"', + 'Invalid value "undefined" supplied to "Array<{| comment: NonEmptyString |}>"', ]); expect(message.schema).toEqual({}); }); - test('it should not validate when array includes non comments types', () => { + test('it fails validation when array includes non comments types', () => { const payload = ([1] as unknown) as CreateCommentsArray; const decoded = createCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "1" supplied to "Array<{| comment: string |}>"', + 'Invalid value "1" supplied to "Array<{| comment: NonEmptyString |}>"', ]); expect(message.schema).toEqual({}); }); }); describe('createCommentsArrayOrUndefined', () => { - test('it should validate an array of comments', () => { + test('it passes validation an array of comments', () => { const payload = getCreateCommentsArrayMock(); const decoded = createCommentsArrayOrUndefined.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -111,7 +111,7 @@ describe('CreateComments', () => { expect(message.schema).toEqual(payload); }); - test('it should validate when undefined', () => { + test('it passes validation when undefined', () => { const payload = undefined; const decoded = createCommentsArrayOrUndefined.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -120,13 +120,13 @@ describe('CreateComments', () => { expect(message.schema).toEqual(payload); }); - test('it should not validate when array includes non comments types', () => { + test('it fails validation when array includes non comments types', () => { const payload = ([1] as unknown) as CreateCommentsArrayOrUndefined; const decoded = createCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "1" supplied to "Array<{| comment: string |}>"', + 'Invalid value "1" supplied to "Array<{| comment: NonEmptyString |}>"', ]); expect(message.schema).toEqual({}); }); diff --git a/x-pack/plugins/lists/common/schemas/types/create_comments.ts b/x-pack/plugins/lists/common/schemas/types/create_comment.ts similarity index 64% rename from x-pack/plugins/lists/common/schemas/types/create_comments.ts rename to x-pack/plugins/lists/common/schemas/types/create_comment.ts index c34419298ef93..fd33313430ce6 100644 --- a/x-pack/plugins/lists/common/schemas/types/create_comments.ts +++ b/x-pack/plugins/lists/common/schemas/types/create_comment.ts @@ -5,14 +5,17 @@ */ import * as t from 'io-ts'; -export const createComments = t.exact( +import { NonEmptyString } from '../../siem_common_deps'; + +export const createComment = t.exact( t.type({ - comment: t.string, + comment: NonEmptyString, }) ); -export const createCommentsArray = t.array(createComments); +export type CreateComment = t.TypeOf; +export const createCommentsArray = t.array(createComment); export type CreateCommentsArray = t.TypeOf; -export type CreateComments = t.TypeOf; +export type CreateComments = t.TypeOf; export const createCommentsArrayOrUndefined = t.union([createCommentsArray, t.undefined]); export type CreateCommentsArrayOrUndefined = t.TypeOf; diff --git a/x-pack/plugins/lists/common/schemas/types/default_comments_array.test.ts b/x-pack/plugins/lists/common/schemas/types/default_comments_array.test.ts index 3a4241aaec82d..541b8ab1c799c 100644 --- a/x-pack/plugins/lists/common/schemas/types/default_comments_array.test.ts +++ b/x-pack/plugins/lists/common/schemas/types/default_comments_array.test.ts @@ -10,11 +10,11 @@ import { left } from 'fp-ts/lib/Either'; import { foldLeftRight, getPaths } from '../../siem_common_deps'; import { DefaultCommentsArray } from './default_comments_array'; -import { CommentsArray } from './comments'; -import { getCommentsArrayMock } from './comments.mock'; +import { CommentsArray } from './comment'; +import { getCommentsArrayMock } from './comment.mock'; describe('default_comments_array', () => { - test('it should validate an empty array', () => { + test('it should pass validation when supplied an empty array', () => { const payload: CommentsArray = []; const decoded = DefaultCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -23,7 +23,7 @@ describe('default_comments_array', () => { expect(message.schema).toEqual(payload); }); - test('it should validate an array of comments', () => { + test('it should pass validation when supplied an array of comments', () => { const payload: CommentsArray = getCommentsArrayMock(); const decoded = DefaultCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -32,27 +32,26 @@ describe('default_comments_array', () => { expect(message.schema).toEqual(payload); }); - test('it should NOT validate an array of numbers', () => { + test('it should fail validation when supplied an array of numbers', () => { const payload = [1]; const decoded = DefaultCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); - // TODO: Known weird error formatting that is on our list to address expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "1" supplied to "Array<({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>)>"', - 'Invalid value "1" supplied to "Array<({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>)>"', + 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', + 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', ]); expect(message.schema).toEqual({}); }); - test('it should NOT validate an array of strings', () => { + test('it should fail validation when supplied an array of strings', () => { const payload = ['some string']; const decoded = DefaultCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "some string" supplied to "Array<({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>)>"', - 'Invalid value "some string" supplied to "Array<({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>)>"', + 'Invalid value "some string" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', + 'Invalid value "some string" supplied to "Array<({| comment: NonEmptyString, created_at: string, created_by: string, id: NonEmptyString |} & Partial<{| updated_at: string, updated_by: string |}>)>"', ]); expect(message.schema).toEqual({}); }); diff --git a/x-pack/plugins/lists/common/schemas/types/default_comments_array.ts b/x-pack/plugins/lists/common/schemas/types/default_comments_array.ts index 342cf8b0d7091..0d7e28e69cf71 100644 --- a/x-pack/plugins/lists/common/schemas/types/default_comments_array.ts +++ b/x-pack/plugins/lists/common/schemas/types/default_comments_array.ts @@ -7,7 +7,7 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -import { CommentsArray, comments } from './comments'; +import { CommentsArray, comment } from './comment'; /** * Types the DefaultCommentsArray as: @@ -15,8 +15,8 @@ import { CommentsArray, comments } from './comments'; */ export const DefaultCommentsArray = new t.Type( 'DefaultCommentsArray', - t.array(comments).is, + t.array(comment).is, (input): Either => - input == null ? t.success([]) : t.array(comments).decode(input), + input == null ? t.success([]) : t.array(comment).decode(input), t.identity ); diff --git a/x-pack/plugins/lists/common/schemas/types/default_create_comments_array.test.ts b/x-pack/plugins/lists/common/schemas/types/default_create_comments_array.test.ts index f5ef7d0ad96bd..eb960b5411904 100644 --- a/x-pack/plugins/lists/common/schemas/types/default_create_comments_array.test.ts +++ b/x-pack/plugins/lists/common/schemas/types/default_create_comments_array.test.ts @@ -10,11 +10,12 @@ import { left } from 'fp-ts/lib/Either'; import { foldLeftRight, getPaths } from '../../siem_common_deps'; import { DefaultCreateCommentsArray } from './default_create_comments_array'; -import { CreateCommentsArray } from './create_comments'; -import { getCreateCommentsArrayMock } from './create_comments.mock'; +import { CreateCommentsArray } from './create_comment'; +import { getCreateCommentsArrayMock } from './create_comment.mock'; +import { getCommentsArrayMock } from './comment.mock'; describe('default_create_comments_array', () => { - test('it should validate an empty array', () => { + test('it should pass validation when an empty array', () => { const payload: CreateCommentsArray = []; const decoded = DefaultCreateCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -23,7 +24,7 @@ describe('default_create_comments_array', () => { expect(message.schema).toEqual(payload); }); - test('it should validate an array of comments', () => { + test('it should pass validation when an array of comments', () => { const payload: CreateCommentsArray = getCreateCommentsArrayMock(); const decoded = DefaultCreateCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -32,25 +33,38 @@ describe('default_create_comments_array', () => { expect(message.schema).toEqual(payload); }); - test('it should NOT validate an array of numbers', () => { + test('it should strip out "created_at" and "created_by" if they are passed in', () => { + const payload = getCommentsArrayMock(); + const decoded = DefaultCreateCommentsArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + // TODO: Known weird error formatting that is on our list to address + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual([ + { comment: 'some old comment' }, + { comment: 'some old comment' }, + ]); + }); + + test('it should not pass validation when an array of numbers', () => { const payload = [1]; const decoded = DefaultCreateCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); // TODO: Known weird error formatting that is on our list to address expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "1" supplied to "Array<{| comment: string |}>"', + 'Invalid value "1" supplied to "Array<{| comment: NonEmptyString |}>"', ]); expect(message.schema).toEqual({}); }); - test('it should NOT validate an array of strings', () => { + test('it should not pass validation when an array of strings', () => { const payload = ['some string']; const decoded = DefaultCreateCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "some string" supplied to "Array<{| comment: string |}>"', + 'Invalid value "some string" supplied to "Array<{| comment: NonEmptyString |}>"', ]); expect(message.schema).toEqual({}); }); diff --git a/x-pack/plugins/lists/common/schemas/types/default_create_comments_array.ts b/x-pack/plugins/lists/common/schemas/types/default_create_comments_array.ts index 7fd79782836e3..4df888ba728fb 100644 --- a/x-pack/plugins/lists/common/schemas/types/default_create_comments_array.ts +++ b/x-pack/plugins/lists/common/schemas/types/default_create_comments_array.ts @@ -7,7 +7,7 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -import { CreateCommentsArray, createComments } from './create_comments'; +import { CreateCommentsArray, createComment } from './create_comment'; /** * Types the DefaultCreateComments as: @@ -19,8 +19,8 @@ export const DefaultCreateCommentsArray = new t.Type< unknown >( 'DefaultCreateComments', - t.array(createComments).is, + t.array(createComment).is, (input): Either => - input == null ? t.success([]) : t.array(createComments).decode(input), + input == null ? t.success([]) : t.array(createComment).decode(input), t.identity ); diff --git a/x-pack/plugins/lists/common/schemas/types/default_update_comments_array.test.ts b/x-pack/plugins/lists/common/schemas/types/default_update_comments_array.test.ts index b023e73cb9328..612148dc4ccab 100644 --- a/x-pack/plugins/lists/common/schemas/types/default_update_comments_array.test.ts +++ b/x-pack/plugins/lists/common/schemas/types/default_update_comments_array.test.ts @@ -10,11 +10,11 @@ import { left } from 'fp-ts/lib/Either'; import { foldLeftRight, getPaths } from '../../siem_common_deps'; import { DefaultUpdateCommentsArray } from './default_update_comments_array'; -import { UpdateCommentsArray } from './update_comments'; -import { getUpdateCommentsArrayMock } from './update_comments.mock'; +import { UpdateCommentsArray } from './update_comment'; +import { getUpdateCommentsArrayMock } from './update_comment.mock'; describe('default_update_comments_array', () => { - test('it should validate an empty array', () => { + test('it should pass validation when supplied an empty array', () => { const payload: UpdateCommentsArray = []; const decoded = DefaultUpdateCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -23,7 +23,7 @@ describe('default_update_comments_array', () => { expect(message.schema).toEqual(payload); }); - test('it should validate an array of comments', () => { + test('it should pass validation when supplied an array of comments', () => { const payload: UpdateCommentsArray = getUpdateCommentsArrayMock(); const decoded = DefaultUpdateCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -32,29 +32,26 @@ describe('default_update_comments_array', () => { expect(message.schema).toEqual(payload); }); - test('it should NOT validate an array of numbers', () => { + test('it should fail validation when supplied an array of numbers', () => { const payload = [1]; const decoded = DefaultUpdateCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); - // TODO: Known weird error formatting that is on our list to address expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "1" supplied to "Array<(({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>) | {| comment: string |})>"', - 'Invalid value "1" supplied to "Array<(({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>) | {| comment: string |})>"', - 'Invalid value "1" supplied to "Array<(({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>) | {| comment: string |})>"', + 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', + 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', ]); expect(message.schema).toEqual({}); }); - test('it should NOT validate an array of strings', () => { + test('it should fail validation when supplied an array of strings', () => { const payload = ['some string']; const decoded = DefaultUpdateCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "some string" supplied to "Array<(({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>) | {| comment: string |})>"', - 'Invalid value "some string" supplied to "Array<(({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>) | {| comment: string |})>"', - 'Invalid value "some string" supplied to "Array<(({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>) | {| comment: string |})>"', + 'Invalid value "some string" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', + 'Invalid value "some string" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', ]); expect(message.schema).toEqual({}); }); diff --git a/x-pack/plugins/lists/common/schemas/types/default_update_comments_array.ts b/x-pack/plugins/lists/common/schemas/types/default_update_comments_array.ts index 854b7cf7ada7e..35338dae64387 100644 --- a/x-pack/plugins/lists/common/schemas/types/default_update_comments_array.ts +++ b/x-pack/plugins/lists/common/schemas/types/default_update_comments_array.ts @@ -7,7 +7,7 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -import { UpdateCommentsArray, updateCommentsArray } from './update_comments'; +import { UpdateCommentsArray, updateCommentsArray } from './update_comment'; /** * Types the DefaultCommentsUpdate as: diff --git a/x-pack/plugins/lists/common/schemas/types/index.ts b/x-pack/plugins/lists/common/schemas/types/index.ts index 463f7cfe51ce3..6b7e9fd17a1af 100644 --- a/x-pack/plugins/lists/common/schemas/types/index.ts +++ b/x-pack/plugins/lists/common/schemas/types/index.ts @@ -3,9 +3,9 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -export * from './comments'; -export * from './create_comments'; -export * from './update_comments'; +export * from './comment'; +export * from './create_comment'; +export * from './update_comment'; export * from './default_comments_array'; export * from './default_create_comments_array'; export * from './default_update_comments_array'; diff --git a/x-pack/plugins/lists/common/schemas/types/update_comments.mock.ts b/x-pack/plugins/lists/common/schemas/types/update_comment.mock.ts similarity index 54% rename from x-pack/plugins/lists/common/schemas/types/update_comments.mock.ts rename to x-pack/plugins/lists/common/schemas/types/update_comment.mock.ts index 3e963c2607dc5..9b85a24abe40b 100644 --- a/x-pack/plugins/lists/common/schemas/types/update_comments.mock.ts +++ b/x-pack/plugins/lists/common/schemas/types/update_comment.mock.ts @@ -4,11 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getCommentsMock } from './comments.mock'; -import { getCreateCommentsMock } from './create_comments.mock'; -import { UpdateCommentsArray } from './update_comments'; +import { ID } from '../../constants.mock'; + +import { UpdateComment, UpdateCommentsArray } from './update_comment'; + +export const getUpdateCommentMock = (): UpdateComment => ({ + comment: 'some comment', + id: ID, +}); export const getUpdateCommentsArrayMock = (): UpdateCommentsArray => [ - getCommentsMock(), - getCreateCommentsMock(), + getUpdateCommentMock(), + getUpdateCommentMock(), ]; diff --git a/x-pack/plugins/lists/common/schemas/types/update_comment.test.ts b/x-pack/plugins/lists/common/schemas/types/update_comment.test.ts new file mode 100644 index 0000000000000..ac7716af40966 --- /dev/null +++ b/x-pack/plugins/lists/common/schemas/types/update_comment.test.ts @@ -0,0 +1,150 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; + +import { foldLeftRight, getPaths } from '../../siem_common_deps'; + +import { getUpdateCommentMock, getUpdateCommentsArrayMock } from './update_comment.mock'; +import { + UpdateComment, + UpdateCommentsArray, + UpdateCommentsArrayOrUndefined, + updateComment, + updateCommentsArray, + updateCommentsArrayOrUndefined, +} from './update_comment'; + +describe('CommentsUpdate', () => { + describe('updateComment', () => { + test('it should pass validation when supplied typical comment update', () => { + const payload = getUpdateCommentMock(); + const decoded = updateComment.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should fail validation when supplied an undefined for "comment"', () => { + const payload = getUpdateCommentMock(); + delete payload.comment; + const decoded = updateComment.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "comment"', + ]); + expect(message.schema).toEqual({}); + }); + + test('it should fail validation when supplied an empty string for "comment"', () => { + const payload = { ...getUpdateCommentMock(), comment: '' }; + const decoded = updateComment.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "" supplied to "comment"']); + expect(message.schema).toEqual({}); + }); + + test('it should pass validation when supplied an undefined for "id"', () => { + const payload = getUpdateCommentMock(); + delete payload.id; + const decoded = updateComment.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should fail validation when supplied an empty string for "id"', () => { + const payload = { ...getUpdateCommentMock(), id: '' }; + const decoded = updateComment.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Invalid value "" supplied to "id"']); + expect(message.schema).toEqual({}); + }); + + test('it should strip out extra key passed in', () => { + const payload: UpdateComment & { + extraKey?: string; + } = { ...getUpdateCommentMock(), extraKey: 'some new value' }; + const decoded = updateComment.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(getUpdateCommentMock()); + }); + }); + + describe('updateCommentsArray', () => { + test('it should pass validation when supplied an array of comments', () => { + const payload = getUpdateCommentsArrayMock(); + const decoded = updateCommentsArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should fail validation when undefined', () => { + const payload = undefined; + const decoded = updateCommentsArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', + ]); + expect(message.schema).toEqual({}); + }); + + test('it should fail validation when array includes non comments types', () => { + const payload = ([1] as unknown) as UpdateCommentsArray; + const decoded = updateCommentsArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', + 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', + ]); + expect(message.schema).toEqual({}); + }); + }); + + describe('updateCommentsArrayOrUndefined', () => { + test('it should pass validation when supplied an array of comments', () => { + const payload = getUpdateCommentsArrayMock(); + const decoded = updateCommentsArrayOrUndefined.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should pass validation when supplied when undefined', () => { + const payload = undefined; + const decoded = updateCommentsArrayOrUndefined.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should fail validation when array includes non comments types', () => { + const payload = ([1] as unknown) as UpdateCommentsArrayOrUndefined; + const decoded = updateCommentsArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', + 'Invalid value "1" supplied to "Array<({| comment: NonEmptyString |} & Partial<{| id: NonEmptyString |}>)>"', + ]); + expect(message.schema).toEqual({}); + }); + }); +}); diff --git a/x-pack/plugins/lists/common/schemas/types/update_comments.ts b/x-pack/plugins/lists/common/schemas/types/update_comment.ts similarity index 58% rename from x-pack/plugins/lists/common/schemas/types/update_comments.ts rename to x-pack/plugins/lists/common/schemas/types/update_comment.ts index 4a21bfa363d45..b95812cb35bf9 100644 --- a/x-pack/plugins/lists/common/schemas/types/update_comments.ts +++ b/x-pack/plugins/lists/common/schemas/types/update_comment.ts @@ -5,10 +5,24 @@ */ import * as t from 'io-ts'; -import { comments } from './comments'; -import { createComments } from './create_comments'; +import { NonEmptyString } from '../../siem_common_deps'; +import { id } from '../common/schemas'; -export const updateCommentsArray = t.array(t.union([comments, createComments])); +export const updateComment = t.intersection([ + t.exact( + t.type({ + comment: NonEmptyString, + }) + ), + t.exact( + t.partial({ + id, + }) + ), +]); + +export type UpdateComment = t.TypeOf; +export const updateCommentsArray = t.array(updateComment); export type UpdateCommentsArray = t.TypeOf; export const updateCommentsArrayOrUndefined = t.union([updateCommentsArray, t.undefined]); export type UpdateCommentsArrayOrUndefined = t.TypeOf; diff --git a/x-pack/plugins/lists/common/schemas/types/update_comments.test.ts b/x-pack/plugins/lists/common/schemas/types/update_comments.test.ts deleted file mode 100644 index 7668504b031b5..0000000000000 --- a/x-pack/plugins/lists/common/schemas/types/update_comments.test.ts +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { pipe } from 'fp-ts/lib/pipeable'; -import { left } from 'fp-ts/lib/Either'; - -import { foldLeftRight, getPaths } from '../../siem_common_deps'; - -import { getUpdateCommentsArrayMock } from './update_comments.mock'; -import { - UpdateCommentsArray, - UpdateCommentsArrayOrUndefined, - updateCommentsArray, - updateCommentsArrayOrUndefined, -} from './update_comments'; -import { getCommentsMock } from './comments.mock'; -import { getCreateCommentsMock } from './create_comments.mock'; - -describe('CommentsUpdate', () => { - describe('updateCommentsArray', () => { - test('it should validate an array of comments', () => { - const payload = getUpdateCommentsArrayMock(); - const decoded = updateCommentsArray.decode(payload); - const message = pipe(decoded, foldLeftRight); - - expect(getPaths(left(message.errors))).toEqual([]); - expect(message.schema).toEqual(payload); - }); - - test('it should validate an array of existing comments', () => { - const payload = [getCommentsMock()]; - const decoded = updateCommentsArray.decode(payload); - const message = pipe(decoded, foldLeftRight); - - expect(getPaths(left(message.errors))).toEqual([]); - expect(message.schema).toEqual(payload); - }); - - test('it should validate an array of new comments', () => { - const payload = [getCreateCommentsMock()]; - const decoded = updateCommentsArray.decode(payload); - const message = pipe(decoded, foldLeftRight); - - expect(getPaths(left(message.errors))).toEqual([]); - expect(message.schema).toEqual(payload); - }); - - test('it should not validate when undefined', () => { - const payload = undefined; - const decoded = updateCommentsArray.decode(payload); - const message = pipe(decoded, foldLeftRight); - - expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "undefined" supplied to "Array<(({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>) | {| comment: string |})>"', - ]); - expect(message.schema).toEqual({}); - }); - - test('it should not validate when array includes non comments types', () => { - const payload = ([1] as unknown) as UpdateCommentsArray; - const decoded = updateCommentsArray.decode(payload); - const message = pipe(decoded, foldLeftRight); - - expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "1" supplied to "Array<(({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>) | {| comment: string |})>"', - 'Invalid value "1" supplied to "Array<(({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>) | {| comment: string |})>"', - 'Invalid value "1" supplied to "Array<(({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>) | {| comment: string |})>"', - ]); - expect(message.schema).toEqual({}); - }); - }); - - describe('updateCommentsArrayOrUndefined', () => { - test('it should validate an array of comments', () => { - const payload = getUpdateCommentsArrayMock(); - const decoded = updateCommentsArrayOrUndefined.decode(payload); - const message = pipe(decoded, foldLeftRight); - - expect(getPaths(left(message.errors))).toEqual([]); - expect(message.schema).toEqual(payload); - }); - - test('it should validate when undefined', () => { - const payload = undefined; - const decoded = updateCommentsArrayOrUndefined.decode(payload); - const message = pipe(decoded, foldLeftRight); - - expect(getPaths(left(message.errors))).toEqual([]); - expect(message.schema).toEqual(payload); - }); - - test('it should not validate when array includes non comments types', () => { - const payload = ([1] as unknown) as UpdateCommentsArrayOrUndefined; - const decoded = updateCommentsArray.decode(payload); - const message = pipe(decoded, foldLeftRight); - - expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "1" supplied to "Array<(({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>) | {| comment: string |})>"', - 'Invalid value "1" supplied to "Array<(({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>) | {| comment: string |})>"', - 'Invalid value "1" supplied to "Array<(({| comment: string, created_at: string, created_by: string |} & Partial<{| updated_at: string, updated_by: string |}>) | {| comment: string |})>"', - ]); - expect(message.schema).toEqual({}); - }); - }); -}); diff --git a/x-pack/plugins/lists/common/shared_exports.ts b/x-pack/plugins/lists/common/shared_exports.ts index dc0a9aa5926ef..1f6c65919b063 100644 --- a/x-pack/plugins/lists/common/shared_exports.ts +++ b/x-pack/plugins/lists/common/shared_exports.ts @@ -8,8 +8,8 @@ export { ListSchema, CommentsArray, CreateCommentsArray, - Comments, - CreateComments, + Comment, + CreateComment, ExceptionListSchema, ExceptionListItemSchema, CreateExceptionListSchema, @@ -28,6 +28,7 @@ export { OperatorType, OperatorTypeEnum, ExceptionListTypeEnum, + comment, exceptionListItemSchema, exceptionListType, createExceptionListItemSchema, diff --git a/x-pack/plugins/lists/server/routes/update_exception_list_item_route.ts b/x-pack/plugins/lists/server/routes/update_exception_list_item_route.ts index 293435b3f6202..f5e0e7ae75700 100644 --- a/x-pack/plugins/lists/server/routes/update_exception_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/update_exception_list_item_route.ts @@ -14,6 +14,7 @@ import { exceptionListItemSchema, updateExceptionListItemSchema, } from '../../common/schemas'; +import { updateExceptionListItemValidate } from '../../common/schemas/request/update_exception_list_item_validation'; import { getExceptionListClient } from '.'; @@ -33,6 +34,11 @@ export const updateExceptionListItemRoute = (router: IRouter): void => { }, async (context, request, response) => { const siemResponse = buildSiemResponse(response); + const validationErrors = updateExceptionListItemValidate(request.body); + if (validationErrors.length) { + return siemResponse.error({ body: validationErrors, statusCode: 400 }); + } + try { const { description, diff --git a/x-pack/plugins/lists/server/saved_objects/exception_list.ts b/x-pack/plugins/lists/server/saved_objects/exception_list.ts index 3bde3545837cf..f9e408833e069 100644 --- a/x-pack/plugins/lists/server/saved_objects/exception_list.ts +++ b/x-pack/plugins/lists/server/saved_objects/exception_list.ts @@ -83,6 +83,9 @@ export const exceptionListItemMapping: SavedObjectsType['mappings'] = { created_by: { type: 'keyword', }, + id: { + type: 'keyword', + }, updated_at: { type: 'keyword', }, diff --git a/x-pack/plugins/lists/server/scripts/exception_lists/updates/simple_update_item.json b/x-pack/plugins/lists/server/scripts/exception_lists/updates/simple_update_item.json index da345fb930c04..81db909277595 100644 --- a/x-pack/plugins/lists/server/scripts/exception_lists/updates/simple_update_item.json +++ b/x-pack/plugins/lists/server/scripts/exception_lists/updates/simple_update_item.json @@ -1,17 +1,18 @@ { - "item_id": "simple_list_item", - "_tags": ["endpoint", "process", "malware", "os:windows"], - "tags": ["user added string for a tag", "malware"], - "type": "simple", - "description": "This is a sample change here this list", - "name": "Sample Endpoint Exception List update change", - "comments": [{ "comment": "this is a newly added comment" }], + "_tags": ["detection"], + "comments": [], + "description": "Test comments - exception list item", "entries": [ { - "field": "event.category", - "operator": "included", - "type": "match_any", - "value": ["process", "malware"] + "field": "host.name", + "type": "match", + "value": "rock01", + "operator": "included" } - ] + ], + "item_id": "993f43f7-325d-4df3-9338-964e77c37053", + "name": "Test comments - exception list item", + "namespace_type": "single", + "tags": [], + "type": "simple" } diff --git a/x-pack/plugins/lists/server/services/exception_lists/create_exception_list_item.ts b/x-pack/plugins/lists/server/services/exception_lists/create_exception_list_item.ts index a90ec61aef4af..47c21735b45f4 100644 --- a/x-pack/plugins/lists/server/services/exception_lists/create_exception_list_item.ts +++ b/x-pack/plugins/lists/server/services/exception_lists/create_exception_list_item.ts @@ -64,7 +64,10 @@ export const createExceptionListItem = async ({ }: CreateExceptionListItemOptions): Promise => { const savedObjectType = getSavedObjectType({ namespaceType }); const dateNow = new Date().toISOString(); - const transformedComments = transformCreateCommentsToComments({ comments, user }); + const transformedComments = transformCreateCommentsToComments({ + incomingComments: comments, + user, + }); const savedObject = await savedObjectsClient.create(savedObjectType, { _tags, comments: transformedComments, diff --git a/x-pack/plugins/lists/server/services/exception_lists/utils.test.ts b/x-pack/plugins/lists/server/services/exception_lists/utils.test.ts index 6f0c5195f2025..e3d96a9c3f6d0 100644 --- a/x-pack/plugins/lists/server/services/exception_lists/utils.test.ts +++ b/x-pack/plugins/lists/server/services/exception_lists/utils.test.ts @@ -5,15 +5,11 @@ */ import sinon from 'sinon'; import moment from 'moment'; +import uuid from 'uuid'; -import { USER } from '../../../common/constants.mock'; +import { transformCreateCommentsToComments, transformUpdateCommentsToComments } from './utils'; -import { - isCommentEqual, - transformCreateCommentsToComments, - transformUpdateComments, - transformUpdateCommentsToComments, -} from './utils'; +jest.mock('uuid/v4'); describe('utils', () => { const oldDate = '2020-03-17T20:34:51.337Z'; @@ -22,59 +18,43 @@ describe('utils', () => { let clock: sinon.SinonFakeTimers; beforeEach(() => { + ((uuid.v4 as unknown) as jest.Mock) + .mockImplementationOnce(() => '123') + .mockImplementationOnce(() => '456'); + clock = sinon.useFakeTimers(unix); }); afterEach(() => { clock.restore(); + jest.clearAllMocks(); + jest.restoreAllMocks(); + jest.resetAllMocks(); }); describe('#transformUpdateCommentsToComments', () => { - test('it returns empty array if "comments" is undefined and no comments exist', () => { + test('it formats new comments', () => { const comments = transformUpdateCommentsToComments({ - comments: undefined, + comments: [{ comment: 'Im a new comment' }], existingComments: [], user: 'lily', }); - expect(comments).toEqual([]); - }); - - test('it formats newly added comments', () => { - const comments = transformUpdateCommentsToComments({ - comments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'bane' }, - { comment: 'Im a new comment' }, - ], - existingComments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'bane' }, - ], - user: 'lily', - }); - expect(comments).toEqual([ - { - comment: 'Im an old comment', - created_at: oldDate, - created_by: 'bane', - }, { comment: 'Im a new comment', created_at: dateNow, created_by: 'lily', + id: '123', }, ]); }); - test('it formats multiple newly added comments', () => { + test('it formats new comments and preserves existing comments', () => { const comments = transformUpdateCommentsToComments({ - comments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }, - { comment: 'Im a new comment' }, - { comment: 'Im another new comment' }, - ], + comments: [{ comment: 'Im an old comment', id: '1' }, { comment: 'Im a new comment' }], existingComments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }, + { comment: 'Im an old comment', created_at: oldDate, created_by: 'bane', id: '1' }, ], user: 'lily', }); @@ -83,26 +63,23 @@ describe('utils', () => { { comment: 'Im an old comment', created_at: oldDate, - created_by: 'lily', + created_by: 'bane', + id: '1', }, { comment: 'Im a new comment', created_at: dateNow, created_by: 'lily', - }, - { - comment: 'Im another new comment', - created_at: dateNow, - created_by: 'lily', + id: '123', }, ]); }); - test('it should not throw if comments match existing comments', () => { + test('it returns existing comments if empty array passed for "comments"', () => { const comments = transformUpdateCommentsToComments({ - comments: [{ comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }], + comments: [], existingComments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }, + { comment: 'Im an old comment', created_at: oldDate, created_by: 'bane', id: '1' }, ], user: 'lily', }); @@ -111,170 +88,42 @@ describe('utils', () => { { comment: 'Im an old comment', created_at: oldDate, - created_by: 'lily', + created_by: 'bane', + id: '1', }, ]); }); - test('it does not throw if user tries to update one of their own existing comments', () => { + test('it acts as append only, only modifying new comments', () => { const comments = transformUpdateCommentsToComments({ - comments: [ - { - comment: 'Im an old comment that is trying to be updated', - created_at: oldDate, - created_by: 'lily', - }, - ], + comments: [{ comment: 'Im a new comment' }], existingComments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }, + { comment: 'Im an old comment', created_at: oldDate, created_by: 'bane', id: '1' }, ], user: 'lily', }); expect(comments).toEqual([ { - comment: 'Im an old comment that is trying to be updated', + comment: 'Im an old comment', created_at: oldDate, + created_by: 'bane', + id: '1', + }, + { + comment: 'Im a new comment', + created_at: dateNow, created_by: 'lily', - updated_at: dateNow, - updated_by: 'lily', + id: '123', }, ]); }); - - test('it throws an error if user tries to update their comment, without passing in the "created_at" and "created_by" properties', () => { - expect(() => - transformUpdateCommentsToComments({ - comments: [ - { - comment: 'Im an old comment that is trying to be updated', - }, - ], - existingComments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }, - ], - user: 'lily', - }) - ).toThrowErrorMatchingInlineSnapshot( - `"When trying to update a comment, \\"created_at\\" and \\"created_by\\" must be present"` - ); - }); - - test('it throws an error if user tries to delete comments', () => { - expect(() => - transformUpdateCommentsToComments({ - comments: [], - existingComments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }, - ], - user: 'lily', - }) - ).toThrowErrorMatchingInlineSnapshot( - `"Comments cannot be deleted, only new comments may be added"` - ); - }); - - test('it throws if user tries to update existing comment timestamp', () => { - expect(() => - transformUpdateCommentsToComments({ - comments: [{ comment: 'Im an old comment', created_at: dateNow, created_by: 'lily' }], - existingComments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }, - ], - user: 'bane', - }) - ).toThrowErrorMatchingInlineSnapshot(`"Not authorized to edit others comments"`); - }); - - test('it throws if user tries to update existing comment author', () => { - expect(() => - transformUpdateCommentsToComments({ - comments: [{ comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }], - existingComments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'me!' }, - ], - user: 'bane', - }) - ).toThrowErrorMatchingInlineSnapshot(`"Not authorized to edit others comments"`); - }); - - test('it throws if user tries to update an existing comment that is not their own', () => { - expect(() => - transformUpdateCommentsToComments({ - comments: [ - { - comment: 'Im an old comment that is trying to be updated', - created_at: oldDate, - created_by: 'lily', - }, - ], - existingComments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }, - ], - user: 'bane', - }) - ).toThrowErrorMatchingInlineSnapshot(`"Not authorized to edit others comments"`); - }); - - test('it throws if user tries to update order of comments', () => { - expect(() => - transformUpdateCommentsToComments({ - comments: [ - { comment: 'Im a new comment' }, - { comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }, - ], - existingComments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }, - ], - user: 'lily', - }) - ).toThrowErrorMatchingInlineSnapshot( - `"When trying to update a comment, \\"created_at\\" and \\"created_by\\" must be present"` - ); - }); - - test('it throws an error if user tries to add comment formatted as existing comment when none yet exist', () => { - expect(() => - transformUpdateCommentsToComments({ - comments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }, - { comment: 'Im a new comment' }, - ], - existingComments: [], - user: 'lily', - }) - ).toThrowErrorMatchingInlineSnapshot(`"Only new comments may be added"`); - }); - - test('it throws if empty comment exists', () => { - expect(() => - transformUpdateCommentsToComments({ - comments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }, - { comment: ' ' }, - ], - existingComments: [ - { comment: 'Im an old comment', created_at: oldDate, created_by: 'lily' }, - ], - user: 'lily', - }) - ).toThrowErrorMatchingInlineSnapshot(`"Empty comments not allowed"`); - }); }); describe('#transformCreateCommentsToComments', () => { - test('it returns "undefined" if "comments" is "undefined"', () => { - const comments = transformCreateCommentsToComments({ - comments: undefined, - user: 'lily', - }); - - expect(comments).toBeUndefined(); - }); - test('it formats newly added comments', () => { const comments = transformCreateCommentsToComments({ - comments: [{ comment: 'Im a new comment' }, { comment: 'Im another new comment' }], + incomingComments: [{ comment: 'Im a new comment' }, { comment: 'Im another new comment' }], user: 'lily', }); @@ -283,178 +132,15 @@ describe('utils', () => { comment: 'Im a new comment', created_at: dateNow, created_by: 'lily', + id: '123', }, { comment: 'Im another new comment', created_at: dateNow, created_by: 'lily', + id: '456', }, ]); }); - - test('it throws an error if user tries to add an empty comment', () => { - expect(() => - transformCreateCommentsToComments({ - comments: [{ comment: ' ' }], - user: 'lily', - }) - ).toThrowErrorMatchingInlineSnapshot(`"Empty comments not allowed"`); - }); - }); - - describe('#transformUpdateComments', () => { - test('it updates comment and adds "updated_at" and "updated_by" if content differs', () => { - const comments = transformUpdateComments({ - comment: { - comment: 'Im an old comment that is trying to be updated', - created_at: oldDate, - created_by: 'lily', - }, - existingComment: { - comment: 'Im an old comment', - created_at: oldDate, - created_by: 'lily', - }, - user: 'lily', - }); - - expect(comments).toEqual({ - comment: 'Im an old comment that is trying to be updated', - created_at: oldDate, - created_by: 'lily', - updated_at: dateNow, - updated_by: 'lily', - }); - }); - - test('it does not update comment and add "updated_at" and "updated_by" if content is the same', () => { - const comments = transformUpdateComments({ - comment: { - comment: 'Im an old comment ', - created_at: oldDate, - created_by: 'lily', - }, - existingComment: { - comment: 'Im an old comment', - created_at: oldDate, - created_by: 'lily', - }, - user: 'lily', - }); - - expect(comments).toEqual({ - comment: 'Im an old comment', - created_at: oldDate, - created_by: 'lily', - }); - }); - - test('it throws if user tries to update an existing comment that is not their own', () => { - expect(() => - transformUpdateComments({ - comment: { - comment: 'Im an old comment that is trying to be updated', - created_at: oldDate, - created_by: 'lily', - }, - existingComment: { - comment: 'Im an old comment', - created_at: oldDate, - created_by: 'lily', - }, - user: 'bane', - }) - ).toThrowErrorMatchingInlineSnapshot(`"Not authorized to edit others comments"`); - }); - - test('it throws if user tries to update an existing comments timestamp', () => { - expect(() => - transformUpdateComments({ - comment: { - comment: 'Im an old comment', - created_at: dateNow, - created_by: 'lily', - }, - existingComment: { - comment: 'Im an old comment', - created_at: oldDate, - created_by: 'lily', - }, - user: 'lily', - }) - ).toThrowErrorMatchingInlineSnapshot(`"Unable to update comment"`); - }); - }); - - describe('#isCommentEqual', () => { - test('it returns false if "comment" values differ', () => { - const result = isCommentEqual( - { - comment: 'some old comment', - created_at: oldDate, - created_by: USER, - }, - { - comment: 'some older comment', - created_at: oldDate, - created_by: USER, - } - ); - - expect(result).toBeFalsy(); - }); - - test('it returns false if "created_at" values differ', () => { - const result = isCommentEqual( - { - comment: 'some old comment', - created_at: oldDate, - created_by: USER, - }, - { - comment: 'some old comment', - created_at: dateNow, - created_by: USER, - } - ); - - expect(result).toBeFalsy(); - }); - - test('it returns false if "created_by" values differ', () => { - const result = isCommentEqual( - { - comment: 'some old comment', - created_at: oldDate, - created_by: USER, - }, - { - comment: 'some old comment', - created_at: oldDate, - created_by: 'lily', - } - ); - - expect(result).toBeFalsy(); - }); - - test('it returns true if comment values are equivalent', () => { - const result = isCommentEqual( - { - comment: 'some old comment', - created_at: oldDate, - created_by: USER, - }, - { - created_at: oldDate, - created_by: USER, - // Disabling to assure that order doesn't matter - // eslint-disable-next-line sort-keys - comment: 'some old comment', - } - ); - - expect(result).toBeTruthy(); - }); }); }); diff --git a/x-pack/plugins/lists/server/services/exception_lists/utils.ts b/x-pack/plugins/lists/server/services/exception_lists/utils.ts index b168fae741822..836f642899086 100644 --- a/x-pack/plugins/lists/server/services/exception_lists/utils.ts +++ b/x-pack/plugins/lists/server/services/exception_lists/utils.ts @@ -3,17 +3,14 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - +import uuid from 'uuid'; import { SavedObject, SavedObjectsFindResponse, SavedObjectsUpdateResponse } from 'kibana/server'; import { NamespaceTypeArray } from '../../../common/schemas/types/default_namespace_array'; -import { ErrorWithStatusCode } from '../../error_with_status_code'; import { - Comments, CommentsArray, - CommentsArrayOrUndefined, - CreateComments, - CreateCommentsArrayOrUndefined, + CreateComment, + CreateCommentsArray, ExceptionListItemSchema, ExceptionListSchema, ExceptionListSoSchema, @@ -21,7 +18,6 @@ import { FoundExceptionListSchema, NamespaceType, UpdateCommentsArrayOrUndefined, - comments as commentsSchema, exceptionListItemType, exceptionListType, } from '../../../common/schemas'; @@ -296,17 +292,6 @@ export const transformSavedObjectsToFoundExceptionList = ({ }; }; -/* - * Determines whether two comments are equal, this is a very - * naive implementation, not meant to be used for deep equality of complex objects - */ -export const isCommentEqual = (commentA: Comments, commentB: Comments): boolean => { - const a = Object.values(commentA).sort().join(); - const b = Object.values(commentB).sort().join(); - - return a === b; -}; - export const transformUpdateCommentsToComments = ({ comments, existingComments, @@ -316,90 +301,28 @@ export const transformUpdateCommentsToComments = ({ existingComments: CommentsArray; user: string; }): CommentsArray => { - const newComments = comments ?? []; + const incomingComments = comments ?? []; + const newComments = incomingComments.filter((comment) => comment.id == null); + const newCommentsFormatted = transformCreateCommentsToComments({ + incomingComments: newComments, + user, + }); - if (newComments.length < existingComments.length) { - throw new ErrorWithStatusCode( - 'Comments cannot be deleted, only new comments may be added', - 403 - ); - } else { - return newComments.flatMap((c, index) => { - const existingComment = existingComments[index]; - - if (commentsSchema.is(existingComment) && !commentsSchema.is(c)) { - throw new ErrorWithStatusCode( - 'When trying to update a comment, "created_at" and "created_by" must be present', - 403 - ); - } else if (existingComment == null && commentsSchema.is(c)) { - throw new ErrorWithStatusCode('Only new comments may be added', 403); - } else if ( - commentsSchema.is(c) && - existingComment != null && - isCommentEqual(c, existingComment) - ) { - return existingComment; - } else if (commentsSchema.is(c) && existingComment != null) { - return transformUpdateComments({ comment: c, existingComment, user }); - } else { - return transformCreateCommentsToComments({ comments: [c], user }) ?? []; - } - }); - } -}; - -export const transformUpdateComments = ({ - comment, - existingComment, - user, -}: { - comment: Comments; - existingComment: Comments; - user: string; -}): Comments => { - if (comment.created_by !== user) { - // existing comment is being edited, can only be edited by author - throw new ErrorWithStatusCode('Not authorized to edit others comments', 401); - } else if (existingComment.created_at !== comment.created_at) { - throw new ErrorWithStatusCode('Unable to update comment', 403); - } else if (comment.comment.trim().length === 0) { - throw new ErrorWithStatusCode('Empty comments not allowed', 403); - } else if (comment.comment.trim() !== existingComment.comment) { - const dateNow = new Date().toISOString(); - - return { - ...existingComment, - comment: comment.comment, - updated_at: dateNow, - updated_by: user, - }; - } else { - return existingComment; - } + return [...existingComments, ...newCommentsFormatted]; }; export const transformCreateCommentsToComments = ({ - comments, + incomingComments, user, }: { - comments: CreateCommentsArrayOrUndefined; + incomingComments: CreateCommentsArray; user: string; -}): CommentsArrayOrUndefined => { +}): CommentsArray => { const dateNow = new Date().toISOString(); - if (comments != null) { - return comments.map((c: CreateComments) => { - if (c.comment.trim().length === 0) { - throw new ErrorWithStatusCode('Empty comments not allowed', 403); - } else { - return { - comment: c.comment, - created_at: dateNow, - created_by: user, - }; - } - }); - } else { - return comments; - } + return incomingComments.map((comment: CreateComment) => ({ + comment: comment.comment, + created_at: dateNow, + created_by: user, + id: uuid.v4(), + })); }; diff --git a/x-pack/plugins/security_solution/common/shared_imports.ts b/x-pack/plugins/security_solution/common/shared_imports.ts index 7fb94cea7b612..e28d1969b3976 100644 --- a/x-pack/plugins/security_solution/common/shared_imports.ts +++ b/x-pack/plugins/security_solution/common/shared_imports.ts @@ -8,8 +8,8 @@ export { ListSchema, CommentsArray, CreateCommentsArray, - Comments, - CreateComments, + Comment, + CreateComment, ExceptionListSchema, ExceptionListItemSchema, CreateExceptionListSchema, @@ -30,6 +30,7 @@ export { ExceptionListTypeEnum, exceptionListItemSchema, exceptionListType, + comment, createExceptionListItemSchema, listSchema, entry, diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_comments.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_comments.tsx index db2d0540971de..22d14ec6bedb1 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_comments.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_comments.tsx @@ -16,13 +16,13 @@ import { EuiCommentProps, EuiText, } from '@elastic/eui'; -import { Comments } from '../../../lists_plugin_deps'; +import { Comment } from '../../../shared_imports'; import * as i18n from './translations'; import { useCurrentUser } from '../../lib/kibana'; import { getFormattedComments } from './helpers'; interface AddExceptionCommentsProps { - exceptionItemComments?: Comments[]; + exceptionItemComments?: Comment[]; newCommentValue: string; newCommentOnChange: (value: string) => void; } diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.tsx index a4fe52eaacf4e..0f7e5b24ed8f9 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.tsx @@ -38,7 +38,7 @@ import { useSignalIndex } from '../../../../detections/containers/detection_engi import { useFetchOrCreateRuleExceptionList } from '../use_fetch_or_create_rule_exception_list'; import { AddExceptionComments } from '../add_exception_comments'; import { - enrichExceptionItemsWithComments, + enrichNewExceptionItemsWithComments, enrichExceptionItemsWithOS, defaultEndpointExceptionItems, entryHasListType, @@ -251,7 +251,7 @@ export const AddExceptionModal = memo(function AddExceptionModal({ let enriched: Array = []; enriched = comment !== '' - ? enrichExceptionItemsWithComments(exceptionItemsToAdd, [{ comment }]) + ? enrichNewExceptionItemsWithComments(exceptionItemsToAdd, [{ comment }]) : exceptionItemsToAdd; if (exceptionListType === 'endpoint') { const osTypes = retrieveAlertOsTypes(); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/index.tsx index 1ec49425ce8fd..734434484fb4c 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/index.tsx @@ -392,7 +392,7 @@ export const ExceptionBuilder = ({ )} { - addError(error, { title: i18n.EDIT_EXCEPTION_ERROR }); - onCancel(); + if (error.message.includes('Conflict')) { + setHasVersionConflict(true); + } else { + addError(error, { title: i18n.EDIT_EXCEPTION_ERROR }); + onCancel(); + } }, [addError, onCancel] ); @@ -147,8 +153,8 @@ export const EditExceptionModal = memo(function EditExceptionModal({ }, [shouldDisableBulkClose]); const isSubmitButtonDisabled = useMemo( - () => exceptionItemsToAdd.every((item) => item.entries.length === 0), - [exceptionItemsToAdd] + () => exceptionItemsToAdd.every((item) => item.entries.length === 0) || hasVersionConflict, + [exceptionItemsToAdd, hasVersionConflict] ); const handleBuilderOnChange = useCallback( @@ -177,11 +183,15 @@ export const EditExceptionModal = memo(function EditExceptionModal({ ); const enrichExceptionItems = useCallback(() => { - let enriched: Array = []; - enriched = enrichExceptionItemsWithComments(exceptionItemsToAdd, [ - ...(exceptionItem.comments ? exceptionItem.comments : []), - ...(comment !== '' ? [{ comment }] : []), - ]); + const [exceptionItemToEdit] = exceptionItemsToAdd; + let enriched: Array = [ + { + ...enrichExistingExceptionItemWithComments(exceptionItemToEdit, [ + ...exceptionItem.comments, + ...(comment.trim() !== '' ? [{ comment }] : []), + ]), + }, + ]; if (exceptionListType === 'endpoint') { const osTypes = exceptionItem._tags ? getOperatingSystems(exceptionItem._tags) : []; enriched = enrichExceptionItemsWithOS(enriched, osTypes); @@ -222,7 +232,7 @@ export const EditExceptionModal = memo(function EditExceptionModal({ listId={exceptionItem.list_id} listNamespaceType={exceptionItem.namespace_type} ruleName={ruleName} - isOrDisabled={false} + isOrDisabled isAndDisabled={false} isNestedDisabled={false} data-test-subj="edit-exception-modal-builder" @@ -263,6 +273,14 @@ export const EditExceptionModal = memo(function EditExceptionModal({ )} + {hasVersionConflict && ( + + +

      {i18n.VERSION_CONFLICT_ERROR_DESCRIPTION}

      +
      +
      + )} + {i18n.CANCEL} diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/translations.ts b/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/translations.ts index 6c5cb733b7a73..d09f0158b2e1d 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/translations.ts @@ -67,3 +67,18 @@ export const EXCEPTION_BUILDER_INFO = i18n.translate( defaultMessage: "Alerts are generated when the rule's conditions are met, except when:", } ); + +export const VERSION_CONFLICT_ERROR_TITLE = i18n.translate( + 'xpack.securitySolution.exceptions.editException.versionConflictTitle', + { + defaultMessage: 'Sorry, there was an error', + } +); + +export const VERSION_CONFLICT_ERROR_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.exceptions.editException.versionConflictDescription', + { + defaultMessage: + "It appears this exception was updated since you first selected to edit it. Try clicking 'Cancel' and editing the exception again.", + } +); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx index 78936d5d0da6f..5cb65ee6db8ff 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx @@ -18,7 +18,8 @@ import { formatOperatingSystems, getEntryValue, formatExceptionItemForUpdate, - enrichExceptionItemsWithComments, + enrichNewExceptionItemsWithComments, + enrichExistingExceptionItemWithComments, enrichExceptionItemsWithOS, entryHasListType, entryHasNonEcsType, @@ -35,14 +36,14 @@ import { existsOperator, doesNotExistOperator, } from '../autocomplete/operators'; -import { OperatorTypeEnum, OperatorEnum, EntryNested } from '../../../lists_plugin_deps'; +import { OperatorTypeEnum, OperatorEnum, EntryNested } from '../../../shared_imports'; import { getExceptionListItemSchemaMock } from '../../../../../lists/common/schemas/response/exception_list_item_schema.mock'; import { getEntryMatchMock } from '../../../../../lists/common/schemas/types/entry_match.mock'; import { getEntryMatchAnyMock } from '../../../../../lists/common/schemas/types/entry_match_any.mock'; import { getEntryExistsMock } from '../../../../../lists/common/schemas/types/entry_exists.mock'; import { getEntryListMock } from '../../../../../lists/common/schemas/types/entry_list.mock'; -import { getCommentsArrayMock } from '../../../../../lists/common/schemas/types/comments.mock'; -import { ENTRIES } from '../../../../../lists/common/constants.mock'; +import { getCommentsArrayMock } from '../../../../../lists/common/schemas/types/comment.mock'; +import { ENTRIES, OLD_DATE_RELATIVE_TO_DATE_NOW } from '../../../../../lists/common/constants.mock'; import { CreateExceptionListItemSchema, ExceptionListItemSchema, @@ -410,12 +411,52 @@ describe('Exception helpers', () => { expect(result).toEqual(expected); }); }); + describe('#enrichExistingExceptionItemWithComments', () => { + test('it should return exception item with comments stripped of "created_by", "created_at", "updated_by", "updated_at" fields', () => { + const payload = getExceptionListItemSchemaMock(); + const comments = [ + { + comment: 'Im an existing comment', + created_at: OLD_DATE_RELATIVE_TO_DATE_NOW, + created_by: 'lily', + id: '1', + }, + { + comment: 'Im another existing comment', + created_at: OLD_DATE_RELATIVE_TO_DATE_NOW, + created_by: 'lily', + id: '2', + }, + { + comment: 'Im a new comment', + }, + ]; + const result = enrichExistingExceptionItemWithComments(payload, comments); + const expected = { + ...getExceptionListItemSchemaMock(), + comments: [ + { + comment: 'Im an existing comment', + id: '1', + }, + { + comment: 'Im another existing comment', + id: '2', + }, + { + comment: 'Im a new comment', + }, + ], + }; + expect(result).toEqual(expected); + }); + }); - describe('#enrichExceptionItemsWithComments', () => { + describe('#enrichNewExceptionItemsWithComments', () => { test('it should add comments to an exception item', () => { const payload = [getExceptionListItemSchemaMock()]; const comments = getCommentsArrayMock(); - const result = enrichExceptionItemsWithComments(payload, comments); + const result = enrichNewExceptionItemsWithComments(payload, comments); const expected = [ { ...getExceptionListItemSchemaMock(), @@ -428,7 +469,7 @@ describe('Exception helpers', () => { test('it should add comments to multiple exception items', () => { const payload = [getExceptionListItemSchemaMock(), getExceptionListItemSchemaMock()]; const comments = getCommentsArrayMock(); - const result = enrichExceptionItemsWithComments(payload, comments); + const result = enrichNewExceptionItemsWithComments(payload, comments); const expected = [ { ...getExceptionListItemSchemaMock(), diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx index a54f20f56d56f..ee45f9b5de1fa 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx @@ -20,13 +20,14 @@ import { EXCEPTION_OPERATORS, isOperator } from '../autocomplete/operators'; import { OperatorOption } from '../autocomplete/types'; import { CommentsArray, - Comments, - CreateComments, + Comment, + CreateComment, Entry, ExceptionListItemSchema, NamespaceType, OperatorTypeEnum, CreateExceptionListItemSchema, + comment, entry, entriesNested, createExceptionListItemSchema, @@ -34,7 +35,7 @@ import { UpdateExceptionListItemSchema, ExceptionListType, EntryNested, -} from '../../../lists_plugin_deps'; +} from '../../../shared_imports'; import { IIndexPattern } from '../../../../../../../src/plugins/data/common'; import { validate } from '../../../../common/validate'; import { TimelineNonEcsData } from '../../../graphql/types'; @@ -140,16 +141,16 @@ export const getTagsInclude = ({ * @param comments ExceptionItem.comments */ export const getFormattedComments = (comments: CommentsArray): EuiCommentProps[] => - comments.map((comment) => ({ - username: comment.created_by, - timestamp: moment(comment.created_at).format('on MMM Do YYYY @ HH:mm:ss'), + comments.map((commentItem) => ({ + username: commentItem.created_by, + timestamp: moment(commentItem.created_at).format('on MMM Do YYYY @ HH:mm:ss'), event: i18n.COMMENT_EVENT, - timelineIcon: , - children: {comment.comment}, + timelineIcon: , + children: {commentItem.comment}, actions: ( ), @@ -271,11 +272,11 @@ export const prepareExceptionItemsForBulkClose = ( /** * Adds new and existing comments to all new exceptionItems if not present already * @param exceptionItems new or existing ExceptionItem[] - * @param comments new Comments + * @param comments new Comment */ -export const enrichExceptionItemsWithComments = ( +export const enrichNewExceptionItemsWithComments = ( exceptionItems: Array, - comments: Array + comments: Array ): Array => { return exceptionItems.map((item: ExceptionListItemSchema | CreateExceptionListItemSchema) => { return { @@ -285,6 +286,36 @@ export const enrichExceptionItemsWithComments = ( }); }; +/** + * Adds new and existing comments to exceptionItem + * @param exceptionItem existing ExceptionItem + * @param comments array of comments that can include existing + * and new comments + */ +export const enrichExistingExceptionItemWithComments = ( + exceptionItem: ExceptionListItemSchema | CreateExceptionListItemSchema, + comments: Array +): ExceptionListItemSchema | CreateExceptionListItemSchema => { + const formattedComments = comments.map((item) => { + if (comment.is(item)) { + const { id, comment: existingComment } = item; + return { + id, + comment: existingComment, + }; + } else { + return { + comment: item.comment, + }; + } + }); + + return { + ...exceptionItem, + comments: formattedComments, + }; +}; + /** * Adds provided osTypes to all exceptionItems if not present already * @param exceptionItems new or existing ExceptionItem[] diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.test.tsx index 8df7b51bb9d31..ab6588b67d5ba 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.test.tsx @@ -12,7 +12,7 @@ import moment from 'moment-timezone'; import { ExceptionDetails } from './exception_details'; import { getExceptionListItemSchemaMock } from '../../../../../../../lists/common/schemas/response/exception_list_item_schema.mock'; -import { getCommentsArrayMock } from '../../../../../../../lists/common/schemas/types/comments.mock'; +import { getCommentsArrayMock } from '../../../../../../../lists/common/schemas/types/comment.mock'; describe('ExceptionDetails', () => { beforeEach(() => { diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.stories.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.stories.tsx index 56b029aaee81e..fec7354855935 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.stories.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.stories.tsx @@ -11,7 +11,7 @@ import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; import { ExceptionItem } from './'; import { getExceptionListItemSchemaMock } from '../../../../../../../lists/common/schemas/response/exception_list_item_schema.mock'; -import { getCommentsArrayMock } from '../../../../../../../lists/common/schemas/types/comments.mock'; +import { getCommentsArrayMock } from '../../../../../../../lists/common/schemas/types/comment.mock'; addDecorator((storyFn) => ( ({ eui: euiLightVars, darkMode: false })}>{storyFn()} diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx index 90752f9450e4c..c9def092fda47 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx @@ -11,7 +11,7 @@ import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; import { ExceptionItem } from './'; import { getExceptionListItemSchemaMock } from '../../../../../../../lists/common/schemas/response/exception_list_item_schema.mock'; -import { getCommentsArrayMock } from '../../../../../../../lists/common/schemas/types/comments.mock'; +import { getCommentsArrayMock } from '../../../../../../../lists/common/schemas/types/comment.mock'; jest.mock('../../../../lib/kibana'); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx index 34dc47b9cd411..16eaef4136983 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx @@ -190,7 +190,8 @@ const ExceptionsViewerComponent = ({ const handleOnCancelExceptionModal = useCallback((): void => { setCurrentModal(null); - }, [setCurrentModal]); + handleFetchList(); + }, [setCurrentModal, handleFetchList]); const handleOnConfirmExceptionModal = useCallback((): void => { setCurrentModal(null); From ddff1c9ab9b0a36824ac0fdac97a957827cb8496 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Mon, 27 Jul 2020 17:50:46 -0600 Subject: [PATCH 032/126] [Security solution] Threat hunting test coverage improvements (#73276) --- .../components/markdown_editor/index.test.tsx | 49 ++++++ .../components/markdown_editor/index.tsx | 1 - .../navigation/breadcrumbs/index.test.ts | 74 +++++++++ .../utils/timeline/use_show_timeline.test.tsx | 33 ++++ .../components/manage_timeline/index.test.tsx | 145 ++++++++++++++++++ .../components/manage_timeline/index.tsx | 12 +- 6 files changed, 308 insertions(+), 6 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/common/components/markdown_editor/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.test.tsx create mode 100644 x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.test.tsx diff --git a/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.test.tsx new file mode 100644 index 0000000000000..b5e5b01189418 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.test.tsx @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { mount } from 'enzyme'; +import React from 'react'; + +import { MarkdownEditor } from '.'; +import { TestProviders } from '../../mock'; + +describe('Markdown Editor', () => { + const onChange = jest.fn(); + const onCursorPositionUpdate = jest.fn(); + const defaultProps = { + content: 'hello world', + onChange, + onCursorPositionUpdate, + }; + beforeEach(() => { + jest.clearAllMocks(); + }); + test('it calls onChange with correct value', () => { + const wrapper = mount( + + + + ); + const newValue = 'a new string'; + wrapper + .find(`[data-test-subj="textAreaInput"]`) + .first() + .simulate('change', { target: { value: newValue } }); + expect(onChange).toBeCalledWith(newValue); + }); + test('it calls onCursorPositionUpdate with correct args', () => { + const wrapper = mount( + + + + ); + wrapper.find(`[data-test-subj="textAreaInput"]`).first().simulate('blur'); + expect(onCursorPositionUpdate).toBeCalledWith({ + start: 0, + end: 0, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.tsx b/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.tsx index c40b3910ec152..d4ad4a11b60a3 100644 --- a/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/markdown_editor/index.tsx @@ -103,7 +103,6 @@ export const MarkdownEditor = React.memo<{ end: e!.target!.selectionEnd ?? 0, }); } - return false; }, [onCursorPositionUpdate] ); diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.test.ts b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.test.ts index 7e508c28c62df..89aa77106933e 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.test.ts @@ -36,6 +36,13 @@ const getMockObject = ( ): RouteSpyState & TabNavigationProps => ({ detailName, navTabs: { + case: { + disabled: false, + href: '/app/security/cases', + id: 'case', + name: 'Cases', + urlKey: 'case', + }, hosts: { disabled: false, href: '/app/security/hosts', @@ -227,6 +234,73 @@ describe('Navigation Breadcrumbs', () => { { text: 'Flows', href: '' }, ]); }); + + test('should return Alerts breadcrumbs when supplied detection pathname', () => { + const breadcrumbs = getBreadcrumbsForRoute( + getMockObject('detections', '/', undefined), + getUrlForAppMock + ); + expect(breadcrumbs).toEqual([ + { text: 'Security', href: '/app/security/overview' }, + { + text: 'Detections', + href: + "securitySolution:detections?timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + }, + ]); + }); + test('should return Cases breadcrumbs when supplied case pathname', () => { + const breadcrumbs = getBreadcrumbsForRoute( + getMockObject('case', '/', undefined), + getUrlForAppMock + ); + expect(breadcrumbs).toEqual([ + { text: 'Security', href: '/app/security/overview' }, + { + text: 'Cases', + href: + "securitySolution:case?timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + }, + ]); + }); + test('should return Case details breadcrumbs when supplied case details pathname', () => { + const sampleCase = { + id: 'my-case-id', + name: 'Case name', + }; + const breadcrumbs = getBreadcrumbsForRoute( + { + ...getMockObject('case', `/${sampleCase.id}`, sampleCase.id), + state: { caseTitle: sampleCase.name }, + }, + getUrlForAppMock + ); + expect(breadcrumbs).toEqual([ + { text: 'Security', href: '/app/security/overview' }, + { + text: 'Cases', + href: + "securitySolution:case?timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + }, + { + text: sampleCase.name, + href: `securitySolution:case/${sampleCase.id}?timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))`, + }, + ]); + }); + test('should return Admin breadcrumbs when supplied admin pathname', () => { + const breadcrumbs = getBreadcrumbsForRoute( + getMockObject('administration', '/', undefined), + getUrlForAppMock + ); + expect(breadcrumbs).toEqual([ + { text: 'Security', href: '/app/security/overview' }, + { + text: 'Administration', + href: 'securitySolution:administration', + }, + ]); + }); }); describe('setBreadcrumbs()', () => { diff --git a/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.test.tsx b/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.test.tsx new file mode 100644 index 0000000000000..db6e2536ce558 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.test.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { useShowTimeline } from './use_show_timeline'; +import { globalNode } from '../../mock'; + +describe('use show timeline', () => { + it('shows timeline for routes on default', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => useShowTimeline()); + await waitForNextUpdate(); + const uninitializedTimeline = result.current; + expect(uninitializedTimeline).toEqual([true]); + }); + }); + it('hides timeline for blacklist routes', async () => { + await act(async () => { + Object.defineProperty(globalNode.window, 'location', { + value: { + pathname: `/cases/configure`, + }, + }); + const { result, waitForNextUpdate } = renderHook(() => useShowTimeline()); + await waitForNextUpdate(); + const uninitializedTimeline = result.current; + expect(uninitializedTimeline).toEqual([false]); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.test.tsx new file mode 100644 index 0000000000000..b918e5abc652b --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.test.tsx @@ -0,0 +1,145 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { getTimelineDefaults, useTimelineManager, UseTimelineManager } from './'; +import { FilterManager } from '../../../../../../../src/plugins/data/public/query/filter_manager'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; +import { TimelineRowAction } from '../timeline/body/actions'; + +const isStringifiedComparisonEqual = (a: {}, b: {}): boolean => + JSON.stringify(a) === JSON.stringify(b); + +describe('useTimelineManager', () => { + const setupMock = coreMock.createSetup(); + const testId = 'coolness'; + const timelineDefaults = getTimelineDefaults(testId); + const timelineRowActions = () => []; + const mockFilterManager = new FilterManager(setupMock.uiSettings); + beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + it('initilizes an undefined timeline', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useTimelineManager() + ); + await waitForNextUpdate(); + const uninitializedTimeline = result.current.getManageTimelineById(testId); + expect(isStringifiedComparisonEqual(uninitializedTimeline, timelineDefaults)).toBeTruthy(); + }); + }); + it('getIndexToAddById', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useTimelineManager() + ); + await waitForNextUpdate(); + const data = result.current.getIndexToAddById(testId); + expect(data).toEqual(timelineDefaults.indexToAdd); + }); + }); + it('setIndexToAdd', async () => { + await act(async () => { + const indexToAddArgs = { id: testId, indexToAdd: ['example'] }; + const { result, waitForNextUpdate } = renderHook(() => + useTimelineManager() + ); + await waitForNextUpdate(); + result.current.initializeTimeline({ + id: testId, + timelineRowActions, + }); + result.current.setIndexToAdd(indexToAddArgs); + const data = result.current.getIndexToAddById(testId); + expect(data).toEqual(indexToAddArgs.indexToAdd); + }); + }); + it('setIsTimelineLoading', async () => { + await act(async () => { + const isLoadingArgs = { id: testId, isLoading: true }; + const { result, waitForNextUpdate } = renderHook(() => + useTimelineManager() + ); + await waitForNextUpdate(); + result.current.initializeTimeline({ + id: testId, + timelineRowActions, + }); + let timeline = result.current.getManageTimelineById(testId); + expect(timeline.isLoading).toBeFalsy(); + result.current.setIsTimelineLoading(isLoadingArgs); + timeline = result.current.getManageTimelineById(testId); + expect(timeline.isLoading).toBeTruthy(); + }); + }); + it('setTimelineRowActions', async () => { + await act(async () => { + const timelineRowActionsEx = () => [ + { id: 'wow', content: 'hey', displayType: 'icon', onClick: () => {} } as TimelineRowAction, + ]; + const { result, waitForNextUpdate } = renderHook(() => + useTimelineManager() + ); + await waitForNextUpdate(); + result.current.initializeTimeline({ + id: testId, + timelineRowActions, + }); + let timeline = result.current.getManageTimelineById(testId); + expect(timeline.timelineRowActions).toEqual(timelineRowActions); + result.current.setTimelineRowActions({ + id: testId, + timelineRowActions: timelineRowActionsEx, + }); + timeline = result.current.getManageTimelineById(testId); + expect(timeline.timelineRowActions).toEqual(timelineRowActionsEx); + }); + }); + it('getTimelineFilterManager undefined on uninitialized', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useTimelineManager() + ); + await waitForNextUpdate(); + const data = result.current.getTimelineFilterManager(testId); + expect(data).toEqual(undefined); + }); + }); + it('getTimelineFilterManager defined at initialize', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useTimelineManager() + ); + await waitForNextUpdate(); + result.current.initializeTimeline({ + id: testId, + timelineRowActions, + filterManager: mockFilterManager, + }); + const data = result.current.getTimelineFilterManager(testId); + expect(data).toEqual(mockFilterManager); + }); + }); + it('isManagedTimeline returns false when unset and then true when set', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useTimelineManager() + ); + await waitForNextUpdate(); + let data = result.current.isManagedTimeline(testId); + expect(data).toBeFalsy(); + result.current.initializeTimeline({ + id: testId, + timelineRowActions, + filterManager: mockFilterManager, + }); + data = result.current.isManagedTimeline(testId); + expect(data).toBeTruthy(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx index dba8506add0ad..a425f9b49add0 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx @@ -137,7 +137,7 @@ const reducerManageTimeline = ( } }; -interface UseTimelineManager { +export interface UseTimelineManager { getIndexToAddById: (id: string) => string[] | null; getManageTimelineById: (id: string) => ManageTimeline; getTimelineFilterManager: (id: string) => FilterManager | undefined; @@ -152,7 +152,9 @@ interface UseTimelineManager { }) => void; } -const useTimelineManager = (manageTimelineForTesting?: ManageTimelineById): UseTimelineManager => { +export const useTimelineManager = ( + manageTimelineForTesting?: ManageTimelineById +): UseTimelineManager => { const [state, dispatch] = useReducer< (state: ManageTimelineById, action: ActionManageTimeline) => ManageTimelineById >(reducerManageTimeline, manageTimelineForTesting ?? initManageTimeline); @@ -241,12 +243,12 @@ const useTimelineManager = (manageTimelineForTesting?: ManageTimelineById): UseT }; const init = { - getManageTimelineById: (id: string) => getTimelineDefaults(id), getIndexToAddById: (id: string) => null, + getManageTimelineById: (id: string) => getTimelineDefaults(id), getTimelineFilterManager: () => undefined, - setIndexToAdd: () => undefined, - isManagedTimeline: () => false, initializeTimeline: () => noop, + isManagedTimeline: () => false, + setIndexToAdd: () => undefined, setIsTimelineLoading: () => noop, setTimelineRowActions: () => noop, }; From ef83e772ca0357932c53dedfbb3ce68dc2361f55 Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola Date: Mon, 27 Jul 2020 20:03:23 -0400 Subject: [PATCH 033/126] [Security Solution][Resolver] Show origin node details in panel on load (#73313) * show origin node details in panel on load * added comment Co-authored-by: Elastic Machine --- .../public/resolver/view/map.tsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/resolver/view/map.tsx b/x-pack/plugins/security_solution/public/resolver/view/map.tsx index 30aa4b63a138d..19c403f1257be 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/map.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/map.tsx @@ -8,7 +8,7 @@ /* eslint-disable react/display-name */ -import React, { useContext } from 'react'; +import React, { useContext, useEffect } from 'react'; import { useSelector } from 'react-redux'; import { useEffectOnce } from 'react-use'; import { EuiLoadingSpinner } from '@elastic/eui'; @@ -68,11 +68,25 @@ export const ResolverMap = React.memo(function ({ const hasError = useSelector(selectors.hasError); const activeDescendantId = useSelector(selectors.ariaActiveDescendant); const { colorMap } = useResolverTheme(); - const { cleanUpQueryParams } = useResolverQueryParams(); + const { + cleanUpQueryParams, + queryParams: { crumbId }, + pushToQueryParams, + } = useResolverQueryParams(); + useEffectOnce(() => { return () => cleanUpQueryParams(); }); + useEffect(() => { + // When you refresh the page after selecting a process in the table view (not the timeline view) + // The old crumbId still exists in the query string even though a resolver is no longer visible + // This just makes sure the activeDescendant and crumbId are in sync on load for that view as well as the timeline + if (activeDescendantId && crumbId !== activeDescendantId) { + pushToQueryParams({ crumbId: activeDescendantId, crumbEvent: '' }); + } + }, [crumbId, activeDescendantId, pushToQueryParams]); + return ( {isLoading ? ( From 8c52d39b9e757471f472a36eea30cdace30fd3ff Mon Sep 17 00:00:00 2001 From: Kevin Qualters <56408403+kqualters-elastic@users.noreply.github.com> Date: Mon, 27 Jul 2020 20:34:08 -0400 Subject: [PATCH 034/126] [Security Solution] Show proper icon for termination status of all processes (#73235) * Show proper icon for termination status of all processes * Add basic test for isProcessTerminated selector --- .../resolver/store/data/selectors.test.ts | 29 +++++++++ .../public/resolver/store/data/selectors.ts | 13 ++++ .../resolver/store/mocks/endpoint_event.ts | 4 +- .../resolver/store/mocks/resolver_tree.ts | 63 +++++++++++++++++++ .../public/resolver/store/selectors.ts | 8 +++ .../public/resolver/view/panel.tsx | 20 +----- .../panels/panel_content_process_detail.tsx | 17 +++-- .../panels/panel_content_process_list.tsx | 14 ++--- .../view/panels/process_cube_icon.tsx | 4 +- 9 files changed, 131 insertions(+), 41 deletions(-) diff --git a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.test.ts b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.test.ts index 9e1c396723a27..0826391a10688 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.test.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.test.ts @@ -13,6 +13,7 @@ import { mockTreeWithNoAncestorsAnd2Children, mockTreeWith2AncestorsAndNoChildren, mockTreeWith1AncestorAnd2ChildrenAndAllNodesHave2GraphableEvents, + mockTreeWithAllProcessesTerminated, } from '../mocks/resolver_tree'; import { uniquePidForProcess } from '../../models/process_event'; import { EndpointEvent } from '../../../../common/endpoint/types'; @@ -299,6 +300,34 @@ describe('data state', () => { expect(selectors.ariaFlowtoCandidate(state())(secondAncestorID)).toBe(null); }); }); + describe('with a tree with all processes terminated', () => { + const originID = 'c'; + const firstAncestorID = 'b'; + const secondAncestorID = 'a'; + beforeEach(() => { + actions.push({ + type: 'serverReturnedResolverData', + payload: { + result: mockTreeWithAllProcessesTerminated({ + originID, + firstAncestorID, + secondAncestorID, + }), + // this value doesn't matter + databaseDocumentID: '', + }, + }); + }); + it('should have origin as terminated', () => { + expect(selectors.isProcessTerminated(state())(originID)).toBe(true); + }); + it('should have first ancestor as termianted', () => { + expect(selectors.isProcessTerminated(state())(firstAncestorID)).toBe(true); + }); + it('should have second ancestor as terminated', () => { + expect(selectors.isProcessTerminated(state())(secondAncestorID)).toBe(true); + }); + }); describe('with a tree with 2 children and no ancestors', () => { const originID = 'c'; const firstChildID = 'd'; diff --git a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts index 1d65b406306a3..ea0cb8663d11d 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts @@ -105,6 +105,19 @@ export const terminatedProcesses = createSelector(resolverTreeResponse, function ); }); +/** + * A function that given an entity id returns a boolean indicating if the id is in the set of terminated processes. + */ +export const isProcessTerminated = createSelector(terminatedProcesses, function ( + /* eslint-disable no-shadow */ + terminatedProcesses + /* eslint-enable no-shadow */ +) { + return (entityId: string) => { + return terminatedProcesses.has(entityId); + }; +}); + /** * Process events that will be graphed. */ diff --git a/x-pack/plugins/security_solution/public/resolver/store/mocks/endpoint_event.ts b/x-pack/plugins/security_solution/public/resolver/store/mocks/endpoint_event.ts index b58ea73e1fdc7..8f2e0ad3a6d85 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/mocks/endpoint_event.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/mocks/endpoint_event.ts @@ -14,16 +14,18 @@ export function mockEndpointEvent({ name, parentEntityId, timestamp, + lifecycleType, }: { entityID: string; name: string; parentEntityId: string | undefined; timestamp: number; + lifecycleType?: string; }): EndpointEvent { return { '@timestamp': timestamp, event: { - type: 'start', + type: lifecycleType ? lifecycleType : 'start', category: 'process', }, process: { diff --git a/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts b/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts index 2860eec5a6ab6..ae43955f4c47c 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts @@ -46,6 +46,69 @@ export function mockTreeWith2AncestorsAndNoChildren({ } as unknown) as ResolverTree; } +export function mockTreeWithAllProcessesTerminated({ + originID, + firstAncestorID, + secondAncestorID, +}: { + secondAncestorID: string; + firstAncestorID: string; + originID: string; +}): ResolverTree { + const secondAncestor: ResolverEvent = mockEndpointEvent({ + entityID: secondAncestorID, + name: 'a', + parentEntityId: 'none', + timestamp: 0, + }); + const firstAncestor: ResolverEvent = mockEndpointEvent({ + entityID: firstAncestorID, + name: 'b', + parentEntityId: secondAncestorID, + timestamp: 1, + }); + const originEvent: ResolverEvent = mockEndpointEvent({ + entityID: originID, + name: 'c', + parentEntityId: firstAncestorID, + timestamp: 2, + }); + const secondAncestorTermination: ResolverEvent = mockEndpointEvent({ + entityID: secondAncestorID, + name: 'a', + parentEntityId: 'none', + timestamp: 0, + lifecycleType: 'end', + }); + const firstAncestorTermination: ResolverEvent = mockEndpointEvent({ + entityID: firstAncestorID, + name: 'b', + parentEntityId: secondAncestorID, + timestamp: 1, + lifecycleType: 'end', + }); + const originEventTermination: ResolverEvent = mockEndpointEvent({ + entityID: originID, + name: 'c', + parentEntityId: firstAncestorID, + timestamp: 2, + lifecycleType: 'end', + }); + return ({ + entityID: originID, + children: { + childNodes: [], + }, + ancestry: { + ancestors: [ + { lifecycle: [secondAncestor, secondAncestorTermination] }, + { lifecycle: [firstAncestor, firstAncestorTermination] }, + ], + }, + lifecycle: [originEvent, originEventTermination], + } as unknown) as ResolverTree; +} + export function mockTreeWithNoAncestorsAnd2Children({ originID, firstChildID, diff --git a/x-pack/plugins/security_solution/public/resolver/store/selectors.ts b/x-pack/plugins/security_solution/public/resolver/store/selectors.ts index 66d7e04d118ed..87ef8d5d095ef 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/selectors.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/selectors.ts @@ -53,6 +53,14 @@ export const userIsPanning = composeSelectors(cameraStateSelector, cameraSelecto */ export const isAnimating = composeSelectors(cameraStateSelector, cameraSelectors.isAnimating); +/** + * Whether or not a given entity id is in the set of termination events. + */ +export const isProcessTerminated = composeSelectors( + dataStateSelector, + dataSelectors.isProcessTerminated +); + /** * Given a nodeID (aka entity_id) get the indexed process event. * Legacy functions take process events instead of nodeID, use this to get diff --git a/x-pack/plugins/security_solution/public/resolver/view/panel.tsx b/x-pack/plugins/security_solution/public/resolver/view/panel.tsx index cb0acdc29ceb1..83d3930065da6 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panel.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panel.tsx @@ -162,19 +162,10 @@ const PanelContent = memo(function PanelContent() { return 'processListWithCounts'; }, [uiSelectedEvent, crumbEvent, crumbId, graphableProcessEntityIds]); - const terminatedProcesses = useSelector(selectors.terminatedProcesses); - const processEntityId = uiSelectedEvent ? event.entityId(uiSelectedEvent) : undefined; - const isProcessTerminated = processEntityId ? terminatedProcesses.has(processEntityId) : false; - const panelInstance = useMemo(() => { if (panelToShow === 'processDetails') { return ( - + ); } @@ -213,13 +204,7 @@ const PanelContent = memo(function PanelContent() { ); } // The default 'Event List' / 'List of all processes' view - return ( - - ); + return ; }, [ uiSelectedEvent, crumbEvent, @@ -227,7 +212,6 @@ const PanelContent = memo(function PanelContent() { pushToQueryParams, relatedStatsForIdFromParams, panelToShow, - isProcessTerminated, ]); return <>{panelInstance}; diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_detail.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_detail.tsx index 5d90cd11d31af..29c7676d2167d 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_detail.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_detail.tsx @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import React, { memo, useMemo } from 'react'; +import { useSelector } from 'react-redux'; import { i18n } from '@kbn/i18n'; import { htmlIdGenerator, @@ -15,6 +16,7 @@ import { } from '@elastic/eui'; import styled from 'styled-components'; import { FormattedMessage } from 'react-intl'; +import * as selectors from '../../store/selectors'; import * as event from '../../../../common/endpoint/models/event'; import { CrumbInfo, formatDate, StyledBreadcrumbs } from './panel_content_utilities'; import { @@ -41,16 +43,14 @@ const StyledDescriptionList = styled(EuiDescriptionList)` */ export const ProcessDetails = memo(function ProcessDetails({ processEvent, - isProcessTerminated, - isProcessOrigin, pushToQueryParams, }: { processEvent: ResolverEvent; - isProcessTerminated: boolean; - isProcessOrigin: boolean; pushToQueryParams: (queryStringKeyValuePair: CrumbInfo) => unknown; }) { const processName = event.eventName(processEvent); + const entityId = event.entityId(processEvent); + const isProcessTerminated = useSelector(selectors.isProcessTerminated)(entityId); const processInfoEntry = useMemo(() => { const eventTime = event.eventTimestamp(processEvent); const dateTime = eventTime ? formatDate(eventTime) : ''; @@ -151,8 +151,8 @@ export const ProcessDetails = memo(function ProcessDetails({ if (!processEvent) { return { descriptionText: '' }; } - return cubeAssetsForNode(isProcessTerminated, isProcessOrigin); - }, [processEvent, cubeAssetsForNode, isProcessTerminated, isProcessOrigin]); + return cubeAssetsForNode(isProcessTerminated, false); + }, [processEvent, cubeAssetsForNode, isProcessTerminated]); const titleId = useMemo(() => htmlIdGenerator('resolverTable')(), []); return ( @@ -161,10 +161,7 @@ export const ProcessDetails = memo(function ProcessDetails({

      - + {processName}

      diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_list.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_list.tsx index 6f9bfad8c08c2..efb96cde431e5 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_list.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_list.tsx @@ -50,12 +50,8 @@ const StyledLimitWarning = styled(LimitWarning)` */ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ pushToQueryParams, - isProcessTerminated, - isProcessOrigin, }: { pushToQueryParams: (queryStringKeyValuePair: CrumbInfo) => unknown; - isProcessTerminated: boolean; - isProcessOrigin: boolean; }) { interface ProcessTableView { name: string; @@ -65,6 +61,7 @@ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ const dispatch = useResolverDispatch(); const { timestamp } = useContext(SideEffectContext); + const isProcessTerminated = useSelector(selectors.isProcessTerminated); const handleBringIntoViewClick = useCallback( (processTableViewItem) => { dispatch({ @@ -92,6 +89,8 @@ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ sortable: true, truncateText: true, render(name: string, item: ProcessTableView) { + const entityId = event.entityId(item.event); + const isTerminated = isProcessTerminated(entityId); return name === '' ? ( {i18n.translate( @@ -108,10 +107,7 @@ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ pushToQueryParams({ crumbId: event.entityId(item.event), crumbEvent: '' }); }} > - + {name} ); @@ -143,7 +139,7 @@ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ }, }, ], - [pushToQueryParams, handleBringIntoViewClick, isProcessOrigin, isProcessTerminated] + [pushToQueryParams, handleBringIntoViewClick, isProcessTerminated] ); const { processNodePositions } = useSelector(selectors.layout); diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/process_cube_icon.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/process_cube_icon.tsx index 98eea51a011b6..b073324b27f9b 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/process_cube_icon.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/process_cube_icon.tsx @@ -13,13 +13,11 @@ import { useResolverTheme } from '../assets'; */ export const CubeForProcess = memo(function CubeForProcess({ isProcessTerminated, - isProcessOrigin, }: { isProcessTerminated: boolean; - isProcessOrigin: boolean; }) { const { cubeAssetsForNode } = useResolverTheme(); - const { cubeSymbol, descriptionText } = cubeAssetsForNode(isProcessTerminated, isProcessOrigin); + const { cubeSymbol, descriptionText } = cubeAssetsForNode(isProcessTerminated, false); return ( <> From 765c2d1ad3308a3c3af50f8d67b80579aeb13a9a Mon Sep 17 00:00:00 2001 From: Garrett Spong Date: Mon, 27 Jul 2020 19:52:28 -0600 Subject: [PATCH 035/126] [Security Solution][ML] Updates siem group name to security (#73218) ## Summary Resolves https://github.com/elastic/kibana/issues/69319 Updates `siem` grouping to `security`, and enables cloudtrail module, fixing mis-match between the newly updated modules (https://github.com/elastic/kibana/pull/71696).

      Also updates all module icons to be consistent: Auditbeat (Before/After):

      Packetbeat (Before/After):

      Winlogbeat (Before/After):

      - [X] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md) - [X] [Documentation](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#writing-documentation) was added for features that require explanation or tutorials - Working w/ @benskelker on updated ML Jobs & nomenclature --- .../models/data_recognizer/modules/siem_auditbeat/logo.json | 2 +- .../data_recognizer/modules/siem_auditbeat_auth/logo.json | 4 ++-- .../data_recognizer/modules/siem_packetbeat/logo.json | 4 ++-- .../data_recognizer/modules/siem_winlogbeat/logo.json | 2 +- .../data_recognizer/modules/siem_winlogbeat_auth/logo.json | 4 ++-- .../public/common/components/ml_popover/api.tsx | 2 +- .../common/components/ml_popover/hooks/translations.ts | 2 +- .../components/ml_popover/hooks/use_siem_jobs_helpers.tsx | 2 +- .../ml_popover/jobs_table/filters/groups_filter_popover.tsx | 6 +++--- .../public/common/components/ml_popover/ml_modules.tsx | 1 + .../detections/components/rules/ml_job_select/index.tsx | 2 +- .../server/usage/detections/detections_helpers.ts | 4 +++- 12 files changed, 19 insertions(+), 16 deletions(-) diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_auditbeat/logo.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_auditbeat/logo.json index 40a5c59677147..dfd22f6b1140b 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_auditbeat/logo.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_auditbeat/logo.json @@ -1,3 +1,3 @@ { - "icon": "securityAnalyticsApp" + "icon": "logoSecurity" } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_auditbeat_auth/logo.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_auditbeat_auth/logo.json index 6b02648ccf287..dfd22f6b1140b 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_auditbeat_auth/logo.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_auditbeat_auth/logo.json @@ -1,3 +1,3 @@ { - "icon": "securityAnalyticsApp" -} \ No newline at end of file + "icon": "logoSecurity" +} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_packetbeat/logo.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_packetbeat/logo.json index 6b02648ccf287..dfd22f6b1140b 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_packetbeat/logo.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_packetbeat/logo.json @@ -1,3 +1,3 @@ { - "icon": "securityAnalyticsApp" -} \ No newline at end of file + "icon": "logoSecurity" +} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_winlogbeat/logo.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_winlogbeat/logo.json index 40a5c59677147..dfd22f6b1140b 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_winlogbeat/logo.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_winlogbeat/logo.json @@ -1,3 +1,3 @@ { - "icon": "securityAnalyticsApp" + "icon": "logoSecurity" } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_winlogbeat_auth/logo.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_winlogbeat_auth/logo.json index 6b02648ccf287..dfd22f6b1140b 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_winlogbeat_auth/logo.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/siem_winlogbeat_auth/logo.json @@ -1,3 +1,3 @@ { - "icon": "securityAnalyticsApp" -} \ No newline at end of file + "icon": "logoSecurity" +} diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/api.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/api.tsx index b4da4fa79e035..7c72098209a06 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/api.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/api.tsx @@ -71,7 +71,7 @@ export const setupMlJob = async ({ configTemplate, indexPatternName = 'auditbeat-*', jobIdErrorFilter = [], - groups = ['siem'], + groups = ['security'], prefix = '', }: MlSetupArgs): Promise => { const response = await KibanaServices.get().http.fetch( diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/translations.ts b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/translations.ts index 2b37c437866e0..7b29bab2e38f3 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/translations.ts @@ -9,6 +9,6 @@ import { i18n } from '@kbn/i18n'; export const SIEM_JOB_FETCH_FAILURE = i18n.translate( 'xpack.securitySolution.components.mlPopup.hooks.errors.siemJobFetchFailureTitle', { - defaultMessage: 'SIEM job fetch failure', + defaultMessage: 'Security job fetch failure', } ); diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.tsx index 658d2659282ce..adbd712ffeb3e 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.tsx @@ -104,7 +104,7 @@ export const getInstalledJobs = ( compatibleModuleIds: string[] ): SiemJob[] => jobSummaryData - .filter(({ groups }) => groups.includes('siem')) + .filter(({ groups }) => groups.includes('siem') || groups.includes('security')) .map((jobSummary) => ({ ...jobSummary, ...getAugmentedFields(jobSummary.id, moduleJobs, compatibleModuleIds), diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx index 1aa3ad630306e..d879942b8b101 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx @@ -25,8 +25,8 @@ interface GroupsFilterPopoverProps { /** * Popover for selecting which SiemJob groups to filter on. Component extracts unique groups and - * their counts from the provided SiemJobs. The 'siem' group is filtered out as all jobs will be - * siem jobs + * their counts from the provided SiemJobs. The 'siem' & 'security' groups are filtered out as all jobs will be + * siem/security jobs * * @param siemJobs jobs to fetch groups from to display for filtering * @param onSelectedGroupsChanged change listener to be notified when group selection changes @@ -41,7 +41,7 @@ export const GroupsFilterPopoverComponent = ({ const groups = siemJobs .map((j) => j.groups) .flat() - .filter((g) => g !== 'siem'); + .filter((g) => g !== 'siem' && g !== 'security'); const uniqueGroups = Array.from(new Set(groups)); useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/common/components/ml_popover/ml_modules.tsx b/x-pack/plugins/security_solution/public/common/components/ml_popover/ml_modules.tsx index b956cf2c1494c..4dccba08590a4 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml_popover/ml_modules.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml_popover/ml_modules.tsx @@ -12,6 +12,7 @@ export const mlModules: string[] = [ 'siem_auditbeat', 'siem_auditbeat_auth', + 'siem_cloudtrail', 'siem_packetbeat', 'siem_winlogbeat', 'siem_winlogbeat_auth', diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx index cb084d4daa782..cdfdf4ca6b66b 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/ml_job_select/index.tsx @@ -41,7 +41,7 @@ const HelpText: React.FC<{ href: string; showEnableWarning: boolean }> = ({ <> diff --git a/x-pack/plugins/security_solution/server/usage/detections/detections_helpers.ts b/x-pack/plugins/security_solution/server/usage/detections/detections_helpers.ts index e9d4f3aa426f4..f9905c373291c 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/detections_helpers.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/detections_helpers.ts @@ -176,7 +176,9 @@ export const getMlJobsUsage = async (ml: MlPluginSetup | undefined): Promise module.jobs); - const jobs = await ml.jobServiceProvider(internalMlClient, fakeRequest).jobsSummary(['siem']); + const jobs = await ml + .jobServiceProvider(internalMlClient, fakeRequest) + .jobsSummary(['siem', 'security']); jobsUsage = jobs.reduce((usage, job) => { const isElastic = moduleJobs.some((moduleJob) => moduleJob.id === job.id); From 5af2c1080a85b247324d7b1fd36428c6d561ac55 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Mon, 27 Jul 2020 19:21:14 -0700 Subject: [PATCH 036/126] Exclude `version` from package config attributes that are copied, add safeguard to package config bulk create (#73128) Co-authored-by: Elastic Machine --- .../ingest_manager/server/services/agent_config.ts | 12 +++++------- .../ingest_manager/server/services/package_config.ts | 5 ++++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/ingest_manager/server/services/agent_config.ts b/x-pack/plugins/ingest_manager/server/services/agent_config.ts index 0a9adc1f1c593..3886146e28806 100644 --- a/x-pack/plugins/ingest_manager/server/services/agent_config.ts +++ b/x-pack/plugins/ingest_manager/server/services/agent_config.ts @@ -233,16 +233,14 @@ class AgentConfigService { if (baseAgentConfig.package_configs.length) { const newPackageConfigs = (baseAgentConfig.package_configs as PackageConfig[]).map( (packageConfig: PackageConfig) => { - const { id: packageConfigId, ...newPackageConfig } = packageConfig; + const { id: packageConfigId, version, ...newPackageConfig } = packageConfig; return newPackageConfig; } ); - await packageConfigService.bulkCreate( - soClient, - newPackageConfigs, - newAgentConfig.id, - options - ); + await packageConfigService.bulkCreate(soClient, newPackageConfigs, newAgentConfig.id, { + ...options, + bumpConfigRevision: false, + }); } // Get updated config diff --git a/x-pack/plugins/ingest_manager/server/services/package_config.ts b/x-pack/plugins/ingest_manager/server/services/package_config.ts index c2d465cf7c73f..5d1c5d1717714 100644 --- a/x-pack/plugins/ingest_manager/server/services/package_config.ts +++ b/x-pack/plugins/ingest_manager/server/services/package_config.ts @@ -121,7 +121,7 @@ class PackageConfigService { options?: { user?: AuthenticatedUser; bumpConfigRevision?: boolean } ): Promise { const isoDate = new Date().toISOString(); - const { saved_objects: newSos } = await soClient.bulkCreate( + const { saved_objects } = await soClient.bulkCreate( packageConfigs.map((packageConfig) => ({ type: SAVED_OBJECT_TYPE, attributes: { @@ -136,6 +136,9 @@ class PackageConfigService { })) ); + // Filter out invalid SOs + const newSos = saved_objects.filter((so) => !so.error && so.attributes); + // Assign it to the given agent config await agentConfigService.assignPackageConfigs( soClient, From 82d7e7db699bbe961da5eb8b2218de5d2c2e7e18 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Mon, 27 Jul 2020 19:21:41 -0700 Subject: [PATCH 037/126] [Ingest Manager] Convert select agent config step to use combo box (#73172) * Initial pass at using combo box instead of selectable for agent configs * Hide agent count messaging if fleet isn't set up * Fix types * Fix i18n * Fix i18n again * Add comment explaining styling Co-authored-by: Elastic Machine --- .../step_select_config.tsx | 227 +++++++++++------- .../list_page/components/create_config.tsx | 2 +- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 4 files changed, 145 insertions(+), 86 deletions(-) diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_package_config_page/step_select_config.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_package_config_page/step_select_config.tsx index 91c80b7eee4c8..6f06530100d71 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_package_config_page/step_select_config.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_package_config_page/step_select_config.tsx @@ -3,17 +3,19 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { useEffect, useState, Fragment } from 'react'; +import React, { useEffect, useState } from 'react'; +import styled from 'styled-components'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiFlexGroup, EuiFlexItem, - EuiSelectable, - EuiSpacer, + EuiComboBox, + EuiComboBoxOptionOption, EuiTextColor, EuiPortal, - EuiButtonEmpty, + EuiFormRow, + EuiLink, } from '@elastic/eui'; import { Error } from '../../../components'; import { AgentConfig, PackageInfo, GetAgentConfigsResponseItem } from '../../../types'; @@ -23,9 +25,30 @@ import { useGetAgentConfigs, sendGetOneAgentConfig, useCapabilities, + useFleetStatus, } from '../../../hooks'; import { CreateAgentConfigFlyout } from '../list_page/components'; +const AgentConfigWrapper = styled(EuiFormRow)` + .euiFormRow__label { + width: 100%; + } +`; + +// Custom styling for drop down list items due to: +// 1) the max-width and overflow properties is added to prevent long config +// names/descriptions from overflowing the flex items +// 2) max-width is built from the grow property on the flex items because the value +// changes based on if Fleet is enabled/setup or not +const AgentConfigNameColumn = styled(EuiFlexItem)` + max-width: ${(props) => `${((props.grow as number) / 9) * 100}%`}; + overflow: hidden; +`; +const AgentConfigDescriptionColumn = styled(EuiFlexItem)` + max-width: ${(props) => `${((props.grow as number) / 9) * 100}%`}; + overflow: hidden; +`; + export const StepSelectConfig: React.FunctionComponent<{ pkgkey: string; updatePackageInfo: (packageInfo: PackageInfo | undefined) => void; @@ -33,6 +56,8 @@ export const StepSelectConfig: React.FunctionComponent<{ updateAgentConfig: (config: AgentConfig | undefined) => void; setIsLoadingSecondStep: (isLoading: boolean) => void; }> = ({ pkgkey, updatePackageInfo, agentConfig, updateAgentConfig, setIsLoadingSecondStep }) => { + const { isReady: isFleetReady } = useFleetStatus(); + // Selected config state const [selectedConfigId, setSelectedConfigId] = useState( agentConfig ? agentConfig.id : undefined @@ -106,6 +131,40 @@ export const StepSelectConfig: React.FunctionComponent<{ } }, [selectedConfigId, agentConfig, updateAgentConfig, setIsLoadingSecondStep]); + const agentConfigOptions: Array> = packageInfoData + ? agentConfigs.map((agentConf) => { + const alreadyHasLimitedPackage = + (isLimitedPackage && + doesAgentConfigAlreadyIncludePackage(agentConf, packageInfoData.response.name)) || + false; + return { + label: agentConf.name, + value: agentConf.id, + disabled: alreadyHasLimitedPackage, + 'data-test-subj': 'agentConfigItem', + }; + }) + : []; + + const selectedConfigOption = agentConfigOptions.find( + (option) => option.value === selectedConfigId + ); + + // Try to select default agent config + useEffect(() => { + if (!selectedConfigId && agentConfigs.length && agentConfigOptions.length) { + const defaultAgentConfig = agentConfigs.find((config) => config.is_default); + if (defaultAgentConfig) { + const defaultAgentConfigOption = agentConfigOptions.find( + (option) => option.value === defaultAgentConfig.id + ); + if (defaultAgentConfigOption && !defaultAgentConfigOption.disabled) { + setSelectedConfigId(defaultAgentConfig.id); + } + } + } + }, [agentConfigs, agentConfigOptions, selectedConfigId]); + // Display package error if there is one if (packageInfoError) { return ( @@ -154,77 +213,95 @@ export const StepSelectConfig: React.FunctionComponent<{ ) : null} - { - const alreadyHasLimitedPackage = - (isLimitedPackage && - packageInfoData && - doesAgentConfigAlreadyIncludePackage(agentConf, packageInfoData.response.name)) || - false; - return { - label: agentConf.name, - key: agentConf.id, - checked: selectedConfigId === agentConf.id ? 'on' : undefined, - disabled: alreadyHasLimitedPackage, - 'data-test-subj': 'agentConfigItem', - }; - })} - renderOption={(option) => ( - - {option.label} + - - {agentConfigsById[option.key!].description} - + - - - +
      + setIsCreateAgentConfigFlyoutOpen(true)} + > + + +
      - )} - listProps={{ - bordered: true, - }} - searchProps={{ - placeholder: i18n.translate( - 'xpack.ingestManager.createPackageConfig.StepSelectConfig.filterAgentConfigsInputPlaceholder', + } + helpText={ + isFleetReady && selectedConfigId ? ( + + ) : null + } + > + { - const selectedOption = options.find((option) => option.checked === 'on'); - if (selectedOption) { - if (selectedOption.key !== selectedConfigId) { - setSelectedConfigId(selectedOption.key); + )} + singleSelection={{ asPlainText: true }} + isClearable={false} + fullWidth={true} + isLoading={isAgentConfigsLoading || isPackageInfoLoading} + options={agentConfigOptions} + renderOption={(option: EuiComboBoxOptionOption) => { + return ( + + + {option.label} + + + + {agentConfigsById[option.value!].description} + + + {isFleetReady ? ( + + + + + + ) : null} + + ); + }} + selectedOptions={selectedConfigOption ? [selectedConfigOption] : []} + onChange={(options) => { + const selectedOption = options[0] || undefined; + if (selectedOption) { + if (selectedOption.value !== selectedConfigId) { + setSelectedConfigId(selectedOption.value); + } + } else { + setSelectedConfigId(undefined); } - } else { - setSelectedConfigId(undefined); - } - }} - > - {(list, search) => ( - - {search} - - {list} - - )} -
      + }} + /> +
      {/* Display selected agent config error if there is one */} {selectedConfigError ? ( @@ -240,22 +317,6 @@ export const StepSelectConfig: React.FunctionComponent<{ />
      ) : null} - -
      - setIsCreateAgentConfigFlyoutOpen(true)} - flush="left" - size="s" - > - - -
      -
      ); diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/list_page/components/create_config.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/list_page/components/create_config.tsx index fc593705a4e1b..749716b473c85 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/list_page/components/create_config.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/list_page/components/create_config.tsx @@ -160,7 +160,7 @@ export const CreateAgentConfigFlyout: React.FunctionComponent = ({ ); return ( - + onClose()} size="l" maxWidth={400} {...restOfProps}> {header} {body} {footer} diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index cf79f463b35cb..ee7d1e0298d00 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -8108,7 +8108,6 @@ "xpack.ingestManager.createPackageConfig.StepSelectConfig.errorLoadingAgentConfigsTitle": "エージェント構成の読み込みエラー", "xpack.ingestManager.createPackageConfig.StepSelectConfig.errorLoadingPackageTitle": "パッケージ情報の読み込みエラー", "xpack.ingestManager.createPackageConfig.StepSelectConfig.errorLoadingSelectedAgentConfigTitle": "選択したエージェント構成の読み込みエラー", - "xpack.ingestManager.createPackageConfig.StepSelectConfig.filterAgentConfigsInputPlaceholder": "エージェント構成の検索", "xpack.ingestManager.createPackageConfig.stepSelectPackage.errorLoadingConfigTitle": "エージェント構成情報の読み込みエラー", "xpack.ingestManager.createPackageConfig.stepSelectPackage.errorLoadingPackagesTitle": "統合の読み込みエラー", "xpack.ingestManager.createPackageConfig.stepSelectPackage.errorLoadingSelectedPackageTitle": "選択した統合の読み込みエラー", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index b45fe1baa9e9a..30c932c362a4f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -8113,7 +8113,6 @@ "xpack.ingestManager.createPackageConfig.StepSelectConfig.errorLoadingAgentConfigsTitle": "加载代理配置时出错", "xpack.ingestManager.createPackageConfig.StepSelectConfig.errorLoadingPackageTitle": "加载软件包信息时出错", "xpack.ingestManager.createPackageConfig.StepSelectConfig.errorLoadingSelectedAgentConfigTitle": "加载选定代理配置时出错", - "xpack.ingestManager.createPackageConfig.StepSelectConfig.filterAgentConfigsInputPlaceholder": "搜索代理配置", "xpack.ingestManager.createPackageConfig.stepSelectPackage.errorLoadingConfigTitle": "加载代理配置信息时出错", "xpack.ingestManager.createPackageConfig.stepSelectPackage.errorLoadingPackagesTitle": "加载集成时出错", "xpack.ingestManager.createPackageConfig.stepSelectPackage.errorLoadingSelectedPackageTitle": "加载选定集成时出错", From cc84ee31856c8eb70d5a2d1093b21678d5842f88 Mon Sep 17 00:00:00 2001 From: Phillip Burch Date: Mon, 27 Jul 2020 21:28:39 -0500 Subject: [PATCH 038/126] [Metrics UI] Saved views bugs (#72518) * Add test for logs and metrics telemetry * wait before you go * Remove kubenetes * Fix type check * Add back kubernetes test * Remove kubernetes * Don't allow deleting default default view. * Fix bug with duplicate loads of data. Because the load data function takes options.source and the source of options can change, we need to remove it from deps * Remove unused variable * Reload when loadData function is changed * Don't send the request immediately Co-authored-by: Elastic Machine --- .../public/components/saved_views/manage_views_flyout.tsx | 4 ++++ .../public/components/saved_views/toolbar_control.tsx | 2 +- .../infra/public/containers/saved_view/saved_view.tsx | 8 +++----- .../pages/metrics/inventory_view/components/layout.tsx | 3 ++- .../infra/public/pages/metrics/metrics_explorer/index.tsx | 3 ++- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/infra/public/components/saved_views/manage_views_flyout.tsx b/x-pack/plugins/infra/public/components/saved_views/manage_views_flyout.tsx index fa9b45558e491..698034f8154d1 100644 --- a/x-pack/plugins/infra/public/components/saved_views/manage_views_flyout.tsx +++ b/x-pack/plugins/infra/public/components/saved_views/manage_views_flyout.tsx @@ -96,6 +96,10 @@ export function SavedViewManageViewsFlyout({ const renderDeleteAction = useCallback( (item: SavedView) => { + if (item.id === '0') { + return <>; + } + return ( (props: Props) { /> - + { const { data, loading, find, error: errorOnFind, hasView } = useFindSavedObject< SavedViewSavedObject >(viewType); - + const [shouldLoadDefault] = useState(props.shouldLoadDefault); const [currentView, setCurrentView] = useState | null>(null); const [loadingDefaultView, setLoadingDefaultView] = useState(null); const { create, error: errorOnCreate, data: createdViewData, createdId } = useCreateSavedObject( @@ -211,8 +211,6 @@ export const useSavedView = (props: Props) => { }, [setCurrentView, defaultViewId, defaultViewState]); useEffect(() => { - const shouldLoadDefault = props.shouldLoadDefault; - if (loadingDefaultView || currentView || !shouldLoadDefault) { return; } @@ -225,7 +223,7 @@ export const useSavedView = (props: Props) => { } }, [ loadDefaultView, - props.shouldLoadDefault, + shouldLoadDefault, setDefault, loadingDefaultView, currentView, @@ -246,7 +244,7 @@ export const useSavedView = (props: Props) => { errorOnUpdate, errorOnFind, errorOnCreate: createError, - shouldLoadDefault: props.shouldLoadDefault, + shouldLoadDefault, makeDefault, sourceIsLoading, deleteView, diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/layout.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/layout.tsx index fddd92128708a..ad92c054ee459 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/layout.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/layout.tsx @@ -55,7 +55,8 @@ export const Layout = () => { sourceId, currentTime, accountId, - region + region, + false ); const options = { diff --git a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/index.tsx b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/index.tsx index cd875ae54071c..20efca79650a1 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/index.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/index.tsx @@ -57,7 +57,8 @@ export const MetricsExplorerPage = ({ source, derivedIndexPattern }: MetricsExpl // load metrics explorer data after default view loaded, unless we're not loading a view loadData(); } - }, [loadData, currentView, shouldLoadDefault]); + /* eslint-disable-next-line react-hooks/exhaustive-deps */ + }, [loadData, shouldLoadDefault]); return ( From 281c76767b21c458a237474d77211f18883d8d68 Mon Sep 17 00:00:00 2001 From: MadameSheema Date: Tue, 28 Jul 2020 09:23:28 +0200 Subject: [PATCH 039/126] updates cypress to v4.11.0 (#73327) Co-authored-by: Elastic Machine --- x-pack/package.json | 2 +- yarn.lock | 170 +++++++++++++++----------------------------- 2 files changed, 60 insertions(+), 112 deletions(-) diff --git a/x-pack/package.json b/x-pack/package.json index dee99d6f0ddac..76655f75cadcc 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -131,7 +131,7 @@ "cheerio": "0.22.0", "commander": "3.0.2", "copy-webpack-plugin": "^6.0.2", - "cypress": "4.5.0", + "cypress": "4.11.0", "cypress-multi-reporters": "^1.2.3", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.2", diff --git a/yarn.lock b/yarn.lock index 899bc45fbe3fb..c1328731db150 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4717,21 +4717,11 @@ resolved "https://registry.yarnpkg.com/@types/base64-js/-/base64-js-1.2.5.tgz#582b2476169a6cba460a214d476c744441d873d5" integrity sha1-WCskdhaabLpGCiFNR2x0REHYc9U= -"@types/blob-util@1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@types/blob-util/-/blob-util-1.3.3.tgz#adba644ae34f88e1dd9a5864c66ad651caaf628a" - integrity sha512-4ahcL/QDnpjWA2Qs16ZMQif7HjGP2cw3AGjHabybjw7Vm1EKu+cfQN1D78BaZbS1WJNa1opSMF5HNMztx7lR0w== - "@types/bluebird@*", "@types/bluebird@^3.1.1": version "3.5.30" resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.30.tgz#ee034a0eeea8b84ed868b1aa60d690b08a6cfbc5" integrity sha512-8LhzvcjIoqoi1TghEkRMkbbmM+jhHnBokPGkJWjclMK+Ks0MxEBow3/p2/iFTZ+OIbJHQDSfpgdZEb+af3gfVw== -"@types/bluebird@3.5.29": - version "3.5.29" - resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.29.tgz#7cd933c902c4fc83046517a1bef973886d00bdb6" - integrity sha512-kmVtnxTuUuhCET669irqQmPAez4KFnFVKvpleVRyfC3g+SHD1hIkFZcWLim9BVcwUBLO59o8VZE4yGCmTif8Yw== - "@types/boom@*", "@types/boom@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/boom/-/boom-7.2.0.tgz#19c36cbb5811a7493f0f2e37f31d42b28df1abc1" @@ -4762,15 +4752,7 @@ resolved "https://registry.yarnpkg.com/@types/catbox/-/catbox-10.0.1.tgz#266679017749041fe9873fee1131dd2aaa04a07e" integrity sha512-ECuJ+f5gGHiLeiE4RlE/xdqv/0JVDToegPV1aTb10tQStYa0Ycq2OJfQukDv3IFaw3B+CMV46jHc5bXe6QXEQg== -"@types/chai-jquery@1.1.40": - version "1.1.40" - resolved "https://registry.yarnpkg.com/@types/chai-jquery/-/chai-jquery-1.1.40.tgz#445bedcbbb2ae4e3027f46fa2c1733c43481ffa1" - integrity sha512-mCNEZ3GKP7T7kftKeIs7QmfZZQM7hslGSpYzKbOlR2a2HCFf9ph4nlMRA9UnuOETeOQYJVhJQK7MwGqNZVyUtQ== - dependencies: - "@types/chai" "*" - "@types/jquery" "*" - -"@types/chai@*", "@types/chai@4.2.7", "@types/chai@^4.2.11": +"@types/chai@^4.2.11": version "4.2.11" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.11.tgz#d3614d6c5f500142358e6ed24e1bf16657536c50" integrity sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw== @@ -5260,7 +5242,7 @@ resolved "https://registry.yarnpkg.com/@types/joi/-/joi-13.6.1.tgz#325486a397504f8e22c8c551dc8b0e1d41d5d5ae" integrity sha512-JxZ0NP8NuB0BJOXi1KvAA6rySLTPmhOy4n2gzSFq/IFM3LNFm0h+2Vn/bPPgEYlWqzS2NPeLgKqfm75baX+Hog== -"@types/jquery@*", "@types/jquery@3.3.31", "@types/jquery@^3.3.31": +"@types/jquery@*", "@types/jquery@^3.3.31": version "3.3.31" resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.31.tgz#27c706e4bf488474e1cb54a71d8303f37c93451b" integrity sha512-Lz4BAJihoFw5nRzKvg4nawXPzutkv7wmfQ5121avptaSIXlDNJCUuxZxX/G+9EVidZGuO0UBlk+YjKbwRKJigg== @@ -5346,11 +5328,6 @@ "@types/node" "*" "@types/webpack" "*" -"@types/lodash@4.14.149", "@types/lodash@^4.14.155": - version "4.14.156" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.156.tgz#cbe30909c89a1feeb7c60803e785344ea0ec82d1" - integrity sha512-l2AgHXcKUwx2DsvP19wtRPqZ4NkONjmorOdq4sMcxIjqdIuuV/ULo2ftuv4NUpevwfW7Ju/UKLqo0ZXuEt/8lQ== - "@types/lodash@^3.10.1": version "3.10.3" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-3.10.3.tgz#aaddec6a3c93bf03b402db3acf5d4c77bce8bdff" @@ -5361,6 +5338,11 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.150.tgz#649fe44684c3f1fcb6164d943c5a61977e8cf0bd" integrity sha512-kMNLM5JBcasgYscD9x/Gvr6lTAv2NVgsKtet/hm93qMyf/D1pt+7jeEZklKJKxMVmXjxbRVQQGfqDSfipYCO6w== +"@types/lodash@^4.14.155": + version "4.14.156" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.156.tgz#cbe30909c89a1feeb7c60803e785344ea0ec82d1" + integrity sha512-l2AgHXcKUwx2DsvP19wtRPqZ4NkONjmorOdq4sMcxIjqdIuuV/ULo2ftuv4NUpevwfW7Ju/UKLqo0ZXuEt/8lQ== + "@types/log-symbols@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/log-symbols/-/log-symbols-2.0.0.tgz#7919e2ec3c8d13879bfdcab310dd7a3f7fc9466d" @@ -5419,7 +5401,7 @@ dependencies: "@types/mime-db" "*" -"@types/minimatch@*", "@types/minimatch@3.0.3", "@types/minimatch@^3.0.3": +"@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== @@ -5441,11 +5423,6 @@ dependencies: "@types/node" "*" -"@types/mocha@5.2.7": - version "5.2.7" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" - integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== - "@types/mocha@^7.0.2": version "7.0.2" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz#b17f16cf933597e10d6d78eae3251e692ce8b0ce" @@ -5859,32 +5836,12 @@ dependencies: "@types/node" "*" -"@types/sinon-chai@3.2.3": - version "3.2.3" - resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.3.tgz#afe392303dda95cc8069685d1e537ff434fa506e" - integrity sha512-TOUFS6vqS0PVL1I8NGVSNcFaNJtFoyZPXZ5zur+qlhDfOmQECZZM4H4kKgca6O8L+QceX/ymODZASfUfn+y4yQ== - dependencies: - "@types/chai" "*" - "@types/sinon" "*" - -"@types/sinon@*": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-9.0.4.tgz#e934f904606632287a6e7f7ab0ce3f08a0dad4b1" - integrity sha512-sJmb32asJZY6Z2u09bl0G2wglSxDlROlAejCjsnor+LzBMz17gu8IU7vKC/vWDnv9zEq2wqADHVXFjf4eE8Gdw== - dependencies: - "@types/sinonjs__fake-timers" "*" - -"@types/sinon@7.5.1": - version "7.5.1" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.5.1.tgz#d27b81af0d1cfe1f9b24eebe7a24f74ae40f5b7c" - integrity sha512-EZQUP3hSZQyTQRfiLqelC9NMWd1kqLcmQE0dMiklxBkgi84T+cHOhnKpgk4NnOWpGX863yE6+IaGnOXUNFqDnQ== - "@types/sinon@^7.0.13": version "7.0.13" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.0.13.tgz#ca039c23a9e27ebea53e0901ef928ea2a1a6d313" integrity sha512-d7c/C/+H/knZ3L8/cxhicHUiTDxdgap0b/aNJfsmLwFu/iOP17mdgbQsbHA3SJmrzsjD0l3UEE5SN4xxuz5ung== -"@types/sinonjs__fake-timers@*": +"@types/sinonjs__fake-timers@6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz#681df970358c82836b42f989188d133e218c458e" integrity sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA== @@ -7378,10 +7335,10 @@ aproba@^1.0.3, aproba@^1.1.1: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -arch@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" - integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== +arch@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.2.tgz#0c52bbe7344bb4fa260c443d2cbad9c00ff2f0bf" + integrity sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ== archiver-utils@^2.1.0: version "2.1.0" @@ -7849,7 +7806,7 @@ async@^2.6.3: dependencies: lodash "^4.17.14" -async@^3.1.0: +async@^3.1.0, async@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== @@ -10499,10 +10456,10 @@ commander@3.0.2: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -commander@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83" - integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw== +commander@4.1.1, commander@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== commander@^2.13.0, commander@^2.15.1, commander@^2.16.0, commander@^2.19.0: version "2.20.0" @@ -10524,11 +10481,6 @@ commander@^3.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.0.tgz#0641ea00838c7a964627f04cddc336a2deddd60a" integrity sha512-pl3QrGOBa9RZaslQiqnnKX2J068wcQw7j9AIaBQ9/JEp5RY6je4jKTImg0Bd+rpoONSe7GUFSgkxLeo17m3Pow== -commander@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - commander@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/commander/-/commander-5.0.0.tgz#dbf1909b49e5044f8fdaf0adc809f0c0722bdfd0" @@ -11489,48 +11441,39 @@ cypress-multi-reporters@^1.2.3: debug "^4.1.1" lodash "^4.17.11" -cypress@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-4.5.0.tgz#01940d085f6429cec3c87d290daa47bb976a7c7b" - integrity sha512-2A4g5FW5d2fHzq8HKUGAMVTnW6P8nlWYQALiCoGN4bqBLvgwhYM/oG9oKc2CS6LnvgHFiKivKzpm9sfk3uU3zQ== +cypress@4.11.0: + version "4.11.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-4.11.0.tgz#054b0b85fd3aea793f186249ee1216126d5f0a7e" + integrity sha512-6Yd598+KPATM+dU1Ig0g2hbA+R/o1MAKt0xIejw4nZBVLSplCouBzqeKve6XsxGU6n4HMSt/+QYsWfFcoQeSEw== dependencies: "@cypress/listr-verbose-renderer" "0.4.1" "@cypress/request" "2.88.5" "@cypress/xvfb" "1.2.4" - "@types/blob-util" "1.3.3" - "@types/bluebird" "3.5.29" - "@types/chai" "4.2.7" - "@types/chai-jquery" "1.1.40" - "@types/jquery" "3.3.31" - "@types/lodash" "4.14.149" - "@types/minimatch" "3.0.3" - "@types/mocha" "5.2.7" - "@types/sinon" "7.5.1" - "@types/sinon-chai" "3.2.3" + "@types/sinonjs__fake-timers" "6.0.1" "@types/sizzle" "2.3.2" - arch "2.1.1" + arch "2.1.2" bluebird "3.7.2" cachedir "2.3.0" chalk "2.4.2" check-more-types "2.24.0" cli-table3 "0.5.1" - commander "4.1.0" + commander "4.1.1" common-tags "1.8.0" debug "4.1.1" - eventemitter2 "4.1.2" + eventemitter2 "6.4.2" execa "1.0.0" executable "4.1.1" extract-zip "1.7.0" fs-extra "8.1.0" - getos "3.1.4" + getos "3.2.1" is-ci "2.0.0" - is-installed-globally "0.1.0" + is-installed-globally "0.3.2" lazy-ass "1.6.0" listr "0.14.3" - lodash "4.17.15" + lodash "4.17.19" log-symbols "3.0.0" minimist "1.2.5" - moment "2.24.0" + moment "2.26.0" ospath "1.2.2" pretty-bytes "5.3.0" ramda "0.26.1" @@ -13890,10 +13833,10 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter2@4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-4.1.2.tgz#0e1a8477af821a6ef3995b311bf74c23a5247f15" - integrity sha1-DhqEd6+CGm7zmVsxG/dMI6UkfxU= +eventemitter2@6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.2.tgz#f31f8b99d45245f0edbc5b00797830ff3b388970" + integrity sha512-r/Pwupa5RIzxIHbEKCkNXqpEQIIT4uQDxmP4G/Lug/NokVUWj0joz/WzWl3OxRpC5kDrH/WdiUJoR+IrwvXJEw== eventemitter2@~0.4.13: version "0.4.14" @@ -15515,12 +15458,12 @@ getopts@^2.2.5: resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.5.tgz#67a0fe471cacb9c687d817cab6450b96dde8313b" integrity sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA== -getos@3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.1.4.tgz#29cdf240ed10a70c049add7b6f8cb08c81876faf" - integrity sha512-UORPzguEB/7UG5hqiZai8f0vQ7hzynMQyJLxStoQ8dPGAcmgsfXOPA4iE/fGtweHYkK+z4zc9V0g+CIFRf5HYw== +getos@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== dependencies: - async "^3.1.0" + async "^3.2.0" getos@^3.1.0: version "3.1.0" @@ -18256,15 +18199,7 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz#6e084bbc92061fbb0971ec58b6ce6d404e24da69" integrity sha1-bghLvJIGH7sJcexYts5tQE4k2mk= -is-installed-globally@0.1.0, is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - -is-installed-globally@^0.3.1: +is-installed-globally@0.3.2, is-installed-globally@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== @@ -18272,6 +18207,14 @@ is-installed-globally@^0.3.1: global-dirs "^2.0.1" is-path-inside "^3.0.1" +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + is-integer@^1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/is-integer/-/is-integer-1.0.7.tgz#6bde81aacddf78b659b6629d629cadc51a886d5c" @@ -20799,16 +20742,16 @@ lodash@4.17.11, lodash@4.17.15, lodash@>4.17.4, lodash@^4, lodash@^4.0.0, lodash resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@4.17.19, lodash@^4.17.16: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + lodash@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.17.16: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== - "lodash@npm:@elastic/lodash@3.10.1-kibana4": version "3.10.1-kibana4" resolved "https://registry.yarnpkg.com/@elastic/lodash/-/lodash-3.10.1-kibana4.tgz#d491228fd659b4a1b0dfa08ba9c67a4979b9746d" @@ -21974,7 +21917,12 @@ moment-timezone@^0.5.27: dependencies: moment ">= 2.9.0" -moment@2.24.0, "moment@>= 2.9.0", moment@>=1.6.0, moment@>=2.14.0, moment@^2.10.6, moment@^2.24.0: +moment@2.26.0: + version "2.26.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.26.0.tgz#5e1f82c6bafca6e83e808b30c8705eed0dcbd39a" + integrity sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw== + +"moment@>= 2.9.0", moment@>=1.6.0, moment@>=2.14.0, moment@^2.10.6, moment@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== From 7b29ecf0b51a835394b0c45fe0623cc978455520 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 28 Jul 2020 10:29:33 +0300 Subject: [PATCH 040/126] [Functional Tests] Fix flakiness on TSVB chart on switching index patterns test (#73238) --- test/functional/services/combo_box.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/services/combo_box.ts b/test/functional/services/combo_box.ts index 60fea7ea86cf9..ac7a40361d065 100644 --- a/test/functional/services/combo_box.ts +++ b/test/functional/services/combo_box.ts @@ -90,7 +90,7 @@ export function ComboBoxProvider({ getService, getPageObjects }: FtrProviderCont await this.clickOption(options.clickWithMouse, selectOptions[0]); } else { // if it doesn't find the item which text starts with value, it will choose the first option - const firstOption = await find.byCssSelector('.euiFilterSelectItem'); + const firstOption = await find.byCssSelector('.euiFilterSelectItem', 5000); await this.clickOption(options.clickWithMouse, firstOption); } } else { From a696f6c79b3fe20d60712faeb21e31d1f4538de4 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 28 Jul 2020 10:29:47 +0300 Subject: [PATCH 041/126] [Functional Tests] Increase waitTime for timelion to fetch the results (#73255) Co-authored-by: Elastic Machine --- test/functional/page_objects/timelion_page.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/functional/page_objects/timelion_page.ts b/test/functional/page_objects/timelion_page.ts index f025fc946bef1..23a9cc514a444 100644 --- a/test/functional/page_objects/timelion_page.ts +++ b/test/functional/page_objects/timelion_page.ts @@ -47,7 +47,7 @@ export function TimelionPageProvider({ getService, getPageObjects }: FtrProvider public async updateExpression(updates: string) { const input = await testSubjects.find('timelionExpressionTextArea'); await input.type(updates); - await PageObjects.common.sleep(500); + await PageObjects.common.sleep(1000); } public async getExpression() { @@ -60,7 +60,7 @@ export function TimelionPageProvider({ getService, getPageObjects }: FtrProvider return await Promise.all(elements.map(async (element) => await element.getVisibleText())); } - public async clickSuggestion(suggestionIndex = 0, waitTime = 500) { + public async clickSuggestion(suggestionIndex = 0, waitTime = 1000) { const elements = await testSubjects.findAll('timelionSuggestionListItem'); if (suggestionIndex > elements.length) { throw new Error( From 9b570a9bf1262428661695179fee801345017efc Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Tue, 28 Jul 2020 09:46:36 +0200 Subject: [PATCH 042/126] fix dashboard index pattern race condition (#72899) * fix dashboard index pattern race condition * improve Co-authored-by: Elastic Machine --- .../application/dashboard_app_controller.tsx | 63 ++++++++++++------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx index 8138e1c7f4dfd..2a0e2889575f3 100644 --- a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx @@ -25,8 +25,8 @@ import React, { useState, ReactElement } from 'react'; import ReactDOM from 'react-dom'; import angular from 'angular'; -import { Subscription } from 'rxjs'; -import { map } from 'rxjs/operators'; +import { Observable, pipe, Subscription } from 'rxjs'; +import { filter, map, mapTo, startWith, switchMap } from 'rxjs/operators'; import { History } from 'history'; import { SavedObjectSaveOpts } from 'src/plugins/saved_objects/public'; import { NavigationPublicPluginStart as NavigationStart } from 'src/plugins/navigation/public'; @@ -253,11 +253,7 @@ export class DashboardAppController { navActions[TopNavIds.VISUALIZE](); }; - const updateIndexPatterns = (container?: DashboardContainer) => { - if (!container || isErrorEmbeddable(container)) { - return; - } - + function getDashboardIndexPatterns(container: DashboardContainer): IndexPattern[] { let panelIndexPatterns: IndexPattern[] = []; Object.values(container.getChildIds()).forEach((id) => { const embeddableInstance = container.getChild(id); @@ -267,19 +263,34 @@ export class DashboardAppController { panelIndexPatterns.push(...embeddableIndexPatterns); }); panelIndexPatterns = uniqBy(panelIndexPatterns, 'id'); + return panelIndexPatterns; + } - if (panelIndexPatterns && panelIndexPatterns.length > 0) { - $scope.$evalAsync(() => { - $scope.indexPatterns = panelIndexPatterns; - }); - } else { - indexPatterns.getDefault().then((defaultIndexPattern) => { - $scope.$evalAsync(() => { - $scope.indexPatterns = [defaultIndexPattern as IndexPattern]; - }); + const updateIndexPatternsOperator = pipe( + filter((container: DashboardContainer) => !!container && !isErrorEmbeddable(container)), + map(getDashboardIndexPatterns), + // using switchMap for previous task cancellation + switchMap((panelIndexPatterns: IndexPattern[]) => { + return new Observable((observer) => { + if (panelIndexPatterns && panelIndexPatterns.length > 0) { + $scope.$evalAsync(() => { + if (observer.closed) return; + $scope.indexPatterns = panelIndexPatterns; + observer.complete(); + }); + } else { + indexPatterns.getDefault().then((defaultIndexPattern) => { + if (observer.closed) return; + $scope.$evalAsync(() => { + if (observer.closed) return; + $scope.indexPatterns = [defaultIndexPattern as IndexPattern]; + observer.complete(); + }); + }); + } }); - } - }; + }) + ); const getEmptyScreenProps = ( shouldShowEditHelp: boolean, @@ -384,11 +395,17 @@ export class DashboardAppController { ) : null; }; - updateIndexPatterns(dashboardContainer); - - outputSubscription = dashboardContainer.getOutput$().subscribe(() => { - updateIndexPatterns(dashboardContainer); - }); + outputSubscription = new Subscription(); + outputSubscription.add( + dashboardContainer + .getOutput$() + .pipe( + mapTo(dashboardContainer), + startWith(dashboardContainer), // to trigger initial index pattern update + updateIndexPatternsOperator + ) + .subscribe() + ); inputSubscription = dashboardContainer.getInput$().subscribe(() => { let dirty = false; From abfda1f79273111b581a14b1a43fe134c6053e6c Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Tue, 28 Jul 2020 09:57:04 +0200 Subject: [PATCH 043/126] Use "Apply_filter_trigger" in dashboard drilldown (#71468) * attach dashboard drilldown to apply filter trigger * fix types Co-authored-by: Elastic Machine --- ...na-plugin-plugins-data-public.esfilters.md | 1 + src/plugins/dashboard/public/index.ts | 6 +- src/plugins/dashboard/public/plugin.tsx | 7 +- src/plugins/dashboard/public/url_generator.ts | 6 +- src/plugins/data/public/index.ts | 2 + src/plugins/data/public/public.api.md | 94 ++++++------- .../data/public/query/timefilter/index.ts | 2 +- .../timefilter/lib/extract_time_filter.ts | 15 ++- x-pack/plugins/dashboard_enhanced/kibana.json | 3 +- .../flyout_create_drilldown.tsx | 11 +- .../constants.ts | 7 + .../drilldown.test.tsx | 54 ++------ .../drilldown.tsx | 125 +++++++----------- .../dashboard_to_dashboard_drilldown/index.ts | 5 +- .../dashboard_to_dashboard_drilldown/types.ts | 10 -- .../embeddable_action_storage.test.ts | 41 ++++++ .../embeddables/embeddable_action_storage.ts | 30 ++++- .../connected_flyout_manage_drilldowns.tsx | 6 +- 18 files changed, 227 insertions(+), 198 deletions(-) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esfilters.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esfilters.md index 37142cf1794c3..bc34d4113f847 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esfilters.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esfilters.md @@ -52,5 +52,6 @@ esFilters: { convertRangeFilterToTimeRangeString: typeof convertRangeFilterToTimeRangeString; mapAndFlattenFilters: (filters: import("../common").Filter[]) => import("../common").Filter[]; extractTimeFilter: typeof extractTimeFilter; + extractTimeRange: typeof extractTimeRange; } ``` diff --git a/src/plugins/dashboard/public/index.ts b/src/plugins/dashboard/public/index.ts index 17968dd0281e6..dcfde67cd9f13 100644 --- a/src/plugins/dashboard/public/index.ts +++ b/src/plugins/dashboard/public/index.ts @@ -32,7 +32,11 @@ export { export { DashboardConstants, createDashboardEditUrl } from './dashboard_constants'; export { DashboardStart, DashboardUrlGenerator } from './plugin'; -export { DASHBOARD_APP_URL_GENERATOR, createDashboardUrlGenerator } from './url_generator'; +export { + DASHBOARD_APP_URL_GENERATOR, + createDashboardUrlGenerator, + DashboardUrlGeneratorState, +} from './url_generator'; export { addEmbeddableToDashboardUrl } from './url_utils/url_helper'; export { SavedObjectDashboard } from './saved_dashboards'; export { SavedDashboardPanel } from './types'; diff --git a/src/plugins/dashboard/public/plugin.tsx b/src/plugins/dashboard/public/plugin.tsx index 041a02a251e8a..f0b57fec169fd 100644 --- a/src/plugins/dashboard/public/plugin.tsx +++ b/src/plugins/dashboard/public/plugin.tsx @@ -65,6 +65,7 @@ import { ACTION_REPLACE_PANEL, ClonePanelAction, ClonePanelActionContext, + createDashboardContainerByValueRenderer, DASHBOARD_CONTAINER_TYPE, DashboardContainerFactory, DashboardContainerFactoryDefinition, @@ -77,17 +78,17 @@ import { import { createDashboardUrlGenerator, DASHBOARD_APP_URL_GENERATOR, - DashboardAppLinkGeneratorState, + DashboardUrlGeneratorState, } from './url_generator'; import { createSavedDashboardLoader } from './saved_dashboards'; import { DashboardConstants } from './dashboard_constants'; import { addEmbeddableToDashboardUrl } from './url_utils/url_helper'; import { PlaceholderEmbeddableFactory } from './application/embeddable/placeholder'; -import { createDashboardContainerByValueRenderer } from './application'; +import { UrlGeneratorState } from '../../share/public'; declare module '../../share/public' { export interface UrlGeneratorStateMapping { - [DASHBOARD_APP_URL_GENERATOR]: DashboardAppLinkGeneratorState; + [DASHBOARD_APP_URL_GENERATOR]: UrlGeneratorState; } } diff --git a/src/plugins/dashboard/public/url_generator.ts b/src/plugins/dashboard/public/url_generator.ts index 188de7fd857be..68a50396e00d6 100644 --- a/src/plugins/dashboard/public/url_generator.ts +++ b/src/plugins/dashboard/public/url_generator.ts @@ -26,7 +26,7 @@ import { RefreshInterval, } from '../../data/public'; import { setStateToKbnUrl } from '../../kibana_utils/public'; -import { UrlGeneratorsDefinition, UrlGeneratorState } from '../../share/public'; +import { UrlGeneratorsDefinition } from '../../share/public'; import { SavedObjectLoader } from '../../saved_objects/public'; import { ViewMode } from '../../embeddable/public'; @@ -35,7 +35,7 @@ export const GLOBAL_STATE_STORAGE_KEY = '_g'; export const DASHBOARD_APP_URL_GENERATOR = 'DASHBOARD_APP_URL_GENERATOR'; -export type DashboardAppLinkGeneratorState = UrlGeneratorState<{ +export interface DashboardUrlGeneratorState { /** * If given, the dashboard saved object with this id will be loaded. If not given, * a new, unsaved dashboard will be loaded up. @@ -79,7 +79,7 @@ export type DashboardAppLinkGeneratorState = UrlGeneratorState<{ * View mode of the dashboard. */ viewMode?: ViewMode; -}>; +} export const createDashboardUrlGenerator = ( getStartServices: () => Promise<{ diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index 846471420327f..e95150e8f6f73 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -58,6 +58,7 @@ import { changeTimeFilter, mapAndFlattenFilters, extractTimeFilter, + extractTimeRange, convertRangeFilterToTimeRangeString, } from './query'; @@ -99,6 +100,7 @@ export const esFilters = { convertRangeFilterToTimeRangeString, mapAndFlattenFilters, extractTimeFilter, + extractTimeRange, }; export { diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index a8868c07061c3..65670bc1cf83e 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -499,6 +499,7 @@ export const esFilters: { convertRangeFilterToTimeRangeString: typeof convertRangeFilterToTimeRangeString; mapAndFlattenFilters: (filters: import("../common").Filter[]) => import("../common").Filter[]; extractTimeFilter: typeof extractTimeFilter; + extractTimeRange: typeof extractTimeRange; }; // Warning: (ae-missing-release-tag) "esKuery" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -1973,52 +1974,53 @@ export const UI_SETTINGS: { // src/plugins/data/common/es_query/filters/match_all_filter.ts:28:3 - (ae-forgotten-export) The symbol "MatchAllFilterMeta" needs to be exported by the entry point index.d.ts // src/plugins/data/common/es_query/filters/phrase_filter.ts:33:3 - (ae-forgotten-export) The symbol "PhraseFilterMeta" needs to be exported by the entry point index.d.ts // src/plugins/data/common/es_query/filters/phrases_filter.ts:31:3 - (ae-forgotten-export) The symbol "PhrasesFilterMeta" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "FilterLabel" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "FILTERS" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "getDisplayValueFromFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "generateFilters" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "changeTimeFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "convertRangeFilterToTimeRangeString" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "extractTimeFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:136:21 - (ae-forgotten-export) The symbol "buildEsQuery" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:136:21 - (ae-forgotten-export) The symbol "getEsQueryConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:136:21 - (ae-forgotten-export) The symbol "luceneStringToDsl" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:136:21 - (ae-forgotten-export) The symbol "decorateQuery" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "FieldFormatsRegistry" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "BoolFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "BytesFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "ColorFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "DurationFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "IpFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "NumberFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "PercentFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "RelativeDateFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "SourceFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "StaticLookupFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "UrlFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "StringFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "validateIndexPattern" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:371:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:372:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:381:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:382:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:383:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:384:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:392:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:396:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "FilterLabel" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "FILTERS" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "getDisplayValueFromFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "generateFilters" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "changeTimeFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "convertRangeFilterToTimeRangeString" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "extractTimeFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "extractTimeRange" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:138:21 - (ae-forgotten-export) The symbol "buildEsQuery" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:138:21 - (ae-forgotten-export) The symbol "getEsQueryConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:138:21 - (ae-forgotten-export) The symbol "luceneStringToDsl" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:138:21 - (ae-forgotten-export) The symbol "decorateQuery" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "FieldFormatsRegistry" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "BoolFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "BytesFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "ColorFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "DurationFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "IpFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "NumberFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "PercentFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "RelativeDateFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "SourceFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "StaticLookupFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "UrlFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "StringFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "validateIndexPattern" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:373:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:374:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:383:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:384:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:385:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:386:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:391:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:395:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:398:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:41:60 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:54:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:55:5 - (ae-forgotten-export) The symbol "createFiltersFromRangeSelectAction" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/public/query/timefilter/index.ts b/src/plugins/data/public/query/timefilter/index.ts index 19386c10ab59f..dc9a4ef8c21a6 100644 --- a/src/plugins/data/public/query/timefilter/index.ts +++ b/src/plugins/data/public/query/timefilter/index.ts @@ -23,5 +23,5 @@ export * from './types'; export { Timefilter, TimefilterContract } from './timefilter'; export { TimeHistory, TimeHistoryContract } from './time_history'; export { changeTimeFilter, convertRangeFilterToTimeRangeString } from './lib/change_time_filter'; -export { extractTimeFilter } from './lib/extract_time_filter'; +export { extractTimeFilter, extractTimeRange } from './lib/extract_time_filter'; export { validateTimeRange } from './lib/validate_timerange'; diff --git a/src/plugins/data/public/query/timefilter/lib/extract_time_filter.ts b/src/plugins/data/public/query/timefilter/lib/extract_time_filter.ts index 23dd1547baf10..2f93196e3218b 100644 --- a/src/plugins/data/public/query/timefilter/lib/extract_time_filter.ts +++ b/src/plugins/data/public/query/timefilter/lib/extract_time_filter.ts @@ -18,7 +18,8 @@ */ import { keys, partition } from 'lodash'; -import { Filter, isRangeFilter, RangeFilter } from '../../../../common'; +import { Filter, isRangeFilter, RangeFilter, TimeRange } from '../../../../common'; +import { convertRangeFilterToTimeRangeString } from './change_time_filter'; export function extractTimeFilter(timeFieldName: string, filters: Filter[]) { const [timeRangeFilter, restOfFilters] = partition(filters, (obj: Filter) => { @@ -36,3 +37,15 @@ export function extractTimeFilter(timeFieldName: string, filters: Filter[]) { timeRangeFilter: timeRangeFilter[0] as RangeFilter | undefined, }; } + +export function extractTimeRange( + filters: Filter[], + timeFieldName?: string +): { restOfFilters: Filter[]; timeRange?: TimeRange } { + if (!timeFieldName) return { restOfFilters: filters, timeRange: undefined }; + const { timeRangeFilter, restOfFilters } = extractTimeFilter(timeFieldName, filters); + return { + restOfFilters, + timeRange: timeRangeFilter ? convertRangeFilterToTimeRangeString(timeRangeFilter) : undefined, + }; +} diff --git a/x-pack/plugins/dashboard_enhanced/kibana.json b/x-pack/plugins/dashboard_enhanced/kibana.json index ba5d8052ca787..264fa0438ea11 100644 --- a/x-pack/plugins/dashboard_enhanced/kibana.json +++ b/x-pack/plugins/dashboard_enhanced/kibana.json @@ -8,6 +8,7 @@ "requiredBundles": [ "kibanaUtils", "embeddableEnhanced", - "kibanaReact" + "kibanaReact", + "uiActions" ] } diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx index 4804a700c6cff..2de862a6708a8 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx @@ -6,7 +6,12 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { ActionByType } from '../../../../../../../../src/plugins/ui_actions/public'; +import { + ActionByType, + APPLY_FILTER_TRIGGER, + SELECT_RANGE_TRIGGER, + VALUE_CLICK_TRIGGER, +} from '../../../../../../../../src/plugins/ui_actions/public'; import { toMountPoint } from '../../../../../../../../src/plugins/kibana_react/public'; import { isEnhancedEmbeddable } from '../../../../../../embeddable_enhanced/public'; import { EmbeddableContext } from '../../../../../../../../src/plugins/embeddable/public'; @@ -42,7 +47,9 @@ export class FlyoutCreateDrilldownAction implements ActionByType -1; + return supportedTriggers.some((trigger) => + [VALUE_CLICK_TRIGGER, SELECT_RANGE_TRIGGER, APPLY_FILTER_TRIGGER].includes(trigger) + ); } public async isCompatible(context: EmbeddableContext) { diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/constants.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/constants.ts index e2a530b156da5..daefcf2d68cc5 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/constants.ts +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/constants.ts @@ -4,4 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ +/** + * note: + * don't change this string without carefull consideration, + * because it is stored in saved objects. + * Also temporary dashboard drilldown migration code inside embeddable plugin relies on it + * x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.ts + */ export const DASHBOARD_TO_DASHBOARD_DRILLDOWN = 'DASHBOARD_TO_DASHBOARD_DRILLDOWN'; diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.test.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.test.tsx index 52b232afa9410..40fa469feb34b 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.test.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.test.tsx @@ -5,9 +5,8 @@ */ import { DashboardToDashboardDrilldown } from './drilldown'; -import { savedObjectsServiceMock, coreMock } from '../../../../../../../src/core/public/mocks'; -import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; -import { ActionContext, Config } from './types'; +import { Config } from './types'; +import { coreMock, savedObjectsServiceMock } from '../../../../../../../src/core/public/mocks'; import { Filter, FilterStateStore, @@ -15,16 +14,13 @@ import { RangeFilter, TimeRange, } from '../../../../../../../src/plugins/data/common'; -import { esFilters } from '../../../../../../../src/plugins/data/public'; - +import { + ApplyGlobalFilterActionContext, + esFilters, +} from '../../../../../../../src/plugins/data/public'; // convenient to use real implementation here. import { createDashboardUrlGenerator } from '../../../../../../../src/plugins/dashboard/public/url_generator'; import { UrlGeneratorsService } from '../../../../../../../src/plugins/share/public/url_generators'; -import { VisualizeEmbeddableContract } from '../../../../../../../src/plugins/visualizations/public'; -import { - RangeSelectContext, - ValueClickContext, -} from '../../../../../../../src/plugins/embeddable/public'; import { StartDependencies } from '../../../plugin'; import { SavedObjectLoader } from '../../../../../../../src/plugins/saved_objects/public'; import { StartServicesGetter } from '../../../../../../../src/plugins/kibana_utils/public/core'; @@ -82,11 +78,10 @@ describe('.execute() & getHref', () => { config: Partial, embeddableInput: { filters?: Filter[]; timeRange?: TimeRange; query?: Query }, filtersFromEvent: Filter[], - useRangeEvent = false + timeFieldName?: string ) { const navigateToApp = jest.fn(); const getUrlForApp = jest.fn((app, opt) => `${app}/${opt.path}`); - const dataPluginActions = dataPluginMock.createStartContract().actions; const savedObjectsClient = savedObjectsServiceMock.createStartContract().client; const drilldown = new DashboardToDashboardDrilldown({ @@ -102,9 +97,6 @@ describe('.execute() & getHref', () => { }, plugins: { uiActionsEnhanced: {}, - data: { - actions: dataPluginActions, - }, }, self: {}, })) as unknown) as StartServicesGetter>, @@ -119,12 +111,6 @@ describe('.execute() & getHref', () => { ) ), }); - const selectRangeFiltersSpy = jest - .spyOn(dataPluginActions, 'createFiltersFromRangeSelectAction') - .mockImplementation(() => Promise.resolve(filtersFromEvent)); - const valueClickFiltersSpy = jest - .spyOn(dataPluginActions, 'createFiltersFromValueClickAction') - .mockImplementation(() => Promise.resolve(filtersFromEvent)); const completeConfig: Config = { dashboardId: 'id', @@ -134,12 +120,7 @@ describe('.execute() & getHref', () => { }; const context = ({ - data: { - ...(useRangeEvent - ? ({ range: {} } as RangeSelectContext['data']) - : ({ data: [] } as ValueClickContext['data'])), - timeFieldName: 'order_date', - }, + filters: filtersFromEvent, embeddable: { getInput: () => ({ filters: [], @@ -148,18 +129,11 @@ describe('.execute() & getHref', () => { ...embeddableInput, }), }, - } as unknown) as ActionContext; + timeFieldName, + } as unknown) as ApplyGlobalFilterActionContext; await drilldown.execute(completeConfig, context); - if (useRangeEvent) { - expect(selectRangeFiltersSpy).toBeCalledTimes(1); - expect(valueClickFiltersSpy).toBeCalledTimes(0); - } else { - expect(selectRangeFiltersSpy).toBeCalledTimes(0); - expect(valueClickFiltersSpy).toBeCalledTimes(1); - } - expect(navigateToApp).toBeCalledTimes(1); expect(navigateToApp.mock.calls[0][0]).toBe('dashboards'); @@ -180,8 +154,7 @@ describe('.execute() & getHref', () => { dashboardId: testDashboardId, }, {}, - [], - false + [] ); expect(href).toEqual(expect.stringContaining(`view/${testDashboardId}`)); @@ -289,8 +262,7 @@ describe('.execute() & getHref', () => { to: 'now', }, }, - [], - false + [] ); expect(href).not.toEqual(expect.stringContaining('now-300m')); @@ -308,7 +280,7 @@ describe('.execute() & getHref', () => { }, }, [getMockTimeRangeFilter()], - true + getMockTimeRangeFilter().meta.key ); expect(href).not.toEqual(expect.stringContaining('now-300m')); diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.tsx index 26a69132cffb1..703acbc8d9d59 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.tsx @@ -6,20 +6,24 @@ import React from 'react'; import { reactToUiComponent } from '../../../../../../../src/plugins/kibana_react/public'; -import { DashboardUrlGenerator } from '../../../../../../../src/plugins/dashboard/public'; -import { ActionContext, Config } from './types'; +import { + DashboardUrlGenerator, + DashboardUrlGeneratorState, +} from '../../../../../../../src/plugins/dashboard/public'; import { CollectConfigContainer } from './components'; import { DASHBOARD_TO_DASHBOARD_DRILLDOWN } from './constants'; import { UiActionsEnhancedDrilldownDefinition as Drilldown } from '../../../../../ui_actions_enhanced/public'; import { txtGoToDashboard } from './i18n'; -import { esFilters } from '../../../../../../../src/plugins/data/public'; -import { VisualizeEmbeddableContract } from '../../../../../../../src/plugins/visualizations/public'; import { - isRangeSelectTriggerContext, - isValueClickTriggerContext, -} from '../../../../../../../src/plugins/embeddable/public'; + ApplyGlobalFilterActionContext, + esFilters, + isFilters, + isQuery, + isTimeRange, +} from '../../../../../../../src/plugins/data/public'; import { StartServicesGetter } from '../../../../../../../src/plugins/kibana_utils/public'; import { StartDependencies } from '../../../plugin'; +import { Config } from './types'; export interface Params { start: StartServicesGetter>; @@ -27,7 +31,7 @@ export interface Params { } export class DashboardToDashboardDrilldown - implements Drilldown> { + implements Drilldown { constructor(protected readonly params: Params) {} public readonly id = DASHBOARD_TO_DASHBOARD_DRILLDOWN; @@ -57,15 +61,12 @@ export class DashboardToDashboardDrilldown public readonly getHref = async ( config: Config, - context: ActionContext + context: ApplyGlobalFilterActionContext ): Promise => { return this.getDestinationUrl(config, context); }; - public readonly execute = async ( - config: Config, - context: ActionContext - ) => { + public readonly execute = async (config: Config, context: ApplyGlobalFilterActionContext) => { const dashboardPath = await this.getDestinationUrl(config, context); const dashboardHash = dashboardPath.split('#')[1]; @@ -76,73 +77,43 @@ export class DashboardToDashboardDrilldown private getDestinationUrl = async ( config: Config, - context: ActionContext + context: ApplyGlobalFilterActionContext ): Promise => { + const state: DashboardUrlGeneratorState = { + dashboardId: config.dashboardId, + }; + + if (context.embeddable) { + const input = context.embeddable.getInput(); + if (isQuery(input.query) && config.useCurrentFilters) state.query = input.query; + + // if useCurrentDashboardDataRange is enabled, then preserve current time range + // if undefined is passed, then destination dashboard will figure out time range itself + // for brush event this time range would be overwritten + if (isTimeRange(input.timeRange) && config.useCurrentDateRange) + state.timeRange = input.timeRange; + + // if useCurrentDashboardFilters enabled, then preserve all the filters (pinned and unpinned) + // otherwise preserve only pinned + if (isFilters(input.filters)) + state.filters = config.useCurrentFilters + ? input.filters + : input.filters?.filter((f) => esFilters.isFilterPinned(f)); + } + const { - createFiltersFromRangeSelectAction, - createFiltersFromValueClickAction, - } = this.params.start().plugins.data.actions; - const { - timeRange: currentTimeRange, - query, - filters: currentFilters, - } = context.embeddable!.getInput(); - - // if useCurrentDashboardFilters enabled, then preserve all the filters (pinned and unpinned) - // otherwise preserve only pinned - const existingFilters = - (config.useCurrentFilters - ? currentFilters - : currentFilters?.filter((f) => esFilters.isFilterPinned(f))) ?? []; - - // if useCurrentDashboardDataRange is enabled, then preserve current time range - // if undefined is passed, then destination dashboard will figure out time range itself - // for brush event this time range would be overwritten - let timeRange = config.useCurrentDateRange ? currentTimeRange : undefined; - let filtersFromEvent = await (async () => { - try { - if (isRangeSelectTriggerContext(context)) - return await createFiltersFromRangeSelectAction(context.data); - if (isValueClickTriggerContext(context)) - return await createFiltersFromValueClickAction(context.data); - - // eslint-disable-next-line no-console - console.warn( - ` - DashboardToDashboard drilldown: can't extract filters from action. - Is it not supported action?`, - context - ); - - return []; - } catch (e) { - // eslint-disable-next-line no-console - console.warn( - ` - DashboardToDashboard drilldown: error extracting filters from action. - Continuing without applying filters from event`, - e - ); - return []; - } - })(); - - if (context.data.timeFieldName) { - const { timeRangeFilter, restOfFilters } = esFilters.extractTimeFilter( - context.data.timeFieldName, - filtersFromEvent - ); - filtersFromEvent = restOfFilters; - if (timeRangeFilter) { - timeRange = esFilters.convertRangeFilterToTimeRangeString(timeRangeFilter); - } + restOfFilters: filtersFromEvent, + timeRange: timeRangeFromEvent, + } = esFilters.extractTimeRange(context.filters, context.timeFieldName); + + if (filtersFromEvent) { + state.filters = [...(state.filters ?? []), ...filtersFromEvent]; } - return this.params.getDashboardUrlGenerator().createUrl({ - dashboardId: config.dashboardId, - query: config.useCurrentFilters ? query : undefined, - timeRange, - filters: [...existingFilters, ...filtersFromEvent], - }); + if (timeRangeFromEvent) { + state.timeRange = timeRangeFromEvent; + } + + return this.params.getDashboardUrlGenerator().createUrl(state); }; } diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/index.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/index.ts index 914f34980a272..49065a96b4f7b 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/index.ts +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/index.ts @@ -9,7 +9,4 @@ export { DashboardToDashboardDrilldown, Params as DashboardToDashboardDrilldownParams, } from './drilldown'; -export { - ActionContext as DashboardToDashboardActionContext, - Config as DashboardToDashboardConfig, -} from './types'; +export { Config } from './types'; diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/types.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/types.ts index 6be2e2a77269f..426e250499de0 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/types.ts +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/types.ts @@ -4,16 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - ValueClickContext, - RangeSelectContext, - IEmbeddable, -} from '../../../../../../../src/plugins/embeddable/public'; - -export type ActionContext = - | ValueClickContext - | RangeSelectContext; - export interface Config { dashboardId?: string; useCurrentFilters: boolean; diff --git a/x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.test.ts b/x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.test.ts index 5c5d98d75295d..fffb75451f8ac 100644 --- a/x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.test.ts +++ b/x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.test.ts @@ -11,6 +11,9 @@ import { } from './embeddable_action_storage'; import { UiActionsEnhancedSerializedEvent } from '../../../ui_actions_enhanced/public'; import { of } from '../../../../../src/plugins/kibana_utils/public'; +// use real const to make test fail in case someone accidentally changes it +import { DASHBOARD_TO_DASHBOARD_DRILLDOWN } from '../../../dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown'; +import { APPLY_FILTER_TRIGGER } from '../../../../../src/plugins/ui_actions/public'; class TestEmbeddable extends Embeddable { public readonly type = 'test'; @@ -539,4 +542,42 @@ describe('EmbeddableActionStorage', () => { expect(await storage.list()).toEqual([]); }); }); + + describe('migrate', () => { + test('DASHBOARD_TO_DASHBOARD_DRILLDOWN triggers migration', async () => { + const embeddable = new TestEmbeddable(); + const OTHER_TRIGGER = 'OTHER_TRIGGER'; + embeddable.updateInput({ + enhancements: { + dynamicActions: { + events: [ + { + eventId: '1', + triggers: [OTHER_TRIGGER], + action: { + factoryId: DASHBOARD_TO_DASHBOARD_DRILLDOWN, + name: '', + config: {}, + }, + }, + { + eventId: '2', + triggers: [OTHER_TRIGGER], + action: { + factoryId: 'SOME_OTHER', + name: '', + config: {}, + }, + }, + ], + }, + }, + }); + const storage = new EmbeddableActionStorage(embeddable); + + const [event1, event2] = await storage.list(); + expect(event1.triggers).toEqual([APPLY_FILTER_TRIGGER]); + expect(event2.triggers).toEqual([OTHER_TRIGGER]); + }); + }); }); diff --git a/x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.ts b/x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.ts index fdc42585a80ce..8881b2063c8db 100644 --- a/x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.ts +++ b/x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.ts @@ -46,7 +46,7 @@ export class EmbeddableActionStorage extends AbstractActionStorage { public async create(event: SerializedEvent) { const input = this.embbeddable.getInput(); - const events = input.enhancements?.dynamicActions?.events || []; + const events = this.getEventsFromEmbeddable(); const exists = !!events.find(({ eventId }) => eventId === event.eventId); if (exists) { @@ -61,7 +61,7 @@ export class EmbeddableActionStorage extends AbstractActionStorage { public async update(event: SerializedEvent) { const input = this.embbeddable.getInput(); - const events = input.enhancements?.dynamicActions?.events || []; + const events = this.getEventsFromEmbeddable(); const index = events.findIndex(({ eventId }) => eventId === event.eventId); if (index === -1) { @@ -77,7 +77,7 @@ export class EmbeddableActionStorage extends AbstractActionStorage { public async remove(eventId: string) { const input = this.embbeddable.getInput(); - const events = input.enhancements?.dynamicActions?.events || []; + const events = this.getEventsFromEmbeddable(); const index = events.findIndex((event) => eventId === event.eventId); if (index === -1) { @@ -93,7 +93,7 @@ export class EmbeddableActionStorage extends AbstractActionStorage { public async read(eventId: string): Promise { const input = this.embbeddable.getInput(); - const events = input.enhancements?.dynamicActions?.events || []; + const events = this.getEventsFromEmbeddable(); const event = events.find((ev) => eventId === ev.eventId); if (!event) { @@ -107,8 +107,28 @@ export class EmbeddableActionStorage extends AbstractActionStorage { } public async list(): Promise { + return this.getEventsFromEmbeddable(); + } + + private getEventsFromEmbeddable() { const input = this.embbeddable.getInput(); const events = input.enhancements?.dynamicActions?.events || []; - return events; + return this.migrate(events); + } + + // TODO: https://github.com/elastic/kibana/issues/71431 + // Migration implementation should use registry + // Action factories implementations should register own migrations + private migrate(events: SerializedEvent[]): SerializedEvent[] { + return events.map((event) => { + // Initially dashboard drilldown relied on VALUE_CLICK & RANGE_SELECT + if (event.action.factoryId === 'DASHBOARD_TO_DASHBOARD_DRILLDOWN') { + return { + ...event, + triggers: ['FILTER_TRIGGER'], + }; + } + return event; + }); } } diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx index 20d15b4f4d2bd..283464b137ff9 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx @@ -11,9 +11,8 @@ import { DrilldownWizardConfig, FlyoutDrilldownWizard } from '../flyout_drilldow import { FlyoutListManageDrilldowns } from '../flyout_list_manage_drilldowns'; import { IStorageWrapper } from '../../../../../../../src/plugins/kibana_utils/public'; import { - VALUE_CLICK_TRIGGER, - SELECT_RANGE_TRIGGER, TriggerContextMapping, + APPLY_FILTER_TRIGGER, } from '../../../../../../../src/plugins/ui_actions/public'; import { useContainerState } from '../../../../../../../src/plugins/kibana_utils/public'; import { DrilldownListItem } from '../list_manage_drilldowns'; @@ -67,8 +66,9 @@ export function createFlyoutManageDrilldowns({ return (props: ConnectedFlyoutManageDrilldownsProps) => { const isCreateOnly = props.viewMode === 'create'; + // TODO: https://github.com/elastic/kibana/issues/59569 const selectedTriggers: Array = React.useMemo( - () => [VALUE_CLICK_TRIGGER, SELECT_RANGE_TRIGGER], + () => [APPLY_FILTER_TRIGGER], [] ); From 5ea28702f6a2aa3e0592a79fa5ea396ff68fd972 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 28 Jul 2020 11:15:58 +0300 Subject: [PATCH 044/126] [Functional Tests] Increase the timeout when locating the tableview] (#73243) --- test/functional/page_objects/visual_builder_page.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/page_objects/visual_builder_page.ts b/test/functional/page_objects/visual_builder_page.ts index 0db8cac0f0758..8488eb8cd2749 100644 --- a/test/functional/page_objects/visual_builder_page.ts +++ b/test/functional/page_objects/visual_builder_page.ts @@ -408,7 +408,7 @@ export function VisualBuilderPageProvider({ getService, getPageObjects }: FtrPro * @memberof VisualBuilderPage */ public async getViewTable(): Promise { - const tableView = await testSubjects.find('tableView'); + const tableView = await testSubjects.find('tableView', 20000); return await tableView.getVisibleText(); } From c0826a32730ba55c0192e81fc23788be5966fdcd Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Tue, 28 Jul 2020 11:37:37 +0300 Subject: [PATCH 045/126] Fix App status flaky test (#72853) * wait for link to be updated * await, please! Co-authored-by: Elastic Machine --- .../plugins/core_app_status/public/plugin.tsx | 3 +-- .../core_plugins/application_status.ts | 16 +++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/test/plugin_functional/plugins/core_app_status/public/plugin.tsx b/test/plugin_functional/plugins/core_app_status/public/plugin.tsx index af23bfbe1f8f5..bdc08c03c1912 100644 --- a/test/plugin_functional/plugins/core_app_status/public/plugin.tsx +++ b/test/plugin_functional/plugins/core_app_status/public/plugin.tsx @@ -26,6 +26,7 @@ import { CoreStart, AppMountParameters, } from 'kibana/public'; +import { renderApp } from './application'; import './types'; export class CoreAppStatusPlugin implements Plugin<{}, CoreAppStatusPluginStart> { @@ -36,7 +37,6 @@ export class CoreAppStatusPlugin implements Plugin<{}, CoreAppStatusPluginStart> id: 'app_status_start', title: 'App Status Start Page', async mount(params: AppMountParameters) { - const { renderApp } = await import('./application'); return renderApp('app_status_start', params); }, }); @@ -47,7 +47,6 @@ export class CoreAppStatusPlugin implements Plugin<{}, CoreAppStatusPluginStart> euiIconType: 'snowflake', updater$: this.appUpdater, async mount(params: AppMountParameters) { - const { renderApp } = await import('./application'); return renderApp('app_status', params); }, }); diff --git a/test/plugin_functional/test_suites/core_plugins/application_status.ts b/test/plugin_functional/test_suites/core_plugins/application_status.ts index 31a1c28b50842..a4c2db733b894 100644 --- a/test/plugin_functional/test_suites/core_plugins/application_status.ts +++ b/test/plugin_functional/test_suites/core_plugins/application_status.ts @@ -41,6 +41,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide const PageObjects = getPageObjects(['common']); const browser = getService('browser'); const appsMenu = getService('appsMenu'); + const retry = getService('retry'); const testSubjects = getService('testSubjects'); const setAppStatus = async (s: Partial) => { @@ -50,15 +51,14 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide }, s); }; - const navigateToApp = async (i: string) => { + const navigateToApp = async (id: string) => { return await browser.executeAsync(async (appId, cb) => { await window.__coreAppStatus.navigateToApp(appId); cb(); - }, i); + }, id); }; - // FLAKY: https://github.com/elastic/kibana/issues/65423 - describe.skip('application status management', () => { + describe('application status management', () => { beforeEach(async () => { await PageObjects.common.navigateToApp('app_status_start'); }); @@ -101,15 +101,17 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide }); it('allows to change the defaultPath of an application', async () => { - let link = await appsMenu.getLink('App Status'); + const link = await appsMenu.getLink('App Status'); expect(link!.href).to.eql(getKibanaUrl('/app/app_status')); await setAppStatus({ defaultPath: '/arbitrary/path', }); - link = await appsMenu.getLink('App Status'); - expect(link!.href).to.eql(getKibanaUrl('/app/app_status/arbitrary/path')); + await retry.waitFor('link url updated with "defaultPath"', async () => { + const updatedLink = await appsMenu.getLink('App Status'); + return updatedLink?.href === getKibanaUrl('/app/app_status/arbitrary/path'); + }); await navigateToApp('app_status'); expect(await testSubjects.exists('appStatusApp')).to.eql(true); From 1c791f39dac906f3a46b3703a82ba33e8f263a4b Mon Sep 17 00:00:00 2001 From: MadameSheema Date: Tue, 28 Jul 2020 10:48:14 +0200 Subject: [PATCH 046/126] [SIEM][Timelines] Updates timeline template callout text (#73334) * updates timeline template callout text * fixes typo in constant Co-authored-by: Elastic Machine --- .../timelines/components/timeline/header/index.test.tsx | 2 +- .../public/timelines/components/timeline/header/index.tsx | 2 +- .../timelines/components/timeline/header/translations.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.test.tsx index e0043f3b232da..e7b0ce7b7428e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.test.tsx @@ -177,7 +177,7 @@ describe('Header', () => { expect( wrapper.find('[data-test-subj="timelineImmutableCallOut"]').first().prop('title') ).toEqual( - 'This timeline is immutable, therefore not allowed to save it within the security application, though you may continue to use the timeline to search and filter security events' + 'This prebuilt timeline template cannot be modified. To make changes, please duplicate this template and make modifications to the duplicate template.' ); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.tsx index 75bfb52f2756b..e50a6ed1e45fe 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.tsx @@ -73,7 +73,7 @@ const TimelineHeaderComponent: React.FC = ({ {status === TimelineStatus.immutable && ( Date: Tue, 28 Jul 2020 13:00:16 +0300 Subject: [PATCH 047/126] [Search] add server logs (#72454) * improve test stability * logs and scope search function * uncomment * fix ts * ts Co-authored-by: Elastic Machine --- src/plugins/data/server/plugin.ts | 4 ++-- .../es_search/es_search_strategy.test.ts | 11 +++++---- .../search/es_search/es_search_strategy.ts | 6 +++-- .../data/server/search/search_service.test.ts | 5 +++- .../data/server/search/search_service.ts | 24 +++++++++++++++---- x-pack/plugins/data_enhanced/server/plugin.ts | 12 ++++++++-- .../server/search/es_search_strategy.test.ts | 13 ++++++---- .../server/search/es_search_strategy.ts | 6 ++++- 8 files changed, 60 insertions(+), 21 deletions(-) diff --git a/src/plugins/data/server/plugin.ts b/src/plugins/data/server/plugin.ts index 8fa32f9bd564f..61d8e566d2d2b 100644 --- a/src/plugins/data/server/plugin.ts +++ b/src/plugins/data/server/plugin.ts @@ -62,11 +62,11 @@ export class DataServerPlugin implements Plugin) { - this.searchService = new SearchService(initializerContext); + this.logger = initializerContext.logger.get('data'); + this.searchService = new SearchService(initializerContext, this.logger); this.scriptsService = new ScriptsService(); this.kqlTelemetryService = new KqlTelemetryService(initializerContext); this.autocompleteService = new AutocompleteService(initializerContext); - this.logger = initializerContext.logger.get('data'); } public setup( diff --git a/src/plugins/data/server/search/es_search/es_search_strategy.test.ts b/src/plugins/data/server/search/es_search/es_search_strategy.test.ts index 1155a5491e8f3..bc59bdee6a40a 100644 --- a/src/plugins/data/server/search/es_search/es_search_strategy.test.ts +++ b/src/plugins/data/server/search/es_search/es_search_strategy.test.ts @@ -22,6 +22,9 @@ import { pluginInitializerContextConfigMock } from '../../../../../core/server/m import { esSearchStrategyProvider } from './es_search_strategy'; describe('ES search strategy', () => { + const mockLogger: any = { + info: () => {}, + }; const mockApiCaller = jest.fn().mockResolvedValue({ _shards: { total: 10, @@ -40,14 +43,14 @@ describe('ES search strategy', () => { }); it('returns a strategy with `search`', async () => { - const esSearch = await esSearchStrategyProvider(mockConfig$); + const esSearch = await esSearchStrategyProvider(mockConfig$, mockLogger); expect(typeof esSearch.search).toBe('function'); }); it('calls the API caller with the params with defaults', async () => { const params = { index: 'logstash-*' }; - const esSearch = await esSearchStrategyProvider(mockConfig$); + const esSearch = await esSearchStrategyProvider(mockConfig$, mockLogger); await esSearch.search((mockContext as unknown) as RequestHandlerContext, { params }); @@ -63,7 +66,7 @@ describe('ES search strategy', () => { it('calls the API caller with overridden defaults', async () => { const params = { index: 'logstash-*', ignoreUnavailable: false, timeout: '1000ms' }; - const esSearch = await esSearchStrategyProvider(mockConfig$); + const esSearch = await esSearchStrategyProvider(mockConfig$, mockLogger); await esSearch.search((mockContext as unknown) as RequestHandlerContext, { params }); @@ -77,7 +80,7 @@ describe('ES search strategy', () => { it('returns total, loaded, and raw response', async () => { const params = { index: 'logstash-*' }; - const esSearch = await esSearchStrategyProvider(mockConfig$); + const esSearch = await esSearchStrategyProvider(mockConfig$, mockLogger); const response = await esSearch.search((mockContext as unknown) as RequestHandlerContext, { params, diff --git a/src/plugins/data/server/search/es_search/es_search_strategy.ts b/src/plugins/data/server/search/es_search/es_search_strategy.ts index 82f8ef21ebb38..b8010f735c327 100644 --- a/src/plugins/data/server/search/es_search/es_search_strategy.ts +++ b/src/plugins/data/server/search/es_search/es_search_strategy.ts @@ -17,16 +17,18 @@ * under the License. */ import { first } from 'rxjs/operators'; -import { SharedGlobalConfig } from 'kibana/server'; +import { SharedGlobalConfig, Logger } from 'kibana/server'; import { SearchResponse } from 'elasticsearch'; import { Observable } from 'rxjs'; import { ISearchStrategy, getDefaultSearchParams, getTotalLoaded } from '..'; export const esSearchStrategyProvider = ( - config$: Observable + config$: Observable, + logger: Logger ): ISearchStrategy => { return { search: async (context, request, options) => { + logger.info(`search ${JSON.stringify(request.params)}`); const config = await config$.pipe(first()).toPromise(); const defaultParams = getDefaultSearchParams(config); diff --git a/src/plugins/data/server/search/search_service.test.ts b/src/plugins/data/server/search/search_service.test.ts index 8c2ed96503003..be00b7409fe4a 100644 --- a/src/plugins/data/server/search/search_service.test.ts +++ b/src/plugins/data/server/search/search_service.test.ts @@ -28,7 +28,10 @@ describe('Search service', () => { let mockCoreSetup: MockedKeys>; beforeEach(() => { - plugin = new SearchService(coreMock.createPluginInitializerContext({})); + const mockLogger: any = { + info: () => {}, + }; + plugin = new SearchService(coreMock.createPluginInitializerContext({}), mockLogger); mockCoreSetup = coreMock.createSetup(); }); diff --git a/src/plugins/data/server/search/search_service.ts b/src/plugins/data/server/search/search_service.ts index 5686023e9a667..bbd0671754749 100644 --- a/src/plugins/data/server/search/search_service.ts +++ b/src/plugins/data/server/search/search_service.ts @@ -22,6 +22,7 @@ import { PluginInitializerContext, CoreSetup, RequestHandlerContext, + Logger, } from '../../../../core/server'; import { ISearchSetup, ISearchStart, ISearchStrategy } from './types'; import { registerSearchRoute } from './routes'; @@ -41,7 +42,10 @@ interface StrategyMap { export class SearchService implements Plugin { private searchStrategies: StrategyMap = {}; - constructor(private initializerContext: PluginInitializerContext) {} + constructor( + private initializerContext: PluginInitializerContext, + private readonly logger: Logger + ) {} public setup( core: CoreSetup, @@ -49,7 +53,7 @@ export class SearchService implements Plugin { ): ISearchSetup { this.registerSearchStrategy( ES_SEARCH_STRATEGY, - esSearchStrategyProvider(this.initializerContext.config.legacy.globalConfig$) + esSearchStrategyProvider(this.initializerContext.config.legacy.globalConfig$, this.logger) ); core.savedObjects.registerType(searchTelemetry); @@ -65,7 +69,11 @@ export class SearchService implements Plugin { return { registerSearchStrategy: this.registerSearchStrategy, usage }; } - private search(context: RequestHandlerContext, searchRequest: IEsSearchRequest, options: any) { + private search( + context: RequestHandlerContext, + searchRequest: IEsSearchRequest, + options: Record + ) { return this.getSearchStrategy(options.strategy || ES_SEARCH_STRATEGY).search( context, searchRequest, @@ -76,17 +84,25 @@ export class SearchService implements Plugin { public start(): ISearchStart { return { getSearchStrategy: this.getSearchStrategy, - search: this.search, + search: ( + context: RequestHandlerContext, + searchRequest: IEsSearchRequest, + options: Record + ) => { + return this.search(context, searchRequest, options); + }, }; } public stop() {} private registerSearchStrategy = (name: string, strategy: ISearchStrategy) => { + this.logger.info(`Register strategy ${name}`); this.searchStrategies[name] = strategy; }; private getSearchStrategy = (name: string): ISearchStrategy => { + this.logger.info(`Get strategy ${name}`); const strategy = this.searchStrategies[name]; if (!strategy) { throw new Error(`Search strategy ${name} not found`); diff --git a/x-pack/plugins/data_enhanced/server/plugin.ts b/x-pack/plugins/data_enhanced/server/plugin.ts index 4f6756231912c..9c3a0edf7e733 100644 --- a/x-pack/plugins/data_enhanced/server/plugin.ts +++ b/x-pack/plugins/data_enhanced/server/plugin.ts @@ -9,6 +9,7 @@ import { CoreSetup, CoreStart, Plugin, + Logger, } from '../../../../src/core/server'; import { ES_SEARCH_STRATEGY } from '../../../../src/plugins/data/common'; import { PluginSetup as DataPluginSetup } from '../../../../src/plugins/data/server'; @@ -19,12 +20,19 @@ interface SetupDependencies { } export class EnhancedDataServerPlugin implements Plugin { - constructor(private initializerContext: PluginInitializerContext) {} + private readonly logger: Logger; + + constructor(private initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get('data_enhanced'); + } public setup(core: CoreSetup, deps: SetupDependencies) { deps.data.search.registerSearchStrategy( ES_SEARCH_STRATEGY, - enhancedEsSearchStrategyProvider(this.initializerContext.config.legacy.globalConfig$) + enhancedEsSearchStrategyProvider( + this.initializerContext.config.legacy.globalConfig$, + this.logger + ) ); } diff --git a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.test.ts b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.test.ts index 1eec941466b73..faa4f2ee499e5 100644 --- a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.test.ts +++ b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.test.ts @@ -31,6 +31,9 @@ const mockRollupResponse = { describe('ES search strategy', () => { const mockApiCaller = jest.fn(); + const mockLogger: any = { + info: () => {}, + }; const mockContext = { core: { elasticsearch: { legacy: { client: { callAsCurrentUser: mockApiCaller } } } }, }; @@ -41,7 +44,7 @@ describe('ES search strategy', () => { }); it('returns a strategy with `search`', async () => { - const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$); + const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$, mockLogger); expect(typeof esSearch.search).toBe('function'); }); @@ -50,7 +53,7 @@ describe('ES search strategy', () => { mockApiCaller.mockResolvedValueOnce(mockAsyncResponse); const params = { index: 'logstash-*', body: { query: {} } }; - const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$); + const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$, mockLogger); await esSearch.search((mockContext as unknown) as RequestHandlerContext, { params }); @@ -66,7 +69,7 @@ describe('ES search strategy', () => { mockApiCaller.mockResolvedValueOnce(mockAsyncResponse); const params = { index: 'logstash-*', body: { query: {} } }; - const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$); + const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$, mockLogger); await esSearch.search((mockContext as unknown) as RequestHandlerContext, { id: 'foo', params }); @@ -82,7 +85,7 @@ describe('ES search strategy', () => { mockApiCaller.mockResolvedValueOnce(mockAsyncResponse); const params = { index: 'foo-程', body: {} }; - const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$); + const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$, mockLogger); await esSearch.search((mockContext as unknown) as RequestHandlerContext, { params }); @@ -97,7 +100,7 @@ describe('ES search strategy', () => { mockApiCaller.mockResolvedValueOnce(mockRollupResponse); const params = { index: 'foo-程', body: {} }; - const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$); + const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$, mockLogger); await esSearch.search((mockContext as unknown) as RequestHandlerContext, { indexType: 'rollup', diff --git a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts index 7b29117495a67..358335a2a4d60 100644 --- a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts @@ -12,6 +12,7 @@ import { LegacyAPICaller, SharedGlobalConfig, RequestHandlerContext, + Logger, } from '../../../../../src/core/server'; import { ISearchOptions, @@ -30,13 +31,15 @@ export interface AsyncSearchResponse { } export const enhancedEsSearchStrategyProvider = ( - config$: Observable + config$: Observable, + logger: Logger ): ISearchStrategy => { const search = async ( context: RequestHandlerContext, request: IEnhancedEsSearchRequest, options?: ISearchOptions ) => { + logger.info(`search ${JSON.stringify(request.params) || request.id}`); const config = await config$.pipe(first()).toPromise(); const caller = context.core.elasticsearch.legacy.client.callAsCurrentUser; const defaultParams = getDefaultSearchParams(config); @@ -48,6 +51,7 @@ export const enhancedEsSearchStrategyProvider = ( }; const cancel = async (context: RequestHandlerContext, id: string) => { + logger.info(`cancel ${id}`); const method = 'DELETE'; const path = encodeURI(`/_async_search/${id}`); await context.core.elasticsearch.legacy.client.callAsCurrentUser('transport.request', { From 12d5b8d2f95cc085065def98e614590828adfa7e Mon Sep 17 00:00:00 2001 From: MadameSheema Date: Tue, 28 Jul 2020 13:13:01 +0200 Subject: [PATCH 048/126] executes cypress tests when there is a change in parts of alerting team code we use (#73256) --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 69c61b5bfa988..818ba748ee165 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -43,7 +43,7 @@ kibanaPipeline(timeoutMinutes: 155, checkPrChanges: true, setCommitStatus: true) 'xpack-accessibility': kibanaPipeline.functionalTestProcess('xpack-accessibility', './test/scripts/jenkins_xpack_accessibility.sh'), 'xpack-savedObjectsFieldMetrics': kibanaPipeline.functionalTestProcess('xpack-savedObjectsFieldMetrics', './test/scripts/jenkins_xpack_saved_objects_field_metrics.sh'), 'xpack-securitySolutionCypress': { processNumber -> - whenChanged(['x-pack/plugins/security_solution/', 'x-pack/test/security_solution_cypress/']) { + whenChanged(['x-pack/plugins/security_solution/', 'x-pack/test/security_solution_cypress/', 'x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/', 'x-pack/plugins/triggers_actions_ui/public/application/context/actions_connectors_context.tsx']) { kibanaPipeline.functionalTestProcess('xpack-securitySolutionCypress', './test/scripts/jenkins_security_solution_cypress.sh')(processNumber) } }, From 46fb8475f382cff56d10783798d6a3c2d1f3dda2 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Tue, 28 Jul 2020 14:38:14 +0300 Subject: [PATCH 049/126] [Security Solutions] Show popovers inside modals (#73264) --- .../security_solution/public/common/components/page/index.tsx | 4 ++-- .../public/common/components/with_hover_actions/index.tsx | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/page/index.tsx b/x-pack/plugins/security_solution/public/common/components/page/index.tsx index 9a5654ed6475f..8737fa95c94a2 100644 --- a/x-pack/plugins/security_solution/public/common/components/page/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/page/index.tsx @@ -49,8 +49,8 @@ export const AppGlobalStyle = createGlobalStyle<{ theme: { eui: { euiColorPrimar border: none; } - /* hide open popovers when a modal is being displayed to prevent them from covering the modal */ - body.euiBody-hasOverlayMask .euiPopover__panel-isOpen { + /* hide open draggable popovers when a modal is being displayed to prevent them from covering the modal */ + body.euiBody-hasOverlayMask .withHoverActions__popover.euiPopover__panel-isOpen{ visibility: hidden !important; } diff --git a/x-pack/plugins/security_solution/public/common/components/with_hover_actions/index.tsx b/x-pack/plugins/security_solution/public/common/components/with_hover_actions/index.tsx index e6577bd040e25..9e28345ffbbcf 100644 --- a/x-pack/plugins/security_solution/public/common/components/with_hover_actions/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/with_hover_actions/index.tsx @@ -90,6 +90,7 @@ export const WithHoverActions = React.memo( hasArrow={false} isOpen={isOpen} panelPaddingSize={!alwaysShow ? 's' : 'none'} + panelClassName="withHoverActions__popover" > {isOpen ? <>{hoverContent} : null} From 09b11b61f0fefb736847f5000713bcf6ebfae0b0 Mon Sep 17 00:00:00 2001 From: Larry Gregory Date: Tue, 28 Jul 2020 07:44:37 -0400 Subject: [PATCH 050/126] Introduce reserved ml privilege for the apm_user role (#72266) Co-authored-by: Elastic Machine --- x-pack/plugins/infra/server/features.ts | 12 ++++----- .../plugins/ml/common/types/capabilities.ts | 16 ++++++++++++ x-pack/plugins/ml/server/plugin.ts | 6 ++++- .../disable_ui_capabilities.test.ts | 8 +++--- .../authorization/disable_ui_capabilities.ts | 9 +++---- .../feature_privilege_builder/navlink.ts | 5 +--- .../privileges/privileges.test.ts | 25 +++---------------- .../capabilities_switcher.test.ts | 2 +- .../capabilities/capabilities_switcher.ts | 3 +-- .../apis/security/privileges.ts | 2 +- .../apis/security/privileges_basic.ts | 2 +- .../infrastructure_security.ts | 24 +++++++++--------- .../feature_controls/infrastructure_spaces.ts | 22 ++++++++-------- .../infra/feature_controls/logs_security.ts | 24 +++++++++--------- .../infra/feature_controls/logs_spaces.ts | 22 ++++++++-------- .../test/ui_capabilities/common/features.ts | 2 +- .../plugins/foo_plugin/server/index.ts | 6 ++--- .../common/nav_links_builder.ts | 13 ++++++---- .../common/services/features.ts | 2 +- .../common/services/ui_capabilities.ts | 2 +- .../security_only/tests/nav_links.ts | 2 +- 21 files changed, 102 insertions(+), 107 deletions(-) diff --git a/x-pack/plugins/infra/server/features.ts b/x-pack/plugins/infra/server/features.ts index 0de431186b151..fdbd1ec894022 100644 --- a/x-pack/plugins/infra/server/features.ts +++ b/x-pack/plugins/infra/server/features.ts @@ -17,12 +17,12 @@ export const METRICS_FEATURE = { order: 700, icon: 'metricsApp', navLinkId: 'metrics', - app: ['infra', 'kibana'], + app: ['infra', 'metrics', 'kibana'], catalogue: ['infraops'], alerting: [METRIC_THRESHOLD_ALERT_TYPE_ID, METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID], privileges: { all: { - app: ['infra', 'kibana'], + app: ['infra', 'metrics', 'kibana'], catalogue: ['infraops'], api: ['infra'], savedObject: { @@ -35,7 +35,7 @@ export const METRICS_FEATURE = { ui: ['show', 'configureSource', 'save', 'alerting:show'], }, read: { - app: ['infra', 'kibana'], + app: ['infra', 'metrics', 'kibana'], catalogue: ['infraops'], api: ['infra'], savedObject: { @@ -58,12 +58,12 @@ export const LOGS_FEATURE = { order: 800, icon: 'logsApp', navLinkId: 'logs', - app: ['infra', 'kibana'], + app: ['infra', 'logs', 'kibana'], catalogue: ['infralogging'], alerting: [LOG_DOCUMENT_COUNT_ALERT_TYPE_ID], privileges: { all: { - app: ['infra', 'kibana'], + app: ['infra', 'logs', 'kibana'], catalogue: ['infralogging'], api: ['infra'], savedObject: { @@ -76,7 +76,7 @@ export const LOGS_FEATURE = { ui: ['show', 'configureSource', 'save'], }, read: { - app: ['infra', 'kibana'], + app: ['infra', 'logs', 'kibana'], catalogue: ['infralogging'], api: ['infra'], alerting: { diff --git a/x-pack/plugins/ml/common/types/capabilities.ts b/x-pack/plugins/ml/common/types/capabilities.ts index 504cd28b8fa14..58a2043502d27 100644 --- a/x-pack/plugins/ml/common/types/capabilities.ts +++ b/x-pack/plugins/ml/common/types/capabilities.ts @@ -7,6 +7,10 @@ import { KibanaRequest } from 'kibana/server'; import { PLUGIN_ID } from '../constants/app'; +export const apmUserMlCapabilities = { + canGetJobs: false, +}; + export const userMlCapabilities = { canAccessML: false, // Anomaly Detection @@ -68,6 +72,7 @@ export function getDefaultCapabilities(): MlCapabilities { } export function getPluginPrivileges() { + const apmUserMlCapabilitiesKeys = Object.keys(apmUserMlCapabilities); const userMlCapabilitiesKeys = Object.keys(userMlCapabilities); const adminMlCapabilitiesKeys = Object.keys(adminMlCapabilities); const allMlCapabilitiesKeys = [...adminMlCapabilitiesKeys, ...userMlCapabilitiesKeys]; @@ -101,6 +106,17 @@ export function getPluginPrivileges() { read: savedObjects, }, }, + apmUser: { + excludeFromBasePrivileges: true, + app: [], + catalogue: [], + savedObject: { + all: [], + read: [], + }, + api: apmUserMlCapabilitiesKeys.map((k) => `ml:${k}`), + ui: apmUserMlCapabilitiesKeys, + }, }; } diff --git a/x-pack/plugins/ml/server/plugin.ts b/x-pack/plugins/ml/server/plugin.ts index 812db744d1bda..3c3824a785032 100644 --- a/x-pack/plugins/ml/server/plugin.ts +++ b/x-pack/plugins/ml/server/plugin.ts @@ -75,7 +75,7 @@ export class MlServerPlugin implements Plugin { new Feature({ id: 'fooFeature', name: 'Foo Feature', - app: ['fooApp'], + app: ['fooApp', 'foo'], navLinkId: 'foo', privileges: null, }), @@ -129,7 +129,7 @@ describe('usingPrivileges', () => { new Feature({ id: 'fooFeature', name: 'Foo Feature', - app: [], + app: ['foo'], navLinkId: 'foo', privileges: null, }), @@ -262,7 +262,7 @@ describe('usingPrivileges', () => { id: 'barFeature', name: 'Bar Feature', navLinkId: 'bar', - app: [], + app: ['bar'], privileges: null, }), ], @@ -412,7 +412,7 @@ describe('all', () => { new Feature({ id: 'fooFeature', name: 'Foo Feature', - app: [], + app: ['foo'], navLinkId: 'foo', privileges: null, }), diff --git a/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts b/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts index a9b3fa54d3617..c126be1b07f6e 100644 --- a/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts +++ b/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts @@ -18,12 +18,11 @@ export function disableUICapabilitiesFactory( logger: Logger, authz: AuthorizationServiceSetup ) { - // nav links are sourced from two places: - // 1) The `navLinkId` property. This is deprecated and will be removed (https://github.com/elastic/kibana/issues/66217) - // 2) The apps property. The Kibana Platform associates nav links to the app which registers it, in a 1:1 relationship. - // This behavior is replacing the `navLinkId` property above. + // nav links are sourced from the apps property. + // The Kibana Platform associates nav links to the app which registers it, in a 1:1 relationship. + // This behavior is replacing the `navLinkId` property. const featureNavLinkIds = features - .flatMap((feature) => [feature.navLinkId, ...feature.app]) + .flatMap((feature) => feature.app) .filter((navLinkId) => navLinkId != null); const shouldDisableFeatureUICapability = ( diff --git a/x-pack/plugins/security/server/authorization/privileges/feature_privilege_builder/navlink.ts b/x-pack/plugins/security/server/authorization/privileges/feature_privilege_builder/navlink.ts index f25632407be86..a6e5a01c7dba8 100644 --- a/x-pack/plugins/security/server/authorization/privileges/feature_privilege_builder/navlink.ts +++ b/x-pack/plugins/security/server/authorization/privileges/feature_privilege_builder/navlink.ts @@ -9,9 +9,6 @@ import { BaseFeaturePrivilegeBuilder } from './feature_privilege_builder'; export class FeaturePrivilegeNavlinkBuilder extends BaseFeaturePrivilegeBuilder { public getActions(privilegeDefinition: FeatureKibanaPrivileges, feature: Feature): string[] { - const appNavLinks = feature.app.map((app) => this.actions.ui.get('navLinks', app)); - return feature.navLinkId - ? [this.actions.ui.get('navLinks', feature.navLinkId), ...appNavLinks] - : appNavLinks; + return (privilegeDefinition.app ?? []).map((app) => this.actions.ui.get('navLinks', app)); } } diff --git a/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts b/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts index d8ece8f68d425..89ac73c220756 100644 --- a/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts +++ b/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts @@ -54,20 +54,8 @@ describe('features', () => { const actual = privileges.get(); expect(actual).toHaveProperty('features.foo-feature', { - all: [ - actions.login, - actions.version, - actions.ui.get('navLinks', 'kibana:foo'), - actions.ui.get('navLinks', 'app-1'), - actions.ui.get('navLinks', 'app-2'), - ], - read: [ - actions.login, - actions.version, - actions.ui.get('navLinks', 'kibana:foo'), - actions.ui.get('navLinks', 'app-1'), - actions.ui.get('navLinks', 'app-2'), - ], + all: [actions.login, actions.version], + read: [actions.login, actions.version], }); }); @@ -275,7 +263,6 @@ describe('features', () => { actions.ui.get('catalogue', 'all-catalogue-2'), actions.ui.get('management', 'all-management', 'all-management-1'), actions.ui.get('management', 'all-management', 'all-management-2'), - actions.ui.get('navLinks', 'kibana:foo'), actions.savedObject.get('all-savedObject-all-1', 'bulk_get'), actions.savedObject.get('all-savedObject-all-1', 'get'), actions.savedObject.get('all-savedObject-all-1', 'find'), @@ -386,7 +373,6 @@ describe('features', () => { actions.ui.get('catalogue', 'read-catalogue-2'), actions.ui.get('management', 'read-management', 'read-management-1'), actions.ui.get('management', 'read-management', 'read-management-2'), - actions.ui.get('navLinks', 'kibana:foo'), actions.savedObject.get('read-savedObject-all-1', 'bulk_get'), actions.savedObject.get('read-savedObject-all-1', 'get'), actions.savedObject.get('read-savedObject-all-1', 'find'), @@ -644,12 +630,7 @@ describe('reserved', () => { const privileges = privilegesFactory(actions, mockXPackMainPlugin as any, mockLicenseService); const actual = privileges.get(); - expect(actual).toHaveProperty('reserved.foo', [ - actions.version, - actions.ui.get('navLinks', 'kibana:foo'), - actions.ui.get('navLinks', 'app-1'), - actions.ui.get('navLinks', 'app-2'), - ]); + expect(actual).toHaveProperty('reserved.foo', [actions.version]); }); test(`actions only specified at the privilege are alright too`, () => { diff --git a/x-pack/plugins/spaces/server/capabilities/capabilities_switcher.test.ts b/x-pack/plugins/spaces/server/capabilities/capabilities_switcher.test.ts index 797d7fd1bdcc4..c9ea1b44e723d 100644 --- a/x-pack/plugins/spaces/server/capabilities/capabilities_switcher.test.ts +++ b/x-pack/plugins/spaces/server/capabilities/capabilities_switcher.test.ts @@ -23,7 +23,7 @@ const features = ([ id: 'feature_2', name: 'Feature 2', navLinkId: 'feature2', - app: [], + app: ['feature2'], catalogue: ['feature2Entry'], management: { kibana: ['somethingElse'], diff --git a/x-pack/plugins/spaces/server/capabilities/capabilities_switcher.ts b/x-pack/plugins/spaces/server/capabilities/capabilities_switcher.ts index 00e2419136f48..e8d964b22010c 100644 --- a/x-pack/plugins/spaces/server/capabilities/capabilities_switcher.ts +++ b/x-pack/plugins/spaces/server/capabilities/capabilities_switcher.ts @@ -83,8 +83,7 @@ function toggleDisabledFeatures( for (const feature of disabledFeatures) { // Disable associated navLink, if one exists - const featureNavLinks = feature.navLinkId ? [feature.navLinkId, ...feature.app] : feature.app; - featureNavLinks.forEach((app) => { + feature.app.forEach((app) => { if (navLinks.hasOwnProperty(app) && !enabledAppEntries.has(app)) { navLinks[app] = false; } diff --git a/x-pack/test/api_integration/apis/security/privileges.ts b/x-pack/test/api_integration/apis/security/privileges.ts index 1ad25a11be879..07233f1685385 100644 --- a/x-pack/test/api_integration/apis/security/privileges.ts +++ b/x-pack/test/api_integration/apis/security/privileges.ts @@ -43,7 +43,7 @@ export default function ({ getService }: FtrProviderContext) { }, global: ['all', 'read'], space: ['all', 'read'], - reserved: ['ml_user', 'ml_admin', 'monitoring'], + reserved: ['ml_user', 'ml_admin', 'ml_apm_user', 'monitoring'], }; await supertest diff --git a/x-pack/test/api_integration/apis/security/privileges_basic.ts b/x-pack/test/api_integration/apis/security/privileges_basic.ts index d5263aed26d0b..74d95fa1e4a76 100644 --- a/x-pack/test/api_integration/apis/security/privileges_basic.ts +++ b/x-pack/test/api_integration/apis/security/privileges_basic.ts @@ -41,7 +41,7 @@ export default function ({ getService }: FtrProviderContext) { }, global: ['all', 'read'], space: ['all', 'read'], - reserved: ['ml_user', 'ml_admin', 'monitoring'], + reserved: ['ml_user', 'ml_admin', 'ml_apm_user', 'monitoring'], }; await supertest diff --git a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts index 971826112a3e2..3c471516e9c66 100644 --- a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts +++ b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts @@ -423,19 +423,19 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect(navLinks).to.not.contain(['Metrics']); }); - it(`metrics app is inaccessible and Application Not Found message is rendered`, async () => { - await PageObjects.common.navigateToApp('infraOps'); - await testSubjects.existOrFail('~appNotFoundPageContent'); - await PageObjects.common.navigateToUrlWithBrowserHistory( - 'infraOps', - '/inventory', - undefined, - { - ensureCurrentUrl: false, - shouldLoginIfPrompted: false, - } + it(`metrics app is inaccessible and returns a 404`, async () => { + await PageObjects.common.navigateToActualUrl('infraOps', '', { + ensureCurrentUrl: false, + shouldLoginIfPrompted: false, + }); + const messageText = await PageObjects.common.getBodyText(); + expect(messageText).to.eql( + JSON.stringify({ + statusCode: 404, + error: 'Not Found', + message: 'Not Found', + }) ); - await testSubjects.existOrFail('~appNotFoundPageContent'); }); }); }); diff --git a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_spaces.ts b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_spaces.ts index 211a9ce718b56..1bf8ded69016b 100644 --- a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_spaces.ts +++ b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_spaces.ts @@ -79,21 +79,19 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); it(`metrics app is inaccessible and Application Not Found message is rendered`, async () => { - await PageObjects.common.navigateToApp('infraOps', { + await PageObjects.common.navigateToActualUrl('infraOps', '', { + ensureCurrentUrl: false, + shouldLoginIfPrompted: false, basePath: '/s/custom_space', }); - await testSubjects.existOrFail('~appNotFoundPageContent'); - await PageObjects.common.navigateToUrlWithBrowserHistory( - 'infraOps', - '/inventory', - undefined, - { - basePath: '/s/custom_space', - ensureCurrentUrl: false, - shouldLoginIfPrompted: false, - } + const messageText = await PageObjects.common.getBodyText(); + expect(messageText).to.eql( + JSON.stringify({ + statusCode: 404, + error: 'Not Found', + message: 'Not Found', + }) ); - await testSubjects.existOrFail('~appNotFoundPageContent'); }); }); diff --git a/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts b/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts index c7d94f86ea420..64154ff6cf3f7 100644 --- a/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts +++ b/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts @@ -187,19 +187,19 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect(navLinks).to.not.contain('Logs'); }); - it(`logs app is inaccessible and Application Not Found message is rendered`, async () => { - await PageObjects.common.navigateToApp('infraLogs'); - await testSubjects.existOrFail('~appNotFoundPageContent'); - await PageObjects.common.navigateToUrlWithBrowserHistory( - 'infraLogs', - '/stream', - undefined, - { - ensureCurrentUrl: false, - shouldLoginIfPrompted: false, - } + it(`logs app is inaccessible and returns a 404`, async () => { + await PageObjects.common.navigateToActualUrl('infraLogs', '', { + ensureCurrentUrl: false, + shouldLoginIfPrompted: false, + }); + const messageText = await PageObjects.common.getBodyText(); + expect(messageText).to.eql( + JSON.stringify({ + statusCode: 404, + error: 'Not Found', + message: 'Not Found', + }) ); - await testSubjects.existOrFail('~appNotFoundPageContent'); }); }); }); diff --git a/x-pack/test/functional/apps/infra/feature_controls/logs_spaces.ts b/x-pack/test/functional/apps/infra/feature_controls/logs_spaces.ts index 4d54539a4d09e..ea08307ccedd3 100644 --- a/x-pack/test/functional/apps/infra/feature_controls/logs_spaces.ts +++ b/x-pack/test/functional/apps/infra/feature_controls/logs_spaces.ts @@ -80,21 +80,19 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); it(`logs app is inaccessible and Application Not Found message is rendered`, async () => { - await PageObjects.common.navigateToApp('infraLogs', { + await PageObjects.common.navigateToActualUrl('infraLogs', '', { + ensureCurrentUrl: false, + shouldLoginIfPrompted: false, basePath: '/s/custom_space', }); - await testSubjects.existOrFail('~appNotFoundPageContent'); - await PageObjects.common.navigateToUrlWithBrowserHistory( - 'infraLogs', - '/stream', - undefined, - { - basePath: '/s/custom_space', - ensureCurrentUrl: false, - shouldLoginIfPrompted: false, - } + const messageText = await PageObjects.common.getBodyText(); + expect(messageText).to.eql( + JSON.stringify({ + statusCode: 404, + error: 'Not Found', + message: 'Not Found', + }) ); - await testSubjects.existOrFail('~appNotFoundPageContent'); }); }); }); diff --git a/x-pack/test/ui_capabilities/common/features.ts b/x-pack/test/ui_capabilities/common/features.ts index 3c015bc21e937..e3febc945c299 100644 --- a/x-pack/test/ui_capabilities/common/features.ts +++ b/x-pack/test/ui_capabilities/common/features.ts @@ -5,7 +5,7 @@ */ interface Feature { - navLinkId: string; + app: string[]; } export interface Features { diff --git a/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/server/index.ts b/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/server/index.ts index bff794801119a..5c80b4283a69b 100644 --- a/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/server/index.ts +++ b/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/server/index.ts @@ -19,11 +19,11 @@ class FooPlugin implements Plugin { name: 'Foo', icon: 'upArrow', navLinkId: 'foo_plugin', - app: ['kibana'], + app: ['foo_plugin', 'kibana'], catalogue: ['foo'], privileges: { all: { - app: ['kibana'], + app: ['foo_plugin', 'kibana'], catalogue: ['foo'], savedObject: { all: ['foo'], @@ -32,7 +32,7 @@ class FooPlugin implements Plugin { ui: ['create', 'edit', 'delete', 'show'], }, read: { - app: ['kibana'], + app: ['foo_plugin', 'kibana'], catalogue: ['foo'], savedObject: { all: [], diff --git a/x-pack/test/ui_capabilities/common/nav_links_builder.ts b/x-pack/test/ui_capabilities/common/nav_links_builder.ts index b20a499ba7e20..04ab08e08a2ba 100644 --- a/x-pack/test/ui_capabilities/common/nav_links_builder.ts +++ b/x-pack/test/ui_capabilities/common/nav_links_builder.ts @@ -13,11 +13,14 @@ export class NavLinksBuilder { ...features, // management isn't a first-class "feature", but it makes our life easier here to pretend like it is management: { - navLinkId: 'kibana:stack_management', + app: ['kibana:stack_management'], }, // TODO: Temp until navLinkIds fix is merged in appSearch: { - navLinkId: 'appSearch', + app: ['appSearch', 'workplaceSearch'], + }, + kibana: { + app: ['kibana'], }, }; } @@ -38,9 +41,9 @@ export class NavLinksBuilder { private build(callback: buildCallback): Record { const navLinks = {} as Record; for (const [featureId, feature] of Object.entries(this.features)) { - if (feature.navLinkId) { - navLinks[feature.navLinkId] = callback(featureId); - } + feature.app.forEach((app) => { + navLinks[app] = callback(featureId); + }); } return navLinks; diff --git a/x-pack/test/ui_capabilities/common/services/features.ts b/x-pack/test/ui_capabilities/common/services/features.ts index 0f796c1d0a0cc..5f6ec0ad050c7 100644 --- a/x-pack/test/ui_capabilities/common/services/features.ts +++ b/x-pack/test/ui_capabilities/common/services/features.ts @@ -40,7 +40,7 @@ export class FeaturesService { (acc: Features, feature: any) => ({ ...acc, [feature.id]: { - navLinkId: feature.navLinkId, + app: feature.app, }, }), {} diff --git a/x-pack/test/ui_capabilities/common/services/ui_capabilities.ts b/x-pack/test/ui_capabilities/common/services/ui_capabilities.ts index bb1f3b6eefe4a..7f831973aea5c 100644 --- a/x-pack/test/ui_capabilities/common/services/ui_capabilities.ts +++ b/x-pack/test/ui_capabilities/common/services/ui_capabilities.ts @@ -52,7 +52,7 @@ export class UICapabilitiesService { }): Promise { const features = await this.featureService.get(); const applications = Object.values(features) - .map((feature) => feature.navLinkId) + .flatMap((feature) => feature.app) .filter((link) => !!link); const spaceUrlPrefix = spaceId ? `/s/${spaceId}` : ''; diff --git a/x-pack/test/ui_capabilities/security_only/tests/nav_links.ts b/x-pack/test/ui_capabilities/security_only/tests/nav_links.ts index 18838e536cf96..d7a0dfa1cf80a 100644 --- a/x-pack/test/ui_capabilities/security_only/tests/nav_links.ts +++ b/x-pack/test/ui_capabilities/security_only/tests/nav_links.ts @@ -57,7 +57,7 @@ export default function navLinksTests({ getService }: FtrProviderContext) { expect(uiCapabilities.success).to.be(true); expect(uiCapabilities.value).to.have.property('navLinks'); expect(uiCapabilities.value!.navLinks).to.eql( - navLinksBuilder.only('management', 'foo') + navLinksBuilder.only('management', 'foo', 'kibana') ); break; case 'legacy_all': From b5a920d8c9cf94a1468d9f9cb022f716e17bdfa3 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Tue, 28 Jul 2020 13:50:02 +0200 Subject: [PATCH 051/126] [Uptime] Convert kuery bar to ts (#70310) Co-authored-by: Elastic Machine --- .../__tests__/alert_monitor_status.test.tsx | 10 - .../overview/alerts/alert_monitor_status.tsx | 3 - .../alert_monitor_status.tsx | 4 - .../overview/kuery_bar/kuery_bar.tsx | 22 +- .../kuery_bar/typeahead/click_outside.js | 40 --- .../overview/kuery_bar/typeahead/index.d.ts | 46 --- .../overview/kuery_bar/typeahead/index.js | 245 -------------- .../overview/kuery_bar/typeahead/index.ts | 7 + .../kuery_bar/typeahead/suggestion.js | 140 -------- .../kuery_bar/typeahead/suggestion.tsx | 89 +++++ .../kuery_bar/typeahead/suggestions.js | 111 ------ .../kuery_bar/typeahead/suggestions.tsx | 116 +++++++ .../overview/kuery_bar/typeahead/typehead.tsx | 318 ++++++++++++++++++ .../plugins/uptime/public/pages/overview.tsx | 8 - 14 files changed, 543 insertions(+), 616 deletions(-) delete mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/click_outside.js delete mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.d.ts delete mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.js create mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.ts delete mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.js create mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.tsx delete mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.js create mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.tsx create mode 100644 x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/typehead.tsx diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx index f3f3d583fd938..f26da59238b20 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx @@ -17,10 +17,6 @@ describe('alert monitor status component', () => { timerangeUnit: 'h', timerangeCount: 21, }, - autocomplete: { - addQuerySuggestionProvider: jest.fn(), - getQuerySuggestions: jest.fn(), - }, enabled: true, hasFilters: false, isOldAlert: true, @@ -45,12 +41,6 @@ describe('alert monitor status component', () => { /> = (p setAlertParams('search', value)} diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx index 4ac0355f5edc8..50b6fe2aa0ef1 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx @@ -7,7 +7,6 @@ import React, { useMemo, useEffect } from 'react'; import { useLocation } from 'react-router-dom'; import { useSelector, useDispatch } from 'react-redux'; -import { DataPublicPluginSetup } from 'src/plugins/data/public'; import { isRight } from 'fp-ts/lib/Either'; import { selectMonitorStatusAlert, @@ -32,7 +31,6 @@ import { useUpdateKueryString } from '../../../../hooks'; interface Props { alertParams: { [key: string]: any }; - autocomplete: DataPublicPluginSetup['autocomplete']; enabled: boolean; numTimes: number; setAlertParams: (key: string, value: any) => void; @@ -43,7 +41,6 @@ interface Props { } export const AlertMonitorStatus: React.FC = ({ - autocomplete, enabled, numTimes, setAlertParams, @@ -122,7 +119,6 @@ export const AlertMonitorStatus: React.FC = ({ return ( ({ suggestions: [], isLoadingIndexPattern: true, @@ -80,7 +85,7 @@ export function KueryBar({ const indexPatternMissing = loading && !indexPattern; - async function onChange(inputValue: string, selectionStart: number) { + async function onChange(inputValue: string, selectionStart: number | null) { if (!indexPattern) { return; } @@ -94,7 +99,7 @@ export function KueryBar({ try { const suggestions = ( - (await autocompleteService.getQuerySuggestions({ + (await autocomplete.getQuerySuggestions({ language: 'kuery', indexPatterns: [indexPattern], query: inputValue, @@ -111,8 +116,7 @@ export function KueryBar({ }, ], })) || [] - ).filter((suggestion) => !startsWith(suggestion.text, 'span.')); - + ).filter((suggestion: QuerySuggestion) => !startsWith(suggestion.text, 'span.')); if (currentRequest !== currentRequestCheck) { return; } @@ -155,8 +159,8 @@ export function KueryBar({ return ( { - this.nodeRef = node; - }; - - onClick = (event) => { - if (this.nodeRef && !this.nodeRef.contains(event.target)) { - this.props.onClickOutside(); - } - }; - - render() { - return ( -
      - {this.props.children} -
      - ); - } -} - -ClickOutside.propTypes = { - onClickOutside: PropTypes.func.isRequired, -}; diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.d.ts b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.d.ts deleted file mode 100644 index 751170f3b1cf7..0000000000000 --- a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.d.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; - -interface TypeaheadProps { - onChange: (inputValue: string, selectionStart: number) => void; - onSubmit: (inputValue: string) => void; - loadMore: () => void; - suggestions: unknown[]; - queryExample: string; - initialValue?: string; - isLoading?: boolean; - disabled?: boolean; -} - -export class Typeahead extends React.Component { - incrementIndex(currentIndex: any): void; - - decrementIndex(currentIndex: any): void; - - onKeyUp(event: any): void; - - onKeyDown(event: any): void; - - selectSuggestion(suggestion: any): void; - - onClickOutside(): void; - - onChangeInputValue(event: any): void; - - onClickInput(event: any): void; - - onClickSuggestion(suggestion: any): void; - - onMouseEnterSuggestion(index: any): void; - - onSubmit(): void; - - render(): any; - - loadMore(): void; -} diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.js b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.js deleted file mode 100644 index 17141235d8bf2..0000000000000 --- a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.js +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import Suggestions from './suggestions'; -import ClickOutside from './click_outside'; -import { EuiFieldSearch, EuiProgress } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; - -const KEY_CODES = { - LEFT: 37, - UP: 38, - RIGHT: 39, - DOWN: 40, - ENTER: 13, - ESC: 27, - TAB: 9, -}; - -export class Typeahead extends Component { - state = { - isSuggestionsVisible: false, - index: null, - value: '', - inputIsPristine: true, - lastSubmitted: '', - selected: null, - }; - - static getDerivedStateFromProps(props, state) { - if (state.inputIsPristine && props.initialValue) { - return { - value: props.initialValue, - }; - } - - return null; - } - - incrementIndex = (currentIndex) => { - let nextIndex = currentIndex + 1; - if (currentIndex === null || nextIndex >= this.props.suggestions.length) { - nextIndex = 0; - } - this.setState({ index: nextIndex }); - }; - - decrementIndex = (currentIndex) => { - let previousIndex = currentIndex - 1; - if (previousIndex < 0) { - previousIndex = null; - } - this.setState({ index: previousIndex }); - }; - - onKeyUp = (event) => { - const { selectionStart } = event.target; - const { value } = this.state; - switch (event.keyCode) { - case KEY_CODES.LEFT: - this.setState({ isSuggestionsVisible: true }); - this.props.onChange(value, selectionStart); - break; - case KEY_CODES.RIGHT: - this.setState({ isSuggestionsVisible: true }); - this.props.onChange(value, selectionStart); - break; - } - }; - - onKeyDown = (event) => { - const { isSuggestionsVisible, index, value } = this.state; - switch (event.keyCode) { - case KEY_CODES.DOWN: - event.preventDefault(); - if (isSuggestionsVisible) { - this.incrementIndex(index); - } else { - this.setState({ isSuggestionsVisible: true, index: 0 }); - } - break; - case KEY_CODES.UP: - event.preventDefault(); - if (isSuggestionsVisible) { - this.decrementIndex(index); - } - break; - case KEY_CODES.ENTER: - event.preventDefault(); - if (isSuggestionsVisible && this.props.suggestions[index]) { - this.selectSuggestion(this.props.suggestions[index]); - } else { - this.setState({ isSuggestionsVisible: false }); - this.props.onSubmit(value); - } - break; - case KEY_CODES.ESC: - event.preventDefault(); - this.setState({ isSuggestionsVisible: false }); - break; - case KEY_CODES.TAB: - this.setState({ isSuggestionsVisible: false }); - break; - } - }; - - selectSuggestion = (suggestion) => { - const nextInputValue = - this.state.value.substr(0, suggestion.start) + - suggestion.text + - this.state.value.substr(suggestion.end); - - this.setState({ value: nextInputValue, index: null, selected: suggestion }); - this.props.onChange(nextInputValue, nextInputValue.length); - }; - - onClickOutside = () => { - if (this.state.isSuggestionsVisible) { - this.setState({ isSuggestionsVisible: false }); - this.onSubmit(); - } - }; - - onChangeInputValue = (event) => { - const { value, selectionStart } = event.target; - const hasValue = Boolean(value.trim()); - this.setState({ - value, - inputIsPristine: false, - isSuggestionsVisible: hasValue, - index: null, - }); - - if (!hasValue) { - this.props.onSubmit(value); - } - this.props.onChange(value, selectionStart); - }; - - onClickInput = (event) => { - const { selectionStart } = event.target; - this.props.onChange(this.state.value, selectionStart); - }; - - onClickSuggestion = (suggestion) => { - this.selectSuggestion(suggestion); - this.inputRef.focus(); - }; - - onMouseEnterSuggestion = (index) => { - this.setState({ index }); - }; - - onSubmit = () => { - const { value, lastSubmitted, selected } = this.state; - - if ( - lastSubmitted !== value && - selected && - (selected.type === 'value' || selected.text.trim() === ': *') - ) { - this.props.onSubmit(value); - this.setState({ lastSubmitted: value, selected: null }); - } - }; - - onFocus = () => { - this.setState({ isSuggestionsVisible: true }); - }; - - render() { - return ( - -
      - { - if (node) { - this.inputRef = node; - } - }} - disabled={this.props.disabled} - value={this.state.value} - onKeyDown={this.onKeyDown} - onKeyUp={this.onKeyUp} - onFocus={this.onFocus} - onChange={this.onChangeInputValue} - onClick={this.onClickInput} - autoComplete="off" - spellCheck={false} - /> - - {this.props.isLoading && ( - - )} -
      - - -
      - ); - } -} - -Typeahead.propTypes = { - initialValue: PropTypes.string, - isLoading: PropTypes.bool, - disabled: PropTypes.bool, - onChange: PropTypes.func.isRequired, - onSubmit: PropTypes.func.isRequired, - loadMore: PropTypes.func.isRequired, - suggestions: PropTypes.array.isRequired, - queryExample: PropTypes.string.isRequired, -}; - -Typeahead.defaultProps = { - isLoading: false, - disabled: false, - suggestions: [], -}; diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.ts b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.ts new file mode 100644 index 0000000000000..6bf1226131e29 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { Typeahead } from './typehead'; diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.js b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.js deleted file mode 100644 index 615a444d23e73..0000000000000 --- a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.js +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { EuiIcon } from '@elastic/eui'; -import { - fontFamilyCode, - px, - units, - fontSizes, - unit, - // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../../../../apm/public/style/variables'; -import { tint } from 'polished'; -import theme from '@elastic/eui/dist/eui_theme_light.json'; - -function getIconColor(type) { - switch (type) { - case 'field': - return theme.euiColorVis7; - case 'value': - return theme.euiColorVis0; - case 'operator': - return theme.euiColorVis1; - case 'conjunction': - return theme.euiColorVis3; - case 'recentSearch': - return theme.euiColorMediumShade; - } -} - -const Description = styled.div` - color: ${theme.euiColorDarkShade}; - - p { - display: inline; - - span { - font-family: ${fontFamilyCode}; - color: ${theme.euiColorFullShade}; - padding: 0 ${px(units.quarter)}; - display: inline-block; - } - } -`; - -const ListItem = styled.button` - width: inherit; - font-size: ${fontSizes.small}; - height: ${px(units.double)}; - align-items: center; - display: flex; - background: ${(props) => (props.selected ? theme.euiColorLightestShade : 'initial')}; - cursor: pointer; - border-radius: ${px(units.quarter)}; - - ${Description} { - p span { - background: ${(props) => - props.selected ? theme.euiColorEmptyShade : theme.euiColorLightestShade}; - } - @media only screen and (max-width: ${theme.euiBreakpoints.s}) { - margin-left: auto; - text-align: end; - } - } -`; - -const Icon = styled.div` - flex: 0 0 ${px(units.double)}; - background: ${(props) => tint(0.1, getIconColor(props.type))}; - color: ${(props) => getIconColor(props.type)}; - width: 100%; - height: 100%; - text-align: center; - line-height: ${px(units.double)}; -`; - -const TextValue = styled.div` - text-align: left; - flex: 0 0 ${px(unit * 12)}; - color: ${theme.euiColorDarkestShade}; - padding: 0 ${px(units.half)}; - - @media only screen and (max-width: ${theme.euiBreakpoints.s}) { - flex: 0 0 ${px(unit * 8)}; - } - @media only screen and (min-width: 1300px) { - flex: 0 0 ${px(unit * 16)}; - } -`; - -function getEuiIconType(type) { - switch (type) { - case 'field': - return 'kqlField'; - case 'value': - return 'kqlValue'; - case 'recentSearch': - return 'search'; - case 'conjunction': - return 'kqlSelector'; - case 'operator': - return 'kqlOperand'; - default: - throw new Error('Unknown type', type); - } -} - -function Suggestion(props) { - return ( - props.onClick(props.suggestion)} - onMouseEnter={props.onMouseEnter} - > - - - - {props.suggestion.text} - {props.suggestion.description} - - ); -} - -Suggestion.propTypes = { - onClick: PropTypes.func.isRequired, - onMouseEnter: PropTypes.func.isRequired, - selected: PropTypes.bool, - suggestion: PropTypes.object.isRequired, - innerRef: PropTypes.func.isRequired, -}; - -export default Suggestion; diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.tsx b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.tsx new file mode 100644 index 0000000000000..1dc89d2795309 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.tsx @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useRef, useEffect, RefObject } from 'react'; +import styled from 'styled-components'; +import { EuiSuggestItem } from '@elastic/eui'; +import theme from '@elastic/eui/dist/eui_theme_light.json'; + +import { QuerySuggestion } from '../../../../../../../../src/plugins/data/public'; + +const SuggestionItem = styled.div<{ selected: boolean }>` + background: ${(props) => (props.selected ? theme.euiColorLightestShade : 'initial')}; +`; + +function getIconColor(type: string) { + switch (type) { + case 'field': + return 'tint5'; + case 'value': + return 'tint0'; + case 'operator': + return 'tint1'; + case 'conjunction': + return 'tint3'; + case 'recentSearch': + return 'tint10'; + default: + return 'tint5'; + } +} + +function getEuiIconType(type: string) { + switch (type) { + case 'field': + return 'kqlField'; + case 'value': + return 'kqlValue'; + case 'recentSearch': + return 'search'; + case 'conjunction': + return 'kqlSelector'; + case 'operator': + return 'kqlOperand'; + default: + throw new Error(`Unknown type ${type}`); + } +} + +interface SuggestionProps { + onClick: (sug: QuerySuggestion) => void; + onMouseEnter: () => void; + selected: boolean; + suggestion: QuerySuggestion; + innerRef: (node: any) => void; +} + +export const Suggestion: React.FC = ({ + innerRef, + selected, + suggestion, + onClick, + onMouseEnter, +}) => { + const childNode: RefObject = useRef(null); + + useEffect(() => { + if (childNode.current) { + innerRef(childNode.current); + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [childNode]); + + return ( + + onClick(suggestion)} + onMouseEnter={onMouseEnter} + // @ts-ignore + description={suggestion.description} + /> + + ); +}; diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.js b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.js deleted file mode 100644 index 8d614d7ea1aec..0000000000000 --- a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.js +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import styled from 'styled-components'; -import { isEmpty } from 'lodash'; -import Suggestion from './suggestion'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { units, px, unit } from '../../../../../../apm/public/style/variables'; -import { tint } from 'polished'; -import theme from '@elastic/eui/dist/eui_theme_light.json'; - -const List = styled.ul` - width: 100%; - border: 1px solid ${theme.euiColorLightShade}; - border-radius: ${px(units.quarter)}; - box-shadow: 0px ${px(units.quarter)} ${px(units.double)} ${tint(0.1, theme.euiColorFullShade)}; - position: absolute; - background: #fff; - z-index: 10; - left: 0; - max-height: ${px(unit * 20)}; - overflow: scroll; -`; - -class Suggestions extends Component { - childNodes = []; - - scrollIntoView = () => { - const parent = this.parentNode; - const child = this.childNodes[this.props.index]; - - if (this.props.index == null || !parent || !child) { - return; - } - - const scrollTop = Math.max( - Math.min(parent.scrollTop, child.offsetTop), - child.offsetTop + child.offsetHeight - parent.offsetHeight - ); - - parent.scrollTop = scrollTop; - }; - - handleScroll = () => { - const parent = this.parentNode; - - if (!this.props.loadMore || !parent) { - return; - } - - const position = parent.scrollTop + parent.offsetHeight; - const height = parent.scrollHeight; - const remaining = height - position; - const margin = 50; - - if (!height || !position) { - return; - } - if (remaining <= margin) { - this.props.loadMore(); - } - }; - - componentDidUpdate(prevProps) { - if (prevProps.index !== this.props.index) { - this.scrollIntoView(); - } - } - - render() { - if (!this.props.show || isEmpty(this.props.suggestions)) { - return null; - } - - const suggestions = this.props.suggestions.map((suggestion, index) => { - const key = suggestion + '_' + index; - return ( - (this.childNodes[index] = node)} - selected={index === this.props.index} - suggestion={suggestion} - onClick={this.props.onClick} - onMouseEnter={() => this.props.onMouseEnter(index)} - key={key} - /> - ); - }); - - return ( - (this.parentNode = node)} onScroll={this.handleScroll}> - {suggestions} - - ); - } -} - -Suggestions.propTypes = { - index: PropTypes.number, - onClick: PropTypes.func.isRequired, - onMouseEnter: PropTypes.func.isRequired, - show: PropTypes.bool, - suggestions: PropTypes.array.isRequired, - loadMore: PropTypes.func.isRequired, -}; - -export default Suggestions; diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.tsx b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.tsx new file mode 100644 index 0000000000000..dcd8df1ba18ef --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.tsx @@ -0,0 +1,116 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useRef, useState, useEffect } from 'react'; +import styled from 'styled-components'; +import { isEmpty } from 'lodash'; +import { tint } from 'polished'; +import theme from '@elastic/eui/dist/eui_theme_light.json'; +import { Suggestion } from './suggestion'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { units, px, unit } from '../../../../../../apm/public/style/variables'; +import { QuerySuggestion } from '../../../../../../../../src/plugins/data/public'; + +const List = styled.ul` + width: 100%; + border: 1px solid ${theme.euiColorLightShade}; + border-radius: ${px(units.quarter)}; + box-shadow: 0px ${px(units.quarter)} ${px(units.double)} ${tint(0.1, theme.euiColorFullShade)}; + background: #fff; + z-index: 10; + max-height: ${px(unit * 20)}; + overflow: scroll; + position: absolute; +`; + +interface SuggestionsProps { + index: number; + onClick: (sug: QuerySuggestion) => void; + onMouseEnter: (index: number) => void; + show?: boolean; + suggestions: QuerySuggestion[]; + loadMore: () => void; +} + +export const Suggestions: React.FC = ({ + show, + index, + onClick, + suggestions, + onMouseEnter, + loadMore, +}) => { + const [childNodes, setChildNodes] = useState([]); + + const parentNode = useRef(null); + + useEffect(() => { + const scrollIntoView = () => { + const parent = parentNode.current; + const child = childNodes[index]; + + if (index == null || !parent || !child) { + return; + } + + const scrollTop = Math.max( + Math.min(parent.scrollTop, child.offsetTop), + child.offsetTop + child.offsetHeight - parent.offsetHeight + ); + + parent.scrollTop = scrollTop; + }; + scrollIntoView(); + }, [index, childNodes]); + + if (!show || isEmpty(suggestions)) { + return null; + } + + const handleScroll = () => { + const parent = parentNode.current; + + if (!loadMore || !parent) { + return; + } + + const position = parent.scrollTop + parent.offsetHeight; + const height = parent.scrollHeight; + const remaining = height - position; + const margin = 50; + + if (!height || !position) { + return; + } + if (remaining <= margin) { + loadMore(); + } + }; + + const suggestionsNodes = suggestions.map((suggestion, currIndex) => { + const key = suggestion + '_' + currIndex; + return ( + { + const nodes = childNodes; + nodes[currIndex] = node; + setChildNodes([...nodes]); + }} + selected={currIndex === index} + suggestion={suggestion} + onClick={onClick} + onMouseEnter={() => onMouseEnter(currIndex)} + key={key} + /> + ); + }); + + return ( + + {suggestionsNodes} + + ); +}; diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/typehead.tsx b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/typehead.tsx new file mode 100644 index 0000000000000..5582818b6f09b --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/typehead.tsx @@ -0,0 +1,318 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { KeyboardEvent, ChangeEvent, MouseEvent, useState, useRef, useEffect } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiFieldSearch, EuiProgress, EuiOutsideClickDetector } from '@elastic/eui'; +import { Suggestions } from './suggestions'; +import { QuerySuggestion } from '../../../../../../../../src/plugins/data/public'; + +const KEY_CODES = { + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + ENTER: 13, + ESC: 27, + TAB: 9, +}; + +interface TypeaheadState { + isSuggestionsVisible: boolean; + index: number | null; + value: string; + inputIsPristine: boolean; + lastSubmitted: string; + selected: QuerySuggestion | null; +} + +interface TypeaheadProps { + onChange: (inputValue: string, selectionStart: number | null) => void; + onSubmit: (inputValue: string) => void; + suggestions: QuerySuggestion[]; + queryExample: string; + initialValue?: string; + isLoading?: boolean; + disabled?: boolean; + dataTestSubj: string; + ariaLabel: string; + loadMore: () => void; +} + +export const Typeahead: React.FC = ({ + initialValue, + suggestions, + onChange, + onSubmit, + dataTestSubj, + ariaLabel, + disabled, + isLoading, + loadMore, +}) => { + const [state, setState] = useState({ + isSuggestionsVisible: false, + index: null, + value: '', + inputIsPristine: true, + lastSubmitted: '', + selected: null, + }); + + const inputRef = useRef(); + + useEffect(() => { + if (state.inputIsPristine && initialValue) { + setState((prevState) => ({ + ...prevState, + value: initialValue, + })); + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [initialValue]); + + const incrementIndex = (currentIndex: number) => { + let nextIndex = currentIndex + 1; + if (currentIndex === null || nextIndex >= suggestions.length) { + nextIndex = 0; + } + + setState((prevState) => ({ + ...prevState, + index: nextIndex, + })); + }; + + const decrementIndex = (currentIndex: number) => { + let previousIndex: number | null = currentIndex - 1; + if (previousIndex < 0) { + previousIndex = null; + } + + setState((prevState) => ({ + ...prevState, + index: previousIndex, + })); + }; + + const onKeyUp = (event: KeyboardEvent & ChangeEvent) => { + const { selectionStart } = event.target; + const { value } = state; + switch (event.keyCode) { + case KEY_CODES.LEFT: + setState((prevState) => ({ + ...prevState, + isSuggestionsVisible: true, + })); + onChange(value, selectionStart); + break; + case KEY_CODES.RIGHT: + setState((prevState) => ({ + ...prevState, + isSuggestionsVisible: true, + })); + onChange(value, selectionStart); + break; + } + }; + + const onKeyDown = (event: KeyboardEvent) => { + const { isSuggestionsVisible, index, value } = state; + switch (event.keyCode) { + case KEY_CODES.DOWN: + event.preventDefault(); + if (isSuggestionsVisible) { + incrementIndex(index!); + } else { + setState((prevState) => ({ + ...prevState, + isSuggestionsVisible: true, + index: 0, + })); + } + break; + case KEY_CODES.UP: + event.preventDefault(); + if (isSuggestionsVisible) { + decrementIndex(index!); + } + break; + case KEY_CODES.ENTER: + event.preventDefault(); + if (isSuggestionsVisible && suggestions[index!]) { + selectSuggestion(suggestions[index!]); + } else { + setState((prevState) => ({ + ...prevState, + isSuggestionsVisible: false, + })); + + onSubmit(value); + } + break; + case KEY_CODES.ESC: + event.preventDefault(); + + setState((prevState) => ({ + ...prevState, + isSuggestionsVisible: false, + })); + + break; + case KEY_CODES.TAB: + setState((prevState) => ({ + ...prevState, + isSuggestionsVisible: false, + })); + break; + } + }; + + const selectSuggestion = (suggestion: QuerySuggestion) => { + const nextInputValue = + state.value.substr(0, suggestion.start) + + suggestion.text + + state.value.substr(suggestion.end); + + setState((prevState) => ({ + ...prevState, + value: nextInputValue, + index: null, + selected: suggestion, + })); + + onChange(nextInputValue, nextInputValue.length); + }; + + const onClickOutside = () => { + if (state.isSuggestionsVisible) { + setState((prevState) => ({ + ...prevState, + isSuggestionsVisible: false, + })); + + onSuggestionSubmit(); + } + }; + + const onChangeInputValue = (event: ChangeEvent) => { + const { value, selectionStart } = event.target; + const hasValue = Boolean(value.trim()); + + setState((prevState) => ({ + ...prevState, + value, + inputIsPristine: false, + isSuggestionsVisible: hasValue, + index: null, + })); + + if (!hasValue) { + onSubmit(value); + } + onChange(value, selectionStart!); + }; + + const onClickInput = (event: MouseEvent & ChangeEvent) => { + event.stopPropagation(); + const { selectionStart } = event.target; + onChange(state.value, selectionStart!); + }; + + const onFocus = () => { + setState((prevState) => ({ + ...prevState, + isSuggestionsVisible: true, + })); + }; + + const onClickSuggestion = (suggestion: QuerySuggestion) => { + selectSuggestion(suggestion); + if (inputRef.current) inputRef.current.focus(); + }; + + const onMouseEnterSuggestion = (index: number) => { + setState({ ...state, index }); + + setState((prevState) => ({ + ...prevState, + index, + })); + }; + + const onSuggestionSubmit = () => { + const { value, lastSubmitted, selected } = state; + + if ( + lastSubmitted !== value && + selected && + (selected.type === 'value' || selected.text.trim() === ': *') + ) { + onSubmit(value); + + setState((prevState) => ({ + ...prevState, + lastSubmitted: value, + selected: null, + })); + } + }; + + return ( + + +
      + { + if (node) { + inputRef.current = node; + } + }} + disabled={disabled} + value={state.value} + onKeyDown={onKeyDown} + onKeyUp={onKeyUp} + onFocus={onFocus} + onChange={onChangeInputValue} + onClick={onClickInput} + autoComplete="off" + spellCheck={false} + /> + + {isLoading && ( + + )} +
      + + +
      +
      + ); +}; diff --git a/x-pack/plugins/uptime/public/pages/overview.tsx b/x-pack/plugins/uptime/public/pages/overview.tsx index 32c86435913f7..3b58ea1e5cf84 100644 --- a/x-pack/plugins/uptime/public/pages/overview.tsx +++ b/x-pack/plugins/uptime/public/pages/overview.tsx @@ -18,7 +18,6 @@ import { useTrackPageview } from '../../../observability/public'; import { MonitorList } from '../components/overview/monitor_list/monitor_list_container'; import { EmptyState, FilterGroup, KueryBar, ParsingErrorCallout } from '../components/overview'; import { StatusPanel } from '../components/overview/status_panel'; -import { useKibana } from '../../../../../src/plugins/kibana_react/public'; interface Props { loading: boolean; @@ -43,12 +42,6 @@ export const OverviewPageComponent = React.memo( const { absoluteDateRangeStart, absoluteDateRangeEnd, ...params } = useGetUrlParams(); const { search, filters: urlFilters } = params; - const { - services: { - data: { autocomplete }, - }, - } = useKibana(); - useTrackPageview({ app: 'uptime', path: 'overview' }); useTrackPageview({ app: 'uptime', path: 'overview', delay: 15000 }); @@ -77,7 +70,6 @@ export const OverviewPageComponent = React.memo( aria-label={i18n.translate('xpack.uptime.filterBar.ariaLabel', { defaultMessage: 'Input filter criteria for the overview page', })} - autocomplete={autocomplete} data-test-subj="xpack.uptime.filterBar" />
      From 7a10077776a729a1f7dc674c04e73b757a1dd2f4 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Tue, 28 Jul 2020 12:53:36 +0100 Subject: [PATCH 052/126] [Security Solution] Template unit tests (#72399) * add unit test for failure cases * add unit tests * update wording * fix error when update template without ttid or ttversion * fix unit test * add comment * review Co-authored-by: Elastic Machine --- .../rules/pre_packaged_rules/translations.ts | 2 +- .../update_callout.test.tsx | 92 +++ .../pre_packaged_rules/update_callout.tsx | 9 +- .../rules/use_pre_packaged_rules.tsx | 4 +- .../detection_engine/rules/helpers.test.tsx | 136 +++++ ...get_prepackaged_rules_status_route.test.ts | 51 ++ .../routes/import_timelines_route.test.ts | 22 + .../routes/utils/compare_timelines_status.ts | 40 +- .../routes/utils/failure_cases.test.ts | 542 ++++++++++++++++++ .../timeline/routes/utils/failure_cases.ts | 17 +- 10 files changed, 888 insertions(+), 27 deletions(-) create mode 100644 x-pack/plugins/security_solution/server/lib/timeline/routes/utils/failure_cases.test.ts diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/translations.ts b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/translations.ts index 37c1715c05d71..49da7dbf6d514 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/translations.ts @@ -24,7 +24,7 @@ export const PRE_BUILT_MSG = i18n.translate( export const PRE_BUILT_ACTION = i18n.translate( 'xpack.securitySolution.detectionEngine.rules.prePackagedRules.loadPreBuiltButton', { - defaultMessage: 'Load prebuilt detection rules', + defaultMessage: 'Load prebuilt detection rules and timeline templates', } ); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/update_callout.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/update_callout.test.tsx index 5033fcd11dc7c..283bba462792c 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/update_callout.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/update_callout.test.tsx @@ -9,6 +9,7 @@ import { shallow } from 'enzyme'; import { UpdatePrePackagedRulesCallOut } from './update_callout'; import { useKibana } from '../../../../common/lib/kibana'; + jest.mock('../../../../common/lib/kibana'); describe('UpdatePrePackagedRulesCallOut', () => { @@ -22,6 +23,7 @@ describe('UpdatePrePackagedRulesCallOut', () => { }, }); }); + it('renders correctly', () => { const wrapper = shallow( { expect(wrapper.find('EuiCallOut')).toHaveLength(1); }); + + it('renders callOutMessage correctly: numberOfUpdatedRules > 0 and numberOfUpdatedTimelines = 0', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('[data-test-subj="update-callout"]').find('p').text()).toEqual( + 'You can update 1 Elastic prebuilt ruleRelease notes' + ); + }); + + it('renders buttonTitle correctly: numberOfUpdatedRules > 0 and numberOfUpdatedTimelines = 0', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('[data-test-subj="update-callout-button"]').prop('children')).toEqual( + 'Update 1 Elastic prebuilt rule' + ); + }); + + it('renders callOutMessage correctly: numberOfUpdatedRules = 0 and numberOfUpdatedTimelines > 0', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('[data-test-subj="update-callout"]').find('p').text()).toEqual( + 'You can update 1 Elastic prebuilt timelineRelease notes' + ); + }); + + it('renders buttonTitle correctly: numberOfUpdatedRules = 0 and numberOfUpdatedTimelines > 0', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('[data-test-subj="update-callout-button"]').prop('children')).toEqual( + 'Update 1 Elastic prebuilt timeline' + ); + }); + + it('renders callOutMessage correctly: numberOfUpdatedRules > 0 and numberOfUpdatedTimelines > 0', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('[data-test-subj="update-callout"]').find('p').text()).toEqual( + 'You can update 1 Elastic prebuilt rule and 1 Elastic prebuilt timeline. Note that this will reload deleted Elastic prebuilt rules.Release notes' + ); + }); + + it('renders buttonTitle correctly: numberOfUpdatedRules > 0 and numberOfUpdatedTimelines > 0', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find('[data-test-subj="update-callout-button"]').prop('children')).toEqual( + 'Update 1 Elastic prebuilt rule and 1 Elastic prebuilt timeline' + ); + }); }); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/update_callout.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/update_callout.tsx index 4b454a9ed4d4a..30f8cfa7fb3a5 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/update_callout.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/update_callout.tsx @@ -51,7 +51,7 @@ const UpdatePrePackagedRulesCallOutComponent: React.FC +

      {prepackagedRulesOrTimelines?.callOutMessage}
      @@ -62,7 +62,12 @@ const UpdatePrePackagedRulesCallOutComponent: React.FC

      - + {prepackagedRulesOrTimelines?.buttonTitle}
      diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_pre_packaged_rules.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_pre_packaged_rules.tsx index 08c85695e9313..d82d97883a3d0 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_pre_packaged_rules.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_pre_packaged_rules.tsx @@ -169,7 +169,9 @@ export const usePrePackagedRules = ({ if ( isSubscribed && ((prePackagedRuleStatusResponse.rules_not_installed === 0 && - prePackagedRuleStatusResponse.rules_not_updated === 0) || + prePackagedRuleStatusResponse.rules_not_updated === 0 && + prePackagedRuleStatusResponse.timelines_not_installed === 0 && + prePackagedRuleStatusResponse.timelines_not_updated === 0) || iterationTryOfFetchingPrePackagedCount > 100) ) { setLoadingCreatePrePackagedRules(false); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx index c01317e4f48c5..b40243efcfb46 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx @@ -13,6 +13,8 @@ import { getActionsStepsData, getHumanizedDuration, getModifiedAboutDetailsData, + getPrePackagedRuleStatus, + getPrePackagedTimelineStatus, determineDetailsValue, userHasNoPermissions, } from './helpers'; @@ -394,4 +396,138 @@ describe('rule helpers', () => { expect(result).toEqual(userHasNoPermissionsExpectedResult); }); }); + + describe('getPrePackagedRuleStatus', () => { + test('ruleNotInstalled', () => { + const rulesInstalled = 0; + const rulesNotInstalled = 1; + const rulesNotUpdated = 0; + const result: string = getPrePackagedRuleStatus( + rulesInstalled, + rulesNotInstalled, + rulesNotUpdated + ); + + expect(result).toEqual('ruleNotInstalled'); + }); + + test('ruleInstalled', () => { + const rulesInstalled = 1; + const rulesNotInstalled = 0; + const rulesNotUpdated = 0; + const result: string = getPrePackagedRuleStatus( + rulesInstalled, + rulesNotInstalled, + rulesNotUpdated + ); + + expect(result).toEqual('ruleInstalled'); + }); + + test('someRuleUninstall', () => { + const rulesInstalled = 1; + const rulesNotInstalled = 1; + const rulesNotUpdated = 0; + const result: string = getPrePackagedRuleStatus( + rulesInstalled, + rulesNotInstalled, + rulesNotUpdated + ); + + expect(result).toEqual('someRuleUninstall'); + }); + + test('ruleNeedUpdate', () => { + const rulesInstalled = 1; + const rulesNotInstalled = 0; + const rulesNotUpdated = 1; + const result: string = getPrePackagedRuleStatus( + rulesInstalled, + rulesNotInstalled, + rulesNotUpdated + ); + + expect(result).toEqual('ruleNeedUpdate'); + }); + + test('unknown', () => { + const rulesInstalled = null; + const rulesNotInstalled = null; + const rulesNotUpdated = null; + const result: string = getPrePackagedRuleStatus( + rulesInstalled, + rulesNotInstalled, + rulesNotUpdated + ); + + expect(result).toEqual('unknown'); + }); + }); + + describe('getPrePackagedTimelineStatus', () => { + test('timelinesNotInstalled', () => { + const timelinesInstalled = 0; + const timelinesNotInstalled = 1; + const timelinesNotUpdated = 0; + const result: string = getPrePackagedTimelineStatus( + timelinesInstalled, + timelinesNotInstalled, + timelinesNotUpdated + ); + + expect(result).toEqual('timelinesNotInstalled'); + }); + + test('timelinesInstalled', () => { + const timelinesInstalled = 1; + const timelinesNotInstalled = 0; + const timelinesNotUpdated = 0; + const result: string = getPrePackagedTimelineStatus( + timelinesInstalled, + timelinesNotInstalled, + timelinesNotUpdated + ); + + expect(result).toEqual('timelinesInstalled'); + }); + + test('someTimelineUninstall', () => { + const timelinesInstalled = 1; + const timelinesNotInstalled = 1; + const timelinesNotUpdated = 0; + const result: string = getPrePackagedTimelineStatus( + timelinesInstalled, + timelinesNotInstalled, + timelinesNotUpdated + ); + + expect(result).toEqual('someTimelineUninstall'); + }); + + test('timelineNeedUpdate', () => { + const timelinesInstalled = 1; + const timelinesNotInstalled = 0; + const timelinesNotUpdated = 1; + const result: string = getPrePackagedTimelineStatus( + timelinesInstalled, + timelinesNotInstalled, + timelinesNotUpdated + ); + + expect(result).toEqual('timelineNeedUpdate'); + }); + + test('unknown', () => { + const timelinesInstalled = null; + const timelinesNotInstalled = null; + const timelinesNotUpdated = null; + const result: string = getPrePackagedTimelineStatus( + timelinesInstalled, + timelinesNotInstalled, + timelinesNotUpdated + ); + + expect(result).toEqual('unknown'); + }); + }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.test.ts index f8b6f7e3ddcba..fa2a575d3f69f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/get_prepackaged_rules_status_route.test.ts @@ -14,6 +14,11 @@ import { } from '../__mocks__/request_responses'; import { requestContextMock, serverMock, createMockConfig } from '../__mocks__'; import { SecurityPluginSetup } from '../../../../../../security/server'; +import { checkTimelinesStatus } from '../../../timeline/routes/utils/check_timelines_status'; +import { + mockCheckTimelinesStatusBeforeInstallResult, + mockCheckTimelinesStatusAfterInstallResult, +} from '../../../timeline/routes/__mocks__/import_timelines'; jest.mock('../../rules/get_prepackaged_rules', () => { return { @@ -38,6 +43,12 @@ jest.mock('../../rules/get_prepackaged_rules', () => { }; }); +jest.mock('../../../timeline/routes/utils/check_timelines_status', () => { + return { + checkTimelinesStatus: jest.fn(), + }; +}); + describe('get_prepackaged_rule_status_route', () => { const mockGetCurrentUser = { user: { @@ -126,5 +137,45 @@ describe('get_prepackaged_rule_status_route', () => { timelines_not_updated: 0, }); }); + + test('0 timelines installed, 3 timelines not installed, 0 timelines not updated', async () => { + clients.alertsClient.find.mockResolvedValue(getEmptyFindResult()); + (checkTimelinesStatus as jest.Mock).mockResolvedValue( + mockCheckTimelinesStatusBeforeInstallResult + ); + const request = getPrepackagedRulesStatusRequest(); + const response = await server.inject(request, context); + + expect(response.status).toEqual(200); + expect(response.body).toEqual({ + rules_custom_installed: 0, + rules_installed: 0, + rules_not_installed: 1, + rules_not_updated: 0, + timelines_installed: 0, + timelines_not_installed: 3, + timelines_not_updated: 0, + }); + }); + + test('3 timelines installed, 0 timelines not installed, 0 timelines not updated', async () => { + clients.alertsClient.find.mockResolvedValue(getEmptyFindResult()); + (checkTimelinesStatus as jest.Mock).mockResolvedValue( + mockCheckTimelinesStatusAfterInstallResult + ); + const request = getPrepackagedRulesStatusRequest(); + const response = await server.inject(request, context); + + expect(response.status).toEqual(200); + expect(response.body).toEqual({ + rules_custom_installed: 0, + rules_installed: 0, + rules_not_installed: 1, + rules_not_updated: 0, + timelines_installed: 3, + timelines_not_installed: 0, + timelines_not_updated: 0, + }); + }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/import_timelines_route.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/import_timelines_route.test.ts index fe5993cb0161d..b817896e901c1 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/import_timelines_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/import_timelines_route.test.ts @@ -598,6 +598,28 @@ describe('import timeline templates', () => { mockNewTemplateTimelineId ); }); + + test('should return 200 if create via import without a templateTimelineId or templateTimelineVersion', async () => { + mockGetTupleDuplicateErrorsAndUniqueTimeline.mockReturnValue([ + mockDuplicateIdErrors, + [ + { + ...mockUniqueParsedTemplateTimelineObjects[0], + templateTimelineId: null, + templateTimelineVersion: null, + }, + ], + ]); + const mockRequest = getImportTimelinesRequest(); + const result = await server.inject(mockRequest, context); + expect(result.body).toEqual({ + errors: [], + success: true, + success_count: 1, + timelines_installed: 1, + timelines_updated: 0, + }); + }); }); describe('Import a timeline template already exist', () => { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/compare_timelines_status.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/compare_timelines_status.ts index d61d217a4cf49..f9515741d1250 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/compare_timelines_status.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/compare_timelines_status.ts @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { isEmpty } from 'lodash/fp'; +import { isEmpty, isInteger } from 'lodash/fp'; import { TimelineTypeLiteralWithNull, TimelineType, @@ -71,13 +71,28 @@ export class CompareTimelinesStatus { } public get isCreatable() { + const noExistingTimeline = this.timelineObject.isCreatable && !this.isHandlingTemplateTimeline; + + const templateCreatable = + this.isHandlingTemplateTimeline && this.templateTimelineObject.isCreatable; + + const noExistingTimelineOrTemplate = templateCreatable && this.timelineObject.isCreatable; + + // From Line 87-91 is the condition for creating a template via import without given a templateTimelineId or templateTimelineVersion, + // but keep the existing savedObjectId and version there. + // Therefore even the timeline exists, we still allow it to create a new timeline template by assigning a templateTimelineId and templateTimelineVersion. + // https://github.com/elastic/kibana/pull/67496#discussion_r454337222 + // Line 90-91 means that we want to make sure the existing timeline retrieved by savedObjectId is atemplate. + // If it is not a template, we show an error this timeline is already exist instead. + const retriveTemplateViaSavedObjectId = + templateCreatable && + !this.timelineObject.isCreatable && + this.timelineObject.getData?.timelineType === this.timelineType; + return ( this.isTitleValid && !this.isSavedObjectVersionConflict && - ((this.timelineObject.isCreatable && !this.isHandlingTemplateTimeline) || - (this.templateTimelineObject.isCreatable && - this.timelineObject.isCreatable && - this.isHandlingTemplateTimeline)) + (noExistingTimeline || noExistingTimelineOrTemplate || retriveTemplateViaSavedObjectId) ); } @@ -195,24 +210,27 @@ export class CompareTimelinesStatus { } private get isTemplateVersionConflict() { - const version = this.templateTimelineObject?.getVersion; + const templateTimelineVersion = this.templateTimelineObject?.getVersion; const existingTemplateTimelineVersion = this.templateTimelineObject?.data ?.templateTimelineVersion; if ( - version != null && + templateTimelineVersion != null && this.templateTimelineObject.isExists && existingTemplateTimelineVersion != null ) { - return version <= existingTemplateTimelineVersion; - } else if (this.templateTimelineObject.isExists && version == null) { + return templateTimelineVersion <= existingTemplateTimelineVersion; + } else if (this.templateTimelineObject.isExists && templateTimelineVersion == null) { return true; } return false; } private get isTemplateVersionValid() { - const version = this.templateTimelineObject?.getVersion; - return typeof version === 'number' && !this.isTemplateVersionConflict; + const templateTimelineVersion = this.templateTimelineObject?.getVersion; + return ( + templateTimelineVersion == null || + (isInteger(templateTimelineVersion) && !this.isTemplateVersionConflict) + ); } private get isUpdatedTimelineStatusValid() { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/failure_cases.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/failure_cases.test.ts new file mode 100644 index 0000000000000..3c3ad1cf2d7f8 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/failure_cases.test.ts @@ -0,0 +1,542 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + commonFailureChecker, + checkIsCreateFailureCases, + checkIsUpdateFailureCases, + checkIsCreateViaImportFailureCases, + EMPTY_TITLE_ERROR_MESSAGE, + UPDATE_STATUS_ERROR_MESSAGE, + CREATE_TIMELINE_ERROR_MESSAGE, + CREATE_TEMPLATE_TIMELINE_ERROR_MESSAGE, + CREATE_TEMPLATE_TIMELINE_WITHOUT_VERSION_ERROR_MESSAGE, + NO_MATCH_ID_ERROR_MESSAGE, + NO_MATCH_VERSION_ERROR_MESSAGE, + NOT_ALLOW_UPDATE_TIMELINE_TYPE_ERROR_MESSAGE, + UPDATE_TEMPLATE_TIMELINE_ERROR_MESSAGE, + CREATE_WITH_INVALID_STATUS_ERROR_MESSAGE, + getImportExistingTimelineError, + checkIsUpdateViaImportFailureCases, + NOT_ALLOW_UPDATE_STATUS_ERROR_MESSAGE, + TEMPLATE_TIMELINE_VERSION_CONFLICT_MESSAGE, +} from './failure_cases'; +import { + TimelineStatus, + TimelineType, + TimelineSavedObject, +} from '../../../../../common/types/timeline'; +import { mockGetTimelineValue, mockGetTemplateTimelineValue } from '../__mocks__/import_timelines'; + +describe('failure cases', () => { + describe('commonFailureChecker', () => { + test('If timeline type is draft, it should not return error if title is not given', () => { + const result = commonFailureChecker(TimelineStatus.draft, null); + + expect(result).toBeNull(); + }); + + test('If timeline type is active, it should return error if title is not given', () => { + const result = commonFailureChecker(TimelineStatus.active, null); + + expect(result).toEqual({ + body: EMPTY_TITLE_ERROR_MESSAGE, + statusCode: 405, + }); + }); + + test('If timeline type is immutable, it should return error if title is not given', () => { + const result = commonFailureChecker(TimelineStatus.immutable, null); + + expect(result).toEqual({ + body: EMPTY_TITLE_ERROR_MESSAGE, + statusCode: 405, + }); + }); + + test('If timeline type is not a draft, it should return no error if title is given', () => { + const result = commonFailureChecker(TimelineStatus.active, 'title'); + + expect(result).toBeNull(); + }); + }); + + describe('checkIsCreateFailureCases', () => { + test('Should return error if trying to create a timeline that is already exist', () => { + const isHandlingTemplateTimeline = false; + const version = null; + const templateTimelineVersion = null; + const templateTimelineId = null; + const existTimeline = mockGetTimelineValue as TimelineSavedObject; + const existTemplateTimeline = null; + const result = checkIsCreateFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.default, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: CREATE_TIMELINE_ERROR_MESSAGE, + statusCode: 405, + }); + }); + + test('Should return error if trying to create a timeline template that is already exist', () => { + const isHandlingTemplateTimeline = true; + const version = null; + const templateTimelineVersion = 1; + const templateTimelineId = 'template-timeline-id-one'; + const existTimeline = null; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const result = checkIsCreateFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.template, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: CREATE_TEMPLATE_TIMELINE_ERROR_MESSAGE, + statusCode: 405, + }); + }); + + test('Should return error if trying to create a timeline template without providing templateTimelineVersion', () => { + const isHandlingTemplateTimeline = true; + const version = null; + const templateTimelineVersion = null; + const templateTimelineId = 'template-timeline-id-one'; + const existTimeline = null; + const existTemplateTimeline = null; + const result = checkIsCreateFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.template, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: CREATE_TEMPLATE_TIMELINE_WITHOUT_VERSION_ERROR_MESSAGE, + statusCode: 403, + }); + }); + }); + + describe('checkIsUpdateFailureCases', () => { + test('Should return error if trying to update status field of an existing immutable timeline', () => { + const isHandlingTemplateTimeline = false; + const version = mockGetTimelineValue.version; + const templateTimelineVersion = null; + const templateTimelineId = null; + const existTimeline = { + ...(mockGetTimelineValue as TimelineSavedObject), + status: TimelineStatus.immutable, + }; + const existTemplateTimeline = null; + const result = checkIsUpdateFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.default, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: UPDATE_STATUS_ERROR_MESSAGE, + statusCode: 403, + }); + }); + + test('Should return error if trying to update status field of an existing immutable timeline template', () => { + const isHandlingTemplateTimeline = true; + const version = mockGetTemplateTimelineValue.version; + const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; + const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; + const existTimeline = null; + const existTemplateTimeline = { + ...(mockGetTemplateTimelineValue as TimelineSavedObject), + status: TimelineStatus.immutable, + }; + const result = checkIsUpdateFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.template, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: UPDATE_STATUS_ERROR_MESSAGE, + statusCode: 403, + }); + }); + + test('should return error if trying to update timelineType field of an existing timeline template', () => { + const isHandlingTemplateTimeline = true; + const version = mockGetTemplateTimelineValue.version; + const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; + const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; + const existTimeline = null; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const result = checkIsUpdateFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.default, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: NOT_ALLOW_UPDATE_TIMELINE_TYPE_ERROR_MESSAGE, + statusCode: 403, + }); + }); + + test('should return error if trying to update a timeline template that does not exist', () => { + const isHandlingTemplateTimeline = true; + const version = mockGetTemplateTimelineValue.version; + const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; + const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; + const existTimeline = null; + const existTemplateTimeline = null; + const result = checkIsUpdateFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.default, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: UPDATE_TEMPLATE_TIMELINE_ERROR_MESSAGE, + statusCode: 405, + }); + }); + + test('should return error if there is no matched timeline found by given templateTimelineId', () => { + const isHandlingTemplateTimeline = true; + const version = mockGetTemplateTimelineValue.version; + const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; + const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; + const existTimeline = { + ...(mockGetTemplateTimelineValue as TimelineSavedObject), + savedObjectId: 'someOtherId', + }; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const result = checkIsUpdateFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.template, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: NO_MATCH_ID_ERROR_MESSAGE, + statusCode: 409, + }); + }); + + test('should return error if given version field is defferent from existing version of timelin template', () => { + const isHandlingTemplateTimeline = true; + const version = 'xxx'; + const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; + const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; + const existTimeline = null; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const result = checkIsUpdateFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.template, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: NO_MATCH_VERSION_ERROR_MESSAGE, + statusCode: 409, + }); + }); + }); + + describe('checkIsCreateViaImportFailureCases', () => { + test('should return error if trying to create a draft timeline', () => { + const isHandlingTemplateTimeline = true; + const version = mockGetTemplateTimelineValue.version; + const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; + const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; + const existTimeline = null; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const result = checkIsCreateViaImportFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.draft, + TimelineType.template, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: CREATE_WITH_INVALID_STATUS_ERROR_MESSAGE, + statusCode: 405, + }); + }); + + test('should return error if trying to create a timeline template which is already exist', () => { + const isHandlingTemplateTimeline = true; + const version = mockGetTemplateTimelineValue.version; + const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; + const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; + const existTimeline = null; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const result = checkIsCreateViaImportFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.template, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: getImportExistingTimelineError(mockGetTimelineValue.savedObjectId), + statusCode: 405, + }); + }); + + test('should return error if importe a timeline which is already exists', () => { + const isHandlingTemplateTimeline = false; + const version = mockGetTimelineValue.version; + const templateTimelineVersion = null; + const templateTimelineId = null; + const existTimeline = mockGetTimelineValue as TimelineSavedObject; + const existTemplateTimeline = null; + const result = checkIsCreateViaImportFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.default, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: getImportExistingTimelineError(mockGetTimelineValue.savedObjectId), + statusCode: 405, + }); + }); + }); + + describe('checkIsUpdateViaImportFailureCases', () => { + test('should return error if trying to update a timeline which does not exist', () => { + const isHandlingTemplateTimeline = false; + const version = mockGetTimelineValue.version; + const templateTimelineVersion = null; + const templateTimelineId = null; + const existTimeline = mockGetTimelineValue as TimelineSavedObject; + const existTemplateTimeline = null; + const result = checkIsUpdateViaImportFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.default, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: getImportExistingTimelineError(mockGetTimelineValue.savedObjectId), + statusCode: 405, + }); + }); + + test('should return error if trying to update timelineType field of an existing timeline template', () => { + const isHandlingTemplateTimeline = true; + const version = mockGetTemplateTimelineValue.version; + const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; + const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; + const existTimeline = null; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const result = checkIsUpdateViaImportFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.default, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: NOT_ALLOW_UPDATE_TIMELINE_TYPE_ERROR_MESSAGE, + statusCode: 403, + }); + }); + + test('should return error if trying to update status field of an existing timeline template', () => { + const isHandlingTemplateTimeline = true; + const version = mockGetTemplateTimelineValue.version; + const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; + const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; + const existTimeline = null; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const result = checkIsUpdateViaImportFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.immutable, + TimelineType.template, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: NOT_ALLOW_UPDATE_STATUS_ERROR_MESSAGE, + statusCode: 405, + }); + }); + + test('should return error if trying to update a timeline template that does not exist', () => { + const isHandlingTemplateTimeline = true; + const version = mockGetTemplateTimelineValue.version; + const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; + const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; + const existTimeline = null; + const existTemplateTimeline = null; + const result = checkIsUpdateViaImportFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.default, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: UPDATE_TEMPLATE_TIMELINE_ERROR_MESSAGE, + statusCode: 405, + }); + }); + + test('should return error if there is no matched timeline found by given templateTimelineId', () => { + const isHandlingTemplateTimeline = true; + const version = mockGetTemplateTimelineValue.version; + const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; + const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; + const existTimeline = { + ...(mockGetTemplateTimelineValue as TimelineSavedObject), + savedObjectId: 'someOtherId', + }; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const result = checkIsUpdateViaImportFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.template, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: NO_MATCH_ID_ERROR_MESSAGE, + statusCode: 409, + }); + }); + + test('should return error if given version field is defferent from existing version of timelin template', () => { + const isHandlingTemplateTimeline = true; + const version = 'xxx'; + const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; + const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; + const existTimeline = null; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const result = checkIsUpdateViaImportFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.template, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: NO_MATCH_VERSION_ERROR_MESSAGE, + statusCode: 409, + }); + }); + + test('should return error if given templateTimelineVersion field is less or equal to existing templateTimelineVersion of timelin template', () => { + const isHandlingTemplateTimeline = true; + const version = mockGetTemplateTimelineValue.version; + const templateTimelineVersion = mockGetTemplateTimelineValue.templateTimelineVersion; + const templateTimelineId = mockGetTemplateTimelineValue.templateTimelineId; + const existTimeline = null; + const existTemplateTimeline = mockGetTemplateTimelineValue as TimelineSavedObject; + const result = checkIsUpdateViaImportFailureCases( + isHandlingTemplateTimeline, + TimelineStatus.active, + TimelineType.template, + version, + templateTimelineVersion, + templateTimelineId, + existTimeline, + existTemplateTimeline + ); + + expect(result).toEqual({ + body: TEMPLATE_TIMELINE_VERSION_CONFLICT_MESSAGE, + statusCode: 409, + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/failure_cases.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/failure_cases.ts index d41e8fc190983..b926819d66c92 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/failure_cases.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/failure_cases.ts @@ -78,7 +78,10 @@ const commonUpdateTemplateTimelineCheck = ( existTemplateTimeline: TimelineSavedObject | null ) => { if (isHandlingTemplateTimeline) { - if (existTimeline != null && timelineType !== existTimeline.timelineType) { + if ( + (existTimeline != null && timelineType !== existTimeline.timelineType) || + (existTemplateTimeline != null && timelineType !== existTemplateTimeline.timelineType) + ) { return { body: NOT_ALLOW_UPDATE_TIMELINE_TYPE_ERROR_MESSAGE, statusCode: 403, @@ -106,11 +109,7 @@ const commonUpdateTemplateTimelineCheck = ( }; } - if ( - existTemplateTimeline != null && - existTemplateTimeline.templateTimelineVersion == null && - existTemplateTimeline.version !== version - ) { + if (existTemplateTimeline != null && existTemplateTimeline.version !== version) { // throw error 409 conflict timeline return { body: NO_MATCH_VERSION_ERROR_MESSAGE, @@ -231,12 +230,6 @@ export const checkIsUpdateViaImportFailureCases = ( }; } } else { - if (existTemplateTimeline != null && timelineType !== existTemplateTimeline?.timelineType) { - return { - body: NOT_ALLOW_UPDATE_TIMELINE_TYPE_ERROR_MESSAGE, - statusCode: 403, - }; - } const isStatusValid = ((existTemplateTimeline?.status == null || existTemplateTimeline?.status === TimelineStatus.active) && From 8c710aae3a7702ecd16e7dab997ed331103ff165 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Tue, 28 Jul 2020 14:21:24 +0200 Subject: [PATCH 053/126] [ Functional test ] Increase the waiting time for the filter bar request (#73424) --- .../apps/visualize/input_control_vis/chained_controls.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/functional/apps/visualize/input_control_vis/chained_controls.js b/test/functional/apps/visualize/input_control_vis/chained_controls.js index 179ffa5125a9a..89cca7dc7827e 100644 --- a/test/functional/apps/visualize/input_control_vis/chained_controls.js +++ b/test/functional/apps/visualize/input_control_vis/chained_controls.js @@ -34,6 +34,7 @@ export default function ({ getService, getPageObjects }) { await PageObjects.visualize.loadSavedVisualization('chained input control', { navigateToVisualize: false, }); + await testSubjects.waitForEnabled('addFilter', 10000); }); it('should disable child control when parent control is not set', async () => { From 49846834ebae9d2e1d0ac67353649f0c13ed9dd8 Mon Sep 17 00:00:00 2001 From: MadameSheema Date: Tue, 28 Jul 2020 15:23:05 +0200 Subject: [PATCH 054/126] [SIEM] Unskips and fixes Cypress tests (#73322) * removes not needed configuration * fixes events columnts tests * unksips persisten timeline test * fixes failing test * skips events test since need more time for investigation Co-authored-by: Elastic Machine --- .../cypress/integration/timeline_local_storage.spec.ts | 3 +-- x-pack/plugins/security_solution/cypress/tasks/common.ts | 8 ++++---- .../security_solution/cypress/tasks/hosts/events.ts | 2 +- x-pack/test/security_solution_cypress/config.ts | 2 -- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/timeline_local_storage.spec.ts b/x-pack/plugins/security_solution/cypress/integration/timeline_local_storage.spec.ts index 7c047459c56cc..383ebe2220585 100644 --- a/x-pack/plugins/security_solution/cypress/integration/timeline_local_storage.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/timeline_local_storage.spec.ts @@ -13,8 +13,7 @@ import { TABLE_COLUMN_EVENTS_MESSAGE } from '../screens/hosts/external_events'; import { waitsForEventsToBeLoaded, openEventsViewerFieldsBrowser } from '../tasks/hosts/events'; import { removeColumn, resetFields } from '../tasks/timeline'; -// Failing: See https://github.com/elastic/kibana/issues/72339 -describe.skip('persistent timeline', () => { +describe('persistent timeline', () => { before(() => { loginAndWaitForPage(HOSTS_URL); openEvents(); diff --git a/x-pack/plugins/security_solution/cypress/tasks/common.ts b/x-pack/plugins/security_solution/cypress/tasks/common.ts index a385ad78f63b7..e16db54599981 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/common.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/common.ts @@ -23,14 +23,14 @@ export const drag = (subject: JQuery) => { clientY: subjectLocation.top, force: true, }) - .wait(1000) + .wait(3000) .trigger('mousemove', { button: primaryButton, clientX: subjectLocation.left + dndSloppyClickDetectionThreshold, clientY: subjectLocation.top, force: true, }) - .wait(1000); + .wait(3000); }; /** Drags the subject being dragged on the specified drop target, but does not drop it */ @@ -44,9 +44,9 @@ export const dragWithoutDrop = (dropTarget: JQuery) => { export const drop = (dropTarget: JQuery) => { cy.wrap(dropTarget) .trigger('mousemove', { button: primaryButton, force: true }) - .wait(1000) + .wait(3000) .trigger('mouseup', { force: true }) - .wait(1000); + .wait(3000); }; export const reload = (afterReload: () => void) => { diff --git a/x-pack/plugins/security_solution/cypress/tasks/hosts/events.ts b/x-pack/plugins/security_solution/cypress/tasks/hosts/events.ts index 57c819d967883..1d2c4aa8d0834 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/hosts/events.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/hosts/events.ts @@ -68,7 +68,7 @@ export const dragAndDropColumn = ({ .eq(column) .then((header) => drag(header)); - cy.wait(3000); // wait for DOM updates before moving + cy.wait(5000); // wait for DOM updates before moving cy.get(DRAGGABLE_HEADER) .eq(newPosition) diff --git a/x-pack/test/security_solution_cypress/config.ts b/x-pack/test/security_solution_cypress/config.ts index 1ad3a36cc57ae..83290a60a17a6 100644 --- a/x-pack/test/security_solution_cypress/config.ts +++ b/x-pack/test/security_solution_cypress/config.ts @@ -46,8 +46,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { '--csp.strict=false', // define custom kibana server args here `--elasticsearch.ssl.certificateAuthorities=${CA_CERT_PATH}`, - '--xpack.ingestManager.enabled=true', - '--xpack.ingestManager.fleet.enabled=true', ], }, }; From 19532fc43911d887bebc3ecabae57706509e25ff Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Tue, 28 Jul 2020 15:53:23 +0200 Subject: [PATCH 055/126] [APM] Optimize traces overview (#70200) Co-authored-by: Elastic Machine --- .../app/TraceOverview/TraceList.tsx | 12 +- .../app/TransactionOverview/List/index.tsx | 12 +- .../apm/public/hooks/useTransactionList.ts | 40 +- .../aggregate-latency-metrics/index.ts | 6 +- .../apm/scripts/shared/read-kibana-config.ts | 4 +- ...egister_transaction_duration_alert_type.ts | 2 +- .../metrics/fetch_and_transform_metrics.ts | 37 +- .../lib/metrics/transform_metrics_chart.ts | 37 +- .../get_services/get_services_items_stats.ts | 3 +- .../__snapshots__/fetcher.test.ts.snap | 228 - .../__snapshots__/queries.test.ts.snap | 557 ++- .../__snapshots__/transform.test.ts.snap | 2822 ------------ .../lib/transaction_groups/fetcher.test.ts | 64 - .../server/lib/transaction_groups/fetcher.ts | 185 +- .../get_transaction_group_stats.ts | 144 + .../server/lib/transaction_groups/index.ts | 10 +- .../lib/transaction_groups/queries.test.ts | 8 +- .../lib/transaction_groups/transform.test.ts | 135 - .../lib/transaction_groups/transform.ts | 89 - .../get_local_filter_query.ts | 2 +- .../lib/ui_filters/local_ui_filters/index.ts | 1 + .../apm/typings/elasticsearch/aggregations.ts | 20 +- .../expectation/top_traces.expectation.json | 3970 ++++++++++++----- .../basic/tests/traces/top_traces.ts | 25 +- .../expectation/top_transaction_groups.json | 2639 ++++++++--- .../top_transaction_groups.ts | 25 +- 26 files changed, 5606 insertions(+), 5471 deletions(-) delete mode 100644 x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/fetcher.test.ts.snap delete mode 100644 x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/transform.test.ts.snap delete mode 100644 x-pack/plugins/apm/server/lib/transaction_groups/fetcher.test.ts create mode 100644 x-pack/plugins/apm/server/lib/transaction_groups/get_transaction_group_stats.ts delete mode 100644 x-pack/plugins/apm/server/lib/transaction_groups/transform.test.ts delete mode 100644 x-pack/plugins/apm/server/lib/transaction_groups/transform.ts diff --git a/x-pack/plugins/apm/public/components/app/TraceOverview/TraceList.tsx b/x-pack/plugins/apm/public/components/app/TraceOverview/TraceList.tsx index 898e32f5c2c09..f54255ec0cd18 100644 --- a/x-pack/plugins/apm/public/components/app/TraceOverview/TraceList.tsx +++ b/x-pack/plugins/apm/public/components/app/TraceOverview/TraceList.tsx @@ -9,7 +9,7 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import styled from 'styled-components'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ITransactionGroup } from '../../../../server/lib/transaction_groups/transform'; +import { TransactionGroup } from '../../../../server/lib/transaction_groups/fetcher'; import { fontSizes, truncate } from '../../../style/variables'; import { asMillisecondDuration } from '../../../utils/formatters'; import { EmptyMessage } from '../../shared/EmptyMessage'; @@ -24,11 +24,11 @@ const StyledTransactionLink = styled(TransactionDetailLink)` `; interface Props { - items: ITransactionGroup[]; + items: TransactionGroup[]; isLoading: boolean; } -const traceListColumns: Array> = [ +const traceListColumns: Array> = [ { field: 'name', name: i18n.translate('xpack.apm.tracesTable.nameColumnLabel', { @@ -36,8 +36,8 @@ const traceListColumns: Array> = [ }), width: '40%', sortable: true, - render: (name: string, { sample }: ITransactionGroup) => ( - + render: (_: string, { sample }: TransactionGroup) => ( + > = [ transactionName={sample.transaction.name} transactionType={sample.transaction.type} > - {name} + {sample.transaction.name} ), diff --git a/x-pack/plugins/apm/public/components/app/TransactionOverview/List/index.tsx b/x-pack/plugins/apm/public/components/app/TransactionOverview/List/index.tsx index ae1b07bde0c87..2b1c1b8e8c11c 100644 --- a/x-pack/plugins/apm/public/components/app/TransactionOverview/List/index.tsx +++ b/x-pack/plugins/apm/public/components/app/TransactionOverview/List/index.tsx @@ -10,7 +10,7 @@ import React, { useMemo } from 'react'; import styled from 'styled-components'; import { NOT_AVAILABLE_LABEL } from '../../../../../common/i18n'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ITransactionGroup } from '../../../../../server/lib/transaction_groups/transform'; +import { TransactionGroup } from '../../../../../server/lib/transaction_groups/fetcher'; import { fontFamilyCode, truncate } from '../../../../style/variables'; import { asDecimal, asMillisecondDuration } from '../../../../utils/formatters'; import { ImpactBar } from '../../../shared/ImpactBar'; @@ -25,12 +25,12 @@ const TransactionNameLink = styled(TransactionDetailLink)` `; interface Props { - items: ITransactionGroup[]; + items: TransactionGroup[]; isLoading: boolean; } export function TransactionList({ items, isLoading }: Props) { - const columns: Array> = useMemo( + const columns: Array> = useMemo( () => [ { field: 'name', @@ -39,11 +39,11 @@ export function TransactionList({ items, isLoading }: Props) { }), width: '50%', sortable: true, - render: (transactionName: string, { sample }: ITransactionGroup) => { + render: (_, { sample }: TransactionGroup) => { return ( - {transactionName || NOT_AVAILABLE_LABEL} + {sample.transaction.name || NOT_AVAILABLE_LABEL} ); diff --git a/x-pack/plugins/apm/public/hooks/useTransactionList.ts b/x-pack/plugins/apm/public/hooks/useTransactionList.ts index ed6bb9309a557..0ad221b95b4ff 100644 --- a/x-pack/plugins/apm/public/hooks/useTransactionList.ts +++ b/x-pack/plugins/apm/public/hooks/useTransactionList.ts @@ -4,45 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { useMemo } from 'react'; import { IUrlParams } from '../context/UrlParamsContext/types'; import { useUiFilters } from '../context/UrlParamsContext'; import { useFetcher } from './useFetcher'; import { APIReturnType } from '../services/rest/createCallApmApi'; -const getRelativeImpact = ( - impact: number, - impactMin: number, - impactMax: number -) => - Math.max( - ((impact - impactMin) / Math.max(impactMax - impactMin, 1)) * 100, - 1 - ); - type TransactionsAPIResponse = APIReturnType< '/api/apm/services/{serviceName}/transaction_groups' >; -function getWithRelativeImpact(items: TransactionsAPIResponse['items']) { - const impacts = items - .map(({ impact }) => impact) - .filter((impact) => impact !== null) as number[]; - - const impactMin = Math.min(...impacts); - const impactMax = Math.max(...impacts); - - return items.map((item) => { - return { - ...item, - impactRelative: - item.impact !== null - ? getRelativeImpact(item.impact, impactMin, impactMax) - : null, - }; - }); -} - const DEFAULT_RESPONSE: TransactionsAPIResponse = { items: [], isAggregationAccurate: true, @@ -72,16 +42,8 @@ export function useTransactionList(urlParams: IUrlParams) { [serviceName, start, end, transactionType, uiFilters] ); - const memoizedData = useMemo( - () => ({ - items: getWithRelativeImpact(data.items), - isAggregationAccurate: data.isAggregationAccurate, - bucketSize: data.bucketSize, - }), - [data] - ); return { - data: memoizedData, + data, status, error, }; diff --git a/x-pack/plugins/apm/scripts/aggregate-latency-metrics/index.ts b/x-pack/plugins/apm/scripts/aggregate-latency-metrics/index.ts index 28b095335e93d..c3cf363cbec05 100644 --- a/x-pack/plugins/apm/scripts/aggregate-latency-metrics/index.ts +++ b/x-pack/plugins/apm/scripts/aggregate-latency-metrics/index.ts @@ -10,7 +10,7 @@ import pLimit from 'p-limit'; import pRetry from 'p-retry'; import { parse, format } from 'url'; import { set } from '@elastic/safer-lodash-set'; -import { unique, without, merge, flatten } from 'lodash'; +import { uniq, without, merge, flatten } from 'lodash'; import * as histogram from 'hdr-histogram-js'; import { ESSearchResponse } from '../../typings/elasticsearch'; import { @@ -114,8 +114,8 @@ export async function aggregateLatencyMetrics() { .filter(Boolean) as string[]; const fields = only.length - ? unique(only) - : without(unique([...include, ...defaultFields]), ...exclude); + ? uniq(only) + : without(uniq([...include, ...defaultFields]), ...exclude); const globalFilter = argv.filter ? JSON.parse(String(argv.filter)) : {}; diff --git a/x-pack/plugins/apm/scripts/shared/read-kibana-config.ts b/x-pack/plugins/apm/scripts/shared/read-kibana-config.ts index bc5f1afc63cac..fe226c8ab27d2 100644 --- a/x-pack/plugins/apm/scripts/shared/read-kibana-config.ts +++ b/x-pack/plugins/apm/scripts/shared/read-kibana-config.ts @@ -6,7 +6,7 @@ import path from 'path'; import fs from 'fs'; import yaml from 'js-yaml'; -import { identity, pick } from 'lodash'; +import { identity, pickBy } from 'lodash'; export type KibanaConfig = ReturnType; @@ -22,7 +22,7 @@ export const readKibanaConfig = () => { ) ) || {}) as {}; - const cliEsCredentials = pick( + const cliEsCredentials = pickBy( { 'elasticsearch.username': process.env.ELASTICSEARCH_USERNAME, 'elasticsearch.password': process.env.ELASTICSEARCH_PASSWORD, diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts index 1d14c509274a8..a922457b14cea 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts @@ -157,7 +157,7 @@ export function registerTransactionDurationAlertType({ const { agg } = response.aggregations; - const value = 'values' in agg ? agg.values[0] : agg?.value; + const value = 'values' in agg ? Object.values(agg.values)[0] : agg?.value; if (value && value > alertParams.threshold * 1000) { const alertInstance = services.alertInstanceFactory( diff --git a/x-pack/plugins/apm/server/lib/metrics/fetch_and_transform_metrics.ts b/x-pack/plugins/apm/server/lib/metrics/fetch_and_transform_metrics.ts index 6de2728ee4366..895920a9b6c7d 100644 --- a/x-pack/plugins/apm/server/lib/metrics/fetch_and_transform_metrics.ts +++ b/x-pack/plugins/apm/server/lib/metrics/fetch_and_transform_metrics.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Unionize } from 'utility-types'; +import { Unionize, Overwrite } from 'utility-types'; +import { ESSearchRequest } from '../../../typings/elasticsearch'; import { Setup, SetupTimeRange, @@ -17,14 +18,28 @@ import { getMetricsProjection } from '../../../common/projections/metrics'; import { mergeProjection } from '../../../common/projections/util/merge_projection'; import { AggregationOptionsByType } from '../../../typings/elasticsearch/aggregations'; -interface Aggs { - [key: string]: Unionize<{ - min: AggregationOptionsByType['min']; - max: AggregationOptionsByType['max']; - sum: AggregationOptionsByType['sum']; - avg: AggregationOptionsByType['avg']; - }>; -} +type MetricsAggregationMap = Unionize<{ + min: AggregationOptionsByType['min']; + max: AggregationOptionsByType['max']; + sum: AggregationOptionsByType['sum']; + avg: AggregationOptionsByType['avg']; +}>; + +type MetricAggs = Record; + +export type GenericMetricsRequest = Overwrite< + ESSearchRequest, + { + body: { + aggs: { + timeseriesData: { + date_histogram: AggregationOptionsByType['date_histogram']; + aggs: MetricAggs; + }; + } & MetricAggs; + }; + } +>; interface Filter { exists?: { @@ -35,7 +50,7 @@ interface Filter { }; } -export async function fetchAndTransformMetrics({ +export async function fetchAndTransformMetrics({ setup, serviceName, serviceNodeName, @@ -58,7 +73,7 @@ export async function fetchAndTransformMetrics({ serviceNodeName, }); - const params = mergeProjection(projection, { + const params: GenericMetricsRequest = mergeProjection(projection, { body: { size: 0, query: { diff --git a/x-pack/plugins/apm/server/lib/metrics/transform_metrics_chart.ts b/x-pack/plugins/apm/server/lib/metrics/transform_metrics_chart.ts index affb7c2a12075..a191d5400e36c 100644 --- a/x-pack/plugins/apm/server/lib/metrics/transform_metrics_chart.ts +++ b/x-pack/plugins/apm/server/lib/metrics/transform_metrics_chart.ts @@ -4,40 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ import theme from '@elastic/eui/dist/eui_theme_light.json'; -import { Unionize, Overwrite } from 'utility-types'; import { ChartBase } from './types'; -import { - ESSearchResponse, - ESSearchRequest, -} from '../../../typings/elasticsearch'; -import { AggregationOptionsByType } from '../../../typings/elasticsearch/aggregations'; +import { ESSearchResponse } from '../../../typings/elasticsearch'; import { getVizColorForIndex } from '../../../common/viz_colors'; +import { GenericMetricsRequest } from './fetch_and_transform_metrics'; export type GenericMetricsChart = ReturnType< typeof transformDataToMetricsChart >; -interface MetricsAggregationMap { - min: AggregationOptionsByType['min']; - max: AggregationOptionsByType['max']; - sum: AggregationOptionsByType['sum']; - avg: AggregationOptionsByType['avg']; -} - -type GenericMetricsRequest = Overwrite< - ESSearchRequest, - { - body: { - aggs: { - timeseriesData: { - date_histogram: AggregationOptionsByType['date_histogram']; - aggs: Record>; - }; - } & Record>; - }; - } ->; - export function transformDataToMetricsChart( result: ESSearchResponse, chartBase: ChartBase @@ -51,11 +26,7 @@ export function transformDataToMetricsChart( yUnit: chartBase.yUnit, noHits: hits.total.value === 0, series: Object.keys(chartBase.series).map((seriesKey, i) => { - const overallValue = (aggregations?.[seriesKey] as - | { - value: number | null; - } - | undefined)?.value; + const overallValue = aggregations?.[seriesKey]?.value; return { title: chartBase.series[seriesKey].title, @@ -66,7 +37,7 @@ export function transformDataToMetricsChart( overallValue, data: timeseriesData?.buckets.map((bucket) => { - const { value } = bucket[seriesKey] as { value: number | null }; + const { value } = bucket[seriesKey]; const y = value === null || isNaN(value) ? null : value; return { x: bucket.key, diff --git a/x-pack/plugins/apm/server/lib/services/get_services/get_services_items_stats.ts b/x-pack/plugins/apm/server/lib/services/get_services/get_services_items_stats.ts index c28bcad841ffd..de699028f5675 100644 --- a/x-pack/plugins/apm/server/lib/services/get_services/get_services_items_stats.ts +++ b/x-pack/plugins/apm/server/lib/services/get_services/get_services_items_stats.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { arrayUnionToCallable } from '../../../../common/utils/array_union_to_callable'; import { PROCESSOR_EVENT, TRANSACTION_DURATION, @@ -187,7 +186,7 @@ export const getTransactionRates = async ({ const deltaAsMinutes = getDeltaAsMinutes(setup); - return arrayUnionToCallable(aggregations.services.buckets).map((bucket) => { + return aggregations.services.buckets.map((bucket) => { const transactionsPerMinute = bucket.doc_count / deltaAsMinutes; return { serviceName: bucket.key as string, diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/fetcher.test.ts.snap b/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/fetcher.test.ts.snap deleted file mode 100644 index b354d3ed1f88d..0000000000000 --- a/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/fetcher.test.ts.snap +++ /dev/null @@ -1,228 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`transactionGroupsFetcher type: top_traces should call client.search with correct query 1`] = ` -Array [ - Array [ - Object { - "body": Object { - "aggs": Object { - "transaction_groups": Object { - "aggs": Object { - "avg": Object { - "avg": Object { - "field": "transaction.duration.us", - }, - }, - "p95": Object { - "percentiles": Object { - "field": "transaction.duration.us", - "hdr": Object { - "number_of_significant_value_digits": 2, - }, - "percents": Array [ - 95, - ], - }, - }, - "sample": Object { - "top_hits": Object { - "size": 1, - "sort": Array [ - Object { - "_score": "desc", - }, - Object { - "@timestamp": Object { - "order": "desc", - }, - }, - ], - }, - }, - "sum": Object { - "sum": Object { - "field": "transaction.duration.us", - }, - }, - }, - "composite": Object { - "size": 10000, - "sources": Array [ - Object { - "service": Object { - "terms": Object { - "field": "service.name", - }, - }, - }, - Object { - "transaction": Object { - "terms": Object { - "field": "transaction.name", - }, - }, - }, - ], - }, - }, - }, - "query": Object { - "bool": Object { - "filter": Array [ - Object { - "range": Object { - "@timestamp": Object { - "format": "epoch_millis", - "gte": 1528113600000, - "lte": 1528977600000, - }, - }, - }, - Object { - "term": Object { - "processor.event": "transaction", - }, - }, - Object { - "term": Object { - "service.environment": "test", - }, - }, - ], - "must_not": Array [ - Object { - "exists": Object { - "field": "parent.id", - }, - }, - ], - "should": Array [ - Object { - "term": Object { - "transaction.sampled": true, - }, - }, - ], - }, - }, - "size": 0, - }, - "index": "myIndex", - }, - ], -] -`; - -exports[`transactionGroupsFetcher type: top_transactions should call client.search with correct query 1`] = ` -Array [ - Array [ - Object { - "body": Object { - "aggs": Object { - "transaction_groups": Object { - "aggs": Object { - "avg": Object { - "avg": Object { - "field": "transaction.duration.us", - }, - }, - "p95": Object { - "percentiles": Object { - "field": "transaction.duration.us", - "hdr": Object { - "number_of_significant_value_digits": 2, - }, - "percents": Array [ - 95, - ], - }, - }, - "sample": Object { - "top_hits": Object { - "size": 1, - "sort": Array [ - Object { - "_score": "desc", - }, - Object { - "@timestamp": Object { - "order": "desc", - }, - }, - ], - }, - }, - "sum": Object { - "sum": Object { - "field": "transaction.duration.us", - }, - }, - }, - "composite": Object { - "size": 101, - "sources": Array [ - Object { - "transaction": Object { - "terms": Object { - "field": "transaction.name", - }, - }, - }, - ], - }, - }, - "transactions": Object { - "terms": Object { - "field": "transaction.name", - }, - }, - }, - "query": Object { - "bool": Object { - "filter": Array [ - Object { - "range": Object { - "@timestamp": Object { - "format": "epoch_millis", - "gte": 1528113600000, - "lte": 1528977600000, - }, - }, - }, - Object { - "term": Object { - "processor.event": "transaction", - }, - }, - Object { - "term": Object { - "transaction.type": "request", - }, - }, - Object { - "term": Object { - "service.name": "opbeans-node", - }, - }, - Object { - "term": Object { - "service.environment": "test", - }, - }, - ], - "should": Array [ - Object { - "term": Object { - "transaction.sampled": true, - }, - }, - ], - }, - }, - "size": 0, - }, - "index": "myIndex", - }, - ], -] -`; diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/queries.test.ts.snap b/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/queries.test.ts.snap index 884a7d18cc4d4..deca46f4ebd0c 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/queries.test.ts.snap +++ b/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/queries.test.ts.snap @@ -1,220 +1,479 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`transaction group queries fetches top traces 1`] = ` -Object { - "body": Object { - "aggs": Object { - "transaction_groups": Object { - "aggs": Object { - "avg": Object { - "avg": Object { - "field": "transaction.duration.us", - }, - }, - "p95": Object { - "percentiles": Object { - "field": "transaction.duration.us", - "hdr": Object { - "number_of_significant_value_digits": 2, +Array [ + Object { + "body": Object { + "aggs": Object { + "transaction_groups": Object { + "aggs": Object { + "sample": Object { + "top_hits": Object { + "size": 1, }, - "percents": Array [ - 95, - ], }, }, - "sample": Object { - "top_hits": Object { - "size": 1, - "sort": Array [ - Object { - "_score": "desc", + "composite": Object { + "size": 10000, + "sources": Array [ + Object { + "service.name": Object { + "terms": Object { + "field": "service.name", + }, }, - Object { - "@timestamp": Object { - "order": "desc", + }, + Object { + "transaction.name": Object { + "terms": Object { + "field": "transaction.name", }, }, - ], + }, + ], + }, + }, + }, + "query": Object { + "bool": Object { + "filter": Array [ + Object { + "range": Object { + "@timestamp": Object { + "format": "epoch_millis", + "gte": 1528113600000, + "lte": 1528977600000, + }, + }, + }, + Object { + "term": Object { + "processor.event": "transaction", + }, + }, + Object { + "term": Object { + "my.custom.ui.filter": "foo-bar", + }, + }, + ], + "must_not": Array [ + Object { + "exists": Object { + "field": "parent.id", + }, + }, + ], + "should": Array [ + Object { + "term": Object { + "transaction.sampled": true, + }, }, + ], + }, + }, + "sort": Array [ + Object { + "_score": "desc", + }, + Object { + "@timestamp": Object { + "order": "desc", }, - "sum": Object { - "sum": Object { - "field": "transaction.duration.us", + }, + ], + }, + "index": "myIndex", + "size": 0, + }, + Object { + "body": Object { + "aggs": Object { + "transaction_groups": Object { + "aggs": Object { + "avg": Object { + "avg": Object { + "field": "transaction.duration.us", + }, }, }, + "composite": Object { + "size": 10000, + "sources": Array [ + Object { + "service.name": Object { + "terms": Object { + "field": "service.name", + }, + }, + }, + Object { + "transaction.name": Object { + "terms": Object { + "field": "transaction.name", + }, + }, + }, + ], + }, }, - "composite": Object { - "size": 10000, - "sources": Array [ + }, + "query": Object { + "bool": Object { + "filter": Array [ Object { - "service": Object { - "terms": Object { - "field": "service.name", + "range": Object { + "@timestamp": Object { + "format": "epoch_millis", + "gte": 1528113600000, + "lte": 1528977600000, }, }, }, Object { - "transaction": Object { - "terms": Object { - "field": "transaction.name", - }, + "term": Object { + "processor.event": "transaction", + }, + }, + Object { + "term": Object { + "my.custom.ui.filter": "foo-bar", + }, + }, + ], + "must_not": Array [ + Object { + "exists": Object { + "field": "parent.id", }, }, ], }, }, }, - "query": Object { - "bool": Object { - "filter": Array [ - Object { - "range": Object { - "@timestamp": Object { - "format": "epoch_millis", - "gte": 1528113600000, - "lte": 1528977600000, + "index": "myIndex", + "size": 0, + }, + Object { + "body": Object { + "aggs": Object { + "transaction_groups": Object { + "aggs": Object { + "sum": Object { + "sum": Object { + "field": "transaction.duration.us", }, }, }, - Object { - "term": Object { - "processor.event": "transaction", - }, + "composite": Object { + "size": 10000, + "sources": Array [ + Object { + "service.name": Object { + "terms": Object { + "field": "service.name", + }, + }, + }, + Object { + "transaction.name": Object { + "terms": Object { + "field": "transaction.name", + }, + }, + }, + ], }, - Object { - "term": Object { - "my.custom.ui.filter": "foo-bar", + }, + }, + "query": Object { + "bool": Object { + "filter": Array [ + Object { + "range": Object { + "@timestamp": Object { + "format": "epoch_millis", + "gte": 1528113600000, + "lte": 1528977600000, + }, + }, }, - }, - ], - "must_not": Array [ - Object { - "exists": Object { - "field": "parent.id", + Object { + "term": Object { + "processor.event": "transaction", + }, }, - }, - ], - "should": Array [ - Object { - "term": Object { - "transaction.sampled": true, + Object { + "term": Object { + "my.custom.ui.filter": "foo-bar", + }, }, - }, - ], + ], + "must_not": Array [ + Object { + "exists": Object { + "field": "parent.id", + }, + }, + ], + }, }, }, + "index": "myIndex", "size": 0, }, - "index": "myIndex", -} +] `; exports[`transaction group queries fetches top transactions 1`] = ` -Object { - "body": Object { - "aggs": Object { - "transaction_groups": Object { - "aggs": Object { - "avg": Object { - "avg": Object { - "field": "transaction.duration.us", - }, - }, - "p95": Object { - "percentiles": Object { - "field": "transaction.duration.us", - "hdr": Object { - "number_of_significant_value_digits": 2, +Array [ + Object { + "body": Object { + "aggs": Object { + "transaction_groups": Object { + "aggs": Object { + "sample": Object { + "top_hits": Object { + "size": 1, }, - "percents": Array [ - 95, - ], }, }, - "sample": Object { - "top_hits": Object { - "size": 1, - "sort": Array [ - Object { - "_score": "desc", - }, - Object { - "@timestamp": Object { - "order": "desc", - }, + "terms": Object { + "field": "transaction.name", + "size": 101, + }, + }, + }, + "query": Object { + "bool": Object { + "filter": Array [ + Object { + "range": Object { + "@timestamp": Object { + "format": "epoch_millis", + "gte": 1528113600000, + "lte": 1528977600000, }, - ], + }, }, + Object { + "term": Object { + "processor.event": "transaction", + }, + }, + Object { + "term": Object { + "transaction.type": "bar", + }, + }, + Object { + "term": Object { + "service.name": "foo", + }, + }, + Object { + "term": Object { + "my.custom.ui.filter": "foo-bar", + }, + }, + ], + "should": Array [ + Object { + "term": Object { + "transaction.sampled": true, + }, + }, + ], + }, + }, + "sort": Array [ + Object { + "_score": "desc", + }, + Object { + "@timestamp": Object { + "order": "desc", }, - "sum": Object { - "sum": Object { - "field": "transaction.duration.us", + }, + ], + }, + "index": "myIndex", + "size": 0, + }, + Object { + "body": Object { + "aggs": Object { + "transaction_groups": Object { + "aggs": Object { + "avg": Object { + "avg": Object { + "field": "transaction.duration.us", + }, }, }, + "terms": Object { + "field": "transaction.name", + "size": 101, + }, }, - "composite": Object { - "size": 101, - "sources": Array [ + }, + "query": Object { + "bool": Object { + "filter": Array [ Object { - "transaction": Object { - "terms": Object { - "field": "transaction.name", + "range": Object { + "@timestamp": Object { + "format": "epoch_millis", + "gte": 1528113600000, + "lte": 1528977600000, }, }, }, + Object { + "term": Object { + "processor.event": "transaction", + }, + }, + Object { + "term": Object { + "transaction.type": "bar", + }, + }, + Object { + "term": Object { + "service.name": "foo", + }, + }, + Object { + "term": Object { + "my.custom.ui.filter": "foo-bar", + }, + }, ], }, }, - "transactions": Object { - "terms": Object { - "field": "transaction.name", + }, + "index": "myIndex", + "size": 0, + }, + Object { + "body": Object { + "aggs": Object { + "transaction_groups": Object { + "aggs": Object { + "sum": Object { + "sum": Object { + "field": "transaction.duration.us", + }, + }, + }, + "terms": Object { + "field": "transaction.name", + "size": 101, + }, + }, + }, + "query": Object { + "bool": Object { + "filter": Array [ + Object { + "range": Object { + "@timestamp": Object { + "format": "epoch_millis", + "gte": 1528113600000, + "lte": 1528977600000, + }, + }, + }, + Object { + "term": Object { + "processor.event": "transaction", + }, + }, + Object { + "term": Object { + "transaction.type": "bar", + }, + }, + Object { + "term": Object { + "service.name": "foo", + }, + }, + Object { + "term": Object { + "my.custom.ui.filter": "foo-bar", + }, + }, + ], }, }, }, - "query": Object { - "bool": Object { - "filter": Array [ - Object { - "range": Object { - "@timestamp": Object { - "format": "epoch_millis", - "gte": 1528113600000, - "lte": 1528977600000, + "index": "myIndex", + "size": 0, + }, + Object { + "body": Object { + "aggs": Object { + "transaction_groups": Object { + "aggs": Object { + "p95": Object { + "percentiles": Object { + "field": "transaction.duration.us", + "hdr": Object { + "number_of_significant_value_digits": 2, + }, + "percents": Array [ + 95, + ], }, }, }, - Object { - "term": Object { - "processor.event": "transaction", - }, + "terms": Object { + "field": "transaction.name", + "size": 101, }, - Object { - "term": Object { - "transaction.type": "bar", + }, + }, + "query": Object { + "bool": Object { + "filter": Array [ + Object { + "range": Object { + "@timestamp": Object { + "format": "epoch_millis", + "gte": 1528113600000, + "lte": 1528977600000, + }, + }, }, - }, - Object { - "term": Object { - "service.name": "foo", + Object { + "term": Object { + "processor.event": "transaction", + }, }, - }, - Object { - "term": Object { - "my.custom.ui.filter": "foo-bar", + Object { + "term": Object { + "transaction.type": "bar", + }, }, - }, - ], - "should": Array [ - Object { - "term": Object { - "transaction.sampled": true, + Object { + "term": Object { + "service.name": "foo", + }, }, - }, - ], + Object { + "term": Object { + "my.custom.ui.filter": "foo-bar", + }, + }, + ], + }, }, }, + "index": "myIndex", "size": 0, }, - "index": "myIndex", -} +] `; diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/transform.test.ts.snap b/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/transform.test.ts.snap deleted file mode 100644 index 66b805ab2efc1..0000000000000 --- a/x-pack/plugins/apm/server/lib/transaction_groups/__snapshots__/transform.test.ts.snap +++ /dev/null @@ -1,2822 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`transactionGroupsTransformer should match snapshot 1`] = ` -Array [ - Object { - "averageResponseTime": 48021.972616494, - "impact": 100, - "name": "GET /api", - "p95": 67138.18364917398, - "sample": Object { - "@timestamp": "2018-11-18T20:53:44.070Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 5176, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3756, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "accept": "*/*", - "accept-encoding": "gzip, deflate", - "connection": "keep-alive", - "elastic-apm-traceparent": "00-86c68779d8a65b06fb78e770ffc436a5-4aaea53dc1791183-01", - "host": "opbeans-node:3000", - "user-agent": "python-requests/2.20.0", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.6", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/types/3", - "hostname": "opbeans-node", - "pathname": "/api/types/3", - "port": "3000", - "protocol": "http:", - "raw": "/api/types/3", - }, - }, - "response": Object { - "headers": Object { - "connection": "close", - "content-type": "application/json;charset=UTF-8", - "date": "Sun, 18 Nov 2018 20:53:43 GMT", - "transfer-encoding": "chunked", - "x-powered-by": "Express", - }, - "status_code": 404, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "parent": Object { - "id": "4aaea53dc1791183", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574424070007, - }, - "trace": Object { - "id": "86c68779d8a65b06fb78e770ffc436a5", - }, - "transaction": Object { - "duration": Object { - "us": 8684, - }, - "id": "a78bca581dcd8ff8", - "name": "GET /api", - "result": "HTTP 4xx", - "sampled": true, - "span_count": Object { - "started": 1, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 691926.3157894736, - }, - Object { - "averageResponseTime": 2651.8784461553205, - "impact": 15.770246496477105, - "name": "GET static file", - "p95": 6140.579335038363, - "sample": Object { - "@timestamp": "2018-11-18T20:53:43.304Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3756, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "accept": "*/*", - "host": "opbeans-node:3000", - "user-agent": "curl/7.38.0", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/", - "hostname": "opbeans-node", - "pathname": "/", - "port": "3000", - "protocol": "http:", - "raw": "/", - }, - }, - "response": Object { - "headers": Object { - "accept-ranges": "bytes", - "cache-control": "public, max-age=0", - "connection": "keep-alive", - "content-length": "640", - "content-type": "text/html; charset=UTF-8", - "date": "Sun, 18 Nov 2018 20:53:43 GMT", - "etag": "W/\\"280-1670775e878\\"", - "last-modified": "Mon, 12 Nov 2018 10:27:07 GMT", - "x-powered-by": "Express", - }, - "status_code": 200, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574423304006, - }, - "trace": Object { - "id": "b303d2a4a007946b63b9db7fafe639a0", - }, - "transaction": Object { - "duration": Object { - "us": 1801, - }, - "id": "2869c13633534be5", - "name": "GET static file", - "result": "HTTP 2xx", - "sampled": true, - "span_count": Object { - "started": 0, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 1977031.5789473683, - }, - Object { - "averageResponseTime": 32554.36257814184, - "impact": 14.344171563678346, - "name": "GET /api/stats", - "p95": 59356.73611111111, - "sample": Object { - "@timestamp": "2018-11-18T20:53:42.560Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 207, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3756, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "accept": "*/*", - "accept-encoding": "gzip, deflate", - "connection": "keep-alive", - "elastic-apm-traceparent": "00-63ccc3b0929dafb7f2fbcabdc7f7af25-821a787e73ab1563-01", - "host": "opbeans-node:3000", - "if-none-match": "W/\\"77-uxKJrX5GSMJJWTKh3orUFAEVxSs\\"", - "referer": "http://opbeans-node:3000/dashboard", - "user-agent": "Chromeless 1.4.0", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.7", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/stats", - "hostname": "opbeans-node", - "pathname": "/api/stats", - "port": "3000", - "protocol": "http:", - "raw": "/api/stats", - }, - }, - "response": Object { - "headers": Object { - "connection": "keep-alive", - "date": "Sun, 18 Nov 2018 20:53:42 GMT", - "etag": "W/\\"77-uxKJrX5GSMJJWTKh3orUFAEVxSs\\"", - "x-powered-by": "Express", - }, - "status_code": 304, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "parent": Object { - "id": "821a787e73ab1563", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574422560002, - }, - "trace": Object { - "id": "63ccc3b0929dafb7f2fbcabdc7f7af25", - }, - "transaction": Object { - "duration": Object { - "us": 28753, - }, - "id": "fb754e7628da2fb5", - "name": "GET /api/stats", - "result": "HTTP 3xx", - "sampled": true, - "span_count": Object { - "started": 7, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 146494.73684210525, - }, - Object { - "averageResponseTime": 32159.926322043968, - "impact": 10.27904952170656, - "name": "GET /api/customers", - "p95": 59845.85714285714, - "sample": Object { - "@timestamp": "2018-11-18T20:53:21.180Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 2531, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3710, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "accept": "*/*", - "accept-encoding": "gzip, deflate", - "connection": "keep-alive", - "elastic-apm-traceparent": "00-541025da8ecc2f51f21c1a4ad6992b77-ca18d9d4c3879519-01", - "host": "opbeans-node:3000", - "user-agent": "python-requests/2.20.0", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.6", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/customers", - "hostname": "opbeans-node", - "pathname": "/api/customers", - "port": "3000", - "protocol": "http:", - "raw": "/api/customers", - }, - }, - "response": Object { - "headers": Object { - "connection": "keep-alive", - "content-length": "186769", - "content-type": "application/json; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:53:21 GMT", - "etag": "W/\\"2d991-yG3J8W/roH7fSxXTudZrO27Ax9s\\"", - "x-powered-by": "Express", - }, - "status_code": 200, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "parent": Object { - "id": "ca18d9d4c3879519", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574401180002, - }, - "trace": Object { - "id": "541025da8ecc2f51f21c1a4ad6992b77", - }, - "transaction": Object { - "duration": Object { - "us": 18077, - }, - "id": "94852b9dd1075982", - "name": "GET /api/customers", - "result": "HTTP 2xx", - "sampled": true, - "span_count": Object { - "started": 2, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 106294.73684210525, - }, - Object { - "averageResponseTime": 33265.03326147213, - "impact": 10.256357027376065, - "name": "GET /api/orders", - "p95": 58827.489999999976, - "sample": Object { - "@timestamp": "2018-11-18T20:53:40.973Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 408, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3756, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "connection": "close", - "host": "opbeans-node:3000", - "user-agent": "workload/2.4.3", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/orders", - "hostname": "opbeans-node", - "pathname": "/api/orders", - "port": "3000", - "protocol": "http:", - "raw": "/api/orders", - }, - }, - "response": Object { - "headers": Object { - "connection": "close", - "content-length": "103612", - "content-type": "application/json; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:53:40 GMT", - "etag": "W/\\"194bc-cOw6+iRf7XCeqMXHrle3IOig7tY\\"", - "x-powered-by": "Express", - }, - "status_code": 200, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574420973006, - }, - "trace": Object { - "id": "0afce85f593cbbdd09949936fe964f0f", - }, - "transaction": Object { - "duration": Object { - "us": 23040, - }, - "id": "89f200353eb50539", - "name": "GET /api/orders", - "result": "HTTP 2xx", - "sampled": true, - "span_count": Object { - "started": 2, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 102536.84210526315, - }, - Object { - "averageResponseTime": 27516.89144558744, - "impact": 9.651458992731666, - "name": "GET /api/products/top", - "p95": 56064.679999999986, - "sample": Object { - "@timestamp": "2018-11-18T20:52:57.316Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 5113, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3686, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "accept": "*/*", - "accept-encoding": "gzip, deflate", - "connection": "keep-alive", - "elastic-apm-traceparent": "00-74f12e705936d66350f4741ebeb55189-fcebe94cd2136215-01", - "host": "opbeans-node:3000", - "referer": "http://opbeans-node:3000/dashboard", - "user-agent": "Chromeless 1.4.0", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.7", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/products/top", - "hostname": "opbeans-node", - "pathname": "/api/products/top", - "port": "3000", - "protocol": "http:", - "raw": "/api/products/top", - }, - }, - "response": Object { - "headers": Object { - "connection": "keep-alive", - "content-length": "282", - "content-type": "application/json; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:52:57 GMT", - "etag": "W/\\"11a-lcI9zuMZYYsDRpEZgYqDYr96cKM\\"", - "x-powered-by": "Express", - }, - "status_code": 200, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "parent": Object { - "id": "fcebe94cd2136215", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574377316005, - }, - "trace": Object { - "id": "74f12e705936d66350f4741ebeb55189", - }, - "transaction": Object { - "duration": Object { - "us": 48781, - }, - "id": "be4bd5475d5d9e6f", - "name": "GET /api/products/top", - "result": "HTTP 2xx", - "sampled": true, - "span_count": Object { - "started": 4, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 116652.63157894736, - }, - Object { - "averageResponseTime": 12683.190864600327, - "impact": 4.4239778504968, - "name": "GET /api/products", - "p95": 35009.67999999999, - "sample": Object { - "@timestamp": "2018-11-18T20:53:43.477Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 2857, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3756, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "connection": "close", - "host": "opbeans-node:3000", - "user-agent": "workload/2.4.3", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/products", - "hostname": "opbeans-node", - "pathname": "/api/products", - "port": "3000", - "protocol": "http:", - "raw": "/api/products", - }, - }, - "response": Object { - "headers": Object { - "connection": "close", - "content-length": "1023", - "content-type": "application/json; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:53:43 GMT", - "etag": "W/\\"3ff-VyOxcDApb+a/lnjkm9FeTOGSDrs\\"", - "x-powered-by": "Express", - }, - "status_code": 200, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574423477006, - }, - "trace": Object { - "id": "bee00a8efb523ca4b72adad57f7caba3", - }, - "transaction": Object { - "duration": Object { - "us": 6915, - }, - "id": "d8fc6d3b8707b64c", - "name": "GET /api/products", - "result": "HTTP 2xx", - "sampled": true, - "span_count": Object { - "started": 2, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 116147.36842105263, - }, - Object { - "averageResponseTime": 255966.30555555556, - "impact": 4.3693406535517445, - "name": "POST /api/orders", - "p95": 320238.5, - "sample": Object { - "@timestamp": "2018-11-18T20:43:32.010Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 4669, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 2413, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "body": "[REDACTED]", - "headers": Object { - "accept": "application/json", - "connection": "close", - "content-length": "129", - "content-type": "application/json", - "host": "opbeans-node:3000", - "user-agent": "workload/2.4.3", - }, - "http_version": "1.1", - "method": "POST", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/orders", - "hostname": "opbeans-node", - "pathname": "/api/orders", - "port": "3000", - "protocol": "http:", - "raw": "/api/orders", - }, - }, - "response": Object { - "headers": Object { - "connection": "close", - "content-length": "13", - "content-type": "application/json; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:43:32 GMT", - "etag": "W/\\"d-g9K2iK4ordyN88lGL4LmPlYNfhc\\"", - "x-powered-by": "Express", - }, - "status_code": 200, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542573812010006, - }, - "trace": Object { - "id": "2b1252a338249daeecf6afb0c236e31b", - }, - "transaction": Object { - "duration": Object { - "us": 291572, - }, - "id": "2c9f39e9ec4a0111", - "name": "POST /api/orders", - "result": "HTTP 2xx", - "sampled": true, - "span_count": Object { - "started": 16, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 5684.210526315789, - }, - Object { - "averageResponseTime": 17189.329210275926, - "impact": 3.424381787142002, - "name": "GET /api/products/:id/customers", - "p95": 39284.79999999999, - "sample": Object { - "@timestamp": "2018-11-18T20:48:24.769Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 1735, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3100, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "accept": "*/*", - "accept-encoding": "gzip, deflate", - "connection": "keep-alive", - "elastic-apm-traceparent": "00-28f178c354d17f400dea04bc4a7b3c57-68f5d1607cac7779-01", - "host": "opbeans-node:3000", - "user-agent": "python-requests/2.20.0", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.6", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/products/2/customers", - "hostname": "opbeans-node", - "pathname": "/api/products/2/customers", - "port": "3000", - "protocol": "http:", - "raw": "/api/products/2/customers", - }, - }, - "response": Object { - "headers": Object { - "connection": "keep-alive", - "content-length": "186570", - "content-type": "application/json; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:48:24 GMT", - "etag": "W/\\"2d8ca-Z9NzuHyGyxwtzpOkcIxBvzm24iw\\"", - "x-powered-by": "Express", - }, - "status_code": 200, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "parent": Object { - "id": "68f5d1607cac7779", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574104769029, - }, - "trace": Object { - "id": "28f178c354d17f400dea04bc4a7b3c57", - }, - "transaction": Object { - "duration": Object { - "us": 49338, - }, - "id": "2a87ae20ad04ee0c", - "name": "GET /api/products/:id/customers", - "result": "HTTP 2xx", - "sampled": true, - "span_count": Object { - "started": 1, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 66378.94736842105, - }, - Object { - "averageResponseTime": 11257.757916666667, - "impact": 2.558180605569336, - "name": "GET /api/types", - "p95": 35222.944444444445, - "sample": Object { - "@timestamp": "2018-11-18T20:53:44.978Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 2193, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3756, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "connection": "close", - "host": "opbeans-node:3000", - "user-agent": "workload/2.4.3", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/types", - "hostname": "opbeans-node", - "pathname": "/api/types", - "port": "3000", - "protocol": "http:", - "raw": "/api/types", - }, - }, - "response": Object { - "headers": Object { - "connection": "close", - "content-length": "112", - "content-type": "application/json; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:53:44 GMT", - "etag": "W/\\"70-1z6hT7P1WHgBgS/BeUEVeHhOCQU\\"", - "x-powered-by": "Express", - }, - "status_code": 200, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574424978005, - }, - "trace": Object { - "id": "0d84126973411c19b470f2d9eea958d3", - }, - "transaction": Object { - "duration": Object { - "us": 7891, - }, - "id": "0f10668e4fb3adc7", - "name": "GET /api/types", - "result": "HTTP 2xx", - "sampled": true, - "span_count": Object { - "started": 2, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 75789.47368421052, - }, - Object { - "averageResponseTime": 3504.5108924806746, - "impact": 2.3600993453143766, - "name": "GET *", - "p95": 11431.738095238095, - "sample": Object { - "@timestamp": "2018-11-18T20:53:42.493Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 6446, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3756, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", - "accept-encoding": "gzip, deflate", - "connection": "keep-alive", - "host": "opbeans-node:3000", - "if-modified-since": "Mon, 12 Nov 2018 10:27:07 GMT", - "if-none-match": "W/\\"280-1670775e878\\"", - "upgrade-insecure-requests": "1", - "user-agent": "Chromeless 1.4.0", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.7", - }, - "url": Object { - "full": "http://opbeans-node:3000/dashboard", - "hostname": "opbeans-node", - "pathname": "/dashboard", - "port": "3000", - "protocol": "http:", - "raw": "/dashboard", - }, - }, - "response": Object { - "headers": Object { - "accept-ranges": "bytes", - "cache-control": "public, max-age=0", - "connection": "keep-alive", - "date": "Sun, 18 Nov 2018 20:53:42 GMT", - "etag": "W/\\"280-1670775e878\\"", - "last-modified": "Mon, 12 Nov 2018 10:27:07 GMT", - "x-powered-by": "Express", - }, - "status_code": 304, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574422493006, - }, - "trace": Object { - "id": "7efb6ade88cdea20cd96ca482681cde7", - }, - "transaction": Object { - "duration": Object { - "us": 1901, - }, - "id": "f5fc4621949b63fb", - "name": "GET *", - "result": "HTTP 3xx", - "sampled": true, - "span_count": Object { - "started": 0, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 224684.21052631576, - }, - Object { - "averageResponseTime": 32387.73641304348, - "impact": 2.2558112380477584, - "name": "GET /log-error", - "p95": 40061.1, - "sample": Object { - "@timestamp": "2018-11-18T20:52:51.462Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 4877, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3659, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "connection": "close", - "host": "opbeans-node:3000", - "user-agent": "workload/2.4.3", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/log-error", - "hostname": "opbeans-node", - "pathname": "/log-error", - "port": "3000", - "protocol": "http:", - "raw": "/log-error", - }, - }, - "response": Object { - "headers": Object { - "connection": "close", - "content-length": "24", - "content-type": "text/html; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:52:51 GMT", - "etag": "W/\\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\\"", - "x-powered-by": "Express", - }, - "status_code": 500, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574371462005, - }, - "trace": Object { - "id": "15366d65659b5fc8f67ff127391b3aff", - }, - "transaction": Object { - "duration": Object { - "us": 33367, - }, - "id": "ec9c465c5042ded8", - "name": "GET /log-error", - "result": "HTTP 5xx", - "sampled": true, - "span_count": Object { - "started": 0, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 23242.105263157893, - }, - Object { - "averageResponseTime": 32900.72714285714, - "impact": 2.1791207411745854, - "name": "GET /log-message", - "p95": 40444, - "sample": Object { - "@timestamp": "2018-11-18T20:49:09.225Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 321, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3142, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "connection": "close", - "host": "opbeans-node:3000", - "user-agent": "workload/2.4.3", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/log-message", - "hostname": "opbeans-node", - "pathname": "/log-message", - "port": "3000", - "protocol": "http:", - "raw": "/log-message", - }, - }, - "response": Object { - "headers": Object { - "connection": "close", - "content-length": "24", - "content-type": "text/html; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:49:09 GMT", - "etag": "W/\\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\\"", - "x-powered-by": "Express", - }, - "status_code": 500, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574149225004, - }, - "trace": Object { - "id": "ba18b741cdd3ac83eca89a5fede47577", - }, - "transaction": Object { - "duration": Object { - "us": 32381, - }, - "id": "b9a8f96d7554d09f", - "name": "GET /log-message", - "result": "HTTP 5xx", - "sampled": true, - "span_count": Object { - "started": 0, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 22105.263157894737, - }, - Object { - "averageResponseTime": 10548.218597063622, - "impact": 1.8338763992340905, - "name": "GET /api/products/:id", - "p95": 28413.383333333328, - "sample": Object { - "@timestamp": "2018-11-18T20:52:57.963Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 7184, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3686, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "connection": "close", - "host": "opbeans-node:3000", - "user-agent": "workload/2.4.3", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/products/3", - "hostname": "opbeans-node", - "pathname": "/api/products/3", - "port": "3000", - "protocol": "http:", - "raw": "/api/products/3", - }, - }, - "response": Object { - "headers": Object { - "connection": "close", - "content-length": "231", - "content-type": "application/json; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:52:57 GMT", - "etag": "W/\\"e7-kkuzj37GZDzXDh0CWqh5Gan0VO4\\"", - "x-powered-by": "Express", - }, - "status_code": 200, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574377963005, - }, - "trace": Object { - "id": "ca86ec845e412e4b4506a715d51548ec", - }, - "transaction": Object { - "duration": Object { - "us": 6959, - }, - "id": "d324897ffb7ebcdc", - "name": "GET /api/products/:id", - "result": "HTTP 2xx", - "sampled": true, - "span_count": Object { - "started": 1, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 58073.68421052631, - }, - Object { - "averageResponseTime": 9868.217894736843, - "impact": 1.7722323960215767, - "name": "GET /api/customers/:id", - "p95": 27486.5, - "sample": Object { - "@timestamp": "2018-11-18T20:52:56.797Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 8225, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3686, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "accept": "*/*", - "accept-encoding": "gzip, deflate", - "connection": "keep-alive", - "elastic-apm-traceparent": "00-e6140d30363f18b585f5d3b753f4d025-aa82e2c847265626-01", - "host": "opbeans-node:3000", - "user-agent": "python-requests/2.20.0", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.6", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/customers/700", - "hostname": "opbeans-node", - "pathname": "/api/customers/700", - "port": "3000", - "protocol": "http:", - "raw": "/api/customers/700", - }, - }, - "response": Object { - "headers": Object { - "connection": "keep-alive", - "content-length": "193", - "content-type": "application/json; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:52:56 GMT", - "etag": "W/\\"c1-LbuhkuLzFyZ0H+7+JQGA5b0kvNs\\"", - "x-powered-by": "Express", - }, - "status_code": 200, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "parent": Object { - "id": "aa82e2c847265626", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574376797031, - }, - "trace": Object { - "id": "e6140d30363f18b585f5d3b753f4d025", - }, - "transaction": Object { - "duration": Object { - "us": 9735, - }, - "id": "60e230d12f3f0960", - "name": "GET /api/customers/:id", - "result": "HTTP 2xx", - "sampled": true, - "span_count": Object { - "started": 1, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 59999.99999999999, - }, - Object { - "averageResponseTime": 12763.68806073154, - "impact": 1.7479924334286208, - "name": "GET /api/types/:id", - "p95": 30576.749999999996, - "sample": Object { - "@timestamp": "2018-11-18T20:53:35.967Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 5345, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3756, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "connection": "close", - "host": "opbeans-node:3000", - "user-agent": "workload/2.4.3", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/types/1", - "hostname": "opbeans-node", - "pathname": "/api/types/1", - "port": "3000", - "protocol": "http:", - "raw": "/api/types/1", - }, - }, - "response": Object { - "headers": Object { - "connection": "close", - "content-length": "217", - "content-type": "application/json; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:53:35 GMT", - "etag": "W/\\"d9-cebOOHODBQMZd1wt+ZZBaSPgQLQ\\"", - "x-powered-by": "Express", - }, - "status_code": 200, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574415967005, - }, - "trace": Object { - "id": "2223b30b5cbaf2e221fcf70ac6d9abbe", - }, - "transaction": Object { - "duration": Object { - "us": 13064, - }, - "id": "053436abacdec0a4", - "name": "GET /api/types/:id", - "result": "HTTP 2xx", - "sampled": true, - "span_count": Object { - "started": 2, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 45757.8947368421, - }, - Object { - "averageResponseTime": 10584.05144193297, - "impact": 1.280810614916383, - "name": "GET /api/orders/:id", - "p95": 26555.399999999998, - "sample": Object { - "@timestamp": "2018-11-18T20:51:36.949Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 5999, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3475, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "connection": "close", - "host": "opbeans-node:3000", - "user-agent": "workload/2.4.3", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/orders/183", - "hostname": "opbeans-node", - "pathname": "/api/orders/183", - "port": "3000", - "protocol": "http:", - "raw": "/api/orders/183", - }, - }, - "response": Object { - "headers": Object { - "connection": "close", - "content-length": "0", - "date": "Sun, 18 Nov 2018 20:51:36 GMT", - "x-powered-by": "Express", - }, - "status_code": 404, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574296949004, - }, - "trace": Object { - "id": "dab6421fa44a6869887e0edf32e1ad6f", - }, - "transaction": Object { - "duration": Object { - "us": 5906, - }, - "id": "937ef5588454f74a", - "name": "GET /api/orders/:id", - "result": "HTTP 4xx", - "sampled": true, - "span_count": Object { - "started": 1, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 40515.789473684206, - }, - Object { - "averageResponseTime": 1422.926672899693, - "impact": 1.0027124806135428, - "name": "GET unknown route", - "p95": 2311.885238095238, - "sample": Object { - "@timestamp": "2018-11-18T20:53:42.504Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3756, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "accept": "*/*", - "accept-encoding": "gzip, deflate", - "connection": "keep-alive", - "host": "opbeans-node:3000", - "referer": "http://opbeans-node:3000/dashboard", - "user-agent": "Chromeless 1.4.0", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.7", - }, - "url": Object { - "full": "http://opbeans-node:3000/rum-config.js", - "hostname": "opbeans-node", - "pathname": "/rum-config.js", - "port": "3000", - "protocol": "http:", - "raw": "/rum-config.js", - }, - }, - "response": Object { - "headers": Object { - "connection": "keep-alive", - "content-length": "172", - "content-type": "text/javascript", - "date": "Sun, 18 Nov 2018 20:53:42 GMT", - "x-powered-by": "Express", - }, - "status_code": 200, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574422504004, - }, - "trace": Object { - "id": "4399e7233e6e7b77e70c2fff111b8f28", - }, - "transaction": Object { - "duration": Object { - "us": 911, - }, - "id": "107881ae2be1b56d", - "name": "GET unknown route", - "result": "HTTP 2xx", - "sampled": true, - "span_count": Object { - "started": 0, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 236431.5789473684, - }, - Object { - "averageResponseTime": 21331.714285714286, - "impact": 0.28817487960409877, - "name": "POST /api", - "p95": 30938, - "sample": Object { - "@timestamp": "2018-11-18T20:29:42.751Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 2927, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 546, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "body": "[REDACTED]", - "headers": Object { - "accept": "application/json", - "connection": "close", - "content-length": "129", - "content-type": "application/json", - "host": "opbeans-node:3000", - "user-agent": "workload/2.4.3", - }, - "http_version": "1.1", - "method": "POST", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/api/orders", - "hostname": "opbeans-node", - "pathname": "/api/orders", - "port": "3000", - "protocol": "http:", - "raw": "/api/orders", - }, - }, - "response": Object { - "headers": Object { - "connection": "close", - "content-length": "0", - "date": "Sun, 18 Nov 2018 20:29:42 GMT", - "x-powered-by": "Express", - }, - "status_code": 400, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542572982751005, - }, - "trace": Object { - "id": "8ed4d94ec8fc11b1ea1b0aa59c2320ff", - }, - "transaction": Object { - "duration": Object { - "us": 21083, - }, - "id": "d67c2f7aa897110c", - "name": "POST /api", - "result": "HTTP 4xx", - "sampled": true, - "span_count": Object { - "started": 1, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 4642.105263157894, - }, - Object { - "averageResponseTime": 4694.005586592179, - "impact": 0.1498515000753004, - "name": "GET /is-it-coffee-time", - "p95": 11022.99999999992, - "sample": Object { - "@timestamp": "2018-11-18T20:46:19.317Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 8593, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 2760, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "connection": "close", - "host": "opbeans-node:3000", - "user-agent": "workload/2.4.3", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/is-it-coffee-time", - "hostname": "opbeans-node", - "pathname": "/is-it-coffee-time", - "port": "3000", - "protocol": "http:", - "raw": "/is-it-coffee-time", - }, - }, - "response": Object { - "headers": Object { - "connection": "close", - "content-length": "148", - "content-security-policy": "default-src 'self'", - "content-type": "text/html; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:46:19 GMT", - "x-content-type-options": "nosniff", - "x-powered-by": "Express", - }, - "status_code": 500, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542573979317007, - }, - "trace": Object { - "id": "821812b416de4c73ced87f8777fa46a6", - }, - "transaction": Object { - "duration": Object { - "us": 4253, - }, - "id": "319a5c555a1ab207", - "name": "GET /is-it-coffee-time", - "result": "HTTP 5xx", - "sampled": true, - "span_count": Object { - "started": 0, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 11305.263157894737, - }, - Object { - "averageResponseTime": 4549.889880952381, - "impact": 0.13543365054509587, - "name": "GET /throw-error", - "p95": 7719.700000000001, - "sample": Object { - "@timestamp": "2018-11-18T20:47:10.714Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 7220, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 2895, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "connection": "close", - "host": "opbeans-node:3000", - "user-agent": "workload/2.4.3", - }, - "http_version": "1.1", - "method": "GET", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/throw-error", - "hostname": "opbeans-node", - "pathname": "/throw-error", - "port": "3000", - "protocol": "http:", - "raw": "/throw-error", - }, - }, - "response": Object { - "headers": Object { - "connection": "close", - "content-length": "148", - "content-security-policy": "default-src 'self'", - "content-type": "text/html; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:47:10 GMT", - "x-content-type-options": "nosniff", - "x-powered-by": "Express", - }, - "status_code": 500, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574030714012, - }, - "trace": Object { - "id": "6c0ef23e1f963f304ce440a909914d35", - }, - "transaction": Object { - "duration": Object { - "us": 4458, - }, - "id": "ecd187dc53f09fbd", - "name": "GET /throw-error", - "result": "HTTP 5xx", - "sampled": true, - "span_count": Object { - "started": 0, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 10610.526315789473, - }, - Object { - "averageResponseTime": 2742.4615384615386, - "impact": 0.08501028923348058, - "name": "OPTIONS unknown route", - "p95": 4370.000000000002, - "sample": Object { - "@timestamp": "2018-11-18T20:49:00.707Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 3775, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 3142, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "headers": Object { - "connection": "close", - "content-length": "0", - "host": "opbeans-node:3000", - "user-agent": "workload/2.4.3", - }, - "http_version": "1.1", - "method": "OPTIONS", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.10", - }, - "url": Object { - "full": "http://opbeans-node:3000/", - "hostname": "opbeans-node", - "pathname": "/", - "port": "3000", - "protocol": "http:", - "raw": "/", - }, - }, - "response": Object { - "headers": Object { - "allow": "GET,HEAD", - "connection": "close", - "content-length": "8", - "content-type": "text/html; charset=utf-8", - "date": "Sun, 18 Nov 2018 20:49:00 GMT", - "etag": "W/\\"8-ZRAf8oNBS3Bjb/SU2GYZCmbtmXg\\"", - "x-powered-by": "Express", - }, - "status_code": 200, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542574140707006, - }, - "trace": Object { - "id": "469e3e5f91ffe3195a8e58cdd1cdefa8", - }, - "transaction": Object { - "duration": Object { - "us": 2371, - }, - "id": "a8c87ebc7ec68bc0", - "name": "OPTIONS unknown route", - "result": "HTTP 2xx", - "sampled": true, - "span_count": Object { - "started": 0, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 11494.736842105262, - }, - Object { - "averageResponseTime": 5192.9, - "impact": 0, - "name": "POST unknown route", - "p95": 13230.5, - "sample": Object { - "@timestamp": "2018-11-18T18:43:50.994Z", - "agent": Object { - "hostname": "b359e3afece8", - "type": "apm-server", - "version": "7.0.0-alpha1", - }, - "context": Object { - "custom": Object { - "containerId": 6102, - }, - "process": Object { - "argv": Array [ - "/usr/local/bin/node", - "/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js", - ], - "pid": 19196, - "ppid": 1, - "title": "node /app/server.js", - }, - "request": Object { - "body": "[REDACTED]", - "headers": Object { - "accept": "*/*", - "accept-encoding": "gzip, deflate", - "content-length": "380", - "content-type": "multipart/form-data; boundary=2b2e40be188a4cb5a56c05a0c182f6c9", - "elastic-apm-traceparent": "00-19688959ea6cbccda8013c11566ea329-1fc3665eef2dcdfc-01", - "host": "172.18.0.9:3000", - "user-agent": "Python/3.7 aiohttp/3.3.2", - "x-forwarded-for": "172.18.0.11", - }, - "http_version": "1.1", - "method": "POST", - "socket": Object { - "encrypted": false, - "remote_address": "::ffff:172.18.0.9", - }, - "url": Object { - "full": "http://172.18.0.9:3000/api/orders/csv", - "hostname": "172.18.0.9", - "pathname": "/api/orders/csv", - "port": "3000", - "protocol": "http:", - "raw": "/api/orders/csv", - }, - }, - "response": Object { - "headers": Object { - "connection": "keep-alive", - "content-length": "154", - "content-security-policy": "default-src 'self'", - "content-type": "text/html; charset=utf-8", - "date": "Sun, 18 Nov 2018 18:43:50 GMT", - "x-content-type-options": "nosniff", - "x-powered-by": "Express", - }, - "status_code": 404, - }, - "service": Object { - "agent": Object { - "name": "nodejs", - "version": "1.14.2", - }, - "language": Object { - "name": "javascript", - }, - "name": "opbeans-node", - "runtime": Object { - "name": "node", - "version": "8.12.0", - }, - "version": "1.0.0", - }, - "system": Object { - "architecture": "x64", - "hostname": "98195610c255", - "ip": "172.18.0.10", - "platform": "linux", - }, - "tags": Object { - "foo": "bar", - "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", - "multi-line": "foo -bar -baz", - "this-is-a-very-long-tag-name-without-any-spaces": "test", - }, - "user": Object { - "email": "kimchy@elastic.co", - "id": "42", - "username": "kimchy", - }, - }, - "host": Object { - "name": "b359e3afece8", - }, - "parent": Object { - "id": "1fc3665eef2dcdfc", - }, - "processor": Object { - "event": "transaction", - "name": "transaction", - }, - "timestamp": Object { - "us": 1542566630994005, - }, - "trace": Object { - "id": "19688959ea6cbccda8013c11566ea329", - }, - "transaction": Object { - "duration": Object { - "us": 3467, - }, - "id": "92c3ceea57899061", - "name": "POST unknown route", - "result": "HTTP 4xx", - "sampled": true, - "span_count": Object { - "started": 0, - }, - "type": "request", - }, - }, - "transactionsPerMinute": 631.578947368421, - }, -] -`; diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.test.ts b/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.test.ts deleted file mode 100644 index a26c3d85a3fc4..0000000000000 --- a/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { transactionGroupsFetcher } from './fetcher'; -import { APMConfig } from '../..'; - -function getSetup() { - return { - start: 1528113600000, - end: 1528977600000, - client: { - search: jest.fn(), - } as any, - internalClient: { - search: jest.fn(), - } as any, - config: { - 'xpack.apm.ui.transactionGroupBucketSize': 100, - } as APMConfig, - uiFiltersES: [{ term: { 'service.environment': 'test' } }], - indices: { - 'apm_oss.sourcemapIndices': 'myIndex', - 'apm_oss.errorIndices': 'myIndex', - 'apm_oss.onboardingIndices': 'myIndex', - 'apm_oss.spanIndices': 'myIndex', - 'apm_oss.transactionIndices': 'myIndex', - 'apm_oss.metricsIndices': 'myIndex', - apmAgentConfigurationIndex: 'myIndex', - apmCustomLinkIndex: 'myIndex', - }, - dynamicIndexPattern: null as any, - }; -} - -describe('transactionGroupsFetcher', () => { - describe('type: top_traces', () => { - it('should call client.search with correct query', async () => { - const setup = getSetup(); - const bucketSize = 100; - await transactionGroupsFetcher({ type: 'top_traces' }, setup, bucketSize); - expect(setup.client.search.mock.calls).toMatchSnapshot(); - }); - }); - - describe('type: top_transactions', () => { - it('should call client.search with correct query', async () => { - const setup = getSetup(); - const bucketSize = 100; - await transactionGroupsFetcher( - { - type: 'top_transactions', - serviceName: 'opbeans-node', - transactionType: 'request', - }, - setup, - bucketSize - ); - expect(setup.client.search.mock.calls).toMatchSnapshot(); - }); - }); -}); diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts b/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts index a5cc74b18a7ef..73bf1d01924e7 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts @@ -3,23 +3,31 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - +import { take, sortBy } from 'lodash'; +import { Unionize } from 'utility-types'; +import moment from 'moment'; +import { joinByKey } from '../../../common/utils/join_by_key'; +import { ESSearchRequest } from '../../../typings/elasticsearch'; import { SERVICE_NAME, - TRANSACTION_DURATION, - TRANSACTION_SAMPLED, TRANSACTION_NAME, } from '../../../common/elasticsearch_fieldnames'; import { getTransactionGroupsProjection } from '../../../common/projections/transaction_groups'; import { mergeProjection } from '../../../common/projections/util/merge_projection'; import { PromiseReturnType } from '../../../../observability/typings/common'; -import { SortOptions } from '../../../typings/elasticsearch/aggregations'; +import { AggregationOptionsByType } from '../../../typings/elasticsearch/aggregations'; import { Transaction } from '../../../typings/es_schemas/ui/transaction'; import { Setup, SetupTimeRange, SetupUIFilters, } from '../helpers/setup_request'; +import { + getSamples, + getAverages, + getSums, + getPercentiles, +} from './get_transaction_group_stats'; interface TopTransactionOptions { type: 'top_transactions'; @@ -36,68 +44,149 @@ interface TopTraceOptions { export type Options = TopTransactionOptions | TopTraceOptions; export type ESResponse = PromiseReturnType; + +export type TransactionGroupRequestBase = ESSearchRequest & { + body: { + aggs: { + transaction_groups: Unionize< + Pick + >; + }; + }; +}; + +export type TransactionGroupSetup = Setup & SetupTimeRange & SetupUIFilters; + +function getItemsWithRelativeImpact( + setup: TransactionGroupSetup, + items: Array<{ + sum?: number | null; + key: string | Record; + avg?: number | null; + count?: number | null; + p95?: number; + sample?: Transaction; + }> +) { + const values = items + .map(({ sum }) => sum) + .filter((value) => value !== null) as number[]; + + const max = Math.max(...values); + const min = Math.min(...values); + + const duration = moment.duration(setup.end - setup.start); + const minutes = duration.asMinutes(); + + const itemsWithRelativeImpact: TransactionGroup[] = items + .map((item) => { + return { + key: item.key, + averageResponseTime: item.avg, + transactionsPerMinute: (item.count ?? 0) / minutes, + impact: + item.sum !== null && item.sum !== undefined + ? ((item.sum - min) / (max - min)) * 100 || 0 + : 0, + p95: item.p95, + sample: item.sample!, + }; + }) + .filter((item) => item.sample); + + return itemsWithRelativeImpact; +} + export async function transactionGroupsFetcher( options: Options, - setup: Setup & SetupTimeRange & SetupUIFilters, + setup: TransactionGroupSetup, bucketSize: number ) { - const { client } = setup; - const projection = getTransactionGroupsProjection({ setup, options, }); - const sort: SortOptions = [ - { _score: 'desc' as const }, // sort by _score to ensure that buckets with sampled:true ends up on top - { '@timestamp': { order: 'desc' as const } }, - ]; - const isTopTraces = options.type === 'top_traces'; - if (isTopTraces) { - // Delete the projection aggregation when searching for traces, as it should use the combined aggregation instead - delete projection.body.aggs; - } + delete projection.body.aggs; + + // traces overview is hardcoded to 10000 + // transactions overview: 1 extra bucket is added to check whether the total number of buckets exceed the specified bucket size. + const expectedBucketSize = isTopTraces ? 10000 : bucketSize; + const size = isTopTraces ? 10000 : expectedBucketSize + 1; - const params = mergeProjection(projection, { + const request = mergeProjection(projection, { + size: 0, body: { - size: 0, - query: { - bool: { - // prefer sampled transactions - should: [{ term: { [TRANSACTION_SAMPLED]: true } }], - }, - }, aggs: { transaction_groups: { - composite: { - // traces overview is hardcoded to 10000 - // transactions overview: 1 extra bucket is added to check whether the total number of buckets exceed the specified bucket size. - size: isTopTraces ? 10000 : bucketSize + 1, - sources: [ - ...(isTopTraces - ? [{ service: { terms: { field: SERVICE_NAME } } }] - : []), - { transaction: { terms: { field: TRANSACTION_NAME } } }, - ], - }, - aggs: { - sample: { top_hits: { size: 1, sort } }, - avg: { avg: { field: TRANSACTION_DURATION } }, - p95: { - percentiles: { - field: TRANSACTION_DURATION, - percents: [95], - hdr: { number_of_significant_value_digits: 2 }, - }, - }, - sum: { sum: { field: TRANSACTION_DURATION } }, - }, + ...(isTopTraces + ? { + composite: { + sources: [ + { [SERVICE_NAME]: { terms: { field: SERVICE_NAME } } }, + { + [TRANSACTION_NAME]: { + terms: { field: TRANSACTION_NAME }, + }, + }, + ], + size, + }, + } + : { + terms: { + field: TRANSACTION_NAME, + size, + }, + }), }, }, }, }); - return client.search(params); + const params = { + request, + setup, + }; + + const [samples, averages, sums, percentiles] = await Promise.all([ + getSamples(params), + getAverages(params), + getSums(params), + !isTopTraces ? getPercentiles(params) : Promise.resolve(undefined), + ]); + + const stats = [ + ...samples, + ...averages, + ...sums, + ...(percentiles ? percentiles : []), + ]; + + const items = joinByKey(stats, 'key'); + + const itemsWithRelativeImpact = getItemsWithRelativeImpact(setup, items); + + return { + items: take( + // sort by impact by default so most impactful services are not cut off + sortBy(itemsWithRelativeImpact, 'impact').reverse(), + expectedBucketSize + ), + // The aggregation is considered accurate if the configured bucket size is larger or equal to the number of buckets returned + // the actual number of buckets retrieved are `bucketsize + 1` to detect whether it's above the limit + isAggregationAccurate: expectedBucketSize >= itemsWithRelativeImpact.length, + bucketSize, + }; +} + +export interface TransactionGroup { + key: Record | string; + averageResponseTime: number | null | undefined; + transactionsPerMinute: number; + p95: number | undefined; + impact: number; + sample: Transaction; } diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/get_transaction_group_stats.ts b/x-pack/plugins/apm/server/lib/transaction_groups/get_transaction_group_stats.ts new file mode 100644 index 0000000000000..59fb370113ec2 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/transaction_groups/get_transaction_group_stats.ts @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { merge } from 'lodash'; +import { arrayUnionToCallable } from '../../../common/utils/array_union_to_callable'; +import { Transaction } from '../../../typings/es_schemas/ui/transaction'; +import { + TRANSACTION_SAMPLED, + TRANSACTION_DURATION, +} from '../../../common/elasticsearch_fieldnames'; +import { + AggregationInputMap, + SortOptions, +} from '../../../typings/elasticsearch/aggregations'; +import { TransactionGroupRequestBase, TransactionGroupSetup } from './fetcher'; + +interface MetricParams { + request: TransactionGroupRequestBase; + setup: TransactionGroupSetup; +} + +type BucketKey = string | Record; + +function mergeRequestWithAggs< + TRequestBase extends TransactionGroupRequestBase, + TInputMap extends AggregationInputMap +>(request: TRequestBase, aggs: TInputMap) { + return merge({}, request, { + body: { + aggs: { + transaction_groups: { + aggs, + }, + }, + }, + }); +} + +export async function getSamples({ request, setup }: MetricParams) { + const params = mergeRequestWithAggs(request, { + sample: { + top_hits: { + size: 1, + }, + }, + }); + + const sort: SortOptions = [ + { _score: 'desc' as const }, // sort by _score to ensure that buckets with sampled:true ends up on top + { '@timestamp': { order: 'desc' as const } }, + ]; + + const response = await setup.client.search({ + ...params, + body: { + ...params.body, + query: { + ...params.body.query, + bool: { + ...params.body.query.bool, + should: [{ term: { [TRANSACTION_SAMPLED]: true } }], + }, + }, + sort, + }, + }); + + return arrayUnionToCallable( + response.aggregations?.transaction_groups.buckets ?? [] + ).map((bucket) => { + return { + key: bucket.key as BucketKey, + count: bucket.doc_count, + sample: bucket.sample.hits.hits[0]._source as Transaction, + }; + }); +} + +export async function getAverages({ request, setup }: MetricParams) { + const params = mergeRequestWithAggs(request, { + avg: { + avg: { + field: TRANSACTION_DURATION, + }, + }, + }); + + const response = await setup.client.search(params); + + return arrayUnionToCallable( + response.aggregations?.transaction_groups.buckets ?? [] + ).map((bucket) => { + return { + key: bucket.key as BucketKey, + avg: bucket.avg.value, + }; + }); +} + +export async function getSums({ request, setup }: MetricParams) { + const params = mergeRequestWithAggs(request, { + sum: { + sum: { + field: TRANSACTION_DURATION, + }, + }, + }); + + const response = await setup.client.search(params); + + return arrayUnionToCallable( + response.aggregations?.transaction_groups.buckets ?? [] + ).map((bucket) => { + return { + key: bucket.key as BucketKey, + sum: bucket.sum.value, + }; + }); +} + +export async function getPercentiles({ request, setup }: MetricParams) { + const params = mergeRequestWithAggs(request, { + p95: { + percentiles: { + field: TRANSACTION_DURATION, + hdr: { number_of_significant_value_digits: 2 }, + percents: [95], + }, + }, + }); + + const response = await setup.client.search(params); + + return arrayUnionToCallable( + response.aggregations?.transaction_groups.buckets ?? [] + ).map((bucket) => { + return { + key: bucket.key as BucketKey, + p95: Object.values(bucket.p95.values)[0], + }; + }); +} diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/index.ts b/x-pack/plugins/apm/server/lib/transaction_groups/index.ts index 893e586b351a8..6e0d619268d44 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/index.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/index.ts @@ -10,19 +10,11 @@ import { SetupUIFilters, } from '../helpers/setup_request'; import { transactionGroupsFetcher, Options } from './fetcher'; -import { transactionGroupsTransformer } from './transform'; export async function getTransactionGroupList( options: Options, setup: Setup & SetupTimeRange & SetupUIFilters ) { - const { start, end } = setup; const bucketSize = setup.config['xpack.apm.ui.transactionGroupBucketSize']; - const response = await transactionGroupsFetcher(options, setup, bucketSize); - return transactionGroupsTransformer({ - response, - start, - end, - bucketSize, - }); + return await transactionGroupsFetcher(options, setup, bucketSize); } diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/queries.test.ts b/x-pack/plugins/apm/server/lib/transaction_groups/queries.test.ts index 2c5aa79bb3483..0b2ff3a72975b 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/queries.test.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/queries.test.ts @@ -31,7 +31,9 @@ describe('transaction group queries', () => { ) ); - expect(mock.params).toMatchSnapshot(); + const allParams = mock.spy.mock.calls.map((call) => call[0]); + + expect(allParams).toMatchSnapshot(); }); it('fetches top traces', async () => { @@ -46,6 +48,8 @@ describe('transaction group queries', () => { ) ); - expect(mock.params).toMatchSnapshot(); + const allParams = mock.spy.mock.calls.map((call) => call[0]); + + expect(allParams).toMatchSnapshot(); }); }); diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/transform.test.ts b/x-pack/plugins/apm/server/lib/transaction_groups/transform.test.ts deleted file mode 100644 index 0bb29e27f0219..0000000000000 --- a/x-pack/plugins/apm/server/lib/transaction_groups/transform.test.ts +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { ESResponse } from './fetcher'; -import { transactionGroupsResponse } from './mock_responses/transaction_groups_response'; -import { transactionGroupsTransformer } from './transform'; - -describe('transactionGroupsTransformer', () => { - it('should match snapshot', () => { - const { - bucketSize, - isAggregationAccurate, - items, - } = transactionGroupsTransformer({ - response: transactionGroupsResponse, - start: 100, - end: 2000, - bucketSize: 100, - }); - - expect(bucketSize).toBe(100); - expect(isAggregationAccurate).toBe(true); - expect(items).toMatchSnapshot(); - }); - - it('should transform response correctly', () => { - const bucket = { - key: { transaction: 'POST /api/orders' }, - doc_count: 180, - avg: { value: 255966.30555555556 }, - p95: { values: { '95.0': 320238.5 } }, - sum: { value: 3000000000 }, - sample: { - hits: { - total: 180, - hits: [{ _source: 'sample source' }], - }, - }, - }; - - const response = ({ - aggregations: { - transaction_groups: { - buckets: [bucket], - }, - }, - } as unknown) as ESResponse; - - expect( - transactionGroupsTransformer({ - response, - start: 100, - end: 20000, - bucketSize: 100, - }) - ).toEqual({ - bucketSize: 100, - isAggregationAccurate: true, - items: [ - { - averageResponseTime: 255966.30555555556, - impact: 0, - name: 'POST /api/orders', - p95: 320238.5, - sample: 'sample source', - transactionsPerMinute: 542.713567839196, - }, - ], - }); - }); - - it('`isAggregationAccurate` should be false if number of bucket is higher than `bucketSize`', () => { - const bucket = { - key: { transaction: 'POST /api/orders' }, - doc_count: 180, - avg: { value: 255966.30555555556 }, - p95: { values: { '95.0': 320238.5 } }, - sum: { value: 3000000000 }, - sample: { - hits: { - total: 180, - hits: [{ _source: 'sample source' }], - }, - }, - }; - - const response = ({ - aggregations: { - transaction_groups: { - buckets: [bucket, bucket, bucket, bucket], // four buckets returned - }, - }, - } as unknown) as ESResponse; - - const { isAggregationAccurate } = transactionGroupsTransformer({ - response, - start: 100, - end: 20000, - bucketSize: 3, // bucket size of three - }); - - expect(isAggregationAccurate).toEqual(false); - }); - - it('should calculate impact from sum', () => { - const getBucket = (sum: number) => ({ - key: { transaction: 'POST /api/orders' }, - doc_count: 180, - avg: { value: 300000 }, - p95: { values: { '95.0': 320000 } }, - sum: { value: sum }, - sample: { hits: { total: 180, hits: [{ _source: 'sample source' }] } }, - }); - - const response = ({ - aggregations: { - transaction_groups: { - buckets: [getBucket(10), getBucket(20), getBucket(50)], - }, - }, - } as unknown) as ESResponse; - - const { items } = transactionGroupsTransformer({ - response, - start: 100, - end: 20000, - bucketSize: 100, - }); - - expect(items.map((bucket) => bucket.impact)).toEqual([100, 25, 0]); - }); -}); diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/transform.ts b/x-pack/plugins/apm/server/lib/transaction_groups/transform.ts deleted file mode 100644 index b04ff6764675d..0000000000000 --- a/x-pack/plugins/apm/server/lib/transaction_groups/transform.ts +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import moment from 'moment'; -import { orderBy } from 'lodash'; -import { ESResponse } from './fetcher'; - -function calculateRelativeImpacts(items: ITransactionGroup[]) { - const values = items - .map(({ impact }) => impact) - .filter((value) => value !== null) as number[]; - - const max = Math.max(...values); - const min = Math.min(...values); - - return items.map((bucket) => ({ - ...bucket, - impact: - bucket.impact !== null - ? ((bucket.impact - min) / (max - min)) * 100 || 0 - : 0, - })); -} - -const getBuckets = (response: ESResponse) => { - if (response.aggregations) { - return orderBy( - response.aggregations.transaction_groups.buckets, - ['sum.value'], - ['desc'] - ); - } - return []; -}; - -export type ITransactionGroup = ReturnType; -function getTransactionGroup( - bucket: ReturnType[0], - minutes: number -) { - const averageResponseTime = bucket.avg.value; - const transactionsPerMinute = bucket.doc_count / minutes; - const impact = bucket.sum.value; - const sample = bucket.sample.hits.hits[0]._source; - - return { - name: bucket.key.transaction, - sample, - p95: bucket.p95.values['95.0'], - averageResponseTime, - transactionsPerMinute, - impact, - }; -} - -export function transactionGroupsTransformer({ - response, - start, - end, - bucketSize, -}: { - response: ESResponse; - start: number; - end: number; - bucketSize: number; -}): { - items: ITransactionGroup[]; - isAggregationAccurate: boolean; - bucketSize: number; -} { - const buckets = getBuckets(response); - const duration = moment.duration(end - start); - const minutes = duration.asMinutes(); - const items = buckets.map((bucket) => getTransactionGroup(bucket, minutes)); - - const itemsWithRelativeImpact = calculateRelativeImpacts(items); - - return { - items: itemsWithRelativeImpact, - - // The aggregation is considered accurate if the configured bucket size is larger or equal to the number of buckets returned - // the actual number of buckets retrieved are `bucketsize + 1` to detect whether it's above the limit - isAggregationAccurate: bucketSize >= buckets.length, - bucketSize, - }; -} diff --git a/x-pack/plugins/apm/server/lib/ui_filters/local_ui_filters/get_local_filter_query.ts b/x-pack/plugins/apm/server/lib/ui_filters/local_ui_filters/get_local_filter_query.ts index 1cecf14f2eeb8..e892284fd87cd 100644 --- a/x-pack/plugins/apm/server/lib/ui_filters/local_ui_filters/get_local_filter_query.ts +++ b/x-pack/plugins/apm/server/lib/ui_filters/local_ui_filters/get_local_filter_query.ts @@ -35,7 +35,7 @@ export const getLocalFilterQuery = ({ }, }, } - : {}; + : null; return mergeProjection(projection, { body: { diff --git a/x-pack/plugins/apm/server/lib/ui_filters/local_ui_filters/index.ts b/x-pack/plugins/apm/server/lib/ui_filters/local_ui_filters/index.ts index 588d5c7896db9..3833b93c8d1f7 100644 --- a/x-pack/plugins/apm/server/lib/ui_filters/local_ui_filters/index.ts +++ b/x-pack/plugins/apm/server/lib/ui_filters/local_ui_filters/index.ts @@ -43,6 +43,7 @@ export async function getLocalUIFilters({ const response = await client.search(query); const filter = localUIFilters[name]; + const buckets = response?.aggregations?.by_terms?.buckets ?? []; return { diff --git a/x-pack/plugins/apm/typings/elasticsearch/aggregations.ts b/x-pack/plugins/apm/typings/elasticsearch/aggregations.ts index ac7499c23e926..d25ec8709e3be 100644 --- a/x-pack/plugins/apm/typings/elasticsearch/aggregations.ts +++ b/x-pack/plugins/apm/typings/elasticsearch/aggregations.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Unionize } from 'utility-types'; +import { Unionize, UnionToIntersection } from 'utility-types'; type SortOrder = 'asc' | 'desc'; type SortInstruction = Record; @@ -288,10 +288,13 @@ interface AggregationResponsePart< } | undefined; composite: { - after_key: Record, number>; + after_key: Record< + GetCompositeKeys, + string | number + >; buckets: Array< { - key: Record, number>; + key: Record, string | number>; doc_count: number; } & BucketSubAggregationResponse< TAggregationOptionsMap['aggs'], @@ -337,6 +340,15 @@ interface AggregationResponsePart< // keyof AggregationResponsePart<{}, unknown> // >; +// ensures aggregations work with requests where aggregation options are a union type, +// e.g. { transaction_groups: { composite: any } | { terms: any } }. +// Union keys are not included in keyof. The type will fall back to keyof T if +// UnionToIntersection fails, which happens when there are conflicts between the union +// types, e.g. { foo: string; bar?: undefined } | { foo?: undefined; bar: string }; +export type ValidAggregationKeysOf< + T extends Record +> = keyof (UnionToIntersection extends never ? T : UnionToIntersection); + export type AggregationResponseMap< TAggregationInputMap extends AggregationInputMap | undefined, TDocument @@ -345,6 +357,6 @@ export type AggregationResponseMap< [TName in keyof TAggregationInputMap]: AggregationResponsePart< TAggregationInputMap[TName], TDocument - >[AggregationType & keyof TAggregationInputMap[TName]]; + >[AggregationType & ValidAggregationKeysOf]; } : undefined; diff --git a/x-pack/test/apm_api_integration/basic/tests/traces/expectation/top_traces.expectation.json b/x-pack/test/apm_api_integration/basic/tests/traces/expectation/top_traces.expectation.json index bacb340292f93..4db040e92e7fa 100644 --- a/x-pack/test/apm_api_integration/basic/tests/traces/expectation/top_traces.expectation.json +++ b/x-pack/test/apm_api_integration/basic/tests/traces/expectation/top_traces.expectation.json @@ -1,20 +1,35 @@ [ { - "name": "Process payment", + "key": { + "service.name": "opbeans-node", + "transaction.name": "Process payment" + }, + "averageResponseTime": 1745009, + "transactionsPerMinute": 0.25, + "impact": 100, "sample": { "@timestamp": "2020-06-29T06:48:29.892Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:39.379730Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:39.379730Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "observer": { "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", @@ -34,59 +49,97 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "timestamp": { "us": 1593413309892019 }, - "trace": { "id": "bc393b659bef63291b6fa08e6f1d3f14" }, + "timestamp": { + "us": 1593413309892019 + }, + "trace": { + "id": "bc393b659bef63291b6fa08e6f1d3f14" + }, "transaction": { - "duration": { "us": 1745009 }, + "duration": { + "us": 1745009 + }, "id": "a58333df6d851cf1", "name": "Process payment", "result": "success", "sampled": true, - "span_count": { "started": 2 }, + "span_count": { + "started": 2 + }, "type": "Worker" } - }, - "p95": 1744896, - "averageResponseTime": 1745009, - "transactionsPerMinute": 0.25, - "impact": 100 + } }, { - "name": "GET /api", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /api" + }, + "averageResponseTime": 49816.15625, + "transactionsPerMinute": 8, + "impact": 91.32732325394932, "sample": { - "@timestamp": "2020-06-29T06:48:41.454Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "@timestamp": "2020-06-29T06:48:06.969Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.992834Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:08.306961Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -96,11 +149,18 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Type": ["application/json;charset=UTF-8"], - "Date": ["Mon, 29 Jun 2020 06:48:41 GMT"], - "Transfer-Encoding": ["chunked"], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "0" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:06 GMT" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -130,61 +190,103 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413321454009 }, - "trace": { "id": "0507830eeff93f7bf1a354e4031097b3" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413286969018 + }, + "trace": { + "id": "87a828bcedd44d9e872d8f552fb04aa6" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 8334 }, - "id": "878250a8b937445d", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 25229 + }, + "id": "b1843afd04271423", "name": "GET /api", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 1 }, + "span_count": { + "started": 1 + }, "type": "request" }, "url": { "domain": "opbeans-node", - "full": "http://opbeans-node:3000/api/products/6", - "original": "/api/products/6", - "path": "/api/products/6", + "full": "http://opbeans-node:3000/api/orders/474", + "original": "/api/orders/474", + "path": "/api/orders/474", "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 81888, - "averageResponseTime": 49816.15625, - "transactionsPerMinute": 8, - "impact": 91.32732325394932 + } }, { - "name": "/dashboard", + "key": { + "service.name": "client", + "transaction.name": "/dashboard" + }, + "averageResponseTime": 208000, + "transactionsPerMinute": 0.75, + "impact": 35.56882613781033, "sample": { - "@timestamp": "2020-06-29T06:48:21.621Z", - "agent": { "name": "rum-js", "version": "5.2.0" }, - "client": { "ip": "172.18.0.8" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:22.625275Z" }, + "@timestamp": "2020-06-29T06:48:07.275Z", + "agent": { + "name": "rum-js", + "version": "5.2.0" + }, + "client": { + "ip": "172.18.0.8" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:08.291261Z" + }, "http": { - "request": { "referrer": "" }, + "request": { + "referrer": "" + }, "response": { "decoded_body_size": 813, "encoded_body_size": 813, @@ -199,52 +301,73 @@ "version": "8.0.0", "version_major": 8 }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { - "language": { "name": "javascript" }, + "language": { + "name": "javascript" + }, "name": "client", "version": "1.0.0" }, - "source": { "ip": "172.18.0.8" }, - "timestamp": { "us": 1593413301621808 }, - "trace": { "id": "ee0ce8b38b8d5945829fc1c9432538bf" }, + "source": { + "ip": "172.18.0.8" + }, + "timestamp": { + "us": 1593413287275113 + }, + "trace": { + "id": "ca86ffcac7753ec8733933bd8fd45d11" + }, "transaction": { "custom": { "userConfig": { - "featureFlags": ["double-trouble", "4423-hotfix"], + "featureFlags": [ + "double-trouble", + "4423-hotfix" + ], "showDashboard": true } }, - "duration": { "us": 109000 }, - "id": "c546a6716b681bf2", + "duration": { + "us": 342000 + }, + "id": "c40f735132c8e864", "marks": { "agent": { - "domComplete": 98, - "domInteractive": 87, - "timeToFirstByte": 3 + "domComplete": 335, + "domInteractive": 327, + "timeToFirstByte": 16 }, "navigationTiming": { - "connectEnd": 0, - "connectStart": 0, - "domComplete": 98, - "domContentLoadedEventEnd": 87, - "domContentLoadedEventStart": 87, - "domInteractive": 87, - "domLoading": 8, - "domainLookupEnd": 0, - "domainLookupStart": 0, + "connectEnd": 12, + "connectStart": 12, + "domComplete": 335, + "domContentLoadedEventEnd": 327, + "domContentLoadedEventStart": 327, + "domInteractive": 327, + "domLoading": 21, + "domainLookupEnd": 12, + "domainLookupStart": 10, "fetchStart": 0, - "loadEventEnd": 98, - "loadEventStart": 98, - "requestStart": 1, - "responseEnd": 8, - "responseStart": 3 + "loadEventEnd": 335, + "loadEventStart": 335, + "requestStart": 12, + "responseEnd": 17, + "responseStart": 16 } }, "name": "/dashboard", - "page": { "referer": "", "url": "http://opbeans-node:3000/dashboard" }, + "page": { + "referer": "", + "url": "http://opbeans-node:3000/dashboard" + }, "sampled": true, - "span_count": { "started": 8 }, + "span_count": { + "started": 9 + }, "type": "page-load" }, "url": { @@ -261,50 +384,75 @@ "name": "arthurdent" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "HeadlessChrome", "original": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", - "os": { "name": "Linux" }, + "os": { + "name": "Linux" + }, "version": "79.0.3945" } - }, - "p95": 341504, - "averageResponseTime": 208000, - "transactionsPerMinute": 0.75, - "impact": 35.56882613781033 + } }, { - "name": "DispatcherServlet#doGet", + "key": { + "service.name": "opbeans-java", + "transaction.name": "DispatcherServlet#doGet" + }, + "averageResponseTime": 36010.53846153846, + "transactionsPerMinute": 3.25, + "impact": 26.61043592713186, "sample": { - "@timestamp": "2020-06-29T06:48:40.104Z", + "@timestamp": "2020-06-29T06:48:10.529Z", "agent": { "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", "name": "java", "version": "1.17.1-SNAPSHOT" }, - "client": { "ip": "172.18.0.9" }, + "client": { + "ip": "172.18.0.9" + }, "container": { "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:46.706956Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:15.757591Z" + }, "host": { "architecture": "amd64", "hostname": "918ebbd99b4f", "ip": "172.18.0.6", "name": "918ebbd99b4f", - "os": { "platform": "Linux" } + "os": { + "platform": "Linux" + } }, "http": { "request": { "headers": { - "Accept": ["*/*"], - "Accept-Encoding": ["gzip, deflate"], - "Host": ["172.18.0.6:3000"], - "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + "Accept": [ + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Host": [ + "172.18.0.6:3000" + ], + "User-Agent": [ + "Python/3.7 aiohttp/3.3.2" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + "socket": { + "encrypted": false, + "remote_address": "172.18.0.9" + } }, "response": { "finished": true, @@ -321,77 +469,132 @@ "version": "8.0.0", "version_major": 8 }, - "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, - "processor": { "event": "transaction", "name": "transaction" }, + "process": { + "pid": 6, + "ppid": 1, + "title": "/opt/java/openjdk/bin/java" + }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "Servlet API" }, - "language": { "name": "Java", "version": "11.0.7" }, + "framework": { + "name": "Servlet API" + }, + "language": { + "name": "Java", + "version": "11.0.7" + }, "name": "opbeans-java", "node": { "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "runtime": { "name": "Java", "version": "11.0.7" }, + "runtime": { + "name": "Java", + "version": "11.0.7" + }, "version": "None" }, - "source": { "ip": "172.18.0.9" }, - "timestamp": { "us": 1593413320104008 }, - "trace": { "id": "90bd7780b32cc51a7f4c200b1e0c170f" }, + "source": { + "ip": "172.18.0.9" + }, + "timestamp": { + "us": 1593413290529006 + }, + "trace": { + "id": "66e3db4cf016b138a43d319d15174891" + }, "transaction": { - "duration": { "us": 8896 }, - "id": "40b22b21e92bbb20", + "duration": { + "us": 34366 + }, + "id": "7ea720a0175e7ffa", "name": "DispatcherServlet#doGet", "result": "HTTP 2xx", "sampled": true, - "span_count": { "dropped": 0, "started": 1 }, + "span_count": { + "dropped": 0, + "started": 1 + }, "type": "request" }, "url": { "domain": "172.18.0.6", - "full": "http://172.18.0.6:3000/api/orders", - "path": "/api/orders", + "full": "http://172.18.0.6:3000/api/products", + "path": "/api/products", "port": 3000, "scheme": "http" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "Python/3.7 aiohttp/3.3.2" } - }, - "p95": 34528, - "averageResponseTime": 36010.53846153846, - "transactionsPerMinute": 3.25, - "impact": 26.61043592713186 + } }, { - "name": "POST /api/orders", + "key": { + "service.name": "opbeans-node", + "transaction.name": "POST /api/orders" + }, + "averageResponseTime": 270684, + "transactionsPerMinute": 0.25, + "impact": 15.261616628971955, "sample": { "@timestamp": "2020-06-29T06:48:39.953Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.991549Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:43.991549Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { - "body": { "original": "[REDACTED]" }, + "body": { + "original": "[REDACTED]" + }, "headers": { - "Accept": ["application/json"], - "Connection": ["close"], - "Content-Length": ["129"], - "Content-Type": ["application/json"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Accept": [ + "application/json" + ], + "Connection": [ + "close" + ], + "Content-Length": [ + "129" + ], + "Content-Type": [ + "application/json" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "post", "socket": { @@ -401,12 +604,24 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["13"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:40 GMT"], - "Etag": ["W/\"d-eEOWU4Cnr5DZ23ErRUeYu9oOIks\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "13" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:40 GMT" + ], + "Etag": [ + "W/\"d-eEOWU4Cnr5DZ23ErRUeYu9oOIks\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -436,29 +651,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413319953033 }, - "trace": { "id": "52b8fda5f6df745b990740ba18378620" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413319953033 + }, + "trace": { + "id": "52b8fda5f6df745b990740ba18378620" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 270684 }, + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 270684 + }, "id": "a3afc2a112e9c893", "name": "POST /api/orders", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 16 }, + "span_count": { + "started": 16 + }, "type": "request" }, "url": { @@ -469,50 +707,77 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 270336, - "averageResponseTime": 270684, - "transactionsPerMinute": 0.25, - "impact": 15.261616628971955 + } }, { - "name": "ResourceHttpRequestHandler", + "key": { + "service.name": "opbeans-java", + "transaction.name": "ResourceHttpRequestHandler" + }, + "averageResponseTime": 14419.42857142857, + "transactionsPerMinute": 3.5, + "impact": 11.30657439844125, "sample": { - "@timestamp": "2020-06-29T06:48:44.376Z", + "@timestamp": "2020-06-29T06:48:06.640Z", "agent": { "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", "name": "java", "version": "1.17.1-SNAPSHOT" }, - "client": { "ip": "172.18.0.9" }, + "client": { + "ip": "172.18.0.9" + }, "container": { "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:46.720380Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:15.517678Z" + }, "host": { "architecture": "amd64", "hostname": "918ebbd99b4f", "ip": "172.18.0.6", "name": "918ebbd99b4f", - "os": { "platform": "Linux" } + "os": { + "platform": "Linux" + } }, "http": { "request": { "headers": { - "Accept": ["*/*"], - "Accept-Encoding": ["gzip, deflate"], - "Host": ["172.18.0.6:3000"], - "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + "Accept": [ + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Host": [ + "172.18.0.6:3000" + ], + "User-Agent": [ + "Python/3.7 aiohttp/3.3.2" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + "socket": { + "encrypted": false, + "remote_address": "172.18.0.9" + } }, "response": { "finished": true, @@ -529,63 +794,100 @@ "version": "8.0.0", "version_major": 8 }, - "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, - "processor": { "event": "transaction", "name": "transaction" }, + "process": { + "pid": 6, + "ppid": 1, + "title": "/opt/java/openjdk/bin/java" + }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, - "language": { "name": "Java", "version": "11.0.7" }, + "framework": { + "name": "Spring Web MVC", + "version": "5.0.6.RELEASE" + }, + "language": { + "name": "Java", + "version": "11.0.7" + }, "name": "opbeans-java", "node": { "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "runtime": { "name": "Java", "version": "11.0.7" }, + "runtime": { + "name": "Java", + "version": "11.0.7" + }, "version": "None" }, - "source": { "ip": "172.18.0.9" }, - "timestamp": { "us": 1593413324376010 }, - "trace": { "id": "7e70dc471913473e7d3bffda9b27d720" }, + "source": { + "ip": "172.18.0.9" + }, + "timestamp": { + "us": 1593413286640008 + }, + "trace": { + "id": "81d8ffb0a39e755eed400f6486e15672" + }, "transaction": { - "duration": { "us": 1420 }, - "id": "5c4e9f4b0846c2f8", + "duration": { + "us": 2953 + }, + "id": "353d42a2f9046e99", "name": "ResourceHttpRequestHandler", "result": "HTTP 4xx", "sampled": true, - "span_count": { "dropped": 0, "started": 0 }, + "span_count": { + "dropped": 0, + "started": 0 + }, "type": "request" }, "url": { "domain": "172.18.0.6", - "full": "http://172.18.0.6:3000/api/types", - "path": "/api/types", + "full": "http://172.18.0.6:3000/api/types/3", + "path": "/api/types/3", "port": 3000, "scheme": "http" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "Python/3.7 aiohttp/3.3.2" } - }, - "p95": 4120, - "averageResponseTime": 14419.42857142857, - "transactionsPerMinute": 3.5, - "impact": 11.30657439844125 + } }, { - "name": "/orders", + "key": { + "service.name": "client", + "transaction.name": "/orders" + }, + "averageResponseTime": 81500, + "transactionsPerMinute": 0.5, + "impact": 9.072365225837785, "sample": { - "@timestamp": "2020-06-29T06:48:38.358Z", - "agent": { "name": "rum-js", "version": "5.2.0" }, - "client": { "ip": "172.18.0.8" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:39.365914Z" }, + "@timestamp": "2020-06-29T06:48:29.296Z", + "agent": { + "name": "rum-js", + "version": "5.2.0" + }, + "client": { + "ip": "172.18.0.8" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:29.986555Z" + }, "http": { - "request": { "referrer": "" }, - "response": { - "decoded_body_size": 813, - "encoded_body_size": 813, - "transfer_size": 962 + "request": { + "referrer": "" } }, "observer": { @@ -596,53 +898,50 @@ "version": "8.0.0", "version_major": 8 }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { - "language": { "name": "javascript" }, + "language": { + "name": "javascript" + }, "name": "client", "version": "1.0.0" }, - "source": { "ip": "172.18.0.8" }, - "timestamp": { "us": 1593413318358392 }, - "trace": { "id": "c1dea08a4128e776fd9965ccf8c8da99" }, + "source": { + "ip": "172.18.0.8" + }, + "timestamp": { + "us": 1593413309296660 + }, + "trace": { + "id": "978b56807e0b7a27cbc41a0dfb665f47" + }, "transaction": { "custom": { "userConfig": { - "featureFlags": ["double-trouble", "4423-hotfix"], + "featureFlags": [ + "double-trouble", + "4423-hotfix" + ], "showDashboard": true } }, - "duration": { "us": 140000 }, - "id": "4f2ea2796645d6e5", - "marks": { - "agent": { - "domComplete": 126, - "domInteractive": 116, - "timeToFirstByte": 3 - }, - "navigationTiming": { - "connectEnd": 0, - "connectStart": 0, - "domComplete": 126, - "domContentLoadedEventEnd": 116, - "domContentLoadedEventStart": 116, - "domInteractive": 116, - "domLoading": 20, - "domainLookupEnd": 0, - "domainLookupStart": 0, - "fetchStart": 0, - "loadEventEnd": 126, - "loadEventStart": 126, - "requestStart": 1, - "responseEnd": 3, - "responseStart": 3 - } + "duration": { + "us": 23000 }, + "id": "c3801eadbdef5c7c", "name": "/orders", - "page": { "referer": "", "url": "http://opbeans-node:3000/orders" }, + "page": { + "referer": "", + "url": "http://opbeans-node:3000/orders" + }, "sampled": true, - "span_count": { "started": 7 }, - "type": "page-load" + "span_count": { + "started": 1 + }, + "type": "route-change" }, "url": { "domain": "opbeans-node", @@ -652,59 +951,94 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "adastra@example.com", "id": "3", "name": "trillian" }, + "user": { + "email": "arthur.dent@example.com", + "id": "1", + "name": "arthurdent" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "HeadlessChrome", "original": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", - "os": { "name": "Linux" }, + "os": { + "name": "Linux" + }, "version": "79.0.3945" } - }, - "p95": 140160, - "averageResponseTime": 81500, - "transactionsPerMinute": 0.5, - "impact": 9.072365225837785 + } }, { - "name": "APIRestController#customer", + "key": { + "service.name": "opbeans-java", + "transaction.name": "APIRestController#customer" + }, + "averageResponseTime": 19370.6, + "transactionsPerMinute": 1.25, + "impact": 5.270496679320978, "sample": { - "@timestamp": "2020-06-29T06:48:38.893Z", + "@timestamp": "2020-06-29T06:48:08.631Z", "agent": { "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", "name": "java", "version": "1.17.1-SNAPSHOT" }, - "client": { "ip": "172.18.0.9" }, + "client": { + "ip": "172.18.0.9" + }, "container": { "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:46.680126Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:15.536897Z" + }, "host": { "architecture": "amd64", "hostname": "918ebbd99b4f", "ip": "172.18.0.6", "name": "918ebbd99b4f", - "os": { "platform": "Linux" } + "os": { + "platform": "Linux" + } }, "http": { "request": { "headers": { - "Accept": ["*/*"], - "Accept-Encoding": ["gzip, deflate"], - "Host": ["172.18.0.6:3000"], - "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + "Accept": [ + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Host": [ + "172.18.0.6:3000" + ], + "User-Agent": [ + "Python/3.7 aiohttp/3.3.2" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + "socket": { + "encrypted": false, + "remote_address": "172.18.0.9" + } }, "response": { "finished": true, "headers": { - "Content-Type": ["application/json;charset=UTF-8"], - "Date": ["Mon, 29 Jun 2020 06:48:38 GMT"], - "Transfer-Encoding": ["chunked"] + "Content-Type": [ + "application/json;charset=UTF-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:08 GMT" + ], + "Transfer-Encoding": [ + "chunked" + ] }, "headers_sent": true, "status_code": 200 @@ -719,59 +1053,101 @@ "version": "8.0.0", "version_major": 8 }, - "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, - "processor": { "event": "transaction", "name": "transaction" }, + "process": { + "pid": 6, + "ppid": 1, + "title": "/opt/java/openjdk/bin/java" + }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, - "language": { "name": "Java", "version": "11.0.7" }, + "framework": { + "name": "Spring Web MVC", + "version": "5.0.6.RELEASE" + }, + "language": { + "name": "Java", + "version": "11.0.7" + }, "name": "opbeans-java", "node": { "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "runtime": { "name": "Java", "version": "11.0.7" }, + "runtime": { + "name": "Java", + "version": "11.0.7" + }, "version": "None" }, - "source": { "ip": "172.18.0.9" }, - "timestamp": { "us": 1593413318893006 }, - "trace": { "id": "efcf3446b51d080dbde1339969cf79a0" }, + "source": { + "ip": "172.18.0.9" + }, + "timestamp": { + "us": 1593413288631008 + }, + "trace": { + "id": "c00da24c5c793cd679ce3df47cee8f37" + }, "transaction": { - "duration": { "us": 4594 }, - "id": "31ef64d71933e846", + "duration": { + "us": 76826 + }, + "id": "3c8403055ff75866", "name": "APIRestController#customer", "result": "HTTP 2xx", "sampled": true, - "span_count": { "dropped": 0, "started": 2 }, + "span_count": { + "dropped": 0, + "started": 2 + }, "type": "request" }, "url": { "domain": "172.18.0.6", - "full": "http://172.18.0.6:3000/api/customers/235", - "path": "/api/customers/235", + "full": "http://172.18.0.6:3000/api/customers/56", + "path": "/api/customers/56", "port": 3000, "scheme": "http" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "Python/3.7 aiohttp/3.3.2" } - }, - "p95": 77280, - "averageResponseTime": 19370.6, - "transactionsPerMinute": 1.25, - "impact": 5.270496679320978 + } }, { - "name": "/products", + "key": { + "service.name": "client", + "transaction.name": "/products" + }, + "averageResponseTime": 77000, + "transactionsPerMinute": 0.25, + "impact": 4.129424578484989, "sample": { "@timestamp": "2020-06-29T06:48:48.824Z", - "agent": { "name": "rum-js", "version": "5.2.0" }, - "client": { "ip": "172.18.0.8" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:49.293664Z" }, + "agent": { + "name": "rum-js", + "version": "5.2.0" + }, + "client": { + "ip": "172.18.0.8" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:49.293664Z" + }, "http": { - "request": { "referrer": "" }, + "request": { + "referrer": "" + }, "response": { "decoded_body_size": 813, "encoded_body_size": 813, @@ -786,23 +1162,39 @@ "version": "8.0.0", "version_major": 8 }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { - "language": { "name": "javascript" }, + "language": { + "name": "javascript" + }, "name": "client", "version": "1.0.0" }, - "source": { "ip": "172.18.0.8" }, - "timestamp": { "us": 1593413328824656 }, - "trace": { "id": "f6c4a9197bbd080bd45072970f251525" }, + "source": { + "ip": "172.18.0.8" + }, + "timestamp": { + "us": 1593413328824656 + }, + "trace": { + "id": "f6c4a9197bbd080bd45072970f251525" + }, "transaction": { "custom": { "userConfig": { - "featureFlags": ["double-trouble", "4423-hotfix"], + "featureFlags": [ + "double-trouble", + "4423-hotfix" + ], "showDashboard": true } }, - "duration": { "us": 77000 }, + "duration": { + "us": 77000 + }, "id": "a11ede1968973bc5", "marks": { "agent": { @@ -829,9 +1221,14 @@ } }, "name": "/products", - "page": { "referer": "", "url": "http://opbeans-node:3000/products" }, + "page": { + "referer": "", + "url": "http://opbeans-node:3000/products" + }, "sampled": true, - "span_count": { "started": 5 }, + "span_count": { + "started": 5 + }, "type": "page-load" }, "url": { @@ -842,29 +1239,52 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "z@example.com", "id": "4", "name": "zaphod" }, + "user": { + "email": "z@example.com", + "id": "4", + "name": "zaphod" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "HeadlessChrome", "original": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", - "os": { "name": "Linux" }, + "os": { + "name": "Linux" + }, "version": "79.0.3945" } - }, - "p95": 76800, - "averageResponseTime": 77000, - "transactionsPerMinute": 0.25, - "impact": 4.129424578484989 + } }, { - "name": "/customers", + "key": { + "service.name": "client", + "transaction.name": "/customers" + }, + "averageResponseTime": 33500, + "transactionsPerMinute": 0.5, + "impact": 3.5546640380951287, "sample": { - "@timestamp": "2020-06-29T06:48:48.287Z", - "agent": { "name": "rum-js", "version": "5.2.0" }, - "client": { "ip": "172.18.0.8" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:49.292535Z" }, - "http": { "request": { "referrer": "" } }, + "@timestamp": "2020-06-29T06:48:35.071Z", + "agent": { + "name": "rum-js", + "version": "5.2.0" + }, + "client": { + "ip": "172.18.0.8" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:36.077184Z" + }, + "http": { + "request": { + "referrer": "" + } + }, "observer": { "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", "hostname": "aa0bd613aa4c", @@ -873,28 +1293,49 @@ "version": "8.0.0", "version_major": 8 }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { - "language": { "name": "javascript" }, + "language": { + "name": "javascript" + }, "name": "client", "version": "1.0.0" }, - "source": { "ip": "172.18.0.8" }, - "timestamp": { "us": 1593413328287946 }, - "trace": { "id": "48d130530a1fc0b2b99d138d3461bad4" }, + "source": { + "ip": "172.18.0.8" + }, + "timestamp": { + "us": 1593413315071116 + }, + "trace": { + "id": "547a92e82a25387321d1b967f2dd0f48" + }, "transaction": { "custom": { "userConfig": { - "featureFlags": ["double-trouble", "4423-hotfix"], + "featureFlags": [ + "double-trouble", + "4423-hotfix" + ], "showDashboard": true } }, - "duration": { "us": 39000 }, - "id": "2f3a2b0fd3016d3e", + "duration": { + "us": 28000 + }, + "id": "d24f9b9dacb83450", "name": "/customers", - "page": { "referer": "", "url": "http://opbeans-node:3000/customers" }, + "page": { + "referer": "", + "url": "http://opbeans-node:3000/customers" + }, "sampled": true, - "span_count": { "started": 1 }, + "span_count": { + "started": 1 + }, "type": "route-change" }, "url": { @@ -905,59 +1346,94 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "adastra@example.com", "id": "3", "name": "trillian" }, + "user": { + "email": "arthur.dent@example.com", + "id": "1", + "name": "arthurdent" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "HeadlessChrome", "original": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", - "os": { "name": "Linux" }, + "os": { + "name": "Linux" + }, "version": "79.0.3945" } - }, - "p95": 39040, - "averageResponseTime": 33500, - "transactionsPerMinute": 0.5, - "impact": 3.5546640380951287 + } }, { - "name": "APIRestController#customers", + "key": { + "service.name": "opbeans-java", + "transaction.name": "APIRestController#customers" + }, + "averageResponseTime": 16690.75, + "transactionsPerMinute": 1, + "impact": 3.541042213287889, "sample": { - "@timestamp": "2020-06-29T06:48:43.765Z", + "@timestamp": "2020-06-29T06:48:22.372Z", "agent": { "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", "name": "java", "version": "1.17.1-SNAPSHOT" }, - "client": { "ip": "172.18.0.9" }, + "client": { + "ip": "172.18.0.9" + }, "container": { "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:46.716850Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:25.888154Z" + }, "host": { "architecture": "amd64", "hostname": "918ebbd99b4f", "ip": "172.18.0.6", "name": "918ebbd99b4f", - "os": { "platform": "Linux" } + "os": { + "platform": "Linux" + } }, "http": { "request": { "headers": { - "Accept": ["*/*"], - "Accept-Encoding": ["gzip, deflate"], - "Host": ["172.18.0.6:3000"], - "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + "Accept": [ + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Host": [ + "172.18.0.6:3000" + ], + "User-Agent": [ + "Python/3.7 aiohttp/3.3.2" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + "socket": { + "encrypted": false, + "remote_address": "172.18.0.9" + } }, "response": { "finished": true, "headers": { - "Content-Type": ["application/json;charset=UTF-8"], - "Date": ["Mon, 29 Jun 2020 06:48:43 GMT"], - "Transfer-Encoding": ["chunked"] + "Content-Type": [ + "application/json;charset=UTF-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:21 GMT" + ], + "Transfer-Encoding": [ + "chunked" + ] }, "headers_sent": true, "status_code": 500 @@ -972,29 +1448,56 @@ "version": "8.0.0", "version_major": 8 }, - "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, - "processor": { "event": "transaction", "name": "transaction" }, + "process": { + "pid": 6, + "ppid": 1, + "title": "/opt/java/openjdk/bin/java" + }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, - "language": { "name": "Java", "version": "11.0.7" }, + "framework": { + "name": "Spring Web MVC", + "version": "5.0.6.RELEASE" + }, + "language": { + "name": "Java", + "version": "11.0.7" + }, "name": "opbeans-java", "node": { "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "runtime": { "name": "Java", "version": "11.0.7" }, + "runtime": { + "name": "Java", + "version": "11.0.7" + }, "version": "None" }, - "source": { "ip": "172.18.0.9" }, - "timestamp": { "us": 1593413323765008 }, - "trace": { "id": "affce4cea9b60bd5b635dc1bd2e4ce79" }, + "source": { + "ip": "172.18.0.9" + }, + "timestamp": { + "us": 1593413302372009 + }, + "trace": { + "id": "21dd795dc3a260b1bf7ebbbac1e86fb8" + }, "transaction": { - "duration": { "us": 10880 }, - "id": "cfe0a84b49b4a340", + "duration": { + "us": 14795 + }, + "id": "0157fc513282138f", "name": "APIRestController#customers", "result": "HTTP 5xx", "sampled": true, - "span_count": { "dropped": 0, "started": 2 }, + "span_count": { + "dropped": 0, + "started": 2 + }, "type": "request" }, "url": { @@ -1005,40 +1508,61 @@ "scheme": "http" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "Python/3.7 aiohttp/3.3.2" } - }, - "p95": 26432, - "averageResponseTime": 16690.75, - "transactionsPerMinute": 1, - "impact": 3.541042213287889 + } }, { - "name": "GET /log-message", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /log-message" + }, + "averageResponseTime": 32667.5, + "transactionsPerMinute": 0.5, + "impact": 3.458966408120217, "sample": { - "@timestamp": "2020-06-29T06:48:28.944Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "@timestamp": "2020-06-29T06:48:25.944Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:39.370695Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:29.976822Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -1048,12 +1572,24 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["24"], - "Content-Type": ["text/html; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:28 GMT"], - "Etag": ["W/\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "24" + ], + "Content-Type": [ + "text/html; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:25 GMT" + ], + "Etag": [ + "W/\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 500 }, @@ -1083,29 +1619,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413308944016 }, - "trace": { "id": "afabe4cb397616f5ec35a2f3da49ba62" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413305944023 + }, + "trace": { + "id": "cd2ad726ad164d701c5d3103cbab0c81" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 26788 }, - "id": "cc8c4261387507cf", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 38547 + }, + "id": "9e41667eb64dea55", "name": "GET /log-message", "result": "HTTP 5xx", "sampled": true, - "span_count": { "started": 0 }, + "span_count": { + "started": 0 + }, "type": "request" }, "url": { @@ -1116,60 +1675,82 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 38528, - "averageResponseTime": 32667.5, - "transactionsPerMinute": 0.5, - "impact": 3.458966408120217 + } }, { - "name": "APIRestController#stats", + "key": { + "service.name": "opbeans-java", + "transaction.name": "APIRestController#stats" + }, + "averageResponseTime": 15535, + "transactionsPerMinute": 1, + "impact": 3.275330415465657, "sample": { - "@timestamp": "2020-06-29T06:48:42.549Z", + "@timestamp": "2020-06-29T06:48:09.912Z", "agent": { "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", "name": "java", "version": "1.17.1-SNAPSHOT" }, - "client": { "ip": "172.18.0.9" }, + "client": { + "ip": "172.18.0.9" + }, "container": { "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:46.715898Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:15.543824Z" + }, "host": { "architecture": "amd64", "hostname": "918ebbd99b4f", "ip": "172.18.0.6", "name": "918ebbd99b4f", - "os": { "platform": "Linux" } + "os": { + "platform": "Linux" + } }, "http": { "request": { "headers": { - "Accept": ["*/*"], - "Accept-Encoding": ["gzip, deflate"], - "Host": ["172.18.0.6:3000"], - "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + "Accept": [ + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Host": [ + "172.18.0.6:3000" + ], + "User-Agent": [ + "Python/3.7 aiohttp/3.3.2" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + "socket": { + "encrypted": false, + "remote_address": "172.18.0.9" + } }, "response": { "finished": true, - "headers": { - "Content-Type": ["application/json;charset=UTF-8"], - "Date": ["Mon, 29 Jun 2020 06:48:42 GMT"], - "Transfer-Encoding": ["chunked"] - }, "headers_sent": true, - "status_code": 200 + "status_code": 500 }, "version": "1.1" }, @@ -1181,29 +1762,56 @@ "version": "8.0.0", "version_major": 8 }, - "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, - "processor": { "event": "transaction", "name": "transaction" }, + "process": { + "pid": 6, + "ppid": 1, + "title": "/opt/java/openjdk/bin/java" + }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, - "language": { "name": "Java", "version": "11.0.7" }, + "framework": { + "name": "Spring Web MVC", + "version": "5.0.6.RELEASE" + }, + "language": { + "name": "Java", + "version": "11.0.7" + }, "name": "opbeans-java", "node": { "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "runtime": { "name": "Java", "version": "11.0.7" }, + "runtime": { + "name": "Java", + "version": "11.0.7" + }, "version": "None" }, - "source": { "ip": "172.18.0.9" }, - "timestamp": { "us": 1593413322549008 }, - "trace": { "id": "c3556e143784f94d4b4220dd40687fae" }, + "source": { + "ip": "172.18.0.9" + }, + "timestamp": { + "us": 1593413289912007 + }, + "trace": { + "id": "a17ceae4e18d50430ca15ecca5a3e69f" + }, "transaction": { - "duration": { "us": 9166 }, - "id": "ac40e567f63c3eef", + "duration": { + "us": 10930 + }, + "id": "9fb330060bb73271", "name": "APIRestController#stats", - "result": "HTTP 2xx", + "result": "HTTP 5xx", "sampled": true, - "span_count": { "dropped": 0, "started": 5 }, + "span_count": { + "dropped": 0, + "started": 5 + }, "type": "request" }, "url": { @@ -1214,40 +1822,61 @@ "scheme": "http" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "Python/3.7 aiohttp/3.3.2" } - }, - "p95": 32064, - "averageResponseTime": 15535, - "transactionsPerMinute": 1, - "impact": 3.275330415465657 + } }, { - "name": "GET /api/customers", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /api/customers" + }, + "averageResponseTime": 20092, + "transactionsPerMinute": 0.75, + "impact": 3.168195050736987, "sample": { - "@timestamp": "2020-06-29T06:48:37.952Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "@timestamp": "2020-06-29T06:48:28.444Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:39.492402Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:29.982737Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -1257,12 +1886,24 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["186769"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:37 GMT"], - "Etag": ["W/\"2d991-yG3J8W/roH7fSxXTudZrO27Ax9s\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "186769" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:28 GMT" + ], + "Etag": [ + "W/\"2d991-yG3J8W/roH7fSxXTudZrO27Ax9s\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -1292,29 +1933,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413317952016 }, - "trace": { "id": "5d99327edae38ed735e8d7a6028cf719" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413308444015 + }, + "trace": { + "id": "792fb0b00256164e88b277ec40b65e14" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 16824 }, - "id": "071808429ec9d00b", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 26471 + }, + "id": "6c1f848752563d2b", "name": "GET /api/customers", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 2 }, + "span_count": { + "started": 2 + }, "type": "request" }, "url": { @@ -1325,42 +1989,67 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 26368, - "averageResponseTime": 20092, - "transactionsPerMinute": 0.75, - "impact": 3.168195050736987 + } }, { - "name": "GET /api/products/:id", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /api/products/:id" + }, + "averageResponseTime": 13516.5, + "transactionsPerMinute": 1, + "impact": 2.8112687551548836, "sample": { - "@timestamp": "2020-06-29T06:48:24.977Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "@timestamp": "2020-06-29T06:47:57.555Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:27.004717Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:47:59.085077Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -1370,12 +2059,24 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["231"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:24 GMT"], - "Etag": ["W/\"e7-kkuzj37GZDzXDh0CWqh5Gan0VO4\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "231" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:47:57 GMT" + ], + "Etag": [ + "W/\"e7-6JlJegaJ+ir0C8I8EmmOjms1dnc\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -1401,79 +2102,127 @@ "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", "ecosystem-workload.config.js" ], - "pid": 137, + "pid": 87, "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413304977014 }, - "trace": { "id": "b9b290bca14c99962fa9a1c509401630" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413277555176 + }, + "trace": { + "id": "8365e1763f19e4067b88521d4d9247a0" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 4482 }, - "id": "b8d8284ff1fc25d6", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 37709 + }, + "id": "be2722a418272f10", "name": "GET /api/products/:id", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 1 }, + "span_count": { + "started": 1 + }, "type": "request" }, "url": { "domain": "opbeans-node", - "full": "http://opbeans-node:3000/api/products/3", - "original": "/api/products/3", - "path": "/api/products/3", + "full": "http://opbeans-node:3000/api/products/1", + "original": "/api/products/1", + "path": "/api/products/1", "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 37856, - "averageResponseTime": 13516.5, - "transactionsPerMinute": 1, - "impact": 2.8112687551548836 + } }, { - "name": "GET /api/types", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /api/types" + }, + "averageResponseTime": 26992.5, + "transactionsPerMinute": 0.5, + "impact": 2.8066131947777255, "sample": { - "@timestamp": "2020-06-29T06:48:26.443Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "@timestamp": "2020-06-29T06:47:52.935Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:29.977518Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:47:55.471071Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -1483,12 +2232,24 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["112"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:26 GMT"], - "Etag": ["W/\"70-1z6hT7P1WHgBgS/BeUEVeHhOCQU\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "112" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:47:52 GMT" + ], + "Etag": [ + "W/\"70-1z6hT7P1WHgBgS/BeUEVeHhOCQU\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -1514,33 +2275,56 @@ "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", "ecosystem-workload.config.js" ], - "pid": 137, + "pid": 63, "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413306443014 }, - "trace": { "id": "be3f4eb50d253afc032c90eacaa85072" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413272935117 + }, + "trace": { + "id": "2946c536a33d163d0c984d00d1f3839a" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 8892 }, - "id": "ccce129bb8c6b125", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 45093 + }, + "id": "103482fda88b9400", "name": "GET /api/types", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 2 }, + "span_count": { + "started": 2 + }, "type": "request" }, "url": { @@ -1551,42 +2335,67 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 45248, - "averageResponseTime": 26992.5, - "transactionsPerMinute": 0.5, - "impact": 2.8066131947777255 + } }, { - "name": "GET static file", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET static file" + }, + "averageResponseTime": 3492.9285714285716, + "transactionsPerMinute": 3.5, + "impact": 2.5144049360435208, "sample": { - "@timestamp": "2020-06-29T06:48:40.953Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "@timestamp": "2020-06-29T06:47:53.427Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.992454Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:47:55.472070Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -1596,15 +2405,33 @@ }, "response": { "headers": { - "Accept-Ranges": ["bytes"], - "Cache-Control": ["public, max-age=0"], - "Connection": ["close"], - "Content-Length": ["15086"], - "Content-Type": ["image/x-icon"], - "Date": ["Mon, 29 Jun 2020 06:48:40 GMT"], - "Etag": ["W/\"3aee-1725aff14f0\""], - "Last-Modified": ["Thu, 28 May 2020 11:16:06 GMT"], - "X-Powered-By": ["Express"] + "Accept-Ranges": [ + "bytes" + ], + "Cache-Control": [ + "public, max-age=0" + ], + "Connection": [ + "close" + ], + "Content-Length": [ + "15086" + ], + "Content-Type": [ + "image/x-icon" + ], + "Date": [ + "Mon, 29 Jun 2020 06:47:53 GMT" + ], + "Etag": [ + "W/\"3aee-1725aff14f0\"" + ], + "Last-Modified": [ + "Thu, 28 May 2020 11:16:06 GMT" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -1624,32 +2451,53 @@ "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", "ecosystem-workload.config.js" ], - "pid": 137, + "pid": 63, "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413320953016 }, - "trace": { "id": "292393440bbe04385f3c2e3715ac35fe" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413273427016 + }, + "trace": { + "id": "ec8a804fedf28fcf81d5682d69a16970" + }, "transaction": { - "duration": { "us": 1671 }, - "id": "d1d964ca1865dce3", + "duration": { + "us": 4934 + }, + "id": "ab90a62901b770e6", "name": "GET static file", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 0 }, + "span_count": { + "started": 0 + }, "type": "request" }, "url": { @@ -1661,55 +2509,84 @@ "scheme": "http" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 11900, - "averageResponseTime": 3492.9285714285716, - "transactionsPerMinute": 3.5, - "impact": 2.5144049360435208 + } }, { - "name": "APIRestController#customerWhoBought", + "key": { + "service.name": "opbeans-java", + "transaction.name": "APIRestController#customerWhoBought" + }, + "averageResponseTime": 3742.153846153846, + "transactionsPerMinute": 3.25, + "impact": 2.4998634943716573, "sample": { - "@timestamp": "2020-06-29T06:48:44.982Z", + "@timestamp": "2020-06-29T06:48:11.166Z", "agent": { "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", "name": "java", "version": "1.17.1-SNAPSHOT" }, - "client": { "ip": "172.18.0.9" }, + "client": { + "ip": "172.18.0.9" + }, "container": { "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:46.721114Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:15.763228Z" + }, "host": { "architecture": "amd64", "hostname": "918ebbd99b4f", "ip": "172.18.0.6", "name": "918ebbd99b4f", - "os": { "platform": "Linux" } + "os": { + "platform": "Linux" + } }, "http": { "request": { "headers": { - "Accept": ["*/*"], - "Accept-Encoding": ["gzip, deflate"], - "Host": ["172.18.0.6:3000"], - "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + "Accept": [ + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Host": [ + "172.18.0.6:3000" + ], + "User-Agent": [ + "Python/3.7 aiohttp/3.3.2" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + "socket": { + "encrypted": false, + "remote_address": "172.18.0.9" + } }, "response": { "finished": true, "headers": { - "Content-Type": ["application/json;charset=UTF-8"], - "Date": ["Mon, 29 Jun 2020 06:48:44 GMT"], - "Transfer-Encoding": ["chunked"] + "Content-Type": [ + "application/json;charset=UTF-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:10 GMT" + ], + "Transfer-Encoding": [ + "chunked" + ] }, "headers_sent": true, "status_code": 200 @@ -1724,73 +2601,121 @@ "version": "8.0.0", "version_major": 8 }, - "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, - "processor": { "event": "transaction", "name": "transaction" }, + "process": { + "pid": 6, + "ppid": 1, + "title": "/opt/java/openjdk/bin/java" + }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, - "language": { "name": "Java", "version": "11.0.7" }, + "framework": { + "name": "Spring Web MVC", + "version": "5.0.6.RELEASE" + }, + "language": { + "name": "Java", + "version": "11.0.7" + }, "name": "opbeans-java", "node": { "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "runtime": { "name": "Java", "version": "11.0.7" }, + "runtime": { + "name": "Java", + "version": "11.0.7" + }, "version": "None" }, - "source": { "ip": "172.18.0.9" }, - "timestamp": { "us": 1593413324982008 }, - "trace": { "id": "e5ce8ba877f69510e7abc3f0d11c1e4f" }, + "source": { + "ip": "172.18.0.9" + }, + "timestamp": { + "us": 1593413291166005 + }, + "trace": { + "id": "fa0d353eb7967b344ed37674f40b2884" + }, "transaction": { - "duration": { "us": 2797 }, - "id": "b8c1bd3b31b197d3", + "duration": { + "us": 4453 + }, + "id": "bce4ce4b09ded6ca", "name": "APIRestController#customerWhoBought", "result": "HTTP 2xx", "sampled": true, - "span_count": { "dropped": 0, "started": 1 }, + "span_count": { + "dropped": 0, + "started": 2 + }, "type": "request" }, "url": { "domain": "172.18.0.6", - "full": "http://172.18.0.6:3000/api/products/5/customers", - "path": "/api/products/5/customers", + "full": "http://172.18.0.6:3000/api/products/3/customers", + "path": "/api/products/3/customers", "port": 3000, "scheme": "http" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "Python/3.7 aiohttp/3.3.2" } - }, - "p95": 4464, - "averageResponseTime": 3742.153846153846, - "transactionsPerMinute": 3.25, - "impact": 2.4998634943716573 + } }, { - "name": "GET /log-error", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /log-error" + }, + "averageResponseTime": 35846, + "transactionsPerMinute": 0.25, + "impact": 1.7640550505645587, "sample": { "@timestamp": "2020-06-29T06:48:07.467Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:18.533253Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:18.533253Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -1800,12 +2725,24 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["24"], - "Content-Type": ["text/html; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:07 GMT"], - "Etag": ["W/\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "24" + ], + "Content-Type": [ + "text/html; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:07 GMT" + ], + "Etag": [ + "W/\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 500 }, @@ -1835,29 +2772,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413287467017 }, - "trace": { "id": "d518b2c4d72cd2aaf1e39bad7ebcbdbb" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413287467017 + }, + "trace": { + "id": "d518b2c4d72cd2aaf1e39bad7ebcbdbb" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 35846 }, + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 35846 + }, "id": "c7a30c1b076907ec", "name": "GET /log-error", "result": "HTTP 5xx", "sampled": true, - "span_count": { "started": 0 }, + "span_count": { + "started": 0 + }, "type": "request" }, "url": { @@ -1868,57 +2828,90 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 35840, - "averageResponseTime": 35846, - "transactionsPerMinute": 0.25, - "impact": 1.7640550505645587 + } }, { - "name": "APIRestController#topProducts", + "key": { + "service.name": "opbeans-java", + "transaction.name": "APIRestController#topProducts" + }, + "averageResponseTime": 4825, + "transactionsPerMinute": 1.75, + "impact": 1.6450221426498186, "sample": { - "@timestamp": "2020-06-29T06:48:45.587Z", + "@timestamp": "2020-06-29T06:48:11.778Z", "agent": { "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", "name": "java", "version": "1.17.1-SNAPSHOT" }, - "client": { "ip": "172.18.0.9" }, + "client": { + "ip": "172.18.0.9" + }, "container": { "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:46.770758Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:15.764351Z" + }, "host": { "architecture": "amd64", "hostname": "918ebbd99b4f", "ip": "172.18.0.6", "name": "918ebbd99b4f", - "os": { "platform": "Linux" } + "os": { + "platform": "Linux" + } }, "http": { "request": { "headers": { - "Accept": ["*/*"], - "Accept-Encoding": ["gzip, deflate"], - "Host": ["172.18.0.6:3000"], - "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + "Accept": [ + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Host": [ + "172.18.0.6:3000" + ], + "User-Agent": [ + "Python/3.7 aiohttp/3.3.2" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + "socket": { + "encrypted": false, + "remote_address": "172.18.0.9" + } }, "response": { "finished": true, "headers": { - "Content-Type": ["application/json;charset=UTF-8"], - "Date": ["Mon, 29 Jun 2020 06:48:44 GMT"], - "Transfer-Encoding": ["chunked"] + "Content-Type": [ + "application/json;charset=UTF-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:11 GMT" + ], + "Transfer-Encoding": [ + "chunked" + ] }, "headers_sent": true, "status_code": 200 @@ -1933,29 +2926,56 @@ "version": "8.0.0", "version_major": 8 }, - "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, - "processor": { "event": "transaction", "name": "transaction" }, + "process": { + "pid": 6, + "ppid": 1, + "title": "/opt/java/openjdk/bin/java" + }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, - "language": { "name": "Java", "version": "11.0.7" }, + "framework": { + "name": "Spring Web MVC", + "version": "5.0.6.RELEASE" + }, + "language": { + "name": "Java", + "version": "11.0.7" + }, "name": "opbeans-java", "node": { "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "runtime": { "name": "Java", "version": "11.0.7" }, + "runtime": { + "name": "Java", + "version": "11.0.7" + }, "version": "None" }, - "source": { "ip": "172.18.0.9" }, - "timestamp": { "us": 1593413325587007 }, - "trace": { "id": "4470d0cc076e22018e2dd258a25c8812" }, + "source": { + "ip": "172.18.0.9" + }, + "timestamp": { + "us": 1593413291778008 + }, + "trace": { + "id": "d65e9816f1f6db3961867f7b6d1d4e6a" + }, "transaction": { - "duration": { "us": 4070 }, - "id": "cb860b712121d0d8", + "duration": { + "us": 4168 + }, + "id": "a72f4bb8149ecdc5", "name": "APIRestController#topProducts", "result": "HTTP 2xx", "sampled": true, - "span_count": { "dropped": 0, "started": 1 }, + "span_count": { + "dropped": 0, + "started": 2 + }, "type": "request" }, "url": { @@ -1966,40 +2986,61 @@ "scheme": "http" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "Python/3.7 aiohttp/3.3.2" } - }, - "p95": 7344, - "averageResponseTime": 4825, - "transactionsPerMinute": 1.75, - "impact": 1.6450221426498186 + } }, { - "name": "GET /api/products/top", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /api/products/top" + }, + "averageResponseTime": 33097, + "transactionsPerMinute": 0.25, + "impact": 1.6060533780113861, "sample": { "@timestamp": "2020-06-29T06:48:01.200Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:02.734903Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:02.734903Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -2009,12 +3050,24 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["2"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:01 GMT"], - "Etag": ["W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "2" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:01 GMT" + ], + "Etag": [ + "W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -2044,29 +3097,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413281200133 }, - "trace": { "id": "195f32efeb6f91e2f71b6bc8bb74ae3a" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413281200133 + }, + "trace": { + "id": "195f32efeb6f91e2f71b6bc8bb74ae3a" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 33097 }, + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 33097 + }, "id": "22e72956dfc8967a", "name": "GET /api/products/top", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 1 }, + "span_count": { + "started": 1 + }, "type": "request" }, "url": { @@ -2077,42 +3153,67 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 33024, - "averageResponseTime": 33097, - "transactionsPerMinute": 0.25, - "impact": 1.6060533780113861 + } }, { - "name": "GET /api/products", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /api/products" + }, + "averageResponseTime": 6583, + "transactionsPerMinute": 1, + "impact": 1.2172278724376455, "sample": { - "@timestamp": "2020-06-29T06:48:23.477Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "@timestamp": "2020-06-29T06:48:21.475Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:27.001228Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:26.996210Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -2122,12 +3223,24 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["1023"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:23 GMT"], - "Etag": ["W/\"3ff-VyOxcDApb+a/lnjkm9FeTOGSDrs\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "1023" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:21 GMT" + ], + "Etag": [ + "W/\"3ff-VyOxcDApb+a/lnjkm9FeTOGSDrs\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -2157,29 +3270,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413303477028 }, - "trace": { "id": "9f26158b9a3915577b3cccc17636ea01" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413301475015 + }, + "trace": { + "id": "389b26b16949c7f783223de4f14b788c" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 7150 }, - "id": "27ff4add22ac2e1b", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 6775 + }, + "id": "d2d4088a0b104fb4", "name": "GET /api/products", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 2 }, + "span_count": { + "started": 2 + }, "type": "request" }, "url": { @@ -2190,46 +3326,79 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 8160, - "averageResponseTime": 6583, - "transactionsPerMinute": 1, - "impact": 1.2172278724376455 + } }, { - "name": "POST /api", + "key": { + "service.name": "opbeans-node", + "transaction.name": "POST /api" + }, + "averageResponseTime": 20011, + "transactionsPerMinute": 0.25, + "impact": 0.853921734857215, "sample": { "@timestamp": "2020-06-29T06:48:25.478Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:27.005671Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:27.005671Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { - "body": { "original": "[REDACTED]" }, + "body": { + "original": "[REDACTED]" + }, "headers": { - "Accept": ["application/json"], - "Connection": ["close"], - "Content-Length": ["129"], - "Content-Type": ["application/json"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Accept": [ + "application/json" + ], + "Connection": [ + "close" + ], + "Content-Length": [ + "129" + ], + "Content-Type": [ + "application/json" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "post", "socket": { @@ -2239,12 +3408,24 @@ }, "response": { "headers": { - "Allow": ["GET"], - "Connection": ["close"], - "Content-Type": ["application/json;charset=UTF-8"], - "Date": ["Mon, 29 Jun 2020 06:48:25 GMT"], - "Transfer-Encoding": ["chunked"], - "X-Powered-By": ["Express"] + "Allow": [ + "GET" + ], + "Connection": [ + "close" + ], + "Content-Type": [ + "application/json;charset=UTF-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:25 GMT" + ], + "Transfer-Encoding": [ + "chunked" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 405 }, @@ -2274,29 +3455,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413305478010 }, - "trace": { "id": "4bd9027dd1e355ec742970e2d6333124" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413305478010 + }, + "trace": { + "id": "4bd9027dd1e355ec742970e2d6333124" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 20011 }, + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 20011 + }, "id": "94104435cf151478", "name": "POST /api", "result": "HTTP 4xx", "sampled": true, - "span_count": { "started": 1 }, + "span_count": { + "started": 1 + }, "type": "request" }, "url": { @@ -2307,42 +3511,67 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 19968, - "averageResponseTime": 20011, - "transactionsPerMinute": 0.25, - "impact": 0.853921734857215 + } }, { - "name": "GET /api/types/:id", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /api/types/:id" + }, + "averageResponseTime": 8181, + "transactionsPerMinute": 0.5, + "impact": 0.6441916136689552, "sample": { - "@timestamp": "2020-06-29T06:48:12.972Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "@timestamp": "2020-06-29T06:47:53.928Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:18.543436Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:47:55.472718Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -2352,12 +3581,24 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["205"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:12 GMT"], - "Etag": ["W/\"cd-pFMi1QOVY6YqWe+nwcbZVviCths\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "205" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:47:53 GMT" + ], + "Etag": [ + "W/\"cd-pFMi1QOVY6YqWe+nwcbZVviCths\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -2383,33 +3624,56 @@ "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", "ecosystem-workload.config.js" ], - "pid": 137, + "pid": 63, "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413292972011 }, - "trace": { "id": "aea65cef5f902dda5d8e38f9fb38864d" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413273928016 + }, + "trace": { + "id": "0becaafb422bfeb69e047bf7153aa469" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 6300 }, - "id": "a5bdbe43ac05fae2", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 10062 + }, + "id": "0cee4574091bda3b", "name": "GET /api/types/:id", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 2 }, + "span_count": { + "started": 2 + }, "type": "request" }, "url": { @@ -2420,42 +3684,67 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 10080, - "averageResponseTime": 8181, - "transactionsPerMinute": 0.5, - "impact": 0.6441916136689552 + } }, { - "name": "GET /api/stats", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /api/stats" + }, + "averageResponseTime": 5098, + "transactionsPerMinute": 0.75, + "impact": 0.582807187955318, "sample": { - "@timestamp": "2020-06-29T06:48:39.451Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "@timestamp": "2020-06-29T06:48:34.949Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.984824Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:39.479316Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -2465,12 +3754,24 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["92"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:39 GMT"], - "Etag": ["W/\"5c-6I+bqIiLxvkWuwBUnTxhBoK4lBk\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "92" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:34 GMT" + ], + "Etag": [ + "W/\"5c-6I+bqIiLxvkWuwBUnTxhBoK4lBk\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -2500,29 +3801,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413319451016 }, - "trace": { "id": "a05787cb03a0af0863fab5e05de942f1" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413314949017 + }, + "trace": { + "id": "616b3b77abd5534c61d6c0438469aee2" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 5050 }, - "id": "a7e004eba8f021ce", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 5459 + }, + "id": "5b4971de59d2099d", "name": "GET /api/stats", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 4 }, + "span_count": { + "started": 4 + }, "type": "request" }, "url": { @@ -2533,42 +3857,67 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 5440, - "averageResponseTime": 5098, - "transactionsPerMinute": 0.75, - "impact": 0.582807187955318 + } }, { - "name": "GET /api/orders", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /api/orders" + }, + "averageResponseTime": 7624.5, + "transactionsPerMinute": 0.5, + "impact": 0.5802207655235637, "sample": { "@timestamp": "2020-06-29T06:48:35.450Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:39.483715Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:39.483715Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -2578,12 +3927,24 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["2"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:35 GMT"], - "Etag": ["W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "2" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:35 GMT" + ], + "Etag": [ + "W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -2613,29 +3974,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413315450014 }, - "trace": { "id": "2da70ccf10599b271f65273d169cde9f" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413315450014 + }, + "trace": { + "id": "2da70ccf10599b271f65273d169cde9f" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 8784 }, + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 8784 + }, "id": "a3f4a4f339758440", "name": "GET /api/orders", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 2 }, + "span_count": { + "started": 2 + }, "type": "request" }, "url": { @@ -2646,42 +4030,67 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 8800, - "averageResponseTime": 7624.5, - "transactionsPerMinute": 0.5, - "impact": 0.5802207655235637 + } }, { - "name": "GET /api/orders/:id", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /api/orders/:id" + }, + "averageResponseTime": 4749.666666666667, + "transactionsPerMinute": 0.75, + "impact": 0.5227447114845778, "sample": { "@timestamp": "2020-06-29T06:48:35.951Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:39.484133Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:39.484133Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -2691,10 +4100,18 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["0"], - "Date": ["Mon, 29 Jun 2020 06:48:35 GMT"], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "0" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:35 GMT" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 404 }, @@ -2724,29 +4141,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413315951017 }, - "trace": { "id": "95979caa80e6622cbbb2d308800c3016" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413315951017 + }, + "trace": { + "id": "95979caa80e6622cbbb2d308800c3016" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 3210 }, + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 3210 + }, "id": "30344988dace0b43", "name": "GET /api/orders/:id", "result": "HTTP 4xx", "sampled": true, - "span_count": { "started": 1 }, + "span_count": { + "started": 1 + }, "type": "request" }, "url": { @@ -2757,57 +4197,90 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 7184, - "averageResponseTime": 4749.666666666667, - "transactionsPerMinute": 0.75, - "impact": 0.5227447114845778 + } }, { - "name": "APIRestController#products", + "key": { + "service.name": "opbeans-java", + "transaction.name": "APIRestController#products" + }, + "averageResponseTime": 6787, + "transactionsPerMinute": 0.5, + "impact": 0.4839483750082622, "sample": { - "@timestamp": "2020-06-29T06:48:27.824Z", + "@timestamp": "2020-06-29T06:48:13.595Z", "agent": { "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", "name": "java", "version": "1.17.1-SNAPSHOT" }, - "client": { "ip": "172.18.0.9" }, + "client": { + "ip": "172.18.0.9" + }, "container": { "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:36.087688Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:15.755614Z" + }, "host": { "architecture": "amd64", "hostname": "918ebbd99b4f", "ip": "172.18.0.6", "name": "918ebbd99b4f", - "os": { "platform": "Linux" } + "os": { + "platform": "Linux" + } }, "http": { "request": { "headers": { - "Accept": ["*/*"], - "Accept-Encoding": ["gzip, deflate"], - "Host": ["172.18.0.6:3000"], - "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + "Accept": [ + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Host": [ + "172.18.0.6:3000" + ], + "User-Agent": [ + "Python/3.7 aiohttp/3.3.2" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + "socket": { + "encrypted": false, + "remote_address": "172.18.0.9" + } }, "response": { "finished": true, "headers": { - "Content-Type": ["application/json;charset=UTF-8"], - "Date": ["Mon, 29 Jun 2020 06:48:27 GMT"], - "Transfer-Encoding": ["chunked"] + "Content-Type": [ + "application/json;charset=UTF-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:12 GMT" + ], + "Transfer-Encoding": [ + "chunked" + ] }, "headers_sent": true, "status_code": 200 @@ -2822,29 +4295,56 @@ "version": "8.0.0", "version_major": 8 }, - "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, - "processor": { "event": "transaction", "name": "transaction" }, + "process": { + "pid": 6, + "ppid": 1, + "title": "/opt/java/openjdk/bin/java" + }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, - "language": { "name": "Java", "version": "11.0.7" }, + "framework": { + "name": "Spring Web MVC", + "version": "5.0.6.RELEASE" + }, + "language": { + "name": "Java", + "version": "11.0.7" + }, "name": "opbeans-java", "node": { "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "runtime": { "name": "Java", "version": "11.0.7" }, + "runtime": { + "name": "Java", + "version": "11.0.7" + }, "version": "None" }, - "source": { "ip": "172.18.0.9" }, - "timestamp": { "us": 1593413307824008 }, - "trace": { "id": "a6adb17bd5a5d1c0eabb9f36cb626dd5" }, + "source": { + "ip": "172.18.0.9" + }, + "timestamp": { + "us": 1593413293595007 + }, + "trace": { + "id": "8519b6c3dbc32a0582228506526e1d74" + }, "transaction": { - "duration": { "us": 5645 }, - "id": "df3e726eaa003d96", + "duration": { + "us": 7929 + }, + "id": "b0354de660cd3698", "name": "APIRestController#products", "result": "HTTP 2xx", "sampled": true, - "span_count": { "dropped": 0, "started": 3 }, + "span_count": { + "dropped": 0, + "started": 3 + }, "type": "request" }, "url": { @@ -2855,40 +4355,61 @@ "scheme": "http" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "Python/3.7 aiohttp/3.3.2" } - }, - "p95": 7904, - "averageResponseTime": 6787, - "transactionsPerMinute": 0.5, - "impact": 0.4839483750082622 + } }, { - "name": "GET /api/products/:id/customers", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /api/products/:id/customers" + }, + "averageResponseTime": 4757, + "transactionsPerMinute": 0.5, + "impact": 0.25059559560997896, "sample": { - "@timestamp": "2020-06-29T06:48:41.956Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "@timestamp": "2020-06-29T06:48:22.977Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.994692Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:27.000765Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -2898,12 +4419,24 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["2"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:41 GMT"], - "Etag": ["W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "2" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:22 GMT" + ], + "Etag": [ + "W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -2933,90 +4466,146 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413321956016 }, - "trace": { "id": "f735ac5fca8f83eebc748f4a2e009e61" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413302977008 + }, + "trace": { + "id": "da8f22fe652ccb6680b3029ab6efd284" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 3896 }, - "id": "b24ce95c855f83a4", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 5618 + }, + "id": "bc51c1523afaf57a", "name": "GET /api/products/:id/customers", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 1 }, + "span_count": { + "started": 1 + }, "type": "request" }, "url": { "domain": "opbeans-node", - "full": "http://opbeans-node:3000/api/products/5/customers", - "original": "/api/products/5/customers", - "path": "/api/products/5/customers", + "full": "http://opbeans-node:3000/api/products/3/customers", + "original": "/api/products/3/customers", + "path": "/api/products/3/customers", "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 5616, - "averageResponseTime": 4757, - "transactionsPerMinute": 0.5, - "impact": 0.25059559560997896 + } }, { - "name": "APIRestController#product", + "key": { + "service.name": "opbeans-java", + "transaction.name": "APIRestController#product" + }, + "averageResponseTime": 4713.5, + "transactionsPerMinute": 0.5, + "impact": 0.24559517890858723, "sample": { - "@timestamp": "2020-06-29T06:48:41.941Z", + "@timestamp": "2020-06-29T06:48:36.383Z", "agent": { "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", "name": "java", "version": "1.17.1-SNAPSHOT" }, - "client": { "ip": "172.18.0.9" }, + "client": { + "ip": "172.18.0.9" + }, "container": { "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:46.709268Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:46.666467Z" + }, "host": { "architecture": "amd64", "hostname": "918ebbd99b4f", "ip": "172.18.0.6", "name": "918ebbd99b4f", - "os": { "platform": "Linux" } + "os": { + "platform": "Linux" + } }, "http": { "request": { "headers": { - "Accept": ["*/*"], - "Accept-Encoding": ["gzip, deflate"], - "Host": ["172.18.0.6:3000"], - "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + "Accept": [ + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Host": [ + "172.18.0.6:3000" + ], + "User-Agent": [ + "Python/3.7 aiohttp/3.3.2" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + "socket": { + "encrypted": false, + "remote_address": "172.18.0.9" + } }, "response": { "finished": true, "headers": { - "Content-Type": ["application/json;charset=UTF-8"], - "Date": ["Mon, 29 Jun 2020 06:48:41 GMT"], - "Transfer-Encoding": ["chunked"] + "Content-Type": [ + "application/json;charset=UTF-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:36 GMT" + ], + "Transfer-Encoding": [ + "chunked" + ] }, "headers_sent": true, "status_code": 200 @@ -3031,81 +4620,131 @@ "version": "8.0.0", "version_major": 8 }, - "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, - "processor": { "event": "transaction", "name": "transaction" }, + "process": { + "pid": 6, + "ppid": 1, + "title": "/opt/java/openjdk/bin/java" + }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, - "language": { "name": "Java", "version": "11.0.7" }, + "framework": { + "name": "Spring Web MVC", + "version": "5.0.6.RELEASE" + }, + "language": { + "name": "Java", + "version": "11.0.7" + }, "name": "opbeans-java", "node": { "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "runtime": { "name": "Java", "version": "11.0.7" }, + "runtime": { + "name": "Java", + "version": "11.0.7" + }, "version": "None" }, - "source": { "ip": "172.18.0.9" }, - "timestamp": { "us": 1593413321941007 }, - "trace": { "id": "88a2b9ca970cdd38dfa1b5646d26b897" }, + "source": { + "ip": "172.18.0.9" + }, + "timestamp": { + "us": 1593413316383008 + }, + "trace": { + "id": "386b450aef87fc079b20136eda542af1" + }, "transaction": { - "duration": { "us": 4539 }, - "id": "24ee0e4812cfed62", + "duration": { + "us": 4888 + }, + "id": "5a4aa02158b5658c", "name": "APIRestController#product", "result": "HTTP 2xx", "sampled": true, - "span_count": { "dropped": 0, "started": 2 }, + "span_count": { + "dropped": 0, + "started": 3 + }, "type": "request" }, "url": { "domain": "172.18.0.6", - "full": "http://172.18.0.6:3000/api/products/4", - "path": "/api/products/4", + "full": "http://172.18.0.6:3000/api/products/1", + "path": "/api/products/1", "port": 3000, "scheme": "http" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "Python/3.7 aiohttp/3.3.2" } - }, - "p95": 4864, - "averageResponseTime": 4713.5, - "transactionsPerMinute": 0.5, - "impact": 0.24559517890858723 + } }, { - "name": "APIRestController#order", + "key": { + "service.name": "opbeans-java", + "transaction.name": "APIRestController#order" + }, + "averageResponseTime": 3392.5, + "transactionsPerMinute": 0.5, + "impact": 0.09374344413758617, "sample": { - "@timestamp": "2020-06-29T06:48:33.314Z", + "@timestamp": "2020-06-29T06:48:07.416Z", "agent": { "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", "name": "java", "version": "1.17.1-SNAPSHOT" }, - "client": { "ip": "172.18.0.9" }, + "client": { + "ip": "172.18.0.9" + }, "container": { "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:36.137777Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:15.534378Z" + }, "host": { "architecture": "amd64", "hostname": "918ebbd99b4f", "ip": "172.18.0.6", "name": "918ebbd99b4f", - "os": { "platform": "Linux" } + "os": { + "platform": "Linux" + } }, "http": { "request": { "headers": { - "Accept": ["*/*"], - "Accept-Encoding": ["gzip, deflate"], - "Host": ["172.18.0.6:3000"], - "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + "Accept": [ + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Host": [ + "172.18.0.6:3000" + ], + "User-Agent": [ + "Python/3.7 aiohttp/3.3.2" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + "socket": { + "encrypted": false, + "remote_address": "172.18.0.9" + } }, "response": { "finished": true, @@ -3122,88 +4761,144 @@ "version": "8.0.0", "version_major": 8 }, - "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, - "processor": { "event": "transaction", "name": "transaction" }, + "process": { + "pid": 6, + "ppid": 1, + "title": "/opt/java/openjdk/bin/java" + }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, - "language": { "name": "Java", "version": "11.0.7" }, + "framework": { + "name": "Spring Web MVC", + "version": "5.0.6.RELEASE" + }, + "language": { + "name": "Java", + "version": "11.0.7" + }, "name": "opbeans-java", "node": { "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "runtime": { "name": "Java", "version": "11.0.7" }, + "runtime": { + "name": "Java", + "version": "11.0.7" + }, "version": "None" }, - "source": { "ip": "172.18.0.9" }, - "timestamp": { "us": 1593413313314007 }, - "trace": { "id": "aaf67f944393124080d1e4de804dc6eb" }, + "source": { + "ip": "172.18.0.9" + }, + "timestamp": { + "us": 1593413287416007 + }, + "trace": { + "id": "25c46380df3d44a192ed07279a08b329" + }, "transaction": { - "duration": { "us": 2503 }, - "id": "f7f9f5e0f8a3a0d4", + "duration": { + "us": 4282 + }, + "id": "d4d5b23c685d2ee5", "name": "APIRestController#order", "result": "HTTP 2xx", "sampled": true, - "span_count": { "dropped": 0, "started": 1 }, + "span_count": { + "dropped": 0, + "started": 1 + }, "type": "request" }, "url": { "domain": "172.18.0.6", - "full": "http://172.18.0.6:3000/api/orders/906", - "path": "/api/orders/906", + "full": "http://172.18.0.6:3000/api/orders/391", + "path": "/api/orders/391", "port": 3000, "scheme": "http" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "Python/3.7 aiohttp/3.3.2" } - }, - "p95": 4272, - "averageResponseTime": 3392.5, - "transactionsPerMinute": 0.5, - "impact": 0.09374344413758617 + } }, { - "name": "APIRestController#orders", + "key": { + "service.name": "opbeans-java", + "transaction.name": "APIRestController#orders" + }, + "averageResponseTime": 3147, + "transactionsPerMinute": 0.5, + "impact": 0.06552270160444405, "sample": { - "@timestamp": "2020-06-29T06:48:39.500Z", + "@timestamp": "2020-06-29T06:48:16.028Z", "agent": { "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", "name": "java", "version": "1.17.1-SNAPSHOT" }, - "client": { "ip": "172.18.0.9" }, + "client": { + "ip": "172.18.0.9" + }, "container": { "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:46.706280Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:25.800962Z" + }, "host": { "architecture": "amd64", "hostname": "918ebbd99b4f", "ip": "172.18.0.6", "name": "918ebbd99b4f", - "os": { "platform": "Linux" } + "os": { + "platform": "Linux" + } }, "http": { "request": { "headers": { - "Accept": ["*/*"], - "Accept-Encoding": ["gzip, deflate"], - "Host": ["172.18.0.6:3000"], - "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + "Accept": [ + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Host": [ + "172.18.0.6:3000" + ], + "User-Agent": [ + "Python/3.7 aiohttp/3.3.2" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + "socket": { + "encrypted": false, + "remote_address": "172.18.0.9" + } }, "response": { "finished": true, "headers": { - "Content-Type": ["application/json;charset=UTF-8"], - "Date": ["Mon, 29 Jun 2020 06:48:38 GMT"], - "Transfer-Encoding": ["chunked"] + "Content-Type": [ + "application/json;charset=UTF-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:15 GMT" + ], + "Transfer-Encoding": [ + "chunked" + ] }, "headers_sent": true, "status_code": 200 @@ -3218,29 +4913,56 @@ "version": "8.0.0", "version_major": 8 }, - "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, - "processor": { "event": "transaction", "name": "transaction" }, + "process": { + "pid": 6, + "ppid": 1, + "title": "/opt/java/openjdk/bin/java" + }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, - "language": { "name": "Java", "version": "11.0.7" }, + "framework": { + "name": "Spring Web MVC", + "version": "5.0.6.RELEASE" + }, + "language": { + "name": "Java", + "version": "11.0.7" + }, "name": "opbeans-java", "node": { "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" }, - "runtime": { "name": "Java", "version": "11.0.7" }, + "runtime": { + "name": "Java", + "version": "11.0.7" + }, "version": "None" }, - "source": { "ip": "172.18.0.9" }, - "timestamp": { "us": 1593413319500008 }, - "trace": { "id": "f89b02f09a2e7a7f2cc3478f53d4a495" }, + "source": { + "ip": "172.18.0.9" + }, + "timestamp": { + "us": 1593413296028008 + }, + "trace": { + "id": "4110227ecacbccf79894165ae5df932d" + }, "transaction": { - "duration": { "us": 3391 }, - "id": "41c8c4300ee2ccda", + "duration": { + "us": 2903 + }, + "id": "8e3732f0f0da942b", "name": "APIRestController#orders", "result": "HTTP 2xx", "sampled": true, - "span_count": { "dropped": 0, "started": 2 }, + "span_count": { + "dropped": 0, + "started": 1 + }, "type": "request" }, "url": { @@ -3251,40 +4973,61 @@ "scheme": "http" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "Python/3.7 aiohttp/3.3.2" } - }, - "p95": 3376, - "averageResponseTime": 3147, - "transactionsPerMinute": 0.5, - "impact": 0.06552270160444405 + } }, { - "name": "GET /throw-error", + "key": { + "service.name": "opbeans-node", + "transaction.name": "GET /throw-error" + }, + "averageResponseTime": 2577, + "transactionsPerMinute": 0.5, + "impact": 0, "sample": { - "@timestamp": "2020-06-29T06:48:42.954Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, + "@timestamp": "2020-06-29T06:48:19.975Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.996435Z" }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:21.012520Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", "socket": { @@ -3294,13 +5037,27 @@ }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["148"], - "Content-Security-Policy": ["default-src 'none'"], - "Content-Type": ["text/html; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:42 GMT"], - "X-Content-Type-Options": ["nosniff"], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "148" + ], + "Content-Security-Policy": [ + "default-src 'none'" + ], + "Content-Type": [ + "text/html; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:19 GMT" + ], + "X-Content-Type-Options": [ + "nosniff" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 500 }, @@ -3330,29 +5087,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413322954016 }, - "trace": { "id": "9d5aee7443a43db9820f622a10dfac6e" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413299975019 + }, + "trace": { + "id": "106f3a55b0b0ea327d1bbe4be66c3bcc" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 1928 }, - "id": "8e6fc8c3f99e8fc9", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 3226 + }, + "id": "247b9141552a9e73", "name": "GET /throw-error", "result": "HTTP 5xx", "sampled": true, - "span_count": { "started": 0 }, + "span_count": { + "started": 0 + }, "type": "request" }, "url": { @@ -3363,16 +5143,18 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 3224, - "averageResponseTime": 2577, - "transactionsPerMinute": 0.5, - "impact": 0 + } } ] diff --git a/x-pack/test/apm_api_integration/basic/tests/traces/top_traces.ts b/x-pack/test/apm_api_integration/basic/tests/traces/top_traces.ts index e96cb20a68fda..b4a037436adb8 100644 --- a/x-pack/test/apm_api_integration/basic/tests/traces/top_traces.ts +++ b/x-pack/test/apm_api_integration/basic/tests/traces/top_traces.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import expect from '@kbn/expect'; +import { sortBy, omit } from 'lodash'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; import expectTopTraces from './expectation/top_traces.expectation.json'; @@ -46,8 +47,28 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(response.body.items.length).to.be(33); }); - it('returns the correct buckets and samples', async () => { - expect(response.body.items).to.eql(expectTopTraces); + it('returns the correct buckets', async () => { + const responseWithoutSamples = sortBy( + response.body.items.map((item: any) => omit(item, 'sample')), + 'impact' + ); + + const expectedTracesWithoutSamples = sortBy( + expectTopTraces.map((item: any) => omit(item, 'sample')), + 'impact' + ); + + expect(responseWithoutSamples).to.eql(expectedTracesWithoutSamples); + }); + + it('returns a sample', async () => { + // sample should provide enough information to deeplink to a transaction detail page + response.body.items.forEach((item: any) => { + expect(item.sample.trace.id).to.be.an('string'); + expect(item.sample.transaction.id).to.be.an('string'); + expect(item.sample.service.name).to.be(item.key['service.name']); + expect(item.sample.transaction.name).to.be(item.key['transaction.name']); + }); }); }); }); diff --git a/x-pack/test/apm_api_integration/basic/tests/transaction_groups/expectation/top_transaction_groups.json b/x-pack/test/apm_api_integration/basic/tests/transaction_groups/expectation/top_transaction_groups.json index 7d314e75e4d1d..29c55d4ef1b5c 100644 --- a/x-pack/test/apm_api_integration/basic/tests/transaction_groups/expectation/top_transaction_groups.json +++ b/x-pack/test/apm_api_integration/basic/tests/transaction_groups/expectation/top_transaction_groups.json @@ -1,38 +1,86 @@ { "items": [ { - "name": "GET /api", + "key": "GET /api", + "averageResponseTime": 51175.73170731707, + "transactionsPerMinute": 10.25, + "impact": 100, + "p95": 259040, "sample": { - "@timestamp": "2020-06-29T06:48:41.454Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.992834Z" }, + "@timestamp": "2020-06-29T06:48:06.862Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.8" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:08.305742Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Accept": [ + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Connection": [ + "keep-alive" + ], + "Host": [ + "opbeans-node:3000" + ], + "Referer": [ + "http://opbeans-node:3000/dashboard" + ], + "Traceparent": [ + "00-ca86ffcac7753ec8733933bd8fd45d11-5dcb98c9c9021cfc-01" + ], + "User-Agent": [ + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.8" + } }, "response": { "headers": { - "Connection": ["close"], - "Content-Type": ["application/json;charset=UTF-8"], - "Date": ["Mon, 29 Jun 2020 06:48:41 GMT"], - "Transfer-Encoding": ["chunked"], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Type": [ + "application/json;charset=UTF-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:06 GMT" + ], + "Transfer-Encoding": [ + "chunked" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -52,6 +100,9 @@ "version": "8.0.0", "version_major": 8 }, + "parent": { + "id": "5dcb98c9c9021cfc" + }, "process": { "args": [ "/usr/local/bin/node", @@ -62,87 +113,164 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413321454009 }, - "trace": { "id": "0507830eeff93f7bf1a354e4031097b3" }, + "source": { + "ip": "172.18.0.8" + }, + "timestamp": { + "us": 1593413286862021 + }, + "trace": { + "id": "ca86ffcac7753ec8733933bd8fd45d11" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 8334 }, - "id": "878250a8b937445d", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 15738 + }, + "id": "c95371db21c6f407", "name": "GET /api", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 1 }, + "span_count": { + "started": 1 + }, "type": "request" }, "url": { "domain": "opbeans-node", - "full": "http://opbeans-node:3000/api/products/6", - "original": "/api/products/6", - "path": "/api/products/6", + "full": "http://opbeans-node:3000/api/products/top", + "original": "/api/products/top", + "path": "/api/products/top", "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, - "name": "Other", - "original": "workload/2.4.3" + "device": { + "name": "Other" + }, + "name": "HeadlessChrome", + "original": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", + "os": { + "name": "Linux" + }, + "version": "79.0.3945" } - }, - "p95": 259040, - "averageResponseTime": 51175.73170731707, - "transactionsPerMinute": 10.25, - "impact": 100 + } }, { - "name": "POST /api/orders", + "key": "POST /api/orders", + "averageResponseTime": 270684, + "transactionsPerMinute": 0.25, + "impact": 12.686265169840583, + "p95": 270336, "sample": { "@timestamp": "2020-06-29T06:48:39.953Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.991549Z" }, + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:43.991549Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { - "body": { "original": "[REDACTED]" }, + "body": { + "original": "[REDACTED]" + }, "headers": { - "Accept": ["application/json"], - "Connection": ["close"], - "Content-Length": ["129"], - "Content-Type": ["application/json"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Accept": [ + "application/json" + ], + "Connection": [ + "close" + ], + "Content-Length": [ + "129" + ], + "Content-Type": [ + "application/json" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "post", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["13"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:40 GMT"], - "Etag": ["W/\"d-eEOWU4Cnr5DZ23ErRUeYu9oOIks\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "13" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:40 GMT" + ], + "Etag": [ + "W/\"d-eEOWU4Cnr5DZ23ErRUeYu9oOIks\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -172,27 +300,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413319953033 }, - "trace": { "id": "52b8fda5f6df745b990740ba18378620" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413319953033 + }, + "trace": { + "id": "52b8fda5f6df745b990740ba18378620" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 270684 }, + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 270684 + }, "id": "a3afc2a112e9c893", "name": "POST /api/orders", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 16 }, + "span_count": { + "started": 16 + }, "type": "request" }, "url": { @@ -203,52 +356,92 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 270336, - "averageResponseTime": 270684, - "transactionsPerMinute": 0.25, - "impact": 12.686265169840583 + } }, { - "name": "GET /api/customers", + "key": "GET /api/customers", + "averageResponseTime": 16896.8, + "transactionsPerMinute": 1.25, + "impact": 3.790160870423129, + "p95": 26432, "sample": { - "@timestamp": "2020-06-29T06:48:37.952Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:39.492402Z" }, + "@timestamp": "2020-06-29T06:48:28.444Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:29.982737Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["186769"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:37 GMT"], - "Etag": ["W/\"2d991-yG3J8W/roH7fSxXTudZrO27Ax9s\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "186769" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:28 GMT" + ], + "Etag": [ + "W/\"2d991-yG3J8W/roH7fSxXTudZrO27Ax9s\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -278,27 +471,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413317952016 }, - "trace": { "id": "5d99327edae38ed735e8d7a6028cf719" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413308444015 + }, + "trace": { + "id": "792fb0b00256164e88b277ec40b65e14" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 16824 }, - "id": "071808429ec9d00b", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 26471 + }, + "id": "6c1f848752563d2b", "name": "GET /api/customers", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 2 }, + "span_count": { + "started": 2 + }, "type": "request" }, "url": { @@ -309,52 +527,92 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 26432, - "averageResponseTime": 16896.8, - "transactionsPerMinute": 1.25, - "impact": 3.790160870423129 + } }, { - "name": "GET /log-message", + "key": "GET /log-message", + "averageResponseTime": 32667.5, + "transactionsPerMinute": 0.5, + "impact": 2.875276331059301, + "p95": 38528, "sample": { - "@timestamp": "2020-06-29T06:48:28.944Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:39.370695Z" }, + "@timestamp": "2020-06-29T06:48:25.944Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:29.976822Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["24"], - "Content-Type": ["text/html; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:28 GMT"], - "Etag": ["W/\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "24" + ], + "Content-Type": [ + "text/html; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:25 GMT" + ], + "Etag": [ + "W/\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 500 }, @@ -384,27 +642,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413308944016 }, - "trace": { "id": "afabe4cb397616f5ec35a2f3da49ba62" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413305944023 + }, + "trace": { + "id": "cd2ad726ad164d701c5d3103cbab0c81" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 26788 }, - "id": "cc8c4261387507cf", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 38547 + }, + "id": "9e41667eb64dea55", "name": "GET /log-message", "result": "HTTP 5xx", "sampled": true, - "span_count": { "started": 0 }, + "span_count": { + "started": 0 + }, "type": "request" }, "url": { @@ -415,51 +698,89 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 38528, - "averageResponseTime": 32667.5, - "transactionsPerMinute": 0.5, - "impact": 2.875276331059301 + } }, { - "name": "GET /*", + "key": "GET /*", + "averageResponseTime": 3262.95, + "transactionsPerMinute": 5, + "impact": 2.8716452680799467, + "p95": 4472, "sample": { - "@timestamp": "2020-06-29T06:48:42.454Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.995202Z" }, + "@timestamp": "2020-06-29T06:48:25.064Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:27.005197Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "Wget" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["813"], - "Content-Type": ["text/html"], - "Date": ["Mon, 29 Jun 2020 06:48:42 GMT"], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "813" + ], + "Content-Type": [ + "text/html" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:25 GMT" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -479,7 +800,9 @@ "version": "8.0.0", "version_major": 8 }, - "parent": { "id": "5baa6c3bedc93f9d" }, + "parent": { + "id": "f673ceaf4583f0f2" + }, "process": { "args": [ "/usr/local/bin/node", @@ -490,27 +813,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413322454015 }, - "trace": { "id": "022b01256b291a4c417199d91ec8755f" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413305064023 + }, + "trace": { + "id": "30c12f4d8ef77a5be1b4464e5d2235bc" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 1737 }, - "id": "eff3e45e0d9529d9", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 3004 + }, + "id": "18a00dfdb919a978", "name": "GET /*", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 0 }, + "span_count": { + "started": 0 + }, "type": "request" }, "url": { @@ -521,59 +869,104 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, - "name": "Other", - "original": "workload/2.4.3" + "device": { + "name": "Other" + }, + "name": "Wget", + "original": "Wget" } - }, - "p95": 4472, - "averageResponseTime": 3262.95, - "transactionsPerMinute": 5, - "impact": 2.8716452680799467 + } }, { - "name": "GET /api/orders", + "key": "GET /api/orders", + "averageResponseTime": 7615.625, + "transactionsPerMinute": 2, + "impact": 2.6645791239678345, + "p95": 11616, "sample": { - "@timestamp": "2020-06-29T06:48:40.106Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.6" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.988104Z" }, + "@timestamp": "2020-06-29T06:48:28.782Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.8" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:29.983252Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { "Accept": [ - "text/plain, application/json, application/x-jackson-smile, application/cbor, application/*+json, */*" + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Connection": [ + "keep-alive" ], - "Connection": ["keep-alive"], - "Elastic-Apm-Traceparent": [ - "00-90bd7780b32cc51a7f4c200b1e0c170f-5ff346d602ce27b0-01" + "Host": [ + "opbeans-node:3000" ], - "Host": ["opbeans-node:3000"], - "Traceparent": ["00-90bd7780b32cc51a7f4c200b1e0c170f-5ff346d602ce27b0-01"], - "User-Agent": ["Java/11.0.7"] + "Referer": [ + "http://opbeans-node:3000/orders" + ], + "Traceparent": [ + "00-978b56807e0b7a27cbc41a0dfb665f47-3358a24e09e23561-01" + ], + "User-Agent": [ + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.6" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.8" + } }, "response": { "headers": { - "Connection": ["keep-alive"], - "Content-Length": ["2"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:40 GMT"], - "Etag": ["W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\""], - "X-Powered-By": ["Express"] + "Connection": [ + "keep-alive" + ], + "Content-Length": [ + "2" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:28 GMT" + ], + "Etag": [ + "W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -593,7 +986,9 @@ "version": "8.0.0", "version_major": 8 }, - "parent": { "id": "5ff346d602ce27b0" }, + "parent": { + "id": "3358a24e09e23561" + }, "process": { "args": [ "/usr/local/bin/node", @@ -604,27 +999,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.6" }, - "timestamp": { "us": 1593413320106015 }, - "trace": { "id": "90bd7780b32cc51a7f4c200b1e0c170f" }, + "source": { + "ip": "172.18.0.8" + }, + "timestamp": { + "us": 1593413308782015 + }, + "trace": { + "id": "978b56807e0b7a27cbc41a0dfb665f47" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 7424 }, - "id": "f3dd00d12c594cba", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 7134 + }, + "id": "a6d8f3c5c98903e1", "name": "GET /api/orders", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 2 }, + "span_count": { + "started": 2 + }, "type": "request" }, "url": { @@ -635,60 +1055,96 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Spider" }, - "name": "Java", - "original": "Java/11.0.7", - "version": "0.7." + "device": { + "name": "Other" + }, + "name": "HeadlessChrome", + "original": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", + "os": { + "name": "Linux" + }, + "version": "79.0.3945" } - }, - "p95": 11616, - "averageResponseTime": 7615.625, - "transactionsPerMinute": 2, - "impact": 2.6645791239678345 + } }, { - "name": "GET /api/products", + "key": "GET /api/products", + "averageResponseTime": 8585, + "transactionsPerMinute": 1.75, + "impact": 2.624924094061731, + "p95": 22112, "sample": { - "@timestamp": "2020-06-29T06:48:27.452Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.6" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:29.978463Z" }, + "@timestamp": "2020-06-29T06:48:21.475Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:26.996210Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Accept": [ - "text/plain, application/json, application/x-jackson-smile, application/cbor, application/*+json, */*" + "Connection": [ + "close" ], - "Connection": ["keep-alive"], - "Elastic-Apm-Traceparent": [ - "00-27b168a328e0fd442377de8eaa0bf582-2c86873dedb66c2c-01" + "Host": [ + "opbeans-node:3000" ], - "Host": ["opbeans-node:3000"], - "Traceparent": ["00-27b168a328e0fd442377de8eaa0bf582-2c86873dedb66c2c-01"], - "User-Agent": ["Java/11.0.7"] + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.6" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Connection": ["keep-alive"], - "Content-Length": ["1023"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:27 GMT"], - "Etag": ["W/\"3ff-VyOxcDApb+a/lnjkm9FeTOGSDrs\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "1023" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:21 GMT" + ], + "Etag": [ + "W/\"3ff-VyOxcDApb+a/lnjkm9FeTOGSDrs\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -708,7 +1164,6 @@ "version": "8.0.0", "version_major": 8 }, - "parent": { "id": "2c86873dedb66c2c" }, "process": { "args": [ "/usr/local/bin/node", @@ -719,27 +1174,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.6" }, - "timestamp": { "us": 1593413307452013 }, - "trace": { "id": "27b168a328e0fd442377de8eaa0bf582" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413301475015 + }, + "trace": { + "id": "389b26b16949c7f783223de4f14b788c" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 4292 }, - "id": "141ecc2dfd55eeea", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 6775 + }, + "id": "d2d4088a0b104fb4", "name": "GET /api/products", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 2 }, + "span_count": { + "started": 2 + }, "type": "request" }, "url": { @@ -750,53 +1230,92 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Spider" }, - "name": "Java", - "original": "Java/11.0.7", - "version": "0.7." + "device": { + "name": "Other" + }, + "name": "Other", + "original": "workload/2.4.3" } - }, - "p95": 22112, - "averageResponseTime": 8585, - "transactionsPerMinute": 1.75, - "impact": 2.624924094061731 + } }, { - "name": "GET /api/products/:id", + "key": "GET /api/products/:id", + "averageResponseTime": 13516.5, + "transactionsPerMinute": 1, + "impact": 2.3368756900811305, + "p95": 37856, "sample": { - "@timestamp": "2020-06-29T06:48:24.977Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:27.004717Z" }, + "@timestamp": "2020-06-29T06:47:57.555Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:47:59.085077Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["231"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:24 GMT"], - "Etag": ["W/\"e7-kkuzj37GZDzXDh0CWqh5Gan0VO4\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "231" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:47:57 GMT" + ], + "Etag": [ + "W/\"e7-6JlJegaJ+ir0C8I8EmmOjms1dnc\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -822,87 +1341,152 @@ "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", "ecosystem-workload.config.js" ], - "pid": 137, + "pid": 87, "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413304977014 }, - "trace": { "id": "b9b290bca14c99962fa9a1c509401630" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413277555176 + }, + "trace": { + "id": "8365e1763f19e4067b88521d4d9247a0" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 4482 }, - "id": "b8d8284ff1fc25d6", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 37709 + }, + "id": "be2722a418272f10", "name": "GET /api/products/:id", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 1 }, + "span_count": { + "started": 1 + }, "type": "request" }, "url": { "domain": "opbeans-node", - "full": "http://opbeans-node:3000/api/products/3", - "original": "/api/products/3", - "path": "/api/products/3", + "full": "http://opbeans-node:3000/api/products/1", + "original": "/api/products/1", + "path": "/api/products/1", "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 37856, - "averageResponseTime": 13516.5, - "transactionsPerMinute": 1, - "impact": 2.3368756900811305 + } }, { - "name": "GET /api/types", + "key": "GET /api/types", + "averageResponseTime": 26992.5, + "transactionsPerMinute": 0.5, + "impact": 2.3330057413794503, + "p95": 45248, "sample": { - "@timestamp": "2020-06-29T06:48:26.443Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:29.977518Z" }, + "@timestamp": "2020-06-29T06:47:52.935Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:47:55.471071Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["112"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:26 GMT"], - "Etag": ["W/\"70-1z6hT7P1WHgBgS/BeUEVeHhOCQU\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "112" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:47:52 GMT" + ], + "Etag": [ + "W/\"70-1z6hT7P1WHgBgS/BeUEVeHhOCQU\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -928,31 +1512,56 @@ "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", "ecosystem-workload.config.js" ], - "pid": 137, + "pid": 63, "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413306443014 }, - "trace": { "id": "be3f4eb50d253afc032c90eacaa85072" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413272935117 + }, + "trace": { + "id": "2946c536a33d163d0c984d00d1f3839a" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 8892 }, - "id": "ccce129bb8c6b125", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 45093 + }, + "id": "103482fda88b9400", "name": "GET /api/types", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 2 }, + "span_count": { + "started": 2 + }, "type": "request" }, "url": { @@ -963,55 +1572,101 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 45248, - "averageResponseTime": 26992.5, - "transactionsPerMinute": 0.5, - "impact": 2.3330057413794503 + } }, { - "name": "GET static file", + "key": "GET static file", + "averageResponseTime": 3492.9285714285716, + "transactionsPerMinute": 3.5, + "impact": 2.0901067389184496, + "p95": 11900, "sample": { - "@timestamp": "2020-06-29T06:48:40.953Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.992454Z" }, + "@timestamp": "2020-06-29T06:47:53.427Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:47:55.472070Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Accept-Ranges": ["bytes"], - "Cache-Control": ["public, max-age=0"], - "Connection": ["close"], - "Content-Length": ["15086"], - "Content-Type": ["image/x-icon"], - "Date": ["Mon, 29 Jun 2020 06:48:40 GMT"], - "Etag": ["W/\"3aee-1725aff14f0\""], - "Last-Modified": ["Thu, 28 May 2020 11:16:06 GMT"], - "X-Powered-By": ["Express"] + "Accept-Ranges": [ + "bytes" + ], + "Cache-Control": [ + "public, max-age=0" + ], + "Connection": [ + "close" + ], + "Content-Length": [ + "15086" + ], + "Content-Type": [ + "image/x-icon" + ], + "Date": [ + "Mon, 29 Jun 2020 06:47:53 GMT" + ], + "Etag": [ + "W/\"3aee-1725aff14f0\"" + ], + "Last-Modified": [ + "Thu, 28 May 2020 11:16:06 GMT" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -1031,30 +1686,53 @@ "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", "ecosystem-workload.config.js" ], - "pid": 137, + "pid": 63, "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413320953016 }, - "trace": { "id": "292393440bbe04385f3c2e3715ac35fe" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413273427016 + }, + "trace": { + "id": "ec8a804fedf28fcf81d5682d69a16970" + }, "transaction": { - "duration": { "us": 1671 }, - "id": "d1d964ca1865dce3", + "duration": { + "us": 4934 + }, + "id": "ab90a62901b770e6", "name": "GET static file", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 0 }, + "span_count": { + "started": 0 + }, "type": "request" }, "url": { @@ -1066,56 +1744,86 @@ "scheme": "http" }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 11900, - "averageResponseTime": 3492.9285714285716, - "transactionsPerMinute": 3.5, - "impact": 2.0901067389184496 + } }, { - "name": "GET /api/products/top", + "key": "GET /api/products/top", + "averageResponseTime": 22958.5, + "transactionsPerMinute": 0.5, + "impact": 1.9475397398343375, + "p95": 33216, "sample": { - "@timestamp": "2020-06-29T06:48:18.211Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.8" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:21.007197Z" }, + "@timestamp": "2020-06-29T06:48:01.200Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:02.734903Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Accept": ["*/*"], - "Accept-Encoding": ["gzip, deflate"], - "Connection": ["keep-alive"], - "Host": ["opbeans-node:3000"], - "Referer": ["http://opbeans-node:3000/dashboard"], - "Traceparent": ["00-4879105b2de793ca54ce7299aff0f5ce-0d67fab9c9dec84d-01"], + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], "User-Agent": [ - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36" + "workload/2.4.3" ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.8" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Connection": ["keep-alive"], - "Content-Length": ["2"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:18 GMT"], - "Etag": ["W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "2" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:01 GMT" + ], + "Etag": [ + "W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -1135,38 +1843,62 @@ "version": "8.0.0", "version_major": 8 }, - "parent": { "id": "0d67fab9c9dec84d" }, "process": { "args": [ "/usr/local/bin/node", "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", "ecosystem-workload.config.js" ], - "pid": 137, + "pid": 115, "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.8" }, - "timestamp": { "us": 1593413298211013 }, - "trace": { "id": "4879105b2de793ca54ce7299aff0f5ce" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413281200133 + }, + "trace": { + "id": "195f32efeb6f91e2f71b6bc8bb74ae3a" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 12820 }, - "id": "b15b12c837ab8b89", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 33097 + }, + "id": "22e72956dfc8967a", "name": "GET /api/products/top", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 1 }, + "span_count": { + "started": 1 + }, "type": "request" }, "url": { @@ -1177,56 +1909,103 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, - "name": "HeadlessChrome", - "original": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", - "os": { "name": "Linux" }, - "version": "79.0.3945" + "device": { + "name": "Other" + }, + "name": "Other", + "original": "workload/2.4.3" } - }, - "p95": 33216, - "averageResponseTime": 22958.5, - "transactionsPerMinute": 0.5, - "impact": 1.9475397398343375 + } }, { - "name": "GET /api/stats", + "key": "GET /api/stats", + "averageResponseTime": 7105.333333333333, + "transactionsPerMinute": 1.5, + "impact": 1.7905918202662048, + "p95": 15136, "sample": { - "@timestamp": "2020-06-29T06:48:39.451Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.984824Z" }, + "@timestamp": "2020-06-29T06:48:21.150Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.8" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:26.993832Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Accept": [ + "*/*" + ], + "Accept-Encoding": [ + "gzip, deflate" + ], + "Connection": [ + "keep-alive" + ], + "Host": [ + "opbeans-node:3000" + ], + "If-None-Match": [ + "W/\"5c-6I+bqIiLxvkWuwBUnTxhBoK4lBk\"" + ], + "Referer": [ + "http://opbeans-node:3000/dashboard" + ], + "Traceparent": [ + "00-ee0ce8b38b8d5945829fc1c9432538bf-39d52cd5f528d363-01" + ], + "User-Agent": [ + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.8" + } }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["92"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:39 GMT"], - "Etag": ["W/\"5c-6I+bqIiLxvkWuwBUnTxhBoK4lBk\""], - "X-Powered-By": ["Express"] + "Connection": [ + "keep-alive" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:21 GMT" + ], + "Etag": [ + "W/\"5c-6I+bqIiLxvkWuwBUnTxhBoK4lBk\"" + ], + "X-Powered-By": [ + "Express" + ] }, - "status_code": 200 + "status_code": 304 }, "version": "1.1" }, @@ -1244,6 +2023,9 @@ "version": "8.0.0", "version_major": 8 }, + "parent": { + "id": "39d52cd5f528d363" + }, "process": { "args": [ "/usr/local/bin/node", @@ -1254,27 +2036,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413319451016 }, - "trace": { "id": "a05787cb03a0af0863fab5e05de942f1" }, + "source": { + "ip": "172.18.0.8" + }, + "timestamp": { + "us": 1593413301150014 + }, + "trace": { + "id": "ee0ce8b38b8d5945829fc1c9432538bf" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 5050 }, - "id": "a7e004eba8f021ce", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 7273 + }, + "id": "05d5b62182c59a54", "name": "GET /api/stats", - "result": "HTTP 2xx", + "result": "HTTP 3xx", "sampled": true, - "span_count": { "started": 4 }, + "span_count": { + "started": 4 + }, "type": "request" }, "url": { @@ -1285,52 +2092,96 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, - "name": "Other", - "original": "workload/2.4.3" + "device": { + "name": "Other" + }, + "name": "HeadlessChrome", + "original": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", + "os": { + "name": "Linux" + }, + "version": "79.0.3945" } - }, - "p95": 15136, - "averageResponseTime": 7105.333333333333, - "transactionsPerMinute": 1.5, - "impact": 1.7905918202662048 + } }, { - "name": "GET /log-error", + "key": "GET /log-error", + "averageResponseTime": 35846, + "transactionsPerMinute": 0.25, + "impact": 1.466376117925459, + "p95": 35840, "sample": { "@timestamp": "2020-06-29T06:48:07.467Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:18.533253Z" }, + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:18.533253Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["24"], - "Content-Type": ["text/html; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:07 GMT"], - "Etag": ["W/\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "24" + ], + "Content-Type": [ + "text/html; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:07 GMT" + ], + "Etag": [ + "W/\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 500 }, @@ -1360,27 +2211,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413287467017 }, - "trace": { "id": "d518b2c4d72cd2aaf1e39bad7ebcbdbb" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413287467017 + }, + "trace": { + "id": "d518b2c4d72cd2aaf1e39bad7ebcbdbb" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 35846 }, + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 35846 + }, "id": "c7a30c1b076907ec", "name": "GET /log-error", "result": "HTTP 5xx", "sampled": true, - "span_count": { "started": 0 }, + "span_count": { + "started": 0 + }, "type": "request" }, "url": { @@ -1391,56 +2267,104 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 35840, - "averageResponseTime": 35846, - "transactionsPerMinute": 0.25, - "impact": 1.466376117925459 + } }, { - "name": "POST /api", + "key": "POST /api", + "averageResponseTime": 20011, + "transactionsPerMinute": 0.25, + "impact": 0.7098250353192541, + "p95": 19968, "sample": { "@timestamp": "2020-06-29T06:48:25.478Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:27.005671Z" }, + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:27.005671Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { - "body": { "original": "[REDACTED]" }, + "body": { + "original": "[REDACTED]" + }, "headers": { - "Accept": ["application/json"], - "Connection": ["close"], - "Content-Length": ["129"], - "Content-Type": ["application/json"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Accept": [ + "application/json" + ], + "Connection": [ + "close" + ], + "Content-Length": [ + "129" + ], + "Content-Type": [ + "application/json" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "post", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Allow": ["GET"], - "Connection": ["close"], - "Content-Type": ["application/json;charset=UTF-8"], - "Date": ["Mon, 29 Jun 2020 06:48:25 GMT"], - "Transfer-Encoding": ["chunked"], - "X-Powered-By": ["Express"] + "Allow": [ + "GET" + ], + "Connection": [ + "close" + ], + "Content-Type": [ + "application/json;charset=UTF-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:25 GMT" + ], + "Transfer-Encoding": [ + "chunked" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 405 }, @@ -1470,27 +2394,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413305478010 }, - "trace": { "id": "4bd9027dd1e355ec742970e2d6333124" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413305478010 + }, + "trace": { + "id": "4bd9027dd1e355ec742970e2d6333124" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 20011 }, + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 20011 + }, "id": "94104435cf151478", "name": "POST /api", "result": "HTTP 4xx", "sampled": true, - "span_count": { "started": 1 }, + "span_count": { + "started": 1 + }, "type": "request" }, "url": { @@ -1501,52 +2450,92 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 19968, - "averageResponseTime": 20011, - "transactionsPerMinute": 0.25, - "impact": 0.7098250353192541 + } }, { - "name": "GET /api/types/:id", + "key": "GET /api/types/:id", + "averageResponseTime": 8181, + "transactionsPerMinute": 0.5, + "impact": 0.5354862351657939, + "p95": 10080, "sample": { - "@timestamp": "2020-06-29T06:48:12.972Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:18.543436Z" }, + "@timestamp": "2020-06-29T06:47:53.928Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:47:55.472718Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["205"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:12 GMT"], - "Etag": ["W/\"cd-pFMi1QOVY6YqWe+nwcbZVviCths\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "205" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:47:53 GMT" + ], + "Etag": [ + "W/\"cd-pFMi1QOVY6YqWe+nwcbZVviCths\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -1572,31 +2561,56 @@ "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", "ecosystem-workload.config.js" ], - "pid": 137, + "pid": 63, "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413292972011 }, - "trace": { "id": "aea65cef5f902dda5d8e38f9fb38864d" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413273928016 + }, + "trace": { + "id": "0becaafb422bfeb69e047bf7153aa469" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 6300 }, - "id": "a5bdbe43ac05fae2", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 10062 + }, + "id": "0cee4574091bda3b", "name": "GET /api/types/:id", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 2 }, + "span_count": { + "started": 2 + }, "type": "request" }, "url": { @@ -1607,50 +2621,86 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 10080, - "averageResponseTime": 8181, - "transactionsPerMinute": 0.5, - "impact": 0.5354862351657939 + } }, { - "name": "GET /api/orders/:id", + "key": "GET /api/orders/:id", + "averageResponseTime": 4749.666666666667, + "transactionsPerMinute": 0.75, + "impact": 0.43453312891085794, + "p95": 7184, "sample": { "@timestamp": "2020-06-29T06:48:35.951Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:39.484133Z" }, + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:39.484133Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["0"], - "Date": ["Mon, 29 Jun 2020 06:48:35 GMT"], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "0" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:35 GMT" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 404 }, @@ -1680,27 +2730,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413315951017 }, - "trace": { "id": "95979caa80e6622cbbb2d308800c3016" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413315951017 + }, + "trace": { + "id": "95979caa80e6622cbbb2d308800c3016" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 3210 }, + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 3210 + }, "id": "30344988dace0b43", "name": "GET /api/orders/:id", "result": "HTTP 4xx", "sampled": true, - "span_count": { "started": 1 }, + "span_count": { + "started": 1 + }, "type": "request" }, "url": { @@ -1711,52 +2786,92 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 7184, - "averageResponseTime": 4749.666666666667, - "transactionsPerMinute": 0.75, - "impact": 0.43453312891085794 + } }, { - "name": "GET /api/products/:id/customers", + "key": "GET /api/products/:id/customers", + "averageResponseTime": 4757, + "transactionsPerMinute": 0.5, + "impact": 0.20830834986820673, + "p95": 5616, "sample": { - "@timestamp": "2020-06-29T06:48:41.956Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.994692Z" }, + "@timestamp": "2020-06-29T06:48:22.977Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:27.000765Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["2"], - "Content-Type": ["application/json; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:41 GMT"], - "Etag": ["W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\""], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "2" + ], + "Content-Type": [ + "application/json; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:22 GMT" + ], + "Etag": [ + "W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\"" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 200 }, @@ -1786,84 +2901,151 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413321956016 }, - "trace": { "id": "f735ac5fca8f83eebc748f4a2e009e61" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413302977008 + }, + "trace": { + "id": "da8f22fe652ccb6680b3029ab6efd284" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 3896 }, - "id": "b24ce95c855f83a4", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 5618 + }, + "id": "bc51c1523afaf57a", "name": "GET /api/products/:id/customers", "result": "HTTP 2xx", "sampled": true, - "span_count": { "started": 1 }, + "span_count": { + "started": 1 + }, "type": "request" }, "url": { "domain": "opbeans-node", - "full": "http://opbeans-node:3000/api/products/5/customers", - "original": "/api/products/5/customers", - "path": "/api/products/5/customers", + "full": "http://opbeans-node:3000/api/products/3/customers", + "original": "/api/products/3/customers", + "path": "/api/products/3/customers", "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 5616, - "averageResponseTime": 4757, - "transactionsPerMinute": 0.5, - "impact": 0.20830834986820673 + } }, { - "name": "GET /throw-error", + "key": "GET /throw-error", + "averageResponseTime": 2577, + "transactionsPerMinute": 0.5, + "impact": 0, + "p95": 3224, "sample": { - "@timestamp": "2020-06-29T06:48:42.954Z", - "agent": { "name": "nodejs", "version": "3.6.1" }, - "client": { "ip": "172.18.0.7" }, - "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "ecs": { "version": "1.5.0" }, - "event": { "ingested": "2020-06-29T06:48:43.996435Z" }, + "@timestamp": "2020-06-29T06:48:19.975Z", + "agent": { + "name": "nodejs", + "version": "3.6.1" + }, + "client": { + "ip": "172.18.0.7" + }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { + "version": "1.5.0" + }, + "event": { + "ingested": "2020-06-29T06:48:21.012520Z" + }, "host": { "architecture": "x64", "hostname": "41712ded148f", "ip": "172.18.0.7", "name": "41712ded148f", - "os": { "platform": "linux" } + "os": { + "platform": "linux" + } }, "http": { "request": { "headers": { - "Connection": ["close"], - "Host": ["opbeans-node:3000"], - "User-Agent": ["workload/2.4.3"] + "Connection": [ + "close" + ], + "Host": [ + "opbeans-node:3000" + ], + "User-Agent": [ + "workload/2.4.3" + ] }, "method": "get", - "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } }, "response": { "headers": { - "Connection": ["close"], - "Content-Length": ["148"], - "Content-Security-Policy": ["default-src 'none'"], - "Content-Type": ["text/html; charset=utf-8"], - "Date": ["Mon, 29 Jun 2020 06:48:42 GMT"], - "X-Content-Type-Options": ["nosniff"], - "X-Powered-By": ["Express"] + "Connection": [ + "close" + ], + "Content-Length": [ + "148" + ], + "Content-Security-Policy": [ + "default-src 'none'" + ], + "Content-Type": [ + "text/html; charset=utf-8" + ], + "Date": [ + "Mon, 29 Jun 2020 06:48:19 GMT" + ], + "X-Content-Type-Options": [ + "nosniff" + ], + "X-Powered-By": [ + "Express" + ] }, "status_code": 500 }, @@ -1893,27 +3075,52 @@ "ppid": 1, "title": "node /app/server.js" }, - "processor": { "event": "transaction", "name": "transaction" }, + "processor": { + "event": "transaction", + "name": "transaction" + }, "service": { "environment": "production", - "framework": { "name": "express", "version": "4.17.1" }, - "language": { "name": "javascript" }, + "framework": { + "name": "express", + "version": "4.17.1" + }, + "language": { + "name": "javascript" + }, "name": "opbeans-node", - "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, - "runtime": { "name": "node", "version": "12.18.1" }, + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { + "name": "node", + "version": "12.18.1" + }, "version": "1.0.0" }, - "source": { "ip": "172.18.0.7" }, - "timestamp": { "us": 1593413322954016 }, - "trace": { "id": "9d5aee7443a43db9820f622a10dfac6e" }, + "source": { + "ip": "172.18.0.7" + }, + "timestamp": { + "us": 1593413299975019 + }, + "trace": { + "id": "106f3a55b0b0ea327d1bbe4be66c3bcc" + }, "transaction": { - "custom": { "shoppingBasketCount": 42 }, - "duration": { "us": 1928 }, - "id": "8e6fc8c3f99e8fc9", + "custom": { + "shoppingBasketCount": 42 + }, + "duration": { + "us": 3226 + }, + "id": "247b9141552a9e73", "name": "GET /throw-error", "result": "HTTP 5xx", "sampled": true, - "span_count": { "started": 0 }, + "span_count": { + "started": 0 + }, "type": "request" }, "url": { @@ -1924,19 +3131,21 @@ "port": 3000, "scheme": "http" }, - "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user": { + "email": "kimchy@elastic.co", + "id": "42", + "name": "kimchy" + }, "user_agent": { - "device": { "name": "Other" }, + "device": { + "name": "Other" + }, "name": "Other", "original": "workload/2.4.3" } - }, - "p95": 3224, - "averageResponseTime": 2577, - "transactionsPerMinute": 0.5, - "impact": 0 + } } ], "isAggregationAccurate": true, - "bucketSize": 100 -} + "bucketSize": 1000 +} \ No newline at end of file diff --git a/x-pack/test/apm_api_integration/basic/tests/transaction_groups/top_transaction_groups.ts b/x-pack/test/apm_api_integration/basic/tests/transaction_groups/top_transaction_groups.ts index 43b2ad5414c7a..94559a3e4aa54 100644 --- a/x-pack/test/apm_api_integration/basic/tests/transaction_groups/top_transaction_groups.ts +++ b/x-pack/test/apm_api_integration/basic/tests/transaction_groups/top_transaction_groups.ts @@ -4,9 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ import expect from '@kbn/expect'; +import { sortBy } from 'lodash'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; import expectedTransactionGroups from './expectation/top_transaction_groups.json'; +function sortTransactionGroups(items: any[]) { + return sortBy(items, 'impact'); +} + +function omitSampleFromTransactionGroups(items: any[]) { + return sortTransactionGroups(items).map(({ sample, ...item }) => ({ ...item })); +} + export default function ApiTest({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); @@ -48,15 +57,19 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('returns the correct buckets (when ignoring samples)', async () => { - function omitSample(items: any[]) { - return items.map(({ sample, ...item }) => ({ ...item })); - } - - expect(omitSample(response.body.items)).to.eql(omitSample(expectedTransactionGroups.items)); + expect(omitSampleFromTransactionGroups(response.body.items)).to.eql( + omitSampleFromTransactionGroups(expectedTransactionGroups.items) + ); }); it('returns the correct buckets and samples', async () => { - expect(response.body.items).to.eql(expectedTransactionGroups.items); + // sample should provide enough information to deeplink to a transaction detail page + response.body.items.forEach((item: any) => { + expect(item.sample.trace.id).to.be.an('string'); + expect(item.sample.transaction.id).to.be.an('string'); + expect(item.sample.service.name).to.be('opbeans-node'); + expect(item.sample.transaction.name).to.be(item.key); + }); }); }); }); From fb4ee91f0ca40d2158d0756e1aac18b01ba69761 Mon Sep 17 00:00:00 2001 From: Jonathan Buttner <56361221+jonathan-buttner@users.noreply.github.com> Date: Tue, 28 Jul 2020 09:55:57 -0400 Subject: [PATCH 056/126] [Security Solution][Resolver] Fix resolver isStart event bug (#73357) * Check if category is array * Adding more tests and renaming to isStart * Handling the case where start is not at the front --- .../common/endpoint/generate_data.test.ts | 21 ++-- .../common/endpoint/generate_data.ts | 25 +++-- .../common/endpoint/models/event.test.ts | 96 ++++++++++++++----- .../common/endpoint/models/event.ts | 7 +- .../resolver/utils/children_helper.test.ts | 4 +- .../routes/resolver/utils/children_helper.ts | 4 +- 6 files changed, 111 insertions(+), 46 deletions(-) diff --git a/x-pack/plugins/security_solution/common/endpoint/generate_data.test.ts b/x-pack/plugins/security_solution/common/endpoint/generate_data.test.ts index fcea86be4ae9e..debe4a3da6a6f 100644 --- a/x-pack/plugins/security_solution/common/endpoint/generate_data.test.ts +++ b/x-pack/plugins/security_solution/common/endpoint/generate_data.test.ts @@ -3,6 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import _ from 'lodash'; import { EndpointDocGenerator, Event, @@ -79,9 +80,9 @@ describe('data generator', () => { const timestamp = new Date().getTime(); const processEvent = generator.generateEvent({ timestamp }); expect(processEvent['@timestamp']).toEqual(timestamp); - expect(processEvent.event.category).toEqual('process'); + expect(processEvent.event.category).toEqual(['process']); expect(processEvent.event.kind).toEqual('event'); - expect(processEvent.event.type).toEqual('start'); + expect(processEvent.event.type).toEqual(['start']); expect(processEvent.agent).not.toBeNull(); expect(processEvent.host).not.toBeNull(); expect(processEvent.process.entity_id).not.toBeNull(); @@ -94,7 +95,7 @@ describe('data generator', () => { expect(processEvent['@timestamp']).toEqual(timestamp); expect(processEvent.event.category).toEqual('dns'); expect(processEvent.event.kind).toEqual('event'); - expect(processEvent.event.type).toEqual('start'); + expect(processEvent.event.type).toEqual(['start']); expect(processEvent.agent).not.toBeNull(); expect(processEvent.host).not.toBeNull(); expect(processEvent.process.entity_id).not.toBeNull(); @@ -332,6 +333,12 @@ describe('data generator', () => { describe('creates alert ancestor tree', () => { let events: Event[]; + const isCategoryProcess = (event: Event) => { + return ( + _.isEqual(event.event.category, ['process']) || _.isEqual(event.event.category, 'process') + ); + }; + beforeEach(() => { events = generator.createAlertEventAncestry({ ancestors: 3, @@ -343,11 +350,7 @@ describe('data generator', () => { it('with n-1 process events', () => { for (let i = events.length - 2; i > 0; ) { const parentEntityIdOfChild = events[i].process.parent?.entity_id; - for ( - ; - --i >= -1 && (events[i].event.kind !== 'event' || events[i].event.category !== 'process'); - - ) { + for (; --i >= -1 && (events[i].event.kind !== 'event' || !isCategoryProcess(events[i])); ) { // related event - skip it } expect(i).toBeGreaterThanOrEqual(0); @@ -361,7 +364,7 @@ describe('data generator', () => { ; previousProcessEventIndex >= -1 && (events[previousProcessEventIndex].event.kind !== 'event' || - events[previousProcessEventIndex].event.category !== 'process'); + !isCategoryProcess(events[previousProcessEventIndex])); previousProcessEventIndex-- ) { // related event - skip it diff --git a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts index 66e786cb02e63..97ac5c9030a3d 100644 --- a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts +++ b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts @@ -35,7 +35,7 @@ interface EventOptions { timestamp?: number; entityID?: string; parentEntityID?: string; - eventType?: string; + eventType?: string | string[]; eventCategory?: string | string[]; processName?: string; ancestry?: string[]; @@ -572,9 +572,9 @@ export class EndpointDocGenerator { }, ...detailRecordForEventType, event: { - category: options.eventCategory ? options.eventCategory : 'process', + category: options.eventCategory ? options.eventCategory : ['process'], kind: 'event', - type: options.eventType ? options.eventType : 'start', + type: options.eventType ? options.eventType : ['start'], id: this.seededUUIDv4(), }, host: this.commonInfo.host, @@ -633,7 +633,12 @@ export class EndpointDocGenerator { // place the event in the right array depending on its category if (event.event.kind === 'event') { - if (event.event.category === 'process') { + if ( + (Array.isArray(event.event.category) && + event.event.category.length === 1 && + event.event.category[0] === 'process') || + event.event.category === 'process' + ) { node.lifecycle.push(event); } else { node.relatedEvents.push(event); @@ -812,8 +817,8 @@ export class EndpointDocGenerator { timestamp: timestamp + termProcessDuration * 1000, entityID: root.process.entity_id, parentEntityID: root.process.parent?.entity_id, - eventCategory: 'process', - eventType: 'end', + eventCategory: ['process'], + eventType: ['end'], }) ); } @@ -838,8 +843,8 @@ export class EndpointDocGenerator { timestamp: timestamp + termProcessDuration * 1000, entityID: ancestor.process.entity_id, parentEntityID: ancestor.process.parent?.entity_id, - eventCategory: 'process', - eventType: 'end', + eventCategory: ['process'], + eventType: ['end'], ancestry: ancestor.process.Ext?.ancestry, ancestryArrayLimit: opts.ancestryArraySize, }) @@ -936,8 +941,8 @@ export class EndpointDocGenerator { timestamp: timestamp + processDuration * 1000, entityID: child.process.entity_id, parentEntityID: child.process.parent?.entity_id, - eventCategory: 'process', - eventType: 'end', + eventCategory: ['process'], + eventType: ['end'], ancestry: child.process.Ext?.ancestry, ancestryArrayLimit: opts.ancestryArraySize, }); diff --git a/x-pack/plugins/security_solution/common/endpoint/models/event.test.ts b/x-pack/plugins/security_solution/common/endpoint/models/event.test.ts index a0bf00f0274e6..62f923aa6d793 100644 --- a/x-pack/plugins/security_solution/common/endpoint/models/event.test.ts +++ b/x-pack/plugins/security_solution/common/endpoint/models/event.test.ts @@ -4,38 +4,90 @@ * you may not use this file except in compliance with the Elastic License. */ import { EndpointDocGenerator } from '../generate_data'; -import { descriptiveName } from './event'; +import { descriptiveName, isStart } from './event'; +import { ResolverEvent } from '../types'; -describe('Event descriptive names', () => { +describe('Generated documents', () => { let generator: EndpointDocGenerator; beforeEach(() => { generator = new EndpointDocGenerator('seed'); }); - it('returns the right name for a registry event', () => { - const extensions = { registry: { key: `HKLM/Windows/Software/abc` } }; - const event = generator.generateEvent({ eventCategory: 'registry', extensions }); - expect(descriptiveName(event)).toEqual({ subject: `HKLM/Windows/Software/abc` }); - }); + describe('Event descriptive names', () => { + it('returns the right name for a registry event', () => { + const extensions = { registry: { key: `HKLM/Windows/Software/abc` } }; + const event = generator.generateEvent({ eventCategory: 'registry', extensions }); + expect(descriptiveName(event)).toEqual({ subject: `HKLM/Windows/Software/abc` }); + }); - it('returns the right name for a network event', () => { - const randomIP = `${generator.randomIP()}`; - const extensions = { network: { direction: 'outbound', forwarded_ip: randomIP } }; - const event = generator.generateEvent({ eventCategory: 'network', extensions }); - expect(descriptiveName(event)).toEqual({ subject: `${randomIP}`, descriptor: 'outbound' }); - }); + it('returns the right name for a network event', () => { + const randomIP = `${generator.randomIP()}`; + const extensions = { network: { direction: 'outbound', forwarded_ip: randomIP } }; + const event = generator.generateEvent({ eventCategory: 'network', extensions }); + expect(descriptiveName(event)).toEqual({ subject: `${randomIP}`, descriptor: 'outbound' }); + }); - it('returns the right name for a file event', () => { - const extensions = { file: { path: 'C:\\My Documents\\business\\January\\processName' } }; - const event = generator.generateEvent({ eventCategory: 'file', extensions }); - expect(descriptiveName(event)).toEqual({ - subject: 'C:\\My Documents\\business\\January\\processName', + it('returns the right name for a file event', () => { + const extensions = { file: { path: 'C:\\My Documents\\business\\January\\processName' } }; + const event = generator.generateEvent({ eventCategory: 'file', extensions }); + expect(descriptiveName(event)).toEqual({ + subject: 'C:\\My Documents\\business\\January\\processName', + }); + }); + + it('returns the right name for a dns event', () => { + const extensions = { dns: { question: { name: `${generator.randomIP()}` } } }; + const event = generator.generateEvent({ eventCategory: 'dns', extensions }); + expect(descriptiveName(event)).toEqual({ subject: extensions.dns.question.name }); }); }); - it('returns the right name for a dns event', () => { - const extensions = { dns: { question: { name: `${generator.randomIP()}` } } }; - const event = generator.generateEvent({ eventCategory: 'dns', extensions }); - expect(descriptiveName(event)).toEqual({ subject: extensions.dns.question.name }); + describe('Start events', () => { + it('is a start event when event.type is a string', () => { + const event: ResolverEvent = generator.generateEvent({ + eventType: 'start', + }); + expect(isStart(event)).toBeTruthy(); + }); + + it('is a start event when event.type is an array of strings', () => { + const event: ResolverEvent = generator.generateEvent({ + eventType: ['start'], + }); + expect(isStart(event)).toBeTruthy(); + }); + + it('is a start event when event.type is an array of strings and contains start', () => { + let event: ResolverEvent = generator.generateEvent({ + eventType: ['bogus', 'start', 'creation'], + }); + expect(isStart(event)).toBeTruthy(); + + event = generator.generateEvent({ + eventType: ['start', 'bogus'], + }); + expect(isStart(event)).toBeTruthy(); + }); + + it('is not a start event when event.type is not start', () => { + const event: ResolverEvent = generator.generateEvent({ + eventType: ['end'], + }); + expect(isStart(event)).toBeFalsy(); + }); + + it('is not a start event when event.type is empty', () => { + const event: ResolverEvent = generator.generateEvent({ + eventType: [], + }); + expect(isStart(event)).toBeFalsy(); + }); + + it('is not a start event when event.type is bogus', () => { + const event: ResolverEvent = generator.generateEvent({ + eventType: ['bogus'], + }); + expect(isStart(event)).toBeFalsy(); + }); }); }); diff --git a/x-pack/plugins/security_solution/common/endpoint/models/event.ts b/x-pack/plugins/security_solution/common/endpoint/models/event.ts index f53da8fb1f096..216b5cc028588 100644 --- a/x-pack/plugins/security_solution/common/endpoint/models/event.ts +++ b/x-pack/plugins/security_solution/common/endpoint/models/event.ts @@ -9,10 +9,15 @@ export function isLegacyEvent(event: ResolverEvent): event is LegacyEndpointEven return (event as LegacyEndpointEvent).endgame !== undefined; } -export function isProcessStart(event: ResolverEvent): boolean { +export function isStart(event: ResolverEvent): boolean { if (isLegacyEvent(event)) { return event.event?.type === 'process_start' || event.event?.action === 'fork_event'; } + + if (Array.isArray(event.event.type)) { + return event.event.type.includes('start'); + } + return event.event.type === 'start'; } diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_helper.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_helper.test.ts index ca5b5aef0f651..01dd59b2611d9 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_helper.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_helper.test.ts @@ -10,12 +10,12 @@ import { TreeNode, } from '../../../../../common/endpoint/generate_data'; import { ChildrenNodesHelper } from './children_helper'; -import { eventId, isProcessStart } from '../../../../../common/endpoint/models/event'; +import { eventId, isStart } from '../../../../../common/endpoint/models/event'; function getStartEvents(events: Event[]): Event[] { const startEvents: Event[] = []; for (const event of events) { - if (isProcessStart(event)) { + if (isStart(event)) { startEvents.push(event); } } diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_helper.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_helper.ts index 01e356682ac47..d3ca7a54c16d2 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_helper.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/children_helper.ts @@ -7,7 +7,7 @@ import { entityId, parentEntityId, - isProcessStart, + isStart, getAncestryAsArray, } from '../../../../../common/endpoint/models/event'; import { @@ -99,7 +99,7 @@ export class ChildrenNodesHelper { for (const event of startEvents) { const parentID = parentEntityId(event); const entityID = entityId(event); - if (parentID && entityID && isProcessStart(event)) { + if (parentID && entityID && isStart(event)) { // don't actually add the start event to the node, because that'll be done in // a different call const childNode = this.getOrCreateChildNode(entityID); From 5e8e01fd0f3ea5516a2f68bef9e7a9877b9e549a Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Tue, 28 Jul 2020 15:00:41 +0100 Subject: [PATCH 057/126] removed ESO migration from alerting (#73420) This PR removes the use of ESO migration from alerting as we do not actually need this until the RBAC work lands, which should be 7.10. This allows us to concentrate the challenges of introducing RBAC into one single release which hopefully will help us better mitigate potential regressions. --- .../alerts/server/saved_objects/index.ts | 2 - .../server/saved_objects/migrations.test.ts | 121 ------------------ .../alerts/server/saved_objects/migrations.ts | 53 -------- .../spaces_only/tests/alerting/index.ts | 3 - .../spaces_only/tests/alerting/migrations.ts | 43 ------- 5 files changed, 222 deletions(-) delete mode 100644 x-pack/plugins/alerts/server/saved_objects/migrations.test.ts delete mode 100644 x-pack/plugins/alerts/server/saved_objects/migrations.ts delete mode 100644 x-pack/test/alerting_api_integration/spaces_only/tests/alerting/migrations.ts diff --git a/x-pack/plugins/alerts/server/saved_objects/index.ts b/x-pack/plugins/alerts/server/saved_objects/index.ts index 06ce8d673e6b7..c98d9bcbd9ae5 100644 --- a/x-pack/plugins/alerts/server/saved_objects/index.ts +++ b/x-pack/plugins/alerts/server/saved_objects/index.ts @@ -6,7 +6,6 @@ import { SavedObjectsServiceSetup } from 'kibana/server'; import mappings from './mappings.json'; -import { getMigrations } from './migrations'; import { EncryptedSavedObjectsPluginSetup } from '../../../encrypted_saved_objects/server'; export function setupSavedObjects( @@ -17,7 +16,6 @@ export function setupSavedObjects( name: 'alert', hidden: true, namespaceType: 'single', - migrations: getMigrations(encryptedSavedObjects), mappings: mappings.alert, }); diff --git a/x-pack/plugins/alerts/server/saved_objects/migrations.test.ts b/x-pack/plugins/alerts/server/saved_objects/migrations.test.ts deleted file mode 100644 index 19f4e918b7862..0000000000000 --- a/x-pack/plugins/alerts/server/saved_objects/migrations.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import uuid from 'uuid'; -import { getMigrations } from './migrations'; -import { RawAlert } from '../types'; -import { SavedObjectUnsanitizedDoc } from 'kibana/server'; -import { encryptedSavedObjectsMock } from '../../../encrypted_saved_objects/server/mocks'; -import { migrationMocks } from 'src/core/server/mocks'; - -const { log } = migrationMocks.createContext(); -const encryptedSavedObjectsSetup = encryptedSavedObjectsMock.createSetup(); - -describe('7.9.0', () => { - beforeEach(() => { - jest.resetAllMocks(); - encryptedSavedObjectsSetup.createMigration.mockImplementation( - (shouldMigrateWhenPredicate, migration) => migration - ); - }); - - test('changes nothing on alerts by other plugins', () => { - const migration790 = getMigrations(encryptedSavedObjectsSetup)['7.9.0']; - const alert = getMockData({}); - expect(migration790(alert, { log })).toMatchObject(alert); - - expect(encryptedSavedObjectsSetup.createMigration).toHaveBeenCalledWith( - expect.any(Function), - expect.any(Function) - ); - }); - - test('migrates the consumer for alerting', () => { - const migration790 = getMigrations(encryptedSavedObjectsSetup)['7.9.0']; - const alert = getMockData({ - consumer: 'alerting', - }); - expect(migration790(alert, { log })).toMatchObject({ - ...alert, - attributes: { - ...alert.attributes, - consumer: 'alerts', - }, - }); - }); -}); - -describe('7.10.0', () => { - beforeEach(() => { - jest.resetAllMocks(); - encryptedSavedObjectsSetup.createMigration.mockImplementation( - (shouldMigrateWhenPredicate, migration) => migration - ); - }); - - test('changes nothing on alerts by other plugins', () => { - const migration710 = getMigrations(encryptedSavedObjectsSetup)['7.10.0']; - const alert = getMockData({}); - expect(migration710(alert, { log })).toMatchObject(alert); - - expect(encryptedSavedObjectsSetup.createMigration).toHaveBeenCalledWith( - expect.any(Function), - expect.any(Function) - ); - }); - - test('migrates the consumer for metrics', () => { - const migration710 = getMigrations(encryptedSavedObjectsSetup)['7.10.0']; - const alert = getMockData({ - consumer: 'metrics', - }); - expect(migration710(alert, { log })).toMatchObject({ - ...alert, - attributes: { - ...alert.attributes, - consumer: 'infrastructure', - }, - }); - }); -}); - -function getMockData( - overwrites: Record = {} -): SavedObjectUnsanitizedDoc { - return { - attributes: { - enabled: true, - name: 'abc', - tags: ['foo'], - alertTypeId: '123', - consumer: 'bar', - apiKey: '', - apiKeyOwner: '', - schedule: { interval: '10s' }, - throttle: null, - params: { - bar: true, - }, - muteAll: false, - mutedInstanceIds: [], - createdBy: new Date().toISOString(), - updatedBy: new Date().toISOString(), - createdAt: new Date().toISOString(), - actions: [ - { - group: 'default', - actionRef: '1', - actionTypeId: '1', - params: { - foo: true, - }, - }, - ], - ...overwrites, - }, - id: uuid.v4(), - type: 'alert', - }; -} diff --git a/x-pack/plugins/alerts/server/saved_objects/migrations.ts b/x-pack/plugins/alerts/server/saved_objects/migrations.ts deleted file mode 100644 index 57a4005887093..0000000000000 --- a/x-pack/plugins/alerts/server/saved_objects/migrations.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { - SavedObjectMigrationMap, - SavedObjectUnsanitizedDoc, - SavedObjectMigrationFn, -} from '../../../../../src/core/server'; -import { RawAlert } from '../types'; -import { EncryptedSavedObjectsPluginSetup } from '../../../encrypted_saved_objects/server'; - -export function getMigrations( - encryptedSavedObjects: EncryptedSavedObjectsPluginSetup -): SavedObjectMigrationMap { - return { - /** - * In v7.9.0 we changed the Alerting plugin so it uses the `consumer` value of `alerts` - * prior to that we were using `alerting` and we need to keep these in sync - */ - '7.9.0': changeAlertingConsumer(encryptedSavedObjects, 'alerting', 'alerts'), - /** - * In v7.10.0 we changed the Matrics plugin so it uses the `consumer` value of `infrastructure` - * prior to that we were using `metrics` and we need to keep these in sync - */ - '7.10.0': changeAlertingConsumer(encryptedSavedObjects, 'metrics', 'infrastructure'), - }; -} - -function changeAlertingConsumer( - encryptedSavedObjects: EncryptedSavedObjectsPluginSetup, - from: string, - to: string -): SavedObjectMigrationFn { - return encryptedSavedObjects.createMigration( - function shouldBeMigrated(doc): doc is SavedObjectUnsanitizedDoc { - return doc.attributes.consumer === from; - }, - (doc: SavedObjectUnsanitizedDoc): SavedObjectUnsanitizedDoc => { - const { - attributes: { consumer }, - } = doc; - return { - ...doc, - attributes: { - ...doc.attributes, - consumer: consumer === from ? to : consumer, - }, - }; - } - ); -} diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/index.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/index.ts index 0970738b630c4..a23f0fa835313 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/index.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/index.ts @@ -27,8 +27,5 @@ export default function alertingTests({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./alerts_space1')); loadTestFile(require.resolve('./alerts_default_space')); loadTestFile(require.resolve('./builtin_alert_types')); - - // note that this test will destroy existing spaces - loadTestFile(require.resolve('./migrations')); }); } diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/migrations.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/migrations.ts deleted file mode 100644 index d0e1be12e762f..0000000000000 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/migrations.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { getUrlPrefix } from '../../../common/lib'; -import { FtrProviderContext } from '../../../common/ftr_provider_context'; - -// eslint-disable-next-line import/no-default-export -export default function createGetTests({ getService }: FtrProviderContext) { - const supertest = getService('supertest'); - const esArchiver = getService('esArchiver'); - - describe('migrations', () => { - before(async () => { - await esArchiver.load('alerts'); - }); - - after(async () => { - await esArchiver.unload('alerts'); - }); - - it('7.9.0 migrates the `alerting` consumer to be the `alerts`', async () => { - const response = await supertest.get( - `${getUrlPrefix(``)}/api/alerts/alert/74f3e6d7-b7bb-477d-ac28-92ee22728e6e` - ); - - expect(response.status).to.eql(200); - expect(response.body.consumer).to.equal('alerts'); - }); - - it('7.10.0 migrates the `metrics` consumer to be the `infrastructure`', async () => { - const response = await supertest.get( - `${getUrlPrefix(``)}/api/alerts/alert/74f3e6d7-b7bb-477d-ac28-fdf248d5f2a4` - ); - - expect(response.status).to.eql(200); - expect(response.body.consumer).to.equal('infrastructure'); - }); - }); -} From dca4a2359724e9121df0b919f57ef2fb14bada4c Mon Sep 17 00:00:00 2001 From: Andrew Goldstein Date: Tue, 28 Jul 2020 08:09:35 -0600 Subject: [PATCH 058/126] [Security Solution] Full screen fixes for Timeline based views (#73421) ## Full screen fixes for Timeline based views - Fixes an issue where sometimes, Global navigation is hidden until the page is scrolled when exiting full screen mode - Improves performance by adding an intent delay before showing the draggable wrapper hover menu - Removes an unnecessary CSS transition ### Sometimes, Global navigation is hidden until the page is scrolled when exiting full screen mode Sometimes, after exiting `Full screen` mode in a page, for example, the `Detections` page, the global navigation, e.g. `Overview Detections Hosts...` is hidden until the page is scrolled. To reproduce: 1) Navigate to the `Detections` page 2) Click the `Full screen` button in the table 3) Without scrolling the full screen view, click the `Exit full screen` button **Expected result** - [x] The global navigation e.g. `Overview Detections Hosts...` is visible above the search bar, per the screenshot below: ![correct-global-navigation](https://user-images.githubusercontent.com/4459398/87717870-571bef80-c76e-11ea-8b7b-1850094326b3.png) 4) Once again, click the `Full screen` button in the table 5) This time, expand an event, which will scroll the view 6) Once again, click the `Exit full screen` button **Expected result** - [x] The global navigation e.g. `Overview Detections Hosts...` is visible above the search bar **Actual result** - [ ] Sometimes, the global navigation e.g. `Overview Detections Hosts...` is **not** visible until the page is scrolled --- .../security_solution/common/constants.ts | 1 + .../index.test.tsx | 3 + .../drag_and_drop/draggable_wrapper.test.tsx | 6 + .../drag_and_drop/provider_container.tsx | 7 -- .../filters_global/filters_global.test.tsx | 104 +++++++++++++++++- .../filters_global/filters_global.tsx | 29 +++-- .../public/common/components/page/index.tsx | 13 ++- .../components/with_hover_actions/index.tsx | 30 +++-- .../containers/use_full_screen/index.tsx | 12 +- .../detection_engine/detection_engine.tsx | 5 +- .../detection_engine/rules/details/index.tsx | 5 +- .../public/hosts/pages/details/index.tsx | 5 +- .../public/hosts/pages/hosts.tsx | 5 +- .../public/network/pages/ip_details/index.tsx | 2 +- .../public/network/pages/network.tsx | 5 +- .../public/overview/pages/overview.tsx | 2 +- .../fields_browser/field_name.test.tsx | 6 + 17 files changed, 206 insertions(+), 34 deletions(-) diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index f934d90c740a5..c74cf888a2db6 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -32,6 +32,7 @@ export const DEFAULT_INTERVAL_PAUSE = true; export const DEFAULT_INTERVAL_TYPE = 'manual'; export const DEFAULT_INTERVAL_VALUE = 300000; // ms export const DEFAULT_TIMEPICKER_QUICK_RANGES = 'timepicker:quickRanges'; +export const SCROLLING_DISABLED_CLASS_NAME = 'scrolling-disabled'; export const FILTERS_GLOBAL_HEIGHT = 109; // px export const FULL_SCREEN_TOGGLED_CLASS_NAME = 'fullScreenToggled'; export const NO_ALERT_INDEX = 'no-alert-index-049FC71A-4C2C-446F-9901-37XMC5024C51'; diff --git a/x-pack/plugins/security_solution/public/common/components/add_filter_to_global_search_bar/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/add_filter_to_global_search_bar/index.test.tsx index 2af6569394e8f..eced73e9c3d67 100644 --- a/x-pack/plugins/security_solution/public/common/components/add_filter_to_global_search_bar/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/add_filter_to_global_search_bar/index.test.tsx @@ -45,6 +45,7 @@ describe('AddFilterToGlobalSearchBar Component', () => { ); beforeEach(() => { + jest.useFakeTimers(); store = createStore( state, SUB_PLUGINS_REDUCER, @@ -159,6 +160,8 @@ describe('AddFilterToGlobalSearchBar Component', () => { wrapper.find('[data-test-subj="withHoverActionsButton"]').simulate('mouseenter'); wrapper.update(); + jest.runAllTimers(); + wrapper.update(); wrapper .find('[data-test-subj="hover-actions-container"] [data-euiicon-type]') diff --git a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper.test.tsx b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper.test.tsx index e17fc7b9ef9bd..ebfa9ac22bdc7 100644 --- a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/draggable_wrapper.test.tsx @@ -22,6 +22,10 @@ describe('DraggableWrapper', () => { const message = 'draggable wrapper content'; const mount = useMountAppended(); + beforeEach(() => { + jest.useFakeTimers(); + }); + describe('rendering', () => { test('it renders against the snapshot', () => { const wrapper = shallow( @@ -78,6 +82,8 @@ describe('DraggableWrapper', () => { wrapper.find('[data-test-subj="withHoverActionsButton"]').simulate('mouseenter'); wrapper.update(); + jest.runAllTimers(); + wrapper.update(); expect(wrapper.find('[data-test-subj="copy-to-clipboard"]').exists()).toBe(true); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/provider_container.tsx b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/provider_container.tsx index 06cb8ee2e1a46..8db6d073f9687 100644 --- a/x-pack/plugins/security_solution/public/common/components/drag_and_drop/provider_container.tsx +++ b/x-pack/plugins/security_solution/public/common/components/drag_and_drop/provider_container.tsx @@ -13,13 +13,6 @@ interface ProviderContainerProps { } const ProviderContainerComponent = styled.div` - &, - &::before, - &::after { - transition: background ${({ theme }) => theme.eui.euiAnimSpeedFast} ease, - color ${({ theme }) => theme.eui.euiAnimSpeedFast} ease; - } - ${({ isDragging }) => !isDragging && css` diff --git a/x-pack/plugins/security_solution/public/common/components/filters_global/filters_global.test.tsx b/x-pack/plugins/security_solution/public/common/components/filters_global/filters_global.test.tsx index ffac0496e9f1a..9fda60b1f289d 100644 --- a/x-pack/plugins/security_solution/public/common/components/filters_global/filters_global.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/filters_global/filters_global.test.tsx @@ -4,20 +4,120 @@ * you may not use this file except in compliance with the Elastic License. */ -import { shallow } from 'enzyme'; +import { mount, ReactWrapper, shallow } from 'enzyme'; import React from 'react'; +import { StickyContainer } from 'react-sticky'; import '../../mock/match_media'; import { FiltersGlobal } from './filters_global'; +import { TestProviders } from '../../mock/test_providers'; describe('rendering', () => { test('renders correctly', () => { const wrapper = shallow( - +

      {'Additional filters here.'}

      ); expect(wrapper).toMatchSnapshot(); }); + + describe('full screen mode', () => { + let wrapper: ReactWrapper; + + beforeEach(() => { + wrapper = mount( + + + +

      {'Filter content'}

      +
      +
      +
      + ); + }); + + test('it does NOT render the sticky container', () => { + expect(wrapper.find('[data-test-subj="sticky-filters-global-container"]').exists()).toBe( + false + ); + }); + + test('it renders the non-sticky container', () => { + expect(wrapper.find('[data-test-subj="non-sticky-global-container"]').exists()).toBe(true); + }); + + test('it does NOT render the container with a `display: none` style when `show` is true (the default)', () => { + expect( + wrapper.find('[data-test-subj="non-sticky-global-container"]').first() + ).not.toHaveStyleRule('display', 'none'); + }); + }); + + describe('non-full screen mode', () => { + let wrapper: ReactWrapper; + + beforeEach(() => { + wrapper = mount( + + + +

      {'Filter content'}

      +
      +
      +
      + ); + }); + + test('it renders the sticky container', () => { + expect(wrapper.find('[data-test-subj="sticky-filters-global-container"]').exists()).toBe( + true + ); + }); + + test('it does NOT render the non-sticky container', () => { + expect(wrapper.find('[data-test-subj="non-sticky-global-container"]').exists()).toBe(false); + }); + + test('it does NOT render the container with a `display: none` style when `show` is true (the default)', () => { + expect( + wrapper.find('[data-test-subj="sticky-filters-global-container"]').first() + ).not.toHaveStyleRule('display', 'none'); + }); + }); + + describe('when show is false', () => { + test('in full screen mode it renders the container with a `display: none` style', () => { + const wrapper = mount( + + + +

      {'Filter content'}

      +
      +
      +
      + ); + + expect( + wrapper.find('[data-test-subj="non-sticky-global-container"]').first() + ).toHaveStyleRule('display', 'none'); + }); + + test('in non-full screen mode it renders the container with a `display: none` style', () => { + const wrapper = mount( + + + +

      {'Filter content'}

      +
      +
      +
      + ); + + expect( + wrapper.find('[data-test-subj="sticky-filters-global-container"]').first() + ).toHaveStyleRule('display', 'none'); + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/filters_global/filters_global.tsx b/x-pack/plugins/security_solution/public/common/components/filters_global/filters_global.tsx index b52438486406e..80e7209492fa5 100644 --- a/x-pack/plugins/security_solution/public/common/components/filters_global/filters_global.tsx +++ b/x-pack/plugins/security_solution/public/common/components/filters_global/filters_global.tsx @@ -47,20 +47,33 @@ const FiltersGlobalContainer = styled.header<{ show: boolean }>` FiltersGlobalContainer.displayName = 'FiltersGlobalContainer'; +const NO_STYLE: React.CSSProperties = {}; + export interface FiltersGlobalProps { children: React.ReactNode; + globalFullScreen: boolean; show?: boolean; } -export const FiltersGlobal = React.memo(({ children, show = true }) => ( - - {({ style, isSticky }) => ( - - +export const FiltersGlobal = React.memo( + ({ children, globalFullScreen, show = true }) => + globalFullScreen ? ( + + {children} - )} - -)); + ) : ( + + {({ style, isSticky }) => ( + + + {children} + + + )} + + ) +); + FiltersGlobal.displayName = 'FiltersGlobal'; diff --git a/x-pack/plugins/security_solution/public/common/components/page/index.tsx b/x-pack/plugins/security_solution/public/common/components/page/index.tsx index 8737fa95c94a2..8bf0690bfd0ad 100644 --- a/x-pack/plugins/security_solution/public/common/components/page/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/page/index.tsx @@ -7,7 +7,10 @@ import { EuiBadge, EuiDescriptionList, EuiFlexGroup, EuiIcon, EuiPage } from '@elastic/eui'; import styled, { createGlobalStyle } from 'styled-components'; -import { FULL_SCREEN_TOGGLED_CLASS_NAME } from '../../../../common/constants'; +import { + FULL_SCREEN_TOGGLED_CLASS_NAME, + SCROLLING_DISABLED_CLASS_NAME, +} from '../../../../common/constants'; /* SIDE EFFECT: the following `createGlobalStyle` overrides default styling in angular code that was not theme-friendly @@ -63,6 +66,14 @@ export const AppGlobalStyle = createGlobalStyle<{ theme: { eui: { euiColorPrimar .${FULL_SCREEN_TOGGLED_CLASS_NAME} { ${({ theme }) => `background-color: ${theme.eui.euiColorPrimary} !important`}; } + + .${SCROLLING_DISABLED_CLASS_NAME} body { + overflow-y: hidden; + } + + .${SCROLLING_DISABLED_CLASS_NAME} #kibana-body { + overflow-y: hidden; + } `; export const DescriptionListStyled = styled(EuiDescriptionList)` diff --git a/x-pack/plugins/security_solution/public/common/components/with_hover_actions/index.tsx b/x-pack/plugins/security_solution/public/common/components/with_hover_actions/index.tsx index 9e28345ffbbcf..b4abdd4b91805 100644 --- a/x-pack/plugins/security_solution/public/common/components/with_hover_actions/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/with_hover_actions/index.tsx @@ -10,6 +10,11 @@ import styled from 'styled-components'; import { IS_DRAGGING_CLASS_NAME } from '../drag_and_drop/helpers'; +/** + * To avoid expensive changes to the DOM, delay showing the popover menu + */ +const HOVER_INTENT_DELAY = 100; // ms + // eslint-disable-next-line @typescript-eslint/no-explicit-any const WithHoverActionsPopover = (styled(EuiPopover as any)` .euiPopover__anchor { @@ -51,18 +56,27 @@ export const WithHoverActions = React.memo( ({ alwaysShow = false, closePopOverTrigger, hoverContent, render }) => { const [isOpen, setIsOpen] = useState(hoverContent != null && alwaysShow); const [showHoverContent, setShowHoverContent] = useState(false); + const [hoverTimeout, setHoverTimeout] = useState(undefined); + const onMouseEnter = useCallback(() => { - // NOTE: the following read from the DOM is expensive, but not as - // expensive as the default behavior, which adds a div to the body, - // which-in turn performs a more expensive change to the layout - if (!document.body.classList.contains(IS_DRAGGING_CLASS_NAME)) { - setShowHoverContent(true); - } - }, []); + setHoverTimeout( + Number( + setTimeout(() => { + // NOTE: the following read from the DOM is expensive, but not as + // expensive as the default behavior, which adds a div to the body, + // which-in turn performs a more expensive change to the layout + if (!document.body.classList.contains(IS_DRAGGING_CLASS_NAME)) { + setShowHoverContent(true); + } + }, HOVER_INTENT_DELAY) + ) + ); + }, [setHoverTimeout, setShowHoverContent]); const onMouseLeave = useCallback(() => { + clearTimeout(hoverTimeout); setShowHoverContent(false); - }, []); + }, [hoverTimeout, setShowHoverContent]); const content = useMemo( () => ( diff --git a/x-pack/plugins/security_solution/public/common/containers/use_full_screen/index.tsx b/x-pack/plugins/security_solution/public/common/containers/use_full_screen/index.tsx index b8050034d34a6..aa0d90a216035 100644 --- a/x-pack/plugins/security_solution/public/common/containers/use_full_screen/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/use_full_screen/index.tsx @@ -6,6 +6,7 @@ import { useCallback, useMemo } from 'react'; import { useDispatch, useSelector } from 'react-redux'; +import { SCROLLING_DISABLED_CLASS_NAME } from '../../../../common/constants'; import { inputsSelectors } from '../../store'; import { inputsActions } from '../../store/actions'; @@ -16,7 +17,16 @@ export const useFullScreen = () => { const timelineFullScreen = useSelector(inputsSelectors.timelineFullScreenSelector) ?? false; const setGlobalFullScreen = useCallback( - (fullScreen: boolean) => dispatch(inputsActions.setFullScreen({ id: 'global', fullScreen })), + (fullScreen: boolean) => { + if (fullScreen) { + document.body.classList.add(SCROLLING_DISABLED_CLASS_NAME); + } else { + document.body.classList.remove(SCROLLING_DISABLED_CLASS_NAME); + setTimeout(() => window.scrollTo(0, 0), 0); + } + + dispatch(inputsActions.setFullScreen({ id: 'global', fullScreen })); + }, [dispatch] ); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx index 090fdc4980933..8385fcc71682d 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx @@ -156,7 +156,10 @@ export const DetectionEnginePageComponent: React.FC = ({ {indicesExist ? ( - + diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx index 9c130a7d351fa..90424e1fb9dd0 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx @@ -366,7 +366,10 @@ export const RuleDetailsPageComponent: FC = ({ {indicesExist ? ( - + diff --git a/x-pack/plugins/security_solution/public/hosts/pages/details/index.tsx b/x-pack/plugins/security_solution/public/hosts/pages/details/index.tsx index 781aa711ff0d9..b6c1727ee6afa 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/details/index.tsx +++ b/x-pack/plugins/security_solution/public/hosts/pages/details/index.tsx @@ -104,7 +104,10 @@ const HostDetailsComponent = React.memo( {indicesExist ? ( - + diff --git a/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx b/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx index 1219effa5ff6d..1d0b73f80a69a 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx +++ b/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx @@ -98,7 +98,10 @@ export const HostsComponent = React.memo( {indicesExist ? ( - + diff --git a/x-pack/plugins/security_solution/public/network/pages/ip_details/index.tsx b/x-pack/plugins/security_solution/public/network/pages/ip_details/index.tsx index e06f5489a3fc2..42469a4bf29da 100644 --- a/x-pack/plugins/security_solution/public/network/pages/ip_details/index.tsx +++ b/x-pack/plugins/security_solution/public/network/pages/ip_details/index.tsx @@ -90,7 +90,7 @@ export const IPDetailsComponent: React.FC {indicesExist ? ( - + diff --git a/x-pack/plugins/security_solution/public/network/pages/network.tsx b/x-pack/plugins/security_solution/public/network/pages/network.tsx index ca8da4eb711e5..f516f2a2de346 100644 --- a/x-pack/plugins/security_solution/public/network/pages/network.tsx +++ b/x-pack/plugins/security_solution/public/network/pages/network.tsx @@ -106,7 +106,10 @@ const NetworkComponent = React.memo( {indicesExist ? ( - + diff --git a/x-pack/plugins/security_solution/public/overview/pages/overview.tsx b/x-pack/plugins/security_solution/public/overview/pages/overview.tsx index 6563f3c2b824d..423aa597a0129 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/overview.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/overview.tsx @@ -71,7 +71,7 @@ const OverviewComponent: React.FC = ({ <> {indicesExist ? ( - + diff --git a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_name.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_name.test.tsx index ddd5c6f07e8b5..2e48215a89473 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_name.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_name.test.tsx @@ -28,6 +28,10 @@ const defaultProps = { }; describe('FieldName', () => { + beforeEach(() => { + jest.useFakeTimers(); + }); + test('it renders the field name', () => { const wrapper = mount( @@ -48,6 +52,8 @@ describe('FieldName', () => { ); wrapper.find('[data-test-subj="withHoverActionsButton"]').at(0).simulate('mouseenter'); wrapper.update(); + jest.runAllTimers(); + wrapper.update(); expect(wrapper.find('[data-test-subj="copy-to-clipboard"]').exists()).toBe(true); }); From f4104743e388c9cec6f91d153bfc4145f541cabb Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Tue, 28 Jul 2020 15:20:24 +0100 Subject: [PATCH 059/126] [Alerting] Control Alerts Management via feature controls & privileges (#72029) This PR removes the alerting and actions ui privileges (alerting:show, actions:show, etc...) and instead relies on the standard Kibana feature control model to decide whether management displays the Alerts Management section under management. --- examples/alerting_example/server/plugin.ts | 13 ++++- x-pack/plugins/actions/server/feature.ts | 9 ++++ .../alerting_builtins/server/feature.ts | 13 ++++- x-pack/plugins/alerts/server/plugin.ts | 10 ++++ x-pack/plugins/apm/server/feature.ts | 9 ++++ x-pack/plugins/infra/server/features.ts | 13 ++++- .../security_solution/server/plugin.ts | 13 ++++- .../public/application/app.tsx | 18 +++---- .../public/application/home.tsx | 40 ++++++-------- .../public/application/lib/capabilities.ts | 13 ----- .../components/alert_details.test.tsx | 3 -- .../sections/alert_form/alert_form.tsx | 22 ++++---- .../components/alerts_list.test.tsx | 28 ++-------- .../alerts_list/components/alerts_list.tsx | 53 ++++++++++--------- .../triggers_actions_ui/public/plugin.ts | 26 +++------ x-pack/plugins/uptime/server/kibana.index.ts | 13 ++++- 16 files changed, 157 insertions(+), 139 deletions(-) diff --git a/examples/alerting_example/server/plugin.ts b/examples/alerting_example/server/plugin.ts index 49352cc285693..e74cad28f77f4 100644 --- a/examples/alerting_example/server/plugin.ts +++ b/examples/alerting_example/server/plugin.ts @@ -44,6 +44,9 @@ export class AlertingExamplePlugin implements Plugin { + return { + management: { + insightsAndAlerting: { + triggersActions: true, + }, + }, + }; + }); + this.isESOUsingEphemeralEncryptionKey = plugins.encryptedSavedObjects.usingEphemeralEncryptionKey; diff --git a/x-pack/plugins/apm/server/feature.ts b/x-pack/plugins/apm/server/feature.ts index 38e75f75ad04b..971bc96234376 100644 --- a/x-pack/plugins/apm/server/feature.ts +++ b/x-pack/plugins/apm/server/feature.ts @@ -17,6 +17,9 @@ export const APM_FEATURE = { navLinkId: 'apm', app: ['apm', 'kibana'], catalogue: ['apm'], + management: { + insightsAndAlerting: ['triggersActions'], + }, alerting: Object.values(AlertType), // see x-pack/plugins/features/common/feature_kibana_privileges.ts privileges: { @@ -31,6 +34,9 @@ export const APM_FEATURE = { alerting: { all: Object.values(AlertType), }, + management: { + insightsAndAlerting: ['triggersActions'], + }, ui: ['show', 'save', 'alerting:show', 'alerting:save'], }, read: { @@ -44,6 +50,9 @@ export const APM_FEATURE = { alerting: { all: Object.values(AlertType), }, + management: { + insightsAndAlerting: ['triggersActions'], + }, ui: ['show', 'alerting:show', 'alerting:save'], }, }, diff --git a/x-pack/plugins/infra/server/features.ts b/x-pack/plugins/infra/server/features.ts index fdbd1ec894022..3e32cebf19ac2 100644 --- a/x-pack/plugins/infra/server/features.ts +++ b/x-pack/plugins/infra/server/features.ts @@ -19,6 +19,9 @@ export const METRICS_FEATURE = { navLinkId: 'metrics', app: ['infra', 'metrics', 'kibana'], catalogue: ['infraops'], + management: { + insightsAndAlerting: ['triggersActions'], + }, alerting: [METRIC_THRESHOLD_ALERT_TYPE_ID, METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID], privileges: { all: { @@ -32,7 +35,10 @@ export const METRICS_FEATURE = { alerting: { all: [METRIC_THRESHOLD_ALERT_TYPE_ID, METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID], }, - ui: ['show', 'configureSource', 'save', 'alerting:show'], + management: { + insightsAndAlerting: ['triggersActions'], + }, + ui: ['show', 'configureSource', 'save'], }, read: { app: ['infra', 'metrics', 'kibana'], @@ -45,7 +51,10 @@ export const METRICS_FEATURE = { alerting: { all: [METRIC_THRESHOLD_ALERT_TYPE_ID, METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID], }, - ui: ['show', 'alerting:show'], + management: { + insightsAndAlerting: ['triggersActions'], + }, + ui: ['show'], }, }, }; diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 06cd3138ca564..8fc413236dd2c 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -174,6 +174,9 @@ export class Plugin implements IPlugin { }; export const AppWithoutRouter = ({ sectionsRegex }: { sectionsRegex: string }) => { - const { capabilities } = useAppDependencies(); - const canShowAlerts = hasShowAlertsCapability(capabilities); - const DEFAULT_SECTION: Section = canShowAlerts ? 'alerts' : 'connectors'; return ( - {canShowAlerts && ( - - )} - + + ); }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/home.tsx b/x-pack/plugins/triggers_actions_ui/public/application/home.tsx index eeb8a77717333..15099242b6e17 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/home.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/home.tsx @@ -25,7 +25,7 @@ import { Section, routeToConnectors, routeToAlerts } from './constants'; import { getCurrentBreadcrumb } from './lib/breadcrumb'; import { getCurrentDocTitle } from './lib/doc_title'; import { useAppDependencies } from './app_context'; -import { hasShowActionsCapability, hasShowAlertsCapability } from './lib/capabilities'; +import { hasShowActionsCapability } from './lib/capabilities'; import { ActionsConnectorsList } from './sections/actions_connectors_list/components/actions_connectors_list'; import { AlertsList } from './sections/alerts_list/components/alerts_list'; @@ -45,23 +45,17 @@ export const TriggersActionsUIHome: React.FunctionComponent = []; - if (canShowAlerts) { - tabs.push({ - id: 'alerts', - name: ( - - ), - }); - } + tabs.push({ + id: 'alerts', + name: ( + + ), + }); if (canShowActions) { tabs.push({ @@ -151,17 +145,15 @@ export const TriggersActionsUIHome: React.FunctionComponent )} - {canShowAlerts && ( - ( - - - - )} - /> - )} + ( + + + + )} + /> diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/capabilities.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/capabilities.ts index 065a782ee96a2..9e89a38377a4d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/capabilities.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/capabilities.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { BUILT_IN_ALERTS_FEATURE_ID } from '../../../../alerting_builtins/common'; import { Alert, AlertType } from '../../types'; /** @@ -15,18 +14,6 @@ import { Alert, AlertType } from '../../types'; type Capabilities = Record; -const apps = ['apm', 'siem', 'uptime', 'infrastructure', 'actions', BUILT_IN_ALERTS_FEATURE_ID]; - -function hasCapability(capabilities: Capabilities, capability: string) { - return apps.some((app) => capabilities[app]?.[capability]); -} - -function createCapabilityCheck(capability: string) { - return (capabilities: Capabilities) => hasCapability(capabilities, capability); -} - -export const hasShowAlertsCapability = createCapabilityCheck('alerting:show'); - export const hasShowActionsCapability = (capabilities: Capabilities) => capabilities?.actions?.show; export const hasSaveActionsCapability = (capabilities: Capabilities) => capabilities?.actions?.save; export const hasExecuteActionsCapability = (capabilities: Capabilities) => diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx index a620a0db45408..16d1a5c7c9c65 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.test.tsx @@ -29,9 +29,6 @@ jest.mock('../../../app_context', () => ({ http: jest.fn(), capabilities: { get: jest.fn(() => ({})), - securitySolution: { - 'alerting:show': true, - }, }, actionTypeRegistry: jest.fn(), alertTypeRegistry: { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx index 9d54baf359af5..c0674e6c4a5f7 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_form.tsx @@ -244,15 +244,7 @@ export const AlertForm = ({ ) : null} {AlertParamsExpressionComponent ? ( - - - - - - } - > + - ) : ( + ) : alertTypesIndex ? ( + ) : ( + )} ); }; +const CenterJustifiedSpinner = () => ( + + + + + +); + const NoAuthorizedAlertTypes = ({ operation }: { operation: string }) => ( { http: mockes.http, uiSettings: mockes.uiSettings, navigateToApp, - capabilities: { - ...capabilities, - securitySolution: { - 'alerting:show': true, - }, - }, + capabilities, history: scopedHistoryMock.create(), setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, @@ -223,12 +218,7 @@ describe('alerts_list component with items', () => { http: mockes.http, uiSettings: mockes.uiSettings, navigateToApp, - capabilities: { - ...capabilities, - securitySolution: { - 'alerting:show': true, - }, - }, + capabilities, history: scopedHistoryMock.create(), setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, @@ -303,12 +293,7 @@ describe('alerts_list component empty with show only capability', () => { http: mockes.http, uiSettings: mockes.uiSettings, navigateToApp, - capabilities: { - ...capabilities, - securitySolution: { - 'alerting:show': true, - }, - }, + capabilities, history: scopedHistoryMock.create(), setBreadcrumbs: jest.fn(), actionTypeRegistry: { @@ -417,12 +402,7 @@ describe('alerts_list with show only capability', () => { http: mockes.http, uiSettings: mockes.uiSettings, navigateToApp, - capabilities: { - ...capabilities, - securitySolution: { - 'alerting:show': true, - }, - }, + capabilities, history: scopedHistoryMock.create(), setBreadcrumbs: jest.fn(), actionTypeRegistry: actionTypeRegistry as any, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx index 8cb7afbda0e70..2b2897a2181b1 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx @@ -93,7 +93,7 @@ export const AlertsList: React.FunctionComponent = () => { useEffect(() => { loadAlertsData(); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [page, searchText, typesFilter, actionTypesFilter]); + }, [alertTypesState, page, searchText, typesFilter, actionTypesFilter]); useEffect(() => { (async () => { @@ -136,30 +136,33 @@ export const AlertsList: React.FunctionComponent = () => { }, []); async function loadAlertsData() { - setAlertsState({ ...alertsState, isLoading: true }); - try { - const alertsResponse = await loadAlerts({ - http, - page, - searchText, - typesFilter, - actionTypesFilter, - }); - setAlertsState({ - isLoading: false, - data: alertsResponse.data, - totalItemCount: alertsResponse.total, - }); - } catch (e) { - toastNotifications.addDanger({ - title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertsList.unableToLoadAlertsMessage', - { - defaultMessage: 'Unable to load alerts', - } - ), - }); - setAlertsState({ ...alertsState, isLoading: false }); + const hasAnyAuthorizedAlertType = alertTypesState.data.size > 0; + if (hasAnyAuthorizedAlertType) { + setAlertsState({ ...alertsState, isLoading: true }); + try { + const alertsResponse = await loadAlerts({ + http, + page, + searchText, + typesFilter, + actionTypesFilter, + }); + setAlertsState({ + isLoading: false, + data: alertsResponse.data, + totalItemCount: alertsResponse.total, + }); + } catch (e) { + toastNotifications.addDanger({ + title: i18n.translate( + 'xpack.triggersActionsUI.sections.alertsList.unableToLoadAlertsMessage', + { + defaultMessage: 'Unable to load alerts', + } + ), + }); + setAlertsState({ ...alertsState, isLoading: false }); + } } } diff --git a/x-pack/plugins/triggers_actions_ui/public/plugin.ts b/x-pack/plugins/triggers_actions_ui/public/plugin.ts index af4d2784cfa67..25a917c7a1a15 100644 --- a/x-pack/plugins/triggers_actions_ui/public/plugin.ts +++ b/x-pack/plugins/triggers_actions_ui/public/plugin.ts @@ -14,13 +14,11 @@ import { import { i18n } from '@kbn/i18n'; import { registerBuiltInActionTypes } from './application/components/builtin_action_types'; import { registerBuiltInAlertTypes } from './application/components/builtin_alert_types'; -import { hasShowActionsCapability, hasShowAlertsCapability } from './application/lib/capabilities'; import { ActionTypeModel, AlertTypeModel } from './types'; import { TypeRegistry } from './application/type_registry'; import { ManagementSetup, ManagementAppMountParams, - ManagementApp, } from '../../../../src/plugins/management/public'; import { boot } from './application/boot'; import { ChartsPluginStart } from '../../../../src/plugins/charts/public'; @@ -50,10 +48,14 @@ interface PluginsStart { export class Plugin implements - CorePlugin { + CorePlugin< + TriggersAndActionsUIPublicPluginSetup, + TriggersAndActionsUIPublicPluginStart, + PluginsSetup, + PluginsStart + > { private actionTypeRegistry: TypeRegistry; private alertTypeRegistry: TypeRegistry; - private managementApp?: ManagementApp; constructor(initializerContext: PluginInitializerContext) { const actionTypeRegistry = new TypeRegistry(); @@ -67,7 +69,7 @@ export class Plugin const actionTypeRegistry = this.actionTypeRegistry; const alertTypeRegistry = this.alertTypeRegistry; - this.managementApp = plugins.management.sections.section.insightsAndAlerting.registerApp({ + plugins.management.sections.section.insightsAndAlerting.registerApp({ id: 'triggersActions', title: i18n.translate('xpack.triggersActionsUI.managementSection.displayName', { defaultMessage: 'Alerts and Actions', @@ -116,19 +118,7 @@ export class Plugin }; } - public start(core: CoreStart): TriggersAndActionsUIPublicPluginStart { - const { capabilities } = core.application; - - const canShowActions = hasShowActionsCapability(capabilities); - const canShowAlerts = hasShowAlertsCapability(capabilities); - const managementApp = this.managementApp as ManagementApp; - - // Don't register routes when user doesn't have access to the application - if (canShowActions || canShowAlerts) { - managementApp.enable(); - } else { - managementApp.disable(); - } + public start(): TriggersAndActionsUIPublicPluginStart { return { actionTypeRegistry: this.actionTypeRegistry, alertTypeRegistry: this.alertTypeRegistry, diff --git a/x-pack/plugins/uptime/server/kibana.index.ts b/x-pack/plugins/uptime/server/kibana.index.ts index a2d5f58bbec14..2bf0d84a49de1 100644 --- a/x-pack/plugins/uptime/server/kibana.index.ts +++ b/x-pack/plugins/uptime/server/kibana.index.ts @@ -35,6 +35,9 @@ export const initServerWithKibana = (server: UptimeCoreSetup, plugins: UptimeCor icon: 'uptimeApp', app: ['uptime', 'kibana'], catalogue: ['uptime'], + management: { + insightsAndAlerting: ['triggersActions'], + }, alerting: ['xpack.uptime.alerts.tls', 'xpack.uptime.alerts.monitorStatus'], privileges: { all: { @@ -48,7 +51,10 @@ export const initServerWithKibana = (server: UptimeCoreSetup, plugins: UptimeCor alerting: { all: ['xpack.uptime.alerts.tls', 'xpack.uptime.alerts.monitorStatus'], }, - ui: ['save', 'configureSettings', 'show', 'alerting:show'], + management: { + insightsAndAlerting: ['triggersActions'], + }, + ui: ['save', 'configureSettings', 'show'], }, read: { app: ['uptime', 'kibana'], @@ -61,7 +67,10 @@ export const initServerWithKibana = (server: UptimeCoreSetup, plugins: UptimeCor alerting: { all: ['xpack.uptime.alerts.tls', 'xpack.uptime.alerts.monitorStatus'], }, - ui: ['show', 'alerting:show'], + management: { + insightsAndAlerting: ['triggersActions'], + }, + ui: ['show'], }, }, }); From 330c966f4f7837d337a46268469ed3528d0062dd Mon Sep 17 00:00:00 2001 From: Shahzad Date: Tue, 28 Jul 2020 16:30:58 +0200 Subject: [PATCH 060/126] [Uptime] Reduce miscellaneous uptime bundle size (#70632) Co-authored-by: Elastic Machine --- .../triggers_actions_ui/public/index.ts | 1 + .../plugins/uptime/common/constants/index.ts | 2 - x-pack/plugins/uptime/public/app.ts | 7 -- x-pack/plugins/uptime/public/apps/index.ts | 7 -- x-pack/plugins/uptime/public/apps/plugin.ts | 39 ++++---- .../render_app.tsx} | 44 ++++----- .../plugins/uptime/public/apps/template.html | 1 - .../uptime/public/{ => apps}/uptime_app.tsx | 23 +++-- .../public/apps/uptime_overview_fetcher.ts | 15 ++- .../components/monitor/ml/manage_ml_job.tsx | 2 +- .../monitor/ml/ml_flyout_container.tsx | 3 +- .../embeddables/__tests__/map_config.test.ts | 2 +- .../location_map/embeddables/map_config.ts | 2 +- .../alerts/alerts_containers/alert_tls.tsx | 3 - .../alerts/anomaly_alert/anomaly_alert.tsx | 3 +- .../alerts/toggle_alert_flyout_button.tsx | 2 +- .../overview/kuery_bar/kuery_bar.tsx | 7 +- .../actions_popover/actions_popover.tsx | 4 +- .../actions_popover/integration_group.tsx | 9 +- .../monitor_status_list.tsx | 5 +- .../monitor_list_status_column.tsx | 5 +- .../contexts/uptime_settings_context.tsx | 2 +- .../public/contexts/uptime_theme_context.tsx | 2 +- x-pack/plugins/uptime/public/index.ts | 2 +- .../__tests__/monitor_status.test.ts | 21 ++--- .../lib/alert_types/duration_anomaly.tsx | 18 +--- .../lazy_wrapper/duration_anomaly.tsx | 32 +++++++ .../lazy_wrapper/monitor_status.tsx | 32 +++++++ .../alert_types/lazy_wrapper/tls_alert.tsx | 32 +++++++ .../lazy_wrapper/validate_monitor_status.ts | 56 +++++++++++ .../public/lib/alert_types/monitor_status.tsx | 94 +++++-------------- .../lib/alert_types/monitor_status_title.tsx | 17 ---- .../uptime/public/lib/alert_types/tls.tsx | 17 +--- .../observability_integration/build_href.ts | 9 +- .../observability_integration/get_apm_href.ts | 3 +- .../get_infra_href.ts | 12 ++- .../get_logging_href.ts | 12 ++- x-pack/plugins/uptime/public/lib/lib.ts | 13 --- .../uptime/public/pages/certificates.tsx | 3 +- .../plugins/uptime/public/pages/settings.tsx | 12 ++- .../plugins/uptime/public/state/api/utils.ts | 6 +- .../public/state/effects/index_status.ts | 2 +- x-pack/plugins/uptime/server/kibana.index.ts | 2 +- .../server/lib/alerts/duration_anomaly.ts | 2 +- .../uptime/server/lib/alerts/status_check.ts | 2 +- .../plugins/uptime/server/lib/alerts/tls.ts | 3 +- 46 files changed, 327 insertions(+), 265 deletions(-) delete mode 100644 x-pack/plugins/uptime/public/app.ts delete mode 100644 x-pack/plugins/uptime/public/apps/index.ts rename x-pack/plugins/uptime/public/{lib/adapters/framework/new_platform_adapter.tsx => apps/render_app.tsx} (72%) delete mode 100644 x-pack/plugins/uptime/public/apps/template.html rename x-pack/plugins/uptime/public/{ => apps}/uptime_app.tsx (84%) create mode 100644 x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/duration_anomaly.tsx create mode 100644 x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/monitor_status.tsx create mode 100644 x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/tls_alert.tsx create mode 100644 x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/validate_monitor_status.ts delete mode 100644 x-pack/plugins/uptime/public/lib/alert_types/monitor_status_title.tsx diff --git a/x-pack/plugins/triggers_actions_ui/public/index.ts b/x-pack/plugins/triggers_actions_ui/public/index.ts index 1048e15eb1184..7808e2a7f608d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/index.ts @@ -19,6 +19,7 @@ export { ActionType, ActionTypeRegistryContract, AlertTypeParamsExpressionProps, + ValidationResult, ActionVariable, } from './types'; export { diff --git a/x-pack/plugins/uptime/common/constants/index.ts b/x-pack/plugins/uptime/common/constants/index.ts index 0ddb995301266..29ae9e47dfb8a 100644 --- a/x-pack/plugins/uptime/common/constants/index.ts +++ b/x-pack/plugins/uptime/common/constants/index.ts @@ -4,13 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -export * from './alerts'; export { CHART_FORMAT_LIMITS } from './chart_format_limits'; export { CLIENT_DEFAULTS } from './client_defaults'; export { CONTEXT_DEFAULTS } from './context_defaults'; export * from './capabilities'; export * from './settings_defaults'; -export { PLUGIN } from './plugin'; export { QUERY } from './query'; export * from './ui'; export * from './rest_api'; diff --git a/x-pack/plugins/uptime/public/app.ts b/x-pack/plugins/uptime/public/app.ts deleted file mode 100644 index b068f8a9becda..0000000000000 --- a/x-pack/plugins/uptime/public/app.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import './apps/index'; diff --git a/x-pack/plugins/uptime/public/apps/index.ts b/x-pack/plugins/uptime/public/apps/index.ts deleted file mode 100644 index 65b80d08d4f20..0000000000000 --- a/x-pack/plugins/uptime/public/apps/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { UptimePlugin } from './plugin'; diff --git a/x-pack/plugins/uptime/public/apps/plugin.ts b/x-pack/plugins/uptime/public/apps/plugin.ts index 9af4dea9dbb44..cf750434ab324 100644 --- a/x-pack/plugins/uptime/public/apps/plugin.ts +++ b/x-pack/plugins/uptime/public/apps/plugin.ts @@ -12,10 +12,11 @@ import { AppMountParameters, } from 'kibana/public'; import { DEFAULT_APP_CATEGORIES } from '../../../../../src/core/public'; -import { UMFrontendLibs } from '../lib/lib'; -import { PLUGIN } from '../../common/constants'; -import { FeatureCatalogueCategory } from '../../../../../src/plugins/home/public'; -import { HomePublicPluginSetup } from '../../../../../src/plugins/home/public'; + +import { + FeatureCatalogueCategory, + HomePublicPluginSetup, +} from '../../../../../src/plugins/home/public'; import { EmbeddableStart } from '../../../../../src/plugins/embeddable/public'; import { TriggersAndActionsUIPublicPluginSetup, @@ -26,10 +27,8 @@ import { DataPublicPluginStart, } from '../../../../../src/plugins/data/public'; import { alertTypeInitializers } from '../lib/alert_types'; -import { kibanaService } from '../state/kibana_service'; -import { fetchIndexStatus } from '../state/api'; -import { ObservabilityPluginSetup } from '../../../observability/public'; -import { fetchUptimeOverviewData } from './uptime_overview_fetcher'; +import { FetchDataParams, ObservabilityPluginSetup } from '../../../observability/public'; +import { PLUGIN } from '../../common/constants/plugin'; export interface ClientPluginsSetup { data: DataPublicPluginSetup; @@ -66,14 +65,23 @@ export class UptimePlugin category: FeatureCatalogueCategory.DATA, }); } + const getUptimeDataHelper = async () => { + const [coreStart] = await core.getStartServices(); + const { UptimeDataHelper } = await import('./uptime_overview_fetcher'); + return UptimeDataHelper(coreStart); + }; plugins.observability.dashboard.register({ appName: 'uptime', hasData: async () => { - const status = await fetchIndexStatus(); + const dataHelper = await getUptimeDataHelper(); + const status = await dataHelper.indexStatus(); return status.docCount > 0; }, - fetchData: fetchUptimeOverviewData, + fetchData: async (params: FetchDataParams) => { + const dataHelper = await getUptimeDataHelper(); + return await dataHelper.overviewData(params); + }, }); core.application.register({ @@ -85,22 +93,15 @@ export class UptimePlugin category: DEFAULT_APP_CATEGORIES.observability, mount: async (params: AppMountParameters) => { const [coreStart, corePlugins] = await core.getStartServices(); - const { getKibanaFrameworkAdapter } = await import( - '../lib/adapters/framework/new_platform_adapter' - ); - const { element } = params; + const { renderApp } = await import('./render_app'); - const libs: UMFrontendLibs = { - framework: getKibanaFrameworkAdapter(coreStart, plugins, corePlugins), - }; - return libs.framework.render(element); + return renderApp(coreStart, plugins, corePlugins, params); }, }); } public start(start: CoreStart, plugins: ClientPluginsStart): void { - kibanaService.core = start; alertTypeInitializers.forEach((init) => { const alertInitializer = init({ core: start, diff --git a/x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx b/x-pack/plugins/uptime/public/apps/render_app.tsx similarity index 72% rename from x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx rename to x-pack/plugins/uptime/public/apps/render_app.tsx index d6185f2c2589a..f834f8b5cdd3c 100644 --- a/x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx +++ b/x-pack/plugins/uptime/public/apps/render_app.tsx @@ -4,26 +4,26 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CoreStart } from 'src/core/public'; import React from 'react'; import ReactDOM from 'react-dom'; import { i18n as i18nFormatter } from '@kbn/i18n'; -import { UptimeApp, UptimeAppProps } from '../../../uptime_app'; -import { getIntegratedAppAvailability } from './capabilities_adapter'; +import { AppMountParameters, CoreStart } from 'kibana/public'; +import { getIntegratedAppAvailability } from '../lib/adapters/framework/capabilities_adapter'; import { - INTEGRATED_SOLUTIONS, - PLUGIN, DEFAULT_DARK_MODE, DEFAULT_TIMEPICKER_QUICK_RANGES, -} from '../../../../common/constants'; -import { UMFrameworkAdapter } from '../../lib'; -import { ClientPluginsStart, ClientPluginsSetup } from '../../../apps/plugin'; + INTEGRATED_SOLUTIONS, +} from '../../common/constants'; +import { UptimeApp, UptimeAppProps } from './uptime_app'; +import { ClientPluginsSetup, ClientPluginsStart } from './plugin'; +import { PLUGIN } from '../../common/constants/plugin'; -export const getKibanaFrameworkAdapter = ( +export function renderApp( core: CoreStart, plugins: ClientPluginsSetup, - startPlugins: ClientPluginsStart -): UMFrameworkAdapter => { + startPlugins: ClientPluginsStart, + { element }: AppMountParameters +) { const { application: { capabilities }, chrome: { setBadge, setHelpExtension }, @@ -40,17 +40,17 @@ export const getKibanaFrameworkAdapter = ( const canSave = (capabilities.uptime.save ?? false) as boolean; const props: UptimeAppProps = { - basePath: basePath.get(), + plugins, canSave, core, + i18n, + startPlugins, + basePath: basePath.get(), darkMode: core.uiSettings.get(DEFAULT_DARK_MODE), commonlyUsedRanges: core.uiSettings.get(DEFAULT_TIMEPICKER_QUICK_RANGES), - i18n, isApmAvailable: apm, isInfraAvailable: infrastructure, isLogsAvailable: logs, - plugins, - startPlugins, renderGlobalHelpControls: () => setHelpExtension({ appName: i18nFormatter.translate('xpack.uptime.header.appName', { @@ -72,15 +72,9 @@ export const getKibanaFrameworkAdapter = ( setBreadcrumbs: core.chrome.setBreadcrumbs, }; - return { - render: async (element: any) => { - if (element) { - ReactDOM.render(, element); - } + ReactDOM.render(, element); - return () => { - ReactDOM.unmountComponentAtNode(element); - }; - }, + return () => { + ReactDOM.unmountComponentAtNode(element); }; -}; +} diff --git a/x-pack/plugins/uptime/public/apps/template.html b/x-pack/plugins/uptime/public/apps/template.html deleted file mode 100644 index a6fb47048a9b1..0000000000000 --- a/x-pack/plugins/uptime/public/apps/template.html +++ /dev/null @@ -1 +0,0 @@ -
      \ No newline at end of file diff --git a/x-pack/plugins/uptime/public/uptime_app.tsx b/x-pack/plugins/uptime/public/apps/uptime_app.tsx similarity index 84% rename from x-pack/plugins/uptime/public/uptime_app.tsx rename to x-pack/plugins/uptime/public/apps/uptime_app.tsx index 4208d79e761ed..41370f9fff492 100644 --- a/x-pack/plugins/uptime/public/uptime_app.tsx +++ b/x-pack/plugins/uptime/public/apps/uptime_app.tsx @@ -9,24 +9,25 @@ import { i18n } from '@kbn/i18n'; import React, { useEffect } from 'react'; import { Provider as ReduxProvider } from 'react-redux'; import { BrowserRouter as Router } from 'react-router-dom'; -import { I18nStart, ChromeBreadcrumb, CoreStart } from 'src/core/public'; -import { KibanaContextProvider } from '../../../../src/plugins/kibana_react/public'; -import { ClientPluginsSetup, ClientPluginsStart } from './apps/plugin'; -import { UMUpdateBadge } from './lib/lib'; +import { I18nStart, ChromeBreadcrumb, CoreStart } from 'kibana/public'; +import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; +import { ClientPluginsSetup, ClientPluginsStart } from './plugin'; +import { UMUpdateBadge } from '../lib/lib'; import { UptimeRefreshContextProvider, UptimeSettingsContextProvider, UptimeThemeContextProvider, UptimeStartupPluginsContextProvider, -} from './contexts'; -import { CommonlyUsedRange } from './components/common/uptime_date_picker'; -import { setBasePath } from './state/actions'; -import { PageRouter } from './routes'; +} from '../contexts'; +import { CommonlyUsedRange } from '../components/common/uptime_date_picker'; +import { setBasePath } from '../state/actions'; +import { PageRouter } from '../routes'; import { UptimeAlertsContextProvider, UptimeAlertsFlyoutWrapper, -} from './components/overview/alerts'; -import { store } from './state'; +} from '../components/overview/alerts'; +import { store } from '../state'; +import { kibanaService } from '../state/kibana_service'; export interface UptimeAppColors { danger: string; @@ -86,6 +87,8 @@ const Application = (props: UptimeAppProps) => { ); }, [canSave, renderGlobalHelpControls, setBadge]); + kibanaService.core = core; + store.dispatch(setBasePath(basePath)); return ( diff --git a/x-pack/plugins/uptime/public/apps/uptime_overview_fetcher.ts b/x-pack/plugins/uptime/public/apps/uptime_overview_fetcher.ts index d1e394dd4da6b..7e5c18f13b29e 100644 --- a/x-pack/plugins/uptime/public/apps/uptime_overview_fetcher.ts +++ b/x-pack/plugins/uptime/public/apps/uptime_overview_fetcher.ts @@ -4,10 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { fetchPingHistogram, fetchSnapshotCount } from '../state/api'; +import { CoreStart } from 'kibana/public'; import { UptimeFetchDataResponse, FetchDataParams } from '../../../observability/public'; +import { fetchIndexStatus, fetchPingHistogram, fetchSnapshotCount } from '../state/api'; +import { kibanaService } from '../state/kibana_service'; -export async function fetchUptimeOverviewData({ +async function fetchUptimeOverviewData({ absoluteTime, relativeTime, bucketSize, @@ -52,3 +54,12 @@ export async function fetchUptimeOverviewData({ }; return response; } + +export function UptimeDataHelper(coreStart: CoreStart | null) { + kibanaService.core = coreStart!; + + return { + indexStatus: fetchIndexStatus, + overviewData: fetchUptimeOverviewData, + }; +} diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx index 87496e91c906c..7a2899558891d 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx @@ -8,7 +8,7 @@ import React, { useContext, useState } from 'react'; import { EuiButton, EuiContextMenu, EuiIcon, EuiPopover } from '@elastic/eui'; import { useSelector, useDispatch } from 'react-redux'; -import { CLIENT_ALERT_TYPES } from '../../../../common/constants'; +import { CLIENT_ALERT_TYPES } from '../../../../common/constants/alerts'; import { canDeleteMLJobSelector, hasMLJobSelector, diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx index 84634f328621f..e4fe1901729d3 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx @@ -22,13 +22,14 @@ import { import { MLJobLink } from './ml_job_link'; import * as labels from './translations'; import { MLFlyoutView } from './ml_flyout'; -import { CLIENT_ALERT_TYPES, ML_JOB_ID } from '../../../../common/constants'; +import { ML_JOB_ID } from '../../../../common/constants'; import { UptimeRefreshContext, UptimeSettingsContext } from '../../../contexts'; import { useGetUrlParams } from '../../../hooks'; import { getDynamicSettings } from '../../../state/actions/dynamic_settings'; import { useMonitorId } from '../../../hooks'; import { kibanaService } from '../../../state/kibana_service'; import { toMountPoint } from '../../../../../../../src/plugins/kibana_react/public'; +import { CLIENT_ALERT_TYPES } from '../../../../common/constants/alerts'; interface Props { onClose: () => void; diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/__tests__/map_config.test.ts b/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/__tests__/map_config.test.ts index 09a41bd9eb4b9..18b43434da24b 100644 --- a/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/__tests__/map_config.test.ts +++ b/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/__tests__/map_config.test.ts @@ -7,7 +7,7 @@ import { getLayerList } from '../map_config'; import { mockLayerList } from './__mocks__/mock'; import { LocationPoint } from '../embedded_map'; -import { UptimeAppColors } from '../../../../../../uptime_app'; +import { UptimeAppColors } from '../../../../../../apps/uptime_app'; jest.mock('uuid', () => { return { diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/map_config.ts b/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/map_config.ts index e766641102a24..6f9b7e4d39c16 100644 --- a/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/map_config.ts +++ b/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/map_config.ts @@ -6,7 +6,7 @@ import lowPolyLayerFeatures from './low_poly_layer.json'; import { LocationPoint } from './embedded_map'; -import { UptimeAppColors } from '../../../../../uptime_app'; +import { UptimeAppColors } from '../../../../../apps/uptime_app'; /** * Returns `Source/Destination Point-to-point` Map LayerList configuration, with a source, diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_tls.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_tls.tsx index c7657c34220fc..70adcdb563bce 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_tls.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_tls.tsx @@ -24,6 +24,3 @@ export const AlertTls: React.FC<{}> = () => { /> ); }; - -// eslint-disable-next-line import/no-default-export -export { AlertTls as default }; diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/anomaly_alert/anomaly_alert.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/anomaly_alert/anomaly_alert.tsx index 4b84012575ae9..1428a7f526fc2 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/anomaly_alert/anomaly_alert.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/anomaly_alert/anomaly_alert.tsx @@ -25,8 +25,7 @@ interface Props { setAlertParams: (key: string, value: any) => void; } -// eslint-disable-next-line import/no-default-export -export default function AnomalyAlertComponent({ setAlertParams, alertParams }: Props) { +export function AnomalyAlertComponent({ setAlertParams, alertParams }: Props) { const [severity, setSeverity] = useState(DEFAULT_SEVERITY); const monitorIdStore = useSelector(monitorIdSelector); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx index 18514bd92d7a0..067972a452f27 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx @@ -15,7 +15,7 @@ import { import React, { useState } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; -import { CLIENT_ALERT_TYPES } from '../../../../common/constants'; +import { CLIENT_ALERT_TYPES } from '../../../../common/constants/alerts'; import { ToggleFlyoutTranslations } from './translations'; import { ToggleAlertFlyoutButtonProps } from './alerts_containers'; diff --git a/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx b/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx index 9c6a4e5d418a7..9e373949aea12 100644 --- a/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx +++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx @@ -5,8 +5,7 @@ */ import React, { useState, useEffect } from 'react'; -import { uniqueId, startsWith } from 'lodash'; -import { EuiCallOut } from '@elastic/eui'; +import { EuiCallOut, htmlIdGenerator } from '@elastic/eui'; import styled from 'styled-components'; import { FormattedMessage } from '@kbn/i18n/react'; import { Typeahead } from './typeahead'; @@ -94,7 +93,7 @@ export function KueryBar({ setState({ ...state, suggestions: [] }); setSuggestionLimit(15); - const currentRequest = uniqueId(); + const currentRequest = htmlIdGenerator()(); currentRequestCheck = currentRequest; try { @@ -116,7 +115,7 @@ export function KueryBar({ }, ], })) || [] - ).filter((suggestion: QuerySuggestion) => !startsWith(suggestion.text, 'span.')); + ).filter((suggestion: QuerySuggestion) => !suggestion.text.startsWith('span.')); if (currentRequest !== currentRequestCheck) { return; } diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx index 2070a374e75d0..9e96f0ca76535 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { get } from 'lodash'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { EuiPopover, EuiButton } from '@elastic/eui'; @@ -25,7 +24,8 @@ export const ActionsPopoverComponent = ({ }: ActionsPopoverProps) => { const popoverId = `${summary.monitor_id}_popover`; - const monitorUrl: string | undefined = get(summary, 'state.url.full', undefined); + const monitorUrl: string | undefined = summary?.state?.url?.full; + const isPopoverOpen: boolean = !!popoverState && popoverState.open && popoverState.id === popoverId; return ( diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx index 38aa9287b0c47..ff3b5d67375fe 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx @@ -27,9 +27,12 @@ interface IntegrationGroupProps { export const extractSummaryValues = (summary: Pick) => { const domain = summary.state.url?.domain ?? ''; - const podUid = summary.state.summaryPings?.[0]?.kubernetes?.pod?.uid ?? undefined; - const containerId = summary.state.summaryPings?.[0]?.container?.id ?? undefined; - const ip = summary.state.summaryPings?.[0]?.monitor.ip ?? undefined; + + const firstCheck = summary.state.summaryPings?.[0]; + + const podUid = firstCheck?.kubernetes?.pod?.uid ?? undefined; + const containerId = firstCheck?.container?.id ?? undefined; + const ip = firstCheck?.monitor.ip ?? undefined; return { domain, diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx index 334de6e376074..96536a357a450 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx @@ -5,7 +5,6 @@ */ import React from 'react'; -import { upperFirst } from 'lodash'; import { EuiCallOut, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { LocationLink } from '../../../common/location_link'; @@ -29,9 +28,9 @@ export const MonitorStatusList = ({ summaryPings }: MonitorStatusListProps) => { const location = ping.observer?.geo?.name ?? UNNAMED_LOCATION; if (ping.monitor.status === STATUS.UP) { - upChecks.add(upperFirst(location)); + upChecks.add(location); } else if (ping.monitor.status === STATUS.DOWN) { - downChecks.add(upperFirst(location)); + downChecks.add(location); } }); diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_status_column.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_status_column.tsx index 68ddf512e4d3c..7140211d18807 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_status_column.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_status_column.tsx @@ -7,7 +7,6 @@ import React from 'react'; import moment from 'moment'; import { i18n } from '@kbn/i18n'; -import { upperFirst } from 'lodash'; import styled from 'styled-components'; import { EuiHealth, EuiFlexGroup, EuiFlexItem, EuiText, EuiToolTip } from '@elastic/eui'; import { parseTimestamp } from './parse_timestamp'; @@ -83,9 +82,9 @@ export const getLocationStatus = (summaryPings: Ping[], status: string) => { const location = summaryPing?.observer?.geo?.name ?? UNNAMED_LOCATION; if (summaryPing.monitor.status === STATUS.UP) { - upPings.add(upperFirst(location)); + upPings.add(location); } else if (summaryPing.monitor.status === STATUS.DOWN) { - downPings.add(upperFirst(location)); + downPings.add(location); } }); diff --git a/x-pack/plugins/uptime/public/contexts/uptime_settings_context.tsx b/x-pack/plugins/uptime/public/contexts/uptime_settings_context.tsx index 142c6e17c5fd9..4c08e76a11aae 100644 --- a/x-pack/plugins/uptime/public/contexts/uptime_settings_context.tsx +++ b/x-pack/plugins/uptime/public/contexts/uptime_settings_context.tsx @@ -5,7 +5,7 @@ */ import React, { createContext, useMemo } from 'react'; -import { UptimeAppProps } from '../uptime_app'; +import { UptimeAppProps } from '../apps/uptime_app'; import { CLIENT_DEFAULTS, CONTEXT_DEFAULTS } from '../../common/constants'; import { CommonlyUsedRange } from '../components/common/uptime_date_picker'; import { useGetUrlParams } from '../hooks'; diff --git a/x-pack/plugins/uptime/public/contexts/uptime_theme_context.tsx b/x-pack/plugins/uptime/public/contexts/uptime_theme_context.tsx index ca2fb50cdbc67..51e8bcaed986f 100644 --- a/x-pack/plugins/uptime/public/contexts/uptime_theme_context.tsx +++ b/x-pack/plugins/uptime/public/contexts/uptime_theme_context.tsx @@ -9,7 +9,7 @@ import React, { createContext, useMemo } from 'react'; import euiDarkVars from '@elastic/eui/dist/eui_theme_dark.json'; import { EUI_CHARTS_THEME_DARK, EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; import { DARK_THEME, LIGHT_THEME, PartialTheme, Theme } from '@elastic/charts'; -import { UptimeAppColors } from '../uptime_app'; +import { UptimeAppColors } from '../apps/uptime_app'; export interface UptimeThemeContextValues { colors: UptimeAppColors; diff --git a/x-pack/plugins/uptime/public/index.ts b/x-pack/plugins/uptime/public/index.ts index 48cf2c90ad07b..cd6efa9016830 100644 --- a/x-pack/plugins/uptime/public/index.ts +++ b/x-pack/plugins/uptime/public/index.ts @@ -5,7 +5,7 @@ */ import { PluginInitializerContext } from 'kibana/public'; -import { UptimePlugin } from './apps'; +import { UptimePlugin } from './apps/plugin'; export const plugin = (initializerContext: PluginInitializerContext) => new UptimePlugin(initializerContext); diff --git a/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts b/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts index cfcb414f4815d..e999768d4e55d 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts +++ b/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { validate, initMonitorStatusAlertType } from '../monitor_status'; +import { initMonitorStatusAlertType } from '../monitor_status'; +import { validateMonitorStatusParams as validate } from '../lazy_wrapper/validate_monitor_status'; describe('monitor status alert type', () => { describe('validate', () => { @@ -206,19 +207,11 @@ describe('monitor status alert type', () => { ", "iconClass": "uptimeApp", "id": "xpack.uptime.alerts.monitorStatus", - "name": - - , + "name": , "requiresAppContext": false, "validate": [Function], } diff --git a/x-pack/plugins/uptime/public/lib/alert_types/duration_anomaly.tsx b/x-pack/plugins/uptime/public/lib/alert_types/duration_anomaly.tsx index f0eb305461582..c1f802c2d0c91 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/duration_anomaly.tsx +++ b/x-pack/plugins/uptime/public/lib/alert_types/duration_anomaly.tsx @@ -5,30 +5,22 @@ */ import React from 'react'; -import { Provider as ReduxProvider } from 'react-redux'; import { AlertTypeModel } from '../../../../triggers_actions_ui/public'; -import { CLIENT_ALERT_TYPES } from '../../../common/constants'; +import { CLIENT_ALERT_TYPES } from '../../../common/constants/alerts'; import { DurationAnomalyTranslations } from './translations'; import { AlertTypeInitializer } from '.'; -import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; -import { store } from '../../state'; const { name, defaultActionMessage } = DurationAnomalyTranslations; -const AnomalyAlertExpression = React.lazy(() => - import('../../components/overview/alerts/anomaly_alert/anomaly_alert') -); +const DurationAnomalyAlert = React.lazy(() => import('./lazy_wrapper/duration_anomaly')); + export const initDurationAnomalyAlertType: AlertTypeInitializer = ({ core, plugins, }): AlertTypeModel => ({ id: CLIENT_ALERT_TYPES.DURATION_ANOMALY, iconClass: 'uptimeApp', - alertParamsExpression: (params: any) => ( - - - - - + alertParamsExpression: (params: unknown) => ( + ), name, validate: () => ({ errors: {} }), diff --git a/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/duration_anomaly.tsx b/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/duration_anomaly.tsx new file mode 100644 index 0000000000000..60f2d2e803b7b --- /dev/null +++ b/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/duration_anomaly.tsx @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Provider as ReduxProvider } from 'react-redux'; +import { CoreStart } from 'kibana/public'; +import { store } from '../../../state'; +import { AnomalyAlertComponent } from '../../../components/overview/alerts/anomaly_alert/anomaly_alert'; +import { KibanaContextProvider } from '../../../../../../../src/plugins/kibana_react/public'; +import { ClientPluginsStart } from '../../../apps/plugin'; +import { kibanaService } from '../../../state/kibana_service'; + +interface Props { + core: CoreStart; + plugins: ClientPluginsStart; + params: any; +} + +// eslint-disable-next-line import/no-default-export +export default function DurationAnomalyAlert({ core, plugins, params }: Props) { + kibanaService.core = core; + return ( + + + + + + ); +} diff --git a/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/monitor_status.tsx b/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/monitor_status.tsx new file mode 100644 index 0000000000000..f6b10d0fbf968 --- /dev/null +++ b/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/monitor_status.tsx @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Provider as ReduxProvider } from 'react-redux'; +import { CoreStart } from 'kibana/public'; +import { store } from '../../../state'; +import { KibanaContextProvider } from '../../../../../../../src/plugins/kibana_react/public'; +import { ClientPluginsStart } from '../../../apps/plugin'; +import { AlertMonitorStatus } from '../../../components/overview/alerts/alerts_containers'; +import { kibanaService } from '../../../state/kibana_service'; + +interface Props { + core: CoreStart; + plugins: ClientPluginsStart; + params: any; +} + +// eslint-disable-next-line import/no-default-export +export default function MonitorStatusAlert({ core, plugins, params }: Props) { + kibanaService.core = core; + return ( + + + + + + ); +} diff --git a/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/tls_alert.tsx b/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/tls_alert.tsx new file mode 100644 index 0000000000000..413734b63ced5 --- /dev/null +++ b/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/tls_alert.tsx @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Provider as ReduxProvider } from 'react-redux'; +import { CoreStart } from 'kibana/public'; +import { store } from '../../../state'; +import { KibanaContextProvider } from '../../../../../../../src/plugins/kibana_react/public'; +import { ClientPluginsStart } from '../../../apps/plugin'; +import { AlertTls } from '../../../components/overview/alerts/alerts_containers/alert_tls'; +import { kibanaService } from '../../../state/kibana_service'; + +interface Props { + core: CoreStart; + plugins: ClientPluginsStart; + params: any; +} + +// eslint-disable-next-line import/no-default-export +export default function TLSAlert({ core, plugins, params: _params }: Props) { + kibanaService.core = core; + return ( + + + + + + ); +} diff --git a/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/validate_monitor_status.ts b/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/validate_monitor_status.ts new file mode 100644 index 0000000000000..709669c24ed0a --- /dev/null +++ b/x-pack/plugins/uptime/public/lib/alert_types/lazy_wrapper/validate_monitor_status.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { PathReporter } from 'io-ts/lib/PathReporter'; +import { isRight } from 'fp-ts/lib/Either'; +import { + AtomicStatusCheckParamsType, + MonitorAvailabilityType, + StatusCheckParamsType, +} from '../../../../common/runtime_types/alerts'; +import { ValidationResult } from '../../../../../triggers_actions_ui/public'; + +export function validateMonitorStatusParams(alertParams: any): ValidationResult { + const errors: Record = {}; + const decoded = AtomicStatusCheckParamsType.decode(alertParams); + const oldDecoded = StatusCheckParamsType.decode(alertParams); + const availabilityDecoded = MonitorAvailabilityType.decode(alertParams); + + if (!isRight(decoded) && !isRight(oldDecoded) && !isRight(availabilityDecoded)) { + return { + errors: { + typeCheckFailure: 'Provided parameters do not conform to the expected type.', + typeCheckParsingMessage: PathReporter.report(decoded), + }, + }; + } + + if ( + !(alertParams.shouldCheckAvailability ?? false) && + !(alertParams.shouldCheckStatus ?? false) + ) { + return { + errors: { + noAlertSelected: 'Alert must check for monitor status or monitor availability.', + }, + }; + } + + if (isRight(decoded) && decoded.right.shouldCheckStatus) { + const { numTimes, timerangeCount } = decoded.right; + if (numTimes < 1) { + errors.invalidNumTimes = 'Number of alert check down times must be an integer greater than 0'; + } + if (isNaN(timerangeCount)) { + errors.timeRangeStartValueNaN = 'Specified time range value must be a number'; + } + if (timerangeCount <= 0) { + errors.invalidTimeRangeValue = 'Time range value must be greater than 0'; + } + } + + return { errors }; +} diff --git a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx index cb24df2357d01..e4da3eb9ef7ae 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx +++ b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx @@ -4,70 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Provider as ReduxProvider } from 'react-redux'; import React from 'react'; -import { isRight } from 'fp-ts/lib/Either'; -import { PathReporter } from 'io-ts/lib/PathReporter'; -import { AlertTypeModel } from '../../../../triggers_actions_ui/public'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { AlertTypeModel, ValidationResult } from '../../../../triggers_actions_ui/public'; import { AlertTypeInitializer } from '.'; -import { - AtomicStatusCheckParamsType, - StatusCheckParamsType, - MonitorAvailabilityType, -} from '../../../common/runtime_types'; -import { MonitorStatusTitle } from './monitor_status_title'; -import { CLIENT_ALERT_TYPES } from '../../../common/constants'; -import { MonitorStatusTranslations } from './translations'; -import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; -import { store } from '../../state'; - -export const validate = (alertParams: any) => { - const errors: Record = {}; - const decoded = AtomicStatusCheckParamsType.decode(alertParams); - const oldDecoded = StatusCheckParamsType.decode(alertParams); - const availabilityDecoded = MonitorAvailabilityType.decode(alertParams); - - if (!isRight(decoded) && !isRight(oldDecoded) && !isRight(availabilityDecoded)) { - return { - errors: { - typeCheckFailure: 'Provided parameters do not conform to the expected type.', - typeCheckParsingMessage: PathReporter.report(decoded), - }, - }; - } - - if ( - !(alertParams.shouldCheckAvailability ?? false) && - !(alertParams.shouldCheckStatus ?? false) - ) { - return { - errors: { - noAlertSelected: 'Alert must check for monitor status or monitor availability.', - }, - }; - } - - if (isRight(decoded) && decoded.right.shouldCheckStatus) { - const { numTimes, timerangeCount } = decoded.right; - if (numTimes < 1) { - errors.invalidNumTimes = 'Number of alert check down times must be an integer greater than 0'; - } - if (isNaN(timerangeCount)) { - errors.timeRangeStartValueNaN = 'Specified time range value must be a number'; - } - if (timerangeCount <= 0) { - errors.invalidTimeRangeValue = 'Time range value must be greater than 0'; - } - } - return { errors }; -}; +import { CLIENT_ALERT_TYPES } from '../../../common/constants/alerts'; +import { MonitorStatusTranslations } from './translations'; const { defaultActionMessage } = MonitorStatusTranslations; -const AlertMonitorStatus = React.lazy(() => - import('../../components/overview/alerts/alerts_containers/alert_monitor_status') -); +const MonitorStatusAlert = React.lazy(() => import('./lazy_wrapper/monitor_status')); + +let validateFunc: (alertParams: any) => ValidationResult; export const initMonitorStatusAlertType: AlertTypeInitializer = ({ core, @@ -75,21 +24,26 @@ export const initMonitorStatusAlertType: AlertTypeInitializer = ({ }): AlertTypeModel => ({ id: CLIENT_ALERT_TYPES.MONITOR_STATUS, name: ( - - - + ), iconClass: 'uptimeApp', - alertParamsExpression: (params: any) => { - return ( - - - - - - ); + alertParamsExpression: (params: any) => ( + + ), + validate: (alertParams: any) => { + if (!validateFunc) { + (async function loadValidate() { + const { validateMonitorStatusParams } = await import( + './lazy_wrapper/validate_monitor_status' + ); + validateFunc = validateMonitorStatusParams; + })(); + } + return validateFunc && validateFunc(alertParams); }, - validate, defaultActionMessage, requiresAppContext: false, }); diff --git a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status_title.tsx b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status_title.tsx deleted file mode 100644 index 1e2751a4ac388..0000000000000 --- a/x-pack/plugins/uptime/public/lib/alert_types/monitor_status_title.tsx +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { FormattedMessage } from '@kbn/i18n/react'; - -export const MonitorStatusTitle = () => { - return ( - - ); -}; diff --git a/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx b/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx index c541ea4ae1331..9019fc216192c 100644 --- a/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx +++ b/x-pack/plugins/uptime/public/lib/alert_types/tls.tsx @@ -5,27 +5,18 @@ */ import React from 'react'; -import { Provider as ReduxProvider } from 'react-redux'; import { AlertTypeModel } from '../../../../triggers_actions_ui/public'; -import { CLIENT_ALERT_TYPES } from '../../../common/constants'; +import { CLIENT_ALERT_TYPES } from '../../../common/constants/alerts'; import { TlsTranslations } from './translations'; import { AlertTypeInitializer } from '.'; -import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; -import { store } from '../../state'; const { name, defaultActionMessage } = TlsTranslations; -const TlsAlertExpression = React.lazy(() => - import('../../components/overview/alerts/alerts_containers/alert_tls') -); +const TLSAlert = React.lazy(() => import('./lazy_wrapper/tls_alert')); export const initTlsAlertType: AlertTypeInitializer = ({ core, plugins }): AlertTypeModel => ({ id: CLIENT_ALERT_TYPES.TLS, iconClass: 'uptimeApp', - alertParamsExpression: (_params: any) => ( - - - - - + alertParamsExpression: (params: any) => ( + ), name, validate: () => ({ errors: {} }), diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/build_href.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/build_href.ts index 94383262b0acd..8c96a469da492 100644 --- a/x-pack/plugins/uptime/public/lib/helper/observability_integration/build_href.ts +++ b/x-pack/plugins/uptime/public/lib/helper/observability_integration/build_href.ts @@ -4,24 +4,23 @@ * you may not use this file except in compliance with the Elastic License. */ -import { get } from 'lodash'; import { Ping } from '../../../../common/runtime_types'; /** * Builds URLs to the designated features by extracting values from the provided * monitor object on a given path. Then returns the result of a provided function * to place the value in its rightful place on the URI string. - * @param checks array of summary checks containing the data to extract - * @param path the location on the object of the desired data + * @param summaryPings array of summary checks containing the data to extract + * @param getData the location on the object of the desired data * @param getHref a function that returns the full URL */ export const buildHref = ( summaryPings: Ping[], - path: string, + getData: (ping: Ping) => string | undefined, getHref: (value: string | string[] | undefined) => string | undefined ): string | undefined => { const queryValue = summaryPings - .map((ping) => get(ping, path, undefined)) + .map((ping) => getData(ping)) .filter((value: string | undefined) => value !== undefined); if (queryValue.length === 0) { return getHref(undefined); diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts index 0ff5a8acb3367..a1d69950cb61a 100644 --- a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts +++ b/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { get } from 'lodash'; import { addBasePath } from './add_base_path'; import { MonitorSummary } from '../../../../common/runtime_types'; @@ -17,6 +16,6 @@ export const getApmHref = ( addBasePath( basePath, `/app/apm#/services?kuery=${encodeURI( - `url.domain: "${get(summary, 'state.url.domain')}"` + `url.domain: "${summary?.state?.url?.domain}"` )}&rangeFrom=${dateRangeStart}&rangeTo=${dateRangeEnd}` ); diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_infra_href.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_infra_href.ts index 33d24a0f081b4..c225382350eac 100644 --- a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_infra_href.ts +++ b/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_infra_href.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { MonitorSummary } from '../../../../common/runtime_types'; +import { MonitorSummary, Ping } from '../../../../common/runtime_types'; import { addBasePath } from './add_base_path'; import { buildHref } from './build_href'; @@ -22,7 +22,7 @@ export const getInfraContainerHref = ( `/app/metrics/link-to/container-detail/${encodeURIComponent(ret)}` ); }; - return buildHref(summary.state.summaryPings || [], 'container.id', getHref); + return buildHref(summary.state.summaryPings || [], (ping: Ping) => ping?.container?.id, getHref); }; export const getInfraKubernetesHref = ( @@ -37,7 +37,11 @@ export const getInfraKubernetesHref = ( return addBasePath(basePath, `/app/metrics/link-to/pod-detail/${encodeURIComponent(ret)}`); }; - return buildHref(summary.state.summaryPings || [], 'kubernetes.pod.uid', getHref); + return buildHref( + summary.state.summaryPings || [], + (ping: Ping) => ping?.kubernetes?.pod?.uid, + getHref + ); }; export const getInfraIpHref = (summary: MonitorSummary, basePath: string) => { @@ -63,5 +67,5 @@ export const getInfraIpHref = (summary: MonitorSummary, basePath: string) => { `/app/metrics/inventory?waffleFilter=(expression:'${encodeURIComponent(ips)}',kind:kuery)` ); }; - return buildHref(summary.state.summaryPings || [], 'monitor.ip', getHref); + return buildHref(summary.state.summaryPings || [], (ping: Ping) => ping?.monitor?.ip, getHref); }; diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_logging_href.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_logging_href.ts index c4fee330e9763..32709882d1d21 100644 --- a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_logging_href.ts +++ b/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_logging_href.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { MonitorSummary } from '../../../../common/runtime_types'; +import { MonitorSummary, Ping } from '../../../../common/runtime_types'; import { addBasePath } from './add_base_path'; import { buildHref } from './build_href'; @@ -22,7 +22,7 @@ export const getLoggingContainerHref = ( `/app/logs?logFilter=${encodeURI(`(expression:'container.id : ${ret}',kind:kuery)`)}` ); }; - return buildHref(summary.state.summaryPings || [], 'container.id', getHref); + return buildHref(summary.state.summaryPings || [], (ping: Ping) => ping?.container?.id, getHref); }; export const getLoggingKubernetesHref = (summary: MonitorSummary, basePath: string) => { @@ -36,7 +36,11 @@ export const getLoggingKubernetesHref = (summary: MonitorSummary, basePath: stri `/app/logs?logFilter=${encodeURI(`(expression:'pod.uid : ${ret}',kind:kuery)`)}` ); }; - return buildHref(summary.state.summaryPings || [], 'kubernetes.pod.uid', getHref); + return buildHref( + summary.state.summaryPings || [], + (ping: Ping) => ping?.kubernetes?.pod?.uid, + getHref + ); }; export const getLoggingIpHref = (summary: MonitorSummary, basePath: string) => { @@ -50,5 +54,5 @@ export const getLoggingIpHref = (summary: MonitorSummary, basePath: string) => { `/app/logs?logFilter=(expression:'${encodeURIComponent(`host.ip : ${ret}`)}',kind:kuery)` ); }; - return buildHref(summary.state.summaryPings || [], 'monitor.ip', getHref); + return buildHref(summary.state.summaryPings || [], (ping: Ping) => ping?.monitor?.ip, getHref); }; diff --git a/x-pack/plugins/uptime/public/lib/lib.ts b/x-pack/plugins/uptime/public/lib/lib.ts index 187dcee7adb1a..ac95f018a80a2 100644 --- a/x-pack/plugins/uptime/public/lib/lib.ts +++ b/x-pack/plugins/uptime/public/lib/lib.ts @@ -4,19 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ReactElement } from 'react'; -import { AppUnmount } from 'kibana/public'; import { UMBadge } from '../badge'; -import { UptimeAppProps } from '../uptime_app'; - -export interface UMFrontendLibs { - framework: UMFrameworkAdapter; -} export type UMUpdateBadge = (badge: UMBadge) => void; - -export type BootstrapUptimeApp = (props: UptimeAppProps) => ReactElement; - -export interface UMFrameworkAdapter { - render(element: any): Promise; -} diff --git a/x-pack/plugins/uptime/public/pages/certificates.tsx b/x-pack/plugins/uptime/public/pages/certificates.tsx index 58a56a5555323..e46d228c6d21f 100644 --- a/x-pack/plugins/uptime/public/pages/certificates.tsx +++ b/x-pack/plugins/uptime/public/pages/certificates.tsx @@ -21,13 +21,14 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { useTrackPageview } from '../../../observability/public'; import { PageHeader } from './page_header'; import { useBreadcrumbs } from '../hooks/use_breadcrumbs'; -import { OVERVIEW_ROUTE, SETTINGS_ROUTE, CLIENT_ALERT_TYPES } from '../../common/constants'; +import { OVERVIEW_ROUTE, SETTINGS_ROUTE } from '../../common/constants'; import { getDynamicSettings } from '../state/actions/dynamic_settings'; import { UptimeRefreshContext } from '../contexts'; import * as labels from './translations'; import { certificatesSelector, getCertificatesAction } from '../state/certificates/certificates'; import { CertificateList, CertificateSearch, CertSort } from '../components/certificates'; import { ToggleAlertFlyoutButton } from '../components/overview/alerts/alerts_containers'; +import { CLIENT_ALERT_TYPES } from '../../common/constants/alerts'; const DEFAULT_PAGE_SIZE = 10; const LOCAL_STORAGE_KEY = 'xpack.uptime.certList.pageSize'; diff --git a/x-pack/plugins/uptime/public/pages/settings.tsx b/x-pack/plugins/uptime/public/pages/settings.tsx index 602911cd41aab..89c12d0efdac1 100644 --- a/x-pack/plugins/uptime/public/pages/settings.tsx +++ b/x-pack/plugins/uptime/public/pages/settings.tsx @@ -17,7 +17,6 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { useDispatch, useSelector } from 'react-redux'; -import { isEqual } from 'lodash'; import { useHistory } from 'react-router-dom'; import { selectDynamicSettings } from '../state/selectors'; import { getDynamicSettings, setDynamicSettings } from '../state/actions/dynamic_settings'; @@ -80,6 +79,14 @@ const getFieldErrors = (formFields: DynamicSettings | null): SettingsPageFieldEr return null; }; +const isDirtyForm = (formFields: DynamicSettings | null, settings?: DynamicSettings) => { + return ( + settings?.certAgeThreshold !== formFields?.certAgeThreshold || + settings?.certExpirationThreshold !== formFields?.certExpirationThreshold || + settings?.heartbeatIndices !== formFields?.heartbeatIndices + ); +}; + export const SettingsPage: React.FC = () => { const dss = useSelector(selectDynamicSettings); @@ -121,7 +128,8 @@ export const SettingsPage: React.FC = () => { const resetForm = () => setFormFields(dss.settings ? { ...dss.settings } : null); - const isFormDirty = !isEqual(dss.settings, formFields); + const isFormDirty = isDirtyForm(formFields, dss.settings); + const canEdit: boolean = !!useKibana().services?.application?.capabilities.uptime.configureSettings || false; const isFormDisabled = dss.loading || !canEdit; diff --git a/x-pack/plugins/uptime/public/state/api/utils.ts b/x-pack/plugins/uptime/public/state/api/utils.ts index 4f3765275c49a..e0cec56dd52cd 100644 --- a/x-pack/plugins/uptime/public/state/api/utils.ts +++ b/x-pack/plugins/uptime/public/state/api/utils.ts @@ -8,7 +8,11 @@ import { PathReporter } from 'io-ts/lib/PathReporter'; import { isRight } from 'fp-ts/lib/Either'; import { HttpFetchQuery, HttpSetup } from 'src/core/public'; import * as t from 'io-ts'; -import { isObject } from 'lodash'; + +function isObject(value: unknown) { + const type = typeof value; + return value != null && (type === 'object' || type === 'function'); +} // TODO: Copied from https://github.com/elastic/kibana/blob/master/x-pack/plugins/security_solution/common/format_errors.ts // We should figure out a better way to share this diff --git a/x-pack/plugins/uptime/public/state/effects/index_status.ts b/x-pack/plugins/uptime/public/state/effects/index_status.ts index a4b85312849a2..3917159381eb5 100644 --- a/x-pack/plugins/uptime/public/state/effects/index_status.ts +++ b/x-pack/plugins/uptime/public/state/effects/index_status.ts @@ -6,8 +6,8 @@ import { takeLeading } from 'redux-saga/effects'; import { indexStatusAction } from '../actions'; -import { fetchIndexStatus } from '../api'; import { fetchEffectFactory } from './fetch_effect'; +import { fetchIndexStatus } from '../api/index_status'; export function* fetchIndexStatusEffect() { yield takeLeading( diff --git a/x-pack/plugins/uptime/server/kibana.index.ts b/x-pack/plugins/uptime/server/kibana.index.ts index 2bf0d84a49de1..ab8d7a068b19d 100644 --- a/x-pack/plugins/uptime/server/kibana.index.ts +++ b/x-pack/plugins/uptime/server/kibana.index.ts @@ -5,7 +5,7 @@ */ import { Request, Server } from 'hapi'; -import { PLUGIN } from '../common/constants'; +import { PLUGIN } from '../common/constants/plugin'; import { compose } from './lib/compose/kibana'; import { initUptimeServer } from './uptime_server'; import { UptimeCorePlugins, UptimeCoreSetup } from './lib/adapters/framework'; diff --git a/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts b/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts index 7dd357e99b83d..a71913d0eea9a 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts @@ -8,7 +8,7 @@ import moment from 'moment'; import { schema } from '@kbn/config-schema'; import { ILegacyScopedClusterClient } from 'kibana/server'; import { updateState } from './common'; -import { ACTION_GROUP_DEFINITIONS } from '../../../common/constants'; +import { ACTION_GROUP_DEFINITIONS } from '../../../common/constants/alerts'; import { commonStateTranslations, durationAnomalyTranslations } from './translations'; import { AnomaliesTableRecord } from '../../../../ml/common/types/anomalies'; import { getSeverityType } from '../../../../ml/common/util/anomaly_utils'; diff --git a/x-pack/plugins/uptime/server/lib/alerts/status_check.ts b/x-pack/plugins/uptime/server/lib/alerts/status_check.ts index 2117ac4b7ed4e..a34d7eb292eef 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/status_check.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/status_check.ts @@ -21,7 +21,7 @@ import { MonitorAvailabilityType, DynamicSettings, } from '../../../common/runtime_types'; -import { ACTION_GROUP_DEFINITIONS } from '../../../common/constants'; +import { ACTION_GROUP_DEFINITIONS } from '../../../common/constants/alerts'; import { savedObjectsAdapter } from '../saved_objects'; import { updateState } from './common'; import { commonStateTranslations } from './translations'; diff --git a/x-pack/plugins/uptime/server/lib/alerts/tls.ts b/x-pack/plugins/uptime/server/lib/alerts/tls.ts index 61e738b088d50..d4853ad7a9cb0 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/tls.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/tls.ts @@ -9,7 +9,8 @@ import { schema } from '@kbn/config-schema'; import { UptimeAlertTypeFactory } from './types'; import { savedObjectsAdapter } from '../saved_objects'; import { updateState } from './common'; -import { ACTION_GROUP_DEFINITIONS, DYNAMIC_SETTINGS_DEFAULTS } from '../../../common/constants'; +import { ACTION_GROUP_DEFINITIONS } from '../../../common/constants/alerts'; +import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../common/constants'; import { Cert, CertResult } from '../../../common/runtime_types'; import { commonStateTranslations, tlsTranslations } from './translations'; import { DEFAULT_FROM, DEFAULT_TO } from '../../rest_api/certs/certs'; From 0dbfde4f4d945a92adab66a8895fc0a129af2bd9 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 28 Jul 2020 17:34:40 +0300 Subject: [PATCH 061/126] [Functional Tests] Increase the timeout on getting the legend value on timeseries (#73279) --- test/functional/page_objects/visual_builder_page.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/functional/page_objects/visual_builder_page.ts b/test/functional/page_objects/visual_builder_page.ts index 8488eb8cd2749..2771982fecdea 100644 --- a/test/functional/page_objects/visual_builder_page.ts +++ b/test/functional/page_objects/visual_builder_page.ts @@ -315,9 +315,9 @@ export function VisualBuilderPageProvider({ getService, getPageObjects }: FtrPro public async getRhythmChartLegendValue(nth = 0) { await PageObjects.visChart.waitForVisualizationRenderingStabilized(); - const metricValue = (await find.allByCssSelector(`.echLegendItem .echLegendItem__extra`))[ - nth - ]; + const metricValue = ( + await find.allByCssSelector(`.echLegendItem .echLegendItem__extra`, 20000) + )[nth]; await metricValue.moveMouseTo(); return await metricValue.getVisibleText(); } From f87d97b629d2497fd6d63dfe5ce5fd6d3a90537e Mon Sep 17 00:00:00 2001 From: Toby Sutor <55087308+toby-sutor@users.noreply.github.com> Date: Tue, 28 Jul 2020 16:35:00 +0200 Subject: [PATCH 062/126] 32 characters requirement for xpack.reporting.encryptionKey (#72593) Similar to https://www.elastic.co/guide/en/kibana/current/alert-action-settings-kb.html#general-alert-action-settings is a 32 character minimum length required for xpack.reporting.encryptionKey --- docs/settings/reporting-settings.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/settings/reporting-settings.asciidoc b/docs/settings/reporting-settings.asciidoc index c83cd068eff5b..b31ae76d28052 100644 --- a/docs/settings/reporting-settings.asciidoc +++ b/docs/settings/reporting-settings.asciidoc @@ -21,7 +21,7 @@ You can configure `xpack.reporting` settings in your `kibana.yml` to: | Set to `false` to disable the {report-features}. | `xpack.reporting.encryptionKey` - | Set to any text string. By default, {kib} will generate a random key when it + | Set to an alphanumeric, at least 32 characters long text string. By default, {kib} will generate a random key when it starts, which will cause pending reports to fail after restart. Configure this setting to preserve the same key across multiple restarts and multiple instances of {kib}. From 56609049cb51d5a6edddc9929d0cb3bd5bc4cdee Mon Sep 17 00:00:00 2001 From: Toby Sutor <55087308+toby-sutor@users.noreply.github.com> Date: Tue, 28 Jul 2020 16:35:08 +0200 Subject: [PATCH 063/126] 32 characters requirement for xpack.reporting.encryptionKey (#72594) Similar to https://github.com/elastic/kibana/pull/72593 document that the string needs to be at least 32 characters long. --- docs/user/reporting/configuring-reporting.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user/reporting/configuring-reporting.asciidoc b/docs/user/reporting/configuring-reporting.asciidoc index ca2d79bb2dec0..6a0c44cf4c2a4 100644 --- a/docs/user/reporting/configuring-reporting.asciidoc +++ b/docs/user/reporting/configuring-reporting.asciidoc @@ -23,7 +23,7 @@ reporting job metadata. To set a static encryption key for reporting, set the `xpack.reporting.encryptionKey` property in the `kibana.yml` -configuration file. You can use any text string as the encryption key. +configuration file. You can use any alphanumeric, at least 32 characters long text string as the encryption key. [source,yaml] -------------------------------------------------------------------------------- From cdb1c0d9a4c86cb1342005767ca697263cfafe39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20St=C3=BCrmer?= Date: Tue, 28 Jul 2020 16:44:27 +0200 Subject: [PATCH 064/126] [Logs UI] Check for presence of data instead of presence of indices in overview page fetchers (#73101) This causes the "has data" check for the observability overview page to not only check for the presence of log indices but also of log entries. --- .../log_sources/get_log_source_status.ts | 10 +++- .../public/pages/logs/stream/page_content.tsx | 2 +- .../pages/logs/stream/page_providers.tsx | 2 +- .../public/utils/logs_overview_fetchers.ts | 2 +- .../utils/logs_overview_fetches.test.ts | 48 ++++++++++++------- .../server/graphql/source_status/resolvers.ts | 2 +- .../lib/adapters/framework/adapter_types.ts | 1 + .../elasticsearch_source_status_adapter.ts | 22 +++++++-- .../plugins/infra/server/lib/source_status.ts | 19 +++++--- .../infra/server/routes/log_sources/status.ts | 11 +++-- .../infra/server/routes/source/index.ts | 8 ++-- 11 files changed, 84 insertions(+), 43 deletions(-) diff --git a/x-pack/plugins/infra/common/http_api/log_sources/get_log_source_status.ts b/x-pack/plugins/infra/common/http_api/log_sources/get_log_source_status.ts index b522d86987283..dc4e4f1ea6217 100644 --- a/x-pack/plugins/infra/common/http_api/log_sources/get_log_source_status.ts +++ b/x-pack/plugins/infra/common/http_api/log_sources/get_log_source_status.ts @@ -40,9 +40,17 @@ const logIndexFieldRT = rt.strict({ export type LogIndexField = rt.TypeOf; +const logIndexStatusRT = rt.keyof({ + missing: null, + empty: null, + available: null, +}); + +export type LogIndexStatus = rt.TypeOf; + const logSourceStatusRT = rt.strict({ logIndexFields: rt.array(logIndexFieldRT), - logIndicesExist: rt.boolean, + logIndexStatus: logIndexStatusRT, }); export type LogSourceStatus = rt.TypeOf; diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx index b2a4ce65ab2b6..fe362dcf8da8c 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx @@ -25,7 +25,7 @@ export const StreamPageContent: React.FunctionComponent = () => { return ; } else if (hasFailedLoadingSource) { return ; - } else if (sourceStatus?.logIndicesExist) { + } else if (sourceStatus?.logIndexStatus !== 'missing') { return ; } else { return ; diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_providers.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_providers.tsx index 82c21f663bc96..1a1cc13576556 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_providers.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_providers.tsx @@ -107,7 +107,7 @@ export const LogsPageProviders: React.FunctionComponent = ({ children }) => { const { sourceStatus } = useLogSourceContext(); // The providers assume the source is loaded, so short-circuit them otherwise - if (!sourceStatus?.logIndicesExist) { + if (sourceStatus?.logIndexStatus === 'missing') { return <>{children}; } diff --git a/x-pack/plugins/infra/public/utils/logs_overview_fetchers.ts b/x-pack/plugins/infra/public/utils/logs_overview_fetchers.ts index 53f7e00a3354c..3716e618068a3 100644 --- a/x-pack/plugins/infra/public/utils/logs_overview_fetchers.ts +++ b/x-pack/plugins/infra/public/utils/logs_overview_fetchers.ts @@ -43,7 +43,7 @@ export function getLogsHasDataFetcher( return async () => { const [core] = await getStartServices(); const sourceStatus = await callFetchLogSourceStatusAPI(DEFAULT_SOURCE_ID, core.http.fetch); - return sourceStatus.data.logIndicesExist; + return sourceStatus.data.logIndexStatus === 'available'; }; } diff --git a/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts b/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts index 6f9e41fbd08f3..a2b4e162756e3 100644 --- a/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts +++ b/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts @@ -3,17 +3,18 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + +import { CoreStart } from 'kibana/public'; import { coreMock } from 'src/core/public/mocks'; import { dataPluginMock } from 'src/plugins/data/public/mocks'; -import { CoreStart } from 'kibana/public'; -import { getLogsHasDataFetcher } from './logs_overview_fetchers'; -import { InfraClientStartDeps, InfraClientStartExports } from '../types'; import { callFetchLogSourceStatusAPI } from '../containers/logs/log_source/api/fetch_log_source_status'; +import { InfraClientStartDeps, InfraClientStartExports } from '../types'; +import { getLogsHasDataFetcher } from './logs_overview_fetchers'; -// Note -// Calls to `.mock*` functions will fail the typecheck because how jest does the mocking. -// The calls will be preluded with a `@ts-expect-error` jest.mock('../containers/logs/log_source/api/fetch_log_source_status'); +const mockedCallFetchLogSourceStatusAPI = callFetchLogSourceStatusAPI as jest.MockedFunction< + typeof callFetchLogSourceStatusAPI +>; function setup() { const core = coreMock.createStart(); @@ -33,36 +34,47 @@ function setup() { describe('Logs UI Observability Homepage Functions', () => { describe('getLogsHasDataFetcher()', () => { beforeEach(() => { - // @ts-expect-error - callFetchLogSourceStatusAPI.mockReset(); + mockedCallFetchLogSourceStatusAPI.mockReset(); }); - it('should return true when some index is present', async () => { + it('should return true when non-empty indices exist', async () => { const { mockedGetStartServices } = setup(); - // @ts-expect-error - callFetchLogSourceStatusAPI.mockResolvedValue({ - data: { logIndexFields: [], logIndicesExist: true }, + mockedCallFetchLogSourceStatusAPI.mockResolvedValue({ + data: { logIndexFields: [], logIndexStatus: 'available' }, }); const hasData = getLogsHasDataFetcher(mockedGetStartServices); const response = await hasData(); - expect(callFetchLogSourceStatusAPI).toHaveBeenCalledTimes(1); + expect(mockedCallFetchLogSourceStatusAPI).toHaveBeenCalledTimes(1); expect(response).toBe(true); }); - it('should return false when no index is present', async () => { + it('should return false when only empty indices exist', async () => { + const { mockedGetStartServices } = setup(); + + mockedCallFetchLogSourceStatusAPI.mockResolvedValue({ + data: { logIndexFields: [], logIndexStatus: 'empty' }, + }); + + const hasData = getLogsHasDataFetcher(mockedGetStartServices); + const response = await hasData(); + + expect(mockedCallFetchLogSourceStatusAPI).toHaveBeenCalledTimes(1); + expect(response).toBe(false); + }); + + it('should return false when no index exists', async () => { const { mockedGetStartServices } = setup(); - // @ts-expect-error - callFetchLogSourceStatusAPI.mockResolvedValue({ - data: { logIndexFields: [], logIndicesExist: false }, + mockedCallFetchLogSourceStatusAPI.mockResolvedValue({ + data: { logIndexFields: [], logIndexStatus: 'missing' }, }); const hasData = getLogsHasDataFetcher(mockedGetStartServices); const response = await hasData(); - expect(callFetchLogSourceStatusAPI).toHaveBeenCalledTimes(1); + expect(mockedCallFetchLogSourceStatusAPI).toHaveBeenCalledTimes(1); expect(response).toBe(false); }); }); diff --git a/x-pack/plugins/infra/server/graphql/source_status/resolvers.ts b/x-pack/plugins/infra/server/graphql/source_status/resolvers.ts index 848d66058e64c..bd92dd0f7da8b 100644 --- a/x-pack/plugins/infra/server/graphql/source_status/resolvers.ts +++ b/x-pack/plugins/infra/server/graphql/source_status/resolvers.ts @@ -73,7 +73,7 @@ export const createSourceStatusResolvers = (libs: { return await libs.sourceStatus.hasLogAlias(req, source.id); }, async logIndicesExist(source, args, { req }) { - return await libs.sourceStatus.hasLogIndices(req, source.id); + return (await libs.sourceStatus.getLogIndexStatus(req, source.id)) !== 'missing'; }, async logIndices(source, args, { req }) { return await libs.sourceStatus.getLogIndexNames(req, source.id); diff --git a/x-pack/plugins/infra/server/lib/adapters/framework/adapter_types.ts b/x-pack/plugins/infra/server/lib/adapters/framework/adapter_types.ts index 018e5098a4291..117749ae87bbe 100644 --- a/x-pack/plugins/infra/server/lib/adapters/framework/adapter_types.ts +++ b/x-pack/plugins/infra/server/lib/adapters/framework/adapter_types.ts @@ -38,6 +38,7 @@ export interface CallWithRequestParams extends GenericParams { fields?: string | string[]; path?: string; query?: string | object; + track_total_hits?: boolean | number; } export type InfraResponse = Lifecycle.ReturnValue; diff --git a/x-pack/plugins/infra/server/lib/adapters/source_status/elasticsearch_source_status_adapter.ts b/x-pack/plugins/infra/server/lib/adapters/source_status/elasticsearch_source_status_adapter.ts index 9bc58604f12a5..2a61e64c94fcd 100644 --- a/x-pack/plugins/infra/server/lib/adapters/source_status/elasticsearch_source_status_adapter.ts +++ b/x-pack/plugins/infra/server/lib/adapters/source_status/elasticsearch_source_status_adapter.ts @@ -5,7 +5,7 @@ */ import { RequestHandlerContext } from 'src/core/server'; -import { InfraSourceStatusAdapter } from '../../source_status'; +import { InfraSourceStatusAdapter, SourceIndexStatus } from '../../source_status'; import { InfraDatabaseGetIndicesResponse } from '../framework'; import { KibanaFramework } from '../framework/kibana_framework_adapter'; @@ -40,7 +40,10 @@ export class InfraElasticsearchSourceStatusAdapter implements InfraSourceStatusA }); } - public async hasIndices(requestContext: RequestHandlerContext, indexNames: string) { + public async getIndexStatus( + requestContext: RequestHandlerContext, + indexNames: string + ): Promise { return await this.framework .callWithRequest(requestContext, 'search', { ignore_unavailable: true, @@ -48,12 +51,23 @@ export class InfraElasticsearchSourceStatusAdapter implements InfraSourceStatusA index: indexNames, size: 0, terminate_after: 1, + track_total_hits: 1, }) .then( - (response) => response._shards.total > 0, + (response) => { + if (response._shards.total <= 0) { + return 'missing'; + } + + if (response.hits.total.value > 0) { + return 'available'; + } + + return 'empty'; + }, (err) => { if (err.status === 404) { - return false; + return 'missing'; } throw err; } diff --git a/x-pack/plugins/infra/server/lib/source_status.ts b/x-pack/plugins/infra/server/lib/source_status.ts index 9bb953845e5a1..c383d01933562 100644 --- a/x-pack/plugins/infra/server/lib/source_status.ts +++ b/x-pack/plugins/infra/server/lib/source_status.ts @@ -69,19 +69,19 @@ export class InfraSourceStatus { ); return hasAlias; } - public async hasLogIndices( + public async getLogIndexStatus( requestContext: RequestHandlerContext, sourceId: string - ): Promise { + ): Promise { const sourceConfiguration = await this.libs.sources.getSourceConfiguration( requestContext.core.savedObjects.client, sourceId ); - const hasIndices = await this.adapter.hasIndices( + const indexStatus = await this.adapter.getIndexStatus( requestContext, sourceConfiguration.configuration.logAlias ); - return hasIndices; + return indexStatus; } public async hasMetricIndices( requestContext: RequestHandlerContext, @@ -91,16 +91,21 @@ export class InfraSourceStatus { requestContext.core.savedObjects.client, sourceId ); - const hasIndices = await this.adapter.hasIndices( + const indexStatus = await this.adapter.getIndexStatus( requestContext, sourceConfiguration.configuration.metricAlias ); - return hasIndices; + return indexStatus !== 'missing'; } } +export type SourceIndexStatus = 'missing' | 'empty' | 'available'; + export interface InfraSourceStatusAdapter { getIndexNames(requestContext: RequestHandlerContext, aliasName: string): Promise; hasAlias(requestContext: RequestHandlerContext, aliasName: string): Promise; - hasIndices(requestContext: RequestHandlerContext, indexNames: string): Promise; + getIndexStatus( + requestContext: RequestHandlerContext, + indexNames: string + ): Promise; } diff --git a/x-pack/plugins/infra/server/routes/log_sources/status.ts b/x-pack/plugins/infra/server/routes/log_sources/status.ts index 4cd85ecfe23c1..193c3541d740b 100644 --- a/x-pack/plugins/infra/server/routes/log_sources/status.ts +++ b/x-pack/plugins/infra/server/routes/log_sources/status.ts @@ -31,16 +31,17 @@ export const initLogSourceStatusRoutes = ({ const { sourceId } = request.params; try { - const logIndicesExist = await sourceStatus.hasLogIndices(requestContext, sourceId); - const logIndexFields = logIndicesExist - ? await fields.getFields(requestContext, sourceId, InfraIndexType.LOGS) - : []; + const logIndexStatus = await sourceStatus.getLogIndexStatus(requestContext, sourceId); + const logIndexFields = + logIndexStatus !== 'missing' + ? await fields.getFields(requestContext, sourceId, InfraIndexType.LOGS) + : []; return response.ok({ body: getLogSourceStatusSuccessResponsePayloadRT.encode({ data: { - logIndicesExist, logIndexFields, + logIndexStatus, }, }), }); diff --git a/x-pack/plugins/infra/server/routes/source/index.ts b/x-pack/plugins/infra/server/routes/source/index.ts index 2843897071e19..6069d3a35e54c 100644 --- a/x-pack/plugins/infra/server/routes/source/index.ts +++ b/x-pack/plugins/infra/server/routes/source/index.ts @@ -37,9 +37,9 @@ export const initSourceRoute = (libs: InfraBackendLibs) => { try { const { type, sourceId } = request.params; - const [source, logIndicesExist, metricIndicesExist, indexFields] = await Promise.all([ + const [source, logIndexStatus, metricIndicesExist, indexFields] = await Promise.all([ libs.sources.getSourceConfiguration(requestContext.core.savedObjects.client, sourceId), - libs.sourceStatus.hasLogIndices(requestContext, sourceId), + libs.sourceStatus.getLogIndexStatus(requestContext, sourceId), libs.sourceStatus.hasMetricIndices(requestContext, sourceId), libs.fields.getFields(requestContext, sourceId, typeToInfraIndexType(type)), ]); @@ -49,7 +49,7 @@ export const initSourceRoute = (libs: InfraBackendLibs) => { } const status = { - logIndicesExist, + logIndicesExist: logIndexStatus !== 'missing', metricIndicesExist, indexFields, }; @@ -83,7 +83,7 @@ export const initSourceRoute = (libs: InfraBackendLibs) => { const hasData = type === 'metrics' ? await libs.sourceStatus.hasMetricIndices(requestContext, sourceId) - : await libs.sourceStatus.hasLogIndices(requestContext, sourceId); + : (await libs.sourceStatus.getLogIndexStatus(requestContext, sourceId)) !== 'missing'; return response.ok({ body: { hasData }, From 4ede075681fae19701b3d0b004a74b1193493f7a Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Tue, 28 Jul 2020 17:51:23 +0300 Subject: [PATCH 065/126] [KP] fix doc generation for platform code (#73407) * fix doc generation for platform code * terminate process if type build failed * update types --- ...lugin-core-server.countresponse._shards.md | 11 ++ ...-plugin-core-server.countresponse.count.md | 11 ++ ...kibana-plugin-core-server.countresponse.md | 20 +++ ...-core-server.deletedocumentresponse._id.md | 11 ++ ...re-server.deletedocumentresponse._index.md | 11 ++ ...e-server.deletedocumentresponse._shards.md | 11 ++ ...ore-server.deletedocumentresponse._type.md | 11 ++ ...-server.deletedocumentresponse._version.md | 11 ++ ...ore-server.deletedocumentresponse.error.md | 13 ++ ...ore-server.deletedocumentresponse.found.md | 11 ++ ...ugin-core-server.deletedocumentresponse.md | 26 ++++ ...re-server.deletedocumentresponse.result.md | 11 ++ ...-plugin-core-server.elasticsearchclient.md | 17 +++ ...gin-core-server.explanation.description.md | 11 ++ ...-plugin-core-server.explanation.details.md | 11 ++ .../kibana-plugin-core-server.explanation.md | 21 +++ ...na-plugin-core-server.explanation.value.md | 11 ++ ...bana-plugin-core-server.getresponse._id.md | 11 ++ ...a-plugin-core-server.getresponse._index.md | 11 ++ ...n-core-server.getresponse._primary_term.md | 11 ++ ...plugin-core-server.getresponse._routing.md | 11 ++ ...-plugin-core-server.getresponse._seq_no.md | 11 ++ ...-plugin-core-server.getresponse._source.md | 11 ++ ...na-plugin-core-server.getresponse._type.md | 11 ++ ...plugin-core-server.getresponse._version.md | 11 ++ ...na-plugin-core-server.getresponse.found.md | 11 ++ .../kibana-plugin-core-server.getresponse.md | 27 ++++ .../core/server/kibana-plugin-core-server.md | 8 + ...er.savedobjectsdeletebynamespaceoptions.md | 2 +- ...objectsdeletebynamespaceoptions.refresh.md | 4 +- ...n-core-server.searchresponse._scroll_id.md | 11 ++ ...ugin-core-server.searchresponse._shards.md | 11 ++ ...core-server.searchresponse.aggregations.md | 11 ++ ...-plugin-core-server.searchresponse.hits.md | 28 ++++ ...ibana-plugin-core-server.searchresponse.md | 24 +++ ...in-core-server.searchresponse.timed_out.md | 11 ++ ...-plugin-core-server.searchresponse.took.md | 11 ++ ...na-plugin-core-server.shardsinfo.failed.md | 11 ++ .../kibana-plugin-core-server.shardsinfo.md | 22 +++ ...a-plugin-core-server.shardsinfo.skipped.md | 11 ++ ...lugin-core-server.shardsinfo.successful.md | 11 ++ ...ana-plugin-core-server.shardsinfo.total.md | 11 ++ ...lugin-core-server.shardsresponse.failed.md | 11 ++ ...ibana-plugin-core-server.shardsresponse.md | 22 +++ ...ugin-core-server.shardsresponse.skipped.md | 11 ++ ...n-core-server.shardsresponse.successful.md | 11 ++ ...plugin-core-server.shardsresponse.total.md | 11 ++ ...plugin-plugins-data-server.isearchsetup.md | 2 +- src/core/public/public.api.md | 122 +-------------- src/core/server/elasticsearch/client/types.ts | 32 +++- src/core/server/elasticsearch/index.ts | 6 +- src/core/server/index.ts | 7 + src/core/server/server.api.md | 142 +++++++++++++++++- src/dev/run_check_published_api_changes.ts | 47 +++--- src/plugins/data/public/public.api.md | 120 +-------------- src/plugins/data/server/server.api.md | 5 + 56 files changed, 811 insertions(+), 280 deletions(-) create mode 100644 docs/development/core/server/kibana-plugin-core-server.countresponse._shards.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.countresponse.count.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.countresponse.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._id.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._index.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._shards.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._type.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._version.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.error.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.found.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.result.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.elasticsearchclient.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.explanation.description.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.explanation.details.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.explanation.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.explanation.value.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.getresponse._id.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.getresponse._index.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.getresponse._primary_term.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.getresponse._routing.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.getresponse._seq_no.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.getresponse._source.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.getresponse._type.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.getresponse._version.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.getresponse.found.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.getresponse.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.searchresponse._scroll_id.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.searchresponse._shards.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.searchresponse.aggregations.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.searchresponse.hits.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.searchresponse.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.searchresponse.timed_out.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.searchresponse.took.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.shardsinfo.failed.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.shardsinfo.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.shardsinfo.skipped.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.shardsinfo.successful.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.shardsinfo.total.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.shardsresponse.failed.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.shardsresponse.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.shardsresponse.skipped.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.shardsresponse.successful.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.shardsresponse.total.md diff --git a/docs/development/core/server/kibana-plugin-core-server.countresponse._shards.md b/docs/development/core/server/kibana-plugin-core-server.countresponse._shards.md new file mode 100644 index 0000000000000..0f31a554e2208 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.countresponse._shards.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [CountResponse](./kibana-plugin-core-server.countresponse.md) > [\_shards](./kibana-plugin-core-server.countresponse._shards.md) + +## CountResponse.\_shards property + +Signature: + +```typescript +_shards: ShardsInfo; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.countresponse.count.md b/docs/development/core/server/kibana-plugin-core-server.countresponse.count.md new file mode 100644 index 0000000000000..3cd1a6aaf6644 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.countresponse.count.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [CountResponse](./kibana-plugin-core-server.countresponse.md) > [count](./kibana-plugin-core-server.countresponse.count.md) + +## CountResponse.count property + +Signature: + +```typescript +count: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.countresponse.md b/docs/development/core/server/kibana-plugin-core-server.countresponse.md new file mode 100644 index 0000000000000..f8664f4878f46 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.countresponse.md @@ -0,0 +1,20 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [CountResponse](./kibana-plugin-core-server.countresponse.md) + +## CountResponse interface + + +Signature: + +```typescript +export interface CountResponse +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [\_shards](./kibana-plugin-core-server.countresponse._shards.md) | ShardsInfo | | +| [count](./kibana-plugin-core-server.countresponse.count.md) | number | | + diff --git a/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._id.md b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._id.md new file mode 100644 index 0000000000000..ccc6a76361f26 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._id.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [DeleteDocumentResponse](./kibana-plugin-core-server.deletedocumentresponse.md) > [\_id](./kibana-plugin-core-server.deletedocumentresponse._id.md) + +## DeleteDocumentResponse.\_id property + +Signature: + +```typescript +_id: string; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._index.md b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._index.md new file mode 100644 index 0000000000000..a9a04bb2b2ed7 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._index.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [DeleteDocumentResponse](./kibana-plugin-core-server.deletedocumentresponse.md) > [\_index](./kibana-plugin-core-server.deletedocumentresponse._index.md) + +## DeleteDocumentResponse.\_index property + +Signature: + +```typescript +_index: string; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._shards.md b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._shards.md new file mode 100644 index 0000000000000..e3d5e9208db0a --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._shards.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [DeleteDocumentResponse](./kibana-plugin-core-server.deletedocumentresponse.md) > [\_shards](./kibana-plugin-core-server.deletedocumentresponse._shards.md) + +## DeleteDocumentResponse.\_shards property + +Signature: + +```typescript +_shards: ShardsResponse; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._type.md b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._type.md new file mode 100644 index 0000000000000..690852e20a76e --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._type.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [DeleteDocumentResponse](./kibana-plugin-core-server.deletedocumentresponse.md) > [\_type](./kibana-plugin-core-server.deletedocumentresponse._type.md) + +## DeleteDocumentResponse.\_type property + +Signature: + +```typescript +_type: string; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._version.md b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._version.md new file mode 100644 index 0000000000000..acfe8ef55ae71 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse._version.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [DeleteDocumentResponse](./kibana-plugin-core-server.deletedocumentresponse.md) > [\_version](./kibana-plugin-core-server.deletedocumentresponse._version.md) + +## DeleteDocumentResponse.\_version property + +Signature: + +```typescript +_version: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.error.md b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.error.md new file mode 100644 index 0000000000000..aafe850188998 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.error.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [DeleteDocumentResponse](./kibana-plugin-core-server.deletedocumentresponse.md) > [error](./kibana-plugin-core-server.deletedocumentresponse.error.md) + +## DeleteDocumentResponse.error property + +Signature: + +```typescript +error?: { + type: string; + }; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.found.md b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.found.md new file mode 100644 index 0000000000000..00bc89bda66ed --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.found.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [DeleteDocumentResponse](./kibana-plugin-core-server.deletedocumentresponse.md) > [found](./kibana-plugin-core-server.deletedocumentresponse.found.md) + +## DeleteDocumentResponse.found property + +Signature: + +```typescript +found: boolean; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.md b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.md new file mode 100644 index 0000000000000..e8ac7d2fd8ec1 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.md @@ -0,0 +1,26 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [DeleteDocumentResponse](./kibana-plugin-core-server.deletedocumentresponse.md) + +## DeleteDocumentResponse interface + + +Signature: + +```typescript +export interface DeleteDocumentResponse +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [\_id](./kibana-plugin-core-server.deletedocumentresponse._id.md) | string | | +| [\_index](./kibana-plugin-core-server.deletedocumentresponse._index.md) | string | | +| [\_shards](./kibana-plugin-core-server.deletedocumentresponse._shards.md) | ShardsResponse | | +| [\_type](./kibana-plugin-core-server.deletedocumentresponse._type.md) | string | | +| [\_version](./kibana-plugin-core-server.deletedocumentresponse._version.md) | number | | +| [error](./kibana-plugin-core-server.deletedocumentresponse.error.md) | {
      type: string;
      } | | +| [found](./kibana-plugin-core-server.deletedocumentresponse.found.md) | boolean | | +| [result](./kibana-plugin-core-server.deletedocumentresponse.result.md) | string | | + diff --git a/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.result.md b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.result.md new file mode 100644 index 0000000000000..88f7568d3d9bc --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.deletedocumentresponse.result.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [DeleteDocumentResponse](./kibana-plugin-core-server.deletedocumentresponse.md) > [result](./kibana-plugin-core-server.deletedocumentresponse.result.md) + +## DeleteDocumentResponse.result property + +Signature: + +```typescript +result: string; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.elasticsearchclient.md b/docs/development/core/server/kibana-plugin-core-server.elasticsearchclient.md new file mode 100644 index 0000000000000..279262aa6a5ec --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.elasticsearchclient.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ElasticsearchClient](./kibana-plugin-core-server.elasticsearchclient.md) + +## ElasticsearchClient type + +Client used to query the elasticsearch cluster. + +Signature: + +```typescript +export declare type ElasticsearchClient = Omit & { + transport: { + request(params: TransportRequestParams, options?: TransportRequestOptions): TransportRequestPromise; + }; +}; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.explanation.description.md b/docs/development/core/server/kibana-plugin-core-server.explanation.description.md new file mode 100644 index 0000000000000..37fc90f5ac5d8 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.explanation.description.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [Explanation](./kibana-plugin-core-server.explanation.md) > [description](./kibana-plugin-core-server.explanation.description.md) + +## Explanation.description property + +Signature: + +```typescript +description: string; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.explanation.details.md b/docs/development/core/server/kibana-plugin-core-server.explanation.details.md new file mode 100644 index 0000000000000..afba9175d86cf --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.explanation.details.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [Explanation](./kibana-plugin-core-server.explanation.md) > [details](./kibana-plugin-core-server.explanation.details.md) + +## Explanation.details property + +Signature: + +```typescript +details: Explanation[]; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.explanation.md b/docs/development/core/server/kibana-plugin-core-server.explanation.md new file mode 100644 index 0000000000000..eb18910c4795b --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.explanation.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [Explanation](./kibana-plugin-core-server.explanation.md) + +## Explanation interface + + +Signature: + +```typescript +export interface Explanation +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [description](./kibana-plugin-core-server.explanation.description.md) | string | | +| [details](./kibana-plugin-core-server.explanation.details.md) | Explanation[] | | +| [value](./kibana-plugin-core-server.explanation.value.md) | number | | + diff --git a/docs/development/core/server/kibana-plugin-core-server.explanation.value.md b/docs/development/core/server/kibana-plugin-core-server.explanation.value.md new file mode 100644 index 0000000000000..b10f60176b0c8 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.explanation.value.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [Explanation](./kibana-plugin-core-server.explanation.md) > [value](./kibana-plugin-core-server.explanation.value.md) + +## Explanation.value property + +Signature: + +```typescript +value: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.getresponse._id.md b/docs/development/core/server/kibana-plugin-core-server.getresponse._id.md new file mode 100644 index 0000000000000..d31b61f3962c8 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.getresponse._id.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [GetResponse](./kibana-plugin-core-server.getresponse.md) > [\_id](./kibana-plugin-core-server.getresponse._id.md) + +## GetResponse.\_id property + +Signature: + +```typescript +_id: string; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.getresponse._index.md b/docs/development/core/server/kibana-plugin-core-server.getresponse._index.md new file mode 100644 index 0000000000000..0353ec1a17b2c --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.getresponse._index.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [GetResponse](./kibana-plugin-core-server.getresponse.md) > [\_index](./kibana-plugin-core-server.getresponse._index.md) + +## GetResponse.\_index property + +Signature: + +```typescript +_index: string; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.getresponse._primary_term.md b/docs/development/core/server/kibana-plugin-core-server.getresponse._primary_term.md new file mode 100644 index 0000000000000..8412302ab727d --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.getresponse._primary_term.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [GetResponse](./kibana-plugin-core-server.getresponse.md) > [\_primary\_term](./kibana-plugin-core-server.getresponse._primary_term.md) + +## GetResponse.\_primary\_term property + +Signature: + +```typescript +_primary_term: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.getresponse._routing.md b/docs/development/core/server/kibana-plugin-core-server.getresponse._routing.md new file mode 100644 index 0000000000000..1af3ed31ee112 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.getresponse._routing.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [GetResponse](./kibana-plugin-core-server.getresponse.md) > [\_routing](./kibana-plugin-core-server.getresponse._routing.md) + +## GetResponse.\_routing property + +Signature: + +```typescript +_routing?: string; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.getresponse._seq_no.md b/docs/development/core/server/kibana-plugin-core-server.getresponse._seq_no.md new file mode 100644 index 0000000000000..e8d72563f8149 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.getresponse._seq_no.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [GetResponse](./kibana-plugin-core-server.getresponse.md) > [\_seq\_no](./kibana-plugin-core-server.getresponse._seq_no.md) + +## GetResponse.\_seq\_no property + +Signature: + +```typescript +_seq_no: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.getresponse._source.md b/docs/development/core/server/kibana-plugin-core-server.getresponse._source.md new file mode 100644 index 0000000000000..97aacb42992a3 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.getresponse._source.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [GetResponse](./kibana-plugin-core-server.getresponse.md) > [\_source](./kibana-plugin-core-server.getresponse._source.md) + +## GetResponse.\_source property + +Signature: + +```typescript +_source: T; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.getresponse._type.md b/docs/development/core/server/kibana-plugin-core-server.getresponse._type.md new file mode 100644 index 0000000000000..b3205e2fe91d7 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.getresponse._type.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [GetResponse](./kibana-plugin-core-server.getresponse.md) > [\_type](./kibana-plugin-core-server.getresponse._type.md) + +## GetResponse.\_type property + +Signature: + +```typescript +_type: string; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.getresponse._version.md b/docs/development/core/server/kibana-plugin-core-server.getresponse._version.md new file mode 100644 index 0000000000000..23d3a8c91f4a2 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.getresponse._version.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [GetResponse](./kibana-plugin-core-server.getresponse.md) > [\_version](./kibana-plugin-core-server.getresponse._version.md) + +## GetResponse.\_version property + +Signature: + +```typescript +_version: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.getresponse.found.md b/docs/development/core/server/kibana-plugin-core-server.getresponse.found.md new file mode 100644 index 0000000000000..8d34a3e743cca --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.getresponse.found.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [GetResponse](./kibana-plugin-core-server.getresponse.md) > [found](./kibana-plugin-core-server.getresponse.found.md) + +## GetResponse.found property + +Signature: + +```typescript +found: boolean; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.getresponse.md b/docs/development/core/server/kibana-plugin-core-server.getresponse.md new file mode 100644 index 0000000000000..bab3092c6b1fa --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.getresponse.md @@ -0,0 +1,27 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [GetResponse](./kibana-plugin-core-server.getresponse.md) + +## GetResponse interface + + +Signature: + +```typescript +export interface GetResponse +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [\_id](./kibana-plugin-core-server.getresponse._id.md) | string | | +| [\_index](./kibana-plugin-core-server.getresponse._index.md) | string | | +| [\_primary\_term](./kibana-plugin-core-server.getresponse._primary_term.md) | number | | +| [\_routing](./kibana-plugin-core-server.getresponse._routing.md) | string | | +| [\_seq\_no](./kibana-plugin-core-server.getresponse._seq_no.md) | number | | +| [\_source](./kibana-plugin-core-server.getresponse._source.md) | T | | +| [\_type](./kibana-plugin-core-server.getresponse._type.md) | string | | +| [\_version](./kibana-plugin-core-server.getresponse._version.md) | number | | +| [found](./kibana-plugin-core-server.getresponse.found.md) | boolean | | + diff --git a/docs/development/core/server/kibana-plugin-core-server.md b/docs/development/core/server/kibana-plugin-core-server.md index 61ffc532f0de5..95b7627398b45 100644 --- a/docs/development/core/server/kibana-plugin-core-server.md +++ b/docs/development/core/server/kibana-plugin-core-server.md @@ -74,7 +74,9 @@ The plugin integrates with the core system via lifecycle events: `setup` | [CoreSetup](./kibana-plugin-core-server.coresetup.md) | Context passed to the plugins setup method. | | [CoreStart](./kibana-plugin-core-server.corestart.md) | Context passed to the plugins start method. | | [CoreStatus](./kibana-plugin-core-server.corestatus.md) | Status of core services. | +| [CountResponse](./kibana-plugin-core-server.countresponse.md) | | | [CustomHttpResponseOptions](./kibana-plugin-core-server.customhttpresponseoptions.md) | HTTP response parameters for a response with adjustable status code. | +| [DeleteDocumentResponse](./kibana-plugin-core-server.deletedocumentresponse.md) | | | [DeprecationAPIClientParams](./kibana-plugin-core-server.deprecationapiclientparams.md) | | | [DeprecationAPIResponse](./kibana-plugin-core-server.deprecationapiresponse.md) | | | [DeprecationInfo](./kibana-plugin-core-server.deprecationinfo.md) | | @@ -85,7 +87,9 @@ The plugin integrates with the core system via lifecycle events: `setup` | [ElasticsearchStatusMeta](./kibana-plugin-core-server.elasticsearchstatusmeta.md) | | | [EnvironmentMode](./kibana-plugin-core-server.environmentmode.md) | | | [ErrorHttpResponseOptions](./kibana-plugin-core-server.errorhttpresponseoptions.md) | HTTP response parameters | +| [Explanation](./kibana-plugin-core-server.explanation.md) | | | [FakeRequest](./kibana-plugin-core-server.fakerequest.md) | Fake request object created manually by Kibana plugins. | +| [GetResponse](./kibana-plugin-core-server.getresponse.md) | | | [HttpAuth](./kibana-plugin-core-server.httpauth.md) | | | [HttpResources](./kibana-plugin-core-server.httpresources.md) | HttpResources service is responsible for serving static & dynamic assets for Kibana application via HTTP. Provides API allowing plug-ins to respond with: - a pre-configured HTML page bootstrapping Kibana client app - custom HTML page - custom JS script file. | | [HttpResourcesRenderOptions](./kibana-plugin-core-server.httpresourcesrenderoptions.md) | Allows to configure HTTP response parameters | @@ -189,11 +193,14 @@ The plugin integrates with the core system via lifecycle events: `setup` | [SavedObjectsTypeMappingDefinition](./kibana-plugin-core-server.savedobjectstypemappingdefinition.md) | Describe a saved object type mapping. | | [SavedObjectsUpdateOptions](./kibana-plugin-core-server.savedobjectsupdateoptions.md) | | | [SavedObjectsUpdateResponse](./kibana-plugin-core-server.savedobjectsupdateresponse.md) | | +| [SearchResponse](./kibana-plugin-core-server.searchresponse.md) | | | [ServiceStatus](./kibana-plugin-core-server.servicestatus.md) | The current status of a service at a point in time. | | [SessionCookieValidationResult](./kibana-plugin-core-server.sessioncookievalidationresult.md) | Return type from a function to validate cookie contents. | | [SessionStorage](./kibana-plugin-core-server.sessionstorage.md) | Provides an interface to store and retrieve data across requests. | | [SessionStorageCookieOptions](./kibana-plugin-core-server.sessionstoragecookieoptions.md) | Configuration used to create HTTP session storage based on top of cookie mechanism. | | [SessionStorageFactory](./kibana-plugin-core-server.sessionstoragefactory.md) | SessionStorage factory to bind one to an incoming request | +| [ShardsInfo](./kibana-plugin-core-server.shardsinfo.md) | | +| [ShardsResponse](./kibana-plugin-core-server.shardsresponse.md) | | | [StatusServiceSetup](./kibana-plugin-core-server.statusservicesetup.md) | API for accessing status of Core and this plugin's dependencies as well as for customizing this plugin's status. | | [StringValidationRegex](./kibana-plugin-core-server.stringvalidationregex.md) | StringValidation with regex object | | [StringValidationRegexString](./kibana-plugin-core-server.stringvalidationregexstring.md) | StringValidation as regex string | @@ -228,6 +235,7 @@ The plugin integrates with the core system via lifecycle events: `setup` | [ConfigDeprecationProvider](./kibana-plugin-core-server.configdeprecationprovider.md) | A provider that should returns a list of [ConfigDeprecation](./kibana-plugin-core-server.configdeprecation.md).See [ConfigDeprecationFactory](./kibana-plugin-core-server.configdeprecationfactory.md) for more usage examples. | | [ConfigPath](./kibana-plugin-core-server.configpath.md) | | | [DestructiveRouteMethod](./kibana-plugin-core-server.destructiveroutemethod.md) | Set of HTTP methods changing the state of the server. | +| [ElasticsearchClient](./kibana-plugin-core-server.elasticsearchclient.md) | Client used to query the elasticsearch cluster. | | [Freezable](./kibana-plugin-core-server.freezable.md) | | | [GetAuthHeaders](./kibana-plugin-core-server.getauthheaders.md) | Get headers to authenticate a user against Elasticsearch. | | [GetAuthState](./kibana-plugin-core-server.getauthstate.md) | Gets authentication state for a request. Returned by auth interceptor. | diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectsdeletebynamespaceoptions.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectsdeletebynamespaceoptions.md index 3fac0d889c6ce..ba81a3e8c32d0 100644 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectsdeletebynamespaceoptions.md +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectsdeletebynamespaceoptions.md @@ -15,5 +15,5 @@ export interface SavedObjectsDeleteByNamespaceOptions extends SavedObjectsBaseOp | Property | Type | Description | | --- | --- | --- | -| [refresh](./kibana-plugin-core-server.savedobjectsdeletebynamespaceoptions.refresh.md) | MutatingOperationRefreshSetting | The Elasticsearch Refresh setting for this operation | +| [refresh](./kibana-plugin-core-server.savedobjectsdeletebynamespaceoptions.refresh.md) | boolean | The Elasticsearch supports only boolean flag for this operation | diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectsdeletebynamespaceoptions.refresh.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectsdeletebynamespaceoptions.refresh.md index c67866a5553a0..52b562e8e22b7 100644 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectsdeletebynamespaceoptions.refresh.md +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectsdeletebynamespaceoptions.refresh.md @@ -4,10 +4,10 @@ ## SavedObjectsDeleteByNamespaceOptions.refresh property -The Elasticsearch Refresh setting for this operation +The Elasticsearch supports only boolean flag for this operation Signature: ```typescript -refresh?: MutatingOperationRefreshSetting; +refresh?: boolean; ``` diff --git a/docs/development/core/server/kibana-plugin-core-server.searchresponse._scroll_id.md b/docs/development/core/server/kibana-plugin-core-server.searchresponse._scroll_id.md new file mode 100644 index 0000000000000..a9dd0e76475fd --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.searchresponse._scroll_id.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SearchResponse](./kibana-plugin-core-server.searchresponse.md) > [\_scroll\_id](./kibana-plugin-core-server.searchresponse._scroll_id.md) + +## SearchResponse.\_scroll\_id property + +Signature: + +```typescript +_scroll_id?: string; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.searchresponse._shards.md b/docs/development/core/server/kibana-plugin-core-server.searchresponse._shards.md new file mode 100644 index 0000000000000..e090ad20e8bc8 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.searchresponse._shards.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SearchResponse](./kibana-plugin-core-server.searchresponse.md) > [\_shards](./kibana-plugin-core-server.searchresponse._shards.md) + +## SearchResponse.\_shards property + +Signature: + +```typescript +_shards: ShardsResponse; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.searchresponse.aggregations.md b/docs/development/core/server/kibana-plugin-core-server.searchresponse.aggregations.md new file mode 100644 index 0000000000000..686e6f2aa05e9 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.searchresponse.aggregations.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SearchResponse](./kibana-plugin-core-server.searchresponse.md) > [aggregations](./kibana-plugin-core-server.searchresponse.aggregations.md) + +## SearchResponse.aggregations property + +Signature: + +```typescript +aggregations?: any; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.searchresponse.hits.md b/docs/development/core/server/kibana-plugin-core-server.searchresponse.hits.md new file mode 100644 index 0000000000000..1629e77425525 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.searchresponse.hits.md @@ -0,0 +1,28 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SearchResponse](./kibana-plugin-core-server.searchresponse.md) > [hits](./kibana-plugin-core-server.searchresponse.hits.md) + +## SearchResponse.hits property + +Signature: + +```typescript +hits: { + total: number; + max_score: number; + hits: Array<{ + _index: string; + _type: string; + _id: string; + _score: number; + _source: T; + _version?: number; + _explanation?: Explanation; + fields?: any; + highlight?: any; + inner_hits?: any; + matched_queries?: string[]; + sort?: string[]; + }>; + }; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.searchresponse.md b/docs/development/core/server/kibana-plugin-core-server.searchresponse.md new file mode 100644 index 0000000000000..b53cbf0d87f24 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.searchresponse.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SearchResponse](./kibana-plugin-core-server.searchresponse.md) + +## SearchResponse interface + + +Signature: + +```typescript +export interface SearchResponse +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [\_scroll\_id](./kibana-plugin-core-server.searchresponse._scroll_id.md) | string | | +| [\_shards](./kibana-plugin-core-server.searchresponse._shards.md) | ShardsResponse | | +| [aggregations](./kibana-plugin-core-server.searchresponse.aggregations.md) | any | | +| [hits](./kibana-plugin-core-server.searchresponse.hits.md) | {
      total: number;
      max_score: number;
      hits: Array<{
      _index: string;
      _type: string;
      _id: string;
      _score: number;
      _source: T;
      _version?: number;
      _explanation?: Explanation;
      fields?: any;
      highlight?: any;
      inner_hits?: any;
      matched_queries?: string[];
      sort?: string[];
      }>;
      } | | +| [timed\_out](./kibana-plugin-core-server.searchresponse.timed_out.md) | boolean | | +| [took](./kibana-plugin-core-server.searchresponse.took.md) | number | | + diff --git a/docs/development/core/server/kibana-plugin-core-server.searchresponse.timed_out.md b/docs/development/core/server/kibana-plugin-core-server.searchresponse.timed_out.md new file mode 100644 index 0000000000000..a3488117cd874 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.searchresponse.timed_out.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SearchResponse](./kibana-plugin-core-server.searchresponse.md) > [timed\_out](./kibana-plugin-core-server.searchresponse.timed_out.md) + +## SearchResponse.timed\_out property + +Signature: + +```typescript +timed_out: boolean; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.searchresponse.took.md b/docs/development/core/server/kibana-plugin-core-server.searchresponse.took.md new file mode 100644 index 0000000000000..8c9c0b0f7c420 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.searchresponse.took.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SearchResponse](./kibana-plugin-core-server.searchresponse.md) > [took](./kibana-plugin-core-server.searchresponse.took.md) + +## SearchResponse.took property + +Signature: + +```typescript +took: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.shardsinfo.failed.md b/docs/development/core/server/kibana-plugin-core-server.shardsinfo.failed.md new file mode 100644 index 0000000000000..a47fc1263be41 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.shardsinfo.failed.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ShardsInfo](./kibana-plugin-core-server.shardsinfo.md) > [failed](./kibana-plugin-core-server.shardsinfo.failed.md) + +## ShardsInfo.failed property + +Signature: + +```typescript +failed: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.shardsinfo.md b/docs/development/core/server/kibana-plugin-core-server.shardsinfo.md new file mode 100644 index 0000000000000..9eafe3792c14a --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.shardsinfo.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ShardsInfo](./kibana-plugin-core-server.shardsinfo.md) + +## ShardsInfo interface + + +Signature: + +```typescript +export interface ShardsInfo +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [failed](./kibana-plugin-core-server.shardsinfo.failed.md) | number | | +| [skipped](./kibana-plugin-core-server.shardsinfo.skipped.md) | number | | +| [successful](./kibana-plugin-core-server.shardsinfo.successful.md) | number | | +| [total](./kibana-plugin-core-server.shardsinfo.total.md) | number | | + diff --git a/docs/development/core/server/kibana-plugin-core-server.shardsinfo.skipped.md b/docs/development/core/server/kibana-plugin-core-server.shardsinfo.skipped.md new file mode 100644 index 0000000000000..0c87831edd6ca --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.shardsinfo.skipped.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ShardsInfo](./kibana-plugin-core-server.shardsinfo.md) > [skipped](./kibana-plugin-core-server.shardsinfo.skipped.md) + +## ShardsInfo.skipped property + +Signature: + +```typescript +skipped: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.shardsinfo.successful.md b/docs/development/core/server/kibana-plugin-core-server.shardsinfo.successful.md new file mode 100644 index 0000000000000..c927adb39932a --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.shardsinfo.successful.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ShardsInfo](./kibana-plugin-core-server.shardsinfo.md) > [successful](./kibana-plugin-core-server.shardsinfo.successful.md) + +## ShardsInfo.successful property + +Signature: + +```typescript +successful: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.shardsinfo.total.md b/docs/development/core/server/kibana-plugin-core-server.shardsinfo.total.md new file mode 100644 index 0000000000000..820c8a70fd222 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.shardsinfo.total.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ShardsInfo](./kibana-plugin-core-server.shardsinfo.md) > [total](./kibana-plugin-core-server.shardsinfo.total.md) + +## ShardsInfo.total property + +Signature: + +```typescript +total: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.shardsresponse.failed.md b/docs/development/core/server/kibana-plugin-core-server.shardsresponse.failed.md new file mode 100644 index 0000000000000..7f7a173af2e58 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.shardsresponse.failed.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ShardsResponse](./kibana-plugin-core-server.shardsresponse.md) > [failed](./kibana-plugin-core-server.shardsresponse.failed.md) + +## ShardsResponse.failed property + +Signature: + +```typescript +failed: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.shardsresponse.md b/docs/development/core/server/kibana-plugin-core-server.shardsresponse.md new file mode 100644 index 0000000000000..722ffd8efdb57 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.shardsresponse.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ShardsResponse](./kibana-plugin-core-server.shardsresponse.md) + +## ShardsResponse interface + + +Signature: + +```typescript +export interface ShardsResponse +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [failed](./kibana-plugin-core-server.shardsresponse.failed.md) | number | | +| [skipped](./kibana-plugin-core-server.shardsresponse.skipped.md) | number | | +| [successful](./kibana-plugin-core-server.shardsresponse.successful.md) | number | | +| [total](./kibana-plugin-core-server.shardsresponse.total.md) | number | | + diff --git a/docs/development/core/server/kibana-plugin-core-server.shardsresponse.skipped.md b/docs/development/core/server/kibana-plugin-core-server.shardsresponse.skipped.md new file mode 100644 index 0000000000000..b01c3501fe022 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.shardsresponse.skipped.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ShardsResponse](./kibana-plugin-core-server.shardsresponse.md) > [skipped](./kibana-plugin-core-server.shardsresponse.skipped.md) + +## ShardsResponse.skipped property + +Signature: + +```typescript +skipped: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.shardsresponse.successful.md b/docs/development/core/server/kibana-plugin-core-server.shardsresponse.successful.md new file mode 100644 index 0000000000000..23c6ff0519ed7 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.shardsresponse.successful.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ShardsResponse](./kibana-plugin-core-server.shardsresponse.md) > [successful](./kibana-plugin-core-server.shardsresponse.successful.md) + +## ShardsResponse.successful property + +Signature: + +```typescript +successful: number; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.shardsresponse.total.md b/docs/development/core/server/kibana-plugin-core-server.shardsresponse.total.md new file mode 100644 index 0000000000000..e669f6216a10f --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.shardsresponse.total.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ShardsResponse](./kibana-plugin-core-server.shardsresponse.md) > [total](./kibana-plugin-core-server.shardsresponse.total.md) + +## ShardsResponse.total property + +Signature: + +```typescript +total: number; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchsetup.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchsetup.md index 3afba80064f08..d9749bc44f45a 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchsetup.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchsetup.md @@ -14,6 +14,6 @@ export interface ISearchSetup | Property | Type | Description | | --- | --- | --- | -| [registerSearchStrategy](./kibana-plugin-plugins-data-server.isearchsetup.registersearchstrategy.md) | TRegisterSearchStrategy | Extension point exposed for other plugins to register their own search strategies. | +| [registerSearchStrategy](./kibana-plugin-plugins-data-server.isearchsetup.registersearchstrategy.md) | (name: string, strategy: ISearchStrategy) => void | Extension point exposed for other plugins to register their own search strategies. | | [usage](./kibana-plugin-plugins-data-server.isearchsetup.usage.md) | SearchUsage | Used internally for telemetry | diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md index c811209dfa80f..9b421e0172df0 100644 --- a/src/core/public/public.api.md +++ b/src/core/public/public.api.md @@ -5,147 +5,35 @@ ```ts import { Action } from 'history'; +import { ApiResponse } from '@elastic/elasticsearch/lib/Transport'; import Boom from 'boom'; -import { BulkIndexDocumentsParams } from 'elasticsearch'; -import { CatAliasesParams } from 'elasticsearch'; -import { CatAllocationParams } from 'elasticsearch'; -import { CatCommonParams } from 'elasticsearch'; -import { CatFielddataParams } from 'elasticsearch'; -import { CatHealthParams } from 'elasticsearch'; -import { CatHelpParams } from 'elasticsearch'; -import { CatIndicesParams } from 'elasticsearch'; -import { CatRecoveryParams } from 'elasticsearch'; -import { CatSegmentsParams } from 'elasticsearch'; -import { CatShardsParams } from 'elasticsearch'; -import { CatSnapshotsParams } from 'elasticsearch'; -import { CatTasksParams } from 'elasticsearch'; -import { CatThreadPoolParams } from 'elasticsearch'; -import { ClearScrollParams } from 'elasticsearch'; -import { Client } from 'elasticsearch'; -import { ClusterAllocationExplainParams } from 'elasticsearch'; -import { ClusterGetSettingsParams } from 'elasticsearch'; -import { ClusterHealthParams } from 'elasticsearch'; -import { ClusterPendingTasksParams } from 'elasticsearch'; -import { ClusterPutSettingsParams } from 'elasticsearch'; -import { ClusterRerouteParams } from 'elasticsearch'; -import { ClusterStateParams } from 'elasticsearch'; -import { ClusterStatsParams } from 'elasticsearch'; -import { CountParams } from 'elasticsearch'; -import { CreateDocumentParams } from 'elasticsearch'; -import { DeleteDocumentByQueryParams } from 'elasticsearch'; -import { DeleteDocumentParams } from 'elasticsearch'; -import { DeleteScriptParams } from 'elasticsearch'; -import { DeleteTemplateParams } from 'elasticsearch'; import { EuiBreadcrumb } from '@elastic/eui'; import { EuiButtonEmptyProps } from '@elastic/eui'; import { EuiConfirmModalProps } from '@elastic/eui'; import { EuiGlobalToastListToast } from '@elastic/eui'; import { ExclusiveUnion } from '@elastic/eui'; -import { ExistsParams } from 'elasticsearch'; -import { ExplainParams } from 'elasticsearch'; -import { FieldStatsParams } from 'elasticsearch'; -import { GenericParams } from 'elasticsearch'; -import { GetParams } from 'elasticsearch'; -import { GetResponse } from 'elasticsearch'; -import { GetScriptParams } from 'elasticsearch'; -import { GetSourceParams } from 'elasticsearch'; -import { GetTemplateParams } from 'elasticsearch'; import { History } from 'history'; import { Href } from 'history'; import { IconType } from '@elastic/eui'; -import { IndexDocumentParams } from 'elasticsearch'; -import { IndicesAnalyzeParams } from 'elasticsearch'; -import { IndicesClearCacheParams } from 'elasticsearch'; -import { IndicesCloseParams } from 'elasticsearch'; -import { IndicesCreateParams } from 'elasticsearch'; -import { IndicesDeleteAliasParams } from 'elasticsearch'; -import { IndicesDeleteParams } from 'elasticsearch'; -import { IndicesDeleteTemplateParams } from 'elasticsearch'; -import { IndicesExistsAliasParams } from 'elasticsearch'; -import { IndicesExistsParams } from 'elasticsearch'; -import { IndicesExistsTemplateParams } from 'elasticsearch'; -import { IndicesExistsTypeParams } from 'elasticsearch'; -import { IndicesFlushParams } from 'elasticsearch'; -import { IndicesFlushSyncedParams } from 'elasticsearch'; -import { IndicesForcemergeParams } from 'elasticsearch'; -import { IndicesGetAliasParams } from 'elasticsearch'; -import { IndicesGetFieldMappingParams } from 'elasticsearch'; -import { IndicesGetMappingParams } from 'elasticsearch'; -import { IndicesGetParams } from 'elasticsearch'; -import { IndicesGetSettingsParams } from 'elasticsearch'; -import { IndicesGetTemplateParams } from 'elasticsearch'; -import { IndicesGetUpgradeParams } from 'elasticsearch'; -import { IndicesOpenParams } from 'elasticsearch'; -import { IndicesPutAliasParams } from 'elasticsearch'; -import { IndicesPutMappingParams } from 'elasticsearch'; -import { IndicesPutSettingsParams } from 'elasticsearch'; -import { IndicesPutTemplateParams } from 'elasticsearch'; -import { IndicesRecoveryParams } from 'elasticsearch'; -import { IndicesRefreshParams } from 'elasticsearch'; -import { IndicesRolloverParams } from 'elasticsearch'; -import { IndicesSegmentsParams } from 'elasticsearch'; -import { IndicesShardStoresParams } from 'elasticsearch'; -import { IndicesShrinkParams } from 'elasticsearch'; -import { IndicesStatsParams } from 'elasticsearch'; -import { IndicesUpdateAliasesParams } from 'elasticsearch'; -import { IndicesUpgradeParams } from 'elasticsearch'; -import { IndicesValidateQueryParams } from 'elasticsearch'; -import { InfoParams } from 'elasticsearch'; -import { IngestDeletePipelineParams } from 'elasticsearch'; -import { IngestGetPipelineParams } from 'elasticsearch'; -import { IngestPutPipelineParams } from 'elasticsearch'; -import { IngestSimulateParams } from 'elasticsearch'; +import { KibanaClient } from '@elastic/elasticsearch/api/kibana'; import { KibanaConfigType } from 'src/core/server/kibana_config'; import { Location } from 'history'; import { LocationDescriptorObject } from 'history'; import { MaybePromise } from '@kbn/utility-types'; -import { MGetParams } from 'elasticsearch'; -import { MGetResponse } from 'elasticsearch'; -import { MSearchParams } from 'elasticsearch'; -import { MSearchResponse } from 'elasticsearch'; -import { MSearchTemplateParams } from 'elasticsearch'; -import { MTermVectorsParams } from 'elasticsearch'; -import { NodesHotThreadsParams } from 'elasticsearch'; -import { NodesInfoParams } from 'elasticsearch'; -import { NodesStatsParams } from 'elasticsearch'; import { Observable } from 'rxjs'; import { ParsedQuery } from 'query-string'; import { Path } from 'history'; -import { PingParams } from 'elasticsearch'; import { PublicUiSettingsParams as PublicUiSettingsParams_2 } from 'src/core/server/types'; -import { PutScriptParams } from 'elasticsearch'; -import { PutTemplateParams } from 'elasticsearch'; import React from 'react'; import { RecursiveReadonly } from '@kbn/utility-types'; -import { ReindexParams } from 'elasticsearch'; -import { ReindexRethrottleParams } from 'elasticsearch'; -import { RenderSearchTemplateParams } from 'elasticsearch'; import * as Rx from 'rxjs'; -import { ScrollParams } from 'elasticsearch'; -import { SearchParams } from 'elasticsearch'; -import { SearchResponse } from 'elasticsearch'; -import { SearchShardsParams } from 'elasticsearch'; -import { SearchTemplateParams } from 'elasticsearch'; import { ShallowPromise } from '@kbn/utility-types'; -import { SnapshotCreateParams } from 'elasticsearch'; -import { SnapshotCreateRepositoryParams } from 'elasticsearch'; -import { SnapshotDeleteParams } from 'elasticsearch'; -import { SnapshotDeleteRepositoryParams } from 'elasticsearch'; -import { SnapshotGetParams } from 'elasticsearch'; -import { SnapshotGetRepositoryParams } from 'elasticsearch'; -import { SnapshotRestoreParams } from 'elasticsearch'; -import { SnapshotStatusParams } from 'elasticsearch'; -import { SnapshotVerifyRepositoryParams } from 'elasticsearch'; -import { SuggestParams } from 'elasticsearch'; -import { TasksCancelParams } from 'elasticsearch'; -import { TasksGetParams } from 'elasticsearch'; -import { TasksListParams } from 'elasticsearch'; -import { TermvectorsParams } from 'elasticsearch'; +import { TransportRequestOptions } from '@elastic/elasticsearch/lib/Transport'; +import { TransportRequestParams } from '@elastic/elasticsearch/lib/Transport'; +import { TransportRequestPromise } from '@elastic/elasticsearch/lib/Transport'; import { Type } from '@kbn/config-schema'; import { TypeOf } from '@kbn/config-schema'; import { UnregisterCallback } from 'history'; -import { UpdateDocumentByQueryParams } from 'elasticsearch'; -import { UpdateDocumentParams } from 'elasticsearch'; import { UserProvidedValues as UserProvidedValues_2 } from 'src/core/server/types'; // @internal (undocumented) diff --git a/src/core/server/elasticsearch/client/types.ts b/src/core/server/elasticsearch/client/types.ts index 285f52e89a591..827b185672c7c 100644 --- a/src/core/server/elasticsearch/client/types.ts +++ b/src/core/server/elasticsearch/client/types.ts @@ -42,34 +42,50 @@ export type ElasticsearchClient = Omit< }; }; -interface ShardsResponse { +/** + * All response typings are maintained until elasticsearch-js provides them out of the box + * https://github.com/elastic/elasticsearch-js/pull/970 + */ + +/** + * @public + */ +export interface ShardsResponse { total: number; successful: number; failed: number; skipped: number; } -interface Explanation { +/** + * @public + */ +export interface Explanation { value: number; description: string; details: Explanation[]; } -interface ShardsInfo { +/** + * @public + */ +export interface ShardsInfo { total: number; successful: number; skipped: number; failed: number; } +/** + * @public + */ export interface CountResponse { _shards: ShardsInfo; count: number; } /** - * Maintained until elasticsearch provides response typings out of the box - * https://github.com/elastic/elasticsearch-js/pull/970 + * @public */ export interface SearchResponse { took: number; @@ -97,6 +113,9 @@ export interface SearchResponse { aggregations?: any; } +/** + * @public + */ export interface GetResponse { _index: string; _type: string; @@ -109,6 +128,9 @@ export interface GetResponse { _primary_term: number; } +/** + * @public + */ export interface DeleteDocumentResponse { _shards: ShardsResponse; found: boolean; diff --git a/src/core/server/elasticsearch/index.ts b/src/core/server/elasticsearch/index.ts index 32be6e6bf34dd..9359b88434396 100644 --- a/src/core/server/elasticsearch/index.ts +++ b/src/core/server/elasticsearch/index.ts @@ -36,8 +36,12 @@ export { ElasticsearchClientConfig, ElasticsearchClient, IScopedClusterClient, + // responses SearchResponse, + CountResponse, + ShardsInfo, + ShardsResponse, + Explanation, GetResponse, DeleteDocumentResponse, - CountResponse, } from './client'; diff --git a/src/core/server/index.ts b/src/core/server/index.ts index c846e81573acb..f46b41d6b8793 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -110,6 +110,13 @@ export { FakeRequest, ScopeableRequest, ElasticsearchClient, + SearchResponse, + CountResponse, + ShardsInfo, + ShardsResponse, + Explanation, + GetResponse, + DeleteDocumentResponse, } from './elasticsearch'; export * from './elasticsearch/legacy/api_types'; export { diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index 4b6bcbc8ad7a0..bb4f2f30ac18f 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -45,7 +45,7 @@ import { ExplainParams } from 'elasticsearch'; import { FieldStatsParams } from 'elasticsearch'; import { GenericParams } from 'elasticsearch'; import { GetParams } from 'elasticsearch'; -import { GetResponse } from 'elasticsearch'; +import { GetResponse as GetResponse_2 } from 'elasticsearch'; import { GetScriptParams } from 'elasticsearch'; import { GetSourceParams } from 'elasticsearch'; import { GetTemplateParams } from 'elasticsearch'; @@ -121,7 +121,7 @@ import { ResponseToolkit } from 'hapi'; import { SchemaTypeError } from '@kbn/config-schema'; import { ScrollParams } from 'elasticsearch'; import { SearchParams } from 'elasticsearch'; -import { SearchResponse } from 'elasticsearch'; +import { SearchResponse as SearchResponse_2 } from 'elasticsearch'; import { SearchShardsParams } from 'elasticsearch'; import { SearchTemplateParams } from 'elasticsearch'; import { Server } from 'hapi'; @@ -532,6 +532,14 @@ export interface CoreStatus { savedObjects: ServiceStatus; } +// @public (undocumented) +export interface CountResponse { + // (undocumented) + count: number; + // (undocumented) + _shards: ShardsInfo; +} + // @public export class CspConfig implements ICspConfig { // @internal @@ -592,6 +600,28 @@ export const DEFAULT_APP_CATEGORIES: Readonly<{ }; }>; +// @public (undocumented) +export interface DeleteDocumentResponse { + // (undocumented) + error?: { + type: string; + }; + // (undocumented) + found: boolean; + // (undocumented) + _id: string; + // (undocumented) + _index: string; + // (undocumented) + result: string; + // (undocumented) + _shards: ShardsResponse; + // (undocumented) + _type: string; + // (undocumented) + _version: number; +} + // @public (undocumented) export interface DeprecationAPIClientParams extends GenericParams { // (undocumented) @@ -642,6 +672,13 @@ export interface DiscoveredPlugin { readonly requiredPlugins: readonly PluginName[]; } +// @public +export type ElasticsearchClient = Omit & { + transport: { + request(params: TransportRequestParams, options?: TransportRequestOptions): TransportRequestPromise; + }; +}; + // @public export class ElasticsearchConfig { constructor(rawConfig: ElasticsearchConfigType); @@ -709,6 +746,16 @@ export interface ErrorHttpResponseOptions { headers?: ResponseHeaders; } +// @public (undocumented) +export interface Explanation { + // (undocumented) + description: string; + // (undocumented) + details: Explanation[]; + // (undocumented) + value: number; +} + // @public export function exportSavedObjectsToStream({ types, objects, search, savedObjectsClient, exportSizeLimit, includeReferencesDeep, excludeExportDetails, namespace, }: SavedObjectsExportOptions): Promise; @@ -736,6 +783,28 @@ export function getFlattenedObject(rootValue: Record): { [key: string]: any; }; +// @public (undocumented) +export interface GetResponse { + // (undocumented) + found: boolean; + // (undocumented) + _id: string; + // (undocumented) + _index: string; + // (undocumented) + _primary_term: number; + // (undocumented) + _routing?: string; + // (undocumented) + _seq_no: number; + // (undocumented) + _source: T; + // (undocumented) + _type: string; + // (undocumented) + _version: number; +} + // @public export type HandlerContextType> = T extends HandlerFunction ? U : never; @@ -1042,7 +1111,7 @@ export interface LegacyAPICaller { // (undocumented) (endpoint: 'fieldStats', params: FieldStatsParams, options?: LegacyCallAPIOptions): ReturnType; // (undocumented) - (endpoint: 'get', params: GetParams, options?: LegacyCallAPIOptions): Promise>; + (endpoint: 'get', params: GetParams, options?: LegacyCallAPIOptions): Promise>; // (undocumented) (endpoint: 'getScript', params: GetScriptParams, options?: LegacyCallAPIOptions): ReturnType; // (undocumented) @@ -1074,9 +1143,9 @@ export interface LegacyAPICaller { // (undocumented) (endpoint: 'renderSearchTemplate', params: RenderSearchTemplateParams, options?: LegacyCallAPIOptions): ReturnType; // (undocumented) - (endpoint: 'scroll', params: ScrollParams, options?: LegacyCallAPIOptions): Promise>; + (endpoint: 'scroll', params: ScrollParams, options?: LegacyCallAPIOptions): Promise>; // (undocumented) - (endpoint: 'search', params: SearchParams, options?: LegacyCallAPIOptions): Promise>; + (endpoint: 'search', params: SearchParams, options?: LegacyCallAPIOptions): Promise>; // (undocumented) (endpoint: 'searchShards', params: SearchShardsParams, options?: LegacyCallAPIOptions): ReturnType; // (undocumented) @@ -2082,7 +2151,7 @@ export interface SavedObjectsCreateOptions extends SavedObjectsBaseOptions { // @public (undocumented) export interface SavedObjectsDeleteByNamespaceOptions extends SavedObjectsBaseOptions { - refresh?: MutatingOperationRefreshSetting; + refresh?: boolean; } // @public (undocumented) @@ -2396,7 +2465,7 @@ export class SavedObjectsRepository { // Warning: (ae-forgotten-export) The symbol "KibanaMigrator" needs to be exported by the entry point index.d.ts // // @internal - static createRepository(migrator: KibanaMigrator, typeRegistry: SavedObjectTypeRegistry, indexName: string, callCluster: LegacyAPICaller, includedHiddenTypes?: string[], injectedConstructor?: any): ISavedObjectsRepository; + static createRepository(migrator: KibanaMigrator, typeRegistry: SavedObjectTypeRegistry, indexName: string, client: ElasticsearchClient, includedHiddenTypes?: string[], injectedConstructor?: any): ISavedObjectsRepository; delete(type: string, id: string, options?: SavedObjectsDeleteOptions): Promise<{}>; deleteByNamespace(namespace: string, options?: SavedObjectsDeleteByNamespaceOptions): Promise; deleteFromNamespaces(type: string, id: string, namespaces: string[], options?: SavedObjectsDeleteFromNamespacesOptions): Promise<{}>; @@ -2412,7 +2481,7 @@ export class SavedObjectsRepository { attributes: any; }>; update(type: string, id: string, attributes: Partial, options?: SavedObjectsUpdateOptions): Promise>; - } +} // @public export interface SavedObjectsRepositoryFactory { @@ -2552,6 +2621,39 @@ export type SavedObjectUnsanitizedDoc = SavedObjectDoc & Partial // @public export type ScopeableRequest = KibanaRequest | LegacyRequest | FakeRequest; +// @public (undocumented) +export interface SearchResponse { + // (undocumented) + aggregations?: any; + // (undocumented) + hits: { + total: number; + max_score: number; + hits: Array<{ + _index: string; + _type: string; + _id: string; + _score: number; + _source: T; + _version?: number; + _explanation?: Explanation; + fields?: any; + highlight?: any; + inner_hits?: any; + matched_queries?: string[]; + sort?: string[]; + }>; + }; + // (undocumented) + _scroll_id?: string; + // (undocumented) + _shards: ShardsResponse; + // (undocumented) + timed_out: boolean; + // (undocumented) + took: number; +} + // @public export interface ServiceStatus | unknown = unknown> { detail?: string; @@ -2612,6 +2714,30 @@ export interface SessionStorageFactory { asScoped: (request: KibanaRequest) => SessionStorage; } +// @public (undocumented) +export interface ShardsInfo { + // (undocumented) + failed: number; + // (undocumented) + skipped: number; + // (undocumented) + successful: number; + // (undocumented) + total: number; +} + +// @public (undocumented) +export interface ShardsResponse { + // (undocumented) + failed: number; + // (undocumented) + skipped: number; + // (undocumented) + successful: number; + // (undocumented) + total: number; +} + // @public (undocumented) export type SharedGlobalConfig = RecursiveReadonly<{ kibana: Pick; diff --git a/src/dev/run_check_published_api_changes.ts b/src/dev/run_check_published_api_changes.ts index 0aa450c8b002a..28e8570812915 100644 --- a/src/dev/run_check_published_api_changes.ts +++ b/src/dev/run_check_published_api_changes.ts @@ -17,8 +17,6 @@ * under the License. */ -/* eslint-disable no-console */ - import { ToolingLog } from '@kbn/dev-utils'; import { Extractor, @@ -35,6 +33,11 @@ import fs from 'fs'; import path from 'path'; import getopts from 'getopts'; +const log = new ToolingLog({ + level: 'info', + writeTo: process.stdout, +}); + /* * Step 1: execute build:types * This users tsconfig.types.json to generate types in `target/types` @@ -92,13 +95,13 @@ const apiExtractorConfig = (folder: string): ExtractorConfig => { }, }, }; - const con = ExtractorConfig.prepare({ + const cfg = ExtractorConfig.prepare({ configObject: config, configObjectFullPath: undefined, packageJsonFullPath: path.resolve('package.json'), }); - return con; + return cfg; }; const runBuildTypes = async () => { @@ -108,7 +111,7 @@ const runBuildTypes = async () => { const runApiDocumenter = async (folder: string) => { const sourceFolder = `./build/${folder}`; const targetFolder = `./docs/development/${folder}`; - console.log(`Generating docs from ${sourceFolder} into ${targetFolder}...`); + log.info(`Generating docs from ${sourceFolder} into ${targetFolder}...`); await execa('api-documenter', ['generate', '-i', sourceFolder, '-o', targetFolder], { preferLocal: true, }); @@ -117,7 +120,7 @@ const runApiDocumenter = async (folder: string) => { const renameExtractedApiPackageName = async (folder: string) => { const fname = getReportFileName(folder); const jsonApiFile = `build/${folder}/${fname}.api.json`; - console.log(`Updating ${jsonApiFile}...`); + log.info(`Updating ${jsonApiFile}...`); const json = JSON.parse(fs.readFileSync(jsonApiFile).toString()); json.name = json.canonicalReference = `kibana-plugin-${folder.replace(/\//g, '-')}`; fs.writeFileSync(jsonApiFile, JSON.stringify(json, null, 2)); @@ -127,11 +130,7 @@ const renameExtractedApiPackageName = async (folder: string) => { * Runs api-extractor with a custom logger in order to extract results from the process * */ -const runApiExtractor = ( - log: ToolingLog, - folder: string, - acceptChanges: boolean = false -): ExtractorResult => { +const runApiExtractor = (folder: string, acceptChanges: boolean = false): ExtractorResult => { const config = apiExtractorConfig(folder); const options = { // Indicates that API Extractor is running as part of a local build, @@ -177,13 +176,10 @@ interface Options { filter: string; } -async function run( - folder: string, - { log, opts }: { log: ToolingLog; opts: Options } -): Promise { +async function run(folder: string, { opts }: { opts: Options }): Promise { log.info(`${folder} API: checking for changes in API signature...`); - const { apiReportChanged, succeeded } = runApiExtractor(log, folder, opts.accept); + const { apiReportChanged, succeeded } = runApiExtractor(folder, opts.accept); // If we're not accepting changes and there's a failure, exit. if (!opts.accept && !succeeded) { @@ -209,11 +205,6 @@ async function run( } (async () => { - const log = new ToolingLog({ - level: 'info', - writeTo: process.stdout, - }); - const extraFlags: string[] = []; const opts = (getopts(process.argv.slice(2), { boolean: ['accept', 'docs', 'help'], @@ -276,26 +267,22 @@ async function run( return !(extraFlags.length > 0); } - try { - log.info(`Building types for api extractor...`); - await runBuildTypes(); - } catch (e) { - log.error(e); - return false; - } + log.info('Building types for api extractor...'); + await runBuildTypes(); + log.info('Types for api extractor has been built'); const filteredFolders = folders.filter((folder) => opts.filter.length ? folder.match(opts.filter) : true ); const results = []; for (const folder of filteredFolders) { - results.push(await run(folder, { log, opts })); + results.push(await run(folder, { opts })); } if (results.includes(false)) { process.exitCode = 1; } })().catch((e) => { - console.log(e); + log.error(e); process.exitCode = 1; }); diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 65670bc1cf83e..2b904ed9536e0 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -7,44 +7,15 @@ import { $Values } from '@kbn/utility-types'; import _ from 'lodash'; import { Action } from 'history'; +import { ApiResponse } from '@elastic/elasticsearch/lib/Transport'; import { ApplicationStart } from 'kibana/public'; import { Assign } from '@kbn/utility-types'; import { BehaviorSubject } from 'rxjs'; import Boom from 'boom'; -import { BulkIndexDocumentsParams } from 'elasticsearch'; -import { CatAliasesParams } from 'elasticsearch'; -import { CatAllocationParams } from 'elasticsearch'; -import { CatCommonParams } from 'elasticsearch'; -import { CatFielddataParams } from 'elasticsearch'; -import { CatHealthParams } from 'elasticsearch'; -import { CatHelpParams } from 'elasticsearch'; -import { CatIndicesParams } from 'elasticsearch'; -import { CatRecoveryParams } from 'elasticsearch'; -import { CatSegmentsParams } from 'elasticsearch'; -import { CatShardsParams } from 'elasticsearch'; -import { CatSnapshotsParams } from 'elasticsearch'; -import { CatTasksParams } from 'elasticsearch'; -import { CatThreadPoolParams } from 'elasticsearch'; -import { ClearScrollParams } from 'elasticsearch'; -import { Client } from 'elasticsearch'; -import { ClusterAllocationExplainParams } from 'elasticsearch'; -import { ClusterGetSettingsParams } from 'elasticsearch'; -import { ClusterHealthParams } from 'elasticsearch'; -import { ClusterPendingTasksParams } from 'elasticsearch'; -import { ClusterPutSettingsParams } from 'elasticsearch'; -import { ClusterRerouteParams } from 'elasticsearch'; -import { ClusterStateParams } from 'elasticsearch'; -import { ClusterStatsParams } from 'elasticsearch'; import { Component } from 'react'; import { CoreSetup } from 'src/core/public'; import { CoreStart } from 'kibana/public'; import { CoreStart as CoreStart_2 } from 'src/core/public'; -import { CountParams } from 'elasticsearch'; -import { CreateDocumentParams } from 'elasticsearch'; -import { DeleteDocumentByQueryParams } from 'elasticsearch'; -import { DeleteDocumentParams } from 'elasticsearch'; -import { DeleteScriptParams } from 'elasticsearch'; -import { DeleteTemplateParams } from 'elasticsearch'; import { Ensure } from '@kbn/utility-types'; import { ErrorToastOptions } from 'src/core/public/notifications'; import { EuiBreadcrumb } from '@elastic/eui'; @@ -53,98 +24,33 @@ import { EuiComboBoxProps } from '@elastic/eui'; import { EuiConfirmModalProps } from '@elastic/eui'; import { EuiGlobalToastListToast } from '@elastic/eui'; import { ExclusiveUnion } from '@elastic/eui'; -import { ExistsParams } from 'elasticsearch'; -import { ExplainParams } from 'elasticsearch'; import { ExpressionAstFunction } from 'src/plugins/expressions/common'; import { ExpressionsSetup } from 'src/plugins/expressions/public'; -import { FieldStatsParams } from 'elasticsearch'; -import { GenericParams } from 'elasticsearch'; -import { GetParams } from 'elasticsearch'; -import { GetResponse } from 'elasticsearch'; -import { GetScriptParams } from 'elasticsearch'; -import { GetSourceParams } from 'elasticsearch'; -import { GetTemplateParams } from 'elasticsearch'; import { History } from 'history'; import { Href } from 'history'; import { IconType } from '@elastic/eui'; -import { IndexDocumentParams } from 'elasticsearch'; -import { IndicesAnalyzeParams } from 'elasticsearch'; -import { IndicesClearCacheParams } from 'elasticsearch'; -import { IndicesCloseParams } from 'elasticsearch'; -import { IndicesCreateParams } from 'elasticsearch'; -import { IndicesDeleteAliasParams } from 'elasticsearch'; -import { IndicesDeleteParams } from 'elasticsearch'; -import { IndicesDeleteTemplateParams } from 'elasticsearch'; -import { IndicesExistsAliasParams } from 'elasticsearch'; -import { IndicesExistsParams } from 'elasticsearch'; -import { IndicesExistsTemplateParams } from 'elasticsearch'; -import { IndicesExistsTypeParams } from 'elasticsearch'; -import { IndicesFlushParams } from 'elasticsearch'; -import { IndicesFlushSyncedParams } from 'elasticsearch'; -import { IndicesForcemergeParams } from 'elasticsearch'; -import { IndicesGetAliasParams } from 'elasticsearch'; -import { IndicesGetFieldMappingParams } from 'elasticsearch'; -import { IndicesGetMappingParams } from 'elasticsearch'; -import { IndicesGetParams } from 'elasticsearch'; -import { IndicesGetSettingsParams } from 'elasticsearch'; -import { IndicesGetTemplateParams } from 'elasticsearch'; -import { IndicesGetUpgradeParams } from 'elasticsearch'; -import { IndicesOpenParams } from 'elasticsearch'; -import { IndicesPutAliasParams } from 'elasticsearch'; -import { IndicesPutMappingParams } from 'elasticsearch'; -import { IndicesPutSettingsParams } from 'elasticsearch'; -import { IndicesPutTemplateParams } from 'elasticsearch'; -import { IndicesRecoveryParams } from 'elasticsearch'; -import { IndicesRefreshParams } from 'elasticsearch'; -import { IndicesRolloverParams } from 'elasticsearch'; -import { IndicesSegmentsParams } from 'elasticsearch'; -import { IndicesShardStoresParams } from 'elasticsearch'; -import { IndicesShrinkParams } from 'elasticsearch'; -import { IndicesStatsParams } from 'elasticsearch'; -import { IndicesUpdateAliasesParams } from 'elasticsearch'; -import { IndicesUpgradeParams } from 'elasticsearch'; -import { IndicesValidateQueryParams } from 'elasticsearch'; -import { InfoParams } from 'elasticsearch'; -import { IngestDeletePipelineParams } from 'elasticsearch'; -import { IngestGetPipelineParams } from 'elasticsearch'; -import { IngestPutPipelineParams } from 'elasticsearch'; -import { IngestSimulateParams } from 'elasticsearch'; import { InjectedIntl } from '@kbn/i18n/react'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { IUiSettingsClient } from 'src/core/public'; import { IUiSettingsClient as IUiSettingsClient_3 } from 'kibana/public'; +import { KibanaClient } from '@elastic/elasticsearch/api/kibana'; import { KibanaConfigType } from 'src/core/server/kibana_config'; import { Location } from 'history'; import { LocationDescriptorObject } from 'history'; import { MaybePromise } from '@kbn/utility-types'; import { METRIC_TYPE } from '@kbn/analytics'; -import { MGetParams } from 'elasticsearch'; -import { MGetResponse } from 'elasticsearch'; import { Moment } from 'moment'; import moment from 'moment'; -import { MSearchParams } from 'elasticsearch'; -import { MSearchResponse } from 'elasticsearch'; -import { MSearchTemplateParams } from 'elasticsearch'; -import { MTermVectorsParams } from 'elasticsearch'; import { NameList } from 'elasticsearch'; -import { NodesHotThreadsParams } from 'elasticsearch'; -import { NodesInfoParams } from 'elasticsearch'; -import { NodesStatsParams } from 'elasticsearch'; import { Observable } from 'rxjs'; import { Path } from 'history'; -import { PingParams } from 'elasticsearch'; import { Plugin as Plugin_2 } from 'src/core/public'; import { PluginInitializerContext as PluginInitializerContext_2 } from 'src/core/public'; import { PopoverAnchorPosition } from '@elastic/eui'; import { PublicUiSettingsParams } from 'src/core/server/types'; -import { PutScriptParams } from 'elasticsearch'; -import { PutTemplateParams } from 'elasticsearch'; import React from 'react'; import * as React_2 from 'react'; import { RecursiveReadonly } from '@kbn/utility-types'; -import { ReindexParams } from 'elasticsearch'; -import { ReindexRethrottleParams } from 'elasticsearch'; -import { RenderSearchTemplateParams } from 'elasticsearch'; import { Reporter } from '@kbn/analytics'; import { RequestAdapter } from 'src/plugins/inspector/common'; import { RequestStatistics } from 'src/plugins/inspector/common'; @@ -153,38 +59,22 @@ import * as Rx from 'rxjs'; import { SavedObject } from 'src/core/server'; import { SavedObject as SavedObject_3 } from 'src/core/public'; import { SavedObjectsClientContract } from 'src/core/public'; -import { ScrollParams } from 'elasticsearch'; import { SearchParams } from 'elasticsearch'; import { SearchResponse as SearchResponse_2 } from 'elasticsearch'; -import { SearchShardsParams } from 'elasticsearch'; -import { SearchTemplateParams } from 'elasticsearch'; import { SerializedFieldFormat as SerializedFieldFormat_2 } from 'src/plugins/expressions/common'; -import { SnapshotCreateParams } from 'elasticsearch'; -import { SnapshotCreateRepositoryParams } from 'elasticsearch'; -import { SnapshotDeleteParams } from 'elasticsearch'; -import { SnapshotDeleteRepositoryParams } from 'elasticsearch'; -import { SnapshotGetParams } from 'elasticsearch'; -import { SnapshotGetRepositoryParams } from 'elasticsearch'; -import { SnapshotRestoreParams } from 'elasticsearch'; -import { SnapshotStatusParams } from 'elasticsearch'; -import { SnapshotVerifyRepositoryParams } from 'elasticsearch'; import { Subscription } from 'rxjs'; -import { SuggestParams } from 'elasticsearch'; -import { TasksCancelParams } from 'elasticsearch'; -import { TasksGetParams } from 'elasticsearch'; -import { TasksListParams } from 'elasticsearch'; -import { TermvectorsParams } from 'elasticsearch'; import { Toast } from 'kibana/public'; import { ToastInputFields } from 'src/core/public/notifications'; import { ToastsStart } from 'kibana/public'; +import { TransportRequestOptions } from '@elastic/elasticsearch/lib/Transport'; +import { TransportRequestParams } from '@elastic/elasticsearch/lib/Transport'; +import { TransportRequestPromise } from '@elastic/elasticsearch/lib/Transport'; import { TypeOf } from '@kbn/config-schema'; import { UiActionsSetup } from 'src/plugins/ui_actions/public'; import { UiActionsStart } from 'src/plugins/ui_actions/public'; import { Unit } from '@elastic/datemath'; import { UnregisterCallback } from 'history'; import { UnwrapPromiseOrReturn } from '@kbn/utility-types'; -import { UpdateDocumentByQueryParams } from 'elasticsearch'; -import { UpdateDocumentParams } from 'elasticsearch'; import { UserProvidedValues } from 'src/core/server/types'; // Warning: (ae-forgotten-export) The symbol "AggConfigSerialized" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index 99a77ff9aeb10..7ad2f9edd3325 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -4,6 +4,7 @@ ```ts +import { ApiResponse } from '@elastic/elasticsearch/lib/Transport'; import Boom from 'boom'; import { BulkIndexDocumentsParams } from 'elasticsearch'; import { CatAliasesParams } from 'elasticsearch'; @@ -91,6 +92,7 @@ import { IngestDeletePipelineParams } from 'elasticsearch'; import { IngestGetPipelineParams } from 'elasticsearch'; import { IngestPutPipelineParams } from 'elasticsearch'; import { IngestSimulateParams } from 'elasticsearch'; +import { KibanaClient } from '@elastic/elasticsearch/api/kibana'; import { KibanaConfigType as KibanaConfigType_2 } from 'src/core/server/kibana_config'; import { KibanaRequest as KibanaRequest_2 } from 'kibana/server'; import { LegacyAPICaller as LegacyAPICaller_2 } from 'kibana/server'; @@ -143,6 +145,9 @@ import { TasksGetParams } from 'elasticsearch'; import { TasksListParams } from 'elasticsearch'; import { TermvectorsParams } from 'elasticsearch'; import { ToastInputFields } from 'src/core/public/notifications'; +import { TransportRequestOptions } from '@elastic/elasticsearch/lib/Transport'; +import { TransportRequestParams } from '@elastic/elasticsearch/lib/Transport'; +import { TransportRequestPromise } from '@elastic/elasticsearch/lib/Transport'; import { Type } from '@kbn/config-schema'; import { TypeOf } from '@kbn/config-schema'; import { Unit } from '@elastic/datemath'; From 8648063b1073cc04d308dd83ca2b81d8fe1e2120 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Tue, 28 Jul 2020 10:52:28 -0400 Subject: [PATCH 066/126] [CI] Harden Slack notifications (#73361) --- .../src/test/KibanaBasePipelineTest.groovy | 4 ++ .../src/test/slackNotifications.groovy | 63 +++++++++++++++++++ vars/slackNotifications.groovy | 50 +++++++++++++-- 3 files changed, 112 insertions(+), 5 deletions(-) diff --git a/.ci/pipeline-library/src/test/KibanaBasePipelineTest.groovy b/.ci/pipeline-library/src/test/KibanaBasePipelineTest.groovy index 086484f2385b0..4112cb3c0e14b 100644 --- a/.ci/pipeline-library/src/test/KibanaBasePipelineTest.groovy +++ b/.ci/pipeline-library/src/test/KibanaBasePipelineTest.groovy @@ -78,6 +78,10 @@ class KibanaBasePipelineTest extends BasePipelineTest { return helper.callStack.find { it.methodName == name } } + def fnMocks(String name) { + helper.callStack.findAll { it.methodName == name } + } + void mockFailureBuild() { props([ buildUtils: [ diff --git a/.ci/pipeline-library/src/test/slackNotifications.groovy b/.ci/pipeline-library/src/test/slackNotifications.groovy index 467e4a0e5f520..f7e39f5fad903 100644 --- a/.ci/pipeline-library/src/test/slackNotifications.groovy +++ b/.ci/pipeline-library/src/test/slackNotifications.groovy @@ -59,4 +59,67 @@ class SlackNotificationsTest extends KibanaBasePipelineTest { args.blocks[2].text.text.toString() ) } + + @Test + void 'sendFailedBuild() should call slackSend() with a backup message when first attempt fails'() { + mockFailureBuild() + def counter = 0 + helper.registerAllowedMethod('slackSend', [Map.class], { ++counter > 1 }) + slackNotifications.sendFailedBuild() + + def args = fnMocks('slackSend')[1].args[0] + + def expected = [ + channel: '#kibana-operations-alerts', + username: 'Kibana Operations', + iconEmoji: ':jenkins:', + color: 'danger', + message: ':broken_heart: elastic / kibana # master #1', + ] + + expected.each { + assertEquals(it.value.toString(), args[it.key].toString()) + } + + assertEquals( + ":broken_heart: **" + + "\n\nFirst attempt at sending this notification failed. Please check the build.", + args.blocks[0].text.text.toString() + ) + } + + @Test + void 'getTestFailures() should truncate list of failures to 10'() { + prop('testUtils', [ + getFailures: { + return (1..12).collect { + return [ + url: Mocks.TEST_FAILURE_URL, + fullDisplayName: "Failure #${it}", + ] + } + }, + ]) + + def message = (String) slackNotifications.getTestFailures() + + assertTrue("Message ends with truncated indicator", message.endsWith("...and 2 more")) + assertTrue("Message contains Failure #10", message.contains("Failure #10")) + assertTrue("Message does not contain Failure #11", !message.contains("Failure #11")) + } + + @Test + void 'shortenMessage() should truncate a long message, but leave parts that fit'() { + assertEquals('Hello\nHello\n[...truncated...]', slackNotifications.shortenMessage('Hello\nHello\nthis is a long string', 29)) + } + + @Test + void 'shortenMessage() should not modify a short message'() { + assertEquals('Hello world', slackNotifications.shortenMessage('Hello world', 11)) + } + + @Test + void 'shortenMessage() should truncate an entire message with only one part'() { + assertEquals('[...truncated...]', slackNotifications.shortenMessage('Hello world this is a really long message', 40)) + } } diff --git a/vars/slackNotifications.groovy b/vars/slackNotifications.groovy index 2ffb420ecf3f4..30f86e6d6f0ad 100644 --- a/vars/slackNotifications.groovy +++ b/vars/slackNotifications.groovy @@ -13,12 +13,35 @@ def dividerBlock() { return [ type: "divider" ] } +// If a message is longer than the limit, split it up by '\n' into parts, and return as many parts as will fit within the limit +def shortenMessage(message, sizeLimit = 3000) { + if (message.size() <= sizeLimit) { + return message + } + + def truncatedMessage = "[...truncated...]" + + def parts = message.split("\n") + message = "" + + for(def part in parts) { + if ((message.size() + part.size() + truncatedMessage.size() + 1) > sizeLimit) { + break; + } + message += part+"\n" + } + + message += truncatedMessage + + return message.size() <= sizeLimit ? message : truncatedMessage +} + def markdownBlock(message) { return [ type: "section", text: [ type: "mrkdwn", - text: message, + text: shortenMessage(message, 3000), // 3000 is max text length for `section`s only ], ] } @@ -29,7 +52,7 @@ def contextBlock(message) { elements: [ [ type: 'mrkdwn', - text: message, + text: message, // Not sure what the size limit is here, I tried 10000s of characters and it still worked ] ] ] @@ -62,7 +85,7 @@ def getTestFailures() { def messages = [] messages << "*Test Failures*" - def list = failures.collect { + def list = failures.take(10).collect { def name = it .fullDisplayName .split(/\./, 2)[-1] @@ -73,7 +96,9 @@ def getTestFailures() { return "• <${it.url}|${name}>" }.join("\n") - return "*Test Failures*\n${list}" + + def moreText = failures.size() > 10 ? "\n• ...and ${failures.size()-10} more" : "" + return "*Test Failures*\n${list}${moreText}" } def getDefaultDisplayName() { @@ -98,6 +123,10 @@ def getStatusIcon() { return ':broken_heart:' } +def getBackupMessage(config) { + return "${getStatusIcon()} ${config.title}\n\nFirst attempt at sending this notification failed. Please check the build." +} + def sendFailedBuild(Map params = [:]) { def config = [ channel: '#kibana-operations-alerts', @@ -117,7 +146,7 @@ def sendFailedBuild(Map params = [:]) { blocks << dividerBlock() blocks << config.context - slackSend( + def resp = slackSend( channel: config.channel, username: config.username, iconEmoji: config.icon, @@ -125,6 +154,17 @@ def sendFailedBuild(Map params = [:]) { message: message, blocks: blocks ) + + if (!resp) { + slackSend( + channel: config.channel, + username: config.username, + iconEmoji: config.icon, + color: config.color, + message: message, + blocks: [markdownBlock(getBackupMessage(config))] + ) + } } def onFailure(Map options = [:]) { From 0149c65221aac101043eaa03b63b4e223801ec1d Mon Sep 17 00:00:00 2001 From: Joe Portner <5295965+jportner@users.noreply.github.com> Date: Tue, 28 Jul 2020 10:56:29 -0400 Subject: [PATCH 067/126] lodash `4.17.15` -> `4.17.19` (#73122) --- yarn.lock | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index c1328731db150..ee4188440e0ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20737,7 +20737,12 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.11, lodash@4.17.15, lodash@>4.17.4, lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.5: +lodash@4.17.11, lodash@>4.17.4, lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.5: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + +lodash@4.17.15: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== From 3d5d4de63ce456e734fa1c5d6fdf28e779c46a24 Mon Sep 17 00:00:00 2001 From: Spencer Date: Tue, 28 Jul 2020 08:01:34 -0700 Subject: [PATCH 068/126] [kbn/optimizer] log info about the metrics being reported even when reporter is disabled (#73389) Co-authored-by: spalger --- .../ci_stats_reporter/ci_stats_reporter.ts | 4 +++- packages/kbn-optimizer/src/cli.ts | 2 +- .../kbn-optimizer/src/log_optimizer_state.ts | 6 ++--- .../src/report_optimizer_stats.ts | 22 ++++++++++++++++--- .../tasks/build_kibana_platform_plugins.ts | 2 +- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts b/packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts index b38a27fdc1b48..b0378ab6c5cd5 100644 --- a/packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts +++ b/packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts @@ -29,6 +29,8 @@ interface Config { buildId: string; } +export type CiStatsMetrics = Array<{ group: string; id: string; value: number }>; + function parseConfig(log: ToolingLog) { const configJson = process.env.KIBANA_CI_STATS_CONFIG; if (!configJson) { @@ -84,7 +86,7 @@ export class CiStatsReporter { return !!this.config; } - async metrics(metrics: Array<{ group: string; id: string; value: number }>) { + async metrics(metrics: CiStatsMetrics) { if (!this.config) { return; } diff --git a/packages/kbn-optimizer/src/cli.ts b/packages/kbn-optimizer/src/cli.ts index 9d3f4b88a258f..542dc7255f22f 100644 --- a/packages/kbn-optimizer/src/cli.ts +++ b/packages/kbn-optimizer/src/cli.ts @@ -116,7 +116,7 @@ run( log.warning('Unable to initialize CiStatsReporter from env'); } - update$ = update$.pipe(reportOptimizerStats(reporter, config)); + update$ = update$.pipe(reportOptimizerStats(reporter, config, log)); } await update$.pipe(logOptimizerState(log, config)).toPromise(); diff --git a/packages/kbn-optimizer/src/log_optimizer_state.ts b/packages/kbn-optimizer/src/log_optimizer_state.ts index 20d98f74dbe86..e8bc6debf971e 100644 --- a/packages/kbn-optimizer/src/log_optimizer_state.ts +++ b/packages/kbn-optimizer/src/log_optimizer_state.ts @@ -104,7 +104,7 @@ export function logOptimizerState(log: ToolingLog, config: OptimizerConfig) { } if (state.phase === 'running' || state.phase === 'initializing') { - return true; + return; } if (state.phase === 'issue') { @@ -119,7 +119,7 @@ export function logOptimizerState(log: ToolingLog, config: OptimizerConfig) { } } log.indent(-4); - return true; + return; } if (state.phase === 'success') { @@ -135,7 +135,7 @@ export function logOptimizerState(log: ToolingLog, config: OptimizerConfig) { ); } - return true; + return; } throw new Error(`unhandled optimizer message: ${inspect(update)}`); diff --git a/packages/kbn-optimizer/src/report_optimizer_stats.ts b/packages/kbn-optimizer/src/report_optimizer_stats.ts index 5057c717efcc3..eff2bce0b827e 100644 --- a/packages/kbn-optimizer/src/report_optimizer_stats.ts +++ b/packages/kbn-optimizer/src/report_optimizer_stats.ts @@ -21,7 +21,7 @@ import Fs from 'fs'; import Path from 'path'; import { materialize, mergeMap, dematerialize } from 'rxjs/operators'; -import { CiStatsReporter } from '@kbn/dev-utils'; +import { CiStatsReporter, CiStatsMetrics, ToolingLog } from '@kbn/dev-utils'; import { OptimizerUpdate$ } from './run_optimizer'; import { OptimizerState, OptimizerConfig } from './optimizer'; @@ -67,7 +67,11 @@ const getFiles = (dir: string, parent?: string) => return true; }); -export function reportOptimizerStats(reporter: CiStatsReporter, config: OptimizerConfig) { +export function reportOptimizerStats( + reporter: CiStatsReporter, + config: OptimizerConfig, + log: ToolingLog +) { return pipeClosure((update$: OptimizerUpdate$) => { let lastState: OptimizerState | undefined; return update$.pipe( @@ -98,10 +102,18 @@ export function reportOptimizerStats(reporter: CiStatsReporter, config: Optimize const miscFiles = outputFiles.filter( (f) => f !== entry && !asyncChunks.includes(f) ); + + if (asyncChunks.length) { + log.verbose(bundle.id, 'async chunks', asyncChunks); + } + if (miscFiles.length) { + log.verbose(bundle.id, 'misc files', asyncChunks); + } + const sumSize = (files: Entry[]) => files.reduce((acc: number, f) => acc + f.stats!.size, 0); - return [ + const metrics: CiStatsMetrics = [ { group: `@kbn/optimizer bundle module count`, id: bundle.id, @@ -123,6 +135,10 @@ export function reportOptimizerStats(reporter: CiStatsReporter, config: Optimize value: sumSize(miscFiles), }, ]; + + log.info(bundle.id, 'metrics', metrics); + + return metrics; }) ) ); diff --git a/src/dev/build/tasks/build_kibana_platform_plugins.ts b/src/dev/build/tasks/build_kibana_platform_plugins.ts index 08637677fcfbe..beb5ad40229df 100644 --- a/src/dev/build/tasks/build_kibana_platform_plugins.ts +++ b/src/dev/build/tasks/build_kibana_platform_plugins.ts @@ -44,7 +44,7 @@ export const BuildKibanaPlatformPlugins: Task = { await runOptimizer(optimizerConfig) .pipe( - reportOptimizerStats(reporter, optimizerConfig), + reportOptimizerStats(reporter, optimizerConfig, log), logOptimizerState(log, optimizerConfig) ) .toPromise(); From f6a53f680552172dced497eb34a20b0f87d0b795 Mon Sep 17 00:00:00 2001 From: Larry Gregory Date: Tue, 28 Jul 2020 11:45:18 -0400 Subject: [PATCH 069/126] Upgrade jimp to v0.14.0 (#73429) --- package.json | 2 +- yarn.lock | 416 +++++++++++++++++++++++++++------------------------ 2 files changed, 223 insertions(+), 195 deletions(-) diff --git a/package.json b/package.json index 0c49ec26be194..51a41cbbab9ff 100644 --- a/package.json +++ b/package.json @@ -460,7 +460,7 @@ "jest-cli": "^25.5.4", "jest-environment-jsdom-thirteen": "^1.0.1", "jest-raw-loader": "^1.0.1", - "jimp": "^0.9.6", + "jimp": "^0.14.0", "json5": "^1.0.1", "license-checker": "^16.0.0", "listr": "^0.14.1", diff --git a/yarn.lock b/yarn.lock index ee4188440e0ca..c31f58c3320e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2767,26 +2767,24 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" -"@jimp/bmp@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.9.6.tgz#379e261615d7c1f3b52af4d5a0f324666de53d7d" - integrity sha512-T2Fh/k/eN6cDyOx0KQ4y56FMLo8+mKNhBh7GXMQXLK2NNZ0ckpFo3VHDBZ3HnaFeVTZXF/atLiR9CfnXH+rLxA== +"@jimp/bmp@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.14.0.tgz#6df246026554f276f7b354047c6fff9f5b2b5182" + integrity sha512-5RkX6tSS7K3K3xNEb2ygPuvyL9whjanhoaB/WmmXlJS6ub4DjTqrapu8j4qnIWmO4YYtFeTbDTXV6v9P1yMA5A== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" + "@jimp/utils" "^0.14.0" bmp-js "^0.1.0" - core-js "^3.4.1" -"@jimp/core@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.9.6.tgz#a553f801bd436526d36e8982b99e58e8afc3d17a" - integrity sha512-sQO04S+HZNid68a9ehb4BC2lmW6iZ5JgU9tC+thC2Lhix+N/XKDJcBJ6HevbLgeTzuIAw24C5EKuUeO3C+rE5w== +"@jimp/core@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/core/-/core-0.14.0.tgz#870c9ca25b40be353ebda1d2abb48723d9010055" + integrity sha512-S62FcKdtLtj3yWsGfJRdFXSutjvHg7aQNiFogMbwq19RP4XJWqS2nOphu7ScB8KrSlyy5nPF2hkWNhLRLyD82w== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" + "@jimp/utils" "^0.14.0" any-base "^1.1.0" buffer "^5.2.0" - core-js "^3.4.1" exif-parser "^0.1.12" file-type "^9.0.0" load-bmfont "^1.3.1" @@ -2795,256 +2793,269 @@ pixelmatch "^4.0.2" tinycolor2 "^1.4.1" -"@jimp/custom@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.9.6.tgz#3d8a19d6ed717f0f1aa3f1b8f42fa374f43bc715" - integrity sha512-ZYKgrBZVoQwvIGlQSO7MFmn7Jn8a9X5g1g+KOTDO9Q0s4vnxdPTtr/qUjG9QYX6zW/6AK4LaIsDinDrrKDnOag== +"@jimp/custom@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/custom/-/custom-0.14.0.tgz#1dbbf0094df7403f4e03bc984ed92e7458842f74" + integrity sha512-kQJMeH87+kWJdVw8F9GQhtsageqqxrvzg7yyOw3Tx/s7v5RToe8RnKyMM+kVtBJtNAG+Xyv/z01uYQ2jiZ3GwA== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/core" "^0.9.6" - core-js "^3.4.1" + "@jimp/core" "^0.14.0" -"@jimp/gif@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.9.6.tgz#0a7b1e521daca635b02259f941bdb3600569d8e6" - integrity sha512-Z2muC2On8KHEVrWKCCM0L2eua9kw4bQETzT7gmVsizc8MXAKdS8AyVV9T3ZrImiI0o5UkAN/u0cPi1U2pSiD8Q== +"@jimp/gif@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/gif/-/gif-0.14.0.tgz#db159f57c3cfd1566bbe8b124958791998614960" + integrity sha512-DHjoOSfCaCz72+oGGEh8qH0zE6pUBaBxPxxmpYJjkNyDZP7RkbBkZJScIYeQ7BmJxmGN4/dZn+MxamoQlr+UYg== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" + gifwrap "^0.9.2" omggif "^1.0.9" -"@jimp/jpeg@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.9.6.tgz#fb90bdc0111966987c5ba59cdca7040be86ead41" - integrity sha512-igSe0pIX3le/CKdvqW4vLXMxoFjTLjEaW6ZHt/h63OegaEa61TzJ2OM7j7DxrEHcMCMlkhUc9Bapk57MAefCTQ== +"@jimp/jpeg@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/jpeg/-/jpeg-0.14.0.tgz#8a687a6a653bbbae38c522edef8f84bb418d9461" + integrity sha512-561neGbr+87S/YVQYnZSTyjWTHBm9F6F1obYHiyU3wVmF+1CLbxY3FQzt4YolwyQHIBv36Bo0PY2KkkU8BEeeQ== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" - jpeg-js "^0.3.4" + "@jimp/utils" "^0.14.0" + jpeg-js "^0.4.0" -"@jimp/plugin-blit@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.9.6.tgz#7937e02e3514b95dbe4c70d444054847f6e9ce3c" - integrity sha512-zp7X6uDU1lCu44RaSY88aAvsSKbgqUrfDyWRX1wsamJvvZpRnp1WekWlGyydRtnlUBAGIpiHCHmyh/TJ2I4RWA== +"@jimp/plugin-blit@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blit/-/plugin-blit-0.14.0.tgz#5eb374be1201313b2113899fb842232d8fcfd345" + integrity sha512-YoYOrnVHeX3InfgbJawAU601iTZMwEBZkyqcP1V/S33Qnz9uzH1Uj1NtC6fNgWzvX6I4XbCWwtr4RrGFb5CFrw== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-blur@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.9.6.tgz#3d74b18c27e9eae11b956ffe26290ece6d250813" - integrity sha512-xEi63hvzewUp7kzw+PI3f9CIrgZbphLI4TDDHWNYuS70RvhTuplbR6RMHD/zFhosrANCkJGr5OZJlrJnsCg6ug== +"@jimp/plugin-blur@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-blur/-/plugin-blur-0.14.0.tgz#fe07e4932d5a2f5d8c9831e245561553224bfc60" + integrity sha512-9WhZcofLrT0hgI7t0chf7iBQZib//0gJh9WcQMUt5+Q1Bk04dWs8vTgLNj61GBqZXgHSPzE4OpCrrLDBG8zlhQ== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-color@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.9.6.tgz#d0fca0ed4c2c48fd6f929ef4a03cebf9c1342e14" - integrity sha512-o1HSoqBVUUAsWbqSXnpiHU0atKWy/Q1GUbZ3F5GWt/0OSDyl9RWM82V9axT2vePZHInKjIaimhnx1gGj8bfxkQ== +"@jimp/plugin-circle@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-circle/-/plugin-circle-0.14.0.tgz#82c0e904a34e90fa672fb9c286bc892e92088ddf" + integrity sha512-o5L+wf6QA44tvTum5HeLyLSc5eVfIUd5ZDVi5iRfO4o6GT/zux9AxuTSkKwnjhsG8bn1dDmywAOQGAx7BjrQVA== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.14.0" + +"@jimp/plugin-color@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-color/-/plugin-color-0.14.0.tgz#772bd2d80a88bc66ea1331d010207870f169a74b" + integrity sha512-JJz512SAILYV0M5LzBb9sbOm/XEj2fGElMiHAxb7aLI6jx+n0agxtHpfpV/AePTLm1vzzDxx6AJxXbKv355hBQ== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" tinycolor2 "^1.4.1" -"@jimp/plugin-contain@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.9.6.tgz#7d7bbd5e9c2fa4391a3d63620e13a28f51e1e7e8" - integrity sha512-Xz467EN1I104yranET4ff1ViVKMtwKLg1uRe8j3b5VOrjtiXpDbjirNZjP3HTlv8IEUreWNz4BK7ZtfHSptufA== +"@jimp/plugin-contain@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-contain/-/plugin-contain-0.14.0.tgz#c68115420d182e696f81bbe76fb5e704909b2b6a" + integrity sha512-RX2q233lGyaxiMY6kAgnm9ScmEkNSof0hdlaJAVDS1OgXphGAYAeSIAwzESZN4x3ORaWvkFefeVH9O9/698Evg== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-cover@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.9.6.tgz#2853de7f8302f655ae8e95f51ab25a0ed77e3756" - integrity sha512-Ocr27AvtvH4ZT/9EWZgT3+HQV9fG5njwh2CYMHbdpx09O62Asj6pZ4QI0kKzOcux1oLgv59l7a93pEfMOfkfwQ== +"@jimp/plugin-cover@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-cover/-/plugin-cover-0.14.0.tgz#4755322589c5885e44e14e31b86b542e907297ce" + integrity sha512-0P/5XhzWES4uMdvbi3beUgfvhn4YuQ/ny8ijs5kkYIw6K8mHcl820HahuGpwWMx56DJLHRl1hFhJwo9CeTRJtQ== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-crop@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.9.6.tgz#82e539af2a2417783abbd143124a57672ff4cc31" - integrity sha512-d9rNdmz3+eYLbSKcTyyp+b8Nmhf6HySnimDXlTej4UP6LDtkq2VAyVaJ12fz9x6dfd8qcXOBXMozSfNCcgpXYA== +"@jimp/plugin-crop@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-crop/-/plugin-crop-0.14.0.tgz#4cbd856ca84ffc37230fad2534906f2f75aa3057" + integrity sha512-Ojtih+XIe6/XSGtpWtbAXBozhCdsDMmy+THUJAGu2x7ZgKrMS0JotN+vN2YC3nwDpYkM+yOJImQeptSfZb2Sug== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-displace@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.9.6.tgz#67564d081dc6b19007248ca222d025fd6f90c03b" - integrity sha512-SWpbrxiHmUYBVWtDDMjaG3eRDBASrTPaad7l07t73/+kmU6owAKWQW6KtVs05MYSJgXz7Ggdr0fhEn9AYLH1Rg== +"@jimp/plugin-displace@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-displace/-/plugin-displace-0.14.0.tgz#b0e6a57d00cb1f893f541413fe9d737d23c3b70c" + integrity sha512-c75uQUzMgrHa8vegkgUvgRL/PRvD7paFbFJvzW0Ugs8Wl+CDMGIPYQ3j7IVaQkIS+cAxv+NJ3TIRBQyBrfVEOg== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-dither@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.9.6.tgz#dc48669cf51f3933761aa9137e99ebfa000b8cce" - integrity sha512-abm1GjfYK7ru/PoxH9fAUmhl+meHhGEClbVvjjMMe5g2S0BSTvMJl3SrkQD/FMkRLniaS/Qci6aQhIi+8rZmSw== +"@jimp/plugin-dither@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-dither/-/plugin-dither-0.14.0.tgz#9185ec4c38e02edc9e5831f5d709f6ba891e1b93" + integrity sha512-g8SJqFLyYexXQQsoh4dc1VP87TwyOgeTElBcxSXX2LaaMZezypmxQfLTzOFzZoK8m39NuaoH21Ou1Ftsq7LzVQ== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-flip@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.9.6.tgz#f81f9b886da8cd56e23dd04d5aa359f2b94f939e" - integrity sha512-KFZTzAzQQ5bct3ii7gysOhWrTKVdUOghkkoSzLi+14nO3uS/dxiu8fPeH1m683ligbdnuM/b22OuLwEwrboTHA== +"@jimp/plugin-fisheye@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-fisheye/-/plugin-fisheye-0.14.0.tgz#9f26346cf2fbc660cc2008cd7fd30a83b5029e78" + integrity sha512-BFfUZ64EikCaABhCA6mR3bsltWhPpS321jpeIQfJyrILdpFsZ/OccNwCgpW1XlbldDHIoNtXTDGn3E+vCE7vDg== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-gaussian@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.9.6.tgz#6c93897ee0ff979466184d7d0ec0fbc95c679be4" - integrity sha512-WXKLtJKWchXfWHT5HIOq1HkPKpbH7xBLWPgVRxw00NV/6I8v4xT63A7/Nag78m00JgjwwiE7eK2tLGDbbrPYig== +"@jimp/plugin-flip@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-flip/-/plugin-flip-0.14.0.tgz#7966d6aa3b5fe1aa4d2d561ff12b8ef5ccb9b071" + integrity sha512-WtL1hj6ryqHhApih+9qZQYA6Ye8a4HAmdTzLbYdTMrrrSUgIzFdiZsD0WeDHpgS/+QMsWwF+NFmTZmxNWqKfXw== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-invert@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.9.6.tgz#4b3fa7b81ea976b09b82b3db59ee00ac3093d2fd" - integrity sha512-Pab/cupZrYxeRp07N4L5a4C/3ksTN9k6Knm/o2G5C789OF0rYsGGLcnBR/6h69nPizRZHBYdXCEyXYgujlIFiw== +"@jimp/plugin-gaussian@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-gaussian/-/plugin-gaussian-0.14.0.tgz#452bc1971a4467ad9b984aa67f4c200bf941bb65" + integrity sha512-uaLwQ0XAQoydDlF9tlfc7iD9drYPriFe+jgYnWm8fbw5cN+eOIcnneEX9XCOOzwgLPkNCxGox6Kxjn8zY6GxtQ== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-mask@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.9.6.tgz#d70be0030ab3294b191f5b487fb655d776820b19" - integrity sha512-ikypRoDJkbxXlo6gW+EZOcTiLDIt0DrPwOFMt1bvL8UV2QPgX+GJ685IYwhIfEhBf/GSNFgB/NYsVvuSufTGeg== +"@jimp/plugin-invert@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-invert/-/plugin-invert-0.14.0.tgz#cd31a555860e9f821394936d15af161c09c42921" + integrity sha512-UaQW9X9vx8orQXYSjT5VcITkJPwDaHwrBbxxPoDG+F/Zgv4oV9fP+udDD6qmkgI9taU+44Fy+zm/J/gGcMWrdg== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-normalize@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.9.6.tgz#c9128412a53485d91236a1da241f3166e572be4a" - integrity sha512-V3GeuAJ1NeL7qsLoDjnypJq24RWDCwbXpKhtxB+Yg9zzgOCkmb041p7ysxbcpkuJsRpKLNABZeNCCqd83bRawA== +"@jimp/plugin-mask@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-mask/-/plugin-mask-0.14.0.tgz#52619643ac6222f85e6b27dee33c771ca3a6a4c9" + integrity sha512-tdiGM69OBaKtSPfYSQeflzFhEpoRZ+BvKfDEoivyTjauynbjpRiwB1CaiS8En1INTDwzLXTT0Be9SpI3LkJoEA== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-print@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.9.6.tgz#fea31ffeafee18ae7b5cfd6fa131bb205abfee51" - integrity sha512-gKkqZZPQtMSufHOL0mtJm5d/KI2O6+0kUpOBVSYdGedtPXA61kmVnsOd3wwajIMlXA3E0bDxLXLdAguWqjjGgw== +"@jimp/plugin-normalize@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-normalize/-/plugin-normalize-0.14.0.tgz#bf39e356b6d473f582ce95633ad49c9cdb82492b" + integrity sha512-AfY8sqlsbbdVwFGcyIPy5JH/7fnBzlmuweb+Qtx2vn29okq6+HelLjw2b+VT2btgGUmWWHGEHd86oRGSoWGyEQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.14.0" + +"@jimp/plugin-print@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-print/-/plugin-print-0.14.0.tgz#1c43c2a92a7adc05b464863882cb89ce486d63e6" + integrity sha512-MwP3sH+VS5AhhSTXk7pui+tEJFsxnTKFY3TraFJb8WFbA2Vo2qsRCZseEGwpTLhENB7p/JSsLvWoSSbpmxhFAQ== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" load-bmfont "^1.4.0" -"@jimp/plugin-resize@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.9.6.tgz#7fb939c8a42e2a3639d661cc7ab24057598693bd" - integrity sha512-r5wJcVII7ZWMuY2l6WSbHPG6gKMFemtCHmJRXGUu+/ZhPGBz3IFluycBpHkWW3OB+jfvuyv1EGQWHU50N1l8Og== +"@jimp/plugin-resize@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-resize/-/plugin-resize-0.14.0.tgz#ef7fc6c2e45f8bcab62456baf8fd3bc415b02b64" + integrity sha512-qFeMOyXE/Bk6QXN0GQo89+CB2dQcXqoxUcDb2Ah8wdYlKqpi53skABkgVy5pW3EpiprDnzNDboMltdvDslNgLQ== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-rotate@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.9.6.tgz#06d725155e5cdb615133f57a52f5a860a9d03f3e" - integrity sha512-B2nm/eO2nbvn1DgmnzMd79yt3V6kffhRNrKoo2VKcKFiVze1vGP3MD3fVyw5U1PeqwAFu7oTICFnCf9wKDWSqg== +"@jimp/plugin-rotate@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-rotate/-/plugin-rotate-0.14.0.tgz#3632bc159bf1c3b9ec9f459d9c05d02a11781ee7" + integrity sha512-aGaicts44bvpTcq5Dtf93/8TZFu5pMo/61lWWnYmwJJU1RqtQlxbCLEQpMyRhKDNSfPbuP8nyGmaqXlM/82J0Q== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugin-scale@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.9.6.tgz#3fa939c1a4f44383e12afeb7c434eb41f20e4a1c" - integrity sha512-DLsLB5S3mh9+TZY5ycwfLgOJvUcoS7bP0Mi3I8vE1J91qmA+TXoWFFgrIVgnEPw5jSKzNTt8WhykQ0x2lKXncw== +"@jimp/plugin-scale@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-scale/-/plugin-scale-0.14.0.tgz#d30f0cd1365b8e68f43fa423300ae7f124e9bf10" + integrity sha512-ZcJk0hxY5ZKZDDwflqQNHEGRblgaR+piePZm7dPwPUOSeYEH31P0AwZ1ziceR74zd8N80M0TMft+e3Td6KGBHw== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" -"@jimp/plugins@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.9.6.tgz#a1cfdf9f3e1adf5b124686486343888a16c8fd27" - integrity sha512-eQI29e+K+3L/fb5GbPgsBdoftvaYetSOO2RL5z+Gjk6R4EF4QFRo63YcFl+f72Kc1b0JTOoDxClvn/s5GMV0tg== +"@jimp/plugin-shadow@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-shadow/-/plugin-shadow-0.14.0.tgz#471fdb9f109ff2d9e20d533d45e1e18e0b48c749" + integrity sha512-p2igcEr/iGrLiTu0YePNHyby0WYAXM14c5cECZIVnq/UTOOIQ7xIcWZJ1lRbAEPxVVXPN1UibhZAbr3HAb5BjQ== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.14.0" + +"@jimp/plugin-threshold@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugin-threshold/-/plugin-threshold-0.14.0.tgz#ebd72721c7d1d518c5bb6e494e55d97ac3351d3b" + integrity sha512-N4BlDgm/FoOMV/DQM2rSpzsgqAzkP0DXkWZoqaQrlRxQBo4zizQLzhEL00T/YCCMKnddzgEhnByaocgaaa0fKw== + dependencies: + "@babel/runtime" "^7.7.2" + "@jimp/utils" "^0.14.0" + +"@jimp/plugins@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/plugins/-/plugins-0.14.0.tgz#41dba85f15ab8dadb4162100eb54e5f27b93ee2c" + integrity sha512-vDO3XT/YQlFlFLq5TqNjQkISqjBHT8VMhpWhAfJVwuXIpilxz5Glu4IDLK6jp4IjPR6Yg2WO8TmRY/HI8vLrOw== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/plugin-blit" "^0.9.6" - "@jimp/plugin-blur" "^0.9.6" - "@jimp/plugin-color" "^0.9.6" - "@jimp/plugin-contain" "^0.9.6" - "@jimp/plugin-cover" "^0.9.6" - "@jimp/plugin-crop" "^0.9.6" - "@jimp/plugin-displace" "^0.9.6" - "@jimp/plugin-dither" "^0.9.6" - "@jimp/plugin-flip" "^0.9.6" - "@jimp/plugin-gaussian" "^0.9.6" - "@jimp/plugin-invert" "^0.9.6" - "@jimp/plugin-mask" "^0.9.6" - "@jimp/plugin-normalize" "^0.9.6" - "@jimp/plugin-print" "^0.9.6" - "@jimp/plugin-resize" "^0.9.6" - "@jimp/plugin-rotate" "^0.9.6" - "@jimp/plugin-scale" "^0.9.6" - core-js "^3.4.1" + "@jimp/plugin-blit" "^0.14.0" + "@jimp/plugin-blur" "^0.14.0" + "@jimp/plugin-circle" "^0.14.0" + "@jimp/plugin-color" "^0.14.0" + "@jimp/plugin-contain" "^0.14.0" + "@jimp/plugin-cover" "^0.14.0" + "@jimp/plugin-crop" "^0.14.0" + "@jimp/plugin-displace" "^0.14.0" + "@jimp/plugin-dither" "^0.14.0" + "@jimp/plugin-fisheye" "^0.14.0" + "@jimp/plugin-flip" "^0.14.0" + "@jimp/plugin-gaussian" "^0.14.0" + "@jimp/plugin-invert" "^0.14.0" + "@jimp/plugin-mask" "^0.14.0" + "@jimp/plugin-normalize" "^0.14.0" + "@jimp/plugin-print" "^0.14.0" + "@jimp/plugin-resize" "^0.14.0" + "@jimp/plugin-rotate" "^0.14.0" + "@jimp/plugin-scale" "^0.14.0" + "@jimp/plugin-shadow" "^0.14.0" + "@jimp/plugin-threshold" "^0.14.0" timm "^1.6.1" -"@jimp/png@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.9.6.tgz#00ed7e6fb783b94f2f1a9fadf9a42bd75f70cc7f" - integrity sha512-9vhOG2xylcDqPbBf4lzpa2Sa1WNJrEZNGvPvWcM+XVhqYa8+DJBLYkoBlpI/qWIYA+eVWDnLF3ygtGj8CElICw== +"@jimp/png@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/png/-/png-0.14.0.tgz#0f2dddb5125c0795ca7e67c771204c5437fcda4b" + integrity sha512-0RV/mEIDOrPCcNfXSPmPBqqSZYwGADNRVUTyMt47RuZh7sugbYdv/uvKmQSiqRdR0L1sfbCBMWUEa5G/8MSbdA== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/utils" "^0.9.6" - core-js "^3.4.1" + "@jimp/utils" "^0.14.0" pngjs "^3.3.3" -"@jimp/tiff@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.9.6.tgz#9ff12122e727ee15f27f40a710516102a636f66b" - integrity sha512-pKKEMqPzX9ak8mek2iVVoW34+h/TSWUyI4NjbYWJMQ2WExfuvEJvLocy9Q9xi6HqRuJmUxgNIiC5iZM1PDEEfg== +"@jimp/tiff@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/tiff/-/tiff-0.14.0.tgz#a5b25bbe7c43fc3b07bad4e2ab90e0e164c1967f" + integrity sha512-zBYDTlutc7j88G/7FBCn3kmQwWr0rmm1e0FKB4C3uJ5oYfT8645lftUsvosKVUEfkdmOaMAnhrf4ekaHcb5gQw== dependencies: "@babel/runtime" "^7.7.2" - core-js "^3.4.1" utif "^2.0.1" -"@jimp/types@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.9.6.tgz#7be7f415ad93be733387c03b8a228c587a868a18" - integrity sha512-PSjdbLZ8d50En+Wf1XkWFfrXaf/GqyrxxgIwFWPbL+wrW4pmbYovfxSLCY61s8INsOFOft9dzzllhLBtg1aQ6A== +"@jimp/types@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/types/-/types-0.14.0.tgz#ef681ff702883c5f105b5e4e30d49abf39ee9e34" + integrity sha512-hx3cXAW1KZm+b+XCrY3LXtdWy2U+hNtq0rPyJ7NuXCjU7lZR3vIkpz1DLJ3yDdS70hTi5QDXY3Cd9kd6DtloHQ== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/bmp" "^0.9.6" - "@jimp/gif" "^0.9.6" - "@jimp/jpeg" "^0.9.6" - "@jimp/png" "^0.9.6" - "@jimp/tiff" "^0.9.6" - core-js "^3.4.1" + "@jimp/bmp" "^0.14.0" + "@jimp/gif" "^0.14.0" + "@jimp/jpeg" "^0.14.0" + "@jimp/png" "^0.14.0" + "@jimp/tiff" "^0.14.0" timm "^1.6.1" -"@jimp/utils@^0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.9.6.tgz#a3e6c29e835e2b9ea9f3899c9d3d230dc63bd518" - integrity sha512-kzxcp0i4ecSdMXFEmtH+NYdBQysINEUTsrjm7v0zH8t/uwaEMOG46I16wo/iPBXJkUeNdL2rbXoGoxxoeSfrrA== +"@jimp/utils@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@jimp/utils/-/utils-0.14.0.tgz#296254e63118554c62c31c19ac6b8c4bfe6490e5" + integrity sha512-MY5KFYUru0y74IsgM/9asDwb3ERxWxXEu3CRCZEvE7DtT86y1bR1XgtlSliMrptjz4qbivNGMQSvUBpEFJDp1A== dependencies: "@babel/runtime" "^7.7.2" - core-js "^3.4.1" + regenerator-runtime "^0.13.3" "@mapbox/extent@0.4.0": version "0.4.0" @@ -10924,7 +10935,7 @@ core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.1, core-js@^2.5.3, core-js@^2.6.5, resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== -core-js@^3.0.1, core-js@^3.0.4, core-js@^3.4.1, core-js@^3.6.4: +core-js@^3.0.1, core-js@^3.0.4, core-js@^3.6.4: version "3.6.4" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== @@ -15487,6 +15498,14 @@ gh-got@^5.0.0: got "^6.2.0" is-plain-obj "^1.1.0" +gifwrap@^0.9.2: + version "0.9.2" + resolved "https://registry.yarnpkg.com/gifwrap/-/gifwrap-0.9.2.tgz#348e286e67d7cf57942172e1e6f05a71cee78489" + integrity sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA== + dependencies: + image-q "^1.1.1" + omggif "^1.0.10" + git-clone@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/git-clone/-/git-clone-0.1.0.tgz#0d76163778093aef7f1c30238f2a9ef3f07a2eb9" @@ -17368,6 +17387,11 @@ ignore@^5.1.1, ignore@^5.1.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +image-q@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/image-q/-/image-q-1.1.1.tgz#fc84099664460b90ca862d9300b6bfbbbfbf8056" + integrity sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY= + image-size@^0.8.2: version "0.8.3" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.8.3.tgz#f0b568857e034f29baffd37013587f2c0cad8b46" @@ -19398,16 +19422,15 @@ jest@^25.5.4: import-local "^3.0.2" jest-cli "^25.5.4" -jimp@^0.9.6: - version "0.9.6" - resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.9.6.tgz#abf381daf193a4fa335cb4ee0e22948049251eb9" - integrity sha512-DBDHYeNVqVpoPkcvo0PKTNGvD+i7NYvkKTsl0I3k7ql36uN8wGTptRg0HtgQyYE/bhGSLI6Lq5qLwewaOPXNfg== +jimp@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.14.0.tgz#fde55f69bdb918c1b01ac633d89a25853af85625" + integrity sha512-8BXU+J8+SPmwwyq9ELihpSV4dWPTiOKBWCEgtkbnxxAVMjXdf3yGmyaLSshBfXc8sP/JQ9OZj5R8nZzz2wPXgA== dependencies: "@babel/runtime" "^7.7.2" - "@jimp/custom" "^0.9.6" - "@jimp/plugins" "^0.9.6" - "@jimp/types" "^0.9.6" - core-js "^3.4.1" + "@jimp/custom" "^0.14.0" + "@jimp/plugins" "^0.14.0" + "@jimp/types" "^0.14.0" regenerator-runtime "^0.13.3" jit-grunt@0.10.0: @@ -19429,10 +19452,10 @@ joi@13.x.x, joi@^13.5.2: isemail "3.x.x" topo "3.x.x" -jpeg-js@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.4.tgz#dc2ba501ee3d58b7bb893c5d1fab47294917e7e7" - integrity sha512-6IzjQxvnlT8UlklNmDXIJMWxijULjqGrzgqc0OG7YadZdvm7KPQ1j0ehmQQHckgEWOfgpptzcnWgESovxudpTA== +jpeg-js@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.1.tgz#937a3ae911eb6427f151760f8123f04c8bfe6ef7" + integrity sha512-jA55yJiB5tCXEddos8JBbvW+IMrqY0y1tjjx9KNVtA+QPmu7ND5j0zkKopClpUTsaETL135uOM2XfcYG4XRjmw== jquery@^3.5.0: version "3.5.0" @@ -23066,6 +23089,11 @@ octokit-pagination-methods@^1.1.0: resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== +omggif@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.10.tgz#ddaaf90d4a42f532e9e7cb3a95ecdd47f17c7b19" + integrity sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw== + omggif@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.9.tgz#dcb7024dacd50c52b4d303f04802c91c057c765f" From c8bb0782eae988cf427c47838c867df1ebbd8741 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Tue, 28 Jul 2020 11:57:51 -0400 Subject: [PATCH 070/126] [Ingest Manager] Disable unenroll from listing for inactive agent (#73348) --- .../fleet/agent_details_page/components/actions_menu.tsx | 1 + .../ingest_manager/sections/fleet/agent_list_page/index.tsx | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/actions_menu.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/actions_menu.tsx index 7afc57b30cef4..0f48a230bbf5c 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/actions_menu.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/actions_menu.tsx @@ -53,6 +53,7 @@ export const AgentDetailsActionMenu: React.FunctionComponent<{ onClick={() => { setIsReassignFlyoutOpen(true); }} + disabled={!agent.active} key="reassignConfig" > void; refre onClick={() => { onReassignClick(); }} + disabled={!agent.active} key="reassignConfig" > void; refre defaultMessage="Assign new agent config" /> , - {(unenrollAgentsPrompt) => ( { unenrollAgentsPrompt([agent.id], 1, () => { From 1dbea34d2df3644195391106632acef3c8e7c88c Mon Sep 17 00:00:00 2001 From: Sonja Krause-Harder Date: Tue, 28 Jul 2020 18:26:48 +0200 Subject: [PATCH 071/126] [Ingest Manager] Don't send kibana version to registry on master. (#73415) * Don't send kibana version to registry on master. * Adjust test. * Create correct app context in mocks. --- x-pack/plugins/ingest_manager/server/mocks.ts | 1 + x-pack/plugins/ingest_manager/server/plugin.ts | 5 +++++ .../ingest_manager/server/services/app_context.ts | 9 +++++++++ .../server/services/epm/registry/index.ts | 14 ++++++++++---- .../apis/epm/list.ts | 2 +- 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/ingest_manager/server/mocks.ts b/x-pack/plugins/ingest_manager/server/mocks.ts index f305d9dd0c1a7..52cd294783087 100644 --- a/x-pack/plugins/ingest_manager/server/mocks.ts +++ b/x-pack/plugins/ingest_manager/server/mocks.ts @@ -18,6 +18,7 @@ export const createAppContextStartContractMock = (): IngestManagerAppContext => logger: loggingSystemMock.create().get(), isProductionMode: true, kibanaVersion: '8.0.0', + kibanaBranch: 'master', }; }; diff --git a/x-pack/plugins/ingest_manager/server/plugin.ts b/x-pack/plugins/ingest_manager/server/plugin.ts index 69af475886bb9..5664a87501016 100644 --- a/x-pack/plugins/ingest_manager/server/plugin.ts +++ b/x-pack/plugins/ingest_manager/server/plugin.ts @@ -15,6 +15,7 @@ import { HttpServiceSetup, } from 'kibana/server'; import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; +import packageJSON from '../../../../package.json'; import { LicensingPluginSetup, ILicense } from '../../licensing/server'; import { EncryptedSavedObjectsPluginStart, @@ -85,6 +86,7 @@ export interface IngestManagerAppContext { savedObjects: SavedObjectsServiceStart; isProductionMode: boolean; kibanaVersion: string; + kibanaBranch: string; cloud?: CloudSetup; logger?: Logger; httpSetup?: HttpServiceSetup; @@ -145,6 +147,7 @@ export class IngestManagerPlugin private isProductionMode: boolean; private kibanaVersion: string; + private kibanaBranch: string; private httpSetup: HttpServiceSetup | undefined; private encryptedSavedObjectsSetup: EncryptedSavedObjectsPluginSetup | undefined; @@ -152,6 +155,7 @@ export class IngestManagerPlugin this.config$ = this.initializerContext.config.create(); this.isProductionMode = this.initializerContext.env.mode.prod; this.kibanaVersion = this.initializerContext.env.packageInfo.version; + this.kibanaBranch = packageJSON.branch; this.logger = this.initializerContext.logger.get(); } @@ -257,6 +261,7 @@ export class IngestManagerPlugin savedObjects: core.savedObjects, isProductionMode: this.isProductionMode, kibanaVersion: this.kibanaVersion, + kibanaBranch: this.kibanaBranch, httpSetup: this.httpSetup, cloud: this.cloud, logger: this.logger, diff --git a/x-pack/plugins/ingest_manager/server/services/app_context.ts b/x-pack/plugins/ingest_manager/server/services/app_context.ts index 4d109b73d12d9..bdc7a443ba6dd 100644 --- a/x-pack/plugins/ingest_manager/server/services/app_context.ts +++ b/x-pack/plugins/ingest_manager/server/services/app_context.ts @@ -24,6 +24,7 @@ class AppContextService { private savedObjects: SavedObjectsServiceStart | undefined; private isProductionMode: boolean = false; private kibanaVersion: string | undefined; + private kibanaBranch: string | undefined; private cloud?: CloudSetup; private logger: Logger | undefined; private httpSetup?: HttpServiceSetup; @@ -38,6 +39,7 @@ class AppContextService { this.cloud = appContext.cloud; this.logger = appContext.logger; this.kibanaVersion = appContext.kibanaVersion; + this.kibanaBranch = appContext.kibanaBranch; this.httpSetup = appContext.httpSetup; if (appContext.config$) { @@ -125,6 +127,13 @@ class AppContextService { return this.kibanaVersion; } + public getKibanaBranch() { + if (!this.kibanaBranch) { + throw new Error('Kibana branch is not set.'); + } + return this.kibanaBranch; + } + public addExternalCallback(type: ExternalCallback[0], callback: ExternalCallback[1]) { if (!this.externalCallbacks.has(type)) { this.externalCallbacks.set(type, new Set()); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts index 7fb13e5e671d0..c7f2df38fe41a 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts @@ -40,6 +40,8 @@ export const pkgToPkgKey = ({ name, version }: { name: string; version: string } export async function fetchList(params?: SearchParams): Promise { const registryUrl = getRegistryUrl(); const url = new URL(`${registryUrl}/search`); + const kibanaVersion = appContextService.getKibanaVersion().split('-')[0]; // may be x.y.z-SNAPSHOT + const kibanaBranch = appContextService.getKibanaBranch(); if (params) { if (params.category) { url.searchParams.set('category', params.category); @@ -48,8 +50,9 @@ export async function fetchList(params?: SearchParams): Promise { const registryUrl = getRegistryUrl(); + const kibanaVersion = appContextService.getKibanaVersion().split('-')[0]; // may be x.y.z-SNAPSHOT + const kibanaBranch = appContextService.getKibanaBranch(); const url = new URL( `${registryUrl}/search?package=${packageName}&internal=true&experimental=true` ); - const kibanaVersion = appContextService.getKibanaVersion().split('-')[0]; // may be 8.0.0-SNAPSHOT - if (kibanaVersion) { + + // on master, request all packages regardless of version + if (kibanaVersion && kibanaBranch !== 'master') { url.searchParams.set('kibana.version', kibanaVersion); } const res = await fetchUrl(url.toString()); diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/list.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/list.ts index 2fbda8f2d3c81..98b26c1c04ebb 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/epm/list.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/list.ts @@ -29,7 +29,7 @@ export default function ({ getService }: FtrProviderContext) { return response.body; }; const listResponse = await fetchPackageList(); - expect(listResponse.response.length).to.be(6); + expect(listResponse.response.length).to.be(13); } else { warnAndSkipTest(this, log); } From 12e7d995f9b73c71d287341e801fe5c72a05097d Mon Sep 17 00:00:00 2001 From: "Devin W. Hurley" Date: Tue, 28 Jul 2020 12:46:20 -0400 Subject: [PATCH 072/126] [SIEM] [Detections] Reject on value list + other exception entries in single exception item (#73158) Add validation to reject when value list and other exception type are entries in the same exception item. Also adds tests for this situation on the schema validation --- .../lists/common/schemas/types/entries.mock.ts | 14 +++++++++++++- .../types/non_empty_entries_array.test.ts | 18 +++++++++++++++--- .../schemas/types/non_empty_entries_array.ts | 9 +++++++++ .../exceptions/viewer/helpers.test.tsx | 6 ------ 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/lists/common/schemas/types/entries.mock.ts b/x-pack/plugins/lists/common/schemas/types/entries.mock.ts index 3ed3f4e7ff88f..16794415138b2 100644 --- a/x-pack/plugins/lists/common/schemas/types/entries.mock.ts +++ b/x-pack/plugins/lists/common/schemas/types/entries.mock.ts @@ -11,10 +11,22 @@ import { getEntryListMock } from './entry_list.mock'; import { getEntryExistsMock } from './entry_exists.mock'; import { getEntryNestedMock } from './entry_nested.mock'; -export const getEntriesArrayMock = (): EntriesArray => [ +export const getListAndNonListEntriesArrayMock = (): EntriesArray => [ { ...getEntryMatchMock() }, { ...getEntryMatchAnyMock() }, { ...getEntryListMock() }, { ...getEntryExistsMock() }, { ...getEntryNestedMock() }, ]; + +export const getListEntriesArrayMock = (): EntriesArray => [ + { ...getEntryListMock() }, + { ...getEntryListMock() }, +]; + +export const getEntriesArrayMock = (): EntriesArray => [ + { ...getEntryMatchMock() }, + { ...getEntryMatchAnyMock() }, + { ...getEntryExistsMock() }, + { ...getEntryNestedMock() }, +]; diff --git a/x-pack/plugins/lists/common/schemas/types/non_empty_entries_array.test.ts b/x-pack/plugins/lists/common/schemas/types/non_empty_entries_array.test.ts index ab7002982cf28..a2697286aa038 100644 --- a/x-pack/plugins/lists/common/schemas/types/non_empty_entries_array.test.ts +++ b/x-pack/plugins/lists/common/schemas/types/non_empty_entries_array.test.ts @@ -11,10 +11,13 @@ import { foldLeftRight, getPaths } from '../../siem_common_deps'; import { getEntryMatchMock } from './entry_match.mock'; import { getEntryMatchAnyMock } from './entry_match_any.mock'; -import { getEntryListMock } from './entry_list.mock'; import { getEntryExistsMock } from './entry_exists.mock'; import { getEntryNestedMock } from './entry_nested.mock'; -import { getEntriesArrayMock } from './entries.mock'; +import { + getEntriesArrayMock, + getListAndNonListEntriesArrayMock, + getListEntriesArrayMock, +} from './entries.mock'; import { nonEmptyEntriesArray } from './non_empty_entries_array'; import { EntriesArray } from './entries'; @@ -80,7 +83,7 @@ describe('non_empty_entries_array', () => { }); test('it should validate an array of "list" entries', () => { - const payload: EntriesArray = [{ ...getEntryListMock() }, { ...getEntryListMock() }]; + const payload: EntriesArray = [...getListEntriesArrayMock()]; const decoded = nonEmptyEntriesArray.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -106,6 +109,15 @@ describe('non_empty_entries_array', () => { expect(message.schema).toEqual(payload); }); + test('it should NOT validate an array of entries of value list and non-value list entries', () => { + const payload: EntriesArray = [...getListAndNonListEntriesArrayMock()]; + const decoded = nonEmptyEntriesArray.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual(['Cannot have entry of type list and other']); + expect(message.schema).toEqual({}); + }); + test('it should NOT validate an array of non entries', () => { const payload = [1]; const decoded = nonEmptyEntriesArray.decode(payload); diff --git a/x-pack/plugins/lists/common/schemas/types/non_empty_entries_array.ts b/x-pack/plugins/lists/common/schemas/types/non_empty_entries_array.ts index 1370fe022c258..3683ca97dedb8 100644 --- a/x-pack/plugins/lists/common/schemas/types/non_empty_entries_array.ts +++ b/x-pack/plugins/lists/common/schemas/types/non_empty_entries_array.ts @@ -8,6 +8,7 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; import { EntriesArray, entriesArray } from './entries'; +import { entriesList } from './entry_list'; /** * Types the nonEmptyEntriesArray as: @@ -21,6 +22,14 @@ export const nonEmptyEntriesArray = new t.Type entriesList.is(entry)) && + input.some((entry) => !entriesList.is(entry)) + ) { + // fail when an exception item contains both a value list entry and a non-value list entry + return t.failure(input, context, 'Cannot have entry of type list and other'); + } return entriesArray.validate(input, context); } }, diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/helpers.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/helpers.test.tsx index fe00e3530fa83..5d4340db9a448 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/helpers.test.tsx @@ -93,12 +93,6 @@ describe('Exception viewer helpers', () => { operator: 'is one of', value: ['some host name'], }, - { - fieldName: 'host.name', - isNested: false, - operator: 'is in list', - value: 'some-list-id', - }, { fieldName: 'host.name', isNested: false, From 79c475a2158e208e0a6f6c3979c2eaa28e38cc03 Mon Sep 17 00:00:00 2001 From: Corey Robertson Date: Tue, 28 Jul 2020 12:59:41 -0400 Subject: [PATCH 073/126] Fixes incorrect platform service usage (#73453) --- x-pack/plugins/canvas/public/state/reducers/workpad.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/x-pack/plugins/canvas/public/state/reducers/workpad.js b/x-pack/plugins/canvas/public/state/reducers/workpad.js index fffcb69c451ed..1c210577e1014 100644 --- a/x-pack/plugins/canvas/public/state/reducers/workpad.js +++ b/x-pack/plugins/canvas/public/state/reducers/workpad.js @@ -40,11 +40,7 @@ export const workpadReducer = handleActions( [setName]: (workpadState, { payload }) => { platformService .getService() - .coreStart.chrome.recentlyAccessed.add( - `${APP_ROUTE_WORKPAD}/${workpadState.id}`, - payload, - workpadState.id - ); + .setRecentlyAccessed(`${APP_ROUTE_WORKPAD}/${workpadState.id}`, payload, workpadState.id); return { ...workpadState, name: payload }; }, From 01b70dd9dce9f576a5524426d864a8b9f94a7d4c Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 28 Jul 2020 12:04:42 -0500 Subject: [PATCH 074/126] [Security Solution] Fix Lists route permissions (#73368) * Do not display threshold field for an ML Rule * Give 'read' privileges to 'all' users We have several lists routes that require lists-read access. If the user was given the 'all' privilege for securitySolution, they would previously be locked out of those routes. --- .../pages/detection_engine/rules/create/helpers.ts | 7 ++++--- x-pack/plugins/security_solution/server/plugin.ts | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts index a972afbd8c0c5..705013beb750f 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts @@ -12,6 +12,7 @@ import { NOTIFICATION_THROTTLE_NO_ACTIONS } from '../../../../../../common/const import { transformAlertToRuleAction } from '../../../../../../common/detection_engine/transform_actions'; import { RuleType } from '../../../../../../common/detection_engine/types'; import { isMlRule } from '../../../../../../common/machine_learning/helpers'; +import { isThresholdRule } from '../../../../../../common/detection_engine/utils'; import { List } from '../../../../../../common/detection_engine/schemas/types'; import { ENDPOINT_LIST_ID } from '../../../../../shared_imports'; import { NewRule, Rule } from '../../../../containers/detection_engine/rules'; @@ -57,7 +58,7 @@ export interface RuleFields { } type QueryRuleFields = Omit; type ThresholdRuleFields = Omit; -type MlRuleFields = Omit; +type MlRuleFields = Omit; const isMlFields = ( fields: QueryRuleFields | MlRuleFields | ThresholdRuleFields @@ -69,9 +70,9 @@ const isThresholdFields = ( export const filterRuleFieldsForType = (fields: T, type: RuleType) => { if (isMlRule(type)) { - const { index, queryBar, ...mlRuleFields } = fields; + const { index, queryBar, threshold, ...mlRuleFields } = fields; return mlRuleFields; - } else if (type === 'threshold') { + } else if (isThresholdRule(type)) { const { anomalyThreshold, machineLearningJobId, ...thresholdRuleFields } = fields; return thresholdRuleFields; } else { diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 8fc413236dd2c..f2fad16d80414 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -182,7 +182,7 @@ export class Plugin implements IPlugin Date: Tue, 28 Jul 2020 13:22:44 -0400 Subject: [PATCH 075/126] Fix adding new visualization from dashboard when session storage is enabled. --- .../application/dashboard_app_controller.tsx | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx index 2a0e2889575f3..afccf8deaa217 100644 --- a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx @@ -172,6 +172,10 @@ export class DashboardAppController { chrome.docTitle.change(dash.title); } + const incomingEmbeddable = embeddable + .getStateTransfer(scopedHistory()) + .getIncomingEmbeddablePackage(); + const dashboardStateManager = new DashboardStateManager({ savedDashboard: dash, hideWriteControls: dashboardConfig.getHideWriteControls(), @@ -444,21 +448,24 @@ export class DashboardAppController { refreshDashboardContainer(); }); - const incomingState = embeddable - .getStateTransfer(scopedHistory()) - .getIncomingEmbeddablePackage(); - if (incomingState) { - if ('id' in incomingState) { - container.addOrUpdateEmbeddable(incomingState.type, { - savedObjectId: incomingState.id, - }); - } else if ('input' in incomingState) { - const input = incomingState.input; + if (incomingEmbeddable) { + if ('id' in incomingEmbeddable) { + container.addOrUpdateEmbeddable( + incomingEmbeddable.type, + { + savedObjectId: incomingEmbeddable.id, + } + ); + } else if ('input' in incomingEmbeddable) { + const input = incomingEmbeddable.input; delete input.id; const explicitInput = { savedVis: input, }; - container.addOrUpdateEmbeddable(incomingState.type, explicitInput); + container.addOrUpdateEmbeddable( + incomingEmbeddable.type, + explicitInput + ); } } } From 2ea2f10c4652a848d2ff3c14cd1d327dc32ca1ee Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Tue, 28 Jul 2020 18:26:59 +0100 Subject: [PATCH 076/126] [Security Solution] Super select (#73271) * fix icon * fix items * Cleanup * match styling Co-authored-by: Elastic Machine Co-authored-by: Patryk Kopycinski --- .../timeline/search_super_select/index.tsx | 63 ++++++++++--------- .../timeline/selectable_timeline/index.tsx | 2 +- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_super_select/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_super_select/index.tsx index 825d4fe3b29b1..3019a8add4e36 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_super_select/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_super_select/index.tsx @@ -4,19 +4,41 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiInputPopover, EuiSelectableOption, EuiSuperSelect } from '@elastic/eui'; +import { EuiInputPopover, EuiSelectableOption, EuiFieldText } from '@elastic/eui'; import React, { memo, useCallback, useMemo, useState } from 'react'; -import { createGlobalStyle } from 'styled-components'; +import styled from 'styled-components'; import { OpenTimelineResult } from '../../open_timeline/types'; import { SelectableTimeline } from '../selectable_timeline'; import * as i18n from '../translations'; import { TimelineType, TimelineTypeLiteral } from '../../../../../common/types/timeline'; -const SearchTimelineSuperSelectGlobalStyle = createGlobalStyle` - .euiPopover__panel.euiPopover__panel-isOpen.timeline-search-super-select-popover__popoverPanel { - visibility: hidden; - z-index: 0; +const StyledEuiFieldText = styled(EuiFieldText)` + padding-left: 12px; + padding-right: 40px; + + &[readonly] { + cursor: pointer; + background-size: 0 100%; + background-repeat: no-repeat; + + // To match EuiFieldText focus state + &:focus { + background-color: #fff; + background-image: linear-gradient( + to top, + #006bb4, + #006bb4 2px, + transparent 2px, + transparent 100% + ); + background-size: 100% 100%; + } + } + + & + .euiFormControlLayoutIcons { + left: unset; + right: 12px; } `; @@ -29,13 +51,6 @@ interface SearchTimelineSuperSelectProps { onTimelineChange: (timelineTitle: string, timelineId: string | null) => void; } -const basicSuperSelectOptions = [ - { - value: '-1', - inputDisplay: i18n.DEFAULT_TIMELINE_TITLE, - }, -]; - const getBasicSelectableOptions = (timelineId: string) => [ { description: i18n.DEFAULT_TIMELINE_DESCRIPTION, @@ -67,26 +82,15 @@ const SearchTimelineSuperSelectComponent: React.FC ( - ), - [handleOpenPopover, isDisabled, timelineId, timelineTitle] + [handleOpenPopover, isDisabled, timelineTitle] ); const handleGetSelectableOptions = useCallback( @@ -126,7 +130,6 @@ const SearchTimelineSuperSelectComponent: React.FC - ); }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx index ae8bf53090789..7ecbc9a53cb21 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx @@ -165,7 +165,7 @@ const SelectableTimelineComponent: React.FC = ({ responsive={false} > - + From f61df057727c4adf0aa4bd1e72f108ec23945567 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Tue, 28 Jul 2020 10:57:38 -0700 Subject: [PATCH 077/126] Fix long combo box items breaking out of flex item width (#73351) --- .../components/package_config_input_config.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_package_config_page/components/package_config_input_config.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_package_config_page/components/package_config_input_config.tsx index 98f04dbd92659..fd3a64bc760a0 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_package_config_page/components/package_config_input_config.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_package_config_page/components/package_config_input_config.tsx @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import React, { useState, Fragment, memo, useMemo } from 'react'; +import styled from 'styled-components'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiFlexGrid, @@ -21,6 +22,10 @@ import { } from '../services'; import { PackageConfigInputVarField } from './package_config_input_var_field'; +const FlexItemWithMaxWidth = styled(EuiFlexItem)` + max-width: calc(50% - ${(props) => props.theme.eui.euiSizeL}); +`; + export const PackageConfigInputConfig: React.FunctionComponent<{ packageInputVars?: RegistryVarsEntry[]; packageConfigInput: PackageConfigInput; @@ -88,7 +93,7 @@ export const PackageConfigInputConfig: React.FunctionComponent<{ - + {requiredVars.map((varDef) => { const { name: varName, type: varType } = varDef; @@ -176,7 +181,7 @@ export const PackageConfigInputConfig: React.FunctionComponent<{ ) : null} - + ); } From 86b60bbc637471ca5211b31042b7dfd89bbd2f5e Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Tue, 28 Jul 2020 14:52:12 -0400 Subject: [PATCH 078/126] Mock prototype in unit test to prevent relative date breaking snapshots. (#73531) --- .../common/charts/__tests__/ping_histogram.test.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx index 57a38f2a949e7..73c6ee43ccd07 100644 --- a/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx +++ b/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx @@ -7,8 +7,13 @@ import React from 'react'; import { PingHistogramComponent, PingHistogramComponentProps } from '../ping_histogram'; import { renderWithRouter, shallowWithRouter, MountWithReduxProvider } from '../../../../lib'; +import moment from 'moment'; describe('PingHistogram component', () => { + beforeAll(() => { + moment.prototype.fromNow = jest.fn(() => 'a year ago'); + }); + const props: PingHistogramComponentProps = { absoluteStartDate: 1548697920000, absoluteEndDate: 1548700920000, From 2d8a41d3679ff77a60c6c417cdc10f88a4ed3203 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Tue, 28 Jul 2020 12:39:36 -0700 Subject: [PATCH 079/126] [Metrics UI] Make composite size configurable to avoid max buckets (#72955) Co-authored-by: Elastic Machine --- x-pack/plugins/infra/common/http_api/snapshot_api.ts | 1 + x-pack/plugins/infra/public/metrics_overview_fetchers.test.ts | 1 + x-pack/plugins/infra/public/metrics_overview_fetchers.ts | 1 + x-pack/plugins/infra/server/lib/snapshot/snapshot.ts | 4 ++-- x-pack/plugins/infra/server/routes/snapshot/index.ts | 2 ++ 5 files changed, 7 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/infra/common/http_api/snapshot_api.ts b/x-pack/plugins/infra/common/http_api/snapshot_api.ts index 9ddbcb17089f3..11cb57238f917 100644 --- a/x-pack/plugins/infra/common/http_api/snapshot_api.ts +++ b/x-pack/plugins/infra/common/http_api/snapshot_api.ts @@ -107,6 +107,7 @@ export const SnapshotRequestRT = rt.intersection([ region: rt.string, filterQuery: rt.union([rt.string, rt.null]), includeTimeseries: rt.boolean, + overrideCompositeSize: rt.number, }), ]); diff --git a/x-pack/plugins/infra/public/metrics_overview_fetchers.test.ts b/x-pack/plugins/infra/public/metrics_overview_fetchers.test.ts index 88bc426e9a0f7..135b4ea9a5335 100644 --- a/x-pack/plugins/infra/public/metrics_overview_fetchers.test.ts +++ b/x-pack/plugins/infra/public/metrics_overview_fetchers.test.ts @@ -75,6 +75,7 @@ describe('Metrics UI Observability Homepage Functions', () => { groupBy: [], nodeType: 'host', includeTimeseries: true, + overrideCompositeSize: 5, timerange: { from: startTime.valueOf(), to: endTime.valueOf(), diff --git a/x-pack/plugins/infra/public/metrics_overview_fetchers.ts b/x-pack/plugins/infra/public/metrics_overview_fetchers.ts index 4eaf903e17608..79e0850635138 100644 --- a/x-pack/plugins/infra/public/metrics_overview_fetchers.ts +++ b/x-pack/plugins/infra/public/metrics_overview_fetchers.ts @@ -87,6 +87,7 @@ export const createMetricsFetchData = ( groupBy: [], nodeType: 'host', includeTimeseries: true, + overrideCompositeSize: 5, timerange: { from: start, to: end, diff --git a/x-pack/plugins/infra/server/lib/snapshot/snapshot.ts b/x-pack/plugins/infra/server/lib/snapshot/snapshot.ts index 9ca10d5e39da7..5f359b0523d9f 100644 --- a/x-pack/plugins/infra/server/lib/snapshot/snapshot.ts +++ b/x-pack/plugins/infra/server/lib/snapshot/snapshot.ts @@ -86,7 +86,7 @@ const requestGroupedNodes = async ( aggregations: { nodes: { composite: { - size: SNAPSHOT_COMPOSITE_REQUEST_SIZE, + size: options.overrideCompositeSize || SNAPSHOT_COMPOSITE_REQUEST_SIZE, sources: getGroupedNodesSources(options), }, aggs: { @@ -142,7 +142,7 @@ const requestNodeMetrics = async ( aggregations: { nodes: { composite: { - size: SNAPSHOT_COMPOSITE_REQUEST_SIZE, + size: options.overrideCompositeSize || SNAPSHOT_COMPOSITE_REQUEST_SIZE, sources: getMetricsSources(options), }, aggregations: { diff --git a/x-pack/plugins/infra/server/routes/snapshot/index.ts b/x-pack/plugins/infra/server/routes/snapshot/index.ts index 7c81c6eef675f..e99103080463e 100644 --- a/x-pack/plugins/infra/server/routes/snapshot/index.ts +++ b/x-pack/plugins/infra/server/routes/snapshot/index.ts @@ -40,6 +40,7 @@ export const initSnapshotRoute = (libs: InfraBackendLibs) => { accountId, region, includeTimeseries, + overrideCompositeSize, } = pipe( SnapshotRequestRT.decode(request.body), fold(throwErrors(Boom.badRequest), identity) @@ -59,6 +60,7 @@ export const initSnapshotRoute = (libs: InfraBackendLibs) => { metrics, timerange, includeTimeseries, + overrideCompositeSize, }; const searchES = ( From 5e624502f82085802333c225882e0d91665355e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Kopyci=C5=84ski?= Date: Tue, 28 Jul 2020 22:13:02 +0200 Subject: [PATCH 080/126] [Security Solution] Fix query fetchPolicy and deduplication (#73199) --- .../components/events_viewer/events_viewer.tsx | 1 + .../common/components/events_viewer/index.tsx | 5 ++++- .../common/components/events_viewer/mock.ts | 1 + .../public/common/containers/source/index.tsx | 17 +++++++++++++---- .../components/alerts_table/index.tsx | 7 ++++--- .../components/rules/step_about_rule/index.tsx | 3 ++- .../components/rules/step_define_rule/index.tsx | 2 +- .../rules/fetch_index_patterns.tsx | 2 +- .../timelines/components/timeline/timeline.tsx | 1 + .../public/timelines/containers/index.tsx | 9 ++++++++- 10 files changed, 36 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx b/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx index bc036b38524ba..e836e2e20432a 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx @@ -222,6 +222,7 @@ const EventsViewerComponent: React.FC = ({ sourceId="default" startDate={start} endDate={end} + queryDeduplication="events_viewer" > {({ events, diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx b/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx index 80831b4022ace..c402116ee2714 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx @@ -69,7 +69,10 @@ const StatefulEventsViewerComponent: React.FC = ({ }) => { const [ { docValueFields, browserFields, indexPatterns, isLoading: isLoadingIndexPattern }, - ] = useFetchIndexPatterns(defaultIndices ?? useUiSetting(DEFAULT_INDEX_KEY)); + ] = useFetchIndexPatterns( + defaultIndices ?? useUiSetting(DEFAULT_INDEX_KEY), + 'events_viewer' + ); useEffect(() => { if (createTimeline != null) { diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/mock.ts b/x-pack/plugins/security_solution/public/common/components/events_viewer/mock.ts index ea2e60ebc82b8..6266e84051901 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/mock.ts +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/mock.ts @@ -40,6 +40,7 @@ export const mockEventViewerResponse = [ { field: 'event.end', format: 'date_time' }, ], inspect: false, + queryDeduplication: 'events_viewer', }, }, result: { diff --git a/x-pack/plugins/security_solution/public/common/containers/source/index.tsx b/x-pack/plugins/security_solution/public/common/containers/source/index.tsx index 54d49d7279d68..ffbecf9e3d433 100644 --- a/x-pack/plugins/security_solution/public/common/containers/source/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/source/index.tsx @@ -122,7 +122,12 @@ interface UseWithSourceState { export const useWithSource = ( sourceId = 'default', indexToAdd?: string[] | null, - onlyCheckIndexToAdd?: boolean + onlyCheckIndexToAdd?: boolean, + // Fun fact: When using this hook multiple times within a component (e.g. add_exception_modal & edit_exception_modal), + // the apolloClient will perform queryDeduplication and prevent the first query from executing. A deep compare is not + // performed on `indices`, so another field must be passed to circumvent this. + // For details, see https://github.com/apollographql/react-apollo/issues/2202 + queryDeduplication = 'default' ) => { const [configIndex] = useUiSetting$(DEFAULT_INDEX_KEY); const defaultIndex = useMemo(() => { @@ -154,12 +159,16 @@ export const useWithSource = ( setState((prevState) => ({ ...prevState, loading: true })); try { - const result = await apolloClient.query({ + const result = await apolloClient.query< + SourceQuery.Query, + SourceQuery.Variables & { queryDeduplication: string } + >({ query: sourceQuery, - fetchPolicy: 'network-only', + fetchPolicy: 'cache-first', variables: { sourceId, defaultIndex, + queryDeduplication, }, context: { fetchOptions: { @@ -206,7 +215,7 @@ export const useWithSource = ( isSubscribed = false; return abortCtrl.abort(); }; - }, [apolloClient, sourceId, defaultIndex]); + }, [apolloClient, sourceId, defaultIndex, queryDeduplication]); return state; }; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/index.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/index.tsx index 1eda358fe5944..ab95e433d92f3 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/index.tsx @@ -116,8 +116,9 @@ export const AlertsTableComponent: React.FC = ({ const [addExceptionModalState, setAddExceptionModalState] = useState( addExceptionModalInitialState ); - const [{ browserFields, indexPatterns }] = useFetchIndexPatterns( - signalsIndex !== '' ? [signalsIndex] : [] + const [{ browserFields, indexPatterns, isLoading: indexPatternsLoading }] = useFetchIndexPatterns( + signalsIndex !== '' ? [signalsIndex] : [], + 'alerts_table' ); const kibana = useKibana(); const [, dispatchToaster] = useStateToaster(); @@ -433,7 +434,7 @@ export const AlertsTableComponent: React.FC = ({ closeAddExceptionModal, ]); - if (loading || isEmpty(signalsIndex)) { + if (loading || indexPatternsLoading || isEmpty(signalsIndex)) { return ( diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/index.tsx index ec812fa63eadf..5edf6f0a9312e 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/index.tsx @@ -74,7 +74,8 @@ const StepAboutRuleComponent: FC = ({ const initialState = defaultValues ?? stepAboutDefaultValue; const [myStepData, setMyStepData] = useState(initialState); const [{ isLoading: indexPatternLoading, indexPatterns }] = useFetchIndexPatterns( - defineRuleData?.index ?? [] + defineRuleData?.index ?? [], + 'step_about_rule' ); const canUseExceptions = defineRuleData?.ruleType && diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx index 51e9291f31941..3d5b66b8869cc 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx @@ -117,7 +117,7 @@ const StepDefineRuleComponent: FC = ({ const [myStepData, setMyStepData] = useState(initialState); const [ { browserFields, indexPatterns: indexPatternQueryBar, isLoading: indexPatternLoadingQueryBar }, - ] = useFetchIndexPatterns(myStepData.index); + ] = useFetchIndexPatterns(myStepData.index, 'step_define_rule'); const { form } = useForm({ defaultValue: initialState, diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/fetch_index_patterns.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/fetch_index_patterns.tsx index c0997a5e62908..82c9292af7451 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/fetch_index_patterns.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/fetch_index_patterns.tsx @@ -77,7 +77,7 @@ export const useFetchIndexPatterns = ( apolloClient .query({ query: sourceQuery, - fetchPolicy: 'network-only', + fetchPolicy: 'cache-first', variables: { sourceId: 'default', defaultIndex: indices, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx index c27af94addeab..a2ee1e56306b5 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx @@ -286,6 +286,7 @@ export const TimelineComponent: React.FC = ({ filterQuery={combinedQueries!.filterQuery} sortField={timelineQuerySortField} startDate={start} + queryDeduplication="timeline" > {({ events, diff --git a/x-pack/plugins/security_solution/public/timelines/containers/index.tsx b/x-pack/plugins/security_solution/public/timelines/containers/index.tsx index 510d58dbe6a69..562999108b4b0 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/containers/index.tsx @@ -58,6 +58,7 @@ export interface OwnProps extends QueryTemplateProps { sortField: SortField; fields: string[]; startDate: string; + queryDeduplication: string; } type TimelineQueryProps = OwnProps & PropsFromRedux & WithKibanaProps & CustomReduxProps; @@ -93,6 +94,7 @@ class TimelineQueryComponent extends QueryTemplate< sourceId, sortField, startDate, + queryDeduplication, } = this.props; const defaultKibanaIndex = kibana.services.uiSettings.get(DEFAULT_INDEX_KEY); const defaultIndex = @@ -102,7 +104,11 @@ class TimelineQueryComponent extends QueryTemplate< ...(['all', 'alert', 'signal'].includes(eventType) ? indexToAdd : []), ] : indexPattern?.title.split(',') ?? []; - const variables: GetTimelineQuery.Variables = { + // Fun fact: When using this hook multiple times within a component (e.g. add_exception_modal & edit_exception_modal), + // the apolloClient will perform queryDeduplication and prevent the first query from executing. A deep compare is not + // performed on `indices`, so another field must be passed to circumvent this. + // For details, see https://github.com/apollographql/react-apollo/issues/2202 + const variables: GetTimelineQuery.Variables & { queryDeduplication: string } = { fieldRequested: fields, filterQuery: createFilter(filterQuery), sourceId, @@ -116,6 +122,7 @@ class TimelineQueryComponent extends QueryTemplate< defaultIndex, docValueFields: docValueFields ?? [], inspect: isInspected, + queryDeduplication, }; return ( From 0b3dab7318c49e95a53c5f207bd1a850f0c2ef8a Mon Sep 17 00:00:00 2001 From: Garrett Spong Date: Tue, 28 Jul 2020 14:25:32 -0600 Subject: [PATCH 081/126] [Security Solution][Detections] Fixes Risk Score and Severity mapping issues (#73233) ## Summary Fixes the following issues around Risk Score/Severity mapping: * Severity override option cannot be unselected during rule creation * Risk score override option cannot be unselected during rule creation * Cannot fill Critical Severity override at the first attempt * Cannot create a rule with just a Critical severity override Note: When editing rules there is the possibility of the mapping fields remaining `disabled` as they are locked to the 'isLoading' flag from the gql `useFetchIndexPatterns` call, which can sometimes not return/get stuck as loading. @patrykkopycinski has a draft PR to fix this here: https://github.com/elastic/kibana/pull/73199 cc @MadameSheema ##### Severity Mapping Fixes:

      Now distinguishes between empty string/value

      ##### Risk Score Mapping Fixes:

      ### Checklist Delete any items that are not applicable to this PR. - [X] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md) - [X] [Documentation](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#writing-documentation) was added for features that require explanation or tutorials * Working with @benskelker on API docs. This PR adds `risk_score` (can be `undefined`) to `risk_score.mapping` for future compatibility with mapping to specific risk score values. - [X] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios --- .../schemas/common/schemas.ts | 3 +- .../rules/description_step/helpers.test.tsx | 1 + .../rules/description_step/helpers.tsx | 114 ++++---- .../rules/risk_score_mapping/index.tsx | 66 ++--- .../rules/severity_mapping/index.tsx | 248 ++++++++++-------- .../rules/step_about_rule/default_value.ts | 5 +- .../rules/step_about_rule/index.test.tsx | 9 +- .../rules/step_about_rule/schema.tsx | 10 +- .../rules/all/__mocks__/mock.ts | 5 +- .../detection_engine/rules/create/helpers.ts | 8 +- .../detection_engine/rules/helpers.test.tsx | 5 +- .../pages/detection_engine/rules/helpers.tsx | 24 +- .../pages/detection_engine/rules/types.ts | 2 + .../mappings/build_risk_score_from_mapping.ts | 9 +- 14 files changed, 294 insertions(+), 215 deletions(-) diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts index 273ea72a2ffe3..21fa780badd84 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts @@ -222,8 +222,9 @@ export const risk_score_mapping_value = t.string; export const risk_score_mapping_item = t.exact( t.type({ field: risk_score_mapping_field, - operator, value: risk_score_mapping_value, + operator, + risk_score: riskScoreOrUndefined, }) ); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/helpers.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/helpers.test.tsx index 2a6cd3fc5bb7a..0d98a0f2f26ff 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/helpers.test.tsx @@ -331,6 +331,7 @@ describe('helpers', () => { const result: ListItems[] = buildSeverityDescription({ value: 'low', mapping: [{ field: 'host.name', operator: 'equals', value: 'hello', severity: 'high' }], + isMappingChecked: true, }); expect(result[0].title).toEqual('Severity'); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/helpers.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/helpers.tsx index 1110c8c098988..600bc999849d1 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/helpers.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/helpers.tsx @@ -35,6 +35,7 @@ import { SeverityBadge } from '../severity_badge'; import ListTreeIcon from './assets/list_tree_icon.svg'; import { assertUnreachable } from '../../../../common/lib/helpers'; import { AboutStepRiskScore, AboutStepSeverity } from '../../../pages/detection_engine/rules/types'; +import { defaultToEmptyTag } from '../../../../common/components/empty_value'; const NoteDescriptionContainer = styled(EuiFlexItem)` height: 105px; @@ -236,35 +237,44 @@ export const buildSeverityDescription = (severity: AboutStepSeverity): ListItems title: i18nSeverity.DEFAULT_SEVERITY, description: , }, - ...severity.mapping.map((severityItem, index) => { - return { - title: index === 0 ? i18nSeverity.SEVERITY_MAPPING : '', - description: ( - - - - <>{severityItem.field} - - - - <>{severityItem.value} - - - - - - - - - ), - }; - }), + ...(severity.isMappingChecked + ? severity.mapping + .filter((severityItem) => severityItem.field !== '') + .map((severityItem, index) => { + return { + title: index === 0 ? i18nSeverity.SEVERITY_MAPPING : '', + description: ( + + + + <>{`${severityItem.field}:`} + + + + + {defaultToEmptyTag(severityItem.value)} + + + + + + + + + + ), + }; + }) + : []), ]; export const buildRiskScoreDescription = (riskScore: AboutStepRiskScore): ListItems[] => [ @@ -272,27 +282,31 @@ export const buildRiskScoreDescription = (riskScore: AboutStepRiskScore): ListIt title: i18nRiskScore.RISK_SCORE, description: riskScore.value, }, - ...riskScore.mapping.map((riskScoreItem, index) => { - return { - title: index === 0 ? i18nRiskScore.RISK_SCORE_MAPPING : '', - description: ( - - - - <>{riskScoreItem.field} - - - - - - {'signal.rule.risk_score'} - - ), - }; - }), + ...(riskScore.isMappingChecked + ? riskScore.mapping + .filter((riskScoreItem) => riskScoreItem.field !== '') + .map((riskScoreItem, index) => { + return { + title: index === 0 ? i18nRiskScore.RISK_SCORE_MAPPING : '', + description: ( + + + + <>{riskScoreItem.field} + + + + + + {'signal.rule.risk_score'} + + ), + }; + }) + : []), ]; const MyRefUrlLink = styled(EuiLink)` diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/risk_score_mapping/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/risk_score_mapping/index.tsx index c9e2cb1a8ca24..35816e82540d1 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/risk_score_mapping/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/risk_score_mapping/index.tsx @@ -14,8 +14,9 @@ import { EuiIcon, EuiSpacer, } from '@elastic/eui'; -import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import React, { useCallback, useMemo } from 'react'; import styled from 'styled-components'; +import { noop } from 'lodash/fp'; import * as i18n from './translations'; import { FieldHook } from '../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib'; import { CommonUseField } from '../../../../cases/components/create'; @@ -24,6 +25,10 @@ import { FieldComponent } from '../../../../common/components/autocomplete/field import { IFieldType } from '../../../../../../../../src/plugins/data/common/index_patterns/fields'; import { IIndexPattern } from '../../../../../../../../src/plugins/data/common/index_patterns'; +const RiskScoreMappingEuiFormRow = styled(EuiFormRow)` + width: 468px; +`; + const NestedContent = styled.div` margin-left: 24px; `; @@ -41,6 +46,7 @@ interface RiskScoreFieldProps { field: FieldHook; idAria: string; indices: IIndexPattern; + isDisabled: boolean; placeholder?: string; } @@ -49,40 +55,23 @@ export const RiskScoreField = ({ field, idAria, indices, + isDisabled, placeholder, }: RiskScoreFieldProps) => { - const [isRiskScoreMappingChecked, setIsRiskScoreMappingChecked] = useState(false); - const [initialFieldCheck, setInitialFieldCheck] = useState(true); - const fieldTypeFilter = useMemo(() => ['number'], []); - useEffect(() => { - if ( - !isRiskScoreMappingChecked && - initialFieldCheck && - (field.value as AboutStepRiskScore).mapping?.length > 0 - ) { - setIsRiskScoreMappingChecked(true); - setInitialFieldCheck(false); - } - }, [ - field, - initialFieldCheck, - isRiskScoreMappingChecked, - setIsRiskScoreMappingChecked, - setInitialFieldCheck, - ]); - const handleFieldChange = useCallback( ([newField]: IFieldType[]): void => { const values = field.value as AboutStepRiskScore; field.setValue({ value: values.value, + isMappingChecked: values.isMappingChecked, mapping: [ { field: newField?.name ?? '', operator: 'equals', - value: '', + value: undefined, + riskScore: undefined, }, ], }); @@ -99,8 +88,13 @@ export const RiskScoreField = ({ }, [field.value, indices]); const handleRiskScoreMappingChecked = useCallback(() => { - setIsRiskScoreMappingChecked(!isRiskScoreMappingChecked); - }, [isRiskScoreMappingChecked, setIsRiskScoreMappingChecked]); + const values = field.value as AboutStepRiskScore; + field.setValue({ + value: values.value, + mapping: [...values.mapping], + isMappingChecked: !values.isMappingChecked, + }); + }, [field]); const riskScoreLabel = useMemo(() => { return ( @@ -117,11 +111,16 @@ export const RiskScoreField = ({ const riskScoreMappingLabel = useMemo(() => { return (
      - + @@ -133,7 +132,7 @@ export const RiskScoreField = ({
      ); - }, [handleRiskScoreMappingChecked, isRiskScoreMappingChecked]); + }, [field.value, handleRiskScoreMappingChecked, isDisabled]); return ( @@ -153,6 +152,7 @@ export const RiskScoreField = ({ componentProps={{ idAria: 'detectionEngineStepAboutRuleRiskScore', 'data-test-subj': 'detectionEngineStepAboutRuleRiskScore', + isDisabled, euiFieldProps: { max: 100, min: 0, @@ -166,11 +166,11 @@ export const RiskScoreField = ({ - {i18n.RISK_SCORE_MAPPING_DETAILS} ) : ( '' @@ -184,7 +184,7 @@ export const RiskScoreField = ({ > - {isRiskScoreMappingChecked && ( + {(field.value as AboutStepRiskScore).isMappingChecked && ( @@ -208,11 +208,11 @@ export const RiskScoreField = ({ fieldTypeFilter={fieldTypeFilter} isLoading={false} isClearable={false} - isDisabled={false} + isDisabled={isDisabled} onChange={handleFieldChange} data-test-subj={dataTestSubj} aria-label={idAria} - fieldInputWidth={230} + fieldInputWidth={270} /> @@ -226,7 +226,7 @@ export const RiskScoreField = ({ )} - + ); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/severity_mapping/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/severity_mapping/index.tsx index 579c60579b32e..54d505a4d867f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/severity_mapping/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/severity_mapping/index.tsx @@ -14,7 +14,8 @@ import { EuiIcon, EuiSpacer, } from '@elastic/eui'; -import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { noop } from 'lodash/fp'; +import React, { useCallback, useMemo } from 'react'; import styled from 'styled-components'; import * as i18n from './translations'; import { FieldHook } from '../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib'; @@ -27,10 +28,16 @@ import { } from '../../../../../../../../src/plugins/data/common/index_patterns'; import { FieldComponent } from '../../../../common/components/autocomplete/field'; import { AutocompleteFieldMatchComponent } from '../../../../common/components/autocomplete/field_value_match'; +import { + Severity, + SeverityMapping, + SeverityMappingItem, +} from '../../../../../common/detection_engine/schemas/common/schemas'; -const SeverityMappingParentContainer = styled(EuiFlexItem)` - max-width: 471px; +const SeverityMappingEuiFormRow = styled(EuiFormRow)` + width: 468px; `; + const NestedContent = styled.div` margin-left: 24px; `; @@ -48,6 +55,7 @@ interface SeverityFieldProps { field: FieldHook; idAria: string; indices: IIndexPattern; + isDisabled: boolean; options: SeverityOptionItem[]; } @@ -56,42 +64,20 @@ export const SeverityField = ({ field, idAria, indices, + isDisabled, options, }: SeverityFieldProps) => { - const [isSeverityMappingChecked, setIsSeverityMappingChecked] = useState(false); - const [initialFieldCheck, setInitialFieldCheck] = useState(true); const fieldValueInputWidth = 160; - useEffect(() => { - if ( - !isSeverityMappingChecked && - initialFieldCheck && - (field.value as AboutStepSeverity).mapping?.length > 0 - ) { - setIsSeverityMappingChecked(true); - setInitialFieldCheck(false); - } - }, [ - field, - initialFieldCheck, - isSeverityMappingChecked, - setIsSeverityMappingChecked, - setInitialFieldCheck, - ]); - - const handleFieldChange = useCallback( - (index: number, severity: string, [newField]: IFieldType[]): void => { + const handleFieldValueChange = useCallback( + (newMappingItems: SeverityMapping, index: number): void => { const values = field.value as AboutStepSeverity; field.setValue({ value: values.value, + isMappingChecked: values.isMappingChecked, mapping: [ ...values.mapping.slice(0, index), - { - ...values.mapping[index], - field: newField?.name ?? '', - operator: 'equals', - severity, - }, + ...newMappingItems, ...values.mapping.slice(index + 1), ], }); @@ -99,40 +85,59 @@ export const SeverityField = ({ [field] ); + const handleFieldChange = useCallback( + (index: number, severity: Severity, [newField]: IFieldType[]): void => { + const values = field.value as AboutStepSeverity; + const newMappingItems: SeverityMapping = [ + { + ...values.mapping[index], + field: newField?.name ?? '', + value: newField != null ? values.mapping[index].value : '', + operator: 'equals', + severity, + }, + ]; + handleFieldValueChange(newMappingItems, index); + }, + [field, handleFieldValueChange] + ); + const handleFieldMatchValueChange = useCallback( - (index: number, severity: string, newMatchValue: string): void => { + (index: number, severity: Severity, newMatchValue: string): void => { const values = field.value as AboutStepSeverity; - field.setValue({ - value: values.value, - mapping: [ - ...values.mapping.slice(0, index), - { - ...values.mapping[index], - value: newMatchValue, - operator: 'equals', - severity, - }, - ...values.mapping.slice(index + 1), - ], - }); + const newMappingItems: SeverityMapping = [ + { + ...values.mapping[index], + field: values.mapping[index].field, + value: + values.mapping[index].field != null && values.mapping[index].field !== '' + ? newMatchValue + : '', + operator: 'equals', + severity, + }, + ]; + handleFieldValueChange(newMappingItems, index); }, - [field] + [field, handleFieldValueChange] ); - const selectedState = useMemo(() => { - return ( - (field.value as AboutStepSeverity).mapping?.map((mapping) => { - const [newSelectedField] = indices.fields.filter( - ({ name }) => mapping.field != null && mapping.field === name - ); - return { field: newSelectedField, value: mapping.value }; - }) ?? [] - ); - }, [field.value, indices]); + const getIFieldTypeFromFieldName = ( + fieldName: string | undefined, + iIndexPattern: IIndexPattern + ): IFieldType | undefined => { + const [iFieldType] = iIndexPattern.fields.filter(({ name }) => fieldName === name); + return iFieldType; + }; - const handleSeverityMappingSelected = useCallback(() => { - setIsSeverityMappingChecked(!isSeverityMappingChecked); - }, [isSeverityMappingChecked, setIsSeverityMappingChecked]); + const handleSeverityMappingChecked = useCallback(() => { + const values = field.value as AboutStepSeverity; + field.setValue({ + value: values.value, + mapping: [...values.mapping], + isMappingChecked: !values.isMappingChecked, + }); + }, [field]); const severityLabel = useMemo(() => { return ( @@ -149,12 +154,17 @@ export const SeverityField = ({ const severityMappingLabel = useMemo(() => { return (
      - + {i18n.SEVERITY_MAPPING} @@ -165,7 +175,7 @@ export const SeverityField = ({
      ); - }, [handleSeverityMappingSelected, isSeverityMappingChecked]); + }, [field.value, handleSeverityMappingChecked, isDisabled]); return ( @@ -185,6 +195,7 @@ export const SeverityField = ({ componentProps={{ idAria: 'detectionEngineStepAboutRuleSeverity', 'data-test-subj': 'detectionEngineStepAboutRuleSeverity', + isDisabled, euiFieldProps: { fullWidth: false, disabled: false, @@ -195,12 +206,12 @@ export const SeverityField = ({ - - + {i18n.SEVERITY_MAPPING_DETAILS} ) : ( '' @@ -214,7 +225,7 @@ export const SeverityField = ({ > - {isSeverityMappingChecked && ( + {(field.value as AboutStepSeverity).isMappingChecked && ( @@ -231,53 +242,72 @@ export const SeverityField = ({ - {options.map((option, index) => ( - - - - - + {(field.value as AboutStepSeverity).mapping.map( + (severityMappingItem: SeverityMappingItem, index) => ( + + + + + - - - - - - - - {option.inputDisplay} - - - - ))} + + + + + + + + { + options.find((o) => o.value === severityMappingItem.severity) + ?.inputDisplay + } + + + + ) + )} )} - - + + ); }; diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/default_value.ts b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/default_value.ts index f5d61553b595b..b9c3e4f84c18e 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/default_value.ts +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/default_value.ts @@ -5,6 +5,7 @@ */ import { AboutStepRule } from '../../../pages/detection_engine/rules/types'; +import { fillEmptySeverityMappings } from '../../../pages/detection_engine/rules/helpers'; export const threatDefault = [ { @@ -21,8 +22,8 @@ export const stepAboutDefaultValue: AboutStepRule = { isAssociatedToEndpointList: false, isBuildingBlock: false, isNew: true, - severity: { value: 'low', mapping: [] }, - riskScore: { value: 50, mapping: [] }, + severity: { value: 'low', mapping: fillEmptySeverityMappings([]), isMappingChecked: false }, + riskScore: { value: 50, mapping: [], isMappingChecked: false }, references: [''], falsePositives: [''], license: '', diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/index.test.tsx index a86c1b7ce1bea..cb3fd5e5bec32 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/index.test.tsx @@ -16,6 +16,7 @@ import { stepAboutDefaultValue } from './default_value'; // we don't have the types for waitFor just yet, so using "as waitFor" until when we do import { wait as waitFor } from '@testing-library/react'; import { AboutStepRule } from '../../../pages/detection_engine/rules/types'; +import { fillEmptySeverityMappings } from '../../../pages/detection_engine/rules/helpers'; const theme = () => ({ eui: euiDarkVars, darkMode: true }); @@ -176,8 +177,8 @@ describe('StepAboutRuleComponent', () => { name: 'Test name text', note: '', references: [''], - riskScore: { value: 50, mapping: [] }, - severity: { value: 'low', mapping: [] }, + riskScore: { value: 50, mapping: [], isMappingChecked: false }, + severity: { value: 'low', mapping: fillEmptySeverityMappings([]), isMappingChecked: false }, tags: [], threat: [ { @@ -236,8 +237,8 @@ describe('StepAboutRuleComponent', () => { name: 'Test name text', note: '', references: [''], - riskScore: { value: 80, mapping: [] }, - severity: { value: 'low', mapping: [] }, + riskScore: { value: 80, mapping: [], isMappingChecked: false }, + severity: { value: 'low', mapping: fillEmptySeverityMappings([]), isMappingChecked: false }, tags: [], threat: [ { diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/schema.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/schema.tsx index fbd03850eee75..20470d7bb924f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/schema.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/schema.tsx @@ -117,18 +117,16 @@ export const schema: FormSchema = { }, ], }, - mapping: { - type: FIELD_TYPES.TEXT, - }, + mapping: {}, + isMappingChecked: {}, }, riskScore: { value: { type: FIELD_TYPES.RANGE, serializer: (input: string) => Number(input), }, - mapping: { - type: FIELD_TYPES.TEXT, - }, + mapping: {}, + isMappingChecked: {}, }, references: { label: i18n.translate( diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/__mocks__/mock.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/__mocks__/mock.ts index 14cf476e66563..7a6b61f0dfd89 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/__mocks__/mock.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/__mocks__/mock.ts @@ -9,6 +9,7 @@ import { Rule, RuleError } from '../../../../../containers/detection_engine/rule import { List } from '../../../../../../../common/detection_engine/schemas/types'; import { AboutStepRule, ActionsStepRule, DefineStepRule, ScheduleStepRule } from '../../types'; import { FieldValueQueryBar } from '../../../../../components/rules/query_bar'; +import { fillEmptySeverityMappings } from '../../helpers'; export const mockQueryBar: FieldValueQueryBar = { query: { @@ -175,8 +176,8 @@ export const mockAboutStepRule = (isNew = false): AboutStepRule => ({ license: 'Elastic License', name: 'Query with rule-id', description: '24/7', - severity: { value: 'low', mapping: [] }, - riskScore: { value: 21, mapping: [] }, + riskScore: { value: 21, mapping: [], isMappingChecked: false }, + severity: { value: 'low', mapping: fillEmptySeverityMappings([]), isMappingChecked: false }, references: ['www.test.co'], falsePositives: ['test'], tags: ['tag1', 'tag2'], diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts index 705013beb750f..8b03f62fc82bd 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts @@ -189,10 +189,14 @@ export const formatAboutStepData = ( false_positives: falsePositives.filter((item) => !isEmpty(item)), references: references.filter((item) => !isEmpty(item)), risk_score: riskScore.value, - risk_score_mapping: riskScore.mapping, + risk_score_mapping: riskScore.isMappingChecked + ? riskScore.mapping.filter((m) => m.field != null && m.field !== '') + : [], rule_name_override: ruleNameOverride !== '' ? ruleNameOverride : undefined, severity: severity.value, - severity_mapping: severity.mapping, + severity_mapping: severity.isMappingChecked + ? severity.mapping.filter((m) => m.field != null && m.field !== '' && m.value != null) + : [], threat: threat .filter((singleThreat) => singleThreat.tactic.name !== 'none') .map((singleThreat) => ({ diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx index b40243efcfb46..10a20807d6f87 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx @@ -17,6 +17,7 @@ import { getPrePackagedTimelineStatus, determineDetailsValue, userHasNoPermissions, + fillEmptySeverityMappings, } from './helpers'; import { mockRuleWithEverything, mockRule } from './all/__mocks__/mock'; import { esFilters } from '../../../../../../../../src/plugins/data/public'; @@ -97,9 +98,9 @@ describe('rule helpers', () => { name: 'Query with rule-id', note: '# this is some markdown documentation', references: ['www.test.co'], - riskScore: { value: 21, mapping: [] }, + riskScore: { value: 21, mapping: [], isMappingChecked: false }, ruleNameOverride: 'message', - severity: { value: 'low', mapping: [] }, + severity: { value: 'low', mapping: fillEmptySeverityMappings([]), isMappingChecked: false }, tags: ['tag1', 'tag2'], threat: [ { diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.tsx index 8f8967f2ff6d5..f9279ce639534 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.tsx @@ -24,6 +24,8 @@ import { ScheduleStepRule, ActionsStepRule, } from './types'; +import { SeverityMapping } from '../../../../../common/detection_engine/schemas/common/schemas'; +import { severityOptions } from '../../../components/rules/step_about_rule/data'; export interface GetStepsData { aboutRuleData: AboutStepRule; @@ -150,18 +152,38 @@ export const getAboutStepsData = (rule: Rule, detailsView: boolean): AboutStepRu references, severity: { value: severity, - mapping: severityMapping, + mapping: fillEmptySeverityMappings(severityMapping), + isMappingChecked: severityMapping.length > 0, }, tags, riskScore: { value: riskScore, mapping: riskScoreMapping, + isMappingChecked: riskScoreMapping.length > 0, }, falsePositives, threat: threat as IMitreEnterpriseAttack[], }; }; +const severitySortMapping = { + low: 0, + medium: 1, + high: 2, + critical: 3, +}; + +export const fillEmptySeverityMappings = (mappings: SeverityMapping): SeverityMapping => { + const missingMappings: SeverityMapping = severityOptions.flatMap((so) => + mappings.find((mapping) => mapping.severity === so.value) == null + ? [{ field: '', value: '', operator: 'equals', severity: so.value }] + : [] + ); + return [...mappings, ...missingMappings].sort( + (a, b) => severitySortMapping[a.severity] - severitySortMapping[b.severity] + ); +}; + export const determineDetailsValue = ( rule: Rule, detailsView: boolean diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/types.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/types.ts index 23715a88efc7b..e36f08703dae5 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/types.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/types.ts @@ -88,11 +88,13 @@ export interface AboutStepRuleDetails { export interface AboutStepSeverity { value: string; mapping: SeverityMapping; + isMappingChecked: boolean; } export interface AboutStepRiskScore { value: number; mapping: RiskScoreMapping; + isMappingChecked: boolean; } export interface DefineStepRule extends StepRuleData { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/mappings/build_risk_score_from_mapping.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/mappings/build_risk_score_from_mapping.ts index 356cf95fc0d24..888642f77af60 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/mappings/build_risk_score_from_mapping.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/mappings/build_risk_score_from_mapping.ts @@ -10,7 +10,6 @@ import { RiskScoreMappingOrUndefined, } from '../../../../../common/detection_engine/schemas/common/schemas'; import { SignalSourceHit } from '../types'; -import { RiskScore as RiskScoreIOTS } from '../../../../../common/detection_engine/schemas/types'; interface BuildRiskScoreFromMappingProps { doc: SignalSourceHit; @@ -33,8 +32,12 @@ export const buildRiskScoreFromMapping = ({ const mappedField = riskScoreMapping[0].field; // TODO: Expand by verifying fieldType from index via doc._index const mappedValue = get(mappedField, doc._source); - // TODO: This doesn't seem to validate...identified riskScore > 100 😬 - if (RiskScoreIOTS.is(mappedValue)) { + if ( + typeof mappedValue === 'number' && + Number.isSafeInteger(mappedValue) && + mappedValue >= 0 && + mappedValue <= 100 + ) { return { riskScore: mappedValue, riskScoreMeta: { riskScoreOverridden: true } }; } } From 48bb7c79c4af062dfdb1acb65dc4c0e1332a8824 Mon Sep 17 00:00:00 2001 From: Zacqary Adam Xeper Date: Tue, 28 Jul 2020 15:56:06 -0500 Subject: [PATCH 082/126] [Metrics UI] Fix filterQuery on Inventory alert preview (#73329) Co-authored-by: Elastic Machine --- .../infra/public/alerting/inventory/components/expression.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx index 8d36262b55792..583cbe18ee9db 100644 --- a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx +++ b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx @@ -364,7 +364,7 @@ export const Expressions: React.FC = (props) => { Date: Tue, 28 Jul 2020 17:12:57 -0400 Subject: [PATCH 083/126] [Ingest Manager] Fix enrollment key selection (#73062) --- .../sections/fleet/agent_list_page/index.tsx | 4 +- .../config_selection.tsx | 147 +++++++++++------- 2 files changed, 92 insertions(+), 59 deletions(-) diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx index c10378f48a8d1..c52f8447214a0 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx @@ -536,9 +536,9 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { ), }} /> - ) : !isLoading && totalAgents === 0 ? ( + ) : ( emptyPrompt - ) : undefined + ) } items={totalAgents ? agents : []} itemId="id" diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_enrollment_flyout/config_selection.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_enrollment_flyout/config_selection.tsx index 09b00240dc127..e98ebb7cadc7c 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_enrollment_flyout/config_selection.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_enrollment_flyout/config_selection.tsx @@ -39,71 +39,105 @@ export const EnrollmentStepAgentConfig: React.FC = (props) => { enrollmentAPIKeyId?: string; }>({}); - useEffect(() => { - if (agentConfigs && agentConfigs.length && !selectedState.agentConfigId) { - setSelectedState({ - ...selectedState, - agentConfigId: agentConfigs[0].id, - }); - } - }, [agentConfigs, selectedState]); + useEffect( + function triggerOnConfigChangeEffect() { + if (onConfigChange && selectedState.agentConfigId) { + onConfigChange(selectedState.agentConfigId); + } + }, + [selectedState.agentConfigId, onConfigChange] + ); - useEffect(() => { - if (onConfigChange && selectedState.agentConfigId) { - onConfigChange(selectedState.agentConfigId); - } - }, [selectedState.agentConfigId, onConfigChange]); + useEffect( + function triggerOnKeyChangeEffect() { + if (!withKeySelection || !onKeyChange) { + return; + } - useEffect(() => { - if (!withKeySelection) { - return; - } - if (!selectedState.agentConfigId) { - setEnrollmentAPIKeys([]); - return; - } + if (selectedState.enrollmentAPIKeyId) { + onKeyChange(selectedState.enrollmentAPIKeyId); + } + }, + [withKeySelection, onKeyChange, selectedState.enrollmentAPIKeyId] + ); - async function fetchEnrollmentAPIKeys() { - try { - const res = await sendGetEnrollmentAPIKeys({ - page: 1, - perPage: 10000, - }); - if (res.error) { - throw res.error; + useEffect( + function useDefaultConfigEffect() { + if (agentConfigs && agentConfigs.length && !selectedState.agentConfigId) { + const defaultConfig = agentConfigs.find((config) => config.is_default); + if (defaultConfig) { + setSelectedState({ + ...selectedState, + agentConfigId: defaultConfig.id, + }); } + } + }, + [agentConfigs, selectedState] + ); - if (!res.data) { - throw new Error('No data while fetching enrollment API keys'); + useEffect( + function useEnrollmentKeysForConfigEffect() { + if (!withKeySelection) { + return; + } + if (!selectedState.agentConfigId) { + setEnrollmentAPIKeys([]); + return; + } + + async function fetchEnrollmentAPIKeys() { + try { + const res = await sendGetEnrollmentAPIKeys({ + page: 1, + perPage: 10000, + }); + if (res.error) { + throw res.error; + } + + if (!res.data) { + throw new Error('No data while fetching enrollment API keys'); + } + + setEnrollmentAPIKeys( + res.data.list.filter((key) => key.config_id === selectedState.agentConfigId) + ); + } catch (error) { + notifications.toasts.addError(error, { + title: 'Error', + }); } + } + fetchEnrollmentAPIKeys(); + }, + [withKeySelection, selectedState.agentConfigId, notifications.toasts] + ); - setEnrollmentAPIKeys( - res.data.list.filter((key) => key.config_id === selectedState.agentConfigId) - ); - } catch (error) { - notifications.toasts.addError(error, { - title: 'Error', + useEffect( + function useDefaultEnrollmentKeyForConfigEffect() { + if (!withKeySelection) { + return; + } + if ( + !selectedState.enrollmentAPIKeyId && + enrollmentAPIKeys.length > 0 && + enrollmentAPIKeys[0].config_id === selectedState.agentConfigId + ) { + const enrollmentAPIKeyId = enrollmentAPIKeys[0].id; + setSelectedState({ + agentConfigId: selectedState.agentConfigId, + enrollmentAPIKeyId, }); } - } - fetchEnrollmentAPIKeys(); - }, [withKeySelection, selectedState.agentConfigId, notifications.toasts]); - - // Select first API key when config change - React.useEffect(() => { - if (!withKeySelection || !onKeyChange) { - return; - } - if (!selectedState.enrollmentAPIKeyId && enrollmentAPIKeys.length > 0) { - const enrollmentAPIKeyId = enrollmentAPIKeys[0].id; - setSelectedState({ - agentConfigId: selectedState.agentConfigId, - enrollmentAPIKeyId, - }); - onKeyChange(enrollmentAPIKeyId); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [enrollmentAPIKeys, selectedState.enrollmentAPIKeyId, selectedState.agentConfigId]); + }, + [ + withKeySelection, + enrollmentAPIKeys, + selectedState.enrollmentAPIKeyId, + selectedState.agentConfigId, + ] + ); return ( <> @@ -174,7 +208,6 @@ export const EnrollmentStepAgentConfig: React.FC = (props) => { ...selectedState, enrollmentAPIKeyId: e.target.value, }); - onKeyChange(e.target.value); }} /> From 26229845524467a7b7bd6cab913cc8c7023a1bb3 Mon Sep 17 00:00:00 2001 From: John Schulz Date: Tue, 28 Jul 2020 17:39:52 -0400 Subject: [PATCH 084/126] Re-enable test for create package configI believe it was supposed to be enabled with https://github.com/elastic/kibana/pull/71727/files We'll see what CI thinks (#73220) Co-authored-by: Elastic Machine --- .../apis/package_config/create.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x-pack/test/ingest_manager_api_integration/apis/package_config/create.ts b/x-pack/test/ingest_manager_api_integration/apis/package_config/create.ts index 27581550ac2bc..cae4ff79bdef6 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/package_config/create.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/package_config/create.ts @@ -18,9 +18,7 @@ export default function ({ getService }: FtrProviderContext) { // because `this` has to point to the Mocha context // see https://mochajs.org/#arrow-functions - // Temporarily skipped to promote snapshot - // Re-enabled in https://github.com/elastic/kibana/pull/71727 - describe.skip('Package Config - create', async function () { + describe('Package Config - create', async function () { let agentConfigId: string; before(async function () { From 3e637966115c3305812851dbb07f5870249d52a7 Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Tue, 28 Jul 2020 17:49:17 -0400 Subject: [PATCH 085/126] [Canvas][tech-debt] Refactor Layout Annotations (kill recompose.pure Part 2) (#73305) --- .../alignment_guide/alignment_guide.js | 33 -------- .../alignment_guide/alignment_guide.scss | 4 - .../components/alignment_guide/index.js | 10 --- .../border_connection/border_connection.js | 27 ------- .../border_connection/border_connection.scss | 9 --- .../components/border_connection/index.js | 10 --- .../border_resize_handle.scss | 13 --- .../components/border_resize_handle/index.js | 10 --- .../dragbox_annotation/dragbox_annotation.js | 26 ------ .../dragbox_annotation.scss | 8 -- .../components/dragbox_annotation/index.js | 10 --- .../hover_annotation/hover_annotation.scss | 8 -- .../components/hover_annotation/index.js | 10 --- .../layout_annotations/alignment_guide.tsx | 37 +++++++++ .../layout_annotations/border_connection.tsx | 36 +++++++++ .../border_resize_handle.tsx} | 11 ++- .../layout_annotations/dragbox_annotation.tsx | 35 ++++++++ .../hover_annotation.tsx} | 33 +++++--- .../components/layout_annotations/index.ts | 13 +++ .../layout_annotations.scss | 81 +++++++++++++++++++ .../rotation_handle.tsx} | 15 +++- .../tooltip_annotation.tsx} | 12 ++- .../components/rotation_handle/index.js | 10 --- .../rotation_handle/rotation_handle.scss | 25 ------ .../components/tooltip_annotation/index.js | 10 --- .../tooltip_annotation.scss | 8 -- .../interactive_workpad_page.js | 16 ++-- x-pack/plugins/canvas/public/style/index.scss | 8 +- 28 files changed, 262 insertions(+), 266 deletions(-) delete mode 100644 x-pack/plugins/canvas/public/components/alignment_guide/alignment_guide.js delete mode 100644 x-pack/plugins/canvas/public/components/alignment_guide/alignment_guide.scss delete mode 100644 x-pack/plugins/canvas/public/components/alignment_guide/index.js delete mode 100644 x-pack/plugins/canvas/public/components/border_connection/border_connection.js delete mode 100644 x-pack/plugins/canvas/public/components/border_connection/border_connection.scss delete mode 100644 x-pack/plugins/canvas/public/components/border_connection/index.js delete mode 100644 x-pack/plugins/canvas/public/components/border_resize_handle/border_resize_handle.scss delete mode 100644 x-pack/plugins/canvas/public/components/border_resize_handle/index.js delete mode 100644 x-pack/plugins/canvas/public/components/dragbox_annotation/dragbox_annotation.js delete mode 100644 x-pack/plugins/canvas/public/components/dragbox_annotation/dragbox_annotation.scss delete mode 100644 x-pack/plugins/canvas/public/components/dragbox_annotation/index.js delete mode 100644 x-pack/plugins/canvas/public/components/hover_annotation/hover_annotation.scss delete mode 100644 x-pack/plugins/canvas/public/components/hover_annotation/index.js create mode 100644 x-pack/plugins/canvas/public/components/layout_annotations/alignment_guide.tsx create mode 100644 x-pack/plugins/canvas/public/components/layout_annotations/border_connection.tsx rename x-pack/plugins/canvas/public/components/{border_resize_handle/border_resize_handle.js => layout_annotations/border_resize_handle.tsx} (68%) create mode 100644 x-pack/plugins/canvas/public/components/layout_annotations/dragbox_annotation.tsx rename x-pack/plugins/canvas/public/components/{hover_annotation/hover_annotation.js => layout_annotations/hover_annotation.tsx} (50%) create mode 100644 x-pack/plugins/canvas/public/components/layout_annotations/index.ts create mode 100644 x-pack/plugins/canvas/public/components/layout_annotations/layout_annotations.scss rename x-pack/plugins/canvas/public/components/{rotation_handle/rotation_handle.js => layout_annotations/rotation_handle.tsx} (60%) rename x-pack/plugins/canvas/public/components/{tooltip_annotation/tooltip_annotation.js => layout_annotations/tooltip_annotation.tsx} (70%) delete mode 100644 x-pack/plugins/canvas/public/components/rotation_handle/index.js delete mode 100644 x-pack/plugins/canvas/public/components/rotation_handle/rotation_handle.scss delete mode 100644 x-pack/plugins/canvas/public/components/tooltip_annotation/index.js delete mode 100644 x-pack/plugins/canvas/public/components/tooltip_annotation/tooltip_annotation.scss diff --git a/x-pack/plugins/canvas/public/components/alignment_guide/alignment_guide.js b/x-pack/plugins/canvas/public/components/alignment_guide/alignment_guide.js deleted file mode 100644 index d5a76efaf3d49..0000000000000 --- a/x-pack/plugins/canvas/public/components/alignment_guide/alignment_guide.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import PropTypes from 'prop-types'; -import { matrixToCSS } from '../../lib/dom'; - -export const AlignmentGuide = ({ transformMatrix, width, height }) => { - const newStyle = { - width, - height, - marginLeft: -width / 2, - marginTop: -height / 2, - background: 'magenta', - position: 'absolute', - transform: matrixToCSS(transformMatrix), - }; - return ( -
      - ); -}; - -AlignmentGuide.propTypes = { - transformMatrix: PropTypes.arrayOf(PropTypes.number).isRequired, - width: PropTypes.number.isRequired, - height: PropTypes.number.isRequired, -}; diff --git a/x-pack/plugins/canvas/public/components/alignment_guide/alignment_guide.scss b/x-pack/plugins/canvas/public/components/alignment_guide/alignment_guide.scss deleted file mode 100644 index 27f06b42df453..0000000000000 --- a/x-pack/plugins/canvas/public/components/alignment_guide/alignment_guide.scss +++ /dev/null @@ -1,4 +0,0 @@ -.canvasAlignmentGuide { - transform-origin: center center; /* the default, only for clarity */ - transform-style: preserve-3d; -} diff --git a/x-pack/plugins/canvas/public/components/alignment_guide/index.js b/x-pack/plugins/canvas/public/components/alignment_guide/index.js deleted file mode 100644 index 6793e0151759b..0000000000000 --- a/x-pack/plugins/canvas/public/components/alignment_guide/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { pure } from 'recompose'; -import { AlignmentGuide as Component } from './alignment_guide'; - -export const AlignmentGuide = pure(Component); diff --git a/x-pack/plugins/canvas/public/components/border_connection/border_connection.js b/x-pack/plugins/canvas/public/components/border_connection/border_connection.js deleted file mode 100644 index a7356e0a3f870..0000000000000 --- a/x-pack/plugins/canvas/public/components/border_connection/border_connection.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import PropTypes from 'prop-types'; -import { matrixToCSS } from '../../lib/dom'; - -export const BorderConnection = ({ transformMatrix, width, height }) => { - const newStyle = { - width, - height, - marginLeft: -width / 2, - marginTop: -height / 2, - position: 'absolute', - transform: matrixToCSS(transformMatrix), - }; - return
      ; -}; - -BorderConnection.propTypes = { - width: PropTypes.number.isRequired, - height: PropTypes.number.isRequired, - transformMatrix: PropTypes.arrayOf(PropTypes.number).isRequired, -}; diff --git a/x-pack/plugins/canvas/public/components/border_connection/border_connection.scss b/x-pack/plugins/canvas/public/components/border_connection/border_connection.scss deleted file mode 100644 index ba09edd1090db..0000000000000 --- a/x-pack/plugins/canvas/public/components/border_connection/border_connection.scss +++ /dev/null @@ -1,9 +0,0 @@ -.canvasBorder--connection { - position: absolute; - top: 0; - width: 100%; - height: 100%; - pointer-events: none; - border-top: 1px dashed $euiColorLightShade; - border-left: 1px dashed $euiColorLightShade; -} diff --git a/x-pack/plugins/canvas/public/components/border_connection/index.js b/x-pack/plugins/canvas/public/components/border_connection/index.js deleted file mode 100644 index b99ab923d52d4..0000000000000 --- a/x-pack/plugins/canvas/public/components/border_connection/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { pure } from 'recompose'; -import { BorderConnection as Component } from './border_connection'; - -export const BorderConnection = pure(Component); diff --git a/x-pack/plugins/canvas/public/components/border_resize_handle/border_resize_handle.scss b/x-pack/plugins/canvas/public/components/border_resize_handle/border_resize_handle.scss deleted file mode 100644 index 4913a599b07f7..0000000000000 --- a/x-pack/plugins/canvas/public/components/border_resize_handle/border_resize_handle.scss +++ /dev/null @@ -1,13 +0,0 @@ -.canvasBorderResizeHandle { - @include euiSlightShadow; - transform-origin: center center; /* the default, only for clarity */ - transform-style: preserve-3d; - display: block; - position: absolute; - height: 8px; - width: 8px; - margin-left: -4px; - margin-top: -4px; - background-color: $euiColorEmptyShade; - border: 1px solid $euiColorDarkShade; -} diff --git a/x-pack/plugins/canvas/public/components/border_resize_handle/index.js b/x-pack/plugins/canvas/public/components/border_resize_handle/index.js deleted file mode 100644 index c3fea05d60f7e..0000000000000 --- a/x-pack/plugins/canvas/public/components/border_resize_handle/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { pure } from 'recompose'; -import { BorderResizeHandle as Component } from './border_resize_handle'; - -export const BorderResizeHandle = pure(Component); diff --git a/x-pack/plugins/canvas/public/components/dragbox_annotation/dragbox_annotation.js b/x-pack/plugins/canvas/public/components/dragbox_annotation/dragbox_annotation.js deleted file mode 100644 index 8c67404cb9b7d..0000000000000 --- a/x-pack/plugins/canvas/public/components/dragbox_annotation/dragbox_annotation.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import PropTypes from 'prop-types'; -import { matrixToCSS } from '../../lib/dom'; - -export const DragBoxAnnotation = ({ transformMatrix, width, height }) => { - const newStyle = { - width, - height, - marginLeft: -width / 2, - marginTop: -height / 2, - transform: matrixToCSS(transformMatrix), - }; - return
      ; -}; - -DragBoxAnnotation.propTypes = { - transformMatrix: PropTypes.arrayOf(PropTypes.number).isRequired, - width: PropTypes.number.isRequired, - height: PropTypes.number.isRequired, -}; diff --git a/x-pack/plugins/canvas/public/components/dragbox_annotation/dragbox_annotation.scss b/x-pack/plugins/canvas/public/components/dragbox_annotation/dragbox_annotation.scss deleted file mode 100644 index bd14ced586dbd..0000000000000 --- a/x-pack/plugins/canvas/public/components/dragbox_annotation/dragbox_annotation.scss +++ /dev/null @@ -1,8 +0,0 @@ -.canvasDragBoxAnnotation { - position: absolute; - background: none; - transform-origin: center center; /* the default, only for clarity */ - transform-style: preserve-3d; - outline: dashed 1px $euiColorDarkShade; - pointer-events: none; -} diff --git a/x-pack/plugins/canvas/public/components/dragbox_annotation/index.js b/x-pack/plugins/canvas/public/components/dragbox_annotation/index.js deleted file mode 100644 index 85c97e90776c6..0000000000000 --- a/x-pack/plugins/canvas/public/components/dragbox_annotation/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { pure } from 'recompose'; -import { DragBoxAnnotation as Component } from './dragbox_annotation'; - -export const DragBoxAnnotation = pure(Component); diff --git a/x-pack/plugins/canvas/public/components/hover_annotation/hover_annotation.scss b/x-pack/plugins/canvas/public/components/hover_annotation/hover_annotation.scss deleted file mode 100644 index 4771bbb6134be..0000000000000 --- a/x-pack/plugins/canvas/public/components/hover_annotation/hover_annotation.scss +++ /dev/null @@ -1,8 +0,0 @@ -.canvasHoverAnnotation { - position: absolute; - background: none; - transform-origin: center center; /* the default, only for clarity */ - transform-style: preserve-3d; - outline: solid 1px $euiColorVis0; - pointer-events: none; -} diff --git a/x-pack/plugins/canvas/public/components/hover_annotation/index.js b/x-pack/plugins/canvas/public/components/hover_annotation/index.js deleted file mode 100644 index 71c57a25d7960..0000000000000 --- a/x-pack/plugins/canvas/public/components/hover_annotation/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { pure } from 'recompose'; -import { HoverAnnotation as Component } from './hover_annotation'; - -export const HoverAnnotation = pure(Component); diff --git a/x-pack/plugins/canvas/public/components/layout_annotations/alignment_guide.tsx b/x-pack/plugins/canvas/public/components/layout_annotations/alignment_guide.tsx new file mode 100644 index 0000000000000..5ac23ab41f7c0 --- /dev/null +++ b/x-pack/plugins/canvas/public/components/layout_annotations/alignment_guide.tsx @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FC } from 'react'; +import PropTypes from 'prop-types'; +import { matrixToCSS } from '../../lib/dom'; +import { TransformMatrix3d } from '../../lib/aeroelastic'; + +interface Props { + height: number; + transformMatrix: TransformMatrix3d; + width: number; +} + +export const AlignmentGuide: FC = ({ transformMatrix, width, height }) => ( +
      +); + +AlignmentGuide.propTypes = { + height: PropTypes.number.isRequired, + transformMatrix: PropTypes.arrayOf(PropTypes.number).isRequired, + width: PropTypes.number.isRequired, +}; diff --git a/x-pack/plugins/canvas/public/components/layout_annotations/border_connection.tsx b/x-pack/plugins/canvas/public/components/layout_annotations/border_connection.tsx new file mode 100644 index 0000000000000..e47ec3cc89e7b --- /dev/null +++ b/x-pack/plugins/canvas/public/components/layout_annotations/border_connection.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FC } from 'react'; +import PropTypes from 'prop-types'; +import { matrixToCSS } from '../../lib/dom'; +import { TransformMatrix3d } from '../../lib/aeroelastic'; + +interface Props { + height: number; + transformMatrix: TransformMatrix3d; + width: number; +} + +export const BorderConnection: FC = ({ transformMatrix, width, height }) => ( +
      +); + +BorderConnection.propTypes = { + height: PropTypes.number.isRequired, + transformMatrix: PropTypes.arrayOf(PropTypes.number).isRequired, + width: PropTypes.number.isRequired, +}; diff --git a/x-pack/plugins/canvas/public/components/border_resize_handle/border_resize_handle.js b/x-pack/plugins/canvas/public/components/layout_annotations/border_resize_handle.tsx similarity index 68% rename from x-pack/plugins/canvas/public/components/border_resize_handle/border_resize_handle.js rename to x-pack/plugins/canvas/public/components/layout_annotations/border_resize_handle.tsx index de9d573724836..f7c49205568fe 100644 --- a/x-pack/plugins/canvas/public/components/border_resize_handle/border_resize_handle.js +++ b/x-pack/plugins/canvas/public/components/layout_annotations/border_resize_handle.tsx @@ -4,11 +4,17 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; import { matrixToCSS } from '../../lib/dom'; +import { TransformMatrix3d } from '../../lib/aeroelastic'; -export const BorderResizeHandle = ({ transformMatrix, zoomScale }) => ( +interface Props { + transformMatrix: TransformMatrix3d; + zoomScale?: number; +} + +export const BorderResizeHandle: FC = ({ transformMatrix, zoomScale = 1 }) => (
      ( BorderResizeHandle.propTypes = { transformMatrix: PropTypes.arrayOf(PropTypes.number).isRequired, + zoomScale: PropTypes.number, }; diff --git a/x-pack/plugins/canvas/public/components/layout_annotations/dragbox_annotation.tsx b/x-pack/plugins/canvas/public/components/layout_annotations/dragbox_annotation.tsx new file mode 100644 index 0000000000000..16a2a626b7975 --- /dev/null +++ b/x-pack/plugins/canvas/public/components/layout_annotations/dragbox_annotation.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FC } from 'react'; +import PropTypes from 'prop-types'; +import { matrixToCSS } from '../../lib/dom'; +import { TransformMatrix3d } from '../../lib/aeroelastic'; + +interface Props { + height: number; + transformMatrix: TransformMatrix3d; + width: number; +} + +export const DragBoxAnnotation: FC = ({ transformMatrix, width, height }) => ( +
      +); + +DragBoxAnnotation.propTypes = { + transformMatrix: PropTypes.arrayOf(PropTypes.number).isRequired, + width: PropTypes.number.isRequired, + height: PropTypes.number.isRequired, +}; diff --git a/x-pack/plugins/canvas/public/components/hover_annotation/hover_annotation.js b/x-pack/plugins/canvas/public/components/layout_annotations/hover_annotation.tsx similarity index 50% rename from x-pack/plugins/canvas/public/components/hover_annotation/hover_annotation.js rename to x-pack/plugins/canvas/public/components/layout_annotations/hover_annotation.tsx index 7337c0446e31c..a8d73f8bf9ec7 100644 --- a/x-pack/plugins/canvas/public/components/hover_annotation/hover_annotation.js +++ b/x-pack/plugins/canvas/public/components/layout_annotations/hover_annotation.tsx @@ -4,23 +4,32 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; import { matrixToCSS } from '../../lib/dom'; +import { TransformMatrix3d } from '../../lib/aeroelastic'; -export const HoverAnnotation = ({ transformMatrix, width, height }) => { - const newStyle = { - width, - height, - marginLeft: -width / 2, - marginTop: -height / 2, - transform: matrixToCSS(transformMatrix), - }; - return
      ; -}; +interface Props { + height: number; + transformMatrix: TransformMatrix3d; + width: number; +} + +export const HoverAnnotation: FC = ({ transformMatrix, width, height }) => ( +
      +); HoverAnnotation.propTypes = { + height: PropTypes.number.isRequired, transformMatrix: PropTypes.arrayOf(PropTypes.number).isRequired, width: PropTypes.number.isRequired, - height: PropTypes.number.isRequired, }; diff --git a/x-pack/plugins/canvas/public/components/layout_annotations/index.ts b/x-pack/plugins/canvas/public/components/layout_annotations/index.ts new file mode 100644 index 0000000000000..d2334c6a225fe --- /dev/null +++ b/x-pack/plugins/canvas/public/components/layout_annotations/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { AlignmentGuide } from './alignment_guide'; +export { DragBoxAnnotation } from './dragbox_annotation'; +export { HoverAnnotation } from './hover_annotation'; +export { TooltipAnnotation } from './tooltip_annotation'; +export { RotationHandle } from './rotation_handle'; +export { BorderConnection } from './border_connection'; +export { BorderResizeHandle } from './border_resize_handle'; diff --git a/x-pack/plugins/canvas/public/components/layout_annotations/layout_annotations.scss b/x-pack/plugins/canvas/public/components/layout_annotations/layout_annotations.scss new file mode 100644 index 0000000000000..363aa1f241b9d --- /dev/null +++ b/x-pack/plugins/canvas/public/components/layout_annotations/layout_annotations.scss @@ -0,0 +1,81 @@ +.canvasAlignmentGuide { + transform-origin: center center; /* the default, only for clarity */ + transform-style: preserve-3d; +} + +.canvasBorderConnection { + position: absolute; + top: 0; + width: 100%; + height: 100%; + pointer-events: none; + border-top: 1px dashed $euiColorLightShade; + border-left: 1px dashed $euiColorLightShade; +} + +.canvasBorderResizeHandle { + @include euiSlightShadow; + transform-origin: center center; /* the default, only for clarity */ + transform-style: preserve-3d; + display: block; + position: absolute; + height: $euiSizeS; + width: $euiSizeS; + margin-left: -4px; + margin-top: -4px; + background-color: $euiColorEmptyShade; + border: 1px solid $euiColorDarkShade; +} + +.canvasDragBoxAnnotation { + position: absolute; + background: none; + transform-origin: center center; /* the default, only for clarity */ + transform-style: preserve-3d; + outline: dashed 1px $euiColorDarkShade; + pointer-events: none; +} + +.canvasHoverAnnotation { + position: absolute; + background: none; + transform-origin: center center; /* the default, only for clarity */ + transform-style: preserve-3d; + outline: solid 1px $euiColorVis0; + pointer-events: none; +} + +.canvasRotationHandle { + transform-origin: center center; /* the default, only for clarity */ + transform-style: preserve-3d; + display: block; + position: absolute; + height: $euiSizeL; + width: 0; + margin-left: -1px; + margin-top: -12px; + border-top: 1px dashed $euiColorLightShade; + border-left: 1px dashed $euiColorLightShade; +} + +.canvasRotationHandle__handle { + transform-origin: center center; /* the default, only for clarity */ + transform-style: preserve-3d; + display: block; + position: absolute; + height: 9px; + width: 9px; + margin-left: -5px; + margin-top: -6px; + border-radius: 50%; + background-color: $euiColorMediumShade; +} + +.tooltipAnnotation { + @include euiToolTipStyle($size: 's'); + position: absolute; + transform-origin: center center; /* the default, only for clarity */ + transform-style: preserve-3d; + outline: none; + pointer-events: none; +} diff --git a/x-pack/plugins/canvas/public/components/rotation_handle/rotation_handle.js b/x-pack/plugins/canvas/public/components/layout_annotations/rotation_handle.tsx similarity index 60% rename from x-pack/plugins/canvas/public/components/rotation_handle/rotation_handle.js rename to x-pack/plugins/canvas/public/components/layout_annotations/rotation_handle.tsx index dfadbbc39c547..e2a3f57efc672 100644 --- a/x-pack/plugins/canvas/public/components/rotation_handle/rotation_handle.js +++ b/x-pack/plugins/canvas/public/components/layout_annotations/rotation_handle.tsx @@ -4,19 +4,25 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; import { matrixToCSS } from '../../lib/dom'; +import { TransformMatrix3d } from '../../lib/aeroelastic'; -export const RotationHandle = ({ transformMatrix, zoomScale }) => ( +interface Props { + transformMatrix: TransformMatrix3d; + zoomScale?: number; +} + +export const RotationHandle: FC = ({ transformMatrix, zoomScale = 1 }) => (
      @@ -24,4 +30,5 @@ export const RotationHandle = ({ transformMatrix, zoomScale }) => ( RotationHandle.propTypes = { transformMatrix: PropTypes.arrayOf(PropTypes.number).isRequired, + zoomScale: PropTypes.number, }; diff --git a/x-pack/plugins/canvas/public/components/tooltip_annotation/tooltip_annotation.js b/x-pack/plugins/canvas/public/components/layout_annotations/tooltip_annotation.tsx similarity index 70% rename from x-pack/plugins/canvas/public/components/tooltip_annotation/tooltip_annotation.js rename to x-pack/plugins/canvas/public/components/layout_annotations/tooltip_annotation.tsx index 1836bfd0162f3..84c527bf7af27 100644 --- a/x-pack/plugins/canvas/public/components/tooltip_annotation/tooltip_annotation.js +++ b/x-pack/plugins/canvas/public/components/layout_annotations/tooltip_annotation.tsx @@ -4,11 +4,17 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; import { matrixToCSS } from '../../lib/dom'; +import { TransformMatrix3d } from '../../lib/aeroelastic'; -export const HoverAnnotation = ({ transformMatrix, text }) => { +interface Props { + transformMatrix: TransformMatrix3d; + text: string; +} + +export const TooltipAnnotation: FC = ({ transformMatrix, text }) => { const newStyle = { transform: `${matrixToCSS(transformMatrix)} translate(1em, -1em)`, }; @@ -19,7 +25,7 @@ export const HoverAnnotation = ({ transformMatrix, text }) => { ); }; -HoverAnnotation.propTypes = { +TooltipAnnotation.propTypes = { transformMatrix: PropTypes.arrayOf(PropTypes.number).isRequired, text: PropTypes.string.isRequired, }; diff --git a/x-pack/plugins/canvas/public/components/rotation_handle/index.js b/x-pack/plugins/canvas/public/components/rotation_handle/index.js deleted file mode 100644 index 86c99ce12a04e..0000000000000 --- a/x-pack/plugins/canvas/public/components/rotation_handle/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { pure } from 'recompose'; -import { RotationHandle as Component } from './rotation_handle'; - -export const RotationHandle = pure(Component); diff --git a/x-pack/plugins/canvas/public/components/rotation_handle/rotation_handle.scss b/x-pack/plugins/canvas/public/components/rotation_handle/rotation_handle.scss deleted file mode 100644 index 233a86199c483..0000000000000 --- a/x-pack/plugins/canvas/public/components/rotation_handle/rotation_handle.scss +++ /dev/null @@ -1,25 +0,0 @@ -.canvasRotationHandle--connector { - transform-origin: center center; /* the default, only for clarity */ - transform-style: preserve-3d; - display: block; - position: absolute; - height: 24px; - width: 0; - margin-left: -1px; - margin-top: -12px; - border-top: 1px dashed $euiColorLightShade; - border-left: 1px dashed $euiColorLightShade; -} - -.canvasRotationHandle--handle { - transform-origin: center center; /* the default, only for clarity */ - transform-style: preserve-3d; - display: block; - position: absolute; - height: 9px; - width: 9px; - margin-left: -5px; - margin-top: -6px; - border-radius: 50%; - background-color: $euiColorMediumShade; -} diff --git a/x-pack/plugins/canvas/public/components/tooltip_annotation/index.js b/x-pack/plugins/canvas/public/components/tooltip_annotation/index.js deleted file mode 100644 index c6d545be560ce..0000000000000 --- a/x-pack/plugins/canvas/public/components/tooltip_annotation/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { pure } from 'recompose'; -import { HoverAnnotation as Component } from './tooltip_annotation'; - -export const TooltipAnnotation = pure(Component); diff --git a/x-pack/plugins/canvas/public/components/tooltip_annotation/tooltip_annotation.scss b/x-pack/plugins/canvas/public/components/tooltip_annotation/tooltip_annotation.scss deleted file mode 100644 index d91e49c0c628f..0000000000000 --- a/x-pack/plugins/canvas/public/components/tooltip_annotation/tooltip_annotation.scss +++ /dev/null @@ -1,8 +0,0 @@ -.tooltipAnnotation { - @include euiToolTipStyle($size: 's'); - position: absolute; - transform-origin: center center; /* the default, only for clarity */ - transform-style: preserve-3d; - outline: none; - pointer-events: none; -} diff --git a/x-pack/plugins/canvas/public/components/workpad_page/workpad_interactive_page/interactive_workpad_page.js b/x-pack/plugins/canvas/public/components/workpad_page/workpad_interactive_page/interactive_workpad_page.js index 152da323e89ea..4089a1d709299 100644 --- a/x-pack/plugins/canvas/public/components/workpad_page/workpad_interactive_page/interactive_workpad_page.js +++ b/x-pack/plugins/canvas/public/components/workpad_page/workpad_interactive_page/interactive_workpad_page.js @@ -6,13 +6,15 @@ import React, { PureComponent } from 'react'; import { ElementWrapper } from '../../element_wrapper'; -import { AlignmentGuide } from '../../alignment_guide'; -import { DragBoxAnnotation } from '../../dragbox_annotation'; -import { HoverAnnotation } from '../../hover_annotation'; -import { TooltipAnnotation } from '../../tooltip_annotation'; -import { RotationHandle } from '../../rotation_handle'; -import { BorderConnection } from '../../border_connection'; -import { BorderResizeHandle } from '../../border_resize_handle'; +import { + AlignmentGuide, + DragBoxAnnotation, + HoverAnnotation, + TooltipAnnotation, + RotationHandle, + BorderConnection, + BorderResizeHandle, +} from '../../layout_annotations'; import { WorkpadShortcuts } from '../../workpad_shortcuts'; import { interactiveWorkpadPagePropTypes } from '../prop_types'; import { InteractionBoundary } from './interaction_boundary'; diff --git a/x-pack/plugins/canvas/public/style/index.scss b/x-pack/plugins/canvas/public/style/index.scss index ccaf6f1c1a478..3937d7fc05544 100644 --- a/x-pack/plugins/canvas/public/style/index.scss +++ b/x-pack/plugins/canvas/public/style/index.scss @@ -8,15 +8,12 @@ @import '../apps/export/export/export_app'; // Canvas components -@import '../components/alignment_guide/alignment_guide'; @import '../components/arg_add/arg_add'; @import '../components/arg_add_popover/arg_add_popover'; @import '../components/arg_form/arg_form'; @import '../components/asset_manager/asset_manager'; @import '../components/asset_picker/asset_picker'; @import '../components/autocomplete/autocomplete'; -@import '../components/border_connection/border_connection'; -@import '../components/border_resize_handle/border_resize_handle'; @import '../components/clipboard/clipboard'; @import '../components/color_dot/color_dot'; @import '../components/color_palette/color_palette'; @@ -27,25 +24,22 @@ @import '../components/datatable/datatable'; @import '../components/debug/debug'; @import '../components/dom_preview/dom_preview'; -@import '../components/dragbox_annotation/dragbox_annotation'; @import '../components/element_card/element_card'; @import '../components/element_content/element_content'; @import '../components/expression/expression'; @import '../components/fullscreen/fullscreen'; @import '../components/function_form/function_form'; -@import '../components/hover_annotation/hover_annotation'; +@import '../components/layout_annotations/layout_annotations'; @import '../components/loading/loading'; @import '../components/navbar/navbar'; @import '../components/page_manager/page_manager'; @import '../components/positionable/positionable'; -@import '../components/rotation_handle/rotation_handle'; @import '../components/shape_preview/shape_preview'; @import '../components/shape_picker/shape_picker'; @import '../components/sidebar/sidebar'; @import '../components/sidebar_header/sidebar_header'; @import '../components/toolbar/toolbar'; @import '../components/toolbar/tray/tray'; -@import '../components/tooltip_annotation/tooltip_annotation'; @import '../components/workpad/workpad'; @import '../components/workpad_header/element_menu/element_menu'; @import '../components/workpad_header/share_menu/share_menu'; From d57a379aa9ef2dff59eb2538a8091c2f83a61a95 Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Tue, 28 Jul 2020 16:03:41 -0600 Subject: [PATCH 086/126] Fixes cypress build by removing alerting version within the saved object that causes migration issue while the cypress tests run (#73550) --- .../es_archives/export_rule/data.json.gz | Bin 1931 -> 1924 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/x-pack/test/security_solution_cypress/es_archives/export_rule/data.json.gz b/x-pack/test/security_solution_cypress/es_archives/export_rule/data.json.gz index 373251d9e4f93d8097029345aa45aba959dd7a08..aad07a0bf6d53d4f427665ac312f45a0ef13b028 100644 GIT binary patch literal 1924 zcmV-~2YdJ*iwFq$hag`717u-zVJ>QOZ*Bn9SxIx-IugG7S8#NCODK`zuBmtM7TeE@ z?8uHCPfe*n5|m(pO9;T0oyvco21UuFHY-XplTq0Rp&O0vuNQPfUv?Cw!JjkS=qQaa z4I1y{!Xu(Wu6%(n@Rfv;iYU%`2bqr34iQq3fg{y4k)gVpVW~FqL*0+su4kY^h}@Ti zcr3RzN5n@7>g!VqOGO^Mo}iS{D+_Wd;3Q2LEdFb@`0sZWy4-RNx}OyKF@obJBZCA{ z)~K>&2h;7P$*= z*xk`>?_%uTc1JuGXWfxy>giE;uXjL=55w+-mpn$=-kmUT(6aZg4y-Hk@R^FxFz#EK znXr$R*&AFv^p08&SI4HHM_0CXdin57Ki@Dby1Bd={PowOmEETV=h9S65#uDNas+^- zh$m!;RgIQo#BsPQJ z-{8s9SgMw!PpV;StgaV{0cYu(MGsUmwko{{u2}s;2`%6a3HKo;)CCew z!U1?}kpRZv)22d;Di;_Iw3~m zURhW=imqvOBIal=+A3bq<9SufS}0SnkFu;Ua+wW{A?I1A)q>bVbeJ;UvFx_i0)`gD zfyfDeZiSfRvL;qUeywSfq-vby2^;l-G?$85+H%r4SPHqfUJhj0q}J=c<{~Xb2pk zZ`vku1J4OUv$3%E0&M6$;yfqeQj8dSgbEZcC1KbHK9Gmg^r^9wxQPvXC@bfB77}Ah z61-fKDfOCgy3`8E07W#;)|txFvP9G^nRWu77n1{ou}RU>XUmn)Yp`I5LqYLeDnLnr ziUkdY6l=wewR^*B#6}Yjo0jQ%0oK&Oc3oB1F?1Z3*H$$HMJR|ITi2p$)#qq1AB2s5 zzc?I1yf59~Ct>H?1E(TnRy#XI<$SfJdOLxGQ@+eK4UvV5cjnF<8q0HPcEHR-lYVKo zT*~gF6*suubRD?C3-+%&^8f43&X>)bzu9%BQn=1kG)PjZeg}$smI6S1xx7u^w?c5e z6YMW|w~Bb#i>$QWY`V6+tb6JEtJ;_OTYkc!9G2E9hf}SUvsb%|ozjYaiP;itUU{at z&l6|e&E{vWMTZmI_rcx~&P%;?Jq&%v4%9aCeAV<_P4(^2P(w#Ikb^92_-0Lfsp-_7 z#$rs*A-Qc(uL_2Z!yH`gXx|a$&?84=(6O6ZQ&SPmhDhHgs3&6TF7;oM~84)>tdsI0n0a;LZ zit0qO?O~VQ+^juRaWa4oL6w)DT29fB9@uic_9hqVH#zJr$lug#o1uT@9V-RzN|s3% z@eQvPv+Wh(&>;0uz2jcuy0NbsQ&WCBM*-ZADI5M%If15; zDzKn*d&(UQjeXth+rKNjSw`_K_D>0KS%%XzY~{DpV;lLlDNe zlvGBqdVwx5uzQ#5AwRv?}&&3RNLyfPAe-OMLurws+%w7$b9FlxcL zUc_2oFz`jc@;rfPr|tUKh>Raz?%p_eu9#(6`8HXO@V%4@$=Iok^3^9Wk_e7jH|ar# zie>gd9vhxzS3cFwArY~U^KP^cDvhL1E5r5c9Jt&8Zqu`k`|anCH*nZE5UP6olt6H- zz&Gq)BoKy>)o*!R_iVH3arXy#yqa?VOOH!E?4Rjz&q5l~{*OGa>Gs^`2f5s9dan5k zxV);z5AJWldM=>7wLQz!f2HHJV>zF{ zM})%AQvBAlntYBKo4k}S;WbxI literal 1931 zcmV;62Xy!!iwFpN;}Kr~17u-zVJ>QOZ*Bn9Sy@x#Iu?HCS9tPtmv&;ud#3IKTLYIR z&ZcOR0rP zQ2QVk9uO6B(g59I2*>4As>POSO?7>VDL8Jp<)Rq+A^0 zu@tQjiH~B`)29@ch%9*7K`FGC7UWXENfI+y{MT&p-yceJDbfYoPjdSh!J|4O{TNYJ zE3>8K6hBFhqlA3Ai*BMXp9W(Z96u+2?j~VpzkhL^-UiX({gZwijjfxZ?uQpAV*Gr0 zeE1wb+~2y*L(R&_ooziLqEQx~efcax_bG0CaW9W{@BGUP-S{*5tdYUrr{ntuxec$` z?a@u=V(i_thkPW?+C$6KlcV-t=YSfY2JH(keu%WaTVdd!VeefXSXbo!D;1$(+%-}& zW}hvy)4#g!95wE*j!i+2u59h}^8Sf_y=GQ)eR#s#G+mA8Mq^p=B#z|1-2mnhl znvf+{6SI0d@qdZ*?$7zyrB@+~vw@y)pMy!%b5+A__NmkKW(F!cS zAT%U#e~%`?usf-VSWsGF3NZ^ZlFH0nZG!}09N?Uboe{>@?wbQ~nJ~i117_=43FSC@ zg(pi!(zG~vR1I5WRlCRtaF(%Ij6kVk%i8ng8mWJ%JVP;?6y+Zkr8&GI;XdSqxv#fFjq$1JB-2_rP_ z6pf{&=$cj~VvgprtrP`)G;eCr3uOuRP@48cCaa+~;5={?q zaj#`K!Wo8gU7wK|VZ%<4WYRE8TTVI$PoehK>wzkp^m^UbT%-j})oq%FYT5=?y(WD1 zP1{6n;5k8P))r(hz=!q&&N31%#fYH?=s@985(YVlf!v%XkF}-5O?==3**Vv*|4QoDrHrCvw|XriNZovS=4T13^8=_K%Vu{b~(n>0Orwp>cR8Vd$E6co>u0<;w9 zSTImXwbrP%RyOP+Hk?G*v`p6vu%-sK>#DkrVdAj7rm7hzLP6x%x)znYK1coeB&_v% z`R0(~JsJKU30rSZoRX4R?`-9r^Tn6)=>!2z__EN{L>exhnLBf6)JCMAAz9>~XMmSy zqGC*{Id!kDElMw~$eDSw_)gT!mJ7>zXvO(&*IftB|D65%j{N_=v-559(Q$SdsuT`G z74_ppI^Tk$Ax!|@o?PB$YFweXidk_BZI&sR;~ z)l}aO4K;Lh13AdThHqBX7nV-_sV!E-9Fp56^{QmpIL#r{j`of;hY33({gz$V>Y9pZ zIzak1Nj*_h&Eb4Dy%2Jwa827OCmXo*G08@VxA?Q%;kvv3)~+(!@ttj@(6cpw3`RWM zs!k(sf^NN=xq7L|uG?F9ITbHyoU8QifG`FA_y8+~7fLSmk4k$WEWaFmgf=2F{Q5=b zpa5jS;3=vT%eIGI&VsYyQpIr}<_lFGnQCzdhw{Ld<25%qj^7lp*C2n@vTdFWR-VvO z@vdZ<%ph-g>zIj`l*4${L)CeGN$6hpaO3{vyz`hY`j;#F*H36%o~Ajv=QSxre^A8BCHKFKxU|FmnGyFaq#^D9DB_xK&wYMS z$i2Gfn!iBE%Xa+W`4+tA0>)e0vrPS08gD0t&1J>*qp2_Ga6f;y=t9g7#AMD|Jt+54 zx;P%o`}s#iC|p|dUy4?f&oN_@clISbXGt>LL&5L>EqSWWIXWT$$k>XXqncXXGo8wl zOiAcv>l%|QIK*L@m0^?xgWZVZY&8_Xr)zarTmHm1i_MB1a&qC_YV)_b5)?acdLxiq RS$ef{{sZ~)cm47m007H2!|VV6 From e5fd1c4c7fc2ca8cac34776199bfa548bc54d3ff Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Wed, 29 Jul 2020 01:29:48 +0300 Subject: [PATCH 087/126] [i18n] explicit process.exit(); call for i18n_integrate cli command (#73495) Co-authored-by: Elastic Machine --- src/dev/run_i18n_integrate.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dev/run_i18n_integrate.ts b/src/dev/run_i18n_integrate.ts index 23d66fae9f26e..ac1e957adfc99 100644 --- a/src/dev/run_i18n_integrate.ts +++ b/src/dev/run_i18n_integrate.ts @@ -108,6 +108,7 @@ run( const reporter = new ErrorReporter(); const messages: Map = new Map(); await list.run({ messages, reporter }); + process.exitCode = 0; } catch (error) { process.exitCode = 1; if (error instanceof ErrorReporter) { @@ -117,6 +118,7 @@ run( log.error(error); } } + process.exit(); }, { flags: { From 93d45fc6ff5d5e0a8a01b81464f6f36eb6ab7883 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Tue, 28 Jul 2020 18:49:05 -0400 Subject: [PATCH 088/126] [Ingest Manager] Update fleet instructions to run agent as a service (#73491) --- .../enrollment_instructions/manual/index.tsx | 85 ++++++++++++++----- .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - 3 files changed, 65 insertions(+), 24 deletions(-) diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/enrollment_instructions/manual/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/enrollment_instructions/manual/index.tsx index 78f4f73cf18be..fe11c4cb08d13 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/enrollment_instructions/manual/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/enrollment_instructions/manual/index.tsx @@ -5,7 +5,8 @@ */ import React from 'react'; -import { EuiText, EuiSpacer, EuiCode, EuiCodeBlock, EuiCopy, EuiButton } from '@elastic/eui'; +import styled from 'styled-components'; +import { EuiText, EuiSpacer, EuiCode, EuiTitle, EuiCodeBlock } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { EnrollmentAPIKey } from '../../../types'; @@ -15,42 +16,86 @@ interface Props { kibanaCASha256?: string; } +// Otherwise the copy button is over the text +const CommandCode = styled.pre({ + overflow: 'scroll', +}); + export const ManualInstructions: React.FunctionComponent = ({ kibanaUrl, apiKey, kibanaCASha256, }) => { - const command = ` -./elastic-agent enroll ${kibanaUrl} ${apiKey.api_key}${ + const enrollArgs = `${kibanaUrl} ${apiKey.api_key}${ kibanaCASha256 ? ` --ca_sha256=${kibanaCASha256}` : '' - } + }`; + const macOsLinuxTarCommand = `./elastic-agent enroll ${enrollArgs} ./elastic-agent run`; + + const linuxDebRpmCommand = `./elastic-agent enroll ${enrollArgs} +systemctl enable elastic-agent +systemctl start elastic-agent`; + + const windowsCommand = `./elastic-agent enroll ${enrollArgs} +./install-service-elastic-agent.ps1`; + return ( <> + + + +

      + +

      +
      + + + {windowsCommand} + + + +

      + +

      +
      + + + {linuxDebRpmCommand} + + + +

      + +

      +
      + + + agent enroll, + command: ./elastic-agent run, }} /> - - -
      {command}
      + + + {macOsLinuxTarCommand} - - - {(copy) => ( - - - - )} - ); }; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index ee7d1e0298d00..b6aaa2065c795 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -8177,8 +8177,6 @@ "xpack.ingestManager.editPackageConfig.updatedNotificationTitle": "正常に'{packageConfigName}'を更新しました", "xpack.ingestManager.enrollemntAPIKeyList.emptyMessage": "登録トークンが見つかりません。", "xpack.ingestManager.enrollemntAPIKeyList.loadingTokensMessage": "登録トークンを読み込んでいます...", - "xpack.ingestManager.enrollmentInstructions.copyButton": "コマンドをコピー", - "xpack.ingestManager.enrollmentInstructions.descriptionText": "エージェントのディレクトリから、これらのコマンドを実行して、Elasticエージェントを登録して起動します。{enrollCommand}はエージェントの構成ファイルに書き込み、正しい設定になるようにします。このコマンドを使用すると、複数のホストでエージェントを設定できます。", "xpack.ingestManager.enrollmentStepAgentConfig.configSelectAriaLabel": "エージェント構成", "xpack.ingestManager.enrollmentStepAgentConfig.configSelectLabel": "エージェント構成", "xpack.ingestManager.enrollmentStepAgentConfig.enrollmentTokenSelectLabel": "登録トークン", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 30c932c362a4f..dcbcda120587f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -8182,8 +8182,6 @@ "xpack.ingestManager.editPackageConfig.updatedNotificationTitle": "已成功更新“{packageConfigName}”", "xpack.ingestManager.enrollemntAPIKeyList.emptyMessage": "未找到任何注册令牌。", "xpack.ingestManager.enrollemntAPIKeyList.loadingTokensMessage": "正在加载注册令牌......", - "xpack.ingestManager.enrollmentInstructions.copyButton": "复制命令", - "xpack.ingestManager.enrollmentInstructions.descriptionText": "从代理的目录,运行这些命令以注册并启动 Elastic 代理。{enrollCommand} 将写入代理的配置文件,以便其具有正确的设置。可以使用此命令在多个主机上设置代理。", "xpack.ingestManager.enrollmentStepAgentConfig.configSelectAriaLabel": "代理配置", "xpack.ingestManager.enrollmentStepAgentConfig.configSelectLabel": "代理配置", "xpack.ingestManager.enrollmentStepAgentConfig.enrollmentTokenSelectLabel": "注册令牌", From 7a3e800aaab50969f7d53ac77f781a2544463f06 Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Tue, 28 Jul 2020 18:58:58 -0400 Subject: [PATCH 089/126] [Canvas][tech-debt] Kill Recompose:Pure - Part 1 (#73303) Co-authored-by: Elastic Machine --- .../arg_add/{arg_add.js => arg_add.tsx} | 14 +- .../components/arg_add/{index.js => index.ts} | 6 +- .../arg_add_popover/arg_add_popover.tsx | 7 +- .../components/arg_add_popover/index.ts | 5 +- .../asset_manager.stories.storyshot | 539 ---------- .../public/components/color_dot/color_dot.tsx | 12 +- .../public/components/color_dot/index.ts | 7 +- .../color_manager/color_manager.tsx | 22 +- .../public/components/color_manager/index.ts | 7 +- .../color_palette/color_palette.tsx | 8 +- .../public/components/color_palette/index.ts | 6 +- .../components/color_picker/color_picker.tsx | 5 +- .../public/components/color_picker/index.ts | 7 +- .../color_picker_popover.tsx | 9 +- .../components/color_picker_popover/index.ts | 7 +- .../datatable/{datatable.js => datatable.tsx} | 33 +- .../datatable/{index.js => index.ts} | 5 +- .../font_picker.stories.storyshot | 0 .../{ => __stories__}/font_picker.stories.tsx | 4 +- .../components/font_picker/font_picker.tsx | 14 +- .../font_picker/{index.js => index.ts} | 6 +- .../canvas/public/components/loading/index.ts | 5 +- .../public/components/loading/loading.tsx | 6 +- .../public/components/shape_picker/index.ts | 6 +- .../components/shape_picker/shape_picker.tsx | 6 +- .../components/shape_picker_popover/index.tsx | 6 +- .../shape_picker_popover.tsx | 7 +- .../public/components/shape_preview/index.ts | 6 +- .../shape_preview/shape_preview.tsx | 4 +- .../text_style_picker.stories.storyshot | 975 ++++++++++++++++++ .../__stories__/text_style_picker.stories.tsx | 21 + .../{font_sizes.js => font_sizes.ts} | 0 .../text_style_picker/{index.js => index.ts} | 5 +- ..._style_picker.js => text_style_picker.tsx} | 160 +-- .../public/components/tooltip_icon/index.ts | 6 +- .../components/tooltip_icon/tooltip_icon.tsx | 4 +- 36 files changed, 1188 insertions(+), 752 deletions(-) rename x-pack/plugins/canvas/public/components/arg_add/{arg_add.js => arg_add.tsx} (71%) rename x-pack/plugins/canvas/public/components/arg_add/{index.js => index.ts} (66%) rename x-pack/plugins/canvas/public/components/datatable/{datatable.js => datatable.tsx} (78%) rename x-pack/plugins/canvas/public/components/datatable/{index.js => index.ts} (64%) rename x-pack/plugins/canvas/public/components/font_picker/{ => __stories__}/__snapshots__/font_picker.stories.storyshot (100%) rename x-pack/plugins/canvas/public/components/font_picker/{ => __stories__}/font_picker.stories.tsx (84%) rename x-pack/plugins/canvas/public/components/font_picker/{index.js => index.ts} (64%) create mode 100644 x-pack/plugins/canvas/public/components/text_style_picker/__stories__/__snapshots__/text_style_picker.stories.storyshot create mode 100644 x-pack/plugins/canvas/public/components/text_style_picker/__stories__/text_style_picker.stories.tsx rename x-pack/plugins/canvas/public/components/text_style_picker/{font_sizes.js => font_sizes.ts} (100%) rename x-pack/plugins/canvas/public/components/text_style_picker/{index.js => index.ts} (61%) rename x-pack/plugins/canvas/public/components/text_style_picker/{text_style_picker.js => text_style_picker.tsx} (54%) diff --git a/x-pack/plugins/canvas/public/components/arg_add/arg_add.js b/x-pack/plugins/canvas/public/components/arg_add/arg_add.tsx similarity index 71% rename from x-pack/plugins/canvas/public/components/arg_add/arg_add.js rename to x-pack/plugins/canvas/public/components/arg_add/arg_add.tsx index 2d6d7d1046fdd..e85a2915a82b1 100644 --- a/x-pack/plugins/canvas/public/components/arg_add/arg_add.js +++ b/x-pack/plugins/canvas/public/components/arg_add/arg_add.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC, ReactEventHandler } from 'react'; import PropTypes from 'prop-types'; import { EuiDescriptionList, @@ -12,7 +12,13 @@ import { EuiDescriptionListDescription, } from '@elastic/eui'; -export const ArgAdd = ({ onValueAdd, displayName, help }) => { +interface Props { + displayName: string; + help: string; + onValueAdd?: ReactEventHandler; +} + +export const ArgAdd: FC = ({ onValueAdd = () => {}, displayName, help }) => { return ( -
      -
      -
      - Manage workpad assets -
      -
      -
      -
      -
      - -
      - -
      -
      -
      -
      -
      -
      -
      -
      -
      -

      - Below are the image assets in this workpad. Any assets that are currently in use cannot be determined at this time. To reclaim space, delete assets. -

      -
      -
      -
      -
      -
      -
      -
      -
      - Asset thumbnail -
      -
      -
      -
      -

      - - airplane - -
      - - - ( - 1 - kb) - - -

      -
      -
      -
      -
      - - - -
      -
      - -
      - -
      -
      -
      -
      - -
      - -
      -
      -
      -
      - - - -
      -
      -
      -
      -
      -
      -
      -
      - Asset thumbnail -
      -
      -
      -
      -

      - - marker - -
      - - - ( - 1 - kb) - - -

      -
      -
      -
      -
      - - - -
      -
      - -
      - -
      -
      -
      -
      - -
      - -
      -
      -
      -
      - - - -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - -
      -
      -
      - 0% space used -
      -
      -
      - -
      -
      -
      -
      , -
      , -] -`; - exports[`Storyshots components/Assets/AssetManager two assets 1`] = ` Array [
      = ({ value, children }) => { +export const ColorDot: FC = ({ value, children }) => { const tc = tinycolor(value); let style = {}; @@ -34,6 +34,6 @@ export const ColorDot: FunctionComponent = ({ value, children }) => { }; ColorDot.propTypes = { - value: PropTypes.string, children: PropTypes.node, + value: PropTypes.string, }; diff --git a/x-pack/plugins/canvas/public/components/color_dot/index.ts b/x-pack/plugins/canvas/public/components/color_dot/index.ts index aacfdf4e0cc74..72936f6133886 100644 --- a/x-pack/plugins/canvas/public/components/color_dot/index.ts +++ b/x-pack/plugins/canvas/public/components/color_dot/index.ts @@ -4,9 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { pure } from 'recompose'; - -import { ColorDot as Component } from './color_dot'; - -export { Props } from './color_dot'; -export const ColorDot = pure(Component); +export { ColorDot } from './color_dot'; diff --git a/x-pack/plugins/canvas/public/components/color_manager/color_manager.tsx b/x-pack/plugins/canvas/public/components/color_manager/color_manager.tsx index 8855bffc5e771..88bf93a3ca84a 100644 --- a/x-pack/plugins/canvas/public/components/color_manager/color_manager.tsx +++ b/x-pack/plugins/canvas/public/components/color_manager/color_manager.tsx @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiButtonIcon, EuiFieldText, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; -import React, { FunctionComponent } from 'react'; +import { EuiButtonIcon, EuiFieldText, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import tinycolor from 'tinycolor2'; import { ColorDot } from '../color_dot/color_dot'; @@ -15,17 +15,17 @@ import { ComponentStrings } from '../../../i18n/components'; const { ColorManager: strings } = ComponentStrings; export interface Props { + /** + * Determines if the add/remove buttons are displayed. + * @default false + */ + hasButtons?: boolean; /** The function to call when the Add Color button is clicked. The button will be disabled if there is no handler. */ onAddColor?: (value: string) => void; /** The function to call when the value is changed */ onChange: (value: string) => void; /** The function to call when the Remove Color button is clicked. The button will be disabled if there is no handler. */ onRemoveColor?: (value: string) => void; - /** - * Determines if the add/remove buttons are displayed. - * @default false - */ - hasButtons?: boolean; /** * The value of the color manager. Only honors valid CSS values. * @default '' @@ -33,12 +33,12 @@ export interface Props { value?: string; } -export const ColorManager: FunctionComponent = ({ - value = '', +export const ColorManager: FC = ({ + hasButtons = false, onAddColor, - onRemoveColor, onChange, - hasButtons = false, + onRemoveColor, + value = '', }) => { const tc = tinycolor(value); const validColor = tc.isValid(); diff --git a/x-pack/plugins/canvas/public/components/color_manager/index.ts b/x-pack/plugins/canvas/public/components/color_manager/index.ts index d7f59b38a74c5..9958c17cf1941 100644 --- a/x-pack/plugins/canvas/public/components/color_manager/index.ts +++ b/x-pack/plugins/canvas/public/components/color_manager/index.ts @@ -4,9 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { pure } from 'recompose'; - -import { ColorManager as Component } from './color_manager'; - -export { Props } from './color_manager'; -export const ColorManager = pure(Component); +export { ColorManager, Props } from './color_manager'; diff --git a/x-pack/plugins/canvas/public/components/color_palette/color_palette.tsx b/x-pack/plugins/canvas/public/components/color_palette/color_palette.tsx index 09bc08f9ae541..d3b1936d4c365 100644 --- a/x-pack/plugins/canvas/public/components/color_palette/color_palette.tsx +++ b/x-pack/plugins/canvas/public/components/color_palette/color_palette.tsx @@ -4,15 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiIcon, EuiLink } from '@elastic/eui'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; -import React, { FunctionComponent } from 'react'; +import { EuiIcon, EuiLink } from '@elastic/eui'; import tinycolor from 'tinycolor2'; import { readableColor } from '../../lib/readable_color'; import { ColorDot } from '../color_dot'; import { ItemGrid } from '../item_grid'; -export interface Props { +interface Props { /** * An array of hexadecimal color values. Non-hex will be ignored. * @default [] @@ -32,7 +32,7 @@ export interface Props { value?: string; } -export const ColorPalette: FunctionComponent = ({ +export const ColorPalette: FC = ({ colors = [], colorsPerRow = 6, onChange, diff --git a/x-pack/plugins/canvas/public/components/color_palette/index.ts b/x-pack/plugins/canvas/public/components/color_palette/index.ts index fa71bc8b3b9b0..2605868b94279 100644 --- a/x-pack/plugins/canvas/public/components/color_palette/index.ts +++ b/x-pack/plugins/canvas/public/components/color_palette/index.ts @@ -4,8 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { pure } from 'recompose'; -import { ColorPalette as Component } from './color_palette'; - -export { Props } from './color_palette'; -export const ColorPalette = pure(Component); +export { ColorPalette } from './color_palette'; diff --git a/x-pack/plugins/canvas/public/components/color_picker/color_picker.tsx b/x-pack/plugins/canvas/public/components/color_picker/color_picker.tsx index 2bf17301b7b38..8de3ddb3d03a4 100644 --- a/x-pack/plugins/canvas/public/components/color_picker/color_picker.tsx +++ b/x-pack/plugins/canvas/public/components/color_picker/color_picker.tsx @@ -4,9 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ +import React, { FC } from 'react'; import PropTypes from 'prop-types'; -import React, { FunctionComponent } from 'react'; import tinycolor from 'tinycolor2'; + import { ColorManager, Props as ColorManagerProps } from '../color_manager'; import { ColorPalette } from '../color_palette'; @@ -18,7 +19,7 @@ export interface Props extends ColorManagerProps { colors?: string[]; } -export const ColorPicker: FunctionComponent = ({ +export const ColorPicker: FC = ({ colors = [], hasButtons = false, onAddColor, diff --git a/x-pack/plugins/canvas/public/components/color_picker/index.ts b/x-pack/plugins/canvas/public/components/color_picker/index.ts index 88968d11a665c..35dd067ab6d39 100644 --- a/x-pack/plugins/canvas/public/components/color_picker/index.ts +++ b/x-pack/plugins/canvas/public/components/color_picker/index.ts @@ -4,9 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { pure } from 'recompose'; - -import { ColorPicker as Component } from './color_picker'; - -export { Props } from './color_picker'; -export const ColorPicker = pure(Component); +export { ColorPicker, Props } from './color_picker'; diff --git a/x-pack/plugins/canvas/public/components/color_picker_popover/color_picker_popover.tsx b/x-pack/plugins/canvas/public/components/color_picker_popover/color_picker_popover.tsx index 9e8a6e88b649b..143e1a7cee6ac 100644 --- a/x-pack/plugins/canvas/public/components/color_picker_popover/color_picker_popover.tsx +++ b/x-pack/plugins/canvas/public/components/color_picker_popover/color_picker_popover.tsx @@ -4,20 +4,21 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiLink, PopoverAnchorPosition } from '@elastic/eui'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; -import React, { FunctionComponent } from 'react'; +import { EuiLink, PopoverAnchorPosition } from '@elastic/eui'; import tinycolor from 'tinycolor2'; + import { ColorDot } from '../color_dot'; import { ColorPicker, Props as ColorPickerProps } from '../color_picker'; import { Popover } from '../popover'; export interface Props extends ColorPickerProps { - anchorPosition: PopoverAnchorPosition; + anchorPosition?: PopoverAnchorPosition; ariaLabel?: string; } -export const ColorPickerPopover: FunctionComponent = (props: Props) => { +export const ColorPickerPopover: FC = (props: Props) => { const { value, anchorPosition, ariaLabel, ...rest } = props; const button = (handleClick: React.MouseEventHandler) => ( { +const getIcon = (type: IconType) => { if (type === null) { return; } @@ -36,19 +39,31 @@ const getIcon = (type) => { return ; }; -const getColumnName = (col) => (typeof col === 'string' ? col : col.name); +const getColumnName = (col: DatatableColumn) => (typeof col === 'string' ? col : col.name); -const getColumnType = (col) => col.type || null; +const getColumnType = (col: DatatableColumn) => col.type || null; -const getFormattedValue = (val, type) => { +const getFormattedValue = (val: any, type: any) => { if (type === 'date') { return moment(val).format(); } return String(val); }; -export const Datatable = ({ datatable, perPage, paginate, showHeader }) => ( - +interface Props { + datatable: DatatableType; + paginate?: boolean; + perPage?: number; + showHeader?: boolean; +} + +export const Datatable: FC = ({ + datatable, + paginate = false, + perPage = 10, + showHeader = false, +}) => ( + {({ rows, setPage, pageNumber, totalPages }) => (
      @@ -91,7 +106,7 @@ export const Datatable = ({ datatable, perPage, paginate, showHeader }) => ( Datatable.propTypes = { datatable: PropTypes.object.isRequired, - perPage: PropTypes.number, paginate: PropTypes.bool, + perPage: PropTypes.number, showHeader: PropTypes.bool, }; diff --git a/x-pack/plugins/canvas/public/components/datatable/index.js b/x-pack/plugins/canvas/public/components/datatable/index.ts similarity index 64% rename from x-pack/plugins/canvas/public/components/datatable/index.js rename to x-pack/plugins/canvas/public/components/datatable/index.ts index c7837005368e5..e39b909c53460 100644 --- a/x-pack/plugins/canvas/public/components/datatable/index.js +++ b/x-pack/plugins/canvas/public/components/datatable/index.ts @@ -4,7 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { pure } from 'recompose'; -import { Datatable as Component } from './datatable'; - -export const Datatable = pure(Component); +export { Datatable } from './datatable'; diff --git a/x-pack/plugins/canvas/public/components/font_picker/__snapshots__/font_picker.stories.storyshot b/x-pack/plugins/canvas/public/components/font_picker/__stories__/__snapshots__/font_picker.stories.storyshot similarity index 100% rename from x-pack/plugins/canvas/public/components/font_picker/__snapshots__/font_picker.stories.storyshot rename to x-pack/plugins/canvas/public/components/font_picker/__stories__/__snapshots__/font_picker.stories.storyshot diff --git a/x-pack/plugins/canvas/public/components/font_picker/font_picker.stories.tsx b/x-pack/plugins/canvas/public/components/font_picker/__stories__/font_picker.stories.tsx similarity index 84% rename from x-pack/plugins/canvas/public/components/font_picker/font_picker.stories.tsx rename to x-pack/plugins/canvas/public/components/font_picker/__stories__/font_picker.stories.tsx index 0ad1e01252002..34cb3d644cccb 100644 --- a/x-pack/plugins/canvas/public/components/font_picker/font_picker.stories.tsx +++ b/x-pack/plugins/canvas/public/components/font_picker/__stories__/font_picker.stories.tsx @@ -7,8 +7,8 @@ import { action } from '@storybook/addon-actions'; import { storiesOf } from '@storybook/react'; import React from 'react'; -import { americanTypewriter } from '../../../common/lib/fonts'; -import { FontPicker } from './font_picker'; +import { americanTypewriter } from '../../../../common/lib/fonts'; +import { FontPicker } from '../font_picker'; storiesOf('components/FontPicker', module) .add('default', () => ) diff --git a/x-pack/plugins/canvas/public/components/font_picker/font_picker.tsx b/x-pack/plugins/canvas/public/components/font_picker/font_picker.tsx index 556a3c5452160..2b75841e1b7a5 100644 --- a/x-pack/plugins/canvas/public/components/font_picker/font_picker.tsx +++ b/x-pack/plugins/canvas/public/components/font_picker/font_picker.tsx @@ -4,14 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiSuperSelect } from '@elastic/eui'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; -import React, { FunctionComponent } from 'react'; +import { EuiSuperSelect } from '@elastic/eui'; import { fonts, FontValue } from '../../../common/lib/fonts'; interface DisplayedFont { - value: string; label: string; + value: string; } interface Props { @@ -19,9 +19,7 @@ interface Props { value?: FontValue; } -export const FontPicker: FunctionComponent = (props) => { - const { value, onSelect } = props; - +export const FontPicker: FC = ({ value, onSelect }) => { // While fonts are strongly-typed, we also support custom fonts someone might type in. // So let's cast the fonts and allow for additions. const displayedFonts: DisplayedFont[] = fonts; @@ -46,10 +44,10 @@ export const FontPicker: FunctionComponent = (props) => { }; FontPicker.propTypes = { - /** Initial value of the Font Picker. */ - value: PropTypes.string, /** Function to execute when a Font is selected. */ onSelect: PropTypes.func, + /** Initial value of the Font Picker. */ + value: PropTypes.string, }; FontPicker.displayName = 'FontPicker'; diff --git a/x-pack/plugins/canvas/public/components/font_picker/index.js b/x-pack/plugins/canvas/public/components/font_picker/index.ts similarity index 64% rename from x-pack/plugins/canvas/public/components/font_picker/index.js rename to x-pack/plugins/canvas/public/components/font_picker/index.ts index 5ccb7846b7a77..339021a7e5712 100644 --- a/x-pack/plugins/canvas/public/components/font_picker/index.js +++ b/x-pack/plugins/canvas/public/components/font_picker/index.ts @@ -4,8 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { pure } from 'recompose'; - -import { FontPicker as Component } from './font_picker'; - -export const FontPicker = pure(Component); +export { FontPicker } from './font_picker'; diff --git a/x-pack/plugins/canvas/public/components/loading/index.ts b/x-pack/plugins/canvas/public/components/loading/index.ts index 81fedf3287184..745639955dcba 100644 --- a/x-pack/plugins/canvas/public/components/loading/index.ts +++ b/x-pack/plugins/canvas/public/components/loading/index.ts @@ -4,7 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { pure } from 'recompose'; -import { Loading as Component } from './loading'; - -export const Loading = pure(Component); +export { Loading } from './loading'; diff --git a/x-pack/plugins/canvas/public/components/loading/loading.tsx b/x-pack/plugins/canvas/public/components/loading/loading.tsx index 67db16d40d426..403be84295312 100644 --- a/x-pack/plugins/canvas/public/components/loading/loading.tsx +++ b/x-pack/plugins/canvas/public/components/loading/loading.tsx @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiIcon, EuiLoadingSpinner, isColorDark } from '@elastic/eui'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; -import React, { FunctionComponent } from 'react'; +import { EuiIcon, EuiLoadingSpinner, isColorDark } from '@elastic/eui'; import { hexToRgb } from '../../../common/lib/hex_to_rgb'; interface Props { @@ -15,7 +15,7 @@ interface Props { text?: string; } -export const Loading: FunctionComponent = ({ +export const Loading: FC = ({ animated = false, text = '', backgroundColor = '#000000', diff --git a/x-pack/plugins/canvas/public/components/shape_picker/index.ts b/x-pack/plugins/canvas/public/components/shape_picker/index.ts index d3ed85831cbe2..3ec86e45af236 100644 --- a/x-pack/plugins/canvas/public/components/shape_picker/index.ts +++ b/x-pack/plugins/canvas/public/components/shape_picker/index.ts @@ -4,8 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { pure } from 'recompose'; - -import { ShapePicker as Component } from './shape_picker'; - -export const ShapePicker = pure(Component); +export { ShapePicker } from './shape_picker'; diff --git a/x-pack/plugins/canvas/public/components/shape_picker/shape_picker.tsx b/x-pack/plugins/canvas/public/components/shape_picker/shape_picker.tsx index 56874fd3080f7..263654522c059 100644 --- a/x-pack/plugins/canvas/public/components/shape_picker/shape_picker.tsx +++ b/x-pack/plugins/canvas/public/components/shape_picker/shape_picker.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; import { EuiFlexGrid, EuiFlexItem, EuiLink } from '@elastic/eui'; import { ShapePreview } from '../shape_preview'; @@ -16,7 +16,7 @@ interface Props { onChange?: (key: string) => void; } -export const ShapePicker = ({ shapes, onChange = () => {} }: Props) => { +export const ShapePicker: FC = ({ shapes, onChange = () => {} }) => { return ( {Object.keys(shapes) @@ -33,6 +33,6 @@ export const ShapePicker = ({ shapes, onChange = () => {} }: Props) => { }; ShapePicker.propTypes = { - shapes: PropTypes.object.isRequired, onChange: PropTypes.func, + shapes: PropTypes.object.isRequired, }; diff --git a/x-pack/plugins/canvas/public/components/shape_picker_popover/index.tsx b/x-pack/plugins/canvas/public/components/shape_picker_popover/index.tsx index 1d4ae25a38fa2..06619c0626daf 100644 --- a/x-pack/plugins/canvas/public/components/shape_picker_popover/index.tsx +++ b/x-pack/plugins/canvas/public/components/shape_picker_popover/index.tsx @@ -4,8 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { pure } from 'recompose'; - -import { ShapePickerPopover as Component } from './shape_picker_popover'; - -export const ShapePickerPopover = pure(Component); +export { ShapePickerPopover } from './shape_picker_popover'; diff --git a/x-pack/plugins/canvas/public/components/shape_picker_popover/shape_picker_popover.tsx b/x-pack/plugins/canvas/public/components/shape_picker_popover/shape_picker_popover.tsx index d42e08d2bc852..d61d9e47a3a78 100644 --- a/x-pack/plugins/canvas/public/components/shape_picker_popover/shape_picker_popover.tsx +++ b/x-pack/plugins/canvas/public/components/shape_picker_popover/shape_picker_popover.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; import { EuiLink, EuiPanel } from '@elastic/eui'; import { Popover } from '../popover'; @@ -20,7 +20,7 @@ interface Props { ariaLabel?: string; } -export const ShapePickerPopover = ({ shapes, onChange, value, ariaLabel }: Props) => { +export const ShapePickerPopover: FC = ({ shapes, onChange, value, ariaLabel }) => { const button = (handleClick: React.MouseEventHandler) => ( @@ -37,7 +37,8 @@ export const ShapePickerPopover = ({ shapes, onChange, value, ariaLabel }: Props }; ShapePickerPopover.propTypes = { + ariaLabel: PropTypes.string, + onChange: PropTypes.func, shapes: PropTypes.object.isRequired, value: PropTypes.string, - onChange: PropTypes.func, }; diff --git a/x-pack/plugins/canvas/public/components/shape_preview/index.ts b/x-pack/plugins/canvas/public/components/shape_preview/index.ts index 4320a10d97a85..6027b1227a99a 100644 --- a/x-pack/plugins/canvas/public/components/shape_preview/index.ts +++ b/x-pack/plugins/canvas/public/components/shape_preview/index.ts @@ -4,8 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { pure } from 'recompose'; - -import { ShapePreview as Component } from './shape_preview'; - -export const ShapePreview = pure(Component); +export { ShapePreview } from './shape_preview'; diff --git a/x-pack/plugins/canvas/public/components/shape_preview/shape_preview.tsx b/x-pack/plugins/canvas/public/components/shape_preview/shape_preview.tsx index 4f67945e9ce13..3ff18f3aa4bc4 100644 --- a/x-pack/plugins/canvas/public/components/shape_preview/shape_preview.tsx +++ b/x-pack/plugins/canvas/public/components/shape_preview/shape_preview.tsx @@ -4,14 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; interface Props { shape?: string; } -export const ShapePreview = ({ shape }: Props) => { +export const ShapePreview: FC = ({ shape }) => { if (!shape) { return
      ; } diff --git a/x-pack/plugins/canvas/public/components/text_style_picker/__stories__/__snapshots__/text_style_picker.stories.storyshot b/x-pack/plugins/canvas/public/components/text_style_picker/__stories__/__snapshots__/text_style_picker.stories.storyshot new file mode 100644 index 0000000000000..ad236e701ceb0 --- /dev/null +++ b/x-pack/plugins/canvas/public/components/text_style_picker/__stories__/__snapshots__/text_style_picker.stories.storyshot @@ -0,0 +1,975 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Storyshots components/TextStylePicker default 1`] = ` +
      +
      +
      +
      +
      +
      + +
      +
      + + Select an option: + , is selected + +
      +
      +
      +
      +
      +
      + +
      + +
      + + +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      +
      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      +
      +
      +`; + +exports[`Storyshots components/TextStylePicker interactive 1`] = ` +
      +
      +
      +
      +
      +
      + +
      +
      + + Select an option: + , is selected + +
      +
      +
      +
      +
      +
      + +
      + +
      + + +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      +
      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      +
      +
      +`; diff --git a/x-pack/plugins/canvas/public/components/text_style_picker/__stories__/text_style_picker.stories.tsx b/x-pack/plugins/canvas/public/components/text_style_picker/__stories__/text_style_picker.stories.tsx new file mode 100644 index 0000000000000..b33a34fcd5e65 --- /dev/null +++ b/x-pack/plugins/canvas/public/components/text_style_picker/__stories__/text_style_picker.stories.tsx @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState } from 'react'; +import { storiesOf } from '@storybook/react'; +import { action } from '@storybook/addon-actions'; + +import { TextStylePicker } from '../text_style_picker'; + +const Interactive = () => { + const [props, setProps] = useState({}); + return ; +}; + +storiesOf('components/TextStylePicker', module) + .addDecorator((fn) =>
      {fn()}
      ) + .add('default', () => ) + .add('interactive', () => ); diff --git a/x-pack/plugins/canvas/public/components/text_style_picker/font_sizes.js b/x-pack/plugins/canvas/public/components/text_style_picker/font_sizes.ts similarity index 100% rename from x-pack/plugins/canvas/public/components/text_style_picker/font_sizes.js rename to x-pack/plugins/canvas/public/components/text_style_picker/font_sizes.ts diff --git a/x-pack/plugins/canvas/public/components/text_style_picker/index.js b/x-pack/plugins/canvas/public/components/text_style_picker/index.ts similarity index 61% rename from x-pack/plugins/canvas/public/components/text_style_picker/index.js rename to x-pack/plugins/canvas/public/components/text_style_picker/index.ts index 79bde95723682..16fb39b660a0c 100644 --- a/x-pack/plugins/canvas/public/components/text_style_picker/index.js +++ b/x-pack/plugins/canvas/public/components/text_style_picker/index.ts @@ -4,7 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { pure } from 'recompose'; -import { TextStylePicker as Component } from './text_style_picker'; - -export const TextStylePicker = pure(Component); +export { TextStylePicker } from './text_style_picker'; diff --git a/x-pack/plugins/canvas/public/components/text_style_picker/text_style_picker.js b/x-pack/plugins/canvas/public/components/text_style_picker/text_style_picker.tsx similarity index 54% rename from x-pack/plugins/canvas/public/components/text_style_picker/text_style_picker.js rename to x-pack/plugins/canvas/public/components/text_style_picker/text_style_picker.tsx index 48d52abb03125..3dfc55919395d 100644 --- a/x-pack/plugins/canvas/public/components/text_style_picker/text_style_picker.js +++ b/x-pack/plugins/canvas/public/components/text_style_picker/text_style_picker.tsx @@ -4,9 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC, useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import { EuiFlexGroup, EuiFlexItem, EuiSelect, EuiSpacer, EuiButtonGroup } from '@elastic/eui'; +import { FontValue } from 'src/plugins/expressions'; import { ComponentStrings } from '../../../i18n'; import { FontPicker } from '../font_picker'; import { ColorPickerPopover } from '../color_picker_popover'; @@ -14,54 +15,75 @@ import { fontSizes } from './font_sizes'; const { TextStylePicker: strings } = ComponentStrings; -export const TextStylePicker = ({ - family, - size, - align, - color, - weight, - underline, - italic, - onChange, - colors, -}) => { - const alignmentButtons = [ - { - id: 'left', - label: strings.getAlignLeftOption(), - iconType: 'editorAlignLeft', - }, - { - id: 'center', - label: strings.getAlignCenterOption(), - iconType: 'editorAlignCenter', - }, - { - id: 'right', - label: strings.getAlignRightOption(), - iconType: 'editorAlignRight', - }, - ]; - - const styleButtons = [ - { - id: 'bold', - label: strings.getStyleBoldOption(), - iconType: 'editorBold', - }, - { - id: 'italic', - label: strings.getStyleItalicOption(), - iconType: 'editorItalic', - }, - { - id: 'underline', - label: strings.getStyleUnderlineOption(), - iconType: 'editorUnderline', - }, - ]; - - const stylesSelectedMap = { +interface BaseProps { + family?: FontValue; + size?: number; + align?: 'left' | 'center' | 'right'; + color?: string; + weight?: 'bold' | 'normal'; + underline?: boolean; + italic?: boolean; +} + +interface Props extends BaseProps { + colors?: string[]; + onChange: (props: BaseProps) => void; +} + +type StyleType = 'bold' | 'italic' | 'underline'; + +const alignmentButtons = [ + { + id: 'left', + label: strings.getAlignLeftOption(), + iconType: 'editorAlignLeft', + }, + { + id: 'center', + label: strings.getAlignCenterOption(), + iconType: 'editorAlignCenter', + }, + { + id: 'right', + label: strings.getAlignRightOption(), + iconType: 'editorAlignRight', + }, +]; + +const styleButtons = [ + { + id: 'bold', + label: strings.getStyleBoldOption(), + iconType: 'editorBold', + }, + { + id: 'italic', + label: strings.getStyleItalicOption(), + iconType: 'editorItalic', + }, + { + id: 'underline', + label: strings.getStyleUnderlineOption(), + iconType: 'editorUnderline', + }, +]; + +export const TextStylePicker: FC = (props) => { + const [style, setStyle] = useState(props); + + const { + align = 'left', + color, + colors, + family, + italic = false, + onChange, + size = 14, + underline = false, + weight = 'normal', + } = style; + + const stylesSelectedMap: Record = { ['bold']: weight === 'bold', ['italic']: Boolean(italic), ['underline']: Boolean(underline), @@ -72,31 +94,22 @@ export const TextStylePicker = ({ fontSizes.sort((a, b) => a - b); } - const doChange = (propName, value) => { - onChange({ - family, - size, - align, - color, - weight: weight || 'normal', - underline: underline || false, - italic: italic || false, - [propName]: value, - }); - }; + useEffect(() => onChange(style), [onChange, style]); - const onAlignmentChange = (optionId) => doChange('align', optionId); + const doChange = (propName: keyof Props, value: string | boolean | number) => { + setStyle({ ...style, [propName]: value }); + }; - const onStyleChange = (optionId) => { - let prop; + const onStyleChange = (optionId: string) => { + let prop: 'weight' | 'italic' | 'underline'; let value; if (optionId === 'bold') { prop = 'weight'; value = !stylesSelectedMap[optionId] ? 'bold' : 'normal'; } else { - prop = optionId; - value = !stylesSelectedMap[optionId]; + prop = optionId as 'italic' | 'underline'; + value = !stylesSelectedMap[prop]; } doChange(prop, value); @@ -106,14 +119,18 @@ export const TextStylePicker = ({
      - doChange('family', value)} /> + {family ? ( + doChange('family', value)} /> + ) : ( + doChange('family', value)} /> + )} doChange('size', Number(e.target.value))} - options={fontSizes.map((size) => ({ text: String(size), value: size }))} + options={fontSizes.map((fontSize) => ({ text: String(fontSize), value: fontSize }))} prepend="Size" /> @@ -147,7 +164,7 @@ export const TextStylePicker = ({ buttonSize="compressed" isIconOnly idSelected={align} - onChange={onAlignmentChange} + onChange={(optionId: string) => doChange('align', optionId)} className="canvasSidebar__buttonGroup" /> @@ -159,9 +176,9 @@ export const TextStylePicker = ({ TextStylePicker.propTypes = { family: PropTypes.string, size: PropTypes.number, - align: PropTypes.string, + align: PropTypes.oneOf(['left', 'center', 'right']), color: PropTypes.string, - weight: PropTypes.string, + weight: PropTypes.oneOf(['normal', 'bold']), underline: PropTypes.bool, italic: PropTypes.bool, onChange: PropTypes.func.isRequired, @@ -171,4 +188,5 @@ TextStylePicker.propTypes = { TextStylePicker.defaultProps = { align: 'left', size: 14, + weight: 'normal', }; diff --git a/x-pack/plugins/canvas/public/components/tooltip_icon/index.ts b/x-pack/plugins/canvas/public/components/tooltip_icon/index.ts index 6e71baa364785..55c2f7090629c 100644 --- a/x-pack/plugins/canvas/public/components/tooltip_icon/index.ts +++ b/x-pack/plugins/canvas/public/components/tooltip_icon/index.ts @@ -4,8 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import { pure } from 'recompose'; -import { TooltipIcon as Component } from './tooltip_icon'; -export { IconType } from './tooltip_icon'; - -export const TooltipIcon = pure(Component); +export { TooltipIcon, IconType } from './tooltip_icon'; diff --git a/x-pack/plugins/canvas/public/components/tooltip_icon/tooltip_icon.tsx b/x-pack/plugins/canvas/public/components/tooltip_icon/tooltip_icon.tsx index 78c2b0ec53c9f..d91bb4bc9add9 100644 --- a/x-pack/plugins/canvas/public/components/tooltip_icon/tooltip_icon.tsx +++ b/x-pack/plugins/canvas/public/components/tooltip_icon/tooltip_icon.tsx @@ -5,7 +5,7 @@ */ /* eslint react/forbid-elements: 0 */ -import React from 'react'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; import { EuiIconTip, PropsOf } from '@elastic/eui'; @@ -21,7 +21,7 @@ interface Props extends Omit { icon: IconType; } -export const TooltipIcon = ({ icon = IconType.info, ...rest }: Props) => { +export const TooltipIcon: FC = ({ icon = IconType.info, ...rest }) => { const icons = { [IconType.error]: { type: 'alert', color: 'danger' }, [IconType.warning]: { type: 'alert', color: 'warning' }, From b65ec4e07d0c47e86f930e9e72f5c3fd030aac46 Mon Sep 17 00:00:00 2001 From: John Schulz Date: Tue, 28 Jul 2020 19:44:30 -0400 Subject: [PATCH 090/126] Get branch name from platform vs disk (#73534) https://github.com/elastic/kibana/blob/fa93a81ba67f5177024f1ab3b4ac68919a7824dc/src/core/server/plugins/types.ts#L280 & https://github.com/elastic/kibana/blob/27dbcb27964353619f686066c6ba8f25954a0881/src/core/server/config/types.ts#L25 Co-authored-by: Elastic Machine --- x-pack/plugins/ingest_manager/server/plugin.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/plugins/ingest_manager/server/plugin.ts b/x-pack/plugins/ingest_manager/server/plugin.ts index 5664a87501016..e7495df254a09 100644 --- a/x-pack/plugins/ingest_manager/server/plugin.ts +++ b/x-pack/plugins/ingest_manager/server/plugin.ts @@ -15,7 +15,6 @@ import { HttpServiceSetup, } from 'kibana/server'; import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; -import packageJSON from '../../../../package.json'; import { LicensingPluginSetup, ILicense } from '../../licensing/server'; import { EncryptedSavedObjectsPluginStart, @@ -155,7 +154,7 @@ export class IngestManagerPlugin this.config$ = this.initializerContext.config.create(); this.isProductionMode = this.initializerContext.env.mode.prod; this.kibanaVersion = this.initializerContext.env.packageInfo.version; - this.kibanaBranch = packageJSON.branch; + this.kibanaBranch = this.initializerContext.env.packageInfo.branch; this.logger = this.initializerContext.logger.get(); } From b399fb03d1677bba0cd61cb5de4e0957fa1910fc Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Tue, 28 Jul 2020 17:47:41 -0600 Subject: [PATCH 091/126] [SIEM][Detection Engine][Lists] Adds the ability to change the timeout limits from 10 seconds for loads for imports (#73103) ## Summary By default the upload time limit for payloads is 10 seconds. This is really too short and we were getting internal QA bug reports that uploads are timing out on large value list importing. This PR adds the plumbing and unit tests to make the timeout configurable for routes. * Adds a single timeout option for routes and then normalizes that through Hapi for the socket, payload, and server timeouts. * Adds unit tests which test the various options * Adds integration tests which test the various options * Adds some NOTES about where there are odd behaviors/bugs within Hapi around validations and the timeouts * Adds a configurable 5 minute timeout to the large value lists route **Manual testing of the feature** You can manually test this by adding a configurable option to your chrome network throttle like so below where you throttle upload by some configurable amount. I chose to use 300 kbs/s upload Screen Shot 2020-07-23 at 11 26 01 AM And then run an import of large value lists using a large enough file that it will exceed 5 minutes: ![screen-shot-upload](https://user-images.githubusercontent.com/1151048/88318584-28ef6000-ccd8-11ea-90a1-8ca4aafabcb4.png) After 5 minutes you should see this message within your server side messages if you have configured your kibana.dev.yml to allow for these messages: ```ts server respons [10:52:31.377] [access:lists-all] POST /api/lists/items/_import?type=keyword 408 318292ms - 9.0B ``` Note that it should show you that it is trying to return a `408` after `318292ms` the timeout period. Sometimes you will get the 408 in the browser and sometimes the browser actually will not respect the 408 and continue staying in a pending state forever. This seems to be browser side issue and not a client/user land issue. If you get the browser message it will be this error toaster ![timeout-message](https://user-images.githubusercontent.com/1151048/88318760-74a20980-ccd8-11ea-9b7b-0d27f8eb6bce.png) ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md) - [x] [Documentation](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#writing-documentation) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process) --- ...a-plugin-core-server.routeconfigoptions.md | 1 + ...-core-server.routeconfigoptions.timeout.md | 13 ++ src/core/server/http/http_server.test.ts | 127 ++++++++++++++++++ src/core/server/http/http_server.ts | 22 ++- .../http/integration_tests/router.test.ts | 124 +++++++++++++++++ src/core/server/http/router/request.ts | 2 + src/core/server/http/router/route.ts | 6 + src/core/server/server.api.md | 1 + x-pack/plugins/lists/common/constants.mock.ts | 4 +- x-pack/plugins/lists/server/config.mock.ts | 2 + x-pack/plugins/lists/server/config.test.ts | 22 +++ x-pack/plugins/lists/server/config.ts | 10 ++ .../server/routes/import_list_item_route.ts | 1 + .../server/services/lists/list_client.mock.ts | 2 + 14 files changed, 333 insertions(+), 4 deletions(-) create mode 100644 docs/development/core/server/kibana-plugin-core-server.routeconfigoptions.timeout.md diff --git a/docs/development/core/server/kibana-plugin-core-server.routeconfigoptions.md b/docs/development/core/server/kibana-plugin-core-server.routeconfigoptions.md index 5a6103dfc57d4..fee6124f8d866 100644 --- a/docs/development/core/server/kibana-plugin-core-server.routeconfigoptions.md +++ b/docs/development/core/server/kibana-plugin-core-server.routeconfigoptions.md @@ -19,5 +19,6 @@ export interface RouteConfigOptions | [authRequired](./kibana-plugin-core-server.routeconfigoptions.authrequired.md) | boolean | 'optional' | Defines authentication mode for a route: - true. A user has to have valid credentials to access a resource - false. A user can access a resource without any credentials. - 'optional'. A user can access a resource if has valid credentials or no credentials at all. Can be useful when we grant access to a resource but want to identify a user if possible.Defaults to true if an auth mechanism is registered. | | [body](./kibana-plugin-core-server.routeconfigoptions.body.md) | Method extends 'get' | 'options' ? undefined : RouteConfigOptionsBody | Additional body options [RouteConfigOptionsBody](./kibana-plugin-core-server.routeconfigoptionsbody.md). | | [tags](./kibana-plugin-core-server.routeconfigoptions.tags.md) | readonly string[] | Additional metadata tag strings to attach to the route. | +| [timeout](./kibana-plugin-core-server.routeconfigoptions.timeout.md) | number | Timeouts for processing durations. Response timeout is in milliseconds. Default value: 2 minutes | | [xsrfRequired](./kibana-plugin-core-server.routeconfigoptions.xsrfrequired.md) | Method extends 'get' ? never : boolean | Defines xsrf protection requirements for a route: - true. Requires an incoming POST/PUT/DELETE request to contain kbn-xsrf header. - false. Disables xsrf protection.Set to true by default | diff --git a/docs/development/core/server/kibana-plugin-core-server.routeconfigoptions.timeout.md b/docs/development/core/server/kibana-plugin-core-server.routeconfigoptions.timeout.md new file mode 100644 index 0000000000000..479fcf883ec4d --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.routeconfigoptions.timeout.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [RouteConfigOptions](./kibana-plugin-core-server.routeconfigoptions.md) > [timeout](./kibana-plugin-core-server.routeconfigoptions.timeout.md) + +## RouteConfigOptions.timeout property + +Timeouts for processing durations. Response timeout is in milliseconds. Default value: 2 minutes + +Signature: + +```typescript +timeout?: number; +``` diff --git a/src/core/server/http/http_server.test.ts b/src/core/server/http/http_server.test.ts index 601eba835a54e..007d75a69b955 100644 --- a/src/core/server/http/http_server.test.ts +++ b/src/core/server/http/http_server.test.ts @@ -992,6 +992,133 @@ describe('body options', () => { }); }); +describe('timeout options', () => { + test('should accept a socket "timeout" which is 3 minutes in milliseconds, "300000" for a POST', async () => { + const { registerRouter, server: innerServer } = await server.setup(config); + + const router = new Router('', logger, enhanceWithContext); + router.post( + { + path: '/', + validate: false, + options: { timeout: 300000 }, + }, + (context, req, res) => { + try { + return res.ok({ body: { timeout: req.route.options.timeout } }); + } catch (err) { + return res.internalError({ body: err.message }); + } + } + ); + registerRouter(router); + await server.start(); + await supertest(innerServer.listener).post('/').send({ test: 1 }).expect(200, { + timeout: 300000, + }); + }); + + test('should accept a socket "timeout" which is 3 minutes in milliseconds, "300000" for a GET', async () => { + const { registerRouter, server: innerServer } = await server.setup(config); + + const router = new Router('', logger, enhanceWithContext); + router.get( + { + path: '/', + validate: false, + options: { timeout: 300000 }, + }, + (context, req, res) => { + try { + return res.ok({ body: { timeout: req.route.options.timeout } }); + } catch (err) { + return res.internalError({ body: err.message }); + } + } + ); + registerRouter(router); + await server.start(); + await supertest(innerServer.listener).get('/').expect(200, { + timeout: 300000, + }); + }); + + test('should accept a socket "timeout" which is 3 minutes in milliseconds, "300000" for a DELETE', async () => { + const { registerRouter, server: innerServer } = await server.setup(config); + + const router = new Router('', logger, enhanceWithContext); + router.delete( + { + path: '/', + validate: false, + options: { timeout: 300000 }, + }, + (context, req, res) => { + try { + return res.ok({ body: { timeout: req.route.options.timeout } }); + } catch (err) { + return res.internalError({ body: err.message }); + } + } + ); + registerRouter(router); + await server.start(); + await supertest(innerServer.listener).delete('/').expect(200, { + timeout: 300000, + }); + }); + + test('should accept a socket "timeout" which is 3 minutes in milliseconds, "300000" for a PUT', async () => { + const { registerRouter, server: innerServer } = await server.setup(config); + + const router = new Router('', logger, enhanceWithContext); + router.put( + { + path: '/', + validate: false, + options: { timeout: 300000 }, + }, + (context, req, res) => { + try { + return res.ok({ body: { timeout: req.route.options.timeout } }); + } catch (err) { + return res.internalError({ body: err.message }); + } + } + ); + registerRouter(router); + await server.start(); + await supertest(innerServer.listener).put('/').expect(200, { + timeout: 300000, + }); + }); + + test('should accept a socket "timeout" which is 3 minutes in milliseconds, "300000" for a PATCH', async () => { + const { registerRouter, server: innerServer } = await server.setup(config); + + const router = new Router('', logger, enhanceWithContext); + router.patch( + { + path: '/', + validate: false, + options: { timeout: 300000 }, + }, + (context, req, res) => { + try { + return res.ok({ body: { timeout: req.route.options.timeout } }); + } catch (err) { + return res.internalError({ body: err.message }); + } + } + ); + registerRouter(router); + await server.start(); + await supertest(innerServer.listener).patch('/').expect(200, { + timeout: 300000, + }); + }); +}); + test('should return a stream in the body', async () => { const { registerRouter, server: innerServer } = await server.setup(config); diff --git a/src/core/server/http/http_server.ts b/src/core/server/http/http_server.ts index 9c16162d69334..4b70f58deba99 100644 --- a/src/core/server/http/http_server.ts +++ b/src/core/server/http/http_server.ts @@ -161,8 +161,10 @@ export class HttpServer { this.log.debug(`registering route handler for [${route.path}]`); // Hapi does not allow payload validation to be specified for 'head' or 'get' requests const validate = isSafeMethod(route.method) ? undefined : { payload: true }; - const { authRequired, tags, body = {} } = route.options; + const { authRequired, tags, body = {}, timeout } = route.options; const { accepts: allow, maxBytes, output, parse } = body; + // Hapi does not allow timeouts on payloads to be specified for 'head' or 'get' requests + const payloadTimeout = isSafeMethod(route.method) || timeout == null ? undefined : timeout; const kibanaRouteState: KibanaRouteState = { xsrfRequired: route.options.xsrfRequired ?? !isSafeMethod(route.method), @@ -181,9 +183,23 @@ export class HttpServer { // validation applied in ./http_tools#getServerOptions // (All NP routes are already required to specify their own validation in order to access the payload) validate, - payload: [allow, maxBytes, output, parse].some((v) => typeof v !== 'undefined') - ? { allow, maxBytes, output, parse } + payload: [allow, maxBytes, output, parse, payloadTimeout].some( + (v) => typeof v !== 'undefined' + ) + ? { + allow, + maxBytes, + output, + parse, + timeout: payloadTimeout, + } : undefined, + timeout: + timeout != null + ? { + socket: timeout + 1, // Hapi server requires the socket to be greater than payload settings so we add 1 millisecond + } + : undefined, }, }); } diff --git a/src/core/server/http/integration_tests/router.test.ts b/src/core/server/http/integration_tests/router.test.ts index bb36fefa96611..434e22e3cf6f5 100644 --- a/src/core/server/http/integration_tests/router.test.ts +++ b/src/core/server/http/integration_tests/router.test.ts @@ -302,6 +302,130 @@ describe('Options', () => { }); }); }); + + describe('timeout', () => { + it('should timeout if configured with a small timeout value for a POST', async () => { + const { server: innerServer, createRouter } = await server.setup(setupDeps); + const router = createRouter('/'); + + router.post( + { path: '/a', validate: false, options: { timeout: 1000 } }, + async (context, req, res) => { + await new Promise((resolve) => setTimeout(resolve, 2000)); + return res.ok({}); + } + ); + router.post({ path: '/b', validate: false }, (context, req, res) => res.ok({})); + await server.start(); + expect(supertest(innerServer.listener).post('/a')).rejects.toThrow('socket hang up'); + await supertest(innerServer.listener).post('/b').expect(200, {}); + }); + + it('should timeout if configured with a small timeout value for a PUT', async () => { + const { server: innerServer, createRouter } = await server.setup(setupDeps); + const router = createRouter('/'); + + router.put( + { path: '/a', validate: false, options: { timeout: 1000 } }, + async (context, req, res) => { + await new Promise((resolve) => setTimeout(resolve, 2000)); + return res.ok({}); + } + ); + router.put({ path: '/b', validate: false }, (context, req, res) => res.ok({})); + await server.start(); + + expect(supertest(innerServer.listener).put('/a')).rejects.toThrow('socket hang up'); + await supertest(innerServer.listener).put('/b').expect(200, {}); + }); + + it('should timeout if configured with a small timeout value for a DELETE', async () => { + const { server: innerServer, createRouter } = await server.setup(setupDeps); + const router = createRouter('/'); + + router.delete( + { path: '/a', validate: false, options: { timeout: 1000 } }, + async (context, req, res) => { + await new Promise((resolve) => setTimeout(resolve, 2000)); + return res.ok({}); + } + ); + router.delete({ path: '/b', validate: false }, (context, req, res) => res.ok({})); + await server.start(); + expect(supertest(innerServer.listener).delete('/a')).rejects.toThrow('socket hang up'); + await supertest(innerServer.listener).delete('/b').expect(200, {}); + }); + + it('should timeout if configured with a small timeout value for a GET', async () => { + const { server: innerServer, createRouter } = await server.setup(setupDeps); + const router = createRouter('/'); + + router.get( + // Note: There is a bug within Hapi Server where it cannot set the payload timeout for a GET call but it also cannot configure a timeout less than the payload body + // so the least amount of possible time to configure the timeout is 10 seconds. + { path: '/a', validate: false, options: { timeout: 100000 } }, + async (context, req, res) => { + // Cause a wait of 20 seconds to cause the socket hangup + await new Promise((resolve) => setTimeout(resolve, 200000)); + return res.ok({}); + } + ); + router.get({ path: '/b', validate: false }, (context, req, res) => res.ok({})); + await server.start(); + + expect(supertest(innerServer.listener).get('/a')).rejects.toThrow('socket hang up'); + await supertest(innerServer.listener).get('/b').expect(200, {}); + }); + + it('should not timeout if configured with a 5 minute timeout value for a POST', async () => { + const { server: innerServer, createRouter } = await server.setup(setupDeps); + const router = createRouter('/'); + + router.post( + { path: '/a', validate: false, options: { timeout: 300000 } }, + async (context, req, res) => res.ok({}) + ); + await server.start(); + await supertest(innerServer.listener).post('/a').expect(200, {}); + }); + + it('should not timeout if configured with a 5 minute timeout value for a PUT', async () => { + const { server: innerServer, createRouter } = await server.setup(setupDeps); + const router = createRouter('/'); + + router.put( + { path: '/a', validate: false, options: { timeout: 300000 } }, + async (context, req, res) => res.ok({}) + ); + await server.start(); + + await supertest(innerServer.listener).put('/a').expect(200, {}); + }); + + it('should not timeout if configured with a 5 minute timeout value for a DELETE', async () => { + const { server: innerServer, createRouter } = await server.setup(setupDeps); + const router = createRouter('/'); + + router.delete( + { path: '/a', validate: false, options: { timeout: 300000 } }, + async (context, req, res) => res.ok({}) + ); + await server.start(); + await supertest(innerServer.listener).delete('/a').expect(200, {}); + }); + + it('should not timeout if configured with a 5 minute timeout value for a GET', async () => { + const { server: innerServer, createRouter } = await server.setup(setupDeps); + const router = createRouter('/'); + + router.get( + { path: '/a', validate: false, options: { timeout: 300000 } }, + async (context, req, res) => res.ok({}) + ); + await server.start(); + await supertest(innerServer.listener).get('/a').expect(200, {}); + }); + }); }); describe('Cache-Control', () => { diff --git a/src/core/server/http/router/request.ts b/src/core/server/http/router/request.ts index fefd75ad9710e..0e73431fe7c6d 100644 --- a/src/core/server/http/router/request.ts +++ b/src/core/server/http/router/request.ts @@ -197,12 +197,14 @@ export class KibanaRequest< private getRouteInfo(request: Request): KibanaRequestRoute { const method = request.method as Method; const { parse, maxBytes, allow, output } = request.route.settings.payload || {}; + const timeout = request.route.settings.timeout?.socket; const options = ({ authRequired: this.getAuthRequired(request), // some places in LP call KibanaRequest.from(request) manually. remove fallback to true before v8 xsrfRequired: (request.route.settings.app as KibanaRouteState)?.xsrfRequired ?? true, tags: request.route.settings.tags || [], + timeout: typeof timeout === 'number' ? timeout - 1 : undefined, // We are forced to have the timeout be 1 millisecond greater than the server and payload so we subtract one here to give the user consist settings body: isSafeMethod(method) ? undefined : { diff --git a/src/core/server/http/router/route.ts b/src/core/server/http/router/route.ts index 9789d266587af..676c494bec522 100644 --- a/src/core/server/http/router/route.ts +++ b/src/core/server/http/router/route.ts @@ -144,6 +144,12 @@ export interface RouteConfigOptions { * Additional body options {@link RouteConfigOptionsBody}. */ body?: Method extends 'get' | 'options' ? undefined : RouteConfigOptionsBody; + + /** + * Timeouts for processing durations. Response timeout is in milliseconds. + * Default value: 2 minutes + */ + timeout?: number; } /** diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index bb4f2f30ac18f..c94151f8cee17 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -1859,6 +1859,7 @@ export interface RouteConfigOptions { authRequired?: boolean | 'optional'; body?: Method extends 'get' | 'options' ? undefined : RouteConfigOptionsBody; tags?: readonly string[]; + timeout?: number; xsrfRequired?: Method extends 'get' ? never : boolean; } diff --git a/x-pack/plugins/lists/common/constants.mock.ts b/x-pack/plugins/lists/common/constants.mock.ts index 22706890e2020..b7609b5a3602a 100644 --- a/x-pack/plugins/lists/common/constants.mock.ts +++ b/x-pack/plugins/lists/common/constants.mock.ts @@ -3,8 +3,9 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { EntriesArray } from './schemas/types'; +import moment from 'moment'; +import { EntriesArray } from './schemas/types'; export const DATE_NOW = '2020-04-20T15:25:31.830Z'; export const OLD_DATE_RELATIVE_TO_DATE_NOW = '2020-04-19T15:25:31.830Z'; export const USER = 'some user'; @@ -64,3 +65,4 @@ export const CURSOR = 'c29tZXN0cmluZ2ZvcnlvdQ=='; export const _VERSION = 'WzI5NywxXQ=='; export const VERSION = 1; export const IMMUTABLE = false; +export const IMPORT_TIMEOUT = moment.duration(5, 'minutes'); diff --git a/x-pack/plugins/lists/server/config.mock.ts b/x-pack/plugins/lists/server/config.mock.ts index 3cf5040c73675..b272f18c4e809 100644 --- a/x-pack/plugins/lists/server/config.mock.ts +++ b/x-pack/plugins/lists/server/config.mock.ts @@ -6,6 +6,7 @@ import { IMPORT_BUFFER_SIZE, + IMPORT_TIMEOUT, LIST_INDEX, LIST_ITEM_INDEX, MAX_IMPORT_PAYLOAD_BYTES, @@ -21,6 +22,7 @@ export const getConfigMock = (): Partial => ({ export const getConfigMockDecoded = (): ConfigType => ({ enabled: true, importBufferSize: IMPORT_BUFFER_SIZE, + importTimeout: IMPORT_TIMEOUT, listIndex: LIST_INDEX, listItemIndex: LIST_ITEM_INDEX, maxImportPayloadBytes: MAX_IMPORT_PAYLOAD_BYTES, diff --git a/x-pack/plugins/lists/server/config.test.ts b/x-pack/plugins/lists/server/config.test.ts index 60501322dcfa2..40b04edd4c007 100644 --- a/x-pack/plugins/lists/server/config.test.ts +++ b/x-pack/plugins/lists/server/config.test.ts @@ -4,6 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ +import moment from 'moment'; + import { ConfigSchema, ConfigType } from './config'; import { getConfigMock, getConfigMockDecoded } from './config.mock'; @@ -61,4 +63,24 @@ describe('config_schema', () => { '[importBufferSize]: Value must be equal to or greater than [1].' ); }); + + test('it throws if the "importTimeout" value is less than 2 minutes', () => { + const mock: ConfigType = { + ...getConfigMockDecoded(), + importTimeout: moment.duration(2, 'minutes').subtract(1, 'second'), + }; + expect(() => ConfigSchema.validate(mock)).toThrow( + '[importTimeout]: duration cannot be less than 2 minutes' + ); + }); + + test('it throws if the "importTimeout" value is greater than 1 hour', () => { + const mock: ConfigType = { + ...getConfigMockDecoded(), + importTimeout: moment.duration(1, 'hour').add(1, 'second'), + }; + expect(() => ConfigSchema.validate(mock)).toThrow( + '[importTimeout]: duration cannot be greater than 30 minutes' + ); + }); }); diff --git a/x-pack/plugins/lists/server/config.ts b/x-pack/plugins/lists/server/config.ts index 394f85ecfb642..6e36d135abfcc 100644 --- a/x-pack/plugins/lists/server/config.ts +++ b/x-pack/plugins/lists/server/config.ts @@ -9,6 +9,16 @@ import { TypeOf, schema } from '@kbn/config-schema'; export const ConfigSchema = schema.object({ enabled: schema.boolean({ defaultValue: true }), importBufferSize: schema.number({ defaultValue: 1000, min: 1 }), + importTimeout: schema.duration({ + defaultValue: '5m', + validate: (value) => { + if (value.asMinutes() < 2) { + throw new Error('duration cannot be less than 2 minutes'); + } else if (value.asMinutes() > 30) { + throw new Error('duration cannot be greater than 30 minutes'); + } + }, + }), listIndex: schema.string({ defaultValue: '.lists' }), listItemIndex: schema.string({ defaultValue: '.items' }), maxImportPayloadBytes: schema.number({ defaultValue: 9000000, min: 1 }), diff --git a/x-pack/plugins/lists/server/routes/import_list_item_route.ts b/x-pack/plugins/lists/server/routes/import_list_item_route.ts index 1003a0c52a794..e162e7829e456 100644 --- a/x-pack/plugins/lists/server/routes/import_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/import_list_item_route.ts @@ -27,6 +27,7 @@ export const importListItemRoute = (router: IRouter, config: ConfigType): void = parse: false, }, tags: ['access:lists-all'], + timeout: config.importTimeout.asMilliseconds(), }, path: `${LIST_ITEM_URL}/_import`, validate: { diff --git a/x-pack/plugins/lists/server/services/lists/list_client.mock.ts b/x-pack/plugins/lists/server/services/lists/list_client.mock.ts index e5036d561ddc6..a2959a024f292 100644 --- a/x-pack/plugins/lists/server/services/lists/list_client.mock.ts +++ b/x-pack/plugins/lists/server/services/lists/list_client.mock.ts @@ -11,6 +11,7 @@ import { getListResponseMock } from '../../../common/schemas/response/list_schem import { getCallClusterMock } from '../../../common/get_call_cluster.mock'; import { IMPORT_BUFFER_SIZE, + IMPORT_TIMEOUT, LIST_INDEX, LIST_ITEM_INDEX, MAX_IMPORT_PAYLOAD_BYTES, @@ -65,6 +66,7 @@ export const getListClientMock = (): ListClient => { config: { enabled: true, importBufferSize: IMPORT_BUFFER_SIZE, + importTimeout: IMPORT_TIMEOUT, listIndex: LIST_INDEX, listItemIndex: LIST_ITEM_INDEX, maxImportPayloadBytes: MAX_IMPORT_PAYLOAD_BYTES, From 89a392bd7cc1e6010c7518abcf948232ce855b79 Mon Sep 17 00:00:00 2001 From: John Schulz Date: Tue, 28 Jul 2020 19:55:13 -0400 Subject: [PATCH 092/126] [Ingest Manager] API sends 404 when package config id is missing (#73212) * Add test to confirm missing config responds w/ 404 Currently failing with a 500 as in https://github.com/elastic/kibana/issues/66388 * Use after() to remove items added by test. The test initally failed with a 500 when the `after` was added. Debugging narrowed it down to a missing default config. getDefaultAgentConfigId errors if there isn't a default config. The config is added by `setupIngestManager` which _was_ always called during plugin#start but is no longer. We could add the setup call to the test/suite, but instead I changed AgentConfigService.delete to use ensureDefaultAgentConfig instead of getDefaultAgentConfigId. ensureDefaultAgentConfig adds one if it's missing. The check in delete is to make sure we don't delete the default config. We can still do that and now we add a config if it wasn't already there (which seems like A Good Thing) * Fix package config path in OpenApi spec * Return 404 if package config id is invalid/missing * Change test for error displayed text Co-authored-by: Elastic Machine --- .../common/openapi/spec_oas3.json | 4 +- .../server/routes/package_config/handlers.ts | 23 +++-- .../server/services/agent_config.ts | 2 +- .../apis/index.js | 1 + .../apis/package_config/get.ts | 89 +++++++++++++++++++ .../apps/endpoint/policy_details.ts | 2 +- 6 files changed, 108 insertions(+), 13 deletions(-) create mode 100644 x-pack/test/ingest_manager_api_integration/apis/package_config/get.ts diff --git a/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json b/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json index e16edac5ddb7a..cfae2c450c824 100644 --- a/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json +++ b/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json @@ -922,7 +922,7 @@ }, "parameters": [] }, - "/packageConfigs": { + "/package_configs": { "get": { "summary": "PackageConfigs - List", "tags": [], @@ -1237,7 +1237,7 @@ ] } }, - "/packageConfigs/{packageConfigId}": { + "/package_configs/{packageConfigId}": { "get": { "summary": "PackageConfigs - Info", "tags": [], diff --git a/x-pack/plugins/ingest_manager/server/routes/package_config/handlers.ts b/x-pack/plugins/ingest_manager/server/routes/package_config/handlers.ts index 6b0c2fe9c2ff7..d2820cdbeb6c8 100644 --- a/x-pack/plugins/ingest_manager/server/routes/package_config/handlers.ts +++ b/x-pack/plugins/ingest_manager/server/routes/package_config/handlers.ts @@ -5,7 +5,7 @@ */ import { TypeOf } from '@kbn/config-schema'; import Boom from 'boom'; -import { RequestHandler } from 'src/core/server'; +import { RequestHandler, SavedObjectsErrorHelpers } from '../../../../../../src/core/server'; import { appContextService, packageConfigService } from '../../services'; import { getPackageInfo } from '../../services/epm/packages'; import { @@ -49,8 +49,12 @@ export const getOnePackageConfigHandler: RequestHandler> = async (context, request, response) => { const soClient = context.core.savedObjects.client; + const { packageConfigId } = request.params; + const notFoundResponse = () => + response.notFound({ body: { message: `Package config ${packageConfigId} not found` } }); + try { - const packageConfig = await packageConfigService.get(soClient, request.params.packageConfigId); + const packageConfig = await packageConfigService.get(soClient, packageConfigId); if (packageConfig) { return response.ok({ body: { @@ -58,17 +62,18 @@ export const getOnePackageConfigHandler: RequestHandler {} here + // because `this` has to point to the Mocha context + // see https://mochajs.org/#arrow-functions + + describe('Package Config - get by id', async function () { + skipIfNoDockerRegistry(providerContext); + let agentConfigId: string; + let packageConfigId: string; + + before(async function () { + if (!server.enabled) { + return; + } + const { body: agentConfigResponse } = await supertest + .post(`/api/ingest_manager/agent_configs`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'Test config', + namespace: 'default', + }); + agentConfigId = agentConfigResponse.item.id; + + const { body: packageConfigResponse } = await supertest + .post(`/api/ingest_manager/package_configs`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'filetest-1', + description: '', + namespace: 'default', + config_id: agentConfigId, + enabled: true, + output_id: '', + inputs: [], + package: { + name: 'filetest', + title: 'For File Tests', + version: '0.1.0', + }, + }); + packageConfigId = packageConfigResponse.item.id; + }); + + after(async function () { + if (!server.enabled) { + return; + } + + await supertest + .post(`/api/ingest_manager/agent_configs/delete`) + .set('kbn-xsrf', 'xxxx') + .send({ agentConfigId }) + .expect(200); + + await supertest + .post(`/api/ingest_manager/package_configs/delete`) + .set('kbn-xsrf', 'xxxx') + .send({ packageConfigIds: [packageConfigId] }) + .expect(200); + }); + + it('should succeed with a valid id', async function () { + const { body: apiResponse } = await supertest + .get(`/api/ingest_manager/package_configs/${packageConfigId}`) + .expect(200); + + expect(apiResponse.success).to.be(true); + }); + + it('should return a 404 with an invalid id', async function () { + await supertest.get(`/api/ingest_manager/package_configs/IS_NOT_PRESENT`).expect(404); + }); + }); +} diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts index cf76f297d83be..8b197a6c69a30 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts @@ -27,7 +27,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await pageObjects.policy.navigateToPolicyDetails('invalid-id'); await testSubjects.existOrFail('policyDetailsIdNotFoundMessage'); expect(await testSubjects.getVisibleText('policyDetailsIdNotFoundMessage')).to.equal( - 'Saved object [ingest-package-configs/invalid-id] not found' + 'Package config invalid-id not found' ); }); }); From 14b2cbb15575be3d488ce36dac25244629b180a6 Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola Date: Tue, 28 Jul 2020 19:58:26 -0400 Subject: [PATCH 093/126] [Security Solution][Resolver] Handle iso time strings (#73551) Co-authored-by: Elastic Machine --- .../public/resolver/lib/date.test.ts | 56 ++++++++++++++----- .../public/resolver/lib/date.ts | 29 ++++++++-- 2 files changed, 66 insertions(+), 19 deletions(-) diff --git a/x-pack/plugins/security_solution/public/resolver/lib/date.test.ts b/x-pack/plugins/security_solution/public/resolver/lib/date.test.ts index 7a48245fcfc41..5555578e44f7b 100644 --- a/x-pack/plugins/security_solution/public/resolver/lib/date.test.ts +++ b/x-pack/plugins/security_solution/public/resolver/lib/date.test.ts @@ -3,38 +3,64 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { getFriendlyElapsedTime } from './date'; +import { getFriendlyElapsedTime, getUnixTime } from './date'; describe('date', () => { - describe('getFriendlyElapsedTime', () => { - const second = 1000; - const minute = second * 60; - const hour = minute * 60; - const day = hour * 24; - const week = day * 7; - const month = day * 30; - const year = day * 365; + const second = 1000; + const minute = second * 60; + const hour = minute * 60; + const day = hour * 24; + const week = day * 7; + const month = day * 30; + const year = day * 365; - const initialTime = new Date('6/1/2020').getTime(); + describe('getUnixTime', () => { + const unixTime = new Date('6/1/2020').getTime(); + const unixStringTime = String(unixTime); + const isoTime = new Date('6/1/2020').toISOString(); + const notATime = 'imLate'; + + it('should return the time if already a unix timestamp', () => { + expect(getUnixTime(unixTime)).toEqual(unixTime); + }); + + it('should properly convert a unix timestamp string to a number', () => { + expect(getUnixTime(unixStringTime)).toEqual(unixTime); + }); + + it('should properly convert an ISO string to a unix timestamp', () => { + expect(getUnixTime(isoTime)).toEqual(unixTime); + }); - const oneMillisecond = new Date(initialTime + 1).getTime(); + it('should return NaN if an invalid time is provided', () => { + expect(getUnixTime(notATime)).toBeNaN(); + }); + }); + + describe('getFriendlyElapsedTime', () => { + const initialTime = new Date('6/1/2020').getTime(); + const oneMillisecond = new Date(initialTime + 1).toISOString(); const oneSecond = new Date(initialTime + 1 * second).getTime(); const oneMinute = new Date(initialTime + 1 * minute).getTime(); - const oneHour = new Date(initialTime + 1 * hour).getTime(); + const oneHour = new Date(initialTime + 1 * hour).toISOString(); const oneDay = new Date(initialTime + 1 * day).getTime(); - const oneWeek = new Date(initialTime + 1 * week).getTime(); + const oneWeek = `${new Date(initialTime + 1 * week).getTime()}`; const oneMonth = new Date(initialTime + 1 * month).getTime(); const oneYear = new Date(initialTime + 1 * year).getTime(); const almostASecond = new Date(initialTime + 999).getTime(); - const almostAMinute = new Date(initialTime + 59.9 * second).getTime(); + const almostAMinute = new Date(initialTime + 59.9 * second).toISOString(); const almostAnHour = new Date(initialTime + 59.9 * minute).getTime(); const almostADay = new Date(initialTime + 23.9 * hour).getTime(); - const almostAWeek = new Date(initialTime + 6.9 * day).getTime(); + const almostAWeek = new Date(initialTime + 6.9 * day).toISOString(); const almostAMonth = new Date(initialTime + 3.9 * week).getTime(); const almostAYear = new Date(initialTime + 11.9 * month).getTime(); const threeYears = new Date(initialTime + 3 * year).getTime(); + it('should return null if invalid times are given', () => { + expect(getFriendlyElapsedTime(initialTime, 'ImTimeless')).toEqual(null); + }); + it('should return the correct singular relative time', () => { expect(getFriendlyElapsedTime(initialTime, initialTime)).toEqual({ duration: '<1', diff --git a/x-pack/plugins/security_solution/public/resolver/lib/date.ts b/x-pack/plugins/security_solution/public/resolver/lib/date.ts index a5e07e6a02a88..3cd0c910f46f3 100644 --- a/x-pack/plugins/security_solution/public/resolver/lib/date.ts +++ b/x-pack/plugins/security_solution/public/resolver/lib/date.ts @@ -6,6 +6,26 @@ import { DurationDetails, DurationTypes } from '../types'; +/** + * Given a time, it will convert it to a unix timestamp if not one already. If it is unable to do so, it will return NaN + */ +export const getUnixTime = (time: number | string): number | typeof NaN => { + if (!time) { + return NaN; + } + if (typeof time === 'number') { + return time; + } + // If it's a date string just get the time in MS + let unixTime = Date.parse(time); + if (Number.isNaN(unixTime)) { + // If not an ISO date string, last check will be if it's a unix timestamp string + unixTime = parseInt(time, 10); + } + + return unixTime; +}; + /* * Given two unix timestamps, it will return an object containing the time difference and properly pluralized friendly version of the time difference. * i.e. a time difference of 1000ms will yield => { duration: 1, durationType: 'second' } and 10000ms will yield => { duration: 10, durationType: 'seconds' } @@ -15,12 +35,13 @@ export const getFriendlyElapsedTime = ( from: number | string, to: number | string ): DurationDetails | null => { - const startTime = typeof from === 'number' ? from : parseInt(from, 10); - const endTime = typeof to === 'number' ? to : parseInt(to, 10); - const elapsedTimeInMs = endTime - startTime; - if (Number.isNaN(elapsedTimeInMs)) { + const startTime = getUnixTime(from); + const endTime = getUnixTime(to); + + if (Number.isNaN(startTime) || Number.isNaN(endTime)) { return null; } + const elapsedTimeInMs = endTime - startTime; const second = 1000; const minute = second * 60; From 17ec168c287733253345854eff2e75f9b151a932 Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola Date: Tue, 28 Jul 2020 19:58:58 -0400 Subject: [PATCH 094/126] [Security Solution][Resolver] Undo origin panel update (#73501) Co-authored-by: Elastic Machine --- .../public/resolver/view/map.tsx | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/x-pack/plugins/security_solution/public/resolver/view/map.tsx b/x-pack/plugins/security_solution/public/resolver/view/map.tsx index 19c403f1257be..0ca71c5bf60ce 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/map.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/map.tsx @@ -8,7 +8,7 @@ /* eslint-disable react/display-name */ -import React, { useContext, useEffect } from 'react'; +import React, { useContext } from 'react'; import { useSelector } from 'react-redux'; import { useEffectOnce } from 'react-use'; import { EuiLoadingSpinner } from '@elastic/eui'; @@ -68,25 +68,12 @@ export const ResolverMap = React.memo(function ({ const hasError = useSelector(selectors.hasError); const activeDescendantId = useSelector(selectors.ariaActiveDescendant); const { colorMap } = useResolverTheme(); - const { - cleanUpQueryParams, - queryParams: { crumbId }, - pushToQueryParams, - } = useResolverQueryParams(); + const { cleanUpQueryParams } = useResolverQueryParams(); useEffectOnce(() => { return () => cleanUpQueryParams(); }); - useEffect(() => { - // When you refresh the page after selecting a process in the table view (not the timeline view) - // The old crumbId still exists in the query string even though a resolver is no longer visible - // This just makes sure the activeDescendant and crumbId are in sync on load for that view as well as the timeline - if (activeDescendantId && crumbId !== activeDescendantId) { - pushToQueryParams({ crumbId: activeDescendantId, crumbEvent: '' }); - } - }, [crumbId, activeDescendantId, pushToQueryParams]); - return ( {isLoading ? ( From 774d3591c083e14bdd56339f2a93eb27e1d531f5 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Wed, 29 Jul 2020 01:03:45 +0100 Subject: [PATCH 095/126] [Security Solution] Update security overview splash (#73050) ## Summary https://github.com/elastic/endpoint-app-team/issues/591 How to verify: 1. go to: x-pack/test/security_solution_cypress/runner.ts 2. comment line 20 (await esArchiver.load('auditbeat');) 3. in line 25 change cypress:run for cypress:open 4. then in our directory run yarn cypress:run-as-ci when the cypress is open, 5. you can access the Kibana instance in port 5620 with username elastic and password changeme Screenshot 2020-07-23 at 14 48 34 ### Checklist Delete any items that are not applicable to this PR. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md) - [ ] ~[Documentation](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#writing-documentation) was added for features that require explanation or tutorials~ - [ ] ~[Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios~ - [ ] ~This was checked for [keyboard-only and screenreader accessibility](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing/Accessibility#Accessibility_testing_checklist)~ - [ ] ~This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)~ - [ ] ~This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers)~ ### For maintainers - [ ] ~This was checked for breaking API changes and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process)~ --- .../public/doc_links/doc_links_service.ts | 2 +- .../pages/saved_object_no_permissions.tsx | 18 +- .../__snapshots__/index.test.tsx.snap | 24 ++- .../components/empty_page/index.test.tsx | 14 +- .../common/components/empty_page/index.tsx | 157 +++++++++++------- .../public/common/translations.ts | 39 ++++- .../detection_engine.test.tsx | 3 + .../detection_engine_no_signal_index.tsx | 19 ++- .../detection_engine_user_unauthenticated.tsx | 19 ++- .../pages/detection_engine/translations.ts | 4 +- .../components/overview_empty/index.test.tsx | 83 +++++++++ .../components/overview_empty/index.tsx | 53 ++++-- .../public/overview/pages/overview.test.tsx | 4 +- .../public/overview/pages/overview.tsx | 2 +- .../translations/translations/ja-JP.json | 4 +- .../translations/translations/zh-CN.json | 4 +- 16 files changed, 331 insertions(+), 118 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx diff --git a/src/core/public/doc_links/doc_links_service.ts b/src/core/public/doc_links/doc_links_service.ts index 70b25cb78787a..eb54983d0be13 100644 --- a/src/core/public/doc_links/doc_links_service.ts +++ b/src/core/public/doc_links/doc_links_service.ts @@ -112,7 +112,7 @@ export class DocLinksService { kibana: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/index.html`, siem: { guide: `${ELASTIC_WEBSITE_URL}guide/en/security/${DOC_LINK_VERSION}/index.html`, - gettingStarted: `${ELASTIC_WEBSITE_URL}guide/en/security/${DOC_LINK_VERSION}/install-siem.html`, + gettingStarted: `${ELASTIC_WEBSITE_URL}guide/en/security/${DOC_LINK_VERSION}/index.html`, }, query: { luceneQuerySyntax: `${ELASTICSEARCH_DOCS}query-dsl-query-string-query.html#query-string-syntax`, diff --git a/x-pack/plugins/security_solution/public/cases/pages/saved_object_no_permissions.tsx b/x-pack/plugins/security_solution/public/cases/pages/saved_object_no_permissions.tsx index 7129aa04bdf69..c61ff6d18caab 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/saved_object_no_permissions.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/saved_object_no_permissions.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { EmptyPage } from '../../common/components/empty_page'; import * as i18n from './translations'; @@ -12,13 +12,21 @@ import { useKibana } from '../../common/lib/kibana'; export const CaseSavedObjectNoPermissions = React.memo(() => { const docLinks = useKibana().services.docLinks; + const actions = useMemo( + () => ({ + savedObject: { + icon: 'documents', + label: i18n.GO_TO_DOCUMENTATION, + url: `${docLinks.ELASTIC_WEBSITE_URL}guide/en/security/${docLinks.DOC_LINK_VERSION}s`, + target: '_blank', + }, + }), + [docLinks] + ); return ( - - Do Something - + + Do Something + + } + title={false} + /> } diff --git a/x-pack/plugins/security_solution/public/common/components/empty_page/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/empty_page/index.test.tsx index 6a14c12cee0f8..8e025faefeabe 100644 --- a/x-pack/plugins/security_solution/public/common/components/empty_page/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/empty_page/index.test.tsx @@ -10,12 +10,12 @@ import React from 'react'; import { EmptyPage } from './index'; test('renders correctly', () => { - const EmptyComponent = shallow( - - ); + const actions = { + actions: { + label: 'Do Something', + url: 'my/url/from/nowwhere', + }, + }; + const EmptyComponent = shallow(); expect(EmptyComponent).toMatchSnapshot(); }); diff --git a/x-pack/plugins/security_solution/public/common/components/empty_page/index.tsx b/x-pack/plugins/security_solution/public/common/components/empty_page/index.tsx index f6d6752729b6d..89f4b125e930c 100644 --- a/x-pack/plugins/security_solution/public/common/components/empty_page/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/empty_page/index.tsx @@ -4,84 +4,123 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiButton, EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem, IconType } from '@elastic/eui'; -import React, { MouseEventHandler, ReactNode } from 'react'; +import { + EuiButton, + EuiEmptyPrompt, + EuiFlexGroup, + EuiFlexItem, + IconType, + EuiCard, +} from '@elastic/eui'; +import React, { MouseEventHandler, ReactNode, useMemo } from 'react'; import styled from 'styled-components'; const EmptyPrompt = styled(EuiEmptyPrompt)` align-self: center; /* Corrects horizontal centering in IE11 */ + max-width: 60em; `; EmptyPrompt.displayName = 'EmptyPrompt'; +interface EmptyPageActions { + icon?: IconType; + label: string; + target?: string; + url: string; + descriptionTitle?: string; + description?: string; + fill?: boolean; + onClick?: MouseEventHandler; +} + +export type EmptyPageActionsProps = Record; + interface EmptyPageProps { - actionPrimaryIcon?: IconType; - actionPrimaryLabel: string; - actionPrimaryTarget?: string; - actionPrimaryUrl: string; - actionPrimaryFill?: boolean; - actionSecondaryIcon?: IconType; - actionSecondaryLabel?: string; - actionSecondaryTarget?: string; - actionSecondaryUrl?: string; - actionSecondaryOnClick?: MouseEventHandler; + actions: EmptyPageActionsProps; 'data-test-subj'?: string; message?: ReactNode; title: string; } -export const EmptyPage = React.memo( - ({ - actionPrimaryIcon, - actionPrimaryLabel, - actionPrimaryTarget, - actionPrimaryUrl, - actionPrimaryFill = true, - actionSecondaryIcon, - actionSecondaryLabel, - actionSecondaryTarget, - actionSecondaryUrl, - actionSecondaryOnClick, - message, - title, - ...rest - }) => ( +const EmptyPageComponent = React.memo(({ actions, message, title, ...rest }) => { + const titles = Object.keys(actions); + const maxItemWidth = 283; + const renderActions = useMemo( + () => + Object.values(actions) + .filter((a) => a.label && a.url) + .map( + ( + { + icon, + label, + target, + url, + descriptionTitle = false, + description = false, + onClick, + fill = true, + }, + idx + ) => + descriptionTitle != null || description != null ? ( + + + {label} + + } + /> + + ) : ( + + {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} + + {label} + + + ) + ), + [actions, titles] + ); + + return ( {title}} body={message &&

      {message}

      } - actions={ - - - - {actionPrimaryLabel} - - - - {actionSecondaryLabel && actionSecondaryUrl && ( - - {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} - - {actionSecondaryLabel} - - - )} - - } + actions={{renderActions}} {...rest} /> - ) -); + ); +}); + +EmptyPageComponent.displayName = 'EmptyPageComponent'; +export const EmptyPage = React.memo(EmptyPageComponent); EmptyPage.displayName = 'EmptyPage'; diff --git a/x-pack/plugins/security_solution/public/common/translations.ts b/x-pack/plugins/security_solution/public/common/translations.ts index 413119fb40f14..3b94ac8959496 100644 --- a/x-pack/plugins/security_solution/public/common/translations.ts +++ b/x-pack/plugins/security_solution/public/common/translations.ts @@ -7,16 +7,39 @@ import { i18n } from '@kbn/i18n'; export const EMPTY_TITLE = i18n.translate('xpack.securitySolution.pages.common.emptyTitle', { - defaultMessage: 'Welcome to Security Solution. Let’s get you started.', + defaultMessage: 'Welcome to Elastic Security. Let’s get you started.', }); -export const EMPTY_ACTION_PRIMARY = i18n.translate( - 'xpack.securitySolution.pages.common.emptyActionPrimary', +export const EMPTY_ACTION_ELASTIC_AGENT = i18n.translate( + 'xpack.securitySolution.pages.common.emptyActionElasticAgent', + { + defaultMessage: 'Add data with Elastic Agent', + } +); + +export const EMPTY_ACTION_ELASTIC_AGENT_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.pages.common.emptyActionElasticAgentDescription', + { + defaultMessage: + 'The Elastic Agent provides a simple, unified way to add monitoring to your hosts.', + } +); + +export const EMPTY_ACTION_BEATS = i18n.translate( + 'xpack.securitySolution.pages.common.emptyActionBeats', { defaultMessage: 'Add data with Beats', } ); +export const EMPTY_ACTION_BEATS_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.pages.common.emptyActionBeatsDescription', + { + defaultMessage: + 'Lightweight Beats can send data from hundreds or thousands of machines and systems', + } +); + export const EMPTY_ACTION_SECONDARY = i18n.translate( 'xpack.securitySolution.pages.common.emptyActionSecondary', { @@ -27,6 +50,14 @@ export const EMPTY_ACTION_SECONDARY = i18n.translate( export const EMPTY_ACTION_ENDPOINT = i18n.translate( 'xpack.securitySolution.pages.common.emptyActionEndpoint', { - defaultMessage: 'Add data with Elastic Agent (Beta)', + defaultMessage: 'Add Elastic Endpoint Security', + } +); + +export const EMPTY_ACTION_ENDPOINT_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.pages.common.emptyActionEndpointDescription', + { + defaultMessage: + 'Protect your hosts with threat prevention, detection, and deep security data visibility.', } ); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx index 110620fad7eba..982712cbe9797 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx @@ -53,6 +53,9 @@ jest.mock('react-router-dom', () => { useHistory: jest.fn(), }; }); +jest.mock('../../components/alerts_info', () => ({ + useAlertInfo: jest.fn().mockReturnValue([]), +})); const state: State = { ...mockGlobalState, diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_signal_index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_signal_index.tsx index 32ae585aec191..c315361b294c7 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_signal_index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_signal_index.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { EmptyPage } from '../../../common/components/empty_page'; import * as i18n from './translations'; @@ -12,12 +12,21 @@ import { useKibana } from '../../../common/lib/kibana'; export const DetectionEngineNoIndex = React.memo(() => { const docLinks = useKibana().services.docLinks; + const actions = useMemo( + () => ({ + detections: { + icon: 'documents', + label: i18n.GO_TO_DOCUMENTATION, + url: `${docLinks.ELASTIC_WEBSITE_URL}guide/en/security/${docLinks.DOC_LINK_VERSION}/detection-engine-overview.html#detections-permissions`, + target: '_blank', + }, + }), + [docLinks] + ); + return ( { const docLinks = useKibana().services.docLinks; - + const actions = useMemo( + () => ({ + detectionUnauthenticated: { + icon: 'documents', + label: i18n.GO_TO_DOCUMENTATION, + url: `${docLinks.ELASTIC_WEBSITE_URL}guide/en/security/${docLinks.DOC_LINK_VERSION}/detection-engine-overview.html#detections-permissions`, + target: '_blank', + }, + }), + [docLinks] + ); return ( ({ + useIngestUrl: jest + .fn() + .mockReturnValue({ appId: 'ingestAppId', appPath: 'ingestPath', url: 'ingestUrl' }), +})); + +jest.mock('../../../common/hooks/endpoint/ingest_enabled', () => ({ + useIngestEnabledCheck: jest.fn().mockReturnValue({ allEnabled: true }), +})); + +jest.mock('../../../common/hooks/endpoint/use_navigate_to_app_event_handler', () => ({ + useNavigateToAppEventHandler: jest.fn(), +})); + +describe('OverviewEmpty', () => { + describe('When isIngestEnabled = true', () => { + let wrapper: ShallowWrapper; + beforeAll(() => { + wrapper = shallow(); + }); + + afterAll(() => { + (useIngestEnabledCheck as jest.Mock).mockReset(); + }); + + test('render with correct actions ', () => { + expect(wrapper.find('[data-test-subj="empty-page"]').prop('actions')).toEqual({ + beats: { + description: + 'Lightweight Beats can send data from hundreds or thousands of machines and systems', + fill: false, + label: 'Add data with Beats', + url: '/app/home#/tutorial_directory/security', + }, + elasticAgent: { + description: + 'The Elastic Agent provides a simple, unified way to add monitoring to your hosts.', + fill: false, + label: 'Add data with Elastic Agent', + url: 'ingestUrl', + }, + endpoint: { + description: + 'Protect your hosts with threat prevention, detection, and deep security data visibility.', + fill: false, + label: 'Add Elastic Endpoint Security', + onClick: undefined, + url: '/app/home#/tutorial_directory/security', + }, + }); + }); + }); + + describe('When isIngestEnabled = false', () => { + let wrapper: ShallowWrapper; + beforeAll(() => { + (useIngestEnabledCheck as jest.Mock).mockReturnValue({ allEnabled: false }); + wrapper = shallow(); + }); + + test('render with correct actions ', () => { + expect(wrapper.find('[data-test-subj="empty-page"]').prop('actions')).toEqual({ + beats: { + description: + 'Lightweight Beats can send data from hundreds or thousands of machines and systems', + fill: false, + label: 'Add data with Beats', + url: '/app/home#/tutorial_directory/security', + }, + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx index 33413be10079e..1d2c6889213f1 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx @@ -4,11 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { useMemo } from 'react'; +import { omit } from 'lodash/fp'; + import { FormattedMessage } from '@kbn/i18n/react'; import { EuiLink } from '@elastic/eui'; import * as i18nCommon from '../../../common/translations'; -import { EmptyPage } from '../../../common/components/empty_page'; +import { EmptyPage, EmptyPageActionsProps } from '../../../common/components/empty_page'; import { useKibana } from '../../../common/lib/kibana'; import { ADD_DATA_PATH } from '../../../../common/constants'; import { useIngestUrl } from '../../../management/pages/endpoint_hosts/view/hooks'; @@ -23,23 +25,45 @@ const OverviewEmptyComponent: React.FC = () => { ); const handleOnClick = useNavigateToAppEventHandler(ingestAppId, { path: ingestPath }); const { allEnabled: isIngestEnabled } = useIngestEnabledCheck(); + const emptyPageActions: EmptyPageActionsProps = useMemo( + () => ({ + elasticAgent: { + label: i18nCommon.EMPTY_ACTION_ELASTIC_AGENT, + url: ingestUrl, + description: i18nCommon.EMPTY_ACTION_ELASTIC_AGENT_DESCRIPTION, + fill: false, + }, + beats: { + label: i18nCommon.EMPTY_ACTION_BEATS, + url: `${basePath}${ADD_DATA_PATH}`, + description: i18nCommon.EMPTY_ACTION_BEATS_DESCRIPTION, + fill: false, + }, + endpoint: { + label: i18nCommon.EMPTY_ACTION_ENDPOINT, + url: `${basePath}${ADD_DATA_PATH}`, + description: i18nCommon.EMPTY_ACTION_ENDPOINT_DESCRIPTION, + onClick: handleOnClick, + fill: false, + }, + }), + [basePath, ingestUrl, handleOnClick] + ); + + const emptyPageIngestDisabledActions = useMemo( + () => omit(['elasticAgent', 'endpoint'], emptyPageActions), + [emptyPageActions] + ); return isIngestEnabled === true ? ( {i18nCommon.EMPTY_ACTION_SECONDARY} @@ -50,16 +74,13 @@ const OverviewEmptyComponent: React.FC = () => { /> ) : ( {i18nCommon.EMPTY_ACTION_SECONDARY} diff --git a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx index 286cc870378e1..74225c4e4f823 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx @@ -83,7 +83,7 @@ describe('Overview', () => { ); - expect(wrapper.find('[data-test-subj="empty-page-secondary-action"]').exists()).toBe(false); + expect(wrapper.find('[data-test-subj="empty-page-endpoint-action"]').exists()).toBe(false); }); it('shows Endpoint get ready button when ingest is enabled', () => { @@ -95,7 +95,7 @@ describe('Overview', () => { ); - expect(wrapper.find('[data-test-subj="empty-page-secondary-action"]').exists()).toBe(true); + expect(wrapper.find('[data-test-subj="empty-page-endpoint-action"]').exists()).toBe(true); }); }); diff --git a/x-pack/plugins/security_solution/public/overview/pages/overview.tsx b/x-pack/plugins/security_solution/public/overview/pages/overview.tsx index 423aa597a0129..1b743c259555a 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/overview.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/overview.tsx @@ -17,6 +17,7 @@ import { SiemSearchBar } from '../../common/components/search_bar'; import { WrapperPage } from '../../common/components/wrapper_page'; import { useGlobalTime } from '../../common/containers/use_global_time'; import { useWithSource } from '../../common/containers/source'; + import { EventsByDataset } from '../components/events_by_dataset'; import { EventCounts } from '../components/event_counts'; import { OverviewEmpty } from '../components/overview_empty'; @@ -66,7 +67,6 @@ const OverviewComponent: React.FC = ({ addMessage('management', 'dismissEndpointNotice'); }, [addMessage]); const { allEnabled: isIngestEnabled } = useIngestEnabledCheck(); - return ( <> {indicesExist ? ( diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index b6aaa2065c795..8fbcb3f1122cc 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -13572,7 +13572,7 @@ "xpack.securitySolution.detectionEngine.editRule.errorMsgDescription": "申し訳ありません", "xpack.securitySolution.detectionEngine.editRule.pageTitle": "ルール設定の編集", "xpack.securitySolution.detectionEngine.editRule.saveChangeTitle": "変更を保存", - "xpack.securitySolution.detectionEngine.emptyActionPrimary": "セットアップの手順を表示", + "xpack.securitySolution.detectionEngine.emptyActionBeats": "セットアップの手順を表示", "xpack.securitySolution.detectionEngine.emptyActionSecondary": "ドキュメントに移動", "xpack.securitySolution.detectionEngine.emptyTitle": "Securityアプリケーションの検出エンジンに関連したインデックスがないようです", "xpack.securitySolution.detectionEngine.goToDocumentationButton": "ドキュメンテーションを表示", @@ -14349,7 +14349,7 @@ "xpack.securitySolution.overview.viewEventsButtonLabel": "イベントを表示", "xpack.securitySolution.overview.winlogbeatMWSysmonOperational": "Microsoft-Windows-Sysmon/Operational", "xpack.securitySolution.overview.winlogbeatSecurityTitle": "セキュリティ", - "xpack.securitySolution.pages.common.emptyActionPrimary": "Beatsでデータを表示", + "xpack.securitySolution.pages.common.emptyActionBeats": "Beatsでデータを表示", "xpack.securitySolution.pages.common.emptyActionSecondary": "入門ガイドを表示", "xpack.securitySolution.pages.common.emptyTitle": "SIEMへようこそ。始めましょう。", "xpack.securitySolution.pages.fourohfour.noContentFoundDescription": "コンテンツがありません", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index dcbcda120587f..b69763449a06f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -13578,7 +13578,7 @@ "xpack.securitySolution.detectionEngine.editRule.errorMsgDescription": "抱歉", "xpack.securitySolution.detectionEngine.editRule.pageTitle": "编辑规则设置", "xpack.securitySolution.detectionEngine.editRule.saveChangeTitle": "保存更改", - "xpack.securitySolution.detectionEngine.emptyActionPrimary": "查看设置说明", + "xpack.securitySolution.detectionEngine.emptyActionBeats": "查看设置说明", "xpack.securitySolution.detectionEngine.emptyActionSecondary": "前往文档", "xpack.securitySolution.detectionEngine.emptyTitle": "似乎您没有与 Security 应用程序的检测引擎相关的索引", "xpack.securitySolution.detectionEngine.goToDocumentationButton": "查看文档", @@ -14355,7 +14355,7 @@ "xpack.securitySolution.overview.viewEventsButtonLabel": "查看事件", "xpack.securitySolution.overview.winlogbeatMWSysmonOperational": "Microsoft-Windows-Sysmon/Operational", "xpack.securitySolution.overview.winlogbeatSecurityTitle": "安全", - "xpack.securitySolution.pages.common.emptyActionPrimary": "使用 Beats 添加数据", + "xpack.securitySolution.pages.common.emptyActionBeats": "使用 Beats 添加数据", "xpack.securitySolution.pages.common.emptyActionSecondary": "查看入门指南", "xpack.securitySolution.pages.common.emptyTitle": "欢迎使用 SIEM。让我们教您如何入门。", "xpack.securitySolution.pages.fourohfour.noContentFoundDescription": "未找到任何内容", From f1c08939ead12341ccb2dabfe2bb9f8681de4e65 Mon Sep 17 00:00:00 2001 From: Candace Park <56409205+parkiino@users.noreply.github.com> Date: Tue, 28 Jul 2020 20:21:11 -0400 Subject: [PATCH 096/126] [SECURITY_SOLUTION][Administration] Task/remove policy tab (#73352) --- .../components/management_empty_state.tsx | 63 ++----------------- .../components/management_page_view.tsx | 45 +------------ .../view/details/host_details.tsx | 6 +- .../endpoint_hosts/view/details/index.tsx | 4 +- .../pages/endpoint_hosts/view/index.test.tsx | 4 +- .../pages/endpoint_hosts/view/index.tsx | 4 +- .../public/management/pages/policy/index.tsx | 8 +-- .../configure_package_config.tsx | 58 +++++++---------- .../pages/policy/view/policy_details.test.tsx | 14 ++--- .../pages/policy/view/policy_details.tsx | 19 +++--- .../pages/policy/view/policy_list.test.tsx | 3 +- .../endpoint_overview/translations.ts | 4 +- .../apps/endpoint/endpoint_list.ts | 10 +-- .../apps/endpoint/index.ts | 1 - .../apps/endpoint/policy_details.ts | 4 +- 15 files changed, 68 insertions(+), 179 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx b/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx index fb9f97f3f7570..a4518d1a1f493 100644 --- a/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx +++ b/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx @@ -77,57 +77,6 @@ const PolicyEmptyState = React.memo<{ /> - - - - - - - - -

      - -

      -
      -
      -
      - - - - -
      - - - - - - - -

      - -

      -
      -
      -
      - - - - -
      -
      - [ { title: i18n.translate('xpack.securitySolution.endpoint.hostList.stepOneTitle', { - defaultMessage: 'Select the policy you want to use to protect your hosts', + defaultMessage: 'Select the integration you want to use', }), children: ( <> @@ -203,7 +152,7 @@ const HostsEmptyState = React.memo<{ ) : selectionOptions.length ? ( @@ -211,7 +160,7 @@ const HostsEmptyState = React.memo<{ ) : ( ); }} @@ -263,13 +212,13 @@ const HostsEmptyState = React.memo<{ headerComponent={ } bodyComponent={ } /> diff --git a/x-pack/plugins/security_solution/public/management/components/management_page_view.tsx b/x-pack/plugins/security_solution/public/management/components/management_page_view.tsx index 42341b524362d..aa562b9a20201 100644 --- a/x-pack/plugins/security_solution/public/management/components/management_page_view.tsx +++ b/x-pack/plugins/security_solution/public/management/components/management_page_view.tsx @@ -4,52 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { memo, useMemo } from 'react'; -import { i18n } from '@kbn/i18n'; -import { useParams } from 'react-router-dom'; +import React, { memo } from 'react'; import { PageView, PageViewProps } from '../../common/components/endpoint/page_view'; -import { AdministrationSubTab } from '../types'; -import { SecurityPageName } from '../../app/types'; -import { useFormatUrl } from '../../common/components/link_to'; -import { getHostListPath, getPoliciesPath } from '../common/routing'; -import { useNavigateByRouterEventHandler } from '../../common/hooks/endpoint/use_navigate_by_router_event_handler'; export const ManagementPageView = memo>((options) => { - const { formatUrl, search } = useFormatUrl(SecurityPageName.administration); - const { tabName } = useParams<{ tabName: AdministrationSubTab }>(); - - const goToEndpoint = useNavigateByRouterEventHandler( - getHostListPath({ name: 'hostList' }, search) - ); - - const goToPolicies = useNavigateByRouterEventHandler(getPoliciesPath(search)); - - const tabs = useMemo((): PageViewProps['tabs'] | undefined => { - if (options.viewType === 'details') { - return undefined; - } - return [ - { - name: i18n.translate('xpack.securitySolution.managementTabs.hosts', { - defaultMessage: 'Hosts', - }), - id: AdministrationSubTab.hosts, - isSelected: tabName === AdministrationSubTab.hosts, - href: formatUrl(getHostListPath({ name: 'hostList' })), - onClick: goToEndpoint, - }, - { - name: i18n.translate('xpack.securitySolution.managementTabs.policies', { - defaultMessage: 'Policies', - }), - id: AdministrationSubTab.policies, - isSelected: tabName === AdministrationSubTab.policies, - href: formatUrl(getPoliciesPath()), - onClick: goToPolicies, - }, - ]; - }, [formatUrl, goToEndpoint, goToPolicies, options.viewType, tabName]); - return ; + return ; }); ManagementPageView.displayName = 'ManagementPageView'; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx index cea66acbef8ca..109392cb7a929 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx @@ -121,7 +121,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { return [ { title: i18n.translate('xpack.securitySolution.endpoint.host.details.policy', { - defaultMessage: 'Policy', + defaultMessage: 'Integration', }), description: ( <> @@ -136,7 +136,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { }, { title: i18n.translate('xpack.securitySolution.endpoint.host.details.policyStatus', { - defaultMessage: 'Policy Status', + defaultMessage: 'Configuration response', }), description: ( { diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx index 71b3885308558..212c8977a8852 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx @@ -158,7 +158,7 @@ const PolicyResponseFlyoutPanel = memo<{

      @@ -167,7 +167,7 @@ const PolicyResponseFlyoutPanel = memo<{ title={ } /> diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx index 47227244b7066..9d49c8705affe 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx @@ -431,7 +431,7 @@ describe('when on the hosts page', () => { const renderResult = render(); const linkToReassign = await renderResult.findByTestId('hostDetailsLinkToIngest'); expect(linkToReassign).not.toBeNull(); - expect(linkToReassign.textContent).toEqual('Reassign Policy'); + expect(linkToReassign.textContent).toEqual('Reassign Configuration'); expect(linkToReassign.getAttribute('href')).toEqual( `/app/ingestManager#/fleet/agents/${agentId}/activity?openReassignFlyout=true` ); @@ -492,7 +492,7 @@ describe('when on the hosts page', () => { it('should include the sub-panel title', async () => { expect( (await renderResult.findByTestId('hostDetailsPolicyResponseFlyoutTitle')).textContent - ).toBe('Policy Response'); + ).toBe('Configuration Response'); }); it('should show a configuration section for each protection', async () => { diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx index e38ef1bd5fe86..2692f7791b7c0 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx @@ -237,7 +237,7 @@ export const HostList = () => { { field: 'metadata.Endpoint.policy.applied', name: i18n.translate('xpack.securitySolution.endpointList.policy', { - defaultMessage: 'Policy', + defaultMessage: 'Integration', }), truncateText: true, // eslint-disable-next-line react/display-name @@ -256,7 +256,7 @@ export const HostList = () => { { field: 'metadata.Endpoint.policy.applied', name: i18n.translate('xpack.securitySolution.endpointList.policyStatus', { - defaultMessage: 'Policy Status', + defaultMessage: 'Configuration Status', }), // eslint-disable-next-line react/display-name render: (policy: HostInfo['metadata']['Endpoint']['policy']['applied'], item: HostInfo) => { diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/index.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/index.tsx index 5122bbcd5d55d..681f1f1430926 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/index.tsx @@ -6,17 +6,13 @@ import React, { memo } from 'react'; import { Route, Switch } from 'react-router-dom'; -import { PolicyDetails, PolicyList } from './view'; -import { - MANAGEMENT_ROUTING_POLICIES_PATH, - MANAGEMENT_ROUTING_POLICY_DETAILS_PATH, -} from '../../common/constants'; +import { PolicyDetails } from './view'; +import { MANAGEMENT_ROUTING_POLICY_DETAILS_PATH } from '../../common/constants'; import { NotFoundPage } from '../../../app/404'; export const PolicyContainer = memo(() => { return ( - diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_package_config.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_package_config.tsx index 67f24977406c6..2b08bfd2b282b 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_package_config.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_package_config.tsx @@ -6,8 +6,7 @@ import React, { memo, useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiCallOut, EuiText, EuiTitle, EuiSpacer } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; +import { EuiCallOut, EuiText, EuiSpacer } from '@elastic/eui'; import { LinkToApp } from '../../../../../common/components/endpoint/link_to_app'; import { CustomConfigurePackageConfigContent, @@ -50,52 +49,37 @@ export const ConfigureEndpointPackageConfig = memo - -

      - -

      -

      {from === 'edit' ? ( - <> - - - - - - + + + + ), + }} + /> ) : ( )}

      diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx index 4f7c14735fe21..6ed4e06ee51c5 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx @@ -10,7 +10,7 @@ import { mount } from 'enzyme'; import { PolicyDetails } from './policy_details'; import { EndpointDocGenerator } from '../../../../../common/endpoint/generate_data'; import { AppContextTestRender, createAppRootMockRenderer } from '../../../../common/mock/endpoint'; -import { getPolicyDetailPath, getPoliciesPath } from '../../../common/routing'; +import { getPolicyDetailPath, getHostListPath } from '../../../common/routing'; import { apiPathMockResponseProviders } from '../store/policy_list/test_mock_utils'; jest.mock('../../../../common/components/link_to'); @@ -19,7 +19,7 @@ describe('Policy Details', () => { type FindReactWrapperResponse = ReturnType['find']>; const policyDetailsPathUrl = getPolicyDetailPath('1'); - const policyListPathUrl = getPoliciesPath(); + const hostListPath = getHostListPath({ name: 'hostList' }); const sleep = (ms = 100) => new Promise((wakeup) => setTimeout(wakeup, ms)); const generator = new EndpointDocGenerator(); let history: AppContextTestRender['history']; @@ -127,8 +127,8 @@ describe('Policy Details', () => { const backToListButton = pageHeaderLeft.find('EuiButtonEmpty'); expect(backToListButton.prop('iconType')).toBe('arrowLeft'); - expect(backToListButton.prop('href')).toBe(policyListPathUrl); - expect(backToListButton.text()).toBe('Back to policy list'); + expect(backToListButton.prop('href')).toBe(hostListPath); + expect(backToListButton.text()).toBe('Back to endpoint hosts'); const pageTitle = pageHeaderLeft.find('[data-test-subj="pageViewHeaderLeftTitle"]'); expect(pageTitle).toHaveLength(1); @@ -141,7 +141,7 @@ describe('Policy Details', () => { ); expect(history.location.pathname).toEqual(policyDetailsPathUrl); backToListButton.simulate('click', { button: 0 }); - expect(history.location.pathname).toEqual(policyListPathUrl); + expect(history.location.pathname).toEqual(hostListPath); }); it('should display agent stats', async () => { await asyncActions; @@ -173,7 +173,7 @@ describe('Policy Details', () => { const navigateToAppMockedCalls = coreStart.application.navigateToApp.mock.calls; expect(navigateToAppMockedCalls[navigateToAppMockedCalls.length - 1]).toEqual([ 'securitySolution:administration', - { path: policyListPathUrl }, + { path: hostListPath }, ]); }); it('should display save button', async () => { @@ -232,7 +232,7 @@ describe('Policy Details', () => { ); expect(warningCallout).toHaveLength(1); expect(warningCallout.text()).toEqual( - 'This action will update 5 hostsSaving these changes will apply updates to all endpoints assigned to this policy' + 'This action will update 5 hostsSaving these changes will apply updates to all endpoints assigned to this agent configuration.' ); }); it('should close dialog if cancel button is clicked', () => { diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx index 288bc484c23b5..cd63991dbac93 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx @@ -42,7 +42,7 @@ import { PageViewHeaderTitle } from '../../../../common/components/endpoint/page import { ManagementPageView } from '../../../components/management_page_view'; import { SpyRoute } from '../../../../common/utils/route/spy_routes'; import { SecurityPageName } from '../../../../app/types'; -import { getPoliciesPath } from '../../../common/routing'; +import { getHostListPath } from '../../../common/routing'; import { useFormatUrl } from '../../../../common/components/link_to'; import { useNavigateToAppEventHandler } from '../../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; import { MANAGEMENT_APP_ID } from '../../../common/constants'; @@ -56,7 +56,7 @@ export const PolicyDetails = React.memo(() => { application: { navigateToApp }, }, } = useKibana(); - const { formatUrl, search } = useFormatUrl(SecurityPageName.administration); + const { formatUrl } = useFormatUrl(SecurityPageName.administration); const { state: locationRouteState } = useLocation(); // Store values @@ -70,6 +70,7 @@ export const PolicyDetails = React.memo(() => { const [showConfirm, setShowConfirm] = useState(false); const [routeState, setRouteState] = useState(); const policyName = policyItem?.name ?? ''; + const hostListRouterPath = getHostListPath({ name: 'hostList' }); // Handle showing update statuses useEffect(() => { @@ -87,7 +88,7 @@ export const PolicyDetails = React.memo(() => { @@ -109,11 +110,11 @@ export const PolicyDetails = React.memo(() => { } }, [navigateToApp, notifications.toasts, policyName, policyUpdateStatus, routeState]); - const handleBackToListOnClick = useNavigateByRouterEventHandler(getPoliciesPath()); + const handleBackToListOnClick = useNavigateByRouterEventHandler(hostListRouterPath); const navigateToAppArguments = useMemo((): Parameters => { - return routeState?.onCancelNavigateTo ?? [MANAGEMENT_APP_ID, { path: getPoliciesPath() }]; - }, [routeState?.onCancelNavigateTo]); + return routeState?.onCancelNavigateTo ?? [MANAGEMENT_APP_ID, { path: hostListRouterPath }]; + }, [hostListRouterPath, routeState?.onCancelNavigateTo]); const handleCancelOnClick = useNavigateToAppEventHandler(...navigateToAppArguments); const handleSaveOnClick = useCallback(() => { @@ -162,11 +163,11 @@ export const PolicyDetails = React.memo(() => { iconType="arrowLeft" contentProps={{ style: { paddingLeft: '0' } }} onClick={handleBackToListOnClick} - href={formatUrl(getPoliciesPath(search))} + href={formatUrl(hostListRouterPath)} > {policyItem.name} @@ -306,7 +307,7 @@ const ConfirmUpdate = React.memo<{ >
      diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_list.test.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_list.test.tsx index 047aa6918736e..e35c97698f5cb 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_list.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_list.test.tsx @@ -14,7 +14,8 @@ import { AppAction } from '../../../../common/store/actions'; jest.mock('../../../../common/components/link_to'); -describe('when on the policies page', () => { +// Skipping these test now that the Policy List has been hidden +describe.skip('when on the policies page', () => { let render: () => ReturnType; let history: AppContextTestRender['history']; let store: AppContextTestRender['store']; diff --git a/x-pack/plugins/security_solution/public/overview/components/host_overview/endpoint_overview/translations.ts b/x-pack/plugins/security_solution/public/overview/components/host_overview/endpoint_overview/translations.ts index 34e3347b5ff9a..a7f1be3debb83 100644 --- a/x-pack/plugins/security_solution/public/overview/components/host_overview/endpoint_overview/translations.ts +++ b/x-pack/plugins/security_solution/public/overview/components/host_overview/endpoint_overview/translations.ts @@ -9,14 +9,14 @@ import { i18n } from '@kbn/i18n'; export const ENDPOINT_POLICY = i18n.translate( 'xpack.securitySolution.host.details.endpoint.endpointPolicy', { - defaultMessage: 'Endpoint policy', + defaultMessage: 'Integration', } ); export const POLICY_STATUS = i18n.translate( 'xpack.securitySolution.host.details.endpoint.policyStatus', { - defaultMessage: 'Policy status', + defaultMessage: 'Configuration Status', } ); diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts index 07667a140d090..85d0e56231643 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts @@ -36,8 +36,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { [ 'Hostname', 'Host Status', - 'Policy', - 'Policy Status', + 'Integration', + 'Configuration Status', 'Operating System', 'IP Address', 'Version', @@ -119,7 +119,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); // The integration does not work properly yet. Skipping this test for now. - it.skip('navigates to ingest fleet when the Reassign Policy link is clicked', async () => { + it.skip('navigates to ingest fleet when the Reassign Configuration link is clicked', async () => { await (await testSubjects.find('hostnameCellLink')).click(); await (await testSubjects.find('hostDetailsLinkToIngest')).click(); await testSubjects.existOrFail('fleetAgentListTable'); @@ -145,8 +145,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { 'OS', 'Last Seen', 'Alerts', - 'Policy', - 'Policy Status', + 'Integration', + 'Configuration Status', 'IP Address', 'Hostname', 'Sensor Version', diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts index eec3da4ce1c5e..7962ec60ff57e 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/index.ts @@ -29,7 +29,6 @@ export default function (providerContext: FtrProviderContext) { await ingestManager.setup(); }); loadTestFile(require.resolve('./endpoint_list')); - loadTestFile(require.resolve('./policy_list')); loadTestFile(require.resolve('./policy_details')); }); } diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts index 8b197a6c69a30..ca84384390a29 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts @@ -73,7 +73,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await testSubjects.existOrFail('policyDetailsSuccessMessage'); expect(await testSubjects.getVisibleText('policyDetailsSuccessMessage')).to.equal( - `Policy ${policyInfo.packageConfig.name} has been updated.` + `Integration ${policyInfo.packageConfig.name} has been updated.` ); }); it('should persist update on the screen', async () => { @@ -81,7 +81,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await pageObjects.policy.confirmAndSave(); await testSubjects.existOrFail('policyDetailsSuccessMessage'); - await pageObjects.policy.navigateToPolicyList(); + await pageObjects.endpoint.navigateToHostList(); await pageObjects.policy.navigateToPolicyDetails(policyInfo.packageConfig.id); expect(await (await testSubjects.find('policyWindowsEvent_process')).isSelected()).to.equal( From 78aa24dbd6e61c05559d7432d4357af1c2ad81b3 Mon Sep 17 00:00:00 2001 From: Phillip Burch Date: Tue, 28 Jul 2020 19:30:42 -0500 Subject: [PATCH 097/126] Make button appear clickable, change state of empty text (#73496) Co-authored-by: Elastic Machine --- .../public/components/saved_views/toolbar_control.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/infra/public/components/saved_views/toolbar_control.tsx b/x-pack/plugins/infra/public/components/saved_views/toolbar_control.tsx index db9f92532645f..2e06ee55189d9 100644 --- a/x-pack/plugins/infra/public/components/saved_views/toolbar_control.tsx +++ b/x-pack/plugins/infra/public/components/saved_views/toolbar_control.tsx @@ -161,7 +161,11 @@ export function SavedViewsToolbarControls(props: Props) { /> - + (props: Props) { {currentView ? currentView.name : i18n.translate('xpack.infra.savedView.unknownView', { - defaultMessage: 'Unknown', + defaultMessage: 'No view seleted', })} From fea3bfcebc2af2b8ff22660e015a044e32280cd0 Mon Sep 17 00:00:00 2001 From: Robert Austin Date: Tue, 28 Jul 2020 20:59:45 -0400 Subject: [PATCH 098/126] [Resolver] simulator and click through tests (#73310) Write a few jest tests for resolver's react code. --- .../resolver/data_access_layer/factory.ts | 70 ++++ .../mocks/one_ancestor_two_children.ts | 96 +++++ .../public/resolver/models/process_event.ts | 16 +- .../public/resolver/store/index.ts | 8 +- .../public/resolver/store/middleware/index.ts | 27 +- .../store/middleware/resolver_tree_fetcher.ts | 31 +- .../resolver/store/mocks/endpoint_event.ts | 2 +- .../connect_enzyme_wrapper_and_store.ts | 20 + .../resolver/test_utilities/extend_jest.ts | 88 +++++ .../resolver/test_utilities/react_wrapper.ts | 17 + .../test_utilities/simulator/index.tsx | 290 ++++++++++++++ .../simulator/mock_resolver.tsx | 109 ++++++ .../test_utilities/spy_middleware_factory.ts | 58 +++ .../public/resolver/types.ts | 136 ++++++- .../resolver/view/clickthrough.test.tsx | 99 +++++ .../public/resolver/view/index.tsx | 45 +-- .../panels/panel_content_process_detail.tsx | 368 +++++++++--------- .../resolver/view/process_event_dot.tsx | 13 +- .../view/resolver_without_providers.tsx | 139 +++++++ ...or.ts => side_effect_simulator_factory.ts} | 5 +- .../public/resolver/view/use_camera.test.tsx | 9 +- .../view/use_resolver_query_params.ts | 8 +- 22 files changed, 1347 insertions(+), 307 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/resolver/data_access_layer/factory.ts create mode 100644 x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/one_ancestor_two_children.ts create mode 100644 x-pack/plugins/security_solution/public/resolver/test_utilities/connect_enzyme_wrapper_and_store.ts create mode 100644 x-pack/plugins/security_solution/public/resolver/test_utilities/extend_jest.ts create mode 100644 x-pack/plugins/security_solution/public/resolver/test_utilities/react_wrapper.ts create mode 100644 x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx create mode 100644 x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/mock_resolver.tsx create mode 100644 x-pack/plugins/security_solution/public/resolver/test_utilities/spy_middleware_factory.ts create mode 100644 x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx create mode 100644 x-pack/plugins/security_solution/public/resolver/view/resolver_without_providers.tsx rename x-pack/plugins/security_solution/public/resolver/view/{side_effect_simulator.ts => side_effect_simulator_factory.ts} (95%) diff --git a/x-pack/plugins/security_solution/public/resolver/data_access_layer/factory.ts b/x-pack/plugins/security_solution/public/resolver/data_access_layer/factory.ts new file mode 100644 index 0000000000000..016ebfa0faee4 --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/data_access_layer/factory.ts @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { KibanaReactContextValue } from '../../../../../../src/plugins/kibana_react/public'; +import { StartServices } from '../../types'; +import { DataAccessLayer } from '../types'; +import { + ResolverRelatedEvents, + ResolverTree, + ResolverEntityIndex, +} from '../../../common/endpoint/types'; +import { DEFAULT_INDEX_KEY as defaultIndexKey } from '../../../common/constants'; + +/** + * The data access layer for resolver. All communication with the Kibana server is done through this object. This object is provided to Resolver. In tests, a mock data access layer can be used instead. + */ +export function dataAccessLayerFactory( + context: KibanaReactContextValue +): DataAccessLayer { + const dataAccessLayer: DataAccessLayer = { + /** + * Used to get non-process related events for a node. + */ + async relatedEvents(entityID: string): Promise { + return context.services.http.get(`/api/endpoint/resolver/${entityID}/events`, { + query: { events: 100 }, + }); + }, + /** + * Used to get descendant and ancestor process events for a node. + */ + async resolverTree(entityID: string, signal: AbortSignal): Promise { + return context.services.http.get(`/api/endpoint/resolver/${entityID}`, { + signal, + }); + }, + + /** + * Used to get the default index pattern from the SIEM application. + */ + indexPatterns(): string[] { + return context.services.uiSettings.get(defaultIndexKey); + }, + + /** + * Used to get the entity_id for an _id. + */ + async entities({ + _id, + indices, + signal, + }: { + _id: string; + indices: string[]; + signal: AbortSignal; + }): Promise { + return context.services.http.get('/api/endpoint/resolver/entity', { + signal, + query: { + _id, + indices, + }, + }); + }, + }; + return dataAccessLayer; +} diff --git a/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/one_ancestor_two_children.ts b/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/one_ancestor_two_children.ts new file mode 100644 index 0000000000000..be0bc1b812a0b --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/one_ancestor_two_children.ts @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + ResolverRelatedEvents, + ResolverTree, + ResolverEntityIndex, +} from '../../../../common/endpoint/types'; +import { mockEndpointEvent } from '../../store/mocks/endpoint_event'; +import { mockTreeWithNoAncestorsAnd2Children } from '../../store/mocks/resolver_tree'; +import { DataAccessLayer } from '../../types'; + +interface Metadata { + /** + * The `_id` of the document being analyzed. + */ + databaseDocumentID: string; + /** + * A record of entityIDs to be used in tests assertions. + */ + entityIDs: { + /** + * The entityID of the node related to the document being analyzed. + */ + origin: 'origin'; + /** + * The entityID of the first child of the origin. + */ + firstChild: 'firstChild'; + /** + * The entityID of the second child of the origin. + */ + secondChild: 'secondChild'; + }; +} + +/** + * A simple mock dataAccessLayer possible that returns a tree with 0 ancestors and 2 direct children. 1 related event is returned. The parameter to `entities` is ignored. + */ +export function oneAncestorTwoChildren(): { dataAccessLayer: DataAccessLayer; metadata: Metadata } { + const metadata: Metadata = { + databaseDocumentID: '_id', + entityIDs: { origin: 'origin', firstChild: 'firstChild', secondChild: 'secondChild' }, + }; + return { + metadata, + dataAccessLayer: { + /** + * Fetch related events for an entity ID + */ + relatedEvents(entityID: string): Promise { + return Promise.resolve({ + entityID, + events: [ + mockEndpointEvent({ + entityID, + name: 'event', + timestamp: 0, + }), + ], + nextEvent: null, + }); + }, + + /** + * Fetch a ResolverTree for a entityID + */ + resolverTree(): Promise { + return Promise.resolve( + mockTreeWithNoAncestorsAnd2Children({ + originID: metadata.entityIDs.origin, + firstChildID: metadata.entityIDs.firstChild, + secondChildID: metadata.entityIDs.secondChild, + }) + ); + }, + + /** + * Get an array of index patterns that contain events. + */ + indexPatterns(): string[] { + return ['index pattern']; + }, + + /** + * Get entities matching a document. + */ + entities(): Promise { + return Promise.resolve([{ entity_id: metadata.entityIDs.origin }]); + }, + }, + }; +} diff --git a/x-pack/plugins/security_solution/public/resolver/models/process_event.ts b/x-pack/plugins/security_solution/public/resolver/models/process_event.ts index 4f8df87b3ac0b..1a5c67f6a6f2f 100644 --- a/x-pack/plugins/security_solution/public/resolver/models/process_event.ts +++ b/x-pack/plugins/security_solution/public/resolver/models/process_event.ts @@ -29,7 +29,7 @@ export function isTerminatedProcess(passedEvent: ResolverEvent) { } /** - * ms since unix epoc, based on timestamp. + * ms since Unix epoc, based on timestamp. * may return NaN if the timestamp wasn't present or was invalid. */ export function datetime(passedEvent: ResolverEvent): number | null { @@ -85,7 +85,7 @@ export function eventType(passedEvent: ResolverEvent): ResolverProcessType { } /** - * Returns the process event's pid + * Returns the process event's PID */ export function uniquePidForProcess(passedEvent: ResolverEvent): string { if (event.isLegacyEvent(passedEvent)) { @@ -96,7 +96,7 @@ export function uniquePidForProcess(passedEvent: ResolverEvent): string { } /** - * Returns the pid for the process on the host + * Returns the PID for the process on the host */ export function processPid(passedEvent: ResolverEvent): number | undefined { if (event.isLegacyEvent(passedEvent)) { @@ -107,7 +107,7 @@ export function processPid(passedEvent: ResolverEvent): number | undefined { } /** - * Returns the process event's parent pid + * Returns the process event's parent PID */ export function uniqueParentPidForProcess(passedEvent: ResolverEvent): string | undefined { if (event.isLegacyEvent(passedEvent)) { @@ -118,7 +118,7 @@ export function uniqueParentPidForProcess(passedEvent: ResolverEvent): string | } /** - * Returns the process event's parent pid + * Returns the process event's parent PID */ export function processParentPid(passedEvent: ResolverEvent): number | undefined { if (event.isLegacyEvent(passedEvent)) { @@ -144,12 +144,12 @@ export function processPath(passedEvent: ResolverEvent): string | undefined { */ export function userInfoForProcess( passedEvent: ResolverEvent -): { user?: string; domain?: string } | undefined { +): { name?: string; domain?: string } | undefined { return passedEvent.user; } /** - * Returns the MD5 hash for the `passedEvent` param, or undefined if it can't be located + * Returns the MD5 hash for the `passedEvent` parameter, or undefined if it can't be located * @param {ResolverEvent} passedEvent The `ResolverEvent` to get the MD5 value for * @returns {string | undefined} The MD5 string for the event */ @@ -164,7 +164,7 @@ export function md5HashForProcess(passedEvent: ResolverEvent): string | undefine /** * Returns the command line path and arguments used to run the `passedEvent` if any * - * @param {ResolverEvent} passedEvent The `ResolverEvent` to get the arguemnts value for + * @param {ResolverEvent} passedEvent The `ResolverEvent` to get the arguments value for * @returns {string | undefined} The arguments (including the path) used to run the process */ export function argsForProcess(passedEvent: ResolverEvent): string | undefined { diff --git a/x-pack/plugins/security_solution/public/resolver/store/index.ts b/x-pack/plugins/security_solution/public/resolver/store/index.ts index d9e750241ced1..950a61db33f17 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/index.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/index.ts @@ -6,22 +6,20 @@ import { createStore, applyMiddleware, Store } from 'redux'; import { composeWithDevTools } from 'redux-devtools-extension/developmentOnly'; -import { KibanaReactContextValue } from '../../../../../../src/plugins/kibana_react/public'; -import { ResolverState } from '../types'; -import { StartServices } from '../../types'; +import { ResolverState, DataAccessLayer } from '../types'; import { resolverReducer } from './reducer'; import { resolverMiddlewareFactory } from './middleware'; import { ResolverAction } from './actions'; export const storeFactory = ( - context?: KibanaReactContextValue + dataAccessLayer: DataAccessLayer ): Store => { const actionsDenylist: Array = ['userMovedPointer']; const composeEnhancers = composeWithDevTools({ name: 'Resolver', actionsBlacklist: actionsDenylist, }); - const middlewareEnhancer = applyMiddleware(resolverMiddlewareFactory(context)); + const middlewareEnhancer = applyMiddleware(resolverMiddlewareFactory(dataAccessLayer)); return createStore(resolverReducer, composeEnhancers(middlewareEnhancer)); }; diff --git a/x-pack/plugins/security_solution/public/resolver/store/middleware/index.ts b/x-pack/plugins/security_solution/public/resolver/store/middleware/index.ts index 398e855a1f5d4..ef6b1f5eb3c6f 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/middleware/index.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/middleware/index.ts @@ -5,34 +5,26 @@ */ import { Dispatch, MiddlewareAPI } from 'redux'; -import { KibanaReactContextValue } from '../../../../../../../src/plugins/kibana_react/public'; -import { StartServices } from '../../../types'; -import { ResolverState } from '../../types'; +import { ResolverState, DataAccessLayer } from '../../types'; import { ResolverRelatedEvents } from '../../../../common/endpoint/types'; import { ResolverTreeFetcher } from './resolver_tree_fetcher'; import { ResolverAction } from '../actions'; type MiddlewareFactory = ( - context?: KibanaReactContextValue + dataAccessLayer: DataAccessLayer ) => ( api: MiddlewareAPI, S> ) => (next: Dispatch) => (action: ResolverAction) => unknown; /** - * The redux middleware that the app uses to trigger side effects. + * The `redux` middleware that the application uses to trigger side effects. * All data fetching should be done here. - * For actions that the app triggers directly, use `app` as a prefix for the type. + * For actions that the application triggers directly, use `app` as a prefix for the type. * For actions that are triggered as a result of server interaction, use `server` as a prefix for the type. */ -export const resolverMiddlewareFactory: MiddlewareFactory = (context) => { +export const resolverMiddlewareFactory: MiddlewareFactory = (dataAccessLayer: DataAccessLayer) => { return (api) => (next) => { - // This cannot work w/o `context`. - if (!context) { - return async (action: ResolverAction) => { - next(action); - }; - } - const resolverTreeFetcher = ResolverTreeFetcher(context, api); + const resolverTreeFetcher = ResolverTreeFetcher(dataAccessLayer, api); return async (action: ResolverAction) => { next(action); @@ -45,12 +37,7 @@ export const resolverMiddlewareFactory: MiddlewareFactory = (context) => { const entityIdToFetchFor = action.payload; let result: ResolverRelatedEvents | undefined; try { - result = await context.services.http.get( - `/api/endpoint/resolver/${entityIdToFetchFor}/events`, - { - query: { events: 100 }, - } - ); + result = await dataAccessLayer.relatedEvents(entityIdToFetchFor); } catch { api.dispatch({ type: 'serverFailedToReturnRelatedEventData', diff --git a/x-pack/plugins/security_solution/public/resolver/store/middleware/resolver_tree_fetcher.ts b/x-pack/plugins/security_solution/public/resolver/store/middleware/resolver_tree_fetcher.ts index 7d16dc251e6fc..2c98059d420e8 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/middleware/resolver_tree_fetcher.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/middleware/resolver_tree_fetcher.ts @@ -9,11 +9,8 @@ import { Dispatch, MiddlewareAPI } from 'redux'; import { ResolverTree, ResolverEntityIndex } from '../../../../common/endpoint/types'; -import { KibanaReactContextValue } from '../../../../../../../src/plugins/kibana_react/public'; -import { ResolverState } from '../../types'; +import { ResolverState, DataAccessLayer } from '../../types'; import * as selectors from '../selectors'; -import { StartServices } from '../../../types'; -import { DEFAULT_INDEX_KEY as defaultIndexKey } from '../../../../common/constants'; import { ResolverAction } from '../actions'; /** * A function that handles syncing ResolverTree data w/ the current entity ID. @@ -23,7 +20,7 @@ import { ResolverAction } from '../actions'; * This is a factory because it is stateful and keeps that state in closure. */ export function ResolverTreeFetcher( - context: KibanaReactContextValue, + dataAccessLayer: DataAccessLayer, api: MiddlewareAPI, ResolverState> ): () => void { let lastRequestAbortController: AbortController | undefined; @@ -48,17 +45,12 @@ export function ResolverTreeFetcher( payload: databaseDocumentIDToFetch, }); try { - const indices: string[] = context.services.uiSettings.get(defaultIndexKey); - const matchingEntities: ResolverEntityIndex = await context.services.http.get( - '/api/endpoint/resolver/entity', - { - signal: lastRequestAbortController.signal, - query: { - _id: databaseDocumentIDToFetch, - indices, - }, - } - ); + const indices: string[] = dataAccessLayer.indexPatterns(); + const matchingEntities: ResolverEntityIndex = await dataAccessLayer.entities({ + _id: databaseDocumentIDToFetch, + indices, + signal: lastRequestAbortController.signal, + }); if (matchingEntities.length < 1) { // If no entity_id could be found for the _id, bail out with a failure. api.dispatch({ @@ -68,9 +60,10 @@ export function ResolverTreeFetcher( return; } const entityIDToFetch = matchingEntities[0].entity_id; - result = await context.services.http.get(`/api/endpoint/resolver/${entityIDToFetch}`, { - signal: lastRequestAbortController.signal, - }); + result = await dataAccessLayer.resolverTree( + entityIDToFetch, + lastRequestAbortController.signal + ); } catch (error) { // https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-AbortError if (error instanceof DOMException && error.name === 'AbortError') { diff --git a/x-pack/plugins/security_solution/public/resolver/store/mocks/endpoint_event.ts b/x-pack/plugins/security_solution/public/resolver/store/mocks/endpoint_event.ts index 8f2e0ad3a6d85..709f2faf13b00 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/mocks/endpoint_event.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/mocks/endpoint_event.ts @@ -18,7 +18,7 @@ export function mockEndpointEvent({ }: { entityID: string; name: string; - parentEntityId: string | undefined; + parentEntityId?: string; timestamp: number; lifecycleType?: string; }): EndpointEvent { diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/connect_enzyme_wrapper_and_store.ts b/x-pack/plugins/security_solution/public/resolver/test_utilities/connect_enzyme_wrapper_and_store.ts new file mode 100644 index 0000000000000..3a4a1f7d634d1 --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/connect_enzyme_wrapper_and_store.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Store } from 'redux'; +import { ReactWrapper } from 'enzyme'; + +/** + * We use the full-DOM emulation mode of `enzyme` via `mount`. Even though we use `react-redux`, `enzyme` + * does not update the DOM after state transitions. This subscribes to the `redux` store and after any state + * transition it asks `enzyme` to update the DOM to match the React state. + */ +export function connectEnzymeWrapperAndStore(store: Store, wrapper: ReactWrapper): void { + store.subscribe(() => { + // See https://enzymejs.github.io/enzyme/docs/api/ReactWrapper/update.html + return wrapper.update(); + }); +} diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/extend_jest.ts b/x-pack/plugins/security_solution/public/resolver/test_utilities/extend_jest.ts new file mode 100644 index 0000000000000..9fc7af38beb42 --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/extend_jest.ts @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +/** + * Typescript won't allow global namespace stuff unless you're in a module. + * This wouldn't otherwise be a module. The code runs as soon as it's imported. + * This is done this way because the `declare` will be active on import, so in + * order to be correct, the code that the `declare` declares needs to be available on import as well. + */ +export {}; + +declare global { + /* eslint-disable @typescript-eslint/no-namespace */ + namespace jest { + interface Matchers { + toYieldEqualTo(expectedYield: T extends AsyncIterable ? E : never): Promise; + } + } +} + +expect.extend({ + /** + * A custom matcher that takes an async generator and compares each value it yields to an expected value. + * If any yielded value deep-equals the expected value, the matcher will pass. + * If the generator ends with none of the yielded values matching, it will fail. + */ + async toYieldEqualTo( + this: jest.MatcherContext, + receivedIterable: AsyncIterable, + expected: T + ): Promise<{ pass: boolean; message: () => string }> { + // Used in printing out the pass or fail message + const matcherName = 'toSometimesYieldEqualTo'; + const options: jest.MatcherHintOptions = { + comment: 'deep equality with any yielded value', + isNot: this.isNot, + promise: this.promise, + }; + // The last value received: Used in printing the message + const received: T[] = []; + + // Set to true if the test passes. + let pass: boolean = false; + + // Async iterate over the iterable + for await (const next of receivedIterable) { + // keep track of all received values. Used in pass and fail messages + received.push(next); + // Use deep equals to compare the value to the expected value + if (this.equals(next, expected)) { + // If the value is equal, break + pass = true; + break; + } + } + + // Use `pass` as set in the above loop (or initialized to `false`) + // See https://jestjs.io/docs/en/expect#custom-matchers-api and https://jestjs.io/docs/en/expect#thisutils + const message = pass + ? () => + `${this.utils.matcherHint(matcherName, undefined, undefined, options)}\n\n` + + `Expected: not ${this.utils.printExpected(expected)}\n${ + this.utils.stringify(expected) !== this.utils.stringify(received[received.length - 1]!) + ? `Received: ${this.utils.printReceived(received[received.length - 1])}` + : '' + }` + : () => + `${this.utils.matcherHint(matcherName, undefined, undefined, options)}\n\nCompared ${ + received.length + } yields.\n\n${received + .map( + (next, index) => + `yield ${index + 1}:\n\n${this.utils.printDiffOrStringify( + expected, + next, + 'Expected', + 'Received', + this.expand + )}` + ) + .join(`\n\n`)}`; + + return { message, pass }; + }, +}); diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/react_wrapper.ts b/x-pack/plugins/security_solution/public/resolver/test_utilities/react_wrapper.ts new file mode 100644 index 0000000000000..40267d83c30f8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/react_wrapper.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ReactWrapper } from 'enzyme'; + +/** + * Return a collection of attribute 'entries'. + * The 'entries' are attributeName-attributeValue tuples. + */ +export function attributeEntries(wrapper: ReactWrapper): Array<[string, string]> { + return Array.prototype.slice + .call(wrapper.getDOMNode().attributes) + .map(({ name, value }) => [name, value]); +} diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx new file mode 100644 index 0000000000000..7a61427c56a3b --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx @@ -0,0 +1,290 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Store, createStore, applyMiddleware } from 'redux'; +import { mount, ReactWrapper } from 'enzyme'; +import { createMemoryHistory, History as HistoryPackageHistoryInterface } from 'history'; +import { CoreStart } from '../../../../../../../src/core/public'; +import { coreMock } from '../../../../../../../src/core/public/mocks'; +import { connectEnzymeWrapperAndStore } from '../connect_enzyme_wrapper_and_store'; +import { spyMiddlewareFactory } from '../spy_middleware_factory'; +import { resolverMiddlewareFactory } from '../../store/middleware'; +import { resolverReducer } from '../../store/reducer'; +import { MockResolver } from './mock_resolver'; +import { ResolverState, DataAccessLayer, SpyMiddleware } from '../../types'; +import { ResolverAction } from '../../store/actions'; + +/** + * Test a Resolver instance using jest, enzyme, and a mock data layer. + */ +export class Simulator { + /** + * A string that uniquely identifies this Resolver instance among others mounted in the DOM. + */ + private readonly resolverComponentInstanceID: string; + /** + * The redux store, creating in the constructor using the `dataAccessLayer`. + * This code subscribes to state transitions. + */ + private readonly store: Store; + /** + * A fake 'History' API used with `react-router` to simulate a browser history. + */ + private readonly history: HistoryPackageHistoryInterface; + /** + * The 'wrapper' returned by `enzyme` that contains the rendered Resolver react code. + */ + private readonly wrapper: ReactWrapper; + /** + * A `redux` middleware that exposes all actions dispatched (along with the state at that point.) + * This is used by `debugActions`. + */ + private readonly spyMiddleware: SpyMiddleware; + constructor({ + dataAccessLayer, + resolverComponentInstanceID, + databaseDocumentID, + }: { + /** + * A (mock) data access layer that will be used to create the Resolver store. + */ + dataAccessLayer: DataAccessLayer; + /** + * A string that uniquely identifies this Resolver instance among others mounted in the DOM. + */ + resolverComponentInstanceID: string; + /** + * a databaseDocumentID to pass to Resolver. Resolver will use this in requests to the mock data layer. + */ + databaseDocumentID?: string; + }) { + this.resolverComponentInstanceID = resolverComponentInstanceID; + // create the spy middleware (for debugging tests) + this.spyMiddleware = spyMiddlewareFactory(); + + /** + * Create the real resolver middleware with a fake data access layer. + * By providing different data access layers, you can simulate different data and server environments. + */ + const middlewareEnhancer = applyMiddleware( + resolverMiddlewareFactory(dataAccessLayer), + // install the spyMiddleware + this.spyMiddleware.middleware + ); + + // Create a redux store w/ the top level Resolver reducer and the enhancer that includes the Resolver middleware and the `spyMiddleware` + this.store = createStore(resolverReducer, middlewareEnhancer); + + // Create a fake 'history' instance that Resolver will use to read and write query string values + this.history = createMemoryHistory(); + + // Used for `KibanaContextProvider` + const coreStart: CoreStart = coreMock.createStart(); + + // Render Resolver via the `MockResolver` component, using `enzyme`. + this.wrapper = mount( + + ); + + // Update the enzyme wrapper after each state transition + connectEnzymeWrapperAndStore(this.store, this.wrapper); + } + + /** + * Call this to console.log actions (and state). Use this to debug your tests. + * State and actions aren't exposed otherwise because the tests using this simulator should + * assert stuff about the DOM instead of internal state. Use selector/middleware/reducer + * unit tests to test that stuff. + */ + public debugActions(): /** + * Optionally call this to stop debugging actions. + */ () => void { + return this.spyMiddleware.debugActions(); + } + + /** + * Return a promise that resolves after the `store`'s next state transition. + * Used by `mapStateTransitions` + */ + private stateTransitioned(): Promise { + // keep track of the resolve function of the promise that has been returned. + let resolveState: (() => void) | null = null; + + const promise: Promise = new Promise((resolve) => { + // Immediately expose the resolve function in the outer scope. It will be resolved when the next state transition occurs. + resolveState = resolve; + }); + + // Subscribe to the store + const unsubscribe = this.store.subscribe(() => { + // Once a state transition occurs, unsubscribe. + unsubscribe(); + // Resolve the promise. The null assertion is safe here as Promise initializers run immediately (according to spec and node/browser implementations.) + // NB: the state is not resolved here. Code using the simulator should not rely on state or selectors of state. + resolveState!(); + }); + + // Return the promise that will be resolved on the next state transition, allowing code to `await` for the next state transition. + return promise; + } + + /** + * This will yield the return value of `mapper` after each state transition. If no state transition occurs for 10 event loops in a row, this will give up. + */ + public async *mapStateTransitions(mapper: () => R): AsyncIterable { + // Yield the value before any state transitions have occurred. + yield mapper(); + + /** Increment this each time an event loop completes without a state transition. + * If this value hits `10`, end the loop. + * + * Code will test assertions after each state transition. If the assertion hasn't passed and no further state transitions occur, + * then the jest timeout will happen. The timeout doesn't give a useful message about the assertion. + * By short-circuiting this function, code that uses it can short circuit the test timeout and print a useful error message. + * + * NB: the logic to short-circuit the loop is here because knowledge of state is a concern of the simulator, not tests. + */ + let timeoutCount = 0; + while (true) { + /** + * `await` a race between the next state transition and a timeout that happens after `0`ms. + * If the timeout wins, no `dispatch` call caused a state transition in the last loop. + * If this keeps happening, assume that Resolver isn't going to do anything else. + * + * If Resolver adds intentional delay logic (e.g. waiting before making a request), this code might have to change. + * In that case, Resolver should use the side effect context to schedule future work. This code could then subscribe to some event published by the side effect context. That way, this code will be aware of Resolver's intention to do work. + */ + const timedOut: boolean = await Promise.race([ + (async (): Promise => { + await this.stateTransitioned(); + // If a state transition occurs, return false for `timedOut` + return false; + })(), + new Promise((resolve) => { + setTimeout(() => { + // If a timeout occurs, resolve `timedOut` as true + return resolve(true); + }, 0); + }), + ]); + + if (timedOut) { + // If a timout occurred, note it. + timeoutCount++; + if (timeoutCount === 10) { + // if 10 timeouts happen in a row, end the loop early + return; + } + } else { + // If a state transition occurs, reset the timeout count and yield the value + timeoutCount = 0; + yield mapper(); + } + } + } + + /** + * Find a process node element. Takes options supported by `resolverNodeSelector`. + * returns a `ReactWrapper` even if nothing is found, as that is how `enzyme` does things. + */ + public processNodeElements(options: ProcessNodeElementSelectorOptions = {}): ReactWrapper { + return this.findInDOM(processNodeElementSelector(options)); + } + + /** + * true if a process node element is found for the entityID and if it has an [aria-selected] attribute. + */ + public processNodeElementLooksSelected(entityID: string): boolean { + return this.processNodeElements({ entityID, selected: true }).length === 1; + } + + /** + * true if a process node element is found for the entityID and if it *does not have* an [aria-selected] attribute. + */ + public processNodeElementLooksUnselected(entityID: string): boolean { + // find the process node, then exclude it if its selected. + return ( + this.processNodeElements({ entityID }).not( + processNodeElementSelector({ entityID, selected: true }) + ).length === 1 + ); + } + + /** + * Return the selected node query string values. + */ + public queryStringValues(): { selectedNode: string[] } { + const urlSearchParams = new URLSearchParams(this.history.location.search); + return { + selectedNode: urlSearchParams.getAll(`resolver-${this.resolverComponentInstanceID}-id`), + }; + } + + /** + * The element that shows when Resolver is waiting for the graph data. + */ + public graphLoadingElement(): ReactWrapper { + return this.findInDOM('[data-test-subj="resolver:graph:loading"]'); + } + + /** + * The element that shows if Resolver couldn't draw the graph. + */ + public graphErrorElement(): ReactWrapper { + return this.findInDOM('[data-test-subj="resolver:graph:error"]'); + } + + /** + * The element where nodes get drawn. + */ + public graphElement(): ReactWrapper { + return this.findInDOM('[data-test-subj="resolver:graph"]'); + } + + /** + * Like `this.wrapper.find` but only returns DOM nodes. + */ + private findInDOM(selector: string): ReactWrapper { + return this.wrapper.find(selector).filterWhere((wrapper) => typeof wrapper.type() === 'string'); + } +} + +const baseResolverSelector = '[data-test-subj="resolver:node"]'; + +interface ProcessNodeElementSelectorOptions { + /** + * Entity ID of the node. If passed, will be used to create an data-attribute CSS selector that should only get the related node element. + */ + entityID?: string; + /** + * If true, only get nodes with an `[aria-selected="true"]` attribute. + */ + selected?: boolean; +} + +/** + * An `enzyme` supported CSS selector for process node elements. + */ +function processNodeElementSelector({ + entityID, + selected = false, +}: ProcessNodeElementSelectorOptions = {}): string { + let selector: string = baseResolverSelector; + if (entityID !== undefined) { + selector += `[data-test-resolver-node-id="${entityID}"]`; + } + if (selected) { + selector += '[aria-selected="true"]'; + } + return selector; +} diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/mock_resolver.tsx b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/mock_resolver.tsx new file mode 100644 index 0000000000000..36bb2a5ffc9fe --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/mock_resolver.tsx @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +/* eslint-disable no-duplicate-imports */ +/* eslint-disable react/display-name */ + +import React, { useMemo, useEffect, useState, useCallback } from 'react'; +import { Router } from 'react-router-dom'; +import { I18nProvider } from '@kbn/i18n/react'; +import { Provider } from 'react-redux'; +import { Store } from 'redux'; +import { KibanaContextProvider } from '../../../../../../../src/plugins/kibana_react/public'; +import { CoreStart } from '../../../../../../../src/core/public'; +import { ResolverState, SideEffectSimulator, ResolverProps } from '../../types'; +import { ResolverAction } from '../../store/actions'; +import { ResolverWithoutProviders } from '../../view/resolver_without_providers'; +import { SideEffectContext } from '../../view/side_effect_context'; +import { sideEffectSimulatorFactory } from '../../view/side_effect_simulator_factory'; + +type MockResolverProps = { + /** + * Used to simulate a raster width. Defaults to 1600. + */ + rasterWidth?: number; + /** + * Used to simulate a raster height. Defaults to 1200. + */ + rasterHeight?: number; + /** + * Used for the `KibanaContextProvider` + */ + coreStart: CoreStart; + /** + * Used for `react-router`. + */ + history: React.ComponentProps['history']; + /** Pass a resolver store. See `storeFactory` and `mockDataAccessLayer` */ + store: Store; + /** + * All the props from `ResolverWithoutStore` can be passed. These aren't defaulted to anything (you might want to test what happens when they aren't present.) + */ +} & ResolverProps; + +/** + * This is a mock Resolver component. It is intended to be used with `enzyme` tests via the `Simulator` class. It wraps Resolver in the required providers: + * * `i18n` + * * `Router` using a provided `History` + * * `SideEffectContext.Provider` using side effect simulator it creates + * * `KibanaContextProvider` using a provided `CoreStart` instance + * * `react-redux`'s `Provider` using a provided `Store`. + * + * Resolver needs to measure its size in the DOM. The `SideEffectSimulator` instance can fake the size of an element. + * However in tests, React doesn't have good DOM reconciliation and the root element is often swapped out. When the + * element is replaced, the fake dimensions stop being applied. In order to get around this issue, this component will + * trigger a simulated resize on the root node reference any time it changes. This simulates the layout process a real + * browser would do when an element is attached to the DOM. + */ +export const MockResolver = React.memo((props: MockResolverProps) => { + const [resolverElement, setResolverElement] = useState(null); + + // Get a ref to the underlying Resolver element so we can resize. + // Use a callback function because the underlying DOM node can change. In fact, `enzyme` seems to change it a lot. + const resolverRef = useCallback((element: HTMLDivElement | null) => { + setResolverElement(element); + }, []); + + const simulator: SideEffectSimulator = useMemo(() => sideEffectSimulatorFactory(), []); + + // Resize the Resolver element to match the passed in props. Resolver is size dependent. + useEffect(() => { + if (resolverElement) { + const size: DOMRect = { + width: props.rasterWidth ?? 1600, + height: props.rasterHeight ?? 1200, + x: 0, + y: 0, + bottom: 0, + left: 0, + top: 0, + right: 0, + toJSON() { + return this; + }, + }; + simulator.controls.simulateElementResize(resolverElement, size); + } + }, [props.rasterWidth, props.rasterHeight, simulator.controls, resolverElement]); + + return ( + + + + + + + + + + + + ); +}); diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/spy_middleware_factory.ts b/x-pack/plugins/security_solution/public/resolver/test_utilities/spy_middleware_factory.ts new file mode 100644 index 0000000000000..45730531cf467 --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/spy_middleware_factory.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ResolverAction } from '../store/actions'; +import { SpyMiddleware, SpyMiddlewareStateActionPair } from '../types'; + +/** + * Return a `SpyMiddleware` to be used in testing. Use `debugActions` to console.log actions and the state they produced. + * For reducer/middleware tests, you can use `actions` to get access to each dispatched action along with the state it produced. + */ +export const spyMiddlewareFactory: () => SpyMiddleware = () => { + const resolvers: Set<(stateActionPair: SpyMiddlewareStateActionPair) => void> = new Set(); + + const actions = async function* actions() { + while (true) { + const promise: Promise = new Promise((resolve) => { + resolvers.add(resolve); + }); + yield await promise; + } + }; + + return { + middleware: (api) => (next) => (action: ResolverAction) => { + // handle the action first so we get the state after the reducer + next(action); + + const state = api.getState(); + + // Resolving these promises may cause code to await the next result. That will add more resolve functions to `resolvers`. + // For this reason, copy all the existing resolvers to an array and clear the set. + const oldResolvers = [...resolvers]; + resolvers.clear(); + for (const resolve of oldResolvers) { + resolve({ action, state }); + } + }, + actions, + debugActions() { + let stop: boolean = false; + (async () => { + for await (const actionStatePair of actions()) { + if (stop) { + break; + } + // eslint-disable-next-line no-console + console.log('action', actionStatePair.action, 'state', actionStatePair.state); + } + })(); + return () => { + stop = true; + }; + }, + }; +}; diff --git a/x-pack/plugins/security_solution/public/resolver/types.ts b/x-pack/plugins/security_solution/public/resolver/types.ts index 02a890ca13ee8..38e0cd0483559 100644 --- a/x-pack/plugins/security_solution/public/resolver/types.ts +++ b/x-pack/plugins/security_solution/public/resolver/types.ts @@ -4,10 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ +/* eslint-disable no-duplicate-imports */ + import { Store } from 'redux'; +import { Middleware, Dispatch } from 'redux'; import { BBox } from 'rbush'; import { ResolverAction } from './store/actions'; -import { ResolverEvent, ResolverRelatedEvents, ResolverTree } from '../../common/endpoint/types'; +import { + ResolverEvent, + ResolverRelatedEvents, + ResolverTree, + ResolverEntityIndex, +} from '../../common/endpoint/types'; /** * Redux state for the Resolver feature. Properties on this interface are populated via multiple reducers using redux's `combineReducers`. @@ -30,21 +38,21 @@ export interface ResolverState { } /** - * Piece of redux state that models an animation for the camera. + * Piece of `redux` state that models an animation for the camera. */ export interface ResolverUIState { /** - * The nodeID for the process that is selected (in the aria-activedescendent sense of being selected.) + * The `nodeID` for the process that is selected (in the `aria-activedescendent` sense of being selected.) */ readonly ariaActiveDescendant: string | null; /** - * nodeID of the selected node + * `nodeID` of the selected node */ readonly selectedNode: string | null; } /** - * Piece of redux state that models an animation for the camera. + * Piece of `redux` state that models an animation for the camera. */ export interface CameraAnimationState { /** @@ -68,7 +76,7 @@ export interface CameraAnimationState { } /** - * The redux state for the `useCamera` hook. + * The `redux` state for the `useCamera` hook. */ export type CameraState = { /** @@ -88,7 +96,7 @@ export type CameraState = { readonly translationNotCountingCurrentPanning: Vector2; /** - * The world coordinates that the pointing device was last over. This is used during mousewheel zoom. + * The world coordinates that the pointing device was last over. This is used during mouse-wheel zoom. */ readonly latestFocusedWorldCoordinates: Vector2 | null; } & ( @@ -135,7 +143,7 @@ export type CameraState = { export type IndexedEntity = IndexedEdgeLineSegment | IndexedProcessNode; /** - * The entity stored in rbush for resolver edge lines. + * The entity stored in `rbush` for resolver edge lines. */ export interface IndexedEdgeLineSegment extends BBox { type: 'edgeLine'; @@ -143,7 +151,7 @@ export interface IndexedEdgeLineSegment extends BBox { } /** - * The entity store in rbush for resolver process nodes. + * The entity store in `rbush` for resolver process nodes. */ export interface IndexedProcessNode extends BBox { type: 'processNode'; @@ -160,7 +168,7 @@ export interface VisibleEntites { } /** - * State for `data` reducer which handles receiving Resolver data from the backend. + * State for `data` reducer which handles receiving Resolver data from the back-end. */ export interface DataState { readonly relatedEvents: Map; @@ -213,11 +221,11 @@ export type Vector2 = readonly [number, number]; */ export interface AABB { /** - * Vector who's `x` component is the _left_ side of the AABB and who's `y` component is the _bottom_ side of the AABB. + * Vector who's `x` component is the _left_ side of the `AABB` and who's `y` component is the _bottom_ side of the `AABB`. **/ readonly minimum: Vector2; /** - * Vector who's `x` component is the _right_ side of the AABB and who's `y` component is the _bottom_ side of the AABB. + * Vector who's `x` component is the _right_ side of the `AABB` and who's `y` component is the _bottom_ side of the `AABB`. **/ readonly maximum: Vector2; } @@ -266,7 +274,7 @@ export interface ProcessEvent { } /** - * A represention of a process tree with indices for O(1) access to children and values by id. + * A representation of a process tree with indices for O(1) access to children and values by id. */ export interface IndexedProcessTree { /** @@ -280,7 +288,7 @@ export interface IndexedProcessTree { } /** - * A map of ProcessEvents (representing process nodes) to the 'width' of their subtrees as calculated by `widthsOfProcessSubtrees` + * A map of `ProcessEvents` (representing process nodes) to the 'width' of their subtrees as calculated by `widthsOfProcessSubtrees` */ export type ProcessWidths = Map; /** @@ -318,16 +326,16 @@ export interface DurationDetails { */ export interface EdgeLineMetadata { elapsedTime?: DurationDetails; - // A string of the two joined process nodes concatted together. + // A string of the two joined process nodes concatenated together. uniqueId: string; } /** - * A tuple of 2 vector2 points forming a polyline. Used to connect process nodes in the graph. + * A tuple of 2 vector2 points forming a poly-line. Used to connect process nodes in the graph. */ export type EdgeLinePoints = Vector2[]; /** - * Edge line components including the points joining the edgeline and any optional associated metadata + * Edge line components including the points joining the edge-line and any optional associated metadata */ export interface EdgeLineSegment { points: EdgeLinePoints; @@ -335,7 +343,7 @@ export interface EdgeLineSegment { } /** - * Used to provide precalculated info from `widthsOfProcessSubtrees`. These 'width' values are used in the layout of the graph. + * Used to provide pre-calculated info from `widthsOfProcessSubtrees`. These 'width' values are used in the layout of the graph. */ export type ProcessWithWidthMetadata = { process: ResolverEvent; @@ -423,11 +431,11 @@ export type ResolverStore = Store; */ export interface IsometricTaxiLayout { /** - * A map of events to position. each event represents its own node. + * A map of events to position. Each event represents its own node. */ processNodePositions: Map; /** - * A map of edgline segments, which graphically connect nodes. + * A map of edge-line segments, which graphically connect nodes. */ edgeLineSegments: EdgeLineSegment[]; @@ -436,3 +444,91 @@ export interface IsometricTaxiLayout { */ ariaLevels: Map; } + +/** + * An object with methods that can be used to access data from the Kibana server. + * This is injected into Resolver. + * This allows tests to provide a mock data access layer. + * In the future, other implementations of Resolver could provide different data access layers. + */ +export interface DataAccessLayer { + /** + * Fetch related events for an entity ID + */ + relatedEvents: (entityID: string) => Promise; + + /** + * Fetch a ResolverTree for a entityID + */ + resolverTree: (entityID: string, signal: AbortSignal) => Promise; + + /** + * Get an array of index patterns that contain events. + */ + indexPatterns: () => string[]; + + /** + * Get entities matching a document. + */ + entities: (parameters: { + /** _id of the document to find an entity in. */ + _id: string; + /** indices to search in */ + indices: string[]; + /** signal to abort the request */ + signal: AbortSignal; + }) => Promise; +} + +/** + * The externally provided React props. + */ +export interface ResolverProps { + /** + * Used by `styled-components`. + */ + className?: string; + /** + * The `_id` value of an event in ES. + * Used as the origin of the Resolver graph. + */ + databaseDocumentID?: string; + /** + * A string literal describing where in the application resolver is located. + * Used to prevent collisions in things like query parameters. + */ + resolverComponentInstanceID: string; +} + +/** + * Used by `SpyMiddleware`. + */ +export interface SpyMiddlewareStateActionPair { + /** An action dispatched, `state` is the state that the reducer returned when handling this action. + */ + action: ResolverAction; + /** + * A resolver state that was returned by the reducer when handling `action`. + */ + state: ResolverState; +} + +/** + * A wrapper object that has a middleware along with an async generator that returns the actions dispatched to the store (along with state.) + */ +export interface SpyMiddleware { + /** + * A middleware to use with `applyMiddleware`. + */ + middleware: Middleware<{}, ResolverState, Dispatch>; + /** + * A generator that returns all state and action pairs that pass through the middleware. + */ + actions: () => AsyncGenerator; + + /** + * Prints actions to the console. + * Call the returned function to stop debugging. + */ + debugActions: () => () => void; +} diff --git a/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx new file mode 100644 index 0000000000000..9cb900736677e --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { oneAncestorTwoChildren } from '../data_access_layer/mocks/one_ancestor_two_children'; +import { Simulator } from '../test_utilities/simulator'; +// Extend jest with a custom matcher +import '../test_utilities/extend_jest'; + +describe('Resolver, when analyzing a tree that has 1 ancestor and 2 children', () => { + let simulator: Simulator; + let databaseDocumentID: string; + let entityIDs: { origin: string; firstChild: string; secondChild: string }; + + // the resolver component instance ID, used by the react code to distinguish piece of global state from those used by other resolver instances + const resolverComponentInstanceID = 'resolverComponentInstanceID'; + + beforeEach(async () => { + // create a mock data access layer + const { metadata: dataAccessLayerMetadata, dataAccessLayer } = oneAncestorTwoChildren(); + + // save a reference to the entity IDs exposed by the mock data layer + entityIDs = dataAccessLayerMetadata.entityIDs; + + // save a reference to the `_id` supported by the mock data layer + databaseDocumentID = dataAccessLayerMetadata.databaseDocumentID; + + // create a resolver simulator, using the data access layer and an arbitrary component instance ID + simulator = new Simulator({ databaseDocumentID, dataAccessLayer, resolverComponentInstanceID }); + }); + + describe('when it has loaded', () => { + beforeEach(async () => { + await expect( + /** + * It's important that all of these are done in a single `expect`. + * If you do them concurrently with each other, you'll have incorrect results. + * + * For example, there might be no loading element at one point, and 1 graph element at one point, but never a single time when there is both 1 graph element and 0 loading elements. + */ + simulator.mapStateTransitions(() => ({ + graphElements: simulator.graphElement().length, + graphLoadingElements: simulator.graphLoadingElement().length, + graphErrorElements: simulator.graphErrorElement().length, + })) + ).toYieldEqualTo({ + // it should have 1 graph element, an no error or loading elements. + graphElements: 1, + graphLoadingElements: 0, + graphErrorElements: 0, + }); + }); + + // Combining assertions here for performance. Unfortunately, Enzyme + jsdom + React is slow. + it(`should have 3 nodes, with the entityID's 'origin', 'firstChild', and 'secondChild'. 'origin' should be selected.`, async () => { + expect(simulator.processNodeElementLooksSelected(entityIDs.origin)).toBe(true); + + expect(simulator.processNodeElementLooksUnselected(entityIDs.firstChild)).toBe(true); + expect(simulator.processNodeElementLooksUnselected(entityIDs.secondChild)).toBe(true); + + expect(simulator.processNodeElements().length).toBe(3); + }); + + describe("when the second child node's first button has been clicked", () => { + beforeEach(() => { + // Click the first button under the second child element. + simulator + .processNodeElements({ entityID: entityIDs.secondChild }) + .find('button') + .simulate('click'); + }); + it('should render the second child node as selected, and the first child not as not selected, and the query string should indicate that the second child is selected', async () => { + await expect( + simulator.mapStateTransitions(function value() { + return { + // the query string has a key showing that the second child is selected + queryStringSelectedNode: simulator.queryStringValues().selectedNode, + // the second child is rendered in the DOM, and shows up as selected + secondChildLooksSelected: simulator.processNodeElementLooksSelected( + entityIDs.secondChild + ), + // the origin is in the DOM, but shows up as unselected + originLooksUnselected: simulator.processNodeElementLooksUnselected(entityIDs.origin), + }; + }) + ).toYieldEqualTo({ + // Just the second child should be marked as selected in the query string + queryStringSelectedNode: [entityIDs.secondChild], + // The second child is rendered and has `[aria-selected]` + secondChildLooksSelected: true, + // The origin child is rendered and doesn't have `[aria-selected]` + originLooksUnselected: true, + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/resolver/view/index.tsx b/x-pack/plugins/security_solution/public/resolver/view/index.tsx index c1ffa42d02abb..d9a0bf291d0e4 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/index.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/index.tsx @@ -7,50 +7,29 @@ import React, { useMemo } from 'react'; import { Provider } from 'react-redux'; -import { ResolverMap } from './map'; import { storeFactory } from '../store'; import { StartServices } from '../../types'; import { useKibana } from '../../../../../../src/plugins/kibana_react/public'; +import { DataAccessLayer, ResolverProps } from '../types'; +import { dataAccessLayerFactory } from '../data_access_layer/factory'; +import { ResolverWithoutProviders } from './resolver_without_providers'; /** - * The top level, unconnected, Resolver component. + * The `Resolver` component to use. This sets up the DataAccessLayer provider. Use `ResolverWithoutProviders` in tests or in other scenarios where you want to provide a different (or fake) data access layer. */ -export const Resolver = React.memo(function ({ - className, - databaseDocumentID, - resolverComponentInstanceID, -}: { - /** - * Used by `styled-components`. - */ - className?: string; - /** - * The `_id` value of an event in ES. - * Used as the origin of the Resolver graph. - */ - databaseDocumentID?: string; - /** - * A string literal describing where in the app resolver is located, - * used to prevent collisions in things like query params - */ - resolverComponentInstanceID: string; -}) { +export const Resolver = React.memo((props: ResolverProps) => { const context = useKibana(); + const dataAccessLayer: DataAccessLayer = useMemo(() => dataAccessLayerFactory(context), [ + context, + ]); + const store = useMemo(() => { - return storeFactory(context); - }, [context]); + return storeFactory(dataAccessLayer); + }, [dataAccessLayer]); - /** - * Setup the store and use `Provider` here. This allows the ResolverMap component to - * dispatch actions and read from state. - */ return ( - + ); }); diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_detail.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_detail.tsx index 29c7676d2167d..7b5eb13359dbb 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_detail.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/panel_content_process_detail.tsx @@ -1,184 +1,184 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import React, { memo, useMemo } from 'react'; -import { useSelector } from 'react-redux'; -import { i18n } from '@kbn/i18n'; -import { - htmlIdGenerator, - EuiSpacer, - EuiTitle, - EuiText, - EuiTextColor, - EuiDescriptionList, -} from '@elastic/eui'; -import styled from 'styled-components'; -import { FormattedMessage } from 'react-intl'; -import * as selectors from '../../store/selectors'; -import * as event from '../../../../common/endpoint/models/event'; -import { CrumbInfo, formatDate, StyledBreadcrumbs } from './panel_content_utilities'; -import { - processPath, - processPid, - userInfoForProcess, - processParentPid, - md5HashForProcess, - argsForProcess, -} from '../../models/process_event'; -import { CubeForProcess } from './process_cube_icon'; -import { ResolverEvent } from '../../../../common/endpoint/types'; -import { useResolverTheme } from '../assets'; - -const StyledDescriptionList = styled(EuiDescriptionList)` - &.euiDescriptionList.euiDescriptionList--column dt.euiDescriptionList__title.desc-title { - max-width: 10em; - } -`; - -/** - * A description list view of all the Metadata that goes with a particular process event, like: - * Created, Pid, User/Domain, etc. - */ -export const ProcessDetails = memo(function ProcessDetails({ - processEvent, - pushToQueryParams, -}: { - processEvent: ResolverEvent; - pushToQueryParams: (queryStringKeyValuePair: CrumbInfo) => unknown; -}) { - const processName = event.eventName(processEvent); - const entityId = event.entityId(processEvent); - const isProcessTerminated = useSelector(selectors.isProcessTerminated)(entityId); - const processInfoEntry = useMemo(() => { - const eventTime = event.eventTimestamp(processEvent); - const dateTime = eventTime ? formatDate(eventTime) : ''; - - const createdEntry = { - title: '@timestamp', - description: dateTime, - }; - - const pathEntry = { - title: 'process.executable', - description: processPath(processEvent), - }; - - const pidEntry = { - title: 'process.pid', - description: processPid(processEvent), - }; - - const userEntry = { - title: 'user.name', - description: (userInfoForProcess(processEvent) as { name: string }).name, - }; - - const domainEntry = { - title: 'user.domain', - description: (userInfoForProcess(processEvent) as { domain: string }).domain, - }; - - const parentPidEntry = { - title: 'process.parent.pid', - description: processParentPid(processEvent), - }; - - const md5Entry = { - title: 'process.hash.md5', - description: md5HashForProcess(processEvent), - }; - - const commandLineEntry = { - title: 'process.args', - description: argsForProcess(processEvent), - }; - - // This is the data in {title, description} form for the EUIDescriptionList to display - const processDescriptionListData = [ - createdEntry, - pathEntry, - pidEntry, - userEntry, - domainEntry, - parentPidEntry, - md5Entry, - commandLineEntry, - ] - .filter((entry) => { - return entry.description; - }) - .map((entry) => { - return { - ...entry, - description: String(entry.description), - }; - }); - - return processDescriptionListData; - }, [processEvent]); - - const crumbs = useMemo(() => { - return [ - { - text: i18n.translate( - 'xpack.securitySolution.endpoint.resolver.panel.processDescList.events', - { - defaultMessage: 'Events', - } - ), - onClick: () => { - pushToQueryParams({ crumbId: '', crumbEvent: '' }); - }, - }, - { - text: ( - <> - - - ), - onClick: () => {}, - }, - ]; - }, [processName, pushToQueryParams]); - const { cubeAssetsForNode } = useResolverTheme(); - const { descriptionText } = useMemo(() => { - if (!processEvent) { - return { descriptionText: '' }; - } - return cubeAssetsForNode(isProcessTerminated, false); - }, [processEvent, cubeAssetsForNode, isProcessTerminated]); - - const titleId = useMemo(() => htmlIdGenerator('resolverTable')(), []); - return ( - <> - - - -

      - - {processName} -

      -
      - - - {descriptionText} - - - - - - ); -}); -ProcessDetails.displayName = 'ProcessDetails'; +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { memo, useMemo } from 'react'; +import { useSelector } from 'react-redux'; +import { i18n } from '@kbn/i18n'; +import { + htmlIdGenerator, + EuiSpacer, + EuiTitle, + EuiText, + EuiTextColor, + EuiDescriptionList, +} from '@elastic/eui'; +import styled from 'styled-components'; +import { FormattedMessage } from 'react-intl'; +import * as selectors from '../../store/selectors'; +import * as event from '../../../../common/endpoint/models/event'; +import { CrumbInfo, formatDate, StyledBreadcrumbs } from './panel_content_utilities'; +import { + processPath, + processPid, + userInfoForProcess, + processParentPid, + md5HashForProcess, + argsForProcess, +} from '../../models/process_event'; +import { CubeForProcess } from './process_cube_icon'; +import { ResolverEvent } from '../../../../common/endpoint/types'; +import { useResolverTheme } from '../assets'; + +const StyledDescriptionList = styled(EuiDescriptionList)` + &.euiDescriptionList.euiDescriptionList--column dt.euiDescriptionList__title.desc-title { + max-width: 10em; + } +`; + +/** + * A description list view of all the Metadata that goes with a particular process event, like: + * Created, PID, User/Domain, etc. + */ +export const ProcessDetails = memo(function ProcessDetails({ + processEvent, + pushToQueryParams, +}: { + processEvent: ResolverEvent; + pushToQueryParams: (queryStringKeyValuePair: CrumbInfo) => unknown; +}) { + const processName = event.eventName(processEvent); + const entityId = event.entityId(processEvent); + const isProcessTerminated = useSelector(selectors.isProcessTerminated)(entityId); + const processInfoEntry = useMemo(() => { + const eventTime = event.eventTimestamp(processEvent); + const dateTime = eventTime ? formatDate(eventTime) : ''; + + const createdEntry = { + title: '@timestamp', + description: dateTime, + }; + + const pathEntry = { + title: 'process.executable', + description: processPath(processEvent), + }; + + const pidEntry = { + title: 'process.pid', + description: processPid(processEvent), + }; + + const userEntry = { + title: 'user.name', + description: userInfoForProcess(processEvent)?.name, + }; + + const domainEntry = { + title: 'user.domain', + description: userInfoForProcess(processEvent)?.domain, + }; + + const parentPidEntry = { + title: 'process.parent.pid', + description: processParentPid(processEvent), + }; + + const md5Entry = { + title: 'process.hash.md5', + description: md5HashForProcess(processEvent), + }; + + const commandLineEntry = { + title: 'process.args', + description: argsForProcess(processEvent), + }; + + // This is the data in {title, description} form for the EUIDescriptionList to display + const processDescriptionListData = [ + createdEntry, + pathEntry, + pidEntry, + userEntry, + domainEntry, + parentPidEntry, + md5Entry, + commandLineEntry, + ] + .filter((entry) => { + return entry.description; + }) + .map((entry) => { + return { + ...entry, + description: String(entry.description), + }; + }); + + return processDescriptionListData; + }, [processEvent]); + + const crumbs = useMemo(() => { + return [ + { + text: i18n.translate( + 'xpack.securitySolution.endpoint.resolver.panel.processDescList.events', + { + defaultMessage: 'Events', + } + ), + onClick: () => { + pushToQueryParams({ crumbId: '', crumbEvent: '' }); + }, + }, + { + text: ( + <> + + + ), + onClick: () => {}, + }, + ]; + }, [processName, pushToQueryParams]); + const { cubeAssetsForNode } = useResolverTheme(); + const { descriptionText } = useMemo(() => { + if (!processEvent) { + return { descriptionText: '' }; + } + return cubeAssetsForNode(isProcessTerminated, false); + }, [processEvent, cubeAssetsForNode, isProcessTerminated]); + + const titleId = useMemo(() => htmlIdGenerator('resolverTable')(), []); + return ( + <> + + + +

      + + {processName} +

      +
      + + + {descriptionText} + + + + + + ); +}); +ProcessDetails.displayName = 'ProcessDetails'; diff --git a/x-pack/plugins/security_solution/public/resolver/view/process_event_dot.tsx b/x-pack/plugins/security_solution/public/resolver/view/process_event_dot.tsx index aed292e4a39d1..24de45ee894dc 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/process_event_dot.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/process_event_dot.tsx @@ -195,7 +195,7 @@ const UnstyledProcessEventDot = React.memo( * `beginElement` is by [w3](https://www.w3.org/TR/SVG11/animate.html#__smil__ElementTimeControl__beginElement) * but missing in [TSJS-lib-generator](https://github.com/microsoft/TSJS-lib-generator/blob/15a4678e0ef6de308e79451503e444e9949ee849/inputfiles/addedTypes.json#L1819) */ - beginElement: () => void; + beginElement?: () => void; }) | null; } = React.createRef(); @@ -238,10 +238,8 @@ const UnstyledProcessEventDot = React.memo( const { pushToQueryParams } = useResolverQueryParams(); const handleClick = useCallback(() => { - if (animationTarget.current !== null) { - // This works but the types are missing in the typescript DOM lib - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (animationTarget.current as any).beginElement(); + if (animationTarget.current?.beginElement) { + animationTarget.current.beginElement(); } dispatch({ type: 'userSelectedResolverNode', @@ -297,7 +295,8 @@ const UnstyledProcessEventDot = React.memo( */ return (
      { handleFocus(); handleClick(); - } /* a11y note: this is strictly an alternate to the button, so no tabindex is necessary*/ + } /* a11y note: this is strictly an alternate to the button, so no tabindex is necessary*/ } role="img" aria-labelledby={labelHTMLID} diff --git a/x-pack/plugins/security_solution/public/resolver/view/resolver_without_providers.tsx b/x-pack/plugins/security_solution/public/resolver/view/resolver_without_providers.tsx new file mode 100644 index 0000000000000..f444d5a25e1ef --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/view/resolver_without_providers.tsx @@ -0,0 +1,139 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +/* eslint-disable no-duplicate-imports */ + +/* eslint-disable react/display-name */ + +import React, { useContext, useCallback } from 'react'; +import { useSelector } from 'react-redux'; +import { useEffectOnce } from 'react-use'; +import { EuiLoadingSpinner } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import * as selectors from '../store/selectors'; +import { EdgeLine } from './edge_line'; +import { GraphControls } from './graph_controls'; +import { ProcessEventDot } from './process_event_dot'; +import { useCamera } from './use_camera'; +import { SymbolDefinitions, useResolverTheme } from './assets'; +import { useStateSyncingActions } from './use_state_syncing_actions'; +import { useResolverQueryParams } from './use_resolver_query_params'; +import { StyledMapContainer, StyledPanel, GraphContainer } from './styles'; +import { entityId } from '../../../common/endpoint/models/event'; +import { SideEffectContext } from './side_effect_context'; +import { ResolverProps } from '../types'; + +/** + * The highest level connected Resolver component. Needs a `Provider` in its ancestry to work. + */ +export const ResolverWithoutProviders = React.memo( + /** + * Use `forwardRef` so that the `Simulator` used in testing can access the top level DOM element. + */ + React.forwardRef(function ( + { className, databaseDocumentID, resolverComponentInstanceID }: ResolverProps, + refToForward + ) { + /** + * This is responsible for dispatching actions that include any external data. + * `databaseDocumentID` + */ + useStateSyncingActions({ databaseDocumentID, resolverComponentInstanceID }); + + const { timestamp } = useContext(SideEffectContext); + + // use this for the entire render in order to keep things in sync + const timeAtRender = timestamp(); + + const { processNodePositions, connectingEdgeLineSegments } = useSelector( + selectors.visibleNodesAndEdgeLines + )(timeAtRender); + const terminatedProcesses = useSelector(selectors.terminatedProcesses); + const { projectionMatrix, ref: cameraRef, onMouseDown } = useCamera(); + + const ref = useCallback( + (element: HTMLDivElement | null) => { + // Supply `useCamera` with the ref + cameraRef(element); + + // If a ref is being forwarded, populate that as well. + if (typeof refToForward === 'function') { + refToForward(element); + } else if (refToForward !== null) { + refToForward.current = element; + } + }, + [cameraRef, refToForward] + ); + const isLoading = useSelector(selectors.isLoading); + const hasError = useSelector(selectors.hasError); + const activeDescendantId = useSelector(selectors.ariaActiveDescendant); + const { colorMap } = useResolverTheme(); + const { cleanUpQueryParams } = useResolverQueryParams(); + + useEffectOnce(() => { + return () => cleanUpQueryParams(); + }); + + return ( + + {isLoading ? ( +
      + +
      + ) : hasError ? ( +
      +
      + {' '} + +
      +
      + ) : ( + + {connectingEdgeLineSegments.map( + ({ points: [startPosition, endPosition], metadata }) => ( + + ) + )} + {[...processNodePositions].map(([processEvent, position]) => { + const processEntityId = entityId(processEvent); + return ( + + ); + })} + + )} + + + +
      + ); + }) +); diff --git a/x-pack/plugins/security_solution/public/resolver/view/side_effect_simulator.ts b/x-pack/plugins/security_solution/public/resolver/view/side_effect_simulator_factory.ts similarity index 95% rename from x-pack/plugins/security_solution/public/resolver/view/side_effect_simulator.ts rename to x-pack/plugins/security_solution/public/resolver/view/side_effect_simulator_factory.ts index 5e9073ba2d3c9..25be222e2fe4a 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/side_effect_simulator.ts +++ b/x-pack/plugins/security_solution/public/resolver/view/side_effect_simulator_factory.ts @@ -11,12 +11,13 @@ import { SideEffectSimulator } from '../types'; * Create mock `SideEffectors` for `SideEffectContext.Provider`. The `control` * object is used to control the mocks. */ -export const sideEffectSimulator: () => SideEffectSimulator = () => { +export const sideEffectSimulatorFactory: () => SideEffectSimulator = () => { // The set of mock `ResizeObserver` instances that currently exist const resizeObserverInstances: Set = new Set(); // A map of `Element`s to their fake `DOMRect`s - const contentRects: Map = new Map(); + // Use a `WeakMap` since elements can be removed from the DOM. + const contentRects: WeakMap = new Map(); /** * Simulate an element's size changing. This will trigger any `ResizeObserverCallback`s which diff --git a/x-pack/plugins/security_solution/public/resolver/view/use_camera.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/use_camera.test.tsx index a27f157bc9364..b32d63283b547 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/use_camera.test.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/use_camera.test.tsx @@ -10,15 +10,16 @@ import { renderHook, act as hooksAct } from '@testing-library/react-hooks'; import { useCamera, useAutoUpdatingClientRect } from './use_camera'; import { Provider } from 'react-redux'; import * as selectors from '../store/selectors'; -import { storeFactory } from '../store'; import { Matrix3, ResolverStore, SideEffectSimulator } from '../types'; import { ResolverEvent } from '../../../common/endpoint/types'; import { SideEffectContext } from './side_effect_context'; import { applyMatrix3 } from '../models/vector2'; -import { sideEffectSimulator } from './side_effect_simulator'; +import { sideEffectSimulatorFactory } from './side_effect_simulator_factory'; import { mockProcessEvent } from '../models/process_event_test_helpers'; import { mock as mockResolverTree } from '../models/resolver_tree'; import { ResolverAction } from '../store/actions'; +import { createStore } from 'redux'; +import { resolverReducer } from '../store/reducer'; describe('useCamera on an unpainted element', () => { let element: HTMLElement; @@ -29,7 +30,7 @@ describe('useCamera on an unpainted element', () => { let simulator: SideEffectSimulator; beforeEach(async () => { - store = storeFactory(); + store = createStore(resolverReducer); const Test = function Test() { const camera = useCamera(); @@ -38,7 +39,7 @@ describe('useCamera on an unpainted element', () => { return
      ; }; - simulator = sideEffectSimulator(); + simulator = sideEffectSimulatorFactory(); reactRenderResult = render( diff --git a/x-pack/plugins/security_solution/public/resolver/view/use_resolver_query_params.ts b/x-pack/plugins/security_solution/public/resolver/view/use_resolver_query_params.ts index 84d954de6ef27..ed514a61d4e06 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/use_resolver_query_params.ts +++ b/x-pack/plugins/security_solution/public/resolver/view/use_resolver_query_params.ts @@ -20,12 +20,12 @@ export function useResolverQueryParams() { const history = useHistory(); const urlSearch = useLocation().search; const resolverComponentInstanceID = useSelector(selectors.resolverComponentInstanceID); - const uniqueCrumbIdKey: string = `resolver-id:${resolverComponentInstanceID}`; - const uniqueCrumbEventKey: string = `resolver-event:${resolverComponentInstanceID}`; + const uniqueCrumbIdKey: string = `resolver-${resolverComponentInstanceID}-id`; + const uniqueCrumbEventKey: string = `resolver-${resolverComponentInstanceID}-event`; const pushToQueryParams = useCallback( (newCrumbs: CrumbInfo) => { - // Construct a new set of params from the current set (minus empty params) - // by assigning the new set of params provided in `newCrumbs` + // Construct a new set of parameters from the current set (minus empty parameters) + // by assigning the new set of parameters provided in `newCrumbs` const crumbsToPass = { ...querystring.parse(urlSearch.slice(1)), [uniqueCrumbIdKey]: newCrumbs.crumbId, From a6a09370625240eb1891613b8b39a18485d7ded3 Mon Sep 17 00:00:00 2001 From: Marshall Main <55718608+marshallmain@users.noreply.github.com> Date: Tue, 28 Jul 2020 21:24:04 -0400 Subject: [PATCH 099/126] [Security Solution] Validate exception list size when adding new items (#73399) * Validate exception list size when adding new items * Update comment * Extract list size validation and apply to endpoint route also Co-authored-by: Elastic Machine --- x-pack/plugins/lists/common/constants.ts | 2 + .../routes/create_endpoint_list_item_route.ts | 15 ++++- .../create_exception_list_item_route.ts | 13 +++++ .../plugins/lists/server/routes/validate.ts | 56 +++++++++++++++++++ .../delete_exception_list_item.ts | 16 ++++++ .../exception_lists/exception_list_client.ts | 15 ++++- .../exception_list_client_types.ts | 6 ++ .../lib/detection_engine/signals/utils.ts | 3 +- 8 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 x-pack/plugins/lists/server/routes/validate.ts diff --git a/x-pack/plugins/lists/common/constants.ts b/x-pack/plugins/lists/common/constants.ts index df16085b53405..6c73dc1656302 100644 --- a/x-pack/plugins/lists/common/constants.ts +++ b/x-pack/plugins/lists/common/constants.ts @@ -48,3 +48,5 @@ export const ENDPOINT_LIST_NAME = 'Elastic Endpoint Security Exception List'; /** The description of the single global space agnostic endpoint list */ export const ENDPOINT_LIST_DESCRIPTION = 'Elastic Endpoint Security Exception List'; + +export const MAX_EXCEPTION_LIST_SIZE = 10000; diff --git a/x-pack/plugins/lists/server/routes/create_endpoint_list_item_route.ts b/x-pack/plugins/lists/server/routes/create_endpoint_list_item_route.ts index 5ff2a9d9df9f4..22aa1fb59858b 100644 --- a/x-pack/plugins/lists/server/routes/create_endpoint_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/create_endpoint_list_item_route.ts @@ -6,7 +6,7 @@ import { IRouter } from 'kibana/server'; -import { ENDPOINT_LIST_ITEM_URL } from '../../common/constants'; +import { ENDPOINT_LIST_ID, ENDPOINT_LIST_ITEM_URL } from '../../common/constants'; import { buildRouteValidation, buildSiemResponse, transformError } from '../siem_server_deps'; import { validate } from '../../common/siem_common_deps'; import { @@ -16,6 +16,7 @@ import { } from '../../common/schemas'; import { getExceptionListClient } from './utils/get_exception_list_client'; +import { validateExceptionListSize } from './validate'; export const createEndpointListItemRoute = (router: IRouter): void => { router.post( @@ -71,6 +72,18 @@ export const createEndpointListItemRoute = (router: IRouter): void => { if (errors != null) { return siemResponse.error({ body: errors, statusCode: 500 }); } else { + const listSizeError = await validateExceptionListSize( + exceptionLists, + ENDPOINT_LIST_ID, + 'agnostic' + ); + if (listSizeError != null) { + await exceptionLists.deleteExceptionListItemById({ + id: createdList.id, + namespaceType: 'agnostic', + }); + return siemResponse.error(listSizeError); + } return response.ok({ body: validated ?? {} }); } } diff --git a/x-pack/plugins/lists/server/routes/create_exception_list_item_route.ts b/x-pack/plugins/lists/server/routes/create_exception_list_item_route.ts index e4885c7393bd4..ed58621dae973 100644 --- a/x-pack/plugins/lists/server/routes/create_exception_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/create_exception_list_item_route.ts @@ -17,6 +17,7 @@ import { import { getExceptionListClient } from './utils/get_exception_list_client'; import { endpointDisallowedFields } from './endpoint_disallowed_fields'; +import { validateExceptionListSize } from './validate'; export const createExceptionListItemRoute = (router: IRouter): void => { router.post( @@ -104,6 +105,18 @@ export const createExceptionListItemRoute = (router: IRouter): void => { if (errors != null) { return siemResponse.error({ body: errors, statusCode: 500 }); } else { + const listSizeError = await validateExceptionListSize( + exceptionLists, + listId, + namespaceType + ); + if (listSizeError != null) { + await exceptionLists.deleteExceptionListItemById({ + id: createdList.id, + namespaceType, + }); + return siemResponse.error(listSizeError); + } return response.ok({ body: validated ?? {} }); } } diff --git a/x-pack/plugins/lists/server/routes/validate.ts b/x-pack/plugins/lists/server/routes/validate.ts new file mode 100644 index 0000000000000..bbd4b0eaf0e33 --- /dev/null +++ b/x-pack/plugins/lists/server/routes/validate.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ExceptionListClient } from '../services/exception_lists/exception_list_client'; +import { MAX_EXCEPTION_LIST_SIZE } from '../../common/constants'; +import { foundExceptionListItemSchema } from '../../common/schemas'; +import { NamespaceType } from '../../common/schemas/types'; +import { validate } from '../../common/siem_common_deps'; + +export const validateExceptionListSize = async ( + exceptionLists: ExceptionListClient, + listId: string, + namespaceType: NamespaceType +): Promise<{ body: string; statusCode: number } | null> => { + const exceptionListItems = await exceptionLists.findExceptionListItem({ + filter: undefined, + listId, + namespaceType, + page: undefined, + perPage: undefined, + sortField: undefined, + sortOrder: undefined, + }); + if (exceptionListItems == null) { + // If exceptionListItems is null then we couldn't find the list so it may have been deleted + return { + body: `Unable to find list id: ${listId} to verify max exception list size`, + statusCode: 500, + }; + } + const [validatedItems, err] = validate(exceptionListItems, foundExceptionListItemSchema); + if (err != null) { + return { + body: err, + statusCode: 500, + }; + } + // Unnecessary since validatedItems comes from exceptionListItems which is already + // checked for null, but typescript fails to detect that + if (validatedItems == null) { + return { + body: `Unable to find list id: ${listId} to verify max exception list size`, + statusCode: 500, + }; + } + if (validatedItems.total > MAX_EXCEPTION_LIST_SIZE) { + return { + body: `Failed to add exception item, exception list would exceed max size of ${MAX_EXCEPTION_LIST_SIZE}`, + statusCode: 400, + }; + } + return null; +}; diff --git a/x-pack/plugins/lists/server/services/exception_lists/delete_exception_list_item.ts b/x-pack/plugins/lists/server/services/exception_lists/delete_exception_list_item.ts index 8dce1f1f79e35..ee85cf36a48b5 100644 --- a/x-pack/plugins/lists/server/services/exception_lists/delete_exception_list_item.ts +++ b/x-pack/plugins/lists/server/services/exception_lists/delete_exception_list_item.ts @@ -8,6 +8,7 @@ import { SavedObjectsClientContract } from 'kibana/server'; import { ExceptionListItemSchema, + Id, IdOrUndefined, ItemIdOrUndefined, NamespaceType, @@ -23,6 +24,12 @@ interface DeleteExceptionListItemOptions { savedObjectsClient: SavedObjectsClientContract; } +interface DeleteExceptionListItemByIdOptions { + id: Id; + namespaceType: NamespaceType; + savedObjectsClient: SavedObjectsClientContract; +} + export const deleteExceptionListItem = async ({ itemId, id, @@ -43,3 +50,12 @@ export const deleteExceptionListItem = async ({ return exceptionListItem; } }; + +export const deleteExceptionListItemById = async ({ + id, + namespaceType, + savedObjectsClient, +}: DeleteExceptionListItemByIdOptions): Promise => { + const savedObjectType = getSavedObjectType({ namespaceType }); + await savedObjectsClient.delete(savedObjectType, id); +}; diff --git a/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts b/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts index 11302e64b3538..83b44ababf9de 100644 --- a/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts +++ b/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts @@ -20,6 +20,7 @@ import { CreateExceptionListItemOptions, CreateExceptionListOptions, DeleteEndpointListItemOptions, + DeleteExceptionListItemByIdOptions, DeleteExceptionListItemOptions, DeleteExceptionListOptions, FindEndpointListItemOptions, @@ -40,7 +41,7 @@ import { createExceptionListItem } from './create_exception_list_item'; import { updateExceptionList } from './update_exception_list'; import { updateExceptionListItem } from './update_exception_list_item'; import { deleteExceptionList } from './delete_exception_list'; -import { deleteExceptionListItem } from './delete_exception_list_item'; +import { deleteExceptionListItem, deleteExceptionListItemById } from './delete_exception_list_item'; import { findExceptionListItem } from './find_exception_list_item'; import { findExceptionList } from './find_exception_list'; import { findExceptionListsItem } from './find_exception_list_items'; @@ -326,6 +327,18 @@ export class ExceptionListClient { }); }; + public deleteExceptionListItemById = async ({ + id, + namespaceType, + }: DeleteExceptionListItemByIdOptions): Promise => { + const { savedObjectsClient } = this; + return deleteExceptionListItemById({ + id, + namespaceType, + savedObjectsClient, + }); + }; + /** * This is the same as "deleteExceptionListItem" except it applies specifically to the endpoint list. */ diff --git a/x-pack/plugins/lists/server/services/exception_lists/exception_list_client_types.ts b/x-pack/plugins/lists/server/services/exception_lists/exception_list_client_types.ts index 555b9c5e95a77..963716b55ea77 100644 --- a/x-pack/plugins/lists/server/services/exception_lists/exception_list_client_types.ts +++ b/x-pack/plugins/lists/server/services/exception_lists/exception_list_client_types.ts @@ -19,6 +19,7 @@ import { ExceptionListType, ExceptionListTypeOrUndefined, FilterOrUndefined, + Id, IdOrUndefined, Immutable, ItemId, @@ -93,6 +94,11 @@ export interface DeleteExceptionListItemOptions { namespaceType: NamespaceType; } +export interface DeleteExceptionListItemByIdOptions { + id: Id; + namespaceType: NamespaceType; +} + export interface DeleteEndpointListItemOptions { id: IdOrUndefined; itemId: ItemIdOrUndefined; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts index 90373ee676121..ae4274f31e145 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts @@ -15,6 +15,7 @@ import { ListArrayOrUndefined } from '../../../../common/detection_engine/schema import { BulkResponse, BulkResponseErrorAggregation, isValidUnit } from './types'; import { BuildRuleMessage } from './rule_messages'; import { hasLargeValueList } from '../../../../common/detection_engine/utils'; +import { MAX_EXCEPTION_LIST_SIZE } from '../../../../../lists/common/constants'; interface SortExceptionsReturn { exceptionsWithValueLists: ExceptionListItemSchema[]; @@ -183,7 +184,7 @@ export const getExceptions = async ({ listId: foundList.list_id, namespaceType, page: 1, - perPage: 10000, + perPage: MAX_EXCEPTION_LIST_SIZE, filter: undefined, sortOrder: undefined, sortField: undefined, From 9c08978cc9861263178a54a757cf1e008e6f3afb Mon Sep 17 00:00:00 2001 From: Robert Austin Date: Tue, 28 Jul 2020 21:48:38 -0400 Subject: [PATCH 100/126] [Resolver] Remove useless check that breaks when tree has no nodes (#73583) --- .../resolver/store/data/selectors.test.ts | 23 ++++++++++++++ .../public/resolver/store/data/selectors.ts | 6 ++-- .../resolver/store/mocks/resolver_tree.ts | 30 +++++++++++++++++++ 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.test.ts b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.test.ts index 0826391a10688..6786a93f1d9ca 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.test.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.test.ts @@ -14,6 +14,7 @@ import { mockTreeWith2AncestorsAndNoChildren, mockTreeWith1AncestorAnd2ChildrenAndAllNodesHave2GraphableEvents, mockTreeWithAllProcessesTerminated, + mockTreeWithNoProcessEvents, } from '../mocks/resolver_tree'; import { uniquePidForProcess } from '../../models/process_event'; import { EndpointEvent } from '../../../../common/endpoint/types'; @@ -408,4 +409,26 @@ describe('data state', () => { expect(selectors.graphableProcesses(state()).length).toBe(4); }); }); + describe('with a tree with no process events', () => { + beforeEach(() => { + const tree = mockTreeWithNoProcessEvents(); + actions.push({ + type: 'serverReturnedResolverData', + payload: { + result: tree, + // this value doesn't matter + databaseDocumentID: '', + }, + }); + }); + it('should return an empty layout', () => { + expect(selectors.layout(state())).toMatchInlineSnapshot(` + Object { + "ariaLevels": Map {}, + "edgeLineSegments": Array [], + "processNodePositions": Map {}, + } + `); + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts index ea0cb8663d11d..10ace895b3267 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts @@ -374,9 +374,9 @@ export const layout = createSelector( // find the origin node const originNode = indexedProcessTreeModel.processEvent(indexedProcessTree, originID); - if (!originNode) { - // this should only happen if the `ResolverTree` from the server has an entity ID with no matching lifecycle events. - throw new Error('Origin node not found in ResolverTree'); + if (originNode === null) { + // If a tree is returned that has no process events for the origin, this can happen. + return taxiLayout; } // Find the position of the origin, we'll center the map on it intrinsically diff --git a/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts b/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts index ae43955f4c47c..6a8ab61ccf9b6 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts @@ -226,3 +226,33 @@ export function mockTreeWith1AncestorAnd2ChildrenAndAllNodesHave2GraphableEvents lifecycle: [origin, originClone], } as unknown) as ResolverTree; } + +export function mockTreeWithNoProcessEvents(): ResolverTree { + return { + entityID: 'entityID', + children: { + childNodes: [], + nextChild: null, + }, + relatedEvents: { + events: [], + nextEvent: null, + }, + relatedAlerts: { + alerts: [], + nextAlert: null, + }, + lifecycle: [], + ancestry: { + ancestors: [], + nextAncestor: null, + }, + stats: { + totalAlerts: 0, + events: { + total: 0, + byCategory: {}, + }, + }, + }; +} From e105bc514d5040a8d8980abd497d64ae51d42e46 Mon Sep 17 00:00:00 2001 From: spalger Date: Tue, 28 Jul 2020 18:53:31 -0700 Subject: [PATCH 101/126] skip flaky suite (#72339) --- .../cypress/integration/timeline_local_storage.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/timeline_local_storage.spec.ts b/x-pack/plugins/security_solution/cypress/integration/timeline_local_storage.spec.ts index 383ebe2220585..2fb265c55e3ad 100644 --- a/x-pack/plugins/security_solution/cypress/integration/timeline_local_storage.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/timeline_local_storage.spec.ts @@ -13,7 +13,8 @@ import { TABLE_COLUMN_EVENTS_MESSAGE } from '../screens/hosts/external_events'; import { waitsForEventsToBeLoaded, openEventsViewerFieldsBrowser } from '../tasks/hosts/events'; import { removeColumn, resetFields } from '../tasks/timeline'; -describe('persistent timeline', () => { +// FLAKY: https://github.com/elastic/kibana/issues/72339 +describe.skip('persistent timeline', () => { before(() => { loginAndWaitForPage(HOSTS_URL); openEvents(); From a0366aa32b1e3c7d50728fb5a585522b2e67c591 Mon Sep 17 00:00:00 2001 From: Davis Plumlee <56367316+dplumlee@users.noreply.github.com> Date: Tue, 28 Jul 2020 22:36:18 -0400 Subject: [PATCH 102/126] [Security Solution][Detections] Exception Modal UI improvements (#73546) --- .../exceptions/add_exception_modal/index.tsx | 22 ++++++++++------- .../add_exception_modal/translations.ts | 12 ++++++++-- .../exceptions/builder/builder_entry_item.tsx | 1 + .../exceptions/edit_exception_modal/index.tsx | 24 ++++++++++++------- .../edit_exception_modal/translations.ts | 12 ++++++++-- .../exceptions/exceptionable_fields.json | 20 ++++++++++++++++ .../common/components/exceptions/helpers.tsx | 2 +- 7 files changed, 70 insertions(+), 23 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.tsx index 0f7e5b24ed8f9..c15cad53229ae 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.tsx @@ -67,7 +67,8 @@ export interface AddExceptionModalProps extends AddExceptionModalBaseProps { const Modal = styled(EuiModal)` ${({ theme }) => css` - width: ${theme.eui.euiBreakpoints.m}; + width: ${theme.eui.euiBreakpoints.l}; + max-width: ${theme.eui.euiBreakpoints.l}; `} `; @@ -285,7 +286,9 @@ export const AddExceptionModal = memo(function AddExceptionModal({ - {i18n.ADD_EXCEPTION} + + {exceptionListType === 'endpoint' ? i18n.ADD_ENDPOINT_EXCEPTION : i18n.ADD_EXCEPTION} + {ruleName} @@ -330,13 +333,6 @@ export const AddExceptionModal = memo(function AddExceptionModal({ - {exceptionListType === 'endpoint' && ( - <> - {i18n.ENDPOINT_QUARANTINE_TEXT} - - - )} - + {exceptionListType === 'endpoint' && ( + <> + + + {i18n.ENDPOINT_QUARANTINE_TEXT} + + + )} )} diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/translations.ts b/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/translations.ts index 81db1b10f7021..abc296e9c0e1a 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/translations.ts @@ -17,6 +17,13 @@ export const ADD_EXCEPTION = i18n.translate( } ); +export const ADD_ENDPOINT_EXCEPTION = i18n.translate( + 'xpack.securitySolution.exceptions.addException.addEndpointException', + { + defaultMessage: 'Add Endpoint Exception', + } +); + export const ADD_EXCEPTION_ERROR = i18n.translate( 'xpack.securitySolution.exceptions.addException.error', { @@ -49,14 +56,15 @@ export const ENDPOINT_QUARANTINE_TEXT = i18n.translate( 'xpack.securitySolution.exceptions.addException.endpointQuarantineText', { defaultMessage: - 'Any file in quarantine on any endpoint that matches the attribute(s) selected will automatically be restored to its original location', + 'Any file in quarantine on any endpoint that matches the attribute(s) selected will automatically be restored to its original location. This exception will apply to any rule that is linked to the Global Endpoint Exception List.', } ); export const BULK_CLOSE_LABEL = i18n.translate( 'xpack.securitySolution.exceptions.addException.bulkCloseLabel', { - defaultMessage: 'Close all alerts that match attributes in this exception', + defaultMessage: + 'Close all alerts that match this exception, including alerts generated by other rules', } ); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/builder_entry_item.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/builder_entry_item.tsx index dcc8a0e4fb1ba..5939a5a1b576e 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/builder_entry_item.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/builder_entry_item.tsx @@ -110,6 +110,7 @@ export const BuilderEntryItem: React.FC = ({ isDisabled={indexPattern == null} onChange={handleFieldChange} data-test-subj="exceptionBuilderEntryField" + fieldInputWidth={275} /> ); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/index.tsx index 7ae4fe4ea7970..341d2f2bab37a 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/index.tsx @@ -54,7 +54,8 @@ interface EditExceptionModalProps { const Modal = styled(EuiModal)` ${({ theme }) => css` - width: ${theme.eui.euiBreakpoints.m}; + width: ${theme.eui.euiBreakpoints.l}; + max-width: ${theme.eui.euiBreakpoints.l}; `} `; @@ -211,7 +212,11 @@ export const EditExceptionModal = memo(function EditExceptionModal({ - {i18n.EDIT_EXCEPTION_TITLE} + + {exceptionListType === 'endpoint' + ? i18n.EDIT_ENDPOINT_EXCEPTION_TITLE + : i18n.EDIT_EXCEPTION_TITLE} + {ruleName} @@ -243,13 +248,6 @@ export const EditExceptionModal = memo(function EditExceptionModal({ - {exceptionListType === 'endpoint' && ( - <> - {i18n.ENDPOINT_QUARANTINE_TEXT} - - - )} - + {exceptionListType === 'endpoint' && ( + <> + + + {i18n.ENDPOINT_QUARANTINE_TEXT} + + + )} )} diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/translations.ts b/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/translations.ts index d09f0158b2e1d..c5b6fc8a6a9ae 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/translations.ts @@ -24,6 +24,13 @@ export const EDIT_EXCEPTION_TITLE = i18n.translate( } ); +export const EDIT_ENDPOINT_EXCEPTION_TITLE = i18n.translate( + 'xpack.securitySolution.exceptions.editException.editEndpointExceptionTitle', + { + defaultMessage: 'Edit Endpoint Exception', + } +); + export const EDIT_EXCEPTION_ERROR = i18n.translate( 'xpack.securitySolution.exceptions.editException.error', { @@ -41,7 +48,8 @@ export const EDIT_EXCEPTION_SUCCESS = i18n.translate( export const BULK_CLOSE_LABEL = i18n.translate( 'xpack.securitySolution.exceptions.editException.bulkCloseLabel', { - defaultMessage: 'Close all alerts that match attributes in this exception', + defaultMessage: + 'Close all alerts that match this exception, including alerts generated by other rules', } ); @@ -57,7 +65,7 @@ export const ENDPOINT_QUARANTINE_TEXT = i18n.translate( 'xpack.securitySolution.exceptions.editException.endpointQuarantineText', { defaultMessage: - 'Any file in quarantine on any endpoint that matches the attribute(s) selected will automatically be restored to its original location', + 'Any file in quarantine on any endpoint that matches the attribute(s) selected will automatically be restored to its original location. This exception will apply to any rule that is linked to the Global Endpoint Exception List.', } ); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/exceptionable_fields.json b/x-pack/plugins/security_solution/public/common/components/exceptions/exceptionable_fields.json index 18257b0de0a17..fdf0ea60ecf6a 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/exceptionable_fields.json +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/exceptionable_fields.json @@ -7,25 +7,32 @@ "Target.process.Ext.services", "Target.process.Ext.user", "Target.process.command_line", + "Target.process.command_line.text", "Target.process.executable", + "Target.process.executable.text", "Target.process.hash.md5", "Target.process.hash.sha1", "Target.process.hash.sha256", "Target.process.hash.sha512", "Target.process.name", + "Target.process.name.text", "Target.process.parent.Ext.code_signature.status", "Target.process.parent.Ext.code_signature.subject_name", "Target.process.parent.Ext.code_signature.trusted", "Target.process.parent.Ext.code_signature.valid", "Target.process.parent.command_line", + "Target.process.parent.command_line.text", "Target.process.parent.executable", + "Target.process.parent.executable.text", "Target.process.parent.hash.md5", "Target.process.parent.hash.sha1", "Target.process.parent.hash.sha256", "Target.process.parent.hash.sha512", "Target.process.parent.name", + "Target.process.parent.name.text", "Target.process.parent.pgid", "Target.process.parent.working_directory", + "Target.process.parent.working_directory.text", "Target.process.pe.company", "Target.process.pe.description", "Target.process.pe.file_version", @@ -33,6 +40,7 @@ "Target.process.pe.product", "Target.process.pgid", "Target.process.working_directory", + "Target.process.working_directory.text", "agent.id", "agent.type", "agent.version", @@ -67,6 +75,7 @@ "file.name", "file.owner", "file.path", + "file.path.text", "file.pe.company", "file.pe.description", "file.pe.file_version", @@ -74,6 +83,7 @@ "file.pe.product", "file.size", "file.target_path", + "file.target_path.text", "file.type", "file.uid", "group.Ext.real.id", @@ -85,8 +95,10 @@ "host.os.Ext.variant", "host.os.family", "host.os.full", + "host.os.full.text", "host.os.kernel", "host.os.name", + "host.os.name.text", "host.os.platform", "host.os.version", "host.type", @@ -97,25 +109,32 @@ "process.Ext.services", "process.Ext.user", "process.command_line", + "process.command_line.text", "process.executable", + "process.executable.text", "process.hash.md5", "process.hash.sha1", "process.hash.sha256", "process.hash.sha512", "process.name", + "process.name.text", "process.parent.Ext.code_signature.status", "process.parent.Ext.code_signature.subject_name", "process.parent.Ext.code_signature.trusted", "process.parent.Ext.code_signature.valid", "process.parent.command_line", + "process.parent.command_line.text", "process.parent.executable", + "process.parent.executable.text", "process.parent.hash.md5", "process.parent.hash.sha1", "process.parent.hash.sha256", "process.parent.hash.sha512", "process.parent.name", + "process.parent.name.text", "process.parent.pgid", "process.parent.working_directory", + "process.parent.working_directory.text", "process.pe.company", "process.pe.description", "process.pe.file_version", @@ -123,5 +142,6 @@ "process.pe.product", "process.pgid", "process.working_directory", + "process.working_directory.text", "rule.uuid" ] \ No newline at end of file diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx index ee45f9b5de1fa..3abb788312ff4 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx @@ -440,7 +440,7 @@ export const defaultEndpointExceptionItems = ( ], }, { - field: 'file.path', + field: 'file.path.text', operator: 'included', type: 'match', value: filePath ?? '', From 3cc2293836fe0d48374c351e9dfaf9828f1bc94c Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 28 Jul 2020 21:38:47 -0500 Subject: [PATCH 103/126] [Security Solution][Detections] Adds additional context to the "needs index permissions" prompt (#73547) * Adds conditional context to the "needs index permissions" prompt In an effort to assist the user in their configuration, this adds additional context to this configuration prompt. We now distinguish which indexes need configuration: signals, lists, or both. * Use latin pluralization consistently * Rename component file to be more accurate * Refactor message construction to separate function * Remove unused translations Co-authored-by: Elastic Machine --- .../detection_engine/detection_engine.tsx | 7 +++-- ...tsx => detection_engine_no_index.test.tsx} | 6 ++-- ...ndex.tsx => detection_engine_no_index.tsx} | 24 +++++++++++++--- .../pages/detection_engine/translations.ts | 28 ++++++++++++++++--- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 6 files changed, 53 insertions(+), 14 deletions(-) rename x-pack/plugins/security_solution/public/detections/pages/detection_engine/{detection_engine_no_signal_index.test.tsx => detection_engine_no_index.test.tsx} (72%) rename x-pack/plugins/security_solution/public/detections/pages/detection_engine/{detection_engine_no_signal_index.tsx => detection_engine_no_index.tsx} (54%) diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx index 8385fcc71682d..c114e4519df10 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx @@ -36,7 +36,7 @@ import { alertsHistogramOptions } from '../../components/alerts_histogram_panel/ import { useUserInfo } from '../../components/user_info'; import { EVENTS_VIEWER_HEADER_HEIGHT } from '../../../common/components/events_viewer/events_viewer'; import { OverviewEmpty } from '../../../overview/components/overview_empty'; -import { DetectionEngineNoIndex } from './detection_engine_no_signal_index'; +import { DetectionEngineNoIndex } from './detection_engine_no_index'; import { DetectionEngineHeaderPage } from '../../components/detection_engine_header_page'; import { useListsConfig } from '../../containers/detection_engine/lists/use_lists_config'; import { DetectionEngineUserUnauthenticated } from './detection_engine_user_unauthenticated'; @@ -144,7 +144,10 @@ export const DetectionEnginePageComponent: React.FC = ({ return ( - + ); } diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_signal_index.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_index.test.tsx similarity index 72% rename from x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_signal_index.test.tsx rename to x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_index.test.tsx index 34d55908c9ba1..82d8ee9c63862 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_signal_index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_index.test.tsx @@ -7,12 +7,14 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { DetectionEngineNoIndex } from './detection_engine_no_signal_index'; +import { DetectionEngineNoIndex } from './detection_engine_no_index'; jest.mock('../../../common/lib/kibana'); describe('DetectionEngineNoIndex', () => { it('renders correctly', () => { - const wrapper = shallow(); + const wrapper = shallow( + + ); expect(wrapper.find('EmptyPage')).toHaveLength(1); }); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_signal_index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_index.tsx similarity index 54% rename from x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_signal_index.tsx rename to x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_index.tsx index c315361b294c7..648a9405606ef 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_signal_index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine_no_index.tsx @@ -10,7 +10,22 @@ import { EmptyPage } from '../../../common/components/empty_page'; import * as i18n from './translations'; import { useKibana } from '../../../common/lib/kibana'; -export const DetectionEngineNoIndex = React.memo(() => { +const buildMessage = (needsListsIndex: boolean, needsSignalsIndex: boolean): string => { + if (needsSignalsIndex && needsListsIndex) { + return i18n.NEEDS_INDEX_PERMISSIONS(i18n.NEEDS_SIGNALS_AND_LISTS_INDEXES); + } else if (needsSignalsIndex) { + return i18n.NEEDS_INDEX_PERMISSIONS(i18n.NEEDS_SIGNALS_INDEX); + } else if (needsListsIndex) { + return i18n.NEEDS_INDEX_PERMISSIONS(i18n.NEEDS_LISTS_INDEXES); + } else { + return i18n.NEEDS_INDEX_PERMISSIONS(''); + } +}; + +const DetectionEngineNoIndexComponent: React.FC<{ + needsListsIndex: boolean; + needsSignalsIndex: boolean; +}> = ({ needsListsIndex, needsSignalsIndex }) => { const docLinks = useKibana().services.docLinks; const actions = useMemo( () => ({ @@ -23,15 +38,16 @@ export const DetectionEngineNoIndex = React.memo(() => { }), [docLinks] ); + const message = buildMessage(needsListsIndex, needsSignalsIndex); return ( ); -}); +}; -DetectionEngineNoIndex.displayName = 'DetectionEngineNoIndex'; +export const DetectionEngineNoIndex = React.memo(DetectionEngineNoIndexComponent); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/translations.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/translations.ts index d8b2930b77f0f..dd86d9fd2dfc6 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/translations.ts @@ -79,14 +79,34 @@ export const NO_INDEX_TITLE = i18n.translate( } ); -export const NO_INDEX_MSG_BODY = i18n.translate( - 'xpack.securitySolution.detectionEngine.noIndexMsgBody', +export const NEEDS_SIGNALS_AND_LISTS_INDEXES = i18n.translate( + 'xpack.securitySolution.detectionEngine.needsSignalsAndListsIndexesMessage', { - defaultMessage: - 'To use the detection engine, a user with the required cluster and index privileges must first access this page. For more help, contact your administrator.', + defaultMessage: 'You need permissions for the signals and lists indices.', + } +); + +export const NEEDS_SIGNALS_INDEX = i18n.translate( + 'xpack.securitySolution.detectionEngine.needsSignalsIndexMessage', + { + defaultMessage: 'You need permissions for the signals index.', + } +); + +export const NEEDS_LISTS_INDEXES = i18n.translate( + 'xpack.securitySolution.detectionEngine.needsListsIndexesMessage', + { + defaultMessage: 'You need permissions for the lists indices.', } ); +export const NEEDS_INDEX_PERMISSIONS = (additionalContext: string) => + i18n.translate('xpack.securitySolution.detectionEngine.needsIndexPermissionsMessage', { + values: { additionalContext }, + defaultMessage: + 'To use the detection engine, a user with the required cluster and index privileges must first access this page. {additionalContext} For more help, contact your Elastic Stack administrator.', + }); + export const GO_TO_DOCUMENTATION = i18n.translate( 'xpack.securitySolution.detectionEngine.goToDocumentationButton', { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 8fbcb3f1122cc..a87e92bb33d50 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -13865,7 +13865,6 @@ "xpack.securitySolution.detectionEngine.mlUnavailableTitle": "{totalRules} {totalRules, plural, =1 {個のルール} other {個のルール}}で機械学習を有効にする必要があります。", "xpack.securitySolution.detectionEngine.noApiIntegrationKeyCallOutMsg": "Kibanaを起動するごとに保存されたオブジェクトの新しい暗号化キーを作成します。永続キーがないと、Kibanaの再起動後にルールを削除または修正することができません。永続キーを設定するには、kibana.ymlファイルに32文字以上のテキスト値を付けてxpack.encryptedSavedObjects.encryptionKey設定を追加してください。", "xpack.securitySolution.detectionEngine.noApiIntegrationKeyCallOutTitle": "API統合キーが必要です", - "xpack.securitySolution.detectionEngine.noIndexMsgBody": "検出エンジンを使用するには、必要なクラスターとインデックス権限のユーザーが最初にこのページにアクセスする必要があります。ヘルプについては、管理者にお問い合わせください。", "xpack.securitySolution.detectionEngine.noIndexTitle": "検出エンジンを設定しましょう", "xpack.securitySolution.detectionEngine.pageTitle": "検出エンジン", "xpack.securitySolution.detectionEngine.panelSubtitleShowing": "表示中", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index b69763449a06f..250bf78fe8db2 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -13871,7 +13871,6 @@ "xpack.securitySolution.detectionEngine.mlUnavailableTitle": "{totalRules} 个 {totalRules, plural, =1 {规则需要} other {规则需要}}启用 Machine Learning。", "xpack.securitySolution.detectionEngine.noApiIntegrationKeyCallOutMsg": "每次启动 Kibana,都会为已保存对象生成新的加密密钥。没有持久性密钥,在 Kibana 重新启动后,将无法删除或修改规则。要设置持久性密钥,请将文本值为 32 个或更多任意字符的 xpack.encryptedSavedObjects.encryptionKey 设置添加到 kibana.yml 文件。", "xpack.securitySolution.detectionEngine.noApiIntegrationKeyCallOutTitle": "需要 API 集成密钥", - "xpack.securitySolution.detectionEngine.noIndexMsgBody": "要使用检测引擎,具有所需集群和索引权限的用户必须首先访问此页面。若需要更多帮助,请联系您的管理员。", "xpack.securitySolution.detectionEngine.noIndexTitle": "让我们来设置您的检测引擎", "xpack.securitySolution.detectionEngine.pageTitle": "检测引擎", "xpack.securitySolution.detectionEngine.panelSubtitleShowing": "正在显示", From 5a049098197b3de121aaf404aa10064b4127a631 Mon Sep 17 00:00:00 2001 From: Madison Caldwell Date: Tue, 28 Jul 2020 22:43:40 -0400 Subject: [PATCH 104/126] [Security Solution][Exceptions] Use semantic version for manifest version + Scaling Tweaks (#73388) * Manifest version is semantic version * Configurable task interval * Use task interval over scheduled when provided * Fix crash on download of large artifact * Don't need to generate linux artifacts * Configurable artifact validation * Test fixes * Test fixes * Type/test fixes * Final tweaks * Remove linux endpoint exception generation from UI * Fix paging so that we stop before 10k * Fix pagination * Fix pagination test Co-authored-by: Elastic Machine --- .../common/endpoint/generate_data.ts | 2 +- .../common/endpoint/schema/common.ts | 5 +- .../common/endpoint/schema/manifest.ts | 4 +- .../exceptions/add_exception_modal/index.tsx | 2 +- .../security_solution/server/config.ts | 6 ++ .../server/endpoint/config.ts | 6 ++ .../endpoint/ingest_integration.test.ts | 25 +---- .../server/endpoint/ingest_integration.ts | 10 +- .../server/endpoint/lib/artifacts/common.ts | 4 +- .../endpoint/lib/artifacts/lists.test.ts | 12 ++- .../server/endpoint/lib/artifacts/lists.ts | 9 +- .../endpoint/lib/artifacts/manifest.test.ts | 49 +++------ .../server/endpoint/lib/artifacts/manifest.ts | 100 +++++++----------- .../server/endpoint/lib/artifacts/mocks.ts | 32 ++---- .../lib/artifacts/saved_object_mappings.ts | 8 +- .../endpoint/lib/artifacts/task.test.ts | 2 +- .../server/endpoint/lib/artifacts/task.ts | 31 ++++-- .../artifacts/download_exception_list.ts | 10 +- .../endpoint/schemas/artifacts/manifest.ts | 23 ++++ .../schemas/artifacts/saved_objects.mock.ts | 2 + .../schemas/artifacts/saved_objects.ts | 4 + .../services/artifacts/manifest_client.ts | 1 - .../manifest_manager/manifest_manager.test.ts | 82 ++++---------- .../manifest_manager/manifest_manager.ts | 62 +++++------ .../routes/__mocks__/index.ts | 2 + .../endpoint/artifacts/api_feature/data.json | 28 +---- .../apps/endpoint/policy_details.ts | 12 --- .../apis/artifacts/index.ts | 78 ++++++++++++-- 28 files changed, 284 insertions(+), 327 deletions(-) create mode 100644 x-pack/plugins/security_solution/server/endpoint/schemas/artifacts/manifest.ts diff --git a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts index 97ac5c9030a3d..9a92270fc9c14 100644 --- a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts +++ b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts @@ -1041,7 +1041,7 @@ export class EndpointDocGenerator { config: { artifact_manifest: { value: { - manifest_version: 'WzAsMF0=', + manifest_version: '1.0.0', schema_version: 'v1', artifacts: {}, }, diff --git a/x-pack/plugins/security_solution/common/endpoint/schema/common.ts b/x-pack/plugins/security_solution/common/endpoint/schema/common.ts index 8f2ea1f8a6452..1c910927a7afa 100644 --- a/x-pack/plugins/security_solution/common/endpoint/schema/common.ts +++ b/x-pack/plugins/security_solution/common/endpoint/schema/common.ts @@ -23,8 +23,6 @@ export const encryptionAlgorithm = t.keyof({ export const identifier = t.string; -export const manifestVersion = t.string; - export const manifestSchemaVersion = t.keyof({ v1: null, }); @@ -34,4 +32,7 @@ export const relativeUrl = t.string; export const sha256 = t.string; +export const semanticVersion = t.string; +export type SemanticVersion = t.TypeOf; + export const size = t.number; diff --git a/x-pack/plugins/security_solution/common/endpoint/schema/manifest.ts b/x-pack/plugins/security_solution/common/endpoint/schema/manifest.ts index f8bb8b70f2d5b..f03db881837d5 100644 --- a/x-pack/plugins/security_solution/common/endpoint/schema/manifest.ts +++ b/x-pack/plugins/security_solution/common/endpoint/schema/manifest.ts @@ -11,9 +11,9 @@ import { encryptionAlgorithm, identifier, manifestSchemaVersion, - manifestVersion, relativeUrl, sha256, + semanticVersion, size, } from './common'; @@ -50,7 +50,7 @@ export type ManifestEntryDispatchSchema = t.TypeOf { - const osDefaults = ['windows', 'macos', 'linux']; + const osDefaults = ['windows', 'macos']; if (alertData) { const osTypes = getMappedNonEcsValue({ data: alertData.nonEcsData, diff --git a/x-pack/plugins/security_solution/server/config.ts b/x-pack/plugins/security_solution/server/config.ts index f7d961ae3ec5c..e2c06ae9f931f 100644 --- a/x-pack/plugins/security_solution/server/config.ts +++ b/x-pack/plugins/security_solution/server/config.ts @@ -29,6 +29,12 @@ export const configSchema = schema.object({ from: schema.string({ defaultValue: 'now-15m' }), to: schema.string({ defaultValue: 'now' }), }), + + /** + * Artifacts Configuration + */ + packagerTaskInterval: schema.string({ defaultValue: '60s' }), + validateArtifactDownloads: schema.boolean({ defaultValue: true }), }); export const createConfig$ = (context: PluginInitializerContext) => diff --git a/x-pack/plugins/security_solution/server/endpoint/config.ts b/x-pack/plugins/security_solution/server/endpoint/config.ts index 908e14468c5c7..6a3644f7aaf71 100644 --- a/x-pack/plugins/security_solution/server/endpoint/config.ts +++ b/x-pack/plugins/security_solution/server/endpoint/config.ts @@ -27,6 +27,12 @@ export const EndpointConfigSchema = schema.object({ from: schema.string({ defaultValue: 'now-15m' }), to: schema.string({ defaultValue: 'now' }), }), + + /** + * Artifacts Configuration + */ + packagerTaskInterval: schema.string({ defaultValue: '60s' }), + validateArtifactDownloads: schema.boolean({ defaultValue: true }), }); export function createConfig$(context: PluginInitializerContext) { diff --git a/x-pack/plugins/security_solution/server/endpoint/ingest_integration.test.ts b/x-pack/plugins/security_solution/server/endpoint/ingest_integration.test.ts index be749b2ebd25a..03999715dfc71 100644 --- a/x-pack/plugins/security_solution/server/endpoint/ingest_integration.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/ingest_integration.test.ts @@ -12,7 +12,6 @@ import { ManifestManagerMockType, } from './services/artifacts/manifest_manager/manifest_manager.mock'; import { getPackageConfigCreateCallback } from './ingest_integration'; -import { ManifestConstants } from './lib/artifacts'; describe('ingest_integration tests ', () => { describe('ingest_integration sanity checks', () => { @@ -30,16 +29,6 @@ describe('ingest_integration tests ', () => { expect(newPolicyConfig.inputs[0]!.config!.policy.value).toEqual(policyConfigFactory()); expect(newPolicyConfig.inputs[0]!.config!.artifact_manifest.value).toEqual({ artifacts: { - 'endpoint-exceptionlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/endpoint/artifacts/download/endpoint-exceptionlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, 'endpoint-exceptionlist-macos-v1': { compression_algorithm: 'zlib', decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', @@ -61,7 +50,7 @@ describe('ingest_integration tests ', () => { '/api/endpoint/artifacts/download/endpoint-exceptionlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', }, }, - manifest_version: 'a9b7ef358a363f327f479e31efc4f228b2277a7fb4d1914ca9b4e7ca9ffcf537', + manifest_version: '1.0.0', schema_version: 'v1', }); }); @@ -70,9 +59,7 @@ describe('ingest_integration tests ', () => { const logger = loggingSystemMock.create().get('ingest_integration.test'); const manifestManager = getManifestManagerMock(); manifestManager.pushArtifacts = jest.fn().mockResolvedValue([new Error('error updating')]); - const lastComputed = await manifestManager.getLastComputedManifest( - ManifestConstants.SCHEMA_VERSION - ); + const lastComputed = await manifestManager.getLastComputedManifest(); const callback = getPackageConfigCreateCallback(logger, manifestManager); const policyConfig = createNewPackageConfigMock(); @@ -90,9 +77,7 @@ describe('ingest_integration tests ', () => { const manifestManager = getManifestManagerMock({ mockType: ManifestManagerMockType.InitialSystemState, }); - const lastComputed = await manifestManager.getLastComputedManifest( - ManifestConstants.SCHEMA_VERSION - ); + const lastComputed = await manifestManager.getLastComputedManifest(); expect(lastComputed).toEqual(null); manifestManager.buildNewManifest = jest.fn().mockRejectedValue(new Error('abcd')); @@ -107,9 +92,7 @@ describe('ingest_integration tests ', () => { test('subsequent policy creations succeed', async () => { const logger = loggingSystemMock.create().get('ingest_integration.test'); const manifestManager = getManifestManagerMock(); - const lastComputed = await manifestManager.getLastComputedManifest( - ManifestConstants.SCHEMA_VERSION - ); + const lastComputed = await manifestManager.getLastComputedManifest(); manifestManager.buildNewManifest = jest.fn().mockResolvedValue(lastComputed); // no diffs const callback = getPackageConfigCreateCallback(logger, manifestManager); diff --git a/x-pack/plugins/security_solution/server/endpoint/ingest_integration.ts b/x-pack/plugins/security_solution/server/endpoint/ingest_integration.ts index 11d4b12d0b76a..695267f322857 100644 --- a/x-pack/plugins/security_solution/server/endpoint/ingest_integration.ts +++ b/x-pack/plugins/security_solution/server/endpoint/ingest_integration.ts @@ -10,7 +10,7 @@ import { factory as policyConfigFactory } from '../../common/endpoint/models/pol import { NewPolicyData } from '../../common/endpoint/types'; import { ManifestManager } from './services/artifacts'; import { Manifest } from './lib/artifacts'; -import { reportErrors, ManifestConstants } from './lib/artifacts/common'; +import { reportErrors } from './lib/artifacts/common'; import { InternalArtifactCompleteSchema } from './schemas/artifacts'; import { manifestDispatchSchema } from '../../common/endpoint/schema/manifest'; @@ -18,14 +18,14 @@ const getManifest = async (logger: Logger, manifestManager: ManifestManager): Pr let manifest: Manifest | null = null; try { - manifest = await manifestManager.getLastComputedManifest(ManifestConstants.SCHEMA_VERSION); + manifest = await manifestManager.getLastComputedManifest(); // If we have not yet computed a manifest, then we have to do so now. This should only happen // once. if (manifest == null) { // New computed manifest based on current state of exception list - const newManifest = await manifestManager.buildNewManifest(ManifestConstants.SCHEMA_VERSION); - const diffs = newManifest.diff(Manifest.getDefault(ManifestConstants.SCHEMA_VERSION)); + const newManifest = await manifestManager.buildNewManifest(); + const diffs = newManifest.diff(Manifest.getDefault()); // Compress new artifacts const adds = diffs.filter((diff) => diff.type === 'add').map((diff) => diff.id); @@ -63,7 +63,7 @@ const getManifest = async (logger: Logger, manifestManager: ManifestManager): Pr logger.error(err); } - return manifest ?? Manifest.getDefault(ManifestConstants.SCHEMA_VERSION); + return manifest ?? Manifest.getDefault(); }; /** diff --git a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/common.ts b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/common.ts index 7298a9bfa72a6..7f90aa7b91063 100644 --- a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/common.ts +++ b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/common.ts @@ -13,13 +13,11 @@ import { export const ArtifactConstants = { GLOBAL_ALLOWLIST_NAME: 'endpoint-exceptionlist', SAVED_OBJECT_TYPE: 'endpoint:user-artifact', - SUPPORTED_OPERATING_SYSTEMS: ['linux', 'macos', 'windows'], - SCHEMA_VERSION: 'v1', + SUPPORTED_OPERATING_SYSTEMS: ['macos', 'windows'], }; export const ManifestConstants = { SAVED_OBJECT_TYPE: 'endpoint:user-artifact-manifest', - SCHEMA_VERSION: 'v1', }; export const getArtifactId = (artifact: InternalArtifactSchema) => { diff --git a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.test.ts b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.test.ts index bb8b4fb3d5ce7..fea3b2b9a4526 100644 --- a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.test.ts @@ -314,21 +314,23 @@ describe('buildEventTypeSignal', () => { test('it should convert the exception lists response to the proper endpoint format while paging', async () => { // The first call returns two exceptions const first = getFoundExceptionListItemSchemaMock(); + first.per_page = 2; + first.total = 4; first.data.push(getExceptionListItemSchemaMock()); // The second call returns two exceptions const second = getFoundExceptionListItemSchemaMock(); + second.per_page = 2; + second.total = 4; second.data.push(getExceptionListItemSchemaMock()); - // The third call returns no exceptions, paging stops - const third = getFoundExceptionListItemSchemaMock(); - third.data = []; mockExceptionClient.findExceptionListItem = jest .fn() .mockReturnValueOnce(first) - .mockReturnValueOnce(second) - .mockReturnValueOnce(third); + .mockReturnValueOnce(second); + const resp = await getFullEndpointExceptionList(mockExceptionClient, 'linux', 'v1'); + // Expect 2 exceptions, the first two calls returned the same exception list items expect(resp.entries.length).toEqual(2); }); diff --git a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts index 5998a88527f2f..e41781dd605a0 100644 --- a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts +++ b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts @@ -79,10 +79,10 @@ export async function getFullEndpointExceptionList( schemaVersion: string ): Promise { const exceptions: WrappedTranslatedExceptionList = { entries: [] }; - let numResponses = 0; let page = 1; + let paging = true; - do { + while (paging) { const response = await eClient.findExceptionListItem({ listId: ENDPOINT_LIST_ID, namespaceType: 'agnostic', @@ -94,17 +94,16 @@ export async function getFullEndpointExceptionList( }); if (response?.data !== undefined) { - numResponses = response.data.length; - exceptions.entries = exceptions.entries.concat( translateToEndpointExceptions(response, schemaVersion) ); + paging = (page - 1) * 100 + response.data.length < response.total; page++; } else { break; } - } while (numResponses > 0); + } const [validated, errors] = validate(exceptions, wrappedTranslatedExceptionList); if (errors != null) { diff --git a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/manifest.test.ts b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/manifest.test.ts index 95587c6fc105d..3d70f7266277f 100644 --- a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/manifest.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/manifest.test.ts @@ -6,7 +6,7 @@ import { ManifestSchemaVersion } from '../../../../common/endpoint/schema/common'; import { InternalArtifactCompleteSchema } from '../../schemas'; -import { ManifestConstants, getArtifactId } from './common'; +import { getArtifactId } from './common'; import { Manifest } from './manifest'; import { getMockArtifacts, @@ -30,29 +30,21 @@ describe('manifest', () => { }); test('Can create manifest with valid schema version', () => { - const manifest = new Manifest('v1'); + const manifest = new Manifest(); expect(manifest).toBeInstanceOf(Manifest); }); test('Cannot create manifest with invalid schema version', () => { expect(() => { - new Manifest('abcd' as ManifestSchemaVersion); + new Manifest({ + schemaVersion: 'abcd' as ManifestSchemaVersion, + }); }).toThrow(); }); test('Empty manifest transforms correctly to expected endpoint format', async () => { expect(emptyManifest.toEndpointFormat()).toStrictEqual({ artifacts: { - 'endpoint-exceptionlist-linux-v1': { - compression_algorithm: 'zlib', - encryption_algorithm: 'none', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - decoded_size: 14, - encoded_size: 22, - relative_url: - '/api/endpoint/artifacts/download/endpoint-exceptionlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, 'endpoint-exceptionlist-macos-v1': { compression_algorithm: 'zlib', encryption_algorithm: 'none', @@ -74,7 +66,7 @@ describe('manifest', () => { '/api/endpoint/artifacts/download/endpoint-exceptionlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', }, }, - manifest_version: 'a9b7ef358a363f327f479e31efc4f228b2277a7fb4d1914ca9b4e7ca9ffcf537', + manifest_version: '1.0.0', schema_version: 'v1', }); }); @@ -82,16 +74,6 @@ describe('manifest', () => { test('Manifest transforms correctly to expected endpoint format', async () => { expect(manifest1.toEndpointFormat()).toStrictEqual({ artifacts: { - 'endpoint-exceptionlist-linux-v1': { - compression_algorithm: 'zlib', - encryption_algorithm: 'none', - decoded_sha256: '96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', - encoded_sha256: '975382ab55d019cbab0bbac207a54e2a7d489fad6e8f6de34fc6402e5ef37b1e', - decoded_size: 432, - encoded_size: 147, - relative_url: - '/api/endpoint/artifacts/download/endpoint-exceptionlist-linux-v1/96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', - }, 'endpoint-exceptionlist-macos-v1': { compression_algorithm: 'zlib', encryption_algorithm: 'none', @@ -113,15 +95,16 @@ describe('manifest', () => { '/api/endpoint/artifacts/download/endpoint-exceptionlist-windows-v1/96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', }, }, - manifest_version: 'a7f4760bfa2662e85e30fe4fb8c01b4c4a20938c76ab21d3c5a3e781e547cce7', + manifest_version: '1.0.0', schema_version: 'v1', }); }); test('Manifest transforms correctly to expected saved object format', async () => { expect(manifest1.toSavedObject()).toStrictEqual({ + schemaVersion: 'v1', + semanticVersion: '1.0.0', ids: [ - 'endpoint-exceptionlist-linux-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', 'endpoint-exceptionlist-macos-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', 'endpoint-exceptionlist-windows-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', ], @@ -133,12 +116,12 @@ describe('manifest', () => { expect(diffs).toEqual([ { id: - 'endpoint-exceptionlist-linux-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', + 'endpoint-exceptionlist-macos-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', type: 'delete', }, { id: - 'endpoint-exceptionlist-linux-v1-0a5a2013a79f9e60682472284a1be45ab1ff68b9b43426d00d665016612c15c8', + 'endpoint-exceptionlist-macos-v1-0a5a2013a79f9e60682472284a1be45ab1ff68b9b43426d00d665016612c15c8', type: 'add', }, ]); @@ -154,7 +137,6 @@ describe('manifest', () => { const entries = manifest1.getEntries(); const keys = Object.keys(entries); expect(keys).toEqual([ - 'endpoint-exceptionlist-linux-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', 'endpoint-exceptionlist-macos-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', 'endpoint-exceptionlist-windows-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', ]); @@ -168,13 +150,8 @@ describe('manifest', () => { }); test('Manifest can be created from list of artifacts', async () => { - const oldManifest = new Manifest(ManifestConstants.SCHEMA_VERSION); - const manifest = Manifest.fromArtifacts(artifacts, 'v1', oldManifest); - expect( - manifest.contains( - 'endpoint-exceptionlist-linux-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3' - ) - ).toEqual(true); + const oldManifest = new Manifest(); + const manifest = Manifest.fromArtifacts(artifacts, oldManifest); expect( manifest.contains( 'endpoint-exceptionlist-macos-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3' diff --git a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/manifest.ts b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/manifest.ts index 6ece2bf0f48e8..9e0e940ea9a1d 100644 --- a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/manifest.ts +++ b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/manifest.ts @@ -3,8 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - -import { createHash } from 'crypto'; +import semver from 'semver'; import { validate } from '../../../../common/validate'; import { InternalArtifactSchema, @@ -13,13 +12,15 @@ import { InternalArtifactCompleteSchema, } from '../../schemas/artifacts'; import { - manifestSchemaVersion, ManifestSchemaVersion, + SemanticVersion, + semanticVersion, } from '../../../../common/endpoint/schema/common'; -import { ManifestSchema, manifestSchema } from '../../../../common/endpoint/schema/manifest'; +import { manifestSchema, ManifestSchema } from '../../../../common/endpoint/schema/manifest'; import { ManifestEntry } from './manifest_entry'; import { maybeCompressArtifact, isCompressed } from './lists'; import { getArtifactId } from './common'; +import { ManifestVersion, manifestVersion } from '../../schemas/artifacts/manifest'; export interface ManifestDiff { type: string; @@ -28,37 +29,39 @@ export interface ManifestDiff { export class Manifest { private entries: Record; - private schemaVersion: ManifestSchemaVersion; - - // For concurrency control - private version: string | undefined; + private version: ManifestVersion; - constructor(schemaVersion: string, version?: string) { + constructor(version?: Partial) { this.entries = {}; - this.version = version; - const [validated, errors] = validate( - (schemaVersion as unknown) as object, - manifestSchemaVersion - ); + const decodedVersion = { + schemaVersion: version?.schemaVersion ?? 'v1', + semanticVersion: version?.semanticVersion ?? '1.0.0', + soVersion: version?.soVersion, + }; + const [validated, errors] = validate(decodedVersion, manifestVersion); if (errors != null || validated === null) { - throw new Error(`Invalid manifest schema version: ${schemaVersion}`); + throw new Error(errors ?? 'Invalid version format.'); } - this.schemaVersion = validated; + this.version = validated; } - public static getDefault(schemaVersion: string) { - return new Manifest(schemaVersion); + public static getDefault(schemaVersion?: ManifestSchemaVersion) { + return new Manifest({ schemaVersion, semanticVersion: '1.0.0' }); } public static fromArtifacts( artifacts: InternalArtifactCompleteSchema[], - schemaVersion: string, - oldManifest: Manifest + oldManifest: Manifest, + schemaVersion?: ManifestSchemaVersion ): Manifest { - const manifest = new Manifest(schemaVersion, oldManifest.getSoVersion()); + const manifest = new Manifest({ + schemaVersion, + semanticVersion: oldManifest.getSemanticVersion(), + soVersion: oldManifest.getSavedObjectVersion(), + }); artifacts.forEach((artifact) => { const id = getArtifactId(artifact); const existingArtifact = oldManifest.getArtifact(id); @@ -71,25 +74,12 @@ export class Manifest { return manifest; } - public static fromPkgConfig(manifestPkgConfig: ManifestSchema): Manifest | null { - if (manifestSchema.is(manifestPkgConfig)) { - const manifest = new Manifest(manifestPkgConfig.schema_version); - for (const [identifier, artifactRecord] of Object.entries(manifestPkgConfig.artifacts)) { - const artifact = { - identifier, - compressionAlgorithm: artifactRecord.compression_algorithm, - encryptionAlgorithm: artifactRecord.encryption_algorithm, - decodedSha256: artifactRecord.decoded_sha256, - decodedSize: artifactRecord.decoded_size, - encodedSha256: artifactRecord.encoded_sha256, - encodedSize: artifactRecord.encoded_size, - }; - manifest.addEntry(artifact); - } - return manifest; - } else { - return null; + public bumpSemanticVersion() { + const newSemanticVersion = semver.inc(this.getSemanticVersion(), 'patch'); + if (!semanticVersion.is(newSemanticVersion)) { + throw new Error(`Invalid semver: ${newSemanticVersion}`); } + this.version.semanticVersion = newSemanticVersion; } public async compressArtifact(id: string): Promise { @@ -112,30 +102,16 @@ export class Manifest { return null; } - public equals(manifest: Manifest): boolean { - return this.getSha256() === manifest.getSha256(); - } - - public getSha256(): string { - let sha256 = createHash('sha256'); - Object.keys(this.entries) - .sort() - .forEach((docId) => { - sha256 = sha256.update(docId); - }); - return sha256.digest('hex'); - } - public getSchemaVersion(): ManifestSchemaVersion { - return this.schemaVersion; + return this.version.schemaVersion; } - public getSoVersion(): string | undefined { - return this.version; + public getSavedObjectVersion(): string | undefined { + return this.version.soVersion; } - public setSoVersion(version: string) { - this.version = version; + public getSemanticVersion(): SemanticVersion { + return this.version.semanticVersion; } public addEntry(artifact: InternalArtifactSchema) { @@ -179,8 +155,8 @@ export class Manifest { public toEndpointFormat(): ManifestSchema { const manifestObj: ManifestSchema = { - manifest_version: this.getSha256(), - schema_version: this.schemaVersion, + manifest_version: this.getSemanticVersion(), + schema_version: this.getSchemaVersion(), artifacts: {}, }; @@ -198,7 +174,9 @@ export class Manifest { public toSavedObject(): InternalManifestSchema { return { - ids: Object.keys(this.entries), + ids: Object.keys(this.getEntries()), + schemaVersion: this.getSchemaVersion(), + semanticVersion: this.getSemanticVersion(), }; } } diff --git a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/mocks.ts index 0ec6cb2bd61b3..62fff4715b562 100644 --- a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/mocks.ts @@ -29,7 +29,7 @@ export const getMockArtifactsWithDiff = async (opts?: { compress: boolean }) => return Promise.all( ArtifactConstants.SUPPORTED_OPERATING_SYSTEMS.map>( async (os) => { - if (os === 'linux') { + if (os === 'macos') { return getInternalArtifactMockWithDiffs(os, 'v1'); } return getInternalArtifactMock(os, 'v1', opts); @@ -49,21 +49,21 @@ export const getEmptyMockArtifacts = async (opts?: { compress: boolean }) => { }; export const getMockManifest = async (opts?: { compress: boolean }) => { - const manifest = new Manifest('v1'); + const manifest = new Manifest(); const artifacts = await getMockArtifacts(opts); artifacts.forEach((artifact) => manifest.addEntry(artifact)); return manifest; }; export const getMockManifestWithDiffs = async (opts?: { compress: boolean }) => { - const manifest = new Manifest('v1'); + const manifest = new Manifest(); const artifacts = await getMockArtifactsWithDiff(opts); artifacts.forEach((artifact) => manifest.addEntry(artifact)); return manifest; }; export const getEmptyMockManifest = async (opts?: { compress: boolean }) => { - const manifest = new Manifest('v1'); + const manifest = new Manifest(); const artifacts = await getEmptyMockArtifacts(opts); artifacts.forEach((artifact) => manifest.addEntry(artifact)); return manifest; @@ -74,16 +74,6 @@ export const createPackageConfigWithInitialManifestMock = (): PackageConfig => { packageConfig.inputs[0].config!.artifact_manifest = { value: { artifacts: { - 'endpoint-exceptionlist-linux-v1': { - compression_algorithm: 'zlib', - encryption_algorithm: 'none', - decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - decoded_size: 14, - encoded_size: 22, - relative_url: - '/api/endpoint/artifacts/download/endpoint-exceptionlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, 'endpoint-exceptionlist-macos-v1': { compression_algorithm: 'zlib', encryption_algorithm: 'none', @@ -105,7 +95,7 @@ export const createPackageConfigWithInitialManifestMock = (): PackageConfig => { '/api/endpoint/artifacts/download/endpoint-exceptionlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', }, }, - manifest_version: 'a9b7ef358a363f327f479e31efc4f228b2277a7fb4d1914ca9b4e7ca9ffcf537', + manifest_version: '1.0.0', schema_version: 'v1', }, }; @@ -117,16 +107,6 @@ export const createPackageConfigWithManifestMock = (): PackageConfig => { packageConfig.inputs[0].config!.artifact_manifest = { value: { artifacts: { - 'endpoint-exceptionlist-linux-v1': { - compression_algorithm: 'zlib', - encryption_algorithm: 'none', - decoded_sha256: '0a5a2013a79f9e60682472284a1be45ab1ff68b9b43426d00d665016612c15c8', - encoded_sha256: '57941169bb2c5416f9bd7224776c8462cb9a2be0fe8b87e6213e77a1d29be824', - decoded_size: 292, - encoded_size: 131, - relative_url: - '/api/endpoint/artifacts/download/endpoint-exceptionlist-linux-v1/0a5a2013a79f9e60682472284a1be45ab1ff68b9b43426d00d665016612c15c8', - }, 'endpoint-exceptionlist-macos-v1': { compression_algorithm: 'zlib', encryption_algorithm: 'none', @@ -148,7 +128,7 @@ export const createPackageConfigWithManifestMock = (): PackageConfig => { '/api/endpoint/artifacts/download/endpoint-exceptionlist-windows-v1/96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', }, }, - manifest_version: '520f6cf88b3f36a065c6ca81058d5f8690aadadf6fe857f8dec4cc37589e7283', + manifest_version: '1.0.1', schema_version: 'v1', }, }; diff --git a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/saved_object_mappings.ts b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/saved_object_mappings.ts index 0fb433df95de3..734304516e37e 100644 --- a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/saved_object_mappings.ts +++ b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/saved_object_mappings.ts @@ -55,7 +55,13 @@ export const manifestSavedObjectMappings: SavedObjectsType['mappings'] = { type: 'date', index: false, }, - // array of doc ids + schemaVersion: { + type: 'keyword', + }, + semanticVersion: { + type: 'keyword', + index: false, + }, ids: { type: 'keyword', index: false, diff --git a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/task.test.ts b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/task.test.ts index daa8a7dd83ee0..32d58da5c3b78 100644 --- a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/task.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/task.test.ts @@ -38,7 +38,7 @@ describe('task', () => { taskManager: mockTaskManagerSetup, }); const mockTaskManagerStart = taskManagerMock.createStart(); - manifestTask.start({ taskManager: mockTaskManagerStart }); + await manifestTask.start({ taskManager: mockTaskManagerStart }); expect(mockTaskManagerStart.ensureScheduled).toHaveBeenCalled(); }); diff --git a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/task.ts b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/task.ts index ba164059866ea..4f2dbdf7644e2 100644 --- a/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/task.ts +++ b/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/task.ts @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - import { Logger } from 'src/core/server'; import { ConcreteTaskInstance, @@ -11,7 +10,7 @@ import { TaskManagerStartContract, } from '../../../../../task_manager/server'; import { EndpointAppContext } from '../../types'; -import { reportErrors, ManifestConstants } from './common'; +import { reportErrors } from './common'; import { InternalArtifactCompleteSchema } from '../../schemas/artifacts'; export const ManifestTaskConstants = { @@ -45,7 +44,23 @@ export class ManifestTask { createTaskRunner: ({ taskInstance }: { taskInstance: ConcreteTaskInstance }) => { return { run: async () => { + const taskInterval = (await this.endpointAppContext.config()).packagerTaskInterval; await this.runTask(taskInstance.id); + const nextRun = new Date(); + if (taskInterval.endsWith('s')) { + const seconds = parseInt(taskInterval.slice(0, -1), 10); + nextRun.setSeconds(nextRun.getSeconds() + seconds); + } else if (taskInterval.endsWith('m')) { + const minutes = parseInt(taskInterval.slice(0, -1), 10); + nextRun.setMinutes(nextRun.getMinutes() + minutes); + } else { + this.logger.error(`Invalid task interval: ${taskInterval}`); + return; + } + return { + state: {}, + runAt: nextRun, + }; }, cancel: async () => {}, }; @@ -61,7 +76,7 @@ export class ManifestTask { taskType: ManifestTaskConstants.TYPE, scope: ['securitySolution'], schedule: { - interval: '60s', + interval: (await this.endpointAppContext.config()).packagerTaskInterval, }, state: {}, params: { version: ManifestTaskConstants.VERSION }, @@ -92,19 +107,14 @@ export class ManifestTask { try { // Last manifest we computed, which was saved to ES - const oldManifest = await manifestManager.getLastComputedManifest( - ManifestConstants.SCHEMA_VERSION - ); + const oldManifest = await manifestManager.getLastComputedManifest(); if (oldManifest == null) { this.logger.debug('User manifest not available yet.'); return; } // New computed manifest based on current state of exception list - const newManifest = await manifestManager.buildNewManifest( - ManifestConstants.SCHEMA_VERSION, - oldManifest - ); + const newManifest = await manifestManager.buildNewManifest(oldManifest); const diffs = newManifest.diff(oldManifest); // Compress new artifacts @@ -131,6 +141,7 @@ export class ManifestTask { // Commit latest manifest state, if different if (diffs.length) { + newManifest.bumpSemanticVersion(); const error = await manifestManager.commit(newManifest); if (error) { throw error; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/artifacts/download_exception_list.ts b/x-pack/plugins/security_solution/server/endpoint/routes/artifacts/download_exception_list.ts index 38e900c4d5015..d825841f1e257 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/artifacts/download_exception_list.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/artifacts/download_exception_list.ts @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - import { IRouter, SavedObjectsClientContract, @@ -14,7 +13,6 @@ import { import LRU from 'lru-cache'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { authenticateAgentWithAccessToken } from '../../../../../ingest_manager/server/services/agents/authenticate'; -import { validate } from '../../../../common/validate'; import { LIMITED_CONCURRENCY_ENDPOINT_ROUTE_TAG } from '../../../../common/endpoint/constants'; import { buildRouteValidation } from '../../../utils/build_validation/route_validation'; import { ArtifactConstants } from '../../lib/artifacts'; @@ -63,6 +61,7 @@ export function registerDownloadExceptionListRoute( } } + const validateDownload = (await endpointContext.config()).validateArtifactDownloads; const buildAndValidateResponse = (artName: string, body: Buffer): IKibanaResponse => { const artifact: HttpResponseOptions = { body, @@ -72,11 +71,10 @@ export function registerDownloadExceptionListRoute( }, }; - const [validated, errors] = validate(artifact, downloadArtifactResponseSchema); - if (errors !== null || validated === null) { - return res.internalError({ body: errors! }); + if (validateDownload && !downloadArtifactResponseSchema.is(artifact)) { + return res.internalError({ body: 'Artifact failed to validate.' }); } else { - return res.ok((validated as unknown) as HttpResponseOptions); + return res.ok(artifact); } }; diff --git a/x-pack/plugins/security_solution/server/endpoint/schemas/artifacts/manifest.ts b/x-pack/plugins/security_solution/server/endpoint/schemas/artifacts/manifest.ts new file mode 100644 index 0000000000000..707d4c1374fe2 --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/schemas/artifacts/manifest.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as t from 'io-ts'; +import { manifestSchemaVersion, semanticVersion } from '../../../../common/endpoint/schema/common'; + +const optionalVersions = t.partial({ + soVersion: t.string, +}); + +export const manifestVersion = t.intersection([ + optionalVersions, + t.exact( + t.type({ + schemaVersion: manifestSchemaVersion, + semanticVersion, + }) + ), +]); +export type ManifestVersion = t.TypeOf; diff --git a/x-pack/plugins/security_solution/server/endpoint/schemas/artifacts/saved_objects.mock.ts b/x-pack/plugins/security_solution/server/endpoint/schemas/artifacts/saved_objects.mock.ts index d95627601a183..ae565f785c399 100644 --- a/x-pack/plugins/security_solution/server/endpoint/schemas/artifacts/saved_objects.mock.ts +++ b/x-pack/plugins/security_solution/server/endpoint/schemas/artifacts/saved_objects.mock.ts @@ -53,4 +53,6 @@ export const getInternalArtifactMockWithDiffs = async ( export const getInternalManifestMock = (): InternalManifestSchema => ({ ids: [], + schemaVersion: 'v1', + semanticVersion: '1.0.0', }); diff --git a/x-pack/plugins/security_solution/server/endpoint/schemas/artifacts/saved_objects.ts b/x-pack/plugins/security_solution/server/endpoint/schemas/artifacts/saved_objects.ts index 4dea916dcb436..56f247b65d802 100644 --- a/x-pack/plugins/security_solution/server/endpoint/schemas/artifacts/saved_objects.ts +++ b/x-pack/plugins/security_solution/server/endpoint/schemas/artifacts/saved_objects.ts @@ -9,8 +9,10 @@ import { compressionAlgorithm, encryptionAlgorithm, identifier, + semanticVersion, sha256, size, + manifestSchemaVersion, } from '../../../../common/endpoint/schema/common'; import { created } from './common'; @@ -58,6 +60,8 @@ export type InternalArtifactCreateSchema = t.TypeOf; diff --git a/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_client.ts index 385f115e6301a..e55243f0650a5 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_client.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_client.ts @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - import { SavedObject, SavedObjectsClientContract, diff --git a/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.test.ts index c838f772fb66b..d99d6a959d7aa 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.test.ts @@ -16,22 +16,17 @@ describe('manifest_manager', () => { describe('ManifestManager sanity checks', () => { test('ManifestManager can retrieve and diff manifests', async () => { const manifestManager = getManifestManagerMock(); - const oldManifest = await manifestManager.getLastComputedManifest( - ManifestConstants.SCHEMA_VERSION - ); - const newManifest = await manifestManager.buildNewManifest( - ManifestConstants.SCHEMA_VERSION, - oldManifest! - ); + const oldManifest = await manifestManager.getLastComputedManifest(); + const newManifest = await manifestManager.buildNewManifest(oldManifest!); expect(newManifest.diff(oldManifest!)).toEqual([ { id: - 'endpoint-exceptionlist-linux-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', + 'endpoint-exceptionlist-macos-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', type: 'delete', }, { id: - 'endpoint-exceptionlist-linux-v1-0a5a2013a79f9e60682472284a1be45ab1ff68b9b43426d00d665016612c15c8', + 'endpoint-exceptionlist-macos-v1-0a5a2013a79f9e60682472284a1be45ab1ff68b9b43426d00d665016612c15c8', type: 'add', }, ]); @@ -40,23 +35,18 @@ describe('manifest_manager', () => { test('ManifestManager populates cache properly', async () => { const cache = new LRU({ max: 10, maxAge: 1000 * 60 * 60 }); const manifestManager = getManifestManagerMock({ cache }); - const oldManifest = await manifestManager.getLastComputedManifest( - ManifestConstants.SCHEMA_VERSION - ); - const newManifest = await manifestManager.buildNewManifest( - ManifestConstants.SCHEMA_VERSION, - oldManifest! - ); + const oldManifest = await manifestManager.getLastComputedManifest(); + const newManifest = await manifestManager.buildNewManifest(oldManifest!); const diffs = newManifest.diff(oldManifest!); expect(diffs).toEqual([ { id: - 'endpoint-exceptionlist-linux-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', + 'endpoint-exceptionlist-macos-v1-96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', type: 'delete', }, { id: - 'endpoint-exceptionlist-linux-v1-0a5a2013a79f9e60682472284a1be45ab1ff68b9b43426d00d665016612c15c8', + 'endpoint-exceptionlist-macos-v1-0a5a2013a79f9e60682472284a1be45ab1ff68b9b43426d00d665016612c15c8', type: 'add', }, ]); @@ -104,13 +94,8 @@ describe('manifest_manager', () => { test('ManifestManager cannot dispatch incomplete (uncompressed) artifact', async () => { const packageConfigService = createPackageConfigServiceMock(); const manifestManager = getManifestManagerMock({ packageConfigService }); - const oldManifest = await manifestManager.getLastComputedManifest( - ManifestConstants.SCHEMA_VERSION - ); - const newManifest = await manifestManager.buildNewManifest( - ManifestConstants.SCHEMA_VERSION, - oldManifest! - ); + const oldManifest = await manifestManager.getLastComputedManifest(); + const newManifest = await manifestManager.buildNewManifest(oldManifest!); const dispatchErrors = await manifestManager.tryDispatch(newManifest); expect(dispatchErrors.length).toEqual(1); expect(dispatchErrors[0].message).toEqual('Invalid manifest'); @@ -119,17 +104,14 @@ describe('manifest_manager', () => { test('ManifestManager can dispatch manifest', async () => { const packageConfigService = createPackageConfigServiceMock(); const manifestManager = getManifestManagerMock({ packageConfigService }); - const oldManifest = await manifestManager.getLastComputedManifest( - ManifestConstants.SCHEMA_VERSION - ); - const newManifest = await manifestManager.buildNewManifest( - ManifestConstants.SCHEMA_VERSION, - oldManifest! - ); + const oldManifest = await manifestManager.getLastComputedManifest(); + const newManifest = await manifestManager.buildNewManifest(oldManifest!); const diffs = newManifest.diff(oldManifest!); const newArtifactId = diffs[1].id; await newManifest.compressArtifact(newArtifactId); + newManifest.bumpSemanticVersion(); + const dispatchErrors = await manifestManager.tryDispatch(newManifest); expect(dispatchErrors).toEqual([]); @@ -140,10 +122,10 @@ describe('manifest_manager', () => { expect( packageConfigService.update.mock.calls[0][2].inputs[0].config!.artifact_manifest.value ).toEqual({ - manifest_version: '520f6cf88b3f36a065c6ca81058d5f8690aadadf6fe857f8dec4cc37589e7283', + manifest_version: '1.0.1', schema_version: 'v1', artifacts: { - 'endpoint-exceptionlist-linux-v1': { + 'endpoint-exceptionlist-macos-v1': { compression_algorithm: 'zlib', encryption_algorithm: 'none', decoded_sha256: '0a5a2013a79f9e60682472284a1be45ab1ff68b9b43426d00d665016612c15c8', @@ -151,17 +133,7 @@ describe('manifest_manager', () => { decoded_size: 292, encoded_size: 131, relative_url: - '/api/endpoint/artifacts/download/endpoint-exceptionlist-linux-v1/0a5a2013a79f9e60682472284a1be45ab1ff68b9b43426d00d665016612c15c8', - }, - 'endpoint-exceptionlist-macos-v1': { - compression_algorithm: 'zlib', - encryption_algorithm: 'none', - decoded_sha256: '96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', - encoded_sha256: '975382ab55d019cbab0bbac207a54e2a7d489fad6e8f6de34fc6402e5ef37b1e', - decoded_size: 432, - encoded_size: 147, - relative_url: - '/api/endpoint/artifacts/download/endpoint-exceptionlist-macos-v1/96b76a1a911662053a1562ac14c4ff1e87c2ff550d6fe52e1e0b3790526597d3', + '/api/endpoint/artifacts/download/endpoint-exceptionlist-macos-v1/0a5a2013a79f9e60682472284a1be45ab1ff68b9b43426d00d665016612c15c8', }, 'endpoint-exceptionlist-windows-v1': { compression_algorithm: 'zlib', @@ -180,17 +152,14 @@ describe('manifest_manager', () => { test('ManifestManager fails to dispatch on conflict', async () => { const packageConfigService = createPackageConfigServiceMock(); const manifestManager = getManifestManagerMock({ packageConfigService }); - const oldManifest = await manifestManager.getLastComputedManifest( - ManifestConstants.SCHEMA_VERSION - ); - const newManifest = await manifestManager.buildNewManifest( - ManifestConstants.SCHEMA_VERSION, - oldManifest! - ); + const oldManifest = await manifestManager.getLastComputedManifest(); + const newManifest = await manifestManager.buildNewManifest(oldManifest!); const diffs = newManifest.diff(oldManifest!); const newArtifactId = diffs[1].id; await newManifest.compressArtifact(newArtifactId); + newManifest.bumpSemanticVersion(); + packageConfigService.update.mockRejectedValueOnce({ status: 409 }); const dispatchErrors = await manifestManager.tryDispatch(newManifest); expect(dispatchErrors).toEqual([{ status: 409 }]); @@ -202,13 +171,8 @@ describe('manifest_manager', () => { savedObjectsClient, }); - const oldManifest = await manifestManager.getLastComputedManifest( - ManifestConstants.SCHEMA_VERSION - ); - const newManifest = await manifestManager.buildNewManifest( - ManifestConstants.SCHEMA_VERSION, - oldManifest! - ); + const oldManifest = await manifestManager.getLastComputedManifest(); + const newManifest = await manifestManager.buildNewManifest(oldManifest!); const diffs = newManifest.diff(oldManifest!); const oldArtifactId = diffs[0].id; const newArtifactId = diffs[1].id; diff --git a/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.ts b/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.ts index b52c51ba789af..217fd6de2ba68 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.ts @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - +import semver from 'semver'; import { Logger, SavedObjectsClientContract } from 'src/core/server'; import LRU from 'lru-cache'; import { PackageConfigServiceInterface } from '../../../../../../ingest_manager/server'; @@ -13,7 +13,6 @@ import { manifestDispatchSchema } from '../../../../../common/endpoint/schema/ma import { ArtifactConstants, - ManifestConstants, Manifest, buildArtifact, getFullEndpointExceptionList, @@ -52,6 +51,7 @@ export class ManifestManager { protected savedObjectsClient: SavedObjectsClientContract; protected logger: Logger; protected cache: LRU; + protected schemaVersion: ManifestSchemaVersion; constructor(context: ManifestManagerContext) { this.artifactClient = context.artifactClient; @@ -60,28 +60,27 @@ export class ManifestManager { this.savedObjectsClient = context.savedObjectsClient; this.logger = context.logger; this.cache = context.cache; + this.schemaVersion = 'v1'; } /** - * Gets a ManifestClient for the provided schemaVersion. + * Gets a ManifestClient for this manager's schemaVersion. * - * @param schemaVersion The schema version of the manifest. - * @returns {ManifestClient} A ManifestClient scoped to the provided schemaVersion. + * @returns {ManifestClient} A ManifestClient scoped to the appropriate schemaVersion. */ - protected getManifestClient(schemaVersion: string): ManifestClient { - return new ManifestClient(this.savedObjectsClient, schemaVersion as ManifestSchemaVersion); + protected getManifestClient(): ManifestClient { + return new ManifestClient(this.savedObjectsClient, this.schemaVersion); } /** * Builds an array of artifacts (one per supported OS) based on the current * state of exception-list-agnostic SOs. * - * @param schemaVersion The schema version of the artifact * @returns {Promise} An array of uncompressed artifacts built from exception-list-agnostic SOs. * @throws Throws/rejects if there are errors building the list. */ protected async buildExceptionListArtifacts( - schemaVersion: string + artifactSchemaVersion?: string ): Promise { return ArtifactConstants.SUPPORTED_OPERATING_SYSTEMS.reduce< Promise @@ -89,10 +88,10 @@ export class ManifestManager { const exceptionList = await getFullEndpointExceptionList( this.exceptionListClient, os, - schemaVersion + artifactSchemaVersion ?? 'v1' ); const artifacts = await acc; - const artifact = await buildArtifact(exceptionList, os, schemaVersion); + const artifact = await buildArtifact(exceptionList, os, artifactSchemaVersion ?? 'v1'); return Promise.resolve([...artifacts, artifact]); }, Promise.resolve([])); } @@ -168,20 +167,23 @@ export class ManifestManager { * Returns the last computed manifest based on the state of the * user-artifact-manifest SO. * - * @param schemaVersion The schema version of the manifest. * @returns {Promise} The last computed manifest, or null if does not exist. * @throws Throws/rejects if there is an unexpected error retrieving the manifest. */ - public async getLastComputedManifest(schemaVersion: string): Promise { + public async getLastComputedManifest(): Promise { try { - const manifestClient = this.getManifestClient(schemaVersion); + const manifestClient = this.getManifestClient(); const manifestSo = await manifestClient.getManifest(); if (manifestSo.version === undefined) { throw new Error('No version returned for manifest.'); } - const manifest = new Manifest(schemaVersion, manifestSo.version); + const manifest = new Manifest({ + schemaVersion: this.schemaVersion, + semanticVersion: manifestSo.attributes.semanticVersion, + soVersion: manifestSo.version, + }); for (const id of manifestSo.attributes.ids) { const artifactSo = await this.artifactClient.getArtifact(id); @@ -199,22 +201,17 @@ export class ManifestManager { /** * Builds a new manifest based on the current user exception list. * - * @param schemaVersion The schema version of the manifest. * @param baselineManifest A baseline manifest to use for initializing pre-existing artifacts. * @returns {Promise} A new Manifest object reprenting the current exception list. */ - public async buildNewManifest( - schemaVersion: string, - baselineManifest?: Manifest - ): Promise { + public async buildNewManifest(baselineManifest?: Manifest): Promise { // Build new exception list artifacts - const artifacts = await this.buildExceptionListArtifacts(ArtifactConstants.SCHEMA_VERSION); + const artifacts = await this.buildExceptionListArtifacts(); // Build new manifest const manifest = Manifest.fromArtifacts( artifacts, - ManifestConstants.SCHEMA_VERSION, - baselineManifest ?? Manifest.getDefault(schemaVersion) + baselineManifest ?? Manifest.getDefault(this.schemaVersion) ); return manifest; @@ -247,14 +244,12 @@ export class ManifestManager { for (const packageConfig of items) { const { id, revision, updated_at, updated_by, ...newPackageConfig } = packageConfig; if (newPackageConfig.inputs.length > 0 && newPackageConfig.inputs[0].config !== undefined) { - const artifactManifest = newPackageConfig.inputs[0].config.artifact_manifest ?? { + const oldManifest = newPackageConfig.inputs[0].config.artifact_manifest ?? { value: {}, }; - const oldManifest = - Manifest.fromPkgConfig(artifactManifest.value) ?? - Manifest.getDefault(ManifestConstants.SCHEMA_VERSION); - if (!manifest.equals(oldManifest)) { + const newManifestVersion = manifest.getSemanticVersion(); + if (semver.gt(newManifestVersion, oldManifest.value.manifest_version)) { newPackageConfig.inputs[0].config.artifact_manifest = { value: serializedManifest, }; @@ -262,7 +257,7 @@ export class ManifestManager { try { await this.packageConfigService.update(this.savedObjectsClient, id, newPackageConfig); this.logger.debug( - `Updated package config ${id} with manifest version ${manifest.getSha256()}` + `Updated package config ${id} with manifest version ${manifest.getSemanticVersion()}` ); } catch (err) { errors.push(err); @@ -274,8 +269,7 @@ export class ManifestManager { errors.push(new Error(`Package config ${id} has no config.`)); } } - - paging = page * items.length < total; + paging = (page - 1) * 20 + items.length < total; page++; } @@ -290,11 +284,11 @@ export class ManifestManager { */ public async commit(manifest: Manifest): Promise { try { - const manifestClient = this.getManifestClient(manifest.getSchemaVersion()); + const manifestClient = this.getManifestClient(); // Commit the new manifest const manifestSo = manifest.toSavedObject(); - const version = manifest.getSoVersion(); + const version = manifest.getSavedObjectVersion(); if (version == null) { await manifestClient.createManifest(manifestSo); @@ -304,7 +298,7 @@ export class ManifestManager { }); } - this.logger.info(`Committed manifest ${manifest.getSha256()}`); + this.logger.info(`Committed manifest ${manifest.getSemanticVersion()}`); } catch (err) { return err; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/index.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/index.ts index bfaab096a5013..196d816b6b257 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/index.ts @@ -25,6 +25,8 @@ export const createMockConfig = () => ({ from: 'now-15m', to: 'now', }, + packagerTaskInterval: '60s', + validateArtifactDownloads: true, }); export const mockGetCurrentUser = { diff --git a/x-pack/test/functional/es_archives/endpoint/artifacts/api_feature/data.json b/x-pack/test/functional/es_archives/endpoint/artifacts/api_feature/data.json index 47390f0428742..3af1070597671 100644 --- a/x-pack/test/functional/es_archives/endpoint/artifacts/api_feature/data.json +++ b/x-pack/test/functional/es_archives/endpoint/artifacts/api_feature/data.json @@ -1,28 +1,3 @@ -{ - "type": "doc", - "value": { - "id": "endpoint:user-artifact:endpoint-exceptionlist-linux-v1-d2a9c760005b08d43394e59a8701ae75c80881934ccf15a006944452b80f7f9f", - "index": ".kibana", - "source": { - "references": [ - ], - "endpoint:user-artifact": { - "body": "eJylkM8KwjAMxl9Fci59gN29iicvMqR02QjUbiSpKGPvbiw6ETwpuX1/fh9kBszKhALNcQa9TQgNCJ2nhOA+vJ4wdWaGqJSHPY8RRXxPCb3QkJEtP07IQUe2GOWYSoedqU8qXq16ikGqeAmpPNRtCqIU3WbnDx4WN38d/WvhQqmCXzDlIlojP9CsjLC0bqWtHwhaGN/1jHVkae3u+6N6Sg==", - "created": 1593016187465, - "compressionAlgorithm": "zlib", - "encryptionAlgorithm": "none", - "identifier": "endpoint-exceptionlist-linux-v1", - "encodedSha256": "5caaeabcb7864d47157fc7c28d5a7398b4f6bbaaa565d789c02ee809253b7613", - "encodedSize": 160, - "decodedSha256": "d2a9c760005b08d43394e59a8701ae75c80881934ccf15a006944452b80f7f9f", - "decodedSize": 358 - }, - "type": "endpoint:user-artifact", - "updated_at": "2020-06-24T16:29:47.584Z" - } - } -} - { "type": "doc", "value": { @@ -83,8 +58,9 @@ ], "endpoint:user-artifact-manifest": { "created": 1593183699663, + "schemaVersion": "v1", + "semanticVersion": "1.0.1", "ids": [ - "endpoint-exceptionlist-linux-v1-d2a9c760005b08d43394e59a8701ae75c80881934ccf15a006944452b80f7f9f", "endpoint-exceptionlist-macos-v1-d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658", "endpoint-exceptionlist-windows-v1-8d2bcc37e82fad5d06e2c9e4bd96793ea8905ace1d528a57d0d0579ecc8c647e" ] diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts index ca84384390a29..d4947222a6cc0 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts @@ -118,18 +118,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }, artifact_manifest: { artifacts: { - 'endpoint-exceptionlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/endpoint/artifacts/download/endpoint-exceptionlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, 'endpoint-exceptionlist-macos-v1': { compression_algorithm: 'zlib', decoded_sha256: diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/artifacts/index.ts b/x-pack/test/security_solution_endpoint_api_int/apis/artifacts/index.ts index a4a8de418157f..d5106f5549924 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/artifacts/index.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/artifacts/index.ts @@ -83,24 +83,24 @@ export default function (providerContext: FtrProviderContext) { it('should download an artifact with list items', async () => { await supertestWithoutAuth .get( - '/api/endpoint/artifacts/download/endpoint-exceptionlist-linux-v1/d2a9c760005b08d43394e59a8701ae75c80881934ccf15a006944452b80f7f9f' + '/api/endpoint/artifacts/download/endpoint-exceptionlist-windows-v1/8d2bcc37e82fad5d06e2c9e4bd96793ea8905ace1d528a57d0d0579ecc8c647e' ) .set('kbn-xsrf', 'xxx') .set('authorization', `ApiKey ${agentAccessAPIKey}`) .send() .expect(200) .expect((response) => { - expect(response.body.byteLength).to.equal(160); + expect(response.body.byteLength).to.equal(191); const encodedHash = createHash('sha256').update(response.body).digest('hex'); expect(encodedHash).to.equal( - '5caaeabcb7864d47157fc7c28d5a7398b4f6bbaaa565d789c02ee809253b7613' + '73015ee5131dabd1b48aa4776d3e766d836f8dd8c9fa8999c9b931f60027f07f' ); const decodedBody = inflateSync(response.body); const decodedHash = createHash('sha256').update(decodedBody).digest('hex'); expect(decodedHash).to.equal( - 'd2a9c760005b08d43394e59a8701ae75c80881934ccf15a006944452b80f7f9f' + '8d2bcc37e82fad5d06e2c9e4bd96793ea8905ace1d528a57d0d0579ecc8c647e' ); - expect(decodedBody.byteLength).to.equal(358); + expect(decodedBody.byteLength).to.equal(704); const artifactJson = JSON.parse(decodedBody.toString()); expect(artifactJson).to.eql({ entries: [ @@ -113,6 +113,35 @@ export default function (providerContext: FtrProviderContext) { type: 'exact_cased', value: 'Elastic, N.V.', }, + { + entries: [ + { + field: 'signer', + operator: 'included', + type: 'exact_cased', + value: '😈', + }, + { + field: 'trusted', + operator: 'included', + type: 'exact_cased', + value: 'true', + }, + ], + field: 'file.signature', + type: 'nested', + }, + ], + }, + { + type: 'simple', + entries: [ + { + field: 'actingProcess.file.signer', + operator: 'included', + type: 'exact_cased', + value: 'Another signer', + }, { entries: [ { @@ -280,7 +309,7 @@ export default function (providerContext: FtrProviderContext) { it('should download an artifact from cache', async () => { await supertestWithoutAuth .get( - '/api/endpoint/artifacts/download/endpoint-exceptionlist-linux-v1/d2a9c760005b08d43394e59a8701ae75c80881934ccf15a006944452b80f7f9f' + '/api/endpoint/artifacts/download/endpoint-exceptionlist-windows-v1/8d2bcc37e82fad5d06e2c9e4bd96793ea8905ace1d528a57d0d0579ecc8c647e' ) .set('kbn-xsrf', 'xxx') .set('authorization', `ApiKey ${agentAccessAPIKey}`) @@ -292,22 +321,24 @@ export default function (providerContext: FtrProviderContext) { .then(async () => { await supertestWithoutAuth .get( - '/api/endpoint/artifacts/download/endpoint-exceptionlist-linux-v1/d2a9c760005b08d43394e59a8701ae75c80881934ccf15a006944452b80f7f9f' + '/api/endpoint/artifacts/download/endpoint-exceptionlist-windows-v1/8d2bcc37e82fad5d06e2c9e4bd96793ea8905ace1d528a57d0d0579ecc8c647e' ) .set('kbn-xsrf', 'xxx') .set('authorization', `ApiKey ${agentAccessAPIKey}`) .send() .expect(200) .expect((response) => { + expect(response.body.byteLength).to.equal(191); const encodedHash = createHash('sha256').update(response.body).digest('hex'); expect(encodedHash).to.equal( - '5caaeabcb7864d47157fc7c28d5a7398b4f6bbaaa565d789c02ee809253b7613' + '73015ee5131dabd1b48aa4776d3e766d836f8dd8c9fa8999c9b931f60027f07f' ); const decodedBody = inflateSync(response.body); const decodedHash = createHash('sha256').update(decodedBody).digest('hex'); expect(decodedHash).to.equal( - 'd2a9c760005b08d43394e59a8701ae75c80881934ccf15a006944452b80f7f9f' + '8d2bcc37e82fad5d06e2c9e4bd96793ea8905ace1d528a57d0d0579ecc8c647e' ); + expect(decodedBody.byteLength).to.equal(704); const artifactJson = JSON.parse(decodedBody.toString()); expect(artifactJson).to.eql({ entries: [ @@ -320,6 +351,35 @@ export default function (providerContext: FtrProviderContext) { type: 'exact_cased', value: 'Elastic, N.V.', }, + { + entries: [ + { + field: 'signer', + operator: 'included', + type: 'exact_cased', + value: '😈', + }, + { + field: 'trusted', + operator: 'included', + type: 'exact_cased', + value: 'true', + }, + ], + field: 'file.signature', + type: 'nested', + }, + ], + }, + { + type: 'simple', + entries: [ + { + field: 'actingProcess.file.signer', + operator: 'included', + type: 'exact_cased', + value: 'Another signer', + }, { entries: [ { From 7314c1ba8fe896473de9b1a081ee8c3133eb7075 Mon Sep 17 00:00:00 2001 From: Kevin Logan <56395104+kevinlog@users.noreply.github.com> Date: Tue, 28 Jul 2020 23:05:52 -0400 Subject: [PATCH 105/126] [SECURITY_SOLUTION] Task/add detections rule text (#73596) --- .../view/policy_forms/protections/malware.tsx | 29 ++++++++++++++++++- .../components/endpoint_notice/index.tsx | 4 +-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx index dee1e27782e69..84d4bf5355cd9 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx @@ -7,9 +7,18 @@ import React, { useCallback, useMemo } from 'react'; import { useDispatch } from 'react-redux'; import styled from 'styled-components'; -import { EuiRadio, EuiSwitch, EuiTitle, EuiSpacer, htmlIdGenerator } from '@elastic/eui'; +import { + EuiRadio, + EuiSwitch, + EuiTitle, + EuiSpacer, + htmlIdGenerator, + EuiCallOut, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; +import { APP_ID } from '../../../../../../../common/constants'; +import { SecurityPageName } from '../../../../../../app/types'; import { Immutable, ProtectionModes } from '../../../../../../../common/endpoint/types'; import { OS, MalwareProtectionOSes } from '../../../types'; @@ -17,6 +26,7 @@ import { ConfigForm } from '../config_form'; import { policyConfig } from '../../../store/policy_details/selectors'; import { usePolicyDetailsSelector } from '../../policy_hooks'; import { clone } from '../../../models/policy_details_config'; +import { LinkToApp } from '../../../../../../common/components/endpoint/link_to_app'; const ProtectionRadioGroup = styled.div` display: flex; @@ -177,6 +187,23 @@ export const MalwareProtections = React.memo(() => { rightCorner={protectionSwitch} > {radioButtons} + + + + + + ), + }} + /> + ); }); diff --git a/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx b/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx index 7170412cb55ad..1d726a7dbd901 100644 --- a/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx @@ -33,7 +33,7 @@ export const EndpointNotice = memo<{ onDismiss: () => void }>(({ onDismiss }) => } @@ -49,7 +49,7 @@ export const EndpointNotice = memo<{ onDismiss: () => void }>(({ onDismiss }) => From 7059270ce975e2b142a2f6238857dd24cc9446b8 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Tue, 28 Jul 2020 22:09:04 -0500 Subject: [PATCH 106/126] [deb/rpm] fix config folder path (#73001) Co-authored-by: Elastic Machine Co-authored-by: Tyler Smalley --- docs/setup/production.asciidoc | 2 +- .../config/deprecation/core_deprecations.test.ts | 2 +- .../server/config/deprecation/core_deprecations.ts | 2 +- src/core/server/path/index.ts | 10 +++++++--- src/dev/build/tasks/bin/scripts/kibana-keystore | 2 +- .../build/tasks/bin/scripts/kibana-keystore.bat | 4 ++-- src/dev/build/tasks/bin/scripts/kibana-plugin | 2 +- src/dev/build/tasks/bin/scripts/kibana-plugin.bat | 4 ++-- src/dev/build/tasks/bin/scripts/kibana.bat | 4 ++-- .../os_packages/package_scripts/post_install.sh | 14 ++++++++++++++ .../service_templates/sysv/etc/default/kibana | 2 +- 11 files changed, 33 insertions(+), 15 deletions(-) diff --git a/docs/setup/production.asciidoc b/docs/setup/production.asciidoc index afb4b37df6a28..23dbb3346b7ef 100644 --- a/docs/setup/production.asciidoc +++ b/docs/setup/production.asciidoc @@ -167,7 +167,7 @@ These can be used to automatically update the list of hosts as a cluster is resi Kibana has a default maximum memory limit of 1.4 GB, and in most cases, we recommend leaving this unconfigured. In some scenarios, such as large reporting jobs, it may make sense to tweak limits to meet more specific requirements. -You can modify this limit by setting `--max-old-space-size` in the `node.options` config file that can be found inside `kibana/config` folder or any other configured with the environment variable `KIBANA_PATH_CONF` (for example in debian based system would be `/etc/kibana`). +You can modify this limit by setting `--max-old-space-size` in the `node.options` config file that can be found inside `kibana/config` folder or any other configured with the environment variable `KBN_PATH_CONF` (for example in debian based system would be `/etc/kibana`). The option accepts a limit in MB: -------- diff --git a/src/core/server/config/deprecation/core_deprecations.test.ts b/src/core/server/config/deprecation/core_deprecations.test.ts index ebdb6f1c88b16..adf0f52339366 100644 --- a/src/core/server/config/deprecation/core_deprecations.test.ts +++ b/src/core/server/config/deprecation/core_deprecations.test.ts @@ -51,7 +51,7 @@ describe('core deprecations', () => { const { messages } = applyCoreDeprecations(); expect(messages).toMatchInlineSnapshot(` Array [ - "Environment variable CONFIG_PATH is deprecated. It has been replaced with KIBANA_PATH_CONF pointing to a config folder", + "Environment variable CONFIG_PATH is deprecated. It has been replaced with KBN_PATH_CONF pointing to a config folder", ] `); }); diff --git a/src/core/server/config/deprecation/core_deprecations.ts b/src/core/server/config/deprecation/core_deprecations.ts index 715f5b883139f..6cc0e5ef138d5 100644 --- a/src/core/server/config/deprecation/core_deprecations.ts +++ b/src/core/server/config/deprecation/core_deprecations.ts @@ -23,7 +23,7 @@ import { ConfigDeprecationProvider, ConfigDeprecation } from './types'; const configPathDeprecation: ConfigDeprecation = (settings, fromPath, log) => { if (has(process.env, 'CONFIG_PATH')) { log( - `Environment variable CONFIG_PATH is deprecated. It has been replaced with KIBANA_PATH_CONF pointing to a config folder` + `Environment variable CONFIG_PATH is deprecated. It has been replaced with KBN_PATH_CONF pointing to a config folder` ); } return settings; diff --git a/src/core/server/path/index.ts b/src/core/server/path/index.ts index 1bb650518c47a..7c1a81643fbc8 100644 --- a/src/core/server/path/index.ts +++ b/src/core/server/path/index.ts @@ -25,14 +25,18 @@ import { fromRoot } from '../utils'; const isString = (v: any): v is string => typeof v === 'string'; const CONFIG_PATHS = [ + process.env.KBN_PATH_CONF && join(process.env.KBN_PATH_CONF, 'kibana.yml'), process.env.KIBANA_PATH_CONF && join(process.env.KIBANA_PATH_CONF, 'kibana.yml'), process.env.CONFIG_PATH, // deprecated fromRoot('config/kibana.yml'), ].filter(isString); -const CONFIG_DIRECTORIES = [process.env.KIBANA_PATH_CONF, fromRoot('config'), '/etc/kibana'].filter( - isString -); +const CONFIG_DIRECTORIES = [ + process.env.KBN_PATH_CONF, + process.env.KIBANA_PATH_CONF, + fromRoot('config'), + '/etc/kibana', +].filter(isString); const DATA_PATHS = [ process.env.DATA_PATH, // deprecated diff --git a/src/dev/build/tasks/bin/scripts/kibana-keystore b/src/dev/build/tasks/bin/scripts/kibana-keystore index f83df118d24e8..d811e70095548 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-keystore +++ b/src/dev/build/tasks/bin/scripts/kibana-keystore @@ -14,7 +14,7 @@ while [ -h "$SCRIPT" ] ; do done DIR="$(dirname "${SCRIPT}")/.." -CONFIG_DIR=${KIBANA_PATH_CONF:-"$DIR/config"} +CONFIG_DIR=${KBN_PATH_CONF:-"$DIR/config"} NODE="${DIR}/node/bin/node" test -x "$NODE" if [ ! -x "$NODE" ]; then diff --git a/src/dev/build/tasks/bin/scripts/kibana-keystore.bat b/src/dev/build/tasks/bin/scripts/kibana-keystore.bat index 389eb5bf488e4..7e227141c8ba3 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-keystore.bat +++ b/src/dev/build/tasks/bin/scripts/kibana-keystore.bat @@ -12,8 +12,8 @@ If Not Exist "%NODE%" ( Exit /B 1 ) -set CONFIG_DIR=%KIBANA_PATH_CONF% -If [%KIBANA_PATH_CONF%] == [] ( +set CONFIG_DIR=%KBN_PATH_CONF% +If [%KBN_PATH_CONF%] == [] ( set CONFIG_DIR=%DIR%\config ) diff --git a/src/dev/build/tasks/bin/scripts/kibana-plugin b/src/dev/build/tasks/bin/scripts/kibana-plugin index f1102e1ef5a32..f4486e9cf85fb 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-plugin +++ b/src/dev/build/tasks/bin/scripts/kibana-plugin @@ -14,7 +14,7 @@ while [ -h "$SCRIPT" ] ; do done DIR="$(dirname "${SCRIPT}")/.." -CONFIG_DIR=${KIBANA_PATH_CONF:-"$DIR/config"} +CONFIG_DIR=${KBN_PATH_CONF:-"$DIR/config"} NODE="${DIR}/node/bin/node" test -x "$NODE" if [ ! -x "$NODE" ]; then diff --git a/src/dev/build/tasks/bin/scripts/kibana-plugin.bat b/src/dev/build/tasks/bin/scripts/kibana-plugin.bat index 6815b1b9eab8c..4fb30977fda06 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-plugin.bat +++ b/src/dev/build/tasks/bin/scripts/kibana-plugin.bat @@ -13,8 +13,8 @@ If Not Exist "%NODE%" ( Exit /B 1 ) -set CONFIG_DIR=%KIBANA_PATH_CONF% -If [%KIBANA_PATH_CONF%] == [] ( +set CONFIG_DIR=%KBN_PATH_CONF% +If [%KBN_PATH_CONF%] == [] ( set CONFIG_DIR=%DIR%\config ) diff --git a/src/dev/build/tasks/bin/scripts/kibana.bat b/src/dev/build/tasks/bin/scripts/kibana.bat index d3edc92f110a5..98dd9ec05a48c 100755 --- a/src/dev/build/tasks/bin/scripts/kibana.bat +++ b/src/dev/build/tasks/bin/scripts/kibana.bat @@ -14,8 +14,8 @@ If Not Exist "%NODE%" ( Exit /B 1 ) -set CONFIG_DIR=%KIBANA_PATH_CONF% -If [%KIBANA_PATH_CONF%] == [] ( +set CONFIG_DIR=%KBN_PATH_CONF% +If [%KBN_PATH_CONF%] == [] ( set CONFIG_DIR=%DIR%\config ) diff --git a/src/dev/build/tasks/os_packages/package_scripts/post_install.sh b/src/dev/build/tasks/os_packages/package_scripts/post_install.sh index c49b291d1a0c9..1c679bdb40b59 100644 --- a/src/dev/build/tasks/os_packages/package_scripts/post_install.sh +++ b/src/dev/build/tasks/os_packages/package_scripts/post_install.sh @@ -31,6 +31,10 @@ case $1 in --ingroup "<%= group %>" --shell /bin/false "<%= user %>" fi + if [ -n "$2" ]; then + IS_UPGRADE=true + fi + set_access ;; abort-deconfigure|abort-upgrade|abort-remove) @@ -47,6 +51,10 @@ case $1 in -c "kibana service user" "<%= user %>" fi + if [ "$1" = "2" ]; then + IS_UPGRADE=true + fi + set_access ;; @@ -55,3 +63,9 @@ case $1 in exit 1 ;; esac + +if [ "$IS_UPGRADE" = "true" ]; then + if command -v systemctl >/dev/null; then + systemctl daemon-reload + fi +fi diff --git a/src/dev/build/tasks/os_packages/service_templates/sysv/etc/default/kibana b/src/dev/build/tasks/os_packages/service_templates/sysv/etc/default/kibana index 092dc6482fa1d..ee019d348ed97 100644 --- a/src/dev/build/tasks/os_packages/service_templates/sysv/etc/default/kibana +++ b/src/dev/build/tasks/os_packages/service_templates/sysv/etc/default/kibana @@ -12,4 +12,4 @@ KILL_ON_STOP_TIMEOUT=0 BABEL_CACHE_PATH="/var/lib/kibana/optimize/.babel_register_cache.json" -KIBANA_PATH_CONF="/etc/kibana" +KBN_PATH_CONF="/etc/kibana" From e64573231905158121187f07f8aadc26ba4ac287 Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Tue, 28 Jul 2020 23:27:14 -0400 Subject: [PATCH 107/126] [Security Solution][Exceptions] - Update rule.exceptions_list to include exception list list_id (#73349) ## Summary This PR addresses the following: - Adds `list_id` to `rule.exceptions_list` - this is needed in a number of features - Updated `getExceptions` in `x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts` to use the latest exception item find endpoint that accepts an array of lists (previously was looping through lists and conducting a `find` for each) - Updated prepackaged rule that makes reference to global endpoint list to include `list_id` - Updates `formatAboutStepData` in `x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts` to include exception list `list_id` --- .../hooks/use_exception_list.test.ts | 28 +++++++--- .../plugins/lists/public/exceptions/types.ts | 1 + .../add_prepackged_rules_schema.test.ts | 5 +- .../request/create_rules_schema.test.ts | 5 +- .../request/import_rules_schema.test.ts | 5 +- .../request/patch_rules_schema.test.ts | 5 +- .../request/update_rules_schema.test.ts | 5 +- .../schemas/types/lists.mock.ts | 9 ++- .../schemas/types/lists.test.ts | 10 ++-- .../detection_engine/schemas/types/lists.ts | 5 +- ...se_fetch_or_create_rule_exception_list.tsx | 1 + .../exceptions/viewer/index.test.tsx | 2 + .../components/exceptions/viewer/index.tsx | 2 - .../rules/all/__mocks__/mock.ts | 7 --- .../rules/create/helpers.test.ts | 31 ++++------- .../detection_engine/rules/create/helpers.ts | 7 ++- .../detection_engine/rules/details/index.tsx | 4 +- .../prepackaged_rules/elastic_endpoint.json | 14 ++--- .../prepackaged_rules/external_alerts.json | 9 +-- .../detection_engine/signals/utils.test.ts | 55 ++++++++----------- .../lib/detection_engine/signals/utils.ts | 49 +++++------------ 21 files changed, 122 insertions(+), 137 deletions(-) diff --git a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.test.ts b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.test.ts index 918397d01ce2c..f678ed4faeeda 100644 --- a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.test.ts +++ b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.test.ts @@ -41,7 +41,9 @@ describe('useExceptionList', () => { useExceptionList({ filterOptions: { filter: '', tags: [] }, http: mockKibanaHttpService, - lists: [{ id: 'myListId', namespaceType: 'single', type: 'detection' }], + lists: [ + { id: 'myListId', listId: 'list_id', namespaceType: 'single', type: 'detection' }, + ], onError: onErrorMock, pagination: { page: 1, @@ -76,7 +78,9 @@ describe('useExceptionList', () => { useExceptionList({ filterOptions: { filter: '', tags: [] }, http: mockKibanaHttpService, - lists: [{ id: 'myListId', namespaceType: 'single', type: 'detection' }], + lists: [ + { id: 'myListId', listId: 'list_id', namespaceType: 'single', type: 'detection' }, + ], onError: onErrorMock, onSuccess: onSuccessMock, pagination: { @@ -131,7 +135,9 @@ describe('useExceptionList', () => { initialProps: { filterOptions: { filter: '', tags: [] }, http: mockKibanaHttpService, - lists: [{ id: 'myListId', namespaceType: 'single', type: 'detection' }], + lists: [ + { id: 'myListId', listId: 'list_id', namespaceType: 'single', type: 'detection' }, + ], onError: onErrorMock, onSuccess: onSuccessMock, pagination: { @@ -146,7 +152,9 @@ describe('useExceptionList', () => { rerender({ filterOptions: { filter: '', tags: [] }, http: mockKibanaHttpService, - lists: [{ id: 'newListId', namespaceType: 'single', type: 'detection' }], + lists: [ + { id: 'newListId', listId: 'new_list_id', namespaceType: 'single', type: 'detection' }, + ], onError: onErrorMock, onSuccess: onSuccessMock, pagination: { @@ -173,7 +181,9 @@ describe('useExceptionList', () => { useExceptionList({ filterOptions: { filter: '', tags: [] }, http: mockKibanaHttpService, - lists: [{ id: 'myListId', namespaceType: 'single', type: 'detection' }], + lists: [ + { id: 'myListId', listId: 'list_id', namespaceType: 'single', type: 'detection' }, + ], onError: onErrorMock, pagination: { page: 1, @@ -210,7 +220,9 @@ describe('useExceptionList', () => { useExceptionList({ filterOptions: { filter: '', tags: [] }, http: mockKibanaHttpService, - lists: [{ id: 'myListId', namespaceType: 'single', type: 'detection' }], + lists: [ + { id: 'myListId', listId: 'list_id', namespaceType: 'single', type: 'detection' }, + ], onError: onErrorMock, pagination: { page: 1, @@ -238,7 +250,9 @@ describe('useExceptionList', () => { useExceptionList({ filterOptions: { filter: '', tags: [] }, http: mockKibanaHttpService, - lists: [{ id: 'myListId', namespaceType: 'single', type: 'detection' }], + lists: [ + { id: 'myListId', listId: 'list_id', namespaceType: 'single', type: 'detection' }, + ], onError: onErrorMock, pagination: { page: 1, diff --git a/x-pack/plugins/lists/public/exceptions/types.ts b/x-pack/plugins/lists/public/exceptions/types.ts index f99323b384781..c0ec72e1c19eb 100644 --- a/x-pack/plugins/lists/public/exceptions/types.ts +++ b/x-pack/plugins/lists/public/exceptions/types.ts @@ -60,6 +60,7 @@ export interface UseExceptionListProps { export interface ExceptionIdentifiers { id: string; + listId: string; namespaceType: NamespaceType; type: ExceptionListType; } diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackged_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackged_rules_schema.test.ts index 5fd2c3dbbf894..3cad48ec18fc1 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackged_rules_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/add_prepackged_rules_schema.test.ts @@ -1446,11 +1446,13 @@ describe('add prepackaged rules schema', () => { exceptions_list: [ { id: 'some_uuid', + list_id: 'list_id_single', namespace_type: 'single', type: 'detection', }, { - id: 'some_uuid', + id: 'endpoint_list', + list_id: 'endpoint_list', namespace_type: 'agnostic', type: 'endpoint', }, @@ -1535,6 +1537,7 @@ describe('add prepackaged rules schema', () => { const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "exceptions_list,list_id"', 'Invalid value "undefined" supplied to "exceptions_list,type"', 'Invalid value "not a namespace type" supplied to "exceptions_list,namespace_type"', ]); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts index 71f3964956249..c2c2f4784f2b5 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts @@ -1513,11 +1513,13 @@ describe('create rules schema', () => { exceptions_list: [ { id: 'some_uuid', + list_id: 'list_id_single', namespace_type: 'single', type: 'detection', }, { - id: 'some_uuid', + id: 'endpoint_list', + list_id: 'endpoint_list', namespace_type: 'agnostic', type: 'endpoint', }, @@ -1600,6 +1602,7 @@ describe('create rules schema', () => { const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "exceptions_list,list_id"', 'Invalid value "undefined" supplied to "exceptions_list,type"', 'Invalid value "not a namespace type" supplied to "exceptions_list,namespace_type"', ]); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts index 828626ef26d6f..00a3f2126f44a 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts @@ -1642,11 +1642,13 @@ describe('import rules schema', () => { exceptions_list: [ { id: 'some_uuid', + list_id: 'list_id_single', namespace_type: 'single', type: 'detection', }, { - id: 'some_uuid', + id: 'endpoint_list', + list_id: 'endpoint_list', namespace_type: 'agnostic', type: 'endpoint', }, @@ -1730,6 +1732,7 @@ describe('import rules schema', () => { const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "exceptions_list,list_id"', 'Invalid value "undefined" supplied to "exceptions_list,type"', 'Invalid value "not a namespace type" supplied to "exceptions_list,namespace_type"', ]); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.test.ts index e75aff1abe3e9..e4fc53b934f58 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.test.ts @@ -1176,11 +1176,13 @@ describe('patch_rules_schema', () => { exceptions_list: [ { id: 'some_uuid', + list_id: 'list_id_single', namespace_type: 'single', type: 'detection', }, { - id: 'some_uuid', + id: 'endpoint_list', + list_id: 'endpoint_list', namespace_type: 'agnostic', type: 'endpoint', }, @@ -1251,6 +1253,7 @@ describe('patch_rules_schema', () => { const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "exceptions_list,list_id"', 'Invalid value "undefined" supplied to "exceptions_list,type"', 'Invalid value "not a namespace type" supplied to "exceptions_list,namespace_type"', 'Invalid value "[{"id":"uuid_here","namespace_type":"not a namespace type"}]" supplied to "exceptions_list"', diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts index d18d2d91b963c..024198d783048 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts @@ -1448,11 +1448,13 @@ describe('update rules schema', () => { exceptions_list: [ { id: 'some_uuid', + list_id: 'list_id_single', namespace_type: 'single', type: 'detection', }, { - id: 'some_uuid', + id: 'endpoint_list', + list_id: 'endpoint_list', namespace_type: 'agnostic', type: 'endpoint', }, @@ -1534,6 +1536,7 @@ describe('update rules schema', () => { const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "undefined" supplied to "exceptions_list,list_id"', 'Invalid value "undefined" supplied to "exceptions_list,type"', 'Invalid value "not a namespace type" supplied to "exceptions_list,namespace_type"', ]); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists.mock.ts index 0c7853bc3c08a..fec7548811820 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists.mock.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists.mock.ts @@ -4,17 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ import { List, ListArray } from './lists'; +import { ENDPOINT_LIST_ID } from '../../../shared_imports'; export const getListMock = (): List => ({ id: 'some_uuid', + list_id: 'list_id_single', namespace_type: 'single', type: 'detection', }); -export const getListAgnosticMock = (): List => ({ - id: 'some_uuid', +export const getEndpointListMock = (): List => ({ + id: ENDPOINT_LIST_ID, + list_id: ENDPOINT_LIST_ID, namespace_type: 'agnostic', type: 'endpoint', }); -export const getListArrayMock = (): ListArray => [getListMock(), getListAgnosticMock()]; +export const getListArrayMock = (): ListArray => [getListMock(), getEndpointListMock()]; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists.test.ts index 56ee4630996fd..7a2c167bfd855 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists.test.ts @@ -9,7 +9,7 @@ import { left } from 'fp-ts/lib/Either'; import { foldLeftRight, getPaths } from '../../../test_utils'; -import { getListAgnosticMock, getListMock, getListArrayMock } from './lists.mock'; +import { getEndpointListMock, getListMock, getListArrayMock } from './lists.mock'; import { List, ListArray, @@ -31,7 +31,7 @@ describe('Lists', () => { }); test('it should validate a list with "namespace_type" of "agnostic"', () => { - const payload = getListAgnosticMock(); + const payload = getEndpointListMock(); const decoded = list.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -91,7 +91,7 @@ describe('Lists', () => { const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "1" supplied to "Array<{| id: string, type: "detection" | "endpoint", namespace_type: "agnostic" | "single" |}>"', + 'Invalid value "1" supplied to "Array<{| id: NonEmptyString, list_id: NonEmptyString, type: "detection" | "endpoint", namespace_type: "agnostic" | "single" |}>"', ]); expect(message.schema).toEqual({}); }); @@ -122,8 +122,8 @@ describe('Lists', () => { const message = pipe(decoded, foldLeftRight); expect(getPaths(left(message.errors))).toEqual([ - 'Invalid value "1" supplied to "(Array<{| id: string, type: "detection" | "endpoint", namespace_type: "agnostic" | "single" |}> | undefined)"', - 'Invalid value "[1]" supplied to "(Array<{| id: string, type: "detection" | "endpoint", namespace_type: "agnostic" | "single" |}> | undefined)"', + 'Invalid value "1" supplied to "(Array<{| id: NonEmptyString, list_id: NonEmptyString, type: "detection" | "endpoint", namespace_type: "agnostic" | "single" |}> | undefined)"', + 'Invalid value "[1]" supplied to "(Array<{| id: NonEmptyString, list_id: NonEmptyString, type: "detection" | "endpoint", namespace_type: "agnostic" | "single" |}> | undefined)"', ]); expect(message.schema).toEqual({}); }); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists.ts index e5aaee6d3ec74..fecdd0761aade 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/lists.ts @@ -8,9 +8,12 @@ import * as t from 'io-ts'; import { exceptionListType, namespaceType } from '../../../shared_imports'; +import { NonEmptyString } from './non_empty_string'; + export const list = t.exact( t.type({ - id: t.string, + id: NonEmptyString, + list_id: NonEmptyString, type: exceptionListType, namespace_type: namespaceType, }) diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/use_fetch_or_create_rule_exception_list.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/use_fetch_or_create_rule_exception_list.tsx index 2a5ef7b21b519..0d367e03a799f 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/use_fetch_or_create_rule_exception_list.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/use_fetch_or_create_rule_exception_list.tsx @@ -102,6 +102,7 @@ export const useFetchOrCreateRuleExceptionList = ({ const newExceptionListReference = { id: newExceptionList.id, + list_id: newExceptionList.list_id, type: newExceptionList.type, namespace_type: newExceptionList.namespace_type, }; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx index 986f27f6495ec..84613d1c73536 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx @@ -72,6 +72,7 @@ describe('ExceptionsViewer', () => { exceptionListsMeta={[ { id: '5b543420', + listId: 'list_id', type: 'endpoint', namespaceType: 'single', }, @@ -124,6 +125,7 @@ describe('ExceptionsViewer', () => { exceptionListsMeta={[ { id: '5b543420', + listId: 'list_id', type: 'endpoint', namespaceType: 'single', }, diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx index 16eaef4136983..7f4d825276406 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx @@ -176,8 +176,6 @@ const ExceptionsViewerComponent = ({ const handleEditException = useCallback( (exception: ExceptionListItemSchema): void => { - // TODO: Added this just for testing. Update - // modal state logic as needed once ready dispatch({ type: 'updateExceptionToEdit', exception, diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/__mocks__/mock.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/__mocks__/mock.ts index 7a6b61f0dfd89..8c6e91254314e 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/__mocks__/mock.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/__mocks__/mock.ts @@ -6,7 +6,6 @@ import { esFilters } from '../../../../../../../../../../src/plugins/data/public'; import { Rule, RuleError } from '../../../../../containers/detection_engine/rules'; -import { List } from '../../../../../../../common/detection_engine/schemas/types'; import { AboutStepRule, ActionsStepRule, DefineStepRule, ScheduleStepRule } from '../../types'; import { FieldValueQueryBar } from '../../../../../components/rules/query_bar'; import { fillEmptySeverityMappings } from '../../helpers'; @@ -242,9 +241,3 @@ export const mockRules: Rule[] = [ mockRule('abe6c564-050d-45a5-aaf0-386c37dd1f61'), mockRule('63f06f34-c181-4b2d-af35-f2ace572a1ee'), ]; - -export const mockExceptionsList: List = { - namespace_type: 'single', - id: '75cd4380-cc5e-11ea-9101-5b34f44aeb44', - type: 'detection', -}; diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.test.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.test.ts index 6458d2faa2468..4f2055424ca61 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.test.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.test.ts @@ -5,9 +5,11 @@ */ import { List } from '../../../../../../common/detection_engine/schemas/types'; -import { ENDPOINT_LIST_ID } from '../../../../../shared_imports'; import { NewRule } from '../../../../containers/detection_engine/rules'; - +import { + getListMock, + getEndpointListMock, +} from '../../../../../../common/detection_engine/schemas/types/lists.mock'; import { DefineStepRuleJson, ScheduleStepRuleJson, @@ -29,19 +31,12 @@ import { } from './helpers'; import { mockDefineStepRule, - mockExceptionsList, mockQueryBar, mockScheduleStepRule, mockAboutStepRule, mockActionsStepRule, } from '../all/__mocks__/mock'; -const ENDPOINT_LIST = { - id: ENDPOINT_LIST_ID, - namespace_type: 'agnostic', - type: 'endpoint', -} as List; - describe('helpers', () => { describe('getTimeTypeValue', () => { test('returns timeObj with value 0 if no time value found', () => { @@ -391,14 +386,12 @@ describe('helpers', () => { }, [] ); - expect(result.exceptions_list).toEqual([ - { id: ENDPOINT_LIST_ID, namespace_type: 'agnostic', type: 'endpoint' }, - ]); + expect(result.exceptions_list).toEqual([getEndpointListMock()]); }); test('returns formatted object with detections exceptions_list', () => { - const result: AboutStepRuleJson = formatAboutStepData(mockData, [mockExceptionsList]); - expect(result.exceptions_list).toEqual([mockExceptionsList]); + const result: AboutStepRuleJson = formatAboutStepData(mockData, [getListMock()]); + expect(result.exceptions_list).toEqual([getListMock()]); }); test('returns formatted object with both exceptions_lists', () => { @@ -407,13 +400,13 @@ describe('helpers', () => { ...mockData, isAssociatedToEndpointList: true, }, - [mockExceptionsList] + [getListMock()] ); - expect(result.exceptions_list).toEqual([ENDPOINT_LIST, mockExceptionsList]); + expect(result.exceptions_list).toEqual([getEndpointListMock(), getListMock()]); }); test('returns formatted object with pre-existing exceptions lists', () => { - const exceptionsLists: List[] = [ENDPOINT_LIST, mockExceptionsList]; + const exceptionsLists: List[] = [getEndpointListMock(), getListMock()]; const result: AboutStepRuleJson = formatAboutStepData( { ...mockData, @@ -425,9 +418,9 @@ describe('helpers', () => { }); test('returns formatted object with pre-existing endpoint exceptions list disabled', () => { - const exceptionsLists: List[] = [ENDPOINT_LIST, mockExceptionsList]; + const exceptionsLists: List[] = [getEndpointListMock(), getListMock()]; const result: AboutStepRuleJson = formatAboutStepData(mockData, exceptionsLists); - expect(result.exceptions_list).toEqual([mockExceptionsList]); + expect(result.exceptions_list).toEqual([getListMock()]); }); test('returns formatted object with empty falsePositive and references filtered out', () => { diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts index 8b03f62fc82bd..434a33ac37722 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts @@ -177,7 +177,12 @@ export const formatAboutStepData = ( ...(isAssociatedToEndpointList ? { exceptions_list: [ - { id: ENDPOINT_LIST_ID, namespace_type: 'agnostic', type: 'endpoint' }, + { + id: ENDPOINT_LIST_ID, + list_id: ENDPOINT_LIST_ID, + namespace_type: 'agnostic', + type: 'endpoint', + }, ...detectionExceptionLists, ] as AboutStepRuleJson['exceptions_list'], } diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx index 90424e1fb9dd0..789469e981fb4 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx @@ -328,13 +328,13 @@ export const RuleDetailsPageComponent: FC = ({ lists: ExceptionIdentifiers[]; allowedExceptionListTypes: ExceptionListTypeEnum[]; }>( - (acc, { id, namespace_type, type }) => { + (acc, { id, list_id, namespace_type, type }) => { const { allowedExceptionListTypes, lists } = acc; const shouldAddEndpoint = type === ExceptionListTypeEnum.ENDPOINT && !allowedExceptionListTypes.includes(ExceptionListTypeEnum.ENDPOINT); return { - lists: [...lists, { id, namespaceType: namespace_type, type }], + lists: [...lists, { id, listId: list_id, namespaceType: namespace_type, type }], allowedExceptionListTypes: shouldAddEndpoint ? [...allowedExceptionListTypes, ExceptionListTypeEnum.ENDPOINT] : allowedExceptionListTypes, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint.json index e6a517d85db81..05601ec8ffb4c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/elastic_endpoint.json @@ -1,20 +1,17 @@ { - "author": [ - "Elastic" - ], + "author": ["Elastic"], "description": "Generates a detection alert each time an Elastic Endpoint Security alert is received. Enabling this rule allows you to immediately begin investigating your Elastic Endpoint alerts.", "enabled": true, "exceptions_list": [ { "id": "endpoint_list", + "list_id": "endpoint_list", "namespace_type": "agnostic", "type": "endpoint" } ], "from": "now-10m", - "index": [ - "logs-endpoint.alerts-*" - ], + "index": ["logs-endpoint.alerts-*"], "language": "kuery", "license": "Elastic License", "max_signals": 10000, @@ -57,10 +54,7 @@ "value": "99" } ], - "tags": [ - "Elastic", - "Endpoint" - ], + "tags": ["Elastic", "Endpoint"], "timestamp_override": "event.ingested", "type": "query", "version": 1 diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/external_alerts.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/external_alerts.json index 678ad9eb03b50..8b627c48d2904 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/external_alerts.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/external_alerts.json @@ -1,12 +1,9 @@ { - "author": [ - "Elastic" - ], + "author": ["Elastic"], "description": "Generates a detection alert for each external alert written to the configured indices. Enabling this rule allows you to immediately begin investigating external alerts in the app.", "index": [ "apm-*-transaction*", "auditbeat-*", - "endgame-*", "filebeat-*", "logs-*", "packetbeat-*", @@ -54,9 +51,7 @@ "value": "99" } ], - "tags": [ - "Elastic" - ], + "tags": ["Elastic"], "timestamp_override": "event.ingested", "type": "query", "version": 1 diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts index a610970907bf8..3c41f29625a51 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts @@ -716,26 +716,31 @@ describe('utils', () => { describe('#getExceptions', () => { test('it successfully returns array of exception list items', async () => { + listMock.getExceptionListClient = () => + (({ + findExceptionListsItem: jest.fn().mockResolvedValue({ + data: [getExceptionListItemSchemaMock()], + page: 1, + per_page: 10000, + total: 1, + }), + } as unknown) as ExceptionListClient); const client = listMock.getExceptionListClient(); const exceptions = await getExceptions({ client, lists: getListArrayMock(), }); - expect(client.getExceptionList).toHaveBeenNthCalledWith(1, { - id: 'some_uuid', - listId: undefined, - namespaceType: 'single', - }); - expect(client.getExceptionList).toHaveBeenNthCalledWith(2, { - id: 'some_uuid', - listId: undefined, - namespaceType: 'agnostic', + expect(client.findExceptionListsItem).toHaveBeenCalledWith({ + listId: ['list_id_single', 'endpoint_list'], + namespaceType: ['single', 'agnostic'], + page: 1, + perPage: 10000, + filter: [], + sortOrder: undefined, + sortField: undefined, }); - expect(exceptions).toEqual([ - getExceptionListItemSchemaMock(), - getExceptionListItemSchemaMock(), - ]); + expect(exceptions).toEqual([getExceptionListItemSchemaMock()]); }); test('it throws if "client" is undefined', async () => { @@ -747,7 +752,7 @@ describe('utils', () => { ).rejects.toThrowError('lists plugin unavailable during rule execution'); }); - test('it returns empty array if no "lists" is undefined', async () => { + test('it returns empty array if "lists" is undefined', async () => { const exceptions = await getExceptions({ client: listMock.getExceptionListClient(), lists: undefined, @@ -771,11 +776,11 @@ describe('utils', () => { ).rejects.toThrowError('unable to fetch exception list items'); }); - test('it throws if "findExceptionListItem" fails', async () => { + test('it throws if "findExceptionListsItem" fails', async () => { const err = new Error('error fetching list'); listMock.getExceptionListClient = () => (({ - findExceptionListItem: jest.fn().mockRejectedValue(err), + findExceptionListsItem: jest.fn().mockRejectedValue(err), } as unknown) as ExceptionListClient); await expect(() => @@ -786,24 +791,10 @@ describe('utils', () => { ).rejects.toThrowError('unable to fetch exception list items'); }); - test('it returns empty array if "getExceptionList" returns null', async () => { - listMock.getExceptionListClient = () => - (({ - getExceptionList: jest.fn().mockResolvedValue(null), - } as unknown) as ExceptionListClient); - - const exceptions = await getExceptions({ - client: listMock.getExceptionListClient(), - lists: undefined, - }); - - expect(exceptions).toEqual([]); - }); - - test('it returns empty array if "findExceptionListItem" returns null', async () => { + test('it returns empty array if "findExceptionListsItem" returns null', async () => { listMock.getExceptionListClient = () => (({ - findExceptionListItem: jest.fn().mockResolvedValue(null), + findExceptionListsItem: jest.fn().mockResolvedValue(null), } as unknown) as ExceptionListClient); const exceptions = await getExceptions({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts index ae4274f31e145..9519720d0bbec 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts @@ -161,43 +161,20 @@ export const getExceptions = async ({ throw new Error('lists plugin unavailable during rule execution'); } - if (lists != null) { + if (lists != null && lists.length > 0) { try { - // Gather all exception items of all exception lists linked to rule - const exceptions = await Promise.all( - lists - .map(async (list) => { - const { id, namespace_type: namespaceType } = list; - try { - // TODO update once exceptions client `findExceptionListItem` - // accepts an array of list ids - const foundList = await client.getExceptionList({ - id, - namespaceType, - listId: undefined, - }); - - if (foundList == null) { - return []; - } else { - const items = await client.findExceptionListItem({ - listId: foundList.list_id, - namespaceType, - page: 1, - perPage: MAX_EXCEPTION_LIST_SIZE, - filter: undefined, - sortOrder: undefined, - sortField: undefined, - }); - return items != null ? items.data : []; - } - } catch { - throw new Error('unable to fetch exception list items'); - } - }) - .flat() - ); - return exceptions.flat(); + const listIds = lists.map(({ list_id: listId }) => listId); + const namespaceTypes = lists.map(({ namespace_type: namespaceType }) => namespaceType); + const items = await client.findExceptionListsItem({ + listId: listIds, + namespaceType: namespaceTypes, + page: 1, + perPage: MAX_EXCEPTION_LIST_SIZE, + filter: [], + sortOrder: undefined, + sortField: undefined, + }); + return items != null ? items.data : []; } catch { throw new Error('unable to fetch exception list items'); } From 0b708e00d37341800a1e84afe32c4310e91f7b26 Mon Sep 17 00:00:00 2001 From: Brent Kimmel Date: Tue, 28 Jul 2020 23:33:30 -0400 Subject: [PATCH 108/126] [Security_Solution][Bug] Fix user name/domain to ECS structure (#73530) * The changes this tests are being ported separately to 7.9 --- .../resolver/models/process_event.test.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/resolver/models/process_event.test.ts b/x-pack/plugins/security_solution/public/resolver/models/process_event.test.ts index 7eb692851bc9b..4b1d555d0a7c3 100644 --- a/x-pack/plugins/security_solution/public/resolver/models/process_event.test.ts +++ b/x-pack/plugins/security_solution/public/resolver/models/process_event.test.ts @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { eventType, orderByTime } from './process_event'; +import { eventType, orderByTime, userInfoForProcess } from './process_event'; import { mockProcessEvent } from './process_event_test_helpers'; import { LegacyEndpointEvent, ResolverEvent } from '../../../common/endpoint/types'; @@ -24,6 +24,22 @@ describe('process event', () => { expect(eventType(event)).toEqual('processCreated'); }); }); + describe('userInfoForProcess', () => { + let event: LegacyEndpointEvent; + beforeEach(() => { + event = mockProcessEvent({ + user: { + name: 'aaa', + domain: 'bbb', + }, + }); + }); + it('returns the right user info for the process', () => { + const { name, domain } = userInfoForProcess(event)!; + expect(name).toEqual('aaa'); + expect(domain).toEqual('bbb'); + }); + }); describe('orderByTime', () => { let mock: (time: number, eventID: string) => ResolverEvent; let events: ResolverEvent[]; From 41c2967e08ba6bf7f6fe8d1f59f894c091529240 Mon Sep 17 00:00:00 2001 From: Jonathan Buttner <56361221+jonathan-buttner@users.noreply.github.com> Date: Wed, 29 Jul 2020 00:01:33 -0400 Subject: [PATCH 109/126] [Security Solution][Resolver] Handle disabled process collection (#73592) * Handling entity ids of empty string * Tests for entity id being empty * More comments * entity test * Renaming interface * Removing unneeded test Co-authored-by: Elastic Machine --- .../common/endpoint/schema/resolver.ts | 20 +-- .../components/timeline/body/helpers.test.ts | 58 ++++++- .../components/timeline/body/helpers.ts | 3 +- .../server/endpoint/routes/resolver/entity.ts | 7 + .../endpoint/routes/resolver/queries/base.ts | 3 +- .../routes/resolver/queries/children.ts | 12 ++ .../apis/index.ts | 3 +- .../apis/resolver/entity_id.ts | 156 ++++++++++++++++++ .../apis/{resolver.ts => resolver/tree.ts} | 14 +- .../services/resolver.ts | 65 +++++--- 10 files changed, 300 insertions(+), 41 deletions(-) create mode 100644 x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity_id.ts rename x-pack/test/security_solution_endpoint_api_int/apis/{resolver.ts => resolver/tree.ts} (98%) diff --git a/x-pack/plugins/security_solution/common/endpoint/schema/resolver.ts b/x-pack/plugins/security_solution/common/endpoint/schema/resolver.ts index c67ad3665d004..f3e67f84b2880 100644 --- a/x-pack/plugins/security_solution/common/endpoint/schema/resolver.ts +++ b/x-pack/plugins/security_solution/common/endpoint/schema/resolver.ts @@ -10,7 +10,7 @@ import { schema } from '@kbn/config-schema'; * Used to validate GET requests for a complete resolver tree. */ export const validateTree = { - params: schema.object({ id: schema.string() }), + params: schema.object({ id: schema.string({ minLength: 1 }) }), query: schema.object({ children: schema.number({ defaultValue: 200, min: 0, max: 10000 }), ancestors: schema.number({ defaultValue: 200, min: 0, max: 10000 }), @@ -19,7 +19,7 @@ export const validateTree = { afterEvent: schema.maybe(schema.string()), afterAlert: schema.maybe(schema.string()), afterChild: schema.maybe(schema.string()), - legacyEndpointID: schema.maybe(schema.string()), + legacyEndpointID: schema.maybe(schema.string({ minLength: 1 })), }), }; @@ -27,11 +27,11 @@ export const validateTree = { * Used to validate GET requests for non process events for a specific event. */ export const validateEvents = { - params: schema.object({ id: schema.string() }), + params: schema.object({ id: schema.string({ minLength: 1 }) }), query: schema.object({ events: schema.number({ defaultValue: 1000, min: 1, max: 10000 }), afterEvent: schema.maybe(schema.string()), - legacyEndpointID: schema.maybe(schema.string()), + legacyEndpointID: schema.maybe(schema.string({ minLength: 1 })), }), }; @@ -39,11 +39,11 @@ export const validateEvents = { * Used to validate GET requests for alerts for a specific process. */ export const validateAlerts = { - params: schema.object({ id: schema.string() }), + params: schema.object({ id: schema.string({ minLength: 1 }) }), query: schema.object({ alerts: schema.number({ defaultValue: 1000, min: 1, max: 10000 }), afterAlert: schema.maybe(schema.string()), - legacyEndpointID: schema.maybe(schema.string()), + legacyEndpointID: schema.maybe(schema.string({ minLength: 1 })), }), }; @@ -51,10 +51,10 @@ export const validateAlerts = { * Used to validate GET requests for the ancestors of a process event. */ export const validateAncestry = { - params: schema.object({ id: schema.string() }), + params: schema.object({ id: schema.string({ minLength: 1 }) }), query: schema.object({ ancestors: schema.number({ defaultValue: 200, min: 0, max: 10000 }), - legacyEndpointID: schema.maybe(schema.string()), + legacyEndpointID: schema.maybe(schema.string({ minLength: 1 })), }), }; @@ -62,11 +62,11 @@ export const validateAncestry = { * Used to validate GET requests for children of a specified process event. */ export const validateChildren = { - params: schema.object({ id: schema.string() }), + params: schema.object({ id: schema.string({ minLength: 1 }) }), query: schema.object({ children: schema.number({ defaultValue: 200, min: 1, max: 10000 }), afterChild: schema.maybe(schema.string()), - legacyEndpointID: schema.maybe(schema.string()), + legacyEndpointID: schema.maybe(schema.string({ minLength: 1 })), }), }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.test.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.test.ts index 8ba1a999e2b2a..c8adaa891610a 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.test.ts @@ -6,7 +6,13 @@ import { Ecs } from '../../../../graphql/types'; -import { eventHasNotes, eventIsPinned, getPinTooltip, stringifyEvent } from './helpers'; +import { + eventHasNotes, + eventIsPinned, + getPinTooltip, + stringifyEvent, + isInvestigateInResolverActionEnabled, +} from './helpers'; import { TimelineType } from '../../../../../common/types/timeline'; describe('helpers', () => { @@ -242,4 +248,54 @@ describe('helpers', () => { expect(eventIsPinned({ eventId, pinnedEventIds })).toEqual(false); }); }); + + describe('isInvestigateInResolverActionEnabled', () => { + it('returns false if agent.type does not equal endpoint', () => { + const data: Ecs = { _id: '1', agent: { type: ['blah'] } }; + + expect(isInvestigateInResolverActionEnabled(data)).toBeFalsy(); + }); + + it('returns false if agent.type does not have endpoint in first array index', () => { + const data: Ecs = { _id: '1', agent: { type: ['blah', 'endpoint'] } }; + + expect(isInvestigateInResolverActionEnabled(data)).toBeFalsy(); + }); + + it('returns false if process.entity_id is not defined', () => { + const data: Ecs = { _id: '1', agent: { type: ['endpoint'] } }; + + expect(isInvestigateInResolverActionEnabled(data)).toBeFalsy(); + }); + + it('returns true if agent.type has endpoint in first array index', () => { + const data: Ecs = { + _id: '1', + agent: { type: ['endpoint', 'blah'] }, + process: { entity_id: ['5'] }, + }; + + expect(isInvestigateInResolverActionEnabled(data)).toBeTruthy(); + }); + + it('returns false if multiple entity_ids', () => { + const data: Ecs = { + _id: '1', + agent: { type: ['endpoint', 'blah'] }, + process: { entity_id: ['5', '10'] }, + }; + + expect(isInvestigateInResolverActionEnabled(data)).toBeFalsy(); + }); + + it('returns false if entity_id is an empty string', () => { + const data: Ecs = { + _id: '1', + agent: { type: ['endpoint', 'blah'] }, + process: { entity_id: [''] }, + }; + + expect(isInvestigateInResolverActionEnabled(data)).toBeFalsy(); + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.ts index 067cea175c99b..6a5e25632c29b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/helpers.ts @@ -106,7 +106,8 @@ export const getEventType = (event: Ecs): Omit => { export const isInvestigateInResolverActionEnabled = (ecsData?: Ecs) => { return ( get(['agent', 'type', 0], ecsData) === 'endpoint' && - get(['process', 'entity_id'], ecsData)?.length > 0 + get(['process', 'entity_id'], ecsData)?.length === 1 && + get(['process', 'entity_id', 0], ecsData) !== '' ); }; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/entity.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/entity.ts index ae91201646103..c79bcda71de9b 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/entity.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/entity.ts @@ -70,6 +70,13 @@ export function handleEntities(): RequestHandler implements MSearchQuer } private buildQuery(ids: string | string[]): { query: JsonObject; index: string | string[] } { - const idsArray = ResolverQuery.createIdsArray(ids); + // only accept queries for entity_ids that are not an empty string + const idsArray = ResolverQuery.createIdsArray(ids).filter((id) => id !== ''); if (this.endpointID) { return { query: this.legacyQuery(this.endpointID, idsArray), index: legacyEventIndexPattern }; } diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.ts index 7fd3808662baa..d99533e23f2c2 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/children.ts @@ -74,6 +74,18 @@ export class ChildrenQuery extends ResolverQuery { ], }, }, + { + exists: { + field: 'process.entity_id', + }, + }, + { + bool: { + must_not: { + term: { 'process.entity_id': '' }, + }, + }, + }, { term: { 'event.category': 'process' }, }, diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/index.ts b/x-pack/test/security_solution_endpoint_api_int/apis/index.ts index fb11a7c52fd35..56adc2382e234 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/index.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/index.ts @@ -26,7 +26,8 @@ export default function endpointAPIIntegrationTests(providerContext: FtrProvider before(async () => { await ingestManager.setup(); }); - loadTestFile(require.resolve('./resolver')); + loadTestFile(require.resolve('./resolver/entity_id')); + loadTestFile(require.resolve('./resolver/tree')); loadTestFile(require.resolve('./metadata')); loadTestFile(require.resolve('./policy')); loadTestFile(require.resolve('./artifacts')); diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity_id.ts b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity_id.ts new file mode 100644 index 0000000000000..4f2a801377204 --- /dev/null +++ b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/entity_id.ts @@ -0,0 +1,156 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import expect from '@kbn/expect'; +import { SearchResponse } from 'elasticsearch'; +import { eventsIndexPattern } from '../../../../plugins/security_solution/common/endpoint/constants'; +import { + ResolverTree, + ResolverEntityIndex, +} from '../../../../plugins/security_solution/common/endpoint/types'; +import { FtrProviderContext } from '../../ftr_provider_context'; +import { + EndpointDocGenerator, + Event, +} from '../../../../plugins/security_solution/common/endpoint/generate_data'; +import { InsertedEvents } from '../../services/resolver'; + +export default function resolverAPIIntegrationTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const resolver = getService('resolverGenerator'); + const es = getService('es'); + const generator = new EndpointDocGenerator('resolver'); + + describe('Resolver handling of entity ids', () => { + describe('entity api', () => { + let origin: Event; + let genData: InsertedEvents; + before(async () => { + origin = generator.generateEvent({ parentEntityID: 'a' }); + origin.process.entity_id = ''; + genData = await resolver.insertEvents([origin]); + }); + + after(async () => { + await resolver.deleteData(genData); + }); + + it('excludes events that have an empty entity_id field', async () => { + // first lets get the _id of the document using the parent.process.entity_id + // then we'll use the API to search for that specific document + const res = await es.search>({ + index: genData.indices[0], + body: { + query: { + bool: { + filter: [ + { + term: { 'process.parent.entity_id': origin.process.parent!.entity_id }, + }, + ], + }, + }, + }, + }); + const { body }: { body: ResolverEntityIndex } = await supertest.get( + // using the same indices value here twice to force the query parameter to be an array + // for some reason using supertest's query() function doesn't construct a parsable array + `/api/endpoint/resolver/entity?_id=${res.body.hits.hits[0]._id}&indices=${eventsIndexPattern}&indices=${eventsIndexPattern}` + ); + expect(body).to.be.empty(); + }); + }); + + describe('children', () => { + let origin: Event; + let childNoEntityID: Event; + let childWithEntityID: Event; + let events: Event[]; + let genData: InsertedEvents; + + before(async () => { + // construct a tree with an origin and two direct children. One child will not have an entity_id. That child + // should not be returned by the backend. + origin = generator.generateEvent({ entityID: 'a' }); + childNoEntityID = generator.generateEvent({ + parentEntityID: origin.process.entity_id, + ancestry: [origin.process.entity_id], + }); + // force it to be empty + childNoEntityID.process.entity_id = ''; + + childWithEntityID = generator.generateEvent({ + entityID: 'b', + parentEntityID: origin.process.entity_id, + ancestry: [origin.process.entity_id], + }); + events = [origin, childNoEntityID, childWithEntityID]; + genData = await resolver.insertEvents(events); + }); + + after(async () => { + await resolver.deleteData(genData); + }); + + it('does not find children without a process entity_id', async () => { + const { body }: { body: ResolverTree } = await supertest + .get(`/api/endpoint/resolver/${origin.process.entity_id}`) + .expect(200); + expect(body.children.childNodes.length).to.be(1); + expect(body.children.childNodes[0].entityID).to.be(childWithEntityID.process.entity_id); + }); + }); + + describe('ancestors', () => { + let origin: Event; + let ancestor1: Event; + let ancestor2: Event; + let ancestorNoEntityID: Event; + let events: Event[]; + let genData: InsertedEvents; + + before(async () => { + // construct a tree with an origin that has two ancestors. The origin will have an empty string as one of the + // entity_ids in the ancestry array. This is to make sure that the backend will not query for that event. + ancestor2 = generator.generateEvent({ + entityID: '2', + }); + ancestor1 = generator.generateEvent({ + entityID: '1', + parentEntityID: ancestor2.process.entity_id, + ancestry: [ancestor2.process.entity_id], + }); + + // we'll insert an event that doesn't have an entity id so if the backend does search for it, it should be + // returned and our test should fail + ancestorNoEntityID = generator.generateEvent({ + ancestry: [ancestor2.process.entity_id], + }); + ancestorNoEntityID.process.entity_id = ''; + + origin = generator.generateEvent({ + entityID: 'a', + parentEntityID: ancestor1.process.entity_id, + ancestry: ['', ancestor2.process.entity_id], + }); + + events = [origin, ancestor1, ancestor2, ancestorNoEntityID]; + genData = await resolver.insertEvents(events); + }); + + after(async () => { + await resolver.deleteData(genData); + }); + + it('does not query for ancestors that have an empty string for the entity_id', async () => { + const { body }: { body: ResolverTree } = await supertest + .get(`/api/endpoint/resolver/${origin.process.entity_id}`) + .expect(200); + expect(body.ancestry.ancestors.length).to.be(1); + expect(body.ancestry.ancestors[0].entityID).to.be(ancestor2.process.entity_id); + }); + }); + }); +} diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver.ts b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts similarity index 98% rename from x-pack/test/security_solution_endpoint_api_int/apis/resolver.ts rename to x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts index 3b515f86c6761..3527e7e575c99 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts @@ -16,12 +16,12 @@ import { LegacyEndpointEvent, ResolverNodeStats, ResolverRelatedAlerts, -} from '../../../plugins/security_solution/common/endpoint/types'; +} from '../../../../plugins/security_solution/common/endpoint/types'; import { parentEntityId, eventId, -} from '../../../plugins/security_solution/common/endpoint/models/event'; -import { FtrProviderContext } from '../ftr_provider_context'; +} from '../../../../plugins/security_solution/common/endpoint/models/event'; +import { FtrProviderContext } from '../../ftr_provider_context'; import { Event, Tree, @@ -29,8 +29,8 @@ import { RelatedEventCategory, RelatedEventInfo, categoryMapping, -} from '../../../plugins/security_solution/common/endpoint/generate_data'; -import { Options, GeneratedTrees } from '../services/resolver'; +} from '../../../../plugins/security_solution/common/endpoint/generate_data'; +import { Options, GeneratedTrees } from '../../services/resolver'; /** * Check that the given lifecycle is in the resolver tree's corresponding map @@ -256,7 +256,7 @@ export default function resolverAPIIntegrationTests({ getService }: FtrProviderC ancestryArraySize: 2, }; - describe('Resolver', () => { + describe('Resolver tree', () => { before(async () => { await esArchiver.load('endpoint/resolver/api_feature'); resolverTrees = await resolver.createTrees(treeOptions); @@ -264,7 +264,7 @@ export default function resolverAPIIntegrationTests({ getService }: FtrProviderC tree = resolverTrees.trees[0]; }); after(async () => { - await resolver.deleteTrees(resolverTrees); + await resolver.deleteData(resolverTrees); // this unload is for an endgame-* index so it does not use data streams await esArchiver.unload('endpoint/resolver/api_feature'); }); diff --git a/x-pack/test/security_solution_endpoint_api_int/services/resolver.ts b/x-pack/test/security_solution_endpoint_api_int/services/resolver.ts index 7f568a2b00314..335689b804d5b 100644 --- a/x-pack/test/security_solution_endpoint_api_int/services/resolver.ts +++ b/x-pack/test/security_solution_endpoint_api_int/services/resolver.ts @@ -7,9 +7,12 @@ import { TreeOptions, Tree, EndpointDocGenerator, + Event, } from '../../../plugins/security_solution/common/endpoint/generate_data'; import { FtrProviderContext } from '../ftr_provider_context'; +const processIndex = 'logs-endpoint.events.process-default'; + /** * Options for build a resolver tree */ @@ -26,17 +29,41 @@ export interface Options extends TreeOptions { */ export interface GeneratedTrees { trees: Tree[]; - eventsIndex: string; - alertsIndex: string; + indices: string[]; +} + +/** + * Structure containing the events inserted into ES and the index they live in + */ +export interface InsertedEvents { + events: Event[]; + indices: string[]; +} + +interface BulkCreateHeader { + create: { + _index: string; + }; } export function ResolverGeneratorProvider({ getService }: FtrProviderContext) { const client = getService('es'); return { + async insertEvents( + events: Event[], + eventsIndex: string = processIndex + ): Promise { + const body = events.reduce((array: Array, doc) => { + array.push({ create: { _index: eventsIndex } }, doc); + return array; + }, []); + await client.bulk({ body, refresh: true }); + return { events, indices: [eventsIndex] }; + }, async createTrees( options: Options, - eventsIndex: string = 'logs-endpoint.events.process-default', + eventsIndex: string = processIndex, alertsIndex: string = 'logs-endpoint.alerts-default' ): Promise { const seed = options.seed || 'resolver-seed'; @@ -45,7 +72,7 @@ export function ResolverGeneratorProvider({ getService }: FtrProviderContext) { const numTrees = options.numTrees ?? 1; for (let j = 0; j < numTrees; j++) { const tree = generator.generateTree(options); - const body = tree.allEvents.reduce((array: Array>, doc) => { + const body = tree.allEvents.reduce((array: Array, doc) => { let index = eventsIndex; if (doc.event.kind === 'alert') { index = alertsIndex; @@ -60,23 +87,21 @@ export function ResolverGeneratorProvider({ getService }: FtrProviderContext) { await client.bulk({ body, refresh: true }); allTrees.push(tree); } - return { trees: allTrees, eventsIndex, alertsIndex }; + return { trees: allTrees, indices: [eventsIndex, alertsIndex] }; }, - async deleteTrees(trees: GeneratedTrees) { - /** - * The ingest manager handles creating the template for the endpoint's indices. It is using a V2 template - * with data streams. Data streams aren't included in the javascript elasticsearch client in kibana yet so we - * need to do raw requests here. Delete a data stream is slightly different than that of a regular index which - * is why we're using _data_stream here. - */ - await client.transport.request({ - method: 'DELETE', - path: `_data_stream/${trees.eventsIndex}`, - }); - await client.transport.request({ - method: 'DELETE', - path: `_data_stream/${trees.alertsIndex}`, - }); + async deleteData(genData: { indices: string[] }) { + for (const index of genData.indices) { + /** + * The ingest manager handles creating the template for the endpoint's indices. It is using a V2 template + * with data streams. Data streams aren't included in the javascript elasticsearch client in kibana yet so we + * need to do raw requests here. Delete a data stream is slightly different than that of a regular index which + * is why we're using _data_stream here. + */ + await client.transport.request({ + method: 'DELETE', + path: `_data_stream/${index}`, + }); + } }, }; } From 36d5391acc098719bdf3ef3e8636ba35000e74af Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 28 Jul 2020 23:19:36 -0500 Subject: [PATCH 110/126] [Security Solution][Detections] Value Lists Modal supports multiple exports (#73532) * Remove need for ValueListsTable Modifying columns has revealed that they should be exposed as props, at which point we have no real need for the table component. * Unroll the ActionButton component I thought this was useful when I wrote it! * Handle multiple simultaneous exports on value lists modal Instead of passing our export function to GenericDownloader, we now manage the multiple exports ourselves, and when successful we pass the blob to GenericDownloader. * tracks a list of exporting IDs instead of single ID * chains onto the export promise to set local state * Port useful table tests over to modal tests These verify that we've wired up our table actions to our API calls. A little brittle/tied to implementation, but I'd rather have them than not. * WIP: Simpler version of GenericDownloader * Replace use of GenericDownloader with simpler AutoDownload This component takes a blob and downloads it in a cross-browser-compatible manner. * Handle error when uploading value lists Converts to the try/catch/finally form as well. * Fix failing cypress test We lost this test subj during our refactor, oops * More explicit setting of global DOM function Our component fails due to this method being undefined, so we mock it out for these tests. We do not need to reset the mock as it is assigned fresh on every test. * Fixes jest failures on CI Defines a global static method in a more portable way, as the regular assignment was failing on CI as the property was readonly. * Simplify our export/delete clicks in jest tests The less we assume about the UI, the more robust these'll be. Co-authored-by: Elastic Machine --- .../auto_download.test.tsx | 35 +++++ .../auto_download.tsx | 42 ++++++ .../modal.test.tsx | 74 ++++++++++- .../value_lists_management_modal/modal.tsx | 67 ++++++---- .../table.test.tsx | 125 ------------------ .../value_lists_management_modal/table.tsx | 53 -------- .../table_helpers.tsx | 66 ++++----- .../translations.ts | 4 + 8 files changed, 220 insertions(+), 246 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/auto_download.test.tsx create mode 100644 x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/auto_download.tsx delete mode 100644 x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table.tsx diff --git a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/auto_download.test.tsx b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/auto_download.test.tsx new file mode 100644 index 0000000000000..53dcf986d395c --- /dev/null +++ b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/auto_download.test.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { mount } from 'enzyme'; + +import { globalNode } from '../../../common/mock'; +import { AutoDownload } from './auto_download'; + +describe('AutoDownload', () => { + beforeEach(() => { + // our DOM environment lacks this function that our component needs + Object.defineProperty(globalNode.window.URL, 'revokeObjectURL', { + writable: true, + value: jest.fn(), + }); + }); + + it('calls onDownload once if a blob is provided', () => { + const onDownload = jest.fn(); + mount(); + + expect(onDownload).toHaveBeenCalledTimes(1); + }); + + it('does not call onDownload if no blob is provided', () => { + const onDownload = jest.fn(); + mount(); + + expect(onDownload).not.toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/auto_download.tsx b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/auto_download.tsx new file mode 100644 index 0000000000000..9c8280bebe4fd --- /dev/null +++ b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/auto_download.tsx @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useEffect, useRef } from 'react'; +import styled from 'styled-components'; + +const InvisibleAnchor = styled.a` + display: none; +`; + +interface AutoDownloadProps { + blob: Blob | undefined; + name?: string; + onDownload?: () => void; +} + +export const AutoDownload: React.FC = ({ blob, name, onDownload }) => { + const anchorRef = useRef(null); + + useEffect(() => { + if (blob && anchorRef?.current) { + if (typeof window.navigator.msSaveOrOpenBlob === 'function') { + window.navigator.msSaveBlob(blob); + } else { + const objectURL = window.URL.createObjectURL(blob); + anchorRef.current.href = objectURL; + anchorRef.current.download = name ?? 'download.txt'; + anchorRef.current.click(); + window.URL.revokeObjectURL(objectURL); + } + + if (onDownload) { + onDownload(); + } + } + }, [blob, name, onDownload]); + + return ; +}; diff --git a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/modal.test.tsx b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/modal.test.tsx index 175882de551cb..ff743d1d5090a 100644 --- a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/modal.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/modal.test.tsx @@ -6,11 +6,38 @@ import React from 'react'; import { mount } from 'enzyme'; +import { act } from 'react-dom/test-utils'; +import { getListResponseMock } from '../../../../../lists/common/schemas/response/list_schema.mock'; +import { exportList, useDeleteList, useFindLists, ListSchema } from '../../../shared_imports'; import { TestProviders } from '../../../common/mock'; import { ValueListsModal } from './modal'; +jest.mock('../../../shared_imports', () => { + const actual = jest.requireActual('../../../shared_imports'); + + return { + ...actual, + exportList: jest.fn(), + useDeleteList: jest.fn(), + useFindLists: jest.fn(), + }; +}); + describe('ValueListsModal', () => { + beforeEach(() => { + // Do not resolve the export in tests as it causes unexpected state updates + (exportList as jest.Mock).mockImplementation(() => new Promise(() => {})); + (useFindLists as jest.Mock).mockReturnValue({ + start: jest.fn(), + result: { data: Array(3).fill(getListResponseMock()), total: 3 }, + }); + (useDeleteList as jest.Mock).mockReturnValue({ + start: jest.fn(), + result: getListResponseMock(), + }); + }); + it('renders nothing if showModal is false', () => { const container = mount( @@ -47,7 +74,7 @@ describe('ValueListsModal', () => { container.unmount(); }); - it('renders ValueListsForm and ValueListsTable', () => { + it('renders ValueListsForm and an EuiTable', () => { const container = mount( @@ -55,7 +82,50 @@ describe('ValueListsModal', () => { ); expect(container.find('ValueListsForm')).toHaveLength(1); - expect(container.find('ValueListsTable')).toHaveLength(1); + expect(container.find('EuiBasicTable')).toHaveLength(1); container.unmount(); }); + + describe('modal table actions', () => { + it('calls exportList when export is clicked', () => { + const container = mount( + + + + ); + + act(() => { + container + .find('button[data-test-subj="action-export-value-list"]') + .first() + .simulate('click'); + container.unmount(); + }); + + expect(exportList).toHaveBeenCalledWith(expect.objectContaining({ listId: 'some-list-id' })); + }); + + it('calls deleteList when delete is clicked', () => { + const deleteListMock = jest.fn(); + (useDeleteList as jest.Mock).mockReturnValue({ + start: deleteListMock, + result: getListResponseMock(), + }); + const container = mount( + + + + ); + + act(() => { + container + .find('button[data-test-subj="action-delete-value-list"]') + .first() + .simulate('click'); + container.unmount(); + }); + + expect(deleteListMock).toHaveBeenCalledWith(expect.objectContaining({ id: 'some-list-id' })); + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/modal.tsx b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/modal.tsx index dc72260439090..4921a98b38bd1 100644 --- a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/modal.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/modal.tsx @@ -6,6 +6,7 @@ import React, { useCallback, useEffect, useState } from 'react'; import { + EuiBasicTable, EuiButton, EuiModal, EuiModalBody, @@ -13,7 +14,9 @@ import { EuiModalHeader, EuiModalHeaderTitle, EuiOverlayMask, + EuiPanel, EuiSpacer, + EuiText, } from '@elastic/eui'; import { @@ -25,10 +28,10 @@ import { } from '../../../shared_imports'; import { useKibana } from '../../../common/lib/kibana'; import { useAppToasts } from '../../../common/hooks/use_app_toasts'; -import { GenericDownloader } from '../../../common/components/generic_downloader'; import * as i18n from './translations'; -import { ValueListsTable } from './table'; +import { buildColumns } from './table_helpers'; import { ValueListsForm } from './form'; +import { AutoDownload } from './auto_download'; interface ValueListsModalProps { onClose: () => void; @@ -45,8 +48,9 @@ export const ValueListsModalComponent: React.FC = ({ const { http } = useKibana().services; const { start: findLists, ...lists } = useFindLists(); const { start: deleteList, result: deleteResult } = useDeleteList(); - const [exportListId, setExportListId] = useState(); const [deletingListIds, setDeletingListIds] = useState([]); + const [exportingListIds, setExportingListIds] = useState([]); + const [exportDownload, setExportDownload] = useState<{ name?: string; blob?: Blob }>({}); const { addError, addSuccess } = useAppToasts(); const fetchLists = useCallback(() => { @@ -62,19 +66,26 @@ export const ValueListsModalComponent: React.FC = ({ ); useEffect(() => { - if (deleteResult != null && deletingListIds.length > 0) { - setDeletingListIds([...deletingListIds.filter((id) => id !== deleteResult.id)]); + if (deleteResult != null) { + setDeletingListIds((ids) => [...ids.filter((id) => id !== deleteResult.id)]); fetchLists(); } - }, [deleteResult, deletingListIds, fetchLists]); + }, [deleteResult, fetchLists]); const handleExport = useCallback( - async ({ ids }: { ids: string[] }) => - exportList({ http, listId: ids[0], signal: new AbortController().signal }), - [http] + async ({ id }: { id: string }) => { + try { + setExportingListIds((ids) => [...ids, id]); + const blob = await exportList({ http, listId: id, signal: new AbortController().signal }); + setExportDownload({ name: id, blob }); + } catch (error) { + addError(error, { title: i18n.EXPORT_ERROR }); + } finally { + setExportingListIds((ids) => [...ids.filter((_id) => _id !== id)]); + } + }, + [addError, http] ); - const handleExportClick = useCallback(({ id }: { id: string }) => setExportListId(id), []); - const handleExportComplete = useCallback(() => setExportListId(undefined), []); const handleTableChange = useCallback( ({ page: { index, size } }: { page: { index: number; size: number } }) => { @@ -121,8 +132,8 @@ export const ValueListsModalComponent: React.FC = ({ const tableItems = (lists.result?.data ?? []).map((item) => ({ ...item, - isExporting: item.id === exportListId, isDeleting: deletingListIds.includes(item.id), + isExporting: exportingListIds.includes(item.id), })); const pagination = { @@ -131,6 +142,7 @@ export const ValueListsModalComponent: React.FC = ({ totalItemCount: lists.result?.total ?? 0, hidePerPageOptions: true, }; + const columns = buildColumns(handleExport, handleDelete); return ( @@ -141,14 +153,19 @@ export const ValueListsModalComponent: React.FC = ({ - + + +

      {i18n.TABLE_TITLE}

      +
      + +
      @@ -156,12 +173,10 @@ export const ValueListsModalComponent: React.FC = ({ - setExportDownload({})} />
      ); diff --git a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table.test.tsx b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table.test.tsx deleted file mode 100644 index 2724c0a0696b6..0000000000000 --- a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table.test.tsx +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { mount } from 'enzyme'; -import { act } from 'react-dom/test-utils'; - -import { getListResponseMock } from '../../../../../lists/common/schemas/response/list_schema.mock'; -import { ListSchema } from '../../../../../lists/common/schemas/response'; -import { TestProviders } from '../../../common/mock'; -import { ValueListsTable } from './table'; -import { TableItem } from './types'; - -const buildItems = (lists: ListSchema[]): TableItem[] => - lists.map((list) => ({ - ...list, - isDeleting: false, - isExporting: false, - })); - -describe('ValueListsTable', () => { - it('renders a row for each list', () => { - const lists = Array(3).fill(getListResponseMock()); - const items = buildItems(lists); - const container = mount( - - - - ); - - expect(container.find('tbody tr')).toHaveLength(3); - }); - - it('calls onChange when pagination is modified', () => { - const lists = Array(6).fill(getListResponseMock()); - const items = buildItems(lists); - const onChange = jest.fn(); - const container = mount( - - - - ); - - act(() => { - container.find('a[data-test-subj="pagination-button-next"]').simulate('click'); - }); - - expect(onChange).toHaveBeenCalledWith( - expect.objectContaining({ page: expect.objectContaining({ index: 1 }) }) - ); - }); - - it('calls onExport when export is clicked', () => { - const lists = Array(3).fill(getListResponseMock()); - const items = buildItems(lists); - const onExport = jest.fn(); - const container = mount( - - - - ); - - act(() => { - container - .find('tbody tr') - .first() - .find('button[data-test-subj="action-export-value-list"]') - .simulate('click'); - }); - - expect(onExport).toHaveBeenCalledWith(expect.objectContaining({ id: 'some-list-id' })); - }); - - it('calls onDelete when delete is clicked', () => { - const lists = Array(3).fill(getListResponseMock()); - const items = buildItems(lists); - const onDelete = jest.fn(); - const container = mount( - - - - ); - - act(() => { - container - .find('tbody tr') - .first() - .find('button[data-test-subj="action-delete-value-list"]') - .simulate('click'); - }); - - expect(onDelete).toHaveBeenCalledWith(expect.objectContaining({ id: 'some-list-id' })); - }); -}); diff --git a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table.tsx b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table.tsx deleted file mode 100644 index a2e3b73a0abf0..0000000000000 --- a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table.tsx +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { EuiBasicTable, EuiText, EuiPanel } from '@elastic/eui'; - -import * as i18n from './translations'; -import { buildColumns } from './table_helpers'; -import { TableProps, TableItemCallback } from './types'; - -export interface ValueListsTableProps { - items: TableProps['items']; - loading: boolean; - onChange: TableProps['onChange']; - onExport: TableItemCallback; - onDelete: TableItemCallback; - pagination: Exclude; -} - -export const ValueListsTableComponent: React.FC = ({ - items, - loading, - onChange, - onExport, - onDelete, - pagination, -}) => { - const columns = buildColumns(onExport, onDelete); - return ( - - -

      {i18n.TABLE_TITLE}

      -
      - -
      - ); -}; - -ValueListsTableComponent.displayName = 'ValueListsTableComponent'; - -export const ValueListsTable = React.memo(ValueListsTableComponent); - -ValueListsTable.displayName = 'ValueListsTable'; diff --git a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table_helpers.tsx b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table_helpers.tsx index e90d106636e63..bb3a97749a11a 100644 --- a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table_helpers.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table_helpers.tsx @@ -8,40 +8,18 @@ import React from 'react'; import styled from 'styled-components'; -import { EuiButtonIcon, IconType, EuiLoadingSpinner, EuiToolTip } from '@elastic/eui'; +import { EuiButtonIcon, EuiLoadingSpinner, EuiToolTip } from '@elastic/eui'; import { ListSchema } from '../../../../../lists/common/schemas/response'; import { FormattedDate } from '../../../common/components/formatted_date'; import * as i18n from './translations'; -import { TableItem, TableItemCallback, TableProps } from './types'; +import { TableItemCallback, TableProps } from './types'; const AlignedSpinner = styled(EuiLoadingSpinner)` margin: ${({ theme }) => theme.eui.euiSizeXS}; vertical-align: middle; `; -const ActionButton: React.FC<{ - content: string; - dataTestSubj: string; - icon: IconType; - isLoading: boolean; - item: TableItem; - onClick: TableItemCallback; -}> = ({ content, dataTestSubj, icon, item, onClick, isLoading }) => ( - - {isLoading ? ( - - ) : ( - onClick(item)} - /> - )} - -); - export const buildColumns = ( onExport: TableItemCallback, onDelete: TableItemCallback @@ -70,26 +48,34 @@ export const buildColumns = ( actions: [ { render: (item) => ( - + + {item.isExporting ? ( + + ) : ( + onExport(item)} + /> + )} + ), }, { render: (item) => ( - + + {item.isDeleting ? ( + + ) : ( + onDelete(item)} + /> + )} + ), }, ], diff --git a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/translations.ts b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/translations.ts index b7b2cae7b0ad6..7063dca2341ca 100644 --- a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/translations.ts @@ -65,6 +65,10 @@ export const uploadSuccessMessage = (fileName: string) => values: { fileName }, }); +export const EXPORT_ERROR = i18n.translate('xpack.securitySolution.lists.valueListsExportError', { + defaultMessage: 'There was an error exporting the value list.', +}); + export const COLUMN_FILE_NAME = i18n.translate( 'xpack.securitySolution.lists.valueListsTable.fileNameColumn', { From 4cc87e31a2af8f40d8c6b11fb177d73120142eec Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 28 Jul 2020 23:58:47 -0500 Subject: [PATCH 111/126] Do not render descriptionless actions within an EuiCard (#73611) This updates the logic of EmptyPage to better handle these cases. Adds snapshot tests to verify. --- .../__snapshots__/index.test.tsx.snap | 36 +++++++++++++++++-- .../components/empty_page/index.test.tsx | 32 ++++++++++++----- .../common/components/empty_page/index.tsx | 15 ++------ 3 files changed, 60 insertions(+), 23 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/empty_page/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/empty_page/__snapshots__/index.test.tsx.snap index 09dcb8dc5d84e..9bf3be7b5dfa4 100644 --- a/x-pack/plugins/security_solution/public/common/components/empty_page/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/common/components/empty_page/__snapshots__/index.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`renders correctly 1`] = ` +exports[`EmptyPage component renders actions with descriptions 1`] = ` `; + +exports[`EmptyPage component renders actions without descriptions 1`] = ` + + + + Do Something + + + + } + iconType="logoSecurity" + title={ +

      + My Super Title +

      + } +/> +`; diff --git a/x-pack/plugins/security_solution/public/common/components/empty_page/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/empty_page/index.test.tsx index 8e025faefeabe..28e01eaa3eead 100644 --- a/x-pack/plugins/security_solution/public/common/components/empty_page/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/empty_page/index.test.tsx @@ -9,13 +9,27 @@ import React from 'react'; import { EmptyPage } from './index'; -test('renders correctly', () => { - const actions = { - actions: { - label: 'Do Something', - url: 'my/url/from/nowwhere', - }, - }; - const EmptyComponent = shallow(); - expect(EmptyComponent).toMatchSnapshot(); +describe('EmptyPage component', () => { + it('renders actions without descriptions', () => { + const actions = { + actions: { + label: 'Do Something', + url: 'my/url/from/nowwhere', + }, + }; + const EmptyComponent = shallow(); + expect(EmptyComponent).toMatchSnapshot(); + }); + + it('renders actions with descriptions', () => { + const actions = { + actions: { + description: 'My Description', + label: 'Do Something', + url: 'my/url/from/nowwhere', + }, + }; + const EmptyComponent = shallow(); + expect(EmptyComponent).toMatchSnapshot(); + }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/empty_page/index.tsx b/x-pack/plugins/security_solution/public/common/components/empty_page/index.tsx index 89f4b125e930c..e0db1e90374ad 100644 --- a/x-pack/plugins/security_solution/public/common/components/empty_page/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/empty_page/index.tsx @@ -51,16 +51,7 @@ const EmptyPageComponent = React.memo(({ actions, message, title .filter((a) => a.label && a.url) .map( ( - { - icon, - label, - target, - url, - descriptionTitle = false, - description = false, - onClick, - fill = true, - }, + { icon, label, target, url, descriptionTitle, description, onClick, fill = true }, idx ) => descriptionTitle != null || description != null ? ( @@ -70,8 +61,8 @@ const EmptyPageComponent = React.memo(({ actions, message, title key={`empty-page-${titles[idx]}-action`} > Date: Wed, 29 Jul 2020 09:35:37 +0300 Subject: [PATCH 112/126] [Security Solutions] Add tooltips (#73436) ## Summary This PR adds three tooltips. The first two are tooltips for the `attaching to a case` buttons. The third tooltip is for the `Upload value lists` button in the `Detections` page. **Timeline:** Screenshot 2020-07-28 at 3 08 31 PM Screenshot 2020-07-28 at 3 08 38 PM **Detections:** Screenshot 2020-07-28 at 3 19 53 PM ### Checklist Delete any items that are not applicable to this PR. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md) - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process) --- .../pages/detection_engine/rules/index.tsx | 20 ++++---- .../detection_engine/rules/translations.ts | 8 +++ .../timeline/properties/helpers.tsx | 50 +++++++++++++------ .../timeline/properties/translations.ts | 7 +++ 4 files changed, 60 insertions(+), 25 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/index.tsx index f49ee8246024a..b6f58ef7045f8 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/index.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiToolTip } from '@elastic/eui'; import React, { useCallback, useRef, useState } from 'react'; import { useHistory } from 'react-router-dom'; @@ -204,14 +204,16 @@ const RulesPageComponent: React.FC = () => { )} - - {i18n.UPLOAD_VALUE_LISTS} - + + + {i18n.UPLOAD_VALUE_LISTS} + + ( timelineTitle, ]); - return ( - - {buttonText} - + const button = useMemo( + () => ( + + {buttonText} + + ), + [compact, timelineStatus, handleClick, buttonText] + ); + return timelineStatus === TimelineStatus.draft ? ( + + {button} + + ) : ( + button ); } ); @@ -225,8 +235,8 @@ export const ExistingCase = React.memo( ? i18n.ATTACH_TO_EXISTING_CASE : i18n.ATTACH_TIMELINE_TO_EXISTING_CASE; - return ( - <> + const button = useMemo( + () => ( ( > {buttonText} - + ), + [buttonText, handleClick, timelineStatus, compact] + ); + return timelineStatus === TimelineStatus.draft ? ( + + {button} + + ) : ( + button ); } ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/translations.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/translations.ts index 34681d5ed6809..1fc3b7b00f847 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/translations.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/translations.ts @@ -151,6 +151,13 @@ export const ATTACH_TO_EXISTING_CASE = i18n.translate( } ); +export const ATTACH_TIMELINE_TO_CASE_TOOLTIP = i18n.translate( + 'xpack.securitySolution.timeline.properties.attachTimelineToCaseTooltip', + { + defaultMessage: 'Please provide a title for your timeline in order to attach it to a case', + } +); + export const STREAM_LIVE = i18n.translate( 'xpack.securitySolution.timeline.properties.streamLiveButtonLabel', { From 14144156f6069303bae882b820f0e9dcc9a608a1 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Wed, 29 Jul 2020 10:48:23 +0300 Subject: [PATCH 113/126] [Data] Query Input String manager (#72093) * improve test stability * query string input manager (needed for search demo) * docs * dashboard * Fix jest * mock fix * Allow restoring a saved query * sync url * Luke's fix to test * cleanup * lens jest tests * docs * use queryStringManager.getDefaultQuery Don't sync query to global state * Update app.test.tsx lens mock * jest fix * jest * use new api in the example * Rename state param to query to match url state * Apply changes to discover * Update src/plugins/data/public/query/query_string/index.ts Co-authored-by: Anton Dosov * Improve query string state manager * Cleanup dashboard code * Handle refresh button * Set initial dashboard state * visualize state * remove unused * docs * fix example * fix jest * fix filter app state in discover * fix maps test * jest Co-authored-by: Anton Dosov Co-authored-by: Anton Dosov Co-authored-by: Elastic Machine --- ...plugins-data-public.connecttoquerystate.md | 3 +- ...a-plugin-plugins-data-public.querystate.md | 1 + ...in-plugins-data-public.querystate.query.md | 11 ++ ...ugins-data-public.syncquerystatewithurl.md | 2 +- .../with_data_services/components/app.tsx | 15 +-- .../public/application/dashboard_app.tsx | 5 +- .../application/dashboard_app_controller.tsx | 103 +++++++----------- src/plugins/data/public/public.api.md | 102 ++++++++--------- src/plugins/data/public/query/mocks.ts | 3 + .../data/public/query/query_service.ts | 7 ++ .../data/public/query/query_string/index.ts | 20 ++++ .../query_string/query_string_manager.mock.ts | 37 +++++++ .../query_string/query_string_manager.ts | 90 +++++++++++++++ .../state_sync/connect_to_query_state.test.ts | 2 + .../state_sync/connect_to_query_state.ts | 23 +++- .../create_global_query_observable.ts | 8 ++ .../state_sync/sync_state_with_url.test.ts | 2 + .../query/state_sync/sync_state_with_url.ts | 2 +- .../data/public/query/state_sync/types.ts | 3 +- .../ui/search_bar/create_search_bar.tsx | 45 +++----- .../search_bar/lib/clear_saved_query.test.ts | 16 +-- .../ui/search_bar/lib/clear_saved_query.ts | 11 +- .../populate_state_from_saved_query.test.ts | 17 ++- .../lib/populate_state_from_saved_query.ts | 9 +- .../lib/use_query_string_manager.ts | 51 +++++++++ .../ui/search_bar/lib/use_saved_query.ts | 13 +-- .../public/application/angular/discover.html | 3 +- .../public/application/angular/discover.js | 42 ++----- .../components/scripting_help/test_script.tsx | 12 +- .../public/components/controls/filters.tsx | 4 +- .../components/visualize_top_nav.tsx | 15 +-- .../utils/use/use_editor_updates.test.ts | 6 + .../utils/use/use_editor_updates.ts | 19 +--- .../utils/use/use_visualize_app_state.test.ts | 1 + .../utils/use/use_visualize_app_state.tsx | 29 ++++- .../public/application/utils/utils.ts | 11 +- test/functional/apps/visualize/_area_chart.js | 4 + .../lens/public/app_plugin/app.test.tsx | 9 ++ x-pack/plugins/lens/public/app_plugin/app.tsx | 14 +-- .../filter_editor/filter_editor.js | 10 +- .../join_editor/resources/where_expression.js | 9 +- .../routing/bootstrap/get_initial_query.js | 12 +- .../top_nav_menu/top_nav_menu.js | 8 +- .../routing/routes/maps_app/maps_app_view.js | 5 +- .../public/routing/state_syncing/app_sync.js | 1 + 45 files changed, 478 insertions(+), 337 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.querystate.query.md create mode 100644 src/plugins/data/public/query/query_string/index.ts create mode 100644 src/plugins/data/public/query/query_string/query_string_manager.mock.ts create mode 100644 src/plugins/data/public/query/query_string/query_string_manager.ts create mode 100644 src/plugins/data/public/ui/search_bar/lib/use_query_string_manager.ts diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.connecttoquerystate.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.connecttoquerystate.md index a6731e5ef8de1..7c937b39cda87 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.connecttoquerystate.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.connecttoquerystate.md @@ -9,9 +9,10 @@ Helper to setup two-way syncing of global data and a state container Signature: ```typescript -connectToQueryState: ({ timefilter: { timefilter }, filterManager, state$, }: Pick, stateContainer: BaseStateContainer, syncConfig: { +connectToQueryState: ({ timefilter: { timefilter }, filterManager, queryString, state$, }: Pick, stateContainer: BaseStateContainer, syncConfig: { time?: boolean; refreshInterval?: boolean; filters?: FilterStateStore | boolean; + query?: boolean; }) => () => void ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.querystate.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.querystate.md index cc489a0cb0367..021d808afecb5 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.querystate.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.querystate.md @@ -17,6 +17,7 @@ export interface QueryState | Property | Type | Description | | --- | --- | --- | | [filters](./kibana-plugin-plugins-data-public.querystate.filters.md) | Filter[] | | +| [query](./kibana-plugin-plugins-data-public.querystate.query.md) | Query | | | [refreshInterval](./kibana-plugin-plugins-data-public.querystate.refreshinterval.md) | RefreshInterval | | | [time](./kibana-plugin-plugins-data-public.querystate.time.md) | TimeRange | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.querystate.query.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.querystate.query.md new file mode 100644 index 0000000000000..b0ac376a358dc --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.querystate.query.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [QueryState](./kibana-plugin-plugins-data-public.querystate.md) > [query](./kibana-plugin-plugins-data-public.querystate.query.md) + +## QueryState.query property + +Signature: + +```typescript +query?: Query; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.syncquerystatewithurl.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.syncquerystatewithurl.md index f6f8bed8cb914..1aafa022f9690 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.syncquerystatewithurl.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.syncquerystatewithurl.md @@ -9,7 +9,7 @@ Helper to setup syncing of global data with the URL Signature: ```typescript -syncQueryStateWithUrl: (query: Pick, kbnUrlStateStorage: IKbnUrlStateStorage) => { +syncQueryStateWithUrl: (query: Pick, kbnUrlStateStorage: IKbnUrlStateStorage) => { stop: () => void; hasInheritedQueryFromUrl: boolean; } diff --git a/examples/state_containers_examples/public/with_data_services/components/app.tsx b/examples/state_containers_examples/public/with_data_services/components/app.tsx index 04bdb53efa502..d007cfd97edca 100644 --- a/examples/state_containers_examples/public/with_data_services/components/app.tsx +++ b/examples/state_containers_examples/public/with_data_services/components/app.tsx @@ -17,7 +17,7 @@ * under the License. */ -import React, { useEffect, useRef, useState, useCallback } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { History } from 'history'; import { FormattedMessage, I18nProvider } from '@kbn/i18n/react'; import { Router } from 'react-router-dom'; @@ -85,16 +85,9 @@ const App = ({ navigation, data, history, kbnUrlStateStorage }: StateDemoAppDeps useGlobalStateSyncing(data.query, kbnUrlStateStorage); useAppStateSyncing(appStateContainer, data.query, kbnUrlStateStorage); - const onQuerySubmit = useCallback( - ({ query }) => { - appStateContainer.set({ ...appState, query }); - }, - [appStateContainer, appState] - ); - const indexPattern = useIndexPattern(data); if (!indexPattern) - return
      No index pattern found. Please create an intex patter before loading...
      ; + return
      No index pattern found. Please create an index patter before loading...
      ; // Render the application DOM. // Note that `navigation.ui.TopNavMenu` is a stateful component exported on the `navigation` plugin's start contract. @@ -107,8 +100,6 @@ const App = ({ navigation, data, history, kbnUrlStateStorage }: StateDemoAppDeps showSearchBar={true} indexPatterns={[indexPattern]} useDefaultBehaviors={true} - onQuerySubmit={onQuerySubmit} - query={appState.query} showSaveQuery={true} /> @@ -200,7 +191,7 @@ function useAppStateSyncing( const stopSyncingQueryAppStateWithStateContainer = connectToQueryState( query, appStateContainer, - { filters: esFilters.FilterStateStore.APP_STATE } + { filters: esFilters.FilterStateStore.APP_STATE, query: true } ); // sets up syncing app state container with url diff --git a/src/plugins/dashboard/public/application/dashboard_app.tsx b/src/plugins/dashboard/public/application/dashboard_app.tsx index f101935b9288d..6690ae318fc8f 100644 --- a/src/plugins/dashboard/public/application/dashboard_app.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app.tsx @@ -52,7 +52,10 @@ export interface DashboardAppScope extends ng.IScope { expandedPanel?: string; getShouldShowEditHelp: () => boolean; getShouldShowViewHelp: () => boolean; - updateQueryAndFetch: ({ query, dateRange }: { query: Query; dateRange?: TimeRange }) => void; + handleRefresh: ( + { query, dateRange }: { query?: Query; dateRange: TimeRange }, + isUpdate?: boolean + ) => void; topNavMenu: any; showAddPanel: any; showSaveQuery: boolean; diff --git a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx index afccf8deaa217..3a4e49968626f 100644 --- a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx @@ -25,12 +25,11 @@ import React, { useState, ReactElement } from 'react'; import ReactDOM from 'react-dom'; import angular from 'angular'; -import { Observable, pipe, Subscription } from 'rxjs'; -import { filter, map, mapTo, startWith, switchMap } from 'rxjs/operators'; +import { Observable, pipe, Subscription, merge } from 'rxjs'; +import { filter, map, debounceTime, mapTo, startWith, switchMap } from 'rxjs/operators'; import { History } from 'history'; import { SavedObjectSaveOpts } from 'src/plugins/saved_objects/public'; import { NavigationPublicPluginStart as NavigationStart } from 'src/plugins/navigation/public'; -import { TimeRange } from 'src/plugins/data/public'; import { DashboardEmptyScreen, DashboardEmptyScreenProps } from './dashboard_empty_screen'; import { @@ -38,11 +37,9 @@ import { esFilters, IndexPattern, IndexPatternsContract, - Query, QueryState, SavedQuery, syncQueryStateWithUrl, - UI_SETTINGS, } from '../../../data/public'; import { getSavedObjectFinder, SaveResult, showSaveModal } from '../../../saved_objects/public'; @@ -81,8 +78,8 @@ import { addFatalError, AngularHttpError, KibanaLegacyStart, - migrateLegacyQuery, subscribeWithScope, + migrateLegacyQuery, } from '../../../kibana_legacy/public'; export interface DashboardAppControllerDependencies extends RenderDeps { @@ -127,7 +124,6 @@ export class DashboardAppController { $route, $routeParams, dashboardConfig, - localStorage, indexPatterns, savedQueryService, embeddable, @@ -153,8 +149,8 @@ export class DashboardAppController { navigation, }: DashboardAppControllerDependencies) { const filterManager = queryService.filterManager; - const queryFilter = filterManager; const timefilter = queryService.timefilter.timefilter; + const queryStringManager = queryService.queryString; const isEmbeddedExternally = Boolean($routeParams.embed); // url param rules should only apply when embedded (e.g. url?embed=true) @@ -188,20 +184,30 @@ export class DashboardAppController { // sync initial app filters from state to filterManager // if there is an existing similar global filter, then leave it as global filterManager.setAppFilters(_.cloneDeep(dashboardStateManager.appState.filters)); + queryStringManager.setQuery(migrateLegacyQuery(dashboardStateManager.appState.query)); + // setup syncing of app filters between appState and filterManager const stopSyncingAppFilters = connectToQueryState( queryService, { - set: ({ filters }) => dashboardStateManager.setFilters(filters || []), - get: () => ({ filters: dashboardStateManager.appState.filters }), + set: ({ filters, query }) => { + dashboardStateManager.setFilters(filters || []); + dashboardStateManager.setQuery(query || queryStringManager.getDefaultQuery()); + }, + get: () => ({ + filters: dashboardStateManager.appState.filters, + query: dashboardStateManager.getQuery(), + }), state$: dashboardStateManager.appState$.pipe( map((state) => ({ filters: state.filters, + query: queryStringManager.formatQuery(state.query), })) ), }, { filters: esFilters.FilterStateStore.APP_STATE, + query: true, } ); @@ -331,7 +337,7 @@ export class DashboardAppController { const isEmptyInReadonlyMode = shouldShowUnauthorizedEmptyState(); return { id: dashboardStateManager.savedDashboard.id || '', - filters: queryFilter.getFilters(), + filters: filterManager.getFilters(), hidePanelTitles: dashboardStateManager.getHidePanelTitles(), query: $scope.model.query, timeRange: { @@ -356,7 +362,7 @@ export class DashboardAppController { // https://github.com/angular/angular.js/wiki/Understanding-Scopes $scope.model = { query: dashboardStateManager.getQuery(), - filters: queryFilter.getFilters(), + filters: filterManager.getFilters(), timeRestore: dashboardStateManager.getTimeRestore(), title: dashboardStateManager.getTitle(), description: dashboardStateManager.getDescription(), @@ -420,12 +426,12 @@ export class DashboardAppController { if ( !esFilters.compareFilters( container.getInput().filters, - queryFilter.getFilters(), + filterManager.getFilters(), esFilters.COMPARE_ALL_OPTIONS ) ) { // Add filters modifies the object passed to it, hence the clone deep. - queryFilter.addFilters(_.cloneDeep(container.getInput().filters)); + filterManager.addFilters(_.cloneDeep(container.getInput().filters)); dashboardStateManager.applyFilters( $scope.model.query, @@ -487,13 +493,8 @@ export class DashboardAppController { }); dashboardStateManager.applyFilters( - dashboardStateManager.getQuery() || { - query: '', - language: - localStorage.get('kibana.userQueryLanguage') || - uiSettings.get(UI_SETTINGS.SEARCH_QUERY_LANGUAGE), - }, - queryFilter.getFilters() + dashboardStateManager.getQuery() || queryStringManager.getDefaultQuery(), + filterManager.getFilters() ); timefilter.disableTimeRangeSelector(); @@ -567,21 +568,13 @@ export class DashboardAppController { } }; - $scope.updateQueryAndFetch = function ({ query, dateRange }) { - if (dateRange) { - timefilter.setTime(dateRange); - } - - const oldQuery = $scope.model.query; - if (_.isEqual(oldQuery, query)) { + $scope.handleRefresh = function (_payload, isUpdate) { + if (isUpdate === false) { // The user can still request a reload in the query bar, even if the // query is the same, and in that case, we have to explicitly ask for // a reload, since no state changes will cause it. lastReloadRequestTime = new Date().getTime(); refreshDashboardContainer(); - } else { - $scope.model.query = query; - dashboardStateManager.applyFilters($scope.model.query, $scope.model.filters); } }; @@ -600,7 +593,7 @@ export class DashboardAppController { // Making this method sync broke the updates. // Temporary fix, until we fix the complex state in this file. setTimeout(() => { - queryFilter.setFilters(allFilters); + filterManager.setFilters(allFilters); }, 0); }; @@ -633,11 +626,6 @@ export class DashboardAppController { $scope.indexPatterns = []; - $scope.$watch('model.query', (newQuery: Query) => { - const query = migrateLegacyQuery(newQuery) as Query; - $scope.updateQueryAndFetch({ query }); - }); - $scope.$watch( () => dashboardCapabilities.saveQuery, (newCapability) => { @@ -678,18 +666,11 @@ export class DashboardAppController { showFilterBar, indexPatterns: $scope.indexPatterns, showSaveQuery: $scope.showSaveQuery, - query: $scope.model.query, savedQuery: $scope.savedQuery, onSavedQueryIdChange, savedQueryId: dashboardStateManager.getSavedQueryId(), useDefaultBehaviors: true, - onQuerySubmit: (payload: { dateRange: TimeRange; query?: Query }): void => { - if (!payload.query) { - $scope.updateQueryAndFetch({ query: $scope.model.query, dateRange: payload.dateRange }); - } else { - $scope.updateQueryAndFetch({ query: payload.query, dateRange: payload.dateRange }); - } - }, + onQuerySubmit: $scope.handleRefresh, }; }; const dashboardNavBar = document.getElementById('dashboardChrome'); @@ -704,25 +685,11 @@ export class DashboardAppController { }; $scope.timefilterSubscriptions$ = new Subscription(); - + const timeChanges$ = merge(timefilter.getRefreshIntervalUpdate$(), timefilter.getTimeUpdate$()); $scope.timefilterSubscriptions$.add( subscribeWithScope( $scope, - timefilter.getRefreshIntervalUpdate$(), - { - next: () => { - updateState(); - refreshDashboardContainer(); - }, - }, - (error: AngularHttpError | Error | string) => addFatalError(fatalErrors, error) - ) - ); - - $scope.timefilterSubscriptions$.add( - subscribeWithScope( - $scope, - timefilter.getTimeUpdate$(), + timeChanges$, { next: () => { updateState(); @@ -1095,13 +1062,21 @@ export class DashboardAppController { updateViewMode(dashboardStateManager.getViewMode()); + const filterChanges = merge(filterManager.getUpdates$(), queryStringManager.getUpdates$()).pipe( + debounceTime(100) + ); + // update root source when filters update - const updateSubscription = queryFilter.getUpdates$().subscribe({ + const updateSubscription = filterChanges.subscribe({ next: () => { - $scope.model.filters = queryFilter.getFilters(); + $scope.model.filters = filterManager.getFilters(); + $scope.model.query = queryStringManager.getQuery(); dashboardStateManager.applyFilters($scope.model.query, $scope.model.filters); if (dashboardContainer) { - dashboardContainer.updateInput({ filters: $scope.model.filters }); + dashboardContainer.updateInput({ + filters: $scope.model.filters, + query: $scope.model.query, + }); } }, }); diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 2b904ed9536e0..97e7a96c71e69 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -199,10 +199,11 @@ export const castEsToKbnFieldTypeName: (esType: ES_FIELD_TYPES | string) => KBN_ // Warning: (ae-missing-release-tag) "connectToQueryState" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public -export const connectToQueryState: ({ timefilter: { timefilter }, filterManager, state$, }: Pick, stateContainer: BaseStateContainer, syncConfig: { +export const connectToQueryState: ({ timefilter: { timefilter }, filterManager, queryString, state$, }: Pick, stateContainer: BaseStateContainer, syncConfig: { time?: boolean; refreshInterval?: boolean; filters?: FilterStateStore | boolean; + query?: boolean; }) => () => void; // Warning: (ae-missing-release-tag) "createSavedQueryService" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -1388,6 +1389,8 @@ export interface QueryState { // (undocumented) filters?: Filter[]; // (undocumented) + query?: Query; + // (undocumented) refreshInterval?: RefreshInterval; // (undocumented) time?: TimeRange; @@ -1762,7 +1765,7 @@ export type StatefulSearchBarProps = SearchBarOwnProps & { // Warning: (ae-missing-release-tag) "syncQueryStateWithUrl" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public -export const syncQueryStateWithUrl: (query: Pick, kbnUrlStateStorage: IKbnUrlStateStorage) => { +export const syncQueryStateWithUrl: (query: Pick, kbnUrlStateStorage: IKbnUrlStateStorage) => { stop: () => void; hasInheritedQueryFromUrl: boolean; }; @@ -1864,54 +1867,53 @@ export const UI_SETTINGS: { // src/plugins/data/common/es_query/filters/match_all_filter.ts:28:3 - (ae-forgotten-export) The symbol "MatchAllFilterMeta" needs to be exported by the entry point index.d.ts // src/plugins/data/common/es_query/filters/phrase_filter.ts:33:3 - (ae-forgotten-export) The symbol "PhraseFilterMeta" needs to be exported by the entry point index.d.ts // src/plugins/data/common/es_query/filters/phrases_filter.ts:31:3 - (ae-forgotten-export) The symbol "PhrasesFilterMeta" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "FilterLabel" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "FILTERS" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "getDisplayValueFromFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "generateFilters" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "changeTimeFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "convertRangeFilterToTimeRangeString" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "extractTimeFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "extractTimeRange" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:138:21 - (ae-forgotten-export) The symbol "buildEsQuery" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:138:21 - (ae-forgotten-export) The symbol "getEsQueryConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:138:21 - (ae-forgotten-export) The symbol "luceneStringToDsl" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:138:21 - (ae-forgotten-export) The symbol "decorateQuery" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "FieldFormatsRegistry" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "BoolFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "BytesFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "ColorFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "DurationFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "IpFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "NumberFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "PercentFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "RelativeDateFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "SourceFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "StaticLookupFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "UrlFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "StringFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "validateIndexPattern" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:373:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:374:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:383:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:384:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:385:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:386:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:391:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:395:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:398:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/query/state_sync/connect_to_query_state.ts:41:60 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "FilterLabel" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "FILTERS" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "getDisplayValueFromFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "generateFilters" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "changeTimeFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "convertRangeFilterToTimeRangeString" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "extractTimeFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:136:21 - (ae-forgotten-export) The symbol "buildEsQuery" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:136:21 - (ae-forgotten-export) The symbol "getEsQueryConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:136:21 - (ae-forgotten-export) The symbol "luceneStringToDsl" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:136:21 - (ae-forgotten-export) The symbol "decorateQuery" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "FieldFormatsRegistry" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "BoolFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "BytesFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "ColorFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "DurationFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "IpFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "NumberFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "PercentFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "RelativeDateFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "SourceFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "StaticLookupFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "UrlFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "StringFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "validateIndexPattern" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:371:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:372:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:381:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:382:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:383:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:384:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:392:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:396:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/query/state_sync/connect_to_query_state.ts:45:5 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:54:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:55:5 - (ae-forgotten-export) The symbol "createFiltersFromRangeSelectAction" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:63:5 - (ae-forgotten-export) The symbol "IndexPatternSelectProps" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/public/query/mocks.ts b/src/plugins/data/public/query/mocks.ts index 41896107bb868..8c15d9d6d0152 100644 --- a/src/plugins/data/public/query/mocks.ts +++ b/src/plugins/data/public/query/mocks.ts @@ -21,6 +21,7 @@ import { Observable } from 'rxjs'; import { QueryService, QuerySetup, QueryStart } from '.'; import { timefilterServiceMock } from './timefilter/timefilter_service.mock'; import { createFilterManagerMock } from './filter_manager/filter_manager.mock'; +import { queryStringManagerMock } from './query_string/query_string_manager.mock'; type QueryServiceClientContract = PublicMethodsOf; @@ -28,6 +29,7 @@ const createSetupContractMock = () => { const setupContract: jest.Mocked = { filterManager: createFilterManagerMock(), timefilter: timefilterServiceMock.createSetupContract(), + queryString: queryStringManagerMock.createSetupContract(), state$: new Observable(), }; @@ -38,6 +40,7 @@ const createStartContractMock = () => { const startContract: jest.Mocked = { addToQueryLog: jest.fn(), filterManager: createFilterManagerMock(), + queryString: queryStringManagerMock.createStartContract(), savedQueries: jest.fn() as any, state$: new Observable(), timefilter: timefilterServiceMock.createStartContract(), diff --git a/src/plugins/data/public/query/query_service.ts b/src/plugins/data/public/query/query_service.ts index eb1f985fa51db..da514c0e24ea4 100644 --- a/src/plugins/data/public/query/query_service.ts +++ b/src/plugins/data/public/query/query_service.ts @@ -25,6 +25,7 @@ import { createAddToQueryLog } from './lib'; import { TimefilterService, TimefilterSetup } from './timefilter'; import { createSavedQueryService } from './saved_query/saved_query_service'; import { createQueryStateObservable } from './state_sync/create_global_query_observable'; +import { QueryStringManager, QueryStringContract } from './query_string'; /** * Query Service @@ -45,6 +46,7 @@ interface QueryServiceStartDependencies { export class QueryService { filterManager!: FilterManager; timefilter!: TimefilterSetup; + queryStringManager!: QueryStringContract; state$!: ReturnType; @@ -57,14 +59,18 @@ export class QueryService { storage, }); + this.queryStringManager = new QueryStringManager(storage, uiSettings); + this.state$ = createQueryStateObservable({ filterManager: this.filterManager, timefilter: this.timefilter, + queryString: this.queryStringManager, }).pipe(share()); return { filterManager: this.filterManager, timefilter: this.timefilter, + queryString: this.queryStringManager, state$: this.state$, }; } @@ -76,6 +82,7 @@ export class QueryService { uiSettings, }), filterManager: this.filterManager, + queryString: this.queryStringManager, savedQueries: createSavedQueryService(savedObjectsClient), state$: this.state$, timefilter: this.timefilter, diff --git a/src/plugins/data/public/query/query_string/index.ts b/src/plugins/data/public/query/query_string/index.ts new file mode 100644 index 0000000000000..6ea87fde69ac8 --- /dev/null +++ b/src/plugins/data/public/query/query_string/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { QueryStringContract, QueryStringManager } from './query_string_manager'; diff --git a/src/plugins/data/public/query/query_string/query_string_manager.mock.ts b/src/plugins/data/public/query/query_string/query_string_manager.mock.ts new file mode 100644 index 0000000000000..427662cb01ebb --- /dev/null +++ b/src/plugins/data/public/query/query_string/query_string_manager.mock.ts @@ -0,0 +1,37 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { QueryStringContract } from '.'; + +const createSetupContractMock = () => { + const queryStringManagerMock: jest.Mocked = { + getQuery: jest.fn(), + setQuery: jest.fn(), + getUpdates$: jest.fn(), + getDefaultQuery: jest.fn(), + formatQuery: jest.fn(), + clearQuery: jest.fn(), + }; + return queryStringManagerMock; +}; + +export const queryStringManagerMock = { + createSetupContract: createSetupContractMock, + createStartContract: createSetupContractMock, +}; diff --git a/src/plugins/data/public/query/query_string/query_string_manager.ts b/src/plugins/data/public/query/query_string/query_string_manager.ts new file mode 100644 index 0000000000000..bd02830f4aed8 --- /dev/null +++ b/src/plugins/data/public/query/query_string/query_string_manager.ts @@ -0,0 +1,90 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import _ from 'lodash'; +import { BehaviorSubject } from 'rxjs'; +import { CoreStart } from 'kibana/public'; +import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; +import { Query, UI_SETTINGS } from '../../../common'; + +export class QueryStringManager { + private query$: BehaviorSubject; + + constructor( + private readonly storage: IStorageWrapper, + private readonly uiSettings: CoreStart['uiSettings'] + ) { + this.query$ = new BehaviorSubject(this.getDefaultQuery()); + } + + private getDefaultLanguage() { + return ( + this.storage.get('kibana.userQueryLanguage') || + this.uiSettings.get(UI_SETTINGS.SEARCH_QUERY_LANGUAGE) + ); + } + + public getDefaultQuery() { + return { + query: '', + language: this.getDefaultLanguage(), + }; + } + + public formatQuery(query: Query | string | undefined): Query { + if (!query) { + return this.getDefaultQuery(); + } else if (typeof query === 'string') { + return { + query, + language: this.getDefaultLanguage(), + }; + } else { + return query; + } + } + + public getUpdates$ = () => { + return this.query$.asObservable(); + }; + + public getQuery = (): Query => { + return this.query$.getValue(); + }; + + /** + * Updates the query. + * @param {Query} query + */ + public setQuery = (query: Query) => { + const curQuery = this.query$.getValue(); + if (query?.language !== curQuery.language || query?.query !== curQuery.query) { + this.query$.next(query); + } + }; + + /** + * Resets the query to the default one. + */ + public clearQuery = () => { + this.setQuery(this.getDefaultQuery()); + }; +} + +export type QueryStringContract = PublicMethodsOf; diff --git a/src/plugins/data/public/query/state_sync/connect_to_query_state.test.ts b/src/plugins/data/public/query/state_sync/connect_to_query_state.test.ts index cf98c87b18267..307d1fe1b2b0b 100644 --- a/src/plugins/data/public/query/state_sync/connect_to_query_state.test.ts +++ b/src/plugins/data/public/query/state_sync/connect_to_query_state.test.ts @@ -48,6 +48,8 @@ setupMock.uiSettings.get.mockImplementation((key: string) => { switch (key) { case UI_SETTINGS.FILTERS_PINNED_BY_DEFAULT: return true; + case UI_SETTINGS.SEARCH_QUERY_LANGUAGE: + return 'kuery'; case 'timepicker:timeDefaults': return { from: 'now-15m', to: 'now' }; case UI_SETTINGS.TIMEPICKER_REFRESH_INTERVAL_DEFAULTS: diff --git a/src/plugins/data/public/query/state_sync/connect_to_query_state.ts b/src/plugins/data/public/query/state_sync/connect_to_query_state.ts index 2e62dac87f6ef..55edd04b5dab0 100644 --- a/src/plugins/data/public/query/state_sync/connect_to_query_state.ts +++ b/src/plugins/data/public/query/state_sync/connect_to_query_state.ts @@ -35,15 +35,24 @@ export const connectToQueryState = ( { timefilter: { timefilter }, filterManager, + queryString, state$, - }: Pick, + }: Pick, stateContainer: BaseStateContainer, - syncConfig: { time?: boolean; refreshInterval?: boolean; filters?: FilterStateStore | boolean } + syncConfig: { + time?: boolean; + refreshInterval?: boolean; + filters?: FilterStateStore | boolean; + query?: boolean; + } ) => { const syncKeys: Array = []; if (syncConfig.time) { syncKeys.push('time'); } + if (syncConfig.query) { + syncKeys.push('query'); + } if (syncConfig.refreshInterval) { syncKeys.push('refreshInterval'); } @@ -133,6 +142,9 @@ export const connectToQueryState = ( if (syncConfig.time && changes.time) { newState.time = timefilter.getTime(); } + if (syncConfig.query && changes.query) { + newState.query = queryString.getQuery(); + } if (syncConfig.refreshInterval && changes.refreshInterval) { newState.refreshInterval = timefilter.getRefreshInterval(); } @@ -173,6 +185,13 @@ export const connectToQueryState = ( } } + if (syncConfig.query) { + const curQuery = state.query || queryString.getQuery(); + if (!_.isEqual(curQuery, queryString.getQuery())) { + queryString.setQuery(_.cloneDeep(curQuery)); + } + } + if (syncConfig.filters) { const filters = state.filters || []; if (syncConfig.filters === true) { diff --git a/src/plugins/data/public/query/state_sync/create_global_query_observable.ts b/src/plugins/data/public/query/state_sync/create_global_query_observable.ts index 87032925294c6..5e2c575c74af7 100644 --- a/src/plugins/data/public/query/state_sync/create_global_query_observable.ts +++ b/src/plugins/data/public/query/state_sync/create_global_query_observable.ts @@ -24,23 +24,31 @@ import { FilterManager } from '../filter_manager'; import { QueryState, QueryStateChange } from './index'; import { createStateContainer } from '../../../../kibana_utils/public'; import { isFilterPinned, compareFilters, COMPARE_ALL_OPTIONS } from '../../../common'; +import { QueryStringContract } from '../query_string'; export function createQueryStateObservable({ timefilter: { timefilter }, filterManager, + queryString, }: { timefilter: TimefilterSetup; filterManager: FilterManager; + queryString: QueryStringContract; }): Observable<{ changes: QueryStateChange; state: QueryState }> { return new Observable((subscriber) => { const state = createStateContainer({ time: timefilter.getTime(), refreshInterval: timefilter.getRefreshInterval(), filters: filterManager.getFilters(), + query: queryString.getQuery(), }); let currentChange: QueryStateChange = {}; const subs: Subscription[] = [ + queryString.getUpdates$().subscribe(() => { + currentChange.query = true; + state.set({ ...state.get(), query: queryString.getQuery() }); + }), timefilter.getTimeUpdate$().subscribe(() => { currentChange.time = true; state.set({ ...state.get(), time: timefilter.getTime() }); diff --git a/src/plugins/data/public/query/state_sync/sync_state_with_url.test.ts b/src/plugins/data/public/query/state_sync/sync_state_with_url.test.ts index 122eb2ff6a343..0b4a3f663eb6b 100644 --- a/src/plugins/data/public/query/state_sync/sync_state_with_url.test.ts +++ b/src/plugins/data/public/query/state_sync/sync_state_with_url.test.ts @@ -43,6 +43,8 @@ setupMock.uiSettings.get.mockImplementation((key: string) => { return true; case 'timepicker:timeDefaults': return { from: 'now-15m', to: 'now' }; + case 'search:queryLanguage': + return 'kuery'; case UI_SETTINGS.TIMEPICKER_REFRESH_INTERVAL_DEFAULTS: return { pause: false, value: 0 }; default: diff --git a/src/plugins/data/public/query/state_sync/sync_state_with_url.ts b/src/plugins/data/public/query/state_sync/sync_state_with_url.ts index 4d3da7b9313a3..46be800fbb558 100644 --- a/src/plugins/data/public/query/state_sync/sync_state_with_url.ts +++ b/src/plugins/data/public/query/state_sync/sync_state_with_url.ts @@ -35,7 +35,7 @@ const GLOBAL_STATE_STORAGE_KEY = '_g'; * @param kbnUrlStateStorage to use for syncing */ export const syncQueryStateWithUrl = ( - query: Pick, + query: Pick, kbnUrlStateStorage: IKbnUrlStateStorage ) => { const { diff --git a/src/plugins/data/public/query/state_sync/types.ts b/src/plugins/data/public/query/state_sync/types.ts index 747d4d45fe29b..2354db8cad11a 100644 --- a/src/plugins/data/public/query/state_sync/types.ts +++ b/src/plugins/data/public/query/state_sync/types.ts @@ -17,7 +17,7 @@ * under the License. */ -import { Filter, RefreshInterval, TimeRange } from '../../../common'; +import { Filter, RefreshInterval, TimeRange, Query } from '../../../common'; /** * All query state service state @@ -26,6 +26,7 @@ export interface QueryState { time?: TimeRange; refreshInterval?: RefreshInterval; filters?: Filter[]; + query?: Query; } type QueryStateChangePartial = { diff --git a/src/plugins/data/public/ui/search_bar/create_search_bar.tsx b/src/plugins/data/public/ui/search_bar/create_search_bar.tsx index f8b7e4f480911..9f0ba2378592a 100644 --- a/src/plugins/data/public/ui/search_bar/create_search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/create_search_bar.tsx @@ -18,7 +18,7 @@ */ import _ from 'lodash'; -import React, { useState, useEffect, useRef } from 'react'; +import React, { useEffect, useRef } from 'react'; import { CoreStart } from 'src/core/public'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { KibanaContextProvider } from '../../../../kibana_react/public'; @@ -28,7 +28,8 @@ import { useFilterManager } from './lib/use_filter_manager'; import { useTimefilter } from './lib/use_timefilter'; import { useSavedQuery } from './lib/use_saved_query'; import { DataPublicPluginStart } from '../../types'; -import { Filter, Query, TimeRange, UI_SETTINGS } from '../../../common'; +import { Filter, Query, TimeRange } from '../../../common'; +import { useQueryStringManager } from './lib/use_query_string_manager'; interface StatefulSearchBarDeps { core: CoreStart; @@ -65,8 +66,7 @@ const defaultOnRefreshChange = (queryService: QueryStart) => { const defaultOnQuerySubmit = ( props: StatefulSearchBarProps, queryService: QueryStart, - currentQuery: Query, - setQueryStringState: Function + currentQuery: Query ) => { if (!props.useDefaultBehaviors) return props.onQuerySubmit; @@ -78,7 +78,11 @@ const defaultOnQuerySubmit = ( !_.isEqual(payload.query, currentQuery); if (isUpdate) { timefilter.setTime(payload.dateRange); - setQueryStringState(payload.query); + if (payload.query) { + queryService.queryString.setQuery(payload.query); + } else { + queryService.queryString.clearQuery(); + } } else { // Refresh button triggered for an update if (props.onQuerySubmit) @@ -121,30 +125,7 @@ export function createSearchBar({ core, storage, data }: StatefulSearchBarDeps) return (props: StatefulSearchBarProps) => { const { useDefaultBehaviors } = props; // Handle queries - const queryRef = useRef(props.query); const onQuerySubmitRef = useRef(props.onQuerySubmit); - const defaultQuery = { - query: '', - language: - storage.get('kibana.userQueryLanguage') || - core.uiSettings.get(UI_SETTINGS.SEARCH_QUERY_LANGUAGE), - }; - const [query, setQuery] = useState(props.query || defaultQuery); - - useEffect(() => { - if (props.query !== queryRef.current) { - queryRef.current = props.query; - setQuery(props.query || defaultQuery); - } - /* eslint-disable-next-line react-hooks/exhaustive-deps */ - }, [defaultQuery, props.query]); - - useEffect(() => { - if (props.onQuerySubmit !== onQuerySubmitRef.current) { - onQuerySubmitRef.current = props.onQuerySubmit; - } - /* eslint-disable-next-line react-hooks/exhaustive-deps */ - }, [props.onQuerySubmit]); // handle service state updates. // i.e. filters being added from a visualization directly to filterManager. @@ -152,6 +133,10 @@ export function createSearchBar({ core, storage, data }: StatefulSearchBarDeps) filters: props.filters, filterManager: data.query.filterManager, }); + const { query } = useQueryStringManager({ + query: props.query, + queryStringManager: data.query.queryString, + }); const { timeRange, refreshInterval } = useTimefilter({ dateRangeFrom: props.dateRangeFrom, dateRangeTo: props.dateRangeTo, @@ -163,10 +148,8 @@ export function createSearchBar({ core, storage, data }: StatefulSearchBarDeps) // Fetch and update UI from saved query const { savedQuery, setSavedQuery, clearSavedQuery } = useSavedQuery({ queryService: data.query, - setQuery, savedQueryId: props.savedQueryId, notifications: core.notifications, - defaultLanguage: defaultQuery.language, }); // Fire onQuerySubmit on query or timerange change @@ -210,7 +193,7 @@ export function createSearchBar({ core, storage, data }: StatefulSearchBarDeps) onFiltersUpdated={defaultFiltersUpdated(data.query)} onRefreshChange={defaultOnRefreshChange(data.query)} savedQuery={savedQuery} - onQuerySubmit={defaultOnQuerySubmit(props, data.query, query, setQuery)} + onQuerySubmit={defaultOnQuerySubmit(props, data.query, query)} onClearSavedQuery={defaultOnClearSavedQuery(props, clearSavedQuery)} onSavedQueryUpdated={defaultOnSavedQueryUpdated(props, setSavedQuery)} onSaved={defaultOnSavedQueryUpdated(props, setSavedQuery)} diff --git a/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.test.ts b/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.test.ts index ccfe5464b9598..10520fc3714d5 100644 --- a/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.test.ts +++ b/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.test.ts @@ -21,10 +21,8 @@ import { clearStateFromSavedQuery } from './clear_saved_query'; import { dataPluginMock } from '../../../mocks'; import { DataPublicPluginStart } from '../../../types'; -import { Query } from '../../..'; describe('clearStateFromSavedQuery', () => { - const DEFAULT_LANGUAGE = 'banana'; let dataMock: jest.Mocked; beforeEach(() => { @@ -32,19 +30,9 @@ describe('clearStateFromSavedQuery', () => { }); it('should clear filters and query', async () => { - const setQueryState = jest.fn(); dataMock.query.filterManager.removeAll = jest.fn(); - clearStateFromSavedQuery(dataMock.query, setQueryState, DEFAULT_LANGUAGE); - expect(setQueryState).toHaveBeenCalled(); - expect(dataMock.query.filterManager.removeAll).toHaveBeenCalled(); - }); - - it('should use search:queryLanguage', async () => { - const setQueryState = jest.fn(); - dataMock.query.filterManager.removeAll = jest.fn(); - clearStateFromSavedQuery(dataMock.query, setQueryState, DEFAULT_LANGUAGE); - expect(setQueryState).toHaveBeenCalled(); - expect((setQueryState.mock.calls[0][0] as Query).language).toBe(DEFAULT_LANGUAGE); + clearStateFromSavedQuery(dataMock.query); + expect(dataMock.query.queryString.clearQuery).toHaveBeenCalled(); expect(dataMock.query.filterManager.removeAll).toHaveBeenCalled(); }); }); diff --git a/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.ts b/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.ts index b2c777261c257..06ee56e9e4385 100644 --- a/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.ts +++ b/src/plugins/data/public/ui/search_bar/lib/clear_saved_query.ts @@ -18,14 +18,7 @@ */ import { QueryStart } from '../../../query'; -export const clearStateFromSavedQuery = ( - queryService: QueryStart, - setQueryStringState: Function, - defaultLanguage: string -) => { +export const clearStateFromSavedQuery = (queryService: QueryStart) => { queryService.filterManager.removeAll(); - setQueryStringState({ - query: '', - language: defaultLanguage, - }); + queryService.queryString.clearQuery(); }; diff --git a/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.test.ts b/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.test.ts index 1db900053e078..660aa2333d49c 100644 --- a/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.test.ts +++ b/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.test.ts @@ -47,37 +47,34 @@ describe('populateStateFromSavedQuery', () => { }); it('should set query', async () => { - const setQueryState = jest.fn(); const savedQuery: SavedQuery = { ...baseSavedQuery, }; - populateStateFromSavedQuery(dataMock.query, setQueryState, savedQuery); - expect(setQueryState).toHaveBeenCalled(); + populateStateFromSavedQuery(dataMock.query, savedQuery); + expect(dataMock.query.queryString.setQuery).toHaveBeenCalled(); }); it('should set filters', async () => { - const setQueryState = jest.fn(); const savedQuery: SavedQuery = { ...baseSavedQuery, }; const f1 = getFilter(FilterStateStore.APP_STATE, false, false, 'age', 34); savedQuery.attributes.filters = [f1]; - populateStateFromSavedQuery(dataMock.query, setQueryState, savedQuery); - expect(setQueryState).toHaveBeenCalled(); + populateStateFromSavedQuery(dataMock.query, savedQuery); + expect(dataMock.query.queryString.setQuery).toHaveBeenCalled(); expect(dataMock.query.filterManager.setFilters).toHaveBeenCalledWith([f1]); }); it('should preserve global filters', async () => { const globalFilter = getFilter(FilterStateStore.GLOBAL_STATE, false, false, 'age', 34); dataMock.query.filterManager.getGlobalFilters = jest.fn().mockReturnValue([globalFilter]); - const setQueryState = jest.fn(); const savedQuery: SavedQuery = { ...baseSavedQuery, }; const f1 = getFilter(FilterStateStore.APP_STATE, false, false, 'age', 34); savedQuery.attributes.filters = [f1]; - populateStateFromSavedQuery(dataMock.query, setQueryState, savedQuery); - expect(setQueryState).toHaveBeenCalled(); + populateStateFromSavedQuery(dataMock.query, savedQuery); + expect(dataMock.query.queryString.setQuery).toHaveBeenCalled(); expect(dataMock.query.filterManager.setFilters).toHaveBeenCalledWith([globalFilter, f1]); }); @@ -97,7 +94,7 @@ describe('populateStateFromSavedQuery', () => { dataMock.query.timefilter.timefilter.setTime = jest.fn(); dataMock.query.timefilter.timefilter.setRefreshInterval = jest.fn(); - populateStateFromSavedQuery(dataMock.query, jest.fn(), savedQuery); + populateStateFromSavedQuery(dataMock.query, savedQuery); expect(dataMock.query.timefilter.timefilter.setTime).toHaveBeenCalledWith({ from: savedQuery.attributes.timefilter.from, diff --git a/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.ts b/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.ts index 7ae6726b36df0..bb4b97cc4a9fd 100644 --- a/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.ts +++ b/src/plugins/data/public/ui/search_bar/lib/populate_state_from_saved_query.ts @@ -19,14 +19,11 @@ import { QueryStart, SavedQuery } from '../../../query'; -export const populateStateFromSavedQuery = ( - queryService: QueryStart, - setQueryStringState: Function, - savedQuery: SavedQuery -) => { +export const populateStateFromSavedQuery = (queryService: QueryStart, savedQuery: SavedQuery) => { const { timefilter: { timefilter }, filterManager, + queryString, } = queryService; // timefilter if (savedQuery.attributes.timefilter) { @@ -40,7 +37,7 @@ export const populateStateFromSavedQuery = ( } // query string - setQueryStringState(savedQuery.attributes.query); + queryString.setQuery(savedQuery.attributes.query); // filters const savedQueryFilters = savedQuery.attributes.filters || []; diff --git a/src/plugins/data/public/ui/search_bar/lib/use_query_string_manager.ts b/src/plugins/data/public/ui/search_bar/lib/use_query_string_manager.ts new file mode 100644 index 0000000000000..e28129f20bb86 --- /dev/null +++ b/src/plugins/data/public/ui/search_bar/lib/use_query_string_manager.ts @@ -0,0 +1,51 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { useState, useEffect } from 'react'; +import { Subscription } from 'rxjs'; +import { Query } from '../../..'; +import { QueryStringContract } from '../../../query/query_string'; + +interface UseQueryStringProps { + query?: Query; + queryStringManager: QueryStringContract; +} + +export const useQueryStringManager = (props: UseQueryStringProps) => { + // Filters should be either what's passed in the initial state or the current state of the filter manager + const [query, setQuery] = useState(props.query || props.queryStringManager.getQuery()); + useEffect(() => { + const subscriptions = new Subscription(); + + subscriptions.add( + props.queryStringManager.getUpdates$().subscribe({ + next: () => { + const newQuery = props.queryStringManager.getQuery(); + setQuery(newQuery); + }, + }) + ); + + return () => { + subscriptions.unsubscribe(); + }; + }, [props.queryStringManager]); + + return { query }; +}; diff --git a/src/plugins/data/public/ui/search_bar/lib/use_saved_query.ts b/src/plugins/data/public/ui/search_bar/lib/use_saved_query.ts index 79aee3438d7aa..9f73a401f563b 100644 --- a/src/plugins/data/public/ui/search_bar/lib/use_saved_query.ts +++ b/src/plugins/data/public/ui/search_bar/lib/use_saved_query.ts @@ -27,10 +27,8 @@ import { clearStateFromSavedQuery } from './clear_saved_query'; interface UseSavedQueriesProps { queryService: DataPublicPluginStart['query']; - setQuery: Function; notifications: CoreStart['notifications']; savedQueryId?: string; - defaultLanguage: string; } interface UseSavedQueriesReturn { @@ -41,7 +39,6 @@ interface UseSavedQueriesReturn { export const useSavedQuery = (props: UseSavedQueriesProps): UseSavedQueriesReturn => { // Handle saved queries - const defaultLanguage = props.defaultLanguage; const [savedQuery, setSavedQuery] = useState(); // Effect is used to convert a saved query id into an object @@ -53,12 +50,12 @@ export const useSavedQuery = (props: UseSavedQueriesProps): UseSavedQueriesRetur // Make sure we set the saved query to the most recent one if (newSavedQuery && newSavedQuery.id === savedQueryId) { setSavedQuery(newSavedQuery); - populateStateFromSavedQuery(props.queryService, props.setQuery, newSavedQuery); + populateStateFromSavedQuery(props.queryService, newSavedQuery); } } catch (error) { // Clear saved query setSavedQuery(undefined); - clearStateFromSavedQuery(props.queryService, props.setQuery, defaultLanguage); + clearStateFromSavedQuery(props.queryService); // notify of saving error props.notifications.toasts.addWarning({ title: i18n.translate('data.search.unableToGetSavedQueryToastTitle', { @@ -73,23 +70,21 @@ export const useSavedQuery = (props: UseSavedQueriesProps): UseSavedQueriesRetur if (props.savedQueryId) fetchSavedQuery(props.savedQueryId); else setSavedQuery(undefined); }, [ - defaultLanguage, props.notifications.toasts, props.queryService, props.queryService.savedQueries, props.savedQueryId, - props.setQuery, ]); return { savedQuery, setSavedQuery: (q: SavedQuery) => { setSavedQuery(q); - populateStateFromSavedQuery(props.queryService, props.setQuery, q); + populateStateFromSavedQuery(props.queryService, q); }, clearSavedQuery: () => { setSavedQuery(undefined); - clearStateFromSavedQuery(props.queryService, props.setQuery, defaultLanguage); + clearStateFromSavedQuery(props.queryService); }, }; }; diff --git a/src/plugins/discover/public/application/angular/discover.html b/src/plugins/discover/public/application/angular/discover.html index 48a8442b06316..d3d4f524873d8 100644 --- a/src/plugins/discover/public/application/angular/discover.html +++ b/src/plugins/discover/public/application/angular/discover.html @@ -6,9 +6,8 @@

      {{screenTitle}}

      app-name="'discover'" config="topNavMenu" index-patterns="[indexPattern]" - on-query-submit="updateQuery" + on-query-submit="handleRefresh" on-saved-query-id-change="updateSavedQueryId" - query="state.query" saved-query-id="state.savedQuery" screen-title="screenTitle" show-date-picker="indexPattern.isTimeBased()" diff --git a/src/plugins/discover/public/application/angular/discover.js b/src/plugins/discover/public/application/angular/discover.js index c791bdd850151..4a27f261a6220 100644 --- a/src/plugins/discover/public/application/angular/discover.js +++ b/src/plugins/discover/public/application/angular/discover.js @@ -70,9 +70,7 @@ import { indexPatterns as indexPatternsUtils, connectToQueryState, syncQueryStateWithUrl, - getDefaultQuery, search, - UI_SETTINGS, } from '../../../../data/public'; import { getIndexPatternId } from '../helpers/get_index_pattern_id'; import { addFatalError } from '../../../../kibana_legacy/public'; @@ -191,16 +189,7 @@ app.directive('discoverApp', function () { }; }); -function discoverController( - $element, - $route, - $scope, - $timeout, - $window, - Promise, - localStorage, - uiCapabilities -) { +function discoverController($element, $route, $scope, $timeout, $window, Promise, uiCapabilities) { const { isDefault: isDefaultType } = indexPatternsUtils; const subscriptions = new Subscription(); const $fetchObservable = new Subject(); @@ -246,11 +235,15 @@ function discoverController( // sync initial app filters from state to filterManager filterManager.setAppFilters(_.cloneDeep(appStateContainer.getState().filters)); + data.query.queryString.setQuery(appStateContainer.getState().query); const stopSyncingQueryAppStateWithStateContainer = connectToQueryState( data.query, appStateContainer, - { filters: esFilters.FilterStateStore.APP_STATE } + { + filters: esFilters.FilterStateStore.APP_STATE, + query: true, + } ); const appStateUnsubscribe = appStateContainer.subscribe(async (newState) => { @@ -262,7 +255,7 @@ function discoverController( $scope.state = { ...newState }; // detect changes that should trigger fetching of new data - const changes = ['interval', 'sort', 'query'].filter( + const changes = ['interval', 'sort'].filter( (prop) => !_.isEqual(newStatePartial[prop], oldStatePartial[prop]) ); @@ -593,12 +586,7 @@ function discoverController( }; function getStateDefaults() { - const query = - $scope.searchSource.getField('query') || - getDefaultQuery( - localStorage.get('kibana.userQueryLanguage') || - config.get(UI_SETTINGS.SEARCH_QUERY_LANGUAGE) - ); + const query = $scope.searchSource.getField('query') || data.query.queryString.getDefaultQuery(); return { query, sort: getSortArray(savedSearch.sort, $scope.indexPattern), @@ -635,12 +623,7 @@ function discoverController( const init = _.once(() => { $scope.updateDataSource().then(async () => { - const searchBarChanges = merge( - timefilter.getAutoRefreshFetch$(), - timefilter.getFetch$(), - filterManager.getFetches$(), - $fetchObservable - ).pipe(debounceTime(100)); + const searchBarChanges = merge(data.query.state$, $fetchObservable).pipe(debounceTime(100)); subscriptions.add( subscribeWithScope( @@ -824,9 +807,8 @@ function discoverController( }); }; - $scope.updateQuery = function ({ query }, isUpdate = true) { - if (!_.isEqual(query, appStateContainer.getState().query) || isUpdate === false) { - setAppState({ query }); + $scope.handleRefresh = function (_payload, isUpdate) { + if (isUpdate === false) { $fetchObservable.next(); } }; @@ -976,7 +958,7 @@ function discoverController( config.get(SORT_DEFAULT_ORDER_SETTING) ) ) - .setField('query', $scope.state.query || null) + .setField('query', data.query.queryString.getQuery() || null) .setField('filter', filterManager.getFilters()); return Promise.resolve(); }; diff --git a/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx b/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx index c97f19f59d340..cb1d5a25c01ae 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx +++ b/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx @@ -35,12 +35,7 @@ import { import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -import { - esQuery, - IndexPattern, - Query, - UI_SETTINGS, -} from '../../../../../../../plugins/data/public'; +import { esQuery, IndexPattern, Query } from '../../../../../../../plugins/data/public'; import { context as contextType } from '../../../../../../kibana_react/public'; import { IndexPatternManagmentContextValue } from '../../../../types'; import { ExecuteScript } from '../../types'; @@ -248,10 +243,7 @@ export class TestScript extends Component { showFilterBar={false} showDatePicker={false} showQueryInput={true} - query={{ - language: this.context.services.uiSettings.get(UI_SETTINGS.SEARCH_QUERY_LANGUAGE), - query: '', - }} + query={this.context.services.data.query.queryString.getDefaultQuery()} onQuerySubmit={this.previewScript} indexPatterns={[this.props.indexPattern]} customSubmitButton={ diff --git a/src/plugins/vis_default_editor/public/components/controls/filters.tsx b/src/plugins/vis_default_editor/public/components/controls/filters.tsx index 04d0df27927fa..fc676e25ff6d7 100644 --- a/src/plugins/vis_default_editor/public/components/controls/filters.tsx +++ b/src/plugins/vis_default_editor/public/components/controls/filters.tsx @@ -23,7 +23,7 @@ import { htmlIdGenerator, EuiButton, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { useMount } from 'react-use'; -import { Query, UI_SETTINGS } from '../../../../data/public'; +import { Query } from '../../../../data/public'; import { useKibana } from '../../../../kibana_react/public'; import { FilterRow } from './filter'; import { AggParamEditorProps } from '../agg_param_props'; @@ -70,7 +70,7 @@ function FiltersParamEditor({ agg, value = [], setValue }: AggParamEditorProps { - if (!isEqual(currentAppState.query, query)) { - stateContainer.transitions.set('query', query || currentAppState.query); - } else { + const handleRefresh = useCallback( + (_payload: any, isUpdate?: boolean) => { + if (isUpdate === false) { savedVisInstance.embeddableHandler.reload(); } }, - [currentAppState.query, savedVisInstance.embeddableHandler, stateContainer.transitions] + [savedVisInstance.embeddableHandler] ); const config = useMemo(() => { @@ -149,8 +145,7 @@ const TopNav = ({ { to: 'now', }; mockFilters = ['mockFilters']; + const mockQuery = { + query: '', + language: 'kuery', + }; // @ts-expect-error mockServices.data.query.timefilter.timefilter.getTime.mockImplementation(() => timeRange); // @ts-expect-error mockServices.data.query.filterManager.getFilters.mockImplementation(() => mockFilters); + // @ts-expect-error + mockServices.data.query.queryString.getQuery.mockImplementation(() => mockQuery); }); test('should set up current app state and render the editor', () => { diff --git a/src/plugins/visualize/public/application/utils/use/use_editor_updates.ts b/src/plugins/visualize/public/application/utils/use/use_editor_updates.ts index 360e7560b1932..0f4b2d34e8e87 100644 --- a/src/plugins/visualize/public/application/utils/use/use_editor_updates.ts +++ b/src/plugins/visualize/public/application/utils/use/use_editor_updates.ts @@ -20,9 +20,7 @@ import { useEffect, useState } from 'react'; import { isEqual } from 'lodash'; import { EventEmitter } from 'events'; -import { merge } from 'rxjs'; -import { migrateLegacyQuery } from '../../../../../kibana_legacy/public'; import { VisualizeServices, VisualizeAppState, @@ -47,6 +45,8 @@ export const useEditorUpdates = ( const { timefilter: { timefilter }, filterManager, + queryString, + state$, } = services.data.query; const { embeddableHandler, savedVis, savedSearch, vis } = savedVisInstance; const initialState = appState.getState(); @@ -60,7 +60,7 @@ export const useEditorUpdates = ( uiState: vis.uiState, timeRange: timefilter.getTime(), filters: filterManager.getFilters(), - query: appState.getState().query, + query: queryString.getQuery(), linked: !!vis.data.savedSearchId, savedSearch, }); @@ -68,17 +68,12 @@ export const useEditorUpdates = ( embeddableHandler.updateInput({ timeRange: timefilter.getTime(), filters: filterManager.getFilters(), - query: appState.getState().query, + query: queryString.getQuery(), }); } }; - const subscriptions = merge( - timefilter.getTimeUpdate$(), - timefilter.getAutoRefreshFetch$(), - timefilter.getFetch$(), - filterManager.getFetches$() - ).subscribe({ + const subscriptions = state$.subscribe({ next: reloadVisualization, error: services.fatalErrors.add, }); @@ -116,10 +111,6 @@ export const useEditorUpdates = ( // and initializing different visualizations return; } - const newQuery = migrateLegacyQuery(state.query); - if (!isEqual(state.query, newQuery)) { - appState.transitions.set('query', newQuery); - } if (!isEqual(state.uiState, vis.uiState.getChanges())) { vis.uiState.set(state.uiState); diff --git a/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.test.ts b/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.test.ts index e885067c58184..8bde9a049c492 100644 --- a/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.test.ts +++ b/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.test.ts @@ -96,6 +96,7 @@ describe('useVisualizeAppState', () => { ); expect(connectToQueryState).toHaveBeenCalledWith(mockServices.data.query, expect.any(Object), { filters: 'appState', + query: true, }); expect(result.current).toEqual({ appState: stateContainer, diff --git a/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.tsx b/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.tsx index e4d891472fbfd..c44f67df3729f 100644 --- a/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.tsx +++ b/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.tsx @@ -24,6 +24,7 @@ import { EventEmitter } from 'events'; import { i18n } from '@kbn/i18n'; import { MarkdownSimple, toMountPoint } from '../../../../../kibana_react/public'; +import { migrateLegacyQuery } from '../../../../../kibana_legacy/public'; import { esFilters, connectToQueryState } from '../../../../../data/public'; import { VisualizeServices, VisualizeAppStateContainer, SavedVisInstance } from '../../types'; import { visStateToEditorState } from '../utils'; @@ -61,19 +62,35 @@ export const useVisualizeAppState = ( eventEmitter.on('dirtyStateChange', onDirtyStateChange); - const { filterManager } = services.data.query; - // sync initial app filters from state to filterManager + const { filterManager, queryString } = services.data.query; + // sync initial app state from state to managers filterManager.setAppFilters(cloneDeep(stateContainer.getState().filters)); - // setup syncing of app filters between appState and filterManager + queryString.setQuery(migrateLegacyQuery(stateContainer.getState().query)); + + // setup syncing of app filters between appState and query services const stopSyncingAppFilters = connectToQueryState( services.data.query, { - set: ({ filters }) => stateContainer.transitions.set('filters', filters), - get: () => ({ filters: stateContainer.getState().filters }), - state$: stateContainer.state$.pipe(map((state) => ({ filters: state.filters }))), + set: ({ filters, query }) => { + stateContainer.transitions.set('filters', filters); + stateContainer.transitions.set('query', query); + }, + get: () => { + return { + filters: stateContainer.getState().filters, + query: stateContainer.getState().query, + }; + }, + state$: stateContainer.state$.pipe( + map((state) => ({ + filters: state.filters, + query: state.query, + })) + ), }, { filters: esFilters.FilterStateStore.APP_STATE, + query: true, } ); diff --git a/src/plugins/visualize/public/application/utils/utils.ts b/src/plugins/visualize/public/application/utils/utils.ts index 9f32da3f785b5..532d87985a0b6 100644 --- a/src/plugins/visualize/public/application/utils/utils.ts +++ b/src/plugins/visualize/public/application/utils/utils.ts @@ -20,7 +20,7 @@ import { i18n } from '@kbn/i18n'; import { ChromeStart, DocLinksStart } from 'kibana/public'; -import { Filter, UI_SETTINGS } from '../../../../data/public'; +import { Filter } from '../../../../data/public'; import { VisualizeServices, SavedVisInstance } from '../types'; export const addHelpMenuToAppChrome = (chrome: ChromeStart, docLinks: DocLinksStart) => { @@ -49,12 +49,9 @@ export const addBadgeToAppChrome = (chrome: ChromeStart) => { }); }; -export const getDefaultQuery = ({ localStorage, uiSettings }: VisualizeServices) => ({ - query: '', - language: - localStorage.get('kibana.userQueryLanguage') || - uiSettings.get(UI_SETTINGS.SEARCH_QUERY_LANGUAGE), -}); +export const getDefaultQuery = ({ data }: VisualizeServices) => { + return data.query.queryString.getDefaultQuery(); +}; export const visStateToEditorState = ( { vis, savedVis }: SavedVisInstance, diff --git a/test/functional/apps/visualize/_area_chart.js b/test/functional/apps/visualize/_area_chart.js index 4321f0df89250..9ac2160a359da 100644 --- a/test/functional/apps/visualize/_area_chart.js +++ b/test/functional/apps/visualize/_area_chart.js @@ -563,6 +563,10 @@ export default function ({ getService, getPageObjects }) { it('should display updated scaled label text after time range is changed', async () => { await PageObjects.visEditor.setInterval('Millisecond'); + + // Apply interval + await testSubjects.clickWhenNotDisabled('visualizeEditorRenderButton'); + const isHelperScaledLabelExists = await find.existsByCssSelector( '[data-test-subj="currentlyScaledText"]' ); diff --git a/x-pack/plugins/lens/public/app_plugin/app.test.tsx b/x-pack/plugins/lens/public/app_plugin/app.test.tsx index 3bd12a87456a0..a72f4f429a1be 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.test.tsx @@ -95,6 +95,14 @@ function createMockFilterManager() { }; } +function createMockQueryString() { + return { + getQuery: jest.fn(() => ({ query: '', language: 'kuery' })), + setQuery: jest.fn(), + getDefaultQuery: jest.fn(() => ({ query: '', language: 'kuery' })), + }; +} + function createMockTimefilter() { const unsubscribe = jest.fn(); @@ -148,6 +156,7 @@ describe('Lens App', () => { timefilter: { timefilter: createMockTimefilter(), }, + queryString: createMockQueryString(), state$: new Observable(), }, indexPatterns: { diff --git a/x-pack/plugins/lens/public/app_plugin/app.tsx b/x-pack/plugins/lens/public/app_plugin/app.tsx index 082a3afcd513e..2a7eaff32fa08 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.tsx @@ -36,7 +36,6 @@ import { IndexPattern as IndexPatternInstance, IndexPatternsContract, SavedQuery, - UI_SETTINGS, } from '../../../../../src/plugins/data/public'; interface State { @@ -83,17 +82,13 @@ export function App({ onAppLeave: AppMountParameters['onAppLeave']; history: History; }) { - const language = - storage.get('kibana.userQueryLanguage') || - core.uiSettings.get(UI_SETTINGS.SEARCH_QUERY_LANGUAGE); - const [state, setState] = useState(() => { const currentRange = data.query.timefilter.timefilter.getTime(); return { isLoading: !!docId, isSaveModalVisible: false, indexPatternsForTopNav: [], - query: { query: '', language }, + query: data.query.queryString.getDefaultQuery(), dateRange: { fromDate: currentRange.from, toDate: currentRange.to, @@ -473,12 +468,7 @@ export function App({ ...s, savedQuery: undefined, filters: data.query.filterManager.getGlobalFilters(), - query: { - query: '', - language: - storage.get('kibana.userQueryLanguage') || - core.uiSettings.get(UI_SETTINGS.SEARCH_QUERY_LANGUAGE), - }, + query: data.query.queryString.getDefaultQuery(), })); }} query={state.query} diff --git a/x-pack/plugins/maps/public/connected_components/layer_panel/filter_editor/filter_editor.js b/x-pack/plugins/maps/public/connected_components/layer_panel/filter_editor/filter_editor.js index 45c7507160e98..d2652fac5bd2c 100644 --- a/x-pack/plugins/maps/public/connected_components/layer_panel/filter_editor/filter_editor.js +++ b/x-pack/plugins/maps/public/connected_components/layer_panel/filter_editor/filter_editor.js @@ -20,8 +20,7 @@ import { import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -import { UI_SETTINGS } from '../../../../../../../src/plugins/data/public'; -import { getIndexPatternService, getUiSettings, getData } from '../../../kibana_services'; +import { getIndexPatternService, getData } from '../../../kibana_services'; import { GlobalFilterCheckbox } from '../../../components/global_filter_checkbox'; export class FilterEditor extends Component { @@ -82,7 +81,6 @@ export class FilterEditor extends Component { _renderQueryPopover() { const layerQuery = this.props.layer.getQuery(); - const uiSettings = getUiSettings(); const { SearchBar } = getData().ui; return ( @@ -99,11 +97,7 @@ export class FilterEditor extends Component { showFilterBar={false} showDatePicker={false} showQueryInput={true} - query={ - layerQuery - ? layerQuery - : { language: uiSettings.get(UI_SETTINGS.SEARCH_QUERY_LANGUAGE), query: '' } - } + query={layerQuery ? layerQuery : getData().query.queryString.getDefaultQuery()} onQuerySubmit={this._onQueryChange} indexPatterns={this.state.indexPatterns} customSubmitButton={ diff --git a/x-pack/plugins/maps/public/connected_components/layer_panel/join_editor/resources/where_expression.js b/x-pack/plugins/maps/public/connected_components/layer_panel/join_editor/resources/where_expression.js index 8fdb71de2dfed..60151219a994f 100644 --- a/x-pack/plugins/maps/public/connected_components/layer_panel/join_editor/resources/where_expression.js +++ b/x-pack/plugins/maps/public/connected_components/layer_panel/join_editor/resources/where_expression.js @@ -8,8 +8,7 @@ import React, { Component } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButton, EuiPopover, EuiExpression, EuiFormHelpText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import { UI_SETTINGS } from '../../../../../../../../src/plugins/data/public'; -import { getUiSettings, getData } from '../../../../kibana_services'; +import { getData } from '../../../../kibana_services'; export class WhereExpression extends Component { state = { @@ -77,11 +76,7 @@ export class WhereExpression extends Component { showFilterBar={false} showDatePicker={false} showQueryInput={true} - query={ - whereQuery - ? whereQuery - : { language: getUiSettings().get(UI_SETTINGS.SEARCH_QUERY_LANGUAGE), query: '' } - } + query={whereQuery ? whereQuery : getData().query.queryString.getDefaultQuery()} onQuerySubmit={this._onQueryChange} indexPatterns={[indexPattern]} customSubmitButton={ diff --git a/x-pack/plugins/maps/public/routing/bootstrap/get_initial_query.js b/x-pack/plugins/maps/public/routing/bootstrap/get_initial_query.js index dfc3a1c9de96a..1f2cf27077623 100644 --- a/x-pack/plugins/maps/public/routing/bootstrap/get_initial_query.js +++ b/x-pack/plugins/maps/public/routing/bootstrap/get_initial_query.js @@ -4,12 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getUiSettings } from '../../kibana_services'; -import { UI_SETTINGS } from '../../../../../../src/plugins/data/public'; - -export function getInitialQuery({ mapStateJSON, appState = {}, userQueryLanguage }) { - const settings = getUiSettings(); +import { getData } from '../../kibana_services'; +export function getInitialQuery({ mapStateJSON, appState = {} }) { if (appState.query) { return appState.query; } @@ -21,8 +18,5 @@ export function getInitialQuery({ mapStateJSON, appState = {}, userQueryLanguage } } - return { - query: '', - language: userQueryLanguage || settings.get(UI_SETTINGS.SEARCH_QUERY_LANGUAGE), - }; + return getData().query.queryString.getDefaultQuery(); } diff --git a/x-pack/plugins/maps/public/routing/page_elements/top_nav_menu/top_nav_menu.js b/x-pack/plugins/maps/public/routing/page_elements/top_nav_menu/top_nav_menu.js index ac2dec0db59cc..2340e3716547b 100644 --- a/x-pack/plugins/maps/public/routing/page_elements/top_nav_menu/top_nav_menu.js +++ b/x-pack/plugins/maps/public/routing/page_elements/top_nav_menu/top_nav_menu.js @@ -14,7 +14,6 @@ import { getToasts, getCoreI18n, getData, - getUiSettings, } from '../../../kibana_services'; import { SavedObjectSaveModal, @@ -46,16 +45,13 @@ export function MapsTopNavMenu({ isOpenSettingsDisabled, }) { const { TopNavMenu } = getNavigation().ui; - const { filterManager } = getData().query; + const { filterManager, queryString } = getData().query; const showSaveQuery = getMapsCapabilities().saveQuery; const onClearSavedQuery = () => { onQuerySaved(undefined); onQueryChange({ filters: filterManager.getGlobalFilters(), - query: { - query: '', - language: getUiSettings().get('search:queryLanguage'), - }, + query: queryString.getDefaultQuery(), }); }; diff --git a/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js b/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js index aa7f24155ab43..bccfdbf2467d6 100644 --- a/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js +++ b/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js @@ -13,7 +13,6 @@ import { getIndexPatternService, getToasts, getData, - getUiSettings, getCoreChrome, } from '../../../kibana_services'; import { copyPersistentState } from '../../../reducers/util'; @@ -274,6 +273,7 @@ export class MapsAppView extends React.Component { _initQueryTimeRefresh() { const { setRefreshConfig, savedMap } = this.props; + const { queryString } = getData().query; // TODO: Handle null when converting to TS const globalState = getGlobalState(); const mapStateJSON = savedMap ? savedMap.mapStateJSON : undefined; @@ -281,7 +281,6 @@ export class MapsAppView extends React.Component { query: getInitialQuery({ mapStateJSON, appState: this._appStateManager.getAppState(), - userQueryLanguage: getUiSettings().get('search:queryLanguage'), }), time: getInitialTimeFilters({ mapStateJSON, @@ -292,6 +291,8 @@ export class MapsAppView extends React.Component { globalState, }), }; + + if (newState.query) queryString.setQuery(newState.query); this.setState({ query: newState.query, time: newState.time }); updateGlobalState( { diff --git a/x-pack/plugins/maps/public/routing/state_syncing/app_sync.js b/x-pack/plugins/maps/public/routing/state_syncing/app_sync.js index 36b20174f2436..69d6dbbe0c4d3 100644 --- a/x-pack/plugins/maps/public/routing/state_syncing/app_sync.js +++ b/x-pack/plugins/maps/public/routing/state_syncing/app_sync.js @@ -31,6 +31,7 @@ export function useAppStateSyncing(appStateManager) { }; const stopSyncingQueryAppStateWithStateContainer = connectToQueryState(query, stateContainer, { filters: esFilters.FilterStateStore.APP_STATE, + query: true, }); // sets up syncing app state container with url From 2d1939b1451db00ba8dfc5fccfa2c7cec13200c2 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Wed, 29 Jul 2020 12:53:46 +0200 Subject: [PATCH 114/126] [Visualize] Fix inspector download filename issue when saving in-place (#72605) Co-authored-by: Elastic Machine --- .../public/embeddable/visualize_embeddable.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts index 749926e1abd00..cc24c0509fbc1 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts @@ -157,7 +157,7 @@ export class VisualizeEmbeddable extends Embeddable Date: Wed, 29 Jul 2020 14:02:16 +0300 Subject: [PATCH 115/126] regen docs (#73650) --- src/plugins/data/public/public.api.md | 93 ++++++++++++++------------- 1 file changed, 47 insertions(+), 46 deletions(-) diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 97e7a96c71e69..d6812a4aa4524 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -1867,52 +1867,53 @@ export const UI_SETTINGS: { // src/plugins/data/common/es_query/filters/match_all_filter.ts:28:3 - (ae-forgotten-export) The symbol "MatchAllFilterMeta" needs to be exported by the entry point index.d.ts // src/plugins/data/common/es_query/filters/phrase_filter.ts:33:3 - (ae-forgotten-export) The symbol "PhraseFilterMeta" needs to be exported by the entry point index.d.ts // src/plugins/data/common/es_query/filters/phrases_filter.ts:31:3 - (ae-forgotten-export) The symbol "PhrasesFilterMeta" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "FilterLabel" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "FILTERS" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "getDisplayValueFromFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "generateFilters" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "changeTimeFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "convertRangeFilterToTimeRangeString" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:65:23 - (ae-forgotten-export) The symbol "extractTimeFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:136:21 - (ae-forgotten-export) The symbol "buildEsQuery" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:136:21 - (ae-forgotten-export) The symbol "getEsQueryConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:136:21 - (ae-forgotten-export) The symbol "luceneStringToDsl" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:136:21 - (ae-forgotten-export) The symbol "decorateQuery" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "FieldFormatsRegistry" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "BoolFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "BytesFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "ColorFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "DurationFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "IpFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "NumberFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "PercentFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "RelativeDateFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "SourceFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "StaticLookupFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "UrlFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "StringFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:176:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "validateIndexPattern" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:232:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:371:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:372:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:381:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:382:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:383:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:384:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:392:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:396:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "FilterLabel" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "FILTERS" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "getDisplayValueFromFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "generateFilters" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "changeTimeFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "convertRangeFilterToTimeRangeString" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "extractTimeFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:66:23 - (ae-forgotten-export) The symbol "extractTimeRange" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:138:21 - (ae-forgotten-export) The symbol "buildEsQuery" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:138:21 - (ae-forgotten-export) The symbol "getEsQueryConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:138:21 - (ae-forgotten-export) The symbol "luceneStringToDsl" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:138:21 - (ae-forgotten-export) The symbol "decorateQuery" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "FieldFormatsRegistry" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "BoolFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "BytesFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "ColorFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "DurationFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "IpFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "NumberFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "PercentFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "RelativeDateFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "SourceFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "StaticLookupFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "UrlFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "StringFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:178:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "validateIndexPattern" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:371:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:373:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:374:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:383:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:384:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:385:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:386:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:391:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:395:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:398:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:45:5 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:54:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:55:5 - (ae-forgotten-export) The symbol "createFiltersFromRangeSelectAction" needs to be exported by the entry point index.d.ts From 35d4bc67c1f824ddfdc06ed3aafd45460a44623e Mon Sep 17 00:00:00 2001 From: Spencer Date: Wed, 29 Jul 2020 05:52:41 -0700 Subject: [PATCH 116/126] allow others to update `URL.revokeObjectURL` property if needed (#73639) Co-authored-by: spalger Co-authored-by: Elastic Machine --- .../public/panel_actions/get_csv_panel_action.test.ts | 6 +++++- .../value_lists_management_modal/auto_download.test.tsx | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.test.ts b/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.test.ts index 105c5cd109533..f07235742a1d3 100644 --- a/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.test.ts +++ b/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.test.ts @@ -18,7 +18,11 @@ describe('GetCsvReportPanelAction', () => { beforeAll(() => { if (typeof window.URL.revokeObjectURL === 'undefined') { - Object.defineProperty(window.URL, 'revokeObjectURL', { value: () => {} }); + Object.defineProperty(window.URL, 'revokeObjectURL', { + configurable: true, + writable: true, + value: () => {}, + }); } }); diff --git a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/auto_download.test.tsx b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/auto_download.test.tsx index 53dcf986d395c..be84c37d40606 100644 --- a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/auto_download.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/auto_download.test.tsx @@ -12,8 +12,8 @@ import { AutoDownload } from './auto_download'; describe('AutoDownload', () => { beforeEach(() => { - // our DOM environment lacks this function that our component needs Object.defineProperty(globalNode.window.URL, 'revokeObjectURL', { + configurable: true, writable: true, value: jest.fn(), }); From 1580a2ef591c537c90546305e3a1ee6644215bce Mon Sep 17 00:00:00 2001 From: Andrew Cholakian Date: Wed, 29 Jul 2020 08:51:26 -0500 Subject: [PATCH 117/126] [Uptime] Use `service.name` to link from Uptime -> APM where available (#73618) With https://github.com/elastic/beats/pull/19932 coming in 7.10 adding the `service.name` ECS field is very easy. We should prefer this field when cross linking to APM, hence this PR. Resolves https://github.com/elastic/uptime/issues/220 --- .../uptime/common/runtime_types/monitor/state.ts | 3 +++ .../uptime/common/runtime_types/ping/ping.ts | 3 +++ .../__snapshots__/integration_group.test.tsx.snap | 12 ++++++------ .../actions_popover/integration_group.tsx | 9 +++++---- .../__tests__/get_apm_href.test.ts | 15 ++++++++++++++- .../observability_integration/get_apm_href.ts | 11 ++++++++--- .../requests/search/refine_potential_matches.ts | 1 + 7 files changed, 40 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts b/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts index edbaacd725045..67b13d70fa3ee 100644 --- a/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts +++ b/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts @@ -37,6 +37,9 @@ export const StateType = t.intersection([ name: t.array(t.string), }), }), + service: t.partial({ + name: t.string, + }), }), ]); diff --git a/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts b/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts index d037b4da882a1..5ed71acaf7739 100644 --- a/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts +++ b/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts @@ -196,6 +196,9 @@ export const PingType = t.intersection([ port: t.number, scheme: t.string, }), + service: t.partial({ + name: t.string, + }), }), ]); diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_group.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_group.test.tsx.snap index bb578d850ff7e..12c81fda08519 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_group.test.tsx.snap +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_group.test.tsx.snap @@ -9,8 +9,8 @@ exports[`IntegrationGroup will not display APM links when APM is unavailable 1`] ariaLabel="Search APM for this monitor" href="/app/apm#/services?kuery=url.domain:%20%22undefined%22&rangeFrom=now-15m&rangeTo=now" iconType="apmApp" - message="Check APM for domain" - tooltipContent="Click here to check APM for the domain \\"\\"." + message="Show APM Data" + tooltipContent="Click here to check APM for the domain \\"\\" or explicitly defined \\"service name\\"." />
      @@ -73,8 +73,8 @@ exports[`IntegrationGroup will not display infra links when infra is unavailable ariaLabel="Search APM for this monitor" href="/app/apm#/services?kuery=url.domain:%20%22undefined%22&rangeFrom=now-15m&rangeTo=now" iconType="apmApp" - message="Check APM for domain" - tooltipContent="Click here to check APM for the domain \\"\\"." + message="Show APM Data" + tooltipContent="Click here to check APM for the domain \\"\\" or explicitly defined \\"service name\\"." /> @@ -137,8 +137,8 @@ exports[`IntegrationGroup will not display logging links when logging is unavail ariaLabel="Search APM for this monitor" href="/app/apm#/services?kuery=url.domain:%20%22undefined%22&rangeFrom=now-15m&rangeTo=now" iconType="apmApp" - message="Check APM for domain" - tooltipContent="Click here to check APM for the domain \\"\\"." + message="Show APM Data" + tooltipContent="Click here to check APM for the domain \\"\\" or explicitly defined \\"service name\\"." /> diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx index ff3b5d67375fe..df3966c7079dd 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx @@ -67,16 +67,17 @@ export const IntegrationGroup = ({ summary }: IntegrationGroupProps) => { href={getApmHref(summary, basePath, dateRangeStart, dateRangeEnd)} iconType="apmApp" message={i18n.translate('xpack.uptime.apmIntegrationAction.text', { - defaultMessage: 'Check APM for domain', + defaultMessage: 'Show APM Data', description: - 'A message explaining that when the user clicks the associated link, it will navigate to the APM app and search for the selected domain', + 'A message explaining that when the user clicks the associated link, it will navigate to the APM app', })} tooltipContent={i18n.translate( 'xpack.uptime.monitorList.observabilityIntegrationsColumn.apmIntegrationLink.tooltip', { - defaultMessage: 'Click here to check APM for the domain "{domain}".', + defaultMessage: + 'Click here to check APM for the domain "{domain}" or explicitly defined "service name".', description: - 'A messsage shown in a tooltip explaining that the nested anchor tag will navigate to the APM app and search for the given URL domain.', + 'A messsage shown in a tooltip explaining that the nested anchor tag will navigate to the APM app and search for the given URL domain or explicitly defined service name.', values: { domain, }, diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_apm_href.test.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_apm_href.test.ts index 8e320a8d9533a..2444cfbee63d5 100644 --- a/x-pack/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_apm_href.test.ts +++ b/x-pack/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_apm_href.test.ts @@ -9,7 +9,6 @@ import { MonitorSummary, makePing } from '../../../../../common/runtime_types'; describe('getApmHref', () => { let summary: MonitorSummary; - beforeEach(() => { summary = { monitor_id: 'foo', @@ -49,4 +48,18 @@ describe('getApmHref', () => { `"/app/apm#/services?kuery=url.domain:%20%22www.elastic.co%22&rangeFrom=now-15m&rangeTo=now"` ); }); + + describe('with service.name', () => { + const serviceName = 'MyServiceName'; + beforeEach(() => { + summary.state.service = { name: serviceName }; + }); + + it('links to the named service', () => { + const result = getApmHref(summary, 'foo', 'now-15m', 'now'); + expect(result).toMatchInlineSnapshot( + `"foo/app/apm#/services?kuery=service.name:%20%22${serviceName}%22&rangeFrom=now-15m&rangeTo=now"` + ); + }); + }); }); diff --git a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts index a1d69950cb61a..655d7a1407750 100644 --- a/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts +++ b/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts @@ -12,10 +12,15 @@ export const getApmHref = ( basePath: string, dateRangeStart: string, dateRangeEnd: string -) => - addBasePath( +) => { + const clause = summary?.state?.service?.name + ? `service.name: "${summary.state.service.name}"` + : `url.domain: "${summary.state.url?.domain}"`; + + return addBasePath( basePath, `/app/apm#/services?kuery=${encodeURI( - `url.domain: "${summary?.state?.url?.domain}"` + clause )}&rangeFrom=${dateRangeStart}&rangeTo=${dateRangeEnd}` ); +}; diff --git a/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts b/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts index f631d5c963ca5..98db43c5b2623 100644 --- a/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts +++ b/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts @@ -93,6 +93,7 @@ export const summaryPingsToSummary = (summaryPings: Ping[]): MonitorSummary => { observer: { geo: { name: summaryPings.map((p) => p.observer?.geo?.name ?? '').filter((n) => n !== '') }, }, + service: summaryPings.find((p) => p.service?.name)?.service, }, }; }; From 631c17c6f21bf7ce45f7676a2746f0cc0763925c Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Wed, 29 Jul 2020 06:56:25 -0700 Subject: [PATCH 118/126] [Metrics UI] Fix hasData call to ensure it has data not just indices (#72969) * [Metrics UI] Fix hasData call to ensure it has data not just indices * Fixing formatting Co-authored-by: Elastic Machine --- .../infra/server/lib/create_search_client.ts | 16 ++++++++++++++ .../infra/server/lib/sources/has_data.ts | 21 +++++++++++++++++++ .../infra/server/routes/snapshot/index.ts | 10 +++------ .../infra/server/routes/source/index.ts | 16 +++++++++----- 4 files changed, 51 insertions(+), 12 deletions(-) create mode 100644 x-pack/plugins/infra/server/lib/create_search_client.ts create mode 100644 x-pack/plugins/infra/server/lib/sources/has_data.ts diff --git a/x-pack/plugins/infra/server/lib/create_search_client.ts b/x-pack/plugins/infra/server/lib/create_search_client.ts new file mode 100644 index 0000000000000..d79d20b502e94 --- /dev/null +++ b/x-pack/plugins/infra/server/lib/create_search_client.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { RequestHandlerContext } from 'src/core/server'; +import { CallWithRequestParams, InfraDatabaseSearchResponse } from './adapters/framework'; +import { KibanaFramework } from './adapters/framework/kibana_framework_adapter'; + +export const createSearchClient = ( + requestContext: RequestHandlerContext, + framework: KibanaFramework +) => ( + opts: CallWithRequestParams +): Promise> => + framework.callWithRequest(requestContext, 'search', opts); diff --git a/x-pack/plugins/infra/server/lib/sources/has_data.ts b/x-pack/plugins/infra/server/lib/sources/has_data.ts new file mode 100644 index 0000000000000..79b1375059dcb --- /dev/null +++ b/x-pack/plugins/infra/server/lib/sources/has_data.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ESSearchClient } from '../snapshot'; + +export const hasData = async (index: string, client: ESSearchClient) => { + const params = { + index, + allowNoIndices: true, + terminate_after: 1, + ignoreUnavailable: true, + body: { + size: 0, + }, + }; + const results = await client(params); + return results.hits.total.value !== 0; +}; diff --git a/x-pack/plugins/infra/server/routes/snapshot/index.ts b/x-pack/plugins/infra/server/routes/snapshot/index.ts index e99103080463e..00bc1e74ea871 100644 --- a/x-pack/plugins/infra/server/routes/snapshot/index.ts +++ b/x-pack/plugins/infra/server/routes/snapshot/index.ts @@ -13,7 +13,7 @@ import { UsageCollector } from '../../usage/usage_collector'; import { parseFilterQuery } from '../../utils/serialized_query'; import { SnapshotRequestRT, SnapshotNodeResponseRT } from '../../../common/http_api/snapshot_api'; import { throwErrors } from '../../../common/runtime_types'; -import { CallWithRequestParams, InfraDatabaseSearchResponse } from '../../lib/adapters/framework'; +import { createSearchClient } from '../../lib/create_search_client'; const escapeHatch = schema.object({}, { unknowns: 'allow' }); @@ -63,12 +63,8 @@ export const initSnapshotRoute = (libs: InfraBackendLibs) => { overrideCompositeSize, }; - const searchES = ( - opts: CallWithRequestParams - ): Promise> => - framework.callWithRequest(requestContext, 'search', opts); - - const nodesWithInterval = await libs.snapshot.getNodes(searchES, options); + const client = createSearchClient(requestContext, framework); + const nodesWithInterval = await libs.snapshot.getNodes(client, options); return response.ok({ body: SnapshotNodeResponseRT.encode(nodesWithInterval), }); diff --git a/x-pack/plugins/infra/server/routes/source/index.ts b/x-pack/plugins/infra/server/routes/source/index.ts index 6069d3a35e54c..9ff3902f1eae7 100644 --- a/x-pack/plugins/infra/server/routes/source/index.ts +++ b/x-pack/plugins/infra/server/routes/source/index.ts @@ -7,6 +7,8 @@ import { schema } from '@kbn/config-schema'; import { SourceResponseRuntimeType } from '../../../common/http_api/source_api'; import { InfraBackendLibs } from '../../lib/infra_types'; import { InfraIndexType } from '../../graphql/types'; +import { hasData } from '../../lib/sources/has_data'; +import { createSearchClient } from '../../lib/create_search_client'; const typeToInfraIndexType = (value: string | undefined) => { switch (value) { @@ -80,13 +82,17 @@ export const initSourceRoute = (libs: InfraBackendLibs) => { try { const { type, sourceId } = request.params; - const hasData = - type === 'metrics' - ? await libs.sourceStatus.hasMetricIndices(requestContext, sourceId) - : (await libs.sourceStatus.getLogIndexStatus(requestContext, sourceId)) !== 'missing'; + const client = createSearchClient(requestContext, framework); + const source = await libs.sources.getSourceConfiguration( + requestContext.core.savedObjects.client, + sourceId + ); + const indexPattern = + type === 'metrics' ? source.configuration.metricAlias : source.configuration.logAlias; + const results = await hasData(indexPattern, client); return response.ok({ - body: { hasData }, + body: { hasData: results }, }); } catch (error) { return response.internalError({ From 719c292a0ca8ed7c82da31e76b552416c807ea24 Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Wed, 29 Jul 2020 10:00:53 -0400 Subject: [PATCH 119/126] [kbn-storybook] Update Storybook to 5.3.19 (#73320) Co-authored-by: Spencer Co-authored-by: spalger --- packages/kbn-storybook/package.json | 14 +- x-pack/package.json | 11 +- .../chart_tooltip/chart_tooltip.tsx | 2 +- yarn.lock | 2022 +++++++---------- 4 files changed, 820 insertions(+), 1229 deletions(-) diff --git a/packages/kbn-storybook/package.json b/packages/kbn-storybook/package.json index 4f035c3334b86..53ad84da93988 100644 --- a/packages/kbn-storybook/package.json +++ b/packages/kbn-storybook/package.json @@ -6,14 +6,14 @@ "dependencies": { "@kbn/babel-preset": "1.0.0", "@kbn/dev-utils": "1.0.0", - "@storybook/addon-actions": "^5.2.8", + "@storybook/addon-actions": "^5.3.19", "@storybook/addon-console": "^1.2.1", - "@storybook/addon-info": "^5.2.8", - "@storybook/addon-knobs": "^5.2.8", - "@storybook/addon-options": "^5.2.8", - "@storybook/addon-storyshots": "^5.2.8", - "@storybook/react": "^5.2.8", - "@storybook/theming": "^5.2.8", + "@storybook/addon-info": "^5.3.19", + "@storybook/addon-knobs": "^5.3.19", + "@storybook/addon-options": "^5.3.19", + "@storybook/addon-storyshots": "^5.3.19", + "@storybook/react": "^5.3.19", + "@storybook/theming": "^5.3.19", "copy-webpack-plugin": "^6.0.2", "fast-glob": "2.2.7", "glob-watcher": "5.0.3", diff --git a/x-pack/package.json b/x-pack/package.json index 76655f75cadcc..3a9b3ca606de6 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -37,12 +37,13 @@ "@kbn/storybook": "1.0.0", "@kbn/test": "1.0.0", "@kbn/utility-types": "1.0.0", - "@storybook/addon-actions": "^5.2.6", + "@storybook/addon-actions": "^5.3.19", "@storybook/addon-console": "^1.2.1", - "@storybook/addon-knobs": "^5.2.6", - "@storybook/addon-storyshots": "^5.2.6", - "@storybook/react": "^5.2.6", - "@storybook/theming": "^5.2.6", + "@storybook/addon-info": "^5.3.19", + "@storybook/addon-knobs": "^5.3.19", + "@storybook/addon-storyshots": "^5.3.19", + "@storybook/react": "^5.3.19", + "@storybook/theming": "^5.3.19", "@testing-library/react": "^9.3.2", "@testing-library/react-hooks": "^3.2.1", "@testing-library/jest-dom": "^5.8.0", diff --git a/x-pack/plugins/ml/public/application/components/chart_tooltip/chart_tooltip.tsx b/x-pack/plugins/ml/public/application/components/chart_tooltip/chart_tooltip.tsx index 3bd4ae1748311..a354612a348dc 100644 --- a/x-pack/plugins/ml/public/application/components/chart_tooltip/chart_tooltip.tsx +++ b/x-pack/plugins/ml/public/application/components/chart_tooltip/chart_tooltip.tsx @@ -29,7 +29,7 @@ const Tooltip: FC<{ service: ChartTooltipService }> = React.memo(({ service }) = useEffect(() => { const subscription = service.tooltipState$.subscribe((tooltipState) => { - if (refCallback.current) { + if (refCallback.current && typeof refCallback.current === 'function') { // update trigger refCallback.current(tooltipState.target); } diff --git a/yarn.lock b/yarn.lock index c31f58c3320e2..60d073330b35d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,7 +25,7 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== @@ -57,27 +57,7 @@ invariant "^2.2.4" semver "^5.5.0" -"@babel/core@7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" - integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.5.5" - "@babel/helpers" "^7.5.5" - "@babel/parser" "^7.5.5" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.5" - "@babel/types" "^7.5.5" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.0.0", "@babel/core@^7.0.1", "@babel/core@^7.1.0", "@babel/core@^7.4.3", "@babel/core@^7.7.5": +"@babel/core@^7.0.1", "@babel/core@^7.1.0", "@babel/core@^7.4.3", "@babel/core@^7.7.5": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== @@ -121,7 +101,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.0.0", "@babel/generator@^7.5.5", "@babel/generator@^7.9.0": +"@babel/generator@^7.0.0", "@babel/generator@^7.9.0": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA== @@ -249,7 +229,7 @@ "@babel/helper-replace-supers" "^7.10.1" "@babel/helper-split-export-declaration" "^7.10.1" -"@babel/helper-create-class-features-plugin@^7.4.4", "@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.8.3": +"@babel/helper-create-class-features-plugin@^7.8.3": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== @@ -576,7 +556,7 @@ "@babel/traverse" "^7.10.1" "@babel/types" "^7.10.1" -"@babel/helpers@^7.5.5", "@babel/helpers@^7.9.0": +"@babel/helpers@^7.9.0": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== @@ -603,7 +583,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.2.0", "@babel/parser@^7.5.5", "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.2.0", "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== @@ -622,7 +602,7 @@ "@babel/helper-remap-async-to-generator" "^7.10.1" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-async-generator-functions@^7.2.0", "@babel/plugin-proposal-async-generator-functions@^7.8.3": +"@babel/plugin-proposal-async-generator-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== @@ -631,14 +611,6 @@ "@babel/helper-remap-async-to-generator" "^7.8.3" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz#a974cfae1e37c3110e71f3c6a2e48b8e71958cd4" - integrity sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.5.5" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-class-properties@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01" @@ -647,7 +619,7 @@ "@babel/helper-create-class-features-plugin" "^7.10.1" "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-proposal-class-properties@^7.3.3", "@babel/plugin-proposal-class-properties@^7.7.0": +"@babel/plugin-proposal-class-properties@^7.7.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== @@ -655,15 +627,6 @@ "@babel/helper-create-class-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-proposal-decorators@7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.4.tgz#de9b2a1a8ab0196f378e2a82f10b6e2a36f21cc0" - integrity sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-decorators" "^7.2.0" - "@babel/plugin-proposal-dynamic-import@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz#e36979dc1dc3b73f6d6816fc4951da2363488ef0" @@ -672,7 +635,7 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-dynamic-import@^7.5.0", "@babel/plugin-proposal-dynamic-import@^7.8.3": +"@babel/plugin-proposal-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== @@ -696,7 +659,7 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-json-strings@^7.2.0", "@babel/plugin-proposal-json-strings@^7.8.3": +"@babel/plugin-proposal-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== @@ -736,14 +699,6 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.8.3" -"@babel/plugin-proposal-object-rest-spread@7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" - integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz#cba44908ac9f142650b4a65b8aa06bf3478d5fb6" @@ -753,7 +708,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.10.1" -"@babel/plugin-proposal-object-rest-spread@^7.3.2", "@babel/plugin-proposal-object-rest-spread@^7.5.5", "@babel/plugin-proposal-object-rest-spread@^7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.9.0": +"@babel/plugin-proposal-object-rest-spread@^7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== @@ -769,7 +724,7 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-catch-binding@^7.2.0", "@babel/plugin-proposal-optional-catch-binding@^7.8.3": +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== @@ -817,7 +772,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.8.8" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-async-generators@^7.2.0", "@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": +"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== @@ -845,20 +800,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-decorators@^7.2.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda" - integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-dynamic-import@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -873,14 +814,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.2.0", "@babel/plugin-syntax-flow@^7.8.3": +"@babel/plugin-syntax-flow@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f" integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg== dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-json-strings@^7.2.0", "@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": +"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== @@ -929,14 +870,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-object-rest-spread@^7.2.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.2.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": +"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== @@ -971,13 +912,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-syntax-typescript@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz#c1f659dda97711a569cef75275f7e15dcaa6cabc" - integrity sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-transform-arrow-functions@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b" @@ -985,7 +919,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-arrow-functions@^7.2.0", "@babel/plugin-transform-arrow-functions@^7.8.3": +"@babel/plugin-transform-arrow-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== @@ -1001,7 +935,7 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/helper-remap-async-to-generator" "^7.10.1" -"@babel/plugin-transform-async-to-generator@^7.5.0", "@babel/plugin-transform-async-to-generator@^7.8.3": +"@babel/plugin-transform-async-to-generator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== @@ -1017,7 +951,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-block-scoped-functions@^7.2.0", "@babel/plugin-transform-block-scoped-functions@^7.8.3": +"@babel/plugin-transform-block-scoped-functions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== @@ -1032,7 +966,7 @@ "@babel/helper-plugin-utils" "^7.10.1" lodash "^4.17.13" -"@babel/plugin-transform-block-scoping@^7.5.5", "@babel/plugin-transform-block-scoping@^7.8.3": +"@babel/plugin-transform-block-scoping@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== @@ -1054,7 +988,7 @@ "@babel/helper-split-export-declaration" "^7.10.1" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.5.5", "@babel/plugin-transform-classes@^7.9.0": +"@babel/plugin-transform-classes@^7.9.0": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ== @@ -1075,20 +1009,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-computed-properties@^7.2.0", "@babel/plugin-transform-computed-properties@^7.8.3": +"@babel/plugin-transform-computed-properties@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-destructuring@7.5.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" - integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-destructuring@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907" @@ -1096,7 +1023,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-destructuring@^7.5.0", "@babel/plugin-transform-destructuring@^7.8.3": +"@babel/plugin-transform-destructuring@^7.8.3": version "7.8.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b" integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ== @@ -1126,7 +1053,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-duplicate-keys@^7.5.0", "@babel/plugin-transform-duplicate-keys@^7.8.3": +"@babel/plugin-transform-duplicate-keys@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== @@ -1141,7 +1068,7 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1" "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-exponentiation-operator@^7.2.0", "@babel/plugin-transform-exponentiation-operator@^7.8.3": +"@babel/plugin-transform-exponentiation-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== @@ -1149,14 +1076,6 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-flow-strip-types@7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz#d267a081f49a8705fc9146de0768c6b58dccd8f7" - integrity sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" - "@babel/plugin-transform-flow-strip-types@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" @@ -1172,7 +1091,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-for-of@^7.4.4", "@babel/plugin-transform-for-of@^7.9.0": +"@babel/plugin-transform-for-of@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== @@ -1187,7 +1106,7 @@ "@babel/helper-function-name" "^7.10.1" "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-function-name@^7.4.4", "@babel/plugin-transform-function-name@^7.8.3": +"@babel/plugin-transform-function-name@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== @@ -1202,7 +1121,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-literals@^7.2.0", "@babel/plugin-transform-literals@^7.8.3": +"@babel/plugin-transform-literals@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== @@ -1216,7 +1135,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-member-expression-literals@^7.2.0", "@babel/plugin-transform-member-expression-literals@^7.8.3": +"@babel/plugin-transform-member-expression-literals@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== @@ -1232,7 +1151,7 @@ "@babel/helper-plugin-utils" "^7.10.1" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-amd@^7.5.0", "@babel/plugin-transform-modules-amd@^7.9.0": +"@babel/plugin-transform-modules-amd@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== @@ -1251,7 +1170,7 @@ "@babel/helper-simple-access" "^7.10.1" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.5.0", "@babel/plugin-transform-modules-commonjs@^7.9.0": +"@babel/plugin-transform-modules-commonjs@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== @@ -1271,7 +1190,7 @@ "@babel/helper-plugin-utils" "^7.10.1" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.5.0", "@babel/plugin-transform-modules-systemjs@^7.9.0": +"@babel/plugin-transform-modules-systemjs@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== @@ -1289,7 +1208,7 @@ "@babel/helper-module-transforms" "^7.10.1" "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-modules-umd@^7.2.0", "@babel/plugin-transform-modules-umd@^7.9.0": +"@babel/plugin-transform-modules-umd@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== @@ -1297,7 +1216,7 @@ "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5", "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== @@ -1311,7 +1230,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-new-target@^7.4.4", "@babel/plugin-transform-new-target@^7.8.3": +"@babel/plugin-transform-new-target@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== @@ -1326,7 +1245,7 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/helper-replace-supers" "^7.10.1" -"@babel/plugin-transform-object-super@^7.5.5", "@babel/plugin-transform-object-super@^7.8.3": +"@babel/plugin-transform-object-super@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== @@ -1342,7 +1261,7 @@ "@babel/helper-get-function-arity" "^7.10.1" "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-parameters@^7.4.4", "@babel/plugin-transform-parameters@^7.8.7": +"@babel/plugin-transform-parameters@^7.8.7": version "7.9.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a" integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg== @@ -1357,7 +1276,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-property-literals@^7.2.0", "@babel/plugin-transform-property-literals@^7.8.3": +"@babel/plugin-transform-property-literals@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== @@ -1371,27 +1290,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-display-name@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" - integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== +"@babel/plugin-transform-react-display-name@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz#e6a33f6d48dfb213dda5e007d0c7ff82b6a3d8ef" + integrity sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.8.3": +"@babel/plugin-transform-react-display-name@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-display-name@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz#e6a33f6d48dfb213dda5e007d0c7ff82b6a3d8ef" - integrity sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-transform-react-jsx-development@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.1.tgz#1ac6300d8b28ef381ee48e6fec430cc38047b7f3" @@ -1410,14 +1322,6 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-react-jsx-self@^7.0.0", "@babel/plugin-transform-react-jsx-self@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" - integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.8.3" - "@babel/plugin-transform-react-jsx-self@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.1.tgz#22143e14388d72eb88649606bb9e46f421bc3821" @@ -1426,10 +1330,10 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-jsx" "^7.10.1" -"@babel/plugin-transform-react-jsx-source@^7.0.0", "@babel/plugin-transform-react-jsx-source@^7.9.0": +"@babel/plugin-transform-react-jsx-self@^7.9.0": version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" - integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b" + integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" @@ -1442,13 +1346,11 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-jsx" "^7.10.1" -"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.9.4": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f" - integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw== +"@babel/plugin-transform-react-jsx-source@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0" + integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw== dependencies: - "@babel/helper-builder-react-jsx" "^7.9.0" - "@babel/helper-builder-react-jsx-experimental" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-jsx" "^7.8.3" @@ -1462,6 +1364,16 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-jsx" "^7.10.1" +"@babel/plugin-transform-react-jsx@^7.9.4": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f" + integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw== + dependencies: + "@babel/helper-builder-react-jsx" "^7.9.0" + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/plugin-transform-react-pure-annotations@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.1.tgz#f5e7c755d3e7614d4c926e144f501648a5277b70" @@ -1477,7 +1389,7 @@ dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-regenerator@^7.4.5", "@babel/plugin-transform-regenerator@^7.8.7": +"@babel/plugin-transform-regenerator@^7.8.7": version "7.8.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8" integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA== @@ -1491,23 +1403,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-reserved-words@^7.2.0", "@babel/plugin-transform-reserved-words@^7.8.3": +"@babel/plugin-transform-reserved-words@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-runtime@7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz#a6331afbfc59189d2135b2e09474457a8e3d28bc" - integrity sha512-6Xmeidsun5rkwnGfMOp6/z9nSzWpHFNVr2Jx7kwoq4mVatQfQx5S56drBgEHF+XQbKOdIaOiMIINvp/kAwMN+w== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - resolve "^1.8.1" - semver "^5.5.1" - "@babel/plugin-transform-runtime@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz#fd1887f749637fb2ed86dc278e79eb41df37f4b1" @@ -1525,7 +1427,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-shorthand-properties@^7.2.0", "@babel/plugin-transform-shorthand-properties@^7.8.3": +"@babel/plugin-transform-shorthand-properties@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== @@ -1539,7 +1441,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-spread@^7.2.0", "@babel/plugin-transform-spread@^7.8.3": +"@babel/plugin-transform-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== @@ -1554,7 +1456,7 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/helper-regex" "^7.10.1" -"@babel/plugin-transform-sticky-regex@^7.2.0", "@babel/plugin-transform-sticky-regex@^7.8.3": +"@babel/plugin-transform-sticky-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== @@ -1570,7 +1472,7 @@ "@babel/helper-annotate-as-pure" "^7.10.1" "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-template-literals@^7.4.4", "@babel/plugin-transform-template-literals@^7.8.3": +"@babel/plugin-transform-template-literals@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== @@ -1585,7 +1487,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-typeof-symbol@^7.2.0", "@babel/plugin-transform-typeof-symbol@^7.8.4": +"@babel/plugin-transform-typeof-symbol@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== @@ -1601,15 +1503,6 @@ "@babel/helper-plugin-utils" "^7.10.1" "@babel/plugin-syntax-typescript" "^7.10.1" -"@babel/plugin-transform-typescript@^7.3.2": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz#4bb4dde4f10bbf2d787fce9707fb09b483e33359" - integrity sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-typescript" "^7.8.3" - "@babel/plugin-transform-unicode-escapes@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940" @@ -1625,7 +1518,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.10.1" "@babel/helper-plugin-utils" "^7.10.1" -"@babel/plugin-transform-unicode-regex@^7.4.4", "@babel/plugin-transform-unicode-regex@^7.8.3": +"@babel/plugin-transform-unicode-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== @@ -1633,63 +1526,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/preset-env@7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.5.tgz#bc470b53acaa48df4b8db24a570d6da1fef53c9a" - integrity sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-dynamic-import" "^7.5.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.5.5" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.5.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.5.5" - "@babel/plugin-transform-classes" "^7.5.5" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.5.0" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/plugin-transform-duplicate-keys" "^7.5.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.4.4" - "@babel/plugin-transform-function-name" "^7.4.4" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.5.0" - "@babel/plugin-transform-modules-commonjs" "^7.5.0" - "@babel/plugin-transform-modules-systemjs" "^7.5.0" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" - "@babel/plugin-transform-new-target" "^7.4.4" - "@babel/plugin-transform-object-super" "^7.5.5" - "@babel/plugin-transform-parameters" "^7.4.4" - "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.4.5" - "@babel/plugin-transform-reserved-words" "^7.2.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.2.0" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.4.4" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.4.4" - "@babel/types" "^7.5.5" - browserslist "^4.6.0" - core-js-compat "^3.1.1" - invariant "^2.2.2" - js-levenshtein "^1.1.3" - semver "^5.5.0" - -"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.4.3", "@babel/preset-env@^7.4.5", "@babel/preset-env@^7.7.1": +"@babel/preset-env@^7.0.0", "@babel/preset-env@^7.4.3", "@babel/preset-env@^7.4.5": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== @@ -1844,18 +1681,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" - integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - -"@babel/preset-react@^7.0.0", "@babel/preset-react@^7.7.0": +"@babel/preset-react@^7.0.0": version "7.9.4" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.4.tgz#c6c97693ac65b6b9c0b4f25b948a8f665463014d" integrity sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ== @@ -1880,14 +1706,6 @@ "@babel/plugin-transform-react-jsx-source" "^7.10.1" "@babel/plugin-transform-react-pure-annotations" "^7.10.1" -"@babel/preset-typescript@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.3.3.tgz#88669911053fa16b2b276ea2ede2ca603b3f307a" - integrity sha512-mzMVuIP4lqtn4du2ynEfdO0+RYcslwrZiJHXu4MGaC1ctJiW2fyaeDrtjJGs7R/KebZ1sgowcIoWf4uRpEfKEg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.3.2" - "@babel/preset-typescript@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.10.1.tgz#a8d8d9035f55b7d99a2461a0bdc506582914d07e" @@ -1922,14 +1740,7 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/runtime@7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" - integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": version "7.9.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== @@ -1943,7 +1754,19 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.0.0", "@babel/template@^7.3.3", "@babel/template@^7.4.4", "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": +"@babel/runtime@^7.3.1", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.7": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c" + integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/standalone@^7.4.5": + version "7.10.5" + resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.10.5.tgz#4ee38dc79fda10a2a0da0897f09e270310151314" + integrity sha512-PERGHqhQ7H3TrdglvSW4pEHULywMJEdytnzaR0VPF1HN45aS+3FcE62efb90XPKS9TlgrEUkYDvYMt+0m6G0YA== + +"@babel/template@^7.0.0", "@babel/template@^7.3.3", "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== @@ -1961,7 +1784,7 @@ "@babel/parser" "^7.10.1" "@babel/types" "^7.10.1" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.4.5", "@babel/traverse@^7.5.5", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.4.5", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== @@ -2006,7 +1829,7 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== @@ -2345,7 +2168,29 @@ "@emotion/utils" "0.11.2" "@emotion/weak-memoize" "0.2.4" -"@emotion/core@^10.0.14", "@emotion/core@^10.0.9": +"@emotion/cache@^10.0.27": + version "10.0.29" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz#87e7e64f412c060102d589fe7c6dc042e6f9d1e0" + integrity sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ== + dependencies: + "@emotion/sheet" "0.9.4" + "@emotion/stylis" "0.8.5" + "@emotion/utils" "0.11.3" + "@emotion/weak-memoize" "0.2.5" + +"@emotion/core@^10.0.20": + version "10.0.28" + resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.28.tgz#bb65af7262a234593a9e952c041d0f1c9b9bef3d" + integrity sha512-pH8UueKYO5jgg0Iq+AmCLxBsvuGtvlmiDCOuv8fGNYn3cowFpLN98L8zO56U0H1PjDIyAlXymgL3Wu7u7v6hbA== + dependencies: + "@babel/runtime" "^7.5.5" + "@emotion/cache" "^10.0.27" + "@emotion/css" "^10.0.27" + "@emotion/serialize" "^0.11.15" + "@emotion/sheet" "0.9.4" + "@emotion/utils" "0.11.3" + +"@emotion/core@^10.0.9": version "10.0.22" resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.22.tgz#2ac7bcf9b99a1979ab5b0a876fbf37ab0688b177" integrity sha512-7eoP6KQVUyOjAkE6y4fdlxbZRA4ILs7dqkkm6oZUJmihtHv0UBq98VgPirq9T8F9K2gKu0J/au/TpKryKMinaA== @@ -2366,35 +2211,32 @@ "@emotion/utils" "0.11.2" babel-plugin-emotion "^10.0.22" -"@emotion/hash@0.7.2": - version "0.7.2" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.2.tgz#53211e564604beb9befa7a4400ebf8147473eeef" - integrity sha512-RMtr1i6E8MXaBWwhXL3yeOU8JXRnz8GNxHvaUfVvwxokvayUY0zoBeWbKw1S9XkufmGEEdQd228pSZXFkAln8Q== +"@emotion/css@^10.0.27": + version "10.0.27" + resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.27.tgz#3a7458198fbbebb53b01b2b87f64e5e21241e14c" + integrity sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw== + dependencies: + "@emotion/serialize" "^0.11.15" + "@emotion/utils" "0.11.3" + babel-plugin-emotion "^10.0.27" "@emotion/hash@0.7.3": version "0.7.3" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.3.tgz#a166882c81c0c6040975dd30df24fae8549bd96f" integrity sha512-14ZVlsB9akwvydAdaEnVnvqu6J2P6ySv39hYyl/aoB6w/V+bXX0tay8cF6paqbgZsN2n5Xh15uF4pE+GvE+itw== -"@emotion/is-prop-valid@0.8.5": - version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.5.tgz#2dda0791f0eafa12b7a0a5b39858405cc7bde983" - integrity sha512-6ZODuZSFofbxSbcxwsFz+6ioPjb0ISJRRPLZ+WIbjcU2IMU0Io+RGQjjaTgOvNQl007KICBm7zXQaYQEC1r6Bg== - dependencies: - "@emotion/memoize" "0.7.3" +"@emotion/hash@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== -"@emotion/is-prop-valid@^0.8.8": +"@emotion/is-prop-valid@0.8.8", "@emotion/is-prop-valid@^0.8.8": version "0.8.8" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== dependencies: "@emotion/memoize" "0.7.4" -"@emotion/memoize@0.7.2": - version "0.7.2" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.2.tgz#7f4c71b7654068dfcccad29553520f984cc66b30" - integrity sha512-hnHhwQzvPCW1QjBWFyBtsETdllOM92BfrKWbUTmh9aeOlcVOiXvlPsK4104xH8NsaKfg86PTFsWkueQeUfMA/w== - "@emotion/memoize@0.7.3": version "0.7.3" resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.3.tgz#5b6b1c11d6a6dddf1f2fc996f74cf3b219644d78" @@ -2405,7 +2247,7 @@ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== -"@emotion/serialize@^0.11.12", "@emotion/serialize@^0.11.14", "@emotion/serialize@^0.11.9": +"@emotion/serialize@^0.11.12", "@emotion/serialize@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.14.tgz#56a6d8d04d837cc5b0126788b2134c51353c6488" integrity sha512-6hTsySIuQTbDbv00AnUO6O6Xafdwo5GswRlMZ5hHqiFx+4pZ7uGWXUQFW46Kc2taGhP89uXMXn/lWQkdyTosPA== @@ -2416,49 +2258,85 @@ "@emotion/utils" "0.11.2" csstype "^2.5.7" +"@emotion/serialize@^0.11.15", "@emotion/serialize@^0.11.16": + version "0.11.16" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad" + integrity sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg== + dependencies: + "@emotion/hash" "0.8.0" + "@emotion/memoize" "0.7.4" + "@emotion/unitless" "0.7.5" + "@emotion/utils" "0.11.3" + csstype "^2.5.7" + "@emotion/sheet@0.9.3": version "0.9.3" resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.3.tgz#689f135ecf87d3c650ed0c4f5ddcbe579883564a" integrity sha512-c3Q6V7Df7jfwSq5AzQWbXHa5soeE4F5cbqi40xn0CzXxWW9/6Mxq48WJEtqfWzbZtW9odZdnRAkwCQwN12ob4A== -"@emotion/styled-base@^10.0.23": - version "10.0.24" - resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.0.24.tgz#9497efd8902dfeddee89d24b0eeb26b0665bfe8b" - integrity sha512-AnBImerf0h4dGAJVo0p0VE8KoAns71F28ErGFK474zbNAHX6yqSWQUasb+1jvg/VPwZjCp19+tAr6oOB0pwmLQ== +"@emotion/sheet@0.9.4": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5" + integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA== + +"@emotion/styled-base@^10.0.27": + version "10.0.31" + resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.0.31.tgz#940957ee0aa15c6974adc7d494ff19765a2f742a" + integrity sha512-wTOE1NcXmqMWlyrtwdkqg87Mu6Rj1MaukEoEmEkHirO5IoHDJ8LgCQL4MjJODgxWxXibGR3opGp1p7YvkNEdXQ== dependencies: "@babel/runtime" "^7.5.5" - "@emotion/is-prop-valid" "0.8.5" - "@emotion/serialize" "^0.11.14" - "@emotion/utils" "0.11.2" + "@emotion/is-prop-valid" "0.8.8" + "@emotion/serialize" "^0.11.15" + "@emotion/utils" "0.11.3" -"@emotion/styled@^10.0.14": - version "10.0.23" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.0.23.tgz#2f8279bd59b99d82deade76d1046249ddfab7c1b" - integrity sha512-gNr04eqBQ2iYUx8wFLZDfm3N8/QUOODu/ReDXa693uyQGy2OqA+IhPJk+kA7id8aOfwAsMuvZ0pJImEXXKtaVQ== +"@emotion/styled@^10.0.17": + version "10.0.27" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.0.27.tgz#12cb67e91f7ad7431e1875b1d83a94b814133eaf" + integrity sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q== dependencies: - "@emotion/styled-base" "^10.0.23" - babel-plugin-emotion "^10.0.23" + "@emotion/styled-base" "^10.0.27" + babel-plugin-emotion "^10.0.27" "@emotion/stylis@0.8.4", "@emotion/stylis@^0.8.4": version "0.8.4" resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.4.tgz#6c51afdf1dd0d73666ba09d2eb6c25c220d6fe4c" integrity sha512-TLmkCVm8f8gH0oLv+HWKiu7e8xmBIaokhxcEKPh1m8pXiV/akCiq50FvYgOwY42rjejck8nsdQxZlXZ7pmyBUQ== +"@emotion/stylis@0.8.5": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" + integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== + "@emotion/unitless@0.7.4", "@emotion/unitless@^0.7.4": version "0.7.4" resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.4.tgz#a87b4b04e5ae14a88d48ebef15015f6b7d1f5677" integrity sha512-kBa+cDHOR9jpRJ+kcGMsysrls0leukrm68DmFQoMIWQcXdr2cZvyvypWuGYT7U+9kAExUE7+T7r6G3C3A6L8MQ== +"@emotion/unitless@0.7.5": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" + integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== + "@emotion/utils@0.11.2": version "0.11.2" resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.2.tgz#713056bfdffb396b0a14f1c8f18e7b4d0d200183" integrity sha512-UHX2XklLl3sIaP6oiMmlVzT0J+2ATTVpf0dHQVyPJHTkOITvXfaSqnRk6mdDhV9pR8T/tHc3cex78IKXssmzrA== +"@emotion/utils@0.11.3": + version "0.11.3" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924" + integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw== + "@emotion/weak-memoize@0.2.4": version "0.2.4" resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.4.tgz#622a72bebd1e3f48d921563b4b60a762295a81fc" integrity sha512-6PYY5DVdAY1ifaQW6XYTnOMihmBVT27elqSjEoodchsGjzYlEsTQMcEhSud99kVawatyTZRTiVkJ/c6lwbQ7nA== +"@emotion/weak-memoize@0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" + integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== + "@gulp-sourcemaps/identity-map@1.X": version "1.0.2" resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz#1e6fe5d8027b1f285dc0d31762f566bccd73d5a9" @@ -3625,44 +3503,24 @@ "@types/node" ">=8.9.0" axios "^0.18.0" -"@storybook/addon-actions@^5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-5.2.6.tgz#4fe411fc3bdb1d44058f23fbc8eb8d1bac29d521" - integrity sha512-CwTJPqe3NcEU7oqS5KoiCX9FXYmI2Dyp1Sh6r90JmXZ8B49ZXm6BDLX0gS3TooD6/AcdU8xdBcSvN0CkxQ5QGA== - dependencies: - "@storybook/addons" "5.2.6" - "@storybook/api" "5.2.6" - "@storybook/client-api" "5.2.6" - "@storybook/components" "5.2.6" - "@storybook/core-events" "5.2.6" - "@storybook/theming" "5.2.6" +"@storybook/addon-actions@^5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-5.3.19.tgz#50548fa6e84bc79ad95233ce23ade4878fc7cfac" + integrity sha512-gXF29FFUgYlUoFf1DcVCmH1chg2ElaHWMmCi5h7aZe+g6fXBQw0UtEdJnYLMOqZCIiWoZyuf1ETD0RbNHPhRIw== + dependencies: + "@storybook/addons" "5.3.19" + "@storybook/api" "5.3.19" + "@storybook/client-api" "5.3.19" + "@storybook/components" "5.3.19" + "@storybook/core-events" "5.3.19" + "@storybook/theming" "5.3.19" core-js "^3.0.1" fast-deep-equal "^2.0.1" global "^4.3.2" polished "^3.3.1" prop-types "^15.7.2" react "^16.8.3" - react-inspector "^3.0.2" - uuid "^3.3.2" - -"@storybook/addon-actions@^5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-5.2.8.tgz#f63c6e1afb59e94ca1ebc776b7cad9b815e7419e" - integrity sha512-hadk+UaU6upOW0g447RfLRrnXRgE2rjRVk5sT8mVxBMj032NnwUd7ie/BZwy1yg5B8oFtpkgQYwqhPtoO2xBaQ== - dependencies: - "@storybook/addons" "5.2.8" - "@storybook/api" "5.2.8" - "@storybook/client-api" "5.2.8" - "@storybook/components" "5.2.8" - "@storybook/core-events" "5.2.8" - "@storybook/theming" "5.2.8" - core-js "^3.0.1" - fast-deep-equal "^2.0.1" - global "^4.3.2" - polished "^3.3.1" - prop-types "^15.7.2" - react "^16.8.3" - react-inspector "^3.0.2" + react-inspector "^4.0.0" uuid "^3.3.2" "@storybook/addon-console@^1.2.1": @@ -3672,19 +3530,18 @@ dependencies: global "^4.3.2" -"@storybook/addon-info@^5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-info/-/addon-info-5.2.8.tgz#bf29741c21c16c85f4a7007606e8afa3eb77965c" - integrity sha512-iY8malDF6yayLfpiffMwDXOWeeoXdRbxse1f+kNHK4aVEUXLyh+uiogPhO8dzVDy8dQw1LP9C7xKZe2Dls59kw== +"@storybook/addon-info@^5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-info/-/addon-info-5.3.19.tgz#175af53ba54ddb8fe24b3c979206ffbbf42bc4f4" + integrity sha512-MiFLcyoOmwawquagQHkqiPHnvBOKrVaS/wnO1XyBvIHwkK+KN7CZ9l7HakA4SO76kugrY9OJYyi5YvEEdN6vww== dependencies: - "@storybook/addons" "5.2.8" - "@storybook/client-logger" "5.2.8" - "@storybook/components" "5.2.8" - "@storybook/theming" "5.2.8" + "@storybook/addons" "5.3.19" + "@storybook/client-logger" "5.3.19" + "@storybook/components" "5.3.19" + "@storybook/theming" "5.3.19" core-js "^3.0.1" global "^4.3.2" - jsx-to-string "^1.4.0" - marksy "^7.0.0" + marksy "^8.0.0" nested-object-assign "^1.0.3" prop-types "^15.7.2" react "^16.8.3" @@ -3694,17 +3551,17 @@ react-lifecycles-compat "^3.0.4" util-deprecate "^1.0.2" -"@storybook/addon-knobs@^5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-5.2.6.tgz#28b2c74ea26519fef204915142a03bd7476f247c" - integrity sha512-whEZl6PpUPtOWBhmWlZ11EloxN6ad3WrJk5FyYlg3BcXG/HtlMVogBKdch83SYTT9jhHwbfwKnAng9J3UjgPbQ== - dependencies: - "@storybook/addons" "5.2.6" - "@storybook/api" "5.2.6" - "@storybook/client-api" "5.2.6" - "@storybook/components" "5.2.6" - "@storybook/core-events" "5.2.6" - "@storybook/theming" "5.2.6" +"@storybook/addon-knobs@^5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-5.3.19.tgz#b2483e401e2dca6390e1c0a81801130a0b515efb" + integrity sha512-e7z6KhvVOUGjygK4VL5Un1U3t0XG0jkb/BOHVWQMtH5dWNn3zofD3LrZZy24eAsyre/ej/LGo/BzwDSXkKLTog== + dependencies: + "@storybook/addons" "5.3.19" + "@storybook/api" "5.3.19" + "@storybook/client-api" "5.3.19" + "@storybook/components" "5.3.19" + "@storybook/core-events" "5.3.19" + "@storybook/theming" "5.3.19" "@types/react-color" "^3.0.1" copy-to-clipboard "^3.0.8" core-js "^3.0.1" @@ -3716,130 +3573,64 @@ qs "^6.6.0" react-color "^2.17.0" react-lifecycles-compat "^3.0.4" - react-select "^3.0.0" - -"@storybook/addon-knobs@^5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-5.2.8.tgz#e0d03823969921a0da57a329376d03066dd749ee" - integrity sha512-5SAMJj+0pbhCiyNkKjkUxEbM9L/wrOE4HTvM7gvm902fULuKZklb3wV8iiUNRfIPCs6VhmmIhPzXICGjhW5xIg== - dependencies: - "@storybook/addons" "5.2.8" - "@storybook/api" "5.2.8" - "@storybook/client-api" "5.2.8" - "@storybook/components" "5.2.8" - "@storybook/core-events" "5.2.8" - "@storybook/theming" "5.2.8" - "@types/react-color" "^3.0.1" - copy-to-clipboard "^3.0.8" - core-js "^3.0.1" - escape-html "^1.0.3" - fast-deep-equal "^2.0.1" - global "^4.3.2" - lodash "^4.17.15" - prop-types "^15.7.2" - qs "^6.6.0" - react-color "^2.17.0" - react-lifecycles-compat "^3.0.4" - react-select "^3.0.0" + react-select "^3.0.8" -"@storybook/addon-options@^5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-options/-/addon-options-5.2.8.tgz#579c7e1f331303382541fa77c1c26242d7d6b79d" - integrity sha512-w7b6c+K5kv6AnQW1tnGSuNEQ8Ek2kFZ4anTaMYiGpoa1nQJjDrvS6R13GWHgxGACFpOtcBPMxTEX6YKAxiOgaA== +"@storybook/addon-options@^5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-options/-/addon-options-5.3.19.tgz#065e8f6be53073b37ebcaebe602dcc85ee202eaf" + integrity sha512-i5PzPlsv4QWdOvQhYVlyOW7VEW2ovhxg4MWVRjCoVy6vhF42MR+0HRtIOeOENuc3XnpSxsSk0ci/UI2XQjnX3Q== dependencies: - "@storybook/addons" "5.2.8" + "@storybook/addons" "5.3.19" core-js "^3.0.1" util-deprecate "^1.0.2" -"@storybook/addon-storyshots@^5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/addon-storyshots/-/addon-storyshots-5.2.6.tgz#cc94f256cb28e2769a3dd472af420f8e0fcc306f" - integrity sha512-04UX6VXFOrv1o41L8P3mevFYN2H9RU6JCNXfqCJLtD4ZxP5iDoXjF8/0VWLdqCPANe9Ng58r5BnZgNwWPjcGbA== - dependencies: - "@jest/transform" "^24.9.0" - "@storybook/addons" "5.2.6" - core-js "^3.0.1" - glob "^7.1.3" - global "^4.3.2" - jest-specific-snapshot "^2.0.0" - read-pkg-up "^6.0.0" - regenerator-runtime "^0.12.1" - ts-dedent "^1.1.0" - -"@storybook/addon-storyshots@^5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/addon-storyshots/-/addon-storyshots-5.2.8.tgz#1878d0cc7490941cc4006bd3bd96bfd06005e1e3" - integrity sha512-izUQTwzt1I0TdtYn3jv6yFIaW7H48gPW+nehisVXOA+0b0f+IySnC63+q3YcCQcC9cmZ5xxzZNJ1XycrsyVm0A== +"@storybook/addon-storyshots@^5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/addon-storyshots/-/addon-storyshots-5.3.19.tgz#cb07ac3cc20d3a399ed4b6758008e10f910691d0" + integrity sha512-4TBbpAqbc9HLPxaJB2koQija67OBgGRhBZ5l2goczbgIWbbh3BXDrg3SwmKXC0cFnslgbuKU3CMX7infgtkByA== dependencies: "@jest/transform" "^24.9.0" - "@storybook/addons" "5.2.8" + "@storybook/addons" "5.3.19" + "@storybook/client-api" "5.3.19" + "@storybook/core" "5.3.19" + "@types/glob" "^7.1.1" + "@types/jest" "^24.0.16" + "@types/jest-specific-snapshot" "^0.5.3" + babel-plugin-require-context-hook "^1.0.0" core-js "^3.0.1" glob "^7.1.3" global "^4.3.2" jest-specific-snapshot "^2.0.0" - read-pkg-up "^6.0.0" - regenerator-runtime "^0.12.1" + read-pkg-up "^7.0.0" + regenerator-runtime "^0.13.3" ts-dedent "^1.1.0" -"@storybook/addons@5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.2.6.tgz#c1278137acb3502e068b0b0d07a8371c607e9c02" - integrity sha512-5MF64lsAhIEMxTbVpYROz5Wez595iwSw45yXyP8gWt12d+EmFO5tdy7cYJCxcMuVhDfaCI78tFqS9orr1atVyA== - dependencies: - "@storybook/api" "5.2.6" - "@storybook/channels" "5.2.6" - "@storybook/client-logger" "5.2.6" - "@storybook/core-events" "5.2.6" - core-js "^3.0.1" - global "^4.3.2" - util-deprecate "^1.0.2" - -"@storybook/addons@5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.2.8.tgz#f8bf8bd555b7a69fb1e9a52ab8cdb96384d931ff" - integrity sha512-yAo1N5z/45bNIQP8SD+HVTr7X898bYAtz1EZBrQ6zD8bGamzA2Br06rOLL9xXw29eQhsaVnPlqgDwCS1sTC7aQ== +"@storybook/addons@5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.3.19.tgz#3a7010697afd6df9a41b8c8a7351d9a06ff490a4" + integrity sha512-Ky/k22p6i6FVNvs1VhuFyGvYJdcp+FgXqFgnPyY/OXJW/vPDapdElpTpHJZLFI9I2FQBDcygBPU5RXkumQ+KUQ== dependencies: - "@storybook/api" "5.2.8" - "@storybook/channels" "5.2.8" - "@storybook/client-logger" "5.2.8" - "@storybook/core-events" "5.2.8" + "@storybook/api" "5.3.19" + "@storybook/channels" "5.3.19" + "@storybook/client-logger" "5.3.19" + "@storybook/core-events" "5.3.19" core-js "^3.0.1" global "^4.3.2" util-deprecate "^1.0.2" -"@storybook/api@5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.2.6.tgz#43d3c20b90e585e6c94b36e29845d39704ae2135" - integrity sha512-X/di44/SAL68mD6RHTX2qdWwhjRW6BgcfPtu0dMd38ErB3AfsfP4BITXs6kFOeSM8kWiaQoyuw0pOBzA8vlYug== - dependencies: - "@storybook/channels" "5.2.6" - "@storybook/client-logger" "5.2.6" - "@storybook/core-events" "5.2.6" - "@storybook/router" "5.2.6" - "@storybook/theming" "5.2.6" - core-js "^3.0.1" - fast-deep-equal "^2.0.1" - global "^4.3.2" - lodash "^4.17.15" - memoizerific "^1.11.3" - prop-types "^15.6.2" - react "^16.8.3" - semver "^6.0.0" - shallow-equal "^1.1.0" - store2 "^2.7.1" - telejson "^3.0.2" - util-deprecate "^1.0.2" - -"@storybook/api@5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.2.8.tgz#21f03df8041114eb929bd10b570a17f266568b7f" - integrity sha512-rFrPtTFDIPQoicLwq1AVsOvZNTUKnjD1w/NX1kKcyuWLL9BcOkU3YNLBlliGBg2JX/yS+fJKMyKk4NMzNBCZCg== +"@storybook/api@5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.3.19.tgz#77f15e9e2eee59fe1ddeaba1ef39bc34713a6297" + integrity sha512-U/VzDvhNCPmw2igvJYNNM+uwJCL+3teiL6JmuoL4/cmcqhI6IqqG9dZmMP1egoCd19wXEP7rnAfB/VcYVg41dQ== dependencies: - "@storybook/channels" "5.2.8" - "@storybook/client-logger" "5.2.8" - "@storybook/core-events" "5.2.8" - "@storybook/router" "5.2.8" - "@storybook/theming" "5.2.8" + "@reach/router" "^1.2.1" + "@storybook/channels" "5.3.19" + "@storybook/client-logger" "5.3.19" + "@storybook/core-events" "5.3.19" + "@storybook/csf" "0.0.1" + "@storybook/router" "5.3.19" + "@storybook/theming" "5.3.19" + "@types/reach__router" "^1.2.3" core-js "^3.0.1" fast-deep-equal "^2.0.1" global "^4.3.2" @@ -3850,78 +3641,39 @@ semver "^6.0.0" shallow-equal "^1.1.0" store2 "^2.7.1" - telejson "^3.0.2" + telejson "^3.2.0" util-deprecate "^1.0.2" -"@storybook/channel-postmessage@5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.2.6.tgz#60aaef0e80300c9812a571ca3ce0f28e2c404f04" - integrity sha512-y+63wWiEc/Q4s4MZ3KJ//5A8j5VLufxuLvPxwv9FuS4z8lmN0fqeGJn857qIlFGbZhzsQaoRdmfsCQpBBgUneg== - dependencies: - "@storybook/channels" "5.2.6" - "@storybook/client-logger" "5.2.6" - core-js "^3.0.1" - global "^4.3.2" - telejson "^3.0.2" - -"@storybook/channel-postmessage@5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.2.8.tgz#7a84869ce0fc270c3b5dcd7fa4ed798b6055816f" - integrity sha512-RS3iDW1kpfODN+kBq3youn+KtLqHslZ4m7mTlOL80BUHKb4YkrA1lVkzpy1kVMWBU523pyDVQUVXr+M8y3iVug== +"@storybook/channel-postmessage@5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.3.19.tgz#ef9fe974c2a529d89ce342ff7acf5cc22805bae9" + integrity sha512-Iq0f4NPHR0UVVFCWt0cI7Myadk4/SATXYJPT6sv95KhnLjKEeYw571WBlThfp8a9FM80887xG+eIRe93c8dleA== dependencies: - "@storybook/channels" "5.2.8" - "@storybook/client-logger" "5.2.8" + "@storybook/channels" "5.3.19" + "@storybook/client-logger" "5.3.19" core-js "^3.0.1" global "^4.3.2" - telejson "^3.0.2" - -"@storybook/channels@5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.2.6.tgz#e2837508864dc4d5b5e03f078886f0ce113762ea" - integrity sha512-/UsktYsXuvb1efjVPCEivhh5ywRhm7hl73pQnpJLJHRqyLMM2I5nGPFELTTNuU9yWy7sP9QL5gRqBBPe1sqjZQ== - dependencies: - core-js "^3.0.1" + telejson "^3.2.0" -"@storybook/channels@5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.2.8.tgz#79a99ad85dcacb688073c22340c5b7d16b801202" - integrity sha512-mFwQec27QSrqcl+IH0xA+4jfoEqC4m1G99LBHt/aTDjLZXclX1A470WqeZCp7Gx4OALpaPEVTaaaKPbiKz4C6w== +"@storybook/channels@5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.3.19.tgz#65ad7cd19d70aa5eabbb2e5e39ceef5e510bcb7f" + integrity sha512-38seaeyshRGotTEZJppyYMg/Vx2zRKgFv1L6uGqkJT0LYoNSYtJhsiNFCJ2/KUJu2chAJ/j8h80bpVBVLQ/+WA== dependencies: core-js "^3.0.1" -"@storybook/client-api@5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.2.6.tgz#5760cb4302d82ce9210a63f3f55b1e05f04759c1" - integrity sha512-upynf4ER2fkThNnE+mBlfRFFJxTiOh60fho1ODFcBun9BbvRD2wOHLvw7+WigIhb99HM20vk8f2dhv3I5Udzlg== - dependencies: - "@storybook/addons" "5.2.6" - "@storybook/channel-postmessage" "5.2.6" - "@storybook/channels" "5.2.6" - "@storybook/client-logger" "5.2.6" - "@storybook/core-events" "5.2.6" - "@storybook/router" "5.2.6" - common-tags "^1.8.0" - core-js "^3.0.1" - eventemitter3 "^4.0.0" - global "^4.3.2" - is-plain-object "^3.0.0" - lodash "^4.17.15" - memoizerific "^1.11.3" - qs "^6.6.0" - util-deprecate "^1.0.2" - -"@storybook/client-api@5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.2.8.tgz#1de791f7888442287f848e5f544eb883c5edc0da" - integrity sha512-OCKhZ+2sS3ot0ZV48nD79BWVzvvdMjUFYl0073ps5q+1+TLic1AlNmH0Sb5/9NrYXNV86v3VrM2jUbGsKe1qyw== - dependencies: - "@storybook/addons" "5.2.8" - "@storybook/channel-postmessage" "5.2.8" - "@storybook/channels" "5.2.8" - "@storybook/client-logger" "5.2.8" - "@storybook/core-events" "5.2.8" - "@storybook/router" "5.2.8" - common-tags "^1.8.0" +"@storybook/client-api@5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.3.19.tgz#7a5630bb8fffb92742b1773881e9004ee7fdf8e0" + integrity sha512-Dh8ZLrLH91j9Fa28Gmp0KFUvvgK348aNMrDNAUdj4m4witz/BWQ2pxz6qq9/xFVErk/GanVC05kazGElqgYCRQ== + dependencies: + "@storybook/addons" "5.3.19" + "@storybook/channel-postmessage" "5.3.19" + "@storybook/channels" "5.3.19" + "@storybook/client-logger" "5.3.19" + "@storybook/core-events" "5.3.19" + "@storybook/csf" "0.0.1" + "@types/webpack-env" "^1.15.0" core-js "^3.0.1" eventemitter3 "^4.0.0" global "^4.3.2" @@ -3930,435 +3682,231 @@ memoizerific "^1.11.3" qs "^6.6.0" stable "^0.1.8" + ts-dedent "^1.1.0" util-deprecate "^1.0.2" -"@storybook/client-logger@5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.2.6.tgz#cfc4536e9b724b086f7509c2bb34c221016713c9" - integrity sha512-hJvPD267cCwLIRMOISjDH8h9wbwOcXIJip29UlJbU9iMtZtgE+YelmlpmZJvqcDfUiXWWrOh7tP76mj8EAfwIQ== - dependencies: - core-js "^3.0.1" - -"@storybook/client-logger@5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.2.8.tgz#5affe2f9dbbee374721fd2e8729116f5ac39c779" - integrity sha512-+oVSEJdeh7TQ1Bhanb3mCr7fc3Bug3+K79abZ28J45Ub5x4L/ZVClj1xMgUsJs30BZ5FB8vhdgH6TQb0NSxR4A== - dependencies: - core-js "^3.0.1" - -"@storybook/components@5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.2.6.tgz#cddb60227720aea7cae34fe782d0370bcdbd4005" - integrity sha512-C7OS90bZ1ZvxlWUZ3B2MPFFggqAtUo7X8DqqS3IwsuDUiK9dD/KS0MwPgOuFDnOTW1R5XqmQd/ylt53w3s/U5g== +"@storybook/client-logger@5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.3.19.tgz#fbbd186e82102eaca1d6a5cca640271cae862921" + integrity sha512-nHftT9Ow71YgAd2/tsu79kwKk30mPuE0sGRRUHZVyCRciGFQweKNOS/6xi2Aq+WwBNNjPKNlbgxwRt1yKe1Vkg== dependencies: - "@storybook/client-logger" "5.2.6" - "@storybook/theming" "5.2.6" - "@types/react-syntax-highlighter" "10.1.0" - "@types/react-textarea-autosize" "^4.3.3" core-js "^3.0.1" - global "^4.3.2" - markdown-to-jsx "^6.9.1" - memoizerific "^1.11.3" - polished "^3.3.1" - popper.js "^1.14.7" - prop-types "^15.7.2" - react "^16.8.3" - react-dom "^16.8.3" - react-focus-lock "^1.18.3" - react-helmet-async "^1.0.2" - react-popper-tooltip "^2.8.3" - react-syntax-highlighter "^8.0.1" - react-textarea-autosize "^7.1.0" - simplebar-react "^1.0.0-alpha.6" -"@storybook/components@5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.2.8.tgz#f5d4a06ba4ba8c700b2d962deae182105b72fb99" - integrity sha512-h9l/LAMaj+emUCOyY/+ETy/S3P0npwQU280J88uL4O9XJALJ72EKfyttBCvMLvpM50E+fAPeDzuYn0t5qzGGxg== +"@storybook/components@5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.3.19.tgz#aac1f9eea1247cc85bd93b10fca803876fb84a6b" + integrity sha512-3g23/+ktlocaHLJKISu9Neu3XKa6aYP2ctDYkRtGchSB0Q55hQsUVGO+BEVuT7Pk2D59mVCxboBjxcRoPUY4pw== dependencies: - "@storybook/client-logger" "5.2.8" - "@storybook/theming" "5.2.8" - "@types/react-syntax-highlighter" "10.1.0" + "@storybook/client-logger" "5.3.19" + "@storybook/theming" "5.3.19" + "@types/react-syntax-highlighter" "11.0.4" "@types/react-textarea-autosize" "^4.3.3" core-js "^3.0.1" global "^4.3.2" - markdown-to-jsx "^6.9.1" + lodash "^4.17.15" + markdown-to-jsx "^6.11.4" memoizerific "^1.11.3" polished "^3.3.1" popper.js "^1.14.7" prop-types "^15.7.2" react "^16.8.3" react-dom "^16.8.3" - react-focus-lock "^1.18.3" + react-focus-lock "^2.1.0" react-helmet-async "^1.0.2" react-popper-tooltip "^2.8.3" - react-syntax-highlighter "^8.0.1" + react-syntax-highlighter "^11.0.2" react-textarea-autosize "^7.1.0" simplebar-react "^1.0.0-alpha.6" + ts-dedent "^1.1.0" -"@storybook/core-events@5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.2.6.tgz#34c9aae256e7e5f4a565b81f1e77dda8bccc6752" - integrity sha512-W8kLJ7tc0aAxs11CPUxUOCReocKL4MYGyjTg8qwk0USLzPUb/FUQWmhcm2ilFz6Nz8dXLcKrXdRVYTmiMsgAeg== - dependencies: - core-js "^3.0.1" - -"@storybook/core-events@5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.2.8.tgz#93fc458ea0820ff1409d268b0fe51abba200f5a4" - integrity sha512-NkQKC5doO/YL9gsO61bqaxgveKktkiJWZ3XyyhL1ZebgnO9wTlrU+i9b5aX73Myk1oxbicQw9KcwDGYk0qFuNQ== - dependencies: - core-js "^3.0.1" - -"@storybook/core@5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-5.2.6.tgz#60c092607158d7d28db59f7e67da4f7e12703fb2" - integrity sha512-q7Ful7TCm9nmjgLsJFqIwVv395NlaOXgGajyaQCQlCKB2V+jgs7GDmdCNNdWAOue4eAsFU6wQSP9lWtq0yzK4w== +"@storybook/core-events@5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.3.19.tgz#18020cd52e0d8ef0973a8e9622a10d5f99796f79" + integrity sha512-lh78ySqMS7pDdMJAQAe35d1I/I4yPTqp09Cq0YIYOxx9BQZhah4DZTV1QIZt22H5p2lPb5MWLkWSxBaexZnz8A== dependencies: - "@babel/plugin-proposal-class-properties" "^7.3.3" - "@babel/plugin-proposal-object-rest-spread" "^7.3.2" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-transform-react-constant-elements" "^7.2.0" - "@babel/preset-env" "^7.4.5" - "@storybook/addons" "5.2.6" - "@storybook/channel-postmessage" "5.2.6" - "@storybook/client-api" "5.2.6" - "@storybook/client-logger" "5.2.6" - "@storybook/core-events" "5.2.6" - "@storybook/node-logger" "5.2.6" - "@storybook/router" "5.2.6" - "@storybook/theming" "5.2.6" - "@storybook/ui" "5.2.6" - airbnb-js-shims "^1 || ^2" - ansi-to-html "^0.6.11" - autoprefixer "^9.4.9" - babel-plugin-add-react-displayname "^0.0.5" - babel-plugin-emotion "^10.0.14" - babel-plugin-macros "^2.4.5" - babel-preset-minify "^0.5.0 || 0.6.0-alpha.5" - boxen "^3.0.0" - case-sensitive-paths-webpack-plugin "^2.2.0" - chalk "^2.4.2" - cli-table3 "0.5.1" - commander "^2.19.0" - common-tags "^1.8.0" core-js "^3.0.1" - corejs-upgrade-webpack-plugin "^2.2.0" - css-loader "^3.0.0" - detect-port "^1.3.0" - dotenv-webpack "^1.7.0" - ejs "^2.6.1" - express "^4.17.0" - file-loader "^3.0.1" - file-system-cache "^1.0.5" - find-cache-dir "^3.0.0" - fs-extra "^8.0.1" - global "^4.3.2" - html-webpack-plugin "^4.0.0-beta.2" - inquirer "^6.2.0" - interpret "^1.2.0" - ip "^1.1.5" - json5 "^2.1.0" - lazy-universal-dotenv "^3.0.1" - node-fetch "^2.6.0" - open "^6.1.0" - pnp-webpack-plugin "1.4.3" - postcss-flexbugs-fixes "^4.1.0" - postcss-loader "^3.0.0" - pretty-hrtime "^1.0.3" - qs "^6.6.0" - raw-loader "^2.0.0" - react-dev-utils "^9.0.0" - regenerator-runtime "^0.12.1" - resolve "^1.11.0" - resolve-from "^5.0.0" - semver "^6.0.0" - serve-favicon "^2.5.0" - shelljs "^0.8.3" - style-loader "^0.23.1" - terser-webpack-plugin "^1.2.4" - unfetch "^4.1.0" - url-loader "^2.0.1" - util-deprecate "^1.0.2" - webpack "^4.33.0" - webpack-dev-middleware "^3.7.0" - webpack-hot-middleware "^2.25.0" -"@storybook/core@5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-5.2.8.tgz#3f6ddbacc705c1893deb15582c3a0a1ecd882cd1" - integrity sha512-P1Xx4setLBESPgS5KgL7Jskf5Q6fRa3ApwPt+ocjDoSDGCvsV7cUEpAp09U65u+89e5K4nQxvaZouhknFQBc1A== +"@storybook/core@5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/core/-/core-5.3.19.tgz#1e61f35c5148343a0c580f5d5efb77f3b4243a30" + integrity sha512-4EYzglqb1iD6x9gxtAYpRGwGP6qJGiU2UW4GiYrErEmeu6y6tkyaqW5AwGlIo9+6jAfwD0HjaK8afvjKTtmmMQ== dependencies: "@babel/plugin-proposal-class-properties" "^7.7.0" "@babel/plugin-proposal-object-rest-spread" "^7.6.2" "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-transform-react-constant-elements" "^7.6.3" - "@babel/preset-env" "^7.7.1" - "@storybook/addons" "5.2.8" - "@storybook/channel-postmessage" "5.2.8" - "@storybook/client-api" "5.2.8" - "@storybook/client-logger" "5.2.8" - "@storybook/core-events" "5.2.8" - "@storybook/node-logger" "5.2.8" - "@storybook/router" "5.2.8" - "@storybook/theming" "5.2.8" - "@storybook/ui" "5.2.8" - airbnb-js-shims "^1 || ^2" + "@babel/plugin-transform-react-constant-elements" "^7.2.0" + "@babel/preset-env" "^7.4.5" + "@storybook/addons" "5.3.19" + "@storybook/channel-postmessage" "5.3.19" + "@storybook/client-api" "5.3.19" + "@storybook/client-logger" "5.3.19" + "@storybook/core-events" "5.3.19" + "@storybook/csf" "0.0.1" + "@storybook/node-logger" "5.3.19" + "@storybook/router" "5.3.19" + "@storybook/theming" "5.3.19" + "@storybook/ui" "5.3.19" + airbnb-js-shims "^2.2.1" ansi-to-html "^0.6.11" - autoprefixer "^9.4.9" + autoprefixer "^9.7.2" babel-plugin-add-react-displayname "^0.0.5" - babel-plugin-emotion "^10.0.14" - babel-plugin-macros "^2.4.5" + babel-plugin-emotion "^10.0.20" + babel-plugin-macros "^2.7.0" babel-preset-minify "^0.5.0 || 0.6.0-alpha.5" - boxen "^3.0.0" + boxen "^4.1.0" case-sensitive-paths-webpack-plugin "^2.2.0" - chalk "^2.4.2" + chalk "^3.0.0" cli-table3 "0.5.1" - commander "^2.19.0" - common-tags "^1.8.0" + commander "^4.0.1" core-js "^3.0.1" corejs-upgrade-webpack-plugin "^2.2.0" css-loader "^3.0.0" detect-port "^1.3.0" dotenv-webpack "^1.7.0" - ejs "^2.6.1" + ejs "^2.7.4" express "^4.17.0" - file-loader "^3.0.1" + file-loader "^4.2.0" file-system-cache "^1.0.5" find-cache-dir "^3.0.0" + find-up "^4.1.0" fs-extra "^8.0.1" + glob-base "^0.3.0" global "^4.3.2" html-webpack-plugin "^4.0.0-beta.2" - inquirer "^6.2.0" - interpret "^1.2.0" + inquirer "^7.0.0" + interpret "^2.0.0" ip "^1.1.5" - json5 "^2.1.0" + json5 "^2.1.1" lazy-universal-dotenv "^3.0.1" + micromatch "^4.0.2" node-fetch "^2.6.0" - open "^6.1.0" - pnp-webpack-plugin "1.4.3" + open "^7.0.0" + pnp-webpack-plugin "1.5.0" postcss-flexbugs-fixes "^4.1.0" postcss-loader "^3.0.0" pretty-hrtime "^1.0.3" qs "^6.6.0" - raw-loader "^2.0.0" + raw-loader "^3.1.0" react-dev-utils "^9.0.0" - regenerator-runtime "^0.12.1" + regenerator-runtime "^0.13.3" resolve "^1.11.0" resolve-from "^5.0.0" semver "^6.0.0" serve-favicon "^2.5.0" shelljs "^0.8.3" - style-loader "^0.23.1" - terser-webpack-plugin "^1.2.4" + style-loader "^1.0.0" + terser-webpack-plugin "^2.1.2" + ts-dedent "^1.1.0" unfetch "^4.1.0" url-loader "^2.0.1" util-deprecate "^1.0.2" webpack "^4.33.0" webpack-dev-middleware "^3.7.0" webpack-hot-middleware "^2.25.0" + webpack-virtual-modules "^0.2.0" -"@storybook/node-logger@5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.2.6.tgz#e353aff14375bef9e922c217a0afb50f93e2ceb1" - integrity sha512-Z3mn9CUSiG7kR2OBoz4lNeoeBS094h5d9wufZSp5S+M47L6KEXmTgNcuePKj+t8Z8KT/Ph8B63bjChseKp3DNw== +"@storybook/csf@0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.1.tgz#95901507dc02f0bc6f9ac8ee1983e2fc5bb98ce6" + integrity sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw== dependencies: - chalk "^2.4.2" - core-js "^3.0.1" - npmlog "^4.1.2" - pretty-hrtime "^1.0.3" - regenerator-runtime "^0.12.1" + lodash "^4.17.15" -"@storybook/node-logger@5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.2.8.tgz#4a3df21d731014d54b9ca53d5b9a72dd350bb075" - integrity sha512-3TK5mx6VWbfJO+WUrqwPhTbTQ4qESTnwJY/02xPzOhvuC6tIG1QOxzi+Rq6rFlwxTpUuWh6iyDYnGIqFFQywkA== +"@storybook/node-logger@5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/node-logger/-/node-logger-5.3.19.tgz#c414e4d3781aeb06298715220012f552a36dff29" + integrity sha512-hKshig/u5Nj9fWy0OsyU04yqCxr0A9pydOHIassr4fpLAaePIN2YvqCqE2V+TxQHjZUnowSSIhbXrGt0DI5q2A== dependencies: - chalk "^2.4.2" + "@types/npmlog" "^4.1.2" + chalk "^3.0.0" core-js "^3.0.1" npmlog "^4.1.2" pretty-hrtime "^1.0.3" - regenerator-runtime "^0.12.1" - -"@storybook/react@^5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-5.2.6.tgz#e61c0ed184add9e715191649ddb995eead756a90" - integrity sha512-yzhxxuoUx4jwn+PymU5wemzLb9ryXD9Y2Dv5kipCDkUS4cqDJwKcVO8tyhMigFUGTHREmJTmAESCKKPDR45SiQ== - dependencies: - "@babel/plugin-transform-react-constant-elements" "^7.2.0" - "@babel/preset-flow" "^7.0.0" - "@babel/preset-react" "^7.0.0" - "@storybook/addons" "5.2.6" - "@storybook/core" "5.2.6" - "@storybook/node-logger" "5.2.6" - "@svgr/webpack" "^4.0.3" - "@types/webpack-env" "^1.13.7" - babel-plugin-add-react-displayname "^0.0.5" - babel-plugin-named-asset-import "^0.3.1" - babel-plugin-react-docgen "^3.0.0" - babel-preset-react-app "^9.0.0" - common-tags "^1.8.0" - core-js "^3.0.1" - global "^4.3.2" - lodash "^4.17.15" - mini-css-extract-plugin "^0.7.0" - prop-types "^15.7.2" - react-dev-utils "^9.0.0" - regenerator-runtime "^0.12.1" - semver "^6.0.0" - webpack "^4.33.0" + regenerator-runtime "^0.13.3" -"@storybook/react@^5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-5.2.8.tgz#8d44c2d34caa1d7d748ec1fc9cf0fe2a88b001f9" - integrity sha512-T1DoWpSz33vaGx85Dh7q2KYetg7dQyiYhuOnZm2WxZTFZOw1jP62si53JGFp0PKxnT6iOBLHo3v2QkRkjt2mdQ== +"@storybook/react@^5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-5.3.19.tgz#ad7e7a5538399e2794cdb5a1b844a2b77c10bd09" + integrity sha512-OBRUqol3YLQi/qE55x2pWkv4YpaAmmfj6/Km+7agx+og+oNQl0nnlXy7r27X/4j3ERczzURa5pJHtSjwiNaJNw== dependencies: "@babel/plugin-transform-react-constant-elements" "^7.6.3" "@babel/preset-flow" "^7.0.0" - "@babel/preset-react" "^7.7.0" - "@storybook/addons" "5.2.8" - "@storybook/core" "5.2.8" - "@storybook/node-logger" "5.2.8" + "@babel/preset-react" "^7.0.0" + "@storybook/addons" "5.3.19" + "@storybook/core" "5.3.19" + "@storybook/node-logger" "5.3.19" "@svgr/webpack" "^4.0.3" - "@types/webpack-env" "^1.13.7" + "@types/webpack-env" "^1.15.0" babel-plugin-add-react-displayname "^0.0.5" babel-plugin-named-asset-import "^0.3.1" - babel-plugin-react-docgen "^3.0.0" - babel-preset-react-app "^9.0.0" - common-tags "^1.8.0" + babel-plugin-react-docgen "^4.0.0" core-js "^3.0.1" global "^4.3.2" lodash "^4.17.15" mini-css-extract-plugin "^0.7.0" prop-types "^15.7.2" react-dev-utils "^9.0.0" - regenerator-runtime "^0.12.1" + regenerator-runtime "^0.13.3" semver "^6.0.0" + ts-dedent "^1.1.0" webpack "^4.33.0" -"@storybook/router@5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.2.6.tgz#5180d3785501699283c6c3717986c877f84fead5" - integrity sha512-/FZd3fYg5s2QzOqSIP8UMOSnCIFFIlli/jKlOxvm3WpcpxgwQOY4lfHsLO+r9ThCLs2UvVg2R/HqGrOHqDFU7A== - dependencies: - "@reach/router" "^1.2.1" - "@types/reach__router" "^1.2.3" - core-js "^3.0.1" - global "^4.3.2" - lodash "^4.17.15" - memoizerific "^1.11.3" - qs "^6.6.0" - -"@storybook/router@5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.2.8.tgz#d7de2d401701857c033e28560c30e16512f7f72f" - integrity sha512-wnbyKESUMyv9fwo9W+n4Fev/jXylB8whpjtHrOttjguUOYX1zGSHdwNI66voPetbtVLxUeHyJteJwdyRDSirJg== +"@storybook/router@5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.3.19.tgz#0f783b85658f99e4007f74347ad7ef17dbf7fc3a" + integrity sha512-yNClpuP7BXQlBTRf6Ggle3/R349/k6kvI5Aim4jf6X/2cFVg2pzBXDAF41imNm9PcvdxwabQLm6I48p7OvKr/w== dependencies: "@reach/router" "^1.2.1" + "@storybook/csf" "0.0.1" "@types/reach__router" "^1.2.3" core-js "^3.0.1" global "^4.3.2" lodash "^4.17.15" memoizerific "^1.11.3" qs "^6.6.0" + util-deprecate "^1.0.2" -"@storybook/theming@5.2.6", "@storybook/theming@^5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.2.6.tgz#e04170b3e53dcfc791b2381c8a39192ae88cd291" - integrity sha512-Xa9R/H8DDgmvxsCHloJUJ2d9ZQl80AeqHrL+c/AKNpx05s9lV74DcinusCf0kz72YGUO/Xt1bAjuOvLnAaS8Gw== - dependencies: - "@emotion/core" "^10.0.14" - "@emotion/styled" "^10.0.14" - "@storybook/client-logger" "5.2.6" - common-tags "^1.8.0" - core-js "^3.0.1" - deep-object-diff "^1.1.0" - emotion-theming "^10.0.14" - global "^4.3.2" - memoizerific "^1.11.3" - polished "^3.3.1" - prop-types "^15.7.2" - resolve-from "^5.0.0" - -"@storybook/theming@5.2.8", "@storybook/theming@^5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.2.8.tgz#a4c9e0e9a5789c1aa71e4fcb7a8ee86efe3dadcf" - integrity sha512-rGb66GkXb0jNJMH8UQ3Ru4FL+m1x0+UdxM8a8HSE/qb1GMv2qOwjVETfAL6nVL9u6ZmrtbhHoero4f6xDwZdRg== +"@storybook/theming@5.3.19", "@storybook/theming@^5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.3.19.tgz#177d9819bd64f7a1a6ea2f1920ffa5baf9a5f467" + integrity sha512-ecG+Rq3hc1GOzKHamYnD4wZ0PEP9nNg0mXbC3RhbxfHj+pMMCWWmx9B2Uu75SL1PTT8WcfkFO0hU/0IO84Pzlg== dependencies: - "@emotion/core" "^10.0.14" - "@emotion/styled" "^10.0.14" - "@storybook/client-logger" "5.2.8" - common-tags "^1.8.0" + "@emotion/core" "^10.0.20" + "@emotion/styled" "^10.0.17" + "@storybook/client-logger" "5.3.19" core-js "^3.0.1" deep-object-diff "^1.1.0" - emotion-theming "^10.0.14" + emotion-theming "^10.0.19" global "^4.3.2" memoizerific "^1.11.3" polished "^3.3.1" prop-types "^15.7.2" resolve-from "^5.0.0" + ts-dedent "^1.1.0" -"@storybook/ui@5.2.6": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-5.2.6.tgz#33df2f2e03d9cf81dc52928a0dc4db280ee8f56a" - integrity sha512-jT3PtpEsTqnESO0U8BotC+5P971Xqy0s2leSZcgU9PNe4Eb7NaxypSULOulPgPAx1JOmMipUBdK54PP/nyudkA== - dependencies: - "@storybook/addons" "5.2.6" - "@storybook/api" "5.2.6" - "@storybook/channels" "5.2.6" - "@storybook/client-logger" "5.2.6" - "@storybook/components" "5.2.6" - "@storybook/core-events" "5.2.6" - "@storybook/router" "5.2.6" - "@storybook/theming" "5.2.6" - copy-to-clipboard "^3.0.8" - core-js "^3.0.1" - core-js-pure "^3.0.1" - emotion-theming "^10.0.14" - fast-deep-equal "^2.0.1" - fuse.js "^3.4.4" - global "^4.3.2" - lodash "^4.17.15" - markdown-to-jsx "^6.9.3" - memoizerific "^1.11.3" - polished "^3.3.1" - prop-types "^15.7.2" - qs "^6.6.0" - react "^16.8.3" - react-dom "^16.8.3" - react-draggable "^4.0.3" - react-helmet-async "^1.0.2" - react-hotkeys "2.0.0-pre4" - react-sizeme "^2.6.7" - regenerator-runtime "^0.13.2" - resolve-from "^5.0.0" - semver "^6.0.0" - store2 "^2.7.1" - telejson "^3.0.2" - util-deprecate "^1.0.2" - -"@storybook/ui@5.2.8": - version "5.2.8" - resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-5.2.8.tgz#da8afca9eb29a40ef3ddc6a9f6e76d7a3344f2ef" - integrity sha512-7t1ARBfylhEsLmGsZBUCj1Wf1oAgCDDrf7fi+Fhdg5Rr16CMoBbe24Gv/mPYv01/pUDhGodxzltKGX5x0Hto2w== - dependencies: - "@storybook/addons" "5.2.8" - "@storybook/api" "5.2.8" - "@storybook/channels" "5.2.8" - "@storybook/client-logger" "5.2.8" - "@storybook/components" "5.2.8" - "@storybook/core-events" "5.2.8" - "@storybook/router" "5.2.8" - "@storybook/theming" "5.2.8" +"@storybook/ui@5.3.19": + version "5.3.19" + resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-5.3.19.tgz#ac03b67320044a3892ee784111d4436b61874332" + integrity sha512-r0VxdWab49nm5tzwvveVDnsHIZHMR76veYOu/NHKDUZ5hnQl1LMG1YyMCFFa7KiwD/OrZxRWr6/Ma7ep9kR4Gw== + dependencies: + "@emotion/core" "^10.0.20" + "@storybook/addons" "5.3.19" + "@storybook/api" "5.3.19" + "@storybook/channels" "5.3.19" + "@storybook/client-logger" "5.3.19" + "@storybook/components" "5.3.19" + "@storybook/core-events" "5.3.19" + "@storybook/router" "5.3.19" + "@storybook/theming" "5.3.19" copy-to-clipboard "^3.0.8" core-js "^3.0.1" core-js-pure "^3.0.1" - emotion-theming "^10.0.14" + emotion-theming "^10.0.19" fast-deep-equal "^2.0.1" - fuse.js "^3.4.4" + fuse.js "^3.4.6" global "^4.3.2" lodash "^4.17.15" - markdown-to-jsx "^6.9.3" + markdown-to-jsx "^6.11.4" memoizerific "^1.11.3" polished "^3.3.1" prop-types "^15.7.2" @@ -4367,13 +3915,13 @@ react-dom "^16.8.3" react-draggable "^4.0.3" react-helmet-async "^1.0.2" - react-hotkeys "2.0.0-pre4" + react-hotkeys "2.0.0" react-sizeme "^2.6.7" regenerator-runtime "^0.13.2" resolve-from "^5.0.0" semver "^6.0.0" store2 "^2.7.1" - telejson "^3.0.2" + telejson "^3.2.0" util-deprecate "^1.0.2" "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": @@ -5240,6 +4788,13 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/jest-specific-snapshot@^0.5.3": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@types/jest-specific-snapshot/-/jest-specific-snapshot-0.5.4.tgz#997364c39a59ddeff0ee790a19415e79dd061d1e" + integrity sha512-1qISn4fH8wkOOPFEx+uWRRjw6m/pP/It3OHLm8Ee1KQpO7Z9ZGYDtWPU5AgK05UXsNTAgOK+dPQvJKGdy9E/1g== + dependencies: + "@types/jest" "*" + "@types/jest@*", "@types/jest@^25.2.3": version "25.2.3" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.3.tgz#33d27e4c4716caae4eced355097a47ad363fdcaf" @@ -5248,6 +4803,13 @@ jest-diff "^25.2.1" pretty-format "^25.2.1" +"@types/jest@^24.0.16": + version "24.9.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.9.1.tgz#02baf9573c78f1b9974a5f36778b366aa77bd534" + integrity sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q== + dependencies: + jest-diff "^24.3.0" + "@types/joi@*", "@types/joi@^13.4.2": version "13.6.1" resolved "https://registry.yarnpkg.com/@types/joi/-/joi-13.6.1.tgz#325486a397504f8e22c8c551dc8b0e1d41d5d5ae" @@ -5522,6 +5084,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-path/-/normalize-path-3.0.0.tgz#bb5c46cab77b93350b4cf8d7ff1153f47189ae31" integrity sha512-Nd8y/5t/7CRakPYiyPzr/IAfYusy1FkcZYFEAcoMZkwpJv2n4Wm+olW+e7xBdHEXhOnWdG9ddbar0gqZWS4x5Q== +"@types/npmlog@^4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@types/npmlog/-/npmlog-4.1.2.tgz#d070fe6a6b78755d1092a3dc492d34c3d8f871c4" + integrity sha512-4QQmOF5KlwfxJ5IGXFIudkeLCdMABz03RcUXu+LCb24zmln8QW6aDjuGl4d4XPVLf2j+FnjelHTP7dvceAFbhA== + "@types/numeral@^0.0.25": version "0.0.25" resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-0.0.25.tgz#b6f55062827a4787fe4ab151cf3412a468e65271" @@ -5555,6 +5122,11 @@ dependencies: "@types/node" "*" +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/parse-link-header@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/parse-link-header/-/parse-link-header-1.0.0.tgz#69f059e40a0fa93dc2e095d4142395ae6adc5d7a" @@ -5735,10 +5307,10 @@ dependencies: "@types/react" "*" -"@types/react-syntax-highlighter@10.1.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-10.1.0.tgz#9c534e29bbe05dba9beae1234f3ae944836685d4" - integrity sha512-dF49hC4FZp1dIKyzacOrHvqMUe8U2IXyQCQXOcT1e6n64gLBp+xM6qGtPsThIT9XjiIHSg2W5Jc2V5IqekBfnA== +"@types/react-syntax-highlighter@11.0.4": + version "11.0.4" + resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.4.tgz#d86d17697db62f98046874f62fdb3e53a0bbc4cd" + integrity sha512-9GfTo3a0PHwQeTVoqs0g5bS28KkSY48pp5659wA+Dp4MqceDEa8EHBqrllJvvtyusszyJhViUEap0FDvlk/9Zg== dependencies: "@types/react" "*" @@ -6134,10 +5706,10 @@ "@types/node" "*" chokidar "^2.1.2" -"@types/webpack-env@^1.13.7": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.14.1.tgz#0d8a53f308f017c53a5ddc3d07f4d6fa76b790d7" - integrity sha512-0Ki9jAAhKDSuLDXOIMADg54Hu60SuBTEsWaJGGy5cV+SSUQ63J2a+RrYYGrErzz39fXzTibhKrAQJAb8M7PNcA== +"@types/webpack-env@^1.15.0": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.2.tgz#927997342bb9f4a5185a86e6579a0a18afc33b0a" + integrity sha512-67ZgZpAlhIICIdfQrB5fnDvaKFcDxpKibxznfYRVAT4mQE41Dido/3Ty+E3xGBmTogc5+0Qb8tWhna+5B8z1iQ== "@types/webpack-sources@*": version "0.1.5" @@ -6733,23 +6305,25 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -"airbnb-js-shims@^1 || ^2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-2.1.1.tgz#a509611480db7e6d9db62fe2acfaeb473b6842ac" - integrity sha512-h8UtyB/TCdOwWoEPQJGHgsWwSnTqPrRZbhyZYjAwY9/AbjdjfkKy9L/T3fIFS6MKX8YrpWFRm6xqFSgU+2DRGw== +airbnb-js-shims@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-2.2.1.tgz#db481102d682b98ed1daa4c5baa697a05ce5c040" + integrity sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ== dependencies: array-includes "^3.0.3" array.prototype.flat "^1.2.1" array.prototype.flatmap "^1.2.1" - es5-shim "^4.5.10" - es6-shim "^0.35.3" + es5-shim "^4.5.13" + es6-shim "^0.35.5" function.prototype.name "^1.1.0" - object.entries "^1.0.4" - object.fromentries "^1.0.0" + globalthis "^1.0.0" + object.entries "^1.1.0" + object.fromentries "^2.0.0 || ^1.0.0" object.getownpropertydescriptors "^2.0.3" - object.values "^1.0.4" + object.values "^1.1.0" + promise.allsettled "^1.0.0" promise.prototype.finally "^3.1.0" - string.prototype.matchall "^3.0.0" + string.prototype.matchall "^4.0.0 || ^3.0.1" string.prototype.padend "^3.0.0" string.prototype.padstart "^3.0.0" symbol.prototype.description "^1.0.0" @@ -7619,6 +7193,16 @@ array.prototype.flatmap@^1.2.3: es-abstract "^1.17.0-next.1" function-bind "^1.1.1" +array.prototype.map@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.2.tgz#9a4159f416458a23e9483078de1106b2ef68f8ec" + integrity sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.4" + arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -7701,16 +7285,16 @@ ast-types@0.11.3: resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.3.tgz#c20757fe72ee71278ea0ff3d87e5c2ca30d9edf8" integrity sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA== -ast-types@0.12.4: - version "0.12.4" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.12.4.tgz#71ce6383800f24efc9a1a3308f3a6e420a0974d1" - integrity sha512-ky/YVYCbtVAS8TdMIaTiPFHwEpRB5z1hctepJplTr3UW5q8TDrpIMCILyk8pmLxGtn2KCtC/lSn7zOsaI7nzDw== - ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= +ast-types@^0.13.2: + version "0.13.3" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7" + integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA== + ast-types@^0.7.0: version "0.7.8" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.7.8.tgz#902d2e0d60d071bdcd46dc115e1809ed11c138a9" @@ -7849,7 +7433,20 @@ autobind-decorator@^1.3.4: resolved "https://registry.yarnpkg.com/autobind-decorator/-/autobind-decorator-1.4.3.tgz#4c96ffa77b10622ede24f110f5dbbf56691417d1" integrity sha1-TJb/p3sQYi7eJPEQ9du/VmkUF9E= -autoprefixer@^9.4.9, autoprefixer@^9.7.4: +autoprefixer@^9.7.2: + version "9.8.5" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.5.tgz#2c225de229ddafe1d1424c02791d0c3e10ccccaa" + integrity sha512-C2p5KkumJlsTHoNv9w31NrBRgXhf6eCMteJuHZi2xhkgC+5Vm40MEtCKPhc0qdgAOhox0YPy1SQHTAky05UoKg== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001097" + colorette "^1.2.0" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +autoprefixer@^9.7.4: version "9.7.4" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== @@ -8044,7 +7641,7 @@ babel-plugin-add-react-displayname@^0.0.5: resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" integrity sha1-M51M3be2X9YtHfnbn+BN4TQSK9U= -babel-plugin-dynamic-import-node@2.3.0, babel-plugin-dynamic-import-node@^2.3.0: +babel-plugin-dynamic-import-node@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== @@ -8058,15 +7655,15 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-emotion@^10.0.14: - version "10.0.16" - resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.16.tgz#cb306798058b102a634ca80e69b012caa345bb09" - integrity sha512-a01Xrourr/VRpw4KicX9drDwfVGHmw8HmlQk++N4fv0j73EfHKWC1Ah4Vu8s1cTGVvTiwum+UhVpJenV8j03FQ== +babel-plugin-emotion@^10.0.20, babel-plugin-emotion@^10.0.27: + version "10.0.33" + resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz#ce1155dcd1783bbb9286051efee53f4e2be63e03" + integrity sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ== dependencies: "@babel/helper-module-imports" "^7.0.0" - "@emotion/hash" "0.7.2" - "@emotion/memoize" "0.7.2" - "@emotion/serialize" "^0.11.9" + "@emotion/hash" "0.8.0" + "@emotion/memoize" "0.7.4" + "@emotion/serialize" "^0.11.16" babel-plugin-macros "^2.0.0" babel-plugin-syntax-jsx "^6.18.0" convert-source-map "^1.5.0" @@ -8074,7 +7671,7 @@ babel-plugin-emotion@^10.0.14: find-root "^1.1.0" source-map "^0.5.7" -babel-plugin-emotion@^10.0.22, babel-plugin-emotion@^10.0.23: +babel-plugin-emotion@^10.0.22: version "10.0.23" resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.23.tgz#040d40bf61dcab6d31dd6043d10e180240b8515b" integrity sha512-1JiCyXU0t5S2xCbItejCduLGGcKmF3POT0Ujbexog2MI4IlRcIn/kWjkYwCUZlxpON0O5FC635yPl/3slr7cKQ== @@ -8125,18 +7722,9 @@ babel-plugin-jest-hoist@^25.5.0: dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-macros@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181" - integrity sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ== - dependencies: - "@babel/runtime" "^7.4.2" - cosmiconfig "^5.2.0" - resolve "^1.10.0" + "@types/babel__traverse" "^7.0.6" -babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.4.5: +babel-plugin-macros@^2.0.0: version "2.5.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.5.0.tgz#01f4d3b50ed567a67b80a30b9da066e94f4097b6" integrity sha512-BWw0lD0kVZAXRD3Od1kMrdmfudqzDzYv2qrN3l2ISR1HVp1EgLKfbOrYV9xmY5k3qx3RIu5uPAUZZZHpo0o5Iw== @@ -8144,6 +7732,15 @@ babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.4.5: cosmiconfig "^5.0.5" resolve "^1.8.1" +babel-plugin-macros@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" + integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== + dependencies: + "@babel/runtime" "^7.7.2" + cosmiconfig "^6.0.0" + resolve "^1.12.0" + babel-plugin-minify-builtins@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz#31eb82ed1a0d0efdc31312f93b6e4741ce82c36b" @@ -8223,16 +7820,16 @@ babel-plugin-named-asset-import@^0.3.1: resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.3.tgz#9ba2f3ac4dc78b042651654f07e847adfe50667c" integrity sha512-1XDRysF4894BUdMChT+2HHbtJYiO7zx5Be7U6bT8dISy7OdyETMGIAQBMPQCsY1YRf0xcubwnKKaDr5bk15JTA== -babel-plugin-react-docgen@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-3.1.0.tgz#14b02b363a38cc9e08c871df16960d27ef92030f" - integrity sha512-W6xqZnZIWjZuE9IjP7XolxxgFGB5Y9GZk4cLPSWKa10MrT86q7bX4ke9jbrNhFVIRhbmzL8wE1Sn++mIWoJLbw== +babel-plugin-react-docgen@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.1.0.tgz#1dfa447dac9ca32d625a123df5733a9e47287c26" + integrity sha512-vzpnBlfGv8XOhJM2zbPyyqw2OLEbelgZZsaaRRTpVwNKuYuc+pUg4+dy7i9gCRms0uOQn4osX571HRcCJMJCmA== dependencies: - lodash "^4.17.11" - react-docgen "^4.1.0" + lodash "^4.17.15" + react-docgen "^5.0.0" recast "^0.14.7" -"babel-plugin-require-context-hook@npm:babel-plugin-require-context-hook-babel7@1.0.0": +babel-plugin-require-context-hook@^1.0.0, "babel-plugin-require-context-hook@npm:babel-plugin-require-context-hook-babel7@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-require-context-hook-babel7/-/babel-plugin-require-context-hook-babel7-1.0.0.tgz#1273d4cee7e343d0860966653759a45d727e815d" integrity sha512-kez0BAN/cQoyO1Yu1nre1bQSYZEF93Fg7VQiBHFfMWuaZTy7vJSTT4FY68FwHTYG53Nyt0A7vpSObSVxwweQeQ== @@ -8295,11 +7892,6 @@ babel-plugin-transform-property-literals@^6.9.4: dependencies: esutils "^2.0.2" -babel-plugin-transform-react-remove-prop-types@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" - integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== - babel-plugin-transform-regexp-constructors@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz#58b7775b63afcf33328fae9a5f88fbd4fb0b4965" @@ -8394,28 +7986,6 @@ babel-preset-jest@^25.5.0: babel-plugin-transform-undefined-to-void "^6.9.4" lodash.isplainobject "^4.0.6" -babel-preset-react-app@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-9.0.1.tgz#16a2cf84363045b530b6a03460527a5c6eac42ba" - integrity sha512-v7MeY+QxdBhM9oU5uOQCIHLsErYkEbbjctXsb10II+KAnttbe0rvprvP785dRxfa9dI4ZbsGXsRU07Qdi5BtOw== - dependencies: - "@babel/core" "7.5.5" - "@babel/plugin-proposal-class-properties" "7.5.5" - "@babel/plugin-proposal-decorators" "7.4.4" - "@babel/plugin-proposal-object-rest-spread" "7.5.5" - "@babel/plugin-syntax-dynamic-import" "7.2.0" - "@babel/plugin-transform-destructuring" "7.5.0" - "@babel/plugin-transform-flow-strip-types" "7.4.4" - "@babel/plugin-transform-react-display-name" "7.2.0" - "@babel/plugin-transform-runtime" "7.5.5" - "@babel/preset-env" "7.5.5" - "@babel/preset-react" "7.0.0" - "@babel/preset-typescript" "7.3.3" - "@babel/runtime" "7.5.5" - babel-plugin-dynamic-import-node "2.3.0" - babel-plugin-macros "2.6.1" - babel-plugin-transform-react-remove-prop-types "0.4.24" - babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -8424,11 +7994,6 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-standalone@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-standalone/-/babel-standalone-6.26.0.tgz#15fb3d35f2c456695815ebf1ed96fe7f015b6886" - integrity sha1-Ffs9NfLEVmlYFevx7Zb+fwFbaIY= - babel-template@^6.16.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" @@ -8840,21 +8405,7 @@ boxen@^1.2.1, boxen@^1.2.2: term-size "^1.2.0" widest-line "^2.0.0" -boxen@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-3.2.0.tgz#fbdff0de93636ab4450886b6ff45b92d098f45eb" - integrity sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A== - dependencies: - ansi-align "^3.0.0" - camelcase "^5.3.1" - chalk "^2.4.2" - cli-boxes "^2.2.0" - string-width "^3.0.0" - term-size "^1.2.0" - type-fest "^0.3.0" - widest-line "^2.0.0" - -boxen@^4.2.0: +boxen@^4.1.0, boxen@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== @@ -9058,7 +8609,7 @@ browserslist@^4.12.0: node-releases "^1.1.53" pkg-up "^2.0.0" -browserslist@^4.6.0, browserslist@^4.6.6, browserslist@^4.8.3: +browserslist@^4.6.6, browserslist@^4.8.3: version "4.8.5" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.5.tgz#691af4e327ac877b25e7a3f7ee869c4ef36cdea3" integrity sha512-4LMHuicxkabIB+n9874jZX/az1IaZ5a+EUuvD7KFOu9x/Bd5YHyO0DIz2ls/Kl8g0ItS4X/ilEgf4T1Br0lgSg== @@ -9508,6 +9059,11 @@ caniuse-lite@^1.0.30000984, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.300010 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001094.tgz#0b11d02e1cdc201348dbd8e3e57bd9b6ce82b175" integrity sha512-ufHZNtMaDEuRBpTbqD93tIQnngmJ+oBknjvr0IbFympSdtFpAUFmNv4mVKbb53qltxFx0nK3iy32S9AqkLzUNA== +caniuse-lite@^1.0.30001097: + version "1.0.30001107" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001107.tgz#809360df7a5b3458f627aa46b0f6ed6d5239da9a" + integrity sha512-86rCH+G8onCmdN4VZzJet5uPELII59cUzDphko3thQFgAQG1RNa+sVLDoALIhRYmflo5iSIzWY3vu1XTWtNMQQ== + canvas@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.6.1.tgz#0d087dd4d60f5a5a9efa202757270abea8bef89e" @@ -10388,6 +9944,11 @@ color@3.0.x: color-convert "^1.9.1" color-string "^1.5.2" +colorette@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + colornames@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96" @@ -10504,7 +10065,7 @@ commander@~2.8.1: dependencies: graceful-readlink ">= 1.0.0" -common-tags@1.8.0, common-tags@^1.8.0: +common-tags@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== @@ -10898,15 +10459,6 @@ copy-webpack-plugin@^6.0.2: serialize-javascript "^3.1.0" webpack-sources "^1.4.3" -core-js-compat@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.3.tgz#0cc3ba4c7f62928c2837e1cffbe8dc78b4f1ae14" - integrity sha512-EP018pVhgwsKHz3YoN1hTq49aRe+h017Kjz0NQz3nXV0cCRMvH3fLQl+vEPGr4r4J5sk4sU3tUC7U1aqTCeJeA== - dependencies: - browserslist "^4.6.0" - core-js-pure "3.1.3" - semver "^6.1.0" - core-js-compat@^3.6.2: version "3.6.4" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" @@ -10915,11 +10467,6 @@ core-js-compat@^3.6.2: browserslist "^4.8.3" semver "7.0.0" -core-js-pure@3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.3.tgz#4c90752d5b9471f641514f3728f51c1e0783d0b5" - integrity sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA== - core-js-pure@^3.0.1: version "3.2.1" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.2.1.tgz#879a23699cff46175bfd2d09158b5c50645a3c45" @@ -10991,6 +10538,17 @@ cosmiconfig@^5.2.0, cosmiconfig@^5.2.1: js-yaml "^3.13.1" parse-json "^4.0.0" +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + cp-file@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-7.0.0.tgz#b9454cfd07fe3b974ab9ea0e5f29655791a9b8cd" @@ -11084,14 +10642,6 @@ create-react-class@^15.5.2: loose-envify "^1.3.1" object-assign "^4.1.1" -create-react-context@<=0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.2.tgz#9836542f9aaa22868cd7d4a6f82667df38019dca" - integrity sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A== - dependencies: - fbjs "^0.8.0" - gud "^1.0.0" - create-react-context@^0.1.5: version "0.1.6" resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.1.6.tgz#0f425931d907741127acc6e31acb4f9015dd9fdc" @@ -12509,13 +12059,6 @@ dom-converter@~0.2: resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6" integrity sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg== -dom-helpers@^3.3.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" - integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== - dependencies: - "@babel/runtime" "^7.1.2" - dom-helpers@^5.0.0: version "5.1.3" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.3.tgz#7233248eb3a2d1f74aafca31e52c5299cc8ce821" @@ -12524,6 +12067,14 @@ dom-helpers@^5.0.0: "@babel/runtime" "^7.6.3" csstype "^2.6.7" +dom-helpers@^5.0.1: + version "5.1.4" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b" + integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^2.6.7" + dom-serializer@0, dom-serializer@~0.1.0, dom-serializer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" @@ -12804,10 +12355,10 @@ ejs@^2.2.4, ejs@^2.3.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" integrity sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo= -ejs@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" - integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== +ejs@^2.7.4: + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== ejs@^3.0.1: version "3.0.2" @@ -12955,13 +12506,13 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -emotion-theming@^10.0.14: - version "10.0.19" - resolved "https://registry.yarnpkg.com/emotion-theming/-/emotion-theming-10.0.19.tgz#66d13db74fccaefad71ba57c915b306cf2250295" - integrity sha512-dQRBPLAAQ6eA8JKhkLCIWC8fdjPbiNC1zNTdFF292h9amhZXofcNGUP7axHoHX4XesqQESYwZrXp53OPInMrKw== +emotion-theming@^10.0.19: + version "10.0.27" + resolved "https://registry.yarnpkg.com/emotion-theming/-/emotion-theming-10.0.27.tgz#1887baaec15199862c89b1b984b79806f2b9ab10" + integrity sha512-MlF1yu/gYh8u+sLUqA0YuA9JX0P4Hb69WlKc/9OLo+WCXuX6sy/KoIa+qJimgmr2dWqnypYKYPX37esjDBbhdw== dependencies: "@babel/runtime" "^7.5.5" - "@emotion/weak-memoize" "0.2.4" + "@emotion/weak-memoize" "0.2.5" hoist-non-react-statics "^3.3.0" enabled@1.0.x: @@ -13171,7 +12722,7 @@ error@^7.0.0, error@^7.0.2: string-template "~0.2.1" xtend "~4.0.0" -es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.13.0, es-abstract@^1.14.2, es-abstract@^1.4.3, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.7.0, es-abstract@^1.9.0: +es-abstract@^1.10.0, es-abstract@^1.13.0, es-abstract@^1.4.3, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.7.0, es-abstract@^1.9.0: version "1.17.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== @@ -13222,7 +12773,12 @@ es-abstract@^1.17.0-next.1: string.prototype.trimleft "^2.1.1" string.prototype.trimright "^2.1.1" -es-get-iterator@^1.1.0: +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-get-iterator@^1.0.2, es-get-iterator@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== @@ -13261,10 +12817,10 @@ es5-ext@^0.10.45, es5-ext@~0.10.2, es5-ext@~0.10.46: es6-symbol "~3.1.1" next-tick "1" -es5-shim@^4.5.10: - version "4.5.12" - resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.12.tgz#508c13dda1c87dd3df1b50e69e7b96b82149b649" - integrity sha512-MjoCAHE6P2Dirme70Cxd9i2Ng8rhXiaVSsxDWdSwimfLERJL/ypR2ed2rTYkeeYrMk8gq281dzKLiGcdrmc8qg== +es5-shim@^4.5.13: + version "4.5.14" + resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.14.tgz#90009e1019d0ea327447cb523deaff8fe45697ef" + integrity sha512-7SwlpL+2JpymWTt8sNLuC2zdhhc+wrfe5cMPI2j0o6WsPdfAiPwmFy2f0AocPB4RQVBOZ9kNTgi5YF7TdhkvEg== es6-error@^4.0.1: version "4.1.1" @@ -13325,10 +12881,10 @@ es6-set@^0.1.5, es6-set@~0.1.5: es6-symbol "3.1.1" event-emitter "~0.3.5" -es6-shim@^0.35.3: - version "0.35.4" - resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.4.tgz#8d5a4109756383d3f0323421089c423acf8378f1" - integrity sha512-oJidbXjN/VWXZJs41E9JEqWzcFbjt43JupimIoVX82Thzt5qy1CiYezdhRmWkj3KOuwJ106IG/ZZrcFC6fgIUQ== +es6-shim@^0.35.5: + version "0.35.5" + resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.5.tgz#46f59dc0a84a1c5029e8ff1166ca0a902077a9ab" + integrity sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg== es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: version "3.1.1" @@ -14389,6 +13945,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.0" +fault@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" + integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== + dependencies: + format "^0.2.0" + faye-websocket@^0.10.0, faye-websocket@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -14526,14 +14089,6 @@ file-loader@4.2.0, file-loader@^4.2.0: loader-utils "^1.2.3" schema-utils "^2.0.0" -file-loader@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" - integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw== - dependencies: - loader-utils "^1.0.2" - schema-utils "^1.0.0" - file-saver@^1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-1.3.8.tgz#e68a30c7cb044e2fb362b428469feb291c2e09d8" @@ -14867,10 +14422,10 @@ focus-lock@^0.5.2: resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.5.4.tgz#537644d61b9e90fd97075aa680b8add1de24e819" integrity sha512-A9ngdb0NyI6UygBQ0eD+p8SpLWTkdEDn67I3EGUUcDUfxH694mLA/xBWwhWhoj/2YLtsv2EoQdAx9UOKs8d/ZQ== -focus-lock@^0.6.3: - version "0.6.5" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.6.5.tgz#f6eb37832a9b1b205406175f5277396a28c0fce1" - integrity sha512-i/mVBOoa9o+tl+u9owOJUF8k8L85odZNIsctB+JAK2HFT8jckiBwmk+3uydlm6FN8czgnkIwQtBv6yyAbrzXjw== +focus-lock@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.7.0.tgz#b2bfb0ca7beacc8710a1ff74275fe0dc60a1d88a" + integrity sha512-LI7v2mH02R55SekHYdv9pRHR9RajVNyIJ2N5IEkWbg7FT5ZmJ9Hw4mWxHeEUcd+dJo0QmzztHvDvWcc7prVFsw== focus-trap-react@^3.0.4, focus-trap-react@^3.1.1: version "3.1.2" @@ -15036,6 +14591,11 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= + formidable@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.1.1.tgz#96b8886f7c3c3508b932d6bd70c4d3a88f35f1a9" @@ -15265,10 +14825,10 @@ functions-have-names@^1.2.0: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.0.tgz#83da7583e4ea0c9ac5ff530f73394b033e0bf77d" integrity sha512-zKXyzksTeaCSw5wIX79iCA40YAa6CJMJgNg9wdkU/ERBrIdPSimPICYiLp65lRbSBqtiHql/HZfS2DyI/AH6tQ== -fuse.js@^3.4.4: - version "3.4.5" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.4.5.tgz#8954fb43f9729bd5dbcb8c08f251db552595a7a6" - integrity sha512-s9PGTaQIkT69HaeoTVjwGsLfb8V8ScJLx5XGFcKHg0MqLUH/UZ4EKOtqtXX9k7AFqCGxD1aJmYb8Q5VYDibVRQ== +fuse.js@^3.4.6: + version "3.6.1" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.6.1.tgz#7de85fdd6e1b3377c23ce010892656385fd9b10c" + integrity sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw== gauge@~1.2.5: version "1.2.7" @@ -15560,6 +15120,21 @@ glob-all@^3.1.0, glob-all@^3.2.1: glob "^7.1.2" yargs "^15.3.1" +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -15781,6 +15356,13 @@ globals@^9.18.0, globals@^9.2.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globalthis@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9" + integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw== + dependencies: + define-properties "^1.1.3" + globby@8.0.2, globby@^8.0.1: version "8.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" @@ -16844,7 +16426,7 @@ hawk@~6.0.2: hoek "4.x.x" sntp "2.x.x" -he@1.2.0, he@1.2.x, he@^1.1.1, he@^1.2.0: +he@1.2.0, he@1.2.x, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -16881,6 +16463,11 @@ highlight.js@^9.12.0, highlight.js@~9.12.0: resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" integrity sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4= +highlight.js@~9.13.0: + version "9.13.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e" + integrity sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A== + history-extra@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/history-extra/-/history-extra-5.0.1.tgz#95a2e59dda526c4241d0ae1b124a77a5e4675ce8" @@ -17419,11 +17006,6 @@ immer@^1.5.0: resolved "https://registry.yarnpkg.com/immer/-/immer-1.12.1.tgz#40c6e5b292c00560836c2993bda3a24379d466f5" integrity sha512-3fmKM6ovaqDt0CdC9daXpNi5x/YCYS3i4cwLdTVkhJdk5jrDXoPs7lCm3IqM3yhfSnz4tjjxbRG2CziQ7m8ztg== -immutable@^4.0.0-rc.9: - version "4.0.0-rc.12" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217" - integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A== - import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -17447,6 +17029,14 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-from@2.1.0, import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" @@ -17728,25 +17318,6 @@ inquirer@^6.0.0: strip-ansi "^4.0.0" through "^2.3.6" -inquirer@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" - integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.0" - figures "^2.0.0" - lodash "^4.17.10" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.1.0" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - inquirer@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" @@ -17822,11 +17393,16 @@ internal-slot@^1.0.2: has "^1.0.3" side-channel "^1.0.2" -interpret@1.2.0, interpret@^1.0.0, interpret@^1.1.0, interpret@^1.2.0: +interpret@1.2.0, interpret@^1.0.0, interpret@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== +interpret@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + intl-format-cache@^2.0.5, intl-format-cache@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-2.1.0.tgz#04a369fecbfad6da6005bae1f14333332dcf9316" @@ -18116,6 +17692,11 @@ is-docker@^1.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-1.1.0.tgz#f04374d4eee5310e9a8e113bf1495411e46176a1" integrity sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE= +is-docker@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" + integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ== + is-dom@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.0.9.tgz#483832d52972073de12b9fe3f60320870da8370d" @@ -18559,6 +18140,13 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" +is-symbol@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + is-typed-array@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.3.tgz#a4ff5a5e672e1a55f99c7f54e59597af5c1df04d" @@ -18868,6 +18456,19 @@ iterall@^1.2.2: resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== +iterate-iterator@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6" + integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw== + +iterate-value@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" + integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== + dependencies: + es-get-iterator "^1.0.2" + iterate-iterator "^1.0.1" + jest-canvas-mock@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/jest-canvas-mock/-/jest-canvas-mock-2.2.0.tgz#45fbc58589c6ce9df50dc90bd8adce747cbdada7" @@ -18953,7 +18554,7 @@ jest-config@^25.5.4: pretty-format "^25.5.0" realpath-native "^2.0.0" -jest-diff@^24.9.0: +jest-diff@^24.3.0, jest-diff@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== @@ -19472,11 +19073,6 @@ js-cookie@^2.2.1: resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== -js-levenshtein@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.3.tgz#3ef627df48ec8cf24bacf05c0f184ff30ef413c5" - integrity sha512-/812MXr9RBtMObviZ8gQBhHO8MOrGj8HlEE+4ccMTElNA/6I3u39u+bhny55Lk921yn44nSZFy9naNLElL5wgQ== - js-levenshtein@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" @@ -19646,7 +19242,7 @@ json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: dependencies: jsonify "~0.0.0" -json-stringify-pretty-compact@1.2.0, json-stringify-pretty-compact@^1.0.1: +json-stringify-pretty-compact@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-1.2.0.tgz#0bc316b5e6831c07041fc35612487fb4e9ab98b8" integrity sha512-/11Pj1OyX814QMKO7K8l85SHPTr/KsFxHp8GE2zVa0BtJgGimDjXHfM3FhC7keQdWDea7+nXf+f1de7ATZcZkQ== @@ -19688,12 +19284,12 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== +json5@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== dependencies: - minimist "^1.2.0" + minimist "^1.2.5" json5@^2.1.2: version "2.1.2" @@ -19840,15 +19436,6 @@ jsx-ast-utils@^2.4.1: array-includes "^3.1.1" object.assign "^4.1.0" -jsx-to-string@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsx-to-string/-/jsx-to-string-1.4.0.tgz#66dc34d773dab9f40fe993cff9940e5da655b705" - integrity sha1-Ztw013PaufQP6ZPP+ZQOXaZVtwU= - dependencies: - immutable "^4.0.0-rc.9" - json-stringify-pretty-compact "^1.0.1" - react "^0.14.0" - jszip@^3.2.2: version "3.3.0" resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.3.0.tgz#29d72c21a54990fa885b11fc843db320640d5271" @@ -20760,7 +20347,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.11, lodash@>4.17.4, lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.5: +lodash@4.17.11, lodash@4.17.19, lodash@>4.17.4, lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.5: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== @@ -20770,11 +20357,6 @@ lodash@4.17.15: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@4.17.19, lodash@^4.17.16: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== - lodash@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" @@ -20944,6 +20526,14 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lowlight@~1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.11.0.tgz#1304d83005126d4e8b1dc0f07981e9b689ec2efc" + integrity sha512-xrGGN6XLL7MbTMdPD6NfWPwY43SNkjf/d0mecSx/CW36fUZTjRHEq0/Cdug3TWKtRXLWi7iMl1eP0olYxj/a4A== + dependencies: + fault "^1.0.2" + highlight.js "~9.13.0" + lowlight@~1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.9.1.tgz#ed7c3dffc36f8c1f263735c0fe0c907847c11250" @@ -21172,27 +20762,27 @@ markdown-it@^10.0.0: mdurl "^1.0.1" uc.micro "^1.0.5" -markdown-to-jsx@^6.9.1, markdown-to-jsx@^6.9.3: - version "6.11.0" - resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.11.0.tgz#a2e3f2bc781c3402d8bb0f8e0a12a186474623b0" - integrity sha512-RH7LCJQ4RFmPqVeZEesKaO1biRzB/k4utoofmTCp3Eiw6D7qfvK8fzZq/2bjEJAtVkfPrM5SMt5APGf2rnaKMg== +markdown-to-jsx@^6.11.4: + version "6.11.4" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.11.4.tgz#b4528b1ab668aef7fe61c1535c27e837819392c5" + integrity sha512-3lRCD5Sh+tfA52iGgfs/XZiw33f7fFX9Bn55aNnVNUd2GzLDkOWyKYYD8Yju2B1Vn+feiEdgJs8T6Tg0xNokPw== dependencies: prop-types "^15.6.2" unquote "^1.1.0" -marked@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.3.tgz#79babad78af638ba4d522a9e715cdfdd2429e946" - integrity sha512-Fqa7eq+UaxfMriqzYLayfqAE40WN03jf+zHjT18/uXNuzjq3TY0XTbrAoPeqSJrAmPz11VuUA+kBPYOhHt9oOQ== +marked@^0.3.12: + version "0.3.19" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" + integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg== -marksy@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/marksy/-/marksy-7.0.1.tgz#fb26f780ce56bf5ca48fc137efdef1f97dd4c7ef" - integrity sha512-tB4cQxIY7f8PWTcIouJO/V60rl9JVVOmCDjmukYVO7mdpGM1JWl4qIP98iDYItexSXZ0DkEqk6yXFxgdmZRMxA== +marksy@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/marksy/-/marksy-8.0.0.tgz#b595f121fd47058df9dda1448f6ee156ab48810a" + integrity sha512-mmHcKZojCQAGuKTuu3153viXdCuxUmsSxomFaSOBTkOlfWFOZBmDhmJkOp0CsPMNRQ7m6oN2wflvAHLpBNZVPw== dependencies: - babel-standalone "^6.26.0" - he "^1.1.1" - marked "^0.6.2" + "@babel/standalone" "^7.4.5" + he "^1.2.0" + marked "^0.3.12" matchdep@^2.0.0: version "2.0.0" @@ -23006,17 +22596,7 @@ object.entries@^1.1.2: es-abstract "^1.17.5" has "^1.0.3" -object.fromentries@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-1.0.0.tgz#e90ec27445ec6e37f48be9af9077d9aa8bef0d40" - integrity sha512-F7XUm84lg0uNXNzrRAC5q8KJe0yYaxgLU9hTSqWYM6Rfnh0YjP24EG3xq7ncj2Wu1AdfueNHKCOlamIonG4UHQ== - dependencies: - define-properties "^1.1.2" - es-abstract "^1.11.0" - function-bind "^1.1.1" - has "^1.0.1" - -object.fromentries@^2.0.2: +"object.fromentries@^2.0.0 || ^1.0.0", object.fromentries@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ== @@ -23057,7 +22637,7 @@ object.reduce@^1.0.0: for-own "^1.0.0" make-iterator "^1.0.0" -object.values@^1.0.4, object.values@^1.1.0, object.values@^1.1.1: +object.values@^1.1.0, object.values@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== @@ -23156,13 +22736,21 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -open@^6.1.0, open@^6.3.0: +open@^6.3.0: version "6.4.0" resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== dependencies: is-wsl "^1.1.0" +open@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-7.1.0.tgz#68865f7d3cb238520fa1225a63cf28bcf8368a1c" + integrity sha512-lLPI5KgOwEYCDKXf4np7y1PBEkj7HYIyP2DY8mVDRnx0VIIu6bNrRB0R66TuO7Mack6EnTNLm4uvcl1UoklTpA== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + opener@^1.4.2: version "1.5.1" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" @@ -24221,10 +23809,10 @@ pngjs@^3.0.0: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.1.tgz#8e14e6679ee7424b544334c3b2d21cea6d8c209a" integrity sha512-ggXCTsqHRIsGMkHlCEhbHhUmNTA2r1lpkE0NL4Q9S8spkXbm4vE9TVmPso2AGYn90Gltdz8W5CyzhcIGg2Gejg== -pnp-webpack-plugin@1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.4.3.tgz#0a100b63f4a1d09cee6ee55a87393b69f03ab5c7" - integrity sha512-ExrNwuFH3DudHwWY2uRMqyiCOBEDdhQYHIAsqW/CM6hIZlSgXC/ma/p08FoNOUhVyh9hl1NGnMpR94T5i3SHaQ== +pnp-webpack-plugin@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz#62a1cd3068f46d564bb33c56eb250e4d586676eb" + integrity sha512-jd9olUr9D7do+RN8Wspzhpxhgp1n6Vd0NtQ4SFkmIACZoEL1nkyAdW9Ygrinjec0vgDcWjscFQQ1gDW8rsfKTg== dependencies: ts-pnp "^1.1.2" @@ -24367,6 +23955,11 @@ postcss-value-parser@^4.0.2: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" integrity sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== +postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + postcss-values-parser@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz#5d9fa63e2bcb0179ce48f3235303765eb89f3047" @@ -24394,6 +23987,15 @@ postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.2, postcss@^7.0.2 source-map "^0.6.1" supports-color "^6.1.0" +postcss@^7.0.32: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + potpack@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.1.tgz#d1b1afd89e4c8f7762865ec30bd112ab767e2ebf" @@ -24576,6 +24178,17 @@ promise-polyfill@^8.1.3: resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz#8c99b3cf53f3a91c68226ffde7bde81d7f904116" integrity sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g== +promise.allsettled@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.2.tgz#d66f78fbb600e83e863d893e98b3d4376a9c47c9" + integrity sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg== + dependencies: + array.prototype.map "^1.0.1" + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + iterate-value "^1.0.0" + promise.prototype.finally@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz#66f161b1643636e50e7cf201dc1b84a857f3864e" @@ -25141,14 +24754,6 @@ raw-loader@3.1.0, raw-loader@^3.1.0: loader-utils "^1.1.0" schema-utils "^2.0.1" -raw-loader@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-2.0.0.tgz#e2813d9e1e3f80d1bbade5ad082e809679e20c26" - integrity sha512-kZnO5MoIyrojfrPWqrhFNLZemIAX8edMOCp++yC5RKxzFB3m92DqKNhKlU6+FvpOhWtvyh3jOaD7J6/9tpdIKg== - dependencies: - loader-utils "^1.1.0" - schema-utils "^1.0.0" - raw-loader@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" @@ -25277,6 +24882,13 @@ react-clientside-effect@^1.2.0: "@babel/runtime" "^7.0.0" shallowequal "^1.1.0" +react-clientside-effect@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.2.tgz#6212fb0e07b204e714581dd51992603d1accc837" + integrity sha512-nRmoyxeok5PBO6ytPvSjKp9xwXg9xagoTK1mMjwnQxqM9Hd7MNPl+LS1bOSOe+CV2+4fnEquc7H/S8QD3q697A== + dependencies: + "@babel/runtime" "^7.0.0" + react-color@^2.13.8: version "2.14.1" resolved "https://registry.yarnpkg.com/react-color/-/react-color-2.14.1.tgz#db8ad4f45d81e74896fc2e1c99508927c6d084e0" @@ -25374,18 +24986,19 @@ react-docgen-typescript@^1.12.3: resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-1.12.3.tgz#fe62a5ce82e93573e316366e53adfe8273121c70" integrity sha512-s1XswWs4ykNdWKsPyfM4qptV5dT8nnjnVi2IcjoS/vGlRNYrc0TkW0scVOrinHZ+ndKhPqA4iVNrdwhxZBzJcg== -react-docgen@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-4.1.1.tgz#8fef0212dbf14733e09edecef1de6b224d87219e" - integrity sha512-o1wdswIxbgJRI4pckskE7qumiFyqkbvCO++TylEDOo2RbMiueIOg8YzKU4X9++r0DjrbXePw/LHnh81GRBTWRw== +react-docgen@^5.0.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-5.3.0.tgz#9aabde5e69f1993c8ba839fd9a86696504654589" + integrity sha512-hUrv69k6nxazOuOmdGeOpC/ldiKy7Qj/UFpxaQi0eDMrUFUTIPGtY5HJu7BggSmiyAMfREaESbtBL9UzdQ+hyg== dependencies: - "@babel/core" "^7.0.0" - "@babel/runtime" "^7.0.0" - async "^2.1.4" + "@babel/core" "^7.7.5" + "@babel/runtime" "^7.7.6" + ast-types "^0.13.2" commander "^2.19.0" doctrine "^3.0.0" + neo-async "^2.6.1" node-dir "^0.1.10" - recast "^0.17.3" + strip-indent "^3.0.0" react-dom@^16.12.0, react-dom@^16.8.3, react-dom@^16.8.5: version "16.12.0" @@ -25449,15 +25062,17 @@ react-focus-lock@^1.17.7: prop-types "^15.6.2" react-clientside-effect "^1.2.0" -react-focus-lock@^1.18.3: - version "1.19.1" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-1.19.1.tgz#2f3429793edaefe2d077121f973ce5a3c7a0651a" - integrity sha512-TPpfiack1/nF4uttySfpxPk4rGZTLXlaZl7ncZg/ELAk24Iq2B1UUaUioID8H8dneUXqznT83JTNDHDj+kwryw== +react-focus-lock@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.4.1.tgz#e842cc93da736b5c5d331799012544295cbcee4f" + integrity sha512-c5ZP56KSpj9EAxzScTqQO7bQQNPltf/W1ZEBDqNDOV1XOIwvAyHX0O7db9ekiAtxyKgnqZjQlLppVg94fUeL9w== dependencies: "@babel/runtime" "^7.0.0" - focus-lock "^0.6.3" + focus-lock "^0.7.0" prop-types "^15.6.2" - react-clientside-effect "^1.2.0" + react-clientside-effect "^1.2.2" + use-callback-ref "^1.2.1" + use-sidecar "^1.0.1" react-grid-layout@^0.16.2: version "0.16.6" @@ -25481,10 +25096,10 @@ react-helmet-async@^1.0.2: react-fast-compare "2.0.4" shallowequal "1.1.0" -react-hotkeys@2.0.0-pre4: - version "2.0.0-pre4" - resolved "https://registry.yarnpkg.com/react-hotkeys/-/react-hotkeys-2.0.0-pre4.tgz#a1c248a51bdba4282c36bf3204f80d58abc73333" - integrity sha512-oa+UncSWyOwMK3GExt+oELXaR7T3ItgcMolsupQFdKvwkEhVAluJd5rYczsRSQpQlVkdNoHG46De2NUeuS+88Q== +react-hotkeys@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/react-hotkeys/-/react-hotkeys-2.0.0.tgz#a7719c7340cbba888b0e9184f806a9ec0ac2c53f" + integrity sha512-3n3OU8vLX/pfcJrR3xJ1zlww6KS1kEJt0Whxc4FiGV+MJrQ1mYSYI3qS/11d2MJDFm8IhOXMTFQirfu6AVOF6Q== dependencies: prop-types "^15.6.1" @@ -25510,12 +25125,12 @@ react-input-range@^1.3.0: autobind-decorator "^1.3.4" prop-types "^15.5.8" -react-inspector@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-3.0.2.tgz#c530a06101f562475537e47df428e1d7aff16ed8" - integrity sha512-PSR8xDoGFN8R3LKmq1NT+hBBwhxjd9Qwz8yKY+5NXY/CHpxXHm01CVabxzI7zFwFav/M3JoC/Z0Ro2kSX6Ef2Q== +react-inspector@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-4.0.1.tgz#0f888f78ff7daccbc7be5d452b20c96dc6d5fbb8" + integrity sha512-xSiM6CE79JBqSj8Fzd9dWBHv57tLTH7OM57GP3VrE5crzVF3D5Khce9w1Xcw75OAbvrA0Mi2vBneR1OajKmXFg== dependencies: - babel-runtime "^6.26.0" + "@babel/runtime" "^7.6.3" is-dom "^1.0.9" prop-types "^15.6.1" @@ -25599,21 +25214,13 @@ react-onclickoutside@^6.7.1: resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.8.0.tgz#9f91b5b3ed59f4d9e43fd71620dc200773a4d569" integrity sha512-5Q4Rn7QLEoh7WIe66KFvYIpWJ49GeHoygP1/EtJyZjXKgrWH19Tf0Ty3lWyQzrEEDyLOwUvvmBFSE3dcDdvagA== -react-popper-tooltip@^2.10.1: - version "2.10.1" - resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-2.10.1.tgz#e10875f31916297c694d64a677d6f8fa0a48b4d1" - integrity sha512-cib8bKiyYcrIlHo9zXx81G0XvARfL8Jt+xum709MFCgQa3HTqTi4au3iJ9tm7vi7WU7ngnqbpWkMinBOtwo+IQ== - dependencies: - "@babel/runtime" "^7.7.4" - react-popper "^1.3.6" - -react-popper-tooltip@^2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-2.8.3.tgz#1c63e7473a96362bd93be6c94fa404470a265197" - integrity sha512-g5tfxmuj8ClNVwH4zswYJcD3GKoc5RMeRawd/WZnbyZGEDecsRKaVL+Kj7L3BG7w5qb6/MHcLTG8yE4CidwezQ== +react-popper-tooltip@^2.10.1, react-popper-tooltip@^2.8.3: + version "2.11.1" + resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-2.11.1.tgz#3c4bdfd8bc10d1c2b9a162e859bab8958f5b2644" + integrity sha512-04A2f24GhyyMicKvg/koIOQ5BzlrRbKiAgP6L+Pdj1MVX3yJ1NeZ8+EidndQsbejFT55oW1b++wg2Z8KlAyhfQ== dependencies: - "@babel/runtime" "^7.4.5" - react-popper "^1.3.3" + "@babel/runtime" "^7.9.2" + react-popper "^1.3.7" react-popper@^0.9.1: version "0.9.5" @@ -25623,19 +25230,7 @@ react-popper@^0.9.1: popper.js "^1.14.1" prop-types "^15.6.1" -react-popper@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.3.tgz#2c6cef7515a991256b4f0536cd4bdcb58a7b6af6" - integrity sha512-ynMZBPkXONPc5K4P5yFWgZx5JGAUIP3pGGLNs58cfAPgK67olx7fmLp+AdpZ0+GoQ+ieFDa/z4cdV6u7sioH6w== - dependencies: - "@babel/runtime" "^7.1.2" - create-react-context "<=0.2.2" - popper.js "^1.14.4" - prop-types "^15.6.1" - typed-styles "^0.0.7" - warning "^4.0.2" - -react-popper@^1.3.6: +react-popper@^1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.7.tgz#f6a3471362ef1f0d10a4963673789de1baca2324" integrity sha512-nmqYTx7QVjCm3WUZLeuOomna138R1luC4EqkW3hxJUrAe+3eNz3oFCLYdnPwILfn0mX1Ew2c3wctrjlUMYYUww== @@ -25750,10 +25345,10 @@ react-router@^3.2.0: prop-types "^15.5.6" warning "^3.0.0" -react-select@^3.0.0: - version "3.0.8" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.0.8.tgz#06ff764e29db843bcec439ef13e196865242e0c1" - integrity sha512-v9LpOhckLlRmXN5A6/mGGEft4FMrfaBFTGAnuPHcUgVId7Je42kTq9y0Z+Ye5z8/j0XDT3zUqza8gaRaI1PZIg== +react-select@^3.0.8: + version "3.1.0" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.1.0.tgz#ab098720b2e9fe275047c993f0d0caf5ded17c27" + integrity sha512-wBFVblBH1iuCBprtpyGtd1dGMadsG36W5/t2Aj8OE6WbByDg5jIFyT7X5gT+l0qmT5TqWhxX+VsKJvCEl2uL9g== dependencies: "@babel/runtime" "^7.4.4" "@emotion/cache" "^10.0.9" @@ -25762,7 +25357,7 @@ react-select@^3.0.0: memoize-one "^5.0.0" prop-types "^15.6.0" react-input-autosize "^2.2.2" - react-transition-group "^2.2.1" + react-transition-group "^4.3.0" react-shortcuts@^2.0.0: version "2.0.1" @@ -25803,6 +25398,17 @@ react-sticky@^6.0.3: prop-types "^15.5.8" raf "^3.3.0" +react-syntax-highlighter@^11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-11.0.2.tgz#4e3f376e752b20d2f54e4c55652fd663149e4029" + integrity sha512-kqmpM2OH5OodInbEADKARwccwSQWBfZi0970l5Jhp4h39q9Q65C4frNcnd6uHE5pR00W8pOWj9HDRntj2G4Rww== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "~9.13.0" + lowlight "~1.11.0" + prismjs "^1.8.4" + refractor "^2.4.1" + react-syntax-highlighter@^5.7.0: version "5.8.0" resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-5.8.0.tgz#a220c010fd0641751d93532509ba7159cc3a4383" @@ -25812,17 +25418,6 @@ react-syntax-highlighter@^5.7.0: highlight.js "~9.12.0" lowlight "~1.9.1" -react-syntax-highlighter@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-8.1.0.tgz#59103ff17a828a27ed7c8f035ae2558f09b6b78c" - integrity sha512-G2bkZxmF3VOa4atEdXIDSfwwCqjw6ZQX5znfTaHcErA1WqHIS0o6DaSCDKFPVaOMXQEB9Hf1UySYQvuJmV8CXg== - dependencies: - babel-runtime "^6.18.0" - highlight.js "~9.12.0" - lowlight "~1.9.1" - prismjs "^1.8.4" - refractor "^2.4.1" - react-test-renderer@^16.0.0-0, react-test-renderer@^16.12.0: version "16.12.0" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.12.0.tgz#11417ffda579306d4e841a794d32140f3da1b43f" @@ -25848,15 +25443,15 @@ react-tiny-virtual-list@^2.2.0: dependencies: prop-types "^15.5.7" -react-transition-group@^2.2.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.7.1.tgz#1fe6d54e811e8f9dfd329aa836b39d9cd16587cb" - integrity sha512-b0VJTzNRnXxRpCuxng6QJbAzmmrhBn1BZJfPPnHbH2PIo8msdkajqwtfdyGm/OypPXZNfAHKEqeN15wjMXrRJQ== +react-transition-group@^4.3.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" + integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== dependencies: - dom-helpers "^3.3.1" + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" loose-envify "^1.4.0" prop-types "^15.6.2" - react-lifecycles-compat "^3.0.4" react-use@^13.27.0: version "13.27.0" @@ -25930,7 +25525,7 @@ react-visibility-sensor@^5.1.1: dependencies: prop-types "^15.7.2" -react@^0.14.0, react@^16.12.0, react@^16.8.3, react@^16.8.5: +react@^16.12.0, react@^16.8.3, react@^16.8.5: version "16.12.0" resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== @@ -26032,15 +25627,6 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" -read-pkg-up@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-6.0.0.tgz#da75ce72762f2fa1f20c5a40d4dd80c77db969e3" - integrity sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw== - dependencies: - find-up "^4.0.0" - read-pkg "^5.1.1" - type-fest "^0.5.0" - read-pkg-up@^7.0.0, read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" @@ -26077,7 +25663,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -read-pkg@^5.1.1, read-pkg@^5.2.0: +read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== @@ -26234,16 +25820,6 @@ recast@^0.14.7: private "~0.1.5" source-map "~0.6.1" -recast@^0.17.3: - version "0.17.6" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.17.6.tgz#64ae98d0d2dfb10ff92ff5fb9ffb7371823b69fa" - integrity sha512-yoQRMRrK1lszNtbkGyM4kN45AwylV5hMiuEveUBlxytUViWevjvX6w+tzJt1LH4cfUhWt4NZvy3ThIhu6+m5wQ== - dependencies: - ast-types "0.12.4" - esprima "~4.0.0" - private "^0.1.8" - source-map "~0.6.1" - recast@~0.11.12: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" @@ -26472,7 +26048,7 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.12.0, regenerator-runtime@^0.12.1: +regenerator-runtime@^0.12.0: version "0.12.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== @@ -28926,18 +28502,7 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.matchall@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-3.0.2.tgz#c1fdb23f90058e929a69cfa2e8b12300daefe030" - integrity sha512-hsRe42jQ8+OJej2GVjhnSVodQ3NQgHV0FDD6dW7ZTM22J4uIbuYiAADCCc1tfyN7ocEl/KUUbudM36E2tZcF8w== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.14.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - regexp.prototype.flags "^1.2.0" - -string.prototype.matchall@^4.0.2: +"string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== @@ -29208,13 +28773,13 @@ style-it@^2.1.3: dependencies: react-lib-adler32 "^1.0.3" -style-loader@^0.23.1: - version "0.23.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" - integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== +style-loader@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" + integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== dependencies: - loader-utils "^1.1.0" - schema-utils "^1.0.0" + loader-utils "^2.0.0" + schema-utils "^2.6.6" style-loader@^1.1.3: version "1.1.3" @@ -29706,16 +29271,16 @@ teamwork@3.x.x: resolved "https://registry.yarnpkg.com/teamwork/-/teamwork-3.0.1.tgz#ff38c7161f41f8070b7813716eb6154036ece196" integrity sha512-hEkJIpDOfOYe9NYaLFk00zQbzZeKNCY8T2pRH3I13Y1mJwxaSQ6NEsjY5rCp+11ezCiZpWGoGFTbOuhg4qKevQ== -telejson@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/telejson/-/telejson-3.1.0.tgz#c648479afe0d8edd90aeaf478b0b8a2fe9f59513" - integrity sha512-mhiVy+xp2atri1bzSzdy/gVGXlOhibaoZ092AUq5xhnrZGdzhF0fLaOduHJQghkro+qmjYMwhsOL9CkD2zTicg== +telejson@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/telejson/-/telejson-3.3.0.tgz#6d814f3c0d254d5c4770085aad063e266b56ad03" + integrity sha512-er08AylQ+LEbDLp1GRezORZu5wKOHaBczF6oYJtgC3Idv10qZ8A3p6ffT+J5BzDKkV9MqBvu8HAKiIIOp6KJ2w== dependencies: "@types/is-function" "^1.0.0" global "^4.4.0" is-function "^1.0.1" is-regex "^1.0.4" - is-symbol "^1.0.2" + is-symbol "^1.0.3" isobject "^4.0.0" lodash "^4.17.15" memoizerific "^1.11.3" @@ -29759,7 +29324,7 @@ terminal-link@^2.0.0, terminal-link@^2.1.1: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@^1.2.4, terser-webpack-plugin@^1.4.3: +terser-webpack-plugin@^1.4.3: version "1.4.4" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f" integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA== @@ -30952,7 +30517,7 @@ type-fest@^0.13.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== -type-fest@^0.3.0, type-fest@^0.3.1: +type-fest@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== @@ -30962,7 +30527,7 @@ type-fest@^0.4.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== -type-fest@^0.5.0, type-fest@^0.5.2: +type-fest@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== @@ -31605,6 +31170,11 @@ url@0.11.0, url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-callback-ref@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.2.4.tgz#d86d1577bfd0b955b6e04aaf5971025f406bea3c" + integrity sha512-rXpsyvOnqdScyied4Uglsp14qzag1JIemLeTWGKbwpotWht57hbP78aNT+Q4wdFKQfQibbUX4fb6Qb4y11aVOQ== + use-memo-one@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.1.tgz#39e6f08fe27e422a7d7b234b5f9056af313bd22c" @@ -31617,6 +31187,14 @@ use-resize-observer@^6.0.0: dependencies: resize-observer-polyfill "^1.5.1" +use-sidecar@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.0.2.tgz#e72f582a75842f7de4ef8becd6235a4720ad8af6" + integrity sha512-287RZny6m5KNMTb/Kq9gmjafi7lQL0YHO1lYolU6+tY1h9+Z3uCtkJJ3OSOq3INwYf2hBryCcDh4520AhJibMA== + dependencies: + detect-node "^2.0.4" + tslib "^1.9.3" + use@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" @@ -32607,6 +32185,13 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack- source-list-map "^2.0.0" source-map "~0.6.1" +webpack-virtual-modules@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz#20863dc3cb6bb2104729fff951fbe14b18bd0299" + integrity sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA== + dependencies: + debug "^3.0.0" + webpack@^4.33.0, webpack@^4.38.0, webpack@^4.41.5: version "4.41.5" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.5.tgz#3210f1886bce5310e62bb97204d18c263341b77c" @@ -33265,6 +32850,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^1.7.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + yargs-parser@13.1.2, yargs-parser@^13.1.0, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" From 34e70ef8dd62e832428216d83943c441c8171c7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yulia=20=C4=8Cech?= <6585477+yuliacech@users.noreply.github.com> Date: Wed, 29 Jul 2020 16:32:13 +0200 Subject: [PATCH 120/126] [ILM] Add links to "Snapshot and Restore" from ILM "wait for snapshot policy" (#72473) * [ILM] Add links to "Snapshot and Restore" from ILM "wait for snapshot policy" * [ILM] Fix jest tests * [ILM] Fix jest integration tests * [ILM] Fix eslint error Co-authored-by: Elastic Machine --- .../edit_policy/edit_policy.helpers.tsx | 3 ++ .../__jest__/components/edit_policy.test.js | 4 +- .../public/application/app.tsx | 7 ++- .../public/application/index.tsx | 5 ++- .../components/delete_phase/delete_phase.js | 1 + .../snapshot_policies/snapshot_policies.tsx | 45 ++++++++++++++++--- .../sections/edit_policy/edit_policy.js | 1 + .../public/plugin.tsx | 11 ++++- 8 files changed, 65 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/edit_policy/edit_policy.helpers.tsx b/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/edit_policy/edit_policy.helpers.tsx index cba496ee0f212..ebe1c12e2a079 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/edit_policy/edit_policy.helpers.tsx +++ b/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/edit_policy/edit_policy.helpers.tsx @@ -40,6 +40,9 @@ const testBedConfig: TestBedConfig = { initialEntries: [`/policies/edit/${POLICY_NAME}`], componentRoutePath: `/policies/edit/:policyName`, }, + defaultProps: { + getUrlForApp: () => {}, + }, }; const initTestBed = registerTestBed(EditPolicy, testBedConfig); diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/components/edit_policy.test.js b/x-pack/plugins/index_lifecycle_management/__jest__/components/edit_policy.test.js index c249a45fe8ed2..943f663a025d8 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/components/edit_policy.test.js +++ b/x-pack/plugins/index_lifecycle_management/__jest__/components/edit_policy.test.js @@ -120,7 +120,7 @@ describe('edit policy', () => { store = indexLifecycleManagementStore(); component = ( - + {}} /> ); store.dispatch(fetchedPolicies(policies)); @@ -155,7 +155,7 @@ describe('edit policy', () => { test('should show error when trying to save as new policy but using the same name', () => { component = ( - + {}} /> ); const rendered = mountWithIntl(component); diff --git a/x-pack/plugins/index_lifecycle_management/public/application/app.tsx b/x-pack/plugins/index_lifecycle_management/public/application/app.tsx index 11cd5d181f4ad..14b0e72317c66 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/app.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/app.tsx @@ -17,9 +17,11 @@ import { trackUiMetric } from './services/ui_metric'; export const App = ({ history, navigateToApp, + getUrlForApp, }: { history: ScopedHistory; navigateToApp: ApplicationStart['navigateToApp']; + getUrlForApp: ApplicationStart['getUrlForApp']; }) => { useEffect(() => trackUiMetric(METRIC_TYPE.LOADED, UIM_APP_LOAD), []); @@ -32,7 +34,10 @@ export const App = ({ path={`/policies`} render={(props) => } /> - + } + /> ); diff --git a/x-pack/plugins/index_lifecycle_management/public/application/index.tsx b/x-pack/plugins/index_lifecycle_management/public/application/index.tsx index eddbb5528ad84..31a9abdc7145e 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/index.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/index.tsx @@ -17,12 +17,13 @@ export const renderApp = ( element: Element, I18nContext: I18nStart['Context'], history: ScopedHistory, - navigateToApp: ApplicationStart['navigateToApp'] + navigateToApp: ApplicationStart['navigateToApp'], + getUrlForApp: ApplicationStart['getUrlForApp'] ): UnmountCallback => { render( - + , element diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/delete_phase/delete_phase.js b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/delete_phase/delete_phase.js index 34d1c0f8de216..2b12eec953e11 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/delete_phase/delete_phase.js +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/delete_phase/delete_phase.js @@ -123,6 +123,7 @@ export class DeletePhase extends PureComponent { setPhaseData(PHASE_WAIT_FOR_SNAPSHOT_POLICY, value)} + getUrlForApp={this.props.getUrlForApp} /> diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/snapshot_policies/snapshot_policies.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/snapshot_policies/snapshot_policies.tsx index a1304d9fb0125..76115fd914b01 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/snapshot_policies/snapshot_policies.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/snapshot_policies/snapshot_policies.tsx @@ -8,12 +8,14 @@ import React, { Fragment } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; +import { ApplicationStart } from 'kibana/public'; import { EuiButtonIcon, EuiCallOut, EuiComboBox, EuiComboBoxOptionOption, + EuiLink, EuiSpacer, } from '@elastic/eui'; @@ -22,8 +24,13 @@ import { useLoadSnapshotPolicies } from '../../../../services/api'; interface Props { value: string; onChange: (value: string) => void; + getUrlForApp: ApplicationStart['getUrlForApp']; } -export const SnapshotPolicies: React.FunctionComponent = ({ value, onChange }) => { +export const SnapshotPolicies: React.FunctionComponent = ({ + value, + onChange, + getUrlForApp, +}) => { const { error, isLoading, data, sendRequest } = useLoadSnapshotPolicies(); const policies = data.map((name: string) => ({ @@ -43,6 +50,12 @@ export const SnapshotPolicies: React.FunctionComponent = ({ value, onChan onChange(newValue); }; + const getUrlForSnapshotPolicyWizard = () => { + return getUrlForApp('management', { + path: `data/snapshot_restore/add_policy`, + }); + }; + let calloutContent; if (error) { calloutContent = ( @@ -50,7 +63,6 @@ export const SnapshotPolicies: React.FunctionComponent = ({ value, onChan = ({ value, onChan > + {i18n.translate( + 'xpack.indexLifecycleMgmt.editPolicy.deletePhase.noPoliciesCreatedLink', + { + defaultMessage: 'Create a snapshot lifecycle policy', + } + )} + + ), + }} /> @@ -110,7 +134,6 @@ export const SnapshotPolicies: React.FunctionComponent = ({ value, onChan = ({ value, onChan > + {i18n.translate( + 'xpack.indexLifecycleMgmt.editPolicy.deletePhase.customPolicyLink', + { + defaultMessage: 'create a new policy', + } + )} + + ), + }} /> diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/edit_policy.js b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/edit_policy.js index 998143929afef..04ee2391f0d20 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/edit_policy.js +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/edit_policy.js @@ -308,6 +308,7 @@ export class EditPolicy extends Component { diff --git a/x-pack/plugins/index_lifecycle_management/public/plugin.tsx b/x-pack/plugins/index_lifecycle_management/public/plugin.tsx index 1d26aa53752a9..0ca62c10f55f3 100644 --- a/x-pack/plugins/index_lifecycle_management/public/plugin.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/plugin.tsx @@ -47,7 +47,7 @@ export class IndexLifecycleManagementPlugin { chrome: { docTitle }, i18n: { Context: I18nContext }, docLinks: { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION }, - application: { navigateToApp }, + application: { navigateToApp, getUrlForApp }, } = coreStart; docTitle.change(PLUGIN.TITLE); @@ -58,7 +58,14 @@ export class IndexLifecycleManagementPlugin { ); const { renderApp } = await import('./application'); - const unmountAppCallback = renderApp(element, I18nContext, history, navigateToApp); + + const unmountAppCallback = renderApp( + element, + I18nContext, + history, + navigateToApp, + getUrlForApp + ); return () => { docTitle.reset(); From 754c3538ecf71c7deabd1b1c490ba8e9230d2e99 Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Wed, 29 Jul 2020 16:54:08 +0200 Subject: [PATCH 121/126] [ML] Functional tests - stabilize DFA navigation and index pattern handling (#73660) This PR adds a few stability fixes around DFA creation and cloning. --- .../apps/ml/data_frame_analytics/cloning.ts | 1 + .../ml/data_frame_analytics_creation.ts | 18 ++++++++++++------ .../functional/services/ml/test_resources.ts | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/cloning.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/cloning.ts index e2f7960f9d856..00be1b8e12b49 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/cloning.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/cloning.ts @@ -157,6 +157,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.api.deleteIndices(cloneDestIndex); await ml.api.deleteIndices(testData.job.dest!.index as string); await ml.testResources.deleteIndexPatternByTitle(testData.job.dest!.index as string); + await ml.testResources.deleteIndexPatternByTitle(cloneDestIndex); }); it('should open the wizard with a proper header', async () => { diff --git a/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts b/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts index 5f3d21b80a830..a49febfe68f61 100644 --- a/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts +++ b/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts @@ -335,18 +335,24 @@ export function MachineLearningDataFrameAnalyticsCreationProvider( }, async continueToAdditionalOptionsStep() { - await testSubjects.clickWhenNotDisabled('mlAnalyticsCreateJobWizardContinueButton'); - await this.assertAdditionalOptionsStepActive(); + await retry.tryForTime(5000, async () => { + await testSubjects.clickWhenNotDisabled('mlAnalyticsCreateJobWizardContinueButton'); + await this.assertAdditionalOptionsStepActive(); + }); }, async continueToDetailsStep() { - await testSubjects.clickWhenNotDisabled('mlAnalyticsCreateJobWizardContinueButton'); - await this.assertDetailsStepActive(); + await retry.tryForTime(5000, async () => { + await testSubjects.clickWhenNotDisabled('mlAnalyticsCreateJobWizardContinueButton'); + await this.assertDetailsStepActive(); + }); }, async continueToCreateStep() { - await testSubjects.clickWhenNotDisabled('mlAnalyticsCreateJobWizardContinueButton'); - await this.assertCreateStepActive(); + await retry.tryForTime(5000, async () => { + await testSubjects.clickWhenNotDisabled('mlAnalyticsCreateJobWizardContinueButton'); + await this.assertCreateStepActive(); + }); }, async assertModelMemoryInputExists() { diff --git a/x-pack/test/functional/services/ml/test_resources.ts b/x-pack/test/functional/services/ml/test_resources.ts index 9927c987bbea5..942dc4a80d4ac 100644 --- a/x-pack/test/functional/services/ml/test_resources.ts +++ b/x-pack/test/functional/services/ml/test_resources.ts @@ -56,7 +56,7 @@ export function MachineLearningTestResourcesProvider({ getService }: FtrProvider ): Promise { log.debug(`Searching for '${objectType}' with title '${title}'...`); const findResponse = await supertest - .get(`/api/saved_objects/_find?type=${objectType}`) + .get(`/api/saved_objects/_find?type=${objectType}&per_page=10000`) .set(COMMON_REQUEST_HEADERS) .expect(200) .then((res: any) => res.body); From 4f8e7baa3ee1f866f307dc6f20fc1d897513beec Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Wed, 29 Jul 2020 16:57:34 +0200 Subject: [PATCH 122/126] Set timeRange to default to trigger the error message (#73629) --- test/functional/apps/discover/_errors.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/functional/apps/discover/_errors.js b/test/functional/apps/discover/_errors.js index f3936d06bb6df..614059dc8ac94 100644 --- a/test/functional/apps/discover/_errors.js +++ b/test/functional/apps/discover/_errors.js @@ -22,12 +22,13 @@ import expect from '@kbn/expect'; export default function ({ getService, getPageObjects }) { const esArchiver = getService('esArchiver'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['common', 'discover']); + const PageObjects = getPageObjects(['common', 'discover', 'timePicker']); describe('errors', function describeIndexTests() { before(async function () { await esArchiver.loadIfNeeded('logstash_functional'); await esArchiver.load('invalid_scripted_field'); + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); await PageObjects.common.navigateToApp('discover'); }); @@ -35,8 +36,7 @@ export default function ({ getService, getPageObjects }) { await esArchiver.unload('invalid_scripted_field'); }); - // ES issue https://github.com/elastic/elasticsearch/issues/54235 - describe.skip('invalid scripted field error', () => { + describe('invalid scripted field error', () => { it('is rendered', async () => { const isFetchErrorVisible = await testSubjects.exists('discoverFetchError'); expect(isFetchErrorVisible).to.be(true); From 2dca40ab2fe4153f083474dde2fdba12609f512b Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Wed, 29 Jul 2020 11:19:53 -0400 Subject: [PATCH 123/126] [ML] DF Analytics results: ensure `View` link is only enabled when job has successfully completed (#73539) * disable view link if job is incomplete or failed * ensure hooks run before return to avoid react error --- .../outlier_exploration.tsx | 14 ++-- .../action_view/get_view_link_status.ts | 83 +++++++++++++++++++ .../components/action_view/view_button.tsx | 26 ++---- 3 files changed, 97 insertions(+), 26 deletions(-) create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/get_view_link_status.ts diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx index 9341c0aa1a338..4c4731d0dad5f 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx @@ -56,6 +56,13 @@ export const OutlierExploration: FC = React.memo(({ jobId }) = const { columnsWithCharts, errorMessage, status, tableItems } = outlierData; + /* eslint-disable-next-line react-hooks/rules-of-hooks */ + const colorRange = useColorRange( + COLOR_RANGE.BLUE, + COLOR_RANGE_SCALE.INFLUENCER, + jobConfig !== undefined ? getFeatureCount(jobConfig.dest.results_field, tableItems) : 1 + ); + // if it's a searchBar syntax error leave the table visible so they can try again if (status === INDEX_STATUS.ERROR && !errorMessage.includes('failed to create query')) { return ( @@ -74,13 +81,6 @@ export const OutlierExploration: FC = React.memo(({ jobId }) = ); } - /* eslint-disable-next-line react-hooks/rules-of-hooks */ - const colorRange = useColorRange( - COLOR_RANGE.BLUE, - COLOR_RANGE_SCALE.INFLUENCER, - jobConfig !== undefined ? getFeatureCount(jobConfig.dest.results_field, tableItems) : 1 - ); - return ( {jobConfig !== undefined && needsDestIndexPattern && ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/get_view_link_status.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/get_view_link_status.ts new file mode 100644 index 0000000000000..e5f6c27582a05 --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/get_view_link_status.ts @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +import { + isRegressionAnalysis, + isOutlierAnalysis, + isClassificationAnalysis, +} from '../../../../common/analytics'; +import { + DataFrameAnalyticsListRow, + isDataFrameAnalyticsStopped, + isDataFrameAnalyticsFailed, + getDataFrameAnalyticsProgressPhase, +} from '../analytics_list/common'; + +const unknownJobTypeMessage = i18n.translate( + 'xpack.ml.dataframe.analyticsList.viewActionUnknownJobTypeToolTipContent', + { + defaultMessage: 'There is no results page available for this type of data frame analytics job.', + } +); +const jobNotStartedMessage = i18n.translate( + 'xpack.ml.dataframe.analyticsList.viewActionJobNotStartedToolTipContent', + { + defaultMessage: + 'The data frame analytics job did not start. There is no results page available.', + } +); +const jobNotFinishedMessage = i18n.translate( + 'xpack.ml.dataframe.analyticsList.viewActionJobNotFinishedToolTipContent', + { + defaultMessage: + 'The data frame analytics job is not finished. There is no results page available.', + } +); +const jobFailedMessage = i18n.translate( + 'xpack.ml.dataframe.analyticsList.viewActionJobFailedToolTipContent', + { + defaultMessage: 'The data frame analytics job failed. There is no results page available.', + } +); + +interface ViewLinkStatusReturn { + disabled: boolean; + tooltipContent?: string; +} + +export function getViewLinkStatus(item: DataFrameAnalyticsListRow): ViewLinkStatusReturn { + const viewLinkStatus: ViewLinkStatusReturn = { disabled: false }; + + const progressStats = getDataFrameAnalyticsProgressPhase(item.stats); + const jobFailed = isDataFrameAnalyticsFailed(item.stats.state); + const jobNotStarted = progressStats.currentPhase === 1 && progressStats.progress === 0; + const jobFinished = + isDataFrameAnalyticsStopped(item.stats.state) && + progressStats.currentPhase === progressStats.totalPhases && + progressStats.progress === 100; + const isUnknownJobType = + !isRegressionAnalysis(item.config.analysis) && + !isOutlierAnalysis(item.config.analysis) && + !isClassificationAnalysis(item.config.analysis); + + const disabled = !jobFinished || jobFailed || isUnknownJobType; + + if (disabled) { + viewLinkStatus.disabled = true; + if (isUnknownJobType) { + viewLinkStatus.tooltipContent = unknownJobTypeMessage; + } else if (jobFailed) { + viewLinkStatus.tooltipContent = jobFailedMessage; + } else if (jobNotStarted) { + viewLinkStatus.tooltipContent = jobNotStartedMessage; + } else if (!jobFinished) { + viewLinkStatus.tooltipContent = jobNotFinishedMessage; + } + } + + return viewLinkStatus; +} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/view_button.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/view_button.tsx index 52b2513d13e39..8a4509ebfd007 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/view_button.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/view_button.tsx @@ -8,16 +8,13 @@ import React, { FC } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonEmpty, EuiToolTip } from '@elastic/eui'; -import { - getAnalysisType, - isRegressionAnalysis, - isOutlierAnalysis, - isClassificationAnalysis, -} from '../../../../common/analytics'; +import { getAnalysisType } from '../../../../common/analytics'; import { useMlKibana } from '../../../../../contexts/kibana'; import { getResultsUrl, DataFrameAnalyticsListRow } from '../analytics_list/common'; +import { getViewLinkStatus } from './get_view_link_status'; + interface ViewButtonProps { item: DataFrameAnalyticsListRow; isManagementTable: boolean; @@ -30,11 +27,8 @@ export const ViewButton: FC = ({ item, isManagementTable }) => }, } = useMlKibana(); + const { disabled, tooltipContent } = getViewLinkStatus(item); const analysisType = getAnalysisType(item.config.analysis); - const buttonDisabled = - !isRegressionAnalysis(item.config.analysis) && - !isOutlierAnalysis(item.config.analysis) && - !isClassificationAnalysis(item.config.analysis); const url = getResultsUrl(item.id, analysisType); const navigator = isManagementTable @@ -52,7 +46,7 @@ export const ViewButton: FC = ({ item, isManagementTable }) => data-test-subj="mlAnalyticsJobViewButton" flush="left" iconType="visTable" - isDisabled={buttonDisabled} + isDisabled={disabled} onClick={navigator} size="s" > @@ -60,15 +54,9 @@ export const ViewButton: FC = ({ item, isManagementTable }) =>
      ); - if (buttonDisabled) { + if (disabled) { return ( - + {button} ); From 71badc67de44f1550ac576bed461e742143844eb Mon Sep 17 00:00:00 2001 From: Kaarina Tungseth Date: Wed, 29 Jul 2020 10:40:53 -0500 Subject: [PATCH 124/126] [DOCS] [Lens] 7.9 docs refresh (#72301) * [DOCS] Lens refresh for 7.9 * Clean up * Review comments from Wylie --- .../images/lens_aggregation_labels.png | Bin 0 -> 46580 bytes docs/visualize/images/lens_data_info.png | Bin 67327 -> 90882 bytes docs/visualize/images/lens_drag_drop.gif | Bin 1034898 -> 1082247 bytes docs/visualize/images/lens_index_pattern.png | Bin 0 -> 22543 bytes docs/visualize/images/lens_layers.png | Bin 0 -> 11311 bytes docs/visualize/images/lens_suggestions.gif | Bin 641241 -> 1208922 bytes docs/visualize/images/lens_tutorial_1.png | Bin 64583 -> 42828 bytes docs/visualize/images/lens_tutorial_2.png | Bin 83665 -> 70209 bytes docs/visualize/images/lens_tutorial_3.1.png | Bin 0 -> 107860 bytes docs/visualize/images/lens_tutorial_3.2.png | Bin 0 -> 140169 bytes docs/visualize/images/lens_tutorial_3.png | Bin 171404 -> 236644 bytes docs/visualize/images/lens_viz_types.png | Bin 27052 -> 54399 bytes docs/visualize/lens.asciidoc | 60 ++++++++++-------- 13 files changed, 35 insertions(+), 25 deletions(-) create mode 100644 docs/visualize/images/lens_aggregation_labels.png create mode 100644 docs/visualize/images/lens_index_pattern.png create mode 100644 docs/visualize/images/lens_layers.png create mode 100644 docs/visualize/images/lens_tutorial_3.1.png create mode 100644 docs/visualize/images/lens_tutorial_3.2.png diff --git a/docs/visualize/images/lens_aggregation_labels.png b/docs/visualize/images/lens_aggregation_labels.png new file mode 100644 index 0000000000000000000000000000000000000000..9dcf1d226a197a439ee4f66d53c95c98890732ba GIT binary patch literal 46580 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π33t_wG%iYEW#HTF# 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

      dSj0GTR4zye>NI^u@czr^&ebN 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%0Au=(B$?dC zHLGSxG^u%04{XsAt%JBEbmJ#C1bTkb!nv8#?g^v!g2NoCdW#k2A6 zDl5F()NcjFSUj%=B{~`ixfz;U8pJ$vn@DPz*pZt#sP6mc>^~v%@cz49Zm8th9)EX?P3&AKc5sWXqkA}Y_sN0ui5Iqd}TbnhJbPH9`P}t+w|!By1vO8 z0wEdkSkL!w2#T1H?DH?OWky4umK)VoI+8}tIPj|>b;3qWzQj?swdpe-=wD1J)$o#) zm}|h6vt1>(%^z$K?IKDot&kfC|FUZ`1q=AdBv%(Viao1*n6wb1f5CQ=Nc3T4f!jPI zow7n9M3aY?)c~O=@~=Z0Q;K2fJ-wWR!yq!er3eXsst?Ah zuWs?P1jdm=#Rdq&`=P&0>~5BLaN8ykz>qRN&Ns4p(y+86o@MQ(DV4)||a0y5tVX57Txzk-=iguI>69=9H0 z{5MiR>;jN{0n-SBc>g9Ineg7-_~xOL0bQI KZm+VPNoq5vZhV(Yb3Cy5MyK1(a- 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

      n>YeJxU^*54`V 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 literal 67327 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 z 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%0A4o$+$|6u5@?nZXkN67 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�Mt1PQM<|JBs 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

      t(N(nUcSPct%JV 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

      NF^m)T(P1}@Vc?2!xuJ8( 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%0AiK#?syQErGdpaIL>NzC{6Lnwi>a( zZtObiDP646WSwigb*p<$18>-mV!Pk&6Fl!qMBhcGk?t6~tZq#H_%pe6l5s`y&GV%y z#3^UDO~F`on;Xj~eh<`{u@4KXAr$r0n0qv{jhE{-IthZ!)?FZ57rM35V{|xm)eCfB zOL1n!Cq>7jan0P}@i2B%ObM-SpJsNw#*xv0X4cpE)tlB$zhzABc6w&4zAb!jZW}7h z9GWb8KUwT{!cl#Q`w+YzvUToxca=U9FNgj3XCTzr=HaR5JOf}+uY?^^C}bU=bi)B^oN7jzfUdm=NRectWzait@YQ~@l5_z~cT+)kZtiRLOX++v!{|97xf9H%(RJ#~uFew_aZ!d(sXOxhNsr>86}WI4~ZaGR8bEx&u)cp=luZ~7WRAS-0T$XTnL$5C}A($TNuF?yaf2sK28S&|)P)3K5kq2dKPl3`!re=v^*(b5{26vhC#)u>@1v=+Xi_? zSn&bl?LurA@tgN2SwA6K5LMa$WI!s`w@N+y-XS6peBhcJ;Eoqbz52GfN*SxpL zG#_Ac#@Y)d5QDu&XP>_p$8%Tj5RhgRORXoc*5Z}cX+9Sc!q*c$fV9!`bmn@3!3DM$ z-IGPJC1pI*%+E1|IRt^S_44c88D^pxb#d|1d8l}UjqLP_94U+n4yIDM5zpF4Xbpa5 z!FcwCsxcb;d>Gns4yMvdRb|GjiiEsv4Q~G%tj!KS&+k*8KM9_2XS|9F>Hf0ejRVKmi7w8s(n+9rrTAl+@drRnhLaWA zfh9yU$bat+)L?^*GbzWbP{*8r3+@zsEA&;bN!IPsR)x%tJbKKyKg~cx{x0u;0jvX1 z%Z^}pVyJqr>2-SfVe^|G^%&T_3p5hNr1fI>JXxO+|4pyhi|M{`ct_s(<+DaO_yhxM zMa7B~?0vW$9|NM1GQ9IdcmIY827xj(Vd^ZXd>w7~OVIBxWq<<%(D888ai2K{#$Ss& zEYbLHVd4qo?f8uC67lWRs@tfM2+89<;w@SdA0sgQI}x9^EvP(qgd*h}Bco+^WNxO) zo`_VswNrH$s@ij0f&ZfHok;bMJFufQEp0qfdKjBle{l6N#ox4pul7t+)7y%lBK2>6 z>*8{CBFD2trr7>9&Z|6Ma-ePq>b`91tGhHQ1dol?Ta|FI@vT}%AGI%%sl!3F8_#tt z!@*ykej8`i`lV^ukf8fP-vUIR(CRd^2I$s#jJu~I5@I49TZ;F=KjQmpQ2BBvj>8;p z@_ywgAXP+r9EUk1ego{BK=sAf%JabVD2|mNn!1N#C0!f=LaQEGjif$}2Dn-2boGFE zS}BUAAZedxNjXqO1l8$T(@r&&2mlHv_+kOTm<=F83Ci0WZ^SzNxGP?A_?Fj^Oly_s zSm|i1M_`M=E3e3|`aWi^4|qMLV+!kw+j_v1pV5|M_YTZ5D32s}JD3#Pk`{MuExE(Y znf6IV{K*k3P5#TEFQ=%Vli5aj9>z>ydvrWEL&LsKC%L&vcJu=_Uf;J&*KLm`zX}{8 zYw7lVh||BHc!FVXuwxno%MBa09OaKY4zo9iNnp@l#CX!`ilyH|j7h^W!|vsY!!-vV zq%TA4_fCJM?|nFbif@!UMQ{0gk}98fN(yzAwpsTXs%ypj0oMu`!l&g%Q!@_gFY$vP zf7=^p{bNMl)q%wuRYrN^D9+*WD&Zivt=aW`nk9}R@|RXDt$fwwx88`1D%H1MKbp0- zU82u88Ti}#3ghpkJ@Y@?H5VD|{OIO)`8+84fql$9zr)wIav(J90$d>WVH5oD@y9tOR?L;!TwxZmSd#_jpGpP>kiH4@=v9 z37oH>o%{OZoyQHN^7V3Qp5D;mNlu10h!d$6w1w%UaVmy7ua0Ko83Kw%Y6e`wWyxZ^ zmuCz}3zptu1ineL@GSgcGkinH+K&8So>t(ss5dHaYdnnn=hvrQ7%C5liAePe-<2%% z!%VO}%YD33HdZluq43*sLp5G4k(=v3RHy3vUS+8V3xz!Lw2F5R-PnEPE(zRzJGXx>iSt(cArUO?R#o zgfw_&h$QbD21inACuJYCt*f}k7XD5aE@+z5%oc3jBS=IPF{>2RO;~LzG12hv7c}B% z#pfP8yP)bx@Q~P1ZJkdZ5LD1wiR2`vi3BIAmoq3_8uIYTKJ)FkAa#vExSWNobpKOz z*6kkRYv!U@EUptiCX*n&5-ERpFDam#qFUb?8KKqyX|H!|-pj`IVdLk-)c+>iW~(*? zrKa?^KFv8;dyq{s7nLtciq#%AjJI}Gy`Y}OsnOV^m93VI)2&mfM~}OxW`D;gy&@=Y zy26i1YH7>s9_?{~C$bxo-loTPPAKZWa@KRSUXTRuzjB>nKaq6353=Et9 z>e$*JeKzG`LW7rqgh11PGAy%G&LMA$!EdEjw1yP6qe3*StmNCo`6^|)kzwBOHC_2B&764&^hX+cNSS3?0F`;x4)U#WFyPnm> zJB~SSSvn896%LW|i-1VS%EYX8frVUsyAJmlZX!$KJKR@~(*SzFUli3P2ggE=U@~s) zxR_(j60P;S{cco?Fjqey`(9=j=a(V!wI8(E6ZC%p`CnKxk!9+XfxwrJ z0t%Y%Di}>vIneBCl(oNQj-_^@OAFHcciRG&oYLHcWRNoNu*vZ+Ms#<0b4mGR7S?b3%;aBG+9@tpOuO3kaY z{-;&4?~FHm)=07_iM%Hzln z7z)6awJ0Wef;XI68s0e8@AU(`$H=lu0LZSW6|jLshKXQ!ZU|ZdUHt%Zu1^3M5dcz* z46r&JbBnW94L^-VpUi%(*wSk5`~H$gEd-CL4F~YS@fm7>%TByglLArqxc|=K)BJVS zBS%1-lb}z9HHEYou_9C-+Art}WxD3vLqSdv7KWF^;+Wf-GA6Ae_&iv*As_~a8Xoh0 zh|ZOfG571jk%!+UY-DSE61A-;2;)n%X}(OIOSub(V|(4Br9%CtWQ&Pm^c$bVkZ-@|z!*0vH1vFTt1@Qrb%i!e1Z z*-*EIVJ_vM9)S=KILZJB(!SK06%x3DOypn{Ds>-qYnQ;8VW72B5Dq!~2@L9KNpL7F zFDTQtIQudB)3Z{A!z%hQED(`*@60~V8M=GER#BO4troj=R4j%7E3*Rgb{+;>B^E$o zbx0nY?lu?MS!IBd8xhSLVp1_b zxki3LAU{*|+uteP^<qeyCG+vUu znD=n~`A*XIQEzvl*@G#Jx57Q2ut1K`Ut`)F-|ii_eDWt=9dDG%pdCAwu4QriP0Nd2 z<=DeS>%Gr+MnCMn82J!&>8q@#_oZEcy*Yus^$*dp9bFysLZv|Z#;2pG-(?8sZpp!) z4gWLfu}PD?wp;sOZI9nwIsBC}{{0_~FZaKkdHHMc@n2_jw8HaODXT46HyZ#HKCn~g zj^N$d>`uiXDo_doQec8KFkn3<*aQQyU_!LmirGZf&r)9n`i1g(gho5$o4Q9KZ0FaV zjcr2?hjPl3PSqM8cr9C%$#(F#&GQt)vrgmrV8*+`g@^GE&+0QvFe1xb3 z^>D(wIToNIK?i2AWTw;k`&-K}j;G!0K(;sLjK|&sf-6yx#_>VGjL*PKM5r4@oOiXK zPjmIPb)6L8GeZvdApMH$vVG-ZSR&&^_-tQyvJ_#oL&%EAXGTGWbYdjM#cI(R5h9wLF!ds! z!UO0atomwn7g>^tat_6K9055F6of%EY9WHF0Dclhv>iw+D8}(ET6h=BiO~3#h$<^o z^@asf72RN zUc|dD;^$$;TWl%d*a{K1LUb}(aRl6abPvoE0l71apMP0Pm3U5v~*zy93$;+T1Gh z`M?rjIp&$0!(9m?eSFWV#NL!SvkToLn8qe%;?+MK17(nE2BF;{{8RWauAZ7IGDFSB$NJIAc3z_ z0Klu^Q%NENRG<|qQx1Y_yz+Qf+ols1ZzWbRE5GjuqIXCto8$7yAJD|21xl(H7cgfi z?b@f*HXw{fkPPZvs+&!d0j^7&e!C>8-Fj}rrH>?29g*K~`>aOKb zvi&0$H(W(1m5Jk1qNbN~Zutx7lo7}!_^56h5i(GYoW=_Q2C25numB?603LF=yOD}jq{K^iejcpfrP2@eY2XoZ`B zjW;Ju+$Z4>AOZj~0JNykz^sSY1@HtN7C?eEetDz4nnTT%r-w<^`(;)R9W3hSaq_Vk zK$`i#B@cXgWXb-F-%}^9s@d*go%m=6>SxtBhZMs}!Jj2STM z;gnE!8`4Y!cED;|Ab@xPq3{BY87Z?Bjs7>zW<<2zvI5rxvfID#$nRa0`|~hD)8o&V!*f@{G}^!B4c8Jz zA6t#n_T3@lx#lZ+k1Tk|cQR`65WwoWVDLxQ6Ri+%R4p{n@kD6v?-gQwB<^w67Jjal zgM6^{F?|hoJ)DpiuJJwWbV!He2k3+fnOm0DCPV|O;U|p%{DGEF8&uCh@c;xK`m;_< z+zb({ERa|y@anLRx}NKu2HLj%bj_Bx2mq*qTNi^!O9Kf(8>SclP>$8l*ZqVT2$tIt zd#t(18}Vh~i=0a&(nafwLj51T2!UXTR2L1a^uRU*D8kS>Bf^rB#Q(Y*2Ku(8zz8-+ z<3Xd-P#!#JZz^+dTUOTYV+@aYWWO74Fu^-gK2S?Ryz$S|uNJWlrv@p?pXg==nF#-m-aQRoGz1v+O`{?dXIUlhuci5*@uNbcVnrPt!n!@>@hk3NgJ6dv z1k~F2m;=%HYZ0}2M|TWve;a~pbG>{l5eU`3lzi+{CvSN0r>sz-*(2HSETB#uz~h!| zyD$t=5z7nVWj*8y7!q)eI?fs8kLSQNs}Zi(5sq#X9-9$SHtJm)t6`c12w9^ftnGKi zCmA3>1P|l^@NxqHFxHLFIzSlS;a(HoQdv@a+va7Hq4Xt%>$Ib17`HJr%*(^Z1%Ooh z)Fv$&E@7iFNmZa#T(u!m&V!{hoj6MuU0Ghq)~;az+3;>b^{0PkmZ zC#Sq`oHr8>f{r|ad^dTe_Wg&^{tu}s@?I;C{3P&9?yO=IQN^Wv@- z9`5SAMo5P!CCFsW#R|NIz7GvduYjLRz97~v3CytQjX?jzOX^2*X7T(wkC{wsel7;f zv4^8UU)bqjQs);u;QC{M*oRc{N}ynD%szSM4 zLcZ;4r6vz?Jh$;PZL7s;U!VMVRDYeO&(~v6@8$fuU$c5aG(&J21!+r=2XY$I9)%dE2gF z8F5yL09`mCBPJ{G7oJ2FK0NE@Qgb8`pBq!Ld_#@AgP?rWM66-nz!2@M{TVHDRXd_` zyAn@QTXOo)yE+knd|U28+Xq&}2Kd;x$mC({uU9k;8GFkc#-sU*IUAl~_S3zgmZ(t_Wj zJ&RS{@xlAkxu4yN*|$D?9_D3tY?tCmv9o10{%H&&M4terP^7-UTJ3Ih@{RM$?0?Ght|4z}9L1-eB;rX)1SI3J(hT%T| z!_c9-(AU&7Fg`gjK0Pq|cCfeSUwYxk#=rE!?Ci+=`>}WPW6KMN`ohG-n~Arxhwj4U zpPhHZgNN?I%+#BinYr2J&vS?R!Xdrze&PMX;{S*X3m^Y);=<~ut&OFH|0OPL{{8#q z%g)#Bovp7s|K%3GZ2s8&{bPUskX!iuYxhuG`2Q=n@b6;&fBQM48ul~9{-00{)>^&~ zoc}+g8YZew4IEMpE#Zs*QVq55pT+#|RKwYFI~@UGi`nz_i?1?1s>J12l`anmDq4Q= z6g{LG?&w~WN^{mZUs~=s`zneoxYQ)ELhi2Emd|<`D`x82mv9)NO zB>V2(Kg^wFl?NZYXiiz9?$+T_()-p|XDJ|fD@qRjsw z;Nv){Ib!LM;>lM)VlELTBDh;GBc!L7^yZqbR0h@tnu-Sq&$K$=LtGZYt_Hx7_B z4!0CW7yy7ah(2ouKv05Al!lj@$=f0%ypn;IfDRvJ{vdXFHpie30BbPn(GL_uhxZCV zzI%3*6cEtj99P@rKH5N-cy>vq%t1yHh!2hEPEKM*0dk=+`088!?o1D$AbRu_NN^NJ zC{W@hX954dhn3zrbqp7(EaT<*3Y-t2$RV-{5*M4*GHul_=-p@l0F=!KkXV`oQ=~+N zP#36dmfOG*y^Ex>B*Ua;%z<{sxK5k=SQ$kdr>ygSHn*ilIhEUL&Fo6Xv8=X5uax$*syD!jV$++vel5Y5G7@%UZ2M~e*m_zYArAoH(3h&=E z+x147+R>PGKS@#II1J#(Y&Qqx`cDc}2z)sShSI-yoNYs6!ywo@5)s-24kVTFdsqI- z1V~un<>Bl$qB8-cq%&#>W?;I(urUCCX$Ahq;c%)Lj+G-($9;Ysd?TUa@#K#Vy!Ryl zR)s_X7ngGLh!DW*cm|}{49J^zg3goiG}q%Hh_uBHw_EPao;$qJj1jR-rvpUSxuM*v z-2w+Z87~EQu`q6?^i3&}QZ_r|ban(6&=R7#m{w+DrP8xwqY1+KU{eVFaO{_GT;Ud( zQ`QKC?thmR?8z;E7`n`x5xJi$H*!wvs#FSdq3eMTGf9ttbyNCO5Fb(pqWORzG%}1g z2qQ4vP%O7eWB|P%DR6Hwr9SppcWKsmd$g7)a_ijIFAi3_7r>2u?%&6$gOF#`3Cr5( zz4qFLaBH(gTuT*n^C7@=!|_vcg{?@5=qmmY)>)O4kw@erE@Ha6iHK`!NSwu3uBK-h z6_LeA#ul5ob(R}UjB{EeWKgS(=j=Gl;K;Yz7D`o98Kg)s&OlqfNGVP3N$UYJ*dZ0+ zUTK=XKFWy+$@IU`N;A4hv*K2e+GC8g0l9cUq zzma@>maek@qgKxW6QRa@dQjjo+nJFBy+)r-5IV|p=55?=h0nUFqL9&D!-J>0Pn?qM zpWIJEAPaYOrzz6km>BN@!~#sXASEC^S2^klL|?1>9^^WW0x zk!k^3rpW%U$tP*x&TrtgIAh9Nclj^~RFu9)myx7VU}Rxdu~b93i= z$O=u3CdLYiDDMYh(RSDtH9ntD6&MqC1~<8#Xg4Nljo?{9JB$kT0cYo3M9J9S#g$gyU~=0(bN z|G3;M3K2_E6!+A%wJ@*xK#k_=gOW9uc!f6))0=D7K*8=Kzu#un{D_W9+c^DkS)a`N zq%P6^vybrZRJ^)g!<|!8&$TAsjV2s9e^qkx0=Tki^2w7Y0<_K0>-Y4hSB6_&+20M9 zel@rBcdgnvYq^7Y)ZnYbmD^89$>$Q5bkZPLcSGE@QYYp#w`gW5i4sUZ|9w?3NyIL*UE_LWA$pAL%lyvt@=v%G&sv0 zQ%Kuut9~#M)VB;&-fnxb#hu$~;4ra=1PbZ|XTQ2A9=zllbQ4a1rNq3FlH*lN`okGwQ>%vB}DWWEJ1! z&#$DE3E&-CijDs{0ig5UQ8Kp2EmA<-5_hx#hJFx~a-<02hDe?4OffW|Kd($wCfv}D zNQ^t&Uc%2bRq6_4;+QzZ13)Bl40;bH;DNjTMNjZe5Gv6Fe%XhU?89LO%(#W6ANDn> z;3PjVkT(J8O4xKQLb_`Gt&nZ3Ec?7A0>G%d3}>I;dXm0r#o>%|;@IYLXK~!Y!+lsB zU;$F;7Ds+Kr+b}A;TDHV5;PhQFFXK1FNSkPZ*irvAc|GTHnb5ZinADX7Ny~wJ{d5N zaBUg@y1OUD9}kt$MI${?Cp^)4n2a)J3WbuA2N0N3O69Fe)9?kMFbT>OF3)@+K_9=5 zG$gkVR6j!x0pPIo_p23glCp*$!$4#_5yoVwRGk+A2lfF#NjPu_0D3r@8bSsU4DrMS zPzVCz&IVS$;Zy<~3I&{3)__na;Ayr>S`vs_cbOl+p`8I!0zjq0g^!n`e&xl78lq3; zBTrvN*-D>9LA)a z2u;Rh9+EjF*p?J&QdDqWpy2%~vd1%dJ}6h6kPg34kaxl*e>B~Bl!Ic8z>{q^r?Uy+ z`KQU=f~@?waL$VeNGS{KUT0wj;3&Kbi3S*?zAo0rJt*BOoYe+}kbpi2NMS~y@fJra z7c^>&Q!tzhG=o&qLbd!tp7S{b;L&-cvTY{;RVOC*QFhh@$QH2eTvN;tq1 z!I4~4094_sw*FPlO9|dlMX>LgfQczb^Mp8Mfihe~xm85j)2g!YqHa79n0LL>5xSuptaWgg86V+~KNB04gFOEF-Os0FP;)XGcWv z`P65>gsa6+#Z%SYuQQa2AnF~U=DWx`FF3-p)_Xp_<$}O^@@=vD8hjp#jCrJry^Kh{ zr-Hql2dGuX0zHic0-oNQoTp4zqo4y)HOa^qjB+htc?tum%S6gxfC5`}s=g4dEWypE zwI~Yp)mYU$uv!h9*x&`gBZX!k zDUUU(66$3T;J;o;62an9;u12p_at#Z^e9l1`AE&F>9iMIn2gjMKnkQVCpwUbs|_5_ zQotvhUosl`)*oqL6BfM^HL;*07$DlG$#O%?`k@#t{5WOmttk7>Fn#`O^PqtY-;?eO@q;E!Zz-y%2Xe7KNV zd!zDW4Q!hlH(KRrtEyA$J2=Xtnt@M2`lKM6ZJ`B~Dvt&lB1WGr!80$hlDe#EzB6?y zz)W2X&~@NR8KUJ(eSOIWVlr4@AfkmQ3hgP{&Y}54`QRavY73{`LyF#uZ~h0lo2=D* z{e?k&*gWU6R0e0~08(%rS-jWoeZ4L?xK_L9rRjjXhT%%XPYkdTjfm{vOiW2UT8;1b9DEiU7%k0)wJOboVt8tyBeHY%m}@b1Q91|6P?VbMNd(I zVz0D$TBF)KcJIB?0J8LAwOaEyZVn>%4cZ#v!H=juVTlM7Mw0hzCiN~jx%+&BV zTzA>7qT5^t0&os=qDx8_$_ErE)_I803l<`U3&&noCVTF7jNU^@k0R%4$`!(&ovTLH zw)dxb!;QFKSpMl*nt8icBec6RZi1aC0|2iB;Ma4JF{j{GxDmw@G;=a!TVhIko(tSU zE*~#vZk2Dv2w1YA(qI9f@Lpu5Zb`(waN9SS0(5W8n0jW0&m+cB%GjB#=0_)*9=s1Y!0U+9xQnVSvVLn;}E;<&?;<)-dTYn-ijH8l9;^e}>J{M-M zyo2(G$KASXr_}c0FsV~|nAg1;H)jrGUE|EXOS;2?2``)q#M~NRx*9MB=%yxt#d=G< z-kBRbzB`B<`IGWa0;N|oQ`L?P+DD0Lpr`*J%TfoDV}q1fyl z9USD%Gz-5D)DrtxS5+DUFi`6UU)c&wN&>}^!D+8KcJd1e01gHOO28jJWlN1CRa4o( zvLyLC0Ehw{dddfCOe(pu1^8;}9YhmaYehM!07a!{$(ZLF5kN_DZGWuR()Ag|zm3-< z-v07h5Z|w+9PpupM?b0k9ooOU;4(1ocDAj>$pv8r*TEOQRn99#K<;E@C9MIY+4s|? z*HT%xEj6{Z@3qY=g?m-9k1TlPy~rFx&Dzo6^~W@H|rCi!}<+pQ}5uTnKo z*n_#vBbxPw0$McA&SGPG1d##jlLfTZ^6L6Hs`*DVfN5jjsADnvls zWw_LHV#U6|F#5~VG%8Tx0fEjZ?=`7}K*LiVAZ9Kgn`Ehz4r+O*_0Aj_OdMmouB@|) z^;A-@OZ7xDy3QcJ6o2rsDC8lD>6|7#W_rA*_ve%nc(?lDXdJ1F~5>6Jd88!yIR(@xW#dfzl`*iRuc6<~XQw&f8vW+}aMU+99nTzHMPfP*HezhO zc$;wC7O100a2Z#5Id#tT`%CjnC=yrvAWqgAym(>U8Cqm!b!1t}wbli0a&{Q2CcLj( z&tt#u{LFL0?Vaoi-{_X^=o4}fn78W0?V?j1ygxA3=i#|EQoQ@yQ~3ZjEvM55sc+>W zg*8GG!DW-V6RqtzDsyX3)ZPuqJEi^fkDk48W$7FKbc;I;mQ-JUec#sOOs>M}mGYax z+*4CC8D}Rkmd8Ozto6KKj8~e*57g|k(z&UH8@BZslW7&#;HPds)HrYn$g+H5bnGa$ zuIj@*FTRF%;*@)BJ_-5aPe=u)gmynkOCnp#nacJV^6-H$+^l`uP#x|QVjaC0!K?D7 zKH)~$wT*1#wsQJiWRh%f|7`cuNPSVuTN$EZG5FrQ;|<%N?hMEMgKfTOq7&G}l^*=v zN?53Nyja@AYvIM>?|)`kWfRYcYw#n>ThqTzNd!n6uXiw!e4TQ3)(aKoPmI~iKqn>{zwij{^+Lv-bk)qR7LQ{B# z@)U+=_NbKz0-1o!m4Tkj>m=Baa?lcTiQM@h-all+!KxAC5)YbKH--a8Dn^~Bb|M`o zxzth<1@17V169amQ60d|pb6l?j5AEH35dO5*}J0ke*Sn6asFX)HsA#$l3h zvMJz?J!lFCY>xwS*Riivl2J$@*J^53K7J8rD9 z^$8m{UOyg`yldZ&+z$#)c(_G=Oo&49SQB}e#$LQW16`^s2U+=&9Je8a}eD~l6tunpP=g3WDj5S3yF9P*l zsl4|wFI|qIAp|Wdj6^n(`b`4rOM2VOuYpySEV=QeUR4DE@S($5$;;A}f)P>OisoC1Mp3)G6>ShufD5& zRT6ma&3O`Gc`^3LdY|0)&mA3NKNhe4{!jodo|xY7qN5i_z-}iG}<23qz=<@7gS;d;O;^_S1gp zgjmY7&m)f+u;Yw_f8E=fwdVTK`cLlbiIUe!|K3FQ*9MoTU-=M5Cj(I0_dhd|9!{rs zJm`8_xJl`rncu}5j85{dcw5B|{BY85pQCNrn|Lga^BrwE`NF-XTE$m2n$r~c?rSN_ zb2Ux)@G!5yC3?=aPyB&V8JDHc4HK@sGfrCW{a6@U`LJ-!^z@IhoPR&Rsh6ol8R-@R zuj8l%zvl8Zq0__2EA5xdybFImE{&I5;Jr2W!l(br%ddR8tUBVd-qLQ$JYVF<`Lo6a zGqL0EzhrUiaz5%F4YjP{bIUs%_*HY~&+vov-<|u9H%qSizgv%;IQ?PrgY^^g==%O~ zcj3^E@7?EaZ6?bMzI2&WiX*+xU%&L*wYq$|@!^lDGcRO0GG{l>WaxZGXSB^-dtLYS zdi&OkFMn=Szy8*LKK_r#`t{wUW@3>j5JIE8dA~5ERCoIFC*=pf3ojhsxc2m4>QkvJ zZFlAb=hj<}4Ilreb4Y|_Ze&X7H*v3pd*nEt@7)tEq{*x<37QMButItWYr0gVn?ANlrax( zbofz$niEay$1oU!6Ku#^3Gkv>wCT9XmN_b*u=)8O9Ri)d~Bm z6LjlQy6qa>x(%WnWMb@?leI3XL3_|ISoZPHvrjo)=2o40_X)~9U0@`S=ypfKCIJC3 z@e%B14(h;H@QCmfb32n^a<}n3PIVYU0zkI_P<|6Z^|tPBYY9f8a00gJ^rSJrF>_ok zMJer(GNwnRN6$jSfY{Uf!=0$%i8s$Bey;8b^@$#W+E_#D!>L(tsDgGtjho5Sgcx(y`Ol=wTOF%^VTFovnftddFd%|&zj8sJfY zh0E3<_B)`QsG9wn8GjV`uxrznxtePuxVU-nodf@l=+NTb{< z&YkMo3vokv8b>hWc!yEVjsCPK*{|jXezl^AFQ)qiW?d>F)$cP8&80rOD9U zVh?K5XKmXBt!7*-lM~yrKKG!;xDR!)_-2ntz3)AZN!#wCBT1gQgVqAKn$5?*rKd>( z6AS?-Nfb1RGGz?d7-}t*q>33*&=jD;d+UTYs>CKmo&rF`;v{Z5Y^-SDM^IR#t@ zhm#Yyq7r~@R8UAQ13;7DJXGr)ulWNpGkjb!VsUnS)J9kJ5zt{>aKc1kVoi7Aqp{tF z`9y)6L*xAMJ(>fvW<=wzby1^3mKqvc4~RL+ zSk^hP9iq|(9=1U2l{hAtzc}AA*~XddP#d%H>(rj=(9uKL2^reIu{F41;Q052Q?1>B zK&sJ;v~YT0s^>iQnEu*xx@e82kyq{Z$BH(L=p51OqT7-u9q-{M)*UUuuf?9u+NOfb z9pcg*^Tv)owRZWNb~R!~wq|zUm_EZbjC)$+`1YfH?1)S0?9AC_g6&_I(|Th)dmW{z zmfcN6I^&_=oQ_(c>ro9CqvI|=3SBV>XzFuL`9+hoyqPo{_2;5%dfQA!t@HJb8MIXH z^+_4(88;z4SN$O=hF@!_(-fo7{0gt&ojo_>NjG*}0c&bDSBp}*mY^a3B5l@+oACNX z^pVweqYvRvZyp~xZQ}-&bQR#`X*@GPe^AZnCEhZH-+tgRy%9!1xXMS(XjQ27#a-SwX57HB-#0YTOi8Xqd?veZ>uVwb$^uy1_NxiK#9a>f#TRC%fAya<* z^EACho}=f~e1kI$EuQIp+haQO`90^$#qMpU%YD;~w-IkNz2Q5zlCP{5^76|aR`IEfBUhPg8bV61 z8O`FZ^s$@0cXG6ia!rg{OxpgO*0T`N zv_%}|!`GpJ8MPAF=w&WRZ~8XB?h9vwo5`p6+>~s+<3Hbj+Jw<<_8j)`d|7Xnx$&|( zfd-S$u!;f;egwNZLRz^&fCxd~zv+1Yf*XG`v}{)(VJo&$g})-)P0JT(k5=@*AXJ_be3f6@T_IfU7 zJ$ZCJZSewqbDa@Fef(m*vmDXcaiJIxoIu(rHU#!v+F0yHoHRNjZU{M~1v1y771e*V zp9N#InT_U?$=C$RMX+Gip}PtU0n+s8QOLJKAk62sEd_0lrHKR%8&GPC+CQ9d9o~Q2 z_vz7IARF{W%$#!lHpRfaH=@`CD%x{8gcfvzHP!FJ-KK z`DzB=TK$p$xcrst^0%{JYuCPf*1WuH`}MmmZRaf9-|q6C^5kzXzJ7P6DXTz#cU&%; zy}b8=xudz6JbUT)zc0%5U)PIhhc<@}u5<1zO>~I)#R4I6h@mlCDH>FsTv#cUU8%*Q zJ_zZa>;Rjm`0+0SnMNS9H3$X{a+RjaGi^i{fypsns(u3S6p%|J`0(yaTk?6WMJk#C z;!D^PYfC8d1=(+cV4`psnJ&ip#86sz5Pk`>NL_zhDi26_^IVZMkf!aDv9D86K?Sg< zc5j|(OqMicBI_#U3Taf50*_2hnrLVOhoXf|m?VTA-=n_+F-`+kwhDpqN>Js;5WkBW zCtc;fM^t@_U|Y4(ox>gF05mQsc+4e@ljYsKJQ=p$wOhONwD)fIIJ(2xD=#S*Na+!7 z`-Rddn)G6D0#o++3-}>+c}!zDMg?RnB$IH!eS|6hS~j<<>;A?(|IUZ*e@4i)A|mL{ zRj26hb=r-pEKqP=a)TuzaMj?#owPui$SWr!!$ls2XUs=jj*N_t9I5w@GGKc;=pBu_ADxbw?AX)mWZBr%iYfD5(Uc6BPAmNohbHg^-L_WIs zC4As~f+p(4!xtwr3eRU=X5*Ej{iZZKP8ZY`kT~ZAJ6|IA;~m5b;$t;0#5JAYJLW}` zJaJ^aE|OPgp^~yCcej!b+1&#ZA2_c8Z?+aFg-~_rQTHQ4T)nLsfA}nb>T4|Dq zglbw74^#ixUbXkeoSsJ?yRd=7L@y`xZ9rGEqXL27>pUP1j zW&M|G7_Twa84Lb2sj6aYkEg~2{W$O(+#h;7H99J}6ti@rH7@*Af87!^bMJs^(3o!v zo6+XAvJ^aP%Q6c5ZohFNMla7KsIa%6tb*K+8*>GCJDl zeP!*!Lxdrg3KfsSUWz|+)f}O?5nA9Njq2({8&BGuLRBu3O;Hsr5{$nF0_5T^n;biZ zs&NEB333Ek1b0Cx5F$v5RW^s7H^d@r#I2(ss7Mr{2OX>>2j_N;BKP`4iV9(Ac9usK z^Vree;`wetzZ@^QQw0#Jfv&85uo6li3RX?qWG{$0GY7!JH6sA;I8u$PL&|kWLkHC5 zf#hEFDc{*%q-z=pCfqq#v|3!IMS$>EoUsRrx-Pa9)}FrfNVTpkCdgf+z>?0uCu8(X z@)~TDxg^75e;;Z-6I6>(O-|c_tNI+(1Mx|(4K5>ZRH2B_0+dTIs`Ki%c{CAX2a~WA z=9c3lwP&fzUzHBEkXx+O>W0&`LJ{)TC=i%Cj*TYPuoI^Sl}|UiE6Sca=ajOcQ6(Amb%D(ggy zzZ=wz(-(9tYn$KKRz38b2+t6KCZQ7XEJJNo#ir(g5w#~0`CX>f5FlCz= z-Y$uHw=JVrnAMyGJ{j{I75lp>&W@?dx3OGD%uyQQBiKRUjpa=BeT|5JVc@o#qVQG3-pfXRNmz`e{YU=1&C!+@!_wimP6OI}{p zA`usu9ay;}zYs8J6DFXNw^3ssv#L#s?K)o+j#Y7J7;@6)I{YM5%nMMha(hI3-)iNx zr84E}(3x-d3Oe=_wGuuK56>&|wWYj2myT_@sU>G?O9jQX5}AUg-w)M$DeB*Eu(`j{ z2NzaJC<+KW*jllImU0kGzI>Hf0Ea*HUYBCJ4`ZE`2s>y^jQoTuH%EKh)BqA<9EIyN zcd3SCGEs^|qTW>CfsVV`N@?S5&9?8S&b0?9MB1Zn*bCr_$i#NzUl!#7x`M~?J*N#H zXXeC&Rg3*fwxHUNS9>a8-bhJP z(t<-}M<$YWa8wKqKr30*O)#oe5wtW_E+#4zi@C~@@N2}FgJLTYnuIpUoDh2*C(hmBnIe^~Qd#w*lIz3md1??GQL#RNOkjf{coXd=1ov>p3IWJBE zw=W2;0#`%R=aSJxQcJ{UBdqaCk_4cDw`b59#SB5<;qL@=a6sgzQ5U7CJd}VOT}FHB zR#`ev*$3`|h-fTgX8d7C;!0t^=PE`T1uD{Ma2xSA&v89*$?tmTq_rm6%FHnzgH`|$ z_INxNNo#Nw&`Sr*-h%tT-VW)jw-icOat`W8VYY#G`-ffrED7CrRXKF=NScrOa!b3R zC3AKtDbM*>ts|~ir}e9OU^mRdx69G7t40gmkblAv%lCNQL{6XmKu?d3mEY`6KQ|5l ztgiH*Ew_=iXRIjXM61!^C3sBcV+IP#4WZzGfJ6osg+p<12tXR@JP6|p@FeCYiZ99rS(4m0J!0!MDQgX#a40&2xo%iN9VJ|nr~y_01(iedaQ!d#3y7(VL5yj zEx{U%eW6`cA;;w*UK+K!Rz`rQ#wnoESAaN8M(*(>imoVmlGmIAf};WIl8d}N<`m!; z5Arf3CEcx1il zh;*&rY_S(T%J<`6%LzF6|{oWj?jGS)?sjGdaYkruX=L8 zgIw;V%gy)S;5-|-6)qvU??!@JJGU;Q2EK@dDz>Tq=G9VV;mA39rWo*5OO*O}t0^Yh1NdY8(gei?1|V@#aA=##p$VLc@uTZIg57a&1+jWPz-Hs)+w| zOAHrYfCrFpHv~7fY+DzY0_aZpT^xz#Z74Ec162`QZlN1^kkW=3u=1&v&Z}+eIr|~+ zb*8_6z7ikSv(b5ZwWGLJ;La+COke7NltLu9lGo^#901Tva!F7J zOS``a`1PDGYJ`I(CJm4l&qE_8g}y5SR=^(Rqq}$tfzb@`jE-qI-Y%Ifz3T zZ~-`?oF&oWMIbR0CXut$8QWjN{JGMhZDbVDMG4mluNg=JAcWh2U!+8gek>^hQWV-w z#UBi&coHU1AW=#$D3c&Xp^Er|(Cv7UMF6@60Uqf=VnL#%NkYifwll8bdIQ#&G)Kf)ik(K->x8p}U7#dd&AShAZ@McOaYE)NI%Hs9pZ6HbKm@X*8 z3H4WlPCWuBLx;qp(4-|%bvXg0dZ?0Urw9ozK4dC{qHCrvUsg|l-|*T2Rh@jq0W7wE zO7AFCBGyMYCGlNpub5?`>vw+JdyW}p4*0{9cF&G6a zQJUMVq+QgCCBDWyAFT?g2_66lQD~+yP-#)15*dW0)1Qms#Z-EwbGvM+$_`%8M1cP8 z`KUQpt-@1RGhw22eiuQTXm^t##>NTN*WhdLLc}h6ZieY?1rt%A$x0^*Nwuva3S|;b zb3+aFpoh5?-Sfv%?SObqh^8jQS%ByyZR(Kjr9a#^SdyjMEgEP z5`};#;ftDUq~P}MeY0xb6RA#k``37`Qk-hLpK6Pr>K?#kk7HxG-{YbU5n*%4nshM= zz`x4WGw3FM!_PU)-^{f}OjijnSu2L3pBL|OJF)8i%3bSus-;&~pm0yni`8Ifyz~fN zYK`K*+9@eYH}M9Epy(Hci9zK6|Hn$Cl~n@$X7JUUMBUYJar$|CfBP;)eAI^+0phv0 zeyZ(0gx%E)3ttz*zSQ@M*SuFRiN6oMtqgDG#HZKcCH?Tub@=9+k>5U$Fv=#)3fHQ7 zuH_Sa#8qOI7_mQ<;%*Dve)Yk@*lbd9jgk+-hI8W0)3Q0FmHH30Cz242S z^Rj4-KpVjSQ0KLn4+Wq=GwZb*AX7|XtqTey*Q_cBr)MA-8BbNSY!N4=11;XwWtUU9 zdsYzPl#1UCdE&|>CMEf|Dh$<_oCxvnx=FIepAHJN+Y7*ttPy7MMP16(S1}|E4tP+% zXBF4+0_xHm?`S|ka0&o*&_+HP?Tme9&HY9!r+vIBy>+sL5CGk_jJqMqDw@1Cqh=En_6!Pp8*gc&% z)vK7BHY&>VDvry!*1{p6a3LEcCBP-R?X>u=BKAnmOV6$sTwJEdp`-2#BuKL_R>MA| z25+e1t`HpiP06ZdU;SZXProL8rUPP!qX0^6*Z5TDoDs8QR8a^4%cP#vheq7MJqp0d z0D#ERMdTvxQCX7qjR|ykC&+k6|K1233;S9%z}t?Ozuq4bN4VmOSBV`4s|GS4YXYfE|O;s9;A~e}4 zF%JytN}bXe7Md4(#D+%(HeL7^KyX=EUzflHLNK$NcDF;79*}HF4I^j}ymr8w>vgGXbZ78<>R z!lS2_huD{%6P4QY#1iT7(Zpj9O^rHCGo6^$lE9%ZZ4)Htb$-`utIf%WLAX1P1DX(F zBmg)GG?8bT9Ahl`F-+GRjWWW`a<_v^w{rs|0G@K?51s?eGwc0({-uBU?WzHsZ0UEG zaJd{xYDzr(v&l)}fjvDyRqH{p;e%YyGe8`L3(G-9eG*io04P5Qq5#3|PG0pb8w}?p ze;OWxYg=)8n65_)Z*e;hbysG%-;W4xi^vV|m&zXU)A0#Ot|u)YaO zw~>zm*i7}7fcqHybTZbruYW)^*Cz#pxto7n^{uEla+mi`n3*L0qj(QSu($rlRFDk3 zy{$F4^QRqB8DEHl;SAEa>nZ;NE8HI@pM7}sya7vqSP`Vmy6vAw+llaq^ykV*l-|L{ zbt(E1k{|6XJC+T*O2s*xQErQj`|$Ak`cB-3$oQ{2*Iyb;9r?0*Fx){09PF$gQp8HH zQezHho9GZq9;-53+8F2B823NYeGHQ#+mhl9nGUabbbOT+xbnW}n>ETvI;#4jm}qrMK0#yq3*D~|r89R1143V!I6XC+nK|0u1* zuH^nyNq1t=@S}2h$+Dd2v6Wxtu*dn14A-{o;buF$x~}rn(Ng#EvYZF3Q!%_wG$mJ% zlc6n{EJ{`ZS*)R|`Fp{or^AA`(c~U<>443-v1(;z&BGYbXEQkxkT98D9owg@RhUqe zR;&Ut{SYHVs<>H)NQBd$15TwH-`2f3cpgVxQgTh5AHU1&ekZD=yX(qsLczUF&Q3f;pEb1-MuCD`ilfSK46ca1b}_@Yda7pgu=& zZz_h}`4G}6HQyOx4MUFLM6iQNu9mH74v$y798jISWS~S8D`iXs!oye~b6M0Igo&Ig0atg{7nk4{EOjd4qpafn4r+cCO{ENz3CcTVvRqeVvl zEd48C);bOF?*?2VElA$*~lPT!7GurIZ|q5ikSkwn$mKloka@4)2nJclrIG zW^3IZm;~~O&bM_1c%Z)!=o%b_{@hY)NG~rO(u~N@aC}n z`rL7eGl@zHg#L{^Yq(43qO__O)yT;_rDnoMDrqxW1U1wb_mf6n0@ITasqQa;o8eP@UMmZ@?YLrwOrT`D?Uax&@C z+<86dd;I@+9NP)J_}}L< z>|`L2{~{N0|BGD29UvEp|4}XQ#Q%~O&i^GXyuE#WE=2hG2L@fZco9Xt5LDnuEkwT%{rhf;!AQ5#0q+2MN(o)O5Ok96!|6pWhokKvj-mkk4aIJ z^QactZht=gw5RvLoA?hl@u1~D-oybm(fPFJQk_5Y9)6O+TQ57ddC19jqm$%)bBh5sL$n4kE*KHbwj`#;#k+}wYp ziMjRFH?Jn&EG@r%yYzN(Vd>-QyN&JTmDS~MUsv}3y`PzV|LODl?eD9rA3uE9T>G%K zzPxncO>As@+1TFuA8%soz?<0my1l*qYCb{b@dI6P0hD%-(laqcfaL9>%+E3 zkDs(Z?RduN?CS36?du;H92y=u_;RCT;}erp(=)TLUeC?HdAqQ<^lo|OeM4AS+Q-$6 z&tJZ7GS-v6Z{`2^nX&up_Mg4C|NgxZtj}0%qHx{)Wm1Sjo0#xRSk7ZYt9rwPWFj67 z*xC1`cfTFI0@ofpWu~r?DCnmKCbr^$l#ob1_kN0=oARZOF zMGn6*O4Z2D?%Rv7C&|=1TzlTr;)r&3b4J`Uhb4~AoH%pjhjEMD*cdTzUt~%$RRves za;{tY-dug4vn%qYco(#NMP~70B)s;~ighzcR3psTdXjX)PGCgwc ztepTt7Cz?`eXGs*r%o!&9su1S(yk22Znj;Z9d6=3e&YB*r|~lbi6ngtF38*c1wxV1 z$T_$Dp=tW;;TGtp$72j(`t-5-BhC{g2-BUq$Ld=IPVLU4!N_YNrtFADB8`}R?Nql^ zRk8m8g?Zr2h zM0%^I%ujswf~@v{mf68(=vXZ`&>(_!52=L>rm9rsGcR!erYYVR_JZIaQMia@bqU$sbg z_u+!vW;UkjQ|LW~W`~Y^%Zg%!5L{9wJSH;@^aUXVQfY%p*48Pdrqc5fpSo{VwDc;t}$7eNL?HTfi(v2~%g3l2H$8#?J>SgN3su#okn#DisO&Kf20c-WP?Lktvx5dH19{zSsY=-&WB>2Xs`5L%UGn~N$V;T zmjuIFI`bhc(qGQUC&LN`^C!bdwcztX`}2AO^@xJvKh@a8b9_ zDCfm>v%A8q+ja2d_)PpUZvK|y%_2$m#salDBoy2-; zt&embf;0f?KleU zRruZ=h6js_=H2?noZBAf?s~*WP>h=Lf7Ke2;~01PHggnk5tLdHf3Rxa=ycLmq)uAJ zavG9do8`0s$*O><1c9O;ebH~zgdQP5o4>E&ze7sQcOy{6Hjwl3ozy4d)h!|oaG4D< ztaLn=pPL)5ANnMD_-fSy&FIhaxe^}4k!h)2!BY8EEG%x-vC8hAiNY?x^VBT$&a7#* zdfJ6#HOHTaha!kEVq2b(>QJOu_9b}*Bd$Yh_fWC*;K)CuiBeDj?Dy1HY+I@W=*kX< z>o$!KZp{SGP+`BOF7IF8xklcY_JPtkfm&5Od@D-6Pg4WF8We}!xr!ceRBd0w5;@dA z0wB0ZJpet4qM_PlxrNrcC78HGo?tAL^S&FQ#9rj}B=e9cG|3PgME-&olzX=e>dgk} z1$T1I$0hJJqG*DXRJafvFU>cSz>^Em5MttGY}r(3J&;?%5O~DX9r5i;S9f0h1p{2W zn?+5&_}F_bN2hrhI^YH0kNR%N?}MbYa2EfWFBB;Xn@1;C?&(<>OrChL8j0d@rlce)Y8*z(9t9coNti| z_TQIEa}=5piMriW@u2hktKY9GgxpRcVivvsIdk}o*_~X$0EpptAh$9Tk0Ef91aM1J zR?#MiMotoMGhj-YjTd^$rX6ahAQcC`9vscB7|?Ni7Ht&X*}ot-Pw6vb!|w=t><8XW zGKj?K#EU?x%{PT!7qhSEH-7eP_5Z^cOG?0@feg$+)KLW=P>hucEL#2zP~QCJYRlR* z2*!d*Q6^A*3K;8%=hfeg#)NR*plTL*N%dXA-jpxAnN*mB3Q(*H0M#R(8Bt|N%2;x~ zOXZyD?qFW9VXB?{VbR6=l-Y_iKf#Sc62P{ouOyzU6K}>bXv0|mD!iR`tec?%S&f{4Z~XFUxn?^71RT$=V?aU((oru;0EQ$K>SY zbw6Lc%#Y`iT(dz(%(lrrUhkMws|P;80%gr#!r!{+-M{5}i<|H0(Vt^CKC_e|WS3An zq4_7O=gyTMrk#5(S`U-28F*}qps9Im?>`Bor?U4dn1+R3lJ)VB^^&FEK9dU)lU{$6 zF^$~YJNUm0&h;dmL=%*fjRmKN#H~ldn|kBpMrBSc#%G6sTlFx>TIRW0@gpJea|DC% ze1t$0w=6TR8B5tug4ej%C4|HYV`Fm2K=DHO7R-HVM~{S7Zd%-@HE7Xz+PIYhDB$((N&Pu4~B;3Nr;%DKwSr}X; zG4ecusFF~@qVx1pcXy!SSKae*X2;gxE~C(>S%f@`lBRW#TalQdMGvSydxHbY<|M-3 zC(bVd&J*H3%)q&4z3*tneLRn#saz}}GqWhn$|*Rf2ART)&)B3sSY#yo@%R{mTmaq$ zyWGWaM5!w;s|67{>FntXuNZ(IDnvwK?ftF*HV7%VC{*$+?B*`_)rU!xC|VYUn!OoU zw3+fvnJ;|BOlK6v_JQ9whi5b8lX0h__2B#=`*8T8>71cic%ftdXlgFRKyM3k@aH}g zg&bzWf2^e>4e%}+!Wl&K1TC&`U9P{C<};D}3O87;ugg6djsdz{)DqNvH_PxJ^o9EvC(qjD1L{GXXAq z7UmrgRZSI;P9WUp73__xadPb~bP$LN8QS8jpd zyk69UL~_Eff`maBj&;tLeeN=9-#1OwD|PV9$I-$T;UbvX1-b?DSf}zVE5`m8g{8_< zp_+YsBJc10Bj?!i8DwbVQJzS*0F6G_E(a_&3d3zer51sg^+Q}9LIqJEU_b2KBB0g9 zr}HXMFcWg1C8%oo5oY}0&ORa}nBgc;ZIercPcqQG>q@?gE<24&>RBlx$d zL$cA_cii%mTLXwFu*4?FxBt?bSwzO_r4M~&eAr9DeK12Z*pLFAFS-PL2)u#tgeYI| zpnwH&5Jgr1ArU-y6ObESl%9<2(YyWvke5H;x=ajE%!I^+z=(k`kxee(YoLB6#3>Va z6$eqpMM!X9Qk(miNNiB77SI?6aS8#3jfQ}R$`%@`rLbNt3frF=EhM6#{tef8&{6&q()?&O~*fgoFT5_Y%Z!K6P z>x_{f9EXa!KOME_C#;$Y7w5Vlv3PAM?}9!GOsn*AD|UFvRwDZ}6g=h;t8_B4$W37T zII-b;z3|Sy%J(emOG#3#F-h!4H4hA-XCLEV z7w_|WaNjE5yd{pgJ%ej_h|3H1y)8n&T}2_^#|E4oySie8_`;3fe9e~>(H!rUC!BQ$ z(sE}Kpt94*4SI3{a*Xe9&>ffuU8#jV9wPgSF2P@dK&T#wWQc?A4-YXP=yuG#(#(60SqZ3LW;*K` zduwKfMLFtoa7j|Za~G|4#oW$M@GMI>g}Y(*eJ&Hn)ozJ+3`5$CHRB{&UQqH=upr=) zspg^?AQkS7Ii(GF@Qh%g0^_pgz#`d=vFyUIOqK_ZoF$g48VRuDz^KEpX!d^L+G^o1 z)61*b9Pe(3&vFDFhTy ztElY~d<1aeg0r6(05bFlbn+(`5B7pcW*KXpkHCZM7Ib_v3o~0Z)gL^*;wt~HaGqi0XYB%O%CAx5fMrKvq4`&oDMHF9fG=B#s0FkO z0TDT1M$qLWsIIt7kUlB&(GG{d`_=~!_{U>B2Hx4}n~x?#!tTxOgJXu9^xQ%JtV+bJ zAx1GEyG7trD=z)SP$3HVv^#X-N%ia?xYj7>gwbi;2v9W_REQlOPzf+}0^knn*K8=i zB*+}uNk%~nm5@o*x78#Gul!+=T3mka7ZNF8ey#`ymtYTomk|l(wNqpL;m}539cmir zQUE+?nlm!%JqI9Dj4m7|L2;X9@vkw;Y#(Q%+TmodOBRs$u&>-$CynJ0#%@^Kd~lxx za}45T{20XMp)bwDu96sSn_SO=cv)RTVy5@TS&X*5Q;&m@&*q1%BD6czM_xSC0akYP zN#0HGRcW8E9YzxIVCPKiuvrUYNb>pBqa$J_?uM@Wxv#BxdN+!nBhgF9k@*oV%@xh? z{O2EH?LUs_f89eatMmMjL=KKfv>U%%@k}spfW1qW8no8jLn3!1AEdBgF>I(?Ce)qs z=mra#%08F8Zt}x@l&kDTY$jAI6MS?O^wmH2Pv1EYoP#s_S!_s~>W)wxPh~7iDUJ-b z%7T?#eZC(CIFUM*KH3#uJ$70Pa&{4Fx(N|gtq{X;o!zURRD&IT2=Wa96dS{dq>j8; zkQBR95F2!~4mpi{X{?Q7^;;x7)v)hI^R6nH^_&xNbr&j&ix-CKE$||JLiv zesb|;hB)Es!&=WZSV9(xK(`5y!)&M!sn*^PtoM0J`5ikk4({^?p_RpFwS`*_ZT_+N z;>R5P+9($RRd0-HOC&)<6YC8lK+PON%y zuO^{<%L?BIbu^#ufFD>EjNhgglUfe+ZSnl}FCOU9odmkEE8tokpWvonT#A;ngGy*nV z$}K{y-@X1B_`Lict1p$je@n(4VP90Pwu^Xo3I4vEk{t4d&ie8`Fe8%*&zM){jIL>Tk&gZeZ}vaC*R%r`dhbr_3q(6cSq^v{5n5S=vN8HX`4`rz}{th zZVKr6e5kwYyX{qtz4hbpttI}@A1B;ues69b%idh_r1HCt9j?Zmpibyde_h=FrdcGR zDDsy$DZ@wef}X=0Ny~Q6E(7ZasPs>P5 z&-}j%wmD%3W$o&k{4m4XhODIQ)LS zdA@&8v3)u=F+MpCSN@NWslV6a z7HP3%-DYeS-X1Kwb48=CPtgzt?Eq`)d`vpI3g>5EbJ3~V>xS?kQSB=SQ)ri zJ6xdUGvw%GpCx(hs_?sJgsNqkY3y}rqesvbmXQ+#jc&~3SE!y6_kVZve&bY=>;0fO zVnhH2Yr7yR2ZnOX=n>!6FKr1Tvv@svvX|tOG%&EMp8$69%%%K8v8*1$yCK~Y+7WLz z+23#S$%MwP4rNu(h6>#$g_Lsov|di$Vwt2$+r0L2F^RRTfj6!7aH%NjJHA3y)Ax&c z^d%L9YHClXVTh9Lk2XQ(3k+fuvV-ltgm~_2JlRJzv1JPSVm3LI^29WhI|hCts}k}d zr^2e~+{=#R43)#{Sjxn2eA6lpBJ`OjNAsE|L>*fyN z7kG}t|(jSWS`=)re8JziZ5#bfwzcd5dL!FG75!J~jgVI;cJO+Ym_#1(EBh3dUv zba2}Rgi%gSHahpP9& zrJG&noU9?eB2KwDh>UU6A_irym`8+pOnOaAbbPtF_MlpQGzlE1z_}>%TKL;7EDS@y zwY^Cx0VwdLJ;7-vLQpEL+nRDc*UqZYpvXA#SUt9go7R7Wu_>X|d2vw|!pV|usWWF0 zM{=zw!GS$_O}5(EcdsOByv{oH6E*> zfKJBVlaQMiwFp}2ar3im{Ix#E{vKU}&x37Eu}%DaG{AlgQ^O;~>c=r#ABj!*g4Ni8 z(Tu&h%X}EcH$Pt64v+ktd!{SCU2A+ect`Bm*SWQ8cpkZ{&k3cSUrmC#FYYcemH(Lw zA02*Ye)H(VER&li@irlgaU4_#-;GQEA8+^h)MVS}{XV_XLhqQ+n;MV~N~qEay@`fi z1dVjCC4q#{B=oM4-o$`ZMGQqmM2(6Hh+e^pVu^}^s25MXuY28Vt!HM>ez9kE{s3O( zoFT{gIey;@n{QaTyDsm^c!|kDA1V7X#cLY+xV6UaqQal{K0fmE!|US?$~|$wLU+je)5apF5&O*%juuE%5=oQx>7PO^yZB> z#ngj7&xSsoT1{W}+W+fFY^e-Er9>e=dd6hH=QNY_3>pLZOcAJfi0?cz!a8fNMK3r6TMV8p&7{Nyc*FF$7h)yoh z&pZ!)Iqn{k#ib~BlMw;6cwr)qA-urBV+kG&^IU;^z-yl%bJ9^p)5cpaIK5%KM6A<{ z!ZSXTp;RQPf(II{hl%DcaG-X)9RR_gU8gFOa*)Zmp@e{IXrITFmIC#7BkxRT2iwm)L{9iZRq<6K2d# z)jBcy@q!Jxu(%w?xc(YW^~SHeRX0}J+=|k#cFt2+FC&&H!bx%mKa@-CZs;Hs&v(P-L)=-r&QI~dOoR1s$AI&?UzNBJ`;#`HfG4?_Et_2q_I{nQp*iBV zO@1$LPQ+6K1F(^RU5+zr;$JKd2e$+lXAx5`%9{h=kX~xZJ!wfj%NstxTY--AFW{&5 zZZ8*bCFjlECn8Wf?jwj}k8Q~VVtPWHSr5&EJ2K%>MeaKT@DJu)`5saiY4!q@F$(3_85f4oWS<^+kB*&cB7o8#YE10K6J?O00Kjf zpGw{2-MDYKSRMTRy82*(SLNWobpwLo$ATUU-{xLtQ?loM0wm26~6sj zy>d=)c*|R`jr1pVft562X99sWO4(qQ`l(xD^|x%_VO|Y$@`XPMk3;(cXuGUobnS})1VILc~h{y zb@yR4ct;@~D2fQNE;~R`CX@4}^*h9B?Q>k-MAGc}EC|uS%i9D^TS{0rAGdj^CE0KR2hkJx7gwmxI=z~u$(vC*n*7EA@_@t@HxVfVj#1? z`^aaRAmu`Y+nD&C9--1tg|TMR*2Q$xJ`6%VmLv81?;*bvFNt>FDJFn?|1OiI+#?$% zFlX!}3SpCzuQEMnu<2ZN??l`MS%(6@1>1^eTv7PsHJWu_tfA4SuxR z>~$qIZ2}Foh0l(c8WY=pBj;MhK8uoNDN6pPPK?9@Ii=J32H3@p2c}=rb5p`l-0F!H zk)&)F{j;Cjhn(K*PtKY2ZWP+&Ob3@$Z!J~PIS_-bRS_?`$F}f6aUZLxPnN(eZp1J; zH)ed7=&`IPmOB(3Qchx-?4KhhOXx5>>HBhIs7n2)*-1W3J%6H1< zD^gc07WQdmT|~S;ZVPrI`xRYIjRPnUCZXyoil zGL6d5sUTAPV+D^0GQue*mrbnzfGlE95wy2yBgxboKE6?Mr~{j{P9kM}<0KW6qvk{b zwbN-hkeVDLXc*yy%XNK89|Gr2+tG5#j5+{_fyg_F2hs3(^~CH#G~I2LQiEgE4|>* zpPWoau7Zj?_&Ynmdt~0CS6`@oj(~qo4&S9|N8`Y?jHG;DB3A8!zM_5HMv@(Ff|V|1 zRuJIr#7r|s)bAOUPy+2XPHj8}!O2jN&O;j4AeZ_=EaSxGoOf7|L7O%NDn?E%0P1U! zK8lA>)@7SY;e1~x9uG)J2T2-e)vwD%_`)GfO*33l8dJ}^)!T;-cDB)Nb(D$cLlg%BME@*W~ttq0w4Yk z3w|xvFJAL(MM`k66~c$2SXH{U)pKF4_Cys+jBZI%;V6;4&O7#^p_{-=D$6mjU;Zc)Xo&_LY6koz4@R+|HEE!Dwn0(mHgKG(tDFS1 zWCJ1zpm&vee%!jp;vQo`F|z7_1UOU=4PEd}&Lcp4=QWP|(esn(W&B#D`H z`-&QZV9Xq1(1A1}f$L_4xlNS?W5RSFU z;ox)lFhB3qLl~PR7ObsNSGZj2C{gNWNqFr&rCsxK#RkBV759@YSUd@JwZws!DyKPR z062fd*1UN=^IXr@4i*Z@5CCS~&d+_w?U7DAZQl>CeX3rWbWS?N3;Ou8O)d%as1K0} z(7H|Rs3vzzsO|kiExd>C41d+*9d8Lbj)W*$9iM1^4cZRQNJZ$W1*|FfcN1B{LZzZz zwJ!!@%2++rq_VcH-V1Vl&)-EMgBlXw-g~JF?JQ78?q^sAWDrC4ZjTAqQ-gZ*> zaQRX&#nY*--{nfb+mn8epZ&Hj&1`K7tHemZd0GUj02(B7Y+qm?OvUHkAh;^yBajw|+Gix_-B z9zK2CjQ^-lJwze@R{o^6MUftgZs~XG%J5m-$oa_;@XviEKZVb)(Ip?a=Dip}yP^Va znKV5SzMx2x^noA8XJT8CVr$mN3q(>0A$6n?!0fhhNDKn;#Q5S*q3a=J$xHA=l0~Z> z>^Qkr#jbp83jE@GxW}<{T&j{t*ijm;LM^&{7frz;`s(iMSDD0pSJsBlv)FXUU9W6A zyRN9*s6&12I_1`j_9TEEaFDH^)_5kU3#b^vbReGxpCkYsKBuJ;>KzRLex{E54LkzF z75i-+boiiDHc%8T_iGlOZ2)}nTI!xb($z(!;9H2uaob$xSY;Q{SrxI|2pD7)!kGwz zgkF-*wc6w2Ep^Z!E-ai0_2gS?$$|}dKpbRe!5~yVrallN>nyy>gssT)hspw=R!m@e zqntc9%7hP<Nn#@P3@ujk0g@|6`N!D8t^ zEf(Mqkw7vORBRNE#?-H;q#tgUe>OgKW3hTXA<9Tob=g1u2yCE`nHD8}CGAAVC96HJ z+-^Zj(2=dsV3Kzh+S#7iP37RNZD8l7cWfMh&s!qScjzt!%ltABbN!s=!k5%)kyF~k ziTKhO`q<5P{lZy{sGC|5{Dl?!P2rt874UcUdtXmF9=5yJ#1WD$x;JNhALj+HP(*Dy z+_y})zngMjU->~Z`Evf(S;LbL>hKTRLhhM8eQ@mkeSL8WLCMiR6j3N%+gd&Ea&_MI zq=CmyQ8y8o=ZAT(y$@w29|kr&48Hm>P`S3~*ie?@qwu|tB10cVpL`VC@F@Q3qlBlA zj(ixP{8t7n^M43QTiZW8(%s$bPxR}*gk(f`3d}tr=?}4WoBj7 zl?iO*iGSJ1KQQt_Bb}Zn$am%cE8JCBQU7lndGpFYF!Fzp$P4vNEe+kB0vLJr(uF_0 zuEyr(D`WpOy8ft0L7GbdBd<(#O>-`EwEU@a2~=cfhoH_SfRTf}J;Otn1vc`EAj&1+ zk$0BwguwZr}P(l&lG z_!ckgtRTN@k_x}Ozhu!&*FwjYfUP)$=$&gS^)GZ1jo;-$-XDVn?2eL1%0p<+hVKz+ zc;DF6>Tzy=jE%HKdx4j&jG?GE89)BW)>$!A1A>nM!2{sH833j`+eT^o#vLjq%tf`3 zQF?ao%RPGTj-vX_(rX(rGwl~evr`*02oY0*&t7NhCr2;ZqNXMMI{mwv*akOk4QDSk zzkQ(5mPWOm;f$;8my=eJQt(;0NFSRYvyd~~^|0_r+tz|&AL$PLtfubYrkQGaIa1oN zGa(;eMm>=1D1YxniGy>$;x?`(e0M?3n*(uiiXR(y?Yq`pT~ofVPAY6?$`9&kwF_({ zgmWJlpu~5OMW!6XLsnkhgJvKlo|Dllz4k$>q55omc8(IyUN%73snX>|s3{`1HMW_9 z@H6ujY?eusf&idWgug5(r<@F`dNtmVnQ0v8llQVBX+`yIN78|94V`B0L@78mjm)I`4vNL98>`Xhd==id*4H-0wXx{B@7kLy>hmgu8TdbyVl+RD1Pn2@axXCp3(2`)-G~jdhgj&GKb&y&S-YM@0&AOdw+>5 zk)pltH}tXXKpAIf4zYX&{b8udqYKe`A){`;IPdimlqvM|$7%tcS%(-+{!)=I^t$!% z+A;6iEN_%80{E(}l~?c)^WzltLiU5%u8S6r!lZq#JZv43+Ez8b_p^1_PbAenalp7^ z@-m(MlYg@-1sJ2M-n+j-clZ4e)X?$##l-gi>@JRErB5#L-IO}49O)+C^K*I- zy9w*ZVT*vvJhxkF_rLCTmM#9#?@OB=bA_3(q*Ugl z@E8C6iOm@BvLsExCCYI>t3>>SZ!UB-%J3ATZyRB%?X39P5v;`qidmp-ouhdWD>EC> z0G5rc+XI?Ry*I*$ldV+GbX71Ti+B^kyT#r@lz9{pTU;wbpH#c+7po$odR&%If-1AZ zA~WRdgkBmryV{>G-3Dl>O?5aXu?y53e(vA;!l#Irzht(3<_K$ZLCVz_utn^+uo)&t z#%Tp$%i`$Vz*7|aF-VnI8=+VxMOw)SywpU2DrG^%s);Z?GzIZxgz~^1-x%s-E2Pb( z74IUSPnh8dR|iRiHSdvnIwx(u5qqYwi01T@OCDW71FeYXp^||VyFKLG-3(Sa9xSI4 zjGkqk2a3t##-;ffkp3@nr^PnOR@qzd#*)i|>d9rB(71x#bU%1dgAJsf3$h{s#Pq7i zL8o{WuR&iq8D3!jT?%q&v1aM{!Yzwdv)g315G3Swi zY{8Ky(NmehV3!nBS39nn0ZJA zB~18bVt$1L;+azHx?KhUtk6U76un$pJ8xtY3h@U&9+_Ok^v-2flJ7%!T-t||T?K1EJ(kA?#rMxl(IeSb{0lARxLpwQ0Yv$R{F z6B%pp+@?D4u-+Ym_)5PQClB;Vn8MWd9(23zFGrEyKQ>*gBOZy(&7LV524GR``RZbg zH+nbO2GLe|nwIjOQ2s@&_Ii}w8{n-<(uu~oIp#TxQgopmK) zBOegR;O|RSLgLSzgtOvPxxJ0Dw^s#kv7|z^Il!sWJbb_pxl^qMd16-?FEtyvOrFt# zg2>2`6f9Vt)vu`^`Z_o=OZ;M*eUa+{WN`6U$;Q9G7+(g!tRkLgwDZ1V@gn)=J5(PP zRj2ldZ-=cpFnvJvK?omzA&= z`>L)Se>47k$sZz|g&DOqVu>TKJRKpQ{Orm=KjQ4SC~BrY`TL9@}ARFP1@Ew_zxWyB9-{Im7fb0gWQJ_PXbPi=M&G zhOM>5+4*Fz<`_gG6%7LH6%QFCHz+=TdWPGik@Sqw;0i|WwTARN-$C4YWpg`c=E|hd zz2xn2YgJL3VI?id53rP==aLji5%qA+?wZ9y1EfKUrEF?Pr9DcsI%?l%GTkR_r8Y5< z0$yUy`IiP%bxsK`Sz@3U^d7c9XxOE|li4ix${?<5lS`q_^Wdni6t{NpkSZcg26BvpIIs-Jnq}X2rD9=9vaP9_((JLWDjreRhAEf1M6!!?qLYF{|3cyT%226jJUpn^_=tRnS0pKB+Ry7?S92j zV;E2yw2@25;Deu4x$8?G%wSPRrhJ8XL1X)kC*g-D&@@6an4ap^9tKi#0PkUf`ciyX z18jyJyg?B_3mjO;5v+-U$Y4Mio@dK9asU9NAr9>GlZfR3z4>5KJ{W_6NV1`=Hb8d@ zRGv!?#Q~kk0O^NPU%?`TX?wwqk5`V!pj`N!fmAnx&;x-IJ6SFfWazq)YiB=HhnEdt zz|D#7GMez_1?ax&z?=O*6%usyTV4hiwrKzhZ2>2%qt-fVRT}9 zFA={<6mJdp-~lg}Q)?>ORVL;|QmjtdnSAi8VPa&|aR&sr?Am zDzg;kQB{Pn0uG$bgSFcLJ-CF&rNEtRI%yH)!C{E=ve#sTLuNvxaNs^?U;ryfhzAkJ z!CQL)A{o$8BcM02{(TiNfbWIG*E2IqyKyxG%#?nglOFK$OxB4^jD>3YzDy2e*3_&z zQ&{6X(4ABpoK97HSSjr1i@}4P`P80ye=KM$r0<$V?O~R!`Dd;gll6Y|0H+7G2a(FxV$_Ch(R2jSgA_Dxy zS>T2$pg9}(j0RWaZ~Im|`Sz!>lA}OL>=19VXW~Pa(@M#8@cCXq2E+h<|7NpduteR0 z|4mENSaDpZnY&5Pa(YWZ+OJEWc zoIrwV0$^Aw9OwhL#rTJ!n|)dc2}F5{N1n))xh`;JYeBbt&PRbp$U(aWGL9cz0I*(N%~Lo3N8x zB9EpB-ayU=b|m7!p6y5!sKVmMPUR;MOo+t1Tzf}9p>xq+hm)BhXwlH%njC@-I&2i; z7i*cdTH>M!2vxyg0@wi6hcHz(@DRsmQ?_n<(Z5dv?iq5y`zNx&$UqddZR0en7nloo z##Dz?0gv8I(e-#Rh=>Mac!10qn2nI8B3Iq2!dsOI5HiUbjIW;XJr}|Dk4G9= z695`vfIt9fK34Et0F#G(Lo0x7q~W5a;bydR0j@TiHOeEWx^ErG&Zp((xUHtTc+xJm z84-kBv#d!@fkdLv&s2?L(9ZI!GL;3_;@w^Say)7H8|C1poF-cgv?vng(}jeyvJ`~O zrk|kZ&&z*3hB(!GZI+poM6j0DvmZ6H9m0<`V7dy{Fn?VizJ}j*QXF*3Mni@@UQ!O4 zQ50of?w#RYYawVVzmXl*P^SaNRe$YNw?a9W1Qqb1F!Z*TviUA>N}Jf?gw~G|GZulo(pJIb?9SB(qk~aAXuD{cF16T-Fg8Lgv_%i?0V#42{?5Xo77$M& z)Q$*EelRDB03DJA>M#NAErhOAxANS0MJT98{z@zcq>Q@RjRu>Bi3l33@*7-A8{*KS z`99eU+c;tEX2VbdEDg}z^D>)n1Y7TN^}x9#^D9*VM!I(OSljwg-T`N}$A!_so^GZ; zGEp85)&_tz!fH|i5MqzP=bcYZlHqA21BSeBa%YTZ5TLFaSJ`+ zE~5SBhiKZPhyT}k8>51AWUr~w1rgWtrlCBEOU;IwEBlzQ4ds$-M3WxWkRR(lKxG$A z#gcnd^S6<6T}Z;X1i46~jjb+Irakky^W@H{L_WAUanWvNVTh#k(+d%ZmMQrCc#klw z&b?GlLZP(bLKSoA+03EKoHJFwRX+4e47f`wHXz#&Pa=I6N0b*7zRP>s!QHZ!k2Wk< zY%Q8LEt1~g*h*^#|}HQQE_9C9~`6av}67-ul~my-}K zXQB?iYU8R~2HerI4Em_Q1_24C!cuvs_HYOxe6S7+-|k)eM4li6HQo-l0dDeUYO zfca*Sb%nc3rHk+@Ktbfo{bxn0$}HaSVD2urGkHF35YL`ig#b)LRZJIu9=dt^;k`bG z8{^7DpS5+!0Ns+|$>-2uCftq%#j+u;Bn2A|$QTXJe6gxwusTbIA0dY7+u%?eVNcfyJHB~afAcMFbBli~eBj%f&$!yviy{(sl11Ycv_Lcw}yTOtK*FoC$pv)L_#0Z>--^Azw z9=`U=1#Zm^#IkKH@J(NZ1ZO&-9vJ9=2E^K8hYT91%HBAm=d^_MJQJOLzr2s^KXmN-ITn7FnB-5y~ z16_|>f+zEpT?e}tT@Kyp481jY;mHswMB3T4^2qX)w#&Syw}vkMb&YIp;C$>YP;(+v zY4t*m#si950oe7d+X&*-EvQ<7H}U4U2A}}|nRL6nzBHXls7v#E)3tUmbw-6%uH~=| z@)-(PdzR>L{OPYQm2@QFGO1-5kYs(QX~g@p>j=g5oX5%Xp2rK94nICM;Cj>h_MRU- z9%G|FzFL|GB(cfJtquN*TjxBljs5<)`E_k0&h&1T`EO`-9=QR{ctoy}i_N3{Rvso& z0h-z?)Kpxci<8`J?~Vh6gw>T?&In%!NIV|r8fC5vgow-*~mT|y07oqZj3YRNn&I_4H*_fAC?7Vqz zX(y4B120dM>c~4DKloNtN6QT`RkJgX34|u}C z&X5E%EEN%|PldyEFl7`;46g(vqSBlLRTJ+9Oz+fO1t1j}%`C8>4tO4Ksp8I=mcEi^ zKsVk~Bn}kGO{*yD>K$A=;-3L95VSmEZ7E8;R!lB>CIcg;?h#247P;Pd%%L}Q4o|UD z{Y7vS(&@)gm7EE&xuk&q*-JBjt#e-5h-v zVT8=)O(0xy20Hc0nq)_N0);6`SjMWChOz2h(=^>GS3ac-M8j`J`ZryEG>ZyghA zfl0FAekL@-Td{3V%M_EiVU3E~Cxg?L7Z-;$BrsNX;D-?~cfQ-l2xyl67p1 z2UlFK{llhj%wSQNo95A&5#EyvLQ=?hawDapdg8Mo#pY4eHdFHXEj##E00myl&pFFf z(X`FT7yoWYtssVJSm00!hG17$=<1+m=zw>%5`*2VV|jBQDu{7@?PyEp@MR3kz6^H z5EBHr_10dyqzMT%W0}>fM}`C^IZ4#SMjy1v{#omdxOe`1l1tpAbg-X-d}~i`6^kVs zu{yHt@I|^r-V?vxzTXcCj|} z!=RfJFI#qTUfP@7TRuu&%mczAnN=immPzm3fc1M4_l{{2&)DZm%;b4UE#hI92SM=+ zOz1RPO3j;0mkHzqL-BSfW?F%?{X2L<`@A%$wL|8>1=$GhJW9}m7VhT>IRju0h2j*G zZoIdxTsD;bD#zEW%o*YpdFTw^F-U5+^lfzq>k3^0j~9mO50=o!t~7=gVUb?}G}o4(m^+OtM92le z7zQvX%Qa%B4uha9$GtPETJHXB+jUf(50Y?~_PlHe9FRL^9O;H3X0SOTrLX)&ov1Kz zQYqq>Z!yDt4*8sgpU$Gtk2~j!s}7Hgr0^L<8d#`itevS17b;ui1`l(}57&sm-&Ds# zm?91-RkgD-m!V=YGoaewFG5!L$gEzGxNnFXVt4S%b(Z+EY+ zN3&r^9iTUL#ZYy~{fw%VsL$@e=I6Txa;~#8B~*Iw*)lvs%|(`t>FIajE&8T7#rLie z4Qlza9h#Tb#$5BZR{^<9&am32fPUtAt-QQ8!nlb-cMN zE*N>KqSpgF%n{WSEP(8W)*7wTR!ydj- zcg%+}zb9LdY9eUeaktm%d0US;`)YcQyC?MZ=ZLCG+{>fhPVg7IvcRRwIxOL(n1x@B zx8qFQTk{(f_q0e~Ihfpk<7shaKgIr#wryUxqh!LFac8v}u!0%UUpvZvVyIn7!R$Wm zQ3gQBE6LQ{{L6N4$lUl}m&xf>!+T4M?2&)bzJApMDaao`0J{D1j+xe+yQ+wkkl6e0 z*I}A$sJJ~qX#HW;X<0JV{j&=s-~k25;q|N395G{9gqaOo zbePgQ6Rod9a8}+)ny|7bf@lpDgZx~<^SEZ9bEBBi zO5G3}@AAvxLPs{oGoK$lW#pH;Yuy#{xEHXS?~n~G41*@|KN&+Fx$8=+L2)QPVnW@f9gCr(U1_!eMBqwrqCjycWVc?p)-E+7=Tbu+O7h!>c ztiFOc^MErr*hi9oz$+~aB5)55Ud-|-YCPS+IlV2L)68)Zwvm!B@bhg-%;1M)R7h=? zN)bwd(Grq1bmefZoIp9L8{g4>41&ul#OaunJ7xE98Z9V;-p9&`mrICU@S=P7(n+z0 zF9>ec2IjV-b2GG~(uQ-#Dsu&KF|r(kYR1S3WY9AhjA};yFr#pRab}ajl*=nM%j+_6 zJ&}=zvdOC*&Z}R@JG+_38jk;u@<<2hBLE0MEJ#?egJo*DZ=cOS);Bm3r{ zU=xdWru-lMk$2~EK|xW$fAmLZ^Z(W#4Ry`k4c&h>u>|g;sj<1G@vOjo{2P5-yYgQn zSpEOaJ^C*G!#zf)uK(d4vonGztjX~)0rZ%>Etp%nG<8=1J?{J&!TM(b>&c_J>;Ia+ zn!WL#1+4$D4#5J}gI`}39xpE5p8F#^79ahQ9nW7pUHkUef8mao&;KnuUcLYN&-T@y z$*bpoaL4~zz54v=>k98bzT^9c4}XZq`uhKq@AwCL2$V-U^?xgmGpQy2A9k?1E^6af6#xI05&yH8E?}99TS$~iU%VjajNxM7^K6f8u*@-4NCf1tXxu!EyM|dvc)qr z-E9n!SFhwfXl+JXg|X3N{figEp}OIjZ1i0lE%8+VTJ4jdN#hsG>D&;N9oW=f zs&N}hx_-HVrLX!tHUc|w+MNC+VPnyHtmx`u_yG%_)k!+S#J)%yUq%No`B(4RMO#v1 zg@W``?4qp!L|?fyhu0DS3naSm1op-A0xV*1VhjxUs*L=gQgWo>_Rk52=D6eGCy~ZM z<$2F`=yv_>adNX`4|eW2-sK7;NQr2ZK_zQdLhR7Pl^Cs^6Ays0;${fS22x^KS>mk3 zQ;gnnuaBy{XsP!hi;CDC%8OSkE3gPi``ySFC8oENik@O)$+;)NT=-hK}^k2%O)46-_kMg+ueD;s>aP7D_ z@ke>AH-|0$TX{I@edwR}Km1`}A-e0s;Bwm9hanza@8j^x%EKQ=UPu(Yzx;l%tMKy2 zX}wRQBOKRHS2tgGeH#1qeeKgV09>EXfygG{cAL)d-i`~KzQ^sky;t90m#Nv$*6q+J z%_M`GTg={x8_FK~f?CWcg_2A!$~a9q%3N1sH&)T$%iP6Z+4D_u@UIh+T5E$YGvdY6 zJ-3at&{JIOz-XMt0pS&uV>E*J5gnOQey8Hk(~(%kA&2AQFR`MTf0}q z_s7nn77yNd+PUzJ?1p;kd+Wl+vsRMkth1i6t=eBXvS;S36`v9(oHP_aZvIgoKVFsx z9QpC8I;Q8x>-zMMKmOdR+FEU{ImE`me$sQ}4*LdmMkz&ONuKiY1<6K8iy!jNH9 z&4bQ1x+&e~z~rCVz&|P43FSKB4t(GWNAR)YA+N4!oK+RkNl|V2u611(B#iJEOlN;_ zw9=0jCuW2+$X;`rK3?RNpTf55)Vwt9d!a=1h_AHL3#S{tE#iL1nzL2jqI384%({lu z2g_3S?>A{i2?seu;iSZolGB*u1U~DJk1H0p)=`N@_Bfi_G|PYH~aKk3F0eGuzH5` z%uO~KmBs`s>4I}*7O+B&Z-ElE=vf#oPKp(qP} zh2@SBQ8w&s$4pYc7G%6~NPpT~-{$ULA0CMA%b18vs=g;1OE#Uq2}*S$=g2v&0QYhM z;7e!_?WtgoK7*nh%qPzllB4z_Y{XPZik3MXQO)fcDl&s0k5Pju3U|A%bq1l1NA}CVj6)=nXJtecHE#Zd&bkMsA zl$a|OjKTT;H0~3rKKYlcpyS!z{m_soXWQRH1cjZN@;?{|ja1h3|7Jk#*7^Og6n%f# zrF$@}ltu;{;t{vs8xF21)bI0ET)b&Z9?A}!JxU4Dhp028J~vM#x{}z-3brG8JV1hw zIPE}fPmu7}36#OH5PDG6l>+WAb$kAuJH|&tz9C+ywH}8#mCK4hsi+97TVQ;Z09|1a zE^2NTjBF@m7&03#o)q$;>6TY<2A7U*tN;3m06s}Wqh%aD6q-vt7j4k+=!1swS9mt_ z>0?yZ`%%Ms1j=$^;{J8^9$$cr7j1zv!~CS$s+jk%Gw`6kW6o*6_fOuxek^VSbKDvZ z>`*lQBquNe#d@D#=&I@6q|5bT@|AdM7w_Cub)=K_96O}DrCH|O6pkC3U#fNUE6L6>F@?7@W6m>)_0~QOqpL3QUd9jOu zZ>qT^Pb9Z#HBewUz{t5uB}MLbJp9mXSnb2k@#wZxcQaq%U}CI(b70Zo;N7e>sN6UYOkjkGfkr|!?b&|sKU&IJf-$l9t2>7hEa!NTAHVeFj>yf)O3l+1 z23m#PFpmZAzMHklV7W*#$Yh2Gcsge*Ou*cF$FV`>^~L*KTclD=#vzT+C+J|z<1$z5 zc;A_vu?XcOF3ol5$zAE{pp!3cv|il5+WG@yv=fn$etGuFZ}M2`$Kg{2MA(lUlPDt` zRC0=(pw6J6&T^>=Zo7d*4j$Knrs}WrUrQ`*l1HTO2SZd)YU5 zLcN)Xg;KZ>i%||ldvzQgNxGe#UuoE)Jh6C`Owr^>Lsc(OpsnXN!|bD^_I>=N#`(Qv zlkxXz^)-8#A#Q8#c;h#Vw&xlW?&~s-t?$#xaoJqJU}gA~if}Y9t1<%qn+`G5fS>bI zmfX_UjFk80`I8<(p1maaup9$8>9a}uqVZlsaIeGjbRyene%(`Qz%#5G zYDEND4R~Jg^$5Yk^Ikd6&x4oJgzaNPE<-b!^c<76oX>DFl}Ib%p4$JImWQUDVa9sL z#(o|;>cgPD^pAqh(5mH3Yp%l*`9X>_&~98Jiv}5;fVxVEALQxya~U*}an)vqb33hC zHgwIDT%Vh_IdlNHkauesA*GrBK{JKQq;y2+Kz(}m<{ zrX2FsaL!MyGnI_Y^+9?5W`rL%xBy@Ld?Dlvxwxh}q1CjgCAMh0y?Bzhw;p3v&b1%Y zMu2W2w%U-%T%0ZmU~X#)y_s^ZlF4K<`RQ=S8-@FVPD5hJ*2tn9R_10^zFa2U8BkP} z9<7vD)MS>IFH^L4G43&fxqvo&rRJGSK2wOZ&PD@sxfPm=1$u8Q%5iWjbQukBaI+LZ zVi!feF7kEGdZAquFjMyNd)YO)atrg!d~&&Gby+^U91)0M$ma)}Z&&<^srUv12054B z;Z}skAtRmloo9mtFGhe_f@ea^07H@ zvwF?520E&R9Se;D$e!jE%Fai!oQu|97k}5RSZ7uiqw8s;8aA(z4yg5<*0>T_`$N0N zuad0PQJWE0an&)iHxnT-Slov!EX%EP(8?cLtok<8z~q;}by8+)YMJTvsx|dRL8aMv z*sL95!DnA6*E*XMRhtecX2N645oI8V9?259bgrzAmClMz=YT3+Bj$q|u8{zt2DMeB z27X?}+rS#Ob zV_yDO-Z`Dhil2RkPFt`L(UAAZ%~MwffCpj)jggjz z3oU9}5$&5tN_1NF-j&5}wc`}p-z_vPjue;NY)$`RM#|dtLa>#_Zq8e5u3@x2>u57e zPgo3UDd)8{n6%S6TL#UWDuX)<-yP|7ZnFsPyx!VcxY*VdlNamK@_e|%W~t-M*N(^G zvImJ}$(P&HW*hQqJ9BweX6fYVcV$zV-3}XP$(q|;=`LL~eD&1pmOe-F;G-)4nKRJp zt`bxiLjK}pZCBX_@F%Pr-+AtEym=D;qFv|i0=dR}v&}!VIv?tuqmeJzFLpWv9M+lc ze4=~t`E0|>tn$IF3kC6o&)+g7`8`T{-4-KFcX_0m z`clGSk)Xw$?OHdv@S~FL^RAtNC(p=S%;EJ^ECA&3?dq<*&X!$kL0t#3x=dz!1A>wr z3o_fa2P|AJhG@tA2<~*h-1nW{FYIdeTNB=zmitf@Y;<@hkxRHe0V7rHG-X0(0F4fT z?BUr3tl-TS?brh2P+bGYy9G@v(afWI}IY0=Be z>d;vO^g4F@vKZW{XP!v*-vu~@j+M8kfxPi>nxU%-%h#Q0lVvM!$^xPvg0LKz57X&Z zGf0gI+f4@Cv{9CLOd{bu=;3f5l21hmRDtEY7k5fu5+nhDMdLw_zqjUWqMC!-G%Om$ zepDT>=>6Dw^i${XN1b-}x^iJQFc&otwKdR^-&$(f#(&a7D;RL?Ix5K=Q9lkmYXaPX z3p!g@U-53_D{PRT)!(FO{yPn1j+0N+^W8~MHXzyQGNCdRX<`7l0@_V0z#Y}(XGn0< zNS}D11}1WS4cRBl!eF`_N?r3d&?My~iA!`fZK;J0IfLC?vQ%d7F1ya zOK;FNWbnj;qslDHB47CgGElMN_--qR3g1(k0QQqU(QGJ>#kgX*AWtSN6z*)<1lD(Q zS3rX%%VFY=!PW_I3zk=@mAoF-Ta)Frn*$cZojgdKGSQ355*iCajhNMxAQdmZxpMKc z@%3t<68~RgfrY(iT(2FNYb~q0wl;jN%5pktbRb%n6InkEPsnp#oZfO7Xw|1h`R*D(sbkiS0~?*b`@ZbR@_^QF4l}}kvRwC^ z2GoXaHk3}kWGU}W1pOb@&NLhfw&DA;o3W04*9;mM*9f z^IGO>PK%c@yFqtKnM>SL*@hRXFQ4sv8asF~mHlL@A*NH~TmRFB*VD2b*EgPo zY;=<69;!d_PY{30^Qg5|{C4|=xAqlpJ08F7FPY2v`L^3Ny;rQIKWp}F%xvG)+1%h3 zZOiFb7uZLC@e+IB_2SJ2Z)d)~s2k|$yB#yB(vjU7)JMPkVu9n?BW?c&inS&#Q*sUO zj)>1ciy7|sn;qtumNS3VE zvZP+d!H|Qy8^VTfou|pcxijFy+HCeuSLVV#+*D-!_40%K=7*A*#VEw0YWC!r>_yFy zrvZ(lt;27HSKsnUEQKk}Ml{Z=bG#-rel$~>wb0|Reu}s>0#B7-%c@+PURX(?Jj`nQ zaDVngm zoLy7wZ#JEkidnMn2OJ^;M_fy2!<}P6laiZkrRnf{?g+sX?91F0Z_pWKvq|795TIS`CE;+yI+Of?$-MM^lNPJ{{8u_a>EnlTW?P8c5VHrQHDn=!TYau z4xQbvV*65aB;ayy#zcbko4m9f5FBm=kNP`Ykaj8=nS#6$m6we~air!Za};ot6r##< zGLY=T)N1C1U`0x$uxLfmt=reLIdA6Q%M-3{$S!@9TwhR)yw=ju^NfR+aqVhu)#D1@ z&cdATD8cId&(^0H)|75}BVog_*>&AaU1HRBo>3q zNM*ckBl>#k0=KRofCcv636R2SY0;Gk-HqSDiC`dTeJ+;Hc=5=i#D~)%O6PqLeh-83 z&YF5v%ku$uN|N%zkK{&(1uN|3NrtF&_*tC2f_!L7UKy7j4^>ZZsjzyPOBmH|Boue) z2x_h_<$v~@jOX^a;L9TV1&vOGX|Ts9vBcb>RkB9bVUyy*kCP3M2DHf@jY<=u0K*RW2v94$IKliu?o!6AkHpd zkO?eKgIFVwd{Rz7o8{m%m=!}&fixeVEi7SmT7oJGk#KD{FR40Wd)dfI#N~MT$4y60 zA*7pDjvbA*wz^*RGEy?FEJVH9?67-`q$2QGitr>+AuWRvGiE>W`(dQxfduQ*7f}6I!B~;ZnB7#& zJ6B$0-l8V((SIo<>k}F4t;zDo7`GC93`)WBoh>%HfnC<(!{k7jCzw$4-y`x~lib$_ z(Iz+DD+2oY&jwZ8R!CsKJlLvdA0{W`p!l86-sRage`?_X&jkm@hA(O;pVXRX!6orO z>kksYy<;=2t|d6kD&ALdz{{L6!N zcJ9dzN{4INnej+_y4^)2as^TRWcyQ#_Hbrhu++hWwK`3ypI?sLH}kTVPBduR9Ntkn z*k5OQu#WGzr^NXRDxS63MO}S&`b$O8@9N)yi?ekjMckW1FJlcea=)7uJp4S*rLzKe z*?MQv#p+C!4~+&1HJ*Nadzf+8;A^aljL0i~C!c5&b2 z%X1noVGlgmY#knAi|{E!ID6@!L3y!-%W;olNk1+M_3E59Nsk`BF2NEeE>4)2XCaOA z={p+zY?sWuyFZI~B-=4c$@M(FUd{FbKBN|-csb1FI+uTOkJDUsuyL5#{)*p#jgQZj zI*S|f4(D%(9)w;vWZ{A~iXP-CgC{!_yknITzHT})lI4^nit%?uXoh{hEdQeh;N*Q- z`{GCeEen3+rl}<>OjV81T$9f4a$RRuh`rcD`l|2=D9$6{tSmdA3!1bl`r!bdKZ+R8 zx;QT5q$=Am^Kx-jx2dIuuT~y_UZ2dBVz;Ry5&7#lG=^-i2|Mjd@j}htmv#e^?rS zwyG$U{wOrP*KOuzc6GhA#3U0jHl5arl)g~-?xb_gZu(g2?}%Hcrnz4?Vn)kUQI*Gd zSh*@jY;HD2%bH*N_?qui9z}qIU-**$cpd8g^_l3Kw_^Bgru6ws@v8oMw*$&dhgFY2WYi-`b21@JEh_f4N+?lTPhEY!JYgO5G1##KrZIJ@s z_4{=eRWhU#0!Ipb#+$fn1|bNOG$Ywl+=amdXMrNA3;k7RT;>YBd2cwu$rCx$)_~ug z+Bz9|c12Gr*0hh6j!$-RRK}gF_t-+dfl2f|s9N$3Igi$bkf<$PibVwTJ^2k+XK{d9FUe%SOnI8f=3>G9Um$iqUG%DIj|=O%4b zA4pwo2n#Tu>d>)$s3;y1CODeXP#4esPX7Zq1CyhG9Z8cX4Sp6TgbeW8TgE&U-57Rv&!hK`W9 z2^Z~Xps1JZ_%KuOVh9Zk@}7rbsMBof$RrUV6kEz_JRhE#0G?Zg3AEu$$B2I7b})o* zMm#&6mLNl@LZm&_7gI+j9!a7o;(Qu&6XTa?*jL=VIZA%z>^(9+m7g29`B>Y>J`+ya zdJYYgn(6pq`lWuqcm43aCa$Whya!Y>P!~X`#Hiue2`XY=SpWVyDM3ND7NH?qRME1X z)ZP{tN|FS6Gm$vViUAawgBRezCJ8GyoM5ZZXa9T}WYQzUrpu;LAT;YFd{Xj_hmR^i zw4EVGJynvNSJ9H<;G(j%PyPlVeVLnTpiAL{3L*@1{IH4A)VwQfW_F!iQIO^ zuByla3RC@c;Y9j-+Si$9_KM_BI%D*o_nHc<%^jSro=-HKk?%eFATV~Od(s28hgEM3 z-3anzQ{f~yyQ4m0dS8HSO3c|vjX;i?D(FT`Jamc#;(CnYgv9`1LejF8r8w6006Y@o zCLr8vt_P!~#(Se=_@k*%QqF5677);loGptW-#R1j!lR4# zT4ogacTSq!e-ZY$tz=a%NV65_HvrwnC28iASik2SKU*qJ;mlEYWuUI8bzNpj_(rKg z4<^Q5FtDqbwtidvUi7@5wxq($r@T{j2&*dRmjk0Iw?})<2?wNrV{Ie-Cn_hA6|o9%@Cajz(&pOf6bQX^xM&xD1GL9|Z8zB`3I z{>xOpr@< z@k}|bqLpk%;8#l%=M%alCMkxli*Kv3<`am7%Oo{~dO9WAdG1}p5G*YG814d*6m~;1 z`xTo=Y^oB!IrcQ06*PNm+O_7R;je|`zhh53q(MvwDtYmEpEjS$01Dv-xYK#n zwjiQ8mMF2>ivRRlHNUvkSmK8gz}HoukZ z+2Wb$lIA!^&0GvmUw;jK=9s-4o!ymYX}l+UO*YhCIs*eqGa+PJ?`56-mfZ9`!)4<5 z53MvV`y*8Q^!dTeRUyNV@GNM$^1$otOr#3?D*TxMyQdH?Q8p=0h!KeSawQDTc~XV5 zzeyYEp8>X$XZe_OR7Dl_BiH!@_*)Yw`&(2YBXt^%b0y%U9Uu^rq$;m~x4uxFm59v-ZNvy9G}_6p~DnUCD60 zRZcs9F5Oj5ej?npv(S*Qh%8(jwu(ICROH=`6r#Ybhd8mzML=toOWMT=+9gTtaIbW@ zE4d_!S~3J>IkycxO@;cQG>mGzSmG}xmzI{bmv&!=VwsE$01U<;qe1Fq5(u^<4oy*$ z-42DRK#r!AR%n;EI+efaf*4VtjzkC^i@Yre3Z*hYBBWsSHXsrOzMKo=LdhPx4iv(M zVQ?UF6=1+g=)w7`Q>9lqtIE$}S)Az*5Rm0dvl0dumNF`&R;!c&M2e7L6Fw~ZC_&~8 z(wZg&fhwOVy|&+eEs73tq+NCBgv_50H=u#MyTK_{z~fY)4Hojczmk*#mCp&!gO%F? zqK_k4&Pm4}Ojk+hXgM{3@hC{+Qn?Tk6x68{i4*vO21}#BQJ6ztrXhD6z`C!6f>07^ zXqk(*%)bAq!im(hFO-CkFNTn`-W1pDcU~ZON~rgE-9{+f;Db0(LmhBjS?x#myE$D% z5+kT^rwq88d`&y31i*dccv-E{7sfFMGktY`aisS@%wt&f-0jCRx4#gxpNib+ejeAU zbEiM%PQ>@j!Hzq_pE94%+@XowI)`QHaBc_`Y4D!VZ^&pM+CV@74fL4$*%`f(`*l%B zkMtamG`xbhs`uF#r$tsSMY-`$rZgghC5pntE1C{sSUgEA0xm4O0nJfF7C$VD(KalS0)4-qNv3Eild7fRneeY7?WgIjsaO_i z?0w=3PKQ{uPYTFSK#i^bQ1_}oh6=DW104mx5Lm%|8pMi*;Ua>wjy+0jFW;gxe>H2- z!nG$;pa}tt=JL$uvrUgIV#R$TK`BRAPVq>51`3lq!RoeWSKAeVqrRJ}Oj7O9jA(H< zGyFz`WSVn*uRqck8T4EfIs8b;dra{wH}lFA%K7|yci5o_T+G|pXC&>0aN^?|HT+>T znAdiwirS$%ZU1d3C3*E09CF9O9FK})G;L32Q*kWr^+uECPaZ8Z&LhT)p3-D5ukw5&%j-Az%**p zCK<5SF?6VGU_Jb?86^m)e`un}Ysv+4-Z=Q8gKXtDH7ArT^AhG)5=&0)}V;cYyhto)bkT9w zAPGSh6}5`Dd0rn5s?P(XB~Zf#%x^)G|E45VCnq900ix0LLKla*=`X>p3!NJU!AUF; zH~_b6Fe4QF=`l3RTK~&ekaZH=md0rsJSy=CEOd3$1sJCH`X!or==e5QY$QgJ1Zp@B zmY{+{o2cROpgA890RhVviX3$v>2 z`e`KC9sm|folU27Z(wJPDvGwi(7|6-<4@)cyyv0-P`dcLh2!t0=lb4m=%qWod;GE| zqVx4eu;C~1_s@Ff`W4^rHK=~M@P7ZQ>W__X!_K^)mOdY!bRQ(bfr8Mpyz<$$&lbX4O=jNp}Y+U6;SLI1F3Yv%&yA- zJb`H3^KL}B0~IJiJ&(awL>4TUcrIrGAnaA2qB`keA#m$XPB+IxwbehO*=Vv8rPmQa9xOl@RPtU+&5}w!LR_B?rSBc zaFa|~QIr8@jSfyLsj-q^S9Ta6yKf*x6q7K8ZR#^Qh!^`5pynP(`vG)E72<;R)2D$q zbcuqhTgkM|sHRPQ|B}wd&pUwK6!KbX=jSNOr{<6?{qcd|PN)l-MM?rGL60EkycxI! zTz+spb|E^m3OLX>Q9Ma?pn!(E{p4tnL`^{gWiy`TdT5o9K0wWvN6-f#7{!xlP35vD zf|L$H&FP%>G*0!iTtXqc8N_cBqsw|8`g|9=gQ*dq_%iG*MN2YjtRYnQ1Xr8~{PHW# zcksjK4*htr`R$UGzRM1O#i7cJ?ccMWkrJ-&Cgb)~Nc(Bq-?xZcrSE(5FX@+D6Rvx| z{~`DX$LO&~U-$F#8IbxbaPJU!^FAl@MJ$*+Ribe)sO+&$yvc)_29WM0(+=PpyJ|t@ zF5_@&Zthg*w=L?oDD2O=&0iW<;4xg#J9puEZXOzi@c4q?8MNQTrQhjIO+PK)vvlco zcyRqV!8Oa^jQIUoowECl2s#7U4Zidn;RE+S!pMBXxf=3*?^SQoJ)@si`t{knsWiqm zX;}||Y?t8LF=D8%aLOA`15X+{j?5+9V`!Sz8zK+3QH)F!;}n_^MI7A=W^5nV`e_yQ z(L=oFELTCpgB=v(($pAH2BQuhz4F{g#Km z)+MfwR~X`XmW)&s> zd_fM)j3h7wzcv^!%@)PlYhAEg$P4hE!;BRAZwD~ofe2TD+ed%E z!aiVO?5LqtxSvR10K*ul+XTJ(0rvGdSVF zVPUQcc9Fr685uz~wvl8T{~&|VNRk!WH7L?Q$AE0fl|!hER93agu(8Upa=J#&yn2;P zB3yM+mcQq3)0BHB(yAenK#KZzop%U1Bs})-Ixpar{QH-S^Ghp?)qmu3Qwf2Gxee3q zMGDA@*c{kMJJ%7eqx->fkL|owMyvafP=Ea6m8z9wD8KU9W4Ou^EM3$e8{^p9mn5Fb z6=}L!CE0t2MP5OHJ$}iUmlsnxPOL(kKR!2J>GadIwaz*i(O;OkhX;auSsovbj%oc1 zWvu3f+`zM_e)nm&@LGUYpmf$-YwAFVyFx1Nvd<+K3s~&~?EUH8*Mo|XmWE$x03W5h z>0$O?R#YI9lEozK%#3WNWr8Rs#&7Q69^~Vz1spT>(9yaYoSqf2?P+qd+DV{tHm$0A zn2*=T7}9l>ZuX4D08d%XH8QBc9G9RV&OcOO81uRt&H>`QtVP&tC@(ZZ7h&d8mhQ7c zB~Y&`ooE56V=sS;6z~0wGU}=62R|S55B{_R&o_t;GdK}BPQtr&y?K)a?RFktQ<>>xJr$DQS$H=YU>(>19EZG^laX;(SpJ&Pai5m}1BL6%~ zt_QP-2Gxxki~7?X8&$WSFrOv6w{WK(Zs;3*e~my+s8P7EDeA`yIx+)!0+*?f7yT)$ zVi0&&5!8<~nDR8HkY-Wl0$pc3Q^Z{(x(zZBD{l=vGl;XMTxc0$C@=rp&`KHX+b-B} z@|i9K!d0OdM(~e&3{@a?a!ZLFjnjoHSz6rOeob5(Y7&>Mpp`w#>|6r!V3JTqaMc_D z45lHAN;bvBDJC*l4G82pHho!DaaQi9O_N}3)LbH`d^8o$DO0Ai{t9PkLnqcXRYa3Tpaq4 zCyr@o{Qc*W`}fc7f%o;#lnzKHVva{ncOmP>_a;3EaD4$}4wPM;sSetv@C6XXwAiay zcm}%*La<4gb>?$GLODAflPtJysH-8AzK4&sm$Gb`=keA5*2`_q#faIb6T#ypWO+Mnj5J#ma$p2obF7Y&sHfFCu zv6v3xMQp794Z{TdCk&(Y4-CU3Vg3gO!)(DbeWy(NB|JVmA|saxz%aR&KhR5gL40;z zd|m|;eMw2lV6rY*#Z1#_Ue1-gyu5_==kUo`Ano@t5rMZ`0}Z(&B#+FZch% z-=FmSB{*$uEiY@m{U7D`9wzJ3|6giTrq}fTUtUw%Ke)?_vDeJt`*2_1pVa&FzQ0+Q z(aHJOFQ5O7yZrH&G7*=lH~+{>Uk)=7m&N(_On>Rp=dFL*?*Bqum;DE_{uY`3pDCBWS(pFoPbLf#@IPS~zyB8)h8czL=1!6N=h(T5NEt7| z%q=}P`>>LWPFhS@OWDc=Y^Lu9Y>6c8q;Gsn{nhGdsG7S))6>}C6adwciTcs2k|8=W zb%$^ioM#HZt z*o$(ezs*m2CaZ_s{jJ6?k_UTr^(gus;@E>v51V8^YdGGDyjLjDt|^kfmz%C0WjfGD z#u^qYMIx3(ED2x--lwVk(QTrNUhhtZ z7pwkLyXddK8f55{iX<%90o_KMvs+KXCEzg-*;A4tZ76hnvsS!BidbaYi#_kQjVd3|I(jRXNi$#@n>5l8q0ks zu>0rO`B3B<`QMJ6=f4KV;||gina2*N*Mg*)De$y&&o<7WB5qSA&BPIk^)(KtZV^45 z9MFQ77u?f6b6ra(*Pz;Fv?T$qTcK)mB1eb0Uly1pT@5ZGiqtDc)vMN9Ca-*4y-ll# zk#ftX!kNm`B7QTdw8goKi^rzR)|z^=C4+1R1-jju|5l#^>v;ME`@63O!$-L#B5TF@RjQZ=683+fMl<(V732+_0r@j-ur@*~gh?Cl@R zrjd;sAF0LJQmaAvRexZZKZ&7%k^Puz-^`9S%10(Zf5o8j*peGFD#A<*DgTog8Yq`A zeUU!vt~4~B&wlvJ88fSpud}J^k2Pnmy#2-ajx2s~{`*4S-HXpYjJqrC&o^4_eEUFB zh9ArqRb3LUSNm~ju3ggn%Q& zx%h#Ez~_K|Vfpm&Q?HynsZ_WUMW5qcCY-N{f*d3ls4K*SL{J8tHB=y54c%Ri(#eub z0`LxZBD`^3Pl(ibt{P96P>H@Uo*K{h9m}DVQ$+#5^$D)@q~S7>hz>xxXZ|)j5@oQ`8*+2>-z@mXW3;zV862&9*)(=G$768qut=8%W^QJ}?yg~qY(Op*k2hYA( za#;G|*>(#Pk+@DMp(&d$gal+&M?(o(IJg20`q7UHQYry*a~7oVjfW!4>wHDL$%$Ow zc@c72iEb5(D88&5{>cMF4PNe1&t5RN0nH)Ao+kFY9jT4i%3&KrC41C%A#N4i2+z6R zb(nse&6^6~Nn&bfrRTGhK1}k^tbrCqx2ms}$VyUXGO6u@=k}cwxP?n>FC88;a5dz$ zK8hYsb+#9@WxO%8zq?;u=Pq}AoJJaz(ExC0g1Wt|?` zUlUTBA3bx#dfLdb5y`C;co^bm|ElAZhl0(9rm=bYm^|p*gJ6Zj?k`-HdW+;Dlaqqg z0^zftB6*h{}7P;rXa3zsDHgaTcvu{*7TtnDqz0jmxJ zNP0*RLkCZ!Y_~n+>-vy(*+JQOz`5R$3OlYh)@|sbtV%$MF^eU z>S97Qd?ZXnSP2A93r`hj>I}{C0>O11!F*&850)6OC%|+V_{m7<(+H8L0C_C3Jx?qs zK(>nbt8#!I7Az@&UF;@Qpaj^ZbCC8UCcQ81I~h%g!|InzA=Pu#2H4}V+U0ms3et<^ zq`#N_#3(dK*9 zHagHSr|aDDWC!!_`vSrf))!)zAtxLR9uz4i;qb#BuU4fts$&h(9Oz_SmpI6;lSx9& zfEM+*f*Fx$9BUCtT;@9k#NUZ$%VS=7GEqA98XRi}5$I!9&W=I#fRQ?2GzADf7E;U0 zBbUqq;6s33#&Z!!30E1&WlY`8cUifkKCN$FwtSB|(v&To7~YL2s8aMvf01!HlEz;D zGn$j{3;ko0-3xjCTCAm6%9We?=k_HNO^1Zhx(k6@`#key&mJKdjj0+I;#-O~yN97+ zKQq~hLT3-RD*Xt)aM`%vZrlSU1?q5MCExdbU3p#Q7~+>x-aPSaA14j=$6^=0JQjCc zb9j!5%$O~PP26eekF zi8RL`!3zB5Zk<+W3P_qP_@D^Pngi}7B|8nWiWA@p0x6d}u`X$Ftsanb}ih)=~h|%VQ8y-MflOiybfQl3`rD$cEJ`7Jj8JP>pj*hwmiJufe ze~nB)ACA7dB3)fauGNB9xB0Ta2B_mA>j@0~c-w^Us^+Q#2A2!6zAS;v$p8UBxHcb1 z(ge0Ko+`TnIy4TIL)zkLph0U}H>78}G(>pYSdC)fhJqX$PqHEat^JtFXs9+x{O2AU znhq9?zT8gso%xSMC13bMRCUw`~Ml zDM*e;it^2p?#pkhBPm6Yga&i*l4>a^WpNV+#toRyU~&?U=}0>Fka%(VC`FAPbzl=U zcMn2nlB`H8xJ3brwrl?~DGF#W@>{szq*@eID%B)d9GD&(VOoSPDL!bq6t#LPCOziD zwDYCav?ak`vT^S6>oKimXAEVI4jOb#SLs&uTy`V3BA!bl}g zQ-vN`iUz|JaS$rfxnlaTXp}8zFuI#hH#Hi@La_PKg2N_@*^tWBa?D~s<|}JN;o74p zsj+p!MGXi=DZlJ*3m`r!Kn)jmc?pcfF~`uWth6(OJK0MqKw)J1Xen5YXvK#-$4LR2 zr-|tcSg_(jj`Sq`$l$YDY>L#17pn>hnq>`xX4(``=_%VtG(?&PdXOgQkAr-v0w{Kh zZDGJl$f`nu`4@ewZ#?FS1q3-E&>5l$A}@h;+p>uUqEeE7$Q?fY1-N~h@(si!=JNR$ zzyz|0HV$`;MZ-h4@@e|1qz{p~6R2u@S7`cRFT($;qU6$J7d1XOJYY!i_b+6MR| z*h12!Kc&_e=kUm?Cdz;St&;HJE{@vilJv4f`Mbm@v#v#Ij$4Z#je=4#wUaMBNXqvHsJfAC zY;w#5h$QhP8**wCdGczYY)k7()3T(OIMM5P( zB|-tp(Lr!B;g@&dM9NJx9e^?bnPZ?_d7$+o*dZJfO9AT5`0Y$VS*TaEQyNu&DyXwT z>I#&%_KcP2U~?LX6GwGD0x{zQjRK5Z}MFM2B z%$L$1;!{9@>R#o!Fn%1&k@CR*twO>n|-*G0BU|nqm4dRqhx94m~Tgb`L_)WsencOT&@Yw zan`3YMnEAtXrl$dMpW!vRxjR8Pu%uA;@s#-FFliUEcI6S_fiQ#pXi`-2!UbA_QI}& zPUqpAjErs1szJ+h6CO{uFYbrK6n_?bH@VZ+SQTkRmfHn<@60==bS3a2l$ zr06?DRv>~DC}OJY2&HCqUbU$m!I$V#K#R|uLiMW{NqYO*AItV46KsuGCKQgy9fGg`p#4jJnQU9 zB+DetVtBjl_o8xV7Y5pp>e&bI1O?G@1DGEGFKkZA5Y>lX3( zRmyX(Fo+BQj3tBgo0JLL=86_D685^ddYM~}yA3hdp9WDn*M0`&*<1bmDizY7g{XSW z&euFlR)rkvgjh6zn=6!qBhKi1psXppG{XU@?~DHRMl$`8B2dkbw|5#yt~Y*xK<{a#01_5utF^lTQ#VRhYRQ zelFZ04AJlsho{Y|paJSf1)t7=nGj!wpTCS*kSFA7z~W`!j4D_W$D=PR zD`O`TX_Eo8$w;>euLh_=11wGvKClNmb6F+t!T@DfYsObS06*Ct21%z)=Hn(#<7N`J zK?Aigzim+5<=O7zOgA@kc6CTSP^h1qNFam!i4#+n&}z4t1PV-;Iy2xlk%XGn!9gcB zVjmW}+PfXLLcPl%Lneb~odIBq+w4Y`m>m}J;VMi9Fm)OLHralAi|)MUcGwR9)}eyW z@IyXs%zm(?+jWn7q3Ex0bY!EJd)$11?OPG0^IR3jJ`W6vE1ln9iQ3=2wclOXvL5wF zcOg>B7)NG;+KkerB^$O|QBA!kQdse6pKJ(JVI}vYLleN@Ol7Vy?^L!Lrl*vKeriqx zsAh|8iK4kkH}oYm)dL}FdapF?Y#j^CTWbJfSHUMDl(lJ~NPWneO?uF~<&fXYWQmV+ zGRBgCjvsj7g&LGM9V~)^vH;8plu>M{k+k5PL*yqFo{mQ+D<5tz*Xy-(v z3$7QZGuUs9axRo?RFS}MM>aCG+0j*kI=XOsnays}=2U>4RI|Xy`sNE_BTu{pJZNia zdtMZ(^{RKP)^lmngBCCe0j^T%g&lY@ zKzHkIng_ONp4zLSqMtWy`8-3MwgW|GE6ddh$2@`z95Jvw1u#b$UUCP*za~mE0!aSL z&b4pg!x6G%9Fb^JEUweAXz*vt+ zwBfm)|M3KaJ05Ih%5akWQ9@ojJ3B(40R1!o9AZ?gpP1j z)PVTZpug`TY_WYe>5OiXk853lwzF&q(i&f1e`q$lt(YK)Z?gakUDLa}^<3ItBO{9x zEfxna>;tc5-~B$qA$Gv#pNtR-g5UVSsEfG>kGSZ9S~%I=^R(h zA6>x{{+|9B8Rlwg{wI}ePRhFZ6IA%kZT!vs9pxOgq26wamHrsCs;~diEB>n5{x)(I zndYijPO9Mv{%T4YN_qkP1B3q_M#o-{zZpeLO!vzVGNdK|19bjZ=wbS+j~{3LUFDic z@Z{z>o|c)xDkpMOJqdMsJ|+1upN}lA8vT+bLCs<*8rT2+jvfE+bEfh7#;k1GO+>#c z%CO`mfJP27Z^1Z?4{uRI$w{nyS*|sAi+uXB$;q?R&oAVsqHm5~ComnaF$&yQU_7N<(+yu67eS^YhCLEWA z06Uhpe6i1$WdB@I53vh-@;NODV0K*n%76-MkCTc z{4y-Ou;Ox?##E1l>7fZjLKc%Sl>3CDUYbV`H{*TMpvq;=IJ-Rl7zt`s-%9Y zWv#SRjEuVcBAxWxS?`q=fhG;{>+3t9e?(qIB zufRK`A1b2mvs4_X$ag@cW2P9r+gXH)gRm-6X>RFU3Yc%}t*LBOl$9xo ziy~A5gq`XnpTR?~$O_=)Vm@PR(iX6oMNah;;5ZTf|Ryw8)55Q zDX~A5zr-+Q6$AHNeHhT`!L+h|$rN$<5#apvuc;?4@+LGjEHJ&vm3(Fz zxA&*FQvv{q!cRMse;=gEW2%!)i*i8u(r8#Eg({;7YGvi;W-|vQB9nkwViBHF5@!0( zRRMx>gA``h125Q=13NU>M;7txQm7ycozyxlbd2^oZb{~Z*o;aDQmRMbL8l79I+SD$ z0t+#Z9R0kmGhI6F99PigM(=iVbFylrWlV?6oImH44A)?ePGc>Gg4`?EZ-@g;&BD?@ z7t}?V$T>JQ*mZm^d`-Hc;A{HAdFFFb+wcvgsG%3``=5(D*=w<>ro*R2c1s2=YE_Ge zhJAE)OKDlP>Niba1~~7QP4)Vq{uQ6}{X0HM25|vXR8`gSctd7<()!Z%|I`vP1u|6O?~cgvN-Dd~Uq*rI>!vGq6pb`KU7 zm6jBjmzP&m{BaNd$xi<59;_)X`PUNrU%|=7#^!r1_gioMQ=9xJHMunNw|?-+2K|qI z@bROb?q`3cCjZtCzU=QG`ll_~|JNS-YHVy~@vj+ncA}SAlKjgz_;*b5e=kY?hi{M> zlVp}8*B0jg-eCWVN$&1${FRa1+4{P-|Ml0eKLhOU?*Eqo_TLLFbBQJR{&y{5ZeITX zgO-rF#Qr(wCjR{Zh(5otxb$J^4D$o#xHE0@+dJwr0b<*e}Ke^i!tc2JYxeH4pWMEg5zM`^-~gf8)AB0F;+WQ zcTv*X+(}#r{e!q7Q!QzjH4-pSSQh5hXW5We|GHXL>02v*SbC6XSD8_7)?NBKf67pk zMOb71^lhn@GYpwu5%F}Q8y*gseL`DNa(_~4f$VGjdRwZe0%J%luo-jX<&j>ukL_PY zJ@frush{N+_Q6QmU1%vTh1C1H&i1zZ%Z~d271b{df1#keCSC$pmS~IKCReHa}^`(w%JVB&n2ec#%!1M5TmWCj8w)-ccWa8eKHR6gJOUr@=4i zh^V3%@)y%-vz{q;-iS+La^flAO1C{>_lMkh-cq6ovdjlSwJEmV55GDTULX#AS(KDF z`@AeEF67f~1%8TrcTzb5We}H4n-aa0{6#CRs@$mbrJJqIqBQ!Dkg#RRnNtC)H$toP zZppiNn!u~mImdvkut?Pb26m&Nonl1s`IF=q8nYou&opfU+58dzR-I)LiIG2!L> z*E0%_gCg(g74OEr>C(IkX_SxsuSN<+vA-H{P)+5 zyMrHfJQgityV)J6to8Ywi}}<2|I`vTrLf4{`E$&zZ}LySvI*Gwy$sI2$z}h$$^9~q(_+EPshBTIhsyCNu%yvcQd(jzy95a z-dVd-E*dLy{6(=a9%|#~I$Hrb|6Qbli+Xl#f&#coS@v#z~;luX4>9N}Y`7C$OJU3XJk`>bGCJe%}mT(?zt zNBGU+%h4`(T;G-Ee(Z>Kk&5T#LB+(SKjaV9=e)30dA}F->0Lcz=GxTLwx9(;Nrf-( zcHdo8UkwifBFqQ?Ll+;ui$LUD6yx_d#&u@N-Z4jSqsGazrwAlC*a@4cj{-8|ll;Ig zgflIH|1lNDDDL8jp@oYdP~i^+y1C0}{)cs|STl>d`8$w)ig8u!hXs0sXPP`U9#?U4 zO&sH%?PPCBgs=(CgIOv~*mSUooFTc*;$=i?3Q}Oaf-On$@QDd7+ZRFSR@%j;-#bO1H@@!p_J{^6mR}E_+ zvA3{C#O@&{3os}2{MiEncFP|$bqRQYN5W1HmoFzJ+Y}U!xKZz2ZD=~I`$Y3qjL7=c zJ;OeoogynI`fG6|wmKY(4pBv@fC~R#ti4xMQ*GO}n@&gqCiG6|9YXIIde=}Cq)6xp zr~yGhQ3C{|6QoP;T|(~|dgr03AgEL;D%cCk%JaV8_pi0K*3R0STiM8%W6b-$uH!rp z+d3oew{5p~c1u~)0z^Jouq0ZA*>l@cOjY@ko-AcmCag(YlhPR%t`1dkDCrDCYbf01r4tt`VyA>Gs6O&q=v9D5xPUu7pJ!q# zUNOv2op?e86|A<}=bGWbe9v-62gpzp6BC4`_DKGNB?l`K7Kz@iQQEtoT(eY5ilaB` zy*7+Rag3q;v_L6yL=cJskoB_|X3UM^J05%$yZQ*i3O9UWwMrDsc{UF3P?xOtyz5+b ze3yw#w4tbNLH`*cbI1~AML9&EY+6PL`$dTIrO~h&vYet~WBS}%ulC0cSP+6NZ8uYi zPLR&Uk;{R4WrpkrD?r>79>zaq2=xg9b>0r(=MIn)&%cj+zGK5XG!G>S_b@+p zpQ`*A@PWOEKvlp}VBz6fa6#U*FIfjI7`#`k|PHtgD z#(<@N;a3rj#qqtvlY79s#kx^^tcl5Jwx}Afx3& z#a^$2yZ`Lu^p>(1=|-|}Q!Lml!6o&C36n4WlS{!siW*@z;H$UJg-{vKQEuDIT!>_I zRaDW?ib`Z&&1W+)b3Rk6m#*3v=}710z3?rsNZX~W9&b2R;4@wv(c^z* z?2E_j!C0Aj>uY23SI$dAuSU3f(*0T?ylGt`5Se6VlR%1WqfC84UASOz=Gw2NWbAG|@`!8}_92z)kkP<+GX2K9=_$tU z>xkp{78IHH>e1uC{0F`~#&&WQ)I^?d*b3(Z<4wS3oYt<0C>9cCZUkvs0yWN)puf_G zpJL9#d5VHyGF1Q(8Eh=CWH9LW2i+GxzeU_gw)6E1{v9uv>LqUF4i7m!Qsc2W%q_MJ zWI66c`(a}}OVP1oGhAT303)a@+8q>-L*pjk+5N~d92SNEnJ09nK0KJEhl~c23#OQ79}FmPGr}ukDR8a0o!red+{K@|y(GJK;|cO;o1R95)arfY z)gzdwsy)H7lo>(;@E~zW21t!cM-s3wlpfHO(G3L)4uhP4Q~^kdNu%d6Xb@Yl2!m?8 z$xa}b)NVhGL!XP`-RTfY!PTjy;YVH>o;7q#9Y*mI6tA5E!I%!WpsoQUz(@cD!2yJ; zB`$;^Ln*^|$xPA_WRB=kxrrIP6OT0LR0*-P@*iHwkMdt+`$)eOiRIX9(gY0x`U{I-Not2ziD;4x`sSkHZKxg4iwe@)f+%eP zke0ARZjcf>f`xjkaX9^LS)xDTN?#-_SSTy0*G2Z(!FP<*fk)n0@&AA+QEOYWje zxL2Wy1jwgp6WMjB5()D267tJW6iKTLF{fg)Ha8~%=eLjl{<^7AefseWkC3}>bv<7-E7-G)Pw zrwfv0?j&1+_^Abwi;!xqFeYHmCvzeT9wJVJaS~y}y8vo8w3bkvK+j0iDMfwGGK_*Z z?Pm*Hf0znND%19r!sfC>t-n`K?~u!TRpVZE<% zUh(A=Hn^MP!H!m1=`>DyAO+WenwNmh$6vK2IG3&i`O!By4}lZwki?%?CGtSmr1&`x zA?75=U(OukyllPh`sEqMs|1xy4(&B3Rwa5At`{sA!+Jword6BLlMy320=zDg=k^mC zv{k?7fb1<3Uq2NovIHMpKuYT}pYEqz1|%mD%6#>U3gW6f6y!Sx4)?6_J_Y)3h2Gzo~{aK4pe?@h6Zi%90Fzg<23j zBoVMPZ{41U7aCW`{Z4>(nu2K@H`z5jW!^RnL{tp;lb%CighgPWDP%|o(Wg6jf3bg> zS}p9vAxLuBi3O_O1%khUEXn}4l4=+bOyhnlo|s)14s3Y^@YShHXO1+R27hjcN|pgR zh@M-Mw}^qloM;dN3sqdq`@@eoL7vd_$!9>(%wM)LW_{tVfIBUm7kfR0$F@OTR?d1v zmf1FIBj!}_Q@+ru9ryJ}2qyqyyA`5Zmfm;{twI)+S(K-kf($1W8}PG473ygHE`w#0wDIY zB^njc&|zv@c$!=EiM$_aN@?qAP2IS(XvAKg+@D8~1XD!&Z}`Vl8wEN?IUyx=%ezy6 z*|iq_GZon&bNN_@%w!0bE(6vERKB$kDw7}5ql0Jrp?LauJ7Khf+Nbu~cK$q^J^_-T zgP?{PSu`H~OGuk{XiXPMRbv##}Xu%K>E2q6j%2F?Exdze2e78 zw)(~P1mfc##6M{PA^d^(f@dF_g%;r9^`n^Gm0eNf?u77 z{{v=@S2%fM5Hz6EdG3-7;=wNJ4HGP>8Q!G&M5a*DMydz^C)YYjZqxkZ-Xn9;5J~z^ zDP@mUJ*{%7Tz4VulgQ5L{s9y)xo+6m@fqgA;KsnSjoq=wBcwbd`efr>vo2NCgDs1F`;)^*02-psTFjn{N!eRkCp06W$t=>bZHZasfp{5%J=ITU?^ zcMAx`NPeh|cqAKktIeI&jbVtcWCB1`vGZAsI)(3`Gi0DRo}Y!_%(QLQr44@l8p4VP zJ*Wb@mH`P%kN%-Qr*A=PCr2G~l6z%cImw_je_>m|l)1b}Rv-+89+f23e>YY?xqc#b zqCtaghp17(Z8`GUnvrMT0798yJkL>le~}R~pdH6e%^|81U`nQz-u}ovrq5mAW+NvK zyeyF;h+m{Xfo?m6@*G}wtCuoCNBzlZ6vjqmsqUF5qI?gbZ*TDpBRkb~<}?~sK1$D(E{!tA|RG-k&m7>pfACqi@@8pwgSmdxR-oAs?0)I zF%7(z8!aC)3K35SzG7Y4L(HM=(XBQL<_Vu9^h34!l{r;1drp^k2xGjhsSy7~Fhg<7 zh`lqFgBidA=>vN53d|ZiP&$Y%aTX$A_r8V!`SHTPGvNtKn(#&7eUTFxVZysLk-nSi zD19=k4GBJQ8)iv`_>ozy@o?WmQ^&;*QUusXp^xt$Kz$d%aWqKK*vl8O@HwDR&vSm- zC#)kVHvccHdoIM90P`b!NT9t-q<%R5`@v=L!(Cd);BA=4mydvq_YEtY&gBsmAaUu3 zVlhDp2maDKA6P@X4q7Sj*Esm`(9vND{LO<8IP|AH^7?9<&p^o$?_IPM`bh8v_#FOd zVBwuF4al3ps+sY@>dqI)+t0UIP}aDw))e^c!bjgSD2{d@@DS4C4z>4y`jJ2%Z^Lj@ zhcdI7J6?zU8@2Pu#5&w3hVu-9_K4f1x2tCqJG#?j>eKrJQa`et|?T z{djXp=H5v(kmYULyhzT~pQZDR@=VORc67ya^scSYaraNzFk1t_73t~LGb9M8HuA|6 zi1uPKI06Ett@b=ieJcwjG$fIQLSr7Z+Vw)u63?kni+*c({E_rL?!9V39m@e*7hnAI z_|BiT(mw;Xr+7(?&zZ#~7Xj~=Qsd)k8oyf#tsr-wa5ZpVl%__EMob{^V70P>AK@bu z^*f_?LAOD086uC!85SiqB|&MPGfXCmg7^IYKL)m?-hM(xetzz~1A=}c?rL}w88*DM zpZM5Ad+`%LZ5eJ!wO-Rz9zPj1Nk2{zNf}AkUSWW%1wxPijEJI%t+258mW-eD_h)`Y zk@o+We9}L>et##SK)FA%U>HyX<}#V!1B5)@wtxz;RE1GT$QEEBK@YWFfLW|1-;j-s zu8KWEmya{i&G}^oUJ+!1b6X2FoPi1n&xPe@Rv3-c5-R^kKKZvVv0mLQH9v76F<%>0 zGtDI`elb|v%S=8Etw&GX$9N_1h6g)XTw0Dv;OJU63YJmnf^S4bU&{xEia5DR+*Otq z5xeez5Or1!dOp|N{_3Byhu4pGs;#+kZ2ukDzI)^c$E(R1zH^Lb{}#~1WC zq_E;U*wOA(mYm0eK*Q0?#Y%>JvbZnfEki!}VqviV;ghY=6ydW&$3b@tZJc8l%k7!I z=2Lxc#8?{L{P^SZogv`fuYy;0@(mGBZ)7?m~u9tiL?lS&G}wA zS>QT6C)%I%(MRlLSUi^ivHQB`55G)eIs8tgd0`OYb}2?&TW$@vBWj{Y2OBsm_Qw|6h9=K zQW}i~8V&LFI6yFOw&X~Gu-c|iDIISKrkuLsvq)IjQW=m(2opnQd%b`+fwNsmjqUw* zpFn}x?{yqS%4xp;lI0t%48a&5p3vfpddbT3&R%+PAhe$}#t7s4{8Z<4u{;fiRc+|)9KtyE3cB6zyFqW0DW8-_?` zBaOOoO6E4>w`?lM`)g`BgP=2llu4_314s_8!V1uKeL=&)D$K)@3CqX~fB3Y)m%3 zOzQ2EhqWDNV|c>&AgW@+4PhrraS`wC?Q7)oGwl$8e|WI)_kR6c=jB58T?G&)7`%1% z1GZ8mG~>Ky73Xyelq=5m(wW^6(WjQS$HwEo{ovHiTO8tl znS>tpv?t|bG7@XVLyh7~dayEckqJ`CqDK6&tGsTcWO4VAbVu<8qd9aOn;xSmP8C>@ zj#cnN%`)%cjN2oZD3XUWZr%gM`+c<&e?lta{Au?-y)|Q2bMd{aKPMLY?KP02PEnnw zY?x{JYiwD56*Fg~AvC#+EO{8q)WF#F=4wp5v?E}(IiP~N$~JbOOBuX$sEN>dpvNHN z!qT5V5xE6Q3YgllLpfY3{!g705$~s+zf0Pvs%_LhCGpC zLc!;5=4WYDwvXNlHJ9te#W^j?5R!k&a+^c~U8{((l8m?oXH*9JL?#G(JYSk$S0z2P zUQo4HQCb^-F^dwrFLI?kWzWu$+w2$fncR_T_^`L(-qiB_2h24P<>6aKQPhb;qZ$pC zKv2?{gPpu(orP_K#0Rky89z{VcA{uXw$&rfg!TsK`9N6%z_N8d8Hjjm;-ro_-+Vtu zBUrD|<;l$BuD-9$q_jr2S5{B@Zk(lDpMQtwoOT*``?X~g7>9=5Tpr>(e~)Y%e61|8o`U^xhLtgNm_P2x>P$4a3+#s9%E zW~d|{f7uuqWX(twFq$$L&VwdmLN@8}S0l5VX!RB~wSo#)OESQcG27qA6Tdb(WZS?29eWcML*Np@` zST>W4lEs5LXrqv$8-|QgF|Y(EA|AdZ6M1jtA8vsyfX%ZjZu8W+(_TA8|F~5#+y6vj z0W1PPgBfKci!t0)FgQw*OJ5xgkk2>qc83qc?qi|MRa@Zj`n${oY+Q7(XJ7M$bmoy? z_3kX!y1BFuW4s;2VlXS!S0O^o&;SxZhJb~B9HZZ^-U7(<(4h>HSt;}oR6ry{Y>Af_ ze%YVm=D~751>nVuPOqSF@BfGZ{VTHq+e#Tr z_u%H@e~o|)9bk1n!w5*q>k8?v4DGGHb}jrG!*-LH8`fAHK2U%Cdersg)QG5C5%i`T z&80VbYHkcQ{;LTr%x0JZqdTf^-Hy4{Rex)Y7DFwJ8GaBm-uACJu(~*|xgxH;CT^fP z?jemK5u|k0Q>MG(dvv zQ~MvJE)J%ZHl_`?r%m=|q~FVIs{S{BO}_n~#eZd1WpmcUj_mr*?6$_7mUp#PR#sKE4^}RZSLNqb^$%4~ z3{}sJFmQo}*|GoF3I`fHI~)7Q8XxvIJ(^`e18oln+uJ+Z=O#La#yUpkIwn^c>7dT8 z-rnxMzDEoF{R92~G6etn3kT*N4IFF@j*bof^K@`?mBACx=?_N-2L5X_99`ZVTUZ|3 z-W>1fU{D3quTB^#@7Z4;=H}+-HrM9=SzcJ*UEF=K{PfxK)4k>GgO#z-mAToKmDQEU zn=6mESC2nEdVjzG4xS!=*;sqBv9Y=Nd}nk2VDs(E&7*^VO@{|xo}K)D{{IMr?|wS| z-!S;6{m-8m2*Sbt@(1rv{{9C+`1JY5_b>mY5dIfI`19%L|6c^*|F8)EKR&=u0C~&; z|6@r1U#vjPs>q_XVmyUMHE?sPwQ@28Yn&`lK;oFrl6Gitn{KO~&BJ-m6j`>{FzC7e zHKgO?5Q0`6b^oR3W;*Iu{_jJob9>;ke+}s^#Q!m*w+9GIx;oD}KkfF9A1=1;e(;25B*WKEFItmEmpFHk;D$(S3t zzHe#ERqONlc@oN^1XH0n8MKy7JM}C5oSJDKYk`r-q3;82#CPYYA9zr0rqW8~O>AZC zK;C70_rsoHbC9Rt$($qE^C!iJHFRAOH}7*EY{x91E_-v%=>b{6rK=R1wgK7iN`-&3 zbs_}LI@3@Ba6$5x%D1T6MIb~Xf={Rty~S@bt38Q{rEe<>gEk~c0;Kgvnp7dE&T9Ex ztPIsG93$_5M?&P=tsn|m+6)jQPVi>ZE7Dv9C%(CZZc= zNhhtS>?OukpsB&H0uW2%Ta{~UzCy790}}BB5a?X*9D74SPjapTS6Jf}bpz`L{OVI_ z!aW#o0iC^3T8;obWC@c2Ne*-MoCry)ztu~=?ts{poBjkJ5m zDu@mPjWc!#j^YgUc8~x`ex=)Lf3lj;J9*>4xie>1oUI5eS2uvb?%MmB$ z;}wbFNghiFtSkYftMn6S*4R|qKbPefV@OzHtfs}~ zx7(NoKKLa#uinYLxw%!J*FQa2b;s&6Iy#Ou2AuXM^S4H-?$=tT3FY2p^T-brojI&E zy0H9Dyvk}hI<3wmBs4Y2 zxU_nk2>YcN>D?Nw`AbIC6%Iv4RkfP&Q_2ZetL1D}b?|8!O3wijn0!+kK68lZ3?jcKZjKRTX64HS*Lr|ImQt=mgie$o(%o^ z+CpZLzd*5b80Py%yM>uB#LTWuRK(L_zQ*GPt=BtJSIcXs{axPr!Bic)T57V-u|EuG zd$)};S_+1LdY#4LPTuY${*d>uU618D@yW>Le*s!K>Gkn?T~b^xjtzcaQn|(|H)TOJ2<&n@uyp6sD8IV`5zV^~ofb%MME;|w zS+io28_{!aE{5X??pyZ0(aeTwT$Pjg&U8A3_{e|~o%HZU>bm9Q!cAYmP7l9l!6jd= zX4#<##k_G236^ZZHwKa{Pi7(EzFh-MB2xxMZWCfZCW~K?TL&QPtcmtnMJLxO`hEb& z(fxYN6_&kF8RB@e7PFTi^W6EuwZnMfAm>vLXjmUN=uM5xsmxm|4=Z-B=$;x$e(e)G zDP2AiG+O4HY7rSUlUAFaeBmF7-SLxo|DSp08g2qyy&u#L)^Y982XmL1_mW6|trEa# zT=i*9=Y6|G4J|ESPpJJ`qJEn$6SI9|b=GG&ccG)kw)@SQn>yn8e>>`A1mD^f-e0UX z=xk6bdV8+FudVrZXA_41-GvQ4TIWSL83uak`uj$?M1Px+n;doT`N%16oi#RBriR zjI5GLX`?AUIsaMY>!M|O{Dzw;f#oMRk>Aq?s{xyjU&xFS| zb*tWNER@o)>pr{6!iMOu4!ifAGM&>4mb#cJx{)>I)^U7gHnHE%{@vGydwgax(r6{$ z>buRplM7-Ri7)c1x;;AFq|o|_2;^$rkJw&Ul;YCbbM z$0VbV!kD#}Z@!nAQb3L%Jr0eqR%Zv_xPSCp`~8T!SK2}`;cWDvycgU`I?g`z5Izjar?tB3>UM-dq}ig`RhQJRv)UlVxJ; z5iz$|c{mF(La2}!DH;kK!12zU8{306^Nkt!X0L{ZN%Wwwq*xhe4mmAug?#h`7BxXc zO%hSE=LqO2dkb1zgdLd0Ggi7ThWAk%9E0KvM?IvWCh0K~hLNJ9XBv*+H%JsWyBO6> zh*c!FGcJ~So1$&O;h)cCABm>=!hYO~hk7C%08B#wp$s%Cjt-4{t&xh>nE)_(;NTtr zp&K}8#}?AzqHNP+=wQhzu>kyKttq4rYg~Th<|bmllC;ui0vFXg>@4 z!d9RF4P{J-)BHjCRcjX#fOhObIntRxA>{JU@PaLEw?nuf9Xq975u7;7Tm0 z5f910fp1Vj4yyu5(q7}##6+!V6CC^!4&H%-+uXGf#UV^+%&Isz7xj!aFo4+*DVLcH zYE9;Ul*~^k z@bnf4$@-d~70{X`a0r^EW>}EXrj}$fC+Z5uaTXAp0}vR(-JHS*O19q3GUTf$kj)_5 zr)xpwwRt;m2qB)-7m@ao@n`b13#;riw zpA270h*ysN_Ualdu=JB<>ED1-HWzdo7W~y2-I@>K`bF@&?z%AomeJ718I^(T$_%O< zW&w@~z$~7nvQzgn_Ipt^WcW98u*3}vC$7{>IaV46G3-P0+yH)FXa1_4B4~vccFA~v zLw~WTplRAdu{Z^~^}sM9vRhu^K0(n6jSsKMmEqaGcMsZ!c~el?5)j8vyt7x2DO9e~ z{lzJkpW#I>v3i;x(g*%&0glb%6=o_Ahd;F$f@7^Ky5B-3>E zR}nI#$%u&lnV&Gv=j>>D4txal!7?@C(@d~TaRgx!4S}LE%M>I!;1D%h&^SD#!G+6J z95bn0qL-Y7Izs%xG=|*I`03p8>qLj~Cjon{F!2&-)WFcK%F=Ii}-OOnHk1*toY`=rH*X0o@@2LqJeA zvl$WejIRxKAWw(|wI}ZAq60woqAt8mEyp_w(1izv5|O;T$=xQVs6>nQ5;st{W)XElC$6)KdD{DyoE4paG z`|WA0py6)Y9@M6kznL|^6}6@DSDiWuVUJ|PY+@)k%jez=e7yh!>D4k;sb{wG zi*&2E`XN!X`Lo24Z+)nMtzfL@&@fxt@N!q(l5G!n_t~3ZjeI3IYVgkQhoFsq@Ns{_ zuS&h9{_nD5^j{76K@jJ|_8)yH8+n*~DrR8`xzTcie+)W+lB%PL9Vc5bc)Fux6FArg1n#mX4Y80@0mM*?M za-|6K$rC8J<*AtrdSEdb_p~TdzEo9?uCXzB=b*!H01~T*K@QMQ7d7hIpi{`eAR8ui zXW+FPW6)N32W9}Wr1a~29IXM8TgW7q*TJ1S`lqe@{s2l2OV=dH)mWz+Bl9HRIRIci;7Oq%|e>yw*=yVlPEYPMa|H13tN7_*7|2vy&r{@-QZ6KV#`3gx7NQud#-JhGVAhu-tzJ5XOFz~ z(Y}ASBL*JlAzviP^{Q+=CFyThHcjsTX7_52)_soldL0y{5c5X?ed7LX&lSxlxE7bT zH8eLmJOJ!QLcmKcK;376;Fec{L%x@H+4V|8HDaH;w>%79Bc|;n1nz)5Uluj*XtF+^ zB`hdCc&cphLOp%=a{3DaJ1F`wS}78(3k5s%ph22w30dZ5Ji6gT3XPV!%UO&WL$jSj z+DR1(c7n1@g&L)LV8moBfJf3WDUx206} zw9;+cmcHVli1uV1;>UtD>4TgPo+<0rNgKp|nt2Dld51YBjD2Xwsd!p(0cayzr$O#% zx;0gZ+PH48QLL+ELx4^;Ud7j5HODcPF-)u^WGe|`v&BRw!ic2TvuNatl525)0cDF< z!I>e+SkPQeFhm*Dstz+>L}VTUS^;4zFi*~NP;(M869B$Pb@L-YG7mr8WGwaYsDK)b ze;?*j19w3gR_+xhkG1a3+#uJLSEU!X$`!}x&j-LK#cQCZw@pIZN6hcq2D|GozfgY% zOmUs;{jjZhW&8c{qw7ImTvE{y1n@-k?u8<-G=t=eos7Bh3d{Ox*?^{jexYLUB)nu~ zvt*Y)1U}8h3{no6Era7oa29Ul-Ng@r+|1r(Fh3mAkG88n4Pe$X=(R3XEtc^N;(kGT zbNlMBCR*s#2O9ul8iu%y4GYAhU%mXn+KnoC#6%}wnKp}KUqZU(VODi2FUvM;Sk~aI zYLps&DFr%I33JV0XHhp^JRV%S&bq3Yv1#)FZGQT5T}g( z`?O$eNKltDXf5vQoCfn<@;7j1uoDS62Sa&PPe%d;amg0eg#~oZ6u%FAW&!8 zWV??AT)3Ku!_JpE6udz*BJ8JUMGLgg6L_;+S>BOBetxWzu1pN=;`+)f6|Z#CA90t} zS{2_}YTrT9YQ24}U1eXk%cBOz$_t%W_Mdi2w>1?Eq`UhikG8c#wTpb^jA2hZpb_#L z)UFQ+f+AY0Q!d?Guo8OiwEe8-vNBX%IWio%7Rp`LWR5T^{2g!5@2InZH2qY9?jPm!(1LC zAH_@6?aLG$eDxinu|pkb$%;JCS6USH+Oh(%yIuvJ6_UC6Q&4rg^5wS<)ftXlTo?Ra zvgbPq=s;k9e*{2t&t6xCpxhhq6=h-wdob+Gr$y*6C0%PL%h%=Sc&ain7qeaW(Qw0j}49M@LuvVWpRQ@D#+#x6EXXQt(}oH#Wf9pk9DCIT@5{~imu#j;6KxEEn{yg~^0IEMujYKX91ja}IPo{! zcCM-E0J?B6rl8h;CjT1ms^i9WUcCan1uJtyKskt)?fR;n*$VVP;f!*YwZ@oF50HX? zGI04WN)`!%oZ8FT?i_(#USAA|N{ec|=r4riDy)uGv&oEuZgGGW!IljP#&={#;0n@x!#<w)k2pF2;B{7W87 zW7}Q!`+`$8xuz8~&7N3FPfMik8=9^xPf;$5*)x|efD~*qpX^0gPXhm16IbAhQ^dDu zvk1?@B%7ucQBBub)!BxXA9kx^3DNeORxnhnpwHBr@65WJpF3Yz`tOLXI4SFV?`#>+ zsq?o)z0le!1zrU*LT`v@k1rPBTwb%NihCS9Z?-U^Dh0p{Uf3HlcXjTCzbR!8^F>)i zzx>$Ad|kU}{8wq2C~UTUtGK_ekJD8C2_IB}Qj;?#I=$r!;>~vBQFiP*qQ) z;bhjR;}x$*>!?YCl@a7ins=^4*0$B-Y3KwYvFCH1D*JSR)Ppj!sK5$s zPjl}bLS0YLKvpylRA{X`iFd6c+5vxG>Cj@~2TN>}UT=+tu;;v;%`mrz+6HRx@Qilq z4l*K0G8uA#+Fy-@dTWb|rR_|4U7x+0g>pMv6DNsIKZNo_{NRStb!;~zDK+Ar-LiK_ z&RuzsQ|iF(<|Q*->LVHVW5z+ziLdp{o7s?u*=fpm*R`RdHp=EUUZ-#UT4{xh@{GDn z5HcRI>nDz1h?s@&3j@uy1>R-c8Q74ma7p!&w!KWN6BEciO7#D8WID@ZBAE_7-(lNY zI>FQE^!E*WCz}Mz@iE*zC3bO8hNIdBwAmxRlC@}(EyezR&QdsHY1ofcsg_-2ega*d zYYjbdt)5$vvklaetnSFAda*0&ez(6UyO39aNwf9Pn1u}yYp1^CsKoqoS?dZhRX~`z z`fJF)y0u-``Yc)Lke1Xs(1|6ba9yk)#Y@~u0gG(Op%>WtU6A z*Bytx+5XIpszR%8Yh(qnHc|bLFge%dughohWxigGE>!bau#e<5q}f7`banr9z3cdM z@~7ntP>fO{={)056M7guyY>EXCOzwRQf%ylhy5Os{>8>^49Fn8gaG6PY$H2T>YW?LD1IQ_+Ywo;OAIc z_2*=%@K^17+8xp7%aeh{7Zdh>;x(KUGm!7PqXLKtepJKm?I*=3M+2!Y@h$C6j%%|ifZ;s`g1=E^ZfhC zey(St*OUCJ%>IKmWOJ@D(@&M9zw;fu3Vh~Z*s{Ucx7)ho?^i!Kt~5(TOxxc6lp&ul z-~WeMt}j&K_LZMfXc+Axr;bdwq1p8);uMT+2Gjd|b8G{Iyak^| zpF=)joZ)=T`*y8fUR`IB3njI?e{K9;zcC2<-WR(4!LULbCKmM>!0>yZ_v23N#{$n!_aBUSdjB+Z(*JBw(=()Z=SVn9<)G;(vbr$(+iLs8<6Z8O zceBNn=cGe>8lArze*U2J;YP~GFi)cAQ>6Cr$=bLWomwswTbF7G|1z%v!+{RTdL9&c-!A68)+sz7$NX-7{{s z7|tN|>PA2OyP>Q6JJF!1^R%1lpWosfi^F<)EkeQaz*SXKHyJYw{#>SlfG;+(PYa{@`qKklXeNTLcPopOfh5Oh7A zGd*w#V~%pZ9hvon3E$!5!XgY?baSa*rrH-yhsEJRPxTaU`RnDA&yCH?bmjBb4L!m1 zJB2eQb9q%w=1r+X&{f5jO$kdI*1?{6{~#k-0fm2f`cIZWtHd355#%`&juS_!rVR4q z;BV3meoQ6O;UDSn&(d&$7A5Hzu8N+vh^%C^Z>rN1E$d>9wJ7nC(|SZ*qB4x=sa@0o zb)n8pX3xd)Q2Ip*%@gOQ_nPM@%?mc2yP$aiSs6Zok>!rgmE)?_;K}Ngna9zDi-?i6 z0jsYSw$VN+5BAIlNktF9gD=KfwghGyuXXS2(XmH#cFTqRJ!aO-8eg&i6(OJIfci5b0=B=}3|E3xVYjRl zF3eZGb7+t+Mz}NLjwX#O1QQ1%*72r)g6^TyIxvsMV$|5q>dkhf6bufqTCCZq&tZ1# zV6yq(s>DWKfZVH?67w>$A&E;HU3(52Yi2QDm#2#`200Tg8sasWD4Q5ulysF<2=vmt9J7XI*!lh zbe8In&wLyYg6hqERizn8*f=fg_w+Lor=?U%Y%P){ObdDO2$x79MOwVo7D#D^Vg;yF zqk~mcD%GUV;o%UoEoQx*nwG$aCtX30Wo|y^cEN(48HZLqu0B3L{*H~+8Q6C4*odPi zvWT$OVP#~ip+CPE`b;lOT{-;EjPQom{TY+UV%xWeUBJpGH#i^q-=kRP*OU;2MWQ?q&K;&0i)lTKHzZ@~W5u)(?oB)KQrOr!5OOZ9v31;8kT)K_2H}!d z)YiY3p0>eP7>aZmrk3DdLlxTkKLcMsC$~2Zr;*U0bEqc4|fBOUgZ6| z!&bFjT0ZK#1?p{g2VR~(5&Gt=`|MfZWiQdc?gK2(PkyiDyeDc28PQp`rG-3`QNSE9czJo=sL=K*RVCc^&^fcdySw4QweBcMKlhjWkHq#!wU;4m_QK0`z;iE?Azz-yzSsQp zFPic9MfG+aC3~Lt_U5w1YMA?e+tV5%dTIEwDEhMcdEI>MjV|dkcy4w1!4TeTTdoUF zdc2c1-ce?|bS?e$BWwSYE1MM6^N%a)a#cA~IywDpu9({zcpyIPeQhrGo7nPy?0Wm+ z4h-saj&(Dp%l75Ip7Y z#&&&)**i>_S>Yx^OCV()_V(~ua+l=pQ&aDNw8is{4*fNck+E;j=6d^c`8Fh&)4#nk z-Sm#R-Xmgs;OBa9zsu|7|6=aG|JnTiM~`PoB7%gNMPsknqbM4C6s1P3*4}&5qKUn0 z@4fflRAW}r8g12RixyS1C|bH4@9*dH9p|@myPfmH$)AuPUe|SdUeDM4F;BBs=;+*2 zv>*E(P1oh_7%@}ft>P4w;MS@BDe&v0z2|Pq*CL&4r>L*JHg2Acqj_4cFoiF6dLDh0 zdCo8Qn6G~h&7KQ0`S8KG&Q)DnapKFU-hL>~nMdo5=a9>KjQf11yRV7;W=d0Ksh0hu zdtv1a#OknSNvp{HuyDf@DCdd+9`t?R&}8?zcJIq+j2!=~MFY0?*Q-4mvkz7s>wdoX z_}y&wxOD72(k(h%TIIXhTT1UT*25)j9UIe`3Hu2r7OAc9nP>Li@LN|M&W~;t*$RE#3X?MCw5BnXlkm-=Xa7?>z6{RF=`qCW*b-6~C1$amU@`-Z9+WFN1iT zl6E{=qWG=J?zNUU`7_whZ1|MG(ovzB-r!@Il@={!%2>=PQT?nj$O^)tym_}>J zygtukn^Q345Uo)uSMMQ8xX&c8Of5DCN@=sck zLEm1BfS4tIf-(+%{pJ70!c?p2=u4patsdd~=3ef%s=f4)lM8I%uI|&HC-28tRpoAf zz5nyiPv(k18!Y@+d0EbX4D>~?vJjnjdIcT)k@P$v6P*LV29 z$YtcTG>#&TeKfJlV)Sb&TDrlq^~$$wp}~)2Z;32B7l;>^GmV(0*oz2bojYD;J#o)R zsuFG6Y^iQ`I_@;ksih*>G1KF3O(qc5h*@OI)c>+c9b|dH&Rxn+9mhV&u%pZ-w7y-^!r0jyk1c zcEc%-?Olyad_y?9#0S%jwmM>2aHE-r9PuacNU+{~8ll^LWSy@9-kHEc+svUKoi{dy zjigijRzf&_{4`TsfbBIgSeQpG%h+@a`u5I4t?UA8=emGZTd#4cJ9mT76WR9Rd1NNm ziLB?Vrfo&9m#7{I(VAtBnmJxc&wswSEM6jJaT_<^_-<~ zj#k8<~io7A)o1qjw)uXD;wFf!Ika1$+ak^korR#{S?F?<@Y3ES|qMq0m#nH641bD5N3L>BV)g zbN|6-JEUWV+8jQI`MH=nYQuOu=xTJHa-PIEMqcjD+OCvH>*48cWSp!uyYN3ddL$Z9O5Rq)67UP5eYTr7K=rGa76cXrA! zP3nh*37ZI>NlxST)M1dV#pN`1RwzB@(*XOjud|ACS4(Ub%Ov;5oM-1A=_27rT(C@2 z6`ll|1j%1l1{IM1(q6wpq(z!T0*m53796`ofLmm<$k#hMP5Y=5hPOO>ir75q&)>N zS()m}Z+)@D!#IrDYyPkcq>V-oP1F@i9*s|-N}5FhS`Cdn1-z7?yOQTzdK@ugvhugB zoS2^}r3*_F?k?a}tF;Y_zuXC?)VU{eES2M{7p?W&p4y}p*nfge2z*ZI)xOiwg5xA_ zaTjzi%9-h*C*we`?9_VyVtLn{&`pu#Hp^@{#oA;j>bl{E>WIiEMRa;>NH$KO+!#+k z8&{|9yW78x7h?T>Ac~?*G+3w^@Cy$dC}aI1u3aEO_m{hCSb@sz?#}F&jV~sPHaQAT24j1whuJ|1pSYV6Hm2XVGU+=tg?*{_1SXii z3VMWudPlU?Z*q&|KGSn-e^?@q;=8_lkIIuR>a&2&T^}l)307;{cc6RQDJiX3#r^0S z!58ynJ`YRNE>At!jp^`f9d>OCx18jih5|yws?=KU8}``|d++$lAzwWDG*B;uA!Cfr zza^M}vw(aw8P?_zjlB4^+4wzY3YsEL6nnm^f7i_Fg{5BhazmfCr;cmv_qI`)o-7lK zpsH(IfN5MK9mAEz*RI2Ua7mRs>yNGks)nUT-JtgN{dGM)-ENzm_AC@jY{y*8O0zdt zVISnatIX{HXWI+w9ov^`LrQxL$Ryhs0eyD#p)7Te`o)XV49zxMa5 z{|9LW2R)1aSD`GYbNF0xN-Z)77Bx9~bqGmISchIqJridU_K8)I|A=bor4eO2abFbX}OUS!!+NB zU^WqYx3&y14TxqM@jh@E8$tRpYW5$z|Kaeq9FYPYr3QG#Xu>NICB0;fKShI=>RqQw z)qM^AKL327zZdkZjQ+HW?EU#o3#N^~3o1l-0POs&&8eo(VLXdHzdm_0#WVoh@YRpQ zYeIm?cVh3+`y=8f!{Rfmc!DzG-Wpz%jjs2dfocSG`5LU$irn0I%cayp*V>EShLOp- zq4J^_q{xmDPK6~Tth`&p>jN3}hu4bM(MC#KXFw!@$c!9gj9SBYDs!=nuqO=TT2pml(iDQS@ZE&5yZRY7!1gC^_g&?#-f=y4>&A|Kd;uHPHO$Rx02m9kY5uY_DY;Re0o?KM;Nsb`t%;Hb%Zz)G>K(}sz9C+l*b;Ip-rMZc4)!W-QWfJV>FJA%?8F)mS@8ndO|sr=!H}t;8b_ z#LjJDd`@_l`)#z8q62bY#W=m)g6pF?M%aX zZtHWyJw{Gdxm_J2+|@5Pi0wUiN?mB83{Gchs8L4k{F>wWI;uX zguu|G;duQq)@Q?Z>D&$bm89OM<%CTy*D3>hWzEv+8xfAT?UgHopSs7q)>C%a4S6bH zG^LTi*mp^GRMNmZURfO2ly6|E?BBoDI~ zh^?@K%^#oP2nv5;V7I8MIWx~x#~Y^PI5fB|Fv#O6o?xP;?IGao;<@dTU7ghJ61}qR zjBpMmq(6iVT|wsMOx?eDH3~ZeloGB@AmXzP-vTtd=N$Q7Zu5>)#f{)He(%uM@W3q|sTDSQ#_J z*q->X4WrA#zYC70*pAX;hk5e0$@j;8T8%pzT~lnFaKt?EY)srKxFE7U3}CB5zujTa zeHf2RCog^4-8e0*@^lCnN@yI{+uu3AGS%#!l~z3S-F|9MK| zBm%cnw;#sTIQzk(-TV=UBJ4qE?JP)Wetkq-UzzXF_JXqT^B;B~o7%Fv2Oozu$W`;U zNo*q9xP%XI^s!^oSOOdQwnP8t*^vcYXww^E6~53fcp1V9&2Nzy}Vm1}s zw*|&e%Qb=tv3R4W0ZG+trX+FamKyypc!GX_s3ojY2~mkBiY5=eZ+;Rrg4^-@%B;4= z5xuT>fYVeG0UQ{3H{s<)-e@13Ox!*-_cCx-4ru&**VQ<<)x|i05JUokF@^#5pv#y; z(r+~J`;Pb-{#@J=VcH-w)$$}R;+!q|E0ySNxF}%n0MB>`-n0`BmA%Asz3FGgSgCDs%Oc$SqGeGLbQW}Co~hxCc0=6D z_}{LRi((uS`}BK>b2KUxdmkjl*F|)A6Z1bC;-lDkqlMO;ID)=i6BehwGR2|~wH zu;U=7{3;#^lD37ws|W#zG4p3U8oTM$Nh7o;v5LO!yg$B)M0}%E;br)JSBgp%Av&hF z6vc)jid2$RCem0YiEM+8*qvco7L1j+G6gaMF3N+RY!it+76kcGsyLxFKc#tA*7R2E z<#KbPl(G>~!PXaJSa&n)+#2-;5Qz*BenDOPfoc7*#XF{Tof+gk?M zNwNDH8Tk${p-8MD2`d_LCI?}%j$$Jb)$AiqP?B0Xl3W)NVo9#yzXiC0BfyF~0;0zZ zy}VU&aW{29V+KJ+|onM5w7oEARP> zQ;SbhLt7f*p#hc_#di~>K9iX)Nat-QpBnFV+0s(?mp3HXH-^dtib;0sGeq0n7VQ{ z^eS}(hdQonevs49!+Pu#51>#uQU_Q|K!NN(@5aO$Si(SaXLwOv3VUVPW^deDAV=y& zFG%^5SZ9P^aA~u4w5F5z?WGZ_)d+5wEf6E~g=#E9M8zMA=XUQ4veb}ZC&hD-fbJtP zLE33OvWy`?Ws=ydNd$IMqlvB(;;jCGqO715FZyH*IrdGw(U`k)i?elv7By~T5+US& z;`}Yb0rcV2d-IN&uxceKMr8DKaFeezqTX_r?=4IO7x}2auWq#!&jL2x1tF90h9u0_`X(0SlD=LX1Rh%O^bo`x{fh7>r*uYqaww+*ugVmsc z(V(I8Al_2?sm1RJyTQrG!P}vsRk@*|NEa|wWa67_-}+rlC8s`P+(XegCXX?^s^&xM zN`k0nh2Jm+D?9Xggg0}9mqlTL_wj;=!b?Gg2Jex1w~?`1j}ur%>vE^+xV(jp4~EFD zVRtt!`>9Kh6qa+s8iGM9HIG+X{;Y_oaLIg+fBN|CtiroDkKe6@$z*HaURPNA@p$dx z@ms?%{n=`ZeA_sySh;NXAQ)R<)-R;^o!ZCw5GB)W^#$5A*+L(sTT{50L=Bq%f< zsBpK$gU>PiQ;DLx?%y5SzczM?yHAEdf2BvJzS|r(3grLoA6Xa1M+^)rvhJC<7BszC z3+Gi-yuA-%#uN8-K{S_zm|uz~w3J^NC`EJaY5`zo_}JgmX^ue<4Gt`7J^Wqc#`);t z$#J3}Qk5rWO3-?EzV`{v8hD&_vDJe5Y*Az*?B+XLm zlE)jVMP+NoM_#Uyd_^|!~8)X0PN_>q*elBFTY$v=G8K#6aonbYkxK>u;>ds{YiJ>ZrWz|EIV5E7|R+D z*0ssoOw}{W7|3R>96l~Ba~Rl(gM6Q=Avs7vV`SsDUx|zPj>pY2i$AI)20=wC3*Wdq zJ};0B`i@&Lb)GNLdZOAeuSv;=d>|b9`Wn}IbP&w8&ZR5xd8+1nVME(PRQ_X%(GLe zetT*f7NFco$!r$mocA4E4z++%aK$`xVd6@?Qp>Z!d|RpA0g|68TKU)T z0~N0R`lB%#U3sx;>lCwXhI`qv6Y^=UA*w0H`ZG9%VT8HkMdWur4rdNBnE1#I_8j7e z$NA#6tumC<=?>TtX#WNj_a3Z8e<7W&mVE}zAA7<|NuwFP0xbu34~I+oVgaxzadPXx zklhKnFN3tRkw%tKr0~6@`BLL*O*7(HC!4B@a>t0OmEKvigpx%{Gr})knyU!Zno#5nTPLsV{`%4$T^{GF z$rnWC%VaNArLQE$#&Ws8uB*tjl@evv7Kdz+s?DWh1V&}5*6=}7m3kTNV+=Mm!S6CH z%qhypTv za<>>PVn5s$ej!yxzozvJ_1j zfw*uZw3KSWs+s_efENAz$%@!!u*)=<$hBpo#^}TNp}+QHY06onv~eWJBhSnAeJWLx zri!Fpef{CIC{jd@?LCda%InfiL~()MNPg*BL6o<9b58 z4FE1%#84yCM_G9Azz-6W04P9_)wdFWCRm}F(iPE!7JxWz9Yb4_WPQ@YXlA76+r57_}G+mP|@h~vudOci9Z zr=eulyA2(=K91u;L&a3{8I@JgNK(wlD{=5_u_uv80{gL>5{07pGb$t(<+}akbuY77 z|F-mOin=YubJ?5WE3`Stcxx3C@9VOjo28sb++ta&%ITuBbY1tOn{6f7qnS2SD2P!f z{m)Q5BQ2a+m_n7A&*=O02Uv2zj&@1(EsKe7SzYpQ-0`yo%WfYg%2%4o2IYp7^^ml1 zw1K0v!86c$DyOvk=L^@vg?i%Y35H zS2bBtA^uikJdIjHrI|z9hQXtLG$_d^Y@>5moab4Zf#xX|a_O=_Qvv**bZskT{6ZGb zOk3pW8zt}VYfrnPia(rSUBj@NODl63zvo5tY%9$W1ie}|)fO0kQwh}eF`uVB2F6H0 zxoHy8&+7mcI{ThIv?duk(rsCHE6k!p(z~-&X_s+YY?%#A3K%Tyf$Asa{@6PW)%5i1 z(*-KhVv3N~gCe*nFDP}`;YH8;pmk-;A=NGZ}{MYe4L>e3*U;cN=tra6EUZ3Bf8KC00eX-mc4bnmZR1? z>d~SS9D=g?-l;H~d4SP)rYL-3%o&vcC?(f%j+M8?Moy@Nti9dIj^mO1=ySrDBY|SV zeOwS!YJP%K1zoa z0aKhD!(yxxiIYS)z3DhMt`ug0T}L-ymA4p=Ao4g)N>#>jPRyaZQ`4UM>BNsIv!OH> zZpJDz1I6{p?*qwiW=i2v+^ z$P>lHrrDQ!c5A=Y1wZ~UtNf$s?vlEj_&RI(#k{S*4ouI1yO)To!=@NXiwUXq3+?QJo^ja*}oej`LjW)2!SDE@K?0vT=s zucrR#9Q~_fn~uWvW2)G-^|;}4fa~53j6%Qqr+#7u|5^(q+1CAWMSw1}+TXfrgN$wI zh8n`w>sk=8`T%#Zf_IER>M>rlM0GC9L?1rj3^zvoNlE?N@5POcF9zV8BPP^4DY<1( zd(FwPplM(O^&ibv$bk1>Q*YovJ%n8lK5GY>jYL?yK(wIRLfs%1pk5gcD()?04=1IW zC*`s}^A0D~0`G zIW_I|dD{8u>&kXa?eHJJr@SK$XblbMnkp*$UDQI$erWq}LT!FfanSNm(cLj%2=c+H zvt$3WBi8-DfoDwr37&~xHpQf*WMyR)6cm({l~vW%w6wK!{)0U;HZlH(Ju^>gzkAol z*4Ez6k6`cY;ppi4PiQQw$E`5Uy|K{aU-DURg-^sopY94@-vHmLT;JB>OaIJ2@{xbz zzvZ+0$+`cSXa54v{;i!wTvo|0!L#s7@a$4Mn`n;=fA|l0_HXK}E%I4+R9b#iRnaAQ z788?jsh$0UoYfTnBb;^CC(b>-OqeAVRVOu+C-pZclR8pT(o-L$r`1=bmp5iS{14l# zxH_Y{BZJhH+0d8S(U?hE&uXsC&d&eO%vn|8C2aO@)vWwqs#$qgM@4z%C296QF|*p- zod5L9E(>T~4gF({Po^(Dv!=%bO(TylRkPOS?*CTJMxXynHS7GedVYV>bV0|Sa$i4{lEELf@dE8r{EdQ|3mQX z+EhYTchhQ*_s6OK0M7=3kN*oiJCNl52Rw_T=w_TuF#hn=)b4eJyBm5~jm;$Ao{?R! zfj7|u4diH5D~Lp}gq!7>SvyTRUb|9+%p*8h6c|!(8hW3SR*_`n$gc5q4lpu}x6?Nj zp|n~k=1o+IiJxGvbjl~P}ykPI?F zy`wq}JK{<=py^aeJYrfW0(nA80R*OfeS!lRYjZP^ysmuh<_jRa(A}u;HdCC}SFS`b z02{?i0|PjH2x2la)prG~r03s11=dy=$XUvLklu&{DNZEa(CArkt z=Iy-Oj%=Af3-E2VOfZ%9G<#AlMrgs~ZYS5}>KkC&^`;{mb1OWSO)-xY)POFn7P1Il z;t0!t{3MGzTIsc|1P4ez%b=?loMU()p#Qe*5fxV*p2Ti+q+wx?dXLXy#FW4i<{rfT@fEw_W1}esB8pA~r4CiquTsb6~gg%|q9zBu9G}itY0pjtng4s3xTCg)}lk z1yKMA#W7W{1%;ra1%}lRESZqJs1u$cvDDKMxvuU?Je#_x79@9NVcG3vU*Mcu@b7C{ zt{nGbRvov6FLs9Avf5EZhjuBzS$wzqGkwRFDx+r*jDI1JzFQ}Cn8!lDwJk9L6rOs& zA-dg#4yq)m4~=u`C0hU+th;9?`#pA?lMHy!D3qEq;D576Njr_M$K&0pm+GCz`oVT? zj7?!WYWgnf7**?^Dlwc}N^TiFy3yO6K_V|bz;AH|kmNf-M;u@gRrLUTi`!fnye(z% ztBtPpG+n;e?b^k*2M0F}=<}GBMmXg+SgEb{m?ne1I;7s~st$uDO>(9Gc=E`)-h*zY zRD0sJV)R^01T4=Q1ml2Tmx4Is2a^)=!V;*Qi zEdMA;nZJT&IbuS(--kEqK?Te32Nu+Vh-lEvEwv$3Po?$7Bh#g~EP0ccKB)&bV#Wq` zjdrxEYnDsepPU|JL!q)R7!zq}8wuekf5Xc2sE2uybg!2Qx%)hrY`E|}{l=APWYQyk zCGeJbotmavD=-Z*!_hsSsuo9)MGmY|R?nMGnOsQk&KWeM1HWcMX7|pXy8Ay6=1kwpQ zUczY$>G>y>e7beo{{uX8(ter0a&ift)#(LIy)6EDQllwLsUIuQWMx`Jb4RtCS%`jFj55gG8EIyd*RJ#i2xJkS)ib(I?$yM?f%vo*R zhNHPOLrq@ZfJ}YGeslqNSxvuf3;kqD(KRke2j^BP>n3*V3*Y{^{PwG|y&H$eCw@xh z1U@PJpo&Xl(3@!#G@U+ch+9NyX(53awMbv(tQN97Z8h8*kF8(wde{bv;y^NTRi23` zK|V-@yCQPjR;T#Hyi**kez<-xV> z&e2H@$V8^qvk93OZ7D%BAK8ALJ;i@L3Z>wnkaFxYrVJ6&-J?h|pPMMtq_?F)^rN_E zGoMlUv}bn}((sCK)2k09P?tJ8=BcX$iTQRxyZv(5oE9uFgIM<@eK> zok2;hj!Z+Azu7~Y9F?if=fFgXa@#db z&!%0)HEyzSySp`{pJFYQalap18FJr%>hlX$>w1}cDl^MY^HBPkMLIGYkj3p%grF!p zrtNGPshk$ir1J$SF$tjy$KMy%A0AU_8&Ky{NFVBXyAElCU~!GXNdOQyp5bPo2|hB8 zdf+$g z$Vd|8H$(|#DE16%vIZaMpcuF&m0X9!a_}8P7Kd)fL$8-Q>BZc)SWMJYPs)bV z-3mr$v<6WO-=*wD8N%RYJH(RgfGb4%ieOhVpXeICL>iyqhNXmi8et!uQC`jzhOw+4 zzq?eAGB?wp+gN~1Of`_pNr(Gt1$cEE6ty34BDBvN6oLWAU)jr(I7~VP> zm5iIhvMA*RV!NiFm`e;wIuLISf$}8K`D85(6PY$r?(HNy<_25?ggx^1o4k_@b)itO zj!=_DDWwKnawKF10r#-MQgm7O#IhKMlWOd<_M9nD&J;T)DIX`Yzy`^VnxUiLA@q*P zGI_q{XKr{D+1uRgQhG8&Y%Yb1cjr!qCwY#qRRwL&tbyt>>%4pY=j z2$9ABa!WLuybom+Qh191q?t@j{Q)ubM!5zQlCEWUTj#UxWS2u@y0r=+1`(UGo;!8L z`^&|-y=bEylp}fZ2tO*_tk8oz4=|{yleT zLFARF7fzT}f2a%i*qfQQi|G_aW!(4I2BS%6t?YboTUF5$XrXg`_4{Yl(ylR8`3>MB zh_MsIQl=bPm$oWP)Rb-@tkkT_g%MZE{9LQ9xD-F0!VLGL*;1v!OE-o1s~21#iO;g9 zSL$9&)zsJLw3`Ni*aH_`s?F|KvC4sVs*7HJYI-lz3}mitpK9sP_wDws?aKEYOkjA} zZ!vFV&-Sa0Y`%H0gE`ru4rW2MTam8V^a_s+Fc6O#iICes1Y|~&=Jg*8?;n* z=Qf$SvxBKW;0_tP38c*!mNp7eau6$1S2ID~m=oL?AhTb8DAPIiHA<;|4q%Umg4rq9 z2r3a+ye!(fSswwjHjDKJ6wD!1a)ua=8ouleQIxfJnAM-lc?u0oTwiUG>VLvY==BdJ zT?3E``3l7;(2@IWJ0GroXo#Wq|w5-Wa`$Ru zJB8*Pys7nmL^X^`A82tH&RrTsX-#$=f5{BOar!{xRx+={IHPsIp%X=>KCmDaq>&2b zCP6e%20n*iE0Th=5=9f1!V3Vz9YQroAhtP}7lTHAw)?9@zmU0VIZrXtJk|5Lzc&m1yscr?>WA61{LY*GKdp zJfC{JFQc{*Sc7-QpbR3xfJi)aeiVWejb};)Ven+$9%MK?lQx_GznX$V(+Bh@@ywv>BhqANiZ>bSOlOXvz0uV084Bo4@JScTH$SY*2hhV z*tyH`GezhjRJ~cyCzaem)D@?<0V?aqUL_fj>Z9^IUTE3Cc>2D6-_1TGpp zf68jQd~eW&XPv^`7#Tj#(bITdv34s%JP7+7!@8E(ffA`Sr!?5!4<3*oG-}l<0cr zy~_goER+3y5~)|7;_)dX=~InDdCA15hN0+(#VDfiCtZu(u6HG8pnw81n+*k<|jtaJyh{QU-Og1=~>$AdBsAj;qnLHzdn`Lp2Ya<|5;V9U3ARUOJ9U~ zp>J)mAGI-h*;|>TY*NrklDo-8vs+Y8&mS+t**tH)RS3Gu>Jw)(lNdH_4Yc7lkpQqIOA^&LJ zH+Y{$>12{k_l$?;Bp1_8+A0>-OAJF>TrI!*sH8}{27jw5rGNdaXO81TlG4| zetvVO-Vb?S>n(y}#{T$JU+8)8RpHT(yPq4G*vge}{S=z*rF_yXY;#1v!SZsHfIx$; zpjO!QnikIrEnMfkZlKsvD_PVB7oHRXfCHDw->z22C0}}rE^43O*r-b0V7YKfzT*8S zz@4IMb}u36r^wv7{CaJJ*S_EVl9z}&ZLPmF_fX*vJG$3sdT*fJVKj-JfpGrJr!$2(p9$-oId()U%#AI{ht_4PrTgBX z_YUX2S*OeEW{1_qFBZK%TO3tVZ@%6g3_&k`X!t>ZJ+=}mVl_q885L3|YF5S_+ZyMy zC`1fu-Clo|8%NzARcN;3P@qL?BEK&oHd2a=UlHG>t5bQdV>QEdguz|RRvBg7dydF& z*sHR6noVi>_RMGVS(b>?`?vIK=J%hlm?_G*+dS8fjFhsysq^}2`L*{uaUp(N>D$KI zbW>)(f6huhDpuFL?=)LNZb&U8cOkf6mET?^U28r?DgIvir9fHpiz)uH4R^6=S%hHc zp)yj!pQ^vdT-J@Yn?7W^zr#dszpKucWDP;G3?wU3ng~!=Mc#w6L(&~r09B_a*F|bd z?8`sP&wrPh9Lm;-{9O76W!@wO>zdZYgUsv}Dwq6k?hBmLtMWmG41NoYkV{D(>qx#d z%21|y_iauXP5pBuTjnK)LGOP1FLE91Xr#f!GgLeJDVzW1yy~m){RbY&aq!z@{VG{f?E9m`4PY1y_ecST2deZ0@&M8WNSy^oS*_~() zj>Qgkm4Qq_?_(7Y3k&H}X?|~)D-16U8fdat4C!hv)HV_?at+r2klEMVUB*qT zeAnrNs`XV~INP^sFY4XRy!h3xo*ksPLu_p&eQ4U@>KmZx%W`v|CxP#%HR*54eQef; znsqpJg*(Q{mCx@UDH4q7&TJL|QX*z7Ro~NGoxS27X~uLf+}CdIcrIzzYAF1s+`9qy z>(qMI_yK$OGTkGK-uOf&M~lj{`uIql+Jn*^qzfmG#eKe#*5Z|Z6x|1Enh#jDxHp?v zNp+hoY8BJG$b+G@pR3ujUyHY#jEB}EUq~30jS&s)Wj~@U^n4y3O1!V(qEaf1(1Ya> zg)lvFB4f5Rkrq*LP;{bBtu2iSqa_P;KH-`u5t+D`SfE&WQCKdt<;-()Ws82R^SM%! zA4g&SgB?35jgV>o&Wz;o+$gc+Xd!&tuiRSaIBDTLTu`I$!c-_j2Mm5I`1-Jz)vupuwu588u|CS6 zJRB?0ilyauCZqWl9LI@_APd+WrH39xUPF!`+N_6_a;>9fbZntcXG$#ZMaczB*)dd% zWArDe$*Z_>P+sXr>XR&DO~_=e(2co+AwX>}lJ8zWLU20?~i*cptlYeexaEH<*Zk5{I399NlZY zo<$?@ez$0`5J^j&S70QO{D^~LwQfS{MR{^UZ8Yw%Dgm^@L2nhTg3xOlMyzijgG*m< zi03}xF*J%#tll&88XbGu=r2AU^26 zZ7TVAq%w1#>RqP1DvBJ*KE|(`60EINcDG>|mhKlG)18!FGmg!-Hyn8>eeX7;Xtr>3 zs6voTAl7Q%6-PNGiyteyE8J{H&HaJHA)dz~$4mBQk zG@{7i15!@V5{J{YGV1SC&S11IT1mvL2+wqr+ARtG1$}lNdNmiH>%6TXMlK<4wY|FW z6lp)D`S|@}+5ChT%73NSVypVIF6<@;0=xBoEF?P0G~@~F-nQCN<-K$@BI#&)x6Erl z!0LOAv$f2Ij3&mj+-$xmX%1#%p4yLd`-^RRuUG_R!6wL=c(%PQEo1f>`|58Be9o5J zY^!=cNeTSm&(zr#uQX|_8s}T(@|r+{;rix%@iQ7~8RMVk+k!cHN^+&1<-a~d7xUG-HeuKRy!DhC!fwJgk6 zTBjtxxo^3+d&$09`RbqlY0IM*pf1Ff^0HtpG+RbO`(~5+_lEz)+}nTkALLzxTB|aaZ{3yVm!bIg&m|yM5$r*Zk(=cvImv z`N@%b_Tg-%NEOe zTa2!(q$YpJ&kXNh3}9oVVu?B{N}o&Vr*tto-l%TR_&`cngT9kSFdh96f6qqvN$Dd!i{&{LfNyd6+%bU4XocOsnq*lO*LVHf-alpnY z+kQ;e1LX&K=btO@elq`Ny)U|Qwcy6W9hkSV`L6a?(=)b<_lyh6ti76hN$zJ3dD@xN zxgEmMLB2EL9~}H2@0z!I*mj-$K?(is$iY{-^j}&llZlmErWf&F!VjxG@2nrD_D>wM{Z0&^y-7-iCXn8`O>8vwGNRGPdreUf4C>kQpIm zqm?@#2rL7lRaAyjPNrE8QBl}b;@L%y?GnyLq-(*eDf`#C`U$ZLOjk6LAd;UX$TwWb zO9|w3lCt*1Kudmq2m^wSfhiS9a{q+hyb?)w-ET|O1CQ?Qi{fCCM6njV71OR2=a!z& zP#^|%ld$wj+lv);pmb2k%m&76eXtzykiJ)x1p|V=lO&;Em@2*9)}<@+5F!*U!@+{W z|Bf8M?^j!?Ag(SLfTSQv#4WdinGx?SjXJENQT4F4?I<3yYpVBKaQp0c?})O^>%sSu zm36I#>YV}cByyv{sxCsrPlSk#i=|BVko_-Jo_UjbxD6CFQq_qm-FTtYUJ$9N88v&j zHEWy<`V`a#bgEH!hrUAL8(Ff49hS@Lfho;F#<&pK9;`?@R;M11$GG9iYO?5qled|T6uriu5`R;#ue4t7<81*&n_ z_q(hsye%5$GSUj1=jGTcd!-FQ%j5LQwff|5`9VPbgjGPnL{jjSJV)<{!MtgZbHQrwZUvNQ83-9@PxOzsSv7) z<-zm-LU2^S)_xj%q>uWoA4O`=Xpj3XIk$uwuZm3JVqm(XLjJlh!&YHPXBQgXFAc(L z(H@i*-9$aMO?+8cMS{h$asKMtF3 zmYC1?QcGl>dT$o*1Mz6wjtRAW< z|9ICRL@T4xMl(3gS$x;Eke2SO4OAa`Ltq_D&{GV$#Ec^$&<&ucD>v9Wn3d05<35fn zKUPF`<%U}-l37ZhR_cNBQu?3fjGPr~dsCVFS-uN6zgKT)@2AMew9^k7(r;+L>e7t; zZpyO1Pzp7x+cRB3PcLYh9a${rTh52SYF103B}P|`ui_ou!y_08 z4?RsR^YPpt8eWC8l_tr0gtkRx$$Hnw>Yf{A4K_!4nFl5=9@;OgAFhl5R^?b%y@V{x zCrvX9Eh0Ph;bfC&*5#PM>GJ+`pL4lTDHE*svL<%9_93;v8TySwNywH-7+Mf2cjrhV zKcwEIjT8NHU`2y0T7+Sw-+k$3pvL0spCqbV-X<+2ne;uvxvr zGA(GMigqJRWwHJ+@;%x8{*8xUUsX_%J;MIDHx#pAoNeruY_&%HZj5!f6ug{2V--7# z&dFJw%8|3Z-^#&lF!!S0@%M+X!dn}sW*C%Jg8sUQ#^Zp8k6#*pz$cw9ChIsz*&LVZ zSS;T>3PoK@nXR2A{0&u85uU4I-Etti|53u4E|!F{cLqf80ZjKuQ0T*0;O%M#@v}?& zq6Ja$qd_U=5jl?;#nj_j(rpyu_QHe(_1%ZHI@@%)?<5?e_=iv+Yl##leQ&`{M#W7g zRh8Wm!@WB_BMu*kAN5?m!ri>y*F3soyL`EItYZ7x@OHkwNd1=#FV=Quyj73cD*C-$ zm{|qowry^SP4e%1_em_oo^I}y7}vQz@~Cc)l#C$#$eMLl@c7TRhnyK33~1C~p+Oof zb9Wo?bC6fp08ZDH8M9*Kqm9(1ROVqo>8kwL-&XxQ_1T`r>_mHAaC#tr?|bK7rYMm$ z*rx1kZyKzj|M&4dA6pvLeUt7Ek9|9x(_LpDi8nLmzA^iy8T+C>R%d&PR;sI`Iw_A@ zXCLQostnlMF4|Y#SF>LnY_)U@Td;5%vg7M^ydci5Yg_60aUigGP;YH&DQGXEIB2Q4 zXD4X)WR%o0Xpfj+n38JvCLHiFzo@j7!SV8kJ{w=0?%%y%+>8O_@`VEXQ-09oV8`Ik z%vvwNub+Umf9yVCUhn>46eb&LVz!;43h^lsbNQBf-~Ub6qC-;?(Hw{hrJv^E<6NN- zqx)G-iwJofnlpYF421>T`pj-1=C2RYam#3X;iJ0Ct~xm5%XOExqiW{XT9$qWWT#Qu z^`dQNSUvd$Z2&mOF+<*mT6buV7_IK3~YNEl_ghztGk{u)5P*>g+_l1=d} zt^Ipk|CBil=6dISOp~f>213K~5cAMx6e~M(sh^F|3%$FhGrNP|XRjxCC_boPqo)Vv zf$N%x&uE*01V%tNh^o!agSV^~&b6Cyp>`A!MmQV0z$gi%(t&jKqOKd!AelTlnB0?_6*0|5nt`!YQ= zAti`Pbb4z4L2Sig>alfi>N=iVe%~R&zjajq*lI}3JIvGA#!aX8xa#vPVFn$WQU923 z#CR%CqYvc$HnnwhM)h1okC}+90y~Q{$P#uMGBQb0HO>wJx3hs1&2H7EI+(=JhrjT| z(}8!FLT)Y)5b<=ZhF^#XL$RL$%ml-q%xe@%d{a#utSXmt_;Di&Y#|Yg3dCJj5wwNr*az>A}6a(<_ zmex{ZzKpXg#V?F%I#wbd)>Vvw>=&6G{$#HYmGwB4Jp&-n!qENk1bKYjdXE{wr^0_D zDRDGhxMa%1Sid)+oVer=+(p2f(3g3>uisp#k6wfTE`x4-1L*xM0hh1hd_!Mjuou2J z{_ie$mwjJ~_yyHn`Yi?f$I;-Ff zqAxQpE^%sp+3dgklz<`heoTjcuip74KKK=X;1}@PKUoP!hhsDWuvwz7urOYZGpzI( zp5+;ycRSv<;9LtQUM!kTiUI72S0&jP`jLank^wA~AM#68f)ZO75)bCxh(PqXrn6*k z41F|V(4_bp->V-=IH$vX#zj%^@=CrpWCSZ~jp2f52GQ^d)co!_7@m&}?bA?fALQjC zB9*>`->U~pSmS2c@h#&++MprRN|5&ta5HbfGRqm<7Ev4?oOd;GlE+vjnBYyzRbdW8 zX!9HJ9R{#45~nmG=qvx5uZl4{0&E8Go^FjAP-q7V$F5Dpf7%@AJbR!M6?^i4WaTQT zJK!oL9^+;Ud4??8&I5Z>;eD;d7s)L1CyqMK_>ogzwq{y%92c|)z^SwnPzgDo!TPYo z^x|%ZXB-1KDqe$X=dYYY(M%K;4CMpX)IvHl%YEV=BWjki^?n=>M@X-9rrV!ih90HD zl=!p>&7n!Lg~3mxscOusZiQ!>Y2xnxB|I}IGpHFGP0f_1^jsA$i8r3Xq*NvfyZ#hf zZGN)U=>Ey4U@5|GbFO5Bmu^TeIX)SIk zT*1$qVaE_O8!1FT^n3_bCZq=Snpm0J!4fA*M+xc@Nv^;X6HMdbNkVg)h?;dASHe9_ z6cH-wuzV(7o_usBQBKo;CJC}3yO%=Y;9{R_C~o9{vV1CcGm{PyUMUf-L^E<^(GAM# zg?hB(wn;@-{duE&kNJ0h_%MDA9AYRoH(%1Gzcvl;br>bv|<%d_eT4hgYwr3NSl6^yIQoMo-QnQxnOaJfBt~Y0qH-C>sdI^@I&w8n^s=Ovj z$bKhxEag_jw?hR2o|YKgiAosaq&I3F*H^;w8ui|7tDiS_?UGu0DEPf;$tLQ)^vaQ# zne?hlRhRUdd&eK?b9q?p(imM);;X>*@EPl&^5E8!+ozVs zEuklIhHNjG&}bQ{O7Qr^T8pS@4Ff;OGyV|IhkyUw%$>=QA^(GN>hJBxlxEdk!hJ8F zLh%dg*#5%D*g^ceY#?8|UyC2{B0c(H50O!jRaI8Y5gL`fb7_= z6aE2wL6Q|eH&22-#!+bykUf^$D~}ab@9?ci^9R+O(%*!7tbf}kMCpBG6Q#WiIgtvV zKw~E8DY4a&`4%B9vLRs~Dwn|p`9qrc?kIRF2&ruY{j)<%Fxks(t(8Rkxv;`)nTJlB z?;%$?R9P{*fb#Jfjiau;vZWt@sB#1=EKW%{CFD-^tnC3`Ykit>whg5x6vgxgUCj2a zAX(5*kgp#MRBBO95kN!Q=~i%AiG>)}t170;kxIqo6Hcxl z=tt?P5Lcs_r3oZy!na7-6<`qczc4zJbd-?Tu2^7WbBU#4sE}hpw)w~otOf2MjMN{s z5JE!77?baOrHag6wJm=lX)VMSf|bbTq+?js0#=NGHWhd(D$zPZw&e?wgTNRzZ+^4> z05@=|JWkyc5Vq7yW%A_A zpSsRxuqo&(trNbWkUbYOM>?3qQFe{7&-r6j<{j+SjM$&Dj5^Yo)B8;h7b`mph^Z@hmWN` zeKEV2I0M(isV9NIP4}k5stD}oc{t80`V7jyg-En=Cf&9?CHk@iFl(>v`L-;@_`uw-b7u zOX?9-#YT^|PzZON35CvP4>G1>zBNE#t5z<^?*( zGKDCeofkGA8aUb-bBA?xfnSx?Psh{%mQWZzf#^tX#>Iismkij%ONm0IBnuf8Motsu zs3fsQe!w!GeBD};Qy^hZKWlLyaXzxZol=QTs1Kh=-P`lG=s||cuUY9AKdLONav|5| zz;IQF_fyv3duu!Mg>>FmOyS2iNrPigTFh-}Uz!cbr`FvMk$S%D5JlhzS9?7~bHId% zAfdhMGVoX0^7)OATjh_Im9|9ctnc~qmPS>pTR|5dOdY1y_vy?=$<1=NYM%XWl(+FC zPVdAQTz*B(!uiYL;yu;V_z-HdZTwl0e)g$&T-o?GQGs8J=%a*UVrY#^N=wtrL36M$ z^Tu~a3T^^wA`JTN)?Kv`Vuwm?b5U`Q$zWGQBeC*bzQTRS0?>AK_1+O3 zGK=P=85(zFf!JsDyI~|IyX-|Yr~}>!`F|IY*<-%WSMQ=%huY6LfJDVud9C=}4FgyVwoVO{Z zvCPOpt7SY&ngIqXR6;=kTP--{71H<;Z8ES8zbrs{*qAP3=mEEagQVH^enU<3e3u22A5#W4HrAQ(6Wp*ws`90&zY)stT8b_AO=h}mLi zBbj*%PR6^62VKTcFb(jnVtBPd96`2x8y3}G(Og^P2@pz-qGafWUn8_=iiAbC z;m+H<)?BFOU^;?Zrwl@5)%JtX>bxY=5d zJ4JHcF^_Zx+(LC`qiqQXxb854C?Px40E9>*hLIdabzLZ<8q645i1gWm!;2+&KnOg< z13DC3pjbV17k*MK+}r~Xw9%mg-D&55edk6{fuNnmGO>HB$@aDmsa6q_Xi9FWp(6EF zJT5$huum}=DN0{+SD6WW$G$|I90ZjuHl{*RY6r`37F(|NDYe=lp!U{7B}mylxO1T} z2+4peLhzL!4Yq}zJD5hY(2 zI^l?TKo~j5*P{H9Di@;MNhfwE@OU3dT&zz}hEV8zt%@M2FQCJet1zH}d~o39Dx9we zzyJq+cLuIAAuh>*Fn}-FKnpE8ixx%1a#P{W;cN`jyLF1k&PG?4=*-Rbz}*1me&vs* z>;j}gxb^~M-$9^7-|N436zEV|bo-u929i@B0F5m029CaxqVV_txsgn<0u)8C}2|c!Si|{CIbj8;J_0XajQm<<()s5=##xlf$pE76h{6fa*0k z3p}|Vohk)74h-&P1EmRnGGL&hRS^8aal0)J-t^2PG%`2DFhuHin}z2sP< zZwb9HSg?OgQb7DxJ94mN=o9MN$;zl0<%c(OysJWUQt;~-`TaOawEB%O_82|gvd=f9 zIk*7^o6}+it|>Z<5trCLbqBl?GNd1XT^KTb>X{%*i@hR>JCTA+iK9B`2B(;?oopaV zw>!%9eddWOb$?fKIZ?l?;~NYz>%~EHRHzsWZG0#kv~@hssnSF~Ms1w?qJaRchsPEe z9C!^t?+tOf-2@A;3{lR9JEm_IMJK~RZ0(#X>mS`zCQcCsAk`qdZWD0!Dl(gxIsd)} zaNQh4^AxGwmv`p~Zht$_2LMRnUW!i*_ zk5A+m4Zs^R9WP#I7;ijWkg`h!ezk1SuS7L^IohMScV+0O)*7N^L^61SVG+0qSKY+&<5bBO!GffOEzWL$ z5v1bJTo6D>IU#5uAdNk1Pq-$oo#rM8#BJ7+Zm% z9r#Yeigzd;d@PAam9NhdA57mn21C~h1OnNhpo6}ZR&w@Y4yw@lRlkimKyH+DX7?^AhNi|4&tqfbIdwc0te`~JHKZ{UE|X0+t0K>tFWo^ha;(#SL`Sc=h&J|$1?p?aBD_9`qHe&&vOk^Yk+ zpMWtR=j##fhl6B(@i$VKP>#|}4r!SRo%S2R;A4@*-V5~UG_15E?)3b5YVz+vAOOcN z5SS342M{6#kOLg?2!LU?)`5R~1De{#uL~R;pSXMaK5Z?0cIy&&^Isx?wd;n z4-(DqLp&!A*XiGTHftH#d|0^dk- z_mzFI9u9&jcHuBI=P=t1)r0SCP0w6BfG+w(~v2*D@w_CuV(eSe9>6 z)ICYlT4!6Fn0fXJLp&32_+YlSu*${AVCfMl(H5ybuFRxbZ@I)$qq$~Hh3V!A?e9oZ z&_=!i$?Tt>=TEsRweidLex*{cAlM=Fk0#n0?9?^D`^U?9Cve#5?^-f{&*Hr4v8S z6lvw@K3q9JUT$*ToO(6$tggD&IDi#zdCmF`Z-iHh=j7;hF~r)^9nCJN0l` ziCtQvFhZzXN;^{cZc|@mc@M*G%>4yyk-7vG(oS42rgb--f_OA10mV~cezBm?R4_7C}N^2GuV)(`mVU*ed>ZCXerV5yh>@k0=Gz3#o z8W(?cR6$z{;im~>Dm<*jRBt_YEnghdh?6117;StoqU&-aPi@9pHq$X?jNw418^{;qx-Q|k>pdmhRl5hxYp#GBa4W6ag)W24w{ z@gq$|BTQ?3E5?0n?fUCO+-73)E65fzp_w!dwj)h;ryTP4V(0c2m_^rY8X(bNxN`1? z9RunO^}1N*LjS#aF}PoUhU=UQ{{xoji1|G1UEFMX(ucLlh;(w<;}CVX_lLhdbVt^@ zFM@Eh(QC0kKQl5@bROo5UT2&Q$r$*YhQXe7ecKcExcoHw@|(g9XJf~mKiu_7eJ_7* z-%S2_xmmOsr2bV+i3n9%nKL>8m3#hT!Q>^o`}dEn#}(85-;`CZhv*|0gpsz;nMd=| zU*DZ09-xnZ<>IsB;2NTOuRoKpaYxEDpCW28zyWLL+v}sruIfS(F1LUgUlphV&M?&4 zpr1y3c~`gh%SR+_lMp%~l)pcFBB`Cb8JPzEHW?Q_qme)ne$h3*aTZ?OlMYH~K;4Or z$3!j{1o&-1rh#seGs->W8D_*=ucCb|_jc%)WCs3(evN23VtR2l$caZ+?|Ms;1$o}>TWq=ik zeIKhzG?x%#cFn;V{zl!RubvVBvgP12S98!7mn~(YrMYW9hVX+!hm8jKRKQ?Q*245M zHit2;#(JG&1vJWF8_Qcz5(PUJor}2bI8-9HM`(4mM{mhY@HF>(_3nmf+NL_ zrAHZ{_?0yv&g2q#NoEc)wnfdG&gXH_yUa|p8oIYvX9Q4?*^m>;so`|bLXh531=&Xv zq@s}^7EvG#3Wi4*0L#F_EBG@aaQ)?ylpG@f$v+v@VK9ujR)m2?SYZMl@}HyP(c+L-k+XEe~@-y{uj%+JMSb0A%kETMY*SCiN8Y54~^BPlCB~v^2;n!BB9~lpCB2Trn_Ii z#lPGa^trAa@1;wr-ZiR3+L>t$@FdnB+MUP}_8NU+HEP_BaC3P1cIE?Ri*Jd$t1Im< zlL!K7YG4BRA>VSjh$Gx$7Vk6{HzP17Ul|kxwiS!PHGxb ztEW`8v@0!^nDwX74d}YIUDHtT#J zv(>Wty!ZPHj~_5A2$76md(*21FS&J5vLe%$YYPl79TaSYTc!|Psu~e%0k&)6e$665 z9@v-F{R~_g!@q03hKXrwQG}$oaww|CQ|QmwlQL$zE_g;dRqxSBWCZH+h^I<~-DfTn z?lR6jj?Jt7C{$EPq&l*wS9>t__4$rlCM_t6XxmoaNo4Zyg=JPmxSjHGdZTIUdCvI+ zk&?82Oe2XGFF<%Uj4S{e8YEyq;eKdf=|20{wK)af%1I*)Z<^VE{0B>b<5x`E1om@1 zmw?r>l$tqITDqn-=iY${^V&i_TFTk+<`v>PC~ZRUQDgL*%dtlia$N?xKk8}C-JWYo zG2+9gU-0R`9Ju;2-QB*NIOkaLvB0{A$-k$cGjGZW%J)ZqXieald@`xsR3g(RKqH;b z>qTEOE^H)2Q+|4|*VPflPEg0X^6**zU$TY1Sc!&T_jmiSYfzC>)JQ?Tfv36V*2JX@ z=g27*aS0$6UB;Gd*m#V|_E&s*>Qe^(>S0-RxlAb{J`)`DB+%7zcl~2qo%=UWq?=wG zn{kC2Atk=n*YmvOv39$|#$cv;BtcO;NvnrGNsKilYo}a}1BCwRWSPBvyC$4YAvrDh z^k#MYL^dlX*Yi-ZWi8urVz_^!>V{I-YY&$`f1jfFfuEwIlb&-gEY%Gs}E==M-FdpVJc%ngRj46{fWT#||@&nJ_4<1x06$p?op$%ZKTJ(HG& zz+|7jEDMR>N1qzLCWc^pdNFwpSVfwUoD!^$FM9fi(St)DeTbW3tFMCkYej}IGd^Yu zJ}00bR&Ohm8tS_(sp23Tsx#sx>-TJhz`^6Aukmsi=rXK;GJHTf{Glww_s~u00`;<7 znyy?d>Cj6uENrPYfY}$Lg~Jt~Wh(M<>qEE}`*1&JPw&I0YBFJ`UJ>5m0hxTb>~!zk z!?1kW`>19A(q)r!NW=@?h#Efca6inlbd(XLgd?k>F^8el2v+l7$B~0 zUvCytI|7%(MZdTeiVxmI|M}@Y4WTM_wqLjuTf$*h_@ZB_MSp5if_oXzttpFT)Oh8F>{RO8NuQJfmMxQ`K(_KCc2 z4X0tT4le-0E-@k*;bNna+kBqVzno-8(LdEg@B4=;Rq(8;$r&SL&TN1XnMgsG$BXkGs#SVmG+d6ufHvf?u=&e4Z?jZRqIHyO?RZ0&=nfXuEWsK}-= zIOk+W5I9kj755)MLvmMGWOD7V3NXh{ZfnMDfim()Y(Zt#m&@{p^2o$?Z*EAj zmrH5-Rb`SGQA1?8C~;+!KxG21Dxk8ey#4l_m5TI8qP|Mf!Lg{kGH|eauGMudb30SJ7U_#$??fRTBfKA4ZFUUV0L|tX^FW6yqsaco84X zRcoqV8|6?NscL@beTDfq7Bvr$n|S73d0a?@D1}GUGscK<3zO%AuDDimiB}jw}wGp8U!)VwuoKmZ*-sJjds(_9Qoq z0R{dJB=mY`&+ig~@6BX)e{DuHw`8QMQXU6zu2sh_)Q8Gh&Ay4hRGWIMbv#TX<42q*UUY<;i3@k&IGrt-JM#V2(_(-xwIYec zZg+NSkR8nP6ETSPE^*o!StsC*9y-^OQRoGAN25zaJPeqP?p~$D>q<-!9)t*7kZR9R z@IC2H^1#!}$4f`!T?sNzbwJ`9wZ-%_O@<-q&-s!J`1x$|e=;*ErHap2vV5(A)JADX ztGy6f=plN~&6clmzNgXV1nE?R)PCw_A{D(^qgZ^|2WsjQy6)>n&@1skNJ(${15219 zXDHWP`xj{e^-z+Xd-&QM{t9kR>z0gt;jF@@1H4BdscaF6iGks*0ltJTgOj^Pq*O~b zgPaIe63zkBXkv2~b|nDVTAS6Id8kZu2uwZr#EsbPdI-)i{9Gtl%W9a;YuK-II8cEG zZ(%sY<}F&APvU~Oe3rN_pW#Oj@9RKFjKWA{J_972>_ z&{8@5x!O6ozCQWk`et&AWok!ZYEPRD zesX8|`PBZkh)d^G3to4;C`sDM)Bzstx%TvB_ViWf^!57m-|K0Bj>sv?jDxNJydIH4CTm>Jl{29ZCJYAjm`~a}T2GPBZg}wFn+33YC(I<{I9Po`r z57s5(oxbNAFt>+Gc1R)LKMc=emIB3}#2zdiH7;RZu~(B&U?1Kr<0URj_bx}?=kX6puv@_I4QbvVYf2px!h^NS_Osb$wN|3SAcyhG5M>}9<+F8t7fc3hdkyZ z+x*q1&lgUG*Fd74h5PfY?e}RMa_%aIc+_Srpc~gwVq+;Y z>$`ItsKD_UkLd*b_0-ulFg~8pB;5=AY22aO4wyGBklhX&3{a$&HqBp ztfGI^r8)H-w_NiUYF1U%{DUyN25$Lf$M}5b)arjD%;Y>lSU$t+o~3HQFYhAJ>Y-(3amKVrc)xKKza&coZ0}Qijrn`J zqCK>bd4t|WWlokL7bPCGmehR%TKC8j4yN;!qkj56Z$5foZdmnbvc2Wgk`=V~mPNLnu2oWP(GmOkmg0BcvPkk$Z|W^1 z2>N)c^X>V;f3Zl`!q3MEXI8^gerR4w_BO3e-LOuobAG?4L93R@=KM0 zU`{5_EiEw8wATpMo`S&!HTYri*}Kb8;TlGFxE>o&&dwVR{h3=s7ueT-h~=+`n1-oC z&tPV9;`+AcCJXAt>iP@IP@pLXyvK-F-e$&>l$Mf*iVP~cpPaA%t=K{NQH4Qd#sL5S zgGFNLo*Wk7cq$JSpWQt^EQ(h>W=mwu8O4?)mP*aW`|v;#&CstL%4mFEH6V!T?TN`t zt>|Vep>$TE_QbMNjp)j;=AE7Z%>j*6d=d-uDteP0Vh&UO!vH$!&e9%7^GPO4!)Ihb zIw!+HHnGa)b)QeCZ??h&KmUhC-u&NSc9f^REsZ%%)%c?=6*ta~rHUu^gt)LeWByg0qsL=)b<+``g7z1+s} zvZ+=?j#Kw>!VG8H_*^e2fq*2ZsqFiizMp>`8C{@&795A3t{Vf7M#IomS##$3KTaZt3j_aO-eYEYU(QLYAb#_ zczX_1HFs8Z^;fM<*36ClceB+!a9eKOny7F4t^br;x6RhAV){RY*1v7mhySuh-yRPC z)>r>I8UEkspl?$@^Z!i!edzz0`eEc_hs^=%!mXnRE&oaVVaF?LPxOB^P$3wz$be|S zXKL~Ok(gNAzp3w%icZWaEGl-&D=v>xFRQ4jQm#&_ZNfD)zo}32#Ba6ga)GwprheZ$ zVG-AE#|)e`1!w5pO{6xKEF2vLM>o5Qh%HJ zP%h1E^@hU1CmvNEVI8;?bmHSb1kyV~LhquR>?Gh9M&XMBMdw{pk23 z^ad*APyA=josSv{ixzk&KcXCxqFtmJYU*9NP-WKiWMizQYN^h;Kay3ewR)w=`F-WX z@&BcQet1{z%W(-qa~O!{H55wO@TOj=7YU+f3*4LD8B~Tc=XQRHd)ybFWLB?-0uhYm z@B3Rvz?`(XQz`A^t@`^9X6k?cS~ropP5m~nPap1|Oa0qG>2|g~BpXU8mD%DS zRnk7}M}{?@cpR)biF3f0LBx7`${-a<>l0|9xMjao{KoOkM4JX2-BVB<20FdNZ{Ql< zWwGTt824#iAddfhyQ)t0udehnIKB)Mg_IGwIKLQ?VCRE=3Kb!-mvoP<9t|;t4|@)8 zz9N0@%Na*H)yq?sJy?8uA?CMn(P5$U2}v#*_#_>{J*FDXvuLlU0G8gTy5KjdScl@j zOYlc^!Y1Eoi~a~1&)gSm$b{@Zxrc>dUkP9xMx-5S#tcXhQVTfZf{M3$2UFg z`bxU(bV2(xVTx50BrMo^NFkm_*@`yol$tg*!k9?XHCFc5|x z_r!Z(K~ETZ!RxMvZUD1ZOw=k1$ktPMxypS{0{|cS#Yn2kHq~EyqM5+{K*qqw4D~ z@)P2ti>dJVMm23iUMTnMDM-4E>IQsE%AaTBRn{0Y$o!UEu3aKvIyz?Z$cbJpUsWi5 zTQhXIP};cRk#K`&WXRF;w4Ue%vY7aBYfaQEJM>~O(t4uABOfq1KPpmmL?Lc)p1C|x zD*a}3@@c?%))r}*?6Ahv^UU+?!#$1tIe&Qqour&jY?(sD#gzZ*xy+BwgL~g9rh~4| z^8jS!@CJzq@`l(ve4TP6{n!j~O;f=>A0LYMNu$1jH%~{qvlzEP1(&vdQ9oLn^Zl8A ze5y?`#UwtrxCJ)xr&sY?DQg#LYiEOJ_FF}^28r7J_H(H&co8J^X%DuEc!Izwkb8;m z>8#p8!1?dc>q=$L9Hs?MqZR_g;tG|#0Bn_fH36RWv2Kj0Ni9`Kg}pJJg-z<5scczI zQF_VqJx%SF9wSoAQ+(v)D&(rinDpg-l{MiS$30MLeJ;G(mcB{>%a+;@A5(45tFSK_P?CwSW=QQR82$A3Z z2h;k$hiW| zm$p!?5#*Kb`5{~I0(hoj*7EB+`k9ASc!VZXr= zoD3^_o-)_}kNUz%FI-K;@2T54R6Wv%gGq3u5I7n3ha|x%v99ekoEYml!r}xNjupWT z*gxv)KL+gOm+$|b8T*gK`agcbP2=Q$pT?RMkN;yD<20Dv^_KPr|5JkniWL2=!H_63 zXC(~!Zyp2{mGoaVm^sNG4VLgP4MzNbufhIv8owsNZ~dm!U{Rt?P0DX#r#ujbB;`;& z+;Rn@LaA;zAaPloJ{l206$p7)pKS-|yh?{4xa6V2$>y4q-YVrhAdyfXl7^H4Lvq7Bg)h5nZY;{nV4 zOM@L`7j!(o{xVN4A78NZChvUN9}PB>RQDGTf}6&fT3Z{r5tM&V<8>(JrCPLy=&ZIJ zJ?TVobf{1e^pG1!{HXq=>Ey+6ok$?j!(Y4~Ae|H`!g0Tl-_G|b`$i7~dVk(KIXSqN z^g`{K^b?uF*TES-%L!@EVV4=94-pk`n~yT@EU2jN(Ho=GEG`vIXfH~xFld#K48jN& zLat31Po9hw;-Q<^h6lYJ^d0=GMn(~?|Avwt7nG1*kv4^d&gls<0z!?|ahH!_^cpQC zFoiTs5mJlv5}B&9y)p^XBI{p*Se?<+6S&R2=b{8KvZXzd%`ntWS9SuGTgc0MKUGyu&=yc)nK=|fav-q#6A>)hVs zSEqo_#Jy~z=J_;5=axd#=%d#42Xc(1Z_w9W+C<`h^B_C;SJIu`5Pz*owZ2K0M+c$+ zt@@rk3+`NbU(QVZuX>@&-GqzT@|7W_m3vSI69t=WSvVg}zxbl#DYO=WSRU$;OaK7G z_KoEYs6TnS8Gh4CZ8Yaly3oz!rRv{-(3!M69lyVtrJ47Y&}3-p$ELvNS$R6=&vVK= zwV&tJ#g0C|(o_;WU(nHaK3_Djtvz4*2AKA;G<)W}47N&lzF1X@2)S7MHw|X1EBh}E z=1dIIqA#^H@9+WOk^L&QP zMY*u$i%XXN7^6v+8@ko4Ya;6ee|j0%5z6I%^)hH~$ITSk zMcvWD^)dun<&14mGm^DRmBnx(f@qW$ zsb8gM+r3{B4^cN`ex5lSQ+BglW!k~$f0@QFxB-Z`SJX295`a>80z^1|-W#6?fWk>X zT$R%A`lOE1-|Fvwk$(SZ=&(d?;;@_(fG$N#5D)~HzyY1m2}>}kDS>GPu2e-0M(eXXLcRfrd@uI zoNmAD*TZ35X1ziegMI=3Ac$r((b}On!!tQ0)g(bT!z0Vhkw^KNfuLSSLQWda_N%Tz z7pvCGmj^hqv1v8h33k->`1?KY9dLWzKUh(Q9vPi7pPcsZM$Jgg+lAsU7_2=elUtg_ z*?zX`T07f&k5=W#u=_XxXutdELVIKJ3(oelIsdiO<4^bB6@dS}k(11CI?-$&Uj8*p zHMeS(iLlDx`8~E>WHmD}S)Bum8ZGMz8)H$L>1&{cdVSSRJ7p>oq1RnfN5LJ$H1%&^ zT=VMyssGgl^skZg|7rWNYIHWUH3I~C_ctu_iRV#F*>G3uDo19;uubabP z)gZ!@4)}3vfAe0-a3cb%TK0F&1^BM4^eH#qx_lBC?_b9uh!1eh1h|mQasU&Z7~#ykMY8y;?7&Jn+n{geFK#D2jn%UY*`%71TpQbIpOi{)pK18m$zQZ|f9f6MEXlP=1AUelxJb*plq4 z;6PuYA)$?Nx0oER=Zl34bZoB?o-_=fVQrt{W)XAeMw;We=mjOEh~76^kpmhUDm$eA zgsF9i6ATUqP>@UYBPg`K5^_vv-n8g@zK6cic=r=!*iL!dg1^#;;i>xk#0>~-S?Im1 zNSaypMeE_IcMCOIbBi0umt{OMEMA&Abnb4#dgg*_OSPUy=POq6L0+pi`qAEN)pgUY zDi2-=im|)QykU6d{ek6Ct;N9~+pqocwxk$>DuN=f%s}~Z`q23G;xbd0*gKmh8ot*z znkbhb-y2VJkMWVCG3^U0hvGzr4LLGq%a3e zoioJ3*+wEm#pZ+5N)1UtON@E=xEH7!X@avn} zsvV5{eV=*K51P5B&$KTeEnNMQ=bKY-IlYHRs}MrVRse_%lV%0G`nQWKlB#NkvB6|Q zNl4)^XhjaQcwxZPb{UA3bU5`8HViZc*YrHS&z2BEB*9BSEh>hg?}if!@UjulNXyZD z3`fap=0T^}mq^J8j5OsRnF zswyKiDXy>?!sykfW)}A`y^pjE5uu`PxnGbmrd}qRE}?F+^YPEf@yln?^pF;nE`ZmM zU;Am8oc*gYgb807$Q%?xWIc-}g5y0H%s7KgR%C+F1!3MvJNSr((K}2|g zGQH~%I~I#4KP%0;!iNMw`$5+#nJTK_TESAP<}qRDFwo0d5b+O7wSBJH|O3#vAo6Yl_&HPQ3!He`!?vxf1Tb630>U6z$q%NtmX|>4* z)#c8$^E%(@YO^mB`qLI$;9blI#_y8++@vFd;arC*VTI*G{1=UYj&;cjY*D+cH|NQE zScYC-IGIV>ZCZGrtPnZ~~fz}gal>&AVvt*xeP1J0%JSQA&2V&-c>mk71> zO~x#7AWXFC>-Ay1FP$r;PTp+?nY%W~&h^D{-ae*{k6Cp0dKa%o z#XKF6p9jKv4g|vjP_xFD^KCsBi=%;y0dIf$f9Zbwv)%zjij7(E1p8@T^P`c$;_Dan zKMrXK55N6xP`P~o(c#LNaUE@D=}WsLeXSmUS8$k^fUXD~IjKmN3ZShU{`bz7KCI&lg@nXnTnU})iBBgm0rmMzOcJPJM z_L1gft6+nB`04UP^?W33#mXVt8P8+%M0hMG9MfcT?Ddfh$&g9SYToSk(fkte8~`bj z(7Z1>Z+Y+>rbD>#3p`P1S+`08yoRvM!q>{OZS*og>s{*nlR-1JTbC z`RILzR#@4*gT>eN>_2I;HUHiR1 z*0su#==bV7+eNRBoNvEFQ1tR!wQ;dND)!URYb97hVekOeaXgA+`3|p}c;OaH>@$QE zr!~#Ru*m%23ztAn%ByxMSs{0h)F0ct4?8AaH5{gP{czxXCczf=ug97GpT5i>d};t1 zSCENo$5d2M)zve!ws-oskcubnxrPg=;H(1N+7`FB{U@#R+rIx3SosrGnQZ&rURi-_ zuZ)RF%l^B!a<=DhU*WI7${%;(pLZVakynJPqHOLh>H6!D_uJh6yM7X9HsHD^|9SBJ zS^MJ52AtFI`?WVcJ@jrJXYv2;lEfv-R<~ZRtj zf4v+2PhSGJ8z%l-TGWr*4G*&^uZ$J2MWksWjK(x`3Zm9HzjZ1r7qiFLr$EElASK+% z;o^El7_IaWc~+SsCkV;#q=FbpV>1%FgC{FN2Fm@)TRxgw&m1KM6q%oqVNE3USJ9b! zkfv=lC>9AEH<5qX(QAY$sM;{YZz4C! zSmx2pjQEJ(Ly3(V=?-R75Nch5>M6*vGG*ncoW3>8<8x~TH4zpvXi~%q>ClXCFP2MP zkE`AjGK>Pt@@$Z*wDGb7>vVc4ImM4u8J*3wawMq^XPWcwKUOJCK8fGWxHB&#;Dhrz z2d{lHE+&jtOnk0N)V5*dDvKSSe0ZB+h~^cH%QXL)qf_87JXVhl8dl)%oQfHx0=JI3 zh=LbHk(ce}Lv_1%D2N{B9hw}@$hVy!Piw!OsLWlteU((-Of=*0Kyn0^Q;DLqR@JqEM7jSm@f&+) z!AJR4-Ar*lEKSC}%`&qtM+Hn)T+nQkVb>c@oqbRMeZ{49my#>Dd=~EmpG{_|Z7$}U zEOkN64_j4mS;&xGQHr;CCC|)Ut9faT_x@ga0h)imq9n~>zp|pNYQL(cb$`FQVTAvn zrg_QXptgOd>Y%P0orTXST++}Ff3Y@u(0D<5XRKj_cD{zKpVDfu9?AQfplPM+SAY>(+Wgts}O5R;yzgrtX3o$`_pyGkIu}D3{73cB>QD!Sg#Ncaj^a zSDz4&cApF^NUtWQq;XE24&ha*oLvnsxnAV-(EA*ojlv@YK8|swOOfPpmv@s+@VDW% z1dap0w*<>hpQf`dLO#8e`VvS+oc&GUrl5?l$mhAn2B#9B6Cm{SU770|9IwK6e|X;g z=H7I)XmYIe@GP3E2ggk%U_4YkVHkk}*V`28W4YTDfyW8#* zNN-8%pScAKhoMyM(hq#tFK%KP%o2m@h4P+D#Cm*efBov6d-!{Ho0k%IEX*6di^A_G zb+TX6IU3v@fxAq$7)2f{ALv`0N*+qZSzwPNJT<|KI-i24_R?=Ea1plN(C$7fklv*@ z)(5|hqV$t{CB@ly=cCl;et13U)%nt6*`I<>?{-bJrFgy_`+_Cl_%8h3oE`8ZH^*Fs zp!wl^$oKMWLBK(IT!9dCG&piG84^0UwHH zAP}^I0oM(L(LF(Xs`^Bckr##MTEGQX#1KTXR!B-twsy|Y0czG6t5(-{G!|nJ2D4Bn z6%i!awNN?L3@FuRlsv^=;;nZfPQfuyc9@vu(DblXWLtF>IfKZEl6+#o4~c=An>&zM z>%?&4Cqv}-A_$;DMZv(&d7mg{?jpiOV29V`8C2Xxl+@iAC-~FYZug0BA)=uU%;`F)YG1Qp#a7KEhxVPSvQYNIegWh(R~<`(bP%pO~#X z07~i_)D$X&Vax&jt@l*G4+g3;Qep_5n>l(7mC2b3Kf~G7JCw8p60^{D*1Tq`7z3Nf zM9;g!M2Ogg9#c}mn7~hj>k+lGB_U>$4nv&6nPIkz&$;tv$%vUz!y5EFEXE5!Ry7q( zMUxwpE>lPrwa{t%l}R(EhEPiRhEOWrexQB<3se>w#z9J|-7j0znPw%xS=DGBzQVPt zjd-J0e>H1J0?u*y~wI1Op@z0;Fh zNKLt?gW)u&AZ}fwpmsf~G67{Tgw5ZoKQ@rP4|5BVyKI3*5ANuZsTs(-E;c37+gXZz z2T!x>!DDX?J%(6z^jUesk`t$?ADu z{FLErO=aCHt2#r_d3nyDzzB~D(k|=Z_gxRGm)_DZDDPSC3XrANryOMg0@y+z1f+=W zNt8T|t2`$A-WHzm-97*_!eqN@sT*C;XU&lqGGbPM7rt8;WT~dVP8-&ZUODDCbu_H< z6Y0q^sK1iH-jV(~FV;msD-bTxZm#?}y$f$g$PD6SLO_MzzZN@$KHA4}>An-Dd?5cY zR_0xuQG4&^o2{q_%!WeXjWuFxE+FP@=lZPT&<@j15Ho z&Xg}}9sYtT7_VAl12S@v|Bl5@4tue>3G%5TVZ-X`A2Hu8z`{ih_^r2!R^toAx~|_f zSIns=ZhdE0$GoOZu63;%kF;`+PFPjVReM}rpUr94?n;6$1MPCau z`q@7g~$URmLTLpf^UM zeJsDknZMf|4_~t(yo>@L7I)+eD^_fS=6uy!01g+0-3hy)n?0!qRWE%;~k58=K41%Lb^?nZ| z?N~Fzp)Tmcx-iI-=gav9T|mdO&!Z2Xcoo6RtpRAd;Gbz=tiF2zJkaC=$tnl*p{vUz zA;r&8p2Aswe_((FVel(!w~&Z{40JFl#+Urk8PnjCj|hCvO*Zq&u^0gW>Vv65u57lH zLiTJ!xHC*+-{aliF_p42?I|!3Q6{d4fZV`YQp(_-wD2mF{au5w9euEjI5He-C`U-D zoPm5bi!3`ucJrVJlmqxOEZ;|j819>l$Fn>>S>C`}SR;_r64!8N|S?K$m^7i_+2geKCH!S26a!vG3`Flfkiz z;uzQ6D8tfNmd)4;czkgKGDRW0#TOKdiJrxvIWpoZ+oNzmuZ}NCwjJkZWeSL4#6&yh z+e$()Z}84#d{0GORRwBMF2V1@^>mDlgpcAH1MzpBCzteb6n@b~%5faZQB3-YfXKuF zdiQ?U1cjyq`W13LXwozs;A=pZL z#P`SJkLe@3?Hm*!NIE_Y!)hEzMdaGJNSO~vj*e8~YYM6$%~Cvd(l=?EK1J0p?j9yw zC^PKfGIfVHo&HlIqjVb8nRn#}68p?F$JLa{zT`>^v+o&KN$!!Ut;^BI<34^2$#Dq4 z%%_mufizSBz-$!kML>oc&&**UeyotHkEfFb_l+vRBP_6kRwf-^#>D%i8=zAT+tXt} zq3flYEq!*<+F5bZ)Et?_#eNy34SWygP4fD(BC%NwkxAju#5=q3a`xGjk=gzd>DPB% z06W>ucsch6GQZN1qa$<1`*L!zIT*a$DCOLQ_UOc~;j55j#z<7R9{?*svWdHG$K}5S z&neZ+DS{Ua7UbphM>f!pO=1@;gnro#^#M50yl=0I+y34h8zoGX`U9YFmKga~Ah! zyKoSUjml{#6bZjeU(^- zC-=pQi7(KJ)+>D3U;l&+PGF zn^OQ)pg6xg5P{`(c%nY1eKo)-7j&k?{3U%bqM+w?H{#xpL0M*UnnQXa_kOt_{BN$8 zVM2yf*7?l}!Iy3z(LTn9PB$I}4(AlZ)VevFnTW>>z?O$(O)KEXHN!u#Lwd|Cc2gAQ zq$F-^K=Jnw+g0AdRfxpw2vHGC!4(vmea(NJ&r*BzLb}T~M>tAz$X;PAbbT!D$5;aM zc#_n3iph9d;J7_=YIdJkhST--P;e95<40_d?-Y*YGIK1?seccp404+&r(~pN^IvnL zemDih%MmR*eB!X>J#ER5dOE6~FskSZdU`k^De6Jc%?L*Hg(nQ75mPUnrrsq?wjuhH zU3pnV7|G?p0u6X?uU}2)HQ}cOjDFMd$95wW0$=WTzdT%jdHmz$Df7(7b;=c~nKsdi z%xIPcrx``cEKRK$t&y2=C|!&R@uW-%x6tA_y9wFjo*>16Vp}!H$w391c>kkX%+2u9|ch;H7qv9LY7Q=ExT`XL8q4z7PqpD1%q$}Jok^mLcQ498{6S{iiqA`sSPshJLylR z+b>T6CjsC)vyxoDwx|2X$mQQ31l%KkqNGob! zEt{n_L%vlc8+&?>nE41#h$%0sLEJugOCuO;+l&SF(#y{6MncPidLhs9NFC$AkuF=u zxsbM8eYh5I;yd0DY3~Q<8-wel#&PepjmfA1C8h*j1t#Rly`-uQ1YR59m2imvgPU?5 z>kUC*-Kq89v-K+I2O_{;#&u%!*-aZZu)gf%UDmw@)_n~DiXrkNS#2CyuhDlpS0C^J zbjRT+^7LBkb&AU-@H+W%9Q>G${cyJKn7L@2Hu@M6)Mo5axaH*EJ$9L}ei*EpO=ZoJ=kqn`lSbA6K^$SL;LMnrgz zZ-$S~{4~+H1Ka;%HvV7s`HQZa7n3+vudc4Cski5Mb}Boo8OO;FOf@e~ z<52mQvESFAIu>94J_t29+&wheJu%ijwb(tg_770;+hxZw74z$VV-+j!aapU$R|`|a z!#KENYJCMq*W;{r9AYuQhWl*KZyvsyntJtW0hh;mwe)V`$H%3?!9Py?>-Pui2j}aj zhrjPhz59#4*xUJ?*7|tzerFHo%HuGM_n$usnM@RpF`v1TC z^#5Vo|3CQ&zQPkbV*GCr`l5wpN&kC5LyJ++LKWWQzQzxs3cuPz}^G- zA)y4)o1k$*&=+UF?F)Uc=ZYt-Bov0i+h%hD(__xhQpj%>6J*UweOhBrFS{+%w(90& zFP^1Q$(_Z?BaC4Zzj8fu?iQ4OUMx?qc{`E$d2JFGrF4TE$jpRYW@MC=vv||yMD#H( zigL%8k5Ij77(a#E*B2CLw#&W@M442s9WVa$Q18DRn#;YypiZ?yqS6m4vKFTwm*Iup z%;YYhSs0Pop0}RuCcO1D!L9R#QtpGNw!lz=i2Izr+Dr=+gf&q*sE?<8oXJrLb2FV}e}aCR0J&7V*thzRl7k1lu^9C2++ z-O`V|AL~WTD;kzkC=r!46(+P0W-7hUIsbg=oO$yGB)Ein&JBkICW+N5$RoPOke|HS z+O{*<9lA0e5nVyt!FTqoWU73_KBHIqZ>K1Rcdg=As1FP=7@b8K8(OKDC3Z)168@9R z%6m_9B3jJ&W`OTTt6QvV3NinV@~GsRNSyCfG3%GHzhYS-q$SGpy#K_q=*Gu>^BFim zpOZ%g$7hK0wu7J036GCI_*R0-BjwW9S;>3bPV7YFq|9*IN-f-;6j;<;Li>tnVm?G$ ztqW7QWT49^>FPk$n*tGdMy)0Py;VeJSU$=<#xEJ+mjSa$3dT}LG{uu7R+?5^n5EmuKg*4wG* zDc6y3C-U83(`*cX716{;0lPHt9MVNPlF~Fy-XDCl2<;%83-R~l=_KHl-Dc2=!f#|N zv4GH+NhGa)wxufAhOv}g&Sl|imoPIF%-vLl#?5=er>pZdBKF7g`OEK{wrAaloLDH6 zJpZ43#(9;&bd_G)#A2QQd9?*uwZW+BQd8D>jU5e1z(o2|tE^py%?jvRpEN<3g%zD6 z7lt7L8Z9;C1!Z@wwz%to?Bd@9chL{gAOHmFvldXqN|wx&G?;P73Tjh<&s_y2;oJrg z#$$*dCMG=$+fFVCrzz#FY9LWKWUuS88xrc%G?cv}<*cuH19F@TL0`vM!CC3$g$n1J z%Yx*iIi1U7#dV{03U9aMZL4n+hCzn>E$Ga~53Rv!E2+r}o10;$z7vLXF)0oq z?}ct~->o@oqHnR^st7Zjdc3ipIafmmDfGLVb{d(a)7rdWGtg1%l6S+r7tCl36>YI- zwUa$&wpAl!jJvhMBMUa&eGVR(Hc*jeF71XYihUD+r-5Uvi;&`0{qwsWo+fw;iJ%mj ziko{t8A%PrX}b`DE_zuxX+ej^ge(pwaa-Boc1m3e$F+QeH)(935PNrv5*8s9q%7Slmi5RIg_@9s8mK-*BQD zVdl6ZZ-1d5n~>;(oVSqh@VTb#9)5!Vj>zw;%!r^Pmq0Gx_?$ga%dZT6Kp0#7sg1`3 zT)z4=kYkWTWtOXG-;%C`3MGEID6EZvNCgS(N%TW^UM7?oWA{>(FXc;)9ILOR@ECKg z{Ep9&+yo;##UTK2-1LoNYjMf~KZPHpqT!}PMAvaiG+ye4?)x53ww&G$SNqHX7ny*2 zw2=yLh^#)>m)NeD`})0#FbyZ?xWnE?@#(~L#-|8KhEI~QH`F?NZ$zLB#2}^uxWy)~ zNloEX*Yt||c5KS5?GUXqHuTE#41QrPNi(`^R6+uC8~fvCe@d%YCr z@@PTe6e;kFri?0qC~?>QCmzih}xZ zUp}iV5AEs;rFOG{UqVHdp|ZBroXYMpn6OJ8U#)bg3lY~qD@k1_+gaLiMyf}lZa5DV)^J?I|7p0TFC)3BCKp!PNjs5eibEH_8Cms_a75E*m zwUQWfM;omG)esTeV#wXbu)c`cq4p@Q-6;P{&&J(nR3Vr_8=nUuF7GNr8+LH#sYs46 z!E8!|ev8qPXVG+t;foc)HD4HczdRe=Mdye^-Bx^n0Iyw`dtF3usd9|-2XBQCkVZRf z?<~O_5zhb%L|`H|#sc=}9k##`j3HqXaNr&$xJw+$kAR-E$2}a4`OHgoVihkj2jOXm zX2bduUO{3{d}8D;(fE6jz*T^rZxXQt%yA@I!VmhRHI^tbIkPbKS9v@`M{FG?nWd6p z%QtK>Ey*Q4&J`2Puj#yO14z3}l3`1Ro21wNRX1?UwfW~l-?Bkrh&0OW$7fwX{ncu}Cl>jSqOWyE8hLiAIJVmC0s9oi_v z%4oJd&n{@(w~9DkzO*jsv_V3QjbZ#JMd>Xi*ase@%GUr-NP-U}#m_JDn{C!J23V8? zK=>3NZxwpdmhfvi{jR;I(QT-Cgp(eeiw_=k@gdo&Zz98287Va$-Q=4B$V#7pIL_}lkXS}{ z@fCLUl`K|<(mG^y?#rGqdH02*WyRlO2!>3yCRbk){ljr7S^(tsw%x4sC5hM zND4{He4q#m4^o&RNW`Zw1U6F%YmtVQcT$R%Kt%$e_Q0k)S8hhcn~y)r*HO)Z$O}yN zs_Lp7Vx?EA>&o*_Cn7&i#I$`3cT+0wjSLpHxJ`&F$Lt)|>Sgw{O_@ zjqF~{Y_80;U24(B5KsWpV9~);(W&~Xu9AI;gCEeD{$Wga!j$`ro-G>b!cCO$h%)fh zid=!peMDLBKqR8XN_|F;Er7r?yo?4zH;^$Bj_;ESg-hSFa0M0?fGOa_Z)x-go9T5! z45BQW2w-N>0Wd*h>e5?K>^@a}!jmRAiHePf*Ibbl6D%=-{YxwCAS(uJTz`K&>~2Ey zVrw&*WlYW2{NS%uI*u)YkuB}M>8~VP3FZLJyy@vzswoTxSpW&>iESIPNNi9?E0mw> zWHfh`v5mzc$@6vUyU9}j>{>ULOQ zjfen-DIpMe0k|>2xXZ$r=*&1O8km7c*cAc^#3P8q5`wf0*bZL+6NwsK^?x2TN{WPn z6CV(|Jz#2}kFe0W#YR$vM=}Is=v9j(Yos4k>kjUyY_n?yHg=2ccN5F>wn+92-fq#I zOs7p{UC9ph83)i#_6XzUVei!7cDdY;G%Q0AXzrC+L52ySE~sJLA~^i?Mg1+~t}9m%M+~6_9$}<36jN$UX#zFuBT|MNr^tai zTS(kP3^~6W6@?JCf(8f@+izlxPQpmGZb9urAX)DSlOusPh)gP2*Iio;qW-&GSc0m) zTRozPm<0C8=YV_!)KZhl5rKz>5{5QGpcX--2%e21s_`@6lsnsIzm&Wbm2g#Pph<-Z zDMqrdyGgQMXsm97uUFTk6x8AA?igcO-NQTf^1Z-_4_)soN5FfhqQ=f%5X{F%uh*b6 z*upzgAS3&wf5UPHYrYCn8yvgrJyIT78ze>D05l^25V6~8DIvf`t{`PR!lGI8B3_7& zG^o%5f{}*mV2y0x9r!yS%`1GvL|vjnO=1GYd%6iO7;8coJc4v6lVq$Z?vC2m)F#Zt zc;P9??9@!Ke=zegwD=WB%0duo!93UqDwc!dv$4uUuNg}Nr5c#6PyNKsgx=hG#32m` z!Lxrs0wXWrR?30BJsjqU3Wljc-v<`UBou$6jnO{z)|mBwIypR;c0F3NxszcgD0T(k zzOY_#_)AQR)$8ObmV#LtATJl zk-jy-+eqF{vi1EG_6JML5$S40(8^lvdzzm+6PJ$WrvQV;l9-4{f*OUfVyi^5LrXU{=sLG-FTr=Kh{G_ zr&V#3}}32|0@=&!em#WjxrY z6%J&0OId~YkzQ+AI^y_q_3^fP1`oxGQDAPlkT`rMh9^>uJF12lNm34xz;B(y>DaF0xQL*=BVI`Tv#zfGC^e2DM-Q9kvX zLPuq(kNz=$XFLSqd6%a5oU|1i(st_wFb9P72e!|WzWXJ+IXF8$J$0D@&?BJk`6tp3 zcLzsWKTjXX*o94P5R{vre4N^S5d{dns(NL13C#Ok9(#1}eooQ`uFvpT>+Q4Theo`O z`7KiFB*gso?rXoajmf}{!_=ZFF)75 zCuP%J-CXrWz=lPI1; zsaG1~_JkslQO9+tJ>k6~8=2Sf_Ufw-4+~^a_2}s zlzGj^vY|l@t%s6)VDr8~WJ^e((R)}sd$u4dnru2PsE{CBI?U3%d!5EgpQ6p{ew>u= za{VBR9sy?c^I7gsv~@!`-4SBt*B)nQ$W@*^y z#_)1c^NYvEXaEiV1xd#7K|D%=St!?6Bycq0#z9TYH<6vy+sWfMx@9Mw%jca4R9X^M z88u|0o;;o|S;HFd^`-m1iY?6c9=Df(%28{{mnq&n8!9r}Q%M!d8+4G%#y(cAS!;Uk zmJV^95|Vm5cB8(p;Yr0DekiWkTDFID3rz5x{t@r}bLBN_&_r)Eh4d8g@KB0CNpAM$ zyKsv@kJiC;8XcW4H`GQkiUGRa1`^q~gu|VFlB+KanN0Va z4VECDuY{R?(MXR<{bV2+8trWr6&}#K8RZOEsB{P@lH-+&m(}Tvbc9{1bfhr$DxoG(ow6azk-h8?(-j4=SMfopzsq|!jjX|LQzdxc-^ zSst*rQf=jmV!t`&3mvP_HfSwmtmVTi`q~r40#8;(HS^l$5W_4d*2ObH&1G#ryZpwv zeOjeo3|*$}sTabQ+}{cXJqGKCkFI+Ok>uU;yLJ>5&blMs`RVSV^fULkBf9=7iKb-7A8E%0@7%x6cUy0K zKihixJzHlO``+S|w@viN-Vi~Ft90>qg>UAQT=|H?i6D&|meX`2v+rj5iA`7Qdo~oJ z^D5ebRP=}vuP%BE=0M6mO-z`m&I*d%+Y*RIAgJq%l?Ct{(H;vC0%q!aM~r!|KaD`3bgy7QHY`}3aqDh)e-DvzyiVB zj3ND-@XQ%EHPyF$zKi$5e-Z~fGwKa`hu=zHpYbNcUc2(vx`Xx&WeW@mW&dbFh-S8g zlCFcez1hZ5I-$^TECKzjG{L=_PzW*vAV4cipr8Ywy14?Pq{jJwChtNYu49E2#=y1>P-D`kbT4IO3NL0s@HIeGJ@1ZC>nuA1xd)x+%Fqq9#t_phmQ}@}nVNsLh0s{9UeiXH5zUiiU1aJ-$Eu#P3DBYpqIT4qTpeQdGC ziYW4_@|7JkY927HdG3SWA80AsOQt=PrIP0)=a&v8e$6H<$0#(`An*^>Z^7evyfd zrz_1j5lpC=V@P6?b{>O$bR9S46{RSD4Z3EM^(be=o6V+g2>vkyjpiLlB~<}(R?lMi zNv)vd>nMQ(%}G;e3)_>|AXZA5zC7pzl+r?(F6Aq6lh705TR#Z!t=dubdg*LL7Pe5I zxd;@}l5HZU$c-Hk#j$yu!*nQb^2P?x$^J0UXHmuMWRD}GaJ2r_r*g&m4|Rt}0(U{T zOzyUftpp}gH2v~lw|?}<(9DqDA>+=9&4(|eF`e7by$0Sc%d4%SO^Vo_I)mXcqWyU_ zE@22o7rB(`WWeSo?bLe}UoUn!OU0tmE(GXd)Afo&VhM@Xt66yoFZO7zqOl0&%9A^_ z;pPgf=ZZI~vdvCL^Z}o!?1M*5#oeuZ9lxjSFYBK+cS{jP zOir3eX>Sm!r{yI2#lGu;Wsz0yP}R&SI_s@x$By)T(ru5;-wU0wvy!;`k}J4!uKpT@ z|66iCw)si3w8BimqOac`yvjTBl)D!@tQldmaH*~lV(vApqyKa<=6oqY?=d`dNV4%w z9TPILtp3@K(ae!vO!+aplf?%^cIa2q^_U~t4)lZ78E)~bs2o$*_woVa2c#1zk1t&d z)W7#G?kv%qt-Zf`xwi2Ac5zjq4xbsz-g=8_TMf-?7qLnH4G-o?s{;*qpjyh{cXZ|p zOQ5nV7t^~t6m$K4F3cz*B`W9&XfB$=t-+$B&iz1mB!BrRHoU9v;XKJ0K^CrL9-Zqv*KvG)U)|4U?Je(^tKJhG|I!uD(tY+aHQZu@ zzsz^}Yp{>hu+0}L>#kRSE~h1*A%mEI90hk z4tMud@LAy9?dHP}?un4s-;*EwE`fyHuHU`B8Giovds)bz!2|*W4PL*8PJiaD-hbvF zXVo2-7-W^v&+2qn@7`dLt`TP33Y4j1NK9SD-whPp>naNJ>`m|LZk48<_N18UdO{`> zZMO8-;C_Wl26klzqjrYT1oczK!sxPL^wltiZWv{E1ebdBf*Jay6~k@V!>F70FT2|N zs(SjnWGkM&GkVeDK_Q8|i?ul(kH^@Rax1ly)h(_5Wc)+lmsOdAIg-QgeQkt2afw}I z8XxjUaF{d%?!@?D5)(L**$PtC3Q{Nd(h~}@YYI3J#UKq=!=f~^rk>@HW5hSb<7i97KNkx zd9WZwV@x_TU-XZG=3E_w5F5NS5W&A9_RWt7`$WS1Rzd?cfcH}VXtdSzC+1_id`@|v z8;f+{cX+dcq6XOq14J$9M6Ho zD#FhSLnh(!+aCsWW(KU-1|3BPA2l}#HcJ|Ua*l45P#Pm-8H4xBoo^Tk%w>j^Qe*|f z5qj84cN}~&Aod{}^S&1;@Z=ZbyeOGqMz+^$Eqc3PnXzsm-7bC1&~V0+a4*G(YSk>h zc$4Z-Wi|q{=4cPEo=@`1%GD#@lrpi|7>;Iyf47t-k!tOSVerc#o#H;-*dapDh!f?= zJ9ZTpJ_U%(hb(=Sr$RmTLDA-xBRl93myUR^-9dne+AD1OICBh$Pbt88tVUf?n_X2$ z9}Ss~nE?ZdB#0bD607t_pU#iH+#UN0VB&^-Xbe)Mjh?8KP|q{QDq>US#a6rJhIj_K8Z7i4>bWjMwPkNnb5d`*87u(PjQ! zgk?pJ1KF2MkbyB+hYMR1D}t+1(GspQei`+UR=Ise1H?!?<)!ZOVwfE<)}gQFk)_O3 zuADfbzG$x0o1(U)k>2!h;zI7bB2a7Q%%4Q$K{tC&9i7b|%O zx%latVj*a4%9kl-f~KI<}sVsi3se{MWs zlMnKJvWcsKj1Tc@w?Wkyyj5LGMnHE(Um%;0{bmlt8d_*^4q%w9#37D8IU0>Lp4A-J zYGqUdoO~=ZOR=2jAr@`wJJh>Gjrks{KOV#qT4!!Bqfb_OT4Vh5)_Lyogsti^b=+HW zDb4vVHuXQZkEwYG43@AP$v8Ki>+&Fm==+x(Z-$3C`q9<;=jVeQ{nM}Jra$cH=UmKx zrRyyxntRV~FvK(W)B-}KV{l=)K;ymeF?``;(t>>9LX>}4%SF_#7i*!)?1*`@MIugP z3ISe?s%E{Ghm0YMh#;5kVp>Jd?Z~{^ntrGd8|mQqOPqy4?wQA@hEHYZ?(`MYBcMiU z^L@_)4J1yR{-n@4R5Ysz&qkEqtfnM@a!^K}*eDi!z4N(9a{ieCatp`tlLUjKn*yT!QxbNZ^UtjRuCcxQ=8k2e8}!EBDp>@ar| z(qJeo4ikQr<%{ThJUgppuo7;)f@Z>}U=pl|(5}QWGB7X@<~FL?lc~H|anUE9aZFPi z*D#k_Znp(9J0!I@J_Psyfn3ePqm!Rn0ri z*ZSdt0^a7K;cMc_#^suA6}G)HW9Gf?#2?oqYP{!0uq^7D@snKA_?NJfOQJQ=%f(Xb z5$C%8gBI7K(L#dj>wC*77ba>PYy8_{+Z?8jRMbu`OY@g{`~1CSC2NN{O_ePh=@X{W z+biN%&ps2GiLQnA20thK^8URyLoeA{9>>z}oR~jxi@XM+yNae*@k)Wt&(OioMv2J} zTg;CpWpI=x3?~`SaA4L^Plr=B3D2w^P!p)6RuTVQ?{Cp52wwO^Yvs;s6=|`7^>;og zR=zA}tz6cUxN9k5dhOI|Q`CJk>}IL%ik!K%cl5WFuq*g7g7$Y|}i6rPZ>Go!(BZUP)Ukx};2I#5JL3+7W)eE5cq^a1h2R zokD~g!}5BTWazoQH(DZ1ouhQ;&fA*uiMH&9I`^U>O`0aHlH~-GO)s~No2(6k)^4=% zuHX<@Inw5t;Yb5{hPs&Y5L$KfYE#RHf?e#{h0R*=R?W$@Y}V0=5;KvyJU&jK7q zVM#7PLQU3VD`&lHvcC6Bz`lpr+J?!Fbz@ij3#*3WT4CI9#QnouU{6y&gNoDAk(#{e z+%Tra)am0Fm!XZgy?TLOD@BrhbKK7}qV{j%71gvbmR~0Bj`{7h?1p^>HvF`jbZhOs zg!k+}?mI9)eO+oN++xSKVS@bfh2GT?g}ZM|Y~k_RAv1pBS0|d&z+Thm#Yzk&mLzq= zL6>}ykhLJ8*1;~n*YvI63YmrW`ptOt@xIfUa$+JN)X>qz?(js`!7S49tH~z|OJrp2 zVcqi6@1`XB^$|+pyICJ?Iu9N`Zf$%Xv~wT1@HAknqS(6t)rZh$I&&g#5RAqJaUUvV z==O;3PMH(g4l0>4n**hz56VW24M`}M47dS`OpN!Y0KemLL zk9;~YSel=#Z_itCEBjD#(|DS{(Tr9-t019`U;1c_!R{ zD)*`#ExWnYKkX~U<7Z?mrLXS?{IOt>>yUImdzrr!sv2795bfGvine2YmFU?sqxChB5R$I$()IW2 zjiLEmcT$1t5gnd{k?z!Fmy4dv$pWLK==jCLL=oUq=;q&ytu%@Ptu6~e*Jv_+`f{R* z{Ku%Z9IWW`oEy&lL>AyWjx7Op6%VES0{)kI)ScMUr%3rnf_W_S{Nag?;Vnuk(`mY~ zY+0H*z!H;s(p}a|GuIz{~eK(&5^_?m8m>+NUjy9O4^f59YN*GmKn& zzq|JPdL5{J9eHydp5Pnt8OQs%U)bk}J4T2f`g262xL-_yFSWz9Pu@-8JrfJLq2$Vn zw+1K7;x7q>>7ucPmT-hexYfS_iLKotLjfwLZjt3-#)8<7ZjhO;@-_4xKN`W#v={rb zfv*IO2y_7hQw!{^2pTCVB@q$ap*&Rn)L+PXN_@{At}YanX^0u4>tBJzXagg`w~aJ` zEuSNr#RD521U6}7w?4mZ6u)h?M@w1;icN<%f4c3szU@^GY`Y8W`Wn?Q7nBzo*co!$ zBo{dN@b?)sa5&_5=cAyesap}q??I#6Ui;sD*Cg%Af!)v1JM>KOZ}=8Y{GU92W&*== z;58Ny9JpJ>a%GL-HnyP?ze>Q>T{b<3P9Xq3!c9*L0$YojtB5f1@9YQ=h$b`x#+-LU zS@!Uf4)F*ksq>H8UT^i`On&)m8-w#_2AE*okW>j&Jg;df2a34mvl*l3X7M%LpgIH` zB7)d>tXl8x*cF#Tl7V2-aG%r_+jHmuihxGQ`QV%dgC>8dSM6}YIuuJU?s0N(!8Ve} zs{HnTrXShQgJ0oSU_Bkv&t^b*f!rF5g^5_kGsaS=&E&%@iNf#|U(ldY&*7&+$#^VU z$$DjaHBMJNi`AxW9;ZhJ+d2^?`W$@Tqn0^gcvC{%7%%=0#svIHf1IubHo60@znvam ze?_Q=;!y}V-w1AFqG|4gwX$P$1vK$o=u%`3H_L=lh*|jNZiEk}3zd@v)*E8>!?h1i zR`fZqYDIm+yw}oOQl}&9m~Z`Z2Hi(UU;2aWkCAkaIc6 z+aPV)h1C(b1E*WDD~h0482J>!oNLUQq_wc#DoV=fN}WGTUzxW`mcAo#{P{vrXxlL{9=8Hs0DEV0 zIV{kI0F}clyGIUE)edZ4p z8u>6=3c9RLkSba00N&b;qfXwso?pLs>-!0$`5Ff4dHDp=jy(99CZ%rqnrGCGb@=B@ zZ>x&Hditv^`LJ33b|s(w6__m_mL+@_?zKTpkY@CZ4pRIjybCvnM!+bSw)heIXI8Hv zfrTgR=K{aBrB@o~zV*2PyY%bFalPd0kucH+h{tUtiCv+C7iR<57|2POd=0KkeLwYc zL!BWa$OD_ZzWz{u59NMbIncR6#tp;w=lJRjkKrT|-7(Vw4^kRo(7Zs16Iix8!ktKz z{|j#5x9rqOf*EJw$*#4eD*;`H9Gy>HC-qHMjT1sOQ*z=6_m{X8w+8~Ow9P}acaQDA z!C#(jD-c%O241OTi0F&K(QIceFyHC!E0`rsB;j6)(Peb#gRNn+Rg~O;NdHaDiVUF#{Ve3} zvTaL@@cc4M=|ua=}A9kk2F z4IEXmM)9Q;7jjTVjjI39ReDF1%J%rMO!%i`0^U#dhq~Njy1EUigrhsmoQu}sR5e5w8yM+nTNa4m_8(;N%w0yLhr_scpnzwuHTO}dcq>MM@HwQ)7SsP zqbVz73osGzhQ7tQfXKx-{Fbj6_Nwuz$g^*|3I~2_ktgISQH}Nr`VAeOOK^Stuzgu| z$tgdQloS?!_=Ea%hzV*AI>AN?w^{la#a!(P9hhU8@P$O_H5YwQOIM`Qo8k;;F6Pu^ zBiF9fn<=Igd}YF|(S<*r{!1-QWN=>PRVQ=1JE}~oW{)!+SeX}qpkPP`rR!L=edH@P z%!FhRM|BRpQ!`+{lyx^+Jp;5My@hM2445Wmj!-uM?B8emyQMfRFRKLDUWV_0mc+zE1$f z@}tsnL|Mi=XC5BW6o{hsHm(}q^>pbVd~l9s#82QfqZURTl&pn6m%^g(@U341Px=I~ZlFHp8}@2s zO9QBFvWt>xGOvfCD8?}Bh3^nDR@md;r`EVG(+5hz#*E)f>~fwuDBSt`U2js+9Qy#* z27^hhqkW?sa-M(F7OJlG?wmZRbVe1-@C|QC0xH>sM*ZXjTjTNU zK68=SIwL2?Q1}4)mH&D)w004ic_DRRVk2*bjq)CUG7{oF`Uw9!-3;w5lyBqyra5St zNFHWl+K9eTaYhns^dC8qP>&W=!Ew20ZOBw_;CTtldbxw}0nZ>6zL8MrDvT9Pk;;I8 zH8MgaIa8%!TG;i0P_*u=Ode;;4+6$<5mG6givh?>1D#+eRcrc167EYyb{5=zS_D4W zss(l#WML-Ez*{8mZNRvGXuP=st-z{VO5BUV~w!rdEYd3E=q1%d zSqMt8%xjHs@v*w0P8dELk4W^t$Z?Nmw<5zefm09(fi<58()7CCR48AZM59?qJXqT6 zi1kn$8o!}iuO+fQSS|}FEDjXM4wbhdZ<6x5x4~A}jl_*dkwo4*c+1zY>iU={n(bZP z1T=YbE`$#igx{bA7cDvXzW z?rNI!&Sj}+&J4fF9p#6eo`x+_4Xlk0f<%yC zFV+s@HW#nfSP@L+?kKn;w8DE+z|V3+^bUnjiy{zYq2NT}X>AE~W5KhrsL7crJ>UqJrkaEc@3YRs_&ijeu1cdRYJ>Z%oz)a7e_u zVPP4FjfqoQ?D?;7wp z1-9-pWiW&lX8SBc|+cL^yrMytq*cR9{l}ZEHGom>U1~N1O zgFyp5iQ`D9!RNlEH_b1&&){1ntQ6m#Qw_Y(4zSivvwnEALzBkJ>x8O<<w&WkDGTQquGPdGVbGp%jlr7yh&6t5mD_PKx9Jhelyr`RfDU`*-vLylB~ z5*08aRzwOgRSPr-4gCWlRyC+d4cMf%uCVoRO#55G?NK2+%au;TLwn|6P|j^=N#`t5 zfy)t!wYDe3iOJ>!IkBR!FjFwU;`{?gx|SDtLod>Bo$~cKPV^{*C~w^lp1i+DbUjOao$OU;ZU}rf~ke z_iTXJjSu0)r_2ZIcT(;$t+tFX$LGXwGNTCF<>AfM`b04D?yS*8=VnP1Gau@~4Gghc zJ^7b!8n!6)(6Lf4wJ`GGxsZUPY1y!%fIk9LVXkHsH!!}xkkBZAP!rQwQcs4PIEg(6cfvY^8AhGmbMfpIt;(jNs6dhdp$hrpHkzUg11(z zG$RpeuT!~GO9o{J&T(QW`*70~;|}u2QR}tF9H6yMY6lzY&wa~jDJMrhNq*To{PhnJ zXuLHk^qcaf#FHq`=J_Cv({tuiK2%bbhUt~-qidf>J!u2o{J3U*uV&LUth=9vuf7xb% zf7xa+QAtTjSvdSZwpmj{_r8gB&zlVmO-xPAO=BBhys)vgbF_7E{wI|6(&c4p+x=#` zb9MH=g|lmW(SK}nNxDaU?)@yMXISh%yxGV9o;L@?rT+t)d#moJ)dTx$|2JvQN_qXS zmCms4ntwd=zcKUsdQ?*8zcF)UWc0mc{%5+g?4Rk*n6&Je=E|7qp8GCWY*k@wXKh?x z(|w}xpBc~lMptEVa>(m{+;UFIzjBQ&DODXQP1PxVo2hA;skP<-&Xm4@Uv#1=Uy!T!hxzayrM$X6_xs!Y#Q6N#!GA&JleLq}e@Z4>yZ0OM_e6Q; z+wXsf^7n85x2EL(+px+16H)yC&yU>OW<~t}Q6J;HoLBvy^|9T-XwLs@bMpVR&5jBh zTK{F6Ax+h^<*LbC+{X9uv0Dhoaud;m{Doqhs`3Xipjv2?9{)<0pIPJ>gD{D*G?15t zuP@OJ&V`r5eidC$Gyq{Fwn@o8C;B{2PGPxm0tw^#0F)&Z!D2x=Fy!M9aB-PhB4=yx zghIJYF8UxTcxq`f#g^!KkgJ&KV>kpxg1!F)#TN}gZDO-%s9C;%ULs2s9Z9U%#9;#{ z2Gkw319oTV#s-<)c95a_Ntl*E!~U_Vj3+V^|Hq=M;2+q<&Y@DGeFYuJ6nIPKweEnc zDU=^7=3j#5jIQZRm)D2tGrcCNp;mUw1^7)n6)xE&LjK^}6gq!zDZjs=YZCbs@E5lG zE(RYtkjcePAY$g!#P6UJ*0i9alSqKH`xGWCpucIa!2K2yI^Cn3=odl+Hc6N!Q`(L$ zL|MM$+7QLxf<4+?vi9a$LF_2`R)g$d3_sYn<$XVvE~Xcr95Uot{ovMNC^U}R&mkoM zl^5bZ7PNE4g+@;oa&nUcKzaoFDxjG^4-Zlcu?{RaaG^j&Y%C`+23QIVGT<2Xd-9>9Hw#Ef@=@JSev$SFev{mCU(X3R+NY)i#P@ zZPl=gnfR|zHkS97xVW;<5=>}DrXS>Wex zijnKjz4U+A$IkxKoP^COPOlV~J!#}{f>1`V6sA8*B+V>liRSP?Sw?X=JY_rQ7ozs+Y0o;m%3D+-@keOlpO&U>6Q-wv-e!S z9uZI@PwUo3Q=77rMai@2CrCYggPwh_mM}f?7xPB49$g4Q2%|_5kHc>69b|;yru-OQ z4~~Ev?)CRYEW9vU#KcReJH5&jWSj0enV_dNF9zOM2riFeeTv5jCVI&MDrU0L-L?i} z+xZPJ|2Tdo#y$eN(?ZM zE95Gfm_b8jJ))4yANS}5oDD}vRT)=9Pr?Kv56uu7@{^}@H&Nl>#~0LCK_mmW*vD25 zfXEai(Jcc9cTwqBvcDcBp9%@wMsmDlVb&)1QeFV(E%pvA>RpeQ5v$D8nuyr*bXr&m zS9E=&S#BtFhz~5(a5!w^%9jL5`tnGjQL~YY#Rt;BDMqTNrHS&u)8Z}L>}J)@Q%%m? zTHA#&V&A=0v@VS!cScL$z10kx7f!{A8YczPQ}rTApPeyT$#%IxRGKe0FFP1_-dlHr~dOL%O?4go6 zPc)PflSg|ItvoZT9Hs)uz@`F|a%X%*=9492(;ezTq0B6yL-?}+pYYBP6QiQT$cerq zXqd;6VxAx<%73%N69dRf2-pj${Y&()Obv9?Q=m_Cn3ejtm#Xzjq5$CpN)t}?_$ing z@}#Qgc;8ezO^f6FTEJEb1E1Q+uZs0F4;97KA*un%R`3?I4Zfa9yyYV6H+ry%T**^pva{7QOtXhKtm?Gw$Qk!?Y1mkMEEev$~I#OM$Q(9sy&kp;X zaK1&ftFSyx{cXbwQ(gHS&4FSYEk~rNFaMDG1l4e;y>8bVo>1Gx8xke(#&KFdb$Uv< zqN(Cv$D6nt(D(ieReFG;3FHTPYWY{3U0Py-F(?*{lCJ%w2>vYib3En)bor6Oe3YfU zsbvfEAOKG6vB_-y4u_7p)O^YW=QXF_^I0#XuHqK8139K2FIJ2J+o(r?7K*d~FGpt23Ep z!VnmxEtEZKIBQmMs$+)G->Z1?x2n9+ikbV~*Rt@FXV2cP)RonWA`-{L%%!@Z>U+Wl zn!y&!Q5We=UoL{0G%OQ-q_2+%@I}PMZAnTamfP8{+wyWKon(LXW1ENvx5z+rVt{xY z5FypzSQq^+p&aL%$4F0g2)A_SnsJX9DX#hbzB;s?lJmScXCnMTy4kq(U1W0)L)h1s zTAjvRZ+az>z@{zzFB?4cHfG>Ff?uXiI7n}WH@DK{x&LVc zvH$4%>~GnC4p_=m$9Na&JHf?oZ&--iOpH`liL!UuR?zLjYS)#a__sSJLMGo88oGn^ z2Oc}ilY#eFIj_TrpQO2HpS@tn`=P@9KqdDR*GvM80vC5@>b@+X_os*AhP|KinxFe_t3P<$$l7A5e%T8fgjs z-~eUHj}z5~=~Lkr#H_9*0VV4x=uxxWtybg^VrBqRbijd5r-L$6iU17*iM#mhebH54zjw&5DhK@6cmpQN)Xu>k*V`UflC(G zUCuFI*4P2;BnT8JM%73_KFq}oG?8%@lTDD5>FGm+Bj}{QMY28<3=}NP;CF zmp5-B?VQS~krZI>uxU+{FLHhejZ@&v@gtP==FQm+#KXt-ij#m_Le^*DS&zM^Alf5U zBE;-X)L>hb=P(5#5u{!ZLJ7vy7vbgJSG!+;O$8wW&GKo9_eL^WJs;k2~v2+GtFtb)c_c!9sihWFu4g@P2yyfBkYWCgby;7724upv;b ze*ZrQMm`ViRvg@j(4j;ReaR#sKW&Zs#8bWP5(H?GMnGrHeUk_9$%Lq;l3JMTcIViJ;c?WfrhzgeysGwlc_0|oe^mBfr< z%Hm&)dS5K1zB7*c*=i2>2^r_`$FtIJzVk`@^+Q!@FI%b9L*SjgXn9mJjh{gQ9NPiX zz(Ho`3yH2zM*si|{SRxb1fty^H0Xwor&EA*^3@(^vl?gb`eb{jW#f8>QYgPMGkGIz zm{6+tIz+`q=!dHEFmOpSaiya`Xeki1rOQ5+z{+)hE@_#<8TFhS!Y&aUV(ZH!|MFDz z9mxH4p`GA0-4lW_zm<^`oHyBW;t-ZOyO*kId#X7zKUHJe)40|2-wvgi|BPowrzVu; zCOXCU%oc)M;HD%~o2OQcmC>Bo%-j%WYJvYBhz7 zNR?-H#z&7;8C9CSm#XPsshAC@SoTX8b*dUyE4R+b)d&c>$t)_!1guBaEIUzpACavF z)F6&(l+v=@L51J~^ca8y9O>cvKH6KnVCk$ByZQyqI&?a#^z zq*~FmlU-VX#aL+(Eoc3QJCRD9Rf>LYGW@KvYd>e#(yACQ_0PT#OUVYRK%~7-HAe}6 zi6OydDBE(mS$nnWtg?<(+Wyq2G0?AZq!NJpQ&sf*O;cszua!oRRJTW6rFru}4}5>x z^HTD_CP{V5=!;nJsp|Y2RIj+1-vSp>}FPkv>ZLqDN z!;&^khE?#(k`01(5De#%Qn`-0s?e=nm6srzp_A*jy^x^;c5D;@?lE}Tk z+F^0q@tmQxP_UKl&Zu)&wY*}r{?AzFs~GJ1)quvV*UjT}vbR02v!bfZAo7szJfrrX zcHL23?Z^JL6XT6j(k-)Q9co>s3&-WT1Zd6@dslv^^!pydrcbu|h2AOiK051UBQws>cx| zICqwiOgQH<^lKjXP&)UQW~F?;v2;4_Vb*YkW;dQl53~=9;1NEO8X(JpQmke+yw0k; zB6J%`eGj&4-~FX34kh?|TLn0&u;y-&K53TyT>^puTig1wq%r0U$Y+5Vil7R$698>u z+#~f~`rnwuyH#MqZU1pr+-cw-hYT6h%wU2Q`E$N{VxFO1Y4;VA<}kGnZx@CLqq`*- zhm+0vP6GPkONW=nJ4jE4*9b=@voPCcBX&cW%a^@XtNn3&g9&^CAJ|8e&B@cUY16X@ z8deMBvO06REpny0^-a4SWgx|T;jf5Vq%=CJPCjsO+OyGMc5%lMME!AuJ@?0XZO$W| z6ZKjX{g~mA+CaB{nYJdg37Vuqa`%ZxN%aSnW&F;*D-u)rYw@>PLstHisp*q}TpiQn zlikOYg>Kj`hW3+$b= z^8p{{&Z>*}!xZjJtV_v6>iwIXe=prZQ-aus`PlZSyvTy_e3!s663srDwMidmyM47; z_LaVs@tJ+1v_qoVG+&j*^gG18hbGNy$$lWA_GBde7aq{%+U10P1I|7aX>jd zOO)DY#7Wax|)ZJE9ksu2wWGD_oVGH!_%ftt8wiVJQLs@%fINg{iDV{*2 zV|0UR%3l*V=P)jnOD}52&6xtS$;etP^2P9_ zWc`^BH6Z8+8kSt`#hco!-=ARXYZm+4GsHVhD~^)A^HCN%DdPj=J!|OU^_{!59mVVg zRi>iW?vyO1N&1tCnC#wuMn_F8%5VIT^2rELgDgfE@>BB*Au63-GNPFa&rv7o3&m0H z2A-9rEHV+~u^C0r?JAGNE36l0zxcvI^2oiV?akl07ZYpGYxb$C071;nA+BS{-boyd zgZP|O_c!4-NDNTyrqJ+gNvUb|bGXL9fmy zKTb0+*mzBxQ#l_j{;Z37yT-~zRYUt|5nfkWuyO&4neuJ;TC!Hd)4RsU zJSj?=Hh#9Rc6vfO)u8BN7xB9!%dXRpq?&s_H`x5Li4O>izm%IgRr*`3^}a#pRgK;q zwf+>1;a$0R?$urI4;+g(*mqZWqz5mi3T(A^9Y`-DpD(zYepLQ5?D6^FBK^`QVdO=| zbw}s*@G#Qr_F8I-PRb=zVCpNO`c0_p_cz+zsNnAt%s-^2el)%+u@A9y{CY0UT!FY- zSIYjmal790>cV%bZ}6^lQS{f&*>&mjtE!Nz@ULI%Ufs-Amp9ejNZy5v9Yqf@cinn_ zy+t$E^(UNasQ)gT__^kPk@x;L$R*+9=W7XuKde??(`Eh$rLXyrKnfAIBT$_bJW@Q0 zXesyU%?~I(gq1uRyC9N*PsG6?yZiKrT}T{KlI|$CO+_9C4+|4=b_LWEV)E*a zlu9kMBzHhPT4YBl4@wbz>9AbASHVx3v{oqv6;I^=7veZm}gd7*qFL*}8v z8YA*eg*{o{LzOe@a+hBR;ZNRmyEr=~{kQ&TdVu5sLt-h=R-Hr`$7H)27ROAfNr|sH zuBtR?`Ym5HqYp!*v?3*ggp!3jRkl$epSl;wSp|+N-nHx9kw`^kdQx=m%M+<9BWtn0 z>1hZrcsjPKb&`6k-JVN_BWWTZoPkS6brV*P^sb zl=v-Mj(O5cF zIg4S(+KB<4E%Bi-fuuRUk*#R++|V;Q8}QOB>dzd;`oW3lvO-*rlZAao(S@#~dv^1R zT1U%`b*%8BAOEWdokDAWhbAlZBc~L(*CYC!uAkw`#&{Qtu3kbu62{E=8ojo!CEm>Y zjaU$e9q!#9Oh0{gso;LyqZzHH6ZotZzs0~y@-WEddA(kpQOUcLGtV~U zD|v@k1%&I@gAEL>`VJ}_)bSeX97fNaM&7k$erur(4ILhLXZ6jWe2=*H>{IY0kX#?!bRNsg+AX z5jMs-K*uNE4L4@b!PD69Z`o2!D)rRW?@NCo z@umK`T{F{$Pg5B~j~iTcBu80A9~c3sjSPB;RB=ON8^67XA{|At?2{8bH|2}!zx*iJ zl}xMXs`Z8(l>9@>2c{T7l1AUIL(MPwMC|U$HCgv!cXhxR{-GZt%G1phrE^GSkQtf! z(yN54G(%2#r7E7iVsF-sn;R>)sjH11qX*+!$9T40;GP`%61rt*Z= zwJBNP7dyU{FT68pF69ei;cR83&6{%<_cW-i)0$n|bfr<@dY+>Q)TkZ%haz9Ngxja@ z>hT#^KSSGwvoafBHTmr+AECE_LIbyOsfw343QtlZzCQ#wYtQygyIGw zW~Qf3Q|4lE@95P-xyDRYGDQdBLOSi`hUtkU-$~tum4pQ&p&;w4qJK(9e1u4(2x^0cWt5B!gIR^l(Lb=pl zVj2n9qds6Nh|L43S*i_cn@U_v&!RiJ&sscRTcpC@8_)NT5f)~4e?f#)8K;+%CTz3s z-GY=LWEzXcjpIiuj~M1nTn$S&tSXFQ>V~=+q-8(dk4-iS1OQ+pRw2X&oDE%F8ER{7 zTd;B^4iMTfbuS;rdEOmgIk_#6`kqb0mFpdY!HR5Jgi}hjGPk`_6^uGnJ3Lk6gDi?ftEYwsuNge4TZr#0*R#27 zy%zS_u}V+xGLIZ5b5!+L_fMBeatYZi$3@@9vfiD__ZfQ*D4+6{*WaDSgOo&`$4}yk z{xFhTJCQL8+~b!^=Q9a7cx8Wo>rbw=lL4`0|DqEnHq6nhEIVB8LHvebU_$G7)U)k) zbqki+l@b(nG40+x?QwTzqIfn7)$a|ui2IzzHyWwmAUWzT0qRWMv+3tt&buU&QMz9` zgZHVKM9|@;b^NI|$>yB@dxraGKRl1!%q0Hr{G;DxO!u}~PW@X)q)|bpHjBjhVXY8b z(jjj>1lV`1PMlnr<;{&|SCAj^doO-eH42qGN>2KI%-rEF|KoceE@LWI;rqRgFw*aR z&JA)yBcZu(+fI{{LGxLL_i29N?8^h+4puflrsExz-cBsn|R+L&BN1^RDHFYN>jfPz6-6{^CM zaV}Z$%*h`7?!CjQ?q%ujLr4xtZ{yd4pS)Ac9&`+QGmSb8Mcrfq+R{PD@&PS6AQB5Z znyo)&i7{z2QIREk0!#RHR6lh7Evm0!?11X{q6%9-bN@K+*8m%8B<}4r&1JJFr;?b<>D^j)-Z7V}6D5 zHWLEF6O|wk92%^!=ENb#H6>)b5)ukL1=doFb9{im(8#vyD}0y z>_Z8r&sWxk0zCPK-GYYwMZnNRW!>`O;NQwf=t$`9uqS5NpHe04L^+aD*&j6Q5sUPa zQNBa!E62&Ggr*Er=`h}ZVTMCgo1sAD5lMcRzEtF_chw*0iiTWV*!OO9}OSSsqF$`sdkTD~U8`cwjLT(6HR0sQkpqi9K zOkOic>Kyq-5M`+W6ct1-HiKY{YU(OsGtQb)DnMjnc%HM`Mhd;yc)sUTqM z6rjq;sEE9_ZvN=cY8}F!>GnjdRzK}<;{?FoG~74_j)g$>p&*)snu$8PXjLK?U7BEB z-2<&oOI_L;U4|ZA#z|eKbzSBjY6XoL)teb+COuYuJvLcA_B~w|{>Qr-dJltVssDh6 zx2Sb082eQ~x|`GFx7d3#v)EyJf+d99lWDT`qK`DC&mlPS;HP(D-Z77R(!Xr!wM)z~ z7tS@K!?n=iotA3W0Vq+~a4};27QZ=`mbvD{xel!P?RgS~$rL53c`=Up%m97O0{to& zRAo}XJV{^kR9~B4MC*^fF4Mw_lb)Wefxf1JfrWvgi-A$Ff$<)}r7?`7t(3hHd$xKbrye8vNlBk6XwiAnn|9LTK*v zT&v7nY5Zk4EfrWi(TGi+P+TJBjVL&LkTSqU_bzZyCoGtdLIq=SWu#jl)~17C zSX%O;!cj7gK}RgTQ89@ySb7t@WRtU`QL*G=GMCZ0B$yNSmWe2X3hk>HqaYaO&2MN= ziIYZ!!-ih6{$rw5u$;n9^e}xPCuhZ7+QiR-u(V|*b{RmxL=+Yr-gIN|ti-gDsoA?H zQ!b3KfeKBEy?QpX)EH+*WHJ9M^pUJ=EZo$rW8I7`)wIQUmZjXF_kVHsoQ-~?R&b=aVcM-7`(qpjQyqu+)3r+- zhh903jyWF8qQhxL7dDU!TJKw2_-*PR+S!4~o8ArEVv@po;yfwBk z2<wGMXeio+oa#EVWoMbO*lhQnvId7C_s!lXSEfI% za7H&~zU5&Fyp|}0&D@RM*^MJ`nSCdXjRU$XKYU|Q3g_FZkEq%(iZ?b=PZl9;G<8B$!n_nC3E?$9X+OMigKJ*GhB#M{dcVH# z-e&bnyTunmYW-`h+SoFxrPU%x5LwOX2c z(=QZL@MFDo35ZSc*76y+Lw^(FdUGVyQ^OHcc^4$^vr)P1QJcGQfrJl~_8raX_mlU- z*g-fo{V*B8kV3zLIt{+|v`2-T7`8$D%+?DkpR{K0)}Svo!S2ba=SR2#nmGbO1a}fLfbCoXx7je``r8Qr&=v=5P!U!W z3%kd**;F+^E9z<4fTsM9ll1*YV!u9^D(w-S-Qb&w_knGzZ%=Z>v5{K)mUf$Fb`vsS zQEb3QxZxvFOkcacIPP1eBsjL!#M16oNi0E!>f4>dEu5oQ@edvG|IYu zPzIW7`xbJElaHJsCW+qIyT-)U`*#El*8ccd+WC?n#ljwQKv^y5K!&wP zJi>gHQweYY5D5sf3~mABf$|@L+7C_{(4cm-1UH(m_}ztw?;`iU3wVbhy#0a98G_Vr z^df@9$QxSshm+R%g^8Y(kb|cD4Ve>Q6RDq96l4mAxaIoZR)n$KBPd>=SL1{Nx#%DG zN^n!7ZJlplSiGg@4KqnU1S*C2-47M^CK!<^55`0OnERUM(bao`#5+AI`&UyH2?B^< z3cVay$7Y%4D+cfqj|^)egdNw0@wg;YX-2$Q3T}3dND0T*#SofV=I(u6O6a_GY8-0h z@B?%l=3Y$kD~Ez*f~aM_`>_%C&68I7xtNNc24M@!OiFpuj4Ru#CQG5L$t*y&cHXWKKVlaNh=92vJ{5kM}vsBJ17gq zrh}V(T#BS>sT(3m73R9Kr!A!86YWz_LX?qvxM$lT);8R;@(!XnDy=T6!_Lz!mrl0* zhk4Y2QeLwC?n;Y~OKW9VhDIo#<*7bKy<$Y*?lfgW8UKQ<-6!bra!_ihqVLI?>XnRc{5ZW3%W`mU*O1K4gg)Lild`AV-H6twrXx|u&For zy)~o9_sIY2E900m?)P2t@gi50cOkl^@raW^tyy+-@16krsc9Iojq;v%_mBSjcfOl9 zB90GU9zT}xKE3DRWb5-2c?IDdlWR8~dNuHAMhLaXnFl zP74bwe{D|WKWl4WzV7XA|M{zL`oCsvq9SW%1{q57Bt9q&8S+;t&aDhJu63xNsR$NK?3noW&i;Y) z*U=usgKyuF#wXrSewdn``8Yc_|7l@yX*ql)YHW35^UK$*Z`(V&d;8xH4v&5upPc^u z_517(833mJU&_(Og@(`mqa028a9?X(If?gXb$<30VWa9$jz)xNdb6;XPe)^g8Go!5 zU&%*U#RIag$}QURf$WhAqE5DWOJeB%$^2C9G}8Ll{B-p+#iZ@8`N?vOSGLJ#;mx&m zn}c7gjHcaa)_dnJw$r)y`JPLTr0-~48_EAY|L%f0R&}(*D-@!MvM5qTf*7D6{lJ zHh;1YzF9z6X+n7@#ZhyxG%fep4=oN2?W~I_np4)E7ghGzK8q9zMU}`J7#lgc*gf`H z%XJL@QjW8Z6bqkgst0~-}h6^Fe$j>J2_K? zvEf*k!E;oLMka<^>6Ru7Q{61PZ{z!=JpV@Zmx@BF=bQq>c=4}QWx2jzpHx*;f2}Te zMmto}Vc_n$C1b{0we9QGTXipgeD$m24FyQ(AbxLPs23vlF2EWYx4t!z^d+{NCvE(; zTU7Xxwp-_?sC?R%ZhXyaUAEE=>_{p~Cht7|*7|g#ZKq#i_vPV~-|nlE^{4-8N8hRd z{Z6*;1lfiIx}ZAo4c^&z?9gx;zA9-9)jYKfyO^2dbui7yTm$EY2ua!J?DPVoaDL8` z{lUNO=pwNhW*^>V*i2*|q+&w?-Y2LVzq6-UpG#!nckF0)Qr z<0}qWgs*(kjpml`zgp{n)PFbbkQeadqfce+k6B*lu^)3m15(HHp~pHcIf2u!SRnOZ zU$HO7vYHq`FpKh>?qh;z&E%Sigu{>TBkKZgP z<#~rd=;^66nNi1UBs=rN~S*!#>tQSoW{jAyozQ|5xlRHAMasJMfag7mIt8*r}h>dl237c=s0>jj@cv z#>FQP60JCrQq$1*^sMZ_OtZVjDTcZCwexSX7Z;WOJ9eJd)Dj-wZ@5udXWZD*PKlkD zuT1hEzV7bn^=R%Jv~L?49eZm$@NPnY<6-{D`;W7@4DIo`rDaMSudV-gv17mZ-Rbb? z{}em!PnkI6e9LCsN(a&rI!U}njb%gG|MCq^m^FwL?z9vd9Wb^EWd=^oKQUg{COgO| z@eeO$SB_`ohVqDg6{*U%FitnN9=OJxS#`C^cZ?ABbh_S^0_B*r)_iR8dH)}=^Le=F zpV;{i;b34k>7zmco}*v1(rLNZ&XIiIq&yK-{*VoXu;y0e%9yBU*1<8 zVbvQ|TKr<8++||TULZ;g+x)iFXYRD^E_UMnD|TGo@{Vt=dll;xo4b5`sV*W7q@n`Jb+Q3l#8}grvzfVP$D6up64jjZU ziUm`xl)9dy7cO(fGkiU8Wnuf;rysZBX-Dpl=WSF1u=2(GtZ)hOfdsfE#K+w^kBd$$ zleS-qmfFiNR9)n_ykqxB12!{b;;Eh_B&e#(@nk*|E%<! zA>>{gNBSgw?=?-8wD-={DufC~kF}^IWRNCZ z)p+QBB;ry<8OpVn>M*OTanyq}pE!1#mk8;`?9m^JYPeYIz7L8-?VaOHnK+mz*HlZQ zmVP1m_Jdtz?@_OzOYrR(hSXP#qjrUef58vIj1vk~*C8CiactEm*fTh{KAz|{ru~P=AEBg4Fl4@zSY&g zC39`+?$7V63!L(NTW}0T+!gOi0;ui|iq!x9KB}~+3rkXwIXj%Ry){uecg_03hLFClKTf zfXXl3Vj=LQ3I?( zc2N`nR52R1diec*Rj8hy?i$o)R>!zrke$Q75^5XLl^fkyB<+=$;Pf*qFZWbPx`V&K zy)I2Ysl-awn>E{6;Qcwhb_U6k2j|4~8uN_?%>-Y;vajW?%Pyp(p}HUB>Q{VMBdvmq zgTQefc36%>OGlM9BfP3Bw#fCGhkCYS=+S6@Y9QfRdI}j8 zh+1pZ;{@Zf#~f!SI%2ZpDZ?J6d<;(vEpTu7_q5nV!`N<4KEOv0zb_+;w|EQYm2l<0 zp1dh>7AJT0;l#svgD36qgd#Sy-+Z#&)CrupA1%*lRUmX3lkr) z4Z1hgJk5BgOW$AApXGNF;0+ZAJ%e=(vtTr2SRL4q8{=;>p!spsoP&l*g@sz*am3CCRMa`cjC7i+>vQGMtY0pyDlrX}gOECKUOS1nt zMiBqeN5}ltM^j)|T3SX9c5aG9THHOI;*nOckEF2HO1BCqxV5^v)<49xfm^sqa3%%1 z{!3h2+uLDE?Ngg5+_jUVo4dQGyI&Xuz5W+;-Tpt|))dM*B<$amH9kEoDVs8{gh$=G zQ;_{%5@~$GU*bBwAm-_Z*jP*~#US0+h|Meii(3!1;xixoCu03CzPcc}u;O1g*I9oj z9vtQ`R$bBbm#qG)gD$%td-r~I$NjG5oZSDiKo{0j7d5;rYObZ+i5EX@E*{+@5{v(m z)lChh&96&ewU>AF{T-EBUOau(^OPcgep>sF{Q249Mul1(LRq%{za*Kd;bfie)qoj{d`|@b6@|^&<1(rADVjf-_B>EZg2g?r)THq7gpx~Q9W;OeOmdvaIo`li2C67-@}1_RL_S8>tFXbH})t81>aUy z{w;j|dt&f?cmMnU?`_ZjpR?H%#F~u$f2NQA&vCA?d?XL)Fp_T+RVMCjAp+!LDpuoW(x=VRa&TB?X3hdu6S zH(#7cXUeD=sT=Xp+Kdh&1Y_e|Rl9kv`7GmYC~km8J;Kn5KX03vj3AFQic9fh2Z|#G zX6Baou?}$B=}kM#0p_C?4dm7FrQJ zxMJu$n)$>Q1*J*dSknGz4RF`ykUn&|fjiGONF#{;zMv)I??wuz4Novipypp8B~oLM z(`YfQ`*k24i_i+9bxlYhOhPz{Ll;DUxOk6tMsYAWU-u>{M9GSPif`bLBt`uJ(j=u* zu@CV%)A74?-2$gBL$q5z8o(dE{bB^qqOPs#3`QsUprC4KZCLRd28#!g_p3;Etg7$N zq3_mG^KnwQ3RdVvqP}wKBIti^Xm;#Z35haCMr~?l*^mLwpilcV7j#~nhlpy$3hN3# zTHt;_@=nkL4MS6>w2Ro0TkbP1sOT89nPE4VeXR==IhI| zgFv83dz$PoU4eXi-M(FJbC{D0Fh|Gvl_4sxAQTlRGAU!|hCsd(q)njN-Qf=C@?fBE z_^OnsBxKTf-ClxeQ~i3Mev^S-6=$LEML&Fx==1E>iciSQsal_~~xzx%?3})B+nfV7W#S$@3hYZ$nWy(l6q5U064Za3bFSlG&2!VE2|2lK-|x z@-rd;I@+=qzeJbWz=7?qbfgN8y3M6W&e&k}Sl%PNK48bM_t$l!ZiH~%ba$Td6vEFZ zS-EBz@d^-hIrxMDvn8l|cRu9(i2QOjfAf>($u&7ubRu17L&@W;KIrGL$}1skMjS8} z8qt?el7$6FZ;J=-frk?c zYLX^zT-yp!Z@tu_xaS>VTIW^UYXo)kM?IwNGptqyQHdZ6+4KiF!D)Skwx>7|g^B(I zjDY1E?e}zlDvU$)sfygXL~dZ?$q5q9(l>tGPgOTyCt(A3IRm>7P=%6jc;w@EgdD`)bfbFFga_+{FIAGC{L1rl_ABxz&f|Qo&yY+>Ec*4a&zU zjNNn>tiBo&?ye5`;$<7?F!88@QC1(K$6M`6kd@b>0%No2@D1Ld+Px+{YnjpH5!XyUc>#;rJPEB!xVLVy{Ig~z5Yx^v zqG)3mf@4qj5zd9~`j;MRdlN&QQTLxM3Y}8n!$t0Qr*bA{0-V~P;lf5e+Pd3i(+fP) zElHo_f7{8PY6asG9XH^G(|1Cbn=E;|plU&Q6~vw#5h&%; zIN3CCeMY;0^VL{jT-WdweEnkyS}>NBI8odjY9RUp9&^_Ao|s1PP`Q+7>gmqfu-+>! zv;6=sNqxg?E>z$~Gm3}cIg#x}@2R5o4HGILbBn8+O`DZj)nDLJ^FnaJ{ggEpVJt$i zkx;Mm80^X_q_oBML+3{)4}KMKjlI9;Tv=Q^hS;T;9MmIB5%+TYyEFSlDq16%1FYp% z$1e~4C>p~$C;49yf+`tDAVSBiRaRNF?SQ=S$9Sa^H`q`(BVRlb^4Sc?7CYF*wvYjq zA)wve$W@A#CuYnU=Y^IVF;TjVX)F&|*PvPlto&AbF9?c)OoCNi7g=N>w36Zp@CT?uxF7J>t@Xiy+SAu?yM<*(qlty<$#UcLH6)BBom*rxYpv4cR@@cj6H)&U2$TP0_ehjOw z!16uDOZVuOAt_<-KeqQ+-C|`Tm`@YnzZ1{`{aQ5TeEN?=xO^}WOAL{S<^p0^m|@1j z_h9^3UW{+m4Y>K9J+$%0>Ft=NvXDm=@INA0!ANFd0;{YYtK=rLj1PR?+vARn_H}BO zD>HC4A7+hBW=s(5Wjwdurk(tZ`p4iH(Q!QeK0aN9&C(F=V$JLUpjx;A*J;PH2ghCJ zM;ibWwm!$vZANnd!GR}mk9_!%fwTMsnq~i{XJtUZ;5qxMI8YA@+72FC1$QMIGDi=_ zyD29sKa2KgkKY*J3f;I>y3UeZ6?4HZLH^R+)d6@W7h8T+e4uaw@>wG7v)D~J*v)pC z8Ea?3naoiFX5mkH&Cfas zqkTc0k}bk9n6FF!%+;7#GfWZwITGGy2)9v4Tk~NZ2-n=0apT5ZoG+1=1*VF0VW&lz z%k!D1^HaNE=kN8w6;N`fNX}pstT_z+q6{8e#rzQE!Ez~W&@Qc*m_|LGO0}P+oXL^C z2OF^AD}wWc@2ijb$XzLm;$lt$ci|A330<365Fq%}kXf9DS)iRei|hlR9fZq0VRL}e zV2-RqG~rhopjV;L6j#`l2Cx@^Hda1V_OW$J17t!O&Pk%a%5G=f345qu4FN)LUjl(M zt>X~XoUSmPjvOlH3s*W}At-QggC42@tkaRfzMr8V&U~*SP;4EFCGmpyseQDmN7wJZ z4W{x$r9A4)OLO(PWye>z1ijZulZl3=b(*cdztA7dD%p|B49r%gc_<;qc6O3XK4JGG zL97wfm_B=yHQ39}-ZasnAPkDifPR#R+kJ%ST!ym%Ajj3`4vHp_ zNS(g~Rd2ZCwnSqL0L9;k+*gF(LIOOOp!zG+`FntZJ!(Y&zfXpV+zCw}0MI=S1_trP z(WLWOW+BHP=(fWH^udo4Q!k8{(DGwW3<%WEvb#As^fMmEBMa|9Y5h7M5=jqB`(QC> zYcn`?icrpNJ@}iO5HCc|Ac*!O8{}~d6-EzkT3!^qW}tP^KnLVd>J$~&fGvC%hZDw>oZrVP--Ig;lstM8k9dwP zc3>_StEOSDHhBig+_Sw7fL=$zrY`6Cxx!+5ul0UF>uN$^Q4+ccY6lc_qTM86$>8n> zTUQiJ9h==R00Hx-T4z9ed1%xH98505VKmT!66?55h$)fy^B^gd2x*zV`*{WocLmC6 zQqk=}0$sr$WWk0+h_Ne}8y)I~0I8uvEiyz0p1}lM!2)QA1riKjfy(Sr$pAnb9acpo zF#R4t0s-O(0$A+PB>p@x*++fR@jqKb=1t)|(GAO+&~K*! za3i5U$O;~NM7}2M9s*=R%I6|c6(UQ3x=+qMi_Wc%ek_)K@jAgj`f=IMR)kx+4s)PH zSEJxQH(ON7*8!TZBHpGV-i^7j`J}sFsc8%M+DIbaIp|C|0!?8jP1>*a{3V#X1Ph=I zU*rJyj&6jxRbR<(z2R3)#s3^SUQ$xfQJ(y~)X1Z^DeYWl8ujw?9WZU$5-iF0g@D+T z+z~irhWW-8K4K>O(JgP}A+-*zqL-pZ2H#0XQUww&8dxT1{ zm0;aA)Z8Tx-b(w(d?7qqVE={7%*)>B=Ty|s{jM+%TuB}EdwCEIKf3a~<~n!GTwD71 zEv^!u4(}l0WH@5$_2G-xyVt9~(Y+Z;PCY({WvY28FxL?<(`nF~q{-aLoC$_oy7ORO zKQ`>5vwYcerJJs%lScJ61Mi!Q;@yFMZ{E_;GNdGk#dW4+GgA3Ml zP&szfGWWt?zBE+rqGAT?Z35LKdoHQ=aHQzqpS?<;^LzHA-Qi`Q<9wg<-Fes@)h z{i&ZqP!=LywCINdFR}=s;OAW%Z}~r=@FV@v4|Qugd4u3e4c)UGUBu2_b9!23rrIcRbBVIqCs;FUh5Lrz;szw3_hz7*z18Kc96 zqcoYL>>Z=flF>RJ7SiabkLd-)QouP7m&b^Jw-5c`pXc8SzZ`+abbc8fi2e3< zIRU<3Gg3MK_Sms2#XpVpxpA>%K*6!Xj)*5MKM8UM#M}*1hGPXEl2%`45ud(=biF;I zAD1G(>_s96*#h1cMvuQK9H(M_f^T}q{!Eqsj7nE`0_rw#2|XeHY2wF~>Zti)q#9gy ztYbTRM5$=x;9ChH<&9d=I~Z{CSa4D*4~|30u#N}9F_VyzNmH|THcq`Lh7ks}5%hdI zT6O%oTD7VgvpoG2&)NHeCEtdrs6YN$JRsWU8}dwDQ_yFVkj#l7r}uPY6UZ8h^{VQ2sZ31oBy6q4iM z;U@5_Eri$}lL$21JX3fUIBuRCBE*J$(MuK{M=>|)!&_tEaUC24Z-2IqNy%x$_g!0N1BU0PaSLRk2?2kX>We%MER4xWY?HlF9&(&qqNz3HPu;m zwfB6C%+sG(Sdc&iS1JPlEkgrg$fzi!(;D36=$BD&wFT_u10i-&nTJ7TQB)2H>I8*C z@P1h@jWrQL9pwdaAcE(U@ET4X+Ryba7{LqnLZ7EnI|D#z$gp$hRlB9T&P!08J(^fR zeR2bh4w~8+373HbA5m7{qE{m|TLR%!J_u0D@%iG;RpUJxi^{2s&tS1gcrpPx*#Ko|mONd&S4t-!`1 zHC}K7V~AguBNUTML>AftXdNg;X7;a_9H6y-zJi%A{vMJs z|L`V7+!3^-IoP32(p>soYxbFYfzxd`YrD73aS!CO{N&ftTeasRg?rKDES|a#@70zw zci{Kb*bERW(g+|GBG*!!NWu^A&*eo?20g>1)-8<>KBbIL2ESgKpnapDaAtw{`BA*s)kKQr)uOqNSftJw;5}1zF+A_(KkqF>Zzzf2=^h|)<8P3y$pJ#p+}P!tcHHf z-?;PP1>ztJ|Lhn+|1uny_f0}M$dCs&$76bz%afk#w$^e+O~f-VR1UTHYkJ&)7pbJ4 zCyQ0ZTxi%U`Q>B-LKCg{EKXftl=eeGy^$-Q2Czwnod{K;>* zeOu8(tv94lljTL^fv# zGQRs2WJH?!oTe+}F&SbaZEO0(1o^q(nR2$IVXy&&8*eqXMG)K_Qe5`TmOd_=tQ*9P z9t4>;)bL(vX6a!IC2`qb6VudYeML@E2GZy?4M0ji-yY1oUq})ZOzq7!&-&&WqLX=8 z=x@x=l}S_Wb2A!51(=I?$e#NV`fif z)$h8?cAx9}O6IV_z55MTjOvCZvlbGs4#%z(%#$WiS9rs$uGT}YeXyAen>NWrMnN() zzP21Y-#z#c;S&4n=-34f-kBCy&Q}mK`12@rig?o`jx_hIH;H5K;$sifth^v<4 zxD#0o2KVFo%teI<)*P3C<?ruTpi)_yk(t!$ScB?m zK>IS(=t#;X)z5cb+t7ie?;GlkZ@yQI)}C z-ft?Q=Jn9Ct;P|riE-=pE>2Ncs&wR zr_xh!;bZGmEp1j^YLs;3Uv9K$L{fJ~#t_TM(sTPfO zC7yiNWE&UIow%f+z@rOkE$fpBH%`cgxO3g})}ooX6_d|v$g|(ruX>p&@q^XMkM*iS zsWE066)r+!Hxf)V1+rZw^`v$KK&q}l8b>=kZMwkoCuD^5Z@ z(2xQ8I?@c&@tIaRz;lN2b&l5<3JKEPF39`e(*urK~EH=b0hh8*a~DE9Ej9z*q{@ z-=Dp*rg=5gT!6yLJWwVKBQ0}zuW3V@AbqTd4KU`DWroN|km!AQyvNEit6Wf}flQAf z-EX&yGdG|pX%fTeSq-@_Zz$g-CaV-M@$kXws;-V~UU^{6Lz=ZwMNS7HeRoM-kIwS5(PYZrNR3VTu)X{Z`77sMIj7zM zJk($_ynAmjzz}poWByI5<&NW+0PV+5QyIM=sP;F*NC}ojMe6oc_BzYNb1#i86+3cU z#0?+%wT@|5G)vHm~kdeFnn;6moAbdw2s*ORkxBrp<{?F;znw+Q9}FWKzZ=r~2}qXCV1&OkCP`fG;_IL3 z^QM<$p8o9!G&p|pGy33gg_lJT4WJq9V2;p}_0;x^MBuoNo@lv!-J!ih5)%*2W2s%! z+ueDcb4HgkG`huYq7tUqA8H#h`kD{7HgJ>~7Q|RIcjMixZp->a?ThyfL3di(yOR&= z`*{6tUH>`i%y;o&4(F7YOo94%Zn)3Pr@&vRbK=Ox@Sk7l1Oh(iB^1&fmyMY1$g-a6 zuu_X4`}EOnh;(1q+qF5lyUIYTNmsdWJ@CNkJHxlJ69)o0F#R{aRuyCWF!Gjsn`zfrebbnd5Fg6F=vz|UxN^V1VZ1M7fFZk_7|-jQG4->7!m z(_WEZIxd*BzQ=CtmOe|g{A_#lhWl&9$GMbnCgeg^>8qG;W>=i|#Gh)!^y#3==IfY5 z4@=Z1k2lGDy0!O;4wvQMBo)aN2HUp%%uw3aJOM1{dc4D}Ej93jmiU*|Kp2?|+<=cY@qCj1D&hNd~{2|x2O4oJhr@`Q_PF9+f z!Gan1G`nWLi0W^Gbx>LzmlNOcW3K?9=19iopOB{ZF8)rCdHxfnPHfByNOu$y(~Zq> ze~R3sZQR4Ttt4^pRVpdd;?TXwAh0e#GA2YMmIa7H0qGsvWc@`m#NMocyXs7O>}y1O zaXKY0=v5?3MwCI+NHkRj=5!OH+gU4)eXJe|)|6)~I7!vY$LP(VE8#knU#DfLc>w{I ztitp1VvF~{D$2O3tJw4=vo9S3rK)RLenUN69{{d_Mwp8rD~dbs3V8{MBMVny#R+)M(Vp{2g7_vll^!dbKPX!T z(yzkcT=571lsnQK)o#vhhwJpu+5L%sl_~Wel07P6arjM|0fBC~4`@6bz-8c;4oy() z*a;FaQ4}n-G=d>v)kRakN#cIiU?&iu=4)>yW`LLNNEA{&RhMDU^xc%08BHzf<4r>l zmkAg~BcNINoR_eAA16yRZ{sDc@)D#(A(!oN3O?8*f2?)}P?QUZ0~iU5LPV=Tmyj^2 zDv+o$3D$z*ry$l0401sh)IOk0GzzDQ$NHEFDK1HW%`fDulBS6|JhzcAikHRP|f#f5>@-Q5OCRjQjbPp7V)Wlk#Fjc%d zkyj`6DTuY%<>dwpr*abK9$5Ya&kM&`1VLb(xSZ$LPSZZch|GIb!OAutv0=qRDn#cA|*|)(3Wo@1CN-7 z#At??bz38+tLznOxF9>)5azk*&*=82gUp(&&$5uoWst;1B<#+SZQR*3goUwHc?RcY z7nf65*9j)y?*vbxiwI73LE9JpoTP@uy$U~K`dw1^S7NHUzR!O6ky3Rkk)%;Tf! zW&|Y0Yp&7ydZ&;>XG~HSJ59Tq1AfeYd~mLEuebT^dhdtX>HG7TB?s0LesmdsZte64 zT$JHr;t${1J7M#anv$@VM`K=dB!uHzs1x-1M33)GRLu2GYsMzc>%(KS^R}sAP~d8{GS#l&!asH{$F++GYQzld_lGSmf7q`cd|Ld&u=Ifh znE<)6%P$@FIyD5@1OHe->RwaxHOJneHNY-tErFn@Pw$)_sK0m3Lg_0-exzb#04XN2 z^gm*jwvu&{J;$7Q?h6n`cR?jcPz4;vsVu*>27<#CGG??@a0_hfEXIT)w&5IvbB8w= zD%X)on^Epv%2OWZhB8Eo_a^ChB#WxMvz}u38Jo>uGKHu_HX5AKAk)C)iZu{J-ue#2 zMPjrNV8<2Ej=M}2%H9C`JmD4ds$uex!|arv$Dyu-0RU27`dDLj5~Ez7(@D?`6k5pu zT~#2+DdPkq8D_Y$b2{;7Xba8oJjoqTHtrSH{v-idqBLWomGBA%0s4y9a*Gqv$S4=Q_Gxg@BD2GsFgg>?aHt2v^VTVR%v4h*j(b zh?jqbDo(rRsy>1QSW$6U(+Kr?gtXS?C7dh77#E6Zq)xeYL$0oZ*fnvSFj14yA{$UoaDR%Rr_3 zgv11ZU`t%N#S%!u5h6r&kXNPOE2BmOgT+c=Us zyC6@|W!ThP?(E2bnb(AAX_}9ZwlNt2S?vMyR8aCKD%Jzp`nmRi>GgomJKMTN3i|7w zQ?8!BP@oU}nHItUU+Z>SH9U*WmUJ?Jw7S|hF>bDMGr|=J=E6XRN z){SKMuu2VRrF_t@ANVKu-Z@a`;m$5%>f&i?I{i`|XVul~3Lo^U0C!b3cNwS7@jH>z zg4nsmSER1K_kHYelL0#vq!p4%Yum__R{)P-V3bK@C{7pgp;d$TfHF4?>_7hr)s_@%+jqfBr{AFZ_;H?lE?+}sn?~D?7Wt6Pg zn-ChNV9CXh!}tbe()Tvt?HVW$TD43<`H-bA$WQjuHvh(HD_>`Nt$A$bo)ILg(z>h> zi2*1RZv6Z#ziX#Lz-hPJJIgP|Q6;LSf6^e^>^ufvy}G2q=>R0vsWZ_)Md7>PL`MBY zQ00N1#*_xSK@oi@F9VkYE)*~nKW#a%*qu?ZV7T<|QyE(_Z0|6>yg}zym{YxrX#?!~ zVwfvaxZAxKMX;b{u`5+}Q{>pUp1??bj9J3_i9i^qe}EtQ<&)Tp;xjin5Qx+t7T)2Mr$Wu*_%bf| zhewI#{^irkSMe_Nre!oSBC?poNOEG{$w|tQG=Hw`#7 zcSZ^CN!N|@QH8wM@Nq)iJXrpQDeifQ=;)L{;i)mZn|AQTwiqOBGIETAPM|6zB(T!V z4zhc3AnFg^e7?(q80`L4>sFyRZ>0zh`JvQx>%wFdciB)Uiw-Iy7>JD+8jCF1_{Pzz zku}UD&Wq>uU-#?1Cck&J;H${Yk_h4bHFsx!i&Y~r#~BlAtQc&UVS%q{+M!t_o3dU2 zBZ^OfCf+T?m<4IGxA*gF;+(C9%$jWq8pU!B^;I>ERZ(~N3$c0`r}ndW^In@V+Zbu( zGK!*IL8HIlThSCIgKEH&bMp)IxM;(yX&xIUEn0jlI60eY+7z^}o|cLumNf9%LpB=z!buLt*P~L%Fiv6E!yvgx?mb zM0|HN%;IM)6ooQw+dr%7lrf@73uZBJGcEm3eKa@CCDTww`Bxt;cc@EZ^?hFk>lD* z#rtPb3Wu8$m9f=h7JF_12Y zbcnRHbTjD&X(<&@5ESL`J^$ZzopYUY?|f*QBXXlx0sT#bk#VYroLNue1K$=ZuO>;BKL^2XZNM;25tVA(Lp8aMI z1)EY(%hs;c*x<}-JlM+-m&(>pW9ZSJ%x6g{8=$$c=9zgzj7~360%bWWh;?Wn>fIxvjLxFHlkUkwwH}!$B4T9uh(C>^n!E{qtDC>G5Sio3K~mndP{dzYtRZpUy@5baTFO-1UQG&_TOscKq-ylgFR zw;FlKmitDlsS_V}iX;%)dHY7Z7oMwKs7M+E7wKn6FAs^O;EkwLr_17(i9Ai*CXk*9 zk5D*;^X^y&q+U!6*d38veZ{tK7u`pEBOf5s>;^*Y%B$OsKHWSl%J!a)<)C-M>Ua-H zce9~RLQG?UoV6jaas0xh9TPAh@wvoP%@^E?==oqr!@xiD6Lj`9KvWOvN=qF=Y}os^ zZjw7?iwKS}Q%Irn)^Mi8j&h4e351}dS$&wePXItr#H9ZA!{OE2&0?nFR+kg4PeDr+u^r6cE`Sy%64z}j0)?^n+$mfL z-H@DYx6Nqjov7mDd1c3@-Z*c9z$cEMc^r7OqOwG9GG69!2>QjQTUcj%6?F4+7E$t+s zg2Y!lF!d_%2uT61*SsKZ@BxJo;YDu^88S_wOsV8B@p}2-U6V{ zK4;uqOO(y1;lmSFWwd)mLKtU0Cs8E2tVORPA?*$N(42&*o>qKyj12a$7ZnA7J{W#N zsg%`2MMDtAcrxp&IZQx*jd+mt@5xiK5I2Q;p&f%d7|3VB9)zzjp`a0Kr7K;6+Bqk- zqa;=v#Wc*fU^HEjFjow`z57(4*n%VZN|}B`nZ@FZYb@Oi^|(FSy{H@nQP+yYt+F;* zeD(O7KKT~18;?N!_XJJyQo`={0BH!}@=p+HwK zXn?aTEnG81{`UUEfn`3_91kLYl1>utV5}e861Dl3D4W|WC1XugN;{Egrmi`E^ z_{Qe5*AoYbv|32c76HlQ6PtZ2>7`GRq{aOc1kAsyR+ESlVABE+m)FYHd1k-b8V_0E zV(9KL$DxoVHxv+QCJ*&hGk?r&cN5)yL2OH{-Oui|LEv$j`NqnxSE8;iQsajrT>voD zC>s;vYNf;Iz%!&O$dHnJJ0*HYS5U)QG|j!KL-%TBUtH;Ho$@{3g%w5-43lG zk$OJ?Bq_!{oV@K{G#*OJOD%SPamMZGU2cHhm=V1#i;EHq>8&8AgfQ`&9vC-BOY0%% zxeL5a_3bd=?y+u8U+*nOcn>VRTXEkP7xvMbN4{RoZ~v=Jekk%yE&VSw z+4esODj*;@pnN`{vm!7#|Nr4n@80~!pK{*4NKAf_QSzd{?iN9X4%Yt{ob>eg4?*Qs zg_jhBH;~T5~i%(X)O)PFm z>}yI+N=<%SgYB$OdG#_Sr!b|eIHm6>wW=+(|3m6n$A4n#eQ#QQReD@(diwuxsl4Kn zymu9Owe5M$gL&g0|3^$U)ZnHE{u5KH6UCk5B_$Ol^_?Z7y``=F6>}Grovr_kn>067 z^-WjxcU29q{0FF3KfRkCz0Fb9_jcZno-}-(ZG2zX*w)|J(a|_EblatDs;F$f?NScU zHcza!>@Bx-jok9|_L;5r)!B~DzK+qM&c2cE+V|Zb`+7%)dRLBb<$51}qHkfR?_{^X zqoaRttbcsAe{QmW^Jo9g>cGP4*!0ra%*@#3@%Vq#YTf@FzkKE9@#OZ#pFjVPtzX`Yl)0ptzF3O-in6LTF*Kw~U+Wk2*%oc5jMdNKI=uaFY zyX2A+{+?tWM>RhFJ}x`+;Fl`$Ay6B{TfRb5H&hKi>p@3=GS#D*iK71_i;hXZm zc7bbMA7*Z@yC{A?K1DU@sXb1SQ5YqD{neM|pT~;}p|vu0n$FFq(}g`w`XTSA>C6INB=tLt&-qRR*X3_yBj{ph|7PNBNUu%p{m3}Q z;pBwrTiRr=;X8vNc)E>o4+bgJLh?VIeoQnk(+B1lLgF1bFKaBfwSxAbI=w%abipZ7Jp6$bNI!H^@)c?u@EL=W5k4xU9kiW-XVzaSHCIt6+8koum!rhrhEJgg_8Q& zcSLTo_Z8Gwk$H*%q-j;jPo*73vk66z`)^?bCnknndE8d)BOER^VT@h--7;;0_VkKKV0<;1gFLh$2HEWAp5d{f#W5 z|6%5+02OPQhc9nM?U6_!m_X2Aj4$~~ai-0(hGnchn(1i!?}7HNLeO#^BF6X(KFxAN zFYbQGb~nCWVNCt+`R7*~8iM`Ju!%Y`#d1r*LCi(`vuvgh^r!NQXRSYv?`Q~g3vE1I zIZyZHg--djWnsWVpWQ1u1=~X2YAJ@m>}0MWJ_v5nm+>or!VT#@h4=Y7ZfB%_4Z7e*nY;A86N88diP7)$A0y5|EnVfj9EAfcdLQ z3(}{#Vf7fTcdf`P*&S*^M_}On6RD^vh5dmx@bxp& zcn91qea$g?ucO#W;d-%$h-Sw&?3&#z`RhbcOcRRirSjIl=|`98z{11a)i?(%R5)StlIN8rJ;F`P?T8I_CMOP zI4eKB1MRm;88dMv?Ax>z!c^ra!T5**$9&qajKI&WcUe1K3sf00ssLu)2e>4KChvy= z;u2F57i7x%Ek%SpuP6EeI)yanc%G&3sXP-$10)kUx6V)9cmOuH*f3#(PBa6{NTndB z5+gA+GgGcfRL;Lr!GA@^hnV}xrwz?9o`R&j9|c!A%(?rC$2~0entNv!>`p}Nh-;gt zMvh?s=`kV@{{NJlQMrBREE`mBj+XNj>T z{L_nuY-3L%1+C@joQuYica?VOG0XGzCbXUdJZ`H`XxeU==PaJwt@awDpdY@+{=S=} z#yeVTb&LL2%dk$3Z|0cQX3a(G2L%ts64=_Ig#_>Hgj2w|i&jh!XY*+xHfTs|{VeBK z$G*<{rwe@RC-t-)-*p}<%-^>?pEvCyDt!F%YrE~WE_WAz)cg4ykHYRj4|kgJ z4RG0>0L%oYj1@uJBl?8t@U>AdFq@>$F8ffVbunt%TNJsM{r@3%Q<*K2_C?`-01BXU zZBIL7HYi?m8l}VUz|?LwC{OB}Y|FUg&~KKtGRG43rhVZ^dWrL`j_*!J$1>-Gt5FfR zGTryuPCe5Ub!MauS}_V*JnyT=+?wjM7RK={fZG>Uf5)4!vj^b9o7@cSW6qSSQgYN$j5H-jwfDO_d2UK&U+&va6mD*GHw;cKUi za;`8jcdjTX?Gi1fg_5V9bEgF3VWn#MSn+{DUGw|1EW`Z*E|MC0@!T`Co_?GwjJ)@j zrPXunb`N9N3E{R_CDE3^Pw%$Cu}dcEWks^{Za0?bF3X5~8t*%b`5Jl!j-Q$t>N!;? z`?mrio(fNN5RVEQ9XeCdkE937Lmm=+PPi#o5!k_fvNZhTcY~J7rRgutm@d@@9!T^Q zdYovoIU*@fR6bVmaI)*HvbI_bE*Yjw$fqA@7qyi=ir6l;zpq5<>kS@?=C#bpxSvO) zF~GX@VlZqx*fBZiG$LV-J^OxHTre5M#3r`G6jf5$ zl}J?qcO_f@?kNV3&xb8H<>Rn?*%s1YjjaDt@9j0MVZ??KJBgCAlqkL{dEq~LaEI?= za+Qr#53b(bJP*7#D%^p11*CgLAQ=J<3V~#W;0u`!%0fslL+)}qQa~KRlA$!*j&%2s zduoW^A6`u?yy^@@{85E>=!bCzg>lD(L9)X5&BFK=!+2tD^;DR!GhN*|(^!ZpX>+*D zVz}I8xIA5iqGW{fuw6kJf@wdr|4!JF1e$#q#vBl4;2OpR4h3D>3#*5Nvm!-WFaqTm zi5PC;dr^s-c4P_|O|uu;K`*a3B8_6g*e@gWxuf}AF&vi>cZMUmF2kM%McOPz(nYzC zWNO(u`?_&I0?kL@Yaa`^M(f|0MJESE^QcE#E=F^j#b)eBo5f&gX+pxvpV?d>G=gI8 ze}TmgM^Umy`tHZ{Zp0+1NA^y})k;REX2muK#kT~-p8krRmN03Yg}16i^-3o6n#3t7y{_J?#d&p80 zWc&pD1_h7miT`{vL^14*iJN*IJwiOp21rg9b6k!sU&;&q~YX_3 z*t(G_VBbq4x{_DihP5M-3x?$Pf zP-9^trCR8VkUQDluwYb)k64L)H>B$dXSE#77-dF76Z1Xm^^iD|;)Wn;sESKDtRn=z zW+;gBeydg|CQu0zaxV(XDSO&h#-U2H7F(ph#GTwy(6^D>dpnsD1Z&?&=(-7paW3Zc zA(9f>V3AJ~8y8EmDkBB=G6f}20b$~9y^>4~%p8#g!`-D`za?-RxlweKSr5wsHJ#y{ zc8wNQ%}=XZa;nsV@0ob_<+s;s}w;3g28av7tS zRXz0d{q#Ezwv#uszyrzy2nt7R=W`dJ{tr)AHaE$=~p+ zBWtSrh|O0;YX`X3vp%C5*|;OK0k_bvN5RT7vu*DXhZV>Lh%O?6LY!0(9yg@i$|!##8NI|!{h#)7SB5?Cex zYhk_R~; zfmz_%jPi7#l$-(aP}7FClVNjE!s^-WXf%y5!gB-edLs{Ja_>bv@1*ejIQ+$t;Mc&3 z0cXB2IpLQs@KpbT@i5YkfEx$IBM9;O#E+l%lIQjMF}|>rAs3YHM%8mVJ9T%#y0kq9 zUGoT#AwazMFf4C0S^HxOW4Z1g^9TZtY7ZSjTMN=x>+G_-YreO2knYommUu(AXWr)f z5fvn`uhEj@JP|@T;@;~%l1*ezceij)P2cjUS0-X`8|L4^^sR?wXO}U!8A88GiNCHB zJ%)GoK5J-31UQfGyG^#rpl<~)HS4f7K`&mO&GDpb+X}J!9B*2EPd0={RsUYn^#sOX z++v)&F*@$e7ev1>d;~{~RAiwMfxVLFD!!@HF+Tm&8%OsTpl|i1YmE`UdJH$HMz{hX z-x+L(3PDc*G%lWfczF;_=h%)Xo)kU={t7LYL984jwf@ZhP2gtlY=!%9irFc)iV}Xv zqyA-ueqaX-EV9t{MmRfCOOi|k-eDO#nY%GYr~zh46$Ya{M;DLbPdDJK@Hsi_#jI3X z7j1+Q3U8P=Wh85BGL9GtnPWA({bZVS6Ys@0^4w5I5%&~G60plkWUbBQVNJ|w2i*2! z-%~`~%83N31wmtKf?wmvV|cXa%F{! zuqmaf#b|AiQ3rxHe^sbk+4$z&=&1BT3fdBIg$DAz z7*+L_80kg}iLN;2P`8py>iEOmafGrj$it2&1S-1+|BgjzBgVdV;Yrp+P-|47Fv7aw z{Z5L##6_~YwdmC~`gfDtj}Qz6n*(pxd7dF&$uD>4xWPps(bIZAAIV=Oej35C3r5mi zztGA}pt{MQF+T&KeKwAsEHT$^;BkYB?*?Vyn{l$6)mn&q9TRi;Yzs_t>i;&^b(Tz+ zY}mfRsoG;q1P7LM)VOuqPpz~JcA34VYvNl)A9yXKrHs5V?Z%f*=C2}3Htsx~{GwK~ zL*u=3TL>rfx@9^D{Tp5KwY+(Hxjn{j2<9Xn%K}@uj@fv1G(Qs))!FVnL$vGjVWvmu z*>}1wULE|}BXOh~F(R-#ID&gSu?h8ui5Vtoh7gim|7NPIgiAaW$X zc`)*KpQLWh{Tf()y@nJ9W_Y43D2(6(J*?^>|OBuL}su%i1lbjKD?=5^&@=0P-Z`p6m2-(NH2<}34^uhfA6W;2aB*M*KL~B z>}VwMOyGA(zQet{!JdFSpS?!QI}Uj5R)=K~#p7eV2%_%eJ6&Dm=Er_DR@Mj1lf+*O z|61D;PHmjukU}aRqMHQwe=+~KD%kn6zG`W=DC8}1@{CQqo+w6lbCqv4^ab=Se)W~W zAxq&2qVSmX&FGcx`bEKM=HFBIj*YHkxb6EvQ+YNE98WQRG$rF~vgu5-qtJe$3t_k# zov?b3|7Y5ZAKeK@_dg!VY9oXuA%L5&Bku-d@tvp7cA}qyWH*S^0GCL#4gU+a+n%=b zNAf+{frl(htA9_@Nh`u4~R>@!x@r! z7-SJ;HK(;3xqYE>{S^xLL@&>p_qc@dXnjKqcpEpk^ zl*$z@%6nIeZOb#Z;f+H6fTYpvr)64ab^6`kKRwJcUp__ngb6RPxxA!5V3qPTv~clQ zob;KgJi*|AY=m;IO;tN(gnUxl2bz%}n5LL=lsiGB<9iSPRQCC&&f~U5S}&{frY>$C zt={S$WpL_+`$kVB87=<54eR#~(p4HV?4OEbBD=aRf){g&2}@iMhv>uE6q7e53-mi@ zYxyHTasE-jfls9#D<&pF2v3Zai<**k{K6T;1?b~OR|81f5h*j$??D127)FHq!Sp@J zm^^e8@7Tpd4;3+x-Nj^QSb4VNbnp1{G3J*Qv5D z@(S2?YIeW9IA*Hz@46%`bJe<^`-n`Gq|^ z!aY@S<4t&Nu_pGl9U=UsYIz?XQ$yz(`~K2%R_|ecik7}QOlR=6YD6+(0K5J5z5UzI z_ilP@R5@m5SVq81|I;M>U3|%+fMF>I#=(T${k6hi;k-S&vzo2T^Sh>YPFC6Tbb;By z&J6wr!Cx?b@9IpLEx#>g+7tVlm>0hmgq9Tb&2U)c5NUEyzs@PTY35C;IY+G&RyIJp zL%UUA!E34 zG&=-S!mjp~bi-Tlp*M8e2`EylupQ9DqpwJn-DKkKiKLooYe#i(~Lwu^ z5@pc)hF2oxOb*5zp@l+@=y=Sk9i(q@Q=mL}!uZDMVXi3EApCI;)CA5(#xfisY=j1z zdq0e_zzp2km)G$CDp0R=3?PLGK4BbtVIL5xlI9{rjP+i*RfzDr@#>%U>Jrd(`;lVq zQ&6*Pkz}@%ZF(}`P@G94n{(c_r+XpHx}%(?OMOsC)m=Pae(YI40z$)l0&<4-Ki`At z&2wW3C~94ZEGNTRHgM4(Vqx(VHcRlQ`C7Go1+v(3oILkI`f!ID>K|nq=L%(EtxvRa z9Ao0Yv(ktL?JsF$$A?^KP>tH<6WN(19J_T&OpTW-Ka&P{m7?&@)Qgi$R#px`Y5&I}mX)JB85QYfhpN#0n)x990VG(Fo*1}F{umF)kf~0(7LKiZLOVJ+jFv}iQfXfl1QFwQMl|bFQ zT1Cxx3ucX&Ko-b@g}U_PZLgi*rY{vWa*Gf+O5)rnq+*-Aa%OTXQ&9>a+Ppzd!J_&1 zY%P=c_JU>VLUrobJ`G96pOq@V1;tg-P{x@pm9msWiIjCVb+;Xl7aC6^NXWGdEo{1l z3)sU+pxO_Grr1Vw{eukpZisfj0LvAPIQ+8NTbJXfr4q!%3yFhW6SCqM+&id50{z+5w`x7gwqk678tprEJ;P%Gg3Db zPg<$$vw<%JaW_z1tMREU{}DkRl|HVX?s2nmq@T)aKL53&Eh!}H1rwB5j8mSA0eM>> zb7m(tbaD|~0Lf!R;f$vQd{kSXT!zD`Q>Tdd*n41Q0?L%BwN5e{VKasD0?a4RVY1t- z#4g+lEQ$spa{M&3W%-Y&jeI89J%O`*uD>0eLiS_;m{!HW9!~u~`-}JhxB6)DK>j}=WWv(gF+|FXM4~H1 zgVKankZ$(!Fu_bm|;ZtT@n&g|J-IhI9~zp6S?C7La+2TJSihw!WZ@>(GK? zgfWWQmnzEmlE}jl^wpxkRv}wtx*bKHlqU@N!TP30ONO5vg86Yj6hUxvCL-j5i$Eee zLWhZyMEfGuLCMuZF2Y2PsLnL$&K&*swm9C6$-dD|CA+t>Ld5-yRag&#ejv1x?vDyi zn5-5<##N3G2&UXs6491Pd{a&rDj%v#C3(=EpkLipN`?McD-upv9q2aD681(l^+D1> zUA?^oIWP5u2#z!N0mg{qnGaY1b$hZoX#W$^Fa4I8zF;|)iFbL7NxCd>r>tv7YkjJ4 zD+Rr?$=S(2?lq0xK!VpdnO^!b^%QfxoKCe2A+n(Z=Z+L2DZnj+I(Y}wak!?`kRs>u zoFqG88DQ*dDJC&SVp}>MN6GAE86=>unH{4MhT};skF^EhZ(4`xCzr@_sK|47MxM0G z(jLgxz*V^ZXjJV;Old?224zylQ|_^mUxaHGp7n={;md*5Rq)auA(Y>(1_(rRRp25% zutD=xOJ0;y* zKfM*1jbWNJ%4Q3D%aA(B96QOP(VJFYKFgmfaTr6MsN+xpqW&tgD#AlxIpR2aH|u!f zr`a1>{+66;r6WsSI635=9S+8Tqw*m8+%8fWMyaBx+@#NLFpDo)Z7E|+yu@l6QG6<6 z*E8%e_?7qRyjt(ja;z@l(;=+XFt)B%xy9y;R8^GkrWH;~@Q4POuD^+#Sg2zHm*hjO znK#izk@^KW6*I^bR(TR5l;|XsX@b;WKT@1#)2?V%#(%oN#=qlLjfK?WJePAA#ZkOMau?OH)N##IopVV4LI&w;_E{^00#8zgaq5`KXrB z!*7mrKOM<f4C! z{oY6qf6nYHYx+cI!SC;67ib)q*@jIAqS=;Z7d$>nm9IXI&-=DcNyWIOTE>8;D%AxlOjqEV}MaRc=v~dzwvDnAM-+Ysn?dNtQShS?nej zF^OHgiA#Kc&3-7ac;+vr3RE2^FS$4scXW0MEs9Qz^fiIb zAOFNZI^=)WZ2x`ze4TzDpj!|F0Am1PLb(kBIXjSz9oWkboD|~>slR;3HnB@ArWhrw zNj|RynA4${XIh8qk8RDF6ha6PAq2}RP?%Ce=)js>LY?K`HRl)B8v@gfU)i_5>heTV z?WkB@TiIY;^}gg|?yjvI+^sx3*Pw5hza&`o^snFlYLmlsJ6BSDQc^|#B7-rU^y7wo zsHDN$Is2vRxFzjKll?&xb%&d~HV*d+=p|k{NG3T*6*x!-Z0of+$l$l{7dXg%bCBJ0 zka@XnAqjRw?Obp;F6}2eWPujwiX2=cbvJ-=ClfqZc17Vg0boj1Oi@SDzUv&# zV1o8~^6fJ)>%X;)PR!xBHPb&`m;KE**BBl6mQJs z+Gm}}E7;oSs{`=-x^fsL zk+dC3r{Da$b?KYy#!fd3c-^Lf#jQt{p>%u+|G~0u}DBjQ)u9hkUu?1#vx;F8Hn1q+RK|Z*oLBlCG8!KkF zu!ePm*_F%VIF7;fF^E+}yuJO!dKUO|*4t#c#M`~*oIG960q2FQ^F*Us)3=<5w!()S z^6nE(q;i*$_YsGol3+RcNN0Hq>3YXX@qO}j$GaR7a5^^{ut!4%hF*Rbaj`~!?5=BVr3-cLVcN^QxA(pCqxULC)`#74u%=0Sw)o1PWxN;A#w zvwM2iX$jO`)(fSUiy4pTZFU>HcB2P$*Jxst)hm@p9~Qd(P<@Qb zG#v$#UNqb7mq$vJKgKgdG;t9guT3B7pp4$Ro2cy1;+I>X(*}YhF)v4fW$w$WCo485 z<7kN}CzGkE@2*e#&(pU&j=K=wz!y2^y6$7tkcVbOR(vdSxCmPukrE>2 zW#ZXZ$1-$y$Czc^r>Hh)=8Pbk7wVcU^d3NelC)g9BI071#z`HctBEq1$2NOw&+bYt zI3ASzux+^*5%^G$u`}a-`@4Z<~uGmOX zYylT(Hs4%_eqW z`Y1U%pv*8~S!QI|w44;Tns#^i+S2%1E2#1d@#@I8pv=I(Z-3F&{|eiPvA86{BT{Yp zild@^L+xsJQQ1Atow}0#i&iABUipSi{+w}pn96-Nk-s2;4I>p?J`R$l4>%Wn^XXf8 z(7m$rgjblPPk`j;M=75+Q{T9!suf~%t|X%8?aNMD;*K1-4h&{br1ZQxyZj>X!Jh8| zZu+T@DY-mxfswG=&HZ5lBDxSDHy2Ych*q9RIV8k*pHRdMq|z6uEg8)D+cM|=Xr zCu2ObAp%PI&tl)xM3Ec6KCW+8SJ)Tx4tJf(>Nv&ZGPHi;R$5BKVPqSjFC7(W$aU9> zM%MGvV_w8IUm0I71>357gLgldxe!L{#z+{HD9`;si)yqv7oPdU=Y(v_rRPTX=gh_I zM+Q@=7pu8gijc{5e-BMI&0LuCobeAp1}=NvKf8N3r5loCNr(iRd;-n%g!O)Hou z0_Wo>uES88q&qC2M}cU!C&&>WN*}>|%PF%@ivY z2AP~P*3!+vx&9_SE`?1O%a22@;`rPehZej5TpMA%^qz)@1r3)&-KtuY|y(le}|_>O_lD7r>Dbld=PjDfC7%v2e1Lwea8@m z?5~Mp`daMX!c2Z{juU6Yl?q|@aIpmHq@S1pkc~KjJw>pj-%TGU$KO4^X1L1c@( zw<^tD;FZ{lbzDDIk#U?gVwT#6d|DKW*#YR^zDX<- zi<0akQj*32BhjVoKfxT%D^gsl3g`ova_MEPs}6RHgxA7TtNl{0}^n*8*um?i~U}KC^R7-pa;sP1!To< zfcW@p$u#!+qEWSRm>o26A3%}C3L7Q1(-R^p8BQlB@}MxKHbQ~kFlF_vc+uTN+9m{K zng&=Iftx^r4lGnXQxSK#i%Cd>!=GWmh{o&!-hh+c%5iU z_4PL7&*SrdZgGoQIoS;%mv}q^KlH4*Klzd)x9l!FZ*Ox_?_aa!bY?j$mcU-P zAQNDqXPt@WxTrME407WNT&vLf)l1m*{v`fJ;GcW)6;Vb}bj4!;0e8qPN-DNq1ya~c z_VuC2NlL5-^K0su78T}x0I@kli8_mWPe9lJq+QoPR1)y0dr^Q^A#g-NATM+DZleGQv;E?Kin#kHpEFtv#0V%E7SJ3l&ha0)#|VVD7;xeE%)ZYX$-kxz;i8ThXJ+Yb9`#G6jQ5_ zsk$B7*DS}Jz25mt!m`d;Kx^zyJ-3E{)<4}R6%6amlG!syp=TC{VTV5r-82t;Tx=Fv z3ruZCkl&@)Y#W}a3(P5Xo$gS)khx*yyglBFeoPuptGqoRJXjxZJ?l?9LT8R*-GpO) zE7Cb23xxv|;BNo?X{W{cF|?LuHu5Gff5v~3IjS&cSrd!2odR*6#3snjomMMthOhXl z7a(&2WCH#`J?>_TzbI%z4wbJeSqKwmdkeCa3-^oU^hC4&3nN34WXapj4RJr%HlDW`t^pUL4 zGg}oKvm=mJeNIyoUj0a5ER%d38mmUYXl@^CU}tlj-XrTI?7LLUbL>PY9`SJ?XIyueY`zlS!epp zo|)r?R`A}H^IX+@-+R9E`zGeimvmbVyB43{>H))p8eV>ziXjx(SD}r`xdMO@ke{4^m>E!-#1ISWbYmcNjMf3WrQmnD=3?YJ(8{YDyHY7ac{4>QQvQ@n6 zxRI~DtMVE@%*HcsR`7h8hwLP%R`y5dkIwHezu!+E{t8F_VWq~^9(|_#?rS*%ura_&F{71^^(!hb*B-~9b? zn^Ro)_;=~^&0htSnIiqJav^%-{HnKbKa5Zs#ZMPWo~?6nmAOZ~RPhM;o?yC?*lORH z_Fw=%_t)mIbv=EP-b2Q!GBQ6iktu7gpqrdwxpkox@;T?6`TW|Zp(&N*kn}V?J)X&S zx5Da~w#_FdG{tYz%L%=m@|!S9IW(1OA(bwMs#KA;JdD}`O|6LGeI7>p5=|FXNSB00 zW)#x-0_lBw=}NerhV$?Ps9XVM`e`7}1uVvHMj`J&nRdU4 z9>SSA$H92GM9(gjcj(XjaKMIZ7d+5|8^~w+R+9g1$#k&Enly@Wwa1*ym+Tb?-DGY_ z&WYx0W{uZjZkt*%C~G$}iC|lCp`=6p1jiiEyBlvwqB@yl*#66U8BN^ zwlRbaqP||K!q;yKjPuR8EQYwY?064w!zpjMMv-d-n0Vqs-qdLFHddv3j;&I~Z6w>G z+UzPO#VR)Jsut`*siPLcMd##23d(GE=L_Ypd-x|5DI)3jLfJk#Z7jsnO1)&R(y{J| zMD-F=8)R?1+fB;o++n$E%)y*nyH>=x$M)pd;n^DQM+EE1>4rS1t-^(=2io!M9jmep zhlwD&iI-D6&$h^(xhP}br+hUgxqhIwJfUPrXX{W(3_U6}2gN(*+3$#AV%6!&>4~)q zATidfVTNj^9%5M4~6@5#bo8Ovv zmAW*Ky1L!$r~=bAn8MX!$wcfTz)v`77d5_glynVnRQe#T1MCi;qvm+*4<_hso7s*! z9qb0#^j|Jw8s=m_zjE*g>~MoWKg?Jq(=2hb=3GBma`F1o=3kn&nyu`^ zWolo%F_&eE3Ky(Z+0BktkC7)zi<4M4SnEiu>MorgDFx#>?$B>(e>3v>J?oWZ_qcMM z_^cQjmM=3}z@ciqL~uurbJw7Y*1*a#61#d_3e+h)X(?5) z+_!7tHD_*`sHMCn*MrfebQ)U^H#f!lx!jkPXHC&&@P1Nd9o5gG*x0H5B5(U+y#lfBM>73;eA36?k- zx^+Lq52Se`HLG%sD<9e%o>*7;7f_cy zEiWsr8Wc^;x<@<<7_KY^REbAu#KnR=`IT!tMhWr>aVc#Bk&gWfc0_x2rxpQ;O=iu(g;&u{vCBUh*aaA9*4FW(kow2iI> zJgd|^#L_aswBK#uY6JsJ&HrD_-F07-QR60XhMr-78F~mAx*I748M*}|B&8eaMx+}Y zLb^-3L!`Trp%IXjE-4Wa7N6(0yYFB>`~Up{&V9~xUEk`=(dI+>zrBw+C$J5J!DQ7+ z4x#BVr^%GkgoKgNHA~MiXWVt^SM=kqFXkWuw%{j+uV||3#Y)}z*=D{o_sJ2?sW-Pn?)q$^`MpKm4U6VW5?A*0nOw(!~r=|9P5KM3Tt_)lNmh++tZq3@snvY8(jp?kAmqwP1iYoPR(fbiFr~&NF&O*FA&RS$r|Z9YAyk-$ z`rp@!yV0E`eZD*lwDv|w_B%Li4m{|OxgBv&a%WaV8C7CAVS`Vfk)1j{d0WSPg2D3^ zpS#>wgZI+)EY#|3$gvhHwP4th`&aZ?Gkb>acCEl&5Wu_lG0cjdg%9vnl^PE$W0biU z3jv7qfjQ4H`xT{d5eO0K8|*qy&GXxN9%$Dgc~q!I7V9`RJxPV`Ns6Xu@Dn@3pU;hT z(TSZl0)GD7+3i+)+Y>N=DQrjC#n&ij`$MywQo5qUq14jT>3b`d>iVe^ZxA*o+7h#? zRHLL+`zMU4PzY||OgHzv6atZ4$rQ0K6v55Bkf6NnMEG@@rO%Re=7?mCvnJ;pYxl=` z{W&@n>!#R4Eh@z&QLLJa=OvGFrKX+pteg|h(9i1}(!jZ&DE}~-w6kURV1br0sXX*2 z@-k0YLKSlq!CnHw=7OX1r;uQh>8Ew(q22Ft8orlY1n9WD%dda-3Xi;D>-lZ*^9Vli zv2zI_?m~WhtRW+A;mQ{VJlq!obLb5}fo@C<6nlyCMD~J1>{o-Xmo`sl!5;)VgWRzr zFQ;W)&XM&hLR?j)jjHwTI)C&z1kRp6Y*X-@nq}0fy@~PSJls{OG5=DhhH=F+#)lyG zkP~>S+gxMp$1Gnsl#@0w`LRLUiBKmb(c+p**ZhO-Av3y@%WHE!6=DvQr(S_lss4)^ zsm7-gLl4;MhpsO#&RCUi*u zhW`$ckv31%ho!wN#G2or!_mA=R_i3~sjcXVl-hJ2;>Z5#YE}5tinheM@2aSC)keVD zHsp-jsSL3@isZ&y&iJ6 z{H1TsTAD=fIlbu>{jxyk>SE}r*DJG=evk()vA10xmTO&vqyyszUHuOaB1oK8B;jx5 zZc}i`1FO97=T4K*as_XnS2yGO-fu77hC7M)y}xoIWa(?I&j)=nZ5Pyk)anntTo;73 z2Nq@uh+>snc<>qn*Pha>c`H~g`bg%ySdGlyZQXR#52h8BX7({~D3@u+*>&^cRKT{)XF%U8%a7Y1lHqfQ zp0kjj(Jm$@FtdKb;ZZ*$&ABa)|lMN5!{Zi-*;>2mHxu93~_sNG?5ENx&HVsbQzwlZ-gg{#Xfwd<}*oq z0hkC?Op6fB*@9B$UFmgvUFqbMt8y34$rOqn<7N(X)A|>-vi=M~X)>|f>gYR$i_j=WO)#|qWV z+WlM3k53yfRag~)+N9JiB5r_mc~E*A$(+NZxxSmaBfQnXV^8P5v?jSk_!zrRw>vKUA{$Us+B4=HF2*o>U*_v_rCh(h;@=>idWtjY7?jAWPr5hxE}9 zx$FV=gE>3wO3{Y+;__GJ`UQ@CIaOkARjT!`oUSV~y-LIKm3(e1qvqI*@}9-rQiCci zUSm}Eg7}a#bMeTilCMmE zAmhq<=}XWW5x0M;=lZd{lE=MJzAh`@7`FD?4EB7E&VVx`z@-wr`ni ztGCKyd0C4WB}JQbTUXbZ*pI9o9Iv0MDlkkuufrf_udN>wx;@F85cv~JYB-IC7DxcW zT@N;m`c6$Ew0nG*JUMj4K|EBYl`vlm>OYq*JFk33uaBR>^jtzFIQTI@ zv^fcT#mSHL+WNdrd(5Kg$cBG3*=R~<0!+D)2hYkE!nK1^nqo2$(4*7Y*UeqS-&U=5 z!|W?M=3!1<9nH%ggy&=iq1_$xM%E`)3wi!m*(u-O|4>~p_8eGkelU6qG)^^m-}m&! z)DEMw#5HU{*lNbRjU7+id2R6TD_QpBIm=fh2jBjXLRuCJT0*;f3 z7if{T`qsrX$v}d&D4J17@$sby0_(-iF~BH@)^;}i5yA*TSP;W2O|Wov5-B!Aw8Qte zFyNCA65Pt5GqWVReuc@I&p+a+v|>y;OGOj>e>3TSnsh3IU?C*G&ims zI;v0_Z?R;;kk1P)c+UR<(%XJE!MABBIVC)O2S+^(?z@=elj?A{L`nAH8{JtgS&nli z{ua`af&~Uq4@wq^RGcyXq3|2;b9;LJI zAdYq$`s96=ed%y@3xzH8>ltLwN4&`!$#{#%bgG9tpRzw+&|WH8!ODr((SQm>RxV|M z)QHGb${~2HU?~FIbX_(BT7qRf)A_nn%8`N+ zaDEhTfZy3j5vT3-KYwjXF~xy+G8rgqD2YaB78%NW^67=JXY_kus{#7{Yx!q(JI=I< zD?vnpc-^Z|WDv#PhPYQ^Fn3}nv4>c;AQKn`$O@X5eG=Yc9e_beJp_6z#2 zV{4bbB2H9CXVU>dEmWk50?(eyXTgDNxLQwSY@e6<&=I=VOOb}>0q4e#;(9JssAaVk z%%2G8;mEAeCM>B~OAu$EDu?MDKfzS%tSHO_B>^NR{SrZPq{y=kE*&}{6-j!SHUxt? z6hJLwVn*7)W-S`=Q_Zy*o2Vj+-YTi=6o98{JWlUC?Wl*>Ow zZ?Le57U&;NQWiIVwF>qqc9gMIb=yi`3Wb7EU0p z?mf?dY5qGJZ&FeYWaU!%;`4#T4$6*(!#5VGLe`Kz=Rnu0#ExVZ6ywjHu#jxiYJ~#_v-M?Rj-Dhw3nlB3@~su?&J0RWH;lY)#hw~IU-VY< zg*4Ss_*IegYPEfK-?uNWr-QhCp zBeY&K{R|bL2u?V=`q>)ntIzyJ&hHiL7Z0$h0OP@QdxLJQuCzct zIcgU?FOv|=R(hP0;e6=kV_{m9;k?ehZqUBsjlb!5(seb0pxu~U`S-MpvAQ?^1&1cp z_AJ#>qb%dG1y=~pe3}HZn3U-7L62k%zV&pQ-#|zj#6VdXEPJh0F=~TO@Y@OBh_^O- zh5rp{D`Ug!tO%~`Jkq2kSQ)%lAlwjXc{fCytTr5vPt+|7$C&O)lVzvS#8bv`{;+N= ztO(DB7=a*|56Ku#lDhI zXz8fM^KKkh5y?^+SK-X^utMLI_GLAM=5?#^ZwhsJ-#9%bWBA zBukV6JPyoFm_FtrKjqt4WkT(=O};M_`2+a!#9#UQNLiZf);qe&c|!H0m*Q;#6B2$l zB{VM03x7{cUmkr6%J~&m`R*)k$sv=N_V>sOg`=`+|7QfWzeAo}(xfw)i;L0zS(3-S zP_B75hgkaq6b!f-dFg+W+kS_G{{B{5IN-YL#n!GDvp{mf&#S(!9-nrJdu`9km~HQa zz*B9?_y-}Wdt?~}CITYUvw2d3mZbQQbqwG$gB9eBWSIi6^M6Bn>6(waH3y!@_mE%r zY2!l1PqxUx8$Z~q(H;mNdA~Cv3Uv~SGdM{P>?rSEkRB)d@iKH2z@jc09>k|xcwFTKBuOm}Uoe)dI)r-z%wvl01tq(HkmGNH{ZO!Z zb&?~r^uRi;90C%v!EH{n4U4bq_kG6%^rZNk1S^Hd0Y^jrKgQ3v3zLCR8W$Ls*>Gpz zA^S8^CYV3EiZL)Dkm3ydu?L$&3gGsW$XkOXS`vHa3}{vN#F3ATP>O^bKzPB&ABlLT z0=MEN07)cFg{tCCa`4{=5*DF3XSl$v*4twt4H+BG%$n?<64@)J*=vY68Zh-J~ z*xTwEx`;SiG})nMUuE9X*KuJaar@aP@_nGN^{McO6?BH!~8n>yb(5YNTnIKyKW$}XMAC6q)l0T(vYWpW_DT}=YY=YRW=K$k9Z3Ql ztK9sd8Bb=2F%bM3_~YGNXk|aiCzZ<~_4w>kuX9ikOnQCIFxJPx(iFP7oCEF;Kz1i$ z;j(Grg(UH1x2LV=;#{NRyGascc(udcE0sAS`EpkNJ&D3gcbSl61>r_Z?4!lkjTuT(jI*xt zc)Wv@bqXrz5L$2ILZZZ|FN^P?;HH~`uJ2#`RpfpOd9|alQgBY65-zS=KuaT&2 zX{qfBa$Uu$oszt~&{Df1W*8O(zlW&uY?50YlFN;&XK(cpX={*w)PP;7(~@cmb80|I z`|0O2c}QRVEmwb+-$%ctkgfGnT3buHNgd$soFmvPR7hrrAlI4GenYBbuB~JJQOABx z$B9(eOIhoA(y=^@oHQ=BJZ&;z^MqM=PJwz&Z9T2rJguP3miY5l zKj$VruPr@1CwElptaQF++1RI8<9Xf^G1|}wnQ8Ax1XkwHam^f8NyleX1UCDAJQPei;$1md z=Q|B~Iu)EaT+KVmPC1MTy(LX`qT^mcCv--o?B2}3*d*J$)^Wo5<*Y3a!o<_=NpV-! zos?@yFHb2{s6pQ2dZ?0nitCIN*qUnVG9U%{9a5cBdR_t;dCbYZLxd$|2pXKpCEZiw zjdi_KQ+-H>yjhe;DS|`+b7`~9J~iZi0JejAcG7J)gg)qpFL`>7uwTjo0GZ6hu zc+$YbK2l&1_o8_p15ID!nZ8Ez^p3*#=-s4*S>|1^*AfuMgy13$&!!7g=Pw^1P^F_b4qH8b!|d=J-%&z8!D8T zer?4fY6`th6#boqa}7VA6APGMaqzqhonImFOlE>52@^{0Ina})r*zG`e&}(-@NqD( za>Pk>(hPblkm^A9)`3gd4XFFw)5mQ@XW1F%=GW@rqWAV8JKZ@f-8H5)-3^wJ3L6ht za;}2CeFsZTr6WD?Oznd?Mtl{D1i)5EVEJVq_@c=rf`}!0a!z5n7katBM00WWayaOS z`0G=&n*&+O^PXALzC(~AZ;r34%q`;)f0=VWM3K|e5j_VK3g{OKXB0mBR``OlNScyF zPK;>XE2zDZqsjh3jk4IstpLZj;TlB@yM4I5%r6-K89VbiF`ra_Lq(V!riCC1cZP#S zGdS&oZj$A7heO*L*Gz7Yu2HxY`Jyyxu?fXanDow+-#Wl8pF?|Kk2$yC!)NgupG1}X z^S^z*hJpyj1D;SW@NX8w#w$XUDd_36bA0PZeXAd^*h1&@8?H4-Da-`yu;A8e@og_Z zxy8cp(Mhv5>f$P@g%7JQzSL+l2iwHf#2nTDs2W5Hv)$~p$QWxbGA2mWu33+0M>wmB zZR?*_)Q=q16K?Z+BJeynAkP;YiX56xOB=-f>Sd}YeW{u}PMe%w5;<@;5BX;7NfM!r zG=Ip0W^F*Tfu$kGr5j97luiLX0A<=EI3Rs2>ksIJgXaK*aKV% z4Bh1D3E}Aeli5ee*iI-#UMh*4H_&X%Ykv?x?@4cij+=;wZ@?)x`k#FwYRsce0+43~ zd8|wJz6>U4%!9Ji4GJf+VZ#JdLf}pM>P3pd$}_=?VW567VUtpN z%@xT+Q*x_zH8r_@J)6O%Ku9xTo3Ipdqsau2ijD};8_`2JwNA2_2|{;nczQSdYbAbg zUOTY|Y)8$MwGJIdD?k&U$iIVo27%HH360V4l?*EZ0DR9LFz06Vz?ZRze3DW$@^Aow z930!s3e+oucX0OwUy8VNeG-6)pVfn3@(jkxf=y&fq>n>~hKSGdZQCy${(YB@d;FSi z-V8PSwJ#Kmy)w9whhw&m+kgB1Av_4AiN&P0F%1Ys$?u^UXviB)I)ALdv+^d1>1PD) z_@8X>p9~P@_>&v|h3}v-%|0dspYy*p#2fA&FlwK4T!s5~!!lN3th=MKVGCDOi-ZAz z@#0qNnP4S4*xOZjj?vuy`e3#R?#lv_EJ!~eAj1CCf(WjB#(l$a}a?Nf|wl; z&YsnM6{xS&L)u!>3mnbezkI7u;x^IKPWFr$eeGUWwQI} z4t{48tn$RLI?(LSgh*}`mX)`=j~4DNdCWAho$%rmpB{SI&75UI4naRlr^a72A&P`! z8>0~snC*1P65g$2mH6GH8tjTA`Gh^h+vGH{Y#8N9NAZA0-R8#CzIj(8g%MW6**CtuPOE{$PuOq?!f1sDtU@Q zGIt_L2P$~g7S36Ybip$~n#U>TSc-g^T~a0`ok2K%S;TmO&C)H~k8%6@pbwilltPOz z(%?>_XMGt{k~&CQMa|Aw(T1IgtY?1rVEufBMCKZcvom-22hEXr5xjbfbuw#vqT-zc z&cTfA$>(6h`hF?9k7WLMvG4BIEv&VwByzIGw{e9gSE$+bk&)f~S6)@u`pnaa$ zbivcsgh340J4UBR8k33ozzowPiuxXNsjO8!xhc-cA}JGg487~cAOc|N6lV-)ueuG9 znu6&=7@0))INz{^w`oLHT*;hb3#k^F6bHm2OR_CJ5ezII4?TZD@}L(bzx)x z2m}uV*rwP93fOe|sAm$=^aY`z1J@-HU9&#B=s0wHrg^~xN_&!>H}op*!_)^bMJqBT zSR_+6qj@y?Pb)SA|C2`gXk5$kDX5^37XuPLTU7lq|K;;- zzeKVLy!{D{*m=Dw2ib||)SmV9@t!a@c{>IX2*ND2)cY}36MP;Zq8V9or8DL5q{xP? z6oaY0Op<^BoKT99a7&E{Nk>KNgj{vYftlXz&ZT4^UCMO=HHJ7$)_PbVRNvlt^>b&$ zD&o-C6e$gq>x-~JI&=~CQ#9B<=hQl534SV>__!j<7zmcj0ZGT}U0Rtx1mhkH#ym1L z(7#L<<_I>(Wmu4kNP`dp9|*ug{LLroL2&s`Boq~ED@}nIo(R?nu=v_(L>GQbbCE(l zJ}4*ZtGg(%$y_2|F}P8?hmyrJVJNEE93`fax!;L^DYar@DP%!l%*Y2=3NVfiK}`}m zo0n*aIHN$bR5fs4n1xca8a(iqQWs%y_5BQrBo+{ z&ysArPDFFEQi#oEjMN&*LRb9o!rmc~td!Pgl>GX>Jj_O&1yKX$0#ZyV^w(-q z!%vaRR|IrJH(0^$ED&_5VOW<!A_&F!LmY|1?0x>m#0fj) zbw3cV00Upg!ViZyw;y+xZOxz1d8>_Lb6gkl_`?Yw2@C@?@q<|e@dRpTkcg>mFveXF z{UY)35j?m%sB#}Kz_lA1!qUeZ%_o4iHPD&`s0~ta<`<9*dk`>NguF39z|oZ+12-ar zaZ^aA=j|Jk%q7y)Wc}e-bZ^SY63c(dGRj-P`yRMwWB_t!YCobCFzVAjMJ}=>edUP6 z!bllXk3MIJpvUG;ntEx2dM)}iK z*KAQiT(}=ABo^=wr0C}%m%`!yZ0e!nKMw%%4+Lp(#o#Wj;V}@iyfS2ZNrt&4N((|o z79^$k5f8_7vkX%Ovzvv4vbbq^C?I8UAa_UBXk!oV5XEL9uWG~LM&I2SAtQS_f{&%D zPSG=CMKdt+zgluo>~bUSJu|rKish8`bUxx0ysKdbGdB_v{6#VUmti+7)egyS%=^jk zxLj8tQH}7j@k78}nY^6#tdDP1RHYVqTY(J=<+~)i$tiZNS9VoO`ZF*$(hc1Q&|)_; zW2L#r?#s0@XyYwWh(p`~O9N0Xu~E64UTdEND`sij_h}_D(C*jb5-N;h$n2-ep?F)# zc*vy(d|X*U$Nd);hN~vs7%WuUu6$|b5hn4a!d60}uY3Sc%8-U&X^>}j%<`)ne_pL} z%T;dwPO$A1Os@nCGu0owC8oo9r|XuF_x<5)P+5~HC^Vk;Reda4FaM$}_s`^K?Sj!> zotGcUeIgdVBL{_FeEN~$e~7n^=C{|`J65Cd%b?_*;HV4zZEeU4X_I!?>#EWpJm$2q z8!-^`KBciU6I;c0AjfOtIMwQimtd$&cA~?O$(bb?1q%1QYCi>Ic$jMJCN)c_ad{+W zCzwBm;R(hdr~n#5xi`unECZ74j84pUv7ql#9?VWSm$Atbr((J36+3Z7h}Zu(Yh791j2k5a%tnd_TW;Fwb@jT{rD{+M?J{8?{&wtU=KDjqr*LEc5Fr*84HMpQ zO4eh#pt0!sC5R9@P2yBvWb@E8&m}x?rHn15UadS$ScmG1t~DVQj-DqBff$prs2k-N zjdrPsYi3iic{}_!s8_yZjME)mDWSkNRgNF+KkY>3emAs=?xu8N%JHb`FdW5)N`E8~ zb^IjVp|s#zwYX$(y^uk(X6@ISHEc7Oi#2`>u@-KvCusS+CVrxomtjwgoqu-Y|5gD- z`TdTd=3a6G&lS&q9h2vC4`IA>2;P=)_I=p&6M~LbmsceArtwfCep8xLi)7G!=2`=;SX!eBH z7LYFSmqi@!_Ens|%w!T=zKgi)F<_9leVdeUR%!q4&_H)~wu`_sSaO40{pOUfTxUTa z^K!w|scm_!I-v=;7ySynM|*x5*1qsG#rd>t?I9j%3&ON-NOSaJ0p9d;d_S&~dA5wT zc{89KaK4F;`#;_Q>c8H=yMNvQ5JbRina;~Az-JgF;hZUjkde0hFFBy87Wj`G_>VWx z`p+9Mv$V9dwG2+ND*E`39H`HAsLFmM2b>rq%53+Ve2@0B zM|;34KHICg)T^h`yEga#@&lE5ew7P;z19B3nf{H%?=mXiHJ1eh1P6R94(P878f^II z5QO{(A!sZO8EFnJ&Iv8g4ehE8508Fy2%>T-qsChPQ3OSe{}6(X?SK40Wnt`>>bUNP zxS`hn3Iqumd5IN8i4|>$BW?fGfs)3g+P;y-Dith{k}sHwU2 zbIX^1w7}ftKU!e&+yCeSV~@1JP-kavS7k*{V`I;MX@QA}zKx5%)9wD@p?|Kx?BmAW z`oQ4G=-0)u`HiuwgMX;N?CkjR;`s58@!OL}U0`B%d180{>-yo;()RS%nd$k}>79#z zz`*+2%;BGzH{Q3VI zJn-lZaLN8Z^9D@%qG^=p;SKc+Az0=VN1Wf{23aM{_nIr}tem_Ci+wl?_^doGd{_LO ztJdSfX^14A^YU$_$6H>%`+VavG>pMvkQ3=6VDOdySzmtz#ieCvf$IB!G|FR(IWB`1 z##MCzhv;m_H67MJbjDgWUD#`J^(~|3jWC^g`~;t+$-yZ3m`S8(gVivyCu-2<(0QM! zEcZc1tu^mrI+$Eq_`u}n??uW4Sr~4#f}kuA*!5vAaJK)~AJ`?0w=GS7mLw{Yp2%kp z%8K&E2C7dz!O?iFBK8)WH6Scu0 z{xI;if*>m{5k3LQ(!3r31B)!~Jqi8i)Nl+a4Bu3Rh;c&(Lkw5bo{zE-2fZk=UODBr zV!w%_jzlEH?XkSMfk%{h-i;?u_Q)C$f*UcySwU#lg0_@`yBH>F+eK)uy!(s@88S3x zQxY{;Tp_te1dJ8KvKK@XFVc$;lwh9Skqm97P|d~?R|lbck!`bPqu?gi09v8PyhT}= z#5cxt^b|eKk3ax>1%jG=VJfZnVDwwM72UR-6_(3>u4zPYBz>@Vyzh1uD4x<@(C@8? zkx4Z+)!x0Bp$}3=xy)`E#dP?tJkrhX} z9L=yh7W~t$QjUPiVliM-Lgq+n^0%&JAYbANn;W#{6P6?Vq zL&qN>rr~%ni^fO+?$6%AW77L2VD>N4$`$2O$2~r*qqvU(dOzVCObF#bjuNlQT3ia4o?N9U)N)Om}D zu=jQgUeI_byrP{wPRhuBk}z+|y}foE5Z3;51$X~#jjN zQ)@9RN>r!mD|g97pLPGUdT;`L;LM$>;5A~zPuW$Fi@39(0(n2QN$ z8AXBQTEnTqbiE*b9@&?{SSP(+^aQXFBU9oWS@tvtt`ASh2R=IB19>lRV&0iIR0D44 zomSbr(jU=)L2n)^(*J~r_dTU4z3$O3>2$}ENNvto)!+nb`fv>`>}h)Ql}#b@{s9G> zo(&imy?iP!0|m7kn9wwh{OXe1j#P``*Uln$#(F`lm7ocMh6NQuN>;#xv51l7H=m+h zVq)63g$-w!V#GRD0;n~fRbFvaGvhqDRHc|*S9CPARx`QUpNSo>UP-@vI;E`t2PaTd z+4%c(YCX7w_YIIs^-#9QBs%ysZ5 zks-xN*Nls-J(W*l17#DQsEb?|FU6*0(GS z5_@fJ+!z6dZcF19Owpy0kW{wpX_FCsqBg^|DLqup3eR?zAJ)r z`SqblAP7@S3b^3sog-|8QECGqPnlJP&t`e;wGZepxP8z|J2&0q*Pw@ zKr{1pwp6XDTz5hxDoYRb+_LdK{&cLoR|C9dl2Z83^Igv;$&+1^R)lrG_u0iR=q42e zE0-&FD(odr|ft>eDDVf)k&dp?D`Fp~r3dtx-T zakfd(zb-o;3B`Ytml-V>e~e7a7ZUJ0f3O zC%q;wa{k=yN)n1q3M=5*h}G%#QS?>^Rn&R!sK;x+uvi`wLFUt<6}*W^pr_xz2ry@Y-YnvJe9y8jsgIt z^k;f-6B90R!3L_Em}>+R z>cYd)#9+(k<|MxN?VXm>;GAPKa!26c!!NIVhwQBTtG$<9w+mnIuZHgT8o}7SXVu>N zQX61YcNa~sWJZZSI!qFRt1juC+U*TN^9k>EArXGZWvV)d22)Vk(~0D)2j(q6$VDKlmal$Tkx>_rO<~Y`YX#7v z@Z52rQ|cf#?{J&6aJy1p4qOQb9Z2&TR&pRX8Hx7`9VaQ!%PdbcX*~oZANV3I!gC5c z$(hIJ#+|x_WZ7MQw&We@!;QKgy*ZFh)XL5BMIU&16X=B*PLDv4@C9?G0t-ZbG1YlE=E`4x|LG6HL%9i-MBVI#)e-EJ+6s7K#QTs4YkMVFlEvg zXqygj*C-cB_MC2)ELI|Y%xJ4&(DR1>?G3^yjV>k+jtzGyFq|3)Sz0L#uf6e#d2&xNOqk$&}~RH&!05=w6|CS2n~qX+V0| z+mawK_d}|y+-`VdL_*C5UbbAETXVuf(c2k5*g}#0a*1P>j-y(7!nfpjML~O6QdU2g zj~LPc>n(T|d1P&9Nd`e5il&@}L`jNBNJP?;sQZH*gr2HJC8(FFs{T%K7gg8%O+>x- z&ca=qH!4wsF2zDG1rbDkO-Ew8l>ya$Hp3np$FGn)PP(r5nuac3x=6mT8Br9raVJ|OCCor&=M^d z*qkVo7{3%gM->v48z7h^BjAO2K_7}CX(FaY7^WC9>Pf$5z&AeuLMA+Vw?)i$*{?FP z+4W@u_LZdAGf;s*UQOZ!DCiAkiCP%=k>7+t@UJ&CaT5x+6tjDx3X(nKI3AS9R2Wkx zx{LAYr01(2I?3l@|_>gN!bXKP=Ux{a3LN0>dm&Myfpdw2T@<_zG2 zV_>3ibIS|ueRHGB73j6gbG^%1f6?=}lI?C7z+GsnDDh1)${HHVU`PNT1fSfwB;C0p zLO(Z3tlTN1xVKxC7lTSx%XPv#7pTdC3Xz$x<;j}@-Qq%1%PW<;D`S6JKsPE;dFXGV zG3J!)^D>GvO|p4{z+1k#;Eb>&OKngPbrA_H0*-|}2H^}Q-LP|o`jQ=bK$1uKhQ-3` ziaw2wesX$Un-fYCdP_Pn1w!%CHsV09qiaUXYvynBz&#!!d6>Ho!89$-cv6Z)=oKkg zht%bu95p(sp+NA&8E~bpfdoNUT}(>+thzW5&uSfu;b*l_EoSdJ)dU1Ydsc^)Pt zU$>2GO^Lt!lQbZsNc8~1m09ygN%`-A5=yediDPLX*ut6MzPzUy3%f|eCLvDx|&n|+9;R=(1pc0k&9vTg-bM9 zqo`#PIN^HOLNg`qsI0%)`fj6H)vOr&EygT3MOC3>lTeH_YKC8N>YG9&N z^6u%fzU?~x(}@8l!m6zDgNuZ;;e=4>8EnBshLlUD&Vc@v(b+Y9?D9wtv_fJ5e z5+sNcpVoQ6%%F5H=F3P%k>@iKVa{&O=Uq1ky}y*(7W7L6IJ?`6dTmAre^S@?T(MlbXlR=fAIBu9urGi0Pu)6|G717f zNdoxu(6u?M>N1Aysgw_u+v1J}{4&Nu6h}UdHK%3)D#qGx+WxTwSy|L6Nrm|i7#&gA zDA93M_2$|3QMbE7i^o`_7+GyQVhjx*+Lpy8!;p#hMU0~l6IIsjFx*FtADva~E(ux9 zA0fyXKfoK2;l*Q%?Xxr-xM80VQJ>79#-I0xsH#^qE(`|wVq!o6U3ZoI&X{lg$6-CA z&I5`ycNOYw#SN*@)X_3aWgK-e6!Amg@E^|Jzjt46+pwtB3#qM2x0f-=YKIN+zT_cC z4UQDc?x2$^Q$e>=GyWAMyyMwQ0D5pqGidaly0nKHLz<@Q{yBu*eo`W4QY>Yfn64U1 znbs)DJn?%vTd7lV)bz$+=9YRq5cEZCV&HcMLn8|r2_AU#Lu{)3i&+^PDSJzX4JU z2B#;ByI+z!jLA9?}ggT}`fFzc|0k<0jBW=S7VoxC(dQ%6%*9H{q3OD}0Eto=(e-nB)v&n;J>*HKm# z(v-HV&cCyt#{l5RrRU%OU2|q$0ff(2%hgRq;&B!L;^sQMCsva?mUAbTdMg(O{44rt z@B>!e$&Z)DxS)y1dejuAuu&&Ua$#pDT{NjgLlWS7JpAd|JWLf51{nkbzU!`JE(aBB zkx!^afB#kfon__w-JkDYDc3HzzEM~A?Wz4 z&^CTWFZ5*%kg6@^Wo|qIABrb--aVTn5DY%F(k^ibb9_$69fY!T?*3?4^xKSW@rVWl zpeQy4GTln$!XQBw?L7RAOMMPe{N@f$EPO>%%3uN@U#~x+*^>Ug1T)#L&lny(-uzj& z&C-#3t7V&1@;Lq)`6_3=TOV`}#Y4dXMBU~-`ontMds++b#uA&|T#F*#+%47ot>brT z?t4%s3zsp=tY?|o{&*u_R&z);U*GND90K?&Hqyl#idVj(XN{bqSL8kWhNY3VOSAvN zcpnkJpH;q}6<>3ey{nR4_12r_adG=}j($;aUE0>rzA69ajd5& zV*KQcVuQmo$eVA2tL}EsAng-}qT)L@R7W=K=cd_3d4ZtFheM`^rOv8LOeofcDJBEw zVy6})t#E_?#d#-YxmUn`LdWqQclWcdt&aHJU*f2px0m}lmolCEDyNqjgjWviS03^- zeRXfB4)8WVpJL~`lkCP3^0|cfgmyoizVJ{z-LWDOIeSvqql>z>SB31}s*j`2oS*!B zVYY&j>@0bpzI-$Jm8Rw)b^`khCGgtYCVyK#TGZo2=6YoJt7dV=v5XC;b%RMyB>nTj%k{b<9G@Tbf>CK) zWjKTsFxUD64!*D`%hlO?3v8MDkl!X{^3ruxf~w zqSp39cyJhqKE`vKX?O{R86Yw0hd#MbRJfEifwYuQrPU~v8GM$3LnVTC96!H(BcG)q z$>w@F37p$Zt$(R}fz)d%J3!G($ zfY%2_s>HhvK;<#__au_K-I8BOY>ma|eWZvcU{1HuC+J~+u&71km7aZ zHcGL~q_~03VL*zzbuXd-;uE@o;NZ}WL?IK_!nlY5)gMtd5^S2arM?^HX@V)2c(trt zC`C368NOj6ZID=zhUjJ*e}+*3DJ8FA@b59AK2N@#5tCjO2NmoI!AKa6Al1W{mqIXC z;v!aOj!3mstv+I*$m^nsm)Rh5S~OC)frbSlSY>_vjd7)h5gF^qBl+Vw{ZzMg zSch+mEluM!D~OmK1H}3*ke-rx5~6De<`La8f}?NHfZzohy<#u!ObYP%yxSOkUQFWB zQNDnq!EpSZif-ZYaqE4~qv~?T`s37t-xGiN)hYkC(-;=IzwVv7uFq&xIR|Ct*Q3K- zo99vV5rN}$?&mP`Bf3BtpFk@T8>EN`5P+)fCooorq<2&+_26cpGd%7sqHV{Ds1g&W z2Nu9=+PeXi{TVimIuJaq$7M$JW!K&mmVuvTLUepsG8su!C!ZZ(c^i;ebDF_W;_Mn0 zhmp3N9|7?;(K`G+QR@m<*=xg+nq%w=LHvQ`*Oz6ad1wO+&5}WQ{Y6nvp$gTE772e> z%3kMXYURo;(R>)hQK8Z3?T+e1gw|Q_`)QT2Z&(q#4gbw1(H;u3MRpf|0o9Bi8bR;fN1QY zn+BP}4$@?hARt6Dw1`GGwNTE2T=0V4j1rd$f`AKRbAbk7=3v%&)Mdz)h4L)H3x%p0 z3seA~(1}I`n3bm+7}trj0Vpy;;ltRxsR>3fLZ^O1IvF%XAdV;q8WtmxCK7Q{6g^eh zE*gW3Mq^YPEs3Qfr7ZKBq*k-pf}9M3xUk{GQqD4nb)%6Q3QQm-q{HcT8~~L*KzPAU4eqyUg3j>Q#_0d}}CH$rdqAAtQ_x z1Y;-8&_PaNka@wu#o1yp#wd}Cf*`CQPpIn2;zA5$oWf*1{{nGipi-BYQDnr2QHmuF zpc4yr^8wHl?P_KA0!Zv2g9ia1YmF2PRb((|56}ZMMktxvdbk35aq=s{`5y*zDBgeeSS2dT4uT3JA-u3dP zaGQQ_ok-^&kXV-jT7)lc-20FzB5nh&q40P=XW;TeH@pl!&}=r)I6fkWb-xW;6b^z5 zDs`Az8l5bm6gKyQl#WX@wG(l|t6u3a)8XYCrhe;bjMhoLgA+9tL+(+F z%A~J!;F_n?g*)+`TdL?l)2Dos%;6T`?To z#g;f2Krb=P;8F7gWE@VBFj>tuq3LY}J|OYE@j0J7fH`tEF2@~0V-qgblR@O@UQ8MI zaCJJpOQ;)NO^H`;Ccl8oO9FHB$~@HFu{p_E|07fX5F2j9bv3H@)KQxhy}+hIx=WPK z>(*tlY(=;5A2&@y;Sd4YQBt<-jI?!P-o5Q(FSy**E_U?4eSvm?ieSd?qi9HbC+}YD z-4)Z6y-T)Ae~$(<5W@c^;lFzOJN^?qDw&XYOA7y^tu!d1Oo*E8BMexG23n{C#xe+g zyR(R6IgN;c&Fj397_{Z;xXHnT2pEYNhz~uf0Qtfciy8vbQIzI5y-Se+(t8?~E*ubhLv7}AIsOg!K}`Itz#aMft+3iyARJ zL%{0`HB3fjTt;SWMrNcfXN*Q>w3Q<-{~ml6h%AknyCPE*FH|(bPQ)7}l*sFQ#Z$pKS)8d& zsl^4W!e>#NkHErR^rPt8vtNuGA^=0I8$%E~3Mi9Cp&Ux0EJ~wHz+)h)HMGXbX-cPT z%F}pCshrBFoJy2Qusg#_jF% zF-e?!h>DECiK4xX6h+;mIo=ydm6WL&LP?TjMJC)iT2#r|kg1VN$yjVnD2mA}(nacX zO=627U|bZQBu1Yk3Z()||Fj%V;w(<%JWk|HPUT!q=4?*l{7u>_Lui=Jr<_jfyiV*q zG_BlD?(9zQ{7&$k9P0#2wJgtQC{OfEPqdtzWAKDVc+dCr1V$(bBPf0wL3)p}hsDh!WjyXUh794?oEUv%ANlrAJm~#`$ zj3LbQ2!SjK916r848@PQf!yQBXaLPo!>(8)&8Qoq7%0hBY{J!yO`~HzFJcYZWV$P~ z%|{bSJ=0Bv0>cL!Br`k+r8eYS9Wbz zcYRlQjaPOBxS7cbXix=2P=!*^*P!TEfBn~geKCOrSbu#nf+bjiP1sX7ScU~yg?-qE zWmun}1WGss|4JYPMmUB(H3mD)3y%F*jtvI%d^Y)H1o&ixQqTfxq5`AfQ#<%ppI(I7-4T+^CqDcvGxptXGO)211CtDvjKs@dZ^NSKE3@wPY+z zs2LVIG-Nb}4|6H9&to7BcHN9Hpw69gsQG}B`;105VG_x(jv>iIO#nG0W*5#|#QH&{UJ-)l$ zR$kOwBL&x@^4nzt+|$qt_G62~4IsmPU-*q*qtU;P3kFCCJju=9#5h;zlnm{3O8;Ka~Q>dYKxz+*j5ssR?@mKA5}9ArX{XGNX` zL1tuBfMis-XI>a&M+W3s7~xHranDS0X|?pcDQ#& zWI;}32X^3nF636Y=T@L+f97YiUgQx51yksP2sn;{mfB2a;Z0uXUA@6ierRE>VX)oa z@nVT)g~cA$=o#hcg|=QIR>@eN&7&jf%DLqxzD>RD!YD4PDRybBao@YJh4X170)T)T zGl&ftHz+YOZ99x(4u-Y^>Y$D?gb<*i2nIkvcHl#nZb&ZVv`*_reqdB6VYeoUf)1|U4VE8B zXijEmymn}=g=iGr$Y=3rTm#9o-DtRJWoQlTw`GmR7HLSV<;ON@nv`tob1zn7>B}yp z^hJpC2?PQN00tm{0f2&L0J4n1kVL4C2px*AYX-Bx3h=UyHn4-5vV|aF)ip>6O0WYC zA1SjCiOi|HDi!M24v7GoZQ2@&U66~VDvEMNpmP02%+86=xQjpV0-acH2BrvFki6br zh6S|k2XO{94hy5mPH3n%0j7m?X3{;35@=uqTnOt$=4a}TXYHo$|FY(1M26tk7am^qHr~DNLHD)^_*UDDM%%)!@9G_5X^qAGo@K|bTkk#T zT%PP)!+Pjrl4um;~#%gj7JKR0spOfbpD8ke^QWpN2AOtlvX;3)fPDJ{d8Gi-RC| z0chGLek+A4c7jESpkUAfEpUbxpanL-1TLU~Ixq$esDnKS0uV5R{tI9!rBZu;(t2-h ze1`^1z=TCugeOf)>tu#QivvrT&M6^;; zMSz6!v>96X182YlX!!SNfF@(W1k&0=QecKd_yY>8gC*C4Dp(RVpKh+U?nKURv@V1^ z$b(NH;Yp4F@TT*FCU5h$>le;i64h(3LXSO94FAQ~`;Jz#@6&;T>w0yB_z|0!StDu{*?h=xDV0xRG5d#Cs8 z)c1K`axJHYQ9yX6_CJDW1~Ld5DL;r^FoRuygk`{lI`{)i*cmEdge-srGoS@6AcZst zvpN6)WB3D6@OK4H133tW@2`VH*n?g814safJ*1G(s`CdDrauO0nZcE%)G<~PXGvr= zt5rpe6EkXTMR6l4R<{}zYV?WDrdFUrb%{VB!;J|RDn$EW!9t8^(K2NC!Bb}po+hGM zuvzn_if9#h^5B^vnu-fgb$+1vA;X277JhC8%JT!!3>Io)O}g_b&kNCFNChkPsS2cF z(PCY@6>QP5S1%;pO80^cwi(<`4QuviS{W+7|3;Il_H5s}KLhUs`x9!}xn!dSeysB| z=+L4;Bl~3fbg5F!Mvpcox>>Vep?v#9 zX{f2Ttbd@vCf{eY2@ya5DI_oe1jL}H6AWK~mr4)Fe8GfHWwh``55yn?L^SY5$Alqe zIOkk6=(f-X1jgCH#Jf73QAQia0a1n+lzh7^!wkC@%#EQ@3mSd)=@bl!yR0^G!=I6& zlWPQi#)eKGgGPf+C`++OG*q1M{|7B3|3L!{dw6)Wha=*gA%+}!ND3fTcE}7f%e<&z zjLlf`qB9nMX2u=|u~A1IyO?1N89W}t#vW9}yht6!I2er?Bp*V`*>Z^T#~-D%d`L8+ zP!SCh(U3AVDT~lT_8>~g!poY0XC(NWbiNrUE4-kRM`=3+c9gUHTy|w`LP%6XVZ#CTM7gWU;qTE5aXUshKK=2`NkoPj2KTi zhh8e@Pofhg(M&SG7-hI(|41};h+&8?h;fSg@o#>VxCAAT5x@O#40;Zv*n8p=pZa{p zJ;z{1Gmg5sh6KZHdu9(F)B#3uick7EO!>EO@9BVR%9q#lQvO z*mSs!$jNYa$_Ot$QIa|RDNrt%oS|%jD9l}^QICR^=a}LYsECd#R>6wtI)yq{g$gU9 zGG6OW1-n#PAa{wh9i(EVnZzj4R*+$xA%h1ywe%`1zj_K~gr&U9tg3m>dmw41N4;k$ z3wt`zUTA(3jZ3t_{}A4a#>3778=V{{7tM%{9ujdL_Yea%-$KtZ(DTdloCg`i@P#ju z89-fn>s!;>AS$8vuo_lyg2w=j3$v+{U&O67;uNQdM03Iveuii;{EQ1}=rm<*s2O!2 z11378iWHRs8l)H-346E*qs8b&>CsR#LNXDJh!IX~nvTlyDxIh(y;UQH+4%6N-9q^%B56+X;5XlD@Hn!c97I5Q+c|(P2MV|iW%xpedkHzg)(`#P3}`n z300}8GBxW=PXl3d*N2feu7d?{dDE-j^y0O>?rqpH!U|bj_Vusly)S-INi?H<*MW*% z>@NLDixsVB8CHx2e~mFubz+vYoL!ScLxPIWS|qff4IC&++mZ=nAho&GRBLQ1n` znWsi0s^Xlgv-&H+(1fM?ygE*JYXgDGD&8hQVEY!<#`d>C z|Dg!eQozs~t-wfu>sm&^w#2iIG_NN8;nMAPkiN|{PdB~DPUF~A$JNVDXXR5>2N}8q zFEXn|d0ki|Yr9YGZa;BN<=C+I*TKFx#xt&QV6PC&RE`ES5J8AjWOWz2s0GSXj&hTm zT;(i(xi4N0b6?xltiPc-&U4;gH&x^mEI$R%PjNP8Gi=R?^(ueJtRZALqUnwRh0~!P z^{G2T5E-62)TQnSML=Bet$ZW0oR>R7hdpGH@7B7tuB)PuH7bccY0M-)&_SO-^o+H@|M3m<};u9|Iui^ z^Pd0w=Rw|{(KG`Xh}gp#Qm^{ev%dANPkkI>ABWe|zV^1iJ?>X8hTZdi_hAsj8p0ra zF$iRZ#-If)OpbiyzkK=0XE`oR&ImvNf)Ir$1ocVL3@~4{h@#nbN~u?fC*dx+1-HI@c^-; z-H64O+tC)>*_PZ@njqQTOW|F<=^ej`T8_mQ?)2Mop;Ts^nvngNS$x3Z9hs{sUaUDB ztwEgi@LICfpba`uc)`XC*;UG2f-j_;&Oy^IWK}J+oXQ;`5+({~-{zm&yg5 zdl=vI?ZWcO92S}!E^Hz85d!snp)o9i0w93|;L!LPpV27T3Z>!r(ZZWJ0tG~XOPGKh zMt}*#VFX;j1=JxO%Hi0_Aq9v4AL5}N0^%J~00qRr2TXvuWxxb1l>@RH+sW36RSE^- zmIY#3Z(-W%1+2YL_D%IL5&7gWj-Yeap zF6tsS*&@&E%w>JZXN(Ze2xDjzBQhqVGA<)CCZi5M%o#@G3I)R!M#A-7A0td(nK(d! zD45Zt;WwtC8DN4j)PWV%!N-JSI2r>k+=3!>03regB2vH%cmN`@|G*(qfDFvz0mfrK z=Hmq%qC6s^446O#7@AbjL<1_?1G-x!N?HYK%1XT$A!T5Qu?h#q#f^nx-|d(P2HsNr zPGX!O!5LmFDqKh!%L_8z!#N%+vB$CPqD-Dw2i@XK4puYfq)z6{EdpEREkk^fL?aAk zHZlS(L_;0Wz}TpxeKb)WH~}WWfhB90{m9Hd$5V^vguOP!s%iI^mU;JeipRLENMFLI`5o)=Sw|K>Lag9e4>F?hmIrluz_ z!ZNsx1T269xYB@7Ni^h>mOK$_EJHCM!y}v}hwUQ*f+bg)fC{`NV5rsv1Vuc?K)LDT z1q|mMu9il@r9sl=4J0HFpdCZzC8#}Q++m_b*4?L6WQ<*8A`zxWdRpy_B4R2RNWR+O z3D0A$peqUr#| zRlOt)4k(ujR)B)W0iO#6mDaLAjz;%9@j;E(}N>gcG2rdrx~2Ik+L|7VS*C*Q4S@{l5rDQ52!%c;sIkx2$9 zvEX8=Bxiu7WzHhR5glmss;@?@X7buBPChRJt~#k3t$>su-rgE8T7C zycTIG(hibtq+yB@zkVdCnJSd3;w2$m!Pe(w{=~7!fWp2i^u(&ee#XjrEZX8~Fsz0W zRtS3&z&&pWPa_7*# z-K84sy9%kiZsOgk=hLdE?eN6ZCg#9d|81^d?Z8f{WLBxyf>PLGX_Q&j+_tX7Kpxw^ z5;l>76R5`vxUQLjY$>SHo4SVF3Krj1>xYSj%%-cST#BO>nHN++^&kKY&0B5{&Hr>PLG6=f&*BB676j>OsgIa#ZtiQOk8AFFktFX zumymvrdZzFr$<(;i9M{sj$0J1=4y{<-YK! z#<1|raMbQA3RMZ(SU28b`w#yHp!D?@f8|bZMsulW;(qFdk=y9!oACQ||X#ZU$nm z41?+i+VCM4Y$C&Fz%thllP;?=91%-0CD)?FrN@{dkxtx*B{0l4i!u%_iwx0_IEyJM zBd|_5fER4613~O67mq8~|6MFkmmIlqEyFPg&jlR=g&m)89vAJTv0@7YCes@8AS1IV z8gd{bvMB9vd_wc+o}>^%ay0|iBx7bahXw*fLq~(gA>gWjd^4DY34MX_$BfxI^VLd= zayp}iCp5z{-0lgebjjTG?~>jFV}+@Ct>q+2PU%EZwen5iGpjuBE&m-w4#gd#@b<=C zUl4TC{xNwjvv3iHP%HGOaqco7Px(G+=%OksOLGfa^eMGumL@SvkH!l;z=3@8?dn7U z=mY}z2Y`TaG{p4_>;PZ4G%De$U;FAy+gePA@~o~$Jd?`u0`;p1^+ew@Eg$t|EN<>B zH7`50r9xy>_whs$|7rNraH--e4VUi?(}h<*G7qDgz>YOVPcy=Hh9t}2MuP?d9Kr*{ zb;mfsAqW6y5U_y+_Lc&7{th;uYp-fqQ}bD0W?Ij-Xyi0o-?Ycr4FMmBfZVPn z@V0O(@qf=PahC!m?9y!~_fC^wcKvj7gT-^(b98qwbwl*3ST^Cpa&|}VQgC-cdv-C4 zuXu}gAuBU@pLRv3whvDUzZh7Q&$Qt!gznKIcKW5rW^3?P7f~V0RX@`1k3rM(79u? zHe?t12kW_aD>-KW@`k?(XNxB>#~4Bzx|MG^iI?E9@VcXypqEGbbgj63p6>A!F?=Jj ze0TZ{a=Nq6WSc|8%oG3!Ab6?!_^Iz!ovZqt*K(el?w-SXhHEyhceg=*_F#s%R@X3B zFZ!=H|N6l`vwBOq!5({d6|AzCIkTU6wC^Ic|GO@>xhITO$UqDBz;m2O!w)Psg9mx4 zL-z(tH?M>{OjURtZ;qptd)(zztt;)VAB6^@Z`BfVqBHcAFEpkB)v!bJR@gh&iu-1` zxawB2TE8yo{bGisDbJ^AZ}dFS2ffe_J<%8ae_gV`qw}XXOD5PCDhu$&Dtxv#yiWsp zr*yl-8})P>`95R3KWlv3aXbZjJi2>0Ran5t3o>(={FS3Tq4%Afqd3;Se6c(7iC6l* zU%E#7J7`qa#&ucc{k`B1ewQJA(sOB>H+{!|kjc>ZD=j?L&pEe8JcLg?t0%RLc|DDV z|5U6uIoWqOr;5CJQu*4qdwGMm$_IN-L%Peax7~|5veP_T_j{&O8R6eP?&to+WhSo1 z27Ueh;g{KfznSnu{&EL;V?Vh18im$Z{8S8C=1=eD^Ku9_?%1Du3)j(Q^pQY)Yl%;i|>8ygT@OTgDgEvSfy83#n;6F#Iaxl2^KVX z5Me@v3mG;v$Shh!iP3^hv^X&sGiJ@AF zY}PDPvD3qh$yRI$@Uw6#yuifyZO=hmbnELdpT)@n2vd39!Zn)Sk8wt-`;J-XJd z;ihZHMl7orZ3e$~t;%?7w6NC;i8&h{TJ$K}Xowa6@;zJrE743X9^5`wX zikN;Re2M1S&$fTRw@ceHY2s&zvoML+0!k>mii*rE!=N&)w5zfLZ6~@63kxu^R6A=y zu;f}Ssn6n?D?S2JwPWLDp1k3^d51;VVVT?z$|%1vjfu|EkaQ5{)z- zPXkRg7uy0#u&HG8uQuC0!A&=lew)ZQiZW@W`O1VoSycdr~ke zqHLTCE5|lO@j**RRO-T{>awv&xHgnf!wN0aG*Zb*Bay|!T;)+IR`=>_vQKfu5U3qF z?6E`zbqX@5A=nx+wGL+;@U_8W)3eF_azlwuJgbdJ6F(-|GPvKuWJoyYcq4|GFGreg zIyM{fh23`DeHYF+L%McOj+C&(T8t!;FCsZD@|Ps|i~%^LJxY-h|Ivi=Gjt|}djpVB zW(&Ma*#uD?$|tHE3{}TOpK^sSNzeb)-J=5)s7-qY*d= zzVLCki5v{0VG0yT#0b&2p%HF45fq@H2{^O?4s{p}9$MswIgE%BmsrFg67h#mG~z^} zP(&t9QHN4g;tnNJ#faEoi&fm=5Sv)WCUUWd5xHR$eu%|rfKi7i@Zv>s$i*+#F&biY zV;-$IkuVZbjd(Ny8Q~a_CV1c?K(rzu@yJFW4oZ7Z|KgtadQ*__MS}qZAb=1uX#hhk zFd~5^+Tcm|zG)TmlHH1cED48G`hM00?E^9}sQ{ zgfECv49s~UNggt<-3*5!AzWrjMmSAtQb|8D>`$K()r?zQ(Mi_gC{hr#sKmOAprz103|@#gH*_`4NTBQG&HeM|Ai76Ux)@1;3q#nwBZXd zI79!S0EIT-)ec%pWeeI+hQUSy0&NgOB+3QTmCi|~nboXHX!<0ZZWgqm742wAt0i`V zm6BW)$r#ATfb)SZOSX_-E~DX!9)Pk9X9z(O2nYoxw4kriFhpa|zyu)NfeC?t0TW*E z*2E$M2$RU=7wiB(iF|@f&{U}eompD%#r)oo@i!ngJ0DIk1 zGHmG1;=5u9QTWrHCR=;CRD~Kq>A8dms-7sqC;P7aGxt zRy0bGkqJXVO|0xy(?Q*Hq9#`jUxyylALEj8N)k^*6g8G-D+1O zy3vn5YMrD;<}iJWZMW8SeW?>1|1sUzI+M1fx`d5nV^0uKhs9n@-))dO^miN3fYwf3D`yv#! zPNnB&5MKm?T>yU*E{sudgM+Wv=hiN_rNdoQ>p6wxu?Umt&DD2%Hr^Ayv%VzmK~dyX zg!qyPdd@=%`G8zK6hBGH-9y5b^ULHB5s%7E!ep9vkmNa^O}Y;j&5O7v=6@5q!qSWH ziH}4hNmu&Pncj4#KOO2(m-^JHUUd;yyu;BJRH{)J@o0F5f?uCczDpt}uCvhDI5(3B zn*$%NlZ58t={d(u7?D)p|2!mT_d3{9LLar0&?0WPh@inU5f-8+?Jq1kO7M>LWrp4H zqSd;d_+<&bWjh*&?_eT&Otu}Gej|VRmfx)Z+BSh126XY z{3#CdNqoWelxmbuJnbO){W@js`N(G$^2guoKM9?%J+Pzonv@vv_S!HEH{@S31d3%l_6s<7s~@bScO`7Tbp$Pf)3 z4-6A94HYH}+wiK)P{ZJm4qa^x;jRuLEDz0z3-{0uqwEex!UZAd8I*zE-tZ6YqYo2N zB-mgj_KywijuA~F5Jh4T9i|ufpbrjl5}iyAGp-Z+FB<-U6sUmW(gXCU4{yjr_8wsS z3AtDYk z56kiBKuaC_KprEa9Vg-=+Yuc%F(QVc9-{#s)qoG?F&g;bBM}lHqh=$n51fPnBQCMY z3UU%75)-1~1xP`0w(&hU$P8qTB#toR(u0K@;2?wG1st*Uu#x zaDzCD^EbCgIDu0+mD4zz^WB`&IGK|;myuR&I;-<(!1Fkl zlRV24IL|XW%@azDFSAH;a?;};Lo*-Mk|ir48aiPVB0>~4(jy}x8Q!21o?$8>i0161 zZXzLHL~*@*(m@MPB2K7Uj3F;2A}9;A48>DJH#q`hX-Gr!_(AKy^b878F9GVdMl6a6;k;byMXKhxabbFJY8P zo77346iTC1N~e@c#j`!FP_qhA89I{Mb`+)5sTmqC79EsAOM->cgM$u14rmi3;IAVn zLO0E8Nvo7j>(ox~6i@S1Pp>o#2eVI;BRDj|OHhJvs;@#Xf)?6sPW6;g8`V)C6;kn( zI718%{q*WmqEIb$Q6rU8JJnM^6;y|lQiaq~nTc{rm9xtW0^;nDZS*0~S|DiQn zjdeVmvs$SYSFIH}k(E4?m0QJ?S+CVN!$TzoCQ}E}82A!cBLW(N0T&2vUhCCf?-gJ3 zRbTg&U;EWx{}o^ZR$vE~U<=k@4;En)R$&d+7?f~M^6xMsHve{kVk_3!5|v^lwqheT z0Nrn5B{l#%aQik^A|MuIGdArYmM%RuWJ3ZmUA6;7a9!V(W@|R`X4boK_97^P22TsDK4=mvnI4=_1^t=jK zX$i*9g7*b1;ROJ|D5Ey?2H0lr7p90o54__P4xvY*%z=FsKF*IB{}BLq1t1z&I3g@K zA_PDb3cw;Uwu&w5jAiP7ySMemw1gs2A}sGBAmU}q z*pBbG0bM8D zkTV$#8+UhMcaQ%UBoOy=P4~e-d2uR6M%xq&$%7|>>J1SM~sFcKoc64sfW+u5Dp8J^==p68jKJ;9z8l#gjl*Y=s8``MrW z8K7~^Ayka30@|Pt8le+2Eloh0yq>tE!&wqh3h*M@oTwm&b5<2fSf+>p5oj8; zfI75{x~9hqK~Lde@+1hCkUWT*J$kydSbEBYTB;3ArpsB;kUFWoD^6~rTo@;+XM@5D zc{8(Gv#eUmu-dy`3J^xvR2R*wzdC2*7M#?Y!`OPX|C)gjP{OT~0}lS$oR**vCPE+| zuF&e*t{dBKf7-i{Aq!r*B!t?V(}$b@0ort<6>3O+G&|A~O|KoBw7(XzDQC1r0u?d= zPvplYO~SHEf)(&Y61EWAqUu){EwxLVwE5a1C>xx}skNg4xJM$kFQO3003<-E5Q;k* zP(cUpqYs zx&fpvCp@LlTc>bfxL-OCB7zL!8xfpafjT>V|8B?>n!zxY3KZHbB3K(pQ$o148@?k# z5FQ~SOo6~7f(||$BQ(6c9vs4JTEdlzweMsJUOF>{jw4th#8u+Gp(+|UoU?CXfeL)K zEkdYCT)1`PikjiQ3p^U=APzV}ep-- zJR*|(#k1SRf2y-T;iWj@qMPBom5R#wC>q3EBH*CRM!Yu^+>4q44f5+EmLRJpVzzOC zs#+ntGa;&O;=m7Efuh001>uGSAryw_z~=?XXS&X3eI<(g)RF2Dyn+b8^ssG+2;}D` z9AS>+2gX5R2{auJS|JmryBTyGspRK||5`i>T-_r4Tq3rdtL`KU#JsknArq=-jskNc zT0FnRd=n&s3_@Hth+v;Usft|v5z^?_X92V+BG$)C$Z0*3ZC#C`;SsLL({&>!#@woO zAR?;B5zZaQYbe3tAiHsb2#7$><;Mn=k+C52UzKw7N`lx2nP=P zn{-?doSh?{NDx{)CpO`*L1`kK-3EpT1#F-R=BN+~q23)@wDn!+%kIvtDjJ&Liim&} zn&H(4J{r#5z%Rm!9$|>C2pL|T2tq-Ah{6V{=m>0FCycw}v8?MO;=R8KzBynEjKGTk z-OYcfirl;jkba1wfX@pY8Q5MT|H!?@&pn7(0U5kWI_~|u@_p#>nBQCHFJeQ_FWm^F zXbYkN4Ftg}B0>j-2n`ngC=96yM#GSdfGZ?Iilj&)W*ltB{;7&6A~aimbiC@djgJl- z1(4wpD8LAE2+j*U=Ocp8C*s_#`%a#`IkwtwM^6=w-{jDhqMthN4x#=Ie~8=GjEla; zNn`PC!0Ab%DL&vYY#{U9B1I&ELeOITy&@~ZU&Kkg835hIX+H8LKk8@7(IWy4wxH}8 zJ&g{Y2o#~k0m4zVXmpw(8z?MVvxU)M4U877*~5tsjZwTPfMS7*4+U)G2+{$mi55YU zG>I~$%9Sizx_k*Urp%c%|7+TW7>w9LX2F8pTuG|r&!I$7GE-GjVzdk@KB!PJ(8i-^ z7Mwzj_7p19t52iZKr?mXhk;$OMss@cD#axei6O!TvQV^4(cl^!7)8;*EfYf#QP@n9 zAxBZrTqGiBi;XA~jYM%IDVnKh0y7zkR)~z!M$twNj5v`QNCXpiL=!!cG)9jORJM-x zV4%lcChRwiFD=OZ#B^^t4Ykrri)psn zZY!N|buts_|3f<7R?2O1Toj^dhn&mpikd1^BzF^~+8tR|Et%d2BVd=Fll?jwjB7^Zr{Nz7q{xFiUjZx}}5B0MgsTAwNW#p&V5_kpobpbn%`Y zX0$T4EN{*A);%4=Of$svBonsIb-kO*@m@vqzirqU-PkU|QUT<<0zR;xP5bDF7v!W5ar)A`0d=imuFlN6DYH)+a!`}z=H?O(9 z4OQ~uN(ke&KLWnTfRxkI16%Tui^Rr67ZHv7UO)=P4J3XX?4b{Tm?#f|5Ots`kEwXZ zmA0LybJ_b@0a=$h7peq(6j7W-jPWc0ENdcKw8*4BP zk7yI)Auox^OD6ImNYa)K{vxbMLa~M7>k*mSWywsca+N=PmqH9-Gy)NbBeJA}EeT@F zToMGA1DRzme_6|2%95A4%!5#fAxX4RvTGq?r8A#7MpsG>nWMa;;93aHY-*E((nK3I zktaoLZgZUEL|!+$_RZsk^N!_gr;3gNPj}YjoLoz%@zyy>dFnH1#0Xn6X4K4mri7kb zvuE*+aZPp#bfH55%_$;L9GM)eIVM34ic*=%Y!UP&d;E<-Gl$UR1(cyAg^8Y;|1r`k z%4B#e>*zzm*tLze1X0jY92HseQOboBoF(n4Odh3>jQ&K2LV@YzWC|^cUc>=^bm>ZR zI=P*y)2CE*35@FW&mN7$BCzPFP_I={kO-AUM@gwmR2Gtv{86bif$Ag^D!H*%m7$;s zMtm?z6Q}O+Y+NgAi=2wnWHJ-3m7J?#QSvp*9fNGV$*5d4=2yzORhfik=3y_(k;^Fy zvyq+LWCtr!%!+ojMp1=XIcCpr#Z`WfC9P}q87xl(L$kE4t!;0M+uZ6Fx5OY0Nm?7E zXi;i%zPdE+QzX5bW+^#NG8@lW+V!{EY=;fR2=A zbjwIVYNNYBS~`aUqM{fZu+ccWyF;WwL>VdFARsCwA|wKK&@p>L_mUe3&c2a+~*^hbHvGQqUz1x0it?E|x=={sjFVweB_uStezkH=HPS4A| zyZYd&BL3;cW#52~4rwxDe)lJ;0|^W1qPeqwC&W^YMvsScrk3(Uq~G&TPRn>WE%o0?i!2NEu^c?VMaB{uKo z>h9s`Lc?fFY}{z+Hu)2!OX-#IVG;T z=n|oid$%5U>Cl%pCFEB8FGXMTe-Zk+?&QvAqypE=VHzUQxCB;jlC2i#YK>Gf7r9<77vp=iejZ`-`Rlj{(-8c6i zNWV1kvTN)Tq_1ru*SG!;NPnr(w|6uR3^dJ-wzRx%8C_}}oO%6!K>F#`H%ph^*!#Ed zy5IEi=ZCYO)@Kj5 z7bd0_E;ai9q3A!Z?|eMm{STqv+F05;UfMtZ^y}c$+0p+x^xqCI9s1SJtE+!b{-fxB zoUR@ISl`%M|NHOj_THsNzp;08NzrdEEq&iR{Li8PwzYNeV|!gw*_zk3Hq zd%u6~|NixV9r`~f=jWFW{r_JG{UtW9cM$ z9y?I8xb%kWh|7UGgzu6!r@pFO6C&uA8OkkqXX)U8JeVS6H#U;iI5LXb<^Acv%Huti z%blnFhVA~~oVeDF-kq#f&&6h@?g!ovt=;Q7@0Bm*(r00b$$=V{P7h=PSH`c|9jO<` z$@z`v?b2!Z_yw#86=z?_UVn`|n#3_EJ%mw|hxdN7k1;u=F(67`)@;AFB=%#v4&-J& zqpz4U-o`$)-WzNLfJ>G?R=_G$)Cp4kK7^QgpgUxU2j= zMpmC0I_g!ZHPi#Ytta0q$mGf~00U7bk+VQq88+N3%D67{!}iyn@@7{oH!xI7 zgP!uJpN0I%;k;SAks*gZEShOA)j?MldMO5k@*~I;e1E$pNm1aJ%|aNzf6)`!3+J|g z3M2=!N2nkC!k1J;C7K6A*2k&wu0H!&Hk}})9?z6-Nk^!w@Wf< zm~=~OhN*@cw70orN7(N&CXeP0Oel|_N@(0Bsv&==udAzzDIwy-J6lWgd3E%*HQXR@r zQLhWCt&fis>#QlFRG*rL1}ZT&VoKbP&}$E?f{vQ0PT~AH5)6X$okVHfjoNhCP1Z1j2#PAfy&FnwomR@%~aU; zK1p^KJiqzjD(k6Crt;&%ErTTC-Bnn-Zdu)!F&YPzqkp zl3`z_1MZU>>W=C^ccg-3tdf=Ml%(P~uheV9k zqzkhFOR@{9J`VY0#lt(izswmL?Ke`)6>6?CvmE#WN3(8trkkap?mJ`b*q*-RxX_ z*lsZ?4bkPHT}5}z8?7NhzQpDeSB72Ljxq)e%cRpUvH6=vnGJ_d0J#I?QEcOD~$r}EV4HZy%b+%j$z%CB_F2<{Dz4PJWenTJZLKaaXffo@}kW& z`caC|R{Q*TSdcrO;>1vW)O&*H3TCtBFjVas$lR_ND`Y8!X~teNg$I_gJVk<7w_0=J zvYPO8kP2JP3=+Y~L-n}niwV}6^uz49M8R=D`=FBa%wt4O+z<)GXx4szV3|_l( z_vHYB?~ht{NQK=atxrymG7vP%+M%z1i+=w10dZ9z?ZFG6ggzWYRJw5f$-B0Oz_ChqU7Lo1Uzn~_Ps>DJ*D}}!Mfw+YfK1ub~kzxCE5%Zue zR^*iiHP-on*QTLusN^a2V_N79mRmqif1x+tV^=~?dyrS^qjU@nvC?#%)K&WgldP4G zti5c$BE&ckjuF<|_xcsa>JuK0ta1H0eUBasjEbcjVc?7C;WutbdQ&+jSj^CCoX~I+ z&zeqI9n#0@e{fIfwHtzx_5Hx+Au1GWB>f`uy#ezEDy}7~ap~}4G$5fd=iC3m=0j>r zHEX44#l3!aHTe)TRL(uvueSGls~#2NeKur4$)kE50-9$#UXi|!9ymD3CbGWu(Fr}9 z=HELm7FrtjD`=bQ2Fe287_M7KKAM(&b`n>3;AZ;qY+9Bmt4$q6i**OF*U+@oMH=n6 zvj3SMFm7o`AKlUM{ZL#^6C^Vf=jJx?xW69}EEPw$Z6B&M+WtUT{z+o|t%9@8rb=i+ z_5lsXONf0z49**mg_3ZR=rDPN${aq71# z{JpJDhHl*eF0pPC!jo3hWgTh_s}6<_Uw)lY$PDQ{sR)K$ji{Bc?t_DY5Vc-3A`qa?dz}=; z)Y}Cnk@2F~pK&OMuB$vRdYB4GQE9JmR|HRcMyd0T?p}>x(o8zY(%Yr?+Zk!_#}GXd z+f&OVRbq`y9=^lSh2u@TsJmg|Z(kuOUtM;f`V>^ZedY{z0buBFp+Jnv3DmG&9vV{H zqfgsTB=uf}&4pQ4ohrIGSJV?J@{?Uln&+qdg8v47b3I~tX8Ou5_!AAHK#_CG^wskZ zVJv~CKqf=y`!W$r;KBlRwhlnd?FXSJ1qsa;X)tNHT@P2s)yb#zDF3v@>aW0^ZC9G7 zK{VHXeI|E4mzpWwBN{1dFm<9OLjmw!06c(9)dzrgE<-?c@P&QK0ut>r0REUBe`f+# zMfvQrr<*T^wig`yE!|n*zO3*)1>a(CLGMwr|7bwOrN#2gQ%3PY1Sl|KZ;l2i?9JvK;QYX71?tZ$jamvq zW?0jTw1tJL!^1pX>MiK*GEyrw60!5dJEz0|mdGH5$Y7hu2O*Im8Ih0MBA?7hK0A%X zu|(Df=&2pMb_WxBXZ&AU(;!cMMJ_VDtxo+p6bx+@*m?PRx4s2aVM4Q8gdAmQJVO}n zmS{_7uqp)6H38jTY5T0npBn65;PzS#4=&oV9e**`)?Z*YUJJg(*~d6V;>=(9+IV z%jw$aV(7e*ym3jGf+W?8uB5h#xH87e-w`_>l?i_(-Mm?{h+<+zh2Gp{)r6%qTfXlXRhNy~Gj_U>$T!)CazWI?zu+PM=4~&nj)< z{pek-L9ZmPz>{bt&v%gx!}gYe3DuC$b8&1 z3zP`%Hq9QY$Vy#EVw_BA=E-mXhEuKh9m=UgHnIyuvh-52!IL2Hib&^Rx^HIk*8R*Q zO*+GMcxYng(~F1HEmXNm{J9Vw3MDisHz4=v>omRZNi-2T-uIZ*A@mH@+jp z?GoCOGo^nsN-dTwkU80X=}ZJPX?zhC%Q7K{#oif(3w1PC14|~+h_g)E2z18J2Sv)J z(1i<}e8aZj1gBEcUI9p z2y#VLTy-h6iK()aMOTEr&R25I{rtUTb-vPdB8$@HWjY%;zPQr9 zJ&Rchp+W|Ks=AxcS}R~y#Y81gz$*$36tb-oeb$Qzb)m8?ken+(HWVwH2fmWLu%>lI zi=2Kh-@8{wZB{q@I7XRN$IL@BD^e?#7&m2C2@ZV8Xi((vSdaBFn6tVGX+Y2W<{4Yi z4gUGZ6I~5bV#O$EiCb_vv=Cl|X=FX9rar#O`mC2X@EH7fv5tGV3AED0 z^ieOnN;j9SK+iV|@rKSeyXu!5duU=ovr8i=@f8S2G4_>CXGl5x6oC$IG0Qbk#)})Ydg=NLDeCvS};!TOW3p zGfcjka=Av2q+kpv1!KUJ^{)kobnQfo^8bXNQDyx*i?<$by>+vG*QcKAff47O(#*WEO}q@2v=2Y#V9TP#;p%_NC#XA+s+=paYu2}t_v|e$n|9a$G4!$05Y^chi$E(Q%+Kgfs!6XZ)qiKVCls|^*dbI9 zbrNXMd38H@@{%FzrP|4xKO@_q>cI8AY6=N6nP59I-OJD-;zb9?YyZ<~gvQN23B&lahn%w$*dpbj9%BEIPm9~CmgUzHbWWvhM_@Q(%bnyu=N%J(GbNTut;1JYfli2yVN>#}Z@v^40u4B}VV<42~-ERfN zIB8hFW0+=zY5@nyYPq*l`al)#b%b=;0u7=fUq2TaR53+uIe6zI`gB z?qr(L#JEx38pO|~QBL4k-qMRP8^7DXr+g=`UGG3iUvRKCw70yH8Shl2Jjr>lpEGW& zjL2LZhw%(xe6I}~3_?ef?ang*jtEVE1l`*ns!tT+NGqi{2tDfkl^VoNJ>Wg%PHLWd z&?LpaXW6S*K6^v3P+b=+bZ~KJI{!83a}J%TL~!&_K%|W~>hF~F+o{p;oKmvF0{V_0 zy+w`qjH40a$J}&7&HJXf@$;Q=@XAofNRN=jJNkw8x26>@28UDP>*ijk^X+Gdvd$hT zjlv330Ym+C+xaT{EpIZxhNwkfi7DgkQEHdbUvYK!OyT?x@kqi_@4og|W?fmnNHl-Az_vWc3GHRQKSpqQp$4 zE!0zDd^LW2{qI6@Ji_xWym5a`F^{%>WE6sjfOC5vV<%^A>&-ZO?Rv;~qn0K2SrJ0g$qSb17$N z85&}Sz%P(P(9UpEM9}!fG9}zpQf(R1jE0mUpn(8jH1co12^4(#2LXVrby7qx|1AhO zcR|3-NI!c~Ps9L-!t6#avX% z^4`RZuZEwA7ClvTUpS2JCV>naY+g^m+8Mxyq4L=zB1T=+Ei`GHn#<7BRnBKOQ@72- zq#O2R%6|Zvz&2&&V_gb^^E?87UzhchZxW#L%671IpDX9F)4cNfH4HNM8=i!D_2@_4VBFuD}3_M$*qNrz&l-8BV& z_!5z#&z8?=AzC&?3W5y+VTkuLS6oaD`vTVlEL-flD|DsZ%BlZmiZ9-d9)H=mSyWfX@#l`p2!Rda#n%%XfD&rP*II zR}YuGIb0lm_3lBapTQ{nqpy4-{n3<;Jl&D_OB-w3(!yE&a6jqcJhM^$Y0X8T+e9NdWI3*^)T$}J|B%=1xmvTX{fgj zU;B5e!Q$eID(z6~9~Mjzi2!!Tu{22a0nVT8&oatv?uVsy9#em9^9o}^M14PZj+!&l zkkV2zy#nV;@G|_p5~Bw55zLN~T{125$x)0*#X22CvC^k5R%+*>2FhO0!yie%$2NFx z>e0BCP&uc9(}G>{`G-W~tk ziyo8yEB@_;MXa+6X31f~J+4F%+GuPpNtvD36&>9@F05{5!XjC)PeCtPqX#Nf82W>U zJ2n1Z^HO_u3QTcu`?K-_g&2aubsKZpZ*85)^BDru6-RkbHD;V~;38~4l2B6+RV=en$mD(PmSB%eEB8(MSM@ct^j}%D<*ufIsTYJncZg>4shU&#LA^1W&KXKe7lp&Z-=;PYjX-LJ zokE_`Hpjhz*P}~vy^;MWs8q~~@xwEOW50L5%-C1fAvF0^JM=C0Ar=wg|Mm|NM zr0ep&utM%=H-SgylD_&uT31S)ND&k{zV5QR3CDRCnyc_caPbS}g<(DkizJF75qGb4 z^Yc7)ienE@vYa#bEkhBDGLJO|C68V)t+FH=JD;?8A4Y$a54)o;%3GzK&057rz|6~(wee*rOc zf1VXjn^6inQ5q4vw`DPtQY$zz)m!J!IdcNkZf5iW;i)fYS`k9#V;hO42S`sCPforxMPF{*Yjf-~He?7k= z!ie*cH=jVz2SCXGwCZqFHJv|s6h;=j>-=YA)yDR$Vf14tf3~?klTwhMO z5!!1sxod1nGfL26RFInsEarTvoci+YRQ*Pk~ZZ8uBpDJf#;lm&ei=r?4-(lhqGEb`>y~+*$4(+L1TAzhfEZ1ZUTfHIWn_c(joRo0&6e{BA^EL+#^=-w>WCKLEu2EmdH z7rUo?>?*-`uj)N+Qi=eM?~KT9`d1ZdzRD~6xv zK5a7xw^QZPUdcG+KhSO}G0aMh>v!C{S04Il_u0daZ;n4gzlDC0Vbk-?J6omxrZ*sU z<mb(a$r|UyX}_2%|9pk^sv7O@7sc%irJKEjdOR`ZHawwXw{2wq9a6l1mPx@G zWk@NG#xs&}6wLeRMim4rz3xIi<2=B}{9^D3o58h7tir&ZF7Td>T+cZx&~RV!p9wqk z@BT9RFpWQWDD}MCnY{>|!agwT!|O4oXAHAI$g@}ZnM*E0N(FG6@cr~pvSsHsl+*7% zk~lD*$tQy!O<-9@)aXMxo;U4`HY^0A`G{OoGRYYYRE{=_LR0O~y^TTFkd@z0cNou; zX|ZyK!c@NK8q(#8oj8U;vxdQ)=n+D+f&r;WIJ!+B6#_`*O;Ja}T_bg|(g?EcaKjOJ zmU9eMNEkB$$Oe0t77A6(z))@CuaRG|&%&^9GtO(EuteI#Km z3r#I62Q6!?)~zR6Rw)qM94%X%mVJkoB^GQ>CJ%%XMz_h1bJEy28>TUe?t~O;9JsM5 z=SZaD)M&HSE}H)I{8@{}oJ)M(RAYW4^(nd@r%{bNYE8DRSgNm0wP@1be@PiPs2&E@ zS+1?FgIdm`4Ny>kJM{MH;G08g`!<428^Ng!QlhM1B&%=FqF>263J2{c{i{bG$##8Gk$X*9w>GktAz zX~yV+*pu~X#z?IT;;@N_)d7HwxEF!LG7-bF%DV0AZ0I(F8DHJEmTF2(GL36gS;ML- z9Roktdg8^YkPqD&mq^%%Ndi#|K&8DaSU!J)elCDpYzuOzEWSr z;fbK9)782iY5*f)AE^0egpN&vdG-XggfiWZg<2^ws0r##g8H&lYY5CBEN3)MOnoMX z=sCrvsm;`ldTRpAu0f2|A@PQvCW2%qoyY_Z@}%eVWb1JTSKmwSUHL>7{J?3WLXO6} zxB(?>ry%W!O3mwN?90njrl>%#K2Y!d63MVI)$TMiRVoGROiY^$Lov;RgZ4($r5zM1A2geZ8b&i(FK09eL@g%E$8tJ8 zx|59Y#F{5FHT$Nlqqm;UPB5HUs>c&epHi6LAHyrpN*m6~iBlm}B4xIJEkY1e?0CreSOhVJ;{&?dV;hcqu0tb)@filx4+#4+SG~)5spTmXm zNVy6n9*=t&Rd`E~54%`OanSlC;d@Ule32?|+nap7!AWRk-LtuX6Iow$?=2YgQRSR| z);1F9w%or5i&zdYsDJzmd)8_Q(RXr zr*W&s>S)^7cGnOl-_r7sPm!mP`m26epdJ%3>62bU6%awj`SDOlRshvU@^Tp+dixs8<;u!PDMhwjFKJvnb#f zrAeFQg8VpmZUiHlLm-hJ7kLtT0z#FEW z^OoKrw?D4ip9iUuKbcu_Iz;r|?2((ALQlo*8ml$J-xC~?Ne;ioOzve*4UZB>J~?oI zcMw(e4 z4X28r%U~CYPG!gt-;ZaPy47cwhqVz$D#;z5GzELOC(c{U9b20NZrvs~Y4kzO0pZRW zrofg7RZ_UmK17)u;hTZiA`{VMkZ&7QnG7;RdngtVFK>7?3c%O^@GUY_5ed;jLT({I zh9MB0HV*}s%PL+Y{Q-9kGE^B6ek%lovY}}Aus3)*17@CwBz%NEP)rwl?-Bsk&j2%M z&9B!icgoFfjyP}i4p*_eT-9boe~A|Fc51$FQfTK`AHXM!3hhu3 zurm(p4H6oFg66}iCmDrd5I+>?Vxx}7>igBOQ=qHDRhd&@!0#7fQQ=~MGzAn$Eefbc zzS?4g@74ovodVTRcuhcc7OIE75GMl{WTy zGV`*eDFr_i_>1f4+>`abaw$`*lEY2* zE}y$1WTGO_`-Gb?aJ&-8b07>l3*z4lcbNbh+Jxz{gu4L3Z=fQ?0U(Y2ty|7mju42{ z1W2EZ2R*Qdsyeri?p(RQyvRR#iv?w~{>Tkr5 zC81o0ekNJwG2Q1->kHtCLk-L3lHwevHbCf-=SAVPL%fyb36{~}s1PFez*VGf0@em- z>KvP33{s;C*W3rm*Z^hP!jj6uh*8;+#vs48FfnA*-Dr>t4sZhrlJj)R@pL1Gxy5Ke zHB4j52g3d(@F&~V6z_dLD5U$Y2#=tPR?PzE(RSA3oVim5&WeEQPYg}9I0rK?eK6LYZ_tR1 z_ge7myx>mk`Dnb7xNFr^-ATl)ERkH2idH6=phDyoEE)jB;qFZ_9$X1$serfzf<$4U z%dqo}3Gdrfpxu22QCvilcCbuHPVzqx%sEYMKg`P+_M$A@=s6S_5H7pF^2d`ex8>Te zox6LlNzNfLWz8{}^Rb{G(Y}bcxnw`?Kj@PNQ@iT7dC`l zen$tUT7L(Dars+HS8(@6|9<;&Wpf;{x8g}XEr&CF9<@9G)eTrBM&%5x?8)LNZaA;n z!Guh`Va5dz(}CZz^Wk<;Icfp94=EtV&X3Z5Q5eG@#z>-FUHHHL9~RdZ&p&@x*tlEj zUF?gTvH2B!f7CjOw*ki8Y$!8&TDrw6_EZ0#Y=Q9mM}NNrpFl{W4b9^ow?n=<+eDyA zAS?`;4#Qvr2-nF_?|q18zz65cInqzm1%MijdVi%7BU*`$B&eYv!DIhd%imvqpLd>d zpDu9B+(Ht5Ii9{dIV2i=izJ+OpBPK0)5?@v{TT6&9t{zG3m5qs@*@4{qPpNHcfdT! zqB{V4idW+1S=+IsZ@Z!{wk~yuE3hw#oU8EHg}@w6513h=bkgK%zs>Yd)ikz z;_T%YZZje_AbJN9YEZ0PsT$h&jjCBvE-r+SUvler^H$vUpUZjexd5dfVHUn7?+3qT z*F&Ub%W#=1kSf_E@ir5wifv;z>iL>3S8zmA`s>$pUI?j}yZ?^k8FFfStXn`TA`)m9 z;%Ih|U?_%{Lp4}9!zgMJuNy8c&^EIUm#OAL!b%b ztYec~yT@tn_s{P4VkD!EKDE!wcJ)*aTc^9%cW>(Lah7@nJ4t&CB`g#-YhI0C3(Yj~ z{oG`lQf|)TN$`}(mh-XncS#+k^ud%`nTePZzToYsyqB>EX3I2dv2u(#TW@lrF~A5<>VA6vv3!JY5l+>>@8h>8%%}U?FJ(FJGh{YR=>2#~NvpT;w&Ws7PEsm@OK1Ga%%n^=OeWt* z;nTO2XZCNu=9}9=bP>-W&r-e2sjgQD*LNLgmhRSyZ@ zc9HVjq@SxOsj{>z9_g(R(W;8Ww(LkWoHb5k$fakbW}&-y#G)qTGPYX$AgN?X7@dNxbt-A7H4qJ?)aq?xJucOiiwM9-tw_*9z5;$ zFzsn2T;@aBrEhID7Gm?Z-bi)|Gxx+*$Ryd_t%9&)?PZ9JM{Y8?!G{9@TAtx0FDueS zSo&H0I;7rnhQ=LSYWquq*F{Vb%AjSO257T#;s&a`K5-(v2q zE#A9RVb#$w>c`%-AUq>EZKTA>MlNI4tP7l#b%lxdfg9yMIEH>|zU~ss*)n%K`{~cQ z(<(>#MgKScKj+(zwG8;;bsg<9D}vRj1n56m1$KGVN{5KI(!3jzs7K_TiV|)lw5^7J z3<_DTx49GhH9;&vaV1gB_;fwSOZD*@@m10w2cxBPmywiLW0wi{{KA*v3;(ZYBhA0u zj|ya!=B*}zPI4sdys4xZ{eM(hHTmE7xqr<`PweT3lv$;RDnA$eI#qtn-@5pl@+nqL z_4g-}%+XI^y&v}S1V-0L&WB_*wZA9h&nf@?-hOfM{QU6ag&F`POa{`|;ZDUg`ACT* z8>u?{WqkBAhc=at=>*;8Fp)8CJ(f18E}ZKe343~(N$V|QOjJdszAc^g|V$4Fp)m;Y>Gb}_rB2#c4l88bPE(nc@F#a4<3Xx4R z)aDlGL)RVA#^JfbpRy!Xfi2UOD*Z8dL*u&Qke8zr*CDTLQwi#o{1`hOw&Y=*%Au5% zoB7=DK3AWS}q<}&uEu{hgR0w9#bYxHkQ(DIMbKswU`N`A<9NfXb8WZH<*1qD`Jmqqim?&BCa65eL?!6Lw~sIE4i*(+h=p*8MO=;eS%G;pZ2m^CHit?$ z$7hLC@x6yqF7QW{yRFc~sxbT4K;gUxbYgblq1Gz!);1oyZM%v>imNAPkzzb?jG zf&}{2jRU{f1sJOMM1=E&`>Xz~j)@Ggt=VZzx{tYHI3;;M8@ONQwXZ zu8FKSxQaHM%jalng8t)-dh){j_FNaTQ+@f>bBTTYU(dj%OFi7jD}50hp4i+LD;nYU zXYr%$YBJF=&EQ6Pu^=^htE{H z(qA>>i-Jlkpwiv;RejPAJ>7&ALr~eTAdG5`0v{lX#aJLypo>@3yqe#U^$Kf|7c%R{ zNQ?Z?sOU9!^b7h&iSfb~PIGs@K$t-FkK_k(ag>&SEH_(13iiQwA$(D=`pY$ot+zmW z^4Wb&B#_yK{Nn@DSD_}En_X1kjdG;28nsYV56@?3Uc)6ZrhEwu>dr<~t3e3YbGPC# zt#9~wMS1>T6N4VL5AmafuL}d+^d0f(Y+m8}p%+47y?~suCY^{#_E!h#dNQ@RIqT<@T`Q`(M*) zuY{=mpDmYDKKj5k_PFk@?M|y?==9sl2hcC?y0t5V7fXvm9~`Q#4{$viT`*1v(�-Kh3-EyEYEJVfyZtol-oAmqX+vhq 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

      `imq8kVyc=0D6@K3{R>%4R>uzoToc3w(W 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%0AM;FH(zi=GUL|(4R2{5cb4s-d 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

      xuk1Rk;xeovA>L=)(`UmT|?539FyKg zhtza?unlxFwg-g`tuKED|GM6XMUZcGAVs<`J-5&M!DAkD=e)eF-b-wsWn6# z+z-OO&r)ta=}NL`g9{H(4--TWF(_?|vpr4roKAimQ-D38+ACEPUR_}89CZkeudr@_ zVTqr2sw%9iX`9i1*##9j5BB)NN-G90ZWPOhVMpU(blb41TUa%TdJVmLEx&s8saj=y zb{4-ZAa1apByB&rpfOwhuoJ7bP`!;lDQNgp+wPEm7*WBMOb7jN(QH`ozXwso{}WhE zN(y}Y)(agn3G@BCP=aQwqa$O`>lyS`20fHX`dt2xIf%}UpxME!qWb?}2hmFxbW;Q^ z5B@!KX&e4$)bjVDWq9H5Oi1rQ_tY|azcPd-tkDyerJes!tkHv&rKL4=^W#4&*610^ ze9G>uzFLlfB5Na@Mx~R2!ZDO3~I7OKSyh1ero$?wb1tjP1DKW^G$3^qa#@p z`^c?o-aAs+qQm!fv3%rd0nKmadp@g=O$A6#ZtqkNsbx#Ty(H%=xh|2M0oh}<38`)l z7WvnG2ec}ZlNK*;&y>cOi+eEwQ?5zP!QtOj4=f|`2NxA_UVIxHtiD1NPXZaLO$|%Hyf{ghdzL+*d?bfz!>Y8`AU$%ZBFF z=^GEX9!bpV1G+m34}p?Kpr)a>N@V=8oOz1LeX6E8uXK{CKzH4(CRg;o->6b4MsRgyAsEMnf_gACw`XMKv)sWGL zlXz&TJbc@>I-zN&%I&fLKmm14T`?|OvO^gbR1^Ea<`Vhz@IzXB#EiI9Vy{!(#r111 zsr~GLpsa+!t=w^i)bLXtJ`u(1>4J?Xc_pCtJI!Zd>JAr>PHi{>`f~YjO)~W(gAmaI z#pkMY+Y%Eh^0(Lp2!9;a&QH6;!KXt^6u-T2aLZys60H~ZS!vShKURmzvONCyvR5`< z0P&*5l#%rJTN&UvxvBYz*^Q2IYSn9d(|IwA9Sa|B{P{y)ZTFd3&mYh%k|cs>;#l3E zR%98F)rRkR7eHB=Da?g^Rd~BfkCR}MWSRG5S zVM==&i7WHyho90>0r6{)L_dZeX=t{ElgV$iju;{nPOrmijr~1ZIR!7enVpkdTn*xx z!k;`{=qXQI4n=wpd&qv_H5wRv-g5k*I_?X)F>j z_Zcs>AGvGni-v4+Fc@}isKKpNtHb$B(afwu4ll^5oeG@)~``% z35q+9NDHb%PPN~4%)`q&8 zahs^tsjBY15H@hPc~rz~8KL_6yQ$Ay5Ay*07^|tnqFE@EdUyrzUs9p4fi3T9pH5R( zY_q$r^a?wP{&aW3#34PIni+r^+LO**6CD|{M)l`QuV6cIoV9aC`1q`lM0*YJk}qR^ zTS`b?A}VH}YrPid>Iam&mLkn;gXi#KKwRfoGa=4~+ZsG5E)3Q!*#%e#;|-}|oTMjf z;E8}(u`CEMK9*YjW*3?x7czb;J-n3G}UABLm$GK5%I(Rp3`W{#Bw6;~Pj zN^okWYbxR!yJDrIdz>HP(tTf}u7K;CXC|SWc72VScUZ28rb{B2A#Hy&5BwHxkSCmP zziqy9cDeDFzPoQ^s$GZk`424j~vGU+pLia#h= zXB@-tw`HBfPn6~4@ID-X?k9Yx%VrRK-z@!n-~8jBHS#B1I6`g1iJ73jKN4K{<9BkN zdbfsDlmyo-F|LuWJm!Czt**Tb1@Upj^M8SgTj;V~A3}=hAUmR9p)nxwc>}!mgRQ+< z0F^8pvh5xJ8Xxy3ZJwHMtC27{aoExeT5qFMQ>lp66(E7LP+NgfC%;%1(rE6&YdCP< zq`!6T$f@dLK9(r9D!^}`ahI1(GJOwwcL$jn>Ade8v@hj1DL~-WUNA0ln0&~$5#}{o% z%rrY}h_l3vc7fEYlwInOu%$$KU|RG`7-CrY7-8tO_&;NCbVjcr zw)dYAH#(GuzH8C{80#a`uQT)5v~PfL7JQ&;?q~KDbeKe;*o#ma}0Y z==(b^K7lPdF(ozagHv+)-*UEkW=<|z&KCMySX@$?Ra92_wF+KQjgIxX)_!YliE8C< z`re7?Qt9aK`_V7fJAjt6gU2Q&5z>4^Q?u1%h^Ak2%cX=uyH$PI+3X3 zv~3)`<%1J+OZGx=yYqODuBmjH`2GDg4!{`Bf{08dX;Hki&!dP0h>50@1mpIa@(Ysz zOKaF!q6H`(`Vh*Zs_Gyi%|Z6C6g63S5p4|il($9NG*8gaKD1O(8?;nQ({xq$IwhBl z1Yped3L`E3p1`=lFRe$5$=qo6E$khM0Z@-c<4cQm32}u(@x1l+PrQ&)E5kSjtA>hY zUV9drrp9kV2`wx}G$=l5EOREkll-LE%c@PTkg4-08tc|170;(e4Xw(KYuZpJv#~JwYx<>(F7w#mthLA^hDY&(Fun*Ew!iH<>ena;w?53l#7MZ!9%aj^an& zM=T!N4@qKsc4W)2~x3OCwCD8tVU;?KrM_~X}#8U{iG zj3H5MKl`y?jh?yZk?^~s@(G%HQMvI-yflyFMHboEh)hdntvxXiH1L2is;#t`AqGNP ze;(Ekc@8?q>DH76^Y)t`!BWLD>FV=bxz7$mN`9IUviK@}G|VgIBEzNdhBCuio=~}Q z1cWBJTtD^vmEC6*QvBIpWxF>C$+2Z;omu#VCPM~Ct*hW2jJJ$J=K0m{VlPJ&&3k>9 z`J!l^c4q8QIuPc3g_c4~* zmXLhH4OizFhwaMKGKXDazv<@vmGsx4OxR{ut&fHjec|~1a{Vo*RJ~}Jk-?n#fys)*OnVGY@yF0PAo0peA zFftYw7w_igJ~%icEUv&7Fx%GFzP7erH#l4U_H1iw-!?GO1%(zAmPACxo}OQC+&s(V zZa+Qz3)XPFIltyiTtB@LZRH#(YzFc{6(MqUa5jJi-Me%f^vnD6Rpy{n6mDs zvKq7UjrQ_-xr)2hicHJOUFWLO{^}NuntPp^)6tr8`P%!K+M1Z!>Ac#OUv*E}b$t_c z?Vb(w%gt38t*yDOL-Vcu6K(xA?M)Hw?fxC@3Eh7yy2r-52ReHCReRg?d)w=KNA3DL zCHvdMhXw*hZkI-;cSpJnM*BlX?^MV8tj34-$6c?-CDJEGwb@LS2F&t4xg^}Y_I(}S>LYO zSn1i=eBHEL-`d&V8ZO#i+1*)B+glyk`!~0Dvc7k6vVRhD@aOel_4V*@@96yOc=zV` zZ0z*(?sWL|?0)3@<@Dlt|N80l_TSy@+1u@D!QIX5{r&6xI`qEd{_%eN`4ReZH~;zu zeQkigu1!wOZ2Z}(tgKmCTDiHs)7CR0gQENrR*)Cuml0-WUZ?F0d%N zviVJMC9d;INb}0-e2esXUyyT%B`nP) z3eF_UZzTKMq&!`v>Yruvwq;9CrDsSa#?&XD)-gkt8ny!MOgF=6sqPDNfSf84P zfm&~yI=_-;>X>H5k!J0cmPfKydV)@1`TL&L4Xx7)jL@q-))!FI*D=(8f3jo!hK_-T zg-gac6J})#-WFvxl`EeeWSw-#^jV*z%qa zjZ5>bJp*k86>Vj;ZPj&c?_+ShZEUW6daa|gr(+P+3Z@V`=u6J#{Z(^?R2>Kp7 z{j+QDSvN2-LwY`(I|m<h}EZ-{s$!%iZSd39;+Tg`3l}o3pF;c)XqDxjh}Z zTb#PPIeCxP`w80j{Jej4O3i`L{0gyFN8t`FDb4Mm~#GyuhF z^GD)n^&(y>8@1* zqTnJsR`*Hy5ubgy9UaRQjl}=qC`Y@J-xFPC3bzZi;K(A`-aOhnh(&UxNfm}kqY7HFBvB2qClTLtuBic` z=hqw8e}_`U(G%dCmCtd<-th3Ih$%*DTqB4iZTrOBPk;3{m2u|H`ydo>X$ot?*}M=DSYk5`3NWxVBfi6rh2lSx{6>giV zv;fLJLRgT+4f z08;D2pseZ^UyQ2i!rx9Iy)o@OBl=5H}M2WpOX5cvF7AYF<~NkZOa&8k$mjr|OiZX`x5s(>M-2 zL;q87tC_fwq~?zs7EtVPzs*pfxxQ#`>M^ogC0RMX;2F6`vqz8i_~30gQ~N{($6Xoy zCE)hkaDI4`XL_;o04i;&vxAuNso7P?lJ~;yADVQn#HKr8D=MYNli@T2S6gj@1=RBq zj(LY$%rEE(ck@FEX?S#2Lg85VnDa|&&iMW!3(7RRE&L}@t#wR}l32ecv_{PBtaS$1 zaLK`A(p>=Ktu83aP*BCq&lP+B@O(cr}j~2S1^VNXsi6eXIrz9 z5pfT6g+GfF^R=oQNbcv%u`#vP z>%`{q0tTlQ;T@BGH*k3`%X#t7`smNRrAHKjpA<%AO|HR}Inj9Q$zmkUd*OI)o5st{ z{3>il-zRxtsa|i${*)KR9Jd8<$MtlsVq94!wi_JQVA+F0%gmXME|^)VHN+A4f&yM9rC(W(*Zy*+j#&A^ z`=7^dA{^X+@ms%U=)+FlK~m!pXR)a|6hfzSm9X(0c8Y%B>_`PY=NFO*Ik)K0d>3DMviO_g*gT# zVT-8Byzc{326ZkZ;Aio8DR`^IN6J0HpOix6v38fq*Mv?E?H6=Z;J!K`O0q#)$M1dV z)X`vtLp&b|47SI-3y)vnBsWXe4qpm{bR2RTCFd8APd89D!A7T z8tWejtO8k=ZGM=1;oP=4M;hxZG<91-@5JA-D*NOUj5C&MxZdnCnbH$UyYzTKm((0* z`TG`l^MqI0ZMTd{?qDmlL)d!GRqV@PncX$NEeqj0}-2fV+w;iE3?bsqg9A}?DZJgzfi zazl4~Hc^UDr;lTO8{5G@S*A(S{o8wBejT>kIRD$*CUla6eR>ffSsCqB-0I^$9luQ<-cjru*;hG;-9YvpSjZ*v0`Px`pg9<(%`I}MAsSoL<_mi6i~ z>^B`l^0*&WPFkOgPr#TwY(9vP-zocf*w&E7$a4;!DwhvPU+w)R+Z*lCn{^sa${V!n zMBAHf>=J0~j*HRD;dQUB93ck4tOc=%PbiEI@r@|pFT!7bUAwAtYv0W~n&+XOKneKXgCQAH4IVAf4r-3b;u!besIoyjjn5{X&losYQA3Rvewadgw zgf<*jjz@D#e9yQT-XaKHGqFxBBj-4|_ zNIaET2s4d@mY;f`Xx!a$pyVcu)=HB8QxcF7KnOu#fgt#e0Ch(a0V%E_!F&-TlvBf` zoz@5@)hOM<5fJ5YP<0C2bV}w*3N|T_8Upi4297NomMl88C?vIfCDo7%?kfaAkP#%9 zjj(kM(EbfPq~;)h(rLI$6GKYr;e-s!nEVU0)N)X|sY@Rh)BZl7R0*JP*;Z!|#k_jd z#C$?XZ^>9ANX=7)3k4v0Lv>PxFX8uHG7o+ODK1m%S28shlUk4HIz=-YvD1+-Q{c#u zyY_)2h313Nnp5|PDcRl%Vr%GU^2|E zl4PVbo0x7MV2de^G3NgbTPzY&0 zl2f{p8l0N?i5q|nodzj&gDe1rp3wzfgsvKRNl?T*c(xx&Ek#&c3=Dh8a7-~cs-?Wi zR-R8u`h_`I3L{5a7L8n(4S`3~DVyMQhnU7%yZ9?9$MP7)HwA=n^M!q=hQSqsftLY505G)E zmFLfum)x*8Ixth8$~>*96sIdi_`Lh$Dr`ea#(~7tw$$dfJQg*^pfTxJ)`S#0+=qDW zWKrOdX!!u4&*y14Nga@tZ&5Mzj}L1KgWf1Lq$SF|Cibos%dUm$2*fFHq$e1riFKmk zKGCTP(fZIjGQi#kW2QQYS>W<;1fN^@=gWxeo8*T?+Du68lBoesQAzLbtnN{^@||ef zVf->7(ob|kf~?$zIYPgXxa0Cvdsbmoe@7WfG}3!VN`8?uc{W ziqARyxW{&HVrxX z#8E0&5pjnv>VWCAZ3u{n7iXk;@@r%+7#%qWVUOdddT4i?+7B z*0#>Fwyrk!m(-H-GTu}P-jizNj_lSv)4&zcMq~9-Q*{weC9b@EYBE-AD%P?TIE{S`rd4*b-s}GLE*Lp=q7SJ?Kl-$WPOqV71CIc&q8b zPjKJ2dRY3Q?9cFi{KnScm_xyT13f`{kVgo(%o_Cs(u>Gh&tqM~%{XYFF^DPZ!z$k= z$_Q`1J}5s8LeS{rf9d_%-S=H`$gF)3PO@J^zaJ$Q1rJC{2uoB0!|+l>#<23a7wT`I zwBF;1>w#c{uJ(dNx^5P3J(8S0lIlK^KdpW()5jD&WCizeZ{0iRT zbgaTjbc#PS*oAlaW_V(~XXJC6W6EGi_Qa|=98>i4YB+qs3y|t^Fq&|tti6|se$+L6 za<6T&o^aQS=@ji32C3z3L_s%jVNn(Dg3Vj0wbu zX;JTK$Mw;#8gqwWL(kK2fipHOB0jTRunYmOx&e=%t**zv)~_2?aA(t%<-)Cc;zNN@@iHxy?#i#>&y1 zdQJ99{s)BE?n&vknZKkc8S5npAN1$xf7ZMz)NOoyY{7AI7^sK#+kj>d^^E`Ijp2%GvM_fBY{I{UOSo-K(kI=BucxDPn&Bnf7*TN(`I8whSD@ zgx|Ugh$@&$)2bv$zf^n$)U1Wqw?Ay+|H7E~Mnj5VIQVUo>2-_1l9jZxIa2_FgkqVL z|D&L>C?si}kz|M2v!p|9TY6@uc&nC89oM?1fuXZ;n{#=@qMkBxwd`|)!=aJ(nnk2e z3&qo|fgVHpza<*d7PNzTTvIYwEsf=f3%$eap9f z>&$&4l6~^;2aXK7&D^`&qAl)!VmvKdofwwem9yO5k^|6oe?naj3zQFhJlU21>~$2; zn={si|bu4_<$9g1VE7^f_4d_%5cQzJ8EJ2AY0J+5jpYQ+Sx zH9I+ivS+c!fZF5ffg@s!goquT23|7wdTOm)63ZC2c811^N{kE&nlClHDV?g}ou{od z2Ai8lzbwzz-x9r1k2d~j&Mv4gVONdptiiRBv0= z+WC`9pxJpxPmnz)$6Qize~zUJq;5Io>2A72ls+oTpGVf7a&yBYCgDZ=DqI7+a^k)k z)S~%tp{xZ<-IH^YTYu7~e2J8R_j#Eb!Hk?;I9g%g`ZH8a(L+yI`4+cqmjhJBUF$<2 zs=!^Tz~vEFZ6P50W9s^Pch|?34ORQXt7C7LQ(?8z2=ot!URv=sohzrmjsuxfdHzm& ziboks+Ej@{z+O(-|5h~q7Ay7!W{TsW$uUWf;K7~~S&T=(>%mO>jN_a}8j0FdSK9N6 zt|8&-_IrZV*NbW3wb8b8OZwNi$$9aOM<;$BGU+Fvi?>3cg;$S*BU3U(CO|&1iUuUTs{_41A{cG?1*Isqh3H|3o^3v<|JmB@x z6ZtZ#Z8Y}x<@W5)Kd--6U$S9SH=sv<{z)MQvi%J-RC%!Y`&yyZ z22mA$M$=|K`^jt5orBD>Mjg&1JlKa@%pm6`u7-k^9h0xb`AKO_6J@1fBPKu3`c83+ zRLRy59MoX_54yoeXg&X0sCqTuXwk2oTecN-)cSlz+^*?9I^`FkntJgv8Pz;_@$wPl zby9n8=Hf+>M1L*)`W=IH>iY$& zYT8t*XZ55s>&%o!d7jXl|CMK#uZ~;8?~9k|_d8`pz2E8S@V|-e$%_+R)1+6@|DLqz zoc%fff4d^rkp%wjo%wjZ9sFNk-kv+}RqFpAj{l0_|92k$cmMp3|NnUSFfjkCPx<_R zv?5FYpRJfXB;x<;R?PdK;P0Wt|L3ikWH`(J-HI6}h$)`H{-0LN(X@|L-f@_CL+L`9 zN}cJ(XhYdjl};S;2Z_e=l{yp6W6`!b+O;O@ozaXirjfZIU}h_!v%e04&xb%n)-7=$ z3@j|@BrH3*a%U)-!V0dNk2GKuN%WTpc}f`dT21Z8Pq#OJ5$_X7|9eBQeb(SK2Jt>fzYPI`Ban7=?53lELYqE8Ko^rtb)TR@c7tO3n@d1hE&g^IorwVq@Cx2_WNgot` zITE;E^n#1js=H7{=&$;*mCdgP@Qur_28pw9U`js((KCzvoHd({v(HS$G{k%6xE?db zp|2YcS}?Dhz?`7BlV(^<*-NOWO0;csiNN*_LhUYRmE=+WeCF(>3uM*y!jY2E@-bZL zaVDJ5>1Jf{Zogfoef?|$147zZo(AfcTnhP5F#72lELm`)M?zy6)Pyz({zS$H&Drom6qczBQ@q=1jtI{ebjW>JJ+!a5Oz1)kOMzD4A$jU6- zpYUmcqO%@%X?Qc;w65Rqh&pM%s^ii5uI!Wd1jK-p!u%BP>yv74vd#Rq=rVl1 z?ZJZuqW5(Yx*WECeIqMYFeIlWUOudX6^I5TGwgQ5p=EQZNuVo0r{g~EBE^{f%+G+} zB}2wED``6DKJvG-5y4=8{myeVug`!|C_xUSRCdL~4MBQU4;jQAKe8=AyX@s^6`GNo~V%r#5 zVJVwe$4~vfubZG#9T7$qf^dZF*+jFPA|3)l&Y(9yd=x-fR00MW!}>PgNgM&~#c|X? z9GhU19t4pQpL2QR$Mo!5(Z^Pkj}*0z;uhooY#uYmeXpQsJ5M1HHLAd?_qjy8KuNyn zIELKcNHHj+RL&_jQl=i3t`KoRyhN?3j9jry9rY6htarQwqh7hehcs1~JNbHsJ8Ds% zpsh^VxQT(rES=pw_$e~~Y_v*efP+n7jg1j^@7e76IaRXJ!u#4z;p{5VvypiM% zwzRn8Btqk{!IKCJ~nFiQG^Oatntf)u4Fos z-*bd%VUrxWAX1rPUL)lP4q;@9x9LURC2w2u!QgpX$8>@|AAhyz0Ac`ba{3NMi z#e7-;zh*JMxU&&G$)!E~6cJw%CqAQ`?%+4bg*3=uQGmkInTN4&#cI%5b z9X;fP6&uXj--9Y^>&wYSfFh?g+%X9#a6KA}v=Zg(yZKgQz7wk4W_nBiWKxYvk`BIL zrf(>vI^qn{Bja+>DOAl!8n^UMr@;x2q0bZ}oDmlxMh{dQPbmG_4_n=n-$%;S31T#Q z3A1PhT8p8v&?BrvGE$z#-@-SgipWEn3OAvct|~qeyJR~AH{^uce~ObIPUU@K8ov~g zmdZ%^V5eW^+w=IQnLy2ZQZcz9fl1GzaVf2t%^!E$~ygmJv0VjiA zQ<_1kF4)`iNNf=;u%-dvtfM{&439f0G4m~^z(bUF{(?Jc9ayD@^HC>NAdAXgw>C z24B7u*FHEWE3D7K55hH$CdNyvUHg~|e5BXur78S%SL#KM^?cYLMghB_TBOrzG0^8g z)@x^m+Py8XEczX%qu09V_H?p`gZC4CR(E13mw zcK?9pwW9diVoU0gB^SeO6s_M?m))+USRo!)!NZXcLpZP6dG~R)gV_#u?#Gv2S4Kz< z1rFS&dy-nNo4jHqZ^@3EmpY(gdeYAUF&`QBHaqvZE?j(_J<&soO_dIAAA%&+UXu(0 z`NIudzFnwZ0caiMl58VrTy@~hsv2RLlpP9PursE(8k=Cr=+^9|}13Z}N09J7h1g_)3C`(g>bY$_^@c2zq=V z0|3Zm8Ysl+|I^uDRK;K1*`JEk*rfsc^RhRZtcF+-r(>*rLXWR!y<;dT5CO*bcQ(8V zV<56jppkQ+iAkU;A4sh`P}@6Di93Y{@mmqsmkP0Kb z94Wj)b!d5TXysw3;V``KCPHU5Vtq9tn+$B2N}$eW@EfdqX@hD5B@+!JB5t7WsqC+Z zd9-Lj#&7qZ#0A6=(bw+9cm5oz0&ISM@9Q>_3@|7uT3~~RebVpsTv$f0YD6%a18d04VQil-cbbM zNQ}j1jCwY#T1$euD(G}MGS?fqm=rvE30~+%YU2dm2zeP82ch)+*jr$~Hqg7r#l+Ra zbE6b5_DymTjCeSRN0)^+<-%B_4Gkm+{o5R>BokS&oLqq)=3fl%?M96+K^?kG@Kcqr z5>`j0b!GaOd?E~xVrl5=@V-51g53Xo|(clZSWlY(UNm*n>P|OC{IMc|m z+58*U^E!&BQ+C!mbcFSBFt&!*drYlFO4E*}HdIYnwN7hENpZMJv%yI}-<1aJ2?epZ z$73T+LTMa8KDJiV@P`EcTGg4SNTBnl%+n`$10AH<-zkfi#jBe4vLV2gyLd)a)f`;FLcn*cCMNXf9&aG&+&V?pW zSB`W#yr@y*ds4JKYm|#kh$d}ez$d4e=pq8DphfJ`3cY*0AOnYFeLwwKcb)%XCu>Cqf_XB>!NEvrPY#~v!4OQIWqd`NckaEk;|g<;cx&Wy(?~RG{vDcF8IpUvd80bNs#y!O zM6DJIOmjARLrMEqcFUjcmQ12LGoEToo^Zj?GVy&2@p-G4UN#nh5EzP0!koFg6>V$=&iM>UGHXv5Yj03Zn?&izQirgZwV}>s@!RB<*>T^)u)%JT zW8f1i%6C`#>pTV#@quK(<1m4OCK@ic_qmzL!9ru?&J> z!-r^bBaWgA(Cn316N<2IA9kuuoW(AMrDx`zj`9P*+l1hEP)YXYqf;A7uHDLF;{XpR z;p$?wBuaGag-Wx>%Mg7=OUEfI6lBZ$CAk6GBMRWl0pyR}$ivg(|FFOXo8y(&5?|{a zy3AGFD z&v00q)xcX^0B9DVUH_4xb}>IDTTfG(L@tSKX8O68fSESiZs7CZv>$dG3M`6?rZ&vo zF_5I1ET0UiMuBP`vOcZ$W&STK@tP}%9xJ8WGm$y7MEto~FC3&1D+v=Tk$EfVlAU>U ztCK!oY{{u2QCA#b*G!)E&29$aQz7?pt8B%qANg0U$avZDXW|!l;daTD6d??~_&Krx zo<2gT>D?N61u1*$J(_q_pPb>gwdbWi!nyr~KmS)=s zDfwrQ)$tuyV0K#IQXDKddaPNPb)a5NJ-!y&gfF4dfA6VVtkfk{{=_HZBegxTHpuoD zk)BHEWYb6UFLvhyuIE;E`W7L{5b>Wa(U&dK^Fs3P+c~P+)aUWEncLX%4xLb(< zC*Ggi?J*Cx8q#*`XE)`A$2hF@1nESJ<0k|1#d{J2fBb2#4cGcH8COWjR-7MyJg(bC z2{(5*>fiqpX`&a-o!Q|+Z z_B{RP^6dR7^Zk$3jOu<*@d>V`Uj^n0OL0ar*Bk^;##5o+r(jC#{_) z?SD=>-%h$cxtM6ydj6Q1=6L~a6!T)Z@={ijzW*IKKSWd$n*37mTyvU-aTdMUIj!aM zx8f`g^_-I7eCOBszUTR2=K1k^E2i^AU2fWZ_1vdv;gn%#6&v!uYIm>yyLK0ZVo^os z-NmGmKB;ywOuXxPQ|*p;2x<5xH(6?ilDe*E~sALuEVcOsO&`HpPfX^xntftZE4 zSU|6M$%S}-yF~tpRQZi;!I50Wja<#0T-~$0p8LDkQE*FF80l3JP*%xZS5?(g^)LI+ z4X7Kar%k9&^lLc8XuRuz$Og@ti+2y9?HjC}8utze^!SwZs*d$~+6@X83`TlQd=gE= z^GwUv&CM*$D|gIiMlF4VtlFEcrHrg|Ms2=n+H5V`7G&G@cG%h3+q-z#Cl}afblFdh zIyiYclrK6oRlV~d4-X%YhFZ_* zZu)MI!ZRx)TU(+cW22(uqH8CkkN(DVuE#9T#8!0vrw4}n<4Yt{af|HZdlJ{2M z(NbnW(mPAas_)C{@5^o-&z>C1ZS8*dNqKdx`FGa^Yx9MP8HI%xzez}rjB+)=G@L~VO-?ZltD^uqt>K;K0D+-yT(X+zK8 zJDF-x4QeZ`{m%^yjJNmnztgDp>Gk$M>m9XC9hYbCtg5H9ygwtlzpACbf1rPIzJGSL ze{s8iK&}i zzP|o1Kyd#szq&EMf3i@V@{Y9L4c21!*wV!Ga#Pvz^xS`d;O%v7WqR#>9Nn&O?XK^i z{AURMY`q(Toz*|P;DT7931bR-R#eI?H?ZOAD{1EKOC$U9&Gj;&Bq=uP95*< z9`B!=tZki~oSlyAo?bkionN2bKL3XaE-x;w?rx5{-u2AwxWMh<+3nf&?d|d1yBm0X zxPN|mn)vh|9oY2vcewKJ_V(rQ`1SPmZOh{AW#{eX7P>M5J^Kg!w+ek}fWDml4xEDC|JAPhLL-{(|Epck zl{%U$iCF}F!yGxAuC|RuYZ54L%KB{CntJx3aOs>+ z+-}44PdhtEm}wfaXkGI}dt=%b7>P3jlRLku zU8K+^qGB>Ux3t`(W@d2+*`^~UP)XFoscq9CpU-eck3)}o^)5DNs?s_ZQSrZ3Gi(GX zD^dR5q~LwIe7wRQmMEJ=+}I|f8W%I(^r00NQMQ3+7YU&Bbmkv)vapv0;}oIt|HKpB z4Fr-HSOZrGy6b)Ya4YOZeiD(plEeCA^(Lm$TO7iY_|uzQOX;c!$s*JJh?JjZtR*wq zjiI0uRiM_;U>>CnZ=T&W8VFV?u!?4rPYQ=!6h<-7W~bH*%O}NJ;{Z3xrEu31FNP;7 z$?Y$j*tV!jG8vMU9Ati=I~-@qP1Y5`va!ArkC`#|VmDrA7`)if0X@Y3}9mV+5Nht9FY93otVpKRA0 zYpv_H30D$w2b`O>9*WcRe||ozpI4GFE?w3uBc%_D7wG?Jr6CvcId7{+sG_9;rXoWWs0>LVyO0gbnY-?%Y-}aH zbk2{}exnxcL1vfc$jgy749_dkw~_hEDI;X6GRWC}Ip~}all)t<8RXeuXjAXHj5+L- zo!KFPoWKbD$n3yPJ^*saSyN_#V%8v*Mk>lZ9qXYFy?eeWcEm4yCp4d!MoWUr8L5C)L~K+p z^*X*-vf$I$Hd+>)faahqdW9ql_(%B_kD6#8!Rul&B(yq-RC3T9@h6cw|FqTLE1{0d z;sGN|Q?Kgc09F>Z#)T&%bG~qed{3ADSDiWbs9QP04%Uy|yr%a0ed~ET`{RzSbB?2@ ziiBs|ytC0_)Mr; zy&9|J*ju;{dv&*=$QD+X=!#r7;V-e&K~eZjh%-$jxglY;q_}S(6Dm#Q?|e>0v7a-{ z%*ySs*grIpo8;7xxbp+^;=`yj-vB6j-MyHJq=Pg{rm-Jpf`wTpN|egfb_M~2i=0zQZ4>jR{5ue&)NYX*8G0-q&J0v zxZwS~S!C4jFX%Pa6+&MydE`y#F9>)x%zPySS*;Q83%qbbQLSvkCfQ90n;<&BOO6|v zT9oRzF{lLFT7R`d<@^X^QQ>K`O~G{ri!|lnFXlnLs;jkq1oj@s_=zY%`=t)_T^|^- z_A$_79F7>UZb(v7q4O${*{8(`p&m5F?`FGRnId12D^5)e!kDg(#Y9-jB?CmxAm z3og_eObvO8*}hNs`9-{WkiC=9t0pJBUa`d-+_>_+@s#CkMF9R2qX3HBXFM6nUi>zb z-%dHQD7p2>(1~VmbEe7heeR|wO7_#NLhP#v^6P^fR+rkwT;i?o*2^CvM1?-{^aR=w zQ+`}%260{MqNlsKz)3#}pvv{_TSlCqSCU4TnZ`8#m}aZ6e-l!F+C)?&0!4|zD+lWRg?QK57Ds!y6WQdS`k>3=+CVN#W zq+GeXgDv0I%5q9TlzybW5YTjDCH~81=fpGaV{Vk+w^dj0H5lo;rk@}$B|dt~`w4s2 zt4#TsbLe6JhiS5ITha9GG05P6AOWKf&}oMq;Z*J|2yX{1z2jWQ+E;c)*H_eidn`Dx z-3_feT?GH&@mp}$#PxOP*gsh|C}S(vq)2^xJJFJN(A3bmVg(1y#(3t}5%}RGVJF|# z_F%X%?R`tTZuKMhU2K-G;%r41{TKavu7d=<35f_vyF5ul)FfMu%{09;%%AVsx+9%x zZ~VY0n{5k#u9lm(wraGfNIvuW_9#J-OW7_78{aLkv{(zduovgX2tQhl#0PKSQxtPl zze~E%5YBTB8-WpCS|F+*ZjoC*Quk1L(Zx4=U^6nkN*D5Sm*;)MN01P2$5GMcFtb!JewRpgn~09t=Rj7%^vCAF?HDo z9Bi2<8cK2qAS(_nO9sZ{tD^)v7zROBtmT`WEqOQ*Tb+YQm%|-RU|sP8%n)qrX~Sok znDr^ZtBgKrfEYm|QW~D@e9@_OwOb3&p|a zOg~;Zede$bf7lZGveHE8bGgHqfL4P2vSCQ^Luff+i5cUF8Naf-#BoAHJ_tp}aXk@& zMWgPPL)-B@SAd^77{3wq6V}TRRFI+^388qBq6oBT)3mq6(a(?8|`h(`OMXC%wwLDSy_7S)64(^u&;bQ$n` z8H;p?=Ghr0q=>k#Ie4QW&gukA9Rvna&__bJ@M@r8$mH$kU3D)p8@Uz3RzPs8I~%n$CH)B)NSd>{0#v%pmq9Mzl!4V= zffMfr%3H%bRwL*~XAI@hz-X!qh=l zFC~Me5qIY01b99dd2<6Gt0|jwsey#=dj$a74bX#57n@ciM29AaiaCdfh&Pv5nvdwA z*c8zb<`XjI&p*;CCBx*8MoW9cdL1Q|9w(KK0OT)=t6h=sXVK$YOX|5IKXHd=avS8X z`k`gR6qY7{suRl8%8?*2{@cYh&#BbU1wEVzU+!`Ff2R!{1{bN6@;L)3tO4tUFjSWn zn}n6y&lQ;2aMgrmvZS!@$E)w1S*J|poOC&V*WpWX3CSt2M^VHM-SV!eP%iifFSvTO zB9?x$@GoYtKf4R7k~C{%>YAVdxsBo`^QC(K57OQ`D6V$v_HEpuAvnR^ zEodOYgS%S@?&)A5Sa5eIxVuAecMa|kT!L%R^jW;`-uvwD?DL&_?!8s3s73$N)I-&* z@yzj?W7_JxdFf6RI>YtQMLg6%4kuPe$iR5Ngia()o=ZsTlpMLx9GNHRZ-)X&*Db~= zuBO0`&oYVV)+W$W4@`6jQ$8$(9|>y@=ACH9ISwsOS`uhsitt#9g?nAU*!)OAb$(s1PUn#ARB4m6C1e&e*~UT;&D zp3%pV+E2`05zF+yA*d+($$nti&ocGuHuXWj>9O@%Y9TEHklH$%79Nu7hJ1q7u$Hnt zp0MTm!e#7-b+mSf^Nj^83>Z|2)*=?%*tLV63qlZ!Zd*!iQ>H*#H)=D6R<$joA?S;s zcXiTij;E&4R-_gTWQ*dcgvx;Eh(Rj6|c{g)R>(bcU!!68t5I%%GDKB@Xe- z7d?Pb{ItbAJ*cBi0@DZAAQL?!m4$+lG8X z#BStk?T`pW4uA}}rVY4-BWFQ+UpI8Auk^}4_BP=4p+3UWi@*v(vk>1I^}P%qqz4TJ zzwAC9)bC#nK!L%pU zyH;(osS9B+Xr(I#y<1s%@ZAK=t95vz&R(O5LE^_jvX##GqdxuAL}S9rt`~L0res0Y zniYBC(43I&o{!Dui>2p zX@hMn@X9YogUjG(6sE-12V2voa92iQu0}1ihU8yMID)55pt0zXSXw1Us&_P0=8oa# zXN?3HZ*UgJPtkwqb6|p5x>Rku2-8LxF@|1@PKDk52zl)Z{`7V|ZMI&mr+ossyI@?J zrRzj!jv`_v@Nt|bV(O%|7msBY>0pX~u-|1EOUJQ|e021kU0avOe7h|=5)0gC(%B~u zlYF^uV)}VQZ1eyJgz)tI@F&C|2Yr``g?IzRXbiP#WyFNlg^$W8>^;Ty0vzL6s5xhE zEnt>{%R{msxJt*C%2&-c_Rv3Yz*1Ksm~mPFoX#rG@RL+ZaRfFh!3qjr_pGCp6r@D; zK-xmXj`N$YS$>lYtyaaHl}LiN#q6;A?ebDvFdTR00Mss%#mu|}q~XA!vtfi%?y#0c zk!6*yXIr4}O`&yO-tXA9dUMQ6+sX)028@qo*}RX%6!yhWPo#LslBpKAdN3@K0r*AT~Zx+Hgh~L$E zb@4}t`^c2W-nMX4H`JSQuKe8E@FsIhgk0@=>5 z$L&Sx9nJA%^%Hz)uO0sHJ0n9oMv)s(mr_&1U30HpOT*L;?YoNOyY`CBACEH})-oIn z_guX8zCQx91zN^yyIyOxY889-Cp#i;V6Fa$e&}V@sG6JWIeI3`{wPX;L5>T>T6L=g zarXtXN1)}~DTxdC1JvOd{QY$t%&m&tcjC+Z4RdcQ;C{tm?!VWy8}w#u_Is7=DD>?} z*SO{&`RG?1<1dk^bwYg6W4Zly#aa7Q#dxnHRr{msu_Hy34zI%_EX-qweHhZf=2H8y zko~b_3Y`$^+ZoKUwLeClm@9!v^=fS=RexTo<*`+ zZjC`711esLM?JLUV(uoYctobIQaigt1)Yu6X#d2z2s-Wyu~SDxp6z21VMldLwxPka z8@T4I`(2~Hyk5yOBUDQ$aJaEPeUEk;L2r%#Ro$`L;Dz4(S{a46CyfR z=BsmKniW!ZJoh4Y)>d7v)BXImd>Hga>`%F;{w*4_0%7+YKKB!qdqr4JZjt}}%VOkx z@mr?uZ5~&wCsDt9lnb=!N4_Qbb5_-t6H|iOa8G2sf8aUKkqt=HuWl+{TzYZePhc4; z1WDwo_Uj=TSZ)W!ulgIM4}@StUwG*BQ<{GwRerc6MWT-vf+Z>u~I z|5SRRn6ve4-PAs)8M~`hU#s;1)=j#4&QFcuZr$peXVWIE7I16~Qb*tWhP*G^c|SdD zRCR3J(`K4C3lu7|&_b)SWozFg+u>fw)W|1ceaA0ePRTh=>21y~Ue2ZSZf-z=laE*N z*w?&n|HLf+p=aYIG%P%9s1NX1qWZgI+JOwU6u?MH`!SN$G?u+Q1DGd(Ve*$l(p}yO zI3zU{P{146ub!I*ERovw-nypNx}MRxfvNi8#fJRSzx|N*_U=w7v^zbvr@i}sx*w|t zfbTI>RWg#B1UMd}ZN2~SIsl{N;r1_!V|)7PX=ZU{v7z)Y6XOyvF;>?$0s8`QEuQ^~ zUnkFw1mHznKLB0?U_@LT%>qWmv+V$Q4p*1Z-DM!|?cZI6zrBV3{D}nhcJ}r24+snj z4gpReA~GsE#t#yokeHO5@+}p}pn}9?<|M{Okn1L?5x?yc5Z`=RddZdlYK5 zdhz_HcG2!KIMdU!32z}skPH^3HH#uqUK3u~gX;w`PGz1$lO!dOF3;6WAu9X?Fo!~~ z@@O(*{Rx23q&vAVd~F-E>bIf!|PUm zIA3KllA)kiK5k|ef7Php(s1g|ZKoS&9=9O9))B{iI;(4jWj&ZAm$@decG5aiYm@Zy zBi+>Tde4KMq96_1<>u!AmAH1{yvSqpY!Cl8s$$VD2(w??x`o*Wbp@L z(}3S1bk7cYRZCXGVk^S{W0*zRpR?W}$o9I|%IxS!=O zWlqfp(N@{dv6|gy$c=8^-_MQF{I-@IcYjM1nCS9tEHBH&(LdbzC3a9@(J-8KQLugU zR!XsEV+m7G|F;oj>a%DyYV-B@F-%q|_5G4_rVsQIR zV*X$yAsJj;S>f+V ztOf&>1ujPDNYk<5g$v zbv{IIBsTta(qypnlnr+`-{c(~S@B8;$Vdb>Ud#RqETPj`W^$}Y*zb7{aU&7Zq@>8E z-9`$zkwpR2RN-B9p9e&KE1?%a`{s5&V!AHnmE!R?DdmB9E{I zdXZfl<^$b=)@ue0k81eHTwku@l`;jPDvaWoL)Xi1?Lc4AM^-h8 zQX0WxQ55WjPu@>=zoe38OhASjQe|sV3-pG)TjIoLarL1|am>ea6_GRKk0(UeWU+R# zz_F5^Vu+yxp-f=M)@S7zACMRIS!4lnQWi{t zj9`_peHIW$xA`S6taxAEnlFJXG+#d1ml~+_50uy{yk;}SMMiYu{373AaVd~><^u$s zvWtVgOVkL?)eUL)az&x(eJ|T5RHc;Hvq3Zm`)hks#fdT{!4$Eb?b0MRxM7ZvF>AIW z3ZzQ6(`@6}A}Wt)7{uG_N-x@891#)kZsPA%L|}Mza?nCIlfA%$YoY$fY+lisgrd-3 zSOne{9Sql-+5oiUCa-=iFpF_j5YG|fo2&)F$9izc>aLAcH|8ThEJAELOB2&;zp7)uQtpk6>B09If5sIAkWx$f~O2vOb%Lpo*QbgcIL)?!S3>hcFs31_Ei|= zhy9!r(`rzN_J?A8>@BNf6vIRq|LKErrvC@OyPX2LIv9yk<4~%zK0II-`~^RV9qim! zIt}|i{XriA3%0&kvdquGef1ZPNCU@1caaO{7TNFHc0PMHmr{~VQavrO4+59)rR8is+E4p_I-1E+K*!x?eR3=nvK54TyY^Lj0ZVG1`PkTtO2v42o@t2ZdFie5AMY zUu|8n{8AOC>P+k|nI4Z-Q1h#>B|7vU)>k;xUA~_i?Wr$iFR@X(Y@W~g!&4PyHepQi zurR2|TRH=!I{L8Ov^d`0Z|PKMt)Hm$#jISp&gU1uZpufq#4DFsrpaT}3xuWRL|n@$ zQX+f>c+3}Th|P;*Ny-Gdl!n0#+`9@NiyKM!Hp`Ja9wPAFJIvSNzshd?Nj)2)YTfAb z;P0hZJP)OZ!vHnhW_41;azQT2gOgwBm4CB~=n2lYS7wl?Scj*Nr`%Z)sUKQ?0q^Mc zm}VQ^2N@N({J?g<=ey9&i%!-WxZkoTt<*e~G=5d^`sqM9s(GdmAoca0erb~{v5-+Y zwszfGWscfrCDCw-Z7&;rDD{ip4RBOq7dkBUaa#SgZi#^ze&U=pyvnCDNI5Ay)f}t3 zjuiEquX_ORq$7rq+{fOPvdHRu%6oQm+VFOW`p-r3kJeqjA9v&Ke=f7I+VitX08tVVwXxUdm zLIHANg8$I6JrlmP)f>2st$rMKt6aVe~;GG0qJuYg6biEg3&)E)mA<$>J8N#?*^vzeR7nv&JRZU|Kd&Nf4 zRt&QaeH;`=UY2V+T3RY(j89e5%1n^50V%=k#j1tR4%%fjEg3~ z;>~BP%-yxy{kjvX?!vb7T{O9-i0EI#9iUUxkcxbXlGCmm!!7_3c*6&8jzRrAbt-3h z29;~nEc--7(DJ*o;N%TDZfmx!Z4E1I&ox;mMXIda0DYYNpdZITE6^`Yvc04nL!*lJ+YIMz>YsAg(@F0u?sj_u?3+14-u*d0s8i?TT+{AR6j{TL&!`th?ioK2SJ4Qla9J&x<7Q6|RIYdOOf=uR{H2Q-J zi7^?xVLL8Dy72?^MQJ{Kz_m^LW83u>-WA3>b^(Nf$}eX2iA9WpLlmBwf!gFt3CrUb zmG7bTT_2pz{Hm%@C?#@`HCd2-Nu(1fvnUAAjEAI91rufLDJqC@HbrV1DUnS$VR7~+ zT*@Y~5aju(Y1c!7x#eQCe|kreai`_pt7m?C8WXkG*f{49*LXNPgnoM21k_jfd+_*85hNYYKuaA zP;Y#I32YIxtxeD{V*kLhXKX+L?)1x_@8s5mKPrVitewxzw3ix;#d=PeaopbyOX002 zIcmupXtf+PGYM|SIIQ_6MY*rO ziFzS^ceY%)w=uzMWXCz@a-QqrKNTYL!T8q|5uQbI^tx&Tf(gZN(YC|^)>=j8_&G|R zOuE7&^An-p1K)ObiV1|xFV-Z0!BwmhE%!?!JU$3C$R{8_xz3syQ~zFCdrIZ#m2I~H zB*;;@69#A9K_m^DuJXb+evmI7ow30>Y@&1epus7=N}PXi7rGB#5Al^#tCU_Be5*T{ zfm6-spjQXKli$P%y6s_5ZoW_Rb51MF8sqPO zg;^8bHl61W5%m!7kJj`#ucf6B7}{dIc$NJ!pH?l!_(yY1V#DYToBQ2}5!o(R*~{IX zb@SNr&Ak$uNxsDBrqKeTVEiR)f9e?>RL5OJpN-ZuRWB>4c-%^snXXo(a~(xXd8e%O z^WBK2qoJV4x;%P?16jTMspRpx0=}^WMfdyZEGca&rJ6luN4k(uP!)nf-Y?qk%2L$6 zh+lPC^H@^dxPM`sezCAD&Yv+tYF5M#@t#`yNHn6_`i4FFBS$%vHlm>RSWc`Oe!t}7 zufWBH@$cUo#*XdXAC}iK8yW``P8?DnR`xRjz*C-iBL9rIzk9~dVSp6-Vo(seeGR#1 zC!LNamv=XJ*z7B94<7#sp75NY@2ZCZg)y+eFo1t?pki9UeRpd0{D_gtzp7HY^%YdrwfI_?GwtA|XdwP0%0EG(>=#xvmtJ{73Lw!S|{W}l+XUBti zNkg4|!?h*PZP=FQHtgus%;@2t(Z~C-h1Ic@o$>0NP2!|SC#f0n0b{tB-@TDiIf)bZ-Z*6P7A(7D|h4cc1n+S*v# z9`4#+T-)CIE5Cle;8{EGJtx=iUf%7ELiW}>f30o-;Q8S`K%N6V-piwt+oQkQyeG>^ zC+F9vi{lq#a+e2lmj@@$?D>A{_3`EPrRBf<9gScd8t~&(C-MAMtYv@&7J5C6(hmTW-DrNU<04LHysQ z*q3OeY1gXK6h23%@c8+X9wyK~t^!i{#+;@SR=}#2VVUAe9WK zRucU*57@A`9%-!J8qlHKaqQ)TkPgAIE7^Z1VGOXd zC8i>ZC1*hz5t&To(9>^>_Cq6AZ2izonw`)|XKDH(e#Q&A*)W~Rkw`lvm2x}?0VmHT z6U`mEagz4kT0ib`LtOoxvk_Mb0eRZUUBmt6?PZd)W|f}c6GVoRh{!Phdmyp)tJ)PZ zaqytQ8>t0lB%(=l`1fxrx;FKRtU=#HP$CDjQ$}S zW`-)BjbLx0ydZzkG_1+irK!uvttYawttUG$J6q)}?GqG=@6jJvfasLZN9O|+<%??(EAJ8CS&X$ z$a=euS?|cPjxagDlWbvAY!DNgX<*75iDVeV8W z%bGqDdt3>ZJ~Wk3(jAFZq<`x-HYDt-d>OdBF4^kl$#epSPbnyF$}SEh8Swrt7GP}< zx1Z!;tru>(?akA1Rl&jBEzhy5Nm9vrW(9R8nTaiA2>OJsUh7Q?b8VW9j=!y)e4*|} z6VLx}=ff&Rq56c1i+;NZ65g`ut~wLTYQxUO+<+TB<_(O}^YBHD;2&Ipu1t4Q(VlT5 z+NOch@zLq<&tzcbf0(Da)cY45e?ekiP$UdYWObYL#p+27z^x;NHO3Oh6iiI4Qhxj1 z=cC9d40+5F50$hf#LQ)8nr<7^G1*xdLHQz(8F7)R>B>x2yH?MRn7G$QW3~&HBYK^{g3}>6s!&USC^p$P~8AhVtWW0M&8ZJG7cab$Rk6gYpF&Nklagc)57p(xYGbRp=~nC5cUXVpUeCA}qaO zg_%tX_yu?w>><8Mt=l2x@J+#dD^%naS-Y?7cTi1iL$D^oEoePNp<_H|;yk3?i~LBa zoNN`=#N}Yp#5p1q-xVgDgJdaMAr%ziiOsj2xkcsnJ4)X8aak1U!4sjr_dPa;mF=qi}E}JMOXQBm4muAxOD5$1^SA}5CFrE;ch#G7pQdZ{!QGY28-liD~ zlvPz;#~Y&CDZ4Ez{NM^3(krqYwy|;=d@51~}Z7W;wfxJa+7~kIJPO!i< z=0I>nwzoRt_y>G>{^FQdZY@Lh0JFnnoPH~n+Xpy1OBMghDd;!+dV2wQmaa?W1z&~l zwL8mYw(fc>6*3h|+bx+6rFWWOnhAlxzjG*=r&-4ttL>i7(y z3Osb!eS39AIwF!wW>Hz*5*j^Js~f7HNrqps0kbg?Zk#=kIZ)uoYMUt7AoRL};64-y zWq8~PG2y-NVm7*?{MMswm3E44R^oGv552hA(QvtXFK3xt75eSDoBhKa1YS7J@M&VV zotk2$B1!FUgZ+X_=~g%}{T8Uncg~~)%9uIf!>Gs=k;O3<@RQYOx?i|_u`Fk?))KC& z$4;{>lBMoK5;kfY5fqleN^qlT!G-$>GX0qBcwwxCtp!cdwR-oJS-whuB#-PI8HpzY zhHL$Tf}E?!Md@5F9DHHGNI4PL#IN_WvC^yF*TQ-Kj%cv& z=YdD{91`Cw%PU%`EDvJbadX{NTkHDqrBMbVK6#^*ibUy#Mw_Pla3kS2&Tj;dtxSXc zNIPdWYsBRaB^L$5s&om}0_UnOnR-b*HGa@wW^V~4Z&CDOB5}oj!er?y%IeaPu4TTJ zJfFI&3eiwv(_Y3j%A%Tqr~EEhBx?UNe>t>%^>Bmi#mOg&->dh!-_6)rt$hbfNH@Tr zt5QQxzAD+S)*shvhX_^Y!sxxow=AdI{1&!0h5W+}%FAyOfc!RW9)Ih%;OBvI*kzaH z)+*tY-a(CJy^JV0hMpTl9(Aw7l|~`zyk$idIfB}+)iAEg*dn{2=9i6*QV7Ox&!-^5hLB z=oz~=!lO>Fdv9v1bRX@0d&oX~Kl{=GF&lv&slj`)udY8mP>CVl=o~Z%0t~|M_9y4l z_6V!j{u~v2%!7;=ueE>M6GD7B0VdoRxg!y6gSyeZ!F-K0+rU}*y=9rxxxVrBThkx5 zXV5Gkw1uBAw;dgSjyqsElF8bpKQqW~+K0>#o(7T6(=%fyc;YF4z5DGAE`niRhexu+ ze#7Z?0)w3tTlSBC{3B+Sa%Lg*+QF8533HHS9^1h!%m@ki05m zoppZml+y5Jfl$Re&xe#xk%i7d?vG-4Ram;u8_<6%C1#?9Z!@ zS&g7RzEFW^Eb{1Za%HAZPCzCGlT;Pl6hHWfbc8CHy6nijIh(FXC7 zpN&8O;mvjz%OV3aNC?Y50Vga1;O9DVf=zMf!62ClSUqnz(M6Uk=_nQme>q;*?u{+n zZ%%9tcyBsORc;}5D}|v1OznP+vtA6e1m#j*AqFc~VSW&+P9iH~9Jxqbpb?S_2%cvM z0Ya4Y=>U!{3j|9M@7jd0h6i)Q9|OfDkaM->({fV$VyZ}iD2MoAV%;*RA4Lt{&@&n( z^bGMQ57C4Onr9VqoDNFp1TsEeq5(kQTP2!>Bw8~f+pQ;RQXm5<_T?$xF8E<=CtyuP zQl+bq`HZ6OIAFPv0xV#;ZaL7oDBvWk;AHVW42CGlE?CxYnl{6#;S{K11*F6yexviz zp{oCqEAx$0AWpa{v6u+<4b%u>TPI^jCh5jCNfZpP#)04jVCGq=txXPwXP|eBZpQQ`t@ z4n`{LJXZ=7b!8S7b02ygU%Kg-ckcqYIY1(o;ke2mS7I3IszQ&YLa*k+7vAvZp-2`? z2=3N!$M5oOV9|M@Y6J^iM9VP}0?r|)1+=vy4d61uKE4@ob7`Bb|+Y-u+u#r!9mlk0VD))%aG5!4Z|i|;1-RZ!sd zx0;(~UtZ*GEk^04NSaVDDx+C>sRNqY=(8kx@nLo9yX1hr3iFOB+aj0uiVqK@2YXAaoQ~# z|E@yM%Or8cj*O@O-mqKb91UjPM*E)^&_kaec^CZiN`DG65IqIU?4j85kb`G zvI_0fa;i*>WO1WpeROk~9&DLS$I0vNy;KC1=yn~Bj+WP8+N|!fM0dqfP3Zw?7!ltnF0QFZ)HbDwS^vT zUTMt;T_e?x17|JGjIG_?k1g#-@%K{_D-1OS5M+F08)1|7X8ExITNosjk;TWpyO!?N zBTky4&ZtjVUl*{GMc~`fU@Kb2pXB@6&(LUBemopj{`~goW|XU=6H)JM0=$|L*F}d( zI*Dz-`FbjY7-KR~Gsv$u0quzcnxs&$M~)IP(NXrr7-VSx>49v4&3!oraHqPV8zDrzF>C=l-y zwHqT`$&{276hj;(!!{K~gE{U-up@wIPatqjsk$VXvCX1#)@L3`py>gd$y^kDw=>OG z=h>Jze)NLJ`?xKR=S?+!+;RfBA3a)EZ}9_3M;^787=q>#ZMYYDEBm#JgKbhUY}3bj z>@|mq=?S}Z*u8b=zD-o|w39rr=tWKo||43h5iip zg_D=}x>;@7&6~X!jRhWMnVupPo7?qf-mFdG!vWmN#Kb6@lkpbO}gI(kOn02P= z9;h%RL42J-ansLvg9ylvYOm|{rs2uh612C9YukD>__1Io592E*n%1-B9_hfc+g%WaXhw~*+Yowzjeb$Pn5T&MW>-4ZDogh?U` z>h)J;)?sm^`wJ4ATAZ)Ko7_avdxZpknnv#KFT3~d(TbHBvzhZkVaH+Asfb}053q&F z#9n{XCa~S0ISkcKwv_Fb)vG}gi8QTXG-uZWaxva*Af8VtD^`;W7JhrZ#kS zuBDLjLX^&vQ+9!K;}!NU$2~3H1+6RQZkJG??7S1#%Bzr`AcaH%D@B(c01%?Es#O)f?&F;b8bQvjMRt?{JVD5sj~ zzzzsxUm8Ml7iCtng;R=i*i(YwtYx_Ex3G1^m1LaSL^m%aQ;fW4!S$*pPqT*QDQ9_x z84xqkI@L#9!W5a5dSevBr&(HS=J20LZ>|su=mZmw=U=|5@;f1GD)0ZuqW`m=RKzqzJgAmg1(f3?yRyT)l5ECdibL9QxntU-SVS7ov(tZVA_;1 z!ybOE`YW*+bjqI+n1+c2m#jWlQ>W!K@1H{5o)(}vODi2ubBj-FK{z(DRQBN!rj9WKn7VA)CyzKR+Ty zsEb2-ndaZHg0}xKo1gry4-6Xa3mxo@ zEUk!YZc6Fzd4{K_e`G|)XEy!FZSTpSn=FV+1)Bb)9b-VpzdE&`dS(IW>DT9%03H0+ z;pw*FA3)b0Xx0N=`02+-pob1L%@0<$&KAcn500OClI#1wn%e(s=Nb_zk^zxsA&wdd zQyDTrO&>IKk}cP*TqtuHIdp!mbP^?@&y>0bU3Q`UIq~oKY z^U>pP@>!Q8B045E?wJ;mB&NbAOU}s5%FfA+Az=_Ai&F8EF3YQYCZ8=>ttf?9Rn_g} zD=O-q$>)TxN)YQlfP5bRF)=wcJu^G^H~GA}_H%t>b8CBNcW?jT*WuCe$?0FT$n_%c z&E5UOBe01XR1HFtt}?3jL8Ps|%L)U*HA3oX(ZgGC?TMoGH2F4)Y*8IS7`fYv+y_S8(H8X) z9x2j|TpRoaKJ;`~!cr8D`mjFL5=O3MsAo>O$DZ^)3dw!# zuxfE6Q>ml<=>cYI>uru_2bA^XXtgDeXGNM12 z5{qO>6FO!3f(@rLSTdZ@n-CS^Eeqd>ED8#eh9@-EzE82t4KV)TNJ>2865(kHRs>_#qV0s46TI#|5V^-G7`1Phki$s3U5%cN_`T-w`}p@yfPB7P_a}HGnI}PEf2+gBa?&W| zrbfSf>s8!n!3QJ>j48k#g`d1;(~ zZX!Sfu^@wZKwuaakRMP6fpP~FI-tt^UEF}m2AF@(*4@R)f0}UcxsV~5(l-9Xu@cY#6vFQ*Z-A{d#-mB2qcJ!se~|aa4$ew$v=oY;SzCE%St`=Yx?z@ct$uI=s} z0){7GZ(i;mUmgNB=FPth%x7Nk>FPg^908g|2b@NRWl4pto-ri6t;*)Vo`wkOf1Cz> z0!>v2l~;b}4qn#?a2nIE9-H5kA2OkK*3Dnd!|;1LKF_^;2v+u?1^F>Mm@q^UySjz~ zb1(Wasc*vLSg{zhJQ(3W3#DfOb1&wVqPekDwWSQXR%Vt|vbA5Tf$AS3+|bwiJoh3! zz>?2k*b1zi5A^5<#m`iYFl z+nZG;!1JM59%MSb@iz_nb}bqED%a&ovf6aI?knD8cr4- z4A-%M*kj}lEiv*i*os0?!D@!6nwP`{VF4mOMxCzWu#Ehn^trFBNq@6`i;dcA-BNd`rP6!KCtT7Aocfv$hgHeu!u*zNrYD~cse&r}0 z-M!p!{=^w{5ph^)Y6VFLSDHYX3;qmwg&J5IHDxKQ4+%7=pYmhhTgzZ4JsjZ1MB@j1 z@rxj=8KRTZ?=FDTK3Fvohv0@bnLCS*;qD=mdI#S3I?= z*RZx?KY@!lrJ_Gy22+0sT=FYHEOM^H(jI%KMyS1|9owr#19Lg&4U?~E6+67?LU(Bs zC4UI}3yD|n)^w5XEqhmQ4bO|R@jpJE4@~#_=Jee%*NMC=Q;wUa+Wqx>@;r z`t*Ax>dlj27Wv4%mf2d)?2F9z>wjj?2H2sGSM%f@7lvMe&FXunN&&Zg)-a&Ssg4(T z$_BTNfybyduk~o7t;YRA7-mc;W`)4Wi>2$%Q{Uqd?ZwPv9G79-D7~>;$NcTP;t+8m zT}CQME=qz3ut)0zxX7526|fP0k3q~ZOdtH;oX_4bX;hG6OfZu5>Z7Ihi@u;ex0e%& z%gEU8W{4aOt$a-}UbXLskP<1XZc0Uv^nn4&gwc!7Fd1If%iquIcEI2V8OUDYZ>Nz& z!1akXF=m006jb~L1W$#r*Yxn6A_rpBGWF}@CJBhbas_(fQecTUaQBu`ViY%0Ix=-~ z3kG7FqUC1y$`cOB8gIn(Oy}&maI~lvM1E3`Ph`fJk5-~`NaXgNOr{GF(bt4y-|?em z(%Bs`4#WxU%r)hV8IT`ez;;F_R43BlU??KI{APio#~ z3#y@_6e7&40(n6vVL6R;4D=kokoZ2Mtb^uBKvD*%|DO$=+IXsHL9NSqd2}D8ANEXK1P@)Wo$SokfX8X2mOk z#xN!7S_i2ct!HUF7s+f5%~sjVl@4vwO**V=)cSrZ!+ca2Uin2{H!Oq7lz)hJP%PJG zI8jl5X~RCL$@avW$GwfJVT`v~Z_YMF-i2#RjzE;&%Bxi4hfyYkB3KFT$E>ALTk)r8 z0o%=VMW+x8e%%cAW4EzS2D)|st2qH*6f%tR)T zeY_Ml4ywGmp7DphKetqs(d(LwS02V0W&~Q_mk|j{mpymHJMVR?6MwhLBeT1yHLu+u z&a|CfYkBO+>EAE$CH)>db-o_?>1f94^JC1|y0*Dz(up=SFb5+&uQbjovPd2?@X($V zws9t!PiEp!lxN;Avl)k%7i$H=rwJkB&gW6>cGhNfBv$K}a&Y?9C-c?f=sodozJ6Xz z;z-ApO47^QvbP!4QGT}ERF|IzdwVNm-u8?9=tjUYZbT(dS~1m@B^oX);z%eR-C=!; zFl1O^nY@R#%lRV2!+eeA+jO}2T~*UqrYE=7@Datp(%rc0cx}e-(Y-ehcR%{|SUF)= zBn1X^NGbm*)FA&98X2HKfXw63&;pn|0XcPm!;_RzmyvyD?^MGB0n!d&?4G&0@Y=r- zI)I$B@J_Jv3HbQM`yY7R^98ou@oy@wqR=%d54gbojln%LaKnA!8D#+R27qpWmPzmJ z$!PxZ%(2xpXV>>ULu?(uO?CvwvvxIra1i@J*lLvuEsVdHWyC+4Rix>h?2j z1|*&SHF>c-^~{$2O_gmeu5JS`+1Ad^!ST)sz>pmRm*vClox}aTe{f^h4}argfV{do zI04k=_3;IuXm9SGhcW;-?Ee6P{ipu=*C)V`1?1mlq`ys&O>C@R+`k5f|GGBkLYI2eJ9;vQ4x2ZtiUz zR&NH8g`KPe!s+JsZ7Gi5S?Gl?23TX-;aFKzYES=Bjh-X3CkR|yErvfiOYC|g2%efc zC8rDwzMpl#{vYhUWn7eP+b>ECAvtuz&@J7lbT>$YbT>$eICLWo64KqBBHi8H4JxS; zx3e$wzMuDb)_V8aYyI}ey@xM+o;k1cI*xzVWhjFrxGd{~LQV7&kL!xYGg@`w zacTpDAjEh?;%NFdHni!2i7ZAV*9-6QLZP8-d+{t1g2!l%w!f>r>{Gg+wD6&kR3VX2 zUj8rTK(!alDDq6O#O|e(*I)hXqs<(Kd6jVY6iO}U+})vgtj1%H0yV%e{86d3Zhth5 z=c+K`IxbOsvB{27*_WV5p>(Olc)ab=Ff2YkGo!7JD=3! z*oalOE~M^aJ{YB#9gEI9#)E`{YmwS9(z4g7D_yM8*>QVyG+XY~nv(7-r)J6bD(P(z zP1@DsZU?u3um{yGf?Gzobl)doOb``Ky=$AE+}x*iK-WwraX-bujz2Wn`0M#T zmI&McTDn=TPqeUo)A1o|1}D-JqF@D~p|rp$5`qsAl(UD~arzd@NhuiGrM7C?mvYGi zqNK;g5nZx!;DW%mW0sQivNG!PZpd!tMJ0z&~K2!SlcSI~n#Hi3qtZC2XJy{HGz2_8(}ra$KX$VZ`0`RJ6=m*tq!L9NPL51F zeKl$nms;n9wKa1?KBMbT9u5-`c9>2IeC~*3kXB8*nRyq4M6hP9G!?@YVOj`V@1Ki( zw!1v}z5h-RoY4D1$Yek0p4Ci9z!fFmL}~q4QCO2uATs+M@j%Hf`-nO_Gp0K36gmbF z7k1ACLdH$)`lbFwWV1I$M8cisWP6C@&_0e8S*!M&?s(GG688F9Y9!!v*+7Iy zoKbklVu)C%@Z=J4@VH#FX7Zw}~DQ7xh)#6QU8>he7WFU0YhWegGiXpz=a+KPrF z&WA|CRq>>|MA*(w_PHztrH1S)l1hlT4B;2b%fyq}4Hew-ww409_^`xu3?Lu%R$jUz zKrCpBmdctdfUu_-2xV+nOJqrr1DCDQ(){{4 zXi16-S5Ll+q74bxzhh?G>@n?%gmUZ?52qz7#t5pzlSl~%%3pGKp?*SzQj^j|oERE* z&Ggc_=(`Yg2STv}Q2RJ(wh&taW#PZdPmT1OWj|b-(M-7wAP?2&?28mvpFIgflycX? z54K^S;S3SjDGH(-C**o3ghbWg2u1+Cyl(26iK)3(x3MjiaaOPMs)eFnXog|c#0R47 zLr|nlx=|g@HL3bcO1P#Z9^6cX7?NlUvxS$CF83iSArW~quyW?e9vs9Z&ztKoaRwBH#7kKr3YB|T z6OlMqaXGidGa(C{Jko`N7yGMy zv2zguo4mmKl~m}WZZYJ;yWZs|?62@L!pHN7u<*lcV8P$ojedRQ7hHU(|qP&cp8x_()8n?r#})}>mzP&C^JpmMvYn*_X2ED z+Lg;FNm++>nQTGtF0Vv-$EAxkx^p44(0l+Nu&a$j50$^Ab z>SFco?Q)g9AOhl$ADQ6|1eGXgGL7ywkjN$+o#X^QyT5Kzz`g+lhC)+br3ll``3PyH zXL5|6Yk*y6r+i+k5vxQVtNhr<&^M6v?>x2rgzR0;xG}#`)u3G#ayx3r)>u(1`r9zv zGSOJ&HGXP*f4A6$)l?Ivd}hWWmodWJR7wd;#~`Cs#s5G}NJ|jJk&sYyDj|<#dPcvUVe7CtB`}%poHwp86Sy(+5GKYY( z@1lXS)k3J}!(WZML6y(zO$Fa#S?H))+dD!&wJ-;LaE{nSU;gPMu&lB!bP_ly(Tw5lFQx%-M2a;WKF{0W0~H$GD1 z1XowVf2Sx--sjGLL2(+mjJD7WeJ%55SYF*W*SVD1xN>{VY4=my@g$?_?TEpD7>36; zI3u*MeChQv3Eyx$`+^ndHvh)xVtu-0$B^UIiUIqd<^y~bQ-ycl|H+PSN*RN#sZsKN;q_j^C4aqzG)oyFlfM^kx~oWPlnj* zjfM)lnrxz{f<5HDlU#E6A10>2-_4dliv9I_sSLTdQnm7xg}*as^px6zK51u3_at;a zX3*r43KQk^jQnO|3g0$X)mPcAFZ^a=BqJre>{jcdy){nu9+{Ys(k~l7C6}d(Q(jhI zBcT1S+hS?OZKjHVHtxCtd0N_t97&(LLdA&qQ1!MtxBbx!LB!BAI&+Nzn3;N>7E20u zF<{(%oGFv`M4rNZ#&=A&w8PC-)wnERnVKHU`6((^>q~z^US{yYzzjiFLPvE`|Af`yXb7z70j4zLyemVa@L+~F~e(vA!S%daV&i$ z0UITBB{DTEEaj5X!eZqbOld5^@O%1FRq!6vP%t_Mb$6*Saa>*#Gt z6*r(3J;kZ{I=WY0tG`+X*UjIn(uIKS$I>fJymsCvi_gg>GGbPah{nXmAN_<|-H`c} zaJU-Pka(r7+jG*7)ELDy&5L*j5;;nj1l|J=G*1?dWu#+;|9BqOX98se*z&ko=qmS- zaDc~S?h1?RW?o9{?dv%uX=%bK6~qKF985?zoPCAE?oFaJZKWiJ6BR-L4jx3k3E!II zb(o?29=!XK#ad+$lILutl@XtCh zBhC&!lzRBpK0op*t^3B%@Rjq;Z!B&rG0*v@d#viO+oNxz6@v{0@2IaF?$3S&@tO$1 z{`z@X4g2-*;~NYHhmiw^BG-jLdM=>rhVIkpCU)ATsuXR%X7u53b!D3f37bf z(-JJ&eV>CWE7yaYejeONqJ*k$L!QhY7c!>?QG1G%qolsW;Q~Rkc^*W9eJ~Z4YJ-mP zxmJRXITzIQGvXlyiMqli;H{u$RP4f!PI`SD6*4kpZ0cO*mo^vD=jO9?##|%}1nLSm z=rTi{fyKKY^Cpzw;`MXdK&KILG6EMxmkDWO1q=ei!z#X)i33maiC~CwYF1K7X*~NHR{ZIxWp2rP7rL2Jb(b`H3;9|@J~?;sfX4}(P3^oK$E&6%8bl5h_5 z7`>*jo!rFw7lRbXktVqZH(K!Lp4LvPLqc{*aPkBg^Z#U!dbzlMOnkeCxhg{+v%<_3 z&6It^erJXKVa)%|3j4R!zw9wz;XhaZ(7+d;KlSv|baQtT`kF{YcMJ``Q4pQ%vw5X3 z_fl=DeQ;Wob$s4_S%p$0YVG9U@N8?BcxZ>~Jm>l7v(20Piv0%|9OD1OJ)J-J9s>JM zZ+2{~<0Fqzcv&W5qgnn~>wP+0Y}^`% zdHOmdvBF}u%xJW!a<$pX#?U>Cuxg_9+sC8&(b)>DPADQerBX}Hb}x{x@MrZW!hptM z_%PHV;G$|hE&UPNOo|F3kK*>c8f8M{Rb|=|D6&mQVd(Q$Zg2Xs+Twn?F%D#fZL)XI zA$_goy{HYhniRm{9T# zII}Pf3mzICxvZtcNLK&w!2mkr9JtWUKZJash8^4NSf?Uj0{NAdQ5I>K=rbZ}fB0t1Iw;;G|I z;M|8l33QATb3(=78puV1Vl;BDKp=P(9zn1s-#8MU%j%ya{LiS7f`AeJJT|j++wy4a zFPc+B$e45B`CpY2|2o2dqgSs~MMdtzSF1ang&##9e~vKV+J!@A+6slXkKZ8KT;d!l z5l7OM$Jq>%SHsJD`7~25kDsY1*Ua7S6Y*U5 z7F%;33-`u<9bx9ZI4MHgz4#Ca6NSX! zum84P|G}GqYOnI@KThgL19jGK1NGb^>ioOB3vf@j{c%qhmJ|bXJODfcH~*tuy1KTy zrWydA>n5lF_@f_D=hpUy&VC?>^3fdqSjjaG(D0vt4zABVz?o?du zIR*U9JldRxC;!--AN#cqPXTxHqqX_u=F!o7aJDu(_lP}j?LPKs0TyNee%{;P-#-Bm z=s%w2lYczRj|Ex3t;)ZpTfp*gd2{s@c*p^VGO$7b0hNEe$&W=?zz_a^@&Vvy*Z+W@ z?ZWK-@8D0<(d9lwG|}97O2lA7I<{*DvJMf zh38ZV5=9)scJE5O&|%4hKNSM;zWDXQVCa#zN1x{fOHm^tp}AuGT0JzQ91wr9X1O}R zZrtq{{9SKUpjUq&=$Q8@%adB*6||-Mtmjxk8QB9LX@8dc+%k_n0{MVvkHdyMWh1Xn z4jNMoh_+RkY$9v%2KvZ$z zR|`lF$#F_@0q+lt0QlM5jA17UOc!WxlKM0fEAVi}<;91f=T3xQzSlnP3V2uwJ!&G! zFu6CHN4WW)i^5&d?Q~u?0=t6GFZ_bJnxUYunkRn4@#=?LQ~8STM@@f8 zhiiIv*=kY=2%Qf|$~*AI_qs2hZzY6%+LxHL!!0V=;k;QEz}0j9V3}*cBg_t<%Ih; zVh=r#tt3ubc!T3l=}N4`7+xPMKeLJnEAr-nG)!hI)j}=R+VqI@6<|XaA&#+Hg;Ww~ z;v*mN0@qAXtw>6JGIKogEW!z&vJaDF2=y%~B)$JaV(jQ;meVhrPAN?5X0$Mjt)OfQ zIm$jRp)X27qZiDM2?t3XhJ`_R8A}$^A~l4E(CiD%i5ceb4G(Kd`_(|p>2x)*Vs@&{ zB`Wq+aRwjDzv`PlG=FUu_0-kXGpuln`1D@4E?WO%&nd_IB;9myVYU;k47s!x>0sgr z6b|7tOor_h9+b}%8AiunqgRS0d<=ClNs(z9>%~p=8)b<3A{avYL}vule{lv584^eB zsTt@ObGV$S1r=3Kc=J(vaHhe@JQ;KGa|nTo3Q)vbkWfifd`^NKT+c`G+M=Q{g-72k z);Dwyw8u>$eP3?vf_`7wFGY(5E7Y)ic{xow{@{AOS@~PF)tt=z!0z4W5FNuYUu>!4 zWNLqyHBT0YzKp;oM_q(Rzo}+39x5cp)mJEnjfF*MR1y?&4Br`G7WoEHNv;SfHr&;2tVO^?>7EKzi!Pb)rAD!OgE@qhx1)qtLx{; zU&=(rElbX@Spf^bR(o~lXpIQ(H{Y_ham#R|7fVrsqB+x64PO8H`h$_*WY9pGeU<^T6Ez1I`i%2$4a;hZw^&cnD4c2iO&u9>_)< zT%S{)g}UN*NVjRo_10MC1+ZbLiOz*a>nD|lax08YpCmRQvbenNfM%nRprFgoPm#U& zxq!lZnLD9pBEZsRM*6)epB4d!gON!J<=1q;>KH9AB{2xqgQxlFNKcfOu+ir>u@H{S zz*jVFFO}K^f&?zcW1h_-VcXs$5wBc`S_x{xZB=zm;?;NnmWVPe_CkGU!PuVwtBcbeO=sAC{X9;qZOSEibt2T7lhN zM?U};^q03D7B%tv3}-FlXfwJzFXC>btg&#kvZ0_i2?``9XQmHmrch(KtsKlWRBAdf z8%0mOb>dhc5kna!%^vF0DSQzAzz;&E0`t@-Yz%D3oKWpJEih8Jq{6O?MzPSj>s-TD zhj*YdjH#v|w2N8ZRTwoBZHwa_vp9l+z6MCDCvM<+?;%`U-2Hs=Dc?;t1VLr zs5tqC*ob4;SeKR_=S30qTA2}KEcqFY)keisSWvZ#jieJ4lz6ZjRtrb9mT7_X=TAUp zU2vJCjkcIW#^28l16P@c%pF<-LNVS9wk&;bY8kI|@)}*;xJzkXPI|Axf3GbyHeVl> zW-kxV2`_FVhWO636r#df8@r6fX=l4(hr^%J$tR(F{sJL;N{-fgvlY_iWp0dL( zj2I3Kr8eW#`gGJ-id|UB>bWwTLYY^f9}|R}Mzj7vDi~2a#jFYw2|uFg`GhhN0^>&C z3y1m_8tH1<)1ploBFMH7g{}=8t_0TWM|hL29Z~eSL6^TKN2jz%2ZxkiZ;N1=J)tVm zL>_^wsJv;LB}yBEJXf}>5=@=T*?{V3 z1SjFLtN11VlHP;XzK~{vU=_voB7$A*1DW&qSVmsbr0md`4W>^h`AOy=!Nfx?tx1Uq zz*1FSZ^Mo5@4(H-o{^C~K>;>0F<4}Bv1V>(iS%~??Kz(05V3GuGP6a*PJWt(@e`s# zdXM#%VS!1Ch?t3%Hf*-coS1_rdgNkYbQiD2K>=s!_S{%%VQWPzcNK{B2&zc%e$@KI zx5QEw1hjVoz1ZT;qN6xIcfp0&72TLN{kVoNjERb_R*q`E_~1aOK#f#gS080f_6*#; zZN*+AAiCPP%AokpS}FH9_0Sv!s(DfSj)y0t-p>bWerNgN*c(8GaMD)Q)L3rpBr+jN z^g>o@sJN3e*xZ2I^1TQ(IosA@PZog(HXHRv5fcgBPnB*cSm|SDHZYI!s3v4|r!9)h z8LsvobK+SMnv&+9=K06+ew9fJ4^MS3UUwqdRCeU4n}jpKnc5seN%(XJjF_9{uTumJ z$_%GnmsWq_fHwz1GgIT~ySClgT6(^O!K~;k6n6`K<)2Icuz8!?8W@v$PXZx%##Zj# z*EJ}7(LDLr*Eg{HE$q)f2UUMvX22efR6pM>PWoS02i%e0XeBjl`g<$Dvpf}qk7xdh z<<{Qv3pOK~?~Vll<7Fm52wp=+QJ^Y8&eLkxb~tK;ZWb6n`4DWdu5|)l?LtYH0w{k5 zK!^jI580Mz0{yjJNov^{*iE6CzaBS@!S2BYnW^5BO=a;etgn^E-{6CTk_23Wdqb0Twv)GQFr z2f9W~kx3n4*`&!LX`1n+yctUX3)X-<5|CLu*#oaRj?BPwW(IxV#?)g^}kQ!K7!bTQdH?kxx z60k>CEJarRjI1G!suPTA81fgxvku}9MLgt@#Pd}jK#uhe;z}cAAq)u*Kt;JlB;O7CZcYa+-^b`eCrGUsA!y!;0ZunD1)ROewI?Wa za>U)@X%y+{cDEhsLrgHe^UQBwxEv{lL{fzHJAq9IX42q$haE0qXdK#ZblZ`&9jEe= z88U2uTBgr=GKH^ID~hx=o_sl;@-`kql0YMrK&O|$z)Xq%B%IM!p!El?R~nrOl;l>* zX`?QI%-fBlMz%KT{SY@}mRTZ0eh6pDn|j>v%q1abrwI3*k1l=r1E1?mEVWQ5`dnu z>h|8+37`a^5y+-$%q(eaYHjQpZE0?6E2?~SwyduK>({65-p<_A-UdJd-VcOP{hdKo z(FUYXjTNMfHI)CMV8&be0Bi)<#r`d8YJG0!WbX7E0GKR|%`6?90}C0jjjhcuJg#E9 zC+o-O>sNOhTYHZ?+3Nc4?*87v$-(vppszmOTR&afJ>B0wJ^lLF6#(pHE0bR@Z@wMx zU!FZWYOW7}(&E3fqaLGLuK{t;{r%x0!0!OTQLwxJRZP_5kNE$8{@;BAk5OB^q;h}; zJO~x ziZ}{vFcKJ0>JXf0A0WZC%gOUVM#Gn(^`BVw@CZcx#n3t`sPbc@oh%V%BSoWd)>9dQ z{}sTKZ6J&?iZbECt$*FK#bbl)7X@=M(&NQ?kht)fHpKF>z_0vJKSIL9Fb)XGFnqRh zSH(!ewK6-Jg%#fvXsr;FWhT{EA-il3uQ*jPu!g=_cmZNOPGH@`r9DEQT)OID7zlZs_ zAW25b(zy_68WoRz!R4bn(z>?3&nszJ0~ZiIe5SuvoZfMH%>c}oCYy*H9)eLoEw|x2 zBP|#Au_c0#%o$ADmt%#TMSNN}R_49qT@X7!7I7b+tn*Ipi+82Og2c*M^OnSLUgM$@ z+1J*iBC>?Gv!>IpZQll1tJ_Bu^qh6EC(4~wf5;3MiAT?q(Zuy)hM8xceJOVV0<%MO zng-R8IJ(|aBgf+*%`e*Ft2*(rr*AxEb5l%R@%rXPLfa(uD&+0r1@7tiU@Bh6!rC`U zs?(B#A<=v-H@CkSTCYBf)(O>k$>6bhOv^eag@MJ+kqO^D(=nQv{KaQcrREpxz$c0L zP8nyRf1S-!Wh!E1I=|F+-BD8NvjI1?!&Db?hw0$k($$VI00h##R1> zSWj{8WxeATedyquUV;HvrxCj&K36Rc#Xjetlp?`bejj9R!;4~<_(QvVSYDe?Ggb>{ zry`EDUw-bst0#`}h6bNl2M*r7LapkgoNg0eNV6dFT_7`k=VP7Mf6qwP|E-ry#~ArH z?F23h|jU{Xkt8&KX|s%n^d8s zQ$tu5>vQIweRpU6f*=ruy9tq8kC>J;O)pC4=^E)V3`-UdeL+?&WEd_efiQbThzqOo zc*#RsNBr}ejFvK;+#yQ~;>t~^TtunisG(qK_H?d;ltt9aj5lr_PPNM|w_?aaTG&qQ zMQnnES0Ut4joV_5e#)yYZJDVlFy9FsF5i^c}*?@zbcpz0g1o09_2^G{kx6Xac z6R>q6E@`nxL*bKMWgEqmfH8ktG7!W8w!};m-9+;SGpcHYW98!SQ`COPZ#j>7?odP9 zbp)cLo@0OE5!Y+dQ#9IC5vOmbfkrav#>2u@sNa7|x;~<%NE*VFI-ZHk!+OJ$HwBk? zZHg`!z&(@|l4vo?Vohr$6i1L_f^_3CD!ds1qmsf8w7yKrGyFcRdQY5dT~L7`j_!+- zKjq43z=SAv6D|{4795A&cr?#+H?YGgff)p*qQEOvPoPWUM#mhXDvHw>jlSk22(+=l z_naASxMpPiRI2<+VJ4GF{3ZXKjxx$g_AmL!ViL=x7oY32a^0>=ZESU8v<^btxROha zbyr;1Na(|2uUVfNjnWK|R;9~85T2b+w~h2sh3^+LnM16;#tMWa^TAtjB93FB%Hn0+ zT^5?el&WmOp+E?lxNN=CXb91tYM}90#?hl@@h=n8op-EE#lK(GouZ3NNC!`Lxee;tG5cb zAv=NG>H$p_PJD&ETKq&b{$=}Q->VjHfDrMxRe>dodoQOWO8%T03JO@Gjj%0@l>RYh!eM7Gi$$M? zVTnx|byQwN&SUynC!a!mXsFX0p7JgJYxhr>UnO}&hN?cwHHhQ^M=z<*2+*;;ci3aH zk15|%5@;xV7JueO1oq6StF#o|_ObT>v$69y{V+Op2wKEc&uIRNd^a9x@UTNX*)kw7 zabe;6unXZxRNu9A@#6_b)P$XI2Yp63l;O`vCzqzImdDf*MaTZ!5|S3SYD)kzmxior z{WSWS6}M5hx~~7Uc9i1zW>71mU52UaaDLla-E$EdnM1jlm)1L?-0ORNcpqQS7CKj4 zS)6>I;qQ;)M-g1o7Bnwy>zP*pW2I>{zIu1NES(Vgtl?R0IWxO$JbySuZ|K~PvqPar z+q=#kv`@Rty*|D1vJIAO`_@Fs?lK)|LTX%qLLY%d!d)>BL zY%ZxKn9w+h3P&d@DaDgyan=tPqWZ#xBzojt$p|C3neEFeZC2ug$ zAq;X2k8BC&h=U@+#G!FVaFSDSEncs$wclxTgOf_YNBD*&)S!K7n|A>qwtQn)qak)e zWI#h?*-~T$uuC3A0=s0bZd8S?>`uK+kX*R34LA%H=NltDB0M}z9HJ0ZRe$MSb857d ztM+qm8Nx8)DI4O{8v$NaO+0?wtipF|OEDWiW46-X$>PNB>Bep^u|>cK`CJFkEycoZ z1-}Ov2$N_@D0J4t04*sxx%fSycK~;;7ZL$gD31sBh0%FxAgVlAs0-xRL#wYD6c`f1 z>}Gvu;mj!>hd><7K81i(8@F2vJq^KuYYj+dl3l~aW$Xz(#%FdmQU4W=(^CQf#c>i$ z&euALsjyJ6f1Gar9unuQkJuAXkd?kv98$)1Viu8aX+TmV50Cw|3db@kni~91-YAl0 z`2m~g%u82E?;uA6mj)ulEJpS&M&7~QM3pV1;sFx%E+kbieeESA5iqhUiHbT2)JhwC zLy!z6i5Cz`a2>Rk_5qnO`@RuOdc99#3P#B%a+1?~=_RfIIV?%-*5rin4aI`CU#r+1 zu~n9kl}_=y&x0?ir1|fE5F7}I3Hk^U54$}5o?2)T&#-Uf>iGe)IU4)OxNbQ#EH1-q z8Fl*L{bxNKTw7~;`Gj^MT-6*%5PnMHJJXcC)$1MmgB||za zN*vY#)<)nmfr1^yJkoqJmA-!v8qUfju+;5lNgvj5{v=O1J&lKk{14G$|25UYH@`(?aMElq(md?2FAQE` znaH2B@vVJX;+p~5m(otYp`-!GMyV&r1766^x=z+`1*t7O5-S;3x18kKrj!aLpbPk- zYdC7*!UockAcYd@w!8?^fO2_q6CtqOF-abQFQhQ3@+vVyMyHtzNebUq-#b^fg@(ee z1jVJ~2^_rd3M!czm_jVC`J`A)xKK?$BT}Jk?zQgOwvPw>2SX^bUYtmefK4Iehjdru zaZ+2iyCPL+0U;M3mJJxm1T@ARyu~XwvL!Z-!hmovSfY*66-vem#aa?VA?%uS-V4Hqp=11?$t8+)OGyXo= za+GgT@ePY)N-2(w7H=CzsnyJNVZ35XD{9-1A4PurNH*uhzeXL$_}pdh28U2{OA!mdc4Mx+xv%7nf3LM0@BAdl=60s4BW~Gke$` z(vQ)ZS=V~F$GW&O4SD=}=gD54+L!t+RL$IcwlP61o9;Dq@fKjq5X!`%_E8sEL+wr{ z<$+LfYWn9je^SSglJ#@p@Z;KA4pk;c$`SYdCGw#pmlm7~QvA^WJ*7|Ktc!m^3z9(^ zbY8pm6Xht3R0yfgZmr1R0Zb6o<8TKq*26z2u7A@p@YW&G3FbFMGByAm9g4{udO#Sa zxOols6-$a5-tQ6n;1{!q+F2y|G|BI6*QvD$Qb2*|$d^`{nerS)J^YutneVnJNeW0S zx#G*B3H{wU-yP7cS@LcOh%q1t#wZX6>y)~AkI)2i!}G{G6Ei>CQO5G&bxy?pN=&W&%0W_Z#x*v_&U$2T z>Wigfrlfay)rLbF~|5JGsNlqFz!%Jc#M~FNAgKdyM!Jng& zM?TT-lVJeFaM=@CMNfwzlFOhM*{NbfB-p^&( zE#&vod>M+7of-1A#S6_ob4O^eCqin~2j32yP>Vz<^znuMObX3jYO}R`Wv#1}@Y-;@ zFw~rQ&8#F8sikc%k@Z)HZykHud%dJU9B;y%H{@4U`TMNxM#PF)qoUn>DQoV*x7kZ zl4ON;TIbD=^s844`u7eKd((9k$KP_R?A#lU7(LtjK)PUtX*Bt;dt1IofVHYbIjs78 zTVTaj^*riOB#I3jnW`S%m<)`Y2UzY6Y;= zzaxSGAa!ICfKdAyI>uTbgMt9GbZ%twU(HmHGL`+awdwh_^+%b??#lY3K;^NY>hb_c zojCb=ytZ?)xBJH*`E~E;QKNFQ4`|#k_ZlDZ(9_|YgTG}eKTn(QzFhwnt6cxJzxvnd z0qn~I?60#wdKEzFKJWaPIrQIVaHvo}W)A(Qg7PtQXcACRLIYg+{^`^+rUucvLN@qGglPMos6XTGBqX$BaL1xgwgF^*7~bqvN57$$3_OVBacdZ%Nonk?~fm$%b7<;M5pUP(t+0 z-}2xw0mTOK0O$e#W|E;Wj)J!etH8seI`HU;F1y8?NsIK zLEl&SOm^g%P*c_DdpTuF2?PD}ojx8y_*Tmw#vW&w#Y?83aceyO&kwT%&vw=Zq;yc) zkhk$r_YPqxC?wnhcvgqJhsu7)m*SH`lD9i~&n1!$%yfB2f~cWiBNovk6|>@Y-iwtj zNSG9yoA04vA(vVR69ssyW6}?4BhUnkMU2we6Gu!Z7~0X3giA?r=Huc>ZPAfFc+c&p z^Ky9-FhNq7i=5n@tQc6E!NUh1-?!8&K2h(KIO)+&{eCSXqw%~PbdI0}5B!JJsE=*G`dR$+WhmQ)n7#8NIgX2+@!Q`8!UM6!0m zD%@&!ds<@!N}Y?B#Vu!Z9%8spLuwOmKWixDJ!PY8)F`iHUNDYw#7ZJfEnvptGEXZ` zrn!ej)T};5W)RbSo<7uKNp}pbP|$C83h)kx26E8AWlCW`6BO8qE!c5m=(*nEXTZS} zgmxq0uBBIX`mLGtA&}~vzv||HfRlXXsE0Q1G@#vFMlR`gz325bFx{v*`XT@UU2-f= zVgg2ZXr61jpcj+|DM_7b$7>XkYo3OdFY3!RX?nE8Ozoh4RuBntC6-+1D4i9sc^Jl$ zZ$I!@uz5GofSgTS5>a;as<(kP4MnX_$f=8TJ)dFs8%eo5=&m5-a(o{-k1`ZPK^W-q!tF)4y7dBAX zUUlqy5n+Q2Dr!Uw?uM^zhuUg6QV5bv&^Jo8f+~LA!dMrZ_S;|^uB!yE?QdyJesOU_Jt)+u_J4h`{SY)E`tE(|)peqD@3|~897`ds z41BjPE-%`Z>q$U(WDbZ?t{YANJdk({lIIskIe-HeFhe((&>C!Q%aQgSr-jGV9_k@% zI}hQE&c(2n>m{K%!K2+W(GwL!!L^D)`4&ZPL|lS)H7sFeaSI{5TPUZssS1Wyk}5F7 z31Z%mj_~BnIV?Mhhq{hNdXj8WHY^D}U6^>a`bJsCKesTBH<7O-K8P%fT(cQ^@L@ zzK@SKA4`Xqjc{SH(pyoYJ`R*tC_?3CKBMRyXc=j3m|-~!-(;7389sOBM%c)v!HH=L zf+Lc`eUFXN5#<(m6ET*9)x2$T~|CW4pB{_VvSK_OnmaiGz2%X z5E`oD#eAN19$hSYC_m}Da`o}&wLbCiITiBjCoG|)D<}SH6S}3<(Dj+ETf&j4P?qal zl4$r>{_;rHSTgj_(NHVYN=KrrAavalx)2t|4?f4|vV=(eTsmztp8~L)U^>C2jK?mt z8(9O6<4OBUUJB}1<8H-I>GAQ~YKuPZ;FK7j8;ejaav}-i2MVmof?CC7&M)5EYk=iY zBK1SWZZ)Xo?W~;2?mEagr*e)OqNPbfvZ#fS8&|M(8DgT=;d;Tru#Z@?EBWJXlOh4l)t)1JN-=2 zDW&7}W>5S@d1zmmvatfV3-H9YwjKqG2+s^Y%Ntzb4(7L(@`hi=V4YyZ&w(?@seG}n zp?R##B+7jHg-|RMwD_y5Eg+^GFLo7#D2VYi06swaTs{5jFJ|Rkc9=#i*osEIXtL^E zy!c;k(Dh)Yz!s&P%0&#oFm&DAb9my+P8uiA6gFy48#h!~jdD~;`#CjCU=V33GrT-_l(#eWlYhaT#9 z7B*D%vyS8Ccu!hfsjN(ChA3qzuUDr0&x$dHQ@W>GTN!(wC<&f;mDQz`s#Rs1u&AK1 z4r7*fSgM-Ybrr+Sze&|U;Dap z^amK4JFbl#$%x!d$Nke#MLKCV{->d;{&Xe>tFZ(ot9+u7;oHi!V>4snaq{f1vkdT8 zhjK^hT{BDqntB<6yRVQID;t8(tymhBLG0^Bc#n0fO?9c`4!DlCjpN@*KGfS)jY_>? zwUgd-*cozkEM5^Nf7u}0nPnVLNlRq!=Uhf0mqqb5V<@?UUjdg63^!n%eDRCNCI3{< zs0L>xSn|3QjSfWq6AlH0Jv1iBR&tEWoqkq%%8xK?Cdd&0Pu9X$FH=gq(_ye?^jx7p z#p3HlfC!hv+)yj5@51)Q#H0dL%+4UwS%xZ|7Tcw{N9Z-YbouK3rIXHhkjix)*)oX;x7z=KNPF)HY^DOyXG~)Y z=_2jT9EZzJ7JI^?%UBVeC5C>)_``BXH=|t2_WsQij2kZz*U5V77d^udf7vNyC+Wva zAG-Vd9G3iN+iHpGrxSTkELK<0*;?rGiGk%sHOAZTRs5pB8s>2XzDW}H64>xjeb^y` z{Tx#5yiA>ZI1qu|w)A~kl&nWOTcf;#p(FflNpO6eKvCc};q&2smvIgE02Nz6j~1ZU zb{g&nB0_*3tv>;mfLQxaGRVI*WwrlTQ`X31Qx?#X^;nSgJ1*og^%7{uYHR&(+p&OZ ztjx(tz>Epxi2%J=K$6I#ru$El2;j{GWCp+Mu*w=b{*DxB?*_!(j}=(IQ!?wurytb? zpZb6TSHQX1*xC+=yW6_^ABW=nYCv7^r{wBS!xbPc09vhpN~^K9-vjdR0;_)%1-r|8 zr;p-+>G|IoB72W&fw|TF!_&tSsIVeE9`X3!EGPf`O~EZ@_eXbJ}-v z`FG6}Fc&|3`9Icf|2ta_=(rsL9e0pR8K}nH+dp>{1 zi2Tb-6!PLlO5oGrR!2Uaq~`1-oZz0o-XOfpwvO<@`u|GbtU#t2c%O)a)0h*Nn%Whv zL*_^(JrU6!Mct7V(YgHN=kN5*AH%2oEsC;C!Jj&-0{1|b6wOu_{83hRP23sYD{Vs7jOW{0dUZg}m6)Zi34CrJDru&~ z9Fr`Yx|G&ophA{HW7)hv%Zf|abQhCG=(?TK(OjIVObu~=o>3||6(Y|Ks~&lrgpH)- zFsF1coXql2Pf#hY6el?PCA}WKL`$!@QC=|gnP`L6mm4QS*^Sx>DQ5?AB%>(5oIt?N z1)Al5$B3AZe*8Bt(T~QA&LH$K3O*;MkJ*(JWwkynSBKRBdgKC$#BMr?%#xcESx?7L zW&@0LnsBDCwU*z!el_WD=eq0MpHa_zMLw2X-F0TN(Fqta!pReWczi;e9QV-1oe!+v zD4685OL>_h{eJl1CI@519_Zj;P79z)JoVNE(L?TWsG3wrNFmxQbwr(~ zLoBC`@AQKet#iTJt1@UoGMcQk_5P<%S$DMS3@SqL@4kN0HZ33W{`vj1n&r-JUL1vI zOzrDu)b_g2I{kB2huSBy(Ic3+Ivqx^vS;k37X#h7zAS?fFHo%$cJv-uuO=tZMPw0c!{6Dti?^!n;QKYw>NOUix?9mPb)GesbY zNHaY`q#SDRtvSRZMr;x#7e6vyyvuoC|4KlFX+iIvJZaIwz3K!$@7(2QP`_1s(2Cn- z`t^Exwg3BWa|2_|Poxw^LrGuSzN(()MMnx(hOz+$i8i85>~Al&pM`_{nzseE>Q;s^9Js^7j`*d&novKof%2eX;NX8(0Na?>C)!GlZvaGvk+{@26pEgk4y=!bGG z^TL(<3+DAQ(gzcU7v-obF7RjrFbQ~Yi}E3Hdw5r5ku^Me_zogfSNA%hHyVB}Dh~;> zib-34w>bV&LL;8oLk0CN+>vs6-Uw4=epjlozrF?6EM;GPUkoPf;P8K1piGh!(yLQ3 zg>Hce3DEbh<{o2LrdZnYtf;|n(K5yRY@$@zd5+}s0o&hTFOPUoZh$*IJ{oRs$KYcc z8AI$2e4TF4`QA@y!taL=44fRVQ11rrb62Pzc@Wh-vD^zR4V+M=0vbGdv=<31^tRAg zGHG=woufEZQHPHd%ZM1iY%XAln`IWPHDRbfE;z#LXmZmfn5DIR5ir?>5Q#cC72C)) z^ssXbZwy=M#e)M<403wtBh^4meqR_IS`etR)FjiA-~~raCH-`t#4yxU$9~$Srzv25 z#t|ouv6Ttp3WF5ugT#>=#SnxRZB-~TkKd0R)3j(`K=F?*2^I|l8InuJ--_dA%4u2S z_;acV4MWrT#E!)Kk0+Qh)U>wHKfp8GrLHAcXIIud;fxQDFe_7!W_3NlmpVbW?9n7$ zQzDYlIZ>6`z+<`;)qAqi73h8wi(%JAaHfVc{BbFcg^PX)y{Hzh5(9#WCfFS%mOFVl z@0hT5yg*%~&^}8Zqdx(QBzRd%-O#$0@Qlc@SFO->uFeW-o5yK+E(SlpA-aVaTCcw2 zu)=CPonwl0I#1_2|1#0=qFUq$n-WN5sptP~@$x;vyB9J;%^8k%Px zK-!6sLwR3*@%`~r*lTo>t>!=ncFyN_F-RDcAPptuq5*skwk{;{JS6Sxb0+etO=uHM zpO^vl4pf)CvQ5-w_p9MT!0zipllq=-Y!>c!?kHwEvX0l+J@Rpk+tGL0BPXnNiK>Bn ziFsb5c#hmMxgd)?dNB+ubV={`3FCCy-hn1EeLO|can$M$6rldD^09IhXEXQ=ASf)UzR$iC+8-q_;A2;fc2LQDf!BR*Mkr*J@v%clv|62IlzS2NO zuRX=N;44O#$~85GEH-4zReV|WQ??qB3+MSZEIg_K6pCtVZA`yCKd$CPR|RybGengE zD%EIh$&XfrkDJgLkEY(=mXeG#2q@G1H9vFUau~%;ehsI(M5k-3J-vT9$ZZpXQ?L~?)mVt% zb=kz)icE^$vBeC&f40Z9xC}Nz=mdZE>VEy_lT#yJErZ6Z>bu`R8pybZ_p%0vQ?pvR z0PpQy$34u^23_-Ip01)M1a&C6HtMjXA6pq&i5UZ4PLRD!FM1KW@?pp1s>FZYXq^lf zv4Ia@>FJ+9@9> zeJh?0m7gEijqJWpcmMf0{ru52PRof_Lw9IzbF0W&s6qj7J`oq7YV+m-Xt@JJL*(3r;`y z-`C?mYkw1?4AsOTlZ140GWgsCwU}UVrzvjsNMVZMWa9w`G=N0;_R3`;FjENbqTlNS zj$s!YxkToY!H^tJhI=tkG!+k92|Z5`8~0%l8#K&m7lRkiFQ*P1R}`dT=4aswlzPul`Ct?|nYsv%d#K{22Xm_hJ}18XxXY4e#$UrNTsz0oeTcNoWwvc4 z^ma&S`sQ8QU1Y5Q1(z zs&_nkMm(@J9<&;d{SXgtwtE8^zEe};mGcl6`|Elo3>KP>Hz&Bn0$ zRUt8PAvu$`*}LMQ{%~4b=7R}*DnKr@U2dR5zF=3r_+0Vt-0_W4{iBL+t{M!! zc>GJ<$X0!zT_d7FW4vFpa7#O=T-PP;ubi>JT|YQnKYL1lVgSB)Y@}vtWMW|ykY)s* zJN|NPUc6%7-EKbGXOY%p6< z+}G)QLOmtFm^yolrY(gw-BEGaUF)<~vVJ0~>Be}LGB`Z61urIB?G3{V2 zV`(NcD<`X_GrO@Dex#dISe)BB{(1Iyetc%Z&G*8B;==llqSk?;!4Y_UQCwM7e1B8g zIZ?XxTt0OKcOg`^4^$1zS7#Jg!|JM=+N%2|s+Z=!Y^=ZnGV3}A>+|7?@W%T7iTdG% z`th}fwvL9Gy{4wt*2;#~=ihC4Y3&8I@VM7LzRbvczHGi>l}fVjkXVt6-XQFn$eck>3@Xz|?V669Gt>j>1 z_u%CG@a*vL`}N7i)yen!(+Ly!F2dPf$JxQb`RT#;v&HYXw?FpJt|nxzwpOoC&#up| z?}6K$LI6C=bOs^ulL0N zGn4+$&u}(7tN8zM2KoOTo86Zz)ll{?CD8w3v*ifKZcCTG823lMl>f_S%ePldM*LMx zIPH$Pw`2G7}2cf96|FLF!4la<$IjUTZLw8hfOR??-BK@#JWr;m2p8EZxtPZeyg zKb+2cUs(P6N|CDnBMYA_&!u7;Z-mbTE^6!5DN8~txs6r{2Az%cm=h`bvEt?Cv0jm# zONbMu3_tpm5Z;L34;JYgiZ{{P4S!V=pPm`dRrTUn6@AE$^8>KAXcrDgF7i7BFgPsc zNNeUIobXNho|ehQjL>B;3F4~+W{As42G(AbPjU^~Wsw#UJA92O-3}x7NMH1jP523R zY8Lx}M8X90%EnSxSTS|6QQ(ReRi8;Tz|W!686+O#MUq8ZG+9=_AHM~V1`o(e2N}QR zW*kk5A=DWENa|w^S54@xex;Y=6bCYU$S@SVZ{y`r$Ouu?V#w?-qFD_^idaa`XahA^ zCWj1WFlI&~$Sh=J?Aw?aw&jhgq(T`gn5?TGz zQjKviDh6bV(dabH>79P>UL>O%#i^Z@A11bySsozVpM<`M#S{~5^1&}c*ebgqb}TJ7KhYk4OcZU>#M6~* z|9Uo@pXFvwfhY22o{W$EcHyI#!>y!-Rdu6|wlZ&>-rPjl%#wN92hC-ClaiOy7<^_n zC2uH`5_uygxTHV%jM?99`jtL6E>FpQQdHNV#!$cvQ|E87p~2#=@k*rDM$|EGlerR< zDxblPq|3t&QQGnk-}EfBK8yid5;?N82Begex`@SFqm3oUNHj$T3}A3198~#Yw;lB) zDf%3@?M5HwhKNLEWY|<-F+$cJ%I|&<3RyPOr3Tb^UT)ZlyjdGO#qwaMY5wZ3AKK>M z<@wF?W!K{Ayu*8#NuVhbNeV%6nE9}QGXb%(O^9hC_v<18C;xuTEK(1ImQIp5AMbgB z2f;!9V@X*qAKVlNL+zG1%?MvtKrn}Sa0tQbB!-Mv5`Ik{<_!TF1`~k^VYUhbV}mGG z4CmB!Bftn9mtjIi0evzKHltFpoRaIKHcpLa zrY{$_Scx`d87K#pTu?Q7zrQ&ncs=PC!*$-CIkkkA?<@HOjh4-XHlFGoUzv%;J1PX8O6#m0!2=4xib20)24qr!D|Y8~F>-yCo<{BwwuPL$-I zz_>E6U?z+V@i!FIVKI3x`s}^LiP!Q3;eT&j0aR56x;#>RPe}9$u+g-yuO#1y=JV2- z%dxGE66C6&G!*eZOZ5#nI$&ie*aF6SI|NUIzRbo>CZY|a-OU9L?olurGxaE*R3tD@ zj05cu!cxw~i0fNl_zYk~N@*0};XU?KimFOH3C%`+OlM>gVZox*tHtAxq@fWTeXne* zL88t3l}kcQBS`AhUnPoCU9E7zW)L^vKz&FrdajTnu&i7MWko&7M_6@>h9E;u>N-)Z zKI^3`y=G%}Mo`9Llb&6rGA4rw19ha3cMy)zem|*>GrIBwv;Lz-sDhdE^7}1u6^3I~ z#;zV(R>Q^Wctt{k1R{mRgHR^V!B86P-c@_%Af|6>AqTdRnA1LeAh-K*S%R#vp*p@g zm|}*AGZBsYvu0}5C_r1-6cP_z)6C+WeFisZ z{lbE9C1+RFI!iwz0$)+)>&WM-mZd|fpB-e66sjtidh#tlaiP`nUcF5pt_yy4on_VV zGVNnX=xle}8^0&UrY?A(!0L9*2n)iECb(sw_2(Z>z`^lxM!n2pm=K!n~dwBxebaZSCE~ZJtiAS7f<+>t#l6 zr_H<56T;x;2UIXX>VL=2?N}O3z@q;!rZ!cV+RV03vYsl(zp0mczD|nuU2HgLCO9?! zg#|gbP0K`iR~eOYZJ_9&8V;Y*K40VfDoss8U1JwvTRsY>H)6 zM(u|%@`I}C)oJHd=Qw|I^P(0LR5ro>WeF*J{vkWI-7oa!U3Q~Ou7E&7RwV$>tY zhhi_DNQ;}Bo8_O+dEoX>cDD^oosdHE!2oWbbp--xV*nB>Q!kz9DH^}ZPG`xH-3mj# zEh`(%`tRZa!$HLeRli>wHA+9V(9~HsLRH@V_KwbrbglSMuQOq=S#Ld*hxYQc*K8Xc z5*@!2WBSxb>R{2to85^-oeaUra~PzV;{5T}Ya8rTb`0_C4YT#!2E7bNV)>el;7z%3R*6FE^iS6V36{3P*;+fppp@G&Dln9-2P<00Vky07>AD03;A%8A^pME9EQWjNP60>Fkg|Nd-{Y!1p`c zFGgG?fnUr+QUHx!DKS-t5E?|xKwPw_J&y`Wpq)uX$)pqN$NQ#ddc4z zleYEh@C>jmYT}Q221`K0C1+7-F2S#0NLt1g6O8r)mi8l-_CHgCt{Q{f#NXOIhYFA5 z^K*v_^T^_Egz(iY}T*w(!8P+7g4cc zQ8=RDm6jNsJOnaMpFILz=psS_%aKZx<{Q{xI09VD1HT9^B1z;6 z#+^pPq4!DYh7PWXEyKWl^yY>G2VWW$1X*hvw7Gfg|W*?!=tfmW*Z?SUq`^l*J5t!9c(j zU7JQ`$uYE;*_vz=SGimy!bZ!rE`2c_`}IRY$$hvu74ipBqTFDN->4-0t8u!7enc7B zW1}8AM;QP$(lE}<8J?W5yjP3NnTw=3?!mwk42yJqX8_`Sf}PbZhz2nb_zM6iNsxr7<{yb%=997UIyL|ID{=4Rq%Ty+m>(&fA}?! zV%uBtmaNQ|78UWb#F-3Nh!YVx9@{gsLOBn~owGoCtrV5oe;Jazwp`pY=!A{ttZC&) zO^nv1hc>rm^gw_Lp)#gEM8P9Q?XpGbZgWnx)l83!ofEE3b|yOTtX>%-$Rf=$+hsf^ ztpFmFq6DJtMxq_~)Es1zmkP6-^lJ%(64YoVHAM~85h@CVYmPY)kK>Vm zsuhZ4$b2eDQpU(0PH4JRUv$Y*U?~MHDCok^Jrz)5jKCCS5=I@rL9gUT^k8D(JZi(c zD9m@is%C(xbfj5X-XNkEjcW3>QKPl$*JvnUB~5Bn5OocvD41p(tZ-7Ke~GM@hk|5+ zruo>&A;3Q?S_|)!gDEM35+06NpPohFtj?90Olt zrqaX={M=NbDJhsrjnCt|Xi_Ad^)?6}%zI0Z{uSQby%VakuInx97rV zkWVwPoywyZ^$D)m^-&K960`Wm(fJ*c?3_rr@fVbl=t0f>D!F)!SNsHopo}x`{?A8A z)CT%slg{||Wb%Z#Z23+$=cG0-z-QJ-;SJH$mhP*l}LDT3z!v;F}+3LzzOi17$&jr zB{M*7LFo|iX@=kre+V2Id1f5k6Gbo18zzHweP$}6XdQ6#CNjFBXR}FrDj2zrF^-lDl&J$HZghxO$&`ZWQyYmi=}d9!N9fGkzhj1XQ;)u@z@vS zWCT~W!j(CEf*(M%G6d=q^Im>LB%PBRY>Uh@3&g({SbC5nU(PBxA!(l@P)<(Koi7@` z8F-WbdVU5IC6KFqPcDLs#JuQLCbc{lzSQpmKJU)u*T1nssC+D_r>Mb5dM_92&lV_P z$d#2Vu`e-?->k?_A`8weVx)C0%4d;s@kFv|Kew+o+)-ua=fTv;3q<6Tl2l4N`Gh73 zV&2SH1TO48cPu7+SPvIj6j0ebh(S7vUX1VDWZ_)xKMxQf9(qww?yy_fKx_K@)b_%`DZj~^8|~3PeTQfJ|3Cs4ThhSS2p2Ma1GFC*~tA;-y6~p_juX`e`=j_i4QQY z={gfmi*{rvw<}R5czcl6)~cJ?%FnZGgGVs2c|PKOws7Ge&5$fb%F!gzBWvMiApCsho%)09%VFizIeZD(n&L{-`3Ix&l{bap`Tci}kAAdY zuEL%{L%gr9=_v)B`tt9t_LNquNQsx#jDcm>al21^~5y{JT=bpJq%y&FbODjkl5=H-hS2%WoMq5?fD|?#Hd}fnq=T zn+=qeA6{BMFe;FmcRyr*z9H|9RekgL>fphi`myYDhV*oX>&BxoZg+CRharwVsgEXp z{6x*~eiif6mN51O6rtY-tKG4YdZ+)QNUo*f(U|%ILi?y|Ke;pqY+UM=Z88$Fa1mI2 zR%Qw{uQ)}(>pB0OqZ<3_bab^K~vZrzCd5KSBIBylzMOhZnSy8|# zh?oH#mOlv#?vb`0z#N_F{jXn5C=```r?#L1R}wnNw1# zqqt-?JD=VcvBvtwj3%E>@_;P^YIUe063j9H;@#g(VQ|lnUTxixi4L%sF8R>T@oc!! z>i%8nwVhoxcl=x@X;+GsR(0>ZcWkRcCFkbs^;(Hx4$GWe8#fX~{x?#V=9Na2~{a@AgBozA5mu)hz_02xJmVbJ=G} zQc)}Y(%lUx^;L)WN`@{;!$r0e>UJetyBF*-R-N8(CC663;PQ&4{pL!Zq?y1~fqPs7 zSAln4W1fR&-R)XYuw2hoN%%PWTItR8LY>mvUuSB{qDX`dlJ7A2cn8GrHJ{y7yRhAF zW@$)M+|=Z#8*k=nnHJsD#keG0vuH&2lO;40Wu-cGG#ZY|b>uAEHMO#UgZKtVV5bE{ zk>6LD4OD?OLx&;oCd9<VIBJYn`f)Ao_Bf4 z+KCLqDAH;9IEuaVAv2 zJ$CE9Kf>@mpPWxg(mIq!SerM#jPiWGcA0vertUiPaOdYX_g>()@|^nNliSi~jo-Ip z`f0xC4Gc%|s63`7|GX{S>G@gp@<$sxtF9-T;oBphiO%4m1#b>j3by}tfFI1wyW8N6pRL_Tr`a)AHCz9{ zpdff(7aSH68W9>59hOxb85I+gkOZ&hl4^UB26o`>Tt@RGypH?Z#lfXbg+=)}1qHWP ze?7Sk9YrkzMg3!cTeymHo44MH8ms7<=g0rFZ4GUmf2+3q8hG2*T-DH0 z+x)Md?fK8&o(*2IE$qQdHn>0+?$3p*oBH8Z8@yqI_iXTz4b}ng*+$w2Mn{Lo@{=a| z$Ntr@t!_+g>`gANO>UjSyS3?=soDC0+1YFTP{jjt}k64nf=?UE&W|S zTRZ=EpSHa8pFVACwR`v5=I;0Vz16Y5W!gXs{G91vW9M&^_Wk-8F5kVlI-T=4JvsPC zlXh~k-wN;0uJ_MxPR}2%|2Ae%XLs;&?9cb(|JjVe=}Z5ATXe(UM21EGXZ!rWCii@B zWLywwu%3U>OK>#kW$+jOYJap!tRS?KprXnUPyzf7Y4Gpj#@KjTQERvV8&GdZb2V~9 zc-K@2>69MsTyR-pN9@GEw$BH#J8^+zw^Lo=&7l=&MLT=&HwNHP3~sBnKa4&ZMNF*R z^Z#rsmrRPrYlkir!NT&DZ^X2p#Xk##Aa;S@1y;Ld`ms{ntw&^sd)0KrO#{spfCS> zht&PQOzvFDnkqt}djkWt`{VSC@7TiO>$mM5Ol|iHZ4EX9j$t`MlWp#@S$Vu}FRYjv z?Gz{+Pn(KNZdqVI3?@$3ZZ(lH>hfg;sZ3Kt-V#1Zj(~@WLiRqgR;Aal>UGpe3=aiQ z>Wm^aKqc>I0lt(2?lR@d+&_fUXh=+$K z1}glZBIY|kSi8k+_($r6r$4&(Ncv}H6RQ-jgYv^%zdNB6If_T-qr9_~@oU_14fvLr%X$?oo%6r#w1Ul=m>$p@X=YPOGXV$bX!{+cmrM#uZEXbg%?EVkmfR zli#9l;w~W^#0kGj+oj=BtF~|G=pH#X+kdk z5$4EycG(Zsb~)~1+z&)~HkUe}Mkl(y&4QNr-wVs&$BS1m5#lG4Bll3p+1K@ehskRh zXlqDb4UR3$O1HiKs50CdGw~y1_$Pz7Wy_7nfZYU-qXSv{Q&~l9yVHp1W~EbKQNI%9VHneI-3Y1d77U>Tq?Kc8zj zzJp6@_x!Dbz)3__fX{Kcwx;LTgFh4zq&fbZzGa>OWsKcnfiFuZH9rw*TBS$w9;m#g zDP;YpJm29>&s}G?KGUp8&z1Z<$|}017QYS)K%#vN&Q%`>%nYC;02e;}?h6T(f6qY* z{e3SD?Q*B_Cgw>ag5`11;$8;YZj;^*q4feU=)C>6))t$>xG)2PaHxghFI1ts z-YBn$?aG2;Q5#YlABs0&KRCqu#49etb8AJZ*iF&6IbVhL{Mw+xuo)5GgpXHIgnOqktK2{w)q4xxbltJ3VlkkVG4)&GmT7h`@syMzeT-hfxQa+&Rtf{4q~y3zMK<#1Ukd#S(~RXSsCd_WEZ9gmL68-zTZSN=BC z1ZvE_go;t8RO$56f|8MaVv59*Ow6BQq47(wqV9zti9k`Lq(AC;UwEnIaUY2F0>n#{ zpR;TfQSxPeR~KeNsdRYyNy1%~<{bVI4DsQt&OI2XfDcKL6~$;ON!N8*UC*9P?A~(O>wqYRGfiKOgiGLM4?PsVO0+0CyO{bk}T$av&l9j zy2MrGYX`zVTj$@@XpFoEtzgsCLT6^|8#AkdQ53+<7KkI{=!TXCJQ*5vc9P5En|DDN z*%vWi;N!P5w@Mbgjs9qWCVA-7U4&uRSEvr{>>BG%LYIx8QxNflF|q(jG!}!yv;V2@ zTy9S}?YAGV#6JU}<6Jp^UY zJXKk{okYVlIQoK*rbRT!(YJlw|DL~P)DE5ShI%zZ(1UuW`b2gB_7 zz$jdIG;}9+#&>QjATjT!c~|^WypA2>TX5+3lX4|lyR?Sw3yZwtbLYpp%ESD$f}vl5 zWf^SEY&@EdsuuSKslDy@eL3mXI^MFbom-6$9b6}XcGvWNDt7Fb`&2(~YJ+M>ETm>p z7cvf}zCB@s_$2y?9e-{9`t!2~r|UBOf88Nyj z1M-M+!}`OQ`frOaoW6YiEz$~RM?{glAD8@!Q0(qM5fKE( zaMGO32Ek1E{o{4xi3}1oxkE+y?dy3r=?O?+;Rf_jT2U|MYXrJ$KpM9pr;LA09*uel zdu*Rqx*Afy1tJ2EfxmTx5)ysVEfO22XQqyqTp6RI*Z;+$s}t2(8r z@E2_~vV;3-b>D0223P1sgu-nG`f5h{uyg%Mc&4#1aE~&|N;dwK4!FGPp&r@ zM>aII!ePh8+=|BXy2hE^)}q?hhE_Q8_&0=2F8)nmeFGh1(;YML9JbqWdEPlV*15V1 zM;^O(w)&=5|CPz$foy4eV0G`WS9fe;C@*;k)-~KYFbXRh8yXn@_3&@-ac|<{baMV5 z;3Irzd;4T^|9a}?=iJx5ztkffc3fIrIJ#TRi(g#ZSlm8XJh)ownOd5dTi*G$T3@m{ z|8MZ|>-O5g`P%XM+Qrkx>CM;GA^4Qhw<+jf1MkA-zre?h9e7;ZJ3QW>blX2UJQ(Xa zI6XgH&Hu|j?zEij?VX&RpM1YQ-JLp{Fgn{iJ^TJ}e!BNJy1@sL;BMYYF}R%fb|dI^ zYxM!H<(*)GC%MOmyI(i6@I3eQ{rLA++uvVj|Kg7qJHLON|HU8YdY^Bq{%6Sh56%c@ z8C&=Ne_|QC$V{5-XR|7o|I0F3|9dtI&NBW}`XGrPGbVjvO_Q*JM}O{dLnvS% zg+k08*8I=K?2Akpu5xC11iqL2VHg4e>9<_6!g_8+q#-5Ax!X3m!ghI z|Cr4ZSmsa<;l!mOR{<+47~63O)1q7BMCKABA>NvXPMS$XdD>f)Xz$_@cj~av`}&E^ z8aARa;h$`T^aFvnz{1>->~NFi32&(h0kfk~DF3oP{2hftU5cAHvTC7+gJQ68TKphk zh+7hQXW)wxvI_&gOntM0RUyP9l*q9|?O)qXe<98DE^* ze;1WY@7rGtwT~hm48?z6s_K#R`iy3PFqBI;*hCxP-$G;AhcL`xGchxWJuk{}&R$@S zJ#Jp~O^>5K(2c9X-dvz6E*)C7C{PNMeuQDL~9EH$5%*}O4nRS z+~3Wdfq|E(m$u6!PBjg>iri1oxG>GOnzMvW>D9co01ARACj zq9JOX1kctkLU+RLfhbq(G?AoEf~llc2FQJ#xuPMLc-Io@*hP(PF(Sb~>`mS$y8GzQOruJ1V-sWxyJQO%+CCCiJ3P=Op4`l+GA>N;tedF$YskX zG}EC&QsQs%ZR9=2=5z0Eij8KOm0tAo@}^#V9+6?;4LO-F5hg5FLy+Q2y{aZ|yS&qX!H*~t!3EN8orzatsysdfptKh&0Fat7!F%#PoC4!gHn!Sy zor40vXSYBt=R?{!U`5V>j!ZUv(h)06H-ypu`JwFa{F`yn3JBkkM# z*d$FN${(D=0u*c}*^Y>v`SH32Y2?~6WA5b&j@-EX1A?HdP6ppjEi9-d@s?2NbL zlOJPUorwJhg#=DN8^Wy*t{tl3J`IJG#Tl;wIhM9ewEEFn4Q1>n)+S#MG?SDXD=bRP zC6UDT4=hBb@cwR(%CfACFzH+ zm3q++$L!~^{-E+S)LIB~R;=_3d(={Op1B;Z-~tkpX%Dz?)aiasAI;oV*$ok(Kz^|t zB@g-2^Y!_i{akXw6{v|8(&%9NxoG;frKB+*>!ZY)3Q>oEroC#PMzOT#F>V(56xEAi z^o`Fb8M^ApqF0GoPkVCDE&bFJlP+1Z1`0|IM(2a=B zge%?TFK?mgUPiW&!DSU>)^$k%LOL=7qk-izRKj%((>TAcQOHG+jB(mm`VEoTAp292 zVjS&X9UM&MUz&^oy?YaAZcw9tUyvD#t?GBVA$6O*n3Zu_Xy*HA&%&>Vl?T}&p1vPy zHpbXH_*M6ckpqKp_e%K}u6oMo!_;5t!(s7}wDRLz)*t?4a1B@SEdWIK=N1;%`Id@O z!^w$zyF67ZX-lJzCp%DFF%RLZdNlE0fJ-=FSq+?eUm0RT2m|2pk&O!%suZAx6azV|dq z6ewzi*B<%m0ql%ed_+FL7RcBQ?d(tYTQm=!G!&9KTv;(G4OK5>8N$aqmg&nt8ZKjb zY66xY0fbioOt3F=Sr87VukE&7dqdy{F>6X0Q0O*?QlcP;o0hK5XhAIK#kLmpoY##N zf`oNQoHS9&!Kc$O+pmnlx(Go#TSBu5B(+>RAu#QxE!Ge~fXYH3F#ppzXP797%e$k1 z3p9Um?N2`8A7qSCD0NQ4Zxrj{Z>95ZoC&s zfG`X(Y|!%}HsAfn6Q?jjDA<$)f7jTLP#n>)Im~Pr@f`s19v`_#C$hvVGWk6@e_mu2 zI&&x^1nG!PNzj(w-LJvRf@UuKasT57bUvcnV7dZ@s1xT1*;Y9xakN9)Nurg9nJ+7L47Ki3LIcxR6+M0KyIv0z(g<%g>PU zAX~#ib481|=6iLTx^Q~c==h`X*dq*X?)b-K;1~%;IV_q1Q3rVxSm+c%sTz~v6@yRX zFD-)*=ZSc(6HC4ti`WA&2P3+I5xr&*cJ5>Kk<_QTqgE18G~&<hub{%^z0Oo{sSF zo-yM6@cknE@I*m07qw} z3kS_TZ9sh9NrJLwGRJ|@=(tZ@1YIr3)+@=%q#4SxDUZe}P-8TY_!MCklFYz0X?zbpoucL5SI6GQqCV%_t7>iOerkUlOzmnFLm`{hJMDVU-wO1FBQvD z;(WclhrF{#;4EWn_Jp^)MGF}JI9(1SBat*C*(M_xf+}>0@W_e2`H=H10+r|4DHc~0 zmB~2Qd<*H5G1At3ESeZcLQ~>*0nAsIh!ReSpGDL1ZVeM*Xgl<#yTyi^jc6PAz^%s5 ztd>zu2L#?Lrn=#h)2q;ArX0Q@VFN0kM5&xbp%l$>q_pxJ${8dDgv@VD0I7InQ72@@ zOSB*=)ZL?86Ozw$)&z1&^L24dL3&P7j@K!eH zRW`|0lAM&Wqxlob`sW|TY(mS^fe5m&lH7`tY)I-yvY=F^!tm6J8M5jaRKip7XyO$R zPGEHnbIu8J<>q7c)|k8~9@3RS`JDg)N_@>rW5lzynv2I81^@!CO4YC)TBZu}nK05s zru`H!l=g_LPZUg%OrV>NCMyOVPY(^4)qm`Pi86Cg1O|K=3n*fw$FZ)tTSg>1MM)#B zDLw?&^pvozNxO?v8s-NMU9qS>=C+#~`|P7Sib5R$Y*F{5DbGLrK^Vdi5)zk7A#dko zZ9X=pmLLiJ24+FuQAR>4UyufMDKxC^4_Q>GDpX1iR0WXQ( z-|Fj&QydRe+4ixpYodcRz29%(m%BZLO8Od`od>S-98jp%3v#22c!bE}Zm53N1Iv5ONy%{JG zPDpD`k2&#X)}RPCVgH^O{1cJ(=_=_^npNppVsJ&&TBxb{CcdR?Cg5&-$Z=u_rE2IS z2qk-B)VZVIwW?bj)Fn+waouA{T7`p}MS_CN_C&-*u1%T%Ko4#lS>ybmA&h;~(>A^3 z$FDH#UWF*O(akr3MBX!+don6K(eLIrqyj)Tisxc|t-!9&q(c&ruuGtQTEDR^v1vSL z#DGK5(L69bk*Y9ELxnW(G%heRbx}3t;x~G9hVbOe@y4v(WPNtOw7K1tEt|Np_8gn0fnCNH^UASJ+poqMJ&~Wr4?!&1o6?psJvpf;Tf#o zGlS$kSYM~`u_j(s^&I=nE*8&n=Y+p}{z`BHz*(R1OX=vr!y8mKgV_u% zZCF{bSJajYM4sg3w`2Q8Ys13ExjOsvFM@h|Otg8Bnw8_%uNGcsY=2Zwo2YATR6U{9`Vk0j}@{Y0STRO|Zgxwc27 z^t1FT-~TZDt;$bufVf-NXQ!-v^(uf5)4pc#zFNXg0q~$5G9?Jg+Id&*W%7wjz>;<+ zZ_m2xGkXDmRRs03hjct1;L7iCBbO`nEN~I#D8cTiSPz|YC#K{%pYD@z1rShRa8&&1 z*v#pm{xs&%Xb;N>9gp(3G3&4-O6Jnxz}f$2yIIRB(BWx-VocB3N0;ZC4Wp>**p*b+ zS%{6MSDgd_+4EAO;#r7+Maw|nuQYj zm56$1tuF_!szX~Qx4wE!B-rchdlbhgc+Vz^LJ4$I%JFOVlLzkGeTT0n?EV>>S)rJ= z2NeP52TbP=?B~2V@@3_006BYrCeJQCA@UDDYDVuz$!IM7#A*~j zIQ`sf1V_nzajC7}<2kRWn75iFsP=RtOc>qt9|EUnI%FSmd=HyTZ`;2mcWNfnQ!j)Y z>QSjJWy%|63y5d43u09wseI2&GFt+{VLZ9ty3-ac=Ce%{r8-uw1^kp1kA z)5|%jI($ljZRF*(h;aRpVDEsTkclktrc{`GXW>*vX}|I9ua{Vz8nh(p8uqqHH^ zauAhN7SC9d4D6ORa8(U!P&abdfEo!<7h${)nu)UL?{;$c_VWJboqg;-boRNO7kPbUr?;c$A8mc0s{OB|K0f-Fw)__!usc4` z4UIO+<#Qh8`)G0)ZfcnP7PcV;` zAWvYmz>RLmB1B{tnHC><|WV2ou^u`Q*Hh-DCis`1AI!f?=@AGZXxklzZy1iSQ5 z*+QI6KeR)4aKzc4nPs+Z7spws&S z^HbOMvP6sbmvv5|bT0x$1YE9LlAQpbL5yC1L>#KU03#zWmPsWw@&yf^13Q7~01!+< z9627QQ8IjhPCYCrQ5L2Tc~SO4BuuJGcCs*cYEd4)*3_QY071%^k-m%{UvL+G zK4@n-cFx-6@pw)}fp({?L|Oc1DTNN?FG9||leP+r{HCs#>cg#&&@f|n9w|Y~JYPtC z;BH08bmZK_X~?g;0ES6^Q0P%*!MiQx2?A*6Tc2;t?Th{-p zWi1FDQ!OPp!_$WuAkxZq=+5gp<|MhF;3Bx4&9T< zURdwp4D={Bif@Hm9gUgus@lP0Q^=U?bWYv&>3Ye$n*U~yiEasiFhubPxvMIrd1BL= zYE~vPbn1J4IGQaUcnlqbjx677GDluEX*{R#?mdh>{GEM^@z#oggB<`OAz@N{14cj@ z%qiVZ!~V#u@g$oGgq<31&OmPqutssX1986o4xpCFMO7aX!ass@`LRRB($#}Vy9Bgq zs(C9%+ro?2bQb(h1r-<^BCPED8=EzOoS~}+;WcR$@5QSyU||UA)8TI*-dG+1C2e=Q zOb@|hI3gAU4Z^!N>GzrjnlRz2_+mA-KzOQDMgfWMh(5Ihh5><)i=m*RMpPfbNhMPvR2=4E#_b(bWt@8f)FYo zh-OISkLjflNKQ+xhy4Z)!TNCU1F1t&oyi`FIrgx=kbiPV0V>=Tj?52xrPwk64cn{M zF;zG=J+3LiPx@rz-h;l`FoFK4SFhl`Z*q_$V`#X4xl7<8<-^3E^doq^9~0jFVwN6~ z#2EHUTB!d#9j+|;Q708lNOYCMU1Nr&V*pQuewFji&W|IQO!v z31@g*dSfCYi7+0{3L;#q6L$tE6$=Kotz1{RjhEw}w(-_1*j96;1!$tBEa+Dx;vDMq zYcJ0FvlB#GgxqO~_16l-9o7(l-r2Zw_xJ{BZr8*~FiYqtS& zX~6Y9$@q9EU|}SxVTr&SH*L3_w1OfSWMI89e!|x>cl~G<$rPfN zM(In|VZO*RTX3)Mz$>D5E`;c-OVqX4L}yeGzR1S*2RSvZJT^roc_cXFR$pA*p>2s! ziEW(prNCzHZ3+aI5TdjN+%Ejm!;}@4J+P6#92(PY4GIeBYH~|vLk&|3&ks7aq6{Iq zi=__mt~iqj3BgkG;K zfZT41zx_JV4o{CqYQy&un>m^@XkCxCxM_V2dn!RcHZjr_kd-PM;?AD8e4|ISBJtz5 zDDvZ0xUY>RQ{-7tI615ueOezZ$+=VonYAcT7&(aZycd5S_#qvwuU(C?fV^=hCmn`1 zBnfUZufr}*G-xO->36bnRgik^A4hvqoXqZ7v{SEO+Ty*-|H@!yC)w!qZJRBI4tQ!m z9cdJ!e47A~1zgY^E27;54%Fz^>{A2s(h(g_I~mFJ1qYpLmWr%bN4Q*e{s)$jD37aqBh8l2?G zwFF$cXIDsrMN#;Va3}B2Rm|r^?0Yc@m^~abK8=!>c>SvOV|-=nL;T}j#ZC^fRI>5> zVrZY+b}!8<<>ThZD{eU35Ui)63B4;Nvc%uwdvdCa)vijPRTMwH^8gzhe1JMse32AS zHy^TrV;_+J*gD4?)?~XaH{q(1@}H!|i`^WvdFJer0N8vJl{_N1J=%JC;WX$rd_7Ry ze5T2LW$nEYT9{O)SXi6bOPYvMnn<1Dy9MkUPC=`mFOV9{SBH|Qqr7Rxg z_{nPJ;Tk#|tDg%4$~hn{kO(VWB0YAoYH{>$6?QEBXF*&eyvZ%RB_+JAB^>Nv#IqOP z4T$KWjp*l&7;uXi42hr`#4h1>NgE2!QbhdE#qEQavj+lnak~g6n8Le@MNN&vf0QG3 zg)?N9TSkEwdKAgn{p{-ojXp_O{u6rYmdaR_Dmwj}d%BeO%#zRBmao58iVRXJ`K45K zt!(6@Tz9YB-=QI_t})v8a$?aj(YCbKP9M`TG1IC2tvfTKUv+GdzhIefyF;2kozpP?Fo^2$bRG;^pHSTjZKI z>h)vHpnkv`DEhQG-`eD>E^5{V|PWv9SrUoy)QNYjGWIadYGGv(E{+xe2v@ z*T9z`X=xd01%(+^%^3}y8O?ne9pf2G&zS*IxCMP;Rv$7PMpF9h$-{_>u&iuU%3q1lS@)ryU!s??(Ds=Auz``WIq zy207Hy`6t!P^0q=eSHnkB-G4CV@}e`)=g7e+rU8E;OIXGv-at=j?QLi^yy_o{1DO! zfpk?Bbd8R7&CGZGI_@rM>dB7lotSxvL5+>~O-=UAtiBxB=4J<5dPf&lUUE+h^Ai&@ zlf7e8$M;iDkJC4|Gc^S>3mr4Z$I$cJTzc@_?)Lm(&;0Q0LRaJB{L1pd{>se!%3RjU z^YiNT2sGcccKWzJ8Mc0OyngYxGw!f+a=LTzusgT8d$_lI_IvO5<=)x#-t+U{bKPI6 z+v?u&=F#!N?#bEd$@Tro)AO&j#a{>DUl-S>OP;^SbqiSp*ZEN+wceEsje zlNahYnQ$1icd{!UOsiZ59fvF&O=j^PNPF48N#}m)oz%Zjzd@)ZQh%v#ASKZ7KU6o& zh@^(H`Euy|&CBBUM4?h&m}v`Mre^(`5&5o*TCApgd`o8d&!$Q(ao0py9&0*H#zrS| z%rNJsnjd|E?e4l`EiXx^P9$OI;`Yzc6n5*4h>0i)(b^L?E4J?ynd*+z>u175y4D=J z2n+W!{WkG(YatDP92TNZxkTPH63z8Xlxi^Y^c<|4#M=7Bw*f6HHSKqgm+GxIyEvDZ zejC}^Kr9{lh9WO~Y@8@?_&R?RaQT9^BEMocGZpV~r7lxxI*RXb`w#l4jx}vK9ONj5 z8#-nf2V3~4C`ws|3^=SAF4+I2y0v7wB9T)XaZrgNY=oj?{0JdYRmp`XVmUPz!PQ@a z6%OaxTIzj+xS}Tgo{__T#6veHH$szynEc+@O>^?dW1MOzK`?O1RIap_zlG@+v1 zqCmlUFvND&5W&DS{6sJ-NTQ-5g14I+%nmDvC95bRj905GKSY7gOq51=2oBRd$wgCu z5gHlDLym?KCb@D-1(R6;En#EM7>toWE|=oEkLX|Qn)MZL)%Z#9C8N14^>H8gG64}l zVLCO$^lb(JmJ~H;D5jsrq%It2vL&Oig+gSYglx{Cj>9+ABgwWcS}R~m?BEtk<7SXp zG-UX?6j@wJVGuL;aL3x$o#1z7b;{v`v31Cw4x_zLZ{cGEGIao_s46rGHCDvcJUsr@ zZ1yYsn`m+cGD$^-i}+u4q7!_+QUV#p357a&2s>a&tTCKKp@uw0W^4!=;T3MYwgk<` z__I)rq8~a+YrBlzZi5tqLUHYUA+o?gJ^{=bwp>_~z$uDiLambMsHuGR_{DA^F2sOS zmFagg3Q&%FTz0a>Hg4SARB+T_NUed$n~RuWm+_f!;Sd7_^BFK>zltbEhY`^s#a!V% zM^V%pp*I@Dvmsq&)YRj2&jKyDs1B++h;vrbCD=l*>2@kC3OCdjrPxhFIO({sLs+>5 zag7zIi1Hk)9~GPy_#@@>Y%nVNuI?9#1cdPh10>`aRYIKjdp&zw;At&pFi=Ji@S+Rp z^`GF<>-?2#au5j((a><~Na5w2v~4I!dscWW2q==lHY9Tw8p9AAICb|Nk^}B?vJN<| z25{oMg`XMr3~2z~phVUC-6OPPnWXGxtzS$>IVJmYAL>_$rS!Jsvy@lBQN8Nn`1^LpB7!;~?@fdkk2O<=)9Qfc(bMnh-`=3IH%%iO7PU~L zeX5O67V6$zA(9E_UJp0q+adM*<-zr7Fw%95!|GmR5Dv*9=8KKqqg6?t$X;zM+8BnF z#-9<57pmLXPbSYlqYAtiDt4Fa_l&P9)su$en{z`&D_S7qyiu%<(;YwASN}}7P1I-I zt~JDAri{@Jre_@&VSM>wPGkq%d$R{Lx61n%==FF1W?w2?Q_1&JO)7on!lszJumcl^ z)^rb=9x!M&0h)yRy#_1;QmO=$vuS-QT-7QD`j`@Ml<_k5%7a#>xr#uVy9Ve=vjKC@ zvMvs>{P8$>g#qm$O)O-cR-c%U)GCY#*suFJb&z?!ENswg*7u>S@$VSKD*-M5;yz*&~b zrw{MiH?=6pk)H}1%sdt#&U1(uu`X-xR{gVL5F#dy>EeqiH22W+6>43-9z~M~FkA{I zg8%jt2=G6K#p3xcOyMYQwwyuF4uF5N3E*8G_qlN!)!rYvvAtl??lmi?TNzKfVcJ5t2c!9%0dF_g zsXtwS)H^1;ZUT=-8I4>|dg-fzA$ z1Gm1)hmmd7bd2Blw(}aS;4}R}|G?GZ#MKv&;tSaKp+@=^Mq`m3Xm2><#{c8nf`HGY zx-SyIOkvh^*hgaNQOd6j@TrJ-LKwDIPYKq>BDgOSs zfN|e%6+b}lhdd3C(TP$(BF@rEgdig>P^_@UiV^68p|=uuAa}`EhCO7cp_0ae%+HN# z$Ku|^f-$RrAwugbMkI|076X<9cm}*PapiVq{or56DFgUOv&6gT0K|ue+zIUop60rDB;beHnYU0dCd1bj@RNke-8qM2Acby1mb3L!$AphxOP!QF;NFC zQPjQ>YPCj;O&APF$hKxk8@IS4*Z%G7kx~{qZ6%>NhUg!sLkSdM4|1ZQ(C^-ZDD_(B zakn>PfXHbH5RwMRlbb+lk;j9DGgmBXW(X!GFpeB0jzTjIM*!}VT^O!pY;`ZUw=)d^ zrva*jK8I#J7c`axNsZ@8jZe9Wl%kH=Eh5iJ@HM+xuOvBI) z`$jE)baD5dX-Um^rT)_al~R>vf=YieB;1gdTHS@qUo@TiW9B0^A-4FDWRGNwD*WqW_7z_7-CI5B}2 z(JB!0C=l{3*f%T?t1%!-%hiX?N?gn(qcb@&cka%2=6LRm**o-9zv`juT zRTGKLAuml~Fo*e?27?AuY|m5dq*aUvghBN!hV{jCKrJST5#ry;CVF5_!q7~B(@k*EL*C&f01@G0DiCTa#@Z^- zeK84hU=M)stU0g?bd@3Ym98uB2U`g1EAU@q5K2%>5*>3LxttA%vaIj8xsp(=7hNFl zobo?Z5AEo)y4oDVqZEE{SM_j;veJ2|FXx>u@7F~A-s8N;jj4OjQ2LW3EATUpVuhf6 z#mGv<_P6n;yuSX)t6k))RLHgfxMprO|;SRcXZz z43J=C=0#V&=K5|JLkl6KTP{S08YB-EB=}-i2O6ZIfs*_8?5D_hol~05HjjPT|-!!&yz>_Fii~) zHk2dR7*8fE49Ba^3lOGg8#AgYPLEv)%$_qqo#Lz=vTDK)Z?YO~B4&Y4B(Jk0hWUKf zF1UqYW$@myt+~V@wWKv}8-+vA1;FhK|DP5>5O z25jXUgjQ3RlnXvctHK!Tz-H)4r_Uf*OT|IM%l(+f3xu^@DW>2nM)bu@j6<~Y?S0S3 z3|Q-(+A4E<-^cN00OtglPA-AjL#;7JC*;>>?3og3nG~1{L&7p>qBCgrSd4lGFWxce z1(Y_9AWQV?*!(<3%6H57&UFt=v`2%tS1gLnOE%1~U?pr))axNNfoF8<&BQj}#IDZ7p4Y^#7oHU=?8(~1>DUCi6ryDi&cM9Y zl)$i(RM#c08jYFtZ%^QwS4ZwZKJwO(nI+<-SCRa5zYl%=7NBd6d&*P+mY*l>NFxoE z1Rp)KgA-{Qn=x_;jM}h;du%g(7&0A7Swg%rP3mpZL5WsTgOW6biwCjp?(>=*uu&&a zr{Ei(C0d&mz?f?VqNReTAJ%4=#(8IaG17r3eB_yUPZLTclL4v*6m_T?ne&?7=s^2< ztxRgo^?ChF6n`>+7~{BvY|4E7Tm{RlJNGmk3=9dwJR##GMF@Hs7=fc^(W`S&iVTUm z09A8pk#1^HV+*a-fI1)(F7RoQ-g_=Oo>(D77p%g zz?x^CcHH1w4&1Anm5R=l_c;htF=&Zra99efO}eYqzfjB0klxh5R(eB+fD0KI-v_Z$ zR)tXNh`$cMVQr|Dv=AVN#rTlM7@wJmkzRvB!5`Cm0~@=x-VHfe?>@*`bYCouBoZY< z)DXa^lU;4rU8PZg|D3bh@oSadj({Ev+w*IO-=`{8*?I{Uc0BTaJPJJ34}RVVcs`2TI4C<^HD=OC z@cG!Hhr__SOs*P<9+X%oCV@hEl+}q+pogb}gk9VP>&FE5`^&+}`o^o6)w+q3cTub6 zM#m{=W=ecLYoB_67(z2SXh~B@Vd!|_Wu~JWCzC!Ul@q5CpEk$761*}X_%p6Hu=wl# zIrqn@HE%4+1=C(D#u=x=@8H-~TRTL6b88Uc zUn1^47x6xSn|&Tt2|`KuU66$OM$Y5eIU9Sk8c+Y64f2^O$s7@Mj5c_qG17F&2(g_K zbIJXFxyd{JAQK2pLS^$^l8Mz9akVhsI@p`rx)oQ42hzJX*9(giN%3CWf4@*CzLa`< zGel}z84E8D(Ptq<^Y8^2lc9u{H*h99nvl7AfL%p-Z@<2EJoNDr_c1bp+#0`a=@vjV zn}+9pTfM9e2&=wzqoGlb*5tOPP2kmJ+`m3TzVXfeg9U2cIQB~FzRiJLd{!nQNFDIi z+0P*Vp4NRY{TrP3xz9`Hl@G(~)j^r8ULhX6E0w#8rm)FBV{t&{^Xkufd1LPbYrj+t zZvmWKlDv$&AdhvyS1b%qbJ((Alzx#&#dnvW2qmg^zp6J$3 zxhI>6wcW2qCb?)n56@;_?MFYSZ*KWu>D)#`jPf84(4Z5f<{qmC8h3Io{P)+D>Ziwz z=>K}n(AabLsjS@2$6wir6^D@LYCUCE(~qYd%3P*i^MCIdILBK>BP*T^`a#G!$NBQN zoF|QTJ?n9MVSx3_+>r#qx7+#yKaL?4laofQZI~exV0K_Wn5>t5YwkRGJNnh`@4q+s z)#!+G=FS|~EOf0=KF^SJJx|_0R_}+h0f%0ftc^K=1SyE_Y;^*SLXf;(yl_YQIG#G((V(xT7?{GD;HJ960g(1nr4 zSSly7Y}@>$`IL5ME~ReT>fywiQ7UONk7k8Qi8K^xw|etstrgPlyt=m9tk`0Ld&zG> z8}TF3>exTmIt5$53m$UBxWQecdEgpJsqU3o<*K+*>}q?p`sltn>`-mKx$)$AcWlk5 zE4zaA<@2Sve4Re8ngvX{kS%x@A!rxdi zP{ymU)#HJnNV`(AcstB!BhN^#CBFMy}wit!4>705`w&TzLFEAgd*)&UU^?B$z&Ed zDa-M4PL9b4 zk>DPk-i3>2kKaQhNy9`G>B_hyKdZ@jtz=Nissz&Gti|qh_|xBzl}yhCy=EQ2Yx8jp zoF7wznAEJ#8uZQ`U7`g@w3+^@DA}f~TkIh!nB3mgTHrlbhFWhT2SI&9pfk5UHCFPP zIuvQA!>&iOs53Rnd;3^2_JOc-d{X)YN$K=oq}^vMUFRi`jrYx{e)N+IjO8M~{i^+~ zclkPqu=RE`yjjX^7t}a+w=>U&(YP=DLriK$rTn>plU3H|K_l7RhtBqEE2A;5-e@fc zuT?9zaYgQYn&%z=_47jsgBS##muGl0*4kFsIQC6#wfDKZ{v$ef>7QvVx_U*7D+5p( zLuUxtYM23hqpJYARG1s;F4XzI>kcwW844}`zMOD_|BN&X4V=l<` zHF4{cnpX%W?Ki{!vGJ12(u1b2osED-$W1U z=hSe2nbnG4;z{4(lhXf-pE!b2C&ZKI#4|UgpwtPk650G6IYU>u%1imOlNahle}_u# zwQ5+s+DNauYwC;p>Q}5~=%H180`*|E#`~cjtgf+{u2Y2Ww{$(I2b(dhU$AK48)uLZ zZS+~)NYTisY9DIGnmIX{6=axKtXf1@LsO=fHn!GPJ2oDkHaWvK#WOZDBld!Nj-KEC z@nfAdzBu{&JG*$frDwb4^}AIpxtET41O<8aUA<&e(<;3Nz&;TXFE(sKd{E13h>lB0 zTT4V*T4YRImT z$gQl(z4~36R#4@hR5g2CZ5~nm^ar|*RomGGHA@?M`x++KpayBEUzd$zfM#PZtEzJ2Bmtn*eo3`^U%orzT&l(V5x7%AD_M zA<*>dXiNX-!tz+(7}O>me|&`6q*DjiQ@1zMzn^CMyJr@fUjnYrkQak=XlAjo_&?my z!Ifvo>de%OHF|yX;)|X={cDOI?(LoawL>2uNBdC3!%Ncj=>i@4tfqJmt{+kDz+ZX)bJXj4N{$CFkuha_4{`>2}UL=1{Vxh^) zo5v<+Ohf#$*5eMOkyUa2m!GjRH#KoG%g1dxnz+GNHGMuU?=n4 z_X@!C;P0Ui1;5T(&i1GBu_muZo3H)zQ$IK{b+$v7wPuqbRBqk|@y*)h8pD{}bd{6N zu+?wlNX}1Ieq0`JPQKlK^GXOqRfkZ+5T8)hwCBT;XP{pqzQ0l9o|0Vm$=qfjk=cPR zP(f8RM-4GeJw?@oyg@YtvCcd_h@t6VTMN|cm-FRAYe9w!?n25`B=gO|PPCM})2#d& ztmSU31a;|doDA3DZoGonds8P-IZNoWR+P%mB>G$&?IeSsRE=0U{&!O(aAjiTZ%xAv z_tIxnQx#J6c{mc}1~Na!WIXpA(tP#uP~Vl0hrQm<4K!;p%`u-Jq|HM`iK8wc%A6?RC}E*@|>WHElf#!hluNM(*}>L zbP^*mczuROj+fb@m{UoNU@b1ZS8+MP zcYAUlgRk-#4^zoo1rz&n+4hM1D>^LYXBzgF0s3M%24Rg~|3K!j+9E`<*$7s#MjPBQnW!AV?mC`zPjSODR>va98g zz%y%oH#LB8dc;{!1Gyo_B`5#u6$@$s^gJLWSfZbT_&h}7OTiS0Nt2CU;M)vkWSK21`YX7peXH%e1u&DbRlR-gczwbRP1OQ z%hfH8tIZBKedxylY1{c;R>vt=mZ&ef$9 zTrS={@kEAfiHr)UfsrKvJ%T=xF#-B z_U!o-5)$HCGx{n*MeZ{1WrC&V@`&*h@SZTal?g=#5eo73i4la%Se4@LIZ8iY>?k&m z%vU90=g`iNixUc|##LPw3yha3L=!bMwOvvAUix*(h7%ciW}pDDT@plO2y<>UtrxnCdv0Is z>RMo}hpQC4(00=Z=l4sC!ZKzA5=u~Rpeip!O2v+s8x)JmDM8Xi7O+ix+cJbNgk#oT zFug}Wf1HXPwv9txZZh~O(uzqWDBT}J1l+!bVe6(1gCmxJl2qG~=rTL9cvIC(-WLdl z1CaUMuiSRsysH+c84YKaArRf2qyI|Yt_8b_MSdO$19vvMb$^shSv?jXFnYTYzrYFd zIViW|KF5LfvvB&HeM4Re7$GFw^;1#%Va?4<*XVIO6+2Pp@YooJ=lSCTf_mY^Y_>@s zTE5en*@uHrDgN-0vt#?8lUmNQ%TwdLZ!8gwOb^%r*{S#7S+MvR*Gy9p*LGL#BC5HO zo3W)BQ4hUhiz(|*gGWV$$fy#W5-0&-U<3q4Z+~8NBH2&qiEt-1oed-`TPvblrhE(8 zKJ}`PFh?m6m}EROGokl7nBx*>O&p9NcIw!Xqs)Q%j8uok#%LiatkM{Xk9WXEVxZh^ zIm;(jTR|cK$0*rI=;I<;IIsin(C6rPt159mSbW7@A4Rd z5@WAMT`{Xc##8=p3$&==4n+gI48m=(+C;Uk%i0zrRTSZPm+yUio&6AmWyyPJrtT=;Qk@M)`jC_+mx&CJk=92pasZV7=YY@siL z){m;$qb2t+hxR;NorluMt)Ef6ziyco{Jf(MV{V$buJU|3ZuX5>Via^C9|I$kfx(mC z?0xl9wg@k%hL8=$E_zUNb;XWM2}*^b(1_~%QuMNs2>P50#!gh1}Vb}-&$2~VL;bA?nHYWV_TgFUp9s{Spe{og0@QC;IGUsEz=xRZI zc2<#JpN}SS>=%F7?D*VKi*5TRpI(tlN4;|=dD3}UT=PP%#cOXs;Az~El$=Mv@8Fx_ z{Y<_O*;{T22-S^{A-tpGVYizZ2U^~wXIu9Z8hQV({1nf1eX8>wahG#%zmshAZ+I>0 z257NfBj3HE_PyfFQKplj>rmb%U_{z8G${cjJPkkmAw(7!C!s~}x?Et(nbEbYHrh`f zzW_-Q7`Si1_qYzS*s$!E-zjyk{mF{4@4nkSAfteTK($v$K?X=s1^`bmbqp9;7=ZFc zAwa+aAZo!rPH2kc<{KM~5(6WFO6$!<23;-k>&}6fnhMlA2wc8J6ZilW%@NoNc3Ks* zlnRy?*lM(<2Lxb?a-GT{D;u1>(=wTnpgMPSLmEGA5lP1N`RR{NXQnl z*a64~5)<%>`a{q#Vl$|yna2{?3=FVk3HW>$9B~)&IfVLK3Q|-JrJP1+G@%P+0ctc1BBiej-nmPT z1~9P)AB-n;(hyWh1PZuPmBa}j;R@%1^KIV3i4t&CLhvQEh)4>Fh^>tnCxYYOcf^8q z>aqt$;rgKcFdPerJXwf7Cg7W?C)l_Pwjabfa*Hrbj>+AM;+TTImBc_@WuanV(GS0G zz4m%ZvBa&hZ-#-%U_R!$Z^$3xs9K}qkzWM^5vgL}sB(r#%o2 zneqIz!dYVi$le>iPx_{iWG0zpk(y-Xo@6tV^mRDNDm1`B09nhuI(FA!kE^8Rg7DuP{RPEzJdYUX%|BF&#n|3jQD$VYci zxU6miWIMB9+r5l8J*d?+NOot2@YqJYVn!FL>B~3CT*?XH>1=Vy*N^TA&ypm+xO1w% zXG|HUAoZiR!2o<=>=3YxUCcrq6q^^$Dn@Jf=4?C=$)Yv*oijI z6XqDcdJm_2(WArGhK*i^>_LVSA>gFV0;jhUXRrciSe7i{YY(SbKpci@Q3jMKE07MO zo$w=arXb9WeFYPw%Ss%kDg{(02Kad7BMKsFk(Ge7N`iPw47Yf#J%C-1+7hXIG%*i( zNh{a{Iv@oZTd#a>)1lES9 zwEZYoW5zlv5jfCRjA~z~t%WTFC-QN-LeQhM;T~>oq@44tN{qOmwXL8{tD2TrXQRrI6+X^s@$l#?IsnS5w(&G!`XOVj}QnXcCU%w9b zmHpNq{fyvNq!KLm&|t+YN$F_OJf>VR4!dpst#Z6Z2HRHa@NVo5ZICmnpeG^ZS zN9*Wm?|>pw^J3bkcvAwT`KGlyj}n{itvZ1`UaaO(E9F9)kk!ulz0S?@9F|vIFydXi z53PHzEe{^L#$$=cc)OW7JI}0JGCiQ8e;OY&1^LjOG-?ur1U?(BJPytIB@GUa1G5(J z>I?%1%E56?4yJM4HoQ_8*gZHh2Iw8HEojw8r+Z#|Mbcv@xx8+pMDIiz6M3)GN&kk1 z@uat0T8g!zw`_-Sg65ZQMEviGI1f{;*oM3^wl3 zI!@`a{?H#tcA7lL;1pwwT{+d%sOHTd9r2|Hf17A))eL-PoVIMRV z_->ZkFP`yTr6Vzra!?=iRjq@_^bLV|4B~~^;Ds7dGXzA}SNAGBV`vF}(1U_e8^n)q zG!&9g?3qstil;N`7!EsODP&M*?fK9ZdopPJ zw?@BvrGaz?4HzcMSO*US$BZ*Z^-jjO8753M2g{8nb}PnZ_|&*LD}pG-H;BjYWo(`v zCt;qt2;NK~tb-A~r%uDCP{(oLJEt(8rhp{VIQ-Li-cuA6-HqbdIUV-+nXi>& zo!w49TuFDEG$2j;P-M>3_m5OtcWRLVMS!!Y5rVUh+Q_pAtthM|-3GHu4XuaE)1>1- zT3u|>%2~6NQXve|SDAQl4RZ=4^Gf{lD!TJ(-t$loR;zPfXMJ7|qgaluKfpl?`DT7E zS+&`EK}O1izz>nTbb+Zz?cBI16lKxHd(ka((W7(Gi)0>SebMi6(N}j86glPZ-R!2m zqLQ5i0ffC8O9^avf%nQsSBE%Uuz@4zVw&EUm&hhe}{5-i>iT{s#lt7QlwhZj`~oSMnI{?SihEQ zl(x0CcFv4;?WqnZKv&O9uVUAzWYuVP)O5Jd%rC{NuhTlU)5gZu#?$jlblI1R^{;uO zw)MMqxtVsQvvxD1_Je&64o;3e9ZoLZPJVvQtyRuHmR`mQ{i8ok28yasxF z3I~0*mwmH}{34_La$7;rR!Bf_VEz0H3Kv=lsq6?(ON$u1h^!lmI@pY!9f@9_j_c@z zI>b;KZhZ4-e9vma+;j5uXz~&yrLOUB8Kfw^t~0%%FQdITW8vwg1M+<*XJ9^OX)>>> zI&XbGzo{?3tu?=MAis0;Kgu8tg}q}XMLDHYCod4(zVY&bnev_0im{c-ZySHUp&;$01~M?-FtOU071vnN(Ae18xVH^0gS5BTzet?@1OMoo ze`_GmUB8ZAluc;qWBjG`(ccLzqYn?v&JEUszgOmsPQM76WApQ43(HVVbK?36+WwgS z{XG5r4DEf)4)wjrnnx#4S#$2@2HN|WUszr`|Ghjpx;($K^7OpgRJ6K~voZp#$^HHvS2UpFw42WULdgr^2%MUtBJ^C7H<*nOG(6Z0cUX8#4KC@uniVUt5zTKsUG9j1}3i5Mk4yyJ=_`)4%eBQdzakR z|K0>^E@-LrrxnS0_*;vVwagW6V0zM%YO%FlKuaR+Hl~#!DHJLdM34d<{#+BDsm5|> zLI24-e!CeA%bb<7MDH{c)`{|m+1*e5q*+1b6yIXY51<#|&uMx#hp$IPP-fxPl z$u7VR^no{BT2=k@j&?hQiaJDC&F}wV?k$7jZrm> zeDch$H4#PmrM4Eyw-u63gY;mopvZU6r|YcDl9PWP1kEku=m1OY`(E|8A4)Zf81u0;F4OVg#fr zO4BuJX^ z?!aG)?}~!c3@5mr<3^E{Q~2lN;grf(6Xnfe*4ma|vyDKQQunDrKPXU6E4u`;!3&MX zS#LzE_@={IyD9W)xdtdmFKs%hkH@Q;jD;#m@cHee&FtQt`(jAGv2tQ@g8rmij#bk{ z9EoU|mtD;2cHOWN3reGKHDL^G9Z_+Ymee(gcIY_`?{CT1h-{(wb{a4W?tC7zggmw& zYeIkFY;?peaWYZ>M%i5sf=+)tLE` zv6Q=ihntgZ$(8gOSntn$Y^o726#vLrUv(9QfA~`rhrLE9(m|U076XmXZEeQ4?W0zQ2XwBsaV7e!Lw|QS3CG zx;wdg_DM8JJpB=UC;!)Up&-=9k8BWz_7iVhzTDX0et0`+;Vn#l5GMYo;fey+fP?Pt z^B{zeNbuQ@ZT}>EX^`@@pm8OXnca68OVzIc^3j%oZ#Wy*rN4{%?@6%cZ9>{(le!2E zk0hCnC@oa2u$WXAi+i35BRb-u1>(?Ozgq-@zA zJ7n-xrZ5id7m2-EQcPb0aG0ch|KiiO`rB`NE?EXbe)374N3XIG=MhnC3Rp{vpfF@1iQcWC2ZE}6QBP6*0h8$Of;PgB;A@dfE|RP~ku)qVD)gK(0DQeM z@&RM;%Zmy$gMv!m-9P@sRZ#TT5h{sYteYIcE|p^Bcu`5p`Ck~d(%%u&xrEDyD!Yq@ zVUh#LyC6YtG>mbyyC-Fh#Xc}_iugf)ASd?QfLWK27%XtmU zvy-Dln)8XL<*&c+&w?uMqMc=%(uF{1iaSF!rXxlrVBA=yBfd$0as^n;FUVyfpa0_J zF-n4%VVxr&*prXq{M+CJ+E`~s%N>u~RPo%Yc)X?46W_#Gy zt~uFw%>%fqo2sbD7Xn8^*%GHQ@domp%< zWmT*36*W0G$iWwbnq_bqftAnJG!s^2O|;YUR<&{_yH#2%Mz3?qOv6guSJekyFCd&a zg(3%oupCZ!Wgu25siZ8);Gi$=h(!=)Dknw`{su`KX|LIP<`m>dd5jusw&%wQmEGc; z8VNND`1mMAbW4h83J%fHiYU|U+ER7XYtQAKySG2 z0r^x$@Q?c+sU$(FtZ?qVb<|mWxoK1_d?G%`Z_x7k^gegkm2Jf+{WS~{(aVl>EI_9# zT_tM4IsKG8ONWV5ornwuOD8>>L?&hwmG)5h{F+-DaYZ8jh->TpT1ML(oT&0Kv}1A4 zy`nUO(|LXf1*sji6xo-PB5zot|AYXJjG;0dN|@?;P6tCCsrHl6wXL-ZEzJ9c%bkVf zuYtHnx6F${(we{^I(%(wn*7m5NA^xt0v0L1Pdjy8>|I=w;ZVG{c}k{Bau{D4EPp`q zwLwww!}+&31xvNei^qsis zM&bo>&Irt>x*Sc&ZigywVYV)a<_OFj(hwNH;#-$6tBV9pTwHq9-i|^n>`TV?6i_yF zzs#U9MQxZLt>gawLig=U^xHD%x$9kV6PCQ{NV4*yN$9;#?JqF*$`VKLjprL9pOlv? zTYO`Uqn|(d;G8dQVS<`aPAHANJ3I{#es&{Zl}> zjKyN_JJ+XpNe%D?JeO`>_&Iu6r__#W<G`Dj!)E* zk0vbf&e0_OkW!in6+?Qm;JA!B|9*vq;bP9=;p+XE^c%nEh&6)8>;7XFt^~t3#(932 zY#d@(*e}kX#bpr223aTAc}nUmOp0E6`ahDJy&HtCOk!i+byC!b$evmo-|e(f!7-H7 zoAuHm8oY$tnblJ3FCQO=d0!$k;&{b~!yzCdBrkU#lo=NR7ctjT7lxVG_sQMzO#$-Q zXL6fylmpX{d^!)?ahV`|XyE&=-HuFen zV*?m{P_O+FS>zidfXN9JPLXaym)DLz&`m$lkfno)88F<+lfB zfiV&wnCr1v>gFJI*C2Hu=GV&?U4{PqTAqTS0LKP@b#p~vKR^K*;0|>WuMe_{3Gggr zppx_xl6>za;m5?_*;+54Q|Nc|nE3VYc8Fz?`1Kd;MkvV00wWR$(`_7dn*dBt0_rnj zX6=MV`-DcWuyqIfN0S7XZ-q61!-q-2xm>Ya<^XQjB)l#zyw?sgeIJx}-iE#m)vsq% zR0%B)3NyS8v~&&2D+)~*4^{6EO)6p`e(4s+7+%p3>Ad4(`{RJ>-8$?`FC7W2Qprjt~0o?3O4@{6=Idm|`~RZkkl$ASF3o!kc~ zm+Sly`343ii}t9EDjl~KIEykM`BoZ)#{q&-&qqVZVrZGL{Y21=IDiA34220HtV~*R zIZ>d~=Nz=8_ZqRTQWEoz2@tlBXdUxF+M8GrvbY!8Zt1>}G>u>?OH8gJL$;f6_E4~% zsIyR`b7H$I4ThUoay&#E3qBria1(DdAK(2mdOyTi(3x!*tj`#)A{|VBNJ=0gDQI^? zs0w#YLi%Rj!06tXsNILY8}x}4oaD!!WF`eLJBeac_dL{yl68#&#QDV(eTBhQ+y_80 zNK8q|$tgD&X&8|y@MKpQ07nD~U~gLBmQvV=BI=VAQTR<45aJtRqV1UMA(L8XnOX?O ziW9-OR8Ot9#F?fymE1Du9x(1sHZma%M(A=ElN`S{dPTyOtK9H2MKJ6%FtG5_fKdCT z`Sf3*G6V3)w~tN1k5StG38 z_inlNl!zmdhXFGEWH;oLtgYm%zDf`Rk3MR2z$eXo(Sg-lk$Tl=0DvIfy4eE@QSP;^ zX4~VXAgB!PISe`gT@lapb^xOe3gaH&g)Akz6%I#n4kl5$FtS#`R*Gw(7NIPDZx-gP z4;EH-Hu89O5C5kC9xL={%r8(BJdS)da%2=`Ku1LeyFFN=7&Utw!`ujm44Mxx2JrvQ zaKIylT5{W9=7}=n6ElO0PcSe#&>1RFC}D*=b%mZ`pTyds#K3&|6BM2m)FAgFg%v=1 zRzCV89`Xw$R0GTclN97xXb}$w*lZzAZIaS58f1h=f)^m9k3<}|s{3g$+Rh40ESp#D z3|_3&HvpGZ36xZ(fc<2Pg2Rfm28%S9Q9cNu$hD(JlNYq@m3(wBz)ul)<5XOtfyr-d zu152IT!-p&BVEZ#FtcekiB&p6n)^a04s8NMStno3JwMzEhkd1}(Y>fk0In(kM^Fj< zdvOF-;Nl)yEoHh-F<^bzhc`FE8*$(kk<5**I38}oH35{KuyP(u_;z)EP!j;3rILNT z{DT!dSO+CphiRtRu_KUnA_Z^CUDQFgkjNo|=llf*OTm#Wocy*T>MshHVD$^5N|ML% zsuz&&36qs9m8H|g1m#?B-?7w`C;;d@9 zN>F>VYvZj@HQe(PJF5fo>V8&&%(E&s1R8p>8+OCM-X7?3kb+2x?_7JeW8JD3=6)e^ zB!18wA&#azYk*V*8cHQd4cb)7l8ejSR2H6_A}DFmtwib@vh3F!MjDa1*zAh;HcbRT z>VqsQf>%>WXtUXzh=)0B?afN~Ho>W|@}fHCfs@rSQk1mbLH} zu^OkO8k7`(ckem6YrD7Y3Z?^8sgqkajm`tRR_Tn}u|@F5-6Ej{3YM}6G93r!^bi4M zh)3P+j}QR!-~Gn>+jblq*_<^fnN$ejumhfrSP)hR;G7%zjg($q^B*0*urJs|1K_yI zj&^(^8yTGiARgN=o;82hyRC%D#x|I`0VSmktGv|pYjgNZm94oB4JSVO`mPt)>EP1N z4!>?io9Gvv-AY0|s!}}~lpQB-JvyFMk}W+?x?IX$6QSM>YljJX+o@c{l5UOUwp8&> zyD4_>=m4p2XOOc^pOc=IlV^?F-8bdwzM#H7?}%Opz5dna54@aJDUVkD@Imu@j_z>F z@7%O_+dch6K_5pZ@#DF{vD4sqn}Mm&j|B_W@|x5>l2j_#gOWA)Nw5Lxl0k=q{*Ty0 zAJPU_2O9w~O$nF?0(*6uj zS%Qe?h9y@AVJOVQ0sLM57@pu!{4a!Z;-fKOk&Oe!6UR~X(!d&R@V*ckZYR*gc;u9S zbZ&~*63nKe6mEUoGfGFg}UGe(z~M7=sQhv%}JFhg^?gow5>BRaveKPtanx zjE|O6_DwO%EfIQrdQ;q=Hswd~Ccu#2A=Kaw|AN}59=nKuEjvwBQ>(H>V zj!cTKPJ&y&@D9E})D2K(l}7nt0DSNj~O|I>$R&hPD9 zfc{*N*IY>YTv+QIiPPk4DG*rtlY_taJqOSV3GG^~ZQFdliB9%h5SYZ~myEM8u!_FU z3rxMAzqm!iAY4cXd<9I%z*>J^rF09XiC~`pzI zKkdfM<8^$_rH;-S5Soimo69c#|rk5h@@r>(VY~| z!|;fGCt-F!LDW#KKHh!G>a`HnXiD?g?kb(Z+I{$MhKx1lA8V|?)?PiVaZs;w39qXi z%-Oq{=$o!{M=}4GLv;FSKN%fq5jhtr7}u`$xn~=1Ko?*9l2G*YTX_x9j7_neJqalV znGc?ba8@pJ6`}8u_sCR?8B{F&qok|}g&(SXzj(q(GZzpf=@Ua5QLFXgqgEhX2O%7_ zvN8A)VNkkhm^ERTzhLB>f|xBc^^G;n8Zj+d`Z(NUW@YoljrMk0q;^_Hm0GqoT6MPC zc(~h?&f9!nvzZ!lY;SR#7;vLV3cT1^x()R=hxz|*C)~+JlJ>K5F z-bsZBeb3kO(I4Qu-a z8yk+U8;(uSh^_95ZE1}|@E^H3@!f0j(+??SwW$bk47a^OVo_3?VG4&7%v=lgkJS zwKc!`i9em3X?u9+C~tnsYRmKf%hA)5llV_uJJpvQ`V`boO(TNZk*1!}&Y`Ec_WaMp z@#BB8+JA%EzRu~vsV53`W_}JaLxvFa%q%RiYe| zW?Sv%=>8Y(7CHWTPVsi4uEkFrSB0&-YxkeB_`tY?h z+1h_RK9i-KJw?&vZ{cr++${G2H~*m7mAfA*G#TxiSM+EK2S zL3D5eDqZ}SR7rKGI)0+hS#V$+iyl_R01luh}v0mMens( zkL*FqCvZn)>x}uoU#PE6z9y>g{JFk!`|3l5=4Q$J^1ujR+MG;S8u zAG!a=w9IZIQqxl2+x)&g3Wa*Pzk(Sx0on0hTO)-vo$&FLdm8$xk!_v!KP$UCn{WYm zT`(&uy>*%U;N*2hZ}ra0aG3E-?Zz_a=zMCe{@DBXLf7%b-TBXFKQ8{TM8#9|3fBDC z$}0JN4Uld}DL?*twJ3eNk_elm2U|a28L>2c7D4?n=0{3tC?<8)4vJ#%ri#-6-1edq z6|G=vs#5M4^}U^|6!S+K&O-VCj0g9^{LXHv75O?atT_CGnH+vaK2B>UV;HQ2(2|DC zV>^OMvVnN0{LcuO7{zbt1MGPsjM38h>Pt_)(c%K|@QhuMDFDa-x$`dR@h$Q>E&Y$46Y%{K6?S z6Qv}VAa2Jl;K0klOu&wDdCv@D-$Iwa8R++~jVR!DF6z5-aA5DD2%&(5=6~c;jicq- z*xx{1SbF>9LbICMb>!xsbGDE8LHK zn&dTqkr+uB)Vq!@;uqddaMAAgV|$q(xF_t@(g4-An`*kSOkxnD&O}oWCp*RFb1qmm z=y}z7IAB%swN%JU+-O1xmqz%~!_M;zDP_eMXwfRd41~5kJ8UblMIuKq{{jJoLsb%m zu)96qZSu9G@QJ7{M_l@f%(So34$>Rib{KAh2*z`oo+x)x2@bRAJf^*c`QVogJa%%SMG_t^wTnw zq?LU2S5K^}!pBeI5<+<5gHtRZ(JxUGqSTD@s_r#I^CMF{d7i!xGH(0gufKKm#rGiI z#@$)gz}1(!7b#qEr?V%Kb*O}lw%Ymjx}mIzu3;fk+=Q#>hmMJL*r&T;FpP|?1j14( z#0C@{hkgj_dh3bTchRg$3^CbULK`+o$E%|GZpHqVRZ2DkVEeDY77@(n$w3!si`lQJ zfbE*KC7)d6RxuxW8ocnn2Mc%za4xGuOx2~WCfu>#jj;VVMf)z2SBddn+P{Zw)8;F$ z(1iYhiS3*7W051wc?_Y;zHd}47^6)(xFm>oBe0+sG4hcL?bCGFpR$AtnpY_VLvp7ZLOnf*>CNJPHGU_8GLj6c$y3!w2<|)g?zx8m%edjkLrjY@Y(p)tD#9 zSuqHT_i~Q=S`w%3F0vs%m z$$7vwc`Ix4@ouNbrC3|&Kp43Sq*6$K1W6@ele=M2=jwRQpU%6@=UBIb3!Hm#&L}k5yGXlxN4ym;8;W4 zfQ1y8@$^%CT<-Xk$hi0-Z2e#~fT;y2810|tLC<>=maDi|{QcWB`&YN&kL72dRc|Y( z^MWwE6zbab9U~L0d+@bagBddVuw#Z%DO7naEFaF+mZQu9x^c+9)UV=Py}FuK7dkx2 z5ZZ%&yO{n?{kv2!a-SvY=4U3;=H~qh@bif!%b$du(cjBEG#i4@xmL87th`H8Q4(}3 zUUXjDC`;cUS8M>o>$jPA^K9I_p0y7)XzV0D^u%nV9R@c6ZIj;ab{7-T!k>gse6M(T zdbl~V|B8Zh2xh)_(=JqawIt`U<_Vqq~Uj=%uoJn7p?U=dkAGEC`dhLt3Ds;R05xvr| zN+aMFJ>Yc1$xk$h7%vcZr6A29k7XLDX@Mu*<7A8yWbBIPi%eP$3;voN?0HQ>=dMl*?+q7u9*2qeVT+nici+Xl2(tH=ejI+n^@WH_9Py@iC zOzWZ!`lE1tP{ANwRNimrTHh`$pe{SXyAp1{`DnU1u)jh;Z~852L6L=MCgzt~bP%-A z2EFnX3`9hWew8wmr}4mPGoLIy`-SehL;Ypke2 zBcT9Jj#zH~Sjlz~<;MzyizZgcGWLEJ^$l5E`%a|Gx@_)_Eo2_Q+Xpj|BLLGO1}Q6s z#m#KoRYSEtpj-rp6^g7kA5WAOFK>iZJ`Uor2NPAG2tvSCA~?h=@u-z3CE4#dO#o+{ zYO}~Byz2xqjU=@EQAHw{iWs3xFze?Wrh#rrL1X|mjyHWsm^w_Tyx`;*et--(;R6#Y zdIu7{4~nG>j`e)PG$a`XIZ>;Kwva;&YZ5ZqA=pQR{)LQUt};<)A~6w~n&$&njZZc8 zK{KdGZM{jgSqZA>LV@uoM{6gW$Ryav;BaIi6G2gwAgJkZbbUB7jXeSrNXSnX671tf zqoLfm;6+4~84lH$*(Y*{G`p7++Wr~L2u&Y@BOBddCEldPxn)l9r=JWYn9HO%GNlHP z1oM9p#GuJi{w$3#frWI#2RY4{4Nd>nNS;WRq6Ez*W=^*n$n50@u!0lW{o=Y-jn-te z%cc_RG4M%4Q0{iqX5r}TZ*6nVl8)hL|cAnJ4laL6#PLh5&%JA%N(PygrlC@?2~s$w zKsE_9eIHwN(K1IT>hM9C!LZ_k7f-84?>I^ww@X+}OUUlTao;Eb_T?8RDm14;c^HM(0xF10 zlqm8(ifY;N_whrlzC%)>G!)b(37959Z(a&kF6uDzkHRJXBK;&MZuFt(xmNP3Q~|nt;u^JDU0ePR2MD(8~`PLa3Tf z`}qEldWTeM&q)o-^?cD64NB+fLSj4#VD4aDuw*Z_oSK?Vic;4{WO>or45fcd8Yw&jupMa^RqUM+5+098#f+K5O z-PZL1`wfAMw5cIZ~Pict(%pdXj-sZm%`B|hcG@oQsi+AL`QV`XrGMz_t}pm1wJm9;;clNiDjXOS-tyV8F#$q{ zy42?H(Fmca1sG>toziCub`a`y5bJT%0a+&e>w$(z`a&w7{+K;HC^I`61C!JKL;0Q`5;>p5p?A=TN7xR8l=p!0-ypz|3E3Jf6!g4+M_$%GhfhS0`Bph zdbN+)#em;g5md~7(B%vTw<&`^6SgD*Bo*axLSTIj{$Mv7YGv~PPzV^voz|I;*G)_# zN!jgKSlc2FwynyRty&tayW0@7q|L;T&Em9Ud#h94pwq;#v%kM{OtA}m#P#=#>-wTw z>GV_ZR$GIBBt1R9dUmyYMMQY#wE0Fw`2~ggr4>KLZ>#eGv9W6NYNO@rw_A2LeIGFnPSN)^TMnrML{{WLYdDS&} zog;Z&(**_a!u(8lUELEo`EMYH;3s>gO5<}%n_Eg-I!ilyN;^l&24~8K7t2OB5g_IF zhueyr(u%be#ECeZQ)m_s){FKuD>&)>ZTZ!0WqBQAb5FTlX7sV0IPYau$U0B%JUYwd-e0W@%%6f|Qt}mCz!vDQ0Up+Zq+do?0 z-CRGu*%)!$nEJJWFmK;JY>xLnX}3==cQ^L-7B}~P%{}FOM`uqV-)`5z=>@`_bF@5l zba{JpeRVwi;~2qV9^V|F9G{LzpCKU3X`?^W8&5#y&F%R{+WE%8Q{Z>`_hN+qrmyB^ zC*$V)^6B_|cH(w~@qX>k{o(({WFoS++y9=uRb-2}{NH77{}+e$ZKDVA|8i(=cen~a zIke*--8s^+2s|>5slEWJ>}S0j65lR|N`*JAQ$eBOTk-dF(CW3`^wa(J+gqnY?e}`O zY|-M-QF>}%mnkxf<_dl=;|4k&X~PP>jMuIHLdj(MVjt{EpJtqALf7U2u+kRgUEDUvebQ@R0Rr#o9pccz$Jkc!guv@E+Tim51mWS z+y0D>&*)~K_25s7Rt4-bfKg3)%TH4t3zpMQG&@QshfEt58*Z;oyw3c0c4gk_)KK?+ zlks-f>OZTf|Lp@HF4BE7IDHk2XRlZJ-a}uqVNnYicY`!QicBjRk-b@DY1^HDmZEv@ zbK30>_evmlWeQ775)sPc0UMMKqkZ_abRixaEN9%m{!K(`i}ZQsMJ2i+YO*NUynr66 zAC@`5xTs#vmG6j*;sI|HO?)QZw5Jmg zc;rhZ)oHB(149TPF7Pi=(=R0=vxe<-*H?Qxxh#?rjCn%TlDqjyX72F(lrMX`h4DO? zdqsH(dvQ^&VOD#^rJtH|p({p@lEHC!byoY|NK%}}%3Ch?_P@8Iv#`ErtrVjYt;zl} zpfz-lKVJ1KIy~&KamQ+2MUbDq=@p&k;cQ0T z?ktOGL8)a@Zr0X9IFzOAdVlH%+G(!&5BD+6lJ21*bom-8Dy7b<#Don^AJO0!Z|FXQ^s5w?E&P z*r{Ld^N46#Met}q$CB(=*tt#6GYbvP?kUNYpbKop{Zi?1wlr{6t(Yl(QM>ZU;&Co3 z)~pykTg{}{mp9>zrzFDTkIS9Ziod;h3GVgE(7^9`vAaj`1?5Q@UP2V>X34btNA5RZYSvO+U>b`uRX4Lb+)}7wp^C8VoEIB zv-y1qy439sPXBD0sg(&+K}n9@&G@b@s58vI>lz5Ov}08LDIE;ctW;q8txGgX zeVsIEy9Yh8)aT`C=y2?b@`EgeqHzWaVCz`Wj;&0i)BDBYN?|F}L}aT-?G!lxdPOOjX#qQha0U!1=1uK3i^Re)Mz1GyQ|MgXlNsG z0tG8!;-pR+9rP&V&0z22l^NOBR;#=apO$$h{P>IJSj)*j;lx5d= z)0vxRPx~u&n%vNtu$r-oG2-q6gvFv*OyvW%XBPUK?y4|FMMwRRxQ&-nD%fIYEI1PQ zc*K-7L7Y1dalD}rR@KSy4@{M?mxMjc1+Ry+P+~mtox*wMvVo$k(Lt?uYwXqM%yh+) z_}ig0T(M+?+IyC;z$WxJiwRQxwyzmTxCXi2N)Wts1S5n3W~w!u;4iY(si&^X?&C6J z?*C+Og~C_bk4hTau^!vlJDywq^hKurR9UcY4kh0Z@FdiqGQcEnFhABuhtO~x;WQZA z9eE>#PnL=^|iUtJoAZRumgvH!95}{_*8VogH)sKG(vPbD8 zOhdm3#T3uHjenh^YrFRxtC-Ms*o3&N#roYrSXdxnDo(XEh~ZWg88Z(FP&~dtL%kYo z{}B{i57B(;vjo5J`Xw{QU@(M3s{Ip0~^IMh@rPa?wybrc9Llq4SEdlorp`- z_;QjKuZK$Tc)W;p{!Z=*e5#yoFIqNx*1(tMg&t&sYD+qp8UEUC9F7rQYF&a)?EBo zWt3Z~IJs$!-6zo=)nb%*Y)vgR9V^t z$7oyK4F>jk$O5Dnk}FU3C8p&0Z-|5NR&>;YqksQJYp>VEz9?e1e)u;Ib8xH2>fv6) zW2vp8mc?sKgHc@5o~B4oS_RVp0_2dPN!s3s8THlz&AJ4Ayc&6ADKmOWzrF3f#NuiI{X`J5$w zGMui?*Pu0Of#;+y_RBtR37OTePxWPMQW#Chk-yyp|Ni2m2NhFAN7_Klz866xTJ10m zZ(e$JAT*VdQ|6y8c9ZQf>YwAJt{bdtJP13xP+vWC1wjrG~F-4_)67rE(wk@F%Z!v~6hFpAC7tXEjZ_WzeT;6u0&`73k-gJ;0NBS zvU0Pd)b_XJxhvDN&*bU}XN+YiMV#fWB4-Org+J^PD<8DQi~T7hBFq?Dh2nOA;-oX=l! zJMTDpHk{e2%~6QE`k^U%@6`wHYI<3sD|U(Diq9~qXfa`D8{i;2$>2THY+!EA4@~0q zas(kWzyRw;_~;ERMKJ$c4lE)qE*l0Xg*>n^pHGl$NJvu18y0{^%1SAep#t1T^SX+BX_9sLp zJLq%0JBDbew3bJLR;afN@-vQzXD~;m2@X&tpdiV1$=+6F)mO#bAemT=48_}I#<*!q z_Ya|YdtaoorURC85S!C0XCoAP`>3s?sNHK+Dk#!X64D9jw==$Pe?pMajJ_R{ejDsk z5ttLDCydIR)E~G|<-2rGQP-K)G5}#{PH#mv@&%^jt1C)b55TZn!64G)X!7J}mn;(M znWMLPF!z8dOiY`J_++CJvk-}^~PN+ z2=;SFJ^w-ieb2aIEBRYYj)w|{mUx_ratgrN?pOP>278QHdmwBDQ(geG0*OTaZ(ilN zu-^$Lg1}Q(#>~64Y~=F);ufzS8b2~8aL19sD;pGFK=Jl(f&JftF;F4tCS$I4-sW!B zT|3TZa)F)zrkzAwc{|poC1$TmiXRk1@aNmvMXGhlaf;49r%ahB%%2)aBj-tdTNa*9 z1Q`Iu0w&lv(fQ1kthNLxN1Q2+WEoD4#j<2&5QgWq3+$nVC9kh&KHb1FIK#hz6jt$7 zWK6(uS@eTel*6(qW0+-=m}TP1Wg9o?lgX*i`V?kWz(t%C*8<^(L<$3IL{JB~TTHnm zS;oqE(d#c*j$|0E?G@1{71-8sS&Z=yKUGD1ZHr{${IrrT1Y}VJE3lBUXj$^%J{SxX zAlVfpg#TgdXVt6yD*6-Dn##`rxfI0xcJ-B6Q30e%Xt0vXL+ZI;h4ez{3oH&KRiH*z z74k{d_RpH}ZDi-`nB|{#HQKeRsW^uLwQ9E?uQh7^@F%@%4vNCB`B{Ur3B~F#!sc6i z77eRWWC@N3MLg^GO0Cmw#*7zS(AX{bWUQ;OP5!*q2&YyAGaFW7VvGiWHK0~BL@YK$ zq$bga*~+N?7>K-s7)eRw(ZC$El4OG$N7YMw?%K(WkOh{y2yLFPfc*TkN&WEv$*Wq_WIaVdmkZg>Y>&Dw z`_4`uur9)(9f5A<*=w!`^o42N520|iciFdey%WL}U3!MaflLeQeuad_)!vSa-9eny z_xuD|!KS0g)kj>zlkBnPdy6Sy6o}ZW$V;}PN81k@RA`r@+cI4s^AOziDA%1O-|iIA z?kW#}BK{rQ4|;ia`(O|H>UAgy$()%|{^g*jjMdn;4oAMN?-g|f(KJP_81yOAd|wyH zpzL=`>tIhBDlC zg8!EgH^ZhcAYxd-rag}pl^}^T`%W^8@xJz5Las?96Y~gtEqdGfobFvd;E^8SOsJVy!ua6U z_<*74mdYXT^{Q!newRWT9+Je_oHWg$Kh~%fH)Av0qm?AXRpO(Ubdg4U8B66jH(b*g z_I98LTP>6fHIL0$J09q3pWHiOG$x4->RrGOLhCP+O;#sPPUlKZU%W7>9DzP%{;=hE z$LX}>$9UQ14WpDS%#ZvM;XdNS@X>MLxTT#EG^B{^-mZG;!gHCcJUQrCwF48~H?Dn1EilbP!vbT;C#9|K8U8 zLs>cyH|6kDbB6_68w59+&%>1Q2xSBfy9;9t1lfIt9vnD$EyPnFDcT= zK95Bkvban()H_kvtK{C(@mYL zfCteulN$VSQ1SBcQs!`O&1)7naNe6`?g7@Frs8{lXiQ)F>&=e)kCjF0sv%2E)Z&-R zpAIJ!nb{S{hEHE7jSCCKuFg{*w-{F)mAEhT998jY7v<_()N+<(fsj=hu$!vU#z@M* zvN~=&vyVA{it;!;#`9ReV@`Jg#h;zCv0vD6 z9EWF}1lfyoSI8M}n){x`B6CT6KNopCGk<>iI`hKCM>gpMjmuE)D&x;30f(94 zg=Y4tgdv}b;kja%2J5>EHKlX+yi57Eb7#ZzB-l~5%O0=;>&TC2B5!D5j~?Uk3~Bw( zAud;Z{0TMcT%sX4i2ZMstGKq3-vcg(gVKrc*PC*?tBf%c;?LsQW7opK{f1RCq;OUl z;6ax+OQzlJRSZePNI%lqZD;1)3C-o;S#(f;QT8;?%wh7UWx54JNOrl}5IRzI{wFTmLd9l1}G4NARQRWW~TmpTHz!hoE_ zKnKWDVUWaNV`0|R`Z1R8NH`PfIxK+!CqXhvY558_LR2N-}S z6b&66U1kM<_)s+JRY80n2GH_}UcArzV<^+ca!|%)6ov62Y97+XM4N!|!3~1`$d2xI z@~3zsDOpCFLn?V_Mr&>}$pi^BuAV&pQQvz7=p~}Rz6`uEWX3LL+xN287wEwFGy0G{ z`f%`l{$T7OW#s?i;X8ae;^?65A`#`;Z5w`+9pc;I%Ln+z_FuE}pPtXC36|S}PR1TA zCiZe4?hhU*%5bBBsE-HVi2u)r=PtU4pYBqFf^CR*!cJ3AmyJ2 zYT0l2|I=h#2&Y`+FGl=d+&%{(ObIhdj z&}3@(LvQPz?b|%xAjGj z(kYL+nx{$AoK{3B6WG)cQc)jT))P@Z6xG@UYh8f#9>rF)#MTbSPCmp}b*JPNq_j4t zc1)#JK24OSr)Q`4{!X8N%$&T)DzC~pKmMm)=|!nOhn^T`L|xL{^3;`#FSg9A zw;)=QA9byVdq2u^5sY(NQSHoC!874ZtNcYTWwrVuK%ah z7^uFR>%U(+`~L~Z{4dV@|K=;AzIoF~{@*50|4;qyKj<_rnjc~U^?&Mj{|lY|U-ixZ zK7lGF`((E$gzEc+A<$`+67EB6Csk-(zrP-EZNh11U9Hq&YVxi);lrH21c-sWzm5je z-$j#@PW6OM?7J;0mbbQxy+kWW8S+a6X4l!|(1R}_pJyXh7WCRWL3?f{Z!Am9j)Alh zvNq+iE32rm5RZUH^}A|?V3j2}pSZnhyF6-+e^X;AnfQ0jWV{VRZZ2Ru15^7A>hI6a zku_ZGci<>GO59=MXbQ4UKK3g9XmLxl8S}fM&f}BnM&CElXgF`VzrDs%ns1V*>Ow8A zNFWuf>;MvbgBV=XJqOnEjY5tM`^>J&JQ8B%SIr5qAc~M?8Kyagk4^$r{3EJ9O_A7DzN=$KLEb z4|^Z-o&P7Gufg5zLjF*O^PCISLYTDu6nz%DVk2yJDcu^sZNiD zicHQJ1n5`|%km>O-LWm-N!k%{z<27%#n1=uh_Xt!Gv;}H>NeL*CzjmtF>@4{7fnb& zV$5=ox-`Q;u6l$q&*$vA@KY@-dOG$5 z&k}*~tDH})v7Y60V)8VhbQaUb)hyvnrPXO1$BDhT!U6RX!-D&irl~nI$aWL2G&|0x zd^=pZ6ikgU{t z``18un`ys9v_$6065VzAjY!Ycd){=X%p=(=;0&ch=;%+<_zTb^PR3-B3yb+*A`SNM zKc*Ld$KT)We;c0&MOqQH3VwNcYRhq6LVAE+Ro7_qKgfHlu&DdL+n;8J(4hyA?(P(D z=%G^@rCX##LS-0g=%Ks2L%O89I}}N2Bm@yu_Hh61=Xv(^KiJnk*k}La@4=kS^;zq^ z)@${UC6_%$Kk)3Pi!1SSTT@w?+zZ7OwE*FVL%Ab}~CD zaiA5DEI*XjuP*XggO;OB3K?-(4}fSy7SziQW{VeyB&j!*odm=YWp3cG^h7bR4h=>g zAGq13F~n>QD;kP-qhb2M7%4`eifvml+LBwVnt6Rp*Y0vA^W%T;9EY)lFA^U6Fw-gv zO5d9a%BIcRd?WTy!erh^s*Nh*7NW<@ZsB(#mPmhYG&uI+_9EpWIvvKL9#rTdw17V_ zZ_ky&k66+Dl!oLH3zx;!I~6|hD<6@ z>BrGP*rB?4L~`s~i5yWm+Kjib(;Iu>jA(=ccf+CfVMC?htwgj7>atFbcmbQcZ3qTl-D&XX`Y}G6{eI zTS|YdbvAI)XdBb)56>G8+K}8(&LK?d?$~BR^P?!(*o%Zv9O1L*8V=;B_5*(R2Mbhp zApuWaIJf}UF$9LIz5xwxt|v}6rms(tIM;ClZdJ(BYwlTG)faYtAv9zE(YU$8;a*wF zKJflyg~CbHR=*12lN`XfmHHEL`J}$AQ>lX1Ewb12pD^iU-*roG1?~;@eB@Ut54V(y z3gP{-Tibe^VIG9$6L2S8=WRH?h2DNMKCUI2<|55xb)&)$poIelkNCnq{Iu1JVYlDa z0~Ch15H0=vKG73>$-e50C+6iw0ENj@c6DP54Kv`CEC!MM)pinWXq!J!apLO!y?Q^o zLdL@z0;}O(KX*!-mF`)PMZB|!b)xDk<_)U96`?NT%5vR3=9&%RQH~PRM~{6RLs!Yo0^b-FW zPH5(^tnO91gBe7zja>=wRD~|JXdII zm2mBGktTS-23a0k8TSy){SHy|@9-E3t4>*L6tF`=gJWcpJ@Z_vewZ zB3hNbk87qnWO=z@Xu|Y0zB~w}_hC=Smhb;wm!N~B^a6gDY}^ZIKZ)$d5!eVo17O}M z%O=>$#u6Fsyd_3ihwd;rv;GfQ*a6>{&@l4?-}VF9l_=mFcyy@9E?<8+g3k!Mta| zn00VmSvWlsgBK9QwjZp)4nNJ40m@Q?h?yr?n4f}4w0Ce3(?O&@AjRoWr=3u@{m{WT z;(58jxOE}o+F{t}=(HB-*zO?$4(Md`2wDh86v`k>OyhS!X1v5Sejf*TLqz?Oh&fa_ z^cABb)+R80A8$X5s2$t=wkTL1iuh0p_e%}IMMnsVN6@(;UO;IpEkF`r>UW7jF7R+1 zbVU}1h(aTT8PpjsF9Kc~qLGSW-tvxP3GBLQw}+wV&QF|c5ym2pAkz-|S_i=F3B$Dv z;R7QUpb=F@q1QHSrJhWORv)UAX|xRk^c~>u9iqC$L+I$Ef*e4s^fC0iz-Z(LvKf(M zXau8C$PyH^-~eBAc(T49jC~Msvy3F@!BOFd3#EpL0^FnnKGpM>^(vhoG3_H1<{E3)nqL{0{VkX96Z{+rLvxGNeEP z0*se*B!M9l0eTYE^ghz8Rk38I2MdJMO|s;xSQW8B0tgR~{t4lev0ZnL2(EKN2S% zlJFW)kr0S;mk8ABrp&^t&*Z9OUN% z6q@^sv>-r$rlXL`Pn)ectYDbAFb|lcP@aHVL4A}~s2UNgzFKH|Q>c9l)0He5Ff1|{ zO)@qiCQT*<^Dh?3uu)7{n^I;%sVuBCa8x=lz3i2d*)~aO zKmv%&o6cy}w4f|aQcud&q-2}KPSm?Z$4BawpQMOIQWhpr8J?yHW?p_;-^1ZT|nZRIo4s#%jNn)8hEz$%DSm7RR5m7vS#QL!mw zB83fw3Cikvl~6KOs})Jsn(%52%$j!`HLq1_?(AxA(ra$pYJRWQXu;F|Qi+NfdJ@Uj zT9J8RN7k;2)XKAX65es)IkOQ_6O%aCa_H5OJaquCS&AjqO_BVU<5Bd#IUbMP8rfkz zqA^qAaSIYkS`sPivM7?LqPjxzoJ#hZs-?GT@rhc0=R;r>6;(Ad)u}v3)x;lskI09# zs(#MO^Ptj)%&L{G>D$PE)2hzSFJKujD|am3CtK!DS{5x>S=w05k6V|m+H|$qdcCn5 z>aiQ^cgXB>u3B^c)aLwo{-Gn@)9E=g_NH*myL8;=>mn+o>euw~U4GYxs@dRysIch3 zT*dND)!4#=vr&LbgnmUi8+9m0^?yr*q8i&x?LAFv7brucZSbEU==gm5*Cut-g6hA^;?(iXUyX>f z5OIFy0?^G!aI4Rk!1Ya>ct8Gci1?`I=HhXzZ9wk~Wg~*Z{1_<4zBOuah;lw&bI}F^ zs;87jrXcmm5ovB~8xBe|nAB%dev%rZorIONf=mbI86z`J-&nG0ym+KXNB8|sm6#FAM^!CWJM6kV-wvH^6Qr0+vIq$AEiH5Zlpn)osTve1 zrjsu!WyPsXr{m_0n~t0OPE7C$iZmk&KF-$nlQp;CsO1<;Rn40^7U!GhGI&#MVaqO# zR=iFO4d(pPc!%S{V*3RcRn3IMR(aM-Aa;D#CnxI6)!(IPbv^*LuRI@o^7goHfRwI+ zMLohy4mqMn;4;(SAL>FnCMk{1HBR34nRG%_O##5LvO4c-ZZe2Z+$8i(ov1zdNt{z> z==56sT$AFL%K2;tE0p75-T7o@w9ZsW-M!zk(8_9W*^7fjU3(N4DXYOd|0WS%slwFm zRr6w{$iN$zwD~=bD-+;C3Y|dIYr4rDKqUB9UM<+`=NB?9jm99!lUM7ye&Vg3c;sFm z#9J}XpWHUzuzK+YCd+?T;fMvX-ws1Oe~9ml7SUP^LeRS;kB?@%wvW4T?eCfd$0CrY zm#ZhdXQOOl?_M;)%@WNxm>Qn;joWuN&fuEARHeW5HB0%ywe&||@Fm~1)W;5?M*pMF z*3B}eav66?jI!jP;)>2ciadKK&9OpKoD0+-KssTgn<)Yy90dYU=77zS`$f1=Xz(T+ z++lGKCy|}-Ib$VJ*9516h-h8hL`EKMW4-f#Fnc6(7_CQ)qt<56Rq~$HEAh>5IITZsWewzfy-` zt`83@N!G_mabPi;G*O`&D+4$Rw@g<{0~O`EBUQ1OUQfR5(v7mB&j(?1J~u{HWOzlS z4lOFr0G+{Zf@o+CXzU5>qtPH%7s^@rCveI}yhX+MUI}eVkunNR)(u3vdOnG=9NweO z_%wkwRx*-#*!=(pik39Yt@gcv_x|ppW!+b!- zdr>v*3x*43t?+k^n)d`&*;(_pau%f+)bks-QNzXdy!uk2q(ZWT`Z;kPjL5gutoSnf zJ7``iy79f!7WKy7)*d_GzWL>w~9eqyAk^7+m%%&Y#gG@0lmOZl(Of-e)KMa z((5$1*yg=64Rhbhq-HO1E+G$-64&Z%#GLb#N~H#iT*RVXle9(!<{o!sCHTtmtx4l;V^jLMS>6V~zGaxP+Pz?`+Qu`oh0fw_ zR9DD|d057ZaQb(Wk>@T5lV4M+KL%5(v!;#~y;}y*UAi{jAeui9m_3O}A+ek|cKFI) zB?WG=$<1;!q7cx-%J_+F^L?#o)*k+7LD~HgW%3$~dOZ=8D@62*Pj++^(W8`C;{>TQ zZpjT6(#|8q^nyoi&*EHhiuS(EKXcf=Gdj3v?&JMc1BGUWv8Q4ans3T2|482wYDop~ z6z7p-x_s8%ZAm|i;6nzg>oE*@78@Zjs2C-;UiUCmS~ki@e=iTAWoo{6rSPpD$Zod{ zf?+^U$J0`XBEz9lH&(A>9AvnD&k7rWZKhd(S(a*}N>6WRkRLp=-`~B2YkZs4t^1)# zZoZc)s6b!;Lp8whxubf=W3#ey3W9Xt-^%HRA}^k*<&%VcBq+pLfjxl~E= zgu+_0lB77TemeQfW4 z@p+H6oF;a}NJca@_GG=BP-p%`6;90+liUB~<_zSQf0w}WhnaxwZnWY@Sc5EMRZmaR zSO0cykSBi-_{mlfx={xjc&cSkNJbp%L({8lY3lL}rHlC3Cp!c8?l;LoM0i4OfnSW7 ze||byfdvKtL4*vcAzqpw_M6{xoUt#v_W0d{S|k8u00^4HIt;F!AZ{}ph+nMvhQejZ z$^+@QQ1+K6U#a!i0I}8s5fQn`>CaNsZg3qLrE~P9Y5x$SH8id1W8!AVov+A zbU}3cZlY`sJp?wjw+r`NXMFtczS70Q`}wlJb2~`m(>}|(fZ!!0HUCx%?Ft)j{zKoS z*>#cfIG71)>5%~WgKwnuhZ4$m3upU{qtyMD^mqfiY03YdL#g{u%}*Kc5eadYR-3aP z<|4H}CkM?}+lbqv_I)lU2^854Nl0pg{ffzF+Ys-mHlAQD=2wajIPT~KMi_fyw3o`H z*%qLlJ&+fXQ%(G9!+22XTlDRr_dACEk|1EM7zp442ZE`a?O|<0{=H!z_ARBz-MxYF zukGk{O5cdH@%t0(2l5)h*{3n&#Dm##VKU3_+0cCX5T>46AA)-1F=W9M9%R8i@(ptD zDDsqmLje@s?`feQkhuQ!dp?K~_*Ti=u%EEsGY(GJ4&tFgMK+qVAJw};_-~eU2a3sP zZUQmULx<gZ6@U*@E$g;X>Uo-j?79aUvycjOhENfMFdxB@p7{kdLhc7IrE~^@eWd zBcc}_TLK0WbNi6z11b=w$z_jl0?Xu)h)wM|W`iTy^2nt6FtdduJ*+(1#FaF+McW+A z>%mdp`Pk|0 z=g>njBim+73$0&nutyr#8+?B&e1u?rD<^b1985+Wdy^{vt0h+YlIizNEE**e;{bwb zjQs0>1W*b9Tal6>oJ9M?k4KP~L~+CiZlCIyb;T{?bQz@^jBw-Pus7rARl>-^*=7-D zGFFyP>KSx>7qY-tJ)+GJ;q!+$&7L>_))~<#8e7h$?B}I^P$BZ6 z4B`;vHJwiGVoUT=NjtJiTlGl0CQ21^x6ire#a{R@IGBcJlm2Tzt@MDuyfuA!JNmiFF>mvLfDZoOY06@MqfE55jLOqK$<+gIRPIp$Nkiw~$*0=j?~4#a~5# zTQS$o%|1$>1kst*(fF-p~4sEqS<~Lm`m05l+K=ko5IeP6uV=uyLM2 zcpiCqUbau(lXPCXas(|^{zrv;)?4cmjDRo>0X8Z@pJF5rXEG%^l|E%bJYzu9Id8w5 zgp6Z>%x!@YQ65CH5Y_)i*&WdILe;iHl-FAgF->p=U{}K5is7!+pVpuY6{#o`n`GP}5MRll!4>W7- zVM(}PNAo{vhQjUVISZy%_GZp5)@3WGPN`qx$A?~Mepm26BN-?Kj*1<`OpV7jjK_Aa zC4B79Xza^e{+rd-pFjJ(ys@cj`RB*^qvoBvhgiV)!pz~Xe?=_n7=L{Fk81scsvSP) zRn(F#O0Qnuq6&onH=-2hzWezrC^uE?aG}SDi)7Apsh4V%NzHPl_t=TwCrt()b>57r z{RY1Y*Y>YxE$=jI*1q3#e3<%vcMl7M2L*?Oh9SZuBBK!e(MWrqxWuGDt7Owy#SCTs zETt@~0{L8pRP%(iib}82s#mGS4u!Q%&8{^qFCJy8w6*v2hIbe74D}fdbmeJuiga>~ zO^hro>JNbX8VgG^8bxNii*vsg&6O-29vRM&nSDIIxcp(i4qZL@boKks-(_<=`tYIP zjZZ;46jovyV z@Z&d?v_pWZH4aZ4%7Z9XtIhZ9V|8J zE8c8-UYQH9m`;C=<5o!QIZ-&;Yt-nt&^SUnf99*eL)1B$e8VGnlfyw`v+=?_>WcS; zQb?GB=&ZAwWkV{9{F+p7%?4Eh;e9w;l6~7CnO?<wDU`@E)+mwzts1 z$+ymZC-)*cHFb*lef8kUWe{%o;NSOu&`z6G-KTZ(MyYZD44N=>-d#E)0wwVc;wK6h z*}>pbqNzY~yZw7hL;3gYR^EEi4vY*GkK(t&xnp*L9$c)~R3DOz=C@1)oKiDcMAz93 zV*K2G&>&@+gf|`e{HzL;o&v>{V-@WbX8~@d77uF?DrE6r6**YIY=D&AR3leo`e=~f zFZ~EQ_L;zp*NY%~cAI#|;)ECx$IpI}<*miUmUaSr0rqxsg*l%cjrLOC(yp@Q>nyWG zX>#a0ao`{FIPH(#T{)5va;`%&sGBsUAJ zyAPzy?M_Jg&M3XnE27{Zb$LESA9m~>&q=evkIr6F=`l)b%6(KhKHPLgB9bp| z4A!T~+%Z5PKaS=_DEG(_vP5ja{hy3zHa;+RS!CJd#j5P%wV4D zWnAsgjVksPY@eZ?WTQwcJ{9ht{XR;mqLbz#zGBRhTxVXyAOhK*T*gzL@c9#XA2Cq= z2|es9l5azd2uJ@Etr4e}C3-W`?KA}W=DXh|dwnjKss_EVjyn-{!|Cl&?WgrfOpKln z_nBL~zS($M%qwQ|T8sp;EJ>#N6wVWj(Ur{(r13saS=zXW*-M5UH57VWDexUA=9q3g zn(Y8%BZe#WG|2^XLtG_9hiupH_g2+5+a0w{3fc6zP*1^447Doyn+Ax+7vbcP{apsd z+aU5SG@r_5?&0TFx#*Xr$#t# zT7l1%3CCZt#2{@c0`90yOyIB+SB-1ay}ikkQU?beEo^{?#q$W1gnGg@3SZI6<&zfq zC@_i^%7J>Ls_q+ZAGY*8mBxwY ztK1>=UWAUM)#C)V(_A;%NoT<7Vfl%0Trg^5RADkP-a3bv8x{=g2m(;<+hSkn1Ob_Q zQXQzFD7Jmqey4}z4jydIEqsjO_k{hK2OKLCG9FAH53lo*J4B!bb|-lPcBRz5jO9#KWKOCI7}3 z%2l~Z$k)X((jVI8Zgco&ASIHgTZoPxUT;LE#;)71^QIcQL@fgJjTLWE zQ$xG48WqGuMKFys#!M#qQPd3cjPw^XqZSoqC~5}kNnWM(CFw4<08DAWb&Y4mWGC@g*;%{~w=+H%_m z@;b-!t7;xnn9cnKm!~MaMG*>YF>_Mh*z$0wSiV8QEUK&PYyaG#P89#aRXkiKI(nNv zU!roBsG+Zaa+W)tW8)79*^{HL`}>D%<;YOq_{2Y_h&j|9;(<3YH$QcGHT~z$?BNmW z{4l@p0GRlfAMtNu@^1I;&%e*J|KK6EkB-0Jpa8I_7aHoQ@PL6pz0m$aKl~rubJQo? zdziEL|GcrHV`7nU@d=4Z$tkI6=^2?>**P)r+=9ZQ;*!#`@`}o;>YCcR`i~8bP0cN> zZS5VMU7xypdizi#WkbUwqhsU4UK7(Zvvc!F`3q^Ur$W}kyuO5f$=?pz2r_fFTt@LS zmQIqMg9o9T$f3q^&weAS{^T74Id}v(%bT+3UPr zE5EGO)7ryTQUPUN#+C&l~+Tum>hKFxh_{LXR( zwY^%Ar58&h&6{-nBjSMPi-*0x#vS%aUEW}s0~ zGXv8r*8SXIa;N<~1Zza8yHy)_EwzXxepTA0DV!N;*9P80Ius-23I}=+D*nRWwhUtL z?GEsXT55F| zF0GZLO<0r~Ul-O(;NzSCCEaYUuMT6+dq9|@Ym{1O;Pd-|lc+Eb(%>EX6~S98ZVz6D z?-KRK1l5N1d|Wxlg4{fp#Ft~j85EWiIo!XKCdFg@cEv^=nSM+wP`vsv17)ico;I@5 zE2!IPn;m4}ux86+ky48q^`RtLGFoifOFsk>9FmR<8%M_z61TP>1sR$`@7xtqR#NhYn^H!TM6NMbq6 z>9|%)(_cai<7Y{XdrFA^USZd@3qYK{YLQ=Iv!=S&t&RyBL=u{{Qf4+6dN5MAzCHDBQ>g{ zw6M68iJ9&Iudm4ciwx@e@ut>YO)nA8Fjek6wJ)d{w%P2|OmHostwlSUXIv_V@84kQ zB=e&`IfhZ*l$7Z8E7N`oD}hEq*#kRZLA-KzPd9jW*N=~qu`xF_tq;u1X4N-j;pC=( zscH{kA;6|!3ZzVM8;qDrlcm~g8Z2=f1L;#LQFhKLJUS70wU@yZ@E43P*Rx7U zhm;y#3OOD(>kM4qd63I|M1G*Zo}y`<`Zukw?D211yZIH{Fom0EOq^qAOykCaOD)5- zpG(su67tLcg4Ih8ki@7^4HjMTxZ@KN3XS7$OAbb=cbkLZTQ-kh*Y*V)2j>#1XUuSx zP*zQG6GYnI?U|Dsj^%2&aE0~Ty@FZb0w8lBBEZcbIylR)L`Vpj5#(-Ikx)JsveX+nm| zJd9fTGj=6qT4e0o0Y9WN8As3R$z0;t{mMbl;KkD-@7On?8{qEvln%MXMr*p0(#99e zY7LH)MU=vajIS!Y0NtD4)6UyBn>0UJM_e|vi71EB zG_%SUB|@D^H(hpIv38@OF^85^CnYa^Bh<=091Rz^gC#SObUo#cxEmQstKxUE)4WO* zdgX}p_$bE1DODO{s%%{0Ghv4`QUJ{c7VJD}39uFNd*ZXPo? z@s^Wi^`lhQX#Z@+4<${biEl+~U-K7;=WW+pXMp(DGc5n?x|ygk`bv)z1-Hb%C*+6y zQQN?X3=C1UWi?)Jk4Z|?D14%NaL?4#oEvV|-wR%cgo;FMf}xCf=WTF=>~B7Tc2|xO-CZ0|ab# za525*$SV1F`7JE*jl_GOS65;$hFaj_Dh1nf-DX}CKOd>`DWyz=!Kp0r@Y>D;3BRdh z(acK#D2X!?^}5li6J-e@(MMYC-BVTht;A{_!IaD0cH|8kGfxnxHb98EXEQnWd=6ttG5 zXjh9^U{YpJh{*dCdGP?MY;8EXoT&DfK)f9qQcLr<@< z*y1YvHQ||k8d~CyaWa|dDzJy}^JmEv0h>mMG(V9Or#ZxU>ofL}_pEZw{0Oup(ZlvP z(2Qhlx*&%7OZS%7ea-jJd-}@F4E)HWjuO+or*F}g?|Ge8%#srNG@3-oT3ds;UZ97i zz`ka|UEL!yzQiouwXwxMBlSy>lN+nXj}!Ip=j1-q>HOoVa|-MGY4$?{-RD5|{_c@D z%N|CK5BlJQ-!}3y$&}#^X>paSocf2`qS)3gwy!~C?D@a)<~iyIWBm1zXv?2u?uUwV zF@BWfEal34x?9ll4G&M+Z{vUY>*s5w8qn$mgbWt&Q8GkN5`$f8TKU88w|HsE4yOyo z!L`zAMTV`o232|jJ}eq4O)%B#7q4w`^R}M@d<@u%0JQROt6c$YdQ8*`*zrJM*r0`R z4_bkq$#$=PmEL{eLQnud*hi4vDUdq!?kQ;3VjX@-nI|jeH;9s_l&!mQ*9O-WIx~m1)iES=5P;WLDtVsII_$t@qr}{x%LNgPa;}eN zFyKRUFj_(yrSO>(2geQpm+SEEw z6k=()3P(=fC>RzpPjB<@Gzc|e$1b5q8>A)uDM>Oj#xq(;vf$9Slt_+IOtzy8wNFdN z$WL}@O?ve!845^gsgt2j*7vlN!nwB$6yv;)4FU#Y%jv^b9GC21)yThnWn z)2me?YAG`k#4{Rv5ly}seyJI4#$g>R8QmOV@Lsa6I#fTTSBG z%ofli5jQUxGx;=iT?UnLQ&3kZI8^FvP|g1Gka0_!SMTf4)Hcwx@=UjR_y{5+=Sd2wuzTsiM{oTGhYktj*exK+4Y{(e9(e(ZmcqlLv8-E$9$w6X6&k=Au)x3{90i~oqy zF_b9%w;k9wU)Vd2ss^G)s!M0Tm!;)D=+cJfij~{S_V&t-zRJFTAd3_0)rD0krCM|G zz4p&--PYIo%(D9bNY;kdhK`39Uc`2<;ZK%HBe-!KkUJ;e58=L=^t%&Li zcJ(|E7WePF%9^^W3cHVwP$9eCnW?_q_fY7=Fu zcYL}!cY1hg`t0xQj~}yt|2_on7Te~>{+UHtTv^z^UN}5noE~1v4qIxg{%0a(<-hBL zUw&L}qcDmnbmH9V4oVXLOHaIdKqvl37;hauln8JCo~$qYM;@PzcAPJbUCeJ^eE+XY z1}b)Uefysh;oZ{upKTNt@#g>LuGN=% zwX6-T`~#P<5MsfqS8g`)pJJaXmI|_1)<*Q4KwUv^Pt#G@pIqU}lSwu0A1-4OB zJJqLhq4a4AlH^_KoM!-SI-DL44FM4Zq#ir=_a-L~(OQYy_CK@LgA^Ju`+)i-XG1#4 zkB1O{tXHPUtTxW;HTAlNs@HTBl}^a|FJq}f&UQW(LbX#F0)OfE3slLfWq;GETN-aH zk}4Btu=rT=9M)roKk9H>Joy?TDvwX6`EHj-S*g&L>Uk#9%*GTK4z9^%;Z^8dhV$3S zFZgsmtJZ=i~OrL-238$B;c9P1DnFB8iK z44iECSte+H?iyJjSg-fDW4+6~P2NB@z1AVJSy;rHBg~{vP^?DOY_*zzG4ub-R;O5m za(qj*!2s^s;U=SseLy*1yL8Uhq`?4}#a0VzRnY>rc)x4ZY&8sr6D5-U5@~E&TNlZ7 zT+{ZD1>iivlB`67(fKrO7QeXH%1TZLC2N-H>j`3S(v4|zi%l|1_v8FXDm;7c%MayJ zEd-ra>qAv{s`}IT<7=+m8$zo(Ua%p_AFb>Z*FlqSXFh^kO7U*Wk{*RBPGKtEvu)kE~jcRd0IRwqG1^rS+U^L&+Q+3d29PvPOPs zSZiIb7Cw`-lOuV~-7(nK9A{7s{A$qtn%thqs`oMY>(P10B97E{ld_vg zc>0%dI*p;73Guzk%Sox9$Cp!YWTG(Z_DtHTTf9l7ElF4toPXeZYrpFWTFf{5(MRy< z&51GEZQGkPY-Lh}qVUrSeyF);ogxUbYDXhK+qC$ecR_5incwh={Qk$rTFKR` z>J7yq!u~b43P+O6nR7u}p9XH%CUC!7x#dteUJEeDhmW528`LAS^a0>GWQ;xk5BeH4LvV z1iPpXUzikODBPh>M3gAc)5_0am>J2{G(5m#@L2tI!~kYVOMCixxUqW~Be52s$O!eb z9&rY;f_2!7WYZD-=fP}P^~y3PRtzLR=;Zp@kt8;+=wA(+py9@q>N^C+g+hlJDU%g{ zCC$)}%zaG>T}G!qA{&c9b~nlr$1(6wwB0Th2Mh|Ixz(AKR;P^8=`+< zpc$S&-pl2kSIQ@drTIdgRh&;khja51vHMQtvDOTE&hI*gB6d0j#&VV**4+#xEInKz z(ph&u;495u%A5~_9~q5Rn4A=>RfiIFe$dZlVs$1wQd?0B-sqv|s@2flL~6x9Dl8&! zlxr=unJw0DRJHZX;WW^lFE((ace6N*Rtg7|E(UuRtfVAXM=X3iAZ6DLBsE)JeL}&z zRqfO1?AI2;(v~gE@R0}_jm4OhA7=@9e$M44(+CiO+5io}lUf0VMrqxL^2*a{5jgo& z1rt{u0OMc4kvuVQo%tLV===Sqk_Xy#rMhK7ZNxxO7U{i0gXKqGrd zxnV(IKi>nF%1m~)tT#&$PT_TP(siieM+dOyHZLc2zt%V+vb=Cl9km5y3p@7j$x*1Z zrkwL|&G{R!M zV)uL+V^uxJYfcI^AmR+)hbV9nq8W;{w|{Zf^28C5-_O}Frz*xB{Rj&UjSi>ITa7Eq1}woe0}Ew=$`DVE zH^7dEea2g9RuHZC8dRF%PbHKDVPt0a;5l(nA zjgujeZN)Vlw7tL2fsOi;A@o4{cfiTIb8$6?2l$=j=F+cK2Bx(yD1Gt{K8rL=Fsr_l ziw{MznOqr^AmGAo)Xv6hs~C@ln=t3w;^;HsDjnUxy67Dh;|9MH5gUHp!h!N!{T4kX zzwml{+fb7*7}m|CSl8=lbU1k9E863hZp;s;#A*jRW&pGWMP+}nlR!eSjn)6SH9TTY z^lh;4H_3&nQ?ulAb+=Ha&Q^NsnCs0Qw)-$s{d~FQr1sytzG|8DlA{-g#*UQYQ@)y0 zhiAG>Ys*^VHc8YPUK}4jj}F{k^AOBa7W4fP8bY+qmuOyAlnZ0 zDn4ZFh2j+FAKQLsQCu1(7PWr2Gzj;vsX);?z1oHeKW)%s$EzBVD`ad_#s)qLtkj>L z#n(H7gY$iFIJ$|?=kb9qrUP8Y1oB{oc>hKJS8qi|8<^mKePsndU=n~P(!Ed}vb)109Mzg_GDs0^wXx zO{yD+U9!UJUf{D9*^pdKZDksEhPULy-u;6CFMBz38A2jF$Sj__w3c{jH;0%3sHh!W zUQ+nWy>%fB!DA?-j+zZ{9l}=2#j)E6bpwaFFXJjG;{lSvKJ4m+xnX@vVfgm)IQ3d^ zBdwM&r(Z0-Br`!Th+hF~(J=4NULwKaaXu(ASeQ*Mg$y!09TA?n9G(g#3I;{wi$^>b zbiYb+d3mEkG=uwh7lC#iQF{}Sx`+uEp@xI_3BWkIxsjG2++tbmFl>P|MQkj0yeGC% z!#;Rd`ds77Q4>DyWy7pJ5Q3a(Ji?xcI;i7^&H~&K04mG?<1KJYwbdKJ z_R`IE@;Y#RZ^X<#QOg-HZW=&HgpE-f+p-Y*cR3ax5*~XVtBE4GT&T1Nc%2 zg<)#v;(bI0Jl4T)bR+(l%Nen+aS0}#0|OECy3_{t$;HtNiYBpf_})n4S$b?eOH6*s zgbl`o0-^-D4Zzqv5ng_6!hBuASR610f-9$j>*O7Au^jh=h+y&zcvA|>ze2S$(bmM1 zNFXL!Xhc~X9;V$`bpOm&FEuAIZX|K$VhB!Spzwv7^q?5GWY-l8x3uIp!HPpSx(Pib z{EfaM1qf;m$$@FSI2gX>FVkms@p_I)CqDF$G7O^W)EHFYiyq^07vQ0d0dPwrK&GWR zCKCg3sOSkvbJNnxFh=4)u55m)dQ38#bcU&*$!iy=N^BemxagDa;)uiM_PVX?b>m`2 z(>I?pHi81}v{`M;LElUfB$g5qe>@N)l_Q-UmYh|F8b`?#a?9e*MK3hwn6`|xi=#4j ze;IghOG|TMd>58DcLS{C&!~WbTmZ%{;GBz*P`fjn(CHXqflQWe3>0EbwKfxD6C+&$ zgBp^hx`81~kAG{NMGeV))RvVf=xfpP2DRus%}*+tXW=YBgXc|LGo6BOWl&8-FaU|x zkO;;i!l!5@z^Tj4GtT8#O_yiRWk+VpTND5!v#8P1=UWR{(DJ-7@@efsQ%DYaA~_{8 zSw>Y5og=B570E3y{gEWb3I`^dNhTFPmTGO0S$YAlU*?homV-nz~01|ZOxT3$;|~8Qm_@~?lDh<;Xa=StH9YJ?#qJ> zDT0Z-@CGbmDFb~Kwo3F=bKgpW@;TBoB}%*`(~Bgu?Wj2IlDUHMID0JcqqT8b3T4g) zy*#xsbkobMS2GFd3BB4X+Eg(|H`BKAC)?$D!^N>XwfI78%gg)`MNrRCyalT+<%&5D) zZGcH+rE5~74SrA%X#>fvq1|epymG@GDZ*_{u1&N#=%z_#Pnu6(mnBPCQ`|ClKc|V5_9o|cj%8nx zrXc_P()M}|e z7eI8o)b3}JyK2=gyXG#dGNC3Uu7REt?VjJ)-k(1WooxKnk5A%3CXZ&;{)MXno4Xy? zMFm*dox!FjR4CNrC{I+G;>p%?^Y#s)6l1SmBehv~jT1#+g7oQK4|Kj~+bE(V2;@^B zQM1~^-_gs{0n9h5_m&q~7V_qG>B|?F3cjN6^u!Zz(SH&IOta~I>C>yMy#EsBz%GR+L#0PaLSNlcJBLxnxWC>8 z&NJO8HE(XuAb9{<0Zf2mph<8*BeOSPyr22A@V-8&_A!0Jz3wnSv5XkJIX4s@NC?oJ#Oa{ zOHbpf*@O*yyXFQCqQR#YS8eMZARiPmavE!@d)P3{=Gp7xNr^i@qui+vQOXc$Y8B+t$JHII>iH>N=@}!K z4?M;173@8$v&QIg`-Is%V;;aUb5@&XL05V~-+aN~{en@}f=TCs*_VYECksp5of3tg zlyy5^ns>*4206Z8oXH$RO^Is3@v?s|N-F&?-rh2*t$$Jf#0ehUA-EJMZiNrT&Kbo{_kIU95!RjU^NMIPINVS$GVlv}XHFrgS<8X5fiIW@Jo;?}tX zCb>fw_;kJb<(1#bnY_qftUmLpHcqHaS90R#VR3N8ZpxK6^vK(ng`= zCse*vth`n(JXACDRja;!9doX`Q*Wq(?m26QH);n|=!k3UObqCHr|YR1>e+^rh zw$TUwGWclzZxPd|aM@Hu$1FJ2tYXUyd~TjGXgS(%xiDch&}D7=1sayIsVcMe_OZ>( zv8~y0ls9)0G;k^}bk?zT_W0&fFz)8|)h#H+zwd zyr`$5xo2wO-y-I~>om;X;Q1L8fHs^PH`3HT(lPiC1MU9L)coSi)cnjZ$ZY@Qd|d%_ zBj#1aynJ4q?Sv+G7GGYLpgQKOh&i@;^ZQl7TrA#L+Ss_c{Wl41YcBTR_2KR5!2R=I z2bYhB&(FtGUtR+~7ym=b-1`pA_`JfJ_AF8?2Dk^i^1f(n!!|5Koh+xx$aHd8mnfc_;=?lvSa{+B?>A^0c*6)3HFDWgeb zuCYaPx$Q7DG-pqS6FL6V!^Nj0#vcte)}#$aFCq524i~N6>Rbk%O6;zJ;2Y!~P@AeZ zTA%_Y{@($49R`^=mp4IoW4PsB@rxoGtdi@ol|=SGQ!KPoz(Iui24q%#ykdQ;4BqT6)_=MpAVzgE!C~p6Mrz| zbMc*o_p}Ifw3!7;>iDc9FcAOBaEY`6FO zML;*PSAo)@IE^;pr)v2TbU5bh=pTVH`gqOhQ_w$1yR9 zV_~P;Y_@@{2CekhDo&`_L0?g(_E`#{OpFLgFH!0%QP^og8pR5u4IVw92y0=T{T#BP`dG+zVM{eXu{Y)0!d}g-m)U;ndiMcbL_3N8nf= zzx2Vag*6Oe8&Ne4sWh~G5s%U-y6Qq>9s6Cngu3N0s1kcOhA&1mrKNWkE>8klp+IN? zIZ`URk4|eP5?l zq_hGc%a)d(1ZAaqm^98cH_DOdVU_2`~G9_Qv=ch?H?lRVbhV)Ty@%NgvX_zq;cZj3R{M|p17+ULI%ih=-+K@FVo z$Lyl*kC&$_SQJS(hSbAErn?*?&v$PUb8%X-XZ)z~V#P6^;fN?d7@#_!CCMWY6LtHi z)iO0x8AsB~^kEu?1b%_dM`mrUq!Bm>pqV6G$vUi0Z@ma+kIF~4lo=pdkJ7nP#pw(x z#{1+Fh-=e_1cXqn@?7YK+OYo3*^#pRja+6g2~U;jI%mpTL`xOgO!Fc)Vrv}oYSiav9xNPEjfstRWkMtTT`Oa3IeSPXs! zf+*(^03s*77z%vpprDeYpOUv-NZ+|R6cvY6Oi1H+e~OOFhCM&srcg*a49XwH;gsSH zqrw{noaM@;*E&RSr343Akrr~PB4QjAa})s-hWHjTGQRkATr9v~b3*rguf4Pitz<$4 z6KOMUlGD6ZBzDrE)oo6UE?SvGFJ|<&2`G{rJl|Cj!_{ailH}PX%?RIQB%x>YGg@i_ zG%fPw>ybVeb8a!SSTIb~ZmSjk*0o{lb0H_vD*WV&SY?d(E~{V}|Gj*%nn2~L)|A0b z>74<#L1KbV357X!tT7T7ZG7_7-6-e^4@sDGA2Eu_El@7I3T_33kW$L=Z8cLcC5~y7 z5d_>+Z6qKfsOk;m$uMVjEB0|Yy(4;gRxiJ-Od{U9GMetVf>8#}Q zQj+6Do<9P*2t26_IDjzA_|a{!NwaVGEn^(% zkXCyP`D&}8+IS=vL`>H^ABabj^R0B*YWcx!vz%e{_I7_eLgHiR{9)r^z3kY?nU5B| z7lKFZT(V6qmXPIVO1d$|lLHguNd4o}yT`Sen(!)b3#CzVvz3nzP4Wu2(@E`e@A?ST z6YPWz(9#|^S$f5)@~7;ru8Y>1-~Gte&p%Ptf2`1TW{R6MpsiPQcf}Lifd=0#JL9Mw!?Aw zvy6n{5Olg=furrqEz`G1WV=7`fFi4Oy|;Lbg>fJ&%_-5`z zjeHI}yZInMtLg9vjUq9ly7{e9W(5a-81P%abIZ5h$YnwZth=IU4l|Eik1v08344KB z;9xSmTukw_&b4AY)DMi}RTA0PD*knDGbj7|`Py+r*KIR*dA-<>nieJT7F-{E)q1RN(gfy=MJ4G<=y|e7E=9fA#tPI`O?= z_!g#ue9M5yp%cifgUkct<^+Z_?+p~51@IetAhx>e6u4!zc)q>$#2Tf`rUuHZz}=dw zB=`h%&5&M6-@ zG6)vGFQAbRCTleOBGvUB7@l_4yJ*zAuhb(-8tLn5XtW5lH69k69JI(6**NOA68Lqk zR9<`4rNsTqz`R-)e>kH~I8c>OtI^kQ#2R!5C!yjR_9x2F(g&+IwDKOQp%+1iFQ{wD zd445&Yt(PGB}la%J*m}7MLLSH@8erP*h(pfQ5V-l(hHnR-9-346ioykNQJjfUZQx=v97>^?mk4GGjXN>R#28m=XbcHCM2PTql z&iQ%OtsW3}sA0*Np1|CekU5X0lZcJ@ncmJ14tF-@SD2Xy1c*c<4lBSf8lV}=FAGq$*e&)wAo$F{=TKW>FL{RICySEKo)*NE7W_Fa zJ}xZ@2JJ_Pn^37Ak3}T$NlIzGFs@0mQ9!C6gIV>mvC)NedK_W_6HlRThNf{w$ry$3 zNm_bKqRr=orDloKdmJ54ibMQ%kzB=; z@J?4b(KDujiM~b!6@vpUvpjV?%*m-4{ihnh#*%R#QjXf-huU<3lCF|-fWkMC?i_RG zjF=zW>Z)DHn@zljS_DQxSIw*_N!DFUUbzP7f-`g3lf}%CJzDWcPk)x-dj+#^Bm$T#8Gm1>uh@YJ5-#Ke1BF8{0)rdessY|MXN`jQcj=_p~_b@l;GVa~*nA?^z6T zaH&swDIYuHR2?#BFHDdekYW}?3Rp%Df+K*;VuUgS>1Q$YfhBD+WXcyrJ|G%%M~3k> zQmso}`@Rx8In<(E)cW0oG6HyxUbw0Uxax##R51tiy@MM?c$DmAqP(ZtbZCWONgk=*e&Cn z#n2O}mEEl!j;N#|t>-odqx7YeLI^T-C4lQHG=NJm$Q}6E&q@j9T{8~@zU3#%i86$D z;KA|Azt(W9m56F@nxrr4Mz*TzQ#mMsM$7Np{xUplY$>>)_iyZ3C2E>Fe>kubu z8Gke~bkr(jRt{B^ar|hWgssMVgQIWu&im46zFgdUg3jKnd1zi{J-(4zq-CqO(IK-E z$+1l9M>G6h)kp6HS9$YTE)M>p3)0qjksqssS%LiMQqAjvf<`3>(Ng081({wEpIpc~#mCW|!ck!<*^!rY;9mPQ}#C{ivh5J@tCYf`S?s+Tfr0OaF) z&V@v?3-?%AoTsA5iB3Ls_?6O9CAC*z=g<4n!9M<~0X3hfd{Q~HqZT)JuXFDJ)lGf% zr=i2slzDlB?}yz7E(4Z96=?DJft3tAn##cdYqcdl(+KTF8r3hdU4jN-jx6u}KZ%+? z#J;orV3*bF71i4(6~YA37)|**6r&K=@i>|==^igMmNF?GB@~z1Ii_ncmSsC;@-$Y! zLYFTzUh+g!%o3IEGah3wZoLkwoE)#-AOG8o;r2NvT4$)fb2O9%CnD=T>YPP~P)}o( zARVrdMG>$B*lf5gFd&pYG>PMW#i&f!pQz%f*iT#cH2Gy|0yJm0F+3GZHYLh1t*$T) zte-kQAKqqxCVEFYIk}|KxUOxvSc+(^P*dJsN3K3iUtxccKbyJEq?B4f@dzA;`w2?$ zm^2B)#&~9+Ngm|v3`55I@E3O0qS69)VR9>LHl6B2BVIEChH`|+>{|H?X29uT~sk%{@b@c_{oMXAUAYC*iza5bK>mm)S zr2G~}9Ej?Mdj6hckaUO+`%y&v&C>qnLfq&aIC1r2=<(cXz@~^5F!j6QtpjE!MQ>ZD43dYeaU*(5wkIU77I7*Ii7u5iE*54VFE;?jd~NJq+JH%$z-vm~FD{ zz1ZhH(EI%}GU)()FA14_xawhi>^kOOyQ1>I(Wm_mbUMGvY3>(-o~#3ut^=W8Gw)vx zevloC86Hac9?Ik#%5@*6iXJLVlPiRAN)C?BsvKz<9%a}ZA(S7b4IEjz9c6Ve82+*` z^G(s|b_jMo79&rvHVnG>Om0Cz|6f=JeHa!*7$lf=*aDak4EsiUzrHsbn*55Yf=WhE zZC5HOT+Yx$q4=jl<&{$Yo?6Yddi|?_tDiM)n3V>Nky?!ne9q{#$;@%BTy?7`d5w$4 zCk7@a2KICYg+V*zjiL2R&{$|Bcr@~K2P&jScXhct-d6{e-{1*&yW%}+Gs%gH~51|U?>D|W7 z&E~~3RHlRqlu%vrU*XE@^M47E|7Jn_|DTtHRu}dE2Oc6^EBb#|7xQvN0>z4g3WGI^ z17w5CGGg=ptGd`AQX5*?KoZ~EG4xM$F|fa9>b1JKv|O&Wwvs**wv{rYnK4+taeQ)m z7AHxiFDE7Zy`lQ*_U_Mpo3aEc53xSo)xR`PQT;lY2d+7`xfUrb((rfx3T3t!gH5F{ z3rAu>;;77s67ZPvgYA-d{|aS_8jfel{y(fOB*tirH+~+{6gy2HcbzX^syq{9Doe%qf}_pup@24m}s z*jhR6v&N#BIGpQn9!x}Vz;D@r~&T+7iY0?ZPfhb|*QM*_5DK-S-gv6|L#64jyI!yWC2#?#@5g zNxcVy)T0_;42bP}4|uOsV3 zs=B9$*r^%yTcmKMI2p`z6iC7$6O)mSAjOz@qEZQ8ahxWO+M%9`2o)e%ZN0=ag~Cv_ zgjV0TZ3tn+Af1-lm_RJ(jU}9J439LZAX!baf+-9k_-Pgpt`ArT(b#vF6Q;NhGpPi~ z+@4K?$bdLA1ndAkBO$|t`vFu|GCjtUH|#Q}so_#>l!dw#UZ3a^yilz20sw*)QYweD z+BN7eaquO9t9ox3Yr5O5>W0Or&x%+OG!!aE2~Mr*S0&`DsVA5#84DKV(4hD}HJigG zD^vNy)@|Pj+6vtAOy)M_=%Dc&pN!0!OpA7#!|sO+l;1r=GbvZGnakgvcs>Rr!Q>?uV^)t_xycy9Te&r5dhk{%3T03x2T zTobLInWR}yoHV8iOUwNOt*+mEtxvP-W;)w4696q%KqR94^tlm;W77_z;Qm|xzA0i$Mm4r$l3ID{~;YSHX zVeD?MxoI5G6T-O!BOG?#ZV0c+?w?M&U<$cD=MxeM_??Atf=_2WslEEJrIs+H`?E+( zC^{|az$I*aO45ZY+p;P=T(H14M>iijzsiF6`TJJW|L1X1^x%NYL^F%0k&;~f?VbF`+B zUKu=I@=G1dyu8YsPKy$H%RbZZ*UNsh34?ua6~rcNf)?um_u=oUbO{+(wzRqk3|#MY z?in3Q7m*~I7`s2R&P@R!9lj*%IE<)>2$0xH1{()kEtSa>f4?^t274TxmzUc){aU00 zNfd#^)*qICib<(O1=f8Q1Q!Knl2sfBB!aoqF?9~9-A6}R0k=T(H5wI^IX_kj;|e8+ z1-+_27mi6)NR)IJ(&(_l|M<~q$qrThc$&8v*z+GC2lOlQ29G~y+SYjDVl96p5eX+)<&M$5CQXvqN^IE^* zi<9pF%coxnZIkIxJj6i7@eMb8ij9h|{O(+~p(j zD4G+xafo8B1vWxI=%w42zYRAfe5tl+x@=!Dc;o>`)1RC4RILto6V)f4*?~p5NC~~p z2Sb=1&vk8$2k0)6U$`~P$P_v@Qof5e|1B+7p2ONaK}v41Tl(Po#^GCIg?*FwrLjVB zFZ`QGQ53o29*p}bc;;EyZcUMkxT&{0cf1;-8sPe@Gprrpx7IH5m>yM0(y;57!Q$`E zVwX;>D#dDlQ2Ed8F6CzXN=#L7g zb1UVJb?Eu4x#Rh#Lu|)p6YxKksF(i+XN02K)-(F{F{`Qb1WfXV%=5{c@hhnd7#Rte zhY2KZ2xT37FtCFjNhQ9zOXi$N7N1K=$x3Bx$jWI#aT^M{=87ThidEN2rRU0xe^rYP zRO{~4YHrjU9yA6zG=}>$#``t(%`|)3w9I_9-Q2X(XLQ80bbJeS!>e`c?p~t@1{Toh zf&SExVfmp^LX1&ChKY%ViD#@?R3kKcU^X>kzBKjegU+XcZp)(C&sMgdYxX~Pwb@J# z*?w`ctJ<(znzYaA`Et175S-vBYwlP)ev*N<9>(bTgT3+ZnGv?M%<<@uW z<^9#CZ2D_s!`I_2Utj-kYIfi9x&s1&gJwoULc&7}N<(`N!%nuL=jMox)|l9YnE1q) zrpB1L(fIo5goLDos=kzz^pwN3Om(-+%&g4D_RQI-?4ZQ#gVmgz{G7akyutogsK@O^ zQQJ^)V@FA8dCAOFS!!Em%I+F4Nf-uWHy&pwk#~S8b!6Ww6|?ekf8!OZo|{MO<8^YiOreQHNn^N8Rf2 z#rpEv`o_k_^y0?W-o^`L^YHuT_g`Ckhg(0cwp%N9Mh13vcXrnX_UAM9PfreJ*A6az zA5MoHZf+hze{OD%eqJ9zAjkXL$0y&9zyCVEemI@9Kik?r+n;%zX!~`2e*fqE`Q_)) z(a+PPpSKUccFTSp_WZiM`F-*0a#H?sYw2os@apKt&5z$VH@COD@wZT{`Sp*xhsQrt z0)Nks9wr$dpqTUHtH;abr=K@ZccafY*Dt$HFAvR-gC)rMBjmmY^1K6i{t0=$`LD+e zXyTyu7U}`z^#uZOnGHt4|1Y-Ah80?B%H|6HsYF4y&I)rf<&v#5OSKaN#50;IS89!` z<;dlmt8^R07AiizyTUH=bw(0McP>FA{h(Rl@}1BoGOb%5X{nkz1btWM$Fas3e7Sv& zK=u>TT}LvQP|uep*HirO`o3uPwTGwpCp2abujsh#favO1HrobwQmN4vYi~sr&3WnD zowkB>>}9%O55oR053XMDg29pGwvN`&?yJi4YF+4zwcCuALjk zt=Q)CKejEH5|S#~{pCIw{%T5}E7-)TKbnPojRS^Z(0O0FPO(hh3{3iAU5TkM-1PC` zTE!8W$has4X%l_?d!#}_JD?e#X?DYUGD1ueaTkJ1%!UllescOr*Fe+bE=?q}xY@{T zI({yMNGfkRhlqea9ZCceCK@Mj%qK)Mcjj0a17Yz>4U4obx?)&*v$_rYc!El`G4nq9 zN3aRF6qtB>a8R#{Bqe>?5rt*eoe%Uptp^!>$?IPu#qbS3@@y|^&C7@5z>Q=JM{1`} zY-g7)b@IUxH!A*eG{Tgg?IU18Q8vo}^7Se~Rd-wcxF_M}O9a7Qvvd}S546_r1+RIY z5FLZ;`#py%Qzl*FBRw@c$A(z~T_Py5@~RlE0+8seiz`@E!+tgs2p?4Q?vf1I85fYR z47as@bd-z@#ve0{n`5~rWEMy(AtqflSO`aTTK`PqhR62i2=sIeEB@^P4t>18dP$nK z1t{&az!l@5ioybBtdD42ohQPGwqZN18*Q-7D(kL$I@{%;4kc3z#ti8^9*@l#P{^me zRA6?UN)iIyKQS@4^=}nUR{RPo*rQ;C61pAovO0IzubQ zV6cj-=3Y?3GA9hT++7NfD-$Nr**w7u-^O<;cbW=a^M}9{6Io1i0D13Z#m!d37;5aT30DUS9#PL0y`b!4r^?^Mi#||3RRT=Fk zX#Xd1aGDgPg7GP>e!h^gkxN6xlwe#}atwk=6e$fV2}MSiWblKHp!yV~TM?EbQzG4u zGmgw~l_tTw?T@7vR}jo}W4O<2)%S1@#F3LYXwvAD=$?gB6?QQr2@e~V{RpJ4n-w2> z0%CmUnT?=ZlqE1qjZpC8h+3#5#;m?&%t;?m{ZOb&Q%yIPQD>WQS2^l0)=K#Sjx#RI zXNtU!cRU-YB$o4Z2){QFtM#ikDL<-MLIXvP1vAj^HxURmo(j#2OoFm^GxW{lA2b1k zLVv7u)0J&)X1-|#5$VpgDQ3Je=e+%dTip_t9q|bm)OySZ?-AMuzkY?qJ~HI=P`;$S zXb*t1Z<#3~0WCIRU>1jJnUxkf8Xknv6t65SFz?gVi6dwmTOcwNaG_*sZ<sSw%$fE7}NFD0fDzWq^2wE_JyXmB@EAD_XUq*pkZ)B6h}A z%2d0CX((?ULN$_2qAU8H9Ca*$&40VBjC*0lA$i)$AHq)i)9z>OYrspF!z~T6H50`w zvFvL^vN|xb`)d^ysP>KEeuNx55q6vxi^^5%xT(N5H8xe*a;Gf~2#Di~JO*<$_Sc25 z0_k9EsV8(c7XMt_HTL1N*|t+fj9C{jMo%zP?W>^4Ho~?$Xy-S=jkI%*#riXSW#eZ8^-TE6U)@r!XjE$CB=``hC8y61*O(k zCsTf-10DKf`jE|!O@BZ}k%u`md>&PbTJdzhwXq(%-E!|Oo3X4=8ON8i-tu1Ee&(&LK z?+=zyW&9BNdw<${XTo#AG=muedK_YKDSyihksrpNVXHlE(JPHMse=9OzCCX5VY*3A za;*DeZERg&-b3?_$jCywy8z`@=$a=Sj*5S8FfZjGqW!)+yimi+^erN9%|*o-RU{RYz?k(*53c2nGNi|f}J5fmN{vjS8Th{;NzLjfkV^%eXF(evq@QfHUG%5|&@@fHV# z9VeP{$b*ZjBH(FHnHUn|$H2l#pldorLu zs#%zJj{6t>?LRNwosw@Pc?uc?P=LU8l3w6WXb)fe1=T8eno`rGQg%fT?7KRC6XAigl>GU<> zHQhO@k6^#G3J5eqhGmCQlY!CD2}V$XrFRJAWk)d3fitv%Hzo=(mGMW)Ly+r5wDbtk z0YMSxsCiAQTS-A`EkO$RUarW&>Q=#;VZnT12$3LwJ3AsTJK`smun?;-^*lHv5R4=Y z(p$)Gn6U~%s0b`BV}KZ)JA;;n@Ug2)8MY!o*&{8qU^J9&H#E!vS=<=@lS4$+YJ_zh zd}J%k=Zmn|QG^H(LNb3qhD5;qN_eALXw4o~dzeK&V}!a)L`fM^IX{B>Y}E8=l)#05 zp;=|x<;0nK z@CoA1Zm7nY_XM^BOt=I5NtifdAh&d_L^R~qk6VY{|8PUbvT;qb>LDhYfA$i_|Jn)m zW=)~s&UgwdmJ?IL@xNT_rKg!PYUSRi=aMaEN;qScg3y1?0xd@zBSJH8OEQ1_#rY|a z#MU586%N6lP7i^@hXXpe@PjqRLW z;9_)sklVgw1}~R~n31es8s6oABD7xk-b-P3AN9RpQ8Tbe{Go6PWGSb^E%H}po;&?L zY#}Z)dTE?3LMp7JWg%Zi=679$v{1H&Mve}}E`DrbsAu+J-UKIIWX!T1Tr*qjCV zFfjZLqHqdGs^C+{B2fu!|FVFX714n8Ad>UbIKPD*9X7(T5C%cS*n3g0dQmS;InG;9 zuN)c#+J30kQ$fo5US1$r!QBgA>{XGzUcF6%Q1npo=Q4#=u(Ac(UKSLexs4Oj| zejFqk7{_KQRA_)#xQnwwn8Q32DGrYS&g`N9N$ZM1b$IXU=xGU(#^HG`;J3!>q`?SU z>^1Ve6(2<4nZO8oV1%=X3d-4fmWz7U9~EGdED19%GKhKlTsYlVI>mN(E;r2M#DSK;n)|;MaatsK;HglUS-Bcdcf2rT*=#pvD@2`D71SYm6i9kiBUALfUqwSFX2FU0Ko5 z*;<54?UgTrwxn&C5609jmZP3x8L->nsL;_a@ zUC6U8u_EaMlEK+oS47(MrH;1{J~p|!86l?_P@FM*5A5l2H-;|Ct9~lYUqo|>L*f(~ z;PL@T`6F{@4Y=f`)c^+s$p#8wiZ6cjOBf7_*$!fx=gOh$$d7gryZYeX0*8kNWekS6 z^xcP#nfy|fD@G`_>nlAQD`AsWWEYvjuUNFQhP6BOme{F!X@<=dQ1}iiS%Z__;M2jW zDI0DwS#OTm7&J`a4F}|-a$B%kN-+DvNxDERc&GwF5*ow4oj`>{!K6<1WS_A#1)j#^ zK^uP&Q&Lx^mO+!bcMj^~h7RLpS>xqd$n7ifXy@ZBBx8yO3=?9b_SjW2f0Mp45c!Gs z<`0h5+ge2X(-}%iWCSRWbaD~FP1gBPVtjJM9n$PYW)mZxEGnWa?kDO%_dvNNde5CY z+4*6fL8AMyM`qbLqTKyt>0?12^7N;#wd|j}^{196S^vxn1;@`kunc#8m@`7o|XZIGvoZ-t~bh34?4rugwPZ@kTsno;wOzxtT?F_O)sBO9Fo z&53{7{vn-Py3O7wAMUQ2XU{g`5MD@z;7|V%*Nvjk8hiwkbaocPIee_Zr4 zpmcZia@jNlAq+ow5jMsrHGE#w==x}xxJAidWZ)&(?|sYZm8?E3ynY_k1N}3)im?pt$AU z;D<3UHr&aH9G8!p;j;=$xahUe&-)eE50<~Ukj<_D)lr?W=z6#^pV0q}CAoxZw~pM~ z>h;>6>(fFG{7A&kev`X>wh#Gyh-%VI4a!lSqww>HnReL6aYL2TbJQ+ggS(M<$qP*4 zqO=EG@3|J!1n>t95_lFE(loTvAU7Mv$)oO^;13pDtngaU9pc%khV&uXmTGZegbXDM z9!2nyKaPhZx_a3DW~@^D2d znM)y>ItYCAR5w=MNR}nc-I-(hsc-v30wT?O%=^C{B#u6*w85yxT*O1clp5wOe7V zy1kqb?4jxa5I96EAG8fXkOqTkUK1~5uLM`X)WszFPg~ugTtBvxLI=1tW(1}!^NEp8 z=vEXWhDj_zC!_G!K5vuM?(bJf2+;XjF%S;yz1i5w+_d&=iHhIDi5>>VEO6?3@3tlQ z4%OQiZ{x=ap?ALl2cEyQNQ415S%>WJdnH<>hFIkUVsUk6U6xZp>a zzeQ%Lt!jV9#E>NS39aDny~J+0Oq^cYC;l|bQr##|?zux;aHGVSZ9&x9v-A$GjF01U zYn_K#5E4Q0HP{(54Bw4(@?*aW?+xv$CVb{8mq)|Ei)c#Rs^}+<>L(XP@%bJxdGA{b z|MO*K0`)(fwve0UBAYv@o-e5D;XA*dXzL!2-!6z>{!L21`*ZeUt?YRE0dn@%;pTVN zEv3Vso|nJ1*b_UG*rAZ;5B$2ebRu@l8GlFL4O)qJ>YndF_&VNgvw&WviAr_E0D|FaV73Bv*hg8;J$ZKs9^ z$QjGZYRCq4=zJ^IO^g2+-C*JwXE8Nwm78HzH1|2Z+pcQULDt+MIMKOi%DK1GwWG;( zX51~I%&oTEyKFijASfgxB7A-{CN>^wt|TNRCeDr~r=-8SDNrjVFfn&%pr~!QWO}kR zI-@*2uVQJga%kuuE?hs@BED zSF_~&$nMq9+3Bkz0%gg~FHIgF zy*eUmThncQv$xlC=g+T>$iG=~=Rf{&MD|brWrS?Lx*)%=HXi=`PcH=ObQ~Rjf3-TU z?_S-GvtK8B)35f%(aEdB0kt=v#>VB%#ctunVej?f_kYX`sFU&V^e^|~^6C7)&58fj zk%T6dJpV^hDcaK|*5x0_y6e9o>v{PF1p#q^C8Y_$WyQr+aaBPTmDP!r4b`zN>Hk31 zTVwu{R2r*;Le}Tv1Ve~CS@7{i0!chq0`W=6>OJvScLFw7mJW}DH@5;#0*Fk5evxe4 z&Og7*4!-=SotZflXBjgsKoCA{F_tJv)+Kb=nLYqrq;D3x;Wy+q4;kqHvIJW8Zl%tj zNM$!;%WOTRl@ispHO(vwq#yQ>Lmj#hV9c2;WaB7u(Vod1P8K}PCiPS=p0<|SQ5|*g# zx8vPn5dV>hlt0<)N-F$Z-Jl}9-vvCDXx}Y~WMR13iqJApDp_#S-|8Tm|JY;nJ%>(Q zztwH$D3%e?`H_C`fE|4iBu0Vv>@bu*KMtNSMe%u>OF*kRgVN zD!4)ZM$StiTNlnG6_baezg&=;$x+8VSF1unUbHGNr#L`WuMoFt_qhC{WHad#6_s+dFxwm?4^g`!ql6iIhmm?ZkXD8T78wId zBdy1$O5UZ*%|*H$Y3O|>CTOy9J~z>=ZuA}x{|(YETL@B#lI8tfDty`T%dCikY^H5O z6KSyX;MbeW!KfRXFi6fOO9+S5@AU|5V+1ZQ$8tU=lN)*C?66|``%NSa@G*SJEm&~{B&n#+aS*V9Z=T$bU90fBX%hP#z2dDgtY}uU2AfySUG=x?i3gBb0l5G9)>_rG8oeq5${XOp3&q zPXuEN%PY1Y_s%e&8@`6s-(4>co`DeqP+!Y?RJg19&`gW*Kof`%Z^Y(X(gElHMlwSV zqf~B5bV3L0`wI<3Q!yl*c`N_Lo-1h0L6Sh=epc?o>}CXSavlEkaj--C3LMTZ4BYtH z=Rl7PynMhr@kJHu)WQ|a<`C}IDdR}vDqYcfzYr@Z!`?#F6hc<#2TNOo$p*id?KRuf zZc*ncKB`ag#;lFvWmeYOMZJlU9R>!S8U}V0o|{LV-~(OP zw8MLiynXRQV0f6KOTVkLE%{$q9+Z5S*0cJTk zZa&QLUkyrfRq{TedgRc>u$&`uOJdbY8RkGG*@pQ&w@cMGQv{0j7Me(vMPUrK{<>l8 zHK3w6gQFKWkg;90Xn;-m)cai^9C;8Pqcs444u`z*(|*P4jSM^aaA8A!O_7LBnP6}# zG}Q#>gAEG{6e4U7Vk~J3g2VDSI{}ZVe95fQ!K7gnfkhEv$0eNHrOUW&j^OWwz+Qoj zBp0>Y$YY^oVq3-)&t`$p9E%YOqx%_wl6ff!K_U#0c21VhXLpJktX{ zbv8SXI7Q7?k_h4QRVBNMOsbPTr1=D2kCY z>`!pB{fg;`{A58K8_C9Bxede%c>4>R<{bjqd7MZXb1f;o(mCV}Qir)jDBoN$6edvn zMh8uuctG)if}+I(v1sonwhT=sVZ5=d0v0jIWY?t>(cox8#$+$}l zcv<*m9ueWARjUH5eN+;?KesRgHn@BP0L`p$2PTi3r%Hd?HhO>YmOXA=y!+Gxx)tduH;1%n-=%g{=Sjt+g8OOLr$O$BKewwktf;MhTV?Lab|NxQcNCR9zo0003+nQjT%@QX32`|)Tfn>_VnG-}EelP7*2l3SHx62{ z#r+_L;{kl??M9!`%6Jyx!!3~WVG4?kS<)a9zmgbWlRwMtW;{x#;2c^`F3KEP!;!y) z#bsSWXcad@Rygpc9B>PflU+a7CX>||>~(K0l{|M~TwTa_xvl*|{q@r+`I@`+%yGG? z3t=VC>h^98gn;z#6^OrJEfy!FFj|MAHAMFNG4I1@-_%XoRObQz)Mu~=IwSU2Lmytl z*U7hb7s?Vw{YW1#hl&Qo(Pv;Ql)4`{I2n;3gx6lbUYNq?MD@xbv!&X9pHC3GABOqI zt`nzx(^nnN?+$*@VR*yI}*XhY|(Efc+i8j8{u9(umk0w)Uwtq)9#XaEii)=|KD z+@rg^gu)}B(YoyW-8G1n&dtgts?o#esvwvK-f!OR^Dv?x-7a&(XLnI5jYL|_{63-x zHHhQbCx@CL*;CGlN!|AgM}93#1~!H4gD|}FDN?5bdWL-H!OpRNmSg|^JCjO z#H<)2ZV3H9E|&5Zz8>qIh=?MOK(s!t2aH#L&z3e2rR_ z`F&9`i(s~T8zQu1-Q)^!{xQo2jG>j6&{U40rzbOW;9GA4LZ;@H2jt36BYbv5aA-m> z3V^?7&Pkvb1Gixu%j2w!U>w_oqH-dBOUPrcMdXHoV=#r^8T@iEoV$CRJBOOr)Rx1! zE$LE_e`&*|pGSP>g`jwaNUH$Ck4Oi|WNwpKP>%AmpJY;HAZl_H&}Be!=~i8tS9Q~m zb2;0Et*;7s%Jbfu!r|D`sMNwzn$ifbVt1o{c!%~59t~4ms2EI}tE7r>Ym@sSAoppd zSlQdlx6N3+4as&O`?IOxP)KB@S)kQ*(Ko!}FY1URZJAtGhI z?@5_jj^Ram5V=(0)@KkI^U4IJeEe3^BdJ3)Qpp_A?7PiS?Zi;+YW;HGLVrJD`@N}*j_1~o`ABCmFp{2EuB^UBhaW2ly|J} z9C+pWApzg z^xcDhX~kDm@$78&<d&{Z~t3{KmK|C{ruK2IST1c@We)|ZQv3P2As#xJg|)~u$Odm>kCT~ezIf$7dCm8?z&&7SVbY7ngswKV2Aiblm4cDPnS0dt}nJaJ^qX~_3 z?#{GNopfJrA6vo@a;=?N4SCZYQin|tp6`xhv%cKmBc)T~^M1X*akeTGwxO>Pwi~6w zxc1&+sx^$g#jiy7?xOIEG(9^JCKMXlJVRElQ9OXVkoc~SxrQSuu4Y-mL`|&#)xof4FZ^8 zj=_kGj&o`TFQ%aYh>sA==Q*QdEk>Xw#X5soEL5TIb11O>M#5met%VPc_bONOi5R%G z_#FOlHJ{=*$b85oU8@y{sc<1l<`WrxnCVq^T~7GL<#h%v?T_^Q*F?izOj-dNmgAx% z_g(AaG)uJdk}UU%-RPW9mXops5rQ}G=;AAEC?mYA!)BaSw41B`(j} zmc#&4qn$>z*Tz@WHLy9G^IZ|2o;6I%yghH6*RI5%S6^sfFtc#5dmF0h&b40dh^2VO zRz90{MqP7rpKNc*a9;x&k>^hq1uTw@pkwnjU$AOYJYQB`{jhYjp%Bt0uNmy>7{TZv zoN>rMz_NFOFdiG*qsx(c_$mxO2Z~q?w35HQ8nCm-ha-yL5(*DSA+s_F=Cb_>8eZKN zp^3q}T#OzX;HV3vd2*;E&aZrziX@hu- z^pB|;<^^dA8W!xs+CxI)tOt4W_eOmh$2U(Z^@9;x&Ub4>BNO8WOgKKZZi0TAJMYlL zO+F0$#L2u^wf(>rOQ>WY7;My!@+n_v2-NGuRRy}1ZYHu-sNestDoTT+PnI)*`IT%( zFf7~ZdW%Y;4D48185=w?m6bQqep$?Ut?6lSraFuzTy)m?OBJB;jM*JxH+q?c^kKa1 zOuZTflDnUPr{Z8o6;GP3XAv)o-*o*0evEV$JLFfFKMuiiCEHs}hB3I@Q%fz(8G2eb z5sA=Z&jrkVn{D4>IaTSXROT4L0*surwH+ZD3ZDpa8J6a0J#=T1{#5En7wKLfh z-%sxh7ZKM}fZqb5pey*QnJR=#GY!8jLRM-1eBq5R>1?5s-eT~0Iqo;e|;-qIYg~iLr;|P;i znj_IjE2^@n&kGAC7yAle@hmwkLGH4}qD9fRCNa?sA`KysP1Pgcqols4Nsyb>;3mey zDbvX$5sCHqWkd0GC2YrRdsSx1V&}%-0Ubs|Uh1$thLAq;rU?DVxqy)@tg(L9`Ck zTb@8eXN@@bjlmKs3JbWZO~{zynVd8?Q_aoEl{sQ$Hd35Kt)$Gc5mXlR4651<+IJOp zji>a^66D-QMK!sP7%JDTC|wtBh<t17J)y zaLJ9YzyWlMRQJjC^*BYJ`;K;NIcs|*F};@r+gc5HBWi^|qFj8)w#`PdA!r`14t_w9 zZ~DxXiqouIlSM^RvA>~__Z?JI(g;(P3MvVB^RC2mNO9vP!=tmVpr*8n?1#QJzvc(E zNR$(W88A~lde;K3kDpI$%6_WsL?DA-WEa_7! zCdWCQLO{kFa_|JP(Jz{96R>TZR8r6{)U$5QvvKME1Rp~TK4-^98%y~7@)qTw;Dx1F>|~{ zJD_c;7_t0;J-7Ufp`pK3ShMKU;508sIWH&cmk+>=@Y?&Ld%u2U%=i(BG;xw6*$!Yq z0^se79DaRym7C)IYS1$hCppFSo3LlV6q{6|N9Wh{&FM=}vZa-G z3aA%|*ZOk)wOgFe5azzUfvQQ_x?}z4M}(&5m&*XiZZ9_FETm_tp)wU3HOHKK&<5Bt z%l=wia$I>B-P~c)iciPfQ%@ewwY5*de$OQKDE||7u+qOoVJT%b#8H0Wu3(CTUe$pU zOoYv=9C0bm6`8`TTz2Mw`Qs|=!=GicZ@A)RF(ra;;K#WuXd4gnNMlUO81#U?)Chen zO+5s@o_lN+cJg{dm{Km1O-pd>u)J~c2Xc|Yar>cv>68?6)_(Q z5aE&LLjgC?G}Y-8&#}!pu*cDOhgXKLE(&!ZP5^{uB&jDAVlI~(4zHmQv#QOFU0sEdLt&f&D2bDK6Ms;@W#ibDv+CpjfuvjXK#<2M zj=oEZwM%atk5gcY;(cIKuWlcr=Iw4NRo3z@D@`LpoQ;bss(_fk*_j^%Bi|axKl9lj zMnE0K+q%~g!4(W=nVLhi#W}~;+CrGeIA;CED2m98r2ChgHJZ_!_Ao;Aa zu4VL@9Jdg$Qnfh07K7sj6F1t9)yWaCi8u~HFAhmijoUNM1|$x>L|g>NP8XYgDvH}n zPx}$y@O_kt=V(GIcSkX%aup(a{{r(N7@(||`0XK) z7dt#5N*048-B_abn}{R)q$Vanj;O29sm6kVtUNJP2NU~2^$6y}g{5dszBB5vM(q*l z;E|cqV@P(ecl=VafE>Y{1b-o)T7(Dc2A&8f5xW=gxNdS(9zl(KR&=5UccID!N?hv}Ns<;r(jE4w;M+`2{$8;BM!jbl0F+~$P1=jI zP?xi{;g*nyyF}DSLl1<&L|dDi)P4);eM9N{c$uVfFXSV+u2gFG8};D6y?5v9OM+ z4fGkZrkRl~X|yWINk9;cFZFIO{Y4P!$y}P^n1^2A&)!#@j*GDW2{ydFEFz=q-E?tY zUh&6$q(A8eYUX7sQspo4NUBdArM`` z-~-^8C1A+{H2Xit=ZOd+M|?FA|NXs)D{1Lki|Y!wBl^b`UR&sX7NR;mM^s*j#< zN4(4T+KZnf&`Jwyq&X0-Y&B)B5Uv#vZ`)BT+tGG}d|p=3p3~7p0oAj%2oiTN6fg*A zVldd#5~!6Gilp%=TM_%D29ptJEfJMWd6jRcE4xXn`kv}w@aq@jzek|d4AaIkkyTvm zA_$lwR3IW0oqSPPMp|-ejJnNYRBR{)H$Hf~KmbjoV%3Z7ToU`Rf4D+(JSaY~l+;ew zW&lgQPhgcf-~iLG%vbQ_)38t?SY3`ZPnWOzp_tG**Tk+Nfy>jD6v_9L!tc2msgJZ~ zS-G? zg){xz_Nczr$DsBVOR@856?;tyl%qmV#gA2$Cdu9z?U@~&KRbSm$1-PRj(|z}G~pz(*|sHCutC zH9w`NDBy|i7 zj13Ge48p6Rp;kjDFB7jglavJ0m}b-Or{)$`76qBmQ;fy*u%)tvWlfo7U$@l7F!^viaqPAyc4p0pr6YQ*8Ti}{=jhm#)fYyw%^Lf1M<6G)2$)lA>I3-SvjEMGSJL$ zc<1Y0V8r1@OiX-ib7Oo$@@u-ara!UbN8-c~^rVx#yPTGq1*Hix)!nk7RL0If>DGR5 zZbVvcUO|3iXF>mNVNr46_r{{u!J@lg(Czx-sqwO;obnY&g=;*tL;LmY)6rkmH(Ir^ zQe9JDlUMqEA5wR6SpWA=gKv66Lt{f%e`DWhQwg+FrmbmpxfKd*m_)o5XhUy770}(l zfzHu+=(2tH!E;YZUJo?gdix7p-vM6x35K@I^u1n(pr@h!rQQCui-82@ z9ozo(N^vZ%jj!&G@BRaF%*;==fv0ZnrYmx1rlw|I{=qp;PX7tGj?F`(t&6J*tLrO= z|3q6)&wmb%{ajxB`STyN<1b`=V)6BYw0p9C@@uoDd~@ZWfGfCtXCiWUcYkkvZ4cV8 z4b8P49`7HYzrr5N#RuE-hr64Hr#HvrUrsjmP7jX$6K(wqIX~V%zkRy6y1m@%zMks8 zUX8pNSGtA9SF z>F#55RGwiP&J`HGulEB-tmjGwJ{oaOuO`&Z@zf_BTD8o=x1 zQmMB9!q7^#L%(K(c#)#{mw(5vrg6VrIakjJc-cFqNhdRlEBF0zLHEnm%eJIRg7qf= z`46Z&Mq>|%U$<0yKwiUWFyc?su0rica*h-{lKhhO4wl%6@nk6}g6MM?nO%^L2eIL} zVFAd`zL+VM57;%7Zd6s*oA+&)86^rkuP!;8Fs|o;%v;xMfJSb-6*0<}6s<(oQiP>m z*?m8`e!``){GObn9AvrqCKtwh#r#W+c1~s_tP5=>!pb#jESa|3W>Ub9`Aic%sTneA zf&)|?e9_?MDaRC8xsCMiZMuhsFY-F2G?632q|^Zvq0L6ZBT-j0KlW0`KS~vSU#PJtgWhf5p89{al``Dn*zvC`(b%h zgt2z~2K09EV@eL2Nj555x%x*2T!+PIeL(qLmyfE?@}k{$r7GJFSptVBwP{8RDvzJt z`sqPrW*fW~S4H=HXIFhfPIDs^71NxD|7txIx_ad)xjfUeMRz$L4m9-B+nyS4Y*Bh zv5{#HR>FLDFZT)U!?46GO064ye>l4U@*9(_1Hx-nG*S1oSRauXU{_ucCxnX_HC#c~+^-~fh#3!Vu&{|=U@s>7RfCaL=eRV<2TN%A>QSy8&u2sT}?9mEV9ya*(2 zK05Y06ednjvBDB&9uWs^$7kozcJlFl_nph!IVK%yWs?|iLh40+f4~`I$GS@q317f8 zPTa)+1>;syF;i{Lq3hS$5v0`ivuW3}r7_nO z3fmk>unNUEiQG^x@>na%JYX7$ND>(Bqp5pkXeuJW`Ru9NQjIDgm)Iha&UmsAv`8d> zpHD7{Dnx);-+u40yh{*GHKcywG$z9aPyVC`qR@m1Wn$w|HC?A_l~d64RA&hqY&8Hx z2O{U);Lv~koOMh&1}Hb)W3__LW1N9eeU|%(l8$yH37D~DAwcsetWT2gNCPvNlQ(fC zvmuUeaNDOP5UUKdh{pBxH9}fhXr|ocMe$LwIDb3q*U(W@z-?n#!D!)cEmTMq%o2<_ z!Q%l|z=Q}+>lsng*&Zkeo)cmwBFjs-J71_ZE6q?ye7Cw8QECH_$xSKKwz~)dhu&EW z^abr-1(6paRyyL1XC3Htz8Lku3cvudd>;C!;(D>goChvfq;qk~4?}be+x|Ke_j6!f zgM??N{Z~C{ep<6fdMF77VOZdq1~Ll9tX)W0=~K3F^g(URBzm!Z77edA zmRBfzfR)xFSFg^GeAezpwsC(QwqV&~oWi7)c7n3tAOoLbxO>@_Heq0>CTuMmWUb3g zNpIl7@Vv^hiWS#pqDY)ALt%2vs}2d?NewZO->NFfMWuz5b?zp(%0i25Fnylpa{0J` z%rv6itGpg4%^UnGMj865QB9Sfq7!CQDaMw!!}$bnw~&r@h*Tbz*a@9TK*UEOo|l}V zN=|f6YKxctn&8GbR;H+@u~=;%rj;IENl%7^rhaeEjb>U$_kz;{T!c}tlwMI!)nJ+| z*qYJkmd?YjXz!oGwpGf%kr&h!H_L!H-JEs?B!MP{a0R$(iKPlpSvw{EivfK;c^^ls zTQR=s!V@E3V=I^j#Q1FOzC~#pmi>5>kh+Ep2az9@RPzz4VbB6R5KxLtM2OyIH-W7d zn$OY<*drKgmb`vQprWY;1gZwWNeZ{mruyIJyJsZ77~AYvMvSF3Ru z@YWd1jTrD1bhr&1w&oWH7@ESCa6`kno5(X1waCQtMgX?FCk&oceWw_Yd5i_u$kB~3 zSYlCX941&)i9GnX7~4q9piV3X6|d2-ts_K7ILseg2$OU9=-!9IMyh{|eZHSMs^ND^ z`+gK?Ap3iTEdOUG6M*`G4vZH4HR!^l+vjan-VuiwJZ5k#5)%g)UZF)uIqW*Z-;Cgj zE9l1w0r<&?={)8f82QW956Ht1JMx>(_plDcf3I?{P^jrPGn5BeiV8pY zMQCp7&y1W%7{zCwx>Lnc;rdqTFn zYjOPU{H@{!6|>d@e+C)n3I@RuhQSlaU=7Dv>zP30mAVAv@bp5AgF)Sb`3iu>Wdmaa zsPSQd&&Y=EcWyMvf%Of6JVCSrNUl-ti0oo+%E%rHvH*7?Ut84>!3Pvo4j$1X!?pPk z6arx>Ph9^wseMW2EjsoNaec1dKv#38$Yx8jB`2gSchy!`nJ}1-aY5Q;K^9l;qop{| zlaY-YpgKU50gpLUjRZtZcP~z32kGPI?G1G?N8vTK`pRUELj{AD2SYc_B()WuOB_)k zhrqT4qmmb<^MGPji=arw>Ov0+(gnOw(?t)Eh)V!89J#b+No35q&L!{?nE1op!{L9! zUszH=4fClhj14Z7$z@b}0uY)cKBk+|EJ`FJwK#RZm?DBgd7)u1Af_S+uh)}T)E$_Y z5`%4OLAxM~70=$Js!mL7BMFL5)`-zA4DKI>wP$cA3(@)32QUv4pJM_&=<*&l$8x#L zJ>LZ}aK_EMs1x$2eJOA$-WIw|i6?D~Ctr#GrEQFy&cbpF$Z~g5PjTQO_{IqvPu@gT zrH1C^LXmJoVF(WC9uVe-Ff01G=+NU}npnjHT(Iu|=%YPY7~3pagcd)3hkCmw(s6zZ zM-*)NL_B(F&{vk!Luk((YEx5>8tRn>T0z%`MF*{<)y92j*h&j~OhfBU za9_cJ*T6#K5rLH9c^~Tz0nkMo0dDSAfvEP;i)tBh2q@bD<~;-rTZn=jnT>(~B@Uzr zFBGL(Y(X)AFh`~d6-u&=!?L<;>kP*5Bf166hcopz=>5^ji_y}pw%T*5+hS-FR4LCK zFt9LbrRlKB>6Fiq02DqdxOV|?N9j58SBT@S8AMk(SC2Wus)$V-=w1Oi*UY)X0AyQ` zO{xv|$9YV+6UruSw9P@H(E>Vc8}U(Ks`89_?uhDpo(!#CER#pHA7WSrfvDos`3yY{ z@V)S-gAR1wh*o*x2;w=iREVsr1)uVe&IEJB;&Ko4a-g`y!wUSnRrsTk+}np-S|_Z< z-e`CQ;b2GE(4#LKzZpFD@-*kg#N@bxL$DW$CAR??%a19A(2>8@V&itS?GV784ZM&y zboQ@6VGEJ-B!^c&M*)DO;8=L?m4m%K$)9ls41zt z#eqrMlqdlq$-qX6n=7*gN#6&`3+Pt4zQ3b8hlHBA*9U3=@;buiW(wX@y$^I#k;lk3gW(9mSXwzjq65+z0f zx*L#S(uK5wZH0A)|k{FQRUuE_hJ@N@upUF!C zG+M73V;lnmKvLA7yiGgA&4imR44N%{nyoXNZG`>oGjfgu0pHuO8ysscpK9P|5F^r& zFZ5edD;hsMX&Mt~hq!*-PO~`K)&!2p4r)O?bYzFC);RRGL@_`Rpe>~Xc?<1QJo4F9K;%m?K@hw))Q2MH4VTh8gJqg zA1xLc9c4CdNH%YB3!DATGCFM>u^dngvHgHs1Nr-x*BR zH)uE^ke^;l({V{X4$Zb+Qg?+~PwZgy<8=~OD`*62D(`kqk`7N^h|teIP2NNa{xY0G z{XF%cM0lMw^=EDBxp@k^@C%l#&R@f6hEE-^+zzX1B2><@Y+OCV=F=MeW0+E*T60`z zKCL z28XitnZ|Qo{-SU^D$7KU4xppUB6)E zOc^$&Ub;kKUw~|Em)w@vy_A*BSi*=B(K*%6971X-*WbZAB%69bud*|dWyVpvC+l-V zceNWWjUh5@C-T#NsX(j$fipQWd#O8q63=3u(Y_s|so)zw-}z_BiBRE^lVd$nbQ-v% zohho7px_^Ef24+HX4aI2Ig$M$>$g7fIHM3jHK0;JsboJdx6{VaS- zzyz3*1oDAIL%EonHAS;*PVHf6C|AKEI_SIF&j%_6-;*Hr1Br+qrn!%T9neHVxFe|y zS*4GLim?b&1UAmw?kpufJs(q&oD_(j6m4jBYhvWPo%{?qQJ6dtAt6>6aWiLD# zsy?axcv|AI2Y0KUIk}J1cL1Ok_(efK;BeTJb4Gl9I=XSDc6>Jd*B2miK7Y|Ys(Zd1 zqq-mBJ;T;3@RLAYd@n@%Y}+Am-T$J1mX7B7Jgu4XEaqanx>74Xh0|4_%!*?zrX7CX zZD-?B#aQJOoX%U)x`whY*!wn>ifG=6oVM_a{2g&}ufY}NzEWXtJRAeMOCEdrzI8Tk zPaM)rT}0PRgho$J3f;QaC3(5zlp>51t0(2T03daikKn$#U^cS4YBC7xU-j z2tO*l9tyJW%f5IE9N*u-WJf2~GlVFu&%Q6yU!N6-pOZIXe>lPG|3k6jcX#!NOMhTJ zPm8}x2CqA-;QtYoj>&c{hMU#dG-cYAo0M$^NpBq&1XOM1mn$9 z4)OY+@7?Vu>)w~S-^oR^124ZBWPOWG5B&B}G&UMy@|g0bJq>~@`Qs5m9*2S*FEO?| z1N*5$9ZPp&6_5URm(n}Al*h6uHCtt(&^pFjNyc~}EjER04l1bN+f&0ECR1aVYzYS5 z1lhwr8QPCeV=-=kUW}rUUr2@^gZQg39LYDB$ovpzj)^MPt=^lRP2#;b99SE7-y?7w zKfmBozwDd)Q#iU7IH@agz+S7sn$~i7tGeNFzz46xD7A!`<@0K)zHL%}t0{&EeKa|f z_vNY+&Zz!U!?|FO#55(V=77hmeOj7T$BK&cBya_ZskyEG=KJLxvUx%eufHVxDBiye;x(b~+vXIk}Oh_an` z&YcrhvF8l0YJoAHs!jJs6$V`^06zN=RRywz@X-+&`ql~Rq+Z|pcU|Z!DG;$8O(C+S zC=1JIZ%rW`caaCG5RISsSB~`MJ!b?n6*If2Q?1xxS17R@f4Ed|N`}($w*R7tqr5M3 zOvr=djzcn=hUM--$JBz@n)`FVkWti z;qgt;G3in9;t-!|A*>K`ZZX)=M^bzkktE2^*I$~?D;IzOeW=!=Dh0p`)V_NTfdBWM z*KhJWUIns`VO+DnJWZqFiy>UaLH~AKhpLdCUu4i9=!LDLlYlmEjMHu^?%{}h&5P~; z6Bx^ZZX19^3K9M@dHEQ7hb+sF*o-1_uqCTeYfxbXvCkuXQ9&t>Lwb)QtTqj+k$G=P zGmH?QnX`qOVVic1vT=1Kr9!u|Pm{g3E5^nCj2Mr2|J~K^6FMG%YtRW2RSe7Ier%lnO|^R`I>(NGmV>mEU3FCY(jV{dv6tG;*a4{{1-n`M#U<9~wqiIT ze|8&r09aMk&1Cb&OlsK9t zxA*FG7M+xlziIyTso;G2eA?{rzaGXmRg-ZmIp-_>66IOvD-P$v>E|mk=ba8+g_}Zi zTz>|tF#l`R!1;B^7JAQuErAI|wXb9J@8;0d`nOj0)qbnCn&aXo`F)xuWkP;3oFpJ)I(@C_+JC*U+d_#5*6IGGa0qBzV>PwZEU}K zMK@1SyXa)X{=dwji}iz7XK26s*ZSh^xHNQ%_0l>R}+dI2^`%#mjqrjg7N8$7H zWJ{+5-HkH`kBPsZUec05hB#>8%fw!)khn*K;puE)!Lt%-Z(aMow+_qroGyH^`Or}V z3bQ={)fqn9)C0Aul%qYWU@CKkS#c+Gz9|0B)t!RQG}M+=lwdoVx;!N(nb-{4kqMg7 zlsJ5|px+whTJjv$e^AWVXkjH29WB$S zH1-q7r@{h;Vgy-8VjegD5E}h7*52|pJ@y;25|I>1hxOZ;6@jja-zybMp%(-nyV~27 z7HQp#M6)$aG)fR6a&x*my&QWdAZQ^cuTkOh(pZ)5A1~lvm#3RkZ!G>UK<*f~0`?Ko zvIDoTWVV1{YENT*=%)r%{b*Hz$Pje@Uem8wxR!Z9;NCtcIC~A4A3$o0xDy)nK=8&r z(w;gjs>OA9C;CSllL-yn_R(%^>(Me*T*V3#7T#BY-VP)IXuT-Mj0lS~owRo>9UiZ+ z!Gu8Pz`;~R{!Zi&aDjQ)f>QDZmo19S6t|P$7{_PhE!x-Rz$9jL|uxeE<>I+ zjA}!w-vi!E6?7i8%mnvPqhRhe!P-=nj|(x|wXQ0BtXrQ3fxgFMp}(mnm$5rD_zst8 z<2Q{vHk_^OfJPoUd;rg!6{x3Y)C>-nE2moHDq!nKkH=GPmA?60mba6PcG6{Ae^Wwe z6=jp+J-PT+9{-XC81&)x;~07tEWGWTcBELKBLx2!{kUo$)~R!77D>W=h^0x99LW$x zsw8-nwdITpm92<;Je8IV*f(K6O0J`huL?-4(JQdKv0yr_QuM}Qx`E@6&meQ{EhqTm z8rR19-i-}k*6&XHi^93}VwqRh9jnaU8VVxmRl-Svog@w4l4@A>`AaZ{YEgRKFZ@+Z8Vh{eJ^}_T2yyn+}^4VvT!9P{agFm57E9LEi*N1M?-?KRy zUVmF?M7clS%^NMOT=Z_@()_e1O=q*oiz)JpB#Nw(v+(vn+B`osroZ!wF6GDVy$Paw zCyO|6dY?OJXyg5m)tIN+3yZ7-?jlDCPlL^Pg$MM*$T6X!2B-wk#KEKM zas-X@mku$VvSA5dkd6r<|mC57nf z7bc`L^pU`k^z0o_7s;nvMI`#S27R`;DgN#PM~mK5ODedT_)b|>TIr$_N2H}lP*%w) z=R)nXD19@PKNr{vI}RR!n0iW(nJ0dAvFh02R%(YT_C38SoN)vdDmdUev+@6Jc}r1WDoP?cu!ehkz%f znLw;zagSgz@o)q@csUq1WjM&^=u3wJ@??x8z?(=MSszX~@hGa|Af`&arHaK$!kuF3 zG3$Z;vWV+|6J3OeWtw0Z9>1~$z!xn9!#YNt>NaR9NkGzM#zkE^iC6j?bSJ@!dESj? zk&LSEO%mxTXjoxhSFc!AAQll>%y_Yk({I*iaf$-` zaHWrmZ(IkD8&-w0dzwGyziT^%#rJIl8_Kl(`JQSoMb7w^fRZ4pAqq}$D^;kth&YCm zXkE-3^7*KGSPZr@F+}~IgJ+qQGz}!Uj)Wd-8pHINs1mreaxp}z+W?d*u8ir7fI#eF zC)A*_IeyOVA~m1;X=C}@;*s$a?GEn+3wNHVmvI{vmpqgZ>m@Lf+KFcygYjB>HM-gh zA%V%`GRX9{FcISTnN_UC)S?F#SwPHM(5|Xu376MAe4^>^lg^w|2aq6YNzEbC$DDI; z3TbM>K_5ofiStII4Q>76i6n!U_nbwnS%2QU;dwp5>)Ii-VDfNpWb+Qmvy={rmYAAI z_*SO1OW2nx++c0}_($vDec@HKPgV{Iq;(jc^d>%YO^6~)v0sIft}t!ohZR@#XFaSN z*(yV2XFpKLvIL%gVafr*DZ{{Fq=tMbV#Ejs=KBid{kb1mQ=?I{<7LhndD!do-Ih7wC2?H2Y09%c0&cBr>irEVIxgSfN_h$l5!kmP; z0&^JyEvy1r!vbwe0~v+_`St_fFukE-0zyqFrZkmbwP;C8Xn#|I>qx{KNKTc!K^vSh zxz3Ov?qLg$1&WOwoUvXqdNGXBPk4z4LEl=u4N6_t0+@?-30NG-Sk(yShCL;5KbiMZ zj8WnK(!mteIeR!}h z)fUYz46`Tpc)IZtETL=kBf zkJ%OQzB@A1(SgG{j$;I<)h`Faw~?ZKqC!-I`{g7>9ukKX7;{+`(?JzMpa;z~#F!w+ z$jQb~rpF1vCEOoT6>F;95drDLjc@}KoNHm7COljaRq>RKzs5YL?6$H77S7#+eLRewl>C7aOZj8&|c z-VD+)K}~64if-}D^ki~vF3)Tp$qbJ7|NW4ef~pJ_%(~Xex~5M^Im)U^%ldksZfuj) zw30QOF4nV>Rh6E72u9Ly%fdj-?mNt;8{$xI_OBSp>h}oSL&`j8WB4y*^X7jbn-UUI z($WfYvP$yuO3F&=D!w@?^+jr`n(Fn%n%|4GH1)I_%k_XodJ%Q{ddB*7C5APHMn-0) zpiqvhI*!EdKc#U`1t#j7yGo-`gAn<)>T1~%5Q-o z--5yelG6e!CIaV1f`B1G!4X02O(9u@AtU{vpoq}kj9%#o1eEbmp?KH zRkB5c{YBe9iyJzNTl>sj020 zt*fbjuxVtzWpKV_@eImtwhzs;kFRu$jd#q?b^N+|#W%<1I)AQo9_~V0w|Xy5!ILZC z?e+h3Z!PTf&;IP6oA3X*@+zoD#|BpS2M%@zeqD_$FOH3kL#w#Pwl~N3_r~uo$6ubH zDtlsiZQ|r`;_P_h?sjr=c5?4-YU^bB3^IFm0@dAffB($y9M7K~&R;|3Z!TYD`0Coi z&i>-v_43o*%F@cp1!U#-&FbvJ&*g>xkew&zucIYIwp@HG^i<|Si=ktgA^OwK>%#vLGI=i?%JiopB zeRm1n^MeZZ=ZE{J$FpBgcfbEXsdXr_**EZi3E3QVm2E7WahHo_FdA(ve;pxF$W~~o zSg6!(uw5T*s?^Chg(92K5fUkPOXvv6SabEy=7V`md+Ay|iMDHfUZLcc#5K$4|A)P| z3W_t}n>_~`90m(caCd@B&>#sOT!Op1%i!+r?(Xgm!5xCT1lJID@_y$#XKVLVZEe+F z?(JMrQx8-Br~B94;=z_iYT28ryL>_Egf=TpZp#RgE?-!&H(OFUEPtUW>Slilyv^k! zA92jqbr5ZP!g^LPayQCF5g(?K;^CD1aHKF`Y?Hldl9*j63ZZE8PR{ z5}z_~DbknOV7W!2D)C{DSG)C{^g`4bZKguUO4vUG8kh5ix-20C`6kYC`4T>Egs9oa zNH%qZ2!DX6Ut1t#)IZm3s41R6bc(bE&lOu0A%P1oxjr*0GzK>+5Bs8`{ zz^=?3X2J2n6G zUu^gLH?m~2+z^rs_4;Dljy~#Nu{W@GqhY*6P#Jvvm%;rglT8MxRr^&H(F7^?2WpK^ zhZVoIIi1)8DEK~!4imw?CBsz%D`pL>Z$4qLwvR%a=9r=_0VQg(B@j=$iCn#CnZFTb zNP8hs1b)y>D;B`Xg!6B&8(|&!Mm6rx#dtf#b5wczQ{eIZc3K$ztuj3$d`OmCl&0#F zWFeQ~rj-QY9r?maTEHinL#G>f(tD;0XSpAAR1YggDb`%y5f`;=b>#{i%xMRtN^#k) zo!Gx_h@0L}=h_s!?>=U^nSRe@DDir^-w9<|aGG77l+NkM`eZ|`V{yYxv*9Vp!#;bh zW8)~^WygeM8J1E#cl05?-6g}CI{=L{ST-tW|A`DfEi>h3w&wyiRWs+0Vt8B3Q&r5K z1YWrc#y>a2_|t!GXQl&hIIKrGqHmC7Q8gYMMNNne>`a8HpQ?S|cZ&j2p4ebaI2&^LbX{&+Wzt6Qz^Xs9FdrVUP=CxT|bM8aOD{zUJ8W#bKUTDnuZ7E;68 z_d!z%@Mm^SH<=kx{o^kmNYGL;6u3)pXRnFGW?DFOXG&VfPqt+REDc&XH{zbmLvtM+ zAbGh85uVhCeGf_PYVYl5oxxLCXT&N+K(+JhI?l`m!Qf2}Rr3btp=ac)^NZ#U2f!mq zA|=pplBZ*+U=;=tOpgw8$ql-%)ul^CCKvF5$D+goDNJLJ!zszHzWp*AUqpZ|;x8_Y zmfsB~xu)%uFfk!2QYavZbLcUPg~qg*38JRQ|EM&&hre_t_JOlbT2bMUlDB`Tx1CMu z%OQs1=m3z(U=>X+UJ1*;^#^}#9@AI5D&q9eFQif@X+i*7w_OFQXw8#xgl-h;H2Wa# z;hB}G+qYJ5J%a#?!N4?7L3R$QqVGP50l6UQkKfR^PVua6UGFz9}v3=LA zZtWsEw4oWfJCWMUpULg^|1dYJ3EnthwxveknrfGpPtu(KAufs$cuVcu-lq7KoQ>d) z0sEV7%3^S8J~}y@5}0dLgtZxDrFBp)N2eGjD@0xy-fMgh&4Bb5Z@%0$0C9u7|9i4C zhP*HA54oH2<(&9

      *P_a`37E@UCk=Ybel>|~SPwnWi-NheMB~V=Hv;COtQ&WlnVL(7sQJPm% zQaUFymQb2Zb?RsJ)b}L->?L@M870;hOBaH~#^)W->F+*Gnz)qE!uJ&5WJ~N33gK{S`E;!AX5gEx00z(>{5wVkb z4wLmX;TPtYpsX7j8l3eonC(1?&z?n~U7sukC zBAZUWQt!%HE5@o}FreZ?7tE&KmLRfO1AIt=$+Jf-e#|uXL-Axnu6|7JhW^FKDFZ^t z1g@z=_UUn5nS&^)qYGIsQrVM4Y2gx?PRU8jlS%Z+1)iUf4gDgIWphvD)6KgIr0fb! zGX?C`N)ujo5 zTDJVp9?23OkBzB24kDe=#r~KRh}(NjX22ID^;Iu((vTg8OmpbKVBZR@mzH5ykHQ z@p;PW*q5uMuh+NBTW5EV;oqKqMg05?i`xC5S|lkBkHst_SZ6R4j(toUr=UJ37#M;4 zlUY}NWh{~cA|3L`*jz@O@>Vb>EZn_ZiIvTCDi7DALWP0v^_g;tN98MOvA3vOIG$DN zWU`6O&>X*7lR%{q#D?Qlqm8ZI;4quyRr|@tY#`=t!RyP%W}Ai*6%jACjY^ko_IQ>D z#;tDY%e`OKK9}(DJU^cLn1~anhP+Vc)%}RwNX8P33E@egd!*?s9>>qns=AZs!WgNesJ#DOwj@93)02w}i;Ieg`){QxdV8ybWCi-_ zgA^rPeRxj;n z>;G%`)bq#wUw@!EjJ(GGY>JoH{1=YupB&~d?DgQ#|Ai@D<-eKYuPRk;DsDnFN;I!j z7!=7U6;65RinSzspe>=+jw{_EO-fpTpI*#hKfIuTJjONGKjyr177Y zP$uaUvmZ0mKVrIKYgL=SoQFPdo7N5!Azdo@W7P7_D-@gyl`VU0 z`=ti6SU*|qz1sd3!2tA4-E`;mHdV;}~tPRxrW=CVRezO$-|Ga`~>=;&8V zCSXx+`!&$X-HOHN-8{l0zKt2)@VOD|Rgahy?4jm76mP&!&VQF30ti~~B#HxAHATJ< zHVLvV1|y+n?pVtRA)|-AQar&9C&^HljwoXlH0Pzv;g(_tb~Bc6JSf`i#WxlS#>5O{ zMa~9r@8Rw{Ew0!pqwLXT(?Sv&P6Xo;Pto<2kY(vLgBg@dZnmgGl0L=3{$ScK<5aV; zM^Ci1u(x5R3m1wt?;W((V6{ZlJjxlV`aV+dGB~tY`E7~CDvryPSvqqBAt9q1wt@L#Avl_oj@=QZS#}|>2eGUwKej*+TTY90H%yrgYZO7S3}51%4S{Y zFFjnuOJ^FVBom%^bs=Nx2~SK$j3}K>Bf!Ys`S&;t3w2WUsF}?ZV}Rh8>EI;?`-Wo$ zYY*H`UL3aRkANKyrkC$oTYRhQibj}t$Y(L;O5^B9`%~;@Jb1*B0K798VxqiCR@vk) zL;%h9rHxlW;5Qfth4aG?M)cIkn9i>UejNAFc#8dEF%L0b z7z3bi1{2r!QQl%kZcH|Iq4u#dw zzugDckREztu?y1Z|{f#Hz0p*qGpV-6HBymjO{(KKuSl7 z^;%2zwkXS|%!OfKi?C*KMUNnNMsCuQFhd0r4_ezmjKd1Vo}(_BxHFiE`PN6r^Hf~vIyrQdcKt5;WAU1 zYGu=5Irc6sBFUI)yB%BjLF{(xeJ0`4I}$^@>upN}J#M&md+=+o9rxaL>0|>| zh~;#T`Vr-R8e6m!0nv;ZDjvZ**=cC?98VC0s*0pwXJvuACb0fahk*Wjbs25%2gKC< zAxSAx3)(J$mhcN0=NYR8TyWTmH5aZVp<0stjJeIKFS(%H!Ko{(4*GPpi~p$h88FdSV7`r(tGH^qUAt_feGDL-8UkD79%(CQjvHkRJ?w&~un{5Jne(gAFPQPH`kB#Xzjbq;9p}RPb|eJ(>zme^ z@^+Id+mjP{U55|iPJDHWyKwaL2K7Fackg^C5{(R3mBl%!8d8_E3NU}H8Z7ZqBtvGu zB>!3`kZ+-&Q9atWF%%(buBV_T5DJ-)ERIV_y-66>o>X{Ejru9VvfUbfvLfGkqcnJs zN{R5b$Y(|8SaNuuHZ*vLa*m#)@$K2)@$=*dfF3+Qw{F`yr!wtS{TCG9v-fAy-)IsAkVtJlRNA2eKGH}Yv_FZEG#9wIO+$_N;T!3vn(*u=#%;Eim_ev4)h z3paAiz|qk_a^27?=hG9?nB;{(IeVGcuua?QweVW|OR*uvJW1};n}&YcccnkiOd`EL z*pl9BCmL5+W8JN(=XlFC}Zqy(92;F90QONGQ%#0Xf9M- zwF~yf;zPcUw}f0Lm?9j=bNNl}m)xWi`Rv6;e4lWn zfn?9zq?qNEzcKIL_*~QHzD!1-0SnA5m@gP}mVxWD;i1uN1-k&zFaS5+pMO6tR93Tu z4fCEEz7G`OzsY3Ku(!Z9Dkzx!^gxv(eh3kHI(apaWZzV{bXx&sa&c!~k)kR9On!Zz ze_3URh;zdgp~gn{_DLWZK1yXc$r@tKBeX(i;D)EbIX4*KrYz!{!1=#GFKaXA#l;uFFsjV%* z(##tbF%jvH%=cC=@=hQ!;d@k47H%AIbedjt2C{`$x~yuWoXUG-!!`r-Rp!*Jw_pnk z=3@p!ev2m^Wn=-p@i6Z#k23)m5ILU72C+_`l*#wzXb znqVyNReP(1XAZGuz9Vm%$0@5*xXbCfn3KgzVXqV?`Zl}RmRf{-qo&eGn)DU&DT|K= z!o9fCZKZ=J0tO&idAK36VW%mRetNwZ8OYEGa63v!Ns_uo_7t>GSvd$7PmTy`;augy zsRi0KQYX#8;?P$B#Vg>~vT%UFc=XfAk8R*;DXfDQFq$2eJ$>REB0l9RNqT!`UX(Cx zek*uuaIzg1HD}DX&h*i-bm?U*gVS^i6g+bjwW8E?%j}E=&5U*}WAg7At|Xc6LYbcW zncgUgltUQ~U77hsnbk5_0yJP0o~&S|tgvj(KK{4huB@5THM{;T?zyzI0SchcP;KvtT+@XUTC3EtipzW?{lB? zJkRXeo!QxEW@k1pGLyG?lYBqF>-t=2zL^=BnOU8gZk6FB5ngQL=|yXvMMpZtzF9@K zL=~M`HI+oA^oB7&$fs5)vuuRML{?#9jf?Qxa7#E*nx7X?eM*RyQLnWkb7U&?UL60xr{q%aMgUc`)_H1C~u#{hWs?c zLLMVkK8shXfn&zQo$fHz@Jd(LF+y>jqneOx?R=R}sz3SFL&Y@r2FlGK^_}+`W`0oW zuuwuB5yeRHz=L4U3mGMQvV1U5O<(j}9@9LAN5|idnWH&1^_4lF)#;M!gdc(|^CR+R zX8?g%e$5ylUl&LM4Qp0uOWTooo=k~$(T*9J+jP({ND{DnWIH9Ow7b$Uc2q+w*4~;} zQgEC45(RVKv`wod0)w0^B_t)lAQ$+jOV?!$rBq6Aovn>DOn_jBX-qeJvZD_t{M zSwNdTB}@bO4(+`NcmUs8GORaVWF7%BMQd|7R|P%Pih~&B1DGr2j1BKbE#lrx@+i-E z1Po;7Ps;^j0V>sn2IWHfpFj85%y6|Fbse(K+YA}P#sq(Ni+^U(qY=}1rq^V$?m*~W zgQuyqFsbsT#N9?ZAEQKN0uX1DGiui}>aaQLsMw&><0j8B=JC%oyid-U4>^wC=2+mb zF|}P!SrexgQVdU^8ks>Vv}Zhab3Cl4KT)yh-<;FxzYrp5T_wEpmQr5}uf6>xMDVKH zKRvgS;+Cd=Hqbi%89=Lq*Uzh4Tc2oAOHa+n2)yL>cLoh!a(fzq|4(`O)IS4g@Dcc- z?y-fZfXmEU&*Bn1<^nId4IJz}mE8U&UH+EbmiLF@owwa>c<|+K)oo&I3=Wc>R^s84 zXuDhg!b$(Iq^DR6d?kKt9A0=^*!}dk>h@31?O+LRH@`gpJB+rvviwiy?fd%eztGaw zWS%_1S zF|;{ZAegSGc=ND1$(ubT0-m)gv`R2|Mg`JqEO^nTW|P zy67qjs4jcdhM52+iBLQ#4VztN0zDlnRsd~3RU~@DVF3r36Cwlq>n zByI@$h=eToVM#(cl)DP;Ewp7MgqnH#x0(eDAnI=VF%*ob4(7l+UeSxcK0E%LS_!aC zO>FQ1&_&7%U9B+n3r4@q&?$?Crj@ex)5RF~CDR7Z!|tb2jtVLd^NJhfpt+Wwq({&? zmkX-gxgFbQBA9$x!2J3fdvwk6-PtT|N#c$eZm8!gk z>lICU&f+A;7}m@<3X_VIZs<~&3bnCd+Esa}YR!cSLT_6$4HrZ0wGmdb?N_{uw{+|v zH!xMYJSOfk3|j*%@^wWWTcn`;PeH>M!<53F>vf0xoN*9KtavEZNuTCdc^1#$VD+1h z5<(}<_n2TiCG5QqGWG-6dKCsQx0*>3WsDB?VcJgj2N~9NorjLzUo{s?ft&gGta|!0U)uf2y!lS9k`4j=Dq$_|_tA0F_X!v-nNbHtc&b#jz`jnN?J%@HFbPZ`>%gg=Y; z>hH#FGPAFRf&se-<_8;r8+N)eyEq6*6=VI?aKp&-sxhcx`ahEkUlWlXhl|0aun0{M zI%{{La13NHL&qh1hUXxz+#_gn{C)I#xC*4hg+OJ{2x^sibOXW=VIjW=bCxUrnZV%H zXh#cI-esJNLD;z+F)1JFhd9@q@f!lF%$(>1>p<4+H-R=XT!*d z&ai18T?jsjF^Q?hyWwkbl)h054o65m^i+_Ag6k3$m%(hAd>0x#==e(Le5WZrSOu?w z(4njXZ{s(64EZ$EvgL;l6LvR|5rDyOUE|e-03=2%dq*Q(0U-Xjz>tvsf^g@uW@-Z+ zYlfeY3~y#^B`N_qk=9}W$cq*t6%f%dPMljkjYMb9!#JKd{+zI+AmVvuK8mC~Y`tyyDrb_E!*pkEes*d&D#jDSGT#6H-{?vO{esS%~8HNfW%_DsnWKF46I+at_< zBa2WR-w)7#L6q$JV;zOyi|l~wOieqFJr61YGgR%SJpH^38w;WfTewt*Y%-{#ovyEZ zpJ-~t{z~fu1!g>W6%Q&o@yGdX!Vuc4ZOxqAS*kZr5#1vfQ%PmcGYtb{%j&jT6-kMk zvK}d^ihY~d9W%*{G90yEomv_IQ1wc0zD5^^`6_f%;(hu-L}+>w$9_E9iSkka0uqW* z#KCtEwhWmRbS_PPG;_;TgK)9;-%@ZmjKcrz|Il;|-rBHXI!RvaTc8X_ndp%9m#-vD z;~qXBjra!LIgTxay^|`nK@sNFdC@i&>W_{r889{c!>3L7axB=2yy^B-stVW#UXDMh zv{0*=oGsx>P3lxMV0TBK0@ZkAvQjX7I;=$caT;PJV|99?J>(eg&Yp*zA!*N0^2yv-d@VB9pCA;C z!{NG^Ru5*8Pm-jRp7oG}+P@h`s~s-1pVg*)PFj zX(r3VMJVWDp|pFGJLjAs&soJ2!Ah!f;YEE@>-)?zy6TEq9eEh3#-V&ZUwYg8V~E@1 z3S27gFb-W~Gk1;m-Qy;rT}AAFNt1u`kql$gNHX7?zP1<}RQjqP$z3nqYt=a&z3X=C zI#$d)XPUk0?M@=OV|61ug~|R5OJ$lI#(VVa83l8D#P;S1_V6xlVSMi4@!@fy1|M_C zMF_cH3*rOoGLzeJ&fJ0j!I2=zGFyhn$@zU8$_swe9=YHZQHmra6sUFAHE9WCNMtm1V~m0Q?v=SpxMq37M2YsQKayuMreS#h(>+eQ~# zKa-%Gc8?$(C{*~;`Xn;t!LjWPf1|S1xp2_x<=!7I*h?r^(4*tT{wkALFos0ya2$lxA%?gb^dJ*lMTyu@?pfj$7_bx!5`ZkC zNeCPSx5(HGYiXulu;gBI!2Aw*cP`0^W;d&!Seg z6fsVT)o^eJIn_sVWIB;bJooKH<**CIoNGkGTPL&uWJGILt5SrcRG0NK7sefJCrv*6 z4u7M&NPGdYyxV887r-_`$mErBw2mMi82{OoTKZ?@Y<1y8gfIhHnUMbQ^r+}Gn&^v* z=(J;*Odr7vM$=*)XtAs?@G$Bfzf4*b4jXrLb%h|Yd0?=QgLxrzsD)$U>SfP(j8zJT z1!rupRBX)!+iv7@$qsuUjgopYcdw<$pc;PfvZZ|s4qy;RHNtS#2IJLt3A`u>OzIK! zGlSB3BZ;p!*Xkk?2rcdonKyz+Xikf)wb(_&3NiuYLsg5NH~*)i`fW&%8K_^ zB;Yo?q9P;^HFI{38)EyS?*cXP@1+S(&>JG(4qtisTWJRI2)2es;f!*Zj6+(ak~_nb z`-U|eWs{3|l9@8mi7VCny;1mlQv@id3eW2-n(+krKB(l%6GyP z*I;t@ux)LaTBgj%t)RMZj2snbSA%~&C{_A|m6_OBY~Sny0Rg3zkojGh^(C&u3ESWv zTxzOUx8q4mi>wf-td@kN2SZ{Sqv_xi`>iQkp`K_?!l%C=C|7Pv!)vSA{%CAMh#^fcivk`C!NEJ&G>8?5BB}mof3Ssl|O`5Jj^bs7K>%>UueBR?{(&DLH zl7H36YswvvQ^5WiW;~gZRlbIy5^0D=8n-KGgPx4^A`wN<%1_N*0b$Ik<{Gc`GN+`} zVoflCM9^dJK3`T4f|KUW*65!#?r(p|q%H00Ze38;8QpN04-hKc^?(tqqj&iflKDv! zbroiSk}P%#sqHu@go-p_g=HNk%w0vS>qYDjMOh@pTtdY>dc}NxkHv6dxlq@CBz5eH zYaym|c16-z=#qXV@?9lgE5M5Iq>dej6mh8rh6;yYsZLhuD`2y&`_Hf@3&uSHfxK-kEwdBBC_k>dL&pv(jJ@r-H|0pn|iwxPpcsqD<*+ zHy--I!t!XO+#=QKS}D{zowiy7~KjNkq&Ig-kHuR(I?S9jV~ceY-4 z+*Q|K^x$U}Ig}VrUdCFB0{L^eazyXe!U18$xqjr~nfKA4L2 zf|Tw8i8UCB$iJ~bHAvFLU9_PQIMMJEnJGc2iB`WUfXYvVn@LoqtdO0LVsOLo+%kDY9#+&VK$ z=4_W1oZWbe*}-_h2m>vi8|sZh42XFB!RRHAaSkjYXPvsG40tj8`B@hE!t@punz_NI zZAtx%L6~B_pw_rA;qL7MFPKcPI|P?JpxGPkyH)ljLYP1NYR@Qzl&W!#2DwjMiK&vf zFHg!J*6TlbW7dT8v^?iRHR&cwQ4Ot7X&3J47ejsyVotbVY4q=*l&~$B@)(TbCmhC+ z26m6DAVLXxYN&-svm2M8z3V?>X1~NV_{!f73okE~jP0l%D&!>`0XD!AiT!=&`b?g? zI0$OZbI-9N$AN1$s10htRN}RO9xm!4+7bIOcUoP#MRDBfKA}kNVoXS_J&+Fg9z=?d znlsSak61;C{L%oHjro!`)^6-GSGM(IuR{?X>fB(lM%f^;U^6gf*stu>FO1wV*}CsN z_BTLq!~0*|!9t3u(H=-{WG=C2IzR8rW33b5CCQl~-Y&u6F>X~ZYRW?H9<}c9gdG&c zhEa#tD9s3*FWuiL*H9J{S6xKsDo2IN(96Zkn6X&#owgCK`%BQV@<+H2@)-1&N<) zonTOi-qQx^p(S;j>d2Yu>X{g**)EuW5C2c)nYOY z4p17;nZ_w>M{e&ooS2sDX;_}lB=jqu;g*`&KWot`r!*=QnlEv@g?SzHD1V%Gi^Ch- zGWekF?ZIgq6_|lu2o!wA*{!5M{n^h$^Cx%OrcDE?9iDly`i zkq{#uHbbRJzBT{i_dF%V0yUcrwc!H&y9I!f?)%HO)Q23TegM0cSurn}7FK>J3bF6X z*q->JUy2@n!&|1`Gg`wa|E6V-CtCJ*-Y@cRDiGcXgV(|ScEL2ta<$6~{;ixc>8gWU zr_5`LpR7~EovzK*?%mCPBfb9fqXE6G!PQeCixYp{Q_(|D%Bk4ywuJWOl*OsE;l8Z4 zCb(}3&fehZtisM#ctES9xfd>&`nwufR`H~ndctqrLr-}vxMQlj>u*x4<>SBXQvVs& z8lCBe=e6Mdvc>r)Rpi+boV`6&%x0e)Q~#OWf;*-@e*PDJJ3D^DZ+}Bv@L9o+n@`~F zV1H&~>%TgtK72Wz`}}EPYyUrTTu&z?qHY@xKj6!PTc1z2 zPL7^TQ*iutdi8|gj*s^K%BJ=Y_OJgjO`V<}e7$-a7yM^g@IN$DH&5&h4&VMG*7djA z_CE%!{{K(^TfYIgbqe8svQCLT%^UvTv`)=rQ{5^q>AK=5Lq#F$Bv#|j_A`pqQi9;&Tj7b@Un2E~#+{S(-O3@KO#?o51)$McThgEf3 zrx!~pyIL{ey=Nlou`6D}qP3%6Px5$^s|b&R#)iKdQZz_nTZ>EHkd9}(sXi_xi?e(3 zZf;GB@cqibla2V27LaYRJkHPfLBx6c4Arl@!?jYBev&bnq1ru?V1$*kW_9mV5hzk& zDX^#8yOLs1;?dz!#3BM}lUJ=RdpU%Qi)Wm;HJMg74)v-!hGNw7)!zC5cf74I$)y=`u1e{jLinEqufVq6v1aaiNTX!FVwc zhYJWfp;8h8l$t^|iI8(p0N7!%&cCsSh39ST!DSU5_C<$Cd;$mPy z7foU7f+(XF&p7Xk=i6y2X(leIFQ@7dMkkN0LTfA|^ma)?it}~moD{##HNIxA2rO5u z?;h18GRh1&UkaOt>_|F(bd4d3f(>|>2`Y_N%Z?Qi%9A33@i55nxGja`0THAa3!>Zn zR*G1a9_8&y4b8}+${1XQ=CknQ096$)Qti@f>xeK3Ygkm}m}JtNN)Q^^PpXpY3B%!_K{{c?z!~7 z(IYJY0rmBc7$6KkUUgRJQ+S8m%XWp^&mS(+I%Jag5A;2Ww)+Q14%rGt!yPu~vD2ij~`j)iq1b>7DBoMtA|AF1f3(@PS`)hAt>a{w69 z7u^J%hwvBqDPG!|%a&#B_cafDQbKTy1Q52;gVc|}N|8s#qhq&{CZXsNM+T;v-T{}= z6NJB2oGUzoj^M_uK#h?|L^6;HP_Y1!c)TA~=mO%$61_Vu11>Lc)>KIpm;M#mTc-Jq zvqBJiVbG1A&~}`|jnniTRR;`HY@jZ;FT~Px14G8CFa#tukhQ&9h-c^60Tr^KM|{np z52TIE-p5-n%7~NE$#xFu-5QCZJhoO?Mi-^|LaTziolIq+N1d7nH2lDI~dBaumOsb#i8D<3-EmaKTwb(v{fEIdp@5*>{k5)*6(MZUj8lJA5-Igkrf*kjJ5Fj1)PWY6y&WkuwW@d7Men5IL5^Xw2* z^2R3##ZF~_eT-6Z*|jO!7x@!safpma+hpe9elb|5GF%J8j^Q1kSd8oABO3SqBE8qD z#gK#9v?r7+w`8-J3Bu5$NV;1n)==^?*Fr_G>?)d2q(Zp4gIQ2+0BDqHlfu=N6q2mr zF{NR{O3|ra^}!`Rt}t!r$K)n3*^SskWBK6k2e8CD>-ANu{O*uuP#t+@Uz%_` z?WdJP4XZLX{6e$~Pu#BPK{dX6M+(lheuKwIZDZaz;KB%e=%AiLU-{rDQ$bEb;ZHpgvbigHCb-o(o>R0@^zY2T=OYf z5IG+@qrQn1~-Smxtn3`>&6AlM%+Si(y7z-;hYI$mIFD|cGAs~m?~;OBmRdvcpbR?27pr4|ewPi+ zJ-X^I{bwcv)%1U7ZHfdydh0A%OANDHgSY)-o3RZe@t5)HRxEgp-3HDsuE*EJ#Qyzpbqvi3t%pK;4BX z*~rG|B(@}AMFKuW)qx-!n>R1YNU=B|_fi2)L?Kq%AsX%Pw92KJfu5`+zA~txoQxja z$CedHvT@S3NoB|oI+wvhX*4uOGzM~s4(C185dJ$k!3=BDF}s^?rtK`8o(yb(0o5f@$& z74-b0#6-ajsPaJVBqEiVQs+onf?z5A*hiqPpKJtu2FU3s5_Zg<%9Nn%qP zp)%#T4N>%VCJIbivfYd*!7VXAR$>$ikZ?xfk@nbC62f7|cNB#v@&IGx?}!&axcV5? zliG~ZN@(&(_}2v7H;zM|1BKIof~k%1=K}cORs*kAt!_!o@9$)O0_{XNozcLqK|039 zR*Bl);=flZ9%Ug2Yk@{{h+{|IVJp5yvIMv0_HnYWHSQeWqY|}@7`#Ds9h^@jSOTO} z1mNDw8_1aufxX zio7Q>T%+NAQJEA?=R|VvIGbuK=}Dw6M^pC$PUBtQyko%x@DpDrBsPFMfXYh{e`v=yyEu=1Wa~CWIn>e%(;R@ zG7&|zjAX(hmxY2*Vbe&kt&M?$4q4Zj0Zx{E?k&pFa)d}kA$Ov^#tu)_Azna|>9T5q zf;q7X2CJyN`}nem=bYdm6)}{tSX7oE9H=cTTW-+hj4UK*DP&VPFUYf>j(D20%9O?` z2MWtdyeWmxGl+#hc8SG3WS~q`L@{Sv!75-Fm8o`>vCzt3p@O`J%7QMf5VEQgy{fXR z&_(U^Lm3Hj&Z=WydLR(jxP={wm#|6*zqFB{usta}ot6Yod@Gs<6-Ak_5Ku=FgZt4) ze=Y_Q#W)fcTg#7YOe<#<4B^?C_hJm^CpSwpCbK+aK?nT!Mm zRrev|o>d{fFOmCue3-=g!lIc9br@SP!B zy~_5gvbIpD%a^u5%vS@e?LopFB0m+w{5zsB-Rh`2qBlC|(Tlu6oyo$TF#XOn|IUo; z&ctf?dzG)gDp5AEc57R_epgv`2*x7mU5VHa0+E!PPFWQ2BvW^bes{|khQoXI=(aY} z##;Q{Zv4XM<-$FP>!=qD`Ei~;CilqV-QyPghKJR>V6V~0LK=o2+a2bUuB13l&^PEG}~{wmXj@kDgKenxSV3sNJNv)Ev*Bo6x-AKp}Bq$WKN-9Hi_ZrSW{^ z8uK5?X5iu!Nv7t<ii4ispWr(SxHlSg= zMsl``Y<$#dM4R_wV3*1C!Ysc^X`9CEeN-ZVK%c?vVZiLM0YL0<@*R(`MAoQalC+D8 zv>>3V#bFA8IlS)Bz5xYE*{%@eXK(%`VrDU7b2NZkl^H)6x0l@Jz2Xpe&!FrB?sDu0 z5OE9e!ST1SNM4(7u%hzJ9K$7-MsIK5dUvb?z5)m0&HgO)?y!Qx2bGW+A&KP@ExcqV zeo{5RAHs}mc1{BC@cCUnB1%jW#I5+AFZnCsz5C7PtU_c12HB}fJhK_nD&%pIATyg; z-6&e e!nMZhsr1X9Z0Nq<$~$XZluc`&_lvW)xnzS`b&Eo5t=-T_=Y!&W~t)n||? z<+pC%yROu#k<)^3IscJvV+j&0fCSoT64~6T)~K|qjUvZwQ=Rl5*xY@LUI3Z0spPIH z5w12neq7F_iDt!pf3O8zCZ}JEqSi{g&%_%P&kWe&#FqZ}eoCYVx9R*f9^ZE+CO3pv zJKO$g-XNl=j#MTC9rq=P$hYXaEEh2E2ko*6gHXb`AWu9LBm|I&5Tz3yvDj7sUQGs7 z!U+W)nb`B1X%^p*9mkvGI{FkveG#HlkA+sB51K6`c4*p@^V+9~jDUrTgWa0X+%`S? zirf2d|Lk7`l<}(051b8hZO>|RApaCbZM2STMbo`gHza)Khp`UZSC~WU`7HYff~#}@ z2s~JkLo@fS&}~4yHK@!vEw`^TA>I_UvEfDx`q$Kl_7i_b zhWB~P{-e(eUpj!x$Kb*-xN6LOvEZc>#iftS4WyIfE1O%}pLTYK=JpN_;a;`VFK6dp&sn~e%`OgpzrD*< z+#^cA$$0z@=dW|bh_1ACi8_h!l4RuKF_=}m7?F-JR8i7I>g(Qc!tjkN-kMwyJ@)%V z9r>L`4NTi(-yq&*t^BU6ivsJ_w}K5QjU!>70jFBb4 zM^0*{YL0lQFt5suLcxVaMgetP?ZK}tMW@x}@e`X^74*2I1%!W-)pg=n;o~}?Cb*}a zm8|YXxBIRlo!D3@9O-?`uM3lqsSMoWQm@1XGqnr}bBuTQFx`o-ZKi(A6T?_56@ql} z*O~f`?#7YFFYxqpPnDUyDy-PPd9i-}n3%1$UDbTFeOe%fM@{j-dbrq-uuuo>{_%|l z-S0i$ANBi#oyBTV?>=>ZwQt?`9d4ezzbEVVVitnnU3~3drg#Ou-AzE}b+zX39ma zSRN*oOc0HUr(}nY0aJ65u>^?pF&1Ri&FMs=TJ6E)a0r7NV%cpMPPXF&`$)^_buk_= z@{P7b%D5oRP@BLAX*bJ=J6eJ8Tx7b=N;)mrJyVK8K__x~@>@F^M&Uu*${d|TPpQ00 zr(}~_^|}YS>c~G)IGG)&Qwl{wM!vRD$oEXF9I7^Q4y9Uy(37TmEGsGeJhh7R$~?87 zQ_VGGENo5NgH5)$@h(&2cn5e$U+ea&*1z_A>HUIUUq7kvt#5hFzrK3@bjq1Ap1|Ou zzx{4QuBVS$v0(tjveyvNHMsHRF$X^s?{ZYhk~L;9ha>iq{Z(#=9hkgaF@3BdxMres z?2UDdt6YX!KEyvuj^))y-y*ItR%034j+Eg5?Lip1iaQg7=;C^Q68vYkh}|0Ts)OsQ zh==WcElN$^4kH+;YmL2QC^WCiUJAFAIit!2`~gCJwOpBXO)0`4rqc;99l@QBlm@Bz6)g zmKq|&_o^UVl2IHl?E*rzv2*G&|NdtKM;N;SJ{CV@(DtM#g0IJP(oMDi3U2V@?m+>G z&<;z2=9Q#lsqk)Zhj7*t{aH0Os8)YSGBy?Is4JQfYP+)dQjUX!GWs!)3;R|qX5(NI z=?9Y5Z!W36#wULHzJ^f|>ROLz^sqZbMHzyCV*-2coIH|#ZhfOnNBqY0 zHd!sh0BKxXNc7L;V~hrdIR;@y9yd`Ds=Y-qGPGZ20r!L3*#^x%U!;HnM!l=YSuTSo za6BDdEjFw~N@mh@Qp#i&*IHtj^Qdjg0FrFub7jgg;67d>J0ng{a6m{a``nlnm-nN? zAx9Ibl9M>KYTjL$1$0d^G+*!X(ZVIBIs)C#$qd5eF9)t};xPVmOw5Fw0Z)$HHYmPJ~yJvnb(*1xj6B+LoTU#)=O0P;tyE-A6G>JlFdMcdX zSMO+bwRNzMy8a>05&b>B@di=#a#v%8&BNIUAn`Q+Q5Dv@0DCdw#kmoOYE{}nsQ1d- zCT2U0t7DC-&dt`;Aeh<1e0-~%+jD;NTfqUW%sP)=S;KF7Xg#|l z=RUVI`d4-My%Az{qJ}I>HxERFoIV3$v#CHfve=eCY++_BUE9iOw|!L|sh>Jrx0px< z5V=i0KkoM&O}_v7!@)b}!j|r&^Ya!il0&hD3CcJhDp5xImXr%KZAh~`>#A**QVG(y zbkFCRh58Z+HoNxq?jgQ}p}`HqLp);S4zNQj@@rRI^_&>#@S>5a3?&PEK>_q;x3SNQ z4YzsxUFgbn?j(FKk6x#*j#G4M&~G~-oa@ItRG1*s`%E*az}G=2nsGT>uPULG#&km| zGmXaxIKldHsuSKic4glnp}$b-&mUddP!6^f;jwp%&Ya0Uu$uR>&yX z4FWorD&DqM$rvsdxC*r~^cIy_DSdIYtzPb!{h@kxdrG@L*!#Y>MSSt~rr9Fmsw=M7 z*zjYv4ce%l$Yk5K%t%U+ooF{KjB*f|jE>?INz%XHePW|ry8hyGOY>z)_5u7^UhypP z$Tp*L@VX(U#ZWkiHN)<>Mjk@oP=MT3O-@L=_Ik>6cGTE0Pv>fUg&(8w`Bx)u5xTti zs8Eh1G8aS|>jLe*hmUT(m}iGrF)pLgAHB`lz+t)qn55(n&Xe)Jp_v7)vw{81N&?2A zY2NEJ!4GA8t)D+2VKt^}&n0q=wakY?s~j3W&npl!Ea7HeSJ1@L55Z=5$#Sj}^+a^k z+vQhqA^KBRX+)-?Xe(p0Ue|j!Stdc_>z03hblsYTdGV`lM@N_a`4fAL==5V7O%&s? zAFPu~N!&R`5xM(vs7V9rucRq6yYhO$H8t!*&zG-IpRlR#Q&gWW=_af-WlrPWGD{4P zy)$pT-qoVH-`diGB;)$@eN#;$%zx6p>e1_KyzNbSeZL1(*~Y^y8zeSMqwU?nW^`%2U7@9*h*XM!v#P1BDtGVO1^HU|Z z(mx-0t3?px6C4s1DMlT1TM&ip9;Irj8*QPFb?m)X^iEE|KPx=iyBzZ|*c*WaPt?Wd zXPOW1O-QnYph<+FfmK+hhk3O}biAxMAEU5F>T4L9-wx87_!j6Wjg}r=n1#DOEI6>H zKdOWS*$<2;M2R$+0h(S#WD`TA<7Qz6#LWTGm+xW?&4i4{Bew722#OS6jXX;CA_+AN zzd31sL$C@V6?l_s;lkK%DTNv{92LhNiQZL+K5B!Fv-7UehI_z9(aY*x5=UHWKM2(q zh2It3VHYO{0?6DYFLgzE15QfZ!DmfMN@)P#-X(;Xq9>^)B_EPo9VbOfqtH?M{IKCY zOH9OWjN@R6OPnK7F;B)(kMiS-tpRY%?_#jnrWk5tik`3;9tVTvFeNfY(*c(9RFQnT z=$etRwg!L-k=M^V7*?4_@E|v@D;fI$j6*J1k%Y74ASjLAr#KPDS4_|28}w`$0S|~o zbSK?#?StVW^GzUKIM|XJrk#+-r36s4*AF$Pa1gMBH@+$U7g$G2_3pCT$WtvNXVw=eZp8g7zz$iU|qQ%z{;ifos=8+`3sn*kX# znfdz0HJDCl^s`U4hn#LI)OxT`dqqT-{*Ak>o`Zzwxd4PLirYeQun5c@y?UFJHJ+MX zQH(MWAgNa(?N=h3RT4&3a)eTVP?-l4NK+Fk)euTkgp&O`M+G0$cskPl@lyTGIXx+; z{@$o9O%-M3)$m>+{PoYJ3O`f-m2HA==CyVHbEd)@g?|V0rr{#0p2?-BNYnMVe}$R; zsSrK|m=>4DM@Hdmd6TOv{|YdzZ_ez%EmRBhtIJOddH>~DUAp=H*Fv>^bM;q2_3s;X z2Y#l0f}g23PdDn}$pJi~boKrC=;-9Hg6jP1KMJZ#xPt1*KlNW4g8!dLDZ%epG5P<# zbr@3cf6+Q@R2Uu^9UGsReDZ^TnEQLjuB@)DZ~Sw|evsPT|Ia)2+r{PgtLq=L(l__x zpGSZF{DTu^+tL3G!bpi@Mi5=VK?*WQ_#p?+5t;Q;55AQWyXdDx#2)6OHX#}?yEamzyc3jZhGD!6}|x>bp}ZnB?Wg zP}GKRVg^wJ&(PQdv#dQ=p1{JqbD_6&jl@B)qyL2%Zru3p- zeh4M?y|Wmr+ghT0J8h`#fb*|hutNh#oL2XlYo z#)e9K@E;G*#&x?dK`{wJdU0GRh*?B4U_Ox~fD^82YNPD`vMuUu)Da2sOz5m6BOy;r zcqp|7v(f%u!g;?4Gj>$TM>vJL92`zuHdnlw_^?^|@Nz3k}tcL6GgpNNCMYpE)6H}*s=n~w7{p#FXfYSmdiC8tgx%O^UW@IMn`zF;DhO|klci%j8go(%ok`Z+P7Zo z3?xL)IP>|WuP)6?7E@ZSv=fOJloKEIOu((zgXg@$29~^DYd-0roaKviii60)r#Fim z9$!F7tG*0@Ndv%_y8?3#j=rbKm+X#$`%vq?+3hPQFMfM;d-ez69B%G`>f&-Euam}i zbq`;%)!y-OG_1ThKI_OI{64we<=%cUX|oF~mZ_7xhRlRr`N(fdHsF7w>=*2uK1EU_#3NP%IDtfpYwn z3x!?it{KWL*0IQ_D>E*mNj#D$5P)qLi|}nK|6$vEATEpri42JvIP{}70mzBOj0^zO zL~;>9<2?;&a*~DcSt-v@AVFt2!ljG0+e$B`PH<8YCJgLRtW&^uj}9nP)i<7g!uNH9K0$fQao@pK`6Q? zz_0_tZc{HJ$zl&j?`~@))-Gs1ecxxsTFZ3AtIeLMenC}pjD+e_jT$6qym-9w*5>eA znxMfUcel@s%sRLAodxX;tLwP4z_-Ha7)GWK5i?LTnC1fJ)(BshvT-0Ro1K6bCc8dP zm*?Th6c=5u!`u?hcUc-8YultHo?CelSr$KBxx_QMVDQehNF2pTRnAuSlIC6Xcy>;!BJJ4}>eG0c0CCVlnKhkhZTXR3tq4yoQB%kybx+ zRdcrxjqm$`Z#gpY4S?cVq|4^i`!v%8Vt-JNp|CB&BK_Z|=)lWH@{7Z$+2NIE_tugG zM0|yJd%&@Mi$}&dVa{uPr8Aubu8c{J2>lq5; zMIP^-G_*sIeWm1ho=+8*SeWVDSp-=hy9V%fqE_{&1oN5ipjj7=<~~LmEgu!7Q+XCv z%Ilt=7#HjKtxfO3{Eab;bEa?mb}O6%dc!`Yobqee2GFr*ql)%-(3xI-R$T@+$zIyI}rbwZ8lj@i(lV5XNHydknj z?RX9!X|;7?70SK_He07~d{QsxCd|uh)l);4qj8DJ-pY!E9$NKa+v^DHY$huRWT(OH zW!NnRXiCT8&mZQZ-trV3VXg70n|FdjJP1}+M}Pf6n}RNvmhsP=ytQ6m6d$K4PCY$t zEKw4~yU?|)8#UUD%L?zPoudAA7Gv}7{-YjQbGeHn_Zl?LkD%{5(8E;C$e+DwFZ)dQ zlSW%a8sG`c55-ejP6DhJ9kkV@G*DLGj1|U zA!o0qq2rW3-qrNA`e*z?&jukQ=&%N*qus>lM19+L^OjALSI*MYl|NdmOUa*eqs`3J zC%NZt{5oO}!kX|mP13^oecY^*USi@KRZ8>wMCDtD4fS4q(=VP=oey2iu=&Mt+uvVI zRvzal{RA%~mtk+Yxa)7D4Qy&Lc= zA=Z$TCj^`H)Kxg1eW`cf4UL7y`I~)D<il`0P-alO5{KBa7Bb*eP*=(otaQ0)B9inktHK)Vx=tbVqf$tR; zzqGDmcA%4cLgZ_;_G$fgqd9!uHR6~33WVs3p5KHz|JE|=LE0-M0e^%Q%m!Tl?NT{p zc|WE`kq>g3vY*{7TNGtKbM%(Tckc&~AHAk13+O+frS=S@Vh|=EM8R7LWFs_SehlOi z2qI1KOA6LH&wqZkDapWDX3t;fXIwxij~VCT@WLlNM&p}|_A;&*Rj z7_R$hP3XR1^I^6yBO1|gVeUErle)4?qWOyh(8PkL z(|bp<;g@L6`lRr3F#?f%SK;2Yo&rnCGX(nk_YR;^&dEl7vJ!(L{ir_ENYqv}7b_X0 zeN$kHE}DdN?obr`gYMb^a+qz@*pc}af{M;<^v5OO5}aMGZp@N=%nCGStu1C_B?k5% zyG0ngBk&ws6c#nU0-p1XJ!y+wvxq%=jJ=dcJ|>L2)sM^Nh`Wcz-FU?OT#3uSj{_XX z%?HJOw~dqM;Ji$WM`@2oTaCwfiWi59z#GKl8YFP-@;LSRQ4&H@J?ts;c)-XBl!A#g z$MKsG_}C=oIWWfShXnQQSU`!p@%xWJ9mfYa-Na&#j22y?TQx)-$Go~kHm_F~m-a2a zz_Jxni6tQ3f>d~#D(#Xom_kxs+VcW2`9YqDDS=q54#l}3~h zq@{s92)vt@i2(axz(YOT$#LE!oCu_{G9>%& zJyTm~Lls(#;UW@*MqaJA3O33Jfks|g9AIFtdPEy=RQK{I$OXqoK*tC(2E_&4v{2pq zfYbmu5&#?{N2UUVSSakpXddHWZ)Sl(94%2+zhD*?cRC;(Jr;=15Rs^bz@S7y&U2k< zER81GN{SPnvGPP-aU3SL3|jO;`&#dUZ%!%tkWO@nf!*)C`X+RJGz03Dfh&`J%t4oh zlzTcFeolm0UN$7ZG-67x z(Mmt*cRQN_;pVC2q?a)51=A6_M9yN`M53G5OOlvpY?&s96Ps+#6kClDz^}1z@|Isv z0s}ip(-fUQ*kyz=p_`3)`Ipi4%?4FwP@HL0WP5$UAEWYU6z<*0=!1y&Fy;LvR~hYA zA!_Il4+-cr41Bp(*%MhHL|uhEh@Rn%q0CLKte>Cem0#n9j@rOvXPcJA`CNT)SqyGV zm;8=`M<*2vsHvl@$!e!uxDpf`sa#Pf|7un{lYxDEgL`p;9-@dN1$`AXlXz{Ji#v?| z#oOTp1eHdI0}z9{{@y2HN69HOF3IbqjB*|42|Ris#CM^)?=T}fjd)1cD_ zghIVFsfar>QTRfwa%D7)s_v((8AkHyh(#zqMtq&&zDz6&1e^z)=jiE=@c5$FnEy5W2RO}R-MSmp|%W+QGdY- zGKs9QA8#qKYn;X6%Knb#ysq!6)T-J5Y6#{+srS*+ZHqE(ot{Yn)CE>JA2la#wHY6@ z=76NR*Db;d^xJ6+C#4#H_Jd`J(gO#wcaYi@mRb{iaAI2}1Q9J!bu8;gq{82~ojbL_ zC%3pLHI!!JNXL6TmSSbdcyy7JLbm-IoNM4Mb1Eq8tTQ^DZ-v~pKZu`DEOK`*yy{-^ z>0Zg~K0vWJTkAUe-tC41{>Ssa{(oSRKYCe2O*yQ`1Vbc$a^0}$u)kHX2H1dDao6uB z{j%cHf2&}BmzZk0I{)#iKQP`j_&ePVBPRdIFbxj=Lj{ACm|!Z{-)m#PcgA4#rOow! zM3?3lV7TOWacSvq>uY}DxApbU(9+cD@$}5}KYXw4lZBnVh1;uzr`vy`lfPxJr@PHR zve)0H*Y8LE&9B=q&1-LO_xZ2=)8F*u;NbZ9@Z?|b{C^(#|J1wxI9?CmZvUIY{{IUv z{4gw{s`uYx5mo*F0gL<(xo*w>5@XW5E~dH;)GN@xyriNIG8C9Klm5y;jpv6&yj_z& z5Ozbc=IsxJlhneLjSvu^%CGnUPg-uGzqirir*P|q0HZ=Nn&0a1ZLHka zPc_7hqd1NsRiM_P!1m+e7o$wMGV(VC#(=U()9h-KQ700VA>8woX+>*zv09+KSDz(5 z{l!EscrqVGO9A|NP<6|{!3an!z-MDCO8goaJ(@_0PZ^9ffxwy0m#!UZDx+o+Y+9@) zdfS8qb@?i-Ps)OsL71-c6WvxZpo_*+5u=O+OZiQ$_JblkUPi-q99tqZJ+gQuoQj1M zzH$AT83eC@65TnnV#FoTQLw8iX^o7UP(+wcov7GC7?V7uy*idMCs1ycYBYCk%5?p! zVUKyLy8!sHJ{mD5y(*6gUGx-zcvMJ-cm9CG*}LSB+ZSS^1k3?H;QiYdqhyB8lAn}Lb0 z7w?e#f)-S~Cxf3=HEkz-X7|E4aS_bZ<)v8G(6x2m`taeDl^r!Q6WX?W5qJ@>hJ4~k z$@ny+?UD?^9;%04yTyy?ZZ9TrS;7i_mc>@ZSzLPHbQjmQ6n$^a zq4oTJ-RX0+d$`i_+sT!T7P{>>AMP&!U%x9ZX^kcyG;OaQTG>AAM3*i!p~fo(yP0?J z`Jn^KOpS5A;EmrVyw%*>2x>_chU+~p&g=0yL@R6nVYP}e2ERIY{*DGw+!zuZr%pAV zJO&okwC`0RWhe$FL>2j?Q=Cm`;b0|$Kv)5}A$X9aA79Wf`>FA`t=VX>JD*=J1eyBX z(yPYxXvZMVv)`}1928}&z~09J^xO4w&{ z%!Zx!Y(?;c1y}>t6Ei-7S;&L(%Ti`Po!(3M65QkF!!wJUd%SI5P@Ll)lGLsX9~UV2 zl}K1dp`3?kX(55xFAIlUmj^OZ8d>ZQ9VUx*j20B8Mm6^zjvXwCeYNiI{UvbdD=S9` z`YIWL2_%Dd4gh2kx14g31&9Qm8-85xC8T}=z+;)hr~V8xnSx>wXPG|7#dMjHs}P8M zpREfDGQzw7bIJxgxVX9cQnS3F5aNoxNLU>+=x(EfuX|&Yyzscor~@6F+TO?3kuHJU zAx_wUal(h9OL(v;$E?5CC8LlY@HS{gomET4&;Kqk0c7lnVKX#cp@5E6l+q__f9?Di z-1+tJ@gYf(yUNx_2X9nO^0YE9z==;&r7y9>#ep#jxXJNAfp?OFB56#>*gqnoK1w!9 zsgodxd~l_ltBT_nabD(Rm!bObBC24Z?&x6ciQCQpCTFRlNJ_&FHARt)lRc!Imc>9N zgZL`>*x|GC>kcrJlexZ_PN<4~*?cN4P=H2wi8Um?S{J1t#pPL$uDF3Vjd{l3N%R#I z2TO3FXxO~G%z=qP5^lIshAW2N))L`_u!CHn!3lN}@%68R)~U(*D(epjh7sjUun!6g z^dle;OY`%mYzoAjvpy=4Qw4>CyXq$Rsvl?&ePcAf_>hoMQ$Rl-^LGSGTnl^?u_A+r zgyh`p;vpM2;Dpnb?R12^U8USXY0u7<(I&?gS%4q(Mk@>U*bqB84T}=+t3p0PKSM?+6mmup)hBtT6d=e%ZoHPlb|+9HqutV_ z(fhyR>$0Nq2is%9>$PvkCeJ>y^z`#Fh49*RN>^`|6) z^&`$q;fNlQKs$tdde;6)sVP-#hfKTDV={3A#m*ycEc&3*<}Rp0KjaR(X&%GT4KKKm zrrMjUeFTBhQI?yhH`Dk$hb5EUE<2w(KMllSnt14n zv*QU)iufWL353h8%2tiUebYiK88^V{gcxOy zMxk`i#AKUY62b^FR)2)rrLL@|Wy1UHv&^)tWtlk*`1Ug}Dg8EkApg{sWjPRK=3o(t z0e?!vwZ2=}d>9?t75xl#NqXJG8~G}A_xbv9M?CgZIB}rsw;t_z#0TVT=9t5?W>)sB zx3`kDKaPVgLwqwYY|DP6w`-Pm7%artt}HY%nPPUXd{%WwP2D`RQR`fjs=kX3*vO{f ztKK+Jedt)vK7ad(a4sLBDI1SW;yK;9^|ZbFyqmCtNRpB$@-)u*WuwB2Lcb3gS`&4Q zVf-xw31_i`TJ(e07T`5;3Mb3QCo=25@MgVBTQm|r4cL_;v#Gb0_*-&O)VD;?91@r~ zz2y3WQ*tnW~qYr6K*^X1WG7`lL;x+s^KGT@3lto`rfLBKhhr^?n1)j~OM+|3I__iNob{{3j>Z1@_yfx}=Zb4C&P}WW> z0)04KlcBfOoQx0hct&_}58PN69t2?zalhvHIrH!cc(Cr~=!NCy3uC1_~zIr$39rfprlRKvKeT!##y__j?q%~cuC#$Sp3z=BT=Y4S%|+6ilY5KLbez1jIZ?2qLig= za9+-<6Jl;Io%Xr|WfmEgXcpx5z2ZvFF<<=+5u&{kQh8n@+E+ww!9B74S+Y_ymmmeX z;&{`x?-<8@xw0r)J$AIN@RfBPXy5R1XcqP5pKEp^KkgdV zfVmM4nyO5W(2TwLYeTdawxrJ?5mvJ`ixgZ`AK;yjvX;dJK*!vxk;oIy<3!gf#WJwNSBFo}{xoN< zwZ-=iJ_q88$e~Bo+k#73*67smnF4@m-k8sUqRot!TTmOQ)H1vG3?lW{=dIH}RB(2b z&vP7iu}0Cegg4+#lJlr+$?Wtcp+Kdil$gqU8ZH>27@Wuk3`FpzZX)A7U8_)-htggDbvny?;si?Ag7`5fbP&di7W5Oqy zKLU+^D^dP)m~sHr>!$f$k>Xng=W=FbM_pxaUALH^Mj1+DY9gAz4A7zzTxsZa*lDz! z*W(gMjD(y(Y?c9<*SZ>K4v(Um7pjJi34dP0`e`r9nxZj?%`IWrs~woqOwn00(2Kr- zfr-Xl@AOHPxlf(3n$QTf__|4;ua8Wbp?F=mZlyKEru#bVS=r7T6h%eKdWJ!chE|f< zQzcGx_sW8=szi`Q@+ni1S)d_g%N*sgXVS1MahAhm$7D$B&4UsRBHSkhWf@^{up5o+ zEWI3?&4;vLS!nS)-4gS#3{=sds4tC%%9#3_gzFmf`ub;wDx~2}l`ZE=OU-f0_|jUU z7=$!`qNSQwg{+2Ap>gf_yaHGCV!1S97j$@(fA)dT7&m{N^{9VEr*!#?CutqKjshES zYJZ~oBeIQdh|UD)T^_MbX&Bm=lFaP7Oe^n{F8#MR@F1 z-PyDnk`?F!D=VLpmBTx_w3)^{UdSQck19nB^jQqzR1~2W;>n8cnHkJ#X{z&B*toBt1X@ctgb`!u&X@Q0!OOO%;g|67z9`CToCDKao!28PjK zw@2%HllND!^P{P=KC%6$L-mZbfk!8#aWQ~TcuH0uAC1sav!flTiF z;UsP)+>v;qQ8h7a?zzP2!9RybWw;4qOPI-GM3{41Y0FDVTYK@t)3|CUsgqxxzW@07 ztLH5JY$#|)DvR6u1WmHt`Wvv@`xIl6&}<6!hD6By9fv`|tb`&Jz&1EIwcVa@&Y`j} z0wZi%^oTtR@DMGPz-$!b>oR5fDW`oJI;&*=sp@)920$W&7C;X*)OP*)sTittH)$j6)771(3P7 zr0hfI3pCEgrjN47N3Y&|qoGJ+34_GvB>|?hmC$v^kzH3lZsth7;X0~6RYy{7!>LhUN>q%msM$AfDjn4@!W$HQRsN5ZIwEz5=_0DZOd(EYw z=e4!hxr$?KvC((m;ob|i6dk^@PL z@<@*i1Y>$@>2gtLHO(Mcw~GT2h^%MOxK2C?k@bpF5(C1~YFzrGIIKatQ56&NyY_t7 z^cgXDJLZe8S=FU9AY$+emOQe!3X{*TIhLM!NBL2~ zvLFsfi#EU$ofln0-9KOI-XM-g!o_^t+8MdfWdwI8tCF6N)civoo52^>_a`PAi5$BHba z;1qhRq6p1XZ4Y=TtradxfI0GM}X0elsl8w(|$h1P{{;;HPa7|K|=u!6z>Dcs{3Or zo5~QiY1hY!1F4lw5l1!g0h}_DiW+qcCrVMbGl_7&&fgJZ7$pF(8E8aAO+zukkY?QY zL8U8pZT>6;48b;1DZ+e&*t}`VM4mndMXN~TuE8t711fGv0*%uQ@ZB*(MmV;pl~c8P*J>s z5auN@S{5jzVh7;}N$UqDE&wD`sw_pL2tH=fp1vq22`LMe@tru>6aWCf;nfAhjQ|nw zFY}d<>jMHa@|$Q7dffzy)b^9C+gQK~8&)%s`Dh?flsP89{xP;+xVaRdH5_Y-a-Gh{ zEFSw&DaA8|Of2+`$EMX7Db4u&+D;p3vV3&zVeG=1`6F2k`e`$Np7&H_<%-{iqixxe za~zeA71I&X;;gTWiq|P$Lp3z*4691TKcJ}wDQc_qCo2l6z=Trzc2afwg2${kRQR}~ z`Kk043eVj#^hEx3AjlPn6}k=hdc0`D7NM0VDGr#{i1+Z52SP&dnOP#mDpe88*E)>v z3GunUr=Q_dP;Af$J@#So-S{(TQ=+^+>VMzD8*#{Emiv?60HKMu=8C0);mj@>tLvS$ ztHR9BKz>vzWIiIpV0utA#UOx9A%ZTL1r((-h;KBTu9}QvO`gAs^1X>)#VKQriW4_? zHO{7Yr2wCxKKU}DwjFx*_B$e@Lb;}P$4W~1`={{DGrJjN8B}&pWKQF2wt_AV)>>~E zK%;ll>mXLqWIR;*`hD%8=W(*u?;+D9xJR#X4X@T8NqGxI^4PmyJ@%1cBWiauqz3JN z{n?$8*z7UGqrbG0BTZjCCE$AN1Dr}8qoCUoA=W}mZNUPzDNzN*N=x#qTLNhT3 zNOg453UmYqGWo6#rJ%BgpDCXnIOIX@m%q|bHr95p;3u{>hyAkRuu_^(S}k4&(2=(l zYLrs5bhg+;0vl0_&D})W5EeA&nuJsADpUjA?|h)NgWM>gO8p>=(k8S1MyE(--<_gx z&!0>=&aw1AcQKbMD&%U8WYK3JNzJEjDkv zRU~O>;LPd?=&E8_GBC=^n=Bcv{l!92FKTX0Y`nH?oa^Mq^o>tr$7Rz`{@HiK@-o{+ z`;)9Rw#rt-YdbFA(Tw4@YVxnCt@wq@r@yU7r<7DH?h>y z`rK=14IoZfJ=k+dyu-@S^C!Hg$(Evsv9QRkV_L8Ct>jaGVJ*{1AJ71CZ3*$^*S1#U z@%8V=W-uq9Ex={kV;>k|hPB+KC`42(tWc8z*_}j52E99a-$df7Sm!@u(Dk`maKF@V zadx6~_K_7$rU>G-^_PbRmp0;2CDDIuazh`WUt6Nbu#zNjwVLvGeo2VQXv_79%l%_v zu(?2JzySLXI3WW#9%VYJH1!Jt__ONL8x9A`i27HE70qG9eQL2x3x~aU9KU*Wd(_6p92j&o323oL5 zx1)&k0;#Z&!AJ;?+h>*C$FVAn7Jv5E@%2^=T)~Q6m%K5t+=C?TaaK-YRm&8=ht4ESDyM zZt<+vnUw5i67X<#vChZgS?`ry^2vQwZH3szy0k`s-@zN9PcvCfUOqPrxHKBMY}+Op z{3v3;oE0ZP`Y`+J6=t7uX!8NQD3)#Aob5n~Y5^|ukzRg!3W4w*A)ggFJPPU(WxRr^ zd3Ult9Z%FusC3$nk~N}be{#MMjchuFH#r>HC&2Ru6MBNsH^@)3c5;$_rwftRj8t;C zQj^w2=GL#gD086Vxth-JuhZ>Mo5L}-@^GJwV8if|fqv}nG6qb^dcaUlMC?@@EOyGA zM=!fcLcOki5(^K*TvxWP{Bpd-{R*43L zOqENXJlOGnQ2>5&5@Wd7t4S-e;D^cA^9vN2i7FA|F`XJ8MeQLQTCt_gSvDgcv~tQox(#l9NiZl7dxn=z6)*St!u z*;=D!RFJM(Oq`*0xE8{hT%%s-sNI;U?F1zc;_)IXg`J`}q!Lxn2~jXS)?tySkX-H^|sjmqybw0<=!SB zC?a@%^zZs|)}Q6GqNc{;vU1p^O?heQ-|>urKe^?a z$444~nMg1)0K)>?Uw->YqZ31O>#(fy=*sfw*2egskjDJN@3Qh5%u1StUDwP^|Guu7 z-#-3($?WUG?*6~Ur1f=}oAmF~nys&}j`H^RyPeG~SV#HKbPj{*w&AXn>sNe}8ZDKWj)@|E-3!{TrP8E2r_dhP0u6 z`!LNnOG!M)hg%SVG=f9A74h=$YC; z;X7y{T>R`UC{H^#>ubW*r zIoL_yzL#(Ugkjy_Mt8RxnT#;D*8DT0z>zP&->`%ewO38Vz*DO=`f(LzM-YlHQ zkb8%B@2#tO%y?C}O4Ll($ZmY;=7^DiFvKhRIc^#76dkW9JDQfTxMy1+G8J+Yz^81u zYiYXrlXf4fjs`3i(*BY}BM9eq9FsZdkdB@;@4GsYzL3R#z>gjiM!=nPJ_r>g7V!5E zJuNCn%l0uJU@-CKvs3kC+mk^vr1V+YZ0?KP?+hW>SsZ!dgG6_onpFFVb;Z z@-ITEq-r?MLb+($epI+jH>QTfK#hKGyVGvUJQjPbN84j{cTv@XL zL>(IE5T?AD;8}LKnG`szx|!naw7;4r-j4@arTk)k;oL;lh&3i}a)3E{2|2&@#KA$l zUDQu1>t9l_Av3i!)`J)4vIu*dmEKR7IJoBU?xu3}0YK5p={gXjhM~GGc=Y9@>H}k| z&KjA=<{%c^qv*4WDcW!hWAxM-GodK}+nfAL$_8-eb<6(Y|e87 zL)u{rN_ZWMtNAHlmk&73L=OORdXutHk61rXwkmLy8%*d%> zTxp50cW=HnA;-8|vj6I}mVI{F{`|1z^iJgINdAhr%#J?#uluRoXR*%k$++03`v)I* zNB=|2m#2U2>H)tKh`$@G^*>$v3IvDuz9p>-SQVE<3l$G0==TOCVWecwAS?`?U0R?u!H6m$=b1s-{Ia z9GV0Rll4T3%9Q@b{FNx(LCHz44mtt8}wd4(EtSzj%{ zjw`+zO%DxlAY>e(3Mi<{AFiVUxl>4Cp<%;=ffl{uTkz;S4x!0w`QqwyA*3!>l=T2w z=@0`s8+UF*2960L0tROP>Iq9g<~GqA2(!uRLX_yazhrB(=DU`rvg3tOann9tKDFok~Ec8-1r}rF6+1UpWJOzRm zTG)^T9|f6dJ#p2H*6tFW7fy^2n9R>`_X{boJ^TAsqhKnMc zpjX?zSxO3N;MWAYasYs}!MQEvfxpl<8OU zRYPR>TyMr>-ZS0ste##A0dMw(julTDSBUNf$<|Rk?a^MUV~XdFCePK zQ#V|c$Na9EpM>6;3T-NRsAaaz&t79B`bPhg1i9`dZY5lq!!`4~+*A+QLtB3ZAJWUT#at=b zsxtQ!;m@qyZ9C{*OJ$9j?0pX3MoqI)yXKoHHQrudU1`b#M^6d)Go0W3z}~brMtzbf zz{TO+#>c>}rTC0$#|1lH$T(ijIH%hfinR(5~o>I4^ zJ~)hTN_sqn34H$fLYuS3LCJ063l~5?B~4PX#A#gqMwGHj88&=>q}6kOP@57*To6Hw zGTd$%rOI$psnOPmG5D4K@jjDMLqgf`^#tPBOfF95ROR&RF;hS(b~5cH&%AI;Vd_>^i1=^+fQ30Cdn2{ zKcFBCg0jMyqT!!*&1ahmA1p2J0r7u*-a2pysNStHi>AueP>zj3a>i8%?eWZMOh zx9(9OF*qP4&@Q?t7{e@>a71i!2h&2IQ6C&)x58+v4`;*eMPhZOYq0A$mnTPj!_&Kh9`3HrG^;hdMG}&a_oxAZ&u1KE5a_vie(Mk0 zc%T67@x`nGg7kFg!V!EGig~U_OizkbPdwuY&Eg*0;&gD~;pIYb2Mupi{8z3&)XM}* z<(XIv#+h0>rz3vsmT|%D)xh(2t$hp<;Bg^V*DPELM?F({8TYwfxMC>P@hR1bD9uGM zO>{ou44Ml3Ec~s>!IM!&e7f z38$98x;F_E4@X2KvZGc+n{`5?M@BoqWS~xGl7N7yy_ub4liTr#z?gSMerI7HGw@wC zO@l%-wH`|Wf+13FX2t}?udnza4!FoO;;OY?a`lYVdbe<_9w5XmXD&HlC8Ks!2|$1$ zd!^Y~49|EqgoLEj^%Jj4QG1pMM7ME;592@W(65g$EA@B_4ry zlbry>c_5)YIE6e!l)TGFCCws(^Duz~edGWzs@t6~3qGcY0j7>yerhP@t0(BusNnn( zVciTC?kpU6Jcz#+$lnWM@-AQ*1F?HkP-7Kx{N6u%E@X6ii@*a7TrCv)UijY2uh4>m z#UDO903sh>q*%c;$U$kJ`1V5GV{0p#+?!YumGKfX(SV2^9MWu~I zfqPvfp&9obT>NG=^=SXygHstT57f&5&PP8uMxNCeI%je+>~V@ z4+z47{k2!mD>}D+w_Ur!8hVrHv?n8lYcKlwnMZ_Id&9r%d`pmhIV<=o<_1a#7>PFB zw&Tkv6g&}LToRMA;Z~>Tb^!aF$mDC8RuaS{BK zyc(kc^}s~TX%7-oA7b`(b4GrqC{vQmN{|DGHqpy${%)mj!tUN8SnM_aEdo$SpAu!VY3Cr{S@QEJWRXr zRUt4`1=%}BqJ~hSIL@=pY`sWpt4Ot@qjJ2XYQ3mVxU>F8lv)9eC{DTWG0weV+0Scu z%DK*-akgGm-Gr@>fpw-Nc-`p?drFU{QDK_#%CZ$FlD;dK*>UQvFvBGA;7z6Sr0eMS zQNf!XcB`+T;g>c6vboWz_H8@x^`6e}I{P&1)G|7n(OzIM_S-1xEay&I*nQ zu9<=fQc-hbu<0zACY3VS1DmbSYO4Pyx#=$IYAE%>JyQSW?9WI&?C4|a?rP@d8!SHaXEbYm`|HBm2JH0X ze=(?jZ)NSB!0tXaPj6w2=l4+7m#@2j`ZG8GUdh_O`Ehpl<3H~{E)S2dE-rp2X#SrA zJTNe0X7}HN88iF;dm@ze{~|(Jt4CZGa@%n*TidBq2ilp*PB3$-Pec+F_4AB^)J^fR zG{BT@Ffb#d^+Wv4hCrFLBszzzmq^M!f;1L2=US!Bv~~oj5bMZa6JUnS%cwCaeEW_3 zbFO$03YntY(U1|?s37n-F<5{SuxvR>^$)8K*qhHSDa>Jv5-3*#^r9W^GQOMk{SJGdmLujP*0Ue4S}Wb%Y109Rj=>E zi!YfR%GT|6lM@Rf?<$CTG-M?xS3T?P-IJ;*{mcixnY4cpeD}7RYy0%8jX~B<9^Rv{ z79Yh(9cyB;vNj_L>QfgY3lnE$jIi)zUEBRP`$e`Ze{=M(>U%aG`jpM$;L`H7&)g}P zKN}J)@;zIh$NQZ0vEXqim}K%G5H=}7eOxg_fmR9l6V6f;5C!x~_g%Rs-fSSLJ5=6h zVW>bHT*Xm8jH8yUuNYa&pbqq}Ya3Z-PCytKjG=2F9QTWtNE^2pU}cbg-)aWcunnex z$9h&OojfG@xC?$DXAu!Ppyt?b7TD#cQ}r4Hw)tYAAxUJr?1`yJmRmDvW=QtM)pE79q+_AU@7+k^EuA+=U~s!_CDE4j6*zEC ztwBzkYfR19@wem+vEOZ`Usoz@8Q)b(7Be`fV1QfsQ<15Oex~$5FA|qg<&93tpV_1> zjRuFCa{>#8S=}7QKU2UVH4JwYIdNf7(c?JOm8O=XNC}aqn+!drT%FAHx*4fSK^a^aA-G$z?KW!GFbZRJ=Vedh0^*q%o!iTz z%?^A~<^6%;F!b_sHTlLs>Rb!8#lyJ=x0R1VWG@addQg5Bf?M+i@18mXgMZZ32|2z{ zyAe@JD(CA!*iqQ_*SxS7(aSx<@%hHdYDFfBdJ1_0em}eXr=zt*}?W%lQv&F~lBmLCr>7k=D6)yTe3M3`7lCN@m1Vi z8?Y>)V9~6{-Raau=q|0%< zH<+*vz2+M4+T+OfiV$PkfkyY1AgLfs+Jam%7K(!L#p;42NL9gmhCm3%vS{EIoY}bpgTMtH2XI_NZP5Y!t7-FM}?` z7GhgKe%fGii;h&4*&Wpti)pO5c)oJ^0MU`F_$l{_S+(Hp(zRz?#`*9QeuddLPMI5H zgunKqog*|!0{YPPqz=dU1DTP^Nn??E<)yFHQy6l}Phc#Y-?1U}l zUzzfZ37ECfZB5Jk_lYeRv9*U~B|+aJs@P(*48}u2l^J*?Hgczu%PM?L)il+1)sc1c z1@4+euURSUoTN>T!-UtU*2GG|nzfL))Nt~Yz0HM)TODRZ= z+X#dh$(YhQk*T8TQQE@4r(=+=Suw9PB8Qry9k3k1y)bVNcC5`_MPKgMM1tJEI73)N zqqJ@ol)sXV=^8^{(snc_zM!dfM7&Ti?zC9Cz-n!Z+kf*6_ltx9fb`gJUs(5(CE83| z)S{C3#k(-MDy^tcf%bvUwTMZ}9lWSVDKhmmyMh^b#14VPyl&^OYl<{vnWNNCDoJs` zMO{ivqR;8ss|m}4yR@I-Dn(|alAh-GhO&S`uxD%K3p+5|x5fIwY_8;rEGV;9Ue=?) zk-j_y{Lza+mvvsF7TeErk2^K+WM%!ZLF_37nk2}+Yc;f!PX0U#nDn8>!FXWwvw?3t0_~NMntD7oaSt2S0saKqC$^2r`#n=~q-_3raLy)WBjC!rKX^ z3rD1Z+-+)Nq%mDzdeX4r(Y~<3!2`xUnljKWz>G*9Lbz9=!qb^a4F5-CC3yTkyCX^ zbgkRY+jS-&UnROvc2X!`&4*l4Ijc+lpl48fn$*d3%@$stq1ce0ju1MjnT2KSUu>OJ zb+HjMNYNE5fG63Uc>nfI3ZXHdveW-(sh>m^>x)I0A$10L%|8 zdGa3AQhH}Q(-_aWuGLO!J3B0EMp%~#>JlyIzHd9@ah)EBLBP@y=2=0Z5vd|weD2{Uia zY*kO1>|$&JBcyE+EbV>5L~0r#@wl4TeC)(v1JW|2g=DX|W@{l!*YMd#5#tuI@O%nS zZGqc8$l*;;_h6vt^t;<|l^BSs%&?vu&|mdd0O2+y8!J>xA(Yf2bexm#ZBS^nfWMJ1 zI`{{0|G*M(Dc44cFp?Km-Wzt({k9k3ox)+LXZrIBN@5@UFn>YxchuI)dSvT`BzW4G z#E9YBR#2~Ws3#ch6&JYFm1^e)hQ1Ag9Hl^2NlH^i z8QEN@FIouat3Kc60}L`o@6XrvxX_n#p^lF;YR@1-&jM{T9G&C ze*0~)XJ@f{hq32NWCx6Xi3fa#OWI1?vHRe-i#FcP+qgSlmG$A+v~DYlbFJujUqfW9 z9(*;L<^Zig73hJG8lTo(7#o*B0=XvOG?2pCeT z%b+GLaamSCRm9rZ{H=^d?6q{4lbiIk%!N|Lp~+$JymW@Cm}LSNu&#)-w6tHMaXB#! zADMjy8$q)+`%#kZNc@3ED!+Y1(@lzEMu^H?h^v9&&!I=R_#b9PvxcL=+T(?Gg ze($b*Gm@Axax&g!`lY93q!$@xmY`;qW@N$!qkVe)EAKM7w9We4K)teI<#!AN0s(gj zSt7R1kTSJyLpLE`wd*|H!B&L)GO=|A97}`ni0wBF8j{NKI$HhG;%CyciaFc@mTFDm zA7DMQ29cLr;g`}jsCfY>K_q+UvSyyr^)dhwPWW>KJ*2*@8$%$5bPO~N7tZqajvw)K zKK`Ec^VLNV36@7+slZA*;`?2ht9V2NuQ=2eV^9mN1y%lv?`!Q;dJo_Cck)?|SZ~+} zJi@Mpz?#st7D{PX8?r#h#`GXmuq{es(o9Ma+T5cZ$w9twg=WEs0kp*K_2LU2;h+Tm zB34;@bYFFvwnCK(eX$M$z^TOVG>R&B`)_Rj-XO^;!@ahx3_<(Z)T}~N9pU8(zo}e5aO~R;j& z+fF^RELO=PBJgD#tO#YqmuOU;?k`cwRhqq0{Pp zHVSt(3O_{Nj-pu~g7A;>moq^O0tWJ(96Dj4dUB1d`=(sDO)R?&EUU^1%+0NN_`1fb z0pYR{;7{5og{(*WgK`W?^O+G5&5Uv_b4 zHP?0YW5FTBcU7KsY}2wZc5Ct!hb3`+xGc{zXJJVUAeZg!Y8z9w-bBR7uj2zDaDhyB zl|Nz`XuLuxENIgo6akqips#h>I}W$4N10o>BFUD&2-COSkhV=GcsVNQy8%dlfA+C7 zz6+rn4N%vmY5a+$9PMpLvkjw8pLMaGaQ=k^FLS7|=kdpgg6?)WIO?jbm=G0=9ex&U zijUkM@dRUsrT_|^wLeH6o9nXFyWHSFRb4%KISIR(s};CQ{$!k8jEtLgwPtWi(Qqnj z{mSG0+Qxkmey@d9dg*?mZ7;s$?FW5oz~N#@b|LCuCF)~Us;rf;w9C$McxYK+7;q5I zOgTf(@9kUnlao#4jg-Pi!V+xI?k}=Hcx%$R5(VPk9L(3LX0oovn#O8{;{1XjE^`i{ zv4%Bq5^!=ovw*|>=uKBth~A8!88by7qXBZ(f)87h+V6mjI*5E{md6qFrNkatt?#PS zs1Gn7v_c$`-qI!M%r2trYw{VDJs+;7>q1S^TC)tMpc{kWz6zTnNH+mVu32iAVRx;K zO|p(p%w>;PHL#vO4msz)z6BVL&Tu;vPV~=BjA=AlNGi9y*4g<9RKl_ZYkUr7ZGRa! zSyVhZI+e)|#^tWWWz87t=o+(1ALJTBkg%ZR(bazLh&heG(a!^n2UDmAfWDt*1f!v; ztx+OLftoMit!}3lX9C<=QfnM=wS;jw$8pq_X!w(^>vid@BA?SG&jEVNbG)by0w`WN)8?fi@Q_5CeI>g??59GrNvB7Iry z>g)ewMS>B(o`)+~a_cF;wYC127-@81cw$*B;EN2b_DOT|B(j`9Y~Nk>?01pg!;T(j+LV53fyB;Mi2w5`x1~dRJ>jVrh|t5XNKedKv1cWl zPH)do5}D{QRcX-Zj#xHtqGqZ7eg4$;+FGZatyrPnD9LfL)%9_wz$42kbj^X|k{r)s zVXNm;zyvjt$*EFg$LUv}mU&v5YsM?jsh{qQ@yE zl4M)Q*rv`A#vYyR$w5l_1SvDl{CHj`8qBwx6=ffgX-|Y4{UiYCgJnt+Xj5_ld)zZp zBGvr!-fqrm^HO7~EvqfscKNTudR1hYT$?lT6WWq7S@VY|j@E7X$N#|97lMTn; zjdxO6A`B8FZ@%{cztGgtp$eS3=I(UNA%(`IcMv^NbChH;=6|D4VK)mKV8Nk%mgeN{ zh5fwnM5S%UH4#Oo3tbN}a{bCt`lFt!BjPA%!9|Lbq%yOgfzY|hiU~K^P*vw>&C?wp zyqPR3=oUFQ*1H{vD-}%JbW+`$72=>ZC6@-^T(6qLc#VU9-d(|2(3ZVI&n;` zQ#5mft@`9 z$d0b5a>Z^pCF<#su@{1y{Qa%b_wrY<4UcE-g=I2mx=Wjy7oW4N0(W)z%>c5qjWics z8;zjf-?!z{c-Mt9bI+3r;;DGyxa*U0yJp;;f7?^nexN}<8zjuP%APQD(+b1j7tE7{ zSiijv82Z}c^9jYBDabTE?-8t@6~PBjhd@GMs{)k7ufP&~44}IDDc?tKgBU7sI`If( z>?Us7chftg(t|8LCr#wQiL*?_IqK=37dwwE)i4S5cz9fxoH&$*!|04<{dSDJ&QQ?c?RD7eMZ}0R+ZC>z7;se8jk^yq->3}vTn_v7abpnXgDrP4qo$Vz zUUZb*%O9+b>aV!Xis@8`6la%aGCPtpxh95G^zF2x=+R4r_=ePSmS$ZSn%;AvR>+0< z4;L^8aj099eS_8wfHd(5S|1TAwEBAHbO@To(Kcy5-+GTI6NJKJQzp+2j&iB^OBmAj zpmMytk1WU=DmAv2*T=Y@@9+#yU;@K^p*&)#Gn`54B|cR^*BI$0->1LqHbuLvSftNP zs#O!~zX4JWrP*-Tdt9a0K=0NU%J<50t-OQoaW zCA}MPS`M3YxUtliQR$Xyx8punhqWc6mb_jv7aPFJnh#|wuT~C~W`y$ku`prVl&TAL zZctCI;-bgzt8Z@ajWw$stfQMS6kP%;H{4AG)KIDyy~7>h_OmNL-dJ-eeRhnDn+a;B z*42xIJB@juj_D3ID}21Cbq6yyp(Vd@($`~Rts3y%ZA`L~AUk11XfBed&McB~8>nBE zbZpj&C0h(DjN5mU;GtyYh7=;4~_>c;J zBuJU9FJ4=jXmI7pz8~Q zo2IS?&u`E{!02XbmNkRGj_>LNbEL}=o{Jfx1xd-0JxOyuIdwwJ-d)TOwOh&KH_>3y zZdDUO?iz(42v#^ggUFafT{fjvBe&kT`vfEbKlkkQyVcsYC_zgk7Mo}2Li#y;BZ&7) z3S>MI4)2hON0h}6n2WM|mGhR#IaC~mT)P3!+z8Rh8$#w1g^pNkrYB*I#c^Wau7q2L z)RMOi6-mz`Oaw9(VZVqCQ5q|VpxEWbkFl!XX*AIg!K(+D4*UX^J>crZ`_xkDm$sdL zgu+PcC={5FtsK&UA8$Iph{<*qWtzhO&p0VoRzc zXuguVDEo}Ox5H!~_^BLJ^1bB4X3qVO$#xV>h%dH(>Jkd=jsBr9*Y~K22NR1Ix15cl z<7(LpfX>bv1>%4c-lZIiHQ#OFZ-z*Tp(91ZKNEiK5ot$vr8?L4x=+Q4_w`r=v6?Nz zHCTx+y;a|(`NUmq?QBSq@qGce^m*-!j}GxHu)@n0QGxxjRTo~tE;Al7*bL#?h2RX6 zi}3{#fPL|O0||hE=)STc1%bDzsP&71=2jfT@v1`_^uu{UEa@1mcIe=lJW3ZqC9lJuXz*4aIQjk=7&Wzr41oin5bD4fYJ%W5<>5xvYE5qI7BlbeOlOmutjAif z=eQK^zzA03!39c+7;J@6z`<+48L-MLa@ZQ=$yoW{D%f5tDthC-^^G9A#ZX*A6DOp4 z=PB=SE+XlwMW9*0WX@pTYC+4VD|dXm=5XJmX@zmZ)d+(`z!vCPWA00!WP zGTAm?70cVG7NBb{FuJXcWDp!}!WDf^&2Z}GFp?ZSD#$&O9yMAv-Aw zXvioDmAbJ1j?KG$i+9=#Ynh-&T)>sy&COf`Yhy z+wg=JVN6=(chucrOo3wjIYb9p<|*D{njAe*ek<=p29IZzqb*zR1E!`vG~ z_A|ft_wDa12i{l5y9^RM<+c!w@{s-WfJzRajy&|0Jk0w%tbciu2>kQGnfW+I@xPbz z$?x+Wl2a&Qo+J>6PVdQ+M4$Pd*&$~*J@0Q%5^>&u=VJj|W+7oyq3Fs}ZcBo=NE`%8 z903Vd6e>7qYh$ry%Q|r48j(xpY7omS=o@88hUpx$zt~|F2cbiS`c zfmAeHWVFm#UR}FQ0>m@(n#s;QG%r&!Mp2Fxgr+FV*|`!{iDf8oUkP1FK0EVJC#o{T zHkwjWpJuL}GpcS3esxV*(OFnc6j=3Xvx<26(R<6``6VMe(M+Y-B6cfkO+k50;FZe= zaV@y7W_%PxeXrc_ib&awAa({Xh6VWDQ42=`060=GXw)GF)B&^VSi4i0DoS82F06p6 zy<1jB1B$xsI15kbJy*CT93f$iJdA-|z{_x zzSVUM(cB-yppf{`%-L#3_m1s+cDcn0T05v(dg|reE#RRkpF7ZvZje^Yz5n&h%n>ZRa zR?gF}xb~2Vikb#~D!dD^XL+pR5>Z{uqy2@G&?ijGo&9Olxc($Dj+jL*jx&u=mRrn( z=D8@LueD@{zpr{#%bSO;y9zd9>po>tGF4G}3sk4W^e*PE-UW$ngX}D06&h1?I=K^= z(AbC{Ui$bdT8Km;?yTOly8*MH-+p}HOC?RwX7A5rFYX46wUwcZy20Vz)*zK(tLWhm z`NMbIs>wfx-)0~^@V~r5rBN#!kszYEwe{Je9O;hWIJ z>wJwdz1-Uqt=|9B|M{Y;VWomR(V(YCvXO#M+w8qzr%7c1Zq|3rkkz&K>ubU)`@_ku z6N8zfYoecL@U?VKJBu=9T@L$yo&u|I)PXrupbt~%>r)u2oe8TEIAYUyrqcv(rt1g? zk2%NB{c8t8MkvWYezD zeKo^!Zq2aH;y;7mLo=PQs2glXt-t@{#~zr?sAq4xuW#T<3cj!l%elb_*i+PPc79}N z=qcU?TmIhJfW_O!PYx$mR{zSjO+S&Yug8DFY%s<(e|5gF`DJNwacL2@0S2orUi}kk z+xV-t2+Ol=-(T;nZ^9oReEX}j`2GBUH`Vs< z)x-b!XBY&N)%c%6FwOrSf~ovh5KQea2&Tdt@iW@3yBiS{gHjMFdMmI+!G%r|iSM`7 zw<$$|iFmv^Twf^f1ONPE-*CRcV7Mm1?b0S(VFUFuX}JjKsTCeEPYjzxSm4qpY1B|u zGNq=JVSf?(k}g8o(4H*uf^HcC{5`HL{)n%yq0m8SihN%r*@GtivbXL4m3F?41MD^8 zW3#XsQ=LLWtBydr*jQ`r7uSFYd&aPBj^=V`#9da!lB30dcZ_bz$gbngJ8@?28%3{r z%-3PkQTzh820)su6Gw;s?$NHX$VC*@gvyuJL%h8Tyy_h}m>Ur1^b(WfLLT_=~Y z%T@z=?|hN>YB}p0ppbe(mW(Pty#dt}zE94?GM|sh^!g%IP*s zkpxym=7p8)1BhWW+oC!*5`J;sa~w$k05aNrmKVZ@IE^0qOvw`RrlneYDHLCAHdh3@ zsi4{O_FaqT{|8xb7=2=hc~U76_g9 zr5{c#?q!j0DaOF%o{gx;p5kx!fmn%gGGu~v_DWx)fn6fd#*V zfj!((z}CEKV7gUmu_#P?@$6aMg@j(l>~hI6S9n7|8FILql?oa{%t1=5xGEfT^`w*6 z4l+sCetzX$)&7fuh)JT+yp;OGCC3vww?oVgVk^Sd*of7&wlBghszs~az^|RnMgg!@ zN_^1w54X(pwRCqkC$%1P)VB&!`0z4I>M!{s4;^=6HLwDJ9HWQLk9tn^k1ydp22C10 zh)A5IS*CQWp5u-S<|oc1?j)GmmnyZ>dT-)v)hl**5205H}LV%JBQf0f;7!<`$FoU z^QaNPWs}VM?ItNxZ(w*ZT-u3BGyjloPV$Vb+P`uohaAM~Gx!}wTjo zO|~Io!L-=5eKlF9P3lo1w7-x75pdYfa09=;%q-zTw7XM6zZlILdHu-se)V^2Vr{tn zZCakWI+z(pIpy_jevG=x-P{(dCGO8)M?C;1}H@|!LbsSh17}H)sQF9J@iEF4) zSmJvsEP!!DL6cz;yE0$!n!)7m{ow@Y)EcSz{g*_;P-;nPP!Ex^z) z@EMqr&5;!XqJ2KQ&HHSJ;W5&}UWa`xzh$bXaoLd>(T4MZ~FAIgcQzQtqZw^|wfCEs{Q@Gt>poAp| ze8fvRsyq0Y)!l16h;GdoUp_Ea9+h$7y3a5G>>+jgo;@>1bf!Q%j_06c*m_PR*vB+% z+c1?gXa>h6)y;%$%9FL{smt1_Smrl#3BH+|_&V-QX|EDV(~oYAfK#UuoGG2nJ69qX zs09%-x`JMlGVlsS)<(YNB?bT5lG9%)LpavBrG3?MP%fKtyh(E$>E=Q+!b--E* ziN&1j%Y7y0RECa=^yT+Cu5Nv))rH*wj#~$24kmZ<_G7{vr3{4E(#s1F8(mDAW2R^- z#A-FzP^6p>;VmNDEm;C%X#{yIR|NG{GbY!M{Id)YT_&$TFvf7WUpoxQ z!13a&M;^XY&0k^J7AU=+V9`^x9sJb79h+_f_b5Z%Tvr%K8Sd>CqmR2f*pG>C&tgU^ zOUJbW5#FgrQA6=N(J_@a!mh(sb2P{zP&DjKK#mnPT06akwD|FPh>S)@WWg_-m86rf zU`|Li`*mqq>;m)OFt_VO2$d-cjp8yf({m~6D4`4DVF)!iVl&TdPx{EdM@5P#cC_M( zqaO(~+yAtre zwY5g<;Ba41M`G3he?wBwIi>{)YfnwtWb1CY4KYo_YjN>q?_bkMcKi;KC#CB$G)lDe9 z^zSWH^YSZKKXTf6541f_gMKevVl_NivH*1tv%dtCwTe zn`Ig9M({Y0>@Ow80S1!q(&Lqh5!#^>qz7)41mX?{vg`&@f{|c1zz`)HS$Yt&LJ$RG z&{;l&lkpvwU~rEH(c^UxZ~9}futKm9g1S)xH9`Z~GbGKy0TV59+W z4 z#QS|R5R~tZ7Hl9o`60gUi#xaE5o;ccjH+yU#>I+MU}selk^OUpnol9&zFhx zf)XY9c?6#~`g)pn=7gwuZ`=;phNU)b<05637gpR}vMM=8(}Ko@2$CGjDcr5l$vY{wpW zmvFS1`f3C=V)m%E37_^#`uRIMUpH(7qYJD%iug5 zfD;B+PaBY6$LgVz5P~0I%nG5;-9}A-- z3I#g~OMUbIKrkt0Q<3sQQU9WZeJ7=kB9#>xxyT|7kjYmYhX{!TT|ZfSeovr-gE~mE z$l6m1iD;lLeKn=X#{UU|jllsxdD)f8ETO&zd;)M-H&8aBQg1t>2cjIVR{q2@tuZWS zD+hYMNI{D3Fs%KsNQF0z2XJJeImXCt9f?H4`SMr?Wup9=W`{sEk9aryVv$44TwDK9 zdu;JKc^m7}lRzaOJEdpz@*Em*RAKOCyY8(Ar3q8zSXORgU;*hegk{tUp<7JVVKiJ# z)LJ*y4x?gTVx!*ssvg>Bp~UE8plZ}nOlD4|U!f_GNS4N%>P_KCoo(ToUFI5dO}pS( zqexVY<&}W9%hh2vWM7vslYuw`XHLO9VU*`tXBBbhoYlbF+6Cb{EjxnMQBYa2;+IQ! zdJO=%27r~5lonjipiz&H1|T-8CyuJ8pQGtyqt}2JoT_I4BhlxVTpW<^rEETh^U2WiLPvwhPkgntu=nRVY$XN+n*>cXpp|7n$)VbD2NUhV`A zfDdVpq%2#jYn^-$-K0rB-E`!+gV@iKzLJdZiRvPEhvNY0JS5bUuhyf8e0;p3jwbP; z(fn`#E)#}Fk`^R7XskN%_g;BGPv~VI--N#xL8H1+sI(%dvH@t7$sH)Vv(#a$XQd+} zQ}tSWOj8tG=z%X7?!sn8b4a#~oU;UN5fh=Or8+z^U!3*y^`R>iyy#i=K)CE$;3O^1 z?^^EceZN`hpHKLzqQYC@Em_(#LG<3RI{ep5Wd1ZhJVzg@y5;>IeB^$Dn!NBdqcH>F zU1li(R}X#L%BZNok6*dV__+te_0%@^8D|B%LiY#nFS_EU5X8ZfQ-GmwR71Pnse@Dk zGk78G27VG%7(@uIl32q*CS)Pw7)}<$Q&Z%D(;)}-gE>=!oAKRAU9?}#GI%;;WUu9T z@)KnB)s#GnYv4x3s7DG}|c?KX!#=$d)CeO|^2FDpmV7ftx{JFOqM$; zGsMhTdUE`h{yefUHQ+Q$^^@KfcTP%dPR4Xj4)*iJQms%o_m3=GldZAwXm-JA-T)(5 z_8*=m^dCGe6lMhfTL%uqXq_W}q~I`;2E%B77}{UbueQJHqFpe02193EgA=gu7!06& z+}ncDv%b&EPvJ2bLz~}uQh)92JfXAc&oFxS1kFA_5wkyLuf-=&w!E~oxVpLqqhx>j zo-k3>KUnPa^y?oK22*;&3|{{)`YzHKom_FAoW_4{qt+t1%09wC8$E4c%CBcfws^Cp8ycf4o7B*YRqN~J;HnFxKgssVXK4({m9&meIJHdb zpeqgJ*03xpe9+8S$y%M>+BTlr+31xYkhV}h?a|~oCB7UK+S|Xq`>KSuHP(FtSM$)K zrqe}T?-awF4l-t-8G#nf$h)aOf4;{bqKWV|mpcSsnje9ITWyf8Z?61dmpg2sXtlIpW3HS0{^5{g6 znv4Rrq@Gh!gVk5pnBaw~K*2?z?XTa(=J1xM?M6$2TWT!rB zTMVvuoGzy}+=5Ou2N_j{gM%zpl`dplz!LNV#_6K-Qz14;=UFU8;%FT%TC5HVVe6|l-yB|Z)8$E7AL=d&Pq^BXOa9NaJ zX5%P8{+uZghnM}(*eyoyIMZls~M8v2dQPB)OVGV3Fif5&b)eG8gYz`GZ&}QB>>-Ajf6*_6T z7d@hl+A1k|tfrkOzfkW$t|5t#XP-iQ=8N#VfTgQ%M41hbk~1p=dPtt4(y0ws$MLD@ z?qOJr5UN*EW$3IOWVbm}#L-6{J63~3Yj?Y1V&Tnl!ayB`GSo{dAUbJfD1~es;5&7u zB@{)u)?lxm9%-yCjONW_+FjShqn0||CV^N2>gH`M;#NJbuuBJD^%0Y+8kUKx=O2^s zN$Mxm@H&2I#x1H?W0l3q{CZJu`RSP7o+F(1YVFux^wpZf4n}5QtjPpU&6|feM4SEm zZn+k0zZ%qC#$03{^sVHyzkfh6X7TmhM#EGgxHw_Ddi( zs1((nKYkOzshw(|}uvoDDU`qC=%?Z2AF-WN5Y zd>~w#U?jsb6CahYoY37uB*wx_T}q>vJXZ^xN_=mLw^yOA1E-BIEb;i-7Kt=nBUq<_ z5}8mzLix1>>hH_<7nDH=*f+0mJD8NXPw|j&x8Xt=d%l1Qd%BMltq@o^B|>_ef^do` z&E7-IUPIu6@EE^aNFT}}8utV;-C{x6@>j47P>fi#W`0h=o(DcR- zX#_?_)chL~Ot7eFX(C!mrw@Sk%6oJpJ<=F&FH$0#P*|;rhBSqd+-_Dv6`e+uXHeDH zKA@MZyk#1<03F6`I%15L9Ks(dOe%NWDvVQ_sqidw;pk^7BWUqOZZg?sFjdj##@jQ7 zbkzd$!IDTbOQg@sC~dZRE!cjP2%-=v#^)RsSVR)GjNq#R`=fgW$ca9Sn|ScV9Hla% zIcT_dMCCh+mQf;rrVSLE3c$|6GP>>KO>E{-L>TtfqqoyC3CH^H^L7zR=n9kXqjMgq ztIJwaLzP^TnbWu?>}!vur*Rq-gM@z-N@MhZjf)B-eU4J%a;;)=U20M!Q^qyEFEwgY znKPp~mnuSt=fe_{bLF81!g7MWE+&QWK*cbMhs5j}|5qs#vvks)SLC;w)=U7h!+?Dy zjn;;<%8TSmGiw2@Pcs;Gt2|YAC6Ocp>;(0J9;cRDAU!E--G;mikmb-~|3@Qp5gE8@ zA{h~+8Hd28k_iNd;$zw9FqB50Izqv0kg=N)Jz->n)%UvYt`+iF5SL#B-AphIX=1o& zuUj{l#iTJ%$GrKLJIe#Bm9t>n!6W``oL{r1UqyifljjInXJ}e9{MT)e>?;k#oO-R~R4UlPVb|G_!O?Ti0 zJuLvpugpM4;~S_T4e=!;ql3PiqSRww(vp!NAT~!Ni6>i5u%q$~Dm}0R+4zfx`~R2= zR-G~K)a9W9YqSQw8uo!$cN2vs7zt^BZKw!%?EI8{LxdO&#R!ev&8(=GJn7pU$)RkS zX6E=>`fVjI6ADq2c>*J)1wn%9x`&7sNWly=Vd#7SlTG;o8W-0xO_uaGX3%%%Md5QT z&l)X5^YQ%TZbN+qp%%fOL@9Jy0Y|HY5`sB@d{Q z%om8!f*hJ3GBp@tha=KyMxA$v$pRl`RR1)K;Z0dO4NQT(jlJ60505>zM!YNB}yxyH3k6u%8|L@2IbBGX~? z<6#^?F_N3em)y=IZ4znG?ve6xbCG-UE=CO1Ydcwz)1WyujSW#8{SrHulX>Z zMN4e0upmnJj6EnPQFvDfsc1dYGsZ;kcpOcRo|M3?6erZwmJn^}dhz|+_!wY{Ikz=0 zQIsT6l)0gL353?M$te$l4Ul-7m?fB^eg4u8W8V`R83~W8!K~F~ztP%6q#u4lSg55s<^j!Y^@cCaUxxlWZ z6xTmjlGc&of4-8;swn@tlAaBH`}<1b{n_#PuPez0JNT_?SVUyhzpkVgZ<5o}Gcw~) zr9nAa`2~eV?*dYFT+4Kz#m+>qCwQG2VPjK`Hm*X;hxSk1et_(_PB}vPzMiphhtZh4 zn8As;dH2uJ)6ugF>lR$hQMO+)t%kB(1Z*WbIP?-!R>*Egrb=664S{`&n017xHM zb$LC(KwRdZgU+yNa4eW3ZOI&_D)yqc>mNSHfzVKhM3P1zK@_PO6zMZG>Qmw)nYl92 zA>39fG@Zn~tPQinlaILqUni=FniSODZ>Qs72zn}v7Av>8;iBMGOqH_K8Lf}jmt$2Q zRk)Ll4LIs$S=%dv9#7>Be+%i@~NL6Wdt%-tg7oOj%{lZ+d>OjrkhOgCMrf7RHqp56fQI za1rgs$6y|W+}r9im3~Wp(cf%Bmj`~?((l#eg|APXt1Q37%8C5=Zr%mBG$ZYjg-MTX zC2K#5;op24Q#izU{_zdnHN#+MEz`UHJ^lD03i98kIvbF9Jm}^d5Igu~Fs5EYkPDVv z`isyE+ITpKbd$|vz6iKudkaJse?uim6?r(TESdwwG%aXn+==F8Uy#5@Q8Jf|5p7s1 zbkh38Xhlqi{;w;^JmC;AT;;961XQyHC6Gbarrg?1$mM7+>17zxKJ2}`{eFgBN%?-J zQ_InQ))1E~qL7CTRVg-T%CJ8tK(5F3y~fW7>l_0hb4V`aMIa+~Sk2U7p{pG8QBm?_ z<0wgrO~sMkrSmZpo#`<`1!4YMhvRZ}73gtARm-u1gU(0dd4qbjLR{?nw|@37iulY6 zs@{5KoM2O{$jKzgMstQVbpO^qCIF~t!=+1;VyQJsVpE1Tms@mVft1+Jd+Oy~H=SiR zb1NUeb(~%pAfT?(E4w6&w?ttz>>6PQ#oeu(eE$T8!g|)-(c_MZjgM7z)*HfH57!4L zhIX!iqwZ8MaQmVv5k%y8dS29U<~~03gZF;mEiGpzv3v^lg^3C!rPyC4$uK==)hMayo0G?oNBHV`}|z@(vN?u(82Q|xx@diMh> zFkXMs#Wvlx1~y#ev(dhnnNE3sSd`{+e^l&Ib$?vd`tAOtZixNiv}w`h*~8bigPMnL zT|d4(eE)y~|MxS_?>|UTn5>MVT-E!he3haq?0KiEq6KRkYBiK-Ya3{nzc+5LHmNT$ z?W!{`%eAnuvh1pNsw#5oYIGWC_Z;l<8~y}Sl?4Zd!c=8Xp0fTfn4~N@B?Cs6vYQ*8 z%8KnRd7nC;`ig%^%F2rWGR!x1Rdx1N4GjD;W!U)vpY}f4E6Mnk-4$E)#!thgHf8WI16NDOh3Ud8<{tnE}jV>*WEv)_RDT7JM zR-b0+V6DaJrNx=A$Ny1T{Bijd7s>ipYw_{%@xP2=!ID)j ze*eQ{Rh?Jwz~IpE$mrPk#N_9x>6zKN+Wz?>qZrO$$q*yX0vFB|zrFSKAiMotJGM~q zCD^m}igVX*BlvqLlbtx*8XXS)XM`?MWbAL+Wo+d6coD4GEVMPbFfF{Fsc-t{pwNK0 z%ygbswd8!SbsTq-rMURMr2Q8**@}%N%qjc){6?0E8n_g~mu(65`3GYJY;d`xqY6bqcAMfdFEgq-x-rbmw$y^T*4D=|f(Fo#K0!On`Iv7p0mMYO8AW5$x0k`#35~`JZnKYwPRb@LrFAAja{*?qYg*Zt%`Q$B)ZyNokx=TJi{l&*1 z%f5|MJ%LJ(HC$Dpkgc{`ro+avm&xK{wCL0ugaUJ2SU(jmMc9PCh{qIt@uN&Npe-R< zj8r&eb;r<0_t%eugvr=I$s*x^Taxj&KNK9|%phMFAIP{jAbDk+AW$RgVV*f54)qod z9K9AGFy8eL8a^F}Q$RzJ-L@S!(j0m-}gV~oTj?;$`!mkXd<8_2-Xsz(H z+O%Wj=|_rL1uYP)ndvLsbyIlf^YvKt6D>BV6e4engDsU(N8Rmy%WL`Aco7ydF+m}e zEYAB0J^4_FixMg~qeK8Lw$;ob9hAO9p*Y+@YBx1)GozILv41y->TUw|qEWKwJ_1$# z6o2ELrI^-XGF0V0syb@!2#VP3P;e3-oJ{3J6s)niSNg^4Cgw$Z3h$u;drDG>c8OXP z75zecobcemid-5o;0ZBEX2=9@b;b?>d2;!pFptKNS1+Iu}~ zk@5`3L9N}a44kB%QYfF|#wdzhB%{B}tNU~zu~r9LsS%{tSiBS;^!Dp=pdyLmN~)@n z0JZ9U*~r`=AWo$`m?Vk(M<^7t)lZY^`6hJFls_@#)e*iu=KO-BC1%`fIU^13}h?YemQf-gqHIYfzAceg@@39f=C}KCB zat$V4yK#?CY$wgLADWA?I7)0tU_uErk9b&*3&0rPX+uRcEWL_EqW@=r2I;tK0VhgB5kL|V>oI^!XdZF zZwY@y5D)!~4lW$BT{=s6D&JzS9vVj!v5k$>rKM1JA5vQuPslF+%o9|~YkC%$#Ij<_ zuOX-GM){2}?nF$mv~)thA{Mm7y-!U^J|!VvmbeiV#Q&xFo%!8$t~J97#bOvRpf$k| zkW?&wXesL%j-0pbnWWR`+GQJ#6(|)8??qwVC_98U;E(_LvX+i=~(U!@zRKP zQk_mi1%rqMl5y({ttnHy9d|Q${ke2*?g+A{k{}>zkRFX`nXe5%RRCJ8|b;>W&Y)ktwL+7)k$Gq18PlAAF zWS|6QQE{{%M~rdegib{jU8Dc)K<`rMRc5}T1+RuX2I03WhYy*b*zJ}ke8`B<1!G4S z1cDGQ>7muv#X{ofr3QDKZ}&xyfu=c9gV)3jskkqz`_jZZb=0=b0xJ~i5X z@9z29vz##~=-E*-g~AJa`mh527-i+0s0n=&Y^mD2&R^ zxL8R@TH7#9Zk;P~ap}$#R-qcy-W)ID+qOX>am>%ypi7?XF3qx%tQK6p$i9a#4!!WlqT?I4+~yoJ(Wm_#u;IZA8;OUT58*nZ^S%B3d99oBY};<}!U2YEKc) zzD7DB=Z{BU`GQu;;qKE~ z`N$p#Ej}JsJ!HRoyT|6*K2I9uoE{;4_+B-&6EQGo{vL@4@NQ-RBs3pWEWBe~e792y zH^%6-p(yJ%hl81%B?*L5Pauz`ElgF>&M>Udh?zt2ZefMK4d(!3| z-YzyY9A>OP6~zORAXIsp@{z5IoV${!nQF6Lk_(PeNNe})I}yC?j!P>DUc5PZ{TL_%^$|^f7wfMK0{IC%pqm3ZhJa0l z3bDaFRZej52Z7S&o+?cNK1=)dTyImm+E zxCL3``M_%1wbUyll`vEB@MqG4v=4%L-HfuE?7_tr09q&dc_@v8Fz(t=#@SGbhftJa z*3o&SvSv?f0%RNu%&Jhunj!ZFz6fQlh)nwkxKw~SMsO>{I1BLq3=eU)VdGgXMhV#L71i^~ojOb)KsND4X$*!l#K5^8WsAG4kuI#?4G zIv3?~PyN#5D1`{z=J(;dL#483Ti(+NqK}ak(^kFU`_8Msf#C~n9@E$Cn*$J1{}Hp9 z8eV?DX;p{tNC#+Zj-aQAr`^QGp+lg10Oq)aXdT3a55{chx+Vhnnuo&2j6*T_EOPl1 z3YuLhG~&b-Ir+j8c>H73@gj)m6JkTXtM}reErALaiLHK#PXq~dy5VEA(WFaAKm3H| zl7w0?K+7MKgqIQ(86uV4-5M8@GGpDPFj9U5OIsIEJ0K9pQW#R@Cd7#*M}ADk7f8g( zkK;}Qs+9tb?Nbge=#k=I5SeOVeo@0+-lj&EO6PEB`XMDKq$P>U*}gm=h3El4xbr&< zYasy88}?`>#ehDRylJJ0tdCI^hiN==iN$_G#)ByhP!{UBei>nI>4X^(d>PwX8GBlZ zIqKqRT4DQL8EvUT*7MfE_*QTQ?oRtri)qRFhcN?$={G&_MV4M`3+SzTSlsrp)Xf;* zlgY8m)}(m<3Qg*6 z&LR#=rEs>PpZ0+7wKRo_!5txn-o$|k#2c5@uL=nOj(~egv$FIui)f@p>0Q%OHRmqU zyL9t1^+I|Ha*X6&lGLH|m*n!uij&1G^E3T2`8_agsZ{yCCW{E>=j-I#q_Il?aRqkL zL|VXT$%$`=)6~L~ZSM;{gcOvha+1In+z@6$LjLz@W36?w+%Mo#FJN{;0GFIdc0eQt zK_urgBxjG}uciR^R^-SQv)ie3RgSFpN94NKS}Z_OL#h&a-I8b`)UE;?^4#oTa$^y4 zDXT(&eV2maol(qFsj@zx$^jb5zf^2ftIgPebxLbbG`EAo)OeR~URGF@+_Vz`EOVa; zW&|;EqPaVj%HT?6Cze4DVxC;!l|2j?4luGsHs&qrg@7?rYdOzgiK$#g!;S1HXYRSV zUvp!uwb%Jd@f_@Q5DswD+KS4P5&J)$>p^ROr)TrYO8XLD#q zb9mcJbL2{MbX&6nRC9nrk_J*~3#?>nMoW5IOXf;T_OBLjTZ`i7x-EPl0#hJKBVMH( zitO8#Yx1~`+=}_8RAK*;nQN@&E^BsYLnoZ%IUKpY*wiNdI&%lZDr*9z5UgT(eo+%T z#XAyk0#S+oM{??pB=;2F8k3Kq=z|fMl-;o={h0JSLM#**XOC!si0UK-sY`h&gA0rw z7u#yd;e#lEeh88mK=IaX8mj(=)-=TSQk{i#Jdc&~j&zjoGW-t7FtY40vSMEGE0xw= zJcy57Ye(6!#tNLcU27}d&7u^H7>LZ}u=lYQL_lH|QTVN}6eoKyK0OkVB7o$in_K7w zg)Tz;83Tb(zu8cf1$&k4(`~~?4mi@M-UcZLa?M`()j-w}0AYD)UQ3_44XUp}KoPR( ztSp}Hvx2@*l+km)G0A|b(16+dfzMt87MTN9?E^Ne19mn8s=1V0Lj6uQB_MFOTjrog z`=HnApwIK5U*w?NT&wf@At2UJXy#CO`;e^SQ1J5*2J&$H32C&@u(|_k#b_&(S4-yV zaQ5>sm}DexY*^Q1xJXemvC9(7S({B%U2f4{-0p-LFw8_)M!T490RQcguc|p1p-B>! zo7lXz9JXgcB;&m4jb2|&ALPwd@4V@WM^~^-5fMfwuSplH zlr`=E*tNpT3R8Os{&4q$-iC(R7Q-bHHF#VCj$ZJ$j+1VimxhtMxa8d8mkj*(1!_k_pX^1L>*3-T+FvrLYFdD%5ES2b-YGH z&rT`eeCO%nT(e0jf~+;QmY@pFtX#&rzQw}2NznaLTH|M{L61d!_6@0L z(*PPuQ5GOThWrg-R6`8l%(4wzOW<}fWnViVMUIUz4M*OIC*%WwWpDdzx*Z?8is4Tw z8_iO4tTRjp4!-U>FeH#KcA_>y1K6Vhz_7;{JFFD@y%=zc695eL@edP(HQmq+;euoG zll?kg;ll)xqWhqYO=2{DK+pCn$L^?KmBUl9=R}@APvfytH}z!$$iM0r)YkprW-lE8 zU<^&hzLg7m7-w|IkRA~RbyS^wP@juyo84DNhKe7*Um>Cy-by~5zljap!W=V%of^yP zoiH-Om25jEcYaGpCb(bI9>@-b28Brsbv$c?8bv|A-TiVpW<-E@&9Oyx7H3QaW+|in zb5bIL^~Pvd^lZ~r?`Y~`YgP?F4nF=_C40$&N9Q11b^@zY#bYLMFe$NFUz1Km{`N5& z)4Y-lEoKhw&E;`z5!Q!G%r~=`zwlDpEt4=TT(duwtb=(umrctw^* z9kG`CL1HF!Hxkr#C~gv!X;jDJj$FAND_|4ATrD9HjVAoP%a3ZplS6-S#82+aI{Y;b zD=PBc!KK)TFF&MX5!|(hb?Q_ut&i<14A5C7ex!cea0XiV`YPRO#V}6{<9-PG@DS{a{Qx<8`l3E$k>N&?3`P2i+5P8O zeD}JiMub|0&VvH|-BZiSDMFUi3Kcnuit3Qw3^i5FzuRgpEq(onT7%MTgW96^?~VU9 zX;?${)cIL9eJyrF9UlE1fq|gZluXEOI;*1<(whOU%kXu~Nzqh!n)L%SVq|1)~%dxmo192=8=k!iI;%lj}NI$5Y4UCNc=U6nrbJbQ7 zu&|Z@*;wj_1;oWCBqk-NxPxNNA|*+!oKqpUxWXbW*5Wd$49Seps`9#T^$ngRik_8? z?H%QeEuEkF${F4<5M~=&;pO&B>V!r2y6Sf?N@5_V@F|PT|@ow z{K9LmsFFseIr#GFm)V^((RB2~_C6w*&415{nk>_I?zQ zCn_uWWUroPA9OSrs}(5Lu;T=n1S$GLR*?OmrEdxo>7@BCr%gy^rS+ugwWr#0ZAR|S zJxyP9C_;NC)G=>l-ZP?#(i*924w?2EV<|*CJ%nh!V}0|nRFV36ZL*zzKa6}?!BQxR zZB`Jq)!9NcYP2TVR`RxDsccGkD_~DmMmE6Ew_7RkVNbNwn=oh3rWyms*^ygkOHqk` zGawoLhY`qAa~G+Y=@H1Uf3dNcE(iXKrC5FkrFkCCErR;x$$Q(O@VAunv%5;;G328RMOl2I@-J*$@Rut@CAlA;I_h5{_e?9^q*@)gua zE-fs=hbqi=c`6Q1Ls(`cR9rTnE~guiPpsBl_OK@4Elmg_7FL4fMnp}d7k#q^zCBS7 zCx;GmyYKI1Hk~7flD!B-~L!q=ttUt*<$O$tAng7rHG!(F##`e#h8Iti|2+px=h=67>Ep) zWH^Y()lE`niqf5^317>)P8)H~3JC@y*T#GnDvqp5NH^;yaxTZ}Ca0^Itw$we04I6Q zf4mH)1o%+XrxmDvpXF@+7G*8<3Ny!YIsC9{wX48)oW@Ee!;@p zux7>`eUmrSaYdMu1^r#r*Jbt5A3T`8?@9uFcJ;mm`+Pd)Z1$BaA?6szE+6Mx5jXI5 z-h;khb>D(zJ!?9UO6Y7kr1zZQ*%#-YcxjcV!IxLejV#{kZh=+L`(x-I251Mqe3#mU=>Or{0<$-*j~vc#I@fUn zefhU5lTk%4BeuDBl<3Y0Xk%`D z#(beccaY29nAUEhbLfIWMT?ZWSq^D$(+lvi@MCb_HZC!2fy}mGF-JElAje~OO&FDMP7+&&Jjrj_ccInYOvC+aPCC zmu0D84ANeOg~dUlv($C8c@WsjwX+zy{jG+QfMe!ggw4569zh%B1*S{6Cso5MLGtG^ zVnB)?*(Pzc%0#9)wpzpyZA6addo-hq*cp+E&QF#dqhNBCEi@(iMl@6q%XvDeXn2(i zKiMwH-NvOvvDclBHfzS)%}-=(DxDgaOHGF72cL>07P0L_O}Fc=(0>b^88@V!y`cxk zcEy$55dbEx44EkB=R$As0EmWgt7s{UN2h|RII6=2L5>BEE1B|qR05J-cySEvC*q5V z^!-2tn7n1pEE!bpctOpOs2BDuVtIN0>ELC@q`8|! z`47zh%w)vvU1F%El2D4*es99jN|#~zs7_V*F2T$R7=uDi`3tNW;g}dh3lAsH(p^%Q zj+>(H7$b0QIVWF#Tj@rcch+9BVA5k1?2emdtFEnDfWXVQB~)SB(z=L<+E5!CRRQ^a z!jx+QNp?PhA!*B1IO=!b%DRjZ48^qm_}|rQy4mpKreeRn6W1$?I(?we)t|e9b#&Lv z-%<3Gtl3N!3fooCiT{MU8jzcJ3b1qJu{N;ccNRL3)7Gs@FgQBnZQ8?H8WLSLhznP0 z8H4}wbx>jbD*e9wK!=Q{ZCmCJHAW`b@E>Q#K8&Q=HDPT^ym0x~RFdAEkWr9YRVDH}NzvNCin z0!V)g50O%^w}Zs~KEMQjJ zFh@B8Zx;L~Aml}2Eu9F*pVAZ)#!%T%CLWwVr~UDUnGEH4jXE8-8jz7EGp%C}uktBK zp>oLP>QJ9eV!~3jHoN@N+GJ{ZF&~gAmyT*%z3A8`Tcu@LNOq<&iN7 z7z%L+1clReMhX6f2xHIJip*|@-$u2*d>alE>i31}rp=$S(7y|5&1|D9X5DY;9`lb< ztSRiH2BP;?7k_-{}0N@BKc{z4VB6RZK8S!KyHyD%xTcg2%Zr5XS!NOvW!emI?y^ zKG=1Z<87e5f3XJul=j4kLzPyS;Ei%!)rxVk2Io@Vv8S`&Gza2{K?xEnGK~r2m-i7M zFoxT4M{nOiRC(wzz-g?DZP@INKTx>3<7?Fd)#0Nj6uX)vlMiU8@+mxa>60;R`L`!v zSO1*&uydW(Sa+Bc_B7v?-S`mRabm9WYk8&ft~x{p1L|M@10EDJ016q>g_i>r^w;AB ziC4~Ss4Zw8FKX$5I1OG+1zYQoaSvkET0PodJ3fV^xSzo9L!KCP$w*D&IT`~Poe z{r_(L@GoGRXfw-fi?S-4<4$|#NhjN%Zhv;X&R@E~|ICB$5aNRgNRs~&EP*5CuLKLr zTb&0%jAYPKHH2V6sz29RU8^#fxq}caGULDgAy`CxL7@FLUCnHEo2@X>Duo==|R0UEK{yVxegq{OcFs214e+ z`Gp_+P;|?SYwHS7o77uB>1Jqwy}QS>o6y^)ccffM_1!#7r(CA&wghte1U86 zzq`p*4V}^z!$c&O&$QSy>33^_Q(q|f_L*XA$KkO%m4%1lBdv_Krjoq^KpbH>HV5QNDQM)xo}6g z7Q9P^p7tjLOQBy}EGtc!t36q7XLzm>lr_;k4bUuPihGTlA%g*AI?fC<{KH#?`kd7n75)4x49f+RexuxF_h;y z|H*$mz|9msX;^S1cl4Ha&&6-HlFvK7wUc(4`0KJe8`a{XnsT2}z8Jczip0 zcxCx;4(8gxQ3k$nh&QXGsO+e$CTQfSoVXQu%uzRCbzIp@6lYo0zV2#S-G#t(Qquv` z%upLp5O7jA#(RA7`B0MSw0=(8x{|eF@`|Ioan#q%S@zsX;H~h(}xeDSjf*6ecx3vhuu0e9pAx5H_sv3xM z=vBncPD2jl|10OI@1J<5VMu!+#1aJQDjfeO!W`07_`l`bU+wnS==1Yv|CLTVI)ylU zPWO-h$!dD_^j!YmGxYrTehW>cxT6f~2$;Xk;3 zc=TaUeJgM${D%}`;KA|3qtp?x#`>Wdt_8Z4^(D$nI8tQxw6 zRJ(YEX{yM1s^XO_{Ze9t23#yjzy(T5G}BU$5GS^3MJj(>y<#29e$GnecELXFm4%0cKE-0gEq@b!`Ryu%4E zk+$mVS|JxiOuV?4PaLVd@~fjckH9@Jl(6o5pVBX=%|2i8?H)Em>8c*KBKgjmkps|;ayA*@yv0}kwPBt;?t{(O z>vqrvj0H0tbJqJ0D+Zxf$VfdO88!E}t-R9Ze-b8-tPyJBlsdiw;r{~7oO`^Ml|7#m^cqyL}u z!l~UY#M7sORec&`d7?H^)#QK?fVpl91 z;iQTI9S<3`t~c870Nof1aP0d>Kdm+C#Zq_zK`bX|PoHIbiIy*d`Nwk6T={zml%qpL zQSvZCEV8=CO8kQ{^(?(gLM!`=O&(#%vEOm@cT=cIV@AF)+tF@f?U~Z!AjTN9==Rro zR783=N@!k2K+j{u!la8WzAShk$@}!eVE5TxA0Y4m-MZvp#Q2a;{=Z?h;UQ_kt2l^_ zxse`c*wYXa0V}99%`R7=;CPh)&NTbD8jOgtb->I9_*AY~Jfa=I79Of6DIJ8-wmweo zLR2Qo^2L4h{mfNLn-dLhJ*FZJKRR|dY_D>V9Ffu4nQ86jF3%pcl4U9^44kT(Sn{wU zLWc=dcDp#|JJZ3-TocyBMR|sf7E*J^bA#{ijTTxTzq_=uC$lJa3mVI*)V{AV`o1Ym z@aquU$HhN`a)(@O6pJu$VHWrE3Bh-$Ct!$(b*@=0Jp=0#e5rAwm!jaF46fjezBfZ2 z)jWM*kDj`INn*a|p{g2(!qW_kwiF}aw}sLpRDBXgSN@z0gB&QmAPdV`R9d)9EO<*U zuuikoK2)J?ptw+2oileQs7!K*I>DY+tGtE%4HB$=&#s@d{&3uZ-j5OOmDGbu`>68w z`|>(1jSXB9W93HoBR@KyZma!JD~u5p7JGS|}yf{#puOlxa)Ewk}`tQgK*^WX+ z-um7#$fOGyb6;Z%UtfH$t4qk3`~PUh{qIfp_XGTkG4($qZ#pgJO4+|7Z`JufBQN{D zdP{ik{|nj{uEiQs*KV%#`2PAHq)q+{ZI`#@vn(i8uOvjgMM2v+e(|&L@eksFhXsWh z>4g6SZNHTbjC1EoF$tB+h|kUe=Y}Wc6&BeR6hlVdO8(L+$jDn>^E&c|HMYXHe(&lA zbyj5ca2d8!jtttuj4KUHeHI$~5IMWFthMN%UAC~YwasnsxV|XEMyT>gn}3S0zhPZ-y8^)@@3R&jA5{5OB~jC=i(bAd~i?@@!cON`+$O> z1WdITZRoCeNrfZ@_Vie!YpPKwR;2|eaX;F&EaWeHa8G^aC~0V6o!Ej~g)@wDIm;gz zdrIfZbw8>`8Q-Q%R~Qf4oDwxMFVqT-mnDU}oVEuXuU=U&HQ6b(x?G3%l{c};l$-qq z;sN+ijRT(0d>JcJNmqj~h>uN~TSC4!Cs8@0o-mf-rhn)S8uPOLW}=U#k#Moo6SM9T8!@$z{~HHG}0{vsmD<15?&Y$sd#7bthc!2;MQhdwEG0fV>AIkRb2DmP1njILF+=}dZgO&6X4jPpSH@EA09S~|03$TP!!`h~Cp`b#aJF>*K$ zu1mxs&jM#|S@GN%wz>E=?bj+i%PNCY^Q_5bd(fgHHsM?54nMf6VC`{_!Pcl!^9cP*mSQIiSr89;k_RX{Mg{OwIX!Jx|675_qZ#HAMO4*{!4blKG8AKlj$puAUN7kIW2Jb zyMVzK*`B52=`dZ=gzNN@nN*L8f7=MK)rrXVY=eOF<@xfThTdWHoG92S8Mfayb2{%j z78lK{f8VXTp8vkz2x0s4u#@uT&*MRH^`EDcrgM>B6#t{-UH@K)RvX}zLVGjhT9naHmpL;IZfW=%m{HL1TDM+OSX4ef@;7=GqCP4ix1{zqhz5DZ z7<$M4RU#02p}+rc`O+)50Ex{QpX-B^F8!04(YLIv8IXSU(fQR^dTem` zUvyz*^)-O@6{+D6+w^se;@-JTYU&hAr^uqtNtiRF=`-lGnF#JEOU4oDduK#9hxblaE@kP2a z2SvxcUaDR<6Pa1BKhytQssbVc;)40&%A+cRF{@oM6N>-aOmsIl1z|?YruUTv)`LbS zdR|Ee$Yx?OV8Hb=Xh3#kGJcG?GGuFN>6IFrCg2GaJIh;(yi0#bd%A&8W8f`9)9XnY z3f#ac20_Fc2sKv3EsNs>lUIU_=j=4)5F6JM9gBDN4RWa(PM}9EOm!&Elhuq#AHGgx zEF8}O0rY1c4@a_qqD-nlqWa!`@VmFMVouNuV=B@iS)A_lF(p5~YzL$6iqa^XsZ<{|9Du*9$@?4+bZPEkDSWd-muta(hy$qr z*jO5N9IJOnmk<2R!)+`%_hw5R@EV<(4+>hlejODK^9%4=oqio{VIN?7;xYI zb}SnFLJ9>mdoa~YoFea`nVcM1jTr@skR=U|L4m_=f|_#6Zpw7uT`1LVdqHSq$&|Vl z|)$db7fRzr862qcp7FL z*abn0CWw4r%_OAxhANImOZWx^txFr1!>p^0+oyYrb4D;3s#%`X2jmrPprsUKE{;su z-ALb}eoG#ax2_N9QaBYhOb9e#yn0vuWA=T%D`b?cR2HJ>Zx6iBo2e;REf} zOb0(J}GT96k03_1yUMPVbQ~OD)$86L4k$j5Rlz{=rOk#+lqrjH}g*5Fey~o zll8r-SeSSzf=ULqc$zLess^xFiwOel{C6 zR2wPE3yCfFvK7t5yBM>+8J#v{1><64hlis~m4e?f1=WA1p36PFk2oQwKR5O+oFNq} zq1c=!-I^k`gD<}N$2spRT!F?Ml&Jdp>*O;VZvb0c{uq(#2a952=&XoAzpzatv+$i!X9s1Ywm0h6Cl9=W@r${?YqAL!i3OokzGIHKh3PvkX5BdKr6 z{J}?5fI|XO>>;=^T-15#~9r^?{`@aDl%YJVu^)Y}egoFRM|!mKZF7{VS$Fo-sC5Sdtu(Gc;qD z8V$UA(k@iKtYXvHaB9qAW8Q|pw6z7GEv&S2H8C&}9SLw*tF-5uHc%%gZ+0C2Vddt> z0kfBgqz0Sn6wo zTemF$&vw6DduO|M&v8koHez)bNceQue_%pY=qQ`Y6d3YXCUPqw**}4K;kHoK#i`)x z<_1WyBibau7|0L%QxAzt4@Y80>`-Tz4SU+wCCI_-*2^y?i^n6xvc`QPn-8vBwU166 zRNUjtcpS4({+2#&Q^Ki_STW#dLM6s3!6+0_)qxbmjdTshc7B~elO9WwZ4|a7f^X0{)FM4BtqN{OI8V`Ks zJQFN_Ex)~#(&RQW0P4NzSsqfqQ;@Qq_;BAdlXY>Irpjeyts%a!X3xioW_{M+T)+M> z(bRdr7Pflz>t{Lvn?1G~r=JQ{L>rzN;@ir|F*|waLDHpZKjffci%69%tTzShcvWeH z&k@kBS;WXGz|$wDG~AU%SLfiX7*_*o*#q*o(+Z_5t(10ni02&b?;PK#4xWxn%S7@=(#eRUK=yWnf3@{{a(5U%~ z-d{$cieFD=$@4d~e*@8XW*zqhvWXNc3DXU{iO+=_aeZyiy_%a0HWFTw<)YZG0xmJI0%`^4epjQ~C1&_6H`DxjSrfI*Dx zUJO76#T0Nsc9)SfSQ`1#*>E>3B!aG`$?1zB_vJ=M;)`Z zn`>6gPw)rUCLiyNq@EsuS6LT~u8h*afH4{$Fu?>G*^fH%E5Mjv3~tlk2ks;3S9eKTqr^Dhwsyw z43;Oo*yR_PtT03n%~2|{I94zRv=7yT1s%Y?IS8%3%Sqo2QCJ-+bqJInihM~Q z_B`a+@nC}z7BMRug=zU=!;OfX9{_fUBU_3+S&Sx4vwI1V!rO}?l#6e^j_O`S!?7g% zWC9liNXT%FFR-U}hmPG&CZZS)WGG6wH3ncnL2Je*P7M&Qz$Lz@vRhH$NI%jCP2tiW zV58*`(55<7>L#(wMK(hv8SC+z9>#qteUmL4o}QGp6E~o*(fGq& z^28=EP&>6k*nkK-QdI)`BIX|NqE9{r?5DLk_zC2|$P; z@INac#02tpL0Uxqr$Xda#0?HX zbR0y)&8+RbBIw&cXHO32UW;>I?@;qwyRSteul)IIMB*w$yFrB8=Fb1AFZY!>-#dJ* z%>Az^_q9s|lAd^Vc6oELfAqSw`v*9`Kfi=D<^EqDr~gljyZ^uZ3z31U`u{%y?LEE! zA5|gM?_wE(e&hxG&|g>6rwU|Q`}tEYczYfa9x`{h6fU=Y7=ogocdY-g75F=(>h$Bz zI7X8zBs}DXhaIy^{4icp(rofgVQ^rh$@|x;5Y0QXKY{e}q`CB}M9KBC0II~qkRHpG zhuWfX1@=``_m=C7mTdX@dVW{?DFu27PWhlAZieYl`OIuCC)?2Z3`k#Y&y;$`umrb+ zC8=ixr8s=QA~*de7(++=_sdfhHbXMBVW3uFJUqzh$Vg7&Wqr$^zDCN+0r~1H!Nr+Q zx7XxvcI33UO=Z*@M=P)ev~IL3DgIHDqr)d{c!dOgPDb&9QIHU^W0b9?a%~(vn}=s> z6E{*w-57DdKAw$o6Df2^fqT>W{#5e2nT}GoitUVeKC4j@tS<)}337wp4A7Lv)Ad|i zB5R%x_d_HA{PoaQ>T8bDG=ll})At%j-8xFDokD6rAB4lf9M3X)TCi>c2hV%yN7VzM zZ3DQWE0~0=8CgGs+zly&npJ!&7@M&vJP=)9e3H+^gfD@gA#&=2bDFH#8#c;6Guy@} zjTWPlicwVPYCgNFp)XN8&-P}>@-Fj8{;bieD()4}ixJ7`_5#3A3ZSKuXuKB9l7?zp zX}+5ElXIA2PRRfjhmooJKAmegl3~#44pL-JB2;S_*aOe1geFKjz9fq;sh&!*RPSI` zUA|CyDL>?><$x-KGTq4gn4pCk1iO@N>PiM%p`-SY#t7(H&RD0`=Vj%cy`5o%$%JbzjPE@RtCN;!Wy zGRnbcCOg)jRo1MO88CjK?UC(mtkm?~a*CagR;E-%+rgnw`3X?Q_7sReJgXUbx-eL@ z(CNfKG*<;l7{7cFSTEm&hW)5#-xKIp5!!*w7k{RzH`gVG!DugvE5HE|OKmIzYu3>b zyPg~l!jLO|`Njv^EUB!vuu&vcQEF^b&w?J%9ap$$qd5gf+~Y7GN3hC8K}jdhIp2&K zW#w6{E5x&y!z~* zr^saZ!**@_=+|wa!q+6#*tWd0+;Famh7BY0PS!3M7v->pL|7ImZErtfT#WF z>g+JwOjR)un^dmt(@wpPT^o%|5C)C9yeg(v?awpg!2X|PghsJ%bJj_M^e23h+g46@u}jmY!%l;1BOu&_S+ zh9^-()(KQGd=seDE6EQU(AX4+^t|CmiDCR)!3|5yZizrNwE-{W_U>-&-1k0zk*T#< zybScke;b(;j==ZaO*GITvAKID#52J9`Q^7Iiubr_; z>-7L&q}&R@{suBc`_U)kgc=S~C3(bx1Cly*eY$pA+%15QV2GWdT6;@QnOfiHw|VFU zhTUGSbIR6eK8eX^d~ag3FC#9FKpV`YiBEbdHPvB@r%c{Y$dMAziX>&psH#uF{V3h( z6#qiS8HXL0*f1o`UFRbIK9=$(37{?S@TJhKj{!8;q4Os%xJK5az5|CgVGq=9rY!)YXtng&%tiEB|NbJuhEn}5Q_Vs~Ef*T~xUH8& z8UfERO?$NA;xx)K%1FjuGml$5W1d7^Y_SEI^xFz~5{8F5{kclA`OFe~n)ky5Q*XoB zg6&SrXivIFm`>*@9D`Q$_dorp18QSC3fqKVQC0Pmp)wo2F#~Op#`w}7LPPtK&;Hi>QY6@Ci7w7BzUFa3)4BHM zx8P{gk2;>lw5-#>xt{URbPN!RA05)Jn@h#{7O?h4#5N(spyJONy(LE4Tpd zUVj^*h&vKdtB}fUPQKdb&Ow;$z9 zzAdkyHca{0pM*I}oy@WENzRXHuo(I}>f>`*UM_6OBjA&0K{5_&uO53YO$m5^3hy z`;Enye{N7LOx)TT+4;5d<#AueVec`1S9e;0eQP9l= zR~~E@k~$yEqMS2~_fyk!s=Q>8kl2XuccrsofDR@8F3UhN!|A;$v2|6Ki#k&6T&dvv zI$=>+$0aK0acr;*9K4pNVqz;j zKI2z{o;0JT5!w#fkph!dJ=>EP7fc|da$QXlQE{=4$r(PwOy9ZdH1Gr^2CA&)a^a#Z)#fVF>lCSX=9Q!~P@g0-T4X-FFr0XwYf-DvVB`?n zb(fuoQwnb6297W5Z}3h_1CfIxrU`W!=pTRo0BOt!o!eyx&a2zCxgU&2!oOFH4Uz1{ zb+}#EBts}$FZSJM_ z9qV@g9j2n^>hry}%KWN-QaQ8J=^1JOzlq>W+v3;o;mz(nO$ndAV%~WVmD7^nDP?WA zjf-E4lm?>(F7sjl>q7uLK_Djpj+;M_qlAxp??o35@rwwSJGP9eI}JJS zAe*Fako5n-+B^Nn8SwAAaVE*cW@9zBZ8f&hIF0R0Y}>Yt#z|l?IY&19>JhBRo;@a9K?%`Uiz#{%!HoObga-3)UUQ{t*I+ zf*rEwU~2q~)FDiv+OJ{O7Q()VrXita)Q7Nmh@mcIIZDCL1rWoQpiBO4 zDL3U0Sy3XOK5x|x`;8D<2)!8j#zZeMK;)7HfvRy6YPwYcSBjG;@(P@3QT?pb=j5Am%yQ7$|N>&I*>(52!xJFI7e?+ZYpp0>$W=O>B zNl7f8L{lln?3dArVyN9O%iPC{f4Ig<-~0C)QnCfnUW(9UqGQnR(XTepqwQlSN}!@D zqeh_86p9h{t(u!O(xRQp*NRXedvI`|(Wo>c-mZSZfwcO`!g01wefbyxT=;yi3MrTk zw0ET4^^bF3#@WiVEIEm{91*$_9y7*4W;MYDoboRKqyqaI0(8C#(NaIT29ok;$+ z8;_vE8H^6aSC`7z$cA*lf+0<3MFVum2jth2JrmP~5TnJLeNZb%0CY5P^hjLO(-N{3 zLvyK}aukD)(6R89(Af6kU~t&tx#>ddTs%F@XbmN7G~fkL+!!cSI2`rKghXhX1Ybp= z#F+STnsvU|^HVG;q;Q*<(P(99MrU|rfjNeuV*2JMge|t&a6$|HZWPdp^CqkF4*FDu z#IbPK+2X}PZH9gubMXW}6lUuG)-Ek{J19IbmVJW@_c;~E(Hq=pnfvES^tL^BYb-f< zH}_*K7lKFLeG~+3l?U+5`~UalMub9sszS!$?^g4P$9Wxa3dpq!;!K#~G74y|Sm|Cv zJxU5F@d__`Ju^@OS$ICu*qb0&!$S*7$vRmL1v2=sQnHr^0%epe=R)j`VSFMvQ=uFR zy<8xy9n7wZ1d+kM-7SQ@IfHAQDYUeJN49~F73z`hDv~4#PYv7rzJm*HPa|{4P=pum zS2y731$!11{1u)#SK@UK1rBlh*+~3W`ecJ^>OIW?{)(Y|`rsW6hGJ`l=b()~uEo3z z;`^B%iLf5J^Ic46Hq>)eGzY%od88=mCLz=aZBc|W-bxlHj1i0nfmqtKvIEtvJQ=y_swK-mLN;HK(Cpo|w5cyp$upiw;Acq;14*@s@o#wm4STqcJovh9HLa`} zXJAo@$q2t`yeMVE&)+^+5>fNqL@Hs_#GS^6p z5P;+%LKBeLyv9ejD%>Y6B%>(8YcI(D>^ZIoMskh{jo(Bo;kVKo{Iv2zYZNGm4o0HV z{H0Zhi8Tb0$)d7le%A;;6P`myBFcgOM_L^1Vw$~<+c8<| zmUfdc9{wL_d!!Y* zhE6-VnnB!aYg`h9OC@RL=X!@2GMFk&GPU(bGA1c6MT!X^qp~8N$LNVO7CXe~#j+66 zm?Z`*;m0e=4}4%VUKclh(}<^31utB8CCaH)tKM)em}PTlMEkavLcD+CmXYhTa!*fv zcOglQNqo&mUyq+~)zLCT^%A|m7n(9J@L1;O?rmcNSUVV9%9Tzpd;qlVR|eRqUVxHo z2vcZvt9)`R|LJ$1Ye0ff67o1!Y}4$|_PyTdKtKrfw@UTQt00kD3BaIBM8&ECzL>65 zpH)*!Xlw4QcC}gQ>DPW!=F)!bh)yq?$42tflhRjb@6$(tVuXP%6l~Z00n>qj;SMM{ zp~x*tUH)J`HZ$Lzc@?d$z*tT^^q|*J*XIE2e|#CmpMt|AU7vPXFPd&4YhzX#e=X291AgXk+tJGP|+0xB2_(zZd=g5zAhF zie*2q_@5x;b4d2`{`G$b2p>Le8vlz2eZrvsD~q!KhlJ>p4N0s2-)BRm3Sj~|H+ zfotl!^1;kIdwXK|LjTy%wO9y#=^@0w zDkwUPSSfLv$SbWm3p4yeJ4De4f|m$DpWh$q2%h`8v2p*eM^gu7KZ+wVU#Sx|#}XH! zgc&#Cq?JuAxSS*+o%vGjQIraTLTD+-#mv=8Fe7WeTBwaKErSSXQk60XUrC*CvcJ11 zISg@R&9_}a@#;7^sI!oW_~H=8)|QAWCRkbSZV}8;FrCaRi_^wkA~=Eb&5sAiX%0!O z68%zh`aSISSWrYTVVnAa>O9!kAR(XN74v`E_v3gS+m^p+5fm}GivzMtyN!7a=+<(+dZPyw@ygc${@RGu7B z1bxpvO_Lffgxj`kpOJ7L63+8`Utq3jPMii7DQr?2TtuyHYk`P(JERF2iGl+}!WFIC@d7&4 zi@qM$A#f|LfBo(F90s<}LHgsT_I_GzU_7u2zW1K8O17}{M#sMG4IT(L&`;bo{(%+; zIvefAbu^0?SEUfnvMivri5x2D0y4y)ehIu9M4kz3ph05@Tq8l>B3R;c6wn#f-@BnR z8RZ|Z> zOl8t9Hlh`}E`2z7$83epk~hqx1Va99{1%~%w@s6QII-EtwAHd;+|M7j*h@Sej>@8{ z(6ZMKoQ^!qnXGotw<9}i!$f2v<~$B>!?0zpsO*8;qe8ypCW}L>B8QB6>wk&ml4`@; zF=GWpp5@6G9~?I{BEF`_B;|N9c2>GaAC>RT3Y)Ghj6mF^r0gq?UW#3he_R+)vUJ=H zgw^JEOO6s}KZKfIZ$3JGuN{9f2+if2uw|X0zB(1vi=um?i}E42$+ORfztKQ^khU@l z71Fs(;a~<+w{b@V|27PdiiaLwAS2-}<509GBwMS1m%T)eN^HSP$$* z2BUxqh-`5rDD{Y+|8P|`C`BAGAJB(1kmGtYRk=?F}IcG82x2KV-< zd4>w9o5qvB;ZU&Vmk%{cqoE~L9dnSF=c?#l=LL@v@trr(P{<%_8Q+(3Pr%7Z2-U=3 zA`;TnND7M98G3zrD5J`Bo{4AMOEIfb6??-imxXF7hCHGq%?Yo!^K6XYCEsJDc?RI} zpk@z}7t{fjX0wO}zP#(6k_GUH8fDlgN72Ic0<2U`*@Ux{KejBHyLayS>uZe8XKC+|9aAD?|4p@wF8~-;3(wTNE@^rK@idu z!3;hga8`~k1&N>v@y78LHwroi^?g`7utMeBTe`Yr8X6i(#R(G{Od-$Ua@wae4VMouiG^dO$7T?9#oV)45#ry1#x`PeQxXKl zG2@A5hoDPMtyE178RxcNU6t+uI$F_osW@BR!OqZUs;S!8RX$U8jx&+^n>LA<0(zJ3 z@tFWE6067~wHg|A$sHL$K~u2}o%KdqnwPOpK4-#86J*@%w$wHUl;Wmu~INvJ&@xb;J6vx^&CR zVX%Fy>VrRgz19)i*mE$8cK>yTZ!5ro|pnaOt}Oc&EqH#uyR|+XR*VmC4)27MNdseC_RY z(Y?jM-0QHlfA776Q1_ugYI7L(6yP^Ba6g*5X_+7v%`iBRT)I10Puz;;4=|)ez{$ap7v_@#qfRET1 zUfXB(JgKE)H)w~KUZ}=#_pZG!G_(MJWUC;V7 zQTm|W>#s;4Afu>aA0e>VJ8`YRE9YVA#|Pl6>)?+D5IzSG0Rl<60)tcnDcu8$`-Bk1 zKJ~D^3#r~`ZV1S2uBdJB%X>J4Y9FkGqJqTGT+sREPbyH#OrR-6Xwgx#ukNn8Zr_h3 zof1btElfd{$=)?!%4@8S6hZ(BAwfbzLG=UdwE=KVPHqt?zgHCK3x9t>*kHyJ&}StG z2@ucM%cdP_QOI%^xm(6_9BGm!1ZtXdixc%Q@3(at#|Qh8=V?;(LyclWzf%L4l$t2C3y? zGB`k<+IuytK@&(}JfsFr8bgq1Mz)1TQpRc4NrmU)M5G$h6|cI6t-6$}`KYdn+_sV= zT7*;gg6EBzk<~#^fs- z(S#a#21uOne2hj-NqPMY)wW0tD{l*dbB#V1<$l%(Plk+t6oNXziMery9F{Uaw1|J> zir-I*!RGcNwuB&+gdD|*^K%cekU|V~k2qWjymIr-M4_}634%|I4l)FRZeqn|A!*y? z2o7Tc>-?DNU0otDf|FAGyh;1`zS9PQyRzv zJ;Wm|EIlovJ#BaNBQ5$gEp836r!1*_HkA%1E%4ao(A=ifJbi&H^&pfqt(}x1Ab@O@ zw=_M2x-Fw>Eu(TRIuSBDcbDQCTG}?ru}~=U8;lNAUZz1aE%9$MNgV&gHJ;Ciz|j9h z1ggp6C?I$_`~jpw+2M-Wss7nS;$);Qfb})Njuv3A9dLk)yAlp}G?u-^4Toh2jg^

      mPS@&2#zM;gyWE)LuSTj0xgc2+S!l-aOX1||Rw7n(wO{~Dk5KNYF(=p=wYUC1rCf&2*911&zycfw!l$0Z!2lPXM96{q14x!VUgkFq{l=ZLT1!79-riW-W)Lp!7gy-7rOj z<^q#8hqsQpeu?@d7`BKTtsFLVB2yNA7RRsfe1z=$zI_lr?j=t_)uv>$(`X#9@eOCM zRc3AtT;kt^UP^ZBc@iSv#WLJuO6vOW5Sgr-!$I!OXAOp4K%X{NF@Mcf;<}g;?9wxf z7rYib>*75BrXRem&N{8GItZibt)88&(`&81Z>|3LZGpUPAf2}Vjve}VeYAd#9bSSp z#o)Im@V2Y)*eA*2uno2T8#~M_nHkK_-r%`5Y){qc7z{)xvhGO0=W?ki)(=1lG%6uz ztZv7{X?~OBkmxWd>2RwI`VCemxFAjbDy{j}L{uq-kCMNXZ<_H?lo_B#JKhPz!=|bC zc$)RF;jN3Z$9}Pw#o>i3(s9gC!kzxw-LF*KHk&_IP~!gj9WSvo$k|O@BflmC$8P)! z^Kx?paqIC0icnk!9As}YCBSI;X9P@pB55zog@}*^Te-Ck9-t4EuMb1F51p?WVH2p* z_YsO+^{jolB9`ebB!@qQX*>kuro)882f4O8fwD0q7henI zBsm!!9FGmO;H+E&CX_dPzuM}6z|+7j&EO5qV2}{WNI*6h-_TL`ps;n2%%+zdOn6oA zARm=m)6Jj`A0mGcm4JUTq@+1XoK$v`&zHb{dzZ|!VNO650%sujW?J*~9uD)SLl77) zk;ZV9fBlzC)Vp0&0s=TgZ!BXu1WwGNuU-IgG}1pZqk0@{-zN|kDwI3NtD9CLi)TmE z`IJQh#v+?Wk0RiUsx)IKu_Kv~-s3tPu-F(ntQr-2bNnsKY}6hHE4eW9X|oWxY~axB zCr7g;$2KRTz(y*Wnhb!G>zM$i{0d)G^d9EnR71uuVL{p!ALEpC)rJdA(qNE*<3r?f zxYK--b6Ie>#H06PlM$hGOb*>arCkm7V>1_I$_+ebvOW6CE%7LHlUba?WJI@$Nn;Ze zI7!oKirQvHy)(gSi{~U|RdNv(%D`Mp{ zW(!);$ALpqQ%Hm%f0k|jj4paF zn$p*5MZ>%4uEcn)XcVl-6+pUmYZkFJHCHXcFfUMEf>xjs3hb&1b4_Q`K zhaIhmKP#s2>OyrO=%?y!YcHZ!za-5M5Vm{hjgNJ&(AacA<7~|nZUysfE!%D-d2g-D zZ%uD)ZeL>jFEDuVzrkRrMD;%fip(b-tjv`!&Hgtn_g@Q2Nw!Kwu4+JuT3DTWZkl>a z#XoFVQ}|gZ(rKyG4Jp?BOqjLT==r1==o=e!)|pfnnU?05HCLOp)tGfRn)S7OA8fPm z^0TzGvFvNL>Ta|y%(kv7vL5QN$xgKmPO;7Ew{5Jj9qqESb#NH!bZo429P4rJYI2_H zcPT4y^$KqG9I*488u03D@@}Z|@eTATFZ7)s`6QD86@>xwqo3P$L7A07 zg?T}p&7k^f(BxonMD)L`TV!-(XKUm@cT`M5)XH>pLP~VYa`fb2TytGQS6jmNa$;g~ z;?ne|vn6SAI5{&bxw*lQM<*vJ@uX|vy zXZQ8z{?+7+S|B#+jxE4`1ATt{t z9&RtM9v)vGUf=)Eqke!7uz_m)|1oaqj{fUTeHyp2r0PFc{%}~WHvd&zW09Z(38eqi zol>dL9cw6_NM$k^|7U@j%H(o7+Z<~woyipn8Wu~fDVr;lN~F~rZz^9XRVlZ{|& z@GP!y`UlU|5os~C65CxyV8Vf%Cu!}HIU3;$gEefO_B}O5SKjn-r}L2%SUK{YEteZ@ z=0CTmI$N)IdV>(YD0JNuPr1vHgx`&_^B%Lk>Ox|cJ$x>AwPtbH)-*j{ln8Tu7`OmI z_VX76UpBi0THl^-4ko^Moq2P2#yd{_-se`T#*FY?O4ms~uroY<7wtkQ zEt_$=9$ku{Bzb-WqtbA7gZc3G`=U2_%IB!d9sjUAH(i6KftbYSG7gH#;wUlijy$tC zXgvUB1Y(w)l!zhb3o}DvOHDAhMXuM42 zk%qXw%5HR79#uemb-c!!WjutEkyo-dSyohoOKUhqfHquFMVTOc*xjqGNM#lU zF-$178gVWpYjYch1hrpQ7^+(`w}mzhJ%5y_W8+{zv%QB(XcBW7PA6~Yg08K*Oiq{E zzl||TH(<`b01bgbB~%Yrk~SpAGT?mSFo^H9=`i3HtUEbE964D(ybQnF(6U()k#ws-ic`{TSFnFjT%AWmE&eHs*YI-BA<#*cn_&r4s!0r z!+2ZuJNuZK10BaIU99}0=Acx(Ef|BzW`X8ZQNbXB`+?8-x)Jk-ljOFCsBokn8f44> zilY70V`j*Vw(A5Va$R+knbCaPK@+a3406T^lN7RZ*qlVridpJ#ERq$A3Gq)-t@V@{ zmo{iLmC^IcC5_hN=H-aWB^iWX*l$oZv8~4Mx3gm2e7|c`rh;#JP2%~q%0<3`kdyg* zK@Vmim6i?rP)5#&@*>0A7gni{KQA!kO#Q$@3pxavi6<8R2k|<=zC*K#TcJ0wtUmlE z?4GuvD9?!5ofa_R#=yw}xXcYPOg83_Ex=c1Y+Xs1>H^`-JrL8Brr2Q&yfEII&q`c;8@H4D3?xdZqZY2`u$D*4zrL8F7AwA&8V zIv&gB!^27m5G~q6z?yClfIT;$Dl&(!&=P;3xQjD#)DfrBM8d8}p`t|Chf!3KVt=$k zVr7tlJ`M_SeO3oC;p@Zs?Jrd9Lel9_lWwWM*rH*hYXsSeQ{XjB#dx?3b;4@il{Yw5g!}B z=19I%fhn!1pd1g|Mv6i71o_7(-cj58h}MN$R-@lR9_4L?@%o5?xfstTwiA>zkuDlVn*?~6YcXncBai81jwJ6E zC{tO+S3GWFJRwd#svoHN`}c0e-9b$D`B+MFS$^6zwk!#yE0LLiZwMNl@;UX8n&Fzy(Q zj8ov98FOClxb9vs1iXJJYxE{ef0gevy;?>=V|_&tgg)m42xfMvCd=hQ zxO{x95bM4{A(~R}EB>U}-yu$2rBEAl*^Tv&^~aXBsY_KfmgaKtW44lA=rHd9nz3hN z!VGt42lnwu`Q8w|K12rUhGn${#V|}fG-)qq^SV%qrDBrja^r{fL5GT_CO;Qkm>ff{ zF4W|laKtarqr4(>>JQ0~)Zo?z!vSa)C=icoKm0c&*9b$NB2e>wSWVCXcES{UB`*60Jffcg_6_p@IlX;f4nwTqkfRg#5kmn=w0dM1ndpE>p$t@Y-N`=fP7&AxeeUcmRMgg)o{%C z%CS`N@|3=`qrW1AJ=N?|naSyONe#NWM%;E4s?BpDWXQkF<&U6Fs%oa!GOG!QjILI0 zTxFwLc8}akM1KKqb%pY#jLhEJW`lb}9mAlTS*&lZI zA!q^XU<0j#UHyvziY^C(1zyOg1+MiY!Ip>^-JTT?9X-rFHV|jr$C_hq zk(~eRqlLbXt|0wLg8Y7TnkSAz-bXMMj3btCJH;kslC|1Y!W?^ZCjtHeIN*?!$r_6) z6iPI9rLI^r4kmQ_O?a9h9d&8-#cR+{&vnvEZ{qtk*ZLR(Sbgrs9{N-78uwohPsYu= zLP3x5YX~>PED=DMq4*CDZ3>J7@T%Y+8lHLQI0fA`L)9cbVOeb1BH@<&Y3q$)e8I_< z)y484>(_;Dg1HmxYo76x?oM1gRKNr*hoZuiZGNjOa za#QLM+D{Wqi7vk;h)~LoYSaff0(;aXW{8eGY-g_Vok=2~peCu7s;v1Qq~-FIqtY zX`X3mwtmz>hVC+k)bQ*8<+K1mNEpD%5FtSkA$J#eV9)wQMem6cl|T$PeFG;At0R&? zF6M>syu|XX?i^Hiag{@B=5WR;OL>HQoH86M3z z5QtPBy!-4rh7}O+N>%@iNZ_G+PRzuP1K%YT_Uek~EQC>og6Nr-@PMOEAsmt@95OxX zj2<2U+aA970f=8|ON7%B^5KeJmWn5LkATYy+|rEBUX6HijYpUAIf;u>#3e|i2CBZq zCa>rjJp*xH5)v%JS-G)oRT7n+67jj>(L9no+Tz44liehX(YQJ3^u?ulh9cxIIq6J;MgB z;A$jS$TIsT9D8j{{(}pyKQ1|i)Of^@#+2Qd{}+E0C5jj(n}vtQwEBkoKYrt+@Th0(+8N|8SIgMVPZbMl1;YT2#OY2_Eje7o3HAE;xP! zY>|mDKw_5dhf)5~S`N{AzKT_zl4lVVPbQ>Q0JdAU-fF?!m`*$sWe*Chf(ar2f^qN% zRmsVodlV<&72Dm02TMez$V!P`f;Oj88YCrC>Xwn?179ptQJQ}o=T93Gm{FXICRST0 zVTFm+80WMdBy0>p*{oe|Op>38QtB8{n(LW2E?wbOk#$CsB1c=?zg|=m3Yla0eP$g_ zq@}e=s^Yx8s$8pvT1rv~lo<#Q436{a#EEKW zLV7p@j-(;@iGs}MtBX$tMxoD^(bG(r~(w-s@}*LY^WB^qYQI+J`v_ZzS0 zQ(V@{Di5AgRjWp1{1yy^sv#>iTdF3UPLvBNEV%&TTZ@n{pk_K=m<{dxE!q|fuPQX1 zmg0`aobg6Mgf>mnEL+*SeB2^;{L)PA3_PngGM<*;%tk}1wn6QJKJC0O?slQPO%bv& zS{qR7XKkaj?fZD`q@FcdI#s^b?WnTt4j%P%GEM82t;vqi-Bumjcp#{?))?;g-i^8f zy!6wEc0>F&u1>=r0mYm+8rEi=3t+hS={5^DHDRdvd3Bw3`E?-Knz9dsrg7O8^No(6 ziTsJqc4SLt8=X$plRWJVShI026||C0C6cl^uMJ*`^I5OHQa!4^2Cn67KTylB%=Yq$ z*0YJYVf;=?_|DPF(o3&m+6f7jcG#^Oyh>tkJU%_|C%nH@CDri+xpO45YTZP_SS9x5 zjIx%1w`QcS-u|xxg`Vw48)*UvJrfxPd18opk^MyX5o?Nwc<*k5t<+prcqZaRnf(^< z2?PO;{x-?Y?8bFTDRr^3Jp=eX{%_rYtbwNV7QV?YyS*+fAZh{*ngtLYb-lr(GK^`m ze7B<4m|&nrXTa6FcZ@fu)G8Z&vkS9JLI{|~cwVWc+phCobnx*yR^v9K1!_PGu4yvFOS+jrDm{&TvPn_^KkJ;<_)SV?|bgyM?t>ye#GyRPp4Bs!hK!8_e zoS;M^sXQ2+;UCjFlW1O!fiX)5InTX03#8BcUfpOFy^-is5KTW8Zi|Hzo@?g5IhwsW z-n}`wwK*|0j@~w99B-pWSQ#A_6vSe@vbB`V(%bb>IU8p?t+%;QRJB0EzsR4daMdZ? zIUavSn14;U^P7L?UT^2oXGaENYmhHvcWWnpYPGU+)x>AJTYf^KdwVf@XS#Y9xV`&S zz4L~c(sH@FUpbRwZr(4bE4amOEkU5q%g%P5U|l(&+XgfOWZtX z4=)i}+YZ~1YIoXs0&oKdTEoXN&1+-ad&W8n&65B%a0^ z>b}?|x*GX&7zm7mushf5IjXrjX(v2is%arzyE3IvVF5Ekn_6+Ye)YY%kLJ);98RwVXpw^5r{t)u%e?= z@_f#Q4_%JQLIkF{n!>qvM7P#fb#ngUd-Cz;Cfs+|2+3pFd<`6#31^cyz5X}#qg(Vk zfuR}R*If5nRz2969k@UDEI;lduQp=&?wA$U!XkHv2z7L8G0T00LH#_Tu4j?oy~A7| zO7l?@&|e%x_=EQ9~NBiX(qTY4nJLpC%;Cg#{V(p1E>Wtx~JoYLM z`2imJ*thoXN#ISkCwuesKIVF#>Dzqe&YQFMOYgS_Z^7HUtZcI|;Dq7l6XDpj^L{6f zriZ+qd{Ia>DRMU&{Z-|tWJ$M7p2*y6?XOThKZ_bVubJTT$jcd~ZGi=Dqd+f1Sg zhhj0cSFwl>AAfg=(!8+5-jPwZpsdKam~@3f;}{Hl!?Q-BVaOB`MO^WF!coU;c3tXI zyCcyg;#TCx(EeaaRH(gNaV%zV@C-`IiX;pE;3*tV$F4_fWN=dxok6pB^BJvd~LlDh)u9Z_z4BiRNrvnF4ZDcD`dgd{9JkI;~ zqz6r4;?eMNEw*2s$7AzELNLx>nx>fQ^b81;c(R@m>Qw9~-+Ii#QSJt>2$6 zxXo=Xxvo4|FIAejUj|Tv%)3F{JLtz|2%FW;8M|+ z5d$os4lghuFc+fgW(v5?Cg~~Q7O+^_y`!3tH=s~ktd*0T6nM^o^=()N7%ao*Ilphe z2?d!(@|LHWIF8&wV16*p2|t-4Q&C|q#VaLI+9Qm&6>WZP(iRC1nVNTW7?wxkq{mcM zR(YVGUXyB?P|!3XoXd(4@svo@xFH`Smp+G_nA498WR!fN_Nmpl!^6brGE+h`;x$Xx zW9ya*_uQT3=XXa_X=jsv(6Jw&a8c_>06$D_&tVo%vyW*XN)-TsA0;dI)3^<^v!In0 zYFTWh<~cuLmeyEbXvbswv64RTavSKaF3am1agy_A(x-3>1}t%{SB3E>D4OPHFB{u% zGq9MF$`ZY37BC#Clm8e>#$8GmJgnx>K0PanGC$U)Kvub-HjB#_MukM?12RZr2z8X7 z$Ey{(N2#0ky~a$JZ)BG%hw;Q)dfQylpS;V&)S#t#c>rkzccS>=U3_65`8FK z+xKcwZfY9bDdd>OXQ$HMlH?1%P+vT?_+z#jGzedd$F#uvn!f zn67a5*iUv-*Q7_ThyzVo8==v2fnjZr2Fn43A97at$r&uevCcnt(TCdZpp~Lb7QfuO zN=dMl{0Mu=&(lVE=)=}Wi42Y`d_FGYqxfzexyMU#-@Dqz1~VVRc9D)8N+u=th-^6g zl@zEc5;jtm#FB0S zY4Tweo6cx+{3!JZW|cyfsp4D!S%3p!ZMGZBsAI+}e=oWfMaFnH`AyhvP1gIEHI;DB zT<|4$g57b@ALASX0$@M;orPEn;1d9YW~B(LiJp(XdMp}hs$`?Rm_?dKEtbEg6tbtfmYsxc3v~I7;T&R+8 z^>w+W|DoD4*;;qWQ=?-$x!NQ7tHH01Sh(2k5ZB4Z$L5&Ak^VjN5OM^rs`M%N0F8fXQL_(uuq1eu)x)RUTl(Um3Ezot1 zIZQaL4}1TnX0_pK440`J*0$LXudO%z=i#Srr6B}*`1F`P_PE9u_&j^7(w&f-YvM{x z2J>n!LntcEK7{Xef%O~PG`qsE#-j`XQ%-1d8zY46;yPECIKiVUSdQ-9^qB?(_y>4; z!~jF)rAhE+$w4lwJ!-}!^~o6PUEyKDul7Mc?R2sux>p{5A zFPq#$B4ZE{LN9e%6PXfMS4?AC3Jhc4NWRag7qYaBSg9s8t|{TD$>O(F7t=`{e|!{T zM`I87(9zpjerR1{zqHlKO!=+-)Up1j)A5(i_H>yU&6!V!)187oYGKPq`#B*`T>?G% zArU?ad=ETddu7UpgqtRE%9U>_{(gbaO(y?ehq%zJ?hzyoi{f*ccAt&4$L&^zP6ylg z+22P{wQbcW(DCvFo5#SP924xMw{EeSZoIIqgFZPt0kDKyVvKD)j0{eWnVIUG1}p1U zfA90o3C`7iiMQjHMTh@-I|ILNA4UY~@}=@clWTP1pwgYRt-f9qMLVng zecL?ub?bQ|yeY%uD}(yt*8QvHGTiiSAJ)=*R8s$UqDI$2yzR?`ivC^ZulHj_ns1Z% zEce#e-lw*{r*j>f`(B(rhYKTN7q29Nw2s;iKaQt|V|x^;IsZ^*d>DfGbn}s!UEObG zm7uMHus2ZLo)dHVLkdX@aE5Yyf0I#qQ{UxGUyBVxyekLPgLeni_t;xXFQ z{h*&j28zu_yvGRpy?8XbZe{AeWrg~p584OQYeImtLExbT5j_jSu?Fs_^nO(gfmZGH z#fAEq2&&m*xQgi6=?nxf3XoqF7LOvC5WVBX+6#{(CJLxH0HW zE@F#=FZ&|Jdua_5LD5RP>3DCr*S}fBy+QUkja4rh^_Gkfg&B7c&?J*xGLzzZlSA+L zh5SH4Xm}8T^^gZ#W5_dMt&%v=CSe(~SP}EE!wBZ~Ve^UYC2OJv`?V6;K zPUMqLTFi=jmx{NMPAy_dtN)VzX(6hT&T#JB!z~gv9!tHD&V85OL=PsaLf|<>*14ym z6BX8}YIcPq)G|r7d*>D!tXGc;(@{mux%h&J-fzbYYvj)g4k=UbE$!09xgTN}3Z3S{Wmtj9a1h7d#$^(Rmg(kVEdx4^X zz&93TbndY%x$!Ewi7vUxNx7-b$rnfI*M^3o#TvvnhM%f3I+HbR_jrOy;+3MTuDcU$ zauNG9i6$JA=t_@F#ag+E@eI}-_2UpyX#!GTR^t#p9Z0c%azfE-T=w6%o2; z;kE`v*ARWUxK~X-b7CNrmXI zD$`vmYsCdKBEozFsIc-cXi6=xQ7nA0$;nQEM)e*9D2YEV6S2Q8THEW~&OgL!x0Qb49Bt5ROtKB58#| zd{>P6?jK~_2BiWW#Db|tKO3k@3?at_rE~;I7aVA8zi6}y{%tk=v0;uD5y`F>MA8dR z!4+uCuTCJfY(fD^u?xX63T{fcY(}rn@C?Zy1;K>VP6<7)pf_XEDbo=rCV)PRT^*S~ z96)6OPN4|GX@mS~5y0fH!A2Yq5>ak$RYn%}IVcn4oV~&jrqPPBXuyu68VuRSqiSBf zD0>7M!VVQ=wi+t08SYXkCN=Sa?4z=IuKpug+$~?09;%iIgRyds14e!*cMQ*-V&vNq z3=K|cvA;h+s3grtE2DZX)ujx#PKlIowIeK8C@C1%SyS`|l%L(F(#ME2mOyW-SyByh z1Ot)#%x^8M*7Lz?$pziL%VO}=Qw7z&lgrmDeVf%@`vOLl$*)NYEjzUa$^jo62)4@dKngi2?TH=|A2)54*s!!!^l;BKOFHS7uX> zRj3rTB%0g3x~UTkgi`p}{iC=0r_l{U?*Nfs#~ZQKGUSV<0vcG5K^}s^XZSs?wtP@; zt;zrPef_b)ziUf<79M7EieLT&{Epw?UVev*y5+!Z=8NOz5W3EUnf|Zr0I4{ATD{P# z{RS;+h3AUwtLoJIf`AUgSwu3!8$I4{?vRFZhD&h(_UK(YvzAt>;&^{HEWMeQvpSYJf%#T|+}6nA%bcXtc!?(P!Y-Cc_oho$E^XXiJw z@@98u_76yAl2?)I{(J*5BhtUB44_nPp&4&1%+%+lGW7xQWWoiv0{o71!( z#!Fod?iAmn20|#h!||@;-~Dy+>Ns*}>DWW#5vZ)HHH$@4;MYEsA+UO0^Hdr0LLKu0 zYxDdftv~)VkCFyg1Y8$=hK@yJCx*vpdPldI{wm`BSiXy@3wyjh$3WRLR*g+p8SrLr zizmn?`DboTO4g|IDYOadK z=;F@~aTwzk%dttziA~GN%k#-D+*MnaKldU=qU7v+V(x8DVMMSuImsyvbdf~a74c@JP-h9xQLn95 z4^L$Xtv4cQ(H!)Q8fvRMHeDkC@w`Jf3bL<)s0$JSYx`pm^GuA2sog3Se``jphj{oM^(^lKlb=%Wpi;yPF5%1l=1l$ZJ z*f9}1eBY|Kh5Mh`E#N;B3k9|fUIZ2*Qj{)Q@!u>~y5b*;{a;P2YIf>B3S0S)!u|)r z>U7i?G?W__=Nfj_{o}8_O%{W#Ruu)Gy7eDz{cqRW>y)4Eo|pX}&g$vq@7dnqRWajR zmLJsL5!~Js-rpJ9P!roYn@~}f*xi;?^J!4${~6S(_RP8e0jN`>xu79nV_jZ-S6;`& zKZd%u_K%^q4(88H6qJ=0v^9U~)6Yi#CqOOxM^C5!xznoJ|De-~^`*+XhRUAt+Un~6 zLZ@r>>ns25PCvQn=tATCOyl_UF#AZK^a z{)>{H%rCCauddDS?JwM2|HqMj9{w*MU9Vog{3i{$cK!BWi1cNBYj^#VkN(Gz-uy$P z|KX$mM>u-=A2@n>b9wi4`TX*!M(_S#BBTEgQvm<}fB2_~6#@|aFD90>R~GqyH?cI% z{%W>+Ly;t(v4H6NCt*wiBID%8chK!?25uw`r&T0@T5$%K&&dz!t)&=}#+n_Kt zyKNE4(4)(CcD{{>u_!H5{bF?j0y&-x_nok?l5U9(1Evi%hPZSOzg`W!X}^`s*`^n| z{9-~g3z0P^4{4?xR6Ny}1A&;nZKmr*YIJysk`-9UBSsv~7oFVQb(9L2~j8mfi7k_Iaod% z3St4s`K6h7F0Z3O!CX72tQc2)w1NoKG&jF^SU0faK%|4KZ74Mb+@3s7bzE@!vCcz7 zFcW8W6g-G0H}LcXcoMJz!tEuwbVH(t6MnSFQ6l>^g|fLU*P)Maw9Ht^{o(}Uyt0B) zWZY8}{7|%gFo06s>TzMrELCaJP#wr9@|W|fc?oJ9h^V@x%p6!7M?`nld^iItu_J)n zr-k&#Dv$N7`o3==)Pu!Z(Z+*}AzBw_-bxFc)R08Mo`8qi?P63oi*3Zx&nRtzNLo3~ zNDxN68~}!`G3pHV%2(CEkk4OMfz#bF3SHY1=$XADvkt`H^xFNYw(L5t?u4x*!D)w% z0HO3D(Gf_NO~$RzcXL(1Kn{vWK+#EIA!wBi-8i4yfeIH-FM+U8rqja+(3-J}iU_PM z8He0iOp|k`9rw!SO{R6}0^%j-JreCo;%@SoaRV;j*gjWup977f>l_|HMIg%P(-eYKvPE7)?z$gYhui*&Z;T?Zrr*E$c8S<4emH9XJ2t; zb}Ef@yQV#1PvO20AuM!mfqmGhE|i7wY{!H7>^k_T7BmgpX{cGcW`ce2pIb-QL&S(X z4|<&5r&EYh>&Dj+?zG?=HMau~e|SOHa~C%`jw_dFGgBy)hw$Ccr@!I1Q}O~~z>($L zZ@!17F^Zw!U`+c0b+w8}7I^$jtL<(CHv>zSx&i9Z7Cd~8?tLbzmIsT{CGKQe>gn?NO}|S{mN)Rc;*Bs z@=!m3GE?Bl9KSH<2-QU+LO6Wdt}yj58#8+xsT7m}qKSAvJL5i;RKypwWbt7pK@zg% z{t;Z65P^V_83_G??Z=zt;b7YtkwAh_yaaJnDp{ML8_9yo<>MjA$pMb4=iR%@V-!JJ zIzM#q9b)3q4gq7k2sq&a>gHwfkkq(9bSR*Z@GxKEGCyj1=$?o*H7cRTP5j5&{xt^f zIEG++%)lKv&5VnPL@-Jcv{@DlcI$YsTzz_YAZ5AX3W~;173sl>^p~w!q1CtVQ0STL8_nVXpWQHjlyBSf)d8vN|NTkdJp$I=W*b8CE<)ZG9dt zTv^UPhc~zsr_8H|HzxYMS8XU*IP}VbMDJi#1;P3v|L)X+lzEvO4dNy>ilxjLA#W<$ zI$2Wk;7mzCOt48MR?ZjGvIqt*PUC~fIVDV7TIRV=5oEYn*6l@Q%nPH?ZjTkL1XXE9 zgFim25nI|XU5Oqyw)*tS=J-a=u+(Lay0*DUX1^_tfzlQbu^z2OjE!=TnO3B!V;qkY7IC~9*U6rMT)-t5cM7^T+)wcfF zOwPAECgU67P;MU-A*JZqkNhU#YRi4>y(J=o1nbVo%^)gSW(n0yEig^4 z9)NgW=sn)XcQN!~cv+U_#q~XQ#r+9#J9~kV&z}5TU>^NWz1J5jZTkMl!DPxi6QoWp zy#AJHM#dT*tJh_n_@^KQGQztF&;MxdF(`-cOcrW6rtM*23l}K(_wDj z7ce$zG91(QYplPCR_3>7nX`ucSgQ55rRJT#4E`wcE+We8Kozu+Tg6|sMSAFdnlSYl zYuSVNtalY!*=kv2uIzmbg|-q-+V^GK>}qz^4QhJWydAF9zlgf^^k-gV1thL{(mq!9 zZs@Y#rjyc{xb0qUikW*!Ay(NzN7NavzAq|ws$0Z8S?PUOWu?7n2-!AN{$d4l>$opO}#^h--n#Hq!D`DsR zQ|lPPY388Ic=_h-l;-^(MUJbU0NEQLzRuEjWv(+J{o;TDJ(eu$0iC>xgf#}O%dCcu zdIy`^4UWt1n!C=AJR#y&v9hMSI6ki#ItK5k;!yY=uBn?debfep)|=)B&ds#5Tjk;O zwkr%%W*ASmVR3mVGfFYXkQC1(NXY?zH5fZN0H&o_GBGck58JhMdde^DB%kVJH$RnM z1<>Bvn7%|}zON>}_Ip;ch297ywn&`1U#JNX;^g*%^azXt;K1!znN=hb0K8x>Fw9gu z)V`Dlj^4pWB%%6bk6u7n-wjsp&ZS>;)Q&;L#sCgAY(20^wg74%lq56k<$>pEupi%! zJ1E$PQbk>^(MRS%jAF#*irsf#)mMzuK5)tZYqNJ~bCC9kCt$`5BU#6xmM9$scHShI zA}+Ku&wb_N$Zz5x_$|chL)BkiJPZt0(V5e=s5#_YNl+5GsE#YDdr@e-3tIeuifBvV z3#J44V_qWm3KfXi=0tl`i*tEU$$*VjDvbOn zadP@li;x)PCB=0nUkSkmkGUQZ>e`n|o{>}EiDl}Ie@{mJrXKk{&1H8vW*;trc-TpA zAOY$m!E?kHi!@Ovj7k7bAgw2=xZIdbWqgLeQY(r>1oDCI;1|Jh&!5V<+vns{22=d7DM^ zg+xP^M$eR_UZ}W$J}0VYH< zs3lzJh`25UrXJO9X=bf%8D{>($7w`narQLnWGhMY)N#aaU#Wl`(MfQdT$$Q_NjV=9 zcF9kE*rS>CT&ay*K}KfA4y_pxC(*Dw!!y8wrkqHqvy#<4_FgIUt_N^0ZZ>{*h@$_v2*F(d`nyW&aojW~t>C0uu5Y^CMItk-|`n4#J@tx_|KuEX4z70 zF(Z$8AGrDQcv-IL(S(vIFlA!dWkg{kfXrOOsCx_%yNadIJn`p}A6(@)Y1!5qKor`% z4({S~jp8o1_=rc8Bsof1(z5H3ifFuYNxae>&eAcp(h1knP&3b!aQjHE{1||r-c9Au zDpRs9z*8RZzFMu&gw|15f&B2pH90>7HwP`e%BG~s1r*axU06_<#CBSq;hwS%ZvqK~ zlFx;6-L54WGX!4MLSEN?wWyO|uTzMv>)BBQD|d9L!`(N}c%~^w{8;lrjsRNX)wbb@ zH-}c9msIwo*HQwZ0^|q@UZ8d5EEQ~}TuGn=YalI{;C@U)(c3~U%s|O`Kx(u@(%Mz< ztrm}+R>4~&9nqA|o@Vk4*V{eUx0w|R;wSb>1^|8abVq6>G@EJgq4x^m@RJ)Pub>I& zP;?^Da!)JwB%4spo2FNDnw|?<%7DY_L6`_R*zNKT5vT+}I73@lf2O(%=r(XVT3Af@ zEU7wSW3=M*mTK_^;HzTh|p%nx&8_;OS8dIrQ!B!u4I zG`%2%UodjL?2;&4=Sd)oO30l~N7OFx3REm0)rDdp#0~_F)@PDZ0ZF=jel_`z)S#4> zwCby=I-)Y}dbUPcE7FXBj&a0Rj-K(OFzwMu2z$J$W-{m{9`FMA%;tBjfqqd~RE zeh;4B_UFN}A4B>AH4wnEaLf{4NxfY>P--kFu!O3#f-2CKP-T8F>7)XEtcQ`HlZmI3 z8dk&cQENOL|Sk9bS^_)Ni zf`(^7+XRz|Op|+Bu%=0TRec3C=2hOUKGCmzP5Avbt5pk9>h~6{D;6nXo`Jg3;n8ex z!AuatXl+QnhKH1O6CK?<<%Zwz0V0_sd-N!L=ly6%GyCV$*ikchopAU_0HTQ*lD8RB z-dPHUSz?(A>J8N0^9j0*Ss&ZUOMF-v+%_g>u5stSWF5bZ(m81BsqmQ25S{^ z;!$$q?G1`qBq}e^!pL)5!9ReER_T>qXNE=&U5Z?-MEK z9eKWgCtC=n+UQ&BUYEKEmia5E0<&D+GI1C!;AnJF48el&@uAsCLc>JX(W2UPTXb*^ zR|rX0^TrqQwO5M>Co+6tV8FnbdFRhQ)(7Y-y5uUB>L!LEMV&vBxSa$nZkbb;gyR`J zdm@o^!t^P^@X37IGPv5x_Z^n-iu2}OREzbWZ2zLr9D_?V|&`| z7YO-5NVRPYwb<6fzHf7B^kZI`3#=ns`gBIw6{xSg+r8J;FfX1WJ+S7sxW>9LabWOn zS1_K_&@PaG6C)Tm60abziI`mI9ccJi-#wzJJvHAwj>|m(s&D5-atOke2WOjzk@7(gAIa4t;bv&ao@Wb|6TW<*A$h^+Qu;w>CQ`~RaBzKU|D(`!e(I*Mk zFu`3MDVqmV(g2Shz)98KFWb)-y#LkeK&lJ&8hJm=_Ro*(eQxhPBCE5dN~-yBn9?X^ zQbk@;NKJbq5hv9#4yhf2CE1^yN zf0v|>DNcJXmc1Y3@>lGCAm5r^oXkq!GXJ{$O}LMM3V`HWgpAu3l)XZu*dCquF!1_EH9SyG!TbS?M<-AZDs^@?SF=PFQ24{1R#5wf!-%h_QRXKzawS zbEQsYQF3@zHIY-?D8Oan*wiWh|1nm=M*WAbe{UeRYmJ#qY zU#w@zI`^KtKR!)t&?6_BIIJjmAOIs+e|Z`x1Odbmb{&Zo5Q+RkuCiVtPaYD9!ysKE z&TKFoOQV>VSfW5S7J`A^(1241?ib2wvicgDQ1tnE^jkcb#{98-fkaZ-{CugIVz6vJ zcOhuhe4+doi&fM-=4_s@UT-v}RMWY7gGr};-uzsC6jd_~WcxvwqSWA?!hQyXT<9ZZ2a62XEAl)v?cDC{k`(h^?A)K*EU@F^6S| zD2vpI2sy*%!CJe`^=3S)Sj->F!!?Abt~lrNmGu5)=~n7z&f902Wx(NE_wiJUu0 z1G(*b`-PGJqDQEj|AfRdwr}S9ysc2L%B@_Z96x}WqAZa%PFT{|W2B||(mtYcg+0zr z6wjjJT9m+H-Y%ikF_L+R&;sgah&YTuK@`)>ky`w#iBc^oX`E7>glu$yJ&3gabq0jA zcN{Ck)Q{mHF`xH6VT^fB$w7vF&GEJb1&_85$ooC5K99^4VQ`G2n}RuJl_}hCjGq?G zbddE|`A6L^QGBO6d2#571le4{Z5D-;yAr=I1;U=k3c)q8^|5?X{dY=AipohcatHQK zztrxv?zP%PH46sptk^I;-hV(PQQFIw~(NQTZsxDVfA*tCR}s2+=Zf zzz!x)$im1-s4%s|k7}BYu|2HYJtUIPb8>F5#8Gfrxghf$DyxClB(|q*9|Fg#?Et!Jrlt&*%d6dV-)TEp>6Mk*nhmLo13Dd!!Y5~@C3q^%iKwt*NrJ{qd{Wl4PS-(!73J&PMvi5KSaFYgy0g0er~MOI|*4X(4_ zzgdL^cL`s%nPuFzGVornrhkaC`C9@*Rpc!fdVaIn`t;tc%2ROmiX!d8^asRe7eIVe zGsr~SlUXX_n#-jkkRb%n8R{WaCpBPTF$D+v=OS3S3K0aG1#|7|eeuHKtbjtLQ>>jm z4s;zr-?$1b63|ECm=~scj}58?>SI>AiqIQhhl|eWTZS%(Fa>{_SPBDNJ27sWBKar_ z;XS;KM^Vlp`Dlj%@`6=0F`h07cB6d*oQMWWKBCKLH;RIEX`=xO0r|KHLqqbo&=vtK zg?QI}`3ADl@_mLWGn92wQN~hMX<3EDydQI<0$fGE{ADdgxcUKp3V{m}zk=$t4utg0 z@(QHksWAzRzG15dYnV+W1NT*!Sn{MoND`8}48Ml_<)o8>54Y5TAcah$ESLRokN-S6 z!(_{Nl0ovTQMQ#XWCOs-I^xCaI?|hPZ#)$_P1a@w^DOXWJ;`zmvP1_oP?^3jOd*2L zvwUdb^Q}?H;gikhA{bFCDilsLfh&ILNkkCA-G%*WNReMP+b`<3BxglCpIBfq2uu%lSD!XJJAuKncOo%A28t=U~B=B3^@w zXW^ww-Izkp(FlFKf{nj3Cm{(K2~juk2bHozL3`ss2!+-uWr&(1d`0O6NNz8plQdRZ zI-Mcz!e_OBlB(>S&itfpCyUFNGr~XwXpB9vEjqgVOrf&K$Psa9fq5U5F_?Y^nqUD4 zB_x$GyX*3(cXQe9Dm)7UG4|7VYFOOm%0Z_2d`nRB{c;142kCu&=2AtJUJZ!uuB%px z;j4h?IS-oF16{k)_yI#x>Z7s~`E&#=>>?Bc=vTEqGHR~9uaxoX2h;W&%fbu-4{9q5 zhRi~J8<)=8`68&7HZg-z*F!E6Gy*m*6Kd#ag(As@F4)PnZJQ~KF{Dc z6=ioEsMknnVth#Pa}9<_#WsC0<>p?KSGo5pZt)UCNU47DyOBLuitJs?*aM&-fbe#$ zITmGx$lf9Lma1uPVtv^oioRO3D?H_4{kJ#7bnteZe%kRGq0dmJG!M?OCMTq5tL>ra zi#=I>cBlchkojj|b{OjGj%j9QGxzI#9vPg|H(a`+`X&vM_AXuL9eR4q{gz73WQ)qE zPIUrg)aFZG=lZNSOH;A6AW9h)W+2C*;+w|m^x;K1Mac!bpU2uwqp7KaYe`m^$2u^% zrjf<0%9%xO9GoB*`K+6g}OpTV2Wa4 zrgCGca!a{NNR@h3fqHF`MnQ%~W7%hhU$eDR%QHzUJ6Wf*R<9&mueD0Qv(BJ0-=MzC zurSN8x6x#<)y&PqEFi_Kuh~4K*P^P>qN~Bu&e5_U%W|;oUqh>{@^j(QuD;xEpv}Im z(jj-yp|imO)a96;<&;?9T$=Azn&%!6;^E=t;pOkq(coEM=@k*_HPGQ78SOvT?>|2p z5D*eD&=HuB5Lj3c*wz?SR}qq#5gr~D(OB~@pp}{)Sza6o>Whw!k6E6KZEuT7{`NgC=-0u3bZuB7G{q&L;3j}2z5FJzWgWVW_t4)$iwjc2tC*)W#@QFeS3LhV|iPD`SRRDSe@HDn>#t0UtOQy-<^MdUAXzPcyzryGxy0HR`&K* zPLEa|?mibV*Y;1>PtP_scQ>}THs9a2ZvX6TZT*X5eI~NrU;i10le7KLO4iNG;q|{b z*6E*{)2lychsS5<7Z=y}|27a_UoRgYZq6_7?*86AzkF7*9v@!*zgWZkGy;ur|8I4( z5XBn)Pr6wP8}9O2R-P zZ0(ZboxlT(6$%p@IaC=dCAhs!wED=$4YrXa@*J;K-PQr*>=xBs`&CmGvM+fJxSA2q zJJd&+j+3LHEZ4=SlxSh???IH64S6H9{4k@_OlD-K;d!Co(-Ew)Tm7X{swrttm&p0TNGhCblS%fTgQVK6lJ)6WQVT0kbuB}@Xa zXogBaG0uCZBi!`jLvRgXs@>tL%-h{Q5@g(Q4QULMv3a`dni$XW}H zK%b^-Db*T$;6|=b{PSxV#us{BduZx4($tFhhDdk@y8PXn@$Op7uyJNp`}#@lkoBe3 z)2cP=N!AzX%;?T>Q~Jr=JN8fe>CqP8PIZUGxaP>))Y{?=O9*~d5+xF`e?nf>c&yMp=UAl6c z3=SK_r=OIqu^;tK{ws&o&JaqHOs)bzWDt&lK<084a3o!R$aMI-jL#r}J}X5WOcN>e z^X*RTO2hTbj^fn7U_LD4BYg2k5G)*3Mn@mI&)OG}_h-eeI3%Elhq; z8aBSna6L!-#r)mN@V-Fweji6xgkWX}ghcV#Qn(v><+v*nN**9Q(5WM%rO;=R1rqX5 z6?zhU2NKD0`)-?^8}|?;gp(ig=tF_28~%M99=$*pFF17oVIRyJ0fPYYc$f=;HO>dW zKIiqTDI~Z?4a(!o4!k*>08JG?YLJ00+OR8EuG3e?%TqmcA*NuYJSKe_OCS+VU*)&S z*a$-cZ77+;)-T(>A@Z+#h%0KMjCi%8;#vlTuq}Rcf;0Y_82qHr@*+~ks0qe*yHn5n z;D}w-aXAiTcn2**uw7*irJnoHnxoCzS7tFS^Wwx}T*Hc8@zBOvMr7bCqGa5&z6jFD z5GmpkzlOdgW?^Wd={~ZM@+Tw>2pf@3rHYDR%_jXOFr?q(ly;gy{Z)rI$>1 zXeODM{fvId+sP$j`;M4zdv1*G=UX0sDamFVrnM3O|w zN4Y$sf5{T{p1Ds)*E-D*dRD?l-Gfg|0#y)f0SBL@i%_sVUj(CMippyWSuipk@O2>$ zkC#jgxAa#w8cD%&CJB?7+Srizd7*7oxmKD1Pk@}UV(D5it3n-;~!NM{$ zW+T*FPxk>?(@~ThV8$VoaN@DJ1xE9j5D>@l^#Ltdbv6oiH zmvs`w&F&pxd%aSXudyZJwbqRNeX=k6BW=o%sNO6lQ*%jjxq(paRwZivkfLm*u`ts& zRibhpoMn5V3X2UKv_7CI#y-)R?NnvPtDtPtINyWp43V8 zidJF6Ef7q6h_Zylep{lsVd7NlzFhT{y{%vS>|4T*`BO%hx+SDPE>kEg2=Dh<7jKr{ z4}Y5}nwom>^|8~mlQ(aTn>*1Ft&FnUH&1jP`^6?KnS?%z1ks#*J5owPHU#S^DG!kR z*57?!zD_@X*b#C_i(i@b0$3P=WOR5FfPyX(hfIW=9Zg85j=;1%oNgC1bRzQ*)yGZ> z*ykZq{;hB+t)&j{w)tY~#R78mJ+hC72F!pP3!ATqc2{k{G{}>cOj-r{^kk>vj5hm* z#CAs2J2)rVSbv9?T`BD5=^X33--;wBDmHDEki>W12E6;iQ?83qUKS+?T{T@r?xZq| zX;t{YunWa=X!Cw#d{5Kn+6bClo2nvUlRyZvsiq@R9(+b?d%v%V={z_2^|Dw_G{S0FBcCsilB7KVRF2Y=9oV8qjx$~QE` z$2G*C%++7w(dRKFkZ;NE*P{cislODbTTY-Chq&`_EJB-r!Kw+8bgg@eF`8C9&38;H zl6syD_P{<>9}iUxRka{>oFKSkKj+Wv7H5Fauq||G5X`YjlVd=0Gm>q;m%Na{0Y99> z2MR)g9pX9@Z0iid4u9Bi5AJXcU?n)Xafb%o)CIQL)jrhIy~GpAHqg&Coas2kGc}~@ z^Fo~3D#$d{85&{1H=<)3FY^wrSpY7EAEQ8CXT%;cQ5>#%jy+i(pSDhwkD4oA&G1sh zN2DcOBGspiI>Nsss)E{5T0F!@Eu@y(p6zpa#WdI?RH{rD>D=|}$TnH#HC%H|#QGIn z+!c3Oo!hXf0cz;i-+FM#hmn>zxGrLW^BfUd%TZpO{&1}!YpJoHzYoH@c_mS4ott{> zPRHOq5uk^LcGN_;IGX+T6Kh`%^Gu?ijr~gBOrD1mJ%?jmm>Pu=7P5{L_h=GG^WhpI ziLDN`9LwIC0HzilV;3!q3hT{}G;a$BtVzu50SxO#=;(P&iO0_11Th05Sf65l(gZkg z#_<6Xf6_#&<0fjV#jU_PAAkW=Ym#lJlkuODAN4{RBm#+!l2`!Au3=FWuAbj%;xt=h zrHd2v&BDD~lmt(3gw2q2cgSV9vfxs-{Iw)fwNFwETGPl|e4L-s6ho6z z0ikT8X&R~#v0S$CX>fl7{gT5H#ETP1O48f_sY5AgnOqrqG(n9tsda#iuOk^DCn}|- z4u*DqKHwa3ifM&zY2UUp7E?2tR;)c~(l^C30#*{XaWZDO(plA#+0`=1KbZYS5;8?| zAuCsyl~*!gN3teXQe2PIauTw*p3=&+pMr5UqNo;PklnGsiabzqNMIDBaOAPs^=E&*7p!Kf+RHyGsT zSVSs#gMw@Q18{HKQ3D@Tn4h{(Cp5q_iJZ$PKe6H@>~vrOpkTu-3)t%a;FfZw4&Dzi zeLEqG%%!2NBg+ZFqhH9&27_aGwx^rP{elM!WCm6oXD*IrU_HA$sTVb$WOch05O8M^ zwH2}B<{_k#%fmC!NH~<`#T&blCMgJhFZv3xQ;cYy?GBdB(^jzj@l@pS>XX=|Pn zLtEeqfOO0?OqYb+hbly>wHJ>o76dQi#^W$_kBS~H!80!<1eKL)ltyuvR+Wh(-3fa6Mm(Wy#UeRUrW~r5`GFgHOs5yOmF22~nXML7;#JN`7EiZj zfMCi$PqMU@P|Q|B+u$QdIAKM(s+zChj?81cui)8M35e_~IK;8U{WC3Z*~dqV%2vZ? z@d_57%jzY85FW}ZIK^vtHT%bvh;UV{AZ_9>Jd`s^$=irOlB!lN?zicg_p~^;^_d5O zWp(BS>!4UT{Bp?hN_<-X5XbTm{TNqyk8e^K_56u>;b=%7;m|1NWxUVvUtg-1LD^1W zb<%Cseq43dWp(foIINoW7(!)*^R2h{NXZ51xSx{&3q;w5!BAL=-va;p% z-CrAd#?r(z8~NAjZ%;}nGYU|es%4KGGh6F)@taOVOZ4$ren^!n(bd_sH#xR@Y9lmT zMl{X0#X6srzJ*cyi)52ZAcJhhFf#}kA#i>+HD}H>oBwE3!*5wiZ`4|AwSH-g{E=tR zr0pB4@5JQpSlDJX+g2mRMCF#xU-bFpjoE8W-Y>0PKUx;xJBXiCFj{NgP7G#k3p1Ap zs_^m4HQD2uB7K0cqSMf*w6Jkk!TJmBeJ}Ox5g8&M?k#3N8h+At?Q&|mXlBk`nVO~O z=Y?4196L|O>fa)CH=bdaZ$p8?TOXfmRep3GN;UMqbccBq9YnNjMihl-G=$VPl)BYU z#3{silyI1L5|lGP!Pn79wXGv`Z6WjouXW-hwiHQOxn?x`UN^{%weG((gRl3Jj8_8@ z+BE3;ShYGNJ^HBEu`Ocr(=+sp5&DUF24Kc}Mc4as!@7zQTDf`34$XS$w3>wJ2OzWt zC@lNG@$`9@4tynOrE}Ag$wb%X<};KUgr)C)4<9s_ZqXpK!(4Cy1{DAng< zCuFyIH2J>_`Bzkjyte0h4zQ#SMP>HG_tH#W{qPCG|D3KI3GddU#YsP`pwApswQTIw z{2XlvVqPEXMXV|4XwkMD#X{|50v}0T@3y4|aqxgF5XYh0N9K5Xa?W)**L&PRa3pC+ z(OBBMR1CCSlhhhCnY(Q$uC17n?Vfal+4SQJmY_iTiTlVAhq0lVb+wbT;RUR3MjV9n zpqSIwJX%^EkM&`L8EE3Weq7I~g3Jl~wkcHY{;rBK=1|a(^sr839Mjnh3E?am@8=(U zw2JNwHn1hEWgTpwNv|C!-ipyb1fY%&sVOw8K^&wRHo{?*_L=BNLHEG`LEd>`?RinJ zdGV}yUQX0pG&8q5`u$gT=RxNqlX|={2_wrn#fpVOj|qFJaq~>jIzhao_98a!ys6is zdFP_#rxCd5!8rETl9}VyUh0pWbN1@us|4|9EiPOw`XDX)^DYOzEt1nNO>51#zKy!@ zE=ihCad=77OSKlGEeCn6q-L#fxh`9^z!SZU;}JAqXDz|34TV{*-XIQhy^VVCE_!w1 zT9+bZfrq7YuC1rwHzOgo@xrYaucT!m0e7bs53#I6$F8K8ie+YWqE^v68%;8&jGvP# zql!rZYwIp>o;|R!U;ryFxT+6ygq63@138!wTj-6bjg_d4{kPCA?d6qR01LuW|64%9 z)3m_(G7sSjXku)lbKUR9Mo?U;Pi6TsLzVSPO(98DT1olYM(8>(oRmb^!188*c6UZr zx~+grRoGT}=R&tuPfXNQA;W4^R!zd&sw@Dpd85283emDSweh07u5%YPbv{!j2@BQ@ z4snHObBCNrPK0hZn?-jzYQlY@XMSS|4$@BjqV*e6erHxco)lU|%}kJ6+7v-a(mA&7ZcH5cMGJVoQUul%Oj^^yt9VdiRa~ z(17UpvtuRvR$5U56Ziq4ZOsvRn(6*}?92$`jwyxV*fmGmw9G5Jx>zygqT__SY~-0e z(DZynvA(rj-RIf|0f8l&$62&KqxOFcE7i~I11%IZ8tdHLvg+Mi^4vD6tSuVd5-`kjA zaQSNV#JTG-T{cQ9`kWW(aJa&~Qs>WK+2aZw)D3HI6w)JH)LCMH2*kH5e-c=q?TM>7 zI!(Fnh#z3^zKlq}zt5mwV@|76qhF)MT=!HJ@pN62Fz#O>pAP99bk#p>$#7PFX}=dXo9Q#E@x=-*VKnamwy7jV#Lk+ zK%Q7Y@#leF)IHU&KV~hssbGMlzI*Sj#r_G^$@kCFHhC8qlsoKw@8o))?0~~>|H1QV zf6{FmWn?rG@X_A2q>257Sb{cwB!>4VajxfrsVAxT!JzMyWjXN`-OrUD&o#s^RX<AM@{S80WXii`QtxuajX0=@DC+_mffi~yt2Y6F3MiF~0fW$zMU8bECMP}$sOGuxK+?+N^|AkcF=z9Zhj*{JqpQ4)45uIBS~LcS5_h35I@5I zicBz#X>g8E^HcH|Vjz{9Vmt$6%&?ExOIQloU*fWGs6iuFq`c1XO>V--Zp1_(oFUV5@2k^CHAX>sBM1;f^sK)S6EB%D^HX zc)A~_WG1Qb-RVIoJg%j-ScM}63ix0fph3*{(;tednz(j{dAEjx*1a?C;ml`ka5zH_TwVtv7(n3pFmuiJc`SiY{JlxC}|N zLE|*YI%GC01WUa+MXJ81P;!C3oX!20ZLG7)N&7ougM5&P73Y@tAFq$| z8HGaR)KjTqEHIj79%#)ipH6SikxMV-R_DU_FJ`$3y@ zwv!~)>@yEHbnr0>mY9_5h`%7qQOUNBJW>;lld*O;m$YsyXU;Rf39QK6D&~NhI|;z; zlKF!0Pi@hqenxGJDkm07tHw2a6PHbohc}l9e{65p-3X5N$6cx-w6f}1AxZm&MU5{N zAl1eW`-zuXZ;#9N2XEY~PMgAzVr7n0xmBTIcLfN24q}DRz48>xMYbrbzth(tKUqmW zr+$x5q2+ubSz~Syk1-%1WHb}Xm)i&)`Qb!uu_KlRp&44B*|o0x4X1Olx_Ul(k&RK{ z$q9BKK@VJiTYu@k?EPMV3+8r5LiBnHAcPka5h6IWbu7=oK(;>m84SkcCq%J30J7(& zU@Qzh7g$njGOB>Ab}AkW&AV(h%5Jze@9BxEaFVf z5SpJIsT2$q5;FD;saVuQ$!bu+@(s!1P)H=@)6tSjwTx&qC1`NEVq)&|5A;u6nFx2U zqitB#dY{$WwKi=X@tGFB_;IF4e60_a+!0}kxtBH-RZO2NFlMWCn=t?QE|+2HH%Qy| zBx4(_n7P#eg(2Gt!l2*I{9@}1spKZ<%%=B4OA|8yYKBITV(E zZ{?EJ+*hu4qYNU!xQ>-{m8%J$JjdZvTka>rs#NiQF|EuP5c+0{78^c;OmL)vh|8kqc~1YjSwDD5`tqb2#53r(pEb8( zR9o6{7*WDB*Z0UcTE~>F9l}_db!ngpU@(TQDm^yxxR#pN7OY)5U$n1+KLbaU=?bp= zL9q9y0tX|5Y&WqOGO_euF7GwbEv0Kf77B z0feu*Ey)}-!fFuiZgR-*FH!JPobVxGy5H%qwtJQ*W*PYx6T2Bc!zq%P?AtHjGXVX# zkz;9eH@>=XM{2`A4((!mJmiy^ja281s;RTx605Hm;Ojpq?UbaiL##*+kgkwa6cT$m zgi1KoT1LKmcfKYjxIof8NO=q5v|3;AQ#d!zBU!-eW^ z{FmikWCsdwt8@K7&ZNVa7Bx;;=d`r=D`6_JBuc;w1CGE|(9?ZmtBj?&qUL&QRa4c1 zm$glR$J*T2zz$-)OC3)9jdO2~PF$d-%fpYp`me4Zy&X>}wVJnEG?EMVUR{G7FtIm7Pjc&Ylao_OwF~9xQeA}>#tLE9>6m6|Cn7odk zT0a1*&YQHewxT_BKN=RU?~U?yEFoE6?ASP)rh9WFCFMR<5Mx^aY&e$x;W^8$a<^%f zH7^$8Jy+XmTdZYtE-EH$5fO7=i>h*D8P>jZDE7Eq_jc*%@4WOl^4KCBcNX8(zH(Y< z-#U0N|KFIqtFE^Chu!x$K^xpDP~6=qQrz7N6ff>jw73Kf?i6=-FYXj57Tn#X6bh6T z?)(3&@hmyodmrp~kTEin%$fQ5eXpuV$Ch_&PY{f6W<4Lak@y1O{lE7Qv><%F%v`+K zd0-8Hdq{yU&96u3?eRwxA#c0*wm&{u^)AP#inQ5W(#C*rlKPiOFBY|FH9~ z-UwRy2vFC?qkDpI#zm!pT9h&EYc!a(rI`|d-V_$q|;>L>2J?xQ>O3>TQZ>WZ1{?98laLe$b+p}ab^vK(gkb?)_WYySi z)Nq%y_YM&u$kFg_3h4s5VlFogyzsFTT=_IX-n`gTF5c^)BFqKu$!m7{1D#BV z?#+tbIyKba2S3)w;c6gRP;lNQRO3EMFxqipo%WLAw67lXtZ{yTMG${s;zs2M2Aj-8 z(Trx<^Jg%&v1stuB?$zxo1>sTG~2G+NM(4wo}?}V#qqF z@R(TIk$PwXMaFre-;r6yRanMtpwvoM#=}kq8pl$@4dn~@PdBS0LB_!gs$;E@>aFq*mhk1N>+2vR zP#Kvp$0g985V^}n-Ty(*PHu8sHr-7!zFaP|Qx3Wjm>Es2dI@)oQ(tJDl?t2n8@v9Q zA2lx;iKk!y*?`L#JbVjbN8btLg9P$jvSaqwRu}{cLIOL|kkv^ z8Ehk2gHsgI$Jl)2*%VP3dur*^#>!R$F@;1snUR@C#z=4!dXwZB(wnN-k;I?a;^dK< z_}PchiIF6V3&kg*AYeqe-aFmV`quQK5&2x^`o=lQ8B(R6%u2JuN^`<-Ak9K^_Ij)j z?eoHdrEcVgM2ah&laY|*1w|!ljuFU!(kA+k7efJjYk+ccV;`M-?e5bcGF+~+ud>VT z(54CbA?~njx$PslV6-p z-Ze7i1E-)%NB65!eshYIX;T-KQ|8-|pYIX$=#ez&!%!qtHPa}xJ*SbMLy`8X0in}7 z391|VDt{4VBIe}YJgWkKDP7~rSREp5ABUNam-=AL5Q5cou*Z75GIg5Fb@VTV8J>@+qP=~x*+z(sRD+EqZ%A4I~_}-rLK9; zBm@k}VV}9?R@-eQb0O1_Iz)1N*78S*ohaOaM}5t9M!l3Xy>ISJ$P+a&;$w@W1x*1|r30XJC@?ZUCs zr-}`}ISebXE><}xA5=6CwNB-brZEhAuB$*820jCN>`_3MqXvmNyxQCxJ*FT1hI-3Y zYc&=I^=CsU9}J6H6&QTPUR=^b;itz_SuoZn8~Kq>b`Ng5kyDzDvqA`)!bF zM{YIs?Xu*zN#+B2gR#EOVUe%kI+*$=nE-N3lGn5)(~Kz`B9H!<6jH#sq;WFKqO#y4 zH_`wLn6__5K0S2>z9?L3(xxH2foQWinF?4=Iyo6L+$|I5B*O_(Z23j9AsK*-*@TsK8`jTFAmWM7A6 zx!Vk#C!0Yuv^oq?I1ItfM$oAaldZPs$TsI7)-_zWus*Xe`n%_aU7#RsK?R1s{{~Hi za9lsO8qrOk?Ped(KGHzc2`^ze2;agiz<*rdKP@*?%4Tq?wsgikaHc(Qd4FK@K1i|F zlv%n?(QS>2d{xt7N-0gB832FWG|Pks$B&2L@b|Np$DAqjv&w1}{N5@=`7jVuUxe3; znS9!7foyw;{0T3aI-vWovq`tJ6+)?97&~MI4kL}8SG|iq1S`vW#86u(Wl)(*#S0T_ z=1^13iG^z`B`WVFO3UKRF228AS7;o#l&a5VoqX9n%ygK|lD4kTI)caNe93*o!X?j% zrJX}N8PSAI;u^{Y9xLECdZao^7&N`KFGm?3#{Bav2*QfodUC{1S+-{a-Xurd5 z;@@u8x}BCB_B5vb47vSJq_an6`#EL%IZKmy2m5*aPmoyqr5thixwqw-Uvi_>NPnNyX^Ns|8$3(ZkdR97m_QcjJ9vQV{@nE$ZQx+16v)zr|{%1edH zP@U{#-H0l^!c3?PeKn!bnN=tbZL5Ns&`(}5#$QuSq1TEfIj=0VtKJ-%n)-)@S_P+D zTiIHFZ+snCg|4f5``V^=+g265Zmiaq+1ooiv{yq}s7rgbOMe^Ggu1zVx{Y1$MU(AYm9bf7adF)1{^Ftont~T)EkA&r!*9q19{G^upq#a1|a9{Fhe@cH>TEjqkO?SrFAaqVOE59(S ztn$@?ZY;bGskSv`ceQ8FPUdus=S+>}Pmbj8LL*j%1ywbLgM)>~n?;R{|H@D(3oUEx zDC-*kmxcagLI)}#v#%huqqC}is%mngYHOwXY_GPuy1u*b)r59-HJtA^_760U%r)+; zH4Th4twCO8=#OzI3vHQPX&Z&&(4XytgY84(uQC)mq`Cs>9G~c1IOyD6?>yLgC8C$7 zudS<}>%HImdS|Bke$4e?B{YQHPvnvBj3j;gruS9fiZVO&89 zhHkH+-K$Y34qaIJM~2Q#Y@JOUA51*lLZer&N_2ncm56SxPyKzGp87|LLKc3muD|CY|LQ+P^ypyu{Lk|JuU92{^>=mm1PVo8OIYjM>wo`lY;J5G z9&B%H{S(95{m+o^7qw>9vnisC=`mGJp4Yrynu4i^Is3=PfypU7uOe; zx4-Ug?|Hp`DY70%~|30LON+$mg z2n{X|{!cUtQ#f@l?G=RDtc^8QEY|#Y5K6(-O4Y zjgxxlK;6H^9g0n_u*z;1jAn*LZEsxK&R9{sHqq8_FqQiuYM+^~+PW}<2i@^wvW)85lCNJbC~kaKBCC$SW9%gWO^e;KV3_+>G7 z^QVVQ)XQ6y?$n3t!`X@{)W3~B#Ut6{{vvAv9zvJO5J0Sfl8w8@E+^p^$dd<|d%N=i z0;h5a+?3lz1c#yn93u9xPe<88T<1d5}Fh6W&wwBmig}xIP0=tR9G>UDW&AhE8dD6YzrZ1ZN8wIn$h-%U@vk2z&H1IZed#XQKef<>tE zCn_C-6Oi(}Rh57H%rkh}DFF6_90m?E@&3;=gW0Nt^jjIis7f(qH!Qg~hP#wmNh&}- z_MT$|>n(SYU8)~Aqm<#O&i97=kdjfmimQ*JYuEC0?sAUF#Q0!ivK)*HreA zeH@J(rQtfk=3?SHh`t$pH(SZY#P|4gqkYueao%xdL(}kMuj#WQSyH7FGD)H;Rg{G- zMJk2Mq#eP?*SoTKC)Sar04HV*w`^Ho-lyWBqWmO=#UVG*UmA4Yz=SW1W_mB%zc;#4 zBDgjKk(KzTn8+O(etsaFydIZ?=jh)}e5=N`!(m?iP)lzn{;*#`pFMPt++V3Rb4rd; zb6EK36mqoF6h4NTaa-F=YFfzw{HkF$*+DE5$#Lm^3^_39ftO#(a|E{Bd^4O|VChmI zW6S?d<{NG?g0}jl2A(L4gsOXED^BI_k*w#GA5Pw9#A@{8@6a1#L3(Gjomf7Yhog6m zPyCPfHya)IK(3o~HWxzR=J6^)7&`r>i=MdQF_=~mwj0fNH=ZnxvJ#){xyw4{(}ld-G5NfPZzuJ+iQbV6d(FTOsEXwCyW8@WY_=@M5O zs4B2;Cs+k%8B>01Qz^nQg)f=FYa5`MWI)|25h8PcI{`SrQ2uKNkLg_&R^NR;9HTsX-V=!3W|_4 zO{p)w$F0=EIw{yq`5*lXg><~f-UD%S89x>%o$1Y`{h6v!Das?K3<%2O)ec||K1B%a zS^Qx%1Hwpy#Sumed25wY9vE6YYU!bmDm@3PD$4&nV1xbT1@bziTIKL%d}ZAmfzs(6 zfDvp$Vv=;MruuV$z5HF22?ar+8%jLA7;&Vc0AC?nI*^&0dLdUA!+d$XVule-A0sKZ zsK!1O6$x!>$V0`I1AL5d1RA|gpzz1!XX&{0fw>lRhX0Mo;*b0U^SI52IIF3KCYmlu z1N`A=A5kTR&Dec#-uqGX{b23&FdT$LMxdRr8u)kK=oDAU1@$5NJ20e3DPFj zph6em=XpcIM@s{mz14d;&&xyS<;Sr4FAs7qT{^&wX<-1G00Mn4i z!iG~=X+B>3qZ1FG-RkjVo{eN_0tw$W!{p;Swd>N$C{9uq#(^;03;xWcdWu9^ls7_c z22DTl*GOl+CR(7$&R{aJTPdo=>IYX;%_8jiyt2IFG#Jxr-o5@(+J{*afO}w6 zrzLls_Z-6eCipWu8(uU>Md=-9M^B}t&dQ%q7*_XVb-xo2rOi$oZJrvEj}{!U*K_?2 zwco~rip7Lhq_@~B04EXkoYa@gD1}xXk`%Vc)9s5xw7iC}8&Kz6* zgdXvVRogy0c$^5X-Zt~K?)mK-UbLrsQ-)gZLTbZqT__<>(o;(pUJSrJaU+ z+2c3K#v}RfuD3wPn2X0nl27-8H$LZX%HX)O1wD>Iiy`p5=sHIQnYCF|YJ!o}=ImsR$OFht;Al$9?4gO8AjNGx>5$_Gz2s<$gq^`#SZlOfH(= zisU!ng`)3XBXnetc^%>Hc!%e6oz6=nC*ha93e5AwMCn=Wwgt#HwEWp`MrXmrQD*uL ze^HN~70<%C^FG59uHLLy3j78JAbHYn`EGvpTKw&X$@g_V)oT{nQRjES>Tf^n2xs6( zfF7;$ez-}7hbY2*VBjK0do7@B8W8QKzBKHFFZ-21)(<5j5HrH|9o<(}{y>iVpglS# zdgLHwHB7l{J5B5mgJD{eD^v$DJFM`eJsA|O~P zB3P~@_+U7g0~T#cEG%IgrAz{AgCYP=?VUJ1pC~_-(4AR`QxM=wfT2||>R~8zX*hdp zcmr>6#&CGxNT`2lpz%nc=^^%hKv?a|CWnFvTDWRhf+}(Y1xj;3*lI3vkulmd4Em`t z=o>vsv=h1&Ku4aF#*rqR{>B$04LY_O8J-sE=^4u18rsYs^$DUDHG;i&iM9rV_MH$E za)}NWi%j;6KApxGu`)ZQK$(K!$)iK|3XW_8B9}vagAXD#0DkR<;e#GgAy%P8$Wf$x z5u376Jdl8Z*1(Shz63K-r^aC$PCO1Yp4kAD@0V!7&HykF! zKTk@(*j~P{`NcXX_Bg$e0bUWw#*^K|w64%jHrYkr$;2j{e=NodH4k;UAZj@mrM&d% zt~5F_k4QH*(Os3xJ*`|1kQWZhIRx#)pl@8FTL91n@;DA*Fne0cB(3n4tP6TTA=#E% zD8TZV@^lCNaOVqMT8yD!vIeK7pl4`}UF39Dw$_jw8^`|Oe+JLy>%YZkFt~eq> zMx~ENR%u2lns>2iWNC?h%>r?iHDg{GV<_ZUp}rhg*ourKU>K(h%J!@-QbktnPgCWp z-st0bdpD@Z~ z3l`_T5c_@jTq9Ufy!%i?@z?-}G@9UTnA2-OvMK$6npv1pKQA9jUeTyRQZHwlDnL=Y zEZ^8=-H7DfAaqib=2fqb)-=ah^}O5&qtkQ-YAR!Zf+;-NsD|~{n(d`>agt__lX91j zEsR2qHsdT6gd(_)Ie{Oo-X`N+c{du2H+-pR@oj7TB-b21R%{{E_TIKR&a5eQxdom` z-5lBf%doet4q4Np)$?zYrf|x0I$mDR0$bH^!>uyMl_s*4hI{!A+K$!+v|9SdR>FX0 zrl=<2JMD%*UK`|gBX572_OAvulpc$eltDhF5qLpBgo|>#tfB0>idNUhx)`4hvCNL` zm!l5fs3uMm0?KP~MtMf?zLhDmx_{NVNKxoHVd#cmX>sww zp)_k4T&Q%i^;{>(!|&`RG-zY5?1~oZ$F}LQR_LQ)?&8tU4b5m3$ZRPX>os2a-fG*= zhTaEe>eH#{2dCo!XPd?02b`mlWqk+ZN%}iivfz9N+&Tu3(ecv+lQB;Rs6w;nm^qDKxkoeUBywpH@xN%{6GX0>_n=vYa#Gg%I87B-1y^}z}cIQWhLK_enBMBOG& zctrT@Zx`5r4J06#kqz^@l_fk#W|z3#pqt`Ad&S6G(%}uEdI_PvnRl-0oH{z#1u2R$ zLB4p4Of`(mV@|#`EOsLjc4HltHBqaBK2c++6C57x943)a>SsD_eB>Ss#q^BCf`$IS71=b5rXyu)44 z$BIZNU8AS&geSjLj`yw(NGh<+^$=DC{-9{~W{K=fb+#%_B_3R9Q_m=xM(fqNLW~1W z1shB)qWApunR*Z&_KNOdlNq8m{7LKglRo<=V;5t-Q%OBmk&8^xL3F;x3*!tG@0W&> zFPh8KoJhrI$4DcQts$L#lczIelT*YoE#G~|OVFnSm_k&^=G8^!H4W#r{pMBAqO{Z} zoTvjPU3@KkIbdXcOHAtibTobFnsKZg=(L-Y>zcDOoC`>vqzjq%I7{frSlkF$^j=&1 z`n(wMytu$n;%+@KwYngCwjiGkaTV!a$AW;#mJ&pkk}x2_lZByYO>NN-#pmy8K9E0^ z3(u9MkW+|z)oXUPylc6VWgb=pf5Rd?%V02iZAsa-Bma59IIBNy5~JL>c18@nS7dbt zCT5jlwa{~QfMs>U4}HLRwW@3RPijv$L(pPFUBlW?*VBwlcJJB?*TRrAli>}v%}(tx=;y55ME|f&$W>%UCy{)dcm@8Hb@u56z1gyL8>>Au{sMyU<204r7 zdjekveqmkQ?vi&ikLWOP%x0mRA0slmIoF#TlBnGJGGw6Sp^6aDWLSx+I`kDfAbdL3eLAszs*sc5O+na?He11w&v561 zszhWccwDsT;VR?bk9bnUbh4YniQ;t5)WE3|c7AB|`Dp!|qv!mn`}|t@;#Aq_LRs(m z-G!ymPS^P%@B1CZ(|szxgeLb(+N&H^AFGf+#s!$~?4#YF`feBi=GO@n9MM+wI-G`c zj=1TnSVGQ{07Pu?1ug|VMEjcV`v?5XbBaqi#+UQEm-iPeZ*TB>M0ovg*uPyo=WH5R zAHsf`+&$Zb`Ibk?GIV)(D*ydfapQKX8h8YQiJpZWNRB61C&`xn%UbueF#urn^6ToF z&zSAb%pb)}6vf>C&gR>l)f*F(#hduQ+oGbk;&CUEQzJ=666xK)ef^INShE5$%D93q zgGI4tYtclV&YfO%F^qmoO*LXUEbF{K@Qd41QQ5rqeF##y4`ss+|8|d3d(ZiI>C4o< z7~7F2+g9>lj32e=$*L%2G0SUW4~^gVxNQ4)Z#Xh+E+>W`hy(9oH(5K*mpm@+W8(hA z#O!#-Ei0(P;$4!+KWx>DKF)qmYHeQ?H+pUo4RL>|`nCS@y!jUTO8@SD`m6WGs`V|W z(=BL32gmvA-=V(=o@<2bDyjO8apaT)-`>FVy#XSlqf;LSZHfmYBS%7Vr+X2w;qYj) z4ll(b!%#&f-DI)yq@u|LWS<~dyYPv08rlY4PQie10d1lJz1e-G%&qma-O&caR>#$> znDU;WaAY|Nw6bN5ks}S2A8FV^&7m{J#mX(D8Z-ws+S2aP?r8c8&}fu(AlzBmkCNtQ z=e-|A9~aNp+U$;K`^!!inDov)a$F@xt6Ig{Oj%-aPvR+rf^KD5=}zM51p~;Ru?LmG z^wV)HqWT2_TpLsQh;`5j!K{Y{Oe9cjp9>;Z-;75(`0iRgB;F@M(xL>s0EW zF0vIZyu38r_1TKSp>aFWIUjFVu=Om9gA+cHn^&ewiY3}{O(%?AN=!EQDyHxxMP480QwB;lY1nR@ZFpFwO#hViUqDu$l1=MS#3WqneM@r_(`(tgHb`mNM??iUQsI z`dsd^k4XUyM==1II8T1509PwEUb3R}{G&7;XUm*RtX1ju&xtY^w^>oxH_#zfffhAz zFOr|PLY8i!+VB*jHI7^6Cw_&n=??_HFNK`q{zOUBlLOAT)A&rGXQV4m3eah%;9Cxv zh=^UyIc1b(z^F>10c*Qj%tUGHkuHmSo))rALI>TWysCVI-O+`pagLX(u4%Zt6RX{_ zcZ{-Sre9RGYp2i*OS^~G!cTeI{uG|2`n827LfbUw1xh`Pd09;iemp~um0y}`I!Zj} zhAu?Qtc&NB$qJpOkH3CzG?gYZEoE=E?W7=Q#&Z*(#vf_asV3kRPes(p@n)%l>pTgE zRnuG3RXM+go7vHFtCHHDO(-n)pg!GMq?rx5?Jx9^rOvsXA^tMZa}66c+?3F-|D3C# z^z*>yYEbS|U>oASb!m7^BAMZ;?2BcI?zPxpY~=?`sTi?7OucMb;3G}ld#TgqlbRdA zz{wZvJofDfG)VyqD?JC|<@Bzr$A6+xm)$6QS(k?9b1d54j<^X2LuDURt;U#ics>uY zyAD4E1K_ERVKF?#5NK5c(Xy7iO*tq+NB06f zu!hzTxidTKnDI!^m5@IKzX0gj#X?XiDB<7yF0CDy{+??7_+K@a{HAo*G zwpe(k>BbLmbA#8siV^m?CfJaB} z^32B|h8|d?G=l}O2O*q-qlujYh{hoSXi3g7F5ElFtM}5sMmgY#d(0|)TP4N%7{S+q zR9K0nfmDB-BSKC$SaJb^%+l%!&Xf>pmh={Mmn*i+-Cb(d-VmW`HL8;pTw*Uzd7*@a zaQee{Oj>$l!rcjR_Z5q9)Ttx-oLAvdxTb73C9)Jpkoa^~_^HdVc7Ts6rP z9n-Xl_uJ+?EP){U7ho9-y_MPi`v5Y1`~+u)X-ga#fuIljKMh)O>E0n)k9<78cHT#~ zqp@Kz0>a!Y3lHs!Is2HEwg$xU>?dt!)kqCxsVoB_+3uKf|pWGa0fOl%(><@7j!0m_y%jM762- zBQ>QXoNBAZcxw`{Op_{D*l1*DXd)_WSQk@BGCIJi0nB*{cqWh0*vqwu1GOs15SjF7 z#wI}??nM?Nd%Ck3^O0e<6%KwCdRu=M;`DK=u-j}6ui6(~tCOp(n{16xgmn6^c`757 zD#eIbbO!(2zQl{+*;ugn=#_0(;AnN(+}2*|O?$+l<&v>H$VPR|M)Ee5boJqBcIYp3 z^EOuQ1=)$(E-(FDXs#w>vGaReS%v%EY%y)`9K&RAK6uwULUV5Y1_{GLQm6espV<-$ zLUW}nptWGje?TbG2Pg=2^qTZBx-Hh}IPC(s*Uzn!<#~yfWyIeet`*)H&3AMKY?t zwNbT!(O3#L16b5`k$Gi?aKpMoT*b~Y_UNDBZzKsX1HyxRD3Hj%^_Zy~IumS~zt;yEe3)2wg%a|oio>- zEcu7qdgjZ)?2R)P7>Sc+K3{dy!nZ<>C6?$aCo8s0t`=%LNe$YAxg+e{Cju1g^uCL9X7cOZ^L95d~z!&_OJ zItDnGJfo#$jO4qA>8sYpoK2g(Az2!gZhn`JVP_#E1krYq*I=3_0S~=)*E`yPUHubMV$c151LRC69 z@&a2&baJke%%1k}zdU^BBX>!DySUqMCiI%ard%%9t(&(SzSV*_V`sh(J#1re9 zvAPva*EjUa*v@+bN} zf>qJvlQrRNFx&XYpT3VKI=$SPg<;!5M6F@O!+$Y}{(XF}QqZ046oyJ4 zi5UU@!Y?4}8FmqXDD)5p;6N5=4dupaU-A@lsD*BdihVwQ@AIx_vtRUS1@>wMmV`ct zj9(mAv6l)MiYwV$t{+SR6cf}9q?qod%Y}p9LKDrwW0Q7UQlXOT!r>f7Bb|yp6oe#H z@RzrVxrzx1cnY9CB?y-GB_xuZP=#wnp}`A-*^{U)NF)Rv;fRyqVYo5=X!O7Q4vwa{ zkLG_86%XLMy$SjrAu2+R@C&|Ggu9;)t>1dH4wW4?nNk2{Ktk*i!2^uI5W**8fFqWM zVG1LdT`_<>Q0Y+GpFNU|GoHpc&JBVcT#-vsF;8RNX_8go+VSEL8xZMyd~1UfYU(2e zH^vMcgqC9HrVY-Lx)tiZiXDAsR=rw z0Fm_ulHK}^uS2S;{lmV(BXZv4p$4-5g3yR)Sx}a2WaYmgbV4>}btIJZL&(zzqc^TS zpI)fm{l7NYz&^En4p1A=Ot9YCZ}?kjwdJNHrH-KF=;Uk6FGzSiTUQ zQS*Md&`!R@SH3hWswi5%ymBm2jjVD)zKS{; zIyMD{Bw7C4w#o@eFylW%s)|2O6{mJ5+9*OfjC+`FIIF!#hUYkYg_VR3;pVxO)|{1C z8VH3VqKCkf%^>u(M)<)-3cUbWj*;3I*0dmMp?ZFL<#!64JoG=d-N?p$l@F+(^bgC-UCxP!sls8Y|ekZAHp9bNm zHXKe&mCT_nnN4W>An&$i_FL8UW)b!XPghgdeGG1@7FMwUMYmxE5M1IPH6zN3SY-stCQLBW} zh0N&>GxDQR*$C=XEZxvEuasRg;7T=`qA0?yw6wAsY94j;pb6GaK9RagEc>5%+v+G| zYD!t^dCMf!G3sn0vw6Pi6G7@PSRy?dJ&2yVp-l0!d@M-kr5Zv-h|{wg+Vn{8CpE8AN`^2-gz~*ySWpI{GA#!O*yb&6_oAU~}h%}|4%p*bi z{BVjedHQ0(w(4-fu)&6hqzXOrpO@8l%`g;U;OuGOs5ciJ))pK^;Hj-x-rj4w&TG5u zvCvb%(-qF^DTTN9@Uf3ewIosTh=dy+2ICvU5s3wfg9G39z!A|02Py>vOJQpybVF%^ z2ufkYe!+j`fv{6RX!&_wlNwNg(UBV#1lktqdrC=63eu>S^F)^OLu1hZu%w%s1izN# z^6?FF5f1Z1g@Ah6J#!T_Xo~4#N<|=kmatn2Zo{r+SNg_ek=c}aj%u}FgPsNpNi{qo zl@+__+1(|sV7*<9S!==|5efa*#}F3!C3u?t3CmhL`qhX-^>cIhdCQF!OY(i${F^u{ z;uBVygqpjAaVQ}|{n@gKNHIsla@!xjH_`M;t<51C^kEF~{-Ud}!EcOSElx@jpfnuk zT$^88o3q!q^j>~xZsnF7M^jR*9~9>1xLj49cM1 zS|qgy@7^=Klv>88fHyOqfIXHZ3f zt}DV(66<~3t0TZQ-dQy&t<;&QAOHMdH1D^0iMNX16DZC8NraM9YCIGtLPJFF2a`1t zHIAZn1Pm%p_)eDQcy`*Zn~_qICct^1oJdH)l*!NHVsb}!-%uZEUFtxHX)rt1!`6yBJIdaw0z%#K4m08^$@g z=V+TR3LaC6Vi0^n?XZzRj>FG!&6)m4R*u>TcI4<3TvqG`pMuIvNlKTfNuq(YpUHz$ z7WZUY^x(6|ci4e&T+%yJ@}Y5<$5yD;@$XF&&UeJ{&1o9U;+<7cXA!7v&6PGes?;`^ z7zj;@k1}F)2*XS)euSu`&1v5w=sOwYy|-mw-3Q)(Y&Oz=9a43$Z8JI%!L|~a*?9Il zB8!5D89V`4S^a4`2Gj=9MUh|^FIH7YmCOO(8RMd)Flo=4*d~vx^J>a??xQJwKOD&3a_Rgk#oUN7+M)yc)KvjB2S@Y;Z4L7y>jlZM3&*z%PLZEc7_M9_BKT}? zUAdtv55BJaajpX2Tm@5a{3IBKr(8u|`jFOKMSr`VKDvqzyYi}xNQk;^V*c0oYAy^j z0t^xi1hx<+T(mq(Dm7NR=s%QJHY@QpubP*tP?-aDw6BQvTZ-DhZB;0uEzZ^ouYn5M zS2zo*{0QA;h4NYGG;31@l+POGq(PIara9@ae7364tf}Ia&ldhyRkiycI9r%)TUq!o znf=$xIzzE+XC1Vj>XDq|QC;ShndMb9@|sRgd(8p6)?CE7Y+516aqPfVF+#zx3+G zN$12w=h8eBt-gxY^|h{@^{#_0C|d2kK7-~=U%BemM*rFIz}(!x>I&4V4jt^g;#4R| zg=R}<=l%<%&P;7>Ktbw%1nSD_?8OFNFN)2F9@fa#yBhu^QX^#6q`{r~@5>i@T|5b9{f|GT4A-6{(E zzd2g{iFdU#CDJtFlzsQAh2yF0W@A~ejy9T}V1L4^p=9bC$s+*qA4kjakfk{~YpelQ ziI>loZ#q_#(`B=6I_8iCClNe!CiON|E;V3Zlp6XVS5b2cFXSo-axnIm#$;4yjknZ% z3Km89OIV4ZycF&(Ce=o%IwsyhPWh7Un|iH6Cd~Y4wLYIB0^hRLC`dyx4l5`YEy1F7 zITyVy!;A@6u++nTiQPxoxX0%=QmAbZ+C^~fkMx}p0b&_e;XJ2(fPfE@p#jFt!25B4 zvPRf$4-M|8H!pTE9i6zW2YZla!?kvwexCX67UieS>xUl){bk?5UqFZ4wG_Dlxk(Gt z=%ml=#;6EC0;huz;P?%#kXVo?)pi4A=8X1|i`KovA>q^3NJKhdcdWAB4Y8pkV^vH{ z-jELxu=&OXs8|mK*~ncFsUJXazYaHWD9%mZMk3FvipLQ*1^|Kh?0OPd$QCn1;!5he zV4%9P7mi(S2<5a6S;_;Jy;K+g3&1UXRE&~4;tWi3^iVZUe&>n*IsP-iL={CwQxE7! zN5yTPOhA}hnosd$HI0wlbU6_0u6(8Z^B8NRal zc(1_A^rh{U}VVN8~;26)Q+~k|^OssvqKigJ3aG6RF_P?wkWT z_|~c}Y}Ji4AK;jPZjBMS$X>Hj2iap}Vrt+Ms%R8P&jQoKIhm2UDSF5igV)%^VJ&4p z;Jl3YEy5x>+)S!S+lkHceEvh~BBH9qOOI~A9t4)G*|e;9BP;?&PDHbY?dAoL^LP74 zk#BZerjFOnoZMJyN2l*DDtY>+elf}r{QW5kRO*a8W0@|Z`bm2rXiJT-lqFSFB^;k{wc}-= zrI%{mTnfRuKiEhYNTxmj>Ri^B%$3C@M;Zq9%|m%BOuTL1Y)?J^>T&lwZ^Buj#qF3$SXT>5R<$8+ig=o!QK1i8jSI-GpD zs7mMP5Cbz7zn`PvXl&0sbL#0!7a85LLhYP63t0yu#SxyHfZVJ->95x1#$%IdkO{y= zE8e)mJ~m}XA%H9KVZv#>FqIrts=G7<O6Iy{80Pa`8#5@gWdJ@WZjdz%9>&4uCMF2 zp@~AJqZaxr)22#JeR5eniT772Ug)uuNl;%4{ogs9qz z?tFJj1BzCum7@^OO3ng(B9Fa=T>7%d-@BG$lWTlnC;PcR7I_vDc5v->$3AC`$=|FW{yr}P^5w0yD>~CrEDG~Yeyr$Vp092 z?E+EGrEPqDE5oIGkmy_3$j9}INv`e&410Gh-*{q6^InvFC*w>slhDl{O?lVK`ahyf zE{ZifF!7zGgrl*5UkJN5?44s3R;3bTVU_U6k3+v?t>+Nx4B_To(XRRIAUU?ysYP5X ztdH$Lr%8I4_p8iSNX&w8TU*;O>QY%U^`DzgXf@YMGcd&?m^OA_l95R+#J8=hm(9JZ zK58?V$49TS^QBKA|NR_oKxNoZYOZq4X7cN#5}ly3pI;6P&sZJ_lhn3#!|l` zAD5UDj5&%s{Trzbzqyvb$x&s~m%YYm_C3Dkd0N}kuA;)=P}UGfbrpdPG!jIS4&Y4| zpIMgjDV!0~y#k|Dn%u@}&no_CO3cQX$RW?}o?%K0w z*BtxhY5QZi(CALAN82REqL8)E($V={dsJut7nQ=f_b`7NAKL^;c^WFKc5TyZrJ6Ln2+^G-N|1 z_ye=QxG(~|28X}yXav1!Rn*iC)gcVQ1~|)%7(XMsElA_Wv!l51hdUF78$+;6OM|Jd zVBb20S?Y#GE{0|e2ic{4-TfU(K`G-BVcPZ~JoZI4{EM!}8l|BZ#7jt4!S66!+lpVW zGz?caA_(9un-&4bVPjYXDD{jqpaFgwj5H{UtZI#P(@+Hs3a#saPLZVi=U`q^Kn#2? zdo4i+!~S81p#_InA9~2~ZO-q<5ek23H^DT$n>_|jCA#H(noTEn!_n;qNNz7k(f$cPqiDs-RHQ0$O zcHcAh;4sd)0rbr8?6c^Jb>-O;5kZ1wR~7~=wF1`30!fHK1RTaG4N<YjJcc}UFHu?6&x!0q)6-T)d zbN_?Aw+xE<;lqAeSYj!6>6Q)wNl}`mySoIWK?DgYfu&2jySuv^rMpW&Qb0jb+C7VU z-}nE1&U0o?y?N#wW``MG@SEQYW|+CI&-Zf$N3>?MnPw6^N@xqqb&|*m;mp<)L#4t5 zdD5Z10;756qrOl@)m%Z<_XBx|p?ixJqFkb-=b);Q6)MD_o3#P09Se1L3k}l>F$MCd z%JLtKBvR7E=3#hoo@v!uhe(XTq-@EPT!KkAk>xx={$i-kIfTk&XlC#nRG43pdU&CM zJbGwPp%Gc>G&UT$((>{muks$UYNTJlgHqYw?mhngRaRO}w;I1*l=i&``sUNI_=Z*X0a z?pXGnMGUDXAGg(?`^w>O2&u!vQRzz?X>uvYrMViDpXU{30Y@D)Y=CT)=<6bpW#T3EEvPf zwNy8?)T|k0Wp5TO;z?p_X2Xi3G#`C#tD>-}ZSfT3;Ytb*s_lV$7Lco=)0AfjuGT+n z$Dq5Zbl>+d@F>RrjOW=FihC9>!h+AcN^GWA@LClu&ayzJ3`I7kQQr%wSkowR+Gvc` zBrydvGib70ZM2GLvT1L!NC)yEMTrZBN{&X|H2KJKRm%WKmDB`lax)orU|f*KHjs@; z51MvFJt`O}JiUeB6e+B|CH$x*hP*Xip*69cK03WMPOz28u{ATjHOVU&%`5vbFrLM$ zL46Qkb|(dg%YPk&=P%fz_NJw`pF9#PUg$NFf*ul1OnY-W5>-xX8+k{YK}U~WyYz5- zc6*zVoSpn(3Mjf0#01RpWab5nnH3EIJeXPB` z-6^pJ(H9Lrn(+e2mZl-;Wh;es2lq#SgX@;sYlxpd-7)AQHHcBS>Dez2J5Z?6!ANxK z=LfMxVO1c3N=YkiA-}K!jEH-nJUu|~`V9mMtJmFm)P+Xfht=ARYZ${g*2Bcoh8Y&@ zWZ=pj+pAjAiEP-lhuX(N(JNMx;1}BGdl?lfN&c)j52qfL zfP?g2^6DLyhs3Oc3I`TcZd|=8AYRYVa9rEj?ZaT&IdENIbZmg5zhvk+A1rtn&9}V zR(k7pzBbOBH!@m49P_J$EO>pRaq65E*_xq*wuHVfIf6E-p)YBY&mKTrgOp57{HWAC zm%{HB!^aorhf*{YY?(FDe2u~#kVf9+E~lSpsMn~WSd%j)Er-8dDuFt$X-;X3E*+j( zXRNO%t_%9V)Gb*cIn!7^Qd_NgwTPs>$i(gurdAXET=6wudjDi1Lf1a~cWwgGGyisZd&PrQrS6W?pyFP71URSxH zYHQ|?v!2Ah5^4MK$M~w~*6M?Ij9YS|#xEDjj|A;A!AMkDn8x&=UvpxW3pmP~D9Ypv zb({E9TP&})(4#hSpyWgoZy!>v(THqQQ*8kzKHk0CMmUT;JGV(X3E6&qv86MCg?JYhhfK^8;4+>nboQH{(w}a8>$# z9y$Owy=r4!BUII1dwj0(rM*4;*Iszn0dz0$&1+Q6vK{1FpmG&zDgzVf;)R+Il{ub& z)&y!yIF&k;|NCZ)gGYNb<8`)fE6wclw0CW5b}u~!nmv?eKKD+o-_01IRwD*MHE7DI zg$dceY!8SK>nzNg%*+n{=4dB=9Zyl6%!r&I##a}7PL{GxR=Q5sHcmEvoorGe;`=WU z;o}Btmj_XqWef7_%dl-Mh^_LMB?oHdReYIuV6wOK-@3l8dJx%Wea%5Sy;VL*bM!l; zI=Y(xGm(iemmOCa9H4Ln@CbY0KRi2UBzpStj7-#%aPmdMX$AGeZ_^IZ4pRNZqi#heSA|>z}6QVG!pJg zLQDMpr}HV#0MRWvJb6#`rkkYW)(W5w94W?+{b4hH_bPbKYvwrv*BLA122zV*G<=&N zx%l~&!+Evu&j(*gO!4R&1WD9(QMvZ7K1$s@z-R0^I-dOHLxX{O2SLt;qt(MXx00#` zroT+gw~}^Ys(3Xla^q>9E|v*1|b!Z=ctIk-y%7e4AA`m&tmajv`TgrcmxO;1vYq zh^LLhQORjepN$hLGNW))qi|1=Wq(A&h=W65cs@6GKj5f%G^bTm!LM>jylOBErY^4F za6f7|$Db!tyN6-2jO3GCJ(v9Rs71!#51~eRjF=pD1Z4Y)X~w}nA>I)28q{*;mtD|k z`NIU|YrY;HaZZxUYzW(3`3tfb^@7b`GOFIz=v4L*ej4*+_Q`&;+F>k9@%)-1r=!xP>2*Fm75@4nD$4i za$f^w#Vh0{{ig{+)IeDY_bYpUnjnNorM2>2q=G1evXTw*)BjlpnH6XKu7UDjH2kiC zdK)b=67R?L{#^t8%bbF6rXUI+#C9G+mGY*#3}Hw?xKaMCK|u&m5bBeEdQa|qAH?|G zr={P#FvK7`x^QT^o4PyX?n6s^qNn@uK0%bJ?X2WHD>C;!Mz z?zJX;V+f(iz0IWax5{LGreWvaW70e^+OoRRiugzVr~N^QOBUwt+aJWR-R{O;Ysubr zS6A=-jNP~6zp@g9sRU8|{M%H5n6&$|WViom#LZw1NP-R=6$(Wg&4pY{$BLv=d`M~HE{y}P@= zn{<~KCpWhU)yO{$BmXz_BLDA}EdQ%K4N(RO|FaCL$?cKFrIXK)t<4*ZAmOoH8>-F! z5dB-Ka*8(`|8J=Z^SEq+-c&48`qL+Afy4J@kXQhwMd){Gr3@*f8H$l}rtD&+d_)nL@LJrjYyh?JI$>$VhIN1KnD| z+Dh^MAPD(RxGVeChnRGtUK((Sg^ELoF*olA{5T@yT#B9RSeKolaOG@C^{Jppjxq*q zt`sP$eQEL<(iuTu&Vj!(DcaMa?MlhP+V*eLX+jJ^4=_g)dLum^^i2S3?J{_ba$HW( z+I8UQDvoZwE6x28q(hV?L;(`ah#1@3Y;8|b3T|0t90`ZBZ~ge_yFfXx4*NxDz3Jz` zTcSpoLkJA?$Hqy5SZrCCQ$Y_X2hvn6=ZLf4UMA|Q*?y*+Gw{`ESjwXSwKCHMZFp?^ zL%Djar$TV0E@KHOHdAO`K4R|8h~)S@q#A;@o3jli#~m<-3TJ#sS9l*(loV#@V7~tP zmi=%Fjh;TCA5A^4)eNdWC2i!EH3n8oK(6kF_os&mxUh!vM8u4m`IQJ4s+xen2RM|>Zg*H7f}gLmE}@NmNuYtK2ohf zP;rI1@9LTtja!ox7OSw9Z*%J+HN>qk5y+a-0PY^vG_ z`&@ZPRZv+nhS%ztsBNa3YPF|bF--@4NeDp|sk_;)KEt)M@5}B&XX*m-%X6lQSf~O! zF&Z%+wcupyuqM9H@4&MuVh@~?=Vp&(kUij=>zkIPbE(hm30`9vW0LNQ} zMdeq*awkUBce3+#9T<#E#+nJ+-5gz=$w=ANJ~He1=P1+U3_otJ@e5VpcSMaGc+^gk zB4l4aq&`nMO{Tnooch(58>x`+hyY*Hd*Mb>i=Xd{g0hOl3|is=>_bq@*I>U{193F0 z%U(Rsn!tA?N^2>2VNJSHuOFJ_+$E$XEwcPzp(v=_;-=K)KS9B)f4i^=+4=Y`->un5_1C! zCuE1A0NlWrmmY)pwc2~hA zY+)gp-7u7 E4>SZcJ;s#r!6 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্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Ðk*^CUH@smexgc5 zzIZKDIWNJQ75Fe4fpztmf4rVIgJIe&V3G@Q{L?oy=3FEHEfGS+*=oJ(HY< zp>h*Bj9|d?e8Hs^@S^G#ySJS!g{T5wD@lJJq2NlemKHqSOpPT>UaH9JH0q6kocCId zd>q$@$5TIeeI+h#bDS$wO*h&6>v6u?;(QeNPw@BU&afMuX`sJ%{M0W#s@iqiXM~$Q z!|qKQ=VT} zN_PIVx1!-Jg?Hq7S#+nN^=3If7E!H zCyC%x5&nIz*=y5}-TTVM{(D}5OWH$QhxC46Q5FKgCpFk>)&>cV7FKlFxD*b?8>E!j zK#l6fot{;)_HyTEWDn>O5X?W#Q6;BT^fcRoB_ac7hnr;smqEg|AtSH&+Mguz->AdQ zYC$r|LLb#_One{W9x{A1?G95+POH+Ft>Ig1R~^xbwANxr;(5}P8H#=jcL|V{gQJ)j zXEz)>rB%!mg#Wa2L|t?Z!IA^yXmGu7PY@HmA!dS4~X8+=uy~_u2@#5tP|TXyT5i$apQk1Zf(a&%zu2+`LP3K(_FM> z(4*;$=5U%Y5_Q`|za)nxDh8*T+yp--%j-iMJcF=r;Y12K@dkU&!#e&q{FBlh9oiHy zG!d9`@`9$r1!349uLRcKbRr&IkZDH`MQ<-%MyH>mY4R8lDyRz*KUW%2D|@)(dtSs zkII^?Ls&g91N87I%;^tm-P&0w_V-fR^Sht<9HZ$y$q57{X6Rlaq~|H-XqqL1L1;=5 zeDk;%h%5ktd_@Qn0-bF?(u|XSizFgVS1{j-b)oYWyvgmF4603+YWM(-(XEs?>MpEh zctEkqM>Zrrw~H%-wQQt;6=Y0Vf%x#x&E`vok!`J{iA4H}MHt~U@eE{xE=rO)ST)|# zfPhFLm`-(K$9-wcWh^1Ag*6&*Vq5j98pV8r`Nq87P?hpj)Z{wBa+z&+SpNy(xuVfK zuj3lgtq=G|lX8oE5?s+V^Jd!gsBAFfqq48KN$*fg=vhhS*|w^_TTdpR3ss8S_|S_Y z(J_qF@)yZ6g~(Rz!!t7$D#(u=qyn|1C@x2kC2(jBOZN|Gu8u~3G$*CC<}kc$bN86r zz@?4&qjN(X8>STM@iH81L&TQMIVQ3N!5b^i_`?-h7QUg^{BEv^^2}rQ?N% zW1_*_?yYA-?f|_*qW<5G2aH-o&dd4it?QV!>Sb^8wT%_NYY=vLhi3N8CtBIolOkts zcQUj+q@F~ob}1KSl@>;33j&B{|1KgT8JSG%@xRN|e#tVX*FXGiG+abe!h=+oY9f}9 zzRM9Bm2ZjhQ%lOOgSa5?a;c~rf%osdhvho!LyHp=dO@l_q_3P;{^^zjCj$d*!cuD~ zvio%9`qO$MAJ)7J5I9SqLyu8SfTn^l_bHkX*NBLmfSd&8D*}>eit1Q2_Icj-26HRx z^ql)Sh_crOGo0`dmQ5~4{LdLAfrtIc@c&L4ISdwyb@Y1zWiDKhG&(Z)*?H(u7x3?^8M5KZAfsnPe1L=1d&AX98_$O6jxht-=YoPF&lbUO z!#=&R+)lXE=I(!vE`H>)JB(hS=>RA9a>I2!9k0&Ke@@<`&jsgcUfmY~&i+T)kgcaf zuik(Et}1K1f5E)>?)MO``!f1Wo)4g1E3mN?xWx11OS8b`Qu>A=+$Cagm(3*LG&qRS zWud>~)mJ$-Fu>)pjP%84a_$Bbri>axMpEXSZ#UNJ#X64FX_(OUNO)gbl>k7r^$f=C zmc;oNJ{FpLZ964Q{#U?9;e!yvtBB}e)Jq(02@e4kyB*az?97iXw>;qs*XCkM;-n_= z0}~E$1X@6FYZHZl1JZ-08Xy>3so=m9+JDjMa5hOOeCfd80Sd2?$USgB*;2T_yP}!Z zh%}!-FZQq$3r2GNREx(q3lIMFbY}LQZ5%e&bCKBpg27E#i0uoSbRS1>52PYY@Y7jr z_ydMbG$1_MTHJC=)1b?aEr*Q3pgX=;C`LCsODY$-=rghlybk_&wd>&ftJ@_E6ji?= zmg9T<{7lZc4ue~vgQ~wB7%~tUF!K$|57l#bnN8|Dx7qUHwQ1mi%1GnJEd;WtNTvxB zDUrktv(Hc?EQV+#hJ^94<_?L@07Hw1*{O*SJ*@FdXWv(#7-lse)_I?*ofz(Z6!Hc- z&QxCyn2NxN(}5?eZmkzLPJDAfq@S#fP`Dp6EQ3%)+$mZ7ofan<8yhh}oxNJPITMl^ z6OxIX1f9_UKutnt8!<6Tg4ut7t*S38S%OhyfYEAzkph*TEt;i^6G9Qv|4wAkC;Jly zMjRuk-l84PAu5bt3ok~kpU6nywID=f|A!nG0_0lqMIc0!o>0^Qz}g2dA{VNzCoTsg z^=S%Qb{`Iwlu%RzPI6;V3cA0vJp>xm=aG_ByDy`DK{9EFqrXS^Vg^sICC#xCra?f+ zf@ta>um8#1;fDK6(BpZi9rFoyl`BPBXe4)g_I&KSsE zBG`k2k@Z8wgJ4DL;Yc|{zlXt-n8}ci!Qyg`LGck?5UiM72!sM>j2lLdcBM3`evs%M z0WMQYX-ZBiE-cOgfVhJ#7X@#nC#x|v6wd}oFp^Kxl8@WKmXj-`w379~k6aL@Lr3Si zuIze9q+KG*hQQ@(;$nKQvzhzbP5UI-RvvH@d0 zHkg~qo4hEj8Q_WGru{$}OpQbM5f|pH7M593l8S(+nxU9ZBMm)QE3A~rXdcdJ9#eGy zMWZS86I84v(i{oqZTW~mG~X3iQSD|5APOm<<4czgA<>wjRlQMBB_IK8bq)$S!3Qgx zk3Qgo>xP{tt` ztMzWT-F#F<2~gqKrZMYkYy?Kxu5_Vjz!lFmiL&N3Y8LeFms*S=ye?Muo+E4wy|H2?(?iP!xs@GTIwY&t<7vgSEuMqe@>V=ghl845=glp0vM z>$#{gII4mS0Z9dSZ@7$T6l{-f_Y4hmZ9%GIO*Zz7R{wB$0jeRXSe1w4LdE^cYE5~c5=y=PV2KCbw5 zZbu^}O~S>%P?4!gezeqbR!|4CE+Y$t5MKw=;iOVZ!;^+-?3Bon)pW4NMiAeA;?2z- zxXab-p476|b`hNwl&+ABZDKBslIPLJi75~+MZsKZg;6SLjLp^mh@j&Vp$rZ+^w-gN z6osewker;wU$j7qsK<}_liylpmO>X&W7GyZTcSN!Fg!rQGN!`5NJEMILlU_=Jaam^RcQSvlL?CBBw}@N-hA`MzPhNO5~s>@yF5h zA;9!8-t-S4>&Xxb$${R+ZhDd*xqb?rX(#YCn`WAfnq}GL5A0w`HbH5g6O( z!hXg`GNCnX#rWiq@q))UOeDDCuJ?(MsC1A6x1A*;gat%N7Pw2AI=Cex%g(|`{LD$$ zayM@ps&R!fo<8BRW5`P8H78P$5fu(pn9ly|gU2+-OK8O^B9Xn@BDLu_Y-mu=4HeWA zA~EcOHXt<(h5qbQ-tU^1Y$ftA6d=eYH!I>>{NpuquLxhjh35~n6iC=(&#)A%-4iI| z$5PofyDwzO%G(raiBc@?Gv_6brTvO&C15~{zO^&Zm(4ZU@Ppife#8`!hsD3aN~vdG ziI1gmX-|xYUSix*25Du7++6k3fvLzY=DlJwzO`488G-b{b!eY*t+iq8ff1=vzk{-I z1XJqSK_5MVj(Yi-88d8HSa4(0rz0b+uu`n_4vPX|yQMvuLUQZ?71f zV_91K<`pY}P^@SjkYwH8{sq`&+t*?jSzuSw^wr1jjV#ubICM5TX7@XGb~*uToSNIA zWYIl1)V-=0TFrc8idAF&p^^TerZ=M)8y{F#9lS6RQePcfS`ymb5tf`B*47k}TM@AW zhW0XJV-wt(y^mFufjpw_CMDPT)Guyg2*CN6@ZF0p245xSSLc53NAE^+Wp zBzASb#WE+Bng^$vhlX0FCfXL~+m;SM6Qgf+%%R~KjCaD#R(MLR=i2n;l&HIS9pv$7gR*%%w#rJDgZpnD}!Cm4{Gv_*TJ$vcrwj z>B9#oJDmIX4Aq8j)NuWOIm5lZ)&1MmlcUv#|I{u|Pu4I0{#Wf1stq@{e{J4eLH9fU zH#ppbg2S`D|K$u1?*8Kp4^RG!8lM0A2i1jdOCRr_-olpWmv7YY?+cU~{y%S9{*Nd8 z|Lq0}7jvOo9P11ELs9TqjK%WqJoX!JTO5B-OU6*h&sz>AGig>C zjW?D~rX!~cYDzbiO=kU!#EB}Fu&uNUCou~^6v`JnyVob5LhrPehmgCaLt;_R&jVSQc1Kit6-FUr!BH6A077_2bs5E9%#V3r z2b*`}aNS^bhVd`NBXcY$IqnO?l2PSob&!_D24Xm_U2wd8f@QP6yRdKf`yrBfk1M3r z%f6$qCQOMIFVB%M{VwNukj0>fvKSFTLF<{}n$NJj;f81qGVln&I?$lm$6 z6c_H3p|gcL(%wsC^H-fH<=Sk_xy}j!r<%GjPJB2JZzbZJB$z)e7K^7yW$`L@um~F4 zgu~cuI3EntgC&VZbyz1#IKp5@b)=}<7W+C3`#1gYq{NYs%^^4+7Px^9;6>yc_U5he zk?5ffbS5M3`3o!rk6%ge=n;0&ZYaIi9(P8bjx@|M7S`o{UQGQ;K)-i82~l+N7B7K! z5*lcFpAxlIN4MX6Qi1OTIBZeP^I3;C=I|lm-b#2pEC4RO+!g8)K3~@8nsny33x5XR z4+$6hA6R0cvw0)geD)Xj&cPB39V~wlU5Mtnin|dNw&$o`0qGyTD)Mq>eOfpPp2yk`2sPx2G z`_S>AM`~kgvt$_ZB*u&3i0`kHg{BrEl4WXrh+7MDFAy}>J|c-3zr#s=cpfGY5kibK zx5I8zjy2AE39gu1xFUo|k^vMZSXX_$Jh)^Ac%lK7fSZ`yb3L8`p)d<-R6k9LIH~+v zALU3U(m5|5w*sakQ0>|7fhj6gm5e5pE;jIk1?eR4o>|gC>;@@HFy^ z7T;|jPx27-E1?FF)P+^Bkd#3-BAyld^a- z!X@2pi~Ym>j9>Set5bKpoipnPR#On)huSZL4rMT~i_aZj8&_K#APCixRsLR|lIvrg z=v`ZHr4TrRrm#XI?QnDm=KBIe;{)+Wf4!F7%W>Zfdhrug5~d?-br}ptbLE)-)W{uUGEL65Bi)#r}Dc)I#h-&sbj!ltTe7>EO(UZ&%lmWR=@W9RsEI8sv6pxCjnA-I&p&&s&=hl>W@ z@j;H9WA9Rbsl)GL?v?+u(O5tBDa+_iL}z>WCcpo)^1SCP61Umk{x0S0RNvU6E$8tE zvPnlLm=EMSpM&CuJ40{kZFBOQAkwH@99>G*pBZ;)${+gi{f!2N5D5LvoZ>WCcAlpW zs;^`mx)?4Ui9Y)s>eu=-inc{@VdGDz{~4sGx&gNauO67wcrb1N_Q_~OdoxsgJfqsQ zlkw)phcG&H7HicxNk`YE>mGmlQT*9o`+~=sU(fAEm)u}Re&!tQh0A!Ek*F&)v|B6O z3k&%cO-OS&n5RA7@9LV(^ZE-B_t6TYH+S5v^j5LAD?MVyBeU(PFI}f2Cv@Wu>oY}W zuu;=b)gRtrz`)6W9NiG5`-%wSz)NSHmjQj%2a*TT4m%uvQ`3Pc*eHYK_p?%yiu=&HfTHO8B8%W z7SUxH(J|%`H(y+GGu%;7Vk)CzC^ceI1)|FZ?5e!+nhv$G(kGBM)RZyc(GT9<(niwC4eMbqmc#L+p<%5Ss2Z|}iQlk{`DK@Jk!yuxYUo+eGAuG!! zzzipRyEbkm5&h|Dx#;a)Cl}C=5uYb%HMQg}{|Ct#hgpc&;TNKH;5Kr80gsm}%25XA z&5F_dW5hep9~v1ymdj(=k?a~=*eQ7FGI3}+AMvtn1BDqwF}}f;OFFsUm{16O=@PI- zyg|p-kES7|#(N4sf*^;z&rI@ZNiso+=3r*^;g5Aa@M^E%tFwuM=T1^ZiBQkLVIq|f z@gZiC4GR;{aoiD(|Ebr%!iYniiq=P>4f3vTakcSDv&~Giv5U4}O>=rmbBRtHmvRXx zOz}Z+t`03pPGun_wiNXDX2kQ=#fzvk_c{r%g~izYtv-Wq?1id}f%M(?B!w9_ z)tEl*vwR#`Sz5($W;#=fD`|R(Pa14m8t53O4@PLAoi{P_z3~ah=|XZ4DD%BWT;XF< zONEA{esWYMUhEiQ&Sq$1PPjZo0uBIKVMW$+Fd$vjez#NQh0h6$eqGnp3uunprI7W15 zn}^wNDJd;zwwi}3hXX^J0KNpk~zVXjSih34>{E@@J@uito&isB5QUn zGq#dVk5ln|oB%)m21-)%T!~VDz@c{GmoW!p-T1Us@edw3=Ac6MjzF|Rx7a@9C&7Gd zG9=rM1k1x86*$(vND7ZhkZoCTF68(=8c-44X7wJs@t+1KMdJn95-u^5lV)X_WCfA7 zpfnNWpF^S&&_HM&oFBgl;TJ?OdtKYXo%~4fE$}l&wp8u@t=S{1l|Y2~b;{r3Tf3E&bQmK8 zuTTre3A9~QxsHMHU#b@yI5HYmriG0PCf0tg~dYefXWcmg}B$=iXkbq#(n$lDz*u^sim930_{fQL-uKe)|$ z84*uk2CR$0OgMjh@eF`4t({%)W}TLkpi=biBJ_^5=PskpF4IcT*KC+-;Z9Tt40H=X z_f9AOzA!8qOwWm5&)HzOvE<$)@^UFlZO31_ z7tniK{5swI`sOD=bF7_b8I%U- zjZh0<&^RWtzl^1oo}@Vl4why%aK&X6%l&ZAl-iFKV6CqU@)O#B=Gc4gzB3%EiycBc z@0Jo7I_&HS0uG%D4@>8Cih$#43K|HDhK)9cOFGhkC;&7Xl_&6xQt>oj`~iG26WMU-x$>dj0PKxMfi_~RgXqPYmycPqk(bx$kMv_DRrqm|MKtl~>jX$H*p%L?%j%CdwQpxaTnb3oh2aOw?0MHi}F( zbPZT3rRA}pv29~un!)XGmA#@A@AH?eEyRmw5{~VBqqp$a^pi~Sp8!)#&l^o-Z=+R; z;5O$>*HK_V*Ob&cOtQsI{u_c}Q-i0ZF3Z3GcmUkK6}ZuKpgqZ#mEaW}uOORI&&H3m zn-^I{dSD>(geI40-ho-W4#qjZB?H!$#9wQ;!6+Nd##%+Zo|(aM76^30~e zAJNI#$q1BDDB0)99nq!$a|88rz5tA^^NEeFiEW3}J*62uh?ob21dwP@mVk!tb&Fu@ zo8T-){_te?KuY_%KF%G?WN4o5CVi0JzrIgYW;pe+8VAg ztRPgAh1HXtuRGC>uO_rae6m!I_U z%M9^zpzY-f(RniVr1t3uXGIGNaddT$Ot+LsE8|B4W)e^Cj$J-Cy1%t0;PQ87mUjG?3W3& zS`-YY$&xtMXt*7^7UV=~-K*{$3aZJQfXNWS;@$((ew@Be_LQB{UpC&XvtFzQ_}du$ zyM~B5$Xlyp_B&ZYJGhtIL>$P5x;ybn+Zb3oBs~~2;2pWVeO%0y9g5xOir8-b_J<2* z!nGXL=UJ7lsl+*Ryu8hwivv@v!#(4g)9#5R|3iWXbQYr#%TgzWn?r@d*^y4qeB&ce z6Z&kiEuWqv|E;6I*P|e+hDW@fCrjl~MBeyeUdAsuNwuNgfr{B#V=b zyp#0W6T{(?yq=SMs?!3h)7GiO+F{rBey^m8DS5drNGD|y)r8;7rh>X>4E0X^{86~r zu@ZFf{`IUI>wJLfd~j=%YGNGcVO$6IjJuJT4}cK*UdfLdd0{5+{fY+w}wq47#I>R(TfVg|Px3hV9`FeRxb#?1>91?#n7=k7Jp@7?1QKO~J`)6_;D`V6??}iNvv*_(tjtPWhryz9?g8(E-wUw*6&OvrN=8ie6DoCX(hRl2yBgrl~(%zDp|VgW)Yepmni$kECOq zzStq|VFsQNiVR5eElt?T0DJ($VFpTHy-t0`P@smT1p8mSvzftu|Gnh6e0$~c>a|MG zSnty=^yU)#<@?9SPvSIQOZCGwVhg z4vi055|24*e^R+D8C&8znjMJwugf3jYYn({f9yLFhX=m?Qqe%~YA845#t_{db?Y0Q zxgH_!>LV27RpY?IU{wG!_6F zy@HWT$ZO4K497LJU``fmFj{;chvNjQmKb7AAAH*#0+9u3MIU?(C$e;ws?x46fh`q< z2!bT%+a;^k&kutjsn#EVj$u&%FA2jWxefnGtzXiG=9mkac-NLF0`2V`=)=%g7lcnP z@ci5Gve0|*7_lon^m@C8US^{tv`ECNF1j2XAj36Ib6y`{K;t?xnbU zDNwAqYk?w#;_mLnVQ_bMcXxMpcPU=HIA?g?=f1gePI7Z^a+2R4JB;kTXD2_B?^^4# zvY;Z_VMu%7oOs#6$6vw1E&WBW@D`JB78Lkn;6F)HLW_3&K;uLTSAYZGaJURC_@3R@ z91YO`hAd3rn+M;aJ@_RSctZ$4*Itav*kE`Yto;RvVHYv@J-cl1h6-@uYePS#0M=uh z?SEd?eUMzRu3|^Zhp3t9IrcvWWLDyxvuta|Kn%)3eKjpl3Is z3x=RoBbw~aIlv8r4=N%Hdrn@%SzieEb>1q2*dSHj-<&CIVsh837c_A*CNjrEPxOb;+LI%OZrtr6a0};EKW7F%C~Q^-#3ZA*Z|2dSUIOy zQAwbUw;sZm((-gW1#(?}RisxR(;8Q!6VXr~GR5S)wqP{-^g(w)6DFkmQm?KCUF|@Sv$bqxy ze)Y8f<*NAeT4uP`zWrMI`S&V#TY2-b?|1?4FWI|u!TWQYR59S=Z`;;oM{_=p{*K_y z=6uulrBYqa^MfNQ*$57T))egjmvxa9arP>$r9W|IzgC!(;}D`OPIGImb@vbQ@bLBs3H2x|^(@TsoF0C!Sd57DYpQz} zi!+P-=f?utn*&RWKowK(SeuUFcd>Y3A|fItGA%7CCO)dEF1o$>yQ?Y*Vm-Cw`FdxWr2$p=V!Br`*SKPb6Way zCPs2|^Kwu2^J+Wt+Q;(xd-Il8@@s3sSewF;)#Ad!l7@!T`j+>)#qrV7)wOr5O-pZC z&v;qiELcG<`+Zp6+FIVjhJ8R_j*xz`cv_l$*JkcfL(uf6Llo%kIg$xI8e{Iy%=nzS6q8{}1S9v~6bdzm%Kq z&fb4OH_JWyH@&_6y<=nV67%)NKcJhPzU75?(9OX~-{D?=YumfrJUi3Bzc(~EI0RWqK>-4#_ zK};I9L26{C@IM@zlUcgyRu^nHDF0$Q5>@$&Q`kKj8#Iv>jcm)kVkDd@?XCFG>pl85 zF6}v}79#iz>Ph*n2e*SSL50rle9&$=IEZa^u;nW%QjHB~t4;QQ($X89tqGMgV0>^X zBy?skls^(@_+14t+ul|5#+)8wTCP;M^RM4O#+fK-puc_9q9V}u3BPFD4MkMM*7il^ zCw!^TI)A#qKIxqNvDNtY8)hiN8m7Ua@283kBn%#s*`PWKQ0QJ1B~hh1T7>q^ooiA>3=4z6L zu=E)8jC#Xz3{QPx75b8*rXbZU%dWe982U+%4{JX`rRH|RLoVg0ab2VK+EV!`?kO*5I zf20c9Gnq=rjM?8S%3DaLvC2KH>M7x+sUFD&&Ab^Rl9Qncbiq)ZvPes~+^tZHH*|dp zW0f20Dz8-_c!qWB-hC&+wJ z5illV@=uIse%vm1g;m<|q%p@V`X(k~4g-_R(pQQZ95d7tE8$xu;(b7R`7!!= zMX?g$B!{&N-#YE0tKnxB{h*s05-S#OUYI{Ns=2`^Hb0h>3RCKuEj(ph()IvO#oo@q zJCrqpNw%{TKQkt`@ydRLn*E(F%L z%S(hN4G7m!!tG^Y0Gq=G%(kx0dGi<)A#u%6mNWljWk9EQ*GaS9t1&LukY?Su81oL? zI0v&(JgEesuloe|bs47hMTQ+-lNC}O0rqUmQ{I$MD8iA58E@q#B{6IZ@&HNrv4 z_4w|=xto!b(&32*0X0fEgG&_QO}8_Kh;xnQz}s!h3yDVp`h`Q>4{8Ec&qBaw-;PoM zl#F5<;-`j#0M`tcU}iY)?bIV zcI+Aho~TZIgJm{p=>55buO-G$Pk7><3r6Xoe9QmAqN(`k`UD1`2BDygj@J znjWzZn{Wf(^p7euQv8gh1~lxHkWwUKU^7@`4HCunibS{O0$Y4&90k#jVUVhj9TJEj zfC%Nw=;!Y<3e+%Zqm*7 zGl0>78 z@f*}Scr2J!oR^FqSjdI=N~~G1qX~77Nu0W;g)4f(6_aF--Yey5*zgDO@< zs5iI9mV!XKm@jO&I%k*U^?U^?>OYYuT7@n{D5zcD4{zc`7;$n-Tih+h@nI>`JeFN6e z8Bpm$9|6GG#Qw9;{LCo0NrOFAwBy9__Fjp(DGL=H_=h+}BIGWmyNyE_2MMS#b8p^IptY-Imf_fr^P5v;6#a zk)=E*GQBAa;v82Fs_SO*LD>MljxJOLiBXKTro{|6r;6QRedpJkN`?$j_F)0TcDxI} zz#eHmrNz=0rBtlbRVRJwZ^k^klyZ6mvnDhCmX0R9_%WoTDNEs&6EU<>ezJZ`}jVRwH^KUpbpSstv!9s z1of9%OV67E&QIWtT4GdN?$$S9;fSa4ey|$FC!6rY$xnH=$!21w8ZW*RslTq}*i*Zi z`kcpKNzaJNd?IN0k7#nh5~0C4;xdujhDC9VhF;unPu2BW)sL+^xY|xtCvBGm+O12| zau1o#FQ*AX9=lHn&Ji;0G+hc%Gy`qLsO-K6l>st7e>yI6vSyL9OsaLGe!>xI!xxXEgpr}W3w9(6ay0~kJv>5} zH)tIVP)(vHts4ppkB}{Z3_7GBjX{clL|0Yz&`{G#yAP&;cgV$a1$%NFxkB{RLeSAc zg+my|0F?HqaD5@*>;0657J znL5lJ*@5!efmgbbP{qONOJOffk@tte^uaN7!!dN?;okQm2uEIL5U7ARQ?y_gZEiBr zV{y?gkTt8GGq)Wk0$$W~QXF+~oJ?>SN(@eF{071W_Y7el{w0(Il4K zG|nz51}q=SyC$f)1R2qW$k4`nNyHz14%J{ubg+Tby8!-7P9##p6mO23D2g**j-$d) z@+wYXE;hCL5~!>mu2vlHs{(SvPZk|UPhsJ-O^Tc{@gJi}N=i=fe@G6(548T95Tl;r zcZj~l5%9{EkUpGja+H#>98Pb|z>lvl z_J<2jy_Ap*h=&mpu)*z3=>sMWa;0@9r`LW73NB6?J3`CR1?j(aQ*8u%@W(~w(96)Q z3B(XoSFyv1I3S#qglz-=&o55zaZN8*Pg*ifpO*|_leF4Yr~Z?V?{SCwdk~j_%@49y_EO`&7{Pa+&a2J(FxYaquX!pEi{=C6AgrDZ4m%csPft z1;c`jOcm1mTOXAXhBsG@m+&&jWHWr#PPTMNo)LGBOiF>IS`@OPb2wMNJXhXbbEcd| z!Xq$^BqYZSAq!F?TpkK|N)sBXPKg){!nNf;PjI#=iJf_aOP_g&IJHl9kt&SiE_Qm% ze16EIFY#m~h}go>+X95zqm_W}fgUWJ1$4T;zqcL#V4c&U& z50rpRiYDKH0X%ku`ip3HCLSzycbF`CIJ-T8pMy(3ITst(4T} z%+N(0%2N@Wxao7!>02MUTcA{0bO{SvOlupS8a;VhyHa!Hxucq%WLjEVdsQ0~N9jr3 zi+g#h>)osPc$ylD+wy@`6Qhl5p~c;VEuC*XHNLBbJj1c9q3uknYC;!=9Z&7ktqy+W%9JcGPGTpx802v0Jj<43m9khXMmDQ8pak{PcWFl(OmTqaKXEe2~6EpwyWhAR&v2MwyK`J!shhVP1Pro7; z`eA+l>S_=EbFY3`{VshkBSHcwZ7AfeZ76JQNavwYHrw4W3QvAI7kJ?NQ!&@|Ik&kG z&l>R~C70LL7j$JCc*y6$YWkrSsUg49j#ixBz%eg#uF*Qp(FTvvrnJ!(h8QMv@>@tz zRexG2myS~$mj^OSTi5Ol_pYszk@D02tky!~v{v@!(FM&|Fvn)4ZG3HQd{rjSzBF;5 zY0P`9bW&zQh-kn_v#(GuYU6q0f@t!Jce3rYVmEC>uWV$ZZRDwJ0yI1kyfdLH>3pL( z1?M?+OH}@Csej*N;%IElr_B}Oj2em&vCj;dA#j=?Jz~8}uWf0X;KK~*_%uLv@*sI? zJ1z0!CA(^CBXarV6w<8W^W?(YN%|+%&?N}ucou*k3ztLJti3UkfGpzD1zda~^gaO?8;;`G{L&dGfD2-a3rlpjI#>{bY#7AW)s zih^C}7#d>O2g^wHMY!}uo0diX(@EgkBpTyVSy>mGOmkAea#8vUP5B~4@Z{9fa`xF& zo#Yad`BG5%N>lihrP+#-c!pX@3&#@WuSWF_t!6#^S%&Au+_U8x*}l5=>Uodx8NT&7 z&ruj|B)Ar14m!M}Z8!9{2HcQ=I@?r^E!hV66k~OdHO=+0q4AAFq@@wAX(zI&HMMt+ z&3*djWBcZFxMYeYTCEP?yCPoCJCUpP@-E(+_Q_+YgN~m&(Bu)H=1X|+NRT2#pL$H&nxL) ziuuyEM;H$-(kG2j23RFKgyvC}T~@6sR{HRMYjmuXm2W6d?CN*y>U->q5v?=C&w9%_ zgXLi8aik5d-|}zkRcVZ~t{c0~Kil)QrX{oxcr54m7~%9@W|K0Id1V(s8HYbNRt)*~ zbI%VAo=Yc@8yaL69BBc17qi}<6XUJs%orD%FAg&0CPSExzx~`F8=rKOTdB5K?V6g7 zqz#>dP^;TI?(3TN?oVpAT0HzRPd9#I(6LsHd|I$^5>R%a&Of#F^RN%?d@thU;PuE~ z?6*?OA=&EM;_G?$>xot3v5Cbh88R}r=O4d{KltU-0}2R_#D~P;%hVqxlCY9BVGa~g z{%Cj}=WiTFGM$2v?$+T)cI(FtLr2*xb1~sZQl6KxFK`To)7I-DmJ!Rykf_jw#=2~u z@Eg3a20E|asIJv|Om4Di88@0tSVy?zN|`=f8lRsmGyO5$C^WB#%J)9f@LmufpWQB+ zHIZEyqGL^by>!qy@up-|wVrPFT!%9o{E7adh}ui_G|QgB*Z9Ob1YP&C+Dqth|Kn4e z(AU2Lkp~3l-F*>d3na_2;h_mHA;yf$Lv)C-vdF<7EVH^I0=^qdckbljfsBu^_6?-e=5)vYT>D8*ch5Ihj-T*lG$07EyolpOOYnG;W!QdL<2zS+)JxM28l?sF9 z8N=2@R>O(B;F$y2v@ee5d&{%NlF@>thIRQgq>y=N+*lGCB(Sr2WF+kU-aaMDB?`%U z<13%dlnRyF$@ZmiPG_or5dI`NoGJ%4TJQe!KG7-HYIEG*ssG_y2~FU2d+sO^y(roz zgw1S(6k{M~ze@owS6sd_983Oey@B-Q%6KAMG?MB?%~(G=EP_o(i^F2YS9Q`%Ym1xX z&0?XMR7`8#jl-f;fnK5=O&^I!$TE&zzGJQV`oJLRYb1aAqvN4XjdbEKAUWqnQGcYi z#iNnw&C$HlT^q`c`~BtqWTE!v>r+~ot0MQa;%)c#!HR4)Bzn#`2Lxi9WmXN6K^4?C zjzbkGti8KQ6@-cebh^FC)rBzHEP8b>x;`5)t#3%lw%>T{2YkMbUR-qVtx?^j7?J&) z?cnpTt4nbbXS&~Y{mR+?agixNBV?u&ix^4jW*u@Vx=jBWDZ0us3~8pun;Pl!oU|)x zmShofT+CI(YD&CC10W^NuI98Tp5fR*67L~NpqNd|rTrk`+bO1k5Mq7xAPJ_*+uWcf zh~XRlm-lkT943vMZ!(jk`Cp}YZcQZ8bV5$$KEOqF!5Td?oQIKcnP_pNcRaBQM<+E0n zqnPRrMkiLBPm)l>Hdt3TO!mV!=_`W4U|quY!*?bP&fDOJas9ifoyj*yX6~agm~4mP zRH+eA=qa9Rf+OZa7)DIYrmGEd=Mt7f~w#Ju! z%xKRCN~3slIalMPAH4lWs%jl^x|XCbF5j%R8Jgt3Q)~$Y*}eGtCkQ@fy}4~DJPsM5 zxt0g#VK8oF`9(NfYQ=BXxu+|(gg*}*3CDuAmlr41K@5d}i zn;qJfX_3Rfw$X)QG=Mok*8x>i;cP)yJN`BO#Tj_NAvpZ`VI%mX!`Xyyz6ZL!l${u= zafc0lZ1N>unxQ4zV8D|YQX+oh^;tvnpDQh^_7!vM5YJzaPxN>++9F@M$c;O4@pepx zkn}pHBwlmS1;V(XF#(@+PT~?6m!>0m9W+wXL*UzguZ#OlVXEEIIKMRonUd>nW{*K! z!&i$1D;SWm6K#z+vnVv| zWRxPqkh35$%mdU&H5q-3OMV1>qfgckGIklo|D){q^NR-WyIi3!2hIF#cfF zol05sNV%|q=urVArksPBZz4)*CLeHMpGmlHBL1~V!Rm}UJ#HS$#3m|lOgnr7s*kaWU$I(Qu zMH}s(aTSlilv|2l6ouGvg#TCB}S_>}P-FKV5U22;In&RmW6$A$bd8*pe0N$7IT@D~lW1b-gNK#?}ZZ zuR0MvO-;ljY73mYke1f3pGc2T#A^F!r{nw5v1svkCFSi@+lJUGWK~HuPe|o#9LYaE z4%mkLjj{6nbPYp{<^u`~mUqadTyS}L(uQz{VMFwf#vosig=s8m<10?GyCmVBSZ44k zffm_H%NCfB{cE#-o$9nspo12a)cQqI3@t+ePDFVd%Mb+3d-XSfdJPxdDb(-I3<+?~ zc%Q`!nI_Nck@CSysZW@SP2&0p$t4XBQ}B%jnl~-2hE8T1k%fabBG-18L_}urN1#D; z`}4l=fjtq70VxFOLd5H~J>f2d4!-Z0Ar~$^uYG}i`k99@?{D=C7 za>zzzG>J#L8n-oa$o=qQA|b9Z6H82iN9$=SW2`ZodS^tBGj6I71P0eo)fY;7nkg4* z%!hN_mT0}0sp+S5W?DLyS$dj#_8`ocu-JU!EAN3DBsDVrp6$+Zb>fJ%s)xYi^d`c& ztu9@P-b4wKux%K5aTZO~2KZ!=vIf>Wu)rpkk9fcBs>u`WXY^Nov+C!v+Zm z<@_|5rJzFAA?5c-#Q)NBvBRtT^J1MN1g$1P+C|6OXVzwA+;&B^pFyr!_sS8G+-Plc z?GagXwX$?V%30^`wr*J$Sfa$FL1Xgp0h9`_}7`Lpq=Z{4$-wSTc(BhJNW+yDxo)=cunO*jn%zWyN- zd7kMs*>C#%fGA&4H723znrd2ck}CeWSu6`C|8@tn-Gqnc;M}%W-tPmDh>v9iFWEGS zi98c@$J97(=r_vjz_IJ`r}d4mO3emr)YvpW5BBodqxLFqHvWW=u5F~FEL;pAuW<+o-05bak>!(Vcnm6PpWAD@qm zJ752N^@8B7c-*C-YT;X@2U63+xv0Uqn83kl3c!oN8JGx|g0roFz>yk(kr{!uQc45^ zf!v2KBZ)4!H39TChHgXw?7Xi9Jm?tN!6DPF)`yrFN0`)4fih8nxV*q#o{Bi{pkorh z<0SuGk{)_4At8YtCYOj^1r+)VXc~ur*H##Eq8_TY9wr5FpE)L#j1YTO8a7gIDnXY$ z0FE9)NVzGHTdj**LHJFPMOb%8NLK(#DarrSjUQZFFKZJV*%Yixm9NztKFMccTGJSIk^pT$xlWgegn=)O4ivFX zpOOI-7s!`t8AsiMwMQ5r%IfghaSCV|Q)OAoXHnc~-xT<@O2kDW{Ogu4 zp_-qOvLD7hBtaIWse=fCH@ukxn<$s)X9yu<3tysmxYgCi$miF^QI-zRG~M%4?qyU5jpWH7Ed3vcW>Sk!To!#wTV^(1%yR)&NML z3`|zSY?lF2_#}Lg0a_Q0vg1pr(hD@YR>d_}^~;c8Ata}V28u1goyN%YHp}Qbv~fs| zHlE5%`j0lZef)S@_fc3k4V+MyDWI*kh#?=a?~B(BQc@uJ$WkI z&<7dI{`GA-7z`x}R8VLAvs`^5$V#=s;`51F>xLoDAs{n^?WAquxD2X4o4w0^eExLe z&&|YzL9EiOZ2g|>rp#pYvoN&uc#v%k9G5p7$d7ph5)w2C?E;nG4gK&80eSEJ>J;4@|CUB8NgRf6Jo5sCxYqUX6v2p@6*3JX zuFYtGPDAt~o#d86IRht-eWcN*{T_WuAmXX6{m~t(W4ipxr30ad6fI4>OXCtq&>;Ly zrr$&_{kZfLKE|@*e;S}h4`dCN+eakHR%Z!@0kgT9!)SxbWw?q11Y&IrWu9FX2=HgSI!pl&LMnpP)XqL6Sj; zP%QaSH9_e6<1NOPl;&FZCK0=sMoPUsHB=KKw83# zJU~DO1TlyLpZWrJg@-K#K3bo_3a9x?P6e2w1$-5Nt=;3D#^lqu>OO}FK@-9gSK(Bo zq!1BZpe>&s@(2(Ytc+K8daWq=r^UT zCENH;R&z>3Ll*sh)lKE^ZtcNb7mG8z(=it?kW)M?{ZLtG3X~(?_skVkv{ck|AW=>F z6kWiQ4W!1IT2}rj4eW9w)^coK0}OBEy#X2PIHYrzZ@E$FVEHno_HHX4AhtoBO`ag>>`qYnUMyzR0oN11~XpWUb zplMA-^U*-|%X{4_8>2z+y2#HtE;HXwK8-={dIU-GDRF&}%`kx#?W5Q28hE2>^8Mm4 z&xiM;W_*Y+No-&C=YiJ7f#b&S@Sm!dP%24_Xg$=cDzirT9C+2!?Y-k`?HZXE0jJNj z(qVmEr#{r|8(C-h)=3IraLq%y_5*B?2+vA7$giVbb^VM6Mt0n~DG;Aw0MbZ1OKZ)u zM?3xE%SUW&cn%%F&orcd4T~e~zo9yk(3|}eOR#abt19XUfsswe(AjR z>qwLa@_BPMlM>-qRN~r6^leLJnZy1$;!HXs)Scyh{h)mdOuJoabjX*+meadrkijWn zPl1jS}2D`PICd4-)<60^mdIPAM>54TtI696a9s|vJJeUnF zs2P@N$xp7ZGL*k|5kvUQ4)zasOp_E za$AT@T0a5}D?Y)?of~Su8tR}J=^hy1CQB9PebDcqJe4*w{Apw~LH3>hr)q+sR)vu| zBH&-=q9OzX32`?lxKIh%)_m9c1;N93)Ihs-1n+2|>%gxJc8~dk%uBCK*#-u|~i zQvTnZ2>#7m(bvyEATTI^0~D&r86cq;6&)NFpOBc8oRXTBo{^cAos*lFUr?A96%vF+ zB@q!577>@giRnjG)Y974-qG3B-P2oyrHC~^g;}dOGB~M-1d5WV4y=x7Ol2sl^-u5^SH)&(s$rZWEKL{6ZEXtx#z-gc9zz zW+pp9iM|S0i-+>jQPnlzFPEoZ2nth<9z=2Q`D%mS2yai7fLxW3dF zDp5MdQ;v9Boz+Q5Z<{5?oeRm1}Xsk}jDmCf(^-JTK!u`&)F-o$_lP zk)pjA0KkXV4_P*4#Gku`<2J*vbk^jnQ8oT!w$v(PVpVO@+(majD~DXW>iG-ZlV5^% zyp|>&=+s@EW$q_6Z44yBS7gu!gi;v1X%}8(Jam+OY>_FFk}51BNq??+U0SZDMIdnR zg-np;>WjEG>FtqkCJD2ZvfhvQF|};hSxvufikKUhZ9zgeJzo&{&lz75u1q+6UQ=A6yKc-Lkm>T6cezz;keZY5HC#&V!8AtwVGlW9@ zq~jN!-xl|<@8Kp^LX#gK2sF*D#JEZ>&a1g0W$f}CI*K@4&pINVH!w3N3s^uX%`0`& zJI=Ff2`MX?>X0-~5z!y9GumytXlN;FKIV9$>3~~J)rN+?X{Dx|kGW&+!rFWaerqeM7%l1{ zfJY+lMG+Sxbz2wF)EZtIr|cU_)=jIbA?#dZ?ZHMIV~rsRLQ==*BI~J*_*^$N*5}!* zdC|rG!{SpnKE2lUAo59C!PGDQp44f%LBi{4b@#Q~Fw$20x;3#uvGd^9ppvgaO|;J2>>wwfo4! z+wV@_Ecs&Bf4q7M#KdX8Rt2S5t3BeXZoaMt+J8*mNo;?35cbOQMS3H{<(i?4bY7z; zhCr6+*4ksj!rdb{fx72s?Ps(Vq6eUhHE{mIIuR3j`dB*$-~DDA^9z-2eV;`f1d`A8elw`@Dmz)f)xi4* zbyupvP`V{nG1PTy$^sJU%fjs+60?nBwNz)=L0k_KIVh_RcM*wxQ@iK+f)EvfK9)<; zdnrbeG7Yll)gys-jitrtiQc}?#{LWHCo!`Hc`N5)-~;)eKU2PWP&8*k(W;9vkzGZG z%u!HV_aMnC=3;dE7-%rvVhg9##CbZ9(y6*s^HkJ)tV|PQ$yN)O$5wKKl*~qV4IbUq zvhzzm-J$XV$_yw+V+D9<5joQKDNDtsY_W@Sd`uesw80R*iS(N!-jw%jUNPVzfXQnHNB9O+wproZ)8lJKrV8{ii90@s_D)BTc z7m!Bpe=#|p&LBf7Bz!62Wo(wnO2`$LxacP5fn_iUIN~k75y4822PmiK)D&!(n+l{q zhHCq;!BOJR7xDHt+pU53`FcZD>_?T1!1+Rb%2HZhe;?JpE>-fTO?5^XM1qQlVjDhH zsiPIyDh#YjH@+aw6cPZ9G6zCjJ`F>0;^eo9_*@>wV=c%t!gQr| z#ZUO8E(tKpDR~OY=*NevCQgG&O!MMX|k}dAi$l}MUAW33F;C(WN2a-Pe z-`L3MTVqYf(%m3dqh8Kq7AwKFemerJF3|><2k)I=Pj5EnZ%jFE!XA6{yIi9S(XiF* zt-|9d*25>CuRcu=sZmAZj0aRP3Pm*MKI#s+!dGL*(L)=vxz7)D^3^6?u5n%Cw2Vk{ zu<`!!SafE4lo63-=PZ=j;!12zPTjC|W+gS){pmKNcHq#DU}2~rox)k~$?RdAzOEjM z+fi6hOGX=XTu{wDljE*gF2}KnbiFvYCs1*Q^XBqx@sVS!9HYV1r9tP+M#t8#2&I8M zTift=%5sCnZSBVo)TT=Godd6fS*@^EJfVcsQwca!(z|ENOgV!|<>eiJ!w;O?AE!Ev zm}3f`)=ww076$edomyKj6n9ktm!4d|#Ji2RA6BQzUYyfEZ6J**(#MIA|4I>^libhntJN|7|wlSqIW2(a3GII(A=}gahEp(dI*+fUm z!s6S-u}E|BIhb=umFD{*Lu&PRA1& zw|-<>|5L5)5Pb_;n%6fNc6qmZ!{}?!xjw|jY$mi$$4%95u5u274bA7KP zsC)gJY=~dlXx4Z;*BM&4Bz$w%o}NQQPJ`FFk#MHZ6+iFF1cKo-GFB>UoF1r{j0-lTzDjHaIQ8d6PC; z5)>HW_&BD{1DrTL$GS)!^u4xsiEo3bNR>Y`TmZ~f?RH=pCKrJV5X6`&7+*MjP?ivJ zX~g`lcsqI+k(a)p{nmdp@~RE6PDXq4E$#xa(D32gk@~R7aDcoxerwCH7*zTD?^OAc zL1PiKAu&&((hB+x7Q%c_qTlWEPZordF9Ifuk$-Zu7i9|&8A8)g3)G+nh~Hyzg95GY zB~Q?U?6`s))PkH`f?Se` zz`3Mwu+0Dr?AV||slN~3NqQsPRf{k*j5usU+)j$r{f{+(m%l((rlFXsJnfO9yFM4FKO9`NCp*z{*B+;Y0}^y^MjhiXKc9LwgHyZt?Xc zsR5kpL=Ac)NubBfsD&X&V%0SPz8DBw4jM8(C_ixdd(~(G^CBsSyucFMUtDLlBbJk- zSb^YJ!7p)5HH>N3&=SdU%y(K*{^26{>Nq}VaxC$3SwLmic$J5^r2ANnf}2oKM@?*^kqaYfWZ@`n2Zfxhi|0if+NOl{O9Hbh1!$>*R-MH z6b?nRjEe*l$;6bcG;0Z(z<3*3*9d-lx+2#Uzu2_F2iDM|z(;!+_yDf8qx3^l)2s{L zhT6oGOPDGAOkehl{blZ&n2b{3=eS}k#opm*k{&bUd7z_lO{=!4Ylpx6h(8hH^q<&_l zzz~IsP&dH?cPXa_`EV9vvg+Se4I+91ST z7RF03B&JJ_hj50ULhi5T?7M|5sPCDTsyRQo5%k=E!YO$qdwJ5V*}fqORwF4$2;7<) zIUy+!XAqf;bYkq>#d!tk31)m~W@(7z#UO8-S{tm05eU3)h?uUzU~=bQbS1l4C2%8t zugj%=I;fJ|dEw+~O(7_qkWs{RVmMt1{l}k#FUqC}%4fLC=QPS^XaVrt3XLmeYb)g& zB~glx(d8*VW$6MH-$PKg^(%JhK6glx{|uz1qFjlLSDid}KiQcW}(hWS)YLRdqx zT3rPXOXXfelUhU9TEnnf!}L_cLRibjQ_KFNmczZ4E47xpwU&3amj9`iitzuK5@^0p z31A^s!TH8OaK7?wHD27?~K~)0f&+baQM)ohFZsaA zv7GT?aQrX7x&A%u2afrHbA8~LU(Yx=)K^p9_&z!SR~$7oH?1A~+eUw~-!?Y-Z}St)HNQ^@GV6nx>$~!qI|he_M@Gl82mB|aYGwNZ=A)-W zz_XO~jbR0a&Ft0PgWrcoc{|6g`@V~FXV*8kMtTz+Qge zi69Cu06CK$4Qn*4&WM!J| zIES)WlwwY4MQC~hh}@q|eSG$3*NNAU5hU$t5v!2z=G_z(E&Mc*T2J>i&<+EOK74>m zGD*OmFVLY?soyf1Sn>V*(jdFUi94ZLg4t6MAEgVNsKi;(0YUy1{*9iGJC_;@%8d#m zv&_qx3fhVXkqaTB&R;13WoC%gs#SD!yffKtHhe=!xRyy!G#iIpS^C+v{PIa)dps^| zlO&MIJt1;P{@PYU|5~{CG{o`vp=XnZ_t`kaFHbp3OBYE@NS};H3ZyHpY}tq(;vA1T z8Pb3>tNr$Qu8wOMk+&vJPB9v(i$3Hp(t0G7|pZj^FhPClD{!s33SMME$U zGQ7-mIC+zSrtqh9mQ8SMFDb3OEp1CON?O^}QFywqRZk&D4aG>9FJ^-t4YMwrDFlm8sB4l8HNUf@0H}0Kv87Uz6HTYN6GEjZ^}gPS@~E1J_!V_~IMfw% za+>bI%65YvBSjtTgvE`&_Z%(i1M@<`sM!tsn6|vB)zJ2a9Ym^6%`Nn3-E~&2NIiyh zY2V*^E4r>gy#PUmknT2xGU8}R`BA?*9G>IqWDI(8Hn*gXM79F@&}BO|=ETK<&QFaR z*VH6`Vy?&ea6OkMGhoJ58^t)o@n+O9JjbRAxGfzu73^~yn3N~o>e=M+YUsZ9RW+Gr z4H>l$FI3%l;_F!ewGV*?`z~GtK?T zH#q1?=dr4v2^BkA-No$+pc_*#_fC zUmXrJsfU0K)$hBdfgDHxxdsu5;_-Go)W+iV;gEhp@SKGFQ!?BCaSrI@!>P) zAj?8DhWys#62X2~4QpPT~kyc`Z!4h*R2H(NUc zgL4I8KCJ5F2>IGQTvnh|ZhTE#y0_tnYZv;jQi^dmm~jlGMZ<)TY#xbyh7j(OGSsgz z2{$YS-U-JIUkl-=J?@GaD7L>o7;KzmI#?U6%{l|pFBlL`FEE}HlQ^X`G zj02U>`Oth2ox~?iJ!{hrU=H5yTzGVI&{U6(AxC(FI5v_G?fn2I{C^)LJ$IH!AXR$mZNgK(ZsS4s<%sg`ilPj70R#B(&V*vxFDR7)vRo`0n^b z&CN?9SBqq6#c54zP6JXY8mf_ZCE8hb@d;a$oHWV`7(HQSkkRJ_mE%h|-uOh61*Ie) zIX?f=HZ(elfDTD{#mYzGE9B0k8+U51_c0F86;)ZOb^agBy#-KQP1`LxzyQMxA%k1c z0Kr0l5HtcL!3hxDCBX@rUs`b~?0oV?^tj`0)x#U(?7 zgg{#JUlRKZQA@|w4U}L#5uy2S;cPfvE(h;pr6DCc=rkf9GUoyplyx+GYfXpQwKp#r z+XV?LDwA_Xa7463n<`WIc|4Ywf5DwNr6M3KYx5^ zCihu==tInX@CQp7s&vggLB8tX>s8d=1fe?!?r44Y?6t28*^Hac1ss=iIMI2d7Jd{9 zk&2e^k}fxRs3So;=ncmF@)4AQ3(Dpjkqs@jtEAd@?5!N<@YXyvAg>hdiqTLEE@S|e zF?4{i9FNh!HfXX+>alxs**yh*?~~P>o<>2q8Q-McJxOUBGU2tNQ?uUckC|sP*Re}n zmC+W-;-{yy^zBI-*nWOhKU#{gvSj%9jw@)ccM0vW93#m_3oV5xhCff39lMbTXr7?A z!84~60bw)IAan|q&I?1ErE@UC*WBUhJopl!z_;E^P=7MgqZ!uJ=S=O?-p1H5KRla1 zHkDuZDeX?UnQ%nLT<4Z&StV+Snq%kkrTsLaEe4xTe7v;LKzAN=;!H6|S0x=Cy6)$b*=YHrj~*ch=C9XZonubXy3&60v_$`Q&xQl}`{C0Yd)r0F zcyN)OMwdN~C6+fs0o~me9pK9^1FYDBhi65PVxgir3pW=nSpB5|g*#rv*k>K;Nk^0N z95L=SteGFHOKjcz3F*oOSZ@kXG-{KgzN*zrIW7gJ903~a*y0Qvq1$hAH+HAqsw`2q4r0syFQD}T<3L*$<&`( zKi7ukowxLQ9-Y8FSFq(SP#u&vMHZzN^=L=uX`^5Gm8_a-r9$$}>lBW^Wj;-@WVIR^ z4L(M3`R+WEyPQb8F@I?Y2;+56)Hd9lmW4GR7|UHPEZ&^ejW&OG7` zjz7R_AnhSePeFMjtsSplX+~bBKH3t-L1p;*b4EsackRx6jQf1qki=f6MhZK3gyy{M zA!L;4U^Y0hL>^#nrQ7F@d7qz%THfEM50knLP1eT$!3vt!C$!K$v`~NlDE(7P z;`ZccdKyM3=%}?*ITGTg2I?o$*Xz`)istGfm7LyTc?4m0bEL8s1zpC4UCo7EnV4Ss zhk4KF_g;wa?C_)YhvCGB@zfwxL=o>55qFIJydw}7CgG$wh~NAOQ5Eg^T)fxJ;ld7K z#Qg|z^$2*tizV8((&X9v*!Cfx{(QM$*$5B^&PYLVHUb7%@>k&9BVLD#4EcN{I));a&eyPW9`RNh;)(90R zmdCqc>h;l7`H+Kc4-qGfa}!_sd}nSJ#5a!!jR1sIyj*sAAg^s~gi>@{N38mMj4L_Y zks9iSh-4fzHnuVYVG$okYZQMS?f$wFtmNp&p^h-YF&NGRWl1IoVktqR{K?Sb9a->- zE)vSf6DtG~tNH^SS#ae0nP}nOY0N=I`BtlG;0}SLF7>3_Zwbg%+ke?4|4KaBN=m~? z#`qb(C7fK(l1%tId9Gf>Cf@b?JMBdq~pD z#vdmo6KbY-rT(feWqQ7J zfw4SW2AbmQIxwu^LHiVS+e3`;AicD_7OdgF)UT0_~ ze?q2UL*{+5e{D}k|Fb>y0}yQSlJvhjRN36*TfLovTfLpP6?uv|DT)P!0Gh4hUv}%p zl3J}=SEP|yqygBk&fyiFY{e#<*m$4RKxA2 z7O-L|X)-A)GWAV0`>U~&oMN7JE3;$q*~OwT6Oh@ltSGQesJ1OHv~zL$SX=ceJKfpa z&m||rrM}WNIK-{6(6hhoR#B&^&by=0duG@tGsCaEGO%JOsInxuu{OA?H7qIlRze3b zTWM{K?&*vk=!&bTiZ5-xmC&i|Oaz=(x;y_7&uQpM8R$-%nn)jCOrID|-(1NkF3GIw z$ZTlK93IGASjehq%If+Gi05QiRAx611Ka3=p@Dy7a~8f9ZfzCiHqL)A6))$2<& z=_Pfw4FGii2e%(=1PoaKAC~FK#)ZvW!5lzB2QXxr_|`l$*wWJ8w*IqYex_q_{ua_7 z1f+7NZ{1i)pM#wk*>NgJ&mzCkr5w17QBZ_I+Y*<{vkf zuitK!aDJTvoA|l8*}0qR`SlGT5#V+=zxZ`=cl)m@4v-W8c(N?7EUyDTEPyJ`(ZxFQ zX#MzV1K8+aU;WJyxZUM%@7-?nf1Mv}ZXY6#Zsl=qZjKL*j=v-SojdUV{l5SIB!d9B z29V!L{jc&n)^w#R|AQM#MOLrxzuj0k?@*f)|HqBRSjzvo7xaleoTT$PI^z=p2yD0Q zxmfCJmzt`ThxziQGoAv9d9$T@oq<&5kxcWIuq)wgXY1XB!naOuTn1t+wW5v2_r49* zmg@RAp&~*=x>hJW%_a$^ptX5}o$f~(#K7)cT`7-U6;GxtcKco0ljSB61Qw81>4a{p z9=-atJA=hI^pK+R!$QVq7J}mg!a|{B>sB7=r%#OgApv}Ep2-*f=n)Qo@gha*Vty!~ z;z5MqqVtKdQiMOsZDQi=L)2C?%?l=^Ujmg%6j@9O{CHq<>7C*z&D3}$KBxtW!GM*l zs^t7mpHCj0Y6uC@`DWv{^f>M-S0aO+gyMytSnN&mYxqUK~g-D{rVNmcdTs-jJh0HyPwe!Ot(9MXhU zq;gg~@jC1`9EKUuy@k1dr@abSdT#gX4u*cZB(0wNcn*Gq2|=!~4aJY(B(*La-xM_< z;qX2iE>T9h2gy!^!W+gc{rj)lFJgmz39=+b1INNhenEDhQ>;u~1N z1esqcnJzYsP5u1+*H$vdZhdajw;OV;H&f#)Dv6lHIclQpZU#Z6^mf<)KeL zE@VY2T(Th|Bt$2)BN-TmN(p5m@~vAtpGTT|X)srzC4%!Qvd}BIlNQ1#_ZL{B%%%X2 zC&9@gs|b;olZP-Cd(c)Dr{Y+7RY66t%?Dz8QhLVZCi1WKekzxCZ-bjy@;FH;BAMSbxd7Mnoi6vVY2l9PaY<@xh3T@`=W|I9ZIKORkZeZXce1U~D zo@Mol;yGdyy*%N^^3d+n${CTEVZN_g&NsL_-1~9ZyZJA|Pl-!}zQ-ZEurceK2Hrjw z9Q=?;eYrOj+fe_#X?ZB>q-e=k5R-C_`pf3D!;7mukQSaJXw+-8>HdLG1U7P#^ilKg zpRqoZQD5!+v@de5E}K!=iMp3D0Hw?1fe=!f$}yq~ljCRFmu8_A@)f_9-=<-1W9tNm zL%m6{%JLt)-p!W=V`g0_^ouoD4E@;a71epwqd3~<1qmnWJV2HT1xln9(b@~nNcvgc zeY@<5(m)m&ms_CMb|{yOVLzrP`C&hrw-Syw-tyS{F2t&jKH_6u1NF=sXEcyO99{)i zsE4JWh)iUmZ|}Xk^Mm|E4N;WX+~QtSEVAtHao&-fcTACW`si|r-CxUQCL56V?vaXv zWH>Yzez2y+ilY54ywju`J&vKEh3FcHlVq}th>ZU|3L&g1kh2WIAaU0tb;%z1PM&8} zU-(suBSy>@ln#~^4i@g3=6LD@lM@4xrbvx52{0CGwPnfeAFGkvY0lv&&R4Rd-W*DH z%+ORZhfH%4cY4z5(Unx)IWs~^1cVT%-JR1inwf#iE#Y~>pqWgB$FjatiXO$@luw1= zC`oy3v=72s#*pTCxJC{G^bs>g%JI+ONzM+)n)5;(k2eK9F1mcKevmIkgLLkbpBcE* zT?_?1;zkW(f+6!J_tReXl1sj3c^I-K%OoO!M$Zt!kUT`UosXab6?wd-)x-b+7fT16Cw~I;fBHl z1fo#d>AZx=@)#E!CANLS{+f*x*nAPrW^G4j!9TJ;7Lmcg1(yZ1c!V^>S2? zQB8bEhRI}1-DJX9El&fD8m_R|NRNGGxgm~iuc%fcs4W?D?jePye?G^MfdY>+lQcH0 z_tz?R-26apX)bljcM} zW|s8g*M!<89myjlN=^BS2ol9uqz5+c9tv%5MCk=rCsXP&z9hlO+RLi=9_Sm^v3dPNe7g~j=vQSltrukr)@ zaKj>RX9Wv!jfvEW_`S}vZZ!NM=3Y?1`R1i;hm{|mB3%XTrm>7CNh31xBlHKZ>eB@F zyIgh&Dvb-J$oT=+oI7d6$GfO!WFr_{Sbk5__quU2;AJ^dS`YE*4M;pmLeC6?dG18M zc|bOdIWv^EJHNunRx`dB!t-}Jv$J9b1mH#Y6ProvLYR$J))P5XO;DCN27IGnBBWo#{fAx)? z2^RAX!}30CVNQOjHV|*zJJ4@+EsBFb7_a1mk3(YRatmL%Dy~hQ0+c=tMb4tQQ)F{f zgn&Dp)eU)li1(G|SpK>0ICyemYjn~uij(VPXrW`Z6#9AFpk`fmzoRG2SYQg5)TvI= z^<&oOd0IZTB5h;5k5-F9WB!GL1)tmf1-_G(290x=rLSjbs|LQ=oImN^9zOMgCpS;H zB+jh{Lphs_o|K?9abTCOlF<3`Xx!zf-G6hQc7Nmh53L{54of`V57@Zm`lYK0KR%LN z7XKc6F1`NZ!6)u57h{21=Tf)tXM6?@KSHtVCt>JLamlX7cW~_Dl--P1J6iTDN*hJY z01C*SP*X}DKUb{Vx;REQ(O_w&+Rw{x53t4N1B{&~edMh2G7Wzofg4fznnkkWG#}vg z-)nzKd$^w56~*&8AJ}UD?BY)iE-7+zK4>omEPHOYlpMYUp5j`7%th^FgN$%uXtALe zVll$R)1)N$JG!UX4)$3*zh+&o9yr59zJ#3X~nGai7*LPrIE@Vtig3sF)8UDzI_mL3+ze2c_%-XzF^AR`kx3Bf@R`ru*_Hr|^KBV`L@$^{a3k-(IylXtr0Owa=wp zEl|uq=z_^?#uS|lz#d%-*JKJA~`b{&V_mlRv2TL0xY9#_MB@Arm5a0R3 z!zW2+cbq=HGSZ1djFS2Nz5qo1gRI5usnOM3p1gb9ul?;)WD-goezvXhpg-KYkJQjV zkcQu+Bh#)!k-i2I!YipSV9H!Z7GcHjD?A_0E)ar(7*l>y{WvXNZ1PkvUu9U$n*t|9 zMJ-z2Av#|rM7#gKtYm~fc{GbaG@F3!!(WK!`kv?>u>$F_Guxl7RA&oiQQ& z(hv8;iO{TfHmDDwRDW+L@aa>1AfuWoHoj?aW}NQ0T^gCybC&3fosf^F(H!dVMr#}k zdDA>jSdjp%(8;_JncxFYEa^|!S4w=_lWfg*7VeUQ6Q4F8*To#gDG?7Thvl1^ z0vx9xVRwCbZ1t6dVREe4G$wm_n-Np&>Hg$;hOm7xTn$toK^u9(yZnf8lO$u4SngFm zOf@VEQ0i=c!oY(MvhY-J9R$-cSwjy;TUbV?-mV!Z<=KxozH)0fmV^k&gadV2KVN8! zyZP)-gJ@out(f&soOC;1auN#hg!qu)__S@7*xg?Q1#vzO0R#cR(tRKqkYDi~7a31% zGG5o)9dLOhIz|ZW#V#^sgp$Vzie$EI!gHn_ymQSp`B2DL@6v8>BWhA7jWuC# zRVMyW8^06I^SaXq_A7IzpYTR4A%7-Y=@M6+l`sJ1oaYvmqy^0nYsdhHM;cV~b&s)0Z|FgW{(q5Eal{k?oXw1POZgq{<4MS&l?Gh(YR%gihddyB9n zFax(8YfL45_DNB3eqxDwp&(aU`!9`yxI*EEoCubz7WMep73zctthe&mBlBQC`DAHi z(lm}+AFIw;XFeWwoL2#You#;c2mZs!#v&~_uO58vWOFS5!`z8kr|{iqD9j8fVQBEy z*z!tGh^a?VL~TLy1WH3|67o!Q+~;fu3UWaFN%T^BcUG0bR|Pr0tf;TbQCoZfj9)Ka z5fdMK1uYMXCnSRvvnPg<&ujGV7BZ?OcA!{`O6n6(H3@>6McoN3y#tluH3>g)tfX=B zCH)AZkh%ETlq4Gn|}Y-NZNh_;op9_m$Vgs4Jdxs2u9{(wgo2S z?^Xx0l5o!x9o5*IZabex>s|}Gd&?V_+aj8-=M)xG+3%)azReC*tz6+$Bh=bsfkVb>PnxT6T0voQ3 zP79J}c&+@Td8!e#M1xS4ushvK9^~WIXr=JD_4Pnz|8&;#K!>eDG+NSj5?X;d zwl*{iG~zVLOy1_NLa|lewAfFx^?u~BEM{1-C>y_ji{bm8`b#@TnGptOCziVu&(ltB znNES=&eg(pzAqplt250w48h7WvYh{|cmm z+XXx?)i0peU%P3>y1~e9eHjp)7CeI%I_X@EBa;PXZ+wPT{J>sGUbSP?KmDa?m&S`oy-(WP(GBiKHjfLGEE%cx-;CG)tdw(Q*Kl@l;j7)#{@4iIb{k_e0%Jhj=RotJ#O9>3eW1y1VYZ9%||)N*f${%J!}d(_w5_6F$O-G4k#A z@Y++XE!>e^t&#oUkqv<9c5ifF%f1pY36hF@+Dl+lL_?HEVAxYt4u=UEV6JSdj-PfPr=Hz^hTs8*jkcLn#6HvD}t-1s4!^BR|Hc*Z<= z#@vNa?9Qabbq?<#1Q&^0o0T`fVhHs~MLH#*$ZPD=m@ewU@C3{;oMaS>o9TQakfh6e zG41Xl8ix;kmppM7e{x_9Hz@>`+>Dz+wUDH}P-{KK?Xr+uJkK^hV|h6LQFiKy%PcMk zeH4LKiDNw+kT5Ul4!$V9NJxIWQU@a3dHtMLksBe6`$98HWlBD+X9EA z(=JqxL2|~v#iKybuiqfyoJ(I1ahF2Ar3(kh-%EmdpM0}5lf6S4>mTjHRfMY z%v=`Fyq$q^y1?YQu(zw@am|a#A80VnJ`BnZ{nlb9trkHQW?K-TvG#t4TXBMC@M(aF+D&#ujqJ_WO-r8x?+nb?;vznRE3^rYdk zpyBd!%`$KgR5r){KAh%E=b`uE8FC4){O%-kwKI3Pd-H`yCv?}t{oBVjh(TGE#p*&Na4x=EZR(kui>FD>;(ap^fhz41C32Q;B*gq_nWc!AF+$g%9 zi-$tOX?_sA_(7!mgGg@c>Us|<_voScfE_X69o_l*ARc<?gh!ad)D6R;^z2SGI#=46#S1tW z==@b1-R4CAn>EH~Hw;m?lhLtr{v*CIoqB zl7=Z?*HJpDBj>xyJkP^qVXryJbAz#%k5@Ij({)X=3x2elz!g0m+di0z`9!=x*O^u6?NH)`n`<0 z0aCdB{u>RcDPY1mx?2ocIJ^a2>qf*tmI5|S(=+btK=WcXn4L4z=cdh zr1G>b_?oEGRGMm+#kpG7JC5e&)emOL%})em;d>_GC;~?{+*Tz=x4CO+YQhn16lLmc zZIsDKERkN~F0tTSZDH|XB)mV@^)55^x1;Og6F<@!!B2~V_%KTBL!JFDbou)9#m&JFcS@Z<_tQ#RuysSGKt8OOpRNtm zWDU_Spoh*J0%B8Cvw_Y>56f|fe_*@0VPEneJpkKqliQH8d8%e1<4&Hux+)ATp z^L>8$4qdax)#=v%VA^ZyV>*{pn(O8K>(FMRH8gT4d--Ju&Jz`O`-&Nd855Qb$N1_$y9(+WBj@(Fhv274O@P>)gozXoAA z>0!iLfF13Rd`;(Qs79!-!32kk-;&J1{8)3pz;f0jxWm|Q9uejVj{x%pc{tLNJOcI~ znR6O5%U}ZcVSh&KpURQLv*}HlbdSG=V0I5E!wm_YQQGBu;)-(a2j%>=9wTL= zK}^AMVwN33A3AbN2m1z2G2o{imbl!4R0R4-l4p1!L-nw2==NePlN8fH7G3 zI;Wp{>`tMK4vNA}pKD9?V>Pk3W(VgmRG!ucj`he?in`Acw5z4A><1A=CHeJV<3fo!rI-4WE)9)-A7W*t?_ZfirO$qhoM>s@M-JD4CJ=??eK`T zS!@1G4Y4-R90J!q_Xdgf+>W+g7oIezkyS|AK#P-ANKQb0o>zv^dyJ8X#CW`d5kMch zCDss!5~C6SZ2WhQfkE8P=%1i}V?jWgzzGZ~`vr&y3`iHXkVPro0Tn-noa?Bn9R+3y zvHZI&>&$=OcA@bR(Doh{xzNJ3?gyNrGU32B=#dw8pwp3X-=BF0ZXQ$f5L5HEYhV`O z+W+qNZ`(IB*PjzBY;xtpXTns^LSh_ zrhg*d(4|>uN5ou|#)Lf#RYCw}iGio3Hn$5O^=B3(Ye0vg^!pv{%aBC*bu!j_~-b1yYv8|vyEkq>4IZ8S@5=t_KuJ+H)jn|CxIKQ!p8P&g61)LCoWrH>|EHy7@88xs zBe&K%V9+vJ4#@BID~Z4GKH#qN55f=7)c=C~e@u1WzE!#f`2mDqSwmA(PcuK|A4tEt z2!QnUT;p%?d;`P3kiJ1f$-CTw_eE8Ilhgr7-_*qX)-cB}-K?k-@XYy8lxg+F-Kwg| zy0Xy5#?Cgh#;&@`-rmWfpxCLg?(=8Y&tAR&>D|S}^RG{imzR&%K)bh3pm#)scR?Y5 z=lgUw`^=8`HrM;tRt6Ri0B$+KNr}PT-GEgN;FA;CTpu|-5fvRDm5~wE-4((Tv zX(+30G;87i>5v0(?+b?d3%0iltLqCF{+Q%UPZZ5<-=h7EjU}D!wF#dm83LI3|M=kmW;p9xw@x^>HaJ^A!hQ4LK+EEM zTWiOEal+~992y2l`<*|Lw^{gqZE)7Ub!~0_gYW}1{@ya|eKkhdNyMGh+0l@#3^ADi?=RfCfZvKt-|KW9Aw{G2U0FeJSmH+1YU#2%#r)QV{zXkUHV*APe725}_bqxO}Y=1-C??2dn zbbFHIf3W@B(Ny6NqPS93dE=Q9k*wN#6KaDm&>uXcfJE=L=PO{I+0MZBX5wT3Y+t&j zXgAGz58&etL8-U5M)yW!M}(7Qxw+8KT1mRL9_H;)){8_ zu_}bO&j^>by;cjb;v$&hisxAkCLa07>?g8xM~T9IgiJ-%Jl@BNDmDfmtQWYazBA@T zy!A>yakKo_{RmrkjHzq0ia9~%I?a;tp@%!IV zWcQhd=;-eMB6gZHjG;nnGc=glOx9uVlh-iKqTAO{3F7zJddool)4#AJ!g+w!HAu^n5;n7tqmf(z0x z8HIN{Mr61=gC2h2O7Wy4;xQA=&SB*)tU8loyI(ZJie1Wbq<>s2++OC7D_?GdSv*SR z9c%WL_#=C)qjqDlC9}sBt7uJe-BHWqvCj|@Kf%k~`f!yd9vpg@;P-YMK9_tFO8Bd6 z(R2C$fBeg1^P0yGzz09ctXtE2dM)-fYr>34d3d|PlBl8DG^c&@?w(VUkLRK_IPsa0 zVec_Ni3Ar4%5S{JwC$o-7y?rV1l)O2W%;d!VOJO-PgeK%>ieA^Q2R&0{;QuyaY|=O z3A5})DCTtJ4k|Ge}FG%!FxAS>gh#eFKpv<8~WP&`s|UD z&g9M!)15|OzQI0nwCmp3-7z<0wE8r$|4o#hNzGzpo-qo2Rw}I+m@XJ1s=>-FnU!gG^@n5 zdfYou+&oc3$au7O6DcyPD5)|gbM--bkZ<^3;Seezu%c~NRo<+i-$#HdhgJt9G6IN8 z1Mm9@<`pD!gow&2u=?9}L=xOdU#F~{pqaX7ieEgHR)CHl%`i^DWC4%6_s%Oqdg`YM zc0J=uXL+tV*>(ekdyub!aS}czBD6Z$Xf9PN)1?K<2y9J==HjJFlv<>u#yfu@1xb+& zwBso0&3#r~FT@S)`iocE!)^(k(bu?91(@mEq9uF%?HVc}vBL*=j6wWwP0uPEu8U0M zy3}J$h#z>}`*0LWpn*BS0Bfkrm6m_0q>5r?i7p5!l6Q*I%*?7`E|yJ`vDNdBDq%2j z^ue*PDAbsbQu)~YaKI{n;47G*C=DV~BI+44waD95eu{r+M@6QcA;ZT!U0w246s)rq zqgspYawInbi~2cm-m*7e9L5~0{QJzi<%K|!TdiSmegsJiv;H(S#q2Vg+eiyuimXWa zex0Ap1|7J*Okw2x%8yV^Er}rH7%jU&59m|JF3eYbV~k@>1A6|r zyUf3wR?kLCWQV?Bpv}_a4jN2^$OlF0#U&By6l8d5LN1#)nS$4kJBPbpKk&s%BC^oJ zu#Elvh*^Q1^Y&~uj_Sqi zkkL>@<}jf#hF?lXn+R^2^oMSl#zlS`p8Fta&F+MN@*p331%@E6hxuKTD`J7}>&4W{ zKczUAn+EDdRN)+5di)#NeCk^dtyQEgX&r4IDLa#Fm+4WipgnR_gK+%FRJ&UEQGD^1 z`MKJ=KD!i(yP+ag!-t3mn~S?B1z$=QswRf$Us3N#*cI>!k;)_3L=4N>Rv1#M0VfX%3es=m2cshjeTp! zzofNyVMh>F8v1FRVt(D5T59_(u1U>0*`5eQwEs|Nx#)zd58dp13AIERMX1ws-|wRF zE{$I6k2RXh7{Prm9=Q(ny>`$#__3--xsA>8rgcE> zmpncpG6~*22e&mbsm&TI#tJP%I$D!$H@Z0Z*tuiL1I_Im?S4k-%MI83b5Cr1uc!y| zb+5gK^}VK5;3C3Ufwf*w$==3fd!%MNiOdl)9D9`1c%N~5YLd`8Jn%W%bV)JvQJwQ< z#+Ux_-d0D#L(k-ynuH!Ymua~nJkr;*z`?gM)^}vZD=?g_ddBy02F%qF+Mow&ByAM9}dK~ zw9eCY8me#1)Bu8R7@3c#vAB@E(>C@cH}-R=^L6AUw3&NJ;TNo8>^IowMCE{6eJ-#u z_vNc&=sW!YBXMY{IHAZ(Z<5-Ot(}k%k|65yFc3KcT>t@AM_@T2u*j8EqT$Nv+5yw> z1s|mxW5P&P4A!$;mXNTI`*^enjGF%m7&|*@UmEdVDmCatwLs zIh`p6erUok0$D#tqW%z9hNuX!`&K3t6?*<&a|uQL57g#;{qvs4^J>b^MZlCymNTM> z^WDATnS3P!vsKK#nYtq(~?2(B0gA$ zB`Vr8MhfK~{BBs)TLOl{{}m&e)f2Oi#BFo+FUn3z44WtEU? z$dyMyb3X{?hAp6l734Zn#DU`ENqX3N@QM_b^R#yO83Cxd4C|gg zz{(4!xmur~xpsok7R%-aK=gwklKs*>!3uiK3YMS>cv=O+VlgwU^8S7WcVh)9YOy31 zS@I=Db#C%uJ2ZMniB89 zbm+yjL8J2tKJos6l7e~rVTIB}dEr_6%2{8w>#8&x11js&5RHI~PSO|vCqmmOn>vJ= zx-^?ot($rho3h=rQm=wW++}YZnH`Wx==wp`SemJEPs*lo7I>N?A~Bm$1BAM(-b>v& z`;LUZLPgJv8xI!iT9GaF@YZ9Y(w~~GXPT{*h}PWl*58Y*H&?B{3tQ2jwq0Jmcp`#3 z%qEJifab{@RInEC*~!{m(mz)vkf#pTvUla zj?4bFV|eV@LoGv&r=2`noxEC|wV>M7m^NQ}^m&HFcloNr~2B zI3MBC#=>yZ@MNjCj~A;6=hUSi;FhvzHD;{X@Zol{vv=}o^%%)?)`6PD1=GTbrGH9g zap6ST40Z9CCif~RZ5z>aog?gJ2zOzPcxO1X^EGw*b?uZ!*>L$tlsvA{0RfjxkMX^J z!=z4|#$-cC7dF6!(^6|;ZG5b60jv4QNdhVAgJ=C_Ety~wn}ioR4y1jt_*MV0`E1~f ze9&@cAY10aQNx=g#6VQq$9G$GO-Tb;TDaaZFuPcfvR5V~F}Oo|O#NxZBVTcw-Fqh4 z`;DH$S`zDoMEqWSCShnIbJHTsk|E1X8iaCH@jV$Vy2qh(K2X$Tr^-FLlLSv=|A@Tz zpwYsjnSG#CrZMg7D4@69DsPw#$WAolCL*D@$xt6S%pM7KkVVSJ4-^1l7bNl7a%2yr30b9ZX!$^^0<0mCkEMwzCCa;GV6FV+pUe;q*r8XM+LKQ#_8gOUKP$ZwY555kLfqhk_k>< zFyOpB9DgS}!&YqDBAr&C+#2$!HR9QPl=gg#%lz4AlS$z;)w_u+_|Q?0GA$< z!?|Lz1h4Zj$qg#1!vHbGa;>R&XzW*z%vi00^>_TmNTe}7Bp8xbnrs+>&Zv~4R;U* z=L(pklHp188zwtNt~SiFwy!dqPO24e&0^U;f!4Hy)lCrG!XGqVUqb?$)_#9oGy?ZA`_lF_KE-^U-0eE*pKCTSlRc#yWj0DO+YETVg-lW3rvBOCksb zw%#voIi_qor__tDQjL2E;GD~TYKL7(Iu#s#iAKRhNfUO$+3G`Yb`aFN1~z1Fv=0-| znBIvp`L?)%zwTn-GF(&bu{7yR8MK5{Q;e_1tTxBTCAY9R&JWe?Rk)f^bM0&Lme!=~ zH?-_GE$z45?6*-LbiA<&&1pI4`=V${asPnEcFy0WshCl;WNqxOyZAXM&??%@6YVaC3u5S zN+D5cD+1*RNbX~oU@bZ=B-Y&yzGU<Lequ1u+E<^kM!AQ0t~kpY znX9K6h+BL#$RT?W=j3f@$;(Bi+IDY9q?-h_>^-N1mi!=OxBsK5ks>RpQNh{Z!rDoe z(%@s=pArS3_nrI2T7SwM^(*YGi@YwNS~VU*4k7X)^xiSMxmol4JXV{uAW zpa@}@Md3wZ88oU98tirvLh~y^4r(=#=q5)!vPqewi{BJ}(IE`$rM*nLi@TQ>n(2HQ z%ykj*RL(IC8=sy}5_a_#iB+x(hQ9^hdwV6RchyXDW#)dR*+xgr{XPC}RcH>D6=!l_ zDONQ?URD^^sf**=L6=uX_nPhctuX94Dh)v6p(Yf0uQC z8RKmuI^G)k-Qycc#EtYmh8!pM51qrlw3o>zznRN07{{=r+XR6VX?b*IPjn7<=}#|F zjAa-=P2M}Om^*qM4+cRU*{0luT@|!_^s4E_m2MiAE@v}P1|D6BC004)|8{JH*z0at?4QA_%P`Ph=GrX~Fw%NVGD$-6?x2>N7CBj>o>H&56v0yWX5QCj9e zwuSaC^v`U=PGA1I?dT2)S{9A{$v)NZ-8~m)Ui$kL`1v#i_m7P~kA|zw2mn{W#zA&_ z1VF5B5y%39j)HK@@lp@dpxQ^5sbNngo|NgBZeW-ty%#&Dexm18uuq_)n!#0?oeq;sPqmd9t#f|D~};7O|>4za|QI#P{u(| zEAwOH=1fJpT~!th}X6u0ur9Ee*6PBoIJU(vvH=EsAM z-mr0jzk~je3g=3tBIP8-gP*XMfyO-HhHusW9aqZ+jb&vBh-+w#aTkQ1NlPPK26_Yn z-v#c(nqJWmr&^v1>n)5p6Z=yPjXjNavLftuS&p4mk)F7DFruS@vfE+6V*#h%^NT^h z3rqwE^kR|`m`&3kAW|guxC}gh1q3jjeL$dB@Zr)G5G^ob`rEnSwqBlUeZ)~lZ~6+$ z-t9Ny$)B|_c9xF@;=20@Zv|9_Pc|S52Udji@nakjFvb`Hw1Oo?j{(yIVd()MSHS9% zV~1mFpjJV&2wY1L$S{qV6bb72`xy1WcQY{a%Bp%>E$=G8{;u9GI-YOk>;)a@gY*Im zT=2U{V#ALAEVBoKR9gD8_SeAb7;i*^@IX{7AdtK~3l=Ap4=o0OH@0Ztl%7yWyF;?9 zfB*9)$2x>@!Urpy@Mx*NlTZNf3%v>m4EZ<`6CJAzSZL#!&?z49764&F zidb1zKrm~xS9(JaGRWgamS$1(&#bSR5g5QwNzTB`?&$w_1qCz!k`t)Cd(`Z{rg+xC zhvlq>%FA2Bt6LY*smAcZZ-ikf8K}G!mgi~Fy{UwWaI`_1&ip=a#)iZ zAozBwZGWWq)$)fo>{LMi{9OOM_tE}CoHO+odiG&Xp3c8rlZX_RS1|FuW9qE@6r99N zDfN?%2aapkGn=|M|80r52mePA-SQT2#ssbW(K`Dhhb~)~ukZ(6R?JCOtjJL+C{(H{ zP|nFxO{vx>%ht>+`3GmNE(F-)x4LHl$Xs1?%N1|02FT&ol?C3}8KKEZkpR-$GZfv? z6y4t$lbIP8o0L#c1Hin1*4eFCdO=}w=}^kpVA}LV#>CLA+*xJit=w64eer+b+3Lz~ z3jiwnFRinlhMvKO{$7A?-8A@*+*x~TNBh@XPIcGFMAz78*Ve`@$~rs(P^tSSMhB** z2LT@S+$;dG-r}oU8@I^n-qz^K(!~0~zcJNYKy~BC{Q1cOz?}vd)PN+~-tOZ5&u>es zf4S4QXzI=N_R-1S_CHW6z?c5Rl)nD{^ViA6`OlwcKQI5^0;+)4ndN`cItvL6`>$GO z{-#O)Rz&}+brxZm;$7}*TIu!Dvc{*p!BWgq%d)+LQ?ul+*4c1Ddz~kzZ+rLTeTsl) zzsd0Vk(ED+=!xXd^L3w68Gvflp7B$58F7^%mC$ymh<6 z`8l+yp=Riq>WqD~gaOE6t%kmsiFo-;qdoopEtW(a?mOB)ANdlB)MY3S*x<5cTHz_r zM3THU>n8GdPCpw zrdP{u^?yX8FOiD%N5j`A!@6@jF=MS^>-+l4CCL?NitNm45*N{H;kJJ*x<#Nz@^xTO5=y3_nVUt3A>6!?M|0Kh!FwgMkQOcUaF8_(nMR4op%>TF!g~3@dZQzmGA?335 z>2Mt4ANDjk1qs|EvT2s^d@}3T(VcW`YImt@8K1M0+=-yI*c>O_7t^><^0nLy3AzZH zck%QYsQqT?E9q;1+#0{vu;e(+WR-j|%?isD<#4B^f^fkMQ^gz%2RbtB zRo*=Nk+X=30Hpn7Eki|O5q*F28gf-?(Y97gYK0-kdCtDBkcj4T{nwJRNyY?*m~g_# z)V5)aXGRL(ecBRqyfMzAKHP3ZI3Og>F0MOeuX3&D_j)DM51Yd{Xast5xb4PbyLyHy zq6Ez4{!GI7>iW32^J7pcF$!WWIb0S20u-*EL#B1Zb+P?u)_2vlUOHFKjB(DgGICc& z_%01Nj!_2k{%p!%pfn0-bCgN+%W^5H4)1;7tiCb>LTmV8hg2Y;T}UJ=`M1wd ztYkVflDBKfF8T3Q&AM>lbv}N0Xl# zbjVBWMd#h67SzK)Vhg)pxo*ZC9abJz2t1otX8F+EelM%t&_6}v1oVM-F)^w)q^+stJFU-F=EMtk9SZ~f6Ihh9(3e#9!pdHl@Of!zodmRY@)Xj@RF=qL>{*san0 z5~zJU?;4I^Sr?d~zw^!s_<`e4=MxyWM~g zErVk4f&tQt#Iv^1MF`UeA!VKn;yc8L#LVvb6-W-mKtlNXWsnQgI>0bURf(#vhE{gu z4Xa1Thx2IbU}T1g@o(QnqE+C8a4#|CZ#Uxm3Xe`|4e#^9^y{9 zNz8V}^SMJ96qVbwPHLqlb)<0t&~(5h`>xp1Fl5iUuOvm3S~{p1qMVomLq*yNkipA9 zkM_+d7DP=S5?Sp{>x@)jg?>W5<3LGlS){_tcb|~IzE7CLq-1`lob;+130>6`=T@p8 zviNi7-o9wW>sT%)ay-M&6CuNutR_!kxDa_>d zS{j>iG_A{jZ8AgMkREqsEr`Asqg}hioeSQ_D40(&XXknuRPv}xqFp*A3z2H~d`iqP zptO*D11P8eX)J(jUgR&_uacr|ib8%gQxxa@YPtPTge_V?EvZm68$Yo`nT~P9$%WsJ~<1Ln1jN7MzQc)>qtGA>T@6972v}EY7rQEcj+*ViB?8B`7lzb+;P@yqt!x<7P z&H!1Pp^jaRVxbkFWZB9>Q3mmpV>co)b7 zM2E#9?@)$AfhQ#S)!%btT9d0K^}Wvi1_^=qwS^F8*v^FF!~QcXcO6s6RTzoazQMTj zP^p!Ds6e>>`hH_u&_xa9mncqAa;F~&Zq~827X~;tj&-PT=FHJiJ?;4?e%Gg47Mumf zB!Ov-0N@nABp+rx}vVA(g(zbJ|&Uxnw=rw{gB~kq&_swxZg`ArsW@= zL{{SD>vJ6e>fEQI5t;RDwGY0$E6;CBFt+C(R(>?lq=&28J0o5liNLlAJVQR567UF( z$KDe7Besicgg*@M8-bLh?y^aaU(fL&WyoCCl@b2`{`p=Cy4e$ z`SaS^W_RB$tY4SQ@i!#Rs&=djmQ^Zn-cg)gX%KVIH1^#fbB0L1{DZ;jXi6k0;Z zDb@vesF$xk1e*^w5~HqUw)UHu?Rm#-bt~(3v5lF-OM;yF{-#|K6Pa!hriX~{bP=jr z%PVKgPaPJTC!qs`LEl`&ex2T7c+v)Y_3pZVl!{}Eg4Wp}P;;A*e7`r8t4bCQ5M6M{IyN|x&{yvFP^;{0^83bLfzn(gx zi3blA)ww^W>dgI{s`fhufBM%JnoH)p~B`&pptLP$zZ- zWr;69H{*{OE+NRxtJLeI!B+665t{d4tq;bs0`*h78KQfmuERu1*X&0U5Rjne31{l& z_JE9qVUXq5J3PBWFX6H)^35-*8cAO~GvCBe=Yk}2v14rbRo5*XoJV-mz*0X88sB6Z zZ;xS-85P%ZEQ&ZIS8W&nrDT6pZeRLU{~yAdk?PHI@Grm-f098w@4!fF6*nHL?c z8%i1g{h6B*9!bJ2NGdHzrY-2pYLNVD&|oMKeeN^2x+89VpwMW5#%X}oYG5O)cS#`Q z0I6zvi+BI7Hk?a{&<8GSXjGA;5Y5A2gkOP#w4sqDUaoFF4YxrOQUOv@NZ#g}EYCsN zv!Mrv+@@j7l>53NA))xV?#N}q&TW1MVF+~)h(YQmSlsyBA;F1l{_&&1xq$FwT377W za6%I;eyQ+}xIu-dVM;-)oej4Zf-47Zs zF^B4inq&U@2nmpO^0;;}*pexRifOI1VNz{s;%)A^d7wzM#waOr$|CUKN*aRaOLF{k z>MLd%Gc6ozo5*XKcmhJC)>>kwUAoX(Dr9;3z-YR=OE}0RK3@Y7`=|8Hf$cs{3Kd(- zJ;1Q~V;Wn2N@IH@)dI_9lZ)Qqr*!8}17IV5n+AXsatTH}qdhYdAuD%`ywu!_jx6(M z3S;3|tPq}(A_Y~Oa!hU=#E*G}Ba0l(4-i#r3b)b_`fI8B(vU!Ai5fh|7xT1j3!^S7 zWH0VK7|lF5OL0)RWwsPUhcW~z9fv{@{WzWyT81brL_Q|I6m~>DtUf)_c>ercJ{B)2 ziA+I*ay}|=fooC$)vGkxdVc<3KIM5{EGq<)C8&_=ynsz6if122@U>9rwNMVLNKCUx zScb$79afiAFz76u86oebEHs0ZAlMXE6@rr}u9)8+O0(kwPkymR#|M2&D1EvTo$+EL z%MuNl5`&5oBh3<9#8Q*jV*8Gg@AxI=86^&urJfO`j^`z=9mUSPW$xo27!^Ng=oc&X zCMwOA#k`iqotMclmnUhKCua~QA=-Y)a23bSW0Mw-ut4Bp<{5Cuiake*�*AsE9cy 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

      v z^fXo70alit+N!?smjQj!!K;VR<;RG`B8n}}+->XV>3k=d zUsQBxz1uN;EMz?)8y(}MBa=cSKlD44Vn@)s3wK&a3|_gUlT=bAjg!oqP|bSQ6-PdG z$E0l(iM

      (YM`MOF^BRje@VI_Kh`dL)KzQL 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 literal 0 HcmV?d00001 diff --git a/docs/visualize/images/lens_layers.png b/docs/visualize/images/lens_layers.png new file mode 100644 index 0000000000000000000000000000000000000000..7410425a6977e0fd685691128cdbebd5b28cc1e1 GIT binary patch literal 11311 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 K=?Y2HkpBb8KqEf@ literal 0 HcmV?d00001 diff --git a/docs/visualize/images/lens_suggestions.gif b/docs/visualize/images/lens_suggestions.gif index ad93a9d87d548ba2f8fee525bf9fc9e975c56a51..3258e924cb205eba003d28545e5c23520661d801 100644 GIT binary patch literal 1208922 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�OHTSvy13K;$;$3Gw z`sVesE{{*j#ow$GX7l%n%rtRsgWOiQE|ac$WSZgT*bfx#W(efuPe_cbHLQ?tD(A5@ zXq?o^e`8HEZX%lM=4}GbBs= z2%+mH=V1OyEny_T;S?-aUQKRj(vRQ~-YOXZ-jH_i^(q{U_XBK1EJ*}b8hEBfrqspa z))urKew`s1>;5qm_{`r8Fhq&>i?K^r=v9Rj#EFFp_|i+?0L2u|OtN1P`}j0}M@|%E zw3sG*N+1{SNa4zzL^v*o2)gF%;<_(o`a~HZe5ww?3px!%;ek23$dd^A+}8_fZd;la z5e0?D2+}{>2p0{CvB~4FXn&-~f;S}v$s>YeyCwme3Knv?ea|&wlE7`Btl0#qI71Qm zBg@6{czQe=CVpK*w(>=Zm$BA;YaxBUlN1SNw5xRQi9OvYhDta$PerZFW*#Y}$bwfx z+3v^LfLR08Ko?v|Zo(pnL_!fW9g#Em|3lGv|5N?Haro?W9LE{xA@8|Qnd|8je_#eE< zh~gj0dIYj{P6E#G3z6c$lDp?XZtOHkQ^>1*Y{ZMZ*KuhFt~mfM$sRhFtWyk~T*?ed zTSdVZb6U#Yf5!o+x_HLh=%`KaK)x9{l9<*kJ8eTuC_x~~gp0d`-2NfT^<^%^DHxr! z?CuSZ$R(#St~lP&XGDUrta_7;Y%QWw;$yRrY z{JFAJq&PJpmNNdcNmd}yOae?0@?A#*ug$K&f}%&omUvx9#9joxv(te)ol`CgMY~!t zd5zwzM?0X)AINYJSH)t|x4kPXE&V_J{tS0I-C^0YTHbB)b=5cf_#>s6LN-^iA>J(H zWBr!d?AJWI;V&gFR@cHsVn&Y~WXo39EzY>Zvv_AZ3>FDOav$SFg!LK!1d#2D#-Iv8 zlYg5k3BL7$^dqFr{%Dq7n4=fCSoH8Itc%VbcWj%uQNGP8Qz-r*g$MawAH$jg#RKWq zjKrpYH3XzkC=FW70{6dDq$}GwgDX5hGOhY@2D6eQ`r?*{Q=9FmoW{VJN~{p!o2Y1P zh~zU)7rxZ@jC*`(x1I8DypovUGDyq(%w_?qW=esMhxgQ8~P= zx6POyeJSQnh1`-183sU9G=kHE<-c~&H-Z67*CKDk;Vub7%6a$fvY<4k7h_gjP`v`} z@NqD%c~DGpZO?RC5UaJ!{Y3Tb#!Y5^D)B_r;ZzbePvv&*C@DAcv2+R8em73MpTROe zXsLDxU5BA#T#F8fG5D~+cQ;{o^&m;OD^7M{B-dUBDW<9tn;RC!W-s`2P2)?UmFU|80%P&~`>m&HO=(&a)4hNwR}(wC^N^1ytm5fKOo4IF?xTu3>o8W?{G&FI z+{*$HvdZ#@4F2OUGaatJqbKdI^VlVkIalT+p25Lad=H` z;I;PN#s_~B)hI1V*QLTl25*IR;2*vGPaWkYoX*M(uR~rTGJY4GYW+(4Lwrj)cIKJV zmnTDy-k1#^a}IB~*w1KxJNoVz^XuLhnw=dB_I@_RQDh}a)1Z!9A$DLqft_~KVvXPD z#IU9+e`a*AhREUmNdwiW(Zt?$??cJs6K>Ow3-T;BR0XES1@?53tjAucr*KR~qXqA& z%EWO0GZ$)Dg;Rp55`8Un6_#7Au7@AKXk>)cLd(*R8&FtdL5$mt@~=w-y*IcxIhAuE zsd2{ggEVs(vF`--z<$xb>7j2D287laM;R~nj)#ZoLd%>u6Zg*Cs zsJA-9w!EDCpewNf27=a`0RdRAK_f#hSd0`dEAEXSy!6ha5S&>>WtTpOOmL17F3 zJU*R+zFqCI23l${mEvCIB%L-yYj;76U5_dqfhD63IBPY7yOv&db%MpA4W?bRHzdB~ zHxYfRJI0zn%!lL~`}QG++YKfh=dg*RtX-(GX)WbPN;8in>I$SdV(0=NyTB#PTF3N? z1SAprMnRH1kkZ8fmRZ{~=V}^BfeetsazR=eHUT^$&K;{B;;id!Z z#Db}gG%CpgUzI4~3z2ySQoA2;W~g7`X(09$!;Mc1D{9SaA$MJBSx`pMh1(fEC$Al- zq2?K_^V~GS?<|@$z%^zSFG=8Wtn>a&Ov;=~VCf{hU|)Grp6E@pTlAHjOfeeKNg87! zF3h4wYZCZR>J{ER(FAu5696VZ?h6%ypt^}hB@$k4U+zb}(bmZ`INdeEHz-FB7OedIzYMJvH z8I#ncVBRhnPWHU)G}$+<0<+D4d$hzU;?Pl4XoqjwPik5Tg4>k{lx6CmScK&Pd!7v_ zq8~C$MNfRyRvClX1C)<%;hOi;Lzi$D=TePYF~3RZLI(VLE%!Gn%!7Fe6PZ@rl_nMm zBLrZrw2X43eZEGL-Pq2uUqgiGkkYm+vAL`_1l~0Qu3!xF1B-r%zhR=Dv<^USb#Z?K zAc9%hXyA?EecVh0?2e#V<-U`Bn?iGd`DcLWCl^_EuIWKl^8DJ3jsgZ|4jDy+K0hR4 zSC9A@_-kg8IlRT$3XwUV2$@5O95Eo~UWeQLk$hP{hOQr$u? znR^s~2x%$0{GrG+=O*7cF7H$^2d(%hfs)8^vFrsemn#)6$%z2KG@VMKs3loxHyJNV za_ceq3h+W3thrDo*6EhUm0Q=GuGw{qw3)giO}L%IZN;!Lq;I!iHtEg&L9?TE(#Ft}&Tp{)gx8zHKv|_{)am)d3@+s}l z?2{Tjf}(o3-Z5;)Sg_P7Ts;-$!scfdXV-_|hKLCD32v#Q^2KuS(n)LZGfzSXY`ZXHj|5GTi-x=!*XD@TXfRzR|6`kziJMcEq$T2xa$=HKuik* z@g8s%0)$<{yKhERpCO|rev)DQ*>6Cwz@$5JoOclFfMz;)xLmDuRW+Up(2ckT7nDk* z>y`FHtQjPKnXm_&t$Yh4$T+Xj$54cy(j7}~^YiUs8tMTPGr~kIP*Ld-C9LuLJpB#l zIJjMdvA{>zU0)6ld=H0ui-9d%R}b4Q+}YcJ4FNU{2$xap1VjqzsM29krW{6EB?f|0 zS}ct}#O8%c2SE#%+PhAiEP4IK04o;k_JLu!t^@s9uc*I?NPJnnPj3`@mvc4 z#IDHgzo9j)e{et9Pdp;-AFvyK5{GP>F#kB2AkoHsPbOTn*Z(@!g$iwDVkXF)rKif^ zPW5zxb8L|6weNx|2In8GdhQdE_2fZ|>w^zkPzNo83(Q7GyBbq_?w>5Kt9ZC|Y0VlQ z5yNf*&pkOjUxPgCf8=`5!TE>@+l7S?u_H?ThBteKLwQ2N9N`tRM>eoZ04ib!wyi&U zX=+gLMNNGu?&l=NzNsd@6n=p^w2mmer-064!;)VOIW~m{QW)xH&N+55z~t@m_nu#G0cn{@+4-52-Ww({wAZ>$>>pH?fqWdAME6V z(kj6jA=>7qP!vzR&HH3f^DDhTU5yIc6Of68Tb>YI?&L3w}PCU#!5 z$LjpVGXt)s7LFkja;TiEcV+r39-@g4`2(oB>Wg^4GvVfi9;a4Tlaa6Ou{-vYUkt{Q znmQgI#?81W!`!B3PKHf^=Z100vq2`a`m)Z5cwAqac=4?4AaEMGJ8K~_w-h&B6M>`x z5WP&KatT%}9-Lc)xs*O5TlVxs80IGf)8m2cnaJz2$L`|Mp^Kx1z6hG=LgLhu@1^kb z_d1;InYxBke@n5WI}79X-2UIa9}45XkWrxFMM=rUPK(7JA=lGwSgS>wO+4rGoJG{? zVo%240dcO0iQ%0_@|G>M_8mm_mzRikA~x4WuT_wAJ0sln4-R3h`okr zj93#lLGt?oJy|y{kvPT4L0?QHK?)4DT+D{$`V7|m5A2cQYTZ=1 z(9FAGaE#J0{N4v1j>@-BXL*fG}J4jJ17!Mh(0*msO!e2HN? z{El1edL_hk&LZjjh;&S$#1CA0PX78%nLP)PYlPbi!-dEsr`_gSIS@nKEr+=fXW(;l z5{4|jgY4hz4L_sJAO~#4t<7>g*HN_KiztRpL_8`Tx|sbc3$+%Ijm-eOox|B2|mwsQ{@-PY zRjL!N@rYksD+3Xup=`J(8LTRX*(Imdg=2q~4`#6um+>K<86O|0Y!3B)1kZis{`aw$ zH8^l#@`LqG1Z8ae&1%#ICN&K}qQFI6cRvCfPn!*f+VG60Rj1~k9`}LrFkj8`q-*CD5(aOZXSpCOidj}goG%mjS z?E#*PuZMG<^t}m>VwS_es~~Bj$N>Yx`+>F3{tj)09}h!ZWIzbzKQ626a;o-LO(U-} zF--u(0h9Ccom~UelW=75BWioP53@z}sr2Cu>@FGo3xM{0yaVay@?^s_l_#=io;?8| z@+6L)`tTDbDt#7F@*lX=xF6&9jUR~Z+vk$;VEAg&Ag_f2muFYaQgN~lRUUI|7MViY zM!k8sGBXWpy$hwf$fC}W2UWWnvL`&7f({C8ZjIP3x0Ar9GpX7{i8_O7*i)XU1eD2{ z2m9)p-{d%uln=1&g>#J1KHmusVd13Ud>zUW{6S2qP(b+D&;8e5Vd*t@wN}@L|G+|@ zYmw3|3%C~>EBdZY?4hE%)Rx4_Q~ta9I<^emgr~{vA=+Vr9$GG+hBexQb4q9#E{|IW z?*|{tt#`X$Lnv6YdM4nv8d0|8cgU4+$r}^n-cs_3E-hA5$@}Q^PUar+^UI$XSVkM* z0;?NaaT0sWucm@T#pu&2a96wLVo%>AK zbwu$#Z@`p#C~5$jq_W?N(yZ8jfx+P!6FH3 zf{0soq5BX=_4=t?{mjjfqy67#Z18gr?I3C^`z%rsRzeGm%rDoM$r-}GXWBVyn|~oB z-wE4hH;>bX8iN;{B!oAs^8KAhs`ov5GK~K0zo@T`|1mkIRf#}G)YsfrM3frrkz4Rh z?VhLs61BdiDI~U=tkU^Pcvmp659nm>Zml&Z$%N>)O7h=~Y*jb$R}LN#zPO%Zb!}_> z{mrMsK(4W4%LMuzsf$=`_e87H8dB~;^ptW9RfR!5B}Ji%T=kA7nN;(pR7*#ta+xuE zB~_rRJtboGJ?LauH(-X=1kl3ez|*Bm%&8A#CpFa=%XrO6LIT+~?4{6j7T)e+1)Uqg z6txl4evcNN`goX7;a{h4p&anLEY)9y_(Ub^w~vpzn|Bg;$5A3 zA$cv?I=5v|oM8Dxx`eOV`(lz>%`n61XuDku9z1zKhi(^Dv=R83r$&T`X_EV^XI0OZ ziER~{7=%T5QW_o?Du=7@Ts9gR5W6zO{roiXG@n@L&(ov%a;axT)HpK)+<)wE2vGQU zui(vMq`K-7UKAR2CP{`aODeUEZh($iMO5e7P2tCohJl?)=`__3Y30Nd{~kCP?nfrg zB<|BdxArHO?_~zBmCsKre<vYeS$V(&DBi zPrej3#*z-TETKb%N3xa;|{N`wB8 zRwT{SR#$Fz%?WA~Z<}yHxZ4!$rt2-4jjJS^b&$Z_x3}QDw`?`(GuyAqUIw*E`QhT;^&{!E%U}_%=vTN*jIX-BgE&n_wKONIc>+R)G1j% z<}SX#ElB+{8Rmmp$WOJk@~eG5l*~H_nBC8ZZ!;kpjMXsBt|QwPiBo3QGznU4qHX}t z5iM;<%q2+rO87ejH%;qvZ23k|5V!^B!Se@orq!es&PBbUDsr5Sy@xHtgt>T9V;XZJ zpaOw7(T{`Tu#PkPE;>ebb>?o#PG7q8IJ=u~I2N47Pc9)HQ)&EWA?CslQ+qw|mFiWj z6hjUW$^v4_8+ud?U#1FE%3+wkhLhg4>d$*tfcK}Cl?a?aPUbdUDHU8FUD|J*rD-*w z7pc2fo843Ne7Dc*mYYjVy(0+N-F33k3p3-k<6Z-dc5xl{FXp;@MQ_I}N3e#ETqdRjQb)p!O;HDRnJJVCz95;RC{&+`2^_R)!Cpmrc?|M&mS@m<2SCc! zrsz;DBqpKjs+1)(?br6nb!;V$UT$V00|Z952y$50fw^U9W|z6EFc(E^#D24&l7C9l zjLt|!rB5-WPo7$#COsuQHu#hrVfOO%ZuW7(t4?V}&)Vx>sICQrcqm#)Tr9r(oMV&a zIudTUiqs_8%j)L>mwr8d>mhyHtPDok5xUgy=j);K_m7LlPaSZf_#xqab(o~R36=#K zt^75&cV<#Z(|Hs9o57V4@(Qf3Z-8Gj)RvZQbk`iZ@h`irP)~6sW@7 z*>)9+*zb_A193d<2WsWN>sZ^#lMrqi6zg+`s|^*6@ulf>-lJS<0vAqzKft=AH9k9a ztff^{j4Sh3Ubw7(q4#`^^d7z{^|bZi>3!9AeYBEu7Knp7$jMMj_b@7vM~}hz-U?mV zlB~oI;N|^KOY^c{YUbAjUJ;3p)rL>u_;u2T1L=V88Ff#!NwoRqL5rM^c=Tgf=H~36 zgUWA~K7|*akV~`*D_%Y-d*SgcKKfQv8#}93_7ZQ%EFpe)JXus!t z$ROpO(@brcBwH;iJOZd`Zl=*xHFv(7Bl9@- zJGk`_$bl1H&Ff@|6C*NLSUowAOwVO)yDI7rJ(Jz&&$7G<8_f{+Rx( zx%ZA~_M>(!K{FnGvqQKmNB}>gy{JSO8?Yopk7E;pnvRFM3U27z6nKw^n#=Chfo*3; z!e6CaI2egQaZzSrQE>_C`&3b?xqvm@I&AdBZ@MKh*{*6-qi6I^deVv6Q8KTtt@5z3 zJ||7|NVPWh$3-_OaO{*;Vu}nsHLyjY%hne=c;>)@-fx}1VC`?f5m425Ga%t=sY|9AVQ4cb-jQ3`Z zFG74DaJfq1al`O2lI`I5kmlg1fL}}9&ZybegTBc^sxm?w3-w*LCBzLUg@I4;3Zx{C zdABDh=q4T>(Z3#unq_(0`MGx63YT^*Hmb#fcw<35G6(@Oh*yvvO0?g$vH7&)@Wo(C zTEA~A8X?+%7Z90AUQQWrx0#%>dEo?6r-C_HaB;y@IYHZ|VEyCR69KVW)%JywEsx^N zwa5k#R~E|E7oxpC6pBlhO+0aoaip!BP8>RM{~O~C@1%DogVvJxn>5*3b-dHQJ1ej~ zJFZ)GpDJNZ$KYu+Yv4yw+RlN4%sU6+$4;V#xzTIM+oqtF0O5L`z7&rclQ75dE>xf{ zB&c*oKoF5NRdmp+dmNu2FL>gxRP($q%q|wJgqU@=hW>DY)>REyV#m}35e-9y4^qj8 z^rGn%^Ra`BfqyQ&r}7h8L?{W zF(*2m%3M$B&vdnWyqHY9H!`*8sGg#Sm7)OZkNnG0@%@vFFi#t>$`<{XOsYIr${q-M zZ&t~w&N*Ni8dL7dT@vl~IIyzNO>zl-rd>dGA_(+1 zl0CjX(R;k$J+*KeU~tCzLEhH|7;3Js4QwI^b7xj@OifyBq*%mLd08nR?Qg_Vm+06E zT3z4uY7yVYHk*5{_FT($vi0=6xp%^Sv^xB{W~y@;^n6RQi(%TxDYpbN=upg;j#f`j z2SXJ$9EVv+E*?nASb}0XU5v!jiyT-)os=zi5b#J4_IqZ5g>dLY+ZodqSf~XV(tn-v zxJ55*h^+tpg!$w`HOs?PDi`~AA#)v$B7;msZ=Vk4cprGuVgt^R`ut-eEKWCjsT{7w z1SJ4Exjm&&xzJN}^sUCecjsZE`>x+S^u`;&{YT`6fr|F&$HMVkv~Z((YdG`M%MS|5 zqITS2W56HlOT)U(u5RG;a5qYeN3TYr0V&CHKWDbxjY5(sv4FWU5)|1qZWdgrjx>yQ z0fpP$bfe4aD!OBnNMvx)gGv`&3;Gznlq=B^pX3LqdSnegl#CrV-bm2FTBNL}*sjb< zXC_TpXK>YFUhQHNlVxD%45$f1J-)x&`nU{1Ez2puz4`$3E`HUvXzkl1t-$XO zfYqc9cG$EQC7;lRj+8B{9=)Ams?03S5&$>Tg_vN$mP8nZk>DvdEyO!y2{Ayzo7mN%_^Pp-M?Z&jQj{Rz=4!D4OcjTw>9CT^*V9=%yjwu;V7dSnP~;~;nFVL4 z3lZkP#=8kQ>IgzG&#gHCg)ISG6aOUyRP2XxrQWgY0(e`O3k%AJG=YkMQdYl&og!Pi zLiA92QgUqccUeT6WZ&vXby?4z`xT+S=bJq*BeK&)@(NQ2#Xu&4P$xXJr}N`T^>QzT ziXz>y#`-b&!vcI0wLJWI3lq+DR$5vo%!<8M1>8T-g!;2mtcnu)^xn~#ezK|0KgZLK z|NG=B$WLd7=`P!;2PZXC6U0WT+sgE-ook5J1ktYdvJszTn2po%;Q!E0bRY=tkubIy zDOQ(r=)RwDJOU&|N^If2kaFR9Y|v0@U%*B-GQSy7r%RP%1_HNa2?T_(0zz|HmL8F$ zi=f}@7EYQ9#%- zLz{ny^5?#!m2b;}d_xRsecr)|c9_^A`?qpX&e+r{s*i}2Bltx zXtFLx{I?<-d|J^FtmHE$n@T&E{pkfPfcp|i7SKJ==+LwQ7ps$D@qe}zM(8@a9;S={ z#LK@r2}1Nwe*UimVd(KeAR^?OD#E$2W^WVz#a)BY@{QKQ9g+_ITqCGh|Jf8PbW#_T z_XJ|xN;hXDPK1txZvCP&f#Ub*U4E^Ud9S1Im@cr#ha(=_hJ~f0o#u@-!I>n!eh$a1 z(^r6R-3?&iACJT@b1(qn#LIyvFEf9PJn{$Wki1Q>kQdcILMUf1XAmj)#N({X6!zr= zz|TmDEBNGw94?5_va$2Nd91O^vFF!MY8%8jB#=qFYGXjk&z~w*P*=A9ik#DQ<-xnK zQ}$B}``n}cf+O`CTU9gCa}Ki4H+oDZRF zad}uL%Gtp`GxI06xy&OY483!i)2T*8qZ{I>R~UgGlJ(#>o>-sSQmel+5l7x-`%H}XjN;~4HuC+p~o|{i% zCBU3A%|Yjat2qTu$HbA>{KrdFi2t#9maHB4B*1xC9HdF=2}Tw1gH=LY9Z1GVJBY@r zzZ=PxkhR|0_4OUs4u?^M<~LI8iZnu2hUzs(NC}d+c&40USaV+wvc=6pY!`NNLBwW#XvP6NH->>pacMbYHg^{eCj>vpF1-Qa#sC9WB2KbnZm@}Z zAH6T%j>+G?y4@{*Cw?!%*Bwhl1k;l@WYa3VP82QsXC-M(sH+bxIK^D?*%8% zj#raTXRpg*{I9i%J8vm`H!V46d69UllBwW(W^3oG{OQDrQ}4?tCD&DZJ~Y@dy1+O~ zP7gOiu!lskwY6VmHb?&rd4_F+bam;~=#ZM(@RFf)#jCcr!Yd}~Wa}Zt*BBh!6G zTHo~sOCJV3Rp>-;3&7-I4=?!q>h~UV)Nyv@p@np%)_^6q>M;)SwnwV^&JVVW6;w)a z9)GrPMb1~>FdQxCcC@xeRgIH2dkb!M4V!Nj_+Z=g8P5{=7gSHK(>LDs1l@|)S-C`; zc9iftniG6eR?k;dnxa;nlnyD&Or(*yKdS$rD7fYRitMYqVRv+t6^Blp$Yf;q*Z;1J zG#e0ZgK@EW=&UZf{28Ru16EY{0b(zeTQ#8j7DQ0yW3~0nhlq#mMvh)8#yThm_Q%P%p(qMD7!O*)B*s z(ZPR9x*|y_{uuJuu*OKrgk-IC>%^-~Bf3%%)gh+p!Jq{`r-wEKI48pb!t!NxxeZ7# zcj|z2=#`r4Dh?Pgeuc2*+upr3D99W%)o&lbUnnv=6Q(KgatwdNsJA-&#C55cuTH`# z3>v&O%iAuJDNk?iwU@>u_X7-F^n9sEwSID330`cVq@$N>xc|j z*G<3TQ#6i14hUYR0-vnqE#=eRm7+Z#$!DG_qXxsdyRGXA@3O2&T_9Y^kd5x|_4~n^ z6V8P)97k&(7YocS^n(hK$pF0!7EOxd(Tzb3aMavqsT9{^Fn{XL8?+twzNjy(vqx%wTX-m3B;osSZN!a ze%)JdxlMc>C~vVNdOPBwd&?@}%c_;Tj}~9Jjr)U3^-b5`Dfv`3^MH_m=l^kQLTdNk zfyia=c|-9tTufiEB-P}+&m_+a|Mt!lFOP8Z9H`V-ohAQSwgs*M%e&k!iT!}a-3Fw6 zALEmrT#`9Nlu&^J!HG}>;)kqFcH{Ps?>!D2%Bao^A&RmuP?B*%VvG~M+eYi%oMw_7 zSc5c~hkW$0H*r5T7YQ!i6Ja|cocpUr2U{nxu96ml2O>+ZzCieq@(Ak70>JUh9W4c) zqHA7~UZ#I{xr|MEoy!*Gy!E|Y!Gi?L1whSXJ-Uu5jElz1_IKaix0bL5A<1n2+Yh0vjP7) z++_{rB#v8bH6)$my8|yueXV6a1|pH5r#hwh-m;P;{r70U;sE2qtP~;Qr8O+I94<6V z;RI6=q30C?Dt^g_&;+UCh!YRmj>3w?$NebGNwiSUcTb|hlS_=)jg#` zy~+(3QvtHeWna>#9?qj6kOHMmg#51OlY(Z!XwJ**FwSCw@^M(dH={;H6kMlieJGGuaroLl+y=pwE#Bx z4M3a>+MC_me~+)T!1DR~CeIxAxkDs&t+v2YVWPGLKq-<559>6TByODeil!iH>@EJG z?98%#G32Z}SJ?3BSpHo+&o?5CDB1rN4@4*C{dC2fRK0O$k$!!16_T`;8#9#)JLPTw zhA)dt<%rcm%i8qBU`AP3@R+bgm)G&zjS!!+v_pT0_(F(5~Au9 zluG3~x=`5j-pW7Cp=HvNIv`co&!71=OWPex^xHB-Yd#O2 zUFI9J%tdj;{<9rftem{?v3A&+p-S3u4L&f=40CqdoFNp+; zp>dXzU}GeX2vK%cY22c98(R{!h)1~sps~Vy=pjjWCW%_XpDHO-QgL0zS9s02|DJ?# z1nJMl=^x{MFfAZg4uAs%vD4gr(##eKAifaU@kt8~2LHoHo$U(RZR`!+l zKO++geV;TGBo^3nlx6LDLt>E}L)OIFdCcg;FFmrTEq6Kg0Y{op<-0=bZY0dwns7Ur zo0$?*{0_KTHXrm7gkEoq7g^*w10}pZ(ZD>hmJ2Qgyf0;Hr{B`K0K8ec$`SW&HdXp~ z&nkZu6UI*X(`wT%DVfVv5;aDRi>a(l@?18o6#gMSznd^0Nd?CM){BEqDdJIDYh30m z3pp7R<#mhs8w+7he7u9F$@HafKs0{gG=70!(nV)_!+qbP5QTC2S@WW3Rd z-rO~J7|{Q=Mkm!}g!1uJnHr?7yS1L2O>;4Ocu16d^tbiq@fBv!kM&an>-KMoO2Pne z(OQQ>xzM|ta`)tf_=Ap#SMyoEb8+@N{%ljrAs|kf`t!Ak5QD}WSH-n_G|4h)eoK@K z!4A0_Q9AOT$#tH#@|X9_F6|AP7T$oJg~slgsmHFlFVZXv30ZeJGuK9sr@luT1YOMz zw9zZ%Zjrx52Am$QI13B(bO4MP9#%&)s9dSi&?=#8n}H5L&N=>jpWaeKJqx4N$d7z@ zE%L0~f%1XGDx2;07c~d+F}%)htZZ0-0SCQTc_UC+vgH4-`+A6rpoNsTkL_+ zVLZlx18_M2IuLW0*G%9$(1&{n)xx6{<5d2vu6hr;ybcACsL!^nvhQx@Zm_I>6Rufq zYEzg`glZ#IW#9PK#oZN3O;?lPdV0wG9y5nZWu>1{eDc|%MhXa*lB-j+D9PLoxK=;L$kg5o)D%|u zA{hc7+7?Dv&XUBNVG?B^+57aw`<@5(}|Bzem&V{5${z(hET%f6ssP50R= zGfi1PV;U&4EJzHsDZRm3yr~|U&A$gOXcKDekr~pd6-H+3BG1>KQNHFG5*oEbzEFRR zt~{cuFtVh4zd@N)7z8JLSRZHpE(3IkD^LHBnMkkhOs|W!eIu|J=2f^g6FU4A(!eKa zvIp7ripg0pIGi!t8#Gh2R##S8x_!YX4En6iqALo@^+V<=|IYKZd-eRUmJ7oNKflho zT|LyMB0T?jYP(_N>AfxvdZELs*FW$MmeN|{wQUW6_jO^AK(C=q<;azW{I&2kBei$* zt?9ef>yNFu?BAQXU$_HN-mbamTc;{GM(0a{9xJ`8K(X*w6zVs6v-7X6;~VpnV)Kg; zNd)^gl6~RSL?~wKZGgK{3i6_Z(OXjlT|V|yU0H<#y$Lk=fpVLgGV*pp?>*?ueN2$r zNZY9w6awou(KB~l`z{l~xF~bG?)ON`Un-ZZu8M~Tmo~{vB5>vs+WhZ`>c5iOe=E%c zzb}5CxC7uhBtF+r0C^E%=fc3xEAR}EWTxP+j{28vFJ7v)z?8(`j`!gy-tE~nd#dc@ z%WBBCO-Kxc^ATHmpanImz7lipfHZRlkJL_V{)ko%5LW)wAc@Pnhr1IFxG0AdiQthh z1KlKsTB_$=6*6#+;P;7WzO4RjMDm|$t>BZLuNNXYUWN(l%iHuc!Pfq~=x(0UU9L(Va(h65|~I;&OKHACP}Zajk0Z> z91lW_4)23sN-6-|HI(+W&Jo`k-Fasi{W+pdOHEVyc?hAF-HuMwxwCidnAYFSum9yo zOT7Q0k`SQx^%L&VIzVDi81z8nR-`nKW?ne2(Ukz`M@^G2ir)%9fXD#SjoswW(I&^5 zf2QxP<0=#q8qL0ZdqIkMHs7|hq7k?jb=dsi^N%+DEA1umF(wPq>Ob9V0(Px9AB;4| zB>cN42XAjje?ug+n|M7Cej6jAspUA6*8Iuy)ZmFb)-fu1+hnhpLzu*2#XatKxm=aO zh{ycz=R-n(s&>66``^f=S8d-u4}=1hE)iX#g%y>^Jxzu)CN@@@?84o(?4VtmdW>En zDWj#-|D%VnR<5aX;QQ>rKgx<1b*THM@-a|)%p~a*Fkx%)jye8Cs0e6N{&8wgCtU420{jpe z8yt=P8R!2J^MV;U6Ld`Jq4y%QFZ2fTE+zpLs=l04z7l~*#&aWh6x{p2vzVvd8y1Sp z2t+>k zs&^Rmz)1eTxA*=#)bXj@p_++DigZQ3*NW2Yq6K$4K5pFO9YmlD-Z~ytd)2)^?|I2lg@+{^hcN-lvK$@>I_KMu%VUlfQIMvgj#X#-)Ro(bf$T zfm`#f0=is6yo0lyS;x!wD?z3rH$RwYs5nWYbUvh93nq_Tw)uEFfJ5SQ$wO;>@h?mM z=g^0V|GMw-c}jA8Y~bM0^;c>yP>PL8Nis?_7g{87$$-3=pv4vouB}#gdw*~8fah|O z8-x^C$5f)->2Fsvv$qAd`m9B)Me) zW~~4VmGKK+FK42eGsb_HeBwE%fali@XQKi0X7LYbN!IrWt1{MZK-o1=8^Ve*9x9wx#}2 zKS7CYHl%Ncebs+lhR(M!3=4vuRJPAH-cWcdf-u1=Xp`*All+(d(U0=pk`^m5Wrm0@Y?=|iYVA>u_;18 zF)-G0rb;*Rn?Z~<*0D4(N%*qCpre#UhPYVajz?>`5T#M;-d^SW%uu?V)idQ&WZUth zx{YbO4fmEq3Hq1p+R0>L<7&HNolC!YLtX1#>fJj^K9{*QMtb|Xgl-(pr-oiJQpp;@ zyp*MoRUg|oj;7C>TYcX5-(Gr#t7h+8JX$|FgYb^j#%6+LJ&V(Bsur|zTYWfHO;O$I z*SR~NWNUR-EOJ=wX{udhllej(VyC)Gd&+_@#iI0C!=E1$o$(@9F1&tpvvcz`Z)TN$ zeBFG_^i75ET6Vs1($6@xsJgLRYCaPW^^CXY!_Pf8I<5b6#qRMj3)M4MukAf~@$kxj zB8_fuUH){n@m=wMWjFLI{-}&7LO2@hZfLaplF7z9L{|%sCK)Ct4vhv?=l-7Ic{mfe8FHm%f;^xz{-w$T{35aUp!?(?dQki#31 z+%c)F-f$zS*T-|m<;vo?CkPdp_Zws?b0LKtYXddO8WCg3^`TD{1M2NUyI5vQO%ci5 z8U?0S_4=$`)8laCj7nIwkqeK&lBM;!CdGF(UBQQY_g$a)S_JA|brWHbUrVfgm_+F@ z&r?*YewDvK(Eh}`NVX6wSR~g^Ep{pw?8%nZw(V||M(5LO+$eF9IPph?wpPz;;woB% zPcHx$1cLV?gSeG4=_AWc5V!3z&tEp@Bs>VB?0TQ#wGP)BqmJp8eRkaYwJT zAW*@^v(fBrqV}7jciDzD4Zi;wiwhkS#j>;3QWZWY=-O<@7Oxr=)fKImg!c)(cQ8xd zW|bPhxv5~Q;f@5J*q2P;&Wzkj$V?abA+%jrefwHN*`4j;&@9>rFd((SbnQHaFcPb9 z|ACRnr}kr=D+*0Z;$0ojN>+b;ij0pwxlk3TaO_n?WyviCX7Sw`f!bW|g9~-6L|cB! zwe`{E&Jd^2sDy$x=ZH5_PYfbs3$B&k8u(af>*;D`EcV^us9C8{@hdXEUi??3Mecxt zrTj)U|NpqV&!(pOhF$onBoN9<=slr_4$>`j2}Pw#H&g)u0TBTK6M84~jtRXfMVb@^ z1f;1TqJXG?fFP(83n0qFd7amN&pdnfC)k9~3xqMRM;|j%2Un?;jr?j~pllJX1?J8!7DjmO;L#7I$`J@-@>#wE zobG`PJn`p~yQ>Ma1OuI+>t)AMai{|Gl>Tui`_ zulX18!wTgm>H2Oai{v;Ue^X$T z_y}o?r$z?d;ec-t)ENfN-<9)=SZ!1t%9C;)v6YGO�V4MjiUts?U4l^-&ZH$|#%V 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

      ipy+;B~vauvgvX&XRdHO?T` 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

      YdR2uF)R+y{Oo-=+AhiX# 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

{children}; -}; +} diff --git a/x-pack/plugins/observability/public/components/app/empty_section/index.tsx b/x-pack/plugins/observability/public/components/app/empty_section/index.tsx index 4c830b2b2f094..5a2e64459358d 100644 --- a/x-pack/plugins/observability/public/components/app/empty_section/index.tsx +++ b/x-pack/plugins/observability/public/components/app/empty_section/index.tsx @@ -11,7 +11,7 @@ interface Props { section: ISection; } -export const EmptySection = ({ section }: Props) => { +export function EmptySection({ section }: Props) { return ( { } /> ); -}; +} diff --git a/x-pack/plugins/observability/public/components/app/header/index.tsx b/x-pack/plugins/observability/public/components/app/header/index.tsx index 531e6abf3d236..0e35fbb008bee 100644 --- a/x-pack/plugins/observability/public/components/app/header/index.tsx +++ b/x-pack/plugins/observability/public/components/app/header/index.tsx @@ -38,12 +38,12 @@ interface Props { showGiveFeedback?: boolean; } -export const Header = ({ +export function Header({ color, restrictWidth, showAddData = false, showGiveFeedback = false, -}: Props) => { +}: Props) { const { core } = usePluginContext(); return ( @@ -91,4 +91,4 @@ export const Header = ({ ); -}; +} diff --git a/x-pack/plugins/observability/public/components/app/ingest_manager_panel/index.tsx b/x-pack/plugins/observability/public/components/app/ingest_manager_panel/index.tsx index 41bcfa1da7fa1..1ab9f75632d9d 100644 --- a/x-pack/plugins/observability/public/components/app/ingest_manager_panel/index.tsx +++ b/x-pack/plugins/observability/public/components/app/ingest_manager_panel/index.tsx @@ -12,7 +12,7 @@ import { i18n } from '@kbn/i18n'; import { EuiText } from '@elastic/eui'; import { EuiLink } from '@elastic/eui'; -export const IngestManagerPanel = () => { +export function IngestManagerPanel() { return ( { ); -}; +} diff --git a/x-pack/plugins/observability/public/components/app/layout/with_header.tsx b/x-pack/plugins/observability/public/components/app/layout/with_header.tsx index 27b25f0056055..a77487e1244e6 100644 --- a/x-pack/plugins/observability/public/components/app/layout/with_header.tsx +++ b/x-pack/plugins/observability/public/components/app/layout/with_header.tsx @@ -32,23 +32,25 @@ interface Props { showGiveFeedback?: boolean; } -export const WithHeaderLayout = ({ +export function WithHeaderLayout({ headerColor, bodyColor, children, restrictWidth, showAddData, showGiveFeedback, -}: Props) => ( - -
- - {children} - - -); +}: Props) { + return ( + +
+ + {children} + + + ); +} diff --git a/x-pack/plugins/observability/public/components/app/news_feed/index.tsx b/x-pack/plugins/observability/public/components/app/news_feed/index.tsx index 2fbd6659bcb5a..625ae94c90aa2 100644 --- a/x-pack/plugins/observability/public/components/app/news_feed/index.tsx +++ b/x-pack/plugins/observability/public/components/app/news_feed/index.tsx @@ -23,7 +23,7 @@ interface Props { items: INewsItem[]; } -export const NewsFeed = ({ items }: Props) => { +export function NewsFeed({ items }: Props) { return ( // The news feed is manually added/edited, to prevent any errors caused by typos or missing fields, // wraps the component with EuiErrorBoundary to avoid breaking the entire page. @@ -46,11 +46,11 @@ export const NewsFeed = ({ items }: Props) => { ); -}; +} const limitString = (string: string, limit: number) => truncate(string, { length: limit }); -const NewsItem = ({ item }: { item: INewsItem }) => { +function NewsItem({ item }: { item: INewsItem }) { const theme = useContext(ThemeContext); return ( @@ -98,4 +98,4 @@ const NewsItem = ({ item }: { item: INewsItem }) => { ); -}; +} diff --git a/x-pack/plugins/observability/public/components/app/resources/index.tsx b/x-pack/plugins/observability/public/components/app/resources/index.tsx index 929802df3329b..47ac5f0f6d301 100644 --- a/x-pack/plugins/observability/public/components/app/resources/index.tsx +++ b/x-pack/plugins/observability/public/components/app/resources/index.tsx @@ -31,7 +31,7 @@ const resources = [ }, ]; -export const Resources = () => { +export function Resources() { return ( @@ -46,4 +46,4 @@ export const Resources = () => { ); -}; +} diff --git a/x-pack/plugins/observability/public/components/app/section/alerts/index.tsx b/x-pack/plugins/observability/public/components/app/section/alerts/index.tsx index c0dc67b3373b1..02e841ec50ee2 100644 --- a/x-pack/plugins/observability/public/components/app/section/alerts/index.tsx +++ b/x-pack/plugins/observability/public/components/app/section/alerts/index.tsx @@ -33,7 +33,7 @@ interface Props { alerts: Alert[]; } -export const AlertsSection = ({ alerts }: Props) => { +export function AlertsSection({ alerts }: Props) { const { core } = usePluginContext(); const [filter, setFilter] = useState(ALL_TYPES); @@ -130,4 +130,4 @@ export const AlertsSection = ({ alerts }: Props) => { ); -}; +} diff --git a/x-pack/plugins/observability/public/components/app/section/apm/index.tsx b/x-pack/plugins/observability/public/components/app/section/apm/index.tsx index dce80ed324456..a1d51ffda6afd 100644 --- a/x-pack/plugins/observability/public/components/app/section/apm/index.tsx +++ b/x-pack/plugins/observability/public/components/app/section/apm/index.tsx @@ -30,7 +30,7 @@ function formatTpm(value?: number) { return numeral(value).format('0.00a'); } -export const APMSection = ({ absoluteTime, relativeTime, bucketSize }: Props) => { +export function APMSection({ absoluteTime, relativeTime, bucketSize }: Props) { const theme = useContext(ThemeContext); const history = useHistory(); @@ -43,7 +43,7 @@ export const APMSection = ({ absoluteTime, relativeTime, bucketSize }: Props) => bucketSize, }); } - }, [start, end, bucketSize]); + }, [start, end, bucketSize, relativeTime]); const { appLink, stats, series } = data || {}; @@ -121,4 +121,4 @@ export const APMSection = ({ absoluteTime, relativeTime, bucketSize }: Props) => ); -}; +} diff --git a/x-pack/plugins/observability/public/components/app/section/error_panel/index.tsx b/x-pack/plugins/observability/public/components/app/section/error_panel/index.tsx index 8f0781b8f0269..2413580e90a07 100644 --- a/x-pack/plugins/observability/public/components/app/section/error_panel/index.tsx +++ b/x-pack/plugins/observability/public/components/app/section/error_panel/index.tsx @@ -7,7 +7,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; -export const ErrorPanel = () => { +export function ErrorPanel() { return ( @@ -19,4 +19,4 @@ export const ErrorPanel = () => { ); -}; +} diff --git a/x-pack/plugins/observability/public/components/app/section/index.tsx b/x-pack/plugins/observability/public/components/app/section/index.tsx index 9ba524259ea1c..6c6d107b714be 100644 --- a/x-pack/plugins/observability/public/components/app/section/index.tsx +++ b/x-pack/plugins/observability/public/components/app/section/index.tsx @@ -20,7 +20,7 @@ interface Props { appLink?: AppLink; } -export const SectionContainer = ({ title, appLink, children, hasError }: Props) => { +export function SectionContainer({ title, appLink, children, hasError }: Props) { const { core } = usePluginContext(); return ( ); -}; +} diff --git a/x-pack/plugins/observability/public/components/app/section/logs/index.tsx b/x-pack/plugins/observability/public/components/app/section/logs/index.tsx index 9b232ea33cbfb..aa1dc1640125e 100644 --- a/x-pack/plugins/observability/public/components/app/section/logs/index.tsx +++ b/x-pack/plugins/observability/public/components/app/section/logs/index.tsx @@ -45,7 +45,7 @@ function getColorPerItem(series?: LogsFetchDataResponse['series']) { return colorsPerItem; } -export const LogsSection = ({ absoluteTime, relativeTime, bucketSize }: Props) => { +export function LogsSection({ absoluteTime, relativeTime, bucketSize }: Props) { const history = useHistory(); const { start, end } = absoluteTime; @@ -57,7 +57,7 @@ export const LogsSection = ({ absoluteTime, relativeTime, bucketSize }: Props) = bucketSize, }); } - }, [start, end, bucketSize]); + }, [start, end, bucketSize, relativeTime]); const min = moment.utc(absoluteTime.start).valueOf(); const max = moment.utc(absoluteTime.end).valueOf(); @@ -160,4 +160,4 @@ export const LogsSection = ({ absoluteTime, relativeTime, bucketSize }: Props) = ); -}; +} diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/index.tsx b/x-pack/plugins/observability/public/components/app/section/metrics/index.tsx index 9e5fdadaf4e5f..8bce8205902fa 100644 --- a/x-pack/plugins/observability/public/components/app/section/metrics/index.tsx +++ b/x-pack/plugins/observability/public/components/app/section/metrics/index.tsx @@ -46,7 +46,7 @@ const StyledProgress = styled.div<{ color?: string }>` } `; -export const MetricsSection = ({ absoluteTime, relativeTime, bucketSize }: Props) => { +export function MetricsSection({ absoluteTime, relativeTime, bucketSize }: Props) { const theme = useContext(ThemeContext); const { start, end } = absoluteTime; @@ -58,7 +58,7 @@ export const MetricsSection = ({ absoluteTime, relativeTime, bucketSize }: Props bucketSize, }); } - }, [start, end, bucketSize]); + }, [start, end, bucketSize, relativeTime]); const isLoading = status === FETCH_STATUS.LOADING; @@ -162,9 +162,9 @@ export const MetricsSection = ({ absoluteTime, relativeTime, bucketSize }: Props ); -}; +} -const AreaChart = ({ +function AreaChart({ serie, isLoading, color, @@ -172,7 +172,7 @@ const AreaChart = ({ serie?: Series; isLoading: boolean; color: string; -}) => { +}) { const chartTheme = useChartTheme(); return ( @@ -191,4 +191,4 @@ const AreaChart = ({ )} ); -}; +} diff --git a/x-pack/plugins/observability/public/components/app/section/uptime/index.tsx b/x-pack/plugins/observability/public/components/app/section/uptime/index.tsx index 73a566460a593..cfb06af3224c7 100644 --- a/x-pack/plugins/observability/public/components/app/section/uptime/index.tsx +++ b/x-pack/plugins/observability/public/components/app/section/uptime/index.tsx @@ -35,7 +35,7 @@ interface Props { bucketSize?: string; } -export const UptimeSection = ({ absoluteTime, relativeTime, bucketSize }: Props) => { +export function UptimeSection({ absoluteTime, relativeTime, bucketSize }: Props) { const theme = useContext(ThemeContext); const history = useHistory(); @@ -48,7 +48,7 @@ export const UptimeSection = ({ absoluteTime, relativeTime, bucketSize }: Props) bucketSize, }); } - }, [start, end, bucketSize]); + }, [start, end, bucketSize, relativeTime]); const min = moment.utc(absoluteTime.start).valueOf(); const max = moment.utc(absoluteTime.end).valueOf(); @@ -138,9 +138,9 @@ export const UptimeSection = ({ absoluteTime, relativeTime, bucketSize }: Props) ); -}; +} -const UptimeBarSeries = ({ +function UptimeBarSeries({ id, label, series, @@ -152,7 +152,7 @@ const UptimeBarSeries = ({ series?: Series; color: string; ticktFormatter: TickFormatter; -}) => { +}) { if (!series) { return null; } @@ -188,4 +188,4 @@ const UptimeBarSeries = ({ /> ); -}; +} diff --git a/x-pack/plugins/observability/public/components/app/styled_stat/index.tsx b/x-pack/plugins/observability/public/components/app/styled_stat/index.tsx index fe38df6484c29..a58a0c8309723 100644 --- a/x-pack/plugins/observability/public/components/app/styled_stat/index.tsx +++ b/x-pack/plugins/observability/public/components/app/styled_stat/index.tsx @@ -21,7 +21,7 @@ interface Props extends Partial { const EMPTY_VALUE = '--'; -export const StyledStat = (props: Props) => { +export function StyledStat(props: Props) { const { description = EMPTY_VALUE, title = EMPTY_VALUE, ...rest } = props; return ; -}; +} diff --git a/x-pack/plugins/observability/public/components/shared/action_menu/index.tsx b/x-pack/plugins/observability/public/components/shared/action_menu/index.tsx index ea79f4d08d701..55746ff6576a9 100644 --- a/x-pack/plugins/observability/public/components/shared/action_menu/index.tsx +++ b/x-pack/plugins/observability/public/components/shared/action_menu/index.tsx @@ -14,37 +14,45 @@ import { EuiPopoverProps, } from '@elastic/eui'; -import React, { HTMLAttributes } from 'react'; +import React, { HTMLAttributes, ReactNode } from 'react'; import { EuiListGroupItemProps } from '@elastic/eui/src/components/list_group/list_group_item'; import styled from 'styled-components'; type Props = EuiPopoverProps & HTMLAttributes; -export const SectionTitle: React.FC<{}> = (props) => ( - <> - -
{props.children}
-
- - -); - -export const SectionSubtitle: React.FC<{}> = (props) => ( - <> - - {props.children} - - - -); - -export const SectionLinks: React.FC<{}> = (props) => ( - - {props.children} - -); - -export const SectionSpacer: React.FC<{}> = () => ; +export function SectionTitle({ children }: { children?: ReactNode }) { + return ( + <> + +
{children}
+
+ + + ); +} + +export function SectionSubtitle({ children }: { children?: ReactNode }) { + return ( + <> + + {children} + + + + ); +} + +export function SectionLinks({ children }: { children?: ReactNode }) { + return ( + + {children} + + ); +} + +export function SectionSpacer() { + return ; +} export const Section = styled.div` margin-bottom: 24px; @@ -54,10 +62,14 @@ export const Section = styled.div` `; export type SectionLinkProps = EuiListGroupItemProps; -export const SectionLink: React.FC = (props) => ( - -); +export function SectionLink(props: SectionLinkProps) { + return ; +} -export const ActionMenuDivider: React.FC<{}> = (props) => ; +export function ActionMenuDivider() { + return ; +} -export const ActionMenu: React.FC = (props) => ; +export function ActionMenu(props: Props) { + return ; +} diff --git a/x-pack/plugins/observability/public/components/shared/data_picker/index.tsx b/x-pack/plugins/observability/public/components/shared/data_picker/index.tsx index cc77c1ed72b4a..1c4f465a1d301 100644 --- a/x-pack/plugins/observability/public/components/shared/data_picker/index.tsx +++ b/x-pack/plugins/observability/public/components/shared/data_picker/index.tsx @@ -31,7 +31,7 @@ interface Props { refreshInterval: number; } -export const DatePicker = ({ rangeFrom, rangeTo, refreshPaused, refreshInterval }: Props) => { +export function DatePicker({ rangeFrom, rangeTo, refreshPaused, refreshInterval }: Props) { const location = useLocation(); const history = useHistory(); @@ -86,4 +86,4 @@ export const DatePicker = ({ rangeFrom, rangeTo, refreshPaused, refreshInterval onRefresh={onTimeChange} /> ); -}; +} diff --git a/x-pack/plugins/observability/public/pages/home/index.tsx b/x-pack/plugins/observability/public/pages/home/index.tsx index 59513fc047f17..349533346f2ad 100644 --- a/x-pack/plugins/observability/public/pages/home/index.tsx +++ b/x-pack/plugins/observability/public/pages/home/index.tsx @@ -8,7 +8,7 @@ import { useHistory } from 'react-router-dom'; import { fetchHasData } from '../../data_handler'; import { useFetcher } from '../../hooks/use_fetcher'; -export const HomePage = () => { +export function HomePage() { const history = useHistory(); const { data = {} } = useFetcher(() => fetchHasData(), []); @@ -23,4 +23,4 @@ export const HomePage = () => { } return <>; -}; +} diff --git a/x-pack/plugins/observability/public/pages/landing/index.tsx b/x-pack/plugins/observability/public/pages/landing/index.tsx index 81485953f8713..4d8bd4bf2c789 100644 --- a/x-pack/plugins/observability/public/pages/landing/index.tsx +++ b/x-pack/plugins/observability/public/pages/landing/index.tsx @@ -27,7 +27,7 @@ const EuiCardWithoutPadding = styled(EuiCard)` padding: 0; `; -export const LandingPage = () => { +export function LandingPage() { const { core } = usePluginContext(); const theme = useContext(ThemeContext); @@ -124,4 +124,4 @@ export const LandingPage = () => { ); -}; +} diff --git a/x-pack/plugins/observability/public/pages/overview/index.tsx b/x-pack/plugins/observability/public/pages/overview/index.tsx index 088fab032d930..32bdb00577bd2 100644 --- a/x-pack/plugins/observability/public/pages/overview/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/index.tsx @@ -38,14 +38,14 @@ function calculatetBucketSize({ start, end }: { start?: number; end?: number }) } } -export const OverviewPage = ({ routeParams }: Props) => { +export function OverviewPage({ routeParams }: Props) { const { core } = usePluginContext(); const { data: alerts = [], status: alertStatus } = useFetcher(() => { return getObservabilityAlerts({ core }); - }, []); + }, [core]); - const { data: newsFeed } = useFetcher(() => getNewsFeed({ core }), []); + const { data: newsFeed } = useFetcher(() => getNewsFeed({ core }), [core]); const theme = useContext(ThemeContext); const timePickerTime = useKibanaUISettings(UI_SETTINGS.TIMEPICKER_TIME_DEFAULTS); @@ -206,4 +206,4 @@ export const OverviewPage = ({ routeParams }: Props) => { ); -}; +} diff --git a/x-pack/plugins/observability/public/pages/overview/loading_observability.tsx b/x-pack/plugins/observability/public/pages/overview/loading_observability.tsx index 90e3104443e6b..0f4fa9b864744 100644 --- a/x-pack/plugins/observability/public/pages/overview/loading_observability.tsx +++ b/x-pack/plugins/observability/public/pages/overview/loading_observability.tsx @@ -20,7 +20,7 @@ const CentralizedFlexGroup = styled(EuiFlexGroup)` min-height: calc(100vh - ${(props) => props.theme.eui.euiHeaderChildSize}); `; -export const LoadingObservability = () => { +export function LoadingObservability() { const theme = useContext(ThemeContext); return ( @@ -50,4 +50,4 @@ export const LoadingObservability = () => { ); -}; +} diff --git a/x-pack/plugins/observability/public/typings/eui_styled_components.tsx b/x-pack/plugins/observability/public/typings/eui_styled_components.tsx index aab16f9d79c4b..9e547b58bc736 100644 --- a/x-pack/plugins/observability/public/typings/eui_styled_components.tsx +++ b/x-pack/plugins/observability/public/typings/eui_styled_components.tsx @@ -16,23 +16,25 @@ export interface EuiTheme { darkMode: boolean; } -const EuiThemeProvider = < +function EuiThemeProvider< OuterTheme extends styledComponents.DefaultTheme = styledComponents.DefaultTheme >({ darkMode = false, ...otherProps }: Omit, 'theme'> & { darkMode?: boolean; -}) => ( - ({ - ...outerTheme, - eui: darkMode ? euiDarkVars : euiLightVars, - darkMode, - })} - /> -); +}) { + return ( + ({ + ...outerTheme, + eui: darkMode ? euiDarkVars : euiLightVars, + darkMode, + })} + /> + ); +} const { default: euiStyled, diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/mitre/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/mitre/index.tsx index e898a362c7771..71734affd42ce 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/mitre/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/mitre/index.tsx @@ -35,7 +35,7 @@ const MyEuiSuperSelect = styled(EuiSuperSelect)` `; interface AddItemProps { field: FieldHook; - dataTestSubj: string; + dataTestSubj: string; // eslint-disable-line react/no-unused-prop-types idAria: string; isDisabled: boolean; } diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.tsx index fd75c229d479d..49fe3438664c6 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.tsx @@ -22,6 +22,7 @@ interface TagsFilterPopoverProps { selectedTags: string[]; tags: string[]; onSelectedTagsChanged: Dispatch>; + // eslint-disable-next-line react/no-unused-prop-types isLoading: boolean; // TO DO reimplement? } diff --git a/yarn.lock b/yarn.lock index 1bb8fab0372ae..fd6019750dda5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7557,6 +7557,15 @@ array-includes@^3.0.3: define-properties "^1.1.2" es-abstract "^1.7.0" +array-includes@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + array-initial@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795" @@ -7643,6 +7652,15 @@ array.prototype.flatmap@^1.2.1: es-abstract "^1.10.0" function-bind "^1.1.1" +array.prototype.flatmap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" + integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + arraybuffer.slice@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" @@ -13369,39 +13387,39 @@ es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.13.0, es-abstract@^1.14 string.prototype.trimleft "^2.1.1" string.prototype.trimright "^2.1.1" -es-abstract@^1.15.0, es-abstract@^1.17.0-next.1: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== +es-abstract@^1.17.0, es-abstract@^1.17.4, es-abstract@^1.17.5: + version "1.17.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" + integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" + is-callable "^1.2.0" + is-regex "^1.1.0" object-inspect "^1.7.0" object-keys "^1.1.1" object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" -es-abstract@^1.17.4, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== +es-abstract@^1.17.0-next.1: + version "1.17.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" + integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" + is-callable "^1.1.5" + is-regex "^1.0.5" object-inspect "^1.7.0" object-keys "^1.1.1" object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" es-get-iterator@^1.1.0: version "1.1.0" @@ -13713,11 +13731,6 @@ eslint-plugin-es@^3.0.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-eslint-plugin@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-2.1.0.tgz#a7a00f15a886957d855feacaafee264f039e62d5" - integrity sha512-kT3A/ZJftt28gbl/Cv04qezb/NQ1dwYIbi8lyf806XMxkus7DvOVCLIfTXMrorp322Pnoez7+zabXH29tADIDg== - eslint-plugin-import@^2.19.1: version "2.19.1" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz#5654e10b7839d064dd0d46cd1b88ec2133a11448" @@ -13804,21 +13817,22 @@ eslint-plugin-react-perf@^3.2.3: resolved "https://registry.yarnpkg.com/eslint-plugin-react-perf/-/eslint-plugin-react-perf-3.2.3.tgz#e28d42d3a1f7ec3c8976a94735d8e17e7d652a45" integrity sha512-bMiPt7uywwS1Ly25n752NE3Ei0XBZ3igplTkZ8GPJKyZVVUd3cHgzILGeQW2HIeAkzQ9zwk9HM6EcYDipdFk3Q== -eslint-plugin-react@^7.17.0: - version "7.17.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.17.0.tgz#a31b3e134b76046abe3cd278e7482bd35a1d12d7" - integrity sha512-ODB7yg6lxhBVMeiH1c7E95FLD4E/TwmFjltiU+ethv7KPdCwgiFuOZg9zNRHyufStTDLl/dEFqI2Q1VPmCd78A== +eslint-plugin-react@^7.20.3: + version "7.20.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.3.tgz#0590525e7eb83890ce71f73c2cf836284ad8c2f1" + integrity sha512-txbo090buDeyV0ugF3YMWrzLIUqpYTsWSDZV9xLSmExE1P/Kmgg9++PD931r+KEWS66O1c9R4srLVVHmeHpoAg== dependencies: - array-includes "^3.0.3" + array-includes "^3.1.1" + array.prototype.flatmap "^1.2.3" doctrine "^2.1.0" - eslint-plugin-eslint-plugin "^2.1.0" has "^1.0.3" - jsx-ast-utils "^2.2.3" - object.entries "^1.1.0" - object.fromentries "^2.0.1" - object.values "^1.1.0" + jsx-ast-utils "^2.4.1" + object.entries "^1.1.2" + object.fromentries "^2.0.2" + object.values "^1.1.1" prop-types "^15.7.2" - resolve "^1.13.1" + resolve "^1.17.0" + string.prototype.matchall "^4.0.2" eslint-rule-composer@^0.3.0: version "0.3.0" @@ -18059,6 +18073,15 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + interpret@1.2.0, interpret@^1.0.0, interpret@^1.1.0, interpret@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" @@ -20100,12 +20123,12 @@ jsx-ast-utils@^2.2.1: array-includes "^3.0.3" object.assign "^4.1.0" -jsx-ast-utils@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz#8a9364e402448a3ce7f14d357738310d9248054f" - integrity sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA== +jsx-ast-utils@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e" + integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w== dependencies: - array-includes "^3.0.3" + array-includes "^3.1.1" object.assign "^4.1.0" jsx-to-string@^1.4.0: @@ -23352,6 +23375,15 @@ object.entries@^1.0.4, object.entries@^1.1.0, object.entries@^1.1.1: function-bind "^1.1.1" has "^1.0.3" +object.entries@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" + integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + has "^1.0.3" + object.fromentries@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-1.0.0.tgz#e90ec27445ec6e37f48be9af9077d9aa8bef0d40" @@ -23362,16 +23394,6 @@ object.fromentries@^1.0.0: function-bind "^1.1.1" has "^1.0.1" -object.fromentries@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.1.tgz#050f077855c7af8ae6649f45c80b16ee2d31e704" - integrity sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.15.0" - function-bind "^1.1.1" - has "^1.0.3" - object.fromentries@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" @@ -27505,7 +27527,7 @@ resolve@1.8.1: dependencies: path-parse "^1.0.5" -resolve@^1.1.10, resolve@^1.1.5, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: +resolve@^1.1.10, resolve@^1.1.5, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.7.1, resolve@^1.8.1: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== @@ -29396,6 +29418,18 @@ string.prototype.matchall@^3.0.0: has-symbols "^1.0.0" regexp.prototype.flags "^1.2.0" +string.prototype.matchall@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + string.prototype.padend@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0" From 76150a4026c161fc4a264e83724c576917f2fb5f Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 27 Jul 2020 08:20:27 -0500 Subject: [PATCH 006/126] Observability i18n fixes (#72984) * Format `xpack.apm.percentOfParent` correctly so the transactions page in APM doesn't crash. In English it reads like, "(X% of transaction)". I'm not sure what the intention of the changed translation is, but I've changed it to be the equivalent of "(X% transaction)". A correction to the Japanese form here would be appreciated, but this fixes the crash and gets the message across. * Format `xpack.infra.logs.customizeLogs.textSizeRadioGroup` correctly. This was not causing the whole logs page to crash, but was causing an error in the JS console. --- x-pack/plugins/translations/translations/ja-JP.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index cf789d1e7c450..8baebbb4939be 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -4257,7 +4257,7 @@ "xpack.apm.metrics.transactionChart.transactionDurationLabel": "トランザクション時間", "xpack.apm.metrics.transactionChart.transactionsPerMinuteLabel": "1 分あたりのトランザクション数", "xpack.apm.notAvailableLabel": "N/A", - "xpack.apm.percentOfParent": "({parentType, select, transaction { 件中 {value} 件のトランザクション} トレース {trace} })", + "xpack.apm.percentOfParent": "({value} {parentType, select, transaction {トランザクション} trace {トレース} })", "xpack.apm.propertiesTable.agentFeature.noDataAvailableLabel": "利用可能なデータがありません", "xpack.apm.propertiesTable.agentFeature.noResultFound": "\"{value}\"に対する結果が見つかりませんでした。", "xpack.apm.propertiesTable.tabs.exceptionStacktraceLabel": "例外のスタックトレース", @@ -7430,7 +7430,7 @@ "xpack.infra.logs.customizeLogs.customizeButtonLabel": "カスタマイズ", "xpack.infra.logs.customizeLogs.lineWrappingFormRowLabel": "改行", "xpack.infra.logs.customizeLogs.textSizeFormRowLabel": "テキストサイズ", - "xpack.infra.logs.customizeLogs.textSizeRadioGroup": "{textScale, select, small {小さい} 中くらい {Medium} 大きい {Large} その他の {{textScale}} }", + "xpack.infra.logs.customizeLogs.textSizeRadioGroup": "{textScale, select, small {小さい} medium {中くらい} large {大きい} other {{textScale}}}", "xpack.infra.logs.customizeLogs.wrapLongLinesSwitchLabel": "長い行を改行", "xpack.infra.logs.emptyView.checkForNewDataButtonLabel": "新規データを確認", "xpack.infra.logs.emptyView.noLogMessageDescription": "フィルターを調整してみてください。", From bc65c5e160031e8e93e77e2bab72574ae7fefe9b Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Mon, 27 Jul 2020 16:40:02 +0300 Subject: [PATCH 007/126] [Security Solution][Cases] Create useAllCasesModal hook (#72602) --- .../cases/components/all_cases/index.test.tsx | 148 +++++++++++++++--- .../cases/components/all_cases/index.tsx | 93 +++++++---- .../components/all_cases_modal/index.tsx | 1 + .../all_cases_modal.test.tsx | 74 +++++++++ .../use_all_cases_modal/all_cases_modal.tsx | 47 ++++++ .../use_all_cases_modal/index.test.tsx | 143 +++++++++++++++++ .../components/use_all_cases_modal/index.tsx | 85 ++++++++++ .../use_all_cases_modal/translations.ts | 10 ++ .../common/lib/kibana/__mocks__/index.ts | 1 + .../components/graph_overlay/index.tsx | 48 ++---- .../components/timeline/properties/index.tsx | 46 +----- 11 files changed, 567 insertions(+), 129 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.test.tsx create mode 100644 x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx create mode 100644 x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx create mode 100644 x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/translations.ts diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx index 23cabd6778cc0..f5ed151ebac3c 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx @@ -14,6 +14,8 @@ import { TestProviders } from '../../../common/mock'; import { useGetCasesMockState } from '../../containers/mock'; import * as i18n from './translations'; +import { useKibana } from '../../../common/lib/kibana'; +import { createUseKibanaMock } from '../../../common/mock/kibana_react'; import { getEmptyTagValue } from '../../../common/components/empty_value'; import { useDeleteCases } from '../../containers/use_delete_cases'; import { useGetCases } from '../../containers/use_get_cases'; @@ -26,6 +28,7 @@ jest.mock('../../containers/use_delete_cases'); jest.mock('../../containers/use_get_cases'); jest.mock('../../containers/use_get_cases_status'); +const useKibanaMock = useKibana as jest.Mock; const useDeleteCasesMock = useDeleteCases as jest.Mock; const useGetCasesMock = useGetCases as jest.Mock; const useGetCasesStatusMock = useGetCasesStatus as jest.Mock; @@ -33,6 +36,8 @@ const useUpdateCasesMock = useUpdateCases as jest.Mock; jest.mock('../../../common/components/link_to'); +jest.mock('../../../common/lib/kibana'); + describe('AllCases', () => { const dispatchResetIsDeleted = jest.fn(); const dispatchResetIsUpdated = jest.fn(); @@ -45,6 +50,7 @@ describe('AllCases', () => { const setSelectedCases = jest.fn(); const updateBulkStatus = jest.fn(); const fetchCasesStatus = jest.fn(); + const onRowClick = jest.fn(); const emptyTag = getEmptyTagValue().props.children; const defaultGetCases = { @@ -77,6 +83,9 @@ describe('AllCases', () => { dispatchResetIsUpdated, updateBulkStatus, }; + + let navigateToApp: jest.Mock; + /* eslint-disable no-console */ // Silence until enzyme fixed to use ReactTestUtils.act() const originalError = console.error; @@ -89,10 +98,20 @@ describe('AllCases', () => { /* eslint-enable no-console */ beforeEach(() => { jest.resetAllMocks(); - useUpdateCasesMock.mockImplementation(() => defaultUpdateCases); - useGetCasesMock.mockImplementation(() => defaultGetCases); - useDeleteCasesMock.mockImplementation(() => defaultDeleteCases); - useGetCasesStatusMock.mockImplementation(() => defaultCasesStatus); + navigateToApp = jest.fn(); + const kibanaMock = createUseKibanaMock()(); + useKibanaMock.mockReturnValue({ + ...kibanaMock, + services: { + application: { + navigateToApp, + }, + }, + }); + useUpdateCasesMock.mockReturnValue(defaultUpdateCases); + useGetCasesMock.mockReturnValue(defaultGetCases); + useDeleteCasesMock.mockReturnValue(defaultDeleteCases); + useGetCasesStatusMock.mockReturnValue(defaultCasesStatus); moment.tz.setDefault('UTC'); }); it('should render AllCases', () => { @@ -125,7 +144,7 @@ describe('AllCases', () => { ); }); it('should render empty fields', () => { - useGetCasesMock.mockImplementation(() => ({ + useGetCasesMock.mockReturnValue({ ...defaultGetCases, data: { ...defaultGetCases.data, @@ -141,7 +160,7 @@ describe('AllCases', () => { }, ], }, - })); + }); const wrapper = mount( @@ -202,10 +221,10 @@ describe('AllCases', () => { }); }); it('opens case when row action icon clicked', () => { - useGetCasesMock.mockImplementation(() => ({ + useGetCasesMock.mockReturnValue({ ...defaultGetCases, filterOptions: { ...defaultGetCases.filterOptions, status: 'closed' }, - })); + }); const wrapper = mount( @@ -223,10 +242,11 @@ describe('AllCases', () => { }); }); it('Bulk delete', () => { - useGetCasesMock.mockImplementation(() => ({ + useGetCasesMock.mockReturnValue({ ...defaultGetCases, selectedCases: useGetCasesMockState.data.cases, - })); + }); + useDeleteCasesMock .mockReturnValueOnce({ ...defaultDeleteCases, @@ -257,10 +277,10 @@ describe('AllCases', () => { ); }); it('Bulk close status update', () => { - useGetCasesMock.mockImplementation(() => ({ + useGetCasesMock.mockReturnValue({ ...defaultGetCases, selectedCases: useGetCasesMockState.data.cases, - })); + }); const wrapper = mount( @@ -272,14 +292,14 @@ describe('AllCases', () => { expect(updateBulkStatus).toBeCalledWith(useGetCasesMockState.data.cases, 'closed'); }); it('Bulk open status update', () => { - useGetCasesMock.mockImplementation(() => ({ + useGetCasesMock.mockReturnValue({ ...defaultGetCases, selectedCases: useGetCasesMockState.data.cases, filterOptions: { ...defaultGetCases.filterOptions, status: 'closed', }, - })); + }); const wrapper = mount( @@ -291,10 +311,10 @@ describe('AllCases', () => { expect(updateBulkStatus).toBeCalledWith(useGetCasesMockState.data.cases, 'open'); }); it('isDeleted is true, refetch', () => { - useDeleteCasesMock.mockImplementation(() => ({ + useDeleteCasesMock.mockReturnValue({ ...defaultDeleteCases, isDeleted: true, - })); + }); mount( @@ -306,10 +326,10 @@ describe('AllCases', () => { expect(dispatchResetIsDeleted).toBeCalled(); }); it('isUpdated is true, refetch', () => { - useUpdateCasesMock.mockImplementation(() => ({ + useUpdateCasesMock.mockReturnValue({ ...defaultUpdateCases, isUpdated: true, - })); + }); mount( @@ -320,4 +340,96 @@ describe('AllCases', () => { expect(fetchCasesStatus).toBeCalled(); expect(dispatchResetIsUpdated).toBeCalled(); }); + + it('should not render header when modal=true', () => { + const wrapper = mount( + + + + ); + + expect(wrapper.find('[data-test-subj="all-cases-header"]').exists()).toBe(false); + }); + + it('should not render table utility bar when modal=true', () => { + const wrapper = mount( + + + + ); + + expect(wrapper.find('[data-test-subj="case-table-utility-bar-actions"]').exists()).toBe(false); + }); + + it('case table should not be selectable when modal=true', () => { + const wrapper = mount( + + + + ); + + expect(wrapper.find('[data-test-subj="cases-table"]').first().prop('isSelectable')).toBe(false); + }); + + it('should call onRowClick with no cases and modal=true', () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + data: { + ...defaultGetCases.data, + total: 0, + cases: [], + }, + }); + + const wrapper = mount( + + + + ); + + wrapper.find('[data-test-subj="cases-table-add-case"]').first().simulate('click'); + expect(onRowClick).toHaveBeenCalled(); + }); + + it('should call navigateToApp with no cases and modal=false', () => { + useGetCasesMock.mockReturnValue({ + ...defaultGetCases, + data: { + ...defaultGetCases.data, + total: 0, + cases: [], + }, + }); + + const wrapper = mount( + + + + ); + + wrapper.find('[data-test-subj="cases-table-add-case"]').first().simulate('click'); + expect(navigateToApp).toHaveBeenCalledWith('securitySolution:case', { path: '/create' }); + }); + + it('should call onRowClick when clicking a case with modal=true', () => { + const wrapper = mount( + + + + ); + + wrapper.find('[data-test-subj="cases-table-row-1"]').first().simulate('click'); + expect(onRowClick).toHaveBeenCalledWith('1'); + }); + + it('should NOT call onRowClick when clicking a case with modal=true', () => { + const wrapper = mount( + + + + ); + + wrapper.find('[data-test-subj="cases-table-row-1"]').first().simulate('click'); + expect(onRowClick).not.toHaveBeenCalled(); + }); }); diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx index f46dd9e858c7f..42a87de2aa07b 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable react-hooks/exhaustive-deps */ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { EuiBasicTable, @@ -16,7 +15,7 @@ import { EuiTableSortingType, } from '@elastic/eui'; import { EuiTableSelectionType } from '@elastic/eui/src/components/basic_table/table_types'; -import { isEmpty } from 'lodash/fp'; +import { isEmpty, memoize } from 'lodash/fp'; import styled, { css } from 'styled-components'; import * as i18n from './translations'; @@ -137,7 +136,7 @@ export const AllCases = React.memo( (refetchFilter: () => void) => { filterRefetch.current = refetchFilter; }, - [filterRefetch.current] + [filterRefetch] ); const refreshCases = useCallback( (dataRefresh = true) => { @@ -149,7 +148,7 @@ export const AllCases = React.memo( filterRefetch.current(); } }, - [filterOptions, queryParams, filterRefetch.current] + [filterRefetch, refetchCases, setSelectedCases, fetchCasesStatus] ); useEffect(() => { @@ -161,7 +160,7 @@ export const AllCases = React.memo( refreshCases(); dispatchResetIsUpdated(); } - }, [isDeleted, isUpdated]); + }, [isDeleted, isUpdated, refreshCases, dispatchResetIsDeleted, dispatchResetIsUpdated]); const confirmDeleteModal = useMemo( () => ( ( )} /> ), - [deleteBulk, deleteThisCase, isDisplayConfirmDeleteModal] + [ + deleteBulk, + deleteThisCase, + isDisplayConfirmDeleteModal, + handleToggleModal, + handleOnDeleteConfirm, + ] ); - const toggleDeleteModal = useCallback((deleteCase: Case) => { - handleToggleModal(); - setDeleteThisCase(deleteCase); - }, []); + const toggleDeleteModal = useCallback( + (deleteCase: Case) => { + handleToggleModal(); + setDeleteThisCase(deleteCase); + }, + [handleToggleModal] + ); const toggleBulkDeleteModal = useCallback( (caseIds: string[]) => { @@ -195,14 +203,14 @@ export const AllCases = React.memo( const convertToDeleteCases: DeleteCase[] = caseIds.map((id) => ({ id })); setDeleteBulk(convertToDeleteCases); }, - [selectedCases] + [selectedCases, setDeleteBulk, handleToggleModal] ); const handleUpdateCaseStatus = useCallback( (status: string) => { updateBulkStatus(selectedCases, status); }, - [selectedCases] + [selectedCases, updateBulkStatus] ); const selectedCaseIds = useMemo( @@ -223,7 +231,7 @@ export const AllCases = React.memo( })} /> ), - [selectedCaseIds, filterOptions.status, toggleBulkDeleteModal] + [selectedCaseIds, filterOptions.status, toggleBulkDeleteModal, handleUpdateCaseStatus] ); const handleDispatchUpdate = useCallback( (args: Omit) => { @@ -278,7 +286,7 @@ export const AllCases = React.memo( setQueryParams(newQueryParams); refreshCases(false); }, - [queryParams] + [queryParams, refreshCases, setQueryParams] ); const onFilterChangedCallback = useCallback( @@ -291,7 +299,7 @@ export const AllCases = React.memo( setFilters(newFilterOptions); refreshCases(false); }, - [filterOptions, queryParams] + [refreshCases, setQueryParams, setFilters] ); const memoizedGetCasesColumns = useMemo( @@ -311,9 +319,10 @@ export const AllCases = React.memo( const sorting: EuiTableSortingType = { sort: { field: queryParams.sortField, direction: queryParams.sortOrder }, }; + const euiBasicTableSelectionProps = useMemo>( () => ({ onSelectionChange: setSelectedCases }), - [selectedCases] + [setSelectedCases] ); const isCasesLoading = useMemo( () => loading.indexOf('cases') > -1 || loading.indexOf('caseUpdate') > -1, @@ -322,6 +331,35 @@ export const AllCases = React.memo( const isDataEmpty = useMemo(() => data.total === 0, [data]); const TableWrap = useMemo(() => (isModal ? 'span' : Panel), [isModal]); + + const onTableRowClick = useMemo( + () => + memoize<(id: string) => () => void>((id) => () => { + if (onRowClick) { + onRowClick(id); + } + }), + [onRowClick] + ); + + const tableRowProps = useCallback( + (item) => { + const rowProps = { + 'data-test-subj': `cases-table-row-${item.id}`, + }; + + if (isModal) { + return { + ...rowProps, + onClick: onTableRowClick(item.id), + }; + } + + return rowProps; + }, + [isModal, onTableRowClick] + ); + return ( <> {!isEmpty(actionsErrors) && ( @@ -329,7 +367,13 @@ export const AllCases = React.memo( )} {!isModal && ( - + ( {!isModal && ( - + {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} @@ -441,6 +485,7 @@ export const AllCases = React.memo( onClick={goToCreateCase} href={formatUrl(getCreateCaseUrl())} iconType="plusInCircle" + data-test-subj="cases-table-add-case" > {i18n.ADD_NEW_CASE} @@ -449,17 +494,7 @@ export const AllCases = React.memo( } onChange={tableOnChangeCallback} pagination={memoizedPagination} - rowProps={(item) => - isModal - ? { - onClick: () => { - if (onRowClick != null) { - onRowClick(item.id); - } - }, - } - : {} - } + rowProps={tableRowProps} selection={userCanCrud && !isModal ? euiBasicTableSelectionProps : undefined} sorting={sorting} /> diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx index d8f2e5293ee1b..efbe3e667c27b 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx @@ -12,6 +12,7 @@ import { EuiModalHeaderTitle, EuiOverlayMask, } from '@elastic/eui'; + import { useGetUserSavedObjectPermissions } from '../../../common/lib/kibana'; import { AllCases } from '../all_cases'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.test.tsx b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.test.tsx new file mode 100644 index 0000000000000..6039fec2464cc --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.test.tsx @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { mount } from 'enzyme'; +import React from 'react'; +import '../../../common/mock/match_media'; +import { AllCasesModal } from './all_cases_modal'; +import { TestProviders } from '../../../common/mock'; + +jest.mock('../all_cases', () => { + const AllCases = () => { + return <>; + }; + return { AllCases }; +}); + +jest.mock('../../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../../common/lib/kibana'); + return { + ...originalModule, + useGetUserSavedObjectPermissions: jest.fn(), + }; +}); + +const onCloseCaseModal = jest.fn(); +const onRowClick = jest.fn(); +const defaultProps = { + onCloseCaseModal, + onRowClick, +}; + +describe('AllCasesModal', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('renders', () => { + const wrapper = mount( + + + + ); + + expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeTruthy(); + }); + + it('Closing modal calls onCloseCaseModal', () => { + const wrapper = mount( + + + + ); + + wrapper.find('.euiModal__closeIcon').first().simulate('click'); + expect(onCloseCaseModal).toBeCalled(); + }); + + it('pass the correct props to AllCases component', () => { + const wrapper = mount( + + + + ); + + const props = wrapper.find('AllCases').props(); + expect(props).toEqual({ + userCanCrud: false, + onRowClick, + isModal: true, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx new file mode 100644 index 0000000000000..7a12f9211e969 --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/all_cases_modal.tsx @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { memo } from 'react'; +import { + EuiModal, + EuiModalBody, + EuiModalHeader, + EuiModalHeaderTitle, + EuiOverlayMask, +} from '@elastic/eui'; + +import { useGetUserSavedObjectPermissions } from '../../../common/lib/kibana'; +import { AllCases } from '../all_cases'; +import * as i18n from './translations'; + +export interface AllCasesModalProps { + onCloseCaseModal: () => void; + onRowClick: (id?: string) => void; +} + +const AllCasesModalComponent: React.FC = ({ + onCloseCaseModal, + onRowClick, +}: AllCasesModalProps) => { + const userPermissions = useGetUserSavedObjectPermissions(); + const userCanCrud = userPermissions?.crud ?? false; + return ( + + + + {i18n.SELECT_CASE_TITLE} + + + + + + + ); +}; + +export const AllCasesModal = memo(AllCasesModalComponent); + +AllCasesModal.displayName = 'AllCasesModal'; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.test.tsx new file mode 100644 index 0000000000000..b5bf68cbf6dc8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.test.tsx @@ -0,0 +1,143 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +/* eslint-disable react/display-name */ + +import React from 'react'; +import { renderHook, act } from '@testing-library/react-hooks'; + +import { useKibana } from '../../../common/lib/kibana'; +import '../../../common/mock/match_media'; +import { TimelineId } from '../../../../common/types/timeline'; +import { useAllCasesModal, UseAllCasesModalProps, UseAllCasesModalReturnedValues } from '.'; +import { TestProviders } from '../../../common/mock'; +import { createUseKibanaMock } from '../../../common/mock/kibana_react'; + +jest.mock('../../../common/lib/kibana'); + +const useKibanaMock = useKibana as jest.Mock; + +describe('useAllCasesModal', () => { + const navigateToApp = jest.fn(() => Promise.resolve()); + + beforeEach(() => { + jest.clearAllMocks(); + const kibanaMock = createUseKibanaMock()(); + useKibanaMock.mockImplementation(() => ({ + ...kibanaMock, + services: { + application: { + navigateToApp, + }, + }, + })); + }); + + it('init', async () => { + const { result } = renderHook( + () => useAllCasesModal({ timelineId: TimelineId.test }), + { + wrapper: ({ children }) => {children}, + } + ); + + expect(result.current.showModal).toBe(false); + }); + + it('opens the modal', async () => { + const { result } = renderHook( + () => useAllCasesModal({ timelineId: TimelineId.test }), + { + wrapper: ({ children }) => {children}, + } + ); + + act(() => { + result.current.onOpenModal(); + }); + + expect(result.current.showModal).toBe(true); + }); + + it('closes the modal', async () => { + const { result } = renderHook( + () => useAllCasesModal({ timelineId: TimelineId.test }), + { + wrapper: ({ children }) => {children}, + } + ); + + act(() => { + result.current.onOpenModal(); + result.current.onCloseModal(); + }); + + expect(result.current.showModal).toBe(false); + }); + + it('returns a memoized value', async () => { + const { result, rerender } = renderHook( + () => useAllCasesModal({ timelineId: TimelineId.test }), + { + wrapper: ({ children }) => {children}, + } + ); + + const result1 = result.current; + act(() => rerender()); + const result2 = result.current; + + expect(result1).toBe(result2); + }); + + it('closes the modal when clicking a row', async () => { + const { result } = renderHook( + () => useAllCasesModal({ timelineId: TimelineId.test }), + { + wrapper: ({ children }) => {children}, + } + ); + + act(() => { + result.current.onOpenModal(); + result.current.onRowClick(); + }); + + expect(result.current.showModal).toBe(false); + }); + + it('navigates to the correct path without id', async () => { + const { result } = renderHook( + () => useAllCasesModal({ timelineId: TimelineId.test }), + { + wrapper: ({ children }) => {children}, + } + ); + + act(() => { + result.current.onOpenModal(); + result.current.onRowClick(); + }); + + expect(navigateToApp).toHaveBeenCalledWith('securitySolution:case', { path: '/create' }); + }); + + it('navigates to the correct path with id', async () => { + const { result } = renderHook( + () => useAllCasesModal({ timelineId: TimelineId.test }), + { + wrapper: ({ children }) => {children}, + } + ); + + act(() => { + result.current.onOpenModal(); + result.current.onRowClick('case-id'); + }); + + expect(navigateToApp).toHaveBeenCalledWith('securitySolution:case', { path: '/case-id' }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx new file mode 100644 index 0000000000000..f7fc7963b3844 --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/index.tsx @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState, useCallback, useMemo } from 'react'; + +import { useDispatch, useSelector } from 'react-redux'; +import { APP_ID } from '../../../../common/constants'; +import { SecurityPageName } from '../../../app/types'; +import { useKibana } from '../../../common/lib/kibana'; +import { getCaseDetailsUrl, getCreateCaseUrl } from '../../../common/components/link_to'; +import { State } from '../../../common/store'; +import { setInsertTimeline } from '../../../timelines/store/timeline/actions'; +import { timelineSelectors } from '../../../timelines/store/timeline'; + +import { AllCasesModal } from './all_cases_modal'; + +export interface UseAllCasesModalProps { + timelineId: string; +} + +export interface UseAllCasesModalReturnedValues { + Modal: React.FC; + showModal: boolean; + onCloseModal: () => void; + onOpenModal: () => void; + onRowClick: (id?: string) => void; +} + +export const useAllCasesModal = ({ + timelineId, +}: UseAllCasesModalProps): UseAllCasesModalReturnedValues => { + const dispatch = useDispatch(); + const { navigateToApp } = useKibana().services.application; + const timeline = useSelector((state: State) => + timelineSelectors.selectTimeline(state, timelineId) + ); + + const [showModal, setShowModal] = useState(false); + const onCloseModal = useCallback(() => setShowModal(false), []); + const onOpenModal = useCallback(() => setShowModal(true), []); + + const onRowClick = useCallback( + async (id?: string) => { + onCloseModal(); + + await navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { + path: id != null ? getCaseDetailsUrl({ id }) : getCreateCaseUrl(), + }); + + dispatch( + setInsertTimeline({ + graphEventId: timeline.graphEventId ?? '', + timelineId, + timelineSavedObjectId: timeline.savedObjectId ?? '', + timelineTitle: timeline.title, + }) + ); + }, + // dispatch causes unnecessary rerenders + // eslint-disable-next-line react-hooks/exhaustive-deps + [timeline, navigateToApp, onCloseModal, timelineId] + ); + + const Modal: React.FC = useCallback( + () => + showModal ? : null, + [onCloseModal, onRowClick, showModal] + ); + + const state = useMemo( + () => ({ + Modal, + showModal, + onCloseModal, + onOpenModal, + onRowClick, + }), + [showModal, onCloseModal, onOpenModal, onRowClick, Modal] + ); + + return state; +}; diff --git a/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/translations.ts b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/translations.ts new file mode 100644 index 0000000000000..e0f84d8541424 --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/use_all_cases_modal/translations.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +export const SELECT_CASE_TITLE = i18n.translate('xpack.securitySolution.case.caseModal.title', { + defaultMessage: 'Select case to attach timeline', +}); diff --git a/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts b/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts index 6ada887ece175..2c52acd3ec747 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts @@ -24,3 +24,4 @@ export const useToasts = jest.fn(() => notificationServiceMock.createStartContra export const useCurrentUser = jest.fn(); export const withKibana = jest.fn(createWithKibanaMock()); export const KibanaContextProvider = jest.fn(createKibanaContextProviderMock()); +export const useGetUserSavedObjectPermissions = jest.fn(); diff --git a/x-pack/plugins/security_solution/public/timelines/components/graph_overlay/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/graph_overlay/index.tsx index 54b30aca44a1f..97d1d11395c7f 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/graph_overlay/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/graph_overlay/index.tsx @@ -13,18 +13,14 @@ import { EuiToolTip, } from '@elastic/eui'; import { noop } from 'lodash/fp'; -import React, { useCallback, useMemo, useState } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { connect, ConnectedProps, useDispatch, useSelector } from 'react-redux'; import styled from 'styled-components'; -import { SecurityPageName } from '../../../app/types'; import { FULL_SCREEN } from '../timeline/body/column_headers/translations'; -import { AllCasesModal } from '../../../cases/components/all_cases_modal'; import { EXIT_FULL_SCREEN } from '../../../common/components/exit_full_screen/translations'; -import { APP_ID, FULL_SCREEN_TOGGLED_CLASS_NAME } from '../../../../common/constants'; +import { FULL_SCREEN_TOGGLED_CLASS_NAME } from '../../../../common/constants'; import { useFullScreen } from '../../../common/containers/use_full_screen'; -import { getCaseDetailsUrl, getCreateCaseUrl } from '../../../common/components/link_to'; -import { useKibana } from '../../../common/lib/kibana'; import { State } from '../../../common/store'; import { TimelineId, TimelineType } from '../../../../common/types/timeline'; import { timelineSelectors } from '../../store/timeline'; @@ -32,12 +28,9 @@ import { timelineDefaults } from '../../store/timeline/defaults'; import { TimelineModel } from '../../store/timeline/model'; import { isFullScreen } from '../timeline/body/column_headers'; import { NewCase, ExistingCase } from '../timeline/properties/helpers'; -import { UNTITLED_TIMELINE } from '../timeline/properties/translations'; -import { - setInsertTimeline, - updateTimelineGraphEventId, -} from '../../../timelines/store/timeline/actions'; +import { updateTimelineGraphEventId } from '../../../timelines/store/timeline/actions'; import { Resolver } from '../../../resolver/view'; +import { useAllCasesModal } from '../../../cases/components/use_all_cases_modal'; import * as i18n from './translations'; @@ -112,35 +105,16 @@ const GraphOverlayComponent = ({ timelineType, }: OwnProps & PropsFromRedux) => { const dispatch = useDispatch(); - const { navigateToApp } = useKibana().services.application; const onCloseOverlay = useCallback(() => { dispatch(updateTimelineGraphEventId({ id: timelineId, graphEventId: '' })); }, [dispatch, timelineId]); - const [showCaseModal, setShowCaseModal] = useState(false); - const onOpenCaseModal = useCallback(() => setShowCaseModal(true), []); - const onCloseCaseModal = useCallback(() => setShowCaseModal(false), [setShowCaseModal]); + const currentTimeline = useSelector((state: State) => timelineSelectors.selectTimeline(state, timelineId) ); - const onRowClick = useCallback( - (id?: string) => { - onCloseCaseModal(); - - navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { - path: id != null ? getCaseDetailsUrl({ id }) : getCreateCaseUrl(), - }).then(() => { - dispatch( - setInsertTimeline({ - graphEventId, - timelineId, - timelineSavedObjectId: currentTimeline.savedObjectId, - timelineTitle: title.length > 0 ? title : UNTITLED_TIMELINE, - }) - ); - }); - }, - [currentTimeline, dispatch, graphEventId, navigateToApp, onCloseCaseModal, timelineId, title] - ); + + const { Modal: AllCasesModal, onOpenModal: onOpenCaseModal } = useAllCasesModal({ timelineId }); + const { timelineFullScreen, setTimelineFullScreen, @@ -210,11 +184,7 @@ const GraphOverlayComponent = ({ databaseDocumentID={graphEventId} resolverComponentInstanceID={currentTimeline.id} /> - + ); }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx index 96a773507a30a..9eea95a0a9b1a 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx @@ -6,7 +6,6 @@ import React, { useState, useCallback, useMemo } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; import { TimelineStatusLiteral, TimelineTypeLiteral } from '../../../../../common/types/timeline'; import { useThrottledResizeObserver } from '../../../../common/components/utils'; import { Note } from '../../../../common/lib/note'; @@ -17,15 +16,7 @@ import { AssociateNote, UpdateNote } from '../../notes/helpers'; import { TimelineProperties } from './styles'; import { PropertiesRight } from './properties_right'; import { PropertiesLeft } from './properties_left'; -import { AllCasesModal } from '../../../../cases/components/all_cases_modal'; -import { SecurityPageName } from '../../../../app/types'; -import * as i18n from './translations'; -import { State } from '../../../../common/store'; -import { timelineSelectors } from '../../../store/timeline'; -import { setInsertTimeline } from '../../../store/timeline/actions'; -import { useKibana } from '../../../../common/lib/kibana'; -import { APP_ID } from '../../../../../common/constants'; -import { getCaseDetailsUrl, getCreateCaseUrl } from '../../../../common/components/link_to'; +import { useAllCasesModal } from '../../../../cases/components/use_all_cases_modal'; type UpdateIsFavorite = ({ id, isFavorite }: { id: string; isFavorite: boolean }) => void; type UpdateTitle = ({ id, title }: { id: string; title: string }) => void; @@ -86,12 +77,10 @@ export const Properties = React.memo( updateTitle, usersViewing, }) => { - const { navigateToApp } = useKibana().services.application; const { ref, width = 0 } = useThrottledResizeObserver(300); const [showActions, setShowActions] = useState(false); const [showNotes, setShowNotes] = useState(false); const [showTimelineModal, setShowTimelineModal] = useState(false); - const dispatch = useDispatch(); const onButtonClick = useCallback(() => setShowActions(!showActions), [showActions]); const onToggleShowNotes = useCallback(() => setShowNotes(!showNotes), [showNotes]); @@ -103,32 +92,7 @@ export const Properties = React.memo( setShowTimelineModal(true); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const [showCaseModal, setShowCaseModal] = useState(false); - const onCloseCaseModal = useCallback(() => setShowCaseModal(false), []); - const onOpenCaseModal = useCallback(() => setShowCaseModal(true), []); - const currentTimeline = useSelector((state: State) => - timelineSelectors.selectTimeline(state, timelineId) - ); - - const onRowClick = useCallback( - (id?: string) => { - onCloseCaseModal(); - - navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { - path: id != null ? getCaseDetailsUrl({ id }) : getCreateCaseUrl(), - }).then(() => - dispatch( - setInsertTimeline({ - graphEventId, - timelineId, - timelineSavedObjectId: currentTimeline.savedObjectId, - timelineTitle: title.length > 0 ? title : i18n.UNTITLED_TIMELINE, - }) - ) - ); - }, - [currentTimeline, dispatch, graphEventId, navigateToApp, onCloseCaseModal, timelineId, title] - ); + const { Modal: AllCasesModal, onOpenModal: onOpenCaseModal } = useAllCasesModal({ timelineId }); const datePickerWidth = useMemo( () => @@ -195,11 +159,7 @@ export const Properties = React.memo( updateNote={updateNote} usersViewing={usersViewing} /> - + ); } From 2a77307af18ebce2422da9e9b2c91a0abdeb4ff3 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 27 Jul 2020 09:22:37 -0500 Subject: [PATCH 008/126] [APM] Use core.chrome to set window title (#73232) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I noticed there's a `core.chrome.docTitle.change` method. It can take a string or array of strings and provides its own separator character if given an array. Replace our setting of `window.document.title` directly in the APM and Observability plugins with using the chrome method. This changes the title to be, for example, "トランザクション - opbeans-node - サービス - APM - Elastic" instead of "トランザクション | opbeans-node | サービス | APM | Elastic", using " - " as a separator instead of " | ". --- .../app/Main/UpdateBreadcrumbs.test.tsx | 55 +++++++++++-------- .../components/app/Main/UpdateBreadcrumbs.tsx | 9 ++- .../public/application/application.test.tsx | 29 ++++++++++ .../public/application/index.tsx | 7 +-- 4 files changed, 66 insertions(+), 34 deletions(-) create mode 100644 x-pack/plugins/observability/public/application/application.test.tsx diff --git a/x-pack/plugins/apm/public/components/app/Main/UpdateBreadcrumbs.test.tsx b/x-pack/plugins/apm/public/components/app/Main/UpdateBreadcrumbs.test.tsx index 6aec6e9bf181a..2c19356a7fd52 100644 --- a/x-pack/plugins/apm/public/components/app/Main/UpdateBreadcrumbs.test.tsx +++ b/x-pack/plugins/apm/public/components/app/Main/UpdateBreadcrumbs.test.tsx @@ -16,6 +16,7 @@ import { } from '../../../context/ApmPluginContext/MockApmPluginContext'; const setBreadcrumbs = jest.fn(); +const changeTitle = jest.fn(); function mountBreadcrumb(route: string, params = '') { mount( @@ -27,6 +28,7 @@ function mountBreadcrumb(route: string, params = '') { ...mockApmPluginContextValue.core, chrome: { ...mockApmPluginContextValue.core.chrome, + docTitle: { change: changeTitle }, setBreadcrumbs, }, }, @@ -42,23 +44,14 @@ function mountBreadcrumb(route: string, params = '') { } describe('UpdateBreadcrumbs', () => { - let realDoc: Document; - beforeEach(() => { - realDoc = window.document; - (window.document as any) = { - title: 'Kibana', - }; setBreadcrumbs.mockReset(); + changeTitle.mockReset(); }); - afterEach(() => { - (window.document as any) = realDoc; - }); - - it('Homepage', () => { + it('Changes the homepage title', () => { mountBreadcrumb('/'); - expect(window.document.title).toMatchInlineSnapshot(`"APM"`); + expect(changeTitle).toHaveBeenCalledWith(['APM']); }); it('/services/:serviceName/errors/:groupId', () => { @@ -90,9 +83,13 @@ describe('UpdateBreadcrumbs', () => { }, { text: 'myGroupId', href: undefined }, ]); - expect(window.document.title).toMatchInlineSnapshot( - `"myGroupId | Errors | opbeans-node | Services | APM"` - ); + expect(changeTitle).toHaveBeenCalledWith([ + 'myGroupId', + 'Errors', + 'opbeans-node', + 'Services', + 'APM', + ]); }); it('/services/:serviceName/errors', () => { @@ -104,9 +101,12 @@ describe('UpdateBreadcrumbs', () => { { text: 'opbeans-node', href: '#/services/opbeans-node?kuery=myKuery' }, { text: 'Errors', href: undefined }, ]); - expect(window.document.title).toMatchInlineSnapshot( - `"Errors | opbeans-node | Services | APM"` - ); + expect(changeTitle).toHaveBeenCalledWith([ + 'Errors', + 'opbeans-node', + 'Services', + 'APM', + ]); }); it('/services/:serviceName/transactions', () => { @@ -118,9 +118,12 @@ describe('UpdateBreadcrumbs', () => { { text: 'opbeans-node', href: '#/services/opbeans-node?kuery=myKuery' }, { text: 'Transactions', href: undefined }, ]); - expect(window.document.title).toMatchInlineSnapshot( - `"Transactions | opbeans-node | Services | APM"` - ); + expect(changeTitle).toHaveBeenCalledWith([ + 'Transactions', + 'opbeans-node', + 'Services', + 'APM', + ]); }); it('/services/:serviceName/transactions/view?transactionName=my-transaction-name', () => { @@ -139,8 +142,12 @@ describe('UpdateBreadcrumbs', () => { }, { text: 'my-transaction-name', href: undefined }, ]); - expect(window.document.title).toMatchInlineSnapshot( - `"my-transaction-name | Transactions | opbeans-node | Services | APM"` - ); + expect(changeTitle).toHaveBeenCalledWith([ + 'my-transaction-name', + 'Transactions', + 'opbeans-node', + 'Services', + 'APM', + ]); }); }); diff --git a/x-pack/plugins/apm/public/components/app/Main/UpdateBreadcrumbs.tsx b/x-pack/plugins/apm/public/components/app/Main/UpdateBreadcrumbs.tsx index 7a27eae6e89f7..e7657c63f41bb 100644 --- a/x-pack/plugins/apm/public/components/app/Main/UpdateBreadcrumbs.tsx +++ b/x-pack/plugins/apm/public/components/app/Main/UpdateBreadcrumbs.tsx @@ -22,10 +22,7 @@ interface Props { } function getTitleFromBreadCrumbs(breadcrumbs: Breadcrumb[]) { - return breadcrumbs - .map(({ value }) => value) - .reverse() - .join(' | '); + return breadcrumbs.map(({ value }) => value).reverse(); } class UpdateBreadcrumbsComponent extends React.Component { @@ -43,7 +40,9 @@ class UpdateBreadcrumbsComponent extends React.Component { } ); - document.title = getTitleFromBreadCrumbs(this.props.breadcrumbs); + this.props.core.chrome.docTitle.change( + getTitleFromBreadCrumbs(this.props.breadcrumbs) + ); this.props.core.chrome.setBreadcrumbs(breadcrumbs); } diff --git a/x-pack/plugins/observability/public/application/application.test.tsx b/x-pack/plugins/observability/public/application/application.test.tsx new file mode 100644 index 0000000000000..db7fca140be89 --- /dev/null +++ b/x-pack/plugins/observability/public/application/application.test.tsx @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { renderApp } from './'; +import { Observable } from 'rxjs'; +import { CoreStart, AppMountParameters } from 'src/core/public'; + +describe('renderApp', () => { + it('renders', () => { + const core = ({ + application: { currentAppId$: new Observable(), navigateToUrl: () => {} }, + chrome: { docTitle: { change: () => {} }, setBreadcrumbs: () => {} }, + i18n: { Context: ({ children }: { children: React.ReactNode }) => children }, + uiSettings: { get: () => false }, + } as unknown) as CoreStart; + const params = ({ + element: window.document.createElement('div'), + } as unknown) as AppMountParameters; + + expect(() => { + const unmount = renderApp(core, params); + unmount(); + }).not.toThrowError(); + }); +}); diff --git a/x-pack/plugins/observability/public/application/index.tsx b/x-pack/plugins/observability/public/application/index.tsx index b0134ed8b746b..4c0147dc3cd51 100644 --- a/x-pack/plugins/observability/public/application/index.tsx +++ b/x-pack/plugins/observability/public/application/index.tsx @@ -23,10 +23,7 @@ const observabilityLabelBreadcrumb = { }; function getTitleFromBreadCrumbs(breadcrumbs: Breadcrumbs) { - return breadcrumbs - .map(({ text }) => text) - .reverse() - .join(' | '); + return breadcrumbs.map(({ text }) => text).reverse(); } function App() { @@ -42,7 +39,7 @@ function App() { const breadcrumb = [observabilityLabelBreadcrumb, ...route.breadcrumb]; useEffect(() => { core.chrome.setBreadcrumbs(breadcrumb); - document.title = getTitleFromBreadCrumbs(breadcrumb); + core.chrome.docTitle.change(getTitleFromBreadCrumbs(breadcrumb)); }, [core, breadcrumb]); const { query, path: pathParams } = useRouteParams(route.params); From aa45ac89b07be9ccaffdc05afb890de277ead4a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20St=C3=BCrmer?= Date: Mon, 27 Jul 2020 16:36:25 +0200 Subject: [PATCH 009/126] [Logs UI] Return empty result sets instead of 500 or 404 for analysis results (#72824) This changes the analysis results routes to return empty result sets with HTTP status code 200 instead of and inconsistent status codes 500 or 404. --- .../infra/server/lib/log_analysis/common.ts | 13 +--- .../infra/server/lib/log_analysis/errors.ts | 7 -- .../log_entry_categories_analysis.ts | 65 ++++++++----------- .../log_analysis/log_entry_rate_analysis.ts | 22 ++----- .../queries/log_entry_data_sets.ts | 2 +- .../log_analysis/queries/log_entry_rate.ts | 2 +- .../queries/top_log_entry_categories.ts | 2 +- .../results/log_entry_anomalies_datasets.ts | 9 +-- .../results/log_entry_categories.ts | 9 +-- .../results/log_entry_category_datasets.ts | 9 +-- .../results/log_entry_category_examples.ts | 9 +-- .../results/log_entry_examples.ts | 6 +- .../log_analysis/results/log_entry_rate.ts | 6 +- 13 files changed, 44 insertions(+), 117 deletions(-) diff --git a/x-pack/plugins/infra/server/lib/log_analysis/common.ts b/x-pack/plugins/infra/server/lib/log_analysis/common.ts index 218281d875a46..4d2be94c7cd62 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/common.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/common.ts @@ -14,7 +14,6 @@ import { logEntryDatasetsResponseRT, } from './queries/log_entry_data_sets'; import { decodeOrThrow } from '../../../common/runtime_types'; -import { NoLogAnalysisResultsIndexError } from './errors'; import { startTracingSpan, TracingSpan } from '../../../common/performance_tracing'; export async function fetchMlJob(mlAnomalyDetectors: MlAnomalyDetectors, jobId: string) { @@ -67,16 +66,8 @@ export async function getLogEntryDatasets( ) ); - if (logEntryDatasetsResponse._shards.total === 0) { - throw new NoLogAnalysisResultsIndexError( - `Failed to find ml indices for jobs: ${jobIds.join(', ')}.` - ); - } - - const { - after_key: afterKey, - buckets: latestBatchBuckets, - } = logEntryDatasetsResponse.aggregations.dataset_buckets; + const { after_key: afterKey, buckets: latestBatchBuckets = [] } = + logEntryDatasetsResponse.aggregations?.dataset_buckets ?? {}; logEntryDatasetBuckets = [...logEntryDatasetBuckets, ...latestBatchBuckets]; afterLatestBatchKey = afterKey; diff --git a/x-pack/plugins/infra/server/lib/log_analysis/errors.ts b/x-pack/plugins/infra/server/lib/log_analysis/errors.ts index 09fee8844fbc5..a6d0db25084e8 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/errors.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/errors.ts @@ -6,13 +6,6 @@ /* eslint-disable max-classes-per-file */ -export class NoLogAnalysisResultsIndexError extends Error { - constructor(message?: string) { - super(message); - Object.setPrototypeOf(this, new.target.prototype); - } -} - export class NoLogAnalysisMlJobError extends Error { constructor(message?: string) { super(message); diff --git a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts index a455a03d936a5..ff9e3c7d2167c 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts @@ -15,11 +15,7 @@ import { import { startTracingSpan } from '../../../common/performance_tracing'; import { decodeOrThrow } from '../../../common/runtime_types'; import type { MlAnomalyDetectors, MlSystem } from '../../types'; -import { - InsufficientLogAnalysisMlJobConfigurationError, - NoLogAnalysisResultsIndexError, - UnknownCategoryError, -} from './errors'; +import { InsufficientLogAnalysisMlJobConfigurationError, UnknownCategoryError } from './errors'; import { createLogEntryCategoriesQuery, logEntryCategoriesResponseRT, @@ -235,38 +231,33 @@ async function fetchTopLogEntryCategories( const esSearchSpan = finalizeEsSearchSpan(); - if (topLogEntryCategoriesResponse._shards.total === 0) { - throw new NoLogAnalysisResultsIndexError( - `Failed to find ml result index for job ${logEntryCategoriesCountJobId}.` - ); - } - - const topLogEntryCategories = topLogEntryCategoriesResponse.aggregations.terms_category_id.buckets.map( - (topCategoryBucket) => { - const maximumAnomalyScoresByDataset = topCategoryBucket.filter_record.terms_dataset.buckets.reduce< - Record - >( - (accumulatedMaximumAnomalyScores, datasetFromRecord) => ({ - ...accumulatedMaximumAnomalyScores, - [datasetFromRecord.key]: datasetFromRecord.maximum_record_score.value ?? 0, - }), - {} - ); - - return { - categoryId: parseCategoryId(topCategoryBucket.key), - logEntryCount: topCategoryBucket.filter_model_plot.sum_actual.value ?? 0, - datasets: topCategoryBucket.filter_model_plot.terms_dataset.buckets - .map((datasetBucket) => ({ - name: datasetBucket.key, - maximumAnomalyScore: maximumAnomalyScoresByDataset[datasetBucket.key] ?? 0, - })) - .sort(compareDatasetsByMaximumAnomalyScore) - .reverse(), - maximumAnomalyScore: topCategoryBucket.filter_record.maximum_record_score.value ?? 0, - }; - } - ); + const topLogEntryCategories = + topLogEntryCategoriesResponse.aggregations?.terms_category_id.buckets.map( + (topCategoryBucket) => { + const maximumAnomalyScoresByDataset = topCategoryBucket.filter_record.terms_dataset.buckets.reduce< + Record + >( + (accumulatedMaximumAnomalyScores, datasetFromRecord) => ({ + ...accumulatedMaximumAnomalyScores, + [datasetFromRecord.key]: datasetFromRecord.maximum_record_score.value ?? 0, + }), + {} + ); + + return { + categoryId: parseCategoryId(topCategoryBucket.key), + logEntryCount: topCategoryBucket.filter_model_plot.sum_actual.value ?? 0, + datasets: topCategoryBucket.filter_model_plot.terms_dataset.buckets + .map((datasetBucket) => ({ + name: datasetBucket.key, + maximumAnomalyScore: maximumAnomalyScoresByDataset[datasetBucket.key] ?? 0, + })) + .sort(compareDatasetsByMaximumAnomalyScore) + .reverse(), + maximumAnomalyScore: topCategoryBucket.filter_record.maximum_record_score.value ?? 0, + }; + } + ) ?? []; return { topLogEntryCategories, diff --git a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_rate_analysis.ts b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_rate_analysis.ts index 7bfc85ba78a0e..ce3acd0dba8cf 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_rate_analysis.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_rate_analysis.ts @@ -4,10 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { pipe } from 'fp-ts/lib/pipeable'; -import { map, fold } from 'fp-ts/lib/Either'; -import { identity } from 'fp-ts/lib/function'; -import { throwErrors, createPlainError } from '../../../common/runtime_types'; +import { decodeOrThrow } from '../../../common/runtime_types'; import { logRateModelPlotResponseRT, createLogEntryRateQuery, @@ -15,7 +12,6 @@ import { CompositeTimestampPartitionKey, } from './queries'; import { getJobId } from '../../../common/log_analysis'; -import { NoLogAnalysisResultsIndexError } from './errors'; import type { MlSystem } from '../../types'; const COMPOSITE_AGGREGATION_BATCH_SIZE = 1000; @@ -50,22 +46,14 @@ export async function getLogEntryRateBuckets( ) ); - if (mlModelPlotResponse._shards.total === 0) { - throw new NoLogAnalysisResultsIndexError( - `Failed to query ml result index for job ${logRateJobId}.` - ); - } - - const { after_key: afterKey, buckets: latestBatchBuckets } = pipe( - logRateModelPlotResponseRT.decode(mlModelPlotResponse), - map((response) => response.aggregations.timestamp_partition_buckets), - fold(throwErrors(createPlainError), identity) - ); + const { after_key: afterKey, buckets: latestBatchBuckets = [] } = + decodeOrThrow(logRateModelPlotResponseRT)(mlModelPlotResponse).aggregations + ?.timestamp_partition_buckets ?? {}; mlModelPlotBuckets = [...mlModelPlotBuckets, ...latestBatchBuckets]; afterLatestBatchKey = afterKey; - if (latestBatchBuckets.length < COMPOSITE_AGGREGATION_BATCH_SIZE) { + if (afterKey == null || latestBatchBuckets.length < COMPOSITE_AGGREGATION_BATCH_SIZE) { break; } } diff --git a/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_data_sets.ts b/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_data_sets.ts index 7627ccd8c4996..53971a91d86b1 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_data_sets.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_data_sets.ts @@ -67,7 +67,7 @@ export type LogEntryDatasetBucket = rt.TypeOf; export const logEntryDatasetsResponseRT = rt.intersection([ commonSearchSuccessResponseFieldsRT, - rt.type({ + rt.partial({ aggregations: rt.type({ dataset_buckets: rt.intersection([ rt.type({ diff --git a/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_rate.ts b/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_rate.ts index 52edcf09cdfc2..e82dd8ef4443c 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_rate.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_rate.ts @@ -162,7 +162,7 @@ export const logRateModelPlotBucketRT = rt.type({ export type LogRateModelPlotBucket = rt.TypeOf; -export const logRateModelPlotResponseRT = rt.type({ +export const logRateModelPlotResponseRT = rt.partial({ aggregations: rt.type({ timestamp_partition_buckets: rt.intersection([ rt.type({ diff --git a/x-pack/plugins/infra/server/lib/log_analysis/queries/top_log_entry_categories.ts b/x-pack/plugins/infra/server/lib/log_analysis/queries/top_log_entry_categories.ts index 355dde9ec7c4a..5d3d9bc8b4036 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/queries/top_log_entry_categories.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/queries/top_log_entry_categories.ts @@ -159,7 +159,7 @@ export type LogEntryCategoryBucket = rt.TypeOf; export const topLogEntryCategoriesResponseRT = rt.intersection([ commonSearchSuccessResponseFieldsRT, - rt.type({ + rt.partial({ aggregations: rt.type({ terms_category_id: rt.type({ buckets: rt.array(logEntryCategoryBucketRT), diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies_datasets.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies_datasets.ts index d3d0862eee9aa..f1f1a1681a901 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies_datasets.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies_datasets.ts @@ -12,10 +12,7 @@ import { } from '../../../../common/http_api/log_analysis'; import { createValidationFunction } from '../../../../common/runtime_types'; import type { InfraBackendLibs } from '../../../lib/infra_types'; -import { - getLogEntryAnomaliesDatasets, - NoLogAnalysisResultsIndexError, -} from '../../../lib/log_analysis'; +import { getLogEntryAnomaliesDatasets } from '../../../lib/log_analysis'; import { assertHasInfraMlPlugins } from '../../../utils/request_context'; export const initGetLogEntryAnomaliesDatasetsRoute = ({ framework }: InfraBackendLibs) => { @@ -58,10 +55,6 @@ export const initGetLogEntryAnomaliesDatasetsRoute = ({ framework }: InfraBacken throw error; } - if (error instanceof NoLogAnalysisResultsIndexError) { - return response.notFound({ body: { message: error.message } }); - } - return response.customError({ statusCode: error.statusCode ?? 500, body: { diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_categories.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_categories.ts index f9f31f28dffeb..f57132ef1b505 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_categories.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_categories.ts @@ -12,10 +12,7 @@ import { } from '../../../../common/http_api/log_analysis'; import { createValidationFunction } from '../../../../common/runtime_types'; import type { InfraBackendLibs } from '../../../lib/infra_types'; -import { - getTopLogEntryCategories, - NoLogAnalysisResultsIndexError, -} from '../../../lib/log_analysis'; +import { getTopLogEntryCategories } from '../../../lib/log_analysis'; import { assertHasInfraMlPlugins } from '../../../utils/request_context'; export const initGetLogEntryCategoriesRoute = ({ framework }: InfraBackendLibs) => { @@ -69,10 +66,6 @@ export const initGetLogEntryCategoriesRoute = ({ framework }: InfraBackendLibs) throw error; } - if (error instanceof NoLogAnalysisResultsIndexError) { - return response.notFound({ body: { message: error.message } }); - } - return response.customError({ statusCode: error.statusCode ?? 500, body: { diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_datasets.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_datasets.ts index 69b1e942464fd..b99ff920f81e4 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_datasets.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_datasets.ts @@ -12,10 +12,7 @@ import { } from '../../../../common/http_api/log_analysis'; import { createValidationFunction } from '../../../../common/runtime_types'; import type { InfraBackendLibs } from '../../../lib/infra_types'; -import { - getLogEntryCategoryDatasets, - NoLogAnalysisResultsIndexError, -} from '../../../lib/log_analysis'; +import { getLogEntryCategoryDatasets } from '../../../lib/log_analysis'; import { assertHasInfraMlPlugins } from '../../../utils/request_context'; export const initGetLogEntryCategoryDatasetsRoute = ({ framework }: InfraBackendLibs) => { @@ -58,10 +55,6 @@ export const initGetLogEntryCategoryDatasetsRoute = ({ framework }: InfraBackend throw error; } - if (error instanceof NoLogAnalysisResultsIndexError) { - return response.notFound({ body: { message: error.message } }); - } - return response.customError({ statusCode: error.statusCode ?? 500, body: { diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_examples.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_examples.ts index 8baeaac3d1699..11098ebe5c65b 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_examples.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_examples.ts @@ -12,10 +12,7 @@ import { } from '../../../../common/http_api/log_analysis'; import { createValidationFunction } from '../../../../common/runtime_types'; import type { InfraBackendLibs } from '../../../lib/infra_types'; -import { - getLogEntryCategoryExamples, - NoLogAnalysisResultsIndexError, -} from '../../../lib/log_analysis'; +import { getLogEntryCategoryExamples } from '../../../lib/log_analysis'; import { assertHasInfraMlPlugins } from '../../../utils/request_context'; export const initGetLogEntryCategoryExamplesRoute = ({ framework, sources }: InfraBackendLibs) => { @@ -68,10 +65,6 @@ export const initGetLogEntryCategoryExamplesRoute = ({ framework, sources }: Inf throw error; } - if (error instanceof NoLogAnalysisResultsIndexError) { - return response.notFound({ body: { message: error.message } }); - } - return response.customError({ statusCode: error.statusCode ?? 500, body: { diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_examples.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_examples.ts index be4caee769506..7838a64a6045e 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_examples.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_examples.ts @@ -7,7 +7,7 @@ import Boom from 'boom'; import { createValidationFunction } from '../../../../common/runtime_types'; import { InfraBackendLibs } from '../../../lib/infra_types'; -import { NoLogAnalysisResultsIndexError, getLogEntryExamples } from '../../../lib/log_analysis'; +import { getLogEntryExamples } from '../../../lib/log_analysis'; import { assertHasInfraMlPlugins } from '../../../utils/request_context'; import { getLogEntryExamplesRequestPayloadRT, @@ -68,10 +68,6 @@ export const initGetLogEntryExamplesRoute = ({ framework, sources }: InfraBacken throw error; } - if (error instanceof NoLogAnalysisResultsIndexError) { - return response.notFound({ body: { message: error.message } }); - } - return response.customError({ statusCode: error.statusCode ?? 500, body: { diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_rate.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_rate.ts index 3b05f6ed23aae..cd23c0193e291 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_rate.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_rate.ts @@ -13,7 +13,7 @@ import { GetLogEntryRateSuccessResponsePayload, } from '../../../../common/http_api/log_analysis'; import { createValidationFunction } from '../../../../common/runtime_types'; -import { NoLogAnalysisResultsIndexError, getLogEntryRateBuckets } from '../../../lib/log_analysis'; +import { getLogEntryRateBuckets } from '../../../lib/log_analysis'; import { assertHasInfraMlPlugins } from '../../../utils/request_context'; export const initGetLogEntryRateRoute = ({ framework }: InfraBackendLibs) => { @@ -56,10 +56,6 @@ export const initGetLogEntryRateRoute = ({ framework }: InfraBackendLibs) => { throw error; } - if (error instanceof NoLogAnalysisResultsIndexError) { - return response.notFound({ body: { message: error.message } }); - } - return response.customError({ statusCode: error.statusCode ?? 500, body: { From 02e3fca77258b166b20dbbf2dc280e146b59ec27 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Mon, 27 Jul 2020 16:01:03 +0100 Subject: [PATCH 010/126] fix icon type (#73254) --- .../components/timeline/header/index.test.tsx | 95 +++++++++++++++++++ .../components/timeline/header/index.tsx | 2 +- 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.test.tsx index 58c213dc884ea..e0043f3b232da 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.test.tsx @@ -85,5 +85,100 @@ describe('Header', () => { expect(wrapper.find('[data-test-subj="timelineCallOutUnauthorized"]').exists()).toEqual(true); }); + + test('it renders the unauthorized call out with correct icon', () => { + const testProps = { + ...props, + filterManager: new FilterManager(mockUiSettingsForFilterManager), + showCallOutUnauthorizedMsg: true, + }; + + const wrapper = mount( + + + + ); + + expect( + wrapper.find('[data-test-subj="timelineCallOutUnauthorized"]').first().prop('iconType') + ).toEqual('alert'); + }); + + test('it renders the unauthorized call out with correct message', () => { + const testProps = { + ...props, + filterManager: new FilterManager(mockUiSettingsForFilterManager), + showCallOutUnauthorizedMsg: true, + }; + + const wrapper = mount( + + + + ); + + expect( + wrapper.find('[data-test-subj="timelineCallOutUnauthorized"]').first().prop('title') + ).toEqual( + 'You can use Timeline to investigate events, but you do not have the required permissions to save timelines for future use. If you need to save timelines, contact your Kibana administrator.' + ); + }); + + test('it renders the immutable timeline call out providers', () => { + const testProps = { + ...props, + filterManager: new FilterManager(mockUiSettingsForFilterManager), + showCallOutUnauthorizedMsg: false, + status: TimelineStatus.immutable, + }; + + const wrapper = mount( + + + + ); + + expect(wrapper.find('[data-test-subj="timelineImmutableCallOut"]').exists()).toEqual(true); + }); + + test('it renders the immutable timeline call out with correct icon', () => { + const testProps = { + ...props, + filterManager: new FilterManager(mockUiSettingsForFilterManager), + showCallOutUnauthorizedMsg: false, + status: TimelineStatus.immutable, + }; + + const wrapper = mount( + + + + ); + + expect( + wrapper.find('[data-test-subj="timelineImmutableCallOut"]').first().prop('iconType') + ).toEqual('alert'); + }); + + test('it renders the immutable timeline call out with correct message', () => { + const testProps = { + ...props, + filterManager: new FilterManager(mockUiSettingsForFilterManager), + showCallOutUnauthorizedMsg: false, + status: TimelineStatus.immutable, + }; + + const wrapper = mount( + + + + ); + + expect( + wrapper.find('[data-test-subj="timelineImmutableCallOut"]').first().prop('title') + ).toEqual( + 'This timeline is immutable, therefore not allowed to save it within the security application, though you may continue to use the timeline to search and filter security events' + ); + }); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.tsx index aa3ce88acc200..75bfb52f2756b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/index.tsx @@ -75,7 +75,7 @@ const TimelineHeaderComponent: React.FC = ({ data-test-subj="timelineImmutableCallOut" title={i18n.CALL_OUT_IMMUTIABLE} color="primary" - iconType="info" + iconType="alert" size="s" /> )} From 9aa5e1772da99fb90f248e9991591fda27160edc Mon Sep 17 00:00:00 2001 From: igoristic Date: Mon, 27 Jul 2020 11:10:25 -0400 Subject: [PATCH 011/126] [Monitoring] "Internal Monitoring" deprecation warning (#72020) * Internal Monitoring deprecation * Fixed type * Added if cloud logic * Fixed i18n test * Addressed code review feedback * Fixed types * Changed query * Added delay to fix a test * Fixed tests * Fixed text Co-authored-by: Elastic Machine --- .../public/lib/internal_monitoring_toasts.tsx | 123 ++++++++++++++++++ .../monitoring/public/services/clusters.js | 34 ++++- .../check/internal_monitoring.ts | 85 ++++++++++++ .../api/v1/elasticsearch_settings/index.js | 1 + .../monitoring/server/routes/api/v1/ui.js | 1 + .../functional/apps/monitoring/time_filter.js | 7 + 6 files changed, 245 insertions(+), 6 deletions(-) create mode 100644 x-pack/plugins/monitoring/public/lib/internal_monitoring_toasts.tsx create mode 100644 x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/internal_monitoring.ts diff --git a/x-pack/plugins/monitoring/public/lib/internal_monitoring_toasts.tsx b/x-pack/plugins/monitoring/public/lib/internal_monitoring_toasts.tsx new file mode 100644 index 0000000000000..b6ecb631d005a --- /dev/null +++ b/x-pack/plugins/monitoring/public/lib/internal_monitoring_toasts.tsx @@ -0,0 +1,123 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiSpacer, EuiLink } from '@elastic/eui'; +import { Legacy } from '../legacy_shims'; +import { toMountPoint } from '../../../../../src/plugins/kibana_react/public'; +import { isInSetupMode, toggleSetupMode } from './setup_mode'; + +export interface MonitoringIndicesTypes { + legacyIndices: number; + metricbeatIndices: number; +} + +const enterSetupModeLabel = () => + i18n.translate('xpack.monitoring.internalMonitoringToast.enterSetupMode', { + defaultMessage: 'Enter setup mode', + }); + +const learnMoreLabel = () => + i18n.translate('xpack.monitoring.internalMonitoringToast.learnMoreAction', { + defaultMessage: 'Learn more', + }); + +const showIfLegacyOnlyIndices = () => { + const { ELASTIC_WEBSITE_URL } = Legacy.shims.docLinks; + const toast = Legacy.shims.toastNotifications.addWarning({ + title: toMountPoint( + + ), + text: toMountPoint( +
+

+ {i18n.translate('xpack.monitoring.internalMonitoringToast.description', { + defaultMessage: `It appears you are using "Legacy Collection" for Stack Monitoring. + This method of monitoring will no longer be supported in the next major release (8.0.0). + Please follow the steps in setup mode to start monitoring with Metricbeat.`, + })} +

+ { + Legacy.shims.toastNotifications.remove(toast); + toggleSetupMode(true); + }} + > + {enterSetupModeLabel()} + + + + + {learnMoreLabel()} + +
+ ), + }); +}; + +const showIfLegacyAndMetricbeatIndices = () => { + const { ELASTIC_WEBSITE_URL } = Legacy.shims.docLinks; + const toast = Legacy.shims.toastNotifications.addWarning({ + title: toMountPoint( + + ), + text: toMountPoint( +
+

+ {i18n.translate('xpack.monitoring.internalAndMetricbeatMonitoringToast.description', { + defaultMessage: `It appears you are using both Metricbeat and "Legacy Collection" for Stack Monitoring. + In 8.0.0, you must use Metricbeat to collect monitoring data. + Please follow the steps in setup mode to migrate the rest of the monitoring to Metricbeat.`, + })} +

+ { + Legacy.shims.toastNotifications.remove(toast); + toggleSetupMode(true); + }} + > + {enterSetupModeLabel()} + + + + + {learnMoreLabel()} + +
+ ), + }); +}; + +export const showInternalMonitoringToast = ({ + legacyIndices, + metricbeatIndices, +}: MonitoringIndicesTypes) => { + if (isInSetupMode()) { + return; + } + + if (legacyIndices && !metricbeatIndices) { + showIfLegacyOnlyIndices(); + } else if (legacyIndices && metricbeatIndices) { + showIfLegacyAndMetricbeatIndices(); + } +}; diff --git a/x-pack/plugins/monitoring/public/services/clusters.js b/x-pack/plugins/monitoring/public/services/clusters.js index 5173984dbe868..7f772ac1e1bcd 100644 --- a/x-pack/plugins/monitoring/public/services/clusters.js +++ b/x-pack/plugins/monitoring/public/services/clusters.js @@ -7,6 +7,7 @@ import { ajaxErrorHandlersProvider } from '../lib/ajax_error_handler'; import { Legacy } from '../legacy_shims'; import { STANDALONE_CLUSTER_CLUSTER_UUID } from '../../common/constants'; +import { showInternalMonitoringToast } from '../lib/internal_monitoring_toasts'; import { showSecurityToast } from '../alerts/lib/security_toasts'; function formatClusters(clusters) { @@ -21,6 +22,7 @@ function formatCluster(cluster) { } let once = false; +let inTransit = false; export function monitoringClustersProvider($injector) { return (clusterUuid, ccs, codePaths) => { @@ -63,19 +65,39 @@ export function monitoringClustersProvider($injector) { }); } - if (!once) { + function ensureMetricbeatEnabled() { + if (Legacy.shims.isCloud) { + return Promise.resolve(); + } + + return $http + .get('../api/monitoring/v1/elasticsearch_settings/check/internal_monitoring') + .then(({ data }) => { + showInternalMonitoringToast({ + legacyIndices: data.legacy_indices, + metricbeatIndices: data.mb_indices, + }); + }) + .catch((err) => { + const Private = $injector.get('Private'); + const ajaxErrorHandlers = Private(ajaxErrorHandlersProvider); + return ajaxErrorHandlers(err); + }); + } + + if (!once && !inTransit) { + inTransit = true; return getClusters().then((clusters) => { if (clusters.length) { - return ensureAlertsEnabled() - .then(({ data }) => { + Promise.all([ensureAlertsEnabled(), ensureMetricbeatEnabled()]) + .then(([{ data }]) => { showSecurityToast(data); once = true; - return clusters; }) .catch(() => { // Intentionally swallow the error as this will retry the next page load - return clusters; - }); + }) + .finally(() => (inTransit = false)); } return clusters; }); diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/internal_monitoring.ts b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/internal_monitoring.ts new file mode 100644 index 0000000000000..4473d824c9e30 --- /dev/null +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/check/internal_monitoring.ts @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RequestHandlerContext } from 'kibana/server'; +// @ts-ignore +import { getIndexPatterns } from '../../../../../lib/cluster/get_index_patterns'; +// @ts-ignore +import { handleError } from '../../../../../lib/errors'; +import { RouteDependencies } from '../../../../../types'; + +const queryBody = { + size: 0, + aggs: { + types: { + terms: { + field: '_index', + size: 10, + }, + }, + }, +}; + +const checkLatestMonitoringIsLegacy = async (context: RequestHandlerContext, index: string) => { + const { client: esClient } = context.core.elasticsearch.legacy; + const result = await esClient.callAsCurrentUser('search', { + index, + body: queryBody, + }); + + const { aggregations } = result; + const counts = { + legacyIndicesCount: 0, + mbIndicesCount: 0, + }; + + if (!aggregations) { + return counts; + } + + const { + types: { buckets }, + } = aggregations; + counts.mbIndicesCount = buckets.filter(({ key }: { key: string }) => key.includes('-mb-')).length; + + counts.legacyIndicesCount = buckets.length - counts.mbIndicesCount; + return counts; +}; + +export function internalMonitoringCheckRoute(server: unknown, npRoute: RouteDependencies) { + npRoute.router.get( + { + path: '/api/monitoring/v1/elasticsearch_settings/check/internal_monitoring', + validate: false, + }, + async (context, _request, response) => { + try { + const typeCount = { + legacy_indices: 0, + mb_indices: 0, + }; + + const { esIndexPattern, kbnIndexPattern, lsIndexPattern } = getIndexPatterns(server); + const indexCounts = await Promise.all([ + checkLatestMonitoringIsLegacy(context, esIndexPattern), + checkLatestMonitoringIsLegacy(context, kbnIndexPattern), + checkLatestMonitoringIsLegacy(context, lsIndexPattern), + ]); + + indexCounts.forEach((counts) => { + typeCount.legacy_indices += counts.legacyIndicesCount; + typeCount.mb_indices += counts.mbIndicesCount; + }); + + return response.ok({ + body: typeCount, + }); + } catch (err) { + throw handleError(err); + } + } + ); +} diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/index.js b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/index.js index d7ef71efc0b51..906057d221868 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/index.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/elasticsearch_settings/index.js @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +export { internalMonitoringCheckRoute } from './check/internal_monitoring'; export { clusterSettingsCheckRoute } from './check/cluster'; export { nodesSettingsCheckRoute } from './check/nodes'; export { setCollectionEnabledRoute } from './set/collection_enabled'; diff --git a/x-pack/plugins/monitoring/server/routes/api/v1/ui.js b/x-pack/plugins/monitoring/server/routes/api/v1/ui.js index de0213ec84689..e8daf52582437 100644 --- a/x-pack/plugins/monitoring/server/routes/api/v1/ui.js +++ b/x-pack/plugins/monitoring/server/routes/api/v1/ui.js @@ -20,6 +20,7 @@ export { ccrShardRoute, } from './elasticsearch'; export { + internalMonitoringCheckRoute, clusterSettingsCheckRoute, nodesSettingsCheckRoute, setCollectionEnabledRoute, diff --git a/x-pack/test/functional/apps/monitoring/time_filter.js b/x-pack/test/functional/apps/monitoring/time_filter.js index d7ffdb4a7900d..11557d995218e 100644 --- a/x-pack/test/functional/apps/monitoring/time_filter.js +++ b/x-pack/test/functional/apps/monitoring/time_filter.js @@ -7,6 +7,8 @@ import expect from '@kbn/expect'; import { getLifecycleMethods } from './_get_lifecycle_methods'; +const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); + export default function ({ getService, getPageObjects }) { const PageObjects = getPageObjects(['header', 'timePicker']); const testSubjects = getService('testSubjects'); @@ -35,6 +37,11 @@ export default function ({ getService, getPageObjects }) { }); it('should send another request when changing the time picker', async () => { + /** + * TODO: The value should either be removed or lowered after: + * https://github.com/elastic/kibana/issues/72997 is resolved + */ + await delay(3000); await PageObjects.timePicker.setAbsoluteRange( 'Aug 15, 2016 @ 21:00:00.000', 'Aug 16, 2016 @ 00:00:00.000' From 6d4bb9dc0d5bf8bbcdff17f73b4c77b0f1ccea35 Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Mon, 27 Jul 2020 11:13:26 -0400 Subject: [PATCH 012/126] [SECURITY_SOLUTION][ENDPOINT] Handle Host list/details policy links to non-existing policies (#73208) * Make API call to check policies and save it to store * change policy list and details to not show policy as a link if it does not exist --- .../pages/endpoint_hosts/store/action.ts | 9 +- .../pages/endpoint_hosts/store/index.test.ts | 1 + .../pages/endpoint_hosts/store/middleware.ts | 115 +++++++++++++++++- .../pages/endpoint_hosts/store/reducer.ts | 9 ++ .../pages/endpoint_hosts/store/selectors.ts | 8 ++ .../management/pages/endpoint_hosts/types.ts | 2 + .../view/components/host_policy_link.tsx | 53 ++++++++ .../view/details/host_details.tsx | 29 +---- .../pages/endpoint_hosts/view/index.tsx | 18 +-- .../store/policy_list/services/ingest.ts | 15 +++ 10 files changed, 224 insertions(+), 35 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/host_policy_link.tsx diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts index 4c01b3644cf63..621fab2e4ee11 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts @@ -12,6 +12,7 @@ import { import { ServerApiError } from '../../../../common/types'; import { GetPolicyListResponse } from '../../policy/types'; import { GetPackagesResponse } from '../../../../../../ingest_manager/common'; +import { HostState } from '../types'; interface ServerReturnedHostList { type: 'serverReturnedHostList'; @@ -75,6 +76,11 @@ interface ServerReturnedEndpointPackageInfo { payload: GetPackagesResponse['response'][0]; } +interface ServerReturnedHostNonExistingPolicies { + type: 'serverReturnedHostNonExistingPolicies'; + payload: HostState['nonExistingPolicies']; +} + export type HostAction = | ServerReturnedHostList | ServerFailedToReturnHostList @@ -87,4 +93,5 @@ export type HostAction = | UserSelectedEndpointPolicy | ServerCancelledHostListLoading | ServerCancelledPolicyItemsLoading - | ServerReturnedEndpointPackageInfo; + | ServerReturnedEndpointPackageInfo + | ServerReturnedHostNonExistingPolicies; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts index f2c205661b32c..b6e18506b6111 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts @@ -50,6 +50,7 @@ describe('HostList store concerns', () => { selectedPolicyId: undefined, policyItemsLoading: false, endpointPackageInfo: undefined, + nonExistingPolicies: {}, }); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts index 12fa3dc47beac..edeca5659ee38 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { HostResultList } from '../../../../../common/endpoint/types'; +import { HttpSetup } from 'kibana/public'; +import { HostInfo, HostResultList } from '../../../../../common/endpoint/types'; import { GetPolicyListResponse } from '../../policy/types'; import { ImmutableMiddlewareFactory } from '../../../../common/store'; import { @@ -13,12 +14,15 @@ import { uiQueryParams, listData, endpointPackageInfo, + nonExistingPolicies, } from './selectors'; import { HostState } from '../types'; import { sendGetEndpointSpecificPackageConfigs, sendGetEndpointSecurityPackage, + sendGetAgentConfigList, } from '../../policy/store/policy_list/services/ingest'; +import { AGENT_CONFIG_SAVED_OBJECT_TYPE } from '../../../../../../ingest_manager/common'; export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (coreStart) => { return ({ getState, dispatch }) => (next) => async (action) => { @@ -58,6 +62,23 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor type: 'serverReturnedHostList', payload: hostResponse, }); + + getNonExistingPoliciesForHostsList( + coreStart.http, + hostResponse.hosts, + nonExistingPolicies(state) + ) + .then((missingPolicies) => { + if (missingPolicies !== undefined) { + dispatch({ + type: 'serverReturnedHostNonExistingPolicies', + payload: missingPolicies, + }); + } + }) + // Ignore Errors, since this should not hinder the user's ability to use the UI + // eslint-disable-next-line no-console + .catch((error) => console.error(error)); } catch (error) { dispatch({ type: 'serverFailedToReturnHostList', @@ -117,6 +138,23 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor type: 'serverReturnedHostList', payload: response, }); + + getNonExistingPoliciesForHostsList( + coreStart.http, + response.hosts, + nonExistingPolicies(state) + ) + .then((missingPolicies) => { + if (missingPolicies !== undefined) { + dispatch({ + type: 'serverReturnedHostNonExistingPolicies', + payload: missingPolicies, + }); + } + }) + // Ignore Errors, since this should not hinder the user's ability to use the UI + // eslint-disable-next-line no-console + .catch((error) => console.error(error)); } catch (error) { dispatch({ type: 'serverFailedToReturnHostList', @@ -133,11 +171,25 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor // call the host details api const { selected_host: selectedHost } = uiQueryParams(state); try { - const response = await coreStart.http.get(`/api/endpoint/metadata/${selectedHost}`); + const response = await coreStart.http.get( + `/api/endpoint/metadata/${selectedHost}` + ); dispatch({ type: 'serverReturnedHostDetails', payload: response, }); + getNonExistingPoliciesForHostsList(coreStart.http, [response], nonExistingPolicies(state)) + .then((missingPolicies) => { + if (missingPolicies !== undefined) { + dispatch({ + type: 'serverReturnedHostNonExistingPolicies', + payload: missingPolicies, + }); + } + }) + // Ignore Errors, since this should not hinder the user's ability to use the UI + // eslint-disable-next-line no-console + .catch((error) => console.error(error)); } catch (error) { dispatch({ type: 'serverFailedToReturnHostDetails', @@ -163,3 +215,62 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor } }; }; + +const getNonExistingPoliciesForHostsList = async ( + http: HttpSetup, + hosts: HostResultList['hosts'], + currentNonExistingPolicies: HostState['nonExistingPolicies'] +): Promise => { + if (hosts.length === 0) { + return; + } + + // Create an array of unique policy IDs that are not yet known to be non-existing. + const policyIdsToCheck = Array.from( + new Set( + hosts + .filter((host) => !currentNonExistingPolicies[host.metadata.Endpoint.policy.applied.id]) + .map((host) => host.metadata.Endpoint.policy.applied.id) + ) + ); + + if (policyIdsToCheck.length === 0) { + return; + } + + // We use the Agent Config API here, instead of the Package Config, because we can't use + // filter by ID of the Saved Object. Agent Config, however, keeps a reference (array) of + // Package Ids that it uses, thus if a reference exists there, then the package config (policy) + // exists. + const policiesFound = ( + await sendGetAgentConfigList(http, { + query: { + kuery: `${AGENT_CONFIG_SAVED_OBJECT_TYPE}.package_configs: (${policyIdsToCheck.join( + ' or ' + )})`, + }, + }) + ).items.reduce((list, agentConfig) => { + (agentConfig.package_configs as string[]).forEach((packageConfig) => { + list[packageConfig as string] = true; + }); + return list; + }, {}); + + const nonExisting = policyIdsToCheck.reduce( + (list, policyId) => { + if (policiesFound[policyId]) { + return list; + } + list[policyId] = true; + return list; + }, + {} + ); + + if (Object.keys(nonExisting).length === 0) { + return; + } + + return nonExisting; +}; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts index 993267cf1a704..7f68baa4b85bd 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts @@ -28,6 +28,7 @@ export const initialHostListState: Immutable = { selectedPolicyId: undefined, policyItemsLoading: false, endpointPackageInfo: undefined, + nonExistingPolicies: {}, }; /* eslint-disable-next-line complexity */ @@ -57,6 +58,14 @@ export const hostListReducer: ImmutableReducer = ( error: action.payload, loading: false, }; + } else if (action.type === 'serverReturnedHostNonExistingPolicies') { + return { + ...state, + nonExistingPolicies: { + ...state.nonExistingPolicies, + ...action.payload, + }, + }; } else if (action.type === 'serverReturnedHostDetails') { return { ...state, diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts index 4f47eaf565d8c..6e0823a920413 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts @@ -195,3 +195,11 @@ export const policyResponseStatus: (state: Immutable) => string = cre return (policyResponse && policyResponse?.Endpoint?.policy?.applied?.status) || ''; } ); + +/** + * returns the list of known non-existing polices that may have been in the Host API response. + * @param state + */ +export const nonExistingPolicies: ( + state: Immutable +) => Immutable = (state) => state.nonExistingPolicies; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts index a5f37a0b49e8f..582a59cfd7605 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts @@ -50,6 +50,8 @@ export interface HostState { selectedPolicyId?: string; /** Endpoint package info */ endpointPackageInfo?: GetPackagesResponse['response'][0]; + /** tracks the list of policies IDs used in Host metadata that may no longer exist */ + nonExistingPolicies: Record; } /** diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/host_policy_link.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/host_policy_link.tsx new file mode 100644 index 0000000000000..ec4d7e87b721d --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/host_policy_link.tsx @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { memo, useMemo } from 'react'; +import { EuiLink, EuiLinkAnchorProps } from '@elastic/eui'; +import { useHostSelector } from '../hooks'; +import { nonExistingPolicies } from '../../store/selectors'; +import { getPolicyDetailPath } from '../../../../common/routing'; +import { useFormatUrl } from '../../../../../common/components/link_to'; +import { SecurityPageName } from '../../../../../../common/constants'; +import { useNavigateByRouterEventHandler } from '../../../../../common/hooks/endpoint/use_navigate_by_router_event_handler'; + +/** + * A policy link (to details) that first checks to see if the policy id exists against + * the `nonExistingPolicies` value in the store. If it does not exist, then regular + * text is returned. + */ +export const HostPolicyLink = memo< + Omit & { + policyId: string; + } +>(({ policyId, children, onClick, ...otherProps }) => { + const missingPolicies = useHostSelector(nonExistingPolicies); + const { formatUrl } = useFormatUrl(SecurityPageName.administration); + const { toRoutePath, toRouteUrl } = useMemo(() => { + const toPath = getPolicyDetailPath(policyId); + return { + toRoutePath: toPath, + toRouteUrl: formatUrl(toPath), + }; + }, [formatUrl, policyId]); + const clickHandler = useNavigateByRouterEventHandler(toRoutePath, onClick); + + if (missingPolicies[policyId]) { + return ( + + {children} + + ); + } + + return ( + // eslint-disable-next-line @elastic/eui/href-or-on-click + + {children} + + ); +}); + +HostPolicyLink.displayName = 'HostPolicyLink'; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx index 62efa621e6e3b..cea66acbef8ca 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx @@ -26,10 +26,11 @@ import { POLICY_STATUS_TO_HEALTH_COLOR } from '../host_constants'; import { FormattedDateAndTime } from '../../../../../common/components/endpoint/formatted_date_time'; import { useNavigateByRouterEventHandler } from '../../../../../common/hooks/endpoint/use_navigate_by_router_event_handler'; import { LinkToApp } from '../../../../../common/components/endpoint/link_to_app'; -import { getHostDetailsPath, getPolicyDetailPath } from '../../../../common/routing'; +import { getHostDetailsPath } from '../../../../common/routing'; import { SecurityPageName } from '../../../../../app/types'; import { useFormatUrl } from '../../../../../common/components/link_to'; import { AgentDetailsReassignConfigAction } from '../../../../../../../ingest_manager/public'; +import { HostPolicyLink } from '../components/host_policy_link'; const HostIds = styled(EuiListGroupItem)` margin-top: 0; @@ -116,15 +117,6 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { const policyStatusClickHandler = useNavigateByRouterEventHandler(policyResponseRoutePath); - const [policyDetailsRoutePath, policyDetailsRouteUrl] = useMemo(() => { - return [ - getPolicyDetailPath(details.Endpoint.policy.applied.id), - formatUrl(getPolicyDetailPath(details.Endpoint.policy.applied.id)), - ]; - }, [details.Endpoint.policy.applied.id, formatUrl]); - - const policyDetailsClickHandler = useNavigateByRouterEventHandler(policyDetailsRoutePath); - const detailsResultsPolicy = useMemo(() => { return [ { @@ -133,14 +125,12 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { }), description: ( <> - {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} - {details.Endpoint.policy.applied.name} - + ), }, @@ -171,14 +161,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { ), }, ]; - }, [ - details, - policyResponseUri, - policyStatus, - policyStatusClickHandler, - policyDetailsRouteUrl, - policyDetailsClickHandler, - ]); + }, [details, policyResponseUri, policyStatus, policyStatusClickHandler]); const detailsResultsLower = useMemo(() => { return [ { diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx index c5ed71cba46d9..e38ef1bd5fe86 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx @@ -46,9 +46,10 @@ import { AgentConfigDetailsDeployAgentAction, } from '../../../../../../ingest_manager/public'; import { SecurityPageName } from '../../../../app/types'; -import { getHostListPath, getHostDetailsPath, getPolicyDetailPath } from '../../../common/routing'; +import { getHostListPath, getHostDetailsPath } from '../../../common/routing'; import { useFormatUrl } from '../../../../common/components/link_to'; import { HostAction } from '../store/action'; +import { HostPolicyLink } from './components/host_policy_link'; const HostListNavLink = memo<{ name: string; @@ -241,15 +242,14 @@ export const HostList = () => { truncateText: true, // eslint-disable-next-line react/display-name render: (policy: HostInfo['metadata']['Endpoint']['policy']['applied']) => { - const toRoutePath = getPolicyDetailPath(policy.id); - const toRouteUrl = formatUrl(toRoutePath); return ( - + + {policy.name} + ); }, }, diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/services/ingest.ts b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/services/ingest.ts index 48b6bedf50fd8..c6e6146f4d5e4 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/services/ingest.ts +++ b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/services/ingest.ts @@ -12,12 +12,15 @@ import { DeletePackageConfigsRequest, PACKAGE_CONFIG_SAVED_OBJECT_TYPE, GetPackagesResponse, + GetAgentConfigsRequest, + GetAgentConfigsResponse, } from '../../../../../../../../ingest_manager/common'; import { GetPolicyListResponse, GetPolicyResponse, UpdatePolicyResponse } from '../../../types'; import { NewPolicyData } from '../../../../../../../common/endpoint/types'; const INGEST_API_ROOT = `/api/ingest_manager`; export const INGEST_API_PACKAGE_CONFIGS = `${INGEST_API_ROOT}/package_configs`; +const INGEST_API_AGENT_CONFIGS = `${INGEST_API_ROOT}/agent_configs`; const INGEST_API_FLEET = `${INGEST_API_ROOT}/fleet`; const INGEST_API_FLEET_AGENT_STATUS = `${INGEST_API_FLEET}/agent-status`; export const INGEST_API_EPM_PACKAGES = `${INGEST_API_ROOT}/epm/packages`; @@ -75,6 +78,18 @@ export const sendDeletePackageConfig = ( }); }; +/** + * Retrieve a list of Agent Configurations + * @param http + * @param options + */ +export const sendGetAgentConfigList = ( + http: HttpStart, + options: HttpFetchOptions & GetAgentConfigsRequest +) => { + return http.get(INGEST_API_AGENT_CONFIGS, options); +}; + /** * Updates a package config * From b15a0a97f742a4b1c2cbd424c3f842860b4331c0 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Mon, 27 Jul 2020 10:35:18 -0500 Subject: [PATCH 013/126] [Security Solution][Detections] Adds ip_range and text types to value list upload form (#73109) * Adds two more types to the value lists form * Adds `ip_range` and `text` types * Replaces radio group with select * Add custom command for attaching a file to an input This will be used to excercise value list uploads. * Add some missing test subjects for our value lists modal * Add cypress test for value lists modal This exercises the happy path: opening the modal, uploading a list, and asserting that it subsequently appears in the table. Co-authored-by: Elastic Machine --- .../cypress/fixtures/value_list.txt | 6 +++ .../cypress/integration/value_lists.spec.ts | 43 ++++++++++++++++ .../cypress/screens/lists.ts | 11 ++++ .../cypress/support/commands.js | 19 +++++++ .../cypress/support/index.d.ts | 1 + .../security_solution/cypress/tasks/lists.ts | 36 +++++++++++++ .../value_lists_management_modal/form.tsx | 50 +++++++++---------- .../value_lists_management_modal/table.tsx | 1 + .../translations.ts | 14 ++++++ .../pages/detection_engine/rules/index.tsx | 1 + 10 files changed, 156 insertions(+), 26 deletions(-) create mode 100644 x-pack/plugins/security_solution/cypress/fixtures/value_list.txt create mode 100644 x-pack/plugins/security_solution/cypress/integration/value_lists.spec.ts create mode 100644 x-pack/plugins/security_solution/cypress/screens/lists.ts create mode 100644 x-pack/plugins/security_solution/cypress/tasks/lists.ts diff --git a/x-pack/plugins/security_solution/cypress/fixtures/value_list.txt b/x-pack/plugins/security_solution/cypress/fixtures/value_list.txt new file mode 100644 index 0000000000000..2b40f036c62d2 --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/fixtures/value_list.txt @@ -0,0 +1,6 @@ +these +are +keywords +for +a +list diff --git a/x-pack/plugins/security_solution/cypress/integration/value_lists.spec.ts b/x-pack/plugins/security_solution/cypress/integration/value_lists.spec.ts new file mode 100644 index 0000000000000..2804a8ac2ea8c --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/integration/value_lists.spec.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { loginAndWaitForPageWithoutDateRange } from '../tasks/login'; +import { DETECTIONS_URL } from '../urls/navigation'; +import { + waitForAlertsPanelToBeLoaded, + waitForAlertsIndexToBeCreated, + goToManageAlertsDetectionRules, +} from '../tasks/alerts'; +import { + waitForListsIndexToBeCreated, + waitForValueListsModalToBeLoaded, + openValueListsModal, + selectValueListsFile, + uploadValueList, +} from '../tasks/lists'; +import { VALUE_LISTS_TABLE, VALUE_LISTS_ROW } from '../screens/lists'; + +describe('value lists', () => { + describe('management modal', () => { + it('creates a keyword list from an uploaded file', () => { + loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + waitForAlertsPanelToBeLoaded(); + waitForAlertsIndexToBeCreated(); + waitForListsIndexToBeCreated(); + goToManageAlertsDetectionRules(); + waitForValueListsModalToBeLoaded(); + openValueListsModal(); + selectValueListsFile(); + uploadValueList(); + + cy.get(VALUE_LISTS_TABLE) + .find(VALUE_LISTS_ROW) + .should(($row) => { + expect($row.text()).to.contain('value_list.txt'); + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/cypress/screens/lists.ts b/x-pack/plugins/security_solution/cypress/screens/lists.ts new file mode 100644 index 0000000000000..35205a27e5a3c --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/screens/lists.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export const VALUE_LISTS_MODAL_ACTIVATOR = '[data-test-subj="open-value-lists-modal-button"]'; +export const VALUE_LISTS_TABLE = '[data-test-subj="value-lists-table"]'; +export const VALUE_LISTS_ROW = '.euiTableRow'; +export const VALUE_LIST_FILE_PICKER = '[data-test-subj="value-list-file-picker"]'; +export const VALUE_LIST_FILE_UPLOAD_BUTTON = '[data-test-subj="value-lists-form-import-action"]'; diff --git a/x-pack/plugins/security_solution/cypress/support/commands.js b/x-pack/plugins/security_solution/cypress/support/commands.js index 8b75f068a53da..789759643e319 100644 --- a/x-pack/plugins/security_solution/cypress/support/commands.js +++ b/x-pack/plugins/security_solution/cypress/support/commands.js @@ -39,3 +39,22 @@ Cypress.Commands.add('stubSecurityApi', function (dataFileName) { cy.fixture(dataFileName).as(`${dataFileName}JSON`); cy.route('POST', 'api/solutions/security/graphql', `@${dataFileName}JSON`); }); + +Cypress.Commands.add( + 'attachFile', + { + prevSubject: 'element', + }, + (input, fileName, fileType = 'text/plain') => { + cy.fixture(fileName) + .then((content) => Cypress.Blob.base64StringToBlob(content, fileType)) + .then((blob) => { + const testFile = new File([blob], fileName, { type: fileType }); + const dataTransfer = new DataTransfer(); + + dataTransfer.items.add(testFile); + input[0].files = dataTransfer.files; + return input; + }); + } +); diff --git a/x-pack/plugins/security_solution/cypress/support/index.d.ts b/x-pack/plugins/security_solution/cypress/support/index.d.ts index 12c11ffd27750..906e526e2c4a0 100644 --- a/x-pack/plugins/security_solution/cypress/support/index.d.ts +++ b/x-pack/plugins/security_solution/cypress/support/index.d.ts @@ -7,5 +7,6 @@ declare namespace Cypress { interface Chainable { stubSecurityApi(dataFileName: string): Chainable; + attachFile(fileName: string, fileType?: string): Chainable; } } diff --git a/x-pack/plugins/security_solution/cypress/tasks/lists.ts b/x-pack/plugins/security_solution/cypress/tasks/lists.ts new file mode 100644 index 0000000000000..638c69c087adf --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/tasks/lists.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + VALUE_LISTS_MODAL_ACTIVATOR, + VALUE_LIST_FILE_PICKER, + VALUE_LIST_FILE_UPLOAD_BUTTON, +} from '../screens/lists'; + +export const waitForListsIndexToBeCreated = () => { + cy.request({ url: '/api/lists/index', retryOnStatusCodeFailure: true }).then((response) => { + if (response.status !== 200) { + cy.wait(7500); + } + }); +}; + +export const waitForValueListsModalToBeLoaded = () => { + cy.get(VALUE_LISTS_MODAL_ACTIVATOR).should('exist'); + cy.get(VALUE_LISTS_MODAL_ACTIVATOR).should('not.be.disabled'); +}; + +export const openValueListsModal = () => { + cy.get(VALUE_LISTS_MODAL_ACTIVATOR).click(); +}; + +export const selectValueListsFile = () => { + cy.get(VALUE_LIST_FILE_PICKER).attachFile('value_list.txt').trigger('change', { force: true }); +}; + +export const uploadValueList = () => { + cy.get(VALUE_LIST_FILE_UPLOAD_BUTTON).click(); +}; diff --git a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/form.tsx b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/form.tsx index aab665289e80d..c35cc612129d5 100644 --- a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/form.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/form.tsx @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback, useState, ReactNode, useEffect, useRef } from 'react'; -import styled from 'styled-components'; +import React, { useCallback, useState, useEffect, useRef } from 'react'; import { EuiButton, EuiButtonEmpty, @@ -14,34 +13,30 @@ import { EuiFilePicker, EuiFlexGroup, EuiFlexItem, - EuiRadioGroup, + EuiSelect, + EuiSelectOption, } from '@elastic/eui'; import { useImportList, ListSchema, Type } from '../../../shared_imports'; import * as i18n from './translations'; import { useKibana } from '../../../common/lib/kibana'; -const InlineRadioGroup = styled(EuiRadioGroup)` - display: flex; - - .euiRadioGroup__item + .euiRadioGroup__item { - margin: 0 0 0 12px; - } -`; - -interface ListTypeOptions { - id: Type; - label: ReactNode; -} - -const options: ListTypeOptions[] = [ +const options: EuiSelectOption[] = [ { - id: 'keyword', - label: i18n.KEYWORDS_RADIO, + value: 'keyword', + text: i18n.KEYWORDS_RADIO, }, { - id: 'ip', - label: i18n.IP_RADIO, + value: 'ip', + text: i18n.IP_RADIO, + }, + { + value: 'ip_range', + text: i18n.IP_RANGE_RADIO, + }, + { + value: 'text', + text: i18n.TEXT_RADIO, }, ]; @@ -63,8 +58,10 @@ export const ValueListsFormComponent: React.FC = ({ onError const fileIsValid = !file || validFileTypes.some((fileType) => file.type === fileType); - // EuiRadioGroup's onChange only infers 'string' from our options - const handleRadioChange = useCallback((t: string) => setType(t as Type), [setType]); + const handleRadioChange = useCallback( + (event: React.ChangeEvent) => setType(event.target.value as Type), + [setType] + ); const handleFileChange = useCallback((files: FileList | null) => { setFile(files?.item(0) ?? null); @@ -133,6 +130,7 @@ export const ValueListsFormComponent: React.FC = ({ onError > = ({ onError - - + {importState.loading && ( diff --git a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table.tsx b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table.tsx index 850716ce54e26..a2e3b73a0abf0 100644 --- a/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/value_lists_management_modal/table.tsx @@ -35,6 +35,7 @@ export const ValueListsTableComponent: React.FC = ({

{i18n.TABLE_TITLE}

{ )} Date: Mon, 27 Jul 2020 18:12:32 +0200 Subject: [PATCH 014/126] [code coverage] add iframe embedded and enterprise search tests (#73267) --- x-pack/scripts/functional_tests.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/scripts/functional_tests.js b/x-pack/scripts/functional_tests.js index ee8af9e040401..c568b92e85515 100644 --- a/x-pack/scripts/functional_tests.js +++ b/x-pack/scripts/functional_tests.js @@ -10,6 +10,8 @@ const alwaysImportedTests = [ require.resolve('../test/functional_with_es_ssl/config.ts'), require.resolve('../test/functional/config_security_basic.ts'), require.resolve('../test/functional/config_security_trial.ts'), + require.resolve('../test/functional_embedded/config.ts'), + require.resolve('../test/functional_enterprise_search/without_host_configured.config.ts'), ]; const onlyNotInCoverageTests = [ require.resolve('../test/api_integration/config_security_basic.ts'), @@ -51,9 +53,7 @@ const onlyNotInCoverageTests = [ require.resolve('../test/licensing_plugin/config.legacy.ts'), require.resolve('../test/endpoint_api_integration_no_ingest/config.ts'), require.resolve('../test/reporting_api_integration/config.js'), - require.resolve('../test/functional_embedded/config.ts'), require.resolve('../test/ingest_manager_api_integration/config.ts'), - require.resolve('../test/functional_enterprise_search/without_host_configured.config.ts'), ]; require('@kbn/plugin-helpers').babelRegister(); From d9a646113cbd3c520df571b5eaa91364626f6272 Mon Sep 17 00:00:00 2001 From: Pete Harverson Date: Mon, 27 Jul 2020 17:36:05 +0100 Subject: [PATCH 015/126] [ML] Fixes raw data drilldowns for Apache, Nginx, Auditbeat modules (#73280) --- .../modules/apache_ecs/ml/low_request_rate_ecs.json | 4 ++-- .../apache_ecs/ml/source_ip_request_rate_ecs.json | 10 ++++------ .../apache_ecs/ml/source_ip_url_count_ecs.json | 10 ++++------ .../modules/apache_ecs/ml/status_code_rate_ecs.json | 11 ++++------- .../modules/apache_ecs/ml/visitor_rate_ecs.json | 4 ++-- .../ml/docker_high_count_process_events_ecs.json | 7 ++----- .../ml/docker_rare_process_activity_ecs.json | 7 ++----- .../ml/hosts_high_count_process_events_ecs.json | 7 ++----- .../ml/hosts_rare_process_activity_ecs.json | 7 ++----- .../modules/nginx_ecs/ml/low_request_rate_ecs.json | 4 ++-- .../nginx_ecs/ml/source_ip_request_rate_ecs.json | 10 ++++------ .../modules/nginx_ecs/ml/source_ip_url_count_ecs.json | 10 ++++------ .../modules/nginx_ecs/ml/status_code_rate_ecs.json | 11 ++++------- .../modules/nginx_ecs/ml/visitor_rate_ecs.json | 4 ++-- 14 files changed, 40 insertions(+), 66 deletions(-) diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/low_request_rate_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/low_request_rate_ecs.json index d6d3879e8300f..5950d088d49e2 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/low_request_rate_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/low_request_rate_ecs.json @@ -1,7 +1,7 @@ { "groups": ["apache"], "description": "HTTP Access Logs: Detect low request rates (ECS)", - "analysis_config" : { + "analysis_config": { "bucket_span": "15m", "summary_count_field_name": "doc_count", "detectors": [ @@ -27,7 +27,7 @@ "custom_urls": [ { "url_name": "Raw data", - "url_value": "discover#/ml_http_access_filebeat_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027apache.access\u0027),type:phrase,value:\u0027apache.access\u0027),query:(match:(event.dataset:(query:\u0027apache.access\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027apache.access\u0027),type:phrase,value:\u0027apache.access\u0027),query:(match:(event.dataset:(query:\u0027apache.access\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" } ] } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/source_ip_request_rate_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/source_ip_request_rate_ecs.json index 876b89b03952f..f888e4d44c844 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/source_ip_request_rate_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/source_ip_request_rate_ecs.json @@ -1,18 +1,16 @@ { "groups": ["apache"], "description": "HTTP Access Logs: Detect unusual source IPs - high request rates (ECS)", - "analysis_config" : { + "analysis_config": { "bucket_span": "1h", "detectors": [ - { + { "detector_description": "Apache access source IP high count", "function": "high_count", "over_field_name": "source.address" } ], - "influencers": [ - "source.address" - ] + "influencers": ["source.address"] }, "data_description": { "time_field": "@timestamp", @@ -27,7 +25,7 @@ }, { "url_name": "Raw data", - "url_value": "discover#/ml_http_access_filebeat_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027apache.access\u0027),type:phrase,value:\u0027apache.access\u0027),query:(match:(event.dataset:(query:\u0027apache.access\u0027,type:phrase)))),(\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:source.address,negate:!f,params:(query:\u0027$source.address$\u0027),type:phrase,value:\u0027$source.address$\u0027),query:(match:(source.address:(query:\u0027$source.address$\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027apache.access\u0027),type:phrase,value:\u0027apache.access\u0027),query:(match:(event.dataset:(query:\u0027apache.access\u0027,type:phrase)))),(\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:source.address,negate:!f,params:(query:\u0027$source.address$\u0027),type:phrase,value:\u0027$source.address$\u0027),query:(match:(source.address:(query:\u0027$source.address$\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" } ] } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/source_ip_url_count_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/source_ip_url_count_ecs.json index 810c61073ecc6..e4886b531ba42 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/source_ip_url_count_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/source_ip_url_count_ecs.json @@ -1,19 +1,17 @@ { "groups": ["apache"], "description": "HTTP Access Logs: Detect unusual source IPs - high distinct count of URLs (ECS)", - "analysis_config" : { + "analysis_config": { "bucket_span": "1h", "detectors": [ - { + { "detector_description": "Apache access source IP high dc URL", "function": "high_distinct_count", "field_name": "url.original", "over_field_name": "source.address" } ], - "influencers": [ - "source.address" - ] + "influencers": ["source.address"] }, "data_description": { "time_field": "@timestamp", @@ -28,7 +26,7 @@ }, { "url_name": "Raw data", - "url_value": "discover#/ml_http_access_filebeat_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027apache.access\u0027),type:phrase,value:\u0027apache.access\u0027),query:(match:(event.dataset:(query:\u0027apache.access\u0027,type:phrase)))),(\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:source.address,negate:!f,params:(query:\u0027$source.address$\u0027),type:phrase,value:\u0027$source.address$\u0027),query:(match:(source.address:(query:\u0027$source.address$\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027apache.access\u0027),type:phrase,value:\u0027apache.access\u0027),query:(match:(event.dataset:(query:\u0027apache.access\u0027,type:phrase)))),(\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:source.address,negate:!f,params:(query:\u0027$source.address$\u0027),type:phrase,value:\u0027$source.address$\u0027),query:(match:(source.address:(query:\u0027$source.address$\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" } ] } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/status_code_rate_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/status_code_rate_ecs.json index a9341e43723a6..ac5bd5e478c16 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/status_code_rate_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/status_code_rate_ecs.json @@ -1,19 +1,16 @@ { "groups": ["apache"], "description": "HTTP Access Logs: Detect unusual status code rates (ECS)", - "analysis_config" : { + "analysis_config": { "bucket_span": "15m", "detectors": [ - { + { "detector_description": "Apache access status code rate", "function": "count", "partition_field_name": "http.response.status_code" } ], - "influencers": [ - "http.response.status_code", - "source.address" - ] + "influencers": ["http.response.status_code", "source.address"] }, "analysis_limits": { "model_memory_limit": "100mb" @@ -34,7 +31,7 @@ }, { "url_name": "Raw data", - "url_value": "discover#/ml_http_access_filebeat_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027apache.access\u0027),type:phrase,value:\u0027apache.access\u0027),query:(match:(event.dataset:(query:\u0027apache.access\u0027,type:phrase)))),(\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:http.response.status_code,negate:!f,params:(query:\u0027$http.response.status_code$\u0027),type:phrase,value:\u0027$http.response.status_code$\u0027),query:(match:(http.response.status_code:(query:\u0027$http.response.status_code$\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027apache.access\u0027),type:phrase,value:\u0027apache.access\u0027),query:(match:(event.dataset:(query:\u0027apache.access\u0027,type:phrase)))),(\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:http.response.status_code,negate:!f,params:(query:\u0027$http.response.status_code$\u0027),type:phrase,value:\u0027$http.response.status_code$\u0027),query:(match:(http.response.status_code:(query:\u0027$http.response.status_code$\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" } ] } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/visitor_rate_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/visitor_rate_ecs.json index 5bc641315bc3f..f513e53a964f3 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/visitor_rate_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/apache_ecs/ml/visitor_rate_ecs.json @@ -1,7 +1,7 @@ { "groups": ["apache"], "description": "HTTP Access Logs: Detect unusual visitor rates (ECS)", - "analysis_config" : { + "analysis_config": { "bucket_span": "15m", "summary_count_field_name": "dc_source_address", "detectors": [ @@ -27,7 +27,7 @@ "custom_urls": [ { "url_name": "Raw data", - "url_value": "discover#/ml_http_access_filebeat_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027apache.access\u0027),type:phrase,value:\u0027apache.access\u0027),query:(match:(event.dataset:(query:\u0027apache.access\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027apache.access\u0027),type:phrase,value:\u0027apache.access\u0027),query:(match:(event.dataset:(query:\u0027apache.access\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" } ] } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_high_count_process_events_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_high_count_process_events_ecs.json index 27949c76b3e13..046736b6f5559 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_high_count_process_events_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_high_count_process_events_ecs.json @@ -11,10 +11,7 @@ "partition_field_name": "container.name" } ], - "influencers": [ - "container.name", - "process.executable" - ] + "influencers": ["container.name", "process.executable"] }, "analysis_limits": { "model_memory_limit": "256mb", @@ -35,7 +32,7 @@ { "url_name": "Raw data", "time_range": "1h", - "url_value": "discover#/ml_auditbeat_docker_process_events_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(index:\u0027INDEX_PATTERN_ID\u0027,query:(language:kuery,query:\u0027container.name:\u0022$container.name$\u0022\u0027))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(index:\u0027INDEX_PATTERN_ID\u0027,query:(language:kuery,query:\u0027container.name:\u0022$container.name$\u0022\u0027))" } ] } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_rare_process_activity_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_rare_process_activity_ecs.json index 899518f30f7a3..ab405d47484d9 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_rare_process_activity_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_rare_process_activity_ecs.json @@ -12,10 +12,7 @@ "partition_field_name": "container.name" } ], - "influencers": [ - "container.name", - "process.executable" - ] + "influencers": ["container.name", "process.executable"] }, "analysis_limits": { "model_memory_limit": "256mb" @@ -35,7 +32,7 @@ { "url_name": "Raw data", "time_range": "1h", - "url_value": "discover#/ml_auditbeat_docker_process_events_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(index:\u0027INDEX_PATTERN_ID\u0027,query:(language:kuery,query:\u0027container.name:\u0022$container.name$\u0022 AND process.executable:\u0022$process.executable$\u0022\u0027))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(index:\u0027INDEX_PATTERN_ID\u0027,query:(language:kuery,query:\u0027container.name:\u0022$container.name$\u0022 AND process.executable:\u0022$process.executable$\u0022\u0027))" } ] } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_high_count_process_events_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_high_count_process_events_ecs.json index 1664e19096ee3..192842309dd92 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_high_count_process_events_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_high_count_process_events_ecs.json @@ -11,10 +11,7 @@ "partition_field_name": "host.name" } ], - "influencers": [ - "host.name", - "process.executable" - ] + "influencers": ["host.name", "process.executable"] }, "analysis_limits": { "model_memory_limit": "256mb" @@ -34,7 +31,7 @@ { "url_name": "Raw data", "time_range": "1h", - "url_value": "discover#/ml_auditbeat_hosts_process_events_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(index:\u0027INDEX_PATTERN_ID\u0027,query:(language:kuery,query:\u0027host.name:\u0022$host.name$\u0022\u0027))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(index:\u0027INDEX_PATTERN_ID\u0027,query:(language:kuery,query:\u0027host.name:\u0022$host.name$\u0022\u0027))" } ] } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_rare_process_activity_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_rare_process_activity_ecs.json index d83f36db5a491..9448537b387c2 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_rare_process_activity_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_rare_process_activity_ecs.json @@ -12,10 +12,7 @@ "partition_field_name": "host.name" } ], - "influencers": [ - "host.name", - "process.executable" - ] + "influencers": ["host.name", "process.executable"] }, "analysis_limits": { "model_memory_limit": "256mb" @@ -35,7 +32,7 @@ { "url_name": "Raw data", "time_range": "1h", - "url_value": "discover#/ml_auditbeat_hosts_process_events_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(index:\u0027INDEX_PATTERN_ID\u0027,query:(language:kuery,query:\u0027host.name:\u0022$host.name$\u0022 AND process.executable:\u0022$process.executable$\u0022\u0027))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(index:\u0027INDEX_PATTERN_ID\u0027,query:(language:kuery,query:\u0027host.name:\u0022$host.name$\u0022 AND process.executable:\u0022$process.executable$\u0022\u0027))" } ] } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/low_request_rate_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/low_request_rate_ecs.json index 54c2f540e334f..3dfe04766a9e9 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/low_request_rate_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/low_request_rate_ecs.json @@ -1,7 +1,7 @@ { "groups": ["nginx"], "description": "HTTP Access Logs: Detect low request rates (ECS)", - "analysis_config" : { + "analysis_config": { "bucket_span": "15m", "summary_count_field_name": "doc_count", "detectors": [ @@ -27,7 +27,7 @@ "custom_urls": [ { "url_name": "Raw data", - "url_value": "discover#/ml_http_access_filebeat_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027nginx.access\u0027),type:phrase,value:\u0027nginx.access\u0027),query:(match:(event.dataset:(query:\u0027nginx.access\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027nginx.access\u0027),type:phrase,value:\u0027nginx.access\u0027),query:(match:(event.dataset:(query:\u0027nginx.access\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" } ] } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/source_ip_request_rate_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/source_ip_request_rate_ecs.json index 6fc7ce7e0699d..209b4e66dbac4 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/source_ip_request_rate_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/source_ip_request_rate_ecs.json @@ -1,18 +1,16 @@ { "groups": ["nginx"], "description": "HTTP Access Logs: Detect unusual source IPs - high request rates (ECS)", - "analysis_config" : { + "analysis_config": { "bucket_span": "1h", "detectors": [ - { + { "detector_description": "Nginx access source IP high count", "function": "high_count", "over_field_name": "source.address" } ], - "influencers": [ - "source.address" - ] + "influencers": ["source.address"] }, "data_description": { "time_field": "@timestamp", @@ -27,7 +25,7 @@ }, { "url_name": "Raw data", - "url_value": "discover#/ml_http_access_filebeat_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027nginx.access\u0027),type:phrase,value:\u0027nginx.access\u0027),query:(match:(event.dataset:(query:\u0027nginx.access\u0027,type:phrase)))),(\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:source.address,negate:!f,params:(query:\u0027$source.address$\u0027),type:phrase,value:\u0027$source.address$\u0027),query:(match:(source.address:(query:\u0027$source.address$\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027nginx.access\u0027),type:phrase,value:\u0027nginx.access\u0027),query:(match:(event.dataset:(query:\u0027nginx.access\u0027,type:phrase)))),(\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:source.address,negate:!f,params:(query:\u0027$source.address$\u0027),type:phrase,value:\u0027$source.address$\u0027),query:(match:(source.address:(query:\u0027$source.address$\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" } ] } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/source_ip_url_count_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/source_ip_url_count_ecs.json index 1c3f9f96a36b4..dea65ef701cb1 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/source_ip_url_count_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/source_ip_url_count_ecs.json @@ -1,19 +1,17 @@ { "groups": ["nginx"], "description": "HTTP Access Logs: Detect unusual source IPs - high distinct count of URLs (ECS)", - "analysis_config" : { + "analysis_config": { "bucket_span": "1h", "detectors": [ - { + { "detector_description": "Nginx access source IP high dc URL", "function": "high_distinct_count", "field_name": "url.original", "over_field_name": "source.address" } ], - "influencers": [ - "source.address" - ] + "influencers": ["source.address"] }, "data_description": { "time_field": "@timestamp", @@ -28,7 +26,7 @@ }, { "url_name": "Raw data", - "url_value": "discover#/ml_http_access_filebeat_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027nginx.access\u0027),type:phrase,value:\u0027nginx.access\u0027),query:(match:(event.dataset:(query:\u0027nginx.access\u0027,type:phrase)))),(\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:source.address,negate:!f,params:(query:\u0027$source.address$\u0027),type:phrase,value:\u0027$source.address$\u0027),query:(match:(source.address:(query:\u0027$source.address$\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027nginx.access\u0027),type:phrase,value:\u0027nginx.access\u0027),query:(match:(event.dataset:(query:\u0027nginx.access\u0027,type:phrase)))),(\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:source.address,negate:!f,params:(query:\u0027$source.address$\u0027),type:phrase,value:\u0027$source.address$\u0027),query:(match:(source.address:(query:\u0027$source.address$\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" } ] } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/status_code_rate_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/status_code_rate_ecs.json index df917ed43c5fa..2475b33aa24f2 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/status_code_rate_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/status_code_rate_ecs.json @@ -1,19 +1,16 @@ { "groups": ["nginx"], "description": "HTTP Access Logs: Detect unusual status code rates (ECS)", - "analysis_config" : { + "analysis_config": { "bucket_span": "15m", "detectors": [ - { + { "detector_description": "Nginx access status code rate", "function": "count", "partition_field_name": "http.response.status_code" } ], - "influencers": [ - "http.response.status_code", - "source.address" - ] + "influencers": ["http.response.status_code", "source.address"] }, "analysis_limits": { "model_memory_limit": "100mb" @@ -34,7 +31,7 @@ }, { "url_name": "Raw data", - "url_value": "discover#/ml_http_access_filebeat_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027nginx.access\u0027),type:phrase,value:\u0027nginx.access\u0027),query:(match:(event.dataset:(query:\u0027nginx.access\u0027,type:phrase)))),(\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:http.response.status_code,negate:!f,params:(query:\u0027$http.response.status_code$\u0027),type:phrase,value:\u0027$http.response.status_code$\u0027),query:(match:(http.response.status_code:(query:\u0027$http.response.status_code$\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027nginx.access\u0027),type:phrase,value:\u0027nginx.access\u0027),query:(match:(event.dataset:(query:\u0027nginx.access\u0027,type:phrase)))),(\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:http.response.status_code,negate:!f,params:(query:\u0027$http.response.status_code$\u0027),type:phrase,value:\u0027$http.response.status_code$\u0027),query:(match:(http.response.status_code:(query:\u0027$http.response.status_code$\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" } ] } diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/visitor_rate_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/visitor_rate_ecs.json index 5ff35a7e2aed7..3182ac3fd3a79 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/visitor_rate_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/nginx_ecs/ml/visitor_rate_ecs.json @@ -1,7 +1,7 @@ { "groups": ["nginx"], "description": "HTTP Access Logs: Detect unusual visitor rates (ECS)", - "analysis_config" : { + "analysis_config": { "bucket_span": "15m", "summary_count_field_name": "dc_source_address", "detectors": [ @@ -27,7 +27,7 @@ "custom_urls": [ { "url_name": "Raw data", - "url_value": "discover#/ml_http_access_filebeat_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027nginx.access\u0027),type:phrase,value:\u0027nginx.access\u0027),query:(match:(event.dataset:(query:\u0027nginx.access\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" + "url_value": "discover#/?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(columns:!(_source),filters:!((\u0027$state\u0027:(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.dataset,negate:!f,params:(query:\u0027nginx.access\u0027),type:phrase,value:\u0027nginx.access\u0027),query:(match:(event.dataset:(query:\u0027nginx.access\u0027,type:phrase))))),index:\u0027INDEX_PATTERN_ID\u0027,interval:auto,query:(language:kuery,query:\u0027\u0027),sort:!(\u0027@timestamp\u0027,desc))" } ] } From 46dcc0bd4929b406ec01012a4465f1f3d892ea67 Mon Sep 17 00:00:00 2001 From: Katrin Freihofner Date: Mon, 27 Jul 2020 19:10:03 +0200 Subject: [PATCH 016/126] Adds styling changes to uptime overview and details page (#71840) Co-authored-by: Elastic Machine --- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - .../ping_histogram.test.tsx.snap | 9 ++- .../common/charts/duration_chart.tsx | 7 +-- .../common/charts/ping_histogram.tsx | 9 +-- .../ml_integerations.test.tsx.snap | 6 +- .../__snapshots__/ml_manage_job.test.tsx.snap | 6 +- .../components/monitor/ml/manage_ml_job.tsx | 10 ++-- .../components/monitor/monitor_charts.tsx | 2 +- .../monitor_duration/monitor_duration.tsx | 9 +-- .../__snapshots__/ping_list.test.tsx.snap | 2 +- .../monitor/ping_list/ping_list.tsx | 2 +- .../monitor_status.bar.test.tsx.snap | 10 ++-- .../status_by_location.test.tsx.snap | 58 ++++++++----------- .../status_bar/status_by_location.tsx | 10 ++-- .../__snapshots__/monitor_list.test.tsx.snap | 47 +++++---------- .../monitor_list/monitor_list_header.tsx | 38 ++++-------- 17 files changed, 90 insertions(+), 137 deletions(-) diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 8baebbb4939be..cf79f463b35cb 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -16283,7 +16283,6 @@ "xpack.uptime.ml.enableAnomalyDetectionPanel.manageMLJobDescription.noteText": "注:ジョブが結果の計算を開始するまでに少し時間がかかる場合があります。", "xpack.uptime.ml.enableAnomalyDetectionPanel.startTrial": "無料の 14 日トライアルを開始", "xpack.uptime.ml.enableAnomalyDetectionPanel.startTrialDesc": "期間異常検知機能を利用するには、Elastic Platinum ライセンスが必要です。", - "xpack.uptime.monitorCharts.durationChart.bottomAxis.title": "タイムスタンプ", "xpack.uptime.monitorCharts.durationChart.leftAxis.title": "期間ms", "xpack.uptime.monitorCharts.monitorDuration.titleLabel": "監視期間", "xpack.uptime.monitorCharts.monitorDuration.titleLabelWithAnomaly": "監視期間 (異常: {noOfAnomalies})", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 5b81804faf715..b45fe1baa9e9a 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -16290,7 +16290,6 @@ "xpack.uptime.ml.enableAnomalyDetectionPanel.manageMLJobDescription.noteText": "注意:可能要过几分钟后,作业才会开始计算结果。", "xpack.uptime.ml.enableAnomalyDetectionPanel.startTrial": "开始为期 14 天的免费试用", "xpack.uptime.ml.enableAnomalyDetectionPanel.startTrialDesc": "要访问持续时间异常检测,必须订阅 Elastic 白金级许可证。", - "xpack.uptime.monitorCharts.durationChart.bottomAxis.title": "鏃堕棿鎴", "xpack.uptime.monitorCharts.durationChart.leftAxis.title": "持续时间 (ms)", "xpack.uptime.monitorCharts.monitorDuration.titleLabel": "监测持续时间(毫秒)", "xpack.uptime.monitorCharts.monitorDuration.titleLabelWithAnomaly": "监测持续时间(异常:{noOfAnomalies})", diff --git a/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/ping_histogram.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/ping_histogram.test.tsx.snap index fe20071ced4cb..7fdb2e4ede75b 100644 --- a/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/ping_histogram.test.tsx.snap +++ b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/ping_histogram.test.tsx.snap @@ -2,11 +2,14 @@ exports[`PingHistogram component renders the component without errors 1`] = ` Array [ -

Pings over time -

, + , +
,
getTickFormat(d)} title={i18n.translate('xpack.uptime.monitorCharts.durationChart.leftAxis.title', { - defaultMessage: 'Duration ms', + defaultMessage: 'Duration in ms', })} /> diff --git a/x-pack/plugins/uptime/public/components/common/charts/ping_histogram.tsx b/x-pack/plugins/uptime/public/components/common/charts/ping_histogram.tsx index d5f3b1b164ad9..39b8a38f60982 100644 --- a/x-pack/plugins/uptime/public/components/common/charts/ping_histogram.tsx +++ b/x-pack/plugins/uptime/public/components/common/charts/ping_histogram.tsx @@ -13,7 +13,7 @@ import { timeFormatter, BrushEndListener, } from '@elastic/charts'; -import { EuiTitle } from '@elastic/eui'; +import { EuiTitle, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { useContext } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -173,14 +173,15 @@ export const PingHistogramComponent: React.FC = ({ return ( <> - -

+ +

-

+

+ {content} ); diff --git a/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap index 24c4e818a0592..15f5c03512bf1 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap +++ b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap @@ -8,18 +8,18 @@ exports[`ML Integrations renders without errors 1`] = ` class="euiPopover__anchor" >
,
-

- Down in 2 Locations -

-
+ Down in 2 locations + `; exports[`StatusByLocation component renders properly against props 1`] = ` - +

-
+ `; exports[`StatusByLocation component renders when down in some locations 1`] = ` -
-

- Down in 1/2 Locations -

-
+ Down in 1/2 locations + `; exports[`StatusByLocation component renders when only one location and it is down 1`] = ` -
-

- Down in 1 Location -

-
+ Down in 1 location + `; exports[`StatusByLocation component renders when only one location and it is up 1`] = ` -
-

- Up in 1 Location -

-
+ Up in 1 location + `; exports[`StatusByLocation component renders when up in all locations 1`] = ` -
-

- Up in 2 Locations -

-
+ Up in 2 locations + `; diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_by_location.tsx b/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_by_location.tsx index 461ffc10124fd..fb2a55bb4059b 100644 --- a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_by_location.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_by_location.tsx @@ -5,7 +5,7 @@ */ import React from 'react'; -import { EuiText } from '@elastic/eui'; +import { EuiTitle } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { MonitorLocation } from '../../../../../common/runtime_types'; @@ -43,7 +43,7 @@ export const StatusByLocations = ({ locations }: StatusByLocationsProps) => { } return ( - +

{locations.length <= 1 ? ( { status, loc: statusMessage, }} - defaultMessage="{status} in {loc} Location" + defaultMessage="{status} in {loc} location" /> ) : ( { status, loc: statusMessage, }} - defaultMessage="{status} in {loc} Locations" + defaultMessage="{status} in {loc} locations" /> )}

-
+ ); }; diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list.test.tsx.snap index b6ce1eceb62a7..42ac821c10c7a 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list.test.tsx.snap +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list.test.tsx.snap @@ -813,7 +813,13 @@ exports[`MonitorList component renders the monitor list 1`] = ` } .c1 { - margin-left: auto; + position: absolute; + right: 16px; + top: 16px; +} + +.c0 { + position: relative; } .c4 { @@ -828,26 +834,6 @@ exports[`MonitorList component renders the monitor list 1`] = ` } } -@media only screen and (max-width:768px) { - .c0.c0 > :first-child { - -webkit-flex-basis: 40% !important; - -ms-flex-preferred-size: 40% !important; - flex-basis: 40% !important; - } - - .c0.c0 > :nth-child(2) { - -webkit-order: 3; - -ms-flex-order: 3; - order: 3; - } - - .c0.c0 > :nth-child(3) { - -webkit-flex-basis: 60% !important; - -ms-flex-preferred-size: 60% !important; - flex-basis: 60% !important; - } -} -
@@ -936,20 +922,13 @@ exports[`MonitorList component renders the monitor list 1`] = `
-
+ Certificates status +