From b76da4e5b21576007867554a1c1e10e261dd68b8 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Mon, 21 Oct 2024 11:39:37 +0300 Subject: [PATCH 01/69] [ResponseOps][Connectors] Make the case action GA (#196972) ## Summary This PR makes the Case action GA. Fixes: https://github.com/elastic/kibana/issues/196973 ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels) - [x] This will appear in the **Release Notes** and follow the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) ## Release note The case action is now GA. --- .../cases/public/components/system_actions/cases/cases.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/cases/public/components/system_actions/cases/cases.tsx b/x-pack/plugins/cases/public/components/system_actions/cases/cases.tsx index 0506b2069a3c4..e00c4bd2d5ccd 100644 --- a/x-pack/plugins/cases/public/components/system_actions/cases/cases.tsx +++ b/x-pack/plugins/cases/public/components/system_actions/cases/cases.tsx @@ -30,7 +30,7 @@ export function getConnectorType(): ConnectorTypeModel<{}, {}, CasesActionParams selectMessage: i18n.CASE_ACTION_DESC, actionTypeTitle: CASES_CONNECTOR_TITLE, actionConnectorFields: null, - isExperimental: true, + isExperimental: false, validateParams: async ( actionParams: CasesActionParams ): Promise> => { From ad916685fc2fb8581678043efd330a679a0a8f06 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Mon, 21 Oct 2024 19:44:31 +1100 Subject: [PATCH 02/69] [ES|QL] Update function metadata (#196993) This PR updates the function definitions and inline docs based on the latest metadata from Elasticsearch. --------- Co-authored-by: Stratoula Kalafateli --- .../autocomplete.suggest.eval.test.ts | 4 +- .../definitions/generated/scalar_functions.ts | 82 ++++++++++++++++++- .../sections/generated/scalar_functions.tsx | 69 ++++++++++++++++ 3 files changed, 151 insertions(+), 4 deletions(-) diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts index cc04ccb407e6e..dcb6fe76f184b 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.eval.test.ts @@ -363,8 +363,8 @@ describe('autocomplete.suggest', () => { // // Test suggestions for each possible param, within each signature variation, for each function for (const fn of scalarFunctionDefinitions) { // skip this fn for the moment as it's quite hard to test - // if (!['bucket', 'date_extract', 'date_diff', 'case'].includes(fn.name)) { - if (!['bucket', 'date_extract', 'date_diff', 'case'].includes(fn.name)) { + // Add match in the text when the autocomplete is ready https://github.com/elastic/kibana/issues/196995 + if (!['bucket', 'date_extract', 'date_diff', 'case', 'match'].includes(fn.name)) { test(`${fn.name}`, async () => { const testedCases = new Set(); diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/generated/scalar_functions.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/generated/scalar_functions.ts index ea5f8f86e1909..2ace3e9ddc537 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/generated/scalar_functions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/generated/scalar_functions.ts @@ -3209,6 +3209,85 @@ const ltrimDefinition: FunctionDefinition = { ], }; +// Do not edit this manually... generated by scripts/generate_function_definitions.ts +const matchDefinition: FunctionDefinition = { + type: 'eval', + name: 'match', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.match', { + defaultMessage: + 'Performs a match query on the specified field. Returns true if the provided query matches the row.', + }), + alias: undefined, + signatures: [ + { + params: [ + { + name: 'field', + type: 'keyword', + optional: false, + }, + { + name: 'query', + type: 'keyword', + optional: false, + }, + ], + returnType: 'boolean', + }, + { + params: [ + { + name: 'field', + type: 'keyword', + optional: false, + }, + { + name: 'query', + type: 'text', + optional: false, + }, + ], + returnType: 'boolean', + }, + { + params: [ + { + name: 'field', + type: 'text', + optional: false, + }, + { + name: 'query', + type: 'keyword', + optional: false, + }, + ], + returnType: 'boolean', + }, + { + params: [ + { + name: 'field', + type: 'text', + optional: false, + }, + { + name: 'query', + type: 'text', + optional: false, + }, + ], + returnType: 'boolean', + }, + ], + supportedCommands: ['stats', 'inlinestats', 'metrics', 'eval', 'where', 'row', 'sort'], + supportedOptions: ['by'], + validate: undefined, + examples: [ + 'from books \n| where match(author, "Faulkner")\n| keep book_no, author \n| sort book_no \n| limit 5;', + ], +}; + // Do not edit this manually... generated by scripts/generate_function_definitions.ts const mvAppendDefinition: FunctionDefinition = { type: 'eval', @@ -5770,8 +5849,6 @@ const qstrDefinition: FunctionDefinition = { defaultMessage: 'Performs a query string query. Returns true if the provided query string matches the row.', }), - ignoreAsSuggestion: true, - alias: undefined, signatures: [ { @@ -9077,6 +9154,7 @@ export const scalarFunctionDefinitions = [ logDefinition, log10Definition, ltrimDefinition, + matchDefinition, mvAppendDefinition, mvAvgDefinition, mvConcatDefinition, diff --git a/packages/kbn-language-documentation/src/sections/generated/scalar_functions.tsx b/packages/kbn-language-documentation/src/sections/generated/scalar_functions.tsx index 3b74c73cd2a9a..32e66931cedcd 100644 --- a/packages/kbn-language-documentation/src/sections/generated/scalar_functions.tsx +++ b/packages/kbn-language-documentation/src/sections/generated/scalar_functions.tsx @@ -1139,6 +1139,42 @@ export const functions = { | EVAL message = CONCAT("'", message, "'") | EVAL color = CONCAT("'", color, "'") \`\`\` + `, + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + ignoreTag: true, + } + )} + /> + ), + }, + // Do not edit manually... automatically generated by scripts/generate_esql_docs.ts + { + label: i18n.translate('languageDocumentation.documentationESQL.match', { + defaultMessage: 'MATCH', + }), + description: ( + + + ### MATCH + Performs a match query on the specified field. Returns true if the provided query matches the row. + + \`\`\` + from books + | where match(author, "Faulkner") + | keep book_no, author + | sort book_no + | limit 5; + \`\`\` `, description: 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', @@ -1801,6 +1837,39 @@ export const functions = { | EVAL result = POW(base, exponent) \`\`\` Note: It is still possible to overflow a double result here; in that case, null will be returned. + `, + description: + 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', + ignoreTag: true, + })} + /> + ), + }, + // Do not edit manually... automatically generated by scripts/generate_esql_docs.ts + { + label: i18n.translate('languageDocumentation.documentationESQL.qstr', { + defaultMessage: 'QSTR', + }), + description: ( + + + ### QSTR + Performs a query string query. Returns true if the provided query string matches the row. + + \`\`\` + from books + | where qstr("author: Faulkner") + | keep book_no, author + | sort book_no + | limit 5; + \`\`\` `, description: 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', From 498da89e272b01fa33bf31998d65de2254c9c56c Mon Sep 17 00:00:00 2001 From: Julian Gernun <17549662+jcger@users.noreply.github.com> Date: Mon, 21 Oct 2024 10:55:45 +0200 Subject: [PATCH 03/69] [Cases][Flaky Test] Memoize test provider (#195088) ## Summary - Memo as much as possible in the common component that mocks providers for the component tests in cases. - Also fixes an issue with fake jest timers in `utility_bar.test` --- .../public/common/mock/test_providers.tsx | 46 +++++++++---------- .../components/all_cases/utility_bar.test.tsx | 10 ++++ 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/x-pack/plugins/cases/public/common/mock/test_providers.tsx b/x-pack/plugins/cases/public/common/mock/test_providers.tsx index aef1024cc8afc..257ac4b1f8293 100644 --- a/x-pack/plugins/cases/public/common/mock/test_providers.tsx +++ b/x-pack/plugins/cases/public/common/mock/test_providers.tsx @@ -89,22 +89,20 @@ const TestProvidersComponent: React.FC = ({ }); const getFilesClient = mockGetFilesClient(); + const casesProviderValue = { + externalReferenceAttachmentTypeRegistry, + persistableStateAttachmentTypeRegistry, + features, + owner, + permissions, + getFilesClient, + }; return ( - + {children} @@ -170,23 +168,20 @@ export const createAppMockRenderer = ({ }); const getFilesClient = mockGetFilesClient(); - + const casesProviderValue = { + externalReferenceAttachmentTypeRegistry, + persistableStateAttachmentTypeRegistry, + features, + owner, + permissions, + releasePhase, + getFilesClient, + }; const AppWrapper: React.FC<{ children: React.ReactNode }> = ({ children }) => ( - + {children} @@ -195,10 +190,11 @@ export const createAppMockRenderer = ({ ); AppWrapper.displayName = 'AppWrapper'; + const memoizedAppWrapper = React.memo(AppWrapper); const render: UiRender = (ui, options) => { return reactRender(ui, { - wrapper: AppWrapper, + wrapper: memoizedAppWrapper, ...options, }); }; diff --git a/x-pack/plugins/cases/public/components/all_cases/utility_bar.test.tsx b/x-pack/plugins/cases/public/components/all_cases/utility_bar.test.tsx index bd72a460c8c71..63d8cd2e5faab 100644 --- a/x-pack/plugins/cases/public/components/all_cases/utility_bar.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/utility_bar.test.tsx @@ -41,7 +41,17 @@ describe('Severity form field', () => { showClearFiltersButton: false, }; + beforeAll(() => { + jest.useFakeTimers(); + }); + + afterAll(() => { + jest.useRealTimers(); + sessionStorage.removeItem(localStorageKey); + }); + beforeEach(() => { + jest.useFakeTimers(); // Workaround for timeout via https://github.com/testing-library/user-event/issues/833#issuecomment-1171452841 user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime, From 5eddb3967d2f661951dc98eae9817ae36d2e7a42 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Mon, 21 Oct 2024 11:05:20 +0200 Subject: [PATCH 04/69] [ES|QL] Enhance the recommended queries with the event rate option (#196803) ## Summary Adding another option to the recommended queries templates image --- .../autocomplete/recommended_queries/templates.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/recommended_queries/templates.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/recommended_queries/templates.ts index f910d3ba05a3b..6a3226c9dcc8f 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/recommended_queries/templates.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/recommended_queries/templates.ts @@ -100,6 +100,21 @@ export const getRecommendedQueries = ({ ), queryString: `${fromCommand}\n | WHERE ${timeField} <=?_tend and ${timeField} >?_tstart\n | STATS count = COUNT(*) BY \`Over time\` = BUCKET(${timeField}, 50, ?_tstart, ?_tend) // ?_tstart and ?_tend take the values of the time picker`, }, + { + label: i18n.translate( + 'kbn-esql-validation-autocomplete.recommendedQueries.eventRate.label', + { + defaultMessage: 'Calculate the event rate', + } + ), + description: i18n.translate( + 'kbn-esql-validation-autocomplete.recommendedQueries.eventRate.description', + { + defaultMessage: 'Event rate over time', + } + ), + queryString: `${fromCommand}\n | STATS count = COUNT(*), min_timestamp = MIN(${timeField}) // MIN(dateField) finds the earliest timestamp in the dataset.\n | EVAL event_rate = count / DATE_DIFF("seconds", min_timestamp, NOW()) // Calculates the event rate by dividing the total count of events by the time difference (in seconds) between the earliest event and the current time.\n | KEEP event_rate`, + }, { label: i18n.translate( 'kbn-esql-validation-autocomplete.recommendedQueries.lastHour.label', From 68b3267ca2f76d8de4fedef622608d8685e7eceb Mon Sep 17 00:00:00 2001 From: florent-leborgne Date: Mon, 21 Oct 2024 11:06:03 +0200 Subject: [PATCH 05/69] [Docs] Update spaces docs with new solution view and permissions settings (#195648) This PR updates the Spaces stateful docs with updates brought to spaces configuration in 8.16. Other more general docs changes related to the introduction of solution views will be addressed in separate PRs (for example https://github.com/elastic/platform-docs-team/issues/529 and https://github.com/elastic/platform-docs-team/issues/530) Closes: https://github.com/elastic/platform-docs-team/issues/463 --- docs/spaces/images/edit-space.png | Bin 232313 -> 0 bytes docs/spaces/images/space-management.png | Bin 120860 -> 0 bytes docs/spaces/images/spaces-roles.png | Bin 90818 -> 278298 bytes docs/spaces/index.asciidoc | 96 +++++++++++------------- 4 files changed, 43 insertions(+), 53 deletions(-) delete mode 100644 docs/spaces/images/edit-space.png delete mode 100644 docs/spaces/images/space-management.png diff --git a/docs/spaces/images/edit-space.png b/docs/spaces/images/edit-space.png deleted file mode 100644 index 97d7ec009ade45142f3d9e9392c3d2d94d8a76a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232313 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%0A@HMOP;#6ipNGkx$&6rx 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⁡2TDT?Ztdj zCOYed?_|+i$jm{H!Q*wWl<2XPZ*POTIE|npokVXI^nm+Pjxf+()b25%cak7V7Dax1 zyw0E7@XG2EBQ&;qw>Gw0gs|gCe(uLhKyGY=!`PGszg<%_t)!lYq zzN>x=1ETFV>f>~TZ+?}+c0O7S>R_N9l7d6grikaN!qAQuSGPuetv~rVLzZz}Kory^ z%w0HuLuGvo6>jF=Y_ppT9(*f@x1W}9fWj1dTnD-!sl_02flMN(04#B|uOH4KIgwqh zl-_iGe>>hZ0jHQyK4xfSsEV<%vAd3NIHBI~P8YuHSfoYXO?bw;diH|>msHZj!^61x z8i@6Bwwl{Gj>A`CI0%a&RR-|(SiT>GE>>)iC@;VkOQ-zi+wR!d@#ItR7Q!s*m5`oV z_`Ka`&gHva9^^qCv>Jle2J%;29>wJ$YMIxNrk z{cZxd?~l8}vT@)=6X|TpTpaSiK@K7`&XHS#5k05@0sc>2-fT_6beT;``Z~B?-fY;* z!kFN@)t@g>{?yz(ihAz~uohUO?l@-%(NMq_628weJrZyGy&hi1W5Jm>qX=R*gQVJW zc(13i-HpPOP6d4L+Zn$izEQHhwFJz?qK8U$ind5SeNqddNnu3bjo!+hOhiU#h8k;P z>$o7QmGOt0jK6)`B6}R+ z)Ge4R-4|3HWF$@v!dr@&P8R>eY5uxv1an<(Ky?(XyV!l7d-h3C9fQES=S8tw7Fg8a zIZHh}#2N}1RDb6$kKqi`hJqLBYym~jm1TaJ{Ju`hfngIT;uapS&1T0MjU5zlTe3IW z%V@3wXZacC_51CzfzBUIIq=9HEh2Two

6g_$fb*JP#7nK(AC(bvTlU=wLbZhaTu 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

9W?g@S>qndtus&C98&mKVcprEw( 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

F_b(7l*2`KI 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

9t#UYFmO2YC? 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 literal 90818 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 Tt8L%WBj9-_t0Ge&Z4~rBM`8IJ diff --git a/docs/spaces/index.asciidoc b/docs/spaces/index.asciidoc index 9b20d1c23719b..81d19a2612cf6 100644 --- a/docs/spaces/index.asciidoc +++ b/docs/spaces/index.asciidoc @@ -2,87 +2,77 @@ [[xpack-spaces]] == Spaces -Spaces enable you to organize your dashboards and other saved -objects into meaningful categories. Once inside a space, you see only -the dashboards and saved objects that belong to that space. +You can define multiple spaces in a single {kib} instance from the **Spaces** menu. Each space has its own navigation and saved objects, and users can only access the spaces that they have been granted access to. This access is based on user roles, and a given role can have different permissions per space. {kib} creates a default space for you. -After you create your own -spaces, you're asked to choose a space when you log in to {kib}. You can change your -current space at any time by using the menu. +When you create more spaces, users are asked to choose a space when they log in to {kib}, and can change their +current space at any time from the top menu. [role="screenshot"] image::images/change-space.png["Change current space menu"] +To go to **Spaces**, find **Stack Management** in the navigation menu or use the <>. + [float] -==== Required privileges +=== Required privileges The `kibana_admin` role or equivalent is required to manage **Spaces**. [float] [[spaces-managing]] -=== View, create, and delete spaces - -Open the main menu, then click *Stack Management > Spaces* for an overview of your spaces. This view provides actions -for you to create, edit, and delete spaces. - -[role="screenshot"] -image::images/space-management.png["Space management"] +=== Create a space -[float] -==== Create or edit a space - -You can create as many spaces as you like. Click *Create a space* and provide a name, -URL identifier, optional description. +[[spaces-control-feature-visibility]] +You can have up to 100 spaces. +. Select *Create space* and provide a name, description, and URL identifier. ++ The URL identifier is a short text string that becomes part of the {kib} URL when you are inside that space. {kib} suggests a URL identifier based on the name of your space, but you can customize the identifier to your liking. You cannot change the space identifier once you create the space. -{kib} also has an <> -if you prefer to create spaces programmatically. +. Select a **Solution view**. This setting controls the navigation that all users of the space will get: -[role="screenshot"] -image::images/edit-space.png["Space management"] +** **Search**: A light navigation menu focused on analytics and Search use cases. Features specific to Observability and Security are hidden. +** **Observability**: A light navigation menu focused on analytics and Observability use cases. Features specific to Search and Security are hidden. +** **Security**: A light navigation menu focused on analytics and Security use cases. Features specific to Observability and Search are hidden. +** **Classic**: All features from all solutions are visible by default using the classic, multilayered navigation menus. You can customize which features are visible individually. -[float] -==== Delete a space - -Deleting a space permanently removes the space and all of its contents. -Find the space on the *Spaces* overview page and click the trash icon in the Actions column. -You can't delete the default space, but you can customize it to your liking. +. If you selected the **Classic** solution view, you can customize the **Feature visibility** as you need it to be for that space. ++ +NOTE: Even when disabled in this menu, some Management features can remain visible to some users depending on their privileges. Additionally, controlling feature visibility is not a security feature. To secure access +to specific features on a per-user basis, you must configure <>. -[float] -[[spaces-control-feature-visibility]] -=== Control feature access based on user needs +. Customize the avatar of the space to your liking. -You have control over which features are visible in each space. -For example, you might hide *Dev Tools* -in your "Executive" space or show *Stack Monitoring* only in your "Admin" space. -You can define which features to show or hide when you add or edit a space. +. Save your new space by selecting **Create space**. -Controlling feature -visibility is not a security feature. To secure access -to specific features on a per-user basis, you must configure -<>. +You can edit all of the space settings you just defined at any time, except for the URL identifier. -[role="screenshot"] -image::images/edit-space-feature-visibility.png["Controlling features visibility"] +{kib} also has an <> +if you prefer to create spaces programmatically. [float] [[spaces-control-user-access]] -=== Control feature access based on user privileges +=== Define access to a space -When using {kib} with security, you can configure applications and features -based on your users’ privileges. This means different roles can have access -to different features in the same space. -Power users might have privileges to create and edit visualizations and dashboards, -while analysts or executives might have read-only privileges for *Dashboard* and *Canvas*. -Refer to <> for details. +Users can access spaces based on the roles that they have. -[role="screenshot"] -image::images/spaces-roles.png["Controlling features visibility"] +* Certain reserved roles can view and access all spaces by default. You can't prevent those roles from accessing a space. Instead, you can grant different roles to your users. +* When <>, you can define which existing spaces that role can access, and with which permissions. +* When editing a space, you can assign roles to the space and define the permissions within the space for these roles. To do that, go to the **Permissions** tab of the space you're editing. ++ +When a role is assigned to _All Spaces_, you can't remove its access from the space settings. You must instead edit the role to give it more granular access to individual spaces. + +[float] +=== Delete a space + +Deleting a space permanently removes the space and all of its contents. +Find the space on the *Spaces* overview page and click the trash icon in the Actions column. +You can't delete the default space, but you can customize it to your liking. + +//[[spaces-control-feature-visibility]] [float] [[spaces-moving-objects]] @@ -107,6 +97,6 @@ image::images/spaces-configure-landing-page.png["Configure space-level landing p [float] [[spaces-delete-started]] -=== Disabling spaces +=== Disable spaces -Starting in {kib} 8.0, the Spaces feature cannot be disabled. +Since {kib} 8.0, the Spaces feature cannot be disabled. From 608cc70be56fa63cb68a93d480e545fa95c0846a Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Mon, 21 Oct 2024 12:30:45 +0200 Subject: [PATCH 06/69] [OAS] Support setting availability (#196647) ## Summary Close https://github.com/elastic/kibana/issues/181995 Related https://github.com/elastic/kibana/pull/195325 ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Christiane (Tina) Heiligers --- .../src/router.test.ts | 8 ++ .../core_versioned_route.test.ts | 43 +++++++- .../http/core-http-server/src/router/route.ts | 17 ++++ .../core-http-server/src/versioning/types.ts | 2 +- .../openapi-types.d.ts | 2 +- .../src/generate_oas.test.ts | 99 +++++++++++++++++++ .../src/process_router.ts | 6 +- .../src/process_versioned_router.ts | 4 + .../kbn-router-to-openapispec/src/type.ts | 5 + .../kbn-router-to-openapispec/src/util.ts | 16 ++- 10 files changed, 197 insertions(+), 5 deletions(-) diff --git a/packages/core/http/core-http-router-server-internal/src/router.test.ts b/packages/core/http/core-http-router-server-internal/src/router.test.ts index c318e9312546a..f611e3b6308fe 100644 --- a/packages/core/http/core-http-router-server-internal/src/router.test.ts +++ b/packages/core/http/core-http-router-server-internal/src/router.test.ts @@ -54,6 +54,10 @@ describe('Router', () => { discontinued: 'post test discontinued', summary: 'post test summary', description: 'post test description', + availability: { + since: '1.0.0', + stability: 'experimental', + }, }, }, (context, req, res) => res.ok() @@ -72,6 +76,10 @@ describe('Router', () => { discontinued: 'post test discontinued', summary: 'post test summary', description: 'post test description', + availability: { + since: '1.0.0', + stability: 'experimental', + }, }, }); }); diff --git a/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts b/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts index 3938b8addfc25..1442467012d8b 100644 --- a/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts +++ b/packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts @@ -52,6 +52,46 @@ describe('Versioned route', () => { jest.clearAllMocks(); }); + describe('#getRoutes', () => { + it('returns the expected metadata', () => { + const versionedRouter = CoreVersionedRouter.from({ router }); + versionedRouter + .get({ + path: '/test/{id}', + access: 'public', + options: { + httpResource: true, + availability: { + since: '1.0.0', + stability: 'experimental', + }, + excludeFromOAS: true, + tags: ['1', '2', '3'], + }, + description: 'test', + summary: 'test', + enableQueryVersion: false, + }) + .addVersion({ version: '2023-10-31', validate: false }, handlerFn); + + expect(versionedRouter.getRoutes()[0].options).toMatchObject({ + access: 'public', + enableQueryVersion: false, + description: 'test', + summary: 'test', + options: { + httpResource: true, + availability: { + since: '1.0.0', + stability: 'experimental', + }, + excludeFromOAS: true, + tags: ['1', '2', '3'], + }, + }); + }); + }); + it('can register multiple handlers', () => { const versionedRouter = CoreVersionedRouter.from({ router }); versionedRouter @@ -133,6 +173,8 @@ describe('Versioned route', () => { const opts: Parameters[0] = { path: '/test/{id}', access: 'internal', + summary: 'test', + description: 'test', options: { authRequired: true, tags: ['access:test'], @@ -140,7 +182,6 @@ describe('Versioned route', () => { xsrfRequired: false, excludeFromOAS: true, httpResource: true, - summary: `test`, }, }; diff --git a/packages/core/http/core-http-server/src/router/route.ts b/packages/core/http/core-http-server/src/router/route.ts index a97ff9dd4040b..ac723db924a5a 100644 --- a/packages/core/http/core-http-server/src/router/route.ts +++ b/packages/core/http/core-http-server/src/router/route.ts @@ -321,6 +321,23 @@ export interface RouteConfigOptions { * @default false */ httpResource?: boolean; + + /** + * Based on the the ES API specification (see https://github.com/elastic/elasticsearch-specification) + * Kibana APIs can also specify some metadata about API availability. + * + * This setting is only applicable if your route `access` is `public`. + * + * @remark intended to be used for informational purposes only. + */ + availability?: { + /** @default stable */ + stability?: 'experimental' | 'beta' | 'stable'; + /** + * The stack version in which the route was introduced (eg: 8.15.0). + */ + since?: string; + }; } /** diff --git a/packages/core/http/core-http-server/src/versioning/types.ts b/packages/core/http/core-http-server/src/versioning/types.ts index 60cbca014e683..7998c9cc91fa9 100644 --- a/packages/core/http/core-http-server/src/versioning/types.ts +++ b/packages/core/http/core-http-server/src/versioning/types.ts @@ -35,7 +35,7 @@ export type VersionedRouteConfig = Omit< > & { options?: Omit< RouteConfigOptions, - 'access' | 'description' | 'deprecated' | 'discontinued' | 'security' + 'access' | 'description' | 'summary' | 'deprecated' | 'discontinued' | 'security' >; /** See {@link RouteConfigOptions['access']} */ access: Exclude['access'], undefined>; diff --git a/packages/kbn-router-to-openapispec/openapi-types.d.ts b/packages/kbn-router-to-openapispec/openapi-types.d.ts index 90c034a855fdc..9689ed803a152 100644 --- a/packages/kbn-router-to-openapispec/openapi-types.d.ts +++ b/packages/kbn-router-to-openapispec/openapi-types.d.ts @@ -13,7 +13,7 @@ export * from 'openapi-types'; declare module 'openapi-types' { export namespace OpenAPIV3 { export interface BaseSchemaObject { - // Custom OpenAPI field added by Kibana for a new field at the shema level. + // Custom OpenAPI field added by Kibana for a new field at the schema level. 'x-discontinued'?: string; } } diff --git a/packages/kbn-router-to-openapispec/src/generate_oas.test.ts b/packages/kbn-router-to-openapispec/src/generate_oas.test.ts index 6db4237751217..c3532312d3088 100644 --- a/packages/kbn-router-to-openapispec/src/generate_oas.test.ts +++ b/packages/kbn-router-to-openapispec/src/generate_oas.test.ts @@ -321,4 +321,103 @@ describe('generateOpenApiDocument', () => { expect(result.paths['/v2-1']!.get!.tags).toEqual([]); }); }); + + describe('availability', () => { + it('creates the expected availability entries', () => { + const [routers, versionedRouters] = createTestRouters({ + routers: { + testRouter1: { + routes: [ + { + path: '/1-1/{id}/{path*}', + options: { availability: { stability: 'experimental' } }, + }, + { + path: '/1-2/{id}/{path*}', + options: { availability: { stability: 'beta' } }, + }, + { + path: '/1-3/{id}/{path*}', + options: { availability: { stability: 'stable' } }, + }, + ], + }, + testRouter2: { + routes: [{ path: '/2-1/{id}/{path*}' }], + }, + }, + versionedRouters: { + testVersionedRouter1: { + routes: [ + { + path: '/v1-1', + options: { + access: 'public', + options: { availability: { stability: 'experimental' } }, + }, + }, + { + path: '/v1-2', + options: { + access: 'public', + options: { availability: { stability: 'beta' } }, + }, + }, + { + path: '/v1-3', + options: { + access: 'public', + options: { availability: { stability: 'stable' } }, + }, + }, + ], + }, + testVersionedRouter2: { + routes: [{ path: '/v2-1', options: { access: 'public' } }], + }, + }, + }); + const result = generateOpenApiDocument( + { + routers, + versionedRouters, + }, + { + title: 'test', + baseUrl: 'https://test.oas', + version: '99.99.99', + } + ); + + // router paths + expect(result.paths['/1-1/{id}/{path*}']!.get).toMatchObject({ + 'x-state': 'Technical Preview', + }); + expect(result.paths['/1-2/{id}/{path*}']!.get).toMatchObject({ + 'x-state': 'Beta', + }); + + expect(result.paths['/1-3/{id}/{path*}']!.get).not.toMatchObject({ + 'x-state': expect.any(String), + }); + expect(result.paths['/2-1/{id}/{path*}']!.get).not.toMatchObject({ + 'x-state': expect.any(String), + }); + + // versioned router paths + expect(result.paths['/v1-1']!.get).toMatchObject({ + 'x-state': 'Technical Preview', + }); + expect(result.paths['/v1-2']!.get).toMatchObject({ + 'x-state': 'Beta', + }); + + expect(result.paths['/v1-3']!.get).not.toMatchObject({ + 'x-state': expect.any(String), + }); + expect(result.paths['/v2-1']!.get).not.toMatchObject({ + 'x-state': expect.any(String), + }); + }); + }); }); diff --git a/packages/kbn-router-to-openapispec/src/process_router.ts b/packages/kbn-router-to-openapispec/src/process_router.ts index 4437e35ea1f3e..1884b6dddf863 100644 --- a/packages/kbn-router-to-openapispec/src/process_router.ts +++ b/packages/kbn-router-to-openapispec/src/process_router.ts @@ -23,9 +23,11 @@ import { getVersionedHeaderParam, mergeResponseContent, prepareRoutes, + setXState, } from './util'; import type { OperationIdCounter } from './operation_id_counter'; import type { GenerateOpenApiDocumentOptionsFilters } from './generate_oas'; +import type { CustomOperationObject } from './type'; export const processRouter = ( appRouter: Router, @@ -61,7 +63,7 @@ export const processRouter = ( parameters.push(...pathObjects, ...queryObjects); } - const operation: OpenAPIV3.OperationObject = { + const operation: CustomOperationObject = { summary: route.options.summary ?? '', tags: route.options.tags ? extractTags(route.options.tags) : [], ...(route.options.description ? { description: route.options.description } : {}), @@ -81,6 +83,8 @@ export const processRouter = ( operationId: getOpId(route.path), }; + setXState(route.options.availability, operation); + const path: OpenAPIV3.PathItemObject = { [route.method]: operation, }; diff --git a/packages/kbn-router-to-openapispec/src/process_versioned_router.ts b/packages/kbn-router-to-openapispec/src/process_versioned_router.ts index 97b92f92fde57..5446f1409760d 100644 --- a/packages/kbn-router-to-openapispec/src/process_versioned_router.ts +++ b/packages/kbn-router-to-openapispec/src/process_versioned_router.ts @@ -29,6 +29,7 @@ import { extractTags, mergeResponseContent, getXsrfHeaderForMethod, + setXState, } from './util'; export const processVersionedRouter = ( @@ -112,6 +113,9 @@ export const processVersionedRouter = ( parameters, operationId: getOpId(route.path), }; + + setXState(route.options.options?.availability, operation); + const path: OpenAPIV3.PathItemObject = { [route.method]: operation, }; diff --git a/packages/kbn-router-to-openapispec/src/type.ts b/packages/kbn-router-to-openapispec/src/type.ts index 09dc247e5a5c9..5c5f992a0de0f 100644 --- a/packages/kbn-router-to-openapispec/src/type.ts +++ b/packages/kbn-router-to-openapispec/src/type.ts @@ -34,3 +34,8 @@ export interface OpenAPIConverter { is(type: unknown): boolean; } + +export type CustomOperationObject = OpenAPIV3.OperationObject<{ + // Custom OpenAPI from ES API spec based on @availability + 'x-state'?: 'Technical Preview' | 'Beta'; +}>; diff --git a/packages/kbn-router-to-openapispec/src/util.ts b/packages/kbn-router-to-openapispec/src/util.ts index 55f7348dc199a..beefbebc0aec7 100644 --- a/packages/kbn-router-to-openapispec/src/util.ts +++ b/packages/kbn-router-to-openapispec/src/util.ts @@ -17,7 +17,7 @@ import { type RouterRoute, type RouteValidatorConfig, } from '@kbn/core-http-server'; -import { KnownParameters } from './type'; +import { CustomOperationObject, KnownParameters } from './type'; import type { GenerateOpenApiDocumentOptionsFilters } from './generate_oas'; const tagPrefix = 'oas-tag:'; @@ -165,3 +165,17 @@ export const getXsrfHeaderForMethod = ( }, ]; }; + +export function setXState( + availability: RouteConfigOptions['availability'], + operation: CustomOperationObject +): void { + if (availability) { + if (availability.stability === 'experimental') { + operation['x-state'] = 'Technical Preview'; + } + if (availability.stability === 'beta') { + operation['x-state'] = 'Beta'; + } + } +} From fb412ca0b7dfb997f2f84da62a12f32d3012ffb0 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Mon, 21 Oct 2024 11:56:05 +0100 Subject: [PATCH 07/69] [ML] File data visualizer: only list sparse_embedding and text_embedding inference endpoints (#196577) When listing the inference endpoints available for the semantic text field, we should only list `sparse_embedding` and `text_embedding` types. image This PR adds a check to the `data_visualizer/inference_endpoints` endpoint to ensure only `sparse_embedding` and `text_embedding` types are used and they have at least one allocation. NOTE, the allocation check is currently commented out waiting on an es change. https://github.com/elastic/elasticsearch/pull/115095 Also renames the endpoint from `data_visualizer/inference_services` -> `data_visualizer/inference_endpoints` And renames variables which were incorrectly named "service" rather than "endpoint" --- .../combined_fields/semantic_text.tsx | 32 +++++++++---------- .../plugins/data_visualizer/server/routes.ts | 19 +++++++++-- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/combined_fields/semantic_text.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/combined_fields/semantic_text.tsx index 5ec9216f599c6..c1f56214e2ce1 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/combined_fields/semantic_text.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/combined_fields/semantic_text.tsx @@ -41,8 +41,8 @@ export const SemanticTextForm: FC = ({ addCombinedField, hasNameCollision const { services: { http }, } = useDataVisualizerKibana(); - const [inferenceServices, setInferenceServices] = useState([]); - const [selectedInference, setSelectedInference] = useState(); + const [inferenceEndpoints, setInferenceEndpoints] = useState([]); + const [selectedInferenceEndpoint, setSelectedInferenceEndpoint] = useState(); const [selectedFieldOption, setSelectedFieldOption] = useState(); const [renameToFieldOption, setRenameToFieldOption] = useState(''); const [fieldError, setFieldError] = useState(); @@ -61,17 +61,17 @@ export const SemanticTextForm: FC = ({ addCombinedField, hasNameCollision useEffect(() => { http - .fetch('/internal/data_visualizer/inference_services', { + .fetch('/internal/data_visualizer/inference_endpoints', { method: 'GET', version: '1', }) .then((response) => { - const inferenceServiceOptions = response.map((service) => ({ - value: service.inference_id, - text: service.inference_id, + const inferenceEndpointOptions = response.map((endpoint) => ({ + value: endpoint.inference_id, + text: endpoint.inference_id, })); - setInferenceServices(inferenceServiceOptions); - setSelectedInference(inferenceServiceOptions[0]?.value ?? undefined); + setInferenceEndpoints(inferenceEndpointOptions); + setSelectedInferenceEndpoint(inferenceEndpointOptions[0]?.value ?? undefined); }); }, [http]); @@ -88,7 +88,7 @@ export const SemanticTextForm: FC = ({ addCombinedField, hasNameCollision renameToFieldOption === '' || renameToFieldOption === undefined || selectedFieldOption === undefined || - selectedInference === undefined + selectedInferenceEndpoint === undefined ) { return; } @@ -103,7 +103,7 @@ export const SemanticTextForm: FC = ({ addCombinedField, hasNameCollision newMappings.properties![renameToFieldOption ?? selectedFieldOption] = { // @ts-ignore types are missing semantic_text type: 'semantic_text', - inference_id: selectedInference, + inference_id: selectedInferenceEndpoint, }; return newMappings; }, @@ -138,12 +138,12 @@ export const SemanticTextForm: FC = ({ addCombinedField, hasNameCollision const isInvalid = useMemo(() => { return ( - !selectedInference || + !selectedInferenceEndpoint || !selectedFieldOption || renameToFieldOption === '' || fieldError !== undefined ); - }, [selectedInference, selectedFieldOption, renameToFieldOption, fieldError]); + }, [selectedInferenceEndpoint, selectedFieldOption, renameToFieldOption, fieldError]); return ( <> @@ -185,13 +185,13 @@ export const SemanticTextForm: FC = ({ addCombinedField, hasNameCollision setSelectedInference(e.target.value)} + options={inferenceEndpoints} + value={selectedInferenceEndpoint} + onChange={(e) => setSelectedInferenceEndpoint(e.target.value)} /> diff --git a/x-pack/plugins/data_visualizer/server/routes.ts b/x-pack/plugins/data_visualizer/server/routes.ts index 05234fc5583ee..e04ba7521bfa4 100644 --- a/x-pack/plugins/data_visualizer/server/routes.ts +++ b/x-pack/plugins/data_visualizer/server/routes.ts @@ -67,9 +67,16 @@ export function routes(coreSetup: CoreSetup, logger: Logger) } ); + /** + * @apiGroup DataVisualizer + * + * @api {get} /internal/data_visualizer/inference_endpoints Returns a list of inference endpoints which are currently deployed + * @apiName inferenceEndpoints + * @apiDescription Returns a list of inference endpoints where the underlying model is currently deployed + */ router.versioned .get({ - path: '/internal/data_visualizer/inference_services', + path: '/internal/data_visualizer/inference_endpoints', access: 'internal', options: { tags: ['access:fileUpload:analyzeFile'], @@ -87,7 +94,15 @@ export function routes(coreSetup: CoreSetup, logger: Logger) inference_id: '_all', }); - return response.ok({ body: endpoints }); + const filteredInferenceEndpoints = endpoints.filter((endpoint) => { + return ( + endpoint.task_type === 'sparse_embedding' || endpoint.task_type === 'text_embedding' + // TODO: add this back in when the fix has made it into es in 8.16 + // && endpoint.service_settings.num_allocations > 0 + ); + }); + + return response.ok({ body: filteredInferenceEndpoints }); } catch (e) { return response.customError(wrapError(e)); } From 10ec204128776930c48376a848fe20b1301569f9 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:56:50 +0100 Subject: [PATCH 08/69] [SecuritySolution][Onboarding] Catch completion check failure (#196389) ## Summary Fixes: https://github.com/elastic/kibana/issues/196091 | ~https://github.com/elastic/kibana/issues/196649~ 1. Add the error handling when an error occurred during check complete. 2. Update the AI assistant capabilities to `[['securitySolutionAssistant.ai-assistant', 'actions.show']]` **Steps to verify:** https://p.elstc.co/paste/+6OYqx41#tZxjvqXgQJ2uRlCSqZH8ADMEAvR1+qnXe-5kEbt+bro Login with the user without indices privilege. It should display the tab content without the completion information. When completion check failed - it should display and error `toast`, regard the card as `incomplete` and `show the content`: https://github.com/user-attachments/assets/30b1654e-99cc-4582-8beb-c4a5fb005e6f AI assistant should not show connectors options as `add integration` is regarded as incomplete: Screenshot 2024-10-17 at 15 02 42 Then add the index privilege: Screenshot 2024-10-17 at 15 07 36 When completion check success: it should display the completion results: https://github.com/user-attachments/assets/2a27a042-c634-4f44-bfd0-2ae503f396a2 Set `actions and connectors` to read only: Screenshot 2024-10-17 at 15 04 28 Screenshot 2024-10-17 at 16 40 18 ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../onboarding_body/cards/assistant/index.ts | 4 +- .../integrations/integrations_card.test.tsx | 11 +++ .../integrations_check_complete.test.ts | 51 ++++++++++++- .../integrations_check_complete.ts | 31 ++++++-- .../hooks/use_completed_cards.test.ts | 72 +++++++++++++++++++ .../hooks/use_completed_cards.ts | 28 ++++++-- 6 files changed, 181 insertions(+), 16 deletions(-) diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/assistant/index.ts b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/assistant/index.ts index bf4195b814590..27deda4190f2e 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/assistant/index.ts +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/assistant/index.ts @@ -25,6 +25,8 @@ export const assistantCardConfig: OnboardingCardConfig = ) ), checkComplete: checkAssistantCardComplete, - capabilities: 'securitySolutionAssistant.ai-assistant', + // Both capabilities are needed for this card, so we should use a double array to create an AND conditional + // (a single array would create an OR conditional between them) + capabilities: [['securitySolutionAssistant.ai-assistant', 'actions.show']], licenseType: 'enterprise', }; diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integrations_card.test.tsx b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integrations_card.test.tsx index 3f79745182c5a..296d5391fd611 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integrations_card.test.tsx +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integrations_card.test.tsx @@ -28,4 +28,15 @@ describe('IntegrationsCard', () => { ); expect(getByTestId('loadingInstalledIntegrations')).toBeInTheDocument(); }); + + it('renders the content', () => { + const { queryByTestId } = render( + + ); + expect(queryByTestId('loadingInstalledIntegrations')).not.toBeInTheDocument(); + expect(queryByTestId('integrationsCardGridTabs')).toBeInTheDocument(); + }); }); diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integrations_check_complete.test.ts b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integrations_check_complete.test.ts index 3dd19d8868390..961f1981291b8 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integrations_check_complete.test.ts +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integrations_check_complete.test.ts @@ -16,6 +16,7 @@ jest.mock('rxjs', () => ({ })); describe('checkIntegrationsCardComplete', () => { + const mockLastValueFrom = lastValueFrom as jest.Mock; const mockHttpGet: jest.Mock = jest.fn(); const mockSearch: jest.Mock = jest.fn(); const mockService = { @@ -27,6 +28,11 @@ describe('checkIntegrationsCardComplete', () => { search: mockSearch, }, }, + notifications: { + toasts: { + addError: jest.fn(), + }, + }, } as unknown as StartServices; beforeEach(() => { @@ -38,7 +44,7 @@ describe('checkIntegrationsCardComplete', () => { items: [], }); - (lastValueFrom as jest.Mock).mockResolvedValue({ + mockLastValueFrom.mockResolvedValue({ rawResponse: { hits: { total: 0 }, }, @@ -60,7 +66,7 @@ describe('checkIntegrationsCardComplete', () => { items: [{ status: installationStatuses.Installed }], }); - (lastValueFrom as jest.Mock).mockResolvedValue({ + mockLastValueFrom.mockResolvedValue({ rawResponse: { hits: { total: 0 }, }, @@ -86,7 +92,7 @@ describe('checkIntegrationsCardComplete', () => { ], }); - (lastValueFrom as jest.Mock).mockResolvedValue({ + mockLastValueFrom.mockResolvedValue({ rawResponse: { hits: { total: 1 }, }, @@ -103,4 +109,43 @@ describe('checkIntegrationsCardComplete', () => { }, }); }); + + it('renders an error toast when fetching integrations data fails', async () => { + const err = new Error('Failed to fetch integrations data'); + mockHttpGet.mockRejectedValue(err); + + const res = await checkIntegrationsCardComplete(mockService); + + expect(mockService.notifications.toasts.addError).toHaveBeenCalledWith(err, { + title: 'Error fetching integrations data', + }); + expect(res).toEqual({ + isComplete: false, + metadata: { + installedIntegrationsCount: 0, + isAgentRequired: false, + }, + }); + }); + + it('renders an error toast when fetching agents data fails', async () => { + const err = new Error('Failed to fetch agents data'); + mockLastValueFrom.mockRejectedValue(err); + + const res = await checkIntegrationsCardComplete(mockService); + + expect(mockService.notifications.toasts.addError).toHaveBeenCalledWith( + new Error('Failed to fetch agents data'), + { + title: 'Error fetching agents data', + } + ); + expect(res).toEqual({ + isComplete: false, + metadata: { + installedIntegrationsCount: 0, + isAgentRequired: false, + }, + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integrations_check_complete.ts b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integrations_check_complete.ts index 912b81bddf3fb..d4193dd8b9ded 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integrations_check_complete.ts +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/cards/integrations/integrations_check_complete.ts @@ -17,18 +17,37 @@ import type { IntegrationCardMetadata } from './types'; export const checkIntegrationsCardComplete: OnboardingCardCheckComplete< IntegrationCardMetadata > = async (services: StartServices) => { - const packageData = await services.http.get( - EPM_API_ROUTES.INSTALL_BY_UPLOAD_PATTERN, - { + const packageData = await services.http + .get(EPM_API_ROUTES.INSTALL_BY_UPLOAD_PATTERN, { version: '2023-10-31', - } - ); + }) + .catch((err: Error) => { + services.notifications.toasts.addError(err, { + title: i18n.translate( + 'xpack.securitySolution.onboarding.integrationsCard.checkComplete.fetchIntegrations.errorTitle', + { + defaultMessage: 'Error fetching integrations data', + } + ), + }); + return { items: [] }; + }); const agentsData = await lastValueFrom( services.data.search.search({ params: { index: AGENT_INDEX, body: { size: 1 } }, }) - ); + ).catch((err: Error) => { + services.notifications.toasts.addError(err, { + title: i18n.translate( + 'xpack.securitySolution.onboarding.integrationsCard.checkComplete.fetchAgents.errorTitle', + { + defaultMessage: 'Error fetching agents data', + } + ), + }); + return { rawResponse: { hits: { total: 0 } } }; + }); const installed = packageData?.items?.filter( (pkg) => diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/hooks/use_completed_cards.test.ts b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/hooks/use_completed_cards.test.ts index 31c440e8f1415..2c9fcd573f0d6 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/hooks/use_completed_cards.test.ts +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/hooks/use_completed_cards.test.ts @@ -11,9 +11,11 @@ import { useCompletedCards } from './use_completed_cards'; import type { OnboardingGroupConfig } from '../../../types'; import type { OnboardingCardId } from '../../../constants'; import { mockReportCardComplete } from '../../__mocks__/onboarding_context_mocks'; +import { useKibana } from '../../../../common/lib/kibana'; const defaultStoredCompletedCardIds: OnboardingCardId[] = []; const mockSetStoredCompletedCardIds = jest.fn(); +const mockUseKibana = useKibana as jest.Mock; const mockUseStoredCompletedCardIds = jest.fn(() => [ defaultStoredCompletedCardIds, mockSetStoredCompletedCardIds, @@ -24,6 +26,15 @@ jest.mock('../../../hooks/use_stored_state', () => ({ })); jest.mock('../../onboarding_context'); +jest.mock('../../../../common/lib/kibana', () => { + const original = jest.requireActual('../../../../common/lib/kibana'); + return { + ...original, + useKibana: jest.fn().mockReturnValue({ + services: { notifications: { toasts: { addError: jest.fn() } } }, + }), + }; +}); const cardComplete = { id: 'card-completed' as OnboardingCardId, @@ -62,6 +73,13 @@ const cardMetadata = { .fn() .mockResolvedValue({ isComplete: true, metadata: { custom: 'metadata' } }), }; +const mockAddError = jest.fn(); +const mockError = new Error('Failed to check complete'); +const cardCheckCompleteFailed = { + id: 'card-failed' as OnboardingCardId, + title: 'card failed', + checkComplete: jest.fn().mockRejectedValue(mockError), +}; const mockCardsGroupConfig = [ { @@ -74,11 +92,65 @@ const mockCardsGroupConfig = [ }, ] as unknown as OnboardingGroupConfig[]; +const mockFailureCardsGroupConfig = [ + { + title: 'Group 1', + cards: [cardCheckCompleteFailed], + }, +] as unknown as OnboardingGroupConfig[]; + describe('useCompletedCards Hook', () => { beforeEach(() => { jest.clearAllMocks(); }); + describe('when checkComplete functions are rejected', () => { + let renderResult: RenderHookResult< + OnboardingGroupConfig[], + ReturnType + >; + beforeEach(async () => { + mockUseKibana.mockReturnValue({ + services: { notifications: { toasts: { addError: mockAddError } } }, + }); + renderResult = renderHook(useCompletedCards, { initialProps: mockFailureCardsGroupConfig }); + await act(async () => { + await waitFor(() => { + expect(mockSetStoredCompletedCardIds).toHaveBeenCalledTimes(0); // number of completed cards + }); + }); + }); + + describe('when a the auto check is called', () => { + beforeEach(async () => { + jest.clearAllMocks(); + await act(async () => { + renderResult.result.current.checkCardComplete(cardCheckCompleteFailed.id); + }); + }); + + it('should not set the completed card ids', async () => { + expect(mockSetStoredCompletedCardIds).not.toHaveBeenCalled(); + }); + + it('should return the correct completed state', () => { + expect(renderResult.result.current.isCardComplete(cardCheckCompleteFailed.id)).toEqual( + false + ); + }); + + it('should show an error toast', () => { + expect(mockAddError).toHaveBeenCalledWith(mockError, { + title: cardCheckCompleteFailed.title, + }); + }); + + it('should not report the completed card', async () => { + expect(mockReportCardComplete).not.toHaveBeenCalled(); + }); + }); + }); + describe('when checkComplete functions are resolved', () => { let renderResult: RenderHookResult< OnboardingGroupConfig[], diff --git a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/hooks/use_completed_cards.ts b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/hooks/use_completed_cards.ts index 6d8b22c504be9..34092bf2d5eec 100644 --- a/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/hooks/use_completed_cards.ts +++ b/x-pack/plugins/security_solution/public/onboarding/components/onboarding_body/hooks/use_completed_cards.ts @@ -114,9 +114,17 @@ export const useCompletedCards = (cardsGroupConfig: OnboardingGroupConfig[]) => const cardConfig = cardsWithAutoCheck.find(({ id }) => id === cardId); if (cardConfig) { - cardConfig.checkComplete?.(services).then((checkCompleteResult) => { - processCardCheckCompleteResult(cardId, checkCompleteResult); - }); + cardConfig + .checkComplete?.(services) + .catch((err: Error) => { + services.notifications.toasts.addError(err, { title: cardConfig.title }); + return { + isComplete: false, + }; + }) + .then((checkCompleteResult) => { + processCardCheckCompleteResult(cardId, checkCompleteResult); + }); } }, [cardsWithAutoCheck, processCardCheckCompleteResult, services] @@ -129,9 +137,17 @@ export const useCompletedCards = (cardsGroupConfig: OnboardingGroupConfig[]) => } autoCheckCompletedRef.current = true; cardsWithAutoCheck.map((card) => - card.checkComplete?.(services).then((checkCompleteResult) => { - processCardCheckCompleteResult(card.id, checkCompleteResult); - }) + card + .checkComplete?.(services) + .catch((err: Error) => { + services.notifications.toasts.addError(err, { title: card.title }); + return { + isComplete: false, + }; + }) + .then((checkCompleteResult) => { + processCardCheckCompleteResult(card.id, checkCompleteResult); + }) ); }, [cardsWithAutoCheck, processCardCheckCompleteResult, services]); From 0e1b2a3663d5a277247c74ed0957c00cffd4b0a0 Mon Sep 17 00:00:00 2001 From: Mark Hopkin Date: Mon, 21 Oct 2024 12:31:00 +0100 Subject: [PATCH 09/69] [Entity Store] [FTR Tests] Fix flakiness + poll for engine started on setup (#196564) ## Summary Closes https://github.com/elastic/kibana/issues/196546 Closes https://github.com/elastic/kibana/issues/196526 Unskips flaky entity store tests after fixes. Entity store tests were not polling for the engine to be started before asserting the assets were present. I have also added some retries to the asset checks as some assets are not immediately queryable after creation. --- .../elasticsearch_assets/enrich_policy.ts | 30 ++++- .../entity_store/entity_store_data_client.ts | 5 +- .../trial_license_complete_tier/engine.ts | 20 ++- .../engine_nondefault_spaces.ts | 18 +-- .../utils/elastic_asset_checker.ts | 127 +++++++++++------- .../entity_analytics/utils/entity_store.ts | 33 ++++- 6 files changed, 151 insertions(+), 82 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/elasticsearch_assets/enrich_policy.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/elasticsearch_assets/enrich_policy.ts index 7d6fc6fd8bc24..4b8ce594a6cb7 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/elasticsearch_assets/enrich_policy.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/elasticsearch_assets/enrich_policy.ts @@ -72,10 +72,36 @@ export const executeFieldRetentionEnrichPolicy = async ({ export const deleteFieldRetentionEnrichPolicy = async ({ unitedDefinition, esClient, + logger, + attempts = 5, + delayMs = 2000, }: { - esClient: ElasticsearchClient; unitedDefinition: DefinitionMetadata; + esClient: ElasticsearchClient; + logger: Logger; + attempts?: number; + delayMs?: number; }) => { const name = getFieldRetentionEnrichPolicyName(unitedDefinition); - return esClient.enrich.deletePolicy({ name }, { ignore: [404] }); + let currentAttempt = 1; + while (currentAttempt <= attempts) { + try { + await esClient.enrich.deletePolicy({ name }, { ignore: [404] }); + return; + } catch (e) { + // a 429 status code indicates that the enrich policy is being executed + if (currentAttempt === attempts || e.statusCode !== 429) { + logger.error( + `Error deleting enrich policy ${name}: ${e.message} after ${currentAttempt} attempts` + ); + throw e; + } + + logger.info( + `Enrich policy ${name} is being executed, waiting for it to finish before deleting` + ); + await new Promise((resolve) => setTimeout(resolve, delayMs)); + currentAttempt++; + } + } }; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts index 5b1acaa433cd0..50e500fae40f2 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts @@ -245,7 +245,7 @@ export class EntityStoreDataClient { logger, taskManager, }); - logger.info(`Entity store initialized`); + logger.info(`Entity store initialized for ${entityType}`); return updated; } catch (err) { @@ -362,6 +362,7 @@ export class EntityStoreDataClient { await deleteFieldRetentionEnrichPolicy({ unitedDefinition, esClient: this.esClient, + logger, }); if (deleteData) { @@ -450,7 +451,7 @@ export class EntityStoreDataClient { originalStatus === ENGINE_STATUS.UPDATING ) { throw new Error( - `Error updating entity store: There is an changes already in progress for engine ${id}` + `Error updating entity store: There are changes already in progress for engine ${id}` ); } diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/engine.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/engine.ts index a7d32767f50ce..f51fbd15ceead 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/engine.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/engine.ts @@ -14,8 +14,7 @@ export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const utils = EntityStoreUtils(getService); - // Failing: See https://github.com/elastic/kibana/issues/196526 - describe.skip('@ess @skipInServerlessMKI Entity Store Engine APIs', () => { + describe('@ess @skipInServerlessMKI Entity Store Engine APIs', () => { const dataView = dataViewRouteHelpersFactory(supertest); before(async () => { @@ -33,22 +32,19 @@ export default ({ getService }: FtrProviderContext) => { }); it('should have installed the expected user resources', async () => { - await utils.initEntityEngineForEntityType('user'); + await utils.initEntityEngineForEntityTypesAndWait(['user']); await utils.expectEngineAssetsExist('user'); }); it('should have installed the expected host resources', async () => { - await utils.initEntityEngineForEntityType('host'); + await utils.initEntityEngineForEntityTypesAndWait(['host']); await utils.expectEngineAssetsExist('host'); }); }); describe('get and list', () => { before(async () => { - await Promise.all([ - utils.initEntityEngineForEntityType('host'), - utils.initEntityEngineForEntityType('user'), - ]); + await utils.initEntityEngineForEntityTypesAndWait(['host', 'user']); }); after(async () => { @@ -118,7 +114,7 @@ export default ({ getService }: FtrProviderContext) => { describe('start and stop', () => { before(async () => { - await utils.initEntityEngineForEntityType('host'); + await utils.initEntityEngineForEntityTypesAndWait(['host']); }); after(async () => { @@ -160,7 +156,7 @@ export default ({ getService }: FtrProviderContext) => { describe('delete', () => { it('should delete the host entity engine', async () => { - await utils.initEntityEngineForEntityType('host'); + await utils.initEntityEngineForEntityTypesAndWait(['host']); await api .deleteEntityEngine({ @@ -173,7 +169,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should delete the user entity engine', async () => { - await utils.initEntityEngineForEntityType('user'); + await utils.initEntityEngineForEntityTypesAndWait(['user']); await api .deleteEntityEngine({ @@ -188,7 +184,7 @@ export default ({ getService }: FtrProviderContext) => { describe('apply_dataview_indices', () => { before(async () => { - await utils.initEntityEngineForEntityType('host'); + await utils.initEntityEngineForEntityTypesAndWait(['host']); }); after(async () => { diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/engine_nondefault_spaces.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/engine_nondefault_spaces.ts index 481f7aa4056f6..64809533fec7b 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/engine_nondefault_spaces.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/engine_nondefault_spaces.ts @@ -18,8 +18,7 @@ export default ({ getService }: FtrProviderContextWithSpaces) => { const supertest = getService('supertest'); const utils = EntityStoreUtils(getService, namespace); - // Failing: See https://github.com/elastic/kibana/issues/196546 - describe.skip('@ess Entity Store Engine APIs in non-default space', () => { + describe('@ess Entity Store Engine APIs in non-default space', () => { const dataView = dataViewRouteHelpersFactory(supertest, namespace); before(async () => { @@ -43,22 +42,19 @@ export default ({ getService }: FtrProviderContextWithSpaces) => { }); it('should have installed the expected user resources', async () => { - await utils.initEntityEngineForEntityType('user'); + await utils.initEntityEngineForEntityTypesAndWait(['user']); await utils.expectEngineAssetsExist('user'); }); it('should have installed the expected host resources', async () => { - await utils.initEntityEngineForEntityType('host'); + await utils.initEntityEngineForEntityTypesAndWait(['host']); await utils.expectEngineAssetsExist('host'); }); }); describe('get and list', () => { before(async () => { - await Promise.all([ - utils.initEntityEngineForEntityType('host'), - utils.initEntityEngineForEntityType('user'), - ]); + await utils.initEntityEngineForEntityTypesAndWait(['host', 'user']); }); after(async () => { @@ -134,7 +130,7 @@ export default ({ getService }: FtrProviderContextWithSpaces) => { describe('start and stop', () => { before(async () => { - await utils.initEntityEngineForEntityType('host'); + await utils.initEntityEngineForEntityTypesAndWait(['host']); }); after(async () => { @@ -188,7 +184,7 @@ export default ({ getService }: FtrProviderContextWithSpaces) => { describe('delete', () => { it('should delete the host entity engine', async () => { - await utils.initEntityEngineForEntityType('host'); + await utils.initEntityEngineForEntityTypesAndWait(['host']); await api .deleteEntityEngine( @@ -204,7 +200,7 @@ export default ({ getService }: FtrProviderContextWithSpaces) => { }); it('should delete the user entity engine', async () => { - await utils.initEntityEngineForEntityType('user'); + await utils.initEntityEngineForEntityTypesAndWait(['user']); await api .deleteEntityEngine( diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/elastic_asset_checker.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/elastic_asset_checker.ts index 8e8635cefc26b..c0dddb4ddb093 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/elastic_asset_checker.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/elastic_asset_checker.ts @@ -9,6 +9,8 @@ import { FtrProviderContext } from '@kbn/ftr-common-functional-services'; export const elasticAssetCheckerFactory = (getService: FtrProviderContext['getService']) => { const es = getService('es'); + const retry = getService('retry'); + const log = getService('log'); const expectTransformExists = async (transformId: string) => { return expectTransformStatus(transformId, true); @@ -18,45 +20,43 @@ export const elasticAssetCheckerFactory = (getService: FtrProviderContext['getSe return expectTransformStatus(transformId, false); }; - const expectTransformStatus = async ( - transformId: string, - exists: boolean, - attempts: number = 5, - delayMs: number = 2000 - ) => { - let currentAttempt = 1; - while (currentAttempt <= attempts) { - try { - await es.transform.getTransform({ transform_id: transformId }); - if (!exists) { - throw new Error(`Expected transform ${transformId} to not exist, but it does`); + const expectTransformStatus = async (transformId: string, exists: boolean) => { + await retry.waitForWithTimeout( + `transform ${transformId} to ${exists ? 'exist' : 'not exist'}`, + 10_000, + async () => { + try { + await es.transform.getTransform({ transform_id: transformId }); + return exists; + } catch (e) { + log.debug(`Transform ${transformId} not found: ${e}`); + return !exists; } - return; // Transform exists, exit the loop - } catch (e) { - if (currentAttempt === attempts) { - if (exists) { - throw new Error(`Expected transform ${transformId} to exist, but it does not: ${e}`); - } else { - return; // Transform does not exist, exit the loop - } - } - await new Promise((resolve) => setTimeout(resolve, delayMs)); - currentAttempt++; } - } + ); }; const expectEnrichPolicyStatus = async (policyId: string, exists: boolean) => { - try { - await es.enrich.getPolicy({ name: policyId }); - if (!exists) { - throw new Error(`Expected enrich policy ${policyId} to not exist, but it does`); - } - } catch (e) { - if (exists) { - throw new Error(`Expected enrich policy ${policyId} to exist, but it does not: ${e}`); + await retry.waitForWithTimeout( + `enrich policy ${policyId} to ${exists ? 'exist' : 'not exist'}`, + 20_000, + async () => { + try { + const res = await es.enrich.getPolicy({ name: policyId }); + const policy = res.policies?.[0]; + if (policy) { + log.debug(`Enrich policy ${policyId} found: ${JSON.stringify(res)}`); + return exists; + } else { + log.debug(`Enrich policy ${policyId} not found: ${JSON.stringify(res)}`); + return !exists; + } + } catch (e) { + log.debug(`Enrich policy ${policyId} not found: ${e}`); + return !exists; + } } - } + ); }; const expectEnrichPolicyExists = async (policyId: string) => @@ -66,18 +66,19 @@ export const elasticAssetCheckerFactory = (getService: FtrProviderContext['getSe expectEnrichPolicyStatus(policyId, false); const expectComponentTemplatStatus = async (templateName: string, exists: boolean) => { - try { - await es.cluster.getComponentTemplate({ name: templateName }); - if (!exists) { - throw new Error(`Expected component template ${templateName} to not exist, but it does`); - } - } catch (e) { - if (exists) { - throw new Error( - `Expected component template ${templateName} to exist, but it does not: ${e}` - ); + await retry.waitForWithTimeout( + `component template ${templateName} to ${exists ? 'exist' : 'not exist'}`, + 10_000, + async () => { + try { + await es.cluster.getComponentTemplate({ name: templateName }); + return exists; // Component template exists + } catch (e) { + log.debug(`Component template ${templateName} not found: ${e}`); + return !exists; // Component template does not exist + } } - } + ); }; const expectComponentTemplateExists = async (templateName: string) => @@ -87,23 +88,45 @@ export const elasticAssetCheckerFactory = (getService: FtrProviderContext['getSe expectComponentTemplatStatus(templateName, false); const expectIngestPipelineStatus = async (pipelineId: string, exists: boolean) => { + await retry.waitForWithTimeout( + `ingest pipeline ${pipelineId} to ${exists ? 'exist' : 'not exist'}`, + 10_000, + async () => { + try { + await es.ingest.getPipeline({ id: pipelineId }); + return exists; // Ingest pipeline exists + } catch (e) { + log.debug(`Ingest pipeline ${pipelineId} not found: ${e}`); + return !exists; // Ingest pipeline does not exist + } + } + ); + }; + + const expectIngestPipelineExists = async (pipelineId: string) => + expectIngestPipelineStatus(pipelineId, true); + + const expectIngestPipelineNotFound = async (pipelineId: string) => + expectIngestPipelineStatus(pipelineId, false); + + const expectIndexStatus = async (indexName: string, exists: boolean) => { try { - await es.ingest.getPipeline({ id: pipelineId }); + await es.indices.get({ index: indexName }); if (!exists) { - throw new Error(`Expected ingest pipeline ${pipelineId} to not exist, but it does`); + throw new Error(`Expected index ${indexName} to not exist, but it does`); } } catch (e) { if (exists) { - throw new Error(`Expected ingest pipeline ${pipelineId} to exist, but it does not: ${e}`); + throw new Error(`Expected index ${indexName} to exist, but it does not: ${e}`); } } }; - const expectIngestPipelineExists = async (pipelineId: string) => - expectIngestPipelineStatus(pipelineId, true); + const expectEntitiesIndexExists = async (entityType: string, namespace: string) => + expectIndexStatus(`.entities.v1.latest.security_${entityType}_${namespace}`, true); - const expectIngestPipelineNotFound = async (pipelineId: string) => - expectIngestPipelineStatus(pipelineId, false); + const expectEntitiesIndexNotFound = async (entityType: string, namespace: string) => + expectIndexStatus(`.entities.v1.latest.security_${entityType}_${namespace}`, false); return { expectComponentTemplateExists, @@ -112,6 +135,8 @@ export const elasticAssetCheckerFactory = (getService: FtrProviderContext['getSe expectEnrichPolicyNotFound, expectIngestPipelineExists, expectIngestPipelineNotFound, + expectEntitiesIndexExists, + expectEntitiesIndexNotFound, expectTransformExists, expectTransformNotFound, }; diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/entity_store.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/entity_store.ts index 24c1434b5e4a5..029103425af68 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/entity_store.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/utils/entity_store.ts @@ -17,6 +17,7 @@ export const EntityStoreUtils = ( const api = getService('securitySolutionApi'); const es = getService('es'); const log = getService('log'); + const retry = getService('retry'); const { expectTransformExists, expectTransformNotFound, @@ -26,6 +27,8 @@ export const EntityStoreUtils = ( expectComponentTemplateNotFound, expectIngestPipelineExists, expectIngestPipelineNotFound, + expectEntitiesIndexExists, + expectEntitiesIndexNotFound, } = elasticAssetCheckerFactory(getService); log.debug(`EntityStoreUtils namespace: ${namespace}`); @@ -48,7 +51,7 @@ export const EntityStoreUtils = ( } }; - const initEntityEngineForEntityType = async (entityType: EntityType) => { + const _initEntityEngineForEntityType = async (entityType: EntityType) => { log.info( `Initializing engine for entity type ${entityType} in namespace ${namespace || 'default'}` ); @@ -68,6 +71,22 @@ export const EntityStoreUtils = ( expect(res.status).to.eql(200); }; + const initEntityEngineForEntityTypesAndWait = async (entityTypes: EntityType[]) => { + await Promise.all(entityTypes.map((entityType) => _initEntityEngineForEntityType(entityType))); + + await retry.waitForWithTimeout( + `Engines to start for entity types: ${entityTypes.join(', ')}`, + 60_000, + async () => { + const { body } = await api.listEntityEngines(namespace).expect(200); + if (body.engines.every((engine: any) => engine.status === 'started')) { + return true; + } + return false; + } + ); + }; + const expectTransformStatus = async ( transformId: string, exists: boolean, @@ -98,21 +117,27 @@ export const EntityStoreUtils = ( const expectEngineAssetsExist = async (entityType: EntityType) => { await expectTransformExists(`entities-v1-latest-security_${entityType}_${namespace}`); - await expectEnrichPolicyExists(`entity_store_field_retention_${entityType}_${namespace}_v1`); + await expectEnrichPolicyExists( + `entity_store_field_retention_${entityType}_${namespace}_v1.0.0` + ); await expectComponentTemplateExists(`security_${entityType}_${namespace}-latest@platform`); await expectIngestPipelineExists(`security_${entityType}_${namespace}-latest@platform`); + await expectEntitiesIndexExists(entityType, namespace); }; const expectEngineAssetsDoNotExist = async (entityType: EntityType) => { await expectTransformNotFound(`entities-v1-latest-security_${entityType}_${namespace}`); - await expectEnrichPolicyNotFound(`entity_store_field_retention_${entityType}_${namespace}_v1`); + await expectEnrichPolicyNotFound( + `entity_store_field_retention_${entityType}_${namespace}_v1.0.0` + ); await expectComponentTemplateNotFound(`security_${entityType}_${namespace}-latest@platform`); await expectIngestPipelineNotFound(`security_${entityType}_${namespace}-latest@platform`); + await expectEntitiesIndexNotFound(entityType, namespace); }; return { cleanEngines, - initEntityEngineForEntityType, + initEntityEngineForEntityTypesAndWait, expectTransformStatus, expectEngineAssetsExist, expectEngineAssetsDoNotExist, From 63ebd41c6c88cedc39a70079a70580027836eabd Mon Sep 17 00:00:00 2001 From: Dzmitry Lemechko Date: Mon, 21 Oct 2024 13:41:00 +0200 Subject: [PATCH 10/69] [kbn-test] error message if MFA is enabled for test account (#196906) ## Summary Recently few engineers reported issues when running FTR **locally** against MKI project on QA env. It turned out MFA was enabled for the test cloud accounts, that breaks automatic login to the Cloud. This PR checks response for `mfa_required: true` and fails without retrying asking to disable MFA for test account. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- packages/kbn-test/src/auth/saml_auth.test.ts | 30 ++++++++++++++++++++ packages/kbn-test/src/auth/saml_auth.ts | 10 +++++++ 2 files changed, 40 insertions(+) diff --git a/packages/kbn-test/src/auth/saml_auth.test.ts b/packages/kbn-test/src/auth/saml_auth.test.ts index 47c4724a8b6a3..aee096bf141d6 100644 --- a/packages/kbn-test/src/auth/saml_auth.test.ts +++ b/packages/kbn-test/src/auth/saml_auth.test.ts @@ -168,6 +168,36 @@ describe('saml_auth', () => { 'Failed to create the new cloud session, check retry arguments: {"attemptsCount":0,"attemptDelay":100}' ); }); + + test(`should fail without retry when response has 'mfa_required: true'`, async () => { + axiosRequestMock.mockImplementation((config: AxiosRequestConfig) => { + if (config.url?.endsWith('/api/v1/saas/auth/_login')) { + return Promise.resolve({ + data: { user_id: 12345, authenticated: false, mfa_required: true }, + status: 200, + }); + } + return Promise.reject(new Error(`Unexpected URL: ${config.url}`)); + }); + + await expect( + createCloudSession( + { + hostname: 'cloud', + email: 'viewer@elastic.co', + password: 'changeme', + log, + }, + { + attemptsCount: 3, + attemptDelay: 100, + } + ) + ).rejects.toThrow( + 'Failed to create the new cloud session: MFA must be disabled for the test account' + ); + expect(axiosRequestMock).toBeCalledTimes(1); + }); }); describe('createSAMLRequest', () => { diff --git a/packages/kbn-test/src/auth/saml_auth.ts b/packages/kbn-test/src/auth/saml_auth.ts index 0ec264d66d425..968788371c827 100644 --- a/packages/kbn-test/src/auth/saml_auth.ts +++ b/packages/kbn-test/src/auth/saml_auth.ts @@ -134,7 +134,17 @@ export const createCloudSession = async ( data[key] = 'REDACTED'; } }); + + // MFA must be disabled for test accounts + if (data.mfa_required === true) { + // Changing MFA configuration requires manual action, skip retry + attemptsLeft = 0; + throw new Error( + `Failed to create the new cloud session: MFA must be disabled for the test account` + ); + } } + throw new Error( `Failed to create the new cloud session: token is missing in response data\n${JSON.stringify( data From 082a89797edaa45a5d20b5378f8d521561800218 Mon Sep 17 00:00:00 2001 From: Jan Monschke Date: Mon, 21 Oct 2024 13:49:39 +0200 Subject: [PATCH 11/69] [SecuritySolutuion] Fix misaligned toolbar in alerts table (#196804) ## Summary Some items in the alerts table's toolbar were misaligned. This PR adds a quick fix for these misaligned items but the actual fix will hopefully be done in EUI (https://github.com/elastic/eui/pull/8085) Before: Screenshot 2024-10-18 at 09 47 53 After: Screenshot 2024-10-18 at 09 47 14 Co-authored-by: Elastic Machine --- .../toolbar/components/alerts_count/alerts_count.tsx | 1 + .../toolbar/components/last_updated_at/index.tsx | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/toolbar/components/alerts_count/alerts_count.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/toolbar/components/alerts_count/alerts_count.tsx index 50eb14ccfa3df..45ca382686752 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/toolbar/components/alerts_count/alerts_count.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/toolbar/components/alerts_count/alerts_count.tsx @@ -33,6 +33,7 @@ export const AlertsCount = ({ count }: { count: number }) => { border-right: ${euiTheme.border.thin}; margin-right: ${euiTheme.size.s}; padding-right: ${euiTheme.size.m}; + align-self: center; `} > {alertCountText} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/toolbar/components/last_updated_at/index.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/toolbar/components/last_updated_at/index.tsx index f2631b9fc0f26..73005464a80c7 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/toolbar/components/last_updated_at/index.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/toolbar/components/last_updated_at/index.tsx @@ -9,6 +9,7 @@ import { EuiText, EuiToolTip } from '@elastic/eui'; import { FormattedRelative } from '@kbn/i18n-react'; import React, { useEffect, useMemo, useState } from 'react'; +import { css } from '@emotion/react'; import * as i18n from './translations'; export interface LastUpdatedAtProps { @@ -36,6 +37,12 @@ Updated.displayName = 'Updated'; const prefix = ` ${i18n.UPDATED} `; +const anchorStyles = { + css: css` + align-self: center; + `, +}; + export const LastUpdatedAt = React.memo( ({ compact = false, updatedAt, showUpdating = false }) => { const [date, setDate] = useState(Date.now()); @@ -64,7 +71,10 @@ export const LastUpdatedAt = React.memo( }, [compact, date, showUpdating, updatedAt]); return ( - }> + } + anchorProps={anchorStyles} + > {updateText} From 492a9a4643b37d2bf393a3d549c50dcfba16907f Mon Sep 17 00:00:00 2001 From: Jeramy Soucy Date: Mon, 21 Oct 2024 14:33:34 +0200 Subject: [PATCH 12/69] Unskips api key functional tests in MKI (#196572) Closes #186619 ## Summary Tested against a new QA project, the platform security api key functional test now passes as expected. Update: the serverless functional UI API key test has also been modified to account for a non-empty start state, and to be non-destructive. If any API keys exist prior to running this test, they will not interfere with the test and they will remain after the test completes. Flaky test runners: - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7184 - Security re-run https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7195 --- .../api_keys/api_keys_grid/api_keys_table.tsx | 2 +- .../functional/page_objects/api_keys_page.ts | 18 ++++++++- .../common/platform_security/api_keys.ts | 38 ++++++------------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_table.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_table.tsx index 63124b4db2d44..f536b5838bab7 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_table.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_table.tsx @@ -230,7 +230,7 @@ export const ApiKeysTable: FunctionComponent = ({ color: 'danger', onClick: (item) => onDelete([item]), available: deletable, - 'data-test-subj': 'apiKeysTableDeleteAction', + 'data-test-subj': (item) => `apiKeysTableDeleteAction-${item.name}`, }, ], }); diff --git a/x-pack/test/functional/page_objects/api_keys_page.ts b/x-pack/test/functional/page_objects/api_keys_page.ts index 8f74f927b976f..9b196f70eeef0 100644 --- a/x-pack/test/functional/page_objects/api_keys_page.ts +++ b/x-pack/test/functional/page_objects/api_keys_page.ts @@ -78,15 +78,25 @@ export function ApiKeysPageProvider({ getService }: FtrProviderContext) { return euiCallOutHeader.getVisibleText(); }, + async isPromptPage() { + return await testSubjects.exists('apiKeysCreatePromptButton'); + }, + async getApiKeysFirstPromptTitle() { const titlePromptElem = await find.byCssSelector('.euiEmptyPrompt .euiTitle'); return await titlePromptElem.getVisibleText(); }, + async deleteApiKeyByName(apiKeyName: string) { + await testSubjects.click(`apiKeysTableDeleteAction-${apiKeyName}`); + await testSubjects.click('confirmModalConfirmButton'); + await testSubjects.waitForDeleted(`apiKeyRowName-${apiKeyName}`); + }, + async deleteAllApiKeyOneByOne() { - const hasApiKeysToDelete = await testSubjects.exists('apiKeysTableDeleteAction'); + const hasApiKeysToDelete = await testSubjects.exists('*apiKeysTableDeleteAction'); if (hasApiKeysToDelete) { - const apiKeysToDelete = await testSubjects.findAll('apiKeysTableDeleteAction'); + const apiKeysToDelete = await testSubjects.findAll('*apiKeysTableDeleteAction'); for (const element of apiKeysToDelete) { await element.click(); await testSubjects.click('confirmModalConfirmButton'); @@ -113,6 +123,10 @@ export function ApiKeysPageProvider({ getService }: FtrProviderContext) { await testSubjects.existOrFail(`apiKeyRowName-${apiKeyName}`); }, + async doesApiKeyExist(apiKeyName: string) { + return await testSubjects.exists(`apiKeyRowName-${apiKeyName}`); + }, + async getMetadataSwitch() { return await testSubjects.find('apiKeysMetadataSwitch'); }, diff --git a/x-pack/test_serverless/functional/test_suites/common/platform_security/api_keys.ts b/x-pack/test_serverless/functional/test_suites/common/platform_security/api_keys.ts index 897299bb265ed..3a6cc43e31486 100644 --- a/x-pack/test_serverless/functional/test_suites/common/platform_security/api_keys.ts +++ b/x-pack/test_serverless/functional/test_suites/common/platform_security/api_keys.ts @@ -6,47 +6,31 @@ */ import expect from '@kbn/expect'; -import { Client } from '@elastic/elasticsearch'; -import { ToolingLog } from '@kbn/tooling-log'; import { FtrProviderContext } from '../../../ftr_provider_context'; -async function clearAllApiKeys(esClient: Client, logger: ToolingLog) { - const existingKeys = await esClient.security.queryApiKeys(); - if (existingKeys.count > 0) { - await Promise.all( - existingKeys.api_keys.map(async (key) => { - await esClient.security.invalidateApiKey({ ids: [key.id] }); - }) - ); - } else { - logger.debug('No API keys to delete.'); - } -} - export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'svlCommonPage', 'apiKeys']); const browser = getService('browser'); - const es = getService('es'); - const log = getService('log'); describe('API keys', function () { - // TimeoutError: Waiting for element to be located By(css selector, [data-test-subj="apiKeysCreatePromptButton"]) Wait timed out after 10028ms - this.tags(['failsOnMKI']); before(async () => { await pageObjects.svlCommonPage.loginAsAdmin(); }); - after(async () => { - await clearAllApiKeys(es, log); - }); - it('should create and delete API keys correctly', async () => { await pageObjects.common.navigateToUrl('management', 'security/api_keys', { shouldUseHashForSubUrl: false, }); - const apiKeyName = 'Happy API Key'; - await pageObjects.apiKeys.clickOnPromptCreateApiKey(); + // name needs to be unique because we will confirm deletion by name + const apiKeyName = `API Key ${Date.now()}`; + + // If there are any existing API keys (e.g. will occur on projects created with QAF), + // the table will be displayed. Otherwise, the empty prompt is displayed. + const isPromptPage = await pageObjects.apiKeys.isPromptPage(); + if (isPromptPage) await pageObjects.apiKeys.clickOnPromptCreateApiKey(); + else await pageObjects.apiKeys.clickOnTableCreateApiKey(); + expect(await browser.getCurrentUrl()).to.contain('app/management/security/api_keys/create'); expect(await pageObjects.apiKeys.getFlyoutTitleText()).to.be('Create API key'); @@ -61,7 +45,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(await pageObjects.apiKeys.isApiKeyModalExists()).to.be(false); expect(newApiKeyCreation).to.be(`Created API key '${apiKeyName}'`); - await pageObjects.apiKeys.deleteAllApiKeyOneByOne(); + await pageObjects.apiKeys.ensureApiKeyExists(apiKeyName); + await pageObjects.apiKeys.deleteApiKeyByName(apiKeyName); + expect(await pageObjects.apiKeys.doesApiKeyExist(apiKeyName)).to.be(false); }); }); }; From 9577aa980dd1565fba05e34292fb5c0bba692889 Mon Sep 17 00:00:00 2001 From: Jan Monschke Date: Mon, 21 Oct 2024 14:39:05 +0200 Subject: [PATCH 13/69] [SecuritySolution] Clean up loading state when the timeline import modal closes (#197018) ## Summary Fixes: https://github.com/elastic/kibana/issues/196877 The above issue describes an issue where the timeline import modal can get into a broken state after a timeline failed to import. The fix was to synchronize the loading state of the modal. --- .../public/common/components/import_data_modal/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx b/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx index 7fee04747408e..0d4e51692e7c9 100644 --- a/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx @@ -91,6 +91,7 @@ export const ImportDataModalComponent = ({ setOverwriteExceptions(false); setOverwriteActionConnectors(false); setActionConnectorsWarnings([]); + setIsImporting(false); }, [closeModal, setOverwrite, setOverwriteExceptions]); const onImportComplete = useCallback( From 6bfe8a7a9ee93ced88d182ba46d5632cf4ee5074 Mon Sep 17 00:00:00 2001 From: Jill Guyonnet Date: Mon, 21 Oct 2024 13:52:20 +0100 Subject: [PATCH 14/69] [Fleet] Enabled cert validation on fleet server health check (#196744) ## Summary Certificate validation is disabled for the request to `/api/status` on Fleet Server within the `POST /health_check` endpoint. Even though this is an internal request, it has been flagged as a security concern. The `POST /health_check` endpoint is only accessed from the [Fleet Debugger](https://github.com/elastic/kibana/blob/main/x-pack/plugins/fleet/dev_docs/fleet_debugger.md) at `app/fleet/_debug`, so this a low risk impact change. ### How to test Run a Fleet Server and load the Fleet Debugger at `app/fleet/_debug`. The Fleet Server health check should work normally. Co-authored-by: Elastic Machine --- x-pack/plugins/fleet/server/routes/health_check/handler.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/x-pack/plugins/fleet/server/routes/health_check/handler.ts b/x-pack/plugins/fleet/server/routes/health_check/handler.ts index d6a782d271d9d..f191caa3fff1b 100644 --- a/x-pack/plugins/fleet/server/routes/health_check/handler.ts +++ b/x-pack/plugins/fleet/server/routes/health_check/handler.ts @@ -5,8 +5,6 @@ * 2.0. */ -import https from 'https'; - import type { TypeOf } from '@kbn/config-schema'; import fetch from 'node-fetch'; @@ -60,9 +58,6 @@ export const postHealthCheckHandler: FleetRequestHandler< accept: '*/*', }, method: 'GET', - agent: new https.Agent({ - rejectUnauthorized: false, - }), signal: abortController.signal, }); const bodyRes = await res.json(); From 3b8cf1236b1b6ba67862f35f47fcb250d88ac4c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Mon, 21 Oct 2024 09:02:59 -0400 Subject: [PATCH 15/69] Improve task manager functional tests in preperation for mget task claimer being the default (#196399) Resolves https://github.com/elastic/kibana/issues/184942 Resolves https://github.com/elastic/kibana/issues/192023 Resolves https://github.com/elastic/kibana/issues/195573 In this PR, I'm improving the flakiness found in our functional tests in preperation for mget being the default task claimer that all these tests run with (https://github.com/elastic/kibana/issues/194625). Because the mget task claimer works differently and also polls more frequently, we end-up in situations where tasks run faster than they were with update_by_query, creating more race conditions that are now fixed in this PR. Issues were surfaced via https://github.com/elastic/kibana/pull/190148 where I set `mget` as the default task claiming strategy. Flaky test runs (some of these failed on other tests that are flaky): - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7151 - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7169 - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7172 - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7175 - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7176 - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7185 (for https://github.com/elastic/kibana/pull/196399/commits/0fcf1ae68927277a8f544278903edbf5912a1649) --- .../actions/server/lib/retry_if_conflicts.ts | 2 +- .../alerting/server/lib/retry_if_conflicts.ts | 2 +- .../server/task_claimers/strategy_mget.ts | 5 +- .../plugins/alerts/server/action_types.ts | 1 + .../packages/helpers/es_test_index_tool.ts | 17 ++++- .../group1/tests/alerting/backfill/api_key.ts | 2 +- .../group4/tests/alerting/alerts.ts | 8 +-- .../tests/alerting/group1/event_log.ts | 72 ++++++++++++++----- .../alerts_as_data/alerts_as_data_flapping.ts | 12 +++- .../builtin_alert_types/long_running/rule.ts | 12 ++-- .../tests/alerting/group4/notify_when.ts | 6 +- .../test_suites/task_manager/metrics_route.ts | 27 ++++--- .../task_manager/task_management.ts | 2 +- .../task_management_removed_types.ts | 14 +++- .../server/init_routes.ts | 1 + .../test_suites/task_manager/health_route.ts | 14 ++-- .../task_manager/task_management.ts | 15 ++-- .../task_management_removed_types.ts | 22 +++++- 18 files changed, 174 insertions(+), 60 deletions(-) diff --git a/x-pack/plugins/actions/server/lib/retry_if_conflicts.ts b/x-pack/plugins/actions/server/lib/retry_if_conflicts.ts index 4778e1ced1013..bae6bd95a682f 100644 --- a/x-pack/plugins/actions/server/lib/retry_if_conflicts.ts +++ b/x-pack/plugins/actions/server/lib/retry_if_conflicts.ts @@ -20,7 +20,7 @@ export const RetryForConflictsAttempts = 2; // note: we considered making this random, to help avoid a stampede, but // with 1 retry it probably doesn't matter, and adding randomness could // make it harder to diagnose issues -const RetryForConflictsDelay = 250; +const RetryForConflictsDelay = 100; // retry an operation if it runs into 409 Conflict's, up to a limit export async function retryIfConflicts( diff --git a/x-pack/plugins/alerting/server/lib/retry_if_conflicts.ts b/x-pack/plugins/alerting/server/lib/retry_if_conflicts.ts index 8b7a3b5f76c8a..0f9377e83ee6c 100644 --- a/x-pack/plugins/alerting/server/lib/retry_if_conflicts.ts +++ b/x-pack/plugins/alerting/server/lib/retry_if_conflicts.ts @@ -22,7 +22,7 @@ export const RetryForConflictsAttempts = 2; // note: we considered making this random, to help avoid a stampede, but // with 1 retry it probably doesn't matter, and adding randomness could // make it harder to diagnose issues -const RetryForConflictsDelay = 250; +const RetryForConflictsDelay = 100; // retry an operation if it runs into 409 Conflict's, up to a limit export async function retryIfConflicts( diff --git a/x-pack/plugins/task_manager/server/task_claimers/strategy_mget.ts b/x-pack/plugins/task_manager/server/task_claimers/strategy_mget.ts index aa69742998c74..407cf6b90dd6c 100644 --- a/x-pack/plugins/task_manager/server/task_claimers/strategy_mget.ts +++ b/x-pack/plugins/task_manager/server/task_claimers/strategy_mget.ts @@ -357,7 +357,10 @@ async function searchAvailableTasks({ // Task must be enabled EnabledTask, // a task type that's not excluded (may be removed or not) - OneOfTaskTypes('task.taskType', claimPartitions.unlimitedTypes), + OneOfTaskTypes( + 'task.taskType', + claimPartitions.unlimitedTypes.concat(Array.from(removedTypes)) + ), // Either a task with idle status and runAt <= now or // status running or claiming with a retryAt <= now. shouldBeOneOf(IdleTaskWithExpiredRunAt, RunningOrClaimingTaskWithExpiredRetryAt), diff --git a/x-pack/test/alerting_api_integration/common/plugins/alerts/server/action_types.ts b/x-pack/test/alerting_api_integration/common/plugins/alerts/server/action_types.ts index 8d5caf79a4c89..bf69461b0382a 100644 --- a/x-pack/test/alerting_api_integration/common/plugins/alerts/server/action_types.ts +++ b/x-pack/test/alerting_api_integration/common/plugins/alerts/server/action_types.ts @@ -132,6 +132,7 @@ function getIndexRecordActionType() { secrets, reference: params.reference, source: 'action:test.index-record', + '@timestamp': new Date(), }, }); return { status: 'ok', actionId }; diff --git a/x-pack/test/alerting_api_integration/packages/helpers/es_test_index_tool.ts b/x-pack/test/alerting_api_integration/packages/helpers/es_test_index_tool.ts index 1a84915a5c935..b0de8872e177d 100644 --- a/x-pack/test/alerting_api_integration/packages/helpers/es_test_index_tool.ts +++ b/x-pack/test/alerting_api_integration/packages/helpers/es_test_index_tool.ts @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { omit } from 'lodash'; import type { Client } from '@elastic/elasticsearch'; import { DeleteByQueryRequest } from '@elastic/elasticsearch/lib/api/types'; @@ -61,6 +62,9 @@ export class ESTestIndexTool { group: { type: 'keyword', }, + '@timestamp': { + type: 'date', + }, host: { properties: { hostname: { @@ -109,6 +113,7 @@ export class ESTestIndexTool { async search(source: string, reference?: string) { const body = reference ? { + sort: [{ '@timestamp': 'asc' }], query: { bool: { must: [ @@ -127,6 +132,7 @@ export class ESTestIndexTool { }, } : { + sort: [{ '@timestamp': 'asc' }], query: { term: { source, @@ -138,7 +144,16 @@ export class ESTestIndexTool { size: 1000, body, }; - return await this.es.search(params, { meta: true }); + const result = await this.es.search(params, { meta: true }); + result.body.hits.hits = result.body.hits.hits.map((hit) => { + return { + ...hit, + // Easier to remove @timestamp than to have all the downstream code ignore it + // in their assertions + _source: omit(hit._source as Record, '@timestamp'), + }; + }); + return result; } async getAll(size: number = 10) { diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/api_key.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/api_key.ts index bbb97281b82b1..46a92d176bab0 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/api_key.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/api_key.ts @@ -125,7 +125,7 @@ export default function apiKeyBackfillTests({ getService }: FtrProviderContext) } it('should wait to invalidate API key until backfill for rule is complete', async () => { - const start = moment().utc().startOf('day').subtract(7, 'days').toISOString(); + const start = moment().utc().startOf('day').subtract(13, 'days').toISOString(); const end = moment().utc().startOf('day').subtract(4, 'day').toISOString(); const spaceId = SuperuserAtSpace1.space.id; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/alerts.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/alerts.ts index 9d3cac9ef9a6d..78213729efdf8 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/alerts.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/alerts.ts @@ -1184,7 +1184,7 @@ instanceStateValue: true reference, overwrites: { enabled: false, - schedule: { interval: '1s' }, + schedule: { interval: '1m' }, }, }); @@ -1288,7 +1288,7 @@ instanceStateValue: true ); // @ts-expect-error doesnt handle total: number - expect(searchResult.body.hits.total.value).to.eql(1); + expect(searchResult.body.hits.total.value).to.be.greaterThan(0); // @ts-expect-error _source: unknown expect(searchResult.body.hits.hits[0]._source.params.message).to.eql( 'Alerts, all:2, new:2 IDs:[1,2,], ongoing:0 IDs:[], recovered:0 IDs:[]' @@ -1304,7 +1304,7 @@ instanceStateValue: true const response = await alertUtils.createAlwaysFiringRuleWithSummaryAction({ reference, overwrites: { - schedule: { interval: '1s' }, + schedule: { interval: '1h' }, }, notifyWhen: 'onActiveAlert', throttle: null, @@ -1435,7 +1435,7 @@ instanceStateValue: true const response = await alertUtils.createAlwaysFiringRuleWithSummaryAction({ reference, overwrites: { - schedule: { interval: '1s' }, + schedule: { interval: '3s' }, }, notifyWhen: 'onThrottleInterval', throttle: '10s', diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/event_log.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/event_log.ts index e25d64e509101..e3023a0d6c8f7 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/event_log.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/event_log.ts @@ -82,8 +82,8 @@ export default function eventLogTests({ getService }: FtrProviderContext) { .send( getTestRuleData({ rule_type_id: 'test.patternFiring', - schedule: { interval: '1s' }, - throttle: null, + schedule: { interval: '2s' }, + throttle: '1s', params: { pattern, }, @@ -665,6 +665,10 @@ export default function eventLogTests({ getService }: FtrProviderContext) { status_change_threshold: 4, }) .expect(200); + + // wait so cache expires + await setTimeoutAsync(TEST_CACHE_EXPIRATION_TIME); + const { body: createdAction } = await supertest .post(`${getUrlPrefix(space.id)}/api/actions/connector`) .set('kbn-xsrf', 'foo') @@ -763,6 +767,10 @@ export default function eventLogTests({ getService }: FtrProviderContext) { status_change_threshold: 4, }) .expect(200); + + // wait so cache expires + await setTimeoutAsync(TEST_CACHE_EXPIRATION_TIME); + const { body: createdAction } = await supertest .post(`${getUrlPrefix(space.id)}/api/actions/connector`) .set('kbn-xsrf', 'foo') @@ -871,6 +879,10 @@ export default function eventLogTests({ getService }: FtrProviderContext) { status_change_threshold: 4, }) .expect(200); + + // wait so cache expires + await setTimeoutAsync(TEST_CACHE_EXPIRATION_TIME); + const { body: createdAction } = await supertest .post(`${getUrlPrefix(space.id)}/api/actions/connector`) .set('kbn-xsrf', 'foo') @@ -964,6 +976,10 @@ export default function eventLogTests({ getService }: FtrProviderContext) { status_change_threshold: 4, }) .expect(200); + + // wait so cache expires + await setTimeoutAsync(TEST_CACHE_EXPIRATION_TIME); + const { body: createdAction } = await supertest .post(`${getUrlPrefix(space.id)}/api/actions/connector`) .set('kbn-xsrf', 'foo') @@ -1067,6 +1083,10 @@ export default function eventLogTests({ getService }: FtrProviderContext) { status_change_threshold: 5, }) .expect(200); + + // wait so cache expires + await setTimeoutAsync(TEST_CACHE_EXPIRATION_TIME); + const { body: createdAction } = await supertest .post(`${getUrlPrefix(space.id)}/api/actions/connector`) .set('kbn-xsrf', 'foo') @@ -1166,6 +1186,10 @@ export default function eventLogTests({ getService }: FtrProviderContext) { status_change_threshold: 4, }) .expect(200); + + // wait so cache expires + await setTimeoutAsync(TEST_CACHE_EXPIRATION_TIME); + const { body: createdAction } = await supertest .post(`${getUrlPrefix(space.id)}/api/actions/connector`) .set('kbn-xsrf', 'foo') @@ -1192,7 +1216,8 @@ export default function eventLogTests({ getService }: FtrProviderContext) { .send( getTestRuleData({ rule_type_id: 'test.patternFiring', - schedule: { interval: '1s' }, + schedule: { interval: '2s' }, + notify_when: RuleNotifyWhen.THROTTLE, throttle: '1s', params: { pattern, @@ -1263,6 +1288,10 @@ export default function eventLogTests({ getService }: FtrProviderContext) { status_change_threshold: 4, }) .expect(200); + + // wait so cache expires + await setTimeoutAsync(TEST_CACHE_EXPIRATION_TIME); + const { body: createdAction } = await supertest .post(`${getUrlPrefix(space.id)}/api/actions/connector`) .set('kbn-xsrf', 'foo') @@ -1289,7 +1318,7 @@ export default function eventLogTests({ getService }: FtrProviderContext) { .send( getTestRuleData({ rule_type_id: 'test.patternFiring', - schedule: { interval: '1s' }, + schedule: { interval: '2s' }, throttle: null, notify_when: null, params: { @@ -1302,8 +1331,7 @@ export default function eventLogTests({ getService }: FtrProviderContext) { params: {}, frequency: { summary: false, - throttle: '1s', - notify_when: RuleNotifyWhen.THROTTLE, + notify_when: RuleNotifyWhen.ACTIVE, }, }, { @@ -1312,8 +1340,7 @@ export default function eventLogTests({ getService }: FtrProviderContext) { params: {}, frequency: { summary: false, - throttle: '1s', - notify_when: RuleNotifyWhen.THROTTLE, + notify_when: RuleNotifyWhen.ACTIVE, }, }, ], @@ -1371,6 +1398,10 @@ export default function eventLogTests({ getService }: FtrProviderContext) { status_change_threshold: 4, }) .expect(200); + + // wait so cache expires + await setTimeoutAsync(TEST_CACHE_EXPIRATION_TIME); + const { body: createdAction } = await supertest .post(`${getUrlPrefix(space.id)}/api/actions/connector`) .set('kbn-xsrf', 'foo') @@ -1396,7 +1427,7 @@ export default function eventLogTests({ getService }: FtrProviderContext) { .send( getTestRuleData({ rule_type_id: 'test.patternFiring', - schedule: { interval: '1s' }, + schedule: { interval: '2s' }, throttle: '1s', params: { pattern, @@ -1463,6 +1494,10 @@ export default function eventLogTests({ getService }: FtrProviderContext) { status_change_threshold: 4, }) .expect(200); + + // wait so cache expires + await setTimeoutAsync(TEST_CACHE_EXPIRATION_TIME); + const { body: createdAction } = await supertest .post(`${getUrlPrefix(space.id)}/api/actions/connector`) .set('kbn-xsrf', 'foo') @@ -1488,7 +1523,7 @@ export default function eventLogTests({ getService }: FtrProviderContext) { .send( getTestRuleData({ rule_type_id: 'test.patternFiring', - schedule: { interval: '1s' }, + schedule: { interval: '2s' }, throttle: null, notify_when: null, params: { @@ -1501,8 +1536,7 @@ export default function eventLogTests({ getService }: FtrProviderContext) { params: {}, frequency: { summary: false, - throttle: '1s', - notify_when: RuleNotifyWhen.THROTTLE, + notify_when: RuleNotifyWhen.ACTIVE, }, }, { @@ -1511,8 +1545,7 @@ export default function eventLogTests({ getService }: FtrProviderContext) { params: {}, frequency: { summary: false, - throttle: '1s', - notify_when: RuleNotifyWhen.THROTTLE, + notify_when: RuleNotifyWhen.ACTIVE, }, }, ], @@ -1567,6 +1600,9 @@ export default function eventLogTests({ getService }: FtrProviderContext) { }) .expect(200); + // wait so cache expires + await setTimeoutAsync(TEST_CACHE_EXPIRATION_TIME); + // flap and then recover, then active again const instance = [true, false, true, false, true].concat( ...new Array(6).fill(false), @@ -1709,8 +1745,8 @@ export default function eventLogTests({ getService }: FtrProviderContext) { .send( getTestRuleData({ rule_type_id: 'test.patternFiring', - schedule: { interval: '1s' }, - throttle: null, + schedule: { interval: '2s' }, + throttle: '1s', params: { pattern, }, @@ -1942,8 +1978,8 @@ export default function eventLogTests({ getService }: FtrProviderContext) { provider: 'alerting', actions: new Map([ // make sure the counts of the # of events per type are as expected - ['execute-start', { equal: 6 }], - ['execute', { equal: 6 }], + ['execute-start', { gte: 6 }], + ['execute', { gte: 6 }], ['new-instance', { equal: 1 }], ['active-instance', { equal: 2 }], ['recovered-instance', { equal: 1 }], diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_flapping.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_flapping.ts index 4ee2ea9e18c3c..1035ba1902dfe 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_flapping.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_flapping.ts @@ -35,9 +35,7 @@ export default function createAlertsAsDataFlappingTest({ getService }: FtrProvid const alertsAsDataIndex = '.alerts-test.patternfiring.alerts-default'; - // FLAKY: https://github.com/elastic/kibana/issues/195573 - // Failing: See https://github.com/elastic/kibana/issues/195573 - describe.skip('alerts as data flapping', function () { + describe('alerts as data flapping', function () { this.tags('skipFIPS'); beforeEach(async () => { await es.deleteByQuery({ @@ -712,6 +710,9 @@ export default function createAlertsAsDataFlappingTest({ getService }: FtrProvid }) .expect(200); + // wait so cache expires + await setTimeoutAsync(TEST_CACHE_EXPIRATION_TIME); + // Wait for the rule to run once let run = 1; let runWhichItFlapped = 0; @@ -754,6 +755,11 @@ export default function createAlertsAsDataFlappingTest({ getService }: FtrProvid const searchResult = await es.search({ index: alertsAsDataIndex, body: { + sort: [ + { + '@timestamp': 'desc', + }, + ], query: { bool: { must: { diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/builtin_alert_types/long_running/rule.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/builtin_alert_types/long_running/rule.ts index 7ea429f1be92f..49ad3abeb063b 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/builtin_alert_types/long_running/rule.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/builtin_alert_types/long_running/rule.ts @@ -110,11 +110,13 @@ export default function ruleTests({ getService }: FtrProviderContext) { }); }); - const { status, body: rule } = await supertest.get( - `${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule/${ruleId}` - ); - expect(status).to.eql(200); - expect(rule.execution_status.status).to.eql('active'); + await retry.try(async () => { + const { status, body: rule } = await supertest.get( + `${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule/${ruleId}` + ); + expect(status).to.eql(200); + expect(rule.execution_status.status).to.eql('active'); + }); }); it('still logs alert docs when rule exceeds timeout when cancelAlertsOnRuleTimeout is false on rule type', async () => { diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/notify_when.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/notify_when.ts index e32813934e4c2..5d7b6fc29264b 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/notify_when.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/notify_when.ts @@ -92,7 +92,11 @@ export default function createNotifyWhenTests({ getService }: FtrProviderContext }); }); - const executeActionEvents = getEventsByAction(events, 'execute-action'); + // Slice in case the rule ran more times than we are asserting on + const executeActionEvents = getEventsByAction(events, 'execute-action').slice( + 0, + expectedActionGroupBasedOnPattern.length + ); const executeActionEventsActionGroup = executeActionEvents.map( (event) => event?.kibana?.alerting?.action_group_id ); diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/metrics_route.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/metrics_route.ts index fb8ee402fcc88..50568fe1c206c 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/metrics_route.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/metrics_route.ts @@ -49,10 +49,18 @@ export default function ({ getService }: FtrProviderContext) { describe('task manager metrics', () => { describe('task claim', () => { it('should increment task claim success/total counters', async () => { - // counters are reset every 30 seconds, so wait until the start of a - // fresh counter cycle to make sure values are incrementing + // reset metrics counter + await getMetrics(true); + const metricsResetTime = Date.now(); + // we've resetted the metrics and have 30 seconds before they reset again + // wait for the first set of metrics to be returned after the reset const initialMetrics = ( - await getMetrics(false, (metrics) => metrics?.metrics?.task_claim?.value.total === 1) + await getMetrics( + false, + (metrics) => + !!metrics?.metrics?.task_claim?.timestamp && + new Date(metrics?.metrics?.task_claim?.timestamp).getTime() > metricsResetTime + ) ).metrics; expect(initialMetrics).not.to.be(null); expect(initialMetrics?.task_claim).not.to.be(null); @@ -92,7 +100,7 @@ export default function ({ getService }: FtrProviderContext) { const initialMetrics = ( await getMetrics( false, - (metrics) => metrics?.metrics?.task_claim?.value.total === initialCounterValue + (metrics) => (metrics?.metrics?.task_claim?.value.total || 0) >= initialCounterValue ) ).metrics; expect(initialMetrics).not.to.be(null); @@ -101,7 +109,10 @@ export default function ({ getService }: FtrProviderContext) { // retry until counter value resets const resetMetrics = ( - await getMetrics(false, (m: NodeMetrics) => m?.metrics?.task_claim?.value.total === 1) + await getMetrics( + false, + (m: NodeMetrics) => (m?.metrics?.task_claim?.value.total || 0) >= 1 + ) ).metrics; expect(resetMetrics).not.to.be(null); expect(resetMetrics?.task_claim).not.to.be(null); @@ -113,7 +124,7 @@ export default function ({ getService }: FtrProviderContext) { const initialMetrics = ( await getMetrics( false, - (metrics) => metrics?.metrics?.task_claim?.value.total === initialCounterValue + (metrics) => (metrics?.metrics?.task_claim?.value.total || 0) >= initialCounterValue ) ).metrics; expect(initialMetrics).not.to.be(null); @@ -133,8 +144,8 @@ export default function ({ getService }: FtrProviderContext) { expect(metrics?.task_claim).not.to.be(null); expect(metrics?.task_claim?.value).not.to.be(null); - expect(metrics?.task_claim?.value.success).to.equal(1); - expect(metrics?.task_claim?.value.total).to.equal(1); + expect(metrics?.task_claim?.value.success).to.be.greaterThan(0); + expect(metrics?.task_claim?.value.total).to.be.greaterThan(0); previousTaskClaimTimestamp = metrics?.task_claim?.timestamp!; diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management.ts index c7e9dc4536fb0..defb7763d89ce 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management.ts @@ -797,7 +797,7 @@ export default function ({ getService }: FtrProviderContext) { await retry.try(async () => { const [scheduledTask] = (await currentTasks()).docs; expect(scheduledTask.id).to.eql(task.id); - expect(scheduledTask.status).to.eql('claiming'); + expect(['claiming', 'running'].includes(scheduledTask.status)).to.be(true); expect(scheduledTask.attempts).to.be.greaterThan(3); }); }); diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management_removed_types.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management_removed_types.ts index e35c2c4730815..5c7ef55577861 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management_removed_types.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management_removed_types.ts @@ -77,12 +77,16 @@ export default function ({ getService }: FtrProviderContext) { } it('should successfully schedule registered tasks, not claim unregistered tasks and mark removed task types as unrecognized', async () => { + const testStart = new Date(); const scheduledTask = await scheduleTask({ taskType: 'sampleTask', schedule: { interval: `1s` }, params: {}, }); + let scheduledTaskRuns = 0; + let scheduledTaskInstanceRunAt = scheduledTask.runAt; + await retry.try(async () => { const tasks = (await currentTasks()).docs; expect(tasks.length).to.eql(3); @@ -98,8 +102,16 @@ export default function ({ getService }: FtrProviderContext) { ); const removedTaskInstance = tasks.find((task) => task.id === REMOVED_TASK_TYPE_ID); - expect(scheduledTaskInstance?.status).to.eql('claiming'); + if (scheduledTaskInstance && scheduledTaskInstance.runAt !== scheduledTaskInstanceRunAt) { + scheduledTaskRuns++; + scheduledTaskInstanceRunAt = scheduledTaskInstance.runAt; + } + + expect(scheduledTaskRuns).to.be.greaterThan(2); expect(unregisteredTaskInstance?.status).to.eql('idle'); + expect(new Date(unregisteredTaskInstance?.runAt || testStart).getTime()).to.be.lessThan( + testStart.getTime() + ); expect(removedTaskInstance?.status).to.eql('unrecognized'); }); }); diff --git a/x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/server/init_routes.ts b/x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/server/init_routes.ts index 1c346584beaf2..f1e697399fe09 100644 --- a/x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/server/init_routes.ts +++ b/x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/server/init_routes.ts @@ -371,6 +371,7 @@ export function initRoutes( do { const { docs: tasks } = await taskManager.fetch({ query: taskManagerQuery, + size: 1000, }); tasksFound = tasks.length; await Promise.all(tasks.map((task) => taskManager.remove(task.id))); diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts index 241bd8adcd40d..23e387061830a 100644 --- a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts +++ b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts @@ -6,9 +6,7 @@ */ import expect from '@kbn/expect'; -import url from 'url'; import { keyBy, mapValues } from 'lodash'; -import supertest from 'supertest'; import { ConcreteTaskInstance } from '@kbn/task-manager-plugin/server'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -82,14 +80,13 @@ interface MonitoringStats { } export default function ({ getService }: FtrProviderContext) { - const config = getService('config'); const retry = getService('retry'); - const request = supertest(url.format(config.get('servers.kibana'))); + const supertest = getService('supertest'); const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); function getHealthRequest() { - return request.get('/api/task_manager/_health').set('kbn-xsrf', 'foo'); + return supertest.get('/api/task_manager/_health').set('kbn-xsrf', 'foo'); } function getHealth(): Promise { @@ -114,7 +111,7 @@ export default function ({ getService }: FtrProviderContext) { } function scheduleTask(task: Partial): Promise { - return request + return supertest .post('/api/sample_tasks/schedule') .set('kbn-xsrf', 'xxx') .send({ task }) @@ -125,6 +122,11 @@ export default function ({ getService }: FtrProviderContext) { const monitoredAggregatedStatsRefreshRate = 5000; describe('health', () => { + afterEach(async () => { + // clean up after each test + return await supertest.delete('/api/sample_tasks').set('kbn-xsrf', 'xxx').expect(200); + }); + it('should return basic configuration of task manager', async () => { const health = await getHealth(); expect(health.status).to.eql('OK'); diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management.ts b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management.ts index 6323cef329ed6..f03023fb10ee8 100644 --- a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management.ts +++ b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management.ts @@ -469,8 +469,7 @@ export default function ({ getService }: FtrProviderContext) { }); }); - // always failing - it.skip('should only run as many instances of a task as its maxConcurrency will allow', async () => { + it('should only run as many instances of a task as its maxConcurrency will allow', async () => { // should run as there's only one and maxConcurrency on this TaskType is 1 const firstWithSingleConcurrency = await scheduleTask({ taskType: 'sampleTaskWithSingleConcurrency', @@ -762,18 +761,24 @@ export default function ({ getService }: FtrProviderContext) { }); }); - // flaky - it.skip('should continue claiming recurring task even if maxAttempts has been reached', async () => { + it('should continue claiming recurring task even if maxAttempts has been reached', async () => { const task = await scheduleTask({ taskType: 'sampleRecurringTaskTimingOut', schedule: { interval: '1s' }, params: {}, }); + let taskRuns = 0; + let taskRetryAt = task.retryAt; + await retry.try(async () => { const [scheduledTask] = (await currentTasks()).docs; expect(scheduledTask.id).to.eql(task.id); - expect(scheduledTask.status).to.eql('claiming'); + if (scheduledTask.retryAt !== taskRetryAt) { + taskRuns++; + taskRetryAt = scheduledTask.retryAt; + } + expect(taskRuns).to.be.greaterThan(3); expect(scheduledTask.attempts).to.be.greaterThan(3); }); }); diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management_removed_types.ts b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management_removed_types.ts index e13615cceab0c..aae90a52572c7 100644 --- a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management_removed_types.ts +++ b/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management_removed_types.ts @@ -56,6 +56,11 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.unload('x-pack/test/functional/es_archives/task_manager_removed_types'); }); + afterEach(async () => { + // clean up after each test + return await request.delete('/api/sample_tasks').set('kbn-xsrf', 'xxx').expect(200); + }); + function scheduleTask( task: Partial ): Promise { @@ -76,14 +81,17 @@ export default function ({ getService }: FtrProviderContext) { .then((response) => response.body); } - // flaky - it.skip('should successfully schedule registered tasks, not claim unregistered tasks and mark removed task types as unrecognized', async () => { + it('should successfully schedule registered tasks, not claim unregistered tasks and mark removed task types as unrecognized', async () => { + const testStart = new Date(); const scheduledTask = await scheduleTask({ taskType: 'sampleTask', schedule: { interval: `1s` }, params: {}, }); + let scheduledTaskRuns = 0; + let scheduledTaskInstanceRunAt = scheduledTask.runAt; + await retry.try(async () => { const tasks = (await currentTasks()).docs; expect(tasks.length).to.eql(3); @@ -99,8 +107,16 @@ export default function ({ getService }: FtrProviderContext) { ); const removedTaskInstance = tasks.find((task) => task.id === REMOVED_TASK_TYPE_ID); - expect(scheduledTaskInstance?.status).to.eql('claiming'); + if (scheduledTaskInstance && scheduledTaskInstance.runAt !== scheduledTaskInstanceRunAt) { + scheduledTaskRuns++; + scheduledTaskInstanceRunAt = scheduledTaskInstance.runAt; + } + + expect(scheduledTaskRuns).to.be.greaterThan(2); expect(unregisteredTaskInstance?.status).to.eql('idle'); + expect(new Date(unregisteredTaskInstance?.runAt || testStart).getTime()).to.be.lessThan( + testStart.getTime() + ); expect(removedTaskInstance?.status).to.eql('unrecognized'); }); }); From 5fe8aad89d59726060ba860d2f0692ddb3ca5ffa Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 21 Oct 2024 15:05:02 +0200 Subject: [PATCH 16/69] [Lens] fit line charts by default (#196184) ## Summary Every line charts are now interpolated by default with a linear interpolation. Solves the second task of [#186076](https://github.com/elastic/kibana/issues/186076) fix [#186076](https://github.com/elastic/kibana/issues/186076) before: Screenshot 2024-10-17 at 16 25 47 after: Screenshot 2024-10-17 at 16 25 56 ## Release note Newly and default configured Lens line charts are now interpolated by default with a straight Linear interpolation. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Marta Bondyra <4283304+mbondyra@users.noreply.github.com> --- dev_docs/lens/xy.mdx | 2 +- .../config_builder/charts/xy.test.ts | 4 +- .../config_builder/charts/xy.ts | 4 +- .../expression_functions/common_xy_args.ts | 2 +- .../expression_xy/common/index.ts | 2 +- .../public/helpers/data_layers.tsx | 17 ++----- .../expression_xy/public/index.ts | 2 +- .../visualizations/xy/to_expression.test.ts | 45 +++++++++---------- .../public/visualizations/xy/to_expression.ts | 6 ++- .../fitting_function_definitions.ts | 11 ++--- .../missing_values_option.tsx | 9 ++-- .../visualizations/xy/xy_suggestions.test.ts | 20 ++++----- .../visualizations/xy/xy_suggestions.ts | 5 ++- 13 files changed, 61 insertions(+), 68 deletions(-) diff --git a/dev_docs/lens/xy.mdx b/dev_docs/lens/xy.mdx index a53d7ec5a38e1..fc6fb4e6c15bf 100644 --- a/dev_docs/lens/xy.mdx +++ b/dev_docs/lens/xy.mdx @@ -46,7 +46,7 @@ Understanding `LensXYConfig` in detail ### `emphasizeFitting` - **Type:** `boolean` -- **Description:** When set to true, emphasizes the fitting of lines to the data points in line charts, making trends and patterns more apparent. +- **Description:** When set to true a straight line will be used between isolated points in a line chart, a dashed line will be used otherwise. ### `fittingFunction` diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.test.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.test.ts index 0e197b2bfb98b..9b9e9aa96575e 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.test.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.test.ts @@ -143,8 +143,8 @@ test('generates xy chart config', async () => { "yLeft": true, "yRight": true, }, - "emphasizeFitting": false, - "fittingFunction": "None", + "emphasizeFitting": true, + "fittingFunction": "Linear", "gridlinesVisibilitySettings": Object { "x": true, "yLeft": true, diff --git a/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.ts b/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.ts index b18a1caec2ffa..ccf68e9905621 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/charts/xy.ts @@ -51,8 +51,8 @@ function buildVisualizationState(config: LensXYConfig): XYState { hideEndzones: true, preferredSeriesType: 'line', valueLabels: 'hide', - emphasizeFitting: config?.emphasizeFitting ?? false, - fittingFunction: config?.fittingFunction ?? 'None', + emphasizeFitting: config?.emphasizeFitting ?? true, + fittingFunction: config?.fittingFunction ?? 'Linear', yLeftExtent: { mode: config.yBounds?.mode ?? 'full', lowerBound: config.yBounds?.lowerBound, diff --git a/src/plugins/chart_expressions/expression_xy/common/expression_functions/common_xy_args.ts b/src/plugins/chart_expressions/expression_xy/common/expression_functions/common_xy_args.ts index f9f38e19b7396..4be72d333d781 100644 --- a/src/plugins/chart_expressions/expression_xy/common/expression_functions/common_xy_args.ts +++ b/src/plugins/chart_expressions/expression_xy/common/expression_functions/common_xy_args.ts @@ -40,7 +40,7 @@ export const commonXYArgs: CommonXYFn['args'] = { }, emphasizeFitting: { types: ['boolean'], - default: false, + default: true, help: '', }, valueLabels: { diff --git a/src/plugins/chart_expressions/expression_xy/common/index.ts b/src/plugins/chart_expressions/expression_xy/common/index.ts index dc7c1a7c6334b..6b464a40e87db 100755 --- a/src/plugins/chart_expressions/expression_xy/common/index.ts +++ b/src/plugins/chart_expressions/expression_xy/common/index.ts @@ -10,7 +10,7 @@ export const PLUGIN_ID = 'expressionXy'; export const PLUGIN_NAME = 'expressionXy'; -export { LayerTypes, XYCurveTypes } from './constants'; +export { LayerTypes, XYCurveTypes, FittingFunctions } from './constants'; export type { AllowedXYOverrides, diff --git a/src/plugins/chart_expressions/expression_xy/public/helpers/data_layers.tsx b/src/plugins/chart_expressions/expression_xy/public/helpers/data_layers.tsx index e45edccba2779..473562b63ad5e 100644 --- a/src/plugins/chart_expressions/expression_xy/public/helpers/data_layers.tsx +++ b/src/plugins/chart_expressions/expression_xy/public/helpers/data_layers.tsx @@ -100,7 +100,6 @@ type GetColorFn = ( type GetPointConfigFn = (config: { xAccessor: string | undefined; markSizeAccessor: string | undefined; - emphasizeFitting?: boolean; showPoints?: boolean; pointsRadius?: number; }) => Partial; @@ -297,18 +296,10 @@ export const getSeriesName: GetSeriesNameFn = ( return splitValues.length > 0 ? splitValues.join(' - ') : yAccessorTitle; }; -const getPointConfig: GetPointConfigFn = ({ - xAccessor, - markSizeAccessor, - emphasizeFitting, - showPoints, - pointsRadius, -}) => { +const getPointConfig: GetPointConfigFn = ({ markSizeAccessor, showPoints, pointsRadius }) => { return { - visible: (showPoints !== undefined ? showPoints : !xAccessor || markSizeAccessor !== undefined) - ? 'always' - : 'never', - radius: pointsRadius !== undefined ? pointsRadius : xAccessor && !emphasizeFitting ? 5 : 0, + visible: showPoints || markSizeAccessor ? 'always' : 'never', + radius: pointsRadius, fill: markSizeAccessor ? ColorVariant.Series : undefined, }; }; @@ -550,7 +541,6 @@ export const getSeriesProps: GetSeriesPropsFn = ({ point: getPointConfig({ xAccessor: xColumnId, markSizeAccessor: markSizeColumnId, - emphasizeFitting, showPoints: layer.showPoints, pointsRadius: layer.pointsRadius, }), @@ -567,7 +557,6 @@ export const getSeriesProps: GetSeriesPropsFn = ({ point: getPointConfig({ xAccessor: xColumnId, markSizeAccessor: markSizeColumnId, - emphasizeFitting, showPoints: layer.showPoints, pointsRadius: layer.pointsRadius, }), diff --git a/src/plugins/chart_expressions/expression_xy/public/index.ts b/src/plugins/chart_expressions/expression_xy/public/index.ts index a6e001d5eb5b1..d63ac6c2a5930 100755 --- a/src/plugins/chart_expressions/expression_xy/public/index.ts +++ b/src/plugins/chart_expressions/expression_xy/public/index.ts @@ -15,6 +15,6 @@ export function plugin() { return new ExpressionXyPlugin(); } -export { LayerTypes, XYCurveTypes } from '../common'; +export { LayerTypes, XYCurveTypes, FittingFunctions } from '../common'; export type { ExpressionXyPluginSetup, ExpressionXyPluginStart } from './types'; diff --git a/x-pack/plugins/lens/public/visualizations/xy/to_expression.test.ts b/x-pack/plugins/lens/public/visualizations/xy/to_expression.test.ts index 08a013d036d5e..0571ca43f0bc7 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/to_expression.test.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/to_expression.test.ts @@ -121,31 +121,30 @@ describe('#toExpression', () => { ).toMatchSnapshot(); }); - it('should default the fitting function to None', () => { - expect( - ( - xyVisualization.toExpression( + it('should default the fitting function to Linear', () => { + const ast = xyVisualization.toExpression( + { + legend: { position: Position.Bottom, isVisible: true }, + valueLabels: 'hide', + preferredSeriesType: 'bar', + layers: [ { - legend: { position: Position.Bottom, isVisible: true }, - valueLabels: 'hide', - preferredSeriesType: 'bar', - layers: [ - { - layerId: 'first', - layerType: LayerTypes.DATA, - seriesType: 'area', - splitAccessor: 'd', - xAccessor: 'a', - accessors: ['b', 'c'], - }, - ], + layerId: 'first', + layerType: LayerTypes.DATA, + seriesType: 'area', + splitAccessor: 'd', + xAccessor: 'a', + accessors: ['b', 'c'], }, - frame.datasourceLayers, - undefined, - datasourceExpressionsByLayers - ) as Ast - ).chain[0].arguments.fittingFunction[0] - ).toEqual('None'); + ], + }, + frame.datasourceLayers, + undefined, + datasourceExpressionsByLayers + ) as Ast; + + expect(ast.chain[0].arguments.fittingFunction[0]).toEqual('Linear'); + expect(ast.chain[0].arguments.emphasizeFitting[0]).toEqual(true); }); it('should default the axisTitles visibility settings to true', () => { diff --git a/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts b/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts index c756c4eb137a9..b249624605791 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts @@ -35,6 +35,8 @@ import { XYCurveType, YAxisConfigFn, } from '@kbn/expression-xy-plugin/common'; + +import { FittingFunctions } from '@kbn/expression-xy-plugin/public'; import type { EventAnnotationConfig } from '@kbn/event-annotation-common'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; import { SystemPaletteExpressionFunctionDefinition } from '@kbn/charts-plugin/common'; @@ -336,9 +338,9 @@ export const buildXYExpression = ( const layeredXyVisFn = buildExpressionFunction('layeredXyVis', { legend: buildExpression([legendConfigFn]).toAst(), - fittingFunction: state.fittingFunction ?? 'None', + fittingFunction: state.fittingFunction ?? FittingFunctions.LINEAR, endValue: state.endValue ?? 'None', - emphasizeFitting: state.emphasizeFitting ?? false, + emphasizeFitting: state.emphasizeFitting ?? true, minBarHeight: state.minBarHeight ?? 1, fillOpacity: state.fillOpacity ?? 0.3, valueLabels: state.valueLabels ?? 'hide', diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/fitting_function_definitions.ts b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/fitting_function_definitions.ts index c2286a942baca..2ce2cd5f3cd68 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/fitting_function_definitions.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/fitting_function_definitions.ts @@ -7,10 +7,11 @@ import { i18n } from '@kbn/i18n'; import type { FittingFunction } from '@kbn/expression-xy-plugin/common'; +import { FittingFunctions } from '@kbn/expression-xy-plugin/public'; export const fittingFunctionDefinitions: Array<{ id: FittingFunction } & Record> = [ { - id: 'None', + id: FittingFunctions.NONE, title: i18n.translate('xpack.lens.fittingFunctionsTitle.none', { defaultMessage: 'Hide', }), @@ -19,7 +20,7 @@ export const fittingFunctionDefinitions: Array<{ id: FittingFunction } & Record< }), }, { - id: 'Zero', + id: FittingFunctions.ZERO, title: i18n.translate('xpack.lens.fittingFunctionsTitle.zero', { defaultMessage: 'Zero', }), @@ -28,7 +29,7 @@ export const fittingFunctionDefinitions: Array<{ id: FittingFunction } & Record< }), }, { - id: 'Linear', + id: FittingFunctions.LINEAR, title: i18n.translate('xpack.lens.fittingFunctionsTitle.linear', { defaultMessage: 'Linear', }), @@ -37,7 +38,7 @@ export const fittingFunctionDefinitions: Array<{ id: FittingFunction } & Record< }), }, { - id: 'Carry', + id: FittingFunctions.CARRY, title: i18n.translate('xpack.lens.fittingFunctionsTitle.carry', { defaultMessage: 'Last', }), @@ -46,7 +47,7 @@ export const fittingFunctionDefinitions: Array<{ id: FittingFunction } & Record< }), }, { - id: 'Lookahead', + id: FittingFunctions.LOOKAHEAD, title: i18n.translate('xpack.lens.fittingFunctionsTitle.lookahead', { defaultMessage: 'Next', }), diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/missing_values_option.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/missing_values_option.tsx index feda75599e4cc..c600f4fa4bae4 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/missing_values_option.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/missing_values_option.tsx @@ -9,6 +9,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFormRow, EuiIconTip, EuiSuperSelect, EuiSwitch, EuiText } from '@elastic/eui'; import type { FittingFunction, EndValue } from '@kbn/expression-xy-plugin/common'; +import { FittingFunctions } from '@kbn/expression-xy-plugin/public'; import { fittingFunctionDefinitions } from './fitting_function_definitions'; import { endValueDefinitions } from './end_value_definitions'; @@ -25,7 +26,7 @@ export interface MissingValuesOptionProps { export const MissingValuesOptions: React.FC = ({ onFittingFnChange, fittingFunction, - emphasizeFitting, + emphasizeFitting = true, onEmphasizeFittingChange, onEndValueChange, endValue, @@ -78,13 +79,13 @@ export const MissingValuesOptions: React.FC = ({ inputDisplay: title, }; })} - valueOfSelected={fittingFunction || 'None'} + valueOfSelected={fittingFunction || FittingFunctions.LINEAR} onChange={(value) => onFittingFnChange(value)} itemLayoutAlign="top" hasDividers /> - {fittingFunction && fittingFunction !== 'None' && ( + {fittingFunction && fittingFunction !== FittingFunctions.NONE && ( <> = ({ inputDisplay: title, }; })} - valueOfSelected={endValue || 'None'} + valueOfSelected={endValue || FittingFunctions.NONE} onChange={(value) => onEndValueChange(value)} itemLayoutAlign="top" hasDividers diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.test.ts b/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.test.ts index 77f79b5db6b1a..c81dea60da719 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.test.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.test.ts @@ -633,7 +633,7 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, valueLabels: 'hide', preferredSeriesType: 'bar', - fittingFunction: 'None', + fittingFunction: 'Linear', layers: [ { accessors: ['price'], @@ -691,7 +691,7 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, valueLabels: 'hide', preferredSeriesType: 'bar', - fittingFunction: 'None', + fittingFunction: 'Linear', layers: [ { layerId: 'first', @@ -823,7 +823,7 @@ describe('xy_suggestions', () => { const currentState: XYState = { legend: { isVisible: true, position: 'bottom' }, valueLabels: 'hide', - fittingFunction: 'None', + fittingFunction: 'Linear', preferredSeriesType: 'line', layers: [ { @@ -858,7 +858,7 @@ describe('xy_suggestions', () => { const currentState: XYState = { legend: { isVisible: true, position: 'bottom' }, valueLabels: 'hide', - fittingFunction: 'None', + fittingFunction: 'Linear', axisTitlesVisibilitySettings: { x: true, yLeft: true, yRight: true }, gridlinesVisibilitySettings: { x: true, yLeft: true, yRight: true }, tickLabelsVisibilitySettings: { x: true, yLeft: false, yRight: false }, @@ -908,7 +908,7 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, valueLabels: 'hide', preferredSeriesType: 'bar', - fittingFunction: 'None', + fittingFunction: 'Linear', axisTitlesVisibilitySettings: { x: true, yLeft: true, yRight: true }, gridlinesVisibilitySettings: { x: true, yLeft: true, yRight: true }, tickLabelsVisibilitySettings: { x: true, yLeft: false, yRight: false }, @@ -967,7 +967,7 @@ describe('xy_suggestions', () => { const currentState: XYState = { legend: { isVisible: true, position: 'bottom' }, valueLabels: 'hide', - fittingFunction: 'None', + fittingFunction: 'Linear', preferredSeriesType: 'bar', layers: [ { @@ -1006,7 +1006,7 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, valueLabels: 'hide', preferredSeriesType: 'bar', - fittingFunction: 'None', + fittingFunction: 'Linear', layers: [ { accessors: ['price'], @@ -1043,7 +1043,7 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, valueLabels: 'hide', preferredSeriesType: 'bar', - fittingFunction: 'None', + fittingFunction: 'Linear', axisTitlesVisibilitySettings: { x: true, yLeft: true, yRight: true }, gridlinesVisibilitySettings: { x: true, yLeft: true, yRight: true }, tickLabelsVisibilitySettings: { x: true, yLeft: false, yRight: false }, @@ -1089,7 +1089,7 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, valueLabels: 'hide', preferredSeriesType: 'bar', - fittingFunction: 'None', + fittingFunction: 'Linear', axisTitlesVisibilitySettings: { x: true, yLeft: true, yRight: true }, gridlinesVisibilitySettings: { x: true, yLeft: true, yRight: true }, tickLabelsVisibilitySettings: { x: true, yLeft: false, yRight: false }, @@ -1136,7 +1136,7 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, valueLabels: 'hide', preferredSeriesType: 'bar', - fittingFunction: 'None', + fittingFunction: 'Linear', axisTitlesVisibilitySettings: { x: true, yLeft: true, yRight: true }, gridlinesVisibilitySettings: { x: true, yLeft: true, yRight: true }, tickLabelsVisibilitySettings: { x: true, yLeft: false, yRight: false }, diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.ts b/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.ts index 0974e50ef36fe..49531c6b563be 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.ts @@ -8,7 +8,8 @@ import { i18n } from '@kbn/i18n'; import { partition } from 'lodash'; import { Position } from '@elastic/charts'; -import { LayerTypes } from '@kbn/expression-xy-plugin/public'; +import { FittingFunctions, LayerTypes } from '@kbn/expression-xy-plugin/public'; + import type { SuggestionRequest, VisualizationSuggestion, @@ -573,7 +574,7 @@ function buildSuggestion({ const state: State = { legend: currentState ? currentState.legend : { isVisible: true, position: Position.Right }, valueLabels: currentState?.valueLabels || 'hide', - fittingFunction: currentState?.fittingFunction || 'None', + fittingFunction: currentState?.fittingFunction ?? FittingFunctions.LINEAR, curveType: currentState?.curveType, fillOpacity: currentState?.fillOpacity, xTitle: currentState?.xTitle, From 2d744ffc64cf683e811c4b3b956fb5757f3cf6cb Mon Sep 17 00:00:00 2001 From: Marta Bondyra <4283304+mbondyra@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:21:55 +0200 Subject: [PATCH 17/69] [Lens] Select line chart by default if the x-axis contains a timestamp (#190786) ## Summary Partially resolves https://github.com/elastic/kibana/issues/184102 When dropping a field to a workspace that will create the date histogram visualization, it converts to line. It doesn't do it when dropping to a dimension as it's more complicated thing. The reason for it is that we would have to: - decide if we also want to switch to line when choosing a field from the config panel - allow for an extra behavior (switching visualization types) for the onDrop callback except for only modifying dimensions. ## Release notes When dropping a field into the Lens workspace, the default time-series visualization is a line chart instead of a histogram. --- .../lens/public/visualizations/xy/types.ts | 2 + .../visualizations/xy/visualization.tsx | 2 +- .../xy/visualization_helpers.tsx | 1 - .../visualizations/xy/xy_suggestions.test.ts | 35 ++++++++++++++++ .../visualizations/xy/xy_suggestions.ts | 42 +++++++++---------- .../apps/lens/group1/multiple_data_views.ts | 34 +++++++++------ 6 files changed, 80 insertions(+), 36 deletions(-) diff --git a/x-pack/plugins/lens/public/visualizations/xy/types.ts b/x-pack/plugins/lens/public/visualizations/xy/types.ts index 694799b94638e..ee6575bfe0bbd 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/types.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/types.ts @@ -59,6 +59,8 @@ export const SeriesTypes = { BAR_HORIZONTAL_PERCENTAGE_STACKED: 'bar_horizontal_percentage_stacked', } as const; +export const defaultSeriesType = SeriesTypes.BAR_STACKED; + export type YAxisMode = $Values; export type SeriesType = $Values; export interface AxesSettingsConfig { diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx index 6f17a2253a35e..51f79bf58eeac 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx @@ -89,7 +89,6 @@ import { } from './annotations/helpers'; import { checkXAccessorCompatibility, - defaultSeriesType, getAnnotationLayerTitle, getAnnotationsLayers, getAxisName, @@ -112,6 +111,7 @@ import { } from './visualization_helpers'; import { getAxesConfiguration, groupAxesByType } from './axes_configuration'; import type { XYByValueAnnotationLayerConfig, XYState } from './types'; +import { defaultSeriesType } from './types'; import { defaultAnnotationLabel } from './annotations/helpers'; import { onDropForVisualization } from '../../editor_frame_service/editor_frame/config_panel/buttons/drop_targets_utils'; import { createAnnotationActions } from './annotations/actions'; diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization_helpers.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization_helpers.tsx index 970671128aecf..09f6c0fe18cfd 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization_helpers.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization_helpers.tsx @@ -270,7 +270,6 @@ export function getDescription(state?: State, layerId?: string) { } export const defaultIcon = IconChartBarStacked; -export const defaultSeriesType = 'bar_stacked'; export const supportedDataLayer = { type: layerTypes.DATA, diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.test.ts b/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.test.ts index c81dea60da719..7ce86ed903065 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.test.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.test.ts @@ -854,6 +854,41 @@ describe('xy_suggestions', () => { expect((suggestions[0].state.layers[0] as XYDataLayerConfig).seriesType).toEqual('line'); }); + test('suggests line if changeType is initial and date column is involved', () => { + const currentState: XYState = { + legend: { isVisible: true, position: 'bottom' }, + valueLabels: 'hide', + fittingFunction: 'None', + preferredSeriesType: 'bar_stacked', + layers: [ + { + accessors: [], + layerId: 'first', + layerType: LayerTypes.DATA, + seriesType: 'bar_stacked', + splitAccessor: undefined, + xAccessor: '', + }, + ], + }; + const suggestions = getSuggestions({ + table: { + isMultiRow: true, + columns: [numCol('price'), dateCol('date')], + layerId: 'first', + changeType: 'initial', + }, + state: currentState, + keptLayerIds: ['first'], + }); + + expect(suggestions).toHaveLength(1); + + expect(suggestions[0].hide).toEqual(false); + expect(suggestions[0].state.preferredSeriesType).toEqual('line'); + expect((suggestions[0].state.layers[0] as XYDataLayerConfig).seriesType).toEqual('line'); + }); + test('makes a visible seriesType suggestion for unchanged table without split', () => { const currentState: XYState = { legend: { isVisible: true, position: 'bottom' }, diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.ts b/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.ts index 49531c6b563be..5efaf4d8c949e 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_suggestions.ts @@ -25,6 +25,7 @@ import { XYLayerConfig, XYDataLayerConfig, SeriesType, + defaultSeriesType, } from './types'; import { flipSeriesType, getIconForSeries } from './state_helpers'; import { getDataLayers, isDataLayer } from './visualization_helpers'; @@ -101,21 +102,24 @@ function getSuggestionForColumns( allowMixed?: boolean ): VisualizationSuggestion | Array> | undefined { const [buckets, values] = partition(table.columns, (col) => col.operation.isBucketed); + const sharedArgs = { + layerId: table.layerId, + changeType: table.changeType, + currentState, + tableLabel: table.label, + keptLayerIds, + requestedSeriesType: seriesType, + mainPalette, + allowMixed, + }; if (buckets.length === 1 || buckets.length === 2) { - const [x, splitBy] = getBucketMappings(table, currentState); + const [xValue, splitBy] = getBucketMappings(table, currentState); return getSuggestionsForLayer({ - layerId: table.layerId, - changeType: table.changeType, - xValue: x, + ...sharedArgs, + xValue, yValues: values, splitBy, - currentState, - tableLabel: table.label, - keptLayerIds, - requestedSeriesType: seriesType, - mainPalette, - allowMixed, }); } else if (buckets.length === 0) { const [yValues, [xValue, splitBy]] = partition( @@ -123,17 +127,10 @@ function getSuggestionForColumns( (col) => col.operation.dataType === 'number' && !col.operation.isBucketed ); return getSuggestionsForLayer({ - layerId: table.layerId, - changeType: table.changeType, + ...sharedArgs, xValue, yValues, splitBy, - currentState, - tableLabel: table.label, - keptLayerIds, - requestedSeriesType: seriesType, - mainPalette, - allowMixed, }); } } @@ -236,6 +233,9 @@ function getSuggestionsForLayer({ allowMixed, }; + if (changeType === 'initial' && xValue?.operation.dataType === 'date') { + return buildSuggestion({ ...options, seriesType: 'line' }); + } // handles the simplest cases, acting as a chart switcher if (!currentState && changeType === 'unchanged') { // Chart switcher needs to include every chart type @@ -434,18 +434,16 @@ function getSeriesType( layerId: string, xValue?: TableSuggestionColumn ): SeriesType { - const defaultType = 'bar_stacked'; - const oldLayer = getExistingLayer(currentState, layerId); const oldLayerSeriesType = oldLayer && isDataLayer(oldLayer) ? oldLayer.seriesType : false; const closestSeriesType = - oldLayerSeriesType || (currentState && currentState.preferredSeriesType) || defaultType; + oldLayerSeriesType || (currentState && currentState.preferredSeriesType) || defaultSeriesType; // Attempt to keep the seriesType consistent on initial add of a layer // Ordinal scales should always use a bar because there is no interpolation between buckets if (xValue && xValue.operation.scale && xValue.operation.scale === 'ordinal') { - return closestSeriesType.startsWith('bar') ? closestSeriesType : defaultType; + return closestSeriesType.startsWith('bar') ? closestSeriesType : defaultSeriesType; } return closestSeriesType; diff --git a/x-pack/test/functional/apps/lens/group1/multiple_data_views.ts b/x-pack/test/functional/apps/lens/group1/multiple_data_views.ts index 84bf66c26191d..d65b10d0056e1 100644 --- a/x-pack/test/functional/apps/lens/group1/multiple_data_views.ts +++ b/x-pack/test/functional/apps/lens/group1/multiple_data_views.ts @@ -33,16 +33,26 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { function assertMatchesExpectedData( state: DebugState, - expectedData: Array> + expectedData: Array>, + chartType: 'bars' | 'lines' = 'bars' ) { - expect( - state?.bars?.map(({ bars }) => - bars.map((bar) => ({ - x: bar.x, - y: Math.floor(bar.y * 100) / 100, - })) - ) - ).to.eql(expectedData); + if (chartType === 'lines') { + expect( + state?.lines + ?.map(({ points }) => + points + .map((point) => ({ x: point.x, y: Math.floor(point.y * 100) / 100 })) + .sort(({ x }, { x: x2 }) => x - x2) + ) + .filter((a) => a.length > 0) + ).to.eql(expectedData); + } else { + expect( + state?.bars?.map(({ bars }) => + bars.map((point) => ({ x: point.x, y: Math.floor(point.y * 100) / 100 })) + ) + ).to.eql(expectedData); + } } describe('lens with multiple data views', () => { @@ -93,13 +103,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.click('fieldToggle-DistanceKilometers'); const data = await lens.getCurrentChartDebugState('xyVisChart'); - assertMatchesExpectedData(data, [expectedLogstashData, expectedFlightsData]); + assertMatchesExpectedData(data, [expectedLogstashData, expectedFlightsData], 'lines'); }); it('ignores global filters on layers using a data view without the filter field', async () => { await filterBar.addFilter({ field: 'Carrier', operation: 'exists' }); const data = await lens.getCurrentChartDebugState('xyVisChart'); - assertMatchesExpectedData(data, [expectedLogstashData, expectedFlightsData]); + assertMatchesExpectedData(data, [expectedLogstashData, expectedFlightsData], 'lines'); await lens.save(visTitle); }); @@ -110,7 +120,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await visualize.openSavedVisualization(visTitle); const data = await lens.getCurrentChartDebugState('xyVisChart'); - assertMatchesExpectedData(data, [expectedFlightsData]); + assertMatchesExpectedData(data, [expectedFlightsData], 'lines'); }); }); } From d7e48fd21583b235d1cfa671a86196421d008de9 Mon Sep 17 00:00:00 2001 From: Giorgos Bamparopoulos Date: Mon, 21 Oct 2024 16:45:56 +0300 Subject: [PATCH 18/69] [Onboarding] Add tech preview badges to onboarding flows (#196926) ## Summary Adds Tech Preview badges for the following flows: - Auto-detect Integrations with Elastic Agent (Tile + Page) - Kubernetes monitoring with Elastic Agent (Tile + Page) - Host monitoring with EDOT Collector (Tile) ### Auto-detect flow #### Tile image #### Page image ### Kubernetes monitoring with EA #### Tile image #### Page image ### Host monitoring (OTel) #### Tile image --------- Co-authored-by: Joe Reuter --- .../use_custom_cards_for_category.tsx | 35 ++++++++++++------- .../public/application/pages/auto_detect.tsx | 1 + .../public/application/pages/kubernetes.tsx | 1 + 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.tsx index 10b2c52e441ee..a31f835bae4d0 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.tsx @@ -61,12 +61,12 @@ export function useCustomCardsForCategory( } ), extraLabelsBadges: [ - + - , - + , + - , + , ], categories: ['observability'], icons: [ @@ -79,6 +79,7 @@ export function useCustomCardsForCategory( version: '', integration: '', isQuickstart: true, + release: 'preview', }, { id: 'otel-logs', @@ -98,12 +99,12 @@ export function useCustomCardsForCategory( } ), extraLabelsBadges: [ - + - , - + , + - , + , ], categories: ['observability'], icons: [ @@ -116,6 +117,7 @@ export function useCustomCardsForCategory( version: '', integration: '', isQuickstart: true, + release: 'preview', }, ]; @@ -139,9 +141,9 @@ export function useCustomCardsForCategory( } ), extraLabelsBadges: [ - + - , + , ], categories: ['observability'], icons: [ @@ -154,6 +156,7 @@ export function useCustomCardsForCategory( version: '', integration: '', isQuickstart: true, + release: 'preview', }, { id: 'otel-kubernetes', @@ -173,9 +176,9 @@ export function useCustomCardsForCategory( } ), extraLabelsBadges: [ - + - , + , ], categories: ['observability'], icons: [ @@ -356,3 +359,11 @@ export function useCustomCardsForCategory( return undefined; } } + +function ExtraLabelBadgeWrapper({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/auto_detect.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/auto_detect.tsx index 585e1061291a5..7dc3d0acb0a2e 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/auto_detect.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/auto_detect.tsx @@ -29,6 +29,7 @@ export const AutoDetectPage = () => ( 'This installation scans your host and auto-detects log and metric files.', } )} + isTechnicalPreview={true} /> } > diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/kubernetes.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/kubernetes.tsx index 8e1af954736c1..f92b1d9a83ac6 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/kubernetes.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/kubernetes.tsx @@ -29,6 +29,7 @@ export const KubernetesPage = () => ( 'This installation is tailored for configuring and collecting metrics and logs by deploying a new Elastic Agent within your host.', } )} + isTechnicalPreview={true} /> } > From 47a497cf3671eee56adeb4787cb4c9271671f5e8 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Mon, 21 Oct 2024 16:59:07 +0300 Subject: [PATCH 19/69] fix: [Stateful: Indices: Overview page] Missing focus on New button after closing or cancelling Generate API key dialog (#196905) Closes: #196174 ## Description Focus should be visible on any accessible element and in order when navigating through the elements. Especially for the users using assistive technology, only keyboard. For the dialogs, after closing them, focus should be visible on the element which opened it. ## What was changed: 1. Cleaned up `generate_api_key_panel.tsx`. No need to open `GenerateApiKeyModal` from this level. Same logic duplicated in `APIGettingStarted` inner component ## Screen https://github.com/user-attachments/assets/46a23fdd-ba54-4798-9cb7-a78e28d447b8 --- .../search_index/generate_api_key_panel.tsx | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/generate_api_key_panel.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/generate_api_key_panel.tsx index f1470f37bc8f0..52da11d51c074 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/generate_api_key_panel.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/generate_api_key_panel.tsx @@ -7,27 +7,20 @@ import React from 'react'; -import { useActions, useValues } from 'kea'; +import { useValues } from 'kea'; import { EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem, EuiPanel } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { GenerateApiKeyModal } from './components/generate_api_key_modal/modal'; - import { APIGettingStarted } from './components/getting_started/getting_started'; import { IndexViewLogic } from './index_view_logic'; -import { OverviewLogic } from './overview.logic'; export const GenerateApiKeyPanel: React.FC = () => { - const { isGenerateModalOpen } = useValues(OverviewLogic); - const { indexName, isHiddenIndex } = useValues(IndexViewLogic); - const { closeGenerateModal } = useActions(OverviewLogic); + const { isHiddenIndex } = useValues(IndexViewLogic); + return ( <> - {isGenerateModalOpen && ( - - )} From 78f1a8806b4dc07195e6182f220130f513b3cca2 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 22 Oct 2024 01:25:39 +1100 Subject: [PATCH 20/69] [ES|QL] Update grammars (#196992) This PR updates the ES|QL grammars (lexer and parser) to match the latest version in Elasticsearch. --------- Co-authored-by: Stratoula Kalafateli --- packages/kbn-esql-ast/src/antlr/esql_lexer.g4 | 21 +- .../kbn-esql-ast/src/antlr/esql_lexer.interp | 10 +- .../kbn-esql-ast/src/antlr/esql_lexer.tokens | 163 +- packages/kbn-esql-ast/src/antlr/esql_lexer.ts | 1160 ++++++----- .../kbn-esql-ast/src/antlr/esql_parser.g4 | 34 +- .../kbn-esql-ast/src/antlr/esql_parser.interp | 9 +- .../kbn-esql-ast/src/antlr/esql_parser.tokens | 163 +- .../kbn-esql-ast/src/antlr/esql_parser.ts | 1814 ++++++++++------- .../src/antlr/esql_parser_listener.ts | 33 + .../src/parser/esql_ast_builder_listener.ts | 13 +- packages/kbn-esql-ast/src/parser/walkers.ts | 21 +- .../kbn-esql-ast/src/walker/walker.test.ts | 4 +- .../validation.command.inlinestats.ts | 6 +- .../test_suites/validation.command.metrics.ts | 4 +- .../test_suites/validation.command.stats.ts | 6 +- .../esql_validation_meta_tests.json | 34 +- .../src/validation/validation.test.ts | 26 +- .../kbn-monaco/src/esql/lib/esql_theme.ts | 2 +- 18 files changed, 1937 insertions(+), 1586 deletions(-) diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 b/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 index 80a30301d080c..0ffee7c0b0d4f 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 @@ -88,7 +88,6 @@ WHERE : 'where' -> pushMode(EXPRESSION_MODE); // MYCOMMAND : 'mycommand' -> ... DEV_INLINESTATS : {this.isDevVersion()}? 'inlinestats' -> pushMode(EXPRESSION_MODE); DEV_LOOKUP : {this.isDevVersion()}? 'lookup' -> pushMode(LOOKUP_MODE); -DEV_MATCH : {this.isDevVersion()}? 'match' -> pushMode(EXPRESSION_MODE); DEV_METRICS : {this.isDevVersion()}? 'metrics' -> pushMode(METRICS_MODE); // @@ -211,8 +210,8 @@ ASTERISK : '*'; SLASH : '/'; PERCENT : '%'; -// move it in the main section if the feature gets promoted -DEV_MATCH_OP : {this.isDevVersion()}? DEV_MATCH -> type(DEV_MATCH); +MATCH : 'match'; +NESTED_WHERE : WHERE -> type(WHERE); NAMED_OR_POSITIONAL_PARAM : PARAM (LETTER | UNDERSCORE) UNQUOTED_ID_BODY* @@ -308,8 +307,8 @@ mode PROJECT_MODE; PROJECT_PIPE : PIPE -> type(PIPE), popMode; PROJECT_DOT: DOT -> type(DOT); PROJECT_COMMA : COMMA -> type(COMMA); -PROJECT_PARAM : PARAM -> type(PARAM); -PROJECT_NAMED_OR_POSITIONAL_PARAM : NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM); +PROJECT_PARAM : {this.isDevVersion()}? PARAM -> type(PARAM); +PROJECT_NAMED_OR_POSITIONAL_PARAM : {this.isDevVersion()}? NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM); fragment UNQUOTED_ID_BODY_WITH_PATTERN : (LETTER | DIGIT | UNDERSCORE | ASTERISK) @@ -343,8 +342,8 @@ RENAME_PIPE : PIPE -> type(PIPE), popMode; RENAME_ASSIGN : ASSIGN -> type(ASSIGN); RENAME_COMMA : COMMA -> type(COMMA); RENAME_DOT: DOT -> type(DOT); -RENAME_PARAM : PARAM -> type(PARAM); -RENAME_NAMED_OR_POSITIONAL_PARAM : NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM); +RENAME_PARAM : {this.isDevVersion()}? PARAM -> type(PARAM); +RENAME_NAMED_OR_POSITIONAL_PARAM : {this.isDevVersion()}? NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM); AS : 'as'; @@ -416,8 +415,8 @@ ENRICH_FIELD_QUOTED_IDENTIFIER : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) ; -ENRICH_FIELD_PARAM : PARAM -> type(PARAM); -ENRICH_FIELD_NAMED_OR_POSITIONAL_PARAM : NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM); +ENRICH_FIELD_PARAM : {this.isDevVersion()}? PARAM -> type(PARAM); +ENRICH_FIELD_NAMED_OR_POSITIONAL_PARAM : {this.isDevVersion()}? NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM); ENRICH_FIELD_LINE_COMMENT : LINE_COMMENT -> channel(HIDDEN) @@ -434,8 +433,8 @@ ENRICH_FIELD_WS mode MVEXPAND_MODE; MVEXPAND_PIPE : PIPE -> type(PIPE), popMode; MVEXPAND_DOT: DOT -> type(DOT); -MVEXPAND_PARAM : PARAM -> type(PARAM); -MVEXPAND_NAMED_OR_POSITIONAL_PARAM : NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM); +MVEXPAND_PARAM : {this.isDevVersion()}? PARAM -> type(PARAM); +MVEXPAND_NAMED_OR_POSITIONAL_PARAM : {this.isDevVersion()}? NAMED_OR_POSITIONAL_PARAM -> type(NAMED_OR_POSITIONAL_PARAM); MVEXPAND_QUOTED_IDENTIFIER : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.interp b/packages/kbn-esql-ast/src/antlr/esql_lexer.interp index b5ca44826c051..2566da379af73 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.interp +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.interp @@ -23,7 +23,6 @@ null null null null -null '|' null null @@ -63,6 +62,7 @@ null '*' '/' '%' +'match' null null ']' @@ -141,7 +141,6 @@ STATS WHERE DEV_INLINESTATS DEV_LOOKUP -DEV_MATCH DEV_METRICS UNKNOWN_CMD LINE_COMMENT @@ -186,6 +185,7 @@ MINUS ASTERISK SLASH PERCENT +MATCH NAMED_OR_POSITIONAL_PARAM OPENING_BRACKET CLOSING_BRACKET @@ -263,7 +263,6 @@ STATS WHERE DEV_INLINESTATS DEV_LOOKUP -DEV_MATCH DEV_METRICS UNKNOWN_CMD LINE_COMMENT @@ -318,7 +317,8 @@ MINUS ASTERISK SLASH PERCENT -DEV_MATCH_OP +MATCH +NESTED_WHERE NAMED_OR_POSITIONAL_PARAM OPENING_BRACKET CLOSING_BRACKET @@ -466,4 +466,4 @@ METRICS_MODE CLOSING_METRICS_MODE atn: -[4, 0, 120, 1475, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 4, 20, 587, 8, 20, 11, 20, 12, 20, 588, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 597, 8, 21, 10, 21, 12, 21, 600, 9, 21, 1, 21, 3, 21, 603, 8, 21, 1, 21, 3, 21, 606, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 615, 8, 22, 10, 22, 12, 22, 618, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 4, 23, 626, 8, 23, 11, 23, 12, 23, 627, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 3, 29, 647, 8, 29, 1, 29, 4, 29, 650, 8, 29, 11, 29, 12, 29, 651, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 3, 32, 661, 8, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 668, 8, 34, 1, 35, 1, 35, 1, 35, 5, 35, 673, 8, 35, 10, 35, 12, 35, 676, 9, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 684, 8, 35, 10, 35, 12, 35, 687, 9, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 694, 8, 35, 1, 35, 3, 35, 697, 8, 35, 3, 35, 699, 8, 35, 1, 36, 4, 36, 702, 8, 36, 11, 36, 12, 36, 703, 1, 37, 4, 37, 707, 8, 37, 11, 37, 12, 37, 708, 1, 37, 1, 37, 5, 37, 713, 8, 37, 10, 37, 12, 37, 716, 9, 37, 1, 37, 1, 37, 4, 37, 720, 8, 37, 11, 37, 12, 37, 721, 1, 37, 4, 37, 725, 8, 37, 11, 37, 12, 37, 726, 1, 37, 1, 37, 5, 37, 731, 8, 37, 10, 37, 12, 37, 734, 9, 37, 3, 37, 736, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 4, 37, 742, 8, 37, 11, 37, 12, 37, 743, 1, 37, 1, 37, 3, 37, 748, 8, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 3, 74, 875, 8, 74, 1, 74, 5, 74, 878, 8, 74, 10, 74, 12, 74, 881, 9, 74, 1, 74, 1, 74, 4, 74, 885, 8, 74, 11, 74, 12, 74, 886, 3, 74, 889, 8, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 5, 77, 903, 8, 77, 10, 77, 12, 77, 906, 9, 77, 1, 77, 1, 77, 3, 77, 910, 8, 77, 1, 77, 4, 77, 913, 8, 77, 11, 77, 12, 77, 914, 3, 77, 917, 8, 77, 1, 78, 1, 78, 4, 78, 921, 8, 78, 11, 78, 12, 78, 922, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 3, 95, 1000, 8, 95, 1, 96, 4, 96, 1003, 8, 96, 11, 96, 12, 96, 1004, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 3, 107, 1052, 8, 107, 1, 108, 1, 108, 3, 108, 1056, 8, 108, 1, 108, 5, 108, 1059, 8, 108, 10, 108, 12, 108, 1062, 9, 108, 1, 108, 1, 108, 3, 108, 1066, 8, 108, 1, 108, 4, 108, 1069, 8, 108, 11, 108, 12, 108, 1070, 3, 108, 1073, 8, 108, 1, 109, 1, 109, 4, 109, 1077, 8, 109, 11, 109, 12, 109, 1078, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 4, 129, 1162, 8, 129, 11, 129, 12, 129, 1163, 1, 129, 1, 129, 3, 129, 1168, 8, 129, 1, 129, 4, 129, 1171, 8, 129, 11, 129, 12, 129, 1172, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 4, 162, 1312, 8, 162, 11, 162, 12, 162, 1313, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 2, 616, 685, 0, 198, 15, 1, 17, 2, 19, 3, 21, 4, 23, 5, 25, 6, 27, 7, 29, 8, 31, 9, 33, 10, 35, 11, 37, 12, 39, 13, 41, 14, 43, 15, 45, 16, 47, 17, 49, 18, 51, 19, 53, 20, 55, 21, 57, 22, 59, 23, 61, 24, 63, 25, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 0, 81, 0, 83, 0, 85, 26, 87, 27, 89, 28, 91, 29, 93, 30, 95, 31, 97, 32, 99, 33, 101, 34, 103, 35, 105, 36, 107, 37, 109, 38, 111, 39, 113, 40, 115, 41, 117, 42, 119, 43, 121, 44, 123, 45, 125, 46, 127, 47, 129, 48, 131, 49, 133, 50, 135, 51, 137, 52, 139, 53, 141, 54, 143, 55, 145, 56, 147, 57, 149, 58, 151, 59, 153, 60, 155, 61, 157, 62, 159, 63, 161, 0, 163, 64, 165, 65, 167, 66, 169, 67, 171, 0, 173, 68, 175, 69, 177, 70, 179, 71, 181, 0, 183, 0, 185, 72, 187, 73, 189, 74, 191, 0, 193, 0, 195, 0, 197, 0, 199, 0, 201, 0, 203, 75, 205, 0, 207, 76, 209, 0, 211, 0, 213, 77, 215, 78, 217, 79, 219, 0, 221, 0, 223, 0, 225, 0, 227, 0, 229, 0, 231, 0, 233, 80, 235, 81, 237, 82, 239, 83, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 253, 84, 255, 0, 257, 85, 259, 86, 261, 87, 263, 0, 265, 0, 267, 88, 269, 89, 271, 0, 273, 90, 275, 0, 277, 91, 279, 92, 281, 93, 283, 0, 285, 0, 287, 0, 289, 0, 291, 0, 293, 0, 295, 0, 297, 0, 299, 0, 301, 94, 303, 95, 305, 96, 307, 0, 309, 0, 311, 0, 313, 0, 315, 0, 317, 0, 319, 97, 321, 98, 323, 99, 325, 0, 327, 100, 329, 101, 331, 102, 333, 103, 335, 0, 337, 104, 339, 105, 341, 106, 343, 107, 345, 108, 347, 0, 349, 0, 351, 0, 353, 0, 355, 0, 357, 0, 359, 0, 361, 109, 363, 110, 365, 111, 367, 0, 369, 0, 371, 0, 373, 0, 375, 112, 377, 113, 379, 114, 381, 0, 383, 0, 385, 0, 387, 115, 389, 116, 391, 117, 393, 0, 395, 0, 397, 118, 399, 119, 401, 120, 403, 0, 405, 0, 407, 0, 409, 0, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1503, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 1, 63, 1, 0, 0, 0, 1, 85, 1, 0, 0, 0, 1, 87, 1, 0, 0, 0, 1, 89, 1, 0, 0, 0, 1, 91, 1, 0, 0, 0, 1, 93, 1, 0, 0, 0, 1, 95, 1, 0, 0, 0, 1, 97, 1, 0, 0, 0, 1, 99, 1, 0, 0, 0, 1, 101, 1, 0, 0, 0, 1, 103, 1, 0, 0, 0, 1, 105, 1, 0, 0, 0, 1, 107, 1, 0, 0, 0, 1, 109, 1, 0, 0, 0, 1, 111, 1, 0, 0, 0, 1, 113, 1, 0, 0, 0, 1, 115, 1, 0, 0, 0, 1, 117, 1, 0, 0, 0, 1, 119, 1, 0, 0, 0, 1, 121, 1, 0, 0, 0, 1, 123, 1, 0, 0, 0, 1, 125, 1, 0, 0, 0, 1, 127, 1, 0, 0, 0, 1, 129, 1, 0, 0, 0, 1, 131, 1, 0, 0, 0, 1, 133, 1, 0, 0, 0, 1, 135, 1, 0, 0, 0, 1, 137, 1, 0, 0, 0, 1, 139, 1, 0, 0, 0, 1, 141, 1, 0, 0, 0, 1, 143, 1, 0, 0, 0, 1, 145, 1, 0, 0, 0, 1, 147, 1, 0, 0, 0, 1, 149, 1, 0, 0, 0, 1, 151, 1, 0, 0, 0, 1, 153, 1, 0, 0, 0, 1, 155, 1, 0, 0, 0, 1, 157, 1, 0, 0, 0, 1, 159, 1, 0, 0, 0, 1, 161, 1, 0, 0, 0, 1, 163, 1, 0, 0, 0, 1, 165, 1, 0, 0, 0, 1, 167, 1, 0, 0, 0, 1, 169, 1, 0, 0, 0, 1, 173, 1, 0, 0, 0, 1, 175, 1, 0, 0, 0, 1, 177, 1, 0, 0, 0, 1, 179, 1, 0, 0, 0, 2, 181, 1, 0, 0, 0, 2, 183, 1, 0, 0, 0, 2, 185, 1, 0, 0, 0, 2, 187, 1, 0, 0, 0, 2, 189, 1, 0, 0, 0, 3, 191, 1, 0, 0, 0, 3, 193, 1, 0, 0, 0, 3, 195, 1, 0, 0, 0, 3, 197, 1, 0, 0, 0, 3, 199, 1, 0, 0, 0, 3, 201, 1, 0, 0, 0, 3, 203, 1, 0, 0, 0, 3, 207, 1, 0, 0, 0, 3, 209, 1, 0, 0, 0, 3, 211, 1, 0, 0, 0, 3, 213, 1, 0, 0, 0, 3, 215, 1, 0, 0, 0, 3, 217, 1, 0, 0, 0, 4, 219, 1, 0, 0, 0, 4, 221, 1, 0, 0, 0, 4, 223, 1, 0, 0, 0, 4, 225, 1, 0, 0, 0, 4, 227, 1, 0, 0, 0, 4, 233, 1, 0, 0, 0, 4, 235, 1, 0, 0, 0, 4, 237, 1, 0, 0, 0, 4, 239, 1, 0, 0, 0, 5, 241, 1, 0, 0, 0, 5, 243, 1, 0, 0, 0, 5, 245, 1, 0, 0, 0, 5, 247, 1, 0, 0, 0, 5, 249, 1, 0, 0, 0, 5, 251, 1, 0, 0, 0, 5, 253, 1, 0, 0, 0, 5, 255, 1, 0, 0, 0, 5, 257, 1, 0, 0, 0, 5, 259, 1, 0, 0, 0, 5, 261, 1, 0, 0, 0, 6, 263, 1, 0, 0, 0, 6, 265, 1, 0, 0, 0, 6, 267, 1, 0, 0, 0, 6, 269, 1, 0, 0, 0, 6, 273, 1, 0, 0, 0, 6, 275, 1, 0, 0, 0, 6, 277, 1, 0, 0, 0, 6, 279, 1, 0, 0, 0, 6, 281, 1, 0, 0, 0, 7, 283, 1, 0, 0, 0, 7, 285, 1, 0, 0, 0, 7, 287, 1, 0, 0, 0, 7, 289, 1, 0, 0, 0, 7, 291, 1, 0, 0, 0, 7, 293, 1, 0, 0, 0, 7, 295, 1, 0, 0, 0, 7, 297, 1, 0, 0, 0, 7, 299, 1, 0, 0, 0, 7, 301, 1, 0, 0, 0, 7, 303, 1, 0, 0, 0, 7, 305, 1, 0, 0, 0, 8, 307, 1, 0, 0, 0, 8, 309, 1, 0, 0, 0, 8, 311, 1, 0, 0, 0, 8, 313, 1, 0, 0, 0, 8, 315, 1, 0, 0, 0, 8, 317, 1, 0, 0, 0, 8, 319, 1, 0, 0, 0, 8, 321, 1, 0, 0, 0, 8, 323, 1, 0, 0, 0, 9, 325, 1, 0, 0, 0, 9, 327, 1, 0, 0, 0, 9, 329, 1, 0, 0, 0, 9, 331, 1, 0, 0, 0, 9, 333, 1, 0, 0, 0, 10, 335, 1, 0, 0, 0, 10, 337, 1, 0, 0, 0, 10, 339, 1, 0, 0, 0, 10, 341, 1, 0, 0, 0, 10, 343, 1, 0, 0, 0, 10, 345, 1, 0, 0, 0, 11, 347, 1, 0, 0, 0, 11, 349, 1, 0, 0, 0, 11, 351, 1, 0, 0, 0, 11, 353, 1, 0, 0, 0, 11, 355, 1, 0, 0, 0, 11, 357, 1, 0, 0, 0, 11, 359, 1, 0, 0, 0, 11, 361, 1, 0, 0, 0, 11, 363, 1, 0, 0, 0, 11, 365, 1, 0, 0, 0, 12, 367, 1, 0, 0, 0, 12, 369, 1, 0, 0, 0, 12, 371, 1, 0, 0, 0, 12, 373, 1, 0, 0, 0, 12, 375, 1, 0, 0, 0, 12, 377, 1, 0, 0, 0, 12, 379, 1, 0, 0, 0, 13, 381, 1, 0, 0, 0, 13, 383, 1, 0, 0, 0, 13, 385, 1, 0, 0, 0, 13, 387, 1, 0, 0, 0, 13, 389, 1, 0, 0, 0, 13, 391, 1, 0, 0, 0, 14, 393, 1, 0, 0, 0, 14, 395, 1, 0, 0, 0, 14, 397, 1, 0, 0, 0, 14, 399, 1, 0, 0, 0, 14, 401, 1, 0, 0, 0, 14, 403, 1, 0, 0, 0, 14, 405, 1, 0, 0, 0, 14, 407, 1, 0, 0, 0, 14, 409, 1, 0, 0, 0, 15, 411, 1, 0, 0, 0, 17, 421, 1, 0, 0, 0, 19, 428, 1, 0, 0, 0, 21, 437, 1, 0, 0, 0, 23, 444, 1, 0, 0, 0, 25, 454, 1, 0, 0, 0, 27, 461, 1, 0, 0, 0, 29, 468, 1, 0, 0, 0, 31, 475, 1, 0, 0, 0, 33, 483, 1, 0, 0, 0, 35, 495, 1, 0, 0, 0, 37, 504, 1, 0, 0, 0, 39, 510, 1, 0, 0, 0, 41, 517, 1, 0, 0, 0, 43, 524, 1, 0, 0, 0, 45, 532, 1, 0, 0, 0, 47, 540, 1, 0, 0, 0, 49, 555, 1, 0, 0, 0, 51, 565, 1, 0, 0, 0, 53, 574, 1, 0, 0, 0, 55, 586, 1, 0, 0, 0, 57, 592, 1, 0, 0, 0, 59, 609, 1, 0, 0, 0, 61, 625, 1, 0, 0, 0, 63, 631, 1, 0, 0, 0, 65, 635, 1, 0, 0, 0, 67, 637, 1, 0, 0, 0, 69, 639, 1, 0, 0, 0, 71, 642, 1, 0, 0, 0, 73, 644, 1, 0, 0, 0, 75, 653, 1, 0, 0, 0, 77, 655, 1, 0, 0, 0, 79, 660, 1, 0, 0, 0, 81, 662, 1, 0, 0, 0, 83, 667, 1, 0, 0, 0, 85, 698, 1, 0, 0, 0, 87, 701, 1, 0, 0, 0, 89, 747, 1, 0, 0, 0, 91, 749, 1, 0, 0, 0, 93, 752, 1, 0, 0, 0, 95, 756, 1, 0, 0, 0, 97, 760, 1, 0, 0, 0, 99, 762, 1, 0, 0, 0, 101, 765, 1, 0, 0, 0, 103, 767, 1, 0, 0, 0, 105, 772, 1, 0, 0, 0, 107, 774, 1, 0, 0, 0, 109, 780, 1, 0, 0, 0, 111, 786, 1, 0, 0, 0, 113, 789, 1, 0, 0, 0, 115, 792, 1, 0, 0, 0, 117, 797, 1, 0, 0, 0, 119, 802, 1, 0, 0, 0, 121, 804, 1, 0, 0, 0, 123, 808, 1, 0, 0, 0, 125, 813, 1, 0, 0, 0, 127, 819, 1, 0, 0, 0, 129, 822, 1, 0, 0, 0, 131, 824, 1, 0, 0, 0, 133, 830, 1, 0, 0, 0, 135, 832, 1, 0, 0, 0, 137, 837, 1, 0, 0, 0, 139, 840, 1, 0, 0, 0, 141, 843, 1, 0, 0, 0, 143, 846, 1, 0, 0, 0, 145, 848, 1, 0, 0, 0, 147, 851, 1, 0, 0, 0, 149, 853, 1, 0, 0, 0, 151, 856, 1, 0, 0, 0, 153, 858, 1, 0, 0, 0, 155, 860, 1, 0, 0, 0, 157, 862, 1, 0, 0, 0, 159, 864, 1, 0, 0, 0, 161, 866, 1, 0, 0, 0, 163, 888, 1, 0, 0, 0, 165, 890, 1, 0, 0, 0, 167, 895, 1, 0, 0, 0, 169, 916, 1, 0, 0, 0, 171, 918, 1, 0, 0, 0, 173, 926, 1, 0, 0, 0, 175, 928, 1, 0, 0, 0, 177, 932, 1, 0, 0, 0, 179, 936, 1, 0, 0, 0, 181, 940, 1, 0, 0, 0, 183, 945, 1, 0, 0, 0, 185, 950, 1, 0, 0, 0, 187, 954, 1, 0, 0, 0, 189, 958, 1, 0, 0, 0, 191, 962, 1, 0, 0, 0, 193, 967, 1, 0, 0, 0, 195, 971, 1, 0, 0, 0, 197, 975, 1, 0, 0, 0, 199, 979, 1, 0, 0, 0, 201, 983, 1, 0, 0, 0, 203, 987, 1, 0, 0, 0, 205, 999, 1, 0, 0, 0, 207, 1002, 1, 0, 0, 0, 209, 1006, 1, 0, 0, 0, 211, 1010, 1, 0, 0, 0, 213, 1014, 1, 0, 0, 0, 215, 1018, 1, 0, 0, 0, 217, 1022, 1, 0, 0, 0, 219, 1026, 1, 0, 0, 0, 221, 1031, 1, 0, 0, 0, 223, 1035, 1, 0, 0, 0, 225, 1039, 1, 0, 0, 0, 227, 1043, 1, 0, 0, 0, 229, 1051, 1, 0, 0, 0, 231, 1072, 1, 0, 0, 0, 233, 1076, 1, 0, 0, 0, 235, 1080, 1, 0, 0, 0, 237, 1084, 1, 0, 0, 0, 239, 1088, 1, 0, 0, 0, 241, 1092, 1, 0, 0, 0, 243, 1097, 1, 0, 0, 0, 245, 1101, 1, 0, 0, 0, 247, 1105, 1, 0, 0, 0, 249, 1109, 1, 0, 0, 0, 251, 1113, 1, 0, 0, 0, 253, 1117, 1, 0, 0, 0, 255, 1120, 1, 0, 0, 0, 257, 1124, 1, 0, 0, 0, 259, 1128, 1, 0, 0, 0, 261, 1132, 1, 0, 0, 0, 263, 1136, 1, 0, 0, 0, 265, 1141, 1, 0, 0, 0, 267, 1146, 1, 0, 0, 0, 269, 1151, 1, 0, 0, 0, 271, 1158, 1, 0, 0, 0, 273, 1167, 1, 0, 0, 0, 275, 1174, 1, 0, 0, 0, 277, 1178, 1, 0, 0, 0, 279, 1182, 1, 0, 0, 0, 281, 1186, 1, 0, 0, 0, 283, 1190, 1, 0, 0, 0, 285, 1196, 1, 0, 0, 0, 287, 1200, 1, 0, 0, 0, 289, 1204, 1, 0, 0, 0, 291, 1208, 1, 0, 0, 0, 293, 1212, 1, 0, 0, 0, 295, 1216, 1, 0, 0, 0, 297, 1220, 1, 0, 0, 0, 299, 1224, 1, 0, 0, 0, 301, 1228, 1, 0, 0, 0, 303, 1232, 1, 0, 0, 0, 305, 1236, 1, 0, 0, 0, 307, 1240, 1, 0, 0, 0, 309, 1245, 1, 0, 0, 0, 311, 1249, 1, 0, 0, 0, 313, 1253, 1, 0, 0, 0, 315, 1257, 1, 0, 0, 0, 317, 1261, 1, 0, 0, 0, 319, 1265, 1, 0, 0, 0, 321, 1269, 1, 0, 0, 0, 323, 1273, 1, 0, 0, 0, 325, 1277, 1, 0, 0, 0, 327, 1282, 1, 0, 0, 0, 329, 1287, 1, 0, 0, 0, 331, 1291, 1, 0, 0, 0, 333, 1295, 1, 0, 0, 0, 335, 1299, 1, 0, 0, 0, 337, 1304, 1, 0, 0, 0, 339, 1311, 1, 0, 0, 0, 341, 1315, 1, 0, 0, 0, 343, 1319, 1, 0, 0, 0, 345, 1323, 1, 0, 0, 0, 347, 1327, 1, 0, 0, 0, 349, 1332, 1, 0, 0, 0, 351, 1336, 1, 0, 0, 0, 353, 1340, 1, 0, 0, 0, 355, 1344, 1, 0, 0, 0, 357, 1349, 1, 0, 0, 0, 359, 1353, 1, 0, 0, 0, 361, 1357, 1, 0, 0, 0, 363, 1361, 1, 0, 0, 0, 365, 1365, 1, 0, 0, 0, 367, 1369, 1, 0, 0, 0, 369, 1375, 1, 0, 0, 0, 371, 1379, 1, 0, 0, 0, 373, 1383, 1, 0, 0, 0, 375, 1387, 1, 0, 0, 0, 377, 1391, 1, 0, 0, 0, 379, 1395, 1, 0, 0, 0, 381, 1399, 1, 0, 0, 0, 383, 1404, 1, 0, 0, 0, 385, 1410, 1, 0, 0, 0, 387, 1416, 1, 0, 0, 0, 389, 1420, 1, 0, 0, 0, 391, 1424, 1, 0, 0, 0, 393, 1428, 1, 0, 0, 0, 395, 1434, 1, 0, 0, 0, 397, 1440, 1, 0, 0, 0, 399, 1444, 1, 0, 0, 0, 401, 1448, 1, 0, 0, 0, 403, 1452, 1, 0, 0, 0, 405, 1458, 1, 0, 0, 0, 407, 1464, 1, 0, 0, 0, 409, 1470, 1, 0, 0, 0, 411, 412, 7, 0, 0, 0, 412, 413, 7, 1, 0, 0, 413, 414, 7, 2, 0, 0, 414, 415, 7, 2, 0, 0, 415, 416, 7, 3, 0, 0, 416, 417, 7, 4, 0, 0, 417, 418, 7, 5, 0, 0, 418, 419, 1, 0, 0, 0, 419, 420, 6, 0, 0, 0, 420, 16, 1, 0, 0, 0, 421, 422, 7, 0, 0, 0, 422, 423, 7, 6, 0, 0, 423, 424, 7, 7, 0, 0, 424, 425, 7, 8, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 6, 1, 1, 0, 427, 18, 1, 0, 0, 0, 428, 429, 7, 3, 0, 0, 429, 430, 7, 9, 0, 0, 430, 431, 7, 6, 0, 0, 431, 432, 7, 1, 0, 0, 432, 433, 7, 4, 0, 0, 433, 434, 7, 10, 0, 0, 434, 435, 1, 0, 0, 0, 435, 436, 6, 2, 2, 0, 436, 20, 1, 0, 0, 0, 437, 438, 7, 3, 0, 0, 438, 439, 7, 11, 0, 0, 439, 440, 7, 12, 0, 0, 440, 441, 7, 13, 0, 0, 441, 442, 1, 0, 0, 0, 442, 443, 6, 3, 0, 0, 443, 22, 1, 0, 0, 0, 444, 445, 7, 3, 0, 0, 445, 446, 7, 14, 0, 0, 446, 447, 7, 8, 0, 0, 447, 448, 7, 13, 0, 0, 448, 449, 7, 12, 0, 0, 449, 450, 7, 1, 0, 0, 450, 451, 7, 9, 0, 0, 451, 452, 1, 0, 0, 0, 452, 453, 6, 4, 3, 0, 453, 24, 1, 0, 0, 0, 454, 455, 7, 15, 0, 0, 455, 456, 7, 6, 0, 0, 456, 457, 7, 7, 0, 0, 457, 458, 7, 16, 0, 0, 458, 459, 1, 0, 0, 0, 459, 460, 6, 5, 4, 0, 460, 26, 1, 0, 0, 0, 461, 462, 7, 17, 0, 0, 462, 463, 7, 6, 0, 0, 463, 464, 7, 7, 0, 0, 464, 465, 7, 18, 0, 0, 465, 466, 1, 0, 0, 0, 466, 467, 6, 6, 0, 0, 467, 28, 1, 0, 0, 0, 468, 469, 7, 18, 0, 0, 469, 470, 7, 3, 0, 0, 470, 471, 7, 3, 0, 0, 471, 472, 7, 8, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 6, 7, 1, 0, 474, 30, 1, 0, 0, 0, 475, 476, 7, 13, 0, 0, 476, 477, 7, 1, 0, 0, 477, 478, 7, 16, 0, 0, 478, 479, 7, 1, 0, 0, 479, 480, 7, 5, 0, 0, 480, 481, 1, 0, 0, 0, 481, 482, 6, 8, 0, 0, 482, 32, 1, 0, 0, 0, 483, 484, 7, 16, 0, 0, 484, 485, 7, 11, 0, 0, 485, 486, 5, 95, 0, 0, 486, 487, 7, 3, 0, 0, 487, 488, 7, 14, 0, 0, 488, 489, 7, 8, 0, 0, 489, 490, 7, 12, 0, 0, 490, 491, 7, 9, 0, 0, 491, 492, 7, 0, 0, 0, 492, 493, 1, 0, 0, 0, 493, 494, 6, 9, 5, 0, 494, 34, 1, 0, 0, 0, 495, 496, 7, 6, 0, 0, 496, 497, 7, 3, 0, 0, 497, 498, 7, 9, 0, 0, 498, 499, 7, 12, 0, 0, 499, 500, 7, 16, 0, 0, 500, 501, 7, 3, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 6, 10, 6, 0, 503, 36, 1, 0, 0, 0, 504, 505, 7, 6, 0, 0, 505, 506, 7, 7, 0, 0, 506, 507, 7, 19, 0, 0, 507, 508, 1, 0, 0, 0, 508, 509, 6, 11, 0, 0, 509, 38, 1, 0, 0, 0, 510, 511, 7, 2, 0, 0, 511, 512, 7, 10, 0, 0, 512, 513, 7, 7, 0, 0, 513, 514, 7, 19, 0, 0, 514, 515, 1, 0, 0, 0, 515, 516, 6, 12, 7, 0, 516, 40, 1, 0, 0, 0, 517, 518, 7, 2, 0, 0, 518, 519, 7, 7, 0, 0, 519, 520, 7, 6, 0, 0, 520, 521, 7, 5, 0, 0, 521, 522, 1, 0, 0, 0, 522, 523, 6, 13, 0, 0, 523, 42, 1, 0, 0, 0, 524, 525, 7, 2, 0, 0, 525, 526, 7, 5, 0, 0, 526, 527, 7, 12, 0, 0, 527, 528, 7, 5, 0, 0, 528, 529, 7, 2, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 6, 14, 0, 0, 531, 44, 1, 0, 0, 0, 532, 533, 7, 19, 0, 0, 533, 534, 7, 10, 0, 0, 534, 535, 7, 3, 0, 0, 535, 536, 7, 6, 0, 0, 536, 537, 7, 3, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 6, 15, 0, 0, 539, 46, 1, 0, 0, 0, 540, 541, 4, 16, 0, 0, 541, 542, 7, 1, 0, 0, 542, 543, 7, 9, 0, 0, 543, 544, 7, 13, 0, 0, 544, 545, 7, 1, 0, 0, 545, 546, 7, 9, 0, 0, 546, 547, 7, 3, 0, 0, 547, 548, 7, 2, 0, 0, 548, 549, 7, 5, 0, 0, 549, 550, 7, 12, 0, 0, 550, 551, 7, 5, 0, 0, 551, 552, 7, 2, 0, 0, 552, 553, 1, 0, 0, 0, 553, 554, 6, 16, 0, 0, 554, 48, 1, 0, 0, 0, 555, 556, 4, 17, 1, 0, 556, 557, 7, 13, 0, 0, 557, 558, 7, 7, 0, 0, 558, 559, 7, 7, 0, 0, 559, 560, 7, 18, 0, 0, 560, 561, 7, 20, 0, 0, 561, 562, 7, 8, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 6, 17, 8, 0, 564, 50, 1, 0, 0, 0, 565, 566, 4, 18, 2, 0, 566, 567, 7, 16, 0, 0, 567, 568, 7, 12, 0, 0, 568, 569, 7, 5, 0, 0, 569, 570, 7, 4, 0, 0, 570, 571, 7, 10, 0, 0, 571, 572, 1, 0, 0, 0, 572, 573, 6, 18, 0, 0, 573, 52, 1, 0, 0, 0, 574, 575, 4, 19, 3, 0, 575, 576, 7, 16, 0, 0, 576, 577, 7, 3, 0, 0, 577, 578, 7, 5, 0, 0, 578, 579, 7, 6, 0, 0, 579, 580, 7, 1, 0, 0, 580, 581, 7, 4, 0, 0, 581, 582, 7, 2, 0, 0, 582, 583, 1, 0, 0, 0, 583, 584, 6, 19, 9, 0, 584, 54, 1, 0, 0, 0, 585, 587, 8, 21, 0, 0, 586, 585, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 586, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 6, 20, 0, 0, 591, 56, 1, 0, 0, 0, 592, 593, 5, 47, 0, 0, 593, 594, 5, 47, 0, 0, 594, 598, 1, 0, 0, 0, 595, 597, 8, 22, 0, 0, 596, 595, 1, 0, 0, 0, 597, 600, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 602, 1, 0, 0, 0, 600, 598, 1, 0, 0, 0, 601, 603, 5, 13, 0, 0, 602, 601, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 605, 1, 0, 0, 0, 604, 606, 5, 10, 0, 0, 605, 604, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 608, 6, 21, 10, 0, 608, 58, 1, 0, 0, 0, 609, 610, 5, 47, 0, 0, 610, 611, 5, 42, 0, 0, 611, 616, 1, 0, 0, 0, 612, 615, 3, 59, 22, 0, 613, 615, 9, 0, 0, 0, 614, 612, 1, 0, 0, 0, 614, 613, 1, 0, 0, 0, 615, 618, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 616, 614, 1, 0, 0, 0, 617, 619, 1, 0, 0, 0, 618, 616, 1, 0, 0, 0, 619, 620, 5, 42, 0, 0, 620, 621, 5, 47, 0, 0, 621, 622, 1, 0, 0, 0, 622, 623, 6, 22, 10, 0, 623, 60, 1, 0, 0, 0, 624, 626, 7, 23, 0, 0, 625, 624, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 625, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 629, 1, 0, 0, 0, 629, 630, 6, 23, 10, 0, 630, 62, 1, 0, 0, 0, 631, 632, 5, 124, 0, 0, 632, 633, 1, 0, 0, 0, 633, 634, 6, 24, 11, 0, 634, 64, 1, 0, 0, 0, 635, 636, 7, 24, 0, 0, 636, 66, 1, 0, 0, 0, 637, 638, 7, 25, 0, 0, 638, 68, 1, 0, 0, 0, 639, 640, 5, 92, 0, 0, 640, 641, 7, 26, 0, 0, 641, 70, 1, 0, 0, 0, 642, 643, 8, 27, 0, 0, 643, 72, 1, 0, 0, 0, 644, 646, 7, 3, 0, 0, 645, 647, 7, 28, 0, 0, 646, 645, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 649, 1, 0, 0, 0, 648, 650, 3, 65, 25, 0, 649, 648, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 649, 1, 0, 0, 0, 651, 652, 1, 0, 0, 0, 652, 74, 1, 0, 0, 0, 653, 654, 5, 64, 0, 0, 654, 76, 1, 0, 0, 0, 655, 656, 5, 96, 0, 0, 656, 78, 1, 0, 0, 0, 657, 661, 8, 29, 0, 0, 658, 659, 5, 96, 0, 0, 659, 661, 5, 96, 0, 0, 660, 657, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 661, 80, 1, 0, 0, 0, 662, 663, 5, 95, 0, 0, 663, 82, 1, 0, 0, 0, 664, 668, 3, 67, 26, 0, 665, 668, 3, 65, 25, 0, 666, 668, 3, 81, 33, 0, 667, 664, 1, 0, 0, 0, 667, 665, 1, 0, 0, 0, 667, 666, 1, 0, 0, 0, 668, 84, 1, 0, 0, 0, 669, 674, 5, 34, 0, 0, 670, 673, 3, 69, 27, 0, 671, 673, 3, 71, 28, 0, 672, 670, 1, 0, 0, 0, 672, 671, 1, 0, 0, 0, 673, 676, 1, 0, 0, 0, 674, 672, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 677, 1, 0, 0, 0, 676, 674, 1, 0, 0, 0, 677, 699, 5, 34, 0, 0, 678, 679, 5, 34, 0, 0, 679, 680, 5, 34, 0, 0, 680, 681, 5, 34, 0, 0, 681, 685, 1, 0, 0, 0, 682, 684, 8, 22, 0, 0, 683, 682, 1, 0, 0, 0, 684, 687, 1, 0, 0, 0, 685, 686, 1, 0, 0, 0, 685, 683, 1, 0, 0, 0, 686, 688, 1, 0, 0, 0, 687, 685, 1, 0, 0, 0, 688, 689, 5, 34, 0, 0, 689, 690, 5, 34, 0, 0, 690, 691, 5, 34, 0, 0, 691, 693, 1, 0, 0, 0, 692, 694, 5, 34, 0, 0, 693, 692, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 696, 1, 0, 0, 0, 695, 697, 5, 34, 0, 0, 696, 695, 1, 0, 0, 0, 696, 697, 1, 0, 0, 0, 697, 699, 1, 0, 0, 0, 698, 669, 1, 0, 0, 0, 698, 678, 1, 0, 0, 0, 699, 86, 1, 0, 0, 0, 700, 702, 3, 65, 25, 0, 701, 700, 1, 0, 0, 0, 702, 703, 1, 0, 0, 0, 703, 701, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 88, 1, 0, 0, 0, 705, 707, 3, 65, 25, 0, 706, 705, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 706, 1, 0, 0, 0, 708, 709, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 714, 3, 105, 45, 0, 711, 713, 3, 65, 25, 0, 712, 711, 1, 0, 0, 0, 713, 716, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 748, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 717, 719, 3, 105, 45, 0, 718, 720, 3, 65, 25, 0, 719, 718, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 748, 1, 0, 0, 0, 723, 725, 3, 65, 25, 0, 724, 723, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 726, 727, 1, 0, 0, 0, 727, 735, 1, 0, 0, 0, 728, 732, 3, 105, 45, 0, 729, 731, 3, 65, 25, 0, 730, 729, 1, 0, 0, 0, 731, 734, 1, 0, 0, 0, 732, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 735, 728, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 738, 3, 73, 29, 0, 738, 748, 1, 0, 0, 0, 739, 741, 3, 105, 45, 0, 740, 742, 3, 65, 25, 0, 741, 740, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 741, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 745, 1, 0, 0, 0, 745, 746, 3, 73, 29, 0, 746, 748, 1, 0, 0, 0, 747, 706, 1, 0, 0, 0, 747, 717, 1, 0, 0, 0, 747, 724, 1, 0, 0, 0, 747, 739, 1, 0, 0, 0, 748, 90, 1, 0, 0, 0, 749, 750, 7, 30, 0, 0, 750, 751, 7, 31, 0, 0, 751, 92, 1, 0, 0, 0, 752, 753, 7, 12, 0, 0, 753, 754, 7, 9, 0, 0, 754, 755, 7, 0, 0, 0, 755, 94, 1, 0, 0, 0, 756, 757, 7, 12, 0, 0, 757, 758, 7, 2, 0, 0, 758, 759, 7, 4, 0, 0, 759, 96, 1, 0, 0, 0, 760, 761, 5, 61, 0, 0, 761, 98, 1, 0, 0, 0, 762, 763, 5, 58, 0, 0, 763, 764, 5, 58, 0, 0, 764, 100, 1, 0, 0, 0, 765, 766, 5, 44, 0, 0, 766, 102, 1, 0, 0, 0, 767, 768, 7, 0, 0, 0, 768, 769, 7, 3, 0, 0, 769, 770, 7, 2, 0, 0, 770, 771, 7, 4, 0, 0, 771, 104, 1, 0, 0, 0, 772, 773, 5, 46, 0, 0, 773, 106, 1, 0, 0, 0, 774, 775, 7, 15, 0, 0, 775, 776, 7, 12, 0, 0, 776, 777, 7, 13, 0, 0, 777, 778, 7, 2, 0, 0, 778, 779, 7, 3, 0, 0, 779, 108, 1, 0, 0, 0, 780, 781, 7, 15, 0, 0, 781, 782, 7, 1, 0, 0, 782, 783, 7, 6, 0, 0, 783, 784, 7, 2, 0, 0, 784, 785, 7, 5, 0, 0, 785, 110, 1, 0, 0, 0, 786, 787, 7, 1, 0, 0, 787, 788, 7, 9, 0, 0, 788, 112, 1, 0, 0, 0, 789, 790, 7, 1, 0, 0, 790, 791, 7, 2, 0, 0, 791, 114, 1, 0, 0, 0, 792, 793, 7, 13, 0, 0, 793, 794, 7, 12, 0, 0, 794, 795, 7, 2, 0, 0, 795, 796, 7, 5, 0, 0, 796, 116, 1, 0, 0, 0, 797, 798, 7, 13, 0, 0, 798, 799, 7, 1, 0, 0, 799, 800, 7, 18, 0, 0, 800, 801, 7, 3, 0, 0, 801, 118, 1, 0, 0, 0, 802, 803, 5, 40, 0, 0, 803, 120, 1, 0, 0, 0, 804, 805, 7, 9, 0, 0, 805, 806, 7, 7, 0, 0, 806, 807, 7, 5, 0, 0, 807, 122, 1, 0, 0, 0, 808, 809, 7, 9, 0, 0, 809, 810, 7, 20, 0, 0, 810, 811, 7, 13, 0, 0, 811, 812, 7, 13, 0, 0, 812, 124, 1, 0, 0, 0, 813, 814, 7, 9, 0, 0, 814, 815, 7, 20, 0, 0, 815, 816, 7, 13, 0, 0, 816, 817, 7, 13, 0, 0, 817, 818, 7, 2, 0, 0, 818, 126, 1, 0, 0, 0, 819, 820, 7, 7, 0, 0, 820, 821, 7, 6, 0, 0, 821, 128, 1, 0, 0, 0, 822, 823, 5, 63, 0, 0, 823, 130, 1, 0, 0, 0, 824, 825, 7, 6, 0, 0, 825, 826, 7, 13, 0, 0, 826, 827, 7, 1, 0, 0, 827, 828, 7, 18, 0, 0, 828, 829, 7, 3, 0, 0, 829, 132, 1, 0, 0, 0, 830, 831, 5, 41, 0, 0, 831, 134, 1, 0, 0, 0, 832, 833, 7, 5, 0, 0, 833, 834, 7, 6, 0, 0, 834, 835, 7, 20, 0, 0, 835, 836, 7, 3, 0, 0, 836, 136, 1, 0, 0, 0, 837, 838, 5, 61, 0, 0, 838, 839, 5, 61, 0, 0, 839, 138, 1, 0, 0, 0, 840, 841, 5, 61, 0, 0, 841, 842, 5, 126, 0, 0, 842, 140, 1, 0, 0, 0, 843, 844, 5, 33, 0, 0, 844, 845, 5, 61, 0, 0, 845, 142, 1, 0, 0, 0, 846, 847, 5, 60, 0, 0, 847, 144, 1, 0, 0, 0, 848, 849, 5, 60, 0, 0, 849, 850, 5, 61, 0, 0, 850, 146, 1, 0, 0, 0, 851, 852, 5, 62, 0, 0, 852, 148, 1, 0, 0, 0, 853, 854, 5, 62, 0, 0, 854, 855, 5, 61, 0, 0, 855, 150, 1, 0, 0, 0, 856, 857, 5, 43, 0, 0, 857, 152, 1, 0, 0, 0, 858, 859, 5, 45, 0, 0, 859, 154, 1, 0, 0, 0, 860, 861, 5, 42, 0, 0, 861, 156, 1, 0, 0, 0, 862, 863, 5, 47, 0, 0, 863, 158, 1, 0, 0, 0, 864, 865, 5, 37, 0, 0, 865, 160, 1, 0, 0, 0, 866, 867, 4, 73, 4, 0, 867, 868, 3, 51, 18, 0, 868, 869, 1, 0, 0, 0, 869, 870, 6, 73, 12, 0, 870, 162, 1, 0, 0, 0, 871, 874, 3, 129, 57, 0, 872, 875, 3, 67, 26, 0, 873, 875, 3, 81, 33, 0, 874, 872, 1, 0, 0, 0, 874, 873, 1, 0, 0, 0, 875, 879, 1, 0, 0, 0, 876, 878, 3, 83, 34, 0, 877, 876, 1, 0, 0, 0, 878, 881, 1, 0, 0, 0, 879, 877, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 889, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 882, 884, 3, 129, 57, 0, 883, 885, 3, 65, 25, 0, 884, 883, 1, 0, 0, 0, 885, 886, 1, 0, 0, 0, 886, 884, 1, 0, 0, 0, 886, 887, 1, 0, 0, 0, 887, 889, 1, 0, 0, 0, 888, 871, 1, 0, 0, 0, 888, 882, 1, 0, 0, 0, 889, 164, 1, 0, 0, 0, 890, 891, 5, 91, 0, 0, 891, 892, 1, 0, 0, 0, 892, 893, 6, 75, 0, 0, 893, 894, 6, 75, 0, 0, 894, 166, 1, 0, 0, 0, 895, 896, 5, 93, 0, 0, 896, 897, 1, 0, 0, 0, 897, 898, 6, 76, 11, 0, 898, 899, 6, 76, 11, 0, 899, 168, 1, 0, 0, 0, 900, 904, 3, 67, 26, 0, 901, 903, 3, 83, 34, 0, 902, 901, 1, 0, 0, 0, 903, 906, 1, 0, 0, 0, 904, 902, 1, 0, 0, 0, 904, 905, 1, 0, 0, 0, 905, 917, 1, 0, 0, 0, 906, 904, 1, 0, 0, 0, 907, 910, 3, 81, 33, 0, 908, 910, 3, 75, 30, 0, 909, 907, 1, 0, 0, 0, 909, 908, 1, 0, 0, 0, 910, 912, 1, 0, 0, 0, 911, 913, 3, 83, 34, 0, 912, 911, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 912, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 917, 1, 0, 0, 0, 916, 900, 1, 0, 0, 0, 916, 909, 1, 0, 0, 0, 917, 170, 1, 0, 0, 0, 918, 920, 3, 77, 31, 0, 919, 921, 3, 79, 32, 0, 920, 919, 1, 0, 0, 0, 921, 922, 1, 0, 0, 0, 922, 920, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 923, 924, 1, 0, 0, 0, 924, 925, 3, 77, 31, 0, 925, 172, 1, 0, 0, 0, 926, 927, 3, 171, 78, 0, 927, 174, 1, 0, 0, 0, 928, 929, 3, 57, 21, 0, 929, 930, 1, 0, 0, 0, 930, 931, 6, 80, 10, 0, 931, 176, 1, 0, 0, 0, 932, 933, 3, 59, 22, 0, 933, 934, 1, 0, 0, 0, 934, 935, 6, 81, 10, 0, 935, 178, 1, 0, 0, 0, 936, 937, 3, 61, 23, 0, 937, 938, 1, 0, 0, 0, 938, 939, 6, 82, 10, 0, 939, 180, 1, 0, 0, 0, 940, 941, 3, 165, 75, 0, 941, 942, 1, 0, 0, 0, 942, 943, 6, 83, 13, 0, 943, 944, 6, 83, 14, 0, 944, 182, 1, 0, 0, 0, 945, 946, 3, 63, 24, 0, 946, 947, 1, 0, 0, 0, 947, 948, 6, 84, 15, 0, 948, 949, 6, 84, 11, 0, 949, 184, 1, 0, 0, 0, 950, 951, 3, 61, 23, 0, 951, 952, 1, 0, 0, 0, 952, 953, 6, 85, 10, 0, 953, 186, 1, 0, 0, 0, 954, 955, 3, 57, 21, 0, 955, 956, 1, 0, 0, 0, 956, 957, 6, 86, 10, 0, 957, 188, 1, 0, 0, 0, 958, 959, 3, 59, 22, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 87, 10, 0, 961, 190, 1, 0, 0, 0, 962, 963, 3, 63, 24, 0, 963, 964, 1, 0, 0, 0, 964, 965, 6, 88, 15, 0, 965, 966, 6, 88, 11, 0, 966, 192, 1, 0, 0, 0, 967, 968, 3, 165, 75, 0, 968, 969, 1, 0, 0, 0, 969, 970, 6, 89, 13, 0, 970, 194, 1, 0, 0, 0, 971, 972, 3, 167, 76, 0, 972, 973, 1, 0, 0, 0, 973, 974, 6, 90, 16, 0, 974, 196, 1, 0, 0, 0, 975, 976, 3, 337, 161, 0, 976, 977, 1, 0, 0, 0, 977, 978, 6, 91, 17, 0, 978, 198, 1, 0, 0, 0, 979, 980, 3, 101, 43, 0, 980, 981, 1, 0, 0, 0, 981, 982, 6, 92, 18, 0, 982, 200, 1, 0, 0, 0, 983, 984, 3, 97, 41, 0, 984, 985, 1, 0, 0, 0, 985, 986, 6, 93, 19, 0, 986, 202, 1, 0, 0, 0, 987, 988, 7, 16, 0, 0, 988, 989, 7, 3, 0, 0, 989, 990, 7, 5, 0, 0, 990, 991, 7, 12, 0, 0, 991, 992, 7, 0, 0, 0, 992, 993, 7, 12, 0, 0, 993, 994, 7, 5, 0, 0, 994, 995, 7, 12, 0, 0, 995, 204, 1, 0, 0, 0, 996, 1000, 8, 32, 0, 0, 997, 998, 5, 47, 0, 0, 998, 1000, 8, 33, 0, 0, 999, 996, 1, 0, 0, 0, 999, 997, 1, 0, 0, 0, 1000, 206, 1, 0, 0, 0, 1001, 1003, 3, 205, 95, 0, 1002, 1001, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1002, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 208, 1, 0, 0, 0, 1006, 1007, 3, 207, 96, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1009, 6, 97, 20, 0, 1009, 210, 1, 0, 0, 0, 1010, 1011, 3, 85, 35, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 6, 98, 21, 0, 1013, 212, 1, 0, 0, 0, 1014, 1015, 3, 57, 21, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1017, 6, 99, 10, 0, 1017, 214, 1, 0, 0, 0, 1018, 1019, 3, 59, 22, 0, 1019, 1020, 1, 0, 0, 0, 1020, 1021, 6, 100, 10, 0, 1021, 216, 1, 0, 0, 0, 1022, 1023, 3, 61, 23, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 6, 101, 10, 0, 1025, 218, 1, 0, 0, 0, 1026, 1027, 3, 63, 24, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1029, 6, 102, 15, 0, 1029, 1030, 6, 102, 11, 0, 1030, 220, 1, 0, 0, 0, 1031, 1032, 3, 105, 45, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 6, 103, 22, 0, 1034, 222, 1, 0, 0, 0, 1035, 1036, 3, 101, 43, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 6, 104, 18, 0, 1038, 224, 1, 0, 0, 0, 1039, 1040, 3, 129, 57, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 6, 105, 23, 0, 1042, 226, 1, 0, 0, 0, 1043, 1044, 3, 163, 74, 0, 1044, 1045, 1, 0, 0, 0, 1045, 1046, 6, 106, 24, 0, 1046, 228, 1, 0, 0, 0, 1047, 1052, 3, 67, 26, 0, 1048, 1052, 3, 65, 25, 0, 1049, 1052, 3, 81, 33, 0, 1050, 1052, 3, 155, 70, 0, 1051, 1047, 1, 0, 0, 0, 1051, 1048, 1, 0, 0, 0, 1051, 1049, 1, 0, 0, 0, 1051, 1050, 1, 0, 0, 0, 1052, 230, 1, 0, 0, 0, 1053, 1056, 3, 67, 26, 0, 1054, 1056, 3, 155, 70, 0, 1055, 1053, 1, 0, 0, 0, 1055, 1054, 1, 0, 0, 0, 1056, 1060, 1, 0, 0, 0, 1057, 1059, 3, 229, 107, 0, 1058, 1057, 1, 0, 0, 0, 1059, 1062, 1, 0, 0, 0, 1060, 1058, 1, 0, 0, 0, 1060, 1061, 1, 0, 0, 0, 1061, 1073, 1, 0, 0, 0, 1062, 1060, 1, 0, 0, 0, 1063, 1066, 3, 81, 33, 0, 1064, 1066, 3, 75, 30, 0, 1065, 1063, 1, 0, 0, 0, 1065, 1064, 1, 0, 0, 0, 1066, 1068, 1, 0, 0, 0, 1067, 1069, 3, 229, 107, 0, 1068, 1067, 1, 0, 0, 0, 1069, 1070, 1, 0, 0, 0, 1070, 1068, 1, 0, 0, 0, 1070, 1071, 1, 0, 0, 0, 1071, 1073, 1, 0, 0, 0, 1072, 1055, 1, 0, 0, 0, 1072, 1065, 1, 0, 0, 0, 1073, 232, 1, 0, 0, 0, 1074, 1077, 3, 231, 108, 0, 1075, 1077, 3, 171, 78, 0, 1076, 1074, 1, 0, 0, 0, 1076, 1075, 1, 0, 0, 0, 1077, 1078, 1, 0, 0, 0, 1078, 1076, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 234, 1, 0, 0, 0, 1080, 1081, 3, 57, 21, 0, 1081, 1082, 1, 0, 0, 0, 1082, 1083, 6, 110, 10, 0, 1083, 236, 1, 0, 0, 0, 1084, 1085, 3, 59, 22, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1087, 6, 111, 10, 0, 1087, 238, 1, 0, 0, 0, 1088, 1089, 3, 61, 23, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 6, 112, 10, 0, 1091, 240, 1, 0, 0, 0, 1092, 1093, 3, 63, 24, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 6, 113, 15, 0, 1095, 1096, 6, 113, 11, 0, 1096, 242, 1, 0, 0, 0, 1097, 1098, 3, 97, 41, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 6, 114, 19, 0, 1100, 244, 1, 0, 0, 0, 1101, 1102, 3, 101, 43, 0, 1102, 1103, 1, 0, 0, 0, 1103, 1104, 6, 115, 18, 0, 1104, 246, 1, 0, 0, 0, 1105, 1106, 3, 105, 45, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 6, 116, 22, 0, 1108, 248, 1, 0, 0, 0, 1109, 1110, 3, 129, 57, 0, 1110, 1111, 1, 0, 0, 0, 1111, 1112, 6, 117, 23, 0, 1112, 250, 1, 0, 0, 0, 1113, 1114, 3, 163, 74, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 6, 118, 24, 0, 1116, 252, 1, 0, 0, 0, 1117, 1118, 7, 12, 0, 0, 1118, 1119, 7, 2, 0, 0, 1119, 254, 1, 0, 0, 0, 1120, 1121, 3, 233, 109, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1123, 6, 120, 25, 0, 1123, 256, 1, 0, 0, 0, 1124, 1125, 3, 57, 21, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1127, 6, 121, 10, 0, 1127, 258, 1, 0, 0, 0, 1128, 1129, 3, 59, 22, 0, 1129, 1130, 1, 0, 0, 0, 1130, 1131, 6, 122, 10, 0, 1131, 260, 1, 0, 0, 0, 1132, 1133, 3, 61, 23, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 6, 123, 10, 0, 1135, 262, 1, 0, 0, 0, 1136, 1137, 3, 63, 24, 0, 1137, 1138, 1, 0, 0, 0, 1138, 1139, 6, 124, 15, 0, 1139, 1140, 6, 124, 11, 0, 1140, 264, 1, 0, 0, 0, 1141, 1142, 3, 165, 75, 0, 1142, 1143, 1, 0, 0, 0, 1143, 1144, 6, 125, 13, 0, 1144, 1145, 6, 125, 26, 0, 1145, 266, 1, 0, 0, 0, 1146, 1147, 7, 7, 0, 0, 1147, 1148, 7, 9, 0, 0, 1148, 1149, 1, 0, 0, 0, 1149, 1150, 6, 126, 27, 0, 1150, 268, 1, 0, 0, 0, 1151, 1152, 7, 19, 0, 0, 1152, 1153, 7, 1, 0, 0, 1153, 1154, 7, 5, 0, 0, 1154, 1155, 7, 10, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 6, 127, 27, 0, 1157, 270, 1, 0, 0, 0, 1158, 1159, 8, 34, 0, 0, 1159, 272, 1, 0, 0, 0, 1160, 1162, 3, 271, 128, 0, 1161, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1161, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 1, 0, 0, 0, 1165, 1166, 3, 337, 161, 0, 1166, 1168, 1, 0, 0, 0, 1167, 1161, 1, 0, 0, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1170, 1, 0, 0, 0, 1169, 1171, 3, 271, 128, 0, 1170, 1169, 1, 0, 0, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1170, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 274, 1, 0, 0, 0, 1174, 1175, 3, 273, 129, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 6, 130, 28, 0, 1177, 276, 1, 0, 0, 0, 1178, 1179, 3, 57, 21, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 6, 131, 10, 0, 1181, 278, 1, 0, 0, 0, 1182, 1183, 3, 59, 22, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1185, 6, 132, 10, 0, 1185, 280, 1, 0, 0, 0, 1186, 1187, 3, 61, 23, 0, 1187, 1188, 1, 0, 0, 0, 1188, 1189, 6, 133, 10, 0, 1189, 282, 1, 0, 0, 0, 1190, 1191, 3, 63, 24, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1193, 6, 134, 15, 0, 1193, 1194, 6, 134, 11, 0, 1194, 1195, 6, 134, 11, 0, 1195, 284, 1, 0, 0, 0, 1196, 1197, 3, 97, 41, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1199, 6, 135, 19, 0, 1199, 286, 1, 0, 0, 0, 1200, 1201, 3, 101, 43, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 6, 136, 18, 0, 1203, 288, 1, 0, 0, 0, 1204, 1205, 3, 105, 45, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1207, 6, 137, 22, 0, 1207, 290, 1, 0, 0, 0, 1208, 1209, 3, 269, 127, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 6, 138, 29, 0, 1211, 292, 1, 0, 0, 0, 1212, 1213, 3, 233, 109, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1215, 6, 139, 25, 0, 1215, 294, 1, 0, 0, 0, 1216, 1217, 3, 173, 79, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1219, 6, 140, 30, 0, 1219, 296, 1, 0, 0, 0, 1220, 1221, 3, 129, 57, 0, 1221, 1222, 1, 0, 0, 0, 1222, 1223, 6, 141, 23, 0, 1223, 298, 1, 0, 0, 0, 1224, 1225, 3, 163, 74, 0, 1225, 1226, 1, 0, 0, 0, 1226, 1227, 6, 142, 24, 0, 1227, 300, 1, 0, 0, 0, 1228, 1229, 3, 57, 21, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 6, 143, 10, 0, 1231, 302, 1, 0, 0, 0, 1232, 1233, 3, 59, 22, 0, 1233, 1234, 1, 0, 0, 0, 1234, 1235, 6, 144, 10, 0, 1235, 304, 1, 0, 0, 0, 1236, 1237, 3, 61, 23, 0, 1237, 1238, 1, 0, 0, 0, 1238, 1239, 6, 145, 10, 0, 1239, 306, 1, 0, 0, 0, 1240, 1241, 3, 63, 24, 0, 1241, 1242, 1, 0, 0, 0, 1242, 1243, 6, 146, 15, 0, 1243, 1244, 6, 146, 11, 0, 1244, 308, 1, 0, 0, 0, 1245, 1246, 3, 105, 45, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1248, 6, 147, 22, 0, 1248, 310, 1, 0, 0, 0, 1249, 1250, 3, 129, 57, 0, 1250, 1251, 1, 0, 0, 0, 1251, 1252, 6, 148, 23, 0, 1252, 312, 1, 0, 0, 0, 1253, 1254, 3, 163, 74, 0, 1254, 1255, 1, 0, 0, 0, 1255, 1256, 6, 149, 24, 0, 1256, 314, 1, 0, 0, 0, 1257, 1258, 3, 173, 79, 0, 1258, 1259, 1, 0, 0, 0, 1259, 1260, 6, 150, 30, 0, 1260, 316, 1, 0, 0, 0, 1261, 1262, 3, 169, 77, 0, 1262, 1263, 1, 0, 0, 0, 1263, 1264, 6, 151, 31, 0, 1264, 318, 1, 0, 0, 0, 1265, 1266, 3, 57, 21, 0, 1266, 1267, 1, 0, 0, 0, 1267, 1268, 6, 152, 10, 0, 1268, 320, 1, 0, 0, 0, 1269, 1270, 3, 59, 22, 0, 1270, 1271, 1, 0, 0, 0, 1271, 1272, 6, 153, 10, 0, 1272, 322, 1, 0, 0, 0, 1273, 1274, 3, 61, 23, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1276, 6, 154, 10, 0, 1276, 324, 1, 0, 0, 0, 1277, 1278, 3, 63, 24, 0, 1278, 1279, 1, 0, 0, 0, 1279, 1280, 6, 155, 15, 0, 1280, 1281, 6, 155, 11, 0, 1281, 326, 1, 0, 0, 0, 1282, 1283, 7, 1, 0, 0, 1283, 1284, 7, 9, 0, 0, 1284, 1285, 7, 15, 0, 0, 1285, 1286, 7, 7, 0, 0, 1286, 328, 1, 0, 0, 0, 1287, 1288, 3, 57, 21, 0, 1288, 1289, 1, 0, 0, 0, 1289, 1290, 6, 157, 10, 0, 1290, 330, 1, 0, 0, 0, 1291, 1292, 3, 59, 22, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1294, 6, 158, 10, 0, 1294, 332, 1, 0, 0, 0, 1295, 1296, 3, 61, 23, 0, 1296, 1297, 1, 0, 0, 0, 1297, 1298, 6, 159, 10, 0, 1298, 334, 1, 0, 0, 0, 1299, 1300, 3, 167, 76, 0, 1300, 1301, 1, 0, 0, 0, 1301, 1302, 6, 160, 16, 0, 1302, 1303, 6, 160, 11, 0, 1303, 336, 1, 0, 0, 0, 1304, 1305, 5, 58, 0, 0, 1305, 338, 1, 0, 0, 0, 1306, 1312, 3, 75, 30, 0, 1307, 1312, 3, 65, 25, 0, 1308, 1312, 3, 105, 45, 0, 1309, 1312, 3, 67, 26, 0, 1310, 1312, 3, 81, 33, 0, 1311, 1306, 1, 0, 0, 0, 1311, 1307, 1, 0, 0, 0, 1311, 1308, 1, 0, 0, 0, 1311, 1309, 1, 0, 0, 0, 1311, 1310, 1, 0, 0, 0, 1312, 1313, 1, 0, 0, 0, 1313, 1311, 1, 0, 0, 0, 1313, 1314, 1, 0, 0, 0, 1314, 340, 1, 0, 0, 0, 1315, 1316, 3, 57, 21, 0, 1316, 1317, 1, 0, 0, 0, 1317, 1318, 6, 163, 10, 0, 1318, 342, 1, 0, 0, 0, 1319, 1320, 3, 59, 22, 0, 1320, 1321, 1, 0, 0, 0, 1321, 1322, 6, 164, 10, 0, 1322, 344, 1, 0, 0, 0, 1323, 1324, 3, 61, 23, 0, 1324, 1325, 1, 0, 0, 0, 1325, 1326, 6, 165, 10, 0, 1326, 346, 1, 0, 0, 0, 1327, 1328, 3, 63, 24, 0, 1328, 1329, 1, 0, 0, 0, 1329, 1330, 6, 166, 15, 0, 1330, 1331, 6, 166, 11, 0, 1331, 348, 1, 0, 0, 0, 1332, 1333, 3, 337, 161, 0, 1333, 1334, 1, 0, 0, 0, 1334, 1335, 6, 167, 17, 0, 1335, 350, 1, 0, 0, 0, 1336, 1337, 3, 101, 43, 0, 1337, 1338, 1, 0, 0, 0, 1338, 1339, 6, 168, 18, 0, 1339, 352, 1, 0, 0, 0, 1340, 1341, 3, 105, 45, 0, 1341, 1342, 1, 0, 0, 0, 1342, 1343, 6, 169, 22, 0, 1343, 354, 1, 0, 0, 0, 1344, 1345, 3, 267, 126, 0, 1345, 1346, 1, 0, 0, 0, 1346, 1347, 6, 170, 32, 0, 1347, 1348, 6, 170, 33, 0, 1348, 356, 1, 0, 0, 0, 1349, 1350, 3, 207, 96, 0, 1350, 1351, 1, 0, 0, 0, 1351, 1352, 6, 171, 20, 0, 1352, 358, 1, 0, 0, 0, 1353, 1354, 3, 85, 35, 0, 1354, 1355, 1, 0, 0, 0, 1355, 1356, 6, 172, 21, 0, 1356, 360, 1, 0, 0, 0, 1357, 1358, 3, 57, 21, 0, 1358, 1359, 1, 0, 0, 0, 1359, 1360, 6, 173, 10, 0, 1360, 362, 1, 0, 0, 0, 1361, 1362, 3, 59, 22, 0, 1362, 1363, 1, 0, 0, 0, 1363, 1364, 6, 174, 10, 0, 1364, 364, 1, 0, 0, 0, 1365, 1366, 3, 61, 23, 0, 1366, 1367, 1, 0, 0, 0, 1367, 1368, 6, 175, 10, 0, 1368, 366, 1, 0, 0, 0, 1369, 1370, 3, 63, 24, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1372, 6, 176, 15, 0, 1372, 1373, 6, 176, 11, 0, 1373, 1374, 6, 176, 11, 0, 1374, 368, 1, 0, 0, 0, 1375, 1376, 3, 101, 43, 0, 1376, 1377, 1, 0, 0, 0, 1377, 1378, 6, 177, 18, 0, 1378, 370, 1, 0, 0, 0, 1379, 1380, 3, 105, 45, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1382, 6, 178, 22, 0, 1382, 372, 1, 0, 0, 0, 1383, 1384, 3, 233, 109, 0, 1384, 1385, 1, 0, 0, 0, 1385, 1386, 6, 179, 25, 0, 1386, 374, 1, 0, 0, 0, 1387, 1388, 3, 57, 21, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1390, 6, 180, 10, 0, 1390, 376, 1, 0, 0, 0, 1391, 1392, 3, 59, 22, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1394, 6, 181, 10, 0, 1394, 378, 1, 0, 0, 0, 1395, 1396, 3, 61, 23, 0, 1396, 1397, 1, 0, 0, 0, 1397, 1398, 6, 182, 10, 0, 1398, 380, 1, 0, 0, 0, 1399, 1400, 3, 63, 24, 0, 1400, 1401, 1, 0, 0, 0, 1401, 1402, 6, 183, 15, 0, 1402, 1403, 6, 183, 11, 0, 1403, 382, 1, 0, 0, 0, 1404, 1405, 3, 207, 96, 0, 1405, 1406, 1, 0, 0, 0, 1406, 1407, 6, 184, 20, 0, 1407, 1408, 6, 184, 11, 0, 1408, 1409, 6, 184, 34, 0, 1409, 384, 1, 0, 0, 0, 1410, 1411, 3, 85, 35, 0, 1411, 1412, 1, 0, 0, 0, 1412, 1413, 6, 185, 21, 0, 1413, 1414, 6, 185, 11, 0, 1414, 1415, 6, 185, 34, 0, 1415, 386, 1, 0, 0, 0, 1416, 1417, 3, 57, 21, 0, 1417, 1418, 1, 0, 0, 0, 1418, 1419, 6, 186, 10, 0, 1419, 388, 1, 0, 0, 0, 1420, 1421, 3, 59, 22, 0, 1421, 1422, 1, 0, 0, 0, 1422, 1423, 6, 187, 10, 0, 1423, 390, 1, 0, 0, 0, 1424, 1425, 3, 61, 23, 0, 1425, 1426, 1, 0, 0, 0, 1426, 1427, 6, 188, 10, 0, 1427, 392, 1, 0, 0, 0, 1428, 1429, 3, 337, 161, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1431, 6, 189, 17, 0, 1431, 1432, 6, 189, 11, 0, 1432, 1433, 6, 189, 9, 0, 1433, 394, 1, 0, 0, 0, 1434, 1435, 3, 101, 43, 0, 1435, 1436, 1, 0, 0, 0, 1436, 1437, 6, 190, 18, 0, 1437, 1438, 6, 190, 11, 0, 1438, 1439, 6, 190, 9, 0, 1439, 396, 1, 0, 0, 0, 1440, 1441, 3, 57, 21, 0, 1441, 1442, 1, 0, 0, 0, 1442, 1443, 6, 191, 10, 0, 1443, 398, 1, 0, 0, 0, 1444, 1445, 3, 59, 22, 0, 1445, 1446, 1, 0, 0, 0, 1446, 1447, 6, 192, 10, 0, 1447, 400, 1, 0, 0, 0, 1448, 1449, 3, 61, 23, 0, 1449, 1450, 1, 0, 0, 0, 1450, 1451, 6, 193, 10, 0, 1451, 402, 1, 0, 0, 0, 1452, 1453, 3, 173, 79, 0, 1453, 1454, 1, 0, 0, 0, 1454, 1455, 6, 194, 11, 0, 1455, 1456, 6, 194, 0, 0, 1456, 1457, 6, 194, 30, 0, 1457, 404, 1, 0, 0, 0, 1458, 1459, 3, 169, 77, 0, 1459, 1460, 1, 0, 0, 0, 1460, 1461, 6, 195, 11, 0, 1461, 1462, 6, 195, 0, 0, 1462, 1463, 6, 195, 31, 0, 1463, 406, 1, 0, 0, 0, 1464, 1465, 3, 91, 38, 0, 1465, 1466, 1, 0, 0, 0, 1466, 1467, 6, 196, 11, 0, 1467, 1468, 6, 196, 0, 0, 1468, 1469, 6, 196, 35, 0, 1469, 408, 1, 0, 0, 0, 1470, 1471, 3, 63, 24, 0, 1471, 1472, 1, 0, 0, 0, 1472, 1473, 6, 197, 15, 0, 1473, 1474, 6, 197, 11, 0, 1474, 410, 1, 0, 0, 0, 65, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 588, 598, 602, 605, 614, 616, 627, 646, 651, 660, 667, 672, 674, 685, 693, 696, 698, 703, 708, 714, 721, 726, 732, 735, 743, 747, 874, 879, 886, 888, 904, 909, 914, 916, 922, 999, 1004, 1051, 1055, 1060, 1065, 1070, 1072, 1076, 1078, 1163, 1167, 1172, 1311, 1313, 36, 5, 1, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 5, 3, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 5, 11, 0, 5, 13, 0, 0, 1, 0, 4, 0, 0, 7, 19, 0, 7, 65, 0, 5, 0, 0, 7, 25, 0, 7, 66, 0, 7, 104, 0, 7, 34, 0, 7, 32, 0, 7, 76, 0, 7, 26, 0, 7, 36, 0, 7, 48, 0, 7, 64, 0, 7, 80, 0, 5, 10, 0, 5, 7, 0, 7, 90, 0, 7, 89, 0, 7, 68, 0, 7, 67, 0, 7, 88, 0, 5, 12, 0, 5, 14, 0, 7, 29, 0] \ No newline at end of file +[4, 0, 120, 1479, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 4, 19, 578, 8, 19, 11, 19, 12, 19, 579, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 588, 8, 20, 10, 20, 12, 20, 591, 9, 20, 1, 20, 3, 20, 594, 8, 20, 1, 20, 3, 20, 597, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 606, 8, 21, 10, 21, 12, 21, 609, 9, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 4, 22, 617, 8, 22, 11, 22, 12, 22, 618, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 3, 28, 638, 8, 28, 1, 28, 4, 28, 641, 8, 28, 11, 28, 12, 28, 642, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 652, 8, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 3, 33, 659, 8, 33, 1, 34, 1, 34, 1, 34, 5, 34, 664, 8, 34, 10, 34, 12, 34, 667, 9, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 675, 8, 34, 10, 34, 12, 34, 678, 9, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 685, 8, 34, 1, 34, 3, 34, 688, 8, 34, 3, 34, 690, 8, 34, 1, 35, 4, 35, 693, 8, 35, 11, 35, 12, 35, 694, 1, 36, 4, 36, 698, 8, 36, 11, 36, 12, 36, 699, 1, 36, 1, 36, 5, 36, 704, 8, 36, 10, 36, 12, 36, 707, 9, 36, 1, 36, 1, 36, 4, 36, 711, 8, 36, 11, 36, 12, 36, 712, 1, 36, 4, 36, 716, 8, 36, 11, 36, 12, 36, 717, 1, 36, 1, 36, 5, 36, 722, 8, 36, 10, 36, 12, 36, 725, 9, 36, 3, 36, 727, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 4, 36, 733, 8, 36, 11, 36, 12, 36, 734, 1, 36, 1, 36, 3, 36, 739, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 3, 74, 871, 8, 74, 1, 74, 5, 74, 874, 8, 74, 10, 74, 12, 74, 877, 9, 74, 1, 74, 1, 74, 4, 74, 881, 8, 74, 11, 74, 12, 74, 882, 3, 74, 885, 8, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 5, 77, 899, 8, 77, 10, 77, 12, 77, 902, 9, 77, 1, 77, 1, 77, 3, 77, 906, 8, 77, 1, 77, 4, 77, 909, 8, 77, 11, 77, 12, 77, 910, 3, 77, 913, 8, 77, 1, 78, 1, 78, 4, 78, 917, 8, 78, 11, 78, 12, 78, 918, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 3, 95, 996, 8, 95, 1, 96, 4, 96, 999, 8, 96, 11, 96, 12, 96, 1000, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 3, 107, 1050, 8, 107, 1, 108, 1, 108, 3, 108, 1054, 8, 108, 1, 108, 5, 108, 1057, 8, 108, 10, 108, 12, 108, 1060, 9, 108, 1, 108, 1, 108, 3, 108, 1064, 8, 108, 1, 108, 4, 108, 1067, 8, 108, 11, 108, 12, 108, 1068, 3, 108, 1071, 8, 108, 1, 109, 1, 109, 4, 109, 1075, 8, 109, 11, 109, 12, 109, 1076, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 4, 129, 1162, 8, 129, 11, 129, 12, 129, 1163, 1, 129, 1, 129, 3, 129, 1168, 8, 129, 1, 129, 4, 129, 1171, 8, 129, 11, 129, 12, 129, 1172, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 4, 162, 1316, 8, 162, 11, 162, 12, 162, 1317, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 197, 2, 607, 676, 0, 198, 15, 1, 17, 2, 19, 3, 21, 4, 23, 5, 25, 6, 27, 7, 29, 8, 31, 9, 33, 10, 35, 11, 37, 12, 39, 13, 41, 14, 43, 15, 45, 16, 47, 17, 49, 18, 51, 19, 53, 20, 55, 21, 57, 22, 59, 23, 61, 24, 63, 0, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 0, 81, 0, 83, 25, 85, 26, 87, 27, 89, 28, 91, 29, 93, 30, 95, 31, 97, 32, 99, 33, 101, 34, 103, 35, 105, 36, 107, 37, 109, 38, 111, 39, 113, 40, 115, 41, 117, 42, 119, 43, 121, 44, 123, 45, 125, 46, 127, 47, 129, 48, 131, 49, 133, 50, 135, 51, 137, 52, 139, 53, 141, 54, 143, 55, 145, 56, 147, 57, 149, 58, 151, 59, 153, 60, 155, 61, 157, 62, 159, 63, 161, 0, 163, 64, 165, 65, 167, 66, 169, 67, 171, 0, 173, 68, 175, 69, 177, 70, 179, 71, 181, 0, 183, 0, 185, 72, 187, 73, 189, 74, 191, 0, 193, 0, 195, 0, 197, 0, 199, 0, 201, 0, 203, 75, 205, 0, 207, 76, 209, 0, 211, 0, 213, 77, 215, 78, 217, 79, 219, 0, 221, 0, 223, 0, 225, 0, 227, 0, 229, 0, 231, 0, 233, 80, 235, 81, 237, 82, 239, 83, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 253, 84, 255, 0, 257, 85, 259, 86, 261, 87, 263, 0, 265, 0, 267, 88, 269, 89, 271, 0, 273, 90, 275, 0, 277, 91, 279, 92, 281, 93, 283, 0, 285, 0, 287, 0, 289, 0, 291, 0, 293, 0, 295, 0, 297, 0, 299, 0, 301, 94, 303, 95, 305, 96, 307, 0, 309, 0, 311, 0, 313, 0, 315, 0, 317, 0, 319, 97, 321, 98, 323, 99, 325, 0, 327, 100, 329, 101, 331, 102, 333, 103, 335, 0, 337, 104, 339, 105, 341, 106, 343, 107, 345, 108, 347, 0, 349, 0, 351, 0, 353, 0, 355, 0, 357, 0, 359, 0, 361, 109, 363, 110, 365, 111, 367, 0, 369, 0, 371, 0, 373, 0, 375, 112, 377, 113, 379, 114, 381, 0, 383, 0, 385, 0, 387, 115, 389, 116, 391, 117, 393, 0, 395, 0, 397, 118, 399, 119, 401, 120, 403, 0, 405, 0, 407, 0, 409, 0, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1507, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 1, 61, 1, 0, 0, 0, 1, 83, 1, 0, 0, 0, 1, 85, 1, 0, 0, 0, 1, 87, 1, 0, 0, 0, 1, 89, 1, 0, 0, 0, 1, 91, 1, 0, 0, 0, 1, 93, 1, 0, 0, 0, 1, 95, 1, 0, 0, 0, 1, 97, 1, 0, 0, 0, 1, 99, 1, 0, 0, 0, 1, 101, 1, 0, 0, 0, 1, 103, 1, 0, 0, 0, 1, 105, 1, 0, 0, 0, 1, 107, 1, 0, 0, 0, 1, 109, 1, 0, 0, 0, 1, 111, 1, 0, 0, 0, 1, 113, 1, 0, 0, 0, 1, 115, 1, 0, 0, 0, 1, 117, 1, 0, 0, 0, 1, 119, 1, 0, 0, 0, 1, 121, 1, 0, 0, 0, 1, 123, 1, 0, 0, 0, 1, 125, 1, 0, 0, 0, 1, 127, 1, 0, 0, 0, 1, 129, 1, 0, 0, 0, 1, 131, 1, 0, 0, 0, 1, 133, 1, 0, 0, 0, 1, 135, 1, 0, 0, 0, 1, 137, 1, 0, 0, 0, 1, 139, 1, 0, 0, 0, 1, 141, 1, 0, 0, 0, 1, 143, 1, 0, 0, 0, 1, 145, 1, 0, 0, 0, 1, 147, 1, 0, 0, 0, 1, 149, 1, 0, 0, 0, 1, 151, 1, 0, 0, 0, 1, 153, 1, 0, 0, 0, 1, 155, 1, 0, 0, 0, 1, 157, 1, 0, 0, 0, 1, 159, 1, 0, 0, 0, 1, 161, 1, 0, 0, 0, 1, 163, 1, 0, 0, 0, 1, 165, 1, 0, 0, 0, 1, 167, 1, 0, 0, 0, 1, 169, 1, 0, 0, 0, 1, 173, 1, 0, 0, 0, 1, 175, 1, 0, 0, 0, 1, 177, 1, 0, 0, 0, 1, 179, 1, 0, 0, 0, 2, 181, 1, 0, 0, 0, 2, 183, 1, 0, 0, 0, 2, 185, 1, 0, 0, 0, 2, 187, 1, 0, 0, 0, 2, 189, 1, 0, 0, 0, 3, 191, 1, 0, 0, 0, 3, 193, 1, 0, 0, 0, 3, 195, 1, 0, 0, 0, 3, 197, 1, 0, 0, 0, 3, 199, 1, 0, 0, 0, 3, 201, 1, 0, 0, 0, 3, 203, 1, 0, 0, 0, 3, 207, 1, 0, 0, 0, 3, 209, 1, 0, 0, 0, 3, 211, 1, 0, 0, 0, 3, 213, 1, 0, 0, 0, 3, 215, 1, 0, 0, 0, 3, 217, 1, 0, 0, 0, 4, 219, 1, 0, 0, 0, 4, 221, 1, 0, 0, 0, 4, 223, 1, 0, 0, 0, 4, 225, 1, 0, 0, 0, 4, 227, 1, 0, 0, 0, 4, 233, 1, 0, 0, 0, 4, 235, 1, 0, 0, 0, 4, 237, 1, 0, 0, 0, 4, 239, 1, 0, 0, 0, 5, 241, 1, 0, 0, 0, 5, 243, 1, 0, 0, 0, 5, 245, 1, 0, 0, 0, 5, 247, 1, 0, 0, 0, 5, 249, 1, 0, 0, 0, 5, 251, 1, 0, 0, 0, 5, 253, 1, 0, 0, 0, 5, 255, 1, 0, 0, 0, 5, 257, 1, 0, 0, 0, 5, 259, 1, 0, 0, 0, 5, 261, 1, 0, 0, 0, 6, 263, 1, 0, 0, 0, 6, 265, 1, 0, 0, 0, 6, 267, 1, 0, 0, 0, 6, 269, 1, 0, 0, 0, 6, 273, 1, 0, 0, 0, 6, 275, 1, 0, 0, 0, 6, 277, 1, 0, 0, 0, 6, 279, 1, 0, 0, 0, 6, 281, 1, 0, 0, 0, 7, 283, 1, 0, 0, 0, 7, 285, 1, 0, 0, 0, 7, 287, 1, 0, 0, 0, 7, 289, 1, 0, 0, 0, 7, 291, 1, 0, 0, 0, 7, 293, 1, 0, 0, 0, 7, 295, 1, 0, 0, 0, 7, 297, 1, 0, 0, 0, 7, 299, 1, 0, 0, 0, 7, 301, 1, 0, 0, 0, 7, 303, 1, 0, 0, 0, 7, 305, 1, 0, 0, 0, 8, 307, 1, 0, 0, 0, 8, 309, 1, 0, 0, 0, 8, 311, 1, 0, 0, 0, 8, 313, 1, 0, 0, 0, 8, 315, 1, 0, 0, 0, 8, 317, 1, 0, 0, 0, 8, 319, 1, 0, 0, 0, 8, 321, 1, 0, 0, 0, 8, 323, 1, 0, 0, 0, 9, 325, 1, 0, 0, 0, 9, 327, 1, 0, 0, 0, 9, 329, 1, 0, 0, 0, 9, 331, 1, 0, 0, 0, 9, 333, 1, 0, 0, 0, 10, 335, 1, 0, 0, 0, 10, 337, 1, 0, 0, 0, 10, 339, 1, 0, 0, 0, 10, 341, 1, 0, 0, 0, 10, 343, 1, 0, 0, 0, 10, 345, 1, 0, 0, 0, 11, 347, 1, 0, 0, 0, 11, 349, 1, 0, 0, 0, 11, 351, 1, 0, 0, 0, 11, 353, 1, 0, 0, 0, 11, 355, 1, 0, 0, 0, 11, 357, 1, 0, 0, 0, 11, 359, 1, 0, 0, 0, 11, 361, 1, 0, 0, 0, 11, 363, 1, 0, 0, 0, 11, 365, 1, 0, 0, 0, 12, 367, 1, 0, 0, 0, 12, 369, 1, 0, 0, 0, 12, 371, 1, 0, 0, 0, 12, 373, 1, 0, 0, 0, 12, 375, 1, 0, 0, 0, 12, 377, 1, 0, 0, 0, 12, 379, 1, 0, 0, 0, 13, 381, 1, 0, 0, 0, 13, 383, 1, 0, 0, 0, 13, 385, 1, 0, 0, 0, 13, 387, 1, 0, 0, 0, 13, 389, 1, 0, 0, 0, 13, 391, 1, 0, 0, 0, 14, 393, 1, 0, 0, 0, 14, 395, 1, 0, 0, 0, 14, 397, 1, 0, 0, 0, 14, 399, 1, 0, 0, 0, 14, 401, 1, 0, 0, 0, 14, 403, 1, 0, 0, 0, 14, 405, 1, 0, 0, 0, 14, 407, 1, 0, 0, 0, 14, 409, 1, 0, 0, 0, 15, 411, 1, 0, 0, 0, 17, 421, 1, 0, 0, 0, 19, 428, 1, 0, 0, 0, 21, 437, 1, 0, 0, 0, 23, 444, 1, 0, 0, 0, 25, 454, 1, 0, 0, 0, 27, 461, 1, 0, 0, 0, 29, 468, 1, 0, 0, 0, 31, 475, 1, 0, 0, 0, 33, 483, 1, 0, 0, 0, 35, 495, 1, 0, 0, 0, 37, 504, 1, 0, 0, 0, 39, 510, 1, 0, 0, 0, 41, 517, 1, 0, 0, 0, 43, 524, 1, 0, 0, 0, 45, 532, 1, 0, 0, 0, 47, 540, 1, 0, 0, 0, 49, 555, 1, 0, 0, 0, 51, 565, 1, 0, 0, 0, 53, 577, 1, 0, 0, 0, 55, 583, 1, 0, 0, 0, 57, 600, 1, 0, 0, 0, 59, 616, 1, 0, 0, 0, 61, 622, 1, 0, 0, 0, 63, 626, 1, 0, 0, 0, 65, 628, 1, 0, 0, 0, 67, 630, 1, 0, 0, 0, 69, 633, 1, 0, 0, 0, 71, 635, 1, 0, 0, 0, 73, 644, 1, 0, 0, 0, 75, 646, 1, 0, 0, 0, 77, 651, 1, 0, 0, 0, 79, 653, 1, 0, 0, 0, 81, 658, 1, 0, 0, 0, 83, 689, 1, 0, 0, 0, 85, 692, 1, 0, 0, 0, 87, 738, 1, 0, 0, 0, 89, 740, 1, 0, 0, 0, 91, 743, 1, 0, 0, 0, 93, 747, 1, 0, 0, 0, 95, 751, 1, 0, 0, 0, 97, 753, 1, 0, 0, 0, 99, 756, 1, 0, 0, 0, 101, 758, 1, 0, 0, 0, 103, 763, 1, 0, 0, 0, 105, 765, 1, 0, 0, 0, 107, 771, 1, 0, 0, 0, 109, 777, 1, 0, 0, 0, 111, 780, 1, 0, 0, 0, 113, 783, 1, 0, 0, 0, 115, 788, 1, 0, 0, 0, 117, 793, 1, 0, 0, 0, 119, 795, 1, 0, 0, 0, 121, 799, 1, 0, 0, 0, 123, 804, 1, 0, 0, 0, 125, 810, 1, 0, 0, 0, 127, 813, 1, 0, 0, 0, 129, 815, 1, 0, 0, 0, 131, 821, 1, 0, 0, 0, 133, 823, 1, 0, 0, 0, 135, 828, 1, 0, 0, 0, 137, 831, 1, 0, 0, 0, 139, 834, 1, 0, 0, 0, 141, 837, 1, 0, 0, 0, 143, 839, 1, 0, 0, 0, 145, 842, 1, 0, 0, 0, 147, 844, 1, 0, 0, 0, 149, 847, 1, 0, 0, 0, 151, 849, 1, 0, 0, 0, 153, 851, 1, 0, 0, 0, 155, 853, 1, 0, 0, 0, 157, 855, 1, 0, 0, 0, 159, 857, 1, 0, 0, 0, 161, 863, 1, 0, 0, 0, 163, 884, 1, 0, 0, 0, 165, 886, 1, 0, 0, 0, 167, 891, 1, 0, 0, 0, 169, 912, 1, 0, 0, 0, 171, 914, 1, 0, 0, 0, 173, 922, 1, 0, 0, 0, 175, 924, 1, 0, 0, 0, 177, 928, 1, 0, 0, 0, 179, 932, 1, 0, 0, 0, 181, 936, 1, 0, 0, 0, 183, 941, 1, 0, 0, 0, 185, 946, 1, 0, 0, 0, 187, 950, 1, 0, 0, 0, 189, 954, 1, 0, 0, 0, 191, 958, 1, 0, 0, 0, 193, 963, 1, 0, 0, 0, 195, 967, 1, 0, 0, 0, 197, 971, 1, 0, 0, 0, 199, 975, 1, 0, 0, 0, 201, 979, 1, 0, 0, 0, 203, 983, 1, 0, 0, 0, 205, 995, 1, 0, 0, 0, 207, 998, 1, 0, 0, 0, 209, 1002, 1, 0, 0, 0, 211, 1006, 1, 0, 0, 0, 213, 1010, 1, 0, 0, 0, 215, 1014, 1, 0, 0, 0, 217, 1018, 1, 0, 0, 0, 219, 1022, 1, 0, 0, 0, 221, 1027, 1, 0, 0, 0, 223, 1031, 1, 0, 0, 0, 225, 1035, 1, 0, 0, 0, 227, 1040, 1, 0, 0, 0, 229, 1049, 1, 0, 0, 0, 231, 1070, 1, 0, 0, 0, 233, 1074, 1, 0, 0, 0, 235, 1078, 1, 0, 0, 0, 237, 1082, 1, 0, 0, 0, 239, 1086, 1, 0, 0, 0, 241, 1090, 1, 0, 0, 0, 243, 1095, 1, 0, 0, 0, 245, 1099, 1, 0, 0, 0, 247, 1103, 1, 0, 0, 0, 249, 1107, 1, 0, 0, 0, 251, 1112, 1, 0, 0, 0, 253, 1117, 1, 0, 0, 0, 255, 1120, 1, 0, 0, 0, 257, 1124, 1, 0, 0, 0, 259, 1128, 1, 0, 0, 0, 261, 1132, 1, 0, 0, 0, 263, 1136, 1, 0, 0, 0, 265, 1141, 1, 0, 0, 0, 267, 1146, 1, 0, 0, 0, 269, 1151, 1, 0, 0, 0, 271, 1158, 1, 0, 0, 0, 273, 1167, 1, 0, 0, 0, 275, 1174, 1, 0, 0, 0, 277, 1178, 1, 0, 0, 0, 279, 1182, 1, 0, 0, 0, 281, 1186, 1, 0, 0, 0, 283, 1190, 1, 0, 0, 0, 285, 1196, 1, 0, 0, 0, 287, 1200, 1, 0, 0, 0, 289, 1204, 1, 0, 0, 0, 291, 1208, 1, 0, 0, 0, 293, 1212, 1, 0, 0, 0, 295, 1216, 1, 0, 0, 0, 297, 1220, 1, 0, 0, 0, 299, 1225, 1, 0, 0, 0, 301, 1230, 1, 0, 0, 0, 303, 1234, 1, 0, 0, 0, 305, 1238, 1, 0, 0, 0, 307, 1242, 1, 0, 0, 0, 309, 1247, 1, 0, 0, 0, 311, 1251, 1, 0, 0, 0, 313, 1256, 1, 0, 0, 0, 315, 1261, 1, 0, 0, 0, 317, 1265, 1, 0, 0, 0, 319, 1269, 1, 0, 0, 0, 321, 1273, 1, 0, 0, 0, 323, 1277, 1, 0, 0, 0, 325, 1281, 1, 0, 0, 0, 327, 1286, 1, 0, 0, 0, 329, 1291, 1, 0, 0, 0, 331, 1295, 1, 0, 0, 0, 333, 1299, 1, 0, 0, 0, 335, 1303, 1, 0, 0, 0, 337, 1308, 1, 0, 0, 0, 339, 1315, 1, 0, 0, 0, 341, 1319, 1, 0, 0, 0, 343, 1323, 1, 0, 0, 0, 345, 1327, 1, 0, 0, 0, 347, 1331, 1, 0, 0, 0, 349, 1336, 1, 0, 0, 0, 351, 1340, 1, 0, 0, 0, 353, 1344, 1, 0, 0, 0, 355, 1348, 1, 0, 0, 0, 357, 1353, 1, 0, 0, 0, 359, 1357, 1, 0, 0, 0, 361, 1361, 1, 0, 0, 0, 363, 1365, 1, 0, 0, 0, 365, 1369, 1, 0, 0, 0, 367, 1373, 1, 0, 0, 0, 369, 1379, 1, 0, 0, 0, 371, 1383, 1, 0, 0, 0, 373, 1387, 1, 0, 0, 0, 375, 1391, 1, 0, 0, 0, 377, 1395, 1, 0, 0, 0, 379, 1399, 1, 0, 0, 0, 381, 1403, 1, 0, 0, 0, 383, 1408, 1, 0, 0, 0, 385, 1414, 1, 0, 0, 0, 387, 1420, 1, 0, 0, 0, 389, 1424, 1, 0, 0, 0, 391, 1428, 1, 0, 0, 0, 393, 1432, 1, 0, 0, 0, 395, 1438, 1, 0, 0, 0, 397, 1444, 1, 0, 0, 0, 399, 1448, 1, 0, 0, 0, 401, 1452, 1, 0, 0, 0, 403, 1456, 1, 0, 0, 0, 405, 1462, 1, 0, 0, 0, 407, 1468, 1, 0, 0, 0, 409, 1474, 1, 0, 0, 0, 411, 412, 7, 0, 0, 0, 412, 413, 7, 1, 0, 0, 413, 414, 7, 2, 0, 0, 414, 415, 7, 2, 0, 0, 415, 416, 7, 3, 0, 0, 416, 417, 7, 4, 0, 0, 417, 418, 7, 5, 0, 0, 418, 419, 1, 0, 0, 0, 419, 420, 6, 0, 0, 0, 420, 16, 1, 0, 0, 0, 421, 422, 7, 0, 0, 0, 422, 423, 7, 6, 0, 0, 423, 424, 7, 7, 0, 0, 424, 425, 7, 8, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 6, 1, 1, 0, 427, 18, 1, 0, 0, 0, 428, 429, 7, 3, 0, 0, 429, 430, 7, 9, 0, 0, 430, 431, 7, 6, 0, 0, 431, 432, 7, 1, 0, 0, 432, 433, 7, 4, 0, 0, 433, 434, 7, 10, 0, 0, 434, 435, 1, 0, 0, 0, 435, 436, 6, 2, 2, 0, 436, 20, 1, 0, 0, 0, 437, 438, 7, 3, 0, 0, 438, 439, 7, 11, 0, 0, 439, 440, 7, 12, 0, 0, 440, 441, 7, 13, 0, 0, 441, 442, 1, 0, 0, 0, 442, 443, 6, 3, 0, 0, 443, 22, 1, 0, 0, 0, 444, 445, 7, 3, 0, 0, 445, 446, 7, 14, 0, 0, 446, 447, 7, 8, 0, 0, 447, 448, 7, 13, 0, 0, 448, 449, 7, 12, 0, 0, 449, 450, 7, 1, 0, 0, 450, 451, 7, 9, 0, 0, 451, 452, 1, 0, 0, 0, 452, 453, 6, 4, 3, 0, 453, 24, 1, 0, 0, 0, 454, 455, 7, 15, 0, 0, 455, 456, 7, 6, 0, 0, 456, 457, 7, 7, 0, 0, 457, 458, 7, 16, 0, 0, 458, 459, 1, 0, 0, 0, 459, 460, 6, 5, 4, 0, 460, 26, 1, 0, 0, 0, 461, 462, 7, 17, 0, 0, 462, 463, 7, 6, 0, 0, 463, 464, 7, 7, 0, 0, 464, 465, 7, 18, 0, 0, 465, 466, 1, 0, 0, 0, 466, 467, 6, 6, 0, 0, 467, 28, 1, 0, 0, 0, 468, 469, 7, 18, 0, 0, 469, 470, 7, 3, 0, 0, 470, 471, 7, 3, 0, 0, 471, 472, 7, 8, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 6, 7, 1, 0, 474, 30, 1, 0, 0, 0, 475, 476, 7, 13, 0, 0, 476, 477, 7, 1, 0, 0, 477, 478, 7, 16, 0, 0, 478, 479, 7, 1, 0, 0, 479, 480, 7, 5, 0, 0, 480, 481, 1, 0, 0, 0, 481, 482, 6, 8, 0, 0, 482, 32, 1, 0, 0, 0, 483, 484, 7, 16, 0, 0, 484, 485, 7, 11, 0, 0, 485, 486, 5, 95, 0, 0, 486, 487, 7, 3, 0, 0, 487, 488, 7, 14, 0, 0, 488, 489, 7, 8, 0, 0, 489, 490, 7, 12, 0, 0, 490, 491, 7, 9, 0, 0, 491, 492, 7, 0, 0, 0, 492, 493, 1, 0, 0, 0, 493, 494, 6, 9, 5, 0, 494, 34, 1, 0, 0, 0, 495, 496, 7, 6, 0, 0, 496, 497, 7, 3, 0, 0, 497, 498, 7, 9, 0, 0, 498, 499, 7, 12, 0, 0, 499, 500, 7, 16, 0, 0, 500, 501, 7, 3, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 6, 10, 6, 0, 503, 36, 1, 0, 0, 0, 504, 505, 7, 6, 0, 0, 505, 506, 7, 7, 0, 0, 506, 507, 7, 19, 0, 0, 507, 508, 1, 0, 0, 0, 508, 509, 6, 11, 0, 0, 509, 38, 1, 0, 0, 0, 510, 511, 7, 2, 0, 0, 511, 512, 7, 10, 0, 0, 512, 513, 7, 7, 0, 0, 513, 514, 7, 19, 0, 0, 514, 515, 1, 0, 0, 0, 515, 516, 6, 12, 7, 0, 516, 40, 1, 0, 0, 0, 517, 518, 7, 2, 0, 0, 518, 519, 7, 7, 0, 0, 519, 520, 7, 6, 0, 0, 520, 521, 7, 5, 0, 0, 521, 522, 1, 0, 0, 0, 522, 523, 6, 13, 0, 0, 523, 42, 1, 0, 0, 0, 524, 525, 7, 2, 0, 0, 525, 526, 7, 5, 0, 0, 526, 527, 7, 12, 0, 0, 527, 528, 7, 5, 0, 0, 528, 529, 7, 2, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 6, 14, 0, 0, 531, 44, 1, 0, 0, 0, 532, 533, 7, 19, 0, 0, 533, 534, 7, 10, 0, 0, 534, 535, 7, 3, 0, 0, 535, 536, 7, 6, 0, 0, 536, 537, 7, 3, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 6, 15, 0, 0, 539, 46, 1, 0, 0, 0, 540, 541, 4, 16, 0, 0, 541, 542, 7, 1, 0, 0, 542, 543, 7, 9, 0, 0, 543, 544, 7, 13, 0, 0, 544, 545, 7, 1, 0, 0, 545, 546, 7, 9, 0, 0, 546, 547, 7, 3, 0, 0, 547, 548, 7, 2, 0, 0, 548, 549, 7, 5, 0, 0, 549, 550, 7, 12, 0, 0, 550, 551, 7, 5, 0, 0, 551, 552, 7, 2, 0, 0, 552, 553, 1, 0, 0, 0, 553, 554, 6, 16, 0, 0, 554, 48, 1, 0, 0, 0, 555, 556, 4, 17, 1, 0, 556, 557, 7, 13, 0, 0, 557, 558, 7, 7, 0, 0, 558, 559, 7, 7, 0, 0, 559, 560, 7, 18, 0, 0, 560, 561, 7, 20, 0, 0, 561, 562, 7, 8, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 6, 17, 8, 0, 564, 50, 1, 0, 0, 0, 565, 566, 4, 18, 2, 0, 566, 567, 7, 16, 0, 0, 567, 568, 7, 3, 0, 0, 568, 569, 7, 5, 0, 0, 569, 570, 7, 6, 0, 0, 570, 571, 7, 1, 0, 0, 571, 572, 7, 4, 0, 0, 572, 573, 7, 2, 0, 0, 573, 574, 1, 0, 0, 0, 574, 575, 6, 18, 9, 0, 575, 52, 1, 0, 0, 0, 576, 578, 8, 21, 0, 0, 577, 576, 1, 0, 0, 0, 578, 579, 1, 0, 0, 0, 579, 577, 1, 0, 0, 0, 579, 580, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 582, 6, 19, 0, 0, 582, 54, 1, 0, 0, 0, 583, 584, 5, 47, 0, 0, 584, 585, 5, 47, 0, 0, 585, 589, 1, 0, 0, 0, 586, 588, 8, 22, 0, 0, 587, 586, 1, 0, 0, 0, 588, 591, 1, 0, 0, 0, 589, 587, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 593, 1, 0, 0, 0, 591, 589, 1, 0, 0, 0, 592, 594, 5, 13, 0, 0, 593, 592, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 596, 1, 0, 0, 0, 595, 597, 5, 10, 0, 0, 596, 595, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 6, 20, 10, 0, 599, 56, 1, 0, 0, 0, 600, 601, 5, 47, 0, 0, 601, 602, 5, 42, 0, 0, 602, 607, 1, 0, 0, 0, 603, 606, 3, 57, 21, 0, 604, 606, 9, 0, 0, 0, 605, 603, 1, 0, 0, 0, 605, 604, 1, 0, 0, 0, 606, 609, 1, 0, 0, 0, 607, 608, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 608, 610, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 610, 611, 5, 42, 0, 0, 611, 612, 5, 47, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 6, 21, 10, 0, 614, 58, 1, 0, 0, 0, 615, 617, 7, 23, 0, 0, 616, 615, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 621, 6, 22, 10, 0, 621, 60, 1, 0, 0, 0, 622, 623, 5, 124, 0, 0, 623, 624, 1, 0, 0, 0, 624, 625, 6, 23, 11, 0, 625, 62, 1, 0, 0, 0, 626, 627, 7, 24, 0, 0, 627, 64, 1, 0, 0, 0, 628, 629, 7, 25, 0, 0, 629, 66, 1, 0, 0, 0, 630, 631, 5, 92, 0, 0, 631, 632, 7, 26, 0, 0, 632, 68, 1, 0, 0, 0, 633, 634, 8, 27, 0, 0, 634, 70, 1, 0, 0, 0, 635, 637, 7, 3, 0, 0, 636, 638, 7, 28, 0, 0, 637, 636, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 640, 1, 0, 0, 0, 639, 641, 3, 63, 24, 0, 640, 639, 1, 0, 0, 0, 641, 642, 1, 0, 0, 0, 642, 640, 1, 0, 0, 0, 642, 643, 1, 0, 0, 0, 643, 72, 1, 0, 0, 0, 644, 645, 5, 64, 0, 0, 645, 74, 1, 0, 0, 0, 646, 647, 5, 96, 0, 0, 647, 76, 1, 0, 0, 0, 648, 652, 8, 29, 0, 0, 649, 650, 5, 96, 0, 0, 650, 652, 5, 96, 0, 0, 651, 648, 1, 0, 0, 0, 651, 649, 1, 0, 0, 0, 652, 78, 1, 0, 0, 0, 653, 654, 5, 95, 0, 0, 654, 80, 1, 0, 0, 0, 655, 659, 3, 65, 25, 0, 656, 659, 3, 63, 24, 0, 657, 659, 3, 79, 32, 0, 658, 655, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 658, 657, 1, 0, 0, 0, 659, 82, 1, 0, 0, 0, 660, 665, 5, 34, 0, 0, 661, 664, 3, 67, 26, 0, 662, 664, 3, 69, 27, 0, 663, 661, 1, 0, 0, 0, 663, 662, 1, 0, 0, 0, 664, 667, 1, 0, 0, 0, 665, 663, 1, 0, 0, 0, 665, 666, 1, 0, 0, 0, 666, 668, 1, 0, 0, 0, 667, 665, 1, 0, 0, 0, 668, 690, 5, 34, 0, 0, 669, 670, 5, 34, 0, 0, 670, 671, 5, 34, 0, 0, 671, 672, 5, 34, 0, 0, 672, 676, 1, 0, 0, 0, 673, 675, 8, 22, 0, 0, 674, 673, 1, 0, 0, 0, 675, 678, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 676, 674, 1, 0, 0, 0, 677, 679, 1, 0, 0, 0, 678, 676, 1, 0, 0, 0, 679, 680, 5, 34, 0, 0, 680, 681, 5, 34, 0, 0, 681, 682, 5, 34, 0, 0, 682, 684, 1, 0, 0, 0, 683, 685, 5, 34, 0, 0, 684, 683, 1, 0, 0, 0, 684, 685, 1, 0, 0, 0, 685, 687, 1, 0, 0, 0, 686, 688, 5, 34, 0, 0, 687, 686, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 690, 1, 0, 0, 0, 689, 660, 1, 0, 0, 0, 689, 669, 1, 0, 0, 0, 690, 84, 1, 0, 0, 0, 691, 693, 3, 63, 24, 0, 692, 691, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 692, 1, 0, 0, 0, 694, 695, 1, 0, 0, 0, 695, 86, 1, 0, 0, 0, 696, 698, 3, 63, 24, 0, 697, 696, 1, 0, 0, 0, 698, 699, 1, 0, 0, 0, 699, 697, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 705, 3, 103, 44, 0, 702, 704, 3, 63, 24, 0, 703, 702, 1, 0, 0, 0, 704, 707, 1, 0, 0, 0, 705, 703, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 739, 1, 0, 0, 0, 707, 705, 1, 0, 0, 0, 708, 710, 3, 103, 44, 0, 709, 711, 3, 63, 24, 0, 710, 709, 1, 0, 0, 0, 711, 712, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 739, 1, 0, 0, 0, 714, 716, 3, 63, 24, 0, 715, 714, 1, 0, 0, 0, 716, 717, 1, 0, 0, 0, 717, 715, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 718, 726, 1, 0, 0, 0, 719, 723, 3, 103, 44, 0, 720, 722, 3, 63, 24, 0, 721, 720, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 727, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 726, 719, 1, 0, 0, 0, 726, 727, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 729, 3, 71, 28, 0, 729, 739, 1, 0, 0, 0, 730, 732, 3, 103, 44, 0, 731, 733, 3, 63, 24, 0, 732, 731, 1, 0, 0, 0, 733, 734, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 734, 735, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 737, 3, 71, 28, 0, 737, 739, 1, 0, 0, 0, 738, 697, 1, 0, 0, 0, 738, 708, 1, 0, 0, 0, 738, 715, 1, 0, 0, 0, 738, 730, 1, 0, 0, 0, 739, 88, 1, 0, 0, 0, 740, 741, 7, 30, 0, 0, 741, 742, 7, 31, 0, 0, 742, 90, 1, 0, 0, 0, 743, 744, 7, 12, 0, 0, 744, 745, 7, 9, 0, 0, 745, 746, 7, 0, 0, 0, 746, 92, 1, 0, 0, 0, 747, 748, 7, 12, 0, 0, 748, 749, 7, 2, 0, 0, 749, 750, 7, 4, 0, 0, 750, 94, 1, 0, 0, 0, 751, 752, 5, 61, 0, 0, 752, 96, 1, 0, 0, 0, 753, 754, 5, 58, 0, 0, 754, 755, 5, 58, 0, 0, 755, 98, 1, 0, 0, 0, 756, 757, 5, 44, 0, 0, 757, 100, 1, 0, 0, 0, 758, 759, 7, 0, 0, 0, 759, 760, 7, 3, 0, 0, 760, 761, 7, 2, 0, 0, 761, 762, 7, 4, 0, 0, 762, 102, 1, 0, 0, 0, 763, 764, 5, 46, 0, 0, 764, 104, 1, 0, 0, 0, 765, 766, 7, 15, 0, 0, 766, 767, 7, 12, 0, 0, 767, 768, 7, 13, 0, 0, 768, 769, 7, 2, 0, 0, 769, 770, 7, 3, 0, 0, 770, 106, 1, 0, 0, 0, 771, 772, 7, 15, 0, 0, 772, 773, 7, 1, 0, 0, 773, 774, 7, 6, 0, 0, 774, 775, 7, 2, 0, 0, 775, 776, 7, 5, 0, 0, 776, 108, 1, 0, 0, 0, 777, 778, 7, 1, 0, 0, 778, 779, 7, 9, 0, 0, 779, 110, 1, 0, 0, 0, 780, 781, 7, 1, 0, 0, 781, 782, 7, 2, 0, 0, 782, 112, 1, 0, 0, 0, 783, 784, 7, 13, 0, 0, 784, 785, 7, 12, 0, 0, 785, 786, 7, 2, 0, 0, 786, 787, 7, 5, 0, 0, 787, 114, 1, 0, 0, 0, 788, 789, 7, 13, 0, 0, 789, 790, 7, 1, 0, 0, 790, 791, 7, 18, 0, 0, 791, 792, 7, 3, 0, 0, 792, 116, 1, 0, 0, 0, 793, 794, 5, 40, 0, 0, 794, 118, 1, 0, 0, 0, 795, 796, 7, 9, 0, 0, 796, 797, 7, 7, 0, 0, 797, 798, 7, 5, 0, 0, 798, 120, 1, 0, 0, 0, 799, 800, 7, 9, 0, 0, 800, 801, 7, 20, 0, 0, 801, 802, 7, 13, 0, 0, 802, 803, 7, 13, 0, 0, 803, 122, 1, 0, 0, 0, 804, 805, 7, 9, 0, 0, 805, 806, 7, 20, 0, 0, 806, 807, 7, 13, 0, 0, 807, 808, 7, 13, 0, 0, 808, 809, 7, 2, 0, 0, 809, 124, 1, 0, 0, 0, 810, 811, 7, 7, 0, 0, 811, 812, 7, 6, 0, 0, 812, 126, 1, 0, 0, 0, 813, 814, 5, 63, 0, 0, 814, 128, 1, 0, 0, 0, 815, 816, 7, 6, 0, 0, 816, 817, 7, 13, 0, 0, 817, 818, 7, 1, 0, 0, 818, 819, 7, 18, 0, 0, 819, 820, 7, 3, 0, 0, 820, 130, 1, 0, 0, 0, 821, 822, 5, 41, 0, 0, 822, 132, 1, 0, 0, 0, 823, 824, 7, 5, 0, 0, 824, 825, 7, 6, 0, 0, 825, 826, 7, 20, 0, 0, 826, 827, 7, 3, 0, 0, 827, 134, 1, 0, 0, 0, 828, 829, 5, 61, 0, 0, 829, 830, 5, 61, 0, 0, 830, 136, 1, 0, 0, 0, 831, 832, 5, 61, 0, 0, 832, 833, 5, 126, 0, 0, 833, 138, 1, 0, 0, 0, 834, 835, 5, 33, 0, 0, 835, 836, 5, 61, 0, 0, 836, 140, 1, 0, 0, 0, 837, 838, 5, 60, 0, 0, 838, 142, 1, 0, 0, 0, 839, 840, 5, 60, 0, 0, 840, 841, 5, 61, 0, 0, 841, 144, 1, 0, 0, 0, 842, 843, 5, 62, 0, 0, 843, 146, 1, 0, 0, 0, 844, 845, 5, 62, 0, 0, 845, 846, 5, 61, 0, 0, 846, 148, 1, 0, 0, 0, 847, 848, 5, 43, 0, 0, 848, 150, 1, 0, 0, 0, 849, 850, 5, 45, 0, 0, 850, 152, 1, 0, 0, 0, 851, 852, 5, 42, 0, 0, 852, 154, 1, 0, 0, 0, 853, 854, 5, 47, 0, 0, 854, 156, 1, 0, 0, 0, 855, 856, 5, 37, 0, 0, 856, 158, 1, 0, 0, 0, 857, 858, 7, 16, 0, 0, 858, 859, 7, 12, 0, 0, 859, 860, 7, 5, 0, 0, 860, 861, 7, 4, 0, 0, 861, 862, 7, 10, 0, 0, 862, 160, 1, 0, 0, 0, 863, 864, 3, 45, 15, 0, 864, 865, 1, 0, 0, 0, 865, 866, 6, 73, 12, 0, 866, 162, 1, 0, 0, 0, 867, 870, 3, 127, 56, 0, 868, 871, 3, 65, 25, 0, 869, 871, 3, 79, 32, 0, 870, 868, 1, 0, 0, 0, 870, 869, 1, 0, 0, 0, 871, 875, 1, 0, 0, 0, 872, 874, 3, 81, 33, 0, 873, 872, 1, 0, 0, 0, 874, 877, 1, 0, 0, 0, 875, 873, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 885, 1, 0, 0, 0, 877, 875, 1, 0, 0, 0, 878, 880, 3, 127, 56, 0, 879, 881, 3, 63, 24, 0, 880, 879, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 880, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 885, 1, 0, 0, 0, 884, 867, 1, 0, 0, 0, 884, 878, 1, 0, 0, 0, 885, 164, 1, 0, 0, 0, 886, 887, 5, 91, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 6, 75, 0, 0, 889, 890, 6, 75, 0, 0, 890, 166, 1, 0, 0, 0, 891, 892, 5, 93, 0, 0, 892, 893, 1, 0, 0, 0, 893, 894, 6, 76, 11, 0, 894, 895, 6, 76, 11, 0, 895, 168, 1, 0, 0, 0, 896, 900, 3, 65, 25, 0, 897, 899, 3, 81, 33, 0, 898, 897, 1, 0, 0, 0, 899, 902, 1, 0, 0, 0, 900, 898, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 913, 1, 0, 0, 0, 902, 900, 1, 0, 0, 0, 903, 906, 3, 79, 32, 0, 904, 906, 3, 73, 29, 0, 905, 903, 1, 0, 0, 0, 905, 904, 1, 0, 0, 0, 906, 908, 1, 0, 0, 0, 907, 909, 3, 81, 33, 0, 908, 907, 1, 0, 0, 0, 909, 910, 1, 0, 0, 0, 910, 908, 1, 0, 0, 0, 910, 911, 1, 0, 0, 0, 911, 913, 1, 0, 0, 0, 912, 896, 1, 0, 0, 0, 912, 905, 1, 0, 0, 0, 913, 170, 1, 0, 0, 0, 914, 916, 3, 75, 30, 0, 915, 917, 3, 77, 31, 0, 916, 915, 1, 0, 0, 0, 917, 918, 1, 0, 0, 0, 918, 916, 1, 0, 0, 0, 918, 919, 1, 0, 0, 0, 919, 920, 1, 0, 0, 0, 920, 921, 3, 75, 30, 0, 921, 172, 1, 0, 0, 0, 922, 923, 3, 171, 78, 0, 923, 174, 1, 0, 0, 0, 924, 925, 3, 55, 20, 0, 925, 926, 1, 0, 0, 0, 926, 927, 6, 80, 10, 0, 927, 176, 1, 0, 0, 0, 928, 929, 3, 57, 21, 0, 929, 930, 1, 0, 0, 0, 930, 931, 6, 81, 10, 0, 931, 178, 1, 0, 0, 0, 932, 933, 3, 59, 22, 0, 933, 934, 1, 0, 0, 0, 934, 935, 6, 82, 10, 0, 935, 180, 1, 0, 0, 0, 936, 937, 3, 165, 75, 0, 937, 938, 1, 0, 0, 0, 938, 939, 6, 83, 13, 0, 939, 940, 6, 83, 14, 0, 940, 182, 1, 0, 0, 0, 941, 942, 3, 61, 23, 0, 942, 943, 1, 0, 0, 0, 943, 944, 6, 84, 15, 0, 944, 945, 6, 84, 11, 0, 945, 184, 1, 0, 0, 0, 946, 947, 3, 59, 22, 0, 947, 948, 1, 0, 0, 0, 948, 949, 6, 85, 10, 0, 949, 186, 1, 0, 0, 0, 950, 951, 3, 55, 20, 0, 951, 952, 1, 0, 0, 0, 952, 953, 6, 86, 10, 0, 953, 188, 1, 0, 0, 0, 954, 955, 3, 57, 21, 0, 955, 956, 1, 0, 0, 0, 956, 957, 6, 87, 10, 0, 957, 190, 1, 0, 0, 0, 958, 959, 3, 61, 23, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 88, 15, 0, 961, 962, 6, 88, 11, 0, 962, 192, 1, 0, 0, 0, 963, 964, 3, 165, 75, 0, 964, 965, 1, 0, 0, 0, 965, 966, 6, 89, 13, 0, 966, 194, 1, 0, 0, 0, 967, 968, 3, 167, 76, 0, 968, 969, 1, 0, 0, 0, 969, 970, 6, 90, 16, 0, 970, 196, 1, 0, 0, 0, 971, 972, 3, 337, 161, 0, 972, 973, 1, 0, 0, 0, 973, 974, 6, 91, 17, 0, 974, 198, 1, 0, 0, 0, 975, 976, 3, 99, 42, 0, 976, 977, 1, 0, 0, 0, 977, 978, 6, 92, 18, 0, 978, 200, 1, 0, 0, 0, 979, 980, 3, 95, 40, 0, 980, 981, 1, 0, 0, 0, 981, 982, 6, 93, 19, 0, 982, 202, 1, 0, 0, 0, 983, 984, 7, 16, 0, 0, 984, 985, 7, 3, 0, 0, 985, 986, 7, 5, 0, 0, 986, 987, 7, 12, 0, 0, 987, 988, 7, 0, 0, 0, 988, 989, 7, 12, 0, 0, 989, 990, 7, 5, 0, 0, 990, 991, 7, 12, 0, 0, 991, 204, 1, 0, 0, 0, 992, 996, 8, 32, 0, 0, 993, 994, 5, 47, 0, 0, 994, 996, 8, 33, 0, 0, 995, 992, 1, 0, 0, 0, 995, 993, 1, 0, 0, 0, 996, 206, 1, 0, 0, 0, 997, 999, 3, 205, 95, 0, 998, 997, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 998, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 208, 1, 0, 0, 0, 1002, 1003, 3, 207, 96, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 6, 97, 20, 0, 1005, 210, 1, 0, 0, 0, 1006, 1007, 3, 83, 34, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1009, 6, 98, 21, 0, 1009, 212, 1, 0, 0, 0, 1010, 1011, 3, 55, 20, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 6, 99, 10, 0, 1013, 214, 1, 0, 0, 0, 1014, 1015, 3, 57, 21, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1017, 6, 100, 10, 0, 1017, 216, 1, 0, 0, 0, 1018, 1019, 3, 59, 22, 0, 1019, 1020, 1, 0, 0, 0, 1020, 1021, 6, 101, 10, 0, 1021, 218, 1, 0, 0, 0, 1022, 1023, 3, 61, 23, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 6, 102, 15, 0, 1025, 1026, 6, 102, 11, 0, 1026, 220, 1, 0, 0, 0, 1027, 1028, 3, 103, 44, 0, 1028, 1029, 1, 0, 0, 0, 1029, 1030, 6, 103, 22, 0, 1030, 222, 1, 0, 0, 0, 1031, 1032, 3, 99, 42, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 6, 104, 18, 0, 1034, 224, 1, 0, 0, 0, 1035, 1036, 4, 105, 3, 0, 1036, 1037, 3, 127, 56, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1039, 6, 105, 23, 0, 1039, 226, 1, 0, 0, 0, 1040, 1041, 4, 106, 4, 0, 1041, 1042, 3, 163, 74, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1044, 6, 106, 24, 0, 1044, 228, 1, 0, 0, 0, 1045, 1050, 3, 65, 25, 0, 1046, 1050, 3, 63, 24, 0, 1047, 1050, 3, 79, 32, 0, 1048, 1050, 3, 153, 69, 0, 1049, 1045, 1, 0, 0, 0, 1049, 1046, 1, 0, 0, 0, 1049, 1047, 1, 0, 0, 0, 1049, 1048, 1, 0, 0, 0, 1050, 230, 1, 0, 0, 0, 1051, 1054, 3, 65, 25, 0, 1052, 1054, 3, 153, 69, 0, 1053, 1051, 1, 0, 0, 0, 1053, 1052, 1, 0, 0, 0, 1054, 1058, 1, 0, 0, 0, 1055, 1057, 3, 229, 107, 0, 1056, 1055, 1, 0, 0, 0, 1057, 1060, 1, 0, 0, 0, 1058, 1056, 1, 0, 0, 0, 1058, 1059, 1, 0, 0, 0, 1059, 1071, 1, 0, 0, 0, 1060, 1058, 1, 0, 0, 0, 1061, 1064, 3, 79, 32, 0, 1062, 1064, 3, 73, 29, 0, 1063, 1061, 1, 0, 0, 0, 1063, 1062, 1, 0, 0, 0, 1064, 1066, 1, 0, 0, 0, 1065, 1067, 3, 229, 107, 0, 1066, 1065, 1, 0, 0, 0, 1067, 1068, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1071, 1, 0, 0, 0, 1070, 1053, 1, 0, 0, 0, 1070, 1063, 1, 0, 0, 0, 1071, 232, 1, 0, 0, 0, 1072, 1075, 3, 231, 108, 0, 1073, 1075, 3, 171, 78, 0, 1074, 1072, 1, 0, 0, 0, 1074, 1073, 1, 0, 0, 0, 1075, 1076, 1, 0, 0, 0, 1076, 1074, 1, 0, 0, 0, 1076, 1077, 1, 0, 0, 0, 1077, 234, 1, 0, 0, 0, 1078, 1079, 3, 55, 20, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1081, 6, 110, 10, 0, 1081, 236, 1, 0, 0, 0, 1082, 1083, 3, 57, 21, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1085, 6, 111, 10, 0, 1085, 238, 1, 0, 0, 0, 1086, 1087, 3, 59, 22, 0, 1087, 1088, 1, 0, 0, 0, 1088, 1089, 6, 112, 10, 0, 1089, 240, 1, 0, 0, 0, 1090, 1091, 3, 61, 23, 0, 1091, 1092, 1, 0, 0, 0, 1092, 1093, 6, 113, 15, 0, 1093, 1094, 6, 113, 11, 0, 1094, 242, 1, 0, 0, 0, 1095, 1096, 3, 95, 40, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 6, 114, 19, 0, 1098, 244, 1, 0, 0, 0, 1099, 1100, 3, 99, 42, 0, 1100, 1101, 1, 0, 0, 0, 1101, 1102, 6, 115, 18, 0, 1102, 246, 1, 0, 0, 0, 1103, 1104, 3, 103, 44, 0, 1104, 1105, 1, 0, 0, 0, 1105, 1106, 6, 116, 22, 0, 1106, 248, 1, 0, 0, 0, 1107, 1108, 4, 117, 5, 0, 1108, 1109, 3, 127, 56, 0, 1109, 1110, 1, 0, 0, 0, 1110, 1111, 6, 117, 23, 0, 1111, 250, 1, 0, 0, 0, 1112, 1113, 4, 118, 6, 0, 1113, 1114, 3, 163, 74, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 6, 118, 24, 0, 1116, 252, 1, 0, 0, 0, 1117, 1118, 7, 12, 0, 0, 1118, 1119, 7, 2, 0, 0, 1119, 254, 1, 0, 0, 0, 1120, 1121, 3, 233, 109, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1123, 6, 120, 25, 0, 1123, 256, 1, 0, 0, 0, 1124, 1125, 3, 55, 20, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1127, 6, 121, 10, 0, 1127, 258, 1, 0, 0, 0, 1128, 1129, 3, 57, 21, 0, 1129, 1130, 1, 0, 0, 0, 1130, 1131, 6, 122, 10, 0, 1131, 260, 1, 0, 0, 0, 1132, 1133, 3, 59, 22, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 6, 123, 10, 0, 1135, 262, 1, 0, 0, 0, 1136, 1137, 3, 61, 23, 0, 1137, 1138, 1, 0, 0, 0, 1138, 1139, 6, 124, 15, 0, 1139, 1140, 6, 124, 11, 0, 1140, 264, 1, 0, 0, 0, 1141, 1142, 3, 165, 75, 0, 1142, 1143, 1, 0, 0, 0, 1143, 1144, 6, 125, 13, 0, 1144, 1145, 6, 125, 26, 0, 1145, 266, 1, 0, 0, 0, 1146, 1147, 7, 7, 0, 0, 1147, 1148, 7, 9, 0, 0, 1148, 1149, 1, 0, 0, 0, 1149, 1150, 6, 126, 27, 0, 1150, 268, 1, 0, 0, 0, 1151, 1152, 7, 19, 0, 0, 1152, 1153, 7, 1, 0, 0, 1153, 1154, 7, 5, 0, 0, 1154, 1155, 7, 10, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 6, 127, 27, 0, 1157, 270, 1, 0, 0, 0, 1158, 1159, 8, 34, 0, 0, 1159, 272, 1, 0, 0, 0, 1160, 1162, 3, 271, 128, 0, 1161, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1161, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 1, 0, 0, 0, 1165, 1166, 3, 337, 161, 0, 1166, 1168, 1, 0, 0, 0, 1167, 1161, 1, 0, 0, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1170, 1, 0, 0, 0, 1169, 1171, 3, 271, 128, 0, 1170, 1169, 1, 0, 0, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1170, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 274, 1, 0, 0, 0, 1174, 1175, 3, 273, 129, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 6, 130, 28, 0, 1177, 276, 1, 0, 0, 0, 1178, 1179, 3, 55, 20, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 6, 131, 10, 0, 1181, 278, 1, 0, 0, 0, 1182, 1183, 3, 57, 21, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1185, 6, 132, 10, 0, 1185, 280, 1, 0, 0, 0, 1186, 1187, 3, 59, 22, 0, 1187, 1188, 1, 0, 0, 0, 1188, 1189, 6, 133, 10, 0, 1189, 282, 1, 0, 0, 0, 1190, 1191, 3, 61, 23, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1193, 6, 134, 15, 0, 1193, 1194, 6, 134, 11, 0, 1194, 1195, 6, 134, 11, 0, 1195, 284, 1, 0, 0, 0, 1196, 1197, 3, 95, 40, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1199, 6, 135, 19, 0, 1199, 286, 1, 0, 0, 0, 1200, 1201, 3, 99, 42, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 6, 136, 18, 0, 1203, 288, 1, 0, 0, 0, 1204, 1205, 3, 103, 44, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1207, 6, 137, 22, 0, 1207, 290, 1, 0, 0, 0, 1208, 1209, 3, 269, 127, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 6, 138, 29, 0, 1211, 292, 1, 0, 0, 0, 1212, 1213, 3, 233, 109, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1215, 6, 139, 25, 0, 1215, 294, 1, 0, 0, 0, 1216, 1217, 3, 173, 79, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1219, 6, 140, 30, 0, 1219, 296, 1, 0, 0, 0, 1220, 1221, 4, 141, 7, 0, 1221, 1222, 3, 127, 56, 0, 1222, 1223, 1, 0, 0, 0, 1223, 1224, 6, 141, 23, 0, 1224, 298, 1, 0, 0, 0, 1225, 1226, 4, 142, 8, 0, 1226, 1227, 3, 163, 74, 0, 1227, 1228, 1, 0, 0, 0, 1228, 1229, 6, 142, 24, 0, 1229, 300, 1, 0, 0, 0, 1230, 1231, 3, 55, 20, 0, 1231, 1232, 1, 0, 0, 0, 1232, 1233, 6, 143, 10, 0, 1233, 302, 1, 0, 0, 0, 1234, 1235, 3, 57, 21, 0, 1235, 1236, 1, 0, 0, 0, 1236, 1237, 6, 144, 10, 0, 1237, 304, 1, 0, 0, 0, 1238, 1239, 3, 59, 22, 0, 1239, 1240, 1, 0, 0, 0, 1240, 1241, 6, 145, 10, 0, 1241, 306, 1, 0, 0, 0, 1242, 1243, 3, 61, 23, 0, 1243, 1244, 1, 0, 0, 0, 1244, 1245, 6, 146, 15, 0, 1245, 1246, 6, 146, 11, 0, 1246, 308, 1, 0, 0, 0, 1247, 1248, 3, 103, 44, 0, 1248, 1249, 1, 0, 0, 0, 1249, 1250, 6, 147, 22, 0, 1250, 310, 1, 0, 0, 0, 1251, 1252, 4, 148, 9, 0, 1252, 1253, 3, 127, 56, 0, 1253, 1254, 1, 0, 0, 0, 1254, 1255, 6, 148, 23, 0, 1255, 312, 1, 0, 0, 0, 1256, 1257, 4, 149, 10, 0, 1257, 1258, 3, 163, 74, 0, 1258, 1259, 1, 0, 0, 0, 1259, 1260, 6, 149, 24, 0, 1260, 314, 1, 0, 0, 0, 1261, 1262, 3, 173, 79, 0, 1262, 1263, 1, 0, 0, 0, 1263, 1264, 6, 150, 30, 0, 1264, 316, 1, 0, 0, 0, 1265, 1266, 3, 169, 77, 0, 1266, 1267, 1, 0, 0, 0, 1267, 1268, 6, 151, 31, 0, 1268, 318, 1, 0, 0, 0, 1269, 1270, 3, 55, 20, 0, 1270, 1271, 1, 0, 0, 0, 1271, 1272, 6, 152, 10, 0, 1272, 320, 1, 0, 0, 0, 1273, 1274, 3, 57, 21, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1276, 6, 153, 10, 0, 1276, 322, 1, 0, 0, 0, 1277, 1278, 3, 59, 22, 0, 1278, 1279, 1, 0, 0, 0, 1279, 1280, 6, 154, 10, 0, 1280, 324, 1, 0, 0, 0, 1281, 1282, 3, 61, 23, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 6, 155, 15, 0, 1284, 1285, 6, 155, 11, 0, 1285, 326, 1, 0, 0, 0, 1286, 1287, 7, 1, 0, 0, 1287, 1288, 7, 9, 0, 0, 1288, 1289, 7, 15, 0, 0, 1289, 1290, 7, 7, 0, 0, 1290, 328, 1, 0, 0, 0, 1291, 1292, 3, 55, 20, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1294, 6, 157, 10, 0, 1294, 330, 1, 0, 0, 0, 1295, 1296, 3, 57, 21, 0, 1296, 1297, 1, 0, 0, 0, 1297, 1298, 6, 158, 10, 0, 1298, 332, 1, 0, 0, 0, 1299, 1300, 3, 59, 22, 0, 1300, 1301, 1, 0, 0, 0, 1301, 1302, 6, 159, 10, 0, 1302, 334, 1, 0, 0, 0, 1303, 1304, 3, 167, 76, 0, 1304, 1305, 1, 0, 0, 0, 1305, 1306, 6, 160, 16, 0, 1306, 1307, 6, 160, 11, 0, 1307, 336, 1, 0, 0, 0, 1308, 1309, 5, 58, 0, 0, 1309, 338, 1, 0, 0, 0, 1310, 1316, 3, 73, 29, 0, 1311, 1316, 3, 63, 24, 0, 1312, 1316, 3, 103, 44, 0, 1313, 1316, 3, 65, 25, 0, 1314, 1316, 3, 79, 32, 0, 1315, 1310, 1, 0, 0, 0, 1315, 1311, 1, 0, 0, 0, 1315, 1312, 1, 0, 0, 0, 1315, 1313, 1, 0, 0, 0, 1315, 1314, 1, 0, 0, 0, 1316, 1317, 1, 0, 0, 0, 1317, 1315, 1, 0, 0, 0, 1317, 1318, 1, 0, 0, 0, 1318, 340, 1, 0, 0, 0, 1319, 1320, 3, 55, 20, 0, 1320, 1321, 1, 0, 0, 0, 1321, 1322, 6, 163, 10, 0, 1322, 342, 1, 0, 0, 0, 1323, 1324, 3, 57, 21, 0, 1324, 1325, 1, 0, 0, 0, 1325, 1326, 6, 164, 10, 0, 1326, 344, 1, 0, 0, 0, 1327, 1328, 3, 59, 22, 0, 1328, 1329, 1, 0, 0, 0, 1329, 1330, 6, 165, 10, 0, 1330, 346, 1, 0, 0, 0, 1331, 1332, 3, 61, 23, 0, 1332, 1333, 1, 0, 0, 0, 1333, 1334, 6, 166, 15, 0, 1334, 1335, 6, 166, 11, 0, 1335, 348, 1, 0, 0, 0, 1336, 1337, 3, 337, 161, 0, 1337, 1338, 1, 0, 0, 0, 1338, 1339, 6, 167, 17, 0, 1339, 350, 1, 0, 0, 0, 1340, 1341, 3, 99, 42, 0, 1341, 1342, 1, 0, 0, 0, 1342, 1343, 6, 168, 18, 0, 1343, 352, 1, 0, 0, 0, 1344, 1345, 3, 103, 44, 0, 1345, 1346, 1, 0, 0, 0, 1346, 1347, 6, 169, 22, 0, 1347, 354, 1, 0, 0, 0, 1348, 1349, 3, 267, 126, 0, 1349, 1350, 1, 0, 0, 0, 1350, 1351, 6, 170, 32, 0, 1351, 1352, 6, 170, 33, 0, 1352, 356, 1, 0, 0, 0, 1353, 1354, 3, 207, 96, 0, 1354, 1355, 1, 0, 0, 0, 1355, 1356, 6, 171, 20, 0, 1356, 358, 1, 0, 0, 0, 1357, 1358, 3, 83, 34, 0, 1358, 1359, 1, 0, 0, 0, 1359, 1360, 6, 172, 21, 0, 1360, 360, 1, 0, 0, 0, 1361, 1362, 3, 55, 20, 0, 1362, 1363, 1, 0, 0, 0, 1363, 1364, 6, 173, 10, 0, 1364, 362, 1, 0, 0, 0, 1365, 1366, 3, 57, 21, 0, 1366, 1367, 1, 0, 0, 0, 1367, 1368, 6, 174, 10, 0, 1368, 364, 1, 0, 0, 0, 1369, 1370, 3, 59, 22, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1372, 6, 175, 10, 0, 1372, 366, 1, 0, 0, 0, 1373, 1374, 3, 61, 23, 0, 1374, 1375, 1, 0, 0, 0, 1375, 1376, 6, 176, 15, 0, 1376, 1377, 6, 176, 11, 0, 1377, 1378, 6, 176, 11, 0, 1378, 368, 1, 0, 0, 0, 1379, 1380, 3, 99, 42, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1382, 6, 177, 18, 0, 1382, 370, 1, 0, 0, 0, 1383, 1384, 3, 103, 44, 0, 1384, 1385, 1, 0, 0, 0, 1385, 1386, 6, 178, 22, 0, 1386, 372, 1, 0, 0, 0, 1387, 1388, 3, 233, 109, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1390, 6, 179, 25, 0, 1390, 374, 1, 0, 0, 0, 1391, 1392, 3, 55, 20, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1394, 6, 180, 10, 0, 1394, 376, 1, 0, 0, 0, 1395, 1396, 3, 57, 21, 0, 1396, 1397, 1, 0, 0, 0, 1397, 1398, 6, 181, 10, 0, 1398, 378, 1, 0, 0, 0, 1399, 1400, 3, 59, 22, 0, 1400, 1401, 1, 0, 0, 0, 1401, 1402, 6, 182, 10, 0, 1402, 380, 1, 0, 0, 0, 1403, 1404, 3, 61, 23, 0, 1404, 1405, 1, 0, 0, 0, 1405, 1406, 6, 183, 15, 0, 1406, 1407, 6, 183, 11, 0, 1407, 382, 1, 0, 0, 0, 1408, 1409, 3, 207, 96, 0, 1409, 1410, 1, 0, 0, 0, 1410, 1411, 6, 184, 20, 0, 1411, 1412, 6, 184, 11, 0, 1412, 1413, 6, 184, 34, 0, 1413, 384, 1, 0, 0, 0, 1414, 1415, 3, 83, 34, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 6, 185, 21, 0, 1417, 1418, 6, 185, 11, 0, 1418, 1419, 6, 185, 34, 0, 1419, 386, 1, 0, 0, 0, 1420, 1421, 3, 55, 20, 0, 1421, 1422, 1, 0, 0, 0, 1422, 1423, 6, 186, 10, 0, 1423, 388, 1, 0, 0, 0, 1424, 1425, 3, 57, 21, 0, 1425, 1426, 1, 0, 0, 0, 1426, 1427, 6, 187, 10, 0, 1427, 390, 1, 0, 0, 0, 1428, 1429, 3, 59, 22, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1431, 6, 188, 10, 0, 1431, 392, 1, 0, 0, 0, 1432, 1433, 3, 337, 161, 0, 1433, 1434, 1, 0, 0, 0, 1434, 1435, 6, 189, 17, 0, 1435, 1436, 6, 189, 11, 0, 1436, 1437, 6, 189, 9, 0, 1437, 394, 1, 0, 0, 0, 1438, 1439, 3, 99, 42, 0, 1439, 1440, 1, 0, 0, 0, 1440, 1441, 6, 190, 18, 0, 1441, 1442, 6, 190, 11, 0, 1442, 1443, 6, 190, 9, 0, 1443, 396, 1, 0, 0, 0, 1444, 1445, 3, 55, 20, 0, 1445, 1446, 1, 0, 0, 0, 1446, 1447, 6, 191, 10, 0, 1447, 398, 1, 0, 0, 0, 1448, 1449, 3, 57, 21, 0, 1449, 1450, 1, 0, 0, 0, 1450, 1451, 6, 192, 10, 0, 1451, 400, 1, 0, 0, 0, 1452, 1453, 3, 59, 22, 0, 1453, 1454, 1, 0, 0, 0, 1454, 1455, 6, 193, 10, 0, 1455, 402, 1, 0, 0, 0, 1456, 1457, 3, 173, 79, 0, 1457, 1458, 1, 0, 0, 0, 1458, 1459, 6, 194, 11, 0, 1459, 1460, 6, 194, 0, 0, 1460, 1461, 6, 194, 30, 0, 1461, 404, 1, 0, 0, 0, 1462, 1463, 3, 169, 77, 0, 1463, 1464, 1, 0, 0, 0, 1464, 1465, 6, 195, 11, 0, 1465, 1466, 6, 195, 0, 0, 1466, 1467, 6, 195, 31, 0, 1467, 406, 1, 0, 0, 0, 1468, 1469, 3, 89, 37, 0, 1469, 1470, 1, 0, 0, 0, 1470, 1471, 6, 196, 11, 0, 1471, 1472, 6, 196, 0, 0, 1472, 1473, 6, 196, 35, 0, 1473, 408, 1, 0, 0, 0, 1474, 1475, 3, 61, 23, 0, 1475, 1476, 1, 0, 0, 0, 1476, 1477, 6, 197, 15, 0, 1477, 1478, 6, 197, 11, 0, 1478, 410, 1, 0, 0, 0, 65, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 579, 589, 593, 596, 605, 607, 618, 637, 642, 651, 658, 663, 665, 676, 684, 687, 689, 694, 699, 705, 712, 717, 723, 726, 734, 738, 870, 875, 882, 884, 900, 905, 910, 912, 918, 995, 1000, 1049, 1053, 1058, 1063, 1068, 1070, 1074, 1076, 1163, 1167, 1172, 1315, 1317, 36, 5, 1, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 5, 3, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 5, 11, 0, 5, 13, 0, 0, 1, 0, 4, 0, 0, 7, 16, 0, 7, 65, 0, 5, 0, 0, 7, 24, 0, 7, 66, 0, 7, 104, 0, 7, 33, 0, 7, 31, 0, 7, 76, 0, 7, 25, 0, 7, 35, 0, 7, 47, 0, 7, 64, 0, 7, 80, 0, 5, 10, 0, 5, 7, 0, 7, 90, 0, 7, 89, 0, 7, 68, 0, 7, 67, 0, 7, 88, 0, 5, 12, 0, 5, 14, 0, 7, 28, 0] \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens b/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens index 4fd37ab9900f2..4d1f426289149 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens @@ -16,51 +16,51 @@ STATS=15 WHERE=16 DEV_INLINESTATS=17 DEV_LOOKUP=18 -DEV_MATCH=19 -DEV_METRICS=20 -UNKNOWN_CMD=21 -LINE_COMMENT=22 -MULTILINE_COMMENT=23 -WS=24 -PIPE=25 -QUOTED_STRING=26 -INTEGER_LITERAL=27 -DECIMAL_LITERAL=28 -BY=29 -AND=30 -ASC=31 -ASSIGN=32 -CAST_OP=33 -COMMA=34 -DESC=35 -DOT=36 -FALSE=37 -FIRST=38 -IN=39 -IS=40 -LAST=41 -LIKE=42 -LP=43 -NOT=44 -NULL=45 -NULLS=46 -OR=47 -PARAM=48 -RLIKE=49 -RP=50 -TRUE=51 -EQ=52 -CIEQ=53 -NEQ=54 -LT=55 -LTE=56 -GT=57 -GTE=58 -PLUS=59 -MINUS=60 -ASTERISK=61 -SLASH=62 -PERCENT=63 +DEV_METRICS=19 +UNKNOWN_CMD=20 +LINE_COMMENT=21 +MULTILINE_COMMENT=22 +WS=23 +PIPE=24 +QUOTED_STRING=25 +INTEGER_LITERAL=26 +DECIMAL_LITERAL=27 +BY=28 +AND=29 +ASC=30 +ASSIGN=31 +CAST_OP=32 +COMMA=33 +DESC=34 +DOT=35 +FALSE=36 +FIRST=37 +IN=38 +IS=39 +LAST=40 +LIKE=41 +LP=42 +NOT=43 +NULL=44 +NULLS=45 +OR=46 +PARAM=47 +RLIKE=48 +RP=49 +TRUE=50 +EQ=51 +CIEQ=52 +NEQ=53 +LT=54 +LTE=55 +GT=56 +GTE=57 +PLUS=58 +MINUS=59 +ASTERISK=60 +SLASH=61 +PERCENT=62 +MATCH=63 NAMED_OR_POSITIONAL_PARAM=64 OPENING_BRACKET=65 CLOSING_BRACKET=66 @@ -134,42 +134,43 @@ CLOSING_METRICS_WS=120 'sort'=14 'stats'=15 'where'=16 -'|'=25 -'by'=29 -'and'=30 -'asc'=31 -'='=32 -'::'=33 -','=34 -'desc'=35 -'.'=36 -'false'=37 -'first'=38 -'in'=39 -'is'=40 -'last'=41 -'like'=42 -'('=43 -'not'=44 -'null'=45 -'nulls'=46 -'or'=47 -'?'=48 -'rlike'=49 -')'=50 -'true'=51 -'=='=52 -'=~'=53 -'!='=54 -'<'=55 -'<='=56 -'>'=57 -'>='=58 -'+'=59 -'-'=60 -'*'=61 -'/'=62 -'%'=63 +'|'=24 +'by'=28 +'and'=29 +'asc'=30 +'='=31 +'::'=32 +','=33 +'desc'=34 +'.'=35 +'false'=36 +'first'=37 +'in'=38 +'is'=39 +'last'=40 +'like'=41 +'('=42 +'not'=43 +'null'=44 +'nulls'=45 +'or'=46 +'?'=47 +'rlike'=48 +')'=49 +'true'=50 +'=='=51 +'=~'=52 +'!='=53 +'<'=54 +'<='=55 +'>'=56 +'>='=57 +'+'=58 +'-'=59 +'*'=60 +'/'=61 +'%'=62 +'match'=63 ']'=66 'metadata'=75 'as'=84 diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.ts b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts index bbd8286b61d71..589148bf08c7c 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts @@ -41,51 +41,51 @@ export default class esql_lexer extends lexer_config { public static readonly WHERE = 16; public static readonly DEV_INLINESTATS = 17; public static readonly DEV_LOOKUP = 18; - public static readonly DEV_MATCH = 19; - public static readonly DEV_METRICS = 20; - public static readonly UNKNOWN_CMD = 21; - public static readonly LINE_COMMENT = 22; - public static readonly MULTILINE_COMMENT = 23; - public static readonly WS = 24; - public static readonly PIPE = 25; - public static readonly QUOTED_STRING = 26; - public static readonly INTEGER_LITERAL = 27; - public static readonly DECIMAL_LITERAL = 28; - public static readonly BY = 29; - public static readonly AND = 30; - public static readonly ASC = 31; - public static readonly ASSIGN = 32; - public static readonly CAST_OP = 33; - public static readonly COMMA = 34; - public static readonly DESC = 35; - public static readonly DOT = 36; - public static readonly FALSE = 37; - public static readonly FIRST = 38; - public static readonly IN = 39; - public static readonly IS = 40; - public static readonly LAST = 41; - public static readonly LIKE = 42; - public static readonly LP = 43; - public static readonly NOT = 44; - public static readonly NULL = 45; - public static readonly NULLS = 46; - public static readonly OR = 47; - public static readonly PARAM = 48; - public static readonly RLIKE = 49; - public static readonly RP = 50; - public static readonly TRUE = 51; - public static readonly EQ = 52; - public static readonly CIEQ = 53; - public static readonly NEQ = 54; - public static readonly LT = 55; - public static readonly LTE = 56; - public static readonly GT = 57; - public static readonly GTE = 58; - public static readonly PLUS = 59; - public static readonly MINUS = 60; - public static readonly ASTERISK = 61; - public static readonly SLASH = 62; - public static readonly PERCENT = 63; + public static readonly DEV_METRICS = 19; + public static readonly UNKNOWN_CMD = 20; + public static readonly LINE_COMMENT = 21; + public static readonly MULTILINE_COMMENT = 22; + public static readonly WS = 23; + public static readonly PIPE = 24; + public static readonly QUOTED_STRING = 25; + public static readonly INTEGER_LITERAL = 26; + public static readonly DECIMAL_LITERAL = 27; + public static readonly BY = 28; + public static readonly AND = 29; + public static readonly ASC = 30; + public static readonly ASSIGN = 31; + public static readonly CAST_OP = 32; + public static readonly COMMA = 33; + public static readonly DESC = 34; + public static readonly DOT = 35; + public static readonly FALSE = 36; + public static readonly FIRST = 37; + public static readonly IN = 38; + public static readonly IS = 39; + public static readonly LAST = 40; + public static readonly LIKE = 41; + public static readonly LP = 42; + public static readonly NOT = 43; + public static readonly NULL = 44; + public static readonly NULLS = 45; + public static readonly OR = 46; + public static readonly PARAM = 47; + public static readonly RLIKE = 48; + public static readonly RP = 49; + public static readonly TRUE = 50; + public static readonly EQ = 51; + public static readonly CIEQ = 52; + public static readonly NEQ = 53; + public static readonly LT = 54; + public static readonly LTE = 55; + public static readonly GT = 56; + public static readonly GTE = 57; + public static readonly PLUS = 58; + public static readonly MINUS = 59; + public static readonly ASTERISK = 60; + public static readonly SLASH = 61; + public static readonly PERCENT = 62; + public static readonly MATCH = 63; public static readonly NAMED_OR_POSITIONAL_PARAM = 64; public static readonly OPENING_BRACKET = 65; public static readonly CLOSING_BRACKET = 66; @@ -173,26 +173,26 @@ export default class esql_lexer extends lexer_config { null, null, null, null, null, null, - null, "'|'", + "'|'", null, null, null, - null, "'by'", - "'and'", "'asc'", - "'='", "'::'", - "','", "'desc'", - "'.'", "'false'", - "'first'", "'in'", - "'is'", "'last'", - "'like'", "'('", - "'not'", "'null'", - "'nulls'", "'or'", - "'?'", "'rlike'", - "')'", "'true'", - "'=='", "'=~'", - "'!='", "'<'", - "'<='", "'>'", - "'>='", "'+'", - "'-'", "'*'", - "'/'", "'%'", + "'by'", "'and'", + "'asc'", "'='", + "'::'", "','", + "'desc'", "'.'", + "'false'", "'first'", + "'in'", "'is'", + "'last'", "'like'", + "'('", "'not'", + "'null'", "'nulls'", + "'or'", "'?'", + "'rlike'", "')'", + "'true'", "'=='", + "'=~'", "'!='", + "'<'", "'<='", + "'>'", "'>='", + "'+'", "'-'", + "'*'", "'/'", + "'%'", "'match'", null, null, "']'", null, null, null, @@ -225,7 +225,6 @@ export default class esql_lexer extends lexer_config { "STATS", "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", - "DEV_MATCH", "DEV_METRICS", "UNKNOWN_CMD", "LINE_COMMENT", @@ -252,7 +251,7 @@ export default class esql_lexer extends lexer_config { "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", - "NAMED_OR_POSITIONAL_PARAM", + "MATCH", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", @@ -317,20 +316,20 @@ export default class esql_lexer extends lexer_config { public static readonly ruleNames: string[] = [ "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "KEEP", "LIMIT", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", "WHERE", - "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_MATCH", "DEV_METRICS", "UNKNOWN_CMD", - "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "DIGIT", "LETTER", - "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", "ASPERAND", "BACKQUOTE", - "BACKQUOTE_BLOCK", "UNDERSCORE", "UNQUOTED_ID_BODY", "QUOTED_STRING", - "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", - "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", - "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", - "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", - "SLASH", "PERCENT", "DEV_MATCH_OP", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", - "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", - "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "EXPLAIN_OPENING_BRACKET", - "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", - "FROM_PIPE", "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COLON", - "FROM_COMMA", "FROM_ASSIGN", "METADATA", "UNQUOTED_SOURCE_PART", "UNQUOTED_SOURCE", + "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_METRICS", "UNKNOWN_CMD", "LINE_COMMENT", + "MULTILINE_COMMENT", "WS", "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", + "UNESCAPED_CHARS", "EXPONENT", "ASPERAND", "BACKQUOTE", "BACKQUOTE_BLOCK", + "UNDERSCORE", "UNQUOTED_ID_BODY", "QUOTED_STRING", "INTEGER_LITERAL", + "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", "COMMA", "DESC", + "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", "LP", "NOT", "NULL", + "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", "CIEQ", "NEQ", "LT", + "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "MATCH", + "NESTED_WHERE", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", + "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", + "EXPR_MULTILINE_COMMENT", "EXPR_WS", "EXPLAIN_OPENING_BRACKET", "EXPLAIN_PIPE", + "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", "FROM_PIPE", + "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COLON", "FROM_COMMA", + "FROM_ASSIGN", "METADATA", "UNQUOTED_SOURCE_PART", "UNQUOTED_SOURCE", "FROM_UNQUOTED_SOURCE", "FROM_QUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", "PROJECT_PARAM", "PROJECT_NAMED_OR_POSITIONAL_PARAM", "UNQUOTED_ID_BODY_WITH_PATTERN", @@ -386,11 +385,23 @@ export default class esql_lexer extends lexer_config { case 17: return this.DEV_LOOKUP_sempred(localctx, predIndex); case 18: - return this.DEV_MATCH_sempred(localctx, predIndex); - case 19: return this.DEV_METRICS_sempred(localctx, predIndex); - case 73: - return this.DEV_MATCH_OP_sempred(localctx, predIndex); + case 105: + return this.PROJECT_PARAM_sempred(localctx, predIndex); + case 106: + return this.PROJECT_NAMED_OR_POSITIONAL_PARAM_sempred(localctx, predIndex); + case 117: + return this.RENAME_PARAM_sempred(localctx, predIndex); + case 118: + return this.RENAME_NAMED_OR_POSITIONAL_PARAM_sempred(localctx, predIndex); + case 141: + return this.ENRICH_FIELD_PARAM_sempred(localctx, predIndex); + case 142: + return this.ENRICH_FIELD_NAMED_OR_POSITIONAL_PARAM_sempred(localctx, predIndex); + case 148: + return this.MVEXPAND_PARAM_sempred(localctx, predIndex); + case 149: + return this.MVEXPAND_NAMED_OR_POSITIONAL_PARAM_sempred(localctx, predIndex); } return true; } @@ -408,29 +419,71 @@ export default class esql_lexer extends lexer_config { } return true; } - private DEV_MATCH_sempred(localctx: RuleContext, predIndex: number): boolean { + private DEV_METRICS_sempred(localctx: RuleContext, predIndex: number): boolean { switch (predIndex) { case 2: return this.isDevVersion(); } return true; } - private DEV_METRICS_sempred(localctx: RuleContext, predIndex: number): boolean { + private PROJECT_PARAM_sempred(localctx: RuleContext, predIndex: number): boolean { switch (predIndex) { case 3: return this.isDevVersion(); } return true; } - private DEV_MATCH_OP_sempred(localctx: RuleContext, predIndex: number): boolean { + private PROJECT_NAMED_OR_POSITIONAL_PARAM_sempred(localctx: RuleContext, predIndex: number): boolean { switch (predIndex) { case 4: return this.isDevVersion(); } return true; } + private RENAME_PARAM_sempred(localctx: RuleContext, predIndex: number): boolean { + switch (predIndex) { + case 5: + return this.isDevVersion(); + } + return true; + } + private RENAME_NAMED_OR_POSITIONAL_PARAM_sempred(localctx: RuleContext, predIndex: number): boolean { + switch (predIndex) { + case 6: + return this.isDevVersion(); + } + return true; + } + private ENRICH_FIELD_PARAM_sempred(localctx: RuleContext, predIndex: number): boolean { + switch (predIndex) { + case 7: + return this.isDevVersion(); + } + return true; + } + private ENRICH_FIELD_NAMED_OR_POSITIONAL_PARAM_sempred(localctx: RuleContext, predIndex: number): boolean { + switch (predIndex) { + case 8: + return this.isDevVersion(); + } + return true; + } + private MVEXPAND_PARAM_sempred(localctx: RuleContext, predIndex: number): boolean { + switch (predIndex) { + case 9: + return this.isDevVersion(); + } + return true; + } + private MVEXPAND_NAMED_OR_POSITIONAL_PARAM_sempred(localctx: RuleContext, predIndex: number): boolean { + switch (predIndex) { + case 10: + return this.isDevVersion(); + } + return true; + } - public static readonly _serializedATN: number[] = [4,0,120,1475,6,-1,6, + public static readonly _serializedATN: number[] = [4,0,120,1479,6,-1,6, -1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,2,0, 7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9, 7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7, @@ -472,471 +525,472 @@ export default class esql_lexer extends lexer_config { 1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1, 16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17, 1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1, - 19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,4,20,587,8,20, - 11,20,12,20,588,1,20,1,20,1,21,1,21,1,21,1,21,5,21,597,8,21,10,21,12,21, - 600,9,21,1,21,3,21,603,8,21,1,21,3,21,606,8,21,1,21,1,21,1,22,1,22,1,22, - 1,22,1,22,5,22,615,8,22,10,22,12,22,618,9,22,1,22,1,22,1,22,1,22,1,22,1, - 23,4,23,626,8,23,11,23,12,23,627,1,23,1,23,1,24,1,24,1,24,1,24,1,25,1,25, - 1,26,1,26,1,27,1,27,1,27,1,28,1,28,1,29,1,29,3,29,647,8,29,1,29,4,29,650, - 8,29,11,29,12,29,651,1,30,1,30,1,31,1,31,1,32,1,32,1,32,3,32,661,8,32,1, - 33,1,33,1,34,1,34,1,34,3,34,668,8,34,1,35,1,35,1,35,5,35,673,8,35,10,35, - 12,35,676,9,35,1,35,1,35,1,35,1,35,1,35,1,35,5,35,684,8,35,10,35,12,35, - 687,9,35,1,35,1,35,1,35,1,35,1,35,3,35,694,8,35,1,35,3,35,697,8,35,3,35, - 699,8,35,1,36,4,36,702,8,36,11,36,12,36,703,1,37,4,37,707,8,37,11,37,12, - 37,708,1,37,1,37,5,37,713,8,37,10,37,12,37,716,9,37,1,37,1,37,4,37,720, - 8,37,11,37,12,37,721,1,37,4,37,725,8,37,11,37,12,37,726,1,37,1,37,5,37, - 731,8,37,10,37,12,37,734,9,37,3,37,736,8,37,1,37,1,37,1,37,1,37,4,37,742, - 8,37,11,37,12,37,743,1,37,1,37,3,37,748,8,37,1,38,1,38,1,38,1,39,1,39,1, - 39,1,39,1,40,1,40,1,40,1,40,1,41,1,41,1,42,1,42,1,42,1,43,1,43,1,44,1,44, - 1,44,1,44,1,44,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1, - 47,1,47,1,47,1,48,1,48,1,48,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,51, - 1,51,1,51,1,51,1,51,1,52,1,52,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1, - 54,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,57,1,57,1,58,1,58,1,58, - 1,58,1,58,1,58,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,62,1, - 62,1,62,1,63,1,63,1,63,1,64,1,64,1,65,1,65,1,65,1,66,1,66,1,67,1,67,1,67, - 1,68,1,68,1,69,1,69,1,70,1,70,1,71,1,71,1,72,1,72,1,73,1,73,1,73,1,73,1, - 73,1,74,1,74,1,74,3,74,875,8,74,1,74,5,74,878,8,74,10,74,12,74,881,9,74, - 1,74,1,74,4,74,885,8,74,11,74,12,74,886,3,74,889,8,74,1,75,1,75,1,75,1, - 75,1,75,1,76,1,76,1,76,1,76,1,76,1,77,1,77,5,77,903,8,77,10,77,12,77,906, - 9,77,1,77,1,77,3,77,910,8,77,1,77,4,77,913,8,77,11,77,12,77,914,3,77,917, - 8,77,1,78,1,78,4,78,921,8,78,11,78,12,78,922,1,78,1,78,1,79,1,79,1,80,1, - 80,1,80,1,80,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,83,1,83,1,83,1,83, - 1,83,1,84,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1, - 87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,90,1,90, - 1,90,1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1, - 94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,95,3,95,1000,8,95, - 1,96,4,96,1003,8,96,11,96,12,96,1004,1,97,1,97,1,97,1,97,1,98,1,98,1,98, - 1,98,1,99,1,99,1,99,1,99,1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101, - 1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103,1,103,1,104,1,104,1,104, - 1,104,1,105,1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,107,1,107,1,107, - 1,107,3,107,1052,8,107,1,108,1,108,3,108,1056,8,108,1,108,5,108,1059,8, - 108,10,108,12,108,1062,9,108,1,108,1,108,3,108,1066,8,108,1,108,4,108,1069, - 8,108,11,108,12,108,1070,3,108,1073,8,108,1,109,1,109,4,109,1077,8,109, - 11,109,12,109,1078,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,112, - 1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114,1,114, - 1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117, - 1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,121, - 1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,124, - 1,124,1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,126,1,126,1,126, - 1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,128,1,128,1,129, - 4,129,1162,8,129,11,129,12,129,1163,1,129,1,129,3,129,1168,8,129,1,129, - 4,129,1171,8,129,11,129,12,129,1172,1,130,1,130,1,130,1,130,1,131,1,131, - 1,131,1,131,1,132,1,132,1,132,1,132,1,133,1,133,1,133,1,133,1,134,1,134, - 1,134,1,134,1,134,1,134,1,135,1,135,1,135,1,135,1,136,1,136,1,136,1,136, - 1,137,1,137,1,137,1,137,1,138,1,138,1,138,1,138,1,139,1,139,1,139,1,139, - 1,140,1,140,1,140,1,140,1,141,1,141,1,141,1,141,1,142,1,142,1,142,1,142, - 1,143,1,143,1,143,1,143,1,144,1,144,1,144,1,144,1,145,1,145,1,145,1,145, - 1,146,1,146,1,146,1,146,1,146,1,147,1,147,1,147,1,147,1,148,1,148,1,148, - 1,148,1,149,1,149,1,149,1,149,1,150,1,150,1,150,1,150,1,151,1,151,1,151, - 1,151,1,152,1,152,1,152,1,152,1,153,1,153,1,153,1,153,1,154,1,154,1,154, - 1,154,1,155,1,155,1,155,1,155,1,155,1,156,1,156,1,156,1,156,1,156,1,157, - 1,157,1,157,1,157,1,158,1,158,1,158,1,158,1,159,1,159,1,159,1,159,1,160, - 1,160,1,160,1,160,1,160,1,161,1,161,1,162,1,162,1,162,1,162,1,162,4,162, - 1312,8,162,11,162,12,162,1313,1,163,1,163,1,163,1,163,1,164,1,164,1,164, - 1,164,1,165,1,165,1,165,1,165,1,166,1,166,1,166,1,166,1,166,1,167,1,167, - 1,167,1,167,1,168,1,168,1,168,1,168,1,169,1,169,1,169,1,169,1,170,1,170, - 1,170,1,170,1,170,1,171,1,171,1,171,1,171,1,172,1,172,1,172,1,172,1,173, - 1,173,1,173,1,173,1,174,1,174,1,174,1,174,1,175,1,175,1,175,1,175,1,176, - 1,176,1,176,1,176,1,176,1,176,1,177,1,177,1,177,1,177,1,178,1,178,1,178, - 1,178,1,179,1,179,1,179,1,179,1,180,1,180,1,180,1,180,1,181,1,181,1,181, - 1,181,1,182,1,182,1,182,1,182,1,183,1,183,1,183,1,183,1,183,1,184,1,184, - 1,184,1,184,1,184,1,184,1,185,1,185,1,185,1,185,1,185,1,185,1,186,1,186, - 1,186,1,186,1,187,1,187,1,187,1,187,1,188,1,188,1,188,1,188,1,189,1,189, - 1,189,1,189,1,189,1,189,1,190,1,190,1,190,1,190,1,190,1,190,1,191,1,191, - 1,191,1,191,1,192,1,192,1,192,1,192,1,193,1,193,1,193,1,193,1,194,1,194, - 1,194,1,194,1,194,1,194,1,195,1,195,1,195,1,195,1,195,1,195,1,196,1,196, - 1,196,1,196,1,196,1,196,1,197,1,197,1,197,1,197,1,197,2,616,685,0,198,15, - 1,17,2,19,3,21,4,23,5,25,6,27,7,29,8,31,9,33,10,35,11,37,12,39,13,41,14, - 43,15,45,16,47,17,49,18,51,19,53,20,55,21,57,22,59,23,61,24,63,25,65,0, - 67,0,69,0,71,0,73,0,75,0,77,0,79,0,81,0,83,0,85,26,87,27,89,28,91,29,93, - 30,95,31,97,32,99,33,101,34,103,35,105,36,107,37,109,38,111,39,113,40,115, - 41,117,42,119,43,121,44,123,45,125,46,127,47,129,48,131,49,133,50,135,51, - 137,52,139,53,141,54,143,55,145,56,147,57,149,58,151,59,153,60,155,61,157, - 62,159,63,161,0,163,64,165,65,167,66,169,67,171,0,173,68,175,69,177,70, - 179,71,181,0,183,0,185,72,187,73,189,74,191,0,193,0,195,0,197,0,199,0,201, - 0,203,75,205,0,207,76,209,0,211,0,213,77,215,78,217,79,219,0,221,0,223, - 0,225,0,227,0,229,0,231,0,233,80,235,81,237,82,239,83,241,0,243,0,245,0, - 247,0,249,0,251,0,253,84,255,0,257,85,259,86,261,87,263,0,265,0,267,88, - 269,89,271,0,273,90,275,0,277,91,279,92,281,93,283,0,285,0,287,0,289,0, - 291,0,293,0,295,0,297,0,299,0,301,94,303,95,305,96,307,0,309,0,311,0,313, - 0,315,0,317,0,319,97,321,98,323,99,325,0,327,100,329,101,331,102,333,103, - 335,0,337,104,339,105,341,106,343,107,345,108,347,0,349,0,351,0,353,0,355, - 0,357,0,359,0,361,109,363,110,365,111,367,0,369,0,371,0,373,0,375,112,377, - 113,379,114,381,0,383,0,385,0,387,115,389,116,391,117,393,0,395,0,397,118, - 399,119,401,120,403,0,405,0,407,0,409,0,15,0,1,2,3,4,5,6,7,8,9,10,11,12, - 13,14,35,2,0,68,68,100,100,2,0,73,73,105,105,2,0,83,83,115,115,2,0,69,69, - 101,101,2,0,67,67,99,99,2,0,84,84,116,116,2,0,82,82,114,114,2,0,79,79,111, - 111,2,0,80,80,112,112,2,0,78,78,110,110,2,0,72,72,104,104,2,0,86,86,118, - 118,2,0,65,65,97,97,2,0,76,76,108,108,2,0,88,88,120,120,2,0,70,70,102,102, - 2,0,77,77,109,109,2,0,71,71,103,103,2,0,75,75,107,107,2,0,87,87,119,119, - 2,0,85,85,117,117,6,0,9,10,13,13,32,32,47,47,91,91,93,93,2,0,10,10,13,13, - 3,0,9,10,13,13,32,32,1,0,48,57,2,0,65,90,97,122,8,0,34,34,78,78,82,82,84, - 84,92,92,110,110,114,114,116,116,4,0,10,10,13,13,34,34,92,92,2,0,43,43, - 45,45,1,0,96,96,2,0,66,66,98,98,2,0,89,89,121,121,11,0,9,10,13,13,32,32, - 34,34,44,44,47,47,58,58,61,61,91,91,93,93,124,124,2,0,42,42,47,47,11,0, - 9,10,13,13,32,32,34,35,44,44,47,47,58,58,60,60,62,63,92,92,124,124,1503, - 0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1, - 0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0, - 0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1, - 0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0, - 0,59,1,0,0,0,0,61,1,0,0,0,1,63,1,0,0,0,1,85,1,0,0,0,1,87,1,0,0,0,1,89,1, - 0,0,0,1,91,1,0,0,0,1,93,1,0,0,0,1,95,1,0,0,0,1,97,1,0,0,0,1,99,1,0,0,0, - 1,101,1,0,0,0,1,103,1,0,0,0,1,105,1,0,0,0,1,107,1,0,0,0,1,109,1,0,0,0,1, - 111,1,0,0,0,1,113,1,0,0,0,1,115,1,0,0,0,1,117,1,0,0,0,1,119,1,0,0,0,1,121, - 1,0,0,0,1,123,1,0,0,0,1,125,1,0,0,0,1,127,1,0,0,0,1,129,1,0,0,0,1,131,1, - 0,0,0,1,133,1,0,0,0,1,135,1,0,0,0,1,137,1,0,0,0,1,139,1,0,0,0,1,141,1,0, - 0,0,1,143,1,0,0,0,1,145,1,0,0,0,1,147,1,0,0,0,1,149,1,0,0,0,1,151,1,0,0, - 0,1,153,1,0,0,0,1,155,1,0,0,0,1,157,1,0,0,0,1,159,1,0,0,0,1,161,1,0,0,0, - 1,163,1,0,0,0,1,165,1,0,0,0,1,167,1,0,0,0,1,169,1,0,0,0,1,173,1,0,0,0,1, - 175,1,0,0,0,1,177,1,0,0,0,1,179,1,0,0,0,2,181,1,0,0,0,2,183,1,0,0,0,2,185, - 1,0,0,0,2,187,1,0,0,0,2,189,1,0,0,0,3,191,1,0,0,0,3,193,1,0,0,0,3,195,1, - 0,0,0,3,197,1,0,0,0,3,199,1,0,0,0,3,201,1,0,0,0,3,203,1,0,0,0,3,207,1,0, - 0,0,3,209,1,0,0,0,3,211,1,0,0,0,3,213,1,0,0,0,3,215,1,0,0,0,3,217,1,0,0, - 0,4,219,1,0,0,0,4,221,1,0,0,0,4,223,1,0,0,0,4,225,1,0,0,0,4,227,1,0,0,0, - 4,233,1,0,0,0,4,235,1,0,0,0,4,237,1,0,0,0,4,239,1,0,0,0,5,241,1,0,0,0,5, - 243,1,0,0,0,5,245,1,0,0,0,5,247,1,0,0,0,5,249,1,0,0,0,5,251,1,0,0,0,5,253, - 1,0,0,0,5,255,1,0,0,0,5,257,1,0,0,0,5,259,1,0,0,0,5,261,1,0,0,0,6,263,1, - 0,0,0,6,265,1,0,0,0,6,267,1,0,0,0,6,269,1,0,0,0,6,273,1,0,0,0,6,275,1,0, - 0,0,6,277,1,0,0,0,6,279,1,0,0,0,6,281,1,0,0,0,7,283,1,0,0,0,7,285,1,0,0, - 0,7,287,1,0,0,0,7,289,1,0,0,0,7,291,1,0,0,0,7,293,1,0,0,0,7,295,1,0,0,0, - 7,297,1,0,0,0,7,299,1,0,0,0,7,301,1,0,0,0,7,303,1,0,0,0,7,305,1,0,0,0,8, - 307,1,0,0,0,8,309,1,0,0,0,8,311,1,0,0,0,8,313,1,0,0,0,8,315,1,0,0,0,8,317, - 1,0,0,0,8,319,1,0,0,0,8,321,1,0,0,0,8,323,1,0,0,0,9,325,1,0,0,0,9,327,1, - 0,0,0,9,329,1,0,0,0,9,331,1,0,0,0,9,333,1,0,0,0,10,335,1,0,0,0,10,337,1, - 0,0,0,10,339,1,0,0,0,10,341,1,0,0,0,10,343,1,0,0,0,10,345,1,0,0,0,11,347, - 1,0,0,0,11,349,1,0,0,0,11,351,1,0,0,0,11,353,1,0,0,0,11,355,1,0,0,0,11, - 357,1,0,0,0,11,359,1,0,0,0,11,361,1,0,0,0,11,363,1,0,0,0,11,365,1,0,0,0, - 12,367,1,0,0,0,12,369,1,0,0,0,12,371,1,0,0,0,12,373,1,0,0,0,12,375,1,0, - 0,0,12,377,1,0,0,0,12,379,1,0,0,0,13,381,1,0,0,0,13,383,1,0,0,0,13,385, - 1,0,0,0,13,387,1,0,0,0,13,389,1,0,0,0,13,391,1,0,0,0,14,393,1,0,0,0,14, - 395,1,0,0,0,14,397,1,0,0,0,14,399,1,0,0,0,14,401,1,0,0,0,14,403,1,0,0,0, - 14,405,1,0,0,0,14,407,1,0,0,0,14,409,1,0,0,0,15,411,1,0,0,0,17,421,1,0, - 0,0,19,428,1,0,0,0,21,437,1,0,0,0,23,444,1,0,0,0,25,454,1,0,0,0,27,461, - 1,0,0,0,29,468,1,0,0,0,31,475,1,0,0,0,33,483,1,0,0,0,35,495,1,0,0,0,37, - 504,1,0,0,0,39,510,1,0,0,0,41,517,1,0,0,0,43,524,1,0,0,0,45,532,1,0,0,0, - 47,540,1,0,0,0,49,555,1,0,0,0,51,565,1,0,0,0,53,574,1,0,0,0,55,586,1,0, - 0,0,57,592,1,0,0,0,59,609,1,0,0,0,61,625,1,0,0,0,63,631,1,0,0,0,65,635, - 1,0,0,0,67,637,1,0,0,0,69,639,1,0,0,0,71,642,1,0,0,0,73,644,1,0,0,0,75, - 653,1,0,0,0,77,655,1,0,0,0,79,660,1,0,0,0,81,662,1,0,0,0,83,667,1,0,0,0, - 85,698,1,0,0,0,87,701,1,0,0,0,89,747,1,0,0,0,91,749,1,0,0,0,93,752,1,0, - 0,0,95,756,1,0,0,0,97,760,1,0,0,0,99,762,1,0,0,0,101,765,1,0,0,0,103,767, - 1,0,0,0,105,772,1,0,0,0,107,774,1,0,0,0,109,780,1,0,0,0,111,786,1,0,0,0, - 113,789,1,0,0,0,115,792,1,0,0,0,117,797,1,0,0,0,119,802,1,0,0,0,121,804, - 1,0,0,0,123,808,1,0,0,0,125,813,1,0,0,0,127,819,1,0,0,0,129,822,1,0,0,0, - 131,824,1,0,0,0,133,830,1,0,0,0,135,832,1,0,0,0,137,837,1,0,0,0,139,840, - 1,0,0,0,141,843,1,0,0,0,143,846,1,0,0,0,145,848,1,0,0,0,147,851,1,0,0,0, - 149,853,1,0,0,0,151,856,1,0,0,0,153,858,1,0,0,0,155,860,1,0,0,0,157,862, - 1,0,0,0,159,864,1,0,0,0,161,866,1,0,0,0,163,888,1,0,0,0,165,890,1,0,0,0, - 167,895,1,0,0,0,169,916,1,0,0,0,171,918,1,0,0,0,173,926,1,0,0,0,175,928, - 1,0,0,0,177,932,1,0,0,0,179,936,1,0,0,0,181,940,1,0,0,0,183,945,1,0,0,0, - 185,950,1,0,0,0,187,954,1,0,0,0,189,958,1,0,0,0,191,962,1,0,0,0,193,967, - 1,0,0,0,195,971,1,0,0,0,197,975,1,0,0,0,199,979,1,0,0,0,201,983,1,0,0,0, - 203,987,1,0,0,0,205,999,1,0,0,0,207,1002,1,0,0,0,209,1006,1,0,0,0,211,1010, - 1,0,0,0,213,1014,1,0,0,0,215,1018,1,0,0,0,217,1022,1,0,0,0,219,1026,1,0, - 0,0,221,1031,1,0,0,0,223,1035,1,0,0,0,225,1039,1,0,0,0,227,1043,1,0,0,0, - 229,1051,1,0,0,0,231,1072,1,0,0,0,233,1076,1,0,0,0,235,1080,1,0,0,0,237, - 1084,1,0,0,0,239,1088,1,0,0,0,241,1092,1,0,0,0,243,1097,1,0,0,0,245,1101, - 1,0,0,0,247,1105,1,0,0,0,249,1109,1,0,0,0,251,1113,1,0,0,0,253,1117,1,0, - 0,0,255,1120,1,0,0,0,257,1124,1,0,0,0,259,1128,1,0,0,0,261,1132,1,0,0,0, - 263,1136,1,0,0,0,265,1141,1,0,0,0,267,1146,1,0,0,0,269,1151,1,0,0,0,271, - 1158,1,0,0,0,273,1167,1,0,0,0,275,1174,1,0,0,0,277,1178,1,0,0,0,279,1182, - 1,0,0,0,281,1186,1,0,0,0,283,1190,1,0,0,0,285,1196,1,0,0,0,287,1200,1,0, - 0,0,289,1204,1,0,0,0,291,1208,1,0,0,0,293,1212,1,0,0,0,295,1216,1,0,0,0, - 297,1220,1,0,0,0,299,1224,1,0,0,0,301,1228,1,0,0,0,303,1232,1,0,0,0,305, - 1236,1,0,0,0,307,1240,1,0,0,0,309,1245,1,0,0,0,311,1249,1,0,0,0,313,1253, - 1,0,0,0,315,1257,1,0,0,0,317,1261,1,0,0,0,319,1265,1,0,0,0,321,1269,1,0, - 0,0,323,1273,1,0,0,0,325,1277,1,0,0,0,327,1282,1,0,0,0,329,1287,1,0,0,0, - 331,1291,1,0,0,0,333,1295,1,0,0,0,335,1299,1,0,0,0,337,1304,1,0,0,0,339, - 1311,1,0,0,0,341,1315,1,0,0,0,343,1319,1,0,0,0,345,1323,1,0,0,0,347,1327, - 1,0,0,0,349,1332,1,0,0,0,351,1336,1,0,0,0,353,1340,1,0,0,0,355,1344,1,0, - 0,0,357,1349,1,0,0,0,359,1353,1,0,0,0,361,1357,1,0,0,0,363,1361,1,0,0,0, - 365,1365,1,0,0,0,367,1369,1,0,0,0,369,1375,1,0,0,0,371,1379,1,0,0,0,373, - 1383,1,0,0,0,375,1387,1,0,0,0,377,1391,1,0,0,0,379,1395,1,0,0,0,381,1399, - 1,0,0,0,383,1404,1,0,0,0,385,1410,1,0,0,0,387,1416,1,0,0,0,389,1420,1,0, - 0,0,391,1424,1,0,0,0,393,1428,1,0,0,0,395,1434,1,0,0,0,397,1440,1,0,0,0, - 399,1444,1,0,0,0,401,1448,1,0,0,0,403,1452,1,0,0,0,405,1458,1,0,0,0,407, - 1464,1,0,0,0,409,1470,1,0,0,0,411,412,7,0,0,0,412,413,7,1,0,0,413,414,7, - 2,0,0,414,415,7,2,0,0,415,416,7,3,0,0,416,417,7,4,0,0,417,418,7,5,0,0,418, - 419,1,0,0,0,419,420,6,0,0,0,420,16,1,0,0,0,421,422,7,0,0,0,422,423,7,6, - 0,0,423,424,7,7,0,0,424,425,7,8,0,0,425,426,1,0,0,0,426,427,6,1,1,0,427, - 18,1,0,0,0,428,429,7,3,0,0,429,430,7,9,0,0,430,431,7,6,0,0,431,432,7,1, - 0,0,432,433,7,4,0,0,433,434,7,10,0,0,434,435,1,0,0,0,435,436,6,2,2,0,436, - 20,1,0,0,0,437,438,7,3,0,0,438,439,7,11,0,0,439,440,7,12,0,0,440,441,7, - 13,0,0,441,442,1,0,0,0,442,443,6,3,0,0,443,22,1,0,0,0,444,445,7,3,0,0,445, - 446,7,14,0,0,446,447,7,8,0,0,447,448,7,13,0,0,448,449,7,12,0,0,449,450, - 7,1,0,0,450,451,7,9,0,0,451,452,1,0,0,0,452,453,6,4,3,0,453,24,1,0,0,0, - 454,455,7,15,0,0,455,456,7,6,0,0,456,457,7,7,0,0,457,458,7,16,0,0,458,459, - 1,0,0,0,459,460,6,5,4,0,460,26,1,0,0,0,461,462,7,17,0,0,462,463,7,6,0,0, - 463,464,7,7,0,0,464,465,7,18,0,0,465,466,1,0,0,0,466,467,6,6,0,0,467,28, - 1,0,0,0,468,469,7,18,0,0,469,470,7,3,0,0,470,471,7,3,0,0,471,472,7,8,0, - 0,472,473,1,0,0,0,473,474,6,7,1,0,474,30,1,0,0,0,475,476,7,13,0,0,476,477, - 7,1,0,0,477,478,7,16,0,0,478,479,7,1,0,0,479,480,7,5,0,0,480,481,1,0,0, - 0,481,482,6,8,0,0,482,32,1,0,0,0,483,484,7,16,0,0,484,485,7,11,0,0,485, - 486,5,95,0,0,486,487,7,3,0,0,487,488,7,14,0,0,488,489,7,8,0,0,489,490,7, - 12,0,0,490,491,7,9,0,0,491,492,7,0,0,0,492,493,1,0,0,0,493,494,6,9,5,0, - 494,34,1,0,0,0,495,496,7,6,0,0,496,497,7,3,0,0,497,498,7,9,0,0,498,499, - 7,12,0,0,499,500,7,16,0,0,500,501,7,3,0,0,501,502,1,0,0,0,502,503,6,10, - 6,0,503,36,1,0,0,0,504,505,7,6,0,0,505,506,7,7,0,0,506,507,7,19,0,0,507, - 508,1,0,0,0,508,509,6,11,0,0,509,38,1,0,0,0,510,511,7,2,0,0,511,512,7,10, - 0,0,512,513,7,7,0,0,513,514,7,19,0,0,514,515,1,0,0,0,515,516,6,12,7,0,516, - 40,1,0,0,0,517,518,7,2,0,0,518,519,7,7,0,0,519,520,7,6,0,0,520,521,7,5, - 0,0,521,522,1,0,0,0,522,523,6,13,0,0,523,42,1,0,0,0,524,525,7,2,0,0,525, - 526,7,5,0,0,526,527,7,12,0,0,527,528,7,5,0,0,528,529,7,2,0,0,529,530,1, - 0,0,0,530,531,6,14,0,0,531,44,1,0,0,0,532,533,7,19,0,0,533,534,7,10,0,0, - 534,535,7,3,0,0,535,536,7,6,0,0,536,537,7,3,0,0,537,538,1,0,0,0,538,539, - 6,15,0,0,539,46,1,0,0,0,540,541,4,16,0,0,541,542,7,1,0,0,542,543,7,9,0, - 0,543,544,7,13,0,0,544,545,7,1,0,0,545,546,7,9,0,0,546,547,7,3,0,0,547, - 548,7,2,0,0,548,549,7,5,0,0,549,550,7,12,0,0,550,551,7,5,0,0,551,552,7, - 2,0,0,552,553,1,0,0,0,553,554,6,16,0,0,554,48,1,0,0,0,555,556,4,17,1,0, - 556,557,7,13,0,0,557,558,7,7,0,0,558,559,7,7,0,0,559,560,7,18,0,0,560,561, - 7,20,0,0,561,562,7,8,0,0,562,563,1,0,0,0,563,564,6,17,8,0,564,50,1,0,0, - 0,565,566,4,18,2,0,566,567,7,16,0,0,567,568,7,12,0,0,568,569,7,5,0,0,569, - 570,7,4,0,0,570,571,7,10,0,0,571,572,1,0,0,0,572,573,6,18,0,0,573,52,1, - 0,0,0,574,575,4,19,3,0,575,576,7,16,0,0,576,577,7,3,0,0,577,578,7,5,0,0, - 578,579,7,6,0,0,579,580,7,1,0,0,580,581,7,4,0,0,581,582,7,2,0,0,582,583, - 1,0,0,0,583,584,6,19,9,0,584,54,1,0,0,0,585,587,8,21,0,0,586,585,1,0,0, - 0,587,588,1,0,0,0,588,586,1,0,0,0,588,589,1,0,0,0,589,590,1,0,0,0,590,591, - 6,20,0,0,591,56,1,0,0,0,592,593,5,47,0,0,593,594,5,47,0,0,594,598,1,0,0, - 0,595,597,8,22,0,0,596,595,1,0,0,0,597,600,1,0,0,0,598,596,1,0,0,0,598, - 599,1,0,0,0,599,602,1,0,0,0,600,598,1,0,0,0,601,603,5,13,0,0,602,601,1, - 0,0,0,602,603,1,0,0,0,603,605,1,0,0,0,604,606,5,10,0,0,605,604,1,0,0,0, - 605,606,1,0,0,0,606,607,1,0,0,0,607,608,6,21,10,0,608,58,1,0,0,0,609,610, - 5,47,0,0,610,611,5,42,0,0,611,616,1,0,0,0,612,615,3,59,22,0,613,615,9,0, - 0,0,614,612,1,0,0,0,614,613,1,0,0,0,615,618,1,0,0,0,616,617,1,0,0,0,616, - 614,1,0,0,0,617,619,1,0,0,0,618,616,1,0,0,0,619,620,5,42,0,0,620,621,5, - 47,0,0,621,622,1,0,0,0,622,623,6,22,10,0,623,60,1,0,0,0,624,626,7,23,0, - 0,625,624,1,0,0,0,626,627,1,0,0,0,627,625,1,0,0,0,627,628,1,0,0,0,628,629, - 1,0,0,0,629,630,6,23,10,0,630,62,1,0,0,0,631,632,5,124,0,0,632,633,1,0, - 0,0,633,634,6,24,11,0,634,64,1,0,0,0,635,636,7,24,0,0,636,66,1,0,0,0,637, - 638,7,25,0,0,638,68,1,0,0,0,639,640,5,92,0,0,640,641,7,26,0,0,641,70,1, - 0,0,0,642,643,8,27,0,0,643,72,1,0,0,0,644,646,7,3,0,0,645,647,7,28,0,0, - 646,645,1,0,0,0,646,647,1,0,0,0,647,649,1,0,0,0,648,650,3,65,25,0,649,648, - 1,0,0,0,650,651,1,0,0,0,651,649,1,0,0,0,651,652,1,0,0,0,652,74,1,0,0,0, - 653,654,5,64,0,0,654,76,1,0,0,0,655,656,5,96,0,0,656,78,1,0,0,0,657,661, - 8,29,0,0,658,659,5,96,0,0,659,661,5,96,0,0,660,657,1,0,0,0,660,658,1,0, - 0,0,661,80,1,0,0,0,662,663,5,95,0,0,663,82,1,0,0,0,664,668,3,67,26,0,665, - 668,3,65,25,0,666,668,3,81,33,0,667,664,1,0,0,0,667,665,1,0,0,0,667,666, - 1,0,0,0,668,84,1,0,0,0,669,674,5,34,0,0,670,673,3,69,27,0,671,673,3,71, - 28,0,672,670,1,0,0,0,672,671,1,0,0,0,673,676,1,0,0,0,674,672,1,0,0,0,674, - 675,1,0,0,0,675,677,1,0,0,0,676,674,1,0,0,0,677,699,5,34,0,0,678,679,5, - 34,0,0,679,680,5,34,0,0,680,681,5,34,0,0,681,685,1,0,0,0,682,684,8,22,0, - 0,683,682,1,0,0,0,684,687,1,0,0,0,685,686,1,0,0,0,685,683,1,0,0,0,686,688, - 1,0,0,0,687,685,1,0,0,0,688,689,5,34,0,0,689,690,5,34,0,0,690,691,5,34, - 0,0,691,693,1,0,0,0,692,694,5,34,0,0,693,692,1,0,0,0,693,694,1,0,0,0,694, - 696,1,0,0,0,695,697,5,34,0,0,696,695,1,0,0,0,696,697,1,0,0,0,697,699,1, - 0,0,0,698,669,1,0,0,0,698,678,1,0,0,0,699,86,1,0,0,0,700,702,3,65,25,0, - 701,700,1,0,0,0,702,703,1,0,0,0,703,701,1,0,0,0,703,704,1,0,0,0,704,88, - 1,0,0,0,705,707,3,65,25,0,706,705,1,0,0,0,707,708,1,0,0,0,708,706,1,0,0, - 0,708,709,1,0,0,0,709,710,1,0,0,0,710,714,3,105,45,0,711,713,3,65,25,0, - 712,711,1,0,0,0,713,716,1,0,0,0,714,712,1,0,0,0,714,715,1,0,0,0,715,748, - 1,0,0,0,716,714,1,0,0,0,717,719,3,105,45,0,718,720,3,65,25,0,719,718,1, - 0,0,0,720,721,1,0,0,0,721,719,1,0,0,0,721,722,1,0,0,0,722,748,1,0,0,0,723, - 725,3,65,25,0,724,723,1,0,0,0,725,726,1,0,0,0,726,724,1,0,0,0,726,727,1, - 0,0,0,727,735,1,0,0,0,728,732,3,105,45,0,729,731,3,65,25,0,730,729,1,0, - 0,0,731,734,1,0,0,0,732,730,1,0,0,0,732,733,1,0,0,0,733,736,1,0,0,0,734, - 732,1,0,0,0,735,728,1,0,0,0,735,736,1,0,0,0,736,737,1,0,0,0,737,738,3,73, - 29,0,738,748,1,0,0,0,739,741,3,105,45,0,740,742,3,65,25,0,741,740,1,0,0, - 0,742,743,1,0,0,0,743,741,1,0,0,0,743,744,1,0,0,0,744,745,1,0,0,0,745,746, - 3,73,29,0,746,748,1,0,0,0,747,706,1,0,0,0,747,717,1,0,0,0,747,724,1,0,0, - 0,747,739,1,0,0,0,748,90,1,0,0,0,749,750,7,30,0,0,750,751,7,31,0,0,751, - 92,1,0,0,0,752,753,7,12,0,0,753,754,7,9,0,0,754,755,7,0,0,0,755,94,1,0, - 0,0,756,757,7,12,0,0,757,758,7,2,0,0,758,759,7,4,0,0,759,96,1,0,0,0,760, - 761,5,61,0,0,761,98,1,0,0,0,762,763,5,58,0,0,763,764,5,58,0,0,764,100,1, - 0,0,0,765,766,5,44,0,0,766,102,1,0,0,0,767,768,7,0,0,0,768,769,7,3,0,0, - 769,770,7,2,0,0,770,771,7,4,0,0,771,104,1,0,0,0,772,773,5,46,0,0,773,106, - 1,0,0,0,774,775,7,15,0,0,775,776,7,12,0,0,776,777,7,13,0,0,777,778,7,2, - 0,0,778,779,7,3,0,0,779,108,1,0,0,0,780,781,7,15,0,0,781,782,7,1,0,0,782, - 783,7,6,0,0,783,784,7,2,0,0,784,785,7,5,0,0,785,110,1,0,0,0,786,787,7,1, - 0,0,787,788,7,9,0,0,788,112,1,0,0,0,789,790,7,1,0,0,790,791,7,2,0,0,791, - 114,1,0,0,0,792,793,7,13,0,0,793,794,7,12,0,0,794,795,7,2,0,0,795,796,7, - 5,0,0,796,116,1,0,0,0,797,798,7,13,0,0,798,799,7,1,0,0,799,800,7,18,0,0, - 800,801,7,3,0,0,801,118,1,0,0,0,802,803,5,40,0,0,803,120,1,0,0,0,804,805, - 7,9,0,0,805,806,7,7,0,0,806,807,7,5,0,0,807,122,1,0,0,0,808,809,7,9,0,0, - 809,810,7,20,0,0,810,811,7,13,0,0,811,812,7,13,0,0,812,124,1,0,0,0,813, - 814,7,9,0,0,814,815,7,20,0,0,815,816,7,13,0,0,816,817,7,13,0,0,817,818, - 7,2,0,0,818,126,1,0,0,0,819,820,7,7,0,0,820,821,7,6,0,0,821,128,1,0,0,0, - 822,823,5,63,0,0,823,130,1,0,0,0,824,825,7,6,0,0,825,826,7,13,0,0,826,827, - 7,1,0,0,827,828,7,18,0,0,828,829,7,3,0,0,829,132,1,0,0,0,830,831,5,41,0, - 0,831,134,1,0,0,0,832,833,7,5,0,0,833,834,7,6,0,0,834,835,7,20,0,0,835, - 836,7,3,0,0,836,136,1,0,0,0,837,838,5,61,0,0,838,839,5,61,0,0,839,138,1, - 0,0,0,840,841,5,61,0,0,841,842,5,126,0,0,842,140,1,0,0,0,843,844,5,33,0, - 0,844,845,5,61,0,0,845,142,1,0,0,0,846,847,5,60,0,0,847,144,1,0,0,0,848, - 849,5,60,0,0,849,850,5,61,0,0,850,146,1,0,0,0,851,852,5,62,0,0,852,148, - 1,0,0,0,853,854,5,62,0,0,854,855,5,61,0,0,855,150,1,0,0,0,856,857,5,43, - 0,0,857,152,1,0,0,0,858,859,5,45,0,0,859,154,1,0,0,0,860,861,5,42,0,0,861, - 156,1,0,0,0,862,863,5,47,0,0,863,158,1,0,0,0,864,865,5,37,0,0,865,160,1, - 0,0,0,866,867,4,73,4,0,867,868,3,51,18,0,868,869,1,0,0,0,869,870,6,73,12, - 0,870,162,1,0,0,0,871,874,3,129,57,0,872,875,3,67,26,0,873,875,3,81,33, - 0,874,872,1,0,0,0,874,873,1,0,0,0,875,879,1,0,0,0,876,878,3,83,34,0,877, - 876,1,0,0,0,878,881,1,0,0,0,879,877,1,0,0,0,879,880,1,0,0,0,880,889,1,0, - 0,0,881,879,1,0,0,0,882,884,3,129,57,0,883,885,3,65,25,0,884,883,1,0,0, - 0,885,886,1,0,0,0,886,884,1,0,0,0,886,887,1,0,0,0,887,889,1,0,0,0,888,871, - 1,0,0,0,888,882,1,0,0,0,889,164,1,0,0,0,890,891,5,91,0,0,891,892,1,0,0, - 0,892,893,6,75,0,0,893,894,6,75,0,0,894,166,1,0,0,0,895,896,5,93,0,0,896, - 897,1,0,0,0,897,898,6,76,11,0,898,899,6,76,11,0,899,168,1,0,0,0,900,904, - 3,67,26,0,901,903,3,83,34,0,902,901,1,0,0,0,903,906,1,0,0,0,904,902,1,0, - 0,0,904,905,1,0,0,0,905,917,1,0,0,0,906,904,1,0,0,0,907,910,3,81,33,0,908, - 910,3,75,30,0,909,907,1,0,0,0,909,908,1,0,0,0,910,912,1,0,0,0,911,913,3, - 83,34,0,912,911,1,0,0,0,913,914,1,0,0,0,914,912,1,0,0,0,914,915,1,0,0,0, - 915,917,1,0,0,0,916,900,1,0,0,0,916,909,1,0,0,0,917,170,1,0,0,0,918,920, - 3,77,31,0,919,921,3,79,32,0,920,919,1,0,0,0,921,922,1,0,0,0,922,920,1,0, - 0,0,922,923,1,0,0,0,923,924,1,0,0,0,924,925,3,77,31,0,925,172,1,0,0,0,926, - 927,3,171,78,0,927,174,1,0,0,0,928,929,3,57,21,0,929,930,1,0,0,0,930,931, - 6,80,10,0,931,176,1,0,0,0,932,933,3,59,22,0,933,934,1,0,0,0,934,935,6,81, - 10,0,935,178,1,0,0,0,936,937,3,61,23,0,937,938,1,0,0,0,938,939,6,82,10, - 0,939,180,1,0,0,0,940,941,3,165,75,0,941,942,1,0,0,0,942,943,6,83,13,0, - 943,944,6,83,14,0,944,182,1,0,0,0,945,946,3,63,24,0,946,947,1,0,0,0,947, - 948,6,84,15,0,948,949,6,84,11,0,949,184,1,0,0,0,950,951,3,61,23,0,951,952, - 1,0,0,0,952,953,6,85,10,0,953,186,1,0,0,0,954,955,3,57,21,0,955,956,1,0, - 0,0,956,957,6,86,10,0,957,188,1,0,0,0,958,959,3,59,22,0,959,960,1,0,0,0, - 960,961,6,87,10,0,961,190,1,0,0,0,962,963,3,63,24,0,963,964,1,0,0,0,964, - 965,6,88,15,0,965,966,6,88,11,0,966,192,1,0,0,0,967,968,3,165,75,0,968, - 969,1,0,0,0,969,970,6,89,13,0,970,194,1,0,0,0,971,972,3,167,76,0,972,973, - 1,0,0,0,973,974,6,90,16,0,974,196,1,0,0,0,975,976,3,337,161,0,976,977,1, - 0,0,0,977,978,6,91,17,0,978,198,1,0,0,0,979,980,3,101,43,0,980,981,1,0, - 0,0,981,982,6,92,18,0,982,200,1,0,0,0,983,984,3,97,41,0,984,985,1,0,0,0, - 985,986,6,93,19,0,986,202,1,0,0,0,987,988,7,16,0,0,988,989,7,3,0,0,989, - 990,7,5,0,0,990,991,7,12,0,0,991,992,7,0,0,0,992,993,7,12,0,0,993,994,7, - 5,0,0,994,995,7,12,0,0,995,204,1,0,0,0,996,1000,8,32,0,0,997,998,5,47,0, - 0,998,1000,8,33,0,0,999,996,1,0,0,0,999,997,1,0,0,0,1000,206,1,0,0,0,1001, - 1003,3,205,95,0,1002,1001,1,0,0,0,1003,1004,1,0,0,0,1004,1002,1,0,0,0,1004, - 1005,1,0,0,0,1005,208,1,0,0,0,1006,1007,3,207,96,0,1007,1008,1,0,0,0,1008, - 1009,6,97,20,0,1009,210,1,0,0,0,1010,1011,3,85,35,0,1011,1012,1,0,0,0,1012, - 1013,6,98,21,0,1013,212,1,0,0,0,1014,1015,3,57,21,0,1015,1016,1,0,0,0,1016, - 1017,6,99,10,0,1017,214,1,0,0,0,1018,1019,3,59,22,0,1019,1020,1,0,0,0,1020, - 1021,6,100,10,0,1021,216,1,0,0,0,1022,1023,3,61,23,0,1023,1024,1,0,0,0, - 1024,1025,6,101,10,0,1025,218,1,0,0,0,1026,1027,3,63,24,0,1027,1028,1,0, - 0,0,1028,1029,6,102,15,0,1029,1030,6,102,11,0,1030,220,1,0,0,0,1031,1032, - 3,105,45,0,1032,1033,1,0,0,0,1033,1034,6,103,22,0,1034,222,1,0,0,0,1035, - 1036,3,101,43,0,1036,1037,1,0,0,0,1037,1038,6,104,18,0,1038,224,1,0,0,0, - 1039,1040,3,129,57,0,1040,1041,1,0,0,0,1041,1042,6,105,23,0,1042,226,1, - 0,0,0,1043,1044,3,163,74,0,1044,1045,1,0,0,0,1045,1046,6,106,24,0,1046, - 228,1,0,0,0,1047,1052,3,67,26,0,1048,1052,3,65,25,0,1049,1052,3,81,33,0, - 1050,1052,3,155,70,0,1051,1047,1,0,0,0,1051,1048,1,0,0,0,1051,1049,1,0, - 0,0,1051,1050,1,0,0,0,1052,230,1,0,0,0,1053,1056,3,67,26,0,1054,1056,3, - 155,70,0,1055,1053,1,0,0,0,1055,1054,1,0,0,0,1056,1060,1,0,0,0,1057,1059, - 3,229,107,0,1058,1057,1,0,0,0,1059,1062,1,0,0,0,1060,1058,1,0,0,0,1060, - 1061,1,0,0,0,1061,1073,1,0,0,0,1062,1060,1,0,0,0,1063,1066,3,81,33,0,1064, - 1066,3,75,30,0,1065,1063,1,0,0,0,1065,1064,1,0,0,0,1066,1068,1,0,0,0,1067, - 1069,3,229,107,0,1068,1067,1,0,0,0,1069,1070,1,0,0,0,1070,1068,1,0,0,0, - 1070,1071,1,0,0,0,1071,1073,1,0,0,0,1072,1055,1,0,0,0,1072,1065,1,0,0,0, - 1073,232,1,0,0,0,1074,1077,3,231,108,0,1075,1077,3,171,78,0,1076,1074,1, - 0,0,0,1076,1075,1,0,0,0,1077,1078,1,0,0,0,1078,1076,1,0,0,0,1078,1079,1, - 0,0,0,1079,234,1,0,0,0,1080,1081,3,57,21,0,1081,1082,1,0,0,0,1082,1083, - 6,110,10,0,1083,236,1,0,0,0,1084,1085,3,59,22,0,1085,1086,1,0,0,0,1086, - 1087,6,111,10,0,1087,238,1,0,0,0,1088,1089,3,61,23,0,1089,1090,1,0,0,0, - 1090,1091,6,112,10,0,1091,240,1,0,0,0,1092,1093,3,63,24,0,1093,1094,1,0, - 0,0,1094,1095,6,113,15,0,1095,1096,6,113,11,0,1096,242,1,0,0,0,1097,1098, - 3,97,41,0,1098,1099,1,0,0,0,1099,1100,6,114,19,0,1100,244,1,0,0,0,1101, - 1102,3,101,43,0,1102,1103,1,0,0,0,1103,1104,6,115,18,0,1104,246,1,0,0,0, - 1105,1106,3,105,45,0,1106,1107,1,0,0,0,1107,1108,6,116,22,0,1108,248,1, - 0,0,0,1109,1110,3,129,57,0,1110,1111,1,0,0,0,1111,1112,6,117,23,0,1112, - 250,1,0,0,0,1113,1114,3,163,74,0,1114,1115,1,0,0,0,1115,1116,6,118,24,0, - 1116,252,1,0,0,0,1117,1118,7,12,0,0,1118,1119,7,2,0,0,1119,254,1,0,0,0, - 1120,1121,3,233,109,0,1121,1122,1,0,0,0,1122,1123,6,120,25,0,1123,256,1, - 0,0,0,1124,1125,3,57,21,0,1125,1126,1,0,0,0,1126,1127,6,121,10,0,1127,258, - 1,0,0,0,1128,1129,3,59,22,0,1129,1130,1,0,0,0,1130,1131,6,122,10,0,1131, - 260,1,0,0,0,1132,1133,3,61,23,0,1133,1134,1,0,0,0,1134,1135,6,123,10,0, - 1135,262,1,0,0,0,1136,1137,3,63,24,0,1137,1138,1,0,0,0,1138,1139,6,124, - 15,0,1139,1140,6,124,11,0,1140,264,1,0,0,0,1141,1142,3,165,75,0,1142,1143, - 1,0,0,0,1143,1144,6,125,13,0,1144,1145,6,125,26,0,1145,266,1,0,0,0,1146, - 1147,7,7,0,0,1147,1148,7,9,0,0,1148,1149,1,0,0,0,1149,1150,6,126,27,0,1150, - 268,1,0,0,0,1151,1152,7,19,0,0,1152,1153,7,1,0,0,1153,1154,7,5,0,0,1154, - 1155,7,10,0,0,1155,1156,1,0,0,0,1156,1157,6,127,27,0,1157,270,1,0,0,0,1158, - 1159,8,34,0,0,1159,272,1,0,0,0,1160,1162,3,271,128,0,1161,1160,1,0,0,0, - 1162,1163,1,0,0,0,1163,1161,1,0,0,0,1163,1164,1,0,0,0,1164,1165,1,0,0,0, - 1165,1166,3,337,161,0,1166,1168,1,0,0,0,1167,1161,1,0,0,0,1167,1168,1,0, - 0,0,1168,1170,1,0,0,0,1169,1171,3,271,128,0,1170,1169,1,0,0,0,1171,1172, - 1,0,0,0,1172,1170,1,0,0,0,1172,1173,1,0,0,0,1173,274,1,0,0,0,1174,1175, - 3,273,129,0,1175,1176,1,0,0,0,1176,1177,6,130,28,0,1177,276,1,0,0,0,1178, - 1179,3,57,21,0,1179,1180,1,0,0,0,1180,1181,6,131,10,0,1181,278,1,0,0,0, - 1182,1183,3,59,22,0,1183,1184,1,0,0,0,1184,1185,6,132,10,0,1185,280,1,0, - 0,0,1186,1187,3,61,23,0,1187,1188,1,0,0,0,1188,1189,6,133,10,0,1189,282, - 1,0,0,0,1190,1191,3,63,24,0,1191,1192,1,0,0,0,1192,1193,6,134,15,0,1193, - 1194,6,134,11,0,1194,1195,6,134,11,0,1195,284,1,0,0,0,1196,1197,3,97,41, - 0,1197,1198,1,0,0,0,1198,1199,6,135,19,0,1199,286,1,0,0,0,1200,1201,3,101, - 43,0,1201,1202,1,0,0,0,1202,1203,6,136,18,0,1203,288,1,0,0,0,1204,1205, - 3,105,45,0,1205,1206,1,0,0,0,1206,1207,6,137,22,0,1207,290,1,0,0,0,1208, - 1209,3,269,127,0,1209,1210,1,0,0,0,1210,1211,6,138,29,0,1211,292,1,0,0, - 0,1212,1213,3,233,109,0,1213,1214,1,0,0,0,1214,1215,6,139,25,0,1215,294, - 1,0,0,0,1216,1217,3,173,79,0,1217,1218,1,0,0,0,1218,1219,6,140,30,0,1219, - 296,1,0,0,0,1220,1221,3,129,57,0,1221,1222,1,0,0,0,1222,1223,6,141,23,0, - 1223,298,1,0,0,0,1224,1225,3,163,74,0,1225,1226,1,0,0,0,1226,1227,6,142, - 24,0,1227,300,1,0,0,0,1228,1229,3,57,21,0,1229,1230,1,0,0,0,1230,1231,6, - 143,10,0,1231,302,1,0,0,0,1232,1233,3,59,22,0,1233,1234,1,0,0,0,1234,1235, - 6,144,10,0,1235,304,1,0,0,0,1236,1237,3,61,23,0,1237,1238,1,0,0,0,1238, - 1239,6,145,10,0,1239,306,1,0,0,0,1240,1241,3,63,24,0,1241,1242,1,0,0,0, - 1242,1243,6,146,15,0,1243,1244,6,146,11,0,1244,308,1,0,0,0,1245,1246,3, - 105,45,0,1246,1247,1,0,0,0,1247,1248,6,147,22,0,1248,310,1,0,0,0,1249,1250, - 3,129,57,0,1250,1251,1,0,0,0,1251,1252,6,148,23,0,1252,312,1,0,0,0,1253, - 1254,3,163,74,0,1254,1255,1,0,0,0,1255,1256,6,149,24,0,1256,314,1,0,0,0, - 1257,1258,3,173,79,0,1258,1259,1,0,0,0,1259,1260,6,150,30,0,1260,316,1, - 0,0,0,1261,1262,3,169,77,0,1262,1263,1,0,0,0,1263,1264,6,151,31,0,1264, - 318,1,0,0,0,1265,1266,3,57,21,0,1266,1267,1,0,0,0,1267,1268,6,152,10,0, - 1268,320,1,0,0,0,1269,1270,3,59,22,0,1270,1271,1,0,0,0,1271,1272,6,153, - 10,0,1272,322,1,0,0,0,1273,1274,3,61,23,0,1274,1275,1,0,0,0,1275,1276,6, - 154,10,0,1276,324,1,0,0,0,1277,1278,3,63,24,0,1278,1279,1,0,0,0,1279,1280, - 6,155,15,0,1280,1281,6,155,11,0,1281,326,1,0,0,0,1282,1283,7,1,0,0,1283, - 1284,7,9,0,0,1284,1285,7,15,0,0,1285,1286,7,7,0,0,1286,328,1,0,0,0,1287, - 1288,3,57,21,0,1288,1289,1,0,0,0,1289,1290,6,157,10,0,1290,330,1,0,0,0, - 1291,1292,3,59,22,0,1292,1293,1,0,0,0,1293,1294,6,158,10,0,1294,332,1,0, - 0,0,1295,1296,3,61,23,0,1296,1297,1,0,0,0,1297,1298,6,159,10,0,1298,334, - 1,0,0,0,1299,1300,3,167,76,0,1300,1301,1,0,0,0,1301,1302,6,160,16,0,1302, - 1303,6,160,11,0,1303,336,1,0,0,0,1304,1305,5,58,0,0,1305,338,1,0,0,0,1306, - 1312,3,75,30,0,1307,1312,3,65,25,0,1308,1312,3,105,45,0,1309,1312,3,67, - 26,0,1310,1312,3,81,33,0,1311,1306,1,0,0,0,1311,1307,1,0,0,0,1311,1308, - 1,0,0,0,1311,1309,1,0,0,0,1311,1310,1,0,0,0,1312,1313,1,0,0,0,1313,1311, - 1,0,0,0,1313,1314,1,0,0,0,1314,340,1,0,0,0,1315,1316,3,57,21,0,1316,1317, - 1,0,0,0,1317,1318,6,163,10,0,1318,342,1,0,0,0,1319,1320,3,59,22,0,1320, - 1321,1,0,0,0,1321,1322,6,164,10,0,1322,344,1,0,0,0,1323,1324,3,61,23,0, - 1324,1325,1,0,0,0,1325,1326,6,165,10,0,1326,346,1,0,0,0,1327,1328,3,63, - 24,0,1328,1329,1,0,0,0,1329,1330,6,166,15,0,1330,1331,6,166,11,0,1331,348, - 1,0,0,0,1332,1333,3,337,161,0,1333,1334,1,0,0,0,1334,1335,6,167,17,0,1335, - 350,1,0,0,0,1336,1337,3,101,43,0,1337,1338,1,0,0,0,1338,1339,6,168,18,0, - 1339,352,1,0,0,0,1340,1341,3,105,45,0,1341,1342,1,0,0,0,1342,1343,6,169, - 22,0,1343,354,1,0,0,0,1344,1345,3,267,126,0,1345,1346,1,0,0,0,1346,1347, - 6,170,32,0,1347,1348,6,170,33,0,1348,356,1,0,0,0,1349,1350,3,207,96,0,1350, - 1351,1,0,0,0,1351,1352,6,171,20,0,1352,358,1,0,0,0,1353,1354,3,85,35,0, - 1354,1355,1,0,0,0,1355,1356,6,172,21,0,1356,360,1,0,0,0,1357,1358,3,57, - 21,0,1358,1359,1,0,0,0,1359,1360,6,173,10,0,1360,362,1,0,0,0,1361,1362, - 3,59,22,0,1362,1363,1,0,0,0,1363,1364,6,174,10,0,1364,364,1,0,0,0,1365, - 1366,3,61,23,0,1366,1367,1,0,0,0,1367,1368,6,175,10,0,1368,366,1,0,0,0, - 1369,1370,3,63,24,0,1370,1371,1,0,0,0,1371,1372,6,176,15,0,1372,1373,6, - 176,11,0,1373,1374,6,176,11,0,1374,368,1,0,0,0,1375,1376,3,101,43,0,1376, - 1377,1,0,0,0,1377,1378,6,177,18,0,1378,370,1,0,0,0,1379,1380,3,105,45,0, - 1380,1381,1,0,0,0,1381,1382,6,178,22,0,1382,372,1,0,0,0,1383,1384,3,233, - 109,0,1384,1385,1,0,0,0,1385,1386,6,179,25,0,1386,374,1,0,0,0,1387,1388, - 3,57,21,0,1388,1389,1,0,0,0,1389,1390,6,180,10,0,1390,376,1,0,0,0,1391, - 1392,3,59,22,0,1392,1393,1,0,0,0,1393,1394,6,181,10,0,1394,378,1,0,0,0, - 1395,1396,3,61,23,0,1396,1397,1,0,0,0,1397,1398,6,182,10,0,1398,380,1,0, - 0,0,1399,1400,3,63,24,0,1400,1401,1,0,0,0,1401,1402,6,183,15,0,1402,1403, - 6,183,11,0,1403,382,1,0,0,0,1404,1405,3,207,96,0,1405,1406,1,0,0,0,1406, - 1407,6,184,20,0,1407,1408,6,184,11,0,1408,1409,6,184,34,0,1409,384,1,0, - 0,0,1410,1411,3,85,35,0,1411,1412,1,0,0,0,1412,1413,6,185,21,0,1413,1414, - 6,185,11,0,1414,1415,6,185,34,0,1415,386,1,0,0,0,1416,1417,3,57,21,0,1417, - 1418,1,0,0,0,1418,1419,6,186,10,0,1419,388,1,0,0,0,1420,1421,3,59,22,0, - 1421,1422,1,0,0,0,1422,1423,6,187,10,0,1423,390,1,0,0,0,1424,1425,3,61, - 23,0,1425,1426,1,0,0,0,1426,1427,6,188,10,0,1427,392,1,0,0,0,1428,1429, - 3,337,161,0,1429,1430,1,0,0,0,1430,1431,6,189,17,0,1431,1432,6,189,11,0, - 1432,1433,6,189,9,0,1433,394,1,0,0,0,1434,1435,3,101,43,0,1435,1436,1,0, - 0,0,1436,1437,6,190,18,0,1437,1438,6,190,11,0,1438,1439,6,190,9,0,1439, - 396,1,0,0,0,1440,1441,3,57,21,0,1441,1442,1,0,0,0,1442,1443,6,191,10,0, - 1443,398,1,0,0,0,1444,1445,3,59,22,0,1445,1446,1,0,0,0,1446,1447,6,192, - 10,0,1447,400,1,0,0,0,1448,1449,3,61,23,0,1449,1450,1,0,0,0,1450,1451,6, - 193,10,0,1451,402,1,0,0,0,1452,1453,3,173,79,0,1453,1454,1,0,0,0,1454,1455, - 6,194,11,0,1455,1456,6,194,0,0,1456,1457,6,194,30,0,1457,404,1,0,0,0,1458, - 1459,3,169,77,0,1459,1460,1,0,0,0,1460,1461,6,195,11,0,1461,1462,6,195, - 0,0,1462,1463,6,195,31,0,1463,406,1,0,0,0,1464,1465,3,91,38,0,1465,1466, - 1,0,0,0,1466,1467,6,196,11,0,1467,1468,6,196,0,0,1468,1469,6,196,35,0,1469, - 408,1,0,0,0,1470,1471,3,63,24,0,1471,1472,1,0,0,0,1472,1473,6,197,15,0, - 1473,1474,6,197,11,0,1474,410,1,0,0,0,65,0,1,2,3,4,5,6,7,8,9,10,11,12,13, - 14,588,598,602,605,614,616,627,646,651,660,667,672,674,685,693,696,698, - 703,708,714,721,726,732,735,743,747,874,879,886,888,904,909,914,916,922, - 999,1004,1051,1055,1060,1065,1070,1072,1076,1078,1163,1167,1172,1311,1313, - 36,5,1,0,5,4,0,5,6,0,5,2,0,5,3,0,5,8,0,5,5,0,5,9,0,5,11,0,5,13,0,0,1,0, - 4,0,0,7,19,0,7,65,0,5,0,0,7,25,0,7,66,0,7,104,0,7,34,0,7,32,0,7,76,0,7, - 26,0,7,36,0,7,48,0,7,64,0,7,80,0,5,10,0,5,7,0,7,90,0,7,89,0,7,68,0,7,67, - 0,7,88,0,5,12,0,5,14,0,7,29,0]; + 18,1,18,1,19,4,19,578,8,19,11,19,12,19,579,1,19,1,19,1,20,1,20,1,20,1,20, + 5,20,588,8,20,10,20,12,20,591,9,20,1,20,3,20,594,8,20,1,20,3,20,597,8,20, + 1,20,1,20,1,21,1,21,1,21,1,21,1,21,5,21,606,8,21,10,21,12,21,609,9,21,1, + 21,1,21,1,21,1,21,1,21,1,22,4,22,617,8,22,11,22,12,22,618,1,22,1,22,1,23, + 1,23,1,23,1,23,1,24,1,24,1,25,1,25,1,26,1,26,1,26,1,27,1,27,1,28,1,28,3, + 28,638,8,28,1,28,4,28,641,8,28,11,28,12,28,642,1,29,1,29,1,30,1,30,1,31, + 1,31,1,31,3,31,652,8,31,1,32,1,32,1,33,1,33,1,33,3,33,659,8,33,1,34,1,34, + 1,34,5,34,664,8,34,10,34,12,34,667,9,34,1,34,1,34,1,34,1,34,1,34,1,34,5, + 34,675,8,34,10,34,12,34,678,9,34,1,34,1,34,1,34,1,34,1,34,3,34,685,8,34, + 1,34,3,34,688,8,34,3,34,690,8,34,1,35,4,35,693,8,35,11,35,12,35,694,1,36, + 4,36,698,8,36,11,36,12,36,699,1,36,1,36,5,36,704,8,36,10,36,12,36,707,9, + 36,1,36,1,36,4,36,711,8,36,11,36,12,36,712,1,36,4,36,716,8,36,11,36,12, + 36,717,1,36,1,36,5,36,722,8,36,10,36,12,36,725,9,36,3,36,727,8,36,1,36, + 1,36,1,36,1,36,4,36,733,8,36,11,36,12,36,734,1,36,1,36,3,36,739,8,36,1, + 37,1,37,1,37,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39,1,40,1,40,1,41,1,41, + 1,41,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1,44,1,44,1,45,1,45,1,45,1,45,1, + 45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,48,1,48,1,48,1,49, + 1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,52,1,52,1,52,1, + 52,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55, + 1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,59,1,59,1,59,1,59,1, + 59,1,60,1,60,1,60,1,61,1,61,1,61,1,62,1,62,1,62,1,63,1,63,1,64,1,64,1,64, + 1,65,1,65,1,66,1,66,1,66,1,67,1,67,1,68,1,68,1,69,1,69,1,70,1,70,1,71,1, + 71,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,74,1,74,1,74,3,74, + 871,8,74,1,74,5,74,874,8,74,10,74,12,74,877,9,74,1,74,1,74,4,74,881,8,74, + 11,74,12,74,882,3,74,885,8,74,1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1, + 76,1,76,1,77,1,77,5,77,899,8,77,10,77,12,77,902,9,77,1,77,1,77,3,77,906, + 8,77,1,77,4,77,909,8,77,11,77,12,77,910,3,77,913,8,77,1,78,1,78,4,78,917, + 8,78,11,78,12,78,918,1,78,1,78,1,79,1,79,1,80,1,80,1,80,1,80,1,81,1,81, + 1,81,1,81,1,82,1,82,1,82,1,82,1,83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1, + 84,1,84,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,88, + 1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,91,1,91,1, + 91,1,91,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,94, + 1,94,1,94,1,94,1,94,1,95,1,95,1,95,3,95,996,8,95,1,96,4,96,999,8,96,11, + 96,12,96,1000,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1, + 99,1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,102,1,102,1,102,1, + 102,1,102,1,103,1,103,1,103,1,103,1,104,1,104,1,104,1,104,1,105,1,105,1, + 105,1,105,1,105,1,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,3, + 107,1050,8,107,1,108,1,108,3,108,1054,8,108,1,108,5,108,1057,8,108,10,108, + 12,108,1060,9,108,1,108,1,108,3,108,1064,8,108,1,108,4,108,1067,8,108,11, + 108,12,108,1068,3,108,1071,8,108,1,109,1,109,4,109,1075,8,109,11,109,12, + 109,1076,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,112,1,112,1, + 112,1,112,1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114,1,114,1,115,1, + 115,1,115,1,115,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117,1,117,1, + 118,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1, + 121,1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123,1, + 124,1,124,1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,126,1,126,1, + 126,1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,128,1,128,1, + 129,4,129,1162,8,129,11,129,12,129,1163,1,129,1,129,3,129,1168,8,129,1, + 129,4,129,1171,8,129,11,129,12,129,1172,1,130,1,130,1,130,1,130,1,131,1, + 131,1,131,1,131,1,132,1,132,1,132,1,132,1,133,1,133,1,133,1,133,1,134,1, + 134,1,134,1,134,1,134,1,134,1,135,1,135,1,135,1,135,1,136,1,136,1,136,1, + 136,1,137,1,137,1,137,1,137,1,138,1,138,1,138,1,138,1,139,1,139,1,139,1, + 139,1,140,1,140,1,140,1,140,1,141,1,141,1,141,1,141,1,141,1,142,1,142,1, + 142,1,142,1,142,1,143,1,143,1,143,1,143,1,144,1,144,1,144,1,144,1,145,1, + 145,1,145,1,145,1,146,1,146,1,146,1,146,1,146,1,147,1,147,1,147,1,147,1, + 148,1,148,1,148,1,148,1,148,1,149,1,149,1,149,1,149,1,149,1,150,1,150,1, + 150,1,150,1,151,1,151,1,151,1,151,1,152,1,152,1,152,1,152,1,153,1,153,1, + 153,1,153,1,154,1,154,1,154,1,154,1,155,1,155,1,155,1,155,1,155,1,156,1, + 156,1,156,1,156,1,156,1,157,1,157,1,157,1,157,1,158,1,158,1,158,1,158,1, + 159,1,159,1,159,1,159,1,160,1,160,1,160,1,160,1,160,1,161,1,161,1,162,1, + 162,1,162,1,162,1,162,4,162,1316,8,162,11,162,12,162,1317,1,163,1,163,1, + 163,1,163,1,164,1,164,1,164,1,164,1,165,1,165,1,165,1,165,1,166,1,166,1, + 166,1,166,1,166,1,167,1,167,1,167,1,167,1,168,1,168,1,168,1,168,1,169,1, + 169,1,169,1,169,1,170,1,170,1,170,1,170,1,170,1,171,1,171,1,171,1,171,1, + 172,1,172,1,172,1,172,1,173,1,173,1,173,1,173,1,174,1,174,1,174,1,174,1, + 175,1,175,1,175,1,175,1,176,1,176,1,176,1,176,1,176,1,176,1,177,1,177,1, + 177,1,177,1,178,1,178,1,178,1,178,1,179,1,179,1,179,1,179,1,180,1,180,1, + 180,1,180,1,181,1,181,1,181,1,181,1,182,1,182,1,182,1,182,1,183,1,183,1, + 183,1,183,1,183,1,184,1,184,1,184,1,184,1,184,1,184,1,185,1,185,1,185,1, + 185,1,185,1,185,1,186,1,186,1,186,1,186,1,187,1,187,1,187,1,187,1,188,1, + 188,1,188,1,188,1,189,1,189,1,189,1,189,1,189,1,189,1,190,1,190,1,190,1, + 190,1,190,1,190,1,191,1,191,1,191,1,191,1,192,1,192,1,192,1,192,1,193,1, + 193,1,193,1,193,1,194,1,194,1,194,1,194,1,194,1,194,1,195,1,195,1,195,1, + 195,1,195,1,195,1,196,1,196,1,196,1,196,1,196,1,196,1,197,1,197,1,197,1, + 197,1,197,2,607,676,0,198,15,1,17,2,19,3,21,4,23,5,25,6,27,7,29,8,31,9, + 33,10,35,11,37,12,39,13,41,14,43,15,45,16,47,17,49,18,51,19,53,20,55,21, + 57,22,59,23,61,24,63,0,65,0,67,0,69,0,71,0,73,0,75,0,77,0,79,0,81,0,83, + 25,85,26,87,27,89,28,91,29,93,30,95,31,97,32,99,33,101,34,103,35,105,36, + 107,37,109,38,111,39,113,40,115,41,117,42,119,43,121,44,123,45,125,46,127, + 47,129,48,131,49,133,50,135,51,137,52,139,53,141,54,143,55,145,56,147,57, + 149,58,151,59,153,60,155,61,157,62,159,63,161,0,163,64,165,65,167,66,169, + 67,171,0,173,68,175,69,177,70,179,71,181,0,183,0,185,72,187,73,189,74,191, + 0,193,0,195,0,197,0,199,0,201,0,203,75,205,0,207,76,209,0,211,0,213,77, + 215,78,217,79,219,0,221,0,223,0,225,0,227,0,229,0,231,0,233,80,235,81,237, + 82,239,83,241,0,243,0,245,0,247,0,249,0,251,0,253,84,255,0,257,85,259,86, + 261,87,263,0,265,0,267,88,269,89,271,0,273,90,275,0,277,91,279,92,281,93, + 283,0,285,0,287,0,289,0,291,0,293,0,295,0,297,0,299,0,301,94,303,95,305, + 96,307,0,309,0,311,0,313,0,315,0,317,0,319,97,321,98,323,99,325,0,327,100, + 329,101,331,102,333,103,335,0,337,104,339,105,341,106,343,107,345,108,347, + 0,349,0,351,0,353,0,355,0,357,0,359,0,361,109,363,110,365,111,367,0,369, + 0,371,0,373,0,375,112,377,113,379,114,381,0,383,0,385,0,387,115,389,116, + 391,117,393,0,395,0,397,118,399,119,401,120,403,0,405,0,407,0,409,0,15, + 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,35,2,0,68,68,100,100,2,0,73,73,105,105, + 2,0,83,83,115,115,2,0,69,69,101,101,2,0,67,67,99,99,2,0,84,84,116,116,2, + 0,82,82,114,114,2,0,79,79,111,111,2,0,80,80,112,112,2,0,78,78,110,110,2, + 0,72,72,104,104,2,0,86,86,118,118,2,0,65,65,97,97,2,0,76,76,108,108,2,0, + 88,88,120,120,2,0,70,70,102,102,2,0,77,77,109,109,2,0,71,71,103,103,2,0, + 75,75,107,107,2,0,87,87,119,119,2,0,85,85,117,117,6,0,9,10,13,13,32,32, + 47,47,91,91,93,93,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1,0,48,57,2,0,65, + 90,97,122,8,0,34,34,78,78,82,82,84,84,92,92,110,110,114,114,116,116,4,0, + 10,10,13,13,34,34,92,92,2,0,43,43,45,45,1,0,96,96,2,0,66,66,98,98,2,0,89, + 89,121,121,11,0,9,10,13,13,32,32,34,34,44,44,47,47,58,58,61,61,91,91,93, + 93,124,124,2,0,42,42,47,47,11,0,9,10,13,13,32,32,34,35,44,44,47,47,58,58, + 60,60,62,63,92,92,124,124,1507,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0, + 21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0, + 0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0, + 43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0, + 0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,1,61,1,0,0,0,1,83,1,0,0,0,1, + 85,1,0,0,0,1,87,1,0,0,0,1,89,1,0,0,0,1,91,1,0,0,0,1,93,1,0,0,0,1,95,1,0, + 0,0,1,97,1,0,0,0,1,99,1,0,0,0,1,101,1,0,0,0,1,103,1,0,0,0,1,105,1,0,0,0, + 1,107,1,0,0,0,1,109,1,0,0,0,1,111,1,0,0,0,1,113,1,0,0,0,1,115,1,0,0,0,1, + 117,1,0,0,0,1,119,1,0,0,0,1,121,1,0,0,0,1,123,1,0,0,0,1,125,1,0,0,0,1,127, + 1,0,0,0,1,129,1,0,0,0,1,131,1,0,0,0,1,133,1,0,0,0,1,135,1,0,0,0,1,137,1, + 0,0,0,1,139,1,0,0,0,1,141,1,0,0,0,1,143,1,0,0,0,1,145,1,0,0,0,1,147,1,0, + 0,0,1,149,1,0,0,0,1,151,1,0,0,0,1,153,1,0,0,0,1,155,1,0,0,0,1,157,1,0,0, + 0,1,159,1,0,0,0,1,161,1,0,0,0,1,163,1,0,0,0,1,165,1,0,0,0,1,167,1,0,0,0, + 1,169,1,0,0,0,1,173,1,0,0,0,1,175,1,0,0,0,1,177,1,0,0,0,1,179,1,0,0,0,2, + 181,1,0,0,0,2,183,1,0,0,0,2,185,1,0,0,0,2,187,1,0,0,0,2,189,1,0,0,0,3,191, + 1,0,0,0,3,193,1,0,0,0,3,195,1,0,0,0,3,197,1,0,0,0,3,199,1,0,0,0,3,201,1, + 0,0,0,3,203,1,0,0,0,3,207,1,0,0,0,3,209,1,0,0,0,3,211,1,0,0,0,3,213,1,0, + 0,0,3,215,1,0,0,0,3,217,1,0,0,0,4,219,1,0,0,0,4,221,1,0,0,0,4,223,1,0,0, + 0,4,225,1,0,0,0,4,227,1,0,0,0,4,233,1,0,0,0,4,235,1,0,0,0,4,237,1,0,0,0, + 4,239,1,0,0,0,5,241,1,0,0,0,5,243,1,0,0,0,5,245,1,0,0,0,5,247,1,0,0,0,5, + 249,1,0,0,0,5,251,1,0,0,0,5,253,1,0,0,0,5,255,1,0,0,0,5,257,1,0,0,0,5,259, + 1,0,0,0,5,261,1,0,0,0,6,263,1,0,0,0,6,265,1,0,0,0,6,267,1,0,0,0,6,269,1, + 0,0,0,6,273,1,0,0,0,6,275,1,0,0,0,6,277,1,0,0,0,6,279,1,0,0,0,6,281,1,0, + 0,0,7,283,1,0,0,0,7,285,1,0,0,0,7,287,1,0,0,0,7,289,1,0,0,0,7,291,1,0,0, + 0,7,293,1,0,0,0,7,295,1,0,0,0,7,297,1,0,0,0,7,299,1,0,0,0,7,301,1,0,0,0, + 7,303,1,0,0,0,7,305,1,0,0,0,8,307,1,0,0,0,8,309,1,0,0,0,8,311,1,0,0,0,8, + 313,1,0,0,0,8,315,1,0,0,0,8,317,1,0,0,0,8,319,1,0,0,0,8,321,1,0,0,0,8,323, + 1,0,0,0,9,325,1,0,0,0,9,327,1,0,0,0,9,329,1,0,0,0,9,331,1,0,0,0,9,333,1, + 0,0,0,10,335,1,0,0,0,10,337,1,0,0,0,10,339,1,0,0,0,10,341,1,0,0,0,10,343, + 1,0,0,0,10,345,1,0,0,0,11,347,1,0,0,0,11,349,1,0,0,0,11,351,1,0,0,0,11, + 353,1,0,0,0,11,355,1,0,0,0,11,357,1,0,0,0,11,359,1,0,0,0,11,361,1,0,0,0, + 11,363,1,0,0,0,11,365,1,0,0,0,12,367,1,0,0,0,12,369,1,0,0,0,12,371,1,0, + 0,0,12,373,1,0,0,0,12,375,1,0,0,0,12,377,1,0,0,0,12,379,1,0,0,0,13,381, + 1,0,0,0,13,383,1,0,0,0,13,385,1,0,0,0,13,387,1,0,0,0,13,389,1,0,0,0,13, + 391,1,0,0,0,14,393,1,0,0,0,14,395,1,0,0,0,14,397,1,0,0,0,14,399,1,0,0,0, + 14,401,1,0,0,0,14,403,1,0,0,0,14,405,1,0,0,0,14,407,1,0,0,0,14,409,1,0, + 0,0,15,411,1,0,0,0,17,421,1,0,0,0,19,428,1,0,0,0,21,437,1,0,0,0,23,444, + 1,0,0,0,25,454,1,0,0,0,27,461,1,0,0,0,29,468,1,0,0,0,31,475,1,0,0,0,33, + 483,1,0,0,0,35,495,1,0,0,0,37,504,1,0,0,0,39,510,1,0,0,0,41,517,1,0,0,0, + 43,524,1,0,0,0,45,532,1,0,0,0,47,540,1,0,0,0,49,555,1,0,0,0,51,565,1,0, + 0,0,53,577,1,0,0,0,55,583,1,0,0,0,57,600,1,0,0,0,59,616,1,0,0,0,61,622, + 1,0,0,0,63,626,1,0,0,0,65,628,1,0,0,0,67,630,1,0,0,0,69,633,1,0,0,0,71, + 635,1,0,0,0,73,644,1,0,0,0,75,646,1,0,0,0,77,651,1,0,0,0,79,653,1,0,0,0, + 81,658,1,0,0,0,83,689,1,0,0,0,85,692,1,0,0,0,87,738,1,0,0,0,89,740,1,0, + 0,0,91,743,1,0,0,0,93,747,1,0,0,0,95,751,1,0,0,0,97,753,1,0,0,0,99,756, + 1,0,0,0,101,758,1,0,0,0,103,763,1,0,0,0,105,765,1,0,0,0,107,771,1,0,0,0, + 109,777,1,0,0,0,111,780,1,0,0,0,113,783,1,0,0,0,115,788,1,0,0,0,117,793, + 1,0,0,0,119,795,1,0,0,0,121,799,1,0,0,0,123,804,1,0,0,0,125,810,1,0,0,0, + 127,813,1,0,0,0,129,815,1,0,0,0,131,821,1,0,0,0,133,823,1,0,0,0,135,828, + 1,0,0,0,137,831,1,0,0,0,139,834,1,0,0,0,141,837,1,0,0,0,143,839,1,0,0,0, + 145,842,1,0,0,0,147,844,1,0,0,0,149,847,1,0,0,0,151,849,1,0,0,0,153,851, + 1,0,0,0,155,853,1,0,0,0,157,855,1,0,0,0,159,857,1,0,0,0,161,863,1,0,0,0, + 163,884,1,0,0,0,165,886,1,0,0,0,167,891,1,0,0,0,169,912,1,0,0,0,171,914, + 1,0,0,0,173,922,1,0,0,0,175,924,1,0,0,0,177,928,1,0,0,0,179,932,1,0,0,0, + 181,936,1,0,0,0,183,941,1,0,0,0,185,946,1,0,0,0,187,950,1,0,0,0,189,954, + 1,0,0,0,191,958,1,0,0,0,193,963,1,0,0,0,195,967,1,0,0,0,197,971,1,0,0,0, + 199,975,1,0,0,0,201,979,1,0,0,0,203,983,1,0,0,0,205,995,1,0,0,0,207,998, + 1,0,0,0,209,1002,1,0,0,0,211,1006,1,0,0,0,213,1010,1,0,0,0,215,1014,1,0, + 0,0,217,1018,1,0,0,0,219,1022,1,0,0,0,221,1027,1,0,0,0,223,1031,1,0,0,0, + 225,1035,1,0,0,0,227,1040,1,0,0,0,229,1049,1,0,0,0,231,1070,1,0,0,0,233, + 1074,1,0,0,0,235,1078,1,0,0,0,237,1082,1,0,0,0,239,1086,1,0,0,0,241,1090, + 1,0,0,0,243,1095,1,0,0,0,245,1099,1,0,0,0,247,1103,1,0,0,0,249,1107,1,0, + 0,0,251,1112,1,0,0,0,253,1117,1,0,0,0,255,1120,1,0,0,0,257,1124,1,0,0,0, + 259,1128,1,0,0,0,261,1132,1,0,0,0,263,1136,1,0,0,0,265,1141,1,0,0,0,267, + 1146,1,0,0,0,269,1151,1,0,0,0,271,1158,1,0,0,0,273,1167,1,0,0,0,275,1174, + 1,0,0,0,277,1178,1,0,0,0,279,1182,1,0,0,0,281,1186,1,0,0,0,283,1190,1,0, + 0,0,285,1196,1,0,0,0,287,1200,1,0,0,0,289,1204,1,0,0,0,291,1208,1,0,0,0, + 293,1212,1,0,0,0,295,1216,1,0,0,0,297,1220,1,0,0,0,299,1225,1,0,0,0,301, + 1230,1,0,0,0,303,1234,1,0,0,0,305,1238,1,0,0,0,307,1242,1,0,0,0,309,1247, + 1,0,0,0,311,1251,1,0,0,0,313,1256,1,0,0,0,315,1261,1,0,0,0,317,1265,1,0, + 0,0,319,1269,1,0,0,0,321,1273,1,0,0,0,323,1277,1,0,0,0,325,1281,1,0,0,0, + 327,1286,1,0,0,0,329,1291,1,0,0,0,331,1295,1,0,0,0,333,1299,1,0,0,0,335, + 1303,1,0,0,0,337,1308,1,0,0,0,339,1315,1,0,0,0,341,1319,1,0,0,0,343,1323, + 1,0,0,0,345,1327,1,0,0,0,347,1331,1,0,0,0,349,1336,1,0,0,0,351,1340,1,0, + 0,0,353,1344,1,0,0,0,355,1348,1,0,0,0,357,1353,1,0,0,0,359,1357,1,0,0,0, + 361,1361,1,0,0,0,363,1365,1,0,0,0,365,1369,1,0,0,0,367,1373,1,0,0,0,369, + 1379,1,0,0,0,371,1383,1,0,0,0,373,1387,1,0,0,0,375,1391,1,0,0,0,377,1395, + 1,0,0,0,379,1399,1,0,0,0,381,1403,1,0,0,0,383,1408,1,0,0,0,385,1414,1,0, + 0,0,387,1420,1,0,0,0,389,1424,1,0,0,0,391,1428,1,0,0,0,393,1432,1,0,0,0, + 395,1438,1,0,0,0,397,1444,1,0,0,0,399,1448,1,0,0,0,401,1452,1,0,0,0,403, + 1456,1,0,0,0,405,1462,1,0,0,0,407,1468,1,0,0,0,409,1474,1,0,0,0,411,412, + 7,0,0,0,412,413,7,1,0,0,413,414,7,2,0,0,414,415,7,2,0,0,415,416,7,3,0,0, + 416,417,7,4,0,0,417,418,7,5,0,0,418,419,1,0,0,0,419,420,6,0,0,0,420,16, + 1,0,0,0,421,422,7,0,0,0,422,423,7,6,0,0,423,424,7,7,0,0,424,425,7,8,0,0, + 425,426,1,0,0,0,426,427,6,1,1,0,427,18,1,0,0,0,428,429,7,3,0,0,429,430, + 7,9,0,0,430,431,7,6,0,0,431,432,7,1,0,0,432,433,7,4,0,0,433,434,7,10,0, + 0,434,435,1,0,0,0,435,436,6,2,2,0,436,20,1,0,0,0,437,438,7,3,0,0,438,439, + 7,11,0,0,439,440,7,12,0,0,440,441,7,13,0,0,441,442,1,0,0,0,442,443,6,3, + 0,0,443,22,1,0,0,0,444,445,7,3,0,0,445,446,7,14,0,0,446,447,7,8,0,0,447, + 448,7,13,0,0,448,449,7,12,0,0,449,450,7,1,0,0,450,451,7,9,0,0,451,452,1, + 0,0,0,452,453,6,4,3,0,453,24,1,0,0,0,454,455,7,15,0,0,455,456,7,6,0,0,456, + 457,7,7,0,0,457,458,7,16,0,0,458,459,1,0,0,0,459,460,6,5,4,0,460,26,1,0, + 0,0,461,462,7,17,0,0,462,463,7,6,0,0,463,464,7,7,0,0,464,465,7,18,0,0,465, + 466,1,0,0,0,466,467,6,6,0,0,467,28,1,0,0,0,468,469,7,18,0,0,469,470,7,3, + 0,0,470,471,7,3,0,0,471,472,7,8,0,0,472,473,1,0,0,0,473,474,6,7,1,0,474, + 30,1,0,0,0,475,476,7,13,0,0,476,477,7,1,0,0,477,478,7,16,0,0,478,479,7, + 1,0,0,479,480,7,5,0,0,480,481,1,0,0,0,481,482,6,8,0,0,482,32,1,0,0,0,483, + 484,7,16,0,0,484,485,7,11,0,0,485,486,5,95,0,0,486,487,7,3,0,0,487,488, + 7,14,0,0,488,489,7,8,0,0,489,490,7,12,0,0,490,491,7,9,0,0,491,492,7,0,0, + 0,492,493,1,0,0,0,493,494,6,9,5,0,494,34,1,0,0,0,495,496,7,6,0,0,496,497, + 7,3,0,0,497,498,7,9,0,0,498,499,7,12,0,0,499,500,7,16,0,0,500,501,7,3,0, + 0,501,502,1,0,0,0,502,503,6,10,6,0,503,36,1,0,0,0,504,505,7,6,0,0,505,506, + 7,7,0,0,506,507,7,19,0,0,507,508,1,0,0,0,508,509,6,11,0,0,509,38,1,0,0, + 0,510,511,7,2,0,0,511,512,7,10,0,0,512,513,7,7,0,0,513,514,7,19,0,0,514, + 515,1,0,0,0,515,516,6,12,7,0,516,40,1,0,0,0,517,518,7,2,0,0,518,519,7,7, + 0,0,519,520,7,6,0,0,520,521,7,5,0,0,521,522,1,0,0,0,522,523,6,13,0,0,523, + 42,1,0,0,0,524,525,7,2,0,0,525,526,7,5,0,0,526,527,7,12,0,0,527,528,7,5, + 0,0,528,529,7,2,0,0,529,530,1,0,0,0,530,531,6,14,0,0,531,44,1,0,0,0,532, + 533,7,19,0,0,533,534,7,10,0,0,534,535,7,3,0,0,535,536,7,6,0,0,536,537,7, + 3,0,0,537,538,1,0,0,0,538,539,6,15,0,0,539,46,1,0,0,0,540,541,4,16,0,0, + 541,542,7,1,0,0,542,543,7,9,0,0,543,544,7,13,0,0,544,545,7,1,0,0,545,546, + 7,9,0,0,546,547,7,3,0,0,547,548,7,2,0,0,548,549,7,5,0,0,549,550,7,12,0, + 0,550,551,7,5,0,0,551,552,7,2,0,0,552,553,1,0,0,0,553,554,6,16,0,0,554, + 48,1,0,0,0,555,556,4,17,1,0,556,557,7,13,0,0,557,558,7,7,0,0,558,559,7, + 7,0,0,559,560,7,18,0,0,560,561,7,20,0,0,561,562,7,8,0,0,562,563,1,0,0,0, + 563,564,6,17,8,0,564,50,1,0,0,0,565,566,4,18,2,0,566,567,7,16,0,0,567,568, + 7,3,0,0,568,569,7,5,0,0,569,570,7,6,0,0,570,571,7,1,0,0,571,572,7,4,0,0, + 572,573,7,2,0,0,573,574,1,0,0,0,574,575,6,18,9,0,575,52,1,0,0,0,576,578, + 8,21,0,0,577,576,1,0,0,0,578,579,1,0,0,0,579,577,1,0,0,0,579,580,1,0,0, + 0,580,581,1,0,0,0,581,582,6,19,0,0,582,54,1,0,0,0,583,584,5,47,0,0,584, + 585,5,47,0,0,585,589,1,0,0,0,586,588,8,22,0,0,587,586,1,0,0,0,588,591,1, + 0,0,0,589,587,1,0,0,0,589,590,1,0,0,0,590,593,1,0,0,0,591,589,1,0,0,0,592, + 594,5,13,0,0,593,592,1,0,0,0,593,594,1,0,0,0,594,596,1,0,0,0,595,597,5, + 10,0,0,596,595,1,0,0,0,596,597,1,0,0,0,597,598,1,0,0,0,598,599,6,20,10, + 0,599,56,1,0,0,0,600,601,5,47,0,0,601,602,5,42,0,0,602,607,1,0,0,0,603, + 606,3,57,21,0,604,606,9,0,0,0,605,603,1,0,0,0,605,604,1,0,0,0,606,609,1, + 0,0,0,607,608,1,0,0,0,607,605,1,0,0,0,608,610,1,0,0,0,609,607,1,0,0,0,610, + 611,5,42,0,0,611,612,5,47,0,0,612,613,1,0,0,0,613,614,6,21,10,0,614,58, + 1,0,0,0,615,617,7,23,0,0,616,615,1,0,0,0,617,618,1,0,0,0,618,616,1,0,0, + 0,618,619,1,0,0,0,619,620,1,0,0,0,620,621,6,22,10,0,621,60,1,0,0,0,622, + 623,5,124,0,0,623,624,1,0,0,0,624,625,6,23,11,0,625,62,1,0,0,0,626,627, + 7,24,0,0,627,64,1,0,0,0,628,629,7,25,0,0,629,66,1,0,0,0,630,631,5,92,0, + 0,631,632,7,26,0,0,632,68,1,0,0,0,633,634,8,27,0,0,634,70,1,0,0,0,635,637, + 7,3,0,0,636,638,7,28,0,0,637,636,1,0,0,0,637,638,1,0,0,0,638,640,1,0,0, + 0,639,641,3,63,24,0,640,639,1,0,0,0,641,642,1,0,0,0,642,640,1,0,0,0,642, + 643,1,0,0,0,643,72,1,0,0,0,644,645,5,64,0,0,645,74,1,0,0,0,646,647,5,96, + 0,0,647,76,1,0,0,0,648,652,8,29,0,0,649,650,5,96,0,0,650,652,5,96,0,0,651, + 648,1,0,0,0,651,649,1,0,0,0,652,78,1,0,0,0,653,654,5,95,0,0,654,80,1,0, + 0,0,655,659,3,65,25,0,656,659,3,63,24,0,657,659,3,79,32,0,658,655,1,0,0, + 0,658,656,1,0,0,0,658,657,1,0,0,0,659,82,1,0,0,0,660,665,5,34,0,0,661,664, + 3,67,26,0,662,664,3,69,27,0,663,661,1,0,0,0,663,662,1,0,0,0,664,667,1,0, + 0,0,665,663,1,0,0,0,665,666,1,0,0,0,666,668,1,0,0,0,667,665,1,0,0,0,668, + 690,5,34,0,0,669,670,5,34,0,0,670,671,5,34,0,0,671,672,5,34,0,0,672,676, + 1,0,0,0,673,675,8,22,0,0,674,673,1,0,0,0,675,678,1,0,0,0,676,677,1,0,0, + 0,676,674,1,0,0,0,677,679,1,0,0,0,678,676,1,0,0,0,679,680,5,34,0,0,680, + 681,5,34,0,0,681,682,5,34,0,0,682,684,1,0,0,0,683,685,5,34,0,0,684,683, + 1,0,0,0,684,685,1,0,0,0,685,687,1,0,0,0,686,688,5,34,0,0,687,686,1,0,0, + 0,687,688,1,0,0,0,688,690,1,0,0,0,689,660,1,0,0,0,689,669,1,0,0,0,690,84, + 1,0,0,0,691,693,3,63,24,0,692,691,1,0,0,0,693,694,1,0,0,0,694,692,1,0,0, + 0,694,695,1,0,0,0,695,86,1,0,0,0,696,698,3,63,24,0,697,696,1,0,0,0,698, + 699,1,0,0,0,699,697,1,0,0,0,699,700,1,0,0,0,700,701,1,0,0,0,701,705,3,103, + 44,0,702,704,3,63,24,0,703,702,1,0,0,0,704,707,1,0,0,0,705,703,1,0,0,0, + 705,706,1,0,0,0,706,739,1,0,0,0,707,705,1,0,0,0,708,710,3,103,44,0,709, + 711,3,63,24,0,710,709,1,0,0,0,711,712,1,0,0,0,712,710,1,0,0,0,712,713,1, + 0,0,0,713,739,1,0,0,0,714,716,3,63,24,0,715,714,1,0,0,0,716,717,1,0,0,0, + 717,715,1,0,0,0,717,718,1,0,0,0,718,726,1,0,0,0,719,723,3,103,44,0,720, + 722,3,63,24,0,721,720,1,0,0,0,722,725,1,0,0,0,723,721,1,0,0,0,723,724,1, + 0,0,0,724,727,1,0,0,0,725,723,1,0,0,0,726,719,1,0,0,0,726,727,1,0,0,0,727, + 728,1,0,0,0,728,729,3,71,28,0,729,739,1,0,0,0,730,732,3,103,44,0,731,733, + 3,63,24,0,732,731,1,0,0,0,733,734,1,0,0,0,734,732,1,0,0,0,734,735,1,0,0, + 0,735,736,1,0,0,0,736,737,3,71,28,0,737,739,1,0,0,0,738,697,1,0,0,0,738, + 708,1,0,0,0,738,715,1,0,0,0,738,730,1,0,0,0,739,88,1,0,0,0,740,741,7,30, + 0,0,741,742,7,31,0,0,742,90,1,0,0,0,743,744,7,12,0,0,744,745,7,9,0,0,745, + 746,7,0,0,0,746,92,1,0,0,0,747,748,7,12,0,0,748,749,7,2,0,0,749,750,7,4, + 0,0,750,94,1,0,0,0,751,752,5,61,0,0,752,96,1,0,0,0,753,754,5,58,0,0,754, + 755,5,58,0,0,755,98,1,0,0,0,756,757,5,44,0,0,757,100,1,0,0,0,758,759,7, + 0,0,0,759,760,7,3,0,0,760,761,7,2,0,0,761,762,7,4,0,0,762,102,1,0,0,0,763, + 764,5,46,0,0,764,104,1,0,0,0,765,766,7,15,0,0,766,767,7,12,0,0,767,768, + 7,13,0,0,768,769,7,2,0,0,769,770,7,3,0,0,770,106,1,0,0,0,771,772,7,15,0, + 0,772,773,7,1,0,0,773,774,7,6,0,0,774,775,7,2,0,0,775,776,7,5,0,0,776,108, + 1,0,0,0,777,778,7,1,0,0,778,779,7,9,0,0,779,110,1,0,0,0,780,781,7,1,0,0, + 781,782,7,2,0,0,782,112,1,0,0,0,783,784,7,13,0,0,784,785,7,12,0,0,785,786, + 7,2,0,0,786,787,7,5,0,0,787,114,1,0,0,0,788,789,7,13,0,0,789,790,7,1,0, + 0,790,791,7,18,0,0,791,792,7,3,0,0,792,116,1,0,0,0,793,794,5,40,0,0,794, + 118,1,0,0,0,795,796,7,9,0,0,796,797,7,7,0,0,797,798,7,5,0,0,798,120,1,0, + 0,0,799,800,7,9,0,0,800,801,7,20,0,0,801,802,7,13,0,0,802,803,7,13,0,0, + 803,122,1,0,0,0,804,805,7,9,0,0,805,806,7,20,0,0,806,807,7,13,0,0,807,808, + 7,13,0,0,808,809,7,2,0,0,809,124,1,0,0,0,810,811,7,7,0,0,811,812,7,6,0, + 0,812,126,1,0,0,0,813,814,5,63,0,0,814,128,1,0,0,0,815,816,7,6,0,0,816, + 817,7,13,0,0,817,818,7,1,0,0,818,819,7,18,0,0,819,820,7,3,0,0,820,130,1, + 0,0,0,821,822,5,41,0,0,822,132,1,0,0,0,823,824,7,5,0,0,824,825,7,6,0,0, + 825,826,7,20,0,0,826,827,7,3,0,0,827,134,1,0,0,0,828,829,5,61,0,0,829,830, + 5,61,0,0,830,136,1,0,0,0,831,832,5,61,0,0,832,833,5,126,0,0,833,138,1,0, + 0,0,834,835,5,33,0,0,835,836,5,61,0,0,836,140,1,0,0,0,837,838,5,60,0,0, + 838,142,1,0,0,0,839,840,5,60,0,0,840,841,5,61,0,0,841,144,1,0,0,0,842,843, + 5,62,0,0,843,146,1,0,0,0,844,845,5,62,0,0,845,846,5,61,0,0,846,148,1,0, + 0,0,847,848,5,43,0,0,848,150,1,0,0,0,849,850,5,45,0,0,850,152,1,0,0,0,851, + 852,5,42,0,0,852,154,1,0,0,0,853,854,5,47,0,0,854,156,1,0,0,0,855,856,5, + 37,0,0,856,158,1,0,0,0,857,858,7,16,0,0,858,859,7,12,0,0,859,860,7,5,0, + 0,860,861,7,4,0,0,861,862,7,10,0,0,862,160,1,0,0,0,863,864,3,45,15,0,864, + 865,1,0,0,0,865,866,6,73,12,0,866,162,1,0,0,0,867,870,3,127,56,0,868,871, + 3,65,25,0,869,871,3,79,32,0,870,868,1,0,0,0,870,869,1,0,0,0,871,875,1,0, + 0,0,872,874,3,81,33,0,873,872,1,0,0,0,874,877,1,0,0,0,875,873,1,0,0,0,875, + 876,1,0,0,0,876,885,1,0,0,0,877,875,1,0,0,0,878,880,3,127,56,0,879,881, + 3,63,24,0,880,879,1,0,0,0,881,882,1,0,0,0,882,880,1,0,0,0,882,883,1,0,0, + 0,883,885,1,0,0,0,884,867,1,0,0,0,884,878,1,0,0,0,885,164,1,0,0,0,886,887, + 5,91,0,0,887,888,1,0,0,0,888,889,6,75,0,0,889,890,6,75,0,0,890,166,1,0, + 0,0,891,892,5,93,0,0,892,893,1,0,0,0,893,894,6,76,11,0,894,895,6,76,11, + 0,895,168,1,0,0,0,896,900,3,65,25,0,897,899,3,81,33,0,898,897,1,0,0,0,899, + 902,1,0,0,0,900,898,1,0,0,0,900,901,1,0,0,0,901,913,1,0,0,0,902,900,1,0, + 0,0,903,906,3,79,32,0,904,906,3,73,29,0,905,903,1,0,0,0,905,904,1,0,0,0, + 906,908,1,0,0,0,907,909,3,81,33,0,908,907,1,0,0,0,909,910,1,0,0,0,910,908, + 1,0,0,0,910,911,1,0,0,0,911,913,1,0,0,0,912,896,1,0,0,0,912,905,1,0,0,0, + 913,170,1,0,0,0,914,916,3,75,30,0,915,917,3,77,31,0,916,915,1,0,0,0,917, + 918,1,0,0,0,918,916,1,0,0,0,918,919,1,0,0,0,919,920,1,0,0,0,920,921,3,75, + 30,0,921,172,1,0,0,0,922,923,3,171,78,0,923,174,1,0,0,0,924,925,3,55,20, + 0,925,926,1,0,0,0,926,927,6,80,10,0,927,176,1,0,0,0,928,929,3,57,21,0,929, + 930,1,0,0,0,930,931,6,81,10,0,931,178,1,0,0,0,932,933,3,59,22,0,933,934, + 1,0,0,0,934,935,6,82,10,0,935,180,1,0,0,0,936,937,3,165,75,0,937,938,1, + 0,0,0,938,939,6,83,13,0,939,940,6,83,14,0,940,182,1,0,0,0,941,942,3,61, + 23,0,942,943,1,0,0,0,943,944,6,84,15,0,944,945,6,84,11,0,945,184,1,0,0, + 0,946,947,3,59,22,0,947,948,1,0,0,0,948,949,6,85,10,0,949,186,1,0,0,0,950, + 951,3,55,20,0,951,952,1,0,0,0,952,953,6,86,10,0,953,188,1,0,0,0,954,955, + 3,57,21,0,955,956,1,0,0,0,956,957,6,87,10,0,957,190,1,0,0,0,958,959,3,61, + 23,0,959,960,1,0,0,0,960,961,6,88,15,0,961,962,6,88,11,0,962,192,1,0,0, + 0,963,964,3,165,75,0,964,965,1,0,0,0,965,966,6,89,13,0,966,194,1,0,0,0, + 967,968,3,167,76,0,968,969,1,0,0,0,969,970,6,90,16,0,970,196,1,0,0,0,971, + 972,3,337,161,0,972,973,1,0,0,0,973,974,6,91,17,0,974,198,1,0,0,0,975,976, + 3,99,42,0,976,977,1,0,0,0,977,978,6,92,18,0,978,200,1,0,0,0,979,980,3,95, + 40,0,980,981,1,0,0,0,981,982,6,93,19,0,982,202,1,0,0,0,983,984,7,16,0,0, + 984,985,7,3,0,0,985,986,7,5,0,0,986,987,7,12,0,0,987,988,7,0,0,0,988,989, + 7,12,0,0,989,990,7,5,0,0,990,991,7,12,0,0,991,204,1,0,0,0,992,996,8,32, + 0,0,993,994,5,47,0,0,994,996,8,33,0,0,995,992,1,0,0,0,995,993,1,0,0,0,996, + 206,1,0,0,0,997,999,3,205,95,0,998,997,1,0,0,0,999,1000,1,0,0,0,1000,998, + 1,0,0,0,1000,1001,1,0,0,0,1001,208,1,0,0,0,1002,1003,3,207,96,0,1003,1004, + 1,0,0,0,1004,1005,6,97,20,0,1005,210,1,0,0,0,1006,1007,3,83,34,0,1007,1008, + 1,0,0,0,1008,1009,6,98,21,0,1009,212,1,0,0,0,1010,1011,3,55,20,0,1011,1012, + 1,0,0,0,1012,1013,6,99,10,0,1013,214,1,0,0,0,1014,1015,3,57,21,0,1015,1016, + 1,0,0,0,1016,1017,6,100,10,0,1017,216,1,0,0,0,1018,1019,3,59,22,0,1019, + 1020,1,0,0,0,1020,1021,6,101,10,0,1021,218,1,0,0,0,1022,1023,3,61,23,0, + 1023,1024,1,0,0,0,1024,1025,6,102,15,0,1025,1026,6,102,11,0,1026,220,1, + 0,0,0,1027,1028,3,103,44,0,1028,1029,1,0,0,0,1029,1030,6,103,22,0,1030, + 222,1,0,0,0,1031,1032,3,99,42,0,1032,1033,1,0,0,0,1033,1034,6,104,18,0, + 1034,224,1,0,0,0,1035,1036,4,105,3,0,1036,1037,3,127,56,0,1037,1038,1,0, + 0,0,1038,1039,6,105,23,0,1039,226,1,0,0,0,1040,1041,4,106,4,0,1041,1042, + 3,163,74,0,1042,1043,1,0,0,0,1043,1044,6,106,24,0,1044,228,1,0,0,0,1045, + 1050,3,65,25,0,1046,1050,3,63,24,0,1047,1050,3,79,32,0,1048,1050,3,153, + 69,0,1049,1045,1,0,0,0,1049,1046,1,0,0,0,1049,1047,1,0,0,0,1049,1048,1, + 0,0,0,1050,230,1,0,0,0,1051,1054,3,65,25,0,1052,1054,3,153,69,0,1053,1051, + 1,0,0,0,1053,1052,1,0,0,0,1054,1058,1,0,0,0,1055,1057,3,229,107,0,1056, + 1055,1,0,0,0,1057,1060,1,0,0,0,1058,1056,1,0,0,0,1058,1059,1,0,0,0,1059, + 1071,1,0,0,0,1060,1058,1,0,0,0,1061,1064,3,79,32,0,1062,1064,3,73,29,0, + 1063,1061,1,0,0,0,1063,1062,1,0,0,0,1064,1066,1,0,0,0,1065,1067,3,229,107, + 0,1066,1065,1,0,0,0,1067,1068,1,0,0,0,1068,1066,1,0,0,0,1068,1069,1,0,0, + 0,1069,1071,1,0,0,0,1070,1053,1,0,0,0,1070,1063,1,0,0,0,1071,232,1,0,0, + 0,1072,1075,3,231,108,0,1073,1075,3,171,78,0,1074,1072,1,0,0,0,1074,1073, + 1,0,0,0,1075,1076,1,0,0,0,1076,1074,1,0,0,0,1076,1077,1,0,0,0,1077,234, + 1,0,0,0,1078,1079,3,55,20,0,1079,1080,1,0,0,0,1080,1081,6,110,10,0,1081, + 236,1,0,0,0,1082,1083,3,57,21,0,1083,1084,1,0,0,0,1084,1085,6,111,10,0, + 1085,238,1,0,0,0,1086,1087,3,59,22,0,1087,1088,1,0,0,0,1088,1089,6,112, + 10,0,1089,240,1,0,0,0,1090,1091,3,61,23,0,1091,1092,1,0,0,0,1092,1093,6, + 113,15,0,1093,1094,6,113,11,0,1094,242,1,0,0,0,1095,1096,3,95,40,0,1096, + 1097,1,0,0,0,1097,1098,6,114,19,0,1098,244,1,0,0,0,1099,1100,3,99,42,0, + 1100,1101,1,0,0,0,1101,1102,6,115,18,0,1102,246,1,0,0,0,1103,1104,3,103, + 44,0,1104,1105,1,0,0,0,1105,1106,6,116,22,0,1106,248,1,0,0,0,1107,1108, + 4,117,5,0,1108,1109,3,127,56,0,1109,1110,1,0,0,0,1110,1111,6,117,23,0,1111, + 250,1,0,0,0,1112,1113,4,118,6,0,1113,1114,3,163,74,0,1114,1115,1,0,0,0, + 1115,1116,6,118,24,0,1116,252,1,0,0,0,1117,1118,7,12,0,0,1118,1119,7,2, + 0,0,1119,254,1,0,0,0,1120,1121,3,233,109,0,1121,1122,1,0,0,0,1122,1123, + 6,120,25,0,1123,256,1,0,0,0,1124,1125,3,55,20,0,1125,1126,1,0,0,0,1126, + 1127,6,121,10,0,1127,258,1,0,0,0,1128,1129,3,57,21,0,1129,1130,1,0,0,0, + 1130,1131,6,122,10,0,1131,260,1,0,0,0,1132,1133,3,59,22,0,1133,1134,1,0, + 0,0,1134,1135,6,123,10,0,1135,262,1,0,0,0,1136,1137,3,61,23,0,1137,1138, + 1,0,0,0,1138,1139,6,124,15,0,1139,1140,6,124,11,0,1140,264,1,0,0,0,1141, + 1142,3,165,75,0,1142,1143,1,0,0,0,1143,1144,6,125,13,0,1144,1145,6,125, + 26,0,1145,266,1,0,0,0,1146,1147,7,7,0,0,1147,1148,7,9,0,0,1148,1149,1,0, + 0,0,1149,1150,6,126,27,0,1150,268,1,0,0,0,1151,1152,7,19,0,0,1152,1153, + 7,1,0,0,1153,1154,7,5,0,0,1154,1155,7,10,0,0,1155,1156,1,0,0,0,1156,1157, + 6,127,27,0,1157,270,1,0,0,0,1158,1159,8,34,0,0,1159,272,1,0,0,0,1160,1162, + 3,271,128,0,1161,1160,1,0,0,0,1162,1163,1,0,0,0,1163,1161,1,0,0,0,1163, + 1164,1,0,0,0,1164,1165,1,0,0,0,1165,1166,3,337,161,0,1166,1168,1,0,0,0, + 1167,1161,1,0,0,0,1167,1168,1,0,0,0,1168,1170,1,0,0,0,1169,1171,3,271,128, + 0,1170,1169,1,0,0,0,1171,1172,1,0,0,0,1172,1170,1,0,0,0,1172,1173,1,0,0, + 0,1173,274,1,0,0,0,1174,1175,3,273,129,0,1175,1176,1,0,0,0,1176,1177,6, + 130,28,0,1177,276,1,0,0,0,1178,1179,3,55,20,0,1179,1180,1,0,0,0,1180,1181, + 6,131,10,0,1181,278,1,0,0,0,1182,1183,3,57,21,0,1183,1184,1,0,0,0,1184, + 1185,6,132,10,0,1185,280,1,0,0,0,1186,1187,3,59,22,0,1187,1188,1,0,0,0, + 1188,1189,6,133,10,0,1189,282,1,0,0,0,1190,1191,3,61,23,0,1191,1192,1,0, + 0,0,1192,1193,6,134,15,0,1193,1194,6,134,11,0,1194,1195,6,134,11,0,1195, + 284,1,0,0,0,1196,1197,3,95,40,0,1197,1198,1,0,0,0,1198,1199,6,135,19,0, + 1199,286,1,0,0,0,1200,1201,3,99,42,0,1201,1202,1,0,0,0,1202,1203,6,136, + 18,0,1203,288,1,0,0,0,1204,1205,3,103,44,0,1205,1206,1,0,0,0,1206,1207, + 6,137,22,0,1207,290,1,0,0,0,1208,1209,3,269,127,0,1209,1210,1,0,0,0,1210, + 1211,6,138,29,0,1211,292,1,0,0,0,1212,1213,3,233,109,0,1213,1214,1,0,0, + 0,1214,1215,6,139,25,0,1215,294,1,0,0,0,1216,1217,3,173,79,0,1217,1218, + 1,0,0,0,1218,1219,6,140,30,0,1219,296,1,0,0,0,1220,1221,4,141,7,0,1221, + 1222,3,127,56,0,1222,1223,1,0,0,0,1223,1224,6,141,23,0,1224,298,1,0,0,0, + 1225,1226,4,142,8,0,1226,1227,3,163,74,0,1227,1228,1,0,0,0,1228,1229,6, + 142,24,0,1229,300,1,0,0,0,1230,1231,3,55,20,0,1231,1232,1,0,0,0,1232,1233, + 6,143,10,0,1233,302,1,0,0,0,1234,1235,3,57,21,0,1235,1236,1,0,0,0,1236, + 1237,6,144,10,0,1237,304,1,0,0,0,1238,1239,3,59,22,0,1239,1240,1,0,0,0, + 1240,1241,6,145,10,0,1241,306,1,0,0,0,1242,1243,3,61,23,0,1243,1244,1,0, + 0,0,1244,1245,6,146,15,0,1245,1246,6,146,11,0,1246,308,1,0,0,0,1247,1248, + 3,103,44,0,1248,1249,1,0,0,0,1249,1250,6,147,22,0,1250,310,1,0,0,0,1251, + 1252,4,148,9,0,1252,1253,3,127,56,0,1253,1254,1,0,0,0,1254,1255,6,148,23, + 0,1255,312,1,0,0,0,1256,1257,4,149,10,0,1257,1258,3,163,74,0,1258,1259, + 1,0,0,0,1259,1260,6,149,24,0,1260,314,1,0,0,0,1261,1262,3,173,79,0,1262, + 1263,1,0,0,0,1263,1264,6,150,30,0,1264,316,1,0,0,0,1265,1266,3,169,77,0, + 1266,1267,1,0,0,0,1267,1268,6,151,31,0,1268,318,1,0,0,0,1269,1270,3,55, + 20,0,1270,1271,1,0,0,0,1271,1272,6,152,10,0,1272,320,1,0,0,0,1273,1274, + 3,57,21,0,1274,1275,1,0,0,0,1275,1276,6,153,10,0,1276,322,1,0,0,0,1277, + 1278,3,59,22,0,1278,1279,1,0,0,0,1279,1280,6,154,10,0,1280,324,1,0,0,0, + 1281,1282,3,61,23,0,1282,1283,1,0,0,0,1283,1284,6,155,15,0,1284,1285,6, + 155,11,0,1285,326,1,0,0,0,1286,1287,7,1,0,0,1287,1288,7,9,0,0,1288,1289, + 7,15,0,0,1289,1290,7,7,0,0,1290,328,1,0,0,0,1291,1292,3,55,20,0,1292,1293, + 1,0,0,0,1293,1294,6,157,10,0,1294,330,1,0,0,0,1295,1296,3,57,21,0,1296, + 1297,1,0,0,0,1297,1298,6,158,10,0,1298,332,1,0,0,0,1299,1300,3,59,22,0, + 1300,1301,1,0,0,0,1301,1302,6,159,10,0,1302,334,1,0,0,0,1303,1304,3,167, + 76,0,1304,1305,1,0,0,0,1305,1306,6,160,16,0,1306,1307,6,160,11,0,1307,336, + 1,0,0,0,1308,1309,5,58,0,0,1309,338,1,0,0,0,1310,1316,3,73,29,0,1311,1316, + 3,63,24,0,1312,1316,3,103,44,0,1313,1316,3,65,25,0,1314,1316,3,79,32,0, + 1315,1310,1,0,0,0,1315,1311,1,0,0,0,1315,1312,1,0,0,0,1315,1313,1,0,0,0, + 1315,1314,1,0,0,0,1316,1317,1,0,0,0,1317,1315,1,0,0,0,1317,1318,1,0,0,0, + 1318,340,1,0,0,0,1319,1320,3,55,20,0,1320,1321,1,0,0,0,1321,1322,6,163, + 10,0,1322,342,1,0,0,0,1323,1324,3,57,21,0,1324,1325,1,0,0,0,1325,1326,6, + 164,10,0,1326,344,1,0,0,0,1327,1328,3,59,22,0,1328,1329,1,0,0,0,1329,1330, + 6,165,10,0,1330,346,1,0,0,0,1331,1332,3,61,23,0,1332,1333,1,0,0,0,1333, + 1334,6,166,15,0,1334,1335,6,166,11,0,1335,348,1,0,0,0,1336,1337,3,337,161, + 0,1337,1338,1,0,0,0,1338,1339,6,167,17,0,1339,350,1,0,0,0,1340,1341,3,99, + 42,0,1341,1342,1,0,0,0,1342,1343,6,168,18,0,1343,352,1,0,0,0,1344,1345, + 3,103,44,0,1345,1346,1,0,0,0,1346,1347,6,169,22,0,1347,354,1,0,0,0,1348, + 1349,3,267,126,0,1349,1350,1,0,0,0,1350,1351,6,170,32,0,1351,1352,6,170, + 33,0,1352,356,1,0,0,0,1353,1354,3,207,96,0,1354,1355,1,0,0,0,1355,1356, + 6,171,20,0,1356,358,1,0,0,0,1357,1358,3,83,34,0,1358,1359,1,0,0,0,1359, + 1360,6,172,21,0,1360,360,1,0,0,0,1361,1362,3,55,20,0,1362,1363,1,0,0,0, + 1363,1364,6,173,10,0,1364,362,1,0,0,0,1365,1366,3,57,21,0,1366,1367,1,0, + 0,0,1367,1368,6,174,10,0,1368,364,1,0,0,0,1369,1370,3,59,22,0,1370,1371, + 1,0,0,0,1371,1372,6,175,10,0,1372,366,1,0,0,0,1373,1374,3,61,23,0,1374, + 1375,1,0,0,0,1375,1376,6,176,15,0,1376,1377,6,176,11,0,1377,1378,6,176, + 11,0,1378,368,1,0,0,0,1379,1380,3,99,42,0,1380,1381,1,0,0,0,1381,1382,6, + 177,18,0,1382,370,1,0,0,0,1383,1384,3,103,44,0,1384,1385,1,0,0,0,1385,1386, + 6,178,22,0,1386,372,1,0,0,0,1387,1388,3,233,109,0,1388,1389,1,0,0,0,1389, + 1390,6,179,25,0,1390,374,1,0,0,0,1391,1392,3,55,20,0,1392,1393,1,0,0,0, + 1393,1394,6,180,10,0,1394,376,1,0,0,0,1395,1396,3,57,21,0,1396,1397,1,0, + 0,0,1397,1398,6,181,10,0,1398,378,1,0,0,0,1399,1400,3,59,22,0,1400,1401, + 1,0,0,0,1401,1402,6,182,10,0,1402,380,1,0,0,0,1403,1404,3,61,23,0,1404, + 1405,1,0,0,0,1405,1406,6,183,15,0,1406,1407,6,183,11,0,1407,382,1,0,0,0, + 1408,1409,3,207,96,0,1409,1410,1,0,0,0,1410,1411,6,184,20,0,1411,1412,6, + 184,11,0,1412,1413,6,184,34,0,1413,384,1,0,0,0,1414,1415,3,83,34,0,1415, + 1416,1,0,0,0,1416,1417,6,185,21,0,1417,1418,6,185,11,0,1418,1419,6,185, + 34,0,1419,386,1,0,0,0,1420,1421,3,55,20,0,1421,1422,1,0,0,0,1422,1423,6, + 186,10,0,1423,388,1,0,0,0,1424,1425,3,57,21,0,1425,1426,1,0,0,0,1426,1427, + 6,187,10,0,1427,390,1,0,0,0,1428,1429,3,59,22,0,1429,1430,1,0,0,0,1430, + 1431,6,188,10,0,1431,392,1,0,0,0,1432,1433,3,337,161,0,1433,1434,1,0,0, + 0,1434,1435,6,189,17,0,1435,1436,6,189,11,0,1436,1437,6,189,9,0,1437,394, + 1,0,0,0,1438,1439,3,99,42,0,1439,1440,1,0,0,0,1440,1441,6,190,18,0,1441, + 1442,6,190,11,0,1442,1443,6,190,9,0,1443,396,1,0,0,0,1444,1445,3,55,20, + 0,1445,1446,1,0,0,0,1446,1447,6,191,10,0,1447,398,1,0,0,0,1448,1449,3,57, + 21,0,1449,1450,1,0,0,0,1450,1451,6,192,10,0,1451,400,1,0,0,0,1452,1453, + 3,59,22,0,1453,1454,1,0,0,0,1454,1455,6,193,10,0,1455,402,1,0,0,0,1456, + 1457,3,173,79,0,1457,1458,1,0,0,0,1458,1459,6,194,11,0,1459,1460,6,194, + 0,0,1460,1461,6,194,30,0,1461,404,1,0,0,0,1462,1463,3,169,77,0,1463,1464, + 1,0,0,0,1464,1465,6,195,11,0,1465,1466,6,195,0,0,1466,1467,6,195,31,0,1467, + 406,1,0,0,0,1468,1469,3,89,37,0,1469,1470,1,0,0,0,1470,1471,6,196,11,0, + 1471,1472,6,196,0,0,1472,1473,6,196,35,0,1473,408,1,0,0,0,1474,1475,3,61, + 23,0,1475,1476,1,0,0,0,1476,1477,6,197,15,0,1477,1478,6,197,11,0,1478,410, + 1,0,0,0,65,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,579,589,593,596,605,607,618, + 637,642,651,658,663,665,676,684,687,689,694,699,705,712,717,723,726,734, + 738,870,875,882,884,900,905,910,912,918,995,1000,1049,1053,1058,1063,1068, + 1070,1074,1076,1163,1167,1172,1315,1317,36,5,1,0,5,4,0,5,6,0,5,2,0,5,3, + 0,5,8,0,5,5,0,5,9,0,5,11,0,5,13,0,0,1,0,4,0,0,7,16,0,7,65,0,5,0,0,7,24, + 0,7,66,0,7,104,0,7,33,0,7,31,0,7,76,0,7,25,0,7,35,0,7,47,0,7,64,0,7,80, + 0,5,10,0,5,7,0,7,90,0,7,89,0,7,68,0,7,67,0,7,88,0,5,12,0,5,14,0,7,28,0]; private static __ATN: ATN; public static get _ATN(): ATN { diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.g4 b/packages/kbn-esql-ast/src/antlr/esql_parser.g4 index 9d52d84dcc587..261b4f712b5b3 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.g4 +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.g4 @@ -79,7 +79,7 @@ regexBooleanExpression ; matchBooleanExpression - : valueExpression DEV_MATCH queryString=string + : valueExpression MATCH queryString=string ; valueExpression @@ -103,7 +103,13 @@ primaryExpression ; functionExpression - : identifierOrParameter LP (ASTERISK | (booleanExpression (COMMA booleanExpression)*))? RP + : functionName LP (ASTERISK | (booleanExpression (COMMA booleanExpression)*))? RP + ; + +functionName + // Additional function identifiers that are already a reserved word in the language + : MATCH + | identifierOrParameter ; dataType @@ -119,8 +125,7 @@ fields ; field - : booleanExpression - | qualifiedName ASSIGN booleanExpression + : (qualifiedName ASSIGN)? booleanExpression ; fromCommand @@ -128,8 +133,7 @@ fromCommand ; indexPattern - : clusterString COLON indexString - | indexString + : (clusterString COLON)? indexString ; clusterString @@ -155,7 +159,7 @@ deprecated_metadata ; metricsCommand - : DEV_METRICS indexPattern (COMMA indexPattern)* aggregates=fields? (BY grouping=fields)? + : DEV_METRICS indexPattern (COMMA indexPattern)* aggregates=aggFields? (BY grouping=fields)? ; evalCommand @@ -163,7 +167,15 @@ evalCommand ; statsCommand - : STATS stats=fields? (BY grouping=fields)? + : STATS stats=aggFields? (BY grouping=fields)? + ; + +aggFields + : aggField (COMMA aggField)* + ; + +aggField + : field (WHERE booleanExpression)? ; qualifiedName @@ -185,7 +197,7 @@ identifier identifierPattern : ID_PATTERN - | parameter + | {this.isDevVersion()}? parameter ; constant @@ -208,7 +220,7 @@ parameter identifierOrParameter : identifier - | parameter + | {this.isDevVersion()}? parameter ; limitCommand @@ -312,5 +324,5 @@ lookupCommand ; inlinestatsCommand - : DEV_INLINESTATS stats=fields (BY grouping=fields)? + : DEV_INLINESTATS stats=aggFields (BY grouping=fields)? ; \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.interp b/packages/kbn-esql-ast/src/antlr/esql_parser.interp index eb3c70385d628..b52d842e79fb2 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.interp +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.interp @@ -23,7 +23,6 @@ null null null null -null '|' null null @@ -63,6 +62,7 @@ null '*' '/' '%' +'match' null null ']' @@ -141,7 +141,6 @@ STATS WHERE DEV_INLINESTATS DEV_LOOKUP -DEV_MATCH DEV_METRICS UNKNOWN_CMD LINE_COMMENT @@ -186,6 +185,7 @@ MINUS ASTERISK SLASH PERCENT +MATCH NAMED_OR_POSITIONAL_PARAM OPENING_BRACKET CLOSING_BRACKET @@ -257,6 +257,7 @@ valueExpression operatorExpression primaryExpression functionExpression +functionName dataType rowCommand fields @@ -271,6 +272,8 @@ deprecated_metadata metricsCommand evalCommand statsCommand +aggFields +aggField qualifiedName qualifiedNamePattern qualifiedNamePatterns @@ -307,4 +310,4 @@ inlinestatsCommand atn: -[4, 1, 120, 580, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 128, 8, 1, 10, 1, 12, 1, 131, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 139, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 157, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 169, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 176, 8, 5, 10, 5, 12, 5, 179, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 186, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 192, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 200, 8, 5, 10, 5, 12, 5, 203, 9, 5, 1, 6, 1, 6, 3, 6, 207, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 214, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 219, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 230, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 236, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 244, 8, 9, 10, 9, 12, 9, 247, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 257, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 262, 8, 10, 10, 10, 12, 10, 265, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 273, 8, 11, 10, 11, 12, 11, 276, 9, 11, 3, 11, 278, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 5, 14, 290, 8, 14, 10, 14, 12, 14, 293, 9, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 300, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 306, 8, 16, 10, 16, 12, 16, 309, 9, 16, 1, 16, 3, 16, 312, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 319, 8, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 3, 20, 327, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 333, 8, 21, 10, 21, 12, 21, 336, 9, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 346, 8, 23, 10, 23, 12, 23, 349, 9, 23, 1, 23, 3, 23, 352, 8, 23, 1, 23, 1, 23, 3, 23, 356, 8, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 363, 8, 25, 1, 25, 1, 25, 3, 25, 367, 8, 25, 1, 26, 1, 26, 1, 26, 5, 26, 372, 8, 26, 10, 26, 12, 26, 375, 9, 26, 1, 27, 1, 27, 1, 27, 5, 27, 380, 8, 27, 10, 27, 12, 27, 383, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 388, 8, 28, 10, 28, 12, 28, 391, 9, 28, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 397, 8, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 412, 8, 31, 10, 31, 12, 31, 415, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 423, 8, 31, 10, 31, 12, 31, 426, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 434, 8, 31, 10, 31, 12, 31, 437, 9, 31, 1, 31, 1, 31, 3, 31, 441, 8, 31, 1, 32, 1, 32, 3, 32, 445, 8, 32, 1, 33, 1, 33, 3, 33, 449, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 458, 8, 35, 10, 35, 12, 35, 461, 9, 35, 1, 36, 1, 36, 3, 36, 465, 8, 36, 1, 36, 1, 36, 3, 36, 469, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 481, 8, 39, 10, 39, 12, 39, 484, 9, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 494, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 5, 44, 506, 8, 44, 10, 44, 12, 44, 509, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 519, 8, 47, 1, 48, 3, 48, 522, 8, 48, 1, 48, 1, 48, 1, 49, 3, 49, 527, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 549, 8, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 555, 8, 55, 10, 55, 12, 55, 558, 9, 55, 3, 55, 560, 8, 55, 1, 56, 1, 56, 1, 56, 3, 56, 565, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 578, 8, 58, 1, 58, 0, 4, 2, 10, 18, 20, 59, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 0, 8, 1, 0, 59, 60, 1, 0, 61, 63, 2, 0, 26, 26, 76, 76, 1, 0, 67, 68, 2, 0, 31, 31, 35, 35, 2, 0, 38, 38, 41, 41, 2, 0, 37, 37, 51, 51, 2, 0, 52, 52, 54, 58, 606, 0, 118, 1, 0, 0, 0, 2, 121, 1, 0, 0, 0, 4, 138, 1, 0, 0, 0, 6, 156, 1, 0, 0, 0, 8, 158, 1, 0, 0, 0, 10, 191, 1, 0, 0, 0, 12, 218, 1, 0, 0, 0, 14, 220, 1, 0, 0, 0, 16, 229, 1, 0, 0, 0, 18, 235, 1, 0, 0, 0, 20, 256, 1, 0, 0, 0, 22, 266, 1, 0, 0, 0, 24, 281, 1, 0, 0, 0, 26, 283, 1, 0, 0, 0, 28, 286, 1, 0, 0, 0, 30, 299, 1, 0, 0, 0, 32, 301, 1, 0, 0, 0, 34, 318, 1, 0, 0, 0, 36, 320, 1, 0, 0, 0, 38, 322, 1, 0, 0, 0, 40, 326, 1, 0, 0, 0, 42, 328, 1, 0, 0, 0, 44, 337, 1, 0, 0, 0, 46, 341, 1, 0, 0, 0, 48, 357, 1, 0, 0, 0, 50, 360, 1, 0, 0, 0, 52, 368, 1, 0, 0, 0, 54, 376, 1, 0, 0, 0, 56, 384, 1, 0, 0, 0, 58, 392, 1, 0, 0, 0, 60, 396, 1, 0, 0, 0, 62, 440, 1, 0, 0, 0, 64, 444, 1, 0, 0, 0, 66, 448, 1, 0, 0, 0, 68, 450, 1, 0, 0, 0, 70, 453, 1, 0, 0, 0, 72, 462, 1, 0, 0, 0, 74, 470, 1, 0, 0, 0, 76, 473, 1, 0, 0, 0, 78, 476, 1, 0, 0, 0, 80, 485, 1, 0, 0, 0, 82, 489, 1, 0, 0, 0, 84, 495, 1, 0, 0, 0, 86, 499, 1, 0, 0, 0, 88, 502, 1, 0, 0, 0, 90, 510, 1, 0, 0, 0, 92, 514, 1, 0, 0, 0, 94, 518, 1, 0, 0, 0, 96, 521, 1, 0, 0, 0, 98, 526, 1, 0, 0, 0, 100, 530, 1, 0, 0, 0, 102, 532, 1, 0, 0, 0, 104, 534, 1, 0, 0, 0, 106, 537, 1, 0, 0, 0, 108, 541, 1, 0, 0, 0, 110, 544, 1, 0, 0, 0, 112, 564, 1, 0, 0, 0, 114, 568, 1, 0, 0, 0, 116, 573, 1, 0, 0, 0, 118, 119, 3, 2, 1, 0, 119, 120, 5, 0, 0, 1, 120, 1, 1, 0, 0, 0, 121, 122, 6, 1, -1, 0, 122, 123, 3, 4, 2, 0, 123, 129, 1, 0, 0, 0, 124, 125, 10, 1, 0, 0, 125, 126, 5, 25, 0, 0, 126, 128, 3, 6, 3, 0, 127, 124, 1, 0, 0, 0, 128, 131, 1, 0, 0, 0, 129, 127, 1, 0, 0, 0, 129, 130, 1, 0, 0, 0, 130, 3, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 132, 139, 3, 104, 52, 0, 133, 139, 3, 32, 16, 0, 134, 139, 3, 26, 13, 0, 135, 139, 3, 108, 54, 0, 136, 137, 4, 2, 1, 0, 137, 139, 3, 46, 23, 0, 138, 132, 1, 0, 0, 0, 138, 133, 1, 0, 0, 0, 138, 134, 1, 0, 0, 0, 138, 135, 1, 0, 0, 0, 138, 136, 1, 0, 0, 0, 139, 5, 1, 0, 0, 0, 140, 157, 3, 48, 24, 0, 141, 157, 3, 8, 4, 0, 142, 157, 3, 74, 37, 0, 143, 157, 3, 68, 34, 0, 144, 157, 3, 50, 25, 0, 145, 157, 3, 70, 35, 0, 146, 157, 3, 76, 38, 0, 147, 157, 3, 78, 39, 0, 148, 157, 3, 82, 41, 0, 149, 157, 3, 84, 42, 0, 150, 157, 3, 110, 55, 0, 151, 157, 3, 86, 43, 0, 152, 153, 4, 3, 2, 0, 153, 157, 3, 116, 58, 0, 154, 155, 4, 3, 3, 0, 155, 157, 3, 114, 57, 0, 156, 140, 1, 0, 0, 0, 156, 141, 1, 0, 0, 0, 156, 142, 1, 0, 0, 0, 156, 143, 1, 0, 0, 0, 156, 144, 1, 0, 0, 0, 156, 145, 1, 0, 0, 0, 156, 146, 1, 0, 0, 0, 156, 147, 1, 0, 0, 0, 156, 148, 1, 0, 0, 0, 156, 149, 1, 0, 0, 0, 156, 150, 1, 0, 0, 0, 156, 151, 1, 0, 0, 0, 156, 152, 1, 0, 0, 0, 156, 154, 1, 0, 0, 0, 157, 7, 1, 0, 0, 0, 158, 159, 5, 16, 0, 0, 159, 160, 3, 10, 5, 0, 160, 9, 1, 0, 0, 0, 161, 162, 6, 5, -1, 0, 162, 163, 5, 44, 0, 0, 163, 192, 3, 10, 5, 8, 164, 192, 3, 16, 8, 0, 165, 192, 3, 12, 6, 0, 166, 168, 3, 16, 8, 0, 167, 169, 5, 44, 0, 0, 168, 167, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 171, 5, 39, 0, 0, 171, 172, 5, 43, 0, 0, 172, 177, 3, 16, 8, 0, 173, 174, 5, 34, 0, 0, 174, 176, 3, 16, 8, 0, 175, 173, 1, 0, 0, 0, 176, 179, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 180, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 180, 181, 5, 50, 0, 0, 181, 192, 1, 0, 0, 0, 182, 183, 3, 16, 8, 0, 183, 185, 5, 40, 0, 0, 184, 186, 5, 44, 0, 0, 185, 184, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 187, 1, 0, 0, 0, 187, 188, 5, 45, 0, 0, 188, 192, 1, 0, 0, 0, 189, 190, 4, 5, 4, 0, 190, 192, 3, 14, 7, 0, 191, 161, 1, 0, 0, 0, 191, 164, 1, 0, 0, 0, 191, 165, 1, 0, 0, 0, 191, 166, 1, 0, 0, 0, 191, 182, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 201, 1, 0, 0, 0, 193, 194, 10, 5, 0, 0, 194, 195, 5, 30, 0, 0, 195, 200, 3, 10, 5, 6, 196, 197, 10, 4, 0, 0, 197, 198, 5, 47, 0, 0, 198, 200, 3, 10, 5, 5, 199, 193, 1, 0, 0, 0, 199, 196, 1, 0, 0, 0, 200, 203, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 11, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 204, 206, 3, 16, 8, 0, 205, 207, 5, 44, 0, 0, 206, 205, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 209, 5, 42, 0, 0, 209, 210, 3, 100, 50, 0, 210, 219, 1, 0, 0, 0, 211, 213, 3, 16, 8, 0, 212, 214, 5, 44, 0, 0, 213, 212, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 215, 1, 0, 0, 0, 215, 216, 5, 49, 0, 0, 216, 217, 3, 100, 50, 0, 217, 219, 1, 0, 0, 0, 218, 204, 1, 0, 0, 0, 218, 211, 1, 0, 0, 0, 219, 13, 1, 0, 0, 0, 220, 221, 3, 16, 8, 0, 221, 222, 5, 19, 0, 0, 222, 223, 3, 100, 50, 0, 223, 15, 1, 0, 0, 0, 224, 230, 3, 18, 9, 0, 225, 226, 3, 18, 9, 0, 226, 227, 3, 102, 51, 0, 227, 228, 3, 18, 9, 0, 228, 230, 1, 0, 0, 0, 229, 224, 1, 0, 0, 0, 229, 225, 1, 0, 0, 0, 230, 17, 1, 0, 0, 0, 231, 232, 6, 9, -1, 0, 232, 236, 3, 20, 10, 0, 233, 234, 7, 0, 0, 0, 234, 236, 3, 18, 9, 3, 235, 231, 1, 0, 0, 0, 235, 233, 1, 0, 0, 0, 236, 245, 1, 0, 0, 0, 237, 238, 10, 2, 0, 0, 238, 239, 7, 1, 0, 0, 239, 244, 3, 18, 9, 3, 240, 241, 10, 1, 0, 0, 241, 242, 7, 0, 0, 0, 242, 244, 3, 18, 9, 2, 243, 237, 1, 0, 0, 0, 243, 240, 1, 0, 0, 0, 244, 247, 1, 0, 0, 0, 245, 243, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 19, 1, 0, 0, 0, 247, 245, 1, 0, 0, 0, 248, 249, 6, 10, -1, 0, 249, 257, 3, 62, 31, 0, 250, 257, 3, 52, 26, 0, 251, 257, 3, 22, 11, 0, 252, 253, 5, 43, 0, 0, 253, 254, 3, 10, 5, 0, 254, 255, 5, 50, 0, 0, 255, 257, 1, 0, 0, 0, 256, 248, 1, 0, 0, 0, 256, 250, 1, 0, 0, 0, 256, 251, 1, 0, 0, 0, 256, 252, 1, 0, 0, 0, 257, 263, 1, 0, 0, 0, 258, 259, 10, 1, 0, 0, 259, 260, 5, 33, 0, 0, 260, 262, 3, 24, 12, 0, 261, 258, 1, 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 21, 1, 0, 0, 0, 265, 263, 1, 0, 0, 0, 266, 267, 3, 66, 33, 0, 267, 277, 5, 43, 0, 0, 268, 278, 5, 61, 0, 0, 269, 274, 3, 10, 5, 0, 270, 271, 5, 34, 0, 0, 271, 273, 3, 10, 5, 0, 272, 270, 1, 0, 0, 0, 273, 276, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 277, 268, 1, 0, 0, 0, 277, 269, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 280, 5, 50, 0, 0, 280, 23, 1, 0, 0, 0, 281, 282, 3, 58, 29, 0, 282, 25, 1, 0, 0, 0, 283, 284, 5, 12, 0, 0, 284, 285, 3, 28, 14, 0, 285, 27, 1, 0, 0, 0, 286, 291, 3, 30, 15, 0, 287, 288, 5, 34, 0, 0, 288, 290, 3, 30, 15, 0, 289, 287, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 29, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 300, 3, 10, 5, 0, 295, 296, 3, 52, 26, 0, 296, 297, 5, 32, 0, 0, 297, 298, 3, 10, 5, 0, 298, 300, 1, 0, 0, 0, 299, 294, 1, 0, 0, 0, 299, 295, 1, 0, 0, 0, 300, 31, 1, 0, 0, 0, 301, 302, 5, 6, 0, 0, 302, 307, 3, 34, 17, 0, 303, 304, 5, 34, 0, 0, 304, 306, 3, 34, 17, 0, 305, 303, 1, 0, 0, 0, 306, 309, 1, 0, 0, 0, 307, 305, 1, 0, 0, 0, 307, 308, 1, 0, 0, 0, 308, 311, 1, 0, 0, 0, 309, 307, 1, 0, 0, 0, 310, 312, 3, 40, 20, 0, 311, 310, 1, 0, 0, 0, 311, 312, 1, 0, 0, 0, 312, 33, 1, 0, 0, 0, 313, 314, 3, 36, 18, 0, 314, 315, 5, 104, 0, 0, 315, 316, 3, 38, 19, 0, 316, 319, 1, 0, 0, 0, 317, 319, 3, 38, 19, 0, 318, 313, 1, 0, 0, 0, 318, 317, 1, 0, 0, 0, 319, 35, 1, 0, 0, 0, 320, 321, 5, 76, 0, 0, 321, 37, 1, 0, 0, 0, 322, 323, 7, 2, 0, 0, 323, 39, 1, 0, 0, 0, 324, 327, 3, 42, 21, 0, 325, 327, 3, 44, 22, 0, 326, 324, 1, 0, 0, 0, 326, 325, 1, 0, 0, 0, 327, 41, 1, 0, 0, 0, 328, 329, 5, 75, 0, 0, 329, 334, 5, 76, 0, 0, 330, 331, 5, 34, 0, 0, 331, 333, 5, 76, 0, 0, 332, 330, 1, 0, 0, 0, 333, 336, 1, 0, 0, 0, 334, 332, 1, 0, 0, 0, 334, 335, 1, 0, 0, 0, 335, 43, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 337, 338, 5, 65, 0, 0, 338, 339, 3, 42, 21, 0, 339, 340, 5, 66, 0, 0, 340, 45, 1, 0, 0, 0, 341, 342, 5, 20, 0, 0, 342, 347, 3, 34, 17, 0, 343, 344, 5, 34, 0, 0, 344, 346, 3, 34, 17, 0, 345, 343, 1, 0, 0, 0, 346, 349, 1, 0, 0, 0, 347, 345, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 351, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 350, 352, 3, 28, 14, 0, 351, 350, 1, 0, 0, 0, 351, 352, 1, 0, 0, 0, 352, 355, 1, 0, 0, 0, 353, 354, 5, 29, 0, 0, 354, 356, 3, 28, 14, 0, 355, 353, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 47, 1, 0, 0, 0, 357, 358, 5, 4, 0, 0, 358, 359, 3, 28, 14, 0, 359, 49, 1, 0, 0, 0, 360, 362, 5, 15, 0, 0, 361, 363, 3, 28, 14, 0, 362, 361, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 366, 1, 0, 0, 0, 364, 365, 5, 29, 0, 0, 365, 367, 3, 28, 14, 0, 366, 364, 1, 0, 0, 0, 366, 367, 1, 0, 0, 0, 367, 51, 1, 0, 0, 0, 368, 373, 3, 66, 33, 0, 369, 370, 5, 36, 0, 0, 370, 372, 3, 66, 33, 0, 371, 369, 1, 0, 0, 0, 372, 375, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 53, 1, 0, 0, 0, 375, 373, 1, 0, 0, 0, 376, 381, 3, 60, 30, 0, 377, 378, 5, 36, 0, 0, 378, 380, 3, 60, 30, 0, 379, 377, 1, 0, 0, 0, 380, 383, 1, 0, 0, 0, 381, 379, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 55, 1, 0, 0, 0, 383, 381, 1, 0, 0, 0, 384, 389, 3, 54, 27, 0, 385, 386, 5, 34, 0, 0, 386, 388, 3, 54, 27, 0, 387, 385, 1, 0, 0, 0, 388, 391, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 57, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 392, 393, 7, 3, 0, 0, 393, 59, 1, 0, 0, 0, 394, 397, 5, 80, 0, 0, 395, 397, 3, 64, 32, 0, 396, 394, 1, 0, 0, 0, 396, 395, 1, 0, 0, 0, 397, 61, 1, 0, 0, 0, 398, 441, 5, 45, 0, 0, 399, 400, 3, 98, 49, 0, 400, 401, 5, 67, 0, 0, 401, 441, 1, 0, 0, 0, 402, 441, 3, 96, 48, 0, 403, 441, 3, 98, 49, 0, 404, 441, 3, 92, 46, 0, 405, 441, 3, 64, 32, 0, 406, 441, 3, 100, 50, 0, 407, 408, 5, 65, 0, 0, 408, 413, 3, 94, 47, 0, 409, 410, 5, 34, 0, 0, 410, 412, 3, 94, 47, 0, 411, 409, 1, 0, 0, 0, 412, 415, 1, 0, 0, 0, 413, 411, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 416, 1, 0, 0, 0, 415, 413, 1, 0, 0, 0, 416, 417, 5, 66, 0, 0, 417, 441, 1, 0, 0, 0, 418, 419, 5, 65, 0, 0, 419, 424, 3, 92, 46, 0, 420, 421, 5, 34, 0, 0, 421, 423, 3, 92, 46, 0, 422, 420, 1, 0, 0, 0, 423, 426, 1, 0, 0, 0, 424, 422, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 427, 1, 0, 0, 0, 426, 424, 1, 0, 0, 0, 427, 428, 5, 66, 0, 0, 428, 441, 1, 0, 0, 0, 429, 430, 5, 65, 0, 0, 430, 435, 3, 100, 50, 0, 431, 432, 5, 34, 0, 0, 432, 434, 3, 100, 50, 0, 433, 431, 1, 0, 0, 0, 434, 437, 1, 0, 0, 0, 435, 433, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 438, 1, 0, 0, 0, 437, 435, 1, 0, 0, 0, 438, 439, 5, 66, 0, 0, 439, 441, 1, 0, 0, 0, 440, 398, 1, 0, 0, 0, 440, 399, 1, 0, 0, 0, 440, 402, 1, 0, 0, 0, 440, 403, 1, 0, 0, 0, 440, 404, 1, 0, 0, 0, 440, 405, 1, 0, 0, 0, 440, 406, 1, 0, 0, 0, 440, 407, 1, 0, 0, 0, 440, 418, 1, 0, 0, 0, 440, 429, 1, 0, 0, 0, 441, 63, 1, 0, 0, 0, 442, 445, 5, 48, 0, 0, 443, 445, 5, 64, 0, 0, 444, 442, 1, 0, 0, 0, 444, 443, 1, 0, 0, 0, 445, 65, 1, 0, 0, 0, 446, 449, 3, 58, 29, 0, 447, 449, 3, 64, 32, 0, 448, 446, 1, 0, 0, 0, 448, 447, 1, 0, 0, 0, 449, 67, 1, 0, 0, 0, 450, 451, 5, 9, 0, 0, 451, 452, 5, 27, 0, 0, 452, 69, 1, 0, 0, 0, 453, 454, 5, 14, 0, 0, 454, 459, 3, 72, 36, 0, 455, 456, 5, 34, 0, 0, 456, 458, 3, 72, 36, 0, 457, 455, 1, 0, 0, 0, 458, 461, 1, 0, 0, 0, 459, 457, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 71, 1, 0, 0, 0, 461, 459, 1, 0, 0, 0, 462, 464, 3, 10, 5, 0, 463, 465, 7, 4, 0, 0, 464, 463, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 468, 1, 0, 0, 0, 466, 467, 5, 46, 0, 0, 467, 469, 7, 5, 0, 0, 468, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 73, 1, 0, 0, 0, 470, 471, 5, 8, 0, 0, 471, 472, 3, 56, 28, 0, 472, 75, 1, 0, 0, 0, 473, 474, 5, 2, 0, 0, 474, 475, 3, 56, 28, 0, 475, 77, 1, 0, 0, 0, 476, 477, 5, 11, 0, 0, 477, 482, 3, 80, 40, 0, 478, 479, 5, 34, 0, 0, 479, 481, 3, 80, 40, 0, 480, 478, 1, 0, 0, 0, 481, 484, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 482, 483, 1, 0, 0, 0, 483, 79, 1, 0, 0, 0, 484, 482, 1, 0, 0, 0, 485, 486, 3, 54, 27, 0, 486, 487, 5, 84, 0, 0, 487, 488, 3, 54, 27, 0, 488, 81, 1, 0, 0, 0, 489, 490, 5, 1, 0, 0, 490, 491, 3, 20, 10, 0, 491, 493, 3, 100, 50, 0, 492, 494, 3, 88, 44, 0, 493, 492, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 83, 1, 0, 0, 0, 495, 496, 5, 7, 0, 0, 496, 497, 3, 20, 10, 0, 497, 498, 3, 100, 50, 0, 498, 85, 1, 0, 0, 0, 499, 500, 5, 10, 0, 0, 500, 501, 3, 52, 26, 0, 501, 87, 1, 0, 0, 0, 502, 507, 3, 90, 45, 0, 503, 504, 5, 34, 0, 0, 504, 506, 3, 90, 45, 0, 505, 503, 1, 0, 0, 0, 506, 509, 1, 0, 0, 0, 507, 505, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 89, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 510, 511, 3, 58, 29, 0, 511, 512, 5, 32, 0, 0, 512, 513, 3, 62, 31, 0, 513, 91, 1, 0, 0, 0, 514, 515, 7, 6, 0, 0, 515, 93, 1, 0, 0, 0, 516, 519, 3, 96, 48, 0, 517, 519, 3, 98, 49, 0, 518, 516, 1, 0, 0, 0, 518, 517, 1, 0, 0, 0, 519, 95, 1, 0, 0, 0, 520, 522, 7, 0, 0, 0, 521, 520, 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 523, 1, 0, 0, 0, 523, 524, 5, 28, 0, 0, 524, 97, 1, 0, 0, 0, 525, 527, 7, 0, 0, 0, 526, 525, 1, 0, 0, 0, 526, 527, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 529, 5, 27, 0, 0, 529, 99, 1, 0, 0, 0, 530, 531, 5, 26, 0, 0, 531, 101, 1, 0, 0, 0, 532, 533, 7, 7, 0, 0, 533, 103, 1, 0, 0, 0, 534, 535, 5, 5, 0, 0, 535, 536, 3, 106, 53, 0, 536, 105, 1, 0, 0, 0, 537, 538, 5, 65, 0, 0, 538, 539, 3, 2, 1, 0, 539, 540, 5, 66, 0, 0, 540, 107, 1, 0, 0, 0, 541, 542, 5, 13, 0, 0, 542, 543, 5, 100, 0, 0, 543, 109, 1, 0, 0, 0, 544, 545, 5, 3, 0, 0, 545, 548, 5, 90, 0, 0, 546, 547, 5, 88, 0, 0, 547, 549, 3, 54, 27, 0, 548, 546, 1, 0, 0, 0, 548, 549, 1, 0, 0, 0, 549, 559, 1, 0, 0, 0, 550, 551, 5, 89, 0, 0, 551, 556, 3, 112, 56, 0, 552, 553, 5, 34, 0, 0, 553, 555, 3, 112, 56, 0, 554, 552, 1, 0, 0, 0, 555, 558, 1, 0, 0, 0, 556, 554, 1, 0, 0, 0, 556, 557, 1, 0, 0, 0, 557, 560, 1, 0, 0, 0, 558, 556, 1, 0, 0, 0, 559, 550, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 111, 1, 0, 0, 0, 561, 562, 3, 54, 27, 0, 562, 563, 5, 32, 0, 0, 563, 565, 1, 0, 0, 0, 564, 561, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, 566, 1, 0, 0, 0, 566, 567, 3, 54, 27, 0, 567, 113, 1, 0, 0, 0, 568, 569, 5, 18, 0, 0, 569, 570, 3, 34, 17, 0, 570, 571, 5, 88, 0, 0, 571, 572, 3, 56, 28, 0, 572, 115, 1, 0, 0, 0, 573, 574, 5, 17, 0, 0, 574, 577, 3, 28, 14, 0, 575, 576, 5, 29, 0, 0, 576, 578, 3, 28, 14, 0, 577, 575, 1, 0, 0, 0, 577, 578, 1, 0, 0, 0, 578, 117, 1, 0, 0, 0, 56, 129, 138, 156, 168, 177, 185, 191, 199, 201, 206, 213, 218, 229, 235, 243, 245, 256, 263, 274, 277, 291, 299, 307, 311, 318, 326, 334, 347, 351, 355, 362, 366, 373, 381, 389, 396, 413, 424, 435, 440, 444, 448, 459, 464, 468, 482, 493, 507, 518, 521, 526, 548, 556, 559, 564, 577] \ No newline at end of file +[4, 1, 120, 605, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 134, 8, 1, 10, 1, 12, 1, 137, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 145, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 163, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 175, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 182, 8, 5, 10, 5, 12, 5, 185, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 192, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 198, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 206, 8, 5, 10, 5, 12, 5, 209, 9, 5, 1, 6, 1, 6, 3, 6, 213, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 220, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 225, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 236, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 242, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 250, 8, 9, 10, 9, 12, 9, 253, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 263, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 268, 8, 10, 10, 10, 12, 10, 271, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 279, 8, 11, 10, 11, 12, 11, 282, 9, 11, 3, 11, 284, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 3, 12, 290, 8, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 300, 8, 15, 10, 15, 12, 15, 303, 9, 15, 1, 16, 1, 16, 1, 16, 3, 16, 308, 8, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 316, 8, 17, 10, 17, 12, 17, 319, 9, 17, 1, 17, 3, 17, 322, 8, 17, 1, 18, 1, 18, 1, 18, 3, 18, 327, 8, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 3, 21, 337, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 343, 8, 22, 10, 22, 12, 22, 346, 9, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 356, 8, 24, 10, 24, 12, 24, 359, 9, 24, 1, 24, 3, 24, 362, 8, 24, 1, 24, 1, 24, 3, 24, 366, 8, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 3, 26, 373, 8, 26, 1, 26, 1, 26, 3, 26, 377, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 382, 8, 27, 10, 27, 12, 27, 385, 9, 27, 1, 28, 1, 28, 1, 28, 3, 28, 390, 8, 28, 1, 29, 1, 29, 1, 29, 5, 29, 395, 8, 29, 10, 29, 12, 29, 398, 9, 29, 1, 30, 1, 30, 1, 30, 5, 30, 403, 8, 30, 10, 30, 12, 30, 406, 9, 30, 1, 31, 1, 31, 1, 31, 5, 31, 411, 8, 31, 10, 31, 12, 31, 414, 9, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 3, 33, 421, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 436, 8, 34, 10, 34, 12, 34, 439, 9, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 447, 8, 34, 10, 34, 12, 34, 450, 9, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 458, 8, 34, 10, 34, 12, 34, 461, 9, 34, 1, 34, 1, 34, 3, 34, 465, 8, 34, 1, 35, 1, 35, 3, 35, 469, 8, 35, 1, 36, 1, 36, 1, 36, 3, 36, 474, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 483, 8, 38, 10, 38, 12, 38, 486, 9, 38, 1, 39, 1, 39, 3, 39, 490, 8, 39, 1, 39, 1, 39, 3, 39, 494, 8, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 506, 8, 42, 10, 42, 12, 42, 509, 9, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 519, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 5, 47, 531, 8, 47, 10, 47, 12, 47, 534, 9, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 3, 50, 544, 8, 50, 1, 51, 3, 51, 547, 8, 51, 1, 51, 1, 51, 1, 52, 3, 52, 552, 8, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 574, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 5, 58, 580, 8, 58, 10, 58, 12, 58, 583, 9, 58, 3, 58, 585, 8, 58, 1, 59, 1, 59, 1, 59, 3, 59, 590, 8, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 603, 8, 61, 1, 61, 0, 4, 2, 10, 18, 20, 62, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 0, 8, 1, 0, 58, 59, 1, 0, 60, 62, 2, 0, 25, 25, 76, 76, 1, 0, 67, 68, 2, 0, 30, 30, 34, 34, 2, 0, 37, 37, 40, 40, 2, 0, 36, 36, 50, 50, 2, 0, 51, 51, 53, 57, 631, 0, 124, 1, 0, 0, 0, 2, 127, 1, 0, 0, 0, 4, 144, 1, 0, 0, 0, 6, 162, 1, 0, 0, 0, 8, 164, 1, 0, 0, 0, 10, 197, 1, 0, 0, 0, 12, 224, 1, 0, 0, 0, 14, 226, 1, 0, 0, 0, 16, 235, 1, 0, 0, 0, 18, 241, 1, 0, 0, 0, 20, 262, 1, 0, 0, 0, 22, 272, 1, 0, 0, 0, 24, 289, 1, 0, 0, 0, 26, 291, 1, 0, 0, 0, 28, 293, 1, 0, 0, 0, 30, 296, 1, 0, 0, 0, 32, 307, 1, 0, 0, 0, 34, 311, 1, 0, 0, 0, 36, 326, 1, 0, 0, 0, 38, 330, 1, 0, 0, 0, 40, 332, 1, 0, 0, 0, 42, 336, 1, 0, 0, 0, 44, 338, 1, 0, 0, 0, 46, 347, 1, 0, 0, 0, 48, 351, 1, 0, 0, 0, 50, 367, 1, 0, 0, 0, 52, 370, 1, 0, 0, 0, 54, 378, 1, 0, 0, 0, 56, 386, 1, 0, 0, 0, 58, 391, 1, 0, 0, 0, 60, 399, 1, 0, 0, 0, 62, 407, 1, 0, 0, 0, 64, 415, 1, 0, 0, 0, 66, 420, 1, 0, 0, 0, 68, 464, 1, 0, 0, 0, 70, 468, 1, 0, 0, 0, 72, 473, 1, 0, 0, 0, 74, 475, 1, 0, 0, 0, 76, 478, 1, 0, 0, 0, 78, 487, 1, 0, 0, 0, 80, 495, 1, 0, 0, 0, 82, 498, 1, 0, 0, 0, 84, 501, 1, 0, 0, 0, 86, 510, 1, 0, 0, 0, 88, 514, 1, 0, 0, 0, 90, 520, 1, 0, 0, 0, 92, 524, 1, 0, 0, 0, 94, 527, 1, 0, 0, 0, 96, 535, 1, 0, 0, 0, 98, 539, 1, 0, 0, 0, 100, 543, 1, 0, 0, 0, 102, 546, 1, 0, 0, 0, 104, 551, 1, 0, 0, 0, 106, 555, 1, 0, 0, 0, 108, 557, 1, 0, 0, 0, 110, 559, 1, 0, 0, 0, 112, 562, 1, 0, 0, 0, 114, 566, 1, 0, 0, 0, 116, 569, 1, 0, 0, 0, 118, 589, 1, 0, 0, 0, 120, 593, 1, 0, 0, 0, 122, 598, 1, 0, 0, 0, 124, 125, 3, 2, 1, 0, 125, 126, 5, 0, 0, 1, 126, 1, 1, 0, 0, 0, 127, 128, 6, 1, -1, 0, 128, 129, 3, 4, 2, 0, 129, 135, 1, 0, 0, 0, 130, 131, 10, 1, 0, 0, 131, 132, 5, 24, 0, 0, 132, 134, 3, 6, 3, 0, 133, 130, 1, 0, 0, 0, 134, 137, 1, 0, 0, 0, 135, 133, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 3, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 138, 145, 3, 110, 55, 0, 139, 145, 3, 34, 17, 0, 140, 145, 3, 28, 14, 0, 141, 145, 3, 114, 57, 0, 142, 143, 4, 2, 1, 0, 143, 145, 3, 48, 24, 0, 144, 138, 1, 0, 0, 0, 144, 139, 1, 0, 0, 0, 144, 140, 1, 0, 0, 0, 144, 141, 1, 0, 0, 0, 144, 142, 1, 0, 0, 0, 145, 5, 1, 0, 0, 0, 146, 163, 3, 50, 25, 0, 147, 163, 3, 8, 4, 0, 148, 163, 3, 80, 40, 0, 149, 163, 3, 74, 37, 0, 150, 163, 3, 52, 26, 0, 151, 163, 3, 76, 38, 0, 152, 163, 3, 82, 41, 0, 153, 163, 3, 84, 42, 0, 154, 163, 3, 88, 44, 0, 155, 163, 3, 90, 45, 0, 156, 163, 3, 116, 58, 0, 157, 163, 3, 92, 46, 0, 158, 159, 4, 3, 2, 0, 159, 163, 3, 122, 61, 0, 160, 161, 4, 3, 3, 0, 161, 163, 3, 120, 60, 0, 162, 146, 1, 0, 0, 0, 162, 147, 1, 0, 0, 0, 162, 148, 1, 0, 0, 0, 162, 149, 1, 0, 0, 0, 162, 150, 1, 0, 0, 0, 162, 151, 1, 0, 0, 0, 162, 152, 1, 0, 0, 0, 162, 153, 1, 0, 0, 0, 162, 154, 1, 0, 0, 0, 162, 155, 1, 0, 0, 0, 162, 156, 1, 0, 0, 0, 162, 157, 1, 0, 0, 0, 162, 158, 1, 0, 0, 0, 162, 160, 1, 0, 0, 0, 163, 7, 1, 0, 0, 0, 164, 165, 5, 16, 0, 0, 165, 166, 3, 10, 5, 0, 166, 9, 1, 0, 0, 0, 167, 168, 6, 5, -1, 0, 168, 169, 5, 43, 0, 0, 169, 198, 3, 10, 5, 8, 170, 198, 3, 16, 8, 0, 171, 198, 3, 12, 6, 0, 172, 174, 3, 16, 8, 0, 173, 175, 5, 43, 0, 0, 174, 173, 1, 0, 0, 0, 174, 175, 1, 0, 0, 0, 175, 176, 1, 0, 0, 0, 176, 177, 5, 38, 0, 0, 177, 178, 5, 42, 0, 0, 178, 183, 3, 16, 8, 0, 179, 180, 5, 33, 0, 0, 180, 182, 3, 16, 8, 0, 181, 179, 1, 0, 0, 0, 182, 185, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, 186, 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 186, 187, 5, 49, 0, 0, 187, 198, 1, 0, 0, 0, 188, 189, 3, 16, 8, 0, 189, 191, 5, 39, 0, 0, 190, 192, 5, 43, 0, 0, 191, 190, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 193, 1, 0, 0, 0, 193, 194, 5, 44, 0, 0, 194, 198, 1, 0, 0, 0, 195, 196, 4, 5, 4, 0, 196, 198, 3, 14, 7, 0, 197, 167, 1, 0, 0, 0, 197, 170, 1, 0, 0, 0, 197, 171, 1, 0, 0, 0, 197, 172, 1, 0, 0, 0, 197, 188, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 198, 207, 1, 0, 0, 0, 199, 200, 10, 5, 0, 0, 200, 201, 5, 29, 0, 0, 201, 206, 3, 10, 5, 6, 202, 203, 10, 4, 0, 0, 203, 204, 5, 46, 0, 0, 204, 206, 3, 10, 5, 5, 205, 199, 1, 0, 0, 0, 205, 202, 1, 0, 0, 0, 206, 209, 1, 0, 0, 0, 207, 205, 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 11, 1, 0, 0, 0, 209, 207, 1, 0, 0, 0, 210, 212, 3, 16, 8, 0, 211, 213, 5, 43, 0, 0, 212, 211, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 215, 5, 41, 0, 0, 215, 216, 3, 106, 53, 0, 216, 225, 1, 0, 0, 0, 217, 219, 3, 16, 8, 0, 218, 220, 5, 43, 0, 0, 219, 218, 1, 0, 0, 0, 219, 220, 1, 0, 0, 0, 220, 221, 1, 0, 0, 0, 221, 222, 5, 48, 0, 0, 222, 223, 3, 106, 53, 0, 223, 225, 1, 0, 0, 0, 224, 210, 1, 0, 0, 0, 224, 217, 1, 0, 0, 0, 225, 13, 1, 0, 0, 0, 226, 227, 3, 16, 8, 0, 227, 228, 5, 63, 0, 0, 228, 229, 3, 106, 53, 0, 229, 15, 1, 0, 0, 0, 230, 236, 3, 18, 9, 0, 231, 232, 3, 18, 9, 0, 232, 233, 3, 108, 54, 0, 233, 234, 3, 18, 9, 0, 234, 236, 1, 0, 0, 0, 235, 230, 1, 0, 0, 0, 235, 231, 1, 0, 0, 0, 236, 17, 1, 0, 0, 0, 237, 238, 6, 9, -1, 0, 238, 242, 3, 20, 10, 0, 239, 240, 7, 0, 0, 0, 240, 242, 3, 18, 9, 3, 241, 237, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 251, 1, 0, 0, 0, 243, 244, 10, 2, 0, 0, 244, 245, 7, 1, 0, 0, 245, 250, 3, 18, 9, 3, 246, 247, 10, 1, 0, 0, 247, 248, 7, 0, 0, 0, 248, 250, 3, 18, 9, 2, 249, 243, 1, 0, 0, 0, 249, 246, 1, 0, 0, 0, 250, 253, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 19, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 254, 255, 6, 10, -1, 0, 255, 263, 3, 68, 34, 0, 256, 263, 3, 58, 29, 0, 257, 263, 3, 22, 11, 0, 258, 259, 5, 42, 0, 0, 259, 260, 3, 10, 5, 0, 260, 261, 5, 49, 0, 0, 261, 263, 1, 0, 0, 0, 262, 254, 1, 0, 0, 0, 262, 256, 1, 0, 0, 0, 262, 257, 1, 0, 0, 0, 262, 258, 1, 0, 0, 0, 263, 269, 1, 0, 0, 0, 264, 265, 10, 1, 0, 0, 265, 266, 5, 32, 0, 0, 266, 268, 3, 26, 13, 0, 267, 264, 1, 0, 0, 0, 268, 271, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 269, 270, 1, 0, 0, 0, 270, 21, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 272, 273, 3, 24, 12, 0, 273, 283, 5, 42, 0, 0, 274, 284, 5, 60, 0, 0, 275, 280, 3, 10, 5, 0, 276, 277, 5, 33, 0, 0, 277, 279, 3, 10, 5, 0, 278, 276, 1, 0, 0, 0, 279, 282, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 284, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 283, 274, 1, 0, 0, 0, 283, 275, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 286, 5, 49, 0, 0, 286, 23, 1, 0, 0, 0, 287, 290, 5, 63, 0, 0, 288, 290, 3, 72, 36, 0, 289, 287, 1, 0, 0, 0, 289, 288, 1, 0, 0, 0, 290, 25, 1, 0, 0, 0, 291, 292, 3, 64, 32, 0, 292, 27, 1, 0, 0, 0, 293, 294, 5, 12, 0, 0, 294, 295, 3, 30, 15, 0, 295, 29, 1, 0, 0, 0, 296, 301, 3, 32, 16, 0, 297, 298, 5, 33, 0, 0, 298, 300, 3, 32, 16, 0, 299, 297, 1, 0, 0, 0, 300, 303, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 31, 1, 0, 0, 0, 303, 301, 1, 0, 0, 0, 304, 305, 3, 58, 29, 0, 305, 306, 5, 31, 0, 0, 306, 308, 1, 0, 0, 0, 307, 304, 1, 0, 0, 0, 307, 308, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 310, 3, 10, 5, 0, 310, 33, 1, 0, 0, 0, 311, 312, 5, 6, 0, 0, 312, 317, 3, 36, 18, 0, 313, 314, 5, 33, 0, 0, 314, 316, 3, 36, 18, 0, 315, 313, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 321, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 320, 322, 3, 42, 21, 0, 321, 320, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 35, 1, 0, 0, 0, 323, 324, 3, 38, 19, 0, 324, 325, 5, 104, 0, 0, 325, 327, 1, 0, 0, 0, 326, 323, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 329, 3, 40, 20, 0, 329, 37, 1, 0, 0, 0, 330, 331, 5, 76, 0, 0, 331, 39, 1, 0, 0, 0, 332, 333, 7, 2, 0, 0, 333, 41, 1, 0, 0, 0, 334, 337, 3, 44, 22, 0, 335, 337, 3, 46, 23, 0, 336, 334, 1, 0, 0, 0, 336, 335, 1, 0, 0, 0, 337, 43, 1, 0, 0, 0, 338, 339, 5, 75, 0, 0, 339, 344, 5, 76, 0, 0, 340, 341, 5, 33, 0, 0, 341, 343, 5, 76, 0, 0, 342, 340, 1, 0, 0, 0, 343, 346, 1, 0, 0, 0, 344, 342, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 45, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 347, 348, 5, 65, 0, 0, 348, 349, 3, 44, 22, 0, 349, 350, 5, 66, 0, 0, 350, 47, 1, 0, 0, 0, 351, 352, 5, 19, 0, 0, 352, 357, 3, 36, 18, 0, 353, 354, 5, 33, 0, 0, 354, 356, 3, 36, 18, 0, 355, 353, 1, 0, 0, 0, 356, 359, 1, 0, 0, 0, 357, 355, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 361, 1, 0, 0, 0, 359, 357, 1, 0, 0, 0, 360, 362, 3, 54, 27, 0, 361, 360, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 365, 1, 0, 0, 0, 363, 364, 5, 28, 0, 0, 364, 366, 3, 30, 15, 0, 365, 363, 1, 0, 0, 0, 365, 366, 1, 0, 0, 0, 366, 49, 1, 0, 0, 0, 367, 368, 5, 4, 0, 0, 368, 369, 3, 30, 15, 0, 369, 51, 1, 0, 0, 0, 370, 372, 5, 15, 0, 0, 371, 373, 3, 54, 27, 0, 372, 371, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 376, 1, 0, 0, 0, 374, 375, 5, 28, 0, 0, 375, 377, 3, 30, 15, 0, 376, 374, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 53, 1, 0, 0, 0, 378, 383, 3, 56, 28, 0, 379, 380, 5, 33, 0, 0, 380, 382, 3, 56, 28, 0, 381, 379, 1, 0, 0, 0, 382, 385, 1, 0, 0, 0, 383, 381, 1, 0, 0, 0, 383, 384, 1, 0, 0, 0, 384, 55, 1, 0, 0, 0, 385, 383, 1, 0, 0, 0, 386, 389, 3, 32, 16, 0, 387, 388, 5, 16, 0, 0, 388, 390, 3, 10, 5, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 57, 1, 0, 0, 0, 391, 396, 3, 72, 36, 0, 392, 393, 5, 35, 0, 0, 393, 395, 3, 72, 36, 0, 394, 392, 1, 0, 0, 0, 395, 398, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 59, 1, 0, 0, 0, 398, 396, 1, 0, 0, 0, 399, 404, 3, 66, 33, 0, 400, 401, 5, 35, 0, 0, 401, 403, 3, 66, 33, 0, 402, 400, 1, 0, 0, 0, 403, 406, 1, 0, 0, 0, 404, 402, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 61, 1, 0, 0, 0, 406, 404, 1, 0, 0, 0, 407, 412, 3, 60, 30, 0, 408, 409, 5, 33, 0, 0, 409, 411, 3, 60, 30, 0, 410, 408, 1, 0, 0, 0, 411, 414, 1, 0, 0, 0, 412, 410, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 63, 1, 0, 0, 0, 414, 412, 1, 0, 0, 0, 415, 416, 7, 3, 0, 0, 416, 65, 1, 0, 0, 0, 417, 421, 5, 80, 0, 0, 418, 419, 4, 33, 10, 0, 419, 421, 3, 70, 35, 0, 420, 417, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 421, 67, 1, 0, 0, 0, 422, 465, 5, 44, 0, 0, 423, 424, 3, 104, 52, 0, 424, 425, 5, 67, 0, 0, 425, 465, 1, 0, 0, 0, 426, 465, 3, 102, 51, 0, 427, 465, 3, 104, 52, 0, 428, 465, 3, 98, 49, 0, 429, 465, 3, 70, 35, 0, 430, 465, 3, 106, 53, 0, 431, 432, 5, 65, 0, 0, 432, 437, 3, 100, 50, 0, 433, 434, 5, 33, 0, 0, 434, 436, 3, 100, 50, 0, 435, 433, 1, 0, 0, 0, 436, 439, 1, 0, 0, 0, 437, 435, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 440, 1, 0, 0, 0, 439, 437, 1, 0, 0, 0, 440, 441, 5, 66, 0, 0, 441, 465, 1, 0, 0, 0, 442, 443, 5, 65, 0, 0, 443, 448, 3, 98, 49, 0, 444, 445, 5, 33, 0, 0, 445, 447, 3, 98, 49, 0, 446, 444, 1, 0, 0, 0, 447, 450, 1, 0, 0, 0, 448, 446, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 451, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 451, 452, 5, 66, 0, 0, 452, 465, 1, 0, 0, 0, 453, 454, 5, 65, 0, 0, 454, 459, 3, 106, 53, 0, 455, 456, 5, 33, 0, 0, 456, 458, 3, 106, 53, 0, 457, 455, 1, 0, 0, 0, 458, 461, 1, 0, 0, 0, 459, 457, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 462, 1, 0, 0, 0, 461, 459, 1, 0, 0, 0, 462, 463, 5, 66, 0, 0, 463, 465, 1, 0, 0, 0, 464, 422, 1, 0, 0, 0, 464, 423, 1, 0, 0, 0, 464, 426, 1, 0, 0, 0, 464, 427, 1, 0, 0, 0, 464, 428, 1, 0, 0, 0, 464, 429, 1, 0, 0, 0, 464, 430, 1, 0, 0, 0, 464, 431, 1, 0, 0, 0, 464, 442, 1, 0, 0, 0, 464, 453, 1, 0, 0, 0, 465, 69, 1, 0, 0, 0, 466, 469, 5, 47, 0, 0, 467, 469, 5, 64, 0, 0, 468, 466, 1, 0, 0, 0, 468, 467, 1, 0, 0, 0, 469, 71, 1, 0, 0, 0, 470, 474, 3, 64, 32, 0, 471, 472, 4, 36, 11, 0, 472, 474, 3, 70, 35, 0, 473, 470, 1, 0, 0, 0, 473, 471, 1, 0, 0, 0, 474, 73, 1, 0, 0, 0, 475, 476, 5, 9, 0, 0, 476, 477, 5, 26, 0, 0, 477, 75, 1, 0, 0, 0, 478, 479, 5, 14, 0, 0, 479, 484, 3, 78, 39, 0, 480, 481, 5, 33, 0, 0, 481, 483, 3, 78, 39, 0, 482, 480, 1, 0, 0, 0, 483, 486, 1, 0, 0, 0, 484, 482, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 77, 1, 0, 0, 0, 486, 484, 1, 0, 0, 0, 487, 489, 3, 10, 5, 0, 488, 490, 7, 4, 0, 0, 489, 488, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 493, 1, 0, 0, 0, 491, 492, 5, 45, 0, 0, 492, 494, 7, 5, 0, 0, 493, 491, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 79, 1, 0, 0, 0, 495, 496, 5, 8, 0, 0, 496, 497, 3, 62, 31, 0, 497, 81, 1, 0, 0, 0, 498, 499, 5, 2, 0, 0, 499, 500, 3, 62, 31, 0, 500, 83, 1, 0, 0, 0, 501, 502, 5, 11, 0, 0, 502, 507, 3, 86, 43, 0, 503, 504, 5, 33, 0, 0, 504, 506, 3, 86, 43, 0, 505, 503, 1, 0, 0, 0, 506, 509, 1, 0, 0, 0, 507, 505, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 85, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 510, 511, 3, 60, 30, 0, 511, 512, 5, 84, 0, 0, 512, 513, 3, 60, 30, 0, 513, 87, 1, 0, 0, 0, 514, 515, 5, 1, 0, 0, 515, 516, 3, 20, 10, 0, 516, 518, 3, 106, 53, 0, 517, 519, 3, 94, 47, 0, 518, 517, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 89, 1, 0, 0, 0, 520, 521, 5, 7, 0, 0, 521, 522, 3, 20, 10, 0, 522, 523, 3, 106, 53, 0, 523, 91, 1, 0, 0, 0, 524, 525, 5, 10, 0, 0, 525, 526, 3, 58, 29, 0, 526, 93, 1, 0, 0, 0, 527, 532, 3, 96, 48, 0, 528, 529, 5, 33, 0, 0, 529, 531, 3, 96, 48, 0, 530, 528, 1, 0, 0, 0, 531, 534, 1, 0, 0, 0, 532, 530, 1, 0, 0, 0, 532, 533, 1, 0, 0, 0, 533, 95, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 535, 536, 3, 64, 32, 0, 536, 537, 5, 31, 0, 0, 537, 538, 3, 68, 34, 0, 538, 97, 1, 0, 0, 0, 539, 540, 7, 6, 0, 0, 540, 99, 1, 0, 0, 0, 541, 544, 3, 102, 51, 0, 542, 544, 3, 104, 52, 0, 543, 541, 1, 0, 0, 0, 543, 542, 1, 0, 0, 0, 544, 101, 1, 0, 0, 0, 545, 547, 7, 0, 0, 0, 546, 545, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 549, 5, 27, 0, 0, 549, 103, 1, 0, 0, 0, 550, 552, 7, 0, 0, 0, 551, 550, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 554, 5, 26, 0, 0, 554, 105, 1, 0, 0, 0, 555, 556, 5, 25, 0, 0, 556, 107, 1, 0, 0, 0, 557, 558, 7, 7, 0, 0, 558, 109, 1, 0, 0, 0, 559, 560, 5, 5, 0, 0, 560, 561, 3, 112, 56, 0, 561, 111, 1, 0, 0, 0, 562, 563, 5, 65, 0, 0, 563, 564, 3, 2, 1, 0, 564, 565, 5, 66, 0, 0, 565, 113, 1, 0, 0, 0, 566, 567, 5, 13, 0, 0, 567, 568, 5, 100, 0, 0, 568, 115, 1, 0, 0, 0, 569, 570, 5, 3, 0, 0, 570, 573, 5, 90, 0, 0, 571, 572, 5, 88, 0, 0, 572, 574, 3, 60, 30, 0, 573, 571, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 584, 1, 0, 0, 0, 575, 576, 5, 89, 0, 0, 576, 581, 3, 118, 59, 0, 577, 578, 5, 33, 0, 0, 578, 580, 3, 118, 59, 0, 579, 577, 1, 0, 0, 0, 580, 583, 1, 0, 0, 0, 581, 579, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 585, 1, 0, 0, 0, 583, 581, 1, 0, 0, 0, 584, 575, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 117, 1, 0, 0, 0, 586, 587, 3, 60, 30, 0, 587, 588, 5, 31, 0, 0, 588, 590, 1, 0, 0, 0, 589, 586, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 592, 3, 60, 30, 0, 592, 119, 1, 0, 0, 0, 593, 594, 5, 18, 0, 0, 594, 595, 3, 36, 18, 0, 595, 596, 5, 88, 0, 0, 596, 597, 3, 62, 31, 0, 597, 121, 1, 0, 0, 0, 598, 599, 5, 17, 0, 0, 599, 602, 3, 54, 27, 0, 600, 601, 5, 28, 0, 0, 601, 603, 3, 30, 15, 0, 602, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 123, 1, 0, 0, 0, 59, 135, 144, 162, 174, 183, 191, 197, 205, 207, 212, 219, 224, 235, 241, 249, 251, 262, 269, 280, 283, 289, 301, 307, 317, 321, 326, 336, 344, 357, 361, 365, 372, 376, 383, 389, 396, 404, 412, 420, 437, 448, 459, 464, 468, 473, 484, 489, 493, 507, 518, 532, 543, 546, 551, 573, 581, 584, 589, 602] \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.tokens b/packages/kbn-esql-ast/src/antlr/esql_parser.tokens index 4fd37ab9900f2..4d1f426289149 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.tokens +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.tokens @@ -16,51 +16,51 @@ STATS=15 WHERE=16 DEV_INLINESTATS=17 DEV_LOOKUP=18 -DEV_MATCH=19 -DEV_METRICS=20 -UNKNOWN_CMD=21 -LINE_COMMENT=22 -MULTILINE_COMMENT=23 -WS=24 -PIPE=25 -QUOTED_STRING=26 -INTEGER_LITERAL=27 -DECIMAL_LITERAL=28 -BY=29 -AND=30 -ASC=31 -ASSIGN=32 -CAST_OP=33 -COMMA=34 -DESC=35 -DOT=36 -FALSE=37 -FIRST=38 -IN=39 -IS=40 -LAST=41 -LIKE=42 -LP=43 -NOT=44 -NULL=45 -NULLS=46 -OR=47 -PARAM=48 -RLIKE=49 -RP=50 -TRUE=51 -EQ=52 -CIEQ=53 -NEQ=54 -LT=55 -LTE=56 -GT=57 -GTE=58 -PLUS=59 -MINUS=60 -ASTERISK=61 -SLASH=62 -PERCENT=63 +DEV_METRICS=19 +UNKNOWN_CMD=20 +LINE_COMMENT=21 +MULTILINE_COMMENT=22 +WS=23 +PIPE=24 +QUOTED_STRING=25 +INTEGER_LITERAL=26 +DECIMAL_LITERAL=27 +BY=28 +AND=29 +ASC=30 +ASSIGN=31 +CAST_OP=32 +COMMA=33 +DESC=34 +DOT=35 +FALSE=36 +FIRST=37 +IN=38 +IS=39 +LAST=40 +LIKE=41 +LP=42 +NOT=43 +NULL=44 +NULLS=45 +OR=46 +PARAM=47 +RLIKE=48 +RP=49 +TRUE=50 +EQ=51 +CIEQ=52 +NEQ=53 +LT=54 +LTE=55 +GT=56 +GTE=57 +PLUS=58 +MINUS=59 +ASTERISK=60 +SLASH=61 +PERCENT=62 +MATCH=63 NAMED_OR_POSITIONAL_PARAM=64 OPENING_BRACKET=65 CLOSING_BRACKET=66 @@ -134,42 +134,43 @@ CLOSING_METRICS_WS=120 'sort'=14 'stats'=15 'where'=16 -'|'=25 -'by'=29 -'and'=30 -'asc'=31 -'='=32 -'::'=33 -','=34 -'desc'=35 -'.'=36 -'false'=37 -'first'=38 -'in'=39 -'is'=40 -'last'=41 -'like'=42 -'('=43 -'not'=44 -'null'=45 -'nulls'=46 -'or'=47 -'?'=48 -'rlike'=49 -')'=50 -'true'=51 -'=='=52 -'=~'=53 -'!='=54 -'<'=55 -'<='=56 -'>'=57 -'>='=58 -'+'=59 -'-'=60 -'*'=61 -'/'=62 -'%'=63 +'|'=24 +'by'=28 +'and'=29 +'asc'=30 +'='=31 +'::'=32 +','=33 +'desc'=34 +'.'=35 +'false'=36 +'first'=37 +'in'=38 +'is'=39 +'last'=40 +'like'=41 +'('=42 +'not'=43 +'null'=44 +'nulls'=45 +'or'=46 +'?'=47 +'rlike'=48 +')'=49 +'true'=50 +'=='=51 +'=~'=52 +'!='=53 +'<'=54 +'<='=55 +'>'=56 +'>='=57 +'+'=58 +'-'=59 +'*'=60 +'/'=61 +'%'=62 +'match'=63 ']'=66 'metadata'=75 'as'=84 diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.ts b/packages/kbn-esql-ast/src/antlr/esql_parser.ts index 41aea98166c97..b0af12e1ebc1e 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.ts @@ -46,51 +46,51 @@ export default class esql_parser extends parser_config { public static readonly WHERE = 16; public static readonly DEV_INLINESTATS = 17; public static readonly DEV_LOOKUP = 18; - public static readonly DEV_MATCH = 19; - public static readonly DEV_METRICS = 20; - public static readonly UNKNOWN_CMD = 21; - public static readonly LINE_COMMENT = 22; - public static readonly MULTILINE_COMMENT = 23; - public static readonly WS = 24; - public static readonly PIPE = 25; - public static readonly QUOTED_STRING = 26; - public static readonly INTEGER_LITERAL = 27; - public static readonly DECIMAL_LITERAL = 28; - public static readonly BY = 29; - public static readonly AND = 30; - public static readonly ASC = 31; - public static readonly ASSIGN = 32; - public static readonly CAST_OP = 33; - public static readonly COMMA = 34; - public static readonly DESC = 35; - public static readonly DOT = 36; - public static readonly FALSE = 37; - public static readonly FIRST = 38; - public static readonly IN = 39; - public static readonly IS = 40; - public static readonly LAST = 41; - public static readonly LIKE = 42; - public static readonly LP = 43; - public static readonly NOT = 44; - public static readonly NULL = 45; - public static readonly NULLS = 46; - public static readonly OR = 47; - public static readonly PARAM = 48; - public static readonly RLIKE = 49; - public static readonly RP = 50; - public static readonly TRUE = 51; - public static readonly EQ = 52; - public static readonly CIEQ = 53; - public static readonly NEQ = 54; - public static readonly LT = 55; - public static readonly LTE = 56; - public static readonly GT = 57; - public static readonly GTE = 58; - public static readonly PLUS = 59; - public static readonly MINUS = 60; - public static readonly ASTERISK = 61; - public static readonly SLASH = 62; - public static readonly PERCENT = 63; + public static readonly DEV_METRICS = 19; + public static readonly UNKNOWN_CMD = 20; + public static readonly LINE_COMMENT = 21; + public static readonly MULTILINE_COMMENT = 22; + public static readonly WS = 23; + public static readonly PIPE = 24; + public static readonly QUOTED_STRING = 25; + public static readonly INTEGER_LITERAL = 26; + public static readonly DECIMAL_LITERAL = 27; + public static readonly BY = 28; + public static readonly AND = 29; + public static readonly ASC = 30; + public static readonly ASSIGN = 31; + public static readonly CAST_OP = 32; + public static readonly COMMA = 33; + public static readonly DESC = 34; + public static readonly DOT = 35; + public static readonly FALSE = 36; + public static readonly FIRST = 37; + public static readonly IN = 38; + public static readonly IS = 39; + public static readonly LAST = 40; + public static readonly LIKE = 41; + public static readonly LP = 42; + public static readonly NOT = 43; + public static readonly NULL = 44; + public static readonly NULLS = 45; + public static readonly OR = 46; + public static readonly PARAM = 47; + public static readonly RLIKE = 48; + public static readonly RP = 49; + public static readonly TRUE = 50; + public static readonly EQ = 51; + public static readonly CIEQ = 52; + public static readonly NEQ = 53; + public static readonly LT = 54; + public static readonly LTE = 55; + public static readonly GT = 56; + public static readonly GTE = 57; + public static readonly PLUS = 58; + public static readonly MINUS = 59; + public static readonly ASTERISK = 60; + public static readonly SLASH = 61; + public static readonly PERCENT = 62; + public static readonly MATCH = 63; public static readonly NAMED_OR_POSITIONAL_PARAM = 64; public static readonly OPENING_BRACKET = 65; public static readonly CLOSING_BRACKET = 66; @@ -161,53 +161,56 @@ export default class esql_parser extends parser_config { public static readonly RULE_operatorExpression = 9; public static readonly RULE_primaryExpression = 10; public static readonly RULE_functionExpression = 11; - public static readonly RULE_dataType = 12; - public static readonly RULE_rowCommand = 13; - public static readonly RULE_fields = 14; - public static readonly RULE_field = 15; - public static readonly RULE_fromCommand = 16; - public static readonly RULE_indexPattern = 17; - public static readonly RULE_clusterString = 18; - public static readonly RULE_indexString = 19; - public static readonly RULE_metadata = 20; - public static readonly RULE_metadataOption = 21; - public static readonly RULE_deprecated_metadata = 22; - public static readonly RULE_metricsCommand = 23; - public static readonly RULE_evalCommand = 24; - public static readonly RULE_statsCommand = 25; - public static readonly RULE_qualifiedName = 26; - public static readonly RULE_qualifiedNamePattern = 27; - public static readonly RULE_qualifiedNamePatterns = 28; - public static readonly RULE_identifier = 29; - public static readonly RULE_identifierPattern = 30; - public static readonly RULE_constant = 31; - public static readonly RULE_parameter = 32; - public static readonly RULE_identifierOrParameter = 33; - public static readonly RULE_limitCommand = 34; - public static readonly RULE_sortCommand = 35; - public static readonly RULE_orderExpression = 36; - public static readonly RULE_keepCommand = 37; - public static readonly RULE_dropCommand = 38; - public static readonly RULE_renameCommand = 39; - public static readonly RULE_renameClause = 40; - public static readonly RULE_dissectCommand = 41; - public static readonly RULE_grokCommand = 42; - public static readonly RULE_mvExpandCommand = 43; - public static readonly RULE_commandOptions = 44; - public static readonly RULE_commandOption = 45; - public static readonly RULE_booleanValue = 46; - public static readonly RULE_numericValue = 47; - public static readonly RULE_decimalValue = 48; - public static readonly RULE_integerValue = 49; - public static readonly RULE_string = 50; - public static readonly RULE_comparisonOperator = 51; - public static readonly RULE_explainCommand = 52; - public static readonly RULE_subqueryExpression = 53; - public static readonly RULE_showCommand = 54; - public static readonly RULE_enrichCommand = 55; - public static readonly RULE_enrichWithClause = 56; - public static readonly RULE_lookupCommand = 57; - public static readonly RULE_inlinestatsCommand = 58; + public static readonly RULE_functionName = 12; + public static readonly RULE_dataType = 13; + public static readonly RULE_rowCommand = 14; + public static readonly RULE_fields = 15; + public static readonly RULE_field = 16; + public static readonly RULE_fromCommand = 17; + public static readonly RULE_indexPattern = 18; + public static readonly RULE_clusterString = 19; + public static readonly RULE_indexString = 20; + public static readonly RULE_metadata = 21; + public static readonly RULE_metadataOption = 22; + public static readonly RULE_deprecated_metadata = 23; + public static readonly RULE_metricsCommand = 24; + public static readonly RULE_evalCommand = 25; + public static readonly RULE_statsCommand = 26; + public static readonly RULE_aggFields = 27; + public static readonly RULE_aggField = 28; + public static readonly RULE_qualifiedName = 29; + public static readonly RULE_qualifiedNamePattern = 30; + public static readonly RULE_qualifiedNamePatterns = 31; + public static readonly RULE_identifier = 32; + public static readonly RULE_identifierPattern = 33; + public static readonly RULE_constant = 34; + public static readonly RULE_parameter = 35; + public static readonly RULE_identifierOrParameter = 36; + public static readonly RULE_limitCommand = 37; + public static readonly RULE_sortCommand = 38; + public static readonly RULE_orderExpression = 39; + public static readonly RULE_keepCommand = 40; + public static readonly RULE_dropCommand = 41; + public static readonly RULE_renameCommand = 42; + public static readonly RULE_renameClause = 43; + public static readonly RULE_dissectCommand = 44; + public static readonly RULE_grokCommand = 45; + public static readonly RULE_mvExpandCommand = 46; + public static readonly RULE_commandOptions = 47; + public static readonly RULE_commandOption = 48; + public static readonly RULE_booleanValue = 49; + public static readonly RULE_numericValue = 50; + public static readonly RULE_decimalValue = 51; + public static readonly RULE_integerValue = 52; + public static readonly RULE_string = 53; + public static readonly RULE_comparisonOperator = 54; + public static readonly RULE_explainCommand = 55; + public static readonly RULE_subqueryExpression = 56; + public static readonly RULE_showCommand = 57; + public static readonly RULE_enrichCommand = 58; + public static readonly RULE_enrichWithClause = 59; + public static readonly RULE_lookupCommand = 60; + public static readonly RULE_inlinestatsCommand = 61; public static readonly literalNames: (string | null)[] = [ null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", @@ -221,26 +224,26 @@ export default class esql_parser extends parser_config { null, null, null, null, null, null, - null, "'|'", + "'|'", null, null, null, - null, "'by'", - "'and'", "'asc'", - "'='", "'::'", - "','", "'desc'", - "'.'", "'false'", - "'first'", "'in'", - "'is'", "'last'", - "'like'", "'('", - "'not'", "'null'", - "'nulls'", "'or'", - "'?'", "'rlike'", - "')'", "'true'", - "'=='", "'=~'", - "'!='", "'<'", - "'<='", "'>'", - "'>='", "'+'", - "'-'", "'*'", - "'/'", "'%'", + "'by'", "'and'", + "'asc'", "'='", + "'::'", "','", + "'desc'", "'.'", + "'false'", "'first'", + "'in'", "'is'", + "'last'", "'like'", + "'('", "'not'", + "'null'", "'nulls'", + "'or'", "'?'", + "'rlike'", "')'", + "'true'", "'=='", + "'=~'", "'!='", + "'<'", "'<='", + "'>'", "'>='", + "'+'", "'-'", + "'*'", "'/'", + "'%'", "'match'", null, null, "']'", null, null, null, @@ -273,7 +276,6 @@ export default class esql_parser extends parser_config { "STATS", "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", - "DEV_MATCH", "DEV_METRICS", "UNKNOWN_CMD", "LINE_COMMENT", @@ -300,7 +302,7 @@ export default class esql_parser extends parser_config { "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", - "NAMED_OR_POSITIONAL_PARAM", + "MATCH", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", @@ -358,16 +360,16 @@ export default class esql_parser extends parser_config { "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", "booleanExpression", "regexBooleanExpression", "matchBooleanExpression", "valueExpression", "operatorExpression", "primaryExpression", "functionExpression", - "dataType", "rowCommand", "fields", "field", "fromCommand", "indexPattern", - "clusterString", "indexString", "metadata", "metadataOption", "deprecated_metadata", - "metricsCommand", "evalCommand", "statsCommand", "qualifiedName", "qualifiedNamePattern", - "qualifiedNamePatterns", "identifier", "identifierPattern", "constant", - "parameter", "identifierOrParameter", "limitCommand", "sortCommand", "orderExpression", - "keepCommand", "dropCommand", "renameCommand", "renameClause", "dissectCommand", - "grokCommand", "mvExpandCommand", "commandOptions", "commandOption", "booleanValue", - "numericValue", "decimalValue", "integerValue", "string", "comparisonOperator", - "explainCommand", "subqueryExpression", "showCommand", "enrichCommand", - "enrichWithClause", "lookupCommand", "inlinestatsCommand", + "functionName", "dataType", "rowCommand", "fields", "field", "fromCommand", + "indexPattern", "clusterString", "indexString", "metadata", "metadataOption", + "deprecated_metadata", "metricsCommand", "evalCommand", "statsCommand", + "aggFields", "aggField", "qualifiedName", "qualifiedNamePattern", "qualifiedNamePatterns", + "identifier", "identifierPattern", "constant", "parameter", "identifierOrParameter", + "limitCommand", "sortCommand", "orderExpression", "keepCommand", "dropCommand", + "renameCommand", "renameClause", "dissectCommand", "grokCommand", "mvExpandCommand", + "commandOptions", "commandOption", "booleanValue", "numericValue", "decimalValue", + "integerValue", "string", "comparisonOperator", "explainCommand", "subqueryExpression", + "showCommand", "enrichCommand", "enrichWithClause", "lookupCommand", "inlinestatsCommand", ]; public get grammarFileName(): string { return "esql_parser.g4"; } public get literalNames(): (string | null)[] { return esql_parser.literalNames; } @@ -390,9 +392,9 @@ export default class esql_parser extends parser_config { try { this.enterOuterAlt(localctx, 1); { - this.state = 118; + this.state = 124; this.query(0); - this.state = 119; + this.state = 125; this.match(esql_parser.EOF); } } @@ -434,11 +436,11 @@ export default class esql_parser extends parser_config { this._ctx = localctx; _prevctx = localctx; - this.state = 122; + this.state = 128; this.sourceCommand(); } this._ctx.stop = this._input.LT(-1); - this.state = 129; + this.state = 135; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 0, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -451,18 +453,18 @@ export default class esql_parser extends parser_config { { localctx = new CompositeQueryContext(this, new QueryContext(this, _parentctx, _parentState)); this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_query); - this.state = 124; + this.state = 130; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 125; + this.state = 131; this.match(esql_parser.PIPE); - this.state = 126; + this.state = 132; this.processingCommand(); } } } - this.state = 131; + this.state = 137; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 0, this._ctx); } @@ -487,45 +489,45 @@ export default class esql_parser extends parser_config { let localctx: SourceCommandContext = new SourceCommandContext(this, this._ctx, this.state); this.enterRule(localctx, 4, esql_parser.RULE_sourceCommand); try { - this.state = 138; + this.state = 144; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 1, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 132; + this.state = 138; this.explainCommand(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 133; + this.state = 139; this.fromCommand(); } break; case 3: this.enterOuterAlt(localctx, 3); { - this.state = 134; + this.state = 140; this.rowCommand(); } break; case 4: this.enterOuterAlt(localctx, 4); { - this.state = 135; + this.state = 141; this.showCommand(); } break; case 5: this.enterOuterAlt(localctx, 5); { - this.state = 136; + this.state = 142; if (!(this.isDevVersion())) { throw this.createFailedPredicateException("this.isDevVersion()"); } - this.state = 137; + this.state = 143; this.metricsCommand(); } break; @@ -550,112 +552,112 @@ export default class esql_parser extends parser_config { let localctx: ProcessingCommandContext = new ProcessingCommandContext(this, this._ctx, this.state); this.enterRule(localctx, 6, esql_parser.RULE_processingCommand); try { - this.state = 156; + this.state = 162; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 2, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 140; + this.state = 146; this.evalCommand(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 141; + this.state = 147; this.whereCommand(); } break; case 3: this.enterOuterAlt(localctx, 3); { - this.state = 142; + this.state = 148; this.keepCommand(); } break; case 4: this.enterOuterAlt(localctx, 4); { - this.state = 143; + this.state = 149; this.limitCommand(); } break; case 5: this.enterOuterAlt(localctx, 5); { - this.state = 144; + this.state = 150; this.statsCommand(); } break; case 6: this.enterOuterAlt(localctx, 6); { - this.state = 145; + this.state = 151; this.sortCommand(); } break; case 7: this.enterOuterAlt(localctx, 7); { - this.state = 146; + this.state = 152; this.dropCommand(); } break; case 8: this.enterOuterAlt(localctx, 8); { - this.state = 147; + this.state = 153; this.renameCommand(); } break; case 9: this.enterOuterAlt(localctx, 9); { - this.state = 148; + this.state = 154; this.dissectCommand(); } break; case 10: this.enterOuterAlt(localctx, 10); { - this.state = 149; + this.state = 155; this.grokCommand(); } break; case 11: this.enterOuterAlt(localctx, 11); { - this.state = 150; + this.state = 156; this.enrichCommand(); } break; case 12: this.enterOuterAlt(localctx, 12); { - this.state = 151; + this.state = 157; this.mvExpandCommand(); } break; case 13: this.enterOuterAlt(localctx, 13); { - this.state = 152; + this.state = 158; if (!(this.isDevVersion())) { throw this.createFailedPredicateException("this.isDevVersion()"); } - this.state = 153; + this.state = 159; this.inlinestatsCommand(); } break; case 14: this.enterOuterAlt(localctx, 14); { - this.state = 154; + this.state = 160; if (!(this.isDevVersion())) { throw this.createFailedPredicateException("this.isDevVersion()"); } - this.state = 155; + this.state = 161; this.lookupCommand(); } break; @@ -682,9 +684,9 @@ export default class esql_parser extends parser_config { try { this.enterOuterAlt(localctx, 1); { - this.state = 158; + this.state = 164; this.match(esql_parser.WHERE); - this.state = 159; + this.state = 165; this.booleanExpression(0); } } @@ -722,7 +724,7 @@ export default class esql_parser extends parser_config { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 191; + this.state = 197; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 6, this._ctx) ) { case 1: @@ -731,9 +733,9 @@ export default class esql_parser extends parser_config { this._ctx = localctx; _prevctx = localctx; - this.state = 162; + this.state = 168; this.match(esql_parser.NOT); - this.state = 163; + this.state = 169; this.booleanExpression(8); } break; @@ -742,7 +744,7 @@ export default class esql_parser extends parser_config { localctx = new BooleanDefaultContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 164; + this.state = 170; this.valueExpression(); } break; @@ -751,7 +753,7 @@ export default class esql_parser extends parser_config { localctx = new RegexExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 165; + this.state = 171; this.regexBooleanExpression(); } break; @@ -760,41 +762,41 @@ export default class esql_parser extends parser_config { localctx = new LogicalInContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 166; + this.state = 172; this.valueExpression(); - this.state = 168; + this.state = 174; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===44) { + if (_la===43) { { - this.state = 167; + this.state = 173; this.match(esql_parser.NOT); } } - this.state = 170; + this.state = 176; this.match(esql_parser.IN); - this.state = 171; + this.state = 177; this.match(esql_parser.LP); - this.state = 172; + this.state = 178; this.valueExpression(); - this.state = 177; + this.state = 183; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===34) { + while (_la===33) { { { - this.state = 173; + this.state = 179; this.match(esql_parser.COMMA); - this.state = 174; + this.state = 180; this.valueExpression(); } } - this.state = 179; + this.state = 185; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 180; + this.state = 186; this.match(esql_parser.RP); } break; @@ -803,21 +805,21 @@ export default class esql_parser extends parser_config { localctx = new IsNullContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 182; + this.state = 188; this.valueExpression(); - this.state = 183; + this.state = 189; this.match(esql_parser.IS); - this.state = 185; + this.state = 191; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===44) { + if (_la===43) { { - this.state = 184; + this.state = 190; this.match(esql_parser.NOT); } } - this.state = 187; + this.state = 193; this.match(esql_parser.NULL); } break; @@ -826,17 +828,17 @@ export default class esql_parser extends parser_config { localctx = new MatchExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 189; + this.state = 195; if (!(this.isDevVersion())) { throw this.createFailedPredicateException("this.isDevVersion()"); } - this.state = 190; + this.state = 196; this.matchBooleanExpression(); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 201; + this.state = 207; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 8, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -846,7 +848,7 @@ export default class esql_parser extends parser_config { } _prevctx = localctx; { - this.state = 199; + this.state = 205; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 7, this._ctx) ) { case 1: @@ -854,13 +856,13 @@ export default class esql_parser extends parser_config { localctx = new LogicalBinaryContext(this, new BooleanExpressionContext(this, _parentctx, _parentState)); (localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 193; + this.state = 199; if (!(this.precpred(this._ctx, 5))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 5)"); } - this.state = 194; + this.state = 200; (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.AND); - this.state = 195; + this.state = 201; (localctx as LogicalBinaryContext)._right = this.booleanExpression(6); } break; @@ -869,20 +871,20 @@ export default class esql_parser extends parser_config { localctx = new LogicalBinaryContext(this, new BooleanExpressionContext(this, _parentctx, _parentState)); (localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 196; + this.state = 202; if (!(this.precpred(this._ctx, 4))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 4)"); } - this.state = 197; + this.state = 203; (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.OR); - this.state = 198; + this.state = 204; (localctx as LogicalBinaryContext)._right = this.booleanExpression(5); } break; } } } - this.state = 203; + this.state = 209; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 8, this._ctx); } @@ -908,48 +910,48 @@ export default class esql_parser extends parser_config { this.enterRule(localctx, 12, esql_parser.RULE_regexBooleanExpression); let _la: number; try { - this.state = 218; + this.state = 224; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 11, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 204; + this.state = 210; this.valueExpression(); - this.state = 206; + this.state = 212; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===44) { + if (_la===43) { { - this.state = 205; + this.state = 211; this.match(esql_parser.NOT); } } - this.state = 208; + this.state = 214; localctx._kind = this.match(esql_parser.LIKE); - this.state = 209; + this.state = 215; localctx._pattern = this.string_(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 211; + this.state = 217; this.valueExpression(); - this.state = 213; + this.state = 219; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===44) { + if (_la===43) { { - this.state = 212; + this.state = 218; this.match(esql_parser.NOT); } } - this.state = 215; + this.state = 221; localctx._kind = this.match(esql_parser.RLIKE); - this.state = 216; + this.state = 222; localctx._pattern = this.string_(); } break; @@ -976,11 +978,11 @@ export default class esql_parser extends parser_config { try { this.enterOuterAlt(localctx, 1); { - this.state = 220; + this.state = 226; this.valueExpression(); - this.state = 221; - this.match(esql_parser.DEV_MATCH); - this.state = 222; + this.state = 227; + this.match(esql_parser.MATCH); + this.state = 228; localctx._queryString = this.string_(); } } @@ -1003,14 +1005,14 @@ export default class esql_parser extends parser_config { let localctx: ValueExpressionContext = new ValueExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 16, esql_parser.RULE_valueExpression); try { - this.state = 229; + this.state = 235; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 12, this._ctx) ) { case 1: localctx = new ValueExpressionDefaultContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 224; + this.state = 230; this.operatorExpression(0); } break; @@ -1018,11 +1020,11 @@ export default class esql_parser extends parser_config { localctx = new ComparisonContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 225; + this.state = 231; (localctx as ComparisonContext)._left = this.operatorExpression(0); - this.state = 226; + this.state = 232; this.comparisonOperator(); - this.state = 227; + this.state = 233; (localctx as ComparisonContext)._right = this.operatorExpression(0); } break; @@ -1062,7 +1064,7 @@ export default class esql_parser extends parser_config { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 235; + this.state = 241; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 13, this._ctx) ) { case 1: @@ -1071,7 +1073,7 @@ export default class esql_parser extends parser_config { this._ctx = localctx; _prevctx = localctx; - this.state = 232; + this.state = 238; this.primaryExpression(0); } break; @@ -1080,23 +1082,23 @@ export default class esql_parser extends parser_config { localctx = new ArithmeticUnaryContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 233; + this.state = 239; (localctx as ArithmeticUnaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===59 || _la===60)) { + if(!(_la===58 || _la===59)) { (localctx as ArithmeticUnaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 234; + this.state = 240; this.operatorExpression(3); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 245; + this.state = 251; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1106,7 +1108,7 @@ export default class esql_parser extends parser_config { } _prevctx = localctx; { - this.state = 243; + this.state = 249; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 14, this._ctx) ) { case 1: @@ -1114,21 +1116,21 @@ export default class esql_parser extends parser_config { localctx = new ArithmeticBinaryContext(this, new OperatorExpressionContext(this, _parentctx, _parentState)); (localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 237; + this.state = 243; if (!(this.precpred(this._ctx, 2))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 2)"); } - this.state = 238; + this.state = 244; (localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & 7) !== 0))) { + if(!(((((_la - 60)) & ~0x1F) === 0 && ((1 << (_la - 60)) & 7) !== 0))) { (localctx as ArithmeticBinaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 239; + this.state = 245; (localctx as ArithmeticBinaryContext)._right = this.operatorExpression(3); } break; @@ -1137,28 +1139,28 @@ export default class esql_parser extends parser_config { localctx = new ArithmeticBinaryContext(this, new OperatorExpressionContext(this, _parentctx, _parentState)); (localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 240; + this.state = 246; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 241; + this.state = 247; (localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===59 || _la===60)) { + if(!(_la===58 || _la===59)) { (localctx as ArithmeticBinaryContext)._operator = this._errHandler.recoverInline(this); } else { this._errHandler.reportMatch(this); this.consume(); } - this.state = 242; + this.state = 248; (localctx as ArithmeticBinaryContext)._right = this.operatorExpression(2); } break; } } } - this.state = 247; + this.state = 253; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); } @@ -1197,7 +1199,7 @@ export default class esql_parser extends parser_config { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 256; + this.state = 262; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 16, this._ctx) ) { case 1: @@ -1206,7 +1208,7 @@ export default class esql_parser extends parser_config { this._ctx = localctx; _prevctx = localctx; - this.state = 249; + this.state = 255; this.constant(); } break; @@ -1215,7 +1217,7 @@ export default class esql_parser extends parser_config { localctx = new DereferenceContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 250; + this.state = 256; this.qualifiedName(); } break; @@ -1224,7 +1226,7 @@ export default class esql_parser extends parser_config { localctx = new FunctionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 251; + this.state = 257; this.functionExpression(); } break; @@ -1233,17 +1235,17 @@ export default class esql_parser extends parser_config { localctx = new ParenthesizedExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 252; + this.state = 258; this.match(esql_parser.LP); - this.state = 253; + this.state = 259; this.booleanExpression(0); - this.state = 254; + this.state = 260; this.match(esql_parser.RP); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 263; + this.state = 269; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 17, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1256,18 +1258,18 @@ export default class esql_parser extends parser_config { { localctx = new InlineCastContext(this, new PrimaryExpressionContext(this, _parentctx, _parentState)); this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_primaryExpression); - this.state = 258; + this.state = 264; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 259; + this.state = 265; this.match(esql_parser.CAST_OP); - this.state = 260; + this.state = 266; this.dataType(); } } } - this.state = 265; + this.state = 271; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 17, this._ctx); } @@ -1295,37 +1297,37 @@ export default class esql_parser extends parser_config { try { this.enterOuterAlt(localctx, 1); { - this.state = 266; - this.identifierOrParameter(); - this.state = 267; + this.state = 272; + this.functionName(); + this.state = 273; this.match(esql_parser.LP); - this.state = 277; + this.state = 283; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 19, this._ctx) ) { case 1: { - this.state = 268; + this.state = 274; this.match(esql_parser.ASTERISK); } break; case 2: { { - this.state = 269; + this.state = 275; this.booleanExpression(0); - this.state = 274; + this.state = 280; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===34) { + while (_la===33) { { { - this.state = 270; + this.state = 276; this.match(esql_parser.COMMA); - this.state = 271; + this.state = 277; this.booleanExpression(0); } } - this.state = 276; + this.state = 282; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -1333,7 +1335,7 @@ export default class esql_parser extends parser_config { } break; } - this.state = 279; + this.state = 285; this.match(esql_parser.RP); } } @@ -1352,14 +1354,52 @@ export default class esql_parser extends parser_config { return localctx; } // @RuleVersion(0) + public functionName(): FunctionNameContext { + let localctx: FunctionNameContext = new FunctionNameContext(this, this._ctx, this.state); + this.enterRule(localctx, 24, esql_parser.RULE_functionName); + try { + this.state = 289; + this._errHandler.sync(this); + switch ( this._interp.adaptivePredict(this._input, 20, this._ctx) ) { + case 1: + this.enterOuterAlt(localctx, 1); + { + this.state = 287; + this.match(esql_parser.MATCH); + } + break; + case 2: + this.enterOuterAlt(localctx, 2); + { + this.state = 288; + this.identifierOrParameter(); + } + break; + } + } + catch (re) { + if (re instanceof RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localctx; + } + // @RuleVersion(0) public dataType(): DataTypeContext { let localctx: DataTypeContext = new DataTypeContext(this, this._ctx, this.state); - this.enterRule(localctx, 24, esql_parser.RULE_dataType); + this.enterRule(localctx, 26, esql_parser.RULE_dataType); try { localctx = new ToDataTypeContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 281; + this.state = 291; this.identifier(); } } @@ -1380,13 +1420,13 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public rowCommand(): RowCommandContext { let localctx: RowCommandContext = new RowCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 26, esql_parser.RULE_rowCommand); + this.enterRule(localctx, 28, esql_parser.RULE_rowCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 283; + this.state = 293; this.match(esql_parser.ROW); - this.state = 284; + this.state = 294; this.fields(); } } @@ -1407,30 +1447,30 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public fields(): FieldsContext { let localctx: FieldsContext = new FieldsContext(this, this._ctx, this.state); - this.enterRule(localctx, 28, esql_parser.RULE_fields); + this.enterRule(localctx, 30, esql_parser.RULE_fields); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 286; + this.state = 296; this.field(); - this.state = 291; + this.state = 301; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 20, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 21, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 287; + this.state = 297; this.match(esql_parser.COMMA); - this.state = 288; + this.state = 298; this.field(); } } } - this.state = 293; + this.state = 303; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 20, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 21, this._ctx); } } } @@ -1451,30 +1491,25 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public field(): FieldContext { let localctx: FieldContext = new FieldContext(this, this._ctx, this.state); - this.enterRule(localctx, 30, esql_parser.RULE_field); + this.enterRule(localctx, 32, esql_parser.RULE_field); try { - this.state = 299; + this.enterOuterAlt(localctx, 1); + { + this.state = 307; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 21, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 22, this._ctx) ) { case 1: - this.enterOuterAlt(localctx, 1); - { - this.state = 294; - this.booleanExpression(0); - } - break; - case 2: - this.enterOuterAlt(localctx, 2); { - this.state = 295; + this.state = 304; this.qualifiedName(); - this.state = 296; + this.state = 305; this.match(esql_parser.ASSIGN); - this.state = 297; - this.booleanExpression(0); } break; } + this.state = 309; + this.booleanExpression(0); + } } catch (re) { if (re instanceof RecognitionException) { @@ -1493,39 +1528,39 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public fromCommand(): FromCommandContext { let localctx: FromCommandContext = new FromCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 32, esql_parser.RULE_fromCommand); + this.enterRule(localctx, 34, esql_parser.RULE_fromCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 301; + this.state = 311; this.match(esql_parser.FROM); - this.state = 302; + this.state = 312; this.indexPattern(); - this.state = 307; + this.state = 317; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 22, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 23, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 303; + this.state = 313; this.match(esql_parser.COMMA); - this.state = 304; + this.state = 314; this.indexPattern(); } } } - this.state = 309; + this.state = 319; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 22, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 23, this._ctx); } - this.state = 311; + this.state = 321; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 23, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 24, this._ctx) ) { case 1: { - this.state = 310; + this.state = 320; this.metadata(); } break; @@ -1549,30 +1584,25 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public indexPattern(): IndexPatternContext { let localctx: IndexPatternContext = new IndexPatternContext(this, this._ctx, this.state); - this.enterRule(localctx, 34, esql_parser.RULE_indexPattern); + this.enterRule(localctx, 36, esql_parser.RULE_indexPattern); try { - this.state = 318; + this.enterOuterAlt(localctx, 1); + { + this.state = 326; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 24, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 25, this._ctx) ) { case 1: - this.enterOuterAlt(localctx, 1); { - this.state = 313; + this.state = 323; this.clusterString(); - this.state = 314; + this.state = 324; this.match(esql_parser.COLON); - this.state = 315; - this.indexString(); - } - break; - case 2: - this.enterOuterAlt(localctx, 2); - { - this.state = 317; - this.indexString(); } break; } + this.state = 328; + this.indexString(); + } } catch (re) { if (re instanceof RecognitionException) { @@ -1591,11 +1621,11 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public clusterString(): ClusterStringContext { let localctx: ClusterStringContext = new ClusterStringContext(this, this._ctx, this.state); - this.enterRule(localctx, 36, esql_parser.RULE_clusterString); + this.enterRule(localctx, 38, esql_parser.RULE_clusterString); try { this.enterOuterAlt(localctx, 1); { - this.state = 320; + this.state = 330; this.match(esql_parser.UNQUOTED_SOURCE); } } @@ -1616,14 +1646,14 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public indexString(): IndexStringContext { let localctx: IndexStringContext = new IndexStringContext(this, this._ctx, this.state); - this.enterRule(localctx, 38, esql_parser.RULE_indexString); + this.enterRule(localctx, 40, esql_parser.RULE_indexString); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 322; + this.state = 332; _la = this._input.LA(1); - if(!(_la===26 || _la===76)) { + if(!(_la===25 || _la===76)) { this._errHandler.recoverInline(this); } else { @@ -1649,22 +1679,22 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public metadata(): MetadataContext { let localctx: MetadataContext = new MetadataContext(this, this._ctx, this.state); - this.enterRule(localctx, 40, esql_parser.RULE_metadata); + this.enterRule(localctx, 42, esql_parser.RULE_metadata); try { - this.state = 326; + this.state = 336; this._errHandler.sync(this); switch (this._input.LA(1)) { case 75: this.enterOuterAlt(localctx, 1); { - this.state = 324; + this.state = 334; this.metadataOption(); } break; case 65: this.enterOuterAlt(localctx, 2); { - this.state = 325; + this.state = 335; this.deprecated_metadata(); } break; @@ -1689,32 +1719,32 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public metadataOption(): MetadataOptionContext { let localctx: MetadataOptionContext = new MetadataOptionContext(this, this._ctx, this.state); - this.enterRule(localctx, 42, esql_parser.RULE_metadataOption); + this.enterRule(localctx, 44, esql_parser.RULE_metadataOption); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 328; + this.state = 338; this.match(esql_parser.METADATA); - this.state = 329; + this.state = 339; this.match(esql_parser.UNQUOTED_SOURCE); - this.state = 334; + this.state = 344; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 26, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 27, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 330; + this.state = 340; this.match(esql_parser.COMMA); - this.state = 331; + this.state = 341; this.match(esql_parser.UNQUOTED_SOURCE); } } } - this.state = 336; + this.state = 346; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 26, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 27, this._ctx); } } } @@ -1735,15 +1765,15 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public deprecated_metadata(): Deprecated_metadataContext { let localctx: Deprecated_metadataContext = new Deprecated_metadataContext(this, this._ctx, this.state); - this.enterRule(localctx, 44, esql_parser.RULE_deprecated_metadata); + this.enterRule(localctx, 46, esql_parser.RULE_deprecated_metadata); try { this.enterOuterAlt(localctx, 1); { - this.state = 337; + this.state = 347; this.match(esql_parser.OPENING_BRACKET); - this.state = 338; + this.state = 348; this.metadataOption(); - this.state = 339; + this.state = 349; this.match(esql_parser.CLOSING_BRACKET); } } @@ -1764,51 +1794,51 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public metricsCommand(): MetricsCommandContext { let localctx: MetricsCommandContext = new MetricsCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 46, esql_parser.RULE_metricsCommand); + this.enterRule(localctx, 48, esql_parser.RULE_metricsCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 341; + this.state = 351; this.match(esql_parser.DEV_METRICS); - this.state = 342; + this.state = 352; this.indexPattern(); - this.state = 347; + this.state = 357; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 27, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 28, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 343; + this.state = 353; this.match(esql_parser.COMMA); - this.state = 344; + this.state = 354; this.indexPattern(); } } } - this.state = 349; + this.state = 359; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 27, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 28, this._ctx); } - this.state = 351; + this.state = 361; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 28, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 29, this._ctx) ) { case 1: { - this.state = 350; - localctx._aggregates = this.fields(); + this.state = 360; + localctx._aggregates = this.aggFields(); } break; } - this.state = 355; + this.state = 365; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 29, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 30, this._ctx) ) { case 1: { - this.state = 353; + this.state = 363; this.match(esql_parser.BY); - this.state = 354; + this.state = 364; localctx._grouping = this.fields(); } break; @@ -1832,13 +1862,13 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public evalCommand(): EvalCommandContext { let localctx: EvalCommandContext = new EvalCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 48, esql_parser.RULE_evalCommand); + this.enterRule(localctx, 50, esql_parser.RULE_evalCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 357; + this.state = 367; this.match(esql_parser.EVAL); - this.state = 358; + this.state = 368; this.fields(); } } @@ -1859,30 +1889,30 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public statsCommand(): StatsCommandContext { let localctx: StatsCommandContext = new StatsCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 50, esql_parser.RULE_statsCommand); + this.enterRule(localctx, 52, esql_parser.RULE_statsCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 360; + this.state = 370; this.match(esql_parser.STATS); - this.state = 362; + this.state = 372; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 30, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 31, this._ctx) ) { case 1: { - this.state = 361; - localctx._stats = this.fields(); + this.state = 371; + localctx._stats = this.aggFields(); } break; } - this.state = 366; + this.state = 376; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 31, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 32, this._ctx) ) { case 1: { - this.state = 364; + this.state = 374; this.match(esql_parser.BY); - this.state = 365; + this.state = 375; localctx._grouping = this.fields(); } break; @@ -1904,32 +1934,113 @@ export default class esql_parser extends parser_config { return localctx; } // @RuleVersion(0) + public aggFields(): AggFieldsContext { + let localctx: AggFieldsContext = new AggFieldsContext(this, this._ctx, this.state); + this.enterRule(localctx, 54, esql_parser.RULE_aggFields); + try { + let _alt: number; + this.enterOuterAlt(localctx, 1); + { + this.state = 378; + this.aggField(); + this.state = 383; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); + while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + { + { + this.state = 379; + this.match(esql_parser.COMMA); + this.state = 380; + this.aggField(); + } + } + } + this.state = 385; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); + } + } + } + catch (re) { + if (re instanceof RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localctx; + } + // @RuleVersion(0) + public aggField(): AggFieldContext { + let localctx: AggFieldContext = new AggFieldContext(this, this._ctx, this.state); + this.enterRule(localctx, 56, esql_parser.RULE_aggField); + try { + this.enterOuterAlt(localctx, 1); + { + this.state = 386; + this.field(); + this.state = 389; + this._errHandler.sync(this); + switch ( this._interp.adaptivePredict(this._input, 34, this._ctx) ) { + case 1: + { + this.state = 387; + this.match(esql_parser.WHERE); + this.state = 388; + this.booleanExpression(0); + } + break; + } + } + } + catch (re) { + if (re instanceof RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localctx; + } + // @RuleVersion(0) public qualifiedName(): QualifiedNameContext { let localctx: QualifiedNameContext = new QualifiedNameContext(this, this._ctx, this.state); - this.enterRule(localctx, 52, esql_parser.RULE_qualifiedName); + this.enterRule(localctx, 58, esql_parser.RULE_qualifiedName); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 368; + this.state = 391; this.identifierOrParameter(); - this.state = 373; + this.state = 396; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 32, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 35, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 369; + this.state = 392; this.match(esql_parser.DOT); - this.state = 370; + this.state = 393; this.identifierOrParameter(); } } } - this.state = 375; + this.state = 398; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 32, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 35, this._ctx); } } } @@ -1950,30 +2061,30 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public qualifiedNamePattern(): QualifiedNamePatternContext { let localctx: QualifiedNamePatternContext = new QualifiedNamePatternContext(this, this._ctx, this.state); - this.enterRule(localctx, 54, esql_parser.RULE_qualifiedNamePattern); + this.enterRule(localctx, 60, esql_parser.RULE_qualifiedNamePattern); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 376; + this.state = 399; this.identifierPattern(); - this.state = 381; + this.state = 404; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 36, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 377; + this.state = 400; this.match(esql_parser.DOT); - this.state = 378; + this.state = 401; this.identifierPattern(); } } } - this.state = 383; + this.state = 406; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 36, this._ctx); } } } @@ -1994,30 +2105,30 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public qualifiedNamePatterns(): QualifiedNamePatternsContext { let localctx: QualifiedNamePatternsContext = new QualifiedNamePatternsContext(this, this._ctx, this.state); - this.enterRule(localctx, 56, esql_parser.RULE_qualifiedNamePatterns); + this.enterRule(localctx, 62, esql_parser.RULE_qualifiedNamePatterns); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 384; + this.state = 407; this.qualifiedNamePattern(); - this.state = 389; + this.state = 412; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 37, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 385; + this.state = 408; this.match(esql_parser.COMMA); - this.state = 386; + this.state = 409; this.qualifiedNamePattern(); } } } - this.state = 391; + this.state = 414; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 37, this._ctx); } } } @@ -2038,12 +2149,12 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public identifier(): IdentifierContext { let localctx: IdentifierContext = new IdentifierContext(this, this._ctx, this.state); - this.enterRule(localctx, 58, esql_parser.RULE_identifier); + this.enterRule(localctx, 64, esql_parser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 392; + this.state = 415; _la = this._input.LA(1); if(!(_la===67 || _la===68)) { this._errHandler.recoverInline(this); @@ -2071,28 +2182,29 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public identifierPattern(): IdentifierPatternContext { let localctx: IdentifierPatternContext = new IdentifierPatternContext(this, this._ctx, this.state); - this.enterRule(localctx, 60, esql_parser.RULE_identifierPattern); + this.enterRule(localctx, 66, esql_parser.RULE_identifierPattern); try { - this.state = 396; + this.state = 420; this._errHandler.sync(this); - switch (this._input.LA(1)) { - case 80: + switch ( this._interp.adaptivePredict(this._input, 38, this._ctx) ) { + case 1: this.enterOuterAlt(localctx, 1); { - this.state = 394; + this.state = 417; this.match(esql_parser.ID_PATTERN); } break; - case 48: - case 64: + case 2: this.enterOuterAlt(localctx, 2); { - this.state = 395; + this.state = 418; + if (!(this.isDevVersion())) { + throw this.createFailedPredicateException("this.isDevVersion()"); + } + this.state = 419; this.parameter(); } break; - default: - throw new NoViableAltException(this); } } catch (re) { @@ -2112,17 +2224,17 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public constant(): ConstantContext { let localctx: ConstantContext = new ConstantContext(this, this._ctx, this.state); - this.enterRule(localctx, 62, esql_parser.RULE_constant); + this.enterRule(localctx, 68, esql_parser.RULE_constant); let _la: number; try { - this.state = 440; + this.state = 464; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 39, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 42, this._ctx) ) { case 1: localctx = new NullLiteralContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 398; + this.state = 422; this.match(esql_parser.NULL); } break; @@ -2130,9 +2242,9 @@ export default class esql_parser extends parser_config { localctx = new QualifiedIntegerLiteralContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 399; + this.state = 423; this.integerValue(); - this.state = 400; + this.state = 424; this.match(esql_parser.UNQUOTED_IDENTIFIER); } break; @@ -2140,7 +2252,7 @@ export default class esql_parser extends parser_config { localctx = new DecimalLiteralContext(this, localctx); this.enterOuterAlt(localctx, 3); { - this.state = 402; + this.state = 426; this.decimalValue(); } break; @@ -2148,7 +2260,7 @@ export default class esql_parser extends parser_config { localctx = new IntegerLiteralContext(this, localctx); this.enterOuterAlt(localctx, 4); { - this.state = 403; + this.state = 427; this.integerValue(); } break; @@ -2156,7 +2268,7 @@ export default class esql_parser extends parser_config { localctx = new BooleanLiteralContext(this, localctx); this.enterOuterAlt(localctx, 5); { - this.state = 404; + this.state = 428; this.booleanValue(); } break; @@ -2164,7 +2276,7 @@ export default class esql_parser extends parser_config { localctx = new InputParameterContext(this, localctx); this.enterOuterAlt(localctx, 6); { - this.state = 405; + this.state = 429; this.parameter(); } break; @@ -2172,7 +2284,7 @@ export default class esql_parser extends parser_config { localctx = new StringLiteralContext(this, localctx); this.enterOuterAlt(localctx, 7); { - this.state = 406; + this.state = 430; this.string_(); } break; @@ -2180,27 +2292,27 @@ export default class esql_parser extends parser_config { localctx = new NumericArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 8); { - this.state = 407; + this.state = 431; this.match(esql_parser.OPENING_BRACKET); - this.state = 408; + this.state = 432; this.numericValue(); - this.state = 413; + this.state = 437; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===34) { + while (_la===33) { { { - this.state = 409; + this.state = 433; this.match(esql_parser.COMMA); - this.state = 410; + this.state = 434; this.numericValue(); } } - this.state = 415; + this.state = 439; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 416; + this.state = 440; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2208,27 +2320,27 @@ export default class esql_parser extends parser_config { localctx = new BooleanArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 9); { - this.state = 418; + this.state = 442; this.match(esql_parser.OPENING_BRACKET); - this.state = 419; + this.state = 443; this.booleanValue(); - this.state = 424; + this.state = 448; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===34) { + while (_la===33) { { { - this.state = 420; + this.state = 444; this.match(esql_parser.COMMA); - this.state = 421; + this.state = 445; this.booleanValue(); } } - this.state = 426; + this.state = 450; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 427; + this.state = 451; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2236,27 +2348,27 @@ export default class esql_parser extends parser_config { localctx = new StringArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 10); { - this.state = 429; + this.state = 453; this.match(esql_parser.OPENING_BRACKET); - this.state = 430; + this.state = 454; this.string_(); - this.state = 435; + this.state = 459; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la===34) { + while (_la===33) { { { - this.state = 431; + this.state = 455; this.match(esql_parser.COMMA); - this.state = 432; + this.state = 456; this.string_(); } } - this.state = 437; + this.state = 461; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 438; + this.state = 462; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2279,16 +2391,16 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public parameter(): ParameterContext { let localctx: ParameterContext = new ParameterContext(this, this._ctx, this.state); - this.enterRule(localctx, 64, esql_parser.RULE_parameter); + this.enterRule(localctx, 70, esql_parser.RULE_parameter); try { - this.state = 444; + this.state = 468; this._errHandler.sync(this); switch (this._input.LA(1)) { - case 48: + case 47: localctx = new InputParamContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 442; + this.state = 466; this.match(esql_parser.PARAM); } break; @@ -2296,7 +2408,7 @@ export default class esql_parser extends parser_config { localctx = new InputNamedOrPositionalParamContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 443; + this.state = 467; this.match(esql_parser.NAMED_OR_POSITIONAL_PARAM); } break; @@ -2321,29 +2433,29 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public identifierOrParameter(): IdentifierOrParameterContext { let localctx: IdentifierOrParameterContext = new IdentifierOrParameterContext(this, this._ctx, this.state); - this.enterRule(localctx, 66, esql_parser.RULE_identifierOrParameter); + this.enterRule(localctx, 72, esql_parser.RULE_identifierOrParameter); try { - this.state = 448; + this.state = 473; this._errHandler.sync(this); - switch (this._input.LA(1)) { - case 67: - case 68: + switch ( this._interp.adaptivePredict(this._input, 44, this._ctx) ) { + case 1: this.enterOuterAlt(localctx, 1); { - this.state = 446; + this.state = 470; this.identifier(); } break; - case 48: - case 64: + case 2: this.enterOuterAlt(localctx, 2); { - this.state = 447; + this.state = 471; + if (!(this.isDevVersion())) { + throw this.createFailedPredicateException("this.isDevVersion()"); + } + this.state = 472; this.parameter(); } break; - default: - throw new NoViableAltException(this); } } catch (re) { @@ -2363,13 +2475,13 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public limitCommand(): LimitCommandContext { let localctx: LimitCommandContext = new LimitCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 68, esql_parser.RULE_limitCommand); + this.enterRule(localctx, 74, esql_parser.RULE_limitCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 450; + this.state = 475; this.match(esql_parser.LIMIT); - this.state = 451; + this.state = 476; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2390,32 +2502,32 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public sortCommand(): SortCommandContext { let localctx: SortCommandContext = new SortCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 70, esql_parser.RULE_sortCommand); + this.enterRule(localctx, 76, esql_parser.RULE_sortCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 453; + this.state = 478; this.match(esql_parser.SORT); - this.state = 454; + this.state = 479; this.orderExpression(); - this.state = 459; + this.state = 484; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 42, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 45, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 455; + this.state = 480; this.match(esql_parser.COMMA); - this.state = 456; + this.state = 481; this.orderExpression(); } } } - this.state = 461; + this.state = 486; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 42, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 45, this._ctx); } } } @@ -2436,22 +2548,22 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public orderExpression(): OrderExpressionContext { let localctx: OrderExpressionContext = new OrderExpressionContext(this, this._ctx, this.state); - this.enterRule(localctx, 72, esql_parser.RULE_orderExpression); + this.enterRule(localctx, 78, esql_parser.RULE_orderExpression); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 462; + this.state = 487; this.booleanExpression(0); - this.state = 464; + this.state = 489; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 43, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 46, this._ctx) ) { case 1: { - this.state = 463; + this.state = 488; localctx._ordering = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===31 || _la===35)) { + if(!(_la===30 || _la===34)) { localctx._ordering = this._errHandler.recoverInline(this); } else { @@ -2461,17 +2573,17 @@ export default class esql_parser extends parser_config { } break; } - this.state = 468; + this.state = 493; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 44, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 47, this._ctx) ) { case 1: { - this.state = 466; + this.state = 491; this.match(esql_parser.NULLS); - this.state = 467; + this.state = 492; localctx._nullOrdering = this._input.LT(1); _la = this._input.LA(1); - if(!(_la===38 || _la===41)) { + if(!(_la===37 || _la===40)) { localctx._nullOrdering = this._errHandler.recoverInline(this); } else { @@ -2500,13 +2612,13 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public keepCommand(): KeepCommandContext { let localctx: KeepCommandContext = new KeepCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 74, esql_parser.RULE_keepCommand); + this.enterRule(localctx, 80, esql_parser.RULE_keepCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 470; + this.state = 495; this.match(esql_parser.KEEP); - this.state = 471; + this.state = 496; this.qualifiedNamePatterns(); } } @@ -2527,13 +2639,13 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public dropCommand(): DropCommandContext { let localctx: DropCommandContext = new DropCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 76, esql_parser.RULE_dropCommand); + this.enterRule(localctx, 82, esql_parser.RULE_dropCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 473; + this.state = 498; this.match(esql_parser.DROP); - this.state = 474; + this.state = 499; this.qualifiedNamePatterns(); } } @@ -2554,32 +2666,32 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public renameCommand(): RenameCommandContext { let localctx: RenameCommandContext = new RenameCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 78, esql_parser.RULE_renameCommand); + this.enterRule(localctx, 84, esql_parser.RULE_renameCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 476; + this.state = 501; this.match(esql_parser.RENAME); - this.state = 477; + this.state = 502; this.renameClause(); - this.state = 482; + this.state = 507; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 45, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 48, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 478; + this.state = 503; this.match(esql_parser.COMMA); - this.state = 479; + this.state = 504; this.renameClause(); } } } - this.state = 484; + this.state = 509; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 45, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 48, this._ctx); } } } @@ -2600,15 +2712,15 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public renameClause(): RenameClauseContext { let localctx: RenameClauseContext = new RenameClauseContext(this, this._ctx, this.state); - this.enterRule(localctx, 80, esql_parser.RULE_renameClause); + this.enterRule(localctx, 86, esql_parser.RULE_renameClause); try { this.enterOuterAlt(localctx, 1); { - this.state = 485; + this.state = 510; localctx._oldName = this.qualifiedNamePattern(); - this.state = 486; + this.state = 511; this.match(esql_parser.AS); - this.state = 487; + this.state = 512; localctx._newName = this.qualifiedNamePattern(); } } @@ -2629,22 +2741,22 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public dissectCommand(): DissectCommandContext { let localctx: DissectCommandContext = new DissectCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 82, esql_parser.RULE_dissectCommand); + this.enterRule(localctx, 88, esql_parser.RULE_dissectCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 489; + this.state = 514; this.match(esql_parser.DISSECT); - this.state = 490; + this.state = 515; this.primaryExpression(0); - this.state = 491; + this.state = 516; this.string_(); - this.state = 493; + this.state = 518; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 46, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 49, this._ctx) ) { case 1: { - this.state = 492; + this.state = 517; this.commandOptions(); } break; @@ -2668,15 +2780,15 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public grokCommand(): GrokCommandContext { let localctx: GrokCommandContext = new GrokCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 84, esql_parser.RULE_grokCommand); + this.enterRule(localctx, 90, esql_parser.RULE_grokCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 495; + this.state = 520; this.match(esql_parser.GROK); - this.state = 496; + this.state = 521; this.primaryExpression(0); - this.state = 497; + this.state = 522; this.string_(); } } @@ -2697,13 +2809,13 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public mvExpandCommand(): MvExpandCommandContext { let localctx: MvExpandCommandContext = new MvExpandCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 86, esql_parser.RULE_mvExpandCommand); + this.enterRule(localctx, 92, esql_parser.RULE_mvExpandCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 499; + this.state = 524; this.match(esql_parser.MV_EXPAND); - this.state = 500; + this.state = 525; this.qualifiedName(); } } @@ -2724,30 +2836,30 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public commandOptions(): CommandOptionsContext { let localctx: CommandOptionsContext = new CommandOptionsContext(this, this._ctx, this.state); - this.enterRule(localctx, 88, esql_parser.RULE_commandOptions); + this.enterRule(localctx, 94, esql_parser.RULE_commandOptions); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 502; + this.state = 527; this.commandOption(); - this.state = 507; + this.state = 532; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 47, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 50, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 503; + this.state = 528; this.match(esql_parser.COMMA); - this.state = 504; + this.state = 529; this.commandOption(); } } } - this.state = 509; + this.state = 534; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 47, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 50, this._ctx); } } } @@ -2768,15 +2880,15 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public commandOption(): CommandOptionContext { let localctx: CommandOptionContext = new CommandOptionContext(this, this._ctx, this.state); - this.enterRule(localctx, 90, esql_parser.RULE_commandOption); + this.enterRule(localctx, 96, esql_parser.RULE_commandOption); try { this.enterOuterAlt(localctx, 1); { - this.state = 510; + this.state = 535; this.identifier(); - this.state = 511; + this.state = 536; this.match(esql_parser.ASSIGN); - this.state = 512; + this.state = 537; this.constant(); } } @@ -2797,14 +2909,14 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public booleanValue(): BooleanValueContext { let localctx: BooleanValueContext = new BooleanValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 92, esql_parser.RULE_booleanValue); + this.enterRule(localctx, 98, esql_parser.RULE_booleanValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 514; + this.state = 539; _la = this._input.LA(1); - if(!(_la===37 || _la===51)) { + if(!(_la===36 || _la===50)) { this._errHandler.recoverInline(this); } else { @@ -2830,22 +2942,22 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public numericValue(): NumericValueContext { let localctx: NumericValueContext = new NumericValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 94, esql_parser.RULE_numericValue); + this.enterRule(localctx, 100, esql_parser.RULE_numericValue); try { - this.state = 518; + this.state = 543; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 48, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 51, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 516; + this.state = 541; this.decimalValue(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 517; + this.state = 542; this.integerValue(); } break; @@ -2868,19 +2980,19 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public decimalValue(): DecimalValueContext { let localctx: DecimalValueContext = new DecimalValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 96, esql_parser.RULE_decimalValue); + this.enterRule(localctx, 102, esql_parser.RULE_decimalValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 521; + this.state = 546; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===59 || _la===60) { + if (_la===58 || _la===59) { { - this.state = 520; + this.state = 545; _la = this._input.LA(1); - if(!(_la===59 || _la===60)) { + if(!(_la===58 || _la===59)) { this._errHandler.recoverInline(this); } else { @@ -2890,7 +3002,7 @@ export default class esql_parser extends parser_config { } } - this.state = 523; + this.state = 548; this.match(esql_parser.DECIMAL_LITERAL); } } @@ -2911,19 +3023,19 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public integerValue(): IntegerValueContext { let localctx: IntegerValueContext = new IntegerValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 98, esql_parser.RULE_integerValue); + this.enterRule(localctx, 104, esql_parser.RULE_integerValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 526; + this.state = 551; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la===59 || _la===60) { + if (_la===58 || _la===59) { { - this.state = 525; + this.state = 550; _la = this._input.LA(1); - if(!(_la===59 || _la===60)) { + if(!(_la===58 || _la===59)) { this._errHandler.recoverInline(this); } else { @@ -2933,7 +3045,7 @@ export default class esql_parser extends parser_config { } } - this.state = 528; + this.state = 553; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2954,11 +3066,11 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public string_(): StringContext { let localctx: StringContext = new StringContext(this, this._ctx, this.state); - this.enterRule(localctx, 100, esql_parser.RULE_string); + this.enterRule(localctx, 106, esql_parser.RULE_string); try { this.enterOuterAlt(localctx, 1); { - this.state = 530; + this.state = 555; this.match(esql_parser.QUOTED_STRING); } } @@ -2979,14 +3091,14 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public comparisonOperator(): ComparisonOperatorContext { let localctx: ComparisonOperatorContext = new ComparisonOperatorContext(this, this._ctx, this.state); - this.enterRule(localctx, 102, esql_parser.RULE_comparisonOperator); + this.enterRule(localctx, 108, esql_parser.RULE_comparisonOperator); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 532; + this.state = 557; _la = this._input.LA(1); - if(!(((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & 125) !== 0))) { + if(!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 125) !== 0))) { this._errHandler.recoverInline(this); } else { @@ -3012,13 +3124,13 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public explainCommand(): ExplainCommandContext { let localctx: ExplainCommandContext = new ExplainCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 104, esql_parser.RULE_explainCommand); + this.enterRule(localctx, 110, esql_parser.RULE_explainCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 534; + this.state = 559; this.match(esql_parser.EXPLAIN); - this.state = 535; + this.state = 560; this.subqueryExpression(); } } @@ -3039,15 +3151,15 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public subqueryExpression(): SubqueryExpressionContext { let localctx: SubqueryExpressionContext = new SubqueryExpressionContext(this, this._ctx, this.state); - this.enterRule(localctx, 106, esql_parser.RULE_subqueryExpression); + this.enterRule(localctx, 112, esql_parser.RULE_subqueryExpression); try { this.enterOuterAlt(localctx, 1); { - this.state = 537; + this.state = 562; this.match(esql_parser.OPENING_BRACKET); - this.state = 538; + this.state = 563; this.query(0); - this.state = 539; + this.state = 564; this.match(esql_parser.CLOSING_BRACKET); } } @@ -3068,14 +3180,14 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public showCommand(): ShowCommandContext { let localctx: ShowCommandContext = new ShowCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 108, esql_parser.RULE_showCommand); + this.enterRule(localctx, 114, esql_parser.RULE_showCommand); try { localctx = new ShowInfoContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 541; + this.state = 566; this.match(esql_parser.SHOW); - this.state = 542; + this.state = 567; this.match(esql_parser.INFO); } } @@ -3096,53 +3208,53 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public enrichCommand(): EnrichCommandContext { let localctx: EnrichCommandContext = new EnrichCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 110, esql_parser.RULE_enrichCommand); + this.enterRule(localctx, 116, esql_parser.RULE_enrichCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 544; + this.state = 569; this.match(esql_parser.ENRICH); - this.state = 545; + this.state = 570; localctx._policyName = this.match(esql_parser.ENRICH_POLICY_NAME); - this.state = 548; + this.state = 573; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 51, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 54, this._ctx) ) { case 1: { - this.state = 546; + this.state = 571; this.match(esql_parser.ON); - this.state = 547; + this.state = 572; localctx._matchField = this.qualifiedNamePattern(); } break; } - this.state = 559; + this.state = 584; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 53, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 56, this._ctx) ) { case 1: { - this.state = 550; + this.state = 575; this.match(esql_parser.WITH); - this.state = 551; + this.state = 576; this.enrichWithClause(); - this.state = 556; + this.state = 581; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 52, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 55, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 552; + this.state = 577; this.match(esql_parser.COMMA); - this.state = 553; + this.state = 578; this.enrichWithClause(); } } } - this.state = 558; + this.state = 583; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 52, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 55, this._ctx); } } break; @@ -3166,23 +3278,23 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public enrichWithClause(): EnrichWithClauseContext { let localctx: EnrichWithClauseContext = new EnrichWithClauseContext(this, this._ctx, this.state); - this.enterRule(localctx, 112, esql_parser.RULE_enrichWithClause); + this.enterRule(localctx, 118, esql_parser.RULE_enrichWithClause); try { this.enterOuterAlt(localctx, 1); { - this.state = 564; + this.state = 589; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 54, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 57, this._ctx) ) { case 1: { - this.state = 561; + this.state = 586; localctx._newName = this.qualifiedNamePattern(); - this.state = 562; + this.state = 587; this.match(esql_parser.ASSIGN); } break; } - this.state = 566; + this.state = 591; localctx._enrichField = this.qualifiedNamePattern(); } } @@ -3203,17 +3315,17 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public lookupCommand(): LookupCommandContext { let localctx: LookupCommandContext = new LookupCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 114, esql_parser.RULE_lookupCommand); + this.enterRule(localctx, 120, esql_parser.RULE_lookupCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 568; + this.state = 593; this.match(esql_parser.DEV_LOOKUP); - this.state = 569; + this.state = 594; localctx._tableName = this.indexPattern(); - this.state = 570; + this.state = 595; this.match(esql_parser.ON); - this.state = 571; + this.state = 596; localctx._matchFields = this.qualifiedNamePatterns(); } } @@ -3234,22 +3346,22 @@ export default class esql_parser extends parser_config { // @RuleVersion(0) public inlinestatsCommand(): InlinestatsCommandContext { let localctx: InlinestatsCommandContext = new InlinestatsCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 116, esql_parser.RULE_inlinestatsCommand); + this.enterRule(localctx, 122, esql_parser.RULE_inlinestatsCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 573; + this.state = 598; this.match(esql_parser.DEV_INLINESTATS); - this.state = 574; - localctx._stats = this.fields(); - this.state = 577; + this.state = 599; + localctx._stats = this.aggFields(); + this.state = 602; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 55, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 58, this._ctx) ) { case 1: { - this.state = 575; + this.state = 600; this.match(esql_parser.BY); - this.state = 576; + this.state = 601; localctx._grouping = this.fields(); } break; @@ -3285,6 +3397,10 @@ export default class esql_parser extends parser_config { return this.operatorExpression_sempred(localctx as OperatorExpressionContext, predIndex); case 10: return this.primaryExpression_sempred(localctx as PrimaryExpressionContext, predIndex); + case 33: + return this.identifierPattern_sempred(localctx as IdentifierPatternContext, predIndex); + case 36: + return this.identifierOrParameter_sempred(localctx as IdentifierOrParameterContext, predIndex); } return true; } @@ -3338,8 +3454,22 @@ export default class esql_parser extends parser_config { } return true; } + private identifierPattern_sempred(localctx: IdentifierPatternContext, predIndex: number): boolean { + switch (predIndex) { + case 10: + return this.isDevVersion(); + } + return true; + } + private identifierOrParameter_sempred(localctx: IdentifierOrParameterContext, predIndex: number): boolean { + switch (predIndex) { + case 11: + return this.isDevVersion(); + } + return true; + } - public static readonly _serializedATN: number[] = [4,1,120,580,2,0,7,0, + public static readonly _serializedATN: number[] = [4,1,120,605,2,0,7,0, 2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9, 2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2, 17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24, @@ -3347,188 +3477,196 @@ export default class esql_parser extends parser_config { 31,2,32,7,32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38, 2,39,7,39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2, 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7,52,2,53, - 7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,1,0,1,0,1,0,1,1, - 1,1,1,1,1,1,1,1,1,1,5,1,128,8,1,10,1,12,1,131,9,1,1,2,1,2,1,2,1,2,1,2,1, - 2,3,2,139,8,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1, - 3,1,3,3,3,157,8,3,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,169,8,5,1, - 5,1,5,1,5,1,5,1,5,5,5,176,8,5,10,5,12,5,179,9,5,1,5,1,5,1,5,1,5,1,5,3,5, - 186,8,5,1,5,1,5,1,5,1,5,3,5,192,8,5,1,5,1,5,1,5,1,5,1,5,1,5,5,5,200,8,5, - 10,5,12,5,203,9,5,1,6,1,6,3,6,207,8,6,1,6,1,6,1,6,1,6,1,6,3,6,214,8,6,1, - 6,1,6,1,6,3,6,219,8,6,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,3,8,230,8,8,1, - 9,1,9,1,9,1,9,3,9,236,8,9,1,9,1,9,1,9,1,9,1,9,1,9,5,9,244,8,9,10,9,12,9, - 247,9,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,3,10,257,8,10,1,10,1,10, - 1,10,5,10,262,8,10,10,10,12,10,265,9,10,1,11,1,11,1,11,1,11,1,11,1,11,5, - 11,273,8,11,10,11,12,11,276,9,11,3,11,278,8,11,1,11,1,11,1,12,1,12,1,13, - 1,13,1,13,1,14,1,14,1,14,5,14,290,8,14,10,14,12,14,293,9,14,1,15,1,15,1, - 15,1,15,1,15,3,15,300,8,15,1,16,1,16,1,16,1,16,5,16,306,8,16,10,16,12,16, - 309,9,16,1,16,3,16,312,8,16,1,17,1,17,1,17,1,17,1,17,3,17,319,8,17,1,18, - 1,18,1,19,1,19,1,20,1,20,3,20,327,8,20,1,21,1,21,1,21,1,21,5,21,333,8,21, - 10,21,12,21,336,9,21,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,5,23,346,8, - 23,10,23,12,23,349,9,23,1,23,3,23,352,8,23,1,23,1,23,3,23,356,8,23,1,24, - 1,24,1,24,1,25,1,25,3,25,363,8,25,1,25,1,25,3,25,367,8,25,1,26,1,26,1,26, - 5,26,372,8,26,10,26,12,26,375,9,26,1,27,1,27,1,27,5,27,380,8,27,10,27,12, - 27,383,9,27,1,28,1,28,1,28,5,28,388,8,28,10,28,12,28,391,9,28,1,29,1,29, - 1,30,1,30,3,30,397,8,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1, - 31,1,31,1,31,1,31,5,31,412,8,31,10,31,12,31,415,9,31,1,31,1,31,1,31,1,31, - 1,31,1,31,5,31,423,8,31,10,31,12,31,426,9,31,1,31,1,31,1,31,1,31,1,31,1, - 31,5,31,434,8,31,10,31,12,31,437,9,31,1,31,1,31,3,31,441,8,31,1,32,1,32, - 3,32,445,8,32,1,33,1,33,3,33,449,8,33,1,34,1,34,1,34,1,35,1,35,1,35,1,35, - 5,35,458,8,35,10,35,12,35,461,9,35,1,36,1,36,3,36,465,8,36,1,36,1,36,3, - 36,469,8,36,1,37,1,37,1,37,1,38,1,38,1,38,1,39,1,39,1,39,1,39,5,39,481, - 8,39,10,39,12,39,484,9,39,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,3,41, - 494,8,41,1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,44,1,44,1,44,5,44,506,8,44, - 10,44,12,44,509,9,44,1,45,1,45,1,45,1,45,1,46,1,46,1,47,1,47,3,47,519,8, - 47,1,48,3,48,522,8,48,1,48,1,48,1,49,3,49,527,8,49,1,49,1,49,1,50,1,50, - 1,51,1,51,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,55,1,55,1, - 55,1,55,3,55,549,8,55,1,55,1,55,1,55,1,55,5,55,555,8,55,10,55,12,55,558, - 9,55,3,55,560,8,55,1,56,1,56,1,56,3,56,565,8,56,1,56,1,56,1,57,1,57,1,57, - 1,57,1,57,1,58,1,58,1,58,1,58,3,58,578,8,58,1,58,0,4,2,10,18,20,59,0,2, - 4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52, - 54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100, - 102,104,106,108,110,112,114,116,0,8,1,0,59,60,1,0,61,63,2,0,26,26,76,76, - 1,0,67,68,2,0,31,31,35,35,2,0,38,38,41,41,2,0,37,37,51,51,2,0,52,52,54, - 58,606,0,118,1,0,0,0,2,121,1,0,0,0,4,138,1,0,0,0,6,156,1,0,0,0,8,158,1, - 0,0,0,10,191,1,0,0,0,12,218,1,0,0,0,14,220,1,0,0,0,16,229,1,0,0,0,18,235, - 1,0,0,0,20,256,1,0,0,0,22,266,1,0,0,0,24,281,1,0,0,0,26,283,1,0,0,0,28, - 286,1,0,0,0,30,299,1,0,0,0,32,301,1,0,0,0,34,318,1,0,0,0,36,320,1,0,0,0, - 38,322,1,0,0,0,40,326,1,0,0,0,42,328,1,0,0,0,44,337,1,0,0,0,46,341,1,0, - 0,0,48,357,1,0,0,0,50,360,1,0,0,0,52,368,1,0,0,0,54,376,1,0,0,0,56,384, - 1,0,0,0,58,392,1,0,0,0,60,396,1,0,0,0,62,440,1,0,0,0,64,444,1,0,0,0,66, - 448,1,0,0,0,68,450,1,0,0,0,70,453,1,0,0,0,72,462,1,0,0,0,74,470,1,0,0,0, - 76,473,1,0,0,0,78,476,1,0,0,0,80,485,1,0,0,0,82,489,1,0,0,0,84,495,1,0, - 0,0,86,499,1,0,0,0,88,502,1,0,0,0,90,510,1,0,0,0,92,514,1,0,0,0,94,518, - 1,0,0,0,96,521,1,0,0,0,98,526,1,0,0,0,100,530,1,0,0,0,102,532,1,0,0,0,104, - 534,1,0,0,0,106,537,1,0,0,0,108,541,1,0,0,0,110,544,1,0,0,0,112,564,1,0, - 0,0,114,568,1,0,0,0,116,573,1,0,0,0,118,119,3,2,1,0,119,120,5,0,0,1,120, - 1,1,0,0,0,121,122,6,1,-1,0,122,123,3,4,2,0,123,129,1,0,0,0,124,125,10,1, - 0,0,125,126,5,25,0,0,126,128,3,6,3,0,127,124,1,0,0,0,128,131,1,0,0,0,129, - 127,1,0,0,0,129,130,1,0,0,0,130,3,1,0,0,0,131,129,1,0,0,0,132,139,3,104, - 52,0,133,139,3,32,16,0,134,139,3,26,13,0,135,139,3,108,54,0,136,137,4,2, - 1,0,137,139,3,46,23,0,138,132,1,0,0,0,138,133,1,0,0,0,138,134,1,0,0,0,138, - 135,1,0,0,0,138,136,1,0,0,0,139,5,1,0,0,0,140,157,3,48,24,0,141,157,3,8, - 4,0,142,157,3,74,37,0,143,157,3,68,34,0,144,157,3,50,25,0,145,157,3,70, - 35,0,146,157,3,76,38,0,147,157,3,78,39,0,148,157,3,82,41,0,149,157,3,84, - 42,0,150,157,3,110,55,0,151,157,3,86,43,0,152,153,4,3,2,0,153,157,3,116, - 58,0,154,155,4,3,3,0,155,157,3,114,57,0,156,140,1,0,0,0,156,141,1,0,0,0, - 156,142,1,0,0,0,156,143,1,0,0,0,156,144,1,0,0,0,156,145,1,0,0,0,156,146, - 1,0,0,0,156,147,1,0,0,0,156,148,1,0,0,0,156,149,1,0,0,0,156,150,1,0,0,0, - 156,151,1,0,0,0,156,152,1,0,0,0,156,154,1,0,0,0,157,7,1,0,0,0,158,159,5, - 16,0,0,159,160,3,10,5,0,160,9,1,0,0,0,161,162,6,5,-1,0,162,163,5,44,0,0, - 163,192,3,10,5,8,164,192,3,16,8,0,165,192,3,12,6,0,166,168,3,16,8,0,167, - 169,5,44,0,0,168,167,1,0,0,0,168,169,1,0,0,0,169,170,1,0,0,0,170,171,5, - 39,0,0,171,172,5,43,0,0,172,177,3,16,8,0,173,174,5,34,0,0,174,176,3,16, - 8,0,175,173,1,0,0,0,176,179,1,0,0,0,177,175,1,0,0,0,177,178,1,0,0,0,178, - 180,1,0,0,0,179,177,1,0,0,0,180,181,5,50,0,0,181,192,1,0,0,0,182,183,3, - 16,8,0,183,185,5,40,0,0,184,186,5,44,0,0,185,184,1,0,0,0,185,186,1,0,0, - 0,186,187,1,0,0,0,187,188,5,45,0,0,188,192,1,0,0,0,189,190,4,5,4,0,190, - 192,3,14,7,0,191,161,1,0,0,0,191,164,1,0,0,0,191,165,1,0,0,0,191,166,1, - 0,0,0,191,182,1,0,0,0,191,189,1,0,0,0,192,201,1,0,0,0,193,194,10,5,0,0, - 194,195,5,30,0,0,195,200,3,10,5,6,196,197,10,4,0,0,197,198,5,47,0,0,198, - 200,3,10,5,5,199,193,1,0,0,0,199,196,1,0,0,0,200,203,1,0,0,0,201,199,1, - 0,0,0,201,202,1,0,0,0,202,11,1,0,0,0,203,201,1,0,0,0,204,206,3,16,8,0,205, - 207,5,44,0,0,206,205,1,0,0,0,206,207,1,0,0,0,207,208,1,0,0,0,208,209,5, - 42,0,0,209,210,3,100,50,0,210,219,1,0,0,0,211,213,3,16,8,0,212,214,5,44, - 0,0,213,212,1,0,0,0,213,214,1,0,0,0,214,215,1,0,0,0,215,216,5,49,0,0,216, - 217,3,100,50,0,217,219,1,0,0,0,218,204,1,0,0,0,218,211,1,0,0,0,219,13,1, - 0,0,0,220,221,3,16,8,0,221,222,5,19,0,0,222,223,3,100,50,0,223,15,1,0,0, - 0,224,230,3,18,9,0,225,226,3,18,9,0,226,227,3,102,51,0,227,228,3,18,9,0, - 228,230,1,0,0,0,229,224,1,0,0,0,229,225,1,0,0,0,230,17,1,0,0,0,231,232, - 6,9,-1,0,232,236,3,20,10,0,233,234,7,0,0,0,234,236,3,18,9,3,235,231,1,0, - 0,0,235,233,1,0,0,0,236,245,1,0,0,0,237,238,10,2,0,0,238,239,7,1,0,0,239, - 244,3,18,9,3,240,241,10,1,0,0,241,242,7,0,0,0,242,244,3,18,9,2,243,237, - 1,0,0,0,243,240,1,0,0,0,244,247,1,0,0,0,245,243,1,0,0,0,245,246,1,0,0,0, - 246,19,1,0,0,0,247,245,1,0,0,0,248,249,6,10,-1,0,249,257,3,62,31,0,250, - 257,3,52,26,0,251,257,3,22,11,0,252,253,5,43,0,0,253,254,3,10,5,0,254,255, - 5,50,0,0,255,257,1,0,0,0,256,248,1,0,0,0,256,250,1,0,0,0,256,251,1,0,0, - 0,256,252,1,0,0,0,257,263,1,0,0,0,258,259,10,1,0,0,259,260,5,33,0,0,260, - 262,3,24,12,0,261,258,1,0,0,0,262,265,1,0,0,0,263,261,1,0,0,0,263,264,1, - 0,0,0,264,21,1,0,0,0,265,263,1,0,0,0,266,267,3,66,33,0,267,277,5,43,0,0, - 268,278,5,61,0,0,269,274,3,10,5,0,270,271,5,34,0,0,271,273,3,10,5,0,272, - 270,1,0,0,0,273,276,1,0,0,0,274,272,1,0,0,0,274,275,1,0,0,0,275,278,1,0, - 0,0,276,274,1,0,0,0,277,268,1,0,0,0,277,269,1,0,0,0,277,278,1,0,0,0,278, - 279,1,0,0,0,279,280,5,50,0,0,280,23,1,0,0,0,281,282,3,58,29,0,282,25,1, - 0,0,0,283,284,5,12,0,0,284,285,3,28,14,0,285,27,1,0,0,0,286,291,3,30,15, - 0,287,288,5,34,0,0,288,290,3,30,15,0,289,287,1,0,0,0,290,293,1,0,0,0,291, - 289,1,0,0,0,291,292,1,0,0,0,292,29,1,0,0,0,293,291,1,0,0,0,294,300,3,10, - 5,0,295,296,3,52,26,0,296,297,5,32,0,0,297,298,3,10,5,0,298,300,1,0,0,0, - 299,294,1,0,0,0,299,295,1,0,0,0,300,31,1,0,0,0,301,302,5,6,0,0,302,307, - 3,34,17,0,303,304,5,34,0,0,304,306,3,34,17,0,305,303,1,0,0,0,306,309,1, - 0,0,0,307,305,1,0,0,0,307,308,1,0,0,0,308,311,1,0,0,0,309,307,1,0,0,0,310, - 312,3,40,20,0,311,310,1,0,0,0,311,312,1,0,0,0,312,33,1,0,0,0,313,314,3, - 36,18,0,314,315,5,104,0,0,315,316,3,38,19,0,316,319,1,0,0,0,317,319,3,38, - 19,0,318,313,1,0,0,0,318,317,1,0,0,0,319,35,1,0,0,0,320,321,5,76,0,0,321, - 37,1,0,0,0,322,323,7,2,0,0,323,39,1,0,0,0,324,327,3,42,21,0,325,327,3,44, - 22,0,326,324,1,0,0,0,326,325,1,0,0,0,327,41,1,0,0,0,328,329,5,75,0,0,329, - 334,5,76,0,0,330,331,5,34,0,0,331,333,5,76,0,0,332,330,1,0,0,0,333,336, - 1,0,0,0,334,332,1,0,0,0,334,335,1,0,0,0,335,43,1,0,0,0,336,334,1,0,0,0, - 337,338,5,65,0,0,338,339,3,42,21,0,339,340,5,66,0,0,340,45,1,0,0,0,341, - 342,5,20,0,0,342,347,3,34,17,0,343,344,5,34,0,0,344,346,3,34,17,0,345,343, - 1,0,0,0,346,349,1,0,0,0,347,345,1,0,0,0,347,348,1,0,0,0,348,351,1,0,0,0, - 349,347,1,0,0,0,350,352,3,28,14,0,351,350,1,0,0,0,351,352,1,0,0,0,352,355, - 1,0,0,0,353,354,5,29,0,0,354,356,3,28,14,0,355,353,1,0,0,0,355,356,1,0, - 0,0,356,47,1,0,0,0,357,358,5,4,0,0,358,359,3,28,14,0,359,49,1,0,0,0,360, - 362,5,15,0,0,361,363,3,28,14,0,362,361,1,0,0,0,362,363,1,0,0,0,363,366, - 1,0,0,0,364,365,5,29,0,0,365,367,3,28,14,0,366,364,1,0,0,0,366,367,1,0, - 0,0,367,51,1,0,0,0,368,373,3,66,33,0,369,370,5,36,0,0,370,372,3,66,33,0, - 371,369,1,0,0,0,372,375,1,0,0,0,373,371,1,0,0,0,373,374,1,0,0,0,374,53, - 1,0,0,0,375,373,1,0,0,0,376,381,3,60,30,0,377,378,5,36,0,0,378,380,3,60, - 30,0,379,377,1,0,0,0,380,383,1,0,0,0,381,379,1,0,0,0,381,382,1,0,0,0,382, - 55,1,0,0,0,383,381,1,0,0,0,384,389,3,54,27,0,385,386,5,34,0,0,386,388,3, - 54,27,0,387,385,1,0,0,0,388,391,1,0,0,0,389,387,1,0,0,0,389,390,1,0,0,0, - 390,57,1,0,0,0,391,389,1,0,0,0,392,393,7,3,0,0,393,59,1,0,0,0,394,397,5, - 80,0,0,395,397,3,64,32,0,396,394,1,0,0,0,396,395,1,0,0,0,397,61,1,0,0,0, - 398,441,5,45,0,0,399,400,3,98,49,0,400,401,5,67,0,0,401,441,1,0,0,0,402, - 441,3,96,48,0,403,441,3,98,49,0,404,441,3,92,46,0,405,441,3,64,32,0,406, - 441,3,100,50,0,407,408,5,65,0,0,408,413,3,94,47,0,409,410,5,34,0,0,410, - 412,3,94,47,0,411,409,1,0,0,0,412,415,1,0,0,0,413,411,1,0,0,0,413,414,1, - 0,0,0,414,416,1,0,0,0,415,413,1,0,0,0,416,417,5,66,0,0,417,441,1,0,0,0, - 418,419,5,65,0,0,419,424,3,92,46,0,420,421,5,34,0,0,421,423,3,92,46,0,422, - 420,1,0,0,0,423,426,1,0,0,0,424,422,1,0,0,0,424,425,1,0,0,0,425,427,1,0, - 0,0,426,424,1,0,0,0,427,428,5,66,0,0,428,441,1,0,0,0,429,430,5,65,0,0,430, - 435,3,100,50,0,431,432,5,34,0,0,432,434,3,100,50,0,433,431,1,0,0,0,434, - 437,1,0,0,0,435,433,1,0,0,0,435,436,1,0,0,0,436,438,1,0,0,0,437,435,1,0, - 0,0,438,439,5,66,0,0,439,441,1,0,0,0,440,398,1,0,0,0,440,399,1,0,0,0,440, - 402,1,0,0,0,440,403,1,0,0,0,440,404,1,0,0,0,440,405,1,0,0,0,440,406,1,0, - 0,0,440,407,1,0,0,0,440,418,1,0,0,0,440,429,1,0,0,0,441,63,1,0,0,0,442, - 445,5,48,0,0,443,445,5,64,0,0,444,442,1,0,0,0,444,443,1,0,0,0,445,65,1, - 0,0,0,446,449,3,58,29,0,447,449,3,64,32,0,448,446,1,0,0,0,448,447,1,0,0, - 0,449,67,1,0,0,0,450,451,5,9,0,0,451,452,5,27,0,0,452,69,1,0,0,0,453,454, - 5,14,0,0,454,459,3,72,36,0,455,456,5,34,0,0,456,458,3,72,36,0,457,455,1, - 0,0,0,458,461,1,0,0,0,459,457,1,0,0,0,459,460,1,0,0,0,460,71,1,0,0,0,461, - 459,1,0,0,0,462,464,3,10,5,0,463,465,7,4,0,0,464,463,1,0,0,0,464,465,1, - 0,0,0,465,468,1,0,0,0,466,467,5,46,0,0,467,469,7,5,0,0,468,466,1,0,0,0, - 468,469,1,0,0,0,469,73,1,0,0,0,470,471,5,8,0,0,471,472,3,56,28,0,472,75, - 1,0,0,0,473,474,5,2,0,0,474,475,3,56,28,0,475,77,1,0,0,0,476,477,5,11,0, - 0,477,482,3,80,40,0,478,479,5,34,0,0,479,481,3,80,40,0,480,478,1,0,0,0, - 481,484,1,0,0,0,482,480,1,0,0,0,482,483,1,0,0,0,483,79,1,0,0,0,484,482, - 1,0,0,0,485,486,3,54,27,0,486,487,5,84,0,0,487,488,3,54,27,0,488,81,1,0, - 0,0,489,490,5,1,0,0,490,491,3,20,10,0,491,493,3,100,50,0,492,494,3,88,44, - 0,493,492,1,0,0,0,493,494,1,0,0,0,494,83,1,0,0,0,495,496,5,7,0,0,496,497, - 3,20,10,0,497,498,3,100,50,0,498,85,1,0,0,0,499,500,5,10,0,0,500,501,3, - 52,26,0,501,87,1,0,0,0,502,507,3,90,45,0,503,504,5,34,0,0,504,506,3,90, - 45,0,505,503,1,0,0,0,506,509,1,0,0,0,507,505,1,0,0,0,507,508,1,0,0,0,508, - 89,1,0,0,0,509,507,1,0,0,0,510,511,3,58,29,0,511,512,5,32,0,0,512,513,3, - 62,31,0,513,91,1,0,0,0,514,515,7,6,0,0,515,93,1,0,0,0,516,519,3,96,48,0, - 517,519,3,98,49,0,518,516,1,0,0,0,518,517,1,0,0,0,519,95,1,0,0,0,520,522, - 7,0,0,0,521,520,1,0,0,0,521,522,1,0,0,0,522,523,1,0,0,0,523,524,5,28,0, - 0,524,97,1,0,0,0,525,527,7,0,0,0,526,525,1,0,0,0,526,527,1,0,0,0,527,528, - 1,0,0,0,528,529,5,27,0,0,529,99,1,0,0,0,530,531,5,26,0,0,531,101,1,0,0, - 0,532,533,7,7,0,0,533,103,1,0,0,0,534,535,5,5,0,0,535,536,3,106,53,0,536, - 105,1,0,0,0,537,538,5,65,0,0,538,539,3,2,1,0,539,540,5,66,0,0,540,107,1, - 0,0,0,541,542,5,13,0,0,542,543,5,100,0,0,543,109,1,0,0,0,544,545,5,3,0, - 0,545,548,5,90,0,0,546,547,5,88,0,0,547,549,3,54,27,0,548,546,1,0,0,0,548, - 549,1,0,0,0,549,559,1,0,0,0,550,551,5,89,0,0,551,556,3,112,56,0,552,553, - 5,34,0,0,553,555,3,112,56,0,554,552,1,0,0,0,555,558,1,0,0,0,556,554,1,0, - 0,0,556,557,1,0,0,0,557,560,1,0,0,0,558,556,1,0,0,0,559,550,1,0,0,0,559, - 560,1,0,0,0,560,111,1,0,0,0,561,562,3,54,27,0,562,563,5,32,0,0,563,565, - 1,0,0,0,564,561,1,0,0,0,564,565,1,0,0,0,565,566,1,0,0,0,566,567,3,54,27, - 0,567,113,1,0,0,0,568,569,5,18,0,0,569,570,3,34,17,0,570,571,5,88,0,0,571, - 572,3,56,28,0,572,115,1,0,0,0,573,574,5,17,0,0,574,577,3,28,14,0,575,576, - 5,29,0,0,576,578,3,28,14,0,577,575,1,0,0,0,577,578,1,0,0,0,578,117,1,0, - 0,0,56,129,138,156,168,177,185,191,199,201,206,213,218,229,235,243,245, - 256,263,274,277,291,299,307,311,318,326,334,347,351,355,362,366,373,381, - 389,396,413,424,435,440,444,448,459,464,468,482,493,507,518,521,526,548, - 556,559,564,577]; + 7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,2,59,7,59,2,60,7, + 60,2,61,7,61,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,5,1,134,8,1,10,1,12,1, + 137,9,1,1,2,1,2,1,2,1,2,1,2,1,2,3,2,145,8,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3, + 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,3,3,163,8,3,1,4,1,4,1,4,1,5,1,5,1,5, + 1,5,1,5,1,5,1,5,3,5,175,8,5,1,5,1,5,1,5,1,5,1,5,5,5,182,8,5,10,5,12,5,185, + 9,5,1,5,1,5,1,5,1,5,1,5,3,5,192,8,5,1,5,1,5,1,5,1,5,3,5,198,8,5,1,5,1,5, + 1,5,1,5,1,5,1,5,5,5,206,8,5,10,5,12,5,209,9,5,1,6,1,6,3,6,213,8,6,1,6,1, + 6,1,6,1,6,1,6,3,6,220,8,6,1,6,1,6,1,6,3,6,225,8,6,1,7,1,7,1,7,1,7,1,8,1, + 8,1,8,1,8,1,8,3,8,236,8,8,1,9,1,9,1,9,1,9,3,9,242,8,9,1,9,1,9,1,9,1,9,1, + 9,1,9,5,9,250,8,9,10,9,12,9,253,9,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10, + 1,10,3,10,263,8,10,1,10,1,10,1,10,5,10,268,8,10,10,10,12,10,271,9,10,1, + 11,1,11,1,11,1,11,1,11,1,11,5,11,279,8,11,10,11,12,11,282,9,11,3,11,284, + 8,11,1,11,1,11,1,12,1,12,3,12,290,8,12,1,13,1,13,1,14,1,14,1,14,1,15,1, + 15,1,15,5,15,300,8,15,10,15,12,15,303,9,15,1,16,1,16,1,16,3,16,308,8,16, + 1,16,1,16,1,17,1,17,1,17,1,17,5,17,316,8,17,10,17,12,17,319,9,17,1,17,3, + 17,322,8,17,1,18,1,18,1,18,3,18,327,8,18,1,18,1,18,1,19,1,19,1,20,1,20, + 1,21,1,21,3,21,337,8,21,1,22,1,22,1,22,1,22,5,22,343,8,22,10,22,12,22,346, + 9,22,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,5,24,356,8,24,10,24,12,24, + 359,9,24,1,24,3,24,362,8,24,1,24,1,24,3,24,366,8,24,1,25,1,25,1,25,1,26, + 1,26,3,26,373,8,26,1,26,1,26,3,26,377,8,26,1,27,1,27,1,27,5,27,382,8,27, + 10,27,12,27,385,9,27,1,28,1,28,1,28,3,28,390,8,28,1,29,1,29,1,29,5,29,395, + 8,29,10,29,12,29,398,9,29,1,30,1,30,1,30,5,30,403,8,30,10,30,12,30,406, + 9,30,1,31,1,31,1,31,5,31,411,8,31,10,31,12,31,414,9,31,1,32,1,32,1,33,1, + 33,1,33,3,33,421,8,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, + 1,34,1,34,1,34,5,34,436,8,34,10,34,12,34,439,9,34,1,34,1,34,1,34,1,34,1, + 34,1,34,5,34,447,8,34,10,34,12,34,450,9,34,1,34,1,34,1,34,1,34,1,34,1,34, + 5,34,458,8,34,10,34,12,34,461,9,34,1,34,1,34,3,34,465,8,34,1,35,1,35,3, + 35,469,8,35,1,36,1,36,1,36,3,36,474,8,36,1,37,1,37,1,37,1,38,1,38,1,38, + 1,38,5,38,483,8,38,10,38,12,38,486,9,38,1,39,1,39,3,39,490,8,39,1,39,1, + 39,3,39,494,8,39,1,40,1,40,1,40,1,41,1,41,1,41,1,42,1,42,1,42,1,42,5,42, + 506,8,42,10,42,12,42,509,9,42,1,43,1,43,1,43,1,43,1,44,1,44,1,44,1,44,3, + 44,519,8,44,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,47,1,47,1,47,5,47,531, + 8,47,10,47,12,47,534,9,47,1,48,1,48,1,48,1,48,1,49,1,49,1,50,1,50,3,50, + 544,8,50,1,51,3,51,547,8,51,1,51,1,51,1,52,3,52,552,8,52,1,52,1,52,1,53, + 1,53,1,54,1,54,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,58,1, + 58,1,58,1,58,3,58,574,8,58,1,58,1,58,1,58,1,58,5,58,580,8,58,10,58,12,58, + 583,9,58,3,58,585,8,58,1,59,1,59,1,59,3,59,590,8,59,1,59,1,59,1,60,1,60, + 1,60,1,60,1,60,1,61,1,61,1,61,1,61,3,61,603,8,61,1,61,0,4,2,10,18,20,62, + 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50, + 52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98, + 100,102,104,106,108,110,112,114,116,118,120,122,0,8,1,0,58,59,1,0,60,62, + 2,0,25,25,76,76,1,0,67,68,2,0,30,30,34,34,2,0,37,37,40,40,2,0,36,36,50, + 50,2,0,51,51,53,57,631,0,124,1,0,0,0,2,127,1,0,0,0,4,144,1,0,0,0,6,162, + 1,0,0,0,8,164,1,0,0,0,10,197,1,0,0,0,12,224,1,0,0,0,14,226,1,0,0,0,16,235, + 1,0,0,0,18,241,1,0,0,0,20,262,1,0,0,0,22,272,1,0,0,0,24,289,1,0,0,0,26, + 291,1,0,0,0,28,293,1,0,0,0,30,296,1,0,0,0,32,307,1,0,0,0,34,311,1,0,0,0, + 36,326,1,0,0,0,38,330,1,0,0,0,40,332,1,0,0,0,42,336,1,0,0,0,44,338,1,0, + 0,0,46,347,1,0,0,0,48,351,1,0,0,0,50,367,1,0,0,0,52,370,1,0,0,0,54,378, + 1,0,0,0,56,386,1,0,0,0,58,391,1,0,0,0,60,399,1,0,0,0,62,407,1,0,0,0,64, + 415,1,0,0,0,66,420,1,0,0,0,68,464,1,0,0,0,70,468,1,0,0,0,72,473,1,0,0,0, + 74,475,1,0,0,0,76,478,1,0,0,0,78,487,1,0,0,0,80,495,1,0,0,0,82,498,1,0, + 0,0,84,501,1,0,0,0,86,510,1,0,0,0,88,514,1,0,0,0,90,520,1,0,0,0,92,524, + 1,0,0,0,94,527,1,0,0,0,96,535,1,0,0,0,98,539,1,0,0,0,100,543,1,0,0,0,102, + 546,1,0,0,0,104,551,1,0,0,0,106,555,1,0,0,0,108,557,1,0,0,0,110,559,1,0, + 0,0,112,562,1,0,0,0,114,566,1,0,0,0,116,569,1,0,0,0,118,589,1,0,0,0,120, + 593,1,0,0,0,122,598,1,0,0,0,124,125,3,2,1,0,125,126,5,0,0,1,126,1,1,0,0, + 0,127,128,6,1,-1,0,128,129,3,4,2,0,129,135,1,0,0,0,130,131,10,1,0,0,131, + 132,5,24,0,0,132,134,3,6,3,0,133,130,1,0,0,0,134,137,1,0,0,0,135,133,1, + 0,0,0,135,136,1,0,0,0,136,3,1,0,0,0,137,135,1,0,0,0,138,145,3,110,55,0, + 139,145,3,34,17,0,140,145,3,28,14,0,141,145,3,114,57,0,142,143,4,2,1,0, + 143,145,3,48,24,0,144,138,1,0,0,0,144,139,1,0,0,0,144,140,1,0,0,0,144,141, + 1,0,0,0,144,142,1,0,0,0,145,5,1,0,0,0,146,163,3,50,25,0,147,163,3,8,4,0, + 148,163,3,80,40,0,149,163,3,74,37,0,150,163,3,52,26,0,151,163,3,76,38,0, + 152,163,3,82,41,0,153,163,3,84,42,0,154,163,3,88,44,0,155,163,3,90,45,0, + 156,163,3,116,58,0,157,163,3,92,46,0,158,159,4,3,2,0,159,163,3,122,61,0, + 160,161,4,3,3,0,161,163,3,120,60,0,162,146,1,0,0,0,162,147,1,0,0,0,162, + 148,1,0,0,0,162,149,1,0,0,0,162,150,1,0,0,0,162,151,1,0,0,0,162,152,1,0, + 0,0,162,153,1,0,0,0,162,154,1,0,0,0,162,155,1,0,0,0,162,156,1,0,0,0,162, + 157,1,0,0,0,162,158,1,0,0,0,162,160,1,0,0,0,163,7,1,0,0,0,164,165,5,16, + 0,0,165,166,3,10,5,0,166,9,1,0,0,0,167,168,6,5,-1,0,168,169,5,43,0,0,169, + 198,3,10,5,8,170,198,3,16,8,0,171,198,3,12,6,0,172,174,3,16,8,0,173,175, + 5,43,0,0,174,173,1,0,0,0,174,175,1,0,0,0,175,176,1,0,0,0,176,177,5,38,0, + 0,177,178,5,42,0,0,178,183,3,16,8,0,179,180,5,33,0,0,180,182,3,16,8,0,181, + 179,1,0,0,0,182,185,1,0,0,0,183,181,1,0,0,0,183,184,1,0,0,0,184,186,1,0, + 0,0,185,183,1,0,0,0,186,187,5,49,0,0,187,198,1,0,0,0,188,189,3,16,8,0,189, + 191,5,39,0,0,190,192,5,43,0,0,191,190,1,0,0,0,191,192,1,0,0,0,192,193,1, + 0,0,0,193,194,5,44,0,0,194,198,1,0,0,0,195,196,4,5,4,0,196,198,3,14,7,0, + 197,167,1,0,0,0,197,170,1,0,0,0,197,171,1,0,0,0,197,172,1,0,0,0,197,188, + 1,0,0,0,197,195,1,0,0,0,198,207,1,0,0,0,199,200,10,5,0,0,200,201,5,29,0, + 0,201,206,3,10,5,6,202,203,10,4,0,0,203,204,5,46,0,0,204,206,3,10,5,5,205, + 199,1,0,0,0,205,202,1,0,0,0,206,209,1,0,0,0,207,205,1,0,0,0,207,208,1,0, + 0,0,208,11,1,0,0,0,209,207,1,0,0,0,210,212,3,16,8,0,211,213,5,43,0,0,212, + 211,1,0,0,0,212,213,1,0,0,0,213,214,1,0,0,0,214,215,5,41,0,0,215,216,3, + 106,53,0,216,225,1,0,0,0,217,219,3,16,8,0,218,220,5,43,0,0,219,218,1,0, + 0,0,219,220,1,0,0,0,220,221,1,0,0,0,221,222,5,48,0,0,222,223,3,106,53,0, + 223,225,1,0,0,0,224,210,1,0,0,0,224,217,1,0,0,0,225,13,1,0,0,0,226,227, + 3,16,8,0,227,228,5,63,0,0,228,229,3,106,53,0,229,15,1,0,0,0,230,236,3,18, + 9,0,231,232,3,18,9,0,232,233,3,108,54,0,233,234,3,18,9,0,234,236,1,0,0, + 0,235,230,1,0,0,0,235,231,1,0,0,0,236,17,1,0,0,0,237,238,6,9,-1,0,238,242, + 3,20,10,0,239,240,7,0,0,0,240,242,3,18,9,3,241,237,1,0,0,0,241,239,1,0, + 0,0,242,251,1,0,0,0,243,244,10,2,0,0,244,245,7,1,0,0,245,250,3,18,9,3,246, + 247,10,1,0,0,247,248,7,0,0,0,248,250,3,18,9,2,249,243,1,0,0,0,249,246,1, + 0,0,0,250,253,1,0,0,0,251,249,1,0,0,0,251,252,1,0,0,0,252,19,1,0,0,0,253, + 251,1,0,0,0,254,255,6,10,-1,0,255,263,3,68,34,0,256,263,3,58,29,0,257,263, + 3,22,11,0,258,259,5,42,0,0,259,260,3,10,5,0,260,261,5,49,0,0,261,263,1, + 0,0,0,262,254,1,0,0,0,262,256,1,0,0,0,262,257,1,0,0,0,262,258,1,0,0,0,263, + 269,1,0,0,0,264,265,10,1,0,0,265,266,5,32,0,0,266,268,3,26,13,0,267,264, + 1,0,0,0,268,271,1,0,0,0,269,267,1,0,0,0,269,270,1,0,0,0,270,21,1,0,0,0, + 271,269,1,0,0,0,272,273,3,24,12,0,273,283,5,42,0,0,274,284,5,60,0,0,275, + 280,3,10,5,0,276,277,5,33,0,0,277,279,3,10,5,0,278,276,1,0,0,0,279,282, + 1,0,0,0,280,278,1,0,0,0,280,281,1,0,0,0,281,284,1,0,0,0,282,280,1,0,0,0, + 283,274,1,0,0,0,283,275,1,0,0,0,283,284,1,0,0,0,284,285,1,0,0,0,285,286, + 5,49,0,0,286,23,1,0,0,0,287,290,5,63,0,0,288,290,3,72,36,0,289,287,1,0, + 0,0,289,288,1,0,0,0,290,25,1,0,0,0,291,292,3,64,32,0,292,27,1,0,0,0,293, + 294,5,12,0,0,294,295,3,30,15,0,295,29,1,0,0,0,296,301,3,32,16,0,297,298, + 5,33,0,0,298,300,3,32,16,0,299,297,1,0,0,0,300,303,1,0,0,0,301,299,1,0, + 0,0,301,302,1,0,0,0,302,31,1,0,0,0,303,301,1,0,0,0,304,305,3,58,29,0,305, + 306,5,31,0,0,306,308,1,0,0,0,307,304,1,0,0,0,307,308,1,0,0,0,308,309,1, + 0,0,0,309,310,3,10,5,0,310,33,1,0,0,0,311,312,5,6,0,0,312,317,3,36,18,0, + 313,314,5,33,0,0,314,316,3,36,18,0,315,313,1,0,0,0,316,319,1,0,0,0,317, + 315,1,0,0,0,317,318,1,0,0,0,318,321,1,0,0,0,319,317,1,0,0,0,320,322,3,42, + 21,0,321,320,1,0,0,0,321,322,1,0,0,0,322,35,1,0,0,0,323,324,3,38,19,0,324, + 325,5,104,0,0,325,327,1,0,0,0,326,323,1,0,0,0,326,327,1,0,0,0,327,328,1, + 0,0,0,328,329,3,40,20,0,329,37,1,0,0,0,330,331,5,76,0,0,331,39,1,0,0,0, + 332,333,7,2,0,0,333,41,1,0,0,0,334,337,3,44,22,0,335,337,3,46,23,0,336, + 334,1,0,0,0,336,335,1,0,0,0,337,43,1,0,0,0,338,339,5,75,0,0,339,344,5,76, + 0,0,340,341,5,33,0,0,341,343,5,76,0,0,342,340,1,0,0,0,343,346,1,0,0,0,344, + 342,1,0,0,0,344,345,1,0,0,0,345,45,1,0,0,0,346,344,1,0,0,0,347,348,5,65, + 0,0,348,349,3,44,22,0,349,350,5,66,0,0,350,47,1,0,0,0,351,352,5,19,0,0, + 352,357,3,36,18,0,353,354,5,33,0,0,354,356,3,36,18,0,355,353,1,0,0,0,356, + 359,1,0,0,0,357,355,1,0,0,0,357,358,1,0,0,0,358,361,1,0,0,0,359,357,1,0, + 0,0,360,362,3,54,27,0,361,360,1,0,0,0,361,362,1,0,0,0,362,365,1,0,0,0,363, + 364,5,28,0,0,364,366,3,30,15,0,365,363,1,0,0,0,365,366,1,0,0,0,366,49,1, + 0,0,0,367,368,5,4,0,0,368,369,3,30,15,0,369,51,1,0,0,0,370,372,5,15,0,0, + 371,373,3,54,27,0,372,371,1,0,0,0,372,373,1,0,0,0,373,376,1,0,0,0,374,375, + 5,28,0,0,375,377,3,30,15,0,376,374,1,0,0,0,376,377,1,0,0,0,377,53,1,0,0, + 0,378,383,3,56,28,0,379,380,5,33,0,0,380,382,3,56,28,0,381,379,1,0,0,0, + 382,385,1,0,0,0,383,381,1,0,0,0,383,384,1,0,0,0,384,55,1,0,0,0,385,383, + 1,0,0,0,386,389,3,32,16,0,387,388,5,16,0,0,388,390,3,10,5,0,389,387,1,0, + 0,0,389,390,1,0,0,0,390,57,1,0,0,0,391,396,3,72,36,0,392,393,5,35,0,0,393, + 395,3,72,36,0,394,392,1,0,0,0,395,398,1,0,0,0,396,394,1,0,0,0,396,397,1, + 0,0,0,397,59,1,0,0,0,398,396,1,0,0,0,399,404,3,66,33,0,400,401,5,35,0,0, + 401,403,3,66,33,0,402,400,1,0,0,0,403,406,1,0,0,0,404,402,1,0,0,0,404,405, + 1,0,0,0,405,61,1,0,0,0,406,404,1,0,0,0,407,412,3,60,30,0,408,409,5,33,0, + 0,409,411,3,60,30,0,410,408,1,0,0,0,411,414,1,0,0,0,412,410,1,0,0,0,412, + 413,1,0,0,0,413,63,1,0,0,0,414,412,1,0,0,0,415,416,7,3,0,0,416,65,1,0,0, + 0,417,421,5,80,0,0,418,419,4,33,10,0,419,421,3,70,35,0,420,417,1,0,0,0, + 420,418,1,0,0,0,421,67,1,0,0,0,422,465,5,44,0,0,423,424,3,104,52,0,424, + 425,5,67,0,0,425,465,1,0,0,0,426,465,3,102,51,0,427,465,3,104,52,0,428, + 465,3,98,49,0,429,465,3,70,35,0,430,465,3,106,53,0,431,432,5,65,0,0,432, + 437,3,100,50,0,433,434,5,33,0,0,434,436,3,100,50,0,435,433,1,0,0,0,436, + 439,1,0,0,0,437,435,1,0,0,0,437,438,1,0,0,0,438,440,1,0,0,0,439,437,1,0, + 0,0,440,441,5,66,0,0,441,465,1,0,0,0,442,443,5,65,0,0,443,448,3,98,49,0, + 444,445,5,33,0,0,445,447,3,98,49,0,446,444,1,0,0,0,447,450,1,0,0,0,448, + 446,1,0,0,0,448,449,1,0,0,0,449,451,1,0,0,0,450,448,1,0,0,0,451,452,5,66, + 0,0,452,465,1,0,0,0,453,454,5,65,0,0,454,459,3,106,53,0,455,456,5,33,0, + 0,456,458,3,106,53,0,457,455,1,0,0,0,458,461,1,0,0,0,459,457,1,0,0,0,459, + 460,1,0,0,0,460,462,1,0,0,0,461,459,1,0,0,0,462,463,5,66,0,0,463,465,1, + 0,0,0,464,422,1,0,0,0,464,423,1,0,0,0,464,426,1,0,0,0,464,427,1,0,0,0,464, + 428,1,0,0,0,464,429,1,0,0,0,464,430,1,0,0,0,464,431,1,0,0,0,464,442,1,0, + 0,0,464,453,1,0,0,0,465,69,1,0,0,0,466,469,5,47,0,0,467,469,5,64,0,0,468, + 466,1,0,0,0,468,467,1,0,0,0,469,71,1,0,0,0,470,474,3,64,32,0,471,472,4, + 36,11,0,472,474,3,70,35,0,473,470,1,0,0,0,473,471,1,0,0,0,474,73,1,0,0, + 0,475,476,5,9,0,0,476,477,5,26,0,0,477,75,1,0,0,0,478,479,5,14,0,0,479, + 484,3,78,39,0,480,481,5,33,0,0,481,483,3,78,39,0,482,480,1,0,0,0,483,486, + 1,0,0,0,484,482,1,0,0,0,484,485,1,0,0,0,485,77,1,0,0,0,486,484,1,0,0,0, + 487,489,3,10,5,0,488,490,7,4,0,0,489,488,1,0,0,0,489,490,1,0,0,0,490,493, + 1,0,0,0,491,492,5,45,0,0,492,494,7,5,0,0,493,491,1,0,0,0,493,494,1,0,0, + 0,494,79,1,0,0,0,495,496,5,8,0,0,496,497,3,62,31,0,497,81,1,0,0,0,498,499, + 5,2,0,0,499,500,3,62,31,0,500,83,1,0,0,0,501,502,5,11,0,0,502,507,3,86, + 43,0,503,504,5,33,0,0,504,506,3,86,43,0,505,503,1,0,0,0,506,509,1,0,0,0, + 507,505,1,0,0,0,507,508,1,0,0,0,508,85,1,0,0,0,509,507,1,0,0,0,510,511, + 3,60,30,0,511,512,5,84,0,0,512,513,3,60,30,0,513,87,1,0,0,0,514,515,5,1, + 0,0,515,516,3,20,10,0,516,518,3,106,53,0,517,519,3,94,47,0,518,517,1,0, + 0,0,518,519,1,0,0,0,519,89,1,0,0,0,520,521,5,7,0,0,521,522,3,20,10,0,522, + 523,3,106,53,0,523,91,1,0,0,0,524,525,5,10,0,0,525,526,3,58,29,0,526,93, + 1,0,0,0,527,532,3,96,48,0,528,529,5,33,0,0,529,531,3,96,48,0,530,528,1, + 0,0,0,531,534,1,0,0,0,532,530,1,0,0,0,532,533,1,0,0,0,533,95,1,0,0,0,534, + 532,1,0,0,0,535,536,3,64,32,0,536,537,5,31,0,0,537,538,3,68,34,0,538,97, + 1,0,0,0,539,540,7,6,0,0,540,99,1,0,0,0,541,544,3,102,51,0,542,544,3,104, + 52,0,543,541,1,0,0,0,543,542,1,0,0,0,544,101,1,0,0,0,545,547,7,0,0,0,546, + 545,1,0,0,0,546,547,1,0,0,0,547,548,1,0,0,0,548,549,5,27,0,0,549,103,1, + 0,0,0,550,552,7,0,0,0,551,550,1,0,0,0,551,552,1,0,0,0,552,553,1,0,0,0,553, + 554,5,26,0,0,554,105,1,0,0,0,555,556,5,25,0,0,556,107,1,0,0,0,557,558,7, + 7,0,0,558,109,1,0,0,0,559,560,5,5,0,0,560,561,3,112,56,0,561,111,1,0,0, + 0,562,563,5,65,0,0,563,564,3,2,1,0,564,565,5,66,0,0,565,113,1,0,0,0,566, + 567,5,13,0,0,567,568,5,100,0,0,568,115,1,0,0,0,569,570,5,3,0,0,570,573, + 5,90,0,0,571,572,5,88,0,0,572,574,3,60,30,0,573,571,1,0,0,0,573,574,1,0, + 0,0,574,584,1,0,0,0,575,576,5,89,0,0,576,581,3,118,59,0,577,578,5,33,0, + 0,578,580,3,118,59,0,579,577,1,0,0,0,580,583,1,0,0,0,581,579,1,0,0,0,581, + 582,1,0,0,0,582,585,1,0,0,0,583,581,1,0,0,0,584,575,1,0,0,0,584,585,1,0, + 0,0,585,117,1,0,0,0,586,587,3,60,30,0,587,588,5,31,0,0,588,590,1,0,0,0, + 589,586,1,0,0,0,589,590,1,0,0,0,590,591,1,0,0,0,591,592,3,60,30,0,592,119, + 1,0,0,0,593,594,5,18,0,0,594,595,3,36,18,0,595,596,5,88,0,0,596,597,3,62, + 31,0,597,121,1,0,0,0,598,599,5,17,0,0,599,602,3,54,27,0,600,601,5,28,0, + 0,601,603,3,30,15,0,602,600,1,0,0,0,602,603,1,0,0,0,603,123,1,0,0,0,59, + 135,144,162,174,183,191,197,205,207,212,219,224,235,241,249,251,262,269, + 280,283,289,301,307,317,321,326,336,344,357,361,365,372,376,383,389,396, + 404,412,420,437,448,459,464,468,473,484,489,493,507,518,532,543,546,551, + 573,581,584,589,602]; private static __ATN: ATN; public static get _ATN(): ATN { @@ -3994,8 +4132,8 @@ export class MatchBooleanExpressionContext extends ParserRuleContext { public valueExpression(): ValueExpressionContext { return this.getTypedRuleContext(ValueExpressionContext, 0) as ValueExpressionContext; } - public DEV_MATCH(): TerminalNode { - return this.getToken(esql_parser.DEV_MATCH, 0); + public MATCH(): TerminalNode { + return this.getToken(esql_parser.MATCH, 0); } public string_(): StringContext { return this.getTypedRuleContext(StringContext, 0) as StringContext; @@ -4301,8 +4439,8 @@ export class FunctionExpressionContext extends ParserRuleContext { super(parent, invokingState); this.parser = parser; } - public identifierOrParameter(): IdentifierOrParameterContext { - return this.getTypedRuleContext(IdentifierOrParameterContext, 0) as IdentifierOrParameterContext; + public functionName(): FunctionNameContext { + return this.getTypedRuleContext(FunctionNameContext, 0) as FunctionNameContext; } public LP(): TerminalNode { return this.getToken(esql_parser.LP, 0); @@ -4341,6 +4479,33 @@ export class FunctionExpressionContext extends ParserRuleContext { } +export class FunctionNameContext extends ParserRuleContext { + constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public MATCH(): TerminalNode { + return this.getToken(esql_parser.MATCH, 0); + } + public identifierOrParameter(): IdentifierOrParameterContext { + return this.getTypedRuleContext(IdentifierOrParameterContext, 0) as IdentifierOrParameterContext; + } + public get ruleIndex(): number { + return esql_parser.RULE_functionName; + } + public enterRule(listener: esql_parserListener): void { + if(listener.enterFunctionName) { + listener.enterFunctionName(this); + } + } + public exitRule(listener: esql_parserListener): void { + if(listener.exitFunctionName) { + listener.exitFunctionName(this); + } + } +} + + export class DataTypeContext extends ParserRuleContext { constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); @@ -4508,15 +4673,15 @@ export class IndexPatternContext extends ParserRuleContext { super(parent, invokingState); this.parser = parser; } + public indexString(): IndexStringContext { + return this.getTypedRuleContext(IndexStringContext, 0) as IndexStringContext; + } public clusterString(): ClusterStringContext { return this.getTypedRuleContext(ClusterStringContext, 0) as ClusterStringContext; } public COLON(): TerminalNode { return this.getToken(esql_parser.COLON, 0); } - public indexString(): IndexStringContext { - return this.getTypedRuleContext(IndexStringContext, 0) as IndexStringContext; - } public get ruleIndex(): number { return esql_parser.RULE_indexPattern; } @@ -4678,7 +4843,7 @@ export class Deprecated_metadataContext extends ParserRuleContext { export class MetricsCommandContext extends ParserRuleContext { - public _aggregates!: FieldsContext; + public _aggregates!: AggFieldsContext; public _grouping!: FieldsContext; constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); @@ -4702,11 +4867,11 @@ export class MetricsCommandContext extends ParserRuleContext { public BY(): TerminalNode { return this.getToken(esql_parser.BY, 0); } - public fields_list(): FieldsContext[] { - return this.getTypedRuleContexts(FieldsContext) as FieldsContext[]; + public aggFields(): AggFieldsContext { + return this.getTypedRuleContext(AggFieldsContext, 0) as AggFieldsContext; } - public fields(i: number): FieldsContext { - return this.getTypedRuleContext(FieldsContext, i) as FieldsContext; + public fields(): FieldsContext { + return this.getTypedRuleContext(FieldsContext, 0) as FieldsContext; } public get ruleIndex(): number { return esql_parser.RULE_metricsCommand; @@ -4752,7 +4917,7 @@ export class EvalCommandContext extends ParserRuleContext { export class StatsCommandContext extends ParserRuleContext { - public _stats!: FieldsContext; + public _stats!: AggFieldsContext; public _grouping!: FieldsContext; constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); @@ -4764,11 +4929,11 @@ export class StatsCommandContext extends ParserRuleContext { public BY(): TerminalNode { return this.getToken(esql_parser.BY, 0); } - public fields_list(): FieldsContext[] { - return this.getTypedRuleContexts(FieldsContext) as FieldsContext[]; + public aggFields(): AggFieldsContext { + return this.getTypedRuleContext(AggFieldsContext, 0) as AggFieldsContext; } - public fields(i: number): FieldsContext { - return this.getTypedRuleContext(FieldsContext, i) as FieldsContext; + public fields(): FieldsContext { + return this.getTypedRuleContext(FieldsContext, 0) as FieldsContext; } public get ruleIndex(): number { return esql_parser.RULE_statsCommand; @@ -4786,6 +4951,69 @@ export class StatsCommandContext extends ParserRuleContext { } +export class AggFieldsContext extends ParserRuleContext { + constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public aggField_list(): AggFieldContext[] { + return this.getTypedRuleContexts(AggFieldContext) as AggFieldContext[]; + } + public aggField(i: number): AggFieldContext { + return this.getTypedRuleContext(AggFieldContext, i) as AggFieldContext; + } + public COMMA_list(): TerminalNode[] { + return this.getTokens(esql_parser.COMMA); + } + public COMMA(i: number): TerminalNode { + return this.getToken(esql_parser.COMMA, i); + } + public get ruleIndex(): number { + return esql_parser.RULE_aggFields; + } + public enterRule(listener: esql_parserListener): void { + if(listener.enterAggFields) { + listener.enterAggFields(this); + } + } + public exitRule(listener: esql_parserListener): void { + if(listener.exitAggFields) { + listener.exitAggFields(this); + } + } +} + + +export class AggFieldContext extends ParserRuleContext { + constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public field(): FieldContext { + return this.getTypedRuleContext(FieldContext, 0) as FieldContext; + } + public WHERE(): TerminalNode { + return this.getToken(esql_parser.WHERE, 0); + } + public booleanExpression(): BooleanExpressionContext { + return this.getTypedRuleContext(BooleanExpressionContext, 0) as BooleanExpressionContext; + } + public get ruleIndex(): number { + return esql_parser.RULE_aggField; + } + public enterRule(listener: esql_parserListener): void { + if(listener.enterAggField) { + listener.enterAggField(this); + } + } + public exitRule(listener: esql_parserListener): void { + if(listener.exitAggField) { + listener.exitAggField(this); + } + } +} + + export class QualifiedNameContext extends ParserRuleContext { constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); @@ -6037,7 +6265,7 @@ export class LookupCommandContext extends ParserRuleContext { export class InlinestatsCommandContext extends ParserRuleContext { - public _stats!: FieldsContext; + public _stats!: AggFieldsContext; public _grouping!: FieldsContext; constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); @@ -6046,15 +6274,15 @@ export class InlinestatsCommandContext extends ParserRuleContext { public DEV_INLINESTATS(): TerminalNode { return this.getToken(esql_parser.DEV_INLINESTATS, 0); } - public fields_list(): FieldsContext[] { - return this.getTypedRuleContexts(FieldsContext) as FieldsContext[]; - } - public fields(i: number): FieldsContext { - return this.getTypedRuleContext(FieldsContext, i) as FieldsContext; + public aggFields(): AggFieldsContext { + return this.getTypedRuleContext(AggFieldsContext, 0) as AggFieldsContext; } public BY(): TerminalNode { return this.getToken(esql_parser.BY, 0); } + public fields(): FieldsContext { + return this.getTypedRuleContext(FieldsContext, 0) as FieldsContext; + } public get ruleIndex(): number { return esql_parser.RULE_inlinestatsCommand; } diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts b/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts index f5c54adbe18d5..576418862be01 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts @@ -38,6 +38,7 @@ import { ConstantDefaultContext } from "./esql_parser.js"; import { ParenthesizedExpressionContext } from "./esql_parser.js"; import { FunctionContext } from "./esql_parser.js"; import { FunctionExpressionContext } from "./esql_parser.js"; +import { FunctionNameContext } from "./esql_parser.js"; import { ToDataTypeContext } from "./esql_parser.js"; import { RowCommandContext } from "./esql_parser.js"; import { FieldsContext } from "./esql_parser.js"; @@ -52,6 +53,8 @@ import { Deprecated_metadataContext } from "./esql_parser.js"; import { MetricsCommandContext } from "./esql_parser.js"; import { EvalCommandContext } from "./esql_parser.js"; import { StatsCommandContext } from "./esql_parser.js"; +import { AggFieldsContext } from "./esql_parser.js"; +import { AggFieldContext } from "./esql_parser.js"; import { QualifiedNameContext } from "./esql_parser.js"; import { QualifiedNamePatternContext } from "./esql_parser.js"; import { QualifiedNamePatternsContext } from "./esql_parser.js"; @@ -400,6 +403,16 @@ export default class esql_parserListener extends ParseTreeListener { * @param ctx the parse tree */ exitFunctionExpression?: (ctx: FunctionExpressionContext) => void; + /** + * Enter a parse tree produced by `esql_parser.functionName`. + * @param ctx the parse tree + */ + enterFunctionName?: (ctx: FunctionNameContext) => void; + /** + * Exit a parse tree produced by `esql_parser.functionName`. + * @param ctx the parse tree + */ + exitFunctionName?: (ctx: FunctionNameContext) => void; /** * Enter a parse tree produced by the `toDataType` * labeled alternative in `esql_parser.dataType`. @@ -542,6 +555,26 @@ export default class esql_parserListener extends ParseTreeListener { * @param ctx the parse tree */ exitStatsCommand?: (ctx: StatsCommandContext) => void; + /** + * Enter a parse tree produced by `esql_parser.aggFields`. + * @param ctx the parse tree + */ + enterAggFields?: (ctx: AggFieldsContext) => void; + /** + * Exit a parse tree produced by `esql_parser.aggFields`. + * @param ctx the parse tree + */ + exitAggFields?: (ctx: AggFieldsContext) => void; + /** + * Enter a parse tree produced by `esql_parser.aggField`. + * @param ctx the parse tree + */ + enterAggField?: (ctx: AggFieldContext) => void; + /** + * Exit a parse tree produced by `esql_parser.aggField`. + * @param ctx the parse tree + */ + exitAggField?: (ctx: AggFieldContext) => void; /** * Enter a parse tree produced by `esql_parser.qualifiedName`. * @param ctx the parse tree diff --git a/packages/kbn-esql-ast/src/parser/esql_ast_builder_listener.ts b/packages/kbn-esql-ast/src/parser/esql_ast_builder_listener.ts index 3959d42d8a35f..a3f5bfabed154 100644 --- a/packages/kbn-esql-ast/src/parser/esql_ast_builder_listener.ts +++ b/packages/kbn-esql-ast/src/parser/esql_ast_builder_listener.ts @@ -45,6 +45,7 @@ import { getPosition } from './helpers'; import { collectAllSourceIdentifiers, collectAllFields, + collectAllAggFields, visitByOption, collectAllColumnIdentifiers, visitRenameClauses, @@ -144,8 +145,8 @@ export class ESQLAstBuilderListener implements ESQLParserListener { .map((sourceCtx) => createSource(sourceCtx)), }; this.ast.push(node); - const aggregates = collectAllFields(ctx.fields(0)); - const grouping = collectAllFields(ctx.fields(1)); + const aggregates = collectAllAggFields(ctx.aggFields()); + const grouping = collectAllFields(ctx.fields()); if (aggregates && aggregates.length) { node.aggregates = aggregates; } @@ -175,10 +176,10 @@ export class ESQLAstBuilderListener implements ESQLParserListener { // STATS expression is optional if (ctx._stats) { - command.args.push(...collectAllFields(ctx.fields(0))); + command.args.push(...collectAllAggFields(ctx.aggFields())); } if (ctx._grouping) { - command.args.push(...visitByOption(ctx, ctx._stats ? ctx.fields(1) : ctx.fields(0))); + command.args.push(...visitByOption(ctx, ctx.fields())); } } @@ -192,10 +193,10 @@ export class ESQLAstBuilderListener implements ESQLParserListener { // STATS expression is optional if (ctx._stats) { - command.args.push(...collectAllFields(ctx.fields(0))); + command.args.push(...collectAllAggFields(ctx.aggFields())); } if (ctx._grouping) { - command.args.push(...visitByOption(ctx, ctx._stats ? ctx.fields(1) : ctx.fields(0))); + command.args.push(...visitByOption(ctx, ctx.fields())); } } diff --git a/packages/kbn-esql-ast/src/parser/walkers.ts b/packages/kbn-esql-ast/src/parser/walkers.ts index 30c17c56483f8..df10161f68bf8 100644 --- a/packages/kbn-esql-ast/src/parser/walkers.ts +++ b/packages/kbn-esql-ast/src/parser/walkers.ts @@ -30,6 +30,7 @@ import { type EnrichCommandContext, type FieldContext, type FieldsContext, + type AggFieldsContext, type FromCommandContext, FunctionContext, type GrokCommandContext, @@ -477,8 +478,11 @@ export function visitPrimaryExpression(ctx: PrimaryExpressionContext): ESQLAstIt } if (ctx instanceof FunctionContext) { const functionExpressionCtx = ctx.functionExpression(); + const functionNameContext = functionExpressionCtx.functionName().MATCH() + ? functionExpressionCtx.functionName().MATCH() + : functionExpressionCtx.functionName().identifierOrParameter(); const fn = createFunction( - functionExpressionCtx.identifierOrParameter().getText().toLowerCase(), + functionNameContext.getText().toLowerCase(), ctx, undefined, 'variadic-call' @@ -596,6 +600,21 @@ export function visitField(ctx: FieldContext) { return collectBooleanExpression(ctx.booleanExpression()); } +export function collectAllAggFields(ctx: AggFieldsContext | undefined): ESQLAstField[] { + const ast: ESQLAstField[] = []; + if (!ctx) { + return ast; + } + try { + for (const aggField of ctx.aggField_list()) { + ast.push(...(visitField(aggField.field()) as ESQLAstField[])); + } + } catch (e) { + // do nothing + } + return ast; +} + export function collectAllFields(ctx: FieldsContext | undefined): ESQLAstField[] { const ast: ESQLAstField[] = []; if (!ctx) { diff --git a/packages/kbn-esql-ast/src/walker/walker.test.ts b/packages/kbn-esql-ast/src/walker/walker.test.ts index 8dd40b1a87bd1..980e1499e62aa 100644 --- a/packages/kbn-esql-ast/src/walker/walker.test.ts +++ b/packages/kbn-esql-ast/src/walker/walker.test.ts @@ -36,10 +36,10 @@ test('can walk all functions', () => { test('can find assignment expression', () => { const query = 'METRICS source var0 = bucket(bytes, 1 hour)'; - const { ast } = parse(query); + const { root } = parse(query); const functions: ESQLFunction[] = []; - Walker.walk(ast, { + Walker.walk(root, { visitFunction: (fn) => { if (fn.name === '=') { functions.push(fn); diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.inlinestats.ts b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.inlinestats.ts index a8fa55128251c..c1c7340da78f8 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.inlinestats.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.inlinestats.ts @@ -126,10 +126,10 @@ export const validationStatsCommandTestSuite = (setup: helpers.Setup) => { const { expectErrors } = await setup(); await expectErrors('from a_index | INLINESTATS doubleField=', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); await expectErrors('from a_index | INLINESTATS doubleField=5 by ', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); await expectErrors('from a_index | INLINESTATS avg(doubleField) by wrongField', [ 'Unknown column [wrongField]', @@ -186,7 +186,7 @@ export const validationStatsCommandTestSuite = (setup: helpers.Setup) => { const { expectErrors } = await setup(); await expectErrors('from a_index | INLINESTATS by ', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); }); diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.metrics.ts b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.metrics.ts index 5384fdc136b4e..79dc4e21fe9d7 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.metrics.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.metrics.ts @@ -117,11 +117,11 @@ export const validationMetricsCommandTestSuite = (setup: helpers.Setup) => { await expectErrors('metrics a_index doubleField=', [ expect.any(String), - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); await expectErrors('metrics a_index doubleField=5 by ', [ expect.any(String), - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); }); diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.stats.ts b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.stats.ts index c250166b88968..c499f2477e146 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.stats.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.stats.ts @@ -117,10 +117,10 @@ export const validationStatsCommandTestSuite = (setup: helpers.Setup) => { const { expectErrors } = await setup(); await expectErrors('from a_index | stats doubleField=', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); await expectErrors('from a_index | stats doubleField=5 by ', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); await expectErrors('from a_index | stats avg(doubleField) by wrongField', [ 'Unknown column [wrongField]', @@ -176,7 +176,7 @@ export const validationStatsCommandTestSuite = (setup: helpers.Setup) => { const { expectErrors } = await setup(); await expectErrors('from a_index | stats by ', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); }); diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json index 51ada18f02252..c66aaadf98df8 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json +++ b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json @@ -223,7 +223,7 @@ { "query": "row", "error": [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, @@ -331,7 +331,7 @@ { "query": "row var = 1 in (", "error": [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", "Error: [in] function expects exactly 2 arguments, got 1." ], "warning": [] @@ -2645,7 +2645,7 @@ { "query": "from a_index | dissect", "error": [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, @@ -2740,7 +2740,7 @@ { "query": "from a_index | grok", "error": [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, @@ -3542,21 +3542,21 @@ { "query": "from a_index | where *+ doubleField", "error": [ - "SyntaxError: extraneous input '*' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: extraneous input '*' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, { "query": "from a_index | where /+ doubleField", "error": [ - "SyntaxError: extraneous input '/' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: extraneous input '/' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, { "query": "from a_index | where %+ doubleField", "error": [ - "SyntaxError: extraneous input '%' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: extraneous input '%' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, @@ -4443,7 +4443,7 @@ { "query": "from a_index | eval ", "error": [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, @@ -4486,7 +4486,7 @@ { "query": "from a_index | eval a=b, ", "error": [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", "Unknown column [b]" ], "warning": [] @@ -4513,7 +4513,7 @@ { "query": "from a_index | eval a=round(doubleField), ", "error": [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, @@ -5619,21 +5619,21 @@ { "query": "from a_index | eval *+ doubleField", "error": [ - "SyntaxError: extraneous input '*' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: extraneous input '*' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, { "query": "from a_index | eval /+ doubleField", "error": [ - "SyntaxError: extraneous input '/' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: extraneous input '/' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, { "query": "from a_index | eval %+ doubleField", "error": [ - "SyntaxError: extraneous input '%' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: extraneous input '%' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, @@ -6957,7 +6957,7 @@ { "query": "from a_index | eval not", "error": [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", "Error: [not] function expects exactly one argument, got 0." ], "warning": [] @@ -6965,7 +6965,7 @@ { "query": "from a_index | eval in", "error": [ - "SyntaxError: mismatched input 'in' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: mismatched input 'in' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, @@ -9014,7 +9014,7 @@ { "query": "from a_index | sort ", "error": [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, @@ -9033,7 +9033,7 @@ { "query": "from a_index | sort doubleField, ", "error": [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}" ], "warning": [] }, diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts index 5e636a941a86c..fae4ca16797cc 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -306,7 +306,7 @@ describe('validation logic', () => { describe('row', () => { testErrorsAndWarnings('row', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('row missing_column', ['Unknown column [missing_column]']); testErrorsAndWarnings('row fn()', ['Unknown function [fn]']); @@ -335,7 +335,7 @@ describe('validation logic', () => { "SyntaxError: mismatched input '' expecting '('", ]); testErrorsAndWarnings('row var = 1 in (', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", 'Error: [in] function expects exactly 2 arguments, got 1.', ]); testErrorsAndWarnings('row var = 1 not in ', [ @@ -690,7 +690,7 @@ describe('validation logic', () => { describe('dissect', () => { testErrorsAndWarnings('from a_index | dissect', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | dissect textField', [ "SyntaxError: missing QUOTED_STRING at ''", @@ -741,7 +741,7 @@ describe('validation logic', () => { describe('grok', () => { testErrorsAndWarnings('from a_index | grok', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | grok textField', [ "SyntaxError: missing QUOTED_STRING at ''", @@ -826,7 +826,7 @@ describe('validation logic', () => { } for (const wrongOp of ['*', '/', '%']) { testErrorsAndWarnings(`from a_index | where ${wrongOp}+ doubleField`, [ - `SyntaxError: extraneous input '${wrongOp}' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`, + `SyntaxError: extraneous input '${wrongOp}' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`, ]); } @@ -899,7 +899,7 @@ describe('validation logic', () => { describe('eval', () => { testErrorsAndWarnings('from a_index | eval ', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | eval textField ', []); testErrorsAndWarnings('from a_index | eval b = textField', []); @@ -912,7 +912,7 @@ describe('validation logic', () => { ]); testErrorsAndWarnings('from a_index | eval a=b', ['Unknown column [b]']); testErrorsAndWarnings('from a_index | eval a=b, ', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", 'Unknown column [b]', ]); testErrorsAndWarnings('from a_index | eval a=round', ['Unknown column [round]']); @@ -921,7 +921,7 @@ describe('validation logic', () => { ]); testErrorsAndWarnings('from a_index | eval a=round(doubleField) ', []); testErrorsAndWarnings('from a_index | eval a=round(doubleField), ', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | eval a=round(doubleField) + round(doubleField) ', []); testErrorsAndWarnings('from a_index | eval a=round(doubleField) + round(textField) ', [ @@ -984,7 +984,7 @@ describe('validation logic', () => { for (const wrongOp of ['*', '/', '%']) { testErrorsAndWarnings(`from a_index | eval ${wrongOp}+ doubleField`, [ - `SyntaxError: extraneous input '${wrongOp}' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`, + `SyntaxError: extraneous input '${wrongOp}' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`, ]); } testErrorsAndWarnings( @@ -1203,11 +1203,11 @@ describe('validation logic', () => { [] ); testErrorsAndWarnings('from a_index | eval not', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", 'Error: [not] function expects exactly one argument, got 0.', ]); testErrorsAndWarnings('from a_index | eval in', [ - "SyntaxError: mismatched input 'in' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input 'in' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | eval textField in textField', [ @@ -1289,12 +1289,12 @@ describe('validation logic', () => { describe('sort', () => { testErrorsAndWarnings('from a_index | sort ', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | sort "field" ', []); testErrorsAndWarnings('from a_index | sort wrongField ', ['Unknown column [wrongField]']); testErrorsAndWarnings('from a_index | sort doubleField, ', [ - "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {QUOTED_STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', 'match', NAMED_OR_POSITIONAL_PARAM, OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | sort doubleField, textField', []); for (const dir of ['desc', 'asc']) { diff --git a/packages/kbn-monaco/src/esql/lib/esql_theme.ts b/packages/kbn-monaco/src/esql/lib/esql_theme.ts index f98eddefd8eab..bf5e2c597eb6c 100644 --- a/packages/kbn-monaco/src/esql/lib/esql_theme.ts +++ b/packages/kbn-monaco/src/esql/lib/esql_theme.ts @@ -47,7 +47,6 @@ export const buildESQlTheme = (): monaco.editor.IStandaloneThemeData => ({ [ 'dev_metrics', 'metadata', - 'dev_match', 'mv_expand', 'stats', 'dev_inlinestats', @@ -75,6 +74,7 @@ export const buildESQlTheme = (): monaco.editor.IStandaloneThemeData => ({ 'asc', 'desc', 'nulls_order', + 'match', ], euiThemeVars.euiColorAccentText, true // isBold From f14d35a4d66ac3c55bfb8c29dc3d9146b1b0e4ea Mon Sep 17 00:00:00 2001 From: Tre Date: Mon, 21 Oct 2024 15:27:12 +0100 Subject: [PATCH 21/69] [SKIP ON MKI] `x-pack/test_serverless/functional/test_suites/search/navigation.ts` (#196828) ## Summary See details: https://github.com/elastic/kibana/issues/196823 Co-authored-by: Elastic Machine --- .../test_serverless/functional/test_suites/search/navigation.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x-pack/test_serverless/functional/test_suites/search/navigation.ts b/x-pack/test_serverless/functional/test_suites/search/navigation.ts index f72bc70b1ee1d..88f327d6f1ac2 100644 --- a/x-pack/test_serverless/functional/test_suites/search/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/search/navigation.ts @@ -19,6 +19,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { const header = getPageObject('header'); describe('navigation', function () { + // see details: https://github.com/elastic/kibana/issues/196823 + this.tags(['failsOnMKI']); before(async () => { await svlCommonPage.loginWithRole('developer'); await svlSearchNavigation.navigateToLandingPage(); From 3547e154b57adbdbf36abda5c4571452b4ee0b26 Mon Sep 17 00:00:00 2001 From: Davis Plumlee <56367316+dplumlee@users.noreply.github.com> Date: Mon, 21 Oct 2024 10:33:26 -0400 Subject: [PATCH 22/69] [Security Solution] Removes outdated rule tour for rule management workflow (#196731) ## Summary Removes the tour for rule features implemented in https://github.com/elastic/kibana/pull/176767 as they are no longer new. Keeps the component and logic to use for future tours, just removes reference to the specific rules management tour. ### Steps to test 1. Make sure the `securitySolution.rulesManagementPage.newFeaturesTour.v8.13` local storage key is cleared from your kibana page (this will make the tour show up normally) 2. Notice that navigating to the rule management page does not display the rule tour Co-authored-by: Elastic Machine --- .../rule_management_ui/pages/rule_management/index.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/pages/rule_management/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/pages/rule_management/index.tsx index 7033785b20052..17c5368a4b1c5 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/pages/rule_management/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/pages/rule_management/index.tsx @@ -35,7 +35,6 @@ import { AllRules } from '../../components/rules_table'; import { RulesTableContextProvider } from '../../components/rules_table/rules_table/rules_table_context'; import { useInvalidateFetchCoverageOverviewQuery } from '../../../rule_management/api/hooks/use_fetch_coverage_overview_query'; import { HeaderPage } from '../../../../common/components/header_page'; -import { RuleFeatureTour } from '../../components/rules_table/feature_tour/rules_feature_tour'; const RulesPageComponent: React.FC = () => { const [isImportModalVisible, showImportModal, hideImportModal] = useBoolState(); @@ -173,7 +172,6 @@ const RulesPageComponent: React.FC = () => { kibanaServices={kibanaServices} categories={[DEFAULT_APP_CATEGORIES.security.id]} /> - From 5fb1e127ad0c25b198a97753cbf53f8d714cb2ef Mon Sep 17 00:00:00 2001 From: "Eyo O. Eyo" <7893459+eokoneyo@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:57:22 +0200 Subject: [PATCH 23/69] [CodeQL] resolve issue with incomplete string escaping (#196678) ## Summary Relates to https://github.com/elastic/kibana-team/issues/1102 Particularly addresses issues with incomplete string escaping. Co-authored-by: Elastic Machine --- .../kbn-monaco/scripts/utils/create_autocomplete_definitions.js | 2 +- packages/kbn-monaco/src/painless/worker/painless_worker.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kbn-monaco/scripts/utils/create_autocomplete_definitions.js b/packages/kbn-monaco/scripts/utils/create_autocomplete_definitions.js index d6eeac2e20f61..3750b8697f493 100644 --- a/packages/kbn-monaco/scripts/utils/create_autocomplete_definitions.js +++ b/packages/kbn-monaco/scripts/utils/create_autocomplete_definitions.js @@ -36,7 +36,7 @@ const getDisplayName = (name, imported) => { displayName = name.split('.').pop() || name; } - return displayName.replace('$', '.'); + return displayName.replace(/^\$/g, '.'); }; /** diff --git a/packages/kbn-monaco/src/painless/worker/painless_worker.ts b/packages/kbn-monaco/src/painless/worker/painless_worker.ts index 332199f45b8ee..80489ccdbc589 100644 --- a/packages/kbn-monaco/src/painless/worker/painless_worker.ts +++ b/packages/kbn-monaco/src/painless/worker/painless_worker.ts @@ -44,7 +44,7 @@ export class PainlessWorker implements BaseWorkerDefinition { fields?: PainlessAutocompleteField[] ): PainlessCompletionResult { // Array of the active line words, e.g., [boolean, isTrue, =, true] - const words = currentLineChars.replace('\t', '').split(' '); + const words = currentLineChars.replace(/\t/g, '').split(/\s/); const autocompleteSuggestions: PainlessCompletionResult = getAutocompleteSuggestions( context, From 9c5946976d9b7a8eb0520877c4bfcc80cba43347 Mon Sep 17 00:00:00 2001 From: Tre Date: Mon, 21 Oct 2024 16:01:56 +0100 Subject: [PATCH 24/69] [FIX ON MKI] `x-pack/.../telemetry_config.ts` (#197036) ## Summary See details: https://github.com/elastic/kibana/issues/197009 --- .../core-apps-server-internal/src/core_app.ts | 1 + .../common/telemetry/telemetry_config.ts | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/core/apps/core-apps-server-internal/src/core_app.ts b/packages/core/apps/core-apps-server-internal/src/core_app.ts index 10552864fcc7e..51b94e90df570 100644 --- a/packages/core/apps/core-apps-server-internal/src/core_app.ts +++ b/packages/core/apps/core-apps-server-internal/src/core_app.ts @@ -248,6 +248,7 @@ export class CoreAppsService { if (latestOverrideVersion !== persistedOverrides.version) { this.configService.setDynamicConfigOverrides(persistedOverrides.attributes); latestOverrideVersion = persistedOverrides.version; + this.logger.info('Succeeded in applying persisted dynamic config overrides'); } } catch (err) { // Potential failures: diff --git a/x-pack/test_serverless/api_integration/test_suites/common/telemetry/telemetry_config.ts b/x-pack/test_serverless/api_integration/test_suites/common/telemetry/telemetry_config.ts index b6ca1666181f2..33726b6af0f64 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/telemetry/telemetry_config.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/telemetry/telemetry_config.ts @@ -5,7 +5,8 @@ * 2.0. */ -import { expect } from 'expect'; +import expect from '@kbn/expect'; +import { expect as externalExpect } from 'expect'; import { SupertestWithRoleScopeType } from '@kbn/test-suites-xpack/api_integration/deployment_agnostic/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; @@ -13,6 +14,8 @@ export default function telemetryConfigTest({ getService }: FtrProviderContext) const roleScopedSupertest = getService('roleScopedSupertest'); let supertestAdminWithApiKey: SupertestWithRoleScopeType; let supertestAdminWithCookieCredentials: SupertestWithRoleScopeType; + const retry = getService('retry'); + const retryTimeout = 20 * 1000; describe('/api/telemetry/v2/config API Telemetry config', function () { before(async () => { @@ -42,7 +45,7 @@ export default function telemetryConfigTest({ getService }: FtrProviderContext) it('GET should get the default config', async () => { const { body } = await supertestAdminWithApiKey.get('/api/telemetry/v2/config').expect(200); - expect(body).toMatchObject(baseConfig); + externalExpect(body).toMatchObject(baseConfig); }); it('GET should get updated labels after dynamically updating them', async () => { @@ -71,7 +74,13 @@ export default function telemetryConfigTest({ getService }: FtrProviderContext) .send({ 'telemetry.labels.journeyName': null }) .expect(200, { ok: true }); - await supertestAdminWithApiKey.get('/api/telemetry/v2/config').expect(200, initialConfig); + await retry.tryForTime(retryTimeout, async function retryTelemetryConfigGetRequest() { + const { body } = await supertestAdminWithApiKey.get('/api/telemetry/v2/config').expect(200); + expect(body).to.eql( + initialConfig, + `Expected the response body to match the intitial config, but got: [${body}]` + ); + }); }); }); } From 7fb2b0ff11b9fa6c4fff6f66173a6665c6715078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loix?= Date: Mon, 21 Oct 2024 16:17:54 +0100 Subject: [PATCH 25/69] [Spaces] Fix flackiness in welcome tour test (#196909) --- .../apps/spaces/solution_view_flag_enabled/solution_tour.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/solution_tour.ts b/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/solution_tour.ts index 852a2a83031cd..7b058aa36ba92 100644 --- a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/solution_tour.ts +++ b/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/solution_tour.ts @@ -29,13 +29,15 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await es .delete( - { id: `config-global:${version}`, index: '.kibana', refresh: true }, + { id: `config-global:${version}`, index: '.kibana', refresh: 'wait_for' }, { headers: { 'kbn-xsrf': 'spaces' } } ) .catch((error) => { if (error.statusCode === 404) return; // ignore 404 errors throw error; }); + + await PageObjects.common.sleep(500); // just to be on the safe side }; before(async () => { From ff44bf2770bbf00479ea3a6169c892a9a2cee534 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Mon, 21 Oct 2024 17:31:29 +0200 Subject: [PATCH 26/69] [SLOs] Update get SLOs flaky test (#190443) ## Summary fixes https://github.com/elastic/kibana/issues/177806 Update get SLOs flaky test !! --- .../test/api_integration/apis/slos/get_slo.ts | 147 ++++++++---------- .../test/api_integration/apis/slos/index.ts | 2 +- .../test/functional/services/transform/api.ts | 9 ++ 3 files changed, 77 insertions(+), 81 deletions(-) diff --git a/x-pack/test/api_integration/apis/slos/get_slo.ts b/x-pack/test/api_integration/apis/slos/get_slo.ts index 274c2535a4630..815409853c7d6 100644 --- a/x-pack/test/api_integration/apis/slos/get_slo.ts +++ b/x-pack/test/api_integration/apis/slos/get_slo.ts @@ -13,9 +13,24 @@ import { loadTestData } from './helper/load_test_data'; import { SloEsClient } from './helper/es'; import { sloData } from './fixtures/create_slo'; +export const expectSummary = (summary: Record) => { + expect(summary).toEqual({ + sliValue: expect.any(Number), + errorBudget: { + initial: expect.any(Number), + consumed: expect.any(Number), + remaining: expect.any(Number), + isEstimated: expect.any(Boolean), + }, + status: expect.any(String), + fiveMinuteBurnRate: expect.any(Number), + oneDayBurnRate: expect.any(Number), + oneHourBurnRate: expect.any(Number), + }); +}; + export default function ({ getService }: FtrProviderContext) { - // FLAKY: https://github.com/elastic/kibana/issues/177806 - describe.skip('Get SLOs', function () { + describe('GetSLOs', function () { this.tags('skipCloud'); const supertestAPI = getService('supertest'); @@ -23,8 +38,16 @@ export default function ({ getService }: FtrProviderContext) { const logger = getService('log'); const retry = getService('retry'); const slo = getService('slo'); + // const transform = getService('transform'); const sloEsClient = new SloEsClient(esClient); + // const onFailure = async () => { + // const allTransforms = await transform.api.getTransformList(); + // for (const tf of allTransforms.transforms) { + // await transform.api.scheduleTransform(tf.id); + // } + // }; + let createSLOInput: CreateSLOInput; const createSLO = async (requestOverrides?: Record) => { @@ -97,24 +120,13 @@ export default function ({ getService }: FtrProviderContext) { version: 2, instanceId: '*', meta: {}, - summary: { - sliValue: 0.5, - errorBudget: { - initial: 0.01, - consumed: 50, - remaining: -49, - isEstimated: false, - }, - fiveMinuteBurnRate: 40, - oneDayBurnRate: 50, - oneHourBurnRate: 50, - status: 'VIOLATED', - }, + summary: expect.any(Object), }); + expectSummary(getResponse.body.summary); }); }); - it('gets slo by id and calculates SLI - occurences calendarAligned', async () => { + it('gets slo by id and calculates SLI - occurrences calendarAligned', async () => { const response = await createSLO({ groupBy: '*', timeWindow: { @@ -160,20 +172,9 @@ export default function ({ getService }: FtrProviderContext) { version: 2, instanceId: '*', meta: {}, - summary: { - sliValue: 0.5, - errorBudget: { - initial: 0.01, - consumed: 50, - remaining: -49, - isEstimated: true, - }, - fiveMinuteBurnRate: 40, - oneDayBurnRate: 50, - oneHourBurnRate: 50, - status: 'VIOLATED', - }, + summary: expect.any(Object), }); + expectSummary(getResponse.body.summary); }); }); @@ -233,17 +234,9 @@ export default function ({ getService }: FtrProviderContext) { version: 2, instanceId: '*', meta: {}, - summary: expect.objectContaining({ - sliValue: 0.5, - errorBudget: { - initial: 0.01, - consumed: 50, - remaining: -49, - isEstimated: false, - }, - status: 'VIOLATED', - }), + summary: expect.any(Object), }); + expectSummary(getResponse.body.summary); }); }); @@ -302,20 +295,9 @@ export default function ({ getService }: FtrProviderContext) { version: 2, instanceId: '*', meta: {}, - summary: { - sliValue: 0, - errorBudget: { - initial: 0.01, - consumed: 0.198413, - remaining: 0.801587, - isEstimated: false, - }, - fiveMinuteBurnRate: 40, - oneDayBurnRate: 50, - oneHourBurnRate: 50, - status: 'DEGRADING', - }, + summary: expect.any(Object), }); + expectSummary(getResponse.body.summary); }); }); @@ -366,34 +348,39 @@ export default function ({ getService }: FtrProviderContext) { }); }); - it('gets slos instances', async () => { - const createResponse = await createSLO(); - const id = createResponse.body.id; - - await retry.tryForTime(400 * 1000, async () => { - const response = await supertestAPI - .get(`/api/observability/slos`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); - - expect(response.body.results.length).toEqual(3); - - response.body.results.forEach((result: Record, i: number) => { - expect(result.groupings).toEqual(expect.objectContaining({ tags: `${i + 1}` })); - }); - - const instanceResponse = await supertestAPI - .get(`/internal/observability/slos/${id}/_instances`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); - - // expect 3 instances to be created - expect(instanceResponse.body.groupBy).toEqual('tags'); - expect(instanceResponse.body.instances.sort()).toEqual(['tags:1', 'tags:2', 'tags:3']); - }); - }); + // not possible for now to reliably fix this + // it.skip('gets slos instances', async () => { + // const createResponse = await createSLO(); + // const id = createResponse.body.id; + // + // await retry.tryForTime( + // 400 * 1000, + // async () => { + // const response = await supertestAPI + // .get(`/api/observability/slos`) + // .set('kbn-xsrf', 'true') + // .send() + // .expect(200); + // const res = response.body.results; + // expect(res.length).toEqual(3); + // const groups = res.map((r: any) => r.groupings.tags); + // + // expect(groups.sort()).toEqual(['1', '2', '3']); + // + // const instanceResponse = await supertestAPI + // .get(`/internal/observability/slos/${id}/_instances`) + // .set('kbn-xsrf', 'true') + // .send() + // .expect(200); + // + // // expect 3 instances to be created + // expect(instanceResponse.body.groupBy).toEqual('tags'); + // expect(instanceResponse.body.instances.sort()).toEqual(['1', '2', '3']); + // }, + // onFailure, + // 10 * 1000 + // ); + // }); it('gets slo definitions', async () => { const createResponse = await createSLO(); diff --git a/x-pack/test/api_integration/apis/slos/index.ts b/x-pack/test/api_integration/apis/slos/index.ts index c80a0c58e5ecc..3401b195ccee5 100644 --- a/x-pack/test/api_integration/apis/slos/index.ts +++ b/x-pack/test/api_integration/apis/slos/index.ts @@ -9,9 +9,9 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('SLO API Tests', () => { + loadTestFile(require.resolve('./get_slo')); loadTestFile(require.resolve('./create_slo')); loadTestFile(require.resolve('./delete_slo')); - loadTestFile(require.resolve('./get_slo')); loadTestFile(require.resolve('./update_slo')); loadTestFile(require.resolve('./reset_slo')); loadTestFile(require.resolve('./fetch_historical_summary')); diff --git a/x-pack/test/functional/services/transform/api.ts b/x-pack/test/functional/services/transform/api.ts index 89eb65df40ec0..66047a651a891 100644 --- a/x-pack/test/functional/services/transform/api.ts +++ b/x-pack/test/functional/services/transform/api.ts @@ -285,6 +285,15 @@ export function TransformAPIProvider({ getService }: FtrProviderContext) { } }, + async scheduleTransform(transformId: string, assertSuccess = true) { + log.debug(`Scheduling now transform '${transformId}' ...`); + const { body, status } = await esSupertest.post(`/_transform/${transformId}/_schedule_now`); + + if (assertSuccess) { + this.assertResponseStatusCode(200, status, body); + } + }, + async stopTransform(transformId: string) { log.debug(`Stopping transform '${transformId}' ...`); const { body, status } = await esSupertest.post(`/_transform/${transformId}/_stop`); From 46eda4c48922569954cdec2f7ac3facd60ab620c Mon Sep 17 00:00:00 2001 From: Marta Bondyra <4283304+mbondyra@users.noreply.github.com> Date: Mon, 21 Oct 2024 18:00:00 +0200 Subject: [PATCH 27/69] [Visualizations] Show TSVB and Agg based as "legacy" when users create visualizations from the library (#195966) ## Summary Fixes https://github.com/elastic/kibana/issues/191489 Redesign of "Create Visualization" Modal To encourage users to adopt Lens and reduce reliance on Agg-based and TSVB visualizations, we've redesigned the "Create Visualization" modal. The new layout now features two distinct tabs: one highlighting recommended visualizations, and another clearly marking legacy options. This separation ensures users are well-informed about which visualization types are preferred moving forward. Screenshot 2024-10-15 at 13 15 49 ![image](https://github.com/user-attachments/assets/86c399fc-e737-453f-84e3-938d85aa22d3) --- .../vis_type_markdown/public/markdown_vis.ts | 4 +- .../timeseries/public/metrics_type.ts | 2 +- .../vis_types/vega/public/vega_type.ts | 5 +- .../agg_based_selection.test.tsx | 10 +- .../agg_based_selection.tsx | 4 +- .../visualizations/public/wizard/dialog.scss | 4 +- .../group_selection/group_selection.test.tsx | 192 +++------- .../group_selection/group_selection.tsx | 337 +++++++++--------- .../public/wizard/new_vis_modal.test.tsx | 183 +++------- .../public/wizard/new_vis_modal.tsx | 26 +- .../dashboard/group1/edit_visualizations.js | 2 +- .../apps/dashboard/group5/legacy_urls.ts | 9 +- .../markdown/_markdown_vis.ts | 13 +- .../apps/visualize/group1/_chart_types.ts | 14 +- .../visualize/group3/_visualize_listing.ts | 15 +- .../functional/page_objects/visualize_page.ts | 19 +- x-pack/plugins/lens/public/vis_type_alias.ts | 5 +- .../translations/translations/fr-FR.json | 15 - .../translations/translations/ja-JP.json | 15 - .../translations/translations/zh-CN.json | 15 - .../functional/tests/visualize_integration.ts | 13 +- 21 files changed, 346 insertions(+), 556 deletions(-) diff --git a/src/plugins/vis_type_markdown/public/markdown_vis.ts b/src/plugins/vis_type_markdown/public/markdown_vis.ts index 095dc4dee6b89..10bcf8457cab2 100644 --- a/src/plugins/vis_type_markdown/public/markdown_vis.ts +++ b/src/plugins/vis_type_markdown/public/markdown_vis.ts @@ -23,10 +23,10 @@ export const markdownVisDefinition: VisTypeDefinition = { icon: 'visText', group: VisGroups.TOOLS, titleInWizard: i18n.translate('visTypeMarkdown.markdownTitleInWizard', { - defaultMessage: 'Text', + defaultMessage: 'Markdown text', }), description: i18n.translate('visTypeMarkdown.markdownDescription', { - defaultMessage: 'Add text and images to your dashboard.', + defaultMessage: 'Add custom text or images to dashboards.', }), order: 30, toExpressionAst, diff --git a/src/plugins/vis_types/timeseries/public/metrics_type.ts b/src/plugins/vis_types/timeseries/public/metrics_type.ts index 0790694a24473..eec28bb6cf47c 100644 --- a/src/plugins/vis_types/timeseries/public/metrics_type.ts +++ b/src/plugins/vis_types/timeseries/public/metrics_type.ts @@ -102,7 +102,7 @@ export const metricsVisDefinition: VisTypeDefinition< name: VIS_TYPE, title: i18n.translate('visTypeTimeseries.kbnVisTypes.metricsTitle', { defaultMessage: 'TSVB' }), description: i18n.translate('visTypeTimeseries.kbnVisTypes.metricsDescription', { - defaultMessage: 'Perform advanced analysis of your time series data.', + defaultMessage: 'Create visualizations using time series data.', }), icon: 'visVisualBuilder', group: VisGroups.LEGACY, diff --git a/src/plugins/vis_types/vega/public/vega_type.ts b/src/plugins/vis_types/vega/public/vega_type.ts index a59358d024c75..744125fe5be2c 100644 --- a/src/plugins/vis_types/vega/public/vega_type.ts +++ b/src/plugins/vis_types/vega/public/vega_type.ts @@ -32,12 +32,9 @@ export const createVegaTypeDefinition = (): VisTypeDefinition => { title: 'Vega', getInfoMessage, description: i18n.translate('visTypeVega.type.vegaDescription', { - defaultMessage: 'Use Vega to create new types of visualizations.', + defaultMessage: 'Use the Vega syntax to create new types of visualizations.', description: 'Vega and Vega-Lite are product names and should not be translated', }), - note: i18n.translate('visTypeVega.type.vegaNote', { - defaultMessage: 'Requires knowledge of Vega syntax.', - }), icon: 'visVega', group: VisGroups.PROMOTED, titleInWizard: i18n.translate('visTypeVega.type.vegaTitleInWizard', { diff --git a/src/plugins/visualizations/public/wizard/agg_based_selection/agg_based_selection.test.tsx b/src/plugins/visualizations/public/wizard/agg_based_selection/agg_based_selection.test.tsx index 286ceecaca567..16da39c059bba 100644 --- a/src/plugins/visualizations/public/wizard/agg_based_selection/agg_based_selection.test.tsx +++ b/src/plugins/visualizations/public/wizard/agg_based_selection/agg_based_selection.test.tsx @@ -70,18 +70,18 @@ describe('AggBasedSelection', () => { jest.clearAllMocks(); }); - it('should call the toggleGroups if the user clicks the goBack link', () => { - const toggleGroups = jest.fn(); + it('should call the showMainDialog if the user clicks the goBack link', () => { + const showMainDialog = jest.fn(); const wrapper = mountWithIntl( ); const aggBasedGroupCard = wrapper.find('[data-test-subj="goBackLink"]').last(); aggBasedGroupCard.simulate('click'); - expect(toggleGroups).toHaveBeenCalled(); + expect(showMainDialog).toHaveBeenCalled(); }); describe('filter for visualization types', () => { @@ -89,7 +89,7 @@ describe('AggBasedSelection', () => { const wrapper = mountWithIntl( ); diff --git a/src/plugins/visualizations/public/wizard/agg_based_selection/agg_based_selection.tsx b/src/plugins/visualizations/public/wizard/agg_based_selection/agg_based_selection.tsx index f4a2768372125..1cb038e338f0e 100644 --- a/src/plugins/visualizations/public/wizard/agg_based_selection/agg_based_selection.tsx +++ b/src/plugins/visualizations/public/wizard/agg_based_selection/agg_based_selection.tsx @@ -39,7 +39,7 @@ interface AggBasedSelectionProps { openedAsRoot?: boolean; onVisTypeSelected: (visType: BaseVisType) => void; visTypesRegistry: TypesStart; - toggleGroups: (flag: boolean) => void; + showMainDialog: (flag: boolean) => void; } interface AggBasedSelectionState { query: string; @@ -67,7 +67,7 @@ class AggBasedSelection extends React.Component {this.props.openedAsRoot ? null : ( - this.props.toggleGroups(true)} /> + this.props.showMainDialog(true)} /> )} { const defaultVisTypeParams = { @@ -99,35 +101,34 @@ describe('GroupSelection', () => { jest.clearAllMocks(); }); - it('should render the header title', () => { - const wrapper = mountWithIntl( - - ); - expect(wrapper.find('[data-test-subj="groupModalHeader"]').at(0).text()).toBe( - 'New visualization' + const renderGroupSelectionComponent = (overrideProps?: Partial) => { + return render( + + + ); + }; + + it('should render the header title', () => { + renderGroupSelectionComponent(); + expect(screen.getByTestId('groupModalHeader')).toHaveTextContent('Create visualization'); }); - it('should not render the aggBased group card if no aggBased visualization is registered', () => { - const wrapper = mountWithIntl( - - ); - expect(wrapper.find('[data-test-subj="visGroup-aggbased"]').exists()).toBe(false); + it('should not render tabs if no legacy, tools or tsvb visualizations are registered', async () => { + renderGroupSelectionComponent(); + expect(screen.queryByRole('tab', { name: /legacy/i })).toBeNull(); + expect(screen.queryByRole('tab', { name: /recommended/i })).toBeNull(); }); - it('should render the aggBased group card if an aggBased group vis is registered', () => { + it('should render tabs and the aggBased group card if an aggBased group vis is registered', async () => { const aggBasedVisType = { name: 'visWithSearch', title: 'Vis with search', @@ -135,53 +136,18 @@ describe('GroupSelection', () => { stage: 'production', ...defaultVisTypeParams, }; - const wrapper = mountWithIntl( - - ); - expect(wrapper.find('[data-test-subj="visGroup-aggbased"]').exists()).toBe(true); - }); - - it('should not render the tools group card if no tools visualization is registered', () => { - const wrapper = mountWithIntl( - - ); - expect(wrapper.find('[data-test-subj="visGroup-tools"]').exists()).toBe(false); - }); + renderGroupSelectionComponent({ + visTypesRegistry: visTypesRegistry([..._visTypes, aggBasedVisType] as BaseVisType[]), + tab: 'legacy', + }); - it('should render the tools group card if a tools group vis is registered', () => { - const toolsVisType = { - name: 'vis3', - title: 'Vis3', - stage: 'production', - group: VisGroups.TOOLS, - ...defaultVisTypeParams, - }; - const wrapper = mountWithIntl( - - ); - expect(wrapper.find('[data-test-subj="visGroup-tools"]').exists()).toBe(true); + expect(screen.queryByRole('tab', { name: /legacy/i })).toBeInTheDocument(); + expect(screen.queryByRole('tab', { name: /recommended/i })).toBeInTheDocument(); + expect(screen.getByTestId('visType-aggbased')).toHaveTextContent('Aggregation-based'); }); - it('should call the toggleGroups if the aggBased group card is clicked', () => { - const toggleGroups = jest.fn(); + it('should call the showMainDialog if the aggBased group card is clicked', async () => { + const showMainDialog = jest.fn(); const aggBasedVisType = { name: 'visWithSearch', title: 'Vis with search', @@ -189,82 +155,26 @@ describe('GroupSelection', () => { stage: 'production', ...defaultVisTypeParams, }; - const wrapper = mountWithIntl( - - ); - const aggBasedGroupCard = wrapper.find('[data-test-subj="visGroupAggBasedExploreLink"]').last(); - aggBasedGroupCard.simulate('click'); - expect(toggleGroups).toHaveBeenCalled(); + renderGroupSelectionComponent({ + showMainDialog, + visTypesRegistry: visTypesRegistry([..._visTypes, aggBasedVisType] as BaseVisType[]), + tab: 'legacy', + }); + + await userEvent.click(screen.getByRole('button', { name: /Aggregation-based/i })); + expect(showMainDialog).toHaveBeenCalledWith(false); }); - it('should sort promoted visualizations first', () => { - const wrapper = mountWithIntl( - - ); + it('should only show promoted visualizations in recommended tab', () => { + renderGroupSelectionComponent(); - const cards = [ - ...new Set( - wrapper.find('[data-test-subj^="visType-"]').map((card) => card.prop('data-test-subj')) - ), - ]; + const cards = screen.getAllByRole('button').map((el) => el.textContent); expect(cards).toEqual([ - 'visType-visAliasWithPromotion', - 'visType-vis1', - 'visType-vis2', - 'visType-visWithAliasUrl', + 'Vis alias with promotion', + 'Vis Type 1', + 'Vis Type 2', + 'Vis with alias Url', ]); }); - - it('should not show tools experimental visualizations if showExperimentalis false', () => { - const expVis = { - name: 'visExp', - title: 'Experimental Vis', - group: VisGroups.TOOLS, - stage: 'experimental', - ...defaultVisTypeParams, - }; - const wrapper = mountWithIntl( - - ); - expect(wrapper.find('[data-test-subj="visType-visExp"]').exists()).toBe(false); - }); - - it('should show tools experimental visualizations if showExperimental is true', () => { - const expVis = { - name: 'visExp', - title: 'Experimental Vis', - group: VisGroups.TOOLS, - stage: 'experimental', - ...defaultVisTypeParams, - }; - const wrapper = mountWithIntl( - - ); - expect(wrapper.find('[data-test-subj="visType-visExp"]').exists()).toBe(true); - }); }); diff --git a/src/plugins/visualizations/public/wizard/group_selection/group_selection.tsx b/src/plugins/visualizations/public/wizard/group_selection/group_selection.tsx index 11f85c0c685a3..b730798124d5a 100644 --- a/src/plugins/visualizations/public/wizard/group_selection/group_selection.tsx +++ b/src/plugins/visualizations/public/wizard/group_selection/group_selection.tsx @@ -8,7 +8,7 @@ */ import { FormattedMessage } from '@kbn/i18n-react'; -import React, { useCallback, useMemo } from 'react'; +import React, { ReactNode, useCallback, useMemo } from 'react'; import { orderBy } from 'lodash'; import { EuiFlexGroup, @@ -20,14 +20,13 @@ import { EuiModalBody, EuiModalHeaderTitle, EuiLink, - EuiText, EuiSpacer, - EuiBetaBadge, - EuiTitle, EuiDescriptionListTitle, EuiDescriptionListDescription, EuiDescriptionList, - EuiBadge, + EuiTabs, + EuiTab, + EuiIconTip, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { DocLinksStart } from '@kbn/core/public'; @@ -36,162 +35,210 @@ import { VisGroups } from '../../vis_types/vis_groups_enum'; import type { VisTypeAlias } from '../../vis_types/vis_type_alias_registry'; import './group_selection.scss'; -interface GroupSelectionProps { +export interface GroupSelectionProps { onVisTypeSelected: (visType: BaseVisType | VisTypeAlias) => void; visTypesRegistry: TypesStart; docLinks: DocLinksStart; - toggleGroups: (flag: boolean) => void; - showExperimental: boolean; + showMainDialog: (flag: boolean) => void; + tab: 'recommended' | 'legacy'; + setTab: (tab: 'recommended' | 'legacy') => void; } interface VisCardProps { onVisTypeSelected: (visType: BaseVisType | VisTypeAlias) => void; visType: BaseVisType | VisTypeAlias; - showExperimental?: boolean | undefined; + shouldStretch?: boolean; } -function GroupSelection(props: GroupSelectionProps) { +const tabs: Array<{ id: 'recommended' | 'legacy'; label: ReactNode; dataTestSubj: string }> = [ + { + id: 'recommended', + label: i18n.translate('visualizations.newVisWizard.recommendedTab', { + defaultMessage: 'Recommended', + }), + dataTestSubj: 'groupModalRecommendedTab', + }, + { + id: 'legacy', + dataTestSubj: 'groupModalLegacyTab', + label: ( + + + {i18n.translate('visualizations.newVisWizard.legacyTab', { + defaultMessage: 'Legacy', + })} + + + + + + + ), + }, +]; + +const getVisTypesFromGroup = ( + visTypesRegistry: TypesStart, + group: VisGroups +): Array => { + return visTypesRegistry.getByGroup(group).filter(({ disableCreate }) => !disableCreate); +}; + +function GroupSelection({ + tab = 'recommended', + setTab, + visTypesRegistry, + ...props +}: GroupSelectionProps) { const visualizeGuideLink = props.docLinks.links.dashboard.guide; const promotedVisGroups = useMemo( () => orderBy( [ - ...props.visTypesRegistry.getAliases(), - ...props.visTypesRegistry.getByGroup(VisGroups.PROMOTED), - // Include so TSVB still gets displayed - ...props.visTypesRegistry.getByGroup(VisGroups.LEGACY), + ...visTypesRegistry.getAliases(), + ...visTypesRegistry.getByGroup(VisGroups.PROMOTED), ].filter((visDefinition) => { return !visDefinition.disableCreate; }), ['promotion', 'title'], ['asc', 'asc'] ), - [props.visTypesRegistry] + [visTypesRegistry] ); + const aggBasedTypes = getVisTypesFromGroup(visTypesRegistry, VisGroups.AGGBASED); + const legacyTypes = getVisTypesFromGroup(visTypesRegistry, VisGroups.LEGACY); + + const shouldDisplayLegacyTab = legacyTypes.length + aggBasedTypes.length; + + const [tsvbProps] = legacyTypes.map((visType) => ({ + visType: { + ...visType, + icon: visType.name === 'metrics' ? 'visualizeApp' : (visType.icon as string), + }, + onVisTypeSelected: props.onVisTypeSelected, + key: visType.name, + })); + return ( <> + {shouldDisplayLegacyTab && ( +
+ + {tabs.map((t) => ( + setTab(t.id)} + key={t.id} + > + {t.label} + + ))} + +
+ )} +
- - {promotedVisGroups.map((visType) => ( - - ))} - - -
-
- - - {props.visTypesRegistry.getByGroup(VisGroups.AGGBASED).filter((visDefinition) => { - return !visDefinition.disableCreate; - }).length > 0 && ( - - props.toggleGroups(false)} - title={ - - {i18n.translate('visualizations.newVisWizard.aggBasedGroupTitle', { - defaultMessage: 'Aggregation based', - })} - - } - data-test-subj="visGroup-aggbased" - description={i18n.translate( - 'visualizations.newVisWizard.aggBasedGroupDescription', - { - defaultMessage: - 'Use our classic visualize library to create charts based on aggregations.', - } - )} - icon={} - > - props.toggleGroups(false)} - > - - {i18n.translate('visualizations.newVisWizard.exploreOptionLinkText', { - defaultMessage: 'Explore options', - })}{' '} - - - - - - )} - {props.visTypesRegistry.getByGroup(VisGroups.TOOLS).length > 0 && ( - - - - - {i18n.translate('visualizations.newVisWizard.toolsGroupTitle', { - defaultMessage: 'Tools', - })} - - - -
- {props.visTypesRegistry.getByGroup(VisGroups.TOOLS).map((visType) => ( - - ))} -
-
- )} -
- - - - - - - - + {promotedVisGroups.map((visType) => ( + - - - + ))} + + ) : ( + + {tsvbProps ? : null} + { + { + props.showMainDialog(false); + }} + /> + } + + )} + +
+ +
); } -const VisGroup = ({ visType, onVisTypeSelected }: VisCardProps) => { +const ModalFooter = ({ visualizeGuideLink }: { visualizeGuideLink: string }) => { + return ( +
+ + + + + + + + + + + +
+ ); +}; + +const VisGroup = ({ visType, onVisTypeSelected, shouldStretch = false }: VisCardProps) => { const onClick = useCallback(() => { onVisTypeSelected(visType); }, [onVisTypeSelected, visType]); return ( - + { } layout="horizontal" - icon={} + icon={} /> ); }; -const ToolsGroup = ({ visType, onVisTypeSelected, showExperimental }: VisCardProps) => { - const onClick = useCallback(() => { - onVisTypeSelected(visType); - }, [onVisTypeSelected, visType]); - // hide both the hidden visualizations and, if lab mode is not enabled, the experimental visualizations - // TODO: Remove the showExperimental logic as part of https://github.com/elastic/kibana/issues/152833 - if (visType.disableCreate || (!showExperimental && visType.stage === 'experimental')) { - return null; - } - return ( - - - - - - - - - {'titleInWizard' in visType && visType.titleInWizard - ? visType.titleInWizard - : visType.title} - - - {visType.stage === 'experimental' && !visType.isDeprecated ? ( - - - - ) : ( - visType.isDeprecated && ( - - - - - - ) - )} - - - {visType.description} - - - - ); -}; - export { GroupSelection }; diff --git a/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx b/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx index 0451d606060da..adf36745b991b 100644 --- a/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx +++ b/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx @@ -8,13 +8,15 @@ */ import React from 'react'; -import { mountWithIntl } from '@kbn/test-jest-helpers'; import { TypesStart, VisGroups, BaseVisType } from '../vis_types'; -import NewVisModal from './new_vis_modal'; +import NewVisModal, { TypeSelectionProps } from './new_vis_modal'; import { ApplicationStart, DocLinksStart } from '@kbn/core/public'; import { embeddablePluginMock } from '@kbn/embeddable-plugin/public/mocks'; import { contentManagementMock } from '@kbn/content-management-plugin/public/mocks'; import { VisParams } from '../../common'; +import { render, screen } from '@testing-library/react'; +import { I18nProvider } from '@kbn/i18n-react'; +import userEvent from '@testing-library/user-event'; describe('NewVisModal', () => { const defaultVisTypeParams = { @@ -96,58 +98,9 @@ describe('NewVisModal', () => { jest.clearAllMocks(); }); - it('should show the aggbased group but not the visualization assigned to this group', () => { - const wrapper = mountWithIntl( - null} - visTypesRegistry={visTypes} - addBasePath={addBasePath} - uiSettings={uiSettings} - application={{} as ApplicationStart} - docLinks={docLinks as DocLinksStart} - contentClient={contentManagement.client} - /> - ); - expect(wrapper.find('[data-test-subj="visGroup-aggbased"]').exists()).toBe(true); - expect(wrapper.find('[data-test-subj="visType-visWithSearch"]').exists()).toBe(false); - }); - - it('should show the tools group', () => { - const wrapper = mountWithIntl( - null} - visTypesRegistry={visTypes} - addBasePath={addBasePath} - uiSettings={uiSettings} - application={{} as ApplicationStart} - docLinks={docLinks as DocLinksStart} - contentClient={contentManagement.client} - /> - ); - expect(wrapper.find('[data-test-subj="visGroup-tools"]').exists()).toBe(true); - }); - - it('should display the visualizations of the other group', () => { - const wrapper = mountWithIntl( - null} - visTypesRegistry={visTypes} - addBasePath={addBasePath} - uiSettings={uiSettings} - application={{} as ApplicationStart} - docLinks={docLinks as DocLinksStart} - contentClient={contentManagement.client} - /> - ); - expect(wrapper.find('[data-test-subj="visType-vis2"]').exists()).toBe(true); - }); - - describe('open editor', () => { - it('should open the editor for visualizations without search', () => { - const wrapper = mountWithIntl( + const renderNewVisModal = (propsOverrides?: Partial) => { + return render( + null} @@ -157,55 +110,55 @@ describe('NewVisModal', () => { application={{} as ApplicationStart} docLinks={docLinks as DocLinksStart} contentClient={contentManagement.client} + {...propsOverrides} /> - ); - const visCard = wrapper.find('[data-test-subj="visType-vis"]').last(); - visCard.simulate('click'); + + ); + }; + + it('should show the aggbased group but not the visualization assigned to this group', async () => { + renderNewVisModal(); + expect(screen.queryByText('Aggregation-based')).not.toBeInTheDocument(); + expect(screen.queryByText('Vis with search')).not.toBeInTheDocument(); + await userEvent.click(screen.getByRole('tab', { name: /Legacy/i })); + expect(screen.queryByText('Aggregation-based')).toBeInTheDocument(); + expect(screen.queryByText('Vis with search')).not.toBeInTheDocument(); + }); + + it('should display the visualizations of the other group', () => { + renderNewVisModal(); + expect(screen.queryByText('Vis Type 2')).toBeInTheDocument(); + }); + + describe('open editor', () => { + it('should open the editor for visualizations without search', async () => { + renderNewVisModal(); + await userEvent.click(screen.getByText('Vis Type 1')); expect(window.location.assign).toBeCalledWith('testbasepath/app/visualize#/create?type=vis'); }); - it('passes through editor params to the editor URL', () => { - const wrapper = mountWithIntl( - null} - visTypesRegistry={visTypes} - editorParams={['foo=true', 'bar=42']} - addBasePath={addBasePath} - uiSettings={uiSettings} - application={{} as ApplicationStart} - docLinks={docLinks as DocLinksStart} - contentClient={contentManagement.client} - /> - ); - const visCard = wrapper.find('[data-test-subj="visType-vis"]').last(); - visCard.simulate('click'); + it('passes through editor params to the editor URL', async () => { + renderNewVisModal({ + editorParams: ['foo=true', 'bar=42'], + }); + await userEvent.click(screen.getByText('Vis Type 1')); expect(window.location.assign).toBeCalledWith( 'testbasepath/app/visualize#/create?type=vis&foo=true&bar=42' ); }); - it('closes and redirects properly if visualization with alias.path and originatingApp in props', () => { + it('closes and redirects properly if visualization with alias.path and originatingApp in props', async () => { const onClose = jest.fn(); const navigateToApp = jest.fn(); const stateTransfer = embeddablePluginMock.createStartContract().getStateTransfer(); - const wrapper = mountWithIntl( - - ); - const visCard = wrapper.find('[data-test-subj="visType-visWithAliasUrl"]').last(); - visCard.simulate('click'); + renderNewVisModal({ + editorParams: ['foo=true', 'bar=42'], + onClose, + application: { navigateToApp } as unknown as ApplicationStart, + originatingApp: 'coolJestTestApp', + stateTransfer, + }); + await userEvent.click(screen.getByText('Vis with alias Url')); expect(stateTransfer.navigateToEditor).toBeCalledWith('otherApp', { path: '#/aliasUrl', state: { originatingApp: 'coolJestTestApp' }, @@ -213,48 +166,28 @@ describe('NewVisModal', () => { expect(onClose).toHaveBeenCalled(); }); - it('closes and redirects properly if visualization with aliasApp and without originatingApp in props', () => { + it('closes and redirects properly if visualization with aliasApp and without originatingApp in props', async () => { const onClose = jest.fn(); const navigateToApp = jest.fn(); - const wrapper = mountWithIntl( - - ); - const visCard = wrapper.find('[data-test-subj="visType-visWithAliasUrl"]').last(); - visCard.simulate('click'); + + renderNewVisModal({ + editorParams: ['foo=true', 'bar=42'], + onClose, + application: { navigateToApp } as unknown as ApplicationStart, + }); + await userEvent.click(screen.getByText('Vis with alias Url')); expect(navigateToApp).toBeCalledWith('otherApp', { path: '#/aliasUrl' }); expect(onClose).toHaveBeenCalled(); }); }); describe('aggBased visualizations', () => { - it('should render as expected', () => { - const wrapper = mountWithIntl( - null} - visTypesRegistry={visTypes} - addBasePath={addBasePath} - uiSettings={uiSettings} - application={{} as ApplicationStart} - docLinks={docLinks as DocLinksStart} - contentClient={contentManagement.client} - /> - ); - const aggBasedGroupCard = wrapper - .find('[data-test-subj="visGroupAggBasedExploreLink"]') - .last(); - aggBasedGroupCard.simulate('click'); - expect(wrapper.find('[data-test-subj="visType-visWithSearch"]').exists()).toBe(true); + it('should render as expected', async () => { + renderNewVisModal(); + await userEvent.click(screen.getByRole('tab', { name: /Legacy/i })); + expect(screen.queryByText('Aggregation-based')).toBeInTheDocument(); + await userEvent.click(screen.getByText('Aggregation-based')); + expect(screen.queryByText('Vis with search')).toBeInTheDocument(); }); }); }); diff --git a/src/plugins/visualizations/public/wizard/new_vis_modal.tsx b/src/plugins/visualizations/public/wizard/new_vis_modal.tsx index 2b8ea96eb4300..12fa7e1a9954d 100644 --- a/src/plugins/visualizations/public/wizard/new_vis_modal.tsx +++ b/src/plugins/visualizations/public/wizard/new_vis_modal.tsx @@ -22,7 +22,7 @@ import { AggBasedSelection } from './agg_based_selection'; import type { TypesStart, BaseVisType, VisTypeAlias } from '../vis_types'; import './dialog.scss'; -interface TypeSelectionProps { +export interface TypeSelectionProps { contentClient: ContentClient; isOpen: boolean; onClose: () => void; @@ -41,8 +41,9 @@ interface TypeSelectionProps { interface TypeSelectionState { showSearchVisModal: boolean; - showGroups: boolean; + isMainDialogShown: boolean; visType?: BaseVisType; + tab: 'recommended' | 'legacy'; } // TODO: redirect logic is specific to visualise & dashboard @@ -64,11 +65,16 @@ class NewVisModal extends React.Component { + this.setState({ tab }); + }; + public render() { if (!this.props.isOpen) { return null; @@ -82,7 +88,7 @@ class NewVisModal extends React.Component this.setState({ showGroups: flag })} + setTab={this.setTab} + tab={this.state.tab} + showMainDialog={(shouldMainBeShown: boolean) => { + this.setState({ isMainDialogShown: shouldMainBeShown }); + if (shouldMainBeShown) { + this.setTab('legacy'); + } + }} openedAsRoot={this.props.showAggsSelection && !this.props.selectedVisType} /> diff --git a/test/functional/apps/dashboard/group1/edit_visualizations.js b/test/functional/apps/dashboard/group1/edit_visualizations.js index decd7441e1d45..f065748f09b00 100644 --- a/test/functional/apps/dashboard/group1/edit_visualizations.js +++ b/test/functional/apps/dashboard/group1/edit_visualizations.js @@ -191,7 +191,7 @@ export default function ({ getService, getPageObjects }) { it('should lose its connection to the dashboard when creating new visualization', async () => { await visualize.gotoVisualizationLandingPage(); await visualize.clickNewVisualization(); - await visualize.clickMarkdownWidget(); + await visualize.clickVisualBuilder(); await visualize.notLinkedToOriginatingApp(); // return to origin should not be present in save modal diff --git a/test/functional/apps/dashboard/group5/legacy_urls.ts b/test/functional/apps/dashboard/group5/legacy_urls.ts index 62ae63baa8fc8..0056817f3465f 100644 --- a/test/functional/apps/dashboard/group5/legacy_urls.ts +++ b/test/functional/apps/dashboard/group5/legacy_urls.ts @@ -86,13 +86,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('resolves markdown link', async () => { - await visualize.navigateToNewVisualization(); - await visualize.clickMarkdownWidget(); + await dashboard.gotoDashboardLandingPage(); + await dashboard.clickNewDashboard(); + await dashboardAddPanel.clickMarkdownQuickButton(); await visEditor.setMarkdownTxt(`[abc](#/dashboard/${testDashboardId})`); await visEditor.clickGo(); - - await visualize.saveVisualizationExpectSuccess('legacy url markdown'); - + await visualize.saveVisualization('legacy url markdown', { redirectToOrigin: true }); await (await find.byLinkText('abc')).click(); await header.waitUntilLoadingHasFinished(); diff --git a/test/functional/apps/dashboard_elements/markdown/_markdown_vis.ts b/test/functional/apps/dashboard_elements/markdown/_markdown_vis.ts index 18402669293f7..33386a5cb6862 100644 --- a/test/functional/apps/dashboard_elements/markdown/_markdown_vis.ts +++ b/test/functional/apps/dashboard_elements/markdown/_markdown_vis.ts @@ -12,25 +12,26 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { - const { visualize, visEditor, visChart, header } = getPageObjects([ - 'visualize', + const { visEditor, visChart, header, dashboard } = getPageObjects([ + 'dashboard', 'visEditor', 'visChart', 'header', ]); const find = getService('find'); const inspector = getService('inspector'); + const dashboardAddPanel = getService('dashboardAddPanel'); const markdown = ` # Heading 1

Inline HTML that should not be rendered as html

`; - describe('markdown app in visualize app', () => { + describe('markdown app', () => { before(async function () { - await visualize.initTests(); - await visualize.navigateToNewVisualization(); - await visualize.clickMarkdownWidget(); + await dashboard.initTests(); + await dashboard.clickNewDashboard(); + await dashboardAddPanel.clickMarkdownQuickButton(); await visEditor.setMarkdownTxt(markdown); await visEditor.clickGo(); }); diff --git a/test/functional/apps/visualize/group1/_chart_types.ts b/test/functional/apps/visualize/group1/_chart_types.ts index 5b38fb26173b0..a8f5b7294382a 100644 --- a/test/functional/apps/visualize/group1/_chart_types.ts +++ b/test/functional/apps/visualize/group1/_chart_types.ts @@ -22,14 +22,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await visualize.navigateToNewVisualization(); }); - it('should show the promoted vis types for the first step', async function () { - const expectedChartTypes = ['Custom visualization', 'Lens', 'Maps', 'TSVB']; + it('should show the expected visualizations types for both recommended and legacy tabs', async function () { + const expectedRecommendedChartTypes = ['Custom visualization', 'Lens', 'Maps']; + const expectedLegacyChartTypes = ['Aggregation-based', 'TSVB']; // find all the chart types and make sure there all there - const chartTypes = (await visualize.getPromotedVisTypes()).sort(); + const chartTypes = await visualize.getVisibleVisTypes(); log.debug('returned chart types = ' + chartTypes); - log.debug('expected chart types = ' + expectedChartTypes); - expect(chartTypes).to.eql(expectedChartTypes); + log.debug('expected chart types = ' + expectedRecommendedChartTypes); + expect(chartTypes).to.eql(expectedRecommendedChartTypes); + await visualize.clickLegacyTab(); + const legacyChartTypes = await visualize.getVisibleVisTypes(); + expect(legacyChartTypes).to.eql(expectedLegacyChartTypes); }); it('should show the correct agg based chart types', async function () { diff --git a/test/functional/apps/visualize/group3/_visualize_listing.ts b/test/functional/apps/visualize/group3/_visualize_listing.ts index 7cb1b7b4b51be..19fba122b4cad 100644 --- a/test/functional/apps/visualize/group3/_visualize_listing.ts +++ b/test/functional/apps/visualize/group3/_visualize_listing.ts @@ -10,7 +10,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { - const { visualize, visEditor } = getPageObjects(['visualize', 'visEditor']); + const { visualize, visualBuilder } = getPageObjects(['visualize', 'visualBuilder']); const listingTable = getService('listingTable'); describe('visualize listing page', function describeIndexTests() { @@ -24,18 +24,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('create new viz', async function () { - // type markdown is used for simplicity - await visualize.createSimpleMarkdownViz(vizName); + // type tsvb is used for simplicity + await visualize.createSimpleTSVBViz(vizName); await visualize.gotoVisualizationLandingPage(); await listingTable.expectItemsCount('visualize', 1); }); it('delete all viz', async function () { - await visualize.createSimpleMarkdownViz(vizName + '1'); + await visualize.createSimpleTSVBViz(vizName + '1'); await visualize.gotoVisualizationLandingPage(); await listingTable.expectItemsCount('visualize', 2); - await visualize.createSimpleMarkdownViz(vizName + '2'); + await visualize.createSimpleTSVBViz(vizName + '2'); await visualize.gotoVisualizationLandingPage(); await listingTable.expectItemsCount('visualize', 3); @@ -48,9 +48,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { before(async function () { // create one new viz await visualize.navigateToNewVisualization(); - await visualize.clickMarkdownWidget(); - await visEditor.setMarkdownTxt('HELLO'); - await visEditor.clickGo(); + await visualize.clickVisualBuilder(); + await visualBuilder.checkVisualBuilderIsPresent(); await visualize.saveVisualization('Hello World'); await visualize.gotoVisualizationLandingPage(); }); diff --git a/test/functional/page_objects/visualize_page.ts b/test/functional/page_objects/visualize_page.ts index 64f6858a1f759..1f6c9cc11c474 100644 --- a/test/functional/page_objects/visualize_page.ts +++ b/test/functional/page_objects/visualize_page.ts @@ -41,7 +41,6 @@ export class VisualizePageObject extends FtrService { private readonly elasticChart = this.ctx.getService('elasticChart'); private readonly common = this.ctx.getPageObject('common'); private readonly header = this.ctx.getPageObject('header'); - private readonly visEditor = this.ctx.getPageObject('visEditor'); private readonly visChart = this.ctx.getPageObject('visChart'); private readonly toasts = this.ctx.getService('toasts'); @@ -106,7 +105,8 @@ export class VisualizePageObject extends FtrService { } public async clickAggBasedVisualizations() { - await this.testSubjects.click('visGroupAggBasedExploreLink'); + await this.clickLegacyTab(); + await this.testSubjects.click('visType-aggbased'); } public async goBackToGroups() { @@ -125,7 +125,7 @@ export class VisualizePageObject extends FtrService { .map((chart) => $(chart).findTestSubject('visTypeTitle').text().trim()); } - public async getPromotedVisTypes() { + public async getVisibleVisTypes() { const chartTypeField = await this.testSubjects.find('visNewDialogGroups'); const $ = await chartTypeField.parseDomContent(); const promotedVisTypes: string[] = []; @@ -137,7 +137,7 @@ export class VisualizePageObject extends FtrService { promotedVisTypes.push(title); } }); - return promotedVisTypes; + return promotedVisTypes.sort(); } public async waitForVisualizationSelectPage() { @@ -221,8 +221,8 @@ export class VisualizePageObject extends FtrService { await this.clickVisType('line'); } - public async clickMarkdownWidget() { - await this.clickVisType('markdown'); + public async clickLegacyTab() { + await this.testSubjects.click('groupModalLegacyTab'); } public async clickMetric() { @@ -254,6 +254,7 @@ export class VisualizePageObject extends FtrService { } public async clickVisualBuilder() { + await this.clickLegacyTab(); await this.clickVisType('metrics'); } @@ -281,12 +282,10 @@ export class VisualizePageObject extends FtrService { return await this.hasVisType('maps'); } - public async createSimpleMarkdownViz(vizName: string) { + public async createSimpleTSVBViz(vizName: string) { await this.gotoVisualizationLandingPage(); await this.navigateToNewVisualization(); - await this.clickMarkdownWidget(); - await this.visEditor.setMarkdownTxt(vizName); - await this.visEditor.clickGo(); + await this.clickVisualBuilder(); await this.saveVisualization(vizName); } diff --git a/x-pack/plugins/lens/public/vis_type_alias.ts b/x-pack/plugins/lens/public/vis_type_alias.ts index 90d1df663d3e4..5f08ce1b9ced6 100644 --- a/x-pack/plugins/lens/public/vis_type_alias.ts +++ b/x-pack/plugins/lens/public/vis_type_alias.ts @@ -22,10 +22,7 @@ export const getLensAliasConfig = (): VisTypeAlias => ({ }), description: i18n.translate('xpack.lens.visTypeAlias.description', { defaultMessage: - 'Create visualizations with our drag and drop editor. Switch between visualization types at any time.', - }), - note: i18n.translate('xpack.lens.visTypeAlias.note', { - defaultMessage: 'Recommended for most users.', + 'Create visualizations using an intuitive drag-and-drop interface. Smart suggestions help you follow best practices and find the chart types that best match your data.', }), order: 60, icon: 'lensApp', diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 61d08b0c81a3b..0e7b40b66924b 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -8261,8 +8261,6 @@ "visTypeMarkdown.function.help": "Visualisation Markdown", "visTypeMarkdown.function.markdown.help": "Markdown à rendre", "visTypeMarkdown.function.openLinksInNewTab.help": "Ouvre les liens dans un nouvel onglet", - "visTypeMarkdown.markdownDescription": "Ajoutez du texte et des images à votre tableau de bord.", - "visTypeMarkdown.markdownTitleInWizard": "Texte", "visTypeMarkdown.params.fontSizeLabel": "Taille de police de base en points", "visTypeMarkdown.params.helpLinkLabel": "Aide", "visTypeMarkdown.params.openLinksLabel": "Ouvrir les liens dans un nouvel onglet", @@ -8591,7 +8589,6 @@ "visTypeTimeseries.indexPatternSelect.switchModePopover.title": "Mode de vue de données", "visTypeTimeseries.indexPatternSelect.switchModePopover.useKibanaIndices": "Utiliser des vues de données Kibana", "visTypeTimeseries.indexPatternSelect.updateIndex": "Mettre à jour la visualisation avec la vue de données saisie", - "visTypeTimeseries.kbnVisTypes.metricsDescription": "Réalisez des analyses avancées de vos données temporelles.", "visTypeTimeseries.kbnVisTypes.metricsTitle": "TSVB", "visTypeTimeseries.lastValueModeIndicator.lastBucketDate": "Compartiment : {lastBucketDate}", "visTypeTimeseries.lastValueModeIndicator.lastValue": "Dernière valeur", @@ -8969,7 +8966,6 @@ "visTypeVega.mapView.resettingPropertyToMaxValueWarningMessage": "Réinitialisation de {name} sur {max}", "visTypeVega.mapView.resettingPropertyToMinValueWarningMessage": "Réinitialisation de {name} sur {min}", "visTypeVega.type.vegaDescription": "Utilisez Vega pour créer de nouveaux types de visualisations.", - "visTypeVega.type.vegaNote": "Requiert une connaissance de la syntaxe Vega.", "visTypeVega.type.vegaTitleInWizard": "Visualisation personnalisée", "visTypeVega.urlParser.dataUrlRequiresUrlParameterInFormErrorMessage": "{dataUrlParam} requiert un paramètre {urlParam} sous la forme \"{formLink}\"", "visTypeVega.urlParser.urlShouldHaveQuerySubObjectWarningMessage": "L'utilisation d'un {urlObject} requiert un sous-objet {subObjectName}", @@ -9154,7 +9150,6 @@ "visualizations.createVisualization.noIndexPatternOrSavedSearchIdErrorMessage": "Vous devez fournir un indexPattern ou un savedSearchId", "visualizations.createVisualization.noVisTypeErrorMessage": "Vous devez fournir un type de visualisation valide", "visualizations.dataView.label": "Vue de données", - "visualizations.deprecatedTag": "Déclassé", "visualizations.displayName": "visualisation", "visualizations.editor.createBreadcrumb": "Créer", "visualizations.editor.defaultEditBreadcrumbText": "Modifier la visualisation", @@ -9206,24 +9201,16 @@ "visualizations.newChart.libraryMode.new": "nouveau", "visualizations.newChart.libraryMode.old": "âge", "visualizations.newGaugeChart.notificationMessage": "La nouvelle bibliothèque de graphiques de jauge ne prend pas encore en charge l'agrégation de graphiques fractionnés. {conditionalMessage}", - "visualizations.newVisWizard.aggBasedGroupDescription": "Utilisez notre bibliothèque Visualize classique pour créer des graphiques basés sur des agrégations.", - "visualizations.newVisWizard.aggBasedGroupTitle": "Basé sur une agrégation", "visualizations.newVisWizard.chooseSourceTitle": "Choisir une source", - "visualizations.newVisWizard.experimentalTitle": "Version d'évaluation technique", - "visualizations.newVisWizard.experimentalTooltip": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera de corriger tout problème, mais les fonctionnalités des versions d'évaluation technique ne sont pas soumises aux SLA de support des fonctionnalités officielles en disponibilité générale.", - "visualizations.newVisWizard.exploreOptionLinkText": "Explorer les options", "visualizations.newVisWizard.filterVisTypeAriaLabel": "Filtrer un type de visualisation", "visualizations.newVisWizard.goBackLink": "Sélectionner une visualisation différente", "visualizations.newVisWizard.helpTextAriaLabel": "Commencez à créer votre visualisation en sélectionnant un type pour cette visualisation. Appuyez sur Échap pour fermer ce mode. Appuyez sur Tab pour aller plus loin.", "visualizations.newVisWizard.learnMoreText": "Envie d'en savoir plus ?", "visualizations.newVisWizard.newVisTypeTitle": "Nouveau {visTypeName}", - "visualizations.newVisWizard.readDocumentationLink": "Lire la documentation", "visualizations.newVisWizard.resultsFound": "{resultCount, plural, one {type trouvé} other {types trouvés}}", "visualizations.newVisWizard.searchSelection.notFoundLabel": "Aucun recherche enregistrée ni aucun index correspondants n'ont été trouvés.", "visualizations.newVisWizard.searchSelection.savedObjectType.dataView": "Vue de données", "visualizations.newVisWizard.searchSelection.savedObjectType.search": "Recherche enregistrée", - "visualizations.newVisWizard.title": "Nouvelle visualisation", - "visualizations.newVisWizard.toolsGroupTitle": "Outils", "visualizations.noDataView.label": "vue de données", "visualizations.noMatchRoute.bannerText": "L'application Visualize ne reconnaît pas cet itinéraire : {route}.", "visualizations.noMatchRoute.bannerTitleText": "Page introuvable", @@ -25772,8 +25759,6 @@ "xpack.lens.uniqueLabel": "{label} [{num}]", "xpack.lens.unknownDatasourceType.shortMessage": "Type de source de données inconnu", "xpack.lens.unknownVisType.shortMessage": "Type de visualisation inconnu", - "xpack.lens.visTypeAlias.description": "Créez des visualisations avec notre éditeur de glisser-déposer. Basculez entre les différents types de visualisation à tout moment.", - "xpack.lens.visTypeAlias.note": "Recommandé pour la plupart des utilisateurs.", "xpack.lens.visTypeAlias.title": "Lens", "xpack.lens.visTypeAlias.type": "Lens", "xpack.lens.visualizeAggBasedLegend": "Visualiser le graphique basé sur une agrégation", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 61ad6c58ea44c..f3d9422842083 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -8015,8 +8015,6 @@ "visTypeMarkdown.function.help": "マークダウンビジュアライゼーション", "visTypeMarkdown.function.markdown.help": "レンダリングするマークダウン", "visTypeMarkdown.function.openLinksInNewTab.help": "新規タブでリンクを開きます", - "visTypeMarkdown.markdownDescription": "テキストと画像をダッシュボードに追加します。", - "visTypeMarkdown.markdownTitleInWizard": "Text", "visTypeMarkdown.params.fontSizeLabel": "ポイント単位のベースフォントサイズです。", "visTypeMarkdown.params.helpLinkLabel": "ヘルプ", "visTypeMarkdown.params.openLinksLabel": "新規タブでリンクを開く", @@ -8345,7 +8343,6 @@ "visTypeTimeseries.indexPatternSelect.switchModePopover.title": "データビューモード", "visTypeTimeseries.indexPatternSelect.switchModePopover.useKibanaIndices": "Kibanaデータビューを使用", "visTypeTimeseries.indexPatternSelect.updateIndex": "入力したデータビューで可視化を更新", - "visTypeTimeseries.kbnVisTypes.metricsDescription": "時系列データの高度な分析を実行します。", "visTypeTimeseries.kbnVisTypes.metricsTitle": "TSVB", "visTypeTimeseries.lastValueModeIndicator.lastBucketDate": "バケット:{lastBucketDate}", "visTypeTimeseries.lastValueModeIndicator.lastValue": "最終値", @@ -8722,7 +8719,6 @@ "visTypeVega.mapView.resettingPropertyToMaxValueWarningMessage": "{name} を {max} にリセットしています", "visTypeVega.mapView.resettingPropertyToMinValueWarningMessage": "{name} を {min} にリセットしています", "visTypeVega.type.vegaDescription": "Vega を使用して、新しいタイプのビジュアライゼーションを作成します。", - "visTypeVega.type.vegaNote": "Vega 構文の知識が必要です。", "visTypeVega.type.vegaTitleInWizard": "カスタムビジュアライゼーション", "visTypeVega.urlParser.dataUrlRequiresUrlParameterInFormErrorMessage": "{dataUrlParam} には「{formLink}」の形で {urlParam} パラメーターが必要です", "visTypeVega.urlParser.urlShouldHaveQuerySubObjectWarningMessage": "{urlObject} を使用するには {subObjectName} サブオブジェクトが必要です", @@ -8907,7 +8903,6 @@ "visualizations.createVisualization.noIndexPatternOrSavedSearchIdErrorMessage": "indexPatternまたはsavedSearchIdが必要です", "visualizations.createVisualization.noVisTypeErrorMessage": "有効なビジュアライゼーションタイプを指定してください", "visualizations.dataView.label": "データビュー", - "visualizations.deprecatedTag": "非推奨", "visualizations.displayName": "ビジュアライゼーション", "visualizations.editor.createBreadcrumb": "作成", "visualizations.editor.defaultEditBreadcrumbText": "ビジュアライゼーションを編集", @@ -8959,24 +8954,16 @@ "visualizations.newChart.libraryMode.new": "新規", "visualizations.newChart.libraryMode.old": "古", "visualizations.newGaugeChart.notificationMessage": "新しいゲージグラフライブラリはまだ分割グラフアグリゲーションをサポートしていません。{conditionalMessage}", - "visualizations.newVisWizard.aggBasedGroupDescription": "クラシック Visualize ライブラリを使用して、アグリゲーションに基づいてグラフを作成します。", - "visualizations.newVisWizard.aggBasedGroupTitle": "アグリゲーションに基づく", "visualizations.newVisWizard.chooseSourceTitle": "ソースの選択", - "visualizations.newVisWizard.experimentalTitle": "テクニカルプレビュー", - "visualizations.newVisWizard.experimentalTooltip": "この機能はテクニカルプレビュー中であり、将来のリリースでは変更されたり完全に削除されたりする場合があります。Elasticはすべての問題の修正に努めますが、テクニカルプレビュー中の機能には正式なGA機能のサポートSLAが適用されません。", - "visualizations.newVisWizard.exploreOptionLinkText": "探索オプション", "visualizations.newVisWizard.filterVisTypeAriaLabel": "ビジュアライゼーションのタイプでフィルタリング", "visualizations.newVisWizard.goBackLink": "別のビジュアライゼーションを選択", "visualizations.newVisWizard.helpTextAriaLabel": "タイプを選択してビジュアライゼーションの作成を始めましょう。ESC を押してこのモーダルを閉じます。Tab キーを押して次に進みます。", "visualizations.newVisWizard.learnMoreText": "詳細について", "visualizations.newVisWizard.newVisTypeTitle": "新規 {visTypeName}", - "visualizations.newVisWizard.readDocumentationLink": "ドキュメンテーションを表示", "visualizations.newVisWizard.resultsFound": "{resultCount, plural, other {個のタイプ}} が見つかりました", "visualizations.newVisWizard.searchSelection.notFoundLabel": "一致インデックスまたは保存した検索が見つかりません。", "visualizations.newVisWizard.searchSelection.savedObjectType.dataView": "データビュー", "visualizations.newVisWizard.searchSelection.savedObjectType.search": "保存検索", - "visualizations.newVisWizard.title": "新規ビジュアライゼーション", - "visualizations.newVisWizard.toolsGroupTitle": "ツール", "visualizations.noDataView.label": "データビュー", "visualizations.noMatchRoute.bannerText": "Visualizeアプリケーションはこのルートを認識できません。{route}", "visualizations.noMatchRoute.bannerTitleText": "ページが見つかりません", @@ -25520,8 +25507,6 @@ "xpack.lens.unknownDatasourceType.shortMessage": "不明なデータソースタイプ", "xpack.lens.unknownVisType.longMessage": "ビジュアライゼーションタイプ{visType}を解決できませんでした。", "xpack.lens.unknownVisType.shortMessage": "不明なビジュアライゼーションタイプ", - "xpack.lens.visTypeAlias.description": "ドラッグアンドドロップエディターでビジュアライゼーションを作成します。いつでもビジュアライゼーションタイプを切り替えることができます。", - "xpack.lens.visTypeAlias.note": "ほとんどのユーザーに推奨されます。", "xpack.lens.visTypeAlias.title": "Lens", "xpack.lens.visTypeAlias.type": "Lens", "xpack.lens.visualizeAggBasedLegend": "集約に基づくグラフを可視化", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 22061c2c36715..48712e7f2fb69 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -8031,8 +8031,6 @@ "visTypeMarkdown.function.help": "Markdown 可视化", "visTypeMarkdown.function.markdown.help": "要渲染的 Markdown", "visTypeMarkdown.function.openLinksInNewTab.help": "在新标签页中打开链接", - "visTypeMarkdown.markdownDescription": "将文本和图像添加到仪表板。", - "visTypeMarkdown.markdownTitleInWizard": "文本", "visTypeMarkdown.params.fontSizeLabel": "基础字体大小(磅)", "visTypeMarkdown.params.helpLinkLabel": "帮助", "visTypeMarkdown.params.openLinksLabel": "在新标签页中打开链接", @@ -8361,7 +8359,6 @@ "visTypeTimeseries.indexPatternSelect.switchModePopover.title": "数据视图模式", "visTypeTimeseries.indexPatternSelect.switchModePopover.useKibanaIndices": "使用 Kibana 数据视图", "visTypeTimeseries.indexPatternSelect.updateIndex": "使用输入的数据视图更新可视化", - "visTypeTimeseries.kbnVisTypes.metricsDescription": "对时间序列数据执行高级分析。", "visTypeTimeseries.kbnVisTypes.metricsTitle": "TSVB", "visTypeTimeseries.lastValueModeIndicator.lastBucketDate": "存储桶:{lastBucketDate}", "visTypeTimeseries.lastValueModeIndicator.lastValue": "最后值", @@ -8739,7 +8736,6 @@ "visTypeVega.mapView.resettingPropertyToMaxValueWarningMessage": "将 {name} 重置为 {max}", "visTypeVega.mapView.resettingPropertyToMinValueWarningMessage": "将 {name} 重置为 {min}", "visTypeVega.type.vegaDescription": "使用 Vega 创建新的可视化类型。", - "visTypeVega.type.vegaNote": "需要有 Vega 语法知识。", "visTypeVega.type.vegaTitleInWizard": "定制可视化", "visTypeVega.urlParser.dataUrlRequiresUrlParameterInFormErrorMessage": "{dataUrlParam} 需要“{formLink}”形式的 {urlParam} 参数", "visTypeVega.urlParser.urlShouldHaveQuerySubObjectWarningMessage": "使用 {urlObject} 应具有 {subObjectName} 子对象", @@ -8924,7 +8920,6 @@ "visualizations.createVisualization.noIndexPatternOrSavedSearchIdErrorMessage": "必须提供 indexPattern 或 savedSearchId", "visualizations.createVisualization.noVisTypeErrorMessage": "必须提供有效的可视化类型", "visualizations.dataView.label": "数据视图", - "visualizations.deprecatedTag": "(已过时)", "visualizations.displayName": "可视化", "visualizations.editor.createBreadcrumb": "创建", "visualizations.editor.defaultEditBreadcrumbText": "编辑可视化", @@ -8976,24 +8971,16 @@ "visualizations.newChart.libraryMode.new": "新", "visualizations.newChart.libraryMode.old": "以前", "visualizations.newGaugeChart.notificationMessage": "新的仪表盘图表库尚不支持拆分图表聚合。{conditionalMessage}", - "visualizations.newVisWizard.aggBasedGroupDescription": "使用我们的经典可视化库,基于聚合创建图表。", - "visualizations.newVisWizard.aggBasedGroupTitle": "基于聚合", "visualizations.newVisWizard.chooseSourceTitle": "选择源", - "visualizations.newVisWizard.experimentalTitle": "技术预览", - "visualizations.newVisWizard.experimentalTooltip": "此功能处于技术预览状态,在未来版本中可能会更改或完全移除。Elastic 将努力修复任何问题,但处于技术预览状态的功能不受正式 GA 功能支持 SLA 的约束。", - "visualizations.newVisWizard.exploreOptionLinkText": "浏览选项", "visualizations.newVisWizard.filterVisTypeAriaLabel": "筛留可视化类型", "visualizations.newVisWizard.goBackLink": "选择不同的可视化", "visualizations.newVisWizard.helpTextAriaLabel": "通过为该可视化选择类型,开始创建您的可视化。按 Esc 键关闭此模式。按 Tab 键继续。", "visualizations.newVisWizard.learnMoreText": "希望了解详情?", "visualizations.newVisWizard.newVisTypeTitle": "新建{visTypeName}", - "visualizations.newVisWizard.readDocumentationLink": "阅读文档", "visualizations.newVisWizard.resultsFound": "{resultCount, plural, other {类型}}已找到", "visualizations.newVisWizard.searchSelection.notFoundLabel": "未找到匹配的索引或已保存搜索。", "visualizations.newVisWizard.searchSelection.savedObjectType.dataView": "数据视图", "visualizations.newVisWizard.searchSelection.savedObjectType.search": "已保存搜索", - "visualizations.newVisWizard.title": "新建可视化", - "visualizations.newVisWizard.toolsGroupTitle": "工具", "visualizations.noDataView.label": "数据视图", "visualizations.noMatchRoute.bannerText": "Visualize 应用程序无法识别此路由:{route}。", "visualizations.noMatchRoute.bannerTitleText": "未找到页面", @@ -25555,8 +25542,6 @@ "xpack.lens.unknownDatasourceType.shortMessage": "数据源类型未知", "xpack.lens.unknownVisType.longMessage": "无法解析可视化类型 {visType}。", "xpack.lens.unknownVisType.shortMessage": "可视化类型未知", - "xpack.lens.visTypeAlias.description": "使用拖放编辑器创建可视化。随时在可视化类型之间切换。", - "xpack.lens.visTypeAlias.note": "适合绝大多数用户。", "xpack.lens.visTypeAlias.title": "Lens", "xpack.lens.visTypeAlias.type": "Lens", "xpack.lens.visualizeAggBasedLegend": "可视化基于聚合的图表", diff --git a/x-pack/test/saved_object_tagging/functional/tests/visualize_integration.ts b/x-pack/test/saved_object_tagging/functional/tests/visualize_integration.ts index 61b7a2c1e9711..c4d0df07aeb64 100644 --- a/x-pack/test/saved_object_tagging/functional/tests/visualize_integration.ts +++ b/x-pack/test/saved_object_tagging/functional/tests/visualize_integration.ts @@ -32,14 +32,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { } await testSubjects.click('savedObjectTitle'); }; - // creates a simple markdown vis with a tag provided. + // creates a simple tsvb vis with a tag provided. const createSimpleMarkdownVis = async (opts: Record) => { - const { visName, visText, tagName } = opts; + const { visName, tagName } = opts; await PageObjects.visualize.navigateToNewVisualization(); - await PageObjects.visualize.clickMarkdownWidget(); - await PageObjects.visEditor.setMarkdownTxt(visText); - await PageObjects.visEditor.clickGo(); + await PageObjects.visualize.clickVisualBuilder(); await PageObjects.visualize.ensureSavePanelOpen(); await PageObjects.visualize.setSaveModalValues(visName, { @@ -150,10 +148,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.visualize.navigateToNewVisualization(); - await PageObjects.visualize.clickMarkdownWidget(); - await PageObjects.visEditor.setMarkdownTxt('Just some markdown'); - await PageObjects.visEditor.clickGo(); - + await PageObjects.visualize.clickVisualBuilder(); await PageObjects.visualize.ensureSavePanelOpen(); await PageObjects.visualize.setSaveModalValues('vis-with-new-tag', { saveAsNew: false, From 860e445c7d6a7d5bb92a638e5ac5cb888f881ffc Mon Sep 17 00:00:00 2001 From: Sonia Sanz Vivas Date: Mon, 21 Oct 2024 18:21:02 +0200 Subject: [PATCH 28/69] Validate max number of node connections (#196908) #Closes [#110155](https://github.com/elastic/kibana/issues/110155) ## Summary Currently Elastic Search has a limitation of 2^31-1 (2147483647) maximum node connections. This PR adds this hardcoded value and is used to validate that the input does not exceed this value and, therefore, the user does not have to wait for the server to return the error to know that they have entered a number that is too high. ES does not have an API to query the number, that's why it is hardcoded. Screenshot 2024-10-18 at 17 13 14 --- .../add/remote_clusters_add.test.ts | 12 +++++++++ .../helpers/remote_clusters_actions.ts | 14 ++++++++++ .../remote_clusters/common/constants.ts | 3 +++ .../components/sniff_connection.tsx | 18 ++++++++----- .../validate_node_connections.test.tsx.snap | 13 ++++++++++ .../remote_cluster_form/validators/index.ts | 1 + .../validators/validate_cluster.tsx | 5 +++- .../validate_node_connections.test.tsx | 23 ++++++++++++++++ .../validators/validate_node_connections.tsx | 26 +++++++++++++++++++ .../translations/translations/fr-FR.json | 2 +- .../translations/translations/ja-JP.json | 2 +- .../translations/translations/zh-CN.json | 2 +- 12 files changed, 111 insertions(+), 10 deletions(-) create mode 100644 x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/__snapshots__/validate_node_connections.test.tsx.snap create mode 100644 x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/validate_node_connections.test.tsx create mode 100644 x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/validate_node_connections.tsx diff --git a/x-pack/plugins/remote_clusters/__jest__/client_integration/add/remote_clusters_add.test.ts b/x-pack/plugins/remote_clusters/__jest__/client_integration/add/remote_clusters_add.test.ts index 43157fa157f0b..6e6f5d7692b75 100644 --- a/x-pack/plugins/remote_clusters/__jest__/client_integration/add/remote_clusters_add.test.ts +++ b/x-pack/plugins/remote_clusters/__jest__/client_integration/add/remote_clusters_add.test.ts @@ -11,6 +11,7 @@ import { act } from 'react-dom/test-utils'; import { setupEnvironment, RemoteClustersActions } from '../helpers'; import { setup } from './remote_clusters_add.helpers'; import { NON_ALPHA_NUMERIC_CHARS, ACCENTED_CHARS } from './special_characters'; +import { MAX_NODE_CONNECTIONS } from '../../../common/constants'; const notInArray = (array: string[]) => (value: string) => array.indexOf(value) < 0; @@ -276,6 +277,17 @@ describe('Create Remote cluster', () => { }); }); + describe('node connections', () => { + test('should require a valid number of node connections', async () => { + await actions.saveButton.click(); + + actions.nodeConnectionsInput.setValue(String(MAX_NODE_CONNECTIONS + 1)); + expect(actions.getErrorMessages()).toContain( + `This number must be equal or less than ${MAX_NODE_CONNECTIONS}.` + ); + }); + }); + test('server name is optional (proxy connection)', () => { actions.connectionModeSwitch.toggle(); actions.saveButton.click(); diff --git a/x-pack/plugins/remote_clusters/__jest__/client_integration/helpers/remote_clusters_actions.ts b/x-pack/plugins/remote_clusters/__jest__/client_integration/helpers/remote_clusters_actions.ts index f657058231a84..00e33def31ef6 100644 --- a/x-pack/plugins/remote_clusters/__jest__/client_integration/helpers/remote_clusters_actions.ts +++ b/x-pack/plugins/remote_clusters/__jest__/client_integration/helpers/remote_clusters_actions.ts @@ -42,6 +42,9 @@ export interface RemoteClustersActions { setValue: (seed: string) => void; getValue: () => string; }; + nodeConnectionsInput: { + setValue: (connections: string) => void; + }; proxyAddressInput: { setValue: (proxyAddress: string) => void; exists: () => boolean; @@ -154,6 +157,16 @@ export const createRemoteClustersActions = (testBed: TestBed): RemoteClustersAct }; }; + const createNodeConnectionsInputActions = () => { + const nodeConnectionsInputSelector = 'remoteClusterFormNodeConnectionsInput'; + return { + nodeConnectionsInput: { + setValue: (connections: string) => + form.setInputValue(nodeConnectionsInputSelector, connections), + }, + }; + }; + const createProxyAddressActions = () => { const proxyAddressSelector = 'remoteClusterFormProxyAddressInput'; return { @@ -266,6 +279,7 @@ export const createRemoteClustersActions = (testBed: TestBed): RemoteClustersAct ...createConnectionModeActions(), ...createCloudAdvancedOptionsSwitchActions(), ...createSeedsInputActions(), + ...createNodeConnectionsInputActions(), ...createCloudRemoteAddressInputActions(), ...createProxyAddressActions(), ...createServerNameActions(), diff --git a/x-pack/plugins/remote_clusters/common/constants.ts b/x-pack/plugins/remote_clusters/common/constants.ts index 1357de2cd4640..889b5afc7e1fc 100644 --- a/x-pack/plugins/remote_clusters/common/constants.ts +++ b/x-pack/plugins/remote_clusters/common/constants.ts @@ -42,3 +42,6 @@ export const getSecurityModel = (type: string) => { return type; }; + +// Hardcoded limit of maximum node connections allowed +export const MAX_NODE_CONNECTIONS = 2 ** 31 - 1; // 2147483647 diff --git a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/components/sniff_connection.tsx b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/components/sniff_connection.tsx index 2d1608bcc4a70..c29a1ce5c2169 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/components/sniff_connection.tsx +++ b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/components/sniff_connection.tsx @@ -28,14 +28,16 @@ export const SniffConnection: FunctionComponent = ({ }) => { const [localSeedErrors, setLocalSeedErrors] = useState([]); const { seeds = [], nodeConnections } = fields; - const { seeds: seedsError } = fieldsErrors; + const { seeds: seedsError, nodeConnections: nodeError } = fieldsErrors; // Show errors if there is a general form error or local errors. const areFormErrorsVisible = Boolean(areErrorsVisible && seedsError); - const showErrors = areFormErrorsVisible || localSeedErrors.length !== 0; - const errors = + const showLocalSeedErrors = areFormErrorsVisible || localSeedErrors.length !== 0; + const errorsInLocalSeeds = areFormErrorsVisible && seedsError ? localSeedErrors.concat(seedsError) : localSeedErrors; const formattedSeeds: EuiComboBoxOptionOption[] = seeds.map((seed: string) => ({ label: seed })); + const showNodeConnectionErrors = Boolean(nodeError); + const onCreateSeed = (newSeed?: string) => { // If the user just hit enter without typing anything, treat it as a no-op. if (!newSeed) { @@ -107,8 +109,8 @@ export const SniffConnection: FunctionComponent = ({ }} /> } - isInvalid={showErrors} - error={errors} + isInvalid={showLocalSeedErrors} + error={errorsInLocalSeeds} fullWidth > = ({ onFieldsChange({ seeds: options.map(({ label }) => label) }) } onSearchChange={onSeedsInputChange} - isInvalid={showErrors} + isInvalid={showLocalSeedErrors} fullWidth data-test-subj="remoteClusterFormSeedsInput" /> @@ -146,11 +148,15 @@ export const SniffConnection: FunctionComponent = ({ /> } fullWidth + isInvalid={showNodeConnectionErrors} + error={nodeError} > onFieldsChange({ nodeConnections: Number(e.target.value) })} + isInvalid={showNodeConnectionErrors} fullWidth + data-test-subj="remoteClusterFormNodeConnectionsInput" />
diff --git a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/__snapshots__/validate_node_connections.test.tsx.snap b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/__snapshots__/validate_node_connections.test.tsx.snap new file mode 100644 index 0000000000000..0c1ec0f1db18c --- /dev/null +++ b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/__snapshots__/validate_node_connections.test.tsx.snap @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`validateNodeConnections rejects numbers larger than MaxValue 1`] = ` + +`; diff --git a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/index.ts b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/index.ts index 6a710dae744ba..1fca3c5e83a5c 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/index.ts +++ b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/index.ts @@ -16,3 +16,4 @@ export { validateCloudRemoteAddress, convertCloudRemoteAddressToProxyConnection, } from './validate_cloud_url'; +export { validateNodeConnections } from './validate_node_connections'; diff --git a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/validate_cluster.tsx b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/validate_cluster.tsx index aba0b0462cdf5..6d3f9e31c74b6 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/validate_cluster.tsx +++ b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/validate_cluster.tsx @@ -11,6 +11,7 @@ import { validateSeeds } from './validate_seeds'; import { validateProxy } from './validate_proxy'; import { validateCloudRemoteAddress } from './validate_cloud_url'; import { FormFields } from '../remote_cluster_form'; +import { validateNodeConnections } from './validate_node_connections'; type ClusterError = JSX.Element | null; @@ -19,14 +20,16 @@ export interface ClusterErrors { seeds?: ClusterError; proxyAddress?: ClusterError; cloudRemoteAddress?: ClusterError; + nodeConnections?: ClusterError; } export const validateCluster = (fields: FormFields, isCloudEnabled: boolean): ClusterErrors => { - const { name, seeds = [], mode, proxyAddress, cloudRemoteAddress } = fields; + const { name, seeds = [], mode, proxyAddress, cloudRemoteAddress, nodeConnections } = fields; return { name: validateName(name), seeds: mode === SNIFF_MODE ? validateSeeds(seeds) : null, proxyAddress: mode === PROXY_MODE ? validateProxy(proxyAddress) : null, cloudRemoteAddress: isCloudEnabled ? validateCloudRemoteAddress(cloudRemoteAddress) : null, + nodeConnections: mode === SNIFF_MODE ? validateNodeConnections(nodeConnections) : null, }; }; diff --git a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/validate_node_connections.test.tsx b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/validate_node_connections.test.tsx new file mode 100644 index 0000000000000..20f39395692b7 --- /dev/null +++ b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/validate_node_connections.test.tsx @@ -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 + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MAX_NODE_CONNECTIONS } from '../../../../../../common/constants'; +import { validateNodeConnections } from './validate_node_connections'; + +describe('validateNodeConnections', () => { + test('rejects numbers larger than MaxValue', () => { + expect(validateNodeConnections(MAX_NODE_CONNECTIONS + 1)).toMatchSnapshot(); + }); + + test('accepts numbers equal than MaxValue', () => { + expect(validateNodeConnections(MAX_NODE_CONNECTIONS)).toBe(null); + }); + + test('accepts numbers smaller than MaxValue', () => { + expect(validateNodeConnections(MAX_NODE_CONNECTIONS - 1)).toBe(null); + }); +}); diff --git a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/validate_node_connections.tsx b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/validate_node_connections.tsx new file mode 100644 index 0000000000000..4adadb6fc1d6d --- /dev/null +++ b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/validators/validate_node_connections.tsx @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { MAX_NODE_CONNECTIONS } from '../../../../../../common/constants'; + +export function validateNodeConnections(connections?: number | null): null | JSX.Element { + if (connections && connections > MAX_NODE_CONNECTIONS) { + return ( + + ); + } + + return null; +} diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 0e7b40b66924b..fc240ba84ad29 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -47476,4 +47476,4 @@ "xpack.watcher.watchEdit.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "Ce champ est requis.", "xpack.watcher.watcherDescription": "Détectez les modifications survenant dans vos données en créant, gérant et monitorant des alertes." } -} \ No newline at end of file +} diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index f3d9422842083..4d39022965da0 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -47214,4 +47214,4 @@ "xpack.watcher.watchEdit.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "フィールドを選択してください。", "xpack.watcher.watcherDescription": "アラートの作成、管理、監視によりデータへの変更を検知します。" } -} \ No newline at end of file +} diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 48712e7f2fb69..27ee1dd00a563 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -47267,4 +47267,4 @@ "xpack.watcher.watchEdit.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "此字段必填。", "xpack.watcher.watcherDescription": "通过创建、管理和监测警报来检测数据中的更改。" } -} \ No newline at end of file +} From 3ff6aadacd7f682b0805de138bc7e6a4f10cc260 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 22 Oct 2024 03:24:05 +1100 Subject: [PATCH 29/69] skip failing test suite (#193625) --- .../apis/integrations/inputs_with_standalone_docker_agent.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/fleet_api_integration/apis/integrations/inputs_with_standalone_docker_agent.ts b/x-pack/test/fleet_api_integration/apis/integrations/inputs_with_standalone_docker_agent.ts index 0f751711904ae..b5376142ab854 100644 --- a/x-pack/test/fleet_api_integration/apis/integrations/inputs_with_standalone_docker_agent.ts +++ b/x-pack/test/fleet_api_integration/apis/integrations/inputs_with_standalone_docker_agent.ts @@ -25,7 +25,8 @@ export default function (providerContext: FtrProviderContext) { const config = getService('config'); const log = getService('log'); - describe('inputs_with_standalone_docker_agent', () => { + // Failing: See https://github.com/elastic/kibana/issues/193625 + describe.skip('inputs_with_standalone_docker_agent', () => { skipIfNoDockerRegistry(providerContext); let apiKey: string; let agent: AgentProcess; From c73bfd2480ae386f5491547d42f3c532b26aad02 Mon Sep 17 00:00:00 2001 From: Jeramy Soucy Date: Mon, 21 Oct 2024 18:25:35 +0200 Subject: [PATCH 30/69] Enable custom roles and spaces in serverless projects (#195584) Closes #194933 Closes #192282 ## Summary This PR updates the serverless project yml files to - enable custom roles for Elasticsearch and Security projects - enable multiple spaces (max 100) for all serverless project types ### Tests Additionally, this PR adjust the serverless test suites. Originally, testing of roles and spaces endpoints was achieved from the feature flag test config. Now that these features are enabled by default, the tests have been migrated to the standard serverless test configs. Affected tests: - x-pack/test_serverless/api_integration/test_suites/common/management/spaces.ts - x-pack/test_serverless/api_integration/test_suites/common/platform_security/authorization.ts - x-pack/test_serverless/functional/test_suites/common/platform_security/navigation/management_nav_cards.ts - x-pack/test_serverless/functional/test_suites/common/platform_security/roles.ts - x-pack/test_serverless/functional/test_suites/common/spaces/spaces_management.ts - x-pack/test_serverless/functional/test_suites/common/spaces/spaces_selection.ts - Feature flag configs/indices - Project specific configs/indices - Base serverless config --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Dzmitry Lemechko --- config/serverless.oblt.yml | 3 + config/serverless.yml | 2 +- oas_docs/bundle.serverless.json | 694 +++++++++++ .../output/kibana.serverless.staging.yaml | 451 ++++++++ oas_docs/output/kibana.serverless.yaml | 451 ++++++++ x-pack/plugins/security/server/config.test.ts | 2 +- x-pack/plugins/security/server/config.ts | 3 +- x-pack/plugins/serverless/public/plugin.tsx | 2 +- .../default_configs/serverless.config.base.ts | 4 - .../api_integration/config.base.ts | 4 - .../management/multiple_spaces_enabled.ts | 410 ------- .../test_suites/common/management/spaces.ts | 264 +++-- .../common/platform_security/authorization.ts | 1024 ++++++++++++++++- .../roles_routes_feature_flag.ts | 951 --------------- .../observability/config.feature_flags.ts | 5 +- .../observability/index.feature_flags.ts | 2 - .../search/config.feature_flags.ts | 4 +- .../test_suites/search/index.feature_flags.ts | 3 - .../test_suites/search/index.ts | 1 + .../security/config.feature_flags.ts | 7 +- .../security/index.feature_flags.ts | 6 +- .../test_suites/security/index.ts | 1 + .../test_serverless/functional/config.base.ts | 4 - .../common/platform_security/index.ts | 2 + .../navigation/management_nav_cards.ts | 17 +- .../common/platform_security/roles.ts | 3 + .../test_suites/common/spaces/index.ts | 1 + ...spaces_enabled.ts => spaces_management.ts} | 42 - .../common/spaces/spaces_selection.ts | 48 +- .../observability/config.feature_flags.ts | 4 - .../observability/index.feature_flags.ts | 3 - .../search/config.feature_flags.ts | 8 +- .../functional/test_suites/search/config.ts | 8 - .../test_suites/search/index.feature_flags.ts | 4 - .../security/config.feature_flags.ts | 9 +- .../security/index.feature_flags.ts | 3 - x-pack/test_serverless/shared/config.base.ts | 11 +- x-pack/test_serverless/tsconfig.json | 2 +- 38 files changed, 2859 insertions(+), 1604 deletions(-) delete mode 100644 x-pack/test_serverless/api_integration/test_suites/common/management/multiple_spaces_enabled.ts delete mode 100644 x-pack/test_serverless/api_integration/test_suites/common/platform_security/roles_routes_feature_flag.ts rename x-pack/test_serverless/functional/test_suites/common/spaces/{multiple_spaces_enabled.ts => spaces_management.ts} (58%) diff --git a/config/serverless.oblt.yml b/config/serverless.oblt.yml index 1146a9280ac4e..2155565a63ef2 100644 --- a/config/serverless.oblt.yml +++ b/config/serverless.oblt.yml @@ -207,3 +207,6 @@ xpack.ml.compatibleModuleType: 'observability' # Disable the embedded Dev Console console.ui.embeddedEnabled: false + +# Disable role management (custom roles) +xpack.security.roleManagementEnabled: false diff --git a/config/serverless.yml b/config/serverless.yml index 4249d8ff786ec..ec857577f1863 100644 --- a/config/serverless.yml +++ b/config/serverless.yml @@ -155,7 +155,7 @@ server.versioned.versionResolution: newest server.versioned.strictClientVersionCheck: false # Enforce single "default" space and disable feature visibility controls -xpack.spaces.maxSpaces: 1 +xpack.spaces.maxSpaces: 100 xpack.spaces.allowFeatureVisibility: false xpack.spaces.allowSolutionVisibility: false diff --git a/oas_docs/bundle.serverless.json b/oas_docs/bundle.serverless.json index fd41029331181..a11d7afd89b3b 100644 --- a/oas_docs/bundle.serverless.json +++ b/oas_docs/bundle.serverless.json @@ -40993,6 +40993,697 @@ ] } }, + "/api/security/role": { + "get": { + "operationId": "%2Fapi%2Fsecurity%2Frole#0", + "parameters": [ + { + "description": "The version of the API to use", + "in": "header", + "name": "elastic-api-version", + "schema": { + "default": "2023-10-31", + "enum": [ + "2023-10-31" + ], + "type": "string" + } + }, + { + "in": "query", + "name": "replaceDeprecatedPrivileges", + "required": false, + "schema": { + "type": "boolean" + } + } + ], + "responses": {}, + "summary": "Get all roles", + "tags": [ + "roles" + ] + } + }, + "/api/security/role/{name}": { + "delete": { + "operationId": "%2Fapi%2Fsecurity%2Frole%2F%7Bname%7D#1", + "parameters": [ + { + "description": "The version of the API to use", + "in": "header", + "name": "elastic-api-version", + "schema": { + "default": "2023-10-31", + "enum": [ + "2023-10-31" + ], + "type": "string" + } + }, + { + "description": "A required header to protect against CSRF attacks", + "in": "header", + "name": "kbn-xsrf", + "required": true, + "schema": { + "example": "true", + "type": "string" + } + }, + { + "in": "path", + "name": "name", + "required": true, + "schema": { + "minLength": 1, + "type": "string" + } + } + ], + "responses": {}, + "summary": "Delete a role", + "tags": [ + "roles" + ] + }, + "get": { + "operationId": "%2Fapi%2Fsecurity%2Frole%2F%7Bname%7D#0", + "parameters": [ + { + "description": "The version of the API to use", + "in": "header", + "name": "elastic-api-version", + "schema": { + "default": "2023-10-31", + "enum": [ + "2023-10-31" + ], + "type": "string" + } + }, + { + "in": "path", + "name": "name", + "required": true, + "schema": { + "minLength": 1, + "type": "string" + } + }, + { + "in": "query", + "name": "replaceDeprecatedPrivileges", + "required": false, + "schema": { + "type": "boolean" + } + } + ], + "responses": {}, + "summary": "Get a role", + "tags": [ + "roles" + ] + }, + "put": { + "operationId": "%2Fapi%2Fsecurity%2Frole%2F%7Bname%7D#2", + "parameters": [ + { + "description": "The version of the API to use", + "in": "header", + "name": "elastic-api-version", + "schema": { + "default": "2023-10-31", + "enum": [ + "2023-10-31" + ], + "type": "string" + } + }, + { + "description": "A required header to protect against CSRF attacks", + "in": "header", + "name": "kbn-xsrf", + "required": true, + "schema": { + "example": "true", + "type": "string" + } + }, + { + "in": "path", + "name": "name", + "required": true, + "schema": { + "maxLength": 1024, + "minLength": 1, + "type": "string" + } + }, + { + "in": "query", + "name": "createOnly", + "required": false, + "schema": { + "default": false, + "type": "boolean" + } + } + ], + "requestBody": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "description": { + "maxLength": 2048, + "type": "string" + }, + "elasticsearch": { + "additionalProperties": false, + "properties": { + "cluster": { + "items": { + "type": "string" + }, + "type": "array" + }, + "indices": { + "items": { + "additionalProperties": false, + "properties": { + "allow_restricted_indices": { + "type": "boolean" + }, + "field_security": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + }, + "names": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "privileges": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "query": { + "type": "string" + } + }, + "required": [ + "names", + "privileges" + ], + "type": "object" + }, + "type": "array" + }, + "remote_cluster": { + "items": { + "additionalProperties": false, + "properties": { + "clusters": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "privileges": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "privileges", + "clusters" + ], + "type": "object" + }, + "type": "array" + }, + "remote_indices": { + "items": { + "additionalProperties": false, + "properties": { + "allow_restricted_indices": { + "type": "boolean" + }, + "clusters": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "field_security": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + }, + "names": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "privileges": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "query": { + "type": "string" + } + }, + "required": [ + "clusters", + "names", + "privileges" + ], + "type": "object" + }, + "type": "array" + }, + "run_as": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "kibana": { + "items": { + "additionalProperties": false, + "properties": { + "base": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "boolean" + }, + { + "type": "number" + }, + { + "type": "object" + }, + { + "type": "string" + } + ], + "nullable": true, + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "feature": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + }, + "spaces": { + "anyOf": [ + { + "items": { + "enum": [ + "*" + ], + "type": "string" + }, + "maxItems": 1, + "minItems": 1, + "type": "array" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ], + "default": [ + "*" + ] + } + }, + "required": [ + "base" + ], + "type": "object" + }, + "type": "array" + }, + "metadata": { + "additionalProperties": {}, + "type": "object" + } + }, + "required": [ + "elasticsearch" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "summary": "Create or update a role", + "tags": [ + "roles" + ] + } + }, + "/api/security/roles": { + "post": { + "operationId": "%2Fapi%2Fsecurity%2Froles#0", + "parameters": [ + { + "description": "The version of the API to use", + "in": "header", + "name": "elastic-api-version", + "schema": { + "default": "2023-10-31", + "enum": [ + "2023-10-31" + ], + "type": "string" + } + }, + { + "description": "A required header to protect against CSRF attacks", + "in": "header", + "name": "kbn-xsrf", + "required": true, + "schema": { + "example": "true", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json; Elastic-Api-Version=2023-10-31": { + "schema": { + "additionalProperties": false, + "properties": { + "roles": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "description": { + "maxLength": 2048, + "type": "string" + }, + "elasticsearch": { + "additionalProperties": false, + "properties": { + "cluster": { + "items": { + "type": "string" + }, + "type": "array" + }, + "indices": { + "items": { + "additionalProperties": false, + "properties": { + "allow_restricted_indices": { + "type": "boolean" + }, + "field_security": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + }, + "names": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "privileges": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "query": { + "type": "string" + } + }, + "required": [ + "names", + "privileges" + ], + "type": "object" + }, + "type": "array" + }, + "remote_cluster": { + "items": { + "additionalProperties": false, + "properties": { + "clusters": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "privileges": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "privileges", + "clusters" + ], + "type": "object" + }, + "type": "array" + }, + "remote_indices": { + "items": { + "additionalProperties": false, + "properties": { + "allow_restricted_indices": { + "type": "boolean" + }, + "clusters": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "field_security": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + }, + "names": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "privileges": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "query": { + "type": "string" + } + }, + "required": [ + "clusters", + "names", + "privileges" + ], + "type": "object" + }, + "type": "array" + }, + "run_as": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "kibana": { + "items": { + "additionalProperties": false, + "properties": { + "base": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "boolean" + }, + { + "type": "number" + }, + { + "type": "object" + }, + { + "type": "string" + } + ], + "nullable": true, + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "feature": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + }, + "spaces": { + "anyOf": [ + { + "items": { + "enum": [ + "*" + ], + "type": "string" + }, + "maxItems": 1, + "minItems": 1, + "type": "array" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ], + "default": [ + "*" + ] + } + }, + "required": [ + "base" + ], + "type": "object" + }, + "type": "array" + }, + "metadata": { + "additionalProperties": {}, + "type": "object" + } + }, + "required": [ + "elasticsearch" + ], + "type": "object" + }, + "type": "object" + } + }, + "required": [ + "roles" + ], + "type": "object" + } + } + } + }, + "responses": {}, + "summary": "Create or update roles", + "tags": [ + "roles" + ] + } + }, "/api/spaces/space": { "get": { "operationId": "%2Fapi%2Fspaces%2Fspace#0", @@ -41493,6 +42184,9 @@ { "name": "Message Signing Service" }, + { + "name": "roles" + }, { "name": "spaces" }, diff --git a/oas_docs/output/kibana.serverless.staging.yaml b/oas_docs/output/kibana.serverless.staging.yaml index acbbdd7bfca43..d1ca7e16557e8 100644 --- a/oas_docs/output/kibana.serverless.staging.yaml +++ b/oas_docs/output/kibana.serverless.staging.yaml @@ -36556,6 +36556,456 @@ paths: tags: - Security AI Assistant API - Prompts API + /api/security/role: + get: + operationId: '%2Fapi%2Fsecurity%2Frole#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - in: query + name: replaceDeprecatedPrivileges + required: false + schema: + type: boolean + responses: {} + summary: Get all roles + tags: + - roles + /api/security/role/{name}: + delete: + operationId: '%2Fapi%2Fsecurity%2Frole%2F%7Bname%7D#1' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - in: path + name: name + required: true + schema: + minLength: 1 + type: string + responses: {} + summary: Delete a role + tags: + - roles + get: + operationId: '%2Fapi%2Fsecurity%2Frole%2F%7Bname%7D#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - in: path + name: name + required: true + schema: + minLength: 1 + type: string + - in: query + name: replaceDeprecatedPrivileges + required: false + schema: + type: boolean + responses: {} + summary: Get a role + tags: + - roles + put: + operationId: '%2Fapi%2Fsecurity%2Frole%2F%7Bname%7D#2' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - in: path + name: name + required: true + schema: + maxLength: 1024 + minLength: 1 + type: string + - in: query + name: createOnly + required: false + schema: + default: false + type: boolean + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + description: + maxLength: 2048 + type: string + elasticsearch: + additionalProperties: false + type: object + properties: + cluster: + items: + type: string + type: array + indices: + items: + additionalProperties: false + type: object + properties: + allow_restricted_indices: + type: boolean + field_security: + additionalProperties: + items: + type: string + type: array + type: object + names: + items: + type: string + minItems: 1 + type: array + privileges: + items: + type: string + minItems: 1 + type: array + query: + type: string + required: + - names + - privileges + type: array + remote_cluster: + items: + additionalProperties: false + type: object + properties: + clusters: + items: + type: string + minItems: 1 + type: array + privileges: + items: + type: string + minItems: 1 + type: array + required: + - privileges + - clusters + type: array + remote_indices: + items: + additionalProperties: false + type: object + properties: + allow_restricted_indices: + type: boolean + clusters: + items: + type: string + minItems: 1 + type: array + field_security: + additionalProperties: + items: + type: string + type: array + type: object + names: + items: + type: string + minItems: 1 + type: array + privileges: + items: + type: string + minItems: 1 + type: array + query: + type: string + required: + - clusters + - names + - privileges + type: array + run_as: + items: + type: string + type: array + kibana: + items: + additionalProperties: false + type: object + properties: + base: + anyOf: + - items: {} + type: array + - type: boolean + - type: number + - type: object + - type: string + nullable: true + oneOf: + - items: + type: string + type: array + - items: + type: string + type: array + feature: + additionalProperties: + items: + type: string + type: array + type: object + spaces: + anyOf: + - items: + enum: + - '*' + type: string + maxItems: 1 + minItems: 1 + type: array + - items: + type: string + type: array + default: + - '*' + required: + - base + type: array + metadata: + additionalProperties: {} + type: object + required: + - elasticsearch + responses: {} + summary: Create or update a role + tags: + - roles + /api/security/roles: + post: + operationId: '%2Fapi%2Fsecurity%2Froles#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + roles: + additionalProperties: + additionalProperties: false + type: object + properties: + description: + maxLength: 2048 + type: string + elasticsearch: + additionalProperties: false + type: object + properties: + cluster: + items: + type: string + type: array + indices: + items: + additionalProperties: false + type: object + properties: + allow_restricted_indices: + type: boolean + field_security: + additionalProperties: + items: + type: string + type: array + type: object + names: + items: + type: string + minItems: 1 + type: array + privileges: + items: + type: string + minItems: 1 + type: array + query: + type: string + required: + - names + - privileges + type: array + remote_cluster: + items: + additionalProperties: false + type: object + properties: + clusters: + items: + type: string + minItems: 1 + type: array + privileges: + items: + type: string + minItems: 1 + type: array + required: + - privileges + - clusters + type: array + remote_indices: + items: + additionalProperties: false + type: object + properties: + allow_restricted_indices: + type: boolean + clusters: + items: + type: string + minItems: 1 + type: array + field_security: + additionalProperties: + items: + type: string + type: array + type: object + names: + items: + type: string + minItems: 1 + type: array + privileges: + items: + type: string + minItems: 1 + type: array + query: + type: string + required: + - clusters + - names + - privileges + type: array + run_as: + items: + type: string + type: array + kibana: + items: + additionalProperties: false + type: object + properties: + base: + anyOf: + - items: {} + type: array + - type: boolean + - type: number + - type: object + - type: string + nullable: true + oneOf: + - items: + type: string + type: array + - items: + type: string + type: array + feature: + additionalProperties: + items: + type: string + type: array + type: object + spaces: + anyOf: + - items: + enum: + - '*' + type: string + maxItems: 1 + minItems: 1 + type: array + - items: + type: string + type: array + default: + - '*' + required: + - base + type: array + metadata: + additionalProperties: {} + type: object + required: + - elasticsearch + type: object + required: + - roles + responses: {} + summary: Create or update roles + tags: + - roles /api/spaces/space: get: operationId: '%2Fapi%2Fspaces%2Fspace#0' @@ -51504,6 +51954,7 @@ tags: - name: Message Signing Service - description: Machine learning name: ml + - name: roles - description: > Export sets of saved objects that you want to import into {kib}, resolve import errors, and rotate an encryption key for encrypted saved objects diff --git a/oas_docs/output/kibana.serverless.yaml b/oas_docs/output/kibana.serverless.yaml index acbbdd7bfca43..d1ca7e16557e8 100644 --- a/oas_docs/output/kibana.serverless.yaml +++ b/oas_docs/output/kibana.serverless.yaml @@ -36556,6 +36556,456 @@ paths: tags: - Security AI Assistant API - Prompts API + /api/security/role: + get: + operationId: '%2Fapi%2Fsecurity%2Frole#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - in: query + name: replaceDeprecatedPrivileges + required: false + schema: + type: boolean + responses: {} + summary: Get all roles + tags: + - roles + /api/security/role/{name}: + delete: + operationId: '%2Fapi%2Fsecurity%2Frole%2F%7Bname%7D#1' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - in: path + name: name + required: true + schema: + minLength: 1 + type: string + responses: {} + summary: Delete a role + tags: + - roles + get: + operationId: '%2Fapi%2Fsecurity%2Frole%2F%7Bname%7D#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - in: path + name: name + required: true + schema: + minLength: 1 + type: string + - in: query + name: replaceDeprecatedPrivileges + required: false + schema: + type: boolean + responses: {} + summary: Get a role + tags: + - roles + put: + operationId: '%2Fapi%2Fsecurity%2Frole%2F%7Bname%7D#2' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + - in: path + name: name + required: true + schema: + maxLength: 1024 + minLength: 1 + type: string + - in: query + name: createOnly + required: false + schema: + default: false + type: boolean + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + description: + maxLength: 2048 + type: string + elasticsearch: + additionalProperties: false + type: object + properties: + cluster: + items: + type: string + type: array + indices: + items: + additionalProperties: false + type: object + properties: + allow_restricted_indices: + type: boolean + field_security: + additionalProperties: + items: + type: string + type: array + type: object + names: + items: + type: string + minItems: 1 + type: array + privileges: + items: + type: string + minItems: 1 + type: array + query: + type: string + required: + - names + - privileges + type: array + remote_cluster: + items: + additionalProperties: false + type: object + properties: + clusters: + items: + type: string + minItems: 1 + type: array + privileges: + items: + type: string + minItems: 1 + type: array + required: + - privileges + - clusters + type: array + remote_indices: + items: + additionalProperties: false + type: object + properties: + allow_restricted_indices: + type: boolean + clusters: + items: + type: string + minItems: 1 + type: array + field_security: + additionalProperties: + items: + type: string + type: array + type: object + names: + items: + type: string + minItems: 1 + type: array + privileges: + items: + type: string + minItems: 1 + type: array + query: + type: string + required: + - clusters + - names + - privileges + type: array + run_as: + items: + type: string + type: array + kibana: + items: + additionalProperties: false + type: object + properties: + base: + anyOf: + - items: {} + type: array + - type: boolean + - type: number + - type: object + - type: string + nullable: true + oneOf: + - items: + type: string + type: array + - items: + type: string + type: array + feature: + additionalProperties: + items: + type: string + type: array + type: object + spaces: + anyOf: + - items: + enum: + - '*' + type: string + maxItems: 1 + minItems: 1 + type: array + - items: + type: string + type: array + default: + - '*' + required: + - base + type: array + metadata: + additionalProperties: {} + type: object + required: + - elasticsearch + responses: {} + summary: Create or update a role + tags: + - roles + /api/security/roles: + post: + operationId: '%2Fapi%2Fsecurity%2Froles#0' + parameters: + - description: The version of the API to use + in: header + name: elastic-api-version + schema: + default: '2023-10-31' + enum: + - '2023-10-31' + type: string + - description: A required header to protect against CSRF attacks + in: header + name: kbn-xsrf + required: true + schema: + example: 'true' + type: string + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + additionalProperties: false + type: object + properties: + roles: + additionalProperties: + additionalProperties: false + type: object + properties: + description: + maxLength: 2048 + type: string + elasticsearch: + additionalProperties: false + type: object + properties: + cluster: + items: + type: string + type: array + indices: + items: + additionalProperties: false + type: object + properties: + allow_restricted_indices: + type: boolean + field_security: + additionalProperties: + items: + type: string + type: array + type: object + names: + items: + type: string + minItems: 1 + type: array + privileges: + items: + type: string + minItems: 1 + type: array + query: + type: string + required: + - names + - privileges + type: array + remote_cluster: + items: + additionalProperties: false + type: object + properties: + clusters: + items: + type: string + minItems: 1 + type: array + privileges: + items: + type: string + minItems: 1 + type: array + required: + - privileges + - clusters + type: array + remote_indices: + items: + additionalProperties: false + type: object + properties: + allow_restricted_indices: + type: boolean + clusters: + items: + type: string + minItems: 1 + type: array + field_security: + additionalProperties: + items: + type: string + type: array + type: object + names: + items: + type: string + minItems: 1 + type: array + privileges: + items: + type: string + minItems: 1 + type: array + query: + type: string + required: + - clusters + - names + - privileges + type: array + run_as: + items: + type: string + type: array + kibana: + items: + additionalProperties: false + type: object + properties: + base: + anyOf: + - items: {} + type: array + - type: boolean + - type: number + - type: object + - type: string + nullable: true + oneOf: + - items: + type: string + type: array + - items: + type: string + type: array + feature: + additionalProperties: + items: + type: string + type: array + type: object + spaces: + anyOf: + - items: + enum: + - '*' + type: string + maxItems: 1 + minItems: 1 + type: array + - items: + type: string + type: array + default: + - '*' + required: + - base + type: array + metadata: + additionalProperties: {} + type: object + required: + - elasticsearch + type: object + required: + - roles + responses: {} + summary: Create or update roles + tags: + - roles /api/spaces/space: get: operationId: '%2Fapi%2Fspaces%2Fspace#0' @@ -51504,6 +51954,7 @@ tags: - name: Message Signing Service - description: Machine learning name: ml + - name: roles - description: > Export sets of saved objects that you want to import into {kib}, resolve import errors, and rotate an encryption key for encrypted saved objects diff --git a/x-pack/plugins/security/server/config.test.ts b/x-pack/plugins/security/server/config.test.ts index f5a735fdfe8b7..2e2199ff850a1 100644 --- a/x-pack/plugins/security/server/config.test.ts +++ b/x-pack/plugins/security/server/config.test.ts @@ -247,7 +247,7 @@ describe('config schema', () => { }, "loginAssistanceMessage": "", "public": Object {}, - "roleManagementEnabled": false, + "roleManagementEnabled": true, "secureCookies": false, "session": Object { "cleanupInterval": "PT1H", diff --git a/x-pack/plugins/security/server/config.ts b/x-pack/plugins/security/server/config.ts index 5618186459566..8be1500bdccf1 100644 --- a/x-pack/plugins/security/server/config.ts +++ b/x-pack/plugins/security/server/config.ts @@ -303,8 +303,9 @@ export const ConfigSchema = schema.object({ ), }), + // config/serverless.oblt.yml contains an override to false for OBLT projects roleManagementEnabled: offeringBasedSchema({ - serverless: schema.boolean({ defaultValue: false }), + serverless: schema.boolean({ defaultValue: true }), }), // Setting only allowed in the Serverless offering diff --git a/x-pack/plugins/serverless/public/plugin.tsx b/x-pack/plugins/serverless/public/plugin.tsx index ee2b32e4d97a5..82578123452e7 100644 --- a/x-pack/plugins/serverless/public/plugin.tsx +++ b/x-pack/plugins/serverless/public/plugin.tsx @@ -125,7 +125,7 @@ export class ServerlessPlugin getNavigationCards: (roleManagementEnabled, extendCardNavDefinitions) => { if (!roleManagementEnabled) return extendCardNavDefinitions; - const manageOrgMembersNavCard = generateManageOrgMembersNavCard(cloud.organizationUrl); + const manageOrgMembersNavCard = generateManageOrgMembersNavCard(cloud.usersAndRolesUrl); if (extendCardNavDefinitions) { extendCardNavDefinitions[manageOrgMembersNavCardName] = manageOrgMembersNavCard; return extendCardNavDefinitions; diff --git a/x-pack/test/api_integration/deployment_agnostic/default_configs/serverless.config.base.ts b/x-pack/test/api_integration/deployment_agnostic/default_configs/serverless.config.base.ts index f73af3a6d4bf7..e7df37f5aa312 100644 --- a/x-pack/test/api_integration/deployment_agnostic/default_configs/serverless.config.base.ts +++ b/x-pack/test/api_integration/deployment_agnostic/default_configs/serverless.config.base.ts @@ -113,10 +113,6 @@ export function createServerlessTestConfig { - supertestAdminWithApiKey = await roleScopedSupertest.getSupertestWithRoleScope('admin', { - withCommonHeaders: true, - }); - supertestAdminWithCookieCredentials = await roleScopedSupertest.getSupertestWithRoleScope( - 'admin', - { - useCookieHeader: true, - withInternalHeaders: true, - } - ); - }); - after(async () => { - // delete any lingering spaces - const { body } = await supertestAdminWithApiKey.get('/api/spaces/space').send().expect(200); - - const toDelete = (body as Array<{ id: string }>).filter((f) => f.id !== 'default'); - - await asyncForEach(toDelete, async (space) => { - await deleteSpace(space.id); - }); - - await supertestAdminWithApiKey.destroy(); - }); - - describe('Create (POST /api/spaces/space)', () => { - it('should allow us to create a space', async () => { - await supertestAdminWithApiKey - .post('/api/spaces/space') - .send({ - id: 'custom_space_1', - name: 'custom_space_1', - disabledFeatures: [], - }) - .expect(200); - }); - - it('should not allow us to create a space with disabled features', async () => { - await supertestAdminWithApiKey - .post('/api/spaces/space') - .send({ - id: 'custom_space_2', - name: 'custom_space_2', - disabledFeatures: ['discover'], - }) - .expect(400); - }); - }); - - describe('Read (GET /api/spaces/space)', () => { - before(async () => { - await createSpace('space_to_get_1'); - await createSpace('space_to_get_2'); - await createSpace('space_to_get_3'); - }); - - after(async () => { - await deleteSpace('space_to_get_1'); - await deleteSpace('space_to_get_2'); - await deleteSpace('space_to_get_3'); - }); - - it('should allow us to get a space', async () => { - await supertestAdminWithApiKey.get('/api/spaces/space/space_to_get_1').send().expect(200, { - id: 'space_to_get_1', - name: 'space_to_get_1', - disabledFeatures: [], - }); - }); - - it('should allow us to get all spaces', async () => { - const { body } = await supertestAdminWithApiKey.get('/api/spaces/space').send().expect(200); - - expect(body).toEqual( - expect.arrayContaining([ - { - _reserved: true, - color: '#00bfb3', - description: 'This is your default space!', - disabledFeatures: [], - id: 'default', - name: 'Default', - }, - { id: 'space_to_get_1', name: 'space_to_get_1', disabledFeatures: [] }, - { id: 'space_to_get_2', name: 'space_to_get_2', disabledFeatures: [] }, - { id: 'space_to_get_3', name: 'space_to_get_3', disabledFeatures: [] }, - ]) - ); - }); - }); - - describe('Update (PUT /api/spaces/space)', () => { - before(async () => { - await createSpace('space_to_update'); - }); - - after(async () => { - await deleteSpace('space_to_update'); - }); - - it('should allow us to update a space', async () => { - await supertestAdminWithApiKey - .put('/api/spaces/space/space_to_update') - .send({ - id: 'space_to_update', - name: 'some new name', - initials: 'SN', - disabledFeatures: [], - }) - .expect(200); - - await supertestAdminWithApiKey.get('/api/spaces/space/space_to_update').send().expect(200, { - id: 'space_to_update', - name: 'some new name', - initials: 'SN', - disabledFeatures: [], - }); - }); - - it('should not allow us to update a space with disabled features', async () => { - await supertestAdminWithApiKey - .put('/api/spaces/space/space_to_update') - .send({ - id: 'space_to_update', - name: 'some new name', - initials: 'SN', - disabledFeatures: ['discover'], - }) - .expect(400); - }); - }); - - describe('Delete (DELETE /api/spaces/space)', () => { - it('should allow us to delete a space', async () => { - await createSpace('space_to_delete'); - - await supertestAdminWithApiKey.delete(`/api/spaces/space/space_to_delete`).expect(204); - }); - }); - - describe('Get active space (GET /internal/spaces/_active_space)', () => { - before(async () => { - await createSpace('foo-space'); - }); - - after(async () => { - await deleteSpace('foo-space'); - }); - - it('returns the default space', async () => { - const response = await supertestAdminWithCookieCredentials - .get('/internal/spaces/_active_space') - .expect(200); - - const { id, name, _reserved } = response.body; - expect({ id, name, _reserved }).toEqual({ - id: 'default', - name: 'Default', - _reserved: true, - }); - }); - - it('returns the default space when explicitly referenced', async () => { - const response = await supertestAdminWithCookieCredentials - .get('/s/default/internal/spaces/_active_space') - .expect(200); - - const { id, name, _reserved } = response.body; - expect({ id, name, _reserved }).toEqual({ - id: 'default', - name: 'Default', - _reserved: true, - }); - }); - - it('returns the foo space', async () => { - await supertestAdminWithCookieCredentials - .get('/s/foo-space/internal/spaces/_active_space') - .expect(200, { - id: 'foo-space', - name: 'foo-space', - disabledFeatures: [], - }); - }); - - it('returns 404 when the space is not found', async () => { - await supertestAdminWithCookieCredentials - .get('/s/not-found-space/internal/spaces/_active_space') - .expect(404, { - statusCode: 404, - error: 'Not Found', - message: 'Saved object [space/not-found-space] not found', - }); - }); - }); - - // These tests just test access to API endpoints, in this case - // when accessed without internal headers they will return 400 - // They will be included in deployment agnostic testing once spaces - // are enabled in production. - describe(`Access`, () => { - describe(`internal`, () => { - it('#getActiveSpace requires internal header', async () => { - let body: any; - let status: number; - - ({ body, status } = await supertestAdminWithApiKey - .get('/internal/spaces/_active_space') - .set(samlAuth.getCommonRequestHeader())); - // expect a rejection because we're not using the internal header - expect(body).toEqual({ - statusCode: 400, - error: 'Bad Request', - message: expect.stringContaining( - 'method [get] exists but is not available with the current configuration' - ), - }); - expect(status).toBe(400); - - ({ body, status } = await supertestAdminWithApiKey - .get('/internal/spaces/_active_space') - .set(samlAuth.getInternalRequestHeader())); - // expect success because we're using the internal header - expect(body).toEqual( - expect.objectContaining({ - id: 'default', - }) - ); - expect(status).toBe(200); - }); - - it('#copyToSpace requires internal header', async () => { - let body: any; - let status: number; - - ({ body, status } = await supertestAdminWithApiKey.post( - '/api/spaces/_copy_saved_objects' - )); - // expect a rejection because we're not using the internal header - expect(body).toEqual({ - statusCode: 400, - error: 'Bad Request', - message: expect.stringContaining( - 'method [post] exists but is not available with the current configuration' - ), - }); - - ({ body, status } = await supertestAdminWithApiKey - .post('/api/spaces/_copy_saved_objects') - .set(samlAuth.getInternalRequestHeader())); - - svlCommonApi.assertResponseStatusCode(400, status, body); - - // expect 400 for missing body - expect(body).toEqual({ - statusCode: 400, - error: 'Bad Request', - message: '[request body]: expected a plain object value, but found [null] instead.', - }); - }); - - it('#resolveCopyToSpaceErrors requires internal header', async () => { - let body: any; - let status: number; - - ({ body, status } = await supertestAdminWithApiKey.post( - '/api/spaces/_resolve_copy_saved_objects_errors' - )); - // expect a rejection because we're not using the internal header - expect(body).toEqual({ - statusCode: 400, - error: 'Bad Request', - message: expect.stringContaining( - 'method [post] exists but is not available with the current configuration' - ), - }); - - ({ body, status } = await supertestAdminWithApiKey - .post('/api/spaces/_resolve_copy_saved_objects_errors') - .set(samlAuth.getInternalRequestHeader())); - - svlCommonApi.assertResponseStatusCode(400, status, body); - - // expect 400 for missing body - expect(body).toEqual({ - statusCode: 400, - error: 'Bad Request', - message: '[request body]: expected a plain object value, but found [null] instead.', - }); - }); - - it('#updateObjectsSpaces requires internal header', async () => { - let body: any; - let status: number; - - ({ body, status } = await supertestAdminWithApiKey.post( - '/api/spaces/_update_objects_spaces' - )); - // expect a rejection because we're not using the internal header - expect(body).toEqual({ - statusCode: 400, - error: 'Bad Request', - message: expect.stringContaining( - 'method [post] exists but is not available with the current configuration' - ), - }); - - ({ body, status } = await supertestAdminWithApiKey - .post('/api/spaces/_update_objects_spaces') - .set(samlAuth.getInternalRequestHeader())); - - svlCommonApi.assertResponseStatusCode(400, status, body); - - // expect 400 for missing body - expect(body).toEqual({ - statusCode: 400, - error: 'Bad Request', - message: '[request body]: expected a plain object value, but found [null] instead.', - }); - }); - - it('#getShareableReferences requires internal header', async () => { - let body: any; - let status: number; - - ({ body, status } = await supertestAdminWithApiKey.post( - '/api/spaces/_get_shareable_references' - )); - // expect a rejection because we're not using the internal header - expect(body).toEqual({ - statusCode: 400, - error: 'Bad Request', - message: expect.stringContaining( - 'method [post] exists but is not available with the current configuration' - ), - }); - - ({ body, status } = await supertestAdminWithApiKey - .post('/api/spaces/_get_shareable_references') - .set(samlAuth.getInternalRequestHeader()) - .send({ - objects: [{ type: 'a', id: 'a' }], - })); - - svlCommonApi.assertResponseStatusCode(200, status, body); - }); - }); - - describe(`disabled`, () => { - it('#disableLegacyUrlAliases', async () => { - const { body, status } = await supertestAdminWithApiKey.post( - '/api/spaces/_disable_legacy_url_aliases' - ); - // without a request body we would normally a 400 bad request if the endpoint was registered - svlCommonApi.assertApiNotFound(body, status); - }); - }); - }); - }); -} diff --git a/x-pack/test_serverless/api_integration/test_suites/common/management/spaces.ts b/x-pack/test_serverless/api_integration/test_suites/common/management/spaces.ts index 4bde897e714af..000848fd37e5f 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/management/spaces.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/management/spaces.ts @@ -7,6 +7,7 @@ import expect from 'expect'; import { SupertestWithRoleScopeType } from '@kbn/test-suites-xpack/api_integration/deployment_agnostic/services'; +import { asyncForEach } from '@kbn/std'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { @@ -16,6 +17,21 @@ export default function ({ getService }: FtrProviderContext) { let supertestAdminWithApiKey: SupertestWithRoleScopeType; let supertestAdminWithCookieCredentials: SupertestWithRoleScopeType; + async function createSpace(id: string) { + await supertestAdminWithApiKey + .post('/api/spaces/space') + .send({ + id, + name: id, + disabledFeatures: [], + }) + .expect(200); + } + + async function deleteSpace(id: string) { + await supertestAdminWithApiKey.delete(`/api/spaces/space/${id}`).expect(204); + } + describe('spaces', function () { before(async () => { // admin is the only predefined role that will work for all 3 solutions @@ -34,76 +50,212 @@ export default function ({ getService }: FtrProviderContext) { await supertestAdminWithApiKey.destroy(); }); - describe('route access', () => { - describe('public (CRUD)', () => { - // Skipped due to change in QA environment for role management and spaces - // TODO: revisit once the change is rolled out to all environments - it.skip('#create', async () => { - const { body, status } = await supertestAdminWithApiKey.post('/api/spaces/space').send({ - id: 'custom', - name: 'Custom', - disabledFeatures: [], - }); + // The create and update test cases are unique to serverless because + // setting feature visibility is not possible in serverless + describe('CRUD', () => { + after(async () => { + // delete any lingering spaces + const { body } = await supertestAdminWithApiKey.get('/api/spaces/space').send().expect(200); - svlCommonApi.assertResponseStatusCode(400, status, body); + const toDelete = (body as Array<{ id: string }>).filter((f) => f.id !== 'default'); - // Should fail due to maximum spaces limit, not because of lacking internal header - expect(body).toEqual({ - statusCode: 400, - error: 'Bad Request', - message: - 'Unable to create Space, this exceeds the maximum number of spaces set by the xpack.spaces.maxSpaces setting', - }); + await asyncForEach(toDelete, async (space) => { + await deleteSpace(space.id); }); + }); - it('#get', async () => { - const { body, status } = await supertestAdminWithApiKey.get('/api/spaces/space/default'); - // expect success because we're using the internal header - expect(body).toEqual(expect.objectContaining({ id: 'default' })); - expect(status).toBe(200); + describe('Create (POST /api/spaces/space)', () => { + it('should allow us to create a space', async () => { + await supertestAdminWithApiKey + .post('/api/spaces/space') + .send({ + id: 'custom_space_1', + name: 'custom_space_1', + disabledFeatures: [], + }) + .expect(200); }); - it('#getAll', async () => { - const { body, status } = await supertestAdminWithApiKey.get('/api/spaces/space'); - // expect success because we're using the internal header + it('should not allow us to create a space with disabled features', async () => { + await supertestAdminWithApiKey + .post('/api/spaces/space') + .send({ + id: 'custom_space_2', + name: 'custom_space_2', + disabledFeatures: ['discover'], + }) + .expect(400); + }); + }); + + describe('Read (GET /api/spaces/space)', () => { + before(async () => { + await createSpace('space_to_get_1'); + await createSpace('space_to_get_2'); + await createSpace('space_to_get_3'); + }); + + after(async () => { + await deleteSpace('space_to_get_1'); + await deleteSpace('space_to_get_2'); + await deleteSpace('space_to_get_3'); + }); + + it('should allow us to get a space', async () => { + await supertestAdminWithApiKey + .get('/api/spaces/space/space_to_get_1') + .send() + .expect(200, { + id: 'space_to_get_1', + name: 'space_to_get_1', + disabledFeatures: [], + }); + }); + + it('should allow us to get all spaces', async () => { + const { body } = await supertestAdminWithApiKey + .get('/api/spaces/space') + .send() + .expect(200); + expect(body).toEqual( expect.arrayContaining([ - expect.objectContaining({ + { + _reserved: true, + color: '#00bfb3', + description: 'This is your default space!', + disabledFeatures: [], id: 'default', - }), + name: 'Default', + }, + { id: 'space_to_get_1', name: 'space_to_get_1', disabledFeatures: [] }, + { id: 'space_to_get_2', name: 'space_to_get_2', disabledFeatures: [] }, + { id: 'space_to_get_3', name: 'space_to_get_3', disabledFeatures: [] }, ]) ); - expect(status).toBe(200); }); + }); - it('#update', async () => { - const { body, status } = await supertestAdminWithApiKey - .put('/api/spaces/space/default') + describe('Update (PUT /api/spaces/space)', () => { + before(async () => { + await createSpace('space_to_update'); + }); + + after(async () => { + await deleteSpace('space_to_update'); + }); + + it('should allow us to update a space', async () => { + await supertestAdminWithApiKey + .put('/api/spaces/space/space_to_update') .send({ - id: 'default', - name: 'UPDATED!', + id: 'space_to_update', + name: 'some new name', + initials: 'SN', + disabledFeatures: [], + }) + .expect(200); + + await supertestAdminWithApiKey + .get('/api/spaces/space/space_to_update') + .send() + .expect(200, { + id: 'space_to_update', + name: 'some new name', + initials: 'SN', disabledFeatures: [], }); + }); - svlCommonApi.assertResponseStatusCode(200, status, body); + it('should not allow us to update a space with disabled features', async () => { + await supertestAdminWithApiKey + .put('/api/spaces/space/space_to_update') + .send({ + id: 'space_to_update', + name: 'some new name', + initials: 'SN', + disabledFeatures: ['discover'], + }) + .expect(400); }); + }); - it('#delete', async () => { - const { body, status } = await supertestAdminWithApiKey.delete( - '/api/spaces/space/default' - ); + describe('Delete (DELETE /api/spaces/space)', () => { + it('should allow us to delete a space', async () => { + await createSpace('space_to_delete'); - svlCommonApi.assertResponseStatusCode(400, status, body); + await supertestAdminWithApiKey.delete(`/api/spaces/space/space_to_delete`).expect(204); + }); + }); - // 400 with specific reason - cannot delete the default space - expect(body).toEqual({ - statusCode: 400, - error: 'Bad Request', - message: 'The default space cannot be deleted because it is reserved.', + describe('Get active space (GET /internal/spaces/_active_space)', () => { + before(async () => { + await createSpace('foo-space'); + }); + + after(async () => { + await deleteSpace('foo-space'); + }); + + it('returns the default space', async () => { + const response = await supertestAdminWithCookieCredentials + .get('/internal/spaces/_active_space') + .set(samlAuth.getInternalRequestHeader()) + .expect(200); + + const { id, name, _reserved } = response.body; + expect({ id, name, _reserved }).toEqual({ + id: 'default', + name: 'Default', + _reserved: true, }); }); + + it('returns the default space when explicitly referenced', async () => { + const response = await supertestAdminWithCookieCredentials + .get('/s/default/internal/spaces/_active_space') + .set(samlAuth.getInternalRequestHeader()) + .expect(200); + + const { id, name, _reserved } = response.body; + expect({ id, name, _reserved }).toEqual({ + id: 'default', + name: 'Default', + _reserved: true, + }); + }); + + it('returns the foo space', async () => { + await supertestAdminWithCookieCredentials + .get('/s/foo-space/internal/spaces/_active_space') + .set(samlAuth.getInternalRequestHeader()) + .expect(200, { + id: 'foo-space', + name: 'foo-space', + disabledFeatures: [], + }); + }); + + it('returns 404 when the space is not found', async () => { + await supertestAdminWithCookieCredentials + .get('/s/not-found-space/internal/spaces/_active_space') + .set(samlAuth.getInternalRequestHeader()) + .expect(404, { + statusCode: 404, + error: 'Not Found', + message: 'Saved object [space/not-found-space] not found', + }); + }); }); + }); + describe('route access', () => { + // The 'internal route access' tests check that the internal header + // is needed for these specific endpoints. + // When accessed without internal headers they will return 400. + // They could be moved to deployment agnostic testing if there is + // a way to specify which tests to run when stateful vs serverles, + // as internal vs disabled is different in serverless. describe('internal', () => { it('#getActiveSpace requires internal header', async () => { let body: any; @@ -251,6 +403,7 @@ export default function ({ getService }: FtrProviderContext) { }); }); + // Disabled in serverless, but public in stateful describe('disabled', () => { it('#disableLegacyUrlAliases', async () => { const { body, status } = await supertestAdminWithApiKey @@ -262,26 +415,5 @@ export default function ({ getService }: FtrProviderContext) { }); }); }); - - // TODO: Re-enable test-suite once users can create and update spaces in the Serverless offering. - // it('rejects request to update a space with disabledFeatures', async () => { - // const { body, status } = await supertest - // .put('/api/spaces/space/default') - // .set(svlCommonApi.getInternalRequestHeader()) - // .send({ - // id: 'custom', - // name: 'Custom', - // disabledFeatures: ['some-feature'], - // }); - // - // // in a non-serverless environment this would succeed with a 200 - // expect(body).toEqual({ - // statusCode: 400, - // error: 'Bad Request', - // message: - // 'Unable to update Space, the disabledFeatures array must be empty when xpack.spaces.allowFeatureVisibility setting is disabled', - // }); - // expect(status).toBe(400); - // }); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/common/platform_security/authorization.ts b/x-pack/test_serverless/api_integration/test_suites/common/platform_security/authorization.ts index fab1a6ef6b265..187efa4e860a8 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/platform_security/authorization.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/platform_security/authorization.ts @@ -8,8 +8,21 @@ import expect from 'expect'; import { KibanaFeatureConfig, SubFeaturePrivilegeConfig } from '@kbn/features-plugin/common'; import { SupertestWithRoleScopeType } from '@kbn/test-suites-xpack/api_integration/deployment_agnostic/services'; +import type { Role } from '@kbn/security-plugin-types-common'; import { FtrProviderContext } from '../../../ftr_provider_context'; +/* + * This file contains authorization tests that... + * - are applicable to all peroject types + * - are applicable to only search and security projects, where custom roles are enabled (role CRUD endpoints are enabled): + * - security/authorization/Roles + * - security/authorization/route access/custom roles + * - are applicable to only observability projects, where custom roles are not enabled (role CRUD endpoints are disabled): + * - security/authorization/route access/disabled/oblt only + * + * The test blocks use skip tags to run only the relevant tests per project type. + */ + function collectSubFeaturesPrivileges(feature: KibanaFeatureConfig) { return new Map( feature.subFeatures?.flatMap((subFeature) => @@ -26,13 +39,12 @@ export default function ({ getService }: FtrProviderContext) { const log = getService('log'); const svlCommonApi = getService('svlCommonApi'); const roleScopedSupertest = getService('roleScopedSupertest'); + const es = getService('es'); let supertestAdminWithCookieCredentials: SupertestWithRoleScopeType; let supertestAdminWithApiKey: SupertestWithRoleScopeType; describe('security/authorization', function () { - // see details: https://github.com/elastic/kibana/issues/192282 - this.tags(['failsOnMKI']); - before(async () => { + before(async function () { supertestAdminWithCookieCredentials = await roleScopedSupertest.getSupertestWithRoleScope( 'admin', { @@ -43,76 +55,1004 @@ export default function ({ getService }: FtrProviderContext) { withCommonHeaders: true, }); }); - after(async () => { + after(async function () { await supertestAdminWithApiKey.destroy(); }); - describe('route access', () => { - // skipped, see https://github.com/elastic/kibana/issues/194933 - describe.skip('disabled', () => { - // Skipped due to change in QA environment for role management and spaces - // TODO: revisit once the change is rolled out to all environments - it.skip('get all privileges', async () => { - const { body, status } = await supertestAdminWithApiKey.get('/api/security/privileges'); - svlCommonApi.assertApiNotFound(body, status); + + describe('Roles', function () { + // custom roles are not enabled for observability projects + this.tags(['skipSvlOblt']); + + describe('Create Role', function () { + it('should allow us to create an empty role', async function () { + await supertestAdminWithApiKey.put('/api/security/role/empty_role').send({}).expect(204); }); - // Skipped due to change in QA environment for role management and spaces - // TODO: revisit once the change is rolled out to all environments - it.skip('get built-in elasticsearch privileges', async () => { - const { body, status } = await supertestAdminWithCookieCredentials.get( - '/internal/security/esPrivileges/builtin' - ); - svlCommonApi.assertApiNotFound(body, status); + it('should create a role with kibana and elasticsearch privileges', async function () { + await supertestAdminWithApiKey + .put('/api/security/role/role_with_privileges') + .send({ + metadata: { + foo: 'test-metadata', + }, + elasticsearch: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + }, + ], + }, + kibana: [ + { + base: ['read'], + }, + { + feature: { + dashboard: ['read'], + discover: ['all'], + ml: ['all'], + }, + spaces: ['marketing', 'sales'], + }, + ], + }) + .expect(204); + + const role = await es.security.getRole({ name: 'role_with_privileges' }); + expect(role).toEqual({ + role_with_privileges: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + allow_restricted_indices: false, + }, + ], + applications: [ + { + application: 'kibana-.kibana', + privileges: ['read'], + resources: ['*'], + }, + { + application: 'kibana-.kibana', + privileges: ['feature_dashboard.read', 'feature_discover.all', 'feature_ml.all'], + resources: ['space:marketing', 'space:sales'], + }, + ], + metadata: { + foo: 'test-metadata', + }, + run_as: [], + transient_metadata: { + enabled: true, + }, + }, + }); }); - // Role CRUD APIs are gated behind the xpack.security.roleManagementEnabled config - // setting. This setting is false by default on serverless. When the custom roles - // feature is enabled, this setting will be true, and the tests from - // roles_routes_feature_flag.ts can be moved here to replace these. - it('create/update roleAuthc', async () => { - const { body, status } = await supertestAdminWithApiKey.put('/api/security/role/test'); - svlCommonApi.assertApiNotFound(body, status); + it(`should create a role with kibana and FLS/DLS elasticsearch privileges`, async function () { + await supertestAdminWithApiKey + .put('/api/security/role/role_with_privileges_dls_fls') + .send({ + metadata: { + foo: 'test-metadata', + }, + elasticsearch: { + cluster: ['manage'], + indices: [ + { + field_security: { + grant: ['*'], + except: ['geo.*'], + }, + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + query: `{ "match": { "geo.src": "CN" } }`, + }, + ], + }, + }) + .expect(204); + }); + + // serverless only (stateful will allow) + it(`should not create a role with 'run as' privileges`, async function () { + await supertestAdminWithApiKey + .put('/api/security/role/role_with_privileges') + .send({ + metadata: { + foo: 'test-metadata', + }, + elasticsearch: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + }, + ], + run_as: ['admin'], + }, + kibana: [ + { + base: ['read'], + }, + { + feature: { + dashboard: ['read'], + discover: ['all'], + ml: ['all'], + }, + spaces: ['marketing', 'sales'], + }, + ], + }) + .expect(400); + }); + + // serverless only (stateful will allow) + it(`should not create a role with remote cluster privileges`, async function () { + await supertestAdminWithApiKey + .put('/api/security/role/role_with_privileges') + .send({ + metadata: { + foo: 'test-metadata', + }, + elasticsearch: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + }, + ], + remote_cluster: [ + { + clusters: ['remote_cluster1'], + privileges: ['monitor_enrich'], + }, + ], + }, + kibana: [ + { + base: ['read'], + }, + { + feature: { + dashboard: ['read'], + discover: ['all'], + ml: ['all'], + }, + spaces: ['marketing', 'sales'], + }, + ], + }) + .expect(400); }); - it('get role', async () => { - const { body, status } = await supertestAdminWithApiKey.get( - '/api/security/role/someRole' // mame of the role doesn't matter, we're checking the endpoint doesn't exist + // serverless only (stateful will allow) + it(`should not create a role with remote index privileges`, async function () { + await supertestAdminWithApiKey + .put('/api/security/role/role_with_privileges') + .send({ + metadata: { + foo: 'test-metadata', + }, + elasticsearch: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + }, + ], + remote_indices: [ + { + clusters: ['remote_cluster1'], + names: ['remote_index1', 'remote_index2'], + privileges: ['all'], + }, + ], + }, + kibana: [ + { + base: ['read'], + }, + { + feature: { + dashboard: ['read'], + discover: ['all'], + ml: ['all'], + }, + spaces: ['marketing', 'sales'], + }, + ], + }) + .expect(400); + }); + + describe('with the createOnly option enabled', function () { + it('should fail when role already exists', async function () { + await es.security.putRole({ + name: 'test_role', + body: { + cluster: ['monitor'], + indices: [ + { + names: ['beats-*'], + privileges: ['write'], + }, + ], + }, + }); + + await supertestAdminWithApiKey + .put('/api/security/role/test_role?createOnly=true') + .send({}) + .expect(409); + }); + + it('should succeed when role does not exist', async function () { + await supertestAdminWithApiKey + .put('/api/security/role/new_role?createOnly=true') + .send({}) + .expect(204); + }); + }); + }); + + describe('Read Role', function () { + it('should get roles', async function () { + await es.security.putRole({ + name: 'role_to_get', + body: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + }, + ], + applications: [ + { + application: 'kibana-.kibana', + privileges: ['read'], + resources: ['*'], + }, + { + application: 'kibana-.kibana', + privileges: ['feature_dashboard.read', 'feature_discover.all', 'feature_ml.all'], + resources: ['space:marketing', 'space:sales'], + }, + { + application: 'apm', + privileges: ['apm-privilege'], + resources: ['*'], + }, + ], + metadata: { + foo: 'test-metadata', + }, + transient_metadata: { + enabled: true, + }, + }, + }); + + await supertestAdminWithApiKey.get('/api/security/role/role_to_get').expect(200, { + name: 'role_to_get', + metadata: { + foo: 'test-metadata', + }, + transient_metadata: { enabled: true }, + elasticsearch: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + allow_restricted_indices: false, + }, + ], + run_as: [], + }, + kibana: [ + { + base: ['read'], + feature: {}, + spaces: ['*'], + }, + { + base: [], + feature: { + dashboard: ['read'], + discover: ['all'], + ml: ['all'], + }, + spaces: ['marketing', 'sales'], + }, + ], + + _transform_error: [], + _unrecognized_applications: ['apm'], + }); + }); + + it('should get roles by space id', async function () { + await es.security.putRole({ + name: 'space_role_not_to_get', + body: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + }, + ], + applications: [ + { + application: 'kibana-.kibana', + privileges: ['feature_dashboard.read', 'feature_discover.all', 'feature_ml.all'], + resources: ['space:marketing', 'space:sales'], + }, + ], + metadata: { + foo: 'test-metadata', + }, + transient_metadata: { + enabled: true, + }, + }, + }); + + await es.security.putRole({ + name: 'space_role_to_get', + body: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + }, + ], + applications: [ + { + application: 'kibana-.kibana', + privileges: ['feature_dashboard.read', 'feature_discover.all', 'feature_ml.all'], + resources: ['space:engineering', 'space:sales'], + }, + ], + metadata: { + foo: 'test-metadata', + }, + transient_metadata: { + enabled: true, + }, + }, + }); + + await supertestAdminWithCookieCredentials + .get('/internal/security/roles/engineering') + .set(svlCommonApi.getInternalRequestHeader()) + .expect(200) + .expect((res: { body: Role[] }) => { + const roles = res.body; + + const success = roles.every((role) => { + return ( + role.name !== 'space_role_not_to_get' && + role.kibana.some((privilege) => { + return ( + privilege.spaces.includes('*') || privilege.spaces.includes('engineering') + ); + }) + ); + }); + + const expectedRole = roles.find((role) => role.name === 'space_role_to_get'); + + expect(success).toBe(true); + expect(expectedRole).toBeTruthy(); + }); + }); + }); + + describe('Update Role', function () { + it('should update a role with elasticsearch, kibana and other applications privileges', async function () { + await es.security.putRole({ + name: 'role_to_update', + body: { + cluster: ['monitor'], + indices: [ + { + names: ['beats-*'], + privileges: ['write'], + }, + ], + applications: [ + { + application: 'kibana-.kibana', + privileges: ['read'], + resources: ['*'], + }, + { + application: 'apm', + privileges: ['apm-privilege'], + resources: ['*'], + }, + ], + metadata: { + bar: 'old-metadata', + }, + }, + }); + + await supertestAdminWithApiKey + .put('/api/security/role/role_to_update') + .send({ + metadata: { + foo: 'test-metadata', + }, + elasticsearch: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + }, + ], + }, + kibana: [ + { + feature: { + dashboard: ['read'], + dev_tools: ['all'], + }, + spaces: ['*'], + }, + { + base: ['all'], + spaces: ['marketing', 'sales'], + }, + ], + }) + .expect(204); + + const role = await es.security.getRole({ name: 'role_to_update' }); + expect(role).toEqual({ + role_to_update: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + allow_restricted_indices: false, + }, + ], + applications: [ + { + application: 'kibana-.kibana', + privileges: ['feature_dashboard.read', 'feature_dev_tools.all'], + resources: ['*'], + }, + { + application: 'kibana-.kibana', + privileges: ['space_all'], + resources: ['space:marketing', 'space:sales'], + }, + { + application: 'apm', + privileges: ['apm-privilege'], + resources: ['*'], + }, + ], + metadata: { + foo: 'test-metadata', + }, + run_as: [], + transient_metadata: { + enabled: true, + }, + }, + }); + }); + + it(`should update a role adding DLS and FLS privileges`, async function () { + await es.security.putRole({ + name: 'role_to_update_with_dls_fls', + body: { + cluster: ['monitor'], + indices: [ + { + names: ['beats-*'], + privileges: ['write'], + }, + ], + }, + }); + + await supertestAdminWithApiKey + .put('/api/security/role/role_to_update_with_dls_fls') + .send({ + elasticsearch: { + cluster: ['manage'], + indices: [ + { + field_security: { + grant: ['*'], + except: ['geo.*'], + }, + names: ['logstash-*'], + privileges: ['read'], + query: `{ "match": { "geo.src": "CN" } }`, + }, + ], + }, + }) + .expect(204); + + const role = await es.security.getRole({ name: 'role_to_update_with_dls_fls' }); + + expect(role.role_to_update_with_dls_fls.cluster).toEqual(['manage']); + expect(role.role_to_update_with_dls_fls.indices[0].names).toEqual(['logstash-*']); + expect(role.role_to_update_with_dls_fls.indices[0].query).toEqual( + `{ "match": { "geo.src": "CN" } }` ); - svlCommonApi.assertApiNotFound(body, status); }); - it('get all roles', async () => { - const { body, status } = await supertestAdminWithApiKey.get('/api/security/role'); - svlCommonApi.assertApiNotFound(body, status); + // serverless only (stateful will allow) + it(`should not update a role with 'run as' privileges`, async function () { + await es.security.putRole({ + name: 'role_to_update', + body: { + cluster: ['monitor'], + indices: [ + { + names: ['beats-*'], + privileges: ['write'], + }, + ], + applications: [ + { + application: 'kibana-.kibana', + privileges: ['read'], + resources: ['*'], + }, + { + application: 'apm', + privileges: ['apm-privilege'], + resources: ['*'], + }, + ], + metadata: { + bar: 'old-metadata', + }, + }, + }); + + await supertestAdminWithApiKey + .put('/api/security/role/role_to_update') + .send({ + metadata: { + foo: 'test-metadata', + }, + elasticsearch: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + }, + ], + run_as: ['admin'], + }, + kibana: [ + { + feature: { + dashboard: ['read'], + dev_tools: ['all'], + }, + spaces: ['*'], + }, + { + base: ['all'], + spaces: ['marketing', 'sales'], + }, + ], + }) + .expect(400); + + const role = await es.security.getRole({ name: 'role_to_update' }); + expect(role).toEqual({ + role_to_update: { + cluster: ['monitor'], + indices: [ + { + names: ['beats-*'], + privileges: ['write'], + allow_restricted_indices: false, + }, + ], + applications: [ + { + application: 'kibana-.kibana', + privileges: ['read'], + resources: ['*'], + }, + { + application: 'apm', + privileges: ['apm-privilege'], + resources: ['*'], + }, + ], + metadata: { + bar: 'old-metadata', + }, + run_as: [], + transient_metadata: { + enabled: true, + }, + }, + }); + }); + + // serverless only (stateful will allow) + it(`should not update a role with remote cluster privileges`, async function () { + await es.security.putRole({ + name: 'role_to_update', + body: { + cluster: ['monitor'], + indices: [ + { + names: ['beats-*'], + privileges: ['write'], + }, + ], + applications: [ + { + application: 'kibana-.kibana', + privileges: ['read'], + resources: ['*'], + }, + { + application: 'apm', + privileges: ['apm-privilege'], + resources: ['*'], + }, + ], + metadata: { + bar: 'old-metadata', + }, + }, + }); + + await supertestAdminWithApiKey + .put('/api/security/role/role_to_update') + .send({ + metadata: { + foo: 'test-metadata', + }, + elasticsearch: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + }, + ], + remote_cluster: [ + { + clusters: ['remote_cluster1'], + privileges: ['monitor_enrich'], + }, + ], + }, + kibana: [ + { + feature: { + dashboard: ['read'], + dev_tools: ['all'], + }, + spaces: ['*'], + }, + { + base: ['all'], + spaces: ['marketing', 'sales'], + }, + ], + }) + .expect(400); + + const role = await es.security.getRole({ name: 'role_to_update' }); + expect(role).toEqual({ + role_to_update: { + cluster: ['monitor'], + indices: [ + { + names: ['beats-*'], + privileges: ['write'], + allow_restricted_indices: false, + }, + ], + applications: [ + { + application: 'kibana-.kibana', + privileges: ['read'], + resources: ['*'], + }, + { + application: 'apm', + privileges: ['apm-privilege'], + resources: ['*'], + }, + ], + metadata: { + bar: 'old-metadata', + }, + run_as: [], + transient_metadata: { + enabled: true, + }, + }, + }); }); - it('delete role', async () => { - const { body, status } = await supertestAdminWithApiKey.delete( - '/api/security/role/someRole' // mame of the role doesn't matter, we're checking the endpoint doesn't exist + // serverless only (stateful will allow) + it(`should not update a role with remote index privileges`, async function () { + await es.security.putRole({ + name: 'role_to_update', + body: { + cluster: ['monitor'], + indices: [ + { + names: ['beats-*'], + privileges: ['write'], + }, + ], + applications: [ + { + application: 'kibana-.kibana', + privileges: ['read'], + resources: ['*'], + }, + { + application: 'apm', + privileges: ['apm-privilege'], + resources: ['*'], + }, + ], + metadata: { + bar: 'old-metadata', + }, + }, + }); + + await supertestAdminWithApiKey + .put('/api/security/role/role_to_update') + .send({ + metadata: { + foo: 'test-metadata', + }, + elasticsearch: { + cluster: ['manage'], + indices: [ + { + names: ['logstash-*'], + privileges: ['read', 'view_index_metadata'], + }, + ], + remote_indices: [ + { + clusters: ['remote_cluster1'], + names: ['remote_index1', 'remote_index2'], + privileges: ['all'], + }, + ], + }, + kibana: [ + { + feature: { + dashboard: ['read'], + dev_tools: ['all'], + }, + spaces: ['*'], + }, + { + base: ['all'], + spaces: ['marketing', 'sales'], + }, + ], + }) + .expect(400); + + const role = await es.security.getRole({ name: 'role_to_update' }); + expect(role).toEqual({ + role_to_update: { + cluster: ['monitor'], + indices: [ + { + names: ['beats-*'], + privileges: ['write'], + allow_restricted_indices: false, + }, + ], + applications: [ + { + application: 'kibana-.kibana', + privileges: ['read'], + resources: ['*'], + }, + { + application: 'apm', + privileges: ['apm-privilege'], + resources: ['*'], + }, + ], + metadata: { + bar: 'old-metadata', + }, + run_as: [], + transient_metadata: { + enabled: true, + }, + }, + }); + }); + }); + + describe('Delete Role', function () { + it('should delete an existing role', async function () { + await es.security.putRole({ + name: 'role_to_delete', + body: { + cluster: ['monitor'], + indices: [ + { + names: ['beats-*'], + privileges: ['write'], + }, + ], + applications: [ + { + application: 'kibana-.kibana', + privileges: ['read'], + resources: ['*'], + }, + { + application: 'apm', + privileges: ['apm-privilege'], + resources: ['*'], + }, + ], + metadata: { + bar: 'old-metadata', + }, + }, + }); + await supertestAdminWithApiKey.delete('/api/security/role/role_to_delete').expect(204); + + const deletedRole = await es.security.getRole( + { name: 'role_to_delete' }, + { ignore: [404] } ); - svlCommonApi.assertApiNotFound(body, status); + expect(deletedRole).toEqual({}); }); + }); + }); - it('get shared saved object permissions', async () => { + describe('route access', function () { + describe('disabled', function () { + it('get shared saved object permissions', async function () { const { body, status } = await supertestAdminWithCookieCredentials.get( '/internal/security/_share_saved_object_permissions' ); svlCommonApi.assertApiNotFound(body, status); }); + + describe('oblt only', function () { + // custom roles are not enabled for observability projects + this.tags(['skipSvlSearch', 'skipSvlSec']); + + it('create/update role', async function () { + const { body, status } = await supertestAdminWithApiKey.put('/api/security/role/test'); + svlCommonApi.assertApiNotFound(body, status); + }); + + it('get role', async function () { + const { body, status } = await supertestAdminWithApiKey.get( + '/api/security/role/superuser' + ); + svlCommonApi.assertApiNotFound(body, status); + }); + + it('get all roles', async function () { + const { body, status } = await supertestAdminWithApiKey.get('/api/security/role'); + svlCommonApi.assertApiNotFound(body, status); + }); + + it('delete role', async function () { + const { body, status } = await supertestAdminWithApiKey.delete( + '/api/security/role/superuser' + ); + svlCommonApi.assertApiNotFound(body, status); + }); + + it('get all privileges', async function () { + const { body, status } = await supertestAdminWithApiKey.get('/api/security/privileges'); + svlCommonApi.assertApiNotFound(body, status); + }); + + it('get built-in elasticsearch privileges', async function () { + const { body, status } = await supertestAdminWithCookieCredentials.get( + '/internal/security/esPrivileges/builtin' + ); + svlCommonApi.assertApiNotFound(body, status); + }); + }); }); - describe('public', () => { - it('reset session page', async () => { + describe('public', function () { + // Public but undocumented, hence 'internal' in path + it('reset session page', async function () { const { status } = await supertestAdminWithCookieCredentials.get( '/internal/security/reset_session_page.js' ); expect(status).toBe(200); }); }); + + describe('custom roles', function () { + // custom roles are not enabled for observability projects + this.tags(['skipSvlOblt']); + + describe('internal', function () { + it('get built-in elasticsearch privileges', async function () { + let body: any; + let status: number; + + ({ body, status } = await supertestAdminWithCookieCredentials + .get('/internal/security/esPrivileges/builtin') + .set(svlCommonApi.getCommonRequestHeader())); + // expect a rejection because we're not using the internal header + expect(body).toEqual({ + statusCode: 400, + error: 'Bad Request', + message: expect.stringContaining( + 'method [get] exists but is not available with the current configuration' + ), + }); + expect(status).toBe(400); + + ({ status } = await supertestAdminWithCookieCredentials.get( + '/internal/security/esPrivileges/builtin' + )); + expect(status).toBe(400); + + // expect success when using the internal header + ({ body, status } = await supertestAdminWithCookieCredentials + .get('/internal/security/esPrivileges/builtin') + .set(svlCommonApi.getInternalRequestHeader())); + expect(status).toBe(200); + }); + }); + + describe('public', function () { + it('get all privileges', async function () { + const { status } = await supertestAdminWithApiKey + .get('/api/security/privileges') + .set(svlCommonApi.getInternalRequestHeader()); + expect(status).toBe(200); + }); + }); + }); }); - describe('available features', () => { - it('all Dashboard and Discover sub-feature privileges are disabled', async () => { + describe('available features', function () { + it('all Dashboard and Discover sub-feature privileges are disabled', async function () { const { body } = await supertestAdminWithCookieCredentials.get('/api/features').expect(200); // We should make sure that neither Discover nor Dashboard displays any sub-feature privileges in Serverless. diff --git a/x-pack/test_serverless/api_integration/test_suites/common/platform_security/roles_routes_feature_flag.ts b/x-pack/test_serverless/api_integration/test_suites/common/platform_security/roles_routes_feature_flag.ts deleted file mode 100644 index 7f2237eda4b44..0000000000000 --- a/x-pack/test_serverless/api_integration/test_suites/common/platform_security/roles_routes_feature_flag.ts +++ /dev/null @@ -1,951 +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 - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import expect from 'expect'; -import type { Role } from '@kbn/security-plugin-types-common'; -import { SupertestWithRoleScopeType } from '@kbn/test-suites-xpack/api_integration/deployment_agnostic/services'; -import { FtrProviderContext } from '../../../ftr_provider_context'; - -// Notes: -// Test coverage comes from stateful test suite: x-pack/test/api_integration/apis/security/roles.ts -// It has been modified to work for serverless by removing invalid options (run_as, allow_restricted_indices, etc). -// -// Note: this suite is currently only called from the feature flags test configs, e.g. -// x-pack/test_serverless/api_integration/test_suites/search/config.feature_flags.ts -// -// This suite should be converted into a deployment agnostic suite when the native roles -// feature flags are enabled permanently in serverless. Additionally, the route access tests -// for the roles APIs in authorization.ts should also get updated at that time. -// kbnServerArgs: ['--xpack.security.roleManagementEnabled=true'], -// esServerArgs: ['xpack.security.authc.native_roles.enabled=true'], - -export default function ({ getService }: FtrProviderContext) { - const platformSecurityUtils = getService('platformSecurityUtils'); - const roleScopedSupertest = getService('roleScopedSupertest'); - const svlCommonApi = getService('svlCommonApi'); - let supertestAdminWithApiKey: SupertestWithRoleScopeType; - let supertestAdminWithCookieCredentials: SupertestWithRoleScopeType; - const es = getService('es'); - - describe('security', function () { - describe('Roles', () => { - before(async () => { - supertestAdminWithCookieCredentials = await roleScopedSupertest.getSupertestWithRoleScope( - 'admin', - { - useCookieHeader: true, - withInternalHeaders: true, - } - ); - supertestAdminWithApiKey = await roleScopedSupertest.getSupertestWithRoleScope('admin', { - withCommonHeaders: true, - }); - }); - after(async () => { - await platformSecurityUtils.clearAllRoles(); - }); - - describe('Create Role', () => { - it('should allow us to create an empty role', async () => { - await supertestAdminWithApiKey.put('/api/security/role/empty_role').send({}).expect(204); - }); - - it('should create a role with kibana and elasticsearch privileges', async () => { - await supertestAdminWithApiKey - .put('/api/security/role/role_with_privileges') - .send({ - metadata: { - foo: 'test-metadata', - }, - elasticsearch: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - }, - ], - }, - kibana: [ - { - base: ['read'], - }, - { - feature: { - dashboard: ['read'], - discover: ['all'], - ml: ['all'], - }, - spaces: ['marketing', 'sales'], - }, - ], - }) - .expect(204); - - const role = await es.security.getRole({ name: 'role_with_privileges' }); - expect(role).toEqual({ - role_with_privileges: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - allow_restricted_indices: false, - }, - ], - applications: [ - { - application: 'kibana-.kibana', - privileges: ['read'], - resources: ['*'], - }, - { - application: 'kibana-.kibana', - privileges: ['feature_dashboard.read', 'feature_discover.all', 'feature_ml.all'], - resources: ['space:marketing', 'space:sales'], - }, - ], - metadata: { - foo: 'test-metadata', - }, - run_as: [], - transient_metadata: { - enabled: true, - }, - }, - }); - }); - - it(`should create a role with kibana and FLS/DLS elasticsearch privileges`, async () => { - await supertestAdminWithApiKey - .put('/api/security/role/role_with_privileges_dls_fls') - .send({ - metadata: { - foo: 'test-metadata', - }, - elasticsearch: { - cluster: ['manage'], - indices: [ - { - field_security: { - grant: ['*'], - except: ['geo.*'], - }, - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - query: `{ "match": { "geo.src": "CN" } }`, - }, - ], - }, - }) - .expect(204); - }); - - // serverless only (stateful will allow) - it(`should not create a role with 'run as' privileges`, async () => { - await supertestAdminWithApiKey - .put('/api/security/role/role_with_privileges') - .send({ - metadata: { - foo: 'test-metadata', - }, - elasticsearch: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - }, - ], - run_as: ['admin'], - }, - kibana: [ - { - base: ['read'], - }, - { - feature: { - dashboard: ['read'], - discover: ['all'], - ml: ['all'], - }, - spaces: ['marketing', 'sales'], - }, - ], - }) - .expect(400); - }); - - // serverless only (stateful will allow) - it(`should not create a role with remote cluster privileges`, async () => { - await supertestAdminWithApiKey - .put('/api/security/role/role_with_privileges') - .send({ - metadata: { - foo: 'test-metadata', - }, - elasticsearch: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - }, - ], - remote_cluster: [ - { - clusters: ['remote_cluster1'], - privileges: ['monitor_enrich'], - }, - ], - }, - kibana: [ - { - base: ['read'], - }, - { - feature: { - dashboard: ['read'], - discover: ['all'], - ml: ['all'], - }, - spaces: ['marketing', 'sales'], - }, - ], - }) - .expect(400); - }); - - // serverless only (stateful will allow) - it(`should not create a role with remote index privileges`, async () => { - await supertestAdminWithApiKey - .put('/api/security/role/role_with_privileges') - .send({ - metadata: { - foo: 'test-metadata', - }, - elasticsearch: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - }, - ], - remote_indices: [ - { - clusters: ['remote_cluster1'], - names: ['remote_index1', 'remote_index2'], - privileges: ['all'], - }, - ], - }, - kibana: [ - { - base: ['read'], - }, - { - feature: { - dashboard: ['read'], - discover: ['all'], - ml: ['all'], - }, - spaces: ['marketing', 'sales'], - }, - ], - }) - .expect(400); - }); - - describe('with the createOnly option enabled', () => { - it('should fail when role already exists', async () => { - await es.security.putRole({ - name: 'test_role', - body: { - cluster: ['monitor'], - indices: [ - { - names: ['beats-*'], - privileges: ['write'], - }, - ], - }, - }); - - await supertestAdminWithApiKey - .put('/api/security/role/test_role?createOnly=true') - .send({}) - .expect(409); - }); - - it('should succeed when role does not exist', async () => { - await supertestAdminWithApiKey - .put('/api/security/role/new_role?createOnly=true') - .send({}) - .expect(204); - }); - }); - }); - - describe('Read Role', () => { - it('should get roles', async () => { - await es.security.putRole({ - name: 'role_to_get', - body: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - }, - ], - applications: [ - { - application: 'kibana-.kibana', - privileges: ['read'], - resources: ['*'], - }, - { - application: 'kibana-.kibana', - privileges: ['feature_dashboard.read', 'feature_discover.all', 'feature_ml.all'], - resources: ['space:marketing', 'space:sales'], - }, - { - application: 'apm', - privileges: ['apm-privilege'], - resources: ['*'], - }, - ], - metadata: { - foo: 'test-metadata', - }, - transient_metadata: { - enabled: true, - }, - }, - }); - - await supertestAdminWithApiKey.get('/api/security/role/role_to_get').expect(200, { - name: 'role_to_get', - metadata: { - foo: 'test-metadata', - }, - transient_metadata: { enabled: true }, - elasticsearch: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - allow_restricted_indices: false, - }, - ], - run_as: [], - }, - kibana: [ - { - base: ['read'], - feature: {}, - spaces: ['*'], - }, - { - base: [], - feature: { - dashboard: ['read'], - discover: ['all'], - ml: ['all'], - }, - spaces: ['marketing', 'sales'], - }, - ], - - _transform_error: [], - _unrecognized_applications: ['apm'], - }); - }); - - it('should get roles by space id', async () => { - await es.security.putRole({ - name: 'space_role_not_to_get', - body: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - }, - ], - applications: [ - { - application: 'kibana-.kibana', - privileges: ['feature_dashboard.read', 'feature_discover.all', 'feature_ml.all'], - resources: ['space:marketing', 'space:sales'], - }, - ], - metadata: { - foo: 'test-metadata', - }, - transient_metadata: { - enabled: true, - }, - }, - }); - - await es.security.putRole({ - name: 'space_role_to_get', - body: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - }, - ], - applications: [ - { - application: 'kibana-.kibana', - privileges: ['feature_dashboard.read', 'feature_discover.all', 'feature_ml.all'], - resources: ['space:engineering', 'space:sales'], - }, - ], - metadata: { - foo: 'test-metadata', - }, - transient_metadata: { - enabled: true, - }, - }, - }); - - await supertestAdminWithCookieCredentials - .get('/internal/security/roles/engineering') - .expect(200) - .expect((res: { body: Role[] }) => { - const roles = res.body; - - const success = roles.every((role) => { - return ( - role.name !== 'space_role_not_to_get' && - role.kibana.some((privilege) => { - return ( - privilege.spaces.includes('*') || privilege.spaces.includes('engineering') - ); - }) - ); - }); - - const expectedRole = roles.find((role) => role.name === 'space_role_to_get'); - - expect(success).toBe(true); - expect(expectedRole).toBeTruthy(); - }); - }); - }); - - describe('Update Role', () => { - it('should update a role with elasticsearch, kibana and other applications privileges', async () => { - await es.security.putRole({ - name: 'role_to_update', - body: { - cluster: ['monitor'], - indices: [ - { - names: ['beats-*'], - privileges: ['write'], - }, - ], - applications: [ - { - application: 'kibana-.kibana', - privileges: ['read'], - resources: ['*'], - }, - { - application: 'apm', - privileges: ['apm-privilege'], - resources: ['*'], - }, - ], - metadata: { - bar: 'old-metadata', - }, - }, - }); - - await supertestAdminWithApiKey - .put('/api/security/role/role_to_update') - .send({ - metadata: { - foo: 'test-metadata', - }, - elasticsearch: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - }, - ], - }, - kibana: [ - { - feature: { - dashboard: ['read'], - dev_tools: ['all'], - }, - spaces: ['*'], - }, - { - base: ['all'], - spaces: ['marketing', 'sales'], - }, - ], - }) - .expect(204); - - const role = await es.security.getRole({ name: 'role_to_update' }); - expect(role).toEqual({ - role_to_update: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - allow_restricted_indices: false, - }, - ], - applications: [ - { - application: 'kibana-.kibana', - privileges: ['feature_dashboard.read', 'feature_dev_tools.all'], - resources: ['*'], - }, - { - application: 'kibana-.kibana', - privileges: ['space_all'], - resources: ['space:marketing', 'space:sales'], - }, - { - application: 'apm', - privileges: ['apm-privilege'], - resources: ['*'], - }, - ], - metadata: { - foo: 'test-metadata', - }, - run_as: [], - transient_metadata: { - enabled: true, - }, - }, - }); - }); - - it(`should update a role adding DLS and FLS privileges`, async () => { - await es.security.putRole({ - name: 'role_to_update_with_dls_fls', - body: { - cluster: ['monitor'], - indices: [ - { - names: ['beats-*'], - privileges: ['write'], - }, - ], - }, - }); - - await supertestAdminWithApiKey - .put('/api/security/role/role_to_update_with_dls_fls') - .send({ - elasticsearch: { - cluster: ['manage'], - indices: [ - { - field_security: { - grant: ['*'], - except: ['geo.*'], - }, - names: ['logstash-*'], - privileges: ['read'], - query: `{ "match": { "geo.src": "CN" } }`, - }, - ], - }, - }) - .expect(204); - - const role = await es.security.getRole({ name: 'role_to_update_with_dls_fls' }); - - expect(role.role_to_update_with_dls_fls.cluster).toEqual(['manage']); - expect(role.role_to_update_with_dls_fls.indices[0].names).toEqual(['logstash-*']); - expect(role.role_to_update_with_dls_fls.indices[0].query).toEqual( - `{ "match": { "geo.src": "CN" } }` - ); - }); - - // serverless only (stateful will allow) - it(`should not update a role with 'run as' privileges`, async () => { - await es.security.putRole({ - name: 'role_to_update', - body: { - cluster: ['monitor'], - indices: [ - { - names: ['beats-*'], - privileges: ['write'], - }, - ], - applications: [ - { - application: 'kibana-.kibana', - privileges: ['read'], - resources: ['*'], - }, - { - application: 'apm', - privileges: ['apm-privilege'], - resources: ['*'], - }, - ], - metadata: { - bar: 'old-metadata', - }, - }, - }); - - await supertestAdminWithApiKey - .put('/api/security/role/role_to_update') - .send({ - metadata: { - foo: 'test-metadata', - }, - elasticsearch: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - }, - ], - run_as: ['admin'], - }, - kibana: [ - { - feature: { - dashboard: ['read'], - dev_tools: ['all'], - }, - spaces: ['*'], - }, - { - base: ['all'], - spaces: ['marketing', 'sales'], - }, - ], - }) - .expect(400); - - const role = await es.security.getRole({ name: 'role_to_update' }); - expect(role).toEqual({ - role_to_update: { - cluster: ['monitor'], - indices: [ - { - names: ['beats-*'], - privileges: ['write'], - allow_restricted_indices: false, - }, - ], - applications: [ - { - application: 'kibana-.kibana', - privileges: ['read'], - resources: ['*'], - }, - { - application: 'apm', - privileges: ['apm-privilege'], - resources: ['*'], - }, - ], - metadata: { - bar: 'old-metadata', - }, - run_as: [], - transient_metadata: { - enabled: true, - }, - }, - }); - }); - - // serverless only (stateful will allow) - it(`should not update a role with remote cluster privileges`, async () => { - await es.security.putRole({ - name: 'role_to_update', - body: { - cluster: ['monitor'], - indices: [ - { - names: ['beats-*'], - privileges: ['write'], - }, - ], - applications: [ - { - application: 'kibana-.kibana', - privileges: ['read'], - resources: ['*'], - }, - { - application: 'apm', - privileges: ['apm-privilege'], - resources: ['*'], - }, - ], - metadata: { - bar: 'old-metadata', - }, - }, - }); - - await supertestAdminWithApiKey - .put('/api/security/role/role_to_update') - .send({ - metadata: { - foo: 'test-metadata', - }, - elasticsearch: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - }, - ], - remote_cluster: [ - { - clusters: ['remote_cluster1'], - privileges: ['monitor_enrich'], - }, - ], - }, - kibana: [ - { - feature: { - dashboard: ['read'], - dev_tools: ['all'], - }, - spaces: ['*'], - }, - { - base: ['all'], - spaces: ['marketing', 'sales'], - }, - ], - }) - .expect(400); - - const role = await es.security.getRole({ name: 'role_to_update' }); - expect(role).toEqual({ - role_to_update: { - cluster: ['monitor'], - indices: [ - { - names: ['beats-*'], - privileges: ['write'], - allow_restricted_indices: false, - }, - ], - applications: [ - { - application: 'kibana-.kibana', - privileges: ['read'], - resources: ['*'], - }, - { - application: 'apm', - privileges: ['apm-privilege'], - resources: ['*'], - }, - ], - metadata: { - bar: 'old-metadata', - }, - run_as: [], - transient_metadata: { - enabled: true, - }, - }, - }); - }); - - // serverless only (stateful will allow) - it(`should not update a role with remote index privileges`, async () => { - await es.security.putRole({ - name: 'role_to_update', - body: { - cluster: ['monitor'], - indices: [ - { - names: ['beats-*'], - privileges: ['write'], - }, - ], - applications: [ - { - application: 'kibana-.kibana', - privileges: ['read'], - resources: ['*'], - }, - { - application: 'apm', - privileges: ['apm-privilege'], - resources: ['*'], - }, - ], - metadata: { - bar: 'old-metadata', - }, - }, - }); - - await supertestAdminWithApiKey - .put('/api/security/role/role_to_update') - .send({ - metadata: { - foo: 'test-metadata', - }, - elasticsearch: { - cluster: ['manage'], - indices: [ - { - names: ['logstash-*'], - privileges: ['read', 'view_index_metadata'], - }, - ], - remote_indices: [ - { - clusters: ['remote_cluster1'], - names: ['remote_index1', 'remote_index2'], - privileges: ['all'], - }, - ], - }, - kibana: [ - { - feature: { - dashboard: ['read'], - dev_tools: ['all'], - }, - spaces: ['*'], - }, - { - base: ['all'], - spaces: ['marketing', 'sales'], - }, - ], - }) - .expect(400); - - const role = await es.security.getRole({ name: 'role_to_update' }); - expect(role).toEqual({ - role_to_update: { - cluster: ['monitor'], - indices: [ - { - names: ['beats-*'], - privileges: ['write'], - allow_restricted_indices: false, - }, - ], - applications: [ - { - application: 'kibana-.kibana', - privileges: ['read'], - resources: ['*'], - }, - { - application: 'apm', - privileges: ['apm-privilege'], - resources: ['*'], - }, - ], - metadata: { - bar: 'old-metadata', - }, - run_as: [], - transient_metadata: { - enabled: true, - }, - }, - }); - }); - }); - - describe('Delete Role', () => { - it('should delete an existing role', async () => { - await es.security.putRole({ - name: 'role_to_delete', - body: { - cluster: ['monitor'], - indices: [ - { - names: ['beats-*'], - privileges: ['write'], - }, - ], - applications: [ - { - application: 'kibana-.kibana', - privileges: ['read'], - resources: ['*'], - }, - { - application: 'apm', - privileges: ['apm-privilege'], - resources: ['*'], - }, - ], - metadata: { - bar: 'old-metadata', - }, - }, - }); - await supertestAdminWithApiKey.delete('/api/security/role/role_to_delete').expect(204); - - const deletedRole = await es.security.getRole( - { name: 'role_to_delete' }, - { ignore: [404] } - ); - expect(deletedRole).toEqual({}); - }); - }); - - describe('Access', () => { - describe('public', () => { - it('reset session page', async () => { - const { status } = await supertestAdminWithCookieCredentials.get( - '/internal/security/reset_session_page.js' - ); - expect(status).toBe(200); - }); - }); - describe('Disabled', () => { - it('get shared saved object permissions', async () => { - const { body, status } = await supertestAdminWithCookieCredentials.get( - '/internal/security/_share_saved_object_permissions' - ); - svlCommonApi.assertApiNotFound(body, status); - }); - }); - }); - }); - }); -} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/config.feature_flags.ts b/x-pack/test_serverless/api_integration/test_suites/observability/config.feature_flags.ts index 20724f4f9ae16..3668b6742c828 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/config.feature_flags.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/config.feature_flags.ts @@ -22,13 +22,12 @@ export default createTestConfig({ // add feature flags kbnServerArgs: [ '--xpack.infra.enabled=true', - '--xpack.security.roleManagementEnabled=true', // enables custom roles - `--xpack.spaces.maxSpaces=100`, // enables spaces UI capabilities + '--xpack.security.roleManagementEnabled=true', // needed to check composite feautures in /observability/platform_security/authorization.ts ], // load tests in the index file testFiles: [require.resolve('./index.feature_flags.ts')], // include settings from project controller // https://github.com/elastic/project-controller/blob/main/internal/project/observability/config/elasticsearch.yml - esServerArgs: ['xpack.ml.dfa.enabled=false', 'xpack.security.authc.native_roles.enabled=true'], + esServerArgs: ['xpack.ml.dfa.enabled=false'], }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts b/x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts index 44ac3675266f7..3cd47636831f3 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts @@ -12,7 +12,5 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./custom_threshold_rule')); loadTestFile(require.resolve('./infra')); loadTestFile(require.resolve('./platform_security')); - loadTestFile(require.resolve('../common/platform_security/roles_routes_feature_flag.ts')); - loadTestFile(require.resolve('../common/management/multiple_spaces_enabled.ts')); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/search/config.feature_flags.ts b/x-pack/test_serverless/api_integration/test_suites/search/config.feature_flags.ts index 09de0f17e6b63..9dac5bfb595c9 100644 --- a/x-pack/test_serverless/api_integration/test_suites/search/config.feature_flags.ts +++ b/x-pack/test_serverless/api_integration/test_suites/search/config.feature_flags.ts @@ -19,8 +19,6 @@ export default createTestConfig({ suiteTags: { exclude: ['skipSvlSearch'] }, // add feature flags kbnServerArgs: [ - '--xpack.security.roleManagementEnabled=true', // enables custom roles - `--xpack.spaces.maxSpaces=100`, // enables spaces UI capabilities `--xpack.searchIndices.enabled=true`, // global empty state FF ], // load tests in the index file @@ -28,5 +26,5 @@ export default createTestConfig({ // include settings from project controller // https://github.com/elastic/project-controller/blob/main/internal/project/esproject/config/elasticsearch.yml - esServerArgs: ['xpack.security.authc.native_roles.enabled=true'], + esServerArgs: [], }); diff --git a/x-pack/test_serverless/api_integration/test_suites/search/index.feature_flags.ts b/x-pack/test_serverless/api_integration/test_suites/search/index.feature_flags.ts index acd435d9d29ae..bbfbc47fe9184 100644 --- a/x-pack/test_serverless/api_integration/test_suites/search/index.feature_flags.ts +++ b/x-pack/test_serverless/api_integration/test_suites/search/index.feature_flags.ts @@ -10,8 +10,5 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('Serverless search API - feature flags', function () { loadTestFile(require.resolve('./search_indices')); - loadTestFile(require.resolve('./platform_security')); - loadTestFile(require.resolve('../common/platform_security/roles_routes_feature_flag.ts')); - loadTestFile(require.resolve('../common/management/multiple_spaces_enabled.ts')); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/search/index.ts b/x-pack/test_serverless/api_integration/test_suites/search/index.ts index b568e75960951..42b8d0dd90435 100644 --- a/x-pack/test_serverless/api_integration/test_suites/search/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/search/index.ts @@ -14,5 +14,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./cases/find_cases')); loadTestFile(require.resolve('./cases/post_case')); loadTestFile(require.resolve('./serverless_search')); + loadTestFile(require.resolve('./platform_security')); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/security/config.feature_flags.ts b/x-pack/test_serverless/api_integration/test_suites/security/config.feature_flags.ts index eb6270bab7ce1..6f6404ad497cf 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/config.feature_flags.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/config.feature_flags.ts @@ -18,14 +18,11 @@ export default createTestConfig({ }, suiteTags: { exclude: ['skipSvlSec'] }, // add feature flags - kbnServerArgs: [ - '--xpack.security.roleManagementEnabled=true', // enables custom roles - `--xpack.spaces.maxSpaces=100`, // enables spaces UI capabilities - ], + kbnServerArgs: [], // load tests in the index file testFiles: [require.resolve('./index.feature_flags.ts')], // include settings from project controller // https://github.com/elastic/project-controller/blob/main/internal/project/security/config/elasticsearch.yml - esServerArgs: ['xpack.ml.nlp.enabled=true', 'xpack.security.authc.native_roles.enabled=true'], + esServerArgs: ['xpack.ml.nlp.enabled=true'], }); diff --git a/x-pack/test_serverless/api_integration/test_suites/security/index.feature_flags.ts b/x-pack/test_serverless/api_integration/test_suites/security/index.feature_flags.ts index 5c591f3213149..de4c823dbbb62 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/index.feature_flags.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/index.feature_flags.ts @@ -8,9 +8,5 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { - describe('Serverless security API - feature flags', function () { - loadTestFile(require.resolve('./platform_security')); - loadTestFile(require.resolve('../common/platform_security/roles_routes_feature_flag.ts')); - loadTestFile(require.resolve('../common/management/multiple_spaces_enabled.ts')); - }); + describe('Serverless security API - feature flags', function () {}); } diff --git a/x-pack/test_serverless/api_integration/test_suites/security/index.ts b/x-pack/test_serverless/api_integration/test_suites/security/index.ts index a7cb3cea71049..98dbf046bac94 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/index.ts @@ -13,5 +13,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./cases')); loadTestFile(require.resolve('./cloud_security_posture')); + loadTestFile(require.resolve('./platform_security')); }); } diff --git a/x-pack/test_serverless/functional/config.base.ts b/x-pack/test_serverless/functional/config.base.ts index 1a3cd2ffd6a5b..f904c53195dcc 100644 --- a/x-pack/test_serverless/functional/config.base.ts +++ b/x-pack/test_serverless/functional/config.base.ts @@ -41,10 +41,6 @@ export function createTestConfig(options: CreateTestConfigOptions) { `--xpack.trigger_actions_ui.enableExperimental=${JSON.stringify([ 'isUsingRuleCreateFlyout', ])}`, - // custom native roles are enabled only for search and security projects - ...(options.serverlessProject !== 'oblt' - ? ['--xpack.security.roleManagementEnabled=true'] - : []), ...(options.kbnServerArgs ?? []), ], }, diff --git a/x-pack/test_serverless/functional/test_suites/common/platform_security/index.ts b/x-pack/test_serverless/functional/test_suites/common/platform_security/index.ts index 062aef5b9acfb..5f96ea70aee73 100644 --- a/x-pack/test_serverless/functional/test_suites/common/platform_security/index.ts +++ b/x-pack/test_serverless/functional/test_suites/common/platform_security/index.ts @@ -13,6 +13,8 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./api_keys')); loadTestFile(require.resolve('./navigation/avatar_menu')); + loadTestFile(require.resolve('./navigation/management_nav_cards')); loadTestFile(require.resolve('./user_profiles/user_profiles')); + loadTestFile(require.resolve('./roles.ts')); }); } diff --git a/x-pack/test_serverless/functional/test_suites/common/platform_security/navigation/management_nav_cards.ts b/x-pack/test_serverless/functional/test_suites/common/platform_security/navigation/management_nav_cards.ts index c9aa658cdc44f..1dfa1a5dff79c 100644 --- a/x-pack/test_serverless/functional/test_suites/common/platform_security/navigation/management_nav_cards.ts +++ b/x-pack/test_serverless/functional/test_suites/common/platform_security/navigation/management_nav_cards.ts @@ -46,16 +46,17 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(url).to.contain('/management/security/api_keys'); }); - it('displays the roles management card, and will navigate to the Roles UI', async () => { - await pageObjects.svlManagementPage.assertRoleManagementCardExists(); - await pageObjects.svlManagementPage.clickRoleManagementCard(); + describe('custom roles', function () { + this.tags('skipSvlOblt'); // Observability will not support custom roles - const url = await browser.getCurrentUrl(); - expect(url).to.contain('/management/security/roles'); - }); + it('displays the roles management card, and will navigate to the Roles UI', async () => { + await pageObjects.svlManagementPage.assertRoleManagementCardExists(); + await pageObjects.svlManagementPage.clickRoleManagementCard(); + + const url = await browser.getCurrentUrl(); + expect(url).to.contain('/management/security/roles'); + }); - describe('Organization members', function () { - this.tags('skipSvlOblt'); // Observability will not support custom roles it('displays the Organization members management card, and will navigate to the cloud organization URL', async () => { await pageObjects.svlManagementPage.assertOrgMembersManagementCardExists(); await pageObjects.svlManagementPage.clickOrgMembersManagementCard(); diff --git a/x-pack/test_serverless/functional/test_suites/common/platform_security/roles.ts b/x-pack/test_serverless/functional/test_suites/common/platform_security/roles.ts index a57f82f158ebf..c402ad42f4fca 100644 --- a/x-pack/test_serverless/functional/test_suites/common/platform_security/roles.ts +++ b/x-pack/test_serverless/functional/test_suites/common/platform_security/roles.ts @@ -19,6 +19,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const platformSecurityUtils = getService('platformSecurityUtils'); describe('Roles', function () { + // custom roles are not enabled for observability projects + this.tags(['skipSvlOblt']); + describe('as Viewer', () => { before(async () => { await pageObjects.svlCommonPage.loginAsViewer(); diff --git a/x-pack/test_serverless/functional/test_suites/common/spaces/index.ts b/x-pack/test_serverless/functional/test_suites/common/spaces/index.ts index e9648b0339ac3..48dcebf486618 100644 --- a/x-pack/test_serverless/functional/test_suites/common/spaces/index.ts +++ b/x-pack/test_serverless/functional/test_suites/common/spaces/index.ts @@ -11,6 +11,7 @@ export default ({ loadTestFile }: FtrProviderContext) => { describe('Spaces', function () { this.tags(['esGate']); + loadTestFile(require.resolve('./spaces_management.ts')); loadTestFile(require.resolve('./spaces_selection.ts')); }); }; diff --git a/x-pack/test_serverless/functional/test_suites/common/spaces/multiple_spaces_enabled.ts b/x-pack/test_serverless/functional/test_suites/common/spaces/spaces_management.ts similarity index 58% rename from x-pack/test_serverless/functional/test_suites/common/spaces/multiple_spaces_enabled.ts rename to x-pack/test_serverless/functional/test_suites/common/spaces/spaces_management.ts index 84c7291e6e7ad..49ca03e5861e7 100644 --- a/x-pack/test_serverless/functional/test_suites/common/spaces/multiple_spaces_enabled.ts +++ b/x-pack/test_serverless/functional/test_suites/common/spaces/spaces_management.ts @@ -15,51 +15,9 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getPageObject, getService }: FtrProviderContext) { const svlCommon = getPageObject('common'); const svlCommonPage = getPageObject('svlCommonPage'); - const svlCommonNavigation = getService('svlCommonNavigation'); const testSubjects = getService('testSubjects'); describe('spaces', function () { - describe('selection', function () { - describe('as Viewer', function () { - before(async () => { - await svlCommonPage.loginAsViewer(); - }); - - it('displays the space selection menu in header', async () => { - await svlCommonNavigation.navigateToKibanaHome(); - await svlCommonPage.assertProjectHeaderExists(); - - await testSubjects.existOrFail('spacesNavSelector'); - }); - - it(`does not display the manage button in the space selection menu`, async () => { - await svlCommonNavigation.navigateToKibanaHome(); - await svlCommonPage.assertProjectHeaderExists(); - await testSubjects.click('spacesNavSelector'); - await testSubjects.missingOrFail('manageSpaces'); - }); - }); - - describe('as Admin', function () { - before(async () => { - await svlCommonPage.loginAsAdmin(); - }); - - it('displays the space selection menu in header', async () => { - await svlCommonNavigation.navigateToKibanaHome(); - await svlCommonPage.assertProjectHeaderExists(); - await testSubjects.existOrFail('spacesNavSelector'); - }); - - it(`displays the manage button in the space selection menu`, async () => { - await svlCommonNavigation.navigateToKibanaHome(); - await svlCommonPage.assertProjectHeaderExists(); - await testSubjects.click('spacesNavSelector'); - await testSubjects.existOrFail('manageSpaces'); - }); - }); - }); - describe('management', function () { describe('as Viewer', function () { before(async () => { diff --git a/x-pack/test_serverless/functional/test_suites/common/spaces/spaces_selection.ts b/x-pack/test_serverless/functional/test_suites/common/spaces/spaces_selection.ts index 526d0b3db5a41..a903d8778b7d8 100644 --- a/x-pack/test_serverless/functional/test_suites/common/spaces/spaces_selection.ts +++ b/x-pack/test_serverless/functional/test_suites/common/spaces/spaces_selection.ts @@ -12,18 +12,46 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { const svlCommonNavigation = getService('svlCommonNavigation'); const testSubjects = getService('testSubjects'); - // Skipped due to change in QA environment for role management and spaces - // TODO: revisit once the change is rolled out to all environments - describe.skip('space selection', function () { - before(async () => { - await svlCommonPage.loginAsViewer(); - }); + describe('spaces', function () { + describe('selection', function () { + describe('as Viewer', function () { + before(async () => { + await svlCommonPage.loginAsViewer(); + }); + + it('displays the space selection menu in header', async () => { + await svlCommonNavigation.navigateToKibanaHome(); + await svlCommonPage.assertProjectHeaderExists(); + + await testSubjects.existOrFail('spacesNavSelector'); + }); + + it(`does not display the manage button in the space selection menu`, async () => { + await svlCommonNavigation.navigateToKibanaHome(); + await svlCommonPage.assertProjectHeaderExists(); + await testSubjects.click('spacesNavSelector'); + await testSubjects.missingOrFail('manageSpaces'); + }); + }); + + describe('as Admin', function () { + before(async () => { + await svlCommonPage.loginAsAdmin(); + }); - it('does not have the space selection menu in header', async () => { - await svlCommonNavigation.navigateToKibanaHome(); - await svlCommonPage.assertProjectHeaderExists(); + it('displays the space selection menu in header', async () => { + await svlCommonNavigation.navigateToKibanaHome(); + await svlCommonPage.assertProjectHeaderExists(); + await testSubjects.existOrFail('spacesNavSelector'); + }); - await testSubjects.missingOrFail('spacesNavSelector'); + it(`displays the manage button in the space selection menu`, async () => { + await svlCommonNavigation.navigateToKibanaHome(); + await svlCommonPage.assertProjectHeaderExists(); + await testSubjects.click('spacesNavSelector'); + await testSubjects.existOrFail('manageSpaces'); + }); + }); }); }); } diff --git a/x-pack/test_serverless/functional/test_suites/observability/config.feature_flags.ts b/x-pack/test_serverless/functional/test_suites/observability/config.feature_flags.ts index 8d85455f4588a..ba07c22e6ab01 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/config.feature_flags.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/config.feature_flags.ts @@ -22,10 +22,6 @@ export default createTestConfig({ '--xpack.infra.enabled=true', '--xpack.infra.featureFlags.customThresholdAlertsEnabled=true', '--xpack.security.roleManagementEnabled=true', - `--xpack.cloud.serverless.project_id='fakeprojectid'`, - `--xpack.cloud.base_url='https://cloud.elastic.co'`, - `--xpack.cloud.organization_url='/account/members'`, - `--xpack.spaces.maxSpaces=100`, // enables spaces UI capabilities ], // load tests in the index file testFiles: [require.resolve('./index.feature_flags.ts')], diff --git a/x-pack/test_serverless/functional/test_suites/observability/index.feature_flags.ts b/x-pack/test_serverless/functional/test_suites/observability/index.feature_flags.ts index 1f087233b52e9..df3c826c20813 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/index.feature_flags.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/index.feature_flags.ts @@ -12,8 +12,5 @@ export default function ({ loadTestFile }: FtrProviderContext) { // add tests that require feature flags, defined in config.feature_flags.ts loadTestFile(require.resolve('./role_management')); loadTestFile(require.resolve('./infra')); - loadTestFile(require.resolve('../common/platform_security/navigation/management_nav_cards.ts')); - loadTestFile(require.resolve('../common/platform_security/roles.ts')); - loadTestFile(require.resolve('../common/spaces/multiple_spaces_enabled.ts')); }); } diff --git a/x-pack/test_serverless/functional/test_suites/search/config.feature_flags.ts b/x-pack/test_serverless/functional/test_suites/search/config.feature_flags.ts index 592da3d368c0d..b7c818821d36c 100644 --- a/x-pack/test_serverless/functional/test_suites/search/config.feature_flags.ts +++ b/x-pack/test_serverless/functional/test_suites/search/config.feature_flags.ts @@ -20,19 +20,13 @@ export default createTestConfig({ // add feature flags kbnServerArgs: [ `--xpack.cloud.id=ES3_FTR_TESTS:ZmFrZS1kb21haW4uY2xkLmVsc3RjLmNvJGZha2Vwcm9qZWN0aWQuZXMkZmFrZXByb2plY3RpZC5rYg==`, - `--xpack.cloud.serverless.project_id=fakeprojectid`, - `--xpack.cloud.base_url=https://fake-cloud.elastic.co`, - `--xpack.cloud.projects_url=/projects/`, - `--xpack.cloud.organization_url=/account/members`, - `--xpack.security.roleManagementEnabled=true`, - `--xpack.spaces.maxSpaces=100`, // enables spaces UI capabilities ], // load tests in the index file testFiles: [require.resolve('./index.feature_flags.ts')], // include settings from project controller // https://github.com/elastic/project-controller/blob/main/internal/project/esproject/config/elasticsearch.yml - esServerArgs: ['xpack.security.authc.native_roles.enabled=true'], + esServerArgs: [], apps: { serverlessElasticsearch: { pathname: '/app/elasticsearch/getting_started', diff --git a/x-pack/test_serverless/functional/test_suites/search/config.ts b/x-pack/test_serverless/functional/test_suites/search/config.ts index b01c80ec2dbb7..f330546373525 100644 --- a/x-pack/test_serverless/functional/test_suites/search/config.ts +++ b/x-pack/test_serverless/functional/test_suites/search/config.ts @@ -20,16 +20,8 @@ export default createTestConfig({ esServerArgs: [], kbnServerArgs: [ `--xpack.cloud.id=ES3_FTR_TESTS:ZmFrZS1kb21haW4uY2xkLmVsc3RjLmNvJGZha2Vwcm9qZWN0aWQuZXMkZmFrZXByb2plY3RpZC5rYg==`, - `--xpack.cloud.serverless.project_id=fakeprojectid`, `--xpack.cloud.serverless.project_name=ES3_FTR_TESTS`, - `--xpack.cloud.base_url=https://fake-cloud.elastic.co`, - `--xpack.cloud.profile_url=/user/settings/`, - `--xpack.cloud.billing_url=/billing/overview/`, - `--xpack.cloud.deployments_url=/deployments`, `--xpack.cloud.deployment_url=/projects/elasticsearch/fakeprojectid`, - `--xpack.cloud.users_and_roles_url=/account/members/`, - `--xpack.cloud.projects_url=/projects/`, - `--xpack.cloud.organization_url=/account/`, ], apps: { serverlessElasticsearch: { diff --git a/x-pack/test_serverless/functional/test_suites/search/index.feature_flags.ts b/x-pack/test_serverless/functional/test_suites/search/index.feature_flags.ts index bc9e19f2ae71f..f33776926bd26 100644 --- a/x-pack/test_serverless/functional/test_suites/search/index.feature_flags.ts +++ b/x-pack/test_serverless/functional/test_suites/search/index.feature_flags.ts @@ -10,9 +10,5 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('serverless search UI - feature flags', function () { // add tests that require feature flags, defined in config.feature_flags.ts - - loadTestFile(require.resolve('../common/platform_security/navigation/management_nav_cards.ts')); - loadTestFile(require.resolve('../common/platform_security/roles.ts')); - loadTestFile(require.resolve('../common/spaces/multiple_spaces_enabled.ts')); }); } diff --git a/x-pack/test_serverless/functional/test_suites/security/config.feature_flags.ts b/x-pack/test_serverless/functional/test_suites/security/config.feature_flags.ts index 84e80f154bee9..081887cae2380 100644 --- a/x-pack/test_serverless/functional/test_suites/security/config.feature_flags.ts +++ b/x-pack/test_serverless/functional/test_suites/security/config.feature_flags.ts @@ -18,16 +18,11 @@ export default createTestConfig({ }, suiteTags: { exclude: ['skipSvlSec'] }, // add feature flags - kbnServerArgs: [ - `--xpack.security.roleManagementEnabled=true`, - `--xpack.cloud.base_url='https://cloud.elastic.co'`, - `--xpack.cloud.organization_url='/account/members'`, - `--xpack.spaces.maxSpaces=100`, // enables spaces UI capabilities - ], + kbnServerArgs: [], // load tests in the index file testFiles: [require.resolve('./index.feature_flags.ts')], // include settings from project controller // https://github.com/elastic/project-controller/blob/main/internal/project/security/config/elasticsearch.yml - esServerArgs: ['xpack.ml.nlp.enabled=true', 'xpack.security.authc.native_roles.enabled=true'], + esServerArgs: ['xpack.ml.nlp.enabled=true'], }); diff --git a/x-pack/test_serverless/functional/test_suites/security/index.feature_flags.ts b/x-pack/test_serverless/functional/test_suites/security/index.feature_flags.ts index 212632be442d3..45849d6063231 100644 --- a/x-pack/test_serverless/functional/test_suites/security/index.feature_flags.ts +++ b/x-pack/test_serverless/functional/test_suites/security/index.feature_flags.ts @@ -10,8 +10,5 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('serverless security UI - feature flags', function () { // add tests that require feature flags, defined in config.feature_flags.ts - loadTestFile(require.resolve('../common/platform_security/navigation/management_nav_cards.ts')); - loadTestFile(require.resolve('../common/platform_security/roles.ts')); - loadTestFile(require.resolve('../common/spaces/multiple_spaces_enabled.ts')); }); } diff --git a/x-pack/test_serverless/shared/config.base.ts b/x-pack/test_serverless/shared/config.base.ts index 1c702f02cff28..8b0be99b58ae4 100644 --- a/x-pack/test_serverless/shared/config.base.ts +++ b/x-pack/test_serverless/shared/config.base.ts @@ -151,7 +151,6 @@ export default async () => { // This ensures that we register the Security SAML API endpoints. // In the real world the SAML config is injected by control plane. `--plugin-path=${samlIdPPlugin}`, - '--xpack.cloud.id=ftr_fake_cloud_id', // Ensure that SAML is used as the default authentication method whenever a user navigates to Kibana. In other // words, Kibana should attempt to authenticate the user using the provider with the lowest order if the Login // Selector is disabled (which is how Serverless Kibana is configured). By declaring `cloud-basic` with a higher @@ -167,6 +166,16 @@ export default async () => { // configure security reponse header report-to settings to mimic MKI configuration `--csp.report_to=${JSON.stringify(['violations-endpoint'])}`, `--permissionsPolicy.report_to=${JSON.stringify(['violations-endpoint'])}`, + // normally below is injected by control plane + '--xpack.cloud.id=ftr_fake_cloud_id', + `--xpack.cloud.serverless.project_id=fakeprojectid`, + `--xpack.cloud.base_url=https://fake-cloud.elastic.co`, + `--xpack.cloud.projects_url=/projects/`, + `--xpack.cloud.profile_url=/user/settings/`, + `--xpack.cloud.billing_url=/billing/overview/`, + `--xpack.cloud.deployments_url=/deployments`, + `--xpack.cloud.organization_url=/account/`, + `--xpack.cloud.users_and_roles_url=/account/members/`, ], }, diff --git a/x-pack/test_serverless/tsconfig.json b/x-pack/test_serverless/tsconfig.json index d61c5c19a63db..92048160cb622 100644 --- a/x-pack/test_serverless/tsconfig.json +++ b/x-pack/test_serverless/tsconfig.json @@ -97,8 +97,8 @@ "@kbn/test-suites-src", "@kbn/console-plugin", "@kbn/cloud-security-posture-common", - "@kbn/security-plugin-types-common", "@kbn/core-saved-objects-import-export-server-internal", + "@kbn/security-plugin-types-common", "@kbn/ai-assistant-common", ] } From 64aef09d209bbed13d79063ffaf8069d714ebd55 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 21 Oct 2024 17:30:54 +0100 Subject: [PATCH 31/69] skip flaky suite (#196711) --- .../detection_engine/rule_edit/indicator_match_rule.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/indicator_match_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/indicator_match_rule.cy.ts index fe616f6ba1969..648fa51f0abb1 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/indicator_match_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/indicator_match_rule.cy.ts @@ -58,7 +58,8 @@ describe( }); // https://github.com/elastic/kibana/issues/187621 - describe('without suppression', { tags: ['@skipInServerlessMKI'] }, () => { + // FLAKY: https://github.com/elastic/kibana/issues/196711 + describe.skip('without suppression', { tags: ['@skipInServerlessMKI'] }, () => { beforeEach(() => { createRule(rule); }); From f77badd0223cae71b86d08541876650c5aa62d7c Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 21 Oct 2024 17:32:00 +0100 Subject: [PATCH 32/69] skip flaky suite (#196851) --- .../timelines/unified_components/table_row_actions.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unified_components/table_row_actions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unified_components/table_row_actions.cy.ts index 6942571374da5..4196b1e765e98 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unified_components/table_row_actions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unified_components/table_row_actions.cy.ts @@ -21,7 +21,8 @@ import { } from '../../../../tasks/timeline'; import { ALERTS_URL } from '../../../../urls/navigation'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/196851 +describe.skip( 'Unified Timeline table Row Actions', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'], From f793c3b699a4fc719554e59f58f0c702f937907f Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 21 Oct 2024 11:59:42 -0500 Subject: [PATCH 33/69] [ci] Fix yarn-offline-mirror (#196224) Currently CI is configuring a yarn offline mirror outside of the Kibana directory, with the intention of caching assets during image build. This configuration is ignored due to .yarnrc taking precedence, resulting in the offline mirror being setup in the local Kibana installation. On CI start, a fresh checkout of the repository is made and the cache directory is empty. Instead of setting a user level configuration this modifies .yarnrc with the intended directory. --- .buildkite/scripts/common/setup_node.sh | 3 ++- .buildkite/scripts/common/util.sh | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.buildkite/scripts/common/setup_node.sh b/.buildkite/scripts/common/setup_node.sh index c6fbfeaee51bc..661c0ba19846b 100755 --- a/.buildkite/scripts/common/setup_node.sh +++ b/.buildkite/scripts/common/setup_node.sh @@ -77,7 +77,8 @@ if [[ ! $(which yarn) || $(yarn --version) != "$YARN_VERSION" ]]; then npm_install_global yarn "^$YARN_VERSION" fi -yarn config set yarn-offline-mirror "$YARN_OFFLINE_CACHE" +grep -q 'yarn-offline-mirror ".yarn-local-mirror"' .yarnrc +sed -i "s#.yarn-local-mirror#$YARN_OFFLINE_CACHE#" .yarnrc YARN_GLOBAL_BIN=$(yarn global bin) export YARN_GLOBAL_BIN diff --git a/.buildkite/scripts/common/util.sh b/.buildkite/scripts/common/util.sh index 924fedde3ea3b..90a32b1814885 100755 --- a/.buildkite/scripts/common/util.sh +++ b/.buildkite/scripts/common/util.sh @@ -33,7 +33,7 @@ check_for_changed_files() { SHOULD_AUTO_COMMIT_CHANGES="${2:-}" CUSTOM_FIX_MESSAGE="${3:-}" - GIT_CHANGES="$(git status --porcelain -- . ':!:.bazelrc' ':!:config/node.options' ':!config/kibana.yml')" + GIT_CHANGES="$(git status --porcelain -- . ':!:.bazelrc' ':!:.yarnrc' ':!:config/node.options' ':!config/kibana.yml')" if [ "$GIT_CHANGES" ]; then if ! is_auto_commit_disabled && [[ "$SHOULD_AUTO_COMMIT_CHANGES" == "true" && "${BUILDKITE_PULL_REQUEST:-false}" != "false" ]]; then @@ -56,7 +56,7 @@ check_for_changed_files() { git config --global user.name kibanamachine git config --global user.email '42973632+kibanamachine@users.noreply.github.com' gh pr checkout "${BUILDKITE_PULL_REQUEST}" - git add -A -- . ':!.bazelrc' ':!WORKSPACE.bazel' ':!config/node.options' ':!config/kibana.yml' + git add -A -- . ':!.bazelrc' ':!.yarnrc' ':!WORKSPACE.bazel' ':!config/node.options' ':!config/kibana.yml' git commit -m "$NEW_COMMIT_MESSAGE" git push From 2dc55e6c5ad25ee00d356ec33a9387a421800985 Mon Sep 17 00:00:00 2001 From: Krzysztof Kowalczyk Date: Mon, 21 Oct 2024 19:10:30 +0200 Subject: [PATCH 34/69] [Reporting] Remove kibana version from report flyout in serverless (#196670) ## Summary This PR removes `Kibana Version` from report flyout in serverless. Fixes: #196000 ## Visuals | Previous | New | |-----------------|-----------------| |![image](https://github.com/user-attachments/assets/d5a60c7f-f8f2-462c-9294-f9fa9c396c57) | ![chrome_FNKxcur8Ju](https://github.com/user-attachments/assets/ee0fe45d-e139-4223-8d8f-407745759382) | --- .../public/management/components/report_info_flyout.tsx | 2 +- .../management/components/report_info_flyout_content.tsx | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/reporting/public/management/components/report_info_flyout.tsx b/x-pack/plugins/reporting/public/management/components/report_info_flyout.tsx index b503fc11ab360..c506ddec00029 100644 --- a/x-pack/plugins/reporting/public/management/components/report_info_flyout.tsx +++ b/x-pack/plugins/reporting/public/management/components/report_info_flyout.tsx @@ -139,7 +139,7 @@ export const ReportInfoFlyout: FunctionComponent = ({ config, onClose, jo {isLoading ? ( ) : loadingError ? undefined : !!info ? ( - + ) : undefined} {!isLoading && ( diff --git a/x-pack/plugins/reporting/public/management/components/report_info_flyout_content.tsx b/x-pack/plugins/reporting/public/management/components/report_info_flyout_content.tsx index 33d81949a06bf..6820d22db8671 100644 --- a/x-pack/plugins/reporting/public/management/components/report_info_flyout_content.tsx +++ b/x-pack/plugins/reporting/public/management/components/report_info_flyout_content.tsx @@ -18,7 +18,7 @@ import { import { i18n } from '@kbn/i18n'; import { VisualReportingSoftDisabledError } from '@kbn/reporting-common/errors'; -import { Job, useKibana } from '@kbn/reporting-public'; +import { ClientConfigType, Job, useKibana } from '@kbn/reporting-public'; import { USES_HEADLESS_JOB_TYPES } from '../../../common/constants'; import { sharedI18nTexts } from '../../shared_i18n_texts'; @@ -33,6 +33,7 @@ const UNKNOWN = i18n.translate('xpack.reporting.listing.infoPanel.unknownLabel', interface Props { info: Job; + config: ClientConfigType; } const createDateFormatter = (format: string, tz: string) => (date: string) => { @@ -40,7 +41,7 @@ const createDateFormatter = (format: string, tz: string) => (date: string) => { return m.isValid() ? m.format(format) : NA; }; -export const ReportInfoFlyoutContent: FunctionComponent = ({ info }) => { +export const ReportInfoFlyoutContent: FunctionComponent = ({ info, config }) => { const { services: { uiSettings, docLinks }, } = useKibana(); @@ -50,6 +51,8 @@ export const ReportInfoFlyoutContent: FunctionComponent = ({ info }) => { ? moment.tz.guess() : uiSettings.get('dateFormat:tz'); + const showKibanaVersion = Boolean(info.version) && config.statefulSettings.enabled; + const formatDate = createDateFormatter(uiSettings.get('dateFormat'), timezone); const formatMilliseconds = (millis: number) => i18n.translate('xpack.reporting.listing.infoPanel.msToSeconds', { @@ -74,7 +77,7 @@ export const ReportInfoFlyoutContent: FunctionComponent = ({ info }) => { }), description: info.prettyStatus, }, - Boolean(info.version) && { + showKibanaVersion && { title: i18n.translate('xpack.reporting.listing.infoPanel.kibanaVersion', { defaultMessage: 'Kibana version', }), From fb33997adda561175604e68d99129fe3c64de26b Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Mon, 21 Oct 2024 12:27:03 -0500 Subject: [PATCH 35/69] Revert "[ci] Fix yarn-offline-mirror (#196224)" This reverts commit f793c3b699a4fc719554e59f58f0c702f937907f. --- .buildkite/scripts/common/setup_node.sh | 3 +-- .buildkite/scripts/common/util.sh | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.buildkite/scripts/common/setup_node.sh b/.buildkite/scripts/common/setup_node.sh index 661c0ba19846b..c6fbfeaee51bc 100755 --- a/.buildkite/scripts/common/setup_node.sh +++ b/.buildkite/scripts/common/setup_node.sh @@ -77,8 +77,7 @@ if [[ ! $(which yarn) || $(yarn --version) != "$YARN_VERSION" ]]; then npm_install_global yarn "^$YARN_VERSION" fi -grep -q 'yarn-offline-mirror ".yarn-local-mirror"' .yarnrc -sed -i "s#.yarn-local-mirror#$YARN_OFFLINE_CACHE#" .yarnrc +yarn config set yarn-offline-mirror "$YARN_OFFLINE_CACHE" YARN_GLOBAL_BIN=$(yarn global bin) export YARN_GLOBAL_BIN diff --git a/.buildkite/scripts/common/util.sh b/.buildkite/scripts/common/util.sh index 90a32b1814885..924fedde3ea3b 100755 --- a/.buildkite/scripts/common/util.sh +++ b/.buildkite/scripts/common/util.sh @@ -33,7 +33,7 @@ check_for_changed_files() { SHOULD_AUTO_COMMIT_CHANGES="${2:-}" CUSTOM_FIX_MESSAGE="${3:-}" - GIT_CHANGES="$(git status --porcelain -- . ':!:.bazelrc' ':!:.yarnrc' ':!:config/node.options' ':!config/kibana.yml')" + GIT_CHANGES="$(git status --porcelain -- . ':!:.bazelrc' ':!:config/node.options' ':!config/kibana.yml')" if [ "$GIT_CHANGES" ]; then if ! is_auto_commit_disabled && [[ "$SHOULD_AUTO_COMMIT_CHANGES" == "true" && "${BUILDKITE_PULL_REQUEST:-false}" != "false" ]]; then @@ -56,7 +56,7 @@ check_for_changed_files() { git config --global user.name kibanamachine git config --global user.email '42973632+kibanamachine@users.noreply.github.com' gh pr checkout "${BUILDKITE_PULL_REQUEST}" - git add -A -- . ':!.bazelrc' ':!.yarnrc' ':!WORKSPACE.bazel' ':!config/node.options' ':!config/kibana.yml' + git add -A -- . ':!.bazelrc' ':!WORKSPACE.bazel' ':!config/node.options' ':!config/kibana.yml' git commit -m "$NEW_COMMIT_MESSAGE" git push From 399aed9b19935651b979dc68ad88429a156dae2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Kopyci=C5=84ski?= Date: Mon, 21 Oct 2024 20:32:06 +0200 Subject: [PATCH 36/69] [Security Assistant] Fix KB output fields (#196567) ## Summary Fixes Assistant Knowledge Base output fields field logic Fixes Security Assistant card not appearing on Serverless Reverts Assistant Cog wheel settings button when FF `assistantKnowledgeBaseByDefault` is off ![image](https://github.com/user-attachments/assets/2460cf22-c02a-4513-98d1-5fbcd75d117b) --- .../impl/assistant/index.test.tsx | 107 +++++++++++++++ .../settings/assistant_settings.test.tsx | 13 +- .../assistant/settings/assistant_settings.tsx | 124 +++++++++++++++++- .../assistant_settings_button.test.tsx | 9 ++ .../settings/assistant_settings_button.tsx | 51 +++++-- .../index_entry_editor.test.tsx | 52 ++++---- .../index_entry_editor.tsx | 109 +++++++++++---- .../features/src/assistant/kibana_features.ts | 6 + 8 files changed, 406 insertions(+), 65 deletions(-) diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.test.tsx index 08bac25c0a522..1ef2db7b26c03 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.test.tsx @@ -24,6 +24,7 @@ import { Conversation } from '../assistant_context/types'; import * as all from './chat_send/use_chat_send'; import { useConversation } from './use_conversation'; import { AIConnector } from '../connectorland/connector_selector'; +import { omit } from 'lodash'; jest.mock('../connectorland/use_load_connectors'); jest.mock('../connectorland/connector_setup'); @@ -140,6 +141,112 @@ describe('Assistant', () => { >); }); + describe('persistent storage', () => { + it('should refetchCurrentUserConversations after settings save button click', async () => { + const chatSendSpy = jest.spyOn(all, 'useChatSend'); + await renderAssistant(); + + fireEvent.click(screen.getByTestId('settings')); + + jest.mocked(useFetchCurrentUserConversations).mockReturnValue({ + data: { + ...mockData, + welcome_id: { + ...mockData.welcome_id, + apiConfig: { newProp: true }, + }, + }, + isLoading: false, + refetch: jest.fn().mockResolvedValue({ + isLoading: false, + data: { + ...mockData, + welcome_id: { + ...mockData.welcome_id, + apiConfig: { newProp: true }, + }, + }, + }), + isFetched: true, + } as unknown as DefinedUseQueryResult, unknown>); + + await act(async () => { + fireEvent.click(screen.getByTestId('save-button')); + }); + + expect(chatSendSpy).toHaveBeenLastCalledWith( + expect.objectContaining({ + currentConversation: { + apiConfig: { newProp: true }, + category: 'assistant', + id: mockData.welcome_id.id, + messages: [], + title: 'Welcome', + replacements: {}, + }, + }) + ); + }); + + it('should refetchCurrentUserConversations after settings save button click, but do not update convos when refetch returns bad results', async () => { + jest.mocked(useFetchCurrentUserConversations).mockReturnValue({ + data: mockData, + isLoading: false, + refetch: jest.fn().mockResolvedValue({ + isLoading: false, + data: omit(mockData, 'welcome_id'), + }), + isFetched: true, + } as unknown as DefinedUseQueryResult, unknown>); + const chatSendSpy = jest.spyOn(all, 'useChatSend'); + await renderAssistant(); + + fireEvent.click(screen.getByTestId('settings')); + await act(async () => { + fireEvent.click(screen.getByTestId('save-button')); + }); + + expect(chatSendSpy).toHaveBeenLastCalledWith( + expect.objectContaining({ + currentConversation: { + apiConfig: { connectorId: '123' }, + replacements: {}, + category: 'assistant', + id: mockData.welcome_id.id, + messages: [], + title: 'Welcome', + }, + }) + ); + }); + + it('should delete conversation when delete button is clicked', async () => { + await renderAssistant(); + const deleteButton = screen.getAllByTestId('delete-option')[0]; + await act(async () => { + fireEvent.click(deleteButton); + }); + + await act(async () => { + fireEvent.click(screen.getByTestId('confirmModalConfirmButton')); + }); + + await waitFor(() => { + expect(mockDeleteConvo).toHaveBeenCalledWith(mockData.electric_sheep_id.id); + }); + }); + it('should refetchCurrentUserConversations after clear chat history button click', async () => { + await renderAssistant(); + fireEvent.click(screen.getByTestId('chat-context-menu')); + fireEvent.click(screen.getByTestId('clear-chat')); + fireEvent.click(screen.getByTestId('confirmModalConfirmButton')); + await waitFor(() => { + expect(clearConversation).toHaveBeenCalled(); + expect(refetchResults).toHaveBeenCalled(); + }); + }); + }); + describe('when selected conversation changes and some connectors are loaded', () => { it('should persist the conversation id to local storage', async () => { const getConversation = jest.fn().mockResolvedValue(mockData.electric_sheep_id); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings.test.tsx index 14bfcb4cdbbec..c9f4f07d83b11 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings.test.tsx @@ -38,7 +38,7 @@ const mockContext = { basePromptContexts: MOCK_QUICK_PROMPTS, setSelectedSettingsTab, http: {}, - assistantFeatures: { assistantModelEvaluation: true }, + assistantFeatures: { assistantModelEvaluation: true, assistantKnowledgeBaseByDefault: false }, selectedSettingsTab: 'CONVERSATIONS_TAB', assistantAvailability: { isAssistantEnabled: true, @@ -136,6 +136,17 @@ describe('AssistantSettings', () => { QUICK_PROMPTS_TAB, SYSTEM_PROMPTS_TAB, ])('%s', (tab) => { + it('Opens the tab on button click', () => { + (useAssistantContext as jest.Mock).mockImplementation(() => ({ + ...mockContext, + selectedSettingsTab: tab === CONVERSATIONS_TAB ? ANONYMIZATION_TAB : CONVERSATIONS_TAB, + })); + const { getByTestId } = render(, { + wrapper, + }); + fireEvent.click(getByTestId(`${tab}-button`)); + expect(setSelectedSettingsTab).toHaveBeenCalledWith(tab); + }); it('renders with the correct tab open', () => { (useAssistantContext as jest.Mock).mockImplementation(() => ({ ...mockContext, diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings.tsx index f325e411bae2b..350780ea5b168 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings.tsx @@ -9,10 +9,14 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { EuiButton, EuiButtonEmpty, + EuiIcon, EuiModal, EuiModalFooter, + EuiKeyPadMenu, + EuiKeyPadMenuItem, EuiPage, EuiPageBody, + EuiPageSidebar, EuiSplitPanel, } from '@elastic/eui'; @@ -76,7 +80,16 @@ export const AssistantSettings: React.FC = React.memo( conversations, conversationsLoaded, }) => { - const { http, toasts, selectedSettingsTab, setSelectedSettingsTab } = useAssistantContext(); + const { + assistantFeatures: { + assistantModelEvaluation: modelEvaluatorEnabled, + assistantKnowledgeBaseByDefault, + }, + http, + toasts, + selectedSettingsTab, + setSelectedSettingsTab, + } = useAssistantContext(); useEffect(() => { if (selectedSettingsTab == null) { @@ -201,6 +214,115 @@ export const AssistantSettings: React.FC = React.memo( return ( + {!assistantKnowledgeBaseByDefault && ( + + + setSelectedSettingsTab(CONVERSATIONS_TAB)} + data-test-subj={`${CONVERSATIONS_TAB}-button`} + > + <> + + + + + setSelectedSettingsTab(QUICK_PROMPTS_TAB)} + data-test-subj={`${QUICK_PROMPTS_TAB}-button`} + > + <> + + + + + setSelectedSettingsTab(SYSTEM_PROMPTS_TAB)} + data-test-subj={`${SYSTEM_PROMPTS_TAB}-button`} + > + + + + setSelectedSettingsTab(ANONYMIZATION_TAB)} + data-test-subj={`${ANONYMIZATION_TAB}-button`} + > + + + setSelectedSettingsTab(KNOWLEDGE_BASE_TAB)} + data-test-subj={`${KNOWLEDGE_BASE_TAB}-button`} + > + + + {modelEvaluatorEnabled && ( + setSelectedSettingsTab(EVALUATION_TAB)} + data-test-subj={`${EVALUATION_TAB}-button`} + > + + + )} + + + )} + { const original = jest.requireActual('../../assistant_context'); @@ -57,6 +59,13 @@ describe('AssistantSettingsButton', () => { jest.clearAllMocks(); }); + it('Clicking the settings gear opens the conversations tab', () => { + const { getByTestId } = render(); + fireEvent.click(getByTestId('settings')); + expect(setSelectedSettingsTab).toHaveBeenCalledWith(CONVERSATIONS_TAB); + expect(setIsSettingsModalVisible).toHaveBeenCalledWith(true); + }); + it('Settings modal is visible and calls correct actions per click', () => { const { getByTestId } = render( diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings_button.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings_button.tsx index 40bf1e740ab60..3d6544643ba3e 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings_button.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/assistant_settings_button.tsx @@ -6,6 +6,7 @@ */ import React, { useCallback } from 'react'; +import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; import { QueryObserverResult, RefetchOptions, RefetchQueryFilters } from '@tanstack/react-query'; import { DataStreamApis } from '../use_data_stream_apis'; import { AIConnector } from '../../connectorland/connector_selector'; @@ -13,6 +14,7 @@ import { Conversation } from '../../..'; import { AssistantSettings } from './assistant_settings'; import * as i18n from './translations'; import { useAssistantContext } from '../../assistant_context'; +import { CONVERSATIONS_TAB } from './const'; interface Props { defaultConnector?: AIConnector; @@ -45,7 +47,11 @@ export const AssistantSettingsButton: React.FC = React.memo( refetchCurrentUserConversations, refetchPrompts, }) => { - const { toasts } = useAssistantContext(); + const { + assistantFeatures: { assistantKnowledgeBaseByDefault }, + toasts, + setSelectedSettingsTab, + } = useAssistantContext(); // Modal control functions const cleanupAndCloseModal = useCallback(() => { @@ -73,18 +79,39 @@ export const AssistantSettingsButton: React.FC = React.memo( [cleanupAndCloseModal, refetchCurrentUserConversations, refetchPrompts, toasts] ); + const handleShowConversationSettings = useCallback(() => { + setSelectedSettingsTab(CONVERSATIONS_TAB); + setIsSettingsModalVisible(true); + }, [setIsSettingsModalVisible, setSelectedSettingsTab]); + return ( - isSettingsModalVisible && ( - - ) + <> + {!assistantKnowledgeBaseByDefault && ( + + + + )} + + {isSettingsModalVisible && ( + + )} + ); } ); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.test.tsx index d4634cdf4c563..e4656b10d1d31 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.test.tsx @@ -42,10 +42,10 @@ describe('IndexEntryEditor', () => { jest.clearAllMocks(); }); - it('renders the form fields with initial values', () => { + it('renders the form fields with initial values', async () => { const { getByDisplayValue } = render(); - waitFor(() => { + await waitFor(() => { expect(getByDisplayValue('Test Entry')).toBeInTheDocument(); expect(getByDisplayValue('Test Description')).toBeInTheDocument(); expect(getByDisplayValue('Test Query Description')).toBeInTheDocument(); @@ -54,35 +54,37 @@ describe('IndexEntryEditor', () => { }); }); - it('updates the name field on change', () => { + it('updates the name field on change', async () => { const { getByTestId } = render(); - waitFor(() => { + await waitFor(() => { const nameInput = getByTestId('entry-name'); fireEvent.change(nameInput, { target: { value: 'New Entry Name' } }); + expect(mockSetEntry).toHaveBeenCalledWith(expect.any(Function)); }); - - expect(mockSetEntry).toHaveBeenCalledWith(expect.any(Function)); }); - it('updates the description field on change', () => { + it('updates the description field on change', async () => { const { getByTestId } = render(); - waitFor(() => { + + await waitFor(() => { const descriptionInput = getByTestId('entry-description'); fireEvent.change(descriptionInput, { target: { value: 'New Description' } }); }); - expect(mockSetEntry).toHaveBeenCalledWith(expect.any(Function)); + await waitFor(() => { + expect(mockSetEntry).toHaveBeenCalledWith(expect.any(Function)); + }); }); - it('updates the query description field on change', () => { + it('updates the query description field on change', async () => { const { getByTestId } = render(); - waitFor(() => { + + await waitFor(() => { const queryDescriptionInput = getByTestId('query-description'); fireEvent.change(queryDescriptionInput, { target: { value: 'New Query Description' } }); + expect(mockSetEntry).toHaveBeenCalledWith(expect.any(Function)); }); - - expect(mockSetEntry).toHaveBeenCalledWith(expect.any(Function)); }); it('displays sharing options and updates on selection', async () => { @@ -91,8 +93,6 @@ describe('IndexEntryEditor', () => { await waitFor(() => { fireEvent.click(getByTestId('sharing-select')); fireEvent.click(getByTestId('sharing-private-option')); - }); - await waitFor(() => { expect(mockSetEntry).toHaveBeenCalledWith(expect.any(Function)); }); }); @@ -100,28 +100,25 @@ describe('IndexEntryEditor', () => { it('fetches index options and updates on selection', async () => { const { getAllByTestId, getByTestId } = render(); - await waitFor(() => expect(mockDataViews.getIndices).toHaveBeenCalled()); - await waitFor(() => { + expect(mockDataViews.getIndices).toHaveBeenCalled(); fireEvent.click(getByTestId('index-combobox')); fireEvent.click(getAllByTestId('comboBoxToggleListButton')[0]); + fireEvent.click(getByTestId('index-2')); + expect(mockSetEntry).toHaveBeenCalledWith(expect.any(Function)); }); - fireEvent.click(getByTestId('index-2')); - - expect(mockSetEntry).toHaveBeenCalledWith(expect.any(Function)); }); it('fetches field options based on selected index and updates on selection', async () => { const { getByTestId, getAllByTestId } = render(); - await waitFor(() => + await waitFor(() => { expect(mockDataViews.getFieldsForWildcard).toHaveBeenCalledWith({ pattern: 'index-1', - fieldTypes: ['semantic_text'], - }) - ); + }); + }); - await waitFor(() => { + await waitFor(async () => { fireEvent.click(getByTestId('index-combobox')); fireEvent.click(getAllByTestId('comboBoxToggleListButton')[0]); }); @@ -135,7 +132,10 @@ describe('IndexEntryEditor', () => { within(getByTestId('entry-combobox')).getByTestId('comboBoxSearchInput'), 'field-3' ); - expect(mockSetEntry).toHaveBeenCalledWith(expect.any(Function)); + + await waitFor(() => { + expect(mockSetEntry).toHaveBeenCalledWith(expect.any(Function)); + }); }); it('disables the field combo box if no index is selected', () => { diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.tsx b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.tsx index 7475ea55ca5fc..550861bcbffd9 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.tsx @@ -17,7 +17,7 @@ import { EuiSuperSelect, } from '@elastic/eui'; import useAsync from 'react-use/lib/useAsync'; -import React, { useCallback } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { IndexEntry } from '@kbn/elastic-assistant-common'; import { DataViewsContract } from '@kbn/data-views-plugin/public'; import * as i18n from './translations'; @@ -96,29 +96,37 @@ export const IndexEntryEditor: React.FC = React.memo( })); }, [dataViews]); - const fieldOptions = useAsync(async () => { - const fields = await dataViews.getFieldsForWildcard({ - pattern: entry?.index ?? '', - fieldTypes: ['semantic_text'], - }); + const indexFields = useAsync( + async () => + dataViews.getFieldsForWildcard({ + pattern: entry?.index ?? '', + }), + [] + ); - return fields - .filter((field) => field.esTypes?.includes('semantic_text')) - .map((field) => ({ + const fieldOptions = useMemo( + () => + indexFields?.value + ?.filter((field) => field.esTypes?.includes('semantic_text')) + .map((field) => ({ + 'data-test-subj': field.name, + label: field.name, + value: field.name, + })) ?? [], + [indexFields?.value] + ); + + const outputFieldOptions = useMemo( + () => + indexFields?.value?.map((field) => ({ 'data-test-subj': field.name, label: field.name, value: field.name, - })); - }, [entry]); - - const setIndex = useCallback( - async (e: Array>) => { - setEntry((prevEntry) => ({ ...prevEntry, index: e[0]?.value })); - }, - [setEntry] + })) ?? [], + [indexFields?.value] ); - const onCreateOption = (searchValue: string) => { + const onCreateIndexOption = (searchValue: string) => { const normalizedSearchValue = searchValue.trim().toLowerCase(); if (!normalizedSearchValue) { @@ -131,7 +139,6 @@ export const IndexEntryEditor: React.FC = React.memo( }; setIndex([newOption]); - setField([{ label: '', value: '' }]); }; const onCreateFieldOption = (searchValue: string) => { @@ -170,6 +177,52 @@ export const IndexEntryEditor: React.FC = React.memo( [setEntry] ); + // Field + const setOutputFields = useCallback( + async (e: Array>) => { + setEntry((prevEntry) => ({ + ...prevEntry, + outputFields: e + ?.filter((option) => !!option.value) + .map((option) => option.value as string), + })); + }, + [setEntry] + ); + + const setIndex = useCallback( + async (e: Array>) => { + setEntry((prevEntry) => ({ ...prevEntry, index: e[0]?.value })); + setField([]); + setOutputFields([]); + }, + [setEntry, setField, setOutputFields] + ); + + const onCreateOutputFieldsOption = useCallback( + (searchValue: string) => { + const normalizedSearchValue = searchValue.trim().toLowerCase(); + + if (!normalizedSearchValue) { + return; + } + + const newOption: EuiComboBoxOptionOption = { + label: searchValue, + value: searchValue, + }; + + setOutputFields([ + ...(entry?.outputFields?.map((field) => ({ + label: field, + value: field, + })) ?? []), + newOption, + ]); + }, + [entry?.outputFields, setOutputFields] + ); + return ( = React.memo( aria-label={i18n.ENTRY_INDEX_NAME_INPUT_LABEL} isClearable={true} singleSelection={{ asPlainText: true }} - onCreateOption={onCreateOption} + onCreateOption={onCreateIndexOption} fullWidth options={indexOptions.value ?? []} selectedOptions={ @@ -228,7 +281,7 @@ export const IndexEntryEditor: React.FC = React.memo( singleSelection={{ asPlainText: true }} onCreateOption={onCreateFieldOption} fullWidth - options={fieldOptions.value ?? []} + options={fieldOptions} selectedOptions={ entry?.field ? [ @@ -281,11 +334,17 @@ export const IndexEntryEditor: React.FC = React.memo( ({ + label: field, + value: field, + })) ?? [] + } + onChange={setOutputFields} /> diff --git a/x-pack/packages/security-solution/features/src/assistant/kibana_features.ts b/x-pack/packages/security-solution/features/src/assistant/kibana_features.ts index e7bafd5595316..81cf7d18af129 100644 --- a/x-pack/packages/security-solution/features/src/assistant/kibana_features.ts +++ b/x-pack/packages/security-solution/features/src/assistant/kibana_features.ts @@ -26,6 +26,9 @@ export const getAssistantBaseKibanaFeature = (): BaseKibanaFeatureConfig => ({ app: [ASSISTANT_FEATURE_ID, 'kibana'], catalogue: [APP_ID], minimumLicense: 'enterprise', + management: { + kibana: ['securityAiAssistantManagement'], + }, privileges: { all: { api: ['elasticAssistant'], @@ -36,6 +39,9 @@ export const getAssistantBaseKibanaFeature = (): BaseKibanaFeatureConfig => ({ read: [], }, ui: [], + management: { + kibana: ['securityAiAssistantManagement'], + }, }, read: { // No read-only mode currently supported From ce7616ad5937da9a45b349cad26326f3ba5b0c42 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Mon, 21 Oct 2024 14:44:32 -0400 Subject: [PATCH 37/69] [Fleet] Limit pagination size when retrieving full policy or withAgentCount (#196887) --- oas_docs/bundle.json | 12 +++ oas_docs/bundle.serverless.json | 12 +++ .../output/kibana.serverless.staging.yaml | 13 ++- oas_docs/output/kibana.serverless.yaml | 13 ++- oas_docs/output/kibana.staging.yaml | 13 ++- oas_docs/output/kibana.yaml | 13 ++- .../common/types/rest_spec/agent_policy.ts | 1 + x-pack/plugins/fleet/cypress/tasks/cleanup.ts | 24 +++--- .../sections/agent_policy/list_page/index.tsx | 2 +- .../components/agent_policy_debugger.tsx | 3 +- .../components/preconfiguration_debugger.tsx | 4 +- .../server/routes/agent_policy/handlers.ts | 5 +- .../types/rest_spec/agent_policy.test.ts | 78 ++++++++++++++++++ .../server/types/rest_spec/agent_policy.ts | 80 ++++++++++++------- .../apis/agent_policy/agent_policy.ts | 4 +- 15 files changed, 222 insertions(+), 55 deletions(-) create mode 100644 x-pack/plugins/fleet/server/types/rest_spec/agent_policy.test.ts diff --git a/oas_docs/bundle.json b/oas_docs/bundle.json index ca864dd0bcc63..169133c63753c 100644 --- a/oas_docs/bundle.json +++ b/oas_docs/bundle.json @@ -7121,14 +7121,26 @@ } }, { + "description": "use withAgentCount instead", "in": "query", "name": "noAgentCount", "required": false, + "schema": { + "deprecated": true, + "type": "boolean" + } + }, + { + "description": "get policies with agent count", + "in": "query", + "name": "withAgentCount", + "required": false, "schema": { "type": "boolean" } }, { + "description": "get full policies with package policies populated", "in": "query", "name": "full", "required": false, diff --git a/oas_docs/bundle.serverless.json b/oas_docs/bundle.serverless.json index a11d7afd89b3b..1d989c69f48d4 100644 --- a/oas_docs/bundle.serverless.json +++ b/oas_docs/bundle.serverless.json @@ -7121,14 +7121,26 @@ } }, { + "description": "use withAgentCount instead", "in": "query", "name": "noAgentCount", "required": false, + "schema": { + "deprecated": true, + "type": "boolean" + } + }, + { + "description": "get policies with agent count", + "in": "query", + "name": "withAgentCount", + "required": false, "schema": { "type": "boolean" } }, { + "description": "get full policies with package policies populated", "in": "query", "name": "full", "required": false, diff --git a/oas_docs/output/kibana.serverless.staging.yaml b/oas_docs/output/kibana.serverless.staging.yaml index d1ca7e16557e8..e7a3e9c42ec7a 100644 --- a/oas_docs/output/kibana.serverless.staging.yaml +++ b/oas_docs/output/kibana.serverless.staging.yaml @@ -10428,12 +10428,21 @@ paths: required: false schema: type: string - - in: query + - description: use withAgentCount instead + in: query name: noAgentCount required: false schema: + deprecated: true type: boolean - - in: query + - description: get policies with agent count + in: query + name: withAgentCount + required: false + schema: + type: boolean + - description: get full policies with package policies populated + in: query name: full required: false schema: diff --git a/oas_docs/output/kibana.serverless.yaml b/oas_docs/output/kibana.serverless.yaml index d1ca7e16557e8..e7a3e9c42ec7a 100644 --- a/oas_docs/output/kibana.serverless.yaml +++ b/oas_docs/output/kibana.serverless.yaml @@ -10428,12 +10428,21 @@ paths: required: false schema: type: string - - in: query + - description: use withAgentCount instead + in: query name: noAgentCount required: false schema: + deprecated: true type: boolean - - in: query + - description: get policies with agent count + in: query + name: withAgentCount + required: false + schema: + type: boolean + - description: get full policies with package policies populated + in: query name: full required: false schema: diff --git a/oas_docs/output/kibana.staging.yaml b/oas_docs/output/kibana.staging.yaml index 827f453683bca..16aa969df06d0 100644 --- a/oas_docs/output/kibana.staging.yaml +++ b/oas_docs/output/kibana.staging.yaml @@ -13857,12 +13857,21 @@ paths: required: false schema: type: string - - in: query + - description: use withAgentCount instead + in: query name: noAgentCount required: false schema: + deprecated: true type: boolean - - in: query + - description: get policies with agent count + in: query + name: withAgentCount + required: false + schema: + type: boolean + - description: get full policies with package policies populated + in: query name: full required: false schema: diff --git a/oas_docs/output/kibana.yaml b/oas_docs/output/kibana.yaml index 827f453683bca..16aa969df06d0 100644 --- a/oas_docs/output/kibana.yaml +++ b/oas_docs/output/kibana.yaml @@ -13857,12 +13857,21 @@ paths: required: false schema: type: string - - in: query + - description: use withAgentCount instead + in: query name: noAgentCount required: false schema: + deprecated: true type: boolean - - in: query + - description: get policies with agent count + in: query + name: withAgentCount + required: false + schema: + type: boolean + - description: get full policies with package policies populated + in: query name: full required: false schema: diff --git a/x-pack/plugins/fleet/common/types/rest_spec/agent_policy.ts b/x-pack/plugins/fleet/common/types/rest_spec/agent_policy.ts index 4e6a85ccdc270..42f44f7c7271e 100644 --- a/x-pack/plugins/fleet/common/types/rest_spec/agent_policy.ts +++ b/x-pack/plugins/fleet/common/types/rest_spec/agent_policy.ts @@ -12,6 +12,7 @@ import type { ListResult, ListWithKuery, BulkGetResult } from './common'; export interface GetAgentPoliciesRequest { query: ListWithKuery & { noAgentCount?: boolean; + withAgentCount?: boolean; full?: boolean; }; } diff --git a/x-pack/plugins/fleet/cypress/tasks/cleanup.ts b/x-pack/plugins/fleet/cypress/tasks/cleanup.ts index bad8743b66bd1..2a5ac414f49e5 100644 --- a/x-pack/plugins/fleet/cypress/tasks/cleanup.ts +++ b/x-pack/plugins/fleet/cypress/tasks/cleanup.ts @@ -8,19 +8,19 @@ import { request } from './common'; export function cleanupAgentPolicies(spaceId?: string) { - request({ url: `${spaceId ? `/s/${spaceId}` : ''}/api/fleet/agent_policies` }).then( - (response: any) => { - response.body.items - .filter((policy: any) => policy.agents === 0) - .forEach((policy: any) => { - request({ - method: 'POST', - url: `${spaceId ? `/s/${spaceId}` : ''}/api/fleet/agent_policies/delete`, - body: { agentPolicyId: policy.id }, - }); + request({ + url: `${spaceId ? `/s/${spaceId}` : ''}/api/fleet/agent_policies?withAgentCount=true`, + }).then((response: any) => { + response.body.items + .filter((policy: any) => policy.agents === 0) + .forEach((policy: any) => { + request({ + method: 'POST', + url: `${spaceId ? `/s/${spaceId}` : ''}/api/fleet/agent_policies/delete`, + body: { agentPolicyId: policy.id }, }); - } - ); + }); + }); } export function unenrollAgent() { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/list_page/index.tsx index 2682a5239071d..a617629163778 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/list_page/index.tsx @@ -98,7 +98,7 @@ export const AgentPolicyListPage: React.FunctionComponent<{}> = () => { sortField: sorting?.field, sortOrder: sorting?.direction, kuery: search, - noAgentCount: false, // Explicitly fetch agent count + withAgentCount: true, // Explicitly fetch agent count full: true, }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/agent_policy_debugger.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/agent_policy_debugger.tsx index 98eed3cb63b4d..58e9a4ac074f7 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/agent_policy_debugger.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/agent_policy_debugger.tsx @@ -22,7 +22,6 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { sendGetAgentPolicies, useLink } from '../../../hooks'; -import { SO_SEARCH_LIMIT } from '../../../constants'; import { policyHasFleetServer } from '../../../services'; import type { AgentPolicy } from '../../../types'; @@ -35,7 +34,7 @@ import { CodeBlock } from './code_block'; const fetchAgentPolicies = async () => { const response = await sendGetAgentPolicies({ full: true, - perPage: SO_SEARCH_LIMIT, + perPage: 100, sortOrder: 'asc', }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/preconfiguration_debugger.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/preconfiguration_debugger.tsx index f140e4068d040..3072c87636479 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/preconfiguration_debugger.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/preconfiguration_debugger.tsx @@ -29,7 +29,7 @@ import { useLink, useStartServices, } from '../../../hooks'; -import { LEGACY_AGENT_POLICY_SAVED_OBJECT_TYPE, SO_SEARCH_LIMIT } from '../../../constants'; +import { LEGACY_AGENT_POLICY_SAVED_OBJECT_TYPE } from '../../../constants'; import { queryClient } from '..'; import { CodeBlock } from './code_block'; @@ -37,7 +37,7 @@ import { CodeBlock } from './code_block'; const fetchPreconfiguredPolicies = async () => { const kuery = `${LEGACY_AGENT_POLICY_SAVED_OBJECT_TYPE}.is_preconfigured:true`; - const response = await sendGetAgentPolicies({ kuery, perPage: SO_SEARCH_LIMIT, full: true }); + const response = await sendGetAgentPolicies({ kuery, perPage: 100, full: true }); if (response.error) { throw new Error(response.error.message); diff --git a/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts b/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts index d22d8790ef481..2c93880c10609 100644 --- a/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts @@ -133,7 +133,8 @@ export const getAgentPoliciesHandler: FleetRequestHandler< const esClient = coreContext.elasticsearch.client.asInternalUser; const { full: withPackagePolicies = false, - noAgentCount = false, + noAgentCount, + withAgentCount, format, ...restOfQuery } = request.query; @@ -150,7 +151,7 @@ export const getAgentPoliciesHandler: FleetRequestHandler< let { items } = agentPoliciesResponse; const { total, page, perPage } = agentPoliciesResponse; - if (fleetContext.authz.fleet.readAgents && !noAgentCount) { + if (fleetContext.authz.fleet.readAgents && (noAgentCount === false || withAgentCount)) { await populateAssignedAgentsCount(fleetContext.agentClient.asCurrentUser, items); } diff --git a/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.test.ts b/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.test.ts new file mode 100644 index 0000000000000..da9e7f962b158 --- /dev/null +++ b/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.test.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { GetAgentPoliciesRequestSchema } from './agent_policy'; + +describe('GetAgentPoliciesRequestSchema.query', () => { + it('should work without query parameters', () => { + expect(() => GetAgentPoliciesRequestSchema.query.validate({})).not.toThrow(); + }); + + it('should work with perPage being less than 100', () => { + expect(() => GetAgentPoliciesRequestSchema.query.validate({ perPage: 50 })).not.toThrow(); + }); + + it('should work with perPage being more than 100', () => { + expect(() => GetAgentPoliciesRequestSchema.query.validate({ perPage: 500 })).not.toThrow(); + }); + + it('should work with perPage being less than 100 and agentCount and full', () => { + expect(() => + GetAgentPoliciesRequestSchema.query.validate({ perPage: 50, full: true, noAgentCount: false }) + ).not.toThrow(); + }); + + it('should work with perPage being less than 100 and agentCount', () => { + expect(() => + GetAgentPoliciesRequestSchema.query.validate({ perPage: 50, noAgentCount: true }) + ).not.toThrow(); + }); + + it('should work with perPage being less than 100 and no agentCount and full', () => { + expect(() => + GetAgentPoliciesRequestSchema.query.validate({ perPage: 50, full: true, noAgentCount: false }) + ).not.toThrow(); + }); + + it('should throw with perPage being more than 100 and noagentCount', () => { + expect(() => + GetAgentPoliciesRequestSchema.query.validate({ + perPage: 500, + noAgentCount: false, + }) + ).toThrow(/perPage should be less or equal to 100 when fetching full policies or agent count./); + }); + + it('should throw with perPage being more than 100 and withAgentCount', () => { + expect(() => + GetAgentPoliciesRequestSchema.query.validate({ + perPage: 500, + withAgentCount: true, + }) + ).toThrow(/perPage should be less or equal to 100 when fetching full policies or agent count./); + }); + + it('should throw without perPage being more than 100 and full', () => { + expect(() => + GetAgentPoliciesRequestSchema.query.validate({ + perPage: 500, + noAgentCount: true, + full: true, + }) + ).toThrow(/perPage should be less or equal to 100 when fetching full policies or agent count./); + }); + + it('should not throw with perPage being more than 100 and no agentCount and no full', () => { + expect(() => + GetAgentPoliciesRequestSchema.query.validate({ + perPage: 500, + full: false, + noAgentCount: true, + }) + ).not.toThrow(); + }); +}); diff --git a/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.ts b/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.ts index c680c3477d836..b5fc70b70af85 100644 --- a/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.ts +++ b/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.ts @@ -20,33 +20,59 @@ import { validateKuery } from '../../routes/utils/filter_utils'; import { BulkRequestBodySchema } from './common'; export const GetAgentPoliciesRequestSchema = { - query: schema.object({ - page: schema.maybe(schema.number({ defaultValue: 1 })), - perPage: schema.maybe(schema.number({ defaultValue: 20 })), - sortField: schema.maybe(schema.string()), - sortOrder: schema.maybe(schema.oneOf([schema.literal('desc'), schema.literal('asc')])), - showUpgradeable: schema.maybe(schema.boolean()), - kuery: schema.maybe( - schema.string({ - validate: (value: string) => { - const validationObj = validateKuery( - value, - [LEGACY_AGENT_POLICY_SAVED_OBJECT_TYPE], - AGENT_POLICY_MAPPINGS, - true - ); - if (validationObj?.error) { - return validationObj?.error; - } - }, - }) - ), - noAgentCount: schema.maybe(schema.boolean()), - full: schema.maybe(schema.boolean()), - format: schema.maybe( - schema.oneOf([schema.literal(inputsFormat.Simplified), schema.literal(inputsFormat.Legacy)]) - ), - }), + query: schema.object( + { + page: schema.maybe(schema.number({ defaultValue: 1 })), + perPage: schema.maybe(schema.number({ defaultValue: 20 })), + sortField: schema.maybe(schema.string()), + sortOrder: schema.maybe(schema.oneOf([schema.literal('desc'), schema.literal('asc')])), + showUpgradeable: schema.maybe(schema.boolean()), + kuery: schema.maybe( + schema.string({ + validate: (value: string) => { + const validationObj = validateKuery( + value, + [LEGACY_AGENT_POLICY_SAVED_OBJECT_TYPE], + AGENT_POLICY_MAPPINGS, + true + ); + if (validationObj?.error) { + return validationObj?.error; + } + }, + }) + ), + noAgentCount: schema.maybe( + schema.boolean({ + meta: { description: 'use withAgentCount instead', deprecated: true }, + }) + ), // + withAgentCount: schema.maybe( + schema.boolean({ + meta: { description: 'get policies with agent count' }, + }) + ), + full: schema.maybe( + schema.boolean({ + meta: { description: 'get full policies with package policies populated' }, + }) + ), + format: schema.maybe( + schema.oneOf([schema.literal(inputsFormat.Simplified), schema.literal(inputsFormat.Legacy)]) + ), + }, + { + validate: (query) => { + if ( + query.perPage && + query.perPage > 100 && + (query.full || query.noAgentCount === false || query.withAgentCount === true) + ) { + return 'perPage should be less or equal to 100 when fetching full policies or agent count.'; + } + }, + } + ), }; export const BulkGetAgentPoliciesRequestSchema = { diff --git a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts index f601743e394ec..d3a808a3cd4bd 100644 --- a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts +++ b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts @@ -120,7 +120,9 @@ export default function (providerContext: FtrProviderContext) { }) .expect(200); const { body } = await supertest - .get(`/api/fleet/agent_policies?kuery=ingest-agent-policies.name:TEST`) + .get( + `/api/fleet/agent_policies?kuery=ingest-agent-policies.name:TEST&withAgentCount=true` + ) .set('kbn-xsrf', 'xxxx') .expect(200); expect(body.items.length).to.eql(1); From 2c25cc06588976cb90ec3551320fef3e8dbbecf4 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Mon, 21 Oct 2024 20:50:12 +0200 Subject: [PATCH 38/69] [EDR Workflows] Unskip osquery tests (#196793) --- .../all/alerts_automated_action_results.cy.ts | 3 +-- .../osquery/cypress/e2e/all/alerts_cases.cy.ts | 3 +-- .../cypress/e2e/all/alerts_linked_apps.cy.ts | 4 +--- .../osquery/cypress/e2e/all/live_query.cy.ts | 3 +-- .../cypress/e2e/all/live_query_run.cy.ts | 3 +-- .../cypress/e2e/all/packs_create_edit.cy.ts | 3 +-- .../cypress/e2e/all/saved_queries.cy.ts | 18 +++++++----------- .../test/osquery_cypress/artifact_manager.ts | 2 +- .../cypress/tasks/create_new_rule.ts | 2 +- 9 files changed, 15 insertions(+), 26 deletions(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts index 31bcd68da19cd..4c7c9663b2d40 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts @@ -11,8 +11,7 @@ import { checkActionItemsInResults, loadRuleAlerts } from '../../tasks/live_quer const UUID_REGEX = '[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}'; -// Failing: See https://github.com/elastic/kibana/issues/178404 -describe.skip('Alert Flyout Automated Action Results', () => { +describe('Alert Flyout Automated Action Results', () => { let ruleId: string; before(() => { diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts index ca0692b310606..d84d3aa691d1e 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts @@ -84,8 +84,7 @@ describe('Alert Event Details - Cases', { tags: ['@ess', '@serverless'] }, () => }); }); - // FLAKY: https://github.com/elastic/kibana/issues/187182 - describe.skip('Case', () => { + describe('Case', () => { let caseId: string; beforeEach(() => { diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts index 92b174583dd1d..2b04a99bd4f9c 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts @@ -26,10 +26,8 @@ describe( () => { let ruleId: string; let ruleName: string; - before(() => { - initializeDataViews(); - }); beforeEach(() => { + initializeDataViews(); loadRule().then((data) => { ruleId = data.id; ruleName = data.name; diff --git a/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts index cafc97cb646ea..6f551ad39b196 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts @@ -19,8 +19,7 @@ import { LIVE_QUERY_EDITOR } from '../../screens/live_query'; import { getAdvancedButton } from '../../screens/integrations'; import { ServerlessRoleName } from '../../support/roles'; -// Failing: See https://github.com/elastic/kibana/issues/171435 -describe.skip('ALL - Live Query', { tags: ['@ess', '@serverless'] }, () => { +describe('ALL - Live Query', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { cy.login(ServerlessRoleName.SOC_MANAGER); navigateTo('/app/osquery'); diff --git a/x-pack/plugins/osquery/cypress/e2e/all/live_query_run.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/live_query_run.cy.ts index f0a19907d57d8..c74b253ae9d41 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/live_query_run.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/live_query_run.cy.ts @@ -23,8 +23,7 @@ import { getAdvancedButton } from '../../screens/integrations'; import { loadSavedQuery, cleanupSavedQuery } from '../../tasks/api_fixtures'; import { ServerlessRoleName } from '../../support/roles'; -// FLAKY: https://github.com/elastic/kibana/issues/195458 -describe.skip('ALL - Live Query run custom and saved', { tags: ['@ess', '@serverless'] }, () => { +describe('ALL - Live Query run custom and saved', { tags: ['@ess', '@serverless'] }, () => { let savedQueryId: string; let savedQueryName: string; diff --git a/x-pack/plugins/osquery/cypress/e2e/all/packs_create_edit.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/packs_create_edit.cy.ts index 39a54d29d4025..dbed4e56f88a0 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/packs_create_edit.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/packs_create_edit.cy.ts @@ -38,8 +38,7 @@ import { loadSavedQuery, cleanupSavedQuery, cleanupPack, loadPack } from '../../ import { request } from '../../tasks/common'; import { ServerlessRoleName } from '../../support/roles'; -// Failing: See https://github.com/elastic/kibana/issues/195463 -describe.skip('Packs - Create and Edit', { tags: ['@ess', '@serverless'] }, () => { +describe('Packs - Create and Edit', { tags: ['@ess', '@serverless'] }, () => { let savedQueryId: string; let savedQueryName: string; let nomappingSavedQueryId: string; diff --git a/x-pack/plugins/osquery/cypress/e2e/all/saved_queries.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/saved_queries.cy.ts index d74bd2483f746..8076aab1c49cc 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/saved_queries.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/saved_queries.cy.ts @@ -43,9 +43,7 @@ import { import { ServerlessRoleName } from '../../support/roles'; import { getAdvancedButton } from '../../screens/integrations'; -// Failing: See https://github.com/elastic/kibana/issues/195453 -// Failing: See https://github.com/elastic/kibana/issues/195453 -describe.skip('ALL - Saved queries', { tags: ['@ess', '@serverless'] }, () => { +describe('ALL - Saved queries', { tags: ['@ess', '@serverless'] }, () => { let caseId: string; before(() => { @@ -94,20 +92,18 @@ describe.skip('ALL - Saved queries', { tags: ['@ess', '@serverless'] }, () => { cy.getBySel(RESULTS_TABLE_COLUMNS_BUTTON).should('have.text', 'Columns35'); cy.getBySel('dataGridColumnSelectorButton').click(); cy.get('[data-popover-open="true"]').should('be.visible'); - cy.getBySel('dataGridColumnSelectorToggleColumnVisibility-osquery.cmdline').click(); - cy.getBySel('dataGridColumnSelectorToggleColumnVisibility-osquery.cwd').click(); - cy.getBySel( - 'dataGridColumnSelectorToggleColumnVisibility-osquery.disk_bytes_written.number' - ).click(); + cy.getBySel('dataGridColumnSelectorColumnItem-osquery.cmdline').click(); + cy.getBySel('dataGridColumnSelectorColumnItem-osquery.cwd').click(); + cy.getBySel('dataGridColumnSelectorColumnItem-osquery.disk_bytes_written.number').click(); cy.getBySel('dataGridColumnSelectorButton').click(); cy.get('[data-popover-open="true"]').should('not.exist'); - cy.getBySel(RESULTS_TABLE_COLUMNS_BUTTON).should('have.text', 'Columns32/35'); + cy.getBySel(RESULTS_TABLE_COLUMNS_BUTTON).should('have.text', 'Columns35'); // change pagination cy.getBySel('pagination-button-next').click(); cy.getBySel('globalLoadingIndicator').should('not.exist'); cy.getBySel('pagination-button-next').click(); - cy.getBySel(RESULTS_TABLE_COLUMNS_BUTTON).should('have.text', 'Columns32/35'); + cy.getBySel(RESULTS_TABLE_COLUMNS_BUTTON).should('have.text', 'Columns35'); // enter fullscreen cy.getBySel(RESULTS_TABLE_BUTTON).trigger('mouseover'); @@ -118,7 +114,7 @@ describe.skip('ALL - Saved queries', { tags: ['@ess', '@serverless'] }, () => { // sorting cy.getBySel('dataGridHeaderCellActionButton-osquery.egid').click({ force: true }); cy.contains(/Sort A-Z$/).click(); - cy.getBySel(RESULTS_TABLE_COLUMNS_BUTTON).should('have.text', 'Columns32/35'); + cy.getBySel(RESULTS_TABLE_COLUMNS_BUTTON).should('have.text', 'Columns35'); cy.getBySel(RESULTS_TABLE_BUTTON).trigger('mouseover'); cy.contains(/Enter fullscreen$/).should('exist'); diff --git a/x-pack/test/osquery_cypress/artifact_manager.ts b/x-pack/test/osquery_cypress/artifact_manager.ts index 54b9a70d37aff..a78a37267ec5a 100644 --- a/x-pack/test/osquery_cypress/artifact_manager.ts +++ b/x-pack/test/osquery_cypress/artifact_manager.ts @@ -6,5 +6,5 @@ */ export async function getLatestVersion(): Promise { - return '8.11.0-SNAPSHOT'; + return '8.15.0-SNAPSHOT'; } diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts b/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts index 501dd0461dd44..e9822d1340a85 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/create_new_rule.ts @@ -884,7 +884,7 @@ export const waitForAlertsToPopulate = (alertCountThreshold = 1) => { return alertCount >= alertCountThreshold; }); }, - { interval: 500, timeout: 12000 } + { interval: 500, timeout: 30000 } ); waitForAlerts(); }; From 82a91b4b9dc25557838957e876f96664f1a1da8c Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Mon, 21 Oct 2024 20:51:28 +0200 Subject: [PATCH 39/69] [EDR Workflows] Unskip DW tests (#196794) --- .../management/cypress/e2e/endpoint_list/endpoints.cy.ts | 3 +-- .../e2e/rbac/endpoint_role_rbac_with_space_awareness.cy.ts | 3 +-- .../e2e/response_actions/response_actions_history.cy.ts | 3 +-- .../e2e/response_actions/response_console/release.cy.ts | 3 +-- .../security_solution/scripts/endpoint/common/constants.ts | 1 + .../list_detail_page/list_details.cy.ts | 3 +-- 6 files changed, 6 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts index 03b9797abb56e..12cdfcfa6e09c 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts @@ -28,8 +28,7 @@ import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; -// Failing: See https://github.com/elastic/kibana/issues/195476 -describe.skip('Endpoints page', { tags: ['@ess', '@serverless'] }, () => { +describe('Endpoints page', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/rbac/endpoint_role_rbac_with_space_awareness.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/rbac/endpoint_role_rbac_with_space_awareness.cy.ts index 2a3d2876ea488..424b3fc954c57 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/rbac/endpoint_role_rbac_with_space_awareness.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/rbac/endpoint_role_rbac_with_space_awareness.cy.ts @@ -23,8 +23,7 @@ import { setSecuritySolutionEndpointGroupPrivilege, } from '../../screens/stack_management/role_page'; -// FLAKY: https://github.com/elastic/kibana/issues/195477 -describe.skip( +describe( 'When defining a kibana role for Endpoint security access with space awareness enabled', { // TODO:PR Remove `'@skipInServerlessMKI` once PR merges to `main` diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_actions_history.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_actions_history.cy.ts index 93c6f0698a81a..dfd67d6854b63 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_actions_history.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_actions_history.cy.ts @@ -10,8 +10,7 @@ import { indexEndpointHosts } from '../../tasks/index_endpoint_hosts'; import { login } from '../../tasks/login'; import { loadPage } from '../../tasks/common'; -// FLAKY: https://github.com/elastic/kibana/issues/172549 -describe.skip( +describe( 'Response actions history page', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts index 96702227b70b9..d11b7210713a8 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts @@ -27,8 +27,7 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// Failing: See https://github.com/elastic/kibana/issues/172418 -describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { +describe('Response console', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/constants.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/constants.ts index 4a8b2daca2af4..9ca18f0d68f2c 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/constants.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/constants.ts @@ -14,4 +14,5 @@ export const ENDPOINT_ALERTS_INDEX = 'logs-endpoint.alerts-default'; export const COMMON_API_HEADERS = Object.freeze({ 'kbn-xsrf': 'security-solution', 'x-elastic-internal-origin': 'security-solution', + 'elastic-api-version': '2023-10-31', }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts index 2a98a12cba7e5..5b2326ec617a6 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts @@ -41,8 +41,7 @@ const getExceptionList1 = () => ({ const EXCEPTION_LIST_NAME = 'Newly created list'; -// FLAKY: https://github.com/elastic/kibana/issues/180740 -describe.skip('Exception list detail page', { tags: ['@ess', '@serverless'] }, () => { +describe('Exception list detail page', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); From c25a97bc0a3a85ad5c7bb18aab7916410efd05b7 Mon Sep 17 00:00:00 2001 From: Krzysztof Kowalczyk Date: Mon, 21 Oct 2024 21:15:58 +0200 Subject: [PATCH 40/69] [Screenshotting/PDF Worker Thread] Add type to GeneratePdfResponse (#196860) ## Summary This PR adds a `type` to `GeneratePdfResponse` and introduces more logging for PDF worker. Closes: #194493 --- .../server/formats/pdf/pdf_maker/pdfmaker.ts | 35 +++++++-- .../server/formats/pdf/pdf_maker/worker.ts | 78 +++++++++++++++---- 2 files changed, 91 insertions(+), 22 deletions(-) diff --git a/x-pack/plugins/screenshotting/server/formats/pdf/pdf_maker/pdfmaker.ts b/x-pack/plugins/screenshotting/server/formats/pdf/pdf_maker/pdfmaker.ts index 2eda655509f71..65765d8fc78c8 100644 --- a/x-pack/plugins/screenshotting/server/formats/pdf/pdf_maker/pdfmaker.ts +++ b/x-pack/plugins/screenshotting/server/formats/pdf/pdf_maker/pdfmaker.ts @@ -22,7 +22,12 @@ import { } from './constants'; import { REPORTING_TABLE_LAYOUT } from './get_doc_options'; import { getFont } from './get_font'; -import type { GeneratePdfRequest, GeneratePdfResponse, WorkerData } from './worker'; +import { + GeneratePdfResponseType, + type GeneratePdfRequest, + type WorkerData, + GeneratePdfResponse, +} from './worker'; // Ensure that all dependencies are included in the release bundle. import './worker_dependencies'; @@ -32,6 +37,8 @@ export class PdfMaker { private content: Content[]; private worker?: Worker; + private workerLogger: Logger; + private pageCount: number = 0; private transferList: ArrayBuffer[] = []; @@ -71,6 +78,7 @@ export class PdfMaker { ) { this.title = ''; this.content = []; + this.workerLogger = logger.get('pdf-worker'); // running in dist: `worker.ts` becomes `worker.js` // running in source: `worker_src_harness.ts` needs to be wrapped in JS and have a ts-node environment initialized. @@ -209,26 +217,37 @@ export class PdfMaker { const { port1: myPort, port2: theirPort } = new MessageChannel(); this.worker = this.createWorker(theirPort); this.worker.on('error', (workerError: NodeJS.ErrnoException) => { + this.workerLogger.error(`Worker error: ${workerError}`); if (workerError.code === 'ERR_WORKER_OUT_OF_MEMORY') { reject(new errors.PdfWorkerOutOfMemoryError(workerError.message)); } else { reject(workerError); } }); - this.worker.on('exit', () => {}); + this.worker.on('exit', () => { + this.workerLogger.debug('Worker exited'); + }); - // We expect one message from the worker generating the PDF buffer. - myPort.on('message', ({ error, data }: GeneratePdfResponse) => { - if (error) { + myPort.on('message', ({ type, error, data, message }: GeneratePdfResponse) => { + if (type === GeneratePdfResponseType.Log && message) { + this.workerLogger.debug(message); + return; + } + + if (type === GeneratePdfResponseType.Error) { reject(new Error(`PDF worker returned the following error: ${error}`)); return; } - if (!data) { + + if (type === GeneratePdfResponseType.Data && !data) { reject(new Error(`Worker did not generate a PDF!`)); return; } - this.pageCount = data.metrics.pages; - resolve(data.buffer); + + if (data) { + this.pageCount = data.metrics.pages; + resolve(data.buffer); + } }); // Send the request diff --git a/x-pack/plugins/screenshotting/server/formats/pdf/pdf_maker/worker.ts b/x-pack/plugins/screenshotting/server/formats/pdf/pdf_maker/worker.ts index 98c10598703ae..2599a57cdac97 100644 --- a/x-pack/plugins/screenshotting/server/formats/pdf/pdf_maker/worker.ts +++ b/x-pack/plugins/screenshotting/server/formats/pdf/pdf_maker/worker.ts @@ -34,23 +34,44 @@ export interface GeneratePdfRequest { data: GenerateReportRequestData; } -export type GeneratePdfResponse = SuccessResponse | ErrorResponse; - -export interface SuccessResponse { - error?: undefined; - data: { - buffer: Uint8Array; - metrics: { - pages: number; - }; +export interface GeneratePdfData { + buffer: Uint8Array; + metrics: { + pages: number; }; } -export interface ErrorResponse { - error: string; - data: null; +export enum GeneratePdfResponseType { + Log, + Data, + Error, +} + +interface GeneratePdfLogResponse { + type: GeneratePdfResponseType.Log; + data?: GeneratePdfData; + error?: string; + message?: string; +} + +interface GeneratePdfDataResponse { + type: GeneratePdfResponseType.Data; + data?: GeneratePdfData; + error?: string; + message?: string; } +interface GeneratePdfErrorResponse { + type: GeneratePdfResponseType.Error; + data?: GeneratePdfData; + error?: string; + message?: string; +} +export type GeneratePdfResponse = + | GeneratePdfLogResponse + | GeneratePdfDataResponse + | GeneratePdfErrorResponse; + if (!isMainThread) { const { port } = workerData as WorkerData; port.on('message', execute); @@ -68,6 +89,11 @@ const getPageCount = (pdfDoc: PDFKit.PDFDocument): number => { async function execute({ data: { layout, logo, title, content } }: GeneratePdfRequest) { const { port } = workerData as WorkerData; + port.postMessage({ + type: GeneratePdfResponseType.Log, + message: 'Starting execution', + }); + try { const tableBorderWidth = 1; @@ -89,6 +115,11 @@ async function execute({ data: { layout, logo, title, content } }: GeneratePdfRe }, }; + port.postMessage({ + type: GeneratePdfResponseType.Log, + message: 'Initializing PDF printer', + }); + const printer = new Printer(fonts); const docDefinition = _.assign(getTemplate(layout, logo, title, tableBorderWidth, assetPath), { @@ -103,6 +134,11 @@ async function execute({ data: { layout, logo, title, content } }: GeneratePdfRe ), }); + port.postMessage({ + type: GeneratePdfResponseType.Log, + message: 'Generating document stream', + }); + const pdfDoc = printer.createPdfKitDocument(docDefinition, { tableLayouts: { noBorder: { @@ -121,6 +157,11 @@ async function execute({ data: { layout, logo, title, content } }: GeneratePdfRe throw new Error('Document stream has not been generated'); } + port.postMessage({ + type: GeneratePdfResponseType.Log, + message: 'Document stream has been generated', + }); + const buffer = await new Promise((resolve, reject) => { const buffers: Buffer[] = []; pdfDoc.on('error', reject); @@ -133,7 +174,13 @@ async function execute({ data: { layout, logo, title, content } }: GeneratePdfRe pdfDoc.end(); }); - const successResponse: SuccessResponse = { + port.postMessage({ + type: GeneratePdfResponseType.Log, + message: 'PDF buffer has been generated', + }); + + const successResponse: GeneratePdfResponse = { + type: GeneratePdfResponseType.Data, data: { buffer, metrics: { @@ -143,7 +190,10 @@ async function execute({ data: { layout, logo, title, content } }: GeneratePdfRe }; port.postMessage(successResponse, [buffer.buffer /* Transfer buffer instead of copying */]); } catch (error) { - const errorResponse: ErrorResponse = { error: error.message, data: null }; + const errorResponse: GeneratePdfResponse = { + type: GeneratePdfResponseType.Error, + error: error.message, + }; port.postMessage(errorResponse); } finally { process.nextTick(() => { From e6e4e343aa700f1b489915f8df233a0abf2ea058 Mon Sep 17 00:00:00 2001 From: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:20:30 +0100 Subject: [PATCH 41/69] [Console] Fix load_from param (#196836) Fixes https://github.com/elastic/kibana/issues/195877 Addresses https://github.com/elastic/kibana/issues/179658 ## Summary This PR fixes the bug in Console where using the `load_from` param in the URL made Console uneditable because every re-render reset the initial value in the editor. This is fixed by restricting the hook to only set the initial value once. This PR also adds some unit tests for the hook, as I realized that this was a long-standing improvement. ### How to test: Try loading the following URL (making the necessary replacement in the URL) and verify that the data is correctly loaded into the editor and value can be edited: `http://localhost:5601//app/dev_tools#/console?load_from=data:text/plain,AoeQygKgBA9A+gRwK4FMBOBPGBDAzhgOwGMB+AEzQHsAHOApAGwbiMoaQFsDcAoAbx5QoAImToMwgFwiAZgCVKAWShoUHSgBcUAWgBUkgJYEyKAB4pcwgDSCRDSkWwMUUkSgLXbwmQYZa0rgJCQsIARpRsgbbBIhxIuBquANoAujYxIT5+6Mlp0cHCuAAWlIxkuekZwnEJdJq5+QC+ts2NQA` `http://localhost:5601//app/dev_tools#/console?load_from=https://www.elastic.co/guide/en/elasticsearch/reference/current/snippets/86.console` Co-authored-by: Matthew Kime --- .../hooks/use_set_initial_value.test.ts | 178 ++++++++++++++++++ .../editor/hooks/use_set_initial_value.ts | 17 +- 2 files changed, 189 insertions(+), 6 deletions(-) create mode 100644 src/plugins/console/public/application/containers/editor/hooks/use_set_initial_value.test.ts diff --git a/src/plugins/console/public/application/containers/editor/hooks/use_set_initial_value.test.ts b/src/plugins/console/public/application/containers/editor/hooks/use_set_initial_value.test.ts new file mode 100644 index 0000000000000..0605a0c903ee0 --- /dev/null +++ b/src/plugins/console/public/application/containers/editor/hooks/use_set_initial_value.test.ts @@ -0,0 +1,178 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { useSetInitialValue } from './use_set_initial_value'; +import { IToasts } from '@kbn/core-notifications-browser'; +import { decompressFromEncodedURIComponent } from 'lz-string'; +import { DEFAULT_INPUT_VALUE } from '../../../../../common/constants'; + +jest.mock('lz-string', () => ({ + decompressFromEncodedURIComponent: jest.fn(), +})); + +jest.mock('./use_set_initial_value', () => ({ + ...jest.requireActual('./use_set_initial_value'), +})); + +describe('useSetInitialValue', () => { + const setValueMock = jest.fn(); + const addWarningMock = jest.fn(); + const toastsMock: IToasts = { addWarning: addWarningMock } as any; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should set the initial value only once', async () => { + const { rerender } = renderHook(() => + useSetInitialValue({ + localStorageValue: 'initial value', + setValue: setValueMock, + toasts: toastsMock, + }) + ); + + // Verify initial value is set on first render + expect(setValueMock).toHaveBeenCalledTimes(1); + expect(setValueMock).toHaveBeenCalledWith('initial value'); + + // Re-render the hook to simulate a component update + rerender(); + + // Verify that setValue is not called again after rerender + expect(setValueMock).toHaveBeenCalledTimes(1); // Still 1, no additional calls + }); + + it('should set value from localStorage if no load_from param is present', () => { + renderHook(() => + useSetInitialValue({ + localStorageValue: 'saved value', + setValue: setValueMock, + toasts: toastsMock, + }) + ); + + expect(setValueMock).toHaveBeenCalledWith('saved value'); + }); + + it('should set default value if localStorage is undefined and no load_from param is present', () => { + renderHook(() => + useSetInitialValue({ + localStorageValue: undefined, + setValue: setValueMock, + toasts: toastsMock, + }) + ); + + expect(setValueMock).toHaveBeenCalledWith(DEFAULT_INPUT_VALUE); + }); + + it('should load data from load_from param if it is a valid Elastic URL', async () => { + Object.defineProperty(window, 'location', { + writable: true, + value: { + hash: '?load_from=https://www.elastic.co/some-data', + }, + }); + + // Mock fetch to return "remote data" + global.fetch = jest.fn(() => + Promise.resolve({ + text: () => Promise.resolve('remote data'), + }) + ) as jest.Mock; + + await act(async () => { + renderHook(() => + useSetInitialValue({ + localStorageValue: 'initial value', + setValue: setValueMock, + toasts: toastsMock, + }) + ); + }); + + expect(fetch).toHaveBeenCalledWith(new URL('https://www.elastic.co/some-data')); + // The remote data should be appended to the initial value in the editor + expect(setValueMock).toHaveBeenCalledWith('initial value\n\nremote data'); + }); + + it('should show a warning if the load_from param is not an Elastic domain', async () => { + Object.defineProperty(window, 'location', { + writable: true, + value: { + hash: '?load_from=https://not.elastic.com/some-data', + }, + }); + + await act(async () => { + renderHook(() => + useSetInitialValue({ + localStorageValue: 'initial value', + setValue: setValueMock, + toasts: toastsMock, + }) + ); + }); + + expect(fetch).not.toHaveBeenCalled(); + expect(addWarningMock).toHaveBeenCalledWith( + 'Only URLs with the Elastic domain (www.elastic.co) can be loaded in Console.' + ); + }); + + it('should load and decompress data from a data URI', async () => { + Object.defineProperty(window, 'location', { + writable: true, + value: { + hash: '?load_from=data:text/plain,compressed-data', + }, + }); + (decompressFromEncodedURIComponent as jest.Mock).mockReturnValue('decompressed data'); + + await act(async () => { + renderHook(() => + useSetInitialValue({ + localStorageValue: 'initial value', + setValue: setValueMock, + toasts: toastsMock, + }) + ); + }); + + expect(decompressFromEncodedURIComponent).toHaveBeenCalledWith('compressed-data'); + // The initial value in the editor should be replaces with the decompressed data + expect(setValueMock).toHaveBeenCalledWith('decompressed data'); + }); + + it('should show a warning if decompressing a data URI fails', async () => { + Object.defineProperty(window, 'location', { + writable: true, + value: { + hash: '?load_from=data:text/plain,invalid-data', + }, + }); + (decompressFromEncodedURIComponent as jest.Mock).mockReturnValue(null); + + await act(async () => { + renderHook(() => + useSetInitialValue({ + localStorageValue: 'initial value', + setValue: setValueMock, + toasts: toastsMock, + }) + ); + }); + + expect(addWarningMock).toHaveBeenCalledWith( + 'Unable to load data from the load_from query parameter in the URL' + ); + }); +}); diff --git a/src/plugins/console/public/application/containers/editor/hooks/use_set_initial_value.ts b/src/plugins/console/public/application/containers/editor/hooks/use_set_initial_value.ts index 9e96c1af2734b..11e9c4878227e 100644 --- a/src/plugins/console/public/application/containers/editor/hooks/use_set_initial_value.ts +++ b/src/plugins/console/public/application/containers/editor/hooks/use_set_initial_value.ts @@ -12,7 +12,7 @@ import { parse } from 'query-string'; import { IToasts } from '@kbn/core-notifications-browser'; import { decompressFromEncodedURIComponent } from 'lz-string'; import { i18n } from '@kbn/i18n'; -import { useEffect } from 'react'; +import { useEffect, useRef } from 'react'; import { DEFAULT_INPUT_VALUE } from '../../../../../common/constants'; interface QueryParams { @@ -46,6 +46,7 @@ export const readLoadFromParam = () => { */ export const useSetInitialValue = (params: SetInitialValueParams) => { const { localStorageValue, setValue, toasts } = params; + const isInitialValueSet = useRef(false); useEffect(() => { const loadBufferFromRemote = async (url: string) => { @@ -104,11 +105,15 @@ export const useSetInitialValue = (params: SetInitialValueParams) => { const loadFromParam = readLoadFromParam(); - if (loadFromParam) { - loadBufferFromRemote(loadFromParam); - } else { - // Only set to default input value if the localstorage value is undefined - setValue(localStorageValue ?? DEFAULT_INPUT_VALUE); + // Only set the value in the editor if an initial value hasn't been set yet + if (!isInitialValueSet.current) { + if (loadFromParam) { + loadBufferFromRemote(loadFromParam); + } else { + // Only set to default input value if the localstorage value is undefined + setValue(localStorageValue ?? DEFAULT_INPUT_VALUE); + } + isInitialValueSet.current = true; } return () => { From a3d216f496d319ab41855711e88c4b9c80a57152 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Mon, 21 Oct 2024 13:15:13 -0700 Subject: [PATCH 42/69] [Spaces Mgmt] Ensure space ID is used for comparison logic (#196930) Closes https://github.com/elastic/kibana/issues/192811 ## Summary When creating a space, if it's not the current, you should be able to use the switch icon from the table. This PR fixes a bug that disabled the switch icon for spaces that aren't the current, if they have the same name as the current. ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../management/spaces_grid/spaces_grid_page.test.tsx | 4 ++-- .../public/management/spaces_grid/spaces_grid_page.tsx | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx index abb184bcb4382..169f12c3487c4 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx @@ -241,7 +241,7 @@ describe('SpacesGridPage', () => { wrapper.update(); const activeRow = wrapper.find('[data-test-subj="spacesListTableRow-custom-2"]'); - const switchAction = activeRow.find('EuiButtonIcon[data-test-subj="Custom 2-switchSpace"]'); + const switchAction = activeRow.find('EuiButtonIcon[data-test-subj="custom-2-switchSpace"]'); expect(switchAction.prop('isDisabled')).toBe(true); }); @@ -273,7 +273,7 @@ describe('SpacesGridPage', () => { wrapper.update(); const nonActiveRow = wrapper.find('[data-test-subj="spacesListTableRow-default"]'); - const switchAction = nonActiveRow.find('EuiButtonIcon[data-test-subj="Default-switchSpace"]'); + const switchAction = nonActiveRow.find('EuiButtonIcon[data-test-subj="default-switchSpace"]'); expect(switchAction.prop('isDisabled')).toBe(false); }); diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx index 3049fb00d8977..586992c1b6b48 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx @@ -430,7 +430,7 @@ export class SpacesGridPage extends Component { reactRouterNavigate(this.props.history, this.getEditSpacePath(rowRecord)).href, onClick: (rowRecord) => reactRouterNavigate(this.props.history, this.getEditSpacePath(rowRecord)).onClick, - 'data-test-subj': (rowRecord) => `${rowRecord.name}-editSpace`, + 'data-test-subj': (rowRecord) => `${rowRecord.id}-editSpace`, }, { isPrimary: true, @@ -438,7 +438,7 @@ export class SpacesGridPage extends Component { defaultMessage: 'Switch', }), description: (rowRecord) => - activeSpace?.name !== rowRecord.name + activeSpace?.id !== rowRecord.id ? i18n.translate( 'xpack.spaces.management.spacesGridPage.switchSpaceActionDescription', { @@ -462,8 +462,8 @@ export class SpacesGridPage extends Component { rowRecord.id, `${ENTER_SPACE_PATH}?next=/app/management/kibana/spaces/` ), - enabled: (rowRecord) => activeSpace?.name !== rowRecord.name, - 'data-test-subj': (rowRecord) => `${rowRecord.name}-switchSpace`, + enabled: (rowRecord) => activeSpace?.id !== rowRecord.id, + 'data-test-subj': (rowRecord) => `${rowRecord.id}-switchSpace`, }, { name: i18n.translate('xpack.spaces.management.spacesGridPage.deleteActionName', { @@ -487,7 +487,7 @@ export class SpacesGridPage extends Component { color: 'danger', onClick: (rowRecord: Space) => this.onDeleteSpaceClick(rowRecord), enabled: (rowRecord: Space) => !isReservedSpace(rowRecord), - 'data-test-subj': (rowRecord) => `${rowRecord.name}-deleteSpace`, + 'data-test-subj': (rowRecord) => `${rowRecord.id}-deleteSpace`, }, ], }); From 1e12f31a7082ce8286f933f8a586fdb706c35a01 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Mon, 21 Oct 2024 14:18:44 -0600 Subject: [PATCH 43/69] [Security Assistant] Knowledge base settings author column fix (#197114) --- .../translations.ts | 19 ++---------- .../use_knowledge_base_table.tsx | 29 ++++++++++++------- .../kbn-elastic-assistant/tsconfig.json | 1 + 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/translations.ts b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/translations.ts index 077426884eb8a..34e158ac699cc 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/translations.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/translations.ts @@ -168,20 +168,6 @@ export const ENTRY_NAME_INPUT_PLACEHOLDER = i18n.translate( } ); -export const ENTRY_SPACE_INPUT_LABEL = i18n.translate( - 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettingsManagement.entrySpaceInputLabel', - { - defaultMessage: 'Space', - } -); - -export const ENTRY_SPACE_INPUT_PLACEHOLDER = i18n.translate( - 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettingsManagement.entrySpaceInputPlaceholder', - { - defaultMessage: 'Select', - } -); - export const SHARING_PRIVATE_OPTION_LABEL = i18n.translate( 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettingsManagement.sharingPrivateOptionLabel', { @@ -272,7 +258,8 @@ export const ENTRY_DESCRIPTION_HELP_LABEL = i18n.translate( export const ENTRY_DESCRIPTION_PLACEHOLDER = i18n.translate( 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettingsManagement.entryDescriptionPlaceholder', { - defaultMessage: 'Use this index to answer any question related to asset information.', + defaultMessage: + 'Example: "Use this index to answer any question related to asset information."', } ); @@ -295,7 +282,7 @@ export const ENTRY_QUERY_DESCRIPTION_PLACEHOLDER = i18n.translate( 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettingsManagement.entryQueryDescriptionPlaceholder', { defaultMessage: - 'Key terms to retrieve asset related information, like host names, IP Addresses or cloud objects.', + 'Example: "Key terms to retrieve asset related information, like host names, IP Addresses or cloud objects."', } ); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/use_knowledge_base_table.tsx b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/use_knowledge_base_table.tsx index 67157b3ae7b12..d27853f6e8625 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/use_knowledge_base_table.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/use_knowledge_base_table.tsx @@ -16,6 +16,7 @@ import { } from '@kbn/elastic-assistant-common'; import useAsync from 'react-use/lib/useAsync'; +import { UserProfileAvatarData } from '@kbn/user-profile-components'; import { useAssistantContext } from '../../..'; import * as i18n from './translations'; import { BadgesColumn } from '../../assistant/common/components/assistant_settings_management/badges'; @@ -23,14 +24,21 @@ import { useInlineActions } from '../../assistant/common/components/assistant_se import { isSystemEntry } from './helpers'; const AuthorColumn = ({ entry }: { entry: KnowledgeBaseEntryResponse }) => { - const { currentUserAvatar, userProfileService } = useAssistantContext(); + const { userProfileService } = useAssistantContext(); const userProfile = useAsync(async () => { - const profile = await userProfileService?.bulkGet({ uids: new Set([entry.createdBy]) }); - return profile?.[0].user.username; - }, []); + const profile = await userProfileService?.bulkGet<{ avatar: UserProfileAvatarData }>({ + uids: new Set([entry.createdBy]), + dataPath: 'avatar', + }); + return { username: profile?.[0].user.username, avatar: profile?.[0].data.avatar }; + }, [entry.createdBy]); - const userName = useMemo(() => userProfile?.value ?? 'Unknown', [userProfile?.value]); + const userName = useMemo( + () => userProfile?.value?.username ?? 'Unknown', + [userProfile?.value?.username] + ); + const userAvatar = userProfile.value?.avatar; const badgeItem = isSystemEntry(entry) ? 'Elastic' : userName; const userImage = isSystemEntry(entry) ? ( { margin-right: 14px; `} /> - ) : currentUserAvatar?.imageUrl != null ? ( + ) : userAvatar?.imageUrl != null ? ( { ) : ( { }, { name: i18n.COLUMN_AUTHOR, - sortable: ({ users }: KnowledgeBaseEntryResponse) => users[0]?.name, render: (entry: KnowledgeBaseEntryResponse) => , }, { diff --git a/x-pack/packages/kbn-elastic-assistant/tsconfig.json b/x-pack/packages/kbn-elastic-assistant/tsconfig.json index 8d19fa86f4d11..f1dde6cbeafee 100644 --- a/x-pack/packages/kbn-elastic-assistant/tsconfig.json +++ b/x-pack/packages/kbn-elastic-assistant/tsconfig.json @@ -31,5 +31,6 @@ "@kbn/core", "@kbn/zod", "@kbn/data-views-plugin", + "@kbn/user-profile-components", ] } From a1c902ac4e3c2a1462efcbaee999a060dfa2376d Mon Sep 17 00:00:00 2001 From: "elastic-renovate-prod[bot]" <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:29:12 -0700 Subject: [PATCH 44/69] Update dependency msw to ^2.4.10 (main) (#196901) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [msw](https://mswjs.io) ([source](https://togithub.com/mswjs/msw)) | devDependencies | patch | [`^2.4.9` -> `^2.4.10`](https://renovatebot.com/diffs/npm/msw/2.4.9/2.4.10) | `2.4.11` | --- ### Release Notes
mswjs/msw (msw) ### [`v2.4.10`](https://togithub.com/mswjs/msw/releases/tag/v2.4.10) [Compare Source](https://togithub.com/mswjs/msw/compare/v2.4.9...v2.4.10) #### v2.4.10 (2024-10-11) ##### Bug Fixes - **setupWorker:** perform worker update in the background ([#​2311](https://togithub.com/mswjs/msw/issues/2311)) ([`8e40724`](https://togithub.com/mswjs/msw/commit/8e40724cd3e315e0df703cce8d9f2cf7ab6cdc73)) [@​kettanaito](https://togithub.com/kettanaito)
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). --------- Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Paulo Silva --- package.json | 2 +- yarn.lock | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 4faf47b17aa72..9d7f5c11bfb72 100644 --- a/package.json +++ b/package.json @@ -1781,7 +1781,7 @@ "mochawesome-merge": "^4.3.0", "mock-fs": "^5.1.2", "ms-chromium-edge-driver": "^0.5.1", - "msw": "^2.4.9", + "msw": "^2.4.10", "multistream": "^4.1.0", "mutation-observer": "^1.0.3", "native-hdr-histogram": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index af4e2dfa05bcc..4158f3bbea673 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24010,10 +24010,10 @@ msgpackr@^1.9.9: optionalDependencies: msgpackr-extract "^3.0.2" -msw@^2.4.9: - version "2.4.9" - resolved "https://registry.yarnpkg.com/msw/-/msw-2.4.9.tgz#350a84cedb90b578a32c7764431e3750900f8407" - integrity sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg== +msw@^2.4.10: + version "2.4.11" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.4.11.tgz#17001366c7c8de1540436d06d194f8facffed0f4" + integrity sha512-TVEw9NOPTc6ufOQLJ53234S9NBRxQbu7xFMxs+OCP43JQcNEIOKiZHxEm2nDzYIrwccoIhUxUf8wr99SukD76A== dependencies: "@bundled-es-modules/cookie" "^2.0.0" "@bundled-es-modules/statuses" "^1.0.1" @@ -24027,10 +24027,10 @@ msw@^2.4.9: graphql "^16.8.1" headers-polyfill "^4.0.2" is-node-process "^1.2.0" - outvariant "^1.4.2" + outvariant "^1.4.3" path-to-regexp "^6.3.0" strict-event-emitter "^0.5.1" - type-fest "^4.9.0" + type-fest "^4.26.1" yargs "^17.7.2" multicast-dns@^7.2.5: @@ -25021,7 +25021,7 @@ ospath@^1.2.2: resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs= -outvariant@^1.4.0, outvariant@^1.4.2, outvariant@^1.4.3: +outvariant@^1.4.0, outvariant@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.3.tgz#221c1bfc093e8fec7075497e7799fdbf43d14873" integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== @@ -31029,10 +31029,10 @@ type-fest@^1.2.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== -type-fest@^4.15.0, type-fest@^4.17.0, type-fest@^4.9.0: - version "4.18.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.18.3.tgz#5249f96e7c2c3f0f1561625f54050e343f1c8f68" - integrity sha512-Q08/0IrpvM+NMY9PA2rti9Jb+JejTddwmwmVQGskAlhtcrw1wsRzoR6ode6mR+OAabNa75w/dxedSUY2mlphaQ== +type-fest@^4.15.0, type-fest@^4.17.0, type-fest@^4.26.1: + version "4.26.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.26.1.tgz#a4a17fa314f976dd3e6d6675ef6c775c16d7955e" + integrity sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg== type-is@~1.6.18: version "1.6.18" From 993e6839cd322c8ba072504516fdbc47d38f6d50 Mon Sep 17 00:00:00 2001 From: "elastic-renovate-prod[bot]" <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 19:24:29 -0500 Subject: [PATCH 45/69] Update dependency msw to ^2.4.11 (main) (#197147) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [msw](https://mswjs.io) ([source](https://togithub.com/mswjs/msw)) | devDependencies | patch | [`^2.4.10` -> `^2.4.11`](https://renovatebot.com/diffs/npm/msw/2.4.11/2.4.11) | `2.4.12` | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9d7f5c11bfb72..003047638d9d0 100644 --- a/package.json +++ b/package.json @@ -1781,7 +1781,7 @@ "mochawesome-merge": "^4.3.0", "mock-fs": "^5.1.2", "ms-chromium-edge-driver": "^0.5.1", - "msw": "^2.4.10", + "msw": "^2.4.11", "multistream": "^4.1.0", "mutation-observer": "^1.0.3", "native-hdr-histogram": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index 4158f3bbea673..0e0d6afb677c2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24010,7 +24010,7 @@ msgpackr@^1.9.9: optionalDependencies: msgpackr-extract "^3.0.2" -msw@^2.4.10: +msw@^2.4.11: version "2.4.11" resolved "https://registry.yarnpkg.com/msw/-/msw-2.4.11.tgz#17001366c7c8de1540436d06d194f8facffed0f4" integrity sha512-TVEw9NOPTc6ufOQLJ53234S9NBRxQbu7xFMxs+OCP43JQcNEIOKiZHxEm2nDzYIrwccoIhUxUf8wr99SukD76A== From ba71217777a5249b61075af7e44b29d2f06c5e98 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 22 Oct 2024 11:35:16 +1100 Subject: [PATCH 46/69] skip failing test suite (#181889) --- .../plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts index 2b04a99bd4f9c..6ea1acfebabce 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts @@ -18,7 +18,8 @@ import { import { closeModalIfVisible, closeToastIfVisible } from '../../tasks/integrations'; import { RESULTS_TABLE, RESULTS_TABLE_BUTTON } from '../../screens/live_query'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/181889 +describe.skip( 'Alert Event Details', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'], From 1ce95338f529f82206ec6168adf17270bc020cf1 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 22 Oct 2024 11:35:59 +1100 Subject: [PATCH 47/69] skip failing test suite (#196563) --- .../e2e/entity_analytics/asset_criticality_upload_page.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/asset_criticality_upload_page.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/asset_criticality_upload_page.cy.ts index ecade2f02ce22..94030267b3860 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/asset_criticality_upload_page.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/asset_criticality_upload_page.cy.ts @@ -17,6 +17,7 @@ import { login } from '../../tasks/login'; import { visit } from '../../tasks/navigation'; import { ENTITY_ANALYTICS_ASSET_CRITICALITY_URL } from '../../urls/navigation'; +// Failing: See https://github.com/elastic/kibana/issues/196563 // Failing: See https://github.com/elastic/kibana/issues/196563 describe.skip( 'Asset Criticality Upload page', From f42fd5d2d6e9466c8ef4a5ac7909566a804f3446 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 22 Oct 2024 02:52:53 +0100 Subject: [PATCH 48/69] skip flaky suite (#197151) --- x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts index d84d3aa691d1e..03f16b882e641 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts @@ -48,7 +48,8 @@ describe('Alert Event Details - Cases', { tags: ['@ess', '@serverless'] }, () => cleanupRule(ruleId); }); - describe('Case creation', () => { + // FLAKY: https://github.com/elastic/kibana/issues/197151 + describe.skip('Case creation', () => { let caseId: string; before(() => { From 94ae1a4724d34d2f276e6bb62baa21c8c3a18f27 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:12:56 +1100 Subject: [PATCH 49/69] skip failing test suite (#173441) --- .../apps/integrations/endpoint_exceptions.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts b/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts index 5594ee2ad7cd7..42d28132998bf 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts +++ b/x-pack/test/security_solution_endpoint/apps/integrations/endpoint_exceptions.ts @@ -31,6 +31,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const MINUTES = 60 * 1000 * 10; // FLAKY: https://github.com/elastic/kibana/issues/173441 + // Failing: See https://github.com/elastic/kibana/issues/173441 describe.skip('Endpoint Exceptions', function () { targetTags(this, ['@ess', '@serverless']); From a6e6a932ad5d7bd1d43a03dcca0eb0191e3508f7 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 22 Oct 2024 03:16:05 +0100 Subject: [PATCH 50/69] skip flaky suite (#193554) --- .../components/actions_log_users_filter.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx index afcd051af1bd8..e6da93541334b 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx @@ -15,7 +15,8 @@ import { import { ActionsLogUsersFilter } from './actions_log_users_filter'; import { MANAGEMENT_PATH } from '../../../../../common/constants'; -describe('Users filter', () => { +// FLAKY: https://github.com/elastic/kibana/issues/193554 +describe.skip('Users filter', () => { let render: ( props?: React.ComponentProps ) => ReturnType; From dbb26b73148b124f18ac7305301887b64b29a540 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 22 Oct 2024 03:19:15 +0100 Subject: [PATCH 51/69] skip flaky suite (#193092) --- .../components/actions_log_users_filter.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx index e6da93541334b..5d47cfb3b43c3 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/components/actions_log_users_filter.test.tsx @@ -16,6 +16,7 @@ import { ActionsLogUsersFilter } from './actions_log_users_filter'; import { MANAGEMENT_PATH } from '../../../../../common/constants'; // FLAKY: https://github.com/elastic/kibana/issues/193554 +// FLAKY: https://github.com/elastic/kibana/issues/193092 describe.skip('Users filter', () => { let render: ( props?: React.ComponentProps From 1d738b889856f35b06da3b7bbaaf3aa71f7c1c73 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Thu, 17 Oct 2024 19:03:13 +0100 Subject: [PATCH 52/69] skip flaky suite (#196463, #196464, #196465, #196466, #196467, #196468, #196469) --- .../single_page_layout/index.test.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/index.test.tsx index b8c46a4688e6b..ff89db3e0c842 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/index.test.tsx @@ -154,7 +154,14 @@ afterAll(() => { consoleDebugMock.mockRestore(); }); -describe('When on the package policy create page', () => { +// FLAKY: https://github.com/elastic/kibana/issues/196463 +// FLAKY: https://github.com/elastic/kibana/issues/196464 +// FLAKY: https://github.com/elastic/kibana/issues/196465 +// FLAKY: https://github.com/elastic/kibana/issues/196466 +// FLAKY: https://github.com/elastic/kibana/issues/196467 +// FLAKY: https://github.com/elastic/kibana/issues/196468 +// FLAKY: https://github.com/elastic/kibana/issues/196469 +describe.skip('When on the package policy create page', () => { afterEach(() => { jest.clearAllMocks(); }); From 84a9664d610db5b571b8be53eca915899348cb2f Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 22 Oct 2024 04:30:55 +0100 Subject: [PATCH 53/69] skip flaky suite (#169727) --- .../cypress/e2e/all/alerts_automated_action_results.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts index 4c7c9663b2d40..1bc058b188fcc 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts @@ -11,7 +11,8 @@ import { checkActionItemsInResults, loadRuleAlerts } from '../../tasks/live_quer const UUID_REGEX = '[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}'; -describe('Alert Flyout Automated Action Results', () => { +// FLAKY: https://github.com/elastic/kibana/issues/169727 +describe.skip('Alert Flyout Automated Action Results', () => { let ruleId: string; before(() => { From 82e69fea60c7e88029af76369e081265bb25f360 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 22 Oct 2024 04:31:44 +0100 Subject: [PATCH 54/69] skip flaky suite (#176783) --- x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts index 03f16b882e641..1e458b8b8f23b 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts @@ -85,7 +85,8 @@ describe('Alert Event Details - Cases', { tags: ['@ess', '@serverless'] }, () => }); }); - describe('Case', () => { + // FLAKY: https://github.com/elastic/kibana/issues/176783 + describe.skip('Case', () => { let caseId: string; beforeEach(() => { From 2d91c3ce0c58c5660f797470c42221d7aec0a62d Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 22 Oct 2024 04:32:14 +0100 Subject: [PATCH 55/69] skip flaky suite (#176783) --- x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts index 1e458b8b8f23b..a5ab52a7bdb76 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts @@ -85,7 +85,7 @@ describe('Alert Event Details - Cases', { tags: ['@ess', '@serverless'] }, () => }); }); - // FLAKY: https://github.com/elastic/kibana/issues/176783 + // FLAKY: https://github.com/elastic/kibana/issues/176783 describe.skip('Case', () => { let caseId: string; From 3f291170a5d47dea3ec0b436b2bc27fae7ce8c9a Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 22 Oct 2024 04:33:05 +0100 Subject: [PATCH 56/69] skip flaky suite (#196189) --- x-pack/plugins/cases/public/components/links/index.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cases/public/components/links/index.test.tsx b/x-pack/plugins/cases/public/components/links/index.test.tsx index 5c450edc39d8a..94d8776af1d92 100644 --- a/x-pack/plugins/cases/public/components/links/index.test.tsx +++ b/x-pack/plugins/cases/public/components/links/index.test.tsx @@ -16,7 +16,8 @@ import { useCaseViewNavigation } from '../../common/navigation/hooks'; jest.mock('../../common/navigation/hooks'); -describe('Configuration button', () => { +// FLAKY: https://github.com/elastic/kibana/issues/196189 +describe.skip('Configuration button', () => { const props: ConfigureCaseButtonProps = { label: 'My label', msgTooltip: <>, From 8738926e06d4326c6f9cd2e5736b335d43b23aa5 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 22 Oct 2024 04:34:55 +0100 Subject: [PATCH 57/69] skip flaky suite (#182364) --- .../cases/public/components/files/file_preview.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cases/public/components/files/file_preview.test.tsx b/x-pack/plugins/cases/public/components/files/file_preview.test.tsx index 0f4edf9201d5e..33288f061e25f 100644 --- a/x-pack/plugins/cases/public/components/files/file_preview.test.tsx +++ b/x-pack/plugins/cases/public/components/files/file_preview.test.tsx @@ -16,7 +16,8 @@ import { createAppMockRenderer, mockedTestProvidersOwner } from '../../common/mo import { basicFileMock } from '../../containers/mock'; import { FilePreview } from './file_preview'; -describe('FilePreview', () => { +// FLAKY: https://github.com/elastic/kibana/issues/182364 +describe.skip('FilePreview', () => { let user: UserEvent; let appMockRender: AppMockRenderer; From 737cfac04e6556a8deb6af2468a11f93035502c6 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 22 Oct 2024 04:36:47 +0100 Subject: [PATCH 58/69] skip flaky suite (#170157) --- .../osquery/cypress/e2e/all/alerts_multiple_agents.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_multiple_agents.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_multiple_agents.cy.ts index 95f0d947b8e84..4f6d30dd71431 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_multiple_agents.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_multiple_agents.cy.ts @@ -15,7 +15,8 @@ import { } from '../../tasks/live_query'; import { OSQUERY_FLYOUT_BODY_EDITOR } from '../../screens/live_query'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/170157 +describe.skip( 'Alert Event Details - dynamic params', { tags: ['@ess', '@serverless'], From 722a913c54cd1521d615f9b093d6dd495c65fde9 Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Tue, 22 Oct 2024 08:06:38 +0200 Subject: [PATCH 59/69] [Discover] Refactor totalHits$ loading state handling to omit race conditions (#196114) Fix loading state management in `use_discover_histogram.ts` Moving the loading state for `totalHits$` to the `fetchAll` function, which is executed before the hook. This ensures that the loading state is set at a higher level, preventing a situation where the overall data fetching is in a `loading` state, but the histogram is marked as `complete` while receiving new properties (like a new data view ID) without access to refreshed data views. --- .../layout/use_discover_histogram.ts | 31 ++++++++++--------- .../main/data_fetching/fetch_all.ts | 10 ++---- .../discover_data_state_container.test.ts | 8 +++-- .../discover_data_state_container.ts | 6 ++++ .../apps/discover/group3/_lens_vis.ts | 3 +- 5 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.ts b/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.ts index 1ebeb8d7d1b7f..66b5be4d02ab7 100644 --- a/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.ts +++ b/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.ts @@ -61,7 +61,7 @@ export const useDiscoverHistogram = ({ hideChart, }: UseDiscoverHistogramProps) => { const services = useDiscoverServices(); - const savedSearchData$ = stateContainer.dataState.data$; + const { main$, documents$, totalHits$ } = stateContainer.dataState.data$; const savedSearchState = useSavedSearch(); const isEsqlMode = useIsEsqlMode(); @@ -153,10 +153,7 @@ export const useDiscoverHistogram = ({ * Total hits */ - const setTotalHitsError = useMemo( - () => sendErrorTo(savedSearchData$.totalHits$), - [savedSearchData$.totalHits$] - ); + const setTotalHitsError = useMemo(() => sendErrorTo(totalHits$), [totalHits$]); useEffect(() => { const subscription = createTotalHitsObservable(unifiedHistogram?.state$)?.subscribe( @@ -172,7 +169,7 @@ export const useDiscoverHistogram = ({ return; } - const { result: totalHitsResult } = savedSearchData$.totalHits$.getValue(); + const { result: totalHitsResult } = totalHits$.getValue(); if ( (status === UnifiedHistogramFetchStatus.loading || @@ -184,18 +181,22 @@ export const useDiscoverHistogram = ({ return; } - // Sync the totalHits$ observable with the unified histogram state - savedSearchData$.totalHits$.next({ - fetchStatus: status.toString() as FetchStatus, - result, - }); + const fetchStatus = status.toString() as FetchStatus; + + // Do not sync the loading state since it's already handled by fetchAll + if (fetchStatus !== FetchStatus.LOADING) { + totalHits$.next({ + fetchStatus, + result, + }); + } if (status !== UnifiedHistogramFetchStatus.complete || typeof result !== 'number') { return; } // Check the hits count to set a partial or no results state - checkHitCount(savedSearchData$.main$, result); + checkHitCount(main$, result); } ); @@ -204,8 +205,8 @@ export const useDiscoverHistogram = ({ }; }, [ isEsqlMode, - savedSearchData$.main$, - savedSearchData$.totalHits$, + main$, + totalHits$, setTotalHitsError, stateContainer.appState, unifiedHistogram?.state$, @@ -234,7 +235,7 @@ export const useDiscoverHistogram = ({ const [initialEsqlProps] = useState(() => getUnifiedHistogramPropsForEsql({ - documentsValue: savedSearchData$.documents$.getValue(), + documentsValue: documents$.getValue(), savedSearch: stateContainer.savedSearchState.getState(), }) ); diff --git a/src/plugins/discover/public/application/main/data_fetching/fetch_all.ts b/src/plugins/discover/public/application/main/data_fetching/fetch_all.ts index 660dff3bdb4ff..3b54e6f8ce083 100644 --- a/src/plugins/discover/public/application/main/data_fetching/fetch_all.ts +++ b/src/plugins/discover/public/application/main/data_fetching/fetch_all.ts @@ -92,13 +92,9 @@ export function fetchAll( // Mark all subjects as loading sendLoadingMsg(dataSubjects.main$); sendLoadingMsg(dataSubjects.documents$, { query }); - - // histogram for data view mode will send `loading` for totalHits$ - if (isEsqlQuery) { - sendLoadingMsg(dataSubjects.totalHits$, { - result: dataSubjects.totalHits$.getValue().result, - }); - } + sendLoadingMsg(dataSubjects.totalHits$, { + result: dataSubjects.totalHits$.getValue().result, + }); // Start fetching all required requests const response = isEsqlQuery diff --git a/src/plugins/discover/public/application/main/state_management/discover_data_state_container.test.ts b/src/plugins/discover/public/application/main/state_management/discover_data_state_container.test.ts index 226a48dc1aeca..1bbb16ab3c9dd 100644 --- a/src/plugins/discover/public/application/main/state_management/discover_data_state_container.test.ts +++ b/src/plugins/discover/public/application/main/state_management/discover_data_state_container.test.ts @@ -159,7 +159,6 @@ describe('test getDataStateContainer', () => { expect( stateContainer.searchSessionManager.getCurrentSearchSessionId as jest.Mock ).toHaveBeenCalled(); - unsubscribe(); done(); } @@ -169,21 +168,24 @@ describe('test getDataStateContainer', () => { }); it('should update app state from default profile state', async () => { + mockFetchDocuments.mockResolvedValue({ records: [] }); const stateContainer = getDiscoverStateMock({ isTimeBased: true }); const dataState = stateContainer.dataState; const dataUnsub = dataState.subscribe(); const appUnsub = stateContainer.appState.initAndSync(); - discoverServiceMock.profilesManager.resolveDataSourceProfile({}); + await discoverServiceMock.profilesManager.resolveDataSourceProfile({}); stateContainer.actions.setDataView(dataViewMock); stateContainer.internalState.transitions.setResetDefaultProfileState({ columns: true, rowHeight: true, }); + dataState.data$.totalHits$.next({ fetchStatus: FetchStatus.COMPLETE, result: 0, }); dataState.refetch$.next(undefined); + await waitFor(() => { expect(dataState.data$.main$.value.fetchStatus).toBe(FetchStatus.COMPLETE); }); @@ -202,7 +204,7 @@ describe('test getDataStateContainer', () => { const dataState = stateContainer.dataState; const dataUnsub = dataState.subscribe(); const appUnsub = stateContainer.appState.initAndSync(); - discoverServiceMock.profilesManager.resolveDataSourceProfile({}); + await discoverServiceMock.profilesManager.resolveDataSourceProfile({}); stateContainer.actions.setDataView(dataViewMock); stateContainer.internalState.transitions.setResetDefaultProfileState({ columns: false, diff --git a/src/plugins/discover/public/application/main/state_management/discover_data_state_container.ts b/src/plugins/discover/public/application/main/state_management/discover_data_state_container.ts index ce7f820aa3cdd..4d01c2b72d327 100644 --- a/src/plugins/discover/public/application/main/state_management/discover_data_state_container.ts +++ b/src/plugins/discover/public/application/main/state_management/discover_data_state_container.ts @@ -185,6 +185,12 @@ export function getDataStateContainer({ documents$: new BehaviorSubject(initialState), totalHits$: new BehaviorSubject(initialState), }; + // This is debugging code, helping you to understand which messages are sent to the data observables + // Adding a debugger in the functions can be helpful to understand what triggers a message + // dataSubjects.main$.subscribe((msg) => addLog('dataSubjects.main$', msg)); + // dataSubjects.documents$.subscribe((msg) => addLog('dataSubjects.documents$', msg)); + // dataSubjects.totalHits$.subscribe((msg) => addLog('dataSubjects.totalHits$', msg);); + // Add window.ELASTIC_DISCOVER_LOGGER = 'debug' to see messages in console let autoRefreshDone: AutoRefreshDoneFn | undefined | null = null; /** diff --git a/test/functional/apps/discover/group3/_lens_vis.ts b/test/functional/apps/discover/group3/_lens_vis.ts index 1bd6f8099fd22..321486a40238e 100644 --- a/test/functional/apps/discover/group3/_lens_vis.ts +++ b/test/functional/apps/discover/group3/_lens_vis.ts @@ -110,8 +110,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return seriesType; } - // Failing: See https://github.com/elastic/kibana/issues/184600 - describe.skip('discover lens vis', function () { + describe('discover lens vis', function () { before(async () => { await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); From eb688339921911b48faed986ea9f97b578f8a675 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 22 Oct 2024 17:32:52 +1100 Subject: [PATCH 60/69] [api-docs] 2024-10-22 Daily api_docs build (#197165) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/868 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_quality.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_usage.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/discover_shared.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/entities_data_access.mdx | 2 +- api_docs/entity_manager.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/esql.mdx | 2 +- api_docs/esql_data_grid.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_annotation_listing.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.devdocs.json | 32 ++++- api_docs/expression_x_y.mdx | 4 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/fields_metadata.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.devdocs.json | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/inference.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/integration_assistant.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/inventory.mdx | 2 +- api_docs/investigate.mdx | 2 +- api_docs/investigate_app.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_ai_assistant.mdx | 2 +- api_docs/kbn_ai_assistant_common.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_log_pattern_analysis.mdx | 2 +- api_docs/kbn_aiops_log_rate_analysis.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_comparators.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerting_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_grouping.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_collection_utils.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_data_view.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_types.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_avc_banner.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_bfetch_error.mdx | 2 +- api_docs/kbn_calculate_auto.mdx | 2 +- .../kbn_calculate_width_from_char_count.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cbor.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_cloud_security_posture.mdx | 2 +- .../kbn_cloud_security_posture_common.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mock.mdx | 2 +- api_docs/kbn_code_owners.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...ent_management_content_insights_public.mdx | 2 +- ...ent_management_content_insights_server.mdx | 2 +- ...bn_content_management_favorites_public.mdx | 2 +- ...bn_content_management_favorites_server.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...tent_management_table_list_view_common.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- .../kbn_content_management_user_profiles.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_feature_flags_browser.mdx | 2 +- ...bn_core_feature_flags_browser_internal.mdx | 2 +- .../kbn_core_feature_flags_browser_mocks.mdx | 2 +- api_docs/kbn_core_feature_flags_server.mdx | 2 +- ...kbn_core_feature_flags_server_internal.mdx | 2 +- .../kbn_core_feature_flags_server_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- ...e_http_router_server_internal.devdocs.json | 10 +- .../kbn_core_http_router_server_internal.mdx | 2 +- ...core_http_router_server_mocks.devdocs.json | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 34 +++-- api_docs/kbn_core_http_server.mdx | 4 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- .../kbn_core_plugins_contracts_browser.mdx | 2 +- .../kbn_core_plugins_contracts_server.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_security_browser.mdx | 2 +- .../kbn_core_security_browser_internal.mdx | 2 +- api_docs/kbn_core_security_browser_mocks.mdx | 2 +- api_docs/kbn_core_security_common.mdx | 2 +- api_docs/kbn_core_security_server.mdx | 2 +- .../kbn_core_security_server_internal.mdx | 2 +- api_docs/kbn_core_security_server_mocks.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- .../kbn_core_test_helpers_model_versions.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_icons.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_forge.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_data_stream_adapter.mdx | 2 +- api_docs/kbn_data_view_utils.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_fleet.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_deeplinks_security.mdx | 2 +- api_docs/kbn_deeplinks_shared.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_agent_utils.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_elastic_assistant_common.mdx | 2 +- api_docs/kbn_entities_schema.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_esql_ast.mdx | 2 +- api_docs/kbn_esql_editor.mdx | 2 +- api_docs/kbn_esql_utils.mdx | 2 +- api_docs/kbn_esql_validation_autocomplete.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_formatters.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- .../kbn_ftr_common_functional_ui_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_grid_layout.mdx | 2 +- api_docs/kbn_grouping.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- .../kbn_index_management_shared_types.mdx | 2 +- api_docs/kbn_inference_integration_flyout.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_investigation_shared.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_ipynb.mdx | 2 +- api_docs/kbn_item_buffer.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_json_schemas.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- api_docs/kbn_language_documentation.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_lens_formula_docs.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_content_badge.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_cancellable_search.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_field_stats_flyout.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_parse_interval.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_time_buckets.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_ui_actions.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_ml_validators.mdx | 2 +- api_docs/kbn_mock_idp_utils.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_object_versioning_utils.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_rule_utils.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_observability_logs_overview.mdx | 2 +- ...kbn_observability_synthetics_test_data.mdx | 2 +- api_docs/kbn_openapi_bundler.mdx | 2 +- api_docs/kbn_openapi_generator.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- api_docs/kbn_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_check.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_presentation_containers.mdx | 2 +- api_docs/kbn_presentation_publishing.mdx | 2 +- api_docs/kbn_product_doc_artifact_builder.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_hooks.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_recently_accessed.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_reporting_csv_share_panel.mdx | 2 +- api_docs/kbn_reporting_export_types_csv.mdx | 2 +- .../kbn_reporting_export_types_csv_common.mdx | 2 +- api_docs/kbn_reporting_export_types_pdf.mdx | 2 +- .../kbn_reporting_export_types_pdf_common.mdx | 2 +- api_docs/kbn_reporting_export_types_png.mdx | 2 +- .../kbn_reporting_export_types_png_common.mdx | 2 +- api_docs/kbn_reporting_mocks_server.mdx | 2 +- api_docs/kbn_reporting_public.mdx | 2 +- api_docs/kbn_reporting_server.mdx | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- .../kbn_response_ops_feature_flag_service.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rollup.mdx | 2 +- api_docs/kbn_router_to_openapispec.mdx | 2 +- api_docs/kbn_router_utils.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_screenshotting_server.mdx | 2 +- api_docs/kbn_search_api_keys_components.mdx | 2 +- api_docs/kbn_search_api_keys_server.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_errors.mdx | 2 +- api_docs/kbn_search_index_documents.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_search_shared_ui.mdx | 2 +- api_docs/kbn_search_types.mdx | 2 +- api_docs/kbn_security_api_key_management.mdx | 2 +- api_docs/kbn_security_authorization_core.mdx | 2 +- ...kbn_security_authorization_core_common.mdx | 2 +- api_docs/kbn_security_form_components.mdx | 2 +- api_docs/kbn_security_hardening.mdx | 2 +- api_docs/kbn_security_plugin_types_common.mdx | 2 +- api_docs/kbn_security_plugin_types_public.mdx | 2 +- api_docs/kbn_security_plugin_types_server.mdx | 2 +- .../kbn_security_role_management_model.mdx | 2 +- api_docs/kbn_security_solution_common.mdx | 2 +- ...kbn_security_solution_distribution_bar.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- api_docs/kbn_security_ui_components.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- .../kbn_server_route_repository_client.mdx | 2 +- .../kbn_server_route_repository_utils.mdx | 2 +- api_docs/kbn_serverless_common_settings.mdx | 2 +- .../kbn_serverless_observability_settings.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_search_settings.mdx | 2 +- api_docs/kbn_serverless_security_settings.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_error_boundary.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_tabbed_modal.mdx | 2 +- api_docs/kbn_shared_ux_table_persist.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_predicates.mdx | 2 +- api_docs/kbn_sse_utils.mdx | 2 +- api_docs/kbn_sse_utils_client.mdx | 2 +- api_docs/kbn_sse_utils_server.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_synthetics_e2e.mdx | 2 +- api_docs/kbn_synthetics_private_location.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_eui_helpers.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_try_in_console.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_unsaved_changes_badge.mdx | 2 +- api_docs/kbn_unsaved_changes_prompt.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_visualization_utils.mdx | 2 +- api_docs/kbn_xstate_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kbn_zod.mdx | 2 +- api_docs/kbn_zod_helpers.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.devdocs.json | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/links.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/logs_data_access.mdx | 2 +- api_docs/logs_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.devdocs.json | 116 +++++++++--------- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/mock_idp_plugin.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_a_i_assistant_app.mdx | 2 +- .../observability_ai_assistant_management.mdx | 2 +- api_docs/observability_logs_explorer.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 8 +- api_docs/presentation_panel.mdx | 2 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/search_assistant.mdx | 2 +- api_docs/search_connectors.mdx | 2 +- api_docs/search_homepage.mdx | 2 +- api_docs/search_indices.mdx | 2 +- api_docs/search_inference_endpoints.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/slo.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.devdocs.json | 2 +- api_docs/visualizations.mdx | 2 +- 761 files changed, 883 insertions(+), 833 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 5bd83634aa9fa..cdcb26506e4fb 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 1ea53850e1add..6b06570b22c2e 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index f9264bcf8250d..a36f6ed4c733f 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index ad006a3891a9b..79a5cbcf4b668 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index f4696a33fc90e..b56ce09f5a7c6 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 99b28298255a6..f9e57f499cc4f 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 48b39cdfa92c9..2b4a8680cb79b 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 04176d2453073..0a84be10a6cfb 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 1591c7b31e45f..c4c3da3a973e4 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 96d1e230442a5..6bb842a920512 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 24c932d5de302..57723fa2f92cc 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index a3c82675ac020..b761675d10d87 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index b49f6ae3cd10a..a8fa73fc07ee3 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 4922d2d17e5cc..2159bde36f4e8 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index e8a297a0f251d..56bf635927f81 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 3536dcb32d915..eab0a671337bd 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index fb68e8a70e378..dac1a38ace329 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 3281128a5c67c..a032e6b89bf00 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 83a06b887a4dd..baeee421a368a 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 64cec1c539f5b..4928618c3c501 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index c9fba2b7c19f6..a4a4d5e6a846e 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 6a98eab7f4355..872e84ea75337 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index eab39219c372a..238bef60b8c92 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index 55172bb81524b..a95358c831aa4 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 91d9ea2ff99ab..73ae5db81d263 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 7737c6a20808c..38683da0ccb65 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_usage.mdx b/api_docs/data_usage.mdx index 649117c73f79d..d46c58a810081 100644 --- a/api_docs/data_usage.mdx +++ b/api_docs/data_usage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataUsage title: "dataUsage" image: https://source.unsplash.com/400x175/?github description: API docs for the dataUsage plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataUsage'] --- import dataUsageObj from './data_usage.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index a560a29c61131..073bc9547507c 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index eb4ddeb297483..ebb622497d54e 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 5bcbbb88f3c89..7722a4747130a 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index d0ffb52c5bba7..101a1e3b6347e 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 39219e7d09dd5..4a1bce2e873c1 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 301fab88d2608..b7106ecd71edb 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index d3a02c223ebcb..1085444d81bcf 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 873bcdc3e2060..727ce55666c2d 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 5108d057e4a8b..e8bd07c2ff736 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index df66921effe99..d4df722270435 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 27c3751485c04..5c74f175bd3e9 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 125847fb5e7d1..4620c4b367f3c 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index 32ce707d66c51..52005b9a652bf 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index cf7c2a558e832..52b286022e97a 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index c75e15ff98d67..a46083b568577 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 1fbea31155fb7..9badbdbbd73ab 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index e7a5a083c0f64..e7aeb494115bf 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index b0689b74afdaa..9d5833e4930ab 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index e8c06fe565786..ab7c01c8baba5 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entities_data_access.mdx b/api_docs/entities_data_access.mdx index 621d002adc61e..269f9e486f8eb 100644 --- a/api_docs/entities_data_access.mdx +++ b/api_docs/entities_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entitiesDataAccess title: "entitiesDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the entitiesDataAccess plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entitiesDataAccess'] --- import entitiesDataAccessObj from './entities_data_access.devdocs.json'; diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index d1a758cf0cd53..3efb017b88d5d 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index b009b99297081..7a8139c5084b6 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx index 21c07bd4e8e74..0a4e71472551b 100644 --- a/api_docs/esql.mdx +++ b/api_docs/esql.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esql title: "esql" image: https://source.unsplash.com/400x175/?github description: API docs for the esql plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] --- import esqlObj from './esql.devdocs.json'; diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index 15e91bf6e8550..dcd3455efaf90 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 3c9ab8175d1ec..f0bc87481ba54 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index b716960bb0cbb..d5d4e88b21859 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index c6681f0448529..eb98575646075 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 31966b6415aa8..f2d40e76eea41 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 90d5232c5565f..ba925168a7013 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 53aa52b8fa9c0..b24ad46bbc232 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index d3d6f03b6acf8..0f5ff13bae446 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index e4745c8efc20e..73dcaae94ddc0 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 81a77b96d9d4b..5aaaed7d9a97a 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index e816c6e1b59dc..e9070cd4f8296 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index f53a2fc8d7c91..512e82d8736bb 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index b05c0db6e3af2..8b38be96a7915 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 8693bb98b3504..4ce3bbb7be629 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 41e84e01da888..4fbe2f75b37aa 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 615c8e8abe750..763c056a7e1e8 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 110aee9ad4a78..fa3a012dfa129 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.devdocs.json b/api_docs/expression_x_y.devdocs.json index 93f55a1f188fe..38e1d5af388f5 100644 --- a/api_docs/expression_x_y.devdocs.json +++ b/api_docs/expression_x_y.devdocs.json @@ -38,6 +38,21 @@ } ], "objects": [ + { + "parentPluginId": "expressionXY", + "id": "def-public.FittingFunctions", + "type": "Object", + "tags": [], + "label": "FittingFunctions", + "description": [], + "signature": [ + "{ readonly NONE: \"None\"; readonly ZERO: \"Zero\"; readonly LINEAR: \"Linear\"; readonly CARRY: \"Carry\"; readonly LOOKAHEAD: \"Lookahead\"; readonly AVERAGE: \"Average\"; readonly NEAREST: \"Nearest\"; }" + ], + "path": "src/plugins/chart_expressions/expression_xy/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "expressionXY", "id": "def-public.LayerTypes", @@ -2931,7 +2946,7 @@ "label": "FittingFunction", "description": [], "signature": [ - "\"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\"" + "\"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, @@ -3635,6 +3650,21 @@ } ], "objects": [ + { + "parentPluginId": "expressionXY", + "id": "def-common.FittingFunctions", + "type": "Object", + "tags": [], + "label": "FittingFunctions", + "description": [], + "signature": [ + "{ readonly NONE: \"None\"; readonly ZERO: \"Zero\"; readonly LINEAR: \"Linear\"; readonly CARRY: \"Carry\"; readonly LOOKAHEAD: \"Lookahead\"; readonly AVERAGE: \"Average\"; readonly NEAREST: \"Nearest\"; }" + ], + "path": "src/plugins/chart_expressions/expression_xy/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "expressionXY", "id": "def-common.LayerTypes", diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index ca232502d58f2..a3e6a871f97b9 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 180 | 0 | 169 | 13 | +| 182 | 0 | 171 | 13 | ## Client diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 06ecd910dfeb4..ee8466d3da988 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 6b6508ee562a4..1cb8ff75ef0a9 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index 0aefb39882ed6..3ab2d788ee27d 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index 7a71db7c76e6b..901b430fe1c40 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] --- import fieldsMetadataObj from './fields_metadata.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 49e79b28daf7b..a55fff72efd49 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index a40095d2c4852..e28f687715420 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index a9c30b11080fd..7dfc8dad32253 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 009ef5bb74cf4..277c99364ebfa 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -22777,7 +22777,7 @@ "section": "def-common.ListWithKuery", "text": "ListWithKuery" }, - " & { noAgentCount?: boolean | undefined; full?: boolean | undefined; }" + " & { noAgentCount?: boolean | undefined; withAgentCount?: boolean | undefined; full?: boolean | undefined; }" ], "path": "x-pack/plugins/fleet/common/types/rest_spec/agent_policy.ts", "deprecated": false, diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index f14348c9c601a..60381debad871 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index b87aad57a8b44..a8f60431cb67e 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index 8e0192d16c372..0ecca0763234a 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 02b148d214fc2..607a4958ace2d 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 1e4de9367402d..432512e2979e4 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 78453c3cb2a9d..125dfbb2cae10 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index b5c5d7eaca871..9e7f3e917bc3f 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/inference.mdx b/api_docs/inference.mdx index a25c24caec01b..97527d3567dc9 100644 --- a/api_docs/inference.mdx +++ b/api_docs/inference.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inference title: "inference" image: https://source.unsplash.com/400x175/?github description: API docs for the inference plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inference'] --- import inferenceObj from './inference.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index ddd2eff52f8b4..72ef37f7f3f9f 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index 7926fae14dad0..15926a846873b 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 67ce9a1b4ac27..6d40b8861ec3b 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index ed622923791e1..f1a323e938f27 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 030bdf5a6c8b9..4148a37c80817 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/inventory.mdx b/api_docs/inventory.mdx index ea82f1498fe79..539128311167f 100644 --- a/api_docs/inventory.mdx +++ b/api_docs/inventory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inventory title: "inventory" image: https://source.unsplash.com/400x175/?github description: API docs for the inventory plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inventory'] --- import inventoryObj from './inventory.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index fa3722718ab91..eea11d331cd4c 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index 28924d9f4facd..13a3541529b67 100644 --- a/api_docs/investigate_app.mdx +++ b/api_docs/investigate_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigateApp title: "investigateApp" image: https://source.unsplash.com/400x175/?github description: API docs for the investigateApp plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 251bb9870cdca..6802a46bef8f3 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant.mdx b/api_docs/kbn_ai_assistant.mdx index 342a5fad58f96..d8e894109e119 100644 --- a/api_docs/kbn_ai_assistant.mdx +++ b/api_docs/kbn_ai_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant title: "@kbn/ai-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant'] --- import kbnAiAssistantObj from './kbn_ai_assistant.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant_common.mdx b/api_docs/kbn_ai_assistant_common.mdx index b75171bb0191c..cb85a8ecf83b6 100644 --- a/api_docs/kbn_ai_assistant_common.mdx +++ b/api_docs/kbn_ai_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant-common title: "@kbn/ai-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant-common'] --- import kbnAiAssistantCommonObj from './kbn_ai_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 67d65b437def2..1f1df44ae9e10 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index b656af18160ee..74e7e66075aa5 100644 --- a/api_docs/kbn_aiops_log_pattern_analysis.mdx +++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis title: "@kbn/aiops-log-pattern-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-pattern-analysis plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index c52f818cb75ca..1742608f46478 100644 --- a/api_docs/kbn_aiops_log_rate_analysis.mdx +++ b/api_docs/kbn_aiops_log_rate_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis title: "@kbn/aiops-log-rate-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-rate-analysis plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 97e329959c60e..1022ceb8bbfac 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index 6854b19d705d9..731c90e9d459a 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index b4113f1ca361d..0da0fd93458e7 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 10177db59a269..a59fbf87b7e21 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index de68b08c8a745..575bc13aaeaf7 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index fd6518795e0bb..ab9b48818aa54 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 1457b615f123b..57f8a06c4d4c8 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index f11a8ea2f136b..cbfe9721dc84b 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 56fdea8dec13b..1ef361c1b4ed6 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index edd2af6aff97b..3b545fcf90110 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index 936779e3623fe..ba4b79b896dc4 100644 --- a/api_docs/kbn_apm_data_view.mdx +++ b/api_docs/kbn_apm_data_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view title: "@kbn/apm-data-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-data-view plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 61b9bd468ceff..5e7ff3a3a3727 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index e96e12c6fbfed..3768637aa253b 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_types.mdx b/api_docs/kbn_apm_types.mdx index 0079355996e4d..eeefb6faa47e9 100644 --- a/api_docs/kbn_apm_types.mdx +++ b/api_docs/kbn_apm_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-types title: "@kbn/apm-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-types'] --- import kbnApmTypesObj from './kbn_apm_types.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 4065df83d8ad0..0f6d0fe1c4256 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_avc_banner.mdx b/api_docs/kbn_avc_banner.mdx index c76846ffb50a9..7e55f69fb9362 100644 --- a/api_docs/kbn_avc_banner.mdx +++ b/api_docs/kbn_avc_banner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-avc-banner title: "@kbn/avc-banner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/avc-banner plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/avc-banner'] --- import kbnAvcBannerObj from './kbn_avc_banner.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 976a65e2013f6..184ce5588d8b7 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index 771d4c9405a34..e4d6358678c5f 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index a07fe789e7fd6..61b42e2652eb0 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index f485083db7ca6..016286299a20d 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 0f3ae17d7b061..66e07a1750564 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cbor.mdx b/api_docs/kbn_cbor.mdx index 38792fb0c0d21..f95013ef9b1f5 100644 --- a/api_docs/kbn_cbor.mdx +++ b/api_docs/kbn_cbor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cbor title: "@kbn/cbor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cbor plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cbor'] --- import kbnCborObj from './kbn_cbor.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 4c7a142df06d8..c71328613270a 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index 726c05f020dc9..b5be35e170ce4 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 8cc92c932651a..a8f658ecc0542 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index dc80c70c56681..aa9820ee7afad 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 8360eac982cbb..afb84d150bc8f 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 49a1ebfb4619d..2a6a5e676395f 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 6bc2ebeee8749..ef9416dbd1765 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture.mdx b/api_docs/kbn_cloud_security_posture.mdx index f21e64b5b3a36..c403086428e28 100644 --- a/api_docs/kbn_cloud_security_posture.mdx +++ b/api_docs/kbn_cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture title: "@kbn/cloud-security-posture" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture'] --- import kbnCloudSecurityPostureObj from './kbn_cloud_security_posture.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_common.mdx b/api_docs/kbn_cloud_security_posture_common.mdx index a1872c4b1b950..caeb5f80d41a3 100644 --- a/api_docs/kbn_cloud_security_posture_common.mdx +++ b/api_docs/kbn_cloud_security_posture_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-common title: "@kbn/cloud-security-posture-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-common'] --- import kbnCloudSecurityPostureCommonObj from './kbn_cloud_security_posture_common.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 5fa7f75460803..5c968fc61d241 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index 1b9714f140829..395a72ff0c48b 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 77b7e7801ae7c..3427fbc61f642 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 44181a7e1b849..6c612c075f851 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 038c4c9ecccb0..995979502de6d 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index c301e1a8efeda..25f9c6928fd1b 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 12f975d3bddd3..701ffde784db8 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 3942e82a237b2..7a8754de39b59 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_public.mdx b/api_docs/kbn_content_management_content_insights_public.mdx index fe1b9fdd83472..af30a9f5486cc 100644 --- a/api_docs/kbn_content_management_content_insights_public.mdx +++ b/api_docs/kbn_content_management_content_insights_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-public title: "@kbn/content-management-content-insights-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-public plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-public'] --- import kbnContentManagementContentInsightsPublicObj from './kbn_content_management_content_insights_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_server.mdx b/api_docs/kbn_content_management_content_insights_server.mdx index d9f2e90b39d18..4ad3136ce4df6 100644 --- a/api_docs/kbn_content_management_content_insights_server.mdx +++ b/api_docs/kbn_content_management_content_insights_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-server title: "@kbn/content-management-content-insights-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-server'] --- import kbnContentManagementContentInsightsServerObj from './kbn_content_management_content_insights_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_public.mdx b/api_docs/kbn_content_management_favorites_public.mdx index 6720e63f4dc4f..efa46aba6cc31 100644 --- a/api_docs/kbn_content_management_favorites_public.mdx +++ b/api_docs/kbn_content_management_favorites_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-public title: "@kbn/content-management-favorites-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-public plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-public'] --- import kbnContentManagementFavoritesPublicObj from './kbn_content_management_favorites_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_server.mdx b/api_docs/kbn_content_management_favorites_server.mdx index f71c4f87de9d4..a1d248760dbdf 100644 --- a/api_docs/kbn_content_management_favorites_server.mdx +++ b/api_docs/kbn_content_management_favorites_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-server title: "@kbn/content-management-favorites-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-server'] --- import kbnContentManagementFavoritesServerObj from './kbn_content_management_favorites_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index 52f25b5983ce0..8713fbffc8881 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index bfa1c96ca331b..2175ed159a696 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index e90dc8288d59b..a5c070deb113e 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 6c63caf708a0d..44b64464e58b3 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index a9ad063b7c976..2e8cbc9d245af 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-user-profiles'] --- import kbnContentManagementUserProfilesObj from './kbn_content_management_user_profiles.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index d8d4dff31c00f..37f9380b62124 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 924b854d5418a..43db44e1f649b 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 113c5416c0f41..1abe9b01009f6 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 40398f1db238f..9f53359ea78f5 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 284d8cd7d4ccf..35a45a2c84481 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index f83bfa515475d..2eb93a3e06a33 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index d01a26fd68271..51734aa3566b3 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index 3400325b49a5d..79638243a29d1 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index 470068332c2ac..ab8e855a6bdf3 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index 4e2d99fc7cc83..911e0b27dfe01 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index c1c4073ae01a7..e82149f1a2787 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 6f31fc74b0e56..87e91d4973293 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 2482fc43348fa..3f9f3eb704ac2 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index 8327e2b8a5331..ea87314149349 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index da11e2bb1e490..3d168d02eb3c5 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 21608655c9be9..512ffddcdcdd6 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 4571d240ed6cb..354edd84e28b5 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 0e29194bcc5c6..3424a5bd7cc53 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index 9b2d6fed31056..3ef5ff91962a1 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 06d5ebce7ba61..66d98b16952f6 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index b6d5b0ce6f227..e1dd867f3447a 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 6b009783e6311..051c89f4ec85e 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 7b65b3cb4cf35..ba4ea662f35a7 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index 434c2e86dea34..83b62e0d54475 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index f1de762803109..a031665720fb7 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index a5c1a6edf0e17..f53c8ba399245 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index f5f1777db6f19..4d766aaaf0b11 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 25ca888fc4779..3c25a670f2c7d 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 3d4dcbe6803ec..09e0b8013be00 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index 1cdb86293f4a5..c176fb4f4d133 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index 32433f7277d4a..de6023b635192 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index e9601f490b8ed..3623061cd4579 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index cb0effdc979d8..09a830e75fff6 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 9116cf1a14288..cbfe1648fdfab 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 30515c11e4888..d0ce93bfe82a0 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 76d1064e1ce7f..e1909389074b1 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index e886a575c39b3..1ff73df4f0dbd 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index b2a0f67f9ea60..13e368dd3ff28 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index fc769f3762bdd..674406dca02f2 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index e6ceebf56b9f3..a3bab36e39853 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index b98a711783ece..01f2db6be8ee7 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index ed22aaaa96c61..3f527319436f6 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index f4b4767486a18..01358cc960861 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 728c729ea2840..0a7dbeb28db3e 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 23d9813cb40f5..a2299986a7dd6 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 87e428ec9f4f9..6a1a58ab52ac9 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index f124f4f9efc04..d7c966eb0723e 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index e3746ce9b495f..7ed70888a5421 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 1568c94eaff9c..22fbf62d21691 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index cdbc07f38dd2b..abd36dd70dbf1 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 2a9f223a40cda..32daa52d33021 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index f56d3255ac596..dbf43b20ee462 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 78c07c0a6cd74..0e014579b20c9 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 81b3a5805d9a3..327ff550bc296 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 062026c011049..f9e3057375635 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 18b74907bd0e9..a7bba3379f32d 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index e882699d48977..aca0f75a3ec42 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index 7b3c4ae70bcde..414bcd8cf54b2 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index cac504944fc74..2cc6bc8f983f1 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser.mdx b/api_docs/kbn_core_feature_flags_browser.mdx index d04a20182f3a8..688c4e11b2e73 100644 --- a/api_docs/kbn_core_feature_flags_browser.mdx +++ b/api_docs/kbn_core_feature_flags_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser title: "@kbn/core-feature-flags-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser'] --- import kbnCoreFeatureFlagsBrowserObj from './kbn_core_feature_flags_browser.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_internal.mdx b/api_docs/kbn_core_feature_flags_browser_internal.mdx index 8000388b45be9..fc5d70ab082a4 100644 --- a/api_docs/kbn_core_feature_flags_browser_internal.mdx +++ b/api_docs/kbn_core_feature_flags_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-internal title: "@kbn/core-feature-flags-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-internal'] --- import kbnCoreFeatureFlagsBrowserInternalObj from './kbn_core_feature_flags_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_mocks.mdx b/api_docs/kbn_core_feature_flags_browser_mocks.mdx index 26ce39d371a5f..faa012fe14afc 100644 --- a/api_docs/kbn_core_feature_flags_browser_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-mocks title: "@kbn/core-feature-flags-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-mocks'] --- import kbnCoreFeatureFlagsBrowserMocksObj from './kbn_core_feature_flags_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server.mdx b/api_docs/kbn_core_feature_flags_server.mdx index 73e37666306b7..f0bf8886ca2c3 100644 --- a/api_docs/kbn_core_feature_flags_server.mdx +++ b/api_docs/kbn_core_feature_flags_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server title: "@kbn/core-feature-flags-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server'] --- import kbnCoreFeatureFlagsServerObj from './kbn_core_feature_flags_server.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_internal.mdx b/api_docs/kbn_core_feature_flags_server_internal.mdx index a7bf94bb7a882..443f693d0e74d 100644 --- a/api_docs/kbn_core_feature_flags_server_internal.mdx +++ b/api_docs/kbn_core_feature_flags_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-internal title: "@kbn/core-feature-flags-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-internal'] --- import kbnCoreFeatureFlagsServerInternalObj from './kbn_core_feature_flags_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_mocks.mdx b/api_docs/kbn_core_feature_flags_server_mocks.mdx index 1996eb463c1d7..48bfccd1f6318 100644 --- a/api_docs/kbn_core_feature_flags_server_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-mocks title: "@kbn/core-feature-flags-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-mocks'] --- import kbnCoreFeatureFlagsServerMocksObj from './kbn_core_feature_flags_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index a964e5377f7c7..1bb960c171989 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 71c79a4346dca..75bc19f9b4654 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 7829437ed0584..fe45fd7889850 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 9ccdceca0ad94..6392d24097600 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 6b7d2b537f554..7e548c4c52898 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index afd882d48fb50..f517e7f03aea5 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index d96a4f20e4f8f..4212152c2a940 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index 929339d93e018..c5f47f6690e4a 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index cdf20c4979ee6..b1b64dc7efd8b 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.devdocs.json b/api_docs/kbn_core_http_router_server_internal.devdocs.json index 640117913948d..2991ec38b9a5b 100644 --- a/api_docs/kbn_core_http_router_server_internal.devdocs.json +++ b/api_docs/kbn_core_http_router_server_internal.devdocs.json @@ -179,7 +179,7 @@ }, "<", "Method", - ">, \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ">, \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -266,7 +266,7 @@ }, "<", "Method", - ">, \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ">, \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -353,7 +353,7 @@ }, "<", "Method", - ">, \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ">, \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -440,7 +440,7 @@ }, "<", "Method", - ">, \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ">, \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -527,7 +527,7 @@ }, "<", "Method", - ">, \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ">, \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 8d7bb66ca2575..bcc2a65057609 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.devdocs.json b/api_docs/kbn_core_http_router_server_mocks.devdocs.json index 24e21bf81d9dc..4d07feacb1943 100644 --- a/api_docs/kbn_core_http_router_server_mocks.devdocs.json +++ b/api_docs/kbn_core_http_router_server_mocks.devdocs.json @@ -72,7 +72,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index c9ef80c6d4acd..8dda65eb8661f 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 98beaec1e9118..176b0ed195353 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -13412,6 +13412,22 @@ "path": "packages/core/http/core-http-server/src/router/route.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-server.RouteConfigOptions.availability", + "type": "Object", + "tags": [], + "label": "availability", + "description": [ + "\nBased on the the ES API specification (see https://github.com/elastic/elasticsearch-specification)\nKibana APIs can also specify some metadata about API availability.\n\nThis setting is only applicable if your route `access` is `public`.\n" + ], + "signature": [ + "{ stability?: \"experimental\" | \"beta\" | \"stable\" | undefined; since?: string | undefined; } | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -15784,6 +15800,10 @@ "plugin": "@kbn/core-http-router-server-internal", "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts" }, + { + "plugin": "@kbn/core-http-router-server-internal", + "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_route.test.ts" + }, { "plugin": "@kbn/core-http-router-server-internal", "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.test.ts" @@ -15879,7 +15899,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -16190,7 +16210,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -17333,7 +17353,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -17480,7 +17500,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -17779,7 +17799,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -20680,7 +20700,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", @@ -20764,7 +20784,7 @@ "section": "def-server.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"security\" | \"description\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", + ", \"security\" | \"description\" | \"summary\" | \"deprecated\" | \"access\" | \"discontinued\"> | undefined; access: ", { "pluginId": "@kbn/core-http-server", "scope": "server", diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 310bca83f6167..0433311075e5c 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 532 | 2 | 216 | 0 | +| 533 | 2 | 216 | 0 | ## Server diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index b3bd6f89fcb67..256971f6e639c 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index c6ba1644a2b93..6126d699d3522 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index b192cf59c52d5..d8b82a724f1ff 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index d726785afc144..5e64fe1470f41 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index 903a96a71744c..1e75e185cf51d 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index efde74b88af17..ccf5a2aa506d2 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index 0ce740eb8b514..3b2a289c335a8 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 9dede564a4bff..a286571d54a9f 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 5c2d5ab9fd84a..582d04ca8ee7c 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index aed8d407def2b..5826a743e640d 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 7b49cb34c5dd2..ba422887ec639 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index baf0c92aba030..d602e1b532cd2 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index f1f312421fcc9..4e4e9da70eecd 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 214d13ceafbc7..2c0029cdf28b5 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index d874b1f458227..3ec570cd0d33e 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index 6db909ca3fe21..2a7eb6856d6c6 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index ce91cb57aa141..02752cd9df26a 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index a86a005634d7b..8cc534ef0db85 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 8f50f19dd0ef2..38b5ee5896e75 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 91ea123b21c22..ef07b57d81ab8 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index f28a204a8f71a..39b1e1e27cbcb 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index dfb1370f700a7..bb0ea69228d4c 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index c60a4ecf318e9..c8662172aff69 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index 66c80b4c98e86..236df60f2be94 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index b645305c99a17..2ed365f88cdd2 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 215cf8ede16f5..9c5e60b22a87a 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 7d6b2a0e77b60..a675c4c3710c5 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 295fab7feb119..b1d0ccf13d90c 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index 9fb84fa7ca548..ae4b3eb997188 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index ff5524fa97b31..4500160a8c2d9 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index c052e236c1a14..5183a53d3156b 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index 9d6a66ea44d8a..bbe78933a932f 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index fa29aa630cdc2..aee8dd4ccb10d 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 88023e8da1cab..421da01f1b388 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index 82c83c2239bf6..ff39cd993b467 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 5a8b51b267740..d01f1fe2c57a7 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index 69013b512b748..94803d5aa25a8 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index f7eddb43b0ded..0799fb2c78e4e 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 1b1c6371a97bf..8c3c73a68218d 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 853cf30782fd4..79daef636ad30 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 24f740fb06a2c..3a8d76838e175 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 857c465f543fc..766a8df3b0163 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index 5d3c77fefa320..cc04723f053d3 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 72a433302e87d..32e56b8229988 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index cf042c9d2f889..9d4d9d2dfe23a 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index 86846efd64498..e15bad49aab44 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index e9a861d116ecd..f9b5e9a6b44cf 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 8b9e63c123248..2af5fc8259e5f 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 8e745268e94d9..4822a5a8e33e2 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index dcbee781dad94..2ce28c38e754c 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index b99bbe4dbbae2..75013aad69a2d 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index 56780e4c5c100..4e9638394dde7 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index 4cc71746eae52..f0ff5a88c576f 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index 8e9920f59aa3d..cb6233e13d02e 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index bdcd3b2ddf551..d42b2f8028c66 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index 987311fb0fec7..26e1126b75239 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index 7092a5999a571..25c00e9a5465b 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 7bb787d2bda8b..ec5c9173ef8f8 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 04c4525bea097..e3bd6e8ac2177 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 15954be7fa236..6959ef867d9a6 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 35f7a1cb303d4..8b2e1e7ce40af 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index bc483ee36f6a7..487e492555d10 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 803d37ebde085..7ddcd08239c78 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index 96dd119cef6fa..6d2c3325f5bc0 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index eac5af7cb5269..00e19b23ce05e 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index a95e8b23cd920..7c2d32647bb60 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index 9e9b68a6e6b7a..1c8b2237d6f3a 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index a3389b5621c3e..95a530380a8de 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index ab84b4111d703..38e822d9c79cd 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index ab3aac0242295..5975730b5df46 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 63b42c13688fb..b87f2ff96acc5 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index 54a311e611490..c1c8fccd04e47 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index cc86508d7eb56..22364f442826a 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index 4258bc8651f57..e132b273d83c3 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index 81ab412672316..2aac7d1ce7cc4 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 5f875612ad810..5abf29052327c 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index 3d26ea9327ad5..9777f11f4b82d 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 92a02d7608c7a..9311be0e77edd 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 5bdb8b4a1c88d..9f1f5faf5c722 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 77b07f001f37a..d2ced9027972f 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index b7ed5c5f680b6..d6d9671cdf7e4 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index b9976b32c38d3..321c3d9678588 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 4b168d7ddddd3..bbb8155a127ca 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 2366f3016476f..3d64e36c6baf6 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index 3363c571a7146..a967bf6c29fe2 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 9771d40aed460..9afb2822199c2 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 9c5b51b4ccd15..1ea0575eebccf 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 54ac82fdd53ea..4277ecd003673 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index 571ae8ebf2a08..93023a698123f 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index 8a33bd85a73b8..4b85e4c8b6888 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index 45f661ba67f11..8abbc146f4f9c 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 32a41aef5c4dc..53d37a422c76e 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index bbb2fbab016b2..7f9c8f9b6ca93 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index 87fb44e559c8d..864082a5bcf5d 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index 8e9ce74aed16a..7263336f6a024 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index 923ea4e8d9ba6..73c516372ac16 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index 752b92aef933d..c2e52a088c736 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index d83e0c5972716..d43ab94d09baa 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index 718ffcec07c49..eda33c00bc49e 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index 4350e68bb2600..2f29aedf606de 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index af7431f1dbce2..6b45827c78bfd 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index cf2423b68fa4f..4e8b691bb7003 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index bbf7392441178..cffef30fe1ec2 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 58d5bba50e599..23e17bf2d02dc 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 7c24f573d9ecb..9bf56811554a7 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index a25365a929724..f6489372ff2e3 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 7cd3341afee33..ebec751030331 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index 7a3cf86e7852c..fa91cfc4d3e8a 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index d595eb2ed2cd4..93693e6e09cf5 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index 8f39ba44e8be1..4132b16f82655 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index 4b2b716b07aa1..85972ebbf504a 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 86d7c23b471e9..2fc12904d763a 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index 474b162d50a14..d90f7f70e8ac5 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 6bee94f81153a..6f841f6f07bca 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index 88053579a0bcb..57332f6425e33 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 1d7e3036d9bf8..ee6a5c94bc1d0 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 458703dbb50e0..478ee5b3decec 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index c1f6c5532be28..11426db6e3566 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 9ae979c247625..bc17346e31af7 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index 53af997750cc1..ded50fb4a51a1 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index 60e4eaf334c03..1a65f27abc1e4 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 7de3c06600d90..9c9d346457c90 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index d1212f25a3b8a..2dd4ae977b2dc 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 4b43300ab229d..6491bfd53450e 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index eb5e25e02a433..504283a91abf5 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 7267ab51d0427..1e4f3aaa0e448 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index f559084d644b4..772158edd6af8 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 7bc96b8af35d3..286bb62e808bb 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 25cb35f978158..677a9a154c2f5 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index a2c9f2ed4fb5b..68e6615e4383f 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index bf2107e779d36..64921d8506edf 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index bf01c7941c012..8bcc828c8546a 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 2b6bdd33ced4d..6e7153490fc3f 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 68a94a0864393..8f5d16bffabe4 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 9f5360fbc4218..e972044e986b1 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index a8ed47c74f76a..d290ccfd52ef6 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index f263f6f93bfb4..494a651e9f18e 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index 80c1bf6052af6..69b72f7f74614 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index 48dfd09e084f6..3d23c1fd039e1 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index aac9a97cfe181..5e6133738583c 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 6c967b70ceb51..f148792b3c4e7 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 44dc96f1d90f0..f6b38721942d3 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 0f65b28c397e8..7bee1862638b0 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index 7dd6434278d39..07708c9ef9203 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 323def425c0f9..254b382c15e0c 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index fd6b8cf069f94..625509d02bfa0 100644 --- a/api_docs/kbn_esql_ast.mdx +++ b/api_docs/kbn_esql_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast title: "@kbn/esql-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-ast plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_editor.mdx b/api_docs/kbn_esql_editor.mdx index 8853e8f93e4d9..51ef9afc634a4 100644 --- a/api_docs/kbn_esql_editor.mdx +++ b/api_docs/kbn_esql_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-editor title: "@kbn/esql-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-editor plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-editor'] --- import kbnEsqlEditorObj from './kbn_esql_editor.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index cd34738b4b00c..4ebe962f9439a 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 30d5f1c89ca98..193bd95bee56d 100644 --- a/api_docs/kbn_esql_validation_autocomplete.mdx +++ b/api_docs/kbn_esql_validation_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete title: "@kbn/esql-validation-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-validation-autocomplete plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 709419a5cbc41..d6afc3b87e189 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index ca3b6adbd80b0..6ee0841e09a27 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 9b1f70fc890a4..78564d8b01de6 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 064d30fc56972..71d6621ce781b 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 02abb853ab8a5..9ae6a644e4590 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 0ce209f2cbbde..5d3bf128fcab1 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_formatters.mdx b/api_docs/kbn_formatters.mdx index 80bd4af28772d..39161ed5bd6f2 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index a6088a21adaf3..16dc49d361b7a 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 18b423b8c6f25..4b76cc8b12bab 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index ad86426cab2c0..135de4ebde8b3 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 1c1026e6033a3..0805bfcdf422a 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index eb44ee7e1d1f3..d33d5d0a84e5c 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grid_layout.mdx b/api_docs/kbn_grid_layout.mdx index 7b27c0ff49662..97203fd7a4e8d 100644 --- a/api_docs/kbn_grid_layout.mdx +++ b/api_docs/kbn_grid_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grid-layout title: "@kbn/grid-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grid-layout plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grid-layout'] --- import kbnGridLayoutObj from './kbn_grid_layout.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index 025c6254ec165..1f797791202a7 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 302a7c1ebc8cf..6cdebec418986 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index c9874e40289eb..32ed0b433c073 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index 066593be58f7d..a7970bc0a8951 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index 38f184fd56e6a..a525f99873c26 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 06f895a796e0a..9778685de55fd 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index 6139095d66f74..d04725b0e55f4 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 6e0bd7671e660..8d775fb5eb577 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index c6be1004c1740..5335fcad0de65 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index b0be64184db3f..df4c9a154bd5f 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management_shared_types.mdx b/api_docs/kbn_index_management_shared_types.mdx index 96b66f7b069eb..e619e036fb1f0 100644 --- a/api_docs/kbn_index_management_shared_types.mdx +++ b/api_docs/kbn_index_management_shared_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management-shared-types title: "@kbn/index-management-shared-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management-shared-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management-shared-types'] --- import kbnIndexManagementSharedTypesObj from './kbn_index_management_shared_types.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 7297345237eb1..b669b0166c326 100644 --- a/api_docs/kbn_inference_integration_flyout.mdx +++ b/api_docs/kbn_inference_integration_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout title: "@kbn/inference_integration_flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference_integration_flyout plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 0729b097113f2..58c525bda283b 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 5510ef3ea6b2f..9c80d96185174 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_investigation_shared.mdx b/api_docs/kbn_investigation_shared.mdx index ac83c5282611b..9bdf9f66056c3 100644 --- a/api_docs/kbn_investigation_shared.mdx +++ b/api_docs/kbn_investigation_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-investigation-shared title: "@kbn/investigation-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/investigation-shared plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/investigation-shared'] --- import kbnInvestigationSharedObj from './kbn_investigation_shared.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 3a4841f1b89bb..a2e70b41ef33e 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index 6bcf8efa91024..45decbae3a3eb 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb title: "@kbn/ipynb" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ipynb plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_item_buffer.mdx b/api_docs/kbn_item_buffer.mdx index c58f2bc382d34..135772fbde867 100644 --- a/api_docs/kbn_item_buffer.mdx +++ b/api_docs/kbn_item_buffer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-item-buffer title: "@kbn/item-buffer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/item-buffer plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/item-buffer'] --- import kbnItemBufferObj from './kbn_item_buffer.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 21b1c89eef8df..1fc41a0554135 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index 648e0c6129c14..329485f4cc88a 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 8dfbe88d21808..7444cf0fc55f2 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_json_schemas.mdx b/api_docs/kbn_json_schemas.mdx index eb94a737c8c60..faeff6e944a52 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-schemas'] --- import kbnJsonSchemasObj from './kbn_json_schemas.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index b4046be8a9342..d148a56200697 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation.mdx b/api_docs/kbn_language_documentation.mdx index 967010b714839..4968cc51a8c85 100644 --- a/api_docs/kbn_language_documentation.mdx +++ b/api_docs/kbn_language_documentation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation title: "@kbn/language-documentation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation'] --- import kbnLanguageDocumentationObj from './kbn_language_documentation.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index f0fefe25521ac..76cb1d414fa89 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 68dbfb7c07e71..2f173726d5b2f 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 53e7b9000ce7e..2d68262b5da12 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index e0e377d73e538..ccc4f099b20d9 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index 375e307bbdc8f..49b2445a25ee8 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index e2838fb14cabb..18517f837f82b 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index f495b862a1605..288e9f381d500 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index 1309f737b51e6..bcbf9008e3883 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index de2bfbafedce4..2e9131afcd2c7 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 5bade5e28f2c5..06cc931a07834 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 86ca4c62dca6b..0bce8891a2ac4 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index c72d6b06fc82f..0f79c6ca2d16b 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index badf8774e0b76..f2c4aacfe915f 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 7dca968c44ec4..51d70700b9fd9 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 6e646088d9b0e..a967ceea13f33 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 48227d1938f97..1493515592525 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index 7cd7fd7cb6478..8abcad04d83e2 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 2ad8f016ee1c5..de95c998c86fd 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 749fc3680dc3f..c04953a7435ac 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index e3c002ea157ab..a5b258019f37b 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 3cf0ca7cd3b38..992b3a0c083af 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index c02b8555ec6a7..92983870454d6 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index 2eef181870bec..e8dc739abdce1 100644 --- a/api_docs/kbn_ml_cancellable_search.mdx +++ b/api_docs/kbn_ml_cancellable_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search title: "@kbn/ml-cancellable-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-cancellable-search plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 747bb233d4641..abea7b929ee00 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index 618ef5468ce4b..eafaf68a02cf5 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 5a49f1bf076a2..0eebb6ba983bc 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index ec5ad5f255e04..55ad195a65c45 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 6c14f40d237d2..8342e2b3557e7 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 36c164d8de13a..34fd72c37c824 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index aef737dfd581e..cf4d88ab1fb5d 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_field_stats_flyout.mdx b/api_docs/kbn_ml_field_stats_flyout.mdx index 6635f38a93009..e9ea48091905c 100644 --- a/api_docs/kbn_ml_field_stats_flyout.mdx +++ b/api_docs/kbn_ml_field_stats_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-field-stats-flyout title: "@kbn/ml-field-stats-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-field-stats-flyout plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-field-stats-flyout'] --- import kbnMlFieldStatsFlyoutObj from './kbn_ml_field_stats_flyout.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index b3501746b635f..8d8fdffa219a1 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 8c4e275083e52..cf6644abdc034 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 571bae27b1c7b..1b6bea67b5c31 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index 39057e72da0f2..a69a78b7a180d 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 454a58a740a82..b0349a49914ce 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index eb7dcfa9a5408..9704c768dcc08 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index c2aee5e73fadc..5e7a0bf70316d 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_parse_interval.mdx b/api_docs/kbn_ml_parse_interval.mdx index 3e5bc877d51f6..09c38d05ad53d 100644 --- a/api_docs/kbn_ml_parse_interval.mdx +++ b/api_docs/kbn_ml_parse_interval.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-parse-interval title: "@kbn/ml-parse-interval" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-parse-interval plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-parse-interval'] --- import kbnMlParseIntervalObj from './kbn_ml_parse_interval.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 47cc714180d62..15e985b28d7a5 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index cc18f219cddf5..cee21727718f7 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 826541a7a5448..3e36659760b58 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index 5c819ec9fdbbc..5461bd78fc7ac 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index c12b41099c7ed..bf585d5dd1912 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index e26ef89589986..117d37264b844 100644 --- a/api_docs/kbn_ml_time_buckets.mdx +++ b/api_docs/kbn_ml_time_buckets.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets title: "@kbn/ml-time-buckets" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-time-buckets plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 1379a87a63258..48682095883d0 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 7749d2f9da996..9e9d596acaf7c 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 8bad2f16c220c..7d1ec73eb8629 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_ml_validators.mdx b/api_docs/kbn_ml_validators.mdx index bdd3f7b3f44ed..2483a8d2d3ee5 100644 --- a/api_docs/kbn_ml_validators.mdx +++ b/api_docs/kbn_ml_validators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-validators title: "@kbn/ml-validators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-validators plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-validators'] --- import kbnMlValidatorsObj from './kbn_ml_validators.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 88974c086ef41..6b2f53570bf6c 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index c5ca0d961296c..07c12af29972d 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index c6898a26d7f28..1c491a5d31ab1 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_object_versioning_utils.mdx b/api_docs/kbn_object_versioning_utils.mdx index 1b6efb1fcdee3..ff89a07625a7b 100644 --- a/api_docs/kbn_object_versioning_utils.mdx +++ b/api_docs/kbn_object_versioning_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning-utils title: "@kbn/object-versioning-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning-utils'] --- import kbnObjectVersioningUtilsObj from './kbn_object_versioning_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index e49295e144724..09005e1014f7c 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_rule_utils.mdx b/api_docs/kbn_observability_alerting_rule_utils.mdx index a7d04ffe65fd2..6cbf6e568676b 100644 --- a/api_docs/kbn_observability_alerting_rule_utils.mdx +++ b/api_docs/kbn_observability_alerting_rule_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-rule-utils title: "@kbn/observability-alerting-rule-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-rule-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-rule-utils'] --- import kbnObservabilityAlertingRuleUtilsObj from './kbn_observability_alerting_rule_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 38903748acb60..0c06069408741 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index cc40f03ccdc45..21610ab232867 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_observability_logs_overview.mdx b/api_docs/kbn_observability_logs_overview.mdx index 85ccc1f667152..18a2d64769a82 100644 --- a/api_docs/kbn_observability_logs_overview.mdx +++ b/api_docs/kbn_observability_logs_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-logs-overview title: "@kbn/observability-logs-overview" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-logs-overview plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-logs-overview'] --- import kbnObservabilityLogsOverviewObj from './kbn_observability_logs_overview.devdocs.json'; diff --git a/api_docs/kbn_observability_synthetics_test_data.mdx b/api_docs/kbn_observability_synthetics_test_data.mdx index 8b4c059e9e6b3..f7d0ae2e26748 100644 --- a/api_docs/kbn_observability_synthetics_test_data.mdx +++ b/api_docs/kbn_observability_synthetics_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-synthetics-test-data title: "@kbn/observability-synthetics-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-synthetics-test-data plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-synthetics-test-data'] --- import kbnObservabilitySyntheticsTestDataObj from './kbn_observability_synthetics_test_data.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index c6f4a0127f763..d988f50fd43c6 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index 79274873f8d5b..bca0a657ee65e 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 670193059d090..971544cfea089 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index ff840eb02e8bc..816fb94c3fc64 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index e26e8a177c2ca..e09125c4c34ec 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 0530bdf3f6c73..6f90cf1953843 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index d53088aa749a9..7e2d17c3f97c0 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx index 7d7d0f76e892e..852000262e28e 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 8bb78397b100d..7df8c47b7ed3f 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index 7123e4649af9a..eac4ad9e54d70 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index f68478f3b52e0..236c9b5d26a73 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index 694fc752c228d..da055d89ddbc4 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_product_doc_artifact_builder.mdx b/api_docs/kbn_product_doc_artifact_builder.mdx index b5dee21d5828e..1b25de9e3e507 100644 --- a/api_docs/kbn_product_doc_artifact_builder.mdx +++ b/api_docs/kbn_product_doc_artifact_builder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-product-doc-artifact-builder title: "@kbn/product-doc-artifact-builder" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/product-doc-artifact-builder plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/product-doc-artifact-builder'] --- import kbnProductDocArtifactBuilderObj from './kbn_product_doc_artifact_builder.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 1bea9be5f27c7..7abb4dc7cd6cf 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index db8b3678d75b0..3ea9834b3d7da 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index c9b603726cff3..dc2696d6a5321 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index 2d604e72fb47d..6cec99462dd1a 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 6d8993bbb06d8..ede5a137b5c51 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index 8fcaca1af0867..33291be69d423 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 440a67765fe50..279b96d218736 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 90aa3f13f803e..c94ac2938a9b9 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index 31ba1f6c218e8..1bb1a0ee36b28 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index 1ef171aa3cdae..c1a35f3a6228a 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx index da2197581e2ae..a0c1b5e74776c 100644 --- a/api_docs/kbn_recently_accessed.mdx +++ b/api_docs/kbn_recently_accessed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-recently-accessed title: "@kbn/recently-accessed" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/recently-accessed plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] --- import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 7c561b381a1a4..248fa203007b3 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index 195c48c38d95e..cb519b1e2f8d2 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index b59eaa3a38a43..0dcddda8cf31c 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index e57ef3a4aa995..00ca1c52bc0f2 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index 5e8bb0474c3a3..1ae4233d88382 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index 388b0a94a71a3..d21b90368cbdc 100644 --- a/api_docs/kbn_reporting_csv_share_panel.mdx +++ b/api_docs/kbn_reporting_csv_share_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel title: "@kbn/reporting-csv-share-panel" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-csv-share-panel plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 567d5cb44af8c..b919dd0947d42 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index f375c16a9d66e..c4419a291e0bd 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index c6e6be952f09a..33031ccc8fa88 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index 068cc43284918..4185d0009078b 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index 820acf06366e6..7c4112db6980d 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index e2b9de7ccb749..350e6c9ebe98d 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 88125ec278bc0..2a5d299dac670 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index 5a84407c64322..a01f17bef4a94 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index dc9d597cba0a9..fb4239439dc41 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index f8522cb23f93b..d47a74ecebf7b 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_response_ops_feature_flag_service.mdx b/api_docs/kbn_response_ops_feature_flag_service.mdx index a6d3b0e18bfda..7f54270110255 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 466151c9b37af..6614b305b55a9 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index 43cb6d7864a4b..b76f4b5724970 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rollup'] --- import kbnRollupObj from './kbn_rollup.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index cadd87fdcaaf8..4deeda9306ef8 100644 --- a/api_docs/kbn_router_to_openapispec.mdx +++ b/api_docs/kbn_router_to_openapispec.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec title: "@kbn/router-to-openapispec" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-to-openapispec plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index fd07e83107dec..082a3b3e90b1d 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 79a6bffd7bcbc..9438e4e78c1ef 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 9c36c38d7e6b6..17ed3bfe8c968 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 3a2e2eeb0b85f..864a63c3966e1 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_screenshotting_server.mdx b/api_docs/kbn_screenshotting_server.mdx index d9806667eb530..188122da3dd0f 100644 --- a/api_docs/kbn_screenshotting_server.mdx +++ b/api_docs/kbn_screenshotting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-screenshotting-server title: "@kbn/screenshotting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/screenshotting-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/screenshotting-server'] --- import kbnScreenshottingServerObj from './kbn_screenshotting_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_components.mdx b/api_docs/kbn_search_api_keys_components.mdx index 22b1edf669606..ac74dc87774fb 100644 --- a/api_docs/kbn_search_api_keys_components.mdx +++ b/api_docs/kbn_search_api_keys_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-components title: "@kbn/search-api-keys-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-components plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-components'] --- import kbnSearchApiKeysComponentsObj from './kbn_search_api_keys_components.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_server.mdx b/api_docs/kbn_search_api_keys_server.mdx index e9e0f52b17e12..8c468a0184bfc 100644 --- a/api_docs/kbn_search_api_keys_server.mdx +++ b/api_docs/kbn_search_api_keys_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-server title: "@kbn/search-api-keys-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-server'] --- import kbnSearchApiKeysServerObj from './kbn_search_api_keys_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 2005fcfa07e5f..a07ea609236b9 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index ca16d027fa2fe..fa9ea8e99b4ef 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 0c4bbd3d35c09..600e8aafb2795 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index 801433638d7f0..6d9c97f7365d8 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 6d3eaed18dc6f..bfe1816a9ffe2 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_shared_ui.mdx b/api_docs/kbn_search_shared_ui.mdx index a9d28500d3151..c94dc0c525e0d 100644 --- a/api_docs/kbn_search_shared_ui.mdx +++ b/api_docs/kbn_search_shared_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-shared-ui title: "@kbn/search-shared-ui" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-shared-ui plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-shared-ui'] --- import kbnSearchSharedUiObj from './kbn_search_shared_ui.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index fb5052f252819..df378c53d7dc3 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx index c68ff7a63c568..f58b166637af6 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-api-key-management title: "@kbn/security-api-key-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-api-key-management plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] --- import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core.mdx b/api_docs/kbn_security_authorization_core.mdx index 202ce64e188ce..dc114cdcb9880 100644 --- a/api_docs/kbn_security_authorization_core.mdx +++ b/api_docs/kbn_security_authorization_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core title: "@kbn/security-authorization-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core'] --- import kbnSecurityAuthorizationCoreObj from './kbn_security_authorization_core.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core_common.mdx b/api_docs/kbn_security_authorization_core_common.mdx index e16536e126428..05bed52c0f360 100644 --- a/api_docs/kbn_security_authorization_core_common.mdx +++ b/api_docs/kbn_security_authorization_core_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core-common title: "@kbn/security-authorization-core-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core-common'] --- import kbnSecurityAuthorizationCoreCommonObj from './kbn_security_authorization_core_common.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index 0ee3efcc5a2ab..2d15a288366dd 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-form-components title: "@kbn/security-form-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-form-components plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] --- import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 096152937178c..fafaa7a6151f8 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index fd52206874c7b..5bf405f636499 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 06587d3b459a1..9178ef625d301 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 88b0fc9ee1889..4b6f8a26edad7 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_role_management_model.mdx b/api_docs/kbn_security_role_management_model.mdx index 56b66222b2ba4..1598eb157f77e 100644 --- a/api_docs/kbn_security_role_management_model.mdx +++ b/api_docs/kbn_security_role_management_model.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-role-management-model title: "@kbn/security-role-management-model" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-role-management-model plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-role-management-model'] --- import kbnSecurityRoleManagementModelObj from './kbn_security_role_management_model.devdocs.json'; diff --git a/api_docs/kbn_security_solution_common.mdx b/api_docs/kbn_security_solution_common.mdx index 079c0ee26f771..27bf28d16850e 100644 --- a/api_docs/kbn_security_solution_common.mdx +++ b/api_docs/kbn_security_solution_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-common title: "@kbn/security-solution-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-common plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-common'] --- import kbnSecuritySolutionCommonObj from './kbn_security_solution_common.devdocs.json'; diff --git a/api_docs/kbn_security_solution_distribution_bar.mdx b/api_docs/kbn_security_solution_distribution_bar.mdx index 176d78476fa8d..3e8de225d9c68 100644 --- a/api_docs/kbn_security_solution_distribution_bar.mdx +++ b/api_docs/kbn_security_solution_distribution_bar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-distribution-bar title: "@kbn/security-solution-distribution-bar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-distribution-bar plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-distribution-bar'] --- import kbnSecuritySolutionDistributionBarObj from './kbn_security_solution_distribution_bar.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 0642c000d5de8..49527e05721c6 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index bb2c8dec16422..1b86f2b851b7c 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 69da89dd8f9fb..03934b286203d 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index 6c2ac7352955b..af9d2c4227e08 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_security_ui_components.mdx b/api_docs/kbn_security_ui_components.mdx index 41a8b22be8bc8..0f652723561c7 100644 --- a/api_docs/kbn_security_ui_components.mdx +++ b/api_docs/kbn_security_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-ui-components title: "@kbn/security-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-ui-components plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-ui-components'] --- import kbnSecurityUiComponentsObj from './kbn_security_ui_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 37c60d72d9601..a2c1aa8fd811e 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 1d70e4f561a52..2969e11c04f15 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index 0ef87199a8713..c84e603a2d4e8 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 7d89a5b78223b..e29c43229c7a6 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 5fb11d7ed56b4..629424fb18b75 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 7eb29394e25ea..a75e60ba3fa85 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index 969c933576e3d..6660f08563591 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index f31570fcabcd1..ab375f06389e8 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index 4bd911ca1d06d..c67ce3ce810aa 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 79c521a9a1d83..06b60edb298f0 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index d3a48004bb32e..ed4c421b96bb8 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 149a19435574f..1f76ee7f0b03a 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 373e6f05172b4..a32253b5b6996 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index cb23788e8e475..4dd287a92f4ff 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 6764a0ab1c241..dd7fdc995b6f9 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 6cc1522c3d5ee..6d406abda987a 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index d8a4331f69020..c7e659c1ef337 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 8967529d7a4c7..8c173bbc0f921 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 39063e0a73894..310b07c2f5662 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_client.mdx b/api_docs/kbn_server_route_repository_client.mdx index 3a7fddb14d695..37ee023c84a1c 100644 --- a/api_docs/kbn_server_route_repository_client.mdx +++ b/api_docs/kbn_server_route_repository_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-client title: "@kbn/server-route-repository-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-client plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-client'] --- import kbnServerRouteRepositoryClientObj from './kbn_server_route_repository_client.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_utils.mdx b/api_docs/kbn_server_route_repository_utils.mdx index bc93c8435ff96..75f10c1ac000e 100644 --- a/api_docs/kbn_server_route_repository_utils.mdx +++ b/api_docs/kbn_server_route_repository_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-utils title: "@kbn/server-route-repository-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-utils'] --- import kbnServerRouteRepositoryUtilsObj from './kbn_server_route_repository_utils.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 42e617a9a162b..4264fe3b41a36 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index f0df80fa43865..77b6ac3dddd42 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 0226d50414781..b10db9b61c91f 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index b15a59e5bbcb8..8c06941b27e97 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index c0f0d1596fde2..b38a2f7d589b9 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index d7b4c34e4d626..6610e36a3cb88 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index ae5619327957f..856bd2ec92939 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index 891fd164ef1b4..b804966794803 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 3bf372b0e8866..0b8ddd044c5f0 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 2bb28c62fc994..bcac3baa8ee0d 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 465e386f38b66..e668bd2fb5d63 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index 7faa4ddeeeced..ed1ea09c8f8a8 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 52e293ca6a37f..d0c9a4ac32cc0 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index 5554e0a3abbb4..c85cf8bdd9c9f 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 804e67ed804e6..d69102a26d153 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 7b8c0acdf47bc..fa572554a4364 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index b639f7282ca2f..7e75bd0265db2 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index b7a756be76f3b..af929a71368d8 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 61a6f64d470f2..b7e97d39038a2 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index e9b4ddcac27e7..8c5406e4e8252 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index a6ec1fc9c05d4..5fceb058fec19 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index 35f14f63ff88c..81403cae8909b 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index ddf57192d3294..37fe11c6d56d4 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 21b7e2474a0a1..80bd122459640 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 295084ba7c371..e794758716f82 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index d8b44f41bb407..44575cf2c4665 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 6d3fbabd9456b..9f26d46ef203e 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index 92ff26f23f95c..d859d19167801 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 472c70a3149eb..bc4bfac7b610b 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index 04da3794575fb..3e33f69f0184b 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index 57e118cf4e90e..cb951509ec57c 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index 146ef0588c05d..c80b4c984ecae 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index f9b19d5b37804..0b2d6c921ee63 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 5ee26e3ad4d2f..8d38a0dbc7ad9 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 07c5cf235883f..0080ad6aee0f3 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index c8740f7521898..1517ab415f6ac 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 95489e48b05b1..d6d68305187c0 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index a66475b3ccb67..6a8dbc7d21368 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 096967bef611a..3c7d6cd8fc844 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 42ec2a5753d12..685b9584e11e4 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index af860f9661866..fbb5a5269b008 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index d9cf7a3765bd5..e82b40b6d8097 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index 8de1bda3ac22e..89329f36da0e5 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index 5758c50422f1e..5d6eee710bdf3 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index a724852b1e966..13e9b4d965368 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.mdx +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal title: "@kbn/shared-ux-tabbed-modal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-tabbed-modal plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_table_persist.mdx b/api_docs/kbn_shared_ux_table_persist.mdx index 040195f4d5b06..72732b67f8cb2 100644 --- a/api_docs/kbn_shared_ux_table_persist.mdx +++ b/api_docs/kbn_shared_ux_table_persist.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-table-persist title: "@kbn/shared-ux-table-persist" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-table-persist plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-table-persist'] --- import kbnSharedUxTablePersistObj from './kbn_shared_ux_table_persist.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 3f0964af3ac0f..89a390d4c1afb 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 9a9af1348f9bc..d84b117f3573a 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 6f9b445dfac41..6b09ea82ce21e 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index 77d3f4c1e7415..3fdf88a37ba3d 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_sse_utils.mdx b/api_docs/kbn_sse_utils.mdx index ec00c4c3cde2e..1e8c5262aef8f 100644 --- a/api_docs/kbn_sse_utils.mdx +++ b/api_docs/kbn_sse_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils title: "@kbn/sse-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils'] --- import kbnSseUtilsObj from './kbn_sse_utils.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_client.mdx b/api_docs/kbn_sse_utils_client.mdx index 08ee632b8860f..6d39d1e27d909 100644 --- a/api_docs/kbn_sse_utils_client.mdx +++ b/api_docs/kbn_sse_utils_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-client title: "@kbn/sse-utils-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-client plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-client'] --- import kbnSseUtilsClientObj from './kbn_sse_utils_client.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_server.mdx b/api_docs/kbn_sse_utils_server.mdx index 62c0308da36ff..543affac55eb3 100644 --- a/api_docs/kbn_sse_utils_server.mdx +++ b/api_docs/kbn_sse_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-server title: "@kbn/sse-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-server plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-server'] --- import kbnSseUtilsServerObj from './kbn_sse_utils_server.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 9e462ca2ce9d1..cad88942bedee 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index bf0be9c4c3e75..bd1002c67119d 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index e3a1e9e435b65..796d9e8510855 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_synthetics_e2e.mdx b/api_docs/kbn_synthetics_e2e.mdx index 7401ae622c19b..a7d39de24af35 100644 --- a/api_docs/kbn_synthetics_e2e.mdx +++ b/api_docs/kbn_synthetics_e2e.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-e2e title: "@kbn/synthetics-e2e" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-e2e plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-e2e'] --- import kbnSyntheticsE2eObj from './kbn_synthetics_e2e.devdocs.json'; diff --git a/api_docs/kbn_synthetics_private_location.mdx b/api_docs/kbn_synthetics_private_location.mdx index aa9004a309717..cdf37117f0260 100644 --- a/api_docs/kbn_synthetics_private_location.mdx +++ b/api_docs/kbn_synthetics_private_location.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-private-location title: "@kbn/synthetics-private-location" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-private-location plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-private-location'] --- import kbnSyntheticsPrivateLocationObj from './kbn_synthetics_private_location.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 53cd2b4247ef3..71b29d4060865 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 679b82a427a2c..8e34cdcd7c89b 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index 36e464722e393..224e0c169922c 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index fcb29e10a7359..29febf0df47c6 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index fecd44e5f7f18..f4207d572b733 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index 79099c9d0a949..bb13f4337466a 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index cd89ef3b56124..30f382910df35 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 2fa900f795f46..fb2a44e49b250 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index c298693bda248..51c01d775d293 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 8b363c6a96656..9c581c5a53139 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index af04d49c66481..da88acab22f3d 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 288360145cd5d..01d6c1a420181 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index df6ebe1236357..6bdd65c457910 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 01b5cd64d993b..c81bbd52a1b15 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 3261444074f5d..f9eb81699615d 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 4af11eee1c37b..f5433e9781be4 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index b83bf7c3f8cd8..e4290b6b040e0 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index e8f7849c2e142..ea3c8c2866f61 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index b887e0abc01f2..fba9890199563 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] --- import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index d61d6b4e50b4e..e43b0238842c6 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 310ade56df362..a936b065fa89e 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index cbac4b5125b78..e89e1c68efd3b 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index fe16d03753fd2..3f529820ecb03 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index eab246b8d748b..b916813b37f2e 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 2bcf66ab2fc8e..7925519564c7c 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index d1a1ae70d904c..333980dd09ce1 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 51bebebd5627c..a2246d3caae5b 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 1c75571d46dfa..979cb4a70bf9d 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod.mdx b/api_docs/kbn_zod.mdx index b18b8dd13b7f3..70c76cb5e2a24 100644 --- a/api_docs/kbn_zod.mdx +++ b/api_docs/kbn_zod.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod title: "@kbn/zod" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod'] --- import kbnZodObj from './kbn_zod.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 8b7c66dd17a0b..2e7c6759d1bba 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index dc35cb9543739..d8ee39257300d 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 79d5097b3a2a7..68dc3db270a99 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 4f9bb1f210abb..a6185f402e9d7 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 30f0ff53a4d35..9d6decce120c3 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index fec200edeeb11..2c42b648debb8 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -11201,7 +11201,7 @@ "label": "FittingFunction", "description": [], "signature": [ - "\"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\"" + "\"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 4ddb3a041b87d..c162ec5866ad0 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index bb1d5d1ee03ab..97562a0e6e272 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 9dfb7736feae5..65174058b7b38 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index ee109ad476f36..cbef10848f0fb 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index ee0b7c8313846..8f74b43bbcb5d 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index dc16dafe4330d..d1bd5fedbfe1b 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index 8bc38ebbb6857..0020f949df0b7 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index 89db7d7c478dc..2afde38ca0d0d 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index add1dc04b6642..7714991e37aaf 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index bf4cceb754d8a..8eb08b1d62103 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 578c75f938524..8256542d3d7e0 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index bc666eb8fda62..9c0c54181a4ce 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.devdocs.json b/api_docs/metrics_data_access.devdocs.json index ce7592c78d5f5..1709070d01746 100644 --- a/api_docs/metrics_data_access.devdocs.json +++ b/api_docs/metrics_data_access.devdocs.json @@ -1149,7 +1149,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly loadBreakdown: { title: string; dataset?: ", "LensDataset", @@ -1167,7 +1167,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly cpuUsage: { title: string; dataset?: ", "LensDataset", @@ -1185,7 +1185,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly normalizedLoad1m: { title: string; dataset?: ", "LensDataset", @@ -1203,7 +1203,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; readonly metric: { readonly cpuUsage: { title: string; dataset?: ", "LensDataset", @@ -1229,7 +1229,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskUsageByMountPoint: { title: string; dataset?: ", "LensDataset", @@ -1247,7 +1247,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskIOReadWrite: { title: string; dataset?: ", "LensDataset", @@ -1265,7 +1265,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskSpaceAvailable: { title: string; dataset?: ", "LensDataset", @@ -1283,7 +1283,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskIORead: { title: string; dataset?: ", "LensDataset", @@ -1301,7 +1301,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskIOWrite: { title: string; dataset?: ", "LensDataset", @@ -1319,7 +1319,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskReadThroughput: { title: string; dataset?: ", "LensDataset", @@ -1337,7 +1337,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskWriteThroughput: { title: string; dataset?: ", "LensDataset", @@ -1355,7 +1355,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; readonly metric: { readonly diskUsage: { title: string; dataset?: ", "LensDataset", @@ -1377,7 +1377,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; memoryUsage: { title: string; dataset?: ", "LensDataset", @@ -1395,7 +1395,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; memoryFree: { title: string; dataset?: ", "LensDataset", @@ -1413,7 +1413,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; metric: { memoryUsage: { title: string; dataset?: ", "LensDataset", @@ -1435,7 +1435,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly rx: { title: string; dataset?: ", "LensDataset", @@ -1453,7 +1453,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly tx: { title: string; dataset?: ", "LensDataset", @@ -1471,7 +1471,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; }; readonly logs: { xy: { logRate: { title: string; dataset?: ", "LensDataset", @@ -1489,7 +1489,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; }; readonly kibernetesNode: { readonly xy: { readonly nodeCpuCapacity: { title: string; dataset?: ", "LensDataset", @@ -1507,7 +1507,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly nodeMemoryCapacity: { title: string; dataset?: ", "LensDataset", @@ -1525,7 +1525,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly nodeDiskCapacity: { title: string; dataset?: ", "LensDataset", @@ -1543,7 +1543,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly nodePodCapacity: { title: string; dataset?: ", "LensDataset", @@ -1561,7 +1561,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; }; }>> | ", "InventoryModel", @@ -1603,7 +1603,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly k8sContainerCpuUsage: { title: string; dataset?: ", "LensDataset", @@ -1621,7 +1621,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; readonly metric: { readonly dockerContainerCpuUsage: { title: string; dataset?: ", "LensDataset", @@ -1647,7 +1647,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; k8sContainerMemoryUsage: { title: string; dataset?: ", "LensDataset", @@ -1665,7 +1665,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; metric: { dockerContainerMemoryUsage: { title: string; dataset?: ", "LensDataset", @@ -1691,7 +1691,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; }; readonly diskIO: { xy: { dockerContainerDiskIOReadWrite: { title: string; dataset?: ", "LensDataset", @@ -1709,7 +1709,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; }; }>>)[]" ], @@ -1804,7 +1804,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly loadBreakdown: { title: string; dataset?: ", "LensDataset", @@ -1822,7 +1822,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly cpuUsage: { title: string; dataset?: ", "LensDataset", @@ -1840,7 +1840,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly normalizedLoad1m: { title: string; dataset?: ", "LensDataset", @@ -1858,7 +1858,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; readonly metric: { readonly cpuUsage: { title: string; dataset?: ", "LensDataset", @@ -1884,7 +1884,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskUsageByMountPoint: { title: string; dataset?: ", "LensDataset", @@ -1902,7 +1902,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskIOReadWrite: { title: string; dataset?: ", "LensDataset", @@ -1920,7 +1920,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskSpaceAvailable: { title: string; dataset?: ", "LensDataset", @@ -1938,7 +1938,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskIORead: { title: string; dataset?: ", "LensDataset", @@ -1956,7 +1956,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskIOWrite: { title: string; dataset?: ", "LensDataset", @@ -1974,7 +1974,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskReadThroughput: { title: string; dataset?: ", "LensDataset", @@ -1992,7 +1992,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly diskWriteThroughput: { title: string; dataset?: ", "LensDataset", @@ -2010,7 +2010,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; readonly metric: { readonly diskUsage: { title: string; dataset?: ", "LensDataset", @@ -2032,7 +2032,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; memoryUsage: { title: string; dataset?: ", "LensDataset", @@ -2050,7 +2050,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; memoryFree: { title: string; dataset?: ", "LensDataset", @@ -2068,7 +2068,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; metric: { memoryUsage: { title: string; dataset?: ", "LensDataset", @@ -2090,7 +2090,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly rx: { title: string; dataset?: ", "LensDataset", @@ -2108,7 +2108,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly tx: { title: string; dataset?: ", "LensDataset", @@ -2126,7 +2126,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; }; readonly logs: { xy: { logRate: { title: string; dataset?: ", "LensDataset", @@ -2144,7 +2144,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; }; readonly kibernetesNode: { readonly xy: { readonly nodeCpuCapacity: { title: string; dataset?: ", "LensDataset", @@ -2162,7 +2162,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly nodeMemoryCapacity: { title: string; dataset?: ", "LensDataset", @@ -2180,7 +2180,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly nodeDiskCapacity: { title: string; dataset?: ", "LensDataset", @@ -2198,7 +2198,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly nodePodCapacity: { title: string; dataset?: ", "LensDataset", @@ -2216,7 +2216,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; }; }>>; readonly pod: ", "InventoryModel", @@ -2258,7 +2258,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; readonly k8sContainerCpuUsage: { title: string; dataset?: ", "LensDataset", @@ -2276,7 +2276,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; readonly metric: { readonly dockerContainerCpuUsage: { title: string; dataset?: ", "LensDataset", @@ -2302,7 +2302,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; k8sContainerMemoryUsage: { title: string; dataset?: ", "LensDataset", @@ -2320,7 +2320,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; metric: { dockerContainerMemoryUsage: { title: string; dataset?: ", "LensDataset", @@ -2346,7 +2346,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; }; readonly diskIO: { xy: { dockerContainerDiskIOReadWrite: { title: string; dataset?: ", "LensDataset", @@ -2364,7 +2364,7 @@ "LensBaseLayer", "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", "LensReferenceLineLayer", - ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"top\" | \"bottom\" | \"left\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined; yBounds?: ", "LensYBoundsConfig", " | undefined; } & { id: string; }; }; }; }>>; readonly awsEC2: ", "InventoryModel", diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index c8ce7832a3c50..adc6dce0402c9 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index f31946b0a401c..cd92f7017293a 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index 2afefcaa4fc9e..5edd58a1bf047 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 28fa6b79600e5..8165a72f02fe1 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index c2286aa7ae4fb..9e204245b7458 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 3a7124e948a7f..f35924b446e07 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 3f4d365f6eeaa..f40600ca5085d 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 6e9eed135f621..bd54f40c6451f 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index b77fdf0dec430..dd7e3d43cfce3 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 9cbb8c3d93fbb..b443903f3eca9 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 3bb574d077482..588ba1c9dadc5 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 4bae412c939ee..d1d0d6d19d590 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index 768f4a6b23d72..a12c88298e3bf 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index 487a1e6300d7c..4c567799ca7c7 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 97ed1d8ff6e90..c0fca97af1367 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index ed008ed040f54..1bff987d33fc1 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 48bdf0c43482f..20fb34470067e 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index b5cadc87aa241..282c43217d219 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 7dc1befef568f..5ba71242b62bd 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 53923 | 242 | 40510 | 2004 | +| 53926 | 242 | 40512 | 2004 | ## Plugin Directory @@ -95,7 +95,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'revealImage' function and renderer to expressions | 14 | 0 | 14 | 3 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'shape' function and renderer to expressions | 148 | 0 | 146 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Tagcloud plugin adds a `tagcloud` renderer and function to the expression plugin. The renderer will display the `Wordcloud` chart. | 6 | 0 | 6 | 2 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression XY plugin adds a `xy` renderer and function to the expression plugin. The renderer will display the `xy` chart. | 180 | 0 | 169 | 13 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression XY plugin adds a `xy` renderer and function to the expression plugin. The renderer will display the `xy` chart. | 182 | 0 | 171 | 13 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds expression runtime to Kibana | 2235 | 17 | 1765 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 270 | 0 | 110 | 2 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Index pattern fields and ambiguous values formatters | 292 | 5 | 253 | 3 | @@ -372,7 +372,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 54 | 7 | 54 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 15 | 0 | 15 | 1 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 532 | 2 | 216 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 533 | 2 | 216 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 96 | 0 | 83 | 10 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 46 | 0 | 45 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 2 | 0 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index a175781f0c786..6188b3e244ac9 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 69bd4187944ed..ba1d578bee570 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 39edea30f7a26..b870ee4e9db04 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index 5469632aa0991..e5f6b6cd5e847 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 3ca0637fcbf2a..2436457724a6e 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index e12787a5b19c1..9465b38e3fbd2 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 813860e055413..82e31c7ce74fc 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 1213e3d751169..62f09cc3d9c77 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 3586eb38cd421..820c215bcb4ea 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 806d7c971c9e0..63c4273fb837e 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 8fbb5ef61cb4a..73091b76c31f8 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index fd4dabed55698..b459f34794a70 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 44fca63ea762c..2531dde77c2a2 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index a83c41b5e603f..eb5c6b8d9ce1c 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index f5e3c09b7a7eb..5cb0939bda311 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index fbbf9b20f24aa..94bbb78878302 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index f0feb822c23b1..8dde46afdd098 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_assistant.mdx b/api_docs/search_assistant.mdx index 97b6ec3f4dddc..db4b8c6bdc5e2 100644 --- a/api_docs/search_assistant.mdx +++ b/api_docs/search_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchAssistant title: "searchAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the searchAssistant plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchAssistant'] --- import searchAssistantObj from './search_assistant.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 7f81dd72dfc22..ee10979316ec0 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index 647d084252580..521a8787dfb23 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_indices.mdx b/api_docs/search_indices.mdx index 48fcf865b8ad6..048ef641738f4 100644 --- a/api_docs/search_indices.mdx +++ b/api_docs/search_indices.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchIndices title: "searchIndices" image: https://source.unsplash.com/400x175/?github description: API docs for the searchIndices plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchIndices'] --- import searchIndicesObj from './search_indices.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index dcaeadb92f8bd..1acfd9569473e 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 7b6e54cf39420..847d0b86878d0 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index 331a7d9c8a09e..ec54edd81de7e 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 052061dacd1b6..78109bb35320e 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index e1e4a2a328d35..6ef5b6e401017 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index fd8f1b46b279f..00cceb7e4502b 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index f1987f89b933e..75351b08d9669 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index da3f08ae55ec2..81c5b3522da87 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 1ff33264adc20..e4428073f460d 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index a346767cacb8e..d6d38498dcdf2 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index d05b6883b9436..21a85dc1bdc77 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 7492c9b17d57c..613f6e915c9b9 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index 107d993a42dd0..3aa27b1c14171 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 532beb9389ea7..bf30f5171e288 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 33e8ef651d041..be7bd2a17dd65 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 28a43a49f6522..12734e8fc52d6 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index c1d47c34ccc36..c76654fd5049b 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 7aeb37aaecde5..49ba693218e37 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 10a0baa04d17e..51343aef7e857 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 9aeb923ada087..6d9a2ae35af94 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index f2ce58678d7ea..cedee388bb046 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 6bed696faf539..4d0733b871af8 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index ce5a8486771f9..ffe088d4aedc4 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 0e83b58963fba..e5d0d55890db8 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 4ce6df40f685d..7dfa9cb9d4efe 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 3d6b339960050..c1849c4d585f0 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index e1d26a68313b7..2f77630396124 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 634fe17375fca..de13e87996fad 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index e0633220b4077..3fa77ed4a2bf0 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index a0ea871fb6d6d..36286be79ac35 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 78ed8904a6cc9..1931e1a60e0e3 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index abf573cd0bdc7..64061d2147f9c 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index 29220dc4ec390..ec33e9e770dbb 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 8c99ac9288d83..4d271192dfef3 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index eb3ea00720176..171594804fee5 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index e1443d3e30c60..07de025d8c819 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index ea238e256514e..96bb43f0fd03f 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 62b3978595945..a671264177f71 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 90ff7e31ce406..55d4c04564ddc 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 69313034879ed..9b111873958b7 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 72e02e402d01d..90b1e62b6b383 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index 7d62bcfd8ea20..ac57e80c0aa9d 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 9b8a3ff9d7f73..6b8a18c18b92a 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 0b143809176b0..40ba5219a3a1d 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 8d7d1ad2f8b71..7675748d30c9d 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index d44c2715112cb..d93bb25ac5b98 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.devdocs.json b/api_docs/visualizations.devdocs.json index 281b4a8d767c1..4ffa3d6ca8856 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -13862,7 +13862,7 @@ "label": "fittingFunction", "description": [], "signature": [ - "\"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined" + "\"None\" | \"Average\" | \"Zero\" | \"Linear\" | \"Carry\" | \"Lookahead\" | \"Nearest\" | undefined" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", "deprecated": false, diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index d96790ca9b419..9e9e8a0f872c0 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-10-21 +date: 2024-10-22 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From c0393ae6588a1f024f16bcddd52be0bf9da45f7d Mon Sep 17 00:00:00 2001 From: Maryam Saeidi Date: Tue, 22 Oct 2024 09:22:29 +0200 Subject: [PATCH 61/69] [Alert details page] Use alert rule params instead of rule params in the custom threshold app section (#197023) Related to #181828 ## Summary This PR refactors the custom threshold app section to rely on the alert rule params instead of rule params. ### How to test - Create a custom threshold rule and verify that the alert details page works as before - Also, check the log rate analysis component and ensure it works as before --- .../alert_details_app_section.test.tsx | 7 +- .../alert_details_app_section.tsx | 19 +++-- .../helpers/log_rate_analysis_query.test.ts | 84 +++++++++++-------- .../helpers/log_rate_analysis_query.ts | 18 ++-- .../log_rate_analysis.tsx | 27 +++--- .../mocks/custom_threshold_rule.ts | 12 ++- .../components/custom_threshold/types.ts | 7 +- 7 files changed, 94 insertions(+), 80 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.test.tsx b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.test.tsx index f45a353be9a61..87aee8649300a 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.test.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.test.tsx @@ -9,6 +9,7 @@ import React from 'react'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { coreMock as mockCoreMock } from '@kbn/core/public/mocks'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; +import { ALERT_RULE_PARAMETERS } from '@kbn/rule-data-utils'; import { ParsedTechnicalFields } from '@kbn/rule-registry-plugin/common'; import { render } from '@testing-library/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; @@ -85,8 +86,10 @@ describe('AlertDetailsAppSection', () => { diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.tsx b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.tsx index b474f246988b6..cc2f8364ce5b6 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/alert_details_app_section.tsx @@ -20,9 +20,14 @@ import { useEuiTheme, transparentize, } from '@elastic/eui'; -import { RuleTypeParams } from '@kbn/alerting-plugin/common'; import { getPaddedAlertTimeRange } from '@kbn/observability-get-padded-alert-time-range-util'; -import { ALERT_END, ALERT_START, ALERT_EVALUATION_VALUES, ALERT_GROUP } from '@kbn/rule-data-utils'; +import { + ALERT_END, + ALERT_START, + ALERT_EVALUATION_VALUES, + ALERT_GROUP, + ALERT_RULE_PARAMETERS, +} from '@kbn/rule-data-utils'; import { DataView } from '@kbn/data-views-plugin/common'; import type { EventAnnotationConfig, @@ -36,9 +41,8 @@ import { getGroupFilters } from '../../../../../common/custom_threshold_rule/hel import { useLicense } from '../../../../hooks/use_license'; import { useKibana } from '../../../../utils/kibana_react'; import { metricValueFormatter } from '../../../../../common/custom_threshold_rule/metric_value_formatter'; -import { AlertParams } from '../../types'; import { Threshold } from '../threshold'; -import { CustomThresholdRule, CustomThresholdAlert } from '../types'; +import { CustomThresholdAlert } from '../types'; import { LogRateAnalysis } from './log_rate_analysis'; import { RuleConditionChart } from '../../../rule_condition_chart/rule_condition_chart'; import { getViewInAppUrl } from '../../../../../common/custom_threshold_rule/get_view_in_app_url'; @@ -47,11 +51,10 @@ import { generateChartTitleAndTooltip } from './helpers/generate_chart_title_and interface AppSectionProps { alert: CustomThresholdAlert; - rule: CustomThresholdRule; } // eslint-disable-next-line import/no-default-export -export default function AlertDetailsAppSection({ alert, rule }: AppSectionProps) { +export default function AlertDetailsAppSection({ alert }: AppSectionProps) { const services = useKibana().services; const { charts, @@ -66,10 +69,10 @@ export default function AlertDetailsAppSection({ alert, rule }: AppSectionProps) const [dataView, setDataView] = useState(); const [, setDataViewError] = useState(); const [timeRange, setTimeRange] = useState({ from: 'now-15m', to: 'now' }); - const ruleParams = rule.params as RuleTypeParams & AlertParams; const chartProps = { baseTheme: charts.theme.useChartsBaseTheme(), }; + const ruleParams = alert.fields[ALERT_RULE_PARAMETERS]; const alertStart = alert.fields[ALERT_START]; const alertEnd = alert.fields[ALERT_END]; const groups = alert.fields[ALERT_GROUP]; @@ -213,7 +216,7 @@ export default function AlertDetailsAppSection({ alert, rule }: AppSectionProps) ); })} {hasLogRateAnalysisLicense && ( - + )} ); diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/helpers/log_rate_analysis_query.test.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/helpers/log_rate_analysis_query.test.ts index 05a8c3eb67a35..996030cf890cf 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/helpers/log_rate_analysis_query.test.ts +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/helpers/log_rate_analysis_query.test.ts @@ -6,6 +6,7 @@ */ import { COMPARATORS } from '@kbn/alerting-comparators'; +import { ALERT_RULE_PARAMETERS } from '@kbn/rule-data-utils'; import { Aggregators } from '../../../../../../common/custom_threshold_rule/types'; import { CustomThresholdRuleTypeParams } from '../../../types'; import { getLogRateAnalysisEQQuery } from './log_rate_analysis_query'; @@ -50,74 +51,83 @@ describe('buildEsQuery', () => { }; const testData: Array<{ title: string; - params: CustomThresholdRuleTypeParams; alert: any; }> = [ { title: 'rule with optional filer, count filter and group by', - params: mockedParams, alert: { fields: { 'kibana.alert.group': [mockedAlertWithMultipleGroups.fields['kibana.alert.group'][0]], + [ALERT_RULE_PARAMETERS]: mockedParams, }, }, }, { title: 'rule with optional filer, count filter and multiple group by', - params: mockedParams, - alert: mockedAlertWithMultipleGroups, + alert: { + fields: { + ...mockedAlertWithMultipleGroups.fields, + [ALERT_RULE_PARAMETERS]: mockedParams, + }, + }, }, { title: 'rule with optional filer, count filter and WITHOUT group by', - params: mockedParams, - alert: {}, + alert: { + fields: { + [ALERT_RULE_PARAMETERS]: mockedParams, + }, + }, }, { title: 'rule without filter and with group by', - params: { - groupBy: ['host.hostname'], - searchConfiguration: { - index, - query: { query: '', language: 'kuery' }, - }, - criteria: [ - { - metrics: [{ name: 'A', aggType: Aggregators.COUNT }], - timeSize: 1, - timeUnit: 'm', - threshold: [90], - comparator: COMPARATORS.GREATER_THAN, - }, - ], - }, alert: { fields: { 'kibana.alert.group': [mockedAlertWithMultipleGroups.fields['kibana.alert.group'][0]], + [ALERT_RULE_PARAMETERS]: { + groupBy: ['host.hostname'], + searchConfiguration: { + index, + query: { query: '', language: 'kuery' }, + }, + criteria: [ + { + metrics: [{ name: 'A', aggType: Aggregators.COUNT }], + timeSize: 1, + timeUnit: 'm', + threshold: [90], + comparator: COMPARATORS.GREATER_THAN, + }, + ], + }, }, }, }, { title: 'rule with multiple metrics', - params: { - ...mockedParams, - criteria: [ - { - metrics: [ - { name: 'A', aggType: Aggregators.COUNT, filter: 'host.name: host-1' }, - { name: 'B', aggType: Aggregators.AVERAGE, field: 'system.load.1' }, + alert: { + fields: { + [ALERT_RULE_PARAMETERS]: { + ...mockedParams, + criteria: [ + { + metrics: [ + { name: 'A', aggType: Aggregators.COUNT, filter: 'host.name: host-1' }, + { name: 'B', aggType: Aggregators.AVERAGE, field: 'system.load.1' }, + ], + timeSize: 1, + timeUnit: 'm', + threshold: [90], + comparator: COMPARATORS.GREATER_THAN, + }, ], - timeSize: 1, - timeUnit: 'm', - threshold: [90], - comparator: COMPARATORS.GREATER_THAN, }, - ], + }, }, - alert: {}, }, ]; - test.each(testData)('should generate correct es query for $title', ({ alert, params }) => { - expect(getLogRateAnalysisEQQuery(alert, params)).toMatchSnapshot(); + test.each(testData)('should generate correct es query for $title', ({ alert }) => { + expect(getLogRateAnalysisEQQuery(alert)).toMatchSnapshot(); }); }); diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/helpers/log_rate_analysis_query.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/helpers/log_rate_analysis_query.ts index 4bd0b16212e11..bea80bfb5ab5e 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/helpers/log_rate_analysis_query.ts +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/helpers/log_rate_analysis_query.ts @@ -7,12 +7,12 @@ import { get } from 'lodash'; import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; +import { ALERT_RULE_PARAMETERS } from '@kbn/rule-data-utils'; +import { CustomThresholdAlert } from '../../types'; import { getGroupFilters } from '../../../../../../common/custom_threshold_rule/helpers/get_group'; import { Aggregators } from '../../../../../../common/custom_threshold_rule/types'; import { buildEsQuery } from '../../../../../utils/build_es_query'; import type { CustomThresholdExpressionMetric } from '../../../../../../common/custom_threshold_rule/types'; -import type { TopAlert } from '../../../../../typings/alerts'; -import type { CustomThresholdRuleTypeParams } from '../../../types'; import { Group } from '../../../../../../common/typings'; const getKuery = (metrics: CustomThresholdExpressionMetric[], filter?: string) => { @@ -32,23 +32,23 @@ const getKuery = (metrics: CustomThresholdExpressionMetric[], filter?: string) = }; export const getLogRateAnalysisEQQuery = ( - alert: TopAlert>, - params: CustomThresholdRuleTypeParams + alert: CustomThresholdAlert ): QueryDslQueryContainer | undefined => { + const ruleParams = alert.fields[ALERT_RULE_PARAMETERS]; // We only show log rate analysis for one condition with one count aggregation if ( - params.criteria.length !== 1 || - params.criteria[0].metrics.length !== 1 || - params.criteria[0].metrics[0].aggType !== Aggregators.COUNT + ruleParams.criteria.length !== 1 || + ruleParams.criteria[0].metrics.length !== 1 || + ruleParams.criteria[0].metrics[0].aggType !== Aggregators.COUNT ) { return; } const group = get(alert, 'fields["kibana.alert.group"]') as Group[] | undefined; - const optionalFilter = get(params.searchConfiguration, 'query.query') as string | undefined; + const optionalFilter = get(ruleParams.searchConfiguration, 'query.query') as string | undefined; const groupByFilters = getGroupFilters(group); const boolQuery = buildEsQuery({ - kuery: getKuery(params.criteria[0].metrics, optionalFilter), + kuery: getKuery(ruleParams.criteria[0].metrics, optionalFilter), filters: groupByFilters, }); diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/log_rate_analysis.tsx b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/log_rate_analysis.tsx index f2285b3529f65..89e8cc5e2aa6a 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/log_rate_analysis.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/alert_details_app_section/log_rate_analysis.tsx @@ -19,17 +19,14 @@ import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import type { Message } from '@kbn/observability-ai-assistant-plugin/public'; -import { Rule } from '@kbn/triggers-actions-ui-plugin/public'; -import { ALERT_END } from '@kbn/rule-data-utils'; -import { CustomThresholdRuleTypeParams } from '../../types'; -import { TopAlert } from '../../../..'; +import { ALERT_END, ALERT_RULE_PARAMETERS } from '@kbn/rule-data-utils'; +import { CustomThresholdAlert } from '../types'; import { Color, colorTransformer } from '../../../../../common/custom_threshold_rule/color_palette'; import { getLogRateAnalysisEQQuery } from './helpers/log_rate_analysis_query'; export interface AlertDetailsLogRateAnalysisProps { - alert: TopAlert>; + alert: CustomThresholdAlert; dataView: any; - rule: Rule; services: any; } @@ -40,12 +37,7 @@ interface SignificantFieldValue { pValue: number | null; } -export function LogRateAnalysis({ - alert, - dataView, - rule, - services, -}: AlertDetailsLogRateAnalysisProps) { +export function LogRateAnalysis({ alert, dataView, services }: AlertDetailsLogRateAnalysisProps) { const { observabilityAIAssistant: { ObservabilityAIAssistantContextualInsight, @@ -57,22 +49,23 @@ export function LogRateAnalysis({ | { logRateAnalysisType: LogRateAnalysisType; significantFieldValues: SignificantFieldValue[] } | undefined >(); + const ruleParams = alert.fields[ALERT_RULE_PARAMETERS]; useEffect(() => { - const esSearchRequest = getLogRateAnalysisEQQuery(alert, rule.params); + const esSearchRequest = getLogRateAnalysisEQQuery(alert); if (esSearchRequest) { setEsSearchQuery(esSearchRequest); } - }, [alert, rule.params]); + }, [alert]); const { timeRange, windowParameters } = useMemo(() => { const alertStartedAt = moment(alert.start).toISOString(); const alertEndedAt = alert.fields[ALERT_END] ? moment(alert.fields[ALERT_END]).toISOString() : undefined; - const timeSize = rule.params.criteria[0]?.timeSize as number | undefined; - const timeUnit = rule.params.criteria[0]?.timeUnit as + const timeSize = ruleParams.criteria[0]?.timeSize as number | undefined; + const timeUnit = ruleParams.criteria[0]?.timeUnit as | moment.unitOfTime.DurationConstructor | undefined; @@ -82,7 +75,7 @@ export function LogRateAnalysis({ timeSize, timeUnit, }); - }, [alert, rule]); + }, [alert.fields, alert.start, ruleParams.criteria]); const logRateAnalysisTitle = i18n.translate( 'xpack.observability.customThreshold.alertDetails.logRateAnalysisTitle', diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/mocks/custom_threshold_rule.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/mocks/custom_threshold_rule.ts index c1db31d991c28..36f108b1db628 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/mocks/custom_threshold_rule.ts +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/mocks/custom_threshold_rule.ts @@ -227,19 +227,23 @@ export const buildCustomThresholdAlert = ( { name: 'B', aggType: Aggregators.MAX, - metric: 'system.cpu.user.pct', + field: 'system.cpu.user.pct', }, ], threshold: [4], timeSize: 15, timeUnit: 'm', - warningComparator: COMPARATORS.GREATER_THAN, - warningThreshold: [2.2], }, ], - sourceId: 'default', alertOnNoData: true, alertOnGroupDisappear: true, + searchConfiguration: { + query: { + query: '', + language: 'kuery', + }, + index: 'b3eadf0e-1053-41d0-9672-dc1d7789dd68', + }, }, 'kibana.alert.evaluation.values': [2500, 5], 'kibana.alert.group': [{ field: 'host.name', value: 'host-1' }], diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/types.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/types.ts index 8d5b1260a809c..891661b6bc82a 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/types.ts +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/types.ts @@ -8,7 +8,7 @@ import * as rt from 'io-ts'; import { CasesPublicStart } from '@kbn/cases-plugin/public'; import { ChartsPluginStart } from '@kbn/charts-plugin/public'; -import { DataPublicPluginStart, SerializedSearchSourceFields } from '@kbn/data-plugin/public'; +import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { DataView, DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import { DiscoverStart } from '@kbn/discover-plugin/public'; import { EmbeddableStart } from '@kbn/embeddable-plugin/public'; @@ -16,7 +16,7 @@ import { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; import { LensPublicStart } from '@kbn/lens-plugin/public'; import { ObservabilitySharedPluginStart } from '@kbn/observability-shared-plugin/public'; import { OsqueryPluginStart } from '@kbn/osquery-plugin/public'; -import { ALERT_GROUP } from '@kbn/rule-data-utils'; +import { ALERT_GROUP, ALERT_RULE_PARAMETERS } from '@kbn/rule-data-utils'; import { SharePluginStart } from '@kbn/share-plugin/public'; import { SpacesPluginStart } from '@kbn/spaces-plugin/public'; import { @@ -87,11 +87,12 @@ export type RendererFunction = (args: Rende export interface CustomThresholdRuleTypeParams extends RuleTypeParams { criteria: CustomMetricExpressionParams[]; - searchConfiguration: SerializedSearchSourceFields; + searchConfiguration: CustomThresholdSearchSourceFields; groupBy?: string | string[]; } export interface CustomThresholdAlertFields { [ALERT_GROUP]?: Array<{ field: string; value: string }>; + [ALERT_RULE_PARAMETERS]: CustomThresholdRuleTypeParams; } export const expressionTimestampsRT = rt.type({ From 597fd3e82e549f7a746728af1a577e9fa982b89d Mon Sep 17 00:00:00 2001 From: Pablo Machado Date: Tue, 22 Oct 2024 09:58:20 +0200 Subject: [PATCH 62/69] [SecuritySolution] Fix entity-store to support asset criticality delete (#196680) ## Summary Update the entity store API so it does not return the asset criticality field when the value is 'deleted'. ### How to test it * Open kibana with data * Install the entity store * Update asset criticality for a host or user * Wait for the engine to run (I don't know a reliable way to do this) * Refresh the entity analytics dashboard, and it should show empty fields for deleted asset criticality - [ ] Backport it to 8.16 ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../entity_store_data_client.test.ts | 72 +++++++++++++++---- .../entity_store/entity_store_data_client.ts | 18 ++++- .../entity_analytics/entity_store/types.ts | 26 +++++++ .../field_retention_operators.ts | 28 +------- .../entity_store/utils/ingest.ts | 43 +++++++++++ 5 files changed, 146 insertions(+), 41 deletions(-) create mode 100644 x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/types.ts create mode 100644 x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/utils/ingest.ts diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.test.ts index 8079e54ac9ba6..858047952801d 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.test.ts @@ -39,23 +39,25 @@ describe('EntityStoreDataClient', () => { sortOrder: 'asc' as SortOrder, }; + const emptySearchResponse = { + took: 0, + timed_out: false, + _shards: { + total: 0, + successful: 0, + skipped: 0, + failed: 0, + }, + hits: { + total: 0, + hits: [], + }, + }; + describe('search entities', () => { beforeEach(() => { jest.resetAllMocks(); - esClientMock.search.mockResolvedValue({ - took: 0, - timed_out: false, - _shards: { - total: 0, - successful: 0, - skipped: 0, - failed: 0, - }, - hits: { - total: 0, - hits: [], - }, - }); + esClientMock.search.mockResolvedValue(emptySearchResponse); }); it('searches in the entities store indices', async () => { @@ -133,5 +135,47 @@ describe('EntityStoreDataClient', () => { expect(response.inspect).toMatchSnapshot(); }); + + it('returns searched entity record', async () => { + const fakeEntityRecord = { entity_record: true, asset: { criticality: 'low' } }; + + esClientMock.search.mockResolvedValue({ + ...emptySearchResponse, + hits: { + total: 1, + hits: [ + { + _index: '.entities.v1.latest.security_host_default', + _source: fakeEntityRecord, + }, + ], + }, + }); + + const response = await dataClient.searchEntities(defaultSearchParams); + + expect(response.records[0]).toEqual(fakeEntityRecord); + }); + + it("returns empty asset criticality when criticality value is 'deleted'", async () => { + const fakeEntityRecord = { entity_record: true }; + + esClientMock.search.mockResolvedValue({ + ...emptySearchResponse, + hits: { + total: 1, + hits: [ + { + _index: '.entities.v1.latest.security_host_default', + _source: { asset: { criticality: 'deleted' }, ...fakeEntityRecord }, + }, + ], + }, + }); + + const response = await dataClient.searchEntities(defaultSearchParams); + + expect(response.records[0]).toEqual(fakeEntityRecord); + }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts index 50e500fae40f2..2cb119e6d37fe 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts @@ -53,6 +53,8 @@ import { isPromiseFulfilled, isPromiseRejected, } from './utils'; +import type { EntityRecord } from './types'; +import { CRITICALITY_VALUES } from '../asset_criticality/constants'; interface EntityStoreClientOpts { logger: Logger; @@ -407,7 +409,7 @@ export class EntityStoreDataClient { const sort = sortField ? [{ [sortField]: sortOrder }] : undefined; const query = filterQuery ? JSON.parse(filterQuery) : undefined; - const response = await this.esClient.search({ + const response = await this.esClient.search({ index, query, size: Math.min(perPage, MAX_SEARCH_RESPONSE_SIZE), @@ -419,7 +421,19 @@ export class EntityStoreDataClient { const total = typeof hits.total === 'number' ? hits.total : hits.total?.value ?? 0; - const records = hits.hits.map((hit) => hit._source as Entity); + const records = hits.hits.map((hit) => { + const { asset, ...source } = hit._source as EntityRecord; + + const assetOverwrite: Pick = + asset && asset.criticality !== CRITICALITY_VALUES.DELETED + ? { asset: { criticality: asset.criticality } } + : {}; + + return { + ...source, + ...assetOverwrite, + }; + }); const inspect: InspectQuery = { dsl: [JSON.stringify({ index, body: query }, null, 2)], diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/types.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/types.ts new file mode 100644 index 0000000000000..e5f1e6db36bca --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/types.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { HostEntity, UserEntity } from '../../../../common/api/entity_analytics'; +import type { CriticalityValues } from '../asset_criticality/constants'; + +export interface HostEntityRecord extends Omit { + asset?: { + criticality: CriticalityValues; + }; +} + +export interface UserEntityRecord extends Omit { + asset?: { + criticality: CriticalityValues; + }; +} + +/** + * It represents the data stored in the entity store index. + */ +export type EntityRecord = HostEntityRecord | UserEntityRecord; diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/field_retention_operators.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/field_retention_operators.ts index ced0327194364..6e8f7dc3f6578 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/field_retention_operators.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/trial_license_complete_tier/field_retention_operators.ts @@ -11,6 +11,7 @@ import { fieldOperatorToIngestProcessor, } from '@kbn/security-solution-plugin/server/lib/entity_analytics/entity_store/field_retention_definition'; import { FtrProviderContext } from '../../../../ftr_provider_context'; +import { applyIngestProcessorToDoc } from '../utils/ingest'; export default ({ getService }: FtrProviderContext) => { const es = getService('es'); const log = getService('log'); @@ -26,31 +27,8 @@ export default ({ getService }: FtrProviderContext) => { docSource: any ): Promise => { const step = fieldOperatorToIngestProcessor(operator, { enrichField: 'historical' }); - const doc = { - _index: 'index', - _id: 'id', - _source: docSource, - }; - - const res = await es.ingest.simulate({ - pipeline: { - description: 'test', - processors: [step], - }, - docs: [doc], - }); - - const firstDoc = res.docs?.[0]; - - // @ts-expect-error error is not in the types - const error = firstDoc?.error; - if (error) { - log.error('Full painless error below: '); - log.error(JSON.stringify(error, null, 2)); - throw new Error('Painless error running pipelie see logs for full detail : ' + error?.type); - } - return firstDoc?.doc?._source; + return applyIngestProcessorToDoc([step], docSource, es, log); }; describe('@ess @serverless @skipInServerlessMKI Entity store - Field Retention Pipeline Steps', () => { @@ -90,7 +68,7 @@ export default ({ getService }: FtrProviderContext) => { expectArraysMatchAnyOrder(resultDoc.test_field, ['foo']); }); - it('should take from history if latest field doesnt have maxLength values', async () => { + it("should take from history if latest field doesn't have maxLength values", async () => { const op: FieldRetentionOperator = { operation: 'collect_values', field: 'test_field', diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/utils/ingest.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/utils/ingest.ts new file mode 100644 index 0000000000000..24f7d759190b5 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/entity_store/utils/ingest.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 + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Client } from '@elastic/elasticsearch'; +import { IngestProcessorContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { ToolingLog } from '@kbn/tooling-log'; + +export const applyIngestProcessorToDoc = async ( + steps: IngestProcessorContainer[], + docSource: any, + es: Client, + log: ToolingLog +): Promise => { + const doc = { + _index: 'index', + _id: 'id', + _source: docSource, + }; + + const res = await es.ingest.simulate({ + pipeline: { + description: 'test', + processors: steps, + }, + docs: [doc], + }); + + const firstDoc = res.docs?.[0]; + + // @ts-expect-error error is not in the types + const error = firstDoc?.error; + if (error) { + log.error('Full painless error below: '); + log.error(JSON.stringify(error, null, 2)); + throw new Error('Painless error running pipeline see logs for full detail : ' + error?.type); + } + + return firstDoc?.doc?._source; +}; From c5067fdd06425541d6eb5a9ef5260c9ea9a86816 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Tue, 22 Oct 2024 10:51:55 +0200 Subject: [PATCH 63/69] [EDR Workflows] Improve agent downloader (#196135) --- .../agent_downloader.test.ts | 203 ++++++++++++++++++ .../agent_downloader_cli/agent_downloader.ts | 62 +++++- .../common/agent_downloads_service.test.ts | 77 +++++++ .../common/agent_downloads_service.ts | 126 ++++++----- 4 files changed, 410 insertions(+), 58 deletions(-) create mode 100644 x-pack/plugins/security_solution/scripts/endpoint/agent_downloader_cli/agent_downloader.test.ts create mode 100644 x-pack/plugins/security_solution/scripts/endpoint/common/agent_downloads_service.test.ts diff --git a/x-pack/plugins/security_solution/scripts/endpoint/agent_downloader_cli/agent_downloader.test.ts b/x-pack/plugins/security_solution/scripts/endpoint/agent_downloader_cli/agent_downloader.test.ts new file mode 100644 index 0000000000000..a39ad186e62b6 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/agent_downloader_cli/agent_downloader.test.ts @@ -0,0 +1,203 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getAgentDownloadUrl, getAgentFileName } from '../common/fleet_services'; +import { downloadAndStoreAgent } from '../common/agent_downloads_service'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { agentDownloaderRunner } from './agent_downloader'; +import type { RunContext } from '@kbn/dev-cli-runner'; + +jest.mock('../common/fleet_services'); +jest.mock('../common/agent_downloads_service'); + +describe('agentDownloaderRunner', () => { + let log: ToolingLog; + + beforeEach(() => { + log = { + info: jest.fn(), + error: jest.fn(), + } as unknown as ToolingLog; + + jest.clearAllMocks(); + }); + + const version = '8.15.0'; + let closestMatch = false; + const url = 'http://example.com/agent.tar.gz'; + const fileName = 'elastic-agent-8.15.0.tar.gz'; + + it('downloads and stores the specified version', async () => { + (getAgentDownloadUrl as jest.Mock).mockResolvedValue({ url }); + (getAgentFileName as jest.Mock).mockReturnValue('elastic-agent-8.15.0'); + (downloadAndStoreAgent as jest.Mock).mockResolvedValue(undefined); + + await agentDownloaderRunner({ + flags: { version, closestMatch }, + log, + } as unknown as RunContext); + + expect(getAgentDownloadUrl).toHaveBeenCalledWith(version, closestMatch, log); + expect(getAgentFileName).toHaveBeenCalledWith(version); + expect(downloadAndStoreAgent).toHaveBeenCalledWith(url, fileName); + expect(log.info).toHaveBeenCalledWith('Successfully downloaded and stored version 8.15.0'); + }); + + it('logs an error if the download fails', async () => { + (getAgentDownloadUrl as jest.Mock).mockResolvedValue({ url }); + (getAgentFileName as jest.Mock).mockReturnValue('elastic-agent-8.15.0'); + (downloadAndStoreAgent as jest.Mock).mockRejectedValue(new Error('Download failed')); + + await agentDownloaderRunner({ + flags: { version, closestMatch }, + log, + } as unknown as RunContext); + + expect(getAgentDownloadUrl).toHaveBeenCalledWith(version, closestMatch, log); + expect(getAgentFileName).toHaveBeenCalledWith(version); + expect(downloadAndStoreAgent).toHaveBeenCalledWith(url, fileName); + expect(log.error).toHaveBeenCalledWith( + 'Failed to download or store version 8.15.0: Download failed' + ); + }); + + it('downloads and stores the previous patch version if the specified version fails', async () => { + const fallbackVersion = '8.15.0'; + const fallbackFileName = 'elastic-agent-8.15.0.tar.gz'; + + (getAgentDownloadUrl as jest.Mock) + .mockResolvedValueOnce({ url }) + .mockResolvedValueOnce({ url }); + (getAgentFileName as jest.Mock) + .mockReturnValueOnce('elastic-agent-8.15.1') + .mockReturnValueOnce('elastic-agent-8.15.0'); + (downloadAndStoreAgent as jest.Mock) + .mockRejectedValueOnce(new Error('Download failed')) + .mockResolvedValueOnce(undefined); + + await agentDownloaderRunner({ + flags: { version: '8.15.1', closestMatch }, + log, + } as unknown as RunContext); + + expect(getAgentDownloadUrl).toHaveBeenCalledWith('8.15.1', closestMatch, log); + expect(getAgentDownloadUrl).toHaveBeenCalledWith(fallbackVersion, closestMatch, log); + expect(getAgentFileName).toHaveBeenCalledWith('8.15.1'); + expect(getAgentFileName).toHaveBeenCalledWith(fallbackVersion); + expect(downloadAndStoreAgent).toHaveBeenCalledWith(url, 'elastic-agent-8.15.1.tar.gz'); + expect(downloadAndStoreAgent).toHaveBeenCalledWith(url, fallbackFileName); + expect(log.error).toHaveBeenCalledWith( + 'Failed to download or store version 8.15.1: Download failed' + ); + expect(log.info).toHaveBeenCalledWith('Successfully downloaded and stored version 8.15.0'); + }); + + it('logs an error if all downloads fail', async () => { + (getAgentDownloadUrl as jest.Mock).mockResolvedValue({ url }); + (getAgentFileName as jest.Mock) + .mockReturnValueOnce('elastic-agent-8.15.1') + .mockReturnValueOnce('elastic-agent-8.15.0'); + (downloadAndStoreAgent as jest.Mock) + .mockRejectedValueOnce(new Error('Download failed')) + .mockRejectedValueOnce(new Error('Download failed')); + + await agentDownloaderRunner({ + flags: { version: '8.15.1', closestMatch }, + log, + } as unknown as RunContext); + + expect(getAgentDownloadUrl).toHaveBeenCalledWith('8.15.1', closestMatch, log); + expect(getAgentDownloadUrl).toHaveBeenCalledWith('8.15.0', closestMatch, log); + expect(getAgentFileName).toHaveBeenCalledWith('8.15.1'); + expect(getAgentFileName).toHaveBeenCalledWith('8.15.0'); + expect(downloadAndStoreAgent).toHaveBeenCalledWith(url, 'elastic-agent-8.15.1.tar.gz'); + expect(downloadAndStoreAgent).toHaveBeenCalledWith(url, 'elastic-agent-8.15.0.tar.gz'); + expect(log.error).toHaveBeenCalledWith( + 'Failed to download or store version 8.15.1: Download failed' + ); + expect(log.error).toHaveBeenCalledWith( + 'Failed to download or store version 8.15.0: Download failed' + ); + }); + + it('does not attempt fallback when patch version is 0', async () => { + (getAgentDownloadUrl as jest.Mock).mockResolvedValue({ url }); + (getAgentFileName as jest.Mock).mockReturnValue('elastic-agent-8.15.0'); + (downloadAndStoreAgent as jest.Mock).mockResolvedValue(undefined); + + await agentDownloaderRunner({ + flags: { version: '8.15.0', closestMatch }, + log, + } as unknown as RunContext); + + expect(getAgentDownloadUrl).toHaveBeenCalledTimes(1); // Only one call for 8.15.0 + expect(getAgentFileName).toHaveBeenCalledTimes(1); + expect(downloadAndStoreAgent).toHaveBeenCalledWith(url, fileName); + expect(log.info).toHaveBeenCalledWith('Successfully downloaded and stored version 8.15.0'); + }); + + it('logs an error for an invalid version format', async () => { + const invalidVersion = '7.x.x'; + + await expect( + agentDownloaderRunner({ + flags: { version: invalidVersion, closestMatch }, + log, + } as unknown as RunContext) + ).rejects.toThrow('Invalid version format'); + }); + + it('passes the closestMatch flag correctly', async () => { + closestMatch = true; + + (getAgentDownloadUrl as jest.Mock).mockResolvedValue({ url }); + (getAgentFileName as jest.Mock).mockReturnValue('elastic-agent-8.15.0'); + (downloadAndStoreAgent as jest.Mock).mockResolvedValue(undefined); + + await agentDownloaderRunner({ + flags: { version, closestMatch }, + log, + } as unknown as RunContext); + + expect(getAgentDownloadUrl).toHaveBeenCalledWith(version, closestMatch, log); + }); + + it('throws an error when version is not provided', async () => { + await expect( + agentDownloaderRunner({ + flags: { closestMatch }, + log, + } as unknown as RunContext) + ).rejects.toThrow('version argument is required'); + }); + + it('logs the correct messages when both version and fallback version are processed', async () => { + const primaryVersion = '8.15.1'; + + (getAgentDownloadUrl as jest.Mock) + .mockResolvedValueOnce({ url }) + .mockResolvedValueOnce({ url }); + + (getAgentFileName as jest.Mock) + .mockReturnValueOnce('elastic-agent-8.15.1') + .mockReturnValueOnce('elastic-agent-8.15.0'); + + (downloadAndStoreAgent as jest.Mock) + .mockRejectedValueOnce(new Error('Download failed')) // Fail on primary + .mockResolvedValueOnce(undefined); // Success on fallback + + await agentDownloaderRunner({ + flags: { version: primaryVersion, closestMatch }, + log, + } as unknown as RunContext); + + expect(log.error).toHaveBeenCalledWith( + 'Failed to download or store version 8.15.1: Download failed' + ); + expect(log.info).toHaveBeenCalledWith('Successfully downloaded and stored version 8.15.0'); + }); +}); diff --git a/x-pack/plugins/security_solution/scripts/endpoint/agent_downloader_cli/agent_downloader.ts b/x-pack/plugins/security_solution/scripts/endpoint/agent_downloader_cli/agent_downloader.ts index ab1da6a3f208f..8366c77575e70 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/agent_downloader_cli/agent_downloader.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/agent_downloader_cli/agent_downloader.ts @@ -8,24 +8,72 @@ import { ok } from 'assert'; import type { RunFn } from '@kbn/dev-cli-runner'; import type { ToolingLog } from '@kbn/tooling-log'; +import semver from 'semver'; import { getAgentDownloadUrl, getAgentFileName } from '../common/fleet_services'; import { downloadAndStoreAgent } from '../common/agent_downloads_service'; +// Decrement the patch version by 1 and preserve pre-release tag (if any) +const decrementPatchVersion = (version: string): string | null => { + const parsedVersion = semver.parse(version); + if (!parsedVersion) { + return null; + } + const newPatchVersion = parsedVersion.patch - 1; + // Create a new version string with the decremented patch - removing any possible pre-release tag + const newVersion = `${parsedVersion.major}.${parsedVersion.minor}.${newPatchVersion}`; + return semver.valid(newVersion) ? newVersion : null; +}; + +// Generate a list of versions to attempt downloading, including a fallback to the previous patch (GA) +const getVersionsToDownload = (version: string): string[] => { + const parsedVersion = semver.parse(version); + if (!parsedVersion) return []; + // If patch version is 0, return only the current version. + if (parsedVersion.patch === 0) { + return [version]; + } + + const decrementedVersion = decrementPatchVersion(version); + return decrementedVersion ? [version, decrementedVersion] : [version]; +}; + +// Download and store the Elastic Agent for the specified version(s) const downloadAndStoreElasticAgent = async ( version: string, closestMatch: boolean, log: ToolingLog -) => { - const downloadUrlResponse = await getAgentDownloadUrl(version, closestMatch, log); - const fileNameNoExtension = getAgentFileName(version); - const agentFile = `${fileNameNoExtension}.tar.gz`; - await downloadAndStoreAgent(downloadUrlResponse.url, agentFile); +): Promise => { + const versionsToDownload = getVersionsToDownload(version); + + // Although we have a list of versions to try downloading, we only need to download one, and will return as soon as it succeeds. + for (const versionToDownload of versionsToDownload) { + try { + const { url } = await getAgentDownloadUrl(versionToDownload, closestMatch, log); + const fileName = `${getAgentFileName(versionToDownload)}.tar.gz`; + + await downloadAndStoreAgent(url, fileName); + log.info(`Successfully downloaded and stored version ${versionToDownload}`); + return; // Exit once successful + } catch (error) { + log.error(`Failed to download or store version ${versionToDownload}: ${error.message}`); + } + } + + log.error(`Failed to download agent for any available version: ${versionsToDownload.join(', ')}`); }; export const agentDownloaderRunner: RunFn = async (cliContext) => { - ok(cliContext.flags.version, 'version argument is required'); + const { version } = cliContext.flags; + + ok(version, 'version argument is required'); + + // Validate version format + if (!semver.valid(version as string)) { + throw new Error('Invalid version format'); + } + await downloadAndStoreElasticAgent( - cliContext.flags.version as string, + version as string, cliContext.flags.closestMatch as boolean, cliContext.log ); diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/agent_downloads_service.test.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/agent_downloads_service.test.ts new file mode 100644 index 0000000000000..0a7a9d3104798 --- /dev/null +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/agent_downloads_service.test.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 + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +// Adjust path if needed + +import { downloadAndStoreAgent, isAgentDownloadFromDiskAvailable } from './agent_downloads_service'; +import fs from 'fs'; +import nodeFetch from 'node-fetch'; +import { finished } from 'stream/promises'; + +jest.mock('fs'); +jest.mock('node-fetch'); +jest.mock('stream/promises', () => ({ + finished: jest.fn(), +})); +jest.mock('../../../common/endpoint/data_loaders/utils', () => ({ + createToolingLogger: jest.fn(() => ({ + debug: jest.fn(), + info: jest.fn(), + error: jest.fn(), + })), +})); + +describe('AgentDownloadStorage', () => { + const url = 'http://example.com/agent.tar.gz'; + const fileName = 'elastic-agent-7.10.0.tar.gz'; + beforeEach(() => { + jest.clearAllMocks(); // Ensure no previous test state affects the current one + }); + + it('downloads and stores the agent if not cached', async () => { + (fs.existsSync as unknown as jest.Mock).mockReturnValue(false); + (fs.createWriteStream as unknown as jest.Mock).mockReturnValue({ + on: jest.fn(), + end: jest.fn(), + }); + (nodeFetch as unknown as jest.Mock).mockResolvedValue({ body: { pipe: jest.fn() } }); + (finished as unknown as jest.Mock).mockResolvedValue(undefined); + + const result = await downloadAndStoreAgent(url, fileName); + + expect(result).toEqual({ + url, + filename: fileName, + directory: expect.any(String), + fullFilePath: expect.stringContaining(fileName), // Dynamically match the file path + }); + }); + + it('reuses cached agent if available', async () => { + (fs.existsSync as unknown as jest.Mock).mockReturnValue(true); + + const result = await downloadAndStoreAgent(url, fileName); + + expect(result).toEqual({ + url, + filename: fileName, + directory: expect.any(String), + fullFilePath: expect.stringContaining(fileName), // Dynamically match the path + }); + }); + + it('checks if agent download is available from disk', () => { + (fs.existsSync as unknown as jest.Mock).mockReturnValue(true); + + const result = isAgentDownloadFromDiskAvailable(fileName); + + expect(result).toEqual({ + filename: fileName, + directory: expect.any(String), + fullFilePath: expect.stringContaining(fileName), // Dynamically match the path + }); + }); +}); diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/agent_downloads_service.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/agent_downloads_service.ts index 488e1b10160e8..4c963332ad0c2 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/agent_downloads_service.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/agent_downloads_service.ts @@ -5,6 +5,7 @@ * 2.0. */ +import pRetry from 'p-retry'; import { mkdir, readdir, stat, unlink } from 'fs/promises'; import { join } from 'path'; import fs from 'fs'; @@ -24,7 +25,7 @@ export interface DownloadedAgentInfo { interface AgentDownloadStorageSettings { /** - * Last time a cleanup was ran. Date in ISO format + * Last time a cleanup was performed. Date in ISO format */ lastCleanup: string; @@ -47,7 +48,7 @@ class AgentDownloadStorage extends SettingsStorage constructor() { super('agent_download_storage_settings.json', { defaultSettings: { - maxFileAge: 1.728e8, // 2 days + maxFileAge: 1.728e8, // 2 days in milliseconds lastCleanup: new Date().toISOString(), }, }); @@ -55,20 +56,25 @@ class AgentDownloadStorage extends SettingsStorage this.downloadsDirFullPath = this.buildPath(this.downloadsDirName); } + /** + * Ensures the download directory exists on disk + */ protected async ensureExists(): Promise { await super.ensureExists(); if (!this.downloadsFolderExists) { await mkdir(this.downloadsDirFullPath, { recursive: true }); - this.log.debug(`Created directory [this.downloadsDirFullPath] for cached agent downloads`); + this.log.debug(`Created directory [${this.downloadsDirFullPath}] for cached agent downloads`); this.downloadsFolderExists = true; } } + /** + * Gets the file paths for a given download URL and optional file name. + */ public getPathsForUrl(agentDownloadUrl: string, agentFileName?: string): DownloadedAgentInfo { - const filename = agentFileName - ? agentFileName - : agentDownloadUrl.replace(/^https?:\/\//gi, '').replace(/\//g, '#'); + const filename = + agentFileName || agentDownloadUrl.replace(/^https?:\/\//gi, '').replace(/\//g, '#'); const directory = this.downloadsDirFullPath; const fullFilePath = this.buildPath(join(this.downloadsDirName, filename)); @@ -79,59 +85,67 @@ class AgentDownloadStorage extends SettingsStorage }; } + /** + * Downloads the agent and stores it locally. Reuses existing downloads if available. + */ public async downloadAndStore( agentDownloadUrl: string, agentFileName?: string ): Promise { - this.log.debug(`Downloading and storing: ${agentDownloadUrl}`); - - // TODO: should we add "retry" attempts to file downloads? + this.log.debug(`Starting download: ${agentDownloadUrl}`); await this.ensureExists(); - const newDownloadInfo = this.getPathsForUrl(agentDownloadUrl, agentFileName); - // If download is already present on disk, then just return that info. No need to re-download it + // Return cached version if the file already exists if (fs.existsSync(newDownloadInfo.fullFilePath)) { this.log.debug(`Download already cached at [${newDownloadInfo.fullFilePath}]`); return newDownloadInfo; } try { - const outputStream = fs.createWriteStream(newDownloadInfo.fullFilePath); - - await handleProcessInterruptions( - async () => { - const { body } = await nodeFetch(agentDownloadUrl); - await finished(body.pipe(outputStream)); + await pRetry( + async (attempt) => { + this.log.info( + `Attempt ${attempt} - Downloading agent from [${agentDownloadUrl}] to [${newDownloadInfo.fullFilePath}]` + ); + const outputStream = fs.createWriteStream(newDownloadInfo.fullFilePath); + + await handleProcessInterruptions( + async () => { + const { body } = await nodeFetch(agentDownloadUrl); + await finished(body.pipe(outputStream)); + }, + () => fs.unlinkSync(newDownloadInfo.fullFilePath) // Clean up on interruption + ); + this.log.info(`Successfully downloaded agent to [${newDownloadInfo.fullFilePath}]`); }, - () => { - fs.unlinkSync(newDownloadInfo.fullFilePath); + { + retries: 2, // 2 retries = 3 total attempts (1 initial + 2 retries) + onFailedAttempt: (error) => { + this.log.error(`Download attempt ${error.attemptNumber} failed: ${error.message}`); + // Cleanup failed download + return unlink(newDownloadInfo.fullFilePath); + }, } ); - } catch (e) { - // Try to clean up download case it failed halfway through - await unlink(newDownloadInfo.fullFilePath); - - throw e; + } catch (error) { + throw new Error(`Download failed after multiple attempts: ${error.message}`); } await this.cleanupDownloads(); - return newDownloadInfo; } public async cleanupDownloads(): Promise<{ deleted: string[] }> { - this.log.debug(`Performing cleanup of cached Agent downlaods`); + this.log.debug('Performing cleanup of cached Agent downloads'); const settings = await this.get(); - const maxAgeDate = new Date(); + const maxAgeDate = new Date(Date.now() - settings.maxFileAge); const response: { deleted: string[] } = { deleted: [] }; - maxAgeDate.setMilliseconds(settings.maxFileAge * -1); // `* -1` to set time back - - // If cleanup already happen within the file age, then nothing to do. Exit. if (settings.lastCleanup > maxAgeDate.toISOString()) { + this.log.debug('Skipping cleanup, as it was performed recently.'); return response; } @@ -140,41 +154,48 @@ class AgentDownloadStorage extends SettingsStorage lastCleanup: new Date().toISOString(), }); - const deleteFilePromises: Array> = []; - const allFiles = await readdir(this.downloadsDirFullPath); - - for (const fileName of allFiles) { - const filePath = join(this.downloadsDirFullPath, fileName); - const fileStats = await stat(filePath); + try { + const allFiles = await readdir(this.downloadsDirFullPath); + const deleteFilePromises = allFiles.map(async (fileName) => { + const filePath = join(this.downloadsDirFullPath, fileName); + const fileStats = await stat(filePath); + if (fileStats.isFile() && fileStats.birthtime < maxAgeDate) { + try { + await unlink(filePath); + response.deleted.push(filePath); + } catch (err) { + this.log.error(`Failed to delete file [${filePath}]: ${err.message}`); + } + } + }); - if (fileStats.isFile() && fileStats.birthtime < maxAgeDate) { - deleteFilePromises.push(unlink(filePath)); - response.deleted.push(filePath); - } + await Promise.allSettled(deleteFilePromises); + this.log.debug(`Deleted ${response.deleted.length} file(s)`); + return response; + } catch (err) { + this.log.error(`Error during cleanup: ${err.message}`); + return response; } - - await Promise.allSettled(deleteFilePromises); - - this.log.debug(`Deleted [${response.deleted.length}] file(s)`); - this.log.verbose(`files deleted:\n`, response.deleted.join('\n')); - - return response; } + /** + * Checks if a specific agent download is available locally. + */ public isAgentDownloadFromDiskAvailable(filename: string): DownloadedAgentInfo | undefined { - if (fs.existsSync(join(this.downloadsDirFullPath, filename))) { + const filePath = join(this.downloadsDirFullPath, filename); + if (fs.existsSync(filePath)) { return { filename, /** The local directory where downloads are stored */ directory: this.downloadsDirFullPath, /** The full local file path and name */ - fullFilePath: join(this.downloadsDirFullPath, filename), + fullFilePath: filePath, }; } } } -const agentDownloadsClient = new AgentDownloadStorage(); +export const agentDownloadsClient = new AgentDownloadStorage(); export interface DownloadAndStoreAgentResponse extends DownloadedAgentInfo { url: string; @@ -203,12 +224,15 @@ export const downloadAndStoreAgent = async ( }; /** - * Cleans up the old agent downloads on disk. + * Cleans up old agent downloads on disk. */ export const cleanupDownloads = async (): ReturnType => { return agentDownloadsClient.cleanupDownloads(); }; +/** + * Checks if a specific agent download is available from disk. + */ export const isAgentDownloadFromDiskAvailable = ( fileName: string ): DownloadedAgentInfo | undefined => { From 5ffe226addcaffb8e1d8213fb8e9a1c62de303ed Mon Sep 17 00:00:00 2001 From: Elena Shostak <165678770+elena-shostak@users.noreply.github.com> Date: Tue, 22 Oct 2024 11:05:45 +0200 Subject: [PATCH 64/69] [Authz] Enabled no_deprecated_authz_config for migration only (#196852) ## Summary To ensure that `no_deprecated_authz_config` rule is only applied during an intentional migration, added check for env vars presence. If neither `MIGRATE_ENABLED_AUTHZ` nor `MIGRATE_DISABLED_AUTHZ` is set, the rule will be skipped, avoiding unnecessary or unforeseen code changes both locally and in the CI. Added fix and test case for `access:${APP.TEST_ID}` tags that have property access in the template literal. __Closes: https://github.com/elastic/kibana/issues/196846__ ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios Co-authored-by: Elastic Machine --- packages/kbn-eslint-config/.eslintrc.js | 1 + .../rules/no_deprecated_authz_config.js | 94 ++++++++++++------- .../rules/no_deprecated_authz_config.test.js | 33 ++++++- 3 files changed, 93 insertions(+), 35 deletions(-) diff --git a/packages/kbn-eslint-config/.eslintrc.js b/packages/kbn-eslint-config/.eslintrc.js index f241131cd6273..4c429d3157fd9 100644 --- a/packages/kbn-eslint-config/.eslintrc.js +++ b/packages/kbn-eslint-config/.eslintrc.js @@ -326,6 +326,7 @@ module.exports = { '@kbn/imports/uniform_imports': 'error', '@kbn/imports/no_unused_imports': 'error', '@kbn/imports/no_boundary_crossing': 'error', + '@kbn/eslint/no_deprecated_authz_config': 'error', 'no-new-func': 'error', 'no-implied-eval': 'error', diff --git a/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.js b/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.js index f6485d0914c15..0f0b8759b4a82 100644 --- a/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.js +++ b/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.js @@ -39,6 +39,33 @@ const maybeReportDisabledSecurityConfig = (node, context, isVersionedRoute = fal return; } + const hasSecurityInRoot = (config) => { + const securityInRoot = config.properties.find( + (property) => property.key && property.key.name === 'security' + ); + + if (securityInRoot) { + return true; + } + + const optionsProperty = config.properties.find( + (prop) => prop.key && prop.key.name === 'options' + ); + + if (optionsProperty?.value?.properties) { + const tagsProperty = optionsProperty.value.properties.find( + (prop) => prop.key.name === 'tags' + ); + + const accessTagsFilter = (el) => isLiteralAccessTag(el) || isTemplateLiteralAccessTag(el); + const accessTags = tagsProperty?.value?.elements?.filter(accessTagsFilter) ?? []; + + return accessTags.length > 0; + } + + return false; + }; + if (isVersionedRoute) { const [versionConfig] = node.arguments; @@ -53,33 +80,6 @@ const maybeReportDisabledSecurityConfig = (node, context, isVersionedRoute = fal let currentNode = node; - const hasSecurityInRoot = (config) => { - const securityInRoot = config.properties.find( - (property) => property.key && property.key.name === 'security' - ); - - if (securityInRoot) { - return true; - } - - const optionsProperty = config.properties.find( - (prop) => prop.key && prop.key.name === 'options' - ); - - if (optionsProperty?.value?.properties) { - const tagsProperty = optionsProperty.value.properties.find( - (prop) => prop.key.name === 'tags' - ); - - const accessTagsFilter = (el) => isLiteralAccessTag(el) || isTemplateLiteralAccessTag(el); - const accessTags = tagsProperty.value.elements.filter(accessTagsFilter); - - return accessTags.length > 0; - } - - return false; - }; - while ( currentNode && currentNode.type === 'CallExpression' && @@ -126,11 +126,14 @@ const maybeReportDisabledSecurityConfig = (node, context, isVersionedRoute = fal } } else { const [routeConfig] = node.arguments; - const securityProperty = routeConfig.properties.find( - (property) => property.key && property.key.name === 'security' - ); - if (!securityProperty) { + const pathProperty = routeConfig.properties?.find((prop) => prop?.key?.name === 'path'); + + if (!pathProperty) { + return; + } + + if (!hasSecurityInRoot(routeConfig)) { const pathProperty = routeConfig.properties.find((prop) => prop.key.name === 'path'); context.report({ node: routeConfig, @@ -181,7 +184,14 @@ const handleRouteConfig = (node, context, isVersionedRoute = false) => { const staticPart = firstQuasi.split(ACCESS_TAG_PREFIX)[1] || ''; const dynamicParts = el.expressions.map((expression, index) => { - const dynamicPlaceholder = `\${${expression.name}}`; + let dynamicPlaceholder; + if (expression.property) { + // Case: object.property + dynamicPlaceholder = `\${${expression.object.name}.${expression.property.name}}`; + } else { + // Case: simple variable + dynamicPlaceholder = `\${${expression.name}}`; + } const nextQuasi = el.quasis[index + 1].value.raw || ''; return `${dynamicPlaceholder}${nextQuasi}`; }); @@ -290,13 +300,25 @@ module.exports = { CallExpression(node) { const callee = node.callee; + // Skipping by default if any of env vars is not set + const shouldSkipMigration = + !process.env.MIGRATE_ENABLED_AUTHZ && !process.env.MIGRATE_DISABLED_AUTHZ; + + if (shouldSkipMigration) { + return; + } + if ( callee.type === 'MemberExpression' && callee.object && callee.object.name === 'router' && routeMethods.includes(callee.property.name) ) { - handleRouteConfig(node, context, false); + if (process.env.MIGRATE_ENABLED_AUTHZ === 'false') { + maybeReportDisabledSecurityConfig(node, context, false); + } else { + handleRouteConfig(node, context, false); + } } if ( @@ -310,7 +332,11 @@ module.exports = { const versionConfig = node.arguments[0]; if (versionConfig && versionConfig.type === 'ObjectExpression') { - handleRouteConfig(node, context, true); + if (process.env.MIGRATE_ENABLED_AUTHZ === 'false') { + maybeReportDisabledSecurityConfig(node, context, true); + } else { + handleRouteConfig(node, context, true); + } } } }, diff --git a/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.test.js b/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.test.js index b397c4457b2c7..4f0fc375ad55e 100644 --- a/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.test.js +++ b/packages/kbn-eslint-plugin-eslint/rules/no_deprecated_authz_config.test.js @@ -11,8 +11,17 @@ const { RuleTester } = require('eslint'); const rule = require('./no_deprecated_authz_config'); const dedent = require('dedent'); -// Indentation is a big problem in the test cases, dedent library does not work as expected. +beforeAll(() => { + process.env.MIGRATE_ENABLED_AUTHZ = 'true'; + process.env.MIGRATE_DISABLED_AUTHZ = 'true'; +}); + +afterAll(() => { + delete process.env.MIGRATE_ENABLED_AUTHZ; + delete process.env.MIGRATE_DISABLED_AUTHZ; +}); +// Indentation is a big problem in the test cases, dedent library does not work as expected. const ruleTester = new RuleTester({ parser: require.resolve('@typescript-eslint/parser'), parserOptions: { @@ -202,6 +211,28 @@ ruleTester.run('no_deprecated_authz_config', rule, { `, name: 'invalid: access tags are template literals, move to security.authz.requiredPrivileges', }, + { + code: ` + router.get({ + path: '/some/path', + options: { + tags: [\`access:\${APP.TEST_ID}\`], + }, + }); + `, + errors: [{ message: "Move 'access' tags to security.authz.requiredPrivileges." }], + output: ` + router.get({ + path: '/some/path', + security: { + authz: { + requiredPrivileges: [\`\${APP.TEST_ID}\`], + }, + }, + }); + `, + name: 'invalid: access tags are template literals, move to security.authz.requiredPrivileges', + }, { code: ` router.get({ From 871859096c3e369649f7e1c6576e24fe6abad595 Mon Sep 17 00:00:00 2001 From: Jeramy Soucy Date: Tue, 22 Oct 2024 11:09:37 +0200 Subject: [PATCH 65/69] Skips serverless org members nav card test on MKI (#197171) ## Summary Skips the functional test for the org members management nav card on MKI. The test attempts to confirm a link to the cloud org members page, but on MKI it will redirect to cloud login. --- .../navigation/management_nav_cards.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/platform_security/navigation/management_nav_cards.ts b/x-pack/test_serverless/functional/test_suites/common/platform_security/navigation/management_nav_cards.ts index 1dfa1a5dff79c..0f175f4c812a2 100644 --- a/x-pack/test_serverless/functional/test_suites/common/platform_security/navigation/management_nav_cards.ts +++ b/x-pack/test_serverless/functional/test_suites/common/platform_security/navigation/management_nav_cards.ts @@ -56,13 +56,18 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const url = await browser.getCurrentUrl(); expect(url).to.contain('/management/security/roles'); }); + }); + + describe('organization members', function () { + // Observability will not support custom roles + // Cannot test cloud link on MKI (will redirect to login) + this.tags(['skipSvlOblt', 'skipMKI']); it('displays the Organization members management card, and will navigate to the cloud organization URL', async () => { await pageObjects.svlManagementPage.assertOrgMembersManagementCardExists(); await pageObjects.svlManagementPage.clickOrgMembersManagementCard(); const url = await browser.getCurrentUrl(); - // `--xpack.cloud.organization_url: '/account/members'`, expect(url).to.contain('/account/members'); }); }); @@ -102,7 +107,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); describe('Organization members', function () { - this.tags('skipSvlOblt'); // Observability will not support custom roles + // Observability will not support custom roles + // Cannot test cloud link on MKI (will redirect to login) + this.tags(['skipSvlOblt', 'skipMKI']); + it('displays the organization members management card, and will navigate to the cloud organization URL', async () => { // The org members nav card is always visible because there is no way to check if a user has approprite privileges await pageObjects.svlManagementPage.assertOrgMembersManagementCardExists(); From 996eb73811c665945f8c4425d1e8e89fa9688b40 Mon Sep 17 00:00:00 2001 From: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com> Date: Tue, 22 Oct 2024 10:14:42 +0100 Subject: [PATCH 66/69] [Ingest Pipelines] Update copy in Manage processors (#196923) ## Summary This PR adds some copy changes to the Manage processors pages. 1. Empty prompt - Width and padding of the prompt is adjusted so that "IP" in the title starts in the 2nd line - Description is updated Screenshot 2024-10-18 at 17 00 53 2. Add database modal - Copy in callouts is updated - The help text of the "Type" field is updated - The text in the "Database already exists" error callout is updated Screenshot 2024-10-21 at 09 34 12 Screenshot 2024-10-18 at 17 24 43 3. Manage processors page - The title of the page is changed from "GeoIP" to "IP Location" Screenshot 2024-10-18 at 17 20 01 --- .../manage_processors/add_database_modal.tsx | 12 ++++++------ .../sections/manage_processors/empty_list.tsx | 7 ++++++- .../sections/manage_processors/geoip_list.tsx | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/manage_processors/add_database_modal.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/manage_processors/add_database_modal.tsx index 6289fe3953f3e..075ff0b6a3665 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/sections/manage_processors/add_database_modal.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/sections/manage_processors/add_database_modal.tsx @@ -137,7 +137,7 @@ export const AddDatabaseModal = ({ helpText={ } > @@ -156,7 +156,7 @@ export const AddDatabaseModal = ({ title={ } iconType="iInCircle" @@ -164,7 +164,7 @@ export const AddDatabaseModal = ({

@@ -178,7 +178,7 @@ export const AddDatabaseModal = ({ title={ } iconType="iInCircle" @@ -186,7 +186,7 @@ export const AddDatabaseModal = ({

@@ -246,7 +246,7 @@ export const AddDatabaseModal = ({

diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/manage_processors/empty_list.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/manage_processors/empty_list.tsx index d5e908b155feb..f021055dd2934 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/sections/manage_processors/empty_list.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/sections/manage_processors/empty_list.tsx @@ -8,6 +8,7 @@ import { EuiPageTemplate } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import React from 'react'; +import { css } from '@emotion/react/dist/emotion-react.cjs'; export const EmptyList = ({ addDatabaseButton }: { addDatabaseButton: JSX.Element }) => { return ( @@ -26,11 +27,15 @@ export const EmptyList = ({ addDatabaseButton }: { addDatabaseButton: JSX.Elemen

} actions={addDatabaseButton} + css={css` + width: 450px; + padding: 0 20px 0 20px; + `} /> ); }; diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/manage_processors/geoip_list.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/manage_processors/geoip_list.tsx index e09ac4e6e2c4d..0acb66ba7dd25 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/sections/manage_processors/geoip_list.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/sections/manage_processors/geoip_list.tsx @@ -162,7 +162,7 @@ export const GeoipList: React.FunctionComponent = () => {

From b495c371fd946f39341a557599033647f81cdbf3 Mon Sep 17 00:00:00 2001 From: Krzysztof Kowalczyk Date: Tue, 22 Oct 2024 11:40:42 +0200 Subject: [PATCH 67/69] [Global Search] Fix convertTagNameToId to use lowercase values (#196819) ## Summary This PR fixes a bug which caused mixed case tags to not be found in global search. Fixes: #196168 The `allTags` argument contains tags with names in the original case they were created but the `tagName` argument passed in [search_bar.tsx:180](https://github.com/elastic/kibana/blob/main/x-pack/plugins/global_search_bar/public/components/search_bar.tsx#L180) is lowercase. Since you can't have tags with the same name but different casing, converting them to lowercase is safe. I've also added lowercase conversion to `tagName` argument in case this function gets called somewhere else and the input is not lowercase. --- .../plugins/global_search_bar/public/components/search_bar.tsx | 2 +- x-pack/plugins/saved_objects_tagging/public/utils.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx index efc564089fb43..de9bb85f7a8a3 100644 --- a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx +++ b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx @@ -177,7 +177,7 @@ export const SearchBar: FC = (opts) => { let tagIds: string[] | undefined; if (taggingApi && rawParams.filters.tags) { tagIds = rawParams.filters.tags.map( - (tagName) => taggingApi.ui.getTagIdFromName(tagName.toLowerCase()) ?? UNKNOWN_TAG_ID + (tagName) => taggingApi.ui.getTagIdFromName(tagName) ?? UNKNOWN_TAG_ID ); } else { tagIds = undefined; diff --git a/x-pack/plugins/saved_objects_tagging/public/utils.ts b/x-pack/plugins/saved_objects_tagging/public/utils.ts index 38ae79f3ca033..fc8ec8ebd3029 100644 --- a/x-pack/plugins/saved_objects_tagging/public/utils.ts +++ b/x-pack/plugins/saved_objects_tagging/public/utils.ts @@ -45,7 +45,7 @@ export const getTagsFromReferences = (references: SavedObjectReference[], allTag }; export const convertTagNameToId = (tagName: string, allTags: Tag[]): string | undefined => { - const found = allTags.find((tag) => tag.name === tagName); + const found = allTags.find((tag) => tag.name.toLowerCase() === tagName.toLowerCase()); return found?.id; }; From feb5b79a96162b0259ecfd5d8216050cd074a3a4 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Tue, 22 Oct 2024 11:50:15 +0200 Subject: [PATCH 68/69] [React@18 failing test] fix visualize app - new charts library visualize area charts date histogram when no time filter interval errors should show error when calendar interval invalid (#196308) ## Summary close https://github.com/elastic/kibana/issues/196303 We're working on upgrading Kibana to React@18 (in Legacy Mode). There are a couple failing tests when running React@18 in Legacy mode and this is one of them visualize app - new charts library visualize area charts date histogram when no time filter interval errors should show error when calendar interval invalid. [Failure](https://buildkite.com/elastic/kibana-pull-request/builds/236562#019222ec-e8d1-4465-ada3-fd923283b6f4) ![Image](https://github.com/user-attachments/assets/2cdaca3c-9ccf-4208-b6f3-6975588eb5fe) ---- I investigated the problem and understand what is not working and suggesting this simple fix, but open to any other approaches or suggestions. To Reproduce the failing tests: 1. Create aggregation based viz, e.g. Area Chart 2. Add data histogram agg 3. Change minimum interval to a invalid value (for example, "f") 4. Change minimum interval to another invalid value ("ff") React@18 failure: https://github.com/user-attachments/assets/f8684b48-fb24-4500-a762-2a116ed55297 The error is thrown from here in the reducer: https://github.com/elastic/kibana/blob/23e0e1e61c6df451cc38763b53a6e2db5518b9f4/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts#L82 When we try to update the state using 2nd invalid value, the error is thrown when we try to serialize the current agg with previous invalid value. This code is exececuted when we call `agg.serialize`: https://github.com/elastic/kibana/blob/5ed698182887e18d2aa6c4b6782cc636a45a1472/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.ts#L200-L202 **Why don't we see this failure in React@17?** In React@17 we don't see an error screen, but we only see a log in the console. > TypeError: "f" is not a valid interval. It turns out that React@17 consistently executed that reducer twice. first time during dispatch and second time during rendering. This shouldn't be a problem because reducers are supposed to be pure (without side-effects). **But in this case calling `agg.serialize` only throws an error when called the first time**! So in React@17 the reducer was called the first time, the error was swallowed, then it was called the 2nd time and, since the `TimeBucket` was cached, there was no error anymore, so it never bubbled up during rendering. The root cause of inconsitent behaviour is here: https://github.com/elastic/kibana/blob/8afbbc008222dee377aab568a639466d49c56306/src/plugins/data/common/search/aggs/buckets/date_histogram.ts#L111-L121 when `get()` called first time we create buckets and cache them. but we cache them before calling `updateTimeBuckets` which is where the error happens. To fix this issue, we should make the reducer pure. One approach is to swallow that error so that the call to `agg.serialize()` is consistent. Another approach could be to always throw that error, but then a larger refactor is needed and this likely a more risky and impactfull change. --- .../data/common/search/aggs/buckets/date_histogram.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/plugins/data/common/search/aggs/buckets/date_histogram.ts b/src/plugins/data/common/search/aggs/buckets/date_histogram.ts index 66820ff0d3e94..314ee4d03042c 100644 --- a/src/plugins/data/common/search/aggs/buckets/date_histogram.ts +++ b/src/plugins/data/common/search/aggs/buckets/date_histogram.ts @@ -116,7 +116,14 @@ export const getDateHistogramBucketAgg = ({ dateFormat: getConfig('dateFormat'), 'dateFormat:scaled': getConfig('dateFormat:scaled'), }); - updateTimeBuckets(this, calculateBounds, buckets); + + try { + updateTimeBuckets(this, calculateBounds, buckets); + } catch (e) { + // swallow the error even though the agg is misconfigured + // eslint-disable-next-line no-console + console.error(e); + } return buckets; }, From 5c51e783e5aee29bae1087403b75e2236b9ec0e8 Mon Sep 17 00:00:00 2001 From: Joe McElroy Date: Tue, 22 Oct 2024 11:10:47 +0100 Subject: [PATCH 69/69] [Search] [Onboarding] Update document count (#196674) ## Summary This uses the document list count within the quick stats. Before it used the document count from es3 billing and takes a while to update. https://github.com/user-attachments/assets/9c29c88a-628f-4c63-99e5-d892a835e973 ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed --------- Co-authored-by: Elastic Machine --- .../lib/fetch_search_results.test.ts | 39 +++++++++++++++++++ .../lib/fetch_search_results.ts | 4 +- .../components/indices/details_page.tsx | 6 +-- .../components/quick_stats/quick_stats.tsx | 9 +++-- .../public/hooks/api/use_delete_document.ts | 8 +++- .../public/hooks/api/use_document_search.ts | 1 + .../server/routes/indices_routes.ts | 11 +++++- .../svl_search_index_detail_page.ts | 9 +++++ .../test_suites/search/search_index_detail.ts | 4 ++ 9 files changed, 82 insertions(+), 9 deletions(-) diff --git a/packages/kbn-search-index-documents/lib/fetch_search_results.test.ts b/packages/kbn-search-index-documents/lib/fetch_search_results.test.ts index 470f8ba602ebc..a47c351a00180 100644 --- a/packages/kbn-search-index-documents/lib/fetch_search_results.test.ts +++ b/packages/kbn-search-index-documents/lib/fetch_search_results.test.ts @@ -88,6 +88,7 @@ describe('fetchSearchResults lib function', () => { index: indexName, q: query, size: DEFAULT_DOCS_PER_PAGE, + track_total_hits: false, }); }); @@ -109,6 +110,7 @@ describe('fetchSearchResults lib function', () => { index: indexName, q: '\\"yellow banana\\"', size: DEFAULT_DOCS_PER_PAGE, + track_total_hits: false, }); }); @@ -123,6 +125,7 @@ describe('fetchSearchResults lib function', () => { from: DEFAULT_FROM_VALUE, index: indexName, size: DEFAULT_DOCS_PER_PAGE, + track_total_hits: false, }); }); @@ -150,6 +153,42 @@ describe('fetchSearchResults lib function', () => { index: indexName, q: query, size: DEFAULT_DOCS_PER_PAGE, + track_total_hits: false, + }); + }); + + it('should send track_total_hits true when specified', async () => { + mockClient.search.mockImplementationOnce(() => + Promise.resolve({ + ...mockSearchResponseWithHits, + hits: { + ...mockSearchResponseWithHits.hits, + total: { + ...mockSearchResponseWithHits.hits.total, + value: 0, + }, + hits: [], + }, + }) + ); + + await expect( + fetchSearchResults( + mockClient as unknown as ElasticsearchClient, + indexName, + query, + 0, + 25, + true + ) + ).resolves.toEqual(emptySearchResultsResponse); + + expect(mockClient.search).toHaveBeenCalledWith({ + from: DEFAULT_FROM_VALUE, + index: indexName, + q: query, + size: DEFAULT_DOCS_PER_PAGE, + track_total_hits: true, }); }); }); diff --git a/packages/kbn-search-index-documents/lib/fetch_search_results.ts b/packages/kbn-search-index-documents/lib/fetch_search_results.ts index c5cefdf67ed9d..1831920f5d4c1 100644 --- a/packages/kbn-search-index-documents/lib/fetch_search_results.ts +++ b/packages/kbn-search-index-documents/lib/fetch_search_results.ts @@ -18,7 +18,8 @@ export const fetchSearchResults = async ( indexName: string, query?: string, from: number = 0, - size: number = DEFAULT_DOCS_PER_PAGE + size: number = DEFAULT_DOCS_PER_PAGE, + trackTotalHits: boolean = false ): Promise> => { const result = await fetchWithPagination( async () => @@ -27,6 +28,7 @@ export const fetchSearchResults = async ( index: indexName, size, ...(!!query ? { q: escapeLuceneChars(query) } : {}), + track_total_hits: trackTotalHits, }), from, size diff --git a/x-pack/plugins/search_indices/public/components/indices/details_page.tsx b/x-pack/plugins/search_indices/public/components/indices/details_page.tsx index e8868663a9a3f..ad5e174dd6e4a 100644 --- a/x-pack/plugins/search_indices/public/components/indices/details_page.tsx +++ b/x-pack/plugins/search_indices/public/components/indices/details_page.tsx @@ -190,7 +190,7 @@ export const SearchIndexDetailsPage = () => { }, [isShowingDeleteModal]); const { euiTheme } = useEuiTheme(); - if (isInitialLoading || isMappingsInitialLoading) { + if (isInitialLoading || isMappingsInitialLoading || indexDocumentsIsInitialLoading) { return ( {i18n.translate('xpack.searchIndices.loadingDescription', { @@ -209,7 +209,7 @@ export const SearchIndexDetailsPage = () => { panelled bottomBorder > - {isIndexError || isMappingsError || !index || !mappings ? ( + {isIndexError || isMappingsError || !index || !mappings || !indexDocuments ? ( { - + diff --git a/x-pack/plugins/search_indices/public/components/quick_stats/quick_stats.tsx b/x-pack/plugins/search_indices/public/components/quick_stats/quick_stats.tsx index cece2b1d39910..32590cf3efa47 100644 --- a/x-pack/plugins/search_indices/public/components/quick_stats/quick_stats.tsx +++ b/x-pack/plugins/search_indices/public/components/quick_stats/quick_stats.tsx @@ -22,10 +22,12 @@ import { Mappings } from '../../types'; import { countVectorBasedTypesFromMappings } from './mappings_convertor'; import { QuickStat } from './quick_stat'; import { useKibana } from '../../hooks/use_kibana'; +import { IndexDocuments } from '../../hooks/api/use_document_search'; export interface QuickStatsProps { index: Index; mappings: Mappings; + indexDocuments: IndexDocuments; } export const SetupAISearchButton: React.FC = () => { @@ -60,12 +62,13 @@ export const SetupAISearchButton: React.FC = () => { ); }; -export const QuickStats: React.FC = ({ index, mappings }) => { +export const QuickStats: React.FC = ({ index, mappings, indexDocuments }) => { const [open, setOpen] = useState(false); const { euiTheme } = useEuiTheme(); const mappingStats = useMemo(() => countVectorBasedTypesFromMappings(mappings), [mappings]); const vectorFieldCount = mappingStats.sparse_vector + mappingStats.dense_vector + mappingStats.semantic_text; + const docCount = indexDocuments?.results._meta.page.total ?? 0; return ( = ({ index, mappings }) => { defaultMessage: 'Document count', })} data-test-subj="QuickStatsDocumentCount" - secondaryTitle={} + secondaryTitle={} stats={[ { title: i18n.translate('xpack.searchIndices.quickStats.documents.totalTitle', { defaultMessage: 'Total', }), - description: , + description: , }, { title: i18n.translate('xpack.searchIndices.quickStats.documents.indexSize', { diff --git a/x-pack/plugins/search_indices/public/hooks/api/use_delete_document.ts b/x-pack/plugins/search_indices/public/hooks/api/use_delete_document.ts index bbf43d684de56..4c5a64b270f91 100644 --- a/x-pack/plugins/search_indices/public/hooks/api/use_delete_document.ts +++ b/x-pack/plugins/search_indices/public/hooks/api/use_delete_document.ts @@ -40,12 +40,18 @@ export const useDeleteDocument = (indexName: string) => { queryClient.setQueryData( [QueryKeys.SearchDocuments, indexName], (snapshot: IndexDocuments | undefined) => { - const oldData = snapshot ?? { results: { data: [] } }; + const oldData = snapshot ?? { results: { data: [], _meta: { page: { total: 0 } } } }; return { ...oldData, results: { ...oldData.results, data: oldData.results.data.filter((doc: SearchHit) => doc._id !== id), + _meta: { + page: { + ...oldData.results._meta.page, + total: oldData.results._meta.page.total - 1, + }, + }, }, } as IndexDocuments; } diff --git a/x-pack/plugins/search_indices/public/hooks/api/use_document_search.ts b/x-pack/plugins/search_indices/public/hooks/api/use_document_search.ts index 7a74391809f60..d566b90916892 100644 --- a/x-pack/plugins/search_indices/public/hooks/api/use_document_search.ts +++ b/x-pack/plugins/search_indices/public/hooks/api/use_document_search.ts @@ -36,6 +36,7 @@ export const useIndexDocumentSearch = (indexName: string) => { http.post(`/internal/serverless_search/indices/${indexName}/search`, { body: JSON.stringify({ searchQuery: '', + trackTotalHits: true, }), query: { page: 0, diff --git a/x-pack/plugins/serverless_search/server/routes/indices_routes.ts b/x-pack/plugins/serverless_search/server/routes/indices_routes.ts index 6b7ba424fde22..ed68cc77fa41a 100644 --- a/x-pack/plugins/serverless_search/server/routes/indices_routes.ts +++ b/x-pack/plugins/serverless_search/server/routes/indices_routes.ts @@ -107,6 +107,7 @@ export const registerIndicesRoutes = ({ logger, router }: RouteDependencies) => searchQuery: schema.string({ defaultValue: '', }), + trackTotalHits: schema.boolean({ defaultValue: false }), }), params: schema.object({ index_name: schema.string(), @@ -126,8 +127,16 @@ export const registerIndicesRoutes = ({ logger, router }: RouteDependencies) => const searchQuery = request.body.searchQuery; const { page = 0, size = DEFAULT_DOCS_PER_PAGE } = request.query; const from = page * size; + const trackTotalHits = request.body.trackTotalHits; - const searchResults = await fetchSearchResults(client, indexName, searchQuery, from, size); + const searchResults = await fetchSearchResults( + client, + indexName, + searchQuery, + from, + size, + trackTotalHits + ); return response.ok({ body: { diff --git a/x-pack/test_serverless/functional/page_objects/svl_search_index_detail_page.ts b/x-pack/test_serverless/functional/page_objects/svl_search_index_detail_page.ts index 161be50cae410..656c75fb308bc 100644 --- a/x-pack/test_serverless/functional/page_objects/svl_search_index_detail_page.ts +++ b/x-pack/test_serverless/functional/page_objects/svl_search_index_detail_page.ts @@ -42,6 +42,15 @@ export function SvlSearchIndexDetailPageProvider({ getService }: FtrProviderCont await quickStatsDocumentElem.click(); expect(await quickStatsDocumentElem.getVisibleText()).to.contain('Index Size\n0b'); }, + + async expectQuickStatsToHaveDocumentCount(count: number) { + const quickStatsElem = await testSubjects.find('quickStats'); + const quickStatsDocumentElem = await quickStatsElem.findByTestSubject( + 'QuickStatsDocumentCount' + ); + expect(await quickStatsDocumentElem.getVisibleText()).to.contain(`Document count\n${count}`); + }, + async expectQuickStatsAIMappings() { await testSubjects.existOrFail('quickStats', { timeout: 2000 }); const quickStatsElem = await testSubjects.find('quickStats'); diff --git a/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts b/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts index 9e6a46e76d8f0..e7831d1f91b3a 100644 --- a/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts +++ b/x-pack/test_serverless/functional/test_suites/search/search_index_detail.ts @@ -130,6 +130,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('should have index documents', async () => { await pageObjects.svlSearchIndexDetailPage.expectHasIndexDocuments(); }); + it('should have one document in quick stats', async () => { + await pageObjects.svlSearchIndexDetailPage.expectQuickStatsToHaveDocumentCount(1); + }); it('should have with data tabs', async () => { await pageObjects.svlSearchIndexDetailPage.expectWithDataTabsExists(); await pageObjects.svlSearchIndexDetailPage.expectShouldDefaultToDataTab(); @@ -148,6 +151,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await pageObjects.svlSearchIndexDetailPage.withDataChangeTabs('dataTab'); await pageObjects.svlSearchIndexDetailPage.clickFirstDocumentDeleteAction(); await pageObjects.svlSearchIndexDetailPage.expectAddDocumentCodeExamples(); + await pageObjects.svlSearchIndexDetailPage.expectQuickStatsToHaveDocumentCount(0); }); });

D=SvM*Uf^(LQ|(!Y76&G+nqRJUOh~_ z*(LVp99_DT>-wSjETKESg*k5R#MlauH!iX&cTHGnT&HP7h|uSRkbqM*yp2TsJlsK6XK8s;fS7z zWcj>zF|p63TXAHs*B%k;pG~$WUnFOS-Ns(J?J96kL3fTRy77h-PF7=y9#31thqJFK z*xxT8;M={CkmINuvbSdGZT|D=cf1XCz42;tG{#JJw$Q9HE0DsqmDT9Uaf=B;OH3I z6k{|;igSK(LEAxWq~3rzrcSEUm&EiydWe;3JYL?H@&5b7qRZfOqXMyF1{v0{ZqfTw7-kb;aQQ!?3-hID%Ize zth>u_-Y+%8f0o3KgcyhpsVK_mDCK(76-;!<0LI|&-#;aHAR)4#+ng{n(%FTgaX3Uj z5f15*!l|F_Z*G7_PIgWe4(BV-eW3=iXx@|vx3ukQ4gzMG^{X!LFFQrPP zG8*WGMq3i|tI)2ozCIvefJ>SQRV^Gus)zEsXV^#{NjK}*^io|6MU!e}S6YGxBdq;&322@(#&d=CZD>RqEn|a2llBG=wb})Xl=|o`kfWZXz~Lay~&Gdzv?0? z!t9yrAE<2$;H^{PG-;~`DV+}Dxh-W6hN1r*1-Wyfh2)*uRbjeXI3~7A<1IL5s(T7PEb;^xAFq|9r#7Vkr@WLds_0 z{{gN;ne?1eC}@j=?699Lqea$nhnAPXBsuEepcvN>`=iP!91f6^Xz)GJFJHCXevo`> zSS|yPrKCIPN2z}tHoIVby(1zvCgy6sr`m{?me!rRQR(toyVGS0P$CI5eg|dbv_ii{ zYl{7>^HtdswH2D$CEWuL12)8kC8eaGIGsq!+Eo2CiAA;5HP$TXx?3vPx8X#Z1nd@O z^LTdYcCP)VD$khv5sydp*R7E{m+~76&lr#?Ll)(0`G~HkRk{e&9uE@-n7>nQPfD|} zG;CLDx!#}5d+rxSI$JEuO2`21lJ;I;1@5}uB+D7$rV>#lB-Yp0b$+xRobG{r*oA?C zd1!aG@euUjTVsA;*B!km(*J3wtp$pTK?iFii@lG*JBSGaRG6q>tG-_-pvC|2OUUC# z*enr5;U!uYk84mZgS{CgeuQMRcZIQYmYkf`f2|S%+}g$8yP*Qo$NW5x!wE)o$}FFj zzfPZkB6VhFHRGT!5^^m#CaKYh#^zbGMOEn1)g{fw`b@MJ!$OF^`e}^N)KXNVo3muZ z=v6I9wUwuCB0i_8v#SsW5}2*4*KdBWtR%`T%IFqiuF!z_*^R`@yrhTiRt-paWU>Q zsaci5RP3f&3<5$wzJuz4|8qtFwkYsdD|Xn(Wt;rG2DYC^helQ&pHL>N0RSq%tqYET zL0_X?6%MN|r<|OKmG$BlU`dbQT_m%<q zbtCF0dtM0C*Ine&^Io0rSy>te=(uBqtgO{7gZ|}h2`UiHADx&;_+X@DWgQ$G42smb zu9A>gJae9!YFWIdx%c?SHp&lerD_7_-ohR;T;*MdgF|Dsva-TbqIVU&?VBr&6jY0J z9_VaibFK#3o63EngQd=I{U+PFSVK-t%}o4LqlYc-gnfqtTT5$(MKrh<>X8ZT_hEO{ zii`$Apqztbn1HRFiwi`@4v4-Lg})rsS#8_#&hKaiEVC$X9KsOL_zi8`txLCiJ7VBO z2mcL9Np=_;_$MwAaCkZvoL+$0o_j6m>gZTlAwgb+=A}x?#H`@Elewp`2l~O{OP573 z;b#yD@gVq(*~+S-_CeenI|)kuh5>$P{twBZAb+5kKM2n@5HO_E{+I)H0tZnYhMJj) zgUx!5isMl7*VY*d#To;=B$pN_OpPm)dV9DKy0ujOZ2G-xpi@Oh@+@khsTqDKqmVBj z9)-)dT4BEL02mWEe}4&YZQC%BNzdWT-5`Iz)+uW|sIi6_p#)2L}g;P$l<%{;V0? z61Fn|MMEN~eO4TgyJ^=~YYY3^nFr@)QWr1VgI6kog>yl{r;nAYt#5g-2AkzL*Tb5X zU0E3(#2nT-+mHQcK(y!4U4}1ehtTDHxOz7o0J9c&4l`!(w)GPf%}Z0^(q$)yUXzp z{YIRMu60ZYW|~^>&M-BiI14X#C$mn6CYPlEU(VQ!6rWcIt72n;Z2TXV`!+iL_)~^&bnSt!)Ipf zI&2vKz*M@`8dVWpL7mHH9DUHyfmWL-dy~sWzlS!?;enK^sg?v@5K0P^czdycN9+o~? z$=$5(uB=dPjLX)G)X4S@C9Lk&gENBb20SS2r?FZeTpm8|zkdhvP&PX~w^wemyROec zepmxt&fbQOpOR>_urZMi&$J>pQjWEn30_VrY|-d700+N+BJMyED}aMXAkgWw-S#%5 zMq)1p$Ike^xoj}g{{YeeSRpPMT68}+G3pGpHlz7IUSE>=CccbA^Yfi6(?DmgSC90_ z$w`4mCe&nPF8hbLyj!|@UaYRK74D3)NQgat&{$|R+G~|kp7{9qC}>)U+a9KK8~8qa z_V2%Nr10@=Jsguio}eP{K$hDcd=Y#N`+%)ief>5DB`^aua^|~vdpdZ_{^~?G#5_j7e5p>Vavn#GemD-)W)Xa^*ZfA@a0rHIO7rw98$3VHI_ZL?W zP0314P?x4Ad;6Pg>Fmt3xZBYP`kJkkCYf^keR7qmbCuC?%iX-eV%hI|NZq_9w_7}( zot@Mwm3>*?@$P#Af`g+mn%zcEH!>>DdI=%nactHKkW?b-zJ!1KV*V&0uL;u=kmsN5 zZNY)>?_T?H@W9zQ`@2Uv*cC8#%`?-J&Q|>|APCm$*LpsqOv^@#{oQr!KCKpu5VLU6 z^+dbNNeKMu$gH7G`+WwBIni-E`8OcTVWZR$-Pe~-8U)VkHBl3^%lUNSrcAxqF_{f$ z5}V0&Ra`Joa3ArbHQy5a$o;jro?QB)sHyv@;bi-7a1a5<{W+iAb$RP``&@p$ZRh8! zC0!LDt=X(dpURne(B8rv%KHKho83M@LH?8^;kT_a*Dshd7a;LQB2e$CpX>N zMftiMu*>IkcQV`J;G$aPL_kQL?oE^tpVs&syc55?$HoWXtBo2jSDMCYMTGO&SzM95 z!mqR-wf1c%T-(rsrNeDc1>;5n);0f087m_37t35dDE%?r*wh9pLRFh>DuM2@``*z+ z^IF;6s%H6E&n%44=*G|2`re*Rz%@U4%hv@ItgaPGB}4LZou(E;o^RH=tVm5aSS*4C zn2%g-)w>=`(MzXu`n(mX0B4BzYfx;;gVjRGZUn;cW|)Nf^}HIbCQCobLL|06MlwGh z=sL_&g?4#-w=wDSx(RCwWqNNTdFUgp7pd zFo9vlNUMa$t+o&Exo$eEmMMO6l z+eq)9y7x)l$@j-wwL))AZcE}0@6Vw?{zT`;($`X@?!oRQ1eZQ)=Srz6zi6PMD9GZE zo%Z(jM(gz=q2Na#(Z|u*nO3cen+iJQ8zg*CQ2ieqyr<19Bo&4cpyR8fI)%-w{tg1) zr`OJoz89RhvH5CUt7+oeHP9KL*`OKNvK7#Ui;nI_grWk5rHjM40uklk_^@GXQfzt( z1Qfh1ChG|%oqesIV%6VO0E(J(Be$c%ueMrG#PDT5Z^KiA5%5#F zd|xK9*>mq~MB_+Fodyjk+w_#*Y&!q$7>-CN7165Kh*vHJ{tZ&8-nL%7O$6#jJtx!n zV&4XHa$YAr==5q&fxE?Kt0g<8_8eRC)ZaG2nn7gbBy&5Grw!(0YOXc00^^1fbsH$O zs0EAhpnO3^K8kSX9JaDtU){td-FOx%O76GDtwi()t3Q=a?Q;+DkZSIxi0e+5X2lo3 zb}5qT;&H8uE<)drH`8o+HWAa?&)z&}_>xnI-*C^@3plNk#LH{jvaG$j^#JDdETWq9 z2yYMM2!TUIFP7m%9>aL#}6T=vX87`&oe?B)7d* zcGnA80_%Dc8D{4C)VaUhhV&|B3?h+Yft+q5Eat0etAuD5AFpS&aF|SpuRVVPTsPhZ z?lH3)&GWNR*f*U%3QFtIX?5pXm4Y9z*%7d2*r}-ExfG>AKy< z8d3uw5q5B|3nY~AaXs^;pDdhhxOLz-0pn`#p8d{10LkEXEO9smnFa&WI3K?ZNxX#L zG|!z|INBss*X`|{)77y%0|z-HrOJi~S_0q4gtrg`wNfw~_WM0Eg73qks~qo5NQu8j zFTxf(0H?&!vjZ~=67Bo&mAJW#m8owYh&@x;;)ip}=@1nBuPcOCq` zc>B4JuTN6!)7b`|jl~x=Td;1^84JH{7|qjRy&k36xVOXixgxYsrDcQH&nhW9?tLE% zso87+jepgqGVk_BCp6Mm(_-Yfyy|%;-xdQkA~N#h{;oR9{cY~Hw&fAwp|y!2MrUpyq*D1G%AJ$9!}=;-Uy&k$3%1rHA4a8X8vyNy5)|2F&BYZ zzf(|L*!h_qOyBLLyiAwbY_kqi{3FW2F_I#^<0S+Zc8C?``X&@!75*>4Cc&e3k(hk` zM)OKjCw+*)my4N;on-)@2BXE{;1||l8G^EXAUNc&vgex7t=$4AF$2|RGKEvh+xB)h*iAKqVT}MiEbMIxfsi>Q8gSBs9?|Uv5UVhI137lfKt}Y-V14)Du(Ib4vYX za)2i>#gm%U^kty!TRzK;Mz@ii@ay)Hlhlrpb0B+D+(~*7R&j|sEi2Xv^Z4>xyPr7E zs_g|GQx~i0etKd2lt?{2RPSa7S`w&~i3VO5`D;~KZ&F2>LvOH;p*UiI0~hljW+YHe zhZA3`%{J@4U|Z+2rBs1vYv4(2qb~SU61bXAT<3g8nvdgR)SApsP9{VI{*HdI)JM=p z`0innxdAbAw3;1xCK+p~e&)=MM<0XbOSD?9Knzg)VafvtiGCWI?XWt3UmXdsLtiQO zC~a(Z{H!O|$bCv*$Vi!l`vEUyCA=l}l%it#OJIfDB2^MFeAbi1g(`X4aqu}lgr^od^j`2{K6cPnlt+BWCsf zexZR13m7%_s`ml4IDZ|aGo7r+_dMna#RBxfnI?MSTG?n zvPPcnqd@3v!T5F%D4UKo+xe>XV0@n+x7rR%h#WYxR)Hh0&1;K&t1~}HNp?fC5)$$} zh>cTPc6Y$rUC@cf3cI=ixAsMk~j>VUSF`^dU*7_UYy?^`w?)|(J(O? zjjn@$`QkmaLqP;g?%$^im=ln??T_0?LW_L`R+bu3QXJc3wMl2{Z+^uE1tP*_9FOfPRQvl|k~Y)b{-DW0ej;xp^@`->{InwhlepRixMS5E$?Gmx)wXlK@l3TJ+f-zRF2tRAL6NSr8(UwYOjv+ z!0$B@0g`9?h3_oh&oO`6hLss&6{B;tz(hlUoyqhF4)gM@;A@nV*%4YeKjm zO-WF*t3;xoyv1^;dYs3>^>Neixsb!%nFO;sA7D%t1yL}74=4Q;pwbR z4USH$ms>tEnf8YyNZj8Qs#+VyyzL3wS&+T7@F~2K;)m0d)`6h3N*21Qp zb*Nt;WzdV`PQ2?U_P1Ti`XP9)KXlq%j7l+Zx#&pqtr=Aeo2)j|GSX&SrNnS(S(wkv zpKE%hy$3pPj$UkDPD#YNqv`P(70{y`@wUgMtnwWci&vgOL4hWwY3z%r@{|(_gory} zD&=V5lv2rbSHAk&Umf>j1*1xjm#arogSQX3EOsEa>M^n96|_a13ZN~^DX&sGm0HDY z3JYjy71+bt!?Y2W3uP+fw%uRGdjk@rBblsnv_M3kvqodjp^w-jQ_>Xww z!GYLUW1|#+sJ=eo`QA*SBRM9)8t`Nq@Aj=yhSFHi_&{aS^ef=DT!O%_`7fMI8q2#~ z->|tkCXm!N%wSWPa$M59?Vg=FIuZ4^e}(dhecLN|jL%>|{+Q|4*f48e&~9|7V|p}c zHK$u(qo}#Ys&<(L;h#_5A52LCz3%<{i3t_DP{u|^j3r`*!#+;RC@zyRrg#cvYi^zZ zBftO?mJ;>z<2Ku_q)POU7t6sZVpw>{WkV^sa+0=8MZCy8`x4Hhvq4?QL@@8ai%_eH zaf|sfGOWi3cJEDYrt&#@G2L?89*Nmn9aqVYd;XP1%&KGz-=hxM<{cvM>&GM$Torla z>IFT6UfhdKjN%KF0z#no)jqvfOZG6C1j4=_^{Fh~Tv z_uF!OpgC>kZvWpJkHAGP3kj#?ahr~tHHe2ZE%@;A4m{dCZX2L@^*2bdu8v93OEX_} zCW(5h11l_d&bHgryhJ=-k{IhZr8Cu!{5AckjSaqJ>wQeQ=9JLeSp_7iq$&(<@kvpw z4!6+$S{2Tjh80;sXFtKW2ixH8-YLY8Sq;5b0~KW>k|cWd7O3P>y=~t2-S-+ekSMsf z; z4+RUJoMElTz5XKJZ)Lp0Ly_r4vadIb$=M1DNj@R4oY~Q&2H3s6%asT)+&1LwDX4cb z@Mglo!sShHdHH#3jXdaFluvWU;~4mc3n9fFK4iB}!g#)oqLEl|XR2=}N86VzA0`K@ zpJyMgU+i}L_>}oo^rwF=J+d4q2O~?BiXZEOu+v#=BF=)iwV13n8bV=vZP0)pXR$%T zkWDDq_gsChXfhqsKfgIRT~Y-RkkQCvR8Us~??41=wZBnm8Qi>;I#Vyk{s{5gdPPm| zYo@_msI-C3zH$N);0K}>Lp?}42pF z>V8aWTDc5GcKK_5y31^{iEG^<2FABk(T!qVYAXE+U4WO??t)cK$LS{V;dF^q{LAj^ zv;Vd)C=$+HAix$)kGf0I?HP!Jf<$O56bimOTP*J{V#?%l)@!mNgkS0Mj>s%y=fzR} z1VZ}79d;7{sYzkWXa`Y{&pRt`_A6!s453f36R2LNqr;7i8)jCvcR(bbS=7cMr@Ex@ zON%HA2ud_LbRiaxwZP;I!BF^8v1t|7Qm2W!xCv-|zZ4YM;%kYTSUVGMN}V~N`^}7D zo~h2=Y=f!eyATJYOYPYoM-=+-+=>qkvADSvYtONgB5z%tx%)xBc2P*m<-#<+Z>%K- z1w)LakrG=LF=oD;=^o*kVcoREgD|{465&hHlV^_y6Vz)%vKpOV!H`Y9%_=Iym>e zsH9f)Xdn8jM&I5^`W|SSVgGB;4R3XP$)?y>wD~p>eK@-19F5JZSgOtJhAEg>nxIH=BgbRZiCA_i3gpp5=ng&XFx&uU8pkGp{mh+gL*AHpBVQ zaN{1<)BETAQL6b%Pm8HTog?}O^LJP^`fPF=)UuX3-^tWLWzOS%v6V$0?fd@i24{9= z66mNlCzAP+s?N_Oyv_D1%}$q(BAramEU|3l`b~?v0@kBCF~7AwR^#S=@}cNAyFPLs zpHHBpz>LZ9o0=m*i=%{KAN1ANRqf5R)0O9qA8#hR)rJENB_JN*YuxjvBI9Adjq}g0 z)IYZT$ZVQcuDsd!XVP%wA@mA`k}Vr?EV%naTT>xp_0yeBU*4{8$Jmr6# z7|$o{@t;pamd_$A!iiMD%nWoU@~EY@00*&opc{nsqCP8iV*3x4n&5AOjulK)WH`CK z;C+k75*(6e+HC2rzWb;O!7hGDJsR+qG73gHUx{%0^tS4jzb~+ePX~3j8F>FzgVnN3 z>Z;>uyGd@5w!5=ihSime9u5S(;7U#nR2;ClB;Q#q|03i5MZm;gg3cGfC`09Wr}p%F{8 zX}xMvcGOB?GI_5|Ss&pHco_szllgvRb-dq>(`ZA~LRhSCBuK;;laiB0c3CJd!?v+o zZYA)-FspbtTXT6nYUALs^+ko3&wjqc!=llM-pR1*t~YJE)4HSoOOXqPqKsUaYo!K=4Q-9zXgqK=G%(M9@?ZWEuheXA zy^lkxu>CyC{*DfZ-9v`hu`=XYfr`IgVLo3{BA!q)7dpLvONrV>Pv7-y06ZuQ_*HOF zxdA|_BMvMcPZv#3ot8{0%;me`ufcv{-_*Lb*le!3)hB?>oGwJ{U39H^aa0Wr5<`%j zZ~eqXWwclr2^kq9BoqMV#fLdU!^?+$;hl|PEr*(KbzmxGiNkh_K9ng#7ky(qD;3Fa z!30us)eW9!e5U#O@r=v9^@zgKVh>MduqI1n0YT!g)39yH5hMes*p;L8p!)Omy3dRh=U~{^5ztE)9t*iJ7@;+Xu8w{z! zC}0wsMFMdTe83chw~_M$bc)WZgp#29V~ITM&>i&)pLb4G4q!mxpX@?Rs9{TtMB!cl zrOva>YRSN~9UMOIF))Pg^P;+2ICy!zN2*2V`1I+E8fR~9t~c?BiROuKRb6mI(DVk| z0E+|0$vRUENN`9O*g{495RW0{3Ll^CL-!|};Yc*6LPItb{i6Iz+$@$q+c zx`S`+XpZC@at&TRJ`c}sM*=<}^T!lE<{M+WGkJ+#L|xz!Wl zYAG)kc2ecWPA9_H2KNd%CtWkX{yTP3)DvOuL&`sXl3ZM)IXzH*#ubhW3HiT}AVHrr zJD>1Aw-)2?Ew-D2CR%8T^dT%?ZC*6|MR6ZW6D~sh;f!)y1@F&%2W$W!JC{9PC=Cc) z#S1W3v+9zTKiWfK<)Z^HfEO1xn{oj=hB{>ihg6G6_pePG5pOhX=`YZ9FT|wUbme>M9)+#pk4Vq_cU7lFEK#%3o!nX~^4yvQPT<#)I&~ zuXNfV+D>wVjXh|pXggA?Pk^4)UY1@T1%SfN!MNh4Mt7b-d6+{ zwa?=4wm}_T^fVGo4=;a8@(`fj`f#m-P>JU*^MGcrA5FV*rb6x}9=sNp(k{)7uX99F ziHf39Q8UpCcVADGqjSkf%om{sxB>P1orRa|tf``#pz?#2nL%xmlP4{M@pN)AYQ%Y3 zTi$zi%8+l0@7}kW#kgloQN9nPErO{VnAG+Y$Ppyy5n8tBxm)9$oV6|@Q_i>IV!_9o zHg6-#7^Fu|BUlST?G{e~pB2)~E4Z>mfXNPwOXh)X$7o$)4KeYgi_^xoEF={sTC|Q6 z>O;F=*^&vE(t%>cz=Xmhm`l(ViW~<7g40vT1Br_0hV)SF0b1frr{rPq9K3{O+W?nb*t#$* zK^_$S)?+*2lv9Xc^^d>)t;sADnjmr!l0*;SaNrUKDjbWt_91xSzlr>)kPz>nG)q-j zsRIJe;qiHCd}58rpOi3-bRuXZtrwuQS{Syr%)>t=JPz5aLw|TQZg~pCcsodT>1QuE3332i77jvoIUE8TdEK-vd2KBAV6Vizh`)F^q+fPuJ|0bK7_N>#n*xH??oT1772t@H+}P z_xxJy&4kpP$1UvKw`>y4VxAWJ{UW~4l(?+esH36c-^PH@^eh-3+OZXG0XZhrwEE1Q zHpB%}DEQaQ;$Idd9C^WK;yP6OifR+*J(w&#fzjX${V@U@=ioRUtW!AtsHW53BvM{! zzN19V6uQ!hEJLBALb7>&Z4D&jO>2G>%Y8JphC<2}ku24dax=Y6L-+1?L1QxA8qFou zRA}q47cOP0vL%nwnm*;YWNZ-KvaZVvfy4c)%Ja`j!i6a2N{LC&p03hvPuRvlZLq2Ln_FA}AHD&nytwG)SNKSmt4c z%SlU^3rpBwmx@$)j5RBf%;7AM*$&`+);WEXJHT1n1EBAXIA8i{m=P{^G;Eyz$R^Y2 zv%x(3iK$a!ry;D#Or5aYo7)jpH*!aE3t}}yp6JYEI?aY~K+=Gr@XvSr4NMSb$UucC z33o>ds^JuiSAl$pXix~wNY8PmTL4n!Rp0Zx-yTcpao^tB-5-*C6WBlVKZtZLoL@Hc zSh|%%=bR!LGL{*B7(c%T{lGcI)+7JOZe8VSK5XmaP*Ly2aDuHqUvF{$9bDC=vZ$Jl zdSLg`j5>hh%3Pt5dMW*r?Y}<}Fv=lVfk@-JqnD zjE#u+XO;ac3Hncg&`)3|LewubCjx!cCe@`_+-#DAvirCoQ11KYoNHuFlsYzO_;m)|M~7dD$Y~A#HRt~It^Vsd{HcTljsk<(NP6PggAf;|W?h;4CdE+>`^lm; z(%Qs7l6mCqW3;s@vs)N?_^FoBuE>+vk^g@l^PQjn9aF9vB8q`Ewz`%m-d4GkX?%<| zPH^W`J-sKvA~wR|e}?IQULmIgv8T57N|IbRhSyM~D@(3xf{9L0WZkSXBHXr)`M>|i ze=QT>z4{x{%!k#RgY#qqI)+J?S9?UR92%&=;)j(vQp09`h0YntSXT1K?dnURaPmq? ztd~@ANH&c@zzMfR?gfsg#^$q)Kzl(ZU0w>0#OizyhK9H@p$i(l3L%UXaTx(I>|XL; zxWO3>|HH(bG6R$WW(kq{;rTwnUn1;X$8kYMt{x&PfkcMi#J2D%iz9wRqm>b;e7})f zeT-L?-%Cnp>5HdRd?EeyP?z2I_m=u&6rin3N}KDo$a`M0mjfWo5qz(Qaz2#Tt5f8g z(j%wUYvJUmh;ZtK8WE|9;r$HEH`GC_LR8~Nn6)dUk%QJRMA4+fU7n>@`=I|ttrnpa zK&`&94Q&0VC@s!b%TakGF9aIe@}y#K)0!nW%!{DZlT&)OArixeQVmS)6;cW7n+u~F z840}4)#PGuO3id2E2~8KyOEWeJ-TVCLlqwnq3hJeoXb|1gvlQuH|K(*q7{@8_^j%E zAU78bpeFH<4Nl!GjQgBog;{%HlG9YjB`J5kATX9hH7*L7&bG6IN5ueO-A%Ouqg|Vt z)vBtixGeZ9C>XM9i$FFrf3^Yx`0P$A}S7(yN1_7W6O z${~b=cq$(tB0CJVmIu78*VQxCg9SKHXA8(D7%KR2agb)#Z!(WLh7Qm>I7Tgy_D7Dq z6;~S~1?#p{f&Mb$^&luq0ZB-)Oi0RVecEBf$1f+QOsq>GOEvo6Q~FQ5Xb%VMxMZ@BnUs;#Ssap*CguMt{jKZG`c> zE*5DQmEe1jAyuqReAE()MTy)z;{G7`m@50)Q}qhL^lR0wy?x5!vQly3ch z_n`ld2js&1qH!5jvo}9aQzVNw^3SdC`Sfi0wvo?JvuBE!wSY-8h8~3IVJud~shDQ= zez7Di@X-4G`>=(bSOEIyX%Mn@zr2^9R0VR2C~b-t1LS|R0K#pO@x?QW95j=+hRDE2- zyBC?|+Jza~@5FC})RE#~^AMXigj&K~2cr^4<$b#pjLYJQ`z?JaF}eEx+!_A8&;I)z zB{4zU3il{9x~DF(J3DbXILhRvq{+{g^A?lLN$0BR07RL*r{85*;3O{!b&OQd@rT4Rn{)bn(Js!qWmKuh4mgh; zTxo(K%~)wYZhKtZh5OK73=UNMB_b@9{eNSr{6BN99v3uO>A*>9lUuGG)~J{o%z~6H zw~8WYbaGTxD1E7pM08YJ0!nCnb#On~S!0XWBrXdMNeJt|cZ7dM$$zS32;g>}_kRXw zUajc;t}iki3dToR4W1A(@Byb82eIjy0DzLHXjXx_=*EBj#eZ)p6{0yYH!<~C=;haI z=yOxiWU^4Qv!rq*rv>0+eP_RG#53|T?hhvNgI6dN(kb#qI7^^AByD|tzd|gYMb3Gr zLEF>QcM*k1c};>=@bq(s)s%GAsoGQqTb= z#yC2R@f*xEIF?ba7+(^JnHUr+74I*kdf2px8-=_$J(8P6=N6i{@rptMh%`&HYVd zJnS}1zDJT+%tTV~uxqf?(l-+CQ`@Y+$sPKK@qdoRPPek^Octm1U_6| zCkhst`<2>)l`<9jHZwPAX%>9xxG8T!op+$K;DsOoS-WO-4Sxah?oUZoBT)NP7|>#z zNP3y&kWjm&y*y%Aa{Nr^csXHT+ipZwt|)ymwNPV0ov!)Qg%uL5sp8Acul{eJ%f6@h zsL9i+aCAI}%m4XpdkEy$ph|oyEE$Y|AZlLTEubdI+QY+x|9200wpW*azo<6x$vyhq zLvj4s{(cu2e)Dkri7F1#3`ENyG6~FZMMzYV=`HfEyd7nGMxt!FT6N;l4QqKHBJh}| zkvtjO<$F|H$mb5(cne<M^pL)GITR5NRsb_6%xKKN zzOF~6vtdfDe|1zD!SrmvmAbioHjW~k>+E@~UZj@eKx^@Roa!S2!D1AM>hsQPoI2UVEXj=J| zTrU0IQs{y>67IbVm775G$R6`QehXoZmS5g?m9F{uc@7Sa@9*!bRhmM4w^zPsMkXf6 z+BJ6O!oq+PW}v{#SOF6VJ@o=s>4t}gr8FtY8W6X=zvjK8ySLgDa554W8t&HEx&epS zK!>6+Yczyug+6_@$0mM#Bv$g#2qu$$KEB@9@kTC7CF zrk2T8mMuXQURdStTseTUJ{>VOKE>9(S4ATk=1B?RSQfP+arx_ zDkds>moE3p&nls4G1{|Ke z&2qB{H2U8`%YC)XlQ7!$)-)nhr_Jv#hUZgB(ZJR2}GL<(0}*? zupC;c)u>%(w90YRAm}H=PM?8qn}Fog^0-b}ql?zZX*EfA!MDDi z$?)XU^`IgB=7Wah6&uQ8k@eSu7+fh+xpSH{>9?Y&OFuiB53?mPOYmBn_N{!QYN$pZ z2MIc82p^jDm**xgbk&y6^R109-L@Nlp$bPy1b?711}Rep>V**%Wo8f>L*T#X1Q*iG z^m5}@Rk>R8)P#m(k3gDJ8yUXz^ZoKRdEblar@v{IC-f80wfKB4g$w8BR|<>Mf_1L| zXd<;r97QOACXlqW=u~3Hpu8z9__a!>9hl=6a0SOiiuZDs|5;F{dj*+%_+l<%!a@C3o3PN}@olR5^ zffVva4_5l_Lz!l|Gn1Q!k`wGOA=V84F8Bpf6};ZA3>deSvOi6fgq)&8kx8ex)vGH^~H zq#^^;CMK(2tkU74r3G?vw{~pXNySb@6(<$jwrxA9I2BfG zt76->?X1`~&)V;^_xawlzd!3&R%&3nu-=H0K}{kL_e`M&0!sdA2d5!oYFqVYL; zTc5hZfXdD0g$1_nf~rMQhP!|r?2B#xooJ5j&b_HOU{sCtR{Rcj@5{9RXGV7NE70E9 z=jNap7Z>+k|NoK8}5TE7k3>&Iu;7XB0EqqpnheiF~3L$1(_ zsWHua*$_3)(U%&5R+pu~X|JxVy))-w_2$|0fkZGeV)7W#Iw!sJ!gmUc_%Y}D;{KOb zGZM~t7R@$tvoQ-wwh+>QLNQpMS=iaH1XTg1tq`;UZnl^g_vM+YN~^!;*LaHvit(kq zivvQpWPy!d4w*6~qF5OT|CSbOM*m_(TrZZ{6^EWlaoz54U44HGczmV zc4>YZOFIB{71O+4>k0C_TGe{G8?fcAYO>4_&|_Q`$(nq~Z2H_Su-=dNC%$}}sQ2MG zVBGMs(zG&YNKBKtq8TW+E+lFuDnn{|#|vvD!88QH2O*AUOAIGxY!)j&AwVE=kCeN zd*jNIn1Ca93nSX#GunVCS?K5OygE>|8KzhNxD5=4bT-a**UK2r_Bly2*Z+z6K+eY} zT!vDR-Y*`b*XSktbgAq2=6kEEzAZ98Ok!TC#a^aT1#|`O)MB^ZNo6j*dd0WP;kH%l z?&1SJ!k!p;J6alyi^Lu-vRW?eq3#RjQj6ekOOov4mtRq-S=MJx2vnEI!dp{#G; zXw@RiKm{13TS~>15>AuS+CpRRr^OD6M%bG6lv0#Pe)Pm;vRe;s$uU?#XvoR+_3q~+ zU%Im0Ai`b8jYX^aS4lnF^-e{dZwMX@JX#Q{)2zhey5~%9u2s7>zF0q!mze9%l`9U9 zfZ!_h&HaXN_HXvN;`7C4tJZv(slB&9w99Tjxo&0ef6LM?kes9)o@2@RbSom`ai2>M zf)>!ZANfNm_{pC$waH!Vou$QW`1RsyyLW0h`^}G7W?P4e+ruL4xtN{quA|6QxBlbW zyuO)0R*HBwPc5|H`k;x7_Rn3wwB654wF0HA;ms2h5&Y~I#x_S+j%E$4RQ z)W3#-xlY-l&05{bB{7_%%6-d7^@vih6!_robRKpd61dqwT#h|-z1s49^Lqvy4N50B zbCpo&YGa8>$Fo~6ecs>M1HpTn<;P4zVQ6tNF?#(jpn_Td)Jd>_=hDkyUsSlwn(6)Ed3Tkl6p$zdsadm*IB0`+Z7>-R%D3b-nN?hcH&oixq|#C^wY9y7cvW zDtr?{6Kg1z&3PFvv;-LD6^KRK%y!`Vg1!DExDQKZ=kT7&=?_DUiHQ+P9Sykhy}r55 z3rdCIFg?B3<7;QNRIp6_VLUX^+98GSyZ9GtGJ|YX0ZQ=*xC7soD$UnrGn!@Ijc-FA zGJtZC#b*1fo?jsM>d|E~STK8bwQTR>)m@scP8Y35O?WIG1~xXTCj;o(H^^Smz+5}J zpfDb{%lC(6$zKkiFTmKRx4ScYznwrQ05wvP!O-kPTD^Y`XUOo;pWYAPnX!L#)NVO{ zXgaRGRH}OhjN&|7OTt^|GSgwlAVucX_rLq7Ei4>oYA2`u?l2gky8U&12V`9t&zIYQ zT)j>gm-DC3UM2FJlCpj0g&ysk=fzYOySE%LBuu-(;>Xo=HyV0Eem-f}7XW*v%VYl< z*muAb-YW=vbyqJ{=?WP9%;9dduGVRMjTmQ2ikxcQE%0^I8W|yt+$|s_Yegp`C3Oh8 z;QYQXVcRQON;EFhW|8004cD1I1 zkmw7-&hdw<1^sx7_C2oUaz2b9-~!{3H^HZoy1gC{+tia~%Xl)+bsZ^U zBmUvdZzE-GudnP)sqUS@{A3Cl>z?0TEj(7e5oH??%lLVX%)U*+#eO%t-Q3{q`Kb*5 z1O@%3oPo~b1Tjn#*@WD3Q>~^bIBBIOCo|r5>hHh(?thjs3?Z-C*nLvTnqtR|vU8-( zutL={&GVzD-LHkoPq8mA(R{d?--RHkc1J!z33^2#Uk)f%m*$Fs)R zu>^`dU5EE4^@Rg2@F+VZBmRMXDJ4vuhD`}&`W!I_l9TD|W~#7!Xj>hOIxQwEGXcQ7 zVSKMyRhcw0*vPUBc5A5;^OZlK&PSggE6*i{Vxpo=w)64)Qp0!a%*0SrK$Hp?s^~Tv zNW9sdIAQE^V@9olU@Nn7)6v)bm!%;yuQ?cYrUFmHS`JIPQ<@o8v@09Sp+>e7p z-&d+tT8(2(rZDOv5$_G!B%|@&FMO@gXasAT`Ce@{--V{aI;H48lE7C3{BKXbKAxhV zPL_bgO^s33%8kO}#D_?s&GV!cHDDCWY^#rwY7@phl)udJlxLDmQG5Ad+nD<$`a z4E(QWP#sIQJ)eT4nOf_W!ycbSfrq`#VwtFf#CPs69k=PTFYgR^4E1`kdP>CpJ|P}g zUM6l@G~26=r<+3tZ4zK`GFPtu_Ep#0NnlkL4yeUe2hjL^JpjXi3F!HNh|hsY{KH|j zE{UGWaO&tJ&>5f(aEanuCGrH0aLUR`V*0FR@96T|zSH0-`kohcrl+Avdoy{$NwgvA zb;)0nZ+j6p&#tXKMj)6ZG!&ZxJ^o(-LEWFc{#RR_=u~pACnfsV`^{Au-G2R0bF9VE zA9+i%*(_nR$)gD+pU-gvwAOu`Koeo2QuVBYS&Ij)-Vn{`BU(0Iawh#c$i6oeA%r z!H?Fc&KIZLM;y_r*kn{sTdVE%M02F%Bh!xbZ=-sS?ok$+G&4^MR!hl+6Ei4ZT;*u5 zT{X`Fd+A%;g=A13){qF3(-B^zq$^D~WJ#XBVPl46YE7T`Gw2yJ)`E ze%9Yz-<#5gpJj6+8KVDl)oBh3#!Kee!%AcNc<#B`=4SG}wkC+(Rt3!{_dH%xx<6|0FgzE_mZgweb zD`fHTe%NSK>!koiim~4)+d2fkemu-ci<8QWle6TrTqcuD3zM@{vE!B+R0UzT#qzUY z#dB%x<#+*xbNq0*O;7|wDH(}<$?P-=#1OllPs6;gx`5i^t#@W9(PcPLDJm%(U$5(! zayR{CjblQdwo{!et&&?Sk{%j zcHyEvJRT3zcfYVekmF6h2Mp_XJ+4KzuvNTTEZ^NaB5zK&`-FN8MYR?uH;RLO!~yY3 zWP+9LbgN_MWkL@3(}jSB7Dj|y5cnV)j_v!t?yo5Wb{Mi~xAns!?QXc(~cDvk5t-Gv%f;o39PH;`^?^k&{sW zZ2ig)c(vtsk%T?c40ON^izP5CjKlRJXBKZI>FHFv_h|)g562Hz^@roFXsupZB0M}P zr`Fh&#q;&soo&y3=V4_U{&^c`aoWHzXpcwo#3BQLoZ86HGWx~HtOPca5!(a1s5!qLv-^Q z_oMe~iv~ljG?mZ|?v`tL($^b4)QqpGwVy`1y6Y`?9c>K|9}>Rby@+`uQ&!7OjZLV5 z3x4n{tk%7a#MX1rOG|kA9tehYyGyk_oER~QHz(IVi~h}XLyAIt-4=kQ>)v)T&pCBR zum+5yeG4;QEEbM&=$3?Unw@%ieW~D$@AA^!ed92LgnHI`64{Cd7%;)LeyexpVUHSM z60(harj4-z6<1}q_}$fN^K}wn_-$guD4N~g$9%dd7OlUbjZzkm z^~rK7(-S|k28^icia0)>h`^Eq_SYVbB zJYLljv&`KgtXXe#&?CQX6h1c>o!}5o;E6ck0WWFkT&5Pii#Rff9g70`PA#B+5LKIw zniUW*M!N>*bh=hl&_VypnVu#sb|#J1zH| zca~KgXLu3ktfHa~2W{pYKMyP8h0VtO{4V`!5{5R7g+xaB-O^P?gOR$Cm|eLRYM0Hb zo$uYSY}Y^#&W^+c+~eKJ2Jcc_9INw5jO92wDLzDV1@R=7^IJlF(7P|IGvOY;*2?`* z+TPK589u6maF#;YIbFeNy>R!+xBaWVMkoJtf0G{nWx~}qaoL<5ulin{ERd@#Xl0H| zY0YlBo8lkL=v9_7T^%Gls8Z1;J7bFK; zg!ub+*o)Qr6jSnwGXLw(j5eTN@XBx~O0%|harV^G+?9i``NsOcnb3NlaKMi%DU&ybQp2ce06)XT8Bvz+}Y~ zxLdj?9atr*K7$1LlRs9+%&;Otk1oeQ;sHIh|wjtX8IwD3G4`C9#Q~3pa zEkdgf7abd^3ADQ7NA_v!m{n9=G56g5^xXkgd01j!H2rogMU!A`I_+gCg?on+AKy&) zR7`!xBu|>slcc`IF|b*JpX!UetC*aaA3J(~q*S~0vb>3KzIKFT^;k}6#gc0AyEbTs z(a_J9Vp8Jw-LEtnd$iV?P0t>I_jX@zSFe!p*qd%|eA5C?3wyC;08^;wZQrY;_DkQ? zW#(sInc#kNgI5Y$Jn7}asST$+_7okb+1)|ugaqZ(qt!OsD_mCdxMX)w!GO<%61kH6 z-M*W){nxXh+QaB}Z=mzb1P!`E7U>VlKy$cj0q*)JJlFM$^iHpZ_C9}e+)3BnpuJe9?yeq% zt9_cC=ag;VvP(|g#k7izR~1bOe=oYZRi$6-ee`cNsCy3~p6GoAVjm*9$&LB#-#P~|Fj@6~n(*d>2oPKIN_n16$xr1E4O>x;3Ildk=tySdLLr|Ks)+6{ z#=zB)CX6yq9i)Z^RNpe7-z>mI<}&|Bgx0ef`pZQGr|0D(mWHYO_BBa8Y8U8QD|T1i zew#O}hr{>k^imOq;5yTBN>mRuhIgvyo!D!b2UGnq%~Q=_oh7<610c)$*6U)M;|plC z?|ysCN44T(vuCVs@yTphyKnb28$Hv@*AREv$#uS=ov)3#(4|RFLp!oMSmcLRRPDnd zwU`yUi0kPsOO;BZtMw)LNQG~610EX7VZ?1;m)^uChCNyC8)N-}Q*BMxbCF@6%$9K0 z`5N&UrWeD%mIHr1kghuJ?Bv;Pw%tDMKZ`TAJ&$es=Xjh|a?BnjQ^8B2H8HH#I%5kH z{58dzao?`-+_YW!NmF>G)G4Ow6KY-6HOC?=`;{Om2-f(W?l~=AGscA94C?s}fNQti zwO2|-yjf#t>}&mq$~e!l{YgIOvS~BDvjGkr%lkHATya~bUE-$U(Q+QZY`V0ztmlcv zp&IYN5E!(`h<8ujGUHW_yg}|5Q21(TJtEXm9dj}LVtm_Rx5@bDwch09_Rk*@C#p2A zF%VGKO87GB5VLA@r#F4i)$4y@k&k^&;Q4<}!=US&mxo9#BSi1nqFbiF54pLr2apMcScvzZhb-7kmUhvUpGgy`rrqpkD)pD)Wz zwr`K;^Nz2HNngGnTkwp>fm)$PcI^kDF@!w-V#+tMflGfsKYitL;v*Wn#b73*`#Dzr z^gC5U+d@;C9xZ6lj14Zpeb`~f9ypp=lW}f9t|;^He_nYev1}Pg~?Rspq-gE@9!GuA6>F;QnJHW zSx>o;Xmn%2nQ00&_A~lL)@&SURkP|6L%4sf&=>SUnB=2o$JJo!f9rntBlg7)o`=JM z*ztzoWCL}|sPuG_BgV<;OeDm13II ze0G{8;@sbfa@9!R`(AA^eQzFJXP><4uFqsi7M`Z7LS&5fmf`iQ4&>g7$_M-=mH?3o z3MQl%ImMJILLf3WXI% zNc>lDi?;i=>w4FRzyCV`U%dH?)oI@$|N27T`@j>6Q*gcok%;&D8i07!dAAk-4u941 zkz6yQFj@Eg;8uJ) zTC!5+sk3v@@KSqZ*FA-PtrO0ARWGxbTL@iV%(~;zUif{^|MwK~#_*x69Kc&#++C6}+yTQ+f(hsHf^&@`Qvp>@iEnrc_@49eh>v;j#kTUqaCeb1F`c! zt8`iDTZpEY$b@2&Af@Zwy)E|F^mM?}*ZtK#?t0Ft8Y@5L{YR1wZejk!KfwQ#9K`Ww zT~kAGcj+IqR`Dn!_>d~NSb!?Vh;pJl143%5wcEK-E{5O68B93fEf_U34qY`8L)>5cV+Ed0*^33|Q$c;(V|=(%``X4MGm`Gfn~6?l3-I-iOsJyDm}h0W$r<=~-HfrbGGFw}4SwBD0_}3UE$hxiL%s7}T};#Y-9K zz2BRVaeG(LHxm8EwkX>{$jgD0JRNb>OT84ge{ZF_Vz2@2|C`CgVU@+kl9`i_6@FRF zw`P%rks-@eDkc|%Jtu>q>4{j{Tv1u2=%-QRa7ucdFFkvZEtLhdWK2m&XhRfz;HTf| z%RokDRFsXrzC9@tRZ&5q+oFSi`Jmr>{h)jmuZM-t6K$_wPw20tN-o@ga4A$!uSZVg z`%ufwhXM@Z-*#~J8s996zBx$edS3lCg`l_o9rx-}CO6fBsLd4;8ay)R31Dp*z$4ci zV*$^0gl!YNef~KLAQOiVR z2zgyJ4vZ!{mix3ogpzTOw*-*sIlCsnnzJD}b%Ab*aLC99eC366&k8<2b2&mohGQsZ zUFYo$<7%Y}v-t^dpujpX%!Qo;U(yX>)mqSt1An9{6GRmt?FdOTLsC1St0z3*cc={q zfTBc9ugd;ZvDAPGWDuMknjyfZV_{J;o3{*asdzTlQFe*I)gd&x%bgn85sbx+(hOh~ z&H~%D@0Rs>3X=ExII#}Y(hli=a`_H(-;gHc+=Q-U0rS#v}&4=Gn7SSI|hb zHV=ozWZ2G|e4nugW@^J7<&jkosa6M_n+b4ipos>Q3P>*Aqb>h!mLC98wURe~Q^8;Z z-@(5>SBd<9kQ!zOP7Wl$nUfVE;WEGX$p#@=?FQqC?2NDCGqw8x)|uGt=cx~K7QHWh z-23sH*}Gh8(o2w{z;sbnahd-uu&3q*$BBaZO$h!N-9hcSl<>$G4OEk(ZBedmwY6nE zZ4)c{ktcU?S8zDsSzlCYFH0Mlk(0-Bzd*jKo`{!FO((?u2#b*L8{Jg1d;sSROIdEt zamr)%oFuwUurdQft9-@>z?l<4#9i5Nx`n@%H-&x0bD7a#`m{jEkRQ~A<33dr(};R> z`D6Z+*MJq_pJ87L=2{`;o~@f;#tExy<`IFu%V>Rox9C=BWdK7tQpm$BE2RQP1(p3c z@VH{rB_|)(ZjDw;L8?-aI>OT}_k2{cyns#L8E#HyX{5n+J(Q4L&+mbu*bf2<^5c0g z#fNybswQ_o)IS0Sq^kf@B8b?HWAma=emip87(T%wf1pb|iAXai-d74ZynE ziRCMM3%aezo>#yH1`)9vVI+cwn>c07KpcQz@#HB6mY%Rs$_*)US84PDNSDJ#_X_*S?nSomye z*x_3!7A5ESVll)F9E=iv8}}t5rD_a=rBqG9#j}dRVT}Jz$6P`P#yh!~A@?f1Re<>_NjgEIu z%WYkbsA+$e+jT9@s)LiLX?$o9u(RzS>|rV_GPRi=7|MsTbLsC+-_{G28oex)A5+?TQTuQ|B+(k+~5j zKgBquhKj!!B4ob($TU*XY!ypR z8=B@CEH{n+um3%h9_+rUkw-)e)`}7Wx=PW?s_Y!sqwY1jg9IcB1(*vhM6FTTPgGt@ zDmI@!l2U3s{_DFjiz!Im=zlBI7f`9ahPBAKtOH}O3QJ1nE16vBrjHTO(9vHc5@vqg6u>F0}9E-qu~hp?&%rx*Ay|zl->RgJ=@O-KU>9rFhIu~gT&>%?6dJ=xoKh*M|@-dwqAp>ZGih<3Ku$Wjz zQJZEKarcStdn<$IiZcXM+HCDm(t?I1322NmaddKY3&C{7`R`bE8i3l66oATHgqb{I zHi0~T1nFK{nGct#fpeGU{y0QL;Bz+hx6xh>BhGPuYXu>*mDR8)dM++UWI9FeOQ~O? z1gopVF@y!?#6W-e9O_0`{JQTD3ogK)ykGb)TVj1;{-M%!anWCPM8c4ZiK1t7zq;dH zXX8VX)aa<`wY4{HG*?LFV(2B8kI5qpurYyahus@}h1DQ!#jT&_lg2ICit^9G6=VIs z3nz<_c#82dxKxd9wW~spNCQu3C-0|ZRBdfdBc*Y&~BkpR^l~m zz1UB>1rbH1q#_wWC?=71OIAs|8k@J(^}ffN0tW81%E34dc*fl%sXnCw#=w)vC`Bpv zT0~Rd6o2z;ZCC1O^=)7U8FX(Z!B7O}yt4cEf~j=?c#x&5rKP1`SJ#r5QF2An*6Cb< zrmvrvr^+db8q6CPaWY?9-#jC=ZYWsH4ox?lek7PxNX9F)$7))dW=$`mOu*FoOMx5G zPR^R(PD_89LaE!Sy1<}-97E$&Gr2BVBJHxgi*zOR$QUozX`)m-9Z4jdZPvl-(Mc|; z6*B{wq{v88>0D`|m9@=WUqj9X9@~XdkuLOIiU*o}w!C9o}00APp<#*S;njGGNb+G*-hl zBmo7qUE>>@B^y#aks;RxLVbB7-Mx%yY~y@#q0x0tKZAZ`N?73t@G&T(*XmXJ^UI?C zjGkP10Pc5^&x58@VlG|E9^)U2ewGZG0Qa=yfE|baja{H?>>M01aos3p;c#}3T!KoV zos1%Eg0Maf>>Ae$cPoBQEQLidhdEff7n1QtkR*rlBD_4T? zQ<9qKOMV&r3UaZ=PNT^469 ze6ylZT-7L$Oh$CGRClerIWNq$OS3b_4r63qrsiVz-OeK?ZbZ%cM@sq+$Mugs;2`MN zrU0tB=xQGIk$;|(^WxMf<1!WWSbh>~@cRCJh6`Sj8X@DbcwDyLABXXh6^ev%r=VLN zdi#)s2z5qO7Apb?i}hIN1{m07i8yvGa&YmHQva&^sZ5cKq|)e#>2M(rou<_AnjMla zA(IF+Rimo7oND=^nVwzjztlr`xc|2g`489%fLS5Lz^?QQ!5TY2Lv@N<0C_>M{Z1j)2awlKu6~mlAcj3mSVf-y(=xu7tOS*X=l}uZXn3rG6ZXPVYJy$K;lMNLksiVJ|A$8L zK-grXrj0%6WtoqU&%P}jTxgW&OCkuAin1WyzKX&3xNwrpqG5xOjUxz*p1f2MX2 z##jk-?j#478959zQ|xjQ7l1-|oR%2OlpO^AcaoER?-m(1iujtq#LY>BJ-k*>qrm@y z?n*eoT)Hl%erx}!vy3t4(9I`rEpF`4t<2)@yrB(zz@z?lkJ~2)-_(~_f7~>mt{iML zu2m?bOGf*Lb4!ipX5k@Gj7o$NNf6VN&@>v@-2T6G){cw#FT28$Gg2Af;;0dng^DP_V>p&R7hxLx;tZKp2q3Sgq#6b)!+!I}>Ex9v z7|Bbl^a{OxQ-9UK(CNP^Q8LtAWZLW~lvf!;fHblywvJIq^>lW8zCsCiJuHui&{;j@ zPms3j++1>&Y?oGJ4Xi5Eb>AI~-@=JWX}SYe`xpJ@u8Zacg<{D(N<$$3?{gF|j}6+k zHwTX?lmky2hc)A?=uM@@3NPh%cmpZ|MKup%q$NRCc?QJ|gBuH0z5o3))02)!diLWtBFwGxR0ogVT=2j7um6CH2w;%ke#UNG zPLLc9#pUwnC?Lm=gv;gK$?hgwcClb4Yf7}%Xb!ibzCeXo3aqoM$UsOfvnzczuoK!{ z>=Mp*>-ZW-*ELtCG@AQt6>@9Z@5dlfd+}gB+gZ+0G#!m3Cy@z9x$h&z!T#6Q!iWIj z8}lK=JgF|vE~6k3Y^R(|+1Db%ZFl%KcCjXBy{4x}6P`uZaEL)+AudeSz&aiWw1JSQ zR$8xddXleZa`ZS-vn4P?#O8wDgJWpY$^g2vwi}IA-6vK6II@Uw&ei{R{AT;li144P z*+Ta7X#KKhB}hp6N@s)oX<#_4vCs@&9C{PxLhZMcFBWsw5`(ojiWWS4rR^^iNro$2 z7wPiJdb-((e3Uh_O3jivMWGf*)Omtw@^s}(5z96)F0Kk}DLI)80Z(H$H#rv{3oWDK zTaR0@sKVzyM?DX^C7OPr0z3xV%B)s%+4c+Dwgo!Jn&(gEb>7@$X;D4Vo0SM#@T8;; z@&Y3|n(E+O=IN|!Z=5$|_N(A#(Xl2@sLQ5v~(E!kp(dQGC&F#A6c951O zkxf9T8Y4o}CT8%n7p;kSt(}IMZBBrULfVrTi{Wt3%NCo_ZFoTPj>LH6uTy1D zh5q{VHWl%3nZ`~W$K9*PFRwSwJ0(PjSowAEMvaI&c@a&TVtGBivH2RJ?MJ1f zoTiSJGHk$zDH#F+2xij&HIuYV*Z))x;3CX~YEM?&`UEGF&)J3)yj4GHc$cA@0cd_Y z;obRUA<6^hc2+K$Q^vDXQq5BuhT&{eZlc%;6_YVIRfDD7epCDL+~h?8`7&`QEQ+t8q6y)`fd@E z)%=&O*i~lZV~dI?&Ai^c%0FCwW|A=i}oeBLkN+Gc(iDN%ShsNha{8d6pa_DRQAFp&#&0&F;srF;xU-Ff_@yj9 zC~<&sz$b;ZAF42ZND8_OSxam8=qZhkM++-(3bo9pd%mJ2wyg|dC#u~+&iMp!OTmCH zMQaKM79HSOVngYNQwWzes3r7rM(0%fo4JV@-R2c86#U#fOK1)cpC$jSkaTDCp%*=+ z2wOUipn0seSo3GQh}Kt+^}49;{Yvxx3WHa-;r}J{j){lF3u*>(+n;9syX%6T*qe=* zIV1cPC4tT1bU0$Hj*`_zf^*5^Iq~;hbDXr4)?u5jI5Jg{vdS2eB3X1+frAzQ2 zd2NJ@$j>^3AuX*$)vCf_&B)-vWi`#)2nr+GELFX@eyUB^@1A#C#<*!#lwy5x4N%Q; zUk10_qZo$FVh#>kfnen%a>puAa?0fJ;|m0sXLSl_>Hqe!6on{U-0bol?%x|?((Aym zWr>V(J8r-7&;H>HbZnAN_Pf6^=R|wdIHr(J*>qf9$>yt)U#SlxDU&G2<2XYYHlht7 z;KrgX@pZ!gj~4(UC*v?ssqIKR08+j>ZoT7z5-1$6{VI}?FdF;4(Fqv;lVxrMkQS>U zaR?((tJXuu*LEFGuAGVg!wRj|3ut-EhTitI2OEgF;L-EANdjg~T4Z6fd40aUW_*2? zYk5eXsVO~|%;rUkX;Ozb=>)!>4?*h$|HkAGCbZ%q*7`F{b1LAmATRJGgm#LV0>Xc-V8Il^AI4mBK2Lttp7g&wa4Jx!aR zTi4&bmkYowMmpUWQn1~h0b>-?6FwcC?JE*VOtv=RP}e~ngR*H6<9V`u^&4uxdcR(2 z7vQfoc!+9W{AN4G;mc2m(%l; z>L%8!V;Gh~7?GMu9rCG?c173KonMjFR^%7VdpG5;OT0^)pCEhY{jcmPjQXPPvYKi5 zj4}8qZN312JgQu{Jg-|Hz9a&c6LZ+~YW-1G<~bZ(pq6)|Q8xPifnCWvUrKw3BR+@Z z@4*^AR^Hv+UGr&eFi&a_$$cYGHAo(j)b8zM>~P^@1;v$aD?vRq&T_(}I;R?OfJ9Q# zG?J={${!OmJGYlHRbgS_U`;VK!Um(U=}hKI^JzPY$%zTAhsC3)C>gYymM|vWIuZs3 zLc?Q9X`?X^j9vWkp^*_|6O@?A{R!E}3hLbG?|c_Bl|&$Xq|Q+d=#=5p zoX2wlS?j7GBGr#EkE7R1rj2~}$2Yh)(ZC6lk|>V~Mi^I>Ox0DvjN4d^(>1H3|4J_X z;|uMdbjYAlQS_}!X|}lw)g5m(E>DrAajZ=s!190~qMLRs~_6B#Fb7<#{txrYuIfpi~QInc3o$kQv zH>b_?=M@D3Fp&55C+OKRMdhi;Ts9-6$HBaubtc$ivKu=i(1JC0o#g}?K+Ii}VgL0Ls@ z*+B_$%)`vm?6%}|l+tT3{wRqXcv+$L9&t?P9*Drg3b1bAI|u4p(V@yeA|p7*f1Qw_ zr^wME#7Z{dFuw8;^I&ZdOrfR2vqCeu)mk>H&|F%MRjYG?6%s_2?zoiOS-a&+za-B zN_SHGtq#PelD8p zIsC*p#>_S&4%!-GLsJ?z3k$w|_C!qrVk;tm)A$pF4J^^HIoWcgeAU5SX1WA*8YoRef8#~c00~&l=Y({>eD0GBS0uK;CZA=z zf4IAYcW48J*hB&c2OrqMfEGaNT^B$^L<}z~EDjCfXZ}7D=3`*+9R(5!iq99%(AG8t zJ7!2Mw8cy=le5tf7?B2T&CafxnG1~!&bF|)iYo#O3M#0%x>^C@CTD7nwFtQ1eDZf# zz9OoEBO?=bBQh-Ij}Gq{+&eo9I~6fvuA;*Ti5iK|&UV}znw+VjB8>|l6h6AX4ksF?@<$zgtW$v-sd4!AESoJUs&hd8;^FD(c5}^4U~5x{V-gn|#{|#~ zKI>&_sb!^jU2GF5aDS~2|!LVsg&az8aNJvA{uEF;A@vBcf8)zFv-8h=6(fN76; zB7<6^{GME+2F^Ih%@)ns!aG=a|87fV?A17HZD#$;T~N!4R(MU5OVgsfjJklhdrxP@ zyPTL{jB&;B;U&SG#`gTdpl7FZ)iK9h_s7Qe7pePGR&WL=6ZhH)o<+GG7ZLBtP-Lqu z!-7iUZKO1zUyHGl#!68LE`7ijK2c$b*(4Xii3$CWS#^7^J*)0REh$pKPEg+EtI$_N z-yE-G%3<-I8{`Ip9NzpE-Z^0P1)#aqRm;j2v9uM(d+@!$L*c=UJlEz`U(9h zG0$T(XwmX1wDPn*YX`rCZhq~1^c`&rG# z-kO%_r{w~k*|VQVZ%p~h=DJa`qcj9-bMKk@GV2u0Uolgh*YwWy?j}6Ws@|*@x+&R2 z5hJG+MeoWMLlRWFzJ%=UFX}oEiM)geMHHsm@?i*@1Rf+5_RE7u%#N0X8F*IVA%3W( zd|lls2?_N_dVT5mu-Z(+4L>k>w2m>75{WvnX1%?4?ixB4kBpYLA_!+ykc-LOjVq54 zJ0j^a#>l}$cD}$tKPg8$XZ@e4cLr##Or?*2bgpTkd4tVKfW(G*mEN7Ay1M$~9CZnh<5?T`MY{Jsq=hV;D; zFAIy69YBJ?%8p^@O$yRpR#k&8(oQwbiU;j|CB)arCBz*VGoQk`nWkea! z7lVL6OFo?qig4HU><3U`iA<=8Lq)jOENbr3H(S>(2 zY%c&Xv4WD4H`U!&CySj4MMXs-N-dt__GBfD92^VJh96Ct6%9WswF7Wmel9~i{CG!f z8Zd|NqGn9i>u~Yi4j|KQcL5m!`mvM^+@;526}{q9TW<*Tl$s+fd= zz4O*c8QG|Y#>QAe0R|<^-ll*PYg^+*|LcKbxgWrQ++R@m>tnUczq&4f`S2P~a(>A5 zR_jfK0u|f&rB$y-+hNAW#%m2XfdE1@v^CovXo~oA@c===-n{ZSC?16|*6Ne>@>lB<$+>N=!pEobqugvv6d9AwAR*${o4HYepIwPQTfdFZNjB6Gpd_dK4Zhq zUpJNs{cK`S7F+DjW)Xo=QTI-ge75xP&hdY~MrCwd*#b_)EiluW|EIlg43Bi{+Uz79 z+qP}nw(WF`PRF)wCmq|iZCf4NPNvTLely>D&dlGLUsM0;s;X6cKl^$1+H0+Q-S-U~ z1Plxmj2PO=5r9brAlL=%FEV4?VdWd755K&!{%Tm3uRxi->z}ixFf5}#|EH%=-`y>W zg}I@r-W*I41{or%tNUeSE-$Ots>ITUzwxvmXnX^gn+gi$ll7`ZDX)=#K+;$Sx8goo zrZMYTwMVZzQ1McX_8gW6C#r#!BVy0r=luQyaci9S&0SNJ)NK9Je)vOa0DYgwKc^7x z?REAP-i9A*hJ_HIr#_c~Jtc0PwO3gF+hBy&cG#w759WJe*^Cx}f?pmo{VWWHa5t03j5B7Ft}f;) zPOVpF0W(qa>%sif$6wMrSI9Wz4_4_J`YZ=2-1_)FKV9<>tuX|(45NeAIx(}^inQ!g z_`|2(9Wp2Xe9Ee-s`BYv%|G=dSgX&2_HXE!NK}y=iql?O8kNM+QVu0DdRC&3WwxVp zdpKQhRd0GUH@Uy^A zJS12jMVTXJ#WucbKxC>+Ry^!L?q|AE#IX?xd=Kr(Kr(3lwc%m6{rK?9Mfj*fRXXN^ z`w0NZhH{3(A$T{=NSXrGgzz#lS(ux9H@_Vi8KG!4qca|g6tKHGp56b12hInk|6Tn2 zQWq)MPxhCqJX<3rWIPFY3XxCe0Mgun7P@-r1oFyYcgbLNT=N&zzu2tD<-`0%A&TLz z!+0BBEg7O3TFmEuI-Wccq7BvsEpu*haqu~KB%M3)eDieZ`6$}%Y!e9+rB?l7@jL@G zUnDm*KK^!g1){+R*R7gnZ^iJow9ibJ# zv`{Rcb^RIWV2*1kDJ?A=H3KCFQUH~d6oB^{iOuUe+c&+l>N`2pEKmR3HSKd;+B;C6T(v|RNDpgTtfC2AzJn?aE6k)aYu<#Gcw=I0}BeH?8A zB-DKEuV>;a&NJU!==vs^Y{tNICUm~$$%lFkTqDIXp(jU7}Tbpf4wG<@7ClqXqS5A%r>ztA(KT0**gpQ z79P;(I305XoJX_t(Nldr$Sk+c+y2ng>(l%F{7G!TJ4QC(^V%k*fTgBaH{$hi9?#KmeHJ_pUR)4Nb=10 zLw5rL{PFV<8nUt=0cSjFxv9Q2{AL$tWemd*Cd6xle$3!S}Uh41Eg(MGe?!j;l_f48&>ufNR|?(~?^ z;8)D5Pv#4qetg8XM%LMoxn+2ev^X1oeU&V;@FHbOwg+t|@5RwNWg2M7WuQ-ofVQNv zFbZN$5y;s#D+>y|x1wfJO$Dt%hqYPsdrEgLt-^)=oL(1NoLDDT;Z7<^DUr@! zzU(=8e6om8sGzN)K|xB9ar5&Eh!m7;j7uWI3}ynklmk6N3oQp?GQ(S7`R*Kk!XE1L z7sxnEnPJisbOXM;e(`;OE}Phf((Tc_mNvNDws27-i?RJYT)-FWzsVqmM6uUh~K32O*FG=r}FN{tTBg;2y$ zAf2kMlL&Q1l!M3pJu;#mBohoHHW*Q=Z4HZ$uNiT>QyX1_MyV7ULpa(S%u4u`3_~5=?}E`_Xt9rn#ZPR|7ytRaeO0gVC@3e0+>iEAi_| zEj1^H-!^PXmS!ru6T$^yKmk{VU`KOo6(a1Dnw21 zq5`4k@YuldWeoOykWtP4GBeHIjSxvz`EYp6!R4pl&IhEi;Ycqk8=$va*=qXwy11lD zKq*iww$0~jRt~qrAcGOutVj$T9#@!WTY%03WSc=?c5Uo^@1UH4E%%;$zPQ2s60CVB zkGPn3W7EJ!%<)Xso_H9K7p5nS@8|jXUQoRudY&#oagEQ}yx7l=&l-R=3Jv51D&rNo9M z*VMhRn7%ua!RRGnwVk!upcT0b69bdt$;akcu3Rp?{!W#;ZT$(~Ftr`kOGs$x{@gB9 zu1i#v+IQdE880qwdg|HkX7xNPZu46HC}u7T$uFw&&#n1&_VUB0P{Q33auL-3iYxt4 zB3$1@iq8^i7>T_W)$Uu?gp-CLXwabLglmt3rluigrtrpHz&bSQ0@b0ogJRIZRN*@? zW&F;>u47`_NxA%m`L9<&p>5};H#`zLTRZC#N+H^o3!!h?RA$JUVKgwg5#Or)cU~+` zD$)|vLtB6E>{rkaO^hO00Cw`#Sq)s~xcE8}P6-y3Ef?w~a^@lH4)XB+!$Wsc7kfBopI^{Xm262q^Xvhrec5 zMZGSZ0-^kY!&Fph2CPXn{LG(%of{n0qm7w#5TF*3<&G%==z!AW&)FMUaijT|Jz@MzzBf+pb z;Tk&Xa?!eu#XkvF1ll$N@x#p2!m`Y`U==``l%9}LTv%#o6+mc)CgJ|cV>?f;jn4~Z za~i2xEkw)gv5ZV5n_XV=h%wcM}QW!?LT+unYU8G$aoU6~s2^ue&Mp=eI|J-yjJ!Yw-x zjvZ=xI;Ex6p`UI>;NG@Yh_g?>S_e?%sB%a!`wm8W{%-S9qS&vqRH|k+|aHj5eDXdhebG_ zp-Eg=7?%&9F0;QgZBSZ!Nu!2-$f$B-t=5&!u>>LJ&d>ES^6rDR!Y8V=g(6dSyRNYj zlcNRO8mZ!|>9(Es=?X^xjU$U82UZwuH^i^8qHo$QB0S1&EfHG|QW*!2kl9iBoUsQY*MvoOwkh)=(W0C)M8g@Zg}lKVDrSG}T(<~&`*^JofJKAWfWHUqz(C?WX4s@r^4$Ag>Oxs|B##`gSO$fp6_@EqGt z`&9GpHb*Qvs~RPGpqFpw1q>xdNpt%UtHcO z+vKC6ginTe3F*Cqv66xY@Z4!xha7rU%4S{L*$-2~_j_rzKQhd)$x6jIx~L36IZoK=;*fnO$%2x>+!z#up%2M6e|W=NXHmIc z%wKpnQZ)sI#;pxja1giNTI)lqRgfe>8X`IBVe1LRXRW=xcsC;a0SOTnLJC@;;Y&dCeFWalYW1nv*S0y|mQ=b6cPL8vXup-I_N25N z0x6;fCLp1Z&bAcb?w|5+&6-&HsQE%c3#DqP$i-v?ZZ)CQOlg_tkiv3>!}{iSCz~*> z`k)gvHIx)IjDF{1rK^4`kF*HVX7-fo?7sUl3!Ln-ZBiT3>UIyw=DvkNqYUqplNME! zPw+?>+r-M{Stjsn4ZfE2q^n@!VL?RBNe0K3mZg~(qeTftDe!awih-M;78O0u-ZM9T ze)0s76pXWz*o%ers~JIyb`H@U;5B=0Q-J%czJlPl_E$Xf>tlC4jpty#Hvnu0lr57M z0|vl2w#b+--kSr0{q2b>F;W|&Eu)S~LyyO$ma!ewu2(sJ9>A-|{__vRFFXfi8Y&v3 z@}EyV)!n*QmX;kC%MWa9OV1EQg3(()l+OEa zk9heP@orXjB0{02u^2re)Pj3lk@6HkU#&_Ui{e^aUsCjGvY0)F_G4q+?z#g{n9L?5 z5`E(}Imw2Gu3~V1oi)*Sa0!Dyv9h!8N1){DEwR8X>E9gG$@6D{rTB*o+tWZYxGz93 zcB5gE%wB{-JWP&``VE=0;(d<+?kkcx%ocI2OLX~GdmLB%_UvF>Utd4dIfOKAP02hm z(iT}U2i87(-DKCLceC1|d3{Z*S0|+`U2m7O)%p^T$J=Jep$Rsu1CfE2jjw^_*6PLp zI*Z28ix;7Zje*fa5cmy8q#`OvG-$N+WP`FNK_TsKhcMem2C60%D519=W?Hbq(pOjp zzYqE<3|Y+ZC)U*FjGx}rRCH*_-H-Q{S()q$!=*K?3~|xnok30*Y>_^#@$u;pCJt_( zPoR!kSozf4f|ftM`NIiY_`|#zpruza_#ooQ$xwqeMMkcHEE43jsAFnhP22NNk#$8IecEh+lb@9 z0pLIIv4PF`+OZTjd;CD$A5Q)B2S$~D6npVp9p~|KadCYCorN}HU5NT#U{VKS8j=Zk zfPu@HB>oBOOok_e!{zVLRRUnV`kz;Yw)*<^R(iJ`?r`{RQMRNBhgMfD#;2`rGSY8O zSg^6N)rvfwsw)p*zkj;PbqF46neJATUs8*ORNHPjSw>CgGjBCNWwo?!&X?9Fx7kV` z(G}ZXbYR*Ku|MxUDpQL)0if(l14oXQs-m!gtF6rxRyYm5y zVjBJ0NNT`_&n`AOyn28`3_Pm!`>_#)+)e#b#eXPw(`f9PMbON_LB-oHP&UDB!GiRj9$9zLmfst;s?2A78W6TOQbh1ep@(A7RDA_-qtg6|AD zPFv$AJBvfFeq0X68J0!(hJu9IO@9qZFY+irwtRZ-3#a-;m{4nP|stAkZ) zTs0AT04_tXR1yWh=#5U)_|Mu_!`c%Kt7vS;N!rli!Rh0Lfj5c0lZ-e{q?7y~r3s&K zIg9fPGU71IO1|>XLjKz;K@p8B`3ZGS$@;DM>Ar>N8|Sc~ZDW+HL8waiDG&%iMAwJk zSG>pw`F2xm!1=QITD6y_FoI_RN~ki6*YFVVu&|=DH9*hWSU&2N_JiYPCU${It|@R_ zo&n%b{Em;nnP9Gi(b?P4S?$8YeFQjIXuJLv4{S>i#!AXUiTug*!WbZnRXSWR?`}Bg zYHCeQwskgdcoQT;zdSvKA>$6zFuzJcaE$tqOr(>eJMC|nQ0AAHhh2+py03cd$=hhr8=Bf7w9(l4%bnf*+pG_-*WvlTZ-$2Sw}bwxKtB2cGC7P+ z$7SzSy^begpaj+DQp(ITU;6yKD<&qU!zt}|3Ic>zkCt|B4h?Y;k-oWS^SKe@VY%L| z9wStYxE9AFyvUaR-E?RH<(;TMe7-)^yY`4N32lkJ5x6lj-aJHBj(mt1)F)Eq# zzI`|(W*7_zEx@ayq4i%h6X;HilIPsN%wtXtgok|C%oY@!i!{()c&!;C8vsv|jLf;? zfbrIH-L$&TeeX*6d{(q-Qyw!-iSe-fR@>#pjzP%cpP}d+&$~mLh0vyffq@;Wpr`^O zq&(qKI%yP8dZU$j4)x`tnus0rpcF{*EDJicaxl;!gJi@3g#7CAFj5=?P};A(d8ad< z;MQo@iI3;QGkTBveLk896F+ql)p*Z~-F9jy()vEl+$Ikl9u4{e;Sgs4Q%ikqZEsS*Y_^_W z<@LHC49{bzU+rd*tkuBI1CVD;sGx_HwxZ3!S-({v9P4(Y+5iTp74wl>{_?vcew-==Bk$&b&9Prel{62~EUaPu;XnBRDLH_=8(08q?3ADITj}_*O z4pt-Q8Ib-HM1EDr{g+LlR~vmDHr?m}-EO|6BGPZHh^Y}w&x;Ka1%>{xw^z}^FqgQ3 zq2Kct5SkX$^;yQ;Z--{Go)V_%P75g2hH@KWbtjHKQJ73}qpI4VE=3OP*k7mx*HU4rcp%iBy{i}w(gmrqa{J~k!b7yF|AlnIHkzd;I^H_?Pzc$<1YurYr39{65_9| z89iKxq&TF|*;p=5P3j=1D)jh#qUIwk(~V=+9me%=3SIMbYddb5=4%V^;g=Ey4WhV**$P zVLfH@(#omp`n?5GW;Z6R&#(E!W3q0qca}6(muk!DBE(8}rPl4^eOo?A!!)CggwI%OCClq!9Lt z2{_FazMS~4PUnnkBI>j16L`NXP(Fr*QJxEzE5LX9X)^O?Gg=ugQ=xQpGH30XGm;R_T-&Xg~Z^AT8+#sqwWn^%a#rmw^m<^WBgHn+n-t72u`1Yex8j)y>yzkh=O!8Q0 z=>1kXxVU7|=|7GKPRi}$akiGTs*4@Y7ZzD3CS`dyv}tr2cu3AmtD+x|75nqJ%rq)r z-5WctLT-rPDnD)KTOj+%BJl&BB@>3aL*kfIo<^~H$1ohL^B1h7*o*kZ;l2w&}sHoK3l46vi|ToU4Un# z0X{O?@!d+9$`K&>zH%@&NmX*ZP=iO?K{v9Jw_am`55s@qRj57@CVeCZjw7N zg#Yb%p0mdC@siWGTD{jyc&;pIoLoN5>-OF)bIFOnYN+m~z3U!uXn1r$05tH*gp6$W zhoxRj-h6T7Wf&yv@U)KI@)&6KRvaKGP`|oMnH`S|buB6{_c$98c0N6t%4W3tjE6)n zZnj)BItZWix#ISv#E%`GX>VY;L?38Ezme2fLo~$JKAX)Kf8Oeh5ez$`+YG(|tH+-- z0n-TL_^6Z-==wpAUq$j1ULX};&1;=1%GkJi1?+*t#A}6gw?@`o=qqF`)E2~8guT>= zI20AMZ{05LlAX1Nk!w>GZv2TB!yRm-SX)q2B2ZF6gj5C$rUo~N3r;&qKQUNA!&*yb zvhrj3+6WGwK$J9yvb?SQhInSHuD9;|*>$$QC2}OtdZV-=iiJkDkr5;$3#oz~7b^)Z zD-k3ovOJ2f>!|-{uZb&C0vcit>{(%H6rVORw&Z9UDB^T$%t7lKc45I`2?aGPh}%&(RwPmNtd8Y8OZp?=R}~liH(dnLFb0!N*O8LCM%o}(~^?x zev}U5=*K~7?$%;fEx8|xX%SAx!~R;7xo1^?;G0CjO2f*Ex5}mbS<5)H{Ab9x;7DQ* zsoucKqO5cWA>z5v?2udI)X>++ThT$nL`z2tj|7+2X_wF6w?Y?U{@(}|S|Dfe{sdAk zGB7tr>F|mxvqo_ky4uO; z$h1PjLc4aeOG`hUoO-b)V+CU#Ee4crL*uIGw&H%6nx?0x)jIsDVe!Z35B>rI;U|Dp zheu=RA>fut4B>{pd#gPZG%-Qx;3^Sf3r`(KeaDE%FjUB_Pe3kOBc|WFG)}rca-dge ztWO{ob0&4}FLeJlD(akJQ(f&ExY4ObnToiF5sc2O)s(N~^$) zqinBan9Yk43=9YNDEEHugJFG4ny()b&GcthacIWp+rXO^%{GjWzYKT*pajg992+~+ z(!!z3t2^N>*v=swpzlsd!GQrAGP^gofO$w^g--VP9Te2i88eoPlcOdmF*ZG$v7 z=^Cs+Ar%ue9sNVt>!G0#Fr3C@P;D%6af+$!gVmlrX$Tbh1;70{4Qi%=py1lpT`oWC zEO==qs9G68Id%lUWm_BM#z?~*A@*rN+=Mt~cx$}L3VC`ODKVkV1H85v&$_*;aV@OI ziEIT8F77$wBNAQy(e!>U6&NL>Bi7*F&+zE5#`?xZ_8IC#lszn8(`cj}Okt$^!0Y-E z31#GlQ0*ijdPF>axWNwMNGr>wi6Bf)je6{$dQA;idvP&Q%MvSJ!as2+NLb;g6_phL zrJhy#h>wcY>;`h+M$#T{6l?wU4kuE5`l8vQZ#K-SVk;}UcrJLC{iEg}dL6yrg)l5y zP8dMKu*b*5g>w5?kYqF$^WkLkPjeletyH(#EceTi4#%HU#$(#4iIcbW*dVWKRVv`v z-waB!vY-F#(P``oJU&;@K_?C<+5lq1HYA_B+#qrk-l`$yw}Au zrKQX|95r^t^h&CZz18uM6N8JWF@XYLSOmaVp}y}?5_~$PZBz+mks@N358M3B&Ks|v zPV3bwOytwhDwM$z5FH!E6-pXiCT>74H8Nsol+Yvb8UlQHh9X@RVudtOmo;t9s+jtw zCWU0eMM#BGj2QLc<4{fDXm0(t!AW)F_-bRJBxw6bN8KhbW%J~ZX#yG)eTWx24rp2x;-Rr0VFJlEH9c0{!F)m+2*rqOEV#-MwG=1GI_?c)b7!^&9}W zXTkW1%G3_wA1aQ)_)K0O(E{A!X*y;fXAkbwzi$oRgT6?AquD@i-rdRujQ+Up2S)eWWiU zWjr6ar9)#2;GuF$NDgAI^%AzrW|B#3jK&uYUT)YLgkZ^(v&Uk1L}Y?cs=xX4WC;$a zlMqH?EKz9cC718T>c6%BCeR!GNr39`UvZ1t_dj-O6$F|vz$+`VP(TIA+ci{FCUNHw zk}cw@1@^?a8hYoowa);8zDwf`M@h7pjt&&^A>cX^G=qmaUa2aIsJGwLM71|A`?p#q zs?3ZpofT*zMCgxow+9I(q$5gc1)hr%Wh%gMX*}g|sC|7=ruwAc;jX%;Y0?8Etm_`@ zBI_j3ril(rHN?b((exGJ$fHR-YnLZ0?}lWxuY>f-G&j45jNQ0=iG#U!s=y;*chT@@ ze45mGY+AWKTd`Uh#`}mgTRK*t7}bFFPx;j;)gv|r18A5;bn;LK$4p#r%IKSIkY${9#{ z+L-MC(MMG$N!208xZ5jueQib;{=Gm2*5KcTrs!CwWhW&`)gj8dwtUbo$R-%}%;ECm z!?6yY=Mb9qSLG(kgi31CPNr%jiQC%LVT2xw_AS<#)=8yFP?RZ^yuVY%^DzD@mJ9GA z^lYLw*60;gv{4bqjSYVhNA&x^nWX7Mb<{PCsdgv6sUj{W(Tv||0ZA;0h^ZNXz^Ih+ zM+7z{$tfiD!3dF#syC~s!HEqU-oghv7@6P_>1#uHw2V^+Co$Bdf}4FeOvE}bOd-D> zId!j;QeD!^Qe&l2Q?sx+FvX-4_>M&bWXo~Ry(v@qFq!2fY)68@X)g7%;9PxR83MVu zBP3>B#Z5dzI(E=eIWo|w@DF+GWRccw6**t6+@hE0bXQve)qZ)TXJZi!G=hPjb(0v| zAI!K@rdv&p`Pesn4^U9YPh;_S#3w^2wAgKRRPvmuAk#rLISP4q&UE$M@U^m76U8qI z-AV{jKp+hm4wN62M}n%D(7x175?r~Jl9SQmpt}0h_)RtKZX+-~`{{uema9yXO$E~} zYE-3MS6kEgpH&r{P}LuPDpb1%#SG0IY~2(*B>GJe2$bdJN{Rq0$mKSkg+`_!i%G=D zx!(}Ye|_J|vk1gz&a5Y@{n_3XP2b0qK>QQNnsw%>S~4cxLtkA@O-bqTUC^vuu_=0T z5*v3FiwXv-ZdsJIYxzT&EhlA_?Mp-{^sm?-u!P?bpY;)AJ3+m%$Mb^C7Qf1(ROk_( ztC3toKu&#S9{ZysWZHjHaE$T8GMYXMQ2u!Buw) z?4rafl=cE9lGce++)-3$F)CN%-(&j^Q$6d5u17_P3jr}DWXyVHRwLSG)m0kd}(>qhKw`3OB>pT;&dhT ze?3(Ps^i$tqi>r*?Nf&rkr4gs3jN2=e0ls{nW8kZCIsTEbNc>n?XPSrm_RNc*aEAs zSv=JL{-HWz33D}K^Vo*f@}H`iK(x$q0zsd!Z-}mrz`w}dK%A?C9<}_~OB#C3N>z=m zNZ%i2tBy{$^mf0TA%Agw_8+ClUHa_*`FT`JceuNdW-(AXth?`Yyt23X6~!!A`PY1W zM13zw>;yg=XY{DA!IIckXc{f8D+9N?Mjv!G*QwvP>HOq|eV*UvMnCK_H`=&joXoH! zp$gMDLBqp0w4fUh|7+F$d&Z{$zW%ul4Km`=sue_@-JlFFvQAZyuA>-+rpT^Zm7vKHB^h8 zpzwD;_Z&y)wTzdyF@H_q`ww#jz+Y~_s9<42-hLvQnv$Xv6{-nonuR6LF`7ZCYgn4` zeMI-MqEtd#p0Q5JR)rE5foH}7xUa8+gQU+PuxojmE6->@)qs>VF(h?D!AFA*_Nn_M zM0uK0w8JF$*vStv1aktqs_JzyKUc+$kq1HTA6f; zTu~93IbkGhD$oRjfg#R_ifJ~onZ8;eC&8^@a*C-S&pFB`P2##P&wx)|F4RCxl&PSG z8ZNZ(kFB;K+srrkI2!bF6*b^_w9-1Z-#D5DG?Cx98*fnw0a@461q(Z9=sUxHu=;`! zco4a4F5)C9fF|K~zK42VEORvVfsk0!=t4>8&ZkheX(?Sw2SX5GAN}_h@UJaQAnAJx zAL;hN)YufSVz}WcVZHoVB zN9aP+ckrxZ-p?r8+8&!Rs;;b676Zkg+#Ln1^?hm4yWd z7x(qy!fWr3g^7t|9k8aaC{t4EeApl}2R(a@k~0?osr}z>mjJk$%y){3YqBOnPN$`^ zi0X8?Gpa4UWvt2~>7b^|+0`iffgPwkntZK{8X|El@sInC>R}lQq{D)FZZU6(`rG-2 z=T*5khE7PA=PI`|Zl`c{TtyHSRo~+F*Yhs;6>*VxjP2AVF90cUzF019YkRq9#V#b& ze{OB#{&bpGSm?C$=AWHyyUwNu3JN+bpJ{t|x_5Y(9vA2EI?>A4>4Alb$>)w@f0ta{ zpt07eopNY9Y2f6G^$4I`QLoaeZ>)EF=K!d9)yrSuF)*jfB4MDMUw8?Mi?>T3MNdu1 z0pQ`yR~tc%iOI=yYN+tX+bKy1Z#;Aq$F;3#k_z?`YHE)F{RkRbT8&X4AU^;WIXAG& z%e{9I1o}JGW``R$6IGjIadcRiq-?rITN|4wCjiL!{JO==&VI65-=0=VxrU8_QczXp z2Szl}01N9;XSlh%D^JGfisCyCNA7*K^-+IBllrx4J<=n9#b>Q&W(IF#QyCwxL|W)$ ztzJZa9}^Z9WNTF0($b=#sfo!JACFYkTn7M7t>jSnN&aS8`@2ICn1nR&hoV7P5hbVJ zQbaAizc?)EA(D<| zdG%loO$@t)m}uBV>>aBv8(!Kt!Owf8^`p`OEE0KqYN}U<_)jdF0#oEnuF~I&TEDMDFO$`eTPhj`DZ~H}a@$uTtUVvnAeC9-Jlk?S!)hc?q zu1+QZv-o3D7X}-KwMwVaeO29RabW=tpL40(Cx=|VkI?Nf62O&-t)qhj5dT)Mc%~yI zMU8Vj^6C2OF;oLxm(O@Ld~>$Rb#->8GlGJ;g~w}W@LVBCUTdmM5r{?2iS-qpC^w3; zp4JNg_zV#DUT*@4tBD{%f;=Y*l+WU8KOBx?$VBj7#U7H%<^9i%1<-I6{f*fViX;f# z>k>LC3GCjwyof5;OUbbvf|U74gc*9Wh10f^ClY!#CrJ(KL{<0WD_oqDAvQNYJ9=qH z?_!?W(eo0_=mL1kW#H-Si&R$~ycY80STf(AYkOzXz|?lTw%jXtwF(Uc!51#L8egi09ZT7f}$d* zz{imw;nc*WpNy)=$jJPewZGlJfRV@m zpe1T*>?7;W*n4;>7@jY6yH%+V`xPKzV7lDiF8{!j30U{|b}?8CMds|CTylADP{42s zldMba8pIto*xN-5tEw_)GN@PSO;1jG;HB)$EnE&eVH?n6Vw|q8ubP>dQBqQ`uR1&c zvxp4?p;^!Q14~|Y_3NZ_5$kDddps5+_vi2lYly4AU3J5Mwz}jn9c3~G+pDNdY)t32 z;wn{ER=VHg`3q=SmL&x#x<1dV>idM8D;G~M%q@s?l$S$4-eOY)<%mlvB8p)~s4oB{ zCL}deBNBgZ6`VFR85{58FMBhap3;OB*e^}QOuOgc^BG!*>{u+7gukdQq6<*|&6$Yg zVgVnk=a-KSk*X5krki_n;9OBEDJUG8eRPK{mvlsjCjr;^a%8Hf%JuE-vJ25VbuAA2 za=Ch=(YzY$`nPu5zKqUoQFC%)PBJjebbnE_5OjYtlr%IHm_Y`#tvNY0@^!XfaNCnG zP*iw4(E&tDwp!1o0okflkAXUe0`MdSVaN<5cJC{*44nf;h>wR*oi@7=$=Ap{opr#f-#lp8a+M_ zvx%6cr54b9833wi1}kxCl9RJD-KW-+q_iN0p())idz@rcvrnBn=%?#nIczp#vArPt zX?%nI^8rcv7SmPCk!SM@e}eA}t#?~`aSiC0YC|DbjKf}EUpf9{hJI}!1RVZWbZ=|x z{%WG+1?*%wdFXU{ZnwuI=R^bj!QPz9-Q&5$e-Ael(!QPjAX?g71iFi$+iFqQ0BkWp zbh%@{SvkcVHiqDfsJ(>OA$XlD+P}pJIm>OeT0Kq3-e;ayXdKWxC0PBQKQle;XX&fR zSV&}HnH(80Ke*Kd0lSZg@R+UgT1USrO=U(#MeTGvx_lG70U*x3{n_Ls{(#tZy_bKXmfA8d_X{h_tf5=Y2e1PN>6`8JSX6zoc zSFG#w8x;-~9`hWbC(H0*QMbf0AMy%gE5jzjC>IBl_Hg(!ECq6SjiNVpFPCQ(wPERK zG*adbsj5Oy8DN4z8{;aJgqFT_YlLB6_+|Bk4-vvBuqi`SCEee{;L=3uGCDxSySceB zkk=4Kz6fb#z~w}UVn|694l+=wh)@lQiE)_3QJ`5dv)IjlO)d6oFkw?$8QWNi^cfhC zBSo+XAd$fi$r2$!^;r6^_TL*CeSSW5>vnq22eY=dacOF5VgwH>)ehfo)Mx=(j7dR} zDt?8WU(2SYrfX=kN=ituFk5--59w!dIr)-oh=)l^QVF59cxgPozk8CBn#M_ps$oI* z$n`(7!#X)>A~RUSpV9Ty4kcEEeSxRfp9}a^Dxv<8_6m1~eW?NSG^o zyYY@jL!Ca+t8R2HFS>i3=BZ62_;}CiX*I1%Tw)NwJEA4?t0F(2cc{46BS7_h z1?sZyJl1dsgQ;&G73H0SlXA4Dr>DOkSB~E80UmT2H1yuH(oD4JxUKPJN!%l^RvrU1#J1OgxOv*&<7MQvfJglD*bjMNce3W=5Sl{D@3xoTEAsVgD0nbAT(+xb#o z8t+F4{u;O-9XeYY$Y~Z!Boyi2C-NZY`w(upyWkuQ|Ho--1gdO7q$+1JLp5n{dvn)k zn8m$P^3F1pb$Uu4XCsw8lScD-F-V!}?+0@8$nRU$q8t@1-|YN7J!V&j#I+BM^{~Z~ z*Gye)!m5#W+m)}Oq-pCZf{&BRKg1n}lU98tt29L_c{Brsh7yb`lAd*{) z49GXu<_ON^{4?FhMF7Y*;tCWH{ry%1M^OOJM4j$nA;W86B**|V^ zw&EvOmystEv2!#b<6vZFWF{9tCL<%`b2K*PQ4|&bS99PSKe@THvpo+Jlbf3xqZ=Ee zoue5O3pY166EiClD=PzV2ZNJ`t+RnUgRK+AKRfw%KcXg1MvfNt&K7pIWDors7}~iw z^OKW54D?^Ge?F&)yTyNxWb5>=X#o>tdiaHjg^`)*zxoE6@;zMTk+*O+vDOf^umNZW zj3L0n#r&4<9}WKFr~e-EFHP0|(v+Qrz!4C+hu4!&z#p1_9)WW> zzMpng@GCGdLNJn|@08tPLFovsFU1IZ^@J2e5DT-mjVk(GY>>eCEmCSE>c*TEa zgxyta77@aRr~K^;VI1*wI=4=5bU)a{_f4$fZM$Di=ig4AzleH41^4PB4C0^PH-+#y zLY4P&SGf)tFtC4mk0A`W` z@Lt+a{!B443^;hQxsdOYLb!i3Dog->`5##X%nT70Acn}V*I6ikGb&6c$?V?=M-U7^ zj92zA#t{A_7{I6>^<%95$ZcR|!XIJap%`39J8*v^l7N`8{~g2se=+-?g7^PnG5hW$ zsejXLvEVRUqQsxIVK?@T(qtqp7Ow1BfR9iiZ1B533KlsnEY8Bk0k4n-tKWMg3H0-Q zW@BQP;2reN6{a8>_`lh$L>28XBx=#~O7Xo)D>-umxc(^T{@b5E3U;*!nxuUcu5=?0 za{lw(@8!PZ!mcE?wto!NKSW{pjqt~{8(Is$gm`Rwa*2W%(AM!=9_>$?rx4i$W+m2d z@I(MCT!0TVO%B@MJc`J7=_Jkwlyg{-N^}l|sb_zr3&tAKH#mOMp%tHJG#|FmEkHY+ zYp&K9pdY9Vv`_y$iJ$O!=A(TWD~9|Hu$>ui$o{94{>Q@q=nrg=PcT3Mf8L3{*HDr5 zciyx zi759yitLaorh|-Z4*CIY^UvEhIV!APkh|W=H5|ZLrrOWAf5+G(iH{eBkyu=a=dwYc z(f-US3nX~*)@O<{&uQSj*l0ta{Fyta@V#czWDuqlb996c5sL2)vqu2BQZ5nE*m$jevrCmPl>+=f{JA?Etju z1qvbZpSkr>$Q}vMzKn8HPya|97&u?dkNStW9N2JwBnyoHuNQ!6pq=pz^^dH9fxjV# z0k#!u8e_3v{c+UJkQs(>$o2l|dIXcEi3s0+NcUf5?%$GrE%EDQlWwZb%uciEgtskV zD49(mQI>coH->fJVeZeS2{Sb?d>V?O51IYl4Z?t07W3`ZHvgoe5>-s0w?_x7jL7Rh zKErn0|-tp^)cf-{Ga=X+L;K~CqeMaxLJqx(~3qBM6LJ5m?cEI{~x=i|9c@aMU-=!MYkM$HgC>UhrMovB)j9a z^^v4EB^z4LwK#5tij)dZvQ>?JGLZOU0&bgK_KU>Jn(GUR?O^8D-;qDg2T^ypSk+3u z%cEB&Ka+YUFpHOyQ<;6AzoboCWki|4h67RSkNq-`irhAxDb+CV&$+^;l)@f`2l;#(*73|Kf-V1cH_`Rm(_AXGiRw_<1@ifVSYdkm`9>UWZN zj82aBp(&QCSKTn)^WkWB_)^#`*QXz>w3U<v|veY-2u)=6n&@#mz%`BFIO-_WoDjdK(Os0k-qpqC~xoX6KF zIg0=LH*G zsY~UTEq?a`lu}7YtFBm3pVAv~5q0$>lf)bezc5|*S1BgVDqVv2HzFN(o`H z)2$yitlC=9ugWGyueek6vpH1nPaP)e`6lOxN9~Ot)|icsC$pKcms^+9IOK@NQ^{CL z#gaEk2(%ENYuQ7#P@7%B&8{-XRUJ6I9F($Y>Nk`*qG2zd8Y91HMey1xIMZ1QQR{B| zJ}cW5ghUgzBdDk6ogUl}XKZ?TwDyD;@(DFHw2!f6EZ^ywQejO+>pC>4^8y53>_9=2 z>kHJgTN*1r<_zjU5{U6eyDge6zxOW)UchtRoiJI4hRyT49|^UbuX?lLQ+`N^H|!3@ z+*wQcx@~o~TjwQ1=ykB%B2m$Cp5i*(8-*LASSYp0&XJ<}+w3*zcHRDLoxo8YWIOYs zwjQfnP6+8m_iS(b(c8dtV8w^BY&Uakok0BiOi6y!I!HwFSLympk5Y)RJR)|8sBp2e zm1fZ0!@SX*_neD;8Wyt${PkB)Q9%+f2NLUsH>i$*UB1>~!!(7<0vVW_9u^m9pbgj= z2QqH4iuEecOzvN&>ZtbBQb$hzt-T#Orl`qp||E50PRgR!W?Qpj2 zwwg^kxAz={)oGg{Yuu<;<2)H(r9w49v)){aUdjni(BOs3{>osnCWG(vKz?_h z`E%Jm`375ty@jS+Rq2dT2P~?Ib1-j|iUoA3<2gR7eD0^Sox!ChX$U;UMA7QM_CE`m z+tW#by+uDV@X}ST+9c%%?A%z2Po6y`nDoqc^UVpSBWWU5Gv!Kg(hXMx6ZO{Nzx#^}drrEwzfgX#Or2frRw-#O z^h70qYAxlaG10qAC-Iw+$fOEP=AzZ4D;Ft-LrcS%(N%@9OomT_+_Y&T4Xz-Y`TcRd zyCKaElcoe*_K3t>?(bvRY>(Rdj4XQ5S@Gh$S2`HsPb?iSg+k&$tJ$~8G| zV$a$gXGz0AUPHnYO3e3a@trS^Fc-HxKy=ELWG@*sLmj=(i*`i|Z4ju!_*l9|gYenR zGz74Wt4cL$}ei}d}yv9+Yh$sf^H4_agw9-2R>D!);YI-e1ut@j&SaA%Oa-1HVy z1A0(%i_M@H9(5NdFH6klj$#+WOiLhu(FtMP1hf#tGa59#N%E_P&c;@ifMUw+dTDq zUwpw*-KcrKebT`Jzk!^+0_K34ik3<)*>on}NPA5f;hWrH1~!wfc3*3|vHMKGZM_Ze zH@Vfjdh!~b`@!(4j}=BFgc)Lp`7DvtjP{V`-3Hqy_MXC5+vc8>s0nz&D5z)l}p4&vlq3(S&x z6m75dBj)# z9x0Uf0yH1(`YBRlD0-5@_P$*wp7|YIu}Vw(#z31ce~UuYo(lf}FZkvTdZ?VO$SyGn zD|?1Fxma&Osrp8XchV&F&}P9ki`!|NFyd+LD4IL99FbWQ4-ekDWzE*=SeMv`n*-`p z<~M5PZ&5K!X+gqdR1S=39XsxAb9Lzu2+>=!bLSR%fkN)8Z6~+mE=q~c1?ft&RoLm` zX;=FF4}}^>CTpxBpDt`7xQTIbU0;Aa#5};wXHRf$rlQeEIg+FjX|u(z+HUFLp&dbG zcUufv2t9=%o>`s0vt|g3jqp$orn^&Fbz07pTlOb84%?Hv-lEP z9Dwl4S3b{G8BtG{>M(t~K#O7VUdHpW{CQWDY1Ai^MZypLrT}Zh2HhOQnOxkRc&dz! z9Qar3{h#OGYsfH);JxY{pu-I|)=kH>t345079MFsLH1O-=?#YS~vd$>*!n&S!DzO4#N z&`00|E!Uc0gXWve#@F)$1$MiA490y23rMZipv~Njyqy^~x@LoSO{pRm+@rmyRx~;b z--A2MUd`2f9}=MNqBv^&xnaaCLK9=q$tBAX!zNPd+<*eTAk8B0k(xI-=8cl+L?s%V zt@n0c;f*3>&pHQdF4m9UvADDH&-qj9%y@TnjdyERE{gd)vQB@|`M;-}ODvI}pFsKs zpIe@^op5w$@{>M}UeIr;DR@Qt>kzAsOrtB9z@-1Wh~VXvjjm+75tOQeXFgIiqXPM< z3wv!=we0{QN%QFgB@Cm`R`9{Rp_Qr z@y_=9kDV!Hwl%Gtp>(>XG*KibHqVxZ9W;>6TcujOdx{0F@Q*f=)JyMerxmr>6m0iU z>^cSbR4q#SdW^;w*h>PoQeRE=F`vynnI~cK4z*v`TB=6oG+m}gX?g#vzj~@jDS7Mp zp;ri@4t06*>Fz4K&HXGP=ME%I@2QJP$HM33?wS{_Gow#7H#w z9JC;7*BUEordy}UAd%Xg&RbV_eYUq_0^$&lBogs~qE-&($*qF0wZZ4$MY{!R_G*`suia=2Pmq?P_Ye~+EZSqhaH%h( zj4-sgN4Ny8crbf6IweR=vRm8^C+fkx+PwYcicREa`-_9+gXNRLKF`^BG5mVT+Yh2i zR_rVdLBETX;_2K3Y6|$)-6y`i3v7<(kg@bU?!n#7anB8^pyV8>w3;n`x7^}#{!Q+n zvCYlc*Y^jx&ca*g%>k8#YM0c=`dj5b0;67nE{X4eI~Fyr3+2;Le&1RY&!|Jd0PYS` zs&$@sRI_`>pvjde(0^W~mLB?uzwIyo3c~^(S~O`Y|7^{AnlUN40dS#05UQqE85&A7 z<&3<>QE=u`$95-MLQK&$nDVR}S)Luq44O_=i?QWnKiDosVjsMep3uiXCuV(*C^pVF zaDv9WJ)~C|T4p|Kct6pD(mHTWS6+4qrJ;~g@NT+F3#zi5nN>p+CAG$Un2)#E~5Jk;b z)ooOwdy5Tzg@D2k&h)!W<_P=YG0%sY`oCwj0Rnlq}8dh^oJcJ-KuhvfDcHcOhz;CP3yBilQ zg+mX9i`bz5!i$h`xj$D_qQtRo9nWka9McMFOjYx2L7JcrO>K4c05~1zv)y1! z6-~O&f>WhG9G7v!=YX{}oGi)h=-v@FUG77jB4G5@<|QiOR4y8LQ9hnVq4mV&U?QDL zCS&hqg}C>*hHHx8Yzu0`1=_4ixi$XYa!G2R7S&LePv1y6yjxAf%v=*#?FzX_hke<0 zs*IxAv;9AyttLEwcbT_oTnkm^L7eP-?g>0ic0zQOb3RbDP?!f6udHCq^GU^-c4S_Qn@2& zKPJDv;f4kG5;UJDe5kv;o1dtAVi`@$4lsJ2ZUs-FNfBXhwW5J#p~8m~WYXi)BdS0- z?pkZUg2ll)3SMm3y+uzW=B(M6?hJgIBztGC6ZjN8w^O84X65I3>5x$)HzQl8??%C} za=xXEM%ym+B4(z5&6lEIZ&2v9+5-sK>)Ua;R=@N>>Nt&!lZ6BW-^}6CC=ZR_!^kDk zCkZZ2AngKhQ0S_VBeJU93RePKLC7^;@2!cclc`*8ci3=W&Wg`K zW7?&`zRBSfQ;Ws;bMg=1^w3G ze6BSZ`!-gqY_Rg*$1c%j5-wiY%IE{8TA^HeUfI#v-p>w9(5W5Z;9>Ks(ucp~{d$hC zl%z0rE|%sX#)eDC>fA`Btu@_$EQ@we!sjkTr|K)gV$@E)5MEYCyg#kBJFQ;v!cS9% z^^&gqd|&YMrx-k&SrZ1ETlA7$VuSWR#&}vCT_e-PkV!a9kVn@?uwci@0NvMNXE0-$ zw``>wt;JbEfJr_FlI@(+G15k#e0IQMne6`JwfZad zfLj2PV(-9^y>(<;`))@d4R~Yqw7yn>hb2NH-(n2By={BRIcE=)YPg%f%bz#q=WZ}PhnBk6-4EG6r`RpPPKDD(<}oGhBIR%n{i&I~q> zWa5r)5HqcnV%r`yhDnm|mK_|Ct;{C+N(BlV^^wj&SOGpF za|j2}PiG}I!D@_tzkezi&<<+ME!8>EQGWP3RW8|AD^L2v(I+;}bU1C#ok(^zs#G63 z6ZPN<{BxCcXh>8nfY?SqK95Um<7i@6Kw5OL~o(#qy)A*1@mz z*wMahgN6cr)x)m7t~#yGVZK+J@L)mv&#K{^c}wuQ`iEO921-0$7dJbNUFnOfZQIm5 zuda<>u6S${#~A6g8soEDEOgPf;0R{hO|&w#O9P5t$9fn&ju|_Y&LrR|YGs9&e8sJWqGZiyeQA(3Cs&*mb0K zj&tv{XSz1~qI5>pObNk5u>?uShY+~mtwBa-{dJf(3=&sqhf$&YE%lRxcCV|7g=5S@ zO6&^W=N@X=X!H3E4957Y=yJxfn%+7&X^VgQmlvVoLaDtT)n!H&1^=PatOa5nv&2}c z-LB3hb34Wuk+IbqYr!lX8FY=eHK?v!;_74gY~9u1B+nsUP*1moUX!50*Ni1Y>RZ*AMA<=0GJkPb0x zlo~qj&&(K0<%&HT&=o~_Gkd4~9Y|7*j;Co=rv(Xmj0FbwJtLnZL@?|hxZE`rt6pr5 zbRoQ0uIzALtKDE9JX>i#BlJ01ljx=5JHOIhsPc)ENL!93Je~uk0ScGm$F$XqBA5pi z)Qold*0fVP05gDct|gh-kWEx}BaDxV)6g<;g!r58@QMlejgb7i;<%Q_R)vSa!3P9E~C*=Ez7bIenLp#v%VAka`S~F zcG>V=eS}eVfe4f%WkaLJ`!2L(wn7hA_GwM3N?~7BmbvMw_Ne|G9-AxQ8EASIW53CY z3e5@4FS@g4>;5n}Mc)p){(e^hkIJ~S$!iPoYgNx#* z&Fx&idE9W5P6jiDyP~zzOmPHMfd{2r3eO*?SfJpai@JDOwQ}%`htX7 zhNz@%IGba0lzp?ezidIAx&BF=NclOS)_o>8m5QcQY@yYf-t#9fr@mFS>FYI=+po`a zbIJ0FI6Q|;>-iJ*b(jY5Lw&yK)}VpsYi3Vd5$Gmp=H${j0(qQ4hFU%)c3ScfQyFW> zW$I3ET5^YrRss+W5qo<4pVYW#_eW%yy8v^31l(4LH2(Fvdkk-HG&Z1{#8NrzkTeBD zQ1RcJ49qR=wc8()qrS+w1u&q18Ae_Z5$l}S^f$qE+QkytSk^M5)sZwFS*EtrFGd0* zzr=|?>Dxt33~Qmcr*s#o=GK=%Bo3nHwdn4&l|c4!YI_2M7~uhJgdMP67oe=}FtCiZ zWb{U_T;2h{=b+A{obQuDg&)@i7I)&G7J%*LwM3t+P8juPknp{4TajZvGKt1gqyY)S zbKV=(iRBhIVxK@f1TW4D*@S_YMS82cpKtm?i3|eJ%X)-IIRX->iUku>gog~SS8-g>0e@w@X8cB|Wd* zC0xH4|3Lx~QTDJ6*B3oyGTvM3y&2ad#HnwtQtdqTPq)2~eybNv%y4uz!RjJquz$db zsfU|4z9%+%AxRQM7Xp@ zNy$#eC4nUhC5*>cwJ5!uA4bx79*y;iL;!! zA?yp&%mt9p>#K|!l(k)F*UM0ab?~=$uEUdA{$wc7rais7Y8+yl-c=q=6&aKwD(nO`p^VBWnIw_NIQo#%hRX=zy z&Nzgnl@)%$<`fzM`(I?~^~pqA&Fw$0npW;TAh?QycAEQ8Q$oSg+vpXa3*wsB-H#+d z2<4Gu7y$BIBJg8hx{7~;BIJBLf~g&^mdf1)Qm)eyoZIE={Oi}NK2M1l0`Z=Rmo7uw zR6hVqg1v_S!&gSPp%FB5C;=7S5~8Q+*0ZIg4{Hrb^|l&v<2hnA;8emIVr^J>FRjS( zmACdMxnx>N+)f;I7G`#{O9LE@g0t8tO*b>2beLOw!6$-)wSd(d81g*#U0}$(YkII8 zj!=3R6QI!(Jx+K{av4&6vj9|$dkdxF`KaM@r+s^mtMG)WN(H4pk>z@mC;8G>Uo%Fd zHl_je6cdV7g<^X^yn*cH8}Uk}`2titJwX*oDiVy$qlYdV_m%Is6N`-XXi+bLRxPom zAhXkZE1Bct`^VyWm~fbim1Yjmw&$cg8_6&ceq2$Zb9Og(IHK$A_Pk$~6CtPf@{$cO-VBvtFQ9iw|zgxTV1n{V9zrC6b0@xfpRKzJn}>b`R}tDCD{WuyR_tJ-Bh zF0_eoUx|4^8E)aBN3o1}J`|ojAN)_mp$A-TZehDJvAa-4Et6z^$i=Ht9AB%Fw1fOw zG>9cK#%}n6Zs+y_91PCs`7qh;1GRBDLWcMV-tMqq?wU0)XizMNU(1 zfuT!(j!z3N0hwafN|070QjD>XO$ z7YwT%6>T`Fx*nS^=lKL4iByo~A&S25^o5?ME0+tKNPM=o%0PIkCjubH6IUp>))C3v z`ouJ8t!Vf>OZ91lox{V6Pbfa2XDd=>hC5mlb_nMe*Mo8BKW9<_{`T15`I*(Mg}xR# zucWbAnB|e0cAMiSt;z6tvSz}jYli@TkyL_|?ymLIV70xLx?vz)5G7jzK2^eSQdri1 z82jvCdRfF?c`y>6H^cLMuS7iAmPx1eW3}m7{hPx>Ku6bpO7-&RU2HX>)2!5wwdgSU z&D4jEC8rNh0e}ux)1|UNq{hMeU~<%vJKBJcVprvWNuCA_bLd9E))1>E*}$#2GG&W znu5N`JK(2>Jr7hAy`>t`#(+`>SnI0%m*WC_D?n&dnLoaO=t4$ud1OoO!{Q zBewIeaZ&OVa>b7gf7XwA5IG^^cWZIhn8`vM)An5zk(axHtb_Ut=aK$-p=ophC$b=;O7ToBZBAbU5M*Vy zR3FW?Np{~JAs!|gFBsM`j^8!=mmMcPiGlQpYxH2cQO`m4nx5m=aD~^p>`&#C>wv&! zTAgNuC-luc2)S6ox(5Apz3FL<)#j^NzB;rTIgQN2vC>#ewkyqIR;m^G1{C7lU$=d4 zy+K)~#Ukg&i>fy45MsyGy&A({$8Oiw$$XjIn`>z`JL{n&f#mj~^oSB< zDSO^|GQy4Nl^fIkyfC98p*wF@O{g=pAc(%Z?-)Q;Xi}2A=WC$UYQAq9OUH4VN=GwC z0SG3tuY1G&({uctaAw$z^OS9##-+7DuQ!0}OrqlYPZw+p(`>2#$^&gUD1MLWV@0aL z4+%`@u|44sycgqQn}l8F-rAkL9-we#S1WWkiaqEi1!71A3)1wwH^V9A-X_rKDyO!} zq|spBo-f)gG}{nXC9`t~ZeybnUxuysMC`|-?*6CAO?H%t5o#ZBdwoX8jzuF|i^Gui zA=4N-_a@bX2j!5|^lomP%5yv?7)Zs%Byo9;#})Jm4H60Yi4m0E8$}=wbuHt!bTm@z z%Kb>nYb~zdbJC+*;sHe1nh0I?IGh>IFUM_S$T2|t_UZ@T5F5f2UORsi&n%=?9-oyo z{A*+rBOiZlrS{9W%=P=Of;tPewFb9)S@RW%V4h^L*sH100vQ6#3LcJ6!4Y3EQt^>0 zzIQ=X*SOdX0^r|SkWckhW)bCmGrp|sRBn#H2s*Mpu9q*F0c*4WnAPKBS#v&E;#R|I z?UgEn_d2KiTp@(1hNarevwTp2J^C3){ChimFsKDr@Uk(qRHx+Ax$DP>(w}gT2{+P% zaJN)B4GK?;|9I9a?Q$uc1h%Uowk_1JH5jJTLcylpqdDiDwn`Z3JKu(x}#Y#@QmVsqed=nGtQDvw9N))3FH@VhcHfJpj8)D`c|;>1m(!(&MAljn{>HHfMK z{0-n4iz>m}w-A5BQZpdIq^osI-^f}1d^wW;odsgTV>v4@@Z|COe)o4iQqXf~bcmKr zlJ`S6%1EH)xh+^ShJ-yb9G7lSVS0Dc?3;Y-IxNZ#s%&VLi3Ue|wz3W9_8;^oP(0Gz*UTEiEi zV5etnjVzQ{kye(VMx?1+vrK(gosz*J1Jg`fPZ$Q*Q3UI z6ih8gU)2FWebA<%k zHw-G}#bGtp?~6+oyzW*gt*u@gDxuVHc77rId|30KdhUCliHVdDj&bVgCav--9Ie2Y z*JrzuD#hv*s%W1Y2LP2@-AbOMCINk6IrB|?x!E;mzH5yF-pkHWwSJ||$+NGLqMzrC zfV;ivm(B$5r*u=tu!n&thC_gQ|JmuP0uRz0_$xwEdm-enj@WFfVfu=_ysNOY!Ei^d+l%{iP-{ly}<1A z2#cfCav6vnv>Q4=RI6-fRrFk~%Dhwi!8J++{e1G+T6^P<2*5Echu^!-V@04lJ-B+$ z@#rJ8^_XjQU)oWgTNtd8i$*7D(@Y>6SGGa1?N{D04+oL?R<5Z_b$u z`FpT=|BIe)074KiaNA<(+-L)lI%vOr+F0&4H}AA-USLED=-k<6KT{^C>d6A2ottcg2m7J}C8F_i+GG@p zs+)l9vTVZ63`liY0{}c@$$4K9USI6XB+!24WPkEoc^k;lV{f@@=Q?Ab>9-TFblML> z!Xk*Pd<@HcB}pcXbpGJL=Jv;jzZ@9<4(k&Lw^&9DqKw#{?9&jewuS)Ci?C3p1QwO7 zBg5CK_qt?$0*2YlE_=#fT^1?%fat_ml<|;YFWuuqsw1iH95H08l28o{H>@S;yh{oK z$ld_}wvH#1sO_F?4tDp&aXA=zQb@k=q%%QgTC)eT>87%ca2FZ1lDm<%Sg;utyJp~# zD&DRFsHTnJGS$z`&EmWp~3qe;!JJ*w)R;%DOrBwXSH!TvL?nJXd z@X4aHORRe~Y*FRMgW;iBSFCixxq7;@S~F*`<{GJP!e@IUy0~?j0iMn!eEDYG`abP2 z+eOfN4Bo8aj!_+C+&OKrK2jg&OC?akGBk^n^N?d$wcc78r(E*gPH(zGFGRiag1R!f z()acmclajgd20ce#7$`^4nvBmF1_D7IX0W#^JV1o>ZK;9?O?3EtG6b5&T1EEatHCW z8rojb@U-y|OQ=rEg}JFG4!!#87Gr4t1w60W_TiH%!=CEl2+_yfN_IF*sY-Nq_q)>& zvC)#*@`$jIl7-(-D)hZ?E-`zeuoBmMvHTo1BfP>M+Xxt5Z5;4 z406agdT{A3HhRNE-mFL+3}}ZbY2B-M&f4<#pbn}r##UFl(hWbr=P!s_G9Dh#f63?aIQ)hAcdaS@k6KjVo0%2KF?O%OU-uY zVXOu+iN(kotm{qWNxs=7l-xl*?z<41`lgWS^9+@N^^lO$b__7Q!&Y%Fp@+|~DS8JD z*Y{96xr$be5ITIEt_EJ((63jmjsK8vKD^@x6H&>gy-y|jz&K(MiO2Gs|Ju&=htqS2 zN@XJaWmMLr*@!t-PRH$esw-oX#>sEHW{!LE{p#!AX1zdAD)TO^q5jfa6l<1JPB%qH zTXPyK(mg|Ht=)X|i`DE-c%!djD^cK`#|b*+`_DpN5o9I<4Ky0nd7b7XC1@GuEi`!A zFKr;VgK^C)M!k7E>vu9#2RiL`SEFUS#1&70eD(jdpkDpE?zA%%hBveIjVfLt5D4ZS zCoj+r9*C~b^b>H!pkrjXd_@4Cp$2z{d_GFYM8x@67QN6VP&Gp8Ypqc81lIMF$LS7> z&GgX~1a}umvT!~JaohA1*R}~d^R7HJWEbe9vwT9Rwssm~3L=Z7@gE`G3s#a-Xtvhorr!a{t7AZ} zi1nffP)+b1A^{U{3vnB9=>E^SlVKDC>FptV$sV%TDh1ka5&{6>cjMZV(;-%l5z2ww0H z4|&yz}dGzW3`y!bTATv+kL)ZUq+~>f3f$uO~ z9x=%OGL4Ty9|6ujL&WHLM2P=NM>4#J`vS@L{*r^X$5A%(@Banxh|s|J!vKYE7g+l0 z>UhM0z5(mKQ6gbj)TcE#*j_X62TN@qfNYn1bOHC69I=S=(o~6m)ky+E4eVmzD+^L$ z-aC}r>wVO4>Woexu|5mPn?TK)`KcA}K`h{?yn)5GMHhP^{l7w5rRK9hXU` zVBClbsHd0#0Nu$+VV4ace3?D5Sv(FPzjch|x^3X$r5KLvQuAof5@>7QSq{*z$aQDrsP;Wk zuDzy}V{{gwH{p{= zHvo?A)}+aaIr<);5l%?(xvdsA(awxjJoAZCcJM-5;uk6z;mN}2 zGj}g~nlX8#|JcWb#vbOnvbUpFt|_zZc{=;W%k}X66=c4GtOlxJJN-$6Z&AeWjiq^?|ExQHu<-cSfI4^#`}{dYPO?~7**$8 zA{KR#RNeJL5uB8Q!k7f|>rY&C0>2f<}T z?u$U*1q#4shWM+LHdlRHzz(15Qrze~CJR|iqi%PNqxaH!TO*Rm0z>AWHpLe@Kd$R``{Vq& zeY}DI*YkZ}^gVsr>%PKT3q>Ha5}~aerTuQ3K|SZp<2)^Rff{N~Bmb*NFalT4eSH6J zoHgtoZgXVwO2D|BuRTvP?u$VG*90I{jlw*De|2Lq2=Y53u^dsNk8`JPRxkH$k)oo& zaj(KagW^w-svBdkZ928GY&NseFe^y(*6Lc@>7o3mi%F%usW%LR{qP9@PKRE{G2i3_ zWH-O@Z@dS=t;Sh(*L_EGzvAohW-o9hsWI(;J>aLWru<=Je|={>v(DihKtXd3k={a> zyor;dhO4`P;z|^!SAt>tXV}Me_dptyRs9%Sc$J`DJ74*Mq=p*V?CfaQ)FJ>k=Rk0o zCP>$tV$~zT7Vr>Z1c;?kqV*5(c1{mncapb)k>k-AW*J^8tWlf;k>lo2wi7#6k&h3F zWx^elbhd9akJJsE{b616_xD+JUZpKBUd>wb`z_~-D#J}n9+&G#W)oK>uNnI{?Nn^W z?<-V}uB|E*h6xhdXrX7bgeerqfLml~gj&HYcW0^yZY_8@N>iiXE4<~@(zP<{%4xkM zd_n{i{PpjHnQSvVtloDZS_ftvelX(l{+%>J?N&az`y&#+mfq1i8lR17x&$({%R`OV zA$Nq=d9m7l8)DvZNrHWwzY{MTnQzTOZz8pQ{A1NDXYk8)L#X^OR}vBgMvse%{1DI7 zr=aTt304a}-&aLeaQsNa9HKM*T;CCAUd{Il5GqC-^ShN3oo=P}gTfV=`?wcBeMbDB zei+7Ez(NYvzn?Fh|E3dSTOeO!d?$}Zs4=G$nErk6>ax#;ZjJ1)VX>p6=M=2HE}?oa zubk#! z`rB+;&mDO4R590=9hAtLeZXdtUaj5xMzz04pNC4kBoP{~Dy(>UG{Z~AG53mzcZ(f` zuSp@#UI6U5?wsqS+#g!;CPUO>dS;UGCQSn?80PA9&YfI;F0|^cU#DVCK`oc-3x3B- z7$!_nez^}g!+E9*3lqU8iLHBU`!T~tCc`Njaz@kxOL8UOX9u=W>G;1qX&bpx_c|pI zDhbB3!I^W&=efgcN=abp)oJsLx<)6GU97)1m!7yNQKpp`PT?54h$0jZ8R|V1N43O? z2s5Q(R}bBr$<5qU|E@hR_q}jlkVCZus0>x2$E&v?f~lMGhegOeCuGZS*WWtxUtT&SZgV6A|*&H5k+3- z$?vGkuFj8cLXxplw3vkt6d>q|dw8E*j+M)NSPvs=@Xs6;EM2uuP8XXMgA{t@@#>6% zXxe2;wsc4JC{U(fwO!xT@lfB@^17{%6TCH!pSeHKS@e*8Js4Q5+18#E>B$4DQ*Mo9 zc_yQjoaa{^lW8*8F?nt#O;{)+1&Jm~^^jI3{#nxZ18v-6J)OFFSQui8TIASMZ7Qj$ zO*V=)D3t*3*DhDo$64uzzEES9DPT~dTxL_PbeYlhsv?02UZ8?PJi6hAvB#P^n$-49 z8t*bL-z(Plr{hxYZq4QHcpH&s`&kHYUrE>6dN3QGDmp}}LDQxEYY%&0ExoE(%w3MUOpDI_`1Zcl z?H;;(-6}mjf!AhHHnNI0Ql=JtykXveo(h%jt+X6|%t+r*V@xfPdw1^cKTnSi^Hyuc>}*xlHcDRcd;!0m)|+YB2#+yy&F-ISYoRvD?8lM-GtU z(H6J+sWh1ZL;ATId%NdaJ;gU)S6#<)DY10NY1Qr={~z|=Gb*ZWX&c?31VI!fDF_HC zC^-m71`!Y?=hzLBbIut=C4)!~jbuqpPEAH~j!i}-2~BRg2~GGG=l#w(?tM0A+@JT3 z`~K5&ZA{y7$MY%aAtwIt@S}!ZUT^6KS;Fjtvvo#RKly{kTM9>6 zG`oD__dkAOqGG&aDY2$y|x=)^Qzlf@2~a_jL?F|n;KI<2eg*eUn&uB(Fy4 zD}g9i4_3L<=XcI3-I{&DluQyR0y)0Zx~BI;v~K{@2)F7xFvJa|;3#qR$Q{RZ>r0P4BL3V(ua&jESvSg<#k7Zos5Sj zp`Hv-DBxGAd)BK3cxvg}bv++p_vEpYi*=q=OOo$y+jAp`RV&ux=EBh9;*!pY^9$4a zi?hOeEY}VLpj`m{w+_FaH$g_9SN}70NsYX7t?A^Hmt^zICSj42S-qN)9~y#Uohb~^ z45fIYCmr<@;W4rAaUyEB`|WLOTTayuxA!egznWK&@Mt5RE?pq+Jz66Y=}ok6=?$`g zrdRZk$XMF(xj$od#rAQ%hv3=9V0>PSfW3*jcbxk6HIvBlokKjt- zvq2{Nuks7uef&CKKjBmw2d~6!@?h_v-n~MW$QumojdY`|qWYYgvfe5OpPu(Dp^wTW ze{DHiO#GZV>Rd{_x$ohInsJE=DSJ)Urxa!yVa&J1Bitzvg_KCKiWg% z7C-oWW~)InX_O1nMA-`$tgSg76MVi&LLVU`u(veJ5JfC1Jj$e)^fiyriIc|S8tyIl zSQEzACXpC&;9NG!T%6;32BM*=DSV1q>ApI&k*b4)=jH8-%3G6j6>Nl!mBkXB(P0e8cN#H^%oFa1@V-hvoyZ z2g-RNI{fI~vE9PyW16m~JcO$EJ#|y?+ir%)-GX@_HSU2`%W0Zu#xv5H26@c8 zyE(b&GR*Ge60|XEloThdotjEaE>`>SR~WOgD{Z%t1~1%RW$M2cEaHBoWT%+;)?vB8 zta^&LP!z>?lunUL({?17Adwid_bOp;Up298WGpF!vym>gQn5r)77(>SMnG5qJq7*@(lsm z^z?-I22DKLdcMNTX+Mk~XKRDo+M*n02D#-Y{A?5hekMdN-M4gd}Ihfz# zQmSJ;*Y%}o!=ka;ot?v{OM81<~;&)x3zO+BhXrtu!=N$AciE~L&&j#D!6`nr3E}Hq~0wT9}3In>F zwB6jpoh)^y{!-ElpB<|jLH#3$nc$dVipp>N%|oM3g;BrFk8$%rj)hvVWY%z-SopEb z-3xqvLRR73+dSmRi&JE}Hu>0d6yB4XFXy|egyGa;Qad$q2H!~V${}-_Wt8g0FDQD$ z#rAjRVR`TYZ0aymQwg%HTzQC5d2gycJ)LH+Sm;WW8aa-M zQt;EPdq!@e#n*3ZL+A6DaVvMG+MgBf={*oaSETP~@5aBq!@~nwD`)VIdX;->!8BFz z%AD-TGl|zrLMzS^)$q+wTbhhHVk>_wWGKv`{5?WR>Q*5FOcSQ=$yr-Sa$A~ChK5Bk zvb!nKA?~=$I9_}g3rYk z+D1F)yeIX@H%-XTA<>;gI?4@3hp4V^`Zjyp6O#&m9d5>6Ucxw_1G51QtwkB^3?Y>o z?q?mUCZ6pRlc5Gb5~aV3>oOvxnD928wY~0z@&wg(r{zNx?#+lWjITkJOK(@sD;qIx z=zR-yjA~!I;bNM*fY)iXBaypEVu2Kj0-~{oc2~an$YMwlkfVx5t|qx>e3@E2(erB~k_; zh$i~N_-TyqL@A;?%pNebd8HzM;k*8YGYfqEy^dn@_`@f4gFCwC#7nf_ER_IxGJu{R z-Oar}{uaxoP)uAqyMmzH=R9EGZK=9a@CcoxjF)l6Nz9O#Ct%70tjV;rV&7IdOeCt` zzc1!;V%kWW~LA%0rAIOGpZ znmyX2-tVpsuqc?oSSzP-T-G8MNTqmn)>aLcP&V<^!5heFlCR7;s z1ssoljX=wcIc?ztn_VhWjerii^oD4U2)*LocwBEDT70Oyi4347pN;SU5t~RZwUM(+iQ9UZ0$CDz~$qf z50E(uywGJ!7oWWXpQH~=q(#_K+8d}Zp&lA07k)iUKa|5{T4sFb0){zVPqrbKLfR%RKKO z$NM^*krUn*ug^EGUxzbvnKliLXV64Bs5d1mlKD*RkhFTb=G!FM^zHC?dpCJQRHC8~ zoFsiFUK`n&4vvbeWhcv?kG)Kb-#4AT|7FoxqcQH?CQ!jAy8oPo;%UAem0*OOBYnSn zWV=_YY82LAPtUhLCJrtn6blj>%3X~s)F90Ja8}hhHDY}34W8j+_3e&z7VRAb;~i|- zCPQpu%aJO#cndT$JBbj#j@5K$q^Z!?aET7>^LuV>6HxRjT1%#l)&74AUc!uWv@vhvTE!b}}OAgV6rnwSpn-7dC-CR0x|#ylzmb=L05BO;Ua z^{QD06n5v{tL61o9Ux8`{y&C&Ip$|msg)7s?OSYCX z4aL-6<1z7C=Xra{7ZX!%xaf$;mh ziMJj+&yFISttt8Pt8M4QNk2cb&VZM%uxspOHdn1$?nW{7lHXhI$j&gaTW=@^=&Rj^ z=(L7z6?3OtoSup1&_I%W+^S??d>h}n93_n`e8{ol>W*L9<`9~c!zNX-_~`n zB@dN8e)Dk^CvgPSfcD8@PM@YSbRnpcorrQc*3tL;>x@X0jZ51|_XI;$$Kax$*zmWC z2`k@SM^X#cOae6P^5HLD@xIJXsy?l)!f-x2Jt=_CH;kKL0l8GJ$C;CiG-yi>7#8$% z+qK@+?@w?z?TPgE_{jnxu5)i2zIWtHQn)DFF#T3;^numtAgb<3imnsudR(j2yI2Eg zxh}(lcjZPJg&7NOjb5&qzC;sfIsibCuM^{2-K_&Mmc*wQtr`0Xaro~Nkiioyi+7brU2E6O`-$yhX1 z57QMXGVhITqJh)uvrEK)RO*XG|D~WN@jW1Z5KKrMwrJW45dMgIptju&O#3%6OF!5d zOcTZWq%8VSBXk*Lp>YRbI#~W0t;l292UvAk7fbc30)?;ymX`3g+=-}DAi^~IO=9-7 z{M{NmZTXQb8Gc!=sGsUzSos`|Y*(;7c}?YdlVH)+iyJAqY5*~$66G@f5$nKVl2t9! z*~BLECD}>Ui=SdbT#P`Cy1W|d+Nk|5pWe?;&CgSx>eK)NXWuV-h9{c#DjGX_vb4vq z?K*+WuW{8kTm*d@@UXJvOCI@7CZvgSIB}3frsq?W1k813;?p=k>+`m4;jb<@%u{&1 zKIefs-&iCCo)?E|Xi8Al6?7R_4;ZOsF)ofySF8*<_A->zZ=*6Pu;_eeQP7W8usKT2HFKI0izn~Fzes;O>7*3Zg zRF)!?{afJ*g4aB^QHpWVTS@aLvLX$#=hM+^52711+}h|MT|>dEY>pulQ`RoR<*BEY zcQ=Djo6%cSJ|{>(&O~AS__g{j!rZ=gDp6xoGUp4Q>Ds+c+~`qT_=7AvVb(v{GGp2y z3XznE(iu%COQEpoUY5+Q%pzKo(bzVp)G?}7+&@RnfRGsw<^sl%{uFTZ3M*~_Y?D_< z!CUgR@$Z%ODg%Y*e^lMwR3Br;*=GJAgSlu*YL^4O&$ z^$uWHP5(n!^NlHwF=VaV7J$ifprn#x=4Yn4BT6R{&|Q++8zhYOvFd$GkEROYP9M;V zN+EB9*$|>YaIHWiD6jELS^oGxurq(Bj3XB@&o1MQgkcgHN z{m|EY%SIBY5=FDtKO_F&FY*?R|54MF!P@}OesmoUoJpXLk~#e~hOCg}Ewo?ilowg- z9w8Af|2oJKp=vutXWsWK#O*&oPUor?+fKDzOQtA8(rL((!K7ZuoEu ze&DNK8WI%>RHKGbb`ik@fz3Jv*x7ye`U0DRDPOyKTIwB38wtc(0C+P{XKV#t!8k?vigrCnOVh>56GX#2~JhB0|z6 zXkBO~v-2ryGS9B z*0@HggbIpEgnyO@|NB_g4)=dZKDmKDU5bz*J9lu~8#Pg_Zu6}(?)rMVS7)@wUQtl_{71L)P>u2W>nQL254p;_!a(E>)TuBBqzT3_W>gRl(0>#Q z2=)}cb@=V17H(wuWVtBYMuG(Z(f+$;_DM{24)|?R{Aq^@0i2!ow*I zsZL;@@0mTF#>AUNN*n=)_A^9D9Z5wi(?9|oH9MR|SHT_25N#zXC7u#f6XUs%*gTXI zxA*e%`&+1|QsO0GvdsxuE`^G_pS4Jh(g6q|O5wJt1~m)zsKIPWL>6jW;RFdQVlKjO z(fh($`fhp@U@wI46sao)y+fmZ;fkqdv?QSVNwc?ctLEt}u^sKYtalXhUcJ{LNJL@2 z_L8!Dp!oiX(l|u}o)D83*FAv!wI~c~0`5{lfqq)euuesUS^A=Mcohr?k#?S9K>kD) zIdW>%31CQjIhXDsVtU?o$(F9kJ``x0ns@S^M;|DBN`iTaQc6W@Kss*`Ku3Z;vc z9w{KPFyR_sm`xG0HIUrkNkh)Bb*d5sST#`^&;Yv>&iNN}a`&7s{YF)x(?zM2OrRTZ zM6}EO;J4=vY-7uL6OTTo-7{jku3M&rv8-ald9+Oh3F9$4=eX6wz46*$unRlz=1^b_ z5Wl01uv5TCzO1)@c%N!0NLSi1PSoiKnQv!HtUhza?%mDf=f_&LY&>Pp?#)fe-V?Q5 z(rS4@yGZrvsUKw><#9fS^?P?YYi|mU3wJECAW&p2!LG!fQZf3z6rCacx1|9B6cM9B zY$koeTHI;p!w1ry9}PEN8@iN7;P|2H6Huk!vq86+6w~5m4GXmDyoN+YK(@P7Y>t^x zLp94#f^@x_>7#sw_q!ekywCN)(ypvi_pgBy`lZs1KscLL277w(YnZwJ5t6tR<dU~;A*UWg1Tc?E}nJEB=N zNu*FsdIKrf2yVAZMGD?~`Il6|>k)rgPvK3!Kf64eX&0bUPh?zem@1@s>vbA)j=iLUXI z(PGPS%WR-XXP%Eob8qon6TEhdw&YLGqvk^jWJ1Xf79U|p+ z3$?Fns8~og#;soC1PO>HfviqJ3FX}o8OX*D}U0X*qukyvwn;`Z+(^e*1+K*<@FoAeJkO%OtYH{ReD4Oyu^po3OoSY zst#iXH>vbTU_)=(Ui?@?Jy&IiW#=`AzCf!ww^9`x8JvJh>!%?IO2> zKvu4EUvd)jy!xLLFTKQTc8Q(+(5L{H@E;hs-uz$&54oO~wmg9X`^l4&+~i(E-dM8WQbmyy9Q z-fkM`{Lu3b1j!sbqTZtMfm^@wftL+-n z6kbo+!4eGn#6oZl;jG}OV-2~MG4M;wO*=bW-(sDrP=3*tt_w{6BCSZg^IXt|Y-B(t z%K-GY*Fc3Rzh=p%SFz^Bi8khJ+qd(p3Uq-l^V&euMXSs{T8Q=+EA-;jOj?w6)>;*g zDY|%c5^0Zlc{`F$b!zJbhtqCTeAjiR{dRctEoyWrZ6mx3;w_!dc`@s}J#F?1+Q(5z zn+00ZPa)Zgf(5$!Ow9@hpKX^SLQp!1&3SWY6^KcvMz0#xoF4RS$c>gTFFDKf@9uZ~ z&W{sPjRuwFJtG7L^r%pR*-Lw;$7_!~wjyfI5Gku8C^4S>J3ffKvPEAGO+Am|3+*Ao zMuqjow}Kf5RCbMPV5^c%r?06Nk(w#a7cSZukuL}_Ouub8Z~)YEk#05jU1FZDwd)Q{ zrJ2Wuc^i>Be+!BaT#SPKe?OECu&-~1JvV@=lit+(R#=^ar_Ulo>*C%p?U4%;6A!`) zGB735A);~2tL4WF^f+*8Xk}bF>#jj03Lo38`?_xa5ipPi6|_&s?NgDjeo%iZ%6PQ@ z{j42Xw6U(t(JOgd?1$pT2J*Jit@`*U_hO$ATlWz^s2o}}2;_Gio;Hfy-oP1h=A3tz z4eAK8tz|S-DyeOB`D1Z*r?&65DNdjJse?>U6ULcX$lZdoG_`2t=i@gyLvh!PGjHH_ zz1ebGoVdM72G6MQbZV(A8Bl#^*X8|S1+3*plxsEoNO=Q(=vaqH@6O1SfWPcpZ&kYVNz~KI58@hU|9@((y30P0HZMezseD z?MMAn$23aY64k8v9*+fny9G5G?zJXdkc|$^HSM5z6?ca*KaCvWG9==fF#BQd7m=RL z8sdAH2*M4+=7If468L+lVOcqG{wG zis*Ge4jRLNow5>r>#`VO0j)3LQf^;PvC+wg^M}%2i$dFuWeZ~G-HnWi&ALU}4tbAB zO5wqpMOsfqI5w!sUJ;e3+1(Qs*{8EuD6$wYdP#olb3twjv!$Ecp-&TC?Hf@U0YZ(r z-}mBv<+?XmIr(CYY7)RLO{I&}u0net)ibZ&d9lVXdj)k88w)pY*>X%SzVH;D^PK(o z4$jmV(`f(Wt=)X9gxMA!$ZLuEzUx{e+Nd8Mt0<@eTn)iS#{3d&^+}+_IoLDnAU*}p z^IFX;5$U1JpzR0E>%`)JVEx~ZC!PV}_){q*s>>%-AKV4o-!E)d#mm2p`z2Ec)64uL z7?X7p0Z&KivdpZY@KCC`!LaHK0!E^TsK$Mj>8}%!t=c!l0LerWP9Z`oQJeW|px!Y{ z?X|61NkVAVN-LhrWR!`hzvwn%IE&wK1*0A`pyClG9lddmKRSFGddjdj`1~3)iwhAf~Ci6_b@7}|RwDl|j z#a%tf_%Fw9EXU&wFnQp&YjZOQ_W(kMqg^*DZ2B@z$RJr(P#?0 zB?SWZvr<(tI(-eYRJG0a3vJ^&HV}6BGLEWLIMa$^XKGA1q$JFh`Xu=mW_aMRS+ObF zOuCWS1vGu!l}NQLGAJOK%s0QF@cP7M|MS<;vm(NV(`$GKyzoAwC3cv>4|*t$XHorD zgP#oYkxW$LVsi-Vr{i;Z7ua@WE&q+%!WprL#=%11MXNNLx9Or|Mxdb>MKNEYRjv{b z0I_4IY4t^${To+DK5w|m7_Wc3$lX6wv%i>0$~%>-0WZW-ZciS(UtLMif3oFjg-}2* zBIG;F`p3*Xi}685k-|SYckJrIIJOY;4?`(R;c-B9wyw_oX<>e8l*?>-Pqz_z=|tRE|J095O$mMZkO3PlMXxN!!sS!c zH|K!_s<4=3iWNQkgAyU5&SkTpTa3HCHkf9mGg@-s`-`7bq7s*AgJPPoD!9azHdFtW zTCvVV5iEVYM7^+k5@NwJ`f%x6Go#16?=x#Ha5Zn&OW**;r-gyhec!VPH!0Z3Fe%4w z%7H>+IAwks-x)0lzTOiQVuEMB)EbiKVkj}0U>rbf>x11L>H2p(x!e@9z1FFrSDyQU>CeU=CGgfNY{*K@Ot<4)YIltvhes#-<0*eyO zS#opglj|LG0!ZVrRr%3;!ysX{4I`T|g|Ua(xCzfVi}V$M3O>4&eCE;PTwl6I^~NIl zvBxHq>h@Q%rI4m7#X9P+jd##`XfD)3+aR(%nb+!-Q-yU00oh%4)##)i8Zc0DC{Cba zt*29-s&VqbQ$Js?PDO$*juVPYW0t~R!k2OZMAsmnt=h;|c~oJi$!7IqquUYVRfbu( zPsJWb59R(GoOEgnPx($gbn^LI^=iXdIjI|S@fP`^Z%+Mr=E?Sx?nTvB|HcK@(QJ6a zQ$I!IAe%_nhJZf(;~6m#zk?GS+(2}_qb0zHyHz|I;coRfc^2r(l?SI3p-D-eJoapV zJe}<))X(MD$EIIDcRHXnsYi=QVNa`;-JsN;gVz}!26+E&rlV8;z``u2b_a_~6Q1t2 zKPS;k;o!@^V`XMnZ;}sxt+dv7aH=|5Zi3XBP6RIY#D5t57~Ak{`y)l^&?ien{yYDM zU-5?nIQUa}9yluA*9lm@-!jObN2faO?|}%-+!|@m4ppH-SZTRz*kUwi(&@f&^QR3m zm(bm99l+`5MqE0yX%y8c`7baRe>evGnwck2g&+Ph1M!1fQL z-7Pn<*E^!{Wmr62kX>}ihdfbYvnHyC*DjqG@frMgC|Hoc&&-1tq@=$q&s%)r(x`y8 zN7u`h4LZa9Rw8N^;>s4!ACBb??BZ{Xmprzasf?#~HK*%(Frf~>iYS%El-Z?m3V4of zc)EQwdy^G2%%JG`c-!?v_R?l7eNONBeKGvSkFMiSeSj)Fxr3du-Xi*jIeGr&zo+=m z-|%YyNwA0C&iQQ-{@kMbE*3UgTV-UE@t;oKzvuUVzKPcYi}nHL`-J++7V*F&4t)wW z{gdeY={;?1Kv(BblIy?O_TR(|Xj}f$-`^)*?HTM(lkof4iEV+d{wSe+{o(gX_`L-n z$JaM2vNNaUfA=ANe@}otA#v$#w=*TdD_gMMd1wH6Og3Ok|JRxL=WE~T0$r^|d>H+Q zbpGZa|LXzc5MbU}znZ&}{4Q(1kNx2s(A9Q*vCp@zZ1Dz=8#7s{ij?1n_^(%7zV?4b zi{7CrI?c7ACAdi*6tsF zM$2P6hs4TP4K!U1&>8?hn-{(hyc(cm0f4qHutAeu3BQ#9KuhZKlHRT1!x}_5SKDy%fH@+ncm6)r z<9wK_&8JSl*Rcyapg%MJr9awqrRIAo$8M9>fLowEyZPv^fb!3gh@0au$|o`Q#X~QL zNSS%{5Vh%cmuhc(g3%@T`)G{w3H`SoLYt0TS*U^r-&cn|xp(EO`S88bD_VB^H>S)a zZ7QPv*`5|2SG!ZiEnZn- zs9xz7(Mt7~t-meO?>+|L%SZt7$2ZQ6`S>4Q`oDc8_Pi8xC_TZIEux7oeVH%u(=u0f zd-&3q@gY+dzp{ljG2qJ(RrQNrttud(tG^0AVqe+9IOtMU@=efpu2KY?Wl^nv)&h8V zNfAndrAUddYWA$R1(0*OIzD=P|9$wjk@6z>suVYI4`>yFvs{Dcj=<0#`OROtf{Qpc`{#Qi) zs;~c_5|LLJ|Fa>n3wp56S%h37r$lGO#dKjsBYH;F)vhMxf%9;{sArzWv{KZ6(W_*_ zY?~I}v0VB6U52Q>VWDj~Eu6zex0+P%(Hl3AoLBCe{sLlWM&?uU3BKsg^0Ya{ zu3mz@;rnU!{-+yPAr9~q@vA=nvna91*d;~bj>8#`wMj>bA*3--6)FyhlJ@d1dLybD zz;%vs33SizVNm#4q_iU?HM>wkw86p#XbI zoq&Cc#kTw|&cvUUHXF7}-xoPy@H_FvxO@iKr*5E@1v7~+M!z?XjRmu_C=2{=V=V+_ z+Wwx1+jY~8+o*Xt%{2ZafI`C@ z0m``1-^<>Vki@^)>s#9Bm-h5lZEl~Fn*uwhVGRa8_POkNCKkXj?c;%(jB4u+=fT`A z8iC}DBzdLanKm(5NUz{3glA#KUM`ZkVODsgdaL9RYAyjs;uw+lH%TpB~4n5Yk z_>J>4bc4>2s{^rFQ6kE#{Yg|-ckGhc4}T)FjH5(mFdm<@6(A4Xk2}_~ZRZ8g9r@?n zD^AzemCx6-?40XvFZ$^+tK}10@s0h~uRnVWuazFMT|Yev29P+>8eKX z;5ES=4j&BY$JXKp+Q|4H4BLBsdytr@z8@c`H~dzKt~8kI_}L~cps!85So=<12M0l; z5~4OD3tI=OEB)K^*^Vo{=bKtsUNyJ9w_dD`_CcfF7JU}Mrla2$vn?l>L5q8K&BzkD z6h8gjlqLk;qVSUfD29-|Vf;24hULtL=*e?N!Viao4ts8N(IWh4P@72Z-Fm9CA-_|; z1;P@%1gf)EA;#|JDj`TnF8GA~1I-T(;9lj6>4Pr611_ecF|g+k?e)33*o))V4>Y_1 z=fR_;hSx?6e5uCrM6Lvw3}>8CJ_D%r%qR$B0k^eu{sXRMap(%`>CU4;;^h$GZt@zO z{UjXG?`pVcHLv^iv+s1mqR*u!h0?Dxp1&`ijVGw}oGn3bvTtW!TDSdz`y7wsgV3vz z>fVc=6;U}w_va>a=jQZ0dTxHATDJi&*BV8|>r`3x04w=4$gXj|FE`)>4)*C`|Jj`G z>ghJ}M`NzghxzUKj6`0m>dnTTb6=XR56uZ4cf~QqZm@wpo?YClurgyDXH?L@4(04W zy|?5S4+N5#b{a4sH8@YQ46NbUc2iTOM6XU*|EHec{2z6jqhVVG4VsO2N@usdj>p~; zQPZ2HP0U{iJNyLim#hn#&DHL4+nydJ7N5@hH_q;#196=gukEHWux2K|=a{%1&7+i) zLzv15$Rjx6Y}08lK~W4NJd|na@av2I@-K#{kCrYFCI*tLbw}+o_90PrgTyx$wq2(v zdVWOWH;LJ4dJ5ZFU{`DbVZz|POY_ws3}7U?!Gkj%J28goqg$UQ0puR%dhDD}~`P>=^U`f#4-g@V9J zcK*r*5aGSGJ~{zG?@Au_>~&FF;d-XA;?b77)K_bW9cPndw}ZTTZV6Q$=u|E~|3z*m zkah^zDEA!<$Rz@96XpASH8E?sOorwlckM6=mg;KeG$JKJ!aiCqMQAbS4$Bw51hApz zqt~4mr(xmukr8rff^3#exSK;_J9GIK-hW1<-=_PCM?fXv6pJzpO?@hg7(zHi-mF8d z3OfRIP-Dr3tf}QDs;zIM4Hr?n?G2*a^JKz28v=FPClcq`L!xJ|Drt{C(0a((!h90> z8-XgD`%AZtay+XneVc?nEV3QW)86QWVPV$Ny(DmNhF2CuRi)xiKsWeXz(b`%wn*%q zq2yL`=sfp5n>+>TmAHiTL*x{HUjj!0vwFenUc>mgfi zOIiHb>3-W5exi224dl-wd@XZ{xta%cuR(rGY+$)-XdsW_-8d8s=Chf3JwS&?PT0m=J$KMznm+!>HBasxW(Xoo_1y)qA#Yxu2y*^K7&wR+gHdZSkI zRGL8|91!%OpM666+1c3HzD{R%u%@wT1pyK1W1#kJR{W(UsdH_a0970GVN?}Fl?4H3MI$MG^S1C&X@3$A zyhLG6bQ8tcrhbOkT?lR39$Ezas&X&byqp^^Seh-b^;F2Vd7>|`71if;7*fBN!O!SA z@1mK+Z4w%O{;Szndp;f`LF*#$<7nw0;9etQ)ESQIyVG#v`_T8REl3E#r3DEFc^<2; zn+1M9eoSQCjOr}R#B!8xB}Y@{yIq^wKBH^~Qxc^H;d<-G#cGv;~LFS)Y5^ zxIoY5tQ@bQfy|z9v5Ua4l~_g5u_&%FQ7^aXymaqp1%xT6TojCg)U z1oI4St`hO-0#)aPlKzy4@w@s2sF1!w_&2(YeLn~cCTuJ*Vb;ihIBQc=43zO{AB^+_ z>>b$s{Jy}h{~*X815~L)okYS{kZ<0^v+h;r&0Yf1X}Qe6(7-_4w9{($-LbdL+7-Df zg&M{A$9tmYEN8&gA-!!lgpDSYeAW-+STrLO<{?ea>nce?Zs|2q11bE-`tv=r{VR>w zLsIPfcS<=v8aMd+NK8tA{<`1#H!Ote`1_y5lcS}G`cD4+-@kr)0^Gjqg^k7$0Ck65 zwI@)L!`7xK1=rZ7T^d}`wb&>zW@^FB_5b1v{ehiB7wv+D85K9ZI>v*)%mnZUVsxv& z1wQ}8G2%Z|!Ui~(H-99_|BLwg58fmi0b}4D4S>nuz%u3wxVnii@E#<| zThXgb-yhhI0bZu*di3=5tD79(02mX+kH`Pf$A69Lvp>+;yW*xKS2y{8G%5F~OBWkF zDn36|&Aoo_>Mn^FV1ILDaJ)}edMS~-R`4D{WIeEJo33?;{di+0_OH_LFI9NKYCs7} zVA0g*P2gY>AY*>D@>)QpwZT-k_oF{>KLWyJrJ$)(@hOyyC3nl0wDP+JZ7HxJtt!%L)Zt4eMmpl^4#Rh6Mf1i(e`UL;@N7ebmb8KXZvI7yaB+qgWazquBBx7u#w;m9>k-8eI{HKLBXcK?GhweDq3|dE$519 z4{#eM{ABmaaS5Ea)0#HC;AngHI_v5hm-c|V&U=vq=piO&j6n^(AMl|^Du;>;Ao6aMX-uSo^7c1Fd z0y2WCrc(A)S1d2PjA^n$bA8%LhET_=>~Y6K1KnwOK8V){FGC*Ye-_yB#&~`PrBY!^ z)YH@R^u487+?69RB+&vOhE=y(&yiXEv!{#Yhhldrm2|*I8%k;(rm~LTwhzq)jz?Xg zf6?UF)w&O;y{nbaY(_KtaoCJ?a5jM?Mb?T{c496la8(Y=uclA5S1w%y&gu~V-Vbh* zY=hoIOCOV_~invY1TSo83bY!UU%;l{h-;qI4M90qo-MSImm+zy98v_e{gMJV_R zurW>tARv0;Dch!`1|8{DKly|XU~nH_Pun!bpJHN>61@WFA68suU=)eo06tzkxpl?V zD80BuQGCJa0pe0cjnF@3)cgyYfK(Dw0KaZ)`;eQooNp(ou1o|wE!U{C7@w`m)6J@e zl4t~kn)JS&Etpstx1sD&kI;QrmH3(P@8%>RoCKh`%bD3i{m;g$3Rn6=mQ3b)P3UHY zLSt>Qz0?Yy4%OIluraI4)?}*wy$u^x0NDHPf}$tbXlg$iKyi#w$%7pu8D~@TLODow zCD*^5k=Uc*llddl&V~>RA=bR-oG;w{|H&o6=t^KZd&Nm zmJ!@?f{|1PFH?VH{iECz8TwBt zZ2x>PV3^=?awkan3?N7p9^EWMXzWvL1X_$))iwC+@80uD`60hs&?%2qdVgB87CDXsIu?MY;a9uLij>pMcl`q(MDo`H=ybzTf&04j@8L zGs^J)Q!1kAu;0X&M2j)XC-kVA^{x)2#Lg6QoAh=^vQfTC(HO{fE#8o2i`_~BgliN3 zaw!SEJZ}O#1xO(Of9kKe#*I_XbH!tupOr7RoMtBnawIWngjJE&T8Y3CS|$M>%;x)9xLq0g#ifzAR3iWW*xg_sh4RSh7pWy}ji!K8z& zIfFD#_Y%6ZpVAk?KU&W!Wjo2lq^90WN>bAU`WW^m9`!f)_~Y(yJc`zL-zEkRu?4am zKJRA7jE*h@K8If4qz>n7AX0DfoqQ1U0TMo-(th)m{Hi8as=s?kD*62)$9`+q zNTGFORyTv2j3P^jqNMak?|mubHypxrqurGUHS1wqz@=lj@R42UlXr2=DrHyjobUrs1K$!X&cF z{Y_|*`^6<5316IaF}^c<>waStw58LN4y*bE@lAUqcK-IK1D6W7$L3oTIf_}cbnis9 z{Af=owPM7B#|#4($%Fh@m`s8h7{X^a0G928ajl-}K)-Hjnle|_b-3KZYueps+&_lL zq=_zGp9D^+Q5r0G#~^IUk_1IO>wQNjF>w9It3~1cV=XnV!6Y0mLbA(0k@QX%>5Ptt zlDe=ghlCLc3p{<28*{L+C{cO9Ty$qt3A)>GuFD4=iiXPhY+%KZ576%z;cVL7yIWUB ztoOlpdrsN7)Z!_`@--tdL@r&ehE^-m-{+5ae-n2X$GveX;uG&JfKKo}`~`5Ad&qAD zGqVPb0|!$TJJU4|;M>2Z6mrkb7qs^&9_eb%WitJqh?mT_XD!76wkaBklLrYXiX?$Pg*zhwmb~V+vDMDa$2u{oq4a(6 zVX5}HX|abWITHKk@76JX11E!Zk34ZPpZ{_F+P>|u=t#rMmr^5a3d*=sVUGGCXrW1A zY;>90YX_YfU~wMKNGg8pwirG=)1=?ww+TJyI!Elp40TaI9X%tB!9_`tbA(hz!nf_7 zr8yV9+6klIL4k=5Xx*fjksw&uO@6k6`DgZ}-8Et_bIq;LghLU|9ToO5-AhA>tzfaR zenNC1_%oK5Zh9t-^JIx8*a&CUNZu*o>H9+fkFny^{|1lg?zpdIah02wtsm2ekg{+> z!z?rf`04_@h1eFX01L8GTaxy3K*7_KbGSr*%3PBVM|MU9th+g@rox8ULgP>AhD0~y z0;_OV4}QXJX8Y3dz$&+@VV&U|l4SaD{0+lcC4y=zv-9B1N}da1;9*sQO#GPm1=Wyr z{MgN7oK3UANatXlGupAy1?N`Pub-NApa|;OpJMkm6>Iz(x8tZX;6ok4Ek(BUiTG1^ zQb&I`{gEw%xfdrcg4;%)p5Ci;qhNVe3QFkvswGjM;=36}PsV5to@w=*_XASk9Y{%k z2mzuWhr;!H2zR`t<#Tx&e^F#6VrWajE$bTeV(xR@s|;^pZv6Ed&@jFmX{{O z3b5L$xkeIyW8M$2lSoT7Hv@sU-7SIxhCwr!IH!_mY6$$q@x4fz=MJgH@}gcwNsZYxGP>HGf1)-C>ZoMpQ_2iE`_@iRGdJAB0 zH0U2efoM{K70m{958Ck-AP@ehEPLt_`O9 zI2ca@Cz^y06JK?N>cVr15sJbr`vUh$#Ri0Llo}WsFLdKcCG*eMr!L?>@4RVXrMs2j z+OlAyO}kkEfJL#Fn(@xByLsJDwD0_B})|uB% zyVp8rLxeq=Z($l-&S$FVHT77^I~%s=UN4uY$4u@eGbp$Cep-i~|7?muZO%#<|H>#v zjJrXb9`Em}##prapYigCoN}^r?^KdVv2$U0^OOcB9Q+^l-n*@-ZEGJ^5pb)3iinC7 z8z6`%Em9)_BGQx=Y5?hkfb}Pxkl~AEC2Dif*&=M_ zy##u`hqAEd`F0iZ)BDH#ZUumf6qd&70=&Q}i}E`;7Bd9g@>f1utq3BO=M*pT+s6Lj zI@8!$?AgZNKCQ&eZ}>37sX~P0!AMT*=feV{&JhXM0hb*-`>1LA`R7Ei;jB-cTH-{t zY6M!=r6n-$bD)>s1WIz?L$pw^MVW)>Lhm(BMBTZg711n@=g$cv4X5l2c{I~?VKQ)q zC)t^P@3$(qA2zLBb1%luF2v{w9r77*)Tb1^*n8+95DZv#R(TxT#d`4G?bhFD=>GAYK&mjV{u&(WZ=ES>1 z?m~UtxelLG0U1iZsTvvMK%~ZX<5^eCJi=u5nC=8|-O-2Zsjok)g*K8^BHE^n&vLb1 zf4d(pFv`zqF!vY>OaZu${Bi%gIpYs^eN-v zQTJACS*CG3>s;75rzC-bThLvslO?53g@)t1Gbhjd;*>?o2mOu9UpW7x*U-&GjO5YQ zxDUA8?&VZtM&MbaTR_s5clpLP4*)k~cy1i{)xzK>TKG2)NSDran!5Y*OI?*e(!Y{s zZ`QUq$UPOguvaGT!cNXn*#h-PK%%)=P1gq=DZFq|=s&s7zyJDt{(j`XBV97iTUOJ$ z2mxaFA2}u=M8>r9G_Y|YqXjc57w5(;KW!jg=KNIa{+nb@>DCp8(P-ub#(=1u5EeTS znKR*Sm-Ef#q)X0@A{9>n-WLePrauLK@BZ@h-!OID(N}Km*YDa<{Y6}KH!V3>uF?^J zcb;Ylh};BTeP`?Egue;(lI~%#+iv|K=~|(Me&iD@QR!U|F?Bdiu^{#mp0p~yuSq5{X%m=11i>~H=*yW zOHPHtNJ()_>h)y$@$0&oGTEIFPc^YhQEs-Dvh9vv;MbsVZUV9_oj9{=|T1K_Z8zsd%@YxSV zvpvoKTS)*BlRXQ3^n%@z0o4WvE9$7kr9i0DWkZxhZOnadg}s>dz4JS&;UzYymUTY* zpv&vN&;Q0P0sUKVfNeO3q!?5c0-1rR(S6&0!c6a7dGzZY56(`5uKttO{ekzS|Kf7H z*8=#7yU5kR|Be#>P>=hE4gu?4{rbf}?jEwrV)~z0-Acy4K)S``KXIYI0fhco@+`1q z^Y6LI6Z-)@DERzOol)*7fNUKYngcK_58^oQso7c-H|nI^F@wKRyg&CX>kpu{&V^4^ z{H z7i|l+4aWl5x1w{UMGD6D>?=9Qi{nEj9m8j({|S8GB7Gis$TI1X((D-47Y z#&Up%%+1brZWn~Ny<_bLCqkxK0mG?qWz>g8%**^ZV zGl%{`Tkl<&{mpxd{;IGfMBEPxR6#6&8$r9rz9=AGrtCy0a5`U=coY|(8ELZHGwMZK z{*v(bU*gJbWmZh-=J|t&d;Mh=g%*mB@ z;vY7Xw6JT`i~DYda6$|WFN4g`V_OPyq>-PAY%F$2bD z?{M`q|0r|^_NDm;)ZkWE3Js8E5B6F#SR`0o#EhgU$+_gfUv+H#jR*Y`{B=(NbgsMD zn6>-gZt;J|QU|U`J^R&M8#r?-{?&}A9{L6SPX=I5ekHJsO1akKf7U*Az)>p~ zT^JGm$7NK2UelcRSB8CmYjA(QaApoM?`T z@pAPcVVo6#i!zdDO~s4>B1_fHEBUgCq&JQb8yh~&XaDnUk}7ur;<}9(1+NVJq?kzk za88G#^sT##WqUIGWE3(%&v`WH3fAweF1+X*s|d^+=f1amb3Z8SE!8?-9|2*wY>>l!3Dy zS$U`Z#bjqXU#%8KGkb(qdcvpNQyhi!d)+%rb1e%&om{uh5>sY` zQDm$gHkXfzY2Fh2GEt!$HWF#ru=%FC+T==8OYM`zh-cw6!q4!OrnOOo#p}C~4e!DU zrOKZ1f03`7_iF@)6SpX-E4`fUCl1K~jrh4vD)Wc^T6@pS>HPxwEPU9*R8D6XA=yS# z#XRWCn;vY?jNJOq>PzGsxUdCBchH%~*q5aW!n}M!c;J>X=XqX11R7zFb{enoNe;J! zEv`l5Bl$zghGv=z-eBjJ`*mFzwJ`yuM2vkia>ZmNxJ2Xizp!buPQ-6!@ zbUW?5R;YEC;Nm41@Z_pX_i)biI)u!!Dd<>OpUcWv@wL>39)c&esACuB8{W2OtTDR2 z>y=MvC>xVSW|of!I5`GaO}pIwOaJtty#Pag3oiV2`}1y^>QI@3gCN*FdZfLnH%k>F zy}6ZYlCJTQvOE^Bs95Ve^aEV9B7J@*2O!RLm3@?03;RwK+lbRt(XtGG(&O0tVzh8ex}X_in*ftkRbmes;A%wJP2f&uYAhpF(<`*F|sqLg+BX zTVK;)8z;yBSH!Ol&V!)>_Xw7p)p|TWQ)AMT>95$+ea~~K`!q?-$2dO+wPkul(N2z$ zxYeCm>U72mW79)*h)A3Wue3{!8q#T(*<_`5JJ(>(e~0H=lr`{c^So|LeKq)?P`c_QjBebd__k(R5>KaAuaG~h6-8j z`;HIAX!e(=`k7z~)zU`Zru2m<6xo6EDKWq6&GjCIC1MM^MJ8xa`Az2@RsW?;Uh;CD zIgCE)S+q+#ea6WRwK3!<33`lPWnznkYXz7bI@^e>Lf>xm>{+}8@JAibCl{Hp3+V%| zv%>{>c`Bm(=T%|7S?grBHEiGm$mWS3B5OB6H9U4H^fe0KNLKZ8P@ebsk+zSI5Tcd3 zP&iidXg0%w{8X=R*wH*B`i1yC%Q{VD`}yi<504x{9L`{cLRDRhmyBlW)Oj}}(U;uD z-7bwV6wjTmqUa!gj#UJVGvctgn#Ykn6_L!L6mXG6TiVp#&8<22fSYFcFkVbsV-qS7 z3+-zmjMh%5e-AZmIbF1^+=VL)P??)jn{^zYc#1z1U~;-Fc4RiIpRr>C zjn3@p3AJiL#2B^6A5nnHnP&KjRpSh}oa@`r4DE1qxI*9Z%h4Kg>t?n!w3)l*6%a}v zt9=gS9+8Y#%3Sd#QsjJ|_BK7-v5F$RRC$!aI0H)5cD6YlP!?`V4};S~MGv1(2JZDG zfxDB>zzR^@Msk{JC9z;VhIAtPh{=*_Zq+eoH%;Xe@KX4ICg~wp>D!`M?S4lP>DxYaq$}zk4@F z00YQ`6SW-$m7TcW{Vu(xbrV#)&{iH#@C4}Y%{xKk1V;2)y5w58vd?<2Cg-J=?jFvR zQQbftdwnZ;-%{1_n?sFXQBJYNxy05PH{^wRoqA??U*yCzn9w{+vi`U+_Br=HLr{-`c}$%Mwg}s`FyR#<8|$r!-F!Keaxqk&`TaDWAZF@9|1N_Dfz673uF^BxXFJM>p{V;lna)6g3g8?M&q1TQx(X9W zEZiCMi-YAKk1qw!c?xN3*WO#>d)YA(OIo3*p8XHk*CEe|+$Aj} zWhR%qvfmxn^*VF}+mqnQk>nFy%z%y&qpgy1hQ^dTXM=Riei7=YZQ(PUu8wCO(l11e-*TFM z_)#!KX1&AchvR_Bqw;;ncM}7hfgv+97y>jPB!(>2g8cL`vOJ*C5%Yv#v^c!YiqF9Z zUnhYoCg5(p9 zF8`fK(iVEUwvDZjAADb-^P9$6xnUDPx&MrIF5W_V)O~L*+|YjBO)>J9&_pMb57fK< zaDpC80MB0RTYeQ|l#LM&DFTf^w{MpjE87YqC8=4@!Uev<<^Tab6IHF5rt(cEXt0DV zQ2k8{k6L^t%mG0e#=Va^Eixz`w|Kw*F%#&ISRG*H0Az9$-F}q^;WEvS#a?Kdd=Z?y z_waDWkmS6c3HZmxX}x4V2i1z#3ZC?uLQ`z=PNX9C$(hYt+Ax+DBR*~GI;jSp$0z;S zMz7F}L)w0g9Q@Az<&vSqB*vW5tult2DmUaxvQ4oRVkSmm!B6AuYP09J-aP$ins<^5 zGvhkUB^z`90g!=b>@ZKr8dA`>?4ByryeM>td&w)=-%@){(bioi5`0s2-YXf<@o1|> z)8Dc&WkWRvZ^f^x*xb|*f#D`1FvYZ3&d0CikZ65au91T^?3?DTD)2pKJdPOLn zWP2itM2y_9b6E9t^69#s*}H&xK@;=7mC@N;&vfm|Q*f_UZNQFe{=An!md=Tq71{16 zPJvMU)>mGkT&_}ASPtb0jh8&Sj#E{SR&3J~jb`KC2SaVNotOtyDj$;Ar2*rrYAx8m3Dq<+wC&25y|OGmQa)>p%6$W`ayj@*b_uEaeMmk zI6|&{0$S0$HcJ+$Bhyn2V|hm3I1wQ5+H#{(U!aZVlmSBrcm_Uu7E)!2c*3N7yY$pr^>?e%@R)m2A*#rZi1WU zT$F)nY$$9beTxYxW_7P(y28O*lVxsz69fj(MlUt71EcY+!Bv)Ln7^O5Io{qgwuS;6*kdUdwP5~dUVmVA8uel_|0pv{SXt^~F4OmMfQSp3A%*{bD zTh?%5t%8FDI}|{JW;vWN!Z@m>VU@{6CTh{OnQubBYaC%k9h3hF`Ff9AH6!o-&GaMw zR1R$M3-ZPl?WM+Tqv-G$rV@*@yh3{t5VguUdiR;vJPOpX9(peTKRcQaQh=pz^uMo% zAHCC7Ft=fz;N1*pIZl9GD-|7lm>HQ*svL_0)13L4_GRW}^OnjRzsH*LlsDRD__t(p zkA{|2kwTFc?}0(LbfPXKa;Y(iFObRim=C79K;dcBfg52yEPwd-EC6^S46gF}nT%gm zd#jlAM%|P`9c7O6OuKGvK}Oq?){sYiBvL_IU}>4N81hciHdS*iPC2tivxpDcN9a+p z(J~E@<5SE8oFsFL+}C2@-&~&PG#<^Rc)2xI9uN6I2W18pbgNz_H;%*1eq@CPe4Y<{ zZGO?aKbU~pUg+U|v-}-{R~>!&di7Z;0OcWc<^fqdgJujTaBFiMNPUs%tY=M^1{Q#t5^Bk29Mw}dbQ{g z3xk2?3}ln!kqy0ouSp2JR9qM+sLbb*x5M~C;{ENkBii7AV-GDITtI#Y7W@rkjX)XS za>^mG+1x1R8cxl&+Ote+?Ps;pP>5#k!qRIJLiainbHB-oKYPe!8ZX2(giO^QCLQr* zRrede8LZm+FSEG3|+YF*BE#ufKiF$mVyWQg^=$x zb=LUbV2Rb|hLC|&y=Zsn2vtk50!AvqdQ%KQ%>TCE5MW9VuWQBL%p<{PD zc*sJL+FSAa7mG%k*3u$luF+L_c?SKZ%p7Dpd;@`Tk(+r=l8)*w59<=6&M#i_8K^n7 zz0s^qP&Z}y0Va4R#R(JKs6fxSmMrlkpqW!C`SSAm&(lpZ`$M4bY@$lX@iRWs^f*1> z9;TUl*!M$3qHh_9X&V#=~re-_S=+|Y5|JyB0a#7hdX%WQ-FOH=9Q3oJWGurj$JQGcEU#E1Ah;M006_GKrlDZ{ zWIm(#gosZF$tLXZ)R~BKHO4(~$E>t;{qPvN50$EnYt+nA-`=M;f# zbdLG6sJ6@8?=u2?H}Q`yZB>E<);3fpS@*XD&h;#klSoAeYE;V$-_%3-Vxt?$F#ta) zJ=4_1CLjm~k{3<48B+s#9iwNa%v-RMJ;LUkbQyHQ4={LRaNi0wKp4+3=UAmmz$)#B zsiEeWsSN*yts5=3V))X5xbqkzE^do{hhxg+GK->`e#$>wmTqZLe>|lX6wp0yX>t5w zT?ZafzB_h7&AU{0cFccqPB9Nu@886fU?6O922}zl#;FcJ_{uo?PX#W@C#nhp!1IF! zE@xp;Uh!$;^8;EJCV6T5HrUor7gwZ5R-M6zr+?Xm&=K1|Y{EUf&RNf#pFxQbr$lKE zJ9g}-^e-Ebfao<#*U($T86=|-qG_4^topAuKQ^2SDBq*<%&E?}ll}P%O*h;} z)eA+Mx!D&9<446@{i{YY)mrZ%ZJWEAKCBA;4}AG6H~_d$(KRSQS5xr|p)N^2sTsU-lD34E;no({vuG2YD1xwXF{wXxs z-sb=$hy0sH(QS{!TLPtIb@wai%HL|tZ;xp|BtC&!T4*yYm+!E(i5&f%2=?*u?Z^8z z#U#VDM-Ms1-W~17!ZU54sYk+~O%QfrY?x`mT#htH<*|luzs;h5_BJDUU}KG**tGhC ztQoL|Q?6=lb=lGH@CfkOLaizDVNpMhR*-n}S7O)xFm_BEOrafLZQbW&MAJaME< ziCLq3Jlj{aHjPh@;|w0mJhDIPnn#F^H~8D=V`wt@Qw?Z-t$HlRCe|NoEQ>gQWR}yV zofGPiVe#8=3+KBGw9fnZ+Q3GY`TOB3&Ct_Kj+KKS?1x1%Iunus`yC3J5IeXOo-DRw zsC=l#qaG(1U@$9*|Gtem#<qv#=O$+ zfVBgJtvpw5ir<)^ImNmmJE*8qLJt#NQ^}m+n_)D6RC#)FDtK^;U9}Os?ifsXMw0*JsWBJ(D=R2#zl2)3vzTf$; z`EBWA09`YyDdoOCR)UbgjmH)$Lg>mi4kwu^3O`gEz-XG=rdmt0uasr9EKFlN%MxEC zzJ`29Z1ih-xd>#^b9|kXaGA>!L`a1}UQf6kMVIU_rdXL>j&V*{heD(1+8BdWP2!bb z%GQDZ=>K`Zt4Zu$SrK9ze$4E5_hClcoJ0*t2 z-^q#GrJIb)0-bCJA0HmtDaeSPKE`mI_x3*mn3qSFg07hdIUIt)wg${JMsW$lE*2q6 zpJg1v1gyL#aIG4d6uz%9AUWDywklX2@f026NV?1KiKUt{o6Orj`YV%RZ|>o1Lmck% zk=%0X`^7?{@-C$3cib2Brjwfx-(Q7KQ!BxpWWfCqj`krv|J0F(T+%T6xEiuoUPnP*|h8-nL-M~;QCf0|Wi&q^m65(8oSVmD> z^#w1S;9laBTG?)PD$KoW9;%qU@DZ9C%oEEh-X-3&v8VvL5RwsAo4;T-p!y=rX^uQR zRJj8Sx1wY+fRI=B8mI1oXMf5@y!iMz!j(4i-mK`-Te^v&ULuj?SvDwMn;65KDVKe< z`q_!xOlncB>8f~MSX-l`dU#WZ7>H7dC@1M4t8@vK-*yayIc@l2tT&+BM>H3P%P)0U zeO*_xa|5|BfOdYqh|=kViEk+9*>F@Fha*Q+qp3K^@N&_265AsF3}UV8%BC(a2p6$7iFf8inyiy`m$MkJ-v*_|n?9%Uuo#00T-NDS+PcYB-HtxP*#-7b#$#%p}!bstRY&v4ti7e36 zAs^qv;3LNDyaA*eWfy8a8WPNN75M4Nd|~SVO)+Ep6^NX8{30arAl=;A;R?gmKchiG zQ?*3_hd?ccfEvs@cjKgGAHG67<>PdQ)rsD9PFroxm1u?YgJt#(kHIPgH;X%hN~gm< z9=cm4ZG+18ba;qptx_nPfxo{_0A?1eAwW5_}x4v!&M!R z5cvMgJyFWKmR06M-sH`4P)0`>{|ni)^7V0d&P$@(mPGKX5q@0P&S@V>wvQ?Iih;4( z#cGt~nt(T>1Zp{cJmFY*1=wv)L!HMy^5!G<#NiXldUeIz*g7A4Uc))E8bSD^26$-7 zAoW@53MVtKzW203V%WZ)d6AC;GmgpVcf{Y42k~NJmnz?_uch?|My>sJj2=eYre*VI z9j@iXJMS#+e+l%0hFBf8`V_}2LffbVt$76u<6J}$9b^#%kAd#33Mtc-*$q5`&? zf;}&2f^cskhSKnlE*AqdjEHdDvf=d0}aP~&kze9%MZl8X%nI4 zt=SzZRpcDFw_~@|j-7k1?AVoVE|s?%QHQg#LiAk@vASdmPjHSNdO-HUsSr&wW&L>- z*~TrJCD-AE#Rm5nP2-MPP1d}B(C|s87hjeNzR){@n_|Y#j)h%wv9;F}bBsPPl78D2 zjE;%?h`L$WsbPzqprF-0QNa#j{tg_TVUhRaT9G2Ox*~-JX1uu69crqq1XfP!JYIfy z%wxNJ0#+MX?pZkbAYy-+3q#PGx9g5qX#=>iY|jxB%qbV3+T4`Rin;*aji4)Mb7Am_ zMv|4QzWB!C6=&#fgo0l7tl;Ks{0Sa`js58GS)*(90W;2>N>As8&4n9FWClwg^`00? zg4ir+MB%glMVO)l^l`j z(g<;G6!!Se$&2k=XCx`}{ABsNN>YtO_}3AU>g34g56#XaK_9WjD6=z-qV&*11%Z&> zw~U?4Jf-N?+k~8_v*9h8R8&*dhqQXej-E`1o7JJB$F>iZtE2T9cbM95C|-`OIyZ7W z8fsHl|0-{WQf|Bmx}2uwwdhUo@>e?9PadZN>2a+WyfPJ9rg3s`a~WkjJj2llzWyLb zU$?8$OaQ=ednKx??;V;6Cd{y=Mog*g%=p0>&#)JJAG?MtRd zN!^DyXPl!fuzqsbfiq~2*0?|9)r`Vxw6}+yWr(}xEHv$9*`xW8SQ+#5rCMY7;^?=$A;x-RR-;OUr%S-l!9 z7y>%A+^xFM;8IbYFeDgKmNBHIxven(5g+rt3FcYk=pi3;XSRG+P8AMGC|&sQNmtun z4-iLoYBJsZ}`BU4*rl7?LYEp z(nhvNu@#DWSFhx?;?;eL&2`cbLtL&^Vz`@{DMILTV@2|nZ`pw90rg*c2wj+ z+64Qm7H3eS+RpUGTS;E|uo+f!-$uUNu*2AF6y>d=K<%xv@14fook^Z{@_J1?v*zy@ z#t>QSB8rABgO9EKT(lL+K&mPiIXImy>U}rC5Lt@MhHp-=Pv7nx)0k#f8+9S4vJE${(XW!lHlT=|;8*1Fz)Gqps7 zb5=C*3t6fxMZDdXYyMVpuRt9oqTyJ6$x_<{cmr?Uqv|Vr{?}=w5+1oPwT<`J%X^jM z-lb}>C&$QM`f2MO5gu)bxnV+HMR);L6@oi@0V^9Wa~kA4-ggz=u&6YrBc!9ym_M%iXexvFa8Alx{P*5V)sjPTH5UR% zN!>zEV5UwX>5XC`k7`HTtuB>xp~MTAOFj4jUmnf_2$?zQI{63|KVCaRy`UHdU&WE0 ziiXqm`04jx=u1;uFSgpBCdE~oX+kwZ{TOXi+=vykEw+qFh54&m2mgy`U$IH1bH!!^ z2M|5;R-Ga2nE^=~EAJ*4()@}Lmdfs%nkm7=-w<6|}PJU6DG`E)t1Dph8-VXo}*_q}^k zUKj3j$j+NwFAHa`c82sQ`zgwcoMPas>l7zPqfjetF6M6skyJ zuPrtc=3K{84-J~q*PHgRGPcsU0-{PTs+6}PZ9*v;QpEbWi>()F z)kge#hQJT^#x?q$yDUGv_mO>}{8nL9i?{mnRey^5-bwYU*c?~F1i)M44(%`hSuTA? z2Ndh#E8ol(!8eU8`DfDD*TTO-_=(q^aV;}I@aeL!zya!0gww0HtxoDk+HD!9ktFZ0 zj7*4AP&vcaIDDi6q_clTRVgtrNbycqO>8BWbxJ;2q@?qk%XR|7YOfLUHBbOi0- zwFnA{;mRp+7J6$Nsb5!4PLvnH4e~9e#>PeYIAx9lfxx_ws)%~Xk&LZ}mshtFR{hLi z__dDM$IqipvnF4K_Xiqw>hik_?0Cyl#xEI37M4{hdwg&4x>@Xn0>*YHf^1@#eYT{F zuKJ9Rs}w!ML~0#0^729l`kJ4!t8!1Ui-k_UmlV0Mq$WtL>D|y{4+Elh0i+3)>gjNn1aLaz8W*x-`VN zXvLMgU?PXyTW`fn%4#mv=heNKjWy?wEYVpT_YloqP4m4OoE}Zv2Rg`>Ey|;g>o_b9A)g_A{B_7ZyS~@TLCo zWIj+{W6=oNyOC}!A4%WQU|xmo zPi~28{3Xee6u_-eYbByt)_psD#RhwSE^7yC+%{(-iwQGBpf%=_E51FjXi%u@a9^Hm*AHrocvc>Wd%W6{7%yrmS1ZCv>|>4 za$-KXs3SD=yVz{Q075y!xge@#xbb&*FsJv{0YV=&uDJIODL0G|T8Kxb%ztZLRcxWx zIuROT@UW>S*Vsn%wvdx{-d(2VFf0H$KfzPpa25#Zy83rEu;30+l&Lk&xace*7nR_9 z2ZCyIE3KZRb8b>=8Dzv~vst`y_|~qz@JzA2mK7wbG)Mhlm|`Q77@_1-s<<~3g4{8G z=DEv5h)q*?0xQtjt??Q-aSgG^>y<;(7TtJC$WS&%M=yx?wT22T?I;$!w;*=~8Si~l z*;}LHO^#bs&O&&om}4t6QH1D~u4&Yv@eUh$d*2_4;UBTlO|9SZ3tTWxs+*#x!|vVp6$ zq8#Pl6!b(QLhmR^$k#qAXXuDocoeKVjm#W`Q%4FMw*Ga#^AI6v##k_WR0XZLMpB!F2t-!B^ zT_rA<_0lhA9OCc+^yc2jL#=9bhydV&u!a@k{G!Y#S9yW8`Zz0cYK9_>6C**oz#sAN@SS<80L2yymy>9nNc<^AQ2weXgjzHs$v4EQ*fEDzcSm*peeJ z@1$_(Fl`^Tx?7`?sIlOFg6X999{}TkEO~c75D@!Y;$F+KdNQ;X4He)044>EKbTwzQ zJ_ni!&F^Qk!JGZn=N7kY2ZF^%YgJA~hZkEkyjY4lNfz3NfQpkAXmU>PmiV~$hllp; z@(r$jd73z;qTzO(-e;y-?KY9C{IOSuyE~w;3gI|qAMT`kF=$P4>zpd&JCOuFc&IO3 zD?sRHcTRz4@_gyMa`)by9&>T}V6k{q_rHm0Dfulo4MaMwNC zQ%57hKR$Hs?#8iomUmwaWgXog2{%^ax?)~qDd272hjsQJB?ij2t_&fxygz&~6@Ka< ztner+WU)Gb*V~NUeYt9WLw31w5&P*up-%0aK=@C#96B z%}=za11w!Vl+Dvr49IHocgA7GH{URx?t6L~ocg>cxidHiBEhnMgw;bGJ(+`AE(6ye zRPo7=)!z^#zB2W{dFiItM9Hyas}C=uJtJnnsxSacHd)pb)YYd0>4WNNt$IHCq}!AF z7*LLoA4cMGi-=JWJV3gkDn zM6P8}1fmqUs9c5#2+)&ykKfyp*ZT zK?x0gIp8~Ls^|I}YXf;!F-Q2(lEK)Pd%yRnOb%jVb>ej(dlkZl1NPpZaRLdU&OO&u zhIS3UveHgmnq5a$lI{RkgNKf5p+2}*TX=ri|RWlYnn|mPf&Pz|DGB5a* zfEQDa_Bndl+Kl_iD7IwV9Zk`xbJLhIqrRzjX2!oJc8Gu{XGnG*o}_M3v&$_@JfCt0 zA|kC$IJqxEThk)HO3FnF`0}}?KSp{MM+zuk$?dA!r!)|6}LovChD7iQ|5C1ji_*%6Wp ze-sG~FSl>2)JU^FByb9ZXOuY&sD+4)_*I?62 zRD55n<*t82yuZ#?>1suh*sp~2F#j&st0sZoAb7XqE?>hfnA;6~y{7c~^sy-Wlykd7 z3Y*LGEmzeWuPPlKJdse&y5%e-#Kd2U&~Rq2XFY5yj%n7oPP%`>$?oWW4cU;@Y$3#l zmW|gI)nR`TBVZNPox3@2mUfm40kMRX(XKt0jABmN<^T59%|n%^NLoQh@@F;#q8b^x z_MG3ak!&Tn%XN3itIy0jG9&$a-$3WQ3+Wbh7O*G=~coJcdNL;#`#1D{w>Qvl!mw3y+?K}Ty@##9_eR1 zO1-_Axtm%(TVLM1rgdxkH{N4EvmO?dDASzpGPRFsqHfb3y@w_)#eY879Tw^fbQ>Kkh}iN_Z>OWrzt`lgN)-|$w0hZ`jGg-S6AxNeKvUG21;C= zSe;1;Bw+i$q~%_36EdDGxpQRK17jER<^!~zSEvTA^XKVGUHW{9aG!9L1p1`_DpPSt zAxBvK%Yu2<$@WW|X@Sv^z2D(`oesW6Va#-zaVkFJUnM;M64mXve@f<_i}SS872bbU z0sat?2k%#At$Rv0#!uY$x{*0hAfEY50TF8BQ0{k(a4xWMFf;1vzl{ZO%8I-8 zu-Zymd=&mFYJYj;pD(;42C1(Z=lj=__|G%`usv6nPXYUB+Q=mS<>~)pmHriuUeO0m z&#=br?UDbV)&6fw|M!*tPnP~qxA z{3@<#x;$g6c(ylN#;qeExuwYDInb8>*&nBxTFxJ0v>i92x6dV6=)k#MfAwa628n-| z+87pwRwanD zUz+P2PjX24eQxR%C~)#jkuYFc^9!I@NIrvYJtXd5MMFBRJvg21uc4&Qe?A5-L9{VsaVPsQ=u=HTmtctl0m6 zkblV$?_CKz{cFQGhCmVwK}oW5#q2f+EkFr_IPmbi)Q3fcc4}$Ke5zKzQ@7+ zw>5i09VM#A`Rtv+zK+h}!03pfmdO?4={PE4ZuI5b%03o;t39&{KBk6Q+74g*Vga!^LKTW)!?j|DY; z-f59X9o4YSP=il0gzx|TSKG1s#p$GjG2CyMmY0Xl8h2vL96YvSc$M5gvoA>phm97; zm~6tbUdrA&r7pK!P^BCfKI|H=HS;9(a;esC&K>)u$G`L7B%}iH>%I{mR4!*wVvvKw zQo}{9rq@OOQXTnA#Lype<=P&Wa*_F^S>GG&JECVt=4Q|c$sdUV;w!Z(0YnqE0P?BW z6P6&2RVciD8=&4QMXeq6>AMY5UwQb^qy1_6%3Mx#8`XAk+4YevT4!xi^yF0nd4b`I?RvX^C9v^AyfoZaH`8o1QLTqDF=#+RU7 zSKFF}C|uFmf}a{k4QS8_K1 z4t-N2AM(I-s!Pt^Oe;pF`>1Em+1l3a_pu|Wqf1RwHpNaQDT7MeY@lEB1i^8btA^Ul zQ3{?tFBFcC3VkN|I1GT7xCODdPe)6hwe02=u?>u?kLT&dv#M5mADOPrYv;0Ql;rJ{ z8F`x<^wHYW*CaMOIjsLb_TDq9$?e-4Rf>Rg5fP9sAWfu8N2N-YDjlVS zj`R)!0xG@tqVyVyfYb;`FOgnC69}Pqf)GOPgYJFC{@-)=8TZ5ctBoZ_YM1R`1(D@jKj)5c;N#*7Zkb5iukOiNMR+e= z`mRQfVW5ko5$iH)ds|MoDAPioz`S7In^13lH#d9G*@;I$_r{TlA4)%HGreq-#FS-C*5|KGIK>MHuK3gFc9dOn~<$`}I zw!S}igod}FYKM4dB$_5B=wc+1Z`QwMW<)>!7jybBM5g;DGDFxQ-k25yjcz?F+=7oP zU#2{h(7x`wR$iXgdQ%X{XCPvvf8IVjX^5javC0g*v?>2Ohv`az4>zCtAWopEBM={f zj?Np`j{P)Z-Li%qflg(^0-sTyi^LQ8pPt~pb}zRB-M3?=WP%EHz+*oxhOZISi$0i^ zJ~?)E##J#~!ahAo5*U6wwA)`kQ(JJcE=X z!9G5%ikUJcqoWUY+jQHrYUr zJiYT1UzP4?RHyW5&-9`{6aV8aBh|xoZVa7rQhdXrHLg-SWuT{B^rVhZF~mjc_1knr>((kaRfX2HcSXwh z%gwgy1t2&mixl%4{$u{+~-S&=mSiTeSckl@xriknN>O8KfD#~sxE!<^&af#u9LKh_mk^0 z!&RiiCc0w}sWJmAO|PnvMCxa-poI;_#M77F?@Iaw8Nr06@mDE1EoNdCzdGj~KSs)8 zS_(ZwPbt);RDs*qRFd}Fjh+c9ralW1FzFQIfF!?*KG4GMh=OMdBFDc!qWLvAo#BO+ zfN*hcnG~+=ROQah4ZQ^RM$v1!V{DT|vFXJlX?u=uwn}O%Aq@O4-RgpFP`-}Yb#7Vg z?vA4Ei;=cSyM6OeYBe@w6}YA(P>gtKwdK;B4IU4kyLhbQnZIBZMjh;LZ2JoKWq%mG5qb_H3bh|Imj0XCzFRm1{cuB!z?~^UZQe{R8Ub2~hST zzOPw)wenv2+tKSRbQ&Yqncz;H%}$V?#P4VPjcsbaON;?_&~3`22|S$th@Skz-o#a6 zWWhoCBX=LLK2J`pFs%0~)ZgX?5$^tFh8=r^EWgTW-Xp7XrzZloM-}lgV!nxv8QeCv zIB?mH$IzFgcZ!TimvC<3W$xkPeZXiK=ea%Yoc)2+aJttt+*crQr_GTeaGAsVJPpzE ztcMQvEStZh_U2(!`j`C#W4E8UR`t%vZII-__XPEx#{_j)HR+=^)5U2yrv+3w2@g?w zdwYP+x~PS=eiJXmYOH_p?2WD`m~c2@B}yqZxp^=9hf+m~=&CyN3$d5#o@U?goUFuj z!pFykzclmzg!0it827+<0oh*?^dVI;vUuuNL)k3;s0AwXFzfI8d#ypaOOhaOJH9iX z=^~#+ob=VbwMk*sm#M-2F9Rhp9T6_T0caK5vW+LjYuTDwlvk623kJ&dhmg)~Rdj2B z`h7k7+aMDhCzdJ3+cOoOLu=Fg)BhsJa&rkR-kIg#kLrW6AD$k!4&;o`-BzElh)Opi z2=l^fE=1WbO^t4KM4-8KQ>B46l&f1#H+*|00vc!e8kl}_{Y_;1%xrz8mm%GkU+bNx zvRPsD0Tz?x0jjiHa&F-mu4mBW{@9{ccw*IYC;AZmfoKp1T zmW*S;GU8IbGAmN{IksEd?znOdoiT?;fg)bH#rn5JxDCE2ifzyINn3z`Y`J>+BjASW zNqrUI>YS)xN6`q$%U@nLJ2`e`HvmO>wzXQF?6Zz$g@^Qhub8pd2L8BKG^!e2*GW1x0Bk4;u8qzRcCt+PI4rA|Kt1GPx5Geq6MoQ7c(Yfx3bM89 zyBd1Qdj^N!sTLj!ffHYz58Nx1&@F$-#AE2WAMu5#jryX(S=aYdphQ})>577K5~of} zzSzr8^@Azg`ZVb}L!_`!})aMEf^-S?jgAR*~gtMO6T9 zG`R9R&T*p(Q~9)zTQ0FV4H!b`dHo(bL`^npdUM;`Q${xQ zFpfpRC)zW>^G1LzMzoGlEc!}H7s49DONN|}J& ztPLx4z+X_8CZgj8;O!$?CiqgWKBgN-%QsR&&L3;^)X~Im@cOHj3#?xGKU5~E@Z4#h z#V8S*xtE(0Wn1*|p@dZZKvMF7c_c^a&rSs|she{+2P&XOoA=NDRzv@(oXmW$4yCl~ zd7=@n86oEb`ljU))jSw*990GUenDLhONxA(Ip^q|f4w?v4`=X2A#yyU=lrL3gi9Kt z^h_k4@UK4*u(vvxt+Ol0ubyYfJcCs}QwU6M7TfScPfVws1Fap4C6K=o0?^zc4zPNq zh-3%ZugzC(mil?`~!WFSBsFUBa=0f{jmlack=@r)SqP>3=T&B zU^0!E4QY6ibxp*6d~VkV+bBlrFc-q$$9BXy4LRsGbXgf{@P_X+n1Z~4uBsO`4i-Sc zuI>%D&>yGoq!h%a0Y6$N!>Bv8o$VyZOiy!N=9{5Y+h)%Hpy17LefgNJXK@5-{SC8x zqAoCiovYTgEC2TB$cB0m^N3q;4^1kuTC^3Q4ZUY`obCYIgBLk(3D}OW-`iM8Dw^^< zvPBD8pY1xE*PCaMOQBs-fYN6bfPLC3IAr)`0r>{fbK%-uuBu|flI$d42=YMysc*{8r?AZ%=C)nDTHwKYaO`>#_3HGm(XROet&SE7YEfaN-PpSE5PqH#Lf(}7Jo zLFks}SGw;H)e8(uh_GSmTAlWf*vCxGd(h+wrm*E3ENv*n>GrgDhKXT_^Yk{u6bdLO zBo`nI|BAVeheALhOM#c7%>U5Z|NQvi0agy_g=5C$;uBsCG8Qb{7lq_FUGIGYM&$T9 zO?U&Kt)#sIP^rDCXDplLF00^9^TF@y2Q9-@Qxd$8!}K{1lraE6KzTSsu?&W^>TjD8 z-@6ak_f7dD2@P3OBT=FbXOlu_fy%c~lE*EaO_6d^IJ5M|4{4i@-1 zKXSug>hD?rxm;S?{y*uVTSUG>oo*X&y?!cFKRA`E_9;s~AaZ~n&)Ps)c9Bc><8(;O z#f%}-t(K{Y)2?bsUoWfNFe3CqYWLX;?_OFFLrS(}O_nH%{rx`$_dkRTBLe}jR`|&4 z#el*R(NDGZ+Y!?17t%A`U^`kq=pRs(2{^81|2~)veUa_E)X()WVGG>cEqNb;kuvb1 z_k2Cb*X)YeY3R@LJgsY9zS--u-@_2@yC!pi!$j_0gE~}(DmS{oTWYP6>+ZP^R<}K( ziSH6W-W)&|7&bgx&O*i@*q+;Ukh26NC#d!DE3blxWP_2Tt}ArC^tEl_%7zmSI4>iLC;_7Y{J;MAilVkTnWwHSdvxC&b+NT7>@kF&606 zetHUFIFAyvn;ls3AvDv{l5W#S4^$e@s zId6Wy@AyuI`*Yq$1@2|ZF2^tC3mjmRd;*_Cf?L=0M%othVyN+I^6Z@#bU|~b9(`Rd zYiUK^BmwgY0-)hr=2o%`J}BeUDulIe*4To3j|0$;IV9Efz{9Bh@-JJNNVT*!mtpf% zG1`YSqYT_+L?T^osM2QP)nkFbeV5|lXQ^vO85fh`?I%;lT)v*Oi_ljN)9g)%Xvxd_ zkllkDz86@Si2DOrK|>ppDST5XOmk`~!Oqc?CF3HrRjq=%*!r;P{QX26gRbT56C@a*FFNN{5alY^$i^W4Ps#F+=+XmxEE|q#DxCMlDJ25ARJ{+&9OQfe;vLInXI#M59!@FV(FUF&L+oMY(pC(jRV<=r{rvwW|lW}PxnWR-=P?#-G^sqN~dB0r0 z)>2`NDvD-@M*oRO63WVVw(xZB0{2MrxK0Jam1CxX2L?RpIKcl~_2I=mVygw8ZeHLL zT6}1f2TZy_w1z+rd;b>B4kDMS;(hc*POoZM`w|Ib z`t0#_BKg8RM(Q3*9MuJ`@sYTX zkh>pXB2WP?qwNaJUAHXSV9`qw7OB)e70vZ80^~}T$lL`I{*O3q0_=y<>s+3IF=zE1 zD?%U$T5JGl?8zMZs)o&k?lH-K+BE+VLf5eLamcm>j@70CAK1C=EW73Su#9h5aDv<# z(9Em*j^X{@h%6pfLI~fQ{WW9(E43NS^i`bX3EI= zKTV;HLZ%ApnSUGqf1r}AR~(pVivSDWzX*!ov24agfChxP=FNBih<5(BkE>Zgo^By6 z4*Or{0z4AC2dv8x9S82eIBS2_@DSKTslCD8>;EI^o30(EA{ml@%X0vecuy2mU?(#0 z5Uwm&C>5#`_l0U(&vBZ0V9Fs*hqk`Io5!%r8u?!slS3J^gN`$kO`vo%f{9A$?+Gb} zeKS#4Q(>dF`8%b6PxipD^xd{W9dObA%jbJzH6QOymTNM~S?v~9m_c403G265)p8rO zD*ad&I9kis`8^+v$H1Bsh70KZPKyLBD**?@3n^X^cD02;7pxjht0XQ;2pSiqqRr8A zgR~1CiPr@M08aKbdM=69GA&JC{qH3+L*WCE69#FQzs&kuz`0eI4R`&sZb2>Nk3YHV zH154`qUM<`Dln4Q0e?;zo27AU`OfEvOK?+iBS^Z%_0!wh28Hl-aou9 z6mxVYswyy9=s!zBE7&DhQA+IB*jW` zuY9PEw2!4v8Zze@Q>((*{q)g?c-zruD7pN-;mg3ZV-&(x{u*)z;4uiAh~uwl583@6 zpMCVxyd27wenw8KbN%KS{(yEdKHC2RF`dZ*9G)YiN%ZI3F}?%N4*qSDzd$AR2{JR9 ztQN+LBryHwg0)3SW?+1UA!AzA`0<;6PFHLpu%}~RR*Hpx50H-wFz}akHco=yC&ot6 z42JeCd{yBJ<`4GYja2;WAoW@U%TGPuDoFBsl#i*vTgg4IrG)?Hgh_xIrqv#KbC@%RfO^_!8!nyx z6y)g#U{7%s0P(amt?9CM>nmccy2b~+_Txq}cXfz1XG5NL*-Krdt+uK`2DImv_%>O( zurW!%>6FA766$T@esW|YeM$i6Oc#J{5>{kOKeK4m87Vb38`5pelz!aSY)ee!(&;E0 zY#K7O9N8Q?Z2x6>xI{{5age?bZT(#4y#_e{^K|)7H_9)6OtuNzmShT;$*+lI-g$Zj z`a>!ObFN$9BXLzz51C@cuTxHuHaeN9bnNbI4a~D|le==;BdSn%eGt1E9F(uxtQLur zAyioywJ78=m$!JX-?r|bI$mlt{5w*A``*>UnJf3DDKEWkGwq)x?jxXzveQm1g3job z(q5M~4k7spK^+N#&*u%Ml2B?hT*etsTbVT0fw>XViBb(>2kEKJ>I^TKQ}sC*d5N7Bky-)rp)1yAl_jR3-zAu1sE z&W0Q#Z!pjy%yHu8;l&xMV8=`_*xzS9XI$6-7%p#uVVo^O=8R6cHd?89?w zs{oVW8phbk-!%IF7mb;V7zJvPt;KspbJRzoYL}jXP@t!dewGUqeV?YH^R3Km!vS1` zRezekPgawS#AQ=X@wi-*eV{y0f4(=@_N$T?C7FIB&4vc)Jx{7mo8$0t4po3LpuN2s z_&5O0#KkncZwfBS3wJI8V3a~Dp{!iIV5jOIbzdNa!j@%KtNB}UYLa) zQ03oPuEZzpbwDK2JrVlI6Vx~`sR&i5QJwnAh;%T~%6?p%;QK(~Ub__DEfSgBUO;eB zc~fZw3Ep42iJbCqV!=!`I!Ei;&o`-_6JKa8pjZbIBiXz#haqyRtNDh2qHUnhYkL8x zFNT7J+=tJXmenTUY38)6Z(m8(TkIz$@gL{t)cCC25zV(@-I%HQNNpXhS}L%!wSWpA zG_B)6%98I{el|1xuGlDn!>oQKx{crc5#3$M-^w}*d$mH?y>|4DM5gE_T4Ixy2<4RygHnTNR@+o zvrW-oDyi(48DGBr$jeg1BYcL)xUjQ0nyeU|G-|esm>sQgqDl~zQ@}D$KY8Gmj+k)$VLj9bY^nMD6ZF5h# zl~8M)b(*HfcPi~rNN)BFZko0^M%m0ll#)T|nLTooiSf4+)eBM-KakzYvO^kByjz$MS)uKg<#BFKT*FtRj zMw<2F(z}mUyjPaoXJ&c$L2!9*mtV}@doj~?Gg!e6^$s>)T&Wws6TM%TQ7EWkT@AM> zgP)mF4Uh@ozwQhm_KbHuot0}6DqA%UoQ2TJ>hZML-s`{7>6B6zt2z9>PsB_ zF|1sXUOQoCKwDZkL6%CEyh*)pG4^737*FC>l*R()U6{+09$Uv30T(EnvejIw*LaVD zU$3q=+F3%`*?qh{I82`>&n*l?b5tz0Tk1xCeki{XM!(?U8~}mX*K*HD1lo5#9XxPQiX(h$?aARy}NkW!r1?;iWk2$ksxRlUnR4_XxI;lCw(A**yi#T zDS0SD8}~EgKtJz-XHz>_gjec^Iz=SoG~S0Q(xA^*C}{w`LOdEHV}gT9$hpTncE@t4 zobV0)k?Z<&r-#;=t($MbBeF>AWQkiP}jOiXS zghzrPr(2-08x6LBrg%35-2{;5d*YU0vs*}}Ye82I$I9EEZ{oHyX~H|d4D<= zvO4rrtMyKqXyzvo&(nZo%p>O@BNP%W^+6U1Q~>Z-k!2*K25f-1jhmeD@;LF7+aMle zmLBQk9TYq;{7Wn$$)HKwYSZSN_H>pHSLy-&Zd1mxIMi;$%@zSSjPo3-jH^yk&wQR zIv=vtiCasZEYQUGHR`kwm3r;A389J(`bpe=e~BEKG?7l4io_5U;}};VRfP}bvaS93$~sy zN3}P)6!og6+Jh)P>rThmD5xKMhq?u_Zi)DBrNb@0=sS?xgZVYqk_M6os|}VSK5(t3 zPSqT;yGoAA0LfXLoVegNlUGSGW~MLm8%c0RGv5aAiLNhzEq20&OqA7xhEIHG*?nn* z?Pr-$^XO2jDd|>{Syi`R`rs6wIcLA}M!GC-a89f6oR$6h=>;^bEqz(^S6k2}sCl+8aPKfAzto)96gOIm zAtnjhGgu?{e)c;AlNfy|MGoK{`2f1U`#m=NigUR;Z;-ANaS}1QHbQWS=qT6GE*WQ2 zX&Ejv!*p{*$?kMCKiQcuJqK#A#LUj+c)G&wI(yew+bk}%ao0+u^XeDXu7DjmICYz! zs9t>Ww+{vlm^uuSwpMu$)(KXme|a$`Ow%!2Ub_xS{n9c0*>qVHDLMXlhxi6%r>Q^) zO9&e{ajR)E(SK9#z0&8E>#R=w!t)fjS&Z9F1cZf!k0z4+A012O7G^qZpEo~2-yYvZ zg@eXSV=&G-$~IbD$(pL!M>l8bKNIZ?ys`~?GRkoEbY z!8g64=GWU7ZkZDXtzUVFYNi?q$4r1#B*xXMKeVmC#Wm$57;QfFOUl%~Y&`nn2(bh5 zl11eyedE{&T?@oris0jFF7!Xy{u9-|#m;zr~WF$P}-PKt6`yI}d|G8|sfTKQ`&< z1icKM)_#`il?7b1E})?8_x9C^C4by88wLT=PrL*pV`_^DmD*)qjl^2$rtRW@gwjc7+v7sIZf{0_0G(c$nj2kss|v? z$0`Sk-{9bX4ff}snCbcD*Ld_!GT*1GCctG1PX%!D;LFcEPN9u)CswR5At&@E!}+hx zX9btT)dGjxO2#LJA-IHk0^Z37hth7Nvc8bOZX*83ulb>Fj%28` zN;cf;NsW?^`9keutit z=SgzCF<2#69V!!d>q?~?r1`Zx4)&Mo$bW!u!FgRMB(LKg@vG0lVinDsL#Fn(M4k8K zT~_$2qYsYn2e-z&$H!s53VQGxKam@Kf2F$1qODnr_F#f*J(a>I7njogU-dC-jT5|S zI*vOu78%4ZTWniJiZ2VOUp5RotWa*=L{_5DWd$zk%A2KVRx-Mt0MV-Bmz{>sjqX;mes{P7iOuR%7!Jze6V|w*^58Bxm|_&zK9OCJG~JKA)zn!+6@Eh z_SDHq!yfOtt4>=t=BT}V*pr@g(-D7VDO>$E!y%MYG#|70A^r^sR;c_{2w#J}?MHE= z{($GLqGfI%a-4(Hc4;0x$Il3hHsQD2B5HMVlF)pf^0BTc+$@LaN|(I3a;Y9VRVGtk z`F`)BoBNq6Hh&Rk2s$-N91P(EVlJ>V!iTdxRVRLZNO&*dI^0&%kX8-;xrfWOiY0)W zKTjpFY7ki4@z$#fwB5(?cAvh@8&$mbw;IiUw6Ld9?{Lb)Vk6B0QA~C4O2?U;ne@}kJ*r;S zkQ%+bnZv@gw9Tloi3PJE=^Jq%ja43F>dpc zlXo5l1N~y+uVdj}rBc3;y9N>cc2Q~Aw=tm1YFKWx0n}$V{4S{0Hpc{1-Tc#Kg;qYR z%XT`jA>C#7`q2EC^Ge00Zk#5oaw@|jZ1p`}+Z}gqyO7FY@voM2HV*YCku&#%+E<37 zJ#l@f!rIm_CzbS?{NHc1Woso!bh7dMco5vG5F|~em9)o(+?QQXWc}yxTQv0D0IN(LS{%GjpD?U@;SHDr0Yvx3eGg@DI zJlovlR;;B~n#`4C9-6M&V0~g$G9v=}V#pudDps$9*Wl=diLrF)hmFlWGm&__Vmfs6 zGQ8@Q14$+41C{p6_T7_Ju@&n{;#n}~WLZgu*<;rj0?-K>)_5eyt&J@bFwu;TQ2%wE}h{`YXw0oBS@?Ez|E9MYK2lgvV~+ z8K$9uN*xJ}>?(tQXKy=7koJ&gSO0ZNdO_ukcLO*983(R%JL|ChpGo10own5iN5^x8 zJcjV%@U{cI8y!-M4%7e?EGQG8*OmXL;>a!hS*xj8KXLa0H(x%x37smBE0d$buA4-x z>@N6oOPHs+9XDr9^UoDX^1y+UMaHWVdn*LSF0-m>rQ-mox_FOHad+~|=Q%Gko{ibZ zh`k>){@s1cLi)%BKmym%&C-i-^PQDtxXk^S9xT^0+;{ACi2YoQgEBYNiHm{SFY8W3 zFr4&jpV=OMyw`IggA#*V4pKJvWcoU<-r6{MmHccjm10|lu>&BOWmNRPmbV47m1l+juD)07_rS znnD8z%O~vXb9FpDW3!(3q&v3u=ljkn zouc5)1KI8aFz$uPI$VY%YGl9La$SXlm7^sC+UAqdQP;gwjp$$LQgrzj(KGklt`$T( z%ami^6}~s|xyH}KL(54g2RYTG3X{n83=oI1y&?=^2673e`M+v;qs?-Lg74zo4EaV4 z4cOz|fDW})OoBS*;MvsI3`Me3i)(K>$W%4lpMJ_Hc6D&ZsK)R6_r zTm7m4sZ)YSMKt&Cy4UR7vOAlCi1T-sXNh;32$&onzM&TK|6tnfu22`Z5~X@c7u82c zYz}%zDHH|LgKqHQ_!h{#l{p0HNdU?9cQEA+D^bnQs+A^kQJ)3_p{;Pb4)vHvPtgJL zRSi!-ZGnNWzUqrmdh5I;B?QW)tr6+%fTbm0S0jv&?}T++2bZVBlAF8}opR6%om>5? zcwOlhI^^fz&@GFLV0V{Elt7EE#7JJ7QJYiLJ)P0(@2`RwS0SJ<9p#?PDZ8Bm3*?f_ zZ5&ihx9Qwm2CR2DI*rM2!<)-By?w-$v%A4pVgNdvVMPXaGiUB47W;8{xTkDU!x!b6 zyP-$99fGE^+U?~Dd5m*20g$J!M%CW%;Gl5cJjM<3V|(Nq0(cp6*+ zVYoBG%ilwD@a-lc9nCH?ns<6p{iE4l9wSyz@0E3~qNfoj$PB0`@X(6{0b8H$Fwn3N zi8(DuG;+dRYiRrI=p1vG<-Mn!@zit@4) zaZL@p=ZLs~nrARRm{w13c?HTiv$X?{WLzq+(Xi*2jZju4qoQyord>t7w|*m!aoQAC0CaKGmNYELujlMd zIfITkrD<9%t<`&E*DmJsXUJ+L+sCevV$$qgMxW$m_-lH_Vv*g%p4#czrKKW(1f5ufe5}q~ulX3=h=4#eF`-yUEF# zITIFm_l1!hYOaI8Y7IrK&=A#!+Q~Uu?LL+79%^z8MTv9i@0(byc7uKspji`!K$>7c_31q+56EWte)Nto046aLOY6X|mOdYiAg#3&eP36H0Hgir;A51*@s z!)ng2HEGcsB;Cd{nzNJ9bq!7fZ+7Olsvp&g2v;=gjPcvP?k0Xgw(YcTpu8(xQ)yUX zv;vgb`CvHtfJ-{VH&-+5R~e7}C&I|1*?Ia)WnG%^PQV`t1$a@`2kWnBId0Gj14hk? zM}McT&Nw6sUSMJzZ`&|CD+w?86fnCL_4Uo6R8)&UV3_TXN4vZ!E9bR%@?>R;HagbW z<71ukI+Y?07Fn+zAZE`#CUkrxxPE%X{di0Ay^Mc*vHD$FdQpD{(OkLhc=SPSN*`C} zW%8?pJJS}I^#$Z}(A`lL5=VV@ZTu1aeNTUhZp>gkwfmc;;gwUex+j?aDsBw_xp#Ta zKzpv5OAd`hyMO~Cdu--d)6DfGXnrbNbFDCZ&8YQqN7AEHF3#?5xOR+f>+H za&r6`XdbUKJ<1TCW_oA9VR7)pj}`}73j`Q}a;8 zWELy}NT4h{1CrVb8pOZR0linMo_Z`v5a34uHNmV1oWtO(r%8W+G%P@NN+F+?9I#)= zwf_KR_``s?bi1(<|3PQq12Q7UtVo0P&uI9-XyhC6S4nN0i9axuNG3qw@EI#T`!i(l zl{GZYp-u4nef+_|XtGV@e~#6kUzh_g1*zzblKmd?JtM%Q_#QWPg0BH7^PtG9gkGGZ z?Eg;T|Gr(wr4@0SXIr5vr>JH68wnPx4)DVf!TqkkzIY03ez?p}vfuCs88dN$L>`@| zlP5b>Sp~8JsH?mJCG1rO!ASXQ`-)40uO^dD3pBp5lD}C6;5SV+fZ6!P`2RZ0E`V8= z!^M2-ufY#ha^+5H_zz}vy@yjss7KYRa_ao@xJ_zB>83Rm{){1G02mGG5sshZ|3Eta z6SyLq{>?J0Y#>3BR<+l!&oikH;O0sEkWYL#t^>%H7(I{{Q|5u&5_$V9>J}z(`#QRa2vIjSig7H`HP$| z;7Mo|NrC8Za)6QmKumv=gcJJ@qD5w@6m8d^r!Y0}Hu;?h6AvzmIHRHO3I;XP#PhRa z`N5xcyoRN8m4u|BB=`%f<$bkIAPbAXfKuOC-#pzaby*~LFVL^!cOJ_}eE@BjTV))^pMpi`Zr`l?R=!6C4XzjE$6;P9SiM8Sh5$mbRje-GZG*0%dD{Dks!vTkDdjn(=j?9H z1EAy+YnAhge42pMC!qMbx(84Yp;$M;=W2Hq39$_8?c+WKVpzrsp~+FSB1$3W?iPEJ zutK?c!shshlnbr|qB2}UD&NIAr1hdfsUEDcs;vElk<13`42@zNjVf^Yvy(wY%&~mI z=*&jK)rwQ;lcu%YhglYTt+SLiBC0u}hV(w=5WVn(XmL#vv0T@bm-q1mDD4QbpKZ}M*jZ3{*t$QM z$mfSy;XT~iTgmqxlXscp3okGtp=OG`8I)Fw=x=85V-ip1WSue!Xfwsx!(+gWlORid zWb@Ha>dkxY3L~Y55__2V;YObm8t>(qsX@kdENSSl4wv#G4199>!Gin;bVpEWb|+Y_InGCe1iPIF(Z#CUlZY%J|T`TSp(I zxh&0Q>?XNyP5BNrBBJdIY?JyqL@F?4d;LIhy_O45mPZRvrfeYs#6RHX029ZSqN0Rv zPF3)ToU}cLOYufipS0$pD?dFAJv`J{q}A%y&_M5_)(`l7cl~DSo*2K&yzR^00DUjp zRY-_&USaPCD#@-0!P6A>kQv$!#W@ZNhSp!5>*yZrnUf(dao-VEbu`X@=0mdw!n2 zc}#7W3FW!KrBLri`PxRqiYA-=~^Lvqd8WLm`<_}bbSp7vG zuFN4|r}d1jR%NQb;2itG0iA~5FbN&9Rt2c7Y#3B)Sli7Z(vo}rvjnmD=p=)ACu%(@ zC9RS}W8?`lU zj+=+@a)@rz;jDWu4k^JuxO^Tl$HY^a`a;WI?{Phh?T(_kZR6g6pwrK%L@dWK$HK%P z{l#mV--`c6rFQEK4xc0Q9!9Jy^6%Xd)P?PyCcB-g5bZC?vx`$x2`Af?u?ROwW?uf zWbZ;<%1Q;9V z`J37vh^#WN`iu~@%JFunqWQ;HM}- z3sf?XW42#5CA!VAz(%H5Aw_+ofhiejvL^+)Lz^Z>u!`EoiE4*|JF3sX6q6*9!k6H_ z8rumPZ{KgA1;+67?=~YXA5#3lk_NOrWd*HX8t;wk{X(4&g;dvQi%Ny;bQA7a={h)a z;jayuJ^&iTA6Z40Na_knkACT^G&$?LbWW>xYHkMEUFK}mTFgey)V%7HFVW9Sce93# ziqmtu0=E^yPVVPy^y`#aUgRWLc5jQ0*6R@3jM<8$LCoSjd9_P4N2=`CC_niD7yN9_ z8*89!FYD8B(Q2*GzCWPOH{v2VPnr^xyjanLyKLA zkzRzo@M%H4(?W1)c0v=IRejn5saP#0WwG0*z|(q46Q~wW+miqCPDC=dQ0-p-U0+n4 zEa*96;=nPWPIWJdS^z=AfW>M7L()Lh; zTbZtOB29eYPYD-CP|x1w0gy6W;j`(Z>uiPDRz1gKx7^ z`jV9^M851!`E5^XMV}@^5%N@)b)LxFd*j9)Yx=~5 zkjF-M!Vhi~Al6$Ho^NQf8f|%;KIj*oLz`=_ElDt~w&z|fiM>O|NY8Ng9{sAEuJ(1@ z(0qaZEW6pO-A22--1Mw9%4_MZ@i8P0jHVFlOVm=e`)p2A$FL{z!Z9Flj<18@ET(ql zQ%7O;eoU7j1KX^8;b>ug$NeOq3Cmb(x>Q?fr2(7rL-fWZ)IkyrUBsleZB={dE&nVu zjVo75%#jXcAJc7e?%$O_ge5(vcAY;;$5DKH^%u_?yM+tXPWEU4LsUME;4VlJQ2 z*Prra%ySex&!+Fiv30W=%;LQ&gm$`6hhscAANkM@LgGsFSV8*2OBUL=)eT;x!&qU7>$Is%s55C@@gZa2S;ZwRa zc{oS?V#)M~%MM>RQj+#RS{#;Mu53EyS$B_1|sS8Jf)yi8%I zZr?XPu~i^mKqHSAEN7d%vD1!@nOT-*K7n_5?+Oax0Zo?oXehhQsthp53}(ZUS9ndY z>=xhD{Sxo+5&;Uq9!}1lAPtEarX_9nuZcfSJdK*zoAzXhq{D9&lxXohVQS_^Bd(h< zTkQ9KI9!R5?o8`3<1bL#q0xPS@P6eO%Nrh(z5Rj!SDeg6*vT*am?2$Xpjd2`L(@GNU1<5MuVDQj(ZqezZlTABlWA31Mj*Xe!EjSm6FPnE`@id(57C+^dkovkg6pX}L3~=0I6Da(EbK513 zTjYdIcRnWcZt=62AEhu9jv=vNUVm*iNkbA@G&%OLIyrq8mKMvmz1Y+nqOC@lY`}d;19O z+FO@*S;)HH%837{*ezku58d&Qy};(epJfQJ@cGVLE-XGL<)%2_ z*{}U53{eHrgJ*bMnBBOWla@qo`(~*!u&cVwHE<-T^P?gBt^Cv2!cpS_W+Uu4BaW+CEYc|4DdU?&-32(+;y+_ z_Yb^lu~=u#oCW9X@9zECdrukGU3M0&B{e9{It0`%f$I$tu&+@`LK>^;>}l#gZ>k%v z2XP#*i`bX;f$4PR;ZiFPe*P@e>yncG0se(@N#|Rl2KLo2C0OOmqhGDuH7r-65IhL?N={A~lZoWoM)dXM7m?10mfM`dqN#kko|Z$MJ^qfp*=DU`^j+U86S ztRL$k-aty0k$db$UE7|+#}W1Du(u@qoFe7NCMUI$bhHtHl4Nt4s3vFK+3yna*IA-A zy=JcdulcArFCnBf6v>ZdlZ88WbuSLH)LEWDnJF-P<@9{=47ulhWQ8ww9{YyxH-^iv zyt_yc%_|I2NTm@ zdD^g&w@m{~CJb*^Kye-~+BD(KD{?2P$8?_+?P)EZox11E=&~9y+<^_Wvi*A&K)Cz1 z)&RWQ`Qe9jYduiF;Yi~1CNQa`I$PNz+FPE`)lJgEmUEG@-TQ9HN1KxwC3;y6@exJ! z9d-9L%rZL{V`Tk88UjyY*FseXH{TmmU*E%R#yacLsIkn8NvR=sByC0|tT}(Bj}zTh zqX-S6$K~zlFU{fPhL4$YeuVlmsGB>BKMmkZwi#DHry_hb(S$TL_u=gUuY&aqb^vy6 zJP)z3M|q zL&bXJ*SCFe+Z$S}5 zJ>VrLQoJT$im+Ny%_Zpy)Ep}HjZq!@3Ej`c7t|r5H2+pIUw$hY+4s?E7}``n1X|^j zus@o9+A#H+CZT(m+*YMs^|3YhYp|d~_XiwC4jX8%(Lmx*b#%UL3Irr0q-xbeZZ3$jnq6|(GnANCCX{>cEA<((h9oBi+w3|Y)da(`fGj4QVdo-DVO9s3iJMbXVAphh&;$BF%{=3la##89UPhG z^CM^vlwpa)EEd63wJl?HTZTi@rHs_lGw;i_p5Ws3(}MD8U8p>k`NC39`aV}Ls;vf( z=aTuzGKCB>hUVPoZ>vr9ZEzS};pQZ(;qko1-x>DUm1ri24rUAFwKy3LEtZBr;yva~ z_up+01bogh+Z1|p${JLECp$-WM}c9Sv9O48q}{XQTqg^6ti_~DFp4GQc|(BD4dL;M za^HBNqInFIjE(5$cz3a(ZnS=*aKDPCIR+Mn72YAa!N|9sA6s&yP2;itCM=h9N7vWq zl95ty9&T~WeeKb^h4E2eM%T*~1LfgI>gq+v54a#SrSMmxsgy6Io`-I&Th%bWuSC7)+wgpdo9uzr-9TLHGGp^9rDV}-1 zug6=&kV(ev|Dfr365QJQY--PIF|eCewT5JXg<{GpJQd%$DYZ)Z&F2w6zu|qTF~TXe zjz8O!cJ<1^Q00uM2bF4j`zq;$v$?8^Qea2EaHJmFZWd6f3 z>$)h@LekVUD3xiI-~*X;%DSigjK6Qp0;b|@Jtpj`9{h&ksC6w>#rS14B~0VAGrxJ=<>>|owYKPY=)_0Z6eNzm?&8Pe?9c8cUgeLRG)KYQ=bsKFByh(YPU=-6 z=6pnoqg1L?l@gUW&I(oKA|;QurMU7AnUnoL)t`KEHVIrwFYXF1MnXtytnlo`4|riU ztI4k~FHb!A9M{tN-3k)Ry&5jk{*ETdAH)`6BT9Y3ajbKC!qx_>>^d{ZWLWRJ^BL2x zcvU;X?(iMxQmjyUEs5*0(%V#<*ZWNC=wRtqOFiG9!Hch^roTwy*J#O|z2kzb>%_ha z@L!gDd{+F})=iKH(Qx!N zG?D)N_+b4f(DQNJIc^Bp>NQLZ>#Yc{X23O^Tg!b6_k53ht&=hXHaD;4KMYdT|4I@N zj!4Gl=_OP)tF(~jB5C?aV`8$Z4x>%uM7>NbeLJd?xl$-T%zOAz2|artDn&G~p)vZ- zFEdm+li56i`c&h!RT8ZA<|)e$Lo4ke^Kt4i$;)X=u;F40se!X`^tSV`Gu!ApzV|4i z5G5uRoB|i@^&}OIah-zP$Gb2GuNyNEqp9Ecn(O?y4zn)r15dcYHPLD*Q&`~J-XC=c z;W3DLPO$^D2rY!AIQAX4OFmz)OB(@_q*wf9P^0KYpp@yEQV|oQw~QVI$=)Ov^BdZ; zLrdL&Qqem>LiQIpAZs_8O;~& zm&Kel-hxtHw{o8rrv=B7iPS%MqLB&fY?*%;l!+Hkx5rqu+-?N`Fv zSJsJtZ>8!E!;mki{GzR}n&JlE?5s2OQ7{2se(-yn*aZP=TzcJyvd?#DHVHb_sFKti zQ{>nbP5u(U5{StyYLa{B_3UF}LVprI(QtP@v$nS<4t)P5fF7Rr?P!J*zpIA12(L=~ z7Cc_eGd$rqVFY?6^=2_BO(CV-E9$$wE&%__DX=SH$$tOn&WNVJC4RjcEAk z>X_P;b8*G`ddchA5Pb}%c6o!)wG%lkL~?(nh3~0%@u`#}%UD;2S;)cmq#kLe-xnmV zfkpPLQ;YMinjCEez9D?1hi_Nmjq{AleBd2))fT*t3Y<9ShnCI%mNM;tct@>IR-axpZmVbAN|*vB_wN3uE%pM@ zfJ>*5raXFQoHd?Zq1zK+dgx*}N&@tk2jf)K8D9Zs`*TIRog zTheh$1<-Y2%|aE%b5DVKozjAR~oc^(SCKvn7%QdN8mj>8+wtIr}sl# zL@$S*9V~*;MJ?zJ_0Tr<>)+~4N(D$_`PYrkyc$%uK_XAfz#KYks8lGvu(#Jy1^{E zgld|o7TOUY_W?O8D|JPD5g2#bDvRfj%(!}ft%r`Kn;_dr6`8Uz?;|(Aq*uqz0mYpa zR5&9Jz2`(dGEb9)YL}v3tIQmk{HUW&Mqaahk#Sw(Cwumu1{>rHQqR-u;$XS`^(B{5 zRC0eO0qido>+e^!aT_Io=Fzt$+vbB^jc%(roYss*9DBW-qs2Xc5jw7Qb9l-SFCoNF zLcw`qD#TyAPy(8nbdm_3;T~J_A05gMZkGO0Dq2NR7Nr4^hL>N!F5Blbf1N9~k$w$4 zpN#^?^qdJO$j|oI5f)d$4)_aG`!AVzxq%>g!gq_xU0)GBz<8pkT8l<^xD^cx*nGR} zs`g_j-pTI+{>_cTeClGYs5efskD8uDn`v>w$~k)+WDKlN3~%0Dk%AL;5^H(0)9Rgi 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