From a5be7aa04e76980e646e7a624e9872e397bdbc7d Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 9 Jun 2026 16:02:32 +0530 Subject: [PATCH 001/136] version update --- src/configs/doc-configs.js | 43 -------------------------------------- 1 file changed, 43 deletions(-) diff --git a/src/configs/doc-configs.js b/src/configs/doc-configs.js index a7ae95c95..71946726d 100644 --- a/src/configs/doc-configs.js +++ b/src/configs/doc-configs.js @@ -53,49 +53,6 @@ module.exports = { subLabel: 'Cloud (Latest)', iframeUrl: 'https://developer-docs-26-6-0-cl.vercel.app/docs/', }, - { - label: '26.5.0.cl', - link: '26.5.0.cl', - subLabel: 'Cloud', - iframeUrl: 'https://developer-docs-26-5-0-cl.vercel.app/docs/', - }, - { - label: '26.4.0.cl', - link: '26.4.0.cl', - subLabel: 'Cloud', - iframeUrl: 'https://developer-docs-26-4-0-cl.vercel.app/docs/', - }, - { - label: '26.3.0.cl', - link: '26.3.0.cl', - subLabel: 'Cloud', - iframeUrl: 'https://developer-docs-26-3-0-cl.vercel.app/docs/', - }, - { - label: '26.2.0.cl', - link: '26.2.0.cl', - subLabel: 'Cloud', - iframeUrl: 'https://developer-docs-26-2-0-cl.vercel.app/docs/', - }, - { - label: '26.3.0.sw', - link: '26.3.0.sw', - subLabel: 'Software (Latest)', - iframeUrl: 'https://visual-embed-sdk-26-3.vercel.app/docs/', - }, - - { - label: '10.10.0.sw', - link: '10.10.0.sw', - subLabel: 'Software', - iframeUrl: 'https://visual-embed-sdk-10-10.vercel.app/docs/', - }, - { - label: '10.1.0.sw', - link: '10.1.0.sw', - subLabel: 'Software', - iframeUrl: 'https://visual-embed-sdk-10-1.vercel.app/docs/', - }, ], CUSTOM_PAGE_ID: { API_PLAYGROUND: 'restV2-playground', From a0b4eac65e1ea21ce0e2bf50c5d3597b45d8ea3a Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 9 Jun 2026 16:12:16 +0530 Subject: [PATCH 002/136] example fix --- modules/ROOT/pages/viz-overrides.adoc | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/modules/ROOT/pages/viz-overrides.adoc b/modules/ROOT/pages/viz-overrides.adoc index 373e4ac73..1edf94fd3 100644 --- a/modules/ROOT/pages/viz-overrides.adoc +++ b/modules/ROOT/pages/viz-overrides.adoc @@ -25,24 +25,6 @@ The `visualOverrides` object in the `VisualizationOverrides` interface lets you Within `visualOverrides`, the chart and table settings can be applied in the `chart` and `table` objects. -Make sure to import the required components and enumeration objects: - -[source,JavaScript] ----- -import { - init, // Core SDK initialization function. - AuthType, // for authentication type selection. - SearchEmbed, // Embeds the ThoughtSpot Search page into a host application. - ConditionalFormattingOperator, // Enum for conditional formatting comparison operators. - DataLabelFilterOperator, // Enum for data label filter operators. - ConditionalFormattingComparisonType, // Enum for conditional formatting comparison. - BackgroundFormatType, // Enum for the background fill type in conditional formatting rules. - TableTheme, // Enum for the visual theme of embedded tables. - TableContentDensity, // Enum for the row height and padding density of embedded tables. - LegendPosition, // Enum for the position of the chart legend. -} from "@thoughtspot/visual-embed-sdk"; ----- - === Chart override settings For chart overrides, use the top-level `chart` object and configure the following properties as needed: From 6f5cacc3bb6035160a5e9fcdbca08f097903589e Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 9 Jun 2026 16:26:20 +0530 Subject: [PATCH 003/136] edits --- modules/ROOT/pages/embed-pinboard.adoc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/ROOT/pages/embed-pinboard.adoc b/modules/ROOT/pages/embed-pinboard.adoc index f45f8d48f..79715ec88 100644 --- a/modules/ROOT/pages/embed-pinboard.adoc +++ b/modules/ROOT/pages/embed-pinboard.adoc @@ -265,6 +265,16 @@ Embedding application users can download Liveboards in the PDF, XLSX, and CSV fo Starting with the 26.5.0.cl and Visual Embed SDK version 1.48.x, the new multi-format download experience is available on embedded Liveboards and can be enabled using the `isContinuousLiveboardPDFEnabled` and `isLiveboardXLSXCSVDownloadEnabled` parameters. The `Download` action in the Liveboard's more options menu is controlled by `Action.DownloadLiveboard` instead of `Action.Download` and `Action.DownloadAsPdf`. `Action.DownloadAsPdf` remains valid for controlling PDF download on individual visualizations (chart and table tiles) within a Liveboard. ==== +=== XLSX and CSV in Liveboard scheduled exports +To enable Liveboard scheduled exports in XLSX and CSV format from the embed view, ensure that `isGranularXLSXCSVSchedulesEnabled` to `true`. + +[source,javascript] +---- +const embed = new LiveboardEmbed('#tsEmbed', { + //... + isGranularXLSXCSVSchedulesEnabled: true, // enable scope selection for XLSX and CSV Liveboard scheduled jobs. +}); +---- === Download actions and behavior From 83397fbf7b6853ff8640131221b05feb4aaca359 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Wed, 10 Jun 2026 10:43:58 +0530 Subject: [PATCH 004/136] saml cert renewal SCAL-317595 --- modules/ROOT/pages/configure-saml.adoc | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/configure-saml.adoc b/modules/ROOT/pages/configure-saml.adoc index 7fdd77b4a..bbcf91e79 100644 --- a/modules/ROOT/pages/configure-saml.adoc +++ b/modules/ROOT/pages/configure-saml.adoc @@ -119,7 +119,7 @@ Make a note of all of the redirects within the SAML workflow. Each server must b To configure SAML SSO authentication on the ThoughtSpot embedded instance, complete the following steps: * xref:configure-saml.adoc#admin-portal[Enable SAML authentication on ThoughtSpot with IAMv1] -* xref:configure-saml.adoc#IAMv2[Enable SAML authentication on ThoughtSpot with IAMv2] (Requires assistance from ThoughtSpot Support) +* xref:configure-saml.adoc#IAMv2[Enable SAML authentication on ThoughtSpot with IAMv2] * xref:configure-saml.adoc#idp-config[Configure the IdP server for SAML authentication] * xref:configure-saml.adoc#auth-config-sdk[Enable SSO authentication in Visual Embed SDK] * xref:configure-saml.adoc#saml-redirect[Add SAML redirect domain to the allowed list in ThoughtSpot] @@ -261,6 +261,27 @@ link:https://docs.thoughtspot.com/cloud/latest/saml-okta#_enable_saml_authentica You can map your SAML groups,or groups and Orgs from your IdP to your ThoughtSpot. This means that you do not have to manually recreate your groups and Orgs in ThoughtSpot if they are already present in your IdP. Refer to link:https://docs.thoughtspot.com/cloud/latest/saml-group-mapping[Configure SAML group mapping, window=_blank]. +[#update-idp-cert-iamv2] +=== #Update your IdP certificate# +If your IdP certificate expires or is rotated, you can update it in the ThoughtSpot UI. +ThoughtSpot IAMv2 supports self-serve certificate management — changes take effect immediately after you save. + +To update your IdP certificate: + +* Go to *Admin* > *Authentication* +* Navigate to your SAML connection and click the the *More* menu image:icon-more-10px.png[more options menu icon] > *Edit* +* In the *IDP provider certificate* field, replace the existing certificate with the new certificate file from your IdP. ++ +[NOTE] +==== +Download the raw certificate file from your IdP settings page. +The accepted format is `[PEM / .cer / .crt]`. +==== +* Click *Save*. + +Your users can sign in using the updated certificate immediately. +If users experience sign-in failures after a certificate rotation, verify that the certificate in ThoughtSpot matches the certificate currently active on your IdP. + [#idp-config] === Configure the IdP server for SAML authentication From 155e71936350c1584f1fba8ba1421ed2a5d14f2f Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Wed, 10 Jun 2026 15:03:02 +0530 Subject: [PATCH 005/136] saml cert renewal SCAL-317595 --- modules/ROOT/pages/configure-saml.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/configure-saml.adoc b/modules/ROOT/pages/configure-saml.adoc index bbcf91e79..22a012749 100644 --- a/modules/ROOT/pages/configure-saml.adoc +++ b/modules/ROOT/pages/configure-saml.adoc @@ -268,14 +268,14 @@ ThoughtSpot IAMv2 supports self-serve certificate management — changes take ef To update your IdP certificate: -* Go to *Admin* > *Authentication* +* Go to *Admin* > *User management* > *Authentication* * Navigate to your SAML connection and click the the *More* menu image:icon-more-10px.png[more options menu icon] > *Edit* * In the *IDP provider certificate* field, replace the existing certificate with the new certificate file from your IdP. + [NOTE] ==== Download the raw certificate file from your IdP settings page. -The accepted format is `[PEM / .cer / .crt]`. +The accepted format is `PEM / .cer / .crt`. ==== * Click *Save*. From b8795046babc01904af18fbd82f622c705dc0a31 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Wed, 10 Jun 2026 15:12:24 +0530 Subject: [PATCH 006/136] saml cert renewal SCAL-317595 edits --- modules/ROOT/pages/configure-saml.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/configure-saml.adoc b/modules/ROOT/pages/configure-saml.adoc index 22a012749..9467a65d4 100644 --- a/modules/ROOT/pages/configure-saml.adoc +++ b/modules/ROOT/pages/configure-saml.adoc @@ -269,7 +269,7 @@ ThoughtSpot IAMv2 supports self-serve certificate management — changes take ef To update your IdP certificate: * Go to *Admin* > *User management* > *Authentication* -* Navigate to your SAML connection and click the the *More* menu image:icon-more-10px.png[more options menu icon] > *Edit* +* Navigate to your SAML connection and click the **More** menu image:./images/icon-more-10px.png[the more options menu] > *Edit* * In the *IDP provider certificate* field, replace the existing certificate with the new certificate file from your IdP. + [NOTE] From df4d3c7bfe7a751521369d6c10e1eac8bbe14f1d Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 10 Jun 2026 15:26:55 +0530 Subject: [PATCH 007/136] publishing updates --- .../pages/development-and-deployment.adoc | 2 +- modules/ROOT/pages/publish-api.adoc | 2 +- modules/ROOT/pages/publishing-overview.adoc | 11 +--- modules/ROOT/pages/set-default-page.adoc | 53 ++++++++++++++++--- modules/ROOT/pages/variables.adoc | 6 --- 5 files changed, 50 insertions(+), 24 deletions(-) diff --git a/modules/ROOT/pages/development-and-deployment.adoc b/modules/ROOT/pages/development-and-deployment.adoc index 3f02b9674..60ee8af69 100644 --- a/modules/ROOT/pages/development-and-deployment.adoc +++ b/modules/ROOT/pages/development-and-deployment.adoc @@ -58,7 +58,7 @@ In a scenario where xref:single-tenant-data-models.adoc[end customer databases a There are two techniques for managing Orgs for single-tenanted databases: - * Publishing [beta betaBackground]^Beta^ + * Publishing * Deploy to each Org using TML Import == Publishing diff --git a/modules/ROOT/pages/publish-api.adoc b/modules/ROOT/pages/publish-api.adoc index ccfc3510f..eb53db085 100644 --- a/modules/ROOT/pages/publish-api.adoc +++ b/modules/ROOT/pages/publish-api.adoc @@ -118,7 +118,7 @@ Exercise caution when using this option, because it may break the association wi [source,cURL] ---- curl -X POST \ - --url 'https://{ThoughtSpot-Host}//api/rest/2.0/security/metadata/unpublish' \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/security/metadata/unpublish' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer {AUTH_TOKEN}' \ --data-raw '{ diff --git a/modules/ROOT/pages/publishing-overview.adoc b/modules/ROOT/pages/publishing-overview.adoc index 2c749075e..b26087d25 100644 --- a/modules/ROOT/pages/publishing-overview.adoc +++ b/modules/ROOT/pages/publishing-overview.adoc @@ -6,21 +6,12 @@ :page-pageid: publish-data-overview :page-description: Use the publishing feature to distribute and propagate objects to Orgs within a ThoughtSpot instance. -[earlyAccess eaBackground]#Early Access# - The publishing feature enables administrators to efficiently manage and distribute ThoughtSpot metadata objects across multiple Orgs within a multi-tenant instance. Unlike the deployment method that relies on TML import and Git integration, publishing allows administrators to create an object in the Primary Org and publish it directly to target Orgs without generating duplicate copies. It also allows dynamic customization of the underlying Table or Connection properties using variables. ThoughtSpot provides a set of REST APIs for administrators to create and assign variables, parameterize object properties, and publish objects from the Primary Org to other Orgs on their instances. -//// -[IMPORTANT] -==== -Publishing to Orgs is an Early Access feature and is disabled by default on ThoughtSpot instances. To enable this feature on your instance, contact ThoughtSpot Support. -==== -//// - == When to use publishing feature ThoughtSpot recommends using the publishing feature if you have a multi-tenant ThoughtSpot instance with Orgs and your deployment requires the same metadata objects across different tenant Orgs. @@ -76,7 +67,7 @@ The visibility of a published object in an Org depends on its sharing settings. == Limitations -Note the following feature limitations in the beta version: +Note the following limitations: * Only ThoughtSpot administrators with access to all Orgs can publish objects. * Objects can be published only from the Primary Org to other Orgs. diff --git a/modules/ROOT/pages/set-default-page.adoc b/modules/ROOT/pages/set-default-page.adoc index e6f30bb98..abb62ade6 100644 --- a/modules/ROOT/pages/set-default-page.adoc +++ b/modules/ROOT/pages/set-default-page.adoc @@ -80,22 +80,63 @@ const embed = new AppEmbed("#embed", { ---- == Customize navigation between pages within the app -To programmatically control navigation between the pages within the embedded app, you can use the `navigateToPage()` method and custom actions. +To programmatically control navigation between the pages within the embedded app, you can use the `navigateToPage()` method and custom actions. === Using navigateToPage() +The `AppEmbed` object includes a `navigateToPage()` method that switches the currently loaded page in the embedded view. -The `AppEmbed` object includes a `navigateToPage()` method that can switch the currently loaded page in the embedded view. +[source] +---- +navigateToPage(path: string | number, noReload?: boolean): void +---- + +[cols="1,1,3"] +|==== +| Parameter | Description + +| `path` +|__String__. The page to navigate to. Accepts the same string values as the `pageId` or `path` attributes (for example, `'answers'`, `'pinboard/'`, or a `Page` enum value). + +When `noReload` is set to `true`, this parameter also accepts a number: use `1` to go forward or `-1` to go back in history. -The `navigateToPage()` method accepts the same string values that work for `pageId` or `path` attributes. If you are customizing the menu, the new navigation menu should call `navigateToPage` for the various pages you want to provide access to: +| `noReload` +|__Boolean__. If `true`, navigation is triggered through the `HostEvent.Navigate` event without reloading the iframe. + +*Default:* `false` +|==== + +[NOTE] +==== +`navigateToPage()` requires that `render()` has been called on the `AppEmbed` instance before it is invoked. If `render()` has not been called, the method exits silently with a warning in the console. +==== [source,JavaScript] ---- -// Navigate to the Answers page +// Navigate to the Answers page (reloads the iframe) embed.navigateToPage(Page.Answers); -// Navigate to the Answers page without reloading the iframe (noReload = true) +// Navigate to the Answers page without reloading the iframe embed.navigateToPage(Page.Answers, true); + +// Navigate back one page in history (noReload must be true) +embed.navigateToPage(-1, true); +---- + +=== Relationship between navigateToPage() and HostEvent.Navigate + +When `noReload` is set to `true`, `navigateToPage()` internally triggers xref:HostEvent.adoc#_navigate[HostEvent.Navigate] with the specified `path` as the event payload. You can also trigger this host event directly to achieve the same no-reload navigation behavior: + +[source,JavaScript] ---- +// Equivalent to embed.navigateToPage('pinboards', true) +embed.trigger(HostEvent.Navigate, 'pinboards'); + +// Navigate back one page in history +embed.trigger(HostEvent.Navigate, -1); +---- + +[NOTE] +==== +`HostEvent.Navigate` is applicable only to `AppEmbed`. It is not supported for `LiveboardEmbed`, `SearchEmbed`, or `SpotterEmbed`. +==== === Using navigateToPage() with a custom action To add a custom action for in-app navigation, create a xref:custom-actions-callback.adoc[callback custom action] and define the navigation path. @@ -116,7 +157,7 @@ appEmbed.on(EmbedEvent.CustomAction, async (payload: any) => { }); ---- -To navigate to a specific application page without initiating a reload, you can set the `noReload` attribute to `true` as shown in this example: +To navigate to a specific application page without reloading the iframe, set the `noReload` parameter to `true`. When `noReload` is `true`, the navigation is handled via `HostEvent.Navigate` and the browser history is updated without a full iframe reload: [source,javascript] ---- diff --git a/modules/ROOT/pages/variables.adoc b/modules/ROOT/pages/variables.adoc index f58cb6dd6..25b388865 100644 --- a/modules/ROOT/pages/variables.adoc +++ b/modules/ROOT/pages/variables.adoc @@ -56,12 +56,6 @@ xref:variables.adoc#_delete_a_variable[Deletes the variables] specified in the A * Variable APIs for creating, deleting, searching, and assigning values can only be used by the ThoughtSpot instance administrator. * These APIs can only be used from the primary Org. ==== -//// -[NOTE] -==== -Variable operations through the REST API are in beta. To enable this feature on your instance, contact ThoughtSpot Support. -==== -//// == Before you begin From 545e028a9b9b3b2a17b853b34724a7ef596d93f0 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 10 Jun 2026 15:26:55 +0530 Subject: [PATCH 008/136] publishing updates --- .../pages/development-and-deployment.adoc | 2 +- modules/ROOT/pages/publish-api.adoc | 2 +- modules/ROOT/pages/publishing-overview.adoc | 11 +--- modules/ROOT/pages/set-default-page.adoc | 53 ++++++++++++++++--- modules/ROOT/pages/variables.adoc | 6 --- 5 files changed, 50 insertions(+), 24 deletions(-) diff --git a/modules/ROOT/pages/development-and-deployment.adoc b/modules/ROOT/pages/development-and-deployment.adoc index 3f02b9674..60ee8af69 100644 --- a/modules/ROOT/pages/development-and-deployment.adoc +++ b/modules/ROOT/pages/development-and-deployment.adoc @@ -58,7 +58,7 @@ In a scenario where xref:single-tenant-data-models.adoc[end customer databases a There are two techniques for managing Orgs for single-tenanted databases: - * Publishing [beta betaBackground]^Beta^ + * Publishing * Deploy to each Org using TML Import == Publishing diff --git a/modules/ROOT/pages/publish-api.adoc b/modules/ROOT/pages/publish-api.adoc index ccfc3510f..eb53db085 100644 --- a/modules/ROOT/pages/publish-api.adoc +++ b/modules/ROOT/pages/publish-api.adoc @@ -118,7 +118,7 @@ Exercise caution when using this option, because it may break the association wi [source,cURL] ---- curl -X POST \ - --url 'https://{ThoughtSpot-Host}//api/rest/2.0/security/metadata/unpublish' \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/security/metadata/unpublish' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer {AUTH_TOKEN}' \ --data-raw '{ diff --git a/modules/ROOT/pages/publishing-overview.adoc b/modules/ROOT/pages/publishing-overview.adoc index 2c749075e..b26087d25 100644 --- a/modules/ROOT/pages/publishing-overview.adoc +++ b/modules/ROOT/pages/publishing-overview.adoc @@ -6,21 +6,12 @@ :page-pageid: publish-data-overview :page-description: Use the publishing feature to distribute and propagate objects to Orgs within a ThoughtSpot instance. -[earlyAccess eaBackground]#Early Access# - The publishing feature enables administrators to efficiently manage and distribute ThoughtSpot metadata objects across multiple Orgs within a multi-tenant instance. Unlike the deployment method that relies on TML import and Git integration, publishing allows administrators to create an object in the Primary Org and publish it directly to target Orgs without generating duplicate copies. It also allows dynamic customization of the underlying Table or Connection properties using variables. ThoughtSpot provides a set of REST APIs for administrators to create and assign variables, parameterize object properties, and publish objects from the Primary Org to other Orgs on their instances. -//// -[IMPORTANT] -==== -Publishing to Orgs is an Early Access feature and is disabled by default on ThoughtSpot instances. To enable this feature on your instance, contact ThoughtSpot Support. -==== -//// - == When to use publishing feature ThoughtSpot recommends using the publishing feature if you have a multi-tenant ThoughtSpot instance with Orgs and your deployment requires the same metadata objects across different tenant Orgs. @@ -76,7 +67,7 @@ The visibility of a published object in an Org depends on its sharing settings. == Limitations -Note the following feature limitations in the beta version: +Note the following limitations: * Only ThoughtSpot administrators with access to all Orgs can publish objects. * Objects can be published only from the Primary Org to other Orgs. diff --git a/modules/ROOT/pages/set-default-page.adoc b/modules/ROOT/pages/set-default-page.adoc index e6f30bb98..abb62ade6 100644 --- a/modules/ROOT/pages/set-default-page.adoc +++ b/modules/ROOT/pages/set-default-page.adoc @@ -80,22 +80,63 @@ const embed = new AppEmbed("#embed", { ---- == Customize navigation between pages within the app -To programmatically control navigation between the pages within the embedded app, you can use the `navigateToPage()` method and custom actions. +To programmatically control navigation between the pages within the embedded app, you can use the `navigateToPage()` method and custom actions. === Using navigateToPage() +The `AppEmbed` object includes a `navigateToPage()` method that switches the currently loaded page in the embedded view. -The `AppEmbed` object includes a `navigateToPage()` method that can switch the currently loaded page in the embedded view. +[source] +---- +navigateToPage(path: string | number, noReload?: boolean): void +---- + +[cols="1,1,3"] +|==== +| Parameter | Description + +| `path` +|__String__. The page to navigate to. Accepts the same string values as the `pageId` or `path` attributes (for example, `'answers'`, `'pinboard/'`, or a `Page` enum value). + +When `noReload` is set to `true`, this parameter also accepts a number: use `1` to go forward or `-1` to go back in history. -The `navigateToPage()` method accepts the same string values that work for `pageId` or `path` attributes. If you are customizing the menu, the new navigation menu should call `navigateToPage` for the various pages you want to provide access to: +| `noReload` +|__Boolean__. If `true`, navigation is triggered through the `HostEvent.Navigate` event without reloading the iframe. + +*Default:* `false` +|==== + +[NOTE] +==== +`navigateToPage()` requires that `render()` has been called on the `AppEmbed` instance before it is invoked. If `render()` has not been called, the method exits silently with a warning in the console. +==== [source,JavaScript] ---- -// Navigate to the Answers page +// Navigate to the Answers page (reloads the iframe) embed.navigateToPage(Page.Answers); -// Navigate to the Answers page without reloading the iframe (noReload = true) +// Navigate to the Answers page without reloading the iframe embed.navigateToPage(Page.Answers, true); + +// Navigate back one page in history (noReload must be true) +embed.navigateToPage(-1, true); +---- + +=== Relationship between navigateToPage() and HostEvent.Navigate + +When `noReload` is set to `true`, `navigateToPage()` internally triggers xref:HostEvent.adoc#_navigate[HostEvent.Navigate] with the specified `path` as the event payload. You can also trigger this host event directly to achieve the same no-reload navigation behavior: + +[source,JavaScript] ---- +// Equivalent to embed.navigateToPage('pinboards', true) +embed.trigger(HostEvent.Navigate, 'pinboards'); + +// Navigate back one page in history +embed.trigger(HostEvent.Navigate, -1); +---- + +[NOTE] +==== +`HostEvent.Navigate` is applicable only to `AppEmbed`. It is not supported for `LiveboardEmbed`, `SearchEmbed`, or `SpotterEmbed`. +==== === Using navigateToPage() with a custom action To add a custom action for in-app navigation, create a xref:custom-actions-callback.adoc[callback custom action] and define the navigation path. @@ -116,7 +157,7 @@ appEmbed.on(EmbedEvent.CustomAction, async (payload: any) => { }); ---- -To navigate to a specific application page without initiating a reload, you can set the `noReload` attribute to `true` as shown in this example: +To navigate to a specific application page without reloading the iframe, set the `noReload` parameter to `true`. When `noReload` is `true`, the navigation is handled via `HostEvent.Navigate` and the browser history is updated without a full iframe reload: [source,javascript] ---- diff --git a/modules/ROOT/pages/variables.adoc b/modules/ROOT/pages/variables.adoc index f58cb6dd6..25b388865 100644 --- a/modules/ROOT/pages/variables.adoc +++ b/modules/ROOT/pages/variables.adoc @@ -56,12 +56,6 @@ xref:variables.adoc#_delete_a_variable[Deletes the variables] specified in the A * Variable APIs for creating, deleting, searching, and assigning values can only be used by the ThoughtSpot instance administrator. * These APIs can only be used from the primary Org. ==== -//// -[NOTE] -==== -Variable operations through the REST API are in beta. To enable this feature on your instance, contact ThoughtSpot Support. -==== -//// == Before you begin From 4ba00ab5e96902d7aea82e8f704bd4b00bd9d970 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 10 Jun 2026 23:00:11 +0530 Subject: [PATCH 009/136] nav edit for AutoMCPFrameRendererViewConfig --- modules/ROOT/pages/common/nav-mcp-server.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/common/nav-mcp-server.adoc b/modules/ROOT/pages/common/nav-mcp-server.adoc index f1e6d4822..7f98f2117 100644 --- a/modules/ROOT/pages/common/nav-mcp-server.adoc +++ b/modules/ROOT/pages/common/nav-mcp-server.adoc @@ -24,7 +24,8 @@ MCP tools reference Related SDK components * [.typedoc-Function]#link:{{navprefix}}/Function_startAutoMCPFrameRenderer[startAutoMCPFrameRenderer]# -* [.typedoc-Interface]#link:{{navprefix}}/Interface_AutoMCPFrameRendererViewConfig[AutoMCPFrameRendererViewConfig]# +* [.typedoc-Type_alias]#link:{{navprefix}}/Type%20alias_AutoMCPFrameRendererViewConfig[AutoMCPFrameRendererViewConfig]# + [.sidebar-title] Spotter MCP Server release notes From 7b7d3274d35ce8748a04adea0c0dd9eb4fc0d386 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 10 Jun 2026 23:00:11 +0530 Subject: [PATCH 010/136] nav edit for AutoMCPFrameRendererViewConfig --- modules/ROOT/pages/common/nav-mcp-server.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/common/nav-mcp-server.adoc b/modules/ROOT/pages/common/nav-mcp-server.adoc index f1e6d4822..7f98f2117 100644 --- a/modules/ROOT/pages/common/nav-mcp-server.adoc +++ b/modules/ROOT/pages/common/nav-mcp-server.adoc @@ -24,7 +24,8 @@ MCP tools reference Related SDK components * [.typedoc-Function]#link:{{navprefix}}/Function_startAutoMCPFrameRenderer[startAutoMCPFrameRenderer]# -* [.typedoc-Interface]#link:{{navprefix}}/Interface_AutoMCPFrameRendererViewConfig[AutoMCPFrameRendererViewConfig]# +* [.typedoc-Type_alias]#link:{{navprefix}}/Type%20alias_AutoMCPFrameRendererViewConfig[AutoMCPFrameRendererViewConfig]# + [.sidebar-title] Spotter MCP Server release notes From bbd051e22fa4094d948b6e525609210b8ccb6a64 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Thu, 11 Jun 2026 14:57:06 +0530 Subject: [PATCH 011/136] style apis --- modules/ROOT/pages/customize-style-api.adoc | 157 ++++++++++++++++++++ modules/ROOT/pages/style-customization.adoc | 6 +- 2 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 modules/ROOT/pages/customize-style-api.adoc diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc new file mode 100644 index 000000000..27080a603 --- /dev/null +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -0,0 +1,157 @@ += Customize UI layout and styles through REST APIs +:toc: true +:toclevels: 1 + +:page-title: Customize styles and layout through REST APIs +:page-pageid: style-customization-apis +:page-description: Customize styles, design, and layout of embedded ThoughtSpot app using REST APIs + +ThoughtSpot introduces a new set of REST API v2.0 endpoints to manage style customization settings programmatically. +These endpoints expose all branding and theming controls available in the *Develop* > *Customizations* > *Styles* page in the ThoughtSpot UI, enabling developers and administrators to automate branding and white-labeling — including across multiple Orgs on a multi-tenant cluster — without logging in to the ThoughtSpot UI. + +== Style customization REST APIs + +// SOURCE: SCAL-293070, SCAL-293071 + +//[earlyAccess eaBackground]#Early Access# + +ThoughtSpot provides REST API v2.0 endpoints to manage style customization settings programmatically. These APIs expose the same branding and theming controls available in the *Develop* > *Customizations* > *Styles* page, enabling you to automate branding and white-labeling — including across multiple Orgs — without logging in to the ThoughtSpot UI. + +[NOTE] +==== +All style customization API endpoints require administrator privileges. API calls from non-administrator users return `403 Forbidden`. +==== + +=== Style configuration + +Use the following endpoints to search and update style settings at the cluster or Org scope. + +Search style configuration:: +`POST /api/rest/2.0/customization/styles/search` + +Returns the current style configuration for the cluster and the active Org. + +When called from the Primary Org (Org 0), the response returns one record with `"scope": "CLUSTER"` and one with `"scope": "ORG"`. + +Update style configuration:: +`POST /api/rest/2.0/customization/styles/update` + +Updates one or more style settings. Supports the following parameters: + +[cols="2,1,4"] +|===== +|Parameter|Required|Description +|`scope`|Yes|`CLUSTER` or `ORG`. +|`org_identifier`|Conditional|Required when `scope` is `ORG`. +|`operation`|Yes|`REPLACE` overwrites existing settings. `MERGE` applies only the specified fields. +|`navigation_panel`|No|Top navigation panel color. Use `"theme": "CUSTOM"` with a valid hex value in `"base_color"`. +|`chart_color_palette`|No|Array of hex color values for charts. +|`embedded_footer_text`|No|Footer text for embedded content. +|`visualization_fonts`|No|Font assignments for visualization elements. +|`default_logo`|No|Binary image file for the square application logo. +|`wide_logo`|No|Binary image file for the wide logo (email and PDF exports). +|`reset_options`|No|Resets specified settings to ThoughtSpot defaults. +|===== + +=== Custom fonts + +Upload a custom font:: +`POST /api/rest/2.0/customization/styles/fonts/upload` + +Uploads a font file (multipart/form-data). + +Required: `name`, `file_content`. + +Optional: `weight`, `style`, `color`. + +Search custom fonts:: +`POST /api/rest/2.0/customization/styles/fonts/search` + +Returns custom fonts uploaded to the instance. + +Optional filters: `font_identifier`, `name_pattern`, `include_font_assignments`. + +Update a custom font:: +`PUT /api/rest/2.0/customization/styles/fonts/{font_identifier}` + +Updates an existing font's display name, weight, style, or color. + +Delete custom fonts:: +`POST /api/rest/2.0/customization/styles/fonts/delete` + +Deletes one or more custom fonts from the font library. Supply one or more font GUIDs or display names in `font_identifiers`. + ++ +[IMPORTANT] +==== +`dry_run` defaults to `true`. In dry-run mode, the API computes and returns all affected visualization assignments but does *not* delete the fonts. Set `dry_run: false` to commit the deletion. +==== ++ +When a font is deleted, all visualization areas that used it are automatically reset to the system default font. The response body lists these affected assignments grouped by Org. + +=== Logo export + +Export logos:: +`POST /api/rest/2.0/customization/styles/logos/export` + +Exports the configured logo files as a ZIP archive containing the default and wide logo images. + +=== Example: Update navigation panel color + +The following example updates the top navigation panel to a custom color at the cluster scope: + +[source,JSON] +---- +POST /api/rest/2.0/customization/styles/update + +{ + "scope": "CLUSTER", + "operation": "REPLACE", + "navigation_panel": { + "theme": "CUSTOM", + "base_color": "#1A2B3C" + } +} +---- + +=== Example: Update chart color palette for an Org + +[source,JSON] +---- +POST /api/rest/2.0/customization/styles/update + +{ + "scope": "ORG", + "org_identifier": "", + "operation": "MERGE", + "chart_color_palette": { + "colors": ["#FF6B35", "#004E89", "#1A936F", "#C6D8D3", "#F18F01"] + } +} +---- + +=== Example: Dry-run delete to preview affected assignments + +Use `dry_run: true` (the default) to preview which visualization areas will be affected before committing a font deletion: + +// SOURCE: entity/FontDeleteRequest.java (dev/scaligent, master) +[source,JSON] +---- +POST /api/rest/2.0/customization/styles/fonts/delete + +{ + "scope": "CLUSTER", + "font_identifiers": ["", ""], + "dry_run": true +} +---- + +Example response: + +[source,JSON] +---- +{ + "affected_assignments": [ + { + "visualization_areas": ["CHART_LABEL", "CHART_AXIS"] + }, + { + "org": { "id": 3, "name": "Sales Org" }, + "visualization_areas": ["TABLE_HEADER"] + } + ] +} +---- + +To commit the deletion, repeat the request with `"dry_run": false`. + + +For a full list of REST API v2.0 style customization endpoints and their parameters, see xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. \ No newline at end of file diff --git a/modules/ROOT/pages/style-customization.adoc b/modules/ROOT/pages/style-customization.adoc index 0816f9ac1..2f59afd9b 100644 --- a/modules/ROOT/pages/style-customization.adoc +++ b/modules/ROOT/pages/style-customization.adoc @@ -25,9 +25,13 @@ Custom CSS allows developers to override the default styles and UI element speci + To customize themes and variables in the CSS file, developers must know the basics of HTML and CSS framework and how to build custom themes. For more information, see xref:css-customization.adoc[Advanced customization with custom CSS]. - A xref:style-customization_tutorial.adoc[hands-on tutorial] is also available to learn how to test style customization capabilities using Visual Embed Playground. +Style customization through the REST APIs:: +You can manage style customization settings programmatically by using the ThoughtSpot REST APIs. +These endpoints expose all branding and theming controls available in the ThoughtSpot UI. For more information, see xref:xref:customize-style-api.adoc[Customize UI layout and styles through REST APIs] + + == Scope of customization The following table lists the customizable elements: From 067b98d81a683ea3be4313223232694b1f412aa9 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Thu, 11 Jun 2026 21:06:53 +0530 Subject: [PATCH 012/136] update SSO user note --- modules/ROOT/pages/api-user-management.adoc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/ROOT/pages/api-user-management.adoc b/modules/ROOT/pages/api-user-management.adoc index 02884da29..9046b7992 100644 --- a/modules/ROOT/pages/api-user-management.adoc +++ b/modules/ROOT/pages/api-user-management.adoc @@ -127,7 +127,20 @@ To update user details: * +++POST /api/rest/2.0/users/{user_identifier}/update+++ (Rest API v2) * xref:user-api.adoc#update-user[PUT /tspublic/v1/user/{userid}] (Rest API v1) +// SOURCE: SCAL-313918, SCAL-316352 +// SOURCE: https://thoughtspot.slack.com/archives/C029SNQ27UN/p1776926046104759 +#For review# +[NOTE] +==== +When updating IAMv2 users with `account_type` set to `SAML_USER` or `OIDC_USER`, do not use these APIs to change identity attributes such as username, email address, or display name. + +If you rename an SSO user through the REST API and that user then logs in through the IdP: +* If Just-in-Time (JIT) provisioning is enabled, ThoughtSpot creates a new duplicate account. The duplicate account does not inherit the original user's content, groups, or permissions. +* If JIT provisioning is disabled, the user cannot log in. + +To update the username or email of an SSO user, make the change in the IdP. ThoughtSpot reflects the updated attributes upon the user's next SSO login. +==== //// From 82da5c9c221a7eb1bb075e70cc7dd0f8d4a3b402 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Sat, 13 Jun 2026 08:30:41 +0530 Subject: [PATCH 013/136] stale page ref removal --- modules/ROOT/pages/embed-methods.adoc | 67 ++++++++++++--------------- modules/ROOT/pages/faqs.adoc | 3 ++ 2 files changed, 33 insertions(+), 37 deletions(-) diff --git a/modules/ROOT/pages/embed-methods.adoc b/modules/ROOT/pages/embed-methods.adoc index e2fbaf7ef..26650b808 100644 --- a/modules/ROOT/pages/embed-methods.adoc +++ b/modules/ROOT/pages/embed-methods.adoc @@ -14,31 +14,30 @@ Based on your embedding requirements and integration setup, you can use one of t * xref:getting-started.adoc[Embed using Visual Embed SDK] (Recommended) * xref:embed-without-sdk.adoc[iFrame embedding without SDK] -* link:https://docs.thoughtspot.com/software/7.2/embedding[Legacy embedding method with app.min.js, window=_blank] (ThoughtSpot Software only) +//* link:https://docs.thoughtspot.com/software/7.2/embedding[Legacy embedding method with app.min.js, window=_blank] (ThoughtSpot Software only) To determine the method that best fits your embedding requirement, refer to the information in the following tables. [div boxAuto] -- -[width="100%" cols="4,7,7,7"] +[width="100%" cols="4,7,7"] [options='header'] |===== -||Visual Embed SDK|Embed without SDK|Legacy embedding method -s|When to use|The SDK Supports all embed and customization use cases. Use the SDK for embedding ThoughtSpot if your host platform allows custom Javascript. -|Use this method only if your host platform doesn't allow custom Javascript. This method involves embedding a ThoughtSpot component in an iFrame.| The legacy embedding method is available for only ThoughtSpot Software deployments. With this method, you can embed a ThoughtSpot page, object, or the full application using `api.min.js` script. +||Visual Embed SDK|Embed without SDK +s|When to use|The SDK supports all embed and customization use cases. Use the SDK for embedding ThoughtSpot if your host platform allows custom Javascript. +|Use this method only if your host platform doesn't allow custom Javascript. This method involves embedding a ThoughtSpot component in an iFrame. + s|Feature availability a| ThoughtSpot Cloud ts7.may.cl or later + ThoughtSpot Software version 8.4.1-sw or later a| ThoughtSpot Cloud ts7.may.cl or later + -ThoughtSpot Software version 6.0 or later a| ThoughtSpot Software version 6.0 or later - -ThoughtSpot recommends using Visual Embed SDK and ThoughtSpot Embedded features from 8.4.1-sw onwards. +ThoughtSpot Software version 6.0 or later s|Required user privilege|`DEVELOPER` + `ADMINISTRATOR` -|`ADMINISTRATOR`|`ADMINISTRATOR` +|`ADMINISTRATOR` -s|Maintenance and support| Available | Available | Limited support +s|Maintenance and support|Available|Available |===== -- == Feature comparison @@ -47,50 +46,44 @@ The following table lists the features available with each embed flavor: [div tableContainer tableStyle1] -- -[width="100%" cols="4,5,5,6,6"] +[width="100%" cols="4,5,5,6"] [options='header'] |===== -|Feature category|Features| Visual Embed SDK|Embedding without SDK |Legacy embedding method +|Feature category|Features|Visual Embed SDK|Embedding without SDK -.5+|**Embed options**|Search|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–#| [tag greyBackground tick]#–# -|Visualization|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#| -Liveboard - Classic experience|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#| -Liveboard - New experience|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–#| -Full ThoughtSpot experience|[tag greenBackground tick]#✓# a|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +.4+|**Embed options**|Search|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# +|Visualization|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +|Liveboard|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +|Full ThoughtSpot experience|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# .5+|**Authentication**|SAML|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# + __Inline authentication__. __For more information, see xref:embed-without-sdk.adoc#iframe-auth[Embed without SDK]__. -|[tag greenBackground tick]#✓# -|OIDC| [tag greenBackground tick]#✓#|[tag greyBackground tick]#–#| [tag greyBackground tick]#–# -|Trusted authentication|[tag greenBackground tick]#✓#| [tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# -|Basic authentication| [tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# -|Auto-login on authentication expiry|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–#|[tag greyBackground tick]#–# - -.2+|**Custom Actions**|URL actions|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# + - -__Available in only ThoughtSpot Software 7.0 or earlier versions__ | - -Callback actions|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–#|[tag greyBackground tick]#–# +|OIDC|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# +|Trusted authentication|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +|Basic authentication|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +|Auto-login on authentication expiry|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# -.4+|**Granular control of embedded UI**|Customization flags such as hiding data sources, search options configuration, setting a Liveboard to full height, and so on| [tag greenBackground tick]#✓#|[tag greyBackground tick]#–#|[tag greyBackground tick]#–#| -Show or hide UI menu actions| [tag greenBackground tick]#✓#| [tag greyBackground tick]#–#|[tag greyBackground tick]#–#| -Style customization and rebranding of UI elements|[tag greenBackground tick]#✓# |[tag greenBackground tick]#✓# |[tag greenBackground tick]#✓# | -Link customization|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#| +.2+|**Custom Actions**|URL actions|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +|Callback actions|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# -**Events** a|Ability to trigger and handle embed lifecycle and host app events + +.4+|**Granular control of embedded UI**|Customization flags such as hiding data sources, search options configuration, setting a Liveboard to full height, and more|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# +|Show or hide UI menu actions|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# +|Style customization and rebranding of UI elements|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +|Link customization|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# -Interaction between host and embedded ThoughtSpot app| [tag greenBackground tick]#✓# |[tag greyBackground tick]#–#|[tag greyBackground tick]#–# + +|**Events** a|Ability to trigger and handle embed lifecycle and host app events + -__Legacy events only__| +Interaction between host and embedded ThoughtSpot app|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# -**Runtime filters**|Ability to pass filters as URL query parameters |[tag greenBackground tick]#✓# |[tag greenBackground tick]#✓# |[tag greenBackground tick]#✓# | +|**Runtime filters**|Ability to pass filters as URL query parameters|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# -**React components**| Ability to embed ThoughtSpot components in a React app|[tag greenBackground tick]#✓# |[tag greyBackground tick]#–#|[tag greyBackground tick]#–#| +|**React components**|Ability to embed ThoughtSpot components in a React app|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–#| |===== -- +//// == Embed using REST APIs ThoughtSpot REST API framework supports data APIs, using which you can embed an answer, Liveboard, or a specific visualization from a Liveboard. You can use these APIs with or without the SDK to embed ThoughtSpot content in your app. diff --git a/modules/ROOT/pages/faqs.adoc b/modules/ROOT/pages/faqs.adoc index 5ef9465e7..cc93a5b21 100644 --- a/modules/ROOT/pages/faqs.adoc +++ b/modules/ROOT/pages/faqs.adoc @@ -353,6 +353,7 @@ The REST API v2.0 framework is built upon the existing core API functionality an For more information, see xref:rest-api-v2.adoc[REST API v2.0] and xref:rest-api-v1v2-comparison.adoc[REST API v1 and v2.0 comparison]. ==== +//// .Can I embed ThoughtSpot components using the REST API? [%collapsible] @@ -364,6 +365,8 @@ For more information, see the following pages: * xref:embed-rest-api.adoc[Embed using REST APIs] * xref:custom-viz-rest-api.adoc[Create a custom visualization using REST APIs] ==== +//// + .Are there any Certificate requirements for REST API calls From 2e57ba0536d560459278f736d80466ddc5a65dca Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Sat, 13 Jun 2026 07:31:18 +0530 Subject: [PATCH 014/136] rest api v1 ref removal --- modules/ROOT/pages/page-navigation.adoc | 461 ++++++++++++++---------- 1 file changed, 263 insertions(+), 198 deletions(-) diff --git a/modules/ROOT/pages/page-navigation.adoc b/modules/ROOT/pages/page-navigation.adoc index 5110a2aa4..48f8077d9 100644 --- a/modules/ROOT/pages/page-navigation.adoc +++ b/modules/ROOT/pages/page-navigation.adoc @@ -5,7 +5,7 @@ :page-pageid: in-app-navigation :page-description: Build dynamic menus and links to ThoughtSpot content from the embedding application -If you want to embed specific pages of ThoughtSpot application, you can individual embed components such as `LiveboardEmbed`, `SpotterEmbed`, or `SearchEmved` rather than full application embedding. The full application embed is a relatively fixed and unified application shell, while individual component embeds offer more granular and isolated control. +If you want to embed specific pages of the ThoughtSpot application, you can embed individual components such as `LiveboardEmbed`, `SpotterEmbed`, or `SearchEmbed` rather than full application embedding. The full application embed is a relatively fixed and unified application shell, while individual component embeds offer more granular and isolated control. If you choose to embed individual components with specific pages, your embedding app may require custom menus, navigation elements with xref:customize-links.adoc[routes for pages] and ThoughtSpot REST API integration to programmatically manage interaction and navigation between these pages. @@ -14,12 +14,12 @@ If you choose to embed individual components with specific pages, your embedding Mixing full application embedding with other embed components, such as `SearchEmbed`, `SpotterEmbed`, and `LiveboardEmbed`, is not recommended, because each embed method is designed to manage its own navigation, layout, and application state. Combining them can create complicated workflows and make it harder to maintain and customize your embedded application. ==== -See the link:https://github.com/thoughtspot/ts_everywhere_resources/blob/master/examples/menus_and_other_navigation_components/rest_api_ui_navigation_v2.html[code example on GitHub repository, window=_blank] for a complete flow of REST API requests powering various navigation components rendered within an embedding application’s page. +See the link:https://github.com/thoughtspot/ts_everywhere_resources/blob/master/examples/menus_and_other_navigation_components/rest_api_ui_navigation_v2.html[code example on GitHub, window=_blank] for a complete implementation using the V2.0 REST API to power navigation components in an embedded application. == Create menus to embedded ThoughtSpot pages Once you have the URL routes defined within the embedding application to load ThoughtSpot content, you can write code that generates links to these ThoughtSpot routes. -Navigation elements often take the form of a sidebar menu, a dropdown selector, a set of tiles, or individual buttons. +Navigation elements often take the form of a sidebar menu, a drop-down selector, a set of tiles, or individual buttons. The examples in the following sections use plain JavaScript to generate unstyled HTML elements. @@ -28,18 +28,16 @@ The real code for generating the proper links and the navigation elements will b == Hardcoded links within a menu system If your web application only embeds a limited set of ThoughtSpot objects, without granting users the ability to save their objects, you can __hardcode__ the object IDs and names of the ThoughtSpot content. -Object IDs in ThoughtSpot are GUIDs and thus are unique on every Org or instance, except separate instances that are intentionally replicated with the same GUIDs via TML import and export. +Object IDs in ThoughtSpot are GUIDs and are unique on every Org or instance, except for separate instances that are intentionally replicated with the same GUIDs via TML import and export. -You may still use the `xref:rest-api-v2-metadata-search.adoc[/metadata/search]` V2.0 REST API endpoint to retrieve the equivalent object IDs for content on various Orgs and environments in the process of "hardcoding" the menu system. Alternatively, you may keep a *mapping file* of equivalent objects during your CICD deployment process, that you use to generate the __hardcoded URLs__ in the menu system. +You can use the xref:rest-api-v2-metadata-search.adoc[`/api/rest/2.0/metadata/search`] V2.0 REST API endpoint to retrieve the equivalent object IDs for content on various Orgs and environments when building your hardcoded menu system. Alternatively, you can maintain a *mapping file* of equivalent objects during your CI/CD deployment process to generate the hardcoded URLs in the menu system. == Dynamic requests for content listings via REST API -Both the V1 and V2.0 REST APIs have endpoints for retrieving filtered lists of the content a user has access to. +The xref:rest-api-v2-metadata-search.adoc[`/api/rest/2.0/metadata/search`] V2.0 REST API endpoint retrieves filtered lists of the content a user has access to. -The xref:rest-api-v2-metadata-search.adoc[/metadata/search V2.0 REST API endpoint] can be used by the administrators to retrieve content for any given user or can be called as the user by the web browser once they have signed in via SSO. +The endpoint can be used by administrators to retrieve content for any given user, or called as the signed-in user directly from the web browser after signing in via SSO. -The response to `/metadata/search` can be parsed and split on *tags*, *author*, or other properties, or you can make multiple calls to the endpoint with the various filtering arguments in each request. For example, xref:rest-api-v2-metadata-search.adoc#_favorite_object_options[favorite options] can be specified to only retrieve objects that are marked as favorites by users. - -The xref:metadata-api.adoc#metadata-list[`/metadata/list` V1 REST API endpoint] is identical to the endpoint used within ThoughtSpot to render Answers, Liveboards, and Data pages, making it a simple path to replicate and customize the existing content listing pages within ThoughtSpot. +The response to `/api/rest/2.0/metadata/search` can be parsed and filtered on *tags*, *author*, or other properties. You can also make multiple calls to the endpoint with different filtering arguments in each request. For example, xref:rest-api-v2-metadata-search.adoc#_favorite_object_options[favorite options] can be specified to retrieve only objects marked as favorites by a user. The process for generating a dynamic menu includes the following steps: @@ -54,247 +52,315 @@ An administrator account can use the xref:rest-api-v2-metadata-search.adoc#permi By default, the endpoint returns for Liveboards, but the `metadata` section of the request can be set to specify `LIVEBOARD`, `ANSWER`, and `LOGICAL_TABLE` in any desired combination. -[code,json] +[source,javascript] ---- const answerRequestObject = { - "metadata": [{"type": "ANSWER"}], - "permissions" : [ - { - "principal": { - "type": "USER", - "identifier": "{username}" - }, - "share_mode": "READ_ONLY" - } - ] - 'record_offset': 0, // Adjust to do pagination - 'record_size': 100000 // Adjust to do pagination (or handle in browser with table component) -} + "metadata": [{ "type": "ANSWER" }], + "permissions": [ + { + "principal": { + "type": "USER", + "identifier": "{username}" + }, + "share_mode": "READ_ONLY" + } + ], + "record_offset": 0, + "record_size": 10000 +}; + +const response = await fetch('/api/rest/2.0/metadata/search', { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(answerRequestObject), + credentials: 'include' +}); + +// V2.0 returns a top-level array directly +const contentList = await response.json(); ---- -If the web application has implemented other processes on the back-end using a ThoughtSpot service account with administrator privileges, this may be the simplest implementation of retrieving the content listings rather than dealing with individual user access tokens for the requests. +If the web application uses a ThoughtSpot service account with administrator privileges on the backend, this approach may be simpler than managing individual user access tokens for each REST API request. === Requesting content as a user Rather than using an administrator account to request content listings, you can instead have the REST API request scoped to the user themselves, and the REST API will always only return the content they have access to. All REST API requests from the browser are scoped as the signed-in user, as long as the `credentials` option of the REST API request has been set properly to `include`. -[code,json] +[source,javascript] ---- const lbRequestObject = { - "metadata": [{"type": "LIVEBOARD"}], - 'record_offset': 0, // Adjust to do pagination - 'record_size': 100000 // Adjust to do pagination (or handle in browser with table component) -} + "metadata": [{ "type": "LIVEBOARD" }], + "record_offset": 0, + "record_size": 10000 +}; + +const response = await fetch('/api/rest/2.0/metadata/search', { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(lbRequestObject), + credentials: 'include' +}); + +// V2.0 returns a top-level array directly +const contentList = await response.json(); ---- -With xref:trusted-authentication.adoc[cookieless trusted authentication], there is no *browser session*. Instead, an *access token* is retrieved for the user and used by the SDK. +With xref:trusted-authentication.adoc[cookieless trusted authentication], there is no *browser session*. Instead, an *access token* is retrieved for the user and used by the SDK. The trusted authentication pattern requires implementing a backend service to generate access tokens for any user. The token request service can instead be used by the backend of the embedding web application to get an access token to make REST API requests for a user, rather than having it happen at the front-end within the web browser. === Build menu items and web app links -The response from the search REST API is an array of header objects, which includes the details needed to build out the menu items and the links within the web application to the pages that display ThoughtSpot content. - -The `/metadata/search` endpoint returns `metadata_name`, `metadata_id`, and `metadata_type` in each response item, which is enough information to build a simple menu and a link to the appropriate URL to display the content. - -The V2.0 `/metadata/search` endpoint has an additional `metadata_header` key within the response, with the object containing the following properties along with many others, while the `metadata/list` V1 endpoint contains them in a slightly different structure. - -Within the `metadata_header` section, `name` and `id` properties are identical to the `metadata_name` and `metadata_id` from the outer portion of the response. Additional properties the web application might use for display include: - -* `description` -+ -Text description added to content by creator -* `authorDisplayName` -+ -Display name of the object creator or current owner -* `authorName` -+ -Username of the object creator or current owner -* `created` -+ -Object creation timestamp (to milliseconds) -* `modified` -+ -Last edit timestamp (to milliseconds) -* `tags` -+ -Array of tag objects, each with a `name` property among other details +The response from `/api/rest/2.0/metadata/search` is a top-level array. Each item in the array exposes `metadata_name`, `metadata_id`, and `metadata_type` at the top level — enough to build a simple navigation list or sidebar menu. For richer rendering (descriptions, tags, modified date, author), use the nested `metadata_header` sub-object within each item. + +The following properties within `metadata_header` are useful for building navigation UI: + +* `id` — Object GUID (matches `metadata_id` at the top level) +* `name` — Object display name (matches `metadata_name` at the top level) +* `description` — Text description added by the creator +* `tags` — Array of tag objects; each has a `name` property +* `modified` — Last edit timestamp (milliseconds since epoch) +* `authorDisplayName` — Display name of the object owner Individual visualizations on a Liveboard can be loaded using the `LiveboardEmbed` component by supplying both `liveboardId` and `vizId`. -The display of a visualization from a Liveboard differs from a saved Answer object, which is loaded via the `SearchEmbed` component. The saved answer object always displays the ThoughtSpot search bar and UI actions for editing an Answer, whereas the visualizations display fewer UI elements and show the menu items in the **More** menu image:./images/icon-more-10px.png[the more options menu]. +The display of a visualization from a Liveboard differs from a saved Answer, which is loaded via the `SearchEmbed` component. The saved Answer always displays the ThoughtSpot search bar and UI actions for editing, whereas a visualization displays fewer UI elements and shows the *More* menu for chart-level actions. + +// FIX MINOR-8: Clarified that include_visualization_headers is a V2.0 parameter; no separate +// call is required. Previous wording incorrectly implied a separate V1 API call was needed. +To retrieve the visualization details for a Liveboard in the same API call, set the `include_visualization_headers` parameter to `true` in your request (see <>). -Setting the `include_visualization_headers` request parameter to `true` will bring back the list of all visualization details with any Liveboard response. This request requires a separate API call for each Liveboard in the V1 REST API. +== Replicating the ThoughtSpot Liveboards or Answers page -== Replicating the ThoughtSpot UI Liveboards or Answers page -As mentioned in the preceding sections, the `/metadata/list` V1 REST API provides the same details as the internal REST API used to display the pages within the ThoughtSpot UI, making it easy to "replicate" those pages exactly within the embedding web app's own UI. The V2.0 REST API includes these details within the `metadata_headers` section of its response so it can be used for a similar purpose as well (see the link:https://github.com/thoughtspot/ts_everywhere_resources/blob/master/examples/menus_and_other_navigation_components/rest_api_ui_navigation_v2.html[example on GitHub for V2.0 equivalents, window=_blank]. +The `/api/rest/2.0/metadata/search` endpoint provides the metadata required to replicate the Liveboards or Answers pages from the ThoughtSpot UI within your embedding application. -The endpoint can only request one object type at a time: + +The following `metadata.type` values are supported: -* `PINBOARD_ANSWER_BOOK` for Liveboards -* `QUESTION_ANSWER_BOOK` for answers -* `LOGICAL_TABLE` for data objects +* `LIVEBOARD` — Liveboards +* `ANSWER` — Saved Answers +* `LOGICAL_TABLE` — Data objects (Tables, Models, and Views) -Data objects can be filtered using an additional `subtype` parameter to limit the query specifically to ThoughtSpot tables, worksheets, or views. +For `LOGICAL_TABLE` objects, you can add a `subtype` filter to narrow results: -There are additional parameters for sorting and a `category` parameter that can filter the response to show only the objects created or marked as favorites by the logged-in user. +* `ONE_TO_ONE_LOGICAL` — Tables +* `WORKSHEET` — Models +* `AGGR_WORKSHEET` — Views -REST API calls are asynchronous. The following is an example function returning the response as a JSON object using *fetch()*: +The following example fetches all three content types, caches the responses, and allows switching between them with a content-type selector — matching the pattern used in the link:https://github.com/thoughtspot/ts_everywhere_resources/blob/master/examples/menus_and_other_navigation_components/rest_api_ui_navigation_v2.html[reference implementation, window=_blank]: [source,javascript] ---- - async function metadataListRestApiCall(args){ - // args = { 'type', 'category', 'sortOn', 'sortAsc', 'tagnames' } - let type = args['type'].toLowerCase(); - const publicApiUrl = 'callosum/v1/tspublic/v1/'; - let endpoint = 'metadata/list'; - - // Easy type names match ThoughtSpot UI names for objects - const typesToApiType = { - 'liveboard': 'PINBOARD_ANSWER_BOOK', - 'answer': 'QUESTION_ANSWER_BOOK', - 'datasource' : 'LOGICAL_TABLE', // datasource doesn't distinguish subtypes - 'table' : 'ONE_TO_ONE_LOGICAL', - 'view' : 'AGGR_WORKSHEET', - 'worksheet' : 'WORKSHEET' - } - - // batchsize = -1 gives all results - let apiParams = { 'batchsize' : '-1'}; - console.log(type); - // The three datasource types can be specified using 'subtype' - if (type == 'table' || type == 'view' || type == 'worksheet'){ - let subtype = [typesToApiType[type]]; - apiParams['type'] = 'LOGICAL_TABLE'; - apiParams['subtypes'] = `["${subtype}"]`; - } - else { - apiParams['type'] = typesToApiType[type]; - } +// Generic V2.0 REST API wrapper — equivalent to restApiCallV2() in the reference example +async function restApiCallV2(endpoint, httpVerb, apiRequestObj) { + const baseUrl = `${tsHost}/api/rest/2.0/`; + const apiFullEndpoint = baseUrl + endpoint; - // Category arguments - let category = 'ALL'; - if ('category' in args){ - if ( args['category'] == 'MY' || args['category'] == 'ALL' || args['category'] == 'FAVORITE'){ - category = args['category']; - apiParams['category'] = category; - } - } + const fetchArgs = { + method: httpVerb.toUpperCase(), + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + credentials: 'include' + }; - // Sort arguments - if ('sortOn' in args){ - if (args['sortOn'] !== null){ - apiParams['sort'] = args['sortOn']; - } - } + if (apiRequestObj !== null) { + fetchArgs['body'] = JSON.stringify(apiRequestObj); + } +---- - if ('sortAsc' in args){ - if (args['sortAsc'] === true){ - apiParams['sortascending'] = 'true'; - } - if (args['sortAsc'] === false){ - apiParams['sortascending'] = 'false'; - } - } + const response = await fetch(apiFullEndpoint, fetchArgs); - console.log(apiParams); - const searchParams = new URLSearchParams(apiParams); - const apiFullEndpoint = tsURL + publicApiUrl + endpoint + "?" + searchParams.toString(); - console.log(apiFullEndpoint); - return await fetch( - apiFullEndpoint, { - method: 'GET', - headers: { - "Accept": "application/json", - "X-Requested-By": "ThoughtSpot" - }, - credentials: "include" - }) - .then(response => response.json()) - .then(data => data['headers']) // metadata/list info is really in the 'headers' property returned - .catch(error => { - console.error("Unable to get the metadata/list response: " + error) - }); + if (!response.ok) { + throw new Error(`API error: ${response.status} ${response.statusText}`); } + + return response.status === 204 ? true : response.json(); +} + +// Wrapper for /metadata/search — equivalent to callMetadataSearchApi() in the reference example +async function callMetadataSearchApi(searchRequestObject) { + return await restApiCallV2('metadata/search', 'POST', searchRequestObject); +} + +// Request objects for each content type +const lbRequestObject = { + "metadata": [{ "type": "LIVEBOARD" }], + "record_offset": 0, + "record_size": 10000 +}; + +const answerRequestObject = { + "metadata": [{ "type": "ANSWER" }], + "record_offset": 0, + "record_size": 10000 +}; + +const tableRequestObject = { + "metadata": [{ "type": "LOGICAL_TABLE" }], + "record_offset": 0, + "record_size": 10000 +}; + +// Fetch all content types in parallel and cache the results +const [lbResponse, answerResponse, tableResponse] = await Promise.all([ + callMetadataSearchApi(lbRequestObject), + callMetadataSearchApi(answerRequestObject), + callMetadataSearchApi(tableRequestObject) +]); + +const metadataResponses = { + 'lb': lbResponse, + 'answer': answerResponse, + 'table': tableResponse +}; ---- -The results of this REST API request can be directed into a rendering function using `.then()`: +=== Rendering Liveboards or Answers pages similar to the ThoughtSpot UI + +To render a table similar to the Answers or Liveboards page in the ThoughtSpot UI, use the `tableFromMetadataSearch()` function pattern from the reference implementation. This function reads `metadata_header` sub-object fields (`id`, `name`, `description`, `tags`, `modified`, `authorDisplayName`) from each item in the V2.0 response array to populate the table columns: [source,javascript] ---- -metadataListRestApiCall( - { - 'type': 'liveboard', - 'sortOn': 'NAME', - 'sortAsc' : true, - 'category': 'ALL' - }) -.then( - (listResponse) => renderNavigationFromResponse(listResponse) // Use your own rendering function here -); +// Equivalent to tableFromMetadataSearch() in the reference example +// SOURCE: rest_api_ui_navigation_v2.html +function tableFromMetadataSearch(searchResponse) { + const table = document.createElement('table'); + + // Table headers + const thead = table.createTHead(); + const headerRow = thead.insertRow(); + ['Name', 'Description', 'Tags', 'Modified', 'Author'].forEach(label => { + const th = document.createElement('th'); + th.innerText = label; + headerRow.appendChild(th); + }); + + // Table rows — V2.0 response is a top-level array + searchResponse.forEach(item => { + // Rich detail fields are inside metadata_header + const headers = item['metadata_header']; + + const id = headers['id']; + const name = headers['name']; + const desc = headers['description']; + const tags = headers['tags']; // Array of { name: string } objects + const modified = headers['modified']; // Milliseconds since epoch + const authorDisplayName = headers['authorDisplayName']; + + const row = table.insertRow(); + + // Name column — link triggers loadContent() with the object GUID + const nameCell = row.insertCell(); + nameCell.innerHTML = + `${name}`; + + // Description column + const descCell = row.insertCell(); + if (desc !== null) { descCell.innerText = desc; } + + // Tags column — tags is an array of tag objects + const tagsCell = row.insertCell(); + if (tags.length > 0) { + tagsCell.innerText = tags.map(t => t['name']).join(', '); + } + + // Modified date column + const modifiedCell = row.insertCell(); + modifiedCell.innerText = new Date(modified).toUTCString(); + + // Author column + const authorCell = row.insertCell(); + authorCell.innerText = authorDisplayName; + }); + + return table; +} + +// Usage +const table = tableFromMetadataSearch(metadataResponses['lb']); +document.getElementById('main-content-div').appendChild(table); ---- -=== Rendering Liveboards or Answers pages similar to ThoughtSpot UI -If you want to render something very close to the 'Answers' or 'Liveboards' pages within the ThoughtSpot UI, your rendering function will grab the `name`, `id`, `tags`, `modified`, and `authorDisplayName` properties and make a table in that order (feel free to leave out any undesired elements): +To render a trellis of tiles split by tag, or a sidebar menu, use the `drawTrellisOfTiles()` and `drawSidebarMenu()` functions. The sidebar functions use the top-level `metadata_name` and `metadata_id` fields (not `metadata_header`) for simple list rendering: [source,javascript] ---- - function tableFromList(listResponse){ - console.log(listResponse); - let t = document.createElement('table'); - - // Make table headers - let thead = document.createElement('thead'); - t.append(thead); - let thr = document.createElement('tr'); - thead.append(thr); - let headers = ['Name', 'Tags', 'Modified', 'Author']; - for (let i=0, len=headers.length; i < len; i++){ - let th = document.createElement('th'); - th.innerText = headers[i]; - thr.append(th); - } +// Sidebar menu — uses top-level metadata_name and metadata_id +// Equivalent to drawSidebarMenu() in the reference example +function drawSidebarMenu(metadataResponses) { + const lbs = metadataResponses['lb']; + const menuUl = document.getElementById('liveboards-menu'); + + lbs.forEach(item => { + const li = document.createElement('li'); + // Top-level fields for sidebar display and navigation + li.innerText = item['metadata_name']; + li.onclick = () => loadContent({ type: 'liveboard', guid: item['metadata_id'] }); + menuUl.appendChild(li); + }); +} +---- - // Go through response and build rows - for (let i=0, len=listResponse.length; i < len; i++){ - let tr = document.createElement('tr'); - - // Name Column - let name_td = document.createElement('td'); - name_td.innerHTML = '' + listResponse[i]['name'] + ''; - //name_td.append(name_text); - console.log(name_td); - tr.append(name_td); - - // Tags column - let tags_td = document.createElement('td'); - console.log(listResponse[i]['tags']); - // Tags is an Array of Tag objects, with properties ('name' being the important one) - if (listResponse[i]['tags'].length > 0){ - let tagNames = []; - for(let k = 0, len = listResponse[i]['tags'].length; k { + // Use viz.id with LiveboardEmbed to load individual visualizations + console.log(`Viz ID: ${viz.id}, Name: ${viz.name}`); + // new LiveboardEmbed('#embed', { liveboardId: '{liveboard-GUID}', vizId: viz.id }) +}); ---- The function in the preceding example merely creates the table, it does not place it on the page. You can continue chaining using `.then()` to place the table in the appropriate place on your web application page: @@ -351,4 +417,3 @@ async function metadataGetVizHeadersRestApiCall(liveboardGuid){ }); } ---- - From 2c9b93ad4ee21837f979bbb252ab2fe1feea00e4 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Sat, 13 Jun 2026 07:35:55 +0530 Subject: [PATCH 015/136] runtime sort update --- modules/ROOT/pages/common/nav-rest-api.adoc | 35 ++++++------ modules/ROOT/pages/runtime-sort.adoc | 63 ++++++++++----------- 2 files changed, 46 insertions(+), 52 deletions(-) diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index a9fec3165..d492ee863 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -12,24 +12,23 @@ REST APIs * link:{{navprefix}}/api-authv2[REST API v2.0 authentication] * link:{{navprefix}}/rest-v2-changelog[REST API v2 changelog] * link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fgetting-started%2Fintroduction[REST API v2 Playground] -* link:{{navprefix}}/rest-apiv2-reference[REST API v2.0 Reference] -** link:{{navprefix}}/api-user-management[Users and group privileges] -** link:{{navprefix}}/rbac[Role-based access control] -** link:{{navprefix}}/rest-apiv2-search[Search API endpoints] -*** link:{{navprefix}}/rest-apiv2-users-search[Search users] -*** link:{{navprefix}}/rest-apiv2-groups-search[Search groups] -*** link:{{navprefix}}/rest-apiv2-metadata-search[Search metadata] -** link:{{navprefix}}/fetch-data-and-report-apis[Data and Report APIs] -** link:{{navprefix}}/spotter-api[Spotter APIs] -*** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] -*** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] -*** link:{{navprefix}}/spotter-coaching-apis[Spotter coaching APIs ^BETA^] -** link:{{navprefix}}/audit-logs[Audit logs] -** link:{{navprefix}}/tml[TML] -** link:{{navprefix}}/collections[Collections ^BETA^] -** link:{{navprefix}}/connections[Connections] -** link:{{navprefix}}/connection-config[Connection configuration] -** link:{{navprefix}}/runtime-sort[Runtime sorting] +* link:{{navprefix}}/api-user-management[Users and group privileges] +* link:{{navprefix}}/rbac[Role-based access control] +* link:{{navprefix}}/rest-apiv2-search[Search API endpoints] +** link:{{navprefix}}/rest-apiv2-users-search[Search users] +** link:{{navprefix}}/rest-apiv2-groups-search[Search groups] +** link:{{navprefix}}/rest-apiv2-metadata-search[Search metadata] +* link:{{navprefix}}/fetch-data-and-report-apis[Data and Report APIs] +* link:{{navprefix}}/spotter-api[Spotter APIs] +** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] +** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] +** link:{{navprefix}}/spotter-coaching-apis[Spotter coaching APIs ^BETA^] +* link:{{navprefix}}/audit-logs[Audit logs] +* link:{{navprefix}}/tml[TML] +* link:{{navprefix}}/collections[Collections ^BETA^] +* link:{{navprefix}}/connections[Connections] +* link:{{navprefix}}/connection-config[Connection configuration] +* link:{{navprefix}}/runtime-sort[Runtime sorting] [.sidebar-title] diff --git a/modules/ROOT/pages/runtime-sort.adoc b/modules/ROOT/pages/runtime-sort.adoc index 78bce53f9..136026a8c 100644 --- a/modules/ROOT/pages/runtime-sort.adoc +++ b/modules/ROOT/pages/runtime-sort.adoc @@ -49,33 +49,7 @@ If you swap the sort order of these columns, the resulting output changes accord == Runtime sorting of columns via REST API -You can use the REST API v1 or REST API v2 endpoints to apply runtime sorting parameters. - -=== REST API v1 - -If you are using REST API v1 endpoints, runtime sorts can be applied when fetching a Liveboard or Answer object from ThoughtSpot. - -To sort columns when fetching data from a Liveboard object, add sort properties to the Liveboard data API request URL as shown in the example here: - ----- -http://{ThoughtSpot-host}/callosum/v1/tspublic/v1/pinboarddata?id=e36ee65e-64be-436b-a29a-22d8998c4fae&batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false ----- ----- -https://{ThoughtSpot-host}/callosum/v1/tspublic/v1/pinboarddata?id=e36ee65e-64be-436b-a29a-22d8998c4fae&batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false&sortCol2=Tea ----- - -To sort columns of an Answer object, add the sort attributes to the search data API request URL as shown in the following examples: ----- -https://{ThoughtSpot-host}/callosum/v1/tspublic/v1/searchdata?batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false ----- - ----- -https://{ThoughtSpot-host}/callosum/v1/tspublic/v1/searchdata?batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false&sortCol2=Tea ----- - -=== REST API v2.0 - -The following REST API v2.0 endpoints support applying runtime sort parameters: +The following REST API v2 endpoints support applying runtime sort parameters: * `POST /api/rest/2.0/report/liveboard` * `POST /api/rest/2.0/report/answer` @@ -86,7 +60,7 @@ The following REST API v2.0 endpoints support applying runtime sort parameters: The following examples show the request body with runtime sort attributes: -.**Answer report** +=== Answer report [source,cURL] ---- @@ -106,7 +80,7 @@ curl -X POST \ }' ---- -.**Liveboard report** +=== Liveboard report [source,cURL] ---- @@ -127,8 +101,7 @@ curl -X POST \ ---- - -.**Search data** +=== Search data [source,cURL] ---- @@ -149,7 +122,7 @@ curl -X POST \ }' ---- -.**Answer data** +=== Answer data [source,cURL] ---- @@ -169,7 +142,7 @@ curl -X POST \ }' ---- -.**Liveboard data** +=== Liveboard data [source,cURL] ---- @@ -187,4 +160,26 @@ curl -X POST \ "asc2": false } } ----- \ No newline at end of file +---- + +=== REST API v1 (Legacy endpoints) + +If you are using REST API v1 endpoints, runtime sorts can be applied when fetching a Liveboard or Answer object from ThoughtSpot. + +To sort columns when fetching data from a Liveboard object, add sort properties to the Liveboard data API request URL as shown in the example here: + +---- +http://{ThoughtSpot-host}/callosum/v1/tspublic/v1/pinboarddata?id=e36ee65e-64be-436b-a29a-22d8998c4fae&batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false +---- +---- +https://{ThoughtSpot-host}/callosum/v1/tspublic/v1/pinboarddata?id=e36ee65e-64be-436b-a29a-22d8998c4fae&batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false&sortCol2=Tea +---- + +To sort columns of an Answer object, add the sort attributes to the search data API request URL as shown in the following examples: +---- +https://{ThoughtSpot-host}/callosum/v1/tspublic/v1/searchdata?batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false +---- + +---- +https://{ThoughtSpot-host}/callosum/v1/tspublic/v1/searchdata?batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false&sortCol2=Tea +---- From cd108977e3df915e2161ac3db801c41e7eec7406 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Sat, 13 Jun 2026 08:30:41 +0530 Subject: [PATCH 016/136] stale page ref removal --- modules/ROOT/pages/embed-methods.adoc | 67 ++++++++++++--------------- modules/ROOT/pages/faqs.adoc | 3 ++ 2 files changed, 33 insertions(+), 37 deletions(-) diff --git a/modules/ROOT/pages/embed-methods.adoc b/modules/ROOT/pages/embed-methods.adoc index e2fbaf7ef..26650b808 100644 --- a/modules/ROOT/pages/embed-methods.adoc +++ b/modules/ROOT/pages/embed-methods.adoc @@ -14,31 +14,30 @@ Based on your embedding requirements and integration setup, you can use one of t * xref:getting-started.adoc[Embed using Visual Embed SDK] (Recommended) * xref:embed-without-sdk.adoc[iFrame embedding without SDK] -* link:https://docs.thoughtspot.com/software/7.2/embedding[Legacy embedding method with app.min.js, window=_blank] (ThoughtSpot Software only) +//* link:https://docs.thoughtspot.com/software/7.2/embedding[Legacy embedding method with app.min.js, window=_blank] (ThoughtSpot Software only) To determine the method that best fits your embedding requirement, refer to the information in the following tables. [div boxAuto] -- -[width="100%" cols="4,7,7,7"] +[width="100%" cols="4,7,7"] [options='header'] |===== -||Visual Embed SDK|Embed without SDK|Legacy embedding method -s|When to use|The SDK Supports all embed and customization use cases. Use the SDK for embedding ThoughtSpot if your host platform allows custom Javascript. -|Use this method only if your host platform doesn't allow custom Javascript. This method involves embedding a ThoughtSpot component in an iFrame.| The legacy embedding method is available for only ThoughtSpot Software deployments. With this method, you can embed a ThoughtSpot page, object, or the full application using `api.min.js` script. +||Visual Embed SDK|Embed without SDK +s|When to use|The SDK supports all embed and customization use cases. Use the SDK for embedding ThoughtSpot if your host platform allows custom Javascript. +|Use this method only if your host platform doesn't allow custom Javascript. This method involves embedding a ThoughtSpot component in an iFrame. + s|Feature availability a| ThoughtSpot Cloud ts7.may.cl or later + ThoughtSpot Software version 8.4.1-sw or later a| ThoughtSpot Cloud ts7.may.cl or later + -ThoughtSpot Software version 6.0 or later a| ThoughtSpot Software version 6.0 or later - -ThoughtSpot recommends using Visual Embed SDK and ThoughtSpot Embedded features from 8.4.1-sw onwards. +ThoughtSpot Software version 6.0 or later s|Required user privilege|`DEVELOPER` + `ADMINISTRATOR` -|`ADMINISTRATOR`|`ADMINISTRATOR` +|`ADMINISTRATOR` -s|Maintenance and support| Available | Available | Limited support +s|Maintenance and support|Available|Available |===== -- == Feature comparison @@ -47,50 +46,44 @@ The following table lists the features available with each embed flavor: [div tableContainer tableStyle1] -- -[width="100%" cols="4,5,5,6,6"] +[width="100%" cols="4,5,5,6"] [options='header'] |===== -|Feature category|Features| Visual Embed SDK|Embedding without SDK |Legacy embedding method +|Feature category|Features|Visual Embed SDK|Embedding without SDK -.5+|**Embed options**|Search|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–#| [tag greyBackground tick]#–# -|Visualization|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#| -Liveboard - Classic experience|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#| -Liveboard - New experience|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–#| -Full ThoughtSpot experience|[tag greenBackground tick]#✓# a|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +.4+|**Embed options**|Search|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# +|Visualization|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +|Liveboard|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +|Full ThoughtSpot experience|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# .5+|**Authentication**|SAML|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# + __Inline authentication__. __For more information, see xref:embed-without-sdk.adoc#iframe-auth[Embed without SDK]__. -|[tag greenBackground tick]#✓# -|OIDC| [tag greenBackground tick]#✓#|[tag greyBackground tick]#–#| [tag greyBackground tick]#–# -|Trusted authentication|[tag greenBackground tick]#✓#| [tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# -|Basic authentication| [tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# -|Auto-login on authentication expiry|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–#|[tag greyBackground tick]#–# - -.2+|**Custom Actions**|URL actions|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# + - -__Available in only ThoughtSpot Software 7.0 or earlier versions__ | - -Callback actions|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–#|[tag greyBackground tick]#–# +|OIDC|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# +|Trusted authentication|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +|Basic authentication|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +|Auto-login on authentication expiry|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# -.4+|**Granular control of embedded UI**|Customization flags such as hiding data sources, search options configuration, setting a Liveboard to full height, and so on| [tag greenBackground tick]#✓#|[tag greyBackground tick]#–#|[tag greyBackground tick]#–#| -Show or hide UI menu actions| [tag greenBackground tick]#✓#| [tag greyBackground tick]#–#|[tag greyBackground tick]#–#| -Style customization and rebranding of UI elements|[tag greenBackground tick]#✓# |[tag greenBackground tick]#✓# |[tag greenBackground tick]#✓# | -Link customization|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓#| +.2+|**Custom Actions**|URL actions|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +|Callback actions|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# -**Events** a|Ability to trigger and handle embed lifecycle and host app events + +.4+|**Granular control of embedded UI**|Customization flags such as hiding data sources, search options configuration, setting a Liveboard to full height, and more|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# +|Show or hide UI menu actions|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# +|Style customization and rebranding of UI elements|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# +|Link customization|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# -Interaction between host and embedded ThoughtSpot app| [tag greenBackground tick]#✓# |[tag greyBackground tick]#–#|[tag greyBackground tick]#–# + +|**Events** a|Ability to trigger and handle embed lifecycle and host app events + -__Legacy events only__| +Interaction between host and embedded ThoughtSpot app|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–# -**Runtime filters**|Ability to pass filters as URL query parameters |[tag greenBackground tick]#✓# |[tag greenBackground tick]#✓# |[tag greenBackground tick]#✓# | +|**Runtime filters**|Ability to pass filters as URL query parameters|[tag greenBackground tick]#✓#|[tag greenBackground tick]#✓# -**React components**| Ability to embed ThoughtSpot components in a React app|[tag greenBackground tick]#✓# |[tag greyBackground tick]#–#|[tag greyBackground tick]#–#| +|**React components**|Ability to embed ThoughtSpot components in a React app|[tag greenBackground tick]#✓#|[tag greyBackground tick]#–#| |===== -- +//// == Embed using REST APIs ThoughtSpot REST API framework supports data APIs, using which you can embed an answer, Liveboard, or a specific visualization from a Liveboard. You can use these APIs with or without the SDK to embed ThoughtSpot content in your app. diff --git a/modules/ROOT/pages/faqs.adoc b/modules/ROOT/pages/faqs.adoc index 5ef9465e7..cc93a5b21 100644 --- a/modules/ROOT/pages/faqs.adoc +++ b/modules/ROOT/pages/faqs.adoc @@ -353,6 +353,7 @@ The REST API v2.0 framework is built upon the existing core API functionality an For more information, see xref:rest-api-v2.adoc[REST API v2.0] and xref:rest-api-v1v2-comparison.adoc[REST API v1 and v2.0 comparison]. ==== +//// .Can I embed ThoughtSpot components using the REST API? [%collapsible] @@ -364,6 +365,8 @@ For more information, see the following pages: * xref:embed-rest-api.adoc[Embed using REST APIs] * xref:custom-viz-rest-api.adoc[Create a custom visualization using REST APIs] ==== +//// + .Are there any Certificate requirements for REST API calls From 7c4ba23e5f2a554e639da3a5a4d27d00baa1dce7 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Sat, 13 Jun 2026 07:31:18 +0530 Subject: [PATCH 017/136] rest api v1 ref removal --- modules/ROOT/pages/page-navigation.adoc | 461 ++++++++++++++---------- 1 file changed, 263 insertions(+), 198 deletions(-) diff --git a/modules/ROOT/pages/page-navigation.adoc b/modules/ROOT/pages/page-navigation.adoc index 5110a2aa4..48f8077d9 100644 --- a/modules/ROOT/pages/page-navigation.adoc +++ b/modules/ROOT/pages/page-navigation.adoc @@ -5,7 +5,7 @@ :page-pageid: in-app-navigation :page-description: Build dynamic menus and links to ThoughtSpot content from the embedding application -If you want to embed specific pages of ThoughtSpot application, you can individual embed components such as `LiveboardEmbed`, `SpotterEmbed`, or `SearchEmved` rather than full application embedding. The full application embed is a relatively fixed and unified application shell, while individual component embeds offer more granular and isolated control. +If you want to embed specific pages of the ThoughtSpot application, you can embed individual components such as `LiveboardEmbed`, `SpotterEmbed`, or `SearchEmbed` rather than full application embedding. The full application embed is a relatively fixed and unified application shell, while individual component embeds offer more granular and isolated control. If you choose to embed individual components with specific pages, your embedding app may require custom menus, navigation elements with xref:customize-links.adoc[routes for pages] and ThoughtSpot REST API integration to programmatically manage interaction and navigation between these pages. @@ -14,12 +14,12 @@ If you choose to embed individual components with specific pages, your embedding Mixing full application embedding with other embed components, such as `SearchEmbed`, `SpotterEmbed`, and `LiveboardEmbed`, is not recommended, because each embed method is designed to manage its own navigation, layout, and application state. Combining them can create complicated workflows and make it harder to maintain and customize your embedded application. ==== -See the link:https://github.com/thoughtspot/ts_everywhere_resources/blob/master/examples/menus_and_other_navigation_components/rest_api_ui_navigation_v2.html[code example on GitHub repository, window=_blank] for a complete flow of REST API requests powering various navigation components rendered within an embedding application’s page. +See the link:https://github.com/thoughtspot/ts_everywhere_resources/blob/master/examples/menus_and_other_navigation_components/rest_api_ui_navigation_v2.html[code example on GitHub, window=_blank] for a complete implementation using the V2.0 REST API to power navigation components in an embedded application. == Create menus to embedded ThoughtSpot pages Once you have the URL routes defined within the embedding application to load ThoughtSpot content, you can write code that generates links to these ThoughtSpot routes. -Navigation elements often take the form of a sidebar menu, a dropdown selector, a set of tiles, or individual buttons. +Navigation elements often take the form of a sidebar menu, a drop-down selector, a set of tiles, or individual buttons. The examples in the following sections use plain JavaScript to generate unstyled HTML elements. @@ -28,18 +28,16 @@ The real code for generating the proper links and the navigation elements will b == Hardcoded links within a menu system If your web application only embeds a limited set of ThoughtSpot objects, without granting users the ability to save their objects, you can __hardcode__ the object IDs and names of the ThoughtSpot content. -Object IDs in ThoughtSpot are GUIDs and thus are unique on every Org or instance, except separate instances that are intentionally replicated with the same GUIDs via TML import and export. +Object IDs in ThoughtSpot are GUIDs and are unique on every Org or instance, except for separate instances that are intentionally replicated with the same GUIDs via TML import and export. -You may still use the `xref:rest-api-v2-metadata-search.adoc[/metadata/search]` V2.0 REST API endpoint to retrieve the equivalent object IDs for content on various Orgs and environments in the process of "hardcoding" the menu system. Alternatively, you may keep a *mapping file* of equivalent objects during your CICD deployment process, that you use to generate the __hardcoded URLs__ in the menu system. +You can use the xref:rest-api-v2-metadata-search.adoc[`/api/rest/2.0/metadata/search`] V2.0 REST API endpoint to retrieve the equivalent object IDs for content on various Orgs and environments when building your hardcoded menu system. Alternatively, you can maintain a *mapping file* of equivalent objects during your CI/CD deployment process to generate the hardcoded URLs in the menu system. == Dynamic requests for content listings via REST API -Both the V1 and V2.0 REST APIs have endpoints for retrieving filtered lists of the content a user has access to. +The xref:rest-api-v2-metadata-search.adoc[`/api/rest/2.0/metadata/search`] V2.0 REST API endpoint retrieves filtered lists of the content a user has access to. -The xref:rest-api-v2-metadata-search.adoc[/metadata/search V2.0 REST API endpoint] can be used by the administrators to retrieve content for any given user or can be called as the user by the web browser once they have signed in via SSO. +The endpoint can be used by administrators to retrieve content for any given user, or called as the signed-in user directly from the web browser after signing in via SSO. -The response to `/metadata/search` can be parsed and split on *tags*, *author*, or other properties, or you can make multiple calls to the endpoint with the various filtering arguments in each request. For example, xref:rest-api-v2-metadata-search.adoc#_favorite_object_options[favorite options] can be specified to only retrieve objects that are marked as favorites by users. - -The xref:metadata-api.adoc#metadata-list[`/metadata/list` V1 REST API endpoint] is identical to the endpoint used within ThoughtSpot to render Answers, Liveboards, and Data pages, making it a simple path to replicate and customize the existing content listing pages within ThoughtSpot. +The response to `/api/rest/2.0/metadata/search` can be parsed and filtered on *tags*, *author*, or other properties. You can also make multiple calls to the endpoint with different filtering arguments in each request. For example, xref:rest-api-v2-metadata-search.adoc#_favorite_object_options[favorite options] can be specified to retrieve only objects marked as favorites by a user. The process for generating a dynamic menu includes the following steps: @@ -54,247 +52,315 @@ An administrator account can use the xref:rest-api-v2-metadata-search.adoc#permi By default, the endpoint returns for Liveboards, but the `metadata` section of the request can be set to specify `LIVEBOARD`, `ANSWER`, and `LOGICAL_TABLE` in any desired combination. -[code,json] +[source,javascript] ---- const answerRequestObject = { - "metadata": [{"type": "ANSWER"}], - "permissions" : [ - { - "principal": { - "type": "USER", - "identifier": "{username}" - }, - "share_mode": "READ_ONLY" - } - ] - 'record_offset': 0, // Adjust to do pagination - 'record_size': 100000 // Adjust to do pagination (or handle in browser with table component) -} + "metadata": [{ "type": "ANSWER" }], + "permissions": [ + { + "principal": { + "type": "USER", + "identifier": "{username}" + }, + "share_mode": "READ_ONLY" + } + ], + "record_offset": 0, + "record_size": 10000 +}; + +const response = await fetch('/api/rest/2.0/metadata/search', { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(answerRequestObject), + credentials: 'include' +}); + +// V2.0 returns a top-level array directly +const contentList = await response.json(); ---- -If the web application has implemented other processes on the back-end using a ThoughtSpot service account with administrator privileges, this may be the simplest implementation of retrieving the content listings rather than dealing with individual user access tokens for the requests. +If the web application uses a ThoughtSpot service account with administrator privileges on the backend, this approach may be simpler than managing individual user access tokens for each REST API request. === Requesting content as a user Rather than using an administrator account to request content listings, you can instead have the REST API request scoped to the user themselves, and the REST API will always only return the content they have access to. All REST API requests from the browser are scoped as the signed-in user, as long as the `credentials` option of the REST API request has been set properly to `include`. -[code,json] +[source,javascript] ---- const lbRequestObject = { - "metadata": [{"type": "LIVEBOARD"}], - 'record_offset': 0, // Adjust to do pagination - 'record_size': 100000 // Adjust to do pagination (or handle in browser with table component) -} + "metadata": [{ "type": "LIVEBOARD" }], + "record_offset": 0, + "record_size": 10000 +}; + +const response = await fetch('/api/rest/2.0/metadata/search', { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(lbRequestObject), + credentials: 'include' +}); + +// V2.0 returns a top-level array directly +const contentList = await response.json(); ---- -With xref:trusted-authentication.adoc[cookieless trusted authentication], there is no *browser session*. Instead, an *access token* is retrieved for the user and used by the SDK. +With xref:trusted-authentication.adoc[cookieless trusted authentication], there is no *browser session*. Instead, an *access token* is retrieved for the user and used by the SDK. The trusted authentication pattern requires implementing a backend service to generate access tokens for any user. The token request service can instead be used by the backend of the embedding web application to get an access token to make REST API requests for a user, rather than having it happen at the front-end within the web browser. === Build menu items and web app links -The response from the search REST API is an array of header objects, which includes the details needed to build out the menu items and the links within the web application to the pages that display ThoughtSpot content. - -The `/metadata/search` endpoint returns `metadata_name`, `metadata_id`, and `metadata_type` in each response item, which is enough information to build a simple menu and a link to the appropriate URL to display the content. - -The V2.0 `/metadata/search` endpoint has an additional `metadata_header` key within the response, with the object containing the following properties along with many others, while the `metadata/list` V1 endpoint contains them in a slightly different structure. - -Within the `metadata_header` section, `name` and `id` properties are identical to the `metadata_name` and `metadata_id` from the outer portion of the response. Additional properties the web application might use for display include: - -* `description` -+ -Text description added to content by creator -* `authorDisplayName` -+ -Display name of the object creator or current owner -* `authorName` -+ -Username of the object creator or current owner -* `created` -+ -Object creation timestamp (to milliseconds) -* `modified` -+ -Last edit timestamp (to milliseconds) -* `tags` -+ -Array of tag objects, each with a `name` property among other details +The response from `/api/rest/2.0/metadata/search` is a top-level array. Each item in the array exposes `metadata_name`, `metadata_id`, and `metadata_type` at the top level — enough to build a simple navigation list or sidebar menu. For richer rendering (descriptions, tags, modified date, author), use the nested `metadata_header` sub-object within each item. + +The following properties within `metadata_header` are useful for building navigation UI: + +* `id` — Object GUID (matches `metadata_id` at the top level) +* `name` — Object display name (matches `metadata_name` at the top level) +* `description` — Text description added by the creator +* `tags` — Array of tag objects; each has a `name` property +* `modified` — Last edit timestamp (milliseconds since epoch) +* `authorDisplayName` — Display name of the object owner Individual visualizations on a Liveboard can be loaded using the `LiveboardEmbed` component by supplying both `liveboardId` and `vizId`. -The display of a visualization from a Liveboard differs from a saved Answer object, which is loaded via the `SearchEmbed` component. The saved answer object always displays the ThoughtSpot search bar and UI actions for editing an Answer, whereas the visualizations display fewer UI elements and show the menu items in the **More** menu image:./images/icon-more-10px.png[the more options menu]. +The display of a visualization from a Liveboard differs from a saved Answer, which is loaded via the `SearchEmbed` component. The saved Answer always displays the ThoughtSpot search bar and UI actions for editing, whereas a visualization displays fewer UI elements and shows the *More* menu for chart-level actions. + +// FIX MINOR-8: Clarified that include_visualization_headers is a V2.0 parameter; no separate +// call is required. Previous wording incorrectly implied a separate V1 API call was needed. +To retrieve the visualization details for a Liveboard in the same API call, set the `include_visualization_headers` parameter to `true` in your request (see <>). -Setting the `include_visualization_headers` request parameter to `true` will bring back the list of all visualization details with any Liveboard response. This request requires a separate API call for each Liveboard in the V1 REST API. +== Replicating the ThoughtSpot Liveboards or Answers page -== Replicating the ThoughtSpot UI Liveboards or Answers page -As mentioned in the preceding sections, the `/metadata/list` V1 REST API provides the same details as the internal REST API used to display the pages within the ThoughtSpot UI, making it easy to "replicate" those pages exactly within the embedding web app's own UI. The V2.0 REST API includes these details within the `metadata_headers` section of its response so it can be used for a similar purpose as well (see the link:https://github.com/thoughtspot/ts_everywhere_resources/blob/master/examples/menus_and_other_navigation_components/rest_api_ui_navigation_v2.html[example on GitHub for V2.0 equivalents, window=_blank]. +The `/api/rest/2.0/metadata/search` endpoint provides the metadata required to replicate the Liveboards or Answers pages from the ThoughtSpot UI within your embedding application. -The endpoint can only request one object type at a time: + +The following `metadata.type` values are supported: -* `PINBOARD_ANSWER_BOOK` for Liveboards -* `QUESTION_ANSWER_BOOK` for answers -* `LOGICAL_TABLE` for data objects +* `LIVEBOARD` — Liveboards +* `ANSWER` — Saved Answers +* `LOGICAL_TABLE` — Data objects (Tables, Models, and Views) -Data objects can be filtered using an additional `subtype` parameter to limit the query specifically to ThoughtSpot tables, worksheets, or views. +For `LOGICAL_TABLE` objects, you can add a `subtype` filter to narrow results: -There are additional parameters for sorting and a `category` parameter that can filter the response to show only the objects created or marked as favorites by the logged-in user. +* `ONE_TO_ONE_LOGICAL` — Tables +* `WORKSHEET` — Models +* `AGGR_WORKSHEET` — Views -REST API calls are asynchronous. The following is an example function returning the response as a JSON object using *fetch()*: +The following example fetches all three content types, caches the responses, and allows switching between them with a content-type selector — matching the pattern used in the link:https://github.com/thoughtspot/ts_everywhere_resources/blob/master/examples/menus_and_other_navigation_components/rest_api_ui_navigation_v2.html[reference implementation, window=_blank]: [source,javascript] ---- - async function metadataListRestApiCall(args){ - // args = { 'type', 'category', 'sortOn', 'sortAsc', 'tagnames' } - let type = args['type'].toLowerCase(); - const publicApiUrl = 'callosum/v1/tspublic/v1/'; - let endpoint = 'metadata/list'; - - // Easy type names match ThoughtSpot UI names for objects - const typesToApiType = { - 'liveboard': 'PINBOARD_ANSWER_BOOK', - 'answer': 'QUESTION_ANSWER_BOOK', - 'datasource' : 'LOGICAL_TABLE', // datasource doesn't distinguish subtypes - 'table' : 'ONE_TO_ONE_LOGICAL', - 'view' : 'AGGR_WORKSHEET', - 'worksheet' : 'WORKSHEET' - } - - // batchsize = -1 gives all results - let apiParams = { 'batchsize' : '-1'}; - console.log(type); - // The three datasource types can be specified using 'subtype' - if (type == 'table' || type == 'view' || type == 'worksheet'){ - let subtype = [typesToApiType[type]]; - apiParams['type'] = 'LOGICAL_TABLE'; - apiParams['subtypes'] = `["${subtype}"]`; - } - else { - apiParams['type'] = typesToApiType[type]; - } +// Generic V2.0 REST API wrapper — equivalent to restApiCallV2() in the reference example +async function restApiCallV2(endpoint, httpVerb, apiRequestObj) { + const baseUrl = `${tsHost}/api/rest/2.0/`; + const apiFullEndpoint = baseUrl + endpoint; - // Category arguments - let category = 'ALL'; - if ('category' in args){ - if ( args['category'] == 'MY' || args['category'] == 'ALL' || args['category'] == 'FAVORITE'){ - category = args['category']; - apiParams['category'] = category; - } - } + const fetchArgs = { + method: httpVerb.toUpperCase(), + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + credentials: 'include' + }; - // Sort arguments - if ('sortOn' in args){ - if (args['sortOn'] !== null){ - apiParams['sort'] = args['sortOn']; - } - } + if (apiRequestObj !== null) { + fetchArgs['body'] = JSON.stringify(apiRequestObj); + } +---- - if ('sortAsc' in args){ - if (args['sortAsc'] === true){ - apiParams['sortascending'] = 'true'; - } - if (args['sortAsc'] === false){ - apiParams['sortascending'] = 'false'; - } - } + const response = await fetch(apiFullEndpoint, fetchArgs); - console.log(apiParams); - const searchParams = new URLSearchParams(apiParams); - const apiFullEndpoint = tsURL + publicApiUrl + endpoint + "?" + searchParams.toString(); - console.log(apiFullEndpoint); - return await fetch( - apiFullEndpoint, { - method: 'GET', - headers: { - "Accept": "application/json", - "X-Requested-By": "ThoughtSpot" - }, - credentials: "include" - }) - .then(response => response.json()) - .then(data => data['headers']) // metadata/list info is really in the 'headers' property returned - .catch(error => { - console.error("Unable to get the metadata/list response: " + error) - }); + if (!response.ok) { + throw new Error(`API error: ${response.status} ${response.statusText}`); } + + return response.status === 204 ? true : response.json(); +} + +// Wrapper for /metadata/search — equivalent to callMetadataSearchApi() in the reference example +async function callMetadataSearchApi(searchRequestObject) { + return await restApiCallV2('metadata/search', 'POST', searchRequestObject); +} + +// Request objects for each content type +const lbRequestObject = { + "metadata": [{ "type": "LIVEBOARD" }], + "record_offset": 0, + "record_size": 10000 +}; + +const answerRequestObject = { + "metadata": [{ "type": "ANSWER" }], + "record_offset": 0, + "record_size": 10000 +}; + +const tableRequestObject = { + "metadata": [{ "type": "LOGICAL_TABLE" }], + "record_offset": 0, + "record_size": 10000 +}; + +// Fetch all content types in parallel and cache the results +const [lbResponse, answerResponse, tableResponse] = await Promise.all([ + callMetadataSearchApi(lbRequestObject), + callMetadataSearchApi(answerRequestObject), + callMetadataSearchApi(tableRequestObject) +]); + +const metadataResponses = { + 'lb': lbResponse, + 'answer': answerResponse, + 'table': tableResponse +}; ---- -The results of this REST API request can be directed into a rendering function using `.then()`: +=== Rendering Liveboards or Answers pages similar to the ThoughtSpot UI + +To render a table similar to the Answers or Liveboards page in the ThoughtSpot UI, use the `tableFromMetadataSearch()` function pattern from the reference implementation. This function reads `metadata_header` sub-object fields (`id`, `name`, `description`, `tags`, `modified`, `authorDisplayName`) from each item in the V2.0 response array to populate the table columns: [source,javascript] ---- -metadataListRestApiCall( - { - 'type': 'liveboard', - 'sortOn': 'NAME', - 'sortAsc' : true, - 'category': 'ALL' - }) -.then( - (listResponse) => renderNavigationFromResponse(listResponse) // Use your own rendering function here -); +// Equivalent to tableFromMetadataSearch() in the reference example +// SOURCE: rest_api_ui_navigation_v2.html +function tableFromMetadataSearch(searchResponse) { + const table = document.createElement('table'); + + // Table headers + const thead = table.createTHead(); + const headerRow = thead.insertRow(); + ['Name', 'Description', 'Tags', 'Modified', 'Author'].forEach(label => { + const th = document.createElement('th'); + th.innerText = label; + headerRow.appendChild(th); + }); + + // Table rows — V2.0 response is a top-level array + searchResponse.forEach(item => { + // Rich detail fields are inside metadata_header + const headers = item['metadata_header']; + + const id = headers['id']; + const name = headers['name']; + const desc = headers['description']; + const tags = headers['tags']; // Array of { name: string } objects + const modified = headers['modified']; // Milliseconds since epoch + const authorDisplayName = headers['authorDisplayName']; + + const row = table.insertRow(); + + // Name column — link triggers loadContent() with the object GUID + const nameCell = row.insertCell(); + nameCell.innerHTML = + `${name}`; + + // Description column + const descCell = row.insertCell(); + if (desc !== null) { descCell.innerText = desc; } + + // Tags column — tags is an array of tag objects + const tagsCell = row.insertCell(); + if (tags.length > 0) { + tagsCell.innerText = tags.map(t => t['name']).join(', '); + } + + // Modified date column + const modifiedCell = row.insertCell(); + modifiedCell.innerText = new Date(modified).toUTCString(); + + // Author column + const authorCell = row.insertCell(); + authorCell.innerText = authorDisplayName; + }); + + return table; +} + +// Usage +const table = tableFromMetadataSearch(metadataResponses['lb']); +document.getElementById('main-content-div').appendChild(table); ---- -=== Rendering Liveboards or Answers pages similar to ThoughtSpot UI -If you want to render something very close to the 'Answers' or 'Liveboards' pages within the ThoughtSpot UI, your rendering function will grab the `name`, `id`, `tags`, `modified`, and `authorDisplayName` properties and make a table in that order (feel free to leave out any undesired elements): +To render a trellis of tiles split by tag, or a sidebar menu, use the `drawTrellisOfTiles()` and `drawSidebarMenu()` functions. The sidebar functions use the top-level `metadata_name` and `metadata_id` fields (not `metadata_header`) for simple list rendering: [source,javascript] ---- - function tableFromList(listResponse){ - console.log(listResponse); - let t = document.createElement('table'); - - // Make table headers - let thead = document.createElement('thead'); - t.append(thead); - let thr = document.createElement('tr'); - thead.append(thr); - let headers = ['Name', 'Tags', 'Modified', 'Author']; - for (let i=0, len=headers.length; i < len; i++){ - let th = document.createElement('th'); - th.innerText = headers[i]; - thr.append(th); - } +// Sidebar menu — uses top-level metadata_name and metadata_id +// Equivalent to drawSidebarMenu() in the reference example +function drawSidebarMenu(metadataResponses) { + const lbs = metadataResponses['lb']; + const menuUl = document.getElementById('liveboards-menu'); + + lbs.forEach(item => { + const li = document.createElement('li'); + // Top-level fields for sidebar display and navigation + li.innerText = item['metadata_name']; + li.onclick = () => loadContent({ type: 'liveboard', guid: item['metadata_id'] }); + menuUl.appendChild(li); + }); +} +---- - // Go through response and build rows - for (let i=0, len=listResponse.length; i < len; i++){ - let tr = document.createElement('tr'); - - // Name Column - let name_td = document.createElement('td'); - name_td.innerHTML = '' + listResponse[i]['name'] + ''; - //name_td.append(name_text); - console.log(name_td); - tr.append(name_td); - - // Tags column - let tags_td = document.createElement('td'); - console.log(listResponse[i]['tags']); - // Tags is an Array of Tag objects, with properties ('name' being the important one) - if (listResponse[i]['tags'].length > 0){ - let tagNames = []; - for(let k = 0, len = listResponse[i]['tags'].length; k { + // Use viz.id with LiveboardEmbed to load individual visualizations + console.log(`Viz ID: ${viz.id}, Name: ${viz.name}`); + // new LiveboardEmbed('#embed', { liveboardId: '{liveboard-GUID}', vizId: viz.id }) +}); ---- The function in the preceding example merely creates the table, it does not place it on the page. You can continue chaining using `.then()` to place the table in the appropriate place on your web application page: @@ -351,4 +417,3 @@ async function metadataGetVizHeadersRestApiCall(liveboardGuid){ }); } ---- - From 189b19454910276fd77f5b89457c3bad7a86c176 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Sat, 13 Jun 2026 07:35:55 +0530 Subject: [PATCH 018/136] runtime sort update --- modules/ROOT/pages/common/nav-rest-api.adoc | 35 ++++++------ modules/ROOT/pages/runtime-sort.adoc | 63 ++++++++++----------- 2 files changed, 46 insertions(+), 52 deletions(-) diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index a9fec3165..d492ee863 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -12,24 +12,23 @@ REST APIs * link:{{navprefix}}/api-authv2[REST API v2.0 authentication] * link:{{navprefix}}/rest-v2-changelog[REST API v2 changelog] * link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fgetting-started%2Fintroduction[REST API v2 Playground] -* link:{{navprefix}}/rest-apiv2-reference[REST API v2.0 Reference] -** link:{{navprefix}}/api-user-management[Users and group privileges] -** link:{{navprefix}}/rbac[Role-based access control] -** link:{{navprefix}}/rest-apiv2-search[Search API endpoints] -*** link:{{navprefix}}/rest-apiv2-users-search[Search users] -*** link:{{navprefix}}/rest-apiv2-groups-search[Search groups] -*** link:{{navprefix}}/rest-apiv2-metadata-search[Search metadata] -** link:{{navprefix}}/fetch-data-and-report-apis[Data and Report APIs] -** link:{{navprefix}}/spotter-api[Spotter APIs] -*** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] -*** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] -*** link:{{navprefix}}/spotter-coaching-apis[Spotter coaching APIs ^BETA^] -** link:{{navprefix}}/audit-logs[Audit logs] -** link:{{navprefix}}/tml[TML] -** link:{{navprefix}}/collections[Collections ^BETA^] -** link:{{navprefix}}/connections[Connections] -** link:{{navprefix}}/connection-config[Connection configuration] -** link:{{navprefix}}/runtime-sort[Runtime sorting] +* link:{{navprefix}}/api-user-management[Users and group privileges] +* link:{{navprefix}}/rbac[Role-based access control] +* link:{{navprefix}}/rest-apiv2-search[Search API endpoints] +** link:{{navprefix}}/rest-apiv2-users-search[Search users] +** link:{{navprefix}}/rest-apiv2-groups-search[Search groups] +** link:{{navprefix}}/rest-apiv2-metadata-search[Search metadata] +* link:{{navprefix}}/fetch-data-and-report-apis[Data and Report APIs] +* link:{{navprefix}}/spotter-api[Spotter APIs] +** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] +** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] +** link:{{navprefix}}/spotter-coaching-apis[Spotter coaching APIs ^BETA^] +* link:{{navprefix}}/audit-logs[Audit logs] +* link:{{navprefix}}/tml[TML] +* link:{{navprefix}}/collections[Collections ^BETA^] +* link:{{navprefix}}/connections[Connections] +* link:{{navprefix}}/connection-config[Connection configuration] +* link:{{navprefix}}/runtime-sort[Runtime sorting] [.sidebar-title] diff --git a/modules/ROOT/pages/runtime-sort.adoc b/modules/ROOT/pages/runtime-sort.adoc index 78bce53f9..136026a8c 100644 --- a/modules/ROOT/pages/runtime-sort.adoc +++ b/modules/ROOT/pages/runtime-sort.adoc @@ -49,33 +49,7 @@ If you swap the sort order of these columns, the resulting output changes accord == Runtime sorting of columns via REST API -You can use the REST API v1 or REST API v2 endpoints to apply runtime sorting parameters. - -=== REST API v1 - -If you are using REST API v1 endpoints, runtime sorts can be applied when fetching a Liveboard or Answer object from ThoughtSpot. - -To sort columns when fetching data from a Liveboard object, add sort properties to the Liveboard data API request URL as shown in the example here: - ----- -http://{ThoughtSpot-host}/callosum/v1/tspublic/v1/pinboarddata?id=e36ee65e-64be-436b-a29a-22d8998c4fae&batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false ----- ----- -https://{ThoughtSpot-host}/callosum/v1/tspublic/v1/pinboarddata?id=e36ee65e-64be-436b-a29a-22d8998c4fae&batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false&sortCol2=Tea ----- - -To sort columns of an Answer object, add the sort attributes to the search data API request URL as shown in the following examples: ----- -https://{ThoughtSpot-host}/callosum/v1/tspublic/v1/searchdata?batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false ----- - ----- -https://{ThoughtSpot-host}/callosum/v1/tspublic/v1/searchdata?batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false&sortCol2=Tea ----- - -=== REST API v2.0 - -The following REST API v2.0 endpoints support applying runtime sort parameters: +The following REST API v2 endpoints support applying runtime sort parameters: * `POST /api/rest/2.0/report/liveboard` * `POST /api/rest/2.0/report/answer` @@ -86,7 +60,7 @@ The following REST API v2.0 endpoints support applying runtime sort parameters: The following examples show the request body with runtime sort attributes: -.**Answer report** +=== Answer report [source,cURL] ---- @@ -106,7 +80,7 @@ curl -X POST \ }' ---- -.**Liveboard report** +=== Liveboard report [source,cURL] ---- @@ -127,8 +101,7 @@ curl -X POST \ ---- - -.**Search data** +=== Search data [source,cURL] ---- @@ -149,7 +122,7 @@ curl -X POST \ }' ---- -.**Answer data** +=== Answer data [source,cURL] ---- @@ -169,7 +142,7 @@ curl -X POST \ }' ---- -.**Liveboard data** +=== Liveboard data [source,cURL] ---- @@ -187,4 +160,26 @@ curl -X POST \ "asc2": false } } ----- \ No newline at end of file +---- + +=== REST API v1 (Legacy endpoints) + +If you are using REST API v1 endpoints, runtime sorts can be applied when fetching a Liveboard or Answer object from ThoughtSpot. + +To sort columns when fetching data from a Liveboard object, add sort properties to the Liveboard data API request URL as shown in the example here: + +---- +http://{ThoughtSpot-host}/callosum/v1/tspublic/v1/pinboarddata?id=e36ee65e-64be-436b-a29a-22d8998c4fae&batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false +---- +---- +https://{ThoughtSpot-host}/callosum/v1/tspublic/v1/pinboarddata?id=e36ee65e-64be-436b-a29a-22d8998c4fae&batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false&sortCol2=Tea +---- + +To sort columns of an Answer object, add the sort attributes to the search data API request URL as shown in the following examples: +---- +https://{ThoughtSpot-host}/callosum/v1/tspublic/v1/searchdata?batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false +---- + +---- +https://{ThoughtSpot-host}/callosum/v1/tspublic/v1/searchdata?batchsize=-1&pagenumber=-1&offset=-1&formattype=COMPACT&sortCol1=Sales&asc1=false&sortCol2=Tea +---- From ccea703a34b9b12ee4a86dffab1a98ac0b21caa1 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 15 Jun 2026 15:02:08 +0530 Subject: [PATCH 019/136] update SSO user note feedback --- modules/ROOT/pages/api-user-management.adoc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/api-user-management.adoc b/modules/ROOT/pages/api-user-management.adoc index 9046b7992..6db855d75 100644 --- a/modules/ROOT/pages/api-user-management.adoc +++ b/modules/ROOT/pages/api-user-management.adoc @@ -132,14 +132,23 @@ To update user details: #For review# [NOTE] ==== -When updating IAMv2 users with `account_type` set to `SAML_USER` or `OIDC_USER`, do not use these APIs to change identity attributes such as username, email address, or display name. - +Updating the username of an SSO user, `account_type` set to `SAML_USER` or `OIDC_USER`, requires changes in both the IdP and ThoughtSpot. If you rename an SSO user through the REST API and that user then logs in through the IdP: * If Just-in-Time (JIT) provisioning is enabled, ThoughtSpot creates a new duplicate account. The duplicate account does not inherit the original user's content, groups, or permissions. * If JIT provisioning is disabled, the user cannot log in. -To update the username or email of an SSO user, make the change in the IdP. ThoughtSpot reflects the updated attributes upon the user's next SSO login. +To safely update the username of an SSO user: + +. Update the username in your IdP. +. Before the user logs in again, update the username in ThoughtSpot to match the new value using the REST API or Admin UI. + +Both updates must be complete before the user's next SSO login. +The order of the two steps can be reversed — you may update ThoughtSpot first and the IdP second — provided the user does not log in during the interval between the two changes. + +For SSO users, ThoughtSpot derives email address and display name directly from the IdP. Update these attributes in your IdP only. +ThoughtSpot automatically reflects the new values when the user next logs in through SSO. +Do not use the REST API or the Admin UI to update the email address or display name of an SSO user. ==== From 6474ac44f2e0c0ac3f98d5126c888ab68827367e Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 15 Jun 2026 15:09:30 +0530 Subject: [PATCH 020/136] update SSO user note feedback --- modules/ROOT/pages/api-user-management.adoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/ROOT/pages/api-user-management.adoc b/modules/ROOT/pages/api-user-management.adoc index 6db855d75..a8e1e2428 100644 --- a/modules/ROOT/pages/api-user-management.adoc +++ b/modules/ROOT/pages/api-user-management.adoc @@ -149,6 +149,9 @@ The order of the two steps can be reversed — you may update ThoughtSpot first For SSO users, ThoughtSpot derives email address and display name directly from the IdP. Update these attributes in your IdP only. ThoughtSpot automatically reflects the new values when the user next logs in through SSO. Do not use the REST API or the Admin UI to update the email address or display name of an SSO user. + +For users who authenticate directly with ThoughtSpot (not through an external IdP), you can update username, email address, and display name using the REST API or Admin UI. +No IdP coordination is required for local users. ==== From 51d8fe79572bc3b5b34653e83c40cd8430994689 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 15 Jun 2026 17:15:53 +0530 Subject: [PATCH 021/136] update SSO user note feedback typo --- modules/ROOT/pages/api-user-management.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/api-user-management.adoc b/modules/ROOT/pages/api-user-management.adoc index a8e1e2428..29b93765c 100644 --- a/modules/ROOT/pages/api-user-management.adoc +++ b/modules/ROOT/pages/api-user-management.adoc @@ -129,10 +129,11 @@ To update user details: // SOURCE: SCAL-313918, SCAL-316352 // SOURCE: https://thoughtspot.slack.com/archives/C029SNQ27UN/p1776926046104759 -#For review# + [NOTE] ==== Updating the username of an SSO user, `account_type` set to `SAML_USER` or `OIDC_USER`, requires changes in both the IdP and ThoughtSpot. + If you rename an SSO user through the REST API and that user then logs in through the IdP: * If Just-in-Time (JIT) provisioning is enabled, ThoughtSpot creates a new duplicate account. The duplicate account does not inherit the original user's content, groups, or permissions. From 7faa5e80a1527fd64d1ec5de873b895af1533ae1 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 15 Jun 2026 20:14:43 +0530 Subject: [PATCH 022/136] update SSO user note --- modules/ROOT/pages/api-user-management.adoc | 24 +++++++++++++++++++++ modules/ROOT/pages/configure-saml.adoc | 22 ++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/api-user-management.adoc b/modules/ROOT/pages/api-user-management.adoc index 02884da29..eaa200df8 100644 --- a/modules/ROOT/pages/api-user-management.adoc +++ b/modules/ROOT/pages/api-user-management.adoc @@ -127,7 +127,31 @@ To update user details: * +++POST /api/rest/2.0/users/{user_identifier}/update+++ (Rest API v2) * xref:user-api.adoc#update-user[PUT /tspublic/v1/user/{userid}] (Rest API v1) +[NOTE] +==== +Updating the username of an SSO user, `account_type` set to `SAML_USER` or `OIDC_USER`, requires changes in both the IdP and ThoughtSpot. + +If you rename an SSO user through the REST API and that user then logs in through the IdP: + +* If Just-in-Time (JIT) provisioning is enabled, ThoughtSpot creates a new duplicate account. The duplicate account does not inherit the original user's content, groups, or permissions. +* If JIT provisioning is disabled, the user cannot log in. + +To safely update the username of an SSO user: +. Update the username in your IdP. +. Before the user logs in again, update the username in ThoughtSpot to match the new value using the REST API or Admin UI. + +Both updates must be complete before the user's next SSO login. +The order of the two steps can be reversed — you may update ThoughtSpot first and the IdP second — provided the user does not log in during the interval between the two changes. + +For SSO users, ThoughtSpot derives email address and display name directly from the IdP. Update these attributes in your IdP only. +ThoughtSpot automatically reflects the new values when the user next logs in through SSO. +Do not use the REST API or the Admin UI to update the email address or display name of an SSO user. + + +For users who authenticate directly with ThoughtSpot (not through an external IdP), you can update username, email address, and display name using the REST API or Admin UI. +No IdP coordination is required for local users. +==== //// diff --git a/modules/ROOT/pages/configure-saml.adoc b/modules/ROOT/pages/configure-saml.adoc index 7fdd77b4a..0c19e5dd1 100644 --- a/modules/ROOT/pages/configure-saml.adoc +++ b/modules/ROOT/pages/configure-saml.adoc @@ -119,7 +119,7 @@ Make a note of all of the redirects within the SAML workflow. Each server must b To configure SAML SSO authentication on the ThoughtSpot embedded instance, complete the following steps: * xref:configure-saml.adoc#admin-portal[Enable SAML authentication on ThoughtSpot with IAMv1] -* xref:configure-saml.adoc#IAMv2[Enable SAML authentication on ThoughtSpot with IAMv2] (Requires assistance from ThoughtSpot Support) +* xref:configure-saml.adoc#IAMv2[Enable SAML authentication on ThoughtSpot with IAMv2] * xref:configure-saml.adoc#idp-config[Configure the IdP server for SAML authentication] * xref:configure-saml.adoc#auth-config-sdk[Enable SSO authentication in Visual Embed SDK] * xref:configure-saml.adoc#saml-redirect[Add SAML redirect domain to the allowed list in ThoughtSpot] @@ -261,6 +261,26 @@ link:https://docs.thoughtspot.com/cloud/latest/saml-okta#_enable_saml_authentica You can map your SAML groups,or groups and Orgs from your IdP to your ThoughtSpot. This means that you do not have to manually recreate your groups and Orgs in ThoughtSpot if they are already present in your IdP. Refer to link:https://docs.thoughtspot.com/cloud/latest/saml-group-mapping[Configure SAML group mapping, window=_blank]. +[#update-idp-cert-iamv2] +=== Update your IdP certificate +If your IdP certificate expires or is rotated, you can update it in the ThoughtSpot UI. +ThoughtSpot IAMv2 supports self-serve certificate management — changes take effect immediately after you save. + +To update your IdP certificate: + +* Go to *Admin* > *User management* > *Authentication* +* Navigate to your SAML connection and click the **More** menu image:./images/icon-more-10px.png[the more options menu] > *Edit* +* In the *IDP provider certificate* field, replace the existing certificate with the new certificate file from your IdP. ++ +[NOTE] +==== +Download the raw certificate file from your IdP settings page. +The accepted format is `PEM / .cer / .crt`. +==== +* Click *Save*. + +Your users can sign in using the updated certificate immediately. +If users experience sign-in failures after a certificate rotation, verify that the certificate in ThoughtSpot matches the certificate currently active on your IdP. [#idp-config] === Configure the IdP server for SAML authentication From da1f8636bf00cda60e773968e155c7f50fd5ef20 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 16 Jun 2026 02:45:52 +0530 Subject: [PATCH 023/136] SCAL-291968 --- modules/ROOT/pages/configure-saml.adoc | 22 +++++++++++++ .../ROOT/pages/just-in-time-provisioning.adoc | 8 +++++ modules/ROOT/pages/orgs.adoc | 14 ++++++++ modules/ROOT/pages/whats-new.adoc | 32 +++++++++++++++++++ 4 files changed, 76 insertions(+) diff --git a/modules/ROOT/pages/configure-saml.adoc b/modules/ROOT/pages/configure-saml.adoc index 9467a65d4..3991547b2 100644 --- a/modules/ROOT/pages/configure-saml.adoc +++ b/modules/ROOT/pages/configure-saml.adoc @@ -114,6 +114,28 @@ disableSAMLAutoRedirect=true Make a note of all of the redirects within the SAML workflow. Each server must be configured properly to allow the inbound and outbound portions of the SAML flow. If you encounter errors while configuring and testing, go to the *Network* tab of the browser's developer tools to see which server within the workflow is generating the error. ==== +[#per-org-idp-org-isolation] +=== Org isolation for per-org IdP authentication + +// SOURCE: SCAL-291968 — OIDCClient.java, OrgUtils.java, SecurityEventTypeEnum.java +When your ThoughtSpot cluster uses per-org IdP configuration — where each Org is bound to its own identity provider — ThoughtSpot enforces strict org isolation on all incoming SAML and OIDC group and org claims. + +==== How it works + +When a user authenticates through a per-org IdP, ThoughtSpot identifies the **authorized Org** associated with that IdP. It then evaluates every group and org claim in the assertion: + +* Claims that reference the authorized Org are accepted and processed normally. +* Claims that reference any other Org are **silently dropped**. They do not grant access to those Orgs, and they are not used for group provisioning in those Orgs. +* Group claims that carry no Org suffix are automatically scoped to the authorized Org. + +For example, if a user logs in through IdP-A, which is bound to Org X, a claim of `PowerUser@X` is accepted. A claim of `Admin@Y` is dropped. + +NOTE: Org isolation applies only to per-org IdP logins. Cluster-wide (single IdP) SSO configurations are not affected. + +==== Effect on existing org memberships + +Org isolation is non-destructive. If a user already has legitimate, manually-assigned membership in another Org — granted by a cluster administrator — that membership is preserved after a per-org IdP login. Per-org SAML or OIDC authentication cannot be used as a source of new access to Orgs outside the authorized Org. + == Configuration steps To configure SAML SSO authentication on the ThoughtSpot embedded instance, complete the following steps: diff --git a/modules/ROOT/pages/just-in-time-provisioning.adoc b/modules/ROOT/pages/just-in-time-provisioning.adoc index a5e80275f..803214fb0 100644 --- a/modules/ROOT/pages/just-in-time-provisioning.adoc +++ b/modules/ROOT/pages/just-in-time-provisioning.adoc @@ -177,6 +177,14 @@ Due to the nature of assertions returned from an IdP, the JIT provisioning capab In general, the IdP assertion can create a user and add them to existing ThoughtSpot groups within existing ThoughtSpot Orgs. == SAML SSO authentication +[NOTE] +==== +// SOURCE: SCAL-291968 — OIDCClient.java, OrgUtils.java +*Per-org IdP claim filtering:* If your ThoughtSpot cluster uses per-org IdP configuration, ThoughtSpot automatically filters SAML and OIDC group and org claims at login time. Only claims that reference the Org bound to the authenticating IdP are used for JIT provisioning. Claims referencing other Orgs are dropped and logged as security audit events. This behavior ensures that a per-org IdP cannot be used to provision users into Orgs it is not authorized to manage. + +For more information, see xref:configure-saml.adoc#per-org-idp-org-isolation[Org isolation for per-org IdP authentication]. +==== + For SAML SSO users, you can link:https://docs.thoughtspot.com/cloud/latest/authentication-integration#_enable_saml_authentication[enable SAML authentication, window=_blank] and *Automatically add SAML users to ThoughtSpot upon first authentication*. For information about how to map `username`, `displayName`, `email`, and `orgId` properties from the IdP, see link:https://docs.thoughtspot.com/cloud/latest/authentication-integration#_configure_the_idp[Configure the IdP server for SAML authentication, window=_blank]. diff --git a/modules/ROOT/pages/orgs.adoc b/modules/ROOT/pages/orgs.adoc index d83d63f0b..8e49e6288 100644 --- a/modules/ROOT/pages/orgs.adoc +++ b/modules/ROOT/pages/orgs.adoc @@ -253,6 +253,20 @@ a|[tag greenBackground tick]#✓# |===== +[#per-org-sso-isolation] +=== SSO and Org isolation + +// SOURCE: SCAL-291968 — OIDCClient.java, SecurityEventTypeEnum.java, design doc 1R4P3Eup4-UQJAWxyoeHjGr87mzJGWIOvfPDyHQF6-cQ +ThoughtSpot supports SAML and OIDC group synchronization on multi-tenant clusters. When you use **per-org IdP configuration**, ThoughtSpot enforces strict org isolation on all incoming group and org claims to protect tenant boundaries. + +* Each Org can be bound to its own identity provider. +* When a user logs in via a per-org IdP, only claims that reference that IdP's authorized Org are honored. Claims referencing other Orgs are dropped. +* Dropped claims are recorded as security audit events +//(`OIDC_CROSS_ORG_CLAIM_DROPPED`, `SAML_CROSS_ORG_CLAIM_DROPPED`). +* Existing manually-assigned org memberships are not removed by a per-org IdP login. + +For more information, see xref:configure-saml.adoc#per-org-idp-org-isolation[Org isolation for per-org IdP authentication]. + == Authentication considerations for embedded apps //// diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 6320f0913..2f2ee6174 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -23,6 +23,38 @@ This page lists new features, enhancements, and deprecated functionality introdu // *Affects:* Developers, Administrators, End Users // ============================================================ +== June 2026 + +**Release version**: ThoughtSpot Cloud 26.7.0.cl + +*Upgrade notes*: No breaking changes. + +*Recommended SDK versions*: Visual Embed SDK v1.50.0 and later + +[.cl-table, cols="2,4", frame=none, grid=none] +|===== +a| +[.cl-label] +*Version 26.7.0.cl* + +a| +[discrete] +==== Org isolation for per-org SAML and OIDC authentication +ThoughtSpot now enforces strict org isolation when users authenticate through a per-org identity provider (IdP). When a per-org IdP sends SAML or OIDC group claims that reference Orgs outside its authorized scope, ThoughtSpot silently drops those claims and records them as security audit events. This prevents a rogue IdP administrator in one Org from using group assertions to gain unauthorized access to another Org. Existing manually-assigned org memberships are unaffected. + +--- + +[discrete] +==== Visual Embed SDK +The Visual Embed SDK version 1.49.0 includes several new features and enhancements. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. + +--- + +[discrete] +==== REST API v2 +This release introduces new API endpoints for Spotter, connections and trusted authentication. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + +|===== + + == June 2026 **Release version**: ThoughtSpot Cloud 26.6.0.cl + From 145ec213caa613a5969be5e9fa713afb589c24a9 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 16 Jun 2026 03:08:55 +0530 Subject: [PATCH 024/136] SCAL-291968 --- modules/ROOT/pages/configure-saml.adoc | 2 +- modules/ROOT/pages/just-in-time-provisioning.adoc | 2 +- modules/ROOT/pages/orgs.adoc | 2 +- modules/ROOT/pages/whats-new.adoc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/configure-saml.adoc b/modules/ROOT/pages/configure-saml.adoc index 3991547b2..d17a5eb8f 100644 --- a/modules/ROOT/pages/configure-saml.adoc +++ b/modules/ROOT/pages/configure-saml.adoc @@ -115,7 +115,7 @@ Make a note of all of the redirects within the SAML workflow. Each server must b ==== [#per-org-idp-org-isolation] -=== Org isolation for per-org IdP authentication +=== #Org isolation for per-org IdP authentication# // SOURCE: SCAL-291968 — OIDCClient.java, OrgUtils.java, SecurityEventTypeEnum.java When your ThoughtSpot cluster uses per-org IdP configuration — where each Org is bound to its own identity provider — ThoughtSpot enforces strict org isolation on all incoming SAML and OIDC group and org claims. diff --git a/modules/ROOT/pages/just-in-time-provisioning.adoc b/modules/ROOT/pages/just-in-time-provisioning.adoc index 803214fb0..cc0a364fc 100644 --- a/modules/ROOT/pages/just-in-time-provisioning.adoc +++ b/modules/ROOT/pages/just-in-time-provisioning.adoc @@ -180,7 +180,7 @@ In general, the IdP assertion can create a user and add them to existing Thought [NOTE] ==== // SOURCE: SCAL-291968 — OIDCClient.java, OrgUtils.java -*Per-org IdP claim filtering:* If your ThoughtSpot cluster uses per-org IdP configuration, ThoughtSpot automatically filters SAML and OIDC group and org claims at login time. Only claims that reference the Org bound to the authenticating IdP are used for JIT provisioning. Claims referencing other Orgs are dropped and logged as security audit events. This behavior ensures that a per-org IdP cannot be used to provision users into Orgs it is not authorized to manage. +*#Per-org IdP claim filtering:#* If your ThoughtSpot cluster uses per-org IdP configuration, ThoughtSpot automatically filters SAML and OIDC group and org claims at login time. Only claims that reference the Org bound to the authenticating IdP are used for JIT provisioning. Claims referencing other Orgs are dropped and logged as security audit events. This behavior ensures that a per-org IdP cannot be used to provision users into Orgs it is not authorized to manage. For more information, see xref:configure-saml.adoc#per-org-idp-org-isolation[Org isolation for per-org IdP authentication]. ==== diff --git a/modules/ROOT/pages/orgs.adoc b/modules/ROOT/pages/orgs.adoc index 8e49e6288..b417aa0c7 100644 --- a/modules/ROOT/pages/orgs.adoc +++ b/modules/ROOT/pages/orgs.adoc @@ -254,7 +254,7 @@ a|[tag greenBackground tick]#✓# |===== [#per-org-sso-isolation] -=== SSO and Org isolation +=== #SSO and Org isolation# // SOURCE: SCAL-291968 — OIDCClient.java, SecurityEventTypeEnum.java, design doc 1R4P3Eup4-UQJAWxyoeHjGr87mzJGWIOvfPDyHQF6-cQ ThoughtSpot supports SAML and OIDC group synchronization on multi-tenant clusters. When you use **per-org IdP configuration**, ThoughtSpot enforces strict org isolation on all incoming group and org claims to protect tenant boundaries. diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 2f2ee6174..301cdc99b 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -37,7 +37,7 @@ a| a| [discrete] -==== Org isolation for per-org SAML and OIDC authentication +==== #Org isolation for per-org SAML and OIDC authentication# ThoughtSpot now enforces strict org isolation when users authenticate through a per-org identity provider (IdP). When a per-org IdP sends SAML or OIDC group claims that reference Orgs outside its authorized scope, ThoughtSpot silently drops those claims and records them as security audit events. This prevents a rogue IdP administrator in one Org from using group assertions to gain unauthorized access to another Org. Existing manually-assigned org memberships are unaffected. --- From 9f2474fc53d1e386525f4a6a445de0b0c62fb9ac Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 16 Jun 2026 12:57:03 +0530 Subject: [PATCH 025/136] typos --- modules/ROOT/pages/configure-saml.adoc | 2 +- modules/ROOT/pages/just-in-time-provisioning.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/configure-saml.adoc b/modules/ROOT/pages/configure-saml.adoc index d17a5eb8f..e1965d2c4 100644 --- a/modules/ROOT/pages/configure-saml.adoc +++ b/modules/ROOT/pages/configure-saml.adoc @@ -284,7 +284,7 @@ You can map your SAML groups,or groups and Orgs from your IdP to your ThoughtSpo Refer to link:https://docs.thoughtspot.com/cloud/latest/saml-group-mapping[Configure SAML group mapping, window=_blank]. [#update-idp-cert-iamv2] -=== #Update your IdP certificate# +=== Update your IdP certificate If your IdP certificate expires or is rotated, you can update it in the ThoughtSpot UI. ThoughtSpot IAMv2 supports self-serve certificate management — changes take effect immediately after you save. diff --git a/modules/ROOT/pages/just-in-time-provisioning.adoc b/modules/ROOT/pages/just-in-time-provisioning.adoc index cc0a364fc..822bc6ea8 100644 --- a/modules/ROOT/pages/just-in-time-provisioning.adoc +++ b/modules/ROOT/pages/just-in-time-provisioning.adoc @@ -180,7 +180,7 @@ In general, the IdP assertion can create a user and add them to existing Thought [NOTE] ==== // SOURCE: SCAL-291968 — OIDCClient.java, OrgUtils.java -*#Per-org IdP claim filtering:#* If your ThoughtSpot cluster uses per-org IdP configuration, ThoughtSpot automatically filters SAML and OIDC group and org claims at login time. Only claims that reference the Org bound to the authenticating IdP are used for JIT provisioning. Claims referencing other Orgs are dropped and logged as security audit events. This behavior ensures that a per-org IdP cannot be used to provision users into Orgs it is not authorized to manage. +#If your ThoughtSpot cluster uses per-org IdP configuration, ThoughtSpot automatically filters SAML and OIDC group and org claims at login time. Only claims that reference the Org bound to the authenticating IdP are used for JIT provisioning. Claims referencing other Orgs are dropped and logged as security audit events. This behavior ensures that a per-org IdP cannot be used to provision users into Orgs it is not authorized to manage.# For more information, see xref:configure-saml.adoc#per-org-idp-org-isolation[Org isolation for per-org IdP authentication]. ==== From 9007ec06e2f6b909b5bd06cfc246144f1dc78430 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Wed, 17 Jun 2026 10:21:25 +0530 Subject: [PATCH 026/136] style apis --- modules/ROOT/pages/common/nav-embedding.adoc | 1 + modules/ROOT/pages/customize-style-api.adoc | 374 ++++++++++++++----- modules/ROOT/pages/rest-apiv2-changelog.adoc | 53 +++ modules/ROOT/pages/style-customization.adoc | 9 +- modules/ROOT/pages/whats-new.adoc | 19 + 5 files changed, 357 insertions(+), 99 deletions(-) diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc index c5a64bbb4..a09b4ca96 100644 --- a/modules/ROOT/pages/common/nav-embedding.adoc +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -46,6 +46,7 @@ Customize and integrate * link:{{navprefix}}/style-customization[Customize UI layout and styles] ** link:{{navprefix}}/customize-style[Customize basic styles] +** link:{{navprefix}}/style-customization-apis[Customize styles through APIs] ** link:{{navprefix}}/custom-css[CSS customization framework] ** link:{{navprefix}}/theme-builder-doc[Theme builder] ** link:{{navprefix}}/customize-icons[Customize icons] diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc index 27080a603..dc7a6bf18 100644 --- a/modules/ROOT/pages/customize-style-api.adoc +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -1,16 +1,11 @@ = Customize UI layout and styles through REST APIs :toc: true -:toclevels: 1 +:toclevels: 2 :page-title: Customize styles and layout through REST APIs :page-pageid: style-customization-apis :page-description: Customize styles, design, and layout of embedded ThoughtSpot app using REST APIs -ThoughtSpot introduces a new set of REST API v2.0 endpoints to manage style customization settings programmatically. -These endpoints expose all branding and theming controls available in the *Develop* > *Customizations* > *Styles* page in the ThoughtSpot UI, enabling developers and administrators to automate branding and white-labeling — including across multiple Orgs on a multi-tenant cluster — without logging in to the ThoughtSpot UI. - -== Style customization REST APIs - // SOURCE: SCAL-293070, SCAL-293071 //[earlyAccess eaBackground]#Early Access# @@ -19,139 +14,330 @@ ThoughtSpot provides REST API v2.0 endpoints to manage style customization setti [NOTE] ==== -All style customization API endpoints require administrator privileges. API calls from non-administrator users return `403 Forbidden`. +All style customization API endpoints require administrator or developer privileges. ==== === Style configuration Use the following endpoints to search and update style settings at the cluster or Org scope. -Search style configuration:: -`POST /api/rest/2.0/customization/styles/search` + -Returns the current style configuration for the cluster and the active Org. + +==== Search style configuration +To get the current style configuration for the cluster and the active Org send an API request to `POST /api/rest/2.0/customization/styles/search` endpoint. When called from the Primary Org (Org 0), the response returns one record with `"scope": "CLUSTER"` and one with `"scope": "ORG"`. -Update style configuration:: -`POST /api/rest/2.0/customization/styles/update` + -Updates one or more style settings. Supports the following parameters: +==== Update style configuration +To update the style settings send an API request to `POST /api/rest/2.0/customization/styles/update` endpoint. +Request parameters:: [cols="2,1,4"] |===== |Parameter|Required|Description |`scope`|Yes|`CLUSTER` or `ORG`. -|`org_identifier`|Conditional|Required when `scope` is `ORG`. -|`operation`|Yes|`REPLACE` overwrites existing settings. `MERGE` applies only the specified fields. +//|`org_identifier`|Conditional|Required when `scope` is `ORG`. +|`operation`|Yes|`REPLACE` overwrites existing settings. `RESET` reverts specific fields to defaults. |`navigation_panel`|No|Top navigation panel color. Use `"theme": "CUSTOM"` with a valid hex value in `"base_color"`. -|`chart_color_palette`|No|Array of hex color values for charts. +|`chart_color_palette`|No|Array of hex color values for charts. When provided with `REPLACE`, exactly 8 color entries must be specified in colors. |`embedded_footer_text`|No|Footer text for embedded content. -|`visualization_fonts`|No|Font assignments for visualization elements. +|`visualization_fonts`|No|Font assignments for visualization elements. Provide only the areas to update; omitted areas remain unchanged. |`default_logo`|No|Binary image file for the square application logo. |`wide_logo`|No|Binary image file for the wide logo (email and PDF exports). |`reset_options`|No|Resets specified settings to ThoughtSpot defaults. |===== +Example request:: To set a custom navigation panel color at cluster scope + + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/update' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "CLUSTER", + "operation": "REPLACE", + "navigation_panel": { + "theme": "CUSTOM", + "base_color": "#2359B6" + } +} +---- + +Example request:: To update chart color palette for a specific Org (MERGE) + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/update' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "ORG", + "org_identifier": "Sales Org", + "operation": "REPLACE", + "chart_color_palette": { + "colors": [ + {"color": "#FF6B35"}, + {"color": "#004E89"}, + {"color": "#1A936F"}, + {"color": "#C6D8D3"}, + {"color": "#F18F01"}, + {"color": "#8B4513"}, + {"color": "#6A0572"}, + {"color": "#2E8B57"} + ], + "disable_color_rotation": false + } +} +---- + === Custom fonts -Upload a custom font:: -`POST /api/rest/2.0/customization/styles/fonts/upload` + -Uploads a font file (multipart/form-data). + -Required: `name`, `file_content`. + -Optional: `weight`, `style`, `color`. - -Search custom fonts:: -`POST /api/rest/2.0/customization/styles/fonts/search` + -Returns custom fonts uploaded to the instance. + -Optional filters: `font_identifier`, `name_pattern`, `include_font_assignments`. - -Update a custom font:: -`PUT /api/rest/2.0/customization/styles/fonts/{font_identifier}` + -Updates an existing font's display name, weight, style, or color. - -Delete custom fonts:: -`POST /api/rest/2.0/customization/styles/fonts/delete` + -Deletes one or more custom fonts from the font library. Supply one or more font GUIDs or display names in `font_identifiers`. + -+ -[IMPORTANT] -==== -`dry_run` defaults to `true`. In dry-run mode, the API computes and returns all affected visualization assignments but does *not* delete the fonts. Set `dry_run: false` to commit the deletion. -==== -+ -When a font is deleted, all visualization areas that used it are automatically reset to the system default font. The response body lists these affected assignments grouped by Org. +==== Upload a custom font +To upload a font file (multipart/form-data) send an API request to `POST /api/rest/2.0/customization/styles/fonts/upload` endpoint. -=== Logo export +Request parameters:: + +[cols="2,1,4"] +|===== +|Parameter|Required|Description + +|`scope` +|No +|Scope of the font library. Valid values: `CLUSTER`, `ORG`. +Defaults to `ORG` when Orgs are enabled; defaults to `CLUSTER` when Orgs are disabled. + +|`org_identifier` +|Conditional +|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. +Defaults to the currently logged-in user's Org if omitted. + +|`name` +|Yes +|Display name for the font. Must be unique within the target scope. -Export logos:: -`POST /api/rest/2.0/customization/styles/logos/export` + -Exports the configured logo files as a ZIP archive containing the default and wide logo images. +|`file_content` +|Yes +|Binary font file. Accepted formats: WOFF and WOFF2 only. -=== Example: Update navigation panel color +|`weight` +|No +|Font weight. Valid values: `NORMAL`, `LIGHT`, `BOLD`. -The following example updates the top navigation panel to a custom color at the cluster scope: +|`style` +|No +|Font style. Valid values: `NORMAL`, `ITALIC`, `OBLIQUE`. -[source,JSON] +|`color` +|No +|Default color for the font as a 6-digit hex string. Example: `#333333`. + +|===== + +Example Request:: +[source,cURL] ---- -POST /api/rest/2.0/customization/styles/update - -{ - "scope": "CLUSTER", - "operation": "REPLACE", - "navigation_panel": { - "theme": "CUSTOM", - "base_color": "#1A2B3C" - } -} +curl -X POST 'https://{your-thoughtspot-host}/api/rest/2.0/customization/styles/fonts/upload' \ +-H 'Authorization: Bearer {token}' \ +-H 'Accept: application/json' \ +-F 'name=Acme Sans' \ +-F 'weight=BOLD' \ +-F 'style=NORMAL' \ +-F 'color=#333333' \ +-F 'file_content=@/path/to/acme-sans-bold.woff2' ---- -=== Example: Update chart color palette for an Org -[source,JSON] +==== Search style fonts +To get custom fonts uploaded to the instance or the Org, send an API request to the `POST /api/rest/2.0/customization/styles/fonts/search` endpoint. + +Request parameter:: +[cols="2,1,4"] +|===== +|Parameter|Required|Description + +|`scope` +|Yes +|Scope of the font library. Valid values: `CLUSTER`, `ORG`. + + +//// +|`org_identifier` +|Conditional +|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. +Defaults to the caller's active Org if omitted. +//// + + +|`font_identifier` +|No +|Filter by exact font GUID or exact display name (case-insensitive). +Cannot be used together with `name_pattern`. + +|`name_pattern` +|No +|Filter by partial, case-insensitive substring match on font display name. +Cannot be used together with `font_identifier`. + +|`include_font_assignments` +|No +|If `true`, each font in the response includes the visualization areas it is assigned to. +Default: `false`. + +|===== + +Example API request:: +Return all fonts with their visualization assignments + +[source,cURL] ---- -POST /api/rest/2.0/customization/styles/update - -{ - "scope": "ORG", - "org_identifier": "", - "operation": "MERGE", - "chart_color_palette": { - "colors": ["#FF6B35", "#004E89", "#1A936F", "#C6D8D3", "#F18F01"] - } +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/search' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "CLUSTER", + "include_font_assignments": true } ---- +Example API request:: Filter by name pattern +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/search' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "ORG", + "org_identifier": "Sales Org", + "name_pattern": "acme", + "include_font_assignments": false +} +---- + +==== Update a custom font +To update an existing font's display name, weight, style, or color send an API request to the `POST /api/rest/2.0/customization/styles/fonts/{font_identifier}/update` endpoint. -=== Example: Dry-run delete to preview affected assignments +Request parameters:: -Use `dry_run: true` (the default) to preview which visualization areas will be affected before committing a font deletion: +[cols="2,1,4"] +|===== +|Parameter|Required|Description + +|`font_identifier` +|Yes +|GUID or display name of the font to update. Passed as a path parameter. + +|`scope` +|Yes +|Scope of the font library. Valid values: `CLUSTER`, `ORG`. -// SOURCE: entity/FontDeleteRequest.java (dev/scaligent, master) -[source,JSON] +|`name` +|No +|New display name for the font. Omit to leave unchanged. + +|`weight` +|No +|Updated font weight. Valid values: `NORMAL`, `LIGHT`, `BOLD`. +Omit to leave unchanged. + +|`style` +|No +|Updated font style. Valid values: `NORMAL`, `ITALIC`, `OBLIQUE`. +Omit to leave unchanged. + +|`color` +|No +|Updated default color as a 6-digit hex string. Example: `#333333`. +Omit to leave unchanged. + +|===== + +Example API request:: Filter by name pattern +[source,cURL] ---- -POST /api/rest/2.0/customization/styles/fonts/delete +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/a1b2c3d4-e5f6-7890-abcd-ef1234567890/update' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "CLUSTER", + "name": "Acme Sans Revised", + "weight": "SEMI_BOLD", + "color": "#111111" + } -{ - "scope": "CLUSTER", - "font_identifiers": ["", ""], - "dry_run": true -} ---- -Example response: +==== Delete custom fonts +To delete one or more custom fonts from the font library send an API request to the `POST /api/rest/2.0/customization/styles/fonts/delete` endpoint. + +Request parameter:: +[cols="2,1,4"] +|===== +|Parameter|Required|Description + +|`scope` +|Yes +|Scope of the font library. Valid values: `CLUSTER`, `ORG`. + + +//// +|`org_identifier` +|Conditional +|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. +Defaults to the caller's active Org if omitted. +//// -[source,JSON] + +|`font_identifiers` +|Yes +|List of font GUIDs or display names to delete. +Duplicate values are deduplicated automatically. + +|`dry_run` +|No +|If `true`, returns the list of affected visualization assignments without deleting any fonts. When a font is deleted, all visualization areas that used it are automatically reset to the system default font. +Default: `true`. Set to `false` to commit the deletion. + +|===== +Example API request:: + +[source,cURL] ---- -{ - "affected_assignments": [ - { - "visualization_areas": ["CHART_LABEL", "CHART_AXIS"] - }, - { - "org": { "id": 3, "name": "Sales Org" }, - "visualization_areas": ["TABLE_HEADER"] - } - ] +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/delete' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "CLUSTER", + "font_identifiers": [ + "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "b2c3d4e5-f6a7-8901-bcde-f12345678901" + ], + "dry_run": true } ---- -To commit the deletion, repeat the request with `"dry_run": false`. +=== Logo export +To get the configured logos at the requested scope as a ZIP archive containing the default and wide logo images, send an API request to the `POST /api/rest/2.0/customization/styles/logos/export` endpoint. +Example API request:: -For a full list of REST API v2.0 style customization endpoints and their parameters, see xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. \ No newline at end of file +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/delete' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "scope": "CLUSTER" +} +---- \ No newline at end of file diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 7c9ecbe95..42687cb35 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -8,6 +8,59 @@ This changelog lists the features and enhancements introduced in REST API v2.0. For information about new features and enhancements available for embedded analytics, see xref:whats-new.adoc[What's New]. +== Version 26.7.0.cl, July 2026 + +=== Style customization APIs + +// SOURCE: SCAL-293070, SCAL-293071 + +ThoughtSpot introduces REST API v2.0 endpoints to manage style customization settings programmatically. + +Style configuration:: + +* `POST /api/rest/2.0/customization/styles/search` + +Returns the current style configuration at the `CLUSTER` or active `ORG` scope. + +* `POST /api/rest/2.0/customization/styles/update` + +Updates style settings at the `CLUSTER` or `ORG` scope. + +//// +Supports updating the navigation panel color, chart color palette, logos, embedded footer text, and visualization font assignments. +Use `operation: REPLACE` to overwrite existing settings, or `operation: MERGE` to apply only the fields specified in the request. +//// + +Custom fonts:: + +* `POST /api/rest/2.0/customization/styles/fonts/upload` + +Uploads a custom font file to ThoughtSpot. + +* `POST /api/rest/2.0/customization/styles/fonts/search` + +Returns custom fonts uploaded to the instance. +//Use the `include_font_assignments` parameter to include information about which visualization elements each font is assigned to. + +* `PUT /api/rest/2.0/customization/styles/fonts/{font_identifier}` + +Updates the display name, weight, style, or color of an existing custom font. + +* `POST /api/rest/2.0/customization/styles/fonts/delete` + +Deletes one or more custom fonts from the font library. + +//// +When a deleted font is assigned to visualization areas, those assignments are automatically reset to the system default font. +The response lists all affected assignments, grouped by Org. ++ +[IMPORTANT] +==== +The `dry_run` parameter defaults to `true`. In dry-run mode, the API returns the list of affected assignments but does *not* delete the fonts. Set `dry_run: false` to commit the deletion. +==== +//// + +Logo export:: + +* `POST /api/rest/2.0/customization/styles/logos/export` + +Exports the current logo files as a ZIP archive containing the default logo and the wide logo. + +For more information, see xref:style-customization.adoc[Customize UI layout and styles]. + == Version 26.6.0.cl, June 2026 === Spotter AI APIs diff --git a/modules/ROOT/pages/style-customization.adoc b/modules/ROOT/pages/style-customization.adoc index 2f59afd9b..6fd53a71e 100644 --- a/modules/ROOT/pages/style-customization.adoc +++ b/modules/ROOT/pages/style-customization.adoc @@ -20,6 +20,10 @@ You can customize key UI components, such as your application logo, favicon, fon Custom CSS changes take precedence and override the style customization settings applied via UI. ==== +Style customization through the REST APIs:: +You can manage style customization settings programmatically by using the ThoughtSpot REST APIs. +These endpoints expose all branding and theming controls available in the ThoughtSpot UI. For more information, see xref:xref:customize-style-api.adoc[Customize UI layout and styles through REST APIs] + Advanced style customization with custom CSS:: Custom CSS allows developers to override the default styles and UI element specifications in their deployments. Custom CSS provides granular control over the UI appearance and allows you to modify design elements such as buttons, labels, text styles, and typography. This feature is available only with the ThoughtSpot Embedded Edition license. + @@ -27,11 +31,6 @@ To customize themes and variables in the CSS file, developers must know the basi A xref:style-customization_tutorial.adoc[hands-on tutorial] is also available to learn how to test style customization capabilities using Visual Embed Playground. -Style customization through the REST APIs:: -You can manage style customization settings programmatically by using the ThoughtSpot REST APIs. -These endpoints expose all branding and theming controls available in the ThoughtSpot UI. For more information, see xref:xref:customize-style-api.adoc[Customize UI layout and styles through REST APIs] - - == Scope of customization The following table lists the customizable elements: diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 6320f0913..a2d067bac 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -23,6 +23,25 @@ This page lists new features, enhancements, and deprecated functionality introdu // *Affects:* Developers, Administrators, End Users // ============================================================ +== July 2026 + +**Release version**: ThoughtSpot Cloud 26.7.0.cl + +*Upgrade notes*: No breaking changes. + +*Recommended SDK versions*: Visual Embed SDK v1.50.0 and later + +[.cl-table, cols="2,4", frame=none, grid=none] +|===== +a| +[.cl-label] +*Version 26.7.0.cl* + +[discrete] +==== REST API v2 +This release introduces new API endpoints for style customization. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. +--- + +|===== + == June 2026 **Release version**: ThoughtSpot Cloud 26.6.0.cl + From 942306f9428da4ec548656cccd0142b9e6324f06 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 17 Jun 2026 11:04:57 +0530 Subject: [PATCH 027/136] curly apostrophe issue fix --- src/components/Seo/index.tsx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/Seo/index.tsx b/src/components/Seo/index.tsx index 5143f0e12..09d42f530 100644 --- a/src/components/Seo/index.tsx +++ b/src/components/Seo/index.tsx @@ -1,5 +1,4 @@ import React, { FC } from 'react'; -import { Helmet } from 'react-helmet'; import { useSiteMetadata } from './useSiteMetadataHook'; type SeoProps = { @@ -9,6 +8,20 @@ type SeoProps = { children?: React.ReactNode; }; +// Asciidoctor converts typographic characters to HTML entities (e.g. ' → ’). +// React escapes & in text nodes, so entities double-encode and show literally in the tab. +const decodeHtmlEntities = (str: string): string => + str + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(Number(code))) + .replace(/&#x([0-9a-fA-F]+);/g, (_, hex) => + String.fromCharCode(parseInt(hex, 16)), + ) + .replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/"/g, '"') + .replace(/'/g, "'"); + export const Seo: FC = ({ title, description, @@ -23,7 +36,7 @@ export const Seo: FC = ({ } = useSiteMetadata(); const seo = { - title: title || defaultTitle, + title: decodeHtmlEntities(title || defaultTitle), description: description || defaultDescription, image: `${siteUrl}${image}`, url: `${siteUrl}${pathname || ''}`, From 3f0a7c78c992b8909efdce26146086b58d9e5a63 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 17 Jun 2026 11:04:57 +0530 Subject: [PATCH 028/136] curly apostrophe issue fix --- src/components/Seo/index.tsx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/Seo/index.tsx b/src/components/Seo/index.tsx index 5143f0e12..09d42f530 100644 --- a/src/components/Seo/index.tsx +++ b/src/components/Seo/index.tsx @@ -1,5 +1,4 @@ import React, { FC } from 'react'; -import { Helmet } from 'react-helmet'; import { useSiteMetadata } from './useSiteMetadataHook'; type SeoProps = { @@ -9,6 +8,20 @@ type SeoProps = { children?: React.ReactNode; }; +// Asciidoctor converts typographic characters to HTML entities (e.g. ' → ’). +// React escapes & in text nodes, so entities double-encode and show literally in the tab. +const decodeHtmlEntities = (str: string): string => + str + .replace(/&#(\d+);/g, (_, code) => String.fromCharCode(Number(code))) + .replace(/&#x([0-9a-fA-F]+);/g, (_, hex) => + String.fromCharCode(parseInt(hex, 16)), + ) + .replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/"/g, '"') + .replace(/'/g, "'"); + export const Seo: FC = ({ title, description, @@ -23,7 +36,7 @@ export const Seo: FC = ({ } = useSiteMetadata(); const seo = { - title: title || defaultTitle, + title: decodeHtmlEntities(title || defaultTitle), description: description || defaultDescription, image: `${siteUrl}${image}`, url: `${siteUrl}${pathname || ''}`, From c9217f369bfdbc77c4bfce210cfb2cc2f87cf67f Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 17 Jun 2026 11:42:44 +0530 Subject: [PATCH 029/136] nav edits --- modules/ROOT/pages/common/nav-embedding.adoc | 1 - modules/ROOT/pages/common/nav-rest-api.adoc | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc index a09b4ca96..c5a64bbb4 100644 --- a/modules/ROOT/pages/common/nav-embedding.adoc +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -46,7 +46,6 @@ Customize and integrate * link:{{navprefix}}/style-customization[Customize UI layout and styles] ** link:{{navprefix}}/customize-style[Customize basic styles] -** link:{{navprefix}}/style-customization-apis[Customize styles through APIs] ** link:{{navprefix}}/custom-css[CSS customization framework] ** link:{{navprefix}}/theme-builder-doc[Theme builder] ** link:{{navprefix}}/customize-icons[Customize icons] diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index a9fec3165..7f2eb985e 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -24,6 +24,7 @@ REST APIs *** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] *** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] *** link:{{navprefix}}/spotter-coaching-apis[Spotter coaching APIs ^BETA^] +** link:{{navprefix}}/style-customization-apis[Customize styles using APIs] ** link:{{navprefix}}/audit-logs[Audit logs] ** link:{{navprefix}}/tml[TML] ** link:{{navprefix}}/collections[Collections ^BETA^] From 20b9dcd4615a0b24a99c3f04f75a3159840d5b99 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 17 Jun 2026 11:47:39 +0530 Subject: [PATCH 030/136] commented text in tables --- modules/ROOT/pages/customize-style-api.adoc | 33 +++++++++++---------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc index dc7a6bf18..ce56b295a 100644 --- a/modules/ROOT/pages/customize-style-api.adoc +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -163,14 +163,6 @@ Request parameter:: |Scope of the font library. Valid values: `CLUSTER`, `ORG`. -//// -|`org_identifier` -|Conditional -|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. -Defaults to the caller's active Org if omitted. -//// - - |`font_identifier` |No |Filter by exact font GUID or exact display name (case-insensitive). @@ -188,6 +180,14 @@ Default: `false`. |===== +//// +|`org_identifier` +|Conditional +|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. +Defaults to the caller's active Org if omitted. +//// + + Example API request:: Return all fonts with their visualization assignments @@ -287,14 +287,6 @@ Request parameter:: |Scope of the font library. Valid values: `CLUSTER`, `ORG`. -//// -|`org_identifier` -|Conditional -|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. -Defaults to the caller's active Org if omitted. -//// - - |`font_identifiers` |Yes |List of font GUIDs or display names to delete. @@ -306,6 +298,15 @@ Duplicate values are deduplicated automatically. Default: `true`. Set to `false` to commit the deletion. |===== + +//// +|`org_identifier` +|Conditional +|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. +Defaults to the caller's active Org if omitted. +//// + + Example API request:: [source,cURL] From f075e064213ebf66190cb1865adebc8e52e25759 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 17 Jun 2026 12:51:44 +0530 Subject: [PATCH 031/136] table issue fix --- modules/ROOT/pages/whats-new.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index a2d067bac..b18e195b1 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -35,9 +35,11 @@ a| [.cl-label] *Version 26.7.0.cl* +a| [discrete] ==== REST API v2 This release introduces new API endpoints for style customization. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + --- |===== From 331ff9b86af808a59acdb18a9af4436c579be2f3 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Wed, 17 Jun 2026 13:50:59 +0530 Subject: [PATCH 032/136] edits to style apis --- modules/ROOT/pages/common/nav-rest-api.adoc | 2 +- modules/ROOT/pages/customize-style-api.adoc | 27 +++++++++------------ 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index 7f2eb985e..a0220ffb6 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -24,7 +24,7 @@ REST APIs *** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] *** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] *** link:{{navprefix}}/spotter-coaching-apis[Spotter coaching APIs ^BETA^] -** link:{{navprefix}}/style-customization-apis[Customize styles using APIs] +** link:{{navprefix}}/style-customization-apis[Style customization APIs] ** link:{{navprefix}}/audit-logs[Audit logs] ** link:{{navprefix}}/tml[TML] ** link:{{navprefix}}/collections[Collections ^BETA^] diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc index ce56b295a..80c485cf3 100644 --- a/modules/ROOT/pages/customize-style-api.adoc +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -1,4 +1,4 @@ -= Customize UI layout and styles through REST APIs += Style customization APIs :toc: true :toclevels: 2 @@ -8,7 +8,6 @@ // SOURCE: SCAL-293070, SCAL-293071 -//[earlyAccess eaBackground]#Early Access# ThoughtSpot provides REST API v2.0 endpoints to manage style customization settings programmatically. These APIs expose the same branding and theming controls available in the *Develop* > *Customizations* > *Styles* page, enabling you to automate branding and white-labeling — including across multiple Orgs — without logging in to the ThoughtSpot UI. @@ -27,6 +26,7 @@ When called from the Primary Org (Org 0), the response returns one record with ` ==== Update style configuration To update the style settings send an API request to `POST /api/rest/2.0/customization/styles/update` endpoint. + Request parameters:: [cols="2,1,4"] @@ -44,7 +44,7 @@ Request parameters:: |`reset_options`|No|Resets specified settings to ThoughtSpot defaults. |===== -Example request:: To set a custom navigation panel color at cluster scope +Example API request:: To set a custom navigation panel color at cluster scope [source,cURL] @@ -64,7 +64,7 @@ curl -X POST \ } ---- -Example request:: To update chart color palette for a specific Org (MERGE) +Example API request:: To update chart color palette for a specific Org (MERGE) [source,cURL] ---- @@ -104,16 +104,6 @@ Request parameters:: |===== |Parameter|Required|Description -|`scope` -|No -|Scope of the font library. Valid values: `CLUSTER`, `ORG`. -Defaults to `ORG` when Orgs are enabled; defaults to `CLUSTER` when Orgs are disabled. - -|`org_identifier` -|Conditional -|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. -Defaults to the currently logged-in user's Org if omitted. - |`name` |Yes |Display name for the font. Must be unique within the target scope. @@ -122,6 +112,11 @@ Defaults to the currently logged-in user's Org if omitted. |Yes |Binary font file. Accepted formats: WOFF and WOFF2 only. +|`scope` +|No +|Scope of the font library. Valid values: `CLUSTER`, `ORG`. +Defaults to `ORG` when Orgs are enabled; defaults to `CLUSTER` when Orgs are disabled. + |`weight` |No |Font weight. Valid values: `NORMAL`, `LIGHT`, `BOLD`. @@ -136,7 +131,7 @@ Defaults to the currently logged-in user's Org if omitted. |===== -Example Request:: +Example API request:: [source,cURL] ---- curl -X POST 'https://{your-thoughtspot-host}/api/rest/2.0/customization/styles/fonts/upload' \ @@ -334,7 +329,7 @@ Example API request:: [source,cURL] ---- curl -X POST \ - --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/delete' \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/logos/export' \ -H 'Authorization: Bearer {access-token}'\ -H 'Accept: application/json'\ -H 'Content-Type: application/json' \ From ab2e87fcc3b9e3226df9ef1409d3ee7e3d9774c4 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Wed, 17 Jun 2026 14:21:09 +0530 Subject: [PATCH 033/136] edits to style apis1 --- modules/ROOT/pages/customize-style-api.adoc | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc index 80c485cf3..1298a6028 100644 --- a/modules/ROOT/pages/customize-style-api.adoc +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -21,7 +21,7 @@ All style customization API endpoints require administrator or developer privile Use the following endpoints to search and update style settings at the cluster or Org scope. ==== Search style configuration -To get the current style configuration for the cluster and the active Org send an API request to `POST /api/rest/2.0/customization/styles/search` endpoint. +To get the current style configuration for the cluster and the active Org send an API request to `POST /api/rest/2.0/customization/styles/search` endpoint. When called from the Primary Org (Org 0), the response returns one record with `"scope": "CLUSTER"` and one with `"scope": "ORG"`. ==== Update style configuration @@ -64,7 +64,7 @@ curl -X POST \ } ---- -Example API request:: To update chart color palette for a specific Org (MERGE) +Example API request:: To update chart color palette for a specific Org (REPLACE) [source,cURL] ---- @@ -134,7 +134,7 @@ Defaults to `ORG` when Orgs are enabled; defaults to `CLUSTER` when Orgs are dis Example API request:: [source,cURL] ---- -curl -X POST 'https://{your-thoughtspot-host}/api/rest/2.0/customization/styles/fonts/upload' \ +curl -X POST 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/upload' \ -H 'Authorization: Bearer {token}' \ -H 'Accept: application/json' \ -F 'name=Acme Sans' \ @@ -145,7 +145,7 @@ curl -X POST 'https://{your-thoughtspot-host}/api/rest/2.0/customization/styles/ ---- -==== Search style fonts +==== Search custom fonts To get custom fonts uploaded to the instance or the Org, send an API request to the `POST /api/rest/2.0/customization/styles/fonts/search` endpoint. Request parameter:: @@ -252,7 +252,8 @@ Omit to leave unchanged. |===== -Example API request:: Filter by name pattern +Example API request:: + [source,cURL] ---- curl -X POST \ @@ -263,7 +264,7 @@ curl -X POST \ --data-raw '{ "scope": "CLUSTER", "name": "Acme Sans Revised", - "weight": "SEMI_BOLD", + "weight": "BOLD", "color": "#111111" } @@ -289,8 +290,8 @@ Duplicate values are deduplicated automatically. |`dry_run` |No -|If `true`, returns the list of affected visualization assignments without deleting any fonts. When a font is deleted, all visualization areas that used it are automatically reset to the system default font. -Default: `true`. Set to `false` to commit the deletion. +|If `true`, returns the list of affected visualization assignments without deleting any fonts. When a font is deleted, all visualization areas that used it are automatically reset to the system default font. Set to `false` to commit the deletion. +Default: `true`. |===== From 1fe798d1863a533a322201e6a81e3b64f09fcde7 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Wed, 17 Jun 2026 14:35:54 +0530 Subject: [PATCH 034/136] edits to changelog --- modules/ROOT/pages/rest-apiv2-changelog.adoc | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 42687cb35..c3208d880 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -38,28 +38,19 @@ Uploads a custom font file to ThoughtSpot. Returns custom fonts uploaded to the instance. //Use the `include_font_assignments` parameter to include information about which visualization elements each font is assigned to. -* `PUT /api/rest/2.0/customization/styles/fonts/{font_identifier}` + +* `PUT /api/rest/2.0/customization/styles/fonts/{font_identifier}/update` + Updates the display name, weight, style, or color of an existing custom font. * `POST /api/rest/2.0/customization/styles/fonts/delete` + Deletes one or more custom fonts from the font library. -//// -When a deleted font is assigned to visualization areas, those assignments are automatically reset to the system default font. -The response lists all affected assignments, grouped by Org. -+ -[IMPORTANT] -==== -The `dry_run` parameter defaults to `true`. In dry-run mode, the API returns the list of affected assignments but does *not* delete the fonts. Set `dry_run: false` to commit the deletion. -==== -//// Logo export:: * `POST /api/rest/2.0/customization/styles/logos/export` + Exports the current logo files as a ZIP archive containing the default logo and the wide logo. -For more information, see xref:style-customization.adoc[Customize UI layout and styles]. +For more information, see xref:customize-style-api.adoc[Style customization APIs]. == Version 26.6.0.cl, June 2026 From 0fc6ee6cc12e95c66bea1a486d46de9dee288e7d Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Thu, 18 Jun 2026 12:29:56 +0530 Subject: [PATCH 035/136] Restore doc --- modules/ROOT/pages/3rd-party-script.adoc | 72 ++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 modules/ROOT/pages/3rd-party-script.adoc diff --git a/modules/ROOT/pages/3rd-party-script.adoc b/modules/ROOT/pages/3rd-party-script.adoc new file mode 100644 index 000000000..a978ada50 --- /dev/null +++ b/modules/ROOT/pages/3rd-party-script.adoc @@ -0,0 +1,72 @@ += External tools and script integration +:toc: true +:toclevels: 2 + +:page-title: Integrate external tools and allow scripts +:page-pageid: external-tool-script-integration +:page-description: Security settings for embedding + +ThoughtSpot supports integrating third-party apps such as Mixpanel, Pendo, LogRocket, and more in your embed. If you are using third-party tools to track usage, trace, log, or onboard your application users, you can seamlessly integrate these tools with ThoughtSpot embed and add custom JavaScript. This feature is disabled by default on ThoughtSpot instances. To enable this feature, contact ThoughtSpot Support. + +[IMPORTANT] +==== +While ThoughtSpot allows the injection of custom JavaScript, it is important to be aware of the associated security risks, particularly Cross-Site Scripting (XSS). XSS is a vulnerability that can enable malicious actors to inject and execute unauthorized scripts within a trusted environment. This can lead to data breaches, unauthorized access to user sessions, and compromised system integrity. ThoughtSpot strongly recommends reviewing security guidelines before activating this feature in your instances and exercising caution when integrating third-party tools into your embedded application. +==== + +== Security considerations + +Before requesting ThoughtSpot Support to enable this feature on your instance, do the following: + +* Review the security risks associated with custom-hosted scripts and understand the potential consequences of XSS attacks. +* Implement security controls and measures to validate hosted scripts and mitigate potential vulnerabilities. + +== Feature enablement + +Enabling third-party tools on embed involves two steps: + +. Request for feature activation and provide the script details to ThoughtSpot Support +. Adding the script sources to the CSP allowlist + +=== Request for feature enablement + +Create a ThoughtSpot Support ticket to enable the feature on your instance. In your request, specify the domain URLs that will host the scripts in your embedding environment. + +Wait for ThoughtSpot Support to validate and approve, and then add the domain that hosts the script to the CSP allowlist on your instance. This step will ensure that only the trusted and vetted domains are allowed to run scripts in your application environment. + +=== Add script source to CSP allowlist +After the script hosting URL is approved and configured by ThoughtSpot Support, you must add the JavaScript hosting domain to the CSP allowlist. This step requires administration privileges, so make sure you log in to ThoughtSpot with your administrator credentials. + +. In your ThoughtSpot application, navigate to *Develop* > *Customizations* > *Security Settings*. +. If your instance has the Orgs feature enabled, ensure that you are in the *All Orgs* context. +. On the *Security Settings* page, click *Edit* and turn on the *CSP script-src domains* toggle switch. ++ +[.widthAuto] +[.bordered] +image::./images/csp-script-domain.png[CSS script-src domain] +. Add the script hosting domain. +. Click *Save changes*. + +[NOTE] +==== +* The *CSP script-src domains* section is visible to users with administrative privileges only if the third-party integration feature is enabled on your instance. +* The *CSP script-src domains* cannot be enabled and configured at the Org level. When configured, this setting will apply to all the Orgs configured on your instance. +==== + +=== Allow Websocket endpoints +If your tool uses WebSockets, add the tool’s `wss://` endpoint to the CSP and CORS allowlists in ThoughtSpot. This enables secure WebSocket connections from an embedded ThoughtSpot page to the tool's WebSocket endpoint without being blocked by the browser’s Content Security Policy. + +Only hosts explicitly listed with `wss://` are permitted. You can add `wss://` URL in the **Develop** > **Security Settings** page. + +== Passing variables to the hosted script + +To pass variables to the customer's hosted script, Visual Embed SDK provides the `customVariablesForThirdPartyTools` parameter. The `customVariablesForThirdPartyTools` is an object containing the variables that you wish to pass to the customer’s hosted JavaScript. These may include private information such as credentials or keys. The hosted JavaScript will access these variables via the `window.tsEmbed` object. + +Developers can define this parameter in the **init()** function as shown in the following example. Once initialized, the JavaScript will run after the authentication is successfully completed in the ThoughtSpot Embed App. + +[source,JavaScript] +---- +init({ + //... + customVariablesForThirdPartyTools: { cloud: "123Basic" } +}); +---- From 5e64c87d8ff6b641665e9662db30267b99a4c99e Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Thu, 18 Jun 2026 14:32:25 +0530 Subject: [PATCH 036/136] feedback edit --- modules/ROOT/pages/customize-style-api.adoc | 132 +++++++++++++++----- 1 file changed, 104 insertions(+), 28 deletions(-) diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc index 1298a6028..7bb6dc561 100644 --- a/modules/ROOT/pages/customize-style-api.adoc +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -35,13 +35,13 @@ Request parameters:: |`scope`|Yes|`CLUSTER` or `ORG`. //|`org_identifier`|Conditional|Required when `scope` is `ORG`. |`operation`|Yes|`REPLACE` overwrites existing settings. `RESET` reverts specific fields to defaults. -|`navigation_panel`|No|Top navigation panel color. Use `"theme": "CUSTOM"` with a valid hex value in `"base_color"`. -|`chart_color_palette`|No|Array of hex color values for charts. When provided with `REPLACE`, exactly 8 color entries must be specified in colors. +|`navigation_panel`|No|Top navigation panel color. Can be `DARK`, `TWO_TONE` or `CUSTOM`. A valid hex value for `base_color` is needed only when `theme` is `CUSTOM`. +|`chart_color_palette`|No|Array of hex color values for charts. When provided with `REPLACE`, exactly 8 `primary` color entries must be specified in colors. `secondary` color entries, if provided, should be exactly 4 in number. If `secondary` shades are omitted, the server auto-generates 4 shades from the primary color. |`embedded_footer_text`|No|Footer text for embedded content. |`visualization_fonts`|No|Font assignments for visualization elements. Provide only the areas to update; omitted areas remain unchanged. -|`default_logo`|No|Binary image file for the square application logo. +|`default_logo`|No|Binary image file for the square application logo. Allowed formats are PNG, JPG, and JPEG only. |`wide_logo`|No|Binary image file for the wide logo (email and PDF exports). -|`reset_options`|No|Resets specified settings to ThoughtSpot defaults. +|`reset_options`|No|Resets specified settings to ThoughtSpot defaults. Used when `operation` is `RESET`. |===== Example API request:: To set a custom navigation panel color at cluster scope @@ -75,24 +75,47 @@ curl -X POST \ -H 'Content-Type: application/json' \ --data-raw '{ "scope": "ORG", - "org_identifier": "Sales Org", "operation": "REPLACE", - "chart_color_palette": { - "colors": [ - {"color": "#FF6B35"}, - {"color": "#004E89"}, - {"color": "#1A936F"}, - {"color": "#C6D8D3"}, - {"color": "#F18F01"}, - {"color": "#8B4513"}, - {"color": "#6A0572"}, - {"color": "#2E8B57"} - ], - "disable_color_rotation": false - } -} + -F 'embedded_footer_text=Test%20footer%20text' \ + -F 'chart_color_palette={ + "colors":[ + {"primary":"#9F2B68", + "secondary":["#00FFFF","#00FFFF","#00FFFF","#FF0000"]}, + {"primary":"#FF0080"}, + {"primary":"#FF8000"}, + {"primary":"#FF0000"}, + {"primary":"#FFFF00"}, + {"primary":"#00FF80"}, + {"primary":"#FF00FF"}, + {"primary":"#2359B6"}], + "disable_color_rotation":false}' \ + -F 'visualization_fonts={ + "chart_visualization_fonts":[{"visualization_area":"CHART_X_AXIS_LABELS","font_identifier":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}], + "table_visualization_fonts":[{"visualization_area":"TABLE_VALUE_CELLS","font_identifier":"Acme Sans"}], + "advanced_chart_visualization_fonts":[{"visualization_area":"ADVANCED_CHART_LABELS","font_identifier":"Acme Sans"}] + }' + } ---- +Example API request:: To reset style options at the org level + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/update' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + -F 'scope=ORG' \ + -F 'operation=RESET' \ + -F 'reset_options={"style":["CHART_COLOR_PALETTE"],"visualization_areas":["CHART_X_AXIS_LABELS"]}' + } +---- + +API response:: +If the API request is successful, ThoughtSpot returns a 200 or 204 success code. + === Custom fonts ==== Upload a custom font @@ -137,13 +160,28 @@ Example API request:: curl -X POST 'https://{ThoughtSpot-Host}/api/rest/2.0/customization/styles/fonts/upload' \ -H 'Authorization: Bearer {token}' \ -H 'Accept: application/json' \ +-H 'Accept: application/json'\ +-H 'Content-Type: application/json' \ +--data-raw '{ -F 'name=Acme Sans' \ +-F 'file_content=@/path/to/acme-sans-bold.woff2' +-F 'scope=ORG' \ -F 'weight=BOLD' \ -F 'style=NORMAL' \ -F 'color=#333333' \ --F 'file_content=@/path/to/acme-sans-bold.woff2' +} ---- +API response:: +If the API request is successful, ThoughtSpot returns the details of the uploaded font. + +[source,JSON] +---- +{ +"id": "c3d4e5f6-1111-1111-1111-111111111111", +"name": "Acme Sans" +} +---- ==== Search custom fonts To get custom fonts uploaded to the instance or the Org, send an API request to the `POST /api/rest/2.0/customization/styles/fonts/search` endpoint. @@ -175,14 +213,6 @@ Default: `false`. |===== -//// -|`org_identifier` -|Conditional -|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. -Defaults to the caller's active Org if omitted. -//// - - Example API request:: Return all fonts with their visualization assignments @@ -198,6 +228,7 @@ curl -X POST \ "include_font_assignments": true } ---- + Example API request:: Filter by name pattern [source,cURL] ---- @@ -214,6 +245,50 @@ curl -X POST \ } ---- +API response:: +If the API request is successful, ThoughtSpot returns the font and its assignment details. + +[source,JSON] +---- +[ + { + "id": "c3d4e5f6-1111-1111-1111-111111111111", + "scope": "ORG", + "org": { + "id": 1234567890, + "name": "Sales" + }, + "name": "Acme Sans", + "weight": "NORMAL", + "style": "NORMAL", + "color": "#333333", + "creation_time_in_millis": 1714000000000, + "assignments": [ + { + "org": { + "id": 1234567890, + "name": "Sales" + }, + "visualization_areas": [ + "CHART_X_AXIS_LABELS", + "CHART_Y_AXIS_LABELS" + ] + } + ] + }, + { + "id": "d4e5f6a7-2222-2222-2222-222222222222", + "scope": "CLUSTER", + "name": "Corporate Bold", + "weight": "BOLD", + "style": "NORMAL", + "color": "#000000", + "creation_time_in_millis": 1713500000000, + "assignments": [] + } +] +---- + ==== Update a custom font To update an existing font's display name, weight, style, or color send an API request to the `POST /api/rest/2.0/customization/styles/fonts/{font_identifier}/update` endpoint. @@ -324,6 +399,7 @@ curl -X POST \ === Logo export To get the configured logos at the requested scope as a ZIP archive containing the default and wide logo images, send an API request to the `POST /api/rest/2.0/customization/styles/logos/export` endpoint. +If no custom logo is configured for the Org, the system falls back to the cluster logo. If a cluster logo is also unavailable, the endpoint returns an empty response with a `200 OK` status. Example API request:: From 99de1d773b709e2655fb7b2f5d9e7c13d819fad5 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Thu, 18 Jun 2026 14:46:20 +0530 Subject: [PATCH 037/136] edits --- modules/ROOT/pages/common/nav-embedding.adoc | 1 + modules/ROOT/pages/common/nav-tutorials.adoc | 29 -------------------- 2 files changed, 1 insertion(+), 29 deletions(-) delete mode 100644 modules/ROOT/pages/common/nav-tutorials.adoc diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc index c5a64bbb4..fc6cdc283 100644 --- a/modules/ROOT/pages/common/nav-embedding.adoc +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -138,6 +138,7 @@ Embedding tutorials ** link:{{navprefix}}/tutorials/react-components/lesson-02[02 - ThoughtSpot component pages] ** link:{{navprefix}}/tutorials/react-components/lesson-03[03 - Menus and navigation elements] ** link:{{navprefix}}/tutorials/react-components/lesson-04[04 - Event handling] +* link:{{navprefix}}/tutorials/spotter/integrate-into-chatbot[Integrate Spotter into your Chatbot] [.sidebar-title] diff --git a/modules/ROOT/pages/common/nav-tutorials.adoc b/modules/ROOT/pages/common/nav-tutorials.adoc deleted file mode 100644 index b7933f53d..000000000 --- a/modules/ROOT/pages/common/nav-tutorials.adoc +++ /dev/null @@ -1,29 +0,0 @@ - -:page-pageid: nav-tutorials -:page-description: Tutorials navigation - -[navSection] - -* link:{{navprefix}}/tutorials/tutorials-overview[Tutorials] -** link:{{navprefix}}/tutorials/tse-fundamentals/intro[Embedding Fundamentals] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-01[01 - Overview] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-02[02 - Set up for course] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-03[03 - Security setup] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-04[04 - Start coding] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-05[05 - Embed Search] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-06[06 - Embed Natural Language Search] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-07[07 - Embed Liveboard] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-08[08 - Embed Visualization] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-09[09 - Embed full application] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-10[10 - Style embedded app] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-11[11 - Course summary] -** link:{{navprefix}}/tutorials/style-customization/tutorial[Style customization] -** link:{{navprefix}}/tutorials/react-components/intro[React components] -*** link:{{navprefix}}/tutorials/react-components/lesson-01[01 - Initialize Visual Embed SDK] -*** link:{{navprefix}}/tutorials/react-components/lesson-02[02 - ThoughtSpot component pages] -*** link:{{navprefix}}/tutorials/react-components/lesson-03[03 - Menus and navigation elements] -*** link:{{navprefix}}/tutorials/react-components/lesson-04[04 - Event handling] - -*** link:{{navprefix}}/tutorials/rest-api/lesson-04[04 - Event handling] -** Spotter -*** link:{{navprefix}}/tutorials/spotter/integrate-into-chatbot[Integrate Spotter into your Chatbot] From 29b978f4bd4c71776280b9ed5872682bb762b971 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Thu, 18 Jun 2026 16:05:25 +0530 Subject: [PATCH 038/136] spotter-coaching terminology udpate --- modules/ROOT/pages/api-changelog.adoc | 13 +++++---- modules/ROOT/pages/common/nav-rest-api.adoc | 2 +- modules/ROOT/pages/rest-apiv2-changelog.adoc | 7 +++-- .../pages/spotter-agent-instructions.adoc | 4 +-- .../ROOT/pages/spotter-nl-instructions.adoc | 28 ++++++++++--------- modules/ROOT/pages/whats-new.adoc | 2 +- 6 files changed, 30 insertions(+), 26 deletions(-) diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index 0c0a75e58..0b682e3ed 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -328,13 +328,13 @@ For more information, see xref:embed-spotter.adoc[Embedding Spotter] and xref:em Events:: -* `EmbedEvent.AddToCoaching` for the *Add to coaching* workflow in a Spotter conversation session -* `HostEvent.AddToCoaching` to trigger the *Add to coaching* action in a Spotter conversation session. +* `EmbedEvent.AddToCoaching` for the *Add to Coaching* workflow in a Spotter conversation session +* `HostEvent.AddToCoaching` to trigger the *Add to Coaching* action in a Spotter conversation session. * `HostEvent.StartNewSpotterConversation` to trigger the action to start a new chat session with Spotter. [NOTE] ==== -On Spotter embed deployments running version 26.2.0.cl or later, the *Add to Coaching* feature is enabled by default. To disable or hide the **Add to Coaching** button, use the xref:Action.adoc#_inconversationtraining[InConversationTraining] action ID. +On Spotter embed deployments running version 26.2.0.cl or later, the *Add to Coaching* feature is enabled by default. To disable or hide the *Add to Coaching* button, use the xref:Action.adoc#_inconversationtraining[InConversationTraining] action ID. ==== |[tag greenBackground]#NEW FEATURE# a| **Liveboard experience enhancements** + @@ -596,11 +596,12 @@ Replaced with `SpotterAgentEmbed` Replaced with `SpotterAgentEmbedViewConfig` The deprecated components with old names in the existing Spotter embed implementations will continue to function until further notice. For code samples with new component names, see xref:embed-spotter.adoc[Spotter embed documentation]. -|[tag greenBackground]#NEW FEATURE# a| *Action ID of Spotter coaching* + -For ThoughtSpot instances that have the new Spotter feedback and coaching workflow enabled, SDK provides the action ID `Action.InConversationTraining` to manage the visibility of the *Add to coaching* button on Answer generated from Spotter prompts. + +|[tag greenBackground]#NEW FEATURE# a| *Action ID for Spotter in-conversation training* + +For ThoughtSpot instances that have the new Spotter in-conversation training workflow enabled, the SDK provides the action ID `Action.InConversationTraining` to manage the visibility of the *Add to Coaching* button on Answers generated from Spotter prompts. [NOTE] -The **Add to Coaching** feature is currently in beta and is turned off by default on embed deployments. To enable this feature on your instance, contact ThoughtSpot Support. +The *Add to Coaching* feature is currently in beta and is turned off by default on embed deployments. To enable this feature on your instance, contact ThoughtSpot Support. |[tag greenBackground]#NEW FEATURE# a|*Events support for Spotter embed* diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index d492ee863..e93dd9a77 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -22,7 +22,7 @@ REST APIs * link:{{navprefix}}/spotter-api[Spotter APIs] ** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] ** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] -** link:{{navprefix}}/spotter-coaching-apis[Spotter coaching APIs ^BETA^] +** link:{{navprefix}}/spotter-nl-instructions[Spotter instructions APIs ^BETA^] * link:{{navprefix}}/audit-logs[Audit logs] * link:{{navprefix}}/tml[TML] * link:{{navprefix}}/collections[Collections ^BETA^] diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 7c9ecbe95..c04b28c97 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -241,11 +241,12 @@ Allows modifying storage configuration for a webhook. Retrieves storage configuration details. === Object privilege APIs -Administrators and users with edit access to data models can now use `/api/rest/2.0/security/metadata/manage-object-privilege` to assign object-level permissions to users and groups and allow access to Spotter coaching information. +Administrators and users with edit access to data models can now use `/api/rest/2.0/security/metadata/manage-object-privilege` to assign object-level permissions to users and groups and control access to Spotter data model instructions. To fetch object privileges for a data model, user, or group, use the `/api/rest/2.0/security/metadata/fetch-object-privileges` API endpoint. -For more information, see xref:spotter-apis.adoc#_spotter_coaching_access[Spotter coaching access]. +For more information, see xref:spotter-nl-instructions.adoc#_spotter_data_model_instructions_access[Spotter data model instructions access]. + === User API enhancements @@ -321,7 +322,7 @@ The `include_variable_values` parameter in the API request allows including vari This release introduces the following Spotter APIs: * `POST /api/rest/2.0/ai/instructions/set` + -Allows configuring natural language (NL) instructions on a model to coach Spotter on how to interpret queries, handle data nuances, and improve responses. +Allows configuring natural language (NL) instructions on a data model to define how Spotter interprets queries, handles data nuances, and improves responses. * `POST /api/rest/2.0/ai/instructions/get` + Gets NL instructions that are currently assigned to a model. * `POST /api/rest/2.0/ai/data-source-suggestions` + diff --git a/modules/ROOT/pages/spotter-agent-instructions.adoc b/modules/ROOT/pages/spotter-agent-instructions.adoc index 09b16adc5..6b5deff35 100644 --- a/modules/ROOT/pages/spotter-agent-instructions.adoc +++ b/modules/ROOT/pages/spotter-agent-instructions.adoc @@ -8,7 +8,7 @@ Administrators and developers can configure persistent behavioral instructions for the Spotter agent using the agent instructions APIs. These instructions guide how Spotter responds within a conversation context. For example, to focus on specific business domains, enforce response formats, or apply analytical constraints. -Unlike xref:spotter-nl-instructions.adoc[NL coaching instructions], which operate at the data model level, agent instructions operate at the agent level and do not require a data source identifier. +Unlike xref:spotter-nl-instructions.adoc[data model instructions], which operate at the data model level, agent instructions operate at the agent level and do not require a data source identifier. [NOTE] ==== @@ -126,7 +126,7 @@ If no instructions are configured, ThoughtSpot returns an empty value for the `i == Related resources -* For information about coaching Spotter at the data model level, see xref:spotter-nl-instructions.adoc[Spotter coaching APIs]. +* For information about adding instructions at the data model level, see xref:spotter-nl-instructions.adoc[Data model instruction APIs]. * For information about Spotter agent conversation workflows, see xref:spotter-agent-apis.adoc[AI APIs (Spotter Agent and Spotter 3)]. * Visit the +++REST API v2.0 Playground+++ to test the set agent instructions endpoint. * Visit the +++REST API v2.0 Playground+++ to test the get agent instructions endpoint. diff --git a/modules/ROOT/pages/spotter-nl-instructions.adoc b/modules/ROOT/pages/spotter-nl-instructions.adoc index 54c9a2de4..950db8d4b 100644 --- a/modules/ROOT/pages/spotter-nl-instructions.adoc +++ b/modules/ROOT/pages/spotter-nl-instructions.adoc @@ -1,15 +1,15 @@ -= Spotter instructions API += Data model instructions API :toc: true :toclevels: 2 -:page-title: Spotter APIs -:page-pageid: spotter-coaching-apis -:page-description: You can use Spotter REST APIs to receive Answers for your analytical queries sent through the conversational experience with ThoughtSpot. +:page-title: Data model instructions APIs +:page-pageid: spotter-nl-instructions +:page-description: Use the data model instructions APIs to set and retrieve natural language instructions at the data model level to guide how Spotter interprets and answers user queries. -Administrators and data owners can guide and refine how Spotter interprets and answers user questions. The natural language (NL) instructions API allows you to set instructions at the data model level. The API provides business context and preferred interpretations for specific queries or terminology to coach Spotter, but it does not train or change the underlying LLM. +Administrators and data owners can guide and refine how Spotter interprets and answers user questions. The natural language (NL) instructions API allows you to set instructions at the data model level. The API provides business context and preferred interpretations for specific queries or terminology, but it does not train or change the underlying LLM. == Set NL instructions -To coach and instruct the Spotter system on how to interpret queries, apply filters, select columns, handle data nuances, and present answers using the data from a specific model, you can set global rules in natural language format. Setting instructions helps Spotter generate precise and consistent responses for user queries. +To define how Spotter interprets queries, applies filters, selects columns, handles data nuances, and presents answers using the data from a specific model, you can set global rules in natural language format. Setting data model instructions helps Spotter generate precise and consistent responses for user queries. To set instructions for a Model, send a `POST` request to the `/api/rest/2.0/ai/instructions/set` API endpoint. @@ -35,7 +35,7 @@ Sets the scope for the rules. By default, the rules are applied globally for all === Example request -The following example defines instructions to coach Spotter on how to interpret the query: +The following example defines data model instructions that guide Spotter on how to interpret queries: [source,cURL] ---- @@ -109,13 +109,14 @@ If the instructions are configured on the Model specified in the API request, Th } ---- -== Spotter coaching access -ThoughtSpot supports publishing Spotter coaching information to other Orgs. Coaching changes from the primary Org are synchronized with the data models published in secondary Orgs. +== Spotter data model instructions access -=== Assign Spotter coaching access privilege +ThoughtSpot supports publishing data model instructions to other Orgs. Data model instruction changes from the primary Org are synchronized with the data models published in secondary Orgs. -To allow users and groups to access spotter coaching information in data models, assign the `SPOTTER_COACHING_PRIVILEGE` via `POST` request to the `/api/rest/2.0/security/metadata/manage-object-privilege` API endpoint. +=== Assign the data model instructions privilege + +To allow users and groups to access data model instructions, assign the `SPOTTER_COACHING_PRIVILEGE` via `POST` request to the `/api/rest/2.0/security/metadata/manage-object-privilege` API endpoint. In the API request, specify the data model, user, and group, and ensure that the object privilege is set to `SPOTTER_COACHING_PRIVILEGE`. @@ -145,9 +146,10 @@ curl -X POST \ If the request is successful, the API returns the 204 response code. -=== Get a list of users or groups with Spotter coaching privilege -To get a list of users and groups with the Spotter coaching privilege for a specific data model or all data models, send a `POST` request to the `/api/rest/2.0/security/metadata/fetch-object-privileges` API endpoint. +=== Get a list of users or groups with the data model instructions privilege + +To get a list of users and groups with the data model instructions privilege (`SPOTTER_COACHING_PRIVILEGE`) for a specific data model or all data models, send a `POST` request to the `/api/rest/2.0/security/metadata/fetch-object-privileges` API endpoint. In the API request, specify the user or the group for which you want to retrieve the object privilege details. diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 6320f0913..5b908af2e 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -364,7 +364,7 @@ Administrators and users with edit access to data models can programmatically co Users and groups with `SPOTTER_COACHING_PRIVILEGE` can import and export coaching TML on data models in the source and destination Orgs where the model is published, and can also share these objects with other users and groups. -For more information, see xref:spotter-apis.adoc#_spotter_coaching_access[Spotter coaching access]. +For more information, see xref:spotter-nl-instructions.adoc#_spotter_data_model_instructions_access[Spotter data model instructions access]. --- From 7fa828343bb6b5072a092caab8dcdf308bca7942 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Thu, 18 Jun 2026 12:29:56 +0530 Subject: [PATCH 039/136] Restore doc --- modules/ROOT/pages/3rd-party-script.adoc | 72 ++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 modules/ROOT/pages/3rd-party-script.adoc diff --git a/modules/ROOT/pages/3rd-party-script.adoc b/modules/ROOT/pages/3rd-party-script.adoc new file mode 100644 index 000000000..a978ada50 --- /dev/null +++ b/modules/ROOT/pages/3rd-party-script.adoc @@ -0,0 +1,72 @@ += External tools and script integration +:toc: true +:toclevels: 2 + +:page-title: Integrate external tools and allow scripts +:page-pageid: external-tool-script-integration +:page-description: Security settings for embedding + +ThoughtSpot supports integrating third-party apps such as Mixpanel, Pendo, LogRocket, and more in your embed. If you are using third-party tools to track usage, trace, log, or onboard your application users, you can seamlessly integrate these tools with ThoughtSpot embed and add custom JavaScript. This feature is disabled by default on ThoughtSpot instances. To enable this feature, contact ThoughtSpot Support. + +[IMPORTANT] +==== +While ThoughtSpot allows the injection of custom JavaScript, it is important to be aware of the associated security risks, particularly Cross-Site Scripting (XSS). XSS is a vulnerability that can enable malicious actors to inject and execute unauthorized scripts within a trusted environment. This can lead to data breaches, unauthorized access to user sessions, and compromised system integrity. ThoughtSpot strongly recommends reviewing security guidelines before activating this feature in your instances and exercising caution when integrating third-party tools into your embedded application. +==== + +== Security considerations + +Before requesting ThoughtSpot Support to enable this feature on your instance, do the following: + +* Review the security risks associated with custom-hosted scripts and understand the potential consequences of XSS attacks. +* Implement security controls and measures to validate hosted scripts and mitigate potential vulnerabilities. + +== Feature enablement + +Enabling third-party tools on embed involves two steps: + +. Request for feature activation and provide the script details to ThoughtSpot Support +. Adding the script sources to the CSP allowlist + +=== Request for feature enablement + +Create a ThoughtSpot Support ticket to enable the feature on your instance. In your request, specify the domain URLs that will host the scripts in your embedding environment. + +Wait for ThoughtSpot Support to validate and approve, and then add the domain that hosts the script to the CSP allowlist on your instance. This step will ensure that only the trusted and vetted domains are allowed to run scripts in your application environment. + +=== Add script source to CSP allowlist +After the script hosting URL is approved and configured by ThoughtSpot Support, you must add the JavaScript hosting domain to the CSP allowlist. This step requires administration privileges, so make sure you log in to ThoughtSpot with your administrator credentials. + +. In your ThoughtSpot application, navigate to *Develop* > *Customizations* > *Security Settings*. +. If your instance has the Orgs feature enabled, ensure that you are in the *All Orgs* context. +. On the *Security Settings* page, click *Edit* and turn on the *CSP script-src domains* toggle switch. ++ +[.widthAuto] +[.bordered] +image::./images/csp-script-domain.png[CSS script-src domain] +. Add the script hosting domain. +. Click *Save changes*. + +[NOTE] +==== +* The *CSP script-src domains* section is visible to users with administrative privileges only if the third-party integration feature is enabled on your instance. +* The *CSP script-src domains* cannot be enabled and configured at the Org level. When configured, this setting will apply to all the Orgs configured on your instance. +==== + +=== Allow Websocket endpoints +If your tool uses WebSockets, add the tool’s `wss://` endpoint to the CSP and CORS allowlists in ThoughtSpot. This enables secure WebSocket connections from an embedded ThoughtSpot page to the tool's WebSocket endpoint without being blocked by the browser’s Content Security Policy. + +Only hosts explicitly listed with `wss://` are permitted. You can add `wss://` URL in the **Develop** > **Security Settings** page. + +== Passing variables to the hosted script + +To pass variables to the customer's hosted script, Visual Embed SDK provides the `customVariablesForThirdPartyTools` parameter. The `customVariablesForThirdPartyTools` is an object containing the variables that you wish to pass to the customer’s hosted JavaScript. These may include private information such as credentials or keys. The hosted JavaScript will access these variables via the `window.tsEmbed` object. + +Developers can define this parameter in the **init()** function as shown in the following example. Once initialized, the JavaScript will run after the authentication is successfully completed in the ThoughtSpot Embed App. + +[source,JavaScript] +---- +init({ + //... + customVariablesForThirdPartyTools: { cloud: "123Basic" } +}); +---- From 5223a781da18fe8022d1c8783ae9d9acb94972ea Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Thu, 18 Jun 2026 14:46:20 +0530 Subject: [PATCH 040/136] edits --- modules/ROOT/pages/common/nav-embedding.adoc | 1 + modules/ROOT/pages/common/nav-tutorials.adoc | 29 -------------------- 2 files changed, 1 insertion(+), 29 deletions(-) delete mode 100644 modules/ROOT/pages/common/nav-tutorials.adoc diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc index c5a64bbb4..fc6cdc283 100644 --- a/modules/ROOT/pages/common/nav-embedding.adoc +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -138,6 +138,7 @@ Embedding tutorials ** link:{{navprefix}}/tutorials/react-components/lesson-02[02 - ThoughtSpot component pages] ** link:{{navprefix}}/tutorials/react-components/lesson-03[03 - Menus and navigation elements] ** link:{{navprefix}}/tutorials/react-components/lesson-04[04 - Event handling] +* link:{{navprefix}}/tutorials/spotter/integrate-into-chatbot[Integrate Spotter into your Chatbot] [.sidebar-title] diff --git a/modules/ROOT/pages/common/nav-tutorials.adoc b/modules/ROOT/pages/common/nav-tutorials.adoc deleted file mode 100644 index b7933f53d..000000000 --- a/modules/ROOT/pages/common/nav-tutorials.adoc +++ /dev/null @@ -1,29 +0,0 @@ - -:page-pageid: nav-tutorials -:page-description: Tutorials navigation - -[navSection] - -* link:{{navprefix}}/tutorials/tutorials-overview[Tutorials] -** link:{{navprefix}}/tutorials/tse-fundamentals/intro[Embedding Fundamentals] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-01[01 - Overview] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-02[02 - Set up for course] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-03[03 - Security setup] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-04[04 - Start coding] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-05[05 - Embed Search] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-06[06 - Embed Natural Language Search] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-07[07 - Embed Liveboard] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-08[08 - Embed Visualization] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-09[09 - Embed full application] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-10[10 - Style embedded app] -*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-11[11 - Course summary] -** link:{{navprefix}}/tutorials/style-customization/tutorial[Style customization] -** link:{{navprefix}}/tutorials/react-components/intro[React components] -*** link:{{navprefix}}/tutorials/react-components/lesson-01[01 - Initialize Visual Embed SDK] -*** link:{{navprefix}}/tutorials/react-components/lesson-02[02 - ThoughtSpot component pages] -*** link:{{navprefix}}/tutorials/react-components/lesson-03[03 - Menus and navigation elements] -*** link:{{navprefix}}/tutorials/react-components/lesson-04[04 - Event handling] - -*** link:{{navprefix}}/tutorials/rest-api/lesson-04[04 - Event handling] -** Spotter -*** link:{{navprefix}}/tutorials/spotter/integrate-into-chatbot[Integrate Spotter into your Chatbot] From 004cc86a6a31a5c5480f45ddb87302226d86c5ea Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Thu, 18 Jun 2026 16:05:25 +0530 Subject: [PATCH 041/136] spotter-coaching terminology udpate --- modules/ROOT/pages/api-changelog.adoc | 13 +++++---- modules/ROOT/pages/common/nav-rest-api.adoc | 2 +- modules/ROOT/pages/rest-apiv2-changelog.adoc | 7 +++-- .../pages/spotter-agent-instructions.adoc | 4 +-- .../ROOT/pages/spotter-nl-instructions.adoc | 28 ++++++++++--------- modules/ROOT/pages/whats-new.adoc | 2 +- 6 files changed, 30 insertions(+), 26 deletions(-) diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index 0c0a75e58..0b682e3ed 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -328,13 +328,13 @@ For more information, see xref:embed-spotter.adoc[Embedding Spotter] and xref:em Events:: -* `EmbedEvent.AddToCoaching` for the *Add to coaching* workflow in a Spotter conversation session -* `HostEvent.AddToCoaching` to trigger the *Add to coaching* action in a Spotter conversation session. +* `EmbedEvent.AddToCoaching` for the *Add to Coaching* workflow in a Spotter conversation session +* `HostEvent.AddToCoaching` to trigger the *Add to Coaching* action in a Spotter conversation session. * `HostEvent.StartNewSpotterConversation` to trigger the action to start a new chat session with Spotter. [NOTE] ==== -On Spotter embed deployments running version 26.2.0.cl or later, the *Add to Coaching* feature is enabled by default. To disable or hide the **Add to Coaching** button, use the xref:Action.adoc#_inconversationtraining[InConversationTraining] action ID. +On Spotter embed deployments running version 26.2.0.cl or later, the *Add to Coaching* feature is enabled by default. To disable or hide the *Add to Coaching* button, use the xref:Action.adoc#_inconversationtraining[InConversationTraining] action ID. ==== |[tag greenBackground]#NEW FEATURE# a| **Liveboard experience enhancements** + @@ -596,11 +596,12 @@ Replaced with `SpotterAgentEmbed` Replaced with `SpotterAgentEmbedViewConfig` The deprecated components with old names in the existing Spotter embed implementations will continue to function until further notice. For code samples with new component names, see xref:embed-spotter.adoc[Spotter embed documentation]. -|[tag greenBackground]#NEW FEATURE# a| *Action ID of Spotter coaching* + -For ThoughtSpot instances that have the new Spotter feedback and coaching workflow enabled, SDK provides the action ID `Action.InConversationTraining` to manage the visibility of the *Add to coaching* button on Answer generated from Spotter prompts. + +|[tag greenBackground]#NEW FEATURE# a| *Action ID for Spotter in-conversation training* + +For ThoughtSpot instances that have the new Spotter in-conversation training workflow enabled, the SDK provides the action ID `Action.InConversationTraining` to manage the visibility of the *Add to Coaching* button on Answers generated from Spotter prompts. [NOTE] -The **Add to Coaching** feature is currently in beta and is turned off by default on embed deployments. To enable this feature on your instance, contact ThoughtSpot Support. +The *Add to Coaching* feature is currently in beta and is turned off by default on embed deployments. To enable this feature on your instance, contact ThoughtSpot Support. |[tag greenBackground]#NEW FEATURE# a|*Events support for Spotter embed* diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index d492ee863..e93dd9a77 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -22,7 +22,7 @@ REST APIs * link:{{navprefix}}/spotter-api[Spotter APIs] ** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] ** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] -** link:{{navprefix}}/spotter-coaching-apis[Spotter coaching APIs ^BETA^] +** link:{{navprefix}}/spotter-nl-instructions[Spotter instructions APIs ^BETA^] * link:{{navprefix}}/audit-logs[Audit logs] * link:{{navprefix}}/tml[TML] * link:{{navprefix}}/collections[Collections ^BETA^] diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 7c9ecbe95..c04b28c97 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -241,11 +241,12 @@ Allows modifying storage configuration for a webhook. Retrieves storage configuration details. === Object privilege APIs -Administrators and users with edit access to data models can now use `/api/rest/2.0/security/metadata/manage-object-privilege` to assign object-level permissions to users and groups and allow access to Spotter coaching information. +Administrators and users with edit access to data models can now use `/api/rest/2.0/security/metadata/manage-object-privilege` to assign object-level permissions to users and groups and control access to Spotter data model instructions. To fetch object privileges for a data model, user, or group, use the `/api/rest/2.0/security/metadata/fetch-object-privileges` API endpoint. -For more information, see xref:spotter-apis.adoc#_spotter_coaching_access[Spotter coaching access]. +For more information, see xref:spotter-nl-instructions.adoc#_spotter_data_model_instructions_access[Spotter data model instructions access]. + === User API enhancements @@ -321,7 +322,7 @@ The `include_variable_values` parameter in the API request allows including vari This release introduces the following Spotter APIs: * `POST /api/rest/2.0/ai/instructions/set` + -Allows configuring natural language (NL) instructions on a model to coach Spotter on how to interpret queries, handle data nuances, and improve responses. +Allows configuring natural language (NL) instructions on a data model to define how Spotter interprets queries, handles data nuances, and improves responses. * `POST /api/rest/2.0/ai/instructions/get` + Gets NL instructions that are currently assigned to a model. * `POST /api/rest/2.0/ai/data-source-suggestions` + diff --git a/modules/ROOT/pages/spotter-agent-instructions.adoc b/modules/ROOT/pages/spotter-agent-instructions.adoc index 09b16adc5..6b5deff35 100644 --- a/modules/ROOT/pages/spotter-agent-instructions.adoc +++ b/modules/ROOT/pages/spotter-agent-instructions.adoc @@ -8,7 +8,7 @@ Administrators and developers can configure persistent behavioral instructions for the Spotter agent using the agent instructions APIs. These instructions guide how Spotter responds within a conversation context. For example, to focus on specific business domains, enforce response formats, or apply analytical constraints. -Unlike xref:spotter-nl-instructions.adoc[NL coaching instructions], which operate at the data model level, agent instructions operate at the agent level and do not require a data source identifier. +Unlike xref:spotter-nl-instructions.adoc[data model instructions], which operate at the data model level, agent instructions operate at the agent level and do not require a data source identifier. [NOTE] ==== @@ -126,7 +126,7 @@ If no instructions are configured, ThoughtSpot returns an empty value for the `i == Related resources -* For information about coaching Spotter at the data model level, see xref:spotter-nl-instructions.adoc[Spotter coaching APIs]. +* For information about adding instructions at the data model level, see xref:spotter-nl-instructions.adoc[Data model instruction APIs]. * For information about Spotter agent conversation workflows, see xref:spotter-agent-apis.adoc[AI APIs (Spotter Agent and Spotter 3)]. * Visit the +++REST API v2.0 Playground+++ to test the set agent instructions endpoint. * Visit the +++REST API v2.0 Playground+++ to test the get agent instructions endpoint. diff --git a/modules/ROOT/pages/spotter-nl-instructions.adoc b/modules/ROOT/pages/spotter-nl-instructions.adoc index 54c9a2de4..950db8d4b 100644 --- a/modules/ROOT/pages/spotter-nl-instructions.adoc +++ b/modules/ROOT/pages/spotter-nl-instructions.adoc @@ -1,15 +1,15 @@ -= Spotter instructions API += Data model instructions API :toc: true :toclevels: 2 -:page-title: Spotter APIs -:page-pageid: spotter-coaching-apis -:page-description: You can use Spotter REST APIs to receive Answers for your analytical queries sent through the conversational experience with ThoughtSpot. +:page-title: Data model instructions APIs +:page-pageid: spotter-nl-instructions +:page-description: Use the data model instructions APIs to set and retrieve natural language instructions at the data model level to guide how Spotter interprets and answers user queries. -Administrators and data owners can guide and refine how Spotter interprets and answers user questions. The natural language (NL) instructions API allows you to set instructions at the data model level. The API provides business context and preferred interpretations for specific queries or terminology to coach Spotter, but it does not train or change the underlying LLM. +Administrators and data owners can guide and refine how Spotter interprets and answers user questions. The natural language (NL) instructions API allows you to set instructions at the data model level. The API provides business context and preferred interpretations for specific queries or terminology, but it does not train or change the underlying LLM. == Set NL instructions -To coach and instruct the Spotter system on how to interpret queries, apply filters, select columns, handle data nuances, and present answers using the data from a specific model, you can set global rules in natural language format. Setting instructions helps Spotter generate precise and consistent responses for user queries. +To define how Spotter interprets queries, applies filters, selects columns, handles data nuances, and presents answers using the data from a specific model, you can set global rules in natural language format. Setting data model instructions helps Spotter generate precise and consistent responses for user queries. To set instructions for a Model, send a `POST` request to the `/api/rest/2.0/ai/instructions/set` API endpoint. @@ -35,7 +35,7 @@ Sets the scope for the rules. By default, the rules are applied globally for all === Example request -The following example defines instructions to coach Spotter on how to interpret the query: +The following example defines data model instructions that guide Spotter on how to interpret queries: [source,cURL] ---- @@ -109,13 +109,14 @@ If the instructions are configured on the Model specified in the API request, Th } ---- -== Spotter coaching access -ThoughtSpot supports publishing Spotter coaching information to other Orgs. Coaching changes from the primary Org are synchronized with the data models published in secondary Orgs. +== Spotter data model instructions access -=== Assign Spotter coaching access privilege +ThoughtSpot supports publishing data model instructions to other Orgs. Data model instruction changes from the primary Org are synchronized with the data models published in secondary Orgs. -To allow users and groups to access spotter coaching information in data models, assign the `SPOTTER_COACHING_PRIVILEGE` via `POST` request to the `/api/rest/2.0/security/metadata/manage-object-privilege` API endpoint. +=== Assign the data model instructions privilege + +To allow users and groups to access data model instructions, assign the `SPOTTER_COACHING_PRIVILEGE` via `POST` request to the `/api/rest/2.0/security/metadata/manage-object-privilege` API endpoint. In the API request, specify the data model, user, and group, and ensure that the object privilege is set to `SPOTTER_COACHING_PRIVILEGE`. @@ -145,9 +146,10 @@ curl -X POST \ If the request is successful, the API returns the 204 response code. -=== Get a list of users or groups with Spotter coaching privilege -To get a list of users and groups with the Spotter coaching privilege for a specific data model or all data models, send a `POST` request to the `/api/rest/2.0/security/metadata/fetch-object-privileges` API endpoint. +=== Get a list of users or groups with the data model instructions privilege + +To get a list of users and groups with the data model instructions privilege (`SPOTTER_COACHING_PRIVILEGE`) for a specific data model or all data models, send a `POST` request to the `/api/rest/2.0/security/metadata/fetch-object-privileges` API endpoint. In the API request, specify the user or the group for which you want to retrieve the object privilege details. diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 6320f0913..5b908af2e 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -364,7 +364,7 @@ Administrators and users with edit access to data models can programmatically co Users and groups with `SPOTTER_COACHING_PRIVILEGE` can import and export coaching TML on data models in the source and destination Orgs where the model is published, and can also share these objects with other users and groups. -For more information, see xref:spotter-apis.adoc#_spotter_coaching_access[Spotter coaching access]. +For more information, see xref:spotter-nl-instructions.adoc#_spotter_data_model_instructions_access[Spotter data model instructions access]. --- From 7921a6d129ca70427813d858c2227d7410d732b5 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Fri, 19 Jun 2026 09:38:09 +0530 Subject: [PATCH 042/136] feedback typos --- modules/ROOT/pages/customize-style-api.adoc | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc index 7bb6dc561..67f0c0533 100644 --- a/modules/ROOT/pages/customize-style-api.adoc +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -1,6 +1,6 @@ = Style customization APIs :toc: true -:toclevels: 2 +:toclevels: 3 :page-title: Customize styles and layout through REST APIs :page-pageid: style-customization-apis @@ -36,10 +36,10 @@ Request parameters:: //|`org_identifier`|Conditional|Required when `scope` is `ORG`. |`operation`|Yes|`REPLACE` overwrites existing settings. `RESET` reverts specific fields to defaults. |`navigation_panel`|No|Top navigation panel color. Can be `DARK`, `TWO_TONE` or `CUSTOM`. A valid hex value for `base_color` is needed only when `theme` is `CUSTOM`. -|`chart_color_palette`|No|Array of hex color values for charts. When provided with `REPLACE`, exactly 8 `primary` color entries must be specified in colors. `secondary` color entries, if provided, should be exactly 4 in number. If `secondary` shades are omitted, the server auto-generates 4 shades from the primary color. +|`chart_color_palette`|No|Array of hex color values for charts. When provided with `REPLACE`, exactly 8 `primary` color entries must be specified in colors. `secondary` color entries, if provided, should be exactly 4 in number for each `primary` color. If `secondary` shades are omitted, the server auto-generates 4 shades from the primary color. |`embedded_footer_text`|No|Footer text for embedded content. |`visualization_fonts`|No|Font assignments for visualization elements. Provide only the areas to update; omitted areas remain unchanged. -|`default_logo`|No|Binary image file for the square application logo. Allowed formats are PNG, JPG, and JPEG only. +|`default_logo`|No|Binary image file for the square application logo. Accepted formats are PNG, JPG, and JPEG only. |`wide_logo`|No|Binary image file for the wide logo (email and PDF exports). |`reset_options`|No|Resets specified settings to ThoughtSpot defaults. Used when `operation` is `RESET`. |===== @@ -370,13 +370,6 @@ Default: `true`. |===== -//// -|`org_identifier` -|Conditional -|Unique ID or name of the Org. Applicable only when `scope` is `ORG`. -Defaults to the caller's active Org if omitted. -//// - Example API request:: From 7779116a0df97136630bb734ec9d4c6d8e545ce6 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 22 Jun 2026 09:28:29 +0530 Subject: [PATCH 043/136] small edit --- modules/ROOT/pages/customize-style-api.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc index 67f0c0533..c9601176f 100644 --- a/modules/ROOT/pages/customize-style-api.adoc +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -355,7 +355,7 @@ Request parameter:: |`scope` |Yes -|Scope of the font library. Valid values: `CLUSTER`, `ORG`. +|Scope of the font library. Valid values: `CLUSTER`, `ORG`. To delete a `CLUSTER` level font, you require `ADMINISTRATION` privilege. |`font_identifiers` From eaef86a145dbd779c719b24afa7eb86bc35dd9e6 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 22 Jun 2026 10:36:39 +0530 Subject: [PATCH 044/136] new updates --- modules/ROOT/pages/embed-spotter.adoc | 88 +++++++++++++----- modules/ROOT/pages/rest-apiv2-changelog.adoc | 23 +++++ modules/ROOT/pages/whats-new.adoc | 96 ++++++++++++++++++++ 3 files changed, 182 insertions(+), 25 deletions(-) diff --git a/modules/ROOT/pages/embed-spotter.adoc b/modules/ROOT/pages/embed-spotter.adoc index e5c42876d..03f7bf56c 100644 --- a/modules/ROOT/pages/embed-spotter.adoc +++ b/modules/ROOT/pages/embed-spotter.adoc @@ -412,38 +412,71 @@ spotterChatConfig: { } ---- +[#fileUpload] +=== Enable file upload in Spotter chat + +// SOURCE: https://github.com/thoughtspot/developer-docs/blob/main/modules/ROOT/pages/api-changelog.adoc (SDK v1.49.x — Spotter file upload) +// Available from: Visual Embed SDK v1.49.0, ThoughtSpot Cloud 26.7.0.cl +// TODO: verify minimum ThoughtSpot Cloud version with engineering + +The SDK introduces configuration parameters in `SpotterChatViewConfig` to enable users to upload files directly in the Spotter chat panel of an embedded application. + +[NOTE] +==== +File upload in the Spotter chat panel requires Visual Embed SDK version 1.49.0 or later and ThoughtSpot Cloud 26.7.0.cl or later. +// TODO: verify minimum version with engineering +==== + +To enable file upload: + +. Set `spotterFileUploadEnabled` to `true` in the `spotterChatConfig` object. +. Optionally, restrict the types of files users can upload by specifying a `SpotterFileUploadFileTypes` object in `spotterFileUploadFileTypes`. -//// [source,JavaScript] ---- +import { + SpotterEmbed, + SpotterChatViewConfig, + AuthType, + init +} from '@thoughtspot/visual-embed-sdk'; + init({ - //... embed configuration attributes - customizations: { - style: { - customCSS: { - rules_UNSTABLE: { - // Hide the Spotter icon in the tool call card under reasoning - "svg.chat-module__spotterIcon.icon-module__iconStyle.icon-module__xxl.icon-module__white": { - "display": "none !important" - }, - // Control the visibility for the ThoughtSpot text in the tool call card under reasoning - // Hide the element completely if MCP connectors are enabled, since the text-indent works for ThoughtSpot text only - ".collapsible-item-response-module__title": { - "text-indent": "-89px", - "overflow": "hidden", - "margin-left": "-24px" - }, - // Hide the ThoughtSpot (or Connector) icon in the tool call card under reasoning - ".collapsible-item-response-module__customIconWrapper": { - "display": "none" - }, + thoughtSpotHost: 'https://your-thoughtspot-host', + authType: AuthType.None, +}); + +const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { + frameParams: { + width: '100%', + height: '100%', + }, + worksheetId: '<%=datasourceGUID%>', + spotterChatConfig: { + spotterFileUploadEnabled: true, // Enables file upload in the chat panel + spotterFileUploadFileTypes: { // Optional: restrict allowed file types + // TODO: verify accepted SpotterFileUploadFileTypes values with engineering }, - }, }, - } }); + +spotterEmbed.render(); ---- -//// + +[cols="1,3"] +|=== +|Parameter |Description + +|`spotterFileUploadEnabled` +|Boolean. When set to `true`, enables the file upload button in the Spotter chat panel. Default: `false`. +// TODO: verify default value with engineering + +|`spotterFileUploadFileTypes` +|Accepts a `SpotterFileUploadFileTypes` object. Use this parameter to restrict the file formats that users can upload. If not specified, all supported file types are allowed. +// TODO: verify the full list of accepted file type values and the SpotterFileUploadFileTypes object shape with engineering +|=== + +For a complete list of `SpotterChatViewConfig` parameters, see xref:SpotterEmbedViewConfig.adoc[SpotterEmbedViewConfig]. [#spotterMenuActions] === Customizing menu actions and elements @@ -473,11 +506,16 @@ For a comprehensive list of supported actions, see xref:Action.adoc[Spotter menu ---- import { SpotterEmbed, + SpotterEmbedViewConfig, + SpotterChatViewConfig, AuthType, init, + prefetch, EmbedEvent, HostEvent -} from '@thoughtspot/visual-embed-sdk'; +} +from '@thoughtspot/visual-embed-sdk'; + // Initialize the ThoughtSpot Visual Embed SDK with your ThoughtSpot URL and authentication type. init({ thoughtSpotHost: 'https://your-thoughtspot-host', // Replace with your ThoughtSpot application URL diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index c04b28c97..c0f7ec2d4 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -8,6 +8,29 @@ This changelog lists the features and enhancements introduced in REST API v2.0. For information about new features and enhancements available for embedded analytics, see xref:whats-new.adoc[What's New]. + +== Version 26.7.0.cl, July 2026 + +// TODO: Confirm with engineering whether any new Spotter REST API v2 endpoints +// are introduced in 26.7.0.cl beyond those listed in 26.6.0.cl. +// If no new endpoints ship, this section should note that and link to the 26.6.0.cl +// entries for agent instructions and stop-response which remain current. + +// SOURCE: https://github.com/thoughtspot/developer-docs/blob/main/modules/ROOT/pages/rest-apiv2-changelog.adoc +// (Current 26.6.0.cl entries for Spotter AI APIs are the most recent documented changes) + +=== Spotter AI APIs + +// TODO: verify with engineering — are agent instructions APIs and stop-response endpoint +// (first documented in 26.6.0.cl) GA or still in beta/EA in 26.7.0.cl? +// If they are promoted to GA in 26.7.0.cl, add a GA promotion note here. + +The Spotter agent instructions APIs and the stop-response endpoint introduced in xref:rest-apiv2-changelog.adoc#_version_26_6_0_cl_june_2026[26.6.0.cl] are generally available in this release. +// TODO: confirm GA status above with engineering + +For the complete list of Spotter REST API v2 endpoints, see xref:spotter-agent-apis.adoc[Spotter Agent APIs]. + + == Version 26.6.0.cl, June 2026 === Spotter AI APIs diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 5b908af2e..213c12cfd 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -23,6 +23,102 @@ This page lists new features, enhancements, and deprecated functionality introdu // *Affects:* Developers, Administrators, End Users // ============================================================ + +[.cl-table, cols="2,4", frame=none, grid=none] +|===== +a| +[.cl-label] +*Version 26.7.0.cl* + +a| + +[discrete] +==== Spotter file upload in embedded apps [.version-badge.new]#New# + +// SOURCE: https://github.com/thoughtspot/developer-docs/blob/main/modules/ROOT/pages/api-changelog.adoc (SDK v1.49.x section) + +Embedded Spotter applications can now allow users to upload files directly in the Spotter chat panel. The SDK introduces two new configuration parameters in `SpotterChatViewConfig` to enable and control this capability: + +* `spotterFileUploadEnabled` — When set to `true`, enables the file upload feature in the Spotter chat panel. +* `spotterFileUploadFileTypes` — Restricts the file types allowed for upload. Accepts a `SpotterFileUploadFileTypes` object. + +For more information, see xref:embed-spotter.adoc#_enable_file_upload_in_spotter_chat[Enable file upload in Spotter chat]. + +--- + +[discrete] +==== SpotterViz branding and customization [.version-badge.new]#New# + +The Visual Embed SDK 1.50.0 introduces the `SpotterVizConfig` interface and +`SpotterVizStarterPrompt` interface to allow embed developers to customize +the SpotterViz panel on embedded Liveboards and full-application embeds. + +Using `SpotterVizConfig`, you can now: + +* Set a custom brand name and headline for the SpotterViz panel. +* Add a custom description and input chat placeholder text. +* Show, hide, or replace the default starter prompts with +application-specific suggestions using `SpotterVizStarterPrompt`. + +The `spotterViz` property is available on both `AppViewConfig` and +`LiveboardViewConfig`. + +For more information, see xref:embed-spotter-viz.adoc[Customizing SpotterViz]. +// TODO: verify target page ID with the developer-docs team. + +--- + +[discrete] +==== Focused homepage experience [.version-badge.new]#New# + +A new `HomePage.Focused` enum member (`v4`) is introduced in `AppEmbed` +to enable the V4 homepage experience, which merges the Watchlist and Recents +sections into a single focused view. + +[NOTE] +==== +The V4 homepage experience requires Spotter to be enabled on your +ThoughtSpot instance. +==== + +For more information, see xref:embed-app.adoc#_discovery_experience[Discovery experience]. +// TODO: verify target anchor with the developer-docs team. + +--- + +[discrete] +==== New EmbedEvents for SpotterViz [.version-badge.new]#New# + +The SDK introduces two new event identifiers for monitoring SpotterViz +panel activity in embedded Liveboards: + +* `EmbedEvent.SpotterVizMount` + +Emitted when the SpotterViz panel mounts in embed mode. +* `EmbedEvent.SpotterVizPromptSubmit` + +Emitted when a user submits a prompt in the SpotterViz panel. + +--- + + +[discrete] +==== REST API v2 +// TODO: verify if any new Spotter REST API v2 endpoints are introduced specifically in 26.7.0.cl beyond those documented in 26.6.0.cl — confirm with engineering + +For information about REST API v2 enhancements in this release, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + +--- + + +[discrete] +==== Visual Embed SDK +The Visual Embed SDK version 1.50.0 includes several new features +and enhancements. For more information, see the +xref:api-changelog.adoc[Visual Embed changelog]. + +|===== + + + == June 2026 **Release version**: ThoughtSpot Cloud 26.6.0.cl + From 97e2852f4e15d3002026ca68b233b91b2b34fee6 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 23 Jun 2026 11:02:59 +0530 Subject: [PATCH 045/136] delete unused file --- modules/ROOT/pages/embed-rest-api.adoc | 105 ------------------------- 1 file changed, 105 deletions(-) delete mode 100644 modules/ROOT/pages/embed-rest-api.adoc diff --git a/modules/ROOT/pages/embed-rest-api.adoc b/modules/ROOT/pages/embed-rest-api.adoc deleted file mode 100644 index 2975e633c..000000000 --- a/modules/ROOT/pages/embed-rest-api.adoc +++ /dev/null @@ -1,105 +0,0 @@ -= Embed objects using REST API -:toc: true - -:page-title: Embed data -:page-pageid: embed-data-restapi -:page-description: Embed Data using REST APIs - -You can use the REST API to get an object from ThoughtSpot and embed it in a web page, portal, or application. ThoughtSpot provides an embed link for objects, such as Liveboards and visualizations, using which you can construct the URL required to make an API call. - -To get the embed link for a Liveboard: - -. Log in to ThoughtSpot. -. Navigate to the Liveboard. -. Note the GUID number of the object. -+ -To embed a Liveboard, click *More* image:./images/icon-more-10px.png[the more options menu], and select *Copy embed link*. - -+ -[.widthAuto] -image::./images/copy_pinboard_link.png[Copy embed link, width=auto] - -+ -To get the embed link for a visualization: - -.. Navigate to the table or chart -.. Click *More* image:./images/icon-more-10px.png[the more options menu] in the upper right corner of the table or chart. -.. Click *Copy embed link* icon. -+ -[.widthAuto] -image::./images/copy_link.png[Copy link, width=auto] - -+ -[NOTE] -==== -The *Copy embed link* menu action is available only if Classic Liveboard experience is enabled on your instance. -==== - -. Note the GUID of the object. -. Copy the embed link. -+ -Paste it somewhere so that you can use it later to construct the URL for the REST API call. - -+ -If you want to embed a Liveboard, copy the identifier that appears after `viz/`. - -+ -[.widthAuto] -image::./images/copy_link_pinboard.png[Copy Liveboard link, width=auto] - -+ -For visualizations (table or chart), copy the IDs that appear after `viz/`. - -+ -[.widthAuto] -image::./images/copy_link_viz_pinboard_part.png[Copy visualization link, width=auto] - -. Construct the URL. -+ -For a Liveboard, the URL is as follows: - -+ ----- -https://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/pinboarddata?id= ----- -+ -For a visualization, the URL is as follows: - -+ ----- -https://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/pinboarddata?id=&vizid=%5B%5D ----- -+ -[NOTE] -==== -Make sure you add brackets around the `vizid` parameter. The URL encoding for the opening bracket is `%5B` and the closing bracket is `%5D`. -==== - -+ -. To apply filters to the data, use runtime filters. - -+ -For example, to sort values equal to `red` in the `Color` column for a visualization in a Liveboard, you can pass the runtime filter in the URL query parameters as shown here: - -+ ----- -http://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/pinboarddata -?id=&vizid=%5B%5D -&col1=color&op1=EQ&val1=red ----- - -. After you construct the URL, send a POST request to get data from ThoughtSpot. - -+ -The API returns the data formatted as JSON. -. Retrieve the data from the JSON and embed it in your Web page, Web portal, or application. - -For more information, see xref:runtime-filters.adoc[Runtime filters]. - -[NOTE] -==== -Runtime Filters can also be applied on visualizations or Liveboards embedded in your application. You can specify the runtime filter criteria in the SDK when embedding ThoughtSpot objects. For more information, see xref:embed-a-viz.adoc[Embed a visualization] and xref:embed-pinboard.adoc[Embed a Liveboard]. -==== - - - From cd712df5a079bde7ff12bf297f389d9ef604d5ed Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 23 Jun 2026 11:02:59 +0530 Subject: [PATCH 046/136] delete unused file --- modules/ROOT/pages/embed-rest-api.adoc | 105 ------------------------- 1 file changed, 105 deletions(-) delete mode 100644 modules/ROOT/pages/embed-rest-api.adoc diff --git a/modules/ROOT/pages/embed-rest-api.adoc b/modules/ROOT/pages/embed-rest-api.adoc deleted file mode 100644 index 2975e633c..000000000 --- a/modules/ROOT/pages/embed-rest-api.adoc +++ /dev/null @@ -1,105 +0,0 @@ -= Embed objects using REST API -:toc: true - -:page-title: Embed data -:page-pageid: embed-data-restapi -:page-description: Embed Data using REST APIs - -You can use the REST API to get an object from ThoughtSpot and embed it in a web page, portal, or application. ThoughtSpot provides an embed link for objects, such as Liveboards and visualizations, using which you can construct the URL required to make an API call. - -To get the embed link for a Liveboard: - -. Log in to ThoughtSpot. -. Navigate to the Liveboard. -. Note the GUID number of the object. -+ -To embed a Liveboard, click *More* image:./images/icon-more-10px.png[the more options menu], and select *Copy embed link*. - -+ -[.widthAuto] -image::./images/copy_pinboard_link.png[Copy embed link, width=auto] - -+ -To get the embed link for a visualization: - -.. Navigate to the table or chart -.. Click *More* image:./images/icon-more-10px.png[the more options menu] in the upper right corner of the table or chart. -.. Click *Copy embed link* icon. -+ -[.widthAuto] -image::./images/copy_link.png[Copy link, width=auto] - -+ -[NOTE] -==== -The *Copy embed link* menu action is available only if Classic Liveboard experience is enabled on your instance. -==== - -. Note the GUID of the object. -. Copy the embed link. -+ -Paste it somewhere so that you can use it later to construct the URL for the REST API call. - -+ -If you want to embed a Liveboard, copy the identifier that appears after `viz/`. - -+ -[.widthAuto] -image::./images/copy_link_pinboard.png[Copy Liveboard link, width=auto] - -+ -For visualizations (table or chart), copy the IDs that appear after `viz/`. - -+ -[.widthAuto] -image::./images/copy_link_viz_pinboard_part.png[Copy visualization link, width=auto] - -. Construct the URL. -+ -For a Liveboard, the URL is as follows: - -+ ----- -https://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/pinboarddata?id= ----- -+ -For a visualization, the URL is as follows: - -+ ----- -https://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/pinboarddata?id=&vizid=%5B%5D ----- -+ -[NOTE] -==== -Make sure you add brackets around the `vizid` parameter. The URL encoding for the opening bracket is `%5B` and the closing bracket is `%5D`. -==== - -+ -. To apply filters to the data, use runtime filters. - -+ -For example, to sort values equal to `red` in the `Color` column for a visualization in a Liveboard, you can pass the runtime filter in the URL query parameters as shown here: - -+ ----- -http://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/pinboarddata -?id=&vizid=%5B%5D -&col1=color&op1=EQ&val1=red ----- - -. After you construct the URL, send a POST request to get data from ThoughtSpot. - -+ -The API returns the data formatted as JSON. -. Retrieve the data from the JSON and embed it in your Web page, Web portal, or application. - -For more information, see xref:runtime-filters.adoc[Runtime filters]. - -[NOTE] -==== -Runtime Filters can also be applied on visualizations or Liveboards embedded in your application. You can specify the runtime filter criteria in the SDK when embedding ThoughtSpot objects. For more information, see xref:embed-a-viz.adoc[Embed a visualization] and xref:embed-pinboard.adoc[Embed a Liveboard]. -==== - - - From 1f9857923ce86421dad3065005cc743178c50163 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 23 Jun 2026 11:02:59 +0530 Subject: [PATCH 047/136] delete unused file --- modules/ROOT/pages/embed-rest-api.adoc | 105 ------------------------- 1 file changed, 105 deletions(-) delete mode 100644 modules/ROOT/pages/embed-rest-api.adoc diff --git a/modules/ROOT/pages/embed-rest-api.adoc b/modules/ROOT/pages/embed-rest-api.adoc deleted file mode 100644 index 2975e633c..000000000 --- a/modules/ROOT/pages/embed-rest-api.adoc +++ /dev/null @@ -1,105 +0,0 @@ -= Embed objects using REST API -:toc: true - -:page-title: Embed data -:page-pageid: embed-data-restapi -:page-description: Embed Data using REST APIs - -You can use the REST API to get an object from ThoughtSpot and embed it in a web page, portal, or application. ThoughtSpot provides an embed link for objects, such as Liveboards and visualizations, using which you can construct the URL required to make an API call. - -To get the embed link for a Liveboard: - -. Log in to ThoughtSpot. -. Navigate to the Liveboard. -. Note the GUID number of the object. -+ -To embed a Liveboard, click *More* image:./images/icon-more-10px.png[the more options menu], and select *Copy embed link*. - -+ -[.widthAuto] -image::./images/copy_pinboard_link.png[Copy embed link, width=auto] - -+ -To get the embed link for a visualization: - -.. Navigate to the table or chart -.. Click *More* image:./images/icon-more-10px.png[the more options menu] in the upper right corner of the table or chart. -.. Click *Copy embed link* icon. -+ -[.widthAuto] -image::./images/copy_link.png[Copy link, width=auto] - -+ -[NOTE] -==== -The *Copy embed link* menu action is available only if Classic Liveboard experience is enabled on your instance. -==== - -. Note the GUID of the object. -. Copy the embed link. -+ -Paste it somewhere so that you can use it later to construct the URL for the REST API call. - -+ -If you want to embed a Liveboard, copy the identifier that appears after `viz/`. - -+ -[.widthAuto] -image::./images/copy_link_pinboard.png[Copy Liveboard link, width=auto] - -+ -For visualizations (table or chart), copy the IDs that appear after `viz/`. - -+ -[.widthAuto] -image::./images/copy_link_viz_pinboard_part.png[Copy visualization link, width=auto] - -. Construct the URL. -+ -For a Liveboard, the URL is as follows: - -+ ----- -https://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/pinboarddata?id= ----- -+ -For a visualization, the URL is as follows: - -+ ----- -https://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/pinboarddata?id=&vizid=%5B%5D ----- -+ -[NOTE] -==== -Make sure you add brackets around the `vizid` parameter. The URL encoding for the opening bracket is `%5B` and the closing bracket is `%5D`. -==== - -+ -. To apply filters to the data, use runtime filters. - -+ -For example, to sort values equal to `red` in the `Color` column for a visualization in a Liveboard, you can pass the runtime filter in the URL query parameters as shown here: - -+ ----- -http://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/pinboarddata -?id=&vizid=%5B%5D -&col1=color&op1=EQ&val1=red ----- - -. After you construct the URL, send a POST request to get data from ThoughtSpot. - -+ -The API returns the data formatted as JSON. -. Retrieve the data from the JSON and embed it in your Web page, Web portal, or application. - -For more information, see xref:runtime-filters.adoc[Runtime filters]. - -[NOTE] -==== -Runtime Filters can also be applied on visualizations or Liveboards embedded in your application. You can specify the runtime filter criteria in the SDK when embedding ThoughtSpot objects. For more information, see xref:embed-a-viz.adoc[Embed a visualization] and xref:embed-pinboard.adoc[Embed a Liveboard]. -==== - - - From d6083eee5f5009ce7a0151461b615b26a7a6f32f Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 23 Jun 2026 13:30:42 +0530 Subject: [PATCH 048/136] deleted a phrase --- modules/ROOT/pages/customize-style-api.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/customize-style-api.adoc b/modules/ROOT/pages/customize-style-api.adoc index c9601176f..252c7f3d7 100644 --- a/modules/ROOT/pages/customize-style-api.adoc +++ b/modules/ROOT/pages/customize-style-api.adoc @@ -129,7 +129,7 @@ Request parameters:: |`name` |Yes -|Display name for the font. Must be unique within the target scope. +|Display name for the font. |`file_content` |Yes From 4268f92bdb0a4cbdaa8e10623028ee0f24f8f6c8 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <76986173+ShashiSubramanya@users.noreply.github.com> Date: Tue, 23 Jun 2026 17:53:18 +0530 Subject: [PATCH 049/136] docs(26.7): update whats-new.adoc with 26.7.0.cl release block - SpotterViz Insight Tiles (Beta) - SCAL-303724 - SpotterViz embed customization - SCAL-311987 - Runtime filters for Insight Tiles - SCAL-309605 - Focused Homepage V4 GA - SCAL-307969 - Liveboard browser cache EA - SCAL-305659 - GCS webhook storage - SCAL-301399 - Saved Chat public APIs - SCAL-290720 - EmbedEvent.SpotterData removal (breaking) - SCAL-309464 --- modules/ROOT/pages/whats-new.adoc | 579 ++++++------------------------ 1 file changed, 103 insertions(+), 476 deletions(-) diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 213c12cfd..5c44035d3 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -69,591 +69,218 @@ For more information, see xref:embed-spotter-viz.adoc[Customizing SpotterViz]. --- [discrete] -==== Focused homepage experience [.version-badge.new]#New# - -A new `HomePage.Focused` enum member (`v4`) is introduced in `AppEmbed` -to enable the V4 homepage experience, which merges the Watchlist and Recents -sections into a single focused view. - -[NOTE] -==== -The V4 homepage experience requires Spotter to be enabled on your -ThoughtSpot instance. -==== - -For more information, see xref:embed-app.adoc#_discovery_experience[Discovery experience]. -// TODO: verify target anchor with the developer-docs team. +==== SpotterViz Insight Tiles [.version-badge.new]#New# [beta betaBackground]^Beta^ ---- +// SOURCE: SCAL-303724, SCAL-313472 -[discrete] -==== New EmbedEvents for SpotterViz [.version-badge.new]#New# +Liveboards now support a new **Insight Tile** type that uses Spotter AI to generate automated textual analysis of the data on your Liveboard. In edit mode, you can add an Insight Tile and specify a prompt or context that defines what the tile should analyze. The tile displays 5–7 AI-generated bullet-point insights with a distinct light blue gradient background. -The SDK introduces two new event identifiers for monitoring SpotterViz -panel activity in embedded Liveboards: - -* `EmbedEvent.SpotterVizMount` + -Emitted when the SpotterViz panel mounts in embed mode. -* `EmbedEvent.SpotterVizPromptSubmit` + -Emitted when a user submits a prompt in the SpotterViz panel. +Key behaviors: ---- +* *Scope selection* — You can set the scope of an Insight Tile to Tab, Group, or an individual Answer. +* *Auto-retriggering* — Insight Tiles automatically regenerate insights on Liveboard load and when Liveboard-level filters change. +* *Localization* — Insights are rendered in the user's configured locale. +Beta limitations: -[discrete] -==== REST API v2 -// TODO: verify if any new Spotter REST API v2 endpoints are introduced specifically in 26.7.0.cl beyond those documented in 26.6.0.cl — confirm with engineering +* Insight Tiles are not rendered in scheduled exports or downloads (a placeholder is shown instead). +* Cross-filter interactions are not supported in this Beta release. +* Pinning Insight Tiles from plugins is not supported. -For information about REST API v2 enhancements in this release, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. +// TODO: verify with engineering — add link to product docs page for Insight Tiles once thoughtspot-docs page is published --- - -[discrete] -==== Visual Embed SDK -The Visual Embed SDK version 1.50.0 includes several new features -and enhancements. For more information, see the -xref:api-changelog.adoc[Visual Embed changelog]. - -|===== - - - -== June 2026 - -**Release version**: ThoughtSpot Cloud 26.6.0.cl + -*Upgrade notes*: No breaking changes. + -*Recommended SDK versions*: Visual Embed SDK v1.49.0 and later - -[.cl-table, cols="2,4", frame=none, grid=none] -|===== -a| -[.cl-label] -*Version 26.6.0.cl* - -a| -[discrete] -==== Chart and table overrides [.version-badge.new]#New# -You can now apply visualization overrides to charts and tables generated from a search query in ThoughtSpot search and full application embedding. The `visualOverrides` property in `SearchViewConfig` and `AppViewConfig` allows developers to apply at the embed initialization time: - -* Chart overrides + -Control legend visibility and position, data label display and per-column filter -thresholds, regression lines, grid lines, axis range and label settings, series -colors, and conditional formatting rules including font and background styling. -* Table overrides + -Control column visibility, text wrapping, row height and padding density, table -theme, and column summary visibility with per-column exceptions. - -For more information, see xref:viz-overrides.adoc[Configuring visualization overrides]. - ---- - -[discrete] -==== Spotter AI and embedding enhancements [.version-badge.new]#New# - -This release introduces the following enhancements for Spotter AI workflows and embedded Spotter applications. - -* Spotter embedding: + -Spotter now includes data literacy skills that help users understand the underlying data model. Users can ask Spotter to explain available data sources, fields, and relationships in plain language within a conversation session. -* Spotter AI APIs: + -** New REST API endpoints to configure and retrieve persistent behavioral xref:spotter-agent-instructions.adoc[instructions for the Spotter agent]. -** New API endpoint xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[stop and cancel a long-running Spotter response]. - ---- - -[discrete] -==== Developer page enhancements -The **Develop** page in the ThoughtSpot UI has been updated with the following enhancements: - -* The **Custom actions** list page now shows the code-based custom actions configured using the Visual Embed SDK. -* Removal of REST API v1 + -The legacy REST Playground v1 has been removed from the left navigation. This change does not affect your current integrations with v1 REST API. ThoughtSpot recommends that you update your integration workflows to use REST API v2. For more information, see xref:rest-api-v1v2-comparison.adoc[REST API v1 to v2 migration]. -* Removal of GraphQL playgrounds + -The menu link to the GraphQL playground has been removed from the UI. - -[discrete] -==== Visual Embed SDK -The Visual Embed SDK version 1.49.0 includes several new features and enhancements. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. - ---- - -[discrete] -==== REST API v2 -This release introduces new API endpoints for Spotter, connections and trusted authentication. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. - -|===== - - -== May 2026 - -**Release version**: ThoughtSpot Cloud 26.5.0.cl + -*Upgrade notes*: ⚠️Includes breaking changes to Spotter APIs. Refer to the xref:rest-apiv2-changelog.adoc[REST API changelog] for more information. + -*Recommended SDK versions*: Visual Embed SDK v1.48.0 and later - - -[.cl-table, cols="2,4", frame=none, grid=none] -|===== -a| -[.cl-label] -*Version 26.5.0.cl* - -a| - - -[discrete] -==== Liveboard downloads - -Continuous Liveboard PDF export [beta betaBackground]^Beta^:: -In PDF downloads, Liveboard tabs can now be rendered in a single page matching the UI layout. This feature can be enabled by setting `isContinuousLiveboardPDFEnabled` to `true` in the SDK. Setting this flag to `false` returns to the paginated PDF view. - -Liveboard download in XLSX and CSV formats:: -Embedded Liveboards can now be downloaded in the PDF, XLSX and CSV file formats. To enable this feature, ensure that the `isLiveboardXLSXCSVDownloadEnabled` parameter is set to `true`. - -Excel exports for pivot tables:: -Pivot table visualizations can now be exported to Excel format. - -For more information, see xref:embed-pinboard.adoc#_liveboard_download_options[Liveboard download options]. - ---- - -[discrete] -==== Visualization edit interface within the Liveboard view - -Users can now edit the underlying query of an answer directly within the Liveboard. When this feature is enabled, the edit button for visualization appears in the answer's floating toolbar when the Liveboard is opened in the edit mode. Clicking the edit button opens the Answer interface preloaded with the answer's current query context. You can make the edits and save the changes without leaving the Liveboard. - ---- - -[discrete] -==== KPI charts in embedded Liveboards - -Embedded Liveboards support advanced controls KPI chart customization. For more information, see link:https://docs.thoughtspot.com/cloud/latest/chart-kpi#advanced[KPI charts]. - ---- - -[discrete] -==== Per-org and per-user timezone control via variables [beta betaBackground]^Beta^ - -You can centrally control timezone behavior per org and per user in embedded deployments using the new template variable `ts_user_timezone` and Variable APIs. - -For multi-org and multi-tenant environments, each tenant org and user can be configured independently, guaranteeing isolation and consistency of time-based analytics across regions. Administrators can reference the timezone variable in formulas to render and filter timestamp data correctly for each embedded user, without separate content per region. - ---- - -[discrete] -==== Timezone-aware keyword filtering [beta betaBackground]^Beta^ -ThoughtSpot now supports resolving relative date and time keywords, such as `today`, `yesterday`, and `last 7 days`, using a configurable per-user or per-Org timezone, instead of the system default timezone on a ThoughtSpot instance. This feature eliminates timezone-based inconsistencies in multi-region embedded deployments and removes the need for custom workarounds. - -For more information, see xref:timezone.adoc[Timezone-aware keywords and filters]. - -[NOTE] -==== -The timezone awareness feature is in Beta and disabled by default. To enable this feature, contact ThoughtSpot Support. -==== - - ---- - -[discrete] -==== Visual Embed SDK -The Visual Embed SDK version 1.48.0 includes several new features and enhancements. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. - ---- - -[discrete] -==== REST API v2 -This release introduces new Spotter API endpoints and modifications to the agent conversation APIs, and deprecates legacy agent endpoints. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. - -|===== - - -== April 2026 - -**Release version**: ThoughtSpot Cloud 26.4.0.cl + -*Upgrade notes*: ⚠️Variable update and delete API and metadata parameterization endpoints are deprecated and replaced with new API endpoints. Refer to xref:rest-apiv2-changelog.adoc#version_26_4_0_cl_april_2026[REST API changelog] and xref:deprecated-features.adoc[Deprecation announcements]. + -*Recommended SDK versions*: Visual Embed SDK v1.47.0 and later - -[.cl-table, cols="2,4", frame=none, grid=none] -|=== - -a| -[.cl-label] -*Version 26.4.0.cl* - -a| - -[discrete] -==== Theme builder in AI mode - -The Theme Builder now has an AI mode that enables developers to explore and preview style customizations for their embedded application’s branding using natural language instructions and uploaded brand assets. You can execute style updates such as applying colors directly from a PDF branding guide, updating all button shapes with higher contrast, matching a header to a dark background based on a screenshot, or importing typography and spacing from a JSON file. In the AI mode, Theme builder interprets your intent and applies the changes instantly. - -For more information, see xref:theme-builder.adoc[Theme builder]. - ---- - - [discrete] -==== Webhook integration -In this release version, the following enhancements are introduced in the webhook configuration and delivery status monitoring workflows: +==== SpotterViz embed customization [.version-badge.new]#New# -Channel validation:: -Administrators can verify the connection status of a webhook channel by sending a test payload in a `POST` request to the `/api/rest/2.0/system/communication-channels/validate` REST API endpoint. For more information, see xref:webhooks-comm-channel.adoc#_validate_communication_channel_configuration[Webhook channel validation]. +// SOURCE: SCAL-311987, SCAL-311988 -Monitor webhook delivery:: -Administrators can also monitor the status of a webhook delivery via a `POST /api/rest/2.0/jobs/history/communication-channels/search` API request. For more information, see xref:webhooks-comm-channel.adoc#_monitor_webhook_delivery_and_job_status[Monitor webhook delivery and job status]. +The Visual Embed SDK now exposes customization APIs for the SpotterViz component in embedded Liveboards. Embed developers can apply the following customizations: -Support for custom HTTP headers in webhook requests:: -When configuring or updating a webhook, you can now specify custom headers to include in every outbound request, in addition to the standard HTTP and authentication headers that ThoughtSpot sends. For more information, refer to the xref:webhooks-lb-schedule.adoc#_create_a_webhook[webhook documentation]. +* CSS variables for styling the SpotterViz panel. +* New embed events and action IDs for SpotterViz interactions. +* Brand customization support via the existing `customization` configuration. +* Host event customization for programmatic control of SpotterViz. ---- - - -[discrete] -==== Spotter embed enhancements -You can now customize the appearance and contents of the chat history sidebar panel in Spotter embedding. - -You can also customize the branding and logo in the Spotter chat interface. - -For more information, see xref:embed-spotter.adoc#_chat_history_panel[Customizing chat history sidebar] and xref:embed-spotter.adoc#_hiding_the_spotter_icon_and_thoughtspot_branding_chat_interface[Hiding logo and brand label in Spotter chat interface]. +For more information, see xref:embed-spotter-viz.adoc[Customizing SpotterViz]. --- [discrete] -==== Liveboard enhancements -The following enhancements are introduced in Liveboard export and filtering workflows. - -Embedding a personalized Liveboard view:: -You can now embed a saved personalized Liveboard view using the `personalizedViewId` and load it along with the `liveboardId` in your app. +==== Runtime filters and parameters for Insight Tiles [.version-badge.new]#New# -Centralized filter modal:: -Liveboard users can modify multiple filters and parameters in a single session using the centralized filter modal. This is an early access feature and disabled by default on ThoughtSpot embedded instances. To enable this feature on embedded Liveboards, set the `isCentralizedLiveboardFilterUXEnabled` to `true`. +// SOURCE: SCAL-309605 -Current period inclusion in rolling date filters:: -The rolling date filters with the **Last ** and **Next ** filter types support including current period. Developers can disable, show, or hide this option using `isThisPeriodInDateFiltersEnabled` or `Action.IncludeCurrentPeriod`. +Runtime filters and parameters passed to an embedded Liveboard are now respected by Insight Tiles. When a runtime filter is applied, Spotter regenerates the tile's AI-generated insights using the filtered data context, ensuring the analysis reflects the current view. -Liveboard PNG export:: -The PNG export workflow in the `/api/rest/2.0/report/liveboard` REST API is enhanced to provide high-resolution PNG files. The legacy PNG workflow is deprecated in 26.4.0.cl. For more information about breaking changes and deprecation guidelines, see xref:deprecated-features.adoc[Deprecation announcements]. For information about the new PNG download workflow, see xref:data-report-v2-api.adoc#_liveboard_report_api[Liveboard report API documentation]. +For more information, see xref:runtime-filter.adoc[Runtime filters] and xref:embed-pinboard.adoc[Embed a Liveboard]. --- - [discrete] -==== Full app embedding -In full application embedded deployments with the V3 navigation and home page experience, the default list page experience is set to ListPage v3 experience. - -The ListPage V3 experience provides a refreshed list layout and styling, including the following enhancements: - -* The **Views** column to show the number of views for each object. -* Sorting options for **Name**, **Author**, and **Views** columns. -* Filter addition by clicking the column header without opening the filter modal. This option is available for **Favorites**, **Views** columns, and **Verified** columns. - -For more information, see xref:full-app-customize.adoc#_customize_list_page_experience[List page customization]. +==== Focused homepage experience [.version-badge.new]#New# ---- +// SOURCE: SCAL-307969 +A new `HomePage.Focused` enum member (`v4`) is introduced in `AppEmbed` +to enable the V4 homepage experience, which merges the Watchlist and Recents +sections into a single focused view. This release marks the General Availability of the focused homepage. -[discrete] -==== Variable API -The variable REST API provides new API endpoints for the following bulk operations: +Improvements in this GA release: -* Bulk deletion: -You can now delete multiple variables in a single API request using the `/api/rest/2.0/template/variables/delete` endpoint. -* Batch update of variable values: -You can now assign and update multiple values to a variable in a single API request using the `/api/rest/2.0/template/variables/{identifier}/update-values` endpoint. +* The Watchlist shows an appropriate message when no comparison data point is available for a metric. +* The Spotter tile is hidden for users who do not have access to a Spotter-enabled data source. +* In Auto mode, the data model selection dialog opens directly when a user initiates a Spotter session. [NOTE] ==== -The `/api/rest/2.0/template/variables/update-values` and `/api/rest/2.0/template/variables/{identifier}/delete` endpoints are now deprecated. Use the new `/api/rest/2.0/template/variables/{identifier}/update-values` and `/api/rest/2.0/template/variables/delete` endpoints for the variable update and delete operations instead. +The V4 homepage experience requires Spotter to be enabled on your +ThoughtSpot instance. ==== -For more information, see xref:variables.adoc[Variables documentation]. +For more information, see xref:embed-app.adoc#_discovery_experience[Discovery experience]. +// TODO: verify target anchor with the developer-docs team. --- - [discrete] -==== Metadata parameterization -You can now parameterize multiple properties of metadata objects using `POST /api/rest/2.0/metadata/parameterize-fields`. The legacy endpoint `/api/rest/2.0/metadata/parameterize` is deprecated in 26.4.0.cl and later versions, and is replaced with the new endpoint to allow updating multiple fields in a single API request. +==== Liveboard browser cache refresh — Early Access [.version-badge.new]#New# -For more information, see xref:metadata-parameterization.adoc[Metadata parameterization documentation]. +// SOURCE: SCAL-305659 ---- - - -[discrete] -==== Collections [beta betaBackground]^Beta^ -ThoughtSpot embedded users can now use REST APIs v2 to organize different ThoughtSpot objects into organizational containers called *Collections*. These objects can be Liveboards, Answers, data models, tables, and even other Collections. +The Liveboard browser cache feature is now in Early Access. When `enableLiveboardDataCache` is set to `true` in your `LiveboardEmbed` configuration, ThoughtSpot caches Liveboard visualization data in the browser to significantly reduce reload times on revisit. -For more information, see xref:collections.adoc[Collections]. +For SDK event and action IDs, see the xref:api-changelog.adoc#_liveboard_browser_cache_refresh[Visual Embed changelog — Liveboard browser cache refresh]. -[NOTE] -==== -These APIs are currently in beta and turned off by default on ThoughtSpot instances. To enable this feature on your instance, contact ThoughtSpot Support. -==== --- [discrete] -==== Visual Embed SDK -For information about the new features and enhancements introduced in Visual Embed SDK version 1.46.0, see the xref:api-changelog.adoc[Visual Embed changelog]. - - -[discrete] -==== REST API v2 -For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. - ---- -|=== - -== March 2026 - -**Release version**: ThoughtSpot Cloud 26.3.0.cl + -*Upgrade notes*: ⚠️Includes feature deprecations. Refer to xref:rest-apiv2-changelog.adoc#_custom_access_token_api[REST API changelog] and xref:deprecated-features.adoc[Deprecation announcements]. + -*Recommended SDK versions*: Visual Embed SDK v1.46.0 and later - -[.cl-table, cols="2,4", frame=none, grid=none] -|=== - -a| -[.cl-label] -*Version 26.3.0.cl* - -a| -[discrete] -==== Amazon S3 storage destination for webhook delivery -You can now configure ThoughtSpot to deliver webhook payloads and attachments directly into your own Amazon S3 storage using secure AWS cross-account access. To enable this integration, your AWS administrator must create an IAM role with S3 permissions and trust policy, and then register a webhook in ThoughtSpot to deliver the payloads and attachments directly to your S3 bucket. - -For more information, see xref:webhooks-s3-storage.adoc[Amazon S3 storage integration for webhook delivery]. - ---- - -[discrete] -==== Host event enhancements for context-aware routing - -HostEvents in the Visual Embed SDK are enhanced to improve event routing and context targeting in ThoughtSpot embedded applications. +==== New EmbedEvents for SpotterViz [.version-badge.new]#New# -Developers can use the page context framework in the SDK to route host events to a specific UI layer and align user experience with the product UI behavior in multi-modal contexts. +The SDK introduces two new event identifiers for monitoring SpotterViz +panel activity in embedded Liveboards: -For more information, see xref:events-context-aware-routing.adoc[Context-based execution of host events]. +* `EmbedEvent.SpotterVizMount` + +Emitted when the SpotterViz panel mounts in embed mode. +* `EmbedEvent.SpotterVizPromptSubmit` + +Emitted when a user submits a prompt in the SpotterViz panel. --- [discrete] -==== JWT-based ABAC implementation -The legacy JWT-based approach that uses `filter_rules` and `parameter_values` to implement Attribute-Based Access Control (ABAC) is deprecated. - -As part of this deprecation, the following changes have been introduced to the custom authentication token API workflow and REST API Playground: +==== GCS storage integration for webhook delivery [.version-badge.new]#New# -* The `filter_rules` parameter on the custom token authentication page in the REST API Playground is no longer available for new configurations. This change does not affect your existing implementation. +// SOURCE: SCAL-301399, SCAL-304083, SCAL-310002 -* The `parameter_values` property is not deprecated in version 26.3.0.cl and remains supported until further notice. However, using parameter values for row-level security use cases will ultimately be deprecated in an upcoming release. +Google Cloud Storage (GCS) buckets can now be configured as a storage destination for webhook payload delivery on GCP-hosted ThoughtSpot clusters. This extends the existing Amazon S3 webhook storage integration to bring GCS parity for GCP environments. -Existing ABAC implementations that use `filter_rules` will continue to function until further notice. However, we strongly recommend migrating your legacy ABAC implementation to the ABAC via RLS method that uses custom variables. For migration steps, refer to the xref:abac-migration-guide.adoc[ABAC migration guide]. +A storage config API endpoint returns the GCP Service Account details required to configure IAM permissions on your GCS bucket. -For new deployments, use ABAC via RLS with custom variables and pass data security attributes through the `variable_values` property in the custom access token, and define your RLS rules based on those variables. For more information, see xref:abac_rls-variables.adoc[ABAC via RLS]. +For more information, see xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery]. --- [discrete] -==== Spotter coaching access across published Orgs -Starting with the 26.3.0.cl release, ThoughtSpot supports publishing Spotter coaching information to other Orgs. Coaching changes from the primary Org are synchronized with the data models published in secondary Orgs. +==== Saved Chat public APIs [.version-badge.new]#New# -Administrators and users with edit access to data models can programmatically control user access to Spotter coaching information using the object privilege REST API endpoint, `/api/rest/2.0/security/metadata/manage-object-privilege`. They can assign `SPOTTER_COACHING_PRIVILEGE` to other users and user groups, allowing access to the coaching information without requiring data model editing or administration privileges. +// SOURCE: SCAL-290720, SCAL-313991 -Users and groups with `SPOTTER_COACHING_PRIVILEGE` can import and export coaching TML on data models in the source and destination Orgs where the model is published, and can also share these objects with other users and groups. +ThoughtSpot now provides public REST API endpoints and Visual Embed SDK host events to manage saved Spotter conversations from a host application. Embed developers can build fully headless conversation history experiences outside the ThoughtSpot iframe. -For more information, see xref:spotter-nl-instructions.adoc#_spotter_data_model_instructions_access[Spotter data model instructions access]. +New REST API endpoint::: +`GET /api/rest/2.0/ai/agent/conversations` — Retrieve a paginated list of saved conversations for the authenticated user. ---- +New SDK host events::: +* `HostEvent.LoadChat` — Load a specific conversation by ID into the embedded Spotter interface. +* `HostEvent.DeleteChat` — Delete a specific conversation by ID. +* `HostEvent.RenameChat` — Rename a specific conversation by ID. -[discrete] -==== Full application embedding -The height and aspect ratio of the logo in the top-left corner of the ThoughtSpot application interface have been updated for visual alignment and consistency across pages. This enhancement is available only in the V3 navigation and home page experience. - -If you have embedded the full application with the V3 navigation experience, you may notice that the logo appears smaller in the top navigation. This is a design update and does not require any configuration changes to your current embedding implementation. However, we recommend that you review the logo size and appearance, and adjust your custom logo if necessary. - -For information about adding a custom logo image, see xref:customize-style.adoc#logo-change[Customize application logo and favicon]. - ---- - -[discrete] -==== Visual Embed SDK -For information about the new features and enhancements introduced in Visual Embed SDK version 1.46.0, see the xref:api-changelog.adoc[Visual Embed changelog]. +For more information, see xref:saved-conversations-api.adoc[Saved Chat public APIs]. --- [discrete] ==== REST API v2 -For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. - ---- - -|=== - -== February 2026 -**Release version**: ThoughtSpot Cloud 26.2.0.cl + -*Upgrade notes*: ⚠️Includes API parameter deprecations. Refer to xref:rest-apiv2-changelog.adoc[REST API changelog] and xref:deprecated-features.adoc[Deprecation announcements]. + -*Recommended SDK versions*: Visual Embed SDK v1.45.0 and later - - -[.cl-table, cols="2,4", frame=none, grid=none] -|=== -a| -[.cl-label] -*Version 26.2.0.cl* - -a| -[discrete] -==== SpotterCode extension for IDEs [earlyAccess eaBackground]#Early Access# - -ThoughtSpot introduces SpotterCode, an AI-powered Model Context Protocol (MCP) extension for Integrated Development Environments (IDEs) such as Cursor, Visual Studio Code, and Claude Code. When integrated, SpotterCode enables the AI agent in the IDE to access ThoughtSpot SDKs and API documentation resources and provide in-context coding assistance to developers embedding ThoughtSpot content within their applications. - -SpotterCode is available as an Early Access feature and can be integrated with development environments that support MCP servers and tools. For more information, see xref:spottercode.adoc[SpotterCode], xref:spottercode-integration.adoc[Integrating SpotterCode in IDEs], and xref:spottercode-prompt-guide.adoc[SpotterCode prompting guide]. - ---- - -[discrete] -==== Spotter 3 experience [earlyAccess eaBackground]#Early Access# -You can now embed the Spotter 3 experience, which introduces several new capabilities, agentic analytics, and enhanced user experience. Spotter 3 is an Early Access feature and is disabled by default on ThoughtSpot embedded instances. - -For more information, see xref:embed-ai-analytics.adoc[Embed AI Search and Analytics] and xref:embed-spotter.adoc[Spotter embedding documentation]. - ---- - -[discrete] -==== Rate limits for REST APIs -To prevent excessive requests from reaching application servers and ensure API stability and service quality for REST API users, ThoughtSpot enforces rate limits on public API requests per client IP. These limits are applied globally at the cluster level for all public API requests, including calls to both REST API v1 and v2 endpoints. -//Administrators can adjust these limits for their ThoughtSpot deployments as needed. - -For more information, see xref:about-rest-apis.adoc#_rate_limits_for_api_requests[Rate limits for REST APIs]. - ---- - -[discrete] -==== Security settings via REST APIs -Security settings that ensure data security and a seamless embedded user experience can now be configured through REST APIs v2. Administrators and developers can configure allowlists for: - -* Content Security Policy (CSP) -* Cross-origin Resource Sharing (CORS) -* Authentication attributes -* Access control settings +// TODO: verify if any new Spotter REST API v2 endpoints are introduced specifically in 26.7.0.cl beyond those documented in 26.6.0.cl — confirm with engineering -For more information, see xref:security-settings.adoc[Security Settings]. +For information about REST API v2 enhancements in this release, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. --- [discrete] -==== WebSocket support for external tools -ThoughtSpot supports secure WebSocket (`wss://`) endpoints for external tool script integrations, for example, tools that open WebSocket connections from the browser. - -To allow a WebSocket host, add the corresponding `wss://` URL to both your CSP allowlists. Only hosts explicitly listed with the `wss://` protocol are permitted. Existing `https://` entries in the allowlists remain unchanged and continue to function as expected. +==== Visual Embed SDK [.version-badge.breaking]#Breaking# -For more information, see xref:3rd-party-script.adoc#_allow_websocket_endpoints[External tools and script integration]. +// SOURCE: SCAL-309464 ---- +The Visual Embed SDK version 1.50.0 includes several new features, enhancements, and a breaking change. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. +⚠️ *Breaking change*: `EmbedEvent.SpotterData` has been removed. This event was never emitted in Spotter 3 and was superseded by `EmbedEvent.PreviewSpotterData`. Update your integration code to use `EmbedEvent.PreviewSpotterData`. -[discrete] -==== Visual Embed SDK -For information about the new features and enhancements introduced in Visual Embed SDK version 1.45.0, see the xref:api-changelog.adoc[Visual Embed changelog]. - ---- - -[discrete] -==== REST API v2 -For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. +|===== ---- -|=== -== January 2026 +== June 2026 -**Release version**: ThoughtSpot Cloud 10.15.0.cl + +**Release version**: ThoughtSpot Cloud 26.6.0.cl + *Upgrade notes*: No breaking changes. + -*Recommended SDK versions*: Visual Embed SDK v1.44.0 and later - +*Recommended SDK versions*: Visual Embed SDK v1.49.0 and later [.cl-table, cols="2,4", frame=none, grid=none] -|=== +|===== a| [.cl-label] -*Version 10.15.0.cl* +*Version 26.6.0.cl* a| [discrete] -==== Theme Builder -Theme Builder is now generally available (GA) and will be rolled out to all ThoughtSpot instances in customer deployments over the next few weeks. - -When this feature is enabled on your instance, you can access it from the *Develop* page in ThoughtSpot and use it to customize styles and UX themes directly within the product. - -For more information, see xref:theme-builder.adoc[Theme Builder]. - ---- - -[discrete] -==== V3 navigation and home page experience - -The new V3 navigation and home page experience is now generally available (GA) and can be enabled on ThoughtSpot embedded instances. - -The default UI experience in full application embedding remains the classic (V1) experience until further notice. Developers embedding the full ThoughtSpot application can enable the V3 experience in their applications by setting the appropriate configuration options in their embed code. - -For more information, see xref:full-app-customize.adoc[Customizing full application embedding]. - ---- - -[discrete] -==== Formula variables in RLS rules - -You can now create formula variables using the Variable REST API and use these variables in RLS rules for a specific data context and in ABAC token requests to dynamically assign security attributes to users. - -For more information, see xref:abac_rls-variables.adoc[ABAC via RLS with variables]. - ---- - -[discrete] -==== Spotter APIs - -ThoughtSpot introduces new REST APIs for the following Spotter workflows: +==== Chart and table overrides [.version-badge.new]#New# +You can now apply visualization overrides to charts and tables generated from a search query in ThoughtSpot search and full application embedding. The `visualOverrides` property in `SearchViewConfig` and `AppViewConfig` allows developers to apply at the embed initialization time: -* To send queries to a conversation session with the Spotter agent -* To set natural language (NL) instructions on a model to coach the Spotter system -* To fetch NL instructions configured on a model +* Chart overrides + +Control legend visibility and position, data label display and per-column filter +thresholds, regression lines, grid lines, axis range and label settings, series +colors, and conditional formatting rules including font and background styling. +* Table overrides + +Control column visibility, text wrapping, row height and padding density, table +theme, and column summary visibility with per-column exceptions. -For more information, see xref:spotter-apis.adoc[Spotter APIs]. +For more information, see xref:viz-overrides.adoc[Configuring visualization overrides]. --- [discrete] -==== Embed events and parameters to intercept API calls -You can now intercept API calls from the embedded ThoughtSpot application using the `interceptUrls` attribute in the Visual Embed SDK. This feature lets you control API requests in your embedding application and use embed events to modify, block, or handle requests before they are sent to the backend. For more information, see xref:api-intercept.adoc[Intercept API calls and search requests]. - ---- +==== Spotter AI and embedding enhancements [.version-badge.new]#New# -[discrete] -==== Icon customization enhancements +This release introduces the following enhancements for Spotter AI workflows and embedded Spotter applications. -You can now replace or customize the chart switcher toggle and icons in the Charts drawer on an Answer or visualization page using SVG sprites. Previously, these icons were fixed to ThoughtSpot defaults and were not configurable. In the new version, these icons are available as SVG components and can be replaced by developers through the xref:customize-icons.adoc[icon customization framework] as needed. +* Spotter embedding: + +Spotter now includes data literacy skills that help users understand the underlying data model. Users can ask Spotter to explain available data sources, fields, and relationships in plain language within a conversation session. +* Spotter AI APIs: + +** New REST API endpoints to configure and retrieve persistent behavioral xref:spotter-agent-instructions.adoc[instructions for the Spotter agent]. +** New API endpoint xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[stop and cancel a long-running Spotter response]. --- [discrete] -==== Mobile Embed SDK -The SDKs for embedding ThoughtSpot components in mobile apps are now Generally Available (GA). For more information about the SDKs and how to embed a ThoughtSpot component in a mobile app, see xref:mobile-embed.adoc[Mobile embed documentation]. +==== Developer page enhancements +The **Develop** page in the ThoughtSpot UI has been updated with the following enhancements: ---- +* The **Custom actions** list page now shows the code-based custom actions configured using the Visual Embed SDK. +* Removal of REST API v1 + +The legacy REST Playground v1 has been removed from the left navigation. This change does not affect your current integrations with v1 REST API. ThoughtSpot recommends that you update your integration workflows to use REST API v2. For more information, see xref:rest-api-v1v2-comparison.adoc[REST API v1 to v2 migration]. +* Removal of GraphQL playgrounds + +The menu link to the GraphQL playground has been removed from the UI. [discrete] ==== Visual Embed SDK -For information about the new features and enhancements introduced in Visual Embed SDK version 1.44.0, see xref:api-changelog.adoc[Visual Embed changelog]. - ---- - -[discrete] -==== Custom calendar APIs +The Visual Embed SDK version 1.49.0 includes several new features and enhancements. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. --- [discrete] -==== REST API -For information about REST API v2 enhancements, see xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. +==== REST API v2 +This release introduces new API endpoints for Spotter, connections and trusted authentication. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. -|=== +|===== From 0bf0c08d0869841d59008b18194f4fe79bb74e1f Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <76986173+ShashiSubramanya@users.noreply.github.com> Date: Tue, 23 Jun 2026 17:54:37 +0530 Subject: [PATCH 050/136] docs(26.7): add SDK v1.50.x changelog entry - SpotterViz embed customization events and actions - SCAL-311987 - Saved Chat host events (LoadChat, DeleteChat, RenameChat) - SCAL-290720 - BREAKING: Remove EmbedEvent.SpotterData - SCAL-309464 - Deprecation notice for EmbedEvent.SpotterData --- modules/ROOT/pages/api-changelog.adoc | 1878 ++----------------------- 1 file changed, 109 insertions(+), 1769 deletions(-) diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index 0b682e3ed..9331eeda7 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -1,1849 +1,189 @@ -= Visual Embed changelog += Visual Embed SDK changelog :toc: true -:toclevels: 1 +:toclevels: 2 -:page-title: Changelog -:page-pageid: embed-sdk-changelog -:page-description: Changes to the SDK and APIs +:page-title: Visual Embed SDK changelog +:page-pageid: api-changelog +:page-description: Changelog for the Visual Embed SDK -This changelog lists only the changes introduced in the Visual Embed SDK. For information about new features and enhancements available for embedded analytics, see xref:whats-new.adoc[What's New]. +This page documents the changes introduced in each release of the Visual Embed SDK. For information about the REST API v2.0 changes, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. -== Version 1.49.x, June 2026 +== Version 1.50.x, July 2026 + +// SOURCE: SCAL-311987, SCAL-290720, SCAL-309464, SCAL-303724, SCAL-309605 [width="100%" cols="1,4"] |==== |[tag greenBackground]#NEW FEATURE# a| [discrete] -===== Visual overrides for charts and tables -The SDK introduces the `visualOverrides` object in `SearchViewConfig` and -`AppViewConfig`, enabling embed developers to apply chart and table display -customizations to the new answers from an embedded Search data interface at initialization time. - -The `visualOverrides` object provides the following customization controls to modify the chart and table display: - -* `legend`: control legend visibility, position, and color palette of charts. -* `dataLabel` attribute for data labels and per-column label filters. -* `display` attributes for such as regression line overlay and grid line visibility in charts and table themes and content density in tables. -* `axis` property for axis name and label visibility and fixed y-axis range. -* `columns` property for per-column series color and conditional formatting rules. -* `updateMaskPaths` property for partial updates -* `columns` property for column visibility, text wrapping, conditional formatting, and column summary in tables. - -For more information, see xref:viz-overrides.adoc[Visualization overrides]. - -//|[tag greenBackground]#NEW FEATURE# a| -//[discrete] -//===== New charts library - -//The SDK introduces the `newChartsLibrary` parameter to enable the new Muze charting library in Liveboard and full application embedding. - -|[tag greenBackground]#NEW FEATURE# a| -[discrete] -===== Liveboard browser cache refresh +===== SpotterViz embed customization -The SDK introduces the following event IDs and action ID to support programmatic and user-triggered browser cache refresh for the Liveboard ChartViz containers. These APIs require `enableLiveboardDataCache` to be enabled in your embed configuration. +// SOURCE: SCAL-311987, SCAL-311988 -Events:: +The SDK introduces the following customization APIs for the SpotterViz component embedded in Liveboards. -* `EmbedEvent.RefreshLiveboardBrowserCache` + -Emitted when a user clicks the *Refresh* button in the Liveboard header to clear the browser cache. +`SpotterVizConfig` interface:: +A new `SpotterVizConfig` interface is available on `LiveboardViewConfig` and `AppViewConfig` via the `spotterViz` property. It exposes the following options: ++ +* `brandName` — Custom brand name displayed in the SpotterViz panel header. +* `headline` — Custom headline text for the SpotterViz panel. +* `description` — Custom description text shown below the headline. +* `inputPlaceholder` — Custom placeholder text for the Spotter chat input. +* `starterPrompts` — Array of `SpotterVizStarterPrompt` objects to replace default prompt suggestions. ++ +// TODO: verify with engineering — confirm full list of SpotterVizConfig properties and their types -* `HostEvent.RefreshLiveboardBrowserCache` + -Allows the host application to programmatically trigger a browser cache refresh for all visualization containers on the embedded Liveboard. +CSS variables:: +SpotterViz exposes CSS custom properties to allow visual styling of the tile. Apply these variables using the `customCSS` configuration in your `LiveboardEmbed` initialization. ++ +// TODO: verify with engineering — provide the authoritative list of CSS variable names and their defaults (for example, --ts-spotterviz-background, --ts-spotterviz-text-color) -New action ID:: +Embed events:: -* `Action.RefreshLiveboardBrowserCache` + -Action ID to control the visibility of the *Refresh* button that clears the browser cache and fetches new data for Liveboard ChartViz containers. +* `EmbedEvent.SpotterVizMount` + +Emitted when the SpotterViz panel mounts in embed mode. -|[tag greenBackground]#NEW FEATURE# a| -[discrete] -===== Spotter file upload -The SDK introduces the following configuration parameters in `SpotterChatViewConfig` to enable and control file uploads in the embedded Spotter chat interface. +* `EmbedEvent.SpotterVizPromptSubmit` + +Emitted when a user submits a prompt in the SpotterViz panel. -* `spotterFileUploadEnabled` + -When set to `true`, enables the file upload feature in the Spotter chat panel. +// TODO: verify with engineering — confirm whether additional EmbedEvents are introduced for Insight Tile load and error states -* `spotterFileUploadFileTypes` + -Restricts the file types allowed for upload in the Spotter chat panel. Accepts a `SpotterFileUploadFileTypes` object. -|==== +Actions:: +// TODO: verify with engineering — confirm Action enum names for SpotterViz visibility control (for example, Action.InsightTileRetrigger) +For more information, see xref:embed-spotter-viz.adoc[Customizing SpotterViz]. -== Version 1.48.x, May 2026 -[width="100%" cols="1,4"] -|==== |[tag greenBackground]#NEW FEATURE# a| [discrete] -===== Liveboard embedding -The SDK includes the following new features and enhancements in Liveboard embedding. - -Continuous Liveboard layout in PDF downloads [beta betaBackground]^Beta^:: - -When set to `true`, the `isContinuousLiveboardPDFEnabled` enables the Liveboard tab to render on a single page that matches the exact UI layout you see in ThoughtSpot. This update addresses the issue where visualizations for PDF downloads were split across multiple A4 pages regardless of how they appear on screen. This feature is in beta and can be enabled by setting `isContinuousLiveboardPDFEnabled` to `true`. - -New events and action IDs;; - -* `EmbedEvent.DownloadLiveboardAsContinuousPDF` + -Emits when the download action is triggered. -* `HostEvent.DownloadLiveboardAsContinuousPDF` + -Programmatically triggers the download action to export the PDF with a continuous Liveboard layout. -* `Action.DownloadLiveboardAsContinuousPDF` + -Action ID to control the visibility of download action that exports continuous PDFs. - -Liveboard download actions:: - -The following action IDs are introduced in the SDK for the download buttons at the Liveboard level: - -* `Action.DownloadLiveboard` + -* `Action.DownloadLiveboardAsXlsx` + -* `Action.DownloadLiveboardAsCsv` - -Test email for Liveboard scheduled jobs:: - -The SDK introduces the `isSendNowLiveboardSchedulingEnabled` to enable the **Send now** option for the Liveboard scheduled jobs. This option allows Liveboard users to send a test email notification to either themselves or the intended recipients of the Liveboard scheduled alerts. +===== Insight Tiles — runtime filter and parameter support -New events and action IDs;; +// SOURCE: SCAL-309605 -* `EmbedEvent.SendTestScheduleEmail` + -Emits when *Send now* button is clicked. -* `HostEvent.SendTestScheduleEmail` + -Programmatically triggers the Send now action to send a test email notification for a Liveboard scheduled job. -* `Action.SendTestScheduleEmail` + -Action ID to disable, show, or hide the **Send now** button on the Liveboard schedule page. +Runtime filters and parameters passed to `LiveboardEmbed` are now forwarded to Insight Tiles (AI tiles). When a runtime filter is applied, the Insight Tile regenerates its AI-generated insights using the filtered data context. -|[tag greenBackground]#NEW FEATURE# a| - -[discrete] -===== Spotter embedding - -The SDK introduces the following action IDs to control the visibility of specific UI components in chat panel of the embedded Spotter interface: +No SDK configuration changes are required. Runtime filters already passed via `runtimeFilters` in `LiveboardViewConfig` are automatically applied to Insight Tiles on the same Liveboard. -* `Action.SpotterChatConnectorResources` + -For the connector resources section in the Spotter chat interface. -* `Action.SpotterChatConnectors` + -For the connectors panel section in the Spotter chat interface. -* `Action.SpotterChatModeSwitcher` + -For the mode switcher in the Spotter chat interface. +For more information, see xref:runtime-filter.adoc[Runtime filters]. |[tag greenBackground]#NEW FEATURE# a| - [discrete] -===== Event handling -Note the following changes: - -EmbedEvent:: - -* `EmbedEvent.Subscribed` + -The SDK introduces the `EmbedEvent.Subscribed` to emit an event when a HostEvent listener is registered. You can use this event to dispatch host events during the initial load without race conditions. This is particularly useful for Spotter, where host events such as `HostEvent.ResetSpotterConversation` may be triggered immediately after load. -* `EmbedEvent.Error` + -The `EmbedEvent.Error` now fires on HostEvent payload validation failures. -* `EmbedEvent.ChangePersonalizedView` + -Emits when a user selects a different Personalized View or resets to default. - -HostEvent:: -* `HostEvent.GetExportRequestForCurrentPinboard` [.version-badge.breaking]#Breaking# + -The response payload of the `GetExportRequestForCurrentPinboard` passthrough -host event has been updated to include a `type` discriminator field, making it -consistent with the shape of other host event responses. It now returns `{ data: { v2Content }, type }` instead of `{ v2Content }` directly. This enhancement introduces a breaking change for any code that reads `result.v2Content` directly. Update your integration workflows to use `result.data.v2Content`. - -* `HostEvent.SelectPersonalizedView` + -Triggers the selection of a specific Personalized View and resets the default view on a Liveboard. - -⚠️Deprecated events and action IDs️:: -The following events are deprecated and replaced with new event IDs. - -* `EmbedEvent.UpdatePersonalisedView`. Use `EmbedEvent.UpdatePersonalizedView`. -* `EmbedEvent.SavePersonalisedView`. Use `EmbedEvent.SavePersonalizedView`. -* `EmbedEvent.DeletePersonalisedView`. Use `EmbedEvent.DeletePersonalizedView`. -* `HostEvent.ResetLiveboardPersonalisedView`. Use `HostEvent.ResetLiveboardPersonalizedView`. -* `Action.PersonalisedViewsDropdown`. Use `Action.PersonalizedViewsDropdown`. -* `Action.OrganiseFavourites`. Use `Action.OrganizeFavorites`. - - -|==== - - -== Version 1.47.x, April 2026 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| **Spotter chat history sidebar customization** - -The SDK introduces the `SpotterSidebarViewConfig` interface and the `spotterSidebarConfig` object with configuration controls to customize the appearance and contents of the chat history panel. Developers can use the following properties in the `spotterSidebarConfig` object to enable or disable chat history panel and customize the contents of the sidebar when enabled: - -* `enablePastConversationsSidebar` + -Controls the visibility of the past conversations sidebar panel. The chat history panel is disabled by default in embed view. When this property in `spotterSidebarConfig` is specified, it takes precedence over the standalone `enablePastConversationsSidebar` setting, which is deprecated from v1.47.0. - -* `spotterSidebarTitle` + -Allows adding custom title text for the sidebar header. - -* `spotterSidebarDefaultExpanded` + -Sets the default state of the sidebar to expanded or collapsed view. - -* `spotterChatRenameLabel` + -Allows setting a custom label for the **Rename** action in the conversation edit menu. - -* `spotterChatDeleteLabel` + -Allows setting a custom label for the **Delete** action in the conversation edit menu. +===== Saved Chat host events -* `spotterDeleteConversationModalTitle` + -Allows editing the title text of the chat delete confirmation modal. +// SOURCE: SCAL-290720, SCAL-313991 -* `spotterPastConversationAlertMessage` + -Sets a custom message text for the past conversation banner alert. Defaults to the translated alert message. +The SDK introduces the following host events for managing saved Spotter conversations from the host application. These events complement the new REST API endpoints for saved conversations. -* `spotterBestPracticesLabel` + -Allows customizing the label for the best practices button in the sidebar footer. - -* `spotterDocumentationUrl` + -The best practices documentation link shown in the sidebar footer. You can customize the link by specifying the full URL. - -* `spotterConversationsBatchSize` + -Sets the number of conversations to fetch per batch when loading conversation history. Default is `30`. - -* `spotterNewChatButtonTitle` + -Allows customizing the title text for the **New chat** button in the sidebar. - -|[tag redBackground]#DEPRECATED# a| **Standalone `enablePastConversationsSidebar` attribute in Spotter embed** - -The standalone `enablePastConversationsSidebar` property on `SpotterEmbedViewConfig` and `AppViewConfig` is deprecated from SDK 1.47.0 and ThoughtSpot 26.4.0.cl. - -Use `enablePastConversationsSidebar` in the `spotterSidebarConfig` instead. When both are defined, the property in the `spotterSidebarConfig` object takes precedence. - -[source,javascript] +* `HostEvent.LoadChat` + +Loads a specific saved conversation by ID into the embedded Spotter interface. + ++ +[source,JavaScript] ---- -// Deprecated -enablePastConversationsSidebar: false, - -// Recommended -spotterSidebarConfig: { - enablePastConversationsSidebar: true, - //... other config properties -} +spotterEmbed.trigger(HostEvent.LoadChat, { chatId: '' }); ---- -|[tag greenBackground]#NEW FEATURE# a| **Spotter chat UI branding** - -The SDK introduces the `SpotterChatViewConfig` interface for customizing branding in Spotter tool response cards. You can pass these parameters as the `spotterChatConfig` object properties in `SpotterEmbed`, `AppEmbed`, or `LiveboardEmbed` where Spotter interface is used. - -* `hideToolResponseCardBranding` + -When set to `true`, hides the ThoughtSpot logo and icon in tool response cards. The branding label prefix is controlled separately via `toolResponseCardBrandingLabel`. Default value is `false`. - -* `toolResponseCardBrandingLabel` + -Custom label to replace the `ThoughtSpot` prefix in tool response cards. Set to an empty string (`''`) to hide the prefix entirely. - -[NOTE] -==== -These settings do not affect the external MCP tool branding. -==== - -|[tag greenBackground]#NEW FEATURE# a|**Liveboard embed enhancements** - -Personalized Liveboard view:: - -The `personalizedViewId` property allows embedding a saved personalized view of a Liveboard. A personalized view is a saved configuration that includes specific filter selections and changes applied by a user. To embed a personalized view of Liveboard, specify the GUID of the saved personalized view to load along with `liveboardId`. - -Centralized Liveboard filter setting:: - -When set to `true`, the `isCentralizedLiveboardFilterUXEnabled` enables displaying a unified modal to manage and update multiple filters at once, replacing the older individual filter interactions. This feature is disabled by default on ThoughtSpot Embedded instances. - -|[tag greenBackground]#NEW FEATURE# a|**Option to include current period in rolling date filters** - -If the current period inclusion in rolling date filters feature is enabled on your instance, the rolling date filters options such as **Last ** and **Next ** for the Liveboards and Answers in the embed view will allow you to include current period. For example, when you define a date range such as "Last 2 months", the date filter interface displays the **Include this month** checkbox. -To disable this feature, use the `isThisPeriodInDateFiltersEnabled` setting. To hide, show, or disable this option in the embed view, use the action ID, `Action.IncludeCurrentPeriod`. -|==== - - -== Version 1.46.x, March 2026 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| **Host events with page context framework** - -The Visual Embed SDK introduces the HostEvent V2 framework for improved handling and execution of host events in embedded ThoughtSpot experiences with multi-layer UI interactions. The v2 framework supports the page context feature, which tracks the top-most active layer in the user's current context. Developers can use this feature to route events based on the user's current context or set a specific target context for precise and predictable handling of host events. - -* To enable this feature, set `useHostEventsV2` to `true`. -* To retrieve the current context, use `getCurrentContext()`. -* To set a target context for a host event, use xref:ContextType.adoc[ContextType]. - -For more information, refer to the xref:events-context-aware-routing.adoc[Host events documentation]. - -|[tag redBackground]#DEPRECATED# a| **dataPanelV2** - -The `dataPanelV2` parameter is deprecated and can no longer be used to switch between the classic and new data panel experience. By default, the new data panel v2 experience is enabled on all ThoughtSpot embedded instances. - -|[tag greenBackground]#NEW FEATURE# a| **Spotter experience** -The SDK includes the following parameters, action IDs, and events to customize the Spotter embed experience. - -Chat history sidebar customization:: - -//* `SpotterSidebarViewConfig` interface with configuration parameters for customizing the visibility and appearance of the chat history sidebar. -//* `spotterSidebarConfig` properties for customizing the appearance and available options in the chat history sidebar. -* Action IDs for customizing the visibility and status of actions in the embedded Spotter interface: -** `Action.DataModelInstructions` for the data model instructions icon. -** `Action.SpotterSidebarHeader` for the chat history sidebar header -** `Action.SpotterSidebarFooter` for the chat history sidebar footer -** `Action.SpotterSidebarToggle` for the chat history toggle that expands or collapses the sidebar. -** `Action.SpotterNewChat` for the new chat icon in the chat history sidebar. -** `Action.SpotterPastChatBanner` for the banner in the chat history sidebar. -** `Action.SpotterChatMenu` for the chat menu component in the chat history sidebar. -** `Action.SpotterChatRename` for **Rename** action in the chat menu of a saved chat. -** `Action.SpotterChatDelete` for **Delete** action in the chat menu of a saved chat. -//** `Action.SpotterDocs` for best practices documentation icon in the chat history sidebar. - -Events:: -* `HostEvent.DataModelInstructions` + -Opens the Data Model instructions modal. -* `EmbedEvent.DataModelInstructions` + -Is emitted when a user clicks the Data Model instructions icon in the Spotter interface. -* `EmbedEvent.SpotterConversationRenamed` + -Is emitted when a user renames a saved chat. -* `EmbedEvent.SpotterConversationDeleted` + -Is emitted when a saved chat is deleted. -* `EmbedEvent.SpotterConversationSelected` + -Is emitted when a saved chat is selected in the chat history sidebar. - -|[tag greenBackground]#NEW FEATURE# | `enableLinkOverridesV2` + - -Use this configuration setting to override ThoughtSpot URLs on hover or when opening in a new tab. This is recommended over the earlier `linkOverride` flag for a better user experience. - -|[tag greenBackground]#NEW FEATURE# a| **Liveboard experience enhancements** - -* The `isLiveboardXLSXCSVDownloadEnabled` attribute adds XLSX and CSV to the available Liveboard download formats. -* The `isGranularXLSXCSVSchedulesEnabled` attribute allows you to include the entire Liveboard, specific visualizations, or only tables and pivot tables in the XLSX and CSV schedules. -|==== - -== Version 1.45.0, February 2026 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| **Spotter enhancements** - -You can now embed the Spotter 3 experience in your application and use features such as Auto mode for automatic data model selection, chat history, and a new chat prompt interface. - -* To enable the new chat prompt interface, set `updatedSpotterChatPrompt` to `true`. -* To use Auto mode, set the `worksheetId` to `auto_mode`. -* To enable Chat history, set `enablePastConversationsSidebar` to `true`. - -For more information, see xref:embed-spotter.adoc[Embedding Spotter] and xref:embed-ai-analytics.adoc#_feature_status_and_availability_in_embed_mode[Features available with Spotter 3 experience]. - -Events:: - -* `EmbedEvent.AddToCoaching` for the *Add to Coaching* workflow in a Spotter conversation session -* `HostEvent.AddToCoaching` to trigger the *Add to Coaching* action in a Spotter conversation session. -* `HostEvent.StartNewSpotterConversation` to trigger the action to start a new chat session with Spotter. - -[NOTE] -==== -On Spotter embed deployments running version 26.2.0.cl or later, the *Add to Coaching* feature is enabled by default. To disable or hide the *Add to Coaching* button, use the xref:Action.adoc#_inconversationtraining[InConversationTraining] action ID. -==== - -|[tag greenBackground]#NEW FEATURE# a| **Liveboard experience enhancements** + - -Styling and grouping:: - -* The `isLiveboardStylingAndGrouping` attribute, used to enable the Liveboard styling and grouping feature, is now replaced with `isLiveboardMasterpiecesEnabled`. While your existing configuration with the deprecated `isLiveboardStylingAndGrouping` attribute continues to work, we recommend switching to the new configuration setting. -* The following action IDs are now available to show, disable, or hide the grouping menu actions on a Liveboard: -** `Action.MoveToGroup` for the **Move to Group** menu action. -** `Action.MoveOutOfGroup` for the **Move out of Group** menu action. -** `Action.CreateGroup` for the *Create Group* menu action. -** `Action.UngroupLiveboardGroup` for the **Ungroup Liveboard Group** menu action. - -Filter chip masking:: -The `showMaskedFilterChip` boolean parameter is now available to control the visibility of masked filter chips on a Liveboard. When set to `true`, if a Liveboard is shared with a user who has restricted access due to column-level security, the filter chip corresponding to those inaccessible columns will be displayed as masked to that user. When set to `false`, the filter chip for inaccessible columns will not be visible to the user. -+ -For more information, see link:https://docs.thoughtspot.com/cloud/latest/security-data-object#csr-liveboard[Column security rules on Liveboards]. +* `HostEvent.DeleteChat` + +Deletes a specific saved conversation by ID. The embed emits `EmbedEvent.SpotterConversationDeleted` after deletion. + + -The `showMaskedFilterChip` setting is also available in full application embedding. - -|[tag greenBackground]#NEW FEATURE# a| **Publishing objects** - -The following action IDs are available for the data publishing menu actions in the *Data workspace* page: - -* `Action.Publish` for *Publish* -* `Action.ManagePublishing` for *Manage publishing* -* `Action.Unpublish` for *Unpublish* -* `Action.Parameterize` for *Parameterize* -|[tag greenBackground]#NEW FEATURE# a| **Error handling improvements** - -To handle errors in the embedding workflows, the SDK includes the following features: - -* `ErrorDetailsTypes` enum for categorizing error types, such as `API`, `VALIDATION_ERROR`, and `NETWORK`. -* `EmbedErrorCodes` enum with specific error codes for programmatic error handling. -* `EmbedErrorDetailsEvent` interface for structured error event handling. - -For more information, see link:https://developers.thoughtspot.com/docs/Enumeration_EmbedErrorCodes[EmbedErrorCodes] and link:https://developers.thoughtspot.com/docs/Enumeration_ErrorDetailsTypes[ErrorDetailsTypes]. -|==== - -== Version 1.44.x, January 2026 - -[width="100%" cols="1,4"] -|==== - -|[tag redBackground]#DEPRECATED# | **Use `minimumHeight` instead of `defaultHeight`** + - -The `defaultHeight` parameter is deprecated in Visual Embed SDK v1.44.2 and later. -To set the minimum height of the embed container for ThoughtSpot components such as a Liveboard, use the `minimumHeight` attribute instead. - -|[tag greenBackground]#NEW FEATURE# a| *Intercepting API calls* + -The SDK provides the following attributes to intercept API calls and handle interception via events and custom workflows: - -//* `enableApiIntercept` + -//When set to true, enables the feature on your ThoughtSpot embed. -* `interceptUrls` + -Allows configuring which API calls to intercept. -* `interceptTimeout` + -Sets the timeout duration for handling interception. -* `isOnBeforeGetVizDataInterceptEnabled` + -When set to true, it enables use of `EmbedEvent.OnBeforeGetVizDataIntercept` to emit and intercept search execution calls initiated by users and implement custom logic or workflows to allow or restrict search execution. -* `EmbedEvent.ApiIntercept` + -Emits when an API call matching the conditions defined in `interceptUrls` is detected. - -For more information, see xref:api-intercept.adoc[Intercept API calls and search requests]. -|==== - - -== Version 1.43.0, November 2025 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| *Code-based custom actions* - -The following enumerations are available for code-based custom actions: - -* `CustomActionTarget` + -To define the target object for the custom action, such as on a Liveboard, visualization, Answer, or in Spotter. -* `CustomActionsPosition` + -To define the position of the custom action in the target object, such as primary menu, **More** options menu image:./images/icon-more-10px.png[the more options menu], or the contextual menu. -|[tag greenBackground]#NEW FEATURE# | *Attribute to set Parameter chip visibility during overrides* + -The `HostEvent.UpdateParameters` event now supports configuring the `isVisibleToUser` attribute to show or hide the Parameter chips after an override. For more information, see xref:runtime-parameters.adoc#_show_or_hide_parameter_chips_in_embedded_sessions[Show or hide Parameter chips in embedded sessions]. -|==== - -== Version 1.42.0, October 2025 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a|*Runtime overrides in Spotter embed* - -The Visual Embed SDK now supports runtime overrides in Spotter embed. - -* To apply runtime filters, use the `runtimeFilters` object -* To apply runtime Parameters, use the `runtimeParameters` object. - -|[tag greenBackground]#NEW FEATURE# a|*PNG images in Liveboard schedule notifications* + -To enable embedding PNG images of Liveboards in scheduled job notifications sent to subscribers, the SDK provides the `isPNGInScheduledEmailsEnabled` boolean parameter. When set to true, scheduled emails will include a PNG image of the Liveboard. - -The SDK also provides the following action IDs: - -* `Action.PngScreenshotInEmail` + -Adds the option to include a PNG screenshot in the notification email body when scheduling emails in ThoughtSpot. -* `Action.RemoveAttachment` + -Allows the user to remove an attachment from the email configuration in the schedule email dialog. -|[tag greenBackground]#NEW FEATURE# a|*Spotter embed* - -Action IDs:: -The following action IDs are available for Spotter embedding and are currently supported only in the `hiddenActions` array: - -* `Action.SpotterWarningsBanner` + -Action ID to control the visibility of the Spotter warnings banner in the UI. This banner displays general warnings or informational messages related to Spotter results or queries. -* `Action.SpotterWarningsOnTokens` + -Action ID to control the visibility of warning indicators on individual Spotter tokens parsed from a Spotter query. -* `Action.SpotterTokenQuickEdit` + -Action ID to enable or disable the link:https://docs.thoughtspot.com/cloud/latest/spotter-getting-started#quick-edits[quick edit functionality^] for Spotter tokens. -|==== - -== Version 1.41.0, September 2025 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a|*React component for Spotter Agent embed* - -The Visual Embed SDK now supports embedding Spotter Agent feature without a body or Spotter interface in a React app. For ease of implementation, the SDK also provides a custom React hook, `useSpotterAgent`. - -For more information, see xref:embed-ts-react-app.adoc#_embed_spotter_agent_in_your_own_app[Spotter Agent embedding in a React app]. - -|[tag greenBackground]#NEW FEATURE# a|*Event handlers for Spotter embed* - -The following event handlers are now available for Spotter embed: - -* `EmbedEvent.SpotterInit` + -Fires when Spotter embed component rendering is initialized. -* `EmbedEvent.QueryChanged` + -Fires when the Spotter query is updated by the user. -* `HostEvent.AskSpotter` + -Triggers *Ask Spotter* action for visualizations. -* `HostEvent.GetParameters` + -Triggers the action to fetch runtime Parameters applied on a visualization. -* `HostEvent.UpdateParameters` + -Triggers the action to update runtime Parameters for a Spotter-generated Answer. -* `HostEvent.GetTML` + -Triggers the action to get TML representation of a Spotter-generated Answer. - -For more information, see xref:EmbedEvent.adoc[EmbedEvent] and xref:HostEvent.adoc[HostEvent]. - -|[tag greenBackground]#NEW FEATURE# a|*Event handlers for Spotter Agent embed* - -You can now use the following host events in Spotter Agent embedding: - -- `HostEvent.DownloadAsCsv` + -Triggers the action to download a Spotter-generated Answer in CSV format. -- `HostEvent.DownloadAsPng` + -Triggers the action to download a Spotter-generated Answer in PNG format. -- `HostEvent.DownloadAsXlsx` + -Triggers the action to download a Spotter-generated Answer in XLSX format. -- `HostEvent.DownloadAsPdf` + -Triggers the action to download the PDF version of a Spotter-generated Answer. -- `HostEvent.Pin` + -Triggers the action to add a Spotter-generated Answer to a Liveboard. -- `HostEvent.Save` + -Triggers the *Save* action for a Spotter-generated Answer. - -For more information, see xref:HostEvent.adoc[HostEvent]. - -|[tag greenBackground]#NEW FEATURE# a| *Lazy loading of visualizations on an embedded Liveboard* - -You can now use the `lazyLoadingForFullHeight` parameter with the `fullHeight` to progressively load visualizations on an embedded Liveboard. When both these attributes are enabled, only the visualizations in the current viewport are loaded initially, while the other visualizations load as the user scrolls the Liveboard page. - -You can also set the margin property for lazy loading to define when the visualization should load. - -For more information, see xref:lazy-loading-fullheight.adoc[Lazy loading of visualizations in an embedded Liveboard]. - -|[tag greenBackground]#NEW FEATURE# a| *Full application embed* + - -You can now enable the persona-based left navigation panel and home page experience on your ThoughtSpot instance. This feature is disabled by default on ThoughtSpot instances and is available for Early Access. When it's enabled on your ThoughtSpot instance, you can roll out the new experience on embedding applications by configuring the xref:AppViewConfig.adoc#_discoveryexperience[`discoveryExperience`] attribute. - -When enabled, the left navigation panel organizes the application menu into persona-based contextual sections. For example, the *Insights* icon for business users, the *Data Workspace* icon for Analysts and Data engineers, and the *Develop* icon for developers. Your application users can navigate to each option using the tabs in the left navigation panel. The new interface also provides a slider to allow users to view or hide the left navigation panel. -|==== - -== Version 1.40.0, July 2025 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| *Fullscreen presentation mode controls for embedded Liveboards and visualizations* + -Developers can now control whether a visualization or Liveboard can be presented in full screen mode using the `disableFullscreenPresentation` attribute. By default, the full screen mode is disabled on embedded Liveboards and visualizations. -|[tag greenBackground]#NEW FEATURE# a| *PDF download settings* + -Developers can now control the display of *Include cover page* and *Include filter page(s)* options on the Download PDF dialog for Liveboards. The *Include cover page* and *Include filter page(s)* options are disabled by default on ThoughtSpot instances. When this feature is enabled, developers can use the `coverAndFilterOptionInPDF` attribute to show or hide these options for the Liveboard users in their embedding app. - -|[tag greenBackground]#NEW FEATURE# a| *Parameter for overriding a default primary action* + - -If Spotter is enabled on your instance, the *Spotter* button appears by default as the primary action on embedded Liveboard charts; if Spotter is not enabled, the *Explore* button is set as the primary action. If you want to replace the primary action with a different action, you can now use the `primaryAction` attribute. - -For more information, see xref:embed-actions.adoc#_override_default_primary_actions[Override default primary action]. - -|[tag greenBackground]#NEW FEATURE# a| *Full application embed experience enhancements* + - -The SDK now includes the `hideObjectSearch` property, which allows developers to hide the object search button in the navigation bar when embedding the full application. - -|[tag greenBackground]#NEW FEATURE# a| *Host events* + - -In this version, the SDK introduces the following host event handlers: - -- `HostEvent.ExitPresentMode` + -Triggers the exit action that allows users to exit the Liveboard or visualization present mode. -- `HostEvent.SpotterSearch` + -Triggers a search operation for the specified query string in Spotter embed. -- `HostEvent.PreviewSpotterData` + -Triggers the *Preview data* action that shows the data used for Spotter conversations. -- `HostEvent.ResetSpotterConversation` + -Triggers the *Reset* action to reset a Spotter conversation. -- `HostEvent.EditLastPrompt` + -Triggers the edit prompt action. -- `HostEvent.DeleteLastPrompt` + -Triggers the delete prompt action. - -For more information, see xref:HostEvent.adoc[HostEvent]. - -|[tag greenBackground]#NEW FEATURE# a|*Events support for Spotter embed* - -You can now use the following host events in Spotter embed: - -- `HostEvent.DownloadAsCsv` -- `HostEvent.DownloadAsPng` -- `HostEvent.DownloadAsXlsx` -- `HostEvent.Edit` -//- `HostEvent.GetParameters` -//- `HostEvent.GetTML` -- `HostEvent.MakeACopy` -- `HostEvent.Pin` -- `HostEvent.Save` - -For more information, see xref:HostEvent.adoc[HostEvent]. - -|[tag greenBackground]#NEW FEATURE# a| *Lazy loading with full height* +[source,JavaScript] +---- +spotterEmbed.trigger(HostEvent.DeleteChat, { chatId: '' }); +---- -The SDK introduces `lazyLoadingForFullHeight` parameter, which enables progressive loading of visualizations on an embedded Liveboard. -This parameter works in conjunction with the `fullHeight` attribute. When both these attributes are enabled, only the visualizations in the current viewport are loaded initially, while the other visualizations load as the user scrolls the Liveboard page. +* `HostEvent.RenameChat` + +Renames a specific saved conversation by ID. + ++ +[source,JavaScript] +---- +spotterEmbed.trigger(HostEvent.RenameChat, { chatId: '', title: 'New title' }); +---- [NOTE] ==== -To use these attributes effectively in embedded applications, your ThoughtSpot instance must be upgraded to version 10.12.0.cl or later. +Users can only load, delete, or rename their own conversations. These operations require the user to have Spotter access and the *Save chat* feature enabled on the cluster. ==== -|==== - - -== Version 1.39.0, July 2025 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| *Spotter embed components with new names* + -The following Spotter embed components are now deprecated and replaced with new components in the SDK and Visual Embed Playground: +// TODO: verify with engineering — confirm whether a SpotterConversationRenamed EmbedEvent is emitted after a successful rename -* `ConversationEmbed` + -Replaced with `SpotterEmbed` -* `ConversationViewConfig` + -Replaced with `SpotterEmbedViewConfig` -* `BodylessConversation` + -Replaced with `SpotterAgentEmbed` -* `BodylessConversationViewConfig` + -Replaced with `SpotterAgentEmbedViewConfig` +For more information, see xref:saved-conversations-api.adoc[Saved Chat public APIs]. -The deprecated components with old names in the existing Spotter embed implementations will continue to function until further notice. For code samples with new component names, see xref:embed-spotter.adoc[Spotter embed documentation]. - -|[tag greenBackground]#NEW FEATURE# a| *Action ID for Spotter in-conversation training* + -For ThoughtSpot instances that have the new Spotter in-conversation training workflow enabled, the SDK provides the action ID `Action.InConversationTraining` to manage the visibility of the *Add to Coaching* button on Answers generated from Spotter prompts. +|[tag redBackground]#BREAKING CHANGE# a| +[discrete] +===== Removal of `EmbedEvent.SpotterData` -[NOTE] -The *Add to Coaching* feature is currently in beta and is turned off by default on embed deployments. To enable this feature on your instance, contact ThoughtSpot Support. +// SOURCE: SCAL-309464 -|[tag greenBackground]#NEW FEATURE# a|*Events support for Spotter embed* +`EmbedEvent.SpotterData` has been removed from the Visual Embed SDK. This constant was a legacy event identifier that was never emitted in Spotter 3. It was superseded by `EmbedEvent.PreviewSpotterData` in the Spotter 3 release (SDK v1.28.x) and the old constant was not removed at that time. -New embed events:: +*Action required:* Update all references to `EmbedEvent.SpotterData` in your integration code to use `EmbedEvent.PreviewSpotterData`. -- `EmbedEvent.ExitPresentMode` + -Emits when a user exits the Liveboard or visualization presentation mode. -- `EmbedEvent.LastPromptDeleted` + -Emits when a query prompt in Spotter embed is deleted. -- `EmbedEvent.LastPromptEdited` + -Emits when a query prompt in Spotter embed is edited. -- `EmbedEvent.ResetSpotterConversation` + -Emits when a Spotter query is reset. -- `EmbedEvent.PreviewSpotterData` + -Emits when a user clicks the Preview data button in the Spotter conversation panel. -- `EmbedEvent.SpotterQueryTriggered` -Emits when a Spotter query is triggered. +[source,JavaScript] +---- +// Before — no longer works in SDK v1.50.x and later: +spotterEmbed.on(EmbedEvent.SpotterData, (data) => { ... }); -The following embed events are also supported in Spotter embed: +// After: +spotterEmbed.on(EmbedEvent.PreviewSpotterData, (data) => { ... }); +---- -- `EmbedEvent.AddRemoveColumns` -- `EmbedEvent.AnswerChartSwitcher` -- `EmbedEvent.AuthExpire` -- `EmbedEvent.AuthInit` -- `EmbedEvent.CopyToClipboard` -- `EmbedEvent.CustomAction` -- `EmbedEvent.Data` -- `EmbedEvent.DataSourceSelected` -- `EmbedEvent.DialogClose` -- `EmbedEvent.DialogOpen` -- `EmbedEvent.Download` -- `EmbedEvent.DownloadAsCsv` -- `EmbedEvent.DownloadAsPng` -- `EmbedEvent.DownloadAsXlsx` -- `EmbedEvent.DrillDown` -- `EmbedEvent.DrillExclude` -- `EmbedEvent.DrillInclude` -- `EmbedEvent.Edit` -- `EmbedEvent.Error` -- `EmbedEvent.Load` -- `EmbedEvent.Pin` -- `EmbedEvent.Save` -- `EmbedEvent.TableVizRendered` -- `EmbedEvent.VizPointClick` -- `EmbedEvent.VizPointDoubleClick` -- `EmbedEvent.VizPointRightClick` +|[tag greenBackground]#NEW FEATURE# a| +[discrete] +===== Liveboard browser cache refresh -For more information, see xref:EmbedEvent.adoc[EmbedEvent]. +// SOURCE: SCAL-305659 -|==== +The Liveboard browser cache feature is now in Early Access. Set `enableLiveboardDataCache` to `true` in `LiveboardViewConfig` to enable client-side caching of Liveboard visualization data. -== Version 1.38.0, June 2025 +The following SDK identifiers are available for this feature: -[width="100%" cols="1,4"] +[cols="2,3"] |==== -|[tag greenBackground]#NEW FEATURE# a| *String IDs for text customization* + -Developers can now customize a specific occurrence of a visible text string in the ThoughtSpot UI using the `stringIDs` object in the customization interface. - -To locate the string IDs, SDK provides the `exposeTranslationIds` attribute. By setting `exposeTranslationIds` to `true` in the Playground, you can find the string ID of the UI text and use it in your customization code. - -Additionally, the SDK provides the `StringIDsUrl` attribute to allow using a JSON file with string IDs and custom strings to override the visible text in the UI. - -For more information, see xref:customize-text-strings.adoc[Customize text strings]. +| Identifier | Description -|[tag greenBackground]#NEW FEATURE# a| *Hide columns on list pages* + +| `EmbedEvent.RefreshLiveboardBrowserCache` +| Emitted when the Liveboard browser cache is refreshed. -In full app embedding, you can now hide the following columns on the *Liveboards* and *Answers* listing pages using the `hiddenListColumns` array: +| `HostEvent.RefreshLiveboardBrowserCache` +| Trigger a manual cache refresh from the host application. -* *Author* + -`hiddenListColumns: [ListPageColumns.Author]` -* *Favorite* + -`hiddenListColumns: [ListPageColumns.Favourite]` -* *Last modified* + -`hiddenListColumns: [ListPageColumns.DateSort]` -* *Tags* + -`hiddenListColumns: [ListPageColumns.Tags]` -* *Share* + -`hiddenListColumns: [ListPageColumns.Share]` + - -For more information, see xref:full-app-customize.adoc#_hide_columns_on_list_pages_new_experience[Customize full application embed]. +| `Action.RefreshLiveboardBrowserCache` +| Action ID to show or hide the cache refresh button in the Liveboard toolbar. |==== -== Version 1.37.0, April 2025 - -[width="100%" cols="1,4"] |==== -|[tag greenBackground]#NEW FEATURE# a| -The SDK now provides the `customVariablesForThirdPartyTools` setting to pass custom variables when integrating third-party tools and running custom scripts in your embed. Developers can define this object in the **init()** function and add variables as key-value pairs. -This feature is available only if third-party integration is enabled on your instance and the script hosting domain URL is added to the CSP allowlist. - -For more information, see xref:3rd-party-script.adoc[Integrate third-party tools and allow custom scripts]. -|[tag greenBackground]#NEW FEATURE# a| -You can now exclude search token string from the application URL by setting `excludeSearchTokenStringFromURL` to `true` in your embed with ThoughtSpot token-based Search or Search bar. - -|[tag greenBackground]#NEW FEATURE# a| This version of the SDK supports the following embed and host events: - -Embed Events:: - -* `EmbedEvent.TableVizRendered` + -Emits when a table visualization is rendered in the ThoughtSpot embedded app. You can also use this event as a hook to trigger host events such as `HostEvent.TransformTableVizData` on the table visualization. For more information, see the link:https://developers.thoughtspot.com/docs/Enumeration_EmbedEvent#_tablevizrendered[SDK reference documentation]. - -* `EmbedEvent.CreateLiveboard` + -Emits when a Liveboard is created. - -Host Events:: - -* `HostEvent.TransformTableVizData` + -Triggers the table visualization re-render with the updated data. You can use this event in conjunction with `EmbedEvent.TableVizRendered` to apply the modifications to table visualization payload. - -* `HostEvent.Remove` + -Triggers the *Delete* action on a Liveboard. -|==== +== Version 1.49.x, June 2026 -== Version 1.36.0, February 2025 +// SOURCE: https://github.com/thoughtspot/developer-docs/blob/26.7.0.cl-doc-updates/modules/ROOT/pages/api-changelog.adoc [width="100%" cols="1,4"] |==== |[tag greenBackground]#NEW FEATURE# a| -The following HostEvents now allow custom parameters to set object properties programmatically: +[discrete] +===== Spotter file upload -* `HostEvent.SaveAnswer` + -Allows adding `name` and `description` text strings. When these parameters are defined, the event triggers the Save action to save the Answer with the predefined properties without opening the *Describe your Answer* modal. -* `HostEvent.Pin` + -Allows adding custom properties for visualization ID, name, and description, Liveboard ID, and Tab ID. When these parameters are defined, the event triggers an action to pin the Answer to the Liveboard specified in the code, without opening the *Pin* modal. +The SDK introduces two new configuration parameters in `SpotterChatViewConfig`: -For more information, see xref:events-hostEvents.adoc#hostEventParameterization[Host Events] documentation. +* `spotterFileUploadEnabled` — When set to `true`, enables the file upload feature in the Spotter chat panel. +* `spotterFileUploadFileTypes` — Restricts file types allowed for upload. Accepts a `SpotterFileUploadFileTypes` object. |[tag greenBackground]#NEW FEATURE# a| +[discrete] +===== Chart and table visualization overrides -New configuration attributes:: - -* `disableSourceSelection` + -Disables data source selection panel for embed users when set to `true`. -* `hideSourceSelection` + -Hides data source selection panel when set to `true` -* `locale` + -Sets the xref:locale-setting.adoc[locale and regional settings] for the Spotter interface. -* `showSpotterLimitations` + -Shows functional limitations of Spotter when set to `true` -* `hideSampleQuestions` + -Hides sample questions that appear on the default Spotter page. - -Action IDs for menu customization:: -Use the following action IDs in the `disabledActions`, `visibleActions`, or `hiddenActions` array to disable, show, or hide menu actions and elements in the embedded Spotter interface: - -* `Action.PreviewDataSpotter` + -The *Preview data* button on the Spotter conversation panel. -* `Action.ResetSpotterChat` + -The *Reset* button on the Spotter conversation panel. -* `Action.SpotterFeedback` + -The feedback widget on Spotter-generated charts. -* `Action.EditPreviousPrompt` + -The edit icon on the prompt panel. -The Prompt panel appears after Spotter generates a response to a user query. -* `Action.DeletePreviousPrompt` + -The delete icon on the prompt panel. - -//// -* `Action.EditTokens` + -The option to edit tokens on a Spotter-generated chart or table. -//// -CSS variables:: - -The following new CSS variables are available for Spotter interface customization: +The `visualOverrides` property is introduced in `SearchViewConfig` and `AppViewConfig`. Chart and table override options are available at embed initialization time. -* `--ts-var-spotter-input-background` -* `--ts-var-spotter-prompt-background` +For more information, see xref:viz-overrides.adoc[Configuring visualization overrides]. -For more information about Spotter customization, see xref:embed-spotter.adoc#SpotterCSS[Customize styles]. |[tag greenBackground]#NEW FEATURE# a| +[discrete] +===== EmbedEvent.SpotterConversationDeleted +Emitted when a saved Spotter conversation is deleted by the user inside the embedded interface. -Configuration attributes:: - -* `hideIrrelevantChipsInLiveboardTabs` + -Hides filter chips on a Liveboard when set to `true`. - -* `isLiveboardCompactHeaderEnabled` + -Enables the compact Liveboard header feature when set to `true`. - -Action IDs:: -Use the following action IDs in the `disabledActions`, `visibleActions`, or `hiddenActions` array to disable, show, or hide menu actions on an embedded Liveboard: - -* `Action.DisableChipReorder` + -ID for the action that disables filter chip reordering. -* `Action.ChangeFilterVisibilityInTab` - -|==== - -== Version 1.35.0, December 2024 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| -The SDK now provides the `isUnifiedSearchExperienceEnabled` setting to customize the Search experience on ThoughtSpot Home page for embedding application users: - -* When set to `true`, the split search experience is disabled and the Search bar on the Home page functions as Natural Language Search interface -* When set to `false`, the split search experience is enabled and object Search is set as the default Home page search experience. +|[tag greenBackground]#NEW FEATURE# a| +[discrete] +===== EmbedEvent.SpotterConversationSelected -For more information, see xref:full-app-customize.adoc#_search_components[Search interface on the Home page in full application embedding]. - -|[tag greenBackground]#NEW FEATURE# a| The `overrideOrgId` parameter in the SDK provides the ability to override Org context for embedding application users. This parameter allows users authenticated to an Org to temporarily view content from another Org. Before specifying the Org ID for override, make sure the Per Org URL feature is enabled on your ThoughtSpot instance. To enable Per Org URL on your instance, contact ThoughtSpot Support. -|==== - -== Version 1.34.0, November 2024 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| You can now embed the following ThoughtSpot Spotter components in your app: - -* `SpotterEmbed` + -Embeds Spotter conversation interface in your app -* `SpotterAgentEmbed` + -Creates a conversation component without the body, which can be integrated into chatbots or other conversational apps. - -For more information, see xref:embed-spotter.adoc[Embed Spotter] and xref:spotter-in-custom-chatbot.adoc[Integrate Spotter into your chatbot]. - -|[tag greenBackground]#NEW FEATURE# a|The following parameters and enumerations are available for customizing Liveboard experience: - -* `showLiveboardVerifiedBadge` + -Shows or hides the Liveboard verified badge. Available if the Liveboard compact header feature is enabled. -* `showLiveboardReverifyBanner` + -Shows or hides the re-verify banner. Available if the Liveboard compact header feature is enabled. -* `Action.KPIAnalysisCTA` + -Action ID to show, hide, or disable the **Analyze CTA** action on a KPI chart. - -|[tag greenBackground]#NEW FEATURE# |You can now use the `HostEvent.GetIframeUrl` to get the iframe src URL from the Visual Embed Playground. If you are embedding ThoughtSpot in apps like Salesforce and Sharepoint without the SDK, use this event to generate the iframe URL. - -|[tag greenBackground]#NEW FEATURE# a|The following parameters are available for customizing Search experience: - -* `collapseDataPanel` -Minimizes the data panel view. Users can click the data panel header any time to expand the panel. -* `collapseSearchBar` -Sets the initial state of the search bar when embedding a saved Answer. - -|[tag greenBackground]#NEW FEATURE# a| The following settings are available for customizing the new home page and navigation experience in full app embedding: - -* `HomeLeftNavItem.LiveboardSchedules` + -The Liveboard schedules menu on the left navigation panel. - -Action enumerations:: - -* `Action.EditScheduleHomepage` + -To show, disable, or hide the *Edit* action on the *Liveboard schedules* page -* `Action.PauseScheduleHomepage` + -To show, disable, or hide the *Pause* action on the *Liveboard schedules* page -* `Action.ViewScheduleRunHomepage` + -To show, disable, or hide the *View run history* action on the *Liveboard schedules* page -* `Action.DeleteScheduleHomepage` + -To show, disable, or hide the *Delete* action on the *Liveboard schedules* page -* `Action.UnsubscribeScheduleHomepage` + -To show, disable, or hide the *Unsubscribe* action on the *Liveboard schedules* page -|==== - -== Version 1.33.x, October 2024 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| You can now customize the search experience for the embedded ThoughtSpot **Home** page using `homePageSearchBarMode`. By default, the **Home** page includes the Object Search bar, which allows finding popular Liveboards and Answers. - -You can set the `homePageSearchBarMode` property to one of the following options: - -** `aiAnswer` + -Displays the search bar for Natural Language Search. -** `none` -Hides the Search bar on the **Home** page. Note that it only hides the Search bar on the **Home** page and doesn't affect the Object Search bar visibility on the top navigation bar. -** `objectSearch` (default) + -Displays Object Search bar on the **Home** page. -|[tag greenBackground]#NEW FEATURE# a|The SDK now allows you to set the focus on the Search bar or outside the Search bar when rendering the embedded Search page. Use the `focusSearchBarOnRender` property to set the position of the cursor focus. -|[tag greenBackground]#NEW FEATURE# a| The SDK includes the following Event and Action enumeration members: - -Events:: - -* `EmbedEvent.OnBeforeGetVizDataIntercept` + -Developers can emit this event to intercept search execution, allow or restrict certain queries, and show an error message with custom text for restricted queries. To allow the embedded page to emit this event, you must set the `isOnBeforeGetVizDataInterceptEnabled` attribute to `true`. - -* `EmbedEvent.ParameterChanged` + -Emitted when a Parameter is changed on a saved Answer or Liveboard. - -Actions:: - -* `Action.ManageTags` + -Use this action enumeration to disable, show, or hide the **Manage tags** button on the Liveboards and Answers pages. -|==== - -== Version 1.32.x, August 2024 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| The following new action enumerations are available in this version: + - -* `Action.CreateLiveboard` for the *Create Liveboard* menu action on the Liveboards lists page. + -* `Action.SyncToTeams` for the **Sync to Teams** menu action on Liveboard visualizations. -* `Action.SyncToSlack` for the **Sync to Slack** action on Liveboard visualizations. -* `Action.AddQuerySet` for the **Add Query Set** action on the data panel (new experience) of the Search page. -* `Action.AddColumnSet` for the **Add Column Set** action on the data panel (new experience) of the Search page. -* `Action.AddDataPanelObjects` for the **Add** menu that includes sub-menu options such as Formulas, Parameters, Query set, and Column set actions. -* `Action.OrganiseFavourites` for the **Organize** action above the Favorites panel on the modular Homepage (New experience) -For more information, see xref:Action.adoc[Actions]. -|[tag greenBackground]#NEW FEATURE#| Developers can now use the `disableRedirectionLinksInNewTab` parameter to disable links and redirection of links in the embedded view. -|[tag greenBackground]#NEW FEATURE# a|You can now enable `enable2ColumnLayout` on a Liveboard to adjust the page view according to the width and resolution of users' devices. -|| -|==== - -== Version 1.31.x, July 2024 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| Runtime filters + - -* `NOT_IN` operator for Runtime filters. -For more information, see xref:runtime-filters.adoc#runtimeFilterOp[Runtime filters]. -* `excludeRuntimeParametersfromURL` parameter to exclude or remove runtimeParameters from the URL. -|[tag greenBackground]#NEW FEATURE# |For performance optimization, developers can choose to load embedded views in a lightweight V2 shell by setting `enableV2Shell_experimental` to `true`. -|==== - -== Version 1.30.0, June 2024 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| **CSS variables for new homepage experience** - -* `--ts-var-home-watchlist-selected-text-color` + -* `--ts-var-home-card-color` + -* `--ts-var-home-favorite-suggestion-card-text-color` + -* `--ts-var-home-favorite-suggestion-card-background` + -* `--ts-var-home-favorite-suggestion-card-icon-color` - -For more information, see xref:css-customization.adoc#_homepage_modules_new_experience_mode[CSS variables and overrides]. -|==== - -== Version 1.29.0, May 2024 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| **Ask Sage** - -With Ask Sage [beta betaBackground]^Beta^ embedded application users can ask follow-up questions on a visualization generated from a Natural Language Search query, converse with AI analyst, and refine results. To enable this feature, set `enableAskSage` to `true`. - -Action enumeration:: -To show, hide, or disable Ask Sage on a visualization, add `Action.AskAi`. For example, -+ -[source,JavaScript] ----- -hiddenActions: [Action.AskAi] ----- - -Events:: -* `HostEvent.AskSage` + -Triggers the **Ask Sage** action on a Liveboard visualization. -* `EmbedEvent.AskSageInit` + -Emits when the **Ask Sage** action is initialized. -* `HostEvent.GetParameters` + -Triggers a fetch action to get runtime Parameters. -* `HostEvent.UpdateParameters` + -Updates runtime Parameters -* `HostEvent.ResetLiveboardPersonalisedView` + -Resets a personalized Liveboard view. -* `HostEvent.UpdateCrossFilter` + -Updates cross filters applied on a Liveboard. -|==== - -== Version 1.28.x, April 2024 - -[width="100%" cols="1,4"] -|===== -|[tag greenBackground]#NEW FEATURE# a| The SDK includes the following new enumeration members in v1.28.0: - -** `Action.VerifiedLiveboard` + -Can be used to show or hide the *Verified Liveboard* banner. -|[tag greenBackground]#NEW FEATURE# a| To access the new Home page and global navigation experience in the full application embedding, you can use the `modularHomeExperience` property in the SDK. The modular homepage experience is turned off by default and is available as an Early Access feature in 9.12.5.cl release. When `modularHomeExperience` is set to `true`, you can use the following parameters in the SDK to control the application experience: - -* `hiddenhomeleftnavitems` -* `hiddenhomepagemodules` -* `hideapplicationswitcher` -* `hidehomepageleftnav` -* `hideorgswitcher` -* `reorderedhomepagemodules` -* `hiddenhomeleftnavitems` -* `HomeLeftNavItem` - -For more information, see xref:full-app-customize.adoc[Customize full application embedding] and xref:AppViewConfig.adoc[AppViewConfig]. -|[tag greenBackground]#NEW FEATURE# a| The following embed event is available from the v1.28.0 onwards: - -`EmbedEvent.Rename` + -Emits when an embedded Liveboard or visualization is renamed. -|[tag greenBackground]#NEW FEATURE# a| TML actions - -The following TML menu actions are now grouped under *TML* sub-menu of the **More** image:./images/icon-more-10px.png[the more options menu] menu on Answer page. - -* Export TML -* Edit TML -* Update TML - -To show, hide, or disable these actions in the embedded mode, use the following format: - -[source,JavaScript] ----- - // to show the TML menu and its sub-menu options -visibleActions: [Action.TML, Action.ExportTML, Action.EditTML] ----- - -[source,JavaScript] ----- - // to hide all TML actions -hiddenActions: [Action.TML] ----- - -[source,JavaScript] ----- - // to disable all TML actions -disabledActions: [Action.TML] ----- -|[tag greenBackground]#NEW FEATURE# | You can now reset authentication token and fetch a new token for new authentication requests. -For more information, see link:https://developers.thoughtspot.com/docs/Function_resetCachedAuthToken[resetCachedAuthToken]. - -|[tag greenBackground]#NEW FEATURE#| You can now override the default number, date, and currency format defined by your locale settings. To override the default settings, use the following parameters: - -* `numberFormatLocale` + -* `dateFormatLocale` + -* `currencyFormat` - -For more information, see xref:locale-setting.adoc#_set_locale_in_the_sdk[Customize locale]. - -|[tag greenBackground]#NEW FEATURE# |Tokenized fetch + -The SDK now provides a fetch wrapper that adds the authentication token to the API requests. -For more information, see link:https://developers.thoughtspot.com/docs/Function_tokenizedFetch#_tokenizedfetch[tokenizedFetch]. -|===== - -== Version 1.27.x, March 2024 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| The following action enumeration members are available from v1.27.9 and v1.27.10: - -* `Action.AIHighlights` -* `Action.AddToWatchlist` -* `Action.RemoveFromWatchlist` -* `Action.CopyKpiLink` - -For more information, see xref:Action.adoc[Action]. -| [tag greenBackground]#NEW FEATURE# a| You can now use `HostEvent.GetAnswerSession` to get Answer session data for a Search Answer or Liveboard Visualization in the embedded view. -|==== - -== Version 1.27.0, January 2024 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a|The `SageEmbed` package is now available on all clusters. You can use this SDK package to embed Natural Language Search capabilities and assist users with AI-suggested queries and AI-generated answers. This SDK package also allows you to customize the Natural Language Search experience in the embedded view. - -For a complete list of methods, functions, interface objects, and properties, see the following pages: + - -* xref:SageEmbed.adoc[SageEmbed] -* xref:SageViewConfig.adoc[SageViewConfig] - -|[tag orangeBackground]#MODIFIED# a| The `HostEvent.DrillDown` now supports the `vizId` parameter to trigger a drill-down action on a specific visualization of a Liveboard. -For more information, see xref:HostEvent.adoc#_drilldown[DrillDown]. -|[tag greenBackground]#NEW FEATURE# a| The new version of the SDK introduces the following new enumeration members: - -* Host Events -** `HostEvent.UpdateSageQuery` + -Updates the search query string for Natural Language Search operations. -* Embed Events -** `EmbedEvent.CreateConnection` + -Emitted when a user creates a new data connection on the **Data** page. -** `EmbedEvent.CreateWorksheet` + -Emitted when a user creates a new Worksheet. -|==== - -== Version 1.26.0, November 2023 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| The SDK provides `AnswerService` class to trigger the answer service with a custom action payload. -You can use this service to run GraphQL queries in the context of the Answer with a custom action trigger. For more information, see link:https://developers.thoughtspot.com/docs/Class_AnswerService[AnswerService]. Recommended ThoughtSpot application version is 9.10.0.cl. - -|[tag greenBackground]#NEW FEATURE# a|The following object properties and feature flags are introduced in the `LiveboardEmbed` and `AppEmbed` SDK packages: - -* `showLiveboardDescription` + -Shows the Liveboard description text when set to `true` -* `showLiveboardTitle` + -Shows the Liveboard title when set to `true` -* `isLiveboardHeaderSticky` + -Sets Liveboard header bar as a fixed element when set to `true` -* `hideLiveboardHeader` + -Hides the Liveboard header when set to `true` -* `hiddenTabs` + -Hides the specified tabs from the Liveboard page -* `visibleTabs` + -Displays the specified tabs on the Liveboard page - -|[tag greenBackground]#NEW FEATURE# |You can now enable the new data panel experience by setting `dataPanelV2` to `true` in the SDK when embedding ThoughtSpot Search. The new data panel experience is turned off by default on embedded ThoughtSpot instances. - -|[tag greenBackground]#NEW FEATURE# a|The new version of the SDK supports the following events: - -Embed events:: -* `EmbedEvent.hiddenTabs` -* `EmbedEvent.visibleTabs` -* `EmbedEvent.UpdatePersonalisedView` -* `EmbedEvent.SavePersonalisedView` -* `EmbedEvent.ResetLiveboard` -* `EmbedEvent.DeletePersonalisedView` -* `EmbedEvent.SageWorksheetUpdated` -* `EmbedEvent.SageEmbedQuery` -+ -For more information, see xref:EmbedEvent.adoc[EmbedEvent]. - -Host events:: - -* `HostEvent.GetTabs` -* `HostEvent.SetVisibleTabs` -* `HostEvent.SetHiddenTabs` -* `HostEvent.GetAnswerSession` -* `HostEvent.UpdateSageQuery` -+ -For more information, see xref:HostEvent.adoc[HostEvent]. - -|[tag greenBackground]#NEW FEATURE# a| The SDK introduces the following action enumeration members: - -* `Action.AddTab` + -Show, disable, or hide the **Add Tab** action on a Liveboard. -* `Action.PersonalisedViewsDropdown` + -Show, disable, or hide the Liveboard views saved by a user. -* `Action.LiveboardUsers` + -Show, disable, or hide Liveboard users. -* `Action.SageAnswerFeedback` -Show, disable, or hide the feedback widget on AI-generated Answer page. -* `Action.EditSageAnswer` -Show, disable, or hide the **Edit** action on the AI-generated Answer page. - -For more information, see xref:Action.adoc[Actions]. -|==== - -== Version 1.25.0, October 2023 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# | The SDK now supports runtime Parameter overrides on Liveboards and Answers. -For more information, see xref:runtime-parameters.adoc#_apply_parameter_overrides_using_visual_embed_sdk[Runtime Parameter overrides]. - -|[tag greenBackground]#NEW FEATURE# a| The SDK introduces the following action enumeration members: - -* `Action.RenameModalTitleDescription` -* `Action.EnableContextualChangeAnalysis` -* `Action.RequestVerification` -* `Action.AddTab` - -For more information, see xref:Action.adoc[Actions]. -|==== - -== Version 1.24.0, September 2023 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| ThoughtSpot now provides the `SageEmbed` package to embed the ThoughtSpot Search page with Sage features such as natural language search and AI-suggested search examples. This feature is in beta and not available in the Visual Embed Playground. -|[tag greenBackground]#NEW FEATURE# a| The `HostEvent.SetActiveTab` event in the upcoming version of the SDK allows you to set a tab as an active tab on a Liveboard. -|==== - -== Version 1.23.0, August 2023 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| The SDK supports the following performance optimization enhancements: + - -* Ability to pre-render a generic instance of the ThoughtSpot component using the `prerenderGeneric` attribute. The generic instance uses the default host and flags and can be rendered in the background to improve application response. -* Ability to use an iFrame from a pre-rendered iFrame pool using the `usePrerenderedIfAvailable` attribute. -|==== - -//// -|[tag greenBackground]#NEW FEATURE# a| New events for Liveboard filters + - -* `EmbedEvent.FilterChanged` + -* `HostEvent.GetFilters` + -* `HostEvent.UpdateFilters` -//// - -== Version 1.22.0, June 2023 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| The new version of the SDK introduces the `TrustedAuthTokenCookieless` `authType` property to allow Cookieless embedding. The Cookieless authentication method allows using a bearer token to identify the signed-in user instead of session cookies. - -For more information, see xref:embed-authentication.adoc#_cookieless_authentication[Cookieless authentication]. - -|[tag greenBackground]#NEW FEATURE# a|The new version of the SDK allows you to block user access to the non-embedded instance of the ThoughtSpot application. In full app embed deployments, you can use the `blockNonEmbedFullAppAccess` property in the SDK to restrict or allow your application users from accessing ThoughtSpot pages in the non-embed mode. - -For more information, see xref:security-settings.adoc#_block_access_to_non_embedded_thoughtspot_pages[Block access to non-embedded ThoughtSpot pages]. - -|==== - -//// -|[tag greenBackground]#NEW FEATURE# a| The SDK supports the following performance optimization enhancements: + - -* Ability to pre-render a generic instance of the ThoughtSpot component using the `prerenderGeneric` attribute. The generic instance uses the default host and flags and can be rendered in the background to improve application response. -* Ability to use an iFrame from a pre-rendered iFrame pool using the `usePrerenderedIfAvailable` attribute. -//// - -== Version 1.21.0, May 2023 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a|The new version of the SDK introduces the following action enumeration members: - -* `Action.AxisMenuAggregate` -* `Action.AxisMenuConditionalFormat` -* `Action.AxisMenuEdit` -* `Action.AxisMenuFilter` -* `Action.AxisMenuGroup` -* `Action.AxisMenuNumberFormat` -* `Action.AxisMenuPosition` -* `Action.AxisMenuRemove` -* `Action.AxisMenuRename` -* `Action.AxisMenuSort` -* `Action.AxisMenuTextWrapping` -* `Action.AxisMenuTimeBucket` -* `Action.CrossFilter` -* `Action.RemoveCrossFilter` - -For more information, see xref:embed-action-ref.adoc[Action reference]. - -|[tag greenBackground]#NEW FEATURE# a| The SDK introduces the following events: - -* `HostEvent.AddColumns` -* `HostEvent.OpenFilter` -* `HostEvent.RemoveColumn` -* `HostEvent.ResetSearch` -* `EmbedEvent.CrossFilterChanged` -* `EmbedEvent.DownloadAsPng` -* `EmbedEvent.VizPointRightClick` - -For more information, see xref:embed-events.adoc[Events]. - -|[tag redBackground]#DEPRECATED# a| - -The following events are deprecated from version 1.21.0 onwards. - -* `HostEvent.Download` + -* `EmbedEvent.Download` - -You can use the `DownloadAsPng`, `DownloadAsXlsx`, `DownloadAsCsv` and `DownloadAsPdf` events for download actions. - -For more information, see xref:embed-events.adoc[Events reference]. -|[tag orangeBackground]#MODIFIED# a| - -Events:: -The SDK supports omitting or executing a search query in xref:HostEvent.adoc#_search[`HostEvent.Search`]. -Actions:: -Use the following action enumeration members instead of `Action.Download` to show, hide, or disable the *Download* menu action on an embedded Liveboard, visualization, or Answer: -+ -* `Action.DownloadAsCsv` -* `Action.DownloadAsPdf` -* `Action.DownloadAsXlsx` -* `Action.DownloadAsPng` - -+ -To disable or hide download actions, you can use `Action.Download` in the `disabledActions` and `hiddenActions` arrays respectively. However, if you are using the `visibleActions` array to show or hide actions on a visualization or Answer, include the following download action enumerations along with `Action.Download` in the array: + - -** `Action.DownloadAsCsv` + -** `Action.DownloadAsPdf` + -** `Action.DownloadAsXlsx` + -** `Action.DownloadAsPng` - -|[tag greenBackground]#NEW FEATURE# a| The SDK includes new attributes to customize the experience for embedded app users: - -* `linkOverride` -+ -Allows overriding the *Open in new tab* link on embedded pages. - -* `contextMenuTrigger` -+ -Allows triggering contextual menu on the Liveboard visualizations and Answers from left-click to right-click. - -* `hideSearchBar` -+ -Allows hiding the Search bar on the embedded Search page. -|[tag greenBackground]#NEW FEATURE# | The SDK now allows setting the loading preference for embedded iFrames. -For performance optimization, you can set the `loading` attribute to `lazy` in the `FrameParams` property. -|==== - -== Version 1.20.0, April 2023 - -[width="100%" cols="1,4"] -|==== -|[tag redBackground]#DEPRECATED# a|The `dataSources` property in `SearchEmbed` and `SearchBarEmbed` is deprecated and replaced with the `dataSource` attribute. The SDK supports searching from a single data source only. -|[tag greenBackground]#NEW FEATURE# a|The embed SDK packages now include the `insertAsSibling` property. This attribute can be used to insert the embedded object as a sibling to the element inside the target container. -|==== - -== Version 1.19.0, February 2023 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a|The `customCSS` property in the `customizations` object supports new variables to customize the styles for dialogs, search bar, search navigation and search suggestions panels. -For more information, see xref:css-customization.adoc[Customize CSS]. -|[tag redBackground]#BREAKING CHANGE# a|The new Liveboard experience mode introduces changes to the data format of the JSON response payload triggered by callback custom actions. For example, the `reportBookData`, and `vizData` attributes are modified, and the custom action `id` now is part of the data attribute. These changes may break your current custom action event handlers. For interoperability, we recommend adding the data attribute to `payload` in your code as shown in the example here: - -[source,JavaScript] - ----- -liveboardEmbed.on(EmbedEvent.CustomAction, payload => { - if (payload.id === "callback-action-id" \|\| payload.data.id === "callback-action-id") { - console.log('Custom Action event:', payload.data); - } -}) ----- - -You may also want to update the data classes in your scripts to process the JSON response payload and handle complex data. For more information, see xref:custom-actions-callback.adoc#_define_functions_and_classes_to_handle_liveboard_data[Callback custom actions]. - -|[tag greenBackground]#NEW FEATURE# a|The new version of the SDK introduces the following Host events: - -* `HostEvent.Delete` -* `HostEvent.Download` -* `HostEvent.DownloadAsCsv` -* `HostEvent.DownloadAsXlsx` -* `HostEvent.ManagePipelines` -* `HostEvent.Save` -* `HostEvent.Share` -* `HostEvent.ShowUnderlyingData` -* `HostEvent.SpotIQAnalyze` -* `HostEvent.SyncToOtherApps` -* `HostEvent.SyncToSheets` - -For more information, see xref:events-hostEvents.adoc[Host events]. - -|[tag redBackground]#DEPRECATED# a|The `noRedirect` property in the SDK is deprecated and replaced with the `inPopup` attribute. When set to `true`, the `inPopup` attribute allows the SAML SSO authentication flow in a pop-up window. - -For more information, see xref:embed-authentication.adoc#_saml_redirection[SAML Redirection]. -|==== - -== Version 1.18.0, January 2023 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a|The new version of the SDK provides the `SearchBarEmbed` JavaScript package to embed only the ThoughtSpot Search bar in your app. + - -For more information, see xref:embed-searchbar.adoc[Embed ThoughtSpot search bar]. - -|[tag greenBackground]#NEW FEATURE# a|The `customCSS` property in the `customizations` object supports new variables to customize the UI elements on Liveboard, visualization, and Answer pages. You can also use these variables to define custom styles in the CSS file. + -For more information, see xref:css-customization.adoc[Customize CSS]. -|[tag greenBackground]#NEW FEATURE# |The new version of the SDK allows fetching TML objects via `GetTML` host event. This event is triggered when a user clicks on the *Show underlying data* action on a Liveboard visualization or Answer page. + - -For more information, see xref:HostEvent.adoc#_gettml[GetTML]. - -|[tag greenBackground]#NEW FEATURE# a| The new version of the SDK introduces the following enums in the `Action` object: - -* `Action.SyncToOtherApps` + -* `Action.SyncToSheets` + -* `Action.ManagePipelines` + - -You can use these enums to show, hide, or disable *Sync to sheets*, *Sync to other apps*, and *Manage pipelines* menu actions on a Liveboard visualization or Answer. - -For more information, see xref:embed-action-ref.adoc[Actions]. -|==== - -== Version 1.17.1, December 2022 - -Bug fixes to the trusted authentication feature. - -== Version 1.17.0, November 2022 - -The new version of the SDK introduces several new features and enhancements. -[width="100%" cols="1,4"] -|==== -|[tag orangeBackground]#MODIFIED# a|The `AuthType` property is modified and supports new enums. + - -* `AuthType.SAML` is renamed as `AuthType.SAMLRedirect` + -* `AuthType.OIDC` is renamed as `AuthType.OIDCRedirect` + -* `AuthType.AuthServer` is renamed to `AuthType.TrustedAuthToken` + -This enhancement does not introduce any breaking changes to your current implementation. -|[tag greenBackground]#NEW FEATURE# a|To use your current SAML or OIDC authentication setup and redirect users to the IdP for authentication within the embedded iFrame, you can now use `AuthType.EmbeddedSSO`. + -For more information, see xref:embed-authentication.adoc[Authentication]. -|[tag greenBackground]#NEW FEATURE#| -The `customizations` object in the SDK allows you to specify a custom CSS URL. You can also use this object to define CSS variables directly in the `init` code. + -For more information, see xref:css-customization.adoc[Customize CSS]. -|==== - -== Version 1.16.0, October 2022 - -The new version of the SDK includes bug fixes and improvements to the new Liveboard experience. - -== Version 1.15.1, September 2022 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#| -The `prefetch` method now supports the `url` and `prefetchFeatures` parameters. You can use these parameters to call the prefetch method before `init` and prefetch static resources on application load. + -For more information, see xref:prefetch-and-cache.adoc[Prefetch static resources]. -|==== - -== Version 1.15.0, September 2022 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#| -For embedded instances with the new Liveboard experience, the Visual Embed SDK provides the `activeTabId` attribute, using which you can set a Liveboard tab as an active tab. - -For more information, see xref:embed-pinboard.adoc#_liveboard_tabs[Customize Liveboard tabs]. - -|[tag greenBackground]#NEW FEATURE# a|The new version of the SDK supports firing events for Liveboard menu actions from the host application. The SDK introduces the following host event enumeration members for Liveboard objects: - -* CopyLink -* CreateMonitor -* DownloadAsPdf -* Edit -* EditTML -* Explore -* ExportTML -* LiveboardInfo -* MakeACopy -* ManageMonitor -* Pin -* Present -* Remove -* Schedule -* SchedulesList -* UpdateTML - -For more information, see xref:events-hostEvents.adoc[Events reference]. -|==== - -== Version 1.14.0, August 2022 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#| -The Visual Embed SDK now includes the `liveboardV2` attribute in the `LiveboardEmbed` package to allow developers to enable the new Liveboard experience on their embedded ThoughtSpot instance. + -For more information, see xref:embed-pinboard.adoc[Embed a Liveboard]. -|[tag orangeBackground]#MODIFIED#|If trusted authentication is enabled, the SDK makes a `POST` API call to get a login token and log the user into ThoughtSpot. -The earlier versions of the SDK supported only `GET` API requests. For more information, see xref:embed-authentication.adoc#_configure_token_based_authentication_method_in_visual_embed_sdk[Configure token-based authentication method in Visual Embed SDK]. -|==== - -== Version 1.13.0, July 2022 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#| -This version of Visual Embed SDK includes the `enableSearchAssist` attribute, using which you can turn on the Search Assist feature on an embedded instance. -|[tag greenBackground]#NEW FEATURE#| The new version of SDK introduces the `AuthType.SAML` enum for SAML-based SSO authentication. Note that `AuthType.SAML` replaces the `AuthType.SSO` enum, which is deprecated in the v1.13.0 version of the SDK. + -For more information, see xref:embed-authentication.adoc#saml-sso-embed[Authentication]. -|[tag redBackground]#DEPRECATED#| The `AuthType.SSO` enum is deprecated in v1.13.0. ThoughtSpot recommends using `AuthType.SAML` for the SAML SSO authentication method. + -This change does not impact your current embed implementation with `AuthType.SSO`. -|[tag greenBackground]#NEW FEATURE#| The SDK includes the `getExportRequestForCurrentPinboard` event, which is triggered when a user tries to export a Liveboard in its current state. + -For more information, see xref:events-hostEvents.adoc[Events reference]. -|==== - -== Version 1.12.0, June 2022 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#| -This version of Visual Embed SDK introduces the `navigate` host event, which is triggered when a user navigates to an application page without a page reload. - -For more information, see xref:events-hostEvents.adoc[Events reference]. -|[tag greenBackground]#NEW FEATURE# | The new `getThoughtSpotPostUrlParams` method fetches ThoughtSpot URL query parameters prefixed with `ts-`. -|==== - -== Version 1.11.2, June 2022 - -Bug fix for Typescript builds that affect Angular project configurations. - -== Version 1.11.1, May 2022 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#| The SDK includes the action enum `ReportError`, using which you can turn off ThoughtSpot-specific error reporting. -|==== - -== Version 1.11.0, May 2022 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| The new version of SDK includes the following new events: - -* `ALL` -* `AnswerChartSwitcher` -* `AnswerDelete` -* `CopyAEdit` -* `CopyToClipboard` -* `Download` -* `DownloadAsPdf` -* `DownloadAsCsv` -* `DownloadAsXlsx` -* `DrillExclude` -* `DrillInclude` -* `EditTML` -* `ExportTML` -* `Monitor` -* `Pin` -* `Save` -* `SaveAsView` -* `Share` -* `ShowUnderlyingData` -* `SpotIQAnalyze` -* `UpdateTML` -* `VizPointClick` - -For more information about how to register and handle these events, see xref:embed-events.adoc[Events and app integration]. -|[tag greenBackground]#NEW FEATURE# a| The new version of SDK supports the `showAlerts` attribute, using which you can show or hide alerts and error messages in the embedded view. - -|[tag greenBackground]#NEW FEATURE# a| The `Action.CreateMonitor` enumeration is available in the SDK for embedded ThoughtSpot environments on which the *Monitor* feature is enabled. -For more information, see xref:embed-actions.adoc[Show or hide UI actions]. -|==== - -== Version 1.10.4, May 2022 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#|The `detectCookieAccessSlow` parameter in the SDK allows your app to check if third-party cookies are enabled on the browser. This parameter is available only for trusted and `Basic` authentication types. -|==== -== Version 1.10.3, May 2022 - -Bug fix and improvements to the `logout` method. - -== Version 1.10.2, May 2022 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#|Ability to configure `redirectPath` on the origin when using the SAMLRedirect `authType`. -|==== - -== Version 1.10.1, May 2022 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#|You can now use the `logout` method to log out embed users. -|[tag orangeBackground]#MODIFIED# a| Note the following changes: + - -* You can now use the `loginFailedMessage` property on init to display the `Not logged in` message when a user login fails. You can customize this message by defining a custom text string in the `loginFailedMessage` attribute. -* The `init` method now returns an event emitter which can be used to listen to `AuthStatus` such as login failure, success, or user logout. -|==== - -== Version 1.10.0, April 2022 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| The `AddRemoveColumns` event is now available in the SDK. For more information, see xref:event-embedEvents.adoc[Events reference]. -|==== - -== Version 1.9.8, April 2022 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#|The `pageId` attribute now allows you to set the **SpotIQ** page as the home tab of your embedded ThoughtSpot app. - -For more information, see xref:full-embed.adoc[Embed full application]. -|==== - -== Version 1.9.6 and 1.9.7, April 2022 - -Bug fixes and improvements - -== Version 1.9.5, April 2022 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#|The `locale` attribute is now available in embed packages. You can use this attribute to set the locale or language of your embedded application view. -For more information, see xref:locale-setting.adoc[Set locale and display language]. -|==== - -== Version 1.9.4, April 2022 - -Bug fixes and improvements to React components. - -== Version 1.9.3, March 2022 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#| The SDK now supports the `disableLoginRedirect` attribute to improve the login experience for your application users. When enabled, this attribute prevents your app from redirecting users to the login page when their session expires. + -You can use this attribute along with `autoLogin` to automatically authenticate and re-login a user. + -This feature is applicable to token-based authentication, that is, when the `AuthType` is set as `TrustedAuthToken` in the SDK. - -For more information, see xref:embed-authentication.adoc#trusted-auth-embed[Authentication]. -|==== - -== Version 1.9.2, March 2022 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#| You can now trigger events on React components using the `useEmbedRef` hook. - -For more information, see xref:embed-ts-react-app.adoc[Embed ThoughtSpot in a React app]. -|==== - -== Version 1.9.1, March 2022 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE#| The SDK now includes the `visibleVizs` attribute in the `LiveboardEmbed` package. This attribute allows you to add visualization GUIDs that you want to display when a Liveboard renders for the first time. - -For more information, see xref:embed-pinboard.adoc[Embed a Liveboard]. - -|[tag greenBackground]#NEW FEATURE# a| The following events are now available in the SDK: + - -* `LiveboardRendered` (EmbedEvent) - -For more information, see xref:event-embedEvents.adoc[Events reference]. -|==== - -== Version 1.9.0, March 2022 -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a| The SDK now includes the following new enumerations for UI actions: - -* `Action.AnswerDelete` + -* `Action.AnswerChartSwitcher` + -* `Action.AddToFavorites` + -* `Action.EditDetails` + - -For more information, see xref:embed-actions.adoc#standard-actions[Show or hide UI actions]. - -|[tag greenBackground]#NEW FEATURE# a| The SDK now supports the `UpdateRuntimeFilters` host event. For more information, see xref:events-hostEvents.adoc[Events reference]. -|==== - -== Version 1.8.x, February 2022 - -[width="100%" cols="1,4"] -|==== -|[tag redBackground]#BREAKING CHANGE# | The `autoLogin` attribute is now set as `false` by default. This attribute is used in the `init` method to automatically re-login a user when a session expires. -|[tag greenBackground]#NEW FEATURE# | The `init` method now returns the `authPromise` which resolves when a user authentication is completed. -|==== - - -== Version 1.7.0, January 2022 - -[width="100%" cols="1,4"] -|==== -| -[tag greenBackground]#NEW FEATURE# |+++
OIDC AuthType
+++ - -The SDK supports the `OIDC` `authType` in `init` calls. If you want your application users to authenticate to an OpenID provider and use their SSO credentials to access the embedded ThoughtSpot content, you can enable the `OIDC` authentication type in the SDK. - -For more information, see xref:embed-authentication.adoc#oidc-auth[Authentication and security attributes]. -|[tag greenBackground]#NEW FEATURE# a|+++
Embed events
+++ - -The SDK includes the following new event: - -* `RouteChange` - -For more information, see xref:event-embedEvents.adoc[Events reference]. - -|==== - -== Version 1.6.x, November 2021 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a|+++
Visible actions
+++ - -You can now configure a set of ThoughtSpot UI actions as visible actions and display these actions in the embedded UI. If your embedded instance requires only a few actions, you can use the `visibleActions` API to show only these actions in the embedded ThoughtSpot UI. - -For more information, see xref:embed-actions.adoc[Show or hide UI actions]. - -|[tag orangeBackground]#MODIFIED# | +++
Terminology changes
+++ - -The SDK library and object parameter names are modified to rebrand pinboards as Liveboards. For a complete list of changes, see xref:terminology-update.adoc#sdk-changes[Terminology changes]. - -|[tag greenBackground]#NEW FEATURE# a|+++
Embed events
+++ - -The SDK supports the following new events: - -* `DialogOpen` -* `DialogClose` - -For more information, see xref:event-embedEvents.adoc[Events reference]. -|==== - -== Version 1.5.0, October 2021 - -[width="100%" cols="1,4"] -|==== -|| -|[tag greenBackground]#NEW FEATURE# | +++
Render embedded objects in queue
+++ - -The SDK now supports rendering embedded objects in a queue. If you have multiple embedded objects, you can enable the `queueMultiRenders` parameter to queue your embedded objects and render them one after another. This feature helps in decreasing the load on the web browsers and improving your application loading experience. By default, this attribute is set to `false`. - -|[tag greenBackground]#NEW FEATURE# a|+++
Liveboard embed
+++ - -The `pinboardEmbed` package includes the `defaultHeight` attribute that sets a minimum height for embedded objects on a pinboard page, and the corresponding visualization pages that a user can navigate to. - -For more information, see xref:embed-search.adoc[Embed a pinboard]. - -|[tag greenBackground]#NEW FEATURE# a|+++
Embed events
+++ - -The SDK EmbedEvent library includes the following new events: - -* `VizPointDoubleClick` -* `Drilldown` -* `SetVisibleVizs` - -For more information, see xref:event-embedEvents.adoc[Events reference]. - -|==== - -== Version 1.4.0, September 2021 - -[width="100%" cols="1,4"] -|==== -|| -|[tag greenBackground]#NEW FEATURE# a|+++
+++Prefetch API+++
+++ - -The `prefetch` API fetches static resources from a given URL before your application loads. Web browsers can then cache the prefetched resources locally and serve them from a user's local disk. You can use this API to load the embedded objects faster and improve your application response time. - -For more information, see xref:prefetch-and-cache.adoc[Prefetch static resources]. - -|[tag greenBackground]#NEW FEATURE# a|+++
+++In-app page navigation+++
+++ - -The `navigateToPage` method in the SDK lets you provide quick and direct access to a specific pinboard, saved Answer, or an application page. You can add a custom menu action or button in your application UI that calls the `navigateToPage` method and leads your users to the page specified in the `path` parameter. - -For more information, see xref:page-navigation.adoc[Add a custom action for in-app navigation]. - -|[tag greenBackground]#NEW FEATURE# a|+++
+++Full application embedding+++
+++ - -The `appEmbed` SDK package includes the following new attributes: - -* The `disableProfileAndHelp` attribute to show or hide the `Help (?)` and the user profile menu in the navigation bar of your embedded app. - -* The `hideObjects` attribute to hide specific objects from a user's page view. - -For more information, see xref:full-embed.adoc[Embed full application]. - -|[tag greenBackground]#NEW FEATURE# |+++
+++Search embed +++
+++ - -The `searchEmbed` package includes the `forceTable` attribute that sets tabular view as the default format for presenting search data. You can set this attribute to `true` to force search results to appear in the table view. - -For more information, see xref:embed-search.adoc[Embed ThoughtSpot search]. - -|[tag redBackground]#REMOVED# | - -The `searchQuery` parameter is no longer supported and is removed from the `searchEmbed` SDK package. -|[tag greenBackground]#NEW FEATURE# a|+++
+++Embed events +++
+++ -The SDK EmbedEvent library includes the following events: - -* `QueryChanged` -* `AuthExpire` - -For more information, see xref:embed-events.adoc[Events and app integration]. -|==== - -== Version 1.3.0, August 2021 - -[width="100%" cols="1,4"] -|==== -|| -|[tag greenBackground]#NEW FEATURE# a| +++
searchOptions
+++ - -The `searchEmbed` SDK package introduces the `searchOptions` parameter for setting search tokens. The `searchOptions` parameter includes the following attributes: - -* `searchTokenString` -+ -A TML query string to define search tokens. - -* `executeSearch` -+ -When set to `true`, it executes search and shows the search results. - -For more information, see xref:embed-search.adoc#search-query[Embed ThoughtSpot search]. - -|[tag redBackground]#DEPRECATED# a| +++
searchQuery
+++ - -The `searchQuery` parameter in the `searchEmbed` SDK package is deprecated in the Visual Embed SDK version 1.3.1. Instead, you can use the `searchOptions` parameter to define the search token string. - -For more information about `searchOptions`, see xref:embed-search.adoc#search-query[Embed ThoughtSpot search]. - -|[tag greenBackground]#NEW FEATURE# a| +++
autoLogin
+++ - -The SDK now supports logging in users automatically after a user session has expired. - -For more information, see xref:embed-authentication.adoc#embed-session-sec[Embed user authentication]. - -|[tag greenBackground]#NEW FEATURE# a| +++
shouldEncodeUrlQueryParams
+++ - -You can now convert query parameters in the ThoughtSpot generated URLs to base64-encoded format. You can enable this attribute to secure your cluster from cross-site scripting attacks. -|[tag redBackground]#BREAKING CHANGE# a| +++
Data structure changes in custom action response payloads
+++ - -* The data structure passed in the custom action response for search now shows as `payload.data.embedAnswerData` instead of `payload.data.columnsAndData`. - -* The Answer payload for custom actions includes the following metadata: - -** `reportBookmetadata` -+ -Includes visualization metadata attributes such as description, object header metadata, author details, timestamp of the Answer creation, and modification. - -** user data -+ -Includes user information such as username, GUID of the user, and email address. - -To view a sample response payload, see xref:callback-response-payload.adoc#search-data-payload[Custom action response payload]. - -|[tag greenBackground]#NEW FEATURE# a| +++
preventPinboardFilterRemoval
+++ - -The `pinboardEmbed` SDK package now includes the `preventPinboardFilterRemoval` attribute. You can use this attribute to disable the filter removal action and thus prevent users from removing the filter chips added on a pinboard page. - -For more information, see xref:embed-pinboard.adoc[Embed a pinboard] and xref:embed-a-viz.adoc[Embed a visualization]. -|[tag greenBackground]#NEW FEATURE# a| +++
suppressNoCookieAccessAlert
+++ - -You can now set custom alerts for `noCookieAccess` events. By default, the SDK triggers a `noCookieAccess` event and generates an alert when a user's browser blocks third-party cookies. The `suppressNoCookieAccessAlert` allows you to disable this alert. - -|[tag greenBackground]#NEW FEATURE# a| +++
Support for fetching callback custom action payload in batches
+++ - -The Visual Embed SDK now supports processing data in batches for callback custom action responses. -The callback custom action event in the SDK package supports defining `batchSize` and `offset` values to paginate the Answer payload and send the records in batches. - -For more information, see xref:push-data-to-external-app.adoc#large-dataset[Callback custom action workflow]. -|==== - -== Version 1.2.0, June 2021 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a|+++
SAML authentication
+++ - -The Visual Embed SDK packages now include the `noRedirect` attribute as an optional parameter for the SAMLRedirect SSO `AuthType`. If you want to display the SAML authentication workflow in a pop-up window, instead of refreshing the application web page to direct users to the SAML login page, you can set the `noRedirect` attribute to `true`. - -For more information, see the instructions for embedding xref:full-embed.adoc[ThoughtSpot pages], xref:embed-search.adoc[search], xref:embed-pinboard.adoc[pinboard], and xref:embed-a-viz.adoc[visualizations]. - -|[tag greenBackground]#NEW FEATURE# a|+++
Pinboard actions
+++ -The *More* menu image:./images/icon-more-10px.png[the more options menu] in the embedded Pinboard page now shows the following actions for pinboard and visualizations. - -Pinboard:: -* Save -* Make a copy -* Add filters -* Configure filters -* Present -* Download as PDF -* Pinboard info -* Manage schedules - - -[NOTE] -Users with edit permissions can view and access the *Save*, *Add filters*, *Configure filters*, and *Manage schedules* actions. -|[tag greenBackground]#NEW FEATURE# a|+++
Visualization actions
+++ - -Visualizations on a pinboard: - -* Pin -* Download -* Edit -* Present -* Download as CSV -* Download as XLSX -* Download as PDF - -[NOTE] -Users with edit permissions can view and access the *Edit* action. The *Download as CSV*, *Download as XLSX*, and *Download as PDF* actions are available for table visualizations. The *Download* action is available for chart visualizations. - -|==== - -== Version 1.1.0, May 2021 - -[width="100%" cols="1,4"] -|==== -|[tag greenBackground]#NEW FEATURE# a|+++
NoCookieAccess event
+++ +Emitted when a saved Spotter conversation is selected from the chat history sidebar in the embedded Spotter interface. -When a user accesses the embedded application from a web browser that has third-party cookies disabled, the Visual Embed SDK emits the `NoCookieAccess` event to notify the developer. Cookies are disabled by default in Safari. Users can enable third-party cookies in Safari’s Preferences setting page or use another web browser. -To know how to enable this setting by default on Safari for a ThoughtSpot embedded instance, contact ThoughtSpot Support. |==== From 0b1204dcbc4b1a9985edec579bfe71ba2cae05f6 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <76986173+ShashiSubramanya@users.noreply.github.com> Date: Tue, 23 Jun 2026 17:55:11 +0530 Subject: [PATCH 051/136] docs(26.7): add GCS storage integration for webhook delivery (SCAL-301399) New page documenting GCS bucket configuration as a webhook delivery destination for GCP-hosted ThoughtSpot clusters. Extends existing S3 webhook storage documentation to cover GCP environments. --- modules/ROOT/pages/webhooks-gcs-storage.adoc | 149 +++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 modules/ROOT/pages/webhooks-gcs-storage.adoc diff --git a/modules/ROOT/pages/webhooks-gcs-storage.adoc b/modules/ROOT/pages/webhooks-gcs-storage.adoc new file mode 100644 index 000000000..0a8fe6db6 --- /dev/null +++ b/modules/ROOT/pages/webhooks-gcs-storage.adoc @@ -0,0 +1,149 @@ += GCS storage integration for webhook delivery +:toc: true +:toclevels: 2 + +:page-title: GCS storage for webhooks +:page-pageid: webhooks-gcs-storage +:page-description: Configure a Google Cloud Storage bucket to receive ThoughtSpot webhook payloads on GCP clusters. + +// SOURCE: SCAL-301399, SCAL-304083, SCAL-310002 + +ThoughtSpot supports delivering webhook payloads directly to a **Google Cloud Storage (GCS) bucket** on GCP-hosted clusters. This allows you to capture and retain webhook event data — such as KPI Monitor alerts — without requiring a publicly reachable HTTP endpoint. + +[NOTE] +==== +GCS storage integration for webhooks is available for GCP-hosted ThoughtSpot clusters only. For AWS clusters, see xref:webhooks-s3-storage.adoc[Amazon S3 storage integration for webhook delivery]. +==== + +== Before you begin + +Before configuring GCS storage for webhooks, ensure that: + +* Your ThoughtSpot instance is hosted on GCP. +* You have a GCS bucket in the same GCP project or a project that allows cross-project IAM bindings. +* You have administrative access to your ThoughtSpot instance. +* The *Webhooks* feature is enabled on your cluster. Contact ThoughtSpot Support if it is not enabled. + +== Step 1: Retrieve the ThoughtSpot GCP Service Account + +ThoughtSpot uses a managed GCP Service Account to write objects to your GCS bucket. You must grant this service account the appropriate IAM role on your bucket before webhook delivery can begin. + +Use the storage config REST API endpoint to retrieve the GCP Service Account email address: + +[source,bash] +---- +curl -X GET \ + 'https:///api/rest/2.0/webhooks/storage/config' \ + -H 'Authorization: Bearer ' +---- + +// TODO: verify with engineering — confirm the exact endpoint path for the get storage config API + +The response returns the GCP Service Account email in the following format: + +[source,json] +---- +{ + "gcp_service_account": "ts-webhook-@.iam.gserviceaccount.com" +} +---- + +// TODO: verify with engineering — confirm the exact response field names for GCP Service Account details + +== Step 2: Grant IAM permissions on your GCS bucket + +In the GCP Console or using the `gcloud` CLI, grant the ThoughtSpot service account the *Storage Object Creator* role on your GCS bucket: + +[source,bash] +---- +gcloud storage buckets add-iam-policy-binding gs:// \ + --member="serviceAccount:" \ + --role="roles/storage.objectCreator" +---- + +[NOTE] +==== +ThoughtSpot requires write-only access to deliver payloads. The *Storage Object Creator* role is sufficient and follows the principle of least privilege. +==== + +== Step 3: Configure a webhook with GCS storage + +Use the REST API to create or update a webhook, specifying your GCS bucket as the storage destination. + +=== Create a webhook with GCS storage + +[source,bash] +---- +curl -X POST \ + 'https:///api/rest/2.0/webhooks/create' \ + -H 'Authorization: Bearer ' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "my-gcs-webhook", + "storage_config": { + "storage_type": "GCS", + "bucket_name": "", + "object_prefix": "thoughtspot-webhooks/" + } + }' +---- + +// TODO: verify with engineering — confirm the exact request body schema for GCS storage_config, including all required and optional fields, and whether a URL field is required when GCS storage is used + +=== Update an existing webhook to use GCS storage + +[source,bash] +---- +curl -X PUT \ + 'https:///api/rest/2.0/webhooks//update' \ + -H 'Authorization: Bearer ' \ + -H 'Content-Type: application/json' \ + -d '{ + "storage_config": { + "storage_type": "GCS", + "bucket_name": "", + "object_prefix": "thoughtspot-webhooks/" + } + }' +---- + +// TODO: verify with engineering — confirm the update endpoint path and request body schema + +== Webhook payload format in GCS + +ThoughtSpot writes each webhook event as a separate object in your GCS bucket. Objects are named using the following pattern: + +---- +//-.json +---- + +// TODO: verify with engineering — confirm the object naming convention and payload format for GCS deliveries + +== Verify delivery + +To verify that ThoughtSpot is delivering webhooks to your GCS bucket: + +. In the GCP Console, navigate to your bucket and check for new objects. +. Review the object content to confirm the payload matches the expected schema. + +== Troubleshoot + +[cols="2,3"] +|==== +| Issue | Resolution + +| Objects are not appearing in the bucket +| Verify that the ThoughtSpot service account has the `roles/storage.objectCreator` IAM binding on the bucket. + +| `permission denied` error in webhook logs +| The service account may have been rotated. Retrieve the current service account email using the storage config API and re-grant IAM permissions. + +| Webhook is configured but not triggering +| Verify that the webhook is enabled and that the associated KPI Monitor alert condition is met. Contact ThoughtSpot Support if the issue persists. +|==== + +== Related topics + +* xref:webhooks-s3-storage.adoc[Amazon S3 storage integration for webhook delivery] +* xref:webhooks.adoc[Webhooks for KPI Monitor alerts] +* xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog] From b59b9840e81181f3c158e1d0c0dd21de24bae028 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <76986173+ShashiSubramanya@users.noreply.github.com> Date: Tue, 23 Jun 2026 17:55:57 +0530 Subject: [PATCH 052/136] docs(26.7): add Saved Chat public APIs reference page (SCAL-290720) New page documenting REST API and SDK host events for managing saved Spotter conversations from host applications. Covers GET conversations endpoint, LoadChat/DeleteChat/RenameChat host events, and a complete integration example. --- .../ROOT/pages/saved-conversations-api.adoc | 267 ++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 modules/ROOT/pages/saved-conversations-api.adoc diff --git a/modules/ROOT/pages/saved-conversations-api.adoc b/modules/ROOT/pages/saved-conversations-api.adoc new file mode 100644 index 000000000..b77e40238 --- /dev/null +++ b/modules/ROOT/pages/saved-conversations-api.adoc @@ -0,0 +1,267 @@ += Saved Chat public APIs +:toc: true +:toclevels: 2 + +:page-title: Saved Chat APIs +:page-pageid: saved-conversations-api +:page-description: Use REST APIs and SDK methods to manage saved Spotter conversations from your host application. + +// SOURCE: SCAL-290720, SCAL-313991 + +ThoughtSpot provides public REST API endpoints and Visual Embed SDK host events for managing saved Spotter conversations. These APIs enable advanced embed developers to build fully headless conversation history experiences — for example, rendering a custom chat history list in the host application and loading or managing conversations without relying on the ThoughtSpot sidebar UI. + +== Prerequisites + +* ThoughtSpot Cloud 26.7.0.cl or later. +* Visual Embed SDK v1.50.0 or later. +* The authenticated user must have *Spotter access* on the instance. +* The *Save chat* feature must be enabled on your cluster. Contact ThoughtSpot Support to enable it. + +== Use case + +Some embedded applications manage navigation entirely in the host app and hide ThoughtSpot's native sidebar navigation. These integrations can use the Saved Chat APIs to: + +* Display a custom list of a user's saved Spotter conversations in the host application's own UI. +* Load a specific conversation into the embedded Spotter interface on user selection. +* Rename or delete conversations in response to user actions in the host app. +* React to conversation lifecycle events to keep an external history list in sync. + +== REST API: Fetch saved conversations + +Use the following endpoint to retrieve a paginated list of saved conversations for the authenticated user. + +=== Endpoint + +---- +GET /api/rest/2.0/ai/agent/conversations +---- + +=== Authentication + +Requires Bearer token authentication. The token must be scoped to the user whose conversation history is being accessed. + +=== Request parameters + +[cols="2,1,1,4"] +|==== +| Parameter | Type | Required | Description + +| `limit` +| integer +| No +| Number of conversations to return per page. Default: `20`. Maximum: `40`. + +| `offset` +| integer +| No +| Pagination offset. Default: `0`. + +| `skip_empty` +| boolean +| No +| When `true`, skips conversations where the user created a thread but did not ask any questions. Default: `true`. +|==== + +// TODO: verify with engineering — confirm whether GET /api/rest/2.0/ai/agent/conversations accepts parameters in the request body or as query parameters + +=== Example request + +[source,bash] +---- +curl -X GET \ + 'https:///api/rest/2.0/ai/agent/conversations?limit=20&offset=0&skip_empty=true' \ + -H 'Authorization: Bearer ' +---- + +=== Example response + +[source,json] +---- +{ + "conversations": [ + { + "conv_id": "yatqmyIIWfCQ", + "title": "Sales by region Q1", + "created_at": "2026-01-21T09:11:05.297252Z", + "updated_at": "2026-01-21T11:16:55.167147Z", + "worksheet_id": "cd252e5c-b552-49a8-821d-3eadaa049cca", + "worksheet_name": "Retail - Apparel", + "active_thread_length": 4 + } + ] +} +---- + +// SOURCE: SCAL-313991, design doc 17cu1O3lQa2-WQsBMwkv0gMGCwAaT5gPfHETQR_5VRcw + +=== Response fields + +[cols="2,1,4"] +|==== +| Field | Type | Description + +| `conv_id` +| string +| Unique identifier for the conversation. Pass this value to SDK host events. + +| `title` +| string +| User-visible title of the conversation. + +| `created_at` +| string (ISO 8601) +| Timestamp when the conversation was created. + +| `updated_at` +| string (ISO 8601) +| Timestamp of the most recent update to the conversation. + +| `worksheet_id` +| string +| GUID of the data source associated with the conversation. + +| `worksheet_name` +| string +| Display name of the associated data source. + +| `active_thread_length` +| integer +| Number of active messages in the conversation thread. +|==== + +== SDK host events + +After fetching the conversation list via the REST API, use the following `SpotterEmbed` host events to load or manage a specific conversation in the embedded interface. + +=== Load a conversation + +[source,JavaScript] +---- +spotterEmbed.trigger(HostEvent.LoadChat, { chatId: '' }); +---- + +Loads the specified conversation by ID into the embedded Spotter interface. When triggered, Spotter restores the conversation context and the user can continue the session from where they left off. + +[NOTE] +==== +Users can only load their own conversations. Attempting to load another user's conversation returns an error. +==== + +=== Delete a conversation + +[source,JavaScript] +---- +spotterEmbed.trigger(HostEvent.DeleteChat, { chatId: '' }); +---- + +Deletes the specified conversation by ID. After deletion, the embed emits `EmbedEvent.SpotterConversationDeleted`. Listen to this event to update your external conversation list. + +[source,JavaScript] +---- +spotterEmbed.on(EmbedEvent.SpotterConversationDeleted, (eventData) => { + // Remove the deleted conversation from your host app's list + removeConversationFromList(eventData.data.chatId); +}); +---- + +=== Rename a conversation + +[source,JavaScript] +---- +spotterEmbed.trigger(HostEvent.RenameChat, { + chatId: '', + title: 'New conversation title' +}); +---- + +Renames the specified conversation. After a successful rename, refresh your external conversation list by calling `GET /api/rest/2.0/ai/agent/conversations`. + +// TODO: verify with engineering — confirm whether a SpotterConversationRenamed EmbedEvent is emitted after a successful rename + +== Embed events for conversation lifecycle + +The following embed events are available to keep your host application's conversation list in sync with user actions inside the embedded Spotter interface: + +[cols="2,4"] +|==== +| Event | When emitted + +| `EmbedEvent.SpotterConversationDeleted` +| When a saved conversation is deleted by the user or via `HostEvent.DeleteChat`. + +| `EmbedEvent.SpotterConversationSelected` +| When a saved conversation is selected from the Spotter chat history sidebar. +|==== + +== Complete example: Custom conversation history list + +The following example demonstrates a pattern for rendering a custom conversation history list in the host application and allowing users to continue conversations inside the embedded Spotter interface. + +[source,JavaScript] +---- +import { + SpotterEmbed, + AuthType, + init, + EmbedEvent, + HostEvent +} from '@thoughtspot/visual-embed-sdk'; + +init({ + thoughtSpotHost: 'https://', + authType: AuthType.TrustedAuthToken, + getAuthToken: () => fetchToken(), +}); + +const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { + frameParams: { width: '100%', height: '100%' }, + worksheetId: 'auto_mode', +}); + +// Listen for conversation deletion inside the embed +spotterEmbed.on(EmbedEvent.SpotterConversationDeleted, (eventData) => { + refreshConversationList(); // Re-fetch via REST API and update host app UI +}); + +// Listen for conversation selection inside the embed +spotterEmbed.on(EmbedEvent.SpotterConversationSelected, (eventData) => { + highlightConversationInList(eventData.data.chatId); +}); + +spotterEmbed.render(); + +// Load a conversation when the user clicks in the host app's history list +function loadConversation(convId) { + spotterEmbed.trigger(HostEvent.LoadChat, { chatId: convId }); +} + +// Delete a conversation from the host app's history list +function deleteConversation(convId) { + spotterEmbed.trigger(HostEvent.DeleteChat, { chatId: convId }); +} + +// Rename a conversation from the host app's history list +function renameConversation(convId, newTitle) { + spotterEmbed.trigger(HostEvent.RenameChat, { chatId: convId, title: newTitle }); +} + +// Fetch conversation list from the REST API +async function fetchConversations(offset = 0) { + const response = await fetch( + `https:///api/rest/2.0/ai/agent/conversations?limit=20&offset=${offset}&skip_empty=true`, + { + method: 'GET', + headers: { + 'Authorization': `Bearer ${await fetchToken()}`, + }, + } + ); + return response.json(); +} +---- + +== Related topics + +* xref:embed-spotter.adoc[Embed Spotter] +* xref:api-changelog.adoc[Visual Embed SDK changelog] +* xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog] From 1cd36090f0a562b68e44010192540a5dcb09a8cd Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <76986173+ShashiSubramanya@users.noreply.github.com> Date: Tue, 23 Jun 2026 17:57:30 +0530 Subject: [PATCH 053/136] docs(26.7): add SpotterViz customization page (SCAL-311987, SCAL-303724, SCAL-309605) New page covering SpotterViz embed customization APIs: - SpotterVizConfig interface (brand name, headline, starter prompts) - CSS variables for Insight Tile styling - EmbedEvents: SpotterVizMount, SpotterVizPromptSubmit - Runtime filter support for Insight Tiles - Insight Tile Beta feature and limitations --- modules/ROOT/pages/embed-spotter-viz.adoc | 191 ++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 modules/ROOT/pages/embed-spotter-viz.adoc diff --git a/modules/ROOT/pages/embed-spotter-viz.adoc b/modules/ROOT/pages/embed-spotter-viz.adoc new file mode 100644 index 000000000..39c0c9296 --- /dev/null +++ b/modules/ROOT/pages/embed-spotter-viz.adoc @@ -0,0 +1,191 @@ += Customizing SpotterViz +:toc: true +:toclevels: 2 + +:page-title: Customizing SpotterViz +:page-pageid: embed-spotter-viz +:page-description: Customize the SpotterViz panel and Insight Tiles in embedded Liveboards using the Visual Embed SDK. + +// SOURCE: SCAL-311987, SCAL-311988, SCAL-303724, SCAL-309605 + +SpotterViz is the AI-powered analysis panel that appears on embedded Liveboards. It displays **Insight Tiles** — AI-generated textual analysis of Liveboard data — and exposes a customizable prompt interface for user interaction. + +This page describes how to customize SpotterViz in embedded Liveboards using the Visual Embed SDK `SpotterVizConfig` interface and related APIs. + +[NOTE] +==== +SpotterViz customization APIs require ThoughtSpot Cloud 26.7.0.cl or later and Visual Embed SDK v1.50.0 or later. The Insight Tile feature is in Beta. Contact ThoughtSpot Support to enable this feature on your instance. +==== + +== About Insight Tiles + +Insight Tiles are a new Liveboard tile type that uses Spotter AI to generate automated textual analysis of the data in your Liveboard. A tile displays 5–7 AI-generated bullet-point insights with a distinct light blue gradient background. + +Key behaviors: + +* *Scope* — Each Insight Tile can be scoped to a Tab, a Group, or an individual Answer. +* *Auto-retriggering* — Insight Tiles automatically regenerate insights on Liveboard load and when Liveboard-level filters change. +* *Localization* — Insights are rendered in the user's configured locale. +* *Runtime filters* — Runtime filters and parameters passed to `LiveboardEmbed` are respected by Insight Tiles. See <>. + +Beta limitations: + +* Insight Tiles are not rendered in scheduled exports or downloads. A placeholder is shown instead. +* Cross-filter interactions are not supported in this Beta release. +* Pinning Insight Tiles from plugins is not supported. + +// TODO: verify with engineering — add link to product docs page for Insight Tiles (thoughtspot-docs) once published + +== `SpotterVizConfig` interface + +The `SpotterVizConfig` interface is available on `LiveboardViewConfig` and `AppViewConfig` via the `spotterViz` property. Use it to customize the SpotterViz panel's branding and prompt experience. + +[source,JavaScript] +---- +import { LiveboardEmbed } from '@thoughtspot/visual-embed-sdk'; + +const liveboardEmbed = new LiveboardEmbed(document.getElementById('ts-embed'), { + frameParams: { width: '100%', height: '100%' }, + liveboardId: '', + spotterViz: { + brandName: 'Acme Analytics', + headline: 'AI-powered insights for your business', + description: 'Ask a question or explore the insights below.', + inputPlaceholder: 'Ask Acme Analytics a question...', + starterPrompts: [ + { prompt: 'What are the top-performing regions this quarter?' }, + { prompt: 'Show me revenue trends for the last 6 months.' }, + ], + }, +}); + +liveboardEmbed.render(); +---- + +=== `SpotterVizConfig` properties + +[cols="2,1,1,4"] +|==== +| Property | Type | Required | Description + +| `brandName` +| string +| No +| Custom brand name displayed in the SpotterViz panel header. Replaces the default "Spotter" label. + +| `headline` +| string +| No +| Custom headline text for the SpotterViz panel. + +| `description` +| string +| No +| Custom description text shown below the headline. + +| `inputPlaceholder` +| string +| No +| Custom placeholder text for the Spotter chat input field. + +| `starterPrompts` +| `SpotterVizStarterPrompt[]` +| No +| Array of starter prompt objects to replace the default prompt suggestions. Each object requires a `prompt` string property. +|==== + +// TODO: verify with engineering — confirm the complete and final list of SpotterVizConfig properties and whether any additional properties are available in 26.7.0.cl + +== CSS customization + +SpotterViz exposes CSS custom properties that allow you to style the Insight Tile to match your application's visual design. Apply these variables using the `customCSS` configuration in your `LiveboardEmbed` initialization. + +[source,JavaScript] +---- +const liveboardEmbed = new LiveboardEmbed(document.getElementById('ts-embed'), { + frameParams: { width: '100%', height: '100%' }, + liveboardId: '', + customCSS: { + variables: { + // TODO: verify with engineering — replace with confirmed CSS variable names + '--ts-spotterviz-background': 'linear-gradient(135deg, #e8f4fd, #cce8f8)', + '--ts-spotterviz-text-color': '#1a1a2e', + }, + }, +}); +---- + +// TODO: verify with engineering — provide the authoritative list of CSS variable names, their default values, and the CSS scope they apply to + +== Brand customization + +SpotterViz respects ThoughtSpot's brand customization settings. When brand colors are configured in the ThoughtSpot *Develop* > *Style customization* panel, the Insight Tile gradient background updates to reflect your brand palette. + +// TODO: verify with engineering — confirm the exact behavior of brand color overrides on the Insight Tile gradient background + +== Embed events + +Listen to the following events emitted by SpotterViz in your `LiveboardEmbed`: + +=== `EmbedEvent.SpotterVizMount` + +Emitted when the SpotterViz panel mounts in embed mode. + +[source,JavaScript] +---- +liveboardEmbed.on(EmbedEvent.SpotterVizMount, (eventData) => { + console.log('SpotterViz panel mounted:', eventData); +}); +---- + +=== `EmbedEvent.SpotterVizPromptSubmit` + +Emitted when a user submits a prompt in the SpotterViz panel. + +[source,JavaScript] +---- +liveboardEmbed.on(EmbedEvent.SpotterVizPromptSubmit, (eventData) => { + console.log('SpotterViz prompt submitted:', eventData); +}); +---- + +// TODO: verify with engineering — confirm whether additional EmbedEvents are introduced for Insight Tile load and error states in 26.7.0.cl + +[#runtime-filters] +== Runtime filters and Insight Tiles + +// SOURCE: SCAL-309605 + +Runtime filters and parameters passed to `LiveboardEmbed` are respected by Insight Tiles. When a runtime filter is applied, Spotter automatically regenerates the tile's insights using the filtered data context. + +No additional configuration is required. Runtime filters specified via `runtimeFilters` in `LiveboardViewConfig` are automatically applied to all Insight Tiles on the same Liveboard. + +[source,JavaScript] +---- +const liveboardEmbed = new LiveboardEmbed(document.getElementById('ts-embed'), { + frameParams: { width: '100%', height: '100%' }, + liveboardId: '', + runtimeFilters: [ + { + columnName: 'Region', + operator: RuntimeFilterOp.EQ, + values: ['West'], + }, + ], + spotterViz: { + brandName: 'Acme Analytics', + }, +}); + +liveboardEmbed.render(); +---- + +For more information, see xref:runtime-filter.adoc[Runtime filters]. + +== Related topics + +* xref:embed-spotter.adoc[Embed Spotter] +* xref:embed-pinboard.adoc[Embed a Liveboard] +* xref:runtime-filter.adoc[Runtime filters] +* xref:api-changelog.adoc[Visual Embed SDK changelog] +* xref:whats-new.adoc[What's new] From 60a8b9e2192ad48fa014f78d8237a34f1827f58a Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 23 Jun 2026 21:17:52 +0530 Subject: [PATCH 054/136] SCAL-320137 fix --- modules/ROOT/pages/rest-api-v2-reference.adoc | 18 +++++++++--------- modules/ROOT/pages/rest-apiv2-changelog.adoc | 2 ++ modules/ROOT/pages/whats-new.adoc | 6 +++--- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/modules/ROOT/pages/rest-api-v2-reference.adoc b/modules/ROOT/pages/rest-api-v2-reference.adoc index d50cd0cd5..6864a95a3 100644 --- a/modules/ROOT/pages/rest-api-v2-reference.adoc +++ b/modules/ROOT/pages/rest-api-v2-reference.adoc @@ -61,15 +61,15 @@ Allows sending a query to an ongoing conversation session with Spotter agent and |ThoughtSpot Cloud: __10.15.0.cl or later__ + ThoughtSpot Software: __Not available__ a| +++Try it out+++ -a|`PUT /api/rest/2.0/ai/agent/instructions/set` + -Sets custom instructions for the Spotter agent. -|ThoughtSpot Cloud: __26.6.0.cl or later__ + -ThoughtSpot Software: __Not available__ a| +++Try it out+++ - -a|`GET /api/rest/2.0/ai/agent/instructions/get` + -Retrieves the custom instructions currently configured for the Spotter agent. -|ThoughtSpot Cloud: __26.6.0.cl or later__ + -ThoughtSpot Software: __Not available__ a| +++Try it out+++ +//a|`PUT /api/rest/2.0/ai/agent/instructions/set` + +//Sets custom instructions for the Spotter agent. +//|ThoughtSpot Cloud: __26.7.0.cl or later__ + +//ThoughtSpot Software: __Not available__ a| +++Try it out+++ + +//a|`GET /api/rest/2.0/ai/agent/instructions/get` + +//Retrieves the custom instructions currently configured for the Spotter agent. +//|ThoughtSpot Cloud: __26.7.0.cl or later__ + +//ThoughtSpot Software: __Not available__ a| +++Try it out+++ a|`POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response` + Stops an in-progress Spotter agent response for a given conversation session. diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index c04b28c97..6bc715037 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -12,6 +12,7 @@ This changelog lists the features and enhancements introduced in REST API v2.0. === Spotter AI APIs +//// Agent instructions APIs:: The following new API endpoints allow you to set and retrieve persistent behavioral instructions for the Spotter agent. @@ -23,6 +24,7 @@ Retrieves the behavioral instructions currently configured by the administrator + For more information, see xref:spotter-agent-instructions.adoc[Spotter AI Agent instructions APIs]. +//// Stop in-progress agent response:: diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 5b908af2e..9ecd6537a 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -59,9 +59,9 @@ This release introduces the following enhancements for Spotter AI workflows and * Spotter embedding: + Spotter now includes data literacy skills that help users understand the underlying data model. Users can ask Spotter to explain available data sources, fields, and relationships in plain language within a conversation session. -* Spotter AI APIs: + -** New REST API endpoints to configure and retrieve persistent behavioral xref:spotter-agent-instructions.adoc[instructions for the Spotter agent]. -** New API endpoint xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[stop and cancel a long-running Spotter response]. +* Spotter AI APIs: + +//** New REST API endpoints to configure and retrieve persistent behavioral xref:spotter-agent-instructions.adoc[instructions for the Spotter agent]. +New API endpoint xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[stop and cancel a long-running Spotter response]. --- From 872eac510496404334980cb2210635c41dfdc4f1 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 23 Jun 2026 21:30:42 +0530 Subject: [PATCH 055/136] SCAL-320137 - spotter agent instructions api --- modules/ROOT/pages/common/nav-rest-api.adoc | 1 + modules/ROOT/pages/rest-api-v2-reference.adoc | 4 ++-- modules/ROOT/pages/rest-apiv2-changelog.adoc | 1 - modules/ROOT/pages/spotter-agent-instructions.adoc | 4 ++-- modules/ROOT/pages/whats-new.adoc | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index e93dd9a77..0229fbe29 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -23,6 +23,7 @@ REST APIs ** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] ** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] ** link:{{navprefix}}/spotter-nl-instructions[Spotter instructions APIs ^BETA^] +** link:{{navprefix}}/spotter-agent-instructions[Spotter instructions APIs ^BETA^] * link:{{navprefix}}/audit-logs[Audit logs] * link:{{navprefix}}/tml[TML] * link:{{navprefix}}/collections[Collections ^BETA^] diff --git a/modules/ROOT/pages/rest-api-v2-reference.adoc b/modules/ROOT/pages/rest-api-v2-reference.adoc index d50cd0cd5..97bb65bfc 100644 --- a/modules/ROOT/pages/rest-api-v2-reference.adoc +++ b/modules/ROOT/pages/rest-api-v2-reference.adoc @@ -63,12 +63,12 @@ ThoughtSpot Software: __Not available__ a| +++Try it out+++ a|`GET /api/rest/2.0/ai/agent/instructions/get` + Retrieves the custom instructions currently configured for the Spotter agent. -|ThoughtSpot Cloud: __26.6.0.cl or later__ + +|ThoughtSpot Cloud: __26.7.0.cl or later__ + ThoughtSpot Software: __Not available__ a| +++Try it out+++ a|`POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response` + diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index c0f7ec2d4..b868ee0a5 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -8,7 +8,6 @@ This changelog lists the features and enhancements introduced in REST API v2.0. For information about new features and enhancements available for embedded analytics, see xref:whats-new.adoc[What's New]. - == Version 26.7.0.cl, July 2026 // TODO: Confirm with engineering whether any new Spotter REST API v2 endpoints diff --git a/modules/ROOT/pages/spotter-agent-instructions.adoc b/modules/ROOT/pages/spotter-agent-instructions.adoc index 6b5deff35..682b2e5af 100644 --- a/modules/ROOT/pages/spotter-agent-instructions.adoc +++ b/modules/ROOT/pages/spotter-agent-instructions.adoc @@ -21,11 +21,11 @@ To use the agent instructions APIs, you need `CAN_USE_SPOTTER` privilege and val |===== a|`PUT /api/rest/2.0/ai/agent/instructions/set` [.version-badge.new]#New# + xref:spotter-agent-instructions.adoc#_set_agent_instructions[Sets behavioral instructions] for the Spotter agent. + -__Available on ThoughtSpot Cloud instances from 26.6.0.cl onwards.__ +__Available on ThoughtSpot Cloud instances from 26.7.0.cl onwards.__ a|`GET /api/rest/2.0/ai/agent/instructions/get` [.version-badge.new]#New# + xref:spotter-agent-instructions.adoc#_get_agent_instructions[Retrieves the behavioral instructions] currently configured for the Spotter agent. + -__Available on ThoughtSpot Cloud instances from 26.6.0.cl onwards.__ +__Available on ThoughtSpot Cloud instances from 26.7.0.cl onwards.__ |===== == Set agent instructions diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 213c12cfd..fe114099a 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -156,8 +156,8 @@ This release introduces the following enhancements for Spotter AI workflows and * Spotter embedding: + Spotter now includes data literacy skills that help users understand the underlying data model. Users can ask Spotter to explain available data sources, fields, and relationships in plain language within a conversation session. * Spotter AI APIs: + -** New REST API endpoints to configure and retrieve persistent behavioral xref:spotter-agent-instructions.adoc[instructions for the Spotter agent]. -** New API endpoint xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[stop and cancel a long-running Spotter response]. +//** New REST API endpoints to configure and retrieve persistent behavioral xref:spotter-agent-instructions.adoc[instructions for the Spotter agent]. + New API endpoint xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[stop and cancel a long-running Spotter response]. --- From d8d0db8e2efc5a9f76ef97fea38c6390bc9bdefc Mon Sep 17 00:00:00 2001 From: ShashiSubramanya <76986173+ShashiSubramanya@users.noreply.github.com> Date: Wed, 24 Jun 2026 07:02:54 +0530 Subject: [PATCH 056/136] Clean up what's new section for version 26.7.0.cl Removed detailed entries for version 26.7.0.cl from the what's new page. --- modules/ROOT/pages/whats-new.adoc | 94 ------------------------------- 1 file changed, 94 deletions(-) diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 213c12cfd..2ceac0760 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -24,100 +24,6 @@ This page lists new features, enhancements, and deprecated functionality introdu // ============================================================ -[.cl-table, cols="2,4", frame=none, grid=none] -|===== -a| -[.cl-label] -*Version 26.7.0.cl* - -a| - -[discrete] -==== Spotter file upload in embedded apps [.version-badge.new]#New# - -// SOURCE: https://github.com/thoughtspot/developer-docs/blob/main/modules/ROOT/pages/api-changelog.adoc (SDK v1.49.x section) - -Embedded Spotter applications can now allow users to upload files directly in the Spotter chat panel. The SDK introduces two new configuration parameters in `SpotterChatViewConfig` to enable and control this capability: - -* `spotterFileUploadEnabled` — When set to `true`, enables the file upload feature in the Spotter chat panel. -* `spotterFileUploadFileTypes` — Restricts the file types allowed for upload. Accepts a `SpotterFileUploadFileTypes` object. - -For more information, see xref:embed-spotter.adoc#_enable_file_upload_in_spotter_chat[Enable file upload in Spotter chat]. - ---- - -[discrete] -==== SpotterViz branding and customization [.version-badge.new]#New# - -The Visual Embed SDK 1.50.0 introduces the `SpotterVizConfig` interface and -`SpotterVizStarterPrompt` interface to allow embed developers to customize -the SpotterViz panel on embedded Liveboards and full-application embeds. - -Using `SpotterVizConfig`, you can now: - -* Set a custom brand name and headline for the SpotterViz panel. -* Add a custom description and input chat placeholder text. -* Show, hide, or replace the default starter prompts with -application-specific suggestions using `SpotterVizStarterPrompt`. - -The `spotterViz` property is available on both `AppViewConfig` and -`LiveboardViewConfig`. - -For more information, see xref:embed-spotter-viz.adoc[Customizing SpotterViz]. -// TODO: verify target page ID with the developer-docs team. - ---- - -[discrete] -==== Focused homepage experience [.version-badge.new]#New# - -A new `HomePage.Focused` enum member (`v4`) is introduced in `AppEmbed` -to enable the V4 homepage experience, which merges the Watchlist and Recents -sections into a single focused view. - -[NOTE] -==== -The V4 homepage experience requires Spotter to be enabled on your -ThoughtSpot instance. -==== - -For more information, see xref:embed-app.adoc#_discovery_experience[Discovery experience]. -// TODO: verify target anchor with the developer-docs team. - ---- - -[discrete] -==== New EmbedEvents for SpotterViz [.version-badge.new]#New# - -The SDK introduces two new event identifiers for monitoring SpotterViz -panel activity in embedded Liveboards: - -* `EmbedEvent.SpotterVizMount` + -Emitted when the SpotterViz panel mounts in embed mode. -* `EmbedEvent.SpotterVizPromptSubmit` + -Emitted when a user submits a prompt in the SpotterViz panel. - ---- - - -[discrete] -==== REST API v2 -// TODO: verify if any new Spotter REST API v2 endpoints are introduced specifically in 26.7.0.cl beyond those documented in 26.6.0.cl — confirm with engineering - -For information about REST API v2 enhancements in this release, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. - ---- - - -[discrete] -==== Visual Embed SDK -The Visual Embed SDK version 1.50.0 includes several new features -and enhancements. For more information, see the -xref:api-changelog.adoc[Visual Embed changelog]. - -|===== - - == June 2026 From 30cbf1b9d8a5530b035dc3e38cf4b54780c1446f Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 24 Jun 2026 10:32:20 +0530 Subject: [PATCH 057/136] timezone feature EA label --- modules/ROOT/pages/common/nav.adoc | 2 +- modules/ROOT/pages/timezone.adoc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index f37a0a86e..46054b4c0 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -51,7 +51,7 @@ Get started Build and deploy ** link:{{navprefix}}/thoughtspot-objects[ThoughtSpot objects] -** link:{{navprefix}}/timezone-aware-filtering[Timezone-aware keywords and filters ^BETA^] +** link:{{navprefix}}/timezone-aware-filtering[Timezone-aware keywords and filters] ** link:{{navprefix}}/variables[Variables] ** link:{{navprefix}}/parameterize-metadata[Parameterize metadata] * link:{{navprefix}}/development-and-deployment[Development and deployment] diff --git a/modules/ROOT/pages/timezone.adoc b/modules/ROOT/pages/timezone.adoc index 6c41c2209..59b43476a 100644 --- a/modules/ROOT/pages/timezone.adoc +++ b/modules/ROOT/pages/timezone.adoc @@ -7,7 +7,7 @@ :page-description: Configure per-Org and per-user timezone settings in embedded ThoughtSpot deployments using the Variable API, so that all relative date and time keywords resolve correctly for every user. :keywords: timezone, ts_user_timezone, Variable API, date keywords, embedded, TSE, Org timezone, user timezone -[beta betaBackground]#Beta# +[earlyAccess eaBackground]#Early Access# The timezone awareness feature in ThoughtSpot allows you to configure a preferred timezone for a user or at the Org level, or both, and apply this timezone when generating search results for a user's query. @@ -24,7 +24,7 @@ The timezone awareness feature eliminates timezone-based inconsistencies in mult [NOTE] ==== -The timezone awareness feature is currently in Beta and is disabled by default. To enable this feature, contact ThoughtSpot Support. +The timezone awareness feature is currently in Early Access and is disabled by default. To enable this feature, contact ThoughtSpot Support. ==== === Timezone resolution From 9f1f22f9227e959fbdcefa993120ca2b95c461d7 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 24 Jun 2026 10:32:20 +0530 Subject: [PATCH 058/136] timezone feature EA label --- modules/ROOT/pages/common/nav.adoc | 2 +- modules/ROOT/pages/timezone.adoc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index f37a0a86e..46054b4c0 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -51,7 +51,7 @@ Get started Build and deploy ** link:{{navprefix}}/thoughtspot-objects[ThoughtSpot objects] -** link:{{navprefix}}/timezone-aware-filtering[Timezone-aware keywords and filters ^BETA^] +** link:{{navprefix}}/timezone-aware-filtering[Timezone-aware keywords and filters] ** link:{{navprefix}}/variables[Variables] ** link:{{navprefix}}/parameterize-metadata[Parameterize metadata] * link:{{navprefix}}/development-and-deployment[Development and deployment] diff --git a/modules/ROOT/pages/timezone.adoc b/modules/ROOT/pages/timezone.adoc index 6c41c2209..59b43476a 100644 --- a/modules/ROOT/pages/timezone.adoc +++ b/modules/ROOT/pages/timezone.adoc @@ -7,7 +7,7 @@ :page-description: Configure per-Org and per-user timezone settings in embedded ThoughtSpot deployments using the Variable API, so that all relative date and time keywords resolve correctly for every user. :keywords: timezone, ts_user_timezone, Variable API, date keywords, embedded, TSE, Org timezone, user timezone -[beta betaBackground]#Beta# +[earlyAccess eaBackground]#Early Access# The timezone awareness feature in ThoughtSpot allows you to configure a preferred timezone for a user or at the Org level, or both, and apply this timezone when generating search results for a user's query. @@ -24,7 +24,7 @@ The timezone awareness feature eliminates timezone-based inconsistencies in mult [NOTE] ==== -The timezone awareness feature is currently in Beta and is disabled by default. To enable this feature, contact ThoughtSpot Support. +The timezone awareness feature is currently in Early Access and is disabled by default. To enable this feature, contact ThoughtSpot Support. ==== === Timezone resolution From ce9d71a5ce64614ccdd5c4abc3275e76b64a1691 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Thu, 25 Jun 2026 10:25:09 +0530 Subject: [PATCH 059/136] added granular RBAC privileges --- modules/ROOT/pages/data-report-v2-api.adoc | 5 +++++ modules/ROOT/pages/roles.adoc | 13 +++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index 196c8361d..81b82eb3c 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -13,6 +13,8 @@ ThoughtSpot provides the following REST API v2 endpoints to fetch data: * xref:#_fetch_liveboard_api[`POST /api/rest/2.0/metadata/liveboard/data`] to get data from a Liveboard. * xref:#_fetch_answer_data_api[`POST /api/rest/2.0/metadata/answer/data`] to get data from a saved Answer. +If Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) or `DATADOWNLOADING` (Can download Data) privilege is required to use these APIs. + === Search data API The `/api/rest/2.0/searchdata` endpoint requires you to specify the data source object ID and a query string for a successful API call. You can also define additional parameters such as `runtime_filter`, `runtime_sort`, and `runtime_param_override` to apply runtime overrides on the data set. @@ -231,6 +233,7 @@ To download a personalized view of the Liveboard, specify the view name in the ` * The downloadable file returned in API response file is extensionless. You need to rename the downloaded file by typing in the relevant extension. * If the Liveboard includes Note tiles, ensure that you do not pass the GUID of Note tiles as `visualization_identifiers` in the API request. Attempting to do so will lead to an error, and the API will return 400 error code in response. * Attempting to override existing filter values with runtime filters while exporting a Liveboard will result in an error. +* #If Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) or `DATADOWNLOADING` (Can download Data) privilege is required to export in the XLSX or CSV formats, and `CAN_DOWNLOAD_VISUALS` (Can download visuals) or `DATADOWNLOADING` (Can download Data) for PDF or PNG exports.# ==== ==== File Formats @@ -460,6 +463,8 @@ To download Answer data via `/api/rest/2.0/report/answer` API, you need at least In the request body, specify the GUID or name of the Answer object as `metadata_identifier`. The API supports exporting saved Answers, pinned Answers from a Liveboard, and Spotter-generated Answers. You can download Answer data in `CSV`, `XLSX`, `PNG`, and `PDF` format. The default `file_format` is `CSV`. +#If Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) or `DATADOWNLOADING` (Can download Data) privilege is required to export in the XLSX or CSV formats, and `CAN_DOWNLOAD_VISUALS` (Can download visuals) or `DATADOWNLOADING` (Can download Data) for PDF or PNG exports.# + ==== Example diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 7ae0fc708..fb95f5e0d 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -183,12 +183,21 @@ The `DATADOWNLOADING` (**Can download Data**) Role privilege allows users to dow |Role type|Privilege|Description |Data download | API: `DATADOWNLOADING` + UI: **Can download Data**| Allows users to download data from objects such as Liveboards and Answers. -|Download visuals |API: `CAN_DOWNLOAD_VISUALS` + +|Download visuals [earlyAccess eaBackground]#Early Access# |API: `CAN_DOWNLOAD_VISUALS` + UI: *Can download visuals* |Allows users to download data in the PDF or PNG file format. This is an early access feature and is not enabled by default on ThoughtSpot instances. -|Data export |API: `CAN_DOWNLOAD_DETAILED_DATA` + +|Data export [earlyAccess eaBackground]#Early Access# |API: `CAN_DOWNLOAD_DETAILED_DATA` + UI: *Can download detailed data* | Allows users to export data in XLSX/CSV format. This is an early access feature and is not enabled by default on ThoughtSpot instances. |=== + +[IMPORTANT] +==== +* Contact ThoughtSpot support to enable the new `CAN_DOWNLOAD_VISUALS` and `CAN_DOWNLOAD_DETAILED_DATA` privileges. +* Any user can either have `DATADOWNLOADING` or either or both of `CAN_DOWNLOAD_VISUALS` and `CAN_DOWNLOAD_DETAILED_DATA`. +* Users who previously did not have `DATADOWNLOADING` privileges will not be automatically assigned the new download privileges. Administrators can assign them manually. +* Users who previously had `DATADOWNLOADING` privileges will automatically be assigned both new privileges - `CAN_DOWNLOAD_VISUALS` and `CAN_DOWNLOAD_DETAILED_DATA`. +==== + == How to create and assign Roles You can create and assign Roles to a group on the link:https://docs.thoughtspot.com/cloud/latest/rbac[Admin page of the UI, window=_blank] or by using the REST API v1 and v2 endpoints. From 2473acbbe3f88e15d25823a0fb03d21f298eecb3 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Thu, 25 Jun 2026 10:59:42 +0530 Subject: [PATCH 060/136] added granular RBAC privileges --- modules/ROOT/pages/data-report-v2-api.adoc | 6 +++--- modules/ROOT/pages/roles.adoc | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index 81b82eb3c..6f65e4327 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -13,7 +13,7 @@ ThoughtSpot provides the following REST API v2 endpoints to fetch data: * xref:#_fetch_liveboard_api[`POST /api/rest/2.0/metadata/liveboard/data`] to get data from a Liveboard. * xref:#_fetch_answer_data_api[`POST /api/rest/2.0/metadata/answer/data`] to get data from a saved Answer. -If Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) or `DATADOWNLOADING` (Can download Data) privilege is required to use these APIs. +#If Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) or `DATADOWNLOADING` (Can download Data) privilege is required to use these APIs.# === Search data API @@ -233,7 +233,7 @@ To download a personalized view of the Liveboard, specify the view name in the ` * The downloadable file returned in API response file is extensionless. You need to rename the downloaded file by typing in the relevant extension. * If the Liveboard includes Note tiles, ensure that you do not pass the GUID of Note tiles as `visualization_identifiers` in the API request. Attempting to do so will lead to an error, and the API will return 400 error code in response. * Attempting to override existing filter values with runtime filters while exporting a Liveboard will result in an error. -* #If Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) or `DATADOWNLOADING` (Can download Data) privilege is required to export in the XLSX or CSV formats, and `CAN_DOWNLOAD_VISUALS` (Can download visuals) or `DATADOWNLOADING` (Can download Data) for PDF or PNG exports.# +* #If Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) or `DATADOWNLOADING` (Can download Data) privilege is required to export in the XLSX or CSV formats. Meanwhile, `CAN_DOWNLOAD_VISUALS` (Can download visuals) or `DATADOWNLOADING` (Can download Data) privilege is required for PDF or PNG exports.# ==== ==== File Formats @@ -463,7 +463,7 @@ To download Answer data via `/api/rest/2.0/report/answer` API, you need at least In the request body, specify the GUID or name of the Answer object as `metadata_identifier`. The API supports exporting saved Answers, pinned Answers from a Liveboard, and Spotter-generated Answers. You can download Answer data in `CSV`, `XLSX`, `PNG`, and `PDF` format. The default `file_format` is `CSV`. -#If Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) or `DATADOWNLOADING` (Can download Data) privilege is required to export in the XLSX or CSV formats, and `CAN_DOWNLOAD_VISUALS` (Can download visuals) or `DATADOWNLOADING` (Can download Data) for PDF or PNG exports.# +#If Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) or `DATADOWNLOADING` (Can download Data) privilege is required to export in the XLSX or CSV formats. Meanwhile, `CAN_DOWNLOAD_VISUALS` (Can download visuals) or `DATADOWNLOADING` (Can download Data) privilege is required for PDF or PNG exports.# ==== Example diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index fb95f5e0d..386387bdf 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -189,11 +189,11 @@ UI: *Can download visuals* |Allows users to download data in the PDF or PNG fil UI: *Can download detailed data* | Allows users to export data in XLSX/CSV format. This is an early access feature and is not enabled by default on ThoughtSpot instances. |=== - +#For review# [IMPORTANT] ==== * Contact ThoughtSpot support to enable the new `CAN_DOWNLOAD_VISUALS` and `CAN_DOWNLOAD_DETAILED_DATA` privileges. -* Any user can either have `DATADOWNLOADING` or either or both of `CAN_DOWNLOAD_VISUALS` and `CAN_DOWNLOAD_DETAILED_DATA`. +* A user can either have `DATADOWNLOADING` or either or both of `CAN_DOWNLOAD_VISUALS` and `CAN_DOWNLOAD_DETAILED_DATA`. * Users who previously did not have `DATADOWNLOADING` privileges will not be automatically assigned the new download privileges. Administrators can assign them manually. * Users who previously had `DATADOWNLOADING` privileges will automatically be assigned both new privileges - `CAN_DOWNLOAD_VISUALS` and `CAN_DOWNLOAD_DETAILED_DATA`. ==== From 2f7c09d152a4dac1e901538c510943d25cf6f608 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Thu, 25 Jun 2026 13:31:09 +0530 Subject: [PATCH 061/136] feedback edits --- modules/ROOT/pages/data-report-v2-api.adoc | 11 ++++++++--- modules/ROOT/pages/roles.adoc | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index 6f65e4327..b7f758ed0 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -13,7 +13,7 @@ ThoughtSpot provides the following REST API v2 endpoints to fetch data: * xref:#_fetch_liveboard_api[`POST /api/rest/2.0/metadata/liveboard/data`] to get data from a Liveboard. * xref:#_fetch_answer_data_api[`POST /api/rest/2.0/metadata/answer/data`] to get data from a saved Answer. -#If Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) or `DATADOWNLOADING` (Can download Data) privilege is required to use these APIs.# +#If Role-Based Access Control (RBAC) is enabled, the `DATADOWNLOADING` (Can download Data) privilege is required to use these APIs. Alternatively, if the granular data download RBAC privileges are enabled for your ThoughtSpot instance, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) is required.# === Search data API @@ -233,7 +233,8 @@ To download a personalized view of the Liveboard, specify the view name in the ` * The downloadable file returned in API response file is extensionless. You need to rename the downloaded file by typing in the relevant extension. * If the Liveboard includes Note tiles, ensure that you do not pass the GUID of Note tiles as `visualization_identifiers` in the API request. Attempting to do so will lead to an error, and the API will return 400 error code in response. * Attempting to override existing filter values with runtime filters while exporting a Liveboard will result in an error. -* #If Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) or `DATADOWNLOADING` (Can download Data) privilege is required to export in the XLSX or CSV formats. Meanwhile, `CAN_DOWNLOAD_VISUALS` (Can download visuals) or `DATADOWNLOADING` (Can download Data) privilege is required for PDF or PNG exports.# +* #If Role-Based Access Control (RBAC) is enabled, `DATADOWNLOADING` (Can download Data) privilege is required for Liveboard exports.# +* #If the granular Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) privilege is required to export in the XLSX or CSV formats, and the `CAN_DOWNLOAD_VISUALS` (Can download visuals) privilege is required for PDF or PNG exports. In this case the `DATADOWNLOADING` privilege ceases to exist# ==== ==== File Formats @@ -463,8 +464,12 @@ To download Answer data via `/api/rest/2.0/report/answer` API, you need at least In the request body, specify the GUID or name of the Answer object as `metadata_identifier`. The API supports exporting saved Answers, pinned Answers from a Liveboard, and Spotter-generated Answers. You can download Answer data in `CSV`, `XLSX`, `PNG`, and `PDF` format. The default `file_format` is `CSV`. -#If Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) or `DATADOWNLOADING` (Can download Data) privilege is required to export in the XLSX or CSV formats. Meanwhile, `CAN_DOWNLOAD_VISUALS` (Can download visuals) or `DATADOWNLOADING` (Can download Data) privilege is required for PDF or PNG exports.# +[IMPORTANT] +==== +* #If Role-Based Access Control (RBAC) is enabled, `DATADOWNLOADING` (Can download Data) privilege is required for Answer exports.# +* #If the granular Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) privilege is required to export in the XLSX or CSV formats, and the `CAN_DOWNLOAD_VISUALS` (Can download visuals) privilege is required for PDF or PNG exports. In this case the `DATADOWNLOADING` privilege ceases to exist# +==== ==== Example diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 386387bdf..8b085bbeb 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -193,7 +193,7 @@ UI: *Can download detailed data* | Allows users to export data in XLSX/CSV forma [IMPORTANT] ==== * Contact ThoughtSpot support to enable the new `CAN_DOWNLOAD_VISUALS` and `CAN_DOWNLOAD_DETAILED_DATA` privileges. -* A user can either have `DATADOWNLOADING` or either or both of `CAN_DOWNLOAD_VISUALS` and `CAN_DOWNLOAD_DETAILED_DATA`. +* Once these granular privileges are enabled, the `DATADOWNLOADING` privilege will cease to exit. * Users who previously did not have `DATADOWNLOADING` privileges will not be automatically assigned the new download privileges. Administrators can assign them manually. * Users who previously had `DATADOWNLOADING` privileges will automatically be assigned both new privileges - `CAN_DOWNLOAD_VISUALS` and `CAN_DOWNLOAD_DETAILED_DATA`. ==== From 751cf958582b73692b7b36e6c4e723a27c61036d Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Thu, 25 Jun 2026 14:07:24 +0530 Subject: [PATCH 062/136] feedback edits --- modules/ROOT/pages/data-report-v2-api.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index b7f758ed0..87d6797b7 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -468,7 +468,7 @@ The API supports exporting saved Answers, pinned Answers from a Liveboard, and S [IMPORTANT] ==== * #If Role-Based Access Control (RBAC) is enabled, `DATADOWNLOADING` (Can download Data) privilege is required for Answer exports.# -* #If the granular Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) privilege is required to export in the XLSX or CSV formats, and the `CAN_DOWNLOAD_VISUALS` (Can download visuals) privilege is required for PDF or PNG exports. In this case the `DATADOWNLOADING` privilege ceases to exist# +* #If the granular Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) privilege is required to export in the PDF, XLSX or CSV formats, and the `CAN_DOWNLOAD_VISUALS` (Can download visuals) privilege is required for PNG exports. In this case the `DATADOWNLOADING` privilege ceases to exist# ==== ==== Example From bece321d8ea0283ff5cb6cfad45173c9a2d2dd6e Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 29 Jun 2026 13:45:05 +0530 Subject: [PATCH 063/136] webhooks documenatation --- modules/ROOT/pages/api-changelog.adoc | 59 ++ modules/ROOT/pages/common/nav.adoc | 13 + modules/ROOT/pages/rest-api-v2-reference.adoc | 6 + modules/ROOT/pages/rest-apiv2-changelog.adoc | 10 +- modules/ROOT/pages/webhooks-api.adoc | 469 ++++++++++++ modules/ROOT/pages/webhooks-kpi-alerts.adoc | 24 +- modules/ROOT/pages/webhooks-lb-schedule.adoc | 388 +++------- modules/ROOT/pages/webhooks-s3-storage.adoc | 48 +- modules/ROOT/pages/webhooks-ux.adoc | 161 ++++ modules/ROOT/pages/webhooks.adoc | 77 +- modules/ROOT/pages/whats-new.adoc | 713 +++++++++++++++--- 11 files changed, 1524 insertions(+), 444 deletions(-) create mode 100644 modules/ROOT/pages/webhooks-api.adoc create mode 100644 modules/ROOT/pages/webhooks-ux.adoc diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index 9331eeda7..c4b6b0302 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -15,6 +15,42 @@ This page documents the changes introduced in each release of the Visual Embed S [width="100%" cols="1,4"] |==== |[tag greenBackground]#NEW FEATURE# a| + + +[discrete] +==== SpotterViz branding and customization [.version-badge.new]#New# + +The Visual Embed SDK 1.50.0 introduces the `SpotterVizConfig` interface and +`SpotterVizStarterPrompt` interface to allow embed developers to customize +the SpotterViz panel on embedded Liveboards and full-application embeds. + +Using `SpotterVizConfig`, you can now: + +* Set a custom brand name and headline for the SpotterViz panel. +* Add a custom description and input chat placeholder text. +* Show, hide, or replace the default starter prompts with +application-specific suggestions using `SpotterVizStarterPrompt`. + +The `spotterViz` property is available on both `AppViewConfig` and +`LiveboardViewConfig`. + +For more information, see xref:embed-spotter-viz.adoc[Customizing SpotterViz]. +--- + +[discrete] +==== New EmbedEvents for SpotterViz [.version-badge.new]#New# + +The SDK introduces two new event identifiers for monitoring SpotterViz +panel activity in embedded Liveboards: + +* `EmbedEvent.SpotterVizMount` + +Emitted when the SpotterViz panel mounts in embed mode. +* `EmbedEvent.SpotterVizPromptSubmit` + +Emitted when a user submits a prompt in the SpotterViz panel. + +--- + + [discrete] ===== SpotterViz embed customization @@ -51,8 +87,31 @@ Emitted when a user submits a prompt in the SpotterViz panel. Actions:: // TODO: verify with engineering — confirm Action enum names for SpotterViz visibility control (for example, Action.InsightTileRetrigger) +For more information, see xref:embed-spotterViz.adoc[Customizing SpotterViz]. + + +[discrete] +==== SpotterViz branding and customization [.version-badge.new]#New# + +The Visual Embed SDK 1.50.0 introduces the `SpotterVizConfig` interface and +`SpotterVizStarterPrompt` interface to allow embed developers to customize +the SpotterViz panel on embedded Liveboards and full-application embeds. + +Using `SpotterVizConfig`, you can now: + +* Set a custom brand name and headline for the SpotterViz panel. +* Add a custom description and input chat placeholder text. +* Show, hide, or replace the default starter prompts with +application-specific suggestions using `SpotterVizStarterPrompt`. + +The `spotterViz` property is available on both `AppViewConfig` and +`LiveboardViewConfig`. + For more information, see xref:embed-spotter-viz.adoc[Customizing SpotterViz]. +--- + + |[tag greenBackground]#NEW FEATURE# a| [discrete] ===== Insight Tiles — runtime filter and parameter support diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index f37a0a86e..d4ee519ca 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -75,6 +75,19 @@ Multi-tenancy ** link:{{navprefix}}/single-tenant-data-models[Single-tenant data models with Orgs] * link:{{navprefix}}/tse-cluster[Cluster maintenance and upgrade] +[.sidebar-title] +Webhooks + +* link:{{navprefix}}/webhooks[Overview] +* link:{{navprefix}}/webhooks-manage[Webhooks UI] +* link:{{navprefix}}/webhooks-rest-api[Webhook APIs] +* link:{{navprefix}}/webhooks-comm-channel[Configure and monitor webhook communication channels] +* link:{{navprefix}}/webhooks-lb-schedule[Deliver Liveboard reports to external application] +* link:{{navprefix}}/webhooks-s3-integration[AWS S3 storage integration for webhook delivery] +* link:{{navprefix}}/webhooks-gcs-storage[GCS storage integration for webhook delivery] +* link:{{navprefix}}/webhooks-lb-payload[Webhook response payload] +* link:{{navprefix}}/webhooks-kpi[Webhook for KPI alerts] + * Integration with external tools ** link:{{navprefix}}/external-tool-script-integration[External tools and scripts] ** link:{{navprefix}}/pendo-integration[Pendo integration with embed] diff --git a/modules/ROOT/pages/rest-api-v2-reference.adoc b/modules/ROOT/pages/rest-api-v2-reference.adoc index d50cd0cd5..df0941a7f 100644 --- a/modules/ROOT/pages/rest-api-v2-reference.adoc +++ b/modules/ROOT/pages/rest-api-v2-reference.adoc @@ -1269,6 +1269,12 @@ Retrieves webhook objects. a|ThoughtSpot Cloud: __10.14.0.cl or later__ a| +++Try it out +++ +a|`GET /api/rest/2.0/webhooks/storage-config` + +Retrieves the AWS S3 storage destination configuration for a webhook. Returns data only if the webhook has a storage destination configured. Requires `ADMINISTRATION` or `DEVELOPER` privilege. +a|ThoughtSpot Cloud: __26.3.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| ++++Try it out+++ + |`POST /api/rest/2.0/webhooks/{webhook_identifier}/update` + Allows you to edit properties of a webhook object. diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index c0f7ec2d4..b1da5b337 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -8,16 +8,8 @@ This changelog lists the features and enhancements introduced in REST API v2.0. For information about new features and enhancements available for embedded analytics, see xref:whats-new.adoc[What's New]. - == Version 26.7.0.cl, July 2026 -// TODO: Confirm with engineering whether any new Spotter REST API v2 endpoints -// are introduced in 26.7.0.cl beyond those listed in 26.6.0.cl. -// If no new endpoints ship, this section should note that and link to the 26.6.0.cl -// entries for agent instructions and stop-response which remain current. - -// SOURCE: https://github.com/thoughtspot/developer-docs/blob/main/modules/ROOT/pages/rest-apiv2-changelog.adoc -// (Current 26.6.0.cl entries for Spotter AI APIs are the most recent documented changes) === Spotter AI APIs @@ -30,6 +22,8 @@ The Spotter agent instructions APIs and the stop-response endpoint introduced in For the complete list of Spotter REST API v2 endpoints, see xref:spotter-agent-apis.adoc[Spotter Agent APIs]. +=== Webhook APIs +The `GET /api/rest/2.0/webhooks/storage-config` API endpoint allows retrieving the storage setup information required for configuring a GCS or S3 storage destination for webhook delivery. == Version 26.6.0.cl, June 2026 diff --git a/modules/ROOT/pages/webhooks-api.adoc b/modules/ROOT/pages/webhooks-api.adoc new file mode 100644 index 000000000..f068a8978 --- /dev/null +++ b/modules/ROOT/pages/webhooks-api.adoc @@ -0,0 +1,469 @@ += Webhook configuration and management via REST APIs +:toc: true +:toclevels: 3 + +:page-title: Manage webhooks +:page-pageid: webhooks-rest-api +:page-description: Create and manage webhooks using Webhook APIs + +The REST API framework is intended for automation and integration scenarios, for example, creating webhooks programmatically or delivering Liveboard report attachments to a cloud storage destination. + +The following webhook REST APIs are available for webhook configuration and management: + +* `POST /api/rest/2.0/webhooks/create` + +Allows xref:webhooks-api.adoc#_creating_a_webhook[creating a webhook] for the Liveboard schedule event type, configuring storage destination for webhook delivery. +* `GET /api/rest/2.0/webhooks/storage-config` + +xref:webhooks-api.adoc#_retrieving_storage_information_for_webhook_configuration[Gets storage setup information] for configuring customer-managed storage. +* `POST /api/rest/2.0/webhooks/search` + +xref:webhooks-api.adoc#_getting_a_list_of_webhooks[Gets a list of webhooks] configured in the Org. +* `POST /api/rest/2.0/webhooks/{webhook_identifier}/update` + +Allows xref:webhooks-api.adoc#_updating_a_webhook[updating configuration properties]. +* `POST /api/rest/2.0/webhooks/delete` + +xref:webhooks-api.adoc#_deleting_a_webhook[Deletes one or more webhooks]. + +== Creating a webhook +To create a webhook for the Liveboard schedule event, send a `POST` request to the +`/api/rest/2.0/webhooks/create` API endpoint. ThoughtSpot allows only one webhook per Org. + +[IMPORTANT] +==== +Before creating a webhook, ensure that a xref:webhooks-comm-channel.adoc[webhook communication channel] is configured for your Org or at the instance level on your instance. +==== + +=== Request parameters + +[width="100%" cols="1,6"] +[options='header'] +|===== +|Parameter|Description +| `name` a|__String__. Name of the webhook. +| `description` + +__Optional__ a|__String__. Description text for the webhook. +| `url` a|__String__. The fully qualified URL of the listening endpoint to which you want to +send webhook notifications. +| `url_params` a|A JSON map of key-value pairs to append as query parameters in the webhook URL. +| `events` a|__Array of strings__. List of events to subscribe to. Specify `LIVEBOARD_SCHEDULE`. +| `status` + +__Optional__ a|__String__. Status of the webhook. Specify `ENABLED` to activate the webhook +immediately, or `DISABLED` to create it in a deactivated state. Available from 26.7.0.cl. +| `authentication` a|Defines the authentication method and credentials ThoughtSpot uses when +sending HTTP requests to the webhook endpoint. + +Specify the authentication type: + +* `API_KEY` + +API key to authorize the payload requests. Specify the API key to use in the `X-API-Key` +request header. +* `BASIC_AUTH` + +Authentication with username and password. +* `BEARER_TOKEN` + +Authentication token to authenticate and authorize requests. +* `OAUTH2` + +OAuth credentials to authorize API requests. Specify client ID, client secret key, and +authorization URL. If the registered webhook has OAuth authentication enabled, +`Authorization: Bearer ` is sent in the request header. +| `signature_verification` + +__Optional__ a|Signature verification parameters for the webhook endpoint to verify the +authenticity of incoming requests. ThoughtSpot signs the webhook payload with a secret, and +your webhook endpoint validates the signature using the shared secret. + +If using signature verification, specify the following parameters: + +* `type` + +Signature verification type. The supported type is `HMAC_SHA256`. +* `header` + +HTTP header where the signature is sent. +* `algorithm` + +Hash algorithm used for signature verification. +* `secret` + +Shared secret used for HMAC signature generation. +| `storage_destination` + +__Optional__ a|Configuration parameters for cloud storage destination. ThoughtSpot supports AWS S3 and Google Cloud Storage (GCS) as storage destinations. For more information, see xref:webhooks-s3-storage.adoc[Deliver Liveboard reports to AWS S3 storage] and xref:webhooks-gcs-storage.adoc[Deliver Liveboard reports to GCS storage]. +|`additional_headers` + +__Optional__ a|__Array of key-value pairs__. Custom HTTP headers to include in every outbound. +Webhook request, in addition to authentication headers and standard HTTP headers such as +`Content-Type` and `User-Agent`. + +[source,JSON] +---- +"additional_headers": [ + { + "key":"X-Custom-Header", + "value":"custom_value" + } +] +---- +| `status` + +__Optional__ a|__String__. Status of the webhook. Specify `ENABLED` to activate the webhook immediately after creation, or `DISABLED` to create it in a deactivated state. When omitted, the status is not stored and will be absent from search results. + +|===== + +=== Example request + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/webhooks/create' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "name": "webhook-lb-event", + "url": "https://webhook.site/6643eba5-9d3e-42a1-85e0-bb686ba1524d", + "events": [ + "LIVEBOARD_SCHEDULE" + ], + "authentication": { + "BEARER_TOKEN": "Bearer {AUTH_TOKEN}" + }, + "description": "Liveboard report" +}' +---- + +=== API response + +If webhook creation is successful, the API returns a 204 response code. + +== Retrieving storage information for webhook configuration +To get storage setup information for your ThoughtSpot instance required for configuring a webhook storage destination, use the `GET /api/rest/2.0/webhooks/storage-config` API. + +=== Example request + +[source, cURL] +---- +curl -X GET \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/webhooks/storage-config' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ +---- + +=== API response + +This API endpoint returns data based on whether the ThoughtSpot instance is hosted on AWS or GCP. + +* For AWS hosted S3 storage, the API endpoint returns a JSON array with platform AWS account ID, IAM trust policy template, and storage setup instructions. +* For GCP-hosted S3 storage, the API endpoint returns a JSON array with +* For GCP-hosted GCS storage, the endpoint returns is a JSON array with the platform GCP service account email, the IAM role to grant for service account impersonation, and storage setup instructions. + +==== Top-level fields +The following fields are included in the response, regardless of the storage provider. + +* `storage_type`: The category of storage destination. This field is always `OBJECT_STORAGE` for blob/bucket storage targets, including both AWS S3 and Google Cloud Storage. +* `provider`: Cloud storage service provider. Returns one of the following values: + +** `AWS_S3` for Amazon S3 bucket + +** `GCP_GCS` for Google Cloud Storage bucket + +* `config`: A configuration object that contains the provider-specific setup details for the storage destination. The structure of this object varies based on the `config_type` field within it. The `config_type` can be one of the following values: +** `AWS_TO_S3_STORAGE`: AWS-hosted ThoughtSpot instance writing to an S3 bucket +** `GCP_TO_S3_STORAGE`: GCP-hosted ThoughtSpot instance writing to an S3 bucket +** `GCP_TO_GCS_STORAGE`: GCP-hosted ThoughtSpot instance writing to a GCS bucket + +==== Storage configuration attributes for AWS_TO_S3_STORAGE +The response returned for AWS-hosted ThoughtSpot instances where the customer configures an AWS S3 bucket as the storage destination includes the following information: + +* `aws_account_id`: The AWS account ID of the ThoughtSpot-managed AWS account. You must reference this value in the `Principal` field of the IAM trust policy you create in your AWS account. The policy grants ThoughtSpot's account permission to assume the IAM role that has write access to your S3 bucket. +* `trust_policy_template`: A ready-to-use IAM trust policy JSON object. Attach this policy to the IAM role you create in your AWS account. The policy authorizes ThoughtSpot's AWS account (`aws_account_id`) to call `sts:AssumeRole` and deliver webhook payloads to your S3 bucket. The `sts:ExternalId` condition in the policy prevents unauthorized cross-account access (confused deputy attack). +** `Version`: The IAM policy language version,`2012-10-17`. +** `Statement`: Includes the following information: +** `Effect`: Specifies whether the statement grants or denies access. Always `Allow` in this template. +*** `Principal`: The ARN of the ThoughtSpot AWS account principal that is trusted to assume your IAM role. Constructed as `arn:aws:iam:::root`. +*** `Action`: The AWS STS action being permitted. Always `sts:AssumeRole` for AWS-hosted instances. +*** `Condition`: A unique, ThoughtSpot-generated external ID. Include this value as a condition in your IAM trust policy to prevent unauthorized parties from assuming your role. This value is unique per webhook and must be preserved exactly as returned. For example: ++ +[source,JSON] +---- +"StringEquals": { + "sts:ExternalId": "ts-webhook-a1b2c3d4-7890" +} +---- + +* `setup_instructions`: An ordered list of steps to complete in your AWS account before using this storage destination. Follow these steps to create the IAM role, attach the trust policy, and configure the required S3 permissions (`s3:PutObject`, `s3:PutObjectAcl`). + +===== Example response + +[source,JSON] +---- +[ + { + "storage_type": "OBJECT_STORAGE", + "provider": "AWS_S3", + "config": { + "config_type": "AWS_TO_S3_STORAGE", + "aws_account_id": "123456789012", + "trust_policy_template": { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "AWS": "arn:aws:iam::123456789012:root" + }, + "Action": "sts:AssumeRole", + "Condition": { + "StringEquals": { + "sts:ExternalId": "ts-webhook-a1b2c3d4-7890" + } + } + } + ] + }, + "setup_instructions": [ + "1. Create an IAM role in your AWS account", + "2. Attach the trust policy template to the role", + "3. Attach S3 permissions (s3:PutObject, s3:PutObjectAcl) to the role", + "4. Use the role ARN in your webhook storage configuration" + ] + } + } +] +---- + +==== Storage configuration attributes for GCP_TO_S3_STORAGE +This response returned for GCP-hosted ThoughtSpot instances where the customer configures an AWS S3 bucket as the storage destination includes the following attributes. + +* `gcp_service_account_id`: The unique numeric ID of the ThoughtSpot GCP service account. This ID is used as the OIDC subject (`sub`) in the AWS IAM web identity trust policy condition, scoping the trust to exactly this service account. Use this value when configuring the `accounts.google.com:sub` condition in your IAM role's trust policy. + +* `oidc_provider`: The OIDC identity provider URL that AWS IAM uses to validate the identity token presented by ThoughtSpot's GCP service account. Always `accounts.google.com` for GCP-hosted instances. Register this URL as an Identity Provider in your AWS IAM account before creating the trust policy. + +* `trust_policy_template`: A ready-to-use IAM trust policy JSON object for web identity federation. Attach this policy to the IAM role you create in your AWS account. The policy trusts the GCP-hosted OIDC provider (`accounts.google.com`) and restricts assumption to the specific ThoughtSpot GCP service account identified by `gcp_service_account_id`. Includes the following attributes: + +** `Version`: The IAM policy language version,`2012-10-17`. +** `Statement`: Array of IAM policy statements. Contains one statement that permits the ThoughtSpot GCP service account to assume the IAM role via OIDC federation. +*** `Effect`: Specifies whether the statement grants or denies access. Always `Allow` in this template. +*** `Principal`: The ARN of the OIDC identity provider registered in your AWS IAM account. Replace `YOUR_AWS_ACCOUNT_ID` in the template with your own AWS account ID before applying the policy. +*** `Action`: ThoughtSpot uses AWS STS `AssumeRoleWithWebIdentity` (OIDC federation) to obtain temporary credentials. No long-lived AWS access keys are stored or exchanged. +*** `Condition`: The OIDC subject condition that scopes the trust to the specific ThoughtSpot GCP service account. This value matches `gcp_service_account_id`. Including this condition ensures that only ThoughtSpot's service account, not any other GCP principal, can assume your IAM role. ++ +[source,JSON] +---- +"StringEquals": { + "accounts.google.com:sub": "115663769112811637952" +} +---- + +* `config.setup_instructions`: An ordered list of steps to complete in your AWS account before using this storage destination. Follow these steps to register the OIDC provider, create the IAM role with web identity federation trust, and configure the required S3 permissions (`s3:PutObject`, `s3:PutObjectAcl`). + +===== Example response +[source,JSON] +---- +[ + { + "storage_type": "OBJECT_STORAGE", + "provider": "AWS_S3", + "config": { + "config_type": "GCP_TO_S3_STORAGE", + "gcp_service_account_id": "115663769112811637952", + "oidc_provider": "accounts.google.com", + "trust_policy_template": { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/accounts.google.com" + }, + "Action": "sts:AssumeRoleWithWebIdentity", + "Condition": { + "StringEquals": { + "accounts.google.com:sub": "115663769112811637952" + } + } + } + ] + }, + "setup_instructions": [ + "1. Add accounts.google.com as an Identity Provider in AWS IAM", + "2. Create an IAM role with Web Identity Federation trust", + "3. Configure the trust policy with the GCP service account ID", + "4. Attach S3 permissions (s3:PutObject, s3:PutObjectAcl) to the role", + "5. Use the role ARN in your webhook storage configuration" + ] + } + } +] +---- + +==== Storage configuration attributes for GCP_TO_GCS_STORAGE +The storage information is returned for GCP-hosted ThoughtSpot instances where the customer configures a Google Cloud Storage (GCS) bucket as the storage destination. ThoughtSpot's service account is granted the `roles/iam.serviceAccountTokenCreator` role on the customer's service account, which allows it to generate short-lived tokens and write to the GCS bucket on the customer's behalf. + +* `service_account_email`: The email address of the ThoughtSpot GCP service account that the customer must grant access to. Grant this service account the `roles/iam.serviceAccountTokenCreator` role on the service account that has write access to your GCS bucket. This allows ThoughtSpot to impersonate that service account and deliver webhook payloads to the bucket. +* `required_role`: The GCP IAM role that must be granted to ThoughtSpot's service account (`service_account_email`) on your bucket-owning service account. Always `roles/iam.serviceAccountTokenCreator`. This role allows ThoughtSpot to create short-lived identity tokens for the impersonated service account without requiring the service account key to be shared. +* `setup_instructions`: An ordered list of steps to complete in your GCP project before using this storage destination. Follow these steps to locate your bucket-owning service account, grant the `roles/iam.serviceAccountTokenCreator` role to ThoughtSpot's service account, and configure the GCS bucket in your webhook settings. + + +===== Example response + +[source,json] +---- +[ + { + "storage_type": "OBJECT_STORAGE", + "provider": "GCP_GCS", + "config": { + "config_type": "GCP_TO_GCS_STORAGE", + "service_account_email": "webhook-sa@example-project.iam.gserviceaccount.com", + "required_role": "roles/iam.serviceAccountTokenCreator", + "setup_instructions": [ + "1. In GCP Console, go to IAM & Admin > Service Accounts", + "2. Click on the service account that has write access to your GCS bucket", + "3. Open the 'Principals with access' tab and click 'Grant Access'", + "4. Enter the service account email as the principal", + "5. Assign the roles/iam.serviceAccountTokenCreator role and save", + "6. Use your service account email in the webhook storage configuration" + ] + } + } +] +---- + +== Getting a list of webhooks +To view the properties of a webhook or get a list of webhooks configured on your instance, send a `POST` request to the `/api/rest/2.0/webhooks/search` API endpoint. + +By default, the API fetches a list of all webhooks available on the ThoughtSpot instance. To fetch webhooks created in a specific Org, specify the Org ID. + +To get the details of specific webhook, specify the webhook ID in the API request. + +To filter results by the Webhook status, specify `ENABLED` or `DISABLED` in the `status` parameter as needed. + +=== Example request + +The following example shows the request body to fetch details of an active webhook: + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/webhooks/search' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "org_identifier": "Primary", + "webhook_identifier": "27997a8a-cd33-485d-a039-b40b71d191a8", + "event_type": "LIVEBOARD_SCHEDULE" + "status": "ENABLED" +}' +---- + +=== API response + +If the request is successful, the API returns details of the webhook: + +[source,JSON] +---- +{ + "webhooks":[ + { + "id":"27997a8a-cd33-485d-a039-b40b71d191a8", + "name":"UserA", + "description":null, + "org":{ + "id":"0", + "name":"Primary" + }, + "url":"https://webhook-test-server-263n.onrender.com/", + "url_params":null, + "events":[ + "LIVEBOARD_SCHEDULE" + ], + "authentication":null, + "signature_verification":null, + "additional_headers":null, + "creation_time_in_millis":1773824614455, + "modification_time_in_millis":1781070122709, + "created_by":{ + "id":"4e6e5692-667e-487d-9672-f301ccc2ea77", + "name":"UserA@thoughtspot.com" + }, + "last_modified_by":{ + "id":"826b21a7-8ea2-4af9-b0bd-d1d6b604d07d", + "name":"UserA@thoughtspot.com" + }, + "storage_destination": null, + "status":"ENABLED" + } + ], + "pagination":{ + "record_offset":0, + "record_size":50, + "total_count":1, + "has_more":false + } +} +---- + +== Updating a webhook +To update a webhook, send a `POST` request to the +`/api/rest/2.0/webhooks/{webhook_identifier}/update` API endpoint. In the update request, include the webhook ID as a path parameter and the properties to modify in the request body. + +To update existing configuration, specify the following parameters in the API request as needed: + +* `name`: Name of the webhook. +* `description`: Description text. +* `url`: Webhook endpoint URL. +* `events`: Event type that initiates the webhook delivery. +* `url_params`: Key-value pairs for the URL query parameters. +* `authentication`: Authentication type to use for authorizing webhook requests. +* `signature-verification`: Signature verification type. +* `storage_destination`: Storage configuration parameters for webhook delivery. +* `additional_headers`: Custom headers to include in the request. +* `status`: Activation state of the webhook. Specify `ENABLED` or +`DISABLED`. + +To reset configured values, specify properties to reset in `reset_options`.The `reset_options` attribute removes one or more optional configuration sections from the webhook without replacing the entire configuration. Supported values are: + +* `AUTHENTICATION`: Removes the authentication configuration. +* `SIGNATURE_VERIFICATION`: Removes the signature verification configuration. +* `STORAGE_DESTINATION`: Removes the storage destination configuration. + +=== Example request +The following example shows the request body for updating the name, description text, endpoint URL, and storage properties of a webhook object: + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/webhooks/09e069e2-fc42-4354-9b46-cc96984c4f30/update' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "name": "test-webhook", + "status": "DISABLED", + "reset_options": [ + "AUTHENTICATION" + ] +}' +---- + +=== API response + +If the API request is successful, the API returns a 204 response code indicating a successful operation. + +== Deleting a webhook + +To delete a webhook, send a `POST` request to the `/api/rest/2.0/webhooks/delete` API endpoint with the webhook IDs in the request body. + +=== Example request + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/webhooks/delete' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "webhook_identifiers": [ + "09e069e2-fc42-4354-9b46-cc96984c4f30" + ] +}' +---- + +=== API response + +If the API request is successful, the API returns the 200 response with the details of the deleted webhook. + +== Related resources +* xref:webhooks-comm-channel.adoc[Configure webhook communication channels] +* xref:webhooks-lb-schedule.adoc[Deliver Liveboard reports to an external application] +* xref:webhooks-s3-storage.adoc[AWS S3 storage integration for webhook delivery] +* xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery] +* xref:webhooks-ux.adoc[Webhook configuration and management in the UI] diff --git a/modules/ROOT/pages/webhooks-kpi-alerts.adoc b/modules/ROOT/pages/webhooks-kpi-alerts.adoc index 2df9a283b..2ee5bb568 100644 --- a/modules/ROOT/pages/webhooks-kpi-alerts.adoc +++ b/modules/ROOT/pages/webhooks-kpi-alerts.adoc @@ -27,31 +27,9 @@ The webhooks feature is in Beta and is turned off by default. To enable this fea == Configure webhooks To configure a webhook and send alert data to the destination URL, complete the following steps: -* xref:webhooks.adoc#_register_a_webhook[Register a webhook in ThoughtSpot] +* xref:webhooks-ux.adoc#_creating_a_webhook_for_kpi_alerts[Create a webhook in ThoughtSpot] * xref:webhooks.adoc#_assign_webhook_to_a_kpi_monitor_alert[Assign the registered webhook to KPI Monitor alerts] -=== Register a webhook - -To register a webhook in ThoughtSpot, complete the following steps: - -. Go to **Develop** > **Customizations** > **Webhooks**. -. Click **Create Webhook**. -. In the ** Create Webhook** modal, specify the Webhook name and the URL of the destination application. -+ -For testing purposes, you can use a URL from the link:https://webhook.site/[Webhook site, window=_blank]. -. Specify the authentication type. -* No authentication + -Default authentication option. Not recommended for production environments. - -* API Key + -Allows using an API key to authenticate API requests to the destination URL. Specify the API key to use in the `X-API-Key` request header. - -* OAuthentication 2.0 + -Allows using OAuth credentials to authorize API requests. Specify client ID, client secret key, and authorization URL. -If the registered webhook has Oauth authentication enabled, `Authorization: Bearer ` is sent in the request header. -. If the destination URL requires query parameters to be passed in the request URL, specify the parameters as key-value pairs. -. Click **Save**. - === Assign webhook to a KPI Monitor alert To assign the registered webhook to an alert: diff --git a/modules/ROOT/pages/webhooks-lb-schedule.adoc b/modules/ROOT/pages/webhooks-lb-schedule.adoc index 9f4a1dd44..ecb3c8bd5 100644 --- a/modules/ROOT/pages/webhooks-lb-schedule.adoc +++ b/modules/ROOT/pages/webhooks-lb-schedule.adoc @@ -1,33 +1,13 @@ -= Deliver Liveboard reports to an external application += Delivering reports to external destination via webhooks :toc: true :toclevels: 3 :page-title: Webhooks for Liveboard Scheduled Jobs :page-pageid: webhooks-lb-schedule -:page-description: Configure Webhooks and send alerts to specific communication channels - -[beta betaBackground]^Beta^ - -By configuring a webhook, users can send notifications automatically to a target application whenever a scheduled Liveboard job is triggered in ThoughtSpot. - -[NOTE] -==== -* Webhook support for Liveboard schedule events is available only on ThoughtSpot Cloud instances with 10.14.0.cl or later. The webhook feature is currently in beta and not enabled by default. To enable this feature on your instance, contact ThoughtSpot Support. -* You can configure only one webhook for the Liveboard schedule event per Org. -==== - -== Overview +:page-description: Configure a webhook to deliver scheduled Liveboard reports to an external application or cloud storage destination If you have scheduled a Liveboard job to receive a daily report via email, you can configure ThoughtSpot to send the report directly to a webhook endpoint and create your own custom emails or workflows. -* Configure a webhook for the Liveboard schedule event to enable programmatic communication between the target application and ThoughtSpot. + -To create and manage webhook APIs, use the following APIs: -** `POST /api/rest/2.0/webhooks/create` -** `POST /api/rest/2.0/webhooks/delete` -** `POST /api/rest/2.0/webhooks/search` -** `POST /api/rest/2.0/webhooks/{webhook_identifier}/update` - - == Before you begin Check your application environment for the following prerequisites: @@ -37,25 +17,24 @@ If your instance has Role-based Access Control (RBAC) enabled, you need the foll ** `APPLICATION_ADMINISTRATION` (*Can Manage Application settings*) to create and view communication channels. ** `CAN_MANAGE_WEBHOOKS` (*Can manage webhooks*) to create and manage webhooks. * Ensure that a xref:webhooks-comm-channel.adoc[webhook communication channel] is configured for your Org or at the cluster level on your instance. -//* To allow outbound traffic from ThoughtSpot to the webhook endpoint, add the webhook destination URL to the xref:security-settings.adoc#csp-connect-src[CSP connect-src] allowlist in ThoughtSpot. * Ensure that your destination application has a callback URL to accept HTTP POST requests from ThoughtSpot. * If you plan to use OAuth authentication, make sure you have the OAuth credentials and authorization URL of your application. * If you plan to use an API key for authentication, ensure that you have a valid API key. == Configuration steps - The webhook setup for Liveboard schedule events includes the following steps: -* xref:webhooks-lb-schedule.adoc#_configure_a_webhook[Creating a webhook to listen to Liveboard schedule events]. -* xref:webhooks-lb-schedule.adoc#_verify_the_integration[Verifying the integration and webhook payload]. - -== Configure a webhook - -To configure webhooks for the Liveboard schedule event, use the webhook REST API. +. xref:webhooks-lb-schedule.adoc#configure-webhook[Configure a webhook] to listen to Liveboard +schedule events. +. xref:webhooks-lb-schedule.adoc#verify-integration[Verify the integration] and webhook payload. -=== Create a webhook +[#configure-webhook] +== Configuring a webhook +You can create and manage webhooks using the new Webhooks page in the UI or via Webhook REST APIs. -To create a webhook for the Liveboard schedule event, send a `POST` request to the `/api/rest/2.0/webhooks/create` API endpoint. ThoughtSpot allows only one webhook per Org. +=== Through REST API +To create a webhook for the Liveboard schedule event, send a `POST` request to the +`/api/rest/2.0/webhooks/create` API endpoint. ThoughtSpot allows only one webhook per Org. ==== Request parameters @@ -66,33 +45,35 @@ To create a webhook for the Liveboard schedule event, send a `POST` request to t | `name` a|__String__. Name of the webhook. | `description` + __Optional__ a|__String__. Description text for the webhook. -| `url` a|__String__. The fully qualified URL of the listening endpoint to which you want to send webhook notifications. -| `url_params` a| A JSON map of key-value pairs to append as query parameters in the webhook URL. -| `events` a|__Array of strings__. List of events to subscribe to. Specify the event as `LIVEBOARD_SCHEDULE`. -| `authentication` a| +| `url` a|__String__. The fully qualified URL of the listening endpoint to which you want to +send webhook notifications. +| `url_params` a|A JSON map of key-value pairs to append as query parameters in the webhook URL. +| `events` a|__Array of strings__. List of events to subscribe to. Specify `LIVEBOARD_SCHEDULE`. +| `authentication` a|Defines the authentication method and credentials ThoughtSpot uses when +sending HTTP requests to the webhook endpoint. -Defines authentication method and credentials that ThoughtSpot will use when sending HTTP requests to the webhook endpoint. - -Specify the authentication type. +Specify the authentication type: * `API_KEY` + -API key to authorize the payload requests. Specify the API key to use in the `X-API-Key` request header. +API key to authorize the payload requests. Specify the API key to use in the `X-API-Key` +request header. * `BASIC_AUTH` + -Authentication methods with username and password. +Authentication with username and password. * `BEARER_TOKEN` + Authentication token to authenticate and authorize requests. * `OAUTH2` + -OAuth credentials to authorize API requests. Specify client ID, client secret key, and authorization URL. -If the registered webhook has OAuth authentication enabled, `Authorization: Bearer ` is sent in the request header. +OAuth credentials to authorize API requests. Specify client ID, client secret key, and +authorization URL. If the registered webhook has OAuth authentication enabled, +`Authorization: Bearer ` is sent in the request header. | `signature_verification` + -__Optional__ a| Signature verification parameters for the webhook endpoint to verify the authenticity of incoming requests. This typically involves ThoughtSpot signing the webhook payload with a secret, and your webhook endpoint validating this signature using the shared secret. - +__Optional__ a|Signature verification parameters for the webhook endpoint to verify the +authenticity of incoming requests. ThoughtSpot signs the webhook payload with a secret, and +your webhook endpoint validates the signature using the shared secret. -If using signature verification, specify the following parameters. +If using signature verification, specify the following parameters: * `type` + -Signature verification type. Supported type is `HMAC_SHA256`, which uses Hash-based Message Authentication Code (HMAC) algorithm with the SHA-256 hash function to generate a cryptographic signature for webhook payloads. When configured, ThoughtSpot will sign the webhook payload using a shared secret and the HMAC_SHA256 algorithm. Your receiving endpoint should use the same secret and algorithm to compute the HMAC of the received payload and compare it to the signature sent by ThoughtSpot. - +Signature verification type. The supported type is `HMAC_SHA256`. * `header` + HTTP header where the signature is sent. * `algorithm` + @@ -100,11 +81,17 @@ Hash algorithm used for signature verification. * `secret` + Shared secret used for HMAC signature generation. | `storage_destination` + -__Optional__ | Configuration parameters for the S3 storage destination. For more information, see xref:webhooks-s3-storage.adoc[Deliver content to AWS S3 storage using webhooks]. +__Optional__ a|Configuration parameters for the cloud storage destination. ThoughtSpot supports +AWS S3 and GCP GCS as storage destinations. For more information, see +xref:webhooks-s3-storage.adoc[Deliver Liveboard reports to AWS S3 storage] and +xref:webhooks-gcs-storage.adoc[Deliver Liveboard reports to GCS storage]. +| `status` + +__Optional__ a|__String__. Status of the webhook. Specify `ENABLED` to activate the webhook +immediately, or `DISABLED` to create it in a deactivated state. Available from 26.7.0.cl. |`additional_headers` + -__Optional__ a|__Array of key-value pairs__. Allows including custom HTTP headers in every outbound webhook HTTP request that ThoughtSpot sends to the configured destination URL. When configured, ThoughtSpot sends these headers in addition to the authentication headers and standard HTTP headers such as `Content-Type`, `User-Agent`. - -You can use this parameter to pass arbitrary headers with custom metadata in key-value pairs, as required by the webhook receiver endpoint: +__Optional__ a|__Array of key-value pairs__. Custom HTTP headers to include in every outbound +webhook request, in addition to authentication headers and standard HTTP headers such as +`Content-Type` and `User-Agent`. [source,JSON] ---- @@ -118,7 +105,6 @@ You can use this parameter to pass arbitrary headers with custom metadata in key |===== ==== Example request -The following example shows the request body for creating a webhook: [source,cURL] ---- @@ -141,243 +127,87 @@ curl -X POST \ ---- ==== Example response - If webhook creation is successful, the API returns a 204 response code. -=== View webhook properties - -To view the properties of a webhook or get a list of webhooks configured on your ThoughtSpot instance, send a `POST` request to the `/api/rest/2.0/webhooks/search` API endpoint. - -To get specific information, define the following parameters. If the API request is sent without parameters in the request body, ThoughtSpot returns the webhooks configured for the Org context in ThoughtSpot. - -==== Request parameters - -[width="100%" cols="2,4"] +=== Through the Webhooks page in UI +If the new Webhooks page is enabled on your instance, you can create a webhook via UI. + +==== Creating a webhook +To add a webhook for the Liveboard schedule events: + +. Go to **Develop** > **Customizations** and click **Webhooks**. +. In the *Webhooks* page, click *Create webhook*. +. In the *Create webhook* modal, configure the following: +* *Name*: A display name for the webhook. +* *URL*: The fully qualified HTTPS URL of the endpoint that will receive webhook payloads. +* *Description*: (optional) A short description of the webhook's purpose. +* *Event type*: Specify the ThoughtSpot event types to subscribe to. Ensure that *Liveboard schedule* is set as the event type. +. Configure the authentication method your destination endpoint requires. + +ThoughtSpot sends the configured credentials in every outbound request. The following options are available: +* *No Authentication*: No authentication headers are added to the request. Not recommended for production use. +* *OAuth 2.0*: ThoughtSpot obtains an access token using your OAuth client ID, client secret, and authorization URL, then sends `Authorization: Bearer ` in the request header. The token is refreshed automatically before expiry. +* *API Key*: ThoughtSpot sends the API key in the `X-API-Key` request header. +* *Bearer Token*: ThoughtSpot sends a static bearer token in the `Authorization: Bearer` header. +* *Basic authentication*: ThoughtSpot sends a Base64-encoded username and password in the `Authorization` header. +. Configure the file storage options. For more information, see xref:webhooks-s3-storage.adoc[AWS S3 storage integration for webhook delivery] and xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery]. +. Configure the advanced settings if required: +* *Signature verification* + +Specify the signature to send in the header for your endpoint to verify each request. Configure HMAC-SHA256 payload signing. ThoughtSpot signs each outbound +payload with a shared secret. Your endpoint can use the same secret and algorithm to verify the signature in the incoming request header. +* *Custom headers* + +Use this feature to pass arbitrary metadata required by your endpoint in addition to standard and authentication headers. Define key-value pairs of custom headers to add to every outbound HTTP request. +* *URL parameters*: +Specify the query parameters to append to the webhook URL on every request. +. Click *Save*. + +If the webhook creation is successful, it will be added to table list in the Webhooks page. + +==== Activating a webhook +To activate the webhook, use one of the following options: +* Select the webhook and click *Enable*. +* In the webhook row, from the More options menu (`...`), click **Enable*. + +[#test-webhook] +== Test a webhook + +Testing a webhook sends a synthetic payload to the configured endpoint to verify connectivity and +authentication. + +. Hover over the webhook row and click the actions menu (*...*). +. Select *Test*. +. Review the result in the *Test Event* modal. + +The modal displays one of the following outcomes: + +[width="100%" cols="1,4"] [options='header'] |===== -|Parameter|Description -| `org_identifier` + -__Optional__ |__String__. ID or name of the Org. -| `webhook_identifier` + -__Optional__ | __String__. ID or name of the webhook. -| `event_type` + -__Optional__| __String__. Type of webhook event to filter by. For Liveboard schedule events, specify `LIVEBOARD_SCHEDULE`. -|Pagination settings a| If fetching multiple records, specify the following parameters to paginate the API response: + - -* `record_offset` + -__Integer__. Specifies the starting point (index) from which records should be returned. Default is 0. -* `record_size` + -__Integer__. Specifies the number of records to return in the response. Default is 50. -| `sort_options` + -__Optional__ a| Enables sorting of the API response by a specific field in ascending or descending order. - -To define a sorting criteria for the webhook records in API response, set the `field_name` to one of the following options: - -* `CREATED` + -Sorts the records by the webhook creation timestamp. -* `MODIFIED` + -Sorts the webhook object by the last modified timestamp. -* `NAME` + -Sorts the records alphabetically. - -To specify the sort order, set `order` to `ASC` for ascending order, or `DESC` for descending order. - -For example: - -[source,JSON] ----- -"sort_options": { - "field_name":"CREATED", - "order":"ASC" -} ----- +|Outcome|Description +|*Success*|The endpoint returned an HTTP 2xx response within the timeout window. +|*Authentication error*|The endpoint rejected the request due to invalid or missing credentials. +|*Timeout*|The endpoint did not respond within the allowed time window. +|*4xx error*|The endpoint returned a client error (for example, 400 Bad Request or 404 Not Found). +|*5xx error*|The endpoint returned a server error. |===== -==== Example request - -The following example shows the request body to fetch webhook properties: - -[source,cURL] ----- -curl -X POST \ - --url 'https://{ThoughtSpot-Host}/api/rest/2.0/webhooks/search' \ - -H 'Accept: application/json' \ - -H 'Content-Type: application/json' \ - -H 'Authorization: Bearer {AUTH_TOKEN}' \ - --data-raw '{ - "org_identifier": "testOrg1", - "event_type": "LIVEBOARD_SCHEDULE" -}' ----- - -==== Example response - -If the API request is successful, ThoughtSpot returns the webhook configuration details: - -[source,JSON] ----- -{ - "webhooks":[ - { - "id":"27997a8a-cd33-485d-a039-b40b71d191a8", - "name":"webhook-lb-event", - "description": "Webhook for Liveboard schedule", - "org":{ - "id":"2100019165", - "name":"testOrg1" - }, - "url":"https://webhook-test-server-263n.onrender.com/", - "url_params":null, - "events":[ - "LIVEBOARD_SCHEDULE" - ], - "authentication":null, - "signature_verification":null, - "additional_headers":null, - "creation_time_in_millis":1773824614455, - "modification_time_in_millis":1773824614455, - "created_by":{ - "id":"4e6e5692-667e-487d-9672-f301ccc2ea77", - "name":"UserA@example.com" - }, - "last_modified_by":null, - "storage_destination":null - } - ], - "pagination":{ - "record_offset":0, - "record_size":50, - "total_count":1, - "has_more":false - } -} ----- - -=== Update the properties of a webhook - -To update the name, description text, endpoint URL, or the authentication settings of a webhook object, send a `POST` request to the `/api/rest/2.0/webhooks/{webhook_identifier}/update` API endpoint. - -==== Request parameters - -Specify the `webhook_identifier` and pass it as a path parameter in the request URL. - -The API operation allows you to update the following webhook properties: - -* `name` + -Name of the webhook. -* `description` + -Description text of the webhook. -* `url` + -The URL of the webhook endpoint. -* `url_params` + -Query parameters to append to the endpoint URL. -* `events` + -Events subscribed to the webhook. In the current release, ThoughtSpot supports only the `LIVEBOARD_SCHEDULE` event. -* `authentication` + -Authentication method and credentials that ThoughtSpot will use when sending HTTP requests to the webhook endpoint. -* `signature_verification` + -Signature verification parameters for the webhook endpoint to verify the authenticity of incoming requests. -* `additional_headers` + -Optional and custom HTTP headers in the webhook request triggered by ThoughtSpot. - -==== Example request - -The following example shows the request body for updating the name, description text, and endpoint URL of a webhook object: - -[source,cURL] ----- -curl -X POST \ - --url 'https://{ThoughtSpot-Host}/api/rest/2.0/webhooks/webhook-lb-test/update' \ - -H 'Content-Type: application/json' \ - -H 'Authorization: Bearer {AUTH_TOKEN}' \ - --data-raw '{ - "name": "webhook-lb-event", - "description": "Webhook for Liveboard schedule event", - "url": "https://webhook.site/6643eba5-9d3e-42a1-85e0-bb686ba1524d/2e5251b2-8274-41f6-80a0-1b82854df31f", - "events": [ - "LIVEBOARD_SCHEDULE" - ] -}' ----- - -==== Example response - -If the API request is successful, the API returns a 204 response code indicating a successful operation. - +[#verify-integration] == Verify the integration -To verify the webhook configuration, send an API request to the `/api/rest/2.0/system/communication-channels/validate` API endpoint and check the connection status. - -If the validation returns errors, verify the configuration and xref:webhooks-lb-schedule.adoc#_update_the_properties_of_a_webhook[update the webhook properties]. +After creating a webhook, verify the configuration using one of the following methods: -If the connection status is successful, trigger a webhook delivery to the configured destination and xref:webhooks-payload.adoc[verify the payload]. +=== Use the test event feature +On the *Webhooks* page in the *Develop* tab, hover over the webhook row, click the actions +menu (*...*), and select *Test*. ThoughtSpot sends a synthetic payload to the configured +endpoint. For more information, see xref:webhooks-manage.adoc#test-webhook[Test a webhook]. -//For testing purposes, you can use a URL from link:https://webhook.site/[Webhook.site^] as a webhook endpoint and check the payload when the Liveboard schedule event is triggered. +=== Trigger a Liveboard schedule -== Monitor webhook delivery status -To monitor the webhook delivery and job status, use the `/api/rest/2.0/jobs/history/communication-channels/search` API endpoint. For more information, see xref:webhooks-comm-channel.adoc#_monitor_webhook_delivery_and_job_status[Monitor webhook delivery and job status]. +After the webhook is configured, ThoughtSpot delivers a payload to the webhook endpoint +whenever a Liveboard schedule job runs. You can verify delivery in the *Logs* tab on the +*Webhooks* page, or by checking your receiving endpoint directly. -== Delete a webhook -To delete a webhook, send a `POST` request with the webhook ID to the `/api/rest/2.0/webhooks/delete` API endpoint. - -=== Example request - -[source,cURL] ----- -curl -X POST \ - --url 'https://{ThoughtSpot-Host}/api/rest/2.0/webhooks/delete' \ - -H 'Accept: application/json' \ - -H 'Content-Type: application/json' \ - -H 'Authorization: Bearer {AUTH_TOKEN}' \ - --data-raw '{ - "webhook_identifiers": [ - "webhook-lb-test" - ] -}' ----- - -=== Example response - -If the API request is successful, the webhook is deleted, and the API returns the details of the deleted webhook in the response body. - -[source,JSON] ----- -{ - "deleted_count": 1, - "failed_count": 0, - "deleted_webhooks": [ - { - "id": "45fe7810-3239-4761-94fd-04c017df29c4", - "name": "webhook-test", - "description": "Webhook for testing purposes", - "org": { - "id": "1574427524", - "name": "testOrg2025" - }, - "url": "https://webhook.site/6643eba5-9d3e-42a1-85e0-bb686ba1524d/2e5251b2-8274-41f6-80a0-1b82854df31f", - "url_params": null, - "events": [ - "LIVEBOARD_SCHEDULE" - ], - "authentication": null, - "signature_verification": null, - "additional_headers":null, - "creation_time_in_millis": 1761184185887, - "modification_time_in_millis": 1761184185887, - "created_by": { - "id": "08c6b203-ff6e-4ed8-b923-35ebbbfef27b", - "name": "UserA@example.com" - }, - "last_modified_by": null, - "storage_destination":null - } - ], - "failed_webhooks": [] -} ----- +For information about scheduling a Liveboard, see +xref:schedule-liveboard.adoc[Schedule a Liveboard job]. -== Additional resources -* xref:webhooks-comm-channel.adoc[Configure webhook communication channel] -* link:https://docs.thoughtspot.com/cloud/latest/liveboard-schedule[Scheduling Liveboard jobs^] -* +++Liveboard schedule REST APIs+++ +For information about the webhook payload structure, see +xref:webhooks-payload.adoc[Webhook payload for Liveboard events]. \ No newline at end of file diff --git a/modules/ROOT/pages/webhooks-s3-storage.adoc b/modules/ROOT/pages/webhooks-s3-storage.adoc index bc581e52e..34080e241 100644 --- a/modules/ROOT/pages/webhooks-s3-storage.adoc +++ b/modules/ROOT/pages/webhooks-s3-storage.adoc @@ -1,4 +1,4 @@ -= Deliver Liveboard reports to AWS S3 Storage += AWS S3 storage integration for webhook delivery :toc: true :toclevels: 3 @@ -171,7 +171,6 @@ In the permissions policy, specify the role ARN and S3 bucket name. Optionally, ---- |==== - == Provide the storage configuration details to ThoughtSpot Provide the following information to your ThoughtSpot administrator: @@ -184,9 +183,9 @@ Provide the following information to your ThoughtSpot administrator: == Configure a webhook for the S3 storage destination in ThoughtSpot To create a webhook in ThoughtSpot, the webhook feature must be enabled on your instance. Only ThoughtSpot users with administration privileges or the *Can Manage Webhooks* privilege are allowed to create or manage a webhook. -Currently, ThoughtSpot supports webhook creation with AWS S3 storage via REST APIs only. +You can create a webhook with a cloud storage destination using the **Webhooks** page in the UI or through the create webhook REST API. -=== Create a webhook +=== Using REST API To configure the S3 storage properties in ThoughtSpot, the IAM role, external ID, S3 bucket name, and S3 region configured in your AWS account are required. To create a webhook, send a `POST` request to the `/api/rest/2.0/webhooks/create` API endpoint. @@ -317,6 +316,43 @@ If the API request is successful, ThoughtSpot returns the webhook configuration } ---- +=== Through the Webhooks page in UI +If the new Webhooks page is enabled on your instance, you can create a webhook via UI. + +==== Creating a webhook +To create a webhook with an AWS S3 storage as the target destination for payload delivery: + +. Go to **Develop** > **Customizations** and click **Webhooks**. +. In the *Webhooks* page, click *Create webhook*. +. In the *Create webhook* modal, configure the following: +* *Name*: A display name for the webhook. +* *URL*: The fully qualified HTTPS URL of the endpoint that will receive webhook payloads. +* *Description*: (optional) A short description of the webhook's purpose. +* *Event type*: Specify the ThoughtSpot event types to subscribe to. Ensure that *Liveboard schedule* is set as the event type. +. Configure the authentication method your destination endpoint requires. + +ThoughtSpot sends the configured credentials in every outbound request. The following options are available: +* *No Authentication*: No authentication headers are added to the request. Not recommended for production use. +* *OAuth 2.0*: ThoughtSpot obtains an access token using your OAuth client ID, client secret, and authorization URL, then sends `Authorization: Bearer ` in the request header. The token is refreshed automatically before expiry. +* *API Key*: ThoughtSpot sends the API key in the `X-API-Key` request header. +* *Bearer Token*: ThoughtSpot sends a static bearer token in the `Authorization: Bearer` header. +* *Basic authentication*: ThoughtSpot sends a Base64-encoded username and password in the `Authorization` header. +. Configure the file storage options. For more information, see xref:webhooks-s3-storage.adoc[AWS S3 storage integration for webhook delivery] and xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery]. +. Configure the advanced settings if required: +* *Signature verification* + +Specify the signature to send in the header for your endpoint to verify each request. Configure HMAC-SHA256 payload signing. ThoughtSpot signs each outbound +payload with a shared secret. Your endpoint can use the same secret and algorithm to verify the signature in the incoming request header. +* *Custom headers* + +Use this feature to pass arbitrary metadata required by your endpoint in addition to standard and authentication headers. Define key-value pairs of custom headers to add to every outbound HTTP request. +* *URL parameters*: +Specify the query parameters to append to the webhook URL on every request. +. Click *Save*. + +If the webhook creation is successful, it will be added to table list in the Webhooks page. + +==== Activating a webhook +To activate the webhook, use one of the following options: +* Select the webhook and click *Enable*. +* In the webhook row, from the More options menu (`...`), click **Enable*. + === View webhook configuration details To view the webhook configuration details, send a `POST` request to the `/api/rest/2.0/webhooks/search` API endpoint. @@ -368,11 +404,11 @@ If the webhook ID is valid, the API returns the following response: "modification_time_in_millis":1772127859128, "created_by":{ "id":"08c6b203-ff6e-4ed8-b923-35ebbbfef27b", - "name":"shashikala.subramanya@thoughtspot.com" + "name":"userA@thoughtspot.com" }, "last_modified_by":{ "id":"08c6b203-ff6e-4ed8-b923-35ebbbfef27b", - "name":"shashikala.subramanya@thoughtspot.com" + "name":"userA@thoughtspot.com" }, "storage_destination":{ "storage_type":"AWS_S3", diff --git a/modules/ROOT/pages/webhooks-ux.adoc b/modules/ROOT/pages/webhooks-ux.adoc new file mode 100644 index 000000000..a739084fc --- /dev/null +++ b/modules/ROOT/pages/webhooks-ux.adoc @@ -0,0 +1,161 @@ += Webhook configuration and management through the UI +:toc: true +:toclevels: 3 + +:page-title: Manage webhooks +:page-pageid: webhooks-manage +:page-description: Create and manage webhooks from the UI + +The **Develop** page in ThoughtSpot UI provides the option to configure and manage webhooks. + +== Webhook configuration and management (New experience) + +The **Webhooks** option in the **Develop** page allows you to access the new **Webhooks** page. This page provides a centralized interface for creating, managing, and monitoring all webhooks in your ThoughtSpot Org. + +[IMPORTANT] +==== +* The new Webhooks UI experience is an Early Access feature and is disabled by default. To enable this feature, contact ThoughtSpot Support. +* The new Webhooks UI experience is available on only ThoughtSpot Cloud instances running 26.7.0.cl and later. +* In the current version, the new experience allows creating and managing created webhooks for Liveboard Schedule events only. +==== + +=== Creating a webhook +You can create a webhook for the Liveboard schedule event type a lightweight JSON payload and also send these as reports to a Cloud Storage destination in the file format supported by the Liveboard scheduled jobs. + +To create a webhook: + +. Go to **Develop** > **Customizations** and click **Webhooks**. +. In the *Webhooks* page, click *Create webhook*. +. In the *Create webhook* modal, configure name, webhook endpoint, event type, authentication options and other parameters as needed. For more information about the configuration parameters, see the following pages: + +* xref:webhooks-lb-schedule.adoc[Webhooks for Liveboard Scheduled Jobs]. +* xref:webhooks-s3-storage.adoc[AWS S3 storage integration for webhook delivery] +* xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery] +. Click **Save**. + +=== Activating a webhook +To activate the webhook, use one of the following options: +* Select the webhook and click *Enable*. +* In the webhook row, from the More options menu (`...`), click **Enable*. + +=== Editing a webhook +To edit webhook properties: + +. Use one of the following options to open the edit panel: +* Select the webhook and click *Edit*. +* In the webhook row, from the More options menu (`...`), click **Edit*. +. Update the fields as required. +. Click **Save**. + +[NOTE] +==== +To clear an authentication, signature verification, or storage destination configuration entirely without replacing it, you can use the `reset_options` parameter in the xref:webhooks-lb-schedule.adoc[update webhook REST API]. +==== + +=== Deleting a webhook + +. Hover over the webhook row and click the actions menu (*...*). +. Select *Delete*. +. Confirm the deletion in the prompt that appears. + +Deleting a webhook is permanent. Delivery logs associated with the webhook are removed when they reach the 3-day retention limit. + +=== Managing and monitoring Webhooks (New experience) +The new **Webhooks** page displays the following options: + +Webhooks list:: +Displays a list of webhooks configured in the Org. Note that ThoughtSpot allows only one webhook for Liveboard Schedule event per Org. The list includes the following columns: + +* *Name*: Display name of the webhook. +* *Events*: ThoughtSpot event types the webhook is subscribed to, such as `LIVEBOARD_SCHEDULE`. +* *Delivery status*: Summary of recent delivery outcomes for the webhook. +* *Status*: Current activation state of the webhook: *Enabled* or *Disabled*. Use the toggle to change the state without editing the webhook. +* *Creator*: ThoughtSpot user who created the webhook. +*Last modified*: Date and time the webhook configuration was last updated. + +For each item in the webhooks list, the following actions are available: + +* *Edit*: Opens the webhook edit panel +* *Enable*: Enables selected webhooks. +* *Disable*: Disables selected webhooks. +* *Send test event*: Sends a test payload to all selected webhook endpoints. +* *Delete*: Deletes the selected webhooks. + +Webhook configuration options:: +The **Create webhook** option to create a webhook for the Liveboard schedule event type. Only one webhook can be created per Org. To configure and manage webhooks, the *Can manage webhooks* (`CAN_MANAGE_WEBHOOKS`) privilege is required. + +The webhook creation workflow allows configuring webhook properties, including authentication parameters, storage destination, signature verification, custom headers, and URL parameters. + +To enable, disable, edit, or delete the webhook configuration, select the webhook in the list, and use the options available for in the More options (`...`) menu. + +Webhook details:: +Provides a dashboard view with the following cards. The cards are refreshed every 60 seconds. + +* *Delivery rate*: Percentage of webhook delivery attempts that succeeded. +* *Failed*: Total count of delivery attempts that failed or resulted in an error. +* *In Retry Queue*: Count of delivery attempts currently queued for retry. +* *Pending*: Count of delivery attempts awaiting dispatch. + +Actions for the webhook list items:: +The following actions are available for the list items in the Webhooks page: + +* *Sort*: Click any column header to sort the webhook list by that column. +* *Filter controls*: Use the column filter controls to narrow the list by name, state, creator, or other attributes. +* *Bulk selection*: Select multiple webhooks using the checkboxes to perform bulk actions. +* *Row-level actions*: Hover over a webhook row and click the actions menu (*...*) to edit, +delete, test, enable, or disable that webhook. + +UI Options in the webhook page:: +Clicking a webhook in the list opens a page that displays the options to filter webhook deliveries by their delivery status. To view the logs, click **View details**. + +== Webhook configuration and management (Legacy experience) +The **Legacy Webhooks** page allows you to create, view, and edit webhooks created for KPI alerts. These webhooks are managed through the UI and can be selected as custom channels when configuring KPI alert notifications in the UI. For more information, see xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. + +[NOTE] +==== +The webhook configuration and management options in the Legacy Webhooks page will be integrated with the new Webhooks page experience in a future release. +==== + +=== Creating a webhook for KPI alerts +To register a webhook in ThoughtSpot, complete the following steps: + +. Go to **Develop** > **Customizations** > **Legacy Webhooks**. +. Click **Create Webhook**. +. In the ** Create Webhook** modal, specify the Webhook name and the URL of the destination application. ++ +For testing purposes, you can use a URL from the link:https://webhook.site/[Webhook site, window=_blank]. +. Specify the authentication type. +* No authentication + +Default authentication option. Not recommended for production environments. + +* API Key + +Allows using an API key to authenticate API requests to the destination URL. Specify the API key to use in the `X-API-Key` request header. + +* OAuthentication 2.0 + +Allows using OAuth credentials to authorize API requests. Specify client ID, client secret key, and authorization URL. +If the registered webhook has Oauth authentication enabled, `Authorization: Bearer ` is sent in the request header. +. If the destination URL requires query parameters to be passed in the request URL, specify the parameters as key-value pairs. +. Click **Save**. +. xref:webhooks-kpi-alerts.adoc#_assign_webhook_to_a_kpi_monitor_alert[Assign webhook to a KPI Monitor alert]. + +=== Editing a webhook (Legacy experience) +To edit webhook properties: + +. In the **Legacy Webhooks** page, select the webhook to edit. +. In the webhook row, click More options menu (`...`) > **Edit*. +. Update the fields as required. +. Click **Save**. + +=== Deleting a webhook (Legacy experience) +To delete a webhook: + +. Hover over the webhook row and click the actions menu (*...*). +. Select *Delete*. +. Confirm the deletion in the prompt that appears. + +== Related resources + +* xref:webhooks-lb-schedule.adoc[Deliver Liveboard reports to an external application] +* xref:webhooks-s3-storage.adoc[Deliver content to cloud storage using webhooks] +* xref:webhooks-comm-channel.adoc[Configure webhook communication channels] +* xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts] \ No newline at end of file diff --git a/modules/ROOT/pages/webhooks.adoc b/modules/ROOT/pages/webhooks.adoc index d8af984a2..38b834f81 100644 --- a/modules/ROOT/pages/webhooks.adoc +++ b/modules/ROOT/pages/webhooks.adoc @@ -1,48 +1,83 @@ = Webhooks :toc: true +:toclevels: 3 :page-title: Webhooks :page-pageid: webhooks -:page-description: Register a webhook to send KPI monitor and Liveboard schedule alerts to an external application +:page-description: Use webhooks to send real-time event notifications from ThoughtSpot to external applications, communication channels, and cloud storage destinations -Webhooks in ThoughtSpot provide a way to automate workflows and integrate with external systems by sending real-time notifications when specific events occur. In ThoughtSpot, webhooks can be used for two alerting use cases: +A webhook is ThoughtSpot provides a way to deliver data and reports to a target application, URL endpoint, or storage destination and is triggered by events such as scheduled Liveboard jobs. -* Liveboard schedule alerts [beta betaBackground]^Beta^ + -ThoughtSpot supports using a xref:webhooks-lb-schedule.adoc[webhook for delivering scheduled Liveboard notifications] to external applications and communication channels. +== Overview -* KPI alerts + -For KPI charts in a Liveboard or Answer, ThoughtSpot allows creating and scheduling alerts. KPI Monitor alerts notify users when a KPI metric meets a threshold condition or periodically as per the schedule configured by the user. You can send these alerts using a webhook and notify external applications when a KPI meets a defined threshold or changes value. For more information, see xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. +ThoughtSpot allows using webhooks for the following purposes: +Liveboard schedule notifications [beta betaBackground]^Beta^:: +ThoughtSpot supports using webhooks to deliver scheduled Liveboard notifications to external applications and communication channels. For more information, see +xref:webhooks-lb-schedule.adoc[Deliver Liveboard reports to an external application]. -== Webhook configuration +KPI monitor alerts:: -ThoughtSpot users with developer or administrator privileges can create webhooks via REST APIs or from the *Develop* page in the UI. +You can use a webhook to trigger KPI monitor alerts to an external application when a KPI metric meets a threshold condition or changes value. For more information, see xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. -Webhooks configured via the REST API:: -The REST API framework webhook configuration is intended for automation and integration scenarios; for example, delivering attachments to an external application or storage destinations such as the Amazon Web Services (AWS) S3 bucket. Currently, the Webhook REST APIs support creating and managing webhooks for Liveboard schedule events only. +Webhook delivery to Cloud Storage destinations:: +ThoughtSpot supports delivering webhook payloads to the following cloud storage destinations: ++ +* *Amazon S3*: Available on AWS-hosted and GCP-hosted ThoughtSpot Cloud instances. For configuration steps, see +xref:webhooks-s3-storage.adoc[Deliver content to cloud storage using webhooks]. +* *Google Cloud Storage (GCS)*: Available on GCP-hosted ThoughtSpot Cloud instances. For more information, see xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery]. -Webhooks created from the Develop > Webhook page:: -Webhooks created from the Develop page in the UI are typically used for integrating with KPI alerts. These webhooks are managed through the UI and can be selected as custom channels when configuring KPI alert notifications in the UI. +== Webhook configuration and management +ThoughtSpot supports creating and managing webhooks through the UI or REST APIs. [NOTE] ==== -* Webhooks created from the **Develop** page are different from the webhooks configured via REST APIs and follow a separate flow. Use REST APIs to create webhooks for custom notification channels or external storage destinations. * To set up a webhook for Liveboard schedule notifications, you must first configure the xref:webhooks-comm-channel.adoc[webhook communication channel using the communication-channel preferences API]. +* Only one webhook configuration is allowed per Org. ==== -== Integration with Amazon S3 bucket [beta betaBackground]^Beta^ +=== Webhooks UI +For managing webhooks via UI, use the following options in the **Develop** page of the ThoughtSpot UI: -Starting with the ThoughtSpot 26.3.0.cl release, ThoughtSpot supports configuring an Amazon S3 bucket as the storage destination for delivering webhook attachments via REST APIs. +* **Webhooks** [earlyAccess earlyAccessBackground]^Early Access^: + +The new *Webhooks* option in the *Develop* page provides centralized view of webhooks configured in ThoughtSpot, including the options to create, monitor, and manage webhooks, and view stats and delivery logs in your ThoughtSpot Org. -For more information, see xref:webhooks-s3-storage.adoc[S3 storage integration for Webhook delivery]. ++ +[IMPORTANT] +==== +* The new Webhooks UI experience is an Early Access feature and is disabled by default. To enable this feature, contact ThoughtSpot Support. +* The new Webhooks UI experience is available on only ThoughtSpot Cloud instances running 26.7.0.cl and later. +* In the current version, the new experience allows creating and managing created webhooks for Liveboard Schedule events only. +==== + ++ +For more information, see xref:webhooks-ux.adoc[Webhook configuration and management through the UI]. + +* **Legacy Webhooks**: +The **Legacy webhooks** page displays a list of webhooks created for KPI alerts and the menu actions to create, view, and edit the webhooks created for KPI alerts. These webhooks are managed through the UI and can be selected as custom channels to send KPI alerts when a KPI metric meets the threshold. For more information, see xref:webhooks.adoc[Webhook configuration and management through the UI] and xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. -== Response after webhook delivery +=== Webhook REST APIs +The REST API framework is intended for automation and integration scenarios, for example, creating webhooks programmatically or delivering Liveboard report attachments to a cloud storage destination. See the following for more information: +xref:webhooks-lb-schedule.adoc[Deliver Liveboard reports to an +external application] for REST API reference and examples. -When a webhook delivery is attempted for a Liveboard schedule event, the webhook endpoint must respond with an HTTP 2xx status code within 5 seconds to confirm successful receipt and processing of the request. +== Webhook delivery behavior +When ThoughtSpot attempts to deliver a webhook event, the destination endpoint must respond with an HTTP 2xx status code within 5 seconds to confirm successful receipt. -If your server takes longer than 5 seconds to respond, returns a response code other than 2xx, or times out, ThoughtSpot may still deliver the Liveboard data and files. However, the notification status will be recorded as `FAILED` in the ThoughtSpot notification, and the request will be retried. +If the endpoint takes longer than 5 seconds to respond, returns a non-2xx status code, or times out, ThoughtSpot records the delivery status as `FAILED` and retries the request. -To ensure a timely response, we recommend processing webhook payloads asynchronously. Your server can immediately return a 2xx response upon receipt of the webhook and then handle the payload in the background without blocking subsequent webhook deliveries. +To ensure a timely response, process webhook payloads asynchronously. Your server can return a 2xx response immediately on receipt and handle the payload in the background, without blocking subsequent webhook deliveries. + +For information about retry behavior and delivery logs, see xref:webhooks-manage.adoc[Manage webhooks]. == Webhook payload -For information about the payload content delivered to a target destination, see xref:webhooks-payload.adoc[Webhook payload for Liveboard events]. + +For information about the payload structure delivered to a destination, see +xref:webhooks-payload.adoc[Webhook payload for Liveboard events]. + +== Next steps +* xref:webhooks-comm-channel.adoc[Configure webhook communication channels] +* xref:webhooks-s3-storage.adoc[Deliver content to cloud storage using webhooks] +* xref:webhooks-lb-schedule.adoc[Deliver Liveboard reports to an external application] +* xref:webhooks-kpi-alerts.adoc[Send KPI monitor alerts using a webhook] + diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 5c44035d3..8eb540dc8 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -23,6 +23,7 @@ This page lists new features, enhancements, and deprecated functionality introdu // *Affects:* Developers, Administrators, End Users // ============================================================ +== July 2026 [.cl-table, cols="2,4", frame=none, grid=none] |===== @@ -33,117 +34,80 @@ a| a| [discrete] -==== Spotter file upload in embedded apps [.version-badge.new]#New# - -// SOURCE: https://github.com/thoughtspot/developer-docs/blob/main/modules/ROOT/pages/api-changelog.adoc (SDK v1.49.x section) - -Embedded Spotter applications can now allow users to upload files directly in the Spotter chat panel. The SDK introduces two new configuration parameters in `SpotterChatViewConfig` to enable and control this capability: - -* `spotterFileUploadEnabled` — When set to `true`, enables the file upload feature in the Spotter chat panel. -* `spotterFileUploadFileTypes` — Restricts the file types allowed for upload. Accepts a `SpotterFileUploadFileTypes` object. - -For more information, see xref:embed-spotter.adoc#_enable_file_upload_in_spotter_chat[Enable file upload in Spotter chat]. +==== SpotterViz for Liveboards [.version-badge.new]#New# +You can now use SpotterViz in your embedding application to help your users build and edit Liveboards through a conversational interface. Instead of manually configuring charts and layouts, your users describe what they want in natural language, and SpotterViz generates the Liveboard for them, including new tabs, chart types, styling, data filters, and scheduled deliveries. ---- - -[discrete] -==== SpotterViz branding and customization [.version-badge.new]#New# - -The Visual Embed SDK 1.50.0 introduces the `SpotterVizConfig` interface and -`SpotterVizStarterPrompt` interface to allow embed developers to customize -the SpotterViz panel on embedded Liveboards and full-application embeds. +SpotterViz customization:: +The Visual Embed SDK also provides several customization options in the xref:SpotterVizConfig.adoc[SpotterVizConfig] and xref:SpotterVizStarterPrompt.adoc[SpotterVizStarterPrompt] interfaces to customize the SpotterViz panel experience. -Using `SpotterVizConfig`, you can now: +Insight tiles in Liveboards:: +When SpotterViz is enabled, your application users can add and configure the **Insight tile** for automated textual analysis of the data on your Liveboard. For example, you can specify a prompt or context that defines what the tile should analyze. -* Set a custom brand name and headline for the SpotterViz panel. -* Add a custom description and input chat placeholder text. -* Show, hide, or replace the default starter prompts with -application-specific suggestions using `SpotterVizStarterPrompt`. - -The `spotterViz` property is available on both `AppViewConfig` and -`LiveboardViewConfig`. - -For more information, see xref:embed-spotter-viz.adoc[Customizing SpotterViz]. -// TODO: verify target page ID with the developer-docs team. - ---- - -[discrete] -==== SpotterViz Insight Tiles [.version-badge.new]#New# [beta betaBackground]^Beta^ - -// SOURCE: SCAL-303724, SCAL-313472 - -Liveboards now support a new **Insight Tile** type that uses Spotter AI to generate automated textual analysis of the data on your Liveboard. In edit mode, you can add an Insight Tile and specify a prompt or context that defines what the tile should analyze. The tile displays 5–7 AI-generated bullet-point insights with a distinct light blue gradient background. - -Key behaviors: - -* *Scope selection* — You can set the scope of an Insight Tile to Tab, Group, or an individual Answer. -* *Auto-retriggering* — Insight Tiles automatically regenerate insights on Liveboard load and when Liveboard-level filters change. -* *Localization* — Insights are rendered in the user's configured locale. - -Beta limitations: - -* Insight Tiles are not rendered in scheduled exports or downloads (a placeholder is shown instead). -* Cross-filter interactions are not supported in this Beta release. -* Pinning Insight Tiles from plugins is not supported. - -// TODO: verify with engineering — add link to product docs page for Insight Tiles once thoughtspot-docs page is published - ---- - -[discrete] -==== SpotterViz embed customization [.version-badge.new]#New# - -// SOURCE: SCAL-311987, SCAL-311988 - -The Visual Embed SDK now exposes customization APIs for the SpotterViz component in embedded Liveboards. Embed developers can apply the following customizations: - -* CSS variables for styling the SpotterViz panel. -* New embed events and action IDs for SpotterViz interactions. -* Brand customization support via the existing `customization` configuration. -* Host event customization for programmatic control of SpotterViz. - -For more information, see xref:embed-spotter-viz.adoc[Customizing SpotterViz]. +For more information, see xref:embed-spotterViz.adoc[Customizing SpotterViz]. +[NOTE] +==== +SpotterViz is an Early Access feature and is available to users with edit permissions on a Liveboard. +==== --- [discrete] -==== Runtime filters and parameters for Insight Tiles [.version-badge.new]#New# +==== Spotter file upload in embedded apps [.version-badge.new]#New# -// SOURCE: SCAL-309605 +Embedded Spotter applications can now allow users to upload files directly in the Spotter chat panel. The SDK introduces two new configuration parameters in `SpotterChatViewConfig` to enable and control this capability: -Runtime filters and parameters passed to an embedded Liveboard are now respected by Insight Tiles. When a runtime filter is applied, Spotter regenerates the tile's AI-generated insights using the filtered data context, ensuring the analysis reflects the current view. +* `spotterFileUploadEnabled`: + +When set to `true`, enables the file upload feature in the Spotter chat panel. +* `spotterFileUploadFileTypes`: + +Restricts the file types allowed for upload. Accepts a `SpotterFileUploadFileTypes` object. -For more information, see xref:runtime-filter.adoc[Runtime filters] and xref:embed-pinboard.adoc[Embed a Liveboard]. +For more information, see xref:embed-spotter.adoc#_enable_file_upload_in_spotter_chat[Enable file upload in Spotter chat]. --- [discrete] ==== Focused homepage experience [.version-badge.new]#New# - -// SOURCE: SCAL-307969 - -A new `HomePage.Focused` enum member (`v4`) is introduced in `AppEmbed` -to enable the V4 homepage experience, which merges the Watchlist and Recents -sections into a single focused view. This release marks the General Availability of the focused homepage. - -Improvements in this GA release: - -* The Watchlist shows an appropriate message when no comparison data point is available for a metric. -* The Spotter tile is hidden for users who do not have access to a Spotter-enabled data source. -* In Auto mode, the data model selection dialog opens directly when a user initiates a Spotter session. +In full application embedding, when the V3 navigation and home page experience is enabled, ThoughtSpot provides an additional option to switch to the new focused home page experience. The focused home page experience provides a streamlined, contemporary experience along with the Spotter panel. For more information, see xref:customize-homepage-full-embed.adoc[Customize home page experience]. [NOTE] ==== -The V4 homepage experience requires Spotter to be enabled on your -ThoughtSpot instance. +The focussed homepage experience is in beta and disabled by default. To enable this experience in your embedding application, the feature must be enabled on your ThoughtSpot instance and in the Visual Embed SDK. ==== +--- -For more information, see xref:embed-app.adoc#_discovery_experience[Discovery experience]. -// TODO: verify target anchor with the developer-docs team. +[discrete] +==== Centralized Webhooks page [.version-badge.new]#New# + +[earlyAccess earlyAccessBackground]^Early Access^ +The *Develop* tab now includes a dedicated *Webhooks* page for creating, managing, and +monitoring all webhooks in your ThoughtSpot Org from one place. + +Key capabilities include: + +* *Webhooks tab* — A paginated table listing all Org webhooks with columns for name, event +type, delivery status, state, author, and timestamps. Supports sorting, filtering, bulk +selection, and row-level actions including edit, delete, test, and enable/disable. +* *Enable and disable webhooks* — Activate or deactivate a webhook without deleting it, using +the state toggle on the table row or the bulk actions bar. +* *Stats cards* — Four metric cards at the top of the page show Delivery Rate, Delivered +count, Failed count, and retry queue size across all Org webhooks. Stats refresh every 30 +seconds. +* *Logs tab* — Delivery attempt history with status badges, event type, attempt count, and +error messages. A details modal shows the full payload, response headers, and retry history. +Logs are retained for 3 days. +* *Create/Edit webhook modal* — A unified form covering authentication (No Auth, API Key, +Basic Auth, Bearer Token, OAuth 2.0 client credentials), optional cloud storage destination +(AWS S3 or GCP GCS), signature verification, custom headers, and URL parameters. +* *Test event* — Send a one-click test payload to verify endpoint connectivity, with +categorized feedback for auth errors, timeouts, and 4xx/5xx responses. + +For more information, see xref:webhooks-manage.adoc[Manage webhooks] and +xref:webhooks.adoc[Webhooks overview]. --- + + [discrete] ==== Liveboard browser cache refresh — Early Access [.version-badge.new]#New# @@ -152,34 +116,30 @@ For more information, see xref:embed-app.adoc#_discovery_experience[Discovery ex The Liveboard browser cache feature is now in Early Access. When `enableLiveboardDataCache` is set to `true` in your `LiveboardEmbed` configuration, ThoughtSpot caches Liveboard visualization data in the browser to significantly reduce reload times on revisit. For SDK event and action IDs, see the xref:api-changelog.adoc#_liveboard_browser_cache_refresh[Visual Embed changelog — Liveboard browser cache refresh]. - --- -[discrete] -==== New EmbedEvents for SpotterViz [.version-badge.new]#New# -The SDK introduces two new event identifiers for monitoring SpotterViz -panel activity in embedded Liveboards: +[discrete] +==== Webhooks enhancements [.version-badge.new]#New# -* `EmbedEvent.SpotterVizMount` + -Emitted when the SpotterViz panel mounts in embed mode. -* `EmbedEvent.SpotterVizPromptSubmit` + -Emitted when a user submits a prompt in the SpotterViz panel. +ThoughtSpot 26.7.0.cl introduces several enhancements to the Webhooks REST API and the Webhooks page in the Developer tab. ---- +* **Retrieve storage configuration** — A new `GET /api/rest/2.0/webhooks/storage-config` endpoint returns the AWS ARN or GCP service account details that administrators need to configure cross-account storage access. For more information, see xref:webhooks-api.adoc#_retrieving_storage_information_for_webhook_configuration[Webhooks API documentation]. +* **GCS bucket storage destination** — Webhook payloads can now be delivered directly to a Google Cloud Storage (GCS) bucket on GCP-hosted instances. Specify `storage_type: GCP_GCS` with a `gcp_gcs_config` object in the `storage_destination` parameter. For more information, see xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery]. +* **Enable and disable webhooks** — The create, update, and search webhook APIs now support a `status` parameter (`ENABLED` or `DISABLED`), letting you activate or deactivate webhooks without deleting them. The Webhooks page in the Developer tab also surfaces the webhook status with a toggle. +* **Selective configuration reset** — The update webhook API now supports a `reset_options` parameter, which removes specific optional configuration sections (`AUTHENTICATION`, `SIGNATURE_VERIFICATION`, or `STORAGE_DESTINATION`) from a webhook without replacing the full configuration. +//// [discrete] ==== GCS storage integration for webhook delivery [.version-badge.new]#New# -// SOURCE: SCAL-301399, SCAL-304083, SCAL-310002 - -Google Cloud Storage (GCS) buckets can now be configured as a storage destination for webhook payload delivery on GCP-hosted ThoughtSpot clusters. This extends the existing Amazon S3 webhook storage integration to bring GCS parity for GCP environments. +Administratos can now configure Google Cloud Storage (GCS) buckets can now be configured as a storage destination for webhook payload delivery on GCP-hosted ThoughtSpot clusters. This extends the existing Amazon S3 webhook storage integration to bring GCS parity for GCP environments. A storage config API endpoint returns the GCP Service Account details required to configure IAM permissions on your GCS bucket. -For more information, see xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery]. --- +//// [discrete] ==== Saved Chat public APIs [.version-badge.new]#New# @@ -202,17 +162,12 @@ For more information, see xref:saved-conversations-api.adoc[Saved Chat public AP [discrete] ==== REST API v2 -// TODO: verify if any new Spotter REST API v2 endpoints are introduced specifically in 26.7.0.cl beyond those documented in 26.6.0.cl — confirm with engineering - For information about REST API v2 enhancements in this release, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. --- [discrete] ==== Visual Embed SDK [.version-badge.breaking]#Breaking# - -// SOURCE: SCAL-309464 - The Visual Embed SDK version 1.50.0 includes several new features, enhancements, and a breaking change. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. ⚠️ *Breaking change*: `EmbedEvent.SpotterData` has been removed. This event was never emitted in Spotter 3 and was superseded by `EmbedEvent.PreviewSpotterData`. Update your integration code to use `EmbedEvent.PreviewSpotterData`. @@ -284,3 +239,547 @@ The Visual Embed SDK version 1.49.0 includes several new features and enhancemen This release introduces new API endpoints for Spotter, connections and trusted authentication. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. |===== + + + + + + +== June 2026 + +**Release version**: ThoughtSpot Cloud 26.6.0.cl + +*Upgrade notes*: No breaking changes. + +*Recommended SDK versions*: Visual Embed SDK v1.49.0 and later + +[.cl-table, cols="2,4", frame=none, grid=none] +|===== +a| +[.cl-label] +*Version 26.6.0.cl* + +a| +[discrete] +==== Chart and table overrides [.version-badge.new]#New# +You can now apply visualization overrides to charts and tables generated from a search query in ThoughtSpot search and full application embedding. The `visualOverrides` property in `SearchViewConfig` and `AppViewConfig` allows developers to apply at the embed initialization time: + +* Chart overrides + +Control legend visibility and position, data label display and per-column filter +thresholds, regression lines, grid lines, axis range and label settings, series +colors, and conditional formatting rules including font and background styling. +* Table overrides + +Control column visibility, text wrapping, row height and padding density, table +theme, and column summary visibility with per-column exceptions. + +For more information, see xref:viz-overrides.adoc[Configuring visualization overrides]. + +--- + +[discrete] +==== Spotter AI and embedding enhancements [.version-badge.new]#New# + +This release introduces the following enhancements for Spotter AI workflows and embedded Spotter applications. + +* Spotter embedding: + +Spotter now includes data literacy skills that help users understand the underlying data model. Users can ask Spotter to explain available data sources, fields, and relationships in plain language within a conversation session. +* Spotter AI APIs: + +//** New REST API endpoints to configure and retrieve persistent behavioral xref:spotter-agent-instructions.adoc[instructions for the Spotter agent]. + New API endpoint xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[stop and cancel a long-running Spotter response]. + +--- + +[discrete] +==== Developer page enhancements +The **Develop** page in the ThoughtSpot UI has been updated with the following enhancements: + +* The **Custom actions** list page now shows the code-based custom actions configured using the Visual Embed SDK. +* Removal of REST API v1 + +The legacy REST Playground v1 has been removed from the left navigation. This change does not affect your current integrations with v1 REST API. ThoughtSpot recommends that you update your integration workflows to use REST API v2. For more information, see xref:rest-api-v1v2-comparison.adoc[REST API v1 to v2 migration]. +* Removal of GraphQL playgrounds + +The menu link to the GraphQL playground has been removed from the UI. + +[discrete] +==== Visual Embed SDK +The Visual Embed SDK version 1.49.0 includes several new features and enhancements. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. + +--- + +[discrete] +==== REST API v2 +This release introduces new API endpoints for Spotter, connections and trusted authentication. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + +|===== + + +== May 2026 + +**Release version**: ThoughtSpot Cloud 26.5.0.cl + +*Upgrade notes*: ⚠️Includes breaking changes to Spotter APIs. Refer to the xref:rest-apiv2-changelog.adoc[REST API changelog] for more information. + +*Recommended SDK versions*: Visual Embed SDK v1.48.0 and later + + +[.cl-table, cols="2,4", frame=none, grid=none] +|===== +a| +[.cl-label] +*Version 26.5.0.cl* + +a| + + +[discrete] +==== Liveboard downloads + +Continuous Liveboard PDF export [beta betaBackground]^Beta^:: +In PDF downloads, Liveboard tabs can now be rendered in a single page matching the UI layout. This feature can be enabled by setting `isContinuousLiveboardPDFEnabled` to `true` in the SDK. Setting this flag to `false` returns to the paginated PDF view. + +Liveboard download in XLSX and CSV formats:: +Embedded Liveboards can now be downloaded in the PDF, XLSX and CSV file formats. To enable this feature, ensure that the `isLiveboardXLSXCSVDownloadEnabled` parameter is set to `true`. + +Excel exports for pivot tables:: +Pivot table visualizations can now be exported to Excel format. + +For more information, see xref:embed-pinboard.adoc#_liveboard_download_options[Liveboard download options]. + +--- + +[discrete] +==== Visualization edit interface within the Liveboard view + +Users can now edit the underlying query of an answer directly within the Liveboard. When this feature is enabled, the edit button for visualization appears in the answer's floating toolbar when the Liveboard is opened in the edit mode. Clicking the edit button opens the Answer interface preloaded with the answer's current query context. You can make the edits and save the changes without leaving the Liveboard. + +--- + +[discrete] +==== KPI charts in embedded Liveboards + +Embedded Liveboards support advanced controls KPI chart customization. For more information, see link:https://docs.thoughtspot.com/cloud/latest/chart-kpi#advanced[KPI charts]. + +--- + +[discrete] +==== Per-org and per-user timezone control via variables [beta betaBackground]^Beta^ + +You can centrally control timezone behavior per org and per user in embedded deployments using the new template variable `ts_user_timezone` and Variable APIs. + +For multi-org and multi-tenant environments, each tenant org and user can be configured independently, guaranteeing isolation and consistency of time-based analytics across regions. Administrators can reference the timezone variable in formulas to render and filter timestamp data correctly for each embedded user, without separate content per region. + +--- + +[discrete] +==== Timezone-aware keyword filtering [beta betaBackground]^Beta^ +ThoughtSpot now supports resolving relative date and time keywords, such as `today`, `yesterday`, and `last 7 days`, using a configurable per-user or per-Org timezone, instead of the system default timezone on a ThoughtSpot instance. This feature eliminates timezone-based inconsistencies in multi-region embedded deployments and removes the need for custom workarounds. + +For more information, see xref:timezone.adoc[Timezone-aware keywords and filters]. + +[NOTE] +==== +The timezone awareness feature is in Beta and disabled by default. To enable this feature, contact ThoughtSpot Support. +==== + + +--- + +[discrete] +==== Visual Embed SDK +The Visual Embed SDK version 1.48.0 includes several new features and enhancements. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. + +--- + +[discrete] +==== REST API v2 +This release introduces new Spotter API endpoints and modifications to the agent conversation APIs, and deprecates legacy agent endpoints. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + +|===== + + +== April 2026 + +**Release version**: ThoughtSpot Cloud 26.4.0.cl + +*Upgrade notes*: ⚠️Variable update and delete API and metadata parameterization endpoints are deprecated and replaced with new API endpoints. Refer to xref:rest-apiv2-changelog.adoc#version_26_4_0_cl_april_2026[REST API changelog] and xref:deprecated-features.adoc[Deprecation announcements]. + +*Recommended SDK versions*: Visual Embed SDK v1.47.0 and later + +[.cl-table, cols="2,4", frame=none, grid=none] +|=== + +a| +[.cl-label] +*Version 26.4.0.cl* + +a| + +[discrete] +==== Theme builder in AI mode + +The Theme Builder now has an AI mode that enables developers to explore and preview style customizations for their embedded application’s branding using natural language instructions and uploaded brand assets. You can execute style updates such as applying colors directly from a PDF branding guide, updating all button shapes with higher contrast, matching a header to a dark background based on a screenshot, or importing typography and spacing from a JSON file. In the AI mode, Theme builder interprets your intent and applies the changes instantly. + +For more information, see xref:theme-builder.adoc[Theme builder]. + +--- + + +[discrete] +==== Webhook integration +In this release version, the following enhancements are introduced in the webhook configuration and delivery status monitoring workflows: + +Channel validation:: +Administrators can verify the connection status of a webhook channel by sending a test payload in a `POST` request to the `/api/rest/2.0/system/communication-channels/validate` REST API endpoint. For more information, see xref:webhooks-comm-channel.adoc#_validate_communication_channel_configuration[Webhook channel validation]. + +Monitor webhook delivery:: +Administrators can also monitor the status of a webhook delivery via a `POST /api/rest/2.0/jobs/history/communication-channels/search` API request. For more information, see xref:webhooks-comm-channel.adoc#_monitor_webhook_delivery_and_job_status[Monitor webhook delivery and job status]. + +Support for custom HTTP headers in webhook requests:: +When configuring or updating a webhook, you can now specify custom headers to include in every outbound request, in addition to the standard HTTP and authentication headers that ThoughtSpot sends. For more information, refer to the xref:webhooks-lb-schedule.adoc#_create_a_webhook[webhook documentation]. + +--- + + +[discrete] +==== Spotter embed enhancements +You can now customize the appearance and contents of the chat history sidebar panel in Spotter embedding. + +You can also customize the branding and logo in the Spotter chat interface. + +For more information, see xref:embed-spotter.adoc#_chat_history_panel[Customizing chat history sidebar] and xref:embed-spotter.adoc#_hiding_the_spotter_icon_and_thoughtspot_branding_chat_interface[Hiding logo and brand label in Spotter chat interface]. + +--- + +[discrete] +==== Liveboard enhancements +The following enhancements are introduced in Liveboard export and filtering workflows. + +Embedding a personalized Liveboard view:: +You can now embed a saved personalized Liveboard view using the `personalizedViewId` and load it along with the `liveboardId` in your app. + +Centralized filter modal:: +Liveboard users can modify multiple filters and parameters in a single session using the centralized filter modal. This is an early access feature and disabled by default on ThoughtSpot embedded instances. To enable this feature on embedded Liveboards, set the `isCentralizedLiveboardFilterUXEnabled` to `true`. + +Current period inclusion in rolling date filters:: +The rolling date filters with the **Last ** and **Next ** filter types support including current period. Developers can disable, show, or hide this option using `isThisPeriodInDateFiltersEnabled` or `Action.IncludeCurrentPeriod`. + +Liveboard PNG export:: +The PNG export workflow in the `/api/rest/2.0/report/liveboard` REST API is enhanced to provide high-resolution PNG files. The legacy PNG workflow is deprecated in 26.4.0.cl. For more information about breaking changes and deprecation guidelines, see xref:deprecated-features.adoc[Deprecation announcements]. For information about the new PNG download workflow, see xref:data-report-v2-api.adoc#_liveboard_report_api[Liveboard report API documentation]. + +--- + + +[discrete] +==== Full app embedding +In full application embedded deployments with the V3 navigation and home page experience, the default list page experience is set to ListPage v3 experience. + +The ListPage V3 experience provides a refreshed list layout and styling, including the following enhancements: + +* The **Views** column to show the number of views for each object. +* Sorting options for **Name**, **Author**, and **Views** columns. +* Filter addition by clicking the column header without opening the filter modal. This option is available for **Favorites**, **Views** columns, and **Verified** columns. + +For more information, see xref:full-app-customize.adoc#_customize_list_page_experience[List page customization]. + +--- + + +[discrete] +==== Variable API +The variable REST API provides new API endpoints for the following bulk operations: + +* Bulk deletion: +You can now delete multiple variables in a single API request using the `/api/rest/2.0/template/variables/delete` endpoint. +* Batch update of variable values: +You can now assign and update multiple values to a variable in a single API request using the `/api/rest/2.0/template/variables/{identifier}/update-values` endpoint. + +[NOTE] +==== +The `/api/rest/2.0/template/variables/update-values` and `/api/rest/2.0/template/variables/{identifier}/delete` endpoints are now deprecated. Use the new `/api/rest/2.0/template/variables/{identifier}/update-values` and `/api/rest/2.0/template/variables/delete` endpoints for the variable update and delete operations instead. +==== + +For more information, see xref:variables.adoc[Variables documentation]. + +--- + + +[discrete] +==== Metadata parameterization +You can now parameterize multiple properties of metadata objects using `POST /api/rest/2.0/metadata/parameterize-fields`. The legacy endpoint `/api/rest/2.0/metadata/parameterize` is deprecated in 26.4.0.cl and later versions, and is replaced with the new endpoint to allow updating multiple fields in a single API request. + +For more information, see xref:metadata-parameterization.adoc[Metadata parameterization documentation]. + +--- + + +[discrete] +==== Collections [beta betaBackground]^Beta^ +ThoughtSpot embedded users can now use REST APIs v2 to organize different ThoughtSpot objects into organizational containers called *Collections*. These objects can be Liveboards, Answers, data models, tables, and even other Collections. + +For more information, see xref:collections.adoc[Collections]. + +[NOTE] +==== +These APIs are currently in beta and turned off by default on ThoughtSpot instances. To enable this feature on your instance, contact ThoughtSpot Support. +==== +--- + +[discrete] +==== Visual Embed SDK +For information about the new features and enhancements introduced in Visual Embed SDK version 1.46.0, see the xref:api-changelog.adoc[Visual Embed changelog]. + + +[discrete] +==== REST API v2 +For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + +--- +|=== + +== March 2026 + +**Release version**: ThoughtSpot Cloud 26.3.0.cl + +*Upgrade notes*: ⚠️Includes feature deprecations. Refer to xref:rest-apiv2-changelog.adoc#_custom_access_token_api[REST API changelog] and xref:deprecated-features.adoc[Deprecation announcements]. + +*Recommended SDK versions*: Visual Embed SDK v1.46.0 and later + +[.cl-table, cols="2,4", frame=none, grid=none] +|=== + +a| +[.cl-label] +*Version 26.3.0.cl* + +a| +[discrete] +==== Amazon S3 storage destination for webhook delivery +You can now configure ThoughtSpot to deliver webhook payloads and attachments directly into your own Amazon S3 storage using secure AWS cross-account access. To enable this integration, your AWS administrator must create an IAM role with S3 permissions and trust policy, and then register a webhook in ThoughtSpot to deliver the payloads and attachments directly to your S3 bucket. + +For more information, see xref:webhooks-s3-storage.adoc[Amazon S3 storage integration for webhook delivery]. + +--- + +[discrete] +==== Host event enhancements for context-aware routing + +HostEvents in the Visual Embed SDK are enhanced to improve event routing and context targeting in ThoughtSpot embedded applications. + +Developers can use the page context framework in the SDK to route host events to a specific UI layer and align user experience with the product UI behavior in multi-modal contexts. + +For more information, see xref:events-context-aware-routing.adoc[Context-based execution of host events]. + +--- + +[discrete] +==== JWT-based ABAC implementation +The legacy JWT-based approach that uses `filter_rules` and `parameter_values` to implement Attribute-Based Access Control (ABAC) is deprecated. + +As part of this deprecation, the following changes have been introduced to the custom authentication token API workflow and REST API Playground: + +* The `filter_rules` parameter on the custom token authentication page in the REST API Playground is no longer available for new configurations. This change does not affect your existing implementation. + +* The `parameter_values` property is not deprecated in version 26.3.0.cl and remains supported until further notice. However, using parameter values for row-level security use cases will ultimately be deprecated in an upcoming release. + +Existing ABAC implementations that use `filter_rules` will continue to function until further notice. However, we strongly recommend migrating your legacy ABAC implementation to the ABAC via RLS method that uses custom variables. For migration steps, refer to the xref:abac-migration-guide.adoc[ABAC migration guide]. + +For new deployments, use ABAC via RLS with custom variables and pass data security attributes through the `variable_values` property in the custom access token, and define your RLS rules based on those variables. For more information, see xref:abac_rls-variables.adoc[ABAC via RLS]. + +--- + +[discrete] +==== Spotter coaching access across published Orgs +Starting with the 26.3.0.cl release, ThoughtSpot supports publishing Spotter coaching information to other Orgs. Coaching changes from the primary Org are synchronized with the data models published in secondary Orgs. + +Administrators and users with edit access to data models can programmatically control user access to Spotter coaching information using the object privilege REST API endpoint, `/api/rest/2.0/security/metadata/manage-object-privilege`. They can assign `SPOTTER_COACHING_PRIVILEGE` to other users and user groups, allowing access to the coaching information without requiring data model editing or administration privileges. + +Users and groups with `SPOTTER_COACHING_PRIVILEGE` can import and export coaching TML on data models in the source and destination Orgs where the model is published, and can also share these objects with other users and groups. + +For more information, see xref:spotter-nl-instructions.adoc#_spotter_data_model_instructions_access[Spotter data model instructions access]. + +--- + +[discrete] +==== Full application embedding +The height and aspect ratio of the logo in the top-left corner of the ThoughtSpot application interface have been updated for visual alignment and consistency across pages. This enhancement is available only in the V3 navigation and home page experience. + +If you have embedded the full application with the V3 navigation experience, you may notice that the logo appears smaller in the top navigation. This is a design update and does not require any configuration changes to your current embedding implementation. However, we recommend that you review the logo size and appearance, and adjust your custom logo if necessary. + +For information about adding a custom logo image, see xref:customize-style.adoc#logo-change[Customize application logo and favicon]. + +--- + +[discrete] +==== Visual Embed SDK +For information about the new features and enhancements introduced in Visual Embed SDK version 1.46.0, see the xref:api-changelog.adoc[Visual Embed changelog]. + +--- + +[discrete] +==== REST API v2 +For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + +--- + +|=== + +== February 2026 +**Release version**: ThoughtSpot Cloud 26.2.0.cl + +*Upgrade notes*: ⚠️Includes API parameter deprecations. Refer to xref:rest-apiv2-changelog.adoc[REST API changelog] and xref:deprecated-features.adoc[Deprecation announcements]. + +*Recommended SDK versions*: Visual Embed SDK v1.45.0 and later + + +[.cl-table, cols="2,4", frame=none, grid=none] +|=== +a| +[.cl-label] +*Version 26.2.0.cl* + +a| +[discrete] +==== SpotterCode extension for IDEs [earlyAccess eaBackground]#Early Access# + +ThoughtSpot introduces SpotterCode, an AI-powered Model Context Protocol (MCP) extension for Integrated Development Environments (IDEs) such as Cursor, Visual Studio Code, and Claude Code. When integrated, SpotterCode enables the AI agent in the IDE to access ThoughtSpot SDKs and API documentation resources and provide in-context coding assistance to developers embedding ThoughtSpot content within their applications. + +SpotterCode is available as an Early Access feature and can be integrated with development environments that support MCP servers and tools. For more information, see xref:spottercode.adoc[SpotterCode], xref:spottercode-integration.adoc[Integrating SpotterCode in IDEs], and xref:spottercode-prompt-guide.adoc[SpotterCode prompting guide]. + +--- + +[discrete] +==== Spotter 3 experience [earlyAccess eaBackground]#Early Access# +You can now embed the Spotter 3 experience, which introduces several new capabilities, agentic analytics, and enhanced user experience. Spotter 3 is an Early Access feature and is disabled by default on ThoughtSpot embedded instances. + +For more information, see xref:embed-ai-analytics.adoc[Embed AI Search and Analytics] and xref:embed-spotter.adoc[Spotter embedding documentation]. + +--- + +[discrete] +==== Rate limits for REST APIs +To prevent excessive requests from reaching application servers and ensure API stability and service quality for REST API users, ThoughtSpot enforces rate limits on public API requests per client IP. These limits are applied globally at the cluster level for all public API requests, including calls to both REST API v1 and v2 endpoints. +//Administrators can adjust these limits for their ThoughtSpot deployments as needed. + +For more information, see xref:about-rest-apis.adoc#_rate_limits_for_api_requests[Rate limits for REST APIs]. + +--- + +[discrete] +==== Security settings via REST APIs +Security settings that ensure data security and a seamless embedded user experience can now be configured through REST APIs v2. Administrators and developers can configure allowlists for: + +* Content Security Policy (CSP) +* Cross-origin Resource Sharing (CORS) +* Authentication attributes +* Access control settings + +For more information, see xref:security-settings.adoc[Security Settings]. + +--- + +[discrete] +==== WebSocket support for external tools +ThoughtSpot supports secure WebSocket (`wss://`) endpoints for external tool script integrations, for example, tools that open WebSocket connections from the browser. + +To allow a WebSocket host, add the corresponding `wss://` URL to both your CSP allowlists. Only hosts explicitly listed with the `wss://` protocol are permitted. Existing `https://` entries in the allowlists remain unchanged and continue to function as expected. + +For more information, see xref:3rd-party-script.adoc#_allow_websocket_endpoints[External tools and script integration]. + +--- + + +[discrete] +==== Visual Embed SDK +For information about the new features and enhancements introduced in Visual Embed SDK version 1.45.0, see the xref:api-changelog.adoc[Visual Embed changelog]. + +--- + +[discrete] +==== REST API v2 +For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + +--- +|=== + + +== January 2026 + +**Release version**: ThoughtSpot Cloud 10.15.0.cl + +*Upgrade notes*: No breaking changes. + +*Recommended SDK versions*: Visual Embed SDK v1.44.0 and later + + +[.cl-table, cols="2,4", frame=none, grid=none] +|=== +a| +[.cl-label] +*Version 10.15.0.cl* + +a| +[discrete] +==== Theme Builder +Theme Builder is now generally available (GA) and will be rolled out to all ThoughtSpot instances in customer deployments over the next few weeks. + +When this feature is enabled on your instance, you can access it from the *Develop* page in ThoughtSpot and use it to customize styles and UX themes directly within the product. + +For more information, see xref:theme-builder.adoc[Theme Builder]. + +--- + +[discrete] +==== V3 navigation and home page experience + +The new V3 navigation and home page experience is now generally available (GA) and can be enabled on ThoughtSpot embedded instances. + +The default UI experience in full application embedding remains the classic (V1) experience until further notice. Developers embedding the full ThoughtSpot application can enable the V3 experience in their applications by setting the appropriate configuration options in their embed code. + +For more information, see xref:full-app-customize.adoc[Customizing full application embedding]. + +--- + +[discrete] +==== Formula variables in RLS rules + +You can now create formula variables using the Variable REST API and use these variables in RLS rules for a specific data context and in ABAC token requests to dynamically assign security attributes to users. + +For more information, see xref:abac_rls-variables.adoc[ABAC via RLS with variables]. + +--- + +[discrete] +==== Spotter APIs + +ThoughtSpot introduces new REST APIs for the following Spotter workflows: + +* To send queries to a conversation session with the Spotter agent +* To set natural language (NL) instructions on a model to coach the Spotter system +* To fetch NL instructions configured on a model + +For more information, see xref:spotter-apis.adoc[Spotter APIs]. + +--- + +[discrete] +==== Embed events and parameters to intercept API calls +You can now intercept API calls from the embedded ThoughtSpot application using the `interceptUrls` attribute in the Visual Embed SDK. This feature lets you control API requests in your embedding application and use embed events to modify, block, or handle requests before they are sent to the backend. For more information, see xref:api-intercept.adoc[Intercept API calls and search requests]. + +--- + +[discrete] +==== Icon customization enhancements + +You can now replace or customize the chart switcher toggle and icons in the Charts drawer on an Answer or visualization page using SVG sprites. Previously, these icons were fixed to ThoughtSpot defaults and were not configurable. In the new version, these icons are available as SVG components and can be replaced by developers through the xref:customize-icons.adoc[icon customization framework] as needed. + +--- + +[discrete] +==== Mobile Embed SDK +The SDKs for embedding ThoughtSpot components in mobile apps are now Generally Available (GA). For more information about the SDKs and how to embed a ThoughtSpot component in a mobile app, see xref:mobile-embed.adoc[Mobile embed documentation]. + +--- + +[discrete] +==== Visual Embed SDK +For information about the new features and enhancements introduced in Visual Embed SDK version 1.44.0, see xref:api-changelog.adoc[Visual Embed changelog]. + +--- + +[discrete] +==== Custom calendar APIs + +--- + +[discrete] +==== REST API +For information about REST API v2 enhancements, see xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + +|=== \ No newline at end of file From 3e6ae9eb8b629cdacd4850ed8a0ed8854f9476fa Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 29 Jun 2026 17:40:56 +0530 Subject: [PATCH 064/136] SpotterViz updates and other fixes --- modules/ROOT/pages/api-changelog.adoc | 171 +----- modules/ROOT/pages/common/nav-embedding.adoc | 1 + modules/ROOT/pages/embed-spotter-viz.adoc | 191 ------- modules/ROOT/pages/embed-spotterViz.adoc | 485 ++++++++++++++++++ modules/ROOT/pages/whats-new.adoc | 160 +----- .../images/spotterviz-embed-mode.png | Bin 0 -> 314465 bytes 6 files changed, 515 insertions(+), 493 deletions(-) delete mode 100644 modules/ROOT/pages/embed-spotter-viz.adoc create mode 100644 modules/ROOT/pages/embed-spotterViz.adoc create mode 100644 static/doc-images/images/spotterviz-embed-mode.png diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index c4b6b0302..d6d50431a 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -10,210 +10,61 @@ This page documents the changes introduced in each release of the Visual Embed S == Version 1.50.x, July 2026 -// SOURCE: SCAL-311987, SCAL-290720, SCAL-309464, SCAL-303724, SCAL-309605 - [width="100%" cols="1,4"] |==== |[tag greenBackground]#NEW FEATURE# a| - -[discrete] -==== SpotterViz branding and customization [.version-badge.new]#New# - -The Visual Embed SDK 1.50.0 introduces the `SpotterVizConfig` interface and -`SpotterVizStarterPrompt` interface to allow embed developers to customize -the SpotterViz panel on embedded Liveboards and full-application embeds. - -Using `SpotterVizConfig`, you can now: - -* Set a custom brand name and headline for the SpotterViz panel. -* Add a custom description and input chat placeholder text. -* Show, hide, or replace the default starter prompts with -application-specific suggestions using `SpotterVizStarterPrompt`. - -The `spotterViz` property is available on both `AppViewConfig` and -`LiveboardViewConfig`. - -For more information, see xref:embed-spotter-viz.adoc[Customizing SpotterViz]. ---- - -[discrete] -==== New EmbedEvents for SpotterViz [.version-badge.new]#New# - -The SDK introduces two new event identifiers for monitoring SpotterViz -panel activity in embedded Liveboards: - -* `EmbedEvent.SpotterVizMount` + -Emitted when the SpotterViz panel mounts in embed mode. -* `EmbedEvent.SpotterVizPromptSubmit` + -Emitted when a user submits a prompt in the SpotterViz panel. - ---- - - [discrete] ===== SpotterViz embed customization - -// SOURCE: SCAL-311987, SCAL-311988 - -The SDK introduces the following customization APIs for the SpotterViz component embedded in Liveboards. +The Visual Embed SDK 1.50.0 introduces the `SpotterVizConfig` interface and `SpotterVizStarterPrompt` interface to allow embed developers to customize the SpotterViz panel on embedded Liveboards and full-application embeds. `SpotterVizConfig` interface:: -A new `SpotterVizConfig` interface is available on `LiveboardViewConfig` and `AppViewConfig` via the `spotterViz` property. It exposes the following options: -+ -* `brandName` — Custom brand name displayed in the SpotterViz panel header. -* `headline` — Custom headline text for the SpotterViz panel. -* `description` — Custom description text shown below the headline. -* `inputPlaceholder` — Custom placeholder text for the Spotter chat input. -* `starterPrompts` — Array of `SpotterVizStarterPrompt` objects to replace default prompt suggestions. -+ -// TODO: verify with engineering — confirm full list of SpotterVizConfig properties and their types - -CSS variables:: -SpotterViz exposes CSS custom properties to allow visual styling of the tile. Apply these variables using the `customCSS` configuration in your `LiveboardEmbed` initialization. -+ -// TODO: verify with engineering — provide the authoritative list of CSS variable names and their defaults (for example, --ts-spotterviz-background, --ts-spotterviz-text-color) - -Embed events:: - -* `EmbedEvent.SpotterVizMount` + -Emitted when the SpotterViz panel mounts in embed mode. - -* `EmbedEvent.SpotterVizPromptSubmit` + -Emitted when a user submits a prompt in the SpotterViz panel. - -// TODO: verify with engineering — confirm whether additional EmbedEvents are introduced for Insight Tile load and error states - -Actions:: -// TODO: verify with engineering — confirm Action enum names for SpotterViz visibility control (for example, Action.InsightTileRetrigger) - -For more information, see xref:embed-spotterViz.adoc[Customizing SpotterViz]. - - -[discrete] -==== SpotterViz branding and customization [.version-badge.new]#New# - -The Visual Embed SDK 1.50.0 introduces the `SpotterVizConfig` interface and -`SpotterVizStarterPrompt` interface to allow embed developers to customize -the SpotterViz panel on embedded Liveboards and full-application embeds. - -Using `SpotterVizConfig`, you can now: - -* Set a custom brand name and headline for the SpotterViz panel. -* Add a custom description and input chat placeholder text. -* Show, hide, or replace the default starter prompts with -application-specific suggestions using `SpotterVizStarterPrompt`. - -The `spotterViz` property is available on both `AppViewConfig` and -`LiveboardViewConfig`. - -For more information, see xref:embed-spotter-viz.adoc[Customizing SpotterViz]. - ---- +A new `SpotterVizConfig` interface is available on `LiveboardViewConfig` and `AppViewConfig` via the `spotterViz` object. This object provides branding customization controls for customizing the SpotterViz panel experience. - -|[tag greenBackground]#NEW FEATURE# a| -[discrete] -===== Insight Tiles — runtime filter and parameter support - -// SOURCE: SCAL-309605 - -Runtime filters and parameters passed to `LiveboardEmbed` are now forwarded to Insight Tiles (AI tiles). When a runtime filter is applied, the Insight Tile regenerates its AI-generated insights using the filtered data context. - -No SDK configuration changes are required. Runtime filters already passed via `runtimeFilters` in `LiveboardViewConfig` are automatically applied to Insight Tiles on the same Liveboard. - -For more information, see xref:runtime-filter.adoc[Runtime filters]. +To customize app interactions, visibility of the UI elements, and style and appearance of the SpotterViz panel, the SDK also introduces CSS variables, action IDs, and embed and host event identifiers. For more information, see xref:embed-spotterViz.adoc[SpotterViz in embedded Liveboards]. |[tag greenBackground]#NEW FEATURE# a| [discrete] ===== Saved Chat host events - -// SOURCE: SCAL-290720, SCAL-313991 - The SDK introduces the following host events for managing saved Spotter conversations from the host application. These events complement the new REST API endpoints for saved conversations. - * `HostEvent.LoadChat` + Loads a specific saved conversation by ID into the embedded Spotter interface. + -+ -[source,JavaScript] ----- -spotterEmbed.trigger(HostEvent.LoadChat, { chatId: '' }); ----- - * `HostEvent.DeleteChat` + Deletes a specific saved conversation by ID. The embed emits `EmbedEvent.SpotterConversationDeleted` after deletion. + -+ -[source,JavaScript] ----- -spotterEmbed.trigger(HostEvent.DeleteChat, { chatId: '' }); ----- - * `HostEvent.RenameChat` + Renames a specific saved conversation by ID. + -+ -[source,JavaScript] ----- -spotterEmbed.trigger(HostEvent.RenameChat, { chatId: '', title: 'New title' }); ----- [NOTE] ==== Users can only load, delete, or rename their own conversations. These operations require the user to have Spotter access and the *Save chat* feature enabled on the cluster. ==== - -// TODO: verify with engineering — confirm whether a SpotterConversationRenamed EmbedEvent is emitted after a successful rename - For more information, see xref:saved-conversations-api.adoc[Saved Chat public APIs]. |[tag redBackground]#BREAKING CHANGE# a| [discrete] ===== Removal of `EmbedEvent.SpotterData` -// SOURCE: SCAL-309464 - -`EmbedEvent.SpotterData` has been removed from the Visual Embed SDK. This constant was a legacy event identifier that was never emitted in Spotter 3. It was superseded by `EmbedEvent.PreviewSpotterData` in the Spotter 3 release (SDK v1.28.x) and the old constant was not removed at that time. - -*Action required:* Update all references to `EmbedEvent.SpotterData` in your integration code to use `EmbedEvent.PreviewSpotterData`. - -[source,JavaScript] ----- -// Before — no longer works in SDK v1.50.x and later: -spotterEmbed.on(EmbedEvent.SpotterData, (data) => { ... }); - -// After: -spotterEmbed.on(EmbedEvent.PreviewSpotterData, (data) => { ... }); ----- +`EmbedEvent.SpotterData` has been removed from the Visual Embed SDK. Update all references to `EmbedEvent.SpotterData` in your integration code to use `EmbedEvent.PreviewSpotterData`. |[tag greenBackground]#NEW FEATURE# a| [discrete] ===== Liveboard browser cache refresh -// SOURCE: SCAL-305659 - The Liveboard browser cache feature is now in Early Access. Set `enableLiveboardDataCache` to `true` in `LiveboardViewConfig` to enable client-side caching of Liveboard visualization data. -The following SDK identifiers are available for this feature: +The following events are available in the SDK for this feature: -[cols="2,3"] +* `EmbedEvent.RefreshLiveboardBrowserCache` + +Emitted when the Liveboard browser cache is refreshed. +* `HostEvent.RefreshLiveboardBrowserCache` + +Trigger a manual cache refresh from the host application. +* `Action.RefreshLiveboardBrowserCache` + +Action ID to show or hide the cache refresh button in the Liveboard toolbar. |==== -| Identifier | Description - -| `EmbedEvent.RefreshLiveboardBrowserCache` -| Emitted when the Liveboard browser cache is refreshed. -| `HostEvent.RefreshLiveboardBrowserCache` -| Trigger a manual cache refresh from the host application. - -| `Action.RefreshLiveboardBrowserCache` -| Action ID to show or hide the cache refresh button in the Liveboard toolbar. -|==== - -|==== == Version 1.49.x, June 2026 -// SOURCE: https://github.com/thoughtspot/developer-docs/blob/26.7.0.cl-doc-updates/modules/ROOT/pages/api-changelog.adoc - [width="100%" cols="1,4"] |==== |[tag greenBackground]#NEW FEATURE# a| diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc index fc6cdc283..167815fd9 100644 --- a/modules/ROOT/pages/common/nav-embedding.adoc +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -15,6 +15,7 @@ Embed ThoughtSpot in a web app * link:{{navprefix}}/embed-liveboard[Embed Analytics] ** link:{{navprefix}}/embed-liveboard[Embed a Liveboard] ** link:{{navprefix}}/embed-a-viz[Embed a visualization] +** link:{{navprefix}}/spotterViz-agent[SpotterViz agent in Liveboards] * link:{{navprefix}}/full-embed[Embed full application] ** link:{{navprefix}}/full-app-customize[Customize your embed] ** link:{{navprefix}}/customize-nav-controls[Customize navigation panels] diff --git a/modules/ROOT/pages/embed-spotter-viz.adoc b/modules/ROOT/pages/embed-spotter-viz.adoc deleted file mode 100644 index 39c0c9296..000000000 --- a/modules/ROOT/pages/embed-spotter-viz.adoc +++ /dev/null @@ -1,191 +0,0 @@ -= Customizing SpotterViz -:toc: true -:toclevels: 2 - -:page-title: Customizing SpotterViz -:page-pageid: embed-spotter-viz -:page-description: Customize the SpotterViz panel and Insight Tiles in embedded Liveboards using the Visual Embed SDK. - -// SOURCE: SCAL-311987, SCAL-311988, SCAL-303724, SCAL-309605 - -SpotterViz is the AI-powered analysis panel that appears on embedded Liveboards. It displays **Insight Tiles** — AI-generated textual analysis of Liveboard data — and exposes a customizable prompt interface for user interaction. - -This page describes how to customize SpotterViz in embedded Liveboards using the Visual Embed SDK `SpotterVizConfig` interface and related APIs. - -[NOTE] -==== -SpotterViz customization APIs require ThoughtSpot Cloud 26.7.0.cl or later and Visual Embed SDK v1.50.0 or later. The Insight Tile feature is in Beta. Contact ThoughtSpot Support to enable this feature on your instance. -==== - -== About Insight Tiles - -Insight Tiles are a new Liveboard tile type that uses Spotter AI to generate automated textual analysis of the data in your Liveboard. A tile displays 5–7 AI-generated bullet-point insights with a distinct light blue gradient background. - -Key behaviors: - -* *Scope* — Each Insight Tile can be scoped to a Tab, a Group, or an individual Answer. -* *Auto-retriggering* — Insight Tiles automatically regenerate insights on Liveboard load and when Liveboard-level filters change. -* *Localization* — Insights are rendered in the user's configured locale. -* *Runtime filters* — Runtime filters and parameters passed to `LiveboardEmbed` are respected by Insight Tiles. See <>. - -Beta limitations: - -* Insight Tiles are not rendered in scheduled exports or downloads. A placeholder is shown instead. -* Cross-filter interactions are not supported in this Beta release. -* Pinning Insight Tiles from plugins is not supported. - -// TODO: verify with engineering — add link to product docs page for Insight Tiles (thoughtspot-docs) once published - -== `SpotterVizConfig` interface - -The `SpotterVizConfig` interface is available on `LiveboardViewConfig` and `AppViewConfig` via the `spotterViz` property. Use it to customize the SpotterViz panel's branding and prompt experience. - -[source,JavaScript] ----- -import { LiveboardEmbed } from '@thoughtspot/visual-embed-sdk'; - -const liveboardEmbed = new LiveboardEmbed(document.getElementById('ts-embed'), { - frameParams: { width: '100%', height: '100%' }, - liveboardId: '', - spotterViz: { - brandName: 'Acme Analytics', - headline: 'AI-powered insights for your business', - description: 'Ask a question or explore the insights below.', - inputPlaceholder: 'Ask Acme Analytics a question...', - starterPrompts: [ - { prompt: 'What are the top-performing regions this quarter?' }, - { prompt: 'Show me revenue trends for the last 6 months.' }, - ], - }, -}); - -liveboardEmbed.render(); ----- - -=== `SpotterVizConfig` properties - -[cols="2,1,1,4"] -|==== -| Property | Type | Required | Description - -| `brandName` -| string -| No -| Custom brand name displayed in the SpotterViz panel header. Replaces the default "Spotter" label. - -| `headline` -| string -| No -| Custom headline text for the SpotterViz panel. - -| `description` -| string -| No -| Custom description text shown below the headline. - -| `inputPlaceholder` -| string -| No -| Custom placeholder text for the Spotter chat input field. - -| `starterPrompts` -| `SpotterVizStarterPrompt[]` -| No -| Array of starter prompt objects to replace the default prompt suggestions. Each object requires a `prompt` string property. -|==== - -// TODO: verify with engineering — confirm the complete and final list of SpotterVizConfig properties and whether any additional properties are available in 26.7.0.cl - -== CSS customization - -SpotterViz exposes CSS custom properties that allow you to style the Insight Tile to match your application's visual design. Apply these variables using the `customCSS` configuration in your `LiveboardEmbed` initialization. - -[source,JavaScript] ----- -const liveboardEmbed = new LiveboardEmbed(document.getElementById('ts-embed'), { - frameParams: { width: '100%', height: '100%' }, - liveboardId: '', - customCSS: { - variables: { - // TODO: verify with engineering — replace with confirmed CSS variable names - '--ts-spotterviz-background': 'linear-gradient(135deg, #e8f4fd, #cce8f8)', - '--ts-spotterviz-text-color': '#1a1a2e', - }, - }, -}); ----- - -// TODO: verify with engineering — provide the authoritative list of CSS variable names, their default values, and the CSS scope they apply to - -== Brand customization - -SpotterViz respects ThoughtSpot's brand customization settings. When brand colors are configured in the ThoughtSpot *Develop* > *Style customization* panel, the Insight Tile gradient background updates to reflect your brand palette. - -// TODO: verify with engineering — confirm the exact behavior of brand color overrides on the Insight Tile gradient background - -== Embed events - -Listen to the following events emitted by SpotterViz in your `LiveboardEmbed`: - -=== `EmbedEvent.SpotterVizMount` - -Emitted when the SpotterViz panel mounts in embed mode. - -[source,JavaScript] ----- -liveboardEmbed.on(EmbedEvent.SpotterVizMount, (eventData) => { - console.log('SpotterViz panel mounted:', eventData); -}); ----- - -=== `EmbedEvent.SpotterVizPromptSubmit` - -Emitted when a user submits a prompt in the SpotterViz panel. - -[source,JavaScript] ----- -liveboardEmbed.on(EmbedEvent.SpotterVizPromptSubmit, (eventData) => { - console.log('SpotterViz prompt submitted:', eventData); -}); ----- - -// TODO: verify with engineering — confirm whether additional EmbedEvents are introduced for Insight Tile load and error states in 26.7.0.cl - -[#runtime-filters] -== Runtime filters and Insight Tiles - -// SOURCE: SCAL-309605 - -Runtime filters and parameters passed to `LiveboardEmbed` are respected by Insight Tiles. When a runtime filter is applied, Spotter automatically regenerates the tile's insights using the filtered data context. - -No additional configuration is required. Runtime filters specified via `runtimeFilters` in `LiveboardViewConfig` are automatically applied to all Insight Tiles on the same Liveboard. - -[source,JavaScript] ----- -const liveboardEmbed = new LiveboardEmbed(document.getElementById('ts-embed'), { - frameParams: { width: '100%', height: '100%' }, - liveboardId: '', - runtimeFilters: [ - { - columnName: 'Region', - operator: RuntimeFilterOp.EQ, - values: ['West'], - }, - ], - spotterViz: { - brandName: 'Acme Analytics', - }, -}); - -liveboardEmbed.render(); ----- - -For more information, see xref:runtime-filter.adoc[Runtime filters]. - -== Related topics - -* xref:embed-spotter.adoc[Embed Spotter] -* xref:embed-pinboard.adoc[Embed a Liveboard] -* xref:runtime-filter.adoc[Runtime filters] -* xref:api-changelog.adoc[Visual Embed SDK changelog] -* xref:whats-new.adoc[What's new] diff --git a/modules/ROOT/pages/embed-spotterViz.adoc b/modules/ROOT/pages/embed-spotterViz.adoc new file mode 100644 index 000000000..533026fbe --- /dev/null +++ b/modules/ROOT/pages/embed-spotterViz.adoc @@ -0,0 +1,485 @@ += SpotterViz agent in Liveboards +:toc: true +:toclevels: 2 + +:page-title: SpotterViz agent in Liveboards +:page-pageid: spotterViz-agent +:page-description: Customize the SpotterViz panel in embedded Liveboards using the Visual Embed SDK. + +The SpotterViz panel is supported in Liveboards embedded using `LiveboardEmbed` or `AppEmbed` components. ThoughtSpot link:https://docs.thoughtspot.com/cloud/26.6.0.cl/spotter-viz[SpotterViz, window=_blank] is the AI-powered analysis panel that appears when a user opens the Liveboard in the edit mode. It provides Liveboard users with an in-context AI assistant and a prompt interface to ask questions on Liveboard data and receive automatically generated visualizations and insights in response. + +[NOTE] +==== +* SpotterViz is an early access feature and is disabled by default on ThoughtSpot instances. To enable this feature on your instance, contact ThoughtSpot Support. +* The SpotterViz panel in Liveboard embedding is supported in Visual Embed SDK v1.50.0 and ThoughtSpot instances with 26.7.0.cl or later versions only. +==== + +== Before you begin +* Ensure that the Spotter feature is enabled on your ThoughtSpot instance. +* Ensure that the SpotterViz feature is enabled on your instance. Contact your ThoughtSpot administrator if SpotterViz is not enabled. + +== Accessing SpotterViz panel +If the SpotterViz feature is enabled on the instance, the panel is displayed by default when a Liveboard is opened in the edit mode in the embedded view. + +[.bordered] +[.widthAuto] +-- +image::./images/spotterviz-embed-mode.png[SpotterViz in embed view] +-- + +To disable or hide SpotterViz in embedded view, use the `Action.SpotterViz` action ID in the `disabledActions` or `hiddenActions` array. + + +== Customizing the SpotterViz panel contents +For SpotterViz panel customization, pass the `spotterViz` configuration object with the following properties as needed: + +Brand name:: +To replace the default **SpotterViz** label with your product or assistant name, specify the brand name string in `brandName`. + +Greeting headline:: Customize the greeting prefix displayed before the brand name using `brandHeadline`. For example, setting `brandHeadline: "Hi there! I'm"` combined with `brandName: "Dashboard Builder"` renders as "Hi there! I'm Dashboard Builder". + +Description:: Use `description` to include your custom description text below the greeting. This helps users understand what the AI assistant can do. + +Input placeholder:: Use `inputChatPlaceholder` to customize the placeholder text shown in the chat input box when it is empty. By default, this text is displayed as "Let me help you build this Liveboard". + +Starter prompts:: +SpotterViz displays the question suggestions in the panel to help users begin an AI-assisted analysis. Each prompt has a short display label (`displayText`) and a full prompt string (`fullPrompt`) sent to Spotter when clicked. + +* To hide starter prompts, set `hideStarterPrompts` to `true`. +* To customize the starter prompt text, use `customStarterPrompts`. The `customStarterPrompts` includes the following attributes: +** `id`. __String__. Unique identifier for the prompt. +** `displayText`. __String__. Short label shown to the user as a clickable suggestion chip. +** `fullPrompt`. __String__. Full prompt text sent to Spotter when the user clicks the suggestion. ++ +For example, you can set the display text as `displayText: 'Regional breakdown'` and `fullPrompt` to `Show me revenue broken down by region`. + +Button and other interface elements:: +The SpotterViz panel displays the restore button on checkpoint cards and thumbs up and down feedback buttons by default. To disable or hide these elements, use the following action IDs in the SDK: +* `Action.SpotterVizCheckpointRestore` +* `Action.SpotterVizFeedback` + +=== SpotterViz in Liveboard embedding +[source,javascript] +---- +import { + LiveboardEmbed, + AuthType, + init, + SpotterVizConfig +} from '@thoughtspot/visual-embed-sdk'; + +init({ + thoughtSpotHost: 'https://', //Replace with your ThoughtSpot instance URL + authType: AuthType.None, +}); + +const embed = new LiveboardEmbed('#embed-container', { + liveboardId: '', // Replace with your Liveboard ID + spotterViz: { + brandName: 'Dashboard Builder', + brandHeadline: "Hi there! I'm", + description: 'Ask me anything about your data.', + inputChatPlaceholder: 'Ask a question...', + hideStarterPrompts: false, + customStarterPrompts: [ + { + id: '1', + displayText: 'Top products', + fullPrompt: 'What are the top 10 products by revenue this quarter?', + }, + { + id: '2', + displayText: 'Regional breakdown', + fullPrompt: 'Show me revenue broken down by region.', + }, + ], + }, + hideActions: [Action.SpotterVizCheckpointRestore], +}); +embed.render(); +---- + +=== SpotterViz in full application embedding + +[source,javascript] +---- +import { + AppEmbed, + AuthType, + init, + SpotterVizConfig +} from '@thoughtspot/visual-embed-sdk'; + +init({ + thoughtSpotHost: 'https://.thoughtspot.cloud', + authType: AuthType.TrustedAuthTokenCookieless, + getAuthToken: () => fetch('/api/ts-token').then(r => r.json()).then(d => d.token), +}); + +const embed = new AppEmbed('#embed-container', { + pageId: Page.Liveboards, + spotterViz: { + brandName: 'Dashboard Builder', + description: 'Explore your data with AI.', + hideStarterPrompts: true, + }, + hideActions: [Action.SpotterVizCheckpointRestore] +}); + +embed.render(); +---- + +== Customizing the style and appearance +You can customize the visual appearance of the SpotterViz panel using CSS customization framework in the SDK. Use any of the following CSS variables in the `customizations` object of the `init()` call to customize the panel style and appearance. + +[IMPORTANT] +==== +CSS variable customizations applied in `init()` are scoped to the embedded ThoughtSpot application. Changes to SpotterViz variables affect only the SpotterViz panel and Liveboard edit toolbar. However, changes to other variables, such as `--ts-var-root-background`, affect the entire embedded application. Therefore, you must test the styling changes against all embedded components to avoid unintended visual side effects. +==== + +The following tables list all CSS variables available for customizing the SpotterViz panel. Variables are grouped by the UI area they control. + +=== Panel and layout + +[cols="2,3", options="header"] +|=== +| CSS variable | Description + +| `--ts-var-spotterviz-panel-background` +| Main background color of the SpotterViz panel. + +| `--ts-var-spotterviz-border-color` +| Shared border color used throughout SpotterViz. Controls the chat input box +border, user message border, header underline, left panel border, and +thinking step connector lines and dots. + +| `--ts-var-spotterviz-footer-text-color` +| Text color of the SpotterViz panel footer. +|=== + +=== Text colors + +[cols="2,3", options="header"] +|=== +| CSS variable | Description + +| `--ts-var-spotterviz-text-primary` +| Primary text color in the SpotterViz panel. Applied to the SpotterViz panel header, close icon, user message text, agent response text, thinking step headers, checkpoint "Liveboard updated" text, brand name and description, text in the empty state, starter prompt text, and upvote/downvote icons. + +| `--ts-var-spotterviz-text-secondary` +| Secondary text color in the SpotterViz panel. Applied to checkpoint version labels ("version N"), tool call display, and the copy action color on input/JSON/output panels. + +| `--ts-var-spotterviz-emptystate-spotterviz-color` +| Text color of the SpotterViz brand label shown in the empty state, displayed below the SpotterViz icon. +|=== + +=== Chat input + +[cols="2,3", options="header"] +|=== +| CSS variable | Description + +| `--ts-var-spotterviz-input-background` +| Background color of the chat input field. + +| `--ts-var-spotterviz-input-placeholder-color` +| Placeholder text color in the chat input field. + +| `--ts-var-spotterviz-input-cta-color` +| Color of the submit (CTA) button in the chat input field. + +| `--ts-var-spotterviz-input-cta-hover-color` +| Hover color of the submit (CTA) button in the chat input field. + +| `--ts-var-spotterviz-reference-icon-hover-background` +| Background color of the reference-mode toggle button in the chat input when it is in the unselected state and the user hovers over it. + +| `--ts-var-spotterviz-reference-icon-selected-color` +| Icon color for the reference-mode selected state. Applies to the toggle button when active and to the icon badge on referenced entity chips in the chat input. + +| `--ts-var-spotterviz-reference-icon-selected-background` +| Background color for the reference-mode selected state. Applies to the reference-mode toggle button when active and to the icon badge on referenced entity chips in the chat input. +|=== + +=== Starter prompts + +[cols="2,3", options="header"] +|=== +| CSS variable | Description + +| `--ts-var-spotterviz-prompt-card-background` +| Background color of the starter prompt suggestion cards. + +| `--ts-var-spotterviz-prompt-card-hover-background` +| Background color of starter prompt suggestion cards on hover. + +|=== + +=== User messages +[cols="2,3", options="header"] +|=== +| CSS variable | Description + +| `--ts-var-spotterviz-message-background` +| Background color of the user's chat message bubbles. + +| `--ts-var-spotterviz-usermessage-icon-hover` +| Hover color of the expand button on user chat message bubbles. + +| `--ts-var-spotterviz-usermessage-icon-background` +| Background color of the expand button on user chat message bubbles. + +|=== + +=== Thinking and progress states + +[cols="2,3", options="header"] +|=== +| CSS variable | Description + +| `--ts-var-spotterviz-thinking-inprogress-header-color` +| Color of the thinking step header text while the agent is still working. + +| `--ts-var-spotterviz-thinking-completed-header-color` +| Color of the thinking step header text once the step is complete. Also +applied to the arrow icon on the "work done" state. + +| `--ts-var-spotterviz-thinking-work-done-icon-color` +| Color of the final completion indicator icon (the green circle) shown +when all agent work is done. + +| `--ts-var-spotterviz-thinking-cta-hover-background` +| Hover background color for the working/work done CTA element. +|=== + +=== Tool calls + +[cols="2,3", options="header"] +|=== +| CSS variable | Description + +| `--ts-var-spotterviz-tool-call-background` +| Background color of tool call panels. + +| `--ts-var-spotterviz-tool-title-color` +| Color of tool titles and icons inside tool call panels. + +| `--ts-var-spotterviz-tool-border-color` +| Border color of tool call panels. + +| `--ts-var-spotterviz-tool-json-input-background` +| Background color of the JSON input/output panel inside a tool call. + +| `--ts-var-spotterviz-tool-json-input-color` +| Text color of the JSON input/output panel inside a tool call. + +| `--ts-var-spotterviz-tool-feedback-button-background` +| Background color of the upvote/downvote feedback buttons. + +| `--ts-var-spotterviz-tool-feedback-button-hover` +| Hover background color of the upvote/downvote feedback buttons. + +|=== + +=== Checkpoints + +[cols="2,3", options="header"] +|=== +| CSS variable | Description +| `--ts-var-spotterviz-last-checkpoint-background` +| Background color of the last checkpoint summary section. +| `--ts-var-spotterviz-last-checkpoint-border` +| Border color of the last checkpoint summary section. +|=== + +=== Liveboard edit toolbar + +The Liveboard edit toolbar hosts the SpotterViz trigger button and other Liveboard editing controls. You can customize it independently from the SpotterViz panel itself. + +[cols="2,3", options="header"] +|=== +| CSS variable | Description + +| `--ts-var-liveboard-edit-toolbar-border` +| Border color of the Liveboard edit header toolbar. + +| `--ts-var-liveboard-edit-toolbar-selected-background` +| Background color of the selected (active) section in the Liveboard edit header toolbar. + +| `--ts-var-liveboard-edit-toolbar-selected-text-color` +| Text color of the selected section in the Liveboard edit header toolbar. Also applied to the Add button and toolbar icons in the selected state. + +| `--ts-var-liveboard-edit-toolbar-text` +| Text color of unselected items in the Liveboard edit header toolbar. Also applied to the Add button and toolbar icons in the unselected state. + +| `--ts-var-liveboard-edit-toolbar-hover-background` +| Hover background color of unselected items in the Liveboard edit header +toolbar. Also applied to the Add button and toolbar icons on hover. + +| `--ts-var-liveboard-edit-toolbar-hover-text-color` +| Hover text color of unselected items in the Liveboard edit header toolbar. + +|=== + +=== Apply CSS variable customizations + +Pass CSS variables using the `customCSSVariables` map inside the +`customizations.style` object of the `init()` call. + +// SOURCE: https://github.com/thoughtspot/visual-embed-sdk/blob/master/src/css-variables.ts + +[source,javascript] +---- +import { + LiveboardEmbed, + AuthType, + init, +} from '@thoughtspot/visual-embed-sdk'; + +init({ + thoughtSpotHost: 'https://.thoughtspot.cloud', + authType: AuthType.TrustedAuthTokenCookieless, + getAuthToken: () => fetch('/api/ts-token').then(r => r.json()).then(d => d.token), + customizations: { + style: { + customCSSVariables: { + // Panel and layout + '--ts-var-spotterviz-panel-background': '#1a1a2e', + '--ts-var-spotterviz-border-color': '#3a3a5c', + '--ts-var-spotterviz-footer-text-color': '#a0a0c0', + + // Text colors + '--ts-var-spotterviz-text-primary': '#ffffff', + '--ts-var-spotterviz-text-secondary': '#a0a0c0', + '--ts-var-spotterviz-emptystate-spotterviz-color': '#8080b0', + + // Chat input + '--ts-var-spotterviz-input-background': '#16213e', + '--ts-var-spotterviz-input-placeholder-color': '#606080', + '--ts-var-spotterviz-input-cta-color': '#6c63ff', + '--ts-var-spotterviz-input-cta-hover-color': '#8a84ff', + + // Starter prompts + '--ts-var-spotterviz-prompt-card-background': '#0f3460', + '--ts-var-spotterviz-prompt-card-hover-background': '#1a4a7a', + + // User messages + '--ts-var-spotterviz-message-background': '#0f3460', + + // Thinking / progress states + '--ts-var-spotterviz-thinking-inprogress-header-color': '#a0a0ff', + '--ts-var-spotterviz-thinking-completed-header-color': '#4caf50', + '--ts-var-spotterviz-thinking-work-done-icon-color': '#4caf50', + '--ts-var-spotterviz-thinking-cta-hover-background': '#2a2a4e', + + // Tool calls + '--ts-var-spotterviz-tool-call-background': '#12122a', + '--ts-var-spotterviz-tool-title-color': '#c0c0ff', + '--ts-var-spotterviz-tool-border-color': '#3a3a5c', + '--ts-var-spotterviz-tool-json-input-background': '#0d0d1a', + '--ts-var-spotterviz-tool-json-input-color': '#c0ffc0', + '--ts-var-spotterviz-tool-feedback-button-background': '#2a2a4e', + '--ts-var-spotterviz-tool-feedback-button-hover': '#3a3a6e', + + // Checkpoints + '--ts-var-spotterviz-last-checkpoint-background': '#1a2a3e', + '--ts-var-spotterviz-last-checkpoint-border': '#3a5a7c', + + // Liveboard edit toolbar + '--ts-var-liveboard-edit-toolbar-border': '#3a3a5c', + '--ts-var-liveboard-edit-toolbar-selected-background': '#6c63ff', + '--ts-var-liveboard-edit-toolbar-selected-text-color': '#ffffff', + '--ts-var-liveboard-edit-toolbar-text': '#a0a0c0', + '--ts-var-liveboard-edit-toolbar-hover-background': '#2a2a4e', + '--ts-var-liveboard-edit-toolbar-hover-text-color': '#ffffff', + }, + }, + }, +}); +---- + +=== SpotterViz button customization +The SpotterViz trigger button renders in the Liveboard edit toolbar. You can customize it in two ways: + +Button icon:: +The SpotterViz button uses the `rd-icon-spotter-viz` icon from the icon sprite. To replace it with a custom icon, set the `iconSpriteUrl` property in your `customizations` object pointing to a sprite that includes the `rd-icon-spotter-viz` icon ID. +For more information, see xref:customize-icons.adoc[Customize icons]. + +Button text:: +The button label follows the `brandName` value you set in the `spotterViz` configuration object. Setting `brandName` in your embed configuration automatically updates the button text to match, keeping your custom brand name consistent across the panel and the toolbar button. + +Button colors:: +Use the `--ts-var-liveboard-edit-toolbar-*` variables described in the <<_liveboard_edit_toolbar,Liveboard edit toolbar>> table above to control the button's background, text, and hover colors in both the selected and unselected states. + +== Customizing app interactions +The following embed events are emitted by the SpotterViz panel. + +* `EmbedEvent.SpotterVizCheckpointCreated` + +Emitted when a checkpoint is created in the SpotterViz panel. +* `EmbedEvent.SpotterVizCheckpointRestored` + +Emitted when a checkpoint is restored in the SpotterViz panel. +* `EmbedEvent.SpotterVizClosed` + +Emitted when the SpotterViz panel is closed. +* `EmbedEvent.SpotterVizError` + +Emitted when an error occurs in the SpotterViz panel. +* `EmbedEvent.SpotterVizInit` + +Emitted when the SpotterViz panel mounts in embed mode. +* `EmbedEvent.SpotterVizQueryTriggered` + +Emitted when the user submits a prompt in the SpotterViz panel. +* `EmbedEvent.SpotterVizResponseComplete` + +Emitted when the SpotterViz response ends. + +[source,javascript] +---- +liveboardEmbed.on(EmbedEvent.SpotterVizInit, (payload) => { + console.log('SpotterViz initialized', payload); + // payload: { liveboardId: string } +}); + +liveboardEmbed.on(EmbedEvent.SpotterVizError, (payload) => { + console.log('SpotterViz error', payload); +}); + +liveboardEmbed.on(EmbedEvent.SpotterVizQueryTriggered, (payload) => { + console.log('SpotterViz query triggered', payload); + // payload: { query: string, sessionId: string } +}); + +liveboardEmbed.on(EmbedEvent.SpotterVizResponseComplete, (payload) => { + console.log('SpotterViz response complete', payload); + // payload: { sessionId: string, messageId: string } +}); +---- + +The following host events can be configured for automating workflows: + +* `HostEvent.InitSpotterVizConversation` + +Initializes a new SpotterViz conversation. +* `HostEvent.SpotterVizSendUserMessage` + +Sends a prompt to the SpotterViz panel. + +[source,javascript] +---- +liveboardEmbed.trigger(HostEvent.InitSpotterVizConversation); +liveboardEmbed.trigger(HostEvent.SpotterVizSendUserMessage, { + query: 'Show me revenue by region', +}); +---- + +//// +[#runtime-filters] +== Runtime filters and insight tiles +Runtime filters and parameters passed to `LiveboardEmbed` are in SpotterViz-generated insight tiles. When a runtime filter is applied, Spotter automatically regenerates the tile's insights using the filtered data context. + +No additional configuration is required. Runtime filters specified via `runtimeFilters` in `LiveboardViewConfig` are automatically applied to all Insight Tiles on the same Liveboard. +//// + +== Additional resources + +See the following documentation for additional information about embedding Liveboards and customizing Liveboard experience: + +* xref:embed-liveboard.adoc[Embed a Liveboard] +* xref:full-embed.adoc[Embed full ThoughtSpot experience] +* xref:embed-events.adoc[Embed events reference] +* xref:host-events.adoc[Host events reference] +* xref:SpotterVizConfig.adoc[SpotterVizConfig interface] diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 8eb540dc8..27e192c4d 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -32,23 +32,12 @@ a| *Version 26.7.0.cl* a| - [discrete] ==== SpotterViz for Liveboards [.version-badge.new]#New# -You can now use SpotterViz in your embedding application to help your users build and edit Liveboards through a conversational interface. Instead of manually configuring charts and layouts, your users describe what they want in natural language, and SpotterViz generates the Liveboard for them, including new tabs, chart types, styling, data filters, and scheduled deliveries. - -SpotterViz customization:: -The Visual Embed SDK also provides several customization options in the xref:SpotterVizConfig.adoc[SpotterVizConfig] and xref:SpotterVizStarterPrompt.adoc[SpotterVizStarterPrompt] interfaces to customize the SpotterViz panel experience. +You can now use SpotterViz in your embedding application to help your users build and edit Liveboards through a conversational interface. Instead of manually configuring charts and layouts, your users can describe what they want and SpotterViz generates the Liveboard for them, including the new tabs, chart types, data filters, and scheduled deliveries. -Insight tiles in Liveboards:: -When SpotterViz is enabled, your application users can add and configure the **Insight tile** for automated textual analysis of the data on your Liveboard. For example, you can specify a prompt or context that defines what the tile should analyze. +For SpotterViz customization in embedded view, the Visual Embed SDK also provides several options to customize the SpotterViz panel experience. For more information, see xref:embed-spotterViz.adoc[SpotterViz in embedded Liveboards]. -For more information, see xref:embed-spotterViz.adoc[Customizing SpotterViz]. - -[NOTE] -==== -SpotterViz is an Early Access feature and is available to users with edit permissions on a Liveboard. -==== --- [discrete] @@ -71,75 +60,37 @@ In full application embedding, when the V3 navigation and home page experience i [NOTE] ==== -The focussed homepage experience is in beta and disabled by default. To enable this experience in your embedding application, the feature must be enabled on your ThoughtSpot instance and in the Visual Embed SDK. +The focused homepage experience is in beta and disabled by default. To enable this experience in your embedding application, the feature must be enabled on your ThoughtSpot instance and in the Visual Embed SDK. ==== --- [discrete] -==== Centralized Webhooks page [.version-badge.new]#New# - -[earlyAccess earlyAccessBackground]^Early Access^ -The *Develop* tab now includes a dedicated *Webhooks* page for creating, managing, and -monitoring all webhooks in your ThoughtSpot Org from one place. +==== Webhooks enhancements [.version-badge.new]#New# -Key capabilities include: +ThoughtSpot introduces the following features and enhancements for webhook configuration and management: -* *Webhooks tab* — A paginated table listing all Org webhooks with columns for name, event -type, delivery status, state, author, and timestamps. Supports sorting, filtering, bulk -selection, and row-level actions including edit, delete, test, and enable/disable. -* *Enable and disable webhooks* — Activate or deactivate a webhook without deleting it, using -the state toggle on the table row or the bulk actions bar. -* *Stats cards* — Four metric cards at the top of the page show Delivery Rate, Delivered -count, Failed count, and retry queue size across all Org webhooks. Stats refresh every 30 -seconds. -* *Logs tab* — Delivery attempt history with status badges, event type, attempt count, and -error messages. A details modal shows the full payload, response headers, and retry history. -Logs are retained for 3 days. -* *Create/Edit webhook modal* — A unified form covering authentication (No Auth, API Key, -Basic Auth, Bearer Token, OAuth 2.0 client credentials), optional cloud storage destination -(AWS S3 or GCP GCS), signature verification, custom headers, and URL parameters. -* *Test event* — Send a one-click test payload to verify endpoint connectivity, with -categorized feedback for auth errors, timeouts, and 4xx/5xx responses. +* Centralized Webhooks page [.version-badge.new]#New# + +The *Develop* tab now includes a dedicated *Webhooks* page for creating, managing, and +monitoring webhooks within the Org context. For more information, see xref:webhooks-ux.adoc[Webhooks UI]. +* Retrieve storage configuration + +The `GET /api/rest/2.0/webhooks/storage-config` REST API endpoint to xref:webhooks-api.adoc#_retrieving_storage_information_for_webhook_configuration[get storage configuration details]. +* GCS storage destination configuration for webhook delivery + +Administrators can now xref:webhooks-gcs-storage.adoc[configure Google Cloud Storage (GCS) buckets as a storage destination] for webhook payload delivery on GCP-hosted ThoughtSpot clusters. +* Webhook activation and deactivation + +You can enable or disable a webhook in the UI or through REST API. +* Selective configuration reset + +The update webhook API now supports a `reset_options` parameter, which removes specific optional configuration sections (`AUTHENTICATION`, `SIGNATURE_VERIFICATION`, or `STORAGE_DESTINATION`) from a webhook without replacing the full configuration. -For more information, see xref:webhooks-manage.adoc[Manage webhooks] and -xref:webhooks.adoc[Webhooks overview]. --- - - [discrete] ==== Liveboard browser cache refresh — Early Access [.version-badge.new]#New# - -// SOURCE: SCAL-305659 - The Liveboard browser cache feature is now in Early Access. When `enableLiveboardDataCache` is set to `true` in your `LiveboardEmbed` configuration, ThoughtSpot caches Liveboard visualization data in the browser to significantly reduce reload times on revisit. For SDK event and action IDs, see the xref:api-changelog.adoc#_liveboard_browser_cache_refresh[Visual Embed changelog — Liveboard browser cache refresh]. ---- - - -[discrete] -==== Webhooks enhancements [.version-badge.new]#New# - -ThoughtSpot 26.7.0.cl introduces several enhancements to the Webhooks REST API and the Webhooks page in the Developer tab. - -* **Retrieve storage configuration** — A new `GET /api/rest/2.0/webhooks/storage-config` endpoint returns the AWS ARN or GCP service account details that administrators need to configure cross-account storage access. For more information, see xref:webhooks-api.adoc#_retrieving_storage_information_for_webhook_configuration[Webhooks API documentation]. -* **GCS bucket storage destination** — Webhook payloads can now be delivered directly to a Google Cloud Storage (GCS) bucket on GCP-hosted instances. Specify `storage_type: GCP_GCS` with a `gcp_gcs_config` object in the `storage_destination` parameter. For more information, see xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery]. -* **Enable and disable webhooks** — The create, update, and search webhook APIs now support a `status` parameter (`ENABLED` or `DISABLED`), letting you activate or deactivate webhooks without deleting them. The Webhooks page in the Developer tab also surfaces the webhook status with a toggle. -* **Selective configuration reset** — The update webhook API now supports a `reset_options` parameter, which removes specific optional configuration sections (`AUTHENTICATION`, `SIGNATURE_VERIFICATION`, or `STORAGE_DESTINATION`) from a webhook without replacing the full configuration. - -//// -[discrete] -==== GCS storage integration for webhook delivery [.version-badge.new]#New# - -Administratos can now configure Google Cloud Storage (GCS) buckets can now be configured as a storage destination for webhook payload delivery on GCP-hosted ThoughtSpot clusters. This extends the existing Amazon S3 webhook storage integration to bring GCS parity for GCP environments. - -A storage config API endpoint returns the GCP Service Account details required to configure IAM permissions on your GCS bucket. - --- -//// [discrete] ==== Saved Chat public APIs [.version-badge.new]#New# @@ -170,12 +121,11 @@ For information about REST API v2 enhancements in this release, see the xref:res ==== Visual Embed SDK [.version-badge.breaking]#Breaking# The Visual Embed SDK version 1.50.0 includes several new features, enhancements, and a breaking change. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. -⚠️ *Breaking change*: `EmbedEvent.SpotterData` has been removed. This event was never emitted in Spotter 3 and was superseded by `EmbedEvent.PreviewSpotterData`. Update your integration code to use `EmbedEvent.PreviewSpotterData`. +⚠️*Breaking change*: `EmbedEvent.SpotterData` has been removed. Update your integration code to use `EmbedEvent.PreviewSpotterData`. +--- |===== - - == June 2026 **Release version**: ThoughtSpot Cloud 26.6.0.cl + @@ -241,75 +191,6 @@ This release introduces new API endpoints for Spotter, connections and trusted a |===== - - - - -== June 2026 - -**Release version**: ThoughtSpot Cloud 26.6.0.cl + -*Upgrade notes*: No breaking changes. + -*Recommended SDK versions*: Visual Embed SDK v1.49.0 and later - -[.cl-table, cols="2,4", frame=none, grid=none] -|===== -a| -[.cl-label] -*Version 26.6.0.cl* - -a| -[discrete] -==== Chart and table overrides [.version-badge.new]#New# -You can now apply visualization overrides to charts and tables generated from a search query in ThoughtSpot search and full application embedding. The `visualOverrides` property in `SearchViewConfig` and `AppViewConfig` allows developers to apply at the embed initialization time: - -* Chart overrides + -Control legend visibility and position, data label display and per-column filter -thresholds, regression lines, grid lines, axis range and label settings, series -colors, and conditional formatting rules including font and background styling. -* Table overrides + -Control column visibility, text wrapping, row height and padding density, table -theme, and column summary visibility with per-column exceptions. - -For more information, see xref:viz-overrides.adoc[Configuring visualization overrides]. - ---- - -[discrete] -==== Spotter AI and embedding enhancements [.version-badge.new]#New# - -This release introduces the following enhancements for Spotter AI workflows and embedded Spotter applications. - -* Spotter embedding: + -Spotter now includes data literacy skills that help users understand the underlying data model. Users can ask Spotter to explain available data sources, fields, and relationships in plain language within a conversation session. -* Spotter AI APIs: + -//** New REST API endpoints to configure and retrieve persistent behavioral xref:spotter-agent-instructions.adoc[instructions for the Spotter agent]. - New API endpoint xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[stop and cancel a long-running Spotter response]. - ---- - -[discrete] -==== Developer page enhancements -The **Develop** page in the ThoughtSpot UI has been updated with the following enhancements: - -* The **Custom actions** list page now shows the code-based custom actions configured using the Visual Embed SDK. -* Removal of REST API v1 + -The legacy REST Playground v1 has been removed from the left navigation. This change does not affect your current integrations with v1 REST API. ThoughtSpot recommends that you update your integration workflows to use REST API v2. For more information, see xref:rest-api-v1v2-comparison.adoc[REST API v1 to v2 migration]. -* Removal of GraphQL playgrounds + -The menu link to the GraphQL playground has been removed from the UI. - -[discrete] -==== Visual Embed SDK -The Visual Embed SDK version 1.49.0 includes several new features and enhancements. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. - ---- - -[discrete] -==== REST API v2 -This release introduces new API endpoints for Spotter, connections and trusted authentication. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. - -|===== - - == May 2026 **Release version**: ThoughtSpot Cloud 26.5.0.cl + @@ -773,11 +654,6 @@ For information about the new features and enhancements introduced in Visual Emb --- -[discrete] -==== Custom calendar APIs - ---- - [discrete] ==== REST API For information about REST API v2 enhancements, see xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. diff --git a/static/doc-images/images/spotterviz-embed-mode.png b/static/doc-images/images/spotterviz-embed-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..7123fdda7188d2f13b86942a1a207f438fea5562 GIT binary patch literal 314465 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�_;Mt-Nqm2) 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�D87156N;9;5IJQL58Y^;qK_AofoLiq4PB{VbaF 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
}#Uk(qTks+@MK98PQ9QX;Zs*c2o~>m9|; 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�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 z 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 literal 0 HcmV?d00001 From 96c57a7f6d64cba01f248f787eaac25b901d3cd2 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 29 Jun 2026 18:03:56 +0530 Subject: [PATCH 065/136] changelog update --- modules/ROOT/pages/common/nav-embedding.adoc | 2 +- modules/ROOT/pages/embed-spotterViz.adoc | 2 +- modules/ROOT/pages/rest-apiv2-changelog.adoc | 39 +++++++++++++------- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc index 167815fd9..00bc3d977 100644 --- a/modules/ROOT/pages/common/nav-embedding.adoc +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -15,7 +15,7 @@ Embed ThoughtSpot in a web app * link:{{navprefix}}/embed-liveboard[Embed Analytics] ** link:{{navprefix}}/embed-liveboard[Embed a Liveboard] ** link:{{navprefix}}/embed-a-viz[Embed a visualization] -** link:{{navprefix}}/spotterViz-agent[SpotterViz agent in Liveboards] +** link:{{navprefix}}/spotterViz-agent[SpotterViz AI agent in Liveboards] * link:{{navprefix}}/full-embed[Embed full application] ** link:{{navprefix}}/full-app-customize[Customize your embed] ** link:{{navprefix}}/customize-nav-controls[Customize navigation panels] diff --git a/modules/ROOT/pages/embed-spotterViz.adoc b/modules/ROOT/pages/embed-spotterViz.adoc index 533026fbe..994858f29 100644 --- a/modules/ROOT/pages/embed-spotterViz.adoc +++ b/modules/ROOT/pages/embed-spotterViz.adoc @@ -1,4 +1,4 @@ -= SpotterViz agent in Liveboards += SpotterViz AI agent in Liveboards :toc: true :toclevels: 2 diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index b1da5b337..c76f94fee 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -10,24 +10,21 @@ This changelog lists the features and enhancements introduced in REST API v2.0. == Version 26.7.0.cl, July 2026 - === Spotter AI APIs -// TODO: verify with engineering — are agent instructions APIs and stop-response endpoint -// (first documented in 26.6.0.cl) GA or still in beta/EA in 26.7.0.cl? -// If they are promoted to GA in 26.7.0.cl, add a GA promotion note here. - -The Spotter agent instructions APIs and the stop-response endpoint introduced in xref:rest-apiv2-changelog.adoc#_version_26_6_0_cl_june_2026[26.6.0.cl] are generally available in this release. -// TODO: confirm GA status above with engineering - -For the complete list of Spotter REST API v2 endpoints, see xref:spotter-agent-apis.adoc[Spotter Agent APIs]. +Save chat AI APIs:: +ThoughtSpot introduces the following REST API endpoints and enhancements to manage saved Spotter conversations programmatically. These endpoints allow you to build custom conversation history interfaces in embedded applications without using the native Spotter UI. -=== Webhook APIs -The `GET /api/rest/2.0/webhooks/storage-config` API endpoint allows retrieving the storage setup information required for configuring a GCS or S3 storage destination for webhook delivery. +* `POST /api/rest/2.0/ai/agent/conversation/create` + +This API endpoint is modified to allow users to save conversations by setting `enable_save_chat: true` in the API request. +* `GET /api/rest/2.0/ai/agent/conversations` + +Returns a paginated list of saved Spotter conversations for the authenticated user. -== Version 26.6.0.cl, June 2026 +* `POST /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/update` + +Updates the display title of a saved conversation. -=== Spotter AI APIs +* `DELETE /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/delete` + +Deletes a saved conversation and all its associated messages. Agent instructions APIs:: The following new API endpoints allow you to set and retrieve persistent behavioral instructions for the Spotter agent. @@ -38,9 +35,23 @@ Sets behavioral instructions for the Spotter agent. Use this endpoint to define * `GET /api/rest/2.0/ai/agent/instructions/get` + Retrieves the behavioral instructions currently configured by the administrator for the Spotter agent. -+ For more information, see xref:spotter-agent-instructions.adoc[Spotter AI Agent instructions APIs]. +=== Webhook APIs +The `GET /api/rest/2.0/webhooks/storage-config` API endpoint allows retrieving the storage setup information required for configuring a GCS or S3 storage destination for webhook delivery. + +=== Style customization APIs + +ThoughtSpot introduces new public REST API v2.0 endpoints for programmatic style customization. These APIs allow embedding applications to upload custom fonts and configure visual styles at the cluster or Org level without using the ThoughtSpot Admin UI. + +=== Manual Translation APIs +The manual translation APIs are now public in REST API v2.0. These endpoints allow +you to programmatically import, export, and delete manual translations for ThoughtSpot content. The import endpoint has been enhanced to support both inserting new translations and updating existing ones in the same request. + +== Version 26.6.0.cl, June 2026 + +=== Spotter AI APIs + Stop in-progress agent response:: * `POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response` + From 66ff3168e85e485edf64b24cc158cf65e6a5df1e Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 29 Jun 2026 20:18:05 +0530 Subject: [PATCH 066/136] review edits spotterviz --- modules/ROOT/pages/embed-spotterViz.adoc | 31 ++++++++++--------- modules/ROOT/pages/rest-apiv2-changelog.adoc | 2 ++ .../ROOT/pages/saved-conversations-api.adoc | 2 +- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/modules/ROOT/pages/embed-spotterViz.adoc b/modules/ROOT/pages/embed-spotterViz.adoc index 994858f29..a43bb1bda 100644 --- a/modules/ROOT/pages/embed-spotterViz.adoc +++ b/modules/ROOT/pages/embed-spotterViz.adoc @@ -29,7 +29,6 @@ image::./images/spotterviz-embed-mode.png[SpotterViz in embed view] To disable or hide SpotterViz in embedded view, use the `Action.SpotterViz` action ID in the `disabledActions` or `hiddenActions` array. - == Customizing the SpotterViz panel contents For SpotterViz panel customization, pass the `spotterViz` configuration object with the following properties as needed: @@ -47,7 +46,7 @@ SpotterViz displays the question suggestions in the panel to help users begin an * To hide starter prompts, set `hideStarterPrompts` to `true`. * To customize the starter prompt text, use `customStarterPrompts`. The `customStarterPrompts` includes the following attributes: -** `id`. __String__. Unique identifier for the prompt. +** `id`. __String__. Unique identifier for the prompt within the `customStarterPrompts` array. We recommend setting the ID to values such as `'1'`, `'2'`, and `'3'`. ** `displayText`. __String__. Short label shown to the user as a clickable suggestion chip. ** `fullPrompt`. __String__. Full prompt text sent to Spotter when the user clicks the suggestion. + @@ -141,12 +140,12 @@ The following tables list all CSS variables available for customizing the Spotte === Panel and layout -[cols="2,3", options="header"] +[cols="3,3", options="header"] |=== | CSS variable | Description | `--ts-var-spotterviz-panel-background` -| Main background color of the SpotterViz panel. +| Background color of the SpotterViz panel. | `--ts-var-spotterviz-border-color` | Shared border color used throughout SpotterViz. Controls the chat input box @@ -159,7 +158,7 @@ thinking step connector lines and dots. === Text colors -[cols="2,3", options="header"] +[cols="3,3", options="header"] |=== | CSS variable | Description @@ -175,7 +174,7 @@ thinking step connector lines and dots. === Chat input -[cols="2,3", options="header"] +[cols="3,3", options="header"] |=== | CSS variable | Description @@ -203,7 +202,7 @@ thinking step connector lines and dots. === Starter prompts -[cols="2,3", options="header"] +[cols="3,3", options="header"] |=== | CSS variable | Description @@ -216,7 +215,7 @@ thinking step connector lines and dots. |=== === User messages -[cols="2,3", options="header"] +[cols="3,3", options="header"] |=== | CSS variable | Description @@ -233,7 +232,7 @@ thinking step connector lines and dots. === Thinking and progress states -[cols="2,3", options="header"] +[cols="3,3", options="header"] |=== | CSS variable | Description @@ -254,7 +253,7 @@ when all agent work is done. === Tool calls -[cols="2,3", options="header"] +[cols="3,3", options="header"] |=== | CSS variable | Description @@ -283,7 +282,7 @@ when all agent work is done. === Checkpoints -[cols="2,3", options="header"] +[cols="3,3", options="header"] |=== | CSS variable | Description | `--ts-var-spotterviz-last-checkpoint-background` @@ -296,7 +295,7 @@ when all agent work is done. The Liveboard edit toolbar hosts the SpotterViz trigger button and other Liveboard editing controls. You can customize it independently from the SpotterViz panel itself. -[cols="2,3", options="header"] +[cols="3,3", options="header"] |=== | CSS variable | Description @@ -326,8 +325,6 @@ toolbar. Also applied to the Add button and toolbar icons on hover. Pass CSS variables using the `customCSSVariables` map inside the `customizations.style` object of the `init()` call. -// SOURCE: https://github.com/thoughtspot/visual-embed-sdk/blob/master/src/css-variables.ts - [source,javascript] ---- import { @@ -451,12 +448,16 @@ liveboardEmbed.on(EmbedEvent.SpotterVizResponseComplete, (payload) => { }); ---- -The following host events can be configured for automating workflows: +The following host events programmatically trigger workflows in embedded view: * `HostEvent.InitSpotterVizConversation` + Initializes a new SpotterViz conversation. * `HostEvent.SpotterVizSendUserMessage` + Sends a prompt to the SpotterViz panel. +* `HostEvent.OpenSpotterVizPanel` + +Opens the SpotterViz panel. +* `HostEvent.CloseSpotterVizPanel` + +Closes the SpotterViz panel. [source,javascript] ---- diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index c76f94fee..dcbdd2427 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -26,6 +26,8 @@ Updates the display title of a saved conversation. * `DELETE /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/delete` + Deletes a saved conversation and all its associated messages. +For more information, see xref:saved-conversations-api.adoc[Saving and managing Spotter AI chat]. + Agent instructions APIs:: The following new API endpoints allow you to set and retrieve persistent behavioral instructions for the Spotter agent. diff --git a/modules/ROOT/pages/saved-conversations-api.adoc b/modules/ROOT/pages/saved-conversations-api.adoc index b77e40238..da73d4e9c 100644 --- a/modules/ROOT/pages/saved-conversations-api.adoc +++ b/modules/ROOT/pages/saved-conversations-api.adoc @@ -1,4 +1,4 @@ -= Saved Chat public APIs += Saving and managing Spotter AI chat :toc: true :toclevels: 2 From 6899882d9592ea6a513509302c2d3dbdc42f928f Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 29 Jun 2026 20:42:39 +0530 Subject: [PATCH 067/136] issues from docs channel --- modules/ROOT/pages/data-report-v2-api.adoc | 12 ++++++------ modules/ROOT/pages/tml-api.adoc | 3 +-- modules/ROOT/pages/tml.adoc | 3 +-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index 196c8361d..f1c2682c2 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -18,11 +18,11 @@ ThoughtSpot provides the following REST API v2 endpoints to fetch data: The `/api/rest/2.0/searchdata` endpoint requires you to specify the data source object ID and a query string for a successful API call. You can also define additional parameters such as `runtime_filter`, `runtime_sort`, and `runtime_param_override` to apply runtime overrides on the data set. ==== Data source -To search data via API call, you require at least view access to the data source object. The data source object can be a Worksheet, View, or Table. +To search data via API call, you require at least view access to the data source object. The data source object can be a Model, View, or Table. -You can specify the data source object GUID in the `logical_table_identifier`. The search data endpoint doesn't support searching data from multiple Worksheets, Views, or Tables in a single API request. +You can specify the data source object GUID in the `logical_table_identifier`. The search data endpoint doesn't support searching data from multiple Models, Views, or Tables in a single API request. -To find the GUID of the Worksheet, View, or Table, use one of the following methods: +To find the GUID of the Model, View, or Table, use one of the following methods: Get data object GUID via API:: @@ -34,7 +34,7 @@ Send an API request to the `/api/rest/2.0/metadata/search` endpoint with the fol ---- "metadata": [ { - "identifier": "my_worksheet", + "identifier": "my_model", "type": "LOGICAL_TABLE" } ] @@ -51,7 +51,7 @@ Find the GUID of the data object via UI:: https:///#/data/tables/ ---- + -. On the **Data** > **Home** page, select the data object. For example, if the data source object is a Worksheet, click **Worksheets** and then open the Worksheet. +. On the **Data workspace** > **Data objects** page, select the data object. For example, if the data source object is a Model, click **Models** and then open the Model. . In the address bar of the web browser, note the GUID of the data source object. For example, in the following address string, the GUID is `9d93a6b8-ca3a-4146-a1a1-e908b71b963f`: + ---- @@ -634,7 +634,7 @@ For more information, see xref:runtime-filters.adoc#rtOperator[Supported runtime To add runtime Parameters, in the `runtime_param_override` property, add the `param1, and `paramVal1` parameters JSON key-value format. The Parameter value must be defined as per the data type. For example, `Date Param` and `Date List Param` Parameters, specify Epoch time as value. -To apply Parameter overrides on Liveboards and Answers, ensure that the Parameters are configured in the Worksheet used for generating Liveboard visualizations and Answer. +To apply Parameter overrides on Liveboards and Answers, ensure that the Parameters are configured in the Model used for generating Liveboard visualizations and Answer. [source,JSON] ---- diff --git a/modules/ROOT/pages/tml-api.adoc b/modules/ROOT/pages/tml-api.adoc index 9a149647a..3b90923c6 100644 --- a/modules/ROOT/pages/tml-api.adoc +++ b/modules/ROOT/pages/tml-api.adoc @@ -77,8 +77,7 @@ __Optional__ |__Boolean__. Skips Cloud Data Warehouse validation for table TML i |`skip_diff_check` + __Optional__ -a|__Boolean__. Skips diff check before processing TMLs for imports. + -When set to `true`, this attribute enables diff check to identify the objects that haven’t been changed since the last import or TML update. This feature eliminates importing redundant objects and helps optimize the import process. |`false` +a|__Boolean__. When set to `true`, skips the diff check before processing TML objects for import. By default, ThoughtSpot compares each TML object against its last imported version and skips objects that have not changed, which reduces unnecessary reimports. Set to `true` to bypass this check and reimport all objects regardless of whether they have changed.|`false` |==== === Example request diff --git a/modules/ROOT/pages/tml.adoc b/modules/ROOT/pages/tml.adoc index b971e964a..9ffba0d70 100644 --- a/modules/ROOT/pages/tml.adoc +++ b/modules/ROOT/pages/tml.adoc @@ -117,8 +117,7 @@ Imports objects that validate successfully and skips the objects that do not val |`skip_diff_check` + __Optional__ -|__Boolean__. Skips diff check before processing TMLs for imports. + -When set to `true`, this attribute enables diff check to identify the objects that haven’t been changed since the last import or TML update. This feature eliminates importing redundant objects and helps optimize the import process. |`false` +|__Boolean__. When set to `true`, skips the diff check before processing TML objects for import. By default, ThoughtSpot compares each TML object against its last imported version and skips objects that have not changed, which reduces unnecessary reimports. Set to `true` to bypass this check and reimport all objects regardless of whether they have changed. |`false` |`enable_large_metadata_validation` + __Optional__ |__Boolean__. Available from 10.5.0.cl. Enables validation for large metadata objects. Set to `true` if the database contains multiple thousands of tables. When enabled, it allows for schema validation of one table at a time and helps circumvent the metadata fetching limitations of the Cloud Data Warehouse (CDW). From 3f6a95e50912fc7186c76ec63e7334ae577025b8 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 29 Jun 2026 20:42:39 +0530 Subject: [PATCH 068/136] issues from docs channel --- modules/ROOT/pages/data-report-v2-api.adoc | 12 ++++++------ modules/ROOT/pages/tml-api.adoc | 3 +-- modules/ROOT/pages/tml.adoc | 3 +-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index 196c8361d..f1c2682c2 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -18,11 +18,11 @@ ThoughtSpot provides the following REST API v2 endpoints to fetch data: The `/api/rest/2.0/searchdata` endpoint requires you to specify the data source object ID and a query string for a successful API call. You can also define additional parameters such as `runtime_filter`, `runtime_sort`, and `runtime_param_override` to apply runtime overrides on the data set. ==== Data source -To search data via API call, you require at least view access to the data source object. The data source object can be a Worksheet, View, or Table. +To search data via API call, you require at least view access to the data source object. The data source object can be a Model, View, or Table. -You can specify the data source object GUID in the `logical_table_identifier`. The search data endpoint doesn't support searching data from multiple Worksheets, Views, or Tables in a single API request. +You can specify the data source object GUID in the `logical_table_identifier`. The search data endpoint doesn't support searching data from multiple Models, Views, or Tables in a single API request. -To find the GUID of the Worksheet, View, or Table, use one of the following methods: +To find the GUID of the Model, View, or Table, use one of the following methods: Get data object GUID via API:: @@ -34,7 +34,7 @@ Send an API request to the `/api/rest/2.0/metadata/search` endpoint with the fol ---- "metadata": [ { - "identifier": "my_worksheet", + "identifier": "my_model", "type": "LOGICAL_TABLE" } ] @@ -51,7 +51,7 @@ Find the GUID of the data object via UI:: https:///#/data/tables/ ---- + -. On the **Data** > **Home** page, select the data object. For example, if the data source object is a Worksheet, click **Worksheets** and then open the Worksheet. +. On the **Data workspace** > **Data objects** page, select the data object. For example, if the data source object is a Model, click **Models** and then open the Model. . In the address bar of the web browser, note the GUID of the data source object. For example, in the following address string, the GUID is `9d93a6b8-ca3a-4146-a1a1-e908b71b963f`: + ---- @@ -634,7 +634,7 @@ For more information, see xref:runtime-filters.adoc#rtOperator[Supported runtime To add runtime Parameters, in the `runtime_param_override` property, add the `param1, and `paramVal1` parameters JSON key-value format. The Parameter value must be defined as per the data type. For example, `Date Param` and `Date List Param` Parameters, specify Epoch time as value. -To apply Parameter overrides on Liveboards and Answers, ensure that the Parameters are configured in the Worksheet used for generating Liveboard visualizations and Answer. +To apply Parameter overrides on Liveboards and Answers, ensure that the Parameters are configured in the Model used for generating Liveboard visualizations and Answer. [source,JSON] ---- diff --git a/modules/ROOT/pages/tml-api.adoc b/modules/ROOT/pages/tml-api.adoc index 9a149647a..3b90923c6 100644 --- a/modules/ROOT/pages/tml-api.adoc +++ b/modules/ROOT/pages/tml-api.adoc @@ -77,8 +77,7 @@ __Optional__ |__Boolean__. Skips Cloud Data Warehouse validation for table TML i |`skip_diff_check` + __Optional__ -a|__Boolean__. Skips diff check before processing TMLs for imports. + -When set to `true`, this attribute enables diff check to identify the objects that haven’t been changed since the last import or TML update. This feature eliminates importing redundant objects and helps optimize the import process. |`false` +a|__Boolean__. When set to `true`, skips the diff check before processing TML objects for import. By default, ThoughtSpot compares each TML object against its last imported version and skips objects that have not changed, which reduces unnecessary reimports. Set to `true` to bypass this check and reimport all objects regardless of whether they have changed.|`false` |==== === Example request diff --git a/modules/ROOT/pages/tml.adoc b/modules/ROOT/pages/tml.adoc index b971e964a..9ffba0d70 100644 --- a/modules/ROOT/pages/tml.adoc +++ b/modules/ROOT/pages/tml.adoc @@ -117,8 +117,7 @@ Imports objects that validate successfully and skips the objects that do not val |`skip_diff_check` + __Optional__ -|__Boolean__. Skips diff check before processing TMLs for imports. + -When set to `true`, this attribute enables diff check to identify the objects that haven’t been changed since the last import or TML update. This feature eliminates importing redundant objects and helps optimize the import process. |`false` +|__Boolean__. When set to `true`, skips the diff check before processing TML objects for import. By default, ThoughtSpot compares each TML object against its last imported version and skips objects that have not changed, which reduces unnecessary reimports. Set to `true` to bypass this check and reimport all objects regardless of whether they have changed. |`false` |`enable_large_metadata_validation` + __Optional__ |__Boolean__. Available from 10.5.0.cl. Enables validation for large metadata objects. Set to `true` if the database contains multiple thousands of tables. When enabled, it allows for schema validation of one table at a time and helps circumvent the metadata fetching limitations of the Cloud Data Warehouse (CDW). From daccaebb142826a41b9626722882f22281914961 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 29 Jun 2026 23:07:25 +0530 Subject: [PATCH 069/136] edits --- modules/ROOT/pages/rest-apiv2-changelog.adoc | 41 +++++++++++++++---- modules/ROOT/pages/webhooks-comm-channel.adoc | 2 +- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index dcbdd2427..7c0f94ac1 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -17,14 +17,18 @@ ThoughtSpot introduces the following REST API endpoints and enhancements to mana * `POST /api/rest/2.0/ai/agent/conversation/create` + This API endpoint is modified to allow users to save conversations by setting `enable_save_chat: true` in the API request. +`POST /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/update` + +Updates attributes of an existing agent conversation. * `GET /api/rest/2.0/ai/agent/conversations` + -Returns a paginated list of saved Spotter conversations for the authenticated user. - +Retrieves the list of saved agent conversations for the currently authenticated user. +* `GET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/messages` + +Retrieves the full content of a saved conversation with Spotter agent. * `POST /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/update` + Updates the display title of a saved conversation. - * `DELETE /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/delete` + Deletes a saved conversation and all its associated messages. +* `GET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/answers/{answer_identifier}/details` + +Loads the full answer payload for a specific answer item in an agent conversation. For more information, see xref:saved-conversations-api.adoc[Saving and managing Spotter AI chat]. @@ -34,21 +38,42 @@ The following new API endpoints allow you to set and retrieve persistent behavio * `PUT /api/rest/2.0/ai/agent/instructions/set` + Sets behavioral instructions for the Spotter agent. Use this endpoint to define persistent guidance that Spotter applies when responding to queries in a conversation session. -* `GET /api/rest/2.0/ai/agent/instructions/get` + +* `GET /api/rest/2.0/ai/agent/instructions/get` +ß Retrieves the behavioral instructions currently configured by the administrator for the Spotter agent. For more information, see xref:spotter-agent-instructions.adoc[Spotter AI Agent instructions APIs]. -=== Webhook APIs +=== Webhooks + +New API endpoint:: The `GET /api/rest/2.0/webhooks/storage-config` API endpoint allows retrieving the storage setup information required for configuring a GCS or S3 storage destination for webhook delivery. +Enhancements:: + +* The `/api/rest/2.0/webhooks/create` endpoint allows configuring GCS storage destination for webhook delivery. The API endpoint also returns the GCS configuration details in response. +* The `/api/rest/2.0/webhooks/{webhook_identifier}/update` API endpoint supports configuring webhook activate status, resetting authentication, signature verification, and storage destination properties. +* API requests to the `/api/rest/2.0/system/communication-channels/validate` now return GCS storage properties in response. + +=== Communication channel monitoring + +The `/api/rest/2.0/jobs/history/communication-channels/search` API endpoint supports the `end_epoch_time_in_millis` parameter, which allows fetching records with a specific end timestamp. + + === Style customization APIs ThoughtSpot introduces new public REST API v2.0 endpoints for programmatic style customization. These APIs allow embedding applications to upload custom fonts and configure visual styles at the cluster or Org level without using the ThoughtSpot Admin UI. -=== Manual Translation APIs -The manual translation APIs are now public in REST API v2.0. These endpoints allow -you to programmatically import, export, and delete manual translations for ThoughtSpot content. The import endpoint has been enhanced to support both inserting new translations and updating existing ones in the same request. +=== Manual translation APIs +The manual translation API endpoints allow you to import, export, and delete translations of terms and labels that can be presented to the user based on their locale settings. + +* `POST /api/rest/2.0/localizations/manual-translation/import` + +Allows importing a CSV file containing translated terms and labels. +* `POST /api/rest/2.0/localizations/manual-translation/locales/{locale}/export` + +Retrieves all translations for a specific locale as a JSON map. +* `POST /api/rest/2.0/localizations/manual-translation/export` + +Downloads all manually translated terms and labels in the Org context as a CSV file. +* `POST /api/rest/2.0/localizations/manual-translation/delete` + +Deletes all manual translations from the Org. == Version 26.6.0.cl, June 2026 diff --git a/modules/ROOT/pages/webhooks-comm-channel.adoc b/modules/ROOT/pages/webhooks-comm-channel.adoc index ad7ce839c..ffd11f0e1 100644 --- a/modules/ROOT/pages/webhooks-comm-channel.adoc +++ b/modules/ROOT/pages/webhooks-comm-channel.adoc @@ -363,7 +363,6 @@ The following response shows the validation success and failure errors for a web == Monitor webhook delivery and job status To monitor job status for communication channels such as webhook, use the `/api/rest/2.0/jobs/history/communication-channels/search` API endpoint. - === Request parameters In the API request, you must provide channel details such as channel type, ID, and event type, or specify the job ID. @@ -400,6 +399,7 @@ Event type for which the webhook delivery is triggered. Default is `LIVEBOARD_SC ID of the event. |`start_epoch_time_in_millis` |__Decimal__. Allows filtering API response by records that were created on or after the specified epoch milliseconds. +|`end_epoch_time_in_millis` |__Decimal__. Specify the endtime in epoch milliseconds to fetch records created before the specified timestamp. |===== From 7b85c68f7684fe936e4f29db10752008e0964357 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 29 Jun 2026 23:12:08 +0530 Subject: [PATCH 070/136] final updates --- modules/ROOT/pages/rest-api-v2-reference.adoc | 55 +++++++++++++++++++ modules/ROOT/pages/whats-new.adoc | 20 ------- 2 files changed, 55 insertions(+), 20 deletions(-) diff --git a/modules/ROOT/pages/rest-api-v2-reference.adoc b/modules/ROOT/pages/rest-api-v2-reference.adoc index d50cd0cd5..4ce6b298e 100644 --- a/modules/ROOT/pages/rest-api-v2-reference.adoc +++ b/modules/ROOT/pages/rest-api-v2-reference.adoc @@ -924,6 +924,61 @@ Adds or updates column security rules applied on the Table specified in the API |ThoughtSpot Cloud: __10.12.0.cl or later__ a| +++Try it out +++ +|===== +-- +== Style customization + +// SOURCE: SCAL-293070, SCAL-293071 + +[div boxAuto] +-- +[width="100%" cols="8,5,3"] +[options='header'] +|===== +|API endpoint| Release version | Playground link + +a|`POST /api/rest/2.0/customization/styles/search` + +Gets the current style configuration at the cluster and active Org scope. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ +a| +++Try it out+++ + +a|`POST /api/rest/2.0/customization/styles/update` + +Updates style settings such as the navigation panel color, chart color palette, logos, embedded footer text, and visualization font assignments at the cluster or Org scope. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ +a| +++Try it out+++ + +a|`POST /api/rest/2.0/customization/styles/fonts/upload` + +Uploads a custom font file to ThoughtSpot. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ +a| +++Try it out+++ + +a|`POST /api/rest/2.0/customization/styles/fonts/search` + +Gets custom fonts uploaded to the ThoughtSpot instance. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ +a| +++Try it out+++ + +a|`PUT /api/rest/2.0/customization/styles/fonts/{font_identifier}/update` + +Updates the display name, weight, style, or color of an existing custom font. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ +a| +++Try it out+++ + +a|`POST /api/rest/2.0/customization/styles/fonts/delete` + +Deletes one or more custom fonts from the font library. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ +a| +++Try it out+++ + +a|`POST /api/rest/2.0/customization/styles/logos/export` + +Exports the current logo files as a ZIP archive. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ +a| +++Try it out+++ + |===== -- diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index b18e195b1..c3212c894 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -23,26 +23,6 @@ This page lists new features, enhancements, and deprecated functionality introdu // *Affects:* Developers, Administrators, End Users // ============================================================ -== July 2026 - -**Release version**: ThoughtSpot Cloud 26.7.0.cl + -*Upgrade notes*: No breaking changes. + -*Recommended SDK versions*: Visual Embed SDK v1.50.0 and later - -[.cl-table, cols="2,4", frame=none, grid=none] -|===== -a| -[.cl-label] -*Version 26.7.0.cl* - -a| -[discrete] -==== REST API v2 -This release introduces new API endpoints for style customization. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. - ---- - -|===== == June 2026 From 7e4d88f09b85f12cdb7529b251779a30f71d5c6b Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 30 Jun 2026 10:09:30 +0530 Subject: [PATCH 071/136] removed yellow highlights --- modules/ROOT/pages/data-report-v2-api.adoc | 10 +++++----- modules/ROOT/pages/roles.adoc | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index 87d6797b7..ae3991825 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -13,7 +13,7 @@ ThoughtSpot provides the following REST API v2 endpoints to fetch data: * xref:#_fetch_liveboard_api[`POST /api/rest/2.0/metadata/liveboard/data`] to get data from a Liveboard. * xref:#_fetch_answer_data_api[`POST /api/rest/2.0/metadata/answer/data`] to get data from a saved Answer. -#If Role-Based Access Control (RBAC) is enabled, the `DATADOWNLOADING` (Can download Data) privilege is required to use these APIs. Alternatively, if the granular data download RBAC privileges are enabled for your ThoughtSpot instance, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) is required.# +If Role-Based Access Control (RBAC) is enabled, the `DATADOWNLOADING` (Can download Data) privilege is required to use these APIs. Alternatively, if the granular data download RBAC privileges are enabled for your ThoughtSpot instance, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) is required. === Search data API @@ -233,8 +233,8 @@ To download a personalized view of the Liveboard, specify the view name in the ` * The downloadable file returned in API response file is extensionless. You need to rename the downloaded file by typing in the relevant extension. * If the Liveboard includes Note tiles, ensure that you do not pass the GUID of Note tiles as `visualization_identifiers` in the API request. Attempting to do so will lead to an error, and the API will return 400 error code in response. * Attempting to override existing filter values with runtime filters while exporting a Liveboard will result in an error. -* #If Role-Based Access Control (RBAC) is enabled, `DATADOWNLOADING` (Can download Data) privilege is required for Liveboard exports.# -* #If the granular Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) privilege is required to export in the XLSX or CSV formats, and the `CAN_DOWNLOAD_VISUALS` (Can download visuals) privilege is required for PDF or PNG exports. In this case the `DATADOWNLOADING` privilege ceases to exist# +* If Role-Based Access Control (RBAC) is enabled, `DATADOWNLOADING` (Can download Data) privilege is required for Liveboard exports. +* If the granular Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) privilege is required to export in the XLSX or CSV formats, and the `CAN_DOWNLOAD_VISUALS` (Can download visuals) privilege is required for PDF or PNG exports. In this case the `DATADOWNLOADING` privilege ceases to exist. ==== ==== File Formats @@ -467,8 +467,8 @@ The API supports exporting saved Answers, pinned Answers from a Liveboard, and S [IMPORTANT] ==== -* #If Role-Based Access Control (RBAC) is enabled, `DATADOWNLOADING` (Can download Data) privilege is required for Answer exports.# -* #If the granular Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) privilege is required to export in the PDF, XLSX or CSV formats, and the `CAN_DOWNLOAD_VISUALS` (Can download visuals) privilege is required for PNG exports. In this case the `DATADOWNLOADING` privilege ceases to exist# +* If Role-Based Access Control (RBAC) is enabled, `DATADOWNLOADING` (Can download Data) privilege is required for Answer exports. +* If the granular Role-Based Access Control (RBAC) is enabled, the `CAN_DOWNLOAD_DETAILED_DATA` (Can download detailed data) privilege is required to export in the PDF, XLSX or CSV formats, and the `CAN_DOWNLOAD_VISUALS` (Can download visuals) privilege is required for PNG exports. In this case the `DATADOWNLOADING` privilege ceases to exist. ==== ==== Example diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 8b085bbeb..94e133472 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -189,7 +189,6 @@ UI: *Can download visuals* |Allows users to download data in the PDF or PNG fil UI: *Can download detailed data* | Allows users to export data in XLSX/CSV format. This is an early access feature and is not enabled by default on ThoughtSpot instances. |=== -#For review# [IMPORTANT] ==== * Contact ThoughtSpot support to enable the new `CAN_DOWNLOAD_VISUALS` and `CAN_DOWNLOAD_DETAILED_DATA` privileges. From d405fba05e5b9e7f56d5bfa31bab31ded9ab71e2 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 30 Jun 2026 11:14:49 +0530 Subject: [PATCH 072/136] edit --- modules/ROOT/pages/configure-saml.adoc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/configure-saml.adoc b/modules/ROOT/pages/configure-saml.adoc index e1965d2c4..68746d6d2 100644 --- a/modules/ROOT/pages/configure-saml.adoc +++ b/modules/ROOT/pages/configure-saml.adoc @@ -115,7 +115,7 @@ Make a note of all of the redirects within the SAML workflow. Each server must b ==== [#per-org-idp-org-isolation] -=== #Org isolation for per-org IdP authentication# +=== Org isolation for per-org IdP authentication // SOURCE: SCAL-291968 — OIDCClient.java, OrgUtils.java, SecurityEventTypeEnum.java When your ThoughtSpot cluster uses per-org IdP configuration — where each Org is bound to its own identity provider — ThoughtSpot enforces strict org isolation on all incoming SAML and OIDC group and org claims. @@ -134,7 +134,9 @@ NOTE: Org isolation applies only to per-org IdP logins. Cluster-wide (single IdP ==== Effect on existing org memberships -Org isolation is non-destructive. If a user already has legitimate, manually-assigned membership in another Org — granted by a cluster administrator — that membership is preserved after a per-org IdP login. Per-org SAML or OIDC authentication cannot be used as a source of new access to Orgs outside the authorized Org. +Logging in through a per-org IdP can affect existing Org memberships. When a user authenticates via a per-org IdP, ThoughtSpot evaluates and reconciles the user's Org memberships based on the claims scoped to that IdP's authorized Org. + +Alternatively, authenticating through a cluster-wide (primary Org) IdP does not alter existing group memberships. == Configuration steps From 94cacaa6181f8772314e244ec1fcbfa46bb4bb2e Mon Sep 17 00:00:00 2001 From: Prashant Patil Date: Tue, 30 Jun 2026 12:07:28 +0530 Subject: [PATCH 073/136] gitboxes links update with stackblitz --- modules/ROOT/pages/prerender.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/prerender.adoc b/modules/ROOT/pages/prerender.adoc index bff01953b..bf568f4cb 100644 --- a/modules/ROOT/pages/prerender.adoc +++ b/modules/ROOT/pages/prerender.adoc @@ -320,4 +320,4 @@ prefetch("https://:", [ == Additional Resources * link:https://github.com/thoughtspot/developer-examples/tree/main/visual-embed/pre-rendering[Pre-rendering examples on GitHub, window=_blank] -* link:https://codesandbox.io/p/sandbox/github/thoughtspot/developer-examples/tree/main/visual-embed/pre-rendering[CodeSandbox: Pre-rendering, window=_blank] +* link:https://stackblitz.com/github/thoughtspot/developer-examples/tree/main/visual-embed/pre-rendering[StackBlitz: Pre-rendering, window=_blank] From 999e3df962df787b7151da018a7a7b70c0c8d1fc Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 30 Jun 2026 12:38:56 +0530 Subject: [PATCH 074/136] removed highlights and deleted whats new --- .../ROOT/pages/just-in-time-provisioning.adoc | 2 +- modules/ROOT/pages/orgs.adoc | 2 +- modules/ROOT/pages/whats-new.adoc | 31 ------------------- 3 files changed, 2 insertions(+), 33 deletions(-) diff --git a/modules/ROOT/pages/just-in-time-provisioning.adoc b/modules/ROOT/pages/just-in-time-provisioning.adoc index 822bc6ea8..06975498d 100644 --- a/modules/ROOT/pages/just-in-time-provisioning.adoc +++ b/modules/ROOT/pages/just-in-time-provisioning.adoc @@ -180,7 +180,7 @@ In general, the IdP assertion can create a user and add them to existing Thought [NOTE] ==== // SOURCE: SCAL-291968 — OIDCClient.java, OrgUtils.java -#If your ThoughtSpot cluster uses per-org IdP configuration, ThoughtSpot automatically filters SAML and OIDC group and org claims at login time. Only claims that reference the Org bound to the authenticating IdP are used for JIT provisioning. Claims referencing other Orgs are dropped and logged as security audit events. This behavior ensures that a per-org IdP cannot be used to provision users into Orgs it is not authorized to manage.# +If your ThoughtSpot cluster uses per-org IdP configuration, ThoughtSpot automatically filters SAML and OIDC group and org claims at login time. Only claims that reference the Org bound to the authenticating IdP are used for JIT provisioning. Claims referencing other Orgs are dropped and logged as security audit events. This behavior ensures that a per-org IdP cannot be used to provision users into Orgs it is not authorized to manage. For more information, see xref:configure-saml.adoc#per-org-idp-org-isolation[Org isolation for per-org IdP authentication]. ==== diff --git a/modules/ROOT/pages/orgs.adoc b/modules/ROOT/pages/orgs.adoc index b417aa0c7..8e49e6288 100644 --- a/modules/ROOT/pages/orgs.adoc +++ b/modules/ROOT/pages/orgs.adoc @@ -254,7 +254,7 @@ a|[tag greenBackground tick]#✓# |===== [#per-org-sso-isolation] -=== #SSO and Org isolation# +=== SSO and Org isolation // SOURCE: SCAL-291968 — OIDCClient.java, SecurityEventTypeEnum.java, design doc 1R4P3Eup4-UQJAWxyoeHjGr87mzJGWIOvfPDyHQF6-cQ ThoughtSpot supports SAML and OIDC group synchronization on multi-tenant clusters. When you use **per-org IdP configuration**, ThoughtSpot enforces strict org isolation on all incoming group and org claims to protect tenant boundaries. diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 301cdc99b..c3212c894 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -23,37 +23,6 @@ This page lists new features, enhancements, and deprecated functionality introdu // *Affects:* Developers, Administrators, End Users // ============================================================ -== June 2026 - -**Release version**: ThoughtSpot Cloud 26.7.0.cl + -*Upgrade notes*: No breaking changes. + -*Recommended SDK versions*: Visual Embed SDK v1.50.0 and later - -[.cl-table, cols="2,4", frame=none, grid=none] -|===== -a| -[.cl-label] -*Version 26.7.0.cl* - -a| -[discrete] -==== #Org isolation for per-org SAML and OIDC authentication# -ThoughtSpot now enforces strict org isolation when users authenticate through a per-org identity provider (IdP). When a per-org IdP sends SAML or OIDC group claims that reference Orgs outside its authorized scope, ThoughtSpot silently drops those claims and records them as security audit events. This prevents a rogue IdP administrator in one Org from using group assertions to gain unauthorized access to another Org. Existing manually-assigned org memberships are unaffected. - ---- - -[discrete] -==== Visual Embed SDK -The Visual Embed SDK version 1.49.0 includes several new features and enhancements. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. - ---- - -[discrete] -==== REST API v2 -This release introduces new API endpoints for Spotter, connections and trusted authentication. For information about REST API v2 enhancements, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. - -|===== - == June 2026 From 47034a6db8da881d6fb903f86d6cf166cfbb6483 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 30 Jun 2026 13:23:04 +0530 Subject: [PATCH 075/136] work-model --- modules/ROOT/pages/data-report-v2-api.adoc | 1 + modules/ROOT/pages/partials/search-query-string.adoc | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index 60b91bb5d..b95b51895 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -685,3 +685,4 @@ To sort columns on a Liveboard or Answer, define runtime sort properties in `run For more information, see xref:runtime-sort.adoc#_rest_api_v2_0[Runtime sorting of columns]. + diff --git a/modules/ROOT/pages/partials/search-query-string.adoc b/modules/ROOT/pages/partials/search-query-string.adoc index cbff14bf8..63b6563d8 100644 --- a/modules/ROOT/pages/partials/search-query-string.adoc +++ b/modules/ROOT/pages/partials/search-query-string.adoc @@ -117,7 +117,7 @@ For example, Columns `[Revenue]` and `[revenue]` are not unique. * Values must be enclosed in quotes, `‘’`, but they cannot contain quotes. -* The API does not support **in-query formula** definitions. To use a formula, create it on the Worksheet or a table using the ThoughtSpot UI, and then use the named formula inside the API query. +* The API does not support **in-query formula** definitions. To use a formula, create it on the Model or a table using the ThoughtSpot UI, and then use the named formula inside the API query. * Users must be authenticated and have read access to the data source. From bb6ca2bb9e33266f5f6cbaf7beb27696ec1f6d2d Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 30 Jun 2026 13:23:04 +0530 Subject: [PATCH 076/136] work-model --- modules/ROOT/pages/data-report-v2-api.adoc | 1 + modules/ROOT/pages/partials/search-query-string.adoc | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/data-report-v2-api.adoc b/modules/ROOT/pages/data-report-v2-api.adoc index f1c2682c2..a1e1e494e 100644 --- a/modules/ROOT/pages/data-report-v2-api.adoc +++ b/modules/ROOT/pages/data-report-v2-api.adoc @@ -675,3 +675,4 @@ To sort columns on a Liveboard or Answer, define runtime sort properties in `run For more information, see xref:runtime-sort.adoc#_rest_api_v2_0[Runtime sorting of columns]. + diff --git a/modules/ROOT/pages/partials/search-query-string.adoc b/modules/ROOT/pages/partials/search-query-string.adoc index cbff14bf8..63b6563d8 100644 --- a/modules/ROOT/pages/partials/search-query-string.adoc +++ b/modules/ROOT/pages/partials/search-query-string.adoc @@ -117,7 +117,7 @@ For example, Columns `[Revenue]` and `[revenue]` are not unique. * Values must be enclosed in quotes, `‘’`, but they cannot contain quotes. -* The API does not support **in-query formula** definitions. To use a formula, create it on the Worksheet or a table using the ThoughtSpot UI, and then use the named formula inside the API query. +* The API does not support **in-query formula** definitions. To use a formula, create it on the Model or a table using the ThoughtSpot UI, and then use the named formula inside the API query. * Users must be authenticated and have read access to the data source. From e2f5e44782bfa21c9b6baa69e1943a23fce03ebf Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 29 Jun 2026 13:45:56 +0530 Subject: [PATCH 077/136] changes for allgrps --- modules/ROOT/pages/roles.adoc | 101 ++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 94e133472..6e16a8a41 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -270,3 +270,104 @@ For example, if a group has `DATADOWNLOADING` access, the `DATADOWNLOADING` Role * *Can manage data models* (`CAN_MANAGE_WORKSHEET_VIEWS_TABLES`) For granular access, you can create a Role with required privileges and assign it to groups. + +== Restore correct privileges on the ALL group when roles are enabled +Every ThoughtSpot instance includes a built-in *ALL* group. All users are automatically members of this group. +When RBAC is enabled, the ALL group is assigned an *ALL role* that grants three base privileges: + +* `AUTHORING` — Allows users to create and edit ThoughtSpot content. +* `DATADOWNLOADING` — Allows users to download data from ThoughtSpot Answers and Liveboards. +* `USERDATAUPLOADING` — Allows users to upload data from a local file. + +Due to a limitation in the update group flow, additional privileges may be inadvertently assigned to the ALL group. +When this occurs, every user on that ThoughtSpot instance inherits those unexpected elevated privileges. + +[NOTE] +==== +The ALL role is a system role. It is not visible in the ThoughtSpot UI. You must use the REST APIs to retrieve its GUID and reassign it. +==== + +=== Before you begin +* Administrator access to your ThoughtSpot instance. + +=== Steps to unblock the users + +. Retrieve the GUID of the ALL group ++ +Call the `POST /api/rest/2.0/groups/search` endpoint and filter by the group name `All`. ++ +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/api/rest/2.0/groups/search' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "group_identifier": "All", // <1> + "record_offset": 0, + "record_size": 10 +} +---- + +From the response, locate the `id` field. This is the GUID of the ALL group. + +[source,JSON] +---- +[ + { + "id": "", // + "name": "All", + "display_name": "All Group", + "system_group": true, + ... + } +] +---- +. Retrieve the GUID of the ALL role +The ALL role is a system role and does not appear in the ThoughtSpot UI. +Call the `POST /api/rest/2.0/roles/search` endpoint and filter by the `group_identifiers` +parameter, passing in the ALL group GUID retrieved in Step 1. ++ +[source,cURL] +---- +curl -X POST \ +--url 'https://{ThoughtSpot-Host}/api/rest/2.0/roles/search' \ +-H 'Authorization: Bearer {access-token}'\ +-H 'Accept: application/json'\ +-H 'Content-Type: application/json' \ +--data-raw '{ + "group_identifiers": [ + "" // + ], + "record_offset": 0, + "record_size": 10 +} +---- + +. Restore the ALL role on the ALL group +Call the `POST /api/rest/2.0/groups/{group_identifier}/update` endpoint using the ALL group GUID as the path parameter. + +Use `REPLACE` as the operation type. +This replaces the complete list of roles currently assigned to the ALL group +with only the ALL role, removing all unexpected role assignments in a single operation. ++ ++ +[source,cURL] +---- +curl -X POST \ +--url 'https://{ThoughtSpot-Host}/api/rest/2.0/groups//update' \ +-H 'Authorization: Bearer {access-token}'\ +-H 'Accept: application/json'\ +-H 'Content-Type: application/json' \ +--data-raw '{ + "role_identifiers": { + "operation": "REPLACE", // + "role_identifiers": [ + "" // + ] + } +} +---- + +A successful response returns an HTTP `204` status with an empty body. From 1546951bdad492723ed4c64035c15a519c33d3a8 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 29 Jun 2026 13:55:42 +0530 Subject: [PATCH 078/136] changes for allgrps --- modules/ROOT/pages/roles.adoc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 6e16a8a41..a19881815 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -309,9 +309,9 @@ curl -X POST \ "record_size": 10 } ---- - ++ From the response, locate the `id` field. This is the GUID of the ALL group. - ++ [source,JSON] ---- [ @@ -346,13 +346,13 @@ curl -X POST \ ---- . Restore the ALL role on the ALL group ++ Call the `POST /api/rest/2.0/groups/{group_identifier}/update` endpoint using the ALL group GUID as the path parameter. - ++ Use `REPLACE` as the operation type. This replaces the complete list of roles currently assigned to the ALL group with only the ALL role, removing all unexpected role assignments in a single operation. + -+ [source,cURL] ---- curl -X POST \ @@ -369,5 +369,5 @@ curl -X POST \ } } ---- - ++ A successful response returns an HTTP `204` status with an empty body. From cd9fbbbc7aad855dc064be4016308e480c658783 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 29 Jun 2026 18:26:53 +0530 Subject: [PATCH 079/136] edits --- modules/ROOT/pages/roles.adoc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index a19881815..61e904f22 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -273,12 +273,18 @@ For granular access, you can create a Role with required privileges and assign i == Restore correct privileges on the ALL group when roles are enabled Every ThoughtSpot instance includes a built-in *ALL* group. All users are automatically members of this group. -When RBAC is enabled, the ALL group is assigned an *ALL role* that grants three base privileges: +When RBAC is enabled, the ALL group is assigned an *ALL role*. This role always grants the `AUTHORING` privilege, which is required for all users +and must remain assigned to the ALL group at all times. -* `AUTHORING` — Allows users to create and edit ThoughtSpot content. -* `DATADOWNLOADING` — Allows users to download data from ThoughtSpot Answers and Liveboards. +In addition to the ALL role, the ALL group may hold other roles that grant +the following privileges: + +* `DATADOWNLOADING` — Allows users to download data from answers and Liveboards. * `USERDATAUPLOADING` — Allows users to upload data from a local file. +These privileges are permitted on the ALL group and may be assigned through +additional roles depending on your ThoughtSpot instance's configuration. + Due to a limitation in the update group flow, additional privileges may be inadvertently assigned to the ALL group. When this occurs, every user on that ThoughtSpot instance inherits those unexpected elevated privileges. @@ -325,6 +331,7 @@ From the response, locate the `id` field. This is the GUID of the ALL group. ] ---- . Retrieve the GUID of the ALL role ++ The ALL role is a system role and does not appear in the ThoughtSpot UI. Call the `POST /api/rest/2.0/roles/search` endpoint and filter by the `group_identifiers` parameter, passing in the ALL group GUID retrieved in Step 1. From 70624774357dccef01a1c73242ccd876695c12eb Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 30 Jun 2026 12:04:26 +0530 Subject: [PATCH 080/136] feedback --- modules/ROOT/pages/roles.adoc | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 61e904f22..1b56d4caf 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -285,8 +285,7 @@ the following privileges: These privileges are permitted on the ALL group and may be assigned through additional roles depending on your ThoughtSpot instance's configuration. -Due to a limitation in the update group flow, additional privileges may be inadvertently assigned to the ALL group. -When this occurs, every user on that ThoughtSpot instance inherits those unexpected elevated privileges. +For users who have inherited unexpected elevated privileges, follow the steps listed below to restore privileges. [NOTE] ==== @@ -294,9 +293,12 @@ The ALL role is a system role. It is not visible in the ThoughtSpot UI. You must ==== === Before you begin -* Administrator access to your ThoughtSpot instance. +Before you start, ensure you have: -=== Steps to unblock the users +* Administrator privileges on your ThoughtSpot instance. +* A valid bearer token for authentication. + +=== Procedure to unblock the users . Retrieve the GUID of the ALL group + @@ -305,15 +307,14 @@ Call the `POST /api/rest/2.0/groups/search` endpoint and filter by the group nam [source,cURL] ---- curl -X POST \ - --url 'https://{ThoughtSpot-Host}/api/api/rest/2.0/groups/search' \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/groups/search' \ -H 'Authorization: Bearer {access-token}'\ -H 'Accept: application/json'\ -H 'Content-Type: application/json' \ --data-raw '{ - "group_identifier": "All", // <1> "record_offset": 0, "record_size": 10 -} +}' ---- + From the response, locate the `id` field. This is the GUID of the ALL group. @@ -322,7 +323,7 @@ From the response, locate the `id` field. This is the GUID of the ALL group. ---- [ { - "id": "", // + "id": "", "name": "All", "display_name": "All Group", "system_group": true, @@ -345,11 +346,11 @@ curl -X POST \ -H 'Content-Type: application/json' \ --data-raw '{ "group_identifiers": [ - "" // + "" ], "record_offset": 0, "record_size": 10 -} +}' ---- . Restore the ALL role on the ALL group @@ -363,18 +364,18 @@ with only the ALL role, removing all unexpected role assignments in a single ope [source,cURL] ---- curl -X POST \ ---url 'https://{ThoughtSpot-Host}/api/rest/2.0/groups//update' \ +--url 'https://{ThoughtSpot-Host}/api/rest/2.0/groups//update' \ -H 'Authorization: Bearer {access-token}'\ -H 'Accept: application/json'\ -H 'Content-Type: application/json' \ --data-raw '{ "role_identifiers": { - "operation": "REPLACE", // + "operation": "REPLACE", "role_identifiers": [ - "" // + "" ] } -} +}' ---- + A successful response returns an HTTP `204` status with an empty body. From aaf07dafa0673342bd5250e031c3e698895df0ce Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 30 Jun 2026 13:56:52 +0530 Subject: [PATCH 081/136] deleted step 2-vipul's input --- modules/ROOT/pages/roles.adoc | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 1b56d4caf..5e2760035 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -333,25 +333,8 @@ From the response, locate the `id` field. This is the GUID of the ALL group. ---- . Retrieve the GUID of the ALL role + -The ALL role is a system role and does not appear in the ThoughtSpot UI. -Call the `POST /api/rest/2.0/roles/search` endpoint and filter by the `group_identifiers` -parameter, passing in the ALL group GUID retrieved in Step 1. -+ -[source,cURL] ----- -curl -X POST \ ---url 'https://{ThoughtSpot-Host}/api/rest/2.0/roles/search' \ --H 'Authorization: Bearer {access-token}'\ --H 'Accept: application/json'\ --H 'Content-Type: application/json' \ ---data-raw '{ - "group_identifiers": [ - "" - ], - "record_offset": 0, - "record_size": 10 -}' ----- +Contact ThoughtSpot support for retrieving the guid for the ALL role. + . Restore the ALL role on the ALL group + From 9a312c5ebad2a93db8c52a2de57b0bbcbe08f12e Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 30 Jun 2026 14:17:03 +0530 Subject: [PATCH 082/136] corrections --- modules/ROOT/pages/roles.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 5e2760035..33f3c040f 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -289,7 +289,7 @@ For users who have inherited unexpected elevated privileges, follow the steps li [NOTE] ==== -The ALL role is a system role. It is not visible in the ThoughtSpot UI. You must use the REST APIs to retrieve its GUID and reassign it. +The ALL role is a System role. You must contact ThoughtSpot support to retrieve its GUID. ==== === Before you begin From 86191e7b03d87124defc223b330df79aa32434bb Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 08:58:25 +0530 Subject: [PATCH 083/136] webhook and other edits --- modules/ROOT/pages/api-changelog.adoc | 10 + modules/ROOT/pages/common/nav-rest-api.adoc | 1 + modules/ROOT/pages/locale-setting.adoc | 11 +- modules/ROOT/pages/manual-translation.adoc | 184 ++++++++ modules/ROOT/pages/rest-api-v2-reference.adoc | 78 +++- modules/ROOT/pages/rest-apiv2-changelog.adoc | 5 +- modules/ROOT/pages/webhooks-api.adoc | 74 ++-- modules/ROOT/pages/webhooks-comm-channel.adoc | 13 +- modules/ROOT/pages/webhooks-gcs-storage.adoc | 281 +++++++++---- modules/ROOT/pages/webhooks-lb-schedule.adoc | 59 +-- modules/ROOT/pages/webhooks-payload.adoc | 10 +- modules/ROOT/pages/webhooks-s3-storage.adoc | 398 +++++------------- modules/ROOT/pages/webhooks-ux.adoc | 143 ++++--- modules/ROOT/pages/webhooks.adoc | 19 +- modules/ROOT/pages/whats-new.adoc | 27 +- .../doc-images/images/create-webhook-s3.png | Bin 0 -> 182370 bytes .../doc-images/images/webhook-create-gcp.png | Bin 0 -> 185672 bytes static/doc-images/images/webhook-log.png | Bin 0 -> 148179 bytes .../doc-images/images/webhook-sent-filter.png | Bin 0 -> 97143 bytes .../doc-images/images/webhooks-dashboard.png | Bin 0 -> 158828 bytes .../images/webhooks-delivery-status.png | Bin 0 -> 108016 bytes .../images/webhooks-list-filter.png | Bin 0 -> 118595 bytes 22 files changed, 736 insertions(+), 577 deletions(-) create mode 100644 modules/ROOT/pages/manual-translation.adoc create mode 100644 static/doc-images/images/create-webhook-s3.png create mode 100644 static/doc-images/images/webhook-create-gcp.png create mode 100644 static/doc-images/images/webhook-log.png create mode 100644 static/doc-images/images/webhook-sent-filter.png create mode 100644 static/doc-images/images/webhooks-dashboard.png create mode 100644 static/doc-images/images/webhooks-delivery-status.png create mode 100644 static/doc-images/images/webhooks-list-filter.png diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index d6d50431a..eabbadeb7 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -62,6 +62,16 @@ Trigger a manual cache refresh from the host application. Action ID to show or hide the cache refresh button in the Liveboard toolbar. |==== +|[tag greenBackground]#NEW FEATURE# a| + +[discrete] +===== Events for Spotter conversation history +* `HostEvent.LoadChat` + +Load a specific conversation by ID into the embedded Spotter interface. +* `HostEvent.DeleteChat` + +Delete a specific conversation by ID. +* `HostEvent.RenameChat` + +Rename a specific conversation by ID. == Version 1.49.x, June 2026 diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index e93dd9a77..4c89a5c91 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -29,6 +29,7 @@ REST APIs * link:{{navprefix}}/connections[Connections] * link:{{navprefix}}/connection-config[Connection configuration] * link:{{navprefix}}/runtime-sort[Runtime sorting] +* link:{{navprefix}}/manual-translation-api[Manual translations] [.sidebar-title] diff --git a/modules/ROOT/pages/locale-setting.adoc b/modules/ROOT/pages/locale-setting.adoc index fb770a360..d9a40fa16 100644 --- a/modules/ROOT/pages/locale-setting.adoc +++ b/modules/ROOT/pages/locale-setting.adoc @@ -4,7 +4,7 @@ :page-title: Set locale :page-pageid: set-locale -:page-description: You can change the locale settings of your embedded app to display the UI elements in your preferred language +:page-description: You can change the locale settings of your embedded app to display the UI elements in your preferred language and use the Manual translation REST APIs to supply custom translations for ThoughtSpot UI strings. The display language of the embedded ThoughtSpot UI is determined by the user's system locale. If your browser locale matches one of the locale options supported by ThoughtSpot, the ThoughtSpot UI automatically changes to that locale. If your browser locale is not supported by ThoughtSpot, the embedded UI is displayed in US English by default. For example, if your browser locale is an unsupported Central American locale, such as Spanish (Mexico) (es-MX), ThoughtSpot launches in en-US. If your browser doesn't allow you to change the locale, ThoughtSpot launches in the OS locale. @@ -117,8 +117,7 @@ To get details of the browser language settings for a given user, administrators == Limitations -* By default, ThoughtSpot _does not_ translate column names, object titles, description text, formulas, or metadata entered by the user. For example, if you name a visualization **Sales performance** in any variant of English and subsequently change the locale to Español, the name of the visualization remains **Sales performance**. + -However, if the column name and description alias [beta betaBackground]^Beta^ feature is enabled on your instance, you can localize the text on Search and Answer interfaces. To enable this feature on your instance, contact ThoughtSpot Support. -* If you specify a currency when uploading data, that currency format does not change when the locale changes. + -* ThoughtSpot translates keywords, operators, and error messages. See link:https://docs.thoughtspot.com/cloud/latest/keywords[Keyword reference] for all supported languages. - +* By default, ThoughtSpot does not automatically translate column names, object titles, description text, formulas, or metadata entered by the user. For example, if you name a visualization *Sales performance* in any variant of English and subsequently change the locale to Español, the name of the visualization remains *Sales performance*. + +To supply custom translations for ThoughtSpot UI strings programmatically, use the xref:manual-translation-api.adoc[Manual Translation REST APIs]. +* If you specify a currency when uploading data, that currency format does not change when the locale changes. +* ThoughtSpot translates keywords, operators, and error messages. See link:https://docs.thoughtspot.com/cloud/latest/keywords[Keyword reference, window=_blank] for all supported languages. \ No newline at end of file diff --git a/modules/ROOT/pages/manual-translation.adoc b/modules/ROOT/pages/manual-translation.adoc new file mode 100644 index 000000000..1866e935f --- /dev/null +++ b/modules/ROOT/pages/manual-translation.adoc @@ -0,0 +1,184 @@ += Manual Translation REST APIs +:toc: true +:toclevels: 2 + +:page-title: Manual Translation REST APIs +:page-pageid: manual-translation-api +:page-description: Use the Manual Translation REST APIs to programmatically import, export, and manage custom locale-specific translations for ThoughtSpot UI strings. + +By default, ThoughtSpot translates system UI elements such as menu labels, button text, and navigation controls into the user's configured locale. However, user-generated content such as object titles, column names, and description text is not automatically translated. + +The Manual Translation REST APIs let administrators and developers supply custom locale-specific translations for ThoughtSpot UI strings programmatically, without using the ThoughtSpot Admin portal. You can use these APIs to: + +* Upload a CSV file containing custom translations for one or more locales +* Export existing translations for review and editing +* Retrieve a translation bundle for a specific locale at runtime +* Delete all translations for an org or a cluster + +These APIs are available from ThoughtSpot Cloud 26.7.0 onwards. + +[NOTE] +==== +To manage manual translations through the ThoughtSpot Admin portal instead of the REST API, see link:https://docs.thoughtspot.com/cloud/latest/manual-translation[Manual translation, window=_blank] in the ThoughtSpot product documentation. +==== + +== Before you begin +The import, export, and delete endpoints require `ADMINISTRATION` (**Can administer ThoughtSpot**), `ORG_ADMINISTRATION` (**Can administer Org**), or APPLICATION_ADMINISTRATION (**Can administer application**) privileges. + +The translation bundle endpoint (`POST /api/rest/2.0/localizations/manual-translation/locales/{locale}/export`) does not require administrator privileges and is accessible to all authenticated users. + +//For more information about assigning privileges, see xref:privileges-and-roles.adoc[Privileges and roles]. + +=== How manual translations work + +When a user opens an embedded ThoughtSpot component, ThoughtSpot applies translations in the following order of precedence: + +. Custom translations uploaded via the Manual Translation API for the user's configured locale +. ThoughtSpot's built-in system translations for supported locales +. The ThoughtSpot default locale, US English (`en-US`) + +If a translation key is present in the uploaded CSV file, the custom value is displayed. If it is absent, ThoughtSpot falls back to its built-in string for that locale. + +Uploaded translations are scoped to either a single org (`ORG`) or for all Orgs. See <> for details. + +[#org-scope] +=== Org scope + +All Manual Translation API endpoints accept an optional `scope` parameter in the request body. This parameter controls the organizational context of the operation. + +[width="100%", cols="1,3"] +[options="header"] +|=== +| Value | Description +| `ORG` | *(Default)* Targets the calling user's current org. Use for all standard single-org or per-org translation management. +| `CLUSTER` | Targets the All Orgs context. Translations uploaded at cluster scope apply across all orgs in a multi-org deployment. Requires Tenant Admin or Org Admin privilege. +|=== + +If the `scope` parameter is omitted, it defaults to `ORG`. + +[#csv-format] +== CSV file format + +The import and export endpoints use a CSV file to represent translation data. All files must use UTF-8 encoding and conform to RFC 4180. + +=== Required columns + +The CSV file must contain exactly three columns, with headers exactly as shown: + +[width="100%", cols="1,3"] +[options="header"] +|=== +| Column | Description +| `content` | The original ThoughtSpot UI string in the default locale. This is the lookup key for the translation. +| `locale` | The locale identifier for the translation. Must be one of the xref:locale-setting.adoc#_supported_locale_ids[supported locale IDs] and must be in lowercase (for example, `fr-fr`, `de-de`, `ja-jp`). +| `translated-content` | The translated string to display when the user's locale matches the `locale` column value. +|=== + +[NOTE] +==== +Column headers are case-sensitive. Use exactly `content`, `locale`, and `translated-content`. +==== + +=== Constraints + +* The file must have a `.csv` extension. +* Maximum file size: 30 MB. +* Maximum number of data rows per upload: 10,000. +* Maximum characters per cell: 2,000. +* HTML tags and control characters (other than tab, line feed, and carriage return) are not permitted in cell values. +* The `locale` value must be lowercase in every row. For example, use `fr-fr`, not `fr-FR`. + +=== Example + +The following example shows a valid CSV file with translations for French and German: + +[source,text] +---- +content,locale,translated-content +Sales Performance,fr-fr,Performance des ventes +Sales Performance,de-de,Vertriebsleistung +Total Revenue,fr-fr,Revenu total +Total Revenue,de-de,Gesamtumsatz +New Answer,fr-fr,Nouvelle réponse +New Answer,de-de,Neue Antwort +---- + +== API endpoints + +=== Import manual translations + +To import a custom translation file, use the `/api/rest/2.0/localizations/manual-translation/import` API endpoint. This endpoint allows you to upload a CSV file containing custom translations. The operation is an *upsert*, that is new translation entries are inserted, and existing entries that match on both the `content` and `locale` columns are updated in place. A single upload can contain translations for multiple locales. + +The request body uses `multipart/form-data` encoding. + +[width="100%", cols="2,4"] +[options="header"] +|=== +| Parameter | Description +| `translations_file` | The CSV file containing translations. Must meet the xref:manual-translation-api.adoc#csv-format[CSV format requirements]. +| `scope` |__Optional__. Org scope selector. Allowed values are `ORG` and `CLUSTER`. +|=== + +A successful request returns HTTP `204 No Content`. If the file fails validation (for example, missing headers, oversized file, or invalid locale), the API returns HTTP `400 Bad Request` with an error description. + +=== Export manual translations +To export or download manual translated terms and labels in a CSV file, use the `/api/rest/2.0/localizations/manual-translation/export` API endpoint. This endpoint downloads all existing manual translations for the specified org scope as a CSV file. The downloaded file uses the same three-column format as the import CSV and can be edited and re-uploaded. + +[width="100%", cols="2,4"] +[options="header"] +|=== +| Parameter | Description +| `scope` | Org scope selector. Allowed values are `ORG` and `CLUSTER`. +|=== + +A successful request returns HTTP `200 OK` with the CSV file in the response body and a `Content-Disposition: attachment; filename=manual-translation.csv` response header. If no translations have been uploaded for the specified scope, the API returns HTTP `404 Not Found`. + +=== Get translation bundle +To retrieve a JSON map of all manual translations for a specific locale, use the `/api/rest/2.0/localizations/manual-translation/locales/{locale}/export` API endpoint. This endpoint can be used by the embedding applications to load custom translations at runtime, for example, to apply translations during initialization of an embedded ThoughtSpot component. + +[width="100%", cols="2,4"] +[options="header"] +|=== +| Parameter | Description +| `locale` |The locale to retrieve translations for. Must be lowercase and match the pattern `^[a-z]{2,}(-[a-z0-9]{2,})?$`. For example, `fr-fr`, `de-de`, `ja-jp`. +|=== + +A successful request returns HTTP `200 OK` with a JSON object in the following structure: + +[source,json] +---- +{ + "data": { + "translations": { + "Sales Performance": "Performance des ventes", + "Total Revenue": "Revenu total", + "New Answer": "Nouvelle réponse" + } + } +} +---- + +If no translations have been uploaded for the requested locale, the response returns an empty `translations` map. + +=== Delete manual translations + +To delete all manual translations, use the `/api/rest/2.0/localizations/manual-translation/delete` API endpoint. This endpoint deletes all manual translations for the specified org scope. After the delete operation, ThoughtSpot uses the built-in UI strings for all locales until new translations are uploaded. + +[WARNING] +==== +This operation deletes *all* translations for the specified scope. It cannot be scoped to a single locale or a subset of translation keys. This operation is not reversible. +==== + +[width="100%", cols="2,4"] +[options="header"] +|=== +| Parameter | Description +| `scope` |__Optional__. Org scope selector. Allowed values: `ORG` and `CLUSTER`. +|=== + +A successful request returns HTTP `204 No Content`. + +== Additional resources + +* xref:locale-setting.adoc[Configure locale in the Visual Embed SDK and via the Users REST API] +* link:https://docs.thoughtspot.com/cloud/latest/manual-translation[Manage translations through the ThoughtSpot Admin portal, window=_blank] diff --git a/modules/ROOT/pages/rest-api-v2-reference.adoc b/modules/ROOT/pages/rest-api-v2-reference.adoc index df0941a7f..0f0e35da5 100644 --- a/modules/ROOT/pages/rest-api-v2-reference.adoc +++ b/modules/ROOT/pages/rest-api-v2-reference.adoc @@ -61,16 +61,6 @@ Allows sending a query to an ongoing conversation session with Spotter agent and |ThoughtSpot Cloud: __10.15.0.cl or later__ + ThoughtSpot Software: __Not available__ a| +++Try it out+++ -a|`PUT /api/rest/2.0/ai/agent/instructions/set` + -Sets custom instructions for the Spotter agent. -|ThoughtSpot Cloud: __26.6.0.cl or later__ + -ThoughtSpot Software: __Not available__ a| +++Try it out+++ - -a|`GET /api/rest/2.0/ai/agent/instructions/get` + -Retrieves the custom instructions currently configured for the Spotter agent. -|ThoughtSpot Cloud: __26.6.0.cl or later__ + -ThoughtSpot Software: __Not available__ a| +++Try it out+++ - a|`POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response` + Stops an in-progress Spotter agent response for a given conversation session. |ThoughtSpot Cloud: __26.6.0.cl or later__ + @@ -85,6 +75,37 @@ a|`POST /api/rest/2.0/ai/instructions/get` + Retrieves NL instructions from a data model. |ThoughtSpot Cloud: __10.15.0.cl or later__ + ThoughtSpot Software: __Not available__ a| +++Try it out+++ + +a|`PUT /api/rest/2.0/ai/agent/instructions/set` + +Sets custom instructions for the Spotter agent. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| +++Try it out+++ + +a|`GET /api/rest/2.0/ai/agent/instructions/get` + +Retrieves the custom instructions currently configured for the Spotter agent. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| +++Try it out+++ + +a|`GET /api/rest/2.0/ai/agent/conversations` + +Retrieves a paginated list of saved Spotter agent conversations for the authenticated user. Only conversations created with `enable_save_chat: true` are returned. Requires `CAN_USE_SPOTTER` privilege. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| +++Try it out+++ + +a|`GET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}` + +Retrieves the full message history of a single saved Spotter agent conversation, including user prompts and agent response items for each turn. Requires `CAN_USE_SPOTTER` privilege. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| +++Try it out+++ + +a|`POST /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/update` + +Updates the display title of a saved Spotter agent conversation. Requires `CAN_USE_SPOTTER` privilege and ownership of the conversation. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| +++Try it out+++ + +a|`DELETE /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/delete` + +Permanently deletes a saved Spotter agent conversation and all its associated messages. This operation is irreversible. Requires `CAN_USE_SPOTTER` privilege and ownership of the conversation. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| +++Try it out+++ + |===== -- @@ -596,6 +617,41 @@ ThoughtSpot Software: __Not available__ a| +++Try it out+++ + +a|`POST /api/rest/2.0/localizations/manual-translation/export` + +Exports all manual translations for the specified org scope as a CSV file. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| ++++Try it out+++ + +a|`POST /api/rest/2.0/localizations/manual-translation/locales/{locale}/export` + +Returns all manual translations for the specified locale as a JSON object. Accessible to all authenticated users. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| ++++Try it out+++ + +a|`POST /api/rest/2.0/localizations/manual-translation/delete` + +Deletes all manual translations for the specified org scope. +|ThoughtSpot Cloud: __26.7.0.cl or later__ + +ThoughtSpot Software: __Not available__ a| ++++Try it out+++ +|===== +-- + == Metadata [div boxAuto] @@ -1271,7 +1327,7 @@ a|ThoughtSpot Cloud: __10.14.0.cl or later__ a| a|`GET /api/rest/2.0/webhooks/storage-config` + Retrieves the AWS S3 storage destination configuration for a webhook. Returns data only if the webhook has a storage destination configured. Requires `ADMINISTRATION` or `DEVELOPER` privilege. -a|ThoughtSpot Cloud: __26.3.0.cl or later__ + +a|ThoughtSpot Cloud: __26.7.0.cl or later__ + ThoughtSpot Software: __Not available__ a| +++Try it out+++ diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 7c0f94ac1..b488ab953 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -50,7 +50,7 @@ The `GET /api/rest/2.0/webhooks/storage-config` API endpoint allows retrieving t Enhancements:: -* The `/api/rest/2.0/webhooks/create` endpoint allows configuring GCS storage destination for webhook delivery. The API endpoint also returns the GCS configuration details in response. +* The `/api/rest/2.0/webhooks/create` endpoint allows activating a webhook and configuring GCS storage destination for webhook delivery. The API endpoint also returns GCS storage configuration details in the response. * The `/api/rest/2.0/webhooks/{webhook_identifier}/update` API endpoint supports configuring webhook activate status, resetting authentication, signature verification, and storage destination properties. * API requests to the `/api/rest/2.0/system/communication-channels/validate` now return GCS storage properties in response. @@ -58,7 +58,6 @@ Enhancements:: The `/api/rest/2.0/jobs/history/communication-channels/search` API endpoint supports the `end_epoch_time_in_millis` parameter, which allows fetching records with a specific end timestamp. - === Style customization APIs ThoughtSpot introduces new public REST API v2.0 endpoints for programmatic style customization. These APIs allow embedding applications to upload custom fonts and configure visual styles at the cluster or Org level without using the ThoughtSpot Admin UI. @@ -75,6 +74,8 @@ Downloads all manually translated terms and labels in the Org context as a CSV f * `POST /api/rest/2.0/localizations/manual-translation/delete` + Deletes all manual translations from the Org. +For more information, see xref:manual-translation.adoc[Manual translations]. + == Version 26.6.0.cl, June 2026 === Spotter AI APIs diff --git a/modules/ROOT/pages/webhooks-api.adoc b/modules/ROOT/pages/webhooks-api.adoc index f068a8978..ac0f3754d 100644 --- a/modules/ROOT/pages/webhooks-api.adoc +++ b/modules/ROOT/pages/webhooks-api.adoc @@ -44,8 +44,7 @@ send webhook notifications. | `url_params` a|A JSON map of key-value pairs to append as query parameters in the webhook URL. | `events` a|__Array of strings__. List of events to subscribe to. Specify `LIVEBOARD_SCHEDULE`. | `status` + -__Optional__ a|__String__. Status of the webhook. Specify `ENABLED` to activate the webhook -immediately, or `DISABLED` to create it in a deactivated state. Available from 26.7.0.cl. +__Optional__ a|__String__. Status of the webhook. Specify `ENABLED` to activate the webhook immediately after creation, or `DISABLED` to create it in a deactivated state. When omitted, the status is not stored and will be absent from search results. Available from 26.7.0.cl. | `authentication` a|Defines the authentication method and credentials ThoughtSpot uses when sending HTTP requests to the webhook endpoint. @@ -80,8 +79,7 @@ Shared secret used for HMAC signature generation. | `storage_destination` + __Optional__ a|Configuration parameters for cloud storage destination. ThoughtSpot supports AWS S3 and Google Cloud Storage (GCS) as storage destinations. For more information, see xref:webhooks-s3-storage.adoc[Deliver Liveboard reports to AWS S3 storage] and xref:webhooks-gcs-storage.adoc[Deliver Liveboard reports to GCS storage]. |`additional_headers` + -__Optional__ a|__Array of key-value pairs__. Custom HTTP headers to include in every outbound. -Webhook request, in addition to authentication headers and standard HTTP headers such as +__Optional__ a|__Array of key-value pairs__. Custom HTTP headers to include in every outbound webhook request, in addition to authentication headers and standard HTTP headers such as `Content-Type` and `User-Agent`. [source,JSON] @@ -93,8 +91,6 @@ Webhook request, in addition to authentication headers and standard HTTP headers } ] ---- -| `status` + -__Optional__ a|__String__. Status of the webhook. Specify `ENABLED` to activate the webhook immediately after creation, or `DISABLED` to create it in a deactivated state. When omitted, the status is not stored and will be absent from search results. + |===== === Example request @@ -120,7 +116,6 @@ curl -X POST \ ---- === API response - If webhook creation is successful, the API returns a 204 response code. == Retrieving storage information for webhook configuration @@ -140,9 +135,9 @@ curl -X GET \ This API endpoint returns data based on whether the ThoughtSpot instance is hosted on AWS or GCP. -* For AWS hosted S3 storage, the API endpoint returns a JSON array with platform AWS account ID, IAM trust policy template, and storage setup instructions. -* For GCP-hosted S3 storage, the API endpoint returns a JSON array with -* For GCP-hosted GCS storage, the endpoint returns is a JSON array with the platform GCP service account email, the IAM role to grant for service account impersonation, and storage setup instructions. +* For AWS-hosted S3 storage, the API endpoint returns a JSON array with the platform AWS account ID, IAM trust policy template, and storage setup instructions. +* For GCP-hosted S3 storage, the API endpoint returns a JSON array with the GCP service account ID, OIDC provider URL, IAM trust policy template, and storage setup instructions. +* For GCP-hosted GCS storage, the API endpoint returns a JSON array with the platform GCP service account email, the IAM role to grant for service account impersonation, and storage setup instructions. ==== Top-level fields The following fields are included in the response, regardless of the storage provider. @@ -162,9 +157,9 @@ The response returned for AWS-hosted ThoughtSpot instances where the customer co * `aws_account_id`: The AWS account ID of the ThoughtSpot-managed AWS account. You must reference this value in the `Principal` field of the IAM trust policy you create in your AWS account. The policy grants ThoughtSpot's account permission to assume the IAM role that has write access to your S3 bucket. * `trust_policy_template`: A ready-to-use IAM trust policy JSON object. Attach this policy to the IAM role you create in your AWS account. The policy authorizes ThoughtSpot's AWS account (`aws_account_id`) to call `sts:AssumeRole` and deliver webhook payloads to your S3 bucket. The `sts:ExternalId` condition in the policy prevents unauthorized cross-account access (confused deputy attack). -** `Version`: The IAM policy language version,`2012-10-17`. +** `Version`: The IAM policy language version, `2012-10-17`. ** `Statement`: Includes the following information: -** `Effect`: Specifies whether the statement grants or denies access. Always `Allow` in this template. +*** `Effect`: Specifies whether the statement grants or denies access. Always `Allow` in this template. *** `Principal`: The ARN of the ThoughtSpot AWS account principal that is trusted to assume your IAM role. Constructed as `arn:aws:iam:::root`. *** `Action`: The AWS STS action being permitted. Always `sts:AssumeRole` for AWS-hosted instances. *** `Condition`: A unique, ThoughtSpot-generated external ID. Include this value as a condition in your IAM trust policy to prevent unauthorized parties from assuming your role. This value is unique per webhook and must be preserved exactly as returned. For example: @@ -226,7 +221,7 @@ This response returned for GCP-hosted ThoughtSpot instances where the customer c * `trust_policy_template`: A ready-to-use IAM trust policy JSON object for web identity federation. Attach this policy to the IAM role you create in your AWS account. The policy trusts the GCP-hosted OIDC provider (`accounts.google.com`) and restricts assumption to the specific ThoughtSpot GCP service account identified by `gcp_service_account_id`. Includes the following attributes: -** `Version`: The IAM policy language version,`2012-10-17`. +** `Version`: The IAM policy language version, `2012-10-17`. ** `Statement`: Array of IAM policy statements. Contains one statement that permits the ThoughtSpot GCP service account to assume the IAM role via OIDC federation. *** `Effect`: Specifies whether the statement grants or denies access. Always `Allow` in this template. *** `Principal`: The ARN of the OIDC identity provider registered in your AWS IAM account. Replace `YOUR_AWS_ACCOUNT_ID` in the template with your own AWS account ID before applying the policy. @@ -243,6 +238,7 @@ This response returned for GCP-hosted ThoughtSpot instances where the customer c * `config.setup_instructions`: An ordered list of steps to complete in your AWS account before using this storage destination. Follow these steps to register the OIDC provider, create the IAM role with web identity federation trust, and configure the required S3 permissions (`s3:PutObject`, `s3:PutObjectAcl`). ===== Example response + [source,JSON] ---- [ @@ -289,7 +285,6 @@ The storage information is returned for GCP-hosted ThoughtSpot instances where t * `required_role`: The GCP IAM role that must be granted to ThoughtSpot's service account (`service_account_email`) on your bucket-owning service account. Always `roles/iam.serviceAccountTokenCreator`. This role allows ThoughtSpot to create short-lived identity tokens for the impersonated service account without requiring the service account key to be shared. * `setup_instructions`: An ordered list of steps to complete in your GCP project before using this storage destination. Follow these steps to locate your bucket-owning service account, grant the `roles/iam.serviceAccountTokenCreator` role to ThoughtSpot's service account, and configure the GCS bucket in your webhook settings. - ===== Example response [source,json] @@ -315,18 +310,18 @@ The storage information is returned for GCP-hosted ThoughtSpot instances where t ] ---- -== Getting a list of webhooks +== Retrieving webhook details To view the properties of a webhook or get a list of webhooks configured on your instance, send a `POST` request to the `/api/rest/2.0/webhooks/search` API endpoint. By default, the API fetches a list of all webhooks available on the ThoughtSpot instance. To fetch webhooks created in a specific Org, specify the Org ID. -To get the details of specific webhook, specify the webhook ID in the API request. +To get the details of a specific webhook, specify the webhook ID in the API request. To filter results by the Webhook status, specify `ENABLED` or `DISABLED` in the `status` parameter as needed. === Example request -The following example shows the request body to fetch details of an active webhook: +The following example shows the request body to fetch webhook properties: [source,cURL] ---- @@ -338,28 +333,27 @@ curl -X POST \ --data-raw '{ "org_identifier": "Primary", "webhook_identifier": "27997a8a-cd33-485d-a039-b40b71d191a8", - "event_type": "LIVEBOARD_SCHEDULE" + "event_type": "LIVEBOARD_SCHEDULE", "status": "ENABLED" }' ---- === API response - -If the request is successful, the API returns details of the webhook: +If the webhook ID is valid, the API returns the following response: [source,JSON] ---- { "webhooks":[ { - "id":"27997a8a-cd33-485d-a039-b40b71d191a8", - "name":"UserA", + "id":"3791ad80-70e8-4222-bf11-fb8a5f1b5bf4", + "name":"webhook_s3", "description":null, "org":{ - "id":"0", - "name":"Primary" + "id":"2100019165", + "name":"docstest" }, - "url":"https://webhook-test-server-263n.onrender.com/", + "url":"https://webhook.site/6643eba5-9d3e-42a1-85e0-bb686ba1524d", "url_params":null, "events":[ "LIVEBOARD_SCHEDULE" @@ -367,18 +361,28 @@ If the request is successful, the API returns details of the webhook: "authentication":null, "signature_verification":null, "additional_headers":null, - "creation_time_in_millis":1773824614455, - "modification_time_in_millis":1781070122709, + "creation_time_in_millis":1772127694740, + "modification_time_in_millis":1772127859128, "created_by":{ - "id":"4e6e5692-667e-487d-9672-f301ccc2ea77", - "name":"UserA@thoughtspot.com" + "id":"08c6b203-ff6e-4ed8-b923-35ebbbfef27b", + "name":"userA@thoughtspot.com" }, "last_modified_by":{ - "id":"826b21a7-8ea2-4af9-b0bd-d1d6b604d07d", - "name":"UserA@thoughtspot.com" + "id":"08c6b203-ff6e-4ed8-b923-35ebbbfef27b", + "name":"userA@thoughtspot.com" }, - "storage_destination": null, - "status":"ENABLED" + "storage_destination":{ + "storage_type":"AWS_S3", + "storage_config":{ + "aws_s3_config":{ + "bucket_name":"my-company-data-exports", + "region":"us-east-1", + "role_arn":"arn:aws:iam::999888777666:role/thoughtspot-s3-upload", + "external_id":"ts-webhook-x7k9m2p4q1", + "path_prefix":"thoughtspot/" + } + } + } } ], "pagination":{ @@ -402,13 +406,13 @@ To update existing configuration, specify the following parameters in the API re * `events`: Event type that initiates the webhook delivery. * `url_params`: Key-value pairs for the URL query parameters. * `authentication`: Authentication type to use for authorizing webhook requests. -* `signature-verification`: Signature verification type. +* `signature_verification`: Signature verification type. * `storage_destination`: Storage configuration parameters for webhook delivery. * `additional_headers`: Custom headers to include in the request. * `status`: Activation state of the webhook. Specify `ENABLED` or `DISABLED`. -To reset configured values, specify properties to reset in `reset_options`.The `reset_options` attribute removes one or more optional configuration sections from the webhook without replacing the entire configuration. Supported values are: +To reset configured values, specify properties to reset in `reset_options`. The `reset_options` attribute removes one or more optional configuration sections from the webhook without replacing the entire configuration. Supported values are: * `AUTHENTICATION`: Removes the authentication configuration. * `SIGNATURE_VERIFICATION`: Removes the signature verification configuration. diff --git a/modules/ROOT/pages/webhooks-comm-channel.adoc b/modules/ROOT/pages/webhooks-comm-channel.adoc index ffd11f0e1..7cdb21bcc 100644 --- a/modules/ROOT/pages/webhooks-comm-channel.adoc +++ b/modules/ROOT/pages/webhooks-comm-channel.adoc @@ -300,9 +300,6 @@ curl -X POST \ ---- === Example response - -If the validation is successful, the API returns a response indicating the webhook channel validation state. - The following response shows validation status for a webhook channel: [source,JSON] @@ -326,7 +323,7 @@ The following response shows validation status for a webhook channel: } ---- -The following response shows the validation success and failure errors for a webhook channel with AWS s3 storage configuration: +The following response shows the validation success and failure errors for a webhook channel with AWS S3 storage configuration: [source,JSON] ---- @@ -376,7 +373,7 @@ In the API request, you must provide channel details such as channel type, ID, a |`job_ids` |__Array of strings__. One or more IDs of the job. To get the ID for a given webhook channel, check the API response from the `/api/rest/2.0/system/communication-channels/validate` endpoint. Required parameter if no channel identifier and event ID are specified in the API request. -|`channel_identifiers`|__String__. IDs or names of the communication channel. Required if no job ID is specified. +|`channel_identifiers`|__Array of strings__. IDs or names of the communication channel. Required if no job ID is specified. For webhook channels, specify the webhook ID. You can retrieve the webhook IDs from the `/api/rest/2.0/webhooks/search` API endpoint via an API request. |`channel_status` a|__String__. Status of the channel or the job. Specify one of the following values: @@ -389,7 +386,6 @@ Gets a list of jobs that were delivered successfully. * `FAILED` + Gets a list of failed job deliveries. - |`events` + __Optional__ a| Allows filtering API response by event type and ID. @@ -399,12 +395,12 @@ Event type for which the webhook delivery is triggered. Default is `LIVEBOARD_SC ID of the event. |`start_epoch_time_in_millis` |__Decimal__. Allows filtering API response by records that were created on or after the specified epoch milliseconds. -|`end_epoch_time_in_millis` |__Decimal__. Specify the endtime in epoch milliseconds to fetch records created before the specified timestamp. +|`end_epoch_time_in_millis` |__Decimal__. Specify the end time in epoch milliseconds to fetch records created before the specified timestamp. |===== === Example request -The following example shows the sample request with job ID. +The following example shows a sample request with a job ID. [source,cURL] ---- @@ -501,3 +497,4 @@ If the webhook channel has the S3 storage configured, the API returns the job st * xref:webhooks-lb-schedule.adoc[Deliver Liveboard reports to an external application]. * xref:webhooks-s3-storage.adoc[Deliver Liveboard reports to AWS S3 storage bucket]. +* xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery]. diff --git a/modules/ROOT/pages/webhooks-gcs-storage.adoc b/modules/ROOT/pages/webhooks-gcs-storage.adoc index 0a8fe6db6..4fc856beb 100644 --- a/modules/ROOT/pages/webhooks-gcs-storage.adoc +++ b/modules/ROOT/pages/webhooks-gcs-storage.adoc @@ -6,144 +6,271 @@ :page-pageid: webhooks-gcs-storage :page-description: Configure a Google Cloud Storage bucket to receive ThoughtSpot webhook payloads on GCP clusters. -// SOURCE: SCAL-301399, SCAL-304083, SCAL-310002 - -ThoughtSpot supports delivering webhook payloads directly to a **Google Cloud Storage (GCS) bucket** on GCP-hosted clusters. This allows you to capture and retain webhook event data — such as KPI Monitor alerts — without requiring a publicly reachable HTTP endpoint. +ThoughtSpot supports delivering webhook payloads directly to a Google Cloud Storage (GCS) bucket on Google Cloud Platform (GCP) hosted instances. When integrated, scheduled reports and files up to 25 MB can be sent to the configured GCS storage destination directly, without requiring a publicly reachable HTTP endpoint. [NOTE] ==== -GCS storage integration for webhooks is available for GCP-hosted ThoughtSpot clusters only. For AWS clusters, see xref:webhooks-s3-storage.adoc[Amazon S3 storage integration for webhook delivery]. +GCS storage integration for webhooks is available for GCP-hosted ThoughtSpot instances only. For information about S3 storage configuration, see xref:webhooks-s3-storage.adoc[Amazon S3 storage integration for webhook delivery]. ==== == Before you begin +Before configuring GCS storage for webhooks: -Before configuring GCS storage for webhooks, ensure that: - -* Your ThoughtSpot instance is hosted on GCP. -* You have a GCS bucket in the same GCP project or a project that allows cross-project IAM bindings. -* You have administrative access to your ThoughtSpot instance. -* The *Webhooks* feature is enabled on your cluster. Contact ThoughtSpot Support if it is not enabled. - -== Step 1: Retrieve the ThoughtSpot GCP Service Account +* Ensure that webhook connection configuration for GCS storage is enabled on your cluster. Contact ThoughtSpot Support if it is not enabled. +* For GCS storage destination configuration, you'll need the platform GCP service account email and the IAM role to grant for service account impersonation. To xref:webhooks-api.adoc#_retrieving_storage_information_for_webhook_configuration[retrieve these details], send a `GET` request to the `/api/rest/2.0/webhooks/storage-config` API endpoint. +* Ensure that you have a GCS bucket in the same GCP project or a project that allows cross-project IAM bindings. +* To configure a webhook in ThoughtSpot, you'll need a user account with administration privileges or the *Can Manage Webhooks* role privilege. Ensure that you have the required privileges to set up webhook connection and monitor delivery status. +* Ensure that a xref:webhooks-comm-channel.adoc[webhook communication channel] is configured in your Org or at the cluster level on your instance. -ThoughtSpot uses a managed GCP Service Account to write objects to your GCS bucket. You must grant this service account the appropriate IAM role on your bucket before webhook delivery can begin. - -Use the storage config REST API endpoint to retrieve the GCP Service Account email address: +== Grant service account impersonation permissions +In the GCP Console or using the `gcloud` CLI, grant the ThoughtSpot service account the `roles/iam.serviceAccountTokenCreator` role on your GCS-enabled service account: [source,bash] ---- -curl -X GET \ - 'https:///api/rest/2.0/webhooks/storage/config' \ - -H 'Authorization: Bearer ' +gcloud iam service-accounts add-iam-policy-binding \ + --member="serviceAccount:" \ + --role="roles/iam.serviceAccountTokenCreator" ---- -// TODO: verify with engineering — confirm the exact endpoint path for the get storage config API - -The response returns the GCP Service Account email in the following format: - -[source,json] ----- -{ - "gcp_service_account": "ts-webhook-@.iam.gserviceaccount.com" -} ----- +[NOTE] +==== +This grants ThoughtSpot's service account the ability to create short-lived credentials for your service account, enabling it to write to your GCS bucket on your behalf without requiring long-lived credentials to be shared. +==== -// TODO: verify with engineering — confirm the exact response field names for GCP Service Account details +== Configuring a webhook with GCS storage +To create a webhook in ThoughtSpot, the webhook feature must be enabled on your instance. Only ThoughtSpot users with administration privileges or the *Can Manage Webhooks* privilege are allowed to create or manage a webhook. -== Step 2: Grant IAM permissions on your GCS bucket +You can create a webhook with a cloud storage destination using the **Webhooks** page in the UI or through the create webhook REST API. -In the GCP Console or using the `gcloud` CLI, grant the ThoughtSpot service account the *Storage Object Creator* role on your GCS bucket: +=== Using REST API +To configure the GCS storage properties in ThoughtSpot, the service account email and GCS bucket name are required. -[source,bash] ----- -gcloud storage buckets add-iam-policy-binding gs:// \ - --member="serviceAccount:" \ - --role="roles/storage.objectCreator" ----- +To create a webhook, send a `POST` request to the `/api/rest/2.0/webhooks/create` API endpoint. [NOTE] ==== -ThoughtSpot requires write-only access to deliver payloads. The *Storage Object Creator* role is sufficient and follows the principle of least privilege. +ThoughtSpot allows only one webhook for the Liveboard Schedule event type per Org. ==== -== Step 3: Configure a webhook with GCS storage +==== Request parameters -Use the REST API to create or update a webhook, specifying your GCS bucket as the storage destination. +[width="100%" cols="1,6"] +[options='header'] +|==== +|Parameter|Description +| `name` a|__String__. Name of the webhook. +| `description` + +__Optional__ a|__String__. Description text for the webhook. +| `url` a|__String__. The listening endpoint URL where the webhook payload will be sent. The payload will include metadata and a URL referencing the file stored in GCS. +| `url_params` a|__Optional__. A JSON map of key-value pairs to append as query parameters in the webhook URL. +| `events` a|__Array of strings__. List of events to subscribe to. Specify the event as `LIVEBOARD_SCHEDULE`. When this event is emitted, a webhook payload is initiated to send data to the configured GCS storage destination. +| `storage_destination` a| Configuration for storage destination. Specify the following parameters: +* `storage_type` + +__String__. Type of storage destination. Specify `GCP_GCS`. + + +* `storage_config` + +Storage configuration parameters. For `gcp_gcs_config`, specify the following parameters: + +* `bucket_name` + +__String__. Name of the GCS bucket where webhook payloads will be stored. For example, `ts-webhook-exports`. +* `service_account_email` + +__String__. Email of the GCP service account to impersonate for bucket access. For example, `my-sa@my-project.iam.gserviceaccount.com`. The platform's service account must be granted `roles/iam.serviceAccountTokenCreator`. +* `path_prefix` __Optional__ + +__String__. Optional. Path prefix for organizing objects within the bucket. For example, `thoughtspot/`. + +|`additional_headers` + +__Optional__ a|__Array of key-value pairs__. Allows including custom HTTP headers in every outbound webhook HTTP request that ThoughtSpot sends to the configured destination URL. You can use this parameter to pass arbitrary headers with custom metadata in key-value pairs, as required by the webhook receiver endpoint: When configured, ThoughtSpot sends these headers in addition to the authentication headers and standard HTTP headers such as `Content-Type`, `User-Agent`. + +[source,JSON] +---- +"additional_headers": [ + { + "key":"X-Custom-Header", + "value":"custom_value" + } +] +---- +|==== -=== Create a webhook with GCS storage +==== API request -[source,bash] +[source,cURL] ---- curl -X POST \ - 'https:///api/rest/2.0/webhooks/create' \ - -H 'Authorization: Bearer ' \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/webhooks/create' \ + -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ - -d '{ - "name": "my-gcs-webhook", + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "name": "webhook-gcs", + "url": "https://webhook-destination-site.com", + "events": [ + "LIVEBOARD_SCHEDULE" + ], + "description": "Webhook delivery to GCS bucket", + "storage_destination": { + "storage_type": "GCP_GCS", "storage_config": { - "storage_type": "GCS", - "bucket_name": "", - "object_prefix": "thoughtspot-webhooks/" + "gcp_gcs_config": { + "bucket_name": "my-webhook-files", + "service_account_email": "my-sa@my-project.iam.gserviceaccount.com", + "path_prefix": "thoughtspot/" + } } - }' + }, + "status": "ENABLED" +}' ---- -// TODO: verify with engineering — confirm the exact request body schema for GCS storage_config, including all required and optional fields, and whether a URL field is required when GCS storage is used - -=== Update an existing webhook to use GCS storage +==== API response -[source,bash] +[source,JSON] ---- -curl -X PUT \ - 'https:///api/rest/2.0/webhooks//update' \ - -H 'Authorization: Bearer ' \ - -H 'Content-Type: application/json' \ - -d '{ - "storage_config": { - "storage_type": "GCS", - "bucket_name": "", - "object_prefix": "thoughtspot-webhooks/" - } - }' +{ + "id":"18835251-668b-4851-b5c7-35358549f3f4", + "name":"webhook-gcs", + "description":"Webhook for GCS delivery", + "org":{ + "id":"0", + "name":"test-org" + }, + "url":"https://webhook-destination-site.com", + "url_params":null, + "events":[ + "LIVEBOARD_SCHEDULE" + ], + "authentication":null, + "signature_verification":null, + "additional_headers":null, + "creation_time_in_millis":1782867500837, + "modification_time_in_millis":1782867500837, + "created_by":{ + "id":"59481331-ee53-42be-a548-bd87be6ddd4a", + "name":"tsadmin" + }, + "last_modified_by":null, + "storage_destination":{ + "storage_type":"GCP_GCS", + "storage_config":{ + "aws_s3_config":null, + "gcp_gcs_config":{ + "bucket_name":"my-webhook-files", + "service_account_email":"my-sa@my-project.iam.gserviceaccount.com", + "path_prefix":"thoughtspot/" + } + } + }, + "status":"ENABLED" +} ---- -// TODO: verify with engineering — confirm the update endpoint path and request body schema +=== Using Webhooks page in UI +If the new Webhooks page is enabled on your instance, you can create a webhook via UI. +To create a webhook with GCS as the target destination for payload delivery: + +. Go to **Develop** > **Customizations** and click **Webhooks**. +. In the *Webhooks* page, click *Create webhook*. +. In the *Create webhook* modal, configure the following: +* *Name*: A display name for the webhook. +* *URL*: The fully qualified HTTPS URL of the endpoint that will receive webhook payloads. +* *Description*: (optional) A short description of the webhook's purpose. +* *Event type*: Specify the ThoughtSpot event types to subscribe to. Ensure that *Liveboard schedule* is set as the event type. +. To configure storage destination, select the **File storage** checkbox and specify values for the following properties: + +* **Storage provider**: Select **Google Cloud Storage (GCS)**. +* **Bucket name**: Name of the S3 bucket. For example, `my-webhook-files`. +* **Service account email**: Email of the GCP service account to impersonate for bucket access. +* **Path prefix**: Optional. Path prefix for organizing objects within the bucket. For example, `thoughtspot/`. ++ +[.bordered] +[.widthAuto] +-- +image::./images/webhook-create-gcp.png[Webhooks for GCS storage] +-- +//. Select xref:webhooks-ux.adoc#_creating_a_webhook[the authentication method] to authorize payloads to the destination endpoint. + +. To configure xref:webhooks-ux.adoc#_creating_a_webhook[advanced settings] such as signature verification, custom headers, and URL query parameters, click **Advanced settings** and configure the fields as required. +. Click *Save*. + +If the webhook creation is successful, it will be added to the list in the Webhooks page. + +. To activate the webhook, use one of the following options: +* Select the webhook and click *Enable*. +* In the webhook row, from the More options menu (`...`), click **Enable**. == Webhook payload format in GCS - ThoughtSpot writes each webhook event as a separate object in your GCS bucket. Objects are named using the following pattern: ---- //-.json ---- -// TODO: verify with engineering — confirm the object naming convention and payload format for GCS deliveries +== Viewing webhook configuration details +To view the webhook details, use one of the following options: + +* Through the REST API: + +To retrieve webhook configuration details, use the xref:webhooks-api.adoc#_getting_a_list_of_webhooks[`/api/rest/2.0/webhooks/search` API endpoint]. +* Using the UI: + +If the **new Webhook experience** is enabled on your instance, go to the **Develop** > **Customization** > **Webhooks** page. Check the list in the xref:webhooks-ux.adoc#_managing_and_monitoring_webhooks_new_experience[**Webhooks**] to view the details and verify if the webhook connection is activated. -== Verify delivery +== Validating webhook channel configuration +To validate webhook configuration status, use one of the following options. +* Using REST API: +To validate the communication channel configuration for webhook delivery, use xref:webhooks-comm-channel.adoc#_validate_communication_channel_configuration[the `/api/rest/2.0/system/communication-channels/validate` API endpoint]. + +* Using the UI: + +If the new Webhook experience is enabled on your instance, go to the **Develop** > **Customization** > **Webhooks** page. The Webhooks page displays a list of webhooks configured in the current Org context. + +To validate the webhook channel configuration: +. In the **Webhooks** page, select the webhook row, and click **Send test event**. +. Verify the delivery status. + +If the validation returns errors, update the webhook configuration properties to resolve the errors. + +== Monitoring webhook delivery status +To monitor the webhook delivery and status, use one of the following options: + +* Through the REST API: + +To verify the webhook delivery and job status, use the `/api/rest/2.0/jobs/history/communication-channels/search` API endpoint. For more information, see xref:webhooks-comm-channel.adoc#_monitor_webhook_delivery_and_job_status[Monitor webhook delivery and job status]. + +* Using the UI: + +If your ThoughtSpot instance has new Webhooks page enabled, use the **Webhooks** menu option in the **Develop** page to view the details of the webhook: +. Go to the **Develop** > **Customization** > **Webhooks** page. + +The **Webhooks** page displays status cards and delivery rate for the webhooks configured in the Org. +. Click the webhook from the list and verify the delivery details. For more information, see xref:webhooks-ux.adoc#_monitoring_webhook_status[Monitoring delivery status]. + +== Verifying delivery To verify that ThoughtSpot is delivering webhooks to your GCS bucket: . In the GCP Console, navigate to your bucket and check for new objects. +. Verify whether the webhook payload is delivered to the correct bucket and prefix. . Review the object content to confirm the payload matches the expected schema. +. Verify the attachments and timestamps in the logs. +. If files are not delivered to your GCS bucket, check the logs for errors. -== Troubleshoot +== Troubleshooting errors [cols="2,3"] |==== | Issue | Resolution -| Objects are not appearing in the bucket -| Verify that the ThoughtSpot service account has the `roles/storage.objectCreator` IAM binding on the bucket. +| Objects are not delivered to the bucket +| This error occurs in the following scenarios: + +* When service account impersonation fails +* When the GCS write operation fails due to permission errors +* Webhook connection configuration errors + +To resolve: + +* Verify that the ThoughtSpot service account is granted the `roles/iam.serviceAccountTokenCreator` role on your GCS-enabled service account. +* Verify that your service account has write access to the GCS bucket. +* Verify that the service account email in the webhook configuration matches the service account used to grant permissions. | `permission denied` error in webhook logs | The service account may have been rotated. Retrieve the current service account email using the storage config API and re-grant IAM permissions. | Webhook is configured but not triggering -| Verify that the webhook is enabled and that the associated KPI Monitor alert condition is met. Contact ThoughtSpot Support if the issue persists. +| Verify that the webhook is enabled and that the alert condition for the scheduled event is met. Contact ThoughtSpot Support if the issue persists. |==== == Related topics - -* xref:webhooks-s3-storage.adoc[Amazon S3 storage integration for webhook delivery] -* xref:webhooks.adoc[Webhooks for KPI Monitor alerts] -* xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog] +* See also: xref:webhooks.adoc[Webhooks overview], xref:webhooks-ux.adoc[Webhooks UI], and xref:webhooks-api.adoc[Webhook APIs] documentation. +* link:https://cloud.google.com/storage/docs/access-control/iam-roles[Google Cloud Storage IAM roles, window=_blank] documentation. \ No newline at end of file diff --git a/modules/ROOT/pages/webhooks-lb-schedule.adoc b/modules/ROOT/pages/webhooks-lb-schedule.adoc index ecb3c8bd5..e577d5fbb 100644 --- a/modules/ROOT/pages/webhooks-lb-schedule.adoc +++ b/modules/ROOT/pages/webhooks-lb-schedule.adoc @@ -1,4 +1,4 @@ -= Delivering reports to external destination via webhooks += Delivering reports to an external destination via webhooks :toc: true :toclevels: 3 @@ -130,7 +130,7 @@ curl -X POST \ If webhook creation is successful, the API returns a 204 response code. === Through the Webhooks page in UI -If the new Webhooks page is enabled on your instance, you can create a webhook via UI. +If the new Webhooks page is enabled on your instance, you can create a webhook via the UI. ==== Creating a webhook To add a webhook for the Liveboard schedule events: @@ -159,55 +159,18 @@ Use this feature to pass arbitrary metadata required by your endpoint in additio * *URL parameters*: Specify the query parameters to append to the webhook URL on every request. . Click *Save*. + -If the webhook creation is successful, it will be added to table list in the Webhooks page. +If the webhook creation is successful, it will be added to the list in the Webhooks page. ==== Activating a webhook To activate the webhook, use one of the following options: * Select the webhook and click *Enable*. -* In the webhook row, from the More options menu (`...`), click **Enable*. +* In the webhook row, from the More options menu (`...`), click **Enable**. -[#test-webhook] -== Test a webhook +=== Test webhook connection and verify delivery +To validate the webhook channel configuration, use one of the following options: -Testing a webhook sends a synthetic payload to the configured endpoint to verify connectivity and -authentication. - -. Hover over the webhook row and click the actions menu (*...*). -. Select *Test*. -. Review the result in the *Test Event* modal. - -The modal displays one of the following outcomes: - -[width="100%" cols="1,4"] -[options='header'] -|===== -|Outcome|Description -|*Success*|The endpoint returned an HTTP 2xx response within the timeout window. -|*Authentication error*|The endpoint rejected the request due to invalid or missing credentials. -|*Timeout*|The endpoint did not respond within the allowed time window. -|*4xx error*|The endpoint returned a client error (for example, 400 Bad Request or 404 Not Found). -|*5xx error*|The endpoint returned a server error. -|===== - -[#verify-integration] -== Verify the integration - -After creating a webhook, verify the configuration using one of the following methods: - -=== Use the test event feature - -On the *Webhooks* page in the *Develop* tab, hover over the webhook row, click the actions -menu (*...*), and select *Test*. ThoughtSpot sends a synthetic payload to the configured -endpoint. For more information, see xref:webhooks-manage.adoc#test-webhook[Test a webhook]. - -=== Trigger a Liveboard schedule - -After the webhook is configured, ThoughtSpot delivers a payload to the webhook endpoint -whenever a Liveboard schedule job runs. You can verify delivery in the *Logs* tab on the -*Webhooks* page, or by checking your receiving endpoint directly. - -For information about scheduling a Liveboard, see -xref:schedule-liveboard.adoc[Schedule a Liveboard job]. - -For information about the webhook payload structure, see -xref:webhooks-payload.adoc[Webhook payload for Liveboard events]. \ No newline at end of file +* Use xref:webhooks-comm-channel.adoc#_validate_communication_channel_configuration[the `/api/rest/2.0/system/communication-channels/validate` API endpoint]. +* If the new Webhooks page is enabled on your instance, navigate to the **Webhooks** page, select the webhook row, and click **Send test event**. +.. Verify the delivery status. +.. If files are delivered to the configured URL endpoint, check the payload contents. For information about the webhook payload structure, see xref:webhooks-payload.adoc[Webhook payload for Liveboard events]. +.. If files are not delivered to the configured URL endpoint, check the logs for errors. \ No newline at end of file diff --git a/modules/ROOT/pages/webhooks-payload.adoc b/modules/ROOT/pages/webhooks-payload.adoc index 3aa527bec..942121d5c 100644 --- a/modules/ROOT/pages/webhooks-payload.adoc +++ b/modules/ROOT/pages/webhooks-payload.adoc @@ -1,4 +1,4 @@ -= Webhook payload for Liveboard events += Webhook payload for scheduled Liveboard events :toc: true :toclevels: 3 @@ -8,8 +8,8 @@ The payload contains metadata about the event, the source, the actor, the target object, and event-specific data. -== Payload example for S3 storage destination -When the schedule is configured with an S3 destination, ThoughtSpot delivers the exported file directly to S3, and the webhook payload only contains metadata JSON and the S3 object URL location. The JSON metadata includes the event type, object type, schedule name, recipients, and format. +== Payload contents for storage destinations +When the schedule is configured with a storage destination, ThoughtSpot delivers the exported file directly to the S3 or GCS bucket, and the webhook payload only contains metadata JSON and the storage object URL location. The JSON metadata includes the event type, object type, schedule name, recipients, and format. The supported file formats for webhook delivery are PDF, CSV, and XLSX. @@ -71,7 +71,7 @@ The supported file formats for webhook delivery are PDF, CSV, and XLSX. } ---- -The following content in the file attachment indicates successful delivery to the S3 storage destination: +The following content in the file attachment indicates successful delivery to the storage destination: [source,JSON] ---- @@ -101,7 +101,7 @@ The following content in the file attachment indicates successful delivery to th } ---- -The following examples show a failed delivery of file attachments due to access denied errors: +The following examples show partial or complete delivery failure of file attachments due to access denied errors: [source,JSON] ---- diff --git a/modules/ROOT/pages/webhooks-s3-storage.adoc b/modules/ROOT/pages/webhooks-s3-storage.adoc index 34080e241..9ced25f77 100644 --- a/modules/ROOT/pages/webhooks-s3-storage.adoc +++ b/modules/ROOT/pages/webhooks-s3-storage.adoc @@ -10,25 +10,7 @@ ThoughtSpot can deliver webhook payloads, such as scheduled Answer or Liveboard exports, as files written directly to your S3 storage. When integrated, ThoughtSpot supports delivering payloads of up to 25 MB directly to the storage destination configured on your instance. -== Before you begin - -Before you begin, review the following prerequisites and ensure that you have the required setup for webhook configuration: - -* Ensure that you have access to a ThoughtSpot instance with the Webhook feature enabled. -* Identify the environment in which your instance is deployed. Currently, S3 storage integration is supported in application instances hosted in one of the following environments: + -** ThoughtSpot instances hosted in Amazon Web Services (AWS) -** ThoughtSpot instances hosted in Google Cloud Platform (GCP) - -* Ensure that you have an AWS account where the target S3 bucket will be hosted. -* Ensure that you have AWS permissions to: -** manage IAM identity providers and roles, including trust policies -** attach or edit IAM policies -** read and write to the target S3 bucket to test and validate integration - -* To configure a webhook in ThoughtSpot, you'll need a user account with administration privileges or the *Can Manage Webhooks* role privilege. -* Ensure that a xref:webhooks-comm-channel.adoc[webhook communication channel] is configured in your Org or at the cluster level on your instance. - -== AWS-based ThoughtSpot instances +== S3 storage configuration for AWS-hosted ThoughtSpot instances If your ThoughtSpot instance is running in AWS, you can configure AWS cross-account access with an IAM role that AWS STS can assume by using temporary credentials. For webhook integration, the following configuration setup is required: @@ -99,10 +81,10 @@ In the permissions policy, specify the S3 bucket name. Optionally, to restrict a Note the IAM role ARN, bucket name, external ID, and other attributes and save the IAM policies. |==== -== GCP-based ThoughtSpot instances +== S3 storage configuration for GCP-hosted ThoughtSpot instances If your ThoughtSpot instance is hosted on a GCP cluster, you must configure OIDC and AWS STS `AssumeRoleWithWebIdentity` so that ThoughtSpot can securely obtain temporary AWS credentials to upload files to your S3 bucket, without storing long-lived AWS access keys. -For webhook integration, the following are required: +For webhook integration, the following information is required: [width="100%" cols="2,6"] [options='header'] @@ -111,11 +93,9 @@ For webhook integration, the following are required: | ThoughtSpot service account ID a| Contact ThoughtSpot Support to obtain your account ID. This account ID is required for OIDC identity creation and trust policy configuration. | AWS S3 bucket a| Create an S3 bucket or use an existing S3 bucket that you intend to use as a storage destination for ThoughtSpot exports. You can also add a prefix, for example, `thoughtspot-webhooks/`, to logically separate ThoughtSpot files. This serves as the S3 prefix for webhook delivery. | OIDC provider URL a| Add the OIDC identity provider URL in the AWS console. For example, `accounts.google.com`. - | AWS IAM role a| The IAM role that ThoughtSpot can assume via `AssumeRoleWithWebIdentity` during upload. **Web Identity trust policy** + - A trust policy that allows GCP service account via the identity provider. Ensure that the IAM role’s trust policy is restricted using `sub` (subject) and `aud` (audience) attributes: ** `sub`: ThoughtSpot GCP service account unique ID @@ -171,6 +151,7 @@ In the permissions policy, specify the role ARN and S3 bucket name. Optionally, ---- |==== + == Provide the storage configuration details to ThoughtSpot Provide the following information to your ThoughtSpot administrator: @@ -180,7 +161,18 @@ Provide the following information to your ThoughtSpot administrator: * S3 region. For example, `us-east-1` * S3 prefix for the folder (optional). For example, `thoughtspot/`. -== Configure a webhook for the S3 storage destination in ThoughtSpot +== Before you begin +Before you begin, review the following prerequisites and ensure that you have the required setup for webhook configuration: + +* Identify the environment in which your instance is deployed. For example, Amazon Web Services (AWS) and Google Cloud Platform (GCP). For S3 destination integration for webhook delivery, the platform AWS account ID and IAM trust policy template are required. To xref:webhooks-api.adoc#_retrieving_storage_information_for_webhook_configuration[retrieve these details], send a `GET` request to the `/api/rest/2.0/webhooks/storage-config` API endpoint. +* Ensure that you have an AWS account where the target S3 bucket is hosted with the following permissions: +** manage IAM identity providers and roles, including trust policies +** attach or edit IAM policies +** read and write to the target S3 bucket to test and validate integration +* To configure a webhook in ThoughtSpot, you'll need a user account with administration privileges or the *Can Manage Webhooks* role privilege. Ensure that you have the required privileges to set up webhook connection and monitor delivery status. +* Ensure that a xref:webhooks-comm-channel.adoc[webhook communication channel] is configured in your Org or at the cluster level on your instance. + +== Configuring a webhook for the S3 storage destination in ThoughtSpot To create a webhook in ThoughtSpot, the webhook feature must be enabled on your instance. Only ThoughtSpot users with administration privileges or the *Can Manage Webhooks* privilege are allowed to create or manage a webhook. You can create a webhook with a cloud storage destination using the **Webhooks** page in the UI or through the create webhook REST API. @@ -192,7 +184,7 @@ To create a webhook, send a `POST` request to the `/api/rest/2.0/webhooks/create [NOTE] ==== -ThoughtSpot allows only one webhook per Org. +ThoughtSpot allows only one webhook for the Liveboard Schedule event type per Org. ==== ==== Request parameters @@ -212,7 +204,7 @@ __Optional__ a|__String__. Description text for the webhook. __String__. Type of storage destination. Specify `AWS_S3`. + * `storage_config` + -Storage configuration parameters. Specify the storage configuration parameters from your AWS account administrator. +Storage configuration parameters. For `aws_s3_config`, specify the following parameters: * `bucket_name` + __String__. S3 bucket name. For example, `ts-data-exports` @@ -223,7 +215,7 @@ __String__. IAM role ARN. For example, `arn:aws:iam::999888777666:role/thoughtsp * `external_id` + __String__. The External ID string in IAM role trust policies that grant access to your AWS resources. For example, `ts-webhook-x7k9m2p4q1`. This parameter is required for AWS-hosted instances and is not applicable to GCP-hosted ThoughtSpot instances. * `path_prefix` __Optional__ + -__String__. S3 prefix for the folder. For example, `thoughtspot/`. +__String__. Path prefix for organizing objects within the S3 bucket. For example, `thoughtspot/`. |`additional_headers` + __Optional__ a|__Array of key-value pairs__. Allows including custom HTTP headers in every outbound webhook HTTP request that ThoughtSpot sends to the configured destination URL. When configured, ThoughtSpot sends these headers in addition to the authentication headers and standard HTTP headers such as `Content-Type`, `User-Agent`. @@ -278,48 +270,47 @@ If the API request is successful, ThoughtSpot returns the webhook configuration [source,JSON] ---- { - "id":"e63886a8-d468-4fc8-9c9b-a72bab6c4aee", - "name":"name6", - "description":null, + "id":"875f1497-fc98-436e-af59-28dc74dc324e", + "name":"webhook-S3", + "description":"Webhook for S3", "org":{ - "id":"0", - "name":"Primary" - }, - "url":"https://api.example.com/thoughtspot/webhook", - "url_params":{ - "key":"value" + "id":"2100019165", + "name":"test-org" }, + "url":"https://webhook-destination-site.com", + "url_params":null, "events":[ "LIVEBOARD_SCHEDULE" ], "authentication":null, "signature_verification":null, - "creation_time_in_millis":1772100928376, - "modification_time_in_millis":1772100928376, + "additional_headers":null, + "creation_time_in_millis":1782867817910, + "modification_time_in_millis":1782867817910, "created_by":{ - "id":"61b37746-a9bc-4433-b0cb-7a0e03225932", - "name":"demo_devuser" + "id":"08c6b203-ff6e-4ed8-b923-35ebbbfef27b", + "name":"user@thoughtspot.com" }, "last_modified_by":null, "storage_destination":{ "storage_type":"AWS_S3", "storage_config":{ "aws_s3_config":{ - "bucket_name":"ts-webhook-x7k9m2p4q1", + "bucket_name":"my-company-data-exports", "region":"us-east-1", "role_arn":"arn:aws:iam::999888777666:role/thoughtspot-s3-upload", "external_id":"ts-webhook-x7k9m2p4q1", "path_prefix":"thoughtspot/" - } + }, + "gcp_gcs_config":null } - } + }, + "status":"ENABLED" } ---- -=== Through the Webhooks page in UI +=== Using Webhooks page in UI If the new Webhooks page is enabled on your instance, you can create a webhook via UI. - -==== Creating a webhook To create a webhook with an AWS S3 storage as the target destination for payload delivery: . Go to **Develop** > **Customizations** and click **Webhooks**. @@ -329,240 +320,62 @@ To create a webhook with an AWS S3 storage as the target destination for payload * *URL*: The fully qualified HTTPS URL of the endpoint that will receive webhook payloads. * *Description*: (optional) A short description of the webhook's purpose. * *Event type*: Specify the ThoughtSpot event types to subscribe to. Ensure that *Liveboard schedule* is set as the event type. -. Configure the authentication method your destination endpoint requires. + -ThoughtSpot sends the configured credentials in every outbound request. The following options are available: -* *No Authentication*: No authentication headers are added to the request. Not recommended for production use. -* *OAuth 2.0*: ThoughtSpot obtains an access token using your OAuth client ID, client secret, and authorization URL, then sends `Authorization: Bearer ` in the request header. The token is refreshed automatically before expiry. -* *API Key*: ThoughtSpot sends the API key in the `X-API-Key` request header. -* *Bearer Token*: ThoughtSpot sends a static bearer token in the `Authorization: Bearer` header. -* *Basic authentication*: ThoughtSpot sends a Base64-encoded username and password in the `Authorization` header. -. Configure the file storage options. For more information, see xref:webhooks-s3-storage.adoc[AWS S3 storage integration for webhook delivery] and xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery]. -. Configure the advanced settings if required: -* *Signature verification* + -Specify the signature to send in the header for your endpoint to verify each request. Configure HMAC-SHA256 payload signing. ThoughtSpot signs each outbound -payload with a shared secret. Your endpoint can use the same secret and algorithm to verify the signature in the incoming request header. -* *Custom headers* + -Use this feature to pass arbitrary metadata required by your endpoint in addition to standard and authentication headers. Define key-value pairs of custom headers to add to every outbound HTTP request. -* *URL parameters*: -Specify the query parameters to append to the webhook URL on every request. +. To configure storage destination, select the **File storage** checkbox and specify values for the following properties: + +* **Storage provider**: For AWS S3 storage, ensure that **Amazon S3** is selected. +* **Bucket name**: Name of the S3 bucket. For example, `ts-webhook-x7k9m2p4q1`. +* **Region**: S3 region. For example, `us-east-1` +* **Role ARN**: AWS Role ARN. For example, `arn:aws:iam::999888777666:role/thoughtspot-s3-upload` +* **External ID**: External ID. For example, `ts-webhook-x7k9m2p4q1`. Required for configuring a webhook on ThoughtSpot instances hosted in AWS. Not applicable to ThoughtSpot instances on GCP. +* **Path prefix**: Optional. Path prefix for organizing objects within the S3 bucket. For example, `thoughtspot/`. ++ +[.bordered] +[.widthAuto] +-- +image::./images/create-webhook-s3.png[Webhooks creation] +-- +//. Select xref:webhooks-ux.adoc#_creating_a_webhook[the authentication method] to authorize payloads to the destination endpoint. + +. To configure xref:webhooks-ux.adoc#_creating_a_webhook[advanced settings] such as signature verification, custom headers, and URL query parameters, click **Advanced settings** and configure the fields as required. . Click *Save*. + -If the webhook creation is successful, it will be added to table list in the Webhooks page. - -==== Activating a webhook -To activate the webhook, use one of the following options: +If the webhook creation is successful, it will be added to the list in the Webhooks page. +. To activate the webhook, use one of the following options: * Select the webhook and click *Enable*. -* In the webhook row, from the More options menu (`...`), click **Enable*. - -=== View webhook configuration details - -To view the webhook configuration details, send a `POST` request to the `/api/rest/2.0/webhooks/search` API endpoint. - -If the API request is sent without parameters in the request body, ThoughtSpot returns the webhooks configured for the Org context in ThoughtSpot. - -==== Example request - -The following example shows the request body to fetch webhook properties: - -[source,cURL] ----- -curl -X POST \ - --url 'https://{ThoughtSpot-Host}/api/rest/2.0/webhooks/search' \ - -H 'Accept: application/json' \ - -H 'Content-Type: application/json' \ - -H 'Authorization: Bearer {AUTH_TOKEN}' \ - --data-raw '{ - "org_identifier": "testOrg1", - "webhook_identifier": "3791ad80-70e8-4222-bf11-fb8a5f1b5bf4", - "event_type": "LIVEBOARD_SCHEDULE" -}' ----- - -==== Example response -If the webhook ID is valid, the API returns the following response: - -[source,JSON] ----- -{ - "webhooks":[ - { - "id":"3791ad80-70e8-4222-bf11-fb8a5f1b5bf4", - "name":"webhook_s3", - "description":null, - "org":{ - "id":"2100019165", - "name":"docstest" - }, - "url":"https://webhook.site/6643eba5-9d3e-42a1-85e0-bb686ba1524d", - "url_params":null, - "events":[ - "LIVEBOARD_SCHEDULE" - ], - "authentication":null, - "signature_verification":null, - "additional_headers":null, - "creation_time_in_millis":1772127694740, - "modification_time_in_millis":1772127859128, - "created_by":{ - "id":"08c6b203-ff6e-4ed8-b923-35ebbbfef27b", - "name":"userA@thoughtspot.com" - }, - "last_modified_by":{ - "id":"08c6b203-ff6e-4ed8-b923-35ebbbfef27b", - "name":"userA@thoughtspot.com" - }, - "storage_destination":{ - "storage_type":"AWS_S3", - "storage_config":{ - "aws_s3_config":{ - "bucket_name":"my-company-data-exports", - "region":"us-east-1", - "role_arn":"arn:aws:iam::999888777666:role/thoughtspot-s3-upload", - "external_id":"ts-webhook-x7k9m2p4q1", - "path_prefix":"thoughtspot/" - } - } - } - } - ], - "pagination":{ - "record_offset":0, - "record_size":50, - "total_count":1, - "has_more":false - } -} ----- - - -=== Update the webhook configuration properties - -To update the S3 storage details configured for a webhook, send a `POST` request to the `/api/rest/2.0/webhooks/{webhook_identifier}/update` API endpoint. +* In the webhook row, from the More options menu (`...`), click **Enable**. -==== Request parameters - -Specify the `webhook_identifier` and pass it as a path parameter in the request URL. - -The API operation allows you to update the following webhook properties: - -* `name` + -Name of the webhook. -* `description` + -Description text of the webhook. -* `url` + -The URL of the webhook endpoint. -* `url_params` + -Query parameters to append to the endpoint URL. -* `events` + -Events subscribed to the webhook. In the current release, ThoughtSpot supports only the `LIVEBOARD_SCHEDULE` event. -* `storage_destination` + -S3 storage destination. -* `storage_type` + -Type of storage destination. Currently, only the Amazon S3 bucket is supported as the storage destination. -* `storage_config` + -S3 storage configuration parameters: +== Viewing webhook configuration details +To view the webhook details, use one of the following options: -==== API request +* Through the REST API: + +To retrieve webhook configuration details, use the xref:webhooks-api.adoc#_getting_a_list_of_webhooks[`/api/rest/2.0/webhooks/search` API endpoint]. +* Using the UI: + +If the **new Webhook experience** is enabled on your instance, go to the **Develop** > **Customization** > **Webhooks** page. Check the list in the xref:webhooks-ux.adoc#_managing_and_monitoring_webhooks_new_experience[**Webhooks**] to view the details and verify if the webhook connection is activated. -The following example shows the request body for updating the name, description text, and endpoint URL of a webhook object: +== Validating webhook channel configuration +To validate webhook configuration status, use one of the following options. -[source,cURL] ----- -curl -X POST \ - --url 'https://{ThoughtSpot-Host}/api/rest/2.0/webhooks/{webhook_identifier}/update' \ - -H 'Accept: application/json' \ - -H 'Content-Type: application/json' \ - -H 'Authorization: Bearer {AUTH_TOKEN}' \ - --data-raw '{ - "name": "name6", - "url": "https://api.example.com/thoughtspot/webhook", - "events": [ - "LIVEBOARD_SCHEDULE" - ], - "url_params": { - "key": "value" - }, - "storage_destination": { - "storage_type": "AWS_S3", - "storage_config": { - "aws_s3_config": { - "bucket_name": "ts-webhook-x7k9m2p4q1", - "region": "us-east-1", - "role_arn": "arn:aws:iam::999888777666:role/thoughtspot-s3-upload", - "external_id": "ts-webhook-x7k9m2p4q1", - "path_prefix": "thoughtspot/webhook" - } - } - } -}' ----- +* Using REST API: +To validate the communication channel configuration for webhook delivery, use xref:webhooks-comm-channel.adoc#_validate_communication_channel_configuration[the `/api/rest/2.0/system/communication-channels/validate` API endpoint]. -==== API response +* Using the UI: + +If the new Webhook experience is enabled on your instance, go to the **Develop** > **Customization** > **Webhooks** page. The Webhooks page displays a list of webhooks configured in the current Org context. + +To validate the webhook channel configuration: +. In the **Webhooks** page, select the webhook row, and click **Send test event**. +. Verify the delivery status. -If the API request is successful, the API returns a 204 response code indicating a successful operation. +If the validation returns errors, update the webhook configuration properties to resolve the errors. -== Validate webhook channel configuration -To validate the communication channel configuration, use the `/api/rest/2.0/system/communication-channels/validate` API endpoint. +== Monitoring webhook delivery status +To monitor the webhook delivery and status, use one of the following options: -For this API request, you'll need the webhook channel ID. To get the webhook ID, use the `/api/rest/2.0/webhooks/search` API endpoint. +* Through the REST API: + +To verify the webhook delivery and job status, use the `/api/rest/2.0/jobs/history/communication-channels/search` API endpoint. For more information, see xref:webhooks-comm-channel.adoc#_monitor_webhook_delivery_and_job_status[Monitor webhook delivery and job status]. -=== Example request -The following example sends validation request for a specific webhook channel with the S3 storage configuration. +* Using the UI: + +If your ThoughtSpot instance has new Webhooks page enabled, use the **Webhooks** menu option in the **Develop** page to view the details of the webhook: +. Go to the **Develop** > **Customization** > **Webhooks** page. + +The **Webhooks** page displays status cards and delivery rate for the webhooks configured in the Org. +. Click the webhook from the list and verify the delivery details. For more information, see xref:webhooks-ux.adoc#_monitoring_webhook_status[Monitoring delivery status]. -[source,cURL] ----- -curl -X POST \ - --url 'https://{ThoughtSpot-Host}/api/rest/2.0/system/communication-channels/validate' \ - -H 'Accept: application/json' \ - -H 'Content-Type: application/json' \ - -H 'Authorization: Bearer {AUTH_TOKEN}' \ - --data-raw '{ - "channel_type": "WEBHOOK", - "channel_identifier": "3791ad80-70e8-4222-bf11-fb8a5f1b5bf4", - "event_type": "LIVEBOARD_SCHEDULE" -}' ----- - -=== Example response - -If the webhook ID is valid, the API returns the validation status for the specified webhook channel. - -The following response shows the validation errors for a webhook channel that has the AWS S3 storage destination configured: - -[source,JSON] ----- -{ - "channel_type":"WEBHOOK", - "channel_id":"52314c1c-8d1d-40d1-8dba-3f77d219b41a", - "channel_name":"nebula-webhooks-gcp-05012026-webhook1", - "event_type":"LIVEBOARD_SCHEDULE", - "job_id":"n.validation-37688eaf-6cb1-4f7e-a6f2-0658c1d678eb", - "result_code":"PARTIAL_SUCCESS", - "details":[ - { - "validation_step":"STORAGE_FILE_UPLOAD_CHECK", - "status":"FAILED", - "http_status":null, - "error_message":"failed to assume role 'arn:aws:iam::123456789012:role/ThoughtSpotDeliveryRole': operation error STS: AssumeRole, https response error StatusCode: 403, RequestID: 8ba1a7a1-65c2-4901-8d4a-bf150687e92c, api error AccessDenied: User: arn:aws:sts::418295724037:assumed-role/cell-89b3a1c7-coms-lambda-role/cell-89b3a1c7-coms-api is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456789012:role/ThoughtSpotDeliveryRole. Ensure the role's trust policy allows ThoughtSpot and the External ID matches", - "aws_s3_info":{ - "bucket_name":"my-webhook-files", - "file_name":"validation_dummy_20260330_131030.pdf", - "object_key":"webhooks/cluster-abc/org-1/user-123/liveboard/report.pdf" - } - }, - { - "validation_step":"HTTP_CONNECTION_CHECK", - "status":"SUCCESS", - "http_status":200, - "error_message":null, - "aws_s3_info":null - } - ] -} ----- - -If the API returns validation errors, check your webhook configuration and update the S3 storage properties. For more information about configuration errors, see the xref:webhooks-s3-storage.adoc#_configuration_errors[troubleshooting] section. - -== Verify the integration +== Verifying webhook delivery Webhook delivery to an S3 storage destination includes the following sequence of events: . ThoughtSpot requests temporary AWS credentials by calling `sts:AssumeRole` (AWS setup) or `sts:AssumeRoleWithWebIdentity` (GCP) with your specified Role ARN and External ID. @@ -570,46 +383,37 @@ Webhook delivery to an S3 storage destination includes the following sequence of . If the request is valid, AWS STS issues temporary credentials, valid for approximately an hour. . ThoughtSpot uses these credentials to upload files to your designated S3 bucket. -Before testing the integration, validate the webhook connection using the `/api/rest/2.0/system/communication-channels/validate` API endpoint and check the connection status. - -If the validation returns errors, verify the configuration and xref:webhooks-s3-storage.adoc#_update_the_webhook_configuration_properties[update your webhook configuration]. See the xref:webhooks-s3-storage.adoc#_troubleshooting_errors[troubleshooting section] for information on resolving configuring errors. +To verify that ThoughtSpot is delivering webhooks to your S3 bucket: -If the connection status is successful: -. Trigger a Liveboard scheduled export to the configured S3 storage destination. -. In your S3 bucket: -* Confirm whether the webhook payload is delivered to the correct bucket and prefix. -* Verify the attachments and timestamps in the AWS event logs. +. Access your S3 bucket. +. Verify whether the webhook payload is delivered to the correct bucket and prefix. +. Review the object content to confirm the payload matches the expected schema. +. Verify the attachments and timestamps in the logs. . If files are not delivered to your S3 bucket, check the logs for errors. -== Monitor webhook delivery status -To monitor the webhook delivery and status, use the `/api/rest/2.0/jobs/history/communication-channels/search` API endpoint. For more information, see xref:webhooks-comm-channel.adoc#_monitor_webhook_delivery_and_job_status[Monitor webhook delivery and job status]. - -== Troubleshoot errors - +== Troubleshooting errors The common causes for webhook delivery failure are: -* Access denied errors -* Invalid external ID -* Webhook configuration errors in ThoughtSpot +[cols="2,4"] +|==== +| Issue | Resolution -=== Access denied errors -The access denied error occurs in the following scenarios: +| Objects not delivered to the bucket +| This occurs in the following scenarios: * When the IAM role assumption fails * When the S3 upload fails due to permission errors +* Webhook connection configuration errors To resolve IAM role assumption issues: * Ensure that the IAM trust policy includes the correct ThoughtSpot service account ID. + -For GCP clusters, the trust policy must use a federated principal. Verify that the OIDC provider URL and identity are configured for the ThoughtSpot service account ID (`THOUGHTSPOT_SA_UNIQUE_ID`). * Ensure that ThoughtSpot is assigned AWS credentials via `sts:AssumeRole` (for AWS) or `sts:AssumeRoleWithWebIdentity` (for GCP) for the specified Role ARN and External ID. To resolve S3 upload permission errors: Ensure that the IAM permission or S3 bucket policy allows the IAM role to write objects and has the correct S3 actions configured. To write content to the S3 bucket, the `s3:PutObject` permission is required. -=== Configuration errors - S3 uploads can also fail due to errors in webhook configuration in ThoughtSpot. ThoughtSpot can control which buckets can be accessed, what actions are permitted, and when to revoke access. However, ThoughtSpot cannot read files in existing S3 storage that is not integrated with webhooks, access other prefixes, or view or modify objects in the bucket. @@ -619,17 +423,15 @@ To ensure that there is no mismatch in the configuration: * Verify the external ID used in the webhook configuration. Note that external IDs are case-sensitive. * Ensure that the S3 bucket name and Role ARN configured in ThoughtSpot match the S3 bucket name and ARN of the IAM role in your AWS account. -=== Configuration compatibility -If you are using encryption, lifecycle policies, or special access controls, ensure that they are compatible with your webhook configuration. +| Webhook is configured but not triggering +| Verify that the webhook is enabled and that alert condition for the scheduled event is met. Contact ThoughtSpot Support if the issue persists. +| Configuration compatibility issues +|If you are using encryption, lifecycle policies, or special access controls, ensure that they are compatible with your webhook configuration. -== Webhook removal - -To delete a webhook, use the `/api/rest/2.0/webhooks/delete` REST API endpoint and specify the webhook ID in the `POST` request body. - -When you delete a webhook with S3 storage, the webhook endpoint is removed and any events or workflows configured to use that webhook can no longer deliver the payloads. Files already stored in S3 are not deleted as part of webhook deletion; only the delivery mechanism is removed. +|==== == Additional resources -* See also: xref:webhooks.adoc[Webhooks] and xref:webhooks-lb-schedule.adoc[Webhooks for Liveboard schedule events]. -* link:https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html[AWS IAM documentation] and link:https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_iam-s3.html[IAM and Amazon S3 troubleshooting guide]. +* See also: xref:webhooks.adoc[Webhooks overview], xref:webhooks-ux.adoc[Webhooks UI], and xref:webhooks-api.adoc[Webhook APIs] documentation. +* link:https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html[AWS IAM documentation, window=_blank] and link:https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_iam-s3.html[IAM and Amazon S3 troubleshooting guide, window=_blank]. diff --git a/modules/ROOT/pages/webhooks-ux.adoc b/modules/ROOT/pages/webhooks-ux.adoc index a739084fc..ae3c9e67b 100644 --- a/modules/ROOT/pages/webhooks-ux.adoc +++ b/modules/ROOT/pages/webhooks-ux.adoc @@ -9,8 +9,7 @@ The **Develop** page in ThoughtSpot UI provides the option to configure and manage webhooks. == Webhook configuration and management (New experience) - -The **Webhooks** option in the **Develop** page allows you to access the new **Webhooks** page. This page provides a centralized interface for creating, managing, and monitoring all webhooks in your ThoughtSpot Org. +The **Webhooks** option in the **Develop** page allows you to access the new **Webhooks** experience. This page provides a centralized interface with menu actions to create, edit, delete, enable, or disable a webhook, send test logs, verify delivery status and logs. [IMPORTANT] ==== @@ -19,37 +18,86 @@ The **Webhooks** option in the **Develop** page allows you to access the new **W * In the current version, the new experience allows creating and managing created webhooks for Liveboard Schedule events only. ==== -=== Creating a webhook -You can create a webhook for the Liveboard schedule event type a lightweight JSON payload and also send these as reports to a Cloud Storage destination in the file format supported by the Liveboard scheduled jobs. +=== Webhooks list page +The webhooks list includes the following columns: + +* *Name*: Display name of the webhook. +* *Events*: ThoughtSpot event types the webhook is subscribed to, such as `LIVEBOARD_SCHEDULE`. +* *Delivery status*: Summary of recent delivery outcomes for the webhook. +* *Status*: Current activation state of the webhook: *Enabled* or *Disabled*. Use the toggle to change the state without editing the webhook. +* *Creator*: ThoughtSpot user who created the webhook. +* *Last modified*: Date and time the webhook configuration was last updated. + +Note that ThoughtSpot allows only one webhook for Liveboard Schedule event type per Org. + +The actions available for the list items include: + +* *Sort*: Click any column header to sort the webhook list by that column. +* *Filter controls*: Use the column filter controls to narrow the list by name, state, creator, or other attributes. +* *Bulk selection*: Select multiple webhooks using the checkboxes to perform bulk actions. +* *Row-level actions*: Hover over a webhook row and click the actions menu (*...*) to edit, delete, test, enable, or disable the webhook connection. + +The following figure shows the Webhooks list and dashboard cards. + +[.bordered] +[.widthAuto] +-- +image::./images/webhooks-dashboard.png[Webhooks dashboard] +-- + +For each item in the webhooks list, the following actions are available: + +* *Edit*: Opens the webhook edit panel +* *Enable*: Enables selected webhooks. +* *Disable*: Disables selected webhooks. +* *Send test event*: Sends a test payload to all selected webhook endpoints. +* *Delete*: Deletes the selected webhooks. + +To enable, disable, edit, or delete the webhook configuration, select the webhook in the list, and use the options available for in the More options (`...`) menu. + +=== Creating a webhook connection +The **Create webhook** option allows you to create a webhook for the Liveboard schedule event type. Only one webhook can be created per Org. + +The webhook creation workflow allows configuring webhook properties, including authentication parameters, storage destination, signature verification, custom headers, and URL parameters. + +You can create a webhook for the Liveboard schedule event type to send a lightweight JSON payload and also send these as reports to a Cloud Storage destination in the file format supported by the Liveboard scheduled jobs. To create a webhook: . Go to **Develop** > **Customizations** and click **Webhooks**. . In the *Webhooks* page, click *Create webhook*. -. In the *Create webhook* modal, configure name, webhook endpoint, event type, authentication options and other parameters as needed. For more information about the configuration parameters, see the following pages: - -* xref:webhooks-lb-schedule.adoc[Webhooks for Liveboard Scheduled Jobs]. -* xref:webhooks-s3-storage.adoc[AWS S3 storage integration for webhook delivery] -* xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery] +. In the *Create webhook* modal, configure name, webhook endpoint, event type, authentication options and other parameters as needed. +. To deliver webhook reports to a Cloud storage destination, select **File storage** and define storage configuration parameters. For more information, see xref:webhooks-s3-storage.adoc[AWS S3 storage integration] and xref:webhooks-gcs-storage.adoc[GCS storage integration]. +. Specify the authentication type to authorize webhook delivery. + +ThoughtSpot sends the configured credentials in every outbound request. The following options are available: +* *No Authentication*: No authentication headers are added to the request. Not recommended for production use. +* *OAuth 2.0*: ThoughtSpot obtains an access token using your OAuth client ID, client secret, and authorization URL, then sends `Authorization: Bearer ` in the request header. The token is refreshed automatically before expiry. +* *API Key*: ThoughtSpot sends the API key in the `X-API-Key` request header. +* *Bearer Token*: ThoughtSpot sends a static bearer token in the `Authorization: Bearer` header. +* *Basic authentication*: ThoughtSpot sends a Base64-encoded username and password in the `Authorization` header. +. Optionally, configure the advanced settings as required: +* **Signature verification**: Specify the signature to send in the header for your endpoint to verify each request. Configure HMAC-SHA256 payload signing. ThoughtSpot signs each outbound payload with a shared secret. Your endpoint can use the same secret and algorithm to verify the signature in the incoming request header. +* *Custom headers*: Use this feature to pass arbitrary metadata required by your endpoint in addition to standard and authentication headers. Define key-value pairs of custom headers to add to every outbound HTTP request. +* *URL parameters*: Specify the query parameters to append to the webhook URL on every request. . Click **Save**. -=== Activating a webhook +=== Activating a webhook connection To activate the webhook, use one of the following options: * Select the webhook and click *Enable*. -* In the webhook row, from the More options menu (`...`), click **Enable*. +* In the webhook row, from the More options menu (`...`), click **Enable**. -=== Editing a webhook +=== Editing a webhook connection To edit webhook properties: . Use one of the following options to open the edit panel: * Select the webhook and click *Edit*. -* In the webhook row, from the More options menu (`...`), click **Edit*. +* In the webhook row, from the More options menu (`...`), click **Edit**. . Update the fields as required. . Click **Save**. [NOTE] ==== -To clear an authentication, signature verification, or storage destination configuration entirely without replacing it, you can use the `reset_options` parameter in the xref:webhooks-lb-schedule.adoc[update webhook REST API]. +To clear an authentication, signature verification, or storage destination configuration entirely without replacing it, you can use the `reset_options` parameter in the xref:webhooks-api.adoc#_updating_a_webhook[update webhook REST API]. ==== === Deleting a webhook @@ -60,53 +108,34 @@ To clear an authentication, signature verification, or storage destination confi Deleting a webhook is permanent. Delivery logs associated with the webhook are removed when they reach the 3-day retention limit. -=== Managing and monitoring Webhooks (New experience) -The new **Webhooks** page displays the following options: - -Webhooks list:: -Displays a list of webhooks configured in the Org. Note that ThoughtSpot allows only one webhook for Liveboard Schedule event per Org. The list includes the following columns: - -* *Name*: Display name of the webhook. -* *Events*: ThoughtSpot event types the webhook is subscribed to, such as `LIVEBOARD_SCHEDULE`. -* *Delivery status*: Summary of recent delivery outcomes for the webhook. -* *Status*: Current activation state of the webhook: *Enabled* or *Disabled*. Use the toggle to change the state without editing the webhook. -* *Creator*: ThoughtSpot user who created the webhook. -*Last modified*: Date and time the webhook configuration was last updated. - -For each item in the webhooks list, the following actions are available: - -* *Edit*: Opens the webhook edit panel -* *Enable*: Enables selected webhooks. -* *Disable*: Disables selected webhooks. -* *Send test event*: Sends a test payload to all selected webhook endpoints. -* *Delete*: Deletes the selected webhooks. - -Webhook configuration options:: -The **Create webhook** option to create a webhook for the Liveboard schedule event type. Only one webhook can be created per Org. To configure and manage webhooks, the *Can manage webhooks* (`CAN_MANAGE_WEBHOOKS`) privilege is required. - -The webhook creation workflow allows configuring webhook properties, including authentication parameters, storage destination, signature verification, custom headers, and URL parameters. - -To enable, disable, edit, or delete the webhook configuration, select the webhook in the list, and use the options available for in the More options (`...`) menu. - -Webhook details:: -Provides a dashboard view with the following cards. The cards are refreshed every 60 seconds. +=== Monitoring webhook status +The **Webhooks** page provides a dashboard view with cards indicating the delivery statistics. These cards are refreshed every 60 seconds. * *Delivery rate*: Percentage of webhook delivery attempts that succeeded. * *Failed*: Total count of delivery attempts that failed or resulted in an error. * *In Retry Queue*: Count of delivery attempts currently queued for retry. * *Pending*: Count of delivery attempts awaiting dispatch. -Actions for the webhook list items:: -The following actions are available for the list items in the Webhooks page: +To view delivery status of a specific webhook, click the webhook to open the delivery details page. -* *Sort*: Click any column header to sort the webhook list by that column. -* *Filter controls*: Use the column filter controls to narrow the list by name, state, creator, or other attributes. -* *Bulk selection*: Select multiple webhooks using the checkboxes to perform bulk actions. -* *Row-level actions*: Hover over a webhook row and click the actions menu (*...*) to edit, -delete, test, enable, or disable that webhook. +To filter the list, click **Add filter** and select any of the following options: + +* **Delivery status**: Filters the webhooks list by their delivery status. +* **Sent**: Allows filtering the list by webhook deliveries that were sent in the last 1, 2, 4, or 8 hours, or last 1, 2, or 3 days. By default, logs are retained for 3 days. + +[.bordered] +[.widthAuto] +-- +image::./images/webhooks-list-filter.png[Webhooks list] +-- + +To view the log details of a specific webhook delivery, click **View details**. The **Log details** modal shows details such as the event name, type, timestamp, ID, delivery status, payload properties and retry history. -UI Options in the webhook page:: -Clicking a webhook in the list opens a page that displays the options to filter webhook deliveries by their delivery status. To view the logs, click **View details**. +[.bordered] +[.widthAuto] +-- +image::./images/webhook-log.png[Webhooks log] +-- == Webhook configuration and management (Legacy experience) The **Legacy Webhooks** page allows you to create, view, and edit webhooks created for KPI alerts. These webhooks are managed through the UI and can be selected as custom channels when configuring KPI alert notifications in the UI. For more information, see xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. @@ -121,7 +150,7 @@ To register a webhook in ThoughtSpot, complete the following steps: . Go to **Develop** > **Customizations** > **Legacy Webhooks**. . Click **Create Webhook**. -. In the ** Create Webhook** modal, specify the Webhook name and the URL of the destination application. +. In the **Create Webhook** modal, specify the Webhook name and the URL of the destination application. + For testing purposes, you can use a URL from the link:https://webhook.site/[Webhook site, window=_blank]. . Specify the authentication type. @@ -131,9 +160,9 @@ Default authentication option. Not recommended for production environments. * API Key + Allows using an API key to authenticate API requests to the destination URL. Specify the API key to use in the `X-API-Key` request header. -* OAuthentication 2.0 + +* OAuth 2.0 + Allows using OAuth credentials to authorize API requests. Specify client ID, client secret key, and authorization URL. -If the registered webhook has Oauth authentication enabled, `Authorization: Bearer ` is sent in the request header. +If the registered webhook has OAuth authentication enabled, `Authorization: Bearer ` is sent in the request header. . If the destination URL requires query parameters to be passed in the request URL, specify the parameters as key-value pairs. . Click **Save**. . xref:webhooks-kpi-alerts.adoc#_assign_webhook_to_a_kpi_monitor_alert[Assign webhook to a KPI Monitor alert]. @@ -142,7 +171,7 @@ If the registered webhook has Oauth authentication enabled, `Authorization: Bear To edit webhook properties: . In the **Legacy Webhooks** page, select the webhook to edit. -. In the webhook row, click More options menu (`...`) > **Edit*. +. In the webhook row, click More options menu (`...`) > **Edit**. . Update the fields as required. . Click **Save**. diff --git a/modules/ROOT/pages/webhooks.adoc b/modules/ROOT/pages/webhooks.adoc index 38b834f81..673d79d3b 100644 --- a/modules/ROOT/pages/webhooks.adoc +++ b/modules/ROOT/pages/webhooks.adoc @@ -6,20 +6,15 @@ :page-pageid: webhooks :page-description: Use webhooks to send real-time event notifications from ThoughtSpot to external applications, communication channels, and cloud storage destinations -A webhook is ThoughtSpot provides a way to deliver data and reports to a target application, URL endpoint, or storage destination and is triggered by events such as scheduled Liveboard jobs. +ThoughtSpot webhooks provide a way to deliver data and reports to a target application, URL endpoint, or storage destination, triggered by events such as scheduled Liveboard jobs. == Overview - ThoughtSpot allows using webhooks for the following purposes: Liveboard schedule notifications [beta betaBackground]^Beta^:: ThoughtSpot supports using webhooks to deliver scheduled Liveboard notifications to external applications and communication channels. For more information, see xref:webhooks-lb-schedule.adoc[Deliver Liveboard reports to an external application]. -KPI monitor alerts:: - -You can use a webhook to trigger KPI monitor alerts to an external application when a KPI metric meets a threshold condition or changes value. For more information, see xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. - Webhook delivery to Cloud Storage destinations:: ThoughtSpot supports delivering webhook payloads to the following cloud storage destinations: + @@ -27,6 +22,9 @@ ThoughtSpot supports delivering webhook payloads to the following cloud storage xref:webhooks-s3-storage.adoc[Deliver content to cloud storage using webhooks]. * *Google Cloud Storage (GCS)*: Available on GCP-hosted ThoughtSpot Cloud instances. For more information, see xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery]. +KPI monitor alerts:: +You can use a webhook to trigger KPI monitor alerts to an external application when a KPI metric meets a threshold condition or changes value. For more information, see xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. + == Webhook configuration and management ThoughtSpot supports creating and managing webhooks through the UI or REST APIs. @@ -34,6 +32,7 @@ ThoughtSpot supports creating and managing webhooks through the UI or REST APIs. ==== * To set up a webhook for Liveboard schedule notifications, you must first configure the xref:webhooks-comm-channel.adoc[webhook communication channel using the communication-channel preferences API]. * Only one webhook configuration is allowed per Org. +* To configure and manage webhooks, `ADMINISTRATION` (**Can administer ThoughtSpot**) or *Can manage webhooks* (`CAN_MANAGE_WEBHOOKS`) privilege is required. ==== === Webhooks UI @@ -54,12 +53,10 @@ The new *Webhooks* option in the *Develop* page provides centralized view of web For more information, see xref:webhooks-ux.adoc[Webhook configuration and management through the UI]. * **Legacy Webhooks**: -The **Legacy webhooks** page displays a list of webhooks created for KPI alerts and the menu actions to create, view, and edit the webhooks created for KPI alerts. These webhooks are managed through the UI and can be selected as custom channels to send KPI alerts when a KPI metric meets the threshold. For more information, see xref:webhooks.adoc[Webhook configuration and management through the UI] and xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. +The **Legacy webhooks** page displays a list of webhooks created for KPI alerts and the menu actions to create, view, and edit the webhooks created for KPI alerts. These webhooks are managed through the UI and can be selected as custom channels to send KPI alerts when a KPI metric meets the threshold. For more information, see xref:webhooks-ux.adoc#_webhook_configuration_and_management_legacy_experience[Webhook configuration and management through the UI] and xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. === Webhook REST APIs -The REST API framework is intended for automation and integration scenarios, for example, creating webhooks programmatically or delivering Liveboard report attachments to a cloud storage destination. See the following for more information: -xref:webhooks-lb-schedule.adoc[Deliver Liveboard reports to an -external application] for REST API reference and examples. +The REST API framework is intended for automation and integration scenarios, for example, creating webhooks programmatically or delivering Liveboard report attachments to a cloud storage destination. For REST API reference and examples, see xref:webhooks-lb-schedule.adoc[Deliver Liveboard reports to an external application] and xref:webhooks-api.adoc[Webhook REST APIs]. == Webhook delivery behavior When ThoughtSpot attempts to deliver a webhook event, the destination endpoint must respond with an HTTP 2xx status code within 5 seconds to confirm successful receipt. @@ -68,7 +65,7 @@ If the endpoint takes longer than 5 seconds to respond, returns a non-2xx status To ensure a timely response, process webhook payloads asynchronously. Your server can return a 2xx response immediately on receipt and handle the payload in the background, without blocking subsequent webhook deliveries. -For information about retry behavior and delivery logs, see xref:webhooks-manage.adoc[Manage webhooks]. +For information about retry behavior and delivery logs, see xref:webhooks-ux.adoc[Manage webhooks]. == Webhook payload diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 27e192c4d..a3aee3e0a 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -41,17 +41,18 @@ For SpotterViz customization in embedded view, the Visual Embed SDK also provide --- [discrete] -==== Spotter file upload in embedded apps [.version-badge.new]#New# +==== Org isolation for per-org SAML and OIDC authentication +ThoughtSpot now enforces strict org isolation when users authenticate through a per-org identity provider (IdP). When a per-org IdP sends SAML or OIDC group claims that reference Orgs outside its authorized scope, ThoughtSpot silently drops those claims and records them as security audit events. This prevents a rogue IdP administrator in one Org from using group assertions to gain unauthorized access to another Org. Existing manually-assigned org memberships are unaffected. -Embedded Spotter applications can now allow users to upload files directly in the Spotter chat panel. The SDK introduces two new configuration parameters in `SpotterChatViewConfig` to enable and control this capability: +[discrete] +==== Spotter file upload in embedded apps [.version-badge.new]#New# +Applications embedding Spotter interface can now allow their users to xref:embed-spotter.adoc#_enable_file_upload_in_spotter_chat[upload files directly in the Spotter chat panel]. The SDK introduces two new configuration parameters in `SpotterChatViewConfig` to enable and control this capability: * `spotterFileUploadEnabled`: + When set to `true`, enables the file upload feature in the Spotter chat panel. * `spotterFileUploadFileTypes`: + Restricts the file types allowed for upload. Accepts a `SpotterFileUploadFileTypes` object. -For more information, see xref:embed-spotter.adoc#_enable_file_upload_in_spotter_chat[Enable file upload in Spotter chat]. - --- [discrete] @@ -89,25 +90,13 @@ The update webhook API now supports a `reset_options` parameter, which removes s The Liveboard browser cache feature is now in Early Access. When `enableLiveboardDataCache` is set to `true` in your `LiveboardEmbed` configuration, ThoughtSpot caches Liveboard visualization data in the browser to significantly reduce reload times on revisit. For SDK event and action IDs, see the xref:api-changelog.adoc#_liveboard_browser_cache_refresh[Visual Embed changelog — Liveboard browser cache refresh]. - --- [discrete] -==== Saved Chat public APIs [.version-badge.new]#New# - -// SOURCE: SCAL-290720, SCAL-313991 - -ThoughtSpot now provides public REST API endpoints and Visual Embed SDK host events to manage saved Spotter conversations from a host application. Embed developers can build fully headless conversation history experiences outside the ThoughtSpot iframe. - -New REST API endpoint::: -`GET /api/rest/2.0/ai/agent/conversations` — Retrieve a paginated list of saved conversations for the authenticated user. - -New SDK host events::: -* `HostEvent.LoadChat` — Load a specific conversation by ID into the embedded Spotter interface. -* `HostEvent.DeleteChat` — Delete a specific conversation by ID. -* `HostEvent.RenameChat` — Rename a specific conversation by ID. +==== Spotter conversation history [.version-badge.new]#New# +You can now save your Spotter conversation and manage chat history using Spotter AI REST APIs. For more information, see xref:saved-conversations-api.adoc[Saved Chat public APIs]. -For more information, see xref:saved-conversations-api.adoc[Saved Chat public APIs]. +For embedding applications using Spotter interface, Visual Embed SDK provides a set of host events to programmatically manage saved conversations. --- diff --git a/static/doc-images/images/create-webhook-s3.png b/static/doc-images/images/create-webhook-s3.png new file mode 100644 index 0000000000000000000000000000000000000000..1d29b6fd21d64c47ae4861b472177f5daa709faa GIT binary patch literal 182370 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

9m8niuzv=4RS2G` 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

~beC#M} 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%0AT1`g!vQ0!`KTTxi9Pn9Ps|s{GrfCyDM4EcY6p) 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 literal 0 HcmV?d00001 diff --git a/static/doc-images/images/webhook-log.png b/static/doc-images/images/webhook-log.png new file mode 100644 index 0000000000000000000000000000000000000000..f75c8f10e736137ccf29115739ae8c094d74794b GIT binary patch literal 148179 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 C`ZbOK literal 0 HcmV?d00001 diff --git a/static/doc-images/images/webhook-sent-filter.png b/static/doc-images/images/webhook-sent-filter.png new file mode 100644 index 0000000000000000000000000000000000000000..791e4ea1b3fd51a47b95cd65489d8610938e6b74 GIT binary patch literal 97143 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%0A=vf`cxO?<0iT2z16BEK0u?;51tc8#}E z1}nSW?ezDuuZIgsvP>}xPg#Te==@|f9?07r1&BQ>dF#)K4s7j8>Smb$j+Z9r6lx7@ zOxOi6+-uyZWt_qcJkNt-Hr%Y}>@=aZqqsh06&k`JkGFY=$w-@E*=IH@-!XNi9v$9; zr*BlYDj=?o+St zzhz;+H7HYn5zHTlXmr3r7C&nhsxtcoOO|7(PSkF-+ZqTdi-+T zvA=gE%N;}WX0j*GkCgG!a#PdMy}a6H_;$%J2Q8sI*FSHeRRM4`$WG`>t?a$3lEfn*hAIunUbtSk}dW<@c;}5)Eihh@*wF2&r=%M?kN=ZT) zq8W@EV4+&O<=>%NE}cooAB+p+FM-<7*jQN0(nxf;&II4Q{}d-0qM|l>(EJFipmrpa zNhl(9dw3-MQz$%#T!auv!6UFpjPwjaJeNuH#bbRqM;w-^ z`=d2O`fqRx&k}h{{VFCVIi4f>xU_G!>b16@aQ5pA3-*IDxiNCh1rH@`q%w z$8Ci)XM}e({Og^lO1|VXO}=jZhpCT`1n|WhVNLnYb1PDRcNK>`4k;mBx^JhS`#^=n zGXKH>P|x1uKLPiD?>zo{0SW1_IuQ6h6vLMWLc?? z022Coy!l^a^IxO%>k}bI+;WJtKQ)n;>D_QZ8c}`6plV0V`Ckf81SDTZKU&|kyZX9QOsUZe zi(X-dF)?0mcJSe_EJ0N4Epdrw@i6i>1tlGwZ!kXlk?Fj;56Gj`<6bF&oNB0a9kU!+ zAs-5IrScbf>=wtI^x4vuC^x!Q|3ookbStt(at8GhW?^iwc@7Gft+xk%t=?l*2L@<;mtsME2=ff40`|3#Ji zclVNvpT=+K$^qN+P4?FaX7J;u5n^WENBOt2_|HK8zyD;tM?|s|v268m;QYn?>p3J$ zUjl&Y&~F(me|`&tD^#6iFxbp(vee_%U`rqFp)p_d)wlS^Jw7E9X7q z%-8Q?qN5WE5xCC^wqq4p*LjUZXkwH1bUQL7IfSiy;%RyHVR(96J|Kj^-8%y94&1n* zRb#)bBWjC3bHTlPNFUU+p6I7!=gC%iNt20b zz5rABwpP_s(eYLbNT7^o$}P!2gGfAoY0G@{tQS1x{)ct_>o%6Lc&poVgQGvI|)&x2(#p^o5W$_0K`XAaYmAfBg*5P5euS6u%$_D4z@L#sksTpEIZ^W1s zk@p2pQM1IlEILkZHzB>tS+lH@?*dh`{7=m5wyLb*USPxj<4VlHb9jbU0wHiz#nq=FC^V0mc`ORlt2rQ-QM)UU-@ySLW=#iOs-93+PmG z`)H(ea(ems4bQA<(w-D$uMQh<;bZoP;kn67il7IB$*Y*b^LoVSgy_@!ki;aV|NSXM zl^X9VA6DRN=<(^!Eeh7~RFv*ww{Gz=o&d50W1H>vk-r>3Zb;9kMr&w}kH@;;L%wv3-$Dt9-6aFQ=@&~+jfv77G&%Yh%*gf%iA%#W0Y zv=8Osxvh$$yk!ZcoG+2=GEsPJx-0e$=>7aGh@V3x*;Q=ZhuojyY~IFiY1gI&?Pax6 z(lFxi<#O0k3$FZE$+M+9aR2+L_s#w&=K2m7Ru??YYQex1zr4ib>O7GA;&Nt=CDLaL z8?`e}$u}kshD<2Si9d(_%f|HAI{9VAp?E94`sfrz18;iR3^wyMn#dT{a!+M8XBZ1u zPX#+_G=j}G1hOgp;W7)9a;FQ#yUv?l?@T7vsJZn@K9Mg3{oH-t1mE(JxqGI1Dqo~i z$R2i?BCeEEac}7VWA8n~n#{I8P(?&h0Y_8>r71|rS}r)HH4N>0t5)MsjBc5+mkP zK~@IiojVI%TlKHX>Z#H+@NS&#M`+60EqbK%WvNTM#?kplWORgvobuwPA;vgjl-7n3 z^-O7y^(?VEdFQ-mZh<6+gcAz@_#av!l}}$xpLK6&a9Aw+aMaqCN z9RcgqiY&PIt`3cm)dV&J(+`d?jLr@9@vRL9JwYD(PxPfq8;SrE|HG}#t32{R<>EFD zn9J~z*?u4kahh8(g3gv}&IEoLtNv~DYo@l`ovKmk6TXsU1l2QC+%p5ALyMExCZeNu zgiunVa^B>QfNUo?=?tJfM{4ZK_7|AY{?b(cUihho=zI;F88WPERoAlFZqb*jdXB;1Bop|ifdr*AX1xkulboS>US;u2HN3XgTpE6c8AZA*)eHQ~2;!>Qfk;P=K0&lX&q6Q`7~VuvBn3v z4{*md!VgJQvxUKXJI#&o76BTC!U3x0v{CmV#_Jo8WJBm6AwP;0WV@4@1;Ejs`UajT zE=w=0Ob=?!+ANfM!3oHr?FQSlwp!Pn7f11Sy2a!I!dnq;%pxKi^l!qM-x6#MfW&@u zw@l5^RogdC#6Br~p+D;fUdr3~`D0ewk+MPUwov?anKP`Jtd$7aaFVd!G2~xy;jg>v zZ(N}}pOo%HPD*SuO8Y--#c_v;Vz)y)_u3sqpQLSm6)kl+I}e$5!3G0z80+M-yN&Wa zj%cl;ASh&zV@5qO`I}R%_VR%co~SU%5LXWpzmd_r8LZHn z50PO_%q~1woo0=fVS94Z(Mv?A*Mt#Bim3Qq{buM5xt=S$|2#3I7^Y4d zUpHVlamTo_AT(G}56IetfvRo(U{-;5Z+Uza zx&egm{SYKSPh(@_@b*ePg8{)6-5N6P9cFe{EMrn6BPrdo*WxXCG4;*%cmd?-lU%E* zTk$f17xTA=+Zm!0&w0Z8OYJc;A$9!EfE-frH( zDW!PrjS49Q$BemE?~E83(tE9Ghhv7~5O$+FhXP6Ihb7j2l*iU9yIFA!Zz$I$>Q!1; zeQQ4J?u@!*d+w}Os@9!5i0Pk?rPKT&%?;$}-&H=$;8z?S9S`~RAGSljh{yFicI9s` zar{6@em_7VC(w^;%gucCn*tVpTgt!r%Nz998T_wQp7;hx*{PXncN|A|f{q&!@bsTO z;NvC5F!}>DlXj(@uV&EM%iLkevFDBLfq@EFHuGPRDi>EK1+~)yjZ=w*0gyJi>W?=D z$1x~}6g>#K;HxDQ$g=*R_ocT|tZ{3`y6g#`YWo`92f;KZffD<3C!C5&(@%;>qN`N1 zgmQ-~T`)`{JaC}tFEjK!kudDG^#1D32%GglUa46kY~eAR)~(wUKW5?|2pXc>Jy08N z4UWBScj07V&1xCLm>t$~I&VA1!q9=mN$pduM-?Yh56;|=k@BY~%GKU+GtDTqKjTWPj$~C}7(o zH`}H^F)Ls_q*b$Rl{C{H_oEkKTghEuG|f^OLbsTFYB>z-Tm_5!`*Y``z=^hTwMt&N z3WK4?5?59##%&X0BC}YD`wTp`waYhSv&Do4&BSZZaxYj#d(&>`@_#Z!a-|&aq!TBU zNe3^K3)yI?fMc3165?M9ZPX|ydhFDi+kI)E2r#+tQi>QGsbOXQmD z%;c+La|%jCHkSJ~tSZHfmgF)ua^C`uCUwL84#DCZVF$yS>TE=|_26Ni9x02}bk&I9 z^XD-+u4kK z@_DzvEowPhP_7Rb^-lKO**<@DqIb-qzLuZ|@&v0=;d+M!d0^0J1sW4M|G?ovTbiyo zerW8~q>54ET@r8JI5MP5V@&frrGZWJ!ZhbF6HY()RrF zTf69%x{#e=&pk?7+T9Js#SI6F??>khK1AzHtx}4)^8Qf0VyhsGzGm{h@+50y;)^&z z``=(Zy6Hu8*P#2e!?+xW;Z52Cmqo#DI&Tqv(=rx}QR&$F*l@K+$VH%k%F@W>++O>Z z{#;~rb#=g|J=WzryT)NU`8%Fp`}9mI%AHuv-o3T!22b_NrGGvjMr!LcKn>v5G77() zCxUvO{^w{LaP7F?z`Jr5__QI)vEXabH$C8e#%BO9Tyrz)`nE$`8Wh+e=)rQ_V}`-cqwXTBfZ6*5KUNCb;A` z7;j45CatL1V8NwuQ8zo`QkTHCJNKIgguTBQ57v6u0$%JPd!jz$%#g6z!ns2Vt}jzx zK|Y$BS{0*P>XnjXSbG<2!|Y^N`xM-Ur`n*(aT03Ejg1PQ@sBDfpwp@as<}+utlQXyMUl71b z442rcq?^v#(THMIhJ%N(o(vF*i!Y1Eoe0&NBaQpFZxidX_JBI51O~jDqBBGIeScq@ z;T?*tJJLfX_RA9GtLdV)39ZqHmQayQ;=?J%ut>aqiVlgd8Qpi&g9rY}ucRJ6ocA2< z(7&1gMmIlu;OU?%$*f;LqxgRvQ!7_{Z2Elacqq-!P~#JN@zbN^DzWuC@e*5^_LWz^ z?0*b;#D_k}ws>((P_*2bW>q{BZQiT=bNVsV0|3?R4%?+)AD+zk2snt!5#yNT?khUK za`e=DPurHgn z2B_&M0I`+hf@>~N(qc5N4(*rNs*|dzaz^v8`eFmK*|r28weQq{RErC2!J0-R+OIx3N*){V?p0jHmOa(5%HT_-X;-1R^z%|Vd_I*`z zt(Y@4OM^#7(C%zcJ|!V*4l^aA^q}&0owTK+Oox8qZjq@+V{4lEsn)qPKa`fDH?mLEY&JB*Lv|ZJ51TC< z9nmVX>gIeHb|_m1j-0ShdgU`wadvW>RWP@)&yErAXoc?X>&HI5LP^P$t0Ne}oggX) z(&~rK{Ct#KvH6EmAk(P2=@1F<*$XHQNob2R6eNiwF24XSAGyOw#ikjHyZ^5|-6w$Z zM~SU}6@aEZ#>6XFiJgFhVs2Kzu1^Z!JS~XUR>VfBPeop|tMdscO@lio$PE>Us8K5D z9N9jL3Mw6sJ{a*X9r0eK1$p}eQ081^D&NDNsxCnQt0{|00ym;oSgK}cNxFPu7gtrX z*aCDxGu@4eg(xv0t4B@%z?{LjNxt{MR>{!qt4KDR5#33g2UUPmZ!W%RNtpD@b&EJG zp^|jSQ+P&q+ivdZ)pe&5%t(2wOAFOij?UVxiqXDLMzD+kPW_5|>w5fK(=qFJ49WHk z#$bzPhsI!Z`o(DcvLu7%dfDB+2EO?ngvs}ziHT4iiKrJF{#b@#Vt(0R%L-sr+H9 zR5O9*+Q3uOWdm{MF=E5Lw9cBXp`E$U`TIoB9c@Pmye52mgpl3Hr*fit-0L7kZ2yUI z=)ho&^Wd57-B$b5(UZ0_Dfn@D^`~8#zHWzW)2Hw3T&-y0!R8!G4i3>?)M!upKx)pVTcgS^mv*| zg^Xm?_H}oh(g}$x&k7AZ_em`W)~^i~S|B{vo6&*}pckYH35-!iVm}mVXSpX9FLH@T zXv{f-K;8Rv6*Vf-s%_T#V{tpVJecNmd&~N29nVa^&;@s>Ue~7H@YzCn)Z5L%)kb)P zX&nLH1c0miWVO`1w;q1J!!g{F|8o!cBagYR01_Khefy5fKVQ&Ga+tj5ghJ`JIfSNQ z9)Oxmt5ROrBHs#{xw?~Csd8|fzWi<# zplo`GV`(af7e3VKG?HUbi3B=8pbK!Pu+j?dymP%#su}!D)S{ipQ-__xZ!BETHP*A zXa2i4SZxOj+O^l+mtoQ>05K&W-Ktkfv7x4|=pJ859a?NRMBGQbg=qkXLTY68z@0!W z!52Sj=D}fAr{vGpzupMIkIO2mDg*A=_eGED4B}c~-j3_Ku>ByKtD<;y~SoNr>14 z{!W6ZzKw5tg<~kGRrr6*|MN}kAf{$p)h0polo|*Zj^(DPde_Xpe+n*&9c;JHe z>;<~*U^?+xl0X_EyQk>v-ltK^i*;XoduG}~KPZQAAX?g6)HR(q+MSSydB?QM9BFea zopPt*I5+*y>=Co^*Jm!Zydlx$4-%4Q6v?#eZz*wuZ?15tRlJYjqT%m_u0+L6KjXOz z`XKLzZ(hJD0t=#xCZd|fAue20vy>?0WWw-rcpy)aFil$@-CK7UXiQ>^1Nl<1bg-4Z zbcV$U@TV>bRwrVHi;G+L_n+Nznv8GWRIl+YXOf{2kdG&HLQIOSB1ijyt!fyx?n$?< z7cYDgA%Il#eZ3!^n6i1R?d^=GhHl9-b9V=<(ptHz1bRbh`GJzV?XTqXXFX^d`QqRJ z(vg({x%M-UJLbcAD8NM;x)mqj70}Hd8)+7)bumu|5GEJ=`hm@hhPb!LZj^+O=WW0* z&9?v!<#lg&uayz=wX8YGuEDu%4#LVHH$o7%A>3?utYt8LStMlCo_CC#G4pr|(KfC! zj)GQ%Q!TyYGo*$~r|QWecWVc^%rAxFxx}XWgF_d6-nnPcg0*C@88W62#W~4IvbXmikt zKQ`KWQN}WX721v&Q%g?n5)_F9jXdWP-O}3Eu>x7;$4$M5`L3&+sA!F1CJu5rtzmIx z;Qhjw?d*BZ$5mSL-+uf{6a90rfHb25WX)-Dp=W+gu@%a)se%sB0ha3kGG#hHP#n454UpCEmZh0X)~am$t5n;25qt}gB&g6V@+(S;^X{D7jHsI#+2g~Pt#xoq)n`P zUs^ukEz|X4%$e_OhmiO&spON1!O{7Zzt6JqLfiOXs5nSE4R)-`yg`Lz2ah zWou+!dosE@Yry!ce)^*-4!s2G+JbvACciLHMwTQi{)L2^#WF$!q z9ZXfpH82qtK?j{Pur%{yP*ms<-uCopfesY947Ywq-8B}`D|gu$OczRGZ1EFDB=aL`;rg0(%awnQ+;DC=3hEV-5vv@8~%l-smlvD&PdDOex z$jxH3B2S}~nOciVCpvjV`^{Y=iyx1?8+%_Y*B)@=OPevjRkYt&S=4sGMdc=DvvDJH zbz7qzT4E2oF%bp_I?w$|KL23Zd~y!?aP^*Rr+)5yr*Hcxh_Y^0^cp}@I@>~!(^+-~ zT{7_Wd?>+N5Kqm@Fm>8(oW@bukUylS{YadUTcaTLI?)Wx0MiLosnPy6l9BB zo8>UaN_XOD*9XrZssMC%*XMh&PDv+eH3q1;*FoYM*SVk?d4L&x3I zQJ@0Bh}nYdVSAGQ^Bl2BQN~agk7Pcs6pBT(9#||ZPuOrC9E5oL#e|9zYL;mVyv$lJ zw9tiDKY7nA^D5wiJX1mRMeTxRkEk9R7yeFw-aaGMUMPpex2$BbppZXO_v*Uh^0U6?Fs$;DiH7 z?#dDc$0jNHw%(iXiA7VKt1>rq?Zih9@kftpe7c5pV;b@CAw6U=#BH%uL~A!!oC%@BNAE&$ukzhh0Y!k&n9#5NSH|$}?5!I--`|uU z|B2L|cR6l2{wj>_etl|FRLdo}v$@YaPzw0BVb`2t8(EQN^Iw-!HG;Bc*OTjyeTp&S?$TD6=e_-A?N3jS$B0@N6xob5#3Sok$yfP3w|5Ie%$g?l>3ka! zM=P5?bV}YfiZRG3#PN^xgtBY*q<&=VUqInf_0*1ZgsW3K~~ z_r-)a0@mM|*mToVg)MmMEy=N~{v8*uS-rM{dDLRsW_w@@OXpRBX4~R9p}1MW8_bI5 z%e`HZS=vf0u-o!yF16X`^(KL@(l_VpRh{Zl+F_@He-_TfJKy?v&8{=ABOLA?)Zz7n zo{XbE&wHHC4ms~LG-_WyKJGh)P!B|-vPt1_Pt`*dedt&UlqfGq#)1(3mrncD76 z``*h~%UA5mwF9N>5Acrx968Ct8gL(jL_y8SNiz{g~-*y(^GF_bxdWcXg*df)83`Q#~EZwl$I-y8Cu zmp$n$+&0as+_H_MYExt<3v^yCYKjVs=5F>m;V%=N+&8Fi*_-}mDa~oBfvtOGcD6k( zyjMr3$Kdj+!HKyG?@p0lA0j#53cK$$gtF!<`HW3>F+#fwa`xr2cVDGJYKn-Z0JGE}aX=oZn-qVP$r z4T%L&h`w-U1r|!N2eZdrN)q--K=y9T^(|J*NxN`|H&ulyMqznKHu{FR<63IGn9Bpz zbU7nx^GJZ{k8RK>|ALqQ2#x2}h=`%LnOn!am+>=gRY~q$GyH&#P2?1-0J4JxpL%KR1Hp2mfT_2Te;H@$RaGP)G2zW zYsJr1xF~QNR@l&8H_LiI6?e<%J>AV)w;mZhTP=tefjtOkR${L#wSTw%+z~ScAX&XSxeusQqUG$qBc4c3mDm@iE z|J+ai`>L+~W*r^0dn^j0WT#?(+mp+@deYhJdV9V6mm&4-aeav)?Dg48p?(|I z3WL1NH>$W-h6J>$OkXeUPpb@;LrO==plZK|NZVaK@rPm8p=H*1`a4WOz#Ik8$5swo z-8Ug2DrFK7G*1*ItFnB)afm|N8B{zj<+~SKsjn}poWupSv$0t4d|tjAohXPp3#L&1 zyxVFIbBqYA#AdWYnkbl#3T!Q^!1-s{UywP|7S>K3__K@EuLAAgNAi3GSdHDO9;g;| z=xSte!8YF3?gm!U;ZYPq@5Z=d3^!l8@_SDxL=^3tD>a{6Iv%-wHd@41N7(s}l%U;? zdQUo3k>wpNkd$7G#-Vwdx+YUbcjiCn@HgOCn&Jd3e4s4Vt`n!0TLx@Ji`>VV9jET| zPT^M9<^yiqnb?fyE2Mi1$x6&26^4r3zhL6&c5BSyss=Io!tP6D!{xx!^Jh^WOiy{UZR?NdS$(?UozxaFlR1`hSr(RoCnyI9 zJ(Dubd{mP|>cRhG5jQ5qN3iW`tT*eSV!RvvvMsT)iF8$`__;x1?nY6nazYF7Ba`n+ z{Kz7YJ+5uDdiLf>4u8e?TdK+lB3!T?GTy}H%_S@IX|v8Kfu0(g*y_CwkMx5H3WEHs zB6Y5mtw$;X-}l&p)G8pOkYM1I|2j3FsA*i#KCEW%R2+7>TJlG%zLq`+(u;a|jAM|_ z(%X&A;VhAE6}61}AymI5^q0XJ?YiqQR!@_h7kZ@Wl)~?4sprn zwEWclH!{Bc(FXITeww`x>v8f`$Y!+ z-6XnyQ!12-QE5hH*JU-FQ@f-`Z{gMh>GUsis6%WwH(eXB*pPR>qW6;YvyvE$~EJ_s20o1G{>P`&$g^6X>ET&IX!WeZKcypVxl>!b`EMLBG=~e;2I5YXP@GG<%j* zZF&+4I)@3~D7G168VL}vegYX%P88#E4aF}9T}|Hu^6`%fkaWeEuk#svU6)PVS1n)DC3@tCRMRxkTOe z7^VG!`RhHOVFIItA?csU=UrhwyU@|#4JixsC3da4qQ&qe*Fl_xTtJ4$v4xzk0dKK{ zjO3IkCCP)!k4p(wJXk~i5tkk6^_ZeLI#1g1Iio1ye(F~`J!uNoH55n~c{}O;k#}P( z1vV*~#|Q(m_b85<(x{-_M+@S}drq?)+-WW95f+OA0);K>8V9?O(Q=c7A%O(cRTt7` zic=I3Jt`UzLmP&nJTO@c{C+8MV5Zrh!CR(g@iWbRW# zIsMtHIrn7>5fds`y-LjG9>A!39E8&UxeGOzbSn%}q3Gi%uUODplg+GE(suI|!F7nU zFglh*PbG@uhOLeO#BY5=X|69qV&~I4I^p{)?*KVr^~7Zew3fUI$KMJnVB>eD>k-YT=m zkdTm2?LD))p2mmvBEYiS3cvT>E_R+D&~=(^1c6q zH-u_5<#9AErl-6bN=tf&CA-Fu6|}YDHJbabR4ZSKh0QF!Nm;&qCgUeA^LKaW^NIBQ zj7)o{o;c`ufXh4HUm#P+1a?Nd6ocA*1nH{Y)e{K)h+JK_59vT&tq{)irafErwbMrg zR$sKax09b&!6{F-mQnt$LGsIOlpWuab4j8;e?T7yzFQ7$Sjv8Uyl_Drqx0(zvzKyK)~j-lg0Z>b_!JG#wXa z$`>9TrJ|lt#T_GDXJxwd>^;KtoRqGX^HTpmh{#o^#(=2QQzld`95c3phMxsJ; z#TS+?Ty*Yz;&NFBz*LH`nNO>0y?$`!xdARn&N7Ea-fhN2L7+eED_W$_R84bUSj>qr za?F3WGLSS@INL37hcFlM+l7l4XFM_e z)AR;=);fmmfB4UeKmK@sO(PmIntu0{?TJgXssX4c2%k>zF%Usm~lxI^TonSo*Uy1eM$o^|JTyWe^P2p!?TXjBw$l zF)w_@7!tn^nUIZO3VUc694=8^@o-4gW5)7@h5z%R&AYV*ytXaGrP=|TeARvFuLotj zBnFt}1R8o5(>=vI&Iq=~s*!q*cu&!+jOMOm2i3y^>kBQ*(?6;MCbIuqxg|Rlh9#M}4`k~orv3Sd~;(cdFJLaK;iixMUGBT^10v;xcmI+=Z?x&2en6%|-zg$^C_CVx38}S1aM`>%j2aChlyZl8F1vPmAoc zI-Prl2rH?mxF2U!3$?~&hl(s48XGqnZScX>_!oRaOt3ThFZ*RLFr9{8hOrP(Vs929 zI^MY>aM79NBoE!D$i$)e+u~2EFv~`#V~@CX1|pENoqqc4!NlE*3{4*AYcD1KCs*<3 zSowVT&B4&^mO1vzr+=@c{%sQdf*mH(j@?a+e(HQgj5&N?20`M}YsS(s9)Fiz|J!T- zd%OQeO8z%?zh>K?Gw^>C<$n|9|7ApZfr#F_F}i0p;nIuW#0+1T;EtYOP56jjiWVFt zAEX}wTACqf zagE}VJ;CG3OP2qB1i$=T0a6U#Usjnuq>R&br<^%y9cuCVoR7EcN)i8!7cZD#PY&$1 z<%nL2d6E5dfNiio9yRa|X~;uQ{%2_Zn=6LALtMDuJ{bLt03-myR(BRr z_5Z1G_;XnuUNxwLt)gtFeRbrYzuRHRUey65rh#|0=ba4oX zpI?!|0HDC%77@`DN1DzU&TAgR+Y3UCkpBbTwg$KHd~aiI@`!B_eEd`v!07e%W}n*~ zeH+iYz-=IE4J5ApWV!x2Y=7)xQhJwGg0d;-)H-Pa>2OtW-`Ee2=eeG#mi9JNch6$l zZnQ+&6}ux%eogE;fIOKYvx=&j#=@YDS(0X_^X}F|;pcOonI4AUZ+Xu>*u}{VZD4-fbDGWqnK`I@Jw+9JD%cuWZIt z->tSV`w@D4YVm5hr`uX7U#k7VmvBx?)xm05%COco04dhRTn(4_#%1k5|1k7lODNYmC2Q&}5iU$jzhr+irsF`$u6RU(}WNW&iR|J4@ zTQ(MvX1gCI!)PLukDko8S;5nVlu-0FN$wRjldh7iFEi)r)=Y?vgCeo{^JI$I%p7Tf zCyGY+f`g*dY}0If#*v)>7|s)jNR1DoMpkRj|H#KtK!%Gf=^`|^V*NZ`aVHFm+Scw? z3}&kRt269hZ~M>j*s>@75JnY*tw4^q^jo6{0+LODS3#|zIKo-o$PYW;RrRHpGpQuD zO^*uN?8*Q{?7Dvlag(99{`+^-d~!g+IujGy-_Y6Fsh2_+2L4o)4#TZhY7_AEnDvJm znLs6}N{FFRuFQ~s`HC?nHyC4S$Tv!*A}v9C0Qb)GpqWav1tf>5L?ZwUnUjm%3@7iM zOf}jYQY}$zK8+wFCy!FkMm7&%M9q+S;!Znl+RbpD5a5T=T+sE{gvL^r9n>*u*BBQw zDaUIW6DTBUFF35166`e&~SL zGDzp5c=Q8Lr3__wn4(4!T4xg@Irr)n6gT4}?$YT#)$qo&0X>cC z{mo=#$L=o_z#09PUaa$4pXGdaVeM|2QN*a}SienkL8N(AFru2%-VMV3} zxu5@6E?^u3)gwGUGCBXKz~D)ALH~xN=`<*|VXO^T`I8V&ZW<1}5~o?(fZ8XKHj}`_ z^jKi4sjTn*K_T!m8`A;7 za6Z6q^+#Ue7JoywPFi@?uJPH2ChbcETioUOVeilL2V(@^+`-rV%%H7R$HrkabGgb7 z`C2a|QWD`b0NcPV??Gzc(TP6h@49L$OsvaC>*2aQrFS(_{w1-*>>7gA|5cJw9Dk9y z;$?n548Im^K2mwMD%KUdlJ)-PB#&%JVkm%9ny1n@?w|PDla_eCI{3(i-jI4Y!RGb> zF%WY%UAnqEv%2Wnzz=Ex-2u+ErW;;8KuV!qxOwW3?)mX$*e^&j&Z|5(RM{eTu(0Eh zEIX+%m}Xnq!7{f4YjrIYGXwGnR8p}`+MzY(CKUIoW2JCdym~RGcpFj^Y0hQ%TLPPA zvH1zUX%)gytBVGwp|T&0SIRTj>~=NRjt%8^FLSO;YF>!4r1XySd@8Il&-^CYmmwWS zxV~S=wZ##)4!3c+%y7n5odsxhiFr^~&uS3ecblaxL~4|a-iQthU)HxqGxPB}iXFMu zS*3VJifdvsVrrdq`tjPqR(hE|5l%~6q$WbY^8~U%M^SGL?+=Hj$)Mn6m6MsYd44&G z^kx^J2@12F)@CeOn+W*tWW8RSOVI8#VYPI{$@OfF;&9GbAtlf!-fZ(7MEQR5$KwfD zNedoU%Tv!cL#cUFBQ7>a4Eq~YyZwtRppww9ep|SlNb!tbN?|&eBQorhhj&BbN7~O&I$F{T0fK<9mXz|<34`r?yr;T zhD|Q10xgDiiD$7TaQEa_?W!td8sfDrNaYV21ApkJ?B?Aa;&Vw9!uMFr1E}?4k$KHY z-Mf=O64c)Fp%Be|k?eC#5fO(zU2mK!gZG%jsEaGWLQl5QJ+EN;q`#?4SRG8$?nN(I zmEi$0(aKkxbv31b96{kG!A|!2ELG_JHy6sulHrWG8|4BMed1f2`_Q_!JRnI{qBe=EEH`*!mg!G0LjqKP1B0T{jDm;MfYk2cJ}aY^>ACA2*$ zn%;%Iyvg3Oz#|niDFhT&lpu>HXIWxP`vlGqs|)1G@laU zzA)>eTTwK5LRf!jUCnw~N}ohsT2r6=iQ&#R|0A16%i7lTwY-z&bnY++_n*7y-&|d1 zJYSHk%_P!;!V&?I_WJ@9T+rhy48VY-tNh2@3-qWhd$VF7`3U>DeF%+w(7)IOyUiDc zqL`s-S&3`>Pg=yZ^??J_SZEwy>Gvwmd)z#4xi>owOg)OMCXDilU=< zN3f1W8>4AMP3p#HDOjhIUxSUmIMJ~{LASzzCP+`?LMAQVT3tT>M$eWJMz)xFL zTubpHu1l{{p`68#YYCTzWlr#pUcCif3&6*VdhMo`7yEfx_WHG9A+XB=IOn|}Q36H9 zW{{0OTqT;W9~t(-q+o&I0))w&g{2e!#w6Sjy#^YD{!<17$_K&)2bD;y^=a-{Ve6W^ zUD~#-m)pZZL#B$?&yk1&FvB$2^jTD+C;OtSN6Z0{kOp`JUe7tH!S#A4J`*Lxp+#{q z%>e0Ze@YZN2fM-U!_7B#f!Uququpb>&P1+2zVFMr_sq|Tka0)qmcB$~fCwG+@+3~1 z@l!}9t5Q_oyi3QBcbA&5)6A!g*~${jiOliFF-g4W9!LXO5GA(E)|y=J!RBoj5 zh@G9&Q~bxX_zv$g;3Wu)7gv@PRN}?VvX~QBqJcPKu)Txu^;>H~g?_nRJ5z5O&4z&a zuBK}tF0b$_XgTyW*kvF#!}!#T#E$Y3%erULpb5ipzr%81)GLXM4$gO(s#$%M;cO-( ze7mgh;0t6+Vv*qJxfpE+_dJdE1?A|rn0tBsegcbL&O?~De!e1v?%_ik90%ifuL+8m z^ky7EUCIsZ=ceiSKll#-9##fo^QT$cdfrx4eat|jTD{}4In>XQKG*QBH6ZtoAuR#q z{PtEvXM82`$x;3devtPb@})aXkEh!eKPTyyw&m9#w8|fN?b!wjbAz^5P^6@4n*4kp zQk$>-x*E_J-uSjF{e8>1;Y#7Su7ks~=dQR}C2DcIkA?9T2^QA!AMa0|Xl@$e;DveS z!d9IJ<+&>8Ct5Kg{=;s{_|#rAnc`=kwv4l>6!j09q67l@bRD+>@~0}C=iX3e%p{D_ z-+|e;+Gcox9$-TPid6b*h2y8_0~c*1$u_@_k?ILt3Cc8+UEX*Xe?;2k<1hO{d=0y% zPq90v)~$Iz%@9u4v-$0EPwHdXHlQWDkIntTCa|sEzs<2L$_|176`9u=5P3mwXi6lC zgHVf9^U6l{>1FWYoaxH|4c5G@TM{Q&ZJ!zbEp4_}Jzlm8unD3dZ#YLQp)-)P_qd|E z|1taf19)$v8fyCPUaDg+RePCzEiUm~VICJKAO)^sqn1WC{P}#jas~EZ;H8Q9Ri^K2 z>Vi6e35Z-NgXdKv4;8Kz-iB+Y&26|(X_phqg{&IRui|hJyIjU;U44V-$6GdLK5PpIvoi zNq(E9?p@WbqM91g`l9=ub7-n?U#nw9reDsnX_getSN(sY9!$#y9j6~qM1TTN6ffe* zRM)q>DGNA5v+gR(kA;{bAQJoj>K)C;!PZAs0mbg$#GsrmS(Ri!bF>kpLq1aIK}C(* zX6>-KOV%p5w-&d(OVdzn*{`U<1GgZOMW?&5^AuY$j#j!l#ky>M^m|ToUwPX-{*q0U z0Q$mK*+Ih|cD1eA!!;5=hOztJeY|A(2kO;x8h$T6$0E=fu(_P)(h>Eo6hk_(XAZT3 zc}utuU-Y_>*an3y&M^^L^qOwrwHWy&^4qAXm6%Qnz&EE>6eh#|d3Ok4JdSrc zWirQd?*C}8dyHrd@X=7TjQvrM0|aMd8Iam(d?+V9665*b+x^`$`QO<6O-B9y`@Gw7 zM<$H@iDezUmU{Fk)aJ)lV0rPsRJr})^wVpoTC?HJgmlA9RTa4&S^8?U!0qnIwn0dN z+p+`*_7SYDk#FAUihVW#{ab;)wuZCZ2^G3DSRmohxeW+?6gXWS92I-~AzT7;V#5>I z93D#5J${%V61gR5z|_)t*%a0h6z3H={N>Aq!CL9ZHEbt-zxVsuFZOli4wRk%A@I~< z>w!FnjwAKCKVV-vt>fl1;-3x4D1NogeszYJ#2^9)CqE!NCGE+@9ixW;&=ha23>Se! zC*Jn3`qr}C4yoE1io5NRa>`*nde}t}4*Ql>Ofk{>rs!GknAmu%i=>!Cr;t?})$AZB zaH+UDUFWBmEjOmD&D$go#Ljb>@c!O*TxyAQ?!ZSDH-Kq7kjy*a{GLkq4}N8?baFm9+J$nZLZY!23T9j? za=)Oxske1_Yp+m4A^Wfsr^uUuu3);w1Q-AF8A=ra+*?MJ?Zht`Ifb8;-}?MakTQnu zo&O};ueHWQ9K~(O3~IymsWTP7{(4mnge)&FgeUvYFDJ!qPyuww36@L-mcu&XObZ~0MC`y#PhE@WXK#Ai_U-N`b zO&)OSsT%E8;X*2Qr8SA<`y*~rHE{wehXD2=ET+wC5#@xER|uq{QOJ72Ca!Nh^wQVY ztbf6!z=fbZSZo~yNGhAwhS}6W_fZRJpK^p~H$;c&+ z2m{x~y*1Ui*>Eu^Z>e=>yf`agu7%>$?IQ0D8E{T~Hm7!lYTh0$x_OTct0Ztr z=#PRSBUqw%l%^A#-sczmu$ttHT&hj;XeAUd5b%0Ws{Y=gg!B$OGEYC^>+3V}aT+{w zF+I%JugSw@5W|Id6&&Z#ZNsq<)heyWmb-c|+@7p+{yyD$=1}1T8t5kWE-&G3Evpz zw$jvu>P@a zi8&KxsK6tW>t*9QN6Q||h2rqzn(-x5-{_*xpbpU8W%??+Xo+AsSaz;Ig9R<#^N~`i^`tz zgL7AzfQmgY1FK!@xovORRhIVYjdl0*HwDcP4h}8I>6!dn3Taj=L%Fhs!e%EO^2`Xq z`sRZ5bNQ5JGbtOR~Ap@IxvMmNOM%+G9%P%$49wKoI6gJM=0RPw?1UoMOgR z0pZSsV7gyD&4UuV?k6vESNheq7Z&YOILr>B+1R`vjB=-E9tM&YTH9jMYZ)*TliVUlF=p zn4!h@WjBFfRi=(S6SMCA|FHL-aZP1k)bNZb4k}|oU;w3vz|f^j2Nk5FROzC$&>{3H zVxg!Yy#_^!^j;Dm0UMnFp-2fudP|g&7(#hZX4L8a-w)5H=l6UwAi2rC=j^lh+H0*X z=;r0jGq-1Ks%K_B1S;F;2L{X?k6ESq?kUPQ_t$+_9GlV@R1HB>nEX6Xe-_Ji!mQ}SR&>RJL? z^--b_Hb8cP(`-p`>Nd}tz&d;54QaRWdN3ht?^mD#fFP5P7cY>yj?k=Si;bq$x!V6c zNXW#wMeNV0l$_`r?(!mkj(^JiED)f!mF_r$_S@Y7M}a{k>}Hxm5UMVLk92QmYgmOz zHYAQlN1~Ty|LyR)YniKSG8T^quF*Fs=R%L0*6R--7CqHs5=+5DA8pAyo?uS59luvL z_d@rQoxefp=bY60sr>dn8)G-Nb_1BC9UF@+_TyhpSM$=ny8pIyhot7qTY8x!(M1d`YfaxwR2;AIAK0$ye(0YhqW|1zJ+TIE@{2 zp~L#VmQ{*U7t-YEt3$cB?(@un>bSe=*e~J+NZ2o@(nf<BHO2b}vsaQdGZmmv6x?9Yy$9uUn@#iws zD#M471@R205jmR&>A1eU>8A|XBAwUDf@Nlb+wcc|d41cLiEb>tWy!&do5K$@jbe>U zogo{Qt-dm*iD^a-HpxJ6KW11*1V$wQ)CeQ@kCLDHdL)TULj?BuBoKX+qcwl<$7t!*}#zK$pT? zihU#q=1afK1r6)^z4PLh9ghF+AcOV$5m2+!f%w|j(42$6M$J~|uv zY0yTjmU>ve0k!l=0Xk|BxJoTO)dH&w!eu2*r*}C~bsXUE1&Ch@!X05aXzjB#}3q2MW zwt(z*v+8}|5#-I_EM|rPzHKJ&2iDG~$#tf+TD(rw3vb;~PGn!pfi&z(6%@-qdL$KG zQzTTz?G@bkH(LND_Mt;wNfsM++FeL1gzm&us>%2q-&e(NH7_R(4y3v<--S>BNC1^7 zR43UD3^xIV-H)sd^$#G{vNmYgTZl}^&b{B`J2G`B#9Q z%j8p}09led&V-;bxKj)eCUr{N8;d_%H_!vEm!aaopGLXNYJ2T#$5x5e5X}2QH53Zc zjToy5EF0O-C4R&tC-DvGWzsIo^Gg)lUiPNWwjfNT!e44Sj84OXd$uetzbemqz14Vj z6;TV3_bxQh(eEu`*N^GIw``4qtWWxOVBst}xs@hXJ~QTtB&`<_M@#eAo5m=RX(;e< zaLefB3*EO1@Pm&xzAmM2?G_V|;C9?Q_N__rMm~(%J4-|vra&S(g(iU6Wa>aUBO0jF zR+&~R*6o!PXCXeNnJAhY{L6IU^1$;SW3lS?NXWC(*F9(_T*r^mJQgz5yzSWMv}UWo ziBK@<@14S#-gJnSvR&39Ikefkk_VUk_V!e?J`=kWmh9Ak-i-BO2pY;6)xFTqwe4{__?-CzuH1smvfkWpW4ZLp| znxy~d>Y=n|SUSe3zMesT%?G`X*WKDv>F%ml87h{eT@Tsa^5yXg$g}fah?J14)FirQ z&V>%0x<}Oa(nXew&6&4Kdv8C2ItUk~NJF_XdBc?cxYvGlL{N9}@8Ml6f__4>KK;CTxCd!|7wT;$a2t8h(& zkmISMwq7{4KD|7jhci5vkh{q z`ck7`lc}%w;xqc-IU=g$GnzGq zr?rxFn{eE|ve~+|vY#fub?%714{nDuTho?I=$#XS&K(@oJ1e;=WdvNUO=ZsPn_sk*c&jz*9-RDY!}k zW*zrk5G$WH9Y>-!3HYms;h)HNAQ$&nYSL{m@YhP8B&kZJ<$!ZIl)-lp% znn(8}1;Vi`dFsiQ)%IjKp>I3DDYcEYX}c4({~*(SFZ!z&K#ybpf(vmwUFQT*dEZiJ zF^~Mgdue>)SQQu?v%;FGlAP`(SXCUni|{&1W9&uhVl-=-$|yCc$S5e=3u!u|;5h&p z?f|Xixfxvr=;+OU zdK2m03g9}#ywAsz<@rz#hsW-}U+Oli_17k>ViyQ!CcD#ksHkbZouKl+f_4b>WvBJe zwFCvP-A1b*36+rX^7f?=GQlOE^}0%OVombVwa==@O)8yp&5Sd7NgYlW8L8!z~7Y}%g6gwnG|XVLt0Jdeb! zv3pd9yA@oR)0Xz!nFU6zAN3fdZ+H7ug{H4;nGQoixtXo}7^#scAk;E+tU++h=c0wg z4?%$X0`xbVsX&XITw!#rW++X>FuO}%uUd^m9VU>vxSq(o=+Jk;ZXkkVo;9y!`?CG1 z5YSp)+A!Ec=w;WV98P$hpL$6%Dqb&;AXMVN*WBzxuq6hC7HC69TnK6uIc!_5%d8THtx6-4E=JHwp|Xg!!DvpJ^PzakZ~j z4v$ZT;oDQi7PPX^s!!;G6Zy?XkF4%=oyw@yO*iW9LIytdPYT?M?7%-y2|Y>rxa+I^ zzCf~OS^Q*8heL2E7;Wi(ph`4XGi7)Gm4ascyDi(c-ly}jyLKI3CUD2c4&`tndiR}n zs6D~6prr+7?~Zs<(6S23_}spYl5X#_GQM>oMd5EJM=!4zN^D#wvR8N3Uw?fbs6GiC z|B$7;ssBN2{Z>W_%QxWkI^)MJ?O&FZ#kHcG3(P;M+cTtCVxEPxtqSQ58<&}yBnj>4 zI1ava)M1l3!;V0~&VHx?H9CWE3I{O7@oX4x<(bXOxPOEp7GA}z3Fs?b{8*^c?rTBX0*Z?OvtEg%f^O7lp+!I!0yqiRkQk&q z7o1viIlRDXSEn!a#-HUd^HZ#$i&`zujTVRMh+{p@LfHHs;0of<)72g)<>o4;_v+wN zvb}Ff+MrE8w<8NS6*bTampFTy_1bT3O#S*8KPkpRNN*7t_zG64RG<=vipja)q$!44< zxOwf3tv`#rJ<4l!>Sl1lm?r^$FOKu_K=O`9u;ubkZw`ljk*^4KQsgT@;J7bx8OL1o|y5I0((#XUnO1h-AS@QAdWSpXPbDe19l`hHUTC+Wgm$)O;;y2aIL1$^( zokp_6at2$rV!@!Uj4FXRg|sW6XDm2?3ZYe(|?BQ_$JJGU)ig1$2j86v& z^xigG?2U0yRG+}GS)6Z?PO)e3%KE>f|w zn>D_c&MOAm?jj=y?}yGKwKIzT)UMxm(4Wc#Vk%!tk4hroO3XFZoZ)XF0S}ftflyX`(#k5Nzf@u1pUs)C zIX}1$M`8o6V0?Z5@c4)YKIT6AVc`_YHVGVFsUqIlvz_T<3S7)lOnDz2FFN05Oh2b09Dh=G~|%7QU+>k%9N zbljT&Fsi8$_6TGH7$v^jb?#Wq({ zNV=)&Qj0UwqD#@}Oxd1)*md0V`>tKbUs$>+h2sc%ffCCgZSiW19%vEhp(e!Q+SBCg z!O5SEmi1ruJvk8)D8=*l;_X{A4g4akp5nPdJDJvFfHAQ)1?Aqv zkwj+M7j~U#Z__O1c|fKiB{l-|-a;C0^d{ak@C1KdB^k*#iv=)_Zv^WI?9H z!Kz`PNWZi6A2w-U@r>V+oi|6r4u1NezthV0A&!2QlBG48N*-4fE6$_$9GRPK$M_iT zHF>-qK*QvP5#sqy1z)JK^Jv&PU{L2Jzm+v`^-0=IToH#&>+ow~>jLur*4l1ut38J6 zig%2xM8L-5;a6Mj8N4qH1gv_h*<^iQNxKPG70@1K6ovv4SkC|^yTz&_fp^vJ`?6_2 z3fw?zb^8n1RlMxj5=NSHqLvU%>Duf-1m#n^OojA1)tw+(4F(0~Ee77)rro2D=b|Iy zRW8dnfR6DMSh-#Kl3x72Els13wioyFB*rua9wZXR`Z-+^;vn^X1;87Y zAJLIojU>McvU2I~7?^;f>-+PvzH3j{WPR=j-U;1<W47EDMo^Mb1l-|U57NaDZxLkIhb6dl(4@(|O1za6ev74?c(ns*6!K_ac*92C_izFusXlx(g=pxHmkY`rcv3 zu0Vv<{O$2nsPl1)6l{Wmv4H-Y0mxCtfW<&lc?Ltk^AW;SNtNN}X!boC=OlMlUo+XYiOarcHM`Sj&zLK|=3%CVc`|j)nE7N(gTP}*9bVC0Elu+H zh_P;XGf>n}n2Net&`5OkrSlxs43?}W zw7&RObNt&E`EjHxU1~_JQTX?0m+D6-{zj)w{z0|leyf484TY0gFgd&dR zBUk4n<3W=>vG|VD=iac&rH6Ap$bgk0H}@v-p_NoITX!5Bm`>@)JF6&S*g|)hYE3}5 zZmn9-^1|iOrhZi*0>Iz%3s|3;=G4h5Po!|9xv`qplIJq&ZbnL%UT^B4s@QaRzc5E> z1^+oj{^e!F&j5*cxJChjm?+j1aTh(Z-8o0ea5${qwHxUKj7j_-Gwmm?@ahkb1W|CJ zEq>$D2eM_fK0hpevJsc$)<{qTdNAyxi-EXHG@x}bvxu?p@-QB-n!iQyMxl0I4cwisn#;^$h%vy9%7s@IsTTfId2_)?D$E6=A|7 zkuOQ?Me!HZ!sQLvk)5qsLG#sz{=psXYW%_-Ehlu6x9SAv>u*$K&s*%PCGzF!Th;CH z8R>LiR_-}7Vl%PIn;qB$=~L>2dE~XOS-J|+wZ@#b811il z#3HX%Xk6l)wrL5}YxOXsy}a^WGI`YOYu(GY#r-8wOFIFE=Ul4v+w&^;eDF6>msS11!DO-gU@jo^5g$GqIaRf|7bci4B@(xc@UC`Oh|?$=+{kT5x{ zoICJ=i7s<%o4Dt(K=(1{-{SJupWPuIIDc*;-9ts-sQDf_3QPhT7~dkj+qzA{jel1y z4J4KCIq@iuh0>qKlYa=D#WJ!m{c#iT{$ueT9dE7(scApS+ND z{CjajiCu>x)ow3){O~(k4)6{Uc#2eemt}tAzdsx0%zdK{?&3vK&8Ob4H|F0y9gu2+ zvQ`)w`Z`GAzn>;0=f21bay=fDB1km7&TqvM|NUp( zwgN7@zRfaE`p#|zAJQ`yOd~TVji&sMrD(|rE;~GV;eR}vSbi|(VXkBNUCwt3YjD|h z1h{PD-UI*tv2@INmDq)ik&@hx|9uI5xu>zil*?{Ob^VW(J*xo*oxs;?L?GW^v5i9D zvSlc1*#Fpg#z(*!NGyA-{@s=M)2uhRtp6_UM$q@y09+5Ofzlust^cu6{{JsMj}eI# zFnuBYd3;>lm0RY%eJis$-h?a$E^f!ny|>F;z^y0f-~m+0FYU>~A74jBMxG?2A+Cwi z>Y;aWP8%#o1&>w}YN4tTDe7+I2&(Jfv$M25Fv8F#%N2Ta@z|mDCl9)TLFx%LhM#t7 zf13St|8J?zpI(A}WMjsTwiL8sn1VAL<`SkBEj6{@pYwKr9S3s`z~76~wH@tx<0g@5 zWumd6<3>(+m;Jq9+;|}4>B833k?)4gAHrUqV2@>_FAG!um(cO&r!)n|f&ag^`%4h{ zKY#BcqN7Z%^qmK@2yF=&lU0Js0#YtJv~ zl8}I4+5ENc%+dBk3&wFJW3`?3SuqJzhmUu>?3?NC zfDc>x4?(U{fA{N6y#YfqWkqn(A;bBHQLE$75B0)x+026(E3Cdg@q|o7d*PsyZC8Dy zr*4_->`n*d=n0wd*l+#&zdZ1-7i!ZB3o?;m4p+%-296On{RwPcS5-X% z+~L#&-}yZ<+eW4w)As``9cOb?qkxyLhDID)UQaBTb>0phtu20HmttE|U|CW)K2cJY z5fWfM+0YH!NPl!zQQfG_gulUOEeYDg%Zu2W^X@M7=qbVoUby;%nP1ii=lSmQX4O+q zpHE`Bx8APze?a8v_&eA=t~r~ZS&CTqlwBbeUw=^uZSvnR;>k+t0yCLy`)Aqa%D~*q zw;hI_mIZpA>e$i#g4<@1k&)^i5t}JZyA$r})jdB67}q|kMoc3jW{`?I6vbx5Ktpxu zK$-Dy^;naAOwit()cUYhw9OiV_7o!{zp?mBVGFmV^I+I!tM)vEYNuihVHDB4Dj8xptZ(JW8gZaqhanpXtJ>7;OdpWXQG#2hpN^N~|7W!^T>6R&` zE*_a2NLHAIly2<%6U_VWjD}hb2D|LU@d-+C!g`x!i@Ugdoz5XUq@4NW}mCmKhf)!^N)bXI+JP z-t|MvZ={GfW+Q2iL2kPB&Y;s0z0ggc(}Fhl(tFOLm^Mo2-mFmOa!&4;@&XYj&4;Gj zB?_29UwK@JQb_vl3xk)}bRHaMIhPJ}56Zf7_V4^Qrw?~KHUdLI+1uN;n{tiGmVO;& z9lT_xmRmelO{4d96mq*_Fd^XDz-2sc|5!cRc?`bateh$ht#ydiT43YN9WK62uGL}3 z=cl6Dyt~uy(aQH75pe8hUmSeQ97Qbxw2+qic{;&3xaRUe0q@F?OG4jmRAOX2D*5`0 z*3R5ybAe2mYKgVafAH@9W#30oQ|`k@2A{PFI=OJ%1gw81Yr`V*n=Zr~MhN2K?YsV=Jys625zhVfPm9gr zqf8B-293c$a{A1bM|R@xw^|-@YWdQ(S@^Y(3V!z9T)gfd@Ub%w3m-aybVF|60K5uIx2klJXfpf50Edc!l+AjQDe)`|>lLdXVf1_#Fx?R#|xU6+c5+pwo-HxIk|uF^+B$hASILnj2(tGGVWR`tY;cphW93%6r=6( zuCDzl*naV$o$bU#6Isq~BV->VeYxCXjHOF3hAqa|waIainWrqZ{{0OmR~Hl8Wew0?nm2DjL1_u!rZ%Y$B^NPlEi)2DGEr(Tbfa#t6u$ zjmu*Q53MIe#{J_nai_kC4BmWYdD+3nmk4w7hP=}nIHzR$xrHv1DwVpO0fQnt+Lgxo zW|M#d?B%R>9WYq7uF5(KA=)EsJ5ap)xFlm*JY`YmcB`&v@|IA^?b=vrhluz;asIB-a(g&+hS_I5~|JukIVH_i<~R06vB3=418t`1ZkZoOeY?(IA| z`Y05PpdbpB(f=KJ_p;oNUwUUE(3Sg1>q0Bc1>BC)2Ere->ijwCSB&DX< zzIUXsA3oU6P}3e3IZH5m^f@SJ0QJFiX@smyT8+NW9g*LX-N`Z#?`q-Z!zwH!G}O+> zcjMXw>w4U=zy%4&M0JHeau%N}`WbGVGcl)aW4_KOmMK`;X{K*l)Xr2K3kxK%{f3Z5yC>L>zF& z72{{|_o1_$C-I#aUAa|f{4aDfTrrW66$f-5+rFglGOPV8#q{Y@py%!Mq@Ln!Lf{q3 zoIrDXmH8Q6R6+xJQ|hu|iD%d&whefO?*x2_+0^(W1dM6)j@qqt#m<{$F;%UkNqD@= z5GNgu-?!^JxG{pX;GY!R(@2yt-X<*ZDxy=)i{+c(SDx-=<25iD@Qs|wJIdT>#s5A8 z0C->hliv%CKG7m`$(W}v-lZ}*xjS{#y~qI@@(R^e9~nSHUVRVmM2cqt?Uv}6`?666 z!6*IDkqmBQ31{}QruAZ)gQE+}yW-H=d^c6$Q*?CQ{(ic0yLXwgLHKK5EK}_1C1ip# zSK{_!N3Dd@@YRg|9TWp;$o5Sa>q{`swZGu98I)9GTek3X&yN2SIPU#K;JeBG+)Kwxzbzgt?^wL`$Sp!XRB#O8(%{upl04#SP%~=@1!K`?%9WK#TDnotL>?61nrC-?!1-Zp=I(>&uz8<6VPCFD|?8my*9W)uXL7I zry--u;Y5)gmLKEQ$wMuF9_zMptEb!vi(|;w1y&EaJ#TA@rzT~gf-GWcSwLQSL{iOOAuZt{q$Bs7EQOJ?;CAvYVX#E%fJi16$7Yxkz2ch@p|^ z*n-4g@s=7^Jve`(MKAD)>8I&(skyXwVa++13rED9>R97X**i2#sjkl*-6`M9P$8pJ zD-Gw*uh{2qwVeJ;8_;>6Cd9TSWE#F%dz>xo)OVtC#CeeApGd8*e;*symQ31cP3;)1 z5sFivLB&yT2}=wE+kDY5PFkZH#}RYY;H{^WlzL#qOk?>zY*3PrezL#1eK1eQ`0<#STlA+y4$i(5(JjArmr)Xqt_pFX~#Z1`VNHe=iG~dXP}` zp`jW{C*(QN_(pl+9kW_j3QH-4J``cN5UB;iTwEf*ac8MTgUSLZWc_&!%5SFSC0wtv z-4{r<6C6zse8je!>fnAMH-|W4lWAWMhPZZ{PW!=Zi(A^ps|z2|`|~zgFaKLy`u%5Z zW)uu?h%8qCoBxz=8LO)r#JgZzdR`yJ0@ag~4Qq`5Ah8kq-$DDAuqn%jci3a24}yX8 z4tM=z=D-2kp(18q_}_m60{ti@o^(eVUFW`F{o%B|YQWDN|7{8lQp7f=10McsVScdq z%g@xFip_?RaY>c7n$h#>-@S|_-PEJTMuMt87!K0R`z8e-l%ErJw4$Z^){(e-01&9+ z%o-+d?*Z{n%uSUeaC&}YX)yF^BJEP=YRUHALx>%#?-oKa(Czg77n6N2V*CmC(2SG! ztLT>cOY&1EH?!{)X1hi<=AgxkXYz}?fsS) z8zu5x`?96`O%cD%=cBBT3;_^@bdsdHq5ncbgjSU8$m9cW12sj|7gk zMh?zzq4zrPHN>WWKYnk*&Q+ykjpkcyP;xz)A{m_2MZS$JzEPo(r<0Xxme(!!wfz7_ zasz~AF6UUp*K+8}L#6gp_MO2*Ld28y3*Q=%>}LZ$@cDCcQ?6}f~0maJom7#mVlBFITOn*w~2K}l&U-XWL_RKBW^+CZS4Ux$XogQKw>rQz=2{CB+pUf=c7ox8ww*&Ro-L%r*;hyTG*^s< zHA$Yf=Lp)r!)hmX_pvC?K}WFsPzHrJbPA1&`09LD1oE>i-(!5iVioOAyRFcfzhF_< z4j3d{@!b3DV8%p}u~oo3NZ?enG7vmx+t#!Nz;cs@m-I?H?o-gQg6mC%7$N!8nbw%j zdYbsT{M0Hip~~BHv6lnT$)dbg0^$KYrt{{xm(Zviz>vDktEWkc{2FVf5;>rh?IyOev={t`8rMM62tEBuomLoxQ9N z;EfzmlJ@6#aJJibw+lZmM`8kt@r2x@x3*hCG)|QsGj>d3IJ3z1WL;eSTGHt(+3F3% z7RxLd0BQS4)W>E%+?uQ0PF9OvNz=%Tc2aj1;Gw&h=0WKz*(5hNKg1>D>byN3?30q= z>pPldvcooC<9%2>$nq!J*Yo^!zT`R=mk!oCk8qbY5^DW%gtY@<8Nprxr+lrsLi7 z@;LuyeU#&tDG2~`{!57*>q`&uYA=dPKMt(C&FeOsef}^@d~H0DIUz%Q?l1|@f>*;^ z`l{_8#wP|D{m`08z$>!XVMomNK8u|Ys9dSW`x^Dm$Dg$7FwQzIr7Yaw3c!gc`e7KI z_ZDrm8$Rh<~kjX!VNVvO3HZp~t1 z!%7Yb$L3GclLIF?NP&2%Ck$z%xC^Gb~Era%_U56~YE&LM zfEY`iY{B=o_~uY$Xi_wFf%vaPLf~udj|@M0N=! zaOaNh**6F4ZDcbWoe=3M_6qzo$HA@SOU@*A+!M*tD`b6{R4T+kQ)TyS+Z4#7yt zUFWdR*;1Pes5c)V_bcRN%Cqv#R8hxiXd?T!YAt(wwZh+)m|5^F!1VhY(Z0pRmtnmb zT6kLW4NE`i@{SjMiOK1PDfAu55|fYF^1Bl_+-MV-#6nL>?A&@&UVhU^SX}KQM1MyX8Ay+961&LnqkS=?e;6>pA zGczH#Yr3P}%XXuXsih*cqWgBEWWPyo`e6rMCTEO z;9t8-oGe^ksvC!lprMmZ^0}SeYnjMDVZF_pgNfd@oe4h=H28QARElsao~)_Dbe2(v zhh&9{4$z$_G0U$NuQhV3K~zMax#-u6i(Aeg+1qGk%F8TOTk)`OzI@cHYsRQopUQC? z2V>i*H(|v<;5sMc8>yI6W$PMp&59Kb! z((W%hUXhK+A1hWMy${W3NZ|7>r9WNb>XIA~wuz|A8u9UZr;AD{vB^~Z7CpZvQf;a~ z;*pm}{5T){L0pLVIgB7hZ8QRjg(P`TXgM&Gy8ZMAMr5jb6fWcE_NfmTBLXyxw@A5r z$H!Mrhe~)piubk0!O1`CohOK=j`Y^6xtk`JaPP(gp;ZiF^QJViVsPXYMA4bl4 z+m7hRC^`#y8;*dc(i-1F6(qh$URkarB04%AhrMf0x29!zvcNl)q;SlizkFMlDyOLg zf7zjb;|N<|PN;)Ntp#d-I^WKj)?86;DrAyuKHL~dBMF?@jjqLiOQXJILP|O`fO5bK z!F_{wuS7Q64%H?wSNDofkMY7x1TEJU7rLY@;Q31*0r#`~rO#S)m%lf2*OA?^x=_@B z`ot-WrN*uNu<;Md>F^ghp4UQL*`&`NV+8dWK#Aa7HjzMH3oo z+xJsX(b_E^Q3+P0fO@t7&9ej8_22_SN4@QS@dfW~1s1E|+;;NriVT0)4u%Js^u&U{iDZ5#rSap156$5-a>Er$Y<4 za(vCMe3^BL>p%|v!N1(I&--pY(%!y*+%@*tnFEN9(v9x3U2v-aor$Ap1)=+K;U;uE zhieB165W^&Vyf-BWi|@-kJZ-N4WI`4I}DwI)9b?_&uKf79S%c^@;s^YDF z=qSbL%D1{kX-Sx=IX1t%)^b;8D~#&!97y-l#3mVpP540H*kgJ15%tR*y{G5w{i3#x zDa$7E(q&Xx*o88H(=k(fV_|owuz@R7Sj>KJi78||f639Qs7JD-G&ygm_BrA}pH63- zvCuL@nvXlW6dLLndtp<0e9PzNutgr}mP)jY$|ssn+*zsk@CG-K1ZGt1iZW(cwbQVZ z2kli-slAc~j~;yNebgwBWoY2t1SFHgZz%Pxo|CHl*PQ!nEtkpw5@yIH>TeaWXO>br zOQ~3xTqdcSNl~*XshdlILmA0*_Pr6Nsb9;OcSM~k2&e}tggHYP_!*A4lv>kwwyzU`9OuSwsxutfvX2kGZs@?U=u_A6bl*f=GBGRg~f zD(S!|O*Hz4$|&bkFmt=&7EW2(#o?<$RkiG0YW-rQOU51W){#crA}GYI=tkiHJWq>^ zn+#Rj+^JTByndjar$Kdv;8+h-?;X#0U=njO^G(EY+stI&$oDgjZ*$rw(-)pZMxL<| zr#insgDZlTnipg@jJ5;eMb{^5(w$YhleV>ShKbaDF%{H}i@T+6gX(*` zfv}8#<$~;mu5NNLvRK!$CFQ}i81}r_{xgeQcST(ri_y!%=m{cvD}s}~^c zVw=bH?b~qjfyMMUA11*X=DjB^Vgi;=fk8@U^!ue*u4!Y{%4LnSmbpy-;U=S@_PHny0u#* z=-#FHy1M*RW;1&T#~2Rg6;NvxXL^q4M^6kcLlL&WU?GPGB);L8>>r&+$T>e zh8Xrl^$M0Ymo-ek(@w`G7t9wKHuP4judOzG{_MAb9l{^`JIEE5L22&m_y1wX5+NG4 zQg*Zyfid)tk3+XQh2G{zYaKle(A;V#mk!H4yjiv~2WoT0Ewt^v#Ikx~^m1piRSd!D z9Hk9VXHMl&M(aO3u;i0qC?q#ID-55#Rh5}z30x5}t+stWoL-QtnJ*o@=W{K;=dFZ_ zvDJNUdCm(>>aCUN1eW!o3svREkgtFEfuC0Win0M$!Q?OaM&ffTk2jU5{W>i`U*SC~ z>nrtRQ}2Uhsh10<*A(5GXU%FIa0#@5`*b|`p2ehsV76a=)m0={e$sW3z2<9$3bI2U zM?`%@%!lEzQn$I=!11^1%3&2EF*>p?TCF@%nXBCw1A1a%HND%P=<@C{N#vc zpXJ(u>kCrqkmS?jv_X1LSZPZg`$>d)atO}};$}Qm=CgEI^l+W7u2>hS(@lwsoCs`= z?BmLwt(7t16XtzuVs4^5ybm{R>V*cIklP%!4Nlc|7Vk`+wlFLStA>pxISby%Jg%(wJJEJ?<>AveOH z!64n@wt6090>LZ?#D{|ZHTN%tVY0Gk6@sq7LZ>AvjMK59lUUCV-u(B2OnY5j#AzJs zkFrf9L2N*KzwLg&{HLv#73*ElGQW;-MsJ}~TOn`Ru7#4S<5)C#?;+>x!U!~TUR_;X zM?p`uF0rQW=o;uAi$Xe%!}1V%>phminThGg2~Dl~=zl<^BfKY)Gymd>FmzOo{3=vs z|6J~u#>lCHQT>qHV@a^)w}8DQJ*J0XvGh~6Wm0gCpc$g{t1>Wo%3|_tI#kg<7gUW4 zgZJ96K||6TQ1dlHp?f>oVa&S?Ij%11)kg2Tt;*XVg+Dg0q+6|+JE<;I`(Ua4hmRO^ zmm6sf77#=AUIZ9QH@RE)t?^4dd!ZgK;@0#j4*rn0e6KI@URJP3M>Pq>Eu{uJG%8fe zPD9}QlB6{^l5eO_-3OGfRo8-$3BWMgaXG{QW>nkUjjs`ccVtMXD28UdH&ZRt4GOyJ zP%bQ}ZhQ>6-7nT(MGVhFOLUK>iGA#;>Y=Ho@{rLfW3AKV9X5di6M%X!L>^o1AKVt0 z9ZI`w<#=dyJzemkOBTS(B^PkHwn7Cp?Onv@z%*SHlup{^`Yvg8tL%>6Pqy~mGzGu)$jxVdS&LH+!0b4 zL87X?!OpCu;pFHwH`l{=VGWb#ebYPHYM=WtOZzO1mF7m?W9= z$$cX))7u+HT_>()SbvS9k9}|e|4w7e(NK<9YO!)I)uvmW$}DXYNIu0cfv&Xx;*`^X zF`N2sfVXyL6Ky_RZH~=?_j44zSK#W?y&gv)dEk%mp`dT^X_m%Z2Yt6%1*xB4)sQaL zpsEnCFIZqYcL1YHW#I!15?~>>o*i2pZWU{|d+12pRklX17=@i@Rde}-zQLH~7cCk! zf$J3y<#snOt%;_IZU^_0z1RA$E1V(Z(G)M&gd}@8Y0@@BVtoLOE_bOW44-P+5U+p- zb#W&tk?O~q?jaNZZFvKJi_D9w*x`)%ic+KqZzGkwllyud=WqQeq)g0`m>nqZi&!M8 zaisfIf-j*|qQ5;JY3>trbn&-|A5_0SEhTZ9H#f$*Q+Dn8E7u+ceh66$w{6+?wC%W? ze6DoOrMhPiQ$a`P&8J@JVpW{LpGp!89pB)JQL;R7qhTv0;o{}G&ZwtBqyvfqyH<9q ziVIBG{i9E|s@C^}<-!E>8g0X1A+|j!3aOj5M5epvD8V(%obTC~HDEHT1LP56qz5Ti zL+fZdjRJxjz*SAXSTroKhK-+1AZvUqQmzcN6K51d%sb4?G)KqIB^~mDQ>HM@h4|>;Rh8#97 zF}>~bHXzNQ+-NINz{AHBk@sG;juTrCiFY1tG>ppdcwl?OG>Snm?iL&0S2XxrRwo3q zx)H9<`k!pVDF=*_t=iWE=AX>1Yy)%nbdR7DBv4WS9s9 z!n|8vaRH}i%YtjqGZF;#W%w*oPJi!vo^UxJVsw*7ohNbU={$*4b3Ezo#hH}KsoaS+ z{roK-)SD|MnsF}VTe;@#`WZgbsQ{+V8Ym9Th0g`LHSrBgxW&cS>26s9`fsH#+7eT$ z)_3j{BTKp?TSH4)&5CXF>zK~Q$%Qc$7#i?lja;2E{rXAtjNU6&f`APgryR4H+<@@y zj^fZA6&Z4s=jQ5BD~Bom-qpT!>(-k+=*?nL9ur0WlH+;JZoOsw-W3 zl<=+b@V7?{UMigj+$oi~$o};jry=zjJD0B2ykJEmKI6iayi`_jP~%odi~(!_8TCaL zG#Qk5BD+XizNzb21APJ@dvJk+&hv7#9fUdl+jjrjoA~QhM|eOplI;A#an|jfmit}5 ztYe{Odu7)zi=ikDh0$BkCUFFJ`6)L*;yt*Yz1%JGJ<{z(lSAv7#m7S`<%xh6lXeve z&RL!adzJ)YW7W~g_Z{XsSt6QVWSvvrd!%=oBk6CdSTby{n1m{7WpaQC?s17lMxCIz z$_0bH^_ol#;Z0`t(z~0lkiO~i3sMxz)MCpjBcHWV!G#QcJy+a-PN|d6to`(aL&kK-! z!B`V`f9V?SyiscmTe1focc-qHy&3H+K|FGyg|!U(=d^ zlCD%)-KZ?@|F5<4jB6^}`Y?v3^p1i^9GXaz-XYeZ2_s08s#2vXp_f2Fu~DU$fJl=8 zqS8WdDjkCKUW5=@C;nVIgI8TMG@F`Vtmy*BkL&1F`?!zk=g!89?i>1yt_S9u)YkVHaH;I?Ie1U^ zVN)zKbKve#=0#(b1UZT?i+$pv>318Onluj&l|(7&&csw!Oq}mF$PZljub^-Ex1itn zRnTV>T0rtg{CoobckZYBaqN)qx`3NT`TFdk_l%&x6T+xuL`(iWGbTQbzirU~tZ7(| z8!XpM^<9%jzxS7%H4%6+P@?(!HZkNH`)~ull|ib-ptHMCwtMW;< zTEP0K|E}_H$tcG!T$0r`00{(b{M6?Sv+sOUn+#6vFL7ZX6y0dCHFpd0x+n8sH2xK| zimzN$!;K77$Yi+^1LRZx1%JF ziP>}2Njvrmi=J;S0l?$r9l)4Mr?D1*$9i;V+)AJ21AYf_GeNhNPfcVbhbgsxESLyk zlBAq@IlPMWrt{tum$uR%SBu(u@VWH`Ksuwr{uY3MdM_tlbe$rPMHKc*h}G_7_sp#8 zglN1M5``k&Inj+_92$9?m2z!y&l6)G-`nq)JAqGN6%KvA4tvxTo^0ow zf!4z`tbcSI+n%P;^KgjQ?w;;+?v!#1Zz=%KcM()&Op;Ypw;l-oF)5XkdNd~W8@W+b zJo(Pw;BGD8-5uwAXWZkEQg}VNRBk(?DLiqn)Jd^jCR+PZEHRyl#|?^Ejmq-m7jWm5 zdq(kP>E`;Y1y`V; zM7J66{PTLC!Q9c_(Cj2|9G71&tIycV0uN=uc4nMGnE}Ok?^@%N4i{h*LWySB&~nOL z7ztl^IbDnRd}^1d7Y_``y4=BU<1x_=$$M!nXdv@xKaiWO^>&9#$*nnNo=QoY=m7(@ z2jbTM2N)V0=xNblmvBQgH5hrkNB_=W@Gh$vhAoMXTjev$e4>k_ZHM@X>w>&%a9Tj$ zUf*kT{o!KgvjAAk?rGUIpFmFJo+V4e-@t`wIaH)p)f2bZPZwc`;#2HrGlPO#)4lP6 z(9~%94j^@BU>Ai|sJ2m95$*r8Np}47J%b5a*v<`rS9*C0IwL#Xjs=1}^{IyX$$unF zEXlzd7K9bPOq*G1?_MqCG;Bo0c5X6}o&DeI={MU`_mqvex>Um%fpQl>7Z6hRRXsY;K?Kq8DDAn6^sZ2sc*N)>-cf#nNC++Ouf3RS|h-pZ<{p`5BM zqMiL{ZLZD57Hyt$ed-b%lBCD*LJ-!Uc$N>|7Mfs><{TNF43!18 z5sRKEdr$2*w7ytIj`LU5L3Mqby!tuiCG>1H5Z%{b=VEoOEz zBWbR+PTHY=Ti>^J6rJr4cp`JTD6w#3EXe}&advxxy(Mxy%iU^xW!*ZTb*?w|IWs@Z z);awE5YeUVyNVs+!)INv$T5kwTi&mQwxqUl)@y6@1-1z*-mVL|Dbeirnxv2L3Q|rU zJABglG*J^-z1VyMF2dCoCn%yYPN;o0Qws>A9WyjV9m5VJgvql^v z3=5%KM~x@szcRfZ*^X|UT4qy(&@Y4)d@N(rFu;K3_SD_Jm#a0es~ug-ChUPvPyDEP zz<$dLDS2o1%{%T7LygXVT==z zd|V~1^_iK;ud-_0e5=U*eP}|t%S)k?xQ!V}u~vXoXwOO&nbWSY&Q|bT8XY6MKIWb@ zP@sb=J`AiaGDH8p2gA>%7&sEBwZ!Xonb+RV06ce<&l7+@rnQoXbhK2-(M}f3yIh)O zS~ln6y@nY;RDNjUmfbGOhfV`2^sX7;s(Q&1mn;)tu*3ImMedn0ul4gn>~juTL~ea( zIkZBo#l_vMA9n7ho2>?Vy5Mn{E6QVlbIV8A+>g-9CXUXHy475{GTDaX$|4L~{aHm; z2i4n)y9VrHJFj>Xpm#}Gh5vv67QCM2dJ;Z(+YwN<7+B2PJHoAi*w}}svUOB%5eIwv z^j19Y$mU0l@)tRBI9G{``tl_AH(EU+X(u-#<)O}S_XE>K50sq$f{|@;UwK&^D~YKs z$hZPylYWWZnppYNRR?n&;6f#pa_~CdMs#>gPF{qX0g^?oNlx4xTZBg<#Uv5p#V(Z! zy>Xt(hxGV<0YCt$s?QSG16X3oVt<={n2CbEPn>DrdG=PIlMj%WzpCvW;E=CU?JGAR zXe~84c$nVQF7NJ9c}v6 zNLc8*P6e93Szgrt2g}Rxw)O~k$~Cu0VD<9GWZBM$3qd@W<@q|wi21c3 zuZ{v7u-ES1&GUvxyM;UJY0i_Swt%yuB7BE|#Ss7%c*TiwXh zxjyvZE~fn@583M+Syl-YaRGHRYbIU#_k{8b&bzyt0eRAHr3xh3=-UU;b69yk%_pf* zSkLiP-#QT!R3fW8$A|6$g`Omjl_8$R0hbuSZBi3=5Nf5uw5dO3`q(o(hC-+ifW5bY zeMJz&&5?xEjAc5Yt*?jHrkgN@A=j;&06uQ+J-tSRVsPI29)GToD#~f%EN8xm9y1eD z$DdU%urU{osn>3PGHQHQW#=c<{$n2En`i)EVg!T-Wn^d)DF~=-Ip;~3cUj(O8nt)b z97?3VHd_}X=}!&vPUN>D`L!J48V0%l=Dn$;HUBdRWU>ccBa_HBAgwGIrXMr zl>=BX!gNIut%P%R*wx)lsZ3TFOR!CSPI+X}sUuuY@x1`3TzztN>OH>B-&51kQKkIV z#r;t!_t}3iy`P!IO!YuXeD{YdJY=sf14pl>mA}z`|5kZiFM%~t{h?2vwmg-G(gWg4 zCP{6d7O4BzEqman8JfEx=5+1xCO`Z7@7}wwORU8eG?%1*`pt;_(UCj!oAesx;`G7UUJ>McOci$40qfe-_#882`|-$mo?os-n?`^R8+r}&Q$ zIU+g9U6mr^IinIJk68JMLzEX`(1$A-FkvGTAFR&(YKTCG3Inh$kb>RS8m0Z=R6o3gn~DK?$w2L;Gyi_N-v@bM zF{+eR$QfII%*QvZ=$L5GUWlu1@{gF&caINXTLpld0gY%ye1D#wd`q)3Nd8Q-W~;JH zI}6-Yu+ByJ=-w5O1V}g~zQG1^Q~~YRD|vY0iWxX!y{2KDk^Hz9*;bgBT-mQw37~~1 zn#xKpGT!w9ykj4~BpX86h5e61aRF_|Jc(jMluMcN0)HDAU+3muUHPL$_QCRlsPo~meisHS{?pObyAj5PGI=BVwEZJ%*~pdvIW{q zaAiuSD@@_f4vIHyS?)SrPX05i{RUpt_KcT3lE-3J1m=iTD77BIS610K{?k*;B%~lMV@Jn!-XO~0?q9| zGY+ng0)1(9!gb`Nwq6Q_E>#~}=i`bR+nvUE`B|3S2-gYc{EdMRw8Pmo5p=+>C6R}# zs(s!yp&O%xuqR%oKo-fxs%U)4de^_>W=QFAD=1j3x;|tETALs1W3yPdb-D0ClX#H# z5Psp5l@qU;3{P#T*Az#=loSf#09#U>r)qd>SH2vDM#wsk(Ij2RVD*v4o z%g<&|lq22DHbdp-6Ucm>%e4BuYBdi@3+=It4#^$UHBRTQfZtHfd79Vm5=U@Jqh;L$ zZ<^WrT!DBhcs^T~>@RevYU#jNu{S&&Gf8?{AXApY#PM$lM2BA1`+^Pg}>C&syN-1DpdVaM_K_yIL zYj2I=IkoirJ=`HfLH&LdFkU#m*On>QEEC`Rd*;_7{4*!TT6TRUYSUTLh7P2&2A^nry(_{Daz0B& zY@rPdKfN<#WUfHNnJf>GXUn_eo=@tLlGG9T`rd%idxkd_uk1&1XvbZ%Wfm0_?2&k0_UfkWPjVdo6@RQX%%%M}pYgQKj{=s5;Uo{uoQEqL=(A<4XcoIebC1!`&SHwF-1JisRRkK^ z=D~uhv~d*!#F)s;xQCdNi>}&BG!mtXxSetg$KfAhnL7HE`K^WZ7ES(&p;tQL`nBaH zvaxoCO-Mg`!}fAnBb`W(gJ&WFrHTV1xIR!LLQ0EV>?azR9V~Vq^9Gkp;ey>~zM740 zvHLz#mt5W0M;x*(!q5C{YQR9oOwH?@a(xnEkU_=^9rynDO@4v3*&$J;@Swd=si%2I zV6bDP=~klE7gW;)oax=9@L^ebj?cxKslmR&l?CgGqrbmFz_hahUVnf|85$bW7Yb;A zrB+$(&ukKSb*tlihj|0il&z7S=@=ibbJT7dy^0n|kmF*jiWfXLM)h{RQU$!}kRva? zPK@T;aDX~&4mYcWZXti#9S<-KTNHS$K=AXp7g_GY%)woC4}}tP&Q@k-UJ>$2Kc-+7 z8-F^#2X*`R))y0@=8Z;Ql9t5VAE8TJyzyS?{ zB_yiRjU%#!8N^6xP%j7l05Qs}smHH^Q_XAxDi}-J&5+&$Qd)i^X5353C2*xfU$T{J zM|BP>1TtBq-U=mZaHM6q&^=oefo&dqTPHCg;iLiEX-Oki;WncSI=@qeM=3ea?FFHr zuDAVDI3zv^M`lmnY#tELQi)m!!c1LM8W9+56n)qEs2!`!iSB)fEG!D4S>fDPQMl%{ zJE_crk?0oaHi|i-XB=b!BoElvT(TgusT<;Y%jf&^EiBv3Y_K>TLIy<}D462SSOI7| zW}*0zOSJ=XiYFv~E1YpW^o1jnnkUJ5-upQ{8cv}x3&HMD!44jryOQ0?CF7FHiw$D} zY6&HIYrk~}c&WPn%*g!pUSuCgkOIG9Gf#Udt5?N{{mh9XnXU~blUqUFQM2q-5z1Dx zq&`v0))V!9A*yjXNzczQufi}5{8(=Ax{PM-^|zhA8J6Dn^ScVW9Gr5k$D{HkCX_8n z3-%h{t|aIp#v1n%$2XU2W{&Xs!FNH%XPSHLA5wM)MN{{CXP9S?nq-oaEAnH5_Jj3d z*0&Z#=;@Y4=);-En@q5tvE4>6od2|F4Xt2%3}nkt;Nw&`=WC7JYLuuPql@=_1sDcq zZNMuws1EJ#n!WsRC|QQ?0&_m}D((d~>63_z zUb5|KYKyF^NEr2-q7g6Ep5e}s=Xs;&Bl{;~Q3!$2xI10#BVsREa@!T}bvotd7U7fi zoc(i-3e87(?_UCWQ?VR>woQh2Q|ySmQ@ug`YCD#^sXs+_8$}pzuMP7&U7HuWxz72# zFon63(zTC9={8x{3y--xrq4$dPq&F`&nPqror&~PgX zf3R_885i{ms8y(yz@=kud#as%VoNwN-jV#=joT$}6}U=j?x#n!Cs2#1J0uM#m$v|2 Sd8$JK{Hb5nzJk1D8T22B-pl_0 literal 0 HcmV?d00001 diff --git a/static/doc-images/images/webhooks-dashboard.png b/static/doc-images/images/webhooks-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..1d00b00ff5b29b5677e2d198fbabd9795c4fa2ce GIT binary patch literal 158828 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�!i zZGCuy0xBR@5R{@KC{?M_!G?4Nseyn%XrY(TK}4~Dpp+n?O7DRHp(GFx>C$WHy@e2I z37!AXlE9mX_3#*)ekfEUiGOLFmCN z9m6!1vOy;szwF7#P=F^#@$uaPP7ft6z2n0rM=c#4(IbwPLg}~-q71CXr8?U#qp(mj zH#hg#LUIGI6Y5c#xBd!0F?GESS{JmUlKj<|H?9@_Xe7p)=8+ZtQ`t(+0?^c_QZMexA zXs8G4i#n31rUe=Kd=*4xX6l76ZyAs{d;u4ailNBp=yR728j--N$pRw`AvDADg zVAJyQpq3kOqGK{fW#ad#j9gvbRP=q`%ayUmB<&qEr4Uy$0*?YTtakT9ohp9wAmA_J z7G5LRzjY+8l$n+&J-r5+yd@_=Hd0#~_*Qctes$3FG`rBp356Z3!K2D?K0k_&TGHIL zGbYr)mRt(I=Hk-+Mh~m75T)oL=;aw{b@+ZTY!OJaDW+g(nt$|-Ux00 z_|^d$j{W6W6K3Rj2&8bQK^!XC+S*STdjO}JVba2JP58{ptEj0t_&*|E8b+Fi@7Gg~ zj8-zC#$m?;%Yt76RKmZ4_IR4pb|t>>mNtG<%#oUidovfMSbgtkKUS;4?6wRUkM@sE z@LY`>&&FP#JihXLSI(D0Cnf+I@fZZ3ZQe9D^kfz=;-hB~_M922KhNopQY;*F`K36g zZrpZQJ{~8MQ_QN2^mvUxusKvc70tF)d8{7&hGQEArFKo=I6oxLFo+9{cXJn=;{>)y z5r}lApl*;fduXozC0o!EhnpBCuw%J zkt^q7-T;lJdtt@qy&b`H%DE#3S=%g#&(+*XITiZ^Y(!!$dmxLnoS`?aNI zI&`Gz`YZw;tE#H%8ntU6%9-p}^%zDP7p74@HTFa47+rJ4Mo09!8JT4AFz3pg;KvkU ztv|a*PbgDix_%tK*`U_NtRncSo1TL^DL_e$)H0PPgnPWZ+2XAAaill_Q~ad~%xrnb z{fA=ZN@QG*e#BD#&>cL6^Sj4b+N0AfYR_xDT2%1`EXBlY$^l@7%Jp?a5!Y|Gi|vc) znT4Yg5mRma^elovz14G(CUQ;0evu1b;T>;)`5??cr_ zcM`|M67M)ft}@ZmHPWyCAocDN zRJpa06NHB=mpe>+M@v~c5kjE~rdL5|qBCB0cg_m4F~Tnt-*4#+phnG^R1J$mYb3#* z{kB221w=wPr?8`&sqF#=&iYlx37z%2pyiP$1>ucAqG@Pe2UR8BeaeHZ-l?%n&uVM_ zbid4YOwjSO^|?z=W$b17muziaw{&AG9FZ!?2Xsto8Ha^Kq;ErauFs)Dtt%WQ&mH}8 zQ_eI{zwyWAE%}%X)00uUXhNUoIIP-gV07wuZf@Qv$ridG?{JU=iqdkz$~DpS`sRbg z+F}nhM~d|T?3S0uddC!Y?fs_Ta_?)k(Wa^TkY>wvA@kQ0ZcSbMM?-g}L8O2y24r`+ z`Re&xwPVQz^&H_9%kM+yKGXU*jF$E@f^wSDO03lTYmuF!3&j?X-iePmP>fYeZHsZ< zD@ud7>rDe+0w~xSjkalMyUy_1)E$T6@2lMmS3V2Rbja~LtJ}qtKpCBIl&5)Hp2v3R zsE&WVmr~&W3K#h$X=HbypPll41e3hJ{Cv+2L+6N_c&!}qPCUY<2-x|HN4InDDL#k(tQ08Fm@U+p(2$bE*yIC#0C`uazP1Xh%WCS)BrR zr^+P9W5o#)K4}%6^h2mY#8&)Vo9F1_yoHhpxT_XT#Kd0-#6N&tp=_22w-L+1BxVr-?)m6?;6E1>#9Fu~x{-jsu<)3r~uaJs0@>mO|1+1^g zcFRi{B6T*6(=d%H5?4+O3$R{zO|CNLJYMBBAm;QWiefiL^4dEG-L?9W;%A6))S0=v zTe~7CX>$J31jjuerw*)QuNvUx47~X;99Xlcpg)!_=`3jR<|4hw2I3h)+8b+WMP?M} z?EqEp#wj^7i_jNskt@d^9Qu#Vu{|SbkQgZ>eo@iAX5oN?XDLDwnu#?66$FjyTUhJP zfXbc5yfNAEWg0u=kW^Ls;L9%i%U*3oJUjv?I!v+8RdzqZY5ef$y%GtnIpG^OGEnz| zm-Gm-xUEJ10x;(fEoI4HvC=0#GfDqy^TBMQ*F1H#)oP5W*qJ7-z;jOZ;e>oIR*1B#y-9wPvje*tdTXrY1#%v4OEH5jm(ls+ zU8YSu#|4&_Y*(d&JjYThcj@$^PXi&cM-X}C`ift#YW4z}Jeh^t?!;lH!7j>V9X%$D z{BB=~uy`dC(S+Wl%%|RVP*!kpc(0%gitOL@#XPr|3D%WRAYB1Q&k5XlN4#DzBtJl& zV6T*T-s}IP+mCVv;o;i=UB?G9Oft>@6L`(FQg%YDEINb49hJ;pfU}db>DIyCgv3T( z5o~82iER0XWd*|Wj#o>1Lc@tyRBvVaN9qlJK^q$U%DgI^nhi3#yag;`oijb0?y^l3-J? zFSHcjIxuVn()5(Y#7k+C_9cz%{!WABWzm;A2%U|WM53)5wC0=4Y6%42i-r5o+xt(q zCxuYn)36!f!oo@we|sg^8%{%WkBs}{BZwoe zZf?}N^y68DU^hEXC~NutT*YccwHXpl_JE02WcWh@0u;R0=E|uFmO)l^3z>A0bw< zl$BzkW3lCaprm%sQEzMS>fwXKTv{q$NGUC2XM+3<=Nd;L64sLs^jebR_w@gR_!p4H zBEl%RcqT6J2#++8fV7oP30L}zo?RwYjy*;bCXcP}(OEeRwmZ~VJc?l0ggVjT7Kky+ zNo%K<$eXQkKH-T8qoob!oIY2N1QYLzVbGLy4)^ls;G$TM5lY?5LqLYdk}O)#HNJIi zr54&4Ps_OKYV#TF;Q-wSPX9s1mju#>&Y$|^jiN94EUX59aRFTiT~RnXy#;o8L(wr} z^=)oRcK;?~6v62k-d3|{vcXVTab}_Jp|^^{fV|G1HIKyqxGs zWXr!ux;imA_p|uXQl?9Vu?g6UiETD&FEnFu7X-mGN;m1iJ6{H%C86NT zqt%gP?RG;A+Y`1W9C`x151iT5_dfZo5GaK6O)9IibGU#lWtJ=R?SxNsqydIA2cu2p zr7CCC)@&Q*#ocx-cebNm2QfT{P5V+}om}dPoN8k`6A?$<{@@f18hq~k?tr5AvY& zIR-}Z*t2hYK#od2YV@hR{1P067$*f??rKy(ACZL|M>JM_SF8Fpo{tb(tPihcAZ*js zIXi#~-Oud786q{Tdbd!<5w^e!?s|Wq8BnM(JkrKtAD1&2PxQ++#U*?U>?D4kMuTc5 zjat3t$~@VTG^fT=SmO%31g$EV9QNx;-j@~SZf}32ee9JH2reAN=XhdT0uRdcD{61I z4a~)$!wWdEM{PuDxIFqx8tiDe`1BM51jC(o{lq zxJzgCfR6gaW|g9HhotCUQmgA&oZARmPomGa0f{{Xo1G=%weV5}Wltat9dn!&Buy4~ zXmWu^uyvAegLs-vGKlYdhr%Fa*M9ZNs8P*&Y&baHYr%5fJ-#WHM%~G8h~PRAsDa*pO!$SC&hr9Znk5>f719|2`lwJF#b0c=@1Aa)PP!ET`;2;;^Op z2e5rP=M`V`5zUuGp2S3BpNuEH7PPUpEb8uc;DL$E#Jh*aYmVSyCM=-z>xtiL>9?hQ z*57!wq1h#xFG6#hwViiE$BG2H;v@8adax}+Fj+AXWq>u(722jU#1Ye2kvtUw*kh2oA3^G1`6CTZ<5K6sh| z$Du2q$2$ZA_r8?`brPja8N%|}b$F9Gn~Pk?aTdlQOuoxQLZ>(tz}N8jIP-QXpN6F4 z#+tuiaDAlX?5O;iAB?N&s@^*-E3M zWx`t&06r*)2Rg*3u6KQ!$hsO#N5ePHKDc(TQhzk=;8`VUybQuu&JYSN_9p}0BCo&Ga?| zD*#4~nslK<$!hR|9s$D-tcClcrL}yR#cG3i2fwwLa^v#A3Xi=&#p>tYHJNwvlQWKy zTQ8aNsS_4(&kgeGAk5KLZJVu7r-b*DKc1C;n3K?-APA!hO}R|9JuP$ zH=LImM2%~eeyqP?VxRUgx$SX}Ya`6$c+m^tqlVw;2i6rl>{(nmkBGf>CG>tmeA3K| z=`0l@9aBmOxW(n6X1PhZpgw9eZ2qD4@mp)FwGNaM>lnJzCmy4 zty?YZ@}`^fPNadbDE*a8xL_~J+n`we-GIOx-U zh)4M7zV7&XmBIu6>NSAsAJzzj9Srrt!28^X43lAG_>mX*i&pjd|&>xkK@Py zBE%J0A-b1i$7r?H%4!|9E`5vyLk@$-@0SEoB`z*5Ry>;^pPx+Q?~xuIlL#h-t9MrXkx*8=dom$|)mp&c>qi?@ zzD}ga;Jle$zAcTK%Ia8cdBFKi+oIN7K7zgennJtdd2a3mX~zw#j|qOe4W>??kH)Am z9M~f@b5_s%5q>lS=E?pxDXE(`*wee(8<=r+;%t$d5@|l`z(LaUes-B|G0({not2jh z*`Ml1vzcchK~M7ZoKC3Q)#-mp63$FdXmy8(qVvtchGkaO^w{C@qZ9&!^&H*lMH1s_ z?3*fN34OgVjvNkE?MAq))A@SuQEI;q+k= z>eT!OG56{h`L1IANduk>GEFGx+{E4p67&60Qk_J5$f)*G_{4^f+@l|{RlB_<>Fd6$ zEXzBNN5x-gPQlRIoy7%GYvC7sZ*uins2o*u1)A({Jzg`R%f6}5KOOp^w@2)7Y3UJw zk~zEBOws{@3x|T|H!1IBN|JL2py}W>Qav_+%wY$6{{Q6ri$0%$caYQ{Ztu@dW3ibZ8q5Kn%8H)uE6b{d5)5qk3O7LJ&=t6?r zfQeT-DVfEfAg(v7d4*s2w4Y;P+P02Hxg)2 z?DjwyovCZ-b%(JQJ&Yt0Lv3X`!IPFM7FR=&9>4MJ{R zMjyAbHEa+7S%ATX^zZ!-g^_e2Wdol+em-;Q%0Ab#rFW>>+sOI=1)(@`4WR*hurGx@ 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

8NobpuhzNTV?uul3`ryn|$?_jJoLc{1B>+ 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 literal 0 HcmV?d00001 From 323ec31d54a44b9dd87b32ea9f763f58453f1aec Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 09:04:36 +0530 Subject: [PATCH 084/136] what's new edits --- modules/ROOT/pages/whats-new.adoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index a3aee3e0a..d61f01e9a 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -42,7 +42,7 @@ For SpotterViz customization in embedded view, the Visual Embed SDK also provide [discrete] ==== Org isolation for per-org SAML and OIDC authentication -ThoughtSpot now enforces strict org isolation when users authenticate through a per-org identity provider (IdP). When a per-org IdP sends SAML or OIDC group claims that reference Orgs outside its authorized scope, ThoughtSpot silently drops those claims and records them as security audit events. This prevents a rogue IdP administrator in one Org from using group assertions to gain unauthorized access to another Org. Existing manually-assigned org memberships are unaffected. +ThoughtSpot now enforces strict org isolation when users authenticate through a per-org identity provider (IdP). When a per-org IdP sends SAML or OIDC group claims that reference Orgs outside its authorized scope, ThoughtSpot silently drops those claims and records them as security audit events. This prevents a rogue IdP administrator in one Org from using group assertions to gain unauthorized access to another Org. Manually-assigned existing Org memberships are unaffected. [discrete] ==== Spotter file upload in embedded apps [.version-badge.new]#New# @@ -81,15 +81,15 @@ Administrators can now xref:webhooks-gcs-storage.adoc[configure Google Cloud Sto * Webhook activation and deactivation + You can enable or disable a webhook in the UI or through REST API. * Selective configuration reset + -The update webhook API now supports a `reset_options` parameter, which removes specific optional configuration sections (`AUTHENTICATION`, `SIGNATURE_VERIFICATION`, or `STORAGE_DESTINATION`) from a webhook without replacing the full configuration. +The xref:webhooks-api.adoc#_updating_a_webhook[webhook update API endpoint] supports the `reset_options` parameter, which removes specific optional configuration sections (`AUTHENTICATION`, `SIGNATURE_VERIFICATION`, or `STORAGE_DESTINATION`) without replacing the full webhook configuration. --- [discrete] -==== Liveboard browser cache refresh — Early Access [.version-badge.new]#New# +==== Liveboard browser cache refresh [.version-badge.new]#New# The Liveboard browser cache feature is now in Early Access. When `enableLiveboardDataCache` is set to `true` in your `LiveboardEmbed` configuration, ThoughtSpot caches Liveboard visualization data in the browser to significantly reduce reload times on revisit. -For SDK event and action IDs, see the xref:api-changelog.adoc#_liveboard_browser_cache_refresh[Visual Embed changelog — Liveboard browser cache refresh]. +For SDK event and action IDs, see the xref:api-changelog.adoc#_liveboard_browser_cache_refresh[Liveboard browser cache refresh]. --- [discrete] From 865e908dd2f43164095e20073e22c6bbf5d99562 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 09:41:23 +0530 Subject: [PATCH 085/136] webhook updates --- modules/ROOT/pages/common/nav-rest-api.adoc | 11 +---------- modules/ROOT/pages/common/nav.adoc | 9 ++++----- modules/ROOT/pages/webhooks-lb-schedule.adoc | 15 ++++----------- modules/ROOT/pages/webhooks-ux.adoc | 2 +- 4 files changed, 10 insertions(+), 27 deletions(-) diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index 4c89a5c91..e5a0e317d 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -30,6 +30,7 @@ REST APIs * link:{{navprefix}}/connection-config[Connection configuration] * link:{{navprefix}}/runtime-sort[Runtime sorting] * link:{{navprefix}}/manual-translation-api[Manual translations] +* link:{{navprefix}}/webhooks-rest-api[Webhook APIs] [.sidebar-title] @@ -40,16 +41,6 @@ REST API SDK * link:{{navprefix}}/rest-api-sdk-java[Java SDK] * link:{{navprefix}}/rest-apiv2-js[REST API v2.0 in JavaScript] -[.sidebar-title] -Webhooks - -* link:{{navprefix}}/webhooks[Overview] -* link:{{navprefix}}/webhooks-comm-channel[Configure and monitor webhook communication channels] -* link:{{navprefix}}/webhooks-s3-integration[Deliver Liveboard reports to AWS S3 Storage] -* link:{{navprefix}}/webhooks-lb-schedule[Deliver Liveboard reports to external application] -* link:{{navprefix}}/webhooks-lb-payload[Webhook response payload] -* link:{{navprefix}}/webhooks-kpi[Webhook for KPI alerts] - [.sidebar-title] REST API Tutorials diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index d4ee519ca..f931d6b76 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -79,14 +79,13 @@ Multi-tenancy Webhooks * link:{{navprefix}}/webhooks[Overview] -* link:{{navprefix}}/webhooks-manage[Webhooks UI] -* link:{{navprefix}}/webhooks-rest-api[Webhook APIs] -* link:{{navprefix}}/webhooks-comm-channel[Configure and monitor webhook communication channels] -* link:{{navprefix}}/webhooks-lb-schedule[Deliver Liveboard reports to external application] +* link:{{navprefix}}/webhooks-ui[Webhooks UI] +* link:{{navprefix}}/webhooks-comm-channel[Webhook communication channels] +* link:{{navprefix}}/webhooks-lb-schedule[Webhook connection for Liveboard scheduled events] * link:{{navprefix}}/webhooks-s3-integration[AWS S3 storage integration for webhook delivery] * link:{{navprefix}}/webhooks-gcs-storage[GCS storage integration for webhook delivery] * link:{{navprefix}}/webhooks-lb-payload[Webhook response payload] -* link:{{navprefix}}/webhooks-kpi[Webhook for KPI alerts] +* link:{{navprefix}}/webhooks-kpi[Webhook connection for KPI alerts] * Integration with external tools ** link:{{navprefix}}/external-tool-script-integration[External tools and scripts] diff --git a/modules/ROOT/pages/webhooks-lb-schedule.adoc b/modules/ROOT/pages/webhooks-lb-schedule.adoc index e577d5fbb..094a4dbb3 100644 --- a/modules/ROOT/pages/webhooks-lb-schedule.adoc +++ b/modules/ROOT/pages/webhooks-lb-schedule.adoc @@ -1,8 +1,8 @@ -= Delivering reports to an external destination via webhooks += Webhook connection for Liveboard scheduled events :toc: true :toclevels: 3 -:page-title: Webhooks for Liveboard Scheduled Jobs +:page-title: Webhook connection for Liveboard scheduled events :page-pageid: webhooks-lb-schedule :page-description: Configure a webhook to deliver scheduled Liveboard reports to an external application or cloud storage destination @@ -21,18 +21,11 @@ If your instance has Role-based Access Control (RBAC) enabled, you need the foll * If you plan to use OAuth authentication, make sure you have the OAuth credentials and authorization URL of your application. * If you plan to use an API key for authentication, ensure that you have a valid API key. -== Configuration steps -The webhook setup for Liveboard schedule events includes the following steps: - -. xref:webhooks-lb-schedule.adoc#configure-webhook[Configure a webhook] to listen to Liveboard -schedule events. -. xref:webhooks-lb-schedule.adoc#verify-integration[Verify the integration] and webhook payload. - [#configure-webhook] == Configuring a webhook -You can create and manage webhooks using the new Webhooks page in the UI or via Webhook REST APIs. +You can configure a webbook to deliver reports generated from Liveboard scheduled events external applications. To create and manage webhooks, use the xref:webhooks-lb-schedule.adoc#_using_webhooks_rest_api[webhook REST API] or the xref:webhooks-lb-schedule.adoc#_through_the_webhooks_page_in_ui[**Webhooks** page (new experience) in the UI]. -=== Through REST API +=== Using Webhooks REST API To create a webhook for the Liveboard schedule event, send a `POST` request to the `/api/rest/2.0/webhooks/create` API endpoint. ThoughtSpot allows only one webhook per Org. diff --git a/modules/ROOT/pages/webhooks-ux.adoc b/modules/ROOT/pages/webhooks-ux.adoc index ae3c9e67b..7ba96fa59 100644 --- a/modules/ROOT/pages/webhooks-ux.adoc +++ b/modules/ROOT/pages/webhooks-ux.adoc @@ -3,7 +3,7 @@ :toclevels: 3 :page-title: Manage webhooks -:page-pageid: webhooks-manage +:page-pageid: webhooks-ui :page-description: Create and manage webhooks from the UI The **Develop** page in ThoughtSpot UI provides the option to configure and manage webhooks. From b83a7d388cb8e64b8750ea2d261182db6d5b6eef Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 09:54:42 +0530 Subject: [PATCH 086/136] nav edits --- modules/ROOT/pages/common/nav.adoc | 2 +- modules/ROOT/pages/webhooks.adoc | 2 +- src/configs/doc-configs.js | 15 +++++++-------- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index f931d6b76..b1aeb25ae 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -78,7 +78,7 @@ Multi-tenancy [.sidebar-title] Webhooks -* link:{{navprefix}}/webhooks[Overview] +* link:{{navprefix}}/webhooks-overview[Overview] * link:{{navprefix}}/webhooks-ui[Webhooks UI] * link:{{navprefix}}/webhooks-comm-channel[Webhook communication channels] * link:{{navprefix}}/webhooks-lb-schedule[Webhook connection for Liveboard scheduled events] diff --git a/modules/ROOT/pages/webhooks.adoc b/modules/ROOT/pages/webhooks.adoc index 673d79d3b..ce3b4799b 100644 --- a/modules/ROOT/pages/webhooks.adoc +++ b/modules/ROOT/pages/webhooks.adoc @@ -3,7 +3,7 @@ :toclevels: 3 :page-title: Webhooks -:page-pageid: webhooks +:page-pageid: webhooks-overview :page-description: Use webhooks to send real-time event notifications from ThoughtSpot to external applications, communication channels, and cloud storage destinations ThoughtSpot webhooks provide a way to deliver data and reports to a target application, URL endpoint, or storage destination, triggered by events such as scheduled Liveboard jobs. diff --git a/src/configs/doc-configs.js b/src/configs/doc-configs.js index 71946726d..3fe81c2a6 100644 --- a/src/configs/doc-configs.js +++ b/src/configs/doc-configs.js @@ -48,10 +48,10 @@ module.exports = { }, VERSION_DROPDOWN: [ { - label: '26.6.0.cl', - link: '26.6.0.cl', + label: '26.7.0.cl', + link: '26.7.0.cl', subLabel: 'Cloud (Latest)', - iframeUrl: 'https://developer-docs-26-6-0-cl.vercel.app/docs/', + iframeUrl: 'https://developer-docs-26-7-0-cl.vercel.app/docs/', }, ], CUSTOM_PAGE_ID: { @@ -71,8 +71,9 @@ module.exports = { 'git-configuration', 'git-api', 'git-provider-integration', 'guid-mapping', 'publish-data-overview', 'publish-to-orgs', 'parameterize-metadata', 'multi-tenancy', 'orgs', 'multitenancy-within-an-org', 'single-tenant-data-models', - 'orgs-api-op', 'tse-cluster', 'pendo-integration', 'sf-integration', - 'vercel-integration', 'external-tool-script-integration', + 'orgs-api-op', 'tse-cluster', 'webhooks', 'webhooks-comm-channel', 'webhooks-s3-integration', + 'webhooks-lb-schedule', 'webhooks-lb-payload', 'webhooks-kpi','pendo-integration', + 'sf-integration', 'vercel-integration', 'external-tool-script-integration', 'license-feature-matrix', 'best-practices', 'faqs', 'code-samples', 'thoughtspot-objects', 'variables', ], @@ -115,9 +116,7 @@ module.exports = { 'rest-api-pagination', 'runtime-sort', 'v1v2-comparison', 'spotter-api', 'audit-logs', 'tml', 'collections', 'connections', 'connection-config', 'api-user-management', 'rbac', 'graphql-guide', - 'webhooks', 'webhooks-comm-channel', 'webhooks-s3-integration', - 'webhooks-lb-schedule', 'webhooks-lb-payload', 'webhooks-kpi', - 'rest-v2-changelog', 'rest-v1-changelog', + 'webhooks-rest-ai', 'rest-v2-changelog', 'rest-v1-changelog', ], }, { From 4f8d8235743f6396783b7bd2c5c3cd15bc0310ae Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 09:59:05 +0530 Subject: [PATCH 087/136] edits --- modules/ROOT/pages/webhooks-gcs-storage.adoc | 2 +- modules/ROOT/pages/webhooks-lb-schedule.adoc | 2 +- modules/ROOT/pages/webhooks-s3-storage.adoc | 2 +- modules/ROOT/pages/webhooks-ux.adoc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/webhooks-gcs-storage.adoc b/modules/ROOT/pages/webhooks-gcs-storage.adoc index 4fc856beb..02abd0cc0 100644 --- a/modules/ROOT/pages/webhooks-gcs-storage.adoc +++ b/modules/ROOT/pages/webhooks-gcs-storage.adoc @@ -1,4 +1,4 @@ -= GCS storage integration for webhook delivery += GCS storage configuration for webhooks :toc: true :toclevels: 2 diff --git a/modules/ROOT/pages/webhooks-lb-schedule.adoc b/modules/ROOT/pages/webhooks-lb-schedule.adoc index 094a4dbb3..d59f2d822 100644 --- a/modules/ROOT/pages/webhooks-lb-schedule.adoc +++ b/modules/ROOT/pages/webhooks-lb-schedule.adoc @@ -1,4 +1,4 @@ -= Webhook connection for Liveboard scheduled events += Webhooks for Liveboard scheduled events :toc: true :toclevels: 3 diff --git a/modules/ROOT/pages/webhooks-s3-storage.adoc b/modules/ROOT/pages/webhooks-s3-storage.adoc index 9ced25f77..1847f4de1 100644 --- a/modules/ROOT/pages/webhooks-s3-storage.adoc +++ b/modules/ROOT/pages/webhooks-s3-storage.adoc @@ -1,4 +1,4 @@ -= AWS S3 storage integration for webhook delivery += AWS S3 storage configuration for webhooks :toc: true :toclevels: 3 diff --git a/modules/ROOT/pages/webhooks-ux.adoc b/modules/ROOT/pages/webhooks-ux.adoc index 7ba96fa59..dac5eca31 100644 --- a/modules/ROOT/pages/webhooks-ux.adoc +++ b/modules/ROOT/pages/webhooks-ux.adoc @@ -1,4 +1,4 @@ -= Webhook configuration and management through the UI += Webhooks UI :toc: true :toclevels: 3 From 8183b9c0aea5a7a475d3f920c306291a10637243 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 10:10:57 +0530 Subject: [PATCH 088/136] version update --- src/configs/doc-configs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configs/doc-configs.js b/src/configs/doc-configs.js index 3fe81c2a6..e5f40a9ea 100644 --- a/src/configs/doc-configs.js +++ b/src/configs/doc-configs.js @@ -50,7 +50,7 @@ module.exports = { { label: '26.7.0.cl', link: '26.7.0.cl', - subLabel: 'Cloud (Latest)', + subLabel: '', iframeUrl: 'https://developer-docs-26-7-0-cl.vercel.app/docs/', }, ], From 20ef0971fcd7f4f579934585c447f018ed39dfbc Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 10:20:13 +0530 Subject: [PATCH 089/136] nav id updates --- modules/ROOT/pages/common/nav.adoc | 3 ++- src/configs/doc-configs.js | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index b1aeb25ae..9482831c0 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -87,7 +87,8 @@ Webhooks * link:{{navprefix}}/webhooks-lb-payload[Webhook response payload] * link:{{navprefix}}/webhooks-kpi[Webhook connection for KPI alerts] -* Integration with external tools +[.sidebar-title] +Integration with external tools ** link:{{navprefix}}/external-tool-script-integration[External tools and scripts] ** link:{{navprefix}}/pendo-integration[Pendo integration with embed] ** link:{{navprefix}}/sf-integration[Integration with Salesforce] diff --git a/src/configs/doc-configs.js b/src/configs/doc-configs.js index e5f40a9ea..84bee24b2 100644 --- a/src/configs/doc-configs.js +++ b/src/configs/doc-configs.js @@ -71,8 +71,8 @@ module.exports = { 'git-configuration', 'git-api', 'git-provider-integration', 'guid-mapping', 'publish-data-overview', 'publish-to-orgs', 'parameterize-metadata', 'multi-tenancy', 'orgs', 'multitenancy-within-an-org', 'single-tenant-data-models', - 'orgs-api-op', 'tse-cluster', 'webhooks', 'webhooks-comm-channel', 'webhooks-s3-integration', - 'webhooks-lb-schedule', 'webhooks-lb-payload', 'webhooks-kpi','pendo-integration', + 'orgs-api-op', 'tse-cluster', 'webhooks-overview', 'webhooks-ui', 'webhooks-comm-channel', 'webhooks-s3-integration', + 'webhooks-gcs-storage', 'webhooks-lb-schedule', 'webhooks-lb-payload', 'webhooks-kpi','pendo-integration', 'sf-integration', 'vercel-integration', 'external-tool-script-integration', 'license-feature-matrix', 'best-practices', 'faqs', 'code-samples', 'thoughtspot-objects', 'variables', @@ -116,7 +116,7 @@ module.exports = { 'rest-api-pagination', 'runtime-sort', 'v1v2-comparison', 'spotter-api', 'audit-logs', 'tml', 'collections', 'connections', 'connection-config', 'api-user-management', 'rbac', 'graphql-guide', - 'webhooks-rest-ai', 'rest-v2-changelog', 'rest-v1-changelog', + 'webhooks-rest-api', 'rest-v2-changelog', 'rest-v1-changelog', ], }, { From c5ad44f7709d3f55ed3325d2be141d0e95d195d7 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 11:23:06 +0530 Subject: [PATCH 090/136] webhook review edits --- modules/ROOT/pages/webhooks-api.adoc | 12 ++-- modules/ROOT/pages/webhooks-comm-channel.adoc | 12 ++-- modules/ROOT/pages/webhooks-gcs-storage.adoc | 25 +++++-- modules/ROOT/pages/webhooks-kpi-alerts.adoc | 14 ++-- modules/ROOT/pages/webhooks-lb-schedule.adoc | 19 +++-- modules/ROOT/pages/webhooks-payload.adoc | 21 +++++- modules/ROOT/pages/webhooks-s3-storage.adoc | 34 ++++----- modules/ROOT/pages/webhooks-ux.adoc | 71 ++++++++----------- modules/ROOT/pages/webhooks.adoc | 13 ++-- 9 files changed, 114 insertions(+), 107 deletions(-) diff --git a/modules/ROOT/pages/webhooks-api.adoc b/modules/ROOT/pages/webhooks-api.adoc index ac0f3754d..aca898005 100644 --- a/modules/ROOT/pages/webhooks-api.adoc +++ b/modules/ROOT/pages/webhooks-api.adoc @@ -27,7 +27,7 @@ To create a webhook for the Liveboard schedule event, send a `POST` request to t [IMPORTANT] ==== -Before creating a webhook, ensure that a xref:webhooks-comm-channel.adoc[webhook communication channel] is configured for your Org or at the instance level on your instance. +Before creating a webhook, ensure that a xref:webhooks-comm-channel.adoc[webhook communication channel] is configured for your Org or at the cluster level. ==== === Request parameters @@ -77,7 +77,7 @@ Hash algorithm used for signature verification. * `secret` + Shared secret used for HMAC signature generation. | `storage_destination` + -__Optional__ a|Configuration parameters for cloud storage destination. ThoughtSpot supports AWS S3 and Google Cloud Storage (GCS) as storage destinations. For more information, see xref:webhooks-s3-storage.adoc[Deliver Liveboard reports to AWS S3 storage] and xref:webhooks-gcs-storage.adoc[Deliver Liveboard reports to GCS storage]. +__Optional__ a|Configuration parameters for the cloud storage destination. ThoughtSpot supports AWS S3 and Google Cloud Storage (GCS) as storage destinations. For more information, see xref:webhooks-s3-storage.adoc[Deliver Liveboard reports to AWS S3 storage] and xref:webhooks-gcs-storage.adoc[Deliver Liveboard reports to GCS storage]. |`additional_headers` + __Optional__ a|__Array of key-value pairs__. Custom HTTP headers to include in every outbound webhook request, in addition to authentication headers and standard HTTP headers such as `Content-Type` and `User-Agent`. @@ -135,9 +135,9 @@ curl -X GET \ This API endpoint returns data based on whether the ThoughtSpot instance is hosted on AWS or GCP. -* For AWS-hosted S3 storage, the API endpoint returns a JSON array with the platform AWS account ID, IAM trust policy template, and storage setup instructions. -* For GCP-hosted S3 storage, the API endpoint returns a JSON array with the GCP service account ID, OIDC provider URL, IAM trust policy template, and storage setup instructions. -* For GCP-hosted GCS storage, the API endpoint returns a JSON array with the platform GCP service account email, the IAM role to grant for service account impersonation, and storage setup instructions. +* For AWS-hosted ThoughtSpot instances with S3 storage, the API endpoint returns a JSON array with the platform AWS account ID, IAM trust policy template, and storage setup instructions. +* For GCP-hosted ThoughtSpot instances with S3 storage, the API endpoint returns a JSON array with the GCP service account ID, OIDC provider URL, IAM trust policy template, and storage setup instructions. +* For GCP-hosted ThoughtSpot instances with GCS storage, the API endpoint returns a JSON array with the platform GCP service account email, the IAM role to grant for service account impersonation, and storage setup instructions. ==== Top-level fields The following fields are included in the response, regardless of the storage provider. @@ -317,7 +317,7 @@ By default, the API fetches a list of all webhooks available on the ThoughtSpot To get the details of a specific webhook, specify the webhook ID in the API request. -To filter results by the Webhook status, specify `ENABLED` or `DISABLED` in the `status` parameter as needed. +To filter results by the webhook status, specify `ENABLED` or `DISABLED` in the `status` parameter as needed. === Example request diff --git a/modules/ROOT/pages/webhooks-comm-channel.adoc b/modules/ROOT/pages/webhooks-comm-channel.adoc index 7cdb21bcc..01d7f55a2 100644 --- a/modules/ROOT/pages/webhooks-comm-channel.adoc +++ b/modules/ROOT/pages/webhooks-comm-channel.adoc @@ -14,17 +14,19 @@ This document describes the steps to xref:webhooks-comm-channel.adoc#_configure_ [NOTE] ==== -* REST APIs support webhook channel configuration for `LIVEBOARD_SCHEDULE` events only. -* You can configure only one webhook per Org for the Liveboard schedule event. +REST APIs support webhook channel configuration for `LIVEBOARD_SCHEDULE` events only. ==== -== Before you begin +== Before you begin Check your application environment for the following prerequisites: -* Ensure that you have access to a ThoughtSpot instance with the required permissions to set communication channel preferences, create and manage webhooks, and schedule Liveboard jobs. +* Ensure that you have access to a ThoughtSpot instance with the required permissions to set communication channel preferences, create and manage webhooks, and schedule Liveboard jobs. + +If your instance has Role-based Access Control (RBAC) enabled, you need the following privilege: +** `APPLICATION_ADMINISTRATION` (*Can manage application settings*) to create and view communication channel preferences. * Ensure that the REST APIs for setting communication channel preferences and configuring webhooks are enabled on your instance. If the APIs are not available on your instance, contact ThoughtSpot Support. + == Configure communication channel preferences To create a webhook channel, configure channel preferences, and retrieve the channel settings, use the following REST APIs: @@ -269,7 +271,7 @@ The following example shows the preferences returned for a specific Org: ---- == Validate communication channel configuration -To ensure that a communication channel configuration is properly configured and can receive events, use the `/api/rest/2.0/system/communication-channels/validate` API endpoint and validate the communication channel configuration. +To ensure that a communication channel configuration is properly configured and can receive events, use the `/api/rest/2.0/system/communication-channels/validate` API endpoint to validate the communication channel configuration. === Request parameters diff --git a/modules/ROOT/pages/webhooks-gcs-storage.adoc b/modules/ROOT/pages/webhooks-gcs-storage.adoc index 02abd0cc0..b9138fc51 100644 --- a/modules/ROOT/pages/webhooks-gcs-storage.adoc +++ b/modules/ROOT/pages/webhooks-gcs-storage.adoc @@ -6,17 +6,27 @@ :page-pageid: webhooks-gcs-storage :page-description: Configure a Google Cloud Storage bucket to receive ThoughtSpot webhook payloads on GCP clusters. -ThoughtSpot supports delivering webhook payloads directly to a Google Cloud Storage (GCS) bucket on Google Cloud Platform (GCP) hosted instances. When integrated, scheduled reports and files up to 25 MB can be sent to the configured GCS storage destination directly, without requiring a publicly reachable HTTP endpoint. +[beta betaBackground]^Beta^ + +If your ThoughtSpot instance is hosted on Google Cloud Platform (GCP), you can configure a webhook to deliver payloads and file attachments from a scheduled Liveboard event to your Google Cloud Storage (GCS) bucket. [NOTE] ==== -GCS storage integration for webhooks is available for GCP-hosted ThoughtSpot instances only. For information about S3 storage configuration, see xref:webhooks-s3-storage.adoc[Amazon S3 storage integration for webhook delivery]. +GCS storage integration for webhooks is available for GCP-hosted ThoughtSpot instances only. This feature is in Beta. To enable this feature on your instance, contact ThoughtSpot Support. +==== + + +[IMPORTANT] +==== +* The new Webhooks UI experience is an Early Access feature and is disabled by default. To enable this feature, contact ThoughtSpot Support. +* The new Webhooks UI experience is available on only ThoughtSpot Cloud instances running 26.7.0.cl and later. +* In the current version, the new experience allows creating and managing created webhooks for Liveboard Schedule events only. ==== == Before you begin Before configuring GCS storage for webhooks: -* Ensure that webhook connection configuration for GCS storage is enabled on your cluster. Contact ThoughtSpot Support if it is not enabled. +* Ensure that webhook support for GCS destination is enabled on your cluster. If the feature is not available on your cluster, contact ThoughtSpot Support to enable it. * For GCS storage destination configuration, you'll need the platform GCP service account email and the IAM role to grant for service account impersonation. To xref:webhooks-api.adoc#_retrieving_storage_information_for_webhook_configuration[retrieve these details], send a `GET` request to the `/api/rest/2.0/webhooks/storage-config` API endpoint. * Ensure that you have a GCS bucket in the same GCP project or a project that allows cross-project IAM bindings. * To configure a webhook in ThoughtSpot, you'll need a user account with administration privileges or the *Can Manage Webhooks* role privilege. Ensure that you have the required privileges to set up webhook connection and monitor delivery status. @@ -123,6 +133,7 @@ curl -X POST \ ---- ==== API response +The API response includes both `aws_s3_config` and `gcp_gcs_config` fields within `storage_config`. When GCS is configured, `aws_s3_config` appears as `null`. [source,JSON] ---- @@ -165,7 +176,7 @@ curl -X POST \ ---- === Using Webhooks page in UI -If the new Webhooks page is enabled on your instance, you can create a webhook via UI. +If the new Webhooks page is enabled on your instance, you can create a webhook via the UI. To create a webhook with GCS as the target destination for payload delivery: . Go to **Develop** > **Customizations** and click **Webhooks**. @@ -177,7 +188,7 @@ To create a webhook with GCS as the target destination for payload delivery: * *Event type*: Specify the ThoughtSpot event types to subscribe to. Ensure that *Liveboard schedule* is set as the event type. . To configure storage destination, select the **File storage** checkbox and specify values for the following properties: + * **Storage provider**: Select **Google Cloud Storage (GCS)**. -* **Bucket name**: Name of the S3 bucket. For example, `my-webhook-files`. +* **Bucket name**: Name of the GCS bucket. For example, `my-webhook-files`. * **Service account email**: Email of the GCP service account to impersonate for bucket access. * **Path prefix**: Optional. Path prefix for organizing objects within the bucket. For example, `thoughtspot/`. + @@ -187,7 +198,7 @@ To create a webhook with GCS as the target destination for payload delivery: image::./images/webhook-create-gcp.png[Webhooks for GCS storage] -- //. Select xref:webhooks-ux.adoc#_creating_a_webhook[the authentication method] to authorize payloads to the destination endpoint. + -. To configure xref:webhooks-ux.adoc#_creating_a_webhook[advanced settings] such as signature verification, custom headers, and URL query parameters, click **Advanced settings** and configure the fields as required. +. To configure xref:webhooks-ux.adoc#_creating_a_webhook_connection[advanced settings] such as signature verification, custom headers, and URL query parameters, click **Advanced settings** and configure the fields as required. . Click *Save*. + If the webhook creation is successful, it will be added to the list in the Webhooks page. @@ -208,7 +219,7 @@ To view the webhook details, use one of the following options: * Through the REST API: + To retrieve webhook configuration details, use the xref:webhooks-api.adoc#_getting_a_list_of_webhooks[`/api/rest/2.0/webhooks/search` API endpoint]. * Using the UI: + -If the **new Webhook experience** is enabled on your instance, go to the **Develop** > **Customization** > **Webhooks** page. Check the list in the xref:webhooks-ux.adoc#_managing_and_monitoring_webhooks_new_experience[**Webhooks**] to view the details and verify if the webhook connection is activated. +If the **new Webhook experience** is enabled on your instance, go to the **Develop** > **Customization** > **Webhooks** page. Check the list in the xref:webhooks-ux.adoc#_webhooks_list_page[**Webhooks**] to view the details and verify if the webhook connection is activated. == Validating webhook channel configuration To validate webhook configuration status, use one of the following options. diff --git a/modules/ROOT/pages/webhooks-kpi-alerts.adoc b/modules/ROOT/pages/webhooks-kpi-alerts.adoc index 2ee5bb568..aff4de79f 100644 --- a/modules/ROOT/pages/webhooks-kpi-alerts.adoc +++ b/modules/ROOT/pages/webhooks-kpi-alerts.adoc @@ -3,19 +3,16 @@ :page-title: Webhooks for KPI Monitor alerts :page-pageid: webhooks-kpi -:page-description: Register a Webook to send KPI monitor alerts to an external application +:page-description: Register a webhook to send KPI monitor alerts to an external application ThoughtSpot users with administrator or developer privileges can register a webhook to send Monitor alerts from a Key Performance Indicator (KPI) chart to an external application. KPI Monitor alerts notify users when a KPI metric meets a threshold condition or periodically as per the schedule configured by the user. For example, you can create an alert to be notified when a Sales KPI exceeds a threshold of 200,000, or when your weekly sales increase by 2%. By default, the email notifications are sent to the alert subscriber’s email address. With webhooks, you can trigger alerts to the REST endpoint of an external application via HTTP POST requests and customize your application workflow to present these alerts as SMS messages or Slack notifications. -//// - [NOTE] ==== -The webhooks feature is in Beta and is turned off by default. To enable this feature on your instance, contact ThoughtSpot Support. +To configure KPI alert webhooks, you need administrator or developer privileges on your ThoughtSpot instance. ==== -//// == Before you begin @@ -24,11 +21,8 @@ The webhooks feature is in Beta and is turned off by default. To enable this fea * If you plan to use OAuth authentication, make sure you have the OAuth credentials and authorization URL of your application * If you plan to use an API key for authentication, ensure that you have a valid API key. -== Configure webhooks -To configure a webhook and send alert data to the destination URL, complete the following steps: - -* xref:webhooks-ux.adoc#_creating_a_webhook_for_kpi_alerts[Create a webhook in ThoughtSpot] -* xref:webhooks.adoc#_assign_webhook_to_a_kpi_monitor_alert[Assign the registered webhook to KPI Monitor alerts] +== Configuring a webhook for KPI alerts +To configure a webhook and send KPI monitor alerts to an external application or URL, xref:webhooks-ux.adoc#webhook-configuration-and-management-legacy-experience[create a webhook in ThoughtSpot UI]. === Assign webhook to a KPI Monitor alert diff --git a/modules/ROOT/pages/webhooks-lb-schedule.adoc b/modules/ROOT/pages/webhooks-lb-schedule.adoc index d59f2d822..7e9e252bb 100644 --- a/modules/ROOT/pages/webhooks-lb-schedule.adoc +++ b/modules/ROOT/pages/webhooks-lb-schedule.adoc @@ -1,4 +1,4 @@ -= Webhooks for Liveboard scheduled events += Webhook configuration for Liveboard scheduled events :toc: true :toclevels: 3 @@ -23,7 +23,7 @@ If your instance has Role-based Access Control (RBAC) enabled, you need the foll [#configure-webhook] == Configuring a webhook -You can configure a webbook to deliver reports generated from Liveboard scheduled events external applications. To create and manage webhooks, use the xref:webhooks-lb-schedule.adoc#_using_webhooks_rest_api[webhook REST API] or the xref:webhooks-lb-schedule.adoc#_through_the_webhooks_page_in_ui[**Webhooks** page (new experience) in the UI]. +You can configure a webhook to deliver reports generated from Liveboard scheduled events to external applications. To create and manage webhooks, use the xref:webhooks-lb-schedule.adoc#_using_webhooks_rest_api[webhook REST API] or the xref:webhooks-lb-schedule.adoc#_through_the_webhooks_page_in_ui[**Webhooks** page (new experience) in the UI]. === Using Webhooks REST API To create a webhook for the Liveboard schedule event, send a `POST` request to the @@ -48,12 +48,11 @@ sending HTTP requests to the webhook endpoint. Specify the authentication type: * `API_KEY` + -API key to authorize the payload requests. Specify the API key to use in the `X-API-Key` -request header. +API key header and its value. * `BASIC_AUTH` + -Authentication with username and password. +Username and password to authorize requests. * `BEARER_TOKEN` + -Authentication token to authenticate and authorize requests. +Authentication token to authorize requests. * `OAUTH2` + OAuth credentials to authorize API requests. Specify client ID, client secret key, and authorization URL. If the registered webhook has OAuth authentication enabled, @@ -80,7 +79,7 @@ xref:webhooks-s3-storage.adoc[Deliver Liveboard reports to AWS S3 storage] and xref:webhooks-gcs-storage.adoc[Deliver Liveboard reports to GCS storage]. | `status` + __Optional__ a|__String__. Status of the webhook. Specify `ENABLED` to activate the webhook -immediately, or `DISABLED` to create it in a deactivated state. Available from 26.7.0.cl. +immediately after creation, or `DISABLED` to create it in a deactivated state. |`additional_headers` + __Optional__ a|__Array of key-value pairs__. Custom HTTP headers to include in every outbound webhook request, in addition to authentication headers and standard HTTP headers such as @@ -138,10 +137,10 @@ To add a webhook for the Liveboard schedule events: . Configure the authentication method your destination endpoint requires. + ThoughtSpot sends the configured credentials in every outbound request. The following options are available: * *No Authentication*: No authentication headers are added to the request. Not recommended for production use. -* *OAuth 2.0*: ThoughtSpot obtains an access token using your OAuth client ID, client secret, and authorization URL, then sends `Authorization: Bearer ` in the request header. The token is refreshed automatically before expiry. -* *API Key*: ThoughtSpot sends the API key in the `X-API-Key` request header. +* *OAuth 2.0*: Specify the OAuth client ID, client secret, and authorization URL. +* *API Key*: Specify the header or query parameter name for the API key and its value. * *Bearer Token*: ThoughtSpot sends a static bearer token in the `Authorization: Bearer` header. -* *Basic authentication*: ThoughtSpot sends a Base64-encoded username and password in the `Authorization` header. +* *Basic authentication*: Username and password to authorize delivery requests. . Configure the file storage options. For more information, see xref:webhooks-s3-storage.adoc[AWS S3 storage integration for webhook delivery] and xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery]. . Configure the advanced settings if required: * *Signature verification* + diff --git a/modules/ROOT/pages/webhooks-payload.adoc b/modules/ROOT/pages/webhooks-payload.adoc index 942121d5c..1a0afb671 100644 --- a/modules/ROOT/pages/webhooks-payload.adoc +++ b/modules/ROOT/pages/webhooks-payload.adoc @@ -4,12 +4,12 @@ :page-title: Webhook payload for Liveboard events :page-pageid: webhooks-lb-payload -:page-description: Review the webhook payload content delivered to a target destination URL or S3 storage +:page-description: Review the webhook payload content delivered to a target destination URL, S3 storage, or GCS storage The payload contains metadata about the event, the source, the actor, the target object, and event-specific data. == Payload contents for storage destinations -When the schedule is configured with a storage destination, ThoughtSpot delivers the exported file directly to the S3 or GCS bucket, and the webhook payload only contains metadata JSON and the storage object URL location. The JSON metadata includes the event type, object type, schedule name, recipients, and format. +When the schedule is configured with a storage destination, ThoughtSpot delivers the exported file directly to the S3 or GCS bucket, and the webhook payload only contains metadata JSON and the storage object URL. The JSON metadata includes the event type, object type, schedule name, recipients, and format. The supported file formats for webhook delivery are PDF, CSV, and XLSX. @@ -146,6 +146,23 @@ The following examples show partial or complete delivery failure of file attachm } ---- +[source,JSON] +---- +{ + "files": [ + { + "filename": "sales_report.pdf", + "contentType": "application/pdf", + "size": 1024000, + "provider": "GCP_GCS", + "bucketName": "my-webhook-files", + "objectKey": "thoughtspot/cluster-abc/user-123/org-0/liveboard/sales_report.pdf", + "uploadStatus": "SUCCESS" + } + ] +} +---- + [source,JSON] ---- { diff --git a/modules/ROOT/pages/webhooks-s3-storage.adoc b/modules/ROOT/pages/webhooks-s3-storage.adoc index 1847f4de1..73f3d6d3c 100644 --- a/modules/ROOT/pages/webhooks-s3-storage.adoc +++ b/modules/ROOT/pages/webhooks-s3-storage.adoc @@ -8,7 +8,18 @@ [beta betaBackground]^Beta^ -ThoughtSpot can deliver webhook payloads, such as scheduled Answer or Liveboard exports, as files written directly to your S3 storage. When integrated, ThoughtSpot supports delivering payloads of up to 25 MB directly to the storage destination configured on your instance. +ThoughtSpot can deliver webhook payloads and file attachments from a scheduled Liveboard event to your cloud storage bucket. When configured, ThoughtSpot can send payloads of up to 25 MB directly to the storage destination configured for the webhook delivery on your instance. + +== Before you begin +Before you begin, review the following prerequisites and ensure that you have the required setup for webhook configuration: + +* Identify the environment in which your instance is deployed. For example, Amazon Web Services (AWS) and Google Cloud Platform (GCP). For S3 destination integration for webhook delivery, the platform AWS account ID and IAM trust policy template are required. To xref:webhooks-api.adoc#_retrieving_storage_information_for_webhook_configuration[retrieve these details], send a `GET` request to the `/api/rest/2.0/webhooks/storage-config` API endpoint. +* Ensure that you have an AWS account where the target S3 bucket is hosted with the following permissions: +** manage IAM identity providers and roles, including trust policies +** attach or edit IAM policies +** read and write to the target S3 bucket to test and validate integration +* To configure a webhook in ThoughtSpot, you'll need a user account with administration privileges or the *Can Manage Webhooks* role privilege. Ensure that you have the required privileges to set up webhook connection and monitor delivery status. +* Ensure that a xref:webhooks-comm-channel.adoc[webhook communication channel] is configured in your Org or at the cluster level on your instance. == S3 storage configuration for AWS-hosted ThoughtSpot instances If your ThoughtSpot instance is running in AWS, you can configure AWS cross-account access with an IAM role that AWS STS can assume by using temporary credentials. @@ -152,7 +163,7 @@ In the permissions policy, specify the role ARN and S3 bucket name. Optionally, |==== -== Provide the storage configuration details to ThoughtSpot +== Storage configuration details for ThoughtSpot Provide the following information to your ThoughtSpot administrator: * AWS Role ARN. For example, `arn:aws:iam::999888777666:role/thoughtspot-s3-upload` @@ -161,17 +172,6 @@ Provide the following information to your ThoughtSpot administrator: * S3 region. For example, `us-east-1` * S3 prefix for the folder (optional). For example, `thoughtspot/`. -== Before you begin -Before you begin, review the following prerequisites and ensure that you have the required setup for webhook configuration: - -* Identify the environment in which your instance is deployed. For example, Amazon Web Services (AWS) and Google Cloud Platform (GCP). For S3 destination integration for webhook delivery, the platform AWS account ID and IAM trust policy template are required. To xref:webhooks-api.adoc#_retrieving_storage_information_for_webhook_configuration[retrieve these details], send a `GET` request to the `/api/rest/2.0/webhooks/storage-config` API endpoint. -* Ensure that you have an AWS account where the target S3 bucket is hosted with the following permissions: -** manage IAM identity providers and roles, including trust policies -** attach or edit IAM policies -** read and write to the target S3 bucket to test and validate integration -* To configure a webhook in ThoughtSpot, you'll need a user account with administration privileges or the *Can Manage Webhooks* role privilege. Ensure that you have the required privileges to set up webhook connection and monitor delivery status. -* Ensure that a xref:webhooks-comm-channel.adoc[webhook communication channel] is configured in your Org or at the cluster level on your instance. - == Configuring a webhook for the S3 storage destination in ThoughtSpot To create a webhook in ThoughtSpot, the webhook feature must be enabled on your instance. Only ThoughtSpot users with administration privileges or the *Can Manage Webhooks* privilege are allowed to create or manage a webhook. @@ -322,7 +322,7 @@ To create a webhook with an AWS S3 storage as the target destination for payload * *Event type*: Specify the ThoughtSpot event types to subscribe to. Ensure that *Liveboard schedule* is set as the event type. . To configure storage destination, select the **File storage** checkbox and specify values for the following properties: + * **Storage provider**: For AWS S3 storage, ensure that **Amazon S3** is selected. -* **Bucket name**: Name of the S3 bucket. For example, `ts-webhook-x7k9m2p4q1`. +* **Bucket name**: Name of the S3 bucket. For example, `my-company-data-exports`. * **Region**: S3 region. For example, `us-east-1` * **Role ARN**: AWS Role ARN. For example, `arn:aws:iam::999888777666:role/thoughtspot-s3-upload` * **External ID**: External ID. For example, `ts-webhook-x7k9m2p4q1`. Required for configuring a webhook on ThoughtSpot instances hosted in AWS. Not applicable to ThoughtSpot instances on GCP. @@ -347,7 +347,7 @@ To view the webhook details, use one of the following options: * Through the REST API: + To retrieve webhook configuration details, use the xref:webhooks-api.adoc#_getting_a_list_of_webhooks[`/api/rest/2.0/webhooks/search` API endpoint]. * Using the UI: + -If the **new Webhook experience** is enabled on your instance, go to the **Develop** > **Customization** > **Webhooks** page. Check the list in the xref:webhooks-ux.adoc#_managing_and_monitoring_webhooks_new_experience[**Webhooks**] to view the details and verify if the webhook connection is activated. +If the **new Webhook experience** is enabled on your instance, go to the **Develop** > **Customization** > **Webhooks** page. Check the list in the xref:webhooks-ux.adoc#_webhooks_list_page[**Webhooks**] to view the details and verify if the webhook connection is activated. == Validating webhook channel configuration To validate webhook configuration status, use one of the following options. @@ -399,7 +399,7 @@ The common causes for webhook delivery failure are: | Issue | Resolution | Objects not delivered to the bucket -| This occurs in the following scenarios: +| This occurs in the following scenarios: * When the IAM role assumption fails * When the S3 upload fails due to permission errors @@ -424,7 +424,7 @@ To ensure that there is no mismatch in the configuration: * Ensure that the S3 bucket name and Role ARN configured in ThoughtSpot match the S3 bucket name and ARN of the IAM role in your AWS account. | Webhook is configured but not triggering -| Verify that the webhook is enabled and that alert condition for the scheduled event is met. Contact ThoughtSpot Support if the issue persists. +| Verify that the webhook is enabled and that the alert condition for the scheduled event is met. Contact ThoughtSpot Support if the issue persists. | Configuration compatibility issues |If you are using encryption, lifecycle policies, or special access controls, ensure that they are compatible with your webhook configuration. diff --git a/modules/ROOT/pages/webhooks-ux.adoc b/modules/ROOT/pages/webhooks-ux.adoc index dac5eca31..8f54ba54d 100644 --- a/modules/ROOT/pages/webhooks-ux.adoc +++ b/modules/ROOT/pages/webhooks-ux.adoc @@ -2,7 +2,7 @@ :toc: true :toclevels: 3 -:page-title: Manage webhooks +:page-title: Webhooks UI :page-pageid: webhooks-ui :page-description: Create and manage webhooks from the UI @@ -13,9 +13,8 @@ The **Webhooks** option in the **Develop** page allows you to access the new **W [IMPORTANT] ==== -* The new Webhooks UI experience is an Early Access feature and is disabled by default. To enable this feature, contact ThoughtSpot Support. -* The new Webhooks UI experience is available on only ThoughtSpot Cloud instances running 26.7.0.cl and later. -* In the current version, the new experience allows creating and managing created webhooks for Liveboard Schedule events only. +* The new Webhooks UI experience is in Beta and is disabled by default. To enable this feature, contact ThoughtSpot Support. +* The **Webhooks** page supports webhooks for the Liveboard Schedule events only. ==== === Webhooks list page @@ -28,7 +27,7 @@ The webhooks list includes the following columns: * *Creator*: ThoughtSpot user who created the webhook. * *Last modified*: Date and time the webhook configuration was last updated. -Note that ThoughtSpot allows only one webhook for Liveboard Schedule event type per Org. +Note that ThoughtSpot allows only one webhook for the Liveboard Schedule event type per Org. The actions available for the list items include: @@ -53,7 +52,7 @@ For each item in the webhooks list, the following actions are available: * *Send test event*: Sends a test payload to all selected webhook endpoints. * *Delete*: Deletes the selected webhooks. -To enable, disable, edit, or delete the webhook configuration, select the webhook in the list, and use the options available for in the More options (`...`) menu. +To enable, disable, edit, or delete the webhook configuration, select the webhook in the list, and use the options available in the More options (`...`) menu. === Creating a webhook connection The **Create webhook** option allows you to create a webhook for the Liveboard schedule event type. Only one webhook can be created per Org. @@ -137,54 +136,40 @@ To view the log details of a specific webhook delivery, click **View details**. image::./images/webhook-log.png[Webhooks log] -- +[#webhook-configuration-and-management-legacy-experience] == Webhook configuration and management (Legacy experience) -The **Legacy Webhooks** page allows you to create, view, and edit webhooks created for KPI alerts. These webhooks are managed through the UI and can be selected as custom channels when configuring KPI alert notifications in the UI. For more information, see xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. -[NOTE] -==== -The webhook configuration and management options in the Legacy Webhooks page will be integrated with the new Webhooks page experience in a future release. -==== +The **Legacy webhooks** option in the **Develop** > **Customizations** page provides access to webhooks created for KPI monitor alerts. These webhooks are managed separately from the new Webhooks experience. -=== Creating a webhook for KPI alerts -To register a webhook in ThoughtSpot, complete the following steps: - -. Go to **Develop** > **Customizations** > **Legacy Webhooks**. -. Click **Create Webhook**. -. In the **Create Webhook** modal, specify the Webhook name and the URL of the destination application. -+ -For testing purposes, you can use a URL from the link:https://webhook.site/[Webhook site, window=_blank]. -. Specify the authentication type. -* No authentication + -Default authentication option. Not recommended for production environments. - -* API Key + -Allows using an API key to authenticate API requests to the destination URL. Specify the API key to use in the `X-API-Key` request header. - -* OAuth 2.0 + -Allows using OAuth credentials to authorize API requests. Specify client ID, client secret key, and authorization URL. -If the registered webhook has OAuth authentication enabled, `Authorization: Bearer ` is sent in the request header. -. If the destination URL requires query parameters to be passed in the request URL, specify the parameters as key-value pairs. -. Click **Save**. -. xref:webhooks-kpi-alerts.adoc#_assign_webhook_to_a_kpi_monitor_alert[Assign webhook to a KPI Monitor alert]. +=== Accessing legacy webhooks +To access the legacy webhook configuration: -=== Editing a webhook (Legacy experience) -To edit webhook properties: +. Go to **Develop** > **Customizations** and click **Legacy webhooks**. +. The page displays the list of webhooks registered for KPI monitor alerts. -. In the **Legacy Webhooks** page, select the webhook to edit. -. In the webhook row, click More options menu (`...`) > **Edit**. -. Update the fields as required. +=== Creating a legacy webhook for KPI alerts +To create a webhook for KPI monitor alerts: + +. On the **Legacy webhooks** page, click **Create webhook**. +. Enter a display name and the fully qualified URL of the webhook endpoint. +. Configure the authentication method required by your destination endpoint. . Click **Save**. -=== Deleting a webhook (Legacy experience) -To delete a webhook: +After saving, the webhook appears in the list and can be selected as a custom notification channel when creating or editing a KPI monitor alert. For more information, see xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. -. Hover over the webhook row and click the actions menu (*...*). -. Select *Delete*. -. Confirm the deletion in the prompt that appears. +=== Actions available for legacy webhooks +For each webhook in the list, the following actions are available: + +* *Edit*: Update the webhook name, URL, or authentication settings. +* *Delete*: Permanently remove the webhook from ThoughtSpot. + +[NOTE] +==== +Legacy webhooks for KPI alerts are separate from the Liveboard schedule webhooks managed through the xref:webhooks-ux.adoc#_webhook_configuration_and_management_new_experience[new Webhooks page]. KPI alert webhooks are not subject to the one-per-Org limit that applies to Liveboard schedule webhooks. +==== == Related resources * xref:webhooks-lb-schedule.adoc[Deliver Liveboard reports to an external application] * xref:webhooks-s3-storage.adoc[Deliver content to cloud storage using webhooks] -* xref:webhooks-comm-channel.adoc[Configure webhook communication channels] * xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts] \ No newline at end of file diff --git a/modules/ROOT/pages/webhooks.adoc b/modules/ROOT/pages/webhooks.adoc index ce3b4799b..5091730c3 100644 --- a/modules/ROOT/pages/webhooks.adoc +++ b/modules/ROOT/pages/webhooks.adoc @@ -31,7 +31,7 @@ ThoughtSpot supports creating and managing webhooks through the UI or REST APIs. [NOTE] ==== * To set up a webhook for Liveboard schedule notifications, you must first configure the xref:webhooks-comm-channel.adoc[webhook communication channel using the communication-channel preferences API]. -* Only one webhook configuration is allowed per Org. +* Only one webhook per Org is allowed for the Liveboard Schedule event type. * To configure and manage webhooks, `ADMINISTRATION` (**Can administer ThoughtSpot**) or *Can manage webhooks* (`CAN_MANAGE_WEBHOOKS`) privilege is required. ==== @@ -39,7 +39,7 @@ ThoughtSpot supports creating and managing webhooks through the UI or REST APIs. For managing webhooks via UI, use the following options in the **Develop** page of the ThoughtSpot UI: * **Webhooks** [earlyAccess earlyAccessBackground]^Early Access^: + -The new *Webhooks* option in the *Develop* page provides centralized view of webhooks configured in ThoughtSpot, including the options to create, monitor, and manage webhooks, and view stats and delivery logs in your ThoughtSpot Org. +The new *Webhooks* option in the *Develop* page provides a centralized view of webhooks configured in ThoughtSpot, including the options to create, monitor, and manage webhooks, and view stats and delivery logs in your ThoughtSpot Org. + [IMPORTANT] @@ -53,7 +53,7 @@ The new *Webhooks* option in the *Develop* page provides centralized view of web For more information, see xref:webhooks-ux.adoc[Webhook configuration and management through the UI]. * **Legacy Webhooks**: -The **Legacy webhooks** page displays a list of webhooks created for KPI alerts and the menu actions to create, view, and edit the webhooks created for KPI alerts. These webhooks are managed through the UI and can be selected as custom channels to send KPI alerts when a KPI metric meets the threshold. For more information, see xref:webhooks-ux.adoc#_webhook_configuration_and_management_legacy_experience[Webhook configuration and management through the UI] and xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. +The **Legacy webhooks** page displays a list of webhooks created for KPI alerts and the menu actions to create, view, and edit the webhooks created for KPI alerts. These webhooks are managed through the UI and can be selected as custom channels to send KPI alerts when a KPI metric meets the threshold. For more information, see xref:webhooks-ux.adoc#webhook-configuration-and-management-legacy-experience[Webhook configuration and management through the UI] and xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. === Webhook REST APIs The REST API framework is intended for automation and integration scenarios, for example, creating webhooks programmatically or delivering Liveboard report attachments to a cloud storage destination. For REST API reference and examples, see xref:webhooks-lb-schedule.adoc[Deliver Liveboard reports to an external application] and xref:webhooks-api.adoc[Webhook REST APIs]. @@ -74,7 +74,6 @@ xref:webhooks-payload.adoc[Webhook payload for Liveboard events]. == Next steps * xref:webhooks-comm-channel.adoc[Configure webhook communication channels] -* xref:webhooks-s3-storage.adoc[Deliver content to cloud storage using webhooks] -* xref:webhooks-lb-schedule.adoc[Deliver Liveboard reports to an external application] -* xref:webhooks-kpi-alerts.adoc[Send KPI monitor alerts using a webhook] - +* xref:webhooks-lb-schedule.adoc[Configure a webhook for Liveboard scheduled events] +* xref:webhooks-s3-storage.adoc[Configure AWS S3 storage destination for webhook delivery] +* xref:webhooks-gcs-storage.adoc[Configure a GCS destination for webhook delivery] From a922f2553831428910cb61b6d3a5729a9dc72cbf Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 11:24:59 +0530 Subject: [PATCH 091/136] edits --- src/configs/doc-configs.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/configs/doc-configs.js b/src/configs/doc-configs.js index 84bee24b2..b1f8bb684 100644 --- a/src/configs/doc-configs.js +++ b/src/configs/doc-configs.js @@ -22,8 +22,8 @@ module.exports = { // 'https://developers.thoughtspot.com/docs/26.3.0.cl?pageid=whats-new' // - GA: ' /docs/whats-new' //linkHref: '/docs/whats-new', - linkHref: '/docs/26.6.0.cl?pageid=whats-new', - linkText: 'Version 26.6.0.cl', + linkHref: '/docs/26.7.0.cl?pageid=whats-new', + linkText: 'Version 26.7.0.cl', openInNewTab: true, }, TYPE_DOC_PREFIX: 'typedoc', From af466cd958dab5e2f39df31c3a6bf5ec78dc369d Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 11:27:55 +0530 Subject: [PATCH 092/136] nav link fix --- modules/ROOT/pages/common/nav.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index 9482831c0..93388aba1 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -89,6 +89,7 @@ Webhooks [.sidebar-title] Integration with external tools + ** link:{{navprefix}}/external-tool-script-integration[External tools and scripts] ** link:{{navprefix}}/pendo-integration[Pendo integration with embed] ** link:{{navprefix}}/sf-integration[Integration with Salesforce] From 354201f06af323f59cc2b4195c87b30317c39eb4 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 11:36:54 +0530 Subject: [PATCH 093/136] version update --- src/configs/doc-configs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configs/doc-configs.js b/src/configs/doc-configs.js index b1f8bb684..ff8f6c417 100644 --- a/src/configs/doc-configs.js +++ b/src/configs/doc-configs.js @@ -50,7 +50,7 @@ module.exports = { { label: '26.7.0.cl', link: '26.7.0.cl', - subLabel: '', + subLabel: 'Cloud (Latest)', iframeUrl: 'https://developer-docs-26-7-0-cl.vercel.app/docs/', }, ], From 56b0445a96865ae96b81889616e0c44469154b8f Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 11:55:18 +0530 Subject: [PATCH 094/136] example fixes --- modules/ROOT/pages/webhooks-lb-schedule.adoc | 44 +++++++++++++++++++- modules/ROOT/pages/webhooks-s3-storage.adoc | 2 +- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/webhooks-lb-schedule.adoc b/modules/ROOT/pages/webhooks-lb-schedule.adoc index 7e9e252bb..3f2f5d008 100644 --- a/modules/ROOT/pages/webhooks-lb-schedule.adoc +++ b/modules/ROOT/pages/webhooks-lb-schedule.adoc @@ -107,7 +107,7 @@ curl -X POST \ -H 'Authorization: Bearer {AUTH_TOKEN}' \ --data-raw '{ "name": "webhook-lb-event", - "url": "https://webhook.site/6643eba5-9d3e-42a1-85e0-bb686ba1524d", + "url": "https://webhook-destination-site.com", "events": [ "LIVEBOARD_SCHEDULE" ], @@ -119,7 +119,47 @@ curl -X POST \ ---- ==== Example response -If webhook creation is successful, the API returns a 204 response code. +If webhook creation is successful, the API returns a response body with the webhook details: + +[source,JSON] +---- +{ + "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "name": "My Liveboard Webhook", + "description": "Webhook to notify external system about liveboard schedules", + "org": { + "id": "0", + "name": "Primary" + }, + "url": "https://webhook-destination-site.com", + "events": [ + "LIVEBOARD_SCHEDULE" + ], + "authentication": { + "BEARER_TOKEN": "***" + }, + "creation_time_in_millis": 1724277430243, + "modification_time_in_millis": 1724277430243, + "additional_headers": [ + { + "key": "Custom-Header", + "value": "value1" + }, + { + "key": "Custom-Header-2", + "value": "value2" + } + ], + "created_by": { + "id": "8e3f2a7b-9c4d-4e5f-8a1b-7c9d3e6f4a2b", + "name": "UserA" + }, + "last_modified_by": { + "id": "8e3f2a7b-9c4d-4e5f-8a1b-7c9d3e6f4a2b", + "name": "UserA" + } +} +---- === Through the Webhooks page in UI If the new Webhooks page is enabled on your instance, you can create a webhook via the UI. diff --git a/modules/ROOT/pages/webhooks-s3-storage.adoc b/modules/ROOT/pages/webhooks-s3-storage.adoc index 73f3d6d3c..bbe74f421 100644 --- a/modules/ROOT/pages/webhooks-s3-storage.adoc +++ b/modules/ROOT/pages/webhooks-s3-storage.adoc @@ -244,7 +244,7 @@ curl -X POST \ -H 'Authorization: Bearer {AUTH_TOKEN}' \ --data-raw '{ "name": "Webhook_S3", - "url": "https://api.example.com/thoughtspot/webhook", + "url": "https://webhook-destination-site.com", "events": [ "LIVEBOARD_SCHEDULE" ], From a432b4ffcfa0e94173a7d533da16ab135501b917 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 12:01:12 +0530 Subject: [PATCH 095/136] image edits --- .../doc-images/images/webhooks-dashboard.png | Bin 158828 -> 147781 bytes .../images/webhooks-list-filter.png | Bin 118595 -> 124094 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/static/doc-images/images/webhooks-dashboard.png b/static/doc-images/images/webhooks-dashboard.png index 1d00b00ff5b29b5677e2d198fbabd9795c4fa2ce..83bd98f21bdde813de8260743e4c5003e59e866e 100644 GIT binary patch delta 33559 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 Bv&H}b delta 46751 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 t@qac1=~jK+eSfzW_`!h%W#D diff --git a/static/doc-images/images/webhooks-list-filter.png b/static/doc-images/images/webhooks-list-filter.png index 01e5a85719ecb240ba00236f1a58e11fe1cd8c3f..ed8848484af166e6229f08f56c80ef5a79e48b27 100644 GIT binary patch literal 124094 zcmeFZbzGFq-aig1N`oRTrG(N*w~B~>fD%hA-L<>G(kW8X3IftdNG{FNAt~LROD(;0 z$8S0Dob%kzeZDt;{{A@2YhTy3bIoUFu9?q#@;wB;SCk>ZrNYI)z#x!)`&tHO6t9=lob7YJBX=;wFw5s+rTLGdm1Y3WJy3}hCA4=U&yT} z5PyB}LJpf_Ka8H00f$&F1m|T-7<=_6EAsn!E3DG}!=ztY{Hp}WT4u=cSUajJI31T1 zuv0qgc56@SD)(l+dd{Iel~7b7=Es?q7&+(%1&m$Blj1RbuaU*Yhh(diFEH=gd*k&j z;4LaE+S?0#G^x07bMYXc?>H>>QC?5JxGFQpk+#Fcc+1zk`l^ziXg(RE0f?onDS`3& z*c3fxj zp4ZO>ub3L`mhDF)g*j&JuMDGjnrg&5V(>EP_C;>*_SbE z;{&yK0v`14cVeXoWb2Oqu?B-AJ-(sTXI{q2uLvmtY07!}41z8?EruRsi&Wk{+t9bP z6oSUkcLGlwooB2lpL3dh_UecsI87P4%KI%lm$lEc$$lU5mJZ6^6{Pg(JFe{uZy}xs zh6JCVED75hNC{;7X-@q%ppJbEpbW-pe*TqlOfMrm%IxGCaUM`7LzyOZWcMkLQ^m z@*+sWZE|vN|E5?|$yxl^MvV04{(^@h^^uFXPxRo|li#1O5clZ-m>~@00F$eFWWYEV z{=Mf2sSrcwH)I}T5fpFn>HUd)KEo?8w|v|Xi0!p|xx78C;{FTAhDy%wRv5+TwVCYi zgB8ii+uyiQVpgSi_PzHUsP7>HWAW?QdQDO1NSP!AQe)hk!s==I<$>tR|FT4Q0_(!H z`gS<`_;?M6VEjYE)2Al*E#Zc|uIc`X{_CHEo{#DwWtOZ?-_}(=5l=%RJ)=Artef5d z4QCDR6%LNsZm^F8@ne!XKD26`C~A@uE1st%$ge<*8{WHU_ZCST?TTT^?Mk1@p2==o zP0QiZ;}g|8d2VO+7Wun5R`Z0N@Z9LLhFD;O?W4}|_HhD?r7M{O7dKMgW4)K(H}xu* z>M`d$?Dh5MkX+g;A22-a1Co8E^n|Dd&daheZI-{hU|@T1Te17P!6H~;QNA4CtVtcozk!B8;@E3^vs&IVZOPQ;hoOoitDn|B_V`fC5U%CzgNFx%2T^fx zaj|g$S|M>7ps!kf6B1>-mPf-g*;cue+0bE?VbZnEVW(_5mHO<y zv^X~JY|?JR?n*U%@X2Ht(#ZOd(Vt~2yMUGWsyrRKGPvTmZ+D7$isf3sEIlX}ncF_9 zouZlH@^-Jvw4O}L>J#7_AZg?|OaxYj0xaS<93kE)3(&Z@ww5{F!SqIE|eo}Z+VZCxh$`denYMs;*X zeEz&|_)J&7`}4%K*7Q^7A~RVA*oG%_ozzgZ67rJoC1t##JR>i4ZcjDz(6{PG|1$Ma zxm#=G(CQjW8p1(S?X|%nHPqL`Jz|rOaBOmH@_b^HrvD_n|85$|o7&cQMv@EG3uUb` zA#U#|m?fAEBg>d&6q1VUH6H;ub3Zvm44YY+QyJ!PPn%8{oc`*XVE>i(+qz&}2bv>1 zDc0l;bBT9J_6wBuZ4nE04F*O(l!u!{FS&LOMnm%QU=ewBWtPRRmN2vK63){6@;W1_ zlAW?x3l$KwCEC0b-d!|p?AA|M1}*C>&MmIi51*(W58f0UcM5wFvPZ!}sV=@%XC!HjniC=BoZFlVC?751xyGED~gvk=scGsNDOx9GpYe-l~ z06nVQ6+BMrhUhTK>Adm+xZbU6yRhQ#eXSK7G`3M&db3hyBt z5yjil*nE%q3>BIa-*�HCB1}d0rY8SVaw@5$8QcQW(Cof2Y>9FosjKXQkjz9O6 za1x5aa!xr`ma=PQ*&`}uO5&p3`dVA1O@ph0Cxb-k_Xi>d)&?YY(~gJFFYR?tTlXa} z)eCjEwO3fQ**5OG1OtMTjGfK$dYt1{6DyfZSULrB#d6iVNY#V%OaqJ|?Vgb&Q6+3< z^n%ZvAhg0<9H=j^fe}xHg`1pPHz*U8-7Er2t$rfA9C*)+4T=-(UQ4LWBoy2hJl({l zZV?PR!;-*K!-AMG^@wl-t>DIvXOF6d<&k2~@LA6dI3?7%%Rx!2H7$Evy~wUvIELnz zx)jillg4?!>EKV~!|Xpfdo<6jzN+-ErPfC?a#%bQVAWMU-;SSytjY7q88eO6ADlXN zIvqRBqeP+=wW|zPk;(?EmCrMacZWn$E7~+QJzdoSN$^1aUzj;}V5RMX2#`3rXEc zI(Ypi#@UM|rD#cz*l!_?iO+mJ78_O_mTQ)Z;4QI-u34~_+@-nRFiDgpKL{q0=jPmU zf9>o1liMy=gY=z*@Y@*o;asV%@#eYX=XLOrAY^3 zZYz(@v1DW^ewe*CIFgi-6x{n$Y~7R75H9022XN1DQ246m(QAEWUxZYNP^tEeKIetpX7DfPiVXUP+h zA|$JTT6}an{jOV4T}jwbM}wj9(!-S%qn{6BUK~TjcK$7mL?=O#Xp|pz?_J=aWCk+B z$4f=kY@pzrcKTLE4j#qyB_1)rhjY*JyFS{#h&IuXHC0f+U`5|!V_;!Ez_^XR!$kjK zU{YaV{p}tDLk^Srf9{nrpZ=rHEewnR3yeGesH26xUVpxzzi8@zTyIDCW86dkdVv1= zrri2xZ5&X_?SJ0ira?c$c&Q>KD~rCW7}=SafT89P`zl?bF?0cr&09?<1_l|^^%qlC znQDZU;lmSp7UQGd2}be*NYjmS7b{_u~4f9q58UwsM+3;uhT|MukHD6ii^MA-xiv39tgLp894y~J}du0JdO zBbDaA$Rv39`2Iok@1=jF(D+k|e=q$bg_4~GdL9g}hbF=Ej~@QL>>u^TxUSd!-+1Bg zjP|!uG^a`6igEo9*Gk~3rBw1^V7$PPef?6^8FORWX)4O(;@);}?VZ=EhmMcI(l!iR zwKAp_fltgV#<$F3qcWo6DxY&ejpNv$b7bVtRh#`bm{{j9jGIt(V6lJ_+N8Y(1m=dv zfoN|fYQ1jDb_O{oS>L;U1}ovC{6+ubBL?QJJJ`g3apSFZKMTm_WJ_{`x_@i$EtW6* zocJ%>{d?cbQB ztL!O#sao(DSo($pKRD|DIjp~$^r6&`eE<%_YSJ4LpeOt8e<%Cj*WtgD{fDjkU(Wt_ z_PCy$|B8`6%EYyT&O5;|>^OMjoP>Df9E8E-T(WxdO#{SNTtk6Z>MTRK>Vh8pS$bT2 z=I^t{0~cQfdAK z1M1UNvc;W$9MXS~YG}Eh$NK~Jo#V`X<`cJ|OGZ>F;C{AZ#Hi&|g@Jio%~~^!&rODf zu2V)|sOSqfbby6R#*;)dqoQaXA}oR3@%)4Y)Omx6kJ-BCU2mqC@|eBLBue>_dncVa zRxsv|T_*92q~&q^pl{;`ihtz3KYvm0;m3s|{_qI!XM?SCEW{pTsTwfNpy^b07{)AH z-8@m1cJ^1g`tK@ZyPmla;14&{UoRPlHZ}SMTV9-*e<_u)bg6_V=A?=>SWN7DN(O{l~j-7AoFG6QaWpb5tF{d-9C&>NedA;PL@yW;B?&B%RE z5BBOCE$H08>yQ_e<@|tEUtY{^uVyA^9MvAT%@T%E@prlTlWwxVV~sLNa%mcYHTofw z;i*ej-9z12&c7TN$IqQew;kJ7S0^%#7!B$z7m-;f&{`^^Nf0X&3gL&pHn*BOmX!|Y zx7a-!uLMtvn3RKVwwnqavGe$Uz|;^GJ6wVRymbz`pHaC+d0Tw|_vJ8}2~#?8L1$7H zqZH6Cxmp>Ofc8vM;Y1%GCT!el;?MW_A9tVrCUI8%PdcNW2quI6R3^3y3Z5*7CUOJV zaos}LWB`rRm}f?T`dag``;PGXu#N|1dA@7|>)?dVeEKt&@SR@)bW9vnF_fVCX@J2t zTW3y?!uRj>;GKCUgVwI_5+vMelDRr@+<9;F!!=J25|6dfc~QmjSv-PI8AkS*AvYUa zsmprU*-msb6|qsFlyo!hR;m=dj)vd)-4r#vF31czy9IIFHjCuVhs<44@`kX;7)d*I zABnMtP@I5|k0X_uTovN|327#LJq{;0tV>p&GXGuL*)A)9*7%78sMoyU3Q_Aa@1 zQI|JSq+9D~3b`&$W|E!z%1oKPd@B|nxu4aQ9k5COx^?cdH~3}zx1fw)L87zjm|@9Q ztkn3C;EcQAln1J5)vQ~QnL63?RP$6b$#ZMTW~%>Q0IYmM?8v4{eA6eqaTZc9s1xtD zUD9jnN8uct>~_Rh;joSAwnUq6Ckha&-b_9U_<#zPALX;0db&|$g<>5Q{gaLRf45u8 zw}v%&hNvoFV5MI$fU{JMwb0?sg9$AiBa`HkDdg% zx3ySu-b~V3vs*w8ApC7F>f7FF;J3R}vkY_U{HW-fA{?FXK7h@dm)f=|PjQnY(zYdC?4RukDu`h`Nt2el$=O zl#))44%-ho>a$7Ac8HlNNT`?mRCqPGNXll|!oy^NMbV^S8-i979^pSS#=^Momg{97rTmO@T&gH;m_Trr(r`GBqRw^YYi8re^m#z`{U%+rL{DY& zes|5jXMnuZNzhTc`~orzMD4~5qgwb(+OT!j+h8wx85mU>Cb|6OeSvPRJ=k#|Zs#W> zBbkrBZ8NK(Hm@ioJvsiU_dbXTP_DQc&&yqLMi30IzT{dop?58#7@z=A^Qh3(Nd z{uJ9mPwqDKJhCwyD@3Q8X6gRmfc#(Px-Q|rudxsXx1{pdBJqY{YYigv+GD-I4GJV5XH}%IXqBfypQmY+a-oUef>&8-aJfL8Oy}{pO^OECru4TIgt4CfGM3 z&?_%iH~w?F_*ZGg6+))-mWJ(FMmm8JKDed7#-(ICYJsrxE__}aKXJ*w$PJ8qEnpc{E zD(`L-gve4(@r;tOTx}RAEZq<#MfV&i6;My*pX8uBKKfLck@iU&V|^uE4T^x6q0vrUBv(!S_PVe z_Gg1iW+sz(tta88UGMZ(eyZRTp_J7%SSDK&$L|C$HuE=z)FbCK!?{>f zOjvHFl(W1WsE9yO@#9p{z9rz}&TeTs&{&~*@Uo?d?Hgg1Z^;~NNK2+s`>mS12!NQ7 z%UZD<(5OwRBR}*p{Bgn#ml}pWo4X`X7 zcWzQ1T-B~d?4l4cuTOBm} z8DP}e+NIH7xjDgE56&|OSccH@N{CLoAvXtdjK^`PZ)7_IUg?LH%iy!qvE5iinz9JjZ-7M!O=rpHDl6%dNeYvx&;$`p1pZU&^RJya~q z1em@|WGqtyum5^S-82;h0<@CP@qVgG-9Izs6iDk zCvNfV;ZIjN;```2GfmS-+R6&z&O{cgKB1Si# zPuh2(M(e+;9D;d6CLz^o6q2@fpFt0dvey0MQP|{3PFm(eSq8s`Hy+%?n0u;}B9x&# z<3b8lE70wxWw={v#|Cb}7!75bUph&NQRoAX8Cc9Oj?6|0!#!V*EADLCT*XT zW1+1%R6wAt4IA$S6US{{qoxsRV}T}LS(U*#b^J%9b%vy{mSFPC0@njMvy(S<2jD}k zN@{3ijz(nWyG}(l(!vhTr$$fwhn_FMoMt+$$!hBl4zo72tKrlclP<`*3tf$>nsq}* z(3JBYYzYZC=sKVtBFgkw@U>21yE}U6I4R!FpIc!*L$h%syZ9+tmZo9O@wr-(W-Rwm z95xu%1XX znvO?$u}3wyF0ydVLMwt2hTL9>cv4-;Q?2E1 z8)qT0bOFDlqI)5=!^`7Fe$=oL2&JOL>dMBxFC+a?gH*WL(G4X};EUR1mNaG-Raa1+ zMyWm`l}gXCjiy|Qnv9V8($W>|9{wRis9xkvWGjJ`wO&P)jL%(y#?Auvvv-w8BKvb5 zL0Y>C?^w-D8nt4}c-%`*eopgNub!RC1~-q&)FgtH6m#rCX(XQ!c(fD(@&p`ay=aN( z+_yit))+MTBYcgBy8V-Moh>xJOL}>_TJNN`7;N{AO8tzQ8#eg&c8kOtgFMS4~3&I{w;|$Y17bKICVa`V5C1sFNW*l8m1Z@}x;q2QaP)|bd-~~g| z8(-HzFQ4?sVN8#1d1aD?W@z{Y+y&ee*T{jK zVa^MQHj{}*W1} zpQ%W`m4ecUmdYPpFxNB}s&tA$_X93>q*sz2R8?DLQcHMNAJ(NgGt~aLfT| z(=i%`1Dde@CYm@M2E(d{Ze=q7syk>7);aKoTWkhh%n~07toHMxeG8g!kEOAuMjjd3 z?@k-RjcP7XKha7M3$%Qp>LB7U9GUDOHwHr~j(6x)BHM_^8SZV;^awAkGk}p{V~=;O zSZGNJ;5l=qx)NDoT$VT+e zXIV}TIEchh&f6N!`f!pAxje@*m|x6(CWG(7FaHXd>(&eiD~@ZeaHf{jpRLRvS1)D$mX)-*ReMB+!E$Dal*YnNk>RWc zM~+(OL4=%AyZ_BX8yMbd4>e})fl0YaSu@*S3{7aY=h!M6$m?6F)#)H_q>kvnuoVJ) z;q$lo6&gP{j1*e}c3kG6ls7U$u!*z2HE5AcSkL6yW=N<@=aVF}NW|Q9_;NVc zag$?jDuJx}5p?u%D(mH`Skxy+nj1L>XlV0w1dx<2OLOqe4|EvR78)Are04BVoTF!j z-xP{-BQ2Gc)u2T_5tN+oQo{V>rLu#SLdfaCdd86+$&sVd&Bjr8e#;@6*$8z0eJ9(r zJC>S^T|?C>oSe>BOiX$8cJmz zSTSL*^Zh0sCx&-OgBIOH5K$Fc@uaVf)D+swE(L!Y&IYn%=MM|i}m6>@uUXq7VZ>KwZLE6AVT5q(qUnRuvyd0hL1WB!2IW#ru?hKx2{Utrzwg|mKKd2qwc|5W{jd9L=e^&7?7i0R*BqDO;E zUv=k?vhY91%MMcF30CzEksEQ=9ci={x{yX*mndkn?_5Y9UPKwTg|Nl_n zxCdfIbLvo$ap;~iUHVE;{pZ#Fr(o6Jyq{HnC>F%>jEURp@_c)2K?zA?IiBjWQjP?> zK%*vH)>dB{93}{lcfv;VG{>s1XvaOMGqB#&?3hwW8Ymy?*Sb11VVeBC;SgLCw%KXTmyUvrv&Xc2P`sBh}VBD^ct#|-?L;F zme}jKtz2aw6M2kG#|&aFUFcjUL9TxHP_^Qad}YxyT4#G_$o}`5&QKSpV=YRF4!7U@ zHPH3~P9m?`C3sCHI>nbyHG8coNnB`G%oC0Jmd{eE9i}~UIsS!+2=;oY z1-JfiC_I?ii(P+qk=&@`G^;)$e1@8oJYS1Q_74@DDa<<{yFtij!~}Em{^$~0PzUd8Ir zew67!942x3joWeKSUI2sica>jB^)KvEtZXS(dL;xfiIo6euOr5g-d3eW;FdjHp@RA zc{>18E~_q%laesJ*Y4z>4;~-_Gm|(ftw-x>n>^1pNJSj2lS>=&=zhLSjPtKXBMX!l z?n$0VSF9h_qw~Y^NO7*Z#bV;yx*2a!iB8z@pou44N#ZPGSB;$pt^=nfHqFp0+esb7 zBr;Lc`M1Ph^ZuOt6Z+DFj1yK5;#)1ZB3YCO)b*fJ{oV(0{CMS4_6nb0<}~gcL@Ht< z6CAXJu0GL`l_|TM{NCPf@S??$p|O37urPS@pt0)cG9YNV+G+hk{%I4WQ2+>u5*KjV zs$8;z0h+5$T63lFok+u2lGt_1*1OARIke-pW}T;_&~bgC@pRdR zZ68!3-QjGxSHEzP!uqA;iWn&_b?EB?dq%Jn9?o9W1J8cz_mTvhzn5?_WA0~)B z395DwnlJQuRpZ6fn%WZFgvV9$C`s`XUnH{v4hgd&p+dX>4my6SsH@YcC<-QboQ3tW zPO}bXfL8}H7~pMgJ4@<~zKhl0`CR182P$M&hOIjLpq<^3y(4VRFZw#dvQ=h@d?I>x z4@J`&W$3!GgULAX57vf>#H*YL5=EWxi@ImvfqECN2Y^GeRTngB2*1g{o>rGijIl=2 zLF@Rb#rkNv?Lr^g>Fwj^33db?Og%2Onlz2tQkiZqazLD)?CnLj;HvVlt7Y%J{Dl(K zEtew5uSd;XG`7TOM;{4wvKn;bQ$uPDX57z@idUJ%cb5-W>&<375sCqX8Io3MZwT;W zCRqNrF!-~TakscL65BU2Rk`=7-h+_i(-rFW6@D#zqS#!5_rA}Y0J@7|ZgHID#V}r_ zt2f6xM4Z19StsfaPwV}yAQi$8i6oL<4t`x)F~0NNQFULm7SLI<5jmQZ3ip@ybZ`+` zOu1;nX``V$-K+#gS>=juuNW!$C!fz|NGEe79i4vuIzH$$29DpJ#_Q2s-3H`+-k+B* z@Vz=~F+tS!8x@asTjRSTGP+EUSHtVc@47FfTl(0KlSG74jGQ8rIB|LjU3r|U79H`y z9;ilWllK`a{!SI((Fj}3i*t@Cha(R}Onuek=D80J3s!pKoC(koiyt1<@L>+v&W;9b z?HeZYVIsK{M2VnAlFz&^Wo4}6UFo~VPkvAQhYiOH61IW(&j>wM+rRXg$TayAG@h=P zcWs#ocslo&OSumlqZ5}!i@V3-HwepkbLGD1R_3yL&j6sGD1)FSHiwyR^7cEUa)*)e2OmuBM zLEMwPl-5M&4+lU_Q#7Yrwl9tshDW13lI_S^ zRNqq7Dl&iZ;BF9U0>D)J0!iHj;i}Jhli5lJ1&xEClE{f z9+h?{yU9eSg6#wfd(piOyhg0qGud&5oGHB4AUzg$hZmnY?xOQwW93JlGQP*!Y`ppC z!20$XTY*ljN^sA~Q;V3B?!g|8xNwrIs=eh>exr6DHsMN#f+VKi^I;P&Y{By-h{3N< zSWMxgt&4h>u2vOivqTT4*S-~aWtjKez&V`jWGw6{l?hpKLzS8B9*w$O7T{CTN}O2( z%s-?OXlox2bV}`xAh+`M8YXqo3o(utK1IO4=l;{uU5vP zdwuz!ce$BEXB`@fxiiPnb8>i zWhd3^sx8rAAyg{>+AC4}=IA$j*yfqzq(e;K50A<1iuD^;17KDIV2ZnoA*=A3@~_fk4Eb+j4GB;PQH6R!cQy&E1k>}eIKZg ze%_=oW1JmDYs~@F?#Sd8>q%m(r7H_#J@pN6lG`R^8kw(vG$N&V*Fy8@#?CIARMX|z zA=hcrwVj^iygQzH($zfoODY#1Bz~f5tM;?etvTAQNWlQ{8S{Iv*Xc!Hokw+}6k;Ef zB>?4lWoA*xdNh}Oc^_+y$Ss6TuiFJxhNyh*Aaz~<>D>j>I-csH~CX5#wKLue`Kd4x?pAiQ|-uAX;I78!LZn7>!=BrLyT}N;;KVHV@k2;oc6+ z+#_tU1k^gsFhI77XLVxB>6}iFCdIX#x>53I6v2*y;41A_#X)Q7DPXEMgu<>0IdhM< z+N8Gag=&qu0U8=LRcO$(T|Ij)c7A-1{9DaPqSHn7qPtpT{l!5GVyZ-u4R;8g5>K-^ zl7tZUXWG>8>~1z@+g}ank>7*QpAb!ZnYE*#6c*JWH@|?Zy@J9evUpM*UierrqNwpc zP=Ch0QxZ3GuwgRuWg=^yT_b4c z1*q}B9vs;a+`z+{cwE@y2R~e;12Qg$qeK79Uh~1V3{AQm!pX5AKayhUyduWC>xgI$ zwH!rDZ2P>=etIW$T~0#6S#c58-%Df8E|y}*u;QO1jc1JbVY63TF|pGdX9t2a56C#Q zzD?`(zp<`7uEp!gKGZc!aFlCLQLzptZ?aelq4*}U_5De%HdU^g#{pa0LmE0>NA3Qp z&w?}fMB?Wf{pU_~9)N2HGxcODkb<~+ah`5T(WD$wy|A_6Xu1%To~nWPj3~T1Tb2Id zc|l4Zd*(VY@f@(g`luiF^X1PrS})df&g{DYA;XldW25k=3A!9-_ZZdk?n<1a3Y#1! zzd2lt%7naQ^|^R%T|JnDNZ6~Vo3D==7OuNWOAhGdtY_`|ezLPx6KX~B*D3E2TyF=? z(z2H2c>l%`P*Ka|3Xf6n3q4ntw=>$aI*vV);i66criOd>NhLQ!u1+3EbOp0gfm;cJ(b#2WHPt@WQIMC zi{Ey6bru_Kc?Pxi%g_MqD^&ZCmB`@S)E4?-Sr%HLy=Qiy#%7-C_qDKeQlqW!f)G#V z`Rw_T@8pb#!k-Fpi<~gKvqng=&hA(POVTr8JIqA+F14L(eEvEx)?9!d~KH-?I7hu!*+BN#vpv71?ZzpBd@3Sn?!Eg^nXV~z>sb+hg%^;F?xabMM0NmX=f%{{+_!9$*=U}*QHg?E-inPY zyJxiW!l05Q9vXi4o7NT4@@ssvt5r}@qG*F&O$-^I>CXS~w5?YFxz}3)dpt{V0$AR4 zL809u`h9v-Cuh@O{C^YH*`(U}d!$Sm|u8$p#@U$syv|SR~_5r@OzIdeRt( zY33;^cCZii8&uoU+n?SWAd6Pxd`sB8t#e-6HafI;R*#&yN(T`eZ5LJTi~_-UX>USt zyecm{`p{0`S~QYo)+oFV;q5h>bbi;&_h>em%)eeFHA`7Xi~)`#zB^WsX=Nne6&Hd= zN(7kQBOojYb!N*>IkM1FfEfkA+v_v8436qV0~qVgZ{R&%Gxzh-vRR3XpjSX8N#3Uk zy9WivAB?Q(C@|V-L{SwUf0Ip@_vm^Q>-mK0sYZ`+B7;7u20SYD`ta6d>Ue&xM~UlF z?XZfin#ZN%o263d%ha`rvn5?dz~lrw&L;&f>^Oxu)r;DBhbl&c(zQ2e6I?3qyPA2O z@oGekN?U0B7xcOcj2pX*<*(=m25wDPefzHP%3OAigM>TyR|;CP$_dCP6)_v-CdHHc z!RI0A3HO1Qq+u6Fn{=KRxmWVHURz1L973yKo6AbGYqLN+#C>m*crs+h>B=kE^Qto0 zpbwAB?^u*;c!t+W2jOV_gHkW{{-ly8>Jzl7fb&f181>{f@8I~+wM&EeafV`_dnEAkk7h67#-qX5LB zBTJ5!eS0mi`$X*Kp%mn!>8XIjc@yhzBWUn=X}jBBhYzYYRIn?YYr%Te7i0392$`tT=Mm+J05}kp{J%X$DL=Mq;5< ziJu#t7Kn$O8)j zeDXsYAJ#kc_#v9mcxgwr(-}1Qg0xb%00w{8s9KM!B<89&0Vo-gMxj-_@*sbb)lk-l zit}Qv*OY$3ALQ@R6PVl}&@Eo9WL%Vim`>yMHZH^$BqEA~)}+ zjb5H@(p=h})$gv{C2-~0sC1hp24;xwES9*m83LPy1SahxQw2QH;ff@LHtN$qpU`1rzF|s5DSr9KKsy6-$Ht!I6c(xTp?Q2QmZJhY8@O`3adHm0lvDr z2!E=jl_PH6pZc67C+8y|C(2YUW@FMVpbr|XAQeouo>9T_?6F4CW29wKvbXU0zt`95cQ7d zk+={yyTT=TvQah2^=BJ7r}lT%`_vCw!;&BV^w^2t7|50yD?^3-kU`_HN1Z*ICk<4U zhpjIb>tA{}&Pdd3?-p+B7EA6eC`rYmy(b-~aUScE1F~`GrN>nogJ8|^wo$L|a(BF6 zZ6q;pogmteY?hi=qSgzI6HR6UFrz&znnpC-Cb2ZFOSj{%7rc-PYh=6+fHuU*io|w? zN)RlPr(op|X7=B8h&NUT-7@Vx@&?MRW@ilMNR-Taz0jE8>$obVKS3|iSToi=nhJ=c z&Q>d#?2B~nFVLnkueX!j%lSZ>$uya8*p5kCX!3jep1ZISt~lT{iB7d6CoZTZ`b#V- zGvQ1rRs^mmErLe`NJ{K$6frL2C|>6+fotTDdWGN2|HsT3#1 zR2Ri>=ObUqQX^)3Qol+&odaR3vbVq{65lm;w%FdD>STPGh1KrGd)Ln_iTY8G==vfb z#&D@@C zcZ!cysW7tREm!x(i7HZ+ij`l)(L6bE>q|*uY=~O^b%;Vs^C_?T^cfIRuTsi*x3`0m z=gUF$toEaM{&@(m(-ait!vH8g9ig1z$x22i)@ksh;{xBdnte)ha{wKg`pe*}R&`VN!|@H9BM+hg z9Fk05^pTm281xAeT7z}ncy+f*v_I2(7hYw*MSM78HQHAyyTFasIEbChB%*7K+vvs8 z;r2ps&vl>}S0OS7$g{t%rF?(=v(!;HdsF_S6XXBe$VnvhN{UhrDQSPHD`%3Gf4r$hLUTPBLaWXqslDKOpj)iiq;m zb@v?Nr{S^=TdXGmMt#`isx6ZIE1meUK@N{y{!ZThs?}lh?Fh0!zlEh=QcZhYi|P^M zxwBg?ovx@FsTt2H%AMADM7G)8rS7&vM>RFkAVgZD?NKe!Lq!<;qH*L4TUGyUA_;9( z7xw({kA>)kp7;=r}B*=dd zVW}7yJc2$1B_K*JX@u6A*O6Gda4a5rMs<(-sP$y=&KpwvE{@_q0|}thu47a_D9CWhi%1QMu4l1s6@EJ>_X*& zT~2XJ;aFCGXQSUW>N!iVUf22XTs*w>gzw)$D%dcR*TgB}4!2=wy372d9I9;3xjxSZ5GN{)5 zA+5Y)ZTSGVGejo>8FsWel3^sYwIUTU5)RBXD5P-a{mT@e_b^wXVgUSbtXAnO+Eyjx z%=un+mfxurU_u6oRVCCaNRbnw?U-;ETD9#N5O}Q-gvoxwG zA@9`(k$Ld!=nl-=Ub z@;ZkGjuW45D0`Z->C(d~YF7Po<#eqYD3RnBTXLM*f$i5}yWKo=YN2w`J-b~aHjn!b z%I7N_aYvX90bMr*9&?@n^ zv|5Ja6hnQgD%z}W%=bVaGF4~gD@94TEy3ESSEEaRi=wkC(9D6&V9#SOM0a@*aBYb* z;qX@gVtw`)&=1|J116`pXr@hNsDay32K~q{?EQYhDDIq$_j;)mD-X0tUU&)&DK9Ai zn!GhE*86<+ZUc4%Vy+Nz+g&BS1>0e1Gt?xWyCw3$Bh45y<7Na;<0L^1?b6VG4o{hq z$Y^`D(3apBUy3oR%ZbmaOtaN<2{nLtX}p~8V_YX39>{Y@l-Mac5Ke$jnLl;0R%3Q! z25lJ%71%Tr>j@(oHGZvD&t7SM1~K8ad1HCECOT=6z3b2+hb^2ykv*M>J(Hf+b1FY_ z*38bf2Du=hO3`)LC_BE;(y>i@FDL%&yH9UEfB!qJ(xNGn`ztEnfTMV(5GzuY|7S#s1^=WDUPukLpk~{@e{e)1>v2A0BVKTAiT0mN58C znw$Ny++Z%!rxC(gFK~XD6F-2VZasSgx4G=e^>%&S|MDI{hk%WCw)!gRhiqi4Eia_` z<4{m*G|-w%u57nc9J!CF*E_9HZq%?e*QA8)Rd-py)WnLm%E{^+JIdwYKBCCH!Jz!| z)Ie_~F&aY2(_DkacnFKZw{uU+g-8I1#q(m{rcDy{tm<`MkZK~ZUzRlC7_D5Nx|FHh zO(4lX9V9^PRYLc|xZd4*Ms$h%S~&YsCWbKOV&mSA;nQ_wB8ihBQ<29JC*dX90`Vgh zU2EpkR$n1wlk(Urg*Fa*>C*PKYga%s!_a~2Ok+o@bI(g*v!C^CjU+}^4ZOXTg&V9^ zen|B)y4=u zdag{@D2Gy9ou95l=;W;w{#?shvh5+3%V_(?Bag)&KXT*@V)=(_M`1t~5Ts&{oCDv; z#;RlJC|3*wQ2fI6|FQSpQB8K+`lz6Yf{027DOS3LE=Usr0Rg3i5;}z5tCUa$RHP^b z1f)oBp_9;qg0#>}NC;IrAs{tCC^vrl?7h#qcl`7__pdwd*#BfCdEdNQWzMh>ZQVcq>JsMg3I`I)V zLHaznwDE`D?7%He0jdldQuufOR~j~`_Gst@_g-=FfW%RG*hf_Ssem2xS@0&q*>@zE zfONI}C|_g7Ym`zf3tN_E;nkr2B-6d^ESvZ8+5Gn!ZeM?ec2ms%{$d>7ckC?5*x~{1=Z1R9a@48lEFiNH5D{j)2wsF_# zyd|+oD+KFbar`8;~tgscU%H)FG#kIX9rv5 zdFH|Pi%5|6 zu=2k7F|17`tGb^ZNxRlY%Q`6%qosGfS>lyGXr`)K@zz)=zTLbBeUY@}O;dX;2Bb@fsgHq9 z8inm0KRs|$-SRJ`+ruM(FCW~iat2Lj1lifL4!tA$UItz$7_laeo?fZ3 zEO*c?f{OOor80-a^RVr9^erD)K`C4dbG;_HGVQsi|tl2N179SH7 zj&rWf9cOg4Nk54exiDfqSHyqXhHcAKnSFEP^ZuG9Z2*^%e{1jTdXVgk+S?7B*uk`& z(YbFFOBoQoUG9cVvuxes1?c>bFRub8b#2GS3I^X{FQ#up$!1A>AExzsVzXdpx4TjGBw|Zu{BO~&2C$7XRAqB;X?|t zG%ap1M|Am!C&Ytt4dGM!6Kj(X<)UUv15YWM&lfjDEcTA^Kdv4ks;7utMi6`ZTQP5a zJOh8q#_AB+qQ$W!Fu<(83RlJ58|`QJuu_i+r1&gDQ0?7I0Y`=Qh+$@)BReg-(t1F? zE_nY}4C*Wamvp}RM+$ekpA49x^t9V8GF+d*L2<6lsyCywK@?iFOR5m?BtTTv(4z13 z<_vv*G?YTh$3DX+dEHoQ2^zIDAJO&WhkkPL#yzRmN#|*4NmV0Q0)s}?yS7E1Z$Rqw zj|hQ19}XbjggUyx)335onA{4dIi!LK^)#!i#qy{})zA6i`+4RS<|=A!`+P@^{&)yA4wVXj4;`lJy*8NSoVSn|s!$AGGiH6Mv~{O5hQFZ>GPcblh+zrhK2#U zTGbJBwyb$i=@qx#SBd)v@WD#OsA>y6g0t}xlFMD>2-hDbHk0U`b`*u^_6I({DiK_J zE%~5MZ&w%d!B15pVrI@^lfi0LbhW~;=+dPn z+yd8~B60>b(%EQog`F{{6jIR-Ib&W{scfhACE?!qR7_AE-pQYU$Kx||tL47P@xI{k z-?%Df{`w5*w(v`pN%&X9Q=-h)El&QAf>McAz>KBc$~)|72dKfpLEpf`<12D!$j<%d zC6oHxh4EGLr`927$S-gO|Gk$Sez^faz1I84zjymzkM#^WBM&qV?iBbTO{BvbtT{&2;Wk{Y+7`jF#)@tXk(@^emJWH+n+Fv9<%Q$q|~ zw*1Dt?F#?n+uwJuUM{nidU3GWdJw&AxVv)k99bU3YfAHZJV379DT&jNi13^B!m9O1k;NcAbrkLSnHC!d@5pb znTtCGBhS+~0AYfk{>2w*SZ!^~?uPbqH(ry>xT&ckc5hGb6CPJee&E-$Qd&ld3;&}` z>@bEjULG$hb@F86V>42RDw2s(p50Ak661s^eD&%xsjnO&7cVgVfYTl)4!KmsF1Duk zi0#pb1V}9IB#edbKKdpzmYeP4N$4V;(gTAQs5qPX*~}$U1MFk37&p4Ar2@ANK5J=X#xjGv1Jw zPD7SIS;En56V=COGh7wB_&%ND)_{4)lxxq*PbFcpKTB2%fO=ki0HAIh4{Z9AQq>g4eV12LZvw%Sey#ghD!wI+{sP5_B;ODiQ0`wvG7?xE!KHr;k zwT}4XgmRI(X~J1u)139S`-WKUVZ>$Z1Nr+`cq(5(Pry+VGbf6Z-VS0qVzuhJG&0mi zaAOs~C9-ov*Oo7Ke6ALI{o#*ePIgX+Z=g5~mS9|5RR6*3)BE)&lR=AASv({`taA2( z*MK=-G>U$n-mF`VYwrDZR1`kq0uQvKfD0Jg+x4Fv6hJ zlg)I2=gkx1>%HjpfohI~r)!tX&f$XPtk2bBA94!=yNs^>xy6$F1GrF_{c6gDB!5)F zWe-;Jmt=T4KIH=N?Ib9yxvPwlXnW6;A~9NSk)j^?kb4{0eeG`yt|Z^D#{!^b9?^Bt zT`S8DE&B%awv}K7;!Bkg59v>?9>IO&0tc3YaceMm28OP>~)CO^4H3 zgQFQn;O%=5Bayv9qk^jE=iK?@kd_+G@Xxuo{=DYoTw4~E2a482muA&}xTI8QVi(at zk#LYVw8wxK#yGBJV@9kEE_iZ=7_ocQ$DVNr{j^KvDVtDpc?~C=iJ?TR!qoCX#T9XayprM=bUtb?K$;+QQyAY7$76V3y=F$4x*K- zzVrxPS)L-tJYMv4xrn;_XARA)6~E$G;OH9t=pAOreW}S5$5`g*iX0QG?G;sbc0GLp zAB(x;oOQe_$iGa}*5uB%Gj2D%qMdSp{%(ZNre+#zh}MOk9qv}8nrPV~7w_ED#utaP zOenHB4whkv3I-A0Y{0eiyABoU4dti}Jt;@+HKogTEK~eGVq#Qebe)S2^WkB#1c3Tu zegC1pT<16JNEl3Xd~>yqVzl(@#|Iji-0IOyzBJ#mVq4E`rqOzGAjE)vn5DFL#sll6JEx@&)Wbk9?VcnBHn(WL$6BwzC(jp((1Einq0ce_IHOya9sEpgB*c;JcnVm78 zJnfXamyT1)2Fqx$NV}9+ z>g?LD&v?a)`DAmQ3Kzg`#*PMhUux&>8%pC|9IZ`FFW6$Q3u=00o0vG>%VbH6+4~Z5 zY*_ipbC-3=o-^7xQgQ?GR>`173}9f;S&wE@A}&w(I2=#EpH!VZ=-BZ%CSGf!t3fUt zKX0-@cwqd30wi$*?mkC>=XyZ9qJ7^Ua!=x4wj`3n>nrU7mpCV7v*m&C$1gGVkc|qi zG?z4yflwD9&H7bZ&wE$NVTS}>S0er;YQ^%WG7>lGi!j8)i7BVzJ$NBW!V)_s;3~?| z(euBk1n0FSqqmUeVhburYO1-bdNkw3Uv}N0^W}O1n3l57#SZavV$f zkxza%mRIED$fad$i@%XO>-Y&`@hOy+Y3)=I2MB7)I;V*0bwL?BYfi#ku~@w!@`q;~ zNa}E#5NYMlU|_;ZKJHUZ3lg&B*CUcNHyL0m`)GC|2h0JLE zL~#Qaw}b98FRQ*2W~kJ+2 z^yo((O(5dngaJ3fi4Y!9pWyW%I_itT|KPmbrrKGyz34SG3bb*8rAi*tPh@!yOo4#s z9PMgDYx~kC$BuVD@agFe&&wE(&a}tavZHf1ZR?l@WOBfT56!gNMZ=LMHsNjz3VZe&gug1QnpyD%SdyAu(rG8lD8~Lq_qDtlSPSEiyQb{~; zq1^09xQz1t;?jA~`P@#N+v$lF=&_j^=oZ4GTTUJclkS-4p+=pf&3IANxpy@+YsUlu4;Ou2jv7AX<&S6) zys!(Z)<+iV!}p>3OXZ+VI6CM_vXtwSLN*~YB+pHVnzn0nC7n99rcL_LKH7gX%@A&_ zkd3ne;dQb$=aa#cFu*mQYPf8nM;XcfP5~`y*r0{+TM-==?9;?G!&UF;X623Z=E73o z;uvGR+5!mZ=i`^xOSfpxiSP7tFs<7!AzLRVb*L`d1xaqlDT!PBOyn3Rr27}6z_y@T z#xh%13bAeu*y;7h6+Jd#FC$;o;}^M$1M&p%I4MKQ`YGxR+jOz8DuGNjd6us6V#b`! zz8`+3Pu6nI5@Dgr8;qj7C^JPexQzxd}4SYo5`yN zl(Yk`g0%3SNEe^!#YZsIVYIc9`s=;=tn+(7{#cRtc6i!V<>c=i{?KtdHb99(wR@4e z^Lq-9^ztB6!qfj8-kNOS4fI*u`>8E+T-wI!&j$`C>li zP@w7HGP1i+=Z7`*gQnx;-jhd8Rg3Xx&*#I_X8iDEeZz;7c(uPq`-%OsKq1=0PVkyv{Euig3e2A#|4@Tk2ivS&7=L@1Ec-t!VLLEvCFa!wCU)M zG>ecY>~=`Jz8{vv{aNsFII_~MQD3L^X;-}$bWjlJEa&?Lv@$Ut`$2haxC1W(TiB1Q zz0Qt1F~8>^)=u8Cb3_vhIQ$qa3FAPR;^uNLalkG`ZQLvM*tiefCPQksC)HaDdSI%J zk+2J9sLj;_3Q?JY=X1-jfyBz{t=a_e8ff9T9_Kt5rAC^7<*95Zw=&Etm8h@XRIs$Xj{4UVcy|ecpB}^`!t> zL?y;19OzgUQrXV?!o>$kl}DJB^Y5j@f_$8|Fjh4|EBhsxicO4T#*Zg<1s#ZI;p2O} z6vBL|SPSBpkQk}M&6Z|B==OVqW7w-Sx};vq-#P~&J=E2c4ao-!E~D4%1z$W#v%xsa zs10`B%y7bC;PwJDS(?RMh2=8Gf^SwS^SS#IzG$G-1R4fEjtZugq&N>Ro=HB?ERd;I5k_glKVh;QL6fbS(dX$5`G%;=Cn=M`MDX| zX<{kSlGZnEaidA5?!$Q-Y>Y`Ld?iS2Vk=io>anq*u#4qwyux@=w|2)u^+PYL=7K$^ zlRp#|;Eis1lHa3ue2PZ#o)Kg*XfsY5bOdxtNEtP%V&AB z`t$3{a;FK|NUYU%z`!2( znB6XIrCWf}i8^(f?UtacLP)erAU$>Ebr3FR?bXKpXbMTb^5QF2^pWMHcGtQh z2XxZbjVBIfjA8v7cjeW{Y&Qg^=Ff_qZa0QFzd(Gep04sso4@KLd07B{&75R>aAC3t zHw(2F-;eLt$Xw>x*9fAD+m;6|GRM$Jw%?{6_d~uH(Ws-i^fU}6SqUE8#di~>7i#0X zEH!K%OOaN=Gi3t_6~)5246QpW6Mb+wUW(;{G-r8kd#amS1Bof2naw`qazU~fguf|z z?PMd72AV!@7NWeZkS-YY7^I|nc7%6gn{2vY9f*KdWp?-o?5hlON@aVw z>UbWu5i@uP>@`Yy++W>$ECUAAQ8+#F8K$dPVsIS?3?zn%wpN>)XzJHJt5E^$-9P8V zYx``w@yFCBJ!U;P-=ji=v2s!^vc$+tgzMRQ$|(=^PjFwK@1huGN;EbPZ)xIrlH7P& zOYtFGPN(UlkUWrXY<52R*l~iKlRh_-;5n`(WkcK?#Z4$@e3xPSCNdt&D2ScECyqVc z-!k)Ao=4?MGRzQarb{tDK5G(VL!&n;`akfW*cD(w&v7%4DU1slfYK$$p-dgWLkH@vvL^43BTzCpQ=LeFWBJ)Ft3 z=4+Z?97z8YDqmOGrpPObLfrA^aFNH$5bo~EY_2!4G7hfdhKvGUXHI7OsPqEtPXS-~ zzf5RexcAbxJ!~(A!dn`Ikxe&!fm`w)J%+3krdij7`LEk1H|UhUWcTVW$=>T-l#6+O z&XEL4!aHMz?r6yCa|f)C=v;zEI869&)Jw~hWRsb0UX=3XhTXr@A2ZlxaMy@sC-{||DK?1jp7t7sGJKxsp(3tD=gT_}Hk zouEn3X*&zksO~Y07v$G-QixA=kWbWXG?|0rw*2`7U9Ezh6o?xJPTCjHS}mVL*LGy| z76mE5s|QPKuUwbs4_}!r64qX6S-RQjP3g_X(#5aUdd!%BN;5!9iDzu^mNbJm`D0F)h9?pu#HV?)pK> z##@%UoENrcLL+0Q76KfTxh`e$G+)gtsKY60vL7LVwsF+DqGRV4Ld!Z_Z+F6OCzTw& zSQDV$)UX0#8zidfFixgCK=v*m@2w{ z$VuyS!^1*C<6f27i(|X-vv+swAnfJ0aM;ngh#A9PpG1(f8l3k^(Jhvt1e)E?rv?nN zKH7;D#{v!z@@D$$r;$?Phy86Crtqobe!cV9Is;_=(fsP}W-zpjUA83&g*uqv-#{6{ z%A#dzSCin5o_eQd`a`2*xV*7h9^?af6aKXOW^xg)+!`_H9fjjA+>%J!$2@=cJ--{n zXtWG+0?$~UJGSW(t6NVU>u_;ZT~s#W_ZvPdjb9tSQDBQgX-ao8$)lZ@l7!68asqCu z2WbmjnTzWJId|X7-Mrl2=5>U-1=-XOPn3e~wp6PH`EEMt6ts6_4fT zw5TeI9kgUTXy`BT5I^ULN7xiX66{yzN1Joca8tZE!jMxagFPrt#&JsPUySJNaqyswEoMQ8XAGx0*w{dH4pDH=<4T z%>b3KP8l^_l!lWyzxF;QKPQXOOMFwdhcYk%dfIFrMth_x2Cg*cyI&-?p-4IqhcCqVR6WsN>AX_zRVz&>Te^H%^WYjdzU1)_4nUsfc|NB7 z*Puzs0DF&tm-7!EkA@oFKR^v6EQxO>TW|LH16Z}ybFWh4kM3&Y;c(~o84bsy-E>OA z(Y$f0AstIc{q`9&>ppN7cVWWnoUEpf%*$N*Q4PuR3Gi3))hENAho6ZHy=(z*H6f+% z`^4YpW044{p3t{Ili_8LLE`-;<2fB?Z9MnVrFZ9I8R~*0Yucby+X^6yh6R;SSeEmI z^6$K9_Zx9v*P%Tw8kXzVoDO1Y?{n&|H#^JUTn(Ucnxgbt|A^(E2uB#$uv_SAu+V0y z8@TE;zfi~2Wsw2RAA8LhyE>L=Ykt*pK|iKTB`+hj`c9O>tCOeH^Hk~}*UCwH+nWBJ z;~!BpA;3+ti$2%R!gi|j`mIU3^W;J>ulDw+q)nESlnCs;-e{X-K+St>dJF|WPcZLV z(pw}zZuryUOsiBzbaaMA38Z^Q8|2#^7pz4pj!eGkn_WphpT_UDPq`aU$ia zUkhXbBO8(jQR~z(DKqjE(Ho1ZU-vH=iFv$!zkv+L{SX+CcQ)= zT0?>ha93YGhAJlS#&1K>^BP5$X|tKp@|_c;4doDMHJR`tY8t?L@r zKTyFtr>5Ux-g&NF5M)JPj|j&OTSFR7>+Fz@zzs1QcUFXP1-9$tqbP(~+Ea^@pug>Q z10zv)oe?JA@degLLw|keLs~u$7Ep;AoYSfFwX)ZjSOi&|41#S#LCQw<8D3rEusz=^ z<4^dL3%A~m+c@uc{d^!1SbS`l%d1!7vh(!~6~H9XqS+rSH0;!|F*YWo3On~RawS1p z>+2E!EwW>zV7zrvkBPaY^Y2qNLfmnUgohqTT#d)nWaZIXGdPG)L-#oqQP6ihS$WDM zp&)-(w#hoIVJGV=$yIqmu)B@y3!1Lw6{Lmat2u_<#585~^HQr^@Uug^S1uQ@G)UOv>)w1w z@+ltJr#JPF#-vPL>l{T@B3`|wc#ZZC3K`CFcuSU-s_+X+b`F8F zk0`zruB}KhN)%lVqIjTnBgH;w?{7q5$1A56^u@^H9yzQ!v8)j| zhr&EmbSeeiuU{UjISJgEE?Trqia4Gt2y?7#W`QaQMU`%M{4*S`*I2RC(i<^V z0$@xNLZy$?bRC^1mk^i9sQO-NCpTA}IOrPk=g-`O0BJ~vKfe{nQt@piO3aE0Vr`DP>Gi{t^{TH9s1*^#O5m$VFH#9%T#$ zux*r|zETWpSf5q(*{0K7|50^*|5Ct8k0$$8P;J#Wp&!*TeL7~{1+(EYGlH9So{LzF zTfHAqvVmh(;^QZ`s5y-eMeq#3BUtqUddTR>-O`x;3J>kq*9uY$L+*8j8fSSlpXTxr zCbiE?Kv)4-bin6jO9TA4{ent*Y+@{K41On=7ZdPNJ;SllkyhJGLn5XlhSrXw1HLGi z{yqA-s6gUEMK^gmpO|?43BFMy%|H}VbXgtKJ!B_&H)0R2%s*+$F+m^1E@G6y$+uD< z0Qs_$)xCAs!HI(HZcN#GOGKk@7&xZAQa)k{DVUv2PQ7bzFmi7y1)#Z@K zS4mhBy8Ao0M04e|_U?cOmV^;9wk1yE^)OiVo3W`_ij4Pf5~Pn-9toy(r|Cy?JXEPX zLj_TLFGdc_Vy$a9T`sN=3N{Q&_J5H%|ehR1+9 zw0NIFY=$!`KQtXVL;a6xSTpV@u~eQMyRc1)%3i-lE2dHt*uAs6G3N3w4TF1y7x-E#K_JPIDqliZUNjNUy_flB3Rh zNfTQc0y%N-n2UmlI6uM>wu11!+c@10Bx|FetOWAc)jk-wQa#!g8(AH|a`E@U2XF`n zdv$If)aZ8TtHH|Cg2re``TTXEk=*Y0nF5?&bj;;FG$#t4b!2q+lCln7aVi&5UR;St z9MuL|oKf_Ys#j|P=y@h6!TBfpM`c(OGuH7INR;PNRmD)~_!uRwpy{8r0P@x*Dotam z*9`ffH8XSiZ!2`RbslJf72>tI%R`%BdAwMZAmE4N2gr$bhhOKDtlf9k!>o^L7os;& z%3e z?4{2!OSTd;FjLcWF|Azi_SE;0UAJ2OH2gAuUFL+nzm5E^m(gMS#j~Hu&uZ5wVL>h# z+A9feD~a6vbMio{b7@3pf&HDi{?*CLyxq)wRWqwr>d9|+PQcih5XrvW!=6~{TWVq% zMwhi`Qed;AgpV$k`fy39h%umJO3WP9-s(mCCl>JJ#s+#mEZx~JYbed_83F)e*LG^n z73;lK)-FTPK+7`DB-u~c+Vvc8j?{w%FYxJV=kbfCowY|aZDY_f6Vozk&P4cCVC|}r zrhJI;ph(%3@|ulxP~xOpCu3D~BE!@VmGi%cL|N%(-uZE(I0~N<&ah~UR~QJdq?P`u zRnmGNLpq$RdTP{=vS7T_(qhxi9~cM7SPV{d;3#>{;^{p+r@J0HU9ugtYPH^-x7+7k zo=VO`pUL1fdB;o*m+;sAKU&hc7mQD%Vm|z?&Nf$dfLc0)ckg)akLWM$d>o}|HZl)r z>tv_cH$pcePPP{Hl|FP1vp4(yY)gF4t!bD!!p7N7-cCPH??lD-Y2^C;{tR;To^Ixc z$~o}DSOsAid_OO+UulWGDagvh6?LBf#=#QN@~f_b;PBMF-VNMxZPz;g{@O1er|hJH z*KVL~Q{&0sI!ZQq(bdP&+&sOJlst>ew5w^T?}1xZ?SiI}Xa~vFtwdm%RJ8E6#jw+obQ@mfzmGmVx{}cSV9e z5h?((clW*d#nFV>X5sL>&(3%L$q!6ruG5GBW9A9G3j>-%5aT+rd|12&pq&VSC4 z9Yl=mriYE@Z2%T^OkUviPSMNsT%Ssey~pluaJLd-3e>FnS>sB`V*0(Ru&p-q+759d9M zcor_JCBk&_8tytEFPsISq^?fTl$Jn+lx(@2+AR#A6eTeuDqvDlXg#E^V#|Tfo5yWV zxn?q%+1MFKpiF?jYQkJUH;mdhJ~k2w&XS^Vw38C9xeu~$W(PYZKvXbsBOjVv-J1Lt zds#CKaQ;C?8^VvnOVsl@Mtq_^W<+Y-i=t#bSxKkLaN?^E=+z^-U3j6B{0-{FH&;zW zqXUDm!>QmpVNi(HfTe{L^x!yWRuZ@HI^A*k-ku&@%9WdRk)+h$?R3G7ZXzG_v96k2h*0+Ht*8{|v4?`#Ppi_!b5Crk zu1B9YM;Wvy@~=Z(`QQbp%pHr1(4Y+TrrH7v9aaPTeS+cV)+dPbC3W0^l!wk40}I^R z-km;fy4VJsTYkfJHX-vV-R*!WAwz(EX6CpZWxkKmqlL`G&67>4@Or3tw)``ry3cf_fJlm=J%raSSBTZYA?h#D8$8A62ir70+IfD ztqCf8=h%-srcn(<6Wb;lH9;OiD#Dble}6|aKTpr%fx!JSxT!>AMym83Z%4i0O@q^# z?#W}LQO2*pjr)ZjvgN_m{2Ni=yYES{-XRPCq$hRy=_F9N1`&WHZw0v6K4Rv3gUjpS z7gVrv%=m?;$UoL_S}m<;u>o07hrB+yNX$1wke)z6?x1gsR90ZlRe)nJ3%YkN=jP${ z9#~Wt>R9rK7tPZ2$_l)RY5jvVu3hw07kROVf{%VAA%Kj%@PIwnniNYvTKZQc@0zmq zv^FrC_Wg?)6u#fl8*5;b+&x=T>Bw;7f|5t$a?XkKd|YDRh^2t-(*?Ul{kzvebBBAJ zC?Z#R2xCEIk0hHydH5n>GTt)n^$OGgYZ>ln%Bsc^%()TR*@;2$&lb7WxZi6v;yl)S%-!Ilbf2NC3(NyLa& zw3HMJDopIg>eLP1dbf5wHm}AV!D9T%2$7K6@l9f7io=@yC$+58N)Om~BsTOanizDdR$-S)^_Lo@%pQYu91h_@iCZmLNDOQ3-yhK zD`!Z!3fl=4DM%a{nQqp- zwbapdEH|yEFuu0*lBQl@&?nG!qq(zHfxb~rVHBAw`v#!7VowWOSsDKq#WRBs8XKlh z)}q3U?KaO7GMm;V*N+cTXt$CPA-5I%;`e%knZv)5PqG0vwvV|;v1_UAfj}8;%rPTR zam!KssaNi_`0?hT&?jEH)D-fsC)e2^Ly|I zJ6-4V9Mulgmtjl(PdN`*-wv!i@(TEdS7xl64zP^F2K8%Ygeb6wPzAqW48KyITM0S^ zpKyscJwgIJd71P{=)2gBC8=woMqlrw0LXw;R8r;$8PtmS07Ts8`Gw)tx;`;4>!49` z<&m!ic|t0wV%T>!bzbmb!C(1Qp+QoT2v#FKP6~_XyjM4sDavSAlT!FdN|E^TNX+V) za?W4=d#>~q7kpg^O z?b0nMoGC(LfcJ%p`i4AYjhYOYGIsy|b*nq&hWATq&r-&<=EJO(wHP6R7dLvXa188u z!L?B(J64?$*?n82F3RzM9+50n;Gjx?oLmuMEml@`fbt`6=F^UhgG6afmY|*e9))f} z{p>q49^jnMS&Tn(Zz0oQ^6I!RnauI7a6tiRLz`CuxK5KaWn@ByrXHPMo z6!Bd5oamZ=$UPi``HUbh8>yD{$w`}f+`MN1V$flGSkP(gv+3$HU#;(&m9Cwsbpb8u zJl(ubV4{h>f43qaSGCu8v&mehT8rPAw-O0^ml+Gd!-#5TTQ+(tMsgT^npMWiw3{vJ2($pq1nx#gf9qxTC7*ot;kuC2pDBPQ5lb{s zOBNh=_-5)bTsY@aMWI{BmrnGONG%F;G`MTbow|)YY|=2jvvb8mSq5i8aVr zuZ;EfK8{zX^ey5Qs43`}{u7haZeqZ)w!ibixDvGpf4MIckn0Jt<6WP#sVAoCIPh-lBV#9@ z0a-B0K9NeUPUPCe$Z8kImK^aoE7!{zN`hmQgN_P5UZyZF9Uquc`wRexAGUO-Ir%~Q zaT@Bmt_*S61gMbf9kDbQfr>LXqJ`0w0nP~Z3bt#!WuGJhHNhpun9va5lIHut#qk9L92?D+~$55J8unpFdu; z1On%_um5)DgB5}}12UWtk!5pp&Zssd~s1?G3s(i$gM(8}05t5#&RNv7!JIiB zrPT*zJb^b?e%+l2Fn_dwB!(BW#_fH1F19!LeAU`!s=FsUSgg1^ecsl@&>By*zd=?(`-O0DR_m5#LaBEAQK-QEck^)=qNIdjF!*T{tGc~Pmz4# z&(qB1K;CrIR?Sf1kg1OR2dok{x3fcGXF4bo-`g&eqVAL!E=Rc5`Tb$O|HX2#-!GJZ zU40p1LRYP8je#BR^4@mkKU{T}EesCjt}e69=(4ut?9CHHKFK6rm?s4Tz~}Voe(N6n z)%uX9A!|y|+xMEHIBD7R*QmN+qu+~~T)fAXtIOuINc^5BX`q{Nzz`!25BG)z0rtPq zWymjj!H`l6v(Xb6RHsa=^|<*9i31T07D+l3U<+BJ;z6Rys?Q*6!{xXjJdE= zp9!t}NG|RvSHZvP1w?&Fg1E(Bw9Od!pHIH{+EQa$AjzV4im~$c-*|8z)lT<7-U*o6 z__SH^oU@mA*>d=B;p61Ji+Hw4(u8|Q>VFdb%bOg>3%Lqc7}? zPtAWljtYo;!~&PB0`8RBRnzWNwOqv0O%{?Kov#<>C7+2q_oO9Jh&cE+h#*&<-F-1& zC5WMG0-+B{%&CgHuc9J*iGmhVk~cFi0nc_v)f=|}JlW97*{l=FnKsl{%15hAWl+6YNYkPD#2eV!E#Y@U%G0BIFw_F4`ej@oHIq7iFfhL z+dweYWO>MUX>TN2*?&!~$o~<(VqYdYT<+!rRoA96FUkX_Np8xQVMu-0* z!BK?UQ%{Y*z?jJ!0fYxb19?)Jt^C@dLK71HE8VKp6PbaErJDCIpi~oVIMwNAAClM6 zbw*lhta};={dPI~HE40B3jn>jq{H~7D${66jaYowYKf-|A7$0{lY>sITP z^nhdY_G^HzLaa(x^vHD*Irz-7$_GNL1s)Wa1$=Yi_H(l(aPJq5Sxao8!ZpH z*}4VJ{!vKff-?p8{(RTJ5d~aPd!0jzb(myaSP5r)7Jidez3V z{7Wn41{jI|`tX-z|NbRTkt~!1zwgcZ_uu~cT__Aq`RBX-WspJysIF8)6df7=%y#{E zeECZCcbVTe{eNDydP$Oc0gEc0fBo&BMdts71fO#PT}@T|vl9MWmd-g<(Ehtye|~2` zPa-`>q5oG(LQ)a%zZLDz@BX7A{|lA+|B;GhN<<-5>kC#>>T_CI{7 zW=z%EInw=eXySB&w=;4CEkAg1h|NW+2>EtGv)2)?JYvAv}5C6T%TuY?V2n$Dd%qaf*x4-WkR|csN zMR&els*~dHZ~SjpLq1cJ%HcJlWF#S#qDto<0=;EK;zGNeI+P(6rVM{N z2hdSdedg!mb6)@x>%WFk)>l|6*RjJm=OVu=uePP-B4s>Crxkq8AQe$;Z(t!l_l8fo zWndfY+G$BOh~r^?ENS|JcmK;j4|z=g?D46JqU+XDjQ80?g4(V~>p!JCgoD4_@qmhe zrt5DXJNv89>??fYKe8+ON}#nmP2jQ6FE(Uo-RJ=?Fl2oU`NIwh!RfZ^!v8L zoSio&S4KgK1Q}BAtY$(P_yKjXvTxa$4PCsE*&m0l`RrVctmTcrTYYJ5rb(Rvvbk{S zI(l03cq%K_SOMIGD5GPih}wk#T(CYwW7G4J+z8TxM>7dZGFmZcykA%OMk9{1p2>Mq@2Bwr*TH0sqwj1p{S-%Ul z*4EaZV+^VvIo^!`PRdjE{rn1qDs>KoiBB0WGd8lTeRKQS18x8ZKaXJk$kjEHU3{CHV{s(tD8En4aO;6*rMgGp@SSEoqZ!%E|S8}D-T)_q2aSt z%aN=*xHRhLaK8FG*$(z|A1}I|e10Bo{?8G?o_nHn!)c6kYT8D^q^kN-Z&2O3HTBz1H4qUDqmmsX#s_aam81Jc-Z57S&_q zc(IM>7Vf43%{)xaxxC<~U<)H>UCPUy2OwzCSWdQwT&2X%uFD)oPIq`;4pM{vECJ zwUw1kNQai5mff3BpX-%=f91Y5=-L$OvmgGlgt%F`T+1X@^K|yMP!CU&b$Q?}?uBKf zqCQmcz1ZctV?|9#ANfPFX69IwL*5~PNn8R&js=5WfgO!zb8vQFWg^SVdP;7??o1t5S zPIpk@g|(DPe(KS2=$>DssJ(3QOn1(Xw6)M!W-CxvQOh4xv{8C1?#W?=CyfiXuYch| zE%D*e2mSfl;bCW1wQ~E()KVRY_lC_*lG5Hygg7;idDgJaDXy6mdKX1H1Hn*x&6875 z2w3;es~b88o@g@Yegd5aBra@ER>y=$4~fpiC!*@ubnfo`Y&uF4b(*f2TMj9w->Ay= zTfm#rXoFF=_)FP^{sLZ%S%;m1>Pq7QJ5R1C7?$)+sf=rS1 z{eZpwj(asRJwJCdRKTtPl7wFNKist}OXg;dtO7PXz1JAyC3s%<6Y2`~BJOSK{^oYm zK|zs?InM;F)-_^r)QJv^INbw5d%K%px?Vqtp9mPbx%Dlv zP$pDhn2Y3K<+#V^?2XEZ6@B%t-8e?AnVK zSW8{wDmx+nvU4QEXNA15y#uJisF`VasO(~(ZS%lfQ9lO+yDgzr(w=WQg$9sW)A-bM z!UcG-`_fCrIoK`P+uT-LQD^kKZN$eHUtAZD)=IB*u>09xc2GMih(~RkQppKlJ+{NmN2yZ71eY4bbq~)d3 z-95Tx?ZxZXQhHAL7~vx@={&hQc93|glG9mVt#F;OrN<%mx_$YlCKkb9t>zu>t3tn% zM2KB8rLdcRDXhb9dg;?LpH@~3w9N0++4ik6$Iy(Kaw(BM3-P0jCHtUiD$Uc9Nz1Y! z$DMCiLqDVrNZECkiEycVyas;8{no29Mo~7ci%CBCvympyON3}f81e|`iGw}G8 z&D!IN2jUu|kXTAd6M}c=!6XZ+i2nJdEBl6FwFmDenmU6{rIdXH zi3PB6YiwuDGkWIkg-yrc_M4?0%;0dBj1|8|(Th%<;}gd@;ld;?kV6ZMKG+v#ATUq+ zce+CS@>Z*5x=?d{ZvAvd%Q?;N-KVd=d56{aUg;}N-y|!la7?!weEtINCDlRpQCEH1 zL4^LmLt1($ShVUW-42i!dX!Bk-hXF0QB7-kX3k|X55bWQM+aB1wwXz2EVXR0s-@)i z0CiVVg1tW#-K!YkS^5BYN73axDm-}#T)dqFIiK?Uv3{xcu2N&9y}}iQu+($#+wFD% zvtL)%2}0OTuPoNmCAt_ok%ko=!CH`@P9}w~_ofAkFBd=U zR|p}FNiT?r$&$#?>=dAVnTs?=`NE@2gl+2rVGw*?=%7^_6v9r zex#w;OBVoa7FTA5_LVn({#9wI@&}3&)bJ74UJvQF<=tlZb6X9UPboX$`3!76GPR~C z0)w<{H|5^TB!3sYBzo9*(gvAmMv8b5%b#>m>IC`huY9_1k`&!ey6stV`LTHCGq%9` zK=jU1B<~*1jkHtOIYPNXypkegR)uXP5a7ph+e*nzA!T&R3KX?ucj5plPEE9GlH=c5 zp*c+SeNLm%CeoH2fuRz&)1WS?(Fam*{hD|_FbO@!)oWU!PfWqg%Pa&|ck76so0KTu zS2b@)9?WP#?)dON3IryX9JEaPFYNf)0&x}ncc$^g(7yJ_Ymv?N51$qSc>v}uJFU4i zYHFHKZsa?cz9M{nl$evX@%p>yTS=9vil}7PJ8OS;qI?%QvVH?%OPCH6VffF-{qH=S zq2K|*?^su3582a*?o{g?->D1be;D1~NZZV_dOrjpZB zi-?UT3WB^FoB`280y3XO|Gbhvb9@fsTkw8a_)rAqo_&trP$9XM@|}-P+J6*_voyJn zL@Zk3riConiPX)8gULSSBWOu?zcdV0zVZCYk;AIbTBdT04h${EB{33M!L_Yw zbSjngHO&QSRP;4Ub}1p__x6T7sqf`#B^25xWLs)_r90g_`zEQ_nK|4bWSuV7PwSCE z*>jY^F=_9^q?VOeUH{9MOYO7 zl1F7}MLo@jBC-#TM0mTmW0I?26$hefBA_eD$QB%UICso(Ao@(KFiq^NE9$Ub_42D0 zLA|VgO1#jWUG^3=>b83oSP=p&J4i zL0V7LekG8c)86+6#x}NXr>QhO12v6Tnm8Fq!DwW$WeWF=iJ*`fh|`z}9C?`0BjEfPcXuad^HMBPgci!jVqQAXGRa z@W#A&NCtcfz4u4T%6h}+A(FZ!(2sr_8gY+`07EtJ1c`@XsH-u7OZx@S71A7tn9h<- zI8n*M{4JVI9T%1^S85^Z?`piynU1#fJYl#aIf}4@G_Qx8jpJMD%IUJyF)hTe%1q^~;TSS8F%h_!Px3F+w|0*Vc|k)3;hRMZRDAgLKP^#V`D%mo_Bv zCM#%&$+@CTEZvgjnNfXu>{fHe&|R1?*3e6aBIC-Ps3;^}VZy!N+EsMfPuB@_0Eg*1 zU;vpUH0rJqNg%rmFPEQvlY4!ow)?}l77UMrCmP&_L6K(dYa2Dmt{S2o|ROw z4XPl;R6DkoDl=84wnj);je(8rYXJq9-fgyE1&dG|0#+v`8V;J{D0^HbN|%wI)TYCNk!1#RSn#V;I5j zjV)(NR|fmDA@P^X6(oV#1?7w>uk7Dk;HOd-)>?r+`xk`1mQ{KL4FeT)B94cAj&|Kf zrc#Mg%FgMubXp2lX_FSh-qHT@nkky zgU@j=|9j!GdS|(4oYR|xN6cwf-tapr3-cq?wV~DM{dvbook1hTD~gO?Rs_ea5E$ZV zR45a)}Lju2YVfS$BzJ zZMoT(CsL}`yU>$MzDbDFu#B?8@E;NF9vZy(Tq1>O{5W#C^2WvS0}b)MB(FEjCFJPs^g6ZeXaIEGxI*a|JGSuX~%G2-kmO05&b-)b7;<&Y zaPKYl((L(~@4k)JeUS=UaW`w3w4DBVO@ZvQu0AYd^hp22Cs1CB1x|GrI_AFJ?y~nJ z1%1c)UjC6P?+N5y4x8)p3ZEpt?3C`_?_OF-x`9};TCXd+ z%4{>wpdjLC+9O~p+Cp9Xh}dGDc7#@ZBtfH0yNQt_hv&@p(`Oa)+b&~zCH01r+u$$t zPR~+}2^Z`}6~1e3gVStHeBY>a!_!g1WYp-5`i33zk%W6yqXmE|Y3kH9!Zyre(B{fuwEj2DL10~ z7f-kTM!dMwb&fXy$lZLgADUepi>hJMtj=OjPu(KQl%)%l|4r7pLY}PexBF0?Xvg@M zY#x+-C;kR>fei#nmPun7K?R(i)^+6~OhC&;;XlZ&HfeE+B)wW9WVVPU#A-^frhp_k zI9Vb#Jn^->*x_7?W6p|X5IDsIoM*80@+RF|p^7(6t@~*<-AEn|^vIHWcj{&_Oa2#U zWUg%Zw2NN8J{U^jWtX7!uvr$5kK(Z6g^oP;Tb0n-)uFWFeNKFT=C&_TZ4B30r>)j5 z8p&;IZf+GXFZEre7-}{Jq1F^c`ss8b@4stcQLCo0e^I2Q0K%+1K@%o0SlZHz)Xj($ zX1&7}F+tV%2?Z>Y3fMW3lpyHRk~1t_^SX6_L!d!t)B{#wK&wvr{$jXjC5;uLrONw- zGlB|Lht_@CRT@HI7hq6q)3li>8@O`L7KM_~szz5=k9~zc=!%#fYCAq`1*3uoRoRvD zb`^L)nKB1i69*+t~?h>HJN>P5$Z_m93rI^tV4IJe5UWmTdm`!t$jO4 z8JK6@+L`i|J5axeXUf8VldxMOxJTmQ`>S~(&ThYxlemh)c`t;>-fygy**l8oGf*L) zh!lF=pit358quQ3$vSPq@w$3rSb6^7;~AcI@45=h_|b=(DsnDJD+S=`DTarfn$a$&# zn>?RKdJVU|erK0Kz_*jny!)pF@=_+y!dGLZd+$rr75)gvKEz9B^&gf?S8uh3@F*~UyaSa3SvhtOr=#j_M2IKHF4c~F9%DbFEf+g>~H*oUG^l16Jg~s z307_j=qw;wY0k(l(7Wl%V=jlMq~igIYy3jx)@pSwTUhpKv>?LQj$N)JNW--9gi^C6 z|6RB0{>XR2Av;2H>nD|7uc)cye}V4#Z-*a+~y8%a7Kaal1cTUTu|qX2B0Q94wj1T_+yp>md0c ze7RnGAmPWBYH5x^3Jnsv1a$Y>@bj2?E1aeUGGrj~ovE5O(W9Gq8q#)ZrSn9o z%M?mrUc+6e+O%A=AKO!e#E$?#!p4 z4HZR56)qtU|4YKBT}@u8MVCCdF>FN|b|&+K(2t}2#YwiNI;YkwH~MsUP0a0wOj1Jb zHH#Y3+`5M!To#sWCSP3QFF!7%Mg}6qCa4;(ME5c<)XtTV2dw;6Q)4^Qe)T^H2L(&T zs05vPBaenf=oYJ4kIcWR{U9dfZ7#JP;k@6keN6v>`KcxQZGpG9SWS$N{XUNCcuy`} zyp-C~+ux}5D)Gt3OcM@Jxr!7iSkaC99!XGzp-8P$isNd zGF;w_A*h;l4}M2fl%o|!e0Ob!vUH535^3V|Pxusf zK2#JwNz+SJ-)vjy2TBj~PMQ^V5?hqK0CzN2UwWHe@#ekeMDAQ9-Sd6+(peT4=yN09 z5>O4XsC?^nEG&|a`i`TMoLZ30wJmcZs}xrrj_w{JkN91{CQz1Rjostdoh(~~PkY<_ zaF2hEbaQUC6r-0<{8G)CrA;)vr)pkEr?Py6V@rX@AOWs9aKWgvw@Br|Jps3?t#vgJ z-6{69=6AV#O2zZ}(Sw7JrZu^^jxm)N{o&rPu=k70f2XNjKPDb{)`&0SI#xJm=EzTG z7ZE9r*7$hfxi*w3kEaSfCjWFYaO4P*70YM2D2+#_I*)i?8qRnkeYP^ZPxH?#E8v1- zPEq$Hv<#X>T$X+Ykew!fs;_5l9@5-9-o&-}p!!iRdMD0Q34X`aM zzZdo`CsOiyeB_KKN z=28IkU1aMUu60_uY04@Ni9AbFc_C-k45Mc@?brY1G4))-yUrR=fS~C0&MJTf;aJUK z&=1Zi=k)ipLz14;6{xcM81ij%S!bIVxMNNg$L<2l@=gtFMJY$XR z*Yko&cM{?VM9W> z_t9*gHfEcHJU0pOOz6~>N1v3wBDap+6?82@MjNyawGw~a)b^FhX3N>kN8lQpzjhfY zdWksOT}=4NqAH{h0q)JhjC?g*7mlJ7V_ta|+5;p$M2a5BkG%@0y|*|laz1h7oiM%R zmO32Mkb7OVqMCrCxr+v&?s_2JZ@fg4tMO%{VD0l1XfVZjFIb>jAHbfK=STM2AH4vI z1wucSoDg@A%Xjf!WqoJIXa7BTSvQJbcbr&OT(Hy2L{07^JDUO!TzTP&*hQTi^s#08 zX&BB8dq)@f9d{{^2P@`#m3cI>$UPeL$QLgk5p3Qee@Hc_n`*&Kg==BGRz~`f;zYS_ z*2VWlS`|D;@AyY%!6;$M7&S{#2_*jM&17C1aLw10h8oX+S8~n26+w*IC&sBPX+Ax_ zHqAXecoL0!i5rGIW1~ioe9*FB^2V*zvu5_p;P#lN@k!9+vG2h&rQz(4i{CJX0AuI( zugGCc+eKLxK90jq%KfATC}=QFZ#fqe z#$LPxMC>|iT2(LWzRGGlf(==1&T!40(}ZjXg*1Cox8N zA+hXQL+P&FL!l>rpVd=_RdR@wf%~zFVJ4FTz32~DZW||}ujOEJxG=hp(?=gYScV{R zxj9Eu+s~WUcSh>E?G}`~igAF*k*(}r!IF0!h{vx+`*kQR$mn_AzOq&&e$V=n1(yO7l8GRliJ z1Matnl;4$i=Dm8Nq>-X1ymwPfp#~XAI7j@&iS4Fp{hPXqvo|S7^Gk(ZSu2JJ^GF=d zAPA6f=ln2}iVKzKD_2D;-`TUSGlra(C!Ut|=+$CxnYSEo69tE1F8Pm_aW=d;WACMF|I1xe%ZA z6+*4eis*wC!K%_?dZQX*+44-?7V~k!Uf8f;uinS-d($9mOycg3k}>JAzboC=E`ITl z4-{%+68FIxGm-;iF-Y>3a1FU`0_PT~zFViq41%YPYoCoJpLq#J#-^({t*6naoBWy9 zaLnO*9ob63d8=`-=Yfoz%-aUHAJi?K!zLwV+`#g9dEvdJ*#pa`Px!TC-@Dl4z*@G` zUTBMr2@|m&0i{y}hmWsynvY+QS)Je*v*+z1&6{yn7=X}uBYQ=uzx%Ewl{K`>%OYLC z2e3IlRVS_^Eqsz^1S)*L3TEMS8k%KlV3AmyY9%Rzas3eiA5p?HIUcQReZY+0#iXS+ z658%<)4G1DkI=&`O6l3Ju}fMS9>KC7-gI0{9J0IpHaG*u7?HYtfOF$&50}bGIsK0g zKaRhA>N|8(zNUTKoYGt(46bH@zS>#1m8P&k`R%|g$zaEltOjXm94u?nOQJz%ng2$U zOz9)|D=j(PR<1^kr8njcSTiIiZf6#?gSc~vJX#cR-5Y3go!8)SJn_VYdG2W}9%Ue# zxQ+%KGx)i#XkNo!SeniqTIDO`3l+w5=*(+?uPWig;L8-zLl%^4 zb2s9{!qnip;MN`W_LR$^tLPx1CdcPq*o!1ag(R%c+!5*wnz(smg5RBl-;GRu)E}V7 z&c?<^CDr|QU@4IVaf!e;U_>0O#=m{-$hR$B?amPR#pT3J2|vHjc%OpYEmIG(s*vpdOdkipiT!cg6G}v*TrJ{yQgYUf<-+ z>}KLzCKBd^4N4$if3=f~(j)++2^(Fug~_vb$c(*qDuK6|-cIKMjwdN^3G6ya%53*^ zOSHEaz8^r*i#8jR|B}77f$zj6Hd6Gn%SU(T#?rN~A(s`1gy99)X}E zG#sYar^hIxpoOU)l)AQq4rNQ9dO6nVK@tKwYY|O9L}w+hzG3aL{23rTz0PN!>omly zGH8i=l!N}EY}<(^9J~VD&^!u#Jj^UjGDm^=RkZSLlG#oGay7anxsCE?8bk%6+w3aR zW_OWm7rho~HdnrWE}DGoUiJ!m+N%O>*^o7S4WH8;0Re~OqPMB=JZBci^mh?~;ud5# zH?Ig2n{}}|XWl9za(X9MvEtNkMnS|WOPNT12x>TvEBE}0uW%_-@&bEN1gV@(!^6&w z9+_>*g-ZO_}bG&qK+8>=RU@isu zob%WJknj3Oe%SkXeEG;E7F!~}U&R`}rK+C~H`Nj88_mC*sBf9SEnS_(8i1bRdwJt4 z8Pfc6{2EgT&MsjV&8gZ%zbl%!1^I}NZ89}i-6B=je^SgqAoENi3Z4Ha1NSdx`Oity zH2Cz^=i&x`sQ6#m!~1M_G4)><J!i^FA@aaF=H@VMw<@&v2oPS*L|8w%cpxZw#cUkgt9y`s8vj3zq=L>`Qm|B%F zoZ=6i`DbbT(@OWBi;pD`ld1hDwIJU~o&i}u)g1qkDfW-^{&!0|yZ;Q>Pk6iZ4}bqJ zOwm{WRuq_=O#}Vclf&@{ylzH;H?9S!{*^iX(nawqg7?td32fM3LGphgjelO1C~nN5 z?+=!L+R%T$=g&Uj8&D_^slj}YJ@=Q^e0RD;|C3qPTz7yC#O#R1%zYl#}9*HNm5dsoO`lGoq9^PCemrf2C5$N!x5|Dug=WN?S~L$g-cpSI=yy%}$G zabuz&0os3kYB&93a2HFqQ^O78zWD!- z7RWznOg~m|D%3#<@HR7+n<9sPd)1xG7N{=!OrD;Wt^934aMZvGoPOX!`p*ih|CcFU zhS1-483mV~f8kX^yq^Fz**WW(zF+*oV_*;?LhGlne7l!Of8;M4ae9g65&(3}zuady zT^64xNE_gr27eXP=q&JEfZ{K@Hs8p}-#bbTQ+LK9;=XDcgeIV`AB)1VIe!_X?Cafc zw1}<8ZIY2}=lyd6#6-LY#QZO>;evwTN99!LMDYV)HeD8qH8hVn9gkc2?@pF-vAB~H z_yX({K&A6DWP@J%bSLpCd^ES)_#{Pa$6K{jEkXVQe+2+&s_Y7}J&|F#@vmaHWrIO;9`bjkCT6?N+^R;j@) z+)K-UN}c>YAZ;XgbPKhNZhO6ZcpLYRBof%KX1n%TmOd!em<~F)6W%v8!?>J07Fs2_ zPD}5z2gVEcKH4*%trmmsX|*Wl<=rBckrl(yY4JP8Z}JYuGtCBIvUv`{PBH8%+vT^` zk-8Vn2Wd}*+$C;r-c8Jzen9u0frdSBA{ir7iJA+bBvRKjlWZCZ;Xc42Ek()EHTs<8`9RDW{?wMFr;Qlr++sWYUP z?c0RC3G9dsApx_0K;h3iuX_kDN^cJ8=~o(#s%OdtuS#8O&WUAGlwG*NZalmQy6T^=$kR!er}osN3Y|NZlIwm>xcf8AL%8rGO9F=!$IeVKk;Bl$ zvJA!Z7+#}8((feA6bfi$V(z9_x$WQ!5iOhyqAA}qF|*j66p-lBlJEAc&>e0rKd^sE zM@PrtIkXeQ>Ix{pYzPL2>E`qOb0#zsncgWAjVy&^ndnBm-D_^UB(Fg18y<~!|LJw3B{y!)r zLCmw4o_p$h{^gz2qGu-!RzK7XBaM6rD&oXv-#j>+u79C{p4Jcmo#q(7&$I)4X5<9^ zNT@fhs~C_cSMOta1fx3p{y?K?CG8`7GGK8#n)^{MtpstY2=)g%5 zj*7#Lknz0(zNX%~$|-N4t2AS zmKU8X9nn`o)nalKIQR-Q)?I_mq&l4OQ|!xaYnJQg*cBm`i8d);b?)EgpKA)B1E2nX z4dfc}@!gNK=@f;hPHv|qtNcj`^pc((mIfTc2WEQ_{<;4EsLqIqv>WXtGWLYT0ZGjF zD0$16jv$(3RbAOW#B#`X&KWGJr`0zm18IUU&ptFbg zeShs(k#f(sA}J>JoV9i)*BdF+r!s4qbe6?3!SP%w?|MCTbXk*_ki5z{AMKmkbghAt z6#-#S(G>%kM|G{3%}30dtzRcfbhzPT-VsmvEWT#4m%aM~$#X=0TcMLS-UdHDH70h3 zvps(GwohHphmMlpx?V-f6*(pKW4!C~*|tDQWi3$5Eb%dp1#yuhh6Lv z{ATL13BYH)NIP3=65H%-A=h!kIp3{1$Nu!>#1tE-aCpF!*-vA672`)pEOY5~o@Y8} zF}AWe6(i!wrx!Hi{KQAGCP3&woehl!@H{0Tn-Do~zf0KGQ- zQIgRTs?-Ln-;ID=bxuH@_Ux;}Z=hX<(By4s?e3h9xM>ns0hj0kb-SKg#f8Eqs7V}< zF3R2!)V{iS(it3kcuwIMK8f7)n0j2vrd;pD44f+nh~rf6YSS}(n3I!ZJhj8QF^BYy z@u{~?R4D|=%)ZLsXa}HVPb@B3e{O#|ZglpkY%m&iOn9OD(WdC5u4aRkDG~y)-;yNs z;4JVtPG-|O2;Es|Q4D#=%ocB3^h}3(>&0X4Gap*^;!MJ}%%e@tIK8m))9iA$YTB{& ziW|z6L)J0xXmSrn3zCM99~{kAn6lZF=uTQj>a?8p3}`s+bWjp6E^&QFMELBVQVDG! zu7_?^I&*aF?}Hsw!b=>~bA|F{H)Lb@tW(Z{_W#ye?Ad#KELxOVXAil&hYg}h?2XE{ zZCR@Qzqo^2MCNxkf-)0i_Ou1^Z7aJ;_fj0{1l zr5|Iu!jZ?1t4D;(cJNC|3%p9T~FExww52TK> z7NjyPuYvC#f3>Vni#00bcs~`^Zsg%}Ny;ES=wdx+8zIEIx;5L)03AsA1hL4AYhRo@ z=!6p;{u~=WM4i6SFl!%5Dt;8YL6jIc$=$OXPrD}He>RIMG)83~#n8z;fq&wRop!c` zlCvNAxG+SL57Tgj%hMdpMf#-0FY%?v3eS$e*HXF87FD1kW}%!SxFcw%>tH5F$4{on zWNk})aaO6G5q+|W=GzM)QDK#4p^#$=w=|BTlq+aJrrQtbddSxA3UQ{oO3$gH(L=EA z-NQCli`N%**X+eDk)>5&%}b#^`Z za!}@cK^wE^Gdx$l_=&d7i3j$=a7apW+2Q8C%u#Nc%C!^Erb;VqhzwtHpH}V?HH;f* zc^=7X3@7e4!Rk@2kN8R|muNE=PcProl3*%KKA+@4&Y)8<&{-9VL$V*U` zmRavpWa1aW37Uip`cn1s=Q>qm4PKrGCdsVb<%n zHyakHggoR;L9cL+XU#oJ9XK(23Gph`fjumqE{Y&y(;g8pNt@P7D34t5E+E=gI6u!ctYsIhU z8mtyfuf3OCdc+*Nbd@=;hS_{QcQUvq;+c=E<%D8|`7Q9Ft>;ARgAcA^rCY>aD55+D zE`EE63ff=mR_wtNi?Fb&H<9?It)0wN%6}QkW2Who9%q~(U^1KYy+*hIcuY&TkuM>+ zTOdo`FVxZ_cq9_98_I}w;}aQP2h#L^UGXEOdL&@cu4lQ}oLdxZHjZ+HTtIIW7I?jU z=g^h9r|id#K3=1awc41Sx@ezLV|I5vCU|^4W$7J@D=?U6S4e3Hb!^R0Da=Lh90?ru z29Ywj?rCS}%n{V*c~f7Ccy&g&9>gHmj*Ejor?^cuNoqCelk9rcp~R9bKu+6=dNNvQ z4SP`(s?%!^bh6e2h((KDoN>cZURG~1YC#K2l*X%haEET|hMp~@4$?cf1-tkEMmI-! z;bC37kCv#h?SX;+Nb>sLvYKhsxY4@K@{((P5-*0?QD5c>6oYd=4U9~iFSh%KXW!E5 z0IcLJ(ky=tm*$yOdfTsl^sot61%8=uW@H9-1tI0WBZ%DYG8c2b3cm|Fgj0+aE{Ru) z`dn_PQ;I!3-*a>C?wsz6V}6Wl-lsMeB&Ee?OB-A0O)ob9jsc9H<%&K#9}P=>)!Qk; z`+(Iul^bd4US_uRy7WYocg5zyzxQyH(r?wuadGQfw4w+$Ej(WUajY7tg98_-FZpba zwH%Ddk&YgFNH)u|+BNKgRZT`MK##Y*NXCE$B&<@P_!vn}IqqMp3(7!+w3W=ozlV-- zA;^N|t^`X%Ys@Df1Klm>{n=W+UvP1nTD%1TY9oqAHf9SrMS)8X`%STrA#zR)d6%R+ z$OB}%Eku__V206d_TB&uni!k(V9lhDVA^>L9hQ9BGu-bTJxbRlgE(bR*Kz+9yYanG zGGg%wurJ~Fv^}Q2-s-%Y(F$&|FurYrnsi2v%C%z*ia}Q+*V5&s@`M;{7lmt#x;c_x zyElVY0kMVPbJ_W^!XutuX2$~gF-)$cV&9GW)8GBvDrEXa;n=-iQL!cSsGA$B=RkP(2ITMy zXjOr zM_NIA3DkAZVyR@88RHD8M?N4Dv04yQk0GGJ4X-|WV@e!CxdD)Lk-z`!?C z{=q7{WbxPZycIURL`4AFK-`j=N$b-ZbpsAfHX4hIuF{KtTrGAokDWv}5`Tk64ANu{ zrL6&GwkNW~d2BxE@#vORtA$t2ekv1i`Kd_6AS}Exfd|?;@eQJ>?JmNEathO#^e2#% zyYaa$;=5a}o0A@0=oA1lpA(DC%s&2NZc-6}a&{G)C?Wo^{rWIvsnV7w*iXG=!I;H5 zpNKftag@S3pBZNqHq}=SPdF>K)f&{k#`QS)n(UX&+X2vFB37L2j>bvCP~p-z)~5y~ z4mxqFrm2jAz*p*t20_M}SMv_mLty0w*&D87Q)6Po9tL zHYGtKGcQ8PnmFde5Up(JlQ0GJ7=39_5KT-k)?seFa8IFj#$NGa+n>r3$0Mwdnrc`- ze^gFgV14+76bH0#sB*tgo#TeGm}>&%Ne6gFEzg*wHzFv<fMW|`wu*gicxr4d69TglpT&IruQpFyCw$C7v$sv= z)mu!))o|;@QRhhjV&vLZ}W%TFa*;^GuqTa8sfDb6>Q8XP^C9$+LHu$hj>EJ z{u<>elliK1m>usFE41#rNRZx> z6qKfve5#t0Lj^3jyICg4rF;RatM?3&Cr9yIgc@lSIhhrQxg`>rIqJMH@HqDEZW^DJ zo7IpqBE)EMpsC8`G2Ku+w`kyfqP^sU)X$(P#A}&ce-1Co_I@2T$TmvNTNK zmX@Gu!HxX11kNRAM!br&OEUt0oF2_srydmelrK z0XnUplqe-zH%`0w)Xpvm$MdeZEBp)AJ9}Jqp|~5QxpXxBaI;FneyEh#V$q^qaDIBQ zYx+j(YkGhe`#|pY)zN0Q^l%;{=%p%=iTS|CH3Oe=En8MNf;U~nQ;p}ALTcBMD0b`G zLE4+@`rv+x`Hx1*?NCLz#JR~Qq+ag&Vy>@}y5xu`SYGHfi`t|+l}LskF-#;}wT|h` z%Ez7v(;R~igZKElN@~f?4^v<#z_PLA0P(efp|HCi9N}`h#Sd*Vx+nWI^pf+~6gWaM z3G&y_CRmNsiTwV9!gmwS?J2l=JoD`bEi#42sTL#&!m(|#N!u!Qeff#^{D`6LOPM}z z(5^j<@u7v>#J56|%rrI#xd*e&7}(QI?O_trSD8bi5Nlz}0+TTIXGd!^)$zp^>hiCF zh%lK)p5q_UV+o`5Ik@5ujwVq>tL+}^%`-{`lJO{F5R>)p49zZJro`+H;bP*#X}-_; zaJm{xGW1#xmxa!9e z8SBZLI1=ZDwm$Qs(TUt+CH2T{^Ljsm%NeVZ6ktsTpTZMM5|uhR*lGh02~k`$7V$ zxpl1NDz^Cr(I$Ib`kd?RhWJ(EQ3cv%+QhU^s=RSy795gTKeeklpIYLfTq=CC_9p*nxCCO%QY0RBOTOd(B@-zS~71+3?=2}?PfxUJLWMlQX00QO2 z$cA*Yb8u``J_2mQqaq41#3u!eKl?f!k(5`S!do)SS?FVy+Rpd#)*HZFn`dS1BUqhd zcfCDHy%V}k(QK$5vo&s%A#n#LUT(Tk3QekAm@d6hn^tc>{?Kd`i=H5joMACe(au*< zuoy2q0Fxxt!!ROLxXD!T_?Z7JN;JfG(#+72OX#*mcjm`#ZCZ^p?KjU)e|NXcWOG`i zhaJ6ih$}5gWb6>J5G6j)ddMArMug3bfC!o+yCGt;r{yvs!>9Hj2+fso_>-wx2??D_ z6ZpSKsl?@ujxfW)Pul7mmY%XT$$!6T4ZHTfb&TL?xqM}>u4K?1Cnmh>4rL<2-83>G zj>$of)038~rga^^@OIVE4 zw?yFT&r4N)mcqz9Q(DO(0^{Tsb!99J+7QA>h~fo`Nd9`MWVifgJkYP%I5M_sV@GR* z{(W8B0xuQZ%W*N*j05UluDLkHOA@5#?$G>cQ;1icR_Wx7)NpDg~hXLm@LG@E80>gSf3`T zPt%vD{Bu03oF=oe7j=`+>54h*lfq3_(-L>!++!8hf!Tzl=_Hw+o#$Gp=8{-}ZcF9) ztqcK^&RhW#eb`JMmzhxI%{(wJ_XzK+V6e0qpye`0w{6?i^W)Dx@;v4E5M7ZivJjL0 z#Cn8!#ixxrk!4#CFOH(=I`(Zm90ityKPQ-U^N*L29wC z-bJ~X)(oOSB+zupyH-CKv~VyCa5dBj<*TsHz?5puMU;!ESBL!q-OuUm#uX;5$l0k5 zcLXYsl4&bf)u)`URpP7;z;R$|dS@1;P0_Oy@Hzr9bFik&V5%uu7!xyIc?7L-Cp8;I z{2%t-GpfmT>-)7UDxxB~Kq*QS5Rj_WC@4q?C?!Z&dg#3uu^}MRYY4rE&41|r)ovw zz}A4$UFooMuIHiVEni2k1jc%hH9JZVT2UU@IJvI8M&m%GH51qS&cyWXb z%-pH$O$j2}6ztik6rj50Dvql($oADGjC_Bcp6)=gkBjt?evYUAXPDw&I<;pGCsJzX z)x*d4)2?eZZ*ClCcwzpQ=Jo*-*>`u`vPL^&(J|L>*zaLyZBy0QR|!l(BOXt~uX!?T zuxm#t8oHWUXxKkvAJ~;}d*ddG%E>VWQI?85n?d5uXEhQBWDfFQWv)$=*8$Egjm0i1 z`77cH)Rg9**|B}O3`>%=uTgT7oLJHaa|gf(1lfjnF^W_b)+Gpz*t=j zLfoa;)kW{lXwP1GsEfh0U3_6fE}R-sK3cPWo;}EZ{0gMN-AnL@T+`I=6?`4XQk{~( zQ*cl(Z>+cKi+Nd%1#tkauRsTR6V)ZOm2BGuP@cOBrzgt9dIH!z*+p+a+dw^^4e^l( z=2>W5=j?%Apn>0*e}XZq2`%^m92R)d;x(LNCro|9VR_2zi04@{wWPvm|> zy#b+YXE)iHrEH7)(#Y`*`>V%@40yNxxKM1>PCSn+*zGNQy=<3yX})QqEiGU{s0+8A z(>Y{4f4vWHQtgHlLN@sH0yaIGVj`w)_A7+WwOcgZtFY{mkh-hgG0rZlnS^%#c%~rUe zt;iPH^3w&tclZ18j`zG$3fZeGlF-yIh0pR9JD^X5tRXnq8Q`302+ouKjF(miY4a62D zViPz15V`w@Ah2cevNw3}xlB70^nm@RfBGBELJ<+(2{i#hDF)XwQ^D!1u`IY@TMY>( zhwu5ATA0@+)*=6gnl0^mtf+AauPsbXe~#um3q_cR2zahEU@){)jD7z#ld+e@9W%T2 zSy^U`Mw0gKlr#f&qtBnV(jUzUQ^#qMl$~j!8ts@yiz18KbUBlCn~a#jj%*#HPs-k# zm2V#Ry=S8^7UL8YwI~4U!3Q0#h)H@aeHIAr5>qm`AN*UPGBGjWg@8gp?LrPT@Ht~d zRZ1)Z-+%3cv~DKi{Z)vOUmLYB^eI++TQz^@LJoNJE<7q1%_9wD?C44Mzy?w$7xm%p zzI^&E@pI)zT|QEQt8XntRIH_Sv&6H^K|7@^OMrVqJUzT? z*Frq4*>Mua4H@0hoF#Z>41T!1$U*a`EN`0 zi>2jmGs9zYM10ry?cAJ>E^*0)Dz$dZaDF5_D|ZwgGnx9^WbVM4uu@*RCj9fL z{cFx-DZ4NJ)vwA~V?dYC!U0>JZChU@gV(goN898mxBTxg^SfHK)vCFFUl~775Cr)S}vSUfHd@V#zq&NUS1;4vG|K+ zTG~s`^hC8k?!K1vvD*N=*rDL9bN$fwvM3ue>tSLbfp`sCM9VHVTwKMjf9Y;ru7a=r zRWXSy4do=UH*E#xdA9M0XKqdJ4V2g?Q7PvwG~Ooh1T2QDxT+PfPkTPb$zRM6JX$Nh znBuGRCFQ+1D&awhooyQ+BEpftm`9Z5`f3SZkbt*H>=YJOe70<-HYoT(48w67yB8Kd(KxK^W}u(!C{UC;>eJ%7H~b(( zZxUcwBLizNA*SSr{f>2eU-C$Vu<$ZBY|){;P%00bAn&tBK*6TC;Ws4;a7_;>Kc>I| zz5t;I$>4>UVezCZ%_kD90i-8M=+wgPRIPR2;skHZ@G=!U07Y)_(2qUTEwLI%5kN8c zkCtHM+1IwqM#LYp=bKL7$M=?Qc!YeY3w(o+;oS4RlNd-cjHt^>E@$$8L9bdeDKcXPXWW0c{ypqA`H` zQNLz1>$LXf5U9Lz5tJUMUH}bCo|C1@zu>vcY!m)j-RWd7>A-fVI8=7~WzW&Y%gZmv z8U83!`TKqDS<#!0mel>{HE9D`C=AE}U%6IYME>+3q?XY`T;8=4+V9VnE#N_>*LA9# ztac4TBH)LcYxd97Q`bl*4mM7HX6i|-W)PGPIJJ{9@>_Dp$J7uZVJ1@y*7oL=!0))IM4R;nV>A*i#YO`Q@n+}H-YgL^7BRvA$G%tWa;FEvGdVc zXl7fFdk(0i4K<*dUdkgJ%$;?Kpb0M;tJDRN_fRu7`n9W{{kPG4kZXC`pnX=qaShBe z;T7mkl){N%N(bKujqA44#Rq#{$qzj%SUqXlmnkN8)p$NIMlhxMW!8YtQH8Ra#Q;RY zR6dzT>YhXbR1&9`H$U#zmM-0kq6J{9Mw<+(z&y;NZPcfbnEAnbxI69VC*1;@7nIY@ zsh#SkIhZPouQi^2nOUbdV4#BM0;a%--}Qu-u_qkx;Mc;hzGiXn)79%&Hdo<28m-%b zs3(wkfgrW5tZG@rnRAES1Bct4rh$>BJ?bcx-&p`Oc$=SL^tTV|71rPln(ochDYDsl zMwXv2KfLJau`KXg{faj<|K}WW1y9*Ky;Jvqf*>&v zT@OD1#z@U$Kgp|pK(k@KTY5-fQ{#f`L`Ckpd@txQ=6lo7(9nM6M%)`sXKTrSs)_z}tV(?G9oyieP6ILD*(9qm z#-`>mEUX09xz)vJ&_s_b#D~+UN-2uL4Ai@$se_+RQcI0Pv;0oTc znwwV%B+heOjXlYoMDTD7a2^J?hw;e9XH}Xiln%Iur(7hW5Uhb-l)VS|+0mlNjw^d= ztW_)c6uVh1?HS*BUHyHE-u~mK#zz}ofR*ssymBGl*D#M>q$MqGloL2TIZbEin?Wcm zw&s#QQB?TZX3jhw32kCt|ZkI#Uw#$H9A$9atQ zPapsW8Y!zlYD)6Bss@CQx+}26Y3tS4Z|>X5gjkIg@KJ}^OTp`tziCeP?BOgXZKC%5JWMuDTfnCy81tAe5}hxD7PF!%3(^JXh_*GBrsT}nH$I ztZX*c$UyT!!wSoJ5Ker5k0!4eo~QCI^xx*RKsoApgxl>HaeCYwDW9BW5!L$AMsA;( zN+zsdi*%8mqyL9G_ca@_G>b6$mtbD?8geR6IS(~*RnL0Rcu6(x zwWW|MT6FA;(H#CI%*umUG%sSg0-0hW2Q1WX$4*Vk-EjApOJC&`ZkFyNncAu$XA z>!jLd?BlSwp}Wnpv1o9M{vNLjAywq!hA7ian%Cw7E>2B1>JcR?kYHO}Dim^G5S1Y3(q&lYqc@$Lh5dvcYCHLs zpcgk8X7MI_Ev=EpV-v@wc$?Z3-r1ISYnUdtWlpFWcPpmcif`AcRaHllm&SXH@cwLT zOB2dfbW8x*!>Fl)K6&uYRNxTpVwE6c$ijD7Z1KCM9jZro4TS|hfP`slz*u5iazkHV z0M%dZt2&C@!C1Nuc|yIy z#wKK-uLj|X{-tS+gT0j05ayHnqU7};N(Nu#1oQQ&rfnQFh}UI*xFw0+ zoN{;b06XN_xnnssJ(!@%zSotp9Tk$bUvXB*NM*1Sl#-?JNIgfepL z_f`agOqC-^)L;=R^B%YW$ubSrYu=i>4B^UVDlAHVQuuS@$5|Pqp2zYOP<(4{qU!wE zJLB{+*e+NuKP(X^Uw;TqUM+QMzOlHjk73BE*XW$wi{_nH(GzYSM?qgPIW_^-XmX@! zAWd>PaK_TT=MgIJ@kzlwI52%5*^F-7?5FASz=<~k2vB>9HPWw9sQ7@Q=@T$Mx#=-9 zRIWK&t4De{*p|IHT|X{pz|zpG7)iT0DNp;^mOab2*uAmfg8$9w#~8$}KK;!a@lc=w zOt?;DW6AKr1(hFX5o9cdf8uj0$z87ozfoeGm5uG%RYBe^ZRFNqD&$S~elnaJ9^l%` zmh>JFL-6s=f%R%=PHs1CR&3(wU6i(d$v|nbvQL!*1Ymqm{JLSld6%xint3DqPhx%- z13=IXpEih&9?+1MC=gqm&(_?H_aWSP2w8{8Gn1YZ(>BBG8-4dbRYD*9YlHmPCzsQ| z;#;=*1K0er&F75LMh~m&M=qQ^+Z&SQw@yjEZR(>05AWBtCBOQZvlp$zJ zE|kR9L6eIWUztGcRtV@Jy6{{zSazKzQJ8D1+iieu;x`FjJB)Z-*1t?TmUn)+B{3#{ zY_;vw-X2Yj*(K>l$yXspEVyUK$=fP>|ygPYj zvD$QYGhyhRvHVUherZWQHOBZe{?2UyU(VjNybg68tdwG^yk08LX+Tjk+#4?6##Vgb zoI+}vEUVVS45cIsdmD#PZ$YKQeAlZ5DTLw%>d=dA|4Rn>PyL<8zdl@(McNvOy|eht zOz74A(lur20$@O1N=szpq{h36U?>)_dubtRU+$GGRCr8gKZ$KkUD9Dhm-i71>T@S0 z=++O2=H}F)yf8hjN#h4~o3J$8Vz=_*o0Um$N}EJrnn3igp#MS-DP6PB#m1XH=8c!H zS(HW`w%%iDXw(J#EgD@_Kf1S6c-W&WpaSz0%zgCra3Jqtsii<%G@lr6&(9Z(3*>eH zwvFF9gnyL3ms8U-ekZ<13U)Y9ScF5jmEX6%3L;*~8!?;r6?K>k@dQ?md3CDXa`RMM zf4KV)mkKspy6Q<9CJHxTHG2|-1!L9c;x)FH#pUu^DMZz?VnB=f-SQ)jg$HPA1M$ai zKE!^Jil1xTSt|Be_oJ~5L)FSLpu<%o7IqA7xBvJ2;#11sM=>+kC_5N&=fOqlC8}hn z{%pn5*oP|o8(757L8D4xOuOZ`+Gt4;yZOBS;h&ob$;U-BJ@h^uKkv3ux;R7cl$4$pXv}IjXBgYa@}L;+leCGr(Y|cE^F*jKs9cPzPIdS-0GNr8~SX=%%E-E3dL{DX5**Xy?|N z930X;_&^EkCr$I`RJ{6OHpGRXx%jIbNm6ck4GkI9UBW}+wZx$+y5SU)Q@uQrIvSTC6Q5FR^V8O; z0~8-8eLo>4~ z7BV`_(132EgFk+*?W6=1+mfA?$cBS?1Qb+;j?yDsu%b+kF}@y-u_uerGSg11Il;f3e%W`c<$XZfcB_F*}md8sfNXN6P_cDI=Nl}4K5o})CHU@ z_X>V8MN9Va7{iH4Go>2wZ4n+_iW5MyvD=Vql3oX32v;te&30567&Qzkw2{`YTue3I zKU9qE>)7w%W@vKh;<0L^ZolwZt2EbY)9IA9j2ZU4^$Cbw!w5m*?p=mh0B@9 z)yZ>4&`Mv~<_`CkIZ7>zg++_{?z>36CjBN$Dfpb~)5itNO*FS6bqY3t2eqomp^7GuNW^O&`1E^29c^{!5GMbL*II>l{UZAEaO;(uR z*#_VcnIAM~l+FkJw4GdGgE&_^;RB^?^1O#s4KPc+H*q&0Y35ytN76$@X3A+ns-7F; zg2|%RF$z!5*9S#IjI2>^{|u_pU3edI7DRpNH`JE-Xwso(tO7776DrpasVkB^kTwZ= zdE~m^nWgCzV3{^HoZp+u+vk2Xz=~CkRAzJ66Lck=yWl2Qu9fG`$4tV8BXVkZw0x+? zN<$@2ntChkc1xOWOvuXt-{gJ%ETMhOw$PQf)q+`~Y%KHK*C)v?rTJ4d7sunJfbHmu zEV5H){KUI5Onv3$Fm4pzNsIgRO%JvCq$xbRMNBO-_vt_>vioU;n^o3$c^M&G(nqhc z=-Z{2;${L&%R--k=eb8^$n8N6;~6FDw*aaiFR_D9Dx{1oa0RR+rF-|q$vFjSrnZV& zb#XAx-sINK3$XW>FZ;@k;t~d``yre(!6O+asq?!LSSjL+-8?slYmbmIZM&1ilNLdm z_4WhE0@Q3tDJoA4sRVw={oJuMV5!%BADE{OUPEtF*cb>#7nwt45b?iq+3?kG;b>X* zP3JMGQW6&~(aq|UhR6X;>^3$?_hdz$v@oZg_bq`Z_3t&?OFln(`En{hwzTi=!`~O| zU!jRizKmvG_Y_=3rBJ3GZ&Oz2%TTaNsGDWiW$?TasRbv4|3V0JTTzTLc-@;U*WxDI z9U2YJEs?5}kE6qDR+rz7NE9^QuSEL6!}c0NIcHo6z)g<<1*~}aHm|jDMroZJE=E({ z*Ho#IoJI@7GF+B7E26CJNvjxwJsj(j^0tdn0O+08kIkGHt_zln$U_%fz{dT3bdmBq zQK%3*C`~z}!BYa6kmZ1tKaGf$7CTo^vybj01I(XLs7j9E02{eOkR)RLGYQFkz#;%n3bP3(dA3UKwm6p%gdFK6aF_8(W zafRU;Sb2%yUhsta2@o+)KPR;CJ?9?u{MmJ7q6!RK)_H4Ct#a~OFoKqWGtR{-7-=$oN+-2& zL&&2c;mm9mI2@=m%-gP21a7|hz%k)u#~tmCi(0kM9}it!>;{wIhg4dOJ3sk6q2Zv= zfaX7MrQ2pqnoC#gjdhxBLX(!oKYciFBJ9(rc;>6)FGZMmI?MV{!mO%KKGPpt+rFqRjGci5DmUMJEG%+L)vOzf&@(D9>+u_fnx7!EcJUp@?T0;D&&O9 z7n*+?(((D1%0J~HsEdnlQG|(b(kFvcN<wAas``F_Y&~e`}&r1{TmH zPw6|RJz-ZZ!6HL~t91wkcwYS`(9dl*O-Gn?Zl3iQ_nr=*m1h=9^G1y-hSvSNpY#^n zA~S!ATzJ)&S8vv|tIo^#<{I+f|IBU9%MN+vx5ON?F5aYm!6el<7|d6HVWNF^OVHEr zML?{y^XB^}#`hVch7}Yz?f?zyc#M~#eiL~2tjaKq&YcV+9F`d#kd4*oyn1U}mOMFUC` zl=}zO@Q=AU|7&NO(5OQ`(PjTflJcLn<6m!lE{&#s`dXQ5{ZHBb|Ep2|*1i@R22N1; zD(KHg(x1QSS4J8c%Nw!#Czpc%^=rIoprXa6-_HMqSL5)ency@kA?+`8&v9WI6sqCb z%iuqM^FOurDNR~D|NF$S*k9<=?=-4i!VNlsf72uX>Kj@$_wT=0O|pi*|4a}54<2ry zjhvl3uTTGlSGz1rGr?PHHPoLr_Rl-$O(JdNm~a*U@qPc@*m=uKQoH+O2$@AaIbL#ScC(nuh?mQg--FZ&E<-N?-P;zqZpsiah zc%#eYuk0qGr$w#9)U6o00kZ2^;BNd!wm)o7|9<;Bapje7+oQPgvwvaJdv=?)A#0tB zar_Iv6#VGdk?~1rz+ZXh+AqrK2ac69f8piMJ)s?b{@bAc&wD8NsM3qqSu#H8R%cMh z=K$WGCgF(+;SVti2n8;zPTcwt$s$w~zHR_2 zgMlX7S=C~oD1vYQlp88=24^NqkZbr$o0rZAf995cUi=L^6dA>W0`_MaWDVUoZ&vMU|4vn`>)KI<3Thd9Avji|CRNC zpYAeNmHV0J@0E)FlV^W&KChZr0mH+vNV4bTRRq?7(>wjgj*;0Npm;g{M{wv1L zi8+=D*LiF4r*Y~3rMKPyXht}EVaECwjQ!s!^sAHqJB7}1{C5h`rq%z?rx2}NAi3_2 zCnKvLC<_H`yfYvXrzv{J*f;c?8hcM-SM`4k<&4UBlyc4iDtnW=6O|U7G(LXn_Dg4< z)8AUZaT$_6$8ZOH?Dc!~R$Zk$?f~qbMKAc2At^^;xs>Jf4aZ_+4m>n&-00)|M{yJTsb!}2-30t zocbyA+gSY8<1um$G5jw)f0_3DSa;9J2 zrltER==yMaXi2H5^0!t+#F~I^|2Xp>c3pmF5z71KQmP`=p!u<+{S+6odXUM7^NZ@U zFZ9VDtX`dZ+ZZWwpT8-R)VhlHe4PC4iq>6I-&p~l{^JSUe#K_h%FXMAAf9&%eJl+U!8BYZOj4QQZ6!$X`*Qi5irW5oh+Fn=8>LF7>By`HaWIKx&hh zh!cC)10NWx#`8xnNG6(npo^7{O+0fc+Frl1r(Qx$xc&B9&vc2^DXy~&6kg$dKMl4` zU(G?Nb@{OFh7>)k?4!-qLCJyve4RXHvA0kxXB$YrnC*hk`8jooO_obyRT4oy@Za$+ zG|aaOBXk_3d7-BdqJ*`?+t& zr(M5rTCd8F*gSl+c$+3wnY)m%@|ld^;1W)j7h=oU>ULAHKI6we&)xVle9GrtJ`pRp zY6^Mr(X)30GX|xxN{!E=RA+9z7Nx`=X7Po8MAh!2vpqalMjpaU$#pRxY?H83{Y5Do zO`j1)pB&r5i-oQvWz7!NxWccow-vaQ6XMQ(y^6dcNZv?%=GL%JU(uz#vCR1_{$`hk zmM%xX5?$mi`8!UR*sd^$Y3HfO2xtm*LxdxBU_Q_|K2w9?T(K(?IyTWX@Z}a}CdPiE zQUy3b%?d?D z@~VsI4te!-&d&mE9`q@5d_RG?9v;<Wsht6OjF?N9bv&U1mP}&yXD)sTMR(f&5cR9Zvp%w@@c8yaDmNzmv4V-3;0Qf z^ACk#!b<1*=#r>n-`}MLG&2MXJpE4o0O%fB&n}a^4x@0VH#a$Z|D(|PkfBgXsZF-#XyUD4~ zX(#jF{%W@m7MOmNn{(kpY!_#Ag&&S>qTzL=KdBp6VLqwhbNDrXvD}(HTF4l`KgFe+ zR~?3-e_-N-#$7QWNB(oEJ@qK#5f!%3-HAN?z3bN1-&^!7xh2&J*Q$`;!3tRSqiCb;Al;y*AeS zUL~Co>-x%@UOE^8vy911uTwCrOn|D2R!NX==-I#&hR)UT>-iG*c5Py(<@%qzqLEI6 z_i)SIH=YqP;rH|_p9R~UfBE(BbV-cpqH1phkVO@#;nmgk8s9VJ)D-JAdyA7>EisBj zzs7AU9V}?dF2NPd-S^K>#y?1>!wbUeU)ffDODzUcRhlT9eiOCeN>+YS^rkVlY`|2| z6FHP^_wZuHDp4Xv%=%JYO|NlU_&VAhAgu2w1OA0Mt#e(9gWP-&X9aXh7|vDgFvMUW zL6Y_{sOCchsu4Ny7LAg8p6TA*z17i}0k7&rqdHd-wrv3YCGX%uVAL$;kk1ZNaw9;i z%syF5tHd4*Mw2A@Op2eqom|}-C0xIE6^>&;mit>WHlRzy7nH0LbY?CbS_T{k5JCsJ^RMbe5<->sP3KOT@5>Xmr*0a7s_0y#0qjFpp zp*KzltU93=v+poDPR19nQHmH?mm7cXRu)#+A2?Nb;pO@CvubsaB^B-g8Q~V)sauR- zlDnm=JcBR58U+<@W;UD-LC`GptoJ%FS7l!5YF^}v0~^MEYtp9!dyJ^2{}|ku@K(YT zPu0r<9(Bk!Y=5U1Uu|^6M|iDIanJS}-VK6#F@FrnPoz<0Rl}ERXe3r$?f}w#Jka}Z z71W(WPm%Tm4eDoRCmM zlU2gjz0r?WCcW=kw~ebC=OlXpMYGkEJ?>R=7S2-|PWeo;qo84pL*fxt=ANFZ@gr#u zd)|Jaso9e!-`a&^CUNfj_Qn1(PQiy%& zZ=)j-{TFXb`Sj>jY?kgJ7%Jwf7Z*ORt))=w#t@ogm~!pm&Vqmz--cP>(ZW6}@(H=J zq*PCNb7fd$h^l3Zb14rfNF$F|SVH{8$TD_K9+Q^}4RXyI0(DRx!i!axLS7zWKYMz& zNf>4=EO)=`j&Ao#pQ(2kx(ZIPLsCdT6*<48`KX)q6@=D|^l>eQ8~v1$3*-k`-IL=E z!hcHGTUx7P4lCFB>I??SR8GB=&~A9moKN-E+P@_&P*)kElE|YkTzd#anpVlv9J#Bcg2!d|m^`OXTFcY(oe!|zDO z4pps`{CT+jR`z?T>-53Bw_A7xk6W^`6yOCKE$0Cci`c>j3DO2J;3FdNz^CpWW#z^J zu9V(&x#c#WUU{lG*f$oQv8cIMJmeG^{~O_fPo#By?+?Y0U&KFQb@t`JQVRkpHzRFT zGd!VdHQp}AlVYIN=`XcmHlV0zbLGkptJ-f!i~ZfYoz}PPiy!pT6TdyZFfq+4G5@^Nm!5{fB$BtUIbvBWNdyebsiPglF&O zs2D(}%`oD3&%)*RC;W(;iL`peZNdhe^^Y{k)6M;}9N zFB`R!YKo@px7jt5T)*Z_PZq^KQmiGfygC)4S@-u^0C@8Pf7jI2AzlFy>n-iV=K`nDfyoclE z^R7p<9D=a;l2=icjgDkE-Lk)^OPIf;PXql!soqPs9xi+Kr1Hf!$l4?s>r|_9TQli9 z1?COg4P``HqvzF=4(mSuCjW5g3optcb>$g>fZf`dXvK6p{8DG zM^j{MBu;iCDrM(DXN7EL#DUUpqT=ayhIrF^fDw*SL)jlqb00D_Q zJeZ$B-tbnpIkuXNGbsy@W26po*<%!6oN!h5?>E@h(DC}(Ya!C5(baboGImg_b$n8h~Mg=A# zbW2y2Tq*z4Cd+1ayzKT#;bq~yCeMKMRC%3g4SeO9Q{?7b%^9I4HMrK&`prdK=_hlv z1KD`1;7cC^tmG&5F4qC`{e#Rads6)!c?yZvWcMF*WW>wh-5c)_f%-v8XZ+otXehPg zn~f|LbV+;rddiEGG@sm;$Mr1CW9fMNrA>!mx{ZA?Vs?krHT`CqDiHv!>g)xdu%dMU zKKb&*z)2A;q>)myg5hiuzj>>?m+mdM619`IkfVs`6*Y|>0`zL2w*k^}kJRZuf8JPX za&7JHtmb5C#fLi{>tI+(m z+~0}{H)be)sx?A#_Re;#qzEm90yDC`P&?o9r=8QpVC=vkzi~bF8~*x4X^KZtZ<*J} zXG{0Ck1Dq0r`|L0OzKakdp~o<^$WUL2l9pheT@VHCG0$4#8nqc1qskJP^2?y2Z#c!+L;Edn#&@=kk&`T*rghIK6II zy@6g+pSJkwLnR6F$oz6S`$Sag z$C{2WK4-q#jMIHXr%iBGLD9iL1t$oxeoZ8$1F#Cz!N zB`DFaPOjQ=_bJkok|9SFvtJ;Yd$jvN!H;~#St2ZZ%{2|s`6phOTgNxle0P#@8HrhHy$7T%%o~=D;DBUpU(C=7I z@xk6Gpa2l1TSL|s2QdeE(mGS6h*;V|X5m@R)L2nA>m@Bs9rEQh3{21m_#zAlL44W| z0w=AsAAbj|K1|J$)KF77%C-h%ok9E}+*3%hv;+6`M0lPlkWAivtVSPEZ9FmzO7i*w ziIG>L7?-xo5x36%2qI8vk!l%DYkaqBu|8jB7ol0lQ# zPa&#`Ap7Lig5$h>WvRio9>84qMOslF{-sp7_@Y3S<Z$iFsd>l$02eLGg{wsT{2^-1iozTS%$+b~dFGb^mMk<9eRoT2^lPAzTgRD16UZ&V z;3BQU!aK$|eurOdQCVbMEzeXcMqi%>Jf;r-cdh>T5n`b*>o0k@`wX_e-vA)(*UDiU zq`obbOG?@Qoh|yUVScj(gicA$ZH>^kXA*~t=N%WL_oY7))pD#C%C_jeJhS>J<&yzfi}|AjC(+otM?Liqut*GfhE6m7|%`uCPVeLXdFtZDEKd6|rme z5-KBImB7&He}}Miua=`Km#JC2EPgTvW0&+i2@#hXk~Tkhr8LyUTt3znP(d z{=rBk+O6-tr^YM0b)*wE^YR9)kq-Vl3*ZC+{#`;(4T_bpKl>iUHT->S+N(MiR#LwO zmZ4|rPm<)DxgREBXJjq&9P815+SF21N(WL~CK?+gT&rZtB=!iJ>IKWv#ESDgPeymg zI(Eim8-Zmj%FJ^6ieRf5J0=kagQ4!aG+uVR5LBkx%gHdu`F3~IZ3SQ1p{bt?6n54ss9~YToopy^K=7Gkf@}|Pq@%ad4 zzFyZL{geK{yFq{hS3KV^kR;u`kw@4~v)vQi=<^LaJhfu2U?KfE3lZnf=Dw`Jdu`b` z8Sa{E*H1xCSX+wweOKE8(r}}}f~@>*-_-)9l=)t6u`s@Y*?ercClDz+gTBOCsQGl& zIYaz^#-%uZJ3YfD)v=GW0Zg?}OSVAk`eFlyC;F$^tr9fTMU)-u4mvK3eHNKSB_mtp zj#@GmuM#03;<`7ZS_0K<)-HWi;3TP@{Vgrojz%g`#W-q?%Qwfv#>NBh8cT5pXea`i zj^=Ui6ifs5%jpHAcyn4gZG$wzC86uB=>ewR?IzYseI>`#RY~ma+3YXK+Sb5yGlkbu z>zTdrf`Ym*P)z-UDcji~YCC3I!H{poe5%3&f<)~e%xJ2FFO`_b3F&IFNEQnlJO;wH zg5&}`V>00j`ZRr5zp z(7^cfL=8WNhysGY1gntCU=F8e^re*t-KP>{TTLw0_XZ4_-(gS>f5YXY#pG3l~(GaD3ZQbIFT%Seo;+Ww}0ys zQ<&2DMh(Q{MoN*sfr?t`i^I}VkFwt27R99UTFe41<%XCOCAd%0Lmt}?bvn|`oUU-tW(;|B|c%1Ws1s!OJ#F#7dA0b7C-Q@7$ z&G%0K@JC*L9=z{hI5}^}+Yt#6Mt(PH`f2+S>P0l(;GR0{%h}j_V0@b!9+op&?_Z5e zbCH|K?Ug5g^J+nMW;1kLu$Lkaaexw$#_=#()vtcfdn*+IWQOs~6?f9mrt$n~gnJs| zo>do457-%r7Js-@#mQ5pTdE;QURusB%Zwq0dhaMP$LcVwDKH>0W+I-O3J3qV#$z&ttJmK}YY9qL}c2^za+w zt_V!n3*mHp2HN(80nZF_g)vcMuwOq<^Py*BX(a))OQ)KjyYLU7sOLF(D|v<)K_s*4 zVQwJG2i0VO?+keOb<W4^_e^r1222PFtj$`>f(oQqqqx(+U z=2jgIO*A*jzb^8ltxncWphPD>KQ*!^dZ|{vIc{G>NxAc3$YoZkua)5R&7b9*#dug= zMWB{oT|mJs>*K$`8pc ziFQyX98QXCWM5Z=U*j`67LLL?D0UXYYHF7i%8~iF=BWt&L9!DbeH!>;@WJ%e#CS(-D{+^>xiJ zo}rG!B4;DyQl_^9H-_PoKtk!RN$N7$j5|y0TKR`?a+Fw7W*N8Avy9@X9@B zgYKAihfyK;lrG1S?tndkecsLWd&}d4&Rfdq(j$481sHgb7li;5K*UL;G?%|ds4>j% zEF0tN*RNgGVsCETqAvk2iZlXvHR{tI4f7tkk3XZ=lVU2RQmtc+P4U+A5Ek!sL2Aw! z6!qmnEQMdE;ML)WC8+#14i?X^J0(YM30Cx!=B8C{x{f1wB-W*;<>IH$iZc2}klbe$ zZ3e8XH8xW6L?{1F5!I0fh`*V+`8x>g53$$F_9s|AyMBB+@?*6G=j1=TYWO_XHr%UA?n<|4lJu+Y*u5yWsQ?Y8tBy} zEGB->f7VEqlqyTUEGMub)9Grmmt+@YYDVsIuT^qLo8+PS9Vcp1PcaPN~)12)K)CxH|FTLDPmhkK@` z(s3E+)bE4+G`yQ6{KOu{6BD>g+1V=@OgPh76z_Su5Og@7lHXfhk5Se3QJWN$m@9Ic zV3u!k7-znrV`~ifu{Zf($2gs68E*QFLn7yU}+@$OP?GrmDp0p&m6%We+@Rak5=uh9@dJ@GRicYCgR zLYoJ&Z#x&Bnxpd6>L{NJrmU8|$GWBpzbI6^W=ozY0&-1qKYB`MIvs6NA7nnI8*rkP zQ7fjHL;WAvHBANP!@jlG1E>}8O+}a@E7;4G4nDca)VleY%#_daKHv5jqQ#z=DexAo zK_3Pxc-qf`^=M_+p1ozNR*e&i9&}9lo5Py6#y%Fx&@`ByUeWj)KQwg@eu%H8ZVp82 zTXj8gFgQ>>sw{DU6e_J&J+|_eqo@`+%v4O{_|v}f;hAVi-G#L3-Z=aiVq%_8#Pl^M z@r;#%3}C6}#N?Hn9~s5^bJTgCsl(5NUxDU)?%oAd^_m0N8Rg(%AoI~*0{{Q8_nu)* zrd!|lh!qudL_|fv1_;umN>>5tMQPHd6S{N=0kMDr(tC@v&KpIllMtoU*Le%XnOdh!3x$RYOdE{}CA(`Kq16KMQ+7TZ8_i4i_uw+r7YEy5 z3@LS`%Ol&f?;YtxhGb#l)smFwdr8$Ikr8Y0&!`QQTlnK zCxzI@3sX=(()BdZU_H3AlQMkq{h=e%cu1Z3JV(7PA#s>Ui-a*|!gwUiL)eBsN9(zx zNZHr2v_iOt5?+*bRz02Yrn>?{&&1O&;xy5P&kS#=hNyd_ochk4;)@NSj5Br=>dIut z@vepXtjW6RMWlzvuW@+5I)CniS*5mf*FNWXtf5fEE?)18M$lFHi{X*WA z)qiQTZaCunNpzRvI|S0_n``r0OPcl`9CP^)qpXaW7wv{%Po**5JuIJ2=_#+pZs1x`uJ={>`BgV{un zc{tUT2W1nLmYA7h)NsC3|QlfrR~8Kd?|UCGNb$q(DsZ%a+=K)q}O z`y7Hl)Idu-rT|nZ^qMD@m~=2z4+`md9BF>CF%jH6dJ`QEinYRyBCHO2FzW*e^bYxE zh8mDV@|{Ud0?S8_bXC$CQ$ieR%G+%!B>6SeTeTC{g79b}Zo_tu(svD{o_O~)3^xGk`%%HRA7^nDbZi*bF9j?f2%WMoS2X0U0?UFrG z?rz#=?B1<~gnznj%1^{;i0lTy{6(B#C9d%J-fhHZvmN|!!m~TU`#V3(-43)oJCvP5 zqz@t+`Gh{Z7>&5UM{eJ(#3s-)Evw;+=!f%KuN{m>-0)^^6#hkLq+dlHBUt-YEm;VL zm@TOq&suDk?d!NxQW3W9GHtG}RH#>bK8D}ckC_h@HImXh=q9%qUa@>Q@Im5+IjiiO zXNu~>+)l|oo0l96{CQ+8xue97J)nayO0l`AI?C4Z=(WpiX9FOXYuALip5Io#*^6N8 zAY8xxD!qKrn$`mic8*!D)Z0oi-s9fy(!ruKA9&U%HI|z74EzBKo%bH#8GKuQF-ZQz zA$6QRI{n>N7C#3B#Lw@YG4Xu%Fe+s9avip>NEZ&1+R~}kX+B&NujuCObrGfd1h|Co zIF7E+CkxFRfzzIBAI`J zLXB%_4z`Vlx#QOu+^3W5jSj5F;mxHUr^8dkoaUMy(w!AA(eLNXDZTcTPh4H{e8c^h zzUzw68ut_-Vbhj3qhkhjB?&&e0hjs=%*?zASj%a9T)6h4J$Bn*Ywq>vn*StjUYa$* z&(l5>VP+yQE)@i8DfCz|rUoJJb8hvz8%g5;VfMgSlAF7Wu;TvygpGa32%y#fMhl(S zR9y@MRQ#IVq03+e@ASY)a#VLMG$}E{D$ON{!2Ba8DYrpRhkr`S~TAxX9 z);m<=10;Y(Mw%IHa}(fz%9Xh7Y7kc-rC}L|j}YZu>}=PjQhzzhIEViW?^`G1fQ&$% z^bm#17KL-DkJ!cR8-4_ROO@k$fvYQwmv3%J#cBDp#pHipcPxsZO-a1Z z_jl?W7N5@ZBgM{fT=W8bCM0tO+xjrVTb>sK!#FE4o4RbI?bTk4?Gw0$nVB1zjREWO zoR~hp>IY;AhA4m@=1s2Z4TlL+$!rT~E;H;|l7z8EzbXH3?v!nhnDG$9;{2kRCQ`{M zOKU$mE5=%GW3Lo@eMEq`wVaV*i+$Uv(I0QUCoYOTm&Rd3_wk}y zR_is1VN1SNf{V(kKnJGC{rM~?B!eg_ zKeP8%^%|9R$e4&hmTr(uabUfP?eo~; z7n}7aoS7~_1GsV)0os$cM~6iCJJEO`yDpO#f6uf>yri7$fdmuXE@fv_w&_ak{YJvhnSI~V8gPGehD&T(6AA0) zm2TY~sOmA9lysGh8RCGs|u~z;P0Q^-wu*8;WwMA8Bl(kYN*s! zxU;x3yK&dYfVfm2AohY%#~s7&K6hu!ZaRYGzLFSR1@JqcFi&Y|0{l)91JZmo>9IsQ zwRMjD;5OHaJL)uZI&#ZLDWHP^9MW3#T(O9 zM-Mhb@>#ZZzep}tLG7RVucTSgE}o)P48#moEp(of^$_Y?%?Wgi@F1)SkMJAQsX74L zR`MK9?)VP5Hw>SM<%2Qu&lIL2Ac5g&0>i17>}_7&7q<@HL-Vt^4S+sL1&bLw7s=Fq zwKTNu237T548ZCgGO&;DCcBRA7wU+meo2%qu?x`OQ@yVWdcl=RB0n81Z%lMpRvqsm zwuo*l_K}wn0O^xu@l{aY6E?Vefb?Pp*&OaK`ba`Rn+0WIL*4J`rU0;^p$VBi0%{k`ENBJD8~wOvD1_I2+#v+o^Q zRM)1v506Pr6-9Rc#`^T3Sh$Q-V!S@I`$+!D`ZRt;Q!Nr%1j`*p+Vm&e!ZRV`Bb%iP zk~-^-qu=|$l-_4q$8MSt5*P3180TW2H@UGS16sCOQ3u%aJ2?%WSycTr0@+>3P~cxH z=v4r1;Y(aISqRJI}JEUSp^vFQy67t^o~6-oohYmc5_4f0=i6^<8T7%xUjD zC{9AirfLeNW;}pi7i)k%@UedA+u~(c}q3 zp1PJQxpo`hSk6R>26^7YJ(egbh4TV=Y7u*5+`629>-Meh_V(WunRnJ7`hsRIj%!|F zWpy4^0+vu@>z>H{Tu8WfGcaF}cvmQ330r<+DJpPGJdb_nqJCT`C)E zXkD}*QYs6u&>g23EbqVb?NjaB9+id01!xm z&l*om3*54U>1M4r6K~b#5stgLr`w?NpE5`i&MS@~=Lx8dVVQOA^D0p?5Wj0%q?<*X zn0NeZB+IAaLbHYCsB&xDYtmmCEBu`HxFrxPhhQ zi-);6gc&*N!uz}@Y~R{4sQp6N&ohln5SzRe(px48=;^$KUe`|=;O%7REICE{nzeP& z-Odl@*;Zd`lu`K2rY%EiW@l4?Ew$nH?~&-Et&<-2qI^y%HLUQ>WK=*jht3_ zVRMC(tsKDcZBK%wnBmPDa>jtCj}Ty|LzV|LBd1YKV69Fn3pV9eMwVNj({C;%Mbr6M z=ihkfIsmzHeeOC$h9{5GXxJ-To-iRZR8}T%P1Y-?UQ?UxddcYL0;$6ewA;q)hpZS>s!jY|5ky&3%J`Cj6LZjoOyd-uM3fc4z3$yGg!Ztf!($dBUftD8{y z^yc-vacl1@n9&K0$!x`rWR^m!xrTe;$CcWi9RTFnEpmc17xHQrepS2eer<_@$tYxa zzCrNTbNVERq`I8(yiNTZM~q-@EYMEeKj(Yq?9L@x_fOaPW%+=H14U_!K=zCSP>$6B2<38* zimRHgbjGQ6l=$1Sx@v*kD=rSVV`Wn;Z~!=3!qm0LfMC%tSM45AKz-yV3ZbGLAd6U) z#YF~&2GlLqblA8@6P0hpG5BLo)Pr@lcTa4_pci1_(LbHQ=bDY~UbjHQ@YT)rCBSd% z3ZD7uZwy7a{ON>2ooOI7izzf;vOjLR#%r>%kv1^rLmZzP6f{-J)o%Ba2^1aF2;ba@ ztZXU%lq%ZoR3eFet+Vo+T|v%Dy> zfkN+yta%zCjOLsQag~sEzVX4&iw#AiP0zS>ivfa{H3Q2VElG|_&<~rT59Xw+ee{)2 z#&R^9EAbO!Iq`P;UUU?|o!bh;_~@*!y8CPUPyyNc{c+Zs4QB&D;KgFHA6FKNFslIZ zV^4YOWa|;=HP3e`!`v3Wz!W_iW|=kJm7_6)S88hNl)0S8`<~bkjb)WxqEhwg96%|r z_ZDBMI;wD)K33lcw2%A{FkGbF{SI+kKIEB)|9X91>;$^@Ex0~TEoXtKRi&bEZF}pS z=on12*Ki6XtE!($t~PJw@P1h6RkFI?C)w}bh=4F(BYjr_n?TjlZX2eU$vGOHHQmjF z3fXpazso4xo`44E$)-w~Vm)g{ok!@{T{Nz9wW}1CXY=+}&aS z4$=v_Z~7>NcMT{ZK(aZFq-{8gY;nUb;9g%VS0vMZIR1fR}sOd@BOg;~>eAh$q3i9+SW{{e(HgzS_8CVU&?s;o*$@xeWm<>{I#^F}z zS5vz6P$-obXf@ruYpR+ls|K?cb?+65w8f7Vz+iK_dEX7B#j4Ps)PKRp`j!eL^bK?w ziA!+@DCB6`%IQ;m&Tov?9JHn5qe9%0Uyj^jKAXDJ&BYvpGQUu@ns_RwQkOUR@rdKc z3UtP_u$3qY)37ze9O5Y8u#Ah|8X3xd{uRJ=f}VgRFMOjjAFI~Z;4*s1X9Xh{*wDBU z_3Pf4R_{!5R;eieCiSGPitN6eTMRyImQ(w*~sz}*Ey-#PcKfvu;6b--3}6F#&WxQ z1{feo?U!fc`HWP8BX01tN3g~QdT)p{JBCHS;rJGJfA@W$4{@;{NA#KI*YwFxuVC!j zoA^%7;a`&S82=Vgz}O@)<(@}pOc<{>qffbIS{XAkeDWN?#fRaCPB~46y*RARt zC8=K*ixC%+Wr9eo8xe&kfOB|qxZHyRmh_Hejg(m~HC$M`V<}6sjn(O@9PAJ?35U~OS!vehb8g8&7ux|2!CPcxbw_1s8gN7?-t%QZKpx~C*tD8 zSnM)*RhN3U22W>O%`NnQ>TehIS-7@^dWj`ALSvTHQ+=Fm@`n3rcbRz9ES|c_UZ^vo ziv;~}90Jd;QGOiq6s%CyE)o*W^s!&!48fv}Q^{zKR97R-aZo-dOtkMGmUvC2%#KiyVLjOuX z&y8Qn>IvDX>Bv5-LFSN!ISVCo53)B1npCrvWr8JsXKmhXem~T9 zY81aOlMBh0xc*vZt!Dc0$QO?!Q~<3&I$Z)nSb0i0>)V#1KRKM&koM0w5!g(R|=l2#q9M+0-1y@&MlaQ#Bt-19N$QyRW=aVmSfiJY_wxbqlC(msVM?9+<2gLI( z_oSN2m@NOn;T&49bgBpo#@U@Qwh!{KxfiuC`l)`%Ht`K*L!3oyTkWh@D=hKZ=a;Z^ ztTrogcB>>){(1h2T z%4oL5-PD++dNoD_VkvOg&`Fg|;|INfFPj{j=vcXB;?AJ?#V|%*Hvx|Q2PHP+pt#CNtFz#T4?u_G{EHkG3;f}X1u+|Me+GbhuTd?(}q z4^OSzCebm=j_2P1i$PJp4m6drz?z?u9k&)b*{xL)9HF4V=)K#wf zKkvoxi35J^kec>w@pN(br=clFEYdd5Ar5`}cdG$0S4JE-Wh{rBcGq5+xNvCenvyS7 zHH(M`2~H+9L-MbOg6BZ`>_D5R;r!X1&f4w!Ud%!rZ`Q;w->Iiht7^%zIQi8{H}9q2 zl2VA{gjMjn!;KfkEc9hMEoVCI-@H6RYQt8COW!_NlIT|{EjE8XWSo7fEC#@E27~|@ z&c#ccttKfJ81pyIhWo1hoCUv_Ja1RAtIYs9m#tG%-23f*!*Kd@3|vv$<;(<}&2|8( z;p`{!)l2%1?e5=ozQgptgYIfhuCE?OvCKYFqszeJ9!toO*?8LNfIy<50i! zQAaS6lp)Sto+-XHA5R9UF7&jjL0XE0V)8ZKeNgz9o#Rh*G2G2_#?2C%S*FV)%b60x#7H zilTE`p>(iB8wkG3ZGPgSj(zCVDC-CPZ$9nsL!84H6ve_iNIdoQds+;`gJ&6tBzl^l z;@N9=Z65}e+^k_tqxnNL{Oj-GpM&_t`mz#3Chv|Em`_im{ku|6Ey8Vm!us-(*5(OR zE(5J*;?((&t9&cy_a2$mKBK+=J?P{{kT6iX$d{!5?@6ZrI6OC_XyPQ!=E$`FS%LV! zj%tuFC%~@hopj^7`i}z4|AP0#1w0dVaD(~3e*~2V0850uyK7(m_n+rX4)DyQRd>h# z{t+d2fN_GF;KjZ9_gnpc`e%VrdxxYc=r8}jc%=6yAjiEr?cD#xNIyCY>{5S!Ie&jS zf3KXsSI*zt+TUl+-)GMMZ!ZM1K~goWg{z9|(kM~lb8}N%|)9dW>Z_2<=fB&7o$L;6b z_*)|CjUNklmXYy;Y=>Ijv_~)nmQvIlA1EYU5A@uA-2#qJxu#EQi506+f=6^RrMZr#5 zSXfvAB(#ywD)FH)lKQ20rElMf>{=BG#O~OS6mtMti?Um)YWdfnNHUju$OX zQT~ehc-K}ofQ3g%PtYW%!fFzP7UOwdqIRk?S;WVIhTVf-&nY}6o6{oKF36S3mkx5` z@z&s+u+#}u@-0H2Z^MP;PPvfC)ix`+ z59J5e5l_=o7iKc43vB`YovkJtv~@%ty}Cl_yv(Y_Q$eP` z@Ot`X=y=Q9kesKJ-@Rm^nymbu_#w4TncoNU%Ob;ofJ=6&5%%~|`4(qqvQYb?g}%*&qG~_2N3bO3=ilr6K_#u9=!0!V&hPa%G1ouARIfRFh|%$S0vddJ zEB?x}%4IW^=$N=%`OK_)6>;)KIyxh33LVaC;h9t-cs)%LH&rX-p4{EjNc25|zv`DJ z`$G3|e(Sr38N~+dni&&)j;41WeeP_PBE+Yga}}ojIn8)q*iDHE6XBXW zXth3>Va+Ipe_N|T9~j1LX$B&~xMGhv|EsPYadiw!b)0l*g0;}oKT6o#|L3+nl@FI5&CxH&pqi3QxKdffU}v0 zqAuz@!E^3P05e}+ukRne$)B-h6gLfsLKLFJ6>K>~^IgCq%{3UX5_WK);Egj!q49>Y zL=R=Z#@jdbREDSLc7ai8AA6n#l~Y$GIp$fV4uG`Gxh{R0KIl;$os+oNPs-v7Tj0xS zR!7zuEk-XXcoQWVbOx)-ENrU*ozyksSlW9tg52kzVMOiH_%yt(&{Yohdj zpj1`HGJh4a>A8o%^~ACfeE@r)VNPD zL%XK@d$ll3JZkR1A;%aaD1$%chj0cst_PcW6>h`VG4GYccF> z<;QgIrJid-9@}DD`>1n)R#UM~u~wgdsRMhiifPO;lA8P~1IPd3?!nM3 ztT(U|*jjQOlVh@UH8z@vdY!SH)&0nNuZ?KX(hZ^O&>Qgc51rwM-FvmR6GX!S5n6tm<_3@)a{e|;lBfAlVVJaE2*>L?WN%+!@4D;=CH zWE*oTaWsB}7aohPvR8tsU89K2{?=~qi|?hY161=BuTiI|#z1PTrl8gGnGG<y@5{ATxMvG=qV_^h!CZ>c z3H=@$+o>*rWt6bCP!pbXXFI&9RbG{>>yVMlIEXOLr45VgNuj)7R#Ge)Ek+P`c0P%< zV^&gKR+ovB6(kdo>>wLJx($slatchoGGT|wsx=0yYjf%3f1X@-JbL(QE=P^Lpp9li zPHYz)Ss$bbCd<^spa#b5sU{W>&GJ0WZrsvD)di=vE|C~sBfWZc7POh?`_29J`nHi` zt4`HilhiA;8eHs@LRznc@3zaXA3pJQ+k_|@H;F%`XOX<)>wan-ZA97S61Pimz`MTR z82FHF%aZUy$bPQM6QP=`dP#3w!tF4;$JpO^#2MgOra&2N?tQOl6I2a55YGX9T9auN z)S#{>t&MpbZs9ubnWW-WZq~d47x$3c7+CM?OCc(S$v<3Vi>0`lUBaVp?+dChX`kdt zg2~C+-&1EnZiw@~&k|JWbu-9SMbA`I-BxG~Y)f5QN!k{5M!9;JV$|x^jpun!M9EX) zkp^Lroe3s+*64^AlB#CYd)sB{P5Y~9GC?)Ef$1^VWN*awN@{dYy|vA;J5qbTn$_b* zuBu%tLTKVdYQeL`xPZyPy>R~@JI@TvOCh);G|3nr*Uw?n`#>eta`0l!MVdnxdzQaC z0w!8nW!1?qeov26k+As~Wd}uPim{Dbo-csOB)!_kN5L0HJJ!yv5 z<6Y?D(7!vD*thp;^OC`KuQw^I0caVkYT~{I*nqM8T(T6$1f6^>Q^TqTnHglyAFi38 z9}Hu)?$r%j*i_OtN$;(9Ui2&yYw7v`Z*6?#*X1r#|9uhWE_?KJu0kS2)SjR*}ur{)78kDj;nojLY2WT~MyVDTW(mKIe z+hmp{AuTFrMistRY~&YgnlEv2cyv034E9U}>|$RIkN51d&4yfHi>_a-iSBjQXfjdis4> zlRLDOl8&CiuvB|S3&AXTwZPtUR)956F7VV@r*U31BUuy8pyl+VX!kdtK9fVz6K2f6$=L@LUY-?_WPE%Wv>q z?6f^azM;l8b3^P1;yYWL=Lnr6c<-nT@RPdX&6t3=NRDPpIfXuYnjP&`!QBT$T$sv$ zST@BQt6#aC%C^uOEeCmH6sBgUO6FoVHRXS4hwn+IHbCUBkD=J;WLDm$YoIBT6s2DE zi``sjvM!vIA$=37*yEhuh^=Z~8{c5+X3&)3-1roTW`5~TN*pR8v3oTZ9C9yeKEB+{aZy_oiZ=|JiWk+6AG{qIQRugLK#Jm)hZ`?!~MI_#cU72P>w1){E zLp;hXsaE^21_gS)H(MY-KQV%)a$Cyf`Ef^xkLDh$0*J_6wz90ToX*OJvmipkFrJNA z%jvP`2#22wkTnnFzTAI1`{44AVDyk%Z-Vxe?u8rTchF5cS4H9JlgwB@Qls5IcCB@C zyI~|%YwXavJvT7%-m^R2s;j0oqwcUom(b|bQ$HwF0JTcNYrgHmEG)9_1H8+=D-E|@ z1Ag)@=ll*|9M)9!agSGTL><$lub{O`*WW^^$~RA>9&CD$-FMSX7LTT+8`(~bq`n@? z;bQB=dNNymQubpL8NL7@0xeK8^-hbS{kHw_og0yfT^wH)E9F8ibbsN5#zPYh*Lp5d zRJ~e8!xkoKV{_{8=N{R53UT7@L2-!%vgVc?yBAupBXaPWH5q>g-@1_0W)O+7@Ia5PYZ zfZKl%o#x8cqZVF5)IgN>x^ZpJ#+}{qE`{>)awO4m?~G>6T7+}sB0`fR`K;!!rx+3x zRZv2ES)AoMWPQV260(BEFSeiY+X)*x=vKzATDxN*x?n|!eMh3YFQV(Nbca_>zX zf0-Cul;O8@vfhlYK;4H-x8ap6XtSl^@UqCiwgT1Ubgn?B;7vMQx5==waj-t()c2w1 zP&YCmGG1_QXK+hvI%sOKMMDZG%@K{t!OQM{%O*+en7;w`hQw#t)8)I1;_fnc)Nb~G z3=39AB&Awk782$u2TA}@Tm2;u0&=jvXnx1(Dt;Zz8f72^Q!>!*?P~rM4$gA@K|Q51 zDN$ubJvwfqv`H&^H!uB}<#fh9P5Na#0#kb=lO_XsTB)rmc~A)wD1+1|xNRyZ5GelL z6N+?=CLN+S6Y{>Gq&&ZFUG?jjRr>?^{G&d|&Q7%;P`Wc1@kr$GC938`%a?P$r8my~ znVtAE>GF_`X8lM2h1k+JB0`sjUkS!LvfHi+6}GpobQeB{{cVKbPf3b||hmIA~MF`p%hlmM%gQjW-V z<7fA=qq&)RT`;&N8%^)aqddl$Dv;TNXNd#`kH)W!?mn(<2w>? zq2E|COfJHwZ_Yl1JSvapT76b&XRbY985{m!G*k3rRUD~^136tO(;QS#886~~>f=XB zzh27O%UHoGy@hTw>DnNU;R;n!aSOXoLTO}lfaQf3ZzeE89Tb)=mH6idYPzLVt7HS% zV@^7EPiCYh>^#q1CdQ7tqeFeObWXgc5W&ay@U{#z?kT5|Di7lH+T2p~KK*R4u;l6A zYTYNXJ_=9xei|tp<+Zz0n`@X{>^7!zn(Vx<%xvsu9_sSByYYAUrEOt|r%SS;idh;a zZ4_kiW1N=x02MXd*t*+EK7JPSLmQ6tUGvr4oBJR=`o>qNi$Wk`>qHEt)yB!hNT1^X zF~9egm`E?E=rbty0bLSkz+tcb^x|p?=B{_d9^M;j~^NzX%@W&a|Utt5og3Lw?O4hNpcQsp?Jb zWT24!LKY32gQt9psgGjMKzZ2JYP;zP(zzm4I=M)*L_Q(8V!r!tIn1Ct$Ceg4V+HrxG6lV-5=k$d46B8Qd8DX=BMx3PMnLML(l~HZWT{o##;6Ma z{#L8w%lnw)h<_Ly<=;J;YVchMCY2D-MiLW%5uIM(akit(=+dEFvsMcYs^*nky<_RM z?;6nCXi-wHK0)gP>C=ApSQ`^2;v7MKFjU?U$XujK`a;#*N6`9&P=?z$Z+atn*lo!GVG})dfrJ>hZ{r~dm-p_tc%+M2V!>Hn8qA_nGBb)uMNx7;aNOK2VX zkv_HNVn)LA(Y#IJ!v$ep<>{PPcR<*N66r*onZE)@O5QKWtCG>2;7N~Kucx3L-V)(l z&1dw&w**<9J~L7YVEakCEL${7E-@VL&UwFId_7+$Q2b>XJICa44f zeK`b~CL>o;ldB#%2*jUW*nP{r57iApCACn^s_Ax#?n>G6kG`&md3A5>5iiSElYY#K zkoyQR(8S`YqZ{|ag=@tZ;=ju(kzJvt$P3zv$FB-GztOZ)Xkq>2s9>O_!0SBqHl7q{=T6&{@ia+%fK@#@cB_sPN#g;JW9yZA>W`B z`oxDmZj~lEatG?7LG0dRMGXZq!}%(rwS=}tuj!3G$=kthn=5j9S5OgZQ$)bb%H*g708y3^Xl;8lC{%6cb9&WKa(<(jVcimH(YgFF~l{>Du? zdT+Ty*M=;?@lAN4^-E?+pjW%!aiiW(v!5l27|04++d1o)>oz{$x)N>5$6X%a`Gj>5 zl`#pX*~nU1Hla-3a=DA9cqRe#tzWAcg&rgG>Yidi6uGxfx%_!#5yuO~TdCCRN4i9rDs+E3b|deY}2G zD_Zl8A}SB!gG;v+L-^7*S9od>Mw&(@D*YNE0z;y<>rBY6dVJcwt3YY#?kS{)0UgoW zY%v?D-AsM9y`J513T$e^IJ*F zkpai@h<&*`YlD;IwyXdQmRhd3=Ddydl(KQ+)JTgmhliJ;fisrBM4kOOu>I7J`L{^; zkA)#slG0n){>W!V@tu(H-qz_y^~G-l>~Xb-Xp*g9>E8I>bar>+7m%@{jHnnr1(dx> z5Y{qMY9^gBSb1#P!!kj_Pu8P~IP38s9 zZm&G0CU9yx`})mT9wGY2$<@=4X@GHg3cAcRJ-96MvinM}Q<)a7(TT?Kf5b1pr)h7- zob=mWU7~XoA2p~_u`ZasE}mb#QbcsYLYFJQ9bnTIkKh+lRu42@b{oKEACxTQI%V%S z?f6$u*6)S_v|c&^#^%b`!GY)vtJBiM(|seS8Pd(qQbygIM^E!t1wJS1!R zXQ|lj7G0B3(1zwwhejcI)X2rn25eRp`2&+DjhjoqCKinf(4|t|kArtFg0D|)x%9cd zH{>ny^3|N_2xOt|64g%@K|<8Fx++^HxAspU(>(b_jur5!OPja*F4ZV%9@@6P_*7_B zU1X=rt1ni@Gd@#0z3*--9K_!*p*p`LPCgvbX-DY|>uh&f_lXsda>d*4EG1$6Dm&*H z0B)s&r!PIgtvvn@Zl!ca$HmY($V!-$@7s^C3OxaUTgliHtE_SzO2)Ry{?4te_{ptw zdZpWzW^GHf&j6E<&0cj=NwwEQnJHSwd?`mXg3A$m14-V;IWC?lf4v`{?ODGoGYFl! zAjQLf{u(#X0tay{H?N!s zML8RC(F80K#RP@1@i^Ct2iUPe-#7fx5H;w-WxIjT8Fm1_638p>8_##?Iy7jyfE4(g z+9RPqPQCr9a9uY%yPe(ocr>EOW>x3;7N*vB-lJl#e{@&Ov#CYWC`5V)X5EzTrJ5K4 z6oQTdQrE{*4wbwDtr+nVwdChW`$WBUZo`~1q4C4kJy{IG7Jw0y4mVe>h@7-P(mdfj zv7P8$mFl8$m=;r~w?S{raDBNM>8mZN_}0PDS8XHm)K=AEhk3>e!KQ;`l&_x)q3)Ac z@>IW#zF0Xr=xAUD6KXv@&cERw71BgN9Uwid=RzJzSa{{ zZ@;N8i`Xxgof}M>9`44EifD?kp4qD}X=c{#MTcRxr~XIRir=r^K}uH!xHWe1*mO= z|H4pWWNJ&kH+@5VXdIqb)RrN`E9rIU@YEfPpX}O?*nQ+t>Af9P5+m3|I_ zN!jc*5nxaBKC`i?41hFTm#=GAsif)!86w&cY!E6Dn(-4pX&+BKQIJqd>_IOYPC6tP zG~^Pn5}U)-YvI2H7E?K8@`p;F&EdV9xLw)r9ZYPJnhv5X7gGTVuD1JWQn^p%3@&jRnU_9L`5)(#t_G89cQfh<1`h8(Jb8aE`NBn}yw*F_oHa z>_7QI*ktI{CNdBXK2kQ}`xP*?mFH7!B8A}K$<00i28nMGdIS`Ij)jF3wS^+NE+?NG z$~akcpr&7}WvW+dND$&L5IZ=gAZK_~qLul^YotK?Rr?XR2m;5Yk0n}6nZG{t{to`5 zisOUQF^Z!Ho>#1^La#tEB;hQC52_z_etLA)Y+YF&RT%B zn((@)=B@V8ePch+tBqo(apd@ldMcIFckZ(27N0P~!M}se@_< zzX>U1ITBga>l(&_t%||-3`80l^ne_G15#>t{{&J_z^|VnHq-CAael*Pi{51yn>StsJ@A@n*A3f6L;rHelarkh>)B!ND4 zS(q+d_W`kzQZeG*jMwerU{vwB&03$W**$A%dpD9ceMReIU#)1#EVGvz2}my61)m;* z1y%99nq}X0v&BkVWeI8Ce@&^MW=Jw@66aWU7;@EbX=oX~jJlXYuf9*%VyIY!YcEZG z^Mm(`M_O|BuQ#*wc^wqamgV&hg!MPEIqj0$VOIy)N-A{W7NVf(dwGpau==#%FTTI2 zVU(Cs{mAvsCyI*TLUWVJZ58cTUm1K<9JBrR{bfH}4N<*M4_2UA{GCS*N9Zc zzlcbprcMZ+dKRM;vW6be%QrlwZf^V;c41Y##1~PN)_K<~jH&ry=VF}}+Z70C>`d}r zlkKvC?QsGg9rA#`sV3i!4JMj*K^RQh+lYug$k4CG)Qg!@E$8eA-Avp zPmbfM@vKOn7}M*&=3lhRg-u|jDYN1g)@8FLx`EIbpsQD$sT1+Ty36P>On|C_W$m|x`O4h0qeZ1JU1dscKBSCSOiMA|IK&ZI|42dI*8l8?K_MNH zGC@1F1<2gY60-n5p5 zy^I9p1KJm$Axt~cNpdYGI4F%Ge9;4`S_Z=A{Cum>Y<=ay@Stx zJl(ZMKX>HnQiL-ub-cD~vEczII-_Vwp%1ilsgnWY>Lf+U&?a&~IUu?T862Ydv)Ubo zOT&uIC}GP2qlOQ563qf*1LwG7PnMG}!((EmL&Er*I>3kDg0nsJ#%zK)H46bSm(+|! z-kjr?_W?px49^11ws-NtB&QreCqEpS;r$D5)g!|z5B(REzM#WC?daS%TO$yi+-3~X zcWHdkLuzKPST*Qn-EO`mIJ~_9a`4)TcLQRNoPbH}RM(yn6|+R=Wc>lWT=k-SFQ9T5 zCK%XG??l6@&GwB#iDaZr5Qik;u<(?ZA?6R|jvFLi?&F~*0aV4r8`YV-B`>Qy8g2Jl zn6J0Xp19GoXrgm77GNr7Y1v%cwL`VNq#?k42{*Dbd8OG{F8vs-`AJpew)m5(s5%O* z%q-bZ1E`9<4(%a(YvJ-o_w)o1((R3>V*{3lXv1o~W2GHVx!A2?>oAL%5x$dQ+QN-3 zI$U_MK8Dbtf$@@FxBt`Lb;mWCHEUfF6%Y^vq)AagK|m=YL5d=xR7HqXsnVO2gkA+K zs1zZFA{Kft0jU905D2{m2n3K4T7uF-3%M`5vb*l$_wD|7fA^Zd^7c7%+RU71o^w6g zwqGes+|334EPmp#dcM#LXKNRMw>mw?XP%?CHmk(JNPWm<%Po)Q(D!Z)Owa{j;&b++36z9Qr6x;9IrjC)7ZgjR8o`=dIZak zu2C~L22NSu>Tg_xE8uXgoW}bbIT3p0OT?3+S}5pjwE4sRR^VL2=&2PH>=T`yZn^gL zikB5jP_0XgU6VKAT+E^c80}1Ltc>;u;+bqB51V5gaqUy*bSTjDg=L3}GVZ4wC{4a{ z&YOb-kYt0s(ntc}T$N3I61s=TX4c8W;eUQqI>XM+)I2%%$OFfMqAAiW|g|N(MD# z6lrW%HRest9MA+=F~9c~8%6TDUV3J;{8I9K)pT{uw}LfXL;c*a6~>Z-?<`wD#541V zThr=X*A8}<%&$td&t1V8LEu&g7nA(9Bs<*QF4@~>lZGHF-2!D|)VrmKwq_|{OPdyf z&6p)e?rjZ~$&73!TY`o&W!cxdz z9%@~0YNsz882_?RBtrNx zb;+726bnR=%8-oba;e>zDLoQ5R5$mP&aVhr>~o7z1p>Ej(K+>!De777(_f;!@)E&K z+P&rP+#TU0vm-W`cE)alYLa#ovAsX`HiZ^1kT!g+sx?v87~CrHp{*GpqEE_^NS6GP zVRg4p=)}14BHt@=d$634z}Lwp{wFEGB1=i(N4pbO`$c^cdX`a1Xk-5_0O}F4pcBSD zGdzE!0+q*n=J~dR=Zf>SLDCzZF|U6Db0iM3G<_%#{bq0;JP`;M9?P<^DbA60#bJuj zt^1%|rU_1S-Pl&Pm6=l=dv3fc0SqRs0$bkBapJ(s#lj8TbCtS7o6f)^=2agzD<-fQxBcTj&6*Xe}Z0* z7l1ydm7YRezR8+$WiTRGJ{NSlI#us*v*juG}nk z|Ejn0@*K|5=KN~sTWC0srAzmGLa@cij7;8vLYHi8zOFiYKLKL>Tw2{#PyN#!<}Ybh zBf)KDSMX=PjkWz*&0mRArG{sa6465{cbaQs;xFSkX$?E@8+wY<&K)2vnPG3f;dlE zz4hWhH8D)U`-MS!9iU4`4<9Rw2iMME-#$xB`G5ns0|#fPmfl&WS8wfm851oaOXlwJ z^g_xKy!+V8y$Jn#u>m@hYN_F0gJs<%^@`UuUBeG3h0(Z4;k!N3^8~KFRpiFHZ?s_R zZlAZYPGj*QT5lKi!!kvJF@4pMF=5v5Y!2l`5_|p^X(hlo>-0lgkF#ud+j4uAp>swQDObwqF52 zgbqnrB3(E44u0zL1WY&we>eSj=1ph)tXOo@5EN@WY&&c{mYS1%3ntUzxg4F9=O92Q zw{YLL6yaAj07%z(_sTtwzGdiG;Z%XR2G@DQWYd+Dn9dyQwXzJ}dSqAMXF{N!}g|@b- zKZ@;_uOpKc(HJBVvE=7l{qds_@k8Q5sT6F}^Wtcs{JWP7hr^^>GWb(*Vr@F^sxZ5Q za~aUFjZJfPraV`N9Ci;v)^S`Jk*?`@kyDz@gIT=vOKtJ2HmqVETVrvj;pTUn zIFdYioV!aqoEq4jo<_!Gfl&j+vvUMQ^W+%mc(FOJyp+d-(l+_%tLo|~YdP)O48qL_N=z_pnHwKvwfv+4TuC045_VbQWV0`%l%H*aP zVe_OfE1wbd*`XC4)a#aMx?D(qixsCh3RJL^AEsp2{9#xp0Q`(b*w9z zzGf|Nb=LcZUZlpcwB`5 z?D1&Ub1vbm4Bp`q5=k3NwR?dzwGZk8gh~=~8L1?`5|d)V3z%yF$SJax?A=L;=}uLO zXUETXDot+X7*}_&KkaNyHTEM3*V2Ov_Lm)#SzWKOb_@Af4Zxf?4 za(|{F_!&O(NHW^NQ@bg>=)T3RjryVe)|uTe#fiv>rR>Cpk3a zCRAI$p43p^rSs&fx)mkAbN;WVG!J)aYM0))w80JF@9-5~Up+NVX{?MNR;`rcXuDWe z-rx`980G}Z&I3{1Mykad885v7kkE4gO;HrjB{Rt$<>_T2f7&=VyAt$S9Rrz>wfBI~U;J8ZlZMJ@%LI}RS>lUc=l82V#Y8-(^-kBRmf%jwxeCuN^l=SOgpgnJ z6cs#Ueon}nE2_Ih~wmPkhBF-I!yk2-L+3v#A_X!@VT=wt;Mr`>)4}A%>>;8fkzJ|W7@$TZgkGSIjg+I}TPHECCVwSKIdxpGI+#{uZ@s$AlH_U$wcVfZRR zx5LzHg)n4?w6D;miWfbU*o!o>v+6`b2yVes&nl*ko30xTQ@7DEknY9Ne)WJ7?@W4Z zjF(v@MFBP=hRdqVFH&->3%=qo(G-)=|Hr7n*f2*GEC97-Pe2wA&gUagAhb* z2P#ArB&a!2vWMo-gLZFy53o|kb0Uc z_mUv=Krp2Pr7Wq`y63F|{-GZo+(hFpt6k`xZVeXS!e*N?*NG?%fDUlWm+SdpnJ<~g z5CA;F#TQSoZhm%Vx9!xRCv}WX7rf+XM?-3?r7?gIGi zjzt&!$Fp&b5iFF~hqp8_+&5iJ{pTTQ;}eY7<9tAh3gVL3VM*!NqOv$Sx~1nB$Eps! zA><^mw#Q#7uEMVlxAoy4Xk||;jLm&jix60sKPjB&L?}u`-UMg_FH;VQd@40$ zBXv){A%f@O0TGp$$}5w8a_Vjm8ln7Zg`pbCaKh9~78~kB>ibyA*54?jGER(KRDgk$ zaew9lybr4>^YNp#j6XBUQ+uPtmBcj{hps2adV0p1D{gpd~Cb6QVN`qg103c zY=&h*#OBx+mF;fT+M;3)SiJY<>hpW$X?%uW0Fg3#aZ8tL8zWx1vTlu0#u12JTL?fe zXMJx-sXpbX4Y6^QBBhqK>`Nbjrja5vLi~KEio#e&UnNbWE0OM281#Bx#yWuz-0514 zk8O1^PlG_#VsprSyxar0G&-;?W)nTUvK*!Q2y>gr1q3)|u*#*HQs+L<+1@~9(55Kz z*Y{{#U+Q!#qs$irxB)9B8e%VD2?jUh^xd@iMK9R?$_=Ol-vb6vG|5jgbeYnp+XKp5 zFEN5UAxb^>s}+}9=pSlWs|sD#c?2-(TKfl1GCgfN$;c&o(#a3f7YbVf4Vq^4!f+9O zMsJd*-^$=8w}w(v)RYS7UYt{MZJ}!Zo=&=VV()Agkw%UXAiqo$t?)O7e=)+T=edGI=wFqh>;vr2%%by zz2GKl&i2jj>wLCNAn33`%T9x)x;}87-d-R?kn_RQ*eC2{22Pb5GAyl@FDCIAaxqWh ztu&46r^PS65=R)htb^=FfGy`7Zd^~Ypw{Uk0shnVl@}2{B8;n|ItyA(50_nKL;ao) zS6SuRiz}MG1gwi*TLUFgK{L=HpM7du8|Z~;gLjTaa{6$cta9el4CIIa^7?D9q^RKo zoHMs%-XfSp{R-Y0`ncdy>A0rmMa4lnmvw zcOQ68fZ=zIW;_dE&g(N-Cn55_MlsZ-0LzM(IInFi_r}r3oImWfCWU{CDY8n!3v~*T z_?nT$#^=i9Kx9(s@a&fd14$_)leNVOS5cL-q`tAX7b@%iF9erUEas-rzZ|~}lc787 zw>e62FH}V>UtE05a6@Mw{;{X!Db?ux0|lbs61=oSuoB;6%MzW$&y;u-#w#F;v8&=I z$G1LM%{d3$eSA04kpCdFy^Le#9S01%UG5@c92Ij@L=v68H+wv8V6&{}R%4dF&9E~p zRktMWRXljBbMd-}0&K8=!5|lxKa{XhJvmqer!v#;$&NULNJ-gsHPlAUhm5?Z$-5bn=#?TLLEc$`YP?PK?NwUXBPOAf-WM+$G%^(IK&XCq zp#N~Czx@NKXZfnn#E86uyxZ^qFas`{?=ZeAX>|3F3fv`wMkL@mi}}uY%YCCIkMIJB z$h6wzT8`@}8km22LX2(be$8yxn=T^j?FQRii`HXHIAj8B(DDNEW_8UjC0Zk+_ z-Coz%6LLzFUQDu(4ZD|i$N^wFXUb*%Z{O5XRtR(E0MJ1+>|0lB7)w{*yb<&27ShVH zTn<3NA8y-L5uoi%F_80@bO6E0@2=goc2gX__wJ(dgbI$zQ0`B`h`;Ib*C>VaC`E71 z@TtXW{Zq42_EErgCS}PsWl@g_uxmT1Xs+u>Q!qc6ay$HCX+LrrXO~M^(w*=x zcwHV+TdcMrKC&p+1KwTQ#K(unq*)o+Sy`Uf=kgl#Hb)KJFD|rbeO})h-t`Tl@Rzdh za>$K8l>E3oHlDOJEgnVdVoOk!bLwIhvoJaJaWNJ3bhiQJTlDz5=E*08qf;pBJCLelSlP4ZsOPUBnt~9;x4O%W~K>>3! ztyzf+B0sS90f2eo-4;P0Rvopu_U5E&tTws)qR|W2$X_kR!2PQRr}C*?cO(m36ruP1 z5;50Two%Cyw(k$q`7i%GD3(V1qc_Yg=C}4~&As7`5)~Ac_|5iAexy*ZEiHIJX{Xb6 zmhB15aoeJ?Zt5kyp!9$cRkk{B?Kx zHsUG;A`iS_Z}Zz_L+ibl4OsLO#=h}&D3r5Yp!YpH#J*=YLwNgKGSl95`>v+Mk&8e_ z3tZv@R@QxooPKxGIsI1)C&fo!_m+Y42|5hi-c7f67 z&P}hcmwEia*ya{K)NU0YOQ6IBZA-%i$Ulv{0Z11%W@+yE6UoSTbzq|#Acv9galIh9ZR!L8ds!=e zX_@HUnd=>>EE=Qq9vNw$ba=^O6|(L0e)srqhsh`Q;48FO7EcyZMy&=pvkDZ$X zjx?~uz($y>5AB@!%Zn5QsjN*@H*CMPpXAUzk)z!=a4&Xl4>;1^8ek~x+7vhy?6TT$ z6Y%_ksdtx!JD|q%D4_VP@y0||w`*4f?Gu%)Ay2kH7?G_IN>)>a2!sEdoBZ8acktn! z4<|zJM<(u8^dFt81sK(-S|1kwwaWj)mjffV_kB2YLgpX4uRsqEV&q0JB{16ki5X{? z3i@73o+H3B3|ArBP5t{TKR%?`=GDI-(7OxD_lHHiybX{!89qnxojU)627vnxY6P@{ zoi(z5)YNv9_dc-aDEQj3{zLz~INbEx1pXrly1OLI{!l=mA-v9sI9tg0gWk9^;Qm=5 z+!ug8Su0(@{BLAq0G{D7wGjAmb^J{Y3eG^VEy&eO_}|EO5_snF`-UAv+-~y!^<3Zx zFwE`8eboOqvR&JbK>X}LKReLR4z%ZI2Lk4&pEJ6`UfN` Sy-fE2zw1gGS8^|#1pN;x{X(Pw literal 118595 zcmeEuby!>5wl5WmTY*9g6iS8SQd|OsQd%fdLU1WioZ!Kwv`7u904?qm2~Kcm3DV;3 z7A#0`4-npB?|tq)Z{M@e&VTQI-#g*Um&IChOdU4I_|5f3LrsZ-^cpDv0RhG1M-Ma! z2uPp=1Q%F{F9CO!1DYcU2*_1!6cjWbD=4sOxHwwc*jo?~JbDwQL!=A-btTb2^TtKu z2Xe}bs?;AY%PAA{?u4^(-5{Y>eou10DV(SJr5yuJ-XfP`&j5X7Q%IHQm8MAsGOpID z3O@IFRpR8fx~8jkh zOKyQ=-LqtKnrd!t;x8;JPJF!lDA-!}ieG82B%Pd=S(7NboFjN7+_)rP$woDkMDX2! zP*V>?@PKo!!)jh7%9FQIQfQH_QA9aDy8*5opWnbh1f4Ojq?SGZBCiwOCUmZQ@s)J0 zTqFr>Q9ytC7R}q+)JOL*pJK!mh&S0^Lz5}uKjrsZWd&q>Iuz^Jp-~0Nx?apRyUH_1 zP-Ga}mb4v^IU5jDW7xF8JXn}x^-JC?N)TBi)B2SrvvHZaJ}O=5;r%=cg17I2U+pQk zw`&I7`i6PR6c|tDdg%+b`bTv0X2^l=4OupFGlkdpZdHCjDTpdwongzMXlK>G(TQ$S z$RlzNdvu*q?78a`(VOm`lXh2y_^e(Bw8l_illxEeemN~U3&pH#%^{1- zTZ$WNe%|oql;s9Jh~mb4cp*FsO8KXShg2i8xYY4yw;eAz*VM2%c-r3w8OC$@)jWu0WhvOAEoff|eVBXvV?WU8 zJK?z(gmi_OudcE&y_WKh^F}4)a1d_mDnbMJ33 zXj`1tqeDmd$%%we3h&K4A71er{>b=xwTh5DAdL>QSQCYW|@%L12c8c zCyTeF*$i*H(Kx6vF#LMxb@g0TvVXURe{X#!l>?!Ok#oQ}Q;vc~{2L|$qH)4bxTh!#=93yeX50 zM*Bzk-LOYKG%%YoB`WM2cE<1wz7;ul#huQsd9(ZKyql zBey+$JbN;`WhpI(-$Yo-Jj>9<5#^y9?E0$*SgYgzB@CwjrrEOkEg}(l zc=zUAruk%3YiUXPjt5q$!PbIR%y7Bfo(b!l-pn!)#){S5XlvO^0wV9+$V$iu8%}v~-nphhBr?Ya>CJCzR}2 zk+`890wf-ramr8_tZ?iE8oi8O4>@POg4W$BW^1&N3kr^8$6pm(%;li zYI|XqZkKX5DmFIuYiy|g`&eD*2mRntP}x1({ej7ByWFvC*8%VV{c_uYM>Z?CJ{$M; zVVYjgu{CF@@2HDD@9M?X>#Oif3dpCgvTpS2etVkH^UeA3EMbCtdAjRj-(v8N3-%nA z(7WJ{VxRJ-++Rb6$$A-HkG88U>#r!-z104!oj522mxPz-tCu|<)gBETm0vYmT^;2p zWfc+#k$BZcEf6i>E}$k@1$!+yC@Gy_pCFVVBgrD^S2bG2SM{c<1eWVYwc;))m`VSs zrQIU`*_xHHc^#{{aLB!f!j?;4LIh))YkHV+(ODe5+yi5|9+34~kczB^tWrRf|0kT$ zh4Js5Y|YQ2e^|Z(U#c~SHG7BAzvpGC4#4m#^mlg(3_9hb+>!1`|C{D%&u(V-TuP&T zSlj%>Tz1xewyas{z0VWIJD@vepUUnisU{Y==`m~b<-UY{9I&#rzGjvqFkv}riv7_( z%JU=dr+vYQk!y~`m^9KC?iJ^i6#Paps7d;r_dA1VIu(RP^t^XlU$kRh9{gioU72mM zw=LYNqlB+Czr4;|p=7h{s|^_H+7xZwhUh4oc<$3fS>{^SR-9X0{VZa%dgR@z*oa5? z&G*}k99MN@)~a4rU1&-9o-&E5yV)l=Ui7o**JhLFyG_nnoiJG$T*;?gaDE?U));Lm zN08dx*lr<|x|Nhwplj52)SJ>b_h}i_>=O@qnD!*@ewi8xtP2J$n2cO!s<55&ou%3CbdK4~u3rd*b#4 z(mp#(QnYQR-Xb`Y*)q^n8@?Z5LK7hMPz%kCv7~8x9I;T@;ykWS=VaSc4@p`BIF7dgiRbHoO>{3GIof3{Vv0Uj~opySi zwc9{IrF<4p+(q-QhcYJ#SZ&6`rYOmsW!-qCZ@ z;slomAjo8V!38nwDk)Qw*xMsQ5Fv!n(du@mq=11P;<@_~bG3vDTAGub>)4bJq$5xc zO)z&Z;4!l<8LehmWx9mcG+n9`$|~L}j%d5s*6AmUI(oZK6m7+` zu8TsLZ7a_x|7x|%_0<{38`L+dz@lPbi-g(f*{KZS${es&CG&jq27}-s?m-VokdClp z;c%e~vZXbzH5Y<|_=sI|Fs$0_xP!`6i8~P$vlkrIM9iOPZw@kzy(|~eHh{!9ayal0 z<2;pS!uwzQra^WLNXAkqq~ZPj?qW z`CT1HK!xf>>mw01vc_Yqi27B6BRQmcv@BHmr?~FuYvE2Cj9shkvaOoKnlzpFH+WO- z{B&2i?7FQ86fT+P(G!wsQlWb|ga%hU&GGFa^)qrH=79enK=V78UMm%ZILn3$aSt}9b|#h=d) zmr_3G0iP19EA-mzWAzUx-B(>(@#plB*gzNSU<=$&=C^bV0^Ck(hr9}8YdHOKPZ0|& zM-xl?kJpoYzwCb4DVq7Tnibt;nzT+nM?wDRPzX1zO>m(#P4yB%z}op2(c}ad5}C5W zT4>~tm)|-|UlAX3B+%pw|G2)u0z4zQ4_0{m82AO7yI5E_xLP~9RT+y9 z12;&V9_hIf5L~%^_C5Dl^VS9d!TAvzEnPQV)hCkXj!-_+=Z&G@@(J(>u!Bh1*x009 zo?A+4K6v;CIq;thyS1B}lO#XChldBB$2~qr7b|{22?+^)0U>@NAzq*audA1Xo2e(S zgX_)TEBQw~4=h~GU2L4(Y#bff&gwNabA-9cu(O{v^k1Lf`)T26^WQBwxc)ILV1WE* zPxuA-1o;0InVXH}Uyz+W`JL>yasA$$^jT$+8aAF5_PP&jpukiET>}Y82n$I6*3SQU z^xr-GofP6~;iBLO1t{G>|Gij$5dZVTKNJ4errv+IDJUT*^v`Yn)1!YPJsX6iriH7c zJ?v}}Ar3ZfAb{*&-TpI`-hY#U1cinFAo}OKf2Pp=mlXee_sLhLmghOl1W~-378W3F~!^3y*E8US_tjyOJ-O)sWc+`AW*yt`>=|J$Xnj)UHr|@>+S@Xpz z4LR#vvZ92ycoN7PB>w$u{N7Eslo#FF3}#aFcoGC5q%Zv4JpVBPi}L4E;CzklTz|VT zzY`Ecy)OOD3jSkiyMxcm8yLM_)xxtY)T3ME_%aC@VGyEa`F9lmVeCJN-G3PSPh$7K zh_U68E__YSu9OfK77h++&g|~*kFV92S9x?wM!yt5pOTX!d9rpNBVNg+`#wnST2 zYojFis0QZ6^Ypw$ERV!`#>X!&FEbVEn451Kn|LRIqEbv?Qy7Te)lWv(@YJGJ8q+UG zpc(cf2$o$_A76{8(mmR2_JuO+egWl$*<5zG^`B<=PaODP`eX5Y;05;5s2n@!upyKF zj8CP3Vje=IA~WFInvYx;ou0#$S^Shu_v7<2pi)RRJin|;o8#PE2n#j0!vHxZ#$Zy#}ogNl|1Ux*u-=_K@c;ipkO(@1uHc59Q`Lno_b zfMs+)ME8iPeG-2jIjtRol)8b>6bFjEma|Z=>C!UIl{#`HX_lfY)NR)F^7UzuwnqLuV|sj2r9j!rKRPzd>cAhBf?`) zBqY_692+ZOu@&TwwzIb<=jYM=GG%OJ#6l_MX6r9g4oCoVV!&pGy@=6%kJ9z%u`=~_ zmFRq813SAC^9V^Z?{9fLGU%c4appvylwJKxl#JArUnOml@>6oDawZTmJjTU5Qma2{ zkjO7RX;s+E@ez0oAen(|XNhwk!K;l}ejEs&`s2S?W>rtI$Ez-)gMELOKn`;C;3kX zSVR0za^B^edT>(|Y3i-TDupv%soOY=Sk3o|7%6|gv~>(ia+}#i&3G7go9A}~<0ae& z=QCndmm7Ul``FhOZ}hPvYCD8g&8q4;?LTpZby3yxYI}_qrSa7#8t7J3lx=|>WNP_M z4sB7kh#LFDoMXf{*!R0mx}{huDM40thJjVRNS%d zPE9#`rg@4iL5M5-dXsC#(FLBj>!Hj2Zw@WU@KX#s{GARlt5YGNd7-+6rG>)d%6g=BRPlZRke zS8IFwNp#zz`*6ql>x0VcC6*n;C6=AT=uJsU0V9*D&YafHwhGlZ=W@sUL)xMXc&gqH z6u{qrg%Q^}#8HbIi{@}hQ#2p<+7Q5~gYc&n=mbA~MiCcJrO@YNh(QN3_4cm} znuNtV#(unU`9ix%*E-bVWVq=rjf_%$e6rB)cZVk|liQ5GnC?5%l>#r!a1W|oEa9_J zz?ivv`Q-30<60H^2Ow~tVR0a+t++k5e}ct~6`u(WWDj(pf{F;2hM2s~&uNTm_^vHE z_ldQ>7!wE|&q!a%TOO)RfltY9=(<-KLg3?-WZbr@Uxh(D`lZ5odexwiiE9d^#uQAV z!YftSva(8rhA)CdEu0MIt;@Rz=-A#y--;t8e@i#SG`FCDDnc6jd{1(F=Myp*odl_< zwmw8i1+ZTCk`ag=+tin~@}4-IHb=E`Pcl$`?cMzRewQK)#WZ9Xv)jR9P@cv|_O&Cx z{r*9>1w-gfN~v4r+^4wq68;dAaVHh`g2OOp)4t4(k=pU?Bc+Dh>veaTeRfd6)g|*f zIt3(Cr#%#UQw<4mVvZ!78_{b=JB;I1i@a70Ym@UXIiBtl>W<`O#`^KQOGEW0;&5jfc(J_X<;5C0O(m<9X9fzhb-@TpQhPu45QJpz>Iy8{TZWe7eVYe7EGlDpd3k$< zjDf$6Up-MA^yG_xXnmb0pft9&=ySK)vPmKNB4Xu11%4|;hu^g=@)+IwKlCB9v)bQB z<-4o3eUUf!m^#u}D|BD4{65&7qEI}`am7$6=c4=Se!z9oSLVSN(v!7FJu+NbgRmpd<2kh0`~`#T)WK4PJE2-pJYk>oN%J#6{B@;wJ#_aHxx9={ z!q(49oX#?QfqDSwY?MIw}S|Q-C3dqZNE9C4;4( z*$j4TCy#MMGnQ8N5HQ#?ZlkF>L-gdhPRI9irq6sc-s)z<--FL(I)QBg>+o|DY|W{v z^yQ_2Ym&F<7(#q4&Z|LiWUKgP_uvh%hjxwk#s`iqRE98ox<%H-hEe$29jQAff~S=X z$cO-UFv5S|k1BLTusteM74xlj{`ekJFDvQeR8)?h-_dANkd_E{aDhYJ?%GC=u5)f$ zbc1mc_J9Z(`2&7GORH$vXUHfCrn;Yy3688U zF@%U($H4^SWtIDd{hIVe^(XJT=5yZ}o#q;ptS&{+AVV$oY0R*vTj9NU;OxlB1a zrQOTH!l1+c*+6T4cc^SK0?({>4uSZy^VvmhS_FX`Mi3)*A|sm+G5u8N=3YSJCzMQaBG2v`%d%o z>)fRF87wW#Fwc1Ht>HX%Qel~`1Mnd(m`sUT6n?ibYA@`n443c5$$Gno0b`cKIAazc z=9}NfNkAl(ea1V~|H|*$qe=2QF^0ZRuPi99WKZ~<-h`8}99QyGT?zRPayh(h zdR&n}-zq8Icn7aJsis>jX_GN3O}kzC**6mr2zQ&NRqv!w_g!|q9npiBeRIz$NHY^M z9=Bre6RtUwrS_FESCzNDDl1vTHv6M?KFj6(EccCXAM`fv66OK=pZeOhYsGSXqcEo8 zlWeo0 zy5p_OP1s5Kb|sisl|$V0xYLHk^(b82S6_DryA#1AYTpW_<3F^!qZ}p;8mT8dvsIhju2`Pk8E= zE(m&xuI`drABJ7Q%c;Z!%aw;BlsoJ@-k|avO;zXvbGaKa zWzmg;0U-z9pN9#97Oi0X6M)Q_Adw&lpEMyZF2A1Xoe5d?U zMekvBqpe{jfsTHXBn(|=6#PN6-l&WP24h)M9w>Gn!0xZdObv8*e=+IgbVM6Sx+)?sMheDWP$CDtTp)Xk(ZRoAe_dv%6MwshZ4WsT3NjU;$2Zi>n zNVj~t=2lfNaof2Kd(y^nktYd4H^u?;IkNoGf_ru+NQzreH9`8u5HC6Rmunk^OJJl$ z%<+Bysr)PM^o7dzi+{Ybla#hU2}v-`1iYHX!mdes=F8l!8LiK<;SpfEwVYO+(HOhR zZA!qlmvc&q*7sVPo-`-4WM<#w<{q-OY8l z7Yo5lgfmD=)w4gl8;*EGAgdF%(_d(tHo@tpv1&wpccNF%o3L6t7Py*p$=(hra#;o3 zsJScVyLpcf=Swxj31_yV3W6*IE28YoXFms4in=szjGO6J`9iK7D+i__3bYh+v$HvU zAP`vmeB9~yyTc+<21HAaF1L1F>{My)3rL*;2^nX4v|U&2hNeT&#F1+k|4&CIDN8Mc zp&MqKKR7y}gm2*}GuSF=%nOsBU#UI?LYV`(D^PdTOS`G+HLUmo-z8qjSM+!db(L_B zPjCQta57oUZ~ASG*kQE|wnnCA%4qjP<=wUdv!(!x+31(dlicj9Usemoo-z#P871*X zTy=FKXI#xAjplO7fM#d-mrpu7A`B0d%+1XYu;l^NxJ{F~#9F{X%yjbbKMb#CB@PA{ z$30!p6-<`-7E<|Er}E@z%fIza3z{l!d+wg;uASZXN@Z}Rx@=7Sdgkr_H5AC$B=~PM0Gy`7xM5 zK*lzHn#1?CJoC#<+>EO^52Kq}^(qUs^BqZ9SwJU|3!IK5&{s_ECzj7=2|bCbUaLOs!3?{#W5AY{ZNUNQORQ*_K5yu3b9nfVTm?X7 zy+vBhlno3zv<21+bUqbPM?KfrwMh3cA}2n&!1yzj#4!?u{Du)gZX4#?T)oso3qV9H>r}M zRSooLveXSrJ@rHvS|Pb5-Qz)<<|VKIe0G)8cOl8MUK`3XRpckwy@`D`t(=M|{aALv z{X}_#63b}WiZa=uuSSM%fbo%Yn~UGospMiAEC{Fx17sD-tBSI}#N-UX~!a-Yw zl>4h~&BDAWAdUYjGRNX}#Mt_=Uq$V!z~%^6+DUKRS4AH_=~GOh`)bHW!^_~2y%zIf zp4w3a-JPT9jP-UR#ONBoq3nL%h#)aSXpSp+VrQ&cKK8Bi=#5Wg)p~dE(x?W3trKgj zFB2ewcl)!t>P#M@wB97WzmeZbY@e~BGBiTZOYaj)t?(!q+M2!@oO?K*4b6P=MCy)u zY~++lg;R5!8mW%&qKxUz;?v-`?KT_RAF^0X)D1{Am%U$(z5~=sIPBXoiyq zB7V;ZJLwU$U$fGX>Q}&!&ow&ep5Zk5t6{$1Q6nC=xt&zS9xr;-=sRD~FbjT-fjY{F z`7Y3&a;MKXL}$J}KHJrJG?H3W+T41#uhVQbKfHksIQ}J&8TMGQsk2Mc~1rGfe#a>oj`GnZ(jZWc!I_s^IzF*5SgMVLXFKgb)42$l|v@T$&#$$U9p z=sBd_Y!v`10^*lKM~) zURyb0I?|oj-P%>jfr8AC9%PPQ#>(TN4E*Ala><70W$u(hXwWy94g2a1_aV{Fy}Riv zy?8lk)NC4jXMq!CF|CPm^@y)`iUR8EMs`1wjf&&fbLvOuWw=VC_`U%vsbMt1!Rv0I zf@bYU=J>;yLTG9K6e#@Hb!un_US}9p_7JPElv`xVb$}_Y^ks2L1$e}dN#GT#rd~Wb zi&gJ7jy=&S%W(JkR^W&!Zd0L0XgI+Kdho9s{zI_&UG50^mXpWB+#rNcU-y{0UzXAV1%#7Im(N z8ozl3%oLDb*5W+DS41uWd0ip4YcKH#1fQvl3?S8_kRzyu5q47jjoG1|eEsSQF#rE?y-5%mwr&=d(Y)Q~3%=r(dO}xR0l<)C7{v z%2B=e#MIAfw4kOQ<+_l11K*X(0eX|IiN&99$SX3mKh}HMjS&Es*ppM_DzUuI8p7hHQCClhpH=cMmy4i)${cj3p>j_T!!{b@v-S>1p2)iCAGF4t-XL>Y z&308#P^j3 z9!rnNLI*pIv3OX;T^i^QatxTwMeX#d@nX!r{!gC#7k2`Uxin~yio7yQlbVEiUA}AT z+bNl~l?YbDqcEqzuUV^Gky^XUTM@pJ(#MOl)tJ7X@W-?qL3Ra)`d|DPZ>+j!wVK>h zm&md{inB~&ro1j9L>5ZFI^5C9fZOOpQOWNAn%F6P_b(d$p8^m#$<{q9Z*Y2WT6a0W za*ycfd0dY61nj7w*oJnDGP2kvU@yjmwEkeeU~G-cMh3E7HJ_Oj0;JheaV)`zx00Bq zR#ma%iga63AHno|{A6ZFAn>|~%#5no)S&4zySdjW6ga6yh*=V9%P8%sp}X6Q@>j*f2BvL4^^-RwI3X6>WzwNoU)atWap50gKbwulMRQqASmKGd&yZX?>f z&Chf9+H6J)L&*B+Miy$8wYJ9Ehm-rBx;S6@_71B6o7%p(nDowuIm`9E0+U1iinXJu zWv8StJiAR9cpYN1qM&0)zZS58Vjn55-F>++5OC7cT^~@Nx@t3zuCEY09$~2OcQ|Tb zNFw*k$$5(iSgo(4#jQ@A=30;WOq~#+rf~D?3W|z~J$sp%3mZS$WP2R0HPO{!2Xg^P)xJ4^@(ywJuvF1&y#%(;|Lpy4Lt%)uMFc@t0 zyg_!uVEu7DKa6o$dC2dV&(v2)p{)-Uf8BxRnCcC}j8O!Y-}FcKKzM%^0HV6ogu9Ur zWRrcivb{{(qT#`D?$y3Xe*bR1!YE4drN*nM`hvRk}Fb5Cv8T2{L;%nx?D@zXxClcQKau zO5z<2{qxym4&FfgX+$eHI7<>&VNR+eWq4iI-@bY^SEs=YiBa5B)gR&bA2yRWr`NJw~ovHHr1Qa_I41C-!`Ya`l9y} zYaq2qa-&w+<}7<&0N10{6ko{}y`SgiJ356(@a=7P+U6~1fKKWgFy&)0Nzc)KLsC;$ zI;GI>o!SMJfn(cMZzzX#o#`+RW|DAuP|e5rqD%~4St(%%B+G+E?1s=(XQ+mESNPkE$ryMkVgjZo zShO#;p+De;r*z9zsOGp5ozcA%D#OblTn~4{=U=q0 zMtcXw;CoIHewv{uWN1{sqelXu8#aBP+5L?Cf%;4vK{bY0CyoH&v;ZK@8TNtMIQ$13 zNtsYpZR*`r2U`&fVPN2CU9&g}XOTCkodLsW|6UmdPI73Bd~&b>fEcKP(|y^HdtH7$ z2dD`DI`u&K#6(w-^D5GAodL?KR_C2ZBHc+C{-AggfRN8Ef@271BIH zw$kAJQm7gkkjB1pM>UqZIf9AyVFXCr_c%v(bX71|swIqxscv_-AV|m9C;_rn1z2C@ zSeMOH+_sK_LZ0F7*IbakxM4Ye7s$&}eEIc~>CedfBitVM`?6Gj@rKlXb#eaHOOM)= z*lqw&9SsY-Wu_a+u>y7rf~a)8meANhI9PG=2!N-=>YjtM<2*K54XJZ-a<tu7M2910v zF0yc6Av6fA9!qoG_qm!UXMVv{A?N$+BJ4FwpY>1`<`F+(RP{BRh_kTnF&1D-rb|@$ zBGdULKuV1LQVygtmi>gQVlAd}{VtITTQvZdW>(Zg%g+&yv@`;6kU zU*#&?{lE>P?i7c*e-WIm5bzzouXx99FppQCA7%mIt5B^}0Rld7qiR0Df1pL-h^|xC zS0B|GX&+#>>Wx@{M2tts)3k@t-mz-yI*f)~(jzyWy&DbVL}4xt&N1t}yf?;uSJqP% zoUH*D59`!ov>)mdaB6)pp2gR7USn6#S7blis-!4f+Du;@`xE)LS=D@Q&%|l+>PX!g zxXSS8l}XU(C{)oeDPVIx(%4ZFX6bok(ABnXQ2Ja?^r3}?h3LR609@KWism(;@3liV ztD^Gmsr^E9eLZ^OAD|C-nIG*>zNAr7ou$O;cBf=XxpnGdp=~Ecw?lgCTvyc_fYecl zhhgdVc;(3?ULirZ5V;6qXa<+T(3BIn`bY{;^9?$6$5f`+l+e<#n6W~$`J8bxT&y)#be392A07Q4}5 z=TC=Q?gG)Og+t0U%i#SB(h~J|OQRZ0)SI~UvQ=Zn`N&y>#En(J2kYyn(&^I>Qqv5! zp_INmp}Yom$W=k=JzH`&nVp}XOm}{ynJE^`7MpXM)%VB7#g)uz7A|+&faL+;(&-AM zrWcmrz4gAkzy#*G-oy|bm22EFh19c(zxFVU`ATk480B`75db`42^jyNH=jT1$?Gw( z{mgxhPDrIsnKI|o>@!|P^P7yU4OcM= zaM_d1mU^p$L<*e1c^EerM!>@MAWAhMkgIC4tNl)`ze*bBb^Ilzcbry)11iH+VtBiF z_bT>z4a!4;-$gGJKI1{SN6KtW|Iz2o%Rjr{lw(^Tqg!VMSNOXrE6^`UZWUVbw!RnFhBi{7b&gv-mne9Zt-FIBW($(iWR*CK*bd#`hsNQ1F3K&2Jbiql=w`1Bu;G zKEr714KEHn_OpvxfrBm&6TIKbP~jTh@t3U#f6KhX?0m4}K1L>1+E}bMRlk-M99KMF zRW;K+Xs#}O6}Q8W^XOTTt>1&Yx6nI0x{)rH^Y<>p=`xct%%m7raL08d~JjMJm%5k(#uy_&vZKppC6h^3-H(9wK-Nvl4x9^T#*| z^^UISBLJNi4$6UzHjWDtu}TZQXBNz}#?UcJ-O#RA=2g|H5LELTMs$ed7E@J$JY}4T zNx6f9zn2afEeD1iebPl$5OJ>VP*8U;GPo3UoU$Ln&0l}($yaGpozOA7u;|Ho=VelR z2O}9pZ2?s0V8|$ROupm0k-DA-dVOuxi4+;a_>`eY>Ih2?_&T7?thKUWO)*Zuv#eB zR*j?KHp$4b$cF2cfP4a0%gRu!r}HZ#TlqNMa#M3gQG08D57K}zCLbq%8Qyd!{rrIz zE)yTyQ1ztPuu4;8=9wMQHCh?OL~%hgY#1VB5hB8fEN2Wpe8Z*zY*e1w*tO0*W|?d= z!3~^}gsG~stW^UJ43hQqmx)J(<5Bpk;+Rr6Gfk)Dtg7NzZ|gkkq1%}oG~?#ep?IXZ zo8{<#6d*6DH0F*GR4SY3pB?1p=5E-r0XID6xSnKWkds>GGQeG3(+Mb}?IX=cwjKqB z)VWnvj(|ZJRJOKJZhnri-Yh=ue_f*P0B?*U{WPEBnehqZfGI5~bX+zW$l|J{FRSz0 z=d;rV;Ow}?d#of@@$Qz((B@n1^M6<_{| zMD8eL1;-d0>$-)+In?n=@9rEsHJw%oGYi3#ujF}op;9-dkrBb6Gj=+>5I5Vg{NoKG zq~E@*R;dKA$6YQ7xO_)7p4zfgoKI~+j6Kh&oKJdV`sQYBnWPr#oMZhW?+r-FGUw`< z69NF@+W6453?_7dJ~ei;K~jzC71=hm>L7zQrLstPFyerHJ{*ueJZ@>|P5}@@^B!)6 zPRit#GTZic7VyI^USfWJ!`R(xg1)+p_q+jU%u|};WUW|-&EYgEs+ih!DoMudZLy3c zzA5h?BO`V&U(iBFz>N|Wuu%Sc(d{H3&i3~MKZNm$h$QfK-;_6?7aZ9xI6d}2o$X~c zBXbIQf%wcZ^7N>@L3K5nXrP~tB_`a)!GSU=N{Z}Fg5Tg0;Ad`;q0T(CF_t83*3g(lwvyBKy%Mz!AQjsrL2DYNDi<87NZ3YVEiXI4xj*6sMM;=jq8PwJ;r- z<1BM@tdfEdRrAsVOV7^(POC*rCaI|-2wf^3X8y!Gs_5i6rXD~?JCFi6U^0fi@@L-o>sOd%5 zVy)yT3vfJaRGpclJKJ2gR)6}VMZsG{ti_AM ze5}IR^*6gePTNwqj#H9{40JA$f)UG&Ut26sfO7+h!AZTX?X=;)5c4>30KqY0M%wF# z2GF;_mg4z}s`GMN)`AR!|3;dLrFqt~A>2ho4q2w^6EN$7{R=O(94^2yy5W=REp+eCU0xWRgbSh`NVrz1?tT{6*kX49GLm$PC^g7nJ4#*uC? z_fR-+I%aXGK(aixHmlXJME&d4>;5~x3N2T$8&Rjn4mF9(7{khNP5`&5v@Hir5Fz-^|WxdDAw0V>~~a)T(~u_of0^Pq1!J@nAhv}GOHsIQYusKvMW~4YV5aL zX1|*Tpz*$l!ZaOpdX8>JbWoi6hQkP`PtTr0mMY1*?@?UIO2_I!2XB3wyfLTvUIxEE zs9eIw(b}5W1lw}@Gn&6@Bi;#%q1`?@!*Y#pRv(qvF!nX`<3_TO)AvO-UHxw#Zw-}) z4&)Ba0Z2eCQ;f`djX+#Ok##73sK10;-R24g32ybZ-otcN-n(UGrqkbXrf%_Tj^AJ4 zj@;^Pyqf@E>aW$J*1?TeAtA43a*KsJgLOlqg5?h7Do?(V@U8zpJ&~g@!G0s6a%T*Us{rv@hUC%?39peKY;iq ze$k@;*U3{ROR`u0co)E*qelPRa!UU}5B$%N|L=D+{(~O)%dqu-ATxihxBdf}`D-ox zAIQwV1RDJ20{#Dm6O&64df$^9V(ma_s-)oh&C!|!wpm-0eLEf6!CSj5O7$f!JC8U; z=posW79_~uk6QsY^|o8KE(_||zi`zr&3|jHn){+J+AX-)^{?6Ox5<`MRIzt-3!!Tt zMWjjChZQt8M{Cf$l9$()+0K3x_;#mpZwX9uX}5sH zHT4r|Lx#UH5x={x-tWFMNtTwS)k)arKuKY{f`mKXjNi(A3mt=w9-*qJWvl!L=uNFv zA&VvxN3D)t52uLLi+!XuE>03pNf5PKp(Ou(eAX$MtmcM-0ZcHj%+wBS{TfoH)i2r2 ziW*!|A8^7pFB>2)L7J$C0$C@w-tUE@dyRIC11I+q`g~+LJ^nptIWUoPBZLeJ9~)=1 zofUq4Cm8dUY7S=%$q53}W<6mROz*-`4nSLc9#)4!7Xn#JrXiTO&Yw7(M;pi&EKyOq6# zLYNQO+S-;g^n;*xpd9JbbSrilCYh9s6@lAk>Ib(BF9dedEZR&-0Pm-Ic>B)`@PD@w z=tsW@0}lL$L>Jyrd-uiPG@s@!-J`AtvEc$THz!7xnGA|oHr~6Vv!=%{N}42R0b-3y zki78krH&W_mn#5xcVw74wp#2{NqJHr&ggFU<)pBk_ik1`Pz8lYLn$yOE_y?(?M@aR2Es3_U&U;3tEJSzHuaXm7p|^S!qB(6YtK&{CiK;MtYQ9r zO>BkSfyT6>Ik}FM1|Gt>&q{OENB3&va(ux|Nl`oPZWi0`-7^rbG>a1FCw3G1TrV1u z{LN5H=@&&(;1mXN7ZIcWRf8U!k@9p)Uzb{eo+(4o?A;|7t7fILtVk-Z{SA-brCX#= zfwL5uX)2gML0MnilV_8;w=}Z!7O08T0?pQ4LRhs0)TB}&`8PE!_AwEQ4u}RXIJDYl zY(*83V&B{?u5(xf^$Jl=*~z6@D^|w+KQoi<*J{l zp80SMT>Q&mfuka$P$4^cSeK2rHn-F!4fJi6zYxwhol7B99YY&3h$;2Q1YFEuHcKQaytI#9rq0)^w2zVw1rilC8TM+_ypRqd9?h)$|ERKH^{kpXE}8} zSF?GtuuMYw#KrI1>ll|o=Mxo)TT@m)-iB;oK86(X;+SS8vZ&f|t4`}+sp6A9jvb0w zCGGj6%=P|`vJO+t<2C8$_5}x4hPcVrvTjCMWK)4?5X0CpL>nM@9d&oCwISreA zImkKd^4z_LyQ-E;hmLP#iCPrXP_GOEGTqDkbo>$j=DfgXzQUC${V34G@;!TdTN2pr z#HZodBTa>aH6U{fj?;K@z7m~Xr9mGs1sjmM6g;8?@yLC;HYb(Zw|Ag?HGyuhM}7~J zZuLzag1#M7wSD!ZS=9j0i%lu;hAtVIv=TFMR7VLmIPK0p?>HoSo{s0BiwR+AezJ7? z6_O+r0rFVl*jqL!b2$B8c>$@Ig)#b`!o%P}K;Ek-TM{>e{&@bug&b}(>!R(%lM62@ z+V}-e{02s*Br+!Z#~B5%Nn`o}lqxco>L-?s1Op_SQIk@+wS_e|j^{nZ=0XG3uU%FB_cLLLF0dgF*qvf3LDu6cQF;|tj?Gm^zgSSR4#V**E~f$SIS;!7>iu0SP=U}x z9J*tXHGnU-VamT?S08jj^a^Q#9-P}hT|XW9a#EeP>X#LX2^p$i4{iFciuDh;iI|eE zk@1~ph?CzMhDdD|E=L-I+47-dQI2E&wNM#VAa*u{0J)mr8Ve5`hx|u)*KBZ#Jo;46pz0aQg1Y@eiX?r~UD&joIpQi~64@I1}>q)Dqxz6pdCKG71W|?%IN! z`}7_|_w+qkmtyv_FRSL{lzAD%Unx%6CAuS%7E!C4RI3K6ku*FUj1{ncL9L!*1ia32 zunU8(uM<4-uiA+ZM6G6#w!@aJ#tF}sL>)L-KdmicaBaPnj0k26ygbHZ=!(&ns$lx| zR}YFesIk-zqDEzG`2)T}k#7Nt;=4cnkB(Vt4x*YjJ_H!WP3)Hih_XLnojN&PTWqB= zomg1d$Y6By@$Tug@*dyFae7XED}q^{{uDaMn5fquNjRCPOP$mgV8Br4Jy7V>O9Mxx z=htYX|D83AyhwS_Jvhi%@fchHgH`Vh4w_uc5@?T+6%>AdUHf=!#v@@;)^{_uBL$@G zjJ3>j-$~#nUs+ahtGj%$x8ze|N+&rKb~a^498GeAR#PH(>$CYn5XMGR%xiHv3~QdL zFw%UwN&RbChsWp$3KG8~HwP!~FdRbHh+DPVZL#74&hGBIZQ%FBi&ZmHR_a5MW2YY& z^J9;8cPj^YtjqZ6i#0WJ1&)Et5==XHqUZ8j>=-s-7XiK$GzF@X=@&yZE=Nl>9F|bl z5X^uHQ!3YSOFvU>sQIO`?g%#qC@{;+htb!K##nKvLJyZtbs4mqY;wR-E}BytU97Cp zNi+OnmN^2R9=`s#rIxs2^a9z`C^c?n8;Nudb(_2wCspq8@02f;kaDr~0rs|$`LP95 zr+i1Hp3dR%>U;B}GBW#&RnA7(h}VUN{q^B1h=H=8dArz##-~j`^83|S`~!E$Gpw?U zX)`}A=Ucg{=bT`*gMOvuHq4``$Qc^5Y3jXC1`BPCz`C_5oW4g3qp2^35}QYdPGXvD zXhhCCJ_zhQ?i^w2qU%h`cT0TisD5@2#;U?kqZt{qI9X(i52lEd{L$03hj%Bt{Q_Lnp`gO3%&_C*>d>IK zl*KLCqjPaqdsLzCS84O#Lw;$N{o+4$bFEk_cvzQmGA{ksrc!R7n7JFUZWJ9O{6NaL zS6kt}hP?+m(NC*hfM2cY(0To$l* zI-+|T%f}mRrwL2d3*Dvg=*%XIkTzi*gxXSyIO|snE6z4$Q4yQZe3q-+8}AL-m{XxJ z{qa`Z!`yx;=JU|R0QTKFEmbb1(i6#K)>q@uwQV14lY@8kr9Hd#+OAi1{?9yQ(tKPe zmh=wasSt(o`yBoYpo2lZMbDtz_a|_eO(Q`!j{a_y^M>>DeuEa;~9HB{q@X6gNLitm^At=a32S) z{GJ|rDc=u2CrB*F4Vukrak3!IE`xS8<6KP~Uf*bI#azGcpAV9zE|~q2?N^dCLf6eK zmC6}y4&w33k`3>x)jho#J)e#N=&wz?Mrd* zkn1O`XU1!O^Bv{(MOG*{%w{iea_671}il^KvTrj(=ix+(|?_5c{MH zJ#mQL%p{AeEi0m98c?HE5}bJ_1~HjBB_8CGO6gQ^Uf^K`k};T6X)4t*DGx1ocQ{|@ zBOnCmzBXmfkR|*;L)z??fVj8S;c*4>J4Tu5+xGCi=I;@HX9uHwgE2G6I9DvB$CR;o zfbE?@lpf@qub<}2GM-*SBl#PjREti2nx~~xicyVzTwAWMP zYh1*)_iD--DUFcU;5A|{ueI8c4*^s(++V8zxKa$CAO;20FP)4=OWt&)%i@hh$lOuz zG*sRx*s6PVkaAkiRZxIo=pz+6-OY|WYcyfSMD$N3FJbS|^f`#|Xta!ItDY^QNgwdW z`n7gjPhaZK>1b`dH=^Ss-M{%EJ78>oj|pizXxqO7Zp_wod;+4MB1ZpiEr*#ni$t@@ z=yLx|DXHU+K2wg^ZTNhOy;S&}``MJAfjSynhp&VF!o=}u{7MK#j~*>eRXiPN%Xx9U zU~GsiQ|WEeH-y7+tgoM2Y+_juKEz(-7{Ms6A{>Zt#Ks{8m0 zh?^ETHV5s0wQ#&RbhXW8{Zr3SMjIB97N-bHYajt934| z1c~ID^n5=|DLSin!cw2uz!s$!rFX=`u!#2Vj@=B~0Y=gE#f`eNPTmSR4z$YicuVV} zQo;R%c2A7;UIIBc#leQNIC+c?6KlkCZliNgO7&D+9Xnqh5|&jm44vxBh-~r7h3Am!?MVhPFmyU^*A@M|P&wUl(OhLiY)mx?{G- z4-U~?6Bd3R7cW6-!zf4Y&XL`HEbViReSqfWOD`Qaug@9tXW(%VZ!3TEBmYz1ZOkGfq{m7&Ibp_HA%v0$CnWe#`J`kljhvQn~YS+zDZPiY@4MIe4YS!aU9y`qEdWib|K z1L+^rP~kf4kMefLQn1l>n9rRc4Up6tQ*FV8ik`%(Qkep}=FL>8?rJ%1^5vpTo9CR) z6u;^8B&CJtH2MKK&!h%J;~Eg{Bn)wgqaHp)RzW}FFg;@^hB_k+cDy~v6Qqql9J@MP z*Jh!5QV&Jsv{CaNzG}`E=6UjrM4uHnpca9Fc)uiX0(QJcIH( zsy3xrk324CC^P$l)8ZvEgd=E$zj#g_8vW$mEma0*3`~WAc*a?wW>&%vUJ~wwx>Ig~ z24e&4^{%GvjpgryEPPJtf=}zoe~*;YgP!?Z#I)~tw2tf#xqqPksM8a~fmfBZC${sK zPH?Keo}#k83sBx+fclB0;4$X7QD$krD!oFolg6zvFq(PCiKtzes@#)>t)@{FA3bavmDfT}Qr@TtqrM64ZMh8uKKsV#K0z|}vcZBp$9^1@7KW>1AW^$KPA)2j*hVTN@~BksxM z0KjJRvUk4g>vq7$u0oU2>f2&G++T(2revj24_PXG)9i-s*&Ej(2qO#jM)3=j8?IZO zzRmgi^w0WwlX3~zvLx=yuH04{&w=?gB)FdZsOS7N3a-dktXwvT`8D|G%1^l>mpe~G*7!%hR) zPRQU?wR#CR+u&Vdy`$_GxkVT3@-ol*PRe)|{D$&FE7fdbCx@@cRa3eCV|B@i&VBKa z#V&P%?1sjT<&Uv*XQu!tHsOn#v}AG}B_{%TA>FH!0B^qP%I&d+D6}C)FMF(HZJ-_M zh%GIdpjHm@=Wrgut>-prVllGmh-_m=vuHy%KQURx^moy50QaU!y6cQr=*sBGLKC4o zAMZ#WzZs=7$kQIJq4gKV3b}(wV!RW~vMU7n#qX8bX0}Z^$NiNySCFrM+)U{@5d~r% z)*8%ZS{Y-702FUKI26*Vb1e=nJLlTmI)p@V)dt+ts!dy={*IYv8YeAym+?^Z-qF}D z=f#CWWZ8$SuAsTZ*hUy4cF8`ZcCZ=*-D%PvoW4*Pm*mRLr9D?lCCZppqfZL<569bprpEX`pSYm|0QpILdj>B@WB3zH#WnVh9vCSX>o|y^Z{T+gtp?~i=P&wpwco90wAoY1^s{*UnB6v*N z{-`oM)-m@M@>BGk@n|#aBy8xaCl{B^Tk!hz3r9`c12h-XW%x?= z-peq4RD3{=xgNo(U@8#kw9uKuefWamwAIK;RUj?Ag0`{%qD-zcKvxUCUn#N^Gi+WV z12Wr~1bIJ+=59+Z1#lbAsn^j^trt}X0(ex)^yURv5AP@;zY7qe-ay%|z^fBL0# z0Pe4^F4Be~g@zFvpB zXY@^4-Z&6km+i_{p+Cj4RbeB^kcrGCE+6~yk55j%lR>^YsHOS}Gm{%MI6l{Je{S00 zBeXYRL^E$hnW1+<4h4}0tFV-C*RGA{JIf$V76GFC;CFhhbaqso^G{24igQUnI!vSb zOghr`y*vH)yQZM~&tLP9i&w`O@{8nHL82i}VaCO{V4{G&u_QdAOl^j>EZFwP3*XJg z?o2C2#OY2sTxOGZaI+XyTwg@iuw)vq$LH92G+cZPElnqDw3#cpj*|%VXYzYv*F~XT zz^3qZsA_)_W7a2Lzo5EH1>b&u396QTLr-9nyc6ZS{(dzl|A(9ZTXML?8MNFf&V81x zYwmM^!988|f?KNiLk>eclDaIK6@9J;?xU-~;9tVPG@yL;PwblDFjogKc|KTTxhD^M^9!zW*HLiVOdMZC& z@EKQE%K!2OgQY@HP?M-1X`YHuGF674e9e?8#PTA&db%h$H?7)R@e)El6!pe$;Z;?1 zAjNs5`<$8^MZE;+M;hPF8B#xAJg+dgsohUEXV98Wxs8*F3^~i3koD-Q>k5D>8~cV| z{i)%YPI+r-K)2#pjf<=4WGy?e$*|vlbHS)GoGj%VFjWdbF1!c5DHH7ITy{1eA`}1` z&#iJbpm>`h?tXxmxeSPr{sN|!8F&WPR{`XJ^#&Ao^zePJL>St$)p%~*J(l%$9rOR1 zgyO#D@-yDZDuwI;_@N-qesoFaqPcUM@k)z{sclcB0q{wkxmU2{K|iGgD%*Ud7hcXD zq2g0ZL0PBI*!G#){SNgA#Rl&t-{n+(GS(WGrqB)mXGU`sQ&IeA1~~wO91XLRLffiq4ge3lLyXUm*2P z37*Y%nqq>2RO_Kwrk6{W<29(4^fWP}e)~%-_oY(WPsjN?uNTAz&vxsozT!maJ&M*n zj-#)*Mh3)OVdU8q*VnDI;<#vf4;by~Xwu9_qZww?jvshZCDcUWrRO0`^`CI^cL3#h zkkz5Tf#2EbK+@%rRrHVYFm>7PNLQ)!2_|owu=^bbyCZAqpwZfF%kg%V_LjcQVALa^ zr}hrCPo=Z(vYt=HC-XN3p{#iyx?-afAP6~EEbtuD3 z+ZmC4qxMhZ#uB$gGiWT?~HBrHyL7j$)ybgoX`?#;q_5<=2GPpSJF8?CdJ(Sp5wKoju(jZq|%2))M@PT+{RH z5zmj+fCA@HLZMC!o8iPa89|1*I5&j|e#zP7ee>iJywlXx+%9-R>N(8-7R$4N)R}W} zxN`k8ua&e+nY-Fe9npQC4y@AcA^5~z0Dr!%`i0QD8l!AG2|k*fokAN0p1F;*ng{zw=7IPwRM8 z!hK(b0X(>9GTnUOZZ?-ayf>9bC3#1vXK*mo-*Rl@S!do}J@`~tyeTG$S=o+h5Tci? zG@h@j9VfmjT?5R{_L~QuTYrcYf%P z!31Tx$>i6cVuq?WoPv?0{EjnxjdChj4`9QnZGxx&q%(H-Er>#1ceJ0H&qI&lgzoV@ zfFvzr{JW&mg--jS(GA;t{U8iQpU#`4Q~A2@@|Rtm1RO$YTc8NgN8F803m^Q3;rXKS zXGw+|=mGp`vMB0IKXdD4#ggDhkO4S`cW}v!R8-LMwO|?*53eqtP6`<`E_rR^B5~%z zkTZQ>1iT`7CY$6S>`ifQ$q)9NY$@ur<2EfGveG>(eKQl;se3g|q_v*EXfjGzz%IS> z3rO1>A-0R2+$T|-4rYfhe*@A@4$nbWtD}0|0w>uOUro)2Bv`JEXg9UEk1Q?aM~;#F zG`(a^6B-2*rj|s0;k-O}Bj-kb4d-lY38uOiA{R;0M=`OMZZj+;O3(1~?g4iK7DIpP1Wg2KvL5K2{Y_=4c(Xv1DabzU29E_gK?Ef+66J7Pls#)cF#z1xUq{NsIDz zHJuIg>2@`BeMz7Dfem+WRjai(5i&s_WwHYRB4G>+R>w1n9+Pnv=9o8DJLtUv)_a5X@iCL$avy}{*INBN>R`-RNtv8}6}??xTy@ZqW&-VeTqE_{e{x3uW;64@c#{JSEL-;D zYmODT$Gg*1baCa9sDNy4CN-|_(d01~eQ+O}&i-b$U|C&}S==bs$LBiaT195BVYe#j z2D!#}9Hu^jFAm)Q#N3C&zI34s?1{89-(-DS3)dAbFcY&wuDXqy>&Rp4L8;vPfgU_w@3diWFvm^T8ttO2=b6A)pF;lI;dBeRH%&YEJjAB3NPpJUoouce0 zbabzOSJ)o|WqsS#Q#tH*5IZCd*6cG%A8i_asHGXWQ+*}s^fRk2c|@^~6ECk~y)RJ! z>2HTm&7c>{5q90K7hZJXR~U(7bzrx|1lbq1-Ul_cojbW}hoX7YMJ^g^DZNtM%LnC4 zukFO(XZLZkB*Y-EPT=vuFtCemN1R+bmSq5^7=ePEdK6E!-eZee zJv;G@N#74yf12-=yktCz)i!`=k6H}s$p~Kt4DPHwWU~yE|Btrd-x`WcbBZDmKAxpC zA0AjB*JXL!^P_XvZZ5C(*(qry#c7pPemPb#+xQVF3r?4`#q2)kc<3nq{BD{-6=MFv z$7L^J@Ed4rt=2vB^38g!F~^h;NL;ol0`d;hszT{(%G4Oz1sv_Kb}5DpWoX*4xAw*8 zHc5^7t$U%am049p3EPdKuqqi{$i7fiB};X@V`JVZED%_JWL1CAjxdQpBm$J|zIAk} z^o7{#cGW-%S4!^Bsv7*}`RyTeZWPL4eBlL$IwPvFvd=sXc#Ut(m0crF5*Blo?zTV$ z7EuLs7mk4tjks1~E?#oT{Uf=)`LinXdRH5t6!ubQq2?Fp;eDwz?w3tM#U>?RlUgkr z_4>OIrn*xb^Um3yp}M*oXB!pY$vEJasKtR;jj*s4oW__fr)IHNN3G9PwEk8OKY4if z;bZ#XjVZ+Rs-Al4hutI4)P5KaTR`lNvu9Hk$&v@^PNyZ!bOjVAKlwQ( zI`+;TIU03`MdjEIgmHL9|l$Vvmf2dlEe$(Zt;%pO{;ZC-@( zqivEWl$iK=>&Mc4{<%w~&-l9>N;}p-ufX+i%M$kEHZv_GiwX(Aq7EG!_rN!=r)I@6-$FlY@MyVdS^jv^X8r?NaCyn3 zMFmJ#(1T0O)VO0{ep_B= zw7v&hEh0I7UDjeT_H0Y%fW&0*u3P<7I}G2OkU4xBQlNV@f=d%}jeG-rg#Z<)Spxv` z&!L$elqKh{=&NxtycoyIYOz7GeYO!jaxm24TNS`)Wk;t={;gmPq7#EDck7tGi+g{` zxlvg`Ogc*LhojhE1S)Bja^$QvV`?fpOmyEv65jJnL4aq8>cCrmpRtX%G8xE4PgWa8 zTCD9%?%LT64D6niZBU_a#HPm?KP zwunr#?hl;LP%Q!tK9LGETJz7D$!3|Du2EMktk`mvym|2>kM2khL`dV({zt$8bz^;d zvZO9O7r8VCvZhp4bM-WOY^W}dp5ux*kHW~_XPazAa<#1Up!6nhKya}I^(gXNB%fYK zd?8TY_knWB>1Q-^pp~MO>7;s`p>aS-+8Z)ErRxg}BI98om!u~X4hF=?9@=O3sJ@Nc zGn%>uyGH2NDZ-gm1d|3NU?1=py{sp7_+j3~@;Av#Wj;2JY1lJSW%77-2ZU+tc8zjkeH{x>s0xLxt%kcx}f>N7&N&% z250`D;bTdJ;5yb0RC%>uUwea4%719k6Yoi5=uU9|N3+HVM>+;=+t@Z>Fsa=9; zj5sOvjBOd16e=TI4$KT7UjenNW1_%J;{4r5bM8h+U&)&i*!=b+VIjL1zJbUjH(V^-6m_qDg$O znC99vtrkSh=*;<|tqBWQSl7z-hg6t)D;XhmL^eQTbEyAy^3`>Fa`>101FGHV8_UqihV z_~J`{CV3K;#!iH9F6$Bw1SzWf?1)7Z&qdd7P>$$$H0xu`@twR`Pekd}0w;U%dceje0rz;C~EKIVIO zAqBPgoOE-d0-V0LWpEHDCTc9F!I?d=oNNe0d@TdZyfk@ksM$3#uP3Bsrwg`L;lGhA zMMdsJ5@jwYaX(&fUR_sdpZn3aMgSMcSSj!1ms#sh zO{_P9lsLtP_SZT#efkg3#;r|Yna67=qAMfc1$81eW(cFg8MXhp!hqv)Togf_w6(T6<^LDC0RqKRGo$19mEBZc2cGm_?W7wdfarvj9b2dN!dm2$@9 zi`iR(ohOKugSez7wbYRT+H3n8$-c318W-OQVkg%NLG8Z0X6}**rfPRy_tP+Z1)c3+ zRpz35p{{6i6rzHqe{$kv{tEI(IE>S{wIVEOMzx?$_RuwbgMLEea|G(11RzTJm-gHb zjR#`C^Ne;WG!P9Qzj6}3ojYmM5%Tri+pU{2(_M+ZJJ8`U-4iKCF2@xue{Do(wEC>R zzAvV%yP7Vu157{ewa1MoMZWMg^!N~^|1~N6n+EeltH80Z7rx{v$6MCPvK&GkZog9T7ViC25%yugI>C zv2krYU6|F-2vc!BzENUpd2OVxwj5p3r((sfQ6?45{G*D^S;&VwT7~!pYhQBo5vVIS z4mSuCvTg2d*`}#1kmIrwN1uG(?|mLDCx^nWYYHsSUuvh-$|GUU>R&SQI5y#PW8(Y~X^RTaLAl&_)!2n18g9Vd`-C;BNPWdN&iB7P4lKiNE55_- z?Lc5t?F%xT!?8#AF=Q13FlmSW?qY)FSXnhi$zBnkH}b3&EqU5w z%Q{(QG6%)SqPQKG=2}Fu@gP1eVpjIxT}MV*TY54C?f2a_cRydwR7DuOrtGnWZlFL# zwuRA(8_C*L+Nq()NgSR9?;fPBJniH~)tZ)J;-5d+*H}Np1&0QQ6cAI@^G$sb`gRjK z(_k`$FzGzu`Z@RU09x}S`glxGtRqQ(UVbev@d^Jfz zrUQd-F&$C;kr;J)soXx%<5FxS3I(A9SuTurQK%bxnRxa09pHOA27$SVMj3TG zCg{dV;XRE}c#_Gh7v`4@f$@_QD&~c&lwXUFv3|%sCcmQuBOXayvk-Q-`UYESF#TE@ zR+G=kPhBS`D7tZy+rb z(aw_S!)(DZ!f-a(P96Zw&U*Z9(zM>WkUR}MQrpQ-lS=?8f|3O#@QbHX$;6CS1k-`0 z>TRXs3yD+8;pw+0`4Sj#gr(5BE@-ut5;>m3F#$8<> z9+KU7_^SZIwRyw8Ih8Nqjtip5u4=9xnxYE1NV~b^320tp#IX4NF~`goioMOOtdmxD z*O13I*w1z*()tV)pX~g!{e1h!o=o8r22pXxwe33+wVms6QNK!`|0A#7^Ek|izbYyw zKS#mOQFnDn5AV^EE?AZm%pWpaa^(wvD>()roQyhRL<;S2S*Zg0etf?jf0TL&(r0#g zy9(PL2^MnYHd2lIH75UVkc351(t>&nB+s+Ym4Q!%FR!v$y~4q$7OJaa7InmA=R&sd z{9D(VrOVV$#5HMtm^`2+W|S=zCtZ~1ei06Lem=|pOWgnM896LuimWhw3xin`B#&o0 zQs=iSmNiTZbsj)@OiO@i%u&F1=PBVPUS)jiJSrRnrMrzirjB9 zDb`#5>v0n{%dt&{N5w%Z&uhVb3r!pC(PPHDsyaq(Nuql?(G4rTb>na+@R*vZmmL$p z$&{fp`YVC#Xnbj1#uxP;D;oaUAj}>%u3S2A?L_CJtF5u0E~O<_`pPlAUHNNL&xlg` zAf)-*11-U@V1oCmNW_h|e?8CfVqx~TVC+x<<_@##o~8j~9v?ySI0IPMe9igr>!v$B z?15dTsKPp#ko~0kW!&=b&yv&28NCdEBV0}KV~MwG>CDkmn%p_l*8#jZ`|Z&YrJdp~ z7>%O@StM>rnEB%3p0&_~#>6d3*R2(j{Q$aKt6us@0!@<}uzZ+_uGW zzyQLLt)e*EA+nt}a)isYm4oFmjnQeXGMs*@9Vxed9hmrA>ndB1YXyfNL2FSk<+Eq0 zOuFLEJ*6?ZAj*s$(cZ*+V~)BeOg|~fVmN8Y5Q(Gz4P(5K;|WVJAJS>)HA6v1E1S>v z_iV#0F z8ItKXc#JO(cvraK@|inpCDG_>lF$ULLVysWcXqTqMfY;wb=rOz&IzF&=Klg(vSj?f zIjSa_BJf_F!>-0ra#4E5zwA9%tz0xEF5xf(P7s4_qgpnW(jjFrif8Fb^Ze;vIj=Ws1h-oNXUy|>Ar!$91 z54GK$2%&hS@Ske|sCi29G{@BF52N%yoM)jHal#Q+P}=}Ruk9@hHmzr2NtIac3;|uG zKN0;OL2r^I7kv{)Q5r~$HFwJgtBqTQj`0(d1b%M7tR9&3-_Zgxkq?7S4WKs-u2f}` zz{%W!r2%4y-o=IxV-$q9N9RCX-7n^`!>_AX&RgYnXdXE7I!P18SH>3sk`qG!^f-Nx zUgam$t?%H=;KF2z6fS=F1AfY%&gR;yCi;oBqWeW|{P3z6#DECaYf0e^NJAzu^~zt5 z;DzU=u9yC@KmP>391FRLM`NB8&r|NdRA~Pk&m5CCIsBsJ|BL^45Jz?yuy8B=)vs-i ze=4279bE=gQT^+gU%y!Z?fEFjji^!lC6NEgRSz7a0snllzdrhre?G(k-|cmN-IafB z{ohZ@HCzXq=;vQY{r~wAe>=K{d(HH(XZ|DZ|K708CD&uXQk6>kUx4b*OXPa!$Nq_( zzdnjrz8H?!e&6-w*IoJ7)^Nngm47|+OPqyCQP9A^%B~!df8C$|v3F@;Eu#PP$A1B_ zdF}ITn$+w6m5`i^2;zSMM7jSjBL6Bhe}eAc&eJ(>{a+E0ux%*~-i0rs?xRW7lFWaa zQDKW*mATF}YdwwX-e$r{*Z)M)OYW~*nkw`X_FP~0KR={x_=8X7YHm#*7LJyw(Er`M z&ACpwOhg0?$C76&2m$DV=^pR87N^L`0BnQUQuE<&Nr}%44Gb1>aKM^`A7OqUSBe~S*l27ttuG9eI`Znh zeQ*+8as2S={eh_%3D=aM>5VwFdOG6JjUg*EFrrX9ZuB+H9~gEFBWrJyUAfkM*m1qw z=H33vBt-I0%G839oiAhVi*0x;B6G&c5}LTyn{Rp|qDk|f!sF!r;PjuSIE?lpxl>oL z3*yYQ&I>+P=UwPBfr5|aJNWtSzI{?YH3>4IAnzPiBbUiQepL^hW5)OZa4_Ifmahs_ zHSlb{ZDO&j%7rM6_degNgJSCJdw!e`C~(7gtuiuXCpt2EJX+Ucr{>9Se3;vEQv`*O zYDK+7GiZB-Aq3Zi{}5U~4U5z6m*_#|JbWXUCs%V5XM*ynBktCW#6I+_apV{(JUTwvG*4ukhcSW^hS?vboqKu#<9=b zmEGUuV14kJ?TXUa4>FV|=RMBK&CZr`_iPL9!n}jUkY`gELlcwLU52Q^fL+Ms5OjWc_;V$vPp2jcYrCft}V-ds6qB1 zU&;JpK|#_`X(|$GU&yr(w-`FRh_eBW1pyyGJeS?uVl(%csha;(C%;n&4?R)*T|lNL z<_`jl;i~kUgB-T+KgNx2fTn${dFocKRC~zGs!G0MHSrb~eT59R77uvwKPtm9l`Kx` z)K&hg!TFE`=OmKp%j>pgU}esP>VK}x6(*%}-cPPDN6HlTznPYhV0-X_3f0l3jV5{@kE@&Gh~1gfvKk+7 zdOF^>z&o+1o^F1=R`$3BCQf|^P1U7xu;btz0egdot?D=}> z+av!!A$dnD;5Bn;(Mpimk`f5p-gl=zR4{+1O(b7o|Ds}3~^l*>3T#_I9Fm3 zM3{-XA=7g(7lb&oZxk6Ld^dH(s*HcJX_GXU%EV0TB7Zib$Hx5jpI=>Hij}s{0KX8Z z*h$GNw@G-c&hjUmE@rCs23!=eyI#9o>TnpX5eOyBjE4&-Njn=48qZnTc zo6aFi#g&P?x zvlb`Mrr8SBtR+JGLZ?F9`aJKPY$Zj71`XX04c5<_<6SGiEwsZBJS$VPEkZ{}S00yH zDn7e;3-}X}Ec+_U?Z{`#`mm=-AhGe#YfC4z8=~-T-|g&_SexG(0}Rwq<&P&wnQd4| zlj^uLSxeUk+D#ipN$Q+asshhCi-n_wYSjZ4d@(G^rb%M(tO@kd&L^9;Pup#+)+L%_ zkp;L`y5oNq9RDzoOD*$}x{tetj$%xU&Be;h*&eK}Jp~nJNu%B&Px7m+SL(CFQ9k21 zs42tnaQO`PW~oiv%|=$=(A881(hlfgbZl>Va*#E8tyX{3-S_0_)-oH(bIl7KQslG} z_}a1GB7MaNzu7bMZbYPIpkQ4dBlVkB^4Ev^>AaT##m7nA#%p5QFwpU+eBr@>&s%7pGk-^ozr@>ARC@`2tNA7{Xk$>aeqj<=hcTLQDK7ULQ=+z|6CTVxiyjm8lMf@h(Kr z{SetzBtnK*vuoYQ;UZ(Nv7Yu_ciO3Cvx8@SjDxrC6NJTyew5cmC;V(5(^f@Gw2wK)rT$>KZ& zxV#FvBtZ_4-Wl%%((D@q`%4>RLLxHXWGtOE?sRodEF~F;{Iprt-Y9Kr zXm$a~-i6ts+!}eT)@S}el@lYY-J)B-CePoAW2Cr4SGrtfX4PO<*++YYbMfBYQlsG& zoum&*)FrB#Yws!ro<$IxU|gMBxW)cwEDI_qPUBK#}H{d58Ia{tHn7? ztlA`JQeJW{HAh}hf0|)wVjX6)G3NQX8~qlt!zocAj18}D^uyB`q~-r~GMmZx;KnyV zUfv@-simRB+3MRTHL>k9PLYQ>2vcsJKGjxoH|}Zd_5-akS$b#U?Im#pvX$;;-^v}2 zopp|mO43S(QSDt+SGVSh{rez-s#Ma@NHcH~LVjrOK`@*Z)2V;DMuN@ZK;_HffBG%9 z0zFT-}$xl4L(7i(mqz|G0>W;Y9v!R&i$G{Le<*6@=Q|P zQB~~6Tl(<3dqkd-(>`}qa)8~j_;634)X9;sMoG^O_)VPE_PCT?(}C*mq9 z-JN85f(pJHmoTeVlcU-q9=w#Ed~`QV&n@?CGv(ENvZa#<`Z#{Y99RLLBWhuN^xX1& z`~LWPZ+2+tVew&i;kP^mUxqv(Z}4d3OOecMIsS> zML|qmS0v=!4VfQ}hmD`Ex<(RkGs>99EJ54G!`SdS;ZMic@oz{6dlM!|XF3VH-6El@ z4|kIDau%MAG`>*K9V(Ac<@Nc4Gs6}IaxOSc41PW-v3_Ze>AAkyqlBaKcJ8&w8ZOcFSd)6&&A8rMqr5zkUDG4}QKliNKzgcbu-aqr zAmwG4zJ#FH`^?RuEq%wQ_(v!*#5XBLET)L~DOF^FrTOuB1%2D==JjAOS-*V$Rti~X zAHU@pY2TAt`q*cAqFQRN=7#yZ)}>c%Z!}NmA`glD_*Z~7Z1sDVB_(Y0%3&=Gwn*6D z%M>UQek6M5(*`YiYvAJ-VZ}avah3|56*OvWXTb6Rs zrn#-w6U4-7+ktpZ#y8(Q)%-2vN<#8^#GLP0wB?>FrB9Xz{ZHl_sHGM~-4RS&dK5*d z$TvXp_8TldRwwsLCqrggv1oxzUeXh7Ny<0W>PytVW|K7z$es_%m+w9DC<05~z)MRS zvPe^xJ)g z4K7$a=!IbIg{@REvb&~_FXuQN&O@dv9nVXZOPPZ6mX<9ugu2`w8=I|dDBDrqeC4)l zYX7!H)e&dSC^A*S&hGUpD|y+a`$$>DKUPjHN6`UC!Sq~H^;Jc5vhzoRp2`W0XK5xj zuF(&UDLp4#pP9YTlW5soh_!s0e1oB>F63GPk6t>7V5Tbm?3=7%T2E!f5X@)0@L~UH zNAc(2@1;toMA?be^EJSis4Ej6uF3H#exawj9i3Ib>y8Vxmf1W0wxe;Ny%%_z0={|p zqctBg<5Rd)aYp1gGvQ>xO0UtLov>o-=UMlr-frbjJX75&hwK&&llGNDZyAM|GnfYY z7pT{tQX>!f%vP5^^=oVz*T{==_;!9#TrytZZ1%!WVX}3LRp55?_^FA$%D#UDe;v8W zW;D|07Y19z!IXV*k`w&-cX%aEwN@SA{#OKo$~OiWEYj$)H*zUK=gu)|L-P!Z*p>;c zoe@1d)<X7$d3V<%n|@{#du1rM!o9!rM%&Sl`jfHNzJ zpJVs1{mkjh!OB09!1yP>FTOHX((lk>xDs+!I5x|8o3|4!h>@6Jmhtkhx0Dul zn>{?-T0h^JXj~mRzA!ah6(@9i1vi@?C%g8vYc-}yITn^KMZHPdWF?DvnB&rmD~D&g zNRkfwv2)keY479^oTb+fj7k#T1`4KQn|S-}52unJu2px3@veLbFZu=()&QOAQROQT z_ce_36;#XP3kb(C3~A*DYu@>GI_YOyg^htm{<2a^?nB~}LVm^f^U^|yD+iDezmk=M z4iQVtvxN=ihKg0QTyw9P(XFXml$*y6^xzP=i{5*QZkPN_AA&5k>^^e%O-Yvjc}_h$ zpRIXkQD0y#cgJ4-k66#1=T~d>fwO`*n0ILZDx!qHav&>cV}kP-*s&z>)&I+h@tIwv z?TQe_+wgj`R=>d|Dp^~PlgsHA4nhD>*jvcwXDZrvaYfBhZEL&Tfd?f2o*}e%iRwe+ zxOXwn9__M(>N)G3*X8$TzL603j|W}M2;BDE3fXy)Yv=1HM}0y~Vlb zroeCxnDx6GUZIV9gw4LtHbKiOo>LP|pFI22OrPEZVsf-gpX6FYFVKuedPql9jijY- z3U`hPRXebRv^`phD*Q9P1iOC`oKLB~M3zXW3azjIdDSEGHmy50&>i_;=dqc2+|D9r z)=TVS%1f~wZY$L;%WE|@eCKP9aOdz|c3puBBt+&w^^-D%>zvGZcJ8LN`lV&o9CdA+ zu1iAA>N*_!C^nQ?^V{qw9--FUsgKa@L{mg$#TfZBlSQ)jrI|bh4GCcINk%eRlf2|0 z*`@rYZ+{D=ojYJ%4bhQucjff*!gp)?tL0N6=X$i_ z0GVC}?iEji*`05R2_%5vll#!@7NHli$n)6ROk1v<4u^x?RgK|pczU`1wt2rELV&6U zSAOKuDBlUe(Vg2r_u{S%T%&>6(VySoQ#2RVsVk)ig?f|5vFdP=faUMnJxM@Y1wbK_ z2I{nr!o*G(A~hsdzZaegvr^cmKX&uUS1*;>X?y&S01d6Y zT=92miN{G!PbEkmZ9VU;75JhJ_#9Q+IF6eN``$mi^F}9=_fDkHg}3`2^G57G(K1n9 z(z&K_1d)r2s}R^y?n;{l0GiwO2p*Gu@JB{5=jht<g`_P3zGb&MruS@q0}VNzIQf~ycAr0!AQ zy~ITv85^`<4c$()+d2M8-H+51v|Qw{bv|G=9SQYimQ@x{z&0yR^|#!B&*POCR1-{n zKmwN9-myZv46Sq)e|S3Qx<@$b4VkfCol+=I1$5g*<(Q`0otv!}^qJK!;wlSGc1Ahl zsR`k4*fyld5kj(!P=cGSjlI6mH4I{OA4ZJ z9#EI=MdV5R(4G)>MFRo(?!=|51dOG8j{%p%-M|}+Ro~X;+vr}Mmv<9U)~1+9-~53~ zp`lVUe&;bnn@4YWeN+#Ah@bfg`M9@}@yj^!8pw(o+|y?Ib{^rWTXCB0jQwuoJ+(u7p+p5 z^`X30Xs_eJvd72i!RLv6r^;-8d+c8%YIst83KWM6T~I-L`)HP3^iGukk-P&=*z-g`eUfIN?RWKO%28}k|8E5tVppfmm14!V&Oa7hNc$|8EfX}9 z=BXpQN&6j&4yG;ITXC=)i9@G-%IKJlUzN88DCz5eNPX6czpMp=R|`p{BGlquIa6|A zeN1-W{o!`C@a71;`G4%aXIN9~x;8rP6B`Nw3J54ox^(HFbOCQO z-U+=Eqzj=ay$3=G2?3NALMYOL5X#A1b2|6h*IwWCt$lu->s;#}WsD4X$NN6ze(w8u zQnOq~e6Cw2VErm*O$A;(i3#(3#*gJ)W7cq3GNR|g=5DGWLhu#lb(eK%S)OnSd0kEI zrtvKfaH~!XEw5EPGzR*yvy@jhc*-x$USjdGDK8JMR;cSVLT`DDa~#N8?8?pj%&rHU z5BWUIbkg#|VN0dYr5~a#iPFY*z%MLDU1a}erZMU(_H-Z0xXeG2QO&p`Bm~!%!<@Hy zudV!Iw!fby#$%$zFwF+@@M_HOi;tiGfrsT%TS`uPmpUzvUiBcGe>4>1bK916uKz9q zW(=f^LYzid-wCv~J?AxRX$o)ObF%H`t|JCO9;t9y86u1YXz=3aVIpRh&>(z#o!?Js0{#Q%JP9G{qNm|kP>Vj=B!X;@C7 z%=?;aSUp99JQi9`7F?bym-Lz08m+68G}n3ue8KxMQYfXjfkD zFiPK2W(k?#zT_S3rV{e~SE-2YDe#Qp`O8b`hE-~PthwL>&g|DGT_syOiAh7^wd~gw z#wj_HR zS3YP-X(2V{x#y<{ZaXH`FY<888!4g@_7p^96Mp*PswRI_v5Oo(*~np(CL|}FrNeb* zL_oT&DIj1kks-JNCBJG{yjVDwkduIzWfFP)M#j1GD_nO|4q9J*N+v3BQpb%_awq#v zWnBUF?5>Mo0!QCKrCG&tYR!BZxl==pd{w{2Z~aA`jST}o(D$HjhSHntM(v0rx|C;I zBE9fkW)UoN{t^}Ns`Nqbc!*<^9M~4=FkK&YI!|@!MOw6Xamn>aBU44pIz&F(>WJ!# z2U5DrOCh&RW;?V4_eTIcn|hZ|@>4%*jS@|?GYmPFDcluYb!4XOBA26f_+Z`{a}CMs zrH}?_$cCcxdhVql&F`Nlaz8#v_@t+*+NLg!yGDWk5Im1h`?Zk!B`1j+K;T0PlEJfQ zJr;do{(#}=m&vhGWRU0x=CB>R3gC==GVKw=vQe}8WfN4{M(B=_lWksNO`H%pZ@_A| zl*NQ<7gmwz;W!T#SI&6xCsh5w<;=`;dKZx~;UOP;SlYIK$guIz_Yc!Y?W-BO+djeT z(~$i4zxQzYio$x7dF%_D77~oDJet1H562hp5JhLBf#*NI8@`}oZqjPH8E~WRcSz@V z_6)&CKg%!oM0%Va_q272!im=A4@&OdrAF2;j2wt2vKfyx_R_{ENWb9FFKlHA1n_h| zx}f`)t7cO>+t0=nCpXyO4p#U%jHVU2+Cpg!`|1f=C~<0@GIMXwLv&{y)0*MEYod={ zOZce-pbI7u8j=I8=1#ryr35QCf8M?x#P-noHDJW(=hYQC!|>8FW&hnra`DKo6ey|j z%%zP@7B}S2zBYZ!EGwbI^@$!4aN=RPx9?qRI?r=zrE|{{6Eppf-Ug(vGB&$>4oh-3 zNLngMQjx+MZx*Yf5D`Y?s!k;6Mg=pJPJCwuNY^S!94%>{=GLWwT2JAB-oWc}1W z=k$L5+1+Hs@$;seCH0TaQ}$z-)@c|2i1pk0geKi*g-zMTw7R3!fo4JH_{+w7S0f@X zm;2gcufkBeC6`Yf3r@Hqnbvhb43SrC_P56gTVC+*)gY`!NOr|T+?O+#K7VYNXBeAw zr{vRPcTF=fe1lJ3k0%GA_<1vPbgWC2bMMDUf@jz0{kKh5hG4~4cgmyPC&;6Uf?k0O zL#Fg>66486dW3d|D+L#F7e*Q4Q9p?AjvuzUFE*O(tJ7ca#>!tK#_P7-z8e(?XR9rUU<#vum6kTc4l7!+Hd7a0)d9gc5oR-+rcBkzI&_(D+Ju zDg#E6THm=I6QL*23$=Wf+xIR}*RqD0&kQ!$A*h!F7U#yOac*i{7d<&6#fBnQsuUj; zK1~{?xK~tU((o_qc=r6Q@>^-c!2Bj9z$S#CM~H#8-|dyw&3DG@EYAsI^Nbm2IgDJtl0NedBx$ zGKu()TDume41BOD8gt7Y@mhbX zaZBgX$piF^2tv@Jwo}e_;qnB;6Q>WOZ@Ht?$4;txf2*V#KWUG<`cCo2Qwi$}EETo9 z`lAwq!yZNCyLTx17`&qGFkQ;6{`-y=(yW!JFu%R^yQ+5sWv8l53Y=_ISyu~nA}-j; z9jz$%$0eMQ_dG7Y^(6%x>m~7IJPfGy+bRGBBtUS-*~qwt$_s|@+Vg_aJ*)`$#(Ypx zNq~ZC&G`WU`OFZxKe24)ioW&NjI=NCReo#2vVy1a!#k8TVIC8g8hK(*ZpjwUOED|{*?OOD*jT|sK zew65IazfQav&Uh?NCEMCX}m81t1P2*>-v-@O2~I!w`1iB07Ok^F!5FM`ujmfh`Fh9 zlsTs5aVlr#Z{xsH`c=Y)EzsoNIW%A8@Q>K8)1$Vwg__qZT2Cl#A%7qiHu_3b7Z5z^ zPOTHHMq>=!z|C;mD?4}B6fBh|FM$4X+5#GibEBg+(JR%|Rq?{#ujj+L8yCteQ#Q}uK1J`>EUj3_cRHbtx0^hL*-DwpF{p-N;rMMq~c|hm!?TW z5Nae8hEvLDoRHaRk{40VhYWm$^5AK4(4XYUp7qezP1n(3JJlZQk(7WhzJ% zm%=&Z5l=>)PGhYWbYp5ccs5O!WiQzCUy(k2H>kC#LqH&E}RMv z?Sx)Szs@Yryl5i`pRX6*qszQG#~Zer?N*j(prAS%u5ee}-Q=iI=PZ}nn4ReQ&rnC7 z+}|n$la%#p%SIoRrnZWy$bTbQY{G1k}UHUK81DO4aF#u)l8;9(oOrK$*G zW74snOjYS_>|gSvG=yT)0t}mEeuvXwTE2FrN^_-9W@WfGn;%-l-2nGaMxg~|r-NBD z`!?;jr6>O3uv4|)1^mineW(Txo?A6@d}ERG%jf63N$Hw$jyjZez_~U;qpbYpd>^+? zBy8bn+xHCRQXATqIg=jc??8W} z%y8Lzx4SM3*xE>ek_r4zsYG2c{;U_vR{5CjHiJrBh@nr;l{R11$5h+c?nGJH%3qc4 zAmSlcJCWVY? z)Z1q-23AQGGHt?v>k)#9(p3n{sdA)}nkuc?VFqM{Cgpk%3WFUzO<5VL?baY!T8WG7q^g1fd8@^7f zwy`C~IuWXuPM+&N>#4&yd04qDT{SXyRIA(Y4k-~-9{URr=RM0*Dlxrpn_eg)vzJDl zm}X_o>8UxODM06I40I{BV%HR=;M(EN(HeS@aXP@(XXi+h*( z+;XmN_kSL#QG>|1j`M0)_sL4^t#g|{@FAKsl{XKrgBa{`In}D~G93TaC|7akRxf@l z2L5C<45HD&r^Bqn0=CE0luGSE?b!*|FvqIPB$rSrvB)rhy zdK9jW+L-+Ly$J2dK3M;EY-yibGRA+*IF@P!K0pw)@4_EG)JoL-H)LJE=(O!rAB`zP zUwu-yxna;3OXsyLKxLO3P6LiDnzldqq~78ByT1E3lK(r~$GSKDx&~8?cg6cVUk>&B z&1m~o3Z{f7@wc*Nt>Y~O27l51#f;CO(k0R21Ma_yAkt@|15te=aM-(CWXd!D(?@^2iBUza@KI@8ZiKZdoo`u9&&_6kL* z!Fy=fd-k6!)&J!HD+*Il)CAg25kCJ51wt+ZMNP0`eDBKt<-`BW8vb^+i-V#j5Uvnd z{$D5%!mTJ|^;}>u|381wUoPbT^ypjh6g5FtZGDRIzyGox_);ubcmQ4Xzp&%~r$zzVsl4~DRQPgVB^p>#+MxU=QRak@_=lzu<{`c_X z$0-Iu`-rJb^34LZ-I~m^-quP?vgYF)^`td(-h36#@W&CqgJMq-IGj{8NHfanN#Fo%RUt8H@km4OGXZgB7Ls^i;V9}1;@wvQjp}% zHK$yorz;m4-96^)s{OC%7pmVgJvW9q4}a-%&O+>8-1*=C>|e2(+l|j9@%3Uah;1Kt z+@62`NaXn_=jBV&0Ox*$|93On&pBs#Tvsr(TZ>H`xkgjDoX|5+*zR%ezg(|h5B}$v z@fF|ixLOT!`;NyZG{UL=Z@mbb&^CvEzT#iq_4m(km(QM&Bm!1Zp|y+b*_*~(8u9*u zDSUrM&un3r-v7>S7&FTs+oF`ZT)ml~8jxPvN+*-PnMd9^#` zc7TVi)7-xOpw7`qD^i~WBP{8RL71? zpDv;xiT_TV3m|)CHeyfa@#1bHUz`Hu&8^mVx0PrP9Ng}(oaKS1EpHtb`uMKsefl(S zCE_bHq~Pd-da0qxFj(*>@A#wG1+hmlh^wjVwhVvhm76Q>i$4j{AnNY7?@PltrPKi?3qcT2rO191SXIHihr} z104BwNVUQmzEOsr%6c`{1mx688bog{X8f%eSNtuAq5#-wloxURdf$&hi#|Z8E1aH0 zj2_OE;of5ui|%?ESdn_d28{`LkWDS|*%~bv1 zH9!wli;)9gVog5BEvOYe$YVQc-l$x|@7T7&ScGR!%?Hn1WodDZF7k`{pb?V8y*3mX zAc!z{5GSqVvbKA`M`P{yBmerXz6|-3u;;=p3{hm(_~#z2N&AJ#Rsx|nIeM9T*{FD5 z?G(~<$A!~-@~Y3WZa?D~tObo}POh19stvE{RrOoymA`zZ5!?QfmQ(S{b!h?ixdTNJ zyZ#5zOQd>s$5vc+t1AY7JiEq6Kox1d5#_A7SMNG=Pro&Vi*q0$!Q0YIEzqs1892(? z%kn>SF~!AvjW+>RkiZ9jq3r)yW47yOYw&`e+|HK7?@vBJpVQXE_Z}UxzsftW$?$uE zfZr3_r6eu)?P`Y-536ZTwm?{zBrIlD;q?xMaP7(Q(J9|!n^lYt-Q9E)8d}h zGI4$JbL&`fYcv&M~e4b~0%#*&g;F>wxZa5Vr;b10=;=SZFNHVbAlVt>TFerTCO~?Ai}{A`zEd5I&DL|yr%rN{oADzz zgOqO+8w*!lC1Vq7#UT^HCh_&l72cfS#D3NX4Yq)#*4!+BXd`TAvHS85E1XH-FbgEe zTpq*+{jeKHj>Z{1G~SrbHwnwtD+&OEM(a}}8BfCaQ+D$Fw@*xXENVZFms*N$phlUc ztanEoNT2@hvGiH~Y|-1dFZ;&{q?fwh>l_qSPGYda35SgLMzxm8{>rT3Sv{4b`>Q^N zd`9qCN~tb^-&91a=sH*y($}=dwAeuB^m1p;+!ha?i4)hNFEMVY7ju598&1!|TvA!d zFkQcy;A-bD6bPQZ|A*~p_Sse+N;52grYFUTJJAC}rofC2X3dNC2ObN+YM&jW(bTtH z5p=OMT@jjNYAkVYFKk4TOe|Y{N8@aB4Q0I7PmJHbL#oHNU&z-c=xx8od&l+hd#z)l zS!4vqhQtfS3_npuuJUh!maXSoxy}jRE5r`}~Kb_Xo7w{_V%MJUot$vOIt)!2W z6=@n6kpkQ?d`ZK>p?EM&4j5q7N}0Vq!;MG6l2HYkn)qmNzS+bIU)O5giktZ<#;#HY zXPK^I{C=17OnaH@r8nU%cXqc!d(t%(~5n5 z*WOO{CcgPX#1gelnT-RVS^h_{fX_kWm42}Nagc#L_T^6MbrINlX?Lz_9j}$#brxBE zQTw5)c*(34)V*$UwC@kf@Uq1o6)oEVqvRKgio7MyTEb;Rd4e(6Gc|CBA!1(Hqf$4e{SD@c(+X|gLjymoQ|HJD}lOJ++L8| z3X5G=c=eQCz{(Cu-cJg29{iLLwr5ykpv2<4q6Diluncgo4Eqks*vdkbrJH=0mFb>^ zUMh#CqBy}v!oXJ9EV0GonL+D7_ib?(2K})|@T{FVIlm=^ zcxMQCy|DmHq^I;+bUb&ivf^`ZS48s5!-lzZlNnWyyQgU;CcL!l{A}V*26bCqE7mqI zl7$AC7qW%rp>3#q4RDN4i7_%oQ0^It;2v71SyVN^?t;5}zX%D89V9?|c28z$dB57V z)vIkrH;c`uVC*>t%hP@;Cf4e0>$vvRFu;4M`Gk5E$d7Hy4w@X2toh@(6&a1RxV?Du zqiXpVAZ;1RPq>A&>a}?ao*ZAb+Hcu;p2GigCQ;T%%=L|!h>bFZR_3K~g1d9SvAQr} zvhZ?>0w6hHJYUS~(d(n?#lbke4c;^}GxXN!Pgb;50(kkvoB1l8KA##dy@mj_p)Pk~ zL{Sx`UYXLe-Ml8}YwCUXa!vZ~*1{%o3J>1UW#zf&veT9$veU3rO@3OO@q6q2#+rh- zw+)xndoGDgso87eh3og*3HXDbbE$kH>qQ>beK>OLso=Czg#~|<=R^F1m%}PgzWM(C zLnA`fH2LD{z7Y^p1uj|>OKj-&|Cx%+ub617h)ryRCxOlD2l^Jc3zSo7^xD22*S}3t zn5dy#Q}RCbG;ZI&3Xvi0quH9ac=(R6Fe9VU{UGqxxYn^3<}&7!OP)cQp)P^=Z$D zZ-hYGj$|;V_*yEATwFliBf}l3{Lf^~UpH2qW z54;Z>TRb6e#0uxBb>F__8U6hqdOx<4vxl3}_%^vik8A&JSlAKmRI5$$RsS)==hiDS z=Qy9Jp2mrJ?%tU@er{uTc$C>-RTHLscw}a7v0&j80OW45T4mtTDZo#fByy?Gyoie{ z4BQJ|Y!ii{IlIJF3#)SO%$=}753g-A?(8c}PXGK~tlQn!!_{h3YOtja6*JY~j*tkf zt}O-Pohw^oC5SDK?K7XZ;unwiFREej z%_CH?Laj$>Q3X=dyU$`Q8&@Ie4@sC5>U?+3O%GoZB+IG1=1KB~geekJ7{dr0&;L}} zmdZ266|)l_1!~7=L9O<~TS}*+)Uhb1NlqGLm&SZu+rFj<)X{7&m8o~gfrOAhNIA2} z6m77w?L3y0RU>p|QD-T!w$7Kxc}MJ?`f!MHG!QPSVR*Rry`gBSW>zX+(Z#sGTPHq4 zOtLxGI6jTQq4lA6i`ZC(9DuZCHQ)!VX$Ji{!N*7rin(Utn$XPO;sZHFmxxFlF&TFW z<6Fg)!07J}Q|soNo3RpyePfJC6J%DIoFv zUNmeKOBk^Hu*X;6#SLx|7FG`sv3V`g0$=CiaUN~Df@<)h-#JmyF^eFy{9x|!X>~IW zl_hTl4r}e_MOOmFH49>2%v7gpbZl74DzQB~Z*h7-Js~IlG&{`@2YK#Fn9L~x;IOS; zA-9AK2WO{(uQ1py%CJu5bI)WOHr1Y@Sd%f8yc2wVKVm{On|5PQZEhOcqVW3bg&RmY z9*q0T_zN|G3Hn?JQ@#Lk=k4d?8(cnX`Uem+ONkpq93do#7G8<~k)|wVya$A|EER6N z4{oeB6+dts;d7mK8qraSV2C~D>hQyH1E(rqmTW51DU^Sk^KA)og+74wZvAKljgUrRzWqa|C3wipt#AJf`k-Cln&*+sZKz zXbA!;9K2T3ze!N)%alo8n+tr(rJZJHj{|KdNC3mkrDb&EGeqoq*;;`9-9~~an4wtc z!|f-=?xsa>IorvGctCK`wm0)};h8Kht{n9kH0elmW=*@onahm;1IsAW#)*wr`c1~$0-%@vaKi?FLnBcn_iQScGaa9q za+(C_0jE~eTM@IRvKR3^xMT4b+5%qmn8RyuXDOi?^7Fu*n& zD&_g(w?2=a_4?Jgno~2D1sXic#Hh^MavdbbL!4-BalTOY>C;ocyRO$*UMyG)nRzGp z)U?G;1DsJHN|*#%8z@;To7jP^VxMUyJmBI6IIp1T%52x{X`PR%Y|{m+pKt7{Q`zuz zh$`3(r#T6!ENGf7X{K|%jDkJv5_~4LQUS3Y-XFW)l}LZOTO;#gAdHyEXKpr}5`H)U zpgTcwYbUwrs%8D=bV*{aHB+i5^V38Xl+UO5`?=gLy{I}z|DkScN{=KX{-if=QuHr* zqKFH+a!xVN_9ZVi-!ITgzESa70y2C5;Q9D%+8rE)1`S9q%34{pcp)o?X)KWjL7%O=wHX^YqV$*DCs5NY3pKQ zLR~jUkQ9J6rS>qvsLMUgDC&=G_QjhNSk(0Y}9En@_FMa zTr5u5vh&!_%G?=Qnex6Sxm&qe!E&(0m^aIel*;=&t-Ss#hbIU%vkOCNFe&gQb$RQM z*l%Pi4xTPWZ4{e3_z~O-a1ewazHKAFLa5sxL|ZRbLWp{CE?>Q>y?$=AL(TU2T*J%t zw7u<(^v%9>J6Ib)OHIOQFVtVyJC{GLt&@#f8_cuKx6q)8tRwCVt>!P{(2-o;)yaO1thJi*?&Ng5jvl zE3f*SvN&R&>ZL0@W)TZafG#9{-CnOv^_Fe@MaJ2t>CKRe7jruNlzF#c;JD>jRUzIX zfeQt2SmFhnNgrqVSq!KnB?qRYsLWvj+pU(DN2S!?Nlug*(qHRzP`MAlIid@Lao*-S zMG@p@@2C|9GiX3}R5D)}mD!1dMw@EZi!@Y$y2m(Zd@^gGD3_EK;Jj`-S}?Cdnng*r!KdfVy4R%Mj-^m3@?mTSF_dOArC$*;tg&~>1K5*OVj z+1lRoY* z4s5~COBKcJ{Oo|}<6N2mbNUsn1&M|7qBVzy=^P?O%zpmz)J>i_M&l^@I+65?1&s10 zNPAl`KgIk0W4tyx?MZ@(B}zO+OMM<88gKY)lA8Gi<+9en_Ns#914#sP@mPr3zpz(4 zRQ`_~%cJlP%o|Zb@Wl$g9X?4AVt*rz5=550=`b8}Y3!y?ew3VbDlYm} zFWm?MlV87L-Z&@aHF`f7e03{Jni^yBodKwmcvAV9CT*UUUFP+VPckov-&Lvm$?O-^ zq$_pCo6-Jto4A>7^u<SaI4w1?L<#D`DrgorPDPW60WkVN>2@7Q|KQGYjkH%{2U7Yy}w3e7q#h{+d(vUq`%XO_zd?qTnW&SNZ_^5<^Fe_BjkGaNL4l^SwI z)v~&`M;~{+twFUx=}Sz+>QXuQt(U9&EA3LBAT`aJ2Iqrl;irMp&=Z_nAOFDZXNt=W zZTETgCj?nNP?IY04@s>hy9EL*8p`COC1!Vfc<6X6d2lNcKr=Q{>CX*bSD;_knJRU? zddX|pu?OW!!G+^4+xc|r9h_U=@&n8j6gnmup-_I~5`jZL@wJ@ZRPC2?IZ_C5q1f#d z<$AP?vcVy$v;Hw;@uS4M81p>V)6WkC9Lex#yGx#VwBz?`K`4`jAElOuv*V3? z6}186&&+aOrpsxXFFC+nzxBb--wZWheesr(iCxVNGe}D*Sf6^f1H3*)TE}qf)RiU! z14lDI6_DNMV$FT`1C?O?xjqp~Us~Uh8r$Yr{C}RA_DVE$f5zwHBT+G5P+>c5M`9iS zX{9EqKU3!2;s|P zew~JygHl%U^WD4sf~<1!mKVLk)fqiVJE4k?uY9as3Mr0%?YZ@qs4&hn39eR4tTfT# zHQ?P8e=C?{(&VgxfUc)`S&?n9PqUu}@R+wou2&xw0cR}55x%qK7f4?3y5XI0$}yZ+ zjjbt27O-;Z+1!13Y2QZ9kx8z%3X`MS*iQcrTQ z2QiA5VtLJc`)cr?1FpLXo>mT-NE&-K#N2}X7zAPi$_|$nCM0RR_HbdUrV-`et0A#0YH;l=NlCD|m zDg>b9V~}{I%`Pg{I^j)w&jQRIi&xUOJ%?fYI^Q~8yUA}n zFc|pQIpG@YZt>=S$07d2`PCiIrhQ)EkC-~FvfEZ{kq!XncApPvlk6w49!)ysPV_8{ zQO*-~Bm9zMh8FkULAb(deS7fbCLwSPPj8NZys!wjM1H&|w1W9t#-Jz*X}1Ap#{M>w zLGN#d{uEMbkA&z)=MK;~4rFlFK*u>R*MSdrgi1{7>!B<&4IPCB%XRf!0xU^Gl#Z#a zc)=t!Ru99^KmEq&%?V|C6XEsYiP3lFh`n(F_eBlLv@#U%hatVD_l28?lL7ca#y&D> zqrq~Up;;6gZWbI)AMSFy{+Eh?hGAsYbR8?tl}BlgK&iqdK<4hOoGd}%rXtVMjapIf zxxqR=p1`Oj28aY>XE1uBMIP~*OGjn>qe7t7e&M-G*Rgnn_okccPNMVTEGX+1CDEqu zr7+or~Kd!zJac6iINsBQVyl+vs#eUyeVW;kUXGc)0;9sr{Z0CyuHM()f z4q)&H#Y*wT``;UZ?_RW;)tBE~s_YO%1e~Fqm9INfZ&}Xp0r7%X<)JdBBj}U&Q-ytg zr$;p%*9!(5q_sfZ5+n_MDRgQHqdAcD*OL4*ivj)Q+tAmJbsC7-jQV;KCwN*QB-@atqx9v;oP?p4gLP z_*B7;8LP)k(%4P`xv|??oK(0^$H*A_tr{9a+#Hv76Mp#c@O<3Ld`uLp3)?`TDQLko zB!)Th>k~C>WwotlU!I)^oa=4Ztq3n*b`LF}*Nn7NS?xPyhS^2W$=i4^2sP1!%G%@~ z*o4OVUJaaqIjR&_CS}$PP&?+v8hM~d5vI9MlX=JK^{wN})H)#mepF$YaZ>_J0Z^t2 z3g)+z7zL$0H0pL9BasyZk)@nt>RbNsTQN3D$xDL=d~tmonFPJC;kwC^8&a6QJIEck zB2$*9>0IR(K5z^9Y(TR71XEX>$1Xn)IrXrW1mo_`@5?#58%GbGaIRCpA3;E)|AGqU z$hFwVwH>#Qx9B<0T7En~B_`$k#?*H!N<+yTcMb7axvjR}Xo3cm531NDwWwQ5eQ;|w zzpk}Kab=m!Ru$U}|B<$|{d!7}^nzr_Z zhiOx?%lo2jFuoc)q{pSG+O?*D88<(dJExcjOpz$Jw{I=caXj%54MNKB!e(m%SMja7 zF8t1owXK>G{qOv%KZl9CEEeb601axDJ#3Mgf0CY&SCuv^v|CHgSlHcK z!-Os&cOQYJOCAE!LOE_Bg!>zuqC7x)@e(c3j1y(bcZT-0xLa?bZ>M&D$e=g(7oc3m zYi2gX+d33h)#W|AV*QelJl<~tV33SUty%7ESJ7JM1T8&0Muj!7MloB{ezry!0dQl; zugUQiZhA#+-S@q!SMEX<>7%L~J*+8o233w5nOB6^=9!ZXSeVeBoM6J9L!E%7;D`@A zrpW*%XuslmMVi>Zi#ne@A3%}7rA#IcQnu*j^yWGr-QuHaLfo!HoQ7v}UXg`ccPXcy z)-ZpGvwJKT2#llS-A~YBA81cj9bfvrh8%m_3u{n;N}9|NDomQ~IngRSn;Oqnr~&k8 zkH=Xvs_k2j)=?ijlr>nyebs-xQj{sGOlwEIlf zfSe1G0ipHbHceGVbVGXJ>$>#=2&|@$xD~1){fmXBxJ~!K+AiAg0dUeNBh981Oc*Si z3#3?6&`hxsbbp8-gx4XCk)=vrB*jK(jXhT#zig7VuoC&ONJ?u#s$go*L|_YEFq-Fd z={j>YLd;~rpfOF#3EnKfau;FQ<6n>0*Bd(z&2aPTX+BWEl67L+_pa2gGj~WLZT8Y4 z=y}#^AnNL&(_{7_4ib)E3T((mBrQJa<87j5>d894DWyUoW4@iEW;Q@-3v37y&XhVJ zvl49sU)xqYe9#^l+B%TMxrGq%;Fj!_q&!bSBYVy6@!=35H zf#YOtmF%f=`|0&>n{^}9|3sDg3!Vrqd(-_TgYaVKa^FKTs=XQ;_UaGmQLy`%$29n7&ieoxXjK{9qsLbL;*0jfV9oeo!fuzdX40& zE_5{P5ur8Ve(;qhSkGRVRgKXBwvIS=JLC~#D|1ezj+sweP|08=Fzt20fJA_+{FPyR zj`8M+-lyjQlrp^(Fa*(X&DW#Y-)24ryE+Rr$JT-FO_UnA8*j`toW79(@u|EH%a!%H zKkpxyo_H=z0XrpUrRS4NWeS<4XCnjZ${Ndrrt$?Up4WLJ_)IG?ayR+Je|iix*z4Ms zc`pszVS}}Ju9xwTS0?C)fwU^slFuKpH}@xTsV|8PkU(R$m%I)->!yV;`4vEI6xbOB>J(}^(Q)9#~&<~q(1eTjQl|jXwCJayo5kINHkF7%N zq!@VhMzVI2ZQBl-m*wmZ?za@#Mg-K8uiP4TWvzQ0Y>rly2d6 z_9H`Sa&xVd>sfS?aMT5@!>hP-ZC#836SC$7q(hsF6YfhnvUUpk5cSW1fkmZ4e z***M+HXJff{=ms&cb~DYvUQS!%d*`qN+Zi7P4H_GC!sA(R);J4v=hTmoOG>4W^!Ki zYE-i?%%fyC@p(Pb13#(s*U*9ACkAA_fn#Go{aLo(>s}wBl`gboTWJH#DSf!36K+2qkpo4HS)9+ENMnqPXRQZxT2o$`ycESoMG&>cCdTRwi`7Um(fr5H8p;QXMe&`mK) zVKw<=-N>Ah!UuQIe)4S37tN~lAa-gL(eW_v=!NUFrLbf!(Tm@4LCzkJdRv|r?aw(* zs4avZ7F@^fx(?NCmhiAP??;y(+U8^y7f%OLNHCPnI*dejntC&dKxM8-vI$GEF{PwX za7jAeR_;t@3Gk*h5oFr~mJbGJUeHW&?G;<2?EktFYso>RsLBWUFuQxP%F2 zW?ymeCMmy|;65q+7M>YC*U#NXPTN_JL?uH0eUsr%;*XNGJbvBO+>vd#}aYOiACASP~-IkGt2HuK_U5 zoh7}?5pE3`u9CffgY`^YeeOzd%65`W!)9CqkmPmxuZ;$ip+LnyiFdY5Ej)&M&{+41qj z-X%}n6{5rGYjc@hzjq2BXJk&ibZl64SrmBW5VAs>)W_=AS=|jAJ`141dX-9+h|_mD zc^nV=SxL*o8TQGqBgJkA{Y64!!%)eNKgdl>GMY}442*5Lbi9PCAqXAC)V&(2X8MD) zaGnha-b<^~%XJp#F@-nzQ)=_AO}(ex(ff^-?*v#Q8Ey7KH%eZHS(AJcdFj^U-W)zg zRvi1+NqI0#iEK1g=BOn;)Os0#pl*zmRl?92qrq&PU9;`<>bWOi4#fE6<~Va z42i<|$%o=MP^Ff}Os~SQRYpUO8vy(E0hDCGqj`KUvK!#Jx$mEgMiaXNwkKuS%LARY zq~$!ZYI(8>L$H2=tut6{Y?fV_{>9MyFRv8D#Px%eemumhP?L9@ zwl{NYzYcKXUcN5*tuA@JKG?%v*)JpdAji~NH{GZKGCaEY{i3(I=iEFE-qDdaP-=Za zw_8e=UCuFs80Lb++#ZtiVhl5CLes-;r_wT^G-9=q1YYtX{sj z1*VpN)#ewvVqItkI*AvCA;?m?f@#VEQS7VeQ~AAUrB%%{!^$d_Eo_DK{)e@Gki>pS zBg{|UEopWaSBUhJo#<*IY!zj-z{}2j)@2@uzi7xFmr0-2nS6K3p*coxKf>)Or=MRJxXIh;=IW7lE~Jc zw}M(7#?cr*e^6wZZxTKL$|7E}uKbA)UTIi=dG6+oI>egvEjzyVKI@;muTdHvSslhu z$FZkW_fJ;lcU8n9|P4WPOFzvYI>1f_Q8^MCs(gBe;$eEvruB6_-CZ5$ zN)Qg;x@tgl<=jnju95_2xuWo7dsb*Gj(-o`FvsLhh$AxS%@m@i*9iGXtm8Y8rkC0FW7$DThm(ah$4#Ej3$vEw*)-BY94u*|&5zXBK#Y%~ z03HKVO*`uA3NDh%qkmT+Rb!W-_z4jel zt<~|Hq77?7Za?WMQ1;l2g|{!3QX%f8(0zXJ2z-_}BgcN1#6xK)?$Frf-K^K`by zsmd8Uu*aKLesHDA{is^apqbktu4do0lkblgZhfMxSokeGYR7vG)q(HqX6ABRqmY)W zdZHPROEQ03?L5D?Md4g_m0UH-c|1sE*9Z`%j-qlJGrS^poq+KyQL%4SnSoO|>-ZIq zp8JD~N-F4f*(}-lxU!ut2P3lYE8Ot0{^T*Z7ciJ6TwuVv8Xht%GOz#&<^;#g(#GNz zH^u2h=+gfm_Rce^scrk)N5z5)D5ywR2_Rj%bQBN*geFBo6R80L(mRMEh>FzE1JZl% z9R=wS2t7a|HS{1ILV366o^#9pwsXF|<9^E+?1a77+H1|Z=KRfPCMrGK8Zii?Xq4nm zF}V)bi_aF^=)SWjnq(EF;oSKMwV>4lt({J_+Tn!{D?MqoQKr7??3P?UhIpx4^g>QE z#>-Mrt=tpAQ<4pz$Hkb9jeeOCrGUoBd%tK6R-BLsvepzprc*R6RIy&{oYW4NrnsnP z5S_$y%yxHr@A&Ztm82j*wpch6ddfFnl7AQ_NmY) zhLv6vlBYifvzXV-*L(ymhw~h4;$2+jJ-G}Eqg0YaAGL)r@-}fD_p<7UGH_@Y+*fPr zhji)OpS6AO3elEKX8n}$@|KAUlZg_yl$LR(>VB6U46_-o7;LIqWz#?|*(Yk*wNVj( zEZN?9<#q^ODrGTG1=pil7?GLnpt~}JvEq$#wLFiLdI=a&3 zO0sl9)O{nZHb3DmR*SW<8f8Y$^a@BA2QETWWHu1V-(9c~y#F)@%D}Fl8D++AKITID7=j(h z3>Ha~rnN&&U;TXZYoy`om%)8bx>w;!|+iU3ag%wyXLC_s#s`PU0`-xEDb@CFFWD_i6Jd1Zej14OeqbdvZ zq2gllc7tAyTYiRzXkt!guYLpxL z!0d8K$O=J zH)uJx@r7B~^kL{h5W9^q;dE=E2Qi30@P(E=zzk9Y(m_0*21RxBO24V8SeDMd_0$i( zgqJSc9ekoD(e49E&?X$m$S6z7A&i9c8wEg zQ6aind+mNvrEc54$&0nv$WV55Md=N`jzs$fldaIV{- zypQeJ=OmTeBGAB4dh>IS%zK1)K{pbWJbRaS2)D686W+rBsKjdBv$ zC_Z-A8fS#gesrwZzI3I+3F}paEU|sJf`1e=JjVx-pgV4I*gf7j;>ua7W4#XFA*|Sb zje>d!H{iwvvf}3|vBIA-b`LWkd7oUC`=Rkw%eKZg=k>EZRM%ftiiV0sI-Mjgr7ElV zN|}@jIiJxLf6GD0Y~JW^q7v)fswv~n zRA6gN4SqI?27Gy?7@mRk3a_nAmhq*O$wfS zymBlC*3WT<*KB0|$R{)*xtO2$a(#&AD&vzfoNtCr^>mS#2X6$?Qs zGoi|C2TjZKXLd#$4r8lr-UR7mo^6;sMPLP0!480SKdDyu1j>9 z>}dDu-Fy?DJ+BpnW}%Y2?_(6dK1!1ROQhWVI64D-ch(ahRuqGbWLNGR=M(bphUuxC z)d^*dOE1ZJHlMeIeuZHh198IY>hj$l>j;&}rAC%#+)Pml)a~08N-Ba^nS)u38zY`d z#ksVx@-F$fv+7G4NFujkNcrV@=T=5WA!oyWts4ouP}Kw5bv>{8TG7$8i&l=qTfG9{ zxA(4}H%VOSSJDN_?SgrpX19wf%UB59L}l(aK`ub9Ml_v}m2~Pu;VSwA5@*m;vBz$Q z@2?(nJo}XRG5b>nG0lrN)u?KBco#|piYgR1;wp!BPOMz`vX(R>QG&gocnJmBJ0<5e zV>4uCj6`@!ig*}jnQCvBY^z8FPWP|e4`VBEE1htWkj(n6N){-k>SrONpqBsv6-PG; z!qS@pY}CKuTsiJ5x~?DTI^Je{O%OcdQ?vrF)me@{v}*}NQN|ay^+`At z!a4KVV<85&_D_b6lh4c)lT|O@>fnW@N=QNcqNH7q0_Yzon-~cqABNML)`Li#J zmP;Ho0<|rnJa3-eIYmZvtMDtX0uJ&Uo~@iOjBt?ax!` zBwuA*H2t||w`Bn{7<>5zbeJm(Y^AJ3P;(yb+f9&tm0plA>r>CZ{u=l&1D|94=Y#)W zj|;!K2%N=-dll%~DXQIrS0}vPk%r>;-u&D+uJOpAZ!x_EG0UKJB0M;&fA47e?+IXc z9+A}Ud28I_fm*j)pIDiCd^TdJ1I-projUL{uKdmdPy)<9TZicFpB<1DKb;k^M~|?S zNz6cMHcTClVh+ENpDcissZ~iB zV*y0mnzdTsr5%Gk8@d22;0rfHKraVb;YiXtkmXk%tepLDuMcP3S+r8-D?yPxh@;y- zhcf@RCI7>x+x}4^d5_y(4Mp(3)pH7so;$zogWmfP_zxHT2QpK0!JVIXk`ZL% z!3HBM(Q9ZAjN|J`WS;WhcUH}#i4fRcUz>jztQcl?*@{{CHl6$5<72xR+D3-CWYAEg?w)wPzH zoBgLr{QVI0+k`bMze?xkrTles_@lQM%m!?KGvoaHe_~F*v&f*MsY&Vn?R)aifADXm zx&!0m&0&>+{q4kbtoLCn4Uulk%rx=qvxh!2e$x`7TSQ z?J8_m^zjjen!|AUK1Iu=KVkQNIeT)cSRz$gY5VV45C84oQz`;Z2FYu)+ke9HHUG?$ zA8Djg{0WC4Oy;K(cn#F@_g>L|GteiO0IM8I>GOXF>OVLRfW!sxGW_q*T=;KK{&zpR zp#XSIeo>3R9t!`UD+me$JUUX6&c8O?_-_vbOyw(SU=R+{9kgn*;e|CSJ74gP0^04m%6 ze^$u<6$vey-c>5k`O*NRhD5Hy9gD_}<{LSn2j;m62e)cO{;)@sdb64(qO#AJJiIK1 z7d(dG9C%zjdw7{7U4@Vj;1k=%1QVS|DIj3%=^5|sqZ$5LxUIJ8eM~6QduBp zAeb)NSRR-Wz3$sT;A;GOiOjuA=_&zykv(BwOhC3QaU#s|R|W#ae3JhJ&y(Y<2pp}` zfp{QF{p4-I+{UAkKOb`iLewXYiv=4eQ-XUPM3=#O#N?$v=w--oojp^ss#aOYYj_vN zDcaysxW{SeSZh}J7f!xEi2d5FTdV+?u4GiF(VGSkrrP9>($ITDg>8?zck?teQi0@+ z)QBl%TFZcG`+TxrrSkLVpNDewxcOAW&Dtl69m+^9UQ|wbd>(X)JcyWdIjMY60f0XB zln`8ZYaHiQG)Jo}3BKcXZpmid(b`=xoKysxD*}5pK&H@fr|agAy;IpAQtan`^|V0Q zuTHqqrKzS2^J+;*Cd*TbNQ6uu{N223eTU8j_}Ptt^Z{w;nz*ZyH5H0eJ2xPh;bxVw z7527&I-_YlA4enVa4YbGt3rvle}sr72M(EPJLPg;WtYjRfKj{dF%%s47{oIxM1Wx<=90O4(bUSn1a6A61nsr5Y? z!g5vYCWt_BaG%lwQx0RX+0Bn&wsZyZvpnoNrP=9U@F znz$}xY^RQ^THW%s-$ght**7XZov2z5V>ecbj4)SHs^cl3l8LzcFMMfx|47y|hu^Tr z4Q|Ef|Nb!a;%2O*TZ*^|XKkOD$#(d{+UlI_+F;6*siW>&$I8bytF|*RaKkFc0ww(X(l+lOKvqsIIdEc0=0f1#qi3;z20k5;4dekq0r2X}UVJp8Q zMjK6k3N?K$Zbx?wbAB5`B_jc7L@B;IS~5W#rX1>2n1Xs0b40^Bz9Z@}BkdJR{Sm-^ zcCN3@zWz13Z+G3_8vuR~sFO6#m-LDB?r2nzCOwZnQ84Dek5qJ}6x?d1W;C zZ*NU=2<1b^?bvOvUTv#;nKtg0i;8YvM}8vEDsr#;$qp~CQnC5L^Imf6pCnkhoOU7B z-@_j6-hJ6Z5Bfz7)}Yl1sj2Qd5~7|Q#Z(986^;19y!J1rmRkbkiWued;ORF2RQ}yW;e(dv!C}wGQNpu*b=`oyd29p7Q&gzDsUCdi!A> z5K+&HTvGVEB+JVyR}5+#<&Do8*CeyCSK+>glI7 z{Z8jW%byTWbdG1PTzENse zCeF7XZbd*VY}yRP;+YjbGSc=k3jg({M-{$nsfVe=iA^P~b`~N*hPCCT8|}$v?R|!> zIg3D(E+v`VcgAv(Mb_WCgi23PA;7j^u{4wtg69!WSO-v~wqX|k--1ZJFZ3ps>_E4x z3r=mzMpGv~+~l@Z8jk_`9w%V-a7%PM8f*-UUVLjS1he6I>A8;ZG|g)DM>+1gqDzPF z7s1Iqhcqy;I)0wyi$2nL?q^(nxAhrh^#KS>`i~Z}bl)i=C_^=EbAUAg|P52%uQ8qa}nfO6ex2 zVy+f@8sk@+U$<~M%Ei&W^GleF2Cr>nKYbS2AiqW5UaG&dh$n!Iu~|gh=M25H%(xe4 z2bSOb%{`9$UYG9QtG;xS9;*Jn2`%AMDUerGGUtCe|2)|}JJKCV<(f5Q(&#tRvA z?mtVmMmPj-Z7%rWsBJwRu{D?ExIXhm0o6g#Dl`I$?XHA?gz^eE+?l;kxjH^$l53*j z{Wm(ZjS6x@E?OVKWKNBy+ipr$4Z=bMRFg$@ch{uvoSt|+S+C>G6SToRvyOZAVy1PP zy6K%=&(h%z-R9P7`BIZN!FS_9Wlt@tUDyKm4F;d2iqr;%PM?3^!&=zL7p{m|vWT-5WhHeC&=4%JelS=e@CB8@)qtBq*iw4?}wS}yCmEGv>TIG+LDMXWPbGGMC1;| zyz;#YPEZX0`AE#Ds6bB-TDxE8x*9!|xj7P66i8IT9Qu4?DqXI^nYWK19S`SV>{{hv zT17vq3qIdOEbGZO(gH^Nbglqr&tj>X93E_HU>w_sUX};X?__*--KompG@q@7Xf`^E z<~(OqtwZ<%@Y0#qGZxif@n-8E4>ng)=QmAIeVa0UtFCVNUiTpZ-*|5E%C)Geg`>y> zUL2#(%=H|j71GW)@hqnfb(D=x5hCMCOec;`MESy2N}#-d(u1RJds|ezpexH-BA`Q+ECLF`gr9%UTS?wIMxXc_R=JY7p`%&3cGjfTeQyi! z^{}ppoUj}>-R4@uR7O`4$}g80Sb~(Jhge(7ZI6Ak=V@=Ff6;70UF?h{G$C?B1Ifr4 zj`6Y1tCKB-_?i;d&%MYdna11u1?3)FLIK5rwNvGlj@7rLF}8j}PF)Cre_cY{(QzSvYNllfK<_QQ`%BMKxYGMj`a zI9PC3Y1rR19vN4Ije{td5Vd3pZ!t!pHCCPcabiA|R(eM&ar~a^7}jF>z2gl+Tv=rk zP@Y3kp+=St`%d__0GSU2mv0RN(&)sU{uF5+pwijvn+HzXY0HOTBb~G*ct_|*dk#87 zU-5BLnfJsllHYop#G`(hncr;VmA=whr`<0CKb_>}f-8#z1{6;6uqN;yq$?U!V>LFR z41MaO>w`p7a2&@GCaYcltwa`Xz6MY_Rf}y* zlC$rYddYIIKUhK@S=ZYv6>-ibJUadgvik;V+aJa0r(*|A6cA|l5x2Cq_ib&5J4@GD zjh21Z55>gzw5C*x%2+S?9)TBMvwC8aM4Fas-SU>M1?N>7l?CaSujdNpQi|Q}UTU9A zkY!%>iC2rgY?uW98lk*vUYH;J6$C$ST#I*Ra?#G@HL^FyzcM8d937WlG$@%npb+jyO!jxu>?Zi!K+Op!Ix zsH&!uQGjMNa=eoEB0L>kW$x)TSnPG3>eA$OAUb{T`EdT)C#I^HXm034YXNe?75wGi z`PEyxg$9T-4Nc`>H8I&d=cPksUp;FkbIzz}U*o;-Irhh=sISDArj2y=0A~j80#4>@ z=t8j^^$hS@;b)Ar`+wIz9;aqioS@mehZPmqyP}4`Q(PR6O5?%tuj8_n5BniF1>7Y!o9t34+0l0kP-o#j!{Gp!w8^Lpp zjw~?^`_?vbeCGK%8(Lr275uF3J(Y}9PoJ>ys)8s3K=QZ++C)|?R99~EW6Af?z2$pTXS^PBj{ z3p>_IfK+kKyI@nh3@fniB50yQh*gdk49>^xS9uG)d{+*~4L3;SQb~I5y0F>$jMX3| zQO(UVdZpVUG!k>-UWQUa#|K@Y08t31w&dvxWuhir+{Im2=?1SweO#}a&(8u6~<&;w%EwDZP!k1 z|Ml;^2D%z=QrR7fmjUhqM28`P^@ zAY)`zjw!e%l=#5aJ?gBXTiGf7zeo_iBoU0>UMC{gx({7!x}FX*0U%Q3JQfuvX*V?3 znvqIzYuD&oqm;vDy4MMeN+6gEX46$Zz8=8MU{vDT%LbQFGxeuEEh+h0g^iKc;Sn58 zdEAKk1b8p2<4&4&Mo-1*(_OVp-yt{=F&{JUe_NmOlAkq>?-?o}T4q9hp&E2q-#{me zGzvoj1&N}JVTDL+OudIww-lA`pnEdbDhF&D5J{P3kI;RhtFQe=N`$ z(84HD0{Ou=r)7vtfKp5&bzmNnSF4Sf=>+LTWSei~Ptn|G2t<}-MRVw#g$+IkxzURp z)0#h28;LXjl_FZSE6qJyXAwc<2Sr$CMAk)C>cDGmv9hmFM3O8BLY||SpF(eT!=OS+ zRF&o0yi{T}J$mh19@Chx0B(q)SH=?#_9T&Dg9pQ3fTj`_R56~R6v+Phnueq|k@pce zEefv!9qUdfzgJ76E_&rBxxZ3GMJ^;p^BMAw&t-|MWK`{Iy=%klDSb?+xG#sz=`-F_;+)e#E7u2WWwXFxkHhi9 z&Ex)o(&yOJ2Vi~Z4`r%Kbi(QmKP$V6zRF>W&#HKF)uN~czutP5YGQ;N&dPF+IO0{H z!cv&I+Y+jCBUZpC$$Qtqcxl^CmqyyOoPkGE*WjUjiMUDLU^|oI+65t&U;v)+?m)9r zAvj12e6#2`siZ>12tN!sv^s(iX0$`%Ey`cJf568HG)a$|rouZ#EjOR*dj$frRLhWYYEt9(`m<>rC`^5UT zdU9qb?ZniIa&&O$=OY{8rs;X$dxItbt7h)_vn;h3*dL1+e^2ezZ_s2d#hEsK4(HDV zHSYnBp;P$1yoWk{qHM?4MMz)D_lCuspYN@jm`GvXDO6-2kNOAC$}xz>#GAsGqEH?8@WDmGCvWtcZ+1j4Gs$jD2eS^xNr7uUrayq;GMjl4_8% zyIcr<2-e?&JsO{HQCst1Ra;kj6%0PokeGQ#tA-RXO$A?8Hl;Ake(uYzR~oD3J;zQw zZ0{VDWq|`8PPH4(*R7`pwkN$+tk$(Ub7^} zrVGM7ky){0aJga3>U+28Aey^qoxa0ykU7jT+>J8I)ui{6jc|@~RzuK}A&PA9Sp`T1>yUc=*jZS&bvXuF)TfE9 zU)GO&qE@+b{`~pQX5Tk!+Y@WJh(Ok96=1hEM}-?+_;mYuuAMx=FUpne=r=`x|FfG` z=*JCn{3ubPFk-m%UO;6`R~zopr%$s#>^2%&0E zbR7Y~wR6?`q!N$CySHls!Pguy18MDvo$4swN-J6p6J^4~M1FX*p@Q;9o44GA%;9`* zZMrQZ)KTofKtLqydzoUZFvUXEkcT~d$4+~PSIHjK;DkD++XVkg{3S}fp>T%bmU`ZR4RQGcYLZlN zv?5>qA%s%{wkn&TV;R3cJEU%7{dI)e*w-`?nRp%=$5HCqJ87G}7QoJvB1`ZPhJ22f z^m!fP0-)l@8t&Kfv4z}KjTQX1o;6Iz8>BSm=vpXJ=sVDq<&)zuaL`m8(f@+h&v~~9 zMTlKC0$|4i#(CW$*3U*8CmYy63)F+RP1V(loh}W8Q%NMWIV+IUS^0RycO8aT04ta} z;qs1Z>ZF39cs0&GoPl7+wMYL#EwZXULBJqIr<=pDc}KE(PYhc`9eY_P3srZ*z2hll z2uz^mR3hu6+$Gb(X+?a(tWoV@GGr{*UUY=X$o`z6;leNjXLng+csf{cFcZ-w_EsPu)h-zi zbaNY{$Sl>-iq~oGiWLi=n-+}phzIYd4VOX*(F~y9lPl8vgP&7TUIr(=FV^08G%Cu)3$w_s7nylm&5KTB*TiRUV`7N{r&=r^VtWt4o%K-H9$cdQV7~?C zs)I;4;#1BGJ(8cuA1_4RRoy$q)@zr~L<#?-ga*M!?rxSNIJ6A}KYw3wIQe>>-N)&f zY*s|XRL5)()#r`a`6Ta3uwtAY1FPCZp`q7gcY+XnE@?N({ky;I`gim_Dz2AMY<&%U zn5SS8A*5_!S$WX1FD>e^8MXSLeV~rKVoCJC8hYGWwuUW39dFiHwh*4m;g_-g?Q&lO zNas73L&rt`!U;Vzs9mi+2PPa1nlKC1bmh2L__W*AH5#GV7>i~~s`?}2-FHW8ajVQ; zyS6FR@w%Sv$wkq;#&&zFk!)%cOR@D#+XjhyqfQH+p3#kNOdTqVqRUerZfT-~;mh;g z@m;o--i=i|4H~Np{l9p^{~C(_TQ=cU6RFjUC;_fi@*sTP3mtc#_2+hN&M(Z6keeI@ zcW`BUc#E;RQ*f^sYE13{TT(XhrQQ9j_I_fg4o`!PfVL?^*@LavOIf4_s)Nf5v@1#; z0>adhv5}Tn2g=ZmPF#4s&>D{xB|7H8Y1#@8J38ckTA95MxxH2A*@La|;l$f{jqhL| zHS*j=N9UX(wX&G6F9OeOmIYCGq>ckF!Hix%erI>pB}-v-wLbJ)%Q7M{K$KAJWAKuj8`dp{_z2ny%q;7;ijq8q=P_EA9giS;*5l6n}7v0AC@Qfn#JY%VLzVmGCE;IZvtVg}~W21NH&W8?~dwlie%bqbjMiFl= zl8;`QX`Nv~|-i0gFaxJ3LRfBV(AYzU|E z64MH1H^Dkxb;UezbWp(zj>4Xk(*2>5xM_6PvTt==F9>pA2ltX#r~H)>+N@%=VcN)5 z>VF49t`v7~jso>zL7?wFqN&@SQ@0zJP&JPJo;0ysej(6Xh)_2xK``hx$qfq}M!B=6C9rIjU-Xj4I z2wNKl>m=?H_$B8<=ezSoZ;I+pehKX)esP)rd^&d~o*^4AsJzYFjG#p1k^KAXI~%yvpI&I6sQ_o^bVa-M+-`F4d$ zD`piYk5$K!=Vei3!3>nBzQi|d1R@aN4r%%!k33mr8*0snS>1RO zZSk;(`ljfkQZpy-41|DA=y>GD@ft=oHaq5t> z4A=REh&R^#I+WSquOX!XS?`KvwH`H&?02^6GEXS%TJU+afFY?vp_ba`Z8Dh$Y~$&7 z!)ZKA+GERHo9OmP-b-yKKdN~Q&UiF`V;8zVJs}it*<*3S1?V|Jy7<*Nr**T;nT+@2 z6{t85OnJPHNvLL`YvyQZy+()9E=G>guQYdi39BYtI00%u6}1a8FnC}eZU_ltcZRAE z!$Dw0i$#yn&Ge9XVQ2E|>t#A8weDqduw1ReT&hML)$n_B-H(mCMOi;cJw z$}<`a>bFJcKm&EfnJO-1A&YvCl=3J`(Hhh^Q-q_)jN;n zBKWj{KHCh!ktwtdq4V{s^L)ROK#6qXzNJS+INf#4slF4XSdMI3_1luJsZ;VYuU0}` zE&ckOB3kbz7dT_b%L-8+#nwDjeAcD}?>KdtK6^x%#})~N!xqXN_~D22aeOv~Kz=z$ zXecQ9DU+yo7_qRS3~%5AMvB>jVFVuqyvyUr@A#<~o4y-dNWx^pQiC7f<#K4cxFvSY zx6zfm|G2Tg%gAGE?i2d1-DJHfpAu&o)X{IDgvvW(g=&M5vDtq1QB@tQ17 zECMWQ@y)FEa4Zw3`?QwTengqOwrSSV0IWHGnI&8WMm0Wn4}!*&vnevNCuv1v>1j2B zn0v0hZOz^SNYj;O3+~q|Zb(HN3*78TB;kV`cDV|4a;F|ImePssn%uw;^ozhn4*0o5 zu;P}j-e6telgSsh&Uz048Ytvm;)s&bEK>*9Q;VBC@PLhT>|g3 z#ml=txOMNEzs%4nf%1#$%w}rmtZ!*njFhY=yQ5P_3$YAmiAUsV>0oUqHY<~Tmj!d? zJE6lpyr^%k9bemelcGHY{3_dXpvM|}KkO`}ODAK#HQ+`FRS{9wK`%r(v2K1k;x&G_ zN0vIVcvIG;kH4R)_X=NOC3Q>X_`KRDZJ)xG3AV&7l*>9v8dNB^PED2SZQ@AEvAE{I zRc2~r=9zN@00v4N5MNJRxEd0}J#p+BZI{P_Z6E|Vjf~=3fKFD(h<)i(HR0OP#utQy*P#aN0x(t<3lLc9~7DZdUev>LgB| z5Dk;7DrBe06qcNKH?EKFI2(CM8#ju!*6bbKp^ExwJ*atd=sU1CI!LzMRcDVoX*!dN zp&t3G4&!f%lvK{od=Ii3u(<^SOItM#gE6b#1+9V`AEZo1*tJVz7hCE)$lu0rMqFO* ztAx@t2IkNgQ4}~fSxjAsvpZbgu7VQ_BPKur2oAkTZ2qFHTOMDB?YIFS8=aq^10%{z z&@y>iQoN)Q$ceN}*qd!3XO}&J1naUdrg5-KYBymZ3OHJ*PoQ%<-ovPyqE zV*R=U(YFTm``Wd1^fT^~`<%Qh0Lu|h}hDg==jIFO0KiX^i!S@E72-tz@N+)% z9-?wNgSn_QW5vAt_H&~9av~><3jV-awKNuAY6hmPj%-WfN>ITFE6vtCd@@+4f+!_# zF%${1K?7-!^eB#Rk-_Aai*tgm{N1{7t%U&#r*wR9sCEH-R&clE^jR^Nft$8PVZCkS zSLcqdPc408)3m0Z^py&C?)hi?%-$GaoY^Ratei$@w6u*0*#58Np4d^%(kn_DQD{($Gg@gTk?hp<&9#jjn$+lWFpuo4w%-~Ru%Z4 zCJCxFPVUBb#}sY=?Tsz=?@4B5T=A{wcAD>nCI4U6r0Y+J!n*cj-c-28(kKrdj%qj`v13gb|Ph9x0#^4zgQyVf(i4%c;YVzL^K8 z(cS`nPMu>rJT;F&v!vGdxnzsUNz^%hzg;!-{*q@3Wo3C&l_sgOTlB2It!wh3X-iwv z)F771&z}6$pkZ`)G`=-m_Th<11U@lSc0&^0^-Yal{P7bn65WvkoSCje;O!yD9nT;$ z_qF}tNPfqmhs6FmkSQ9l0v)bf3%^J<3T&qpHCj31Mhe8exgB*q#TUZo@HI2xX{YXu zADs`sT)Z;wqH|ip`qkyln>TA2`PA{hvjDvGaRP$> z#)O>3E<351ew?UWD{lmnG>%MA)3^5Zhp*Wg`IRyC2l2?FVd9Rb+)yf=Y{90Y{GMHq zp9n^BO^u3-qYj&AsiK{?7WCSz^TH@mgSa0BR;fiqi|6Ip_4!kMaqQHxzg!gOUoiKc zW=4%kZ0_@5uIE+z{h)%wIVHwH4t-Tl`@oICN>_!?^bhSK>g;qfaxEwuQ_+qV4lI5! zb9RW%311DFeKZ4_{cIP6z}0@6}pvtOjCUAhMhuA)0I+?ujr6_7o2#k#{FU!abhcVFe0sJeJPK zr>MCSCYdFrk5sVUKj3v*c}7BBIXPavK}>mEdZiZ8%$Z6pRmNnID@H9zACK+ox0gp0 z0?BEwn;tzb6#Jx(sk zre3F`D8yY*DddJd>qQQs9j0*Mp;hCE^vHx0~${WSES8f&$ns-ahHFm3p7OWgtm*IP=+(MU1;~BNTCXytf zDG=8Ra_6Qj;*o&1hP0URlOW2TK}Ak7X!K+?|IWKZI?l4F)rJEEyj>*-MZoqGf`UZ z`(Ps0m++>rQOAVwpIxkLHfJTJm#nE=1ohfSP1}YX)*C~PO|lK~X%x~gQJfm}*&*Ll z;w2#7+9EgragmQ(R0{N5dW)Z&cq`&C46=qLDl_58uK-8uW%a%gXQ-jEzRC+#^R6hz z_G{82e64ixLbGXPCl&$TLusKQkpN+GOb7^MZ9Bx??|l#Z=&-y!K2r6gjJGrAX;uq; z*?Vx96Vy!P?h}!~-1dGF890#qFYSB@CHa;N4RO5NsVbe&nxdCy@GHR+0}wnBI;YcN zT?WARN^lx{{`C8D$eFD99M$%W^&mF6AbMvgAgY=7Pmm=qob-l_tiGJ0KP=99IA2~W zLRBruXZr=J`#Mf%8r`L#0aHVeiQ?{-@$OH~m4aClYy-)+hZC1gp&?xYUwWOUs4R<= zdsW$1MJwrMa+Bt346+&`F{((X|s3r`B0BYvieGkMrw^p$Q6*yJH6WRH@S&i!hN?F% zN4wa_=Ah6g$8AMayFPKgZ;M}G$he(Hat>1wW-X7wMcX&vRcjB+6{y`_Yri`1&YW+k z01n>0^s@~5))V8&Qm2A0nO5vBa9WW2IP=SGtDCwnUkuEcm)f5`s{6EMI%uq)Zhu;o z7(+=<@3qnMS)yu2hfJ=!D7MKfN7vxx%~QKt5R-1V zU6+8nCycLPRo<8z`w@{umme<*QK23x2kzYFMUZpPi2n89nwecwdivjx_b89;%#83-QKd5J`ptZ^xdt&=c^B9Fmb?)SBMpAO+}B9 zgm;AYE+FzyHyWxGrWka=CD7Y;%T6Iq+|S?33)z3!s;Fsv#4xXQZH6Zn~m4&Naqtu`Kby-B4i zL*tEaafM5d=2vwqdtUu^dnz`v?HbN&4^k&xpoq(LsZ;+U2APSMaw;TdYJ>#e;)ul+ zG7avhO@Re{TLs&mRej*Uax?ZlM3p7K z#?K&}H!Csb^Y^fHE{N9Qeo)!EX}u07VlnJZQg2Rdh1sn3z_Kx>i<&%mR4P`y#A}D| ziXmypFym$LvLo+R%g1@TOV>VNfSfg}4;zvSMf~jYtabD-`LYnoNq2{XCFX_*@n~tR zjNh_?v$IzZ-;uL|_Wa&N>AqEuvq{A0nI#Wqxw6E-#czY+=@$gE06?30qrxz^VIlbW zR3ioWu2QR$Qn5|&2hgx3W%_`eGytMj zFMDybYKrwi6MbSPsR9s~)Di75JfJ{uvxg)IMO<{WaJ%)^)3@0DI*m9y>f>z*&1had z6RNz#n@TZWidfI0j2oPKLvc6PV{<(vAoR-LuYO&|0tC2xL&LVvcq_c1m8P`TOl%pZ zU{|)v=~GVA9m#~olWaF?kK$)0G;qoy=XVNOOTxXzzN+yFCifyiWCw4TVzEU7wMjMGrKL6k(JhY z!>*RgVWu?|EP8m~X8l#2$%&`qI(l$NXgm+lS;)e3eZ*dF6q5;Bi4xHBOp!0-KPWD1 z<;Vry8EOs?hSbwY6emjtmYplOCT#ar%@x_6J4(fkD+EguDd@|=+O*|B%|PVZDa+P4 zckUV@CMkxSHCW}1Wc)jw($zFg;QZ*c`paIiU%bpMTe|{uYhkuv0g3QuV>Q@tCUPnh z8j=O4G<0>sr$jnu5IxG~IV09ih?8}zfc#9<_bA;EpZ7>so(aJbCD5rCEFYxd>}}+k z5?9}Uq_^kF7x%7{m|_;3ie8DNfWJt<4CNC)`tVL!7UKGlbyJ-h^W6y7iv$Vcp-SWh zG-2z}ZvB%`etn9mVIF{(^J|@HPSvss@Xslpv`h90RyMN%h8 z-uU+xs=sJd(TKUfy1^BOa&pT2XD*Mwmyt{mx9yK30pU+T!)@M5S`SjH7E#!f)q!W9 z2OCdvi-;D=mPYO7 zlW%cBIj(f^RPf0$h-uo(9OK6vyy!!wcL>B_VyxKp$bHjnhN+nkv8}h25nMb)O`EU1 zMXd7|g$9F?5f%ct0{b3UtR`i-&ec?mlXL*HZ{tke-1k&Wy`d70@*l9xglE8t_&=@2M!MrjW|F zJPWn-?a3ikX%ougC%i9NOqZ?})Fax`W^`xdNC8SGdFb?U(tRHrpS3MdF@VyE0VtgZ z$L}E#XcLNxo4D8)#J`d6lsyRtM-6jwotRB!t!{4ygYWfIR-tCvbsPq=QAmQc%xDpBO8m&p`2^1 z5`NM}dMz13hnOlMKg&n?t_rNLN9ewnC&C+g-RR`?K|0|xYVPa7l}%K*=|Xqq^G=J1 zSab#jF;wJfw2D+{)qdzk5QhC(`YRN?UfhTCxF60emI+Wg55EcsPcQG6P&sy8{gH|& zUk8YEL(~aLJ{|v$z4MG}GF=z;hy@#>(nY$0bm`Jn1f)v~5PGixkzNwS0s>M5=_N{s z5PGjFO=_qC0tBS@&;x`dUz|O&_nb3(uQU7K_hbHrmGy?_ecIixI{^aEWqNMVIdov|g4P4J9HfvqofXmNE}2|fRJ=?V3n8wv&0Ib1 zzwi=SJh@V2MFpx){pA%vc6U_D$HDogNBH;qBIiD#`Ii}d2VQDfi)34O9%7#I?D>(X z-`iHjmu~H!xV+SG8agLLa@R#OueS*Fr4 zSDI_Wjz_45@_c+8XLdMJpMLz#TYxq~;OgumorIm*ELJ5fVl?gy-?_uJs)jq=n#?U~ zy!6Shnz}2lCm(a6XM9Kg7L>(h?t^`7B4;kCYa_sEG=HluIUOLqj0!cP?|M&4VDqd= zk;x6Sf8D}lSrWP&prS#vzc~mYdZcS4={O^Dm!(NA$+#&b`U1r$`qDYa(K0$?(Rig? zzD9Al#kwdWRXWYD-($-}(gwZJm8qca^hqtQIf0MjIQ22+DtJbZ1XC0FmCE*T7`aLN>S`sz|-jXG2qa6);6;?#D$s_F*u1ghyywDcL5gw`F4a0=xKFwInubbzU$qtAN- z)=sxKHj!@M)dc0ZZkg}84o1p%EV#udbyK+sGPjk&&V=i0>9HY zW4Sa~IZ*Z=Rn!E#Y84YV}=<2#Zc~%%``UF;nZ+@Qbt_D zRu-ar21f?kO#m@;5vZi`C zlnG@jQjZ=zik&=nF75Ls`($u}*-TSF3B`bn#m!wegJJv@s!Cb&R>Vi{ST)jyQ&juX znZ2rfOqH8`Y^mG6QGW~r!a%Eim(Z8g(VYXS6xWz#T)>|6Z6=Z)Q}Ms3sG})?Rzwz& zbDyg>mU7R41r>7~Y52jEThk3QQ$Lc`cays9j4EuRx^r(7XDO&MOZtyojqo)gH4?DC z$`a$bdL+ZhcI(QY1Q%=nMTesGPhn#Yy_^amo;s{SW-5+1GpvTv#y`k8lj2pJ$Q=D; z4(ERF!LUb8S9kKmBuyKnSv9A$&&G&t9`0I+nT=NiOn-Kg{mAllTK!h8 z4`_JSK0$a}U^x+qzsi;!RaVyG3{dQwGbDfEGZWdS2R>&0P5&k@;9nU6zkPDo`t9o+-*Kf6Hw1FFVHk@bhEq$=O-CsZ$E@3LRIN4w&79OIwN*W%KtSB zwaVw`T!s?NqW8n%)MDR+Z4IhX$=AcjluM}oO;XXn|JC3l_Urbc%KMEkmtU29&zXIQ zFjB__KkR;aCszFB8-Dp(YR|t)c$^iu+!m3|f6z#np{VocFnmR95Fp}x=-x`|-3vZ< z=?U4*JHoAO7oKLGbFUvT&fi-)|Ci@0>S3b_>V;;K{r@#3e|Sk&@$>h*s8dgFGyYzN z`G+t6*S`Jz&$)Ec0ovJ$_4xK%j{bjGzdwF^J(c9KY|oYJ{Ogd;VBeoW$Hs<*wEKT~ z3NE(glEzk6fGGRZUHALw{}s^r?Gr1S1lXa$2uO1M7o^29ZqnFX);wJP`dq*B`8fp* zYW5Nl&)>`Q_v!ij^!$Cfo%>t%{6hA(?D_v(HMo8~m3++F zyor{2(scId{}l57)UmH?or}GzaeLi9WmbOJs)A0!wQcQ(_1=i&U)Py0PT2;(xkNR! z$PprIQp5#%yLr>&Pa4mERE2&CuH}unzm;*z{`VZ9zcTnE=udj0kH*T4|3Xi*B;|mlXT!8sWA)X%bE`DFYmT{h4>IKjq+$h@Jwr|1gq2FWF1tPb_%Q*c;}* z{>;PMKMmV!<|dkd*-AQd?v#Xj=O;FB?qB>btclW}=J?Uv3#UI1{69_lY!GP@j%UO^ zEC2Opu7{p~iVAO~OVs^0xn2KhLlH@=_a0*LCE4FPviybD3V!f2VfA)%ZQ5UN=y37x zBShNFe;*;z#r*dXA|ccMK0>79@V68qxmW)`mqKR!~pSzkU`T)KKSVRl`j_Y9#y zggneAK!f#6*iF^gJ7;3=xHtOowl~0f|FYj_$}IRCG1)u7XVpBQ!8Nv0z^s|)(W5au z%-X$3B8-YFR*ySYg*~oK@vlp=;O+Bso}uQ4rgnFzgO8&3Vf)q@N0fK)K+GSjSklS`A2M3QKs3f-Or zyG~Ua^`}d7`Ry*mlF$*`4Ul5P;|7x!h-o;rz#XG=R3%sm zmyd>*?SsN}J7#jvjUOSLoAX#%7a$VtpB zF_^Ny(>l`aqY|RoX3TiE=W17?pjP(eR2WUi`_wxu2P+%}Bpe`rDquQH;b>E?N6*(p zGo4^i?}dMe_B}Y?vTk2|dKUyefgnvY0;)flA7EZhd={2qbng)DnLEi@z`9DMJo^N{yH40W%-}Nm{un^Qq~n}O zOCDQt-k(tFisMTB_V)7Ax^mk)2E}Qg6L75&$MS+PGk~I4sVe6bX(e8i06*TVj?bjB zt+CiI1; zsYJY&zEgr4^XJw^`QqBdG58A5KpE zrvT~f3m@cNI$WfQ`|fpmi^R{YBtyEmTHy!iYa zcqn1Wwm+?lKS`wXthYlO$-M7QtJ||(EF6VEEA`>1`Ao`xUY*yOf<^2R-L*S$o4F+| zCz%WaQpu;MJysJ{0nsblgKpLS`eZlXp0cg^y^n_xVh$L^RY(lig?3tmpFk{$bI~0h zAM|~Rf6}I=fHp+{1S~jg%hIV(66=Bry5)O;n|{UQK%>Ram;ud0ze3Z1@e1c8eX&(g*q^3+A%`1y=)tk~T=AP}O5@XeZ*!FCdtP6)Hp*3YB zHWE-hNmQRy3!xOnBrQNHluHOzrAag}cVy%4eK!B2>L)(Qzdya@8Is<3I<)%qc=zeF zlvwr&mHyq&t8pdb$i_TG3f5cFTDvT8;y&!QZ-XZ#E_H%3Q z(B{pF`aWCw>oHGx0QY#koMi8kvQ@dmZrG(nF^YF1Jh{Se3`8UMYf?tLq>b4v%fP8Ns27;Y8LSNvUm`K6_%28ZF-O(afreG z*T=ixTWK_0V9k;C{#*NFw!AKZLdMm&oSoqV8M+C_Nb+k0?>FhlaZOS+ye%>fs;Df5 zD)$OaFF}|GiA-tAV_mYI&G0*KsLnrOB%=6&@J;Olk>fsN>BB4F;+b z|M4R}^XBf9#qN0BwJ|tDu9{F7EMy`XiWvCs5tF0U0%mn=q@1@8o8+%;QvFQC6oi&~ zXj#R2xDq>6Ij@NE&5tZ5F0QPu$I5v%FSZ>f`?s)kyQ83@yB(eOkaO3`R&HB@rq~|c1 zkAh(%Bs@bmwYrnJG(M?nt^D=_i0R>Nit38}kyo>SIYy8Y()Q#PZNF3)_ z5?=QyazE@27JO#+TO9XhMTOR~WV!Q?qUGaL%v(lb%bmN&J!!bIppwbv1nw9;V3PHM zP-iCFbBS}ld2h2!Hp4nyhLD&RB7;-p`bkg!9S_jdQKE~4x##%{7g7Wrx+k*>gmcv1 z0)61zh!(3wo;^ivqb|$Xue5?@JVB>*NQj@_c%TaQafIEH+83G6)q`{=SKJTNj(3++ zs>(r=-rUbvTU74wg5;)Tc$VUnk`Bh)#vLGC#igBt;l?P!@p97X1HW(^5p!2$(Q!7P zVXYyu$cU@Kd$Sq`({0F=0WSWyj~im(HNXp~1(~|Gd{@ihOa3U<3CVtO7k77YpP?e# z;wza>1AqcLDNOa7Qne);Y~4w!>mZ>&q|w=BypGGK$5*!ea#U$+9#NXx9~#XFf^-1W zD6uIO<6G}mCxbqn-nX+#(mG|FEFK#(~sU=Y)RypUd9&ixl}(n=1oN&UZglW}cft%OIIx?=2poyT&H zC6&RmUXSEkeaYAejdP5+)@NO_VpBPs6aOMka#HCH{U_pNL94b#x|}g2YeXH~VXo#98F|{VUfIf{*q+DE=w) ze`V@mO2?t^p)A{q$V(tSXa(@ zIj-^mSM59m9xZLMomG*dh(G7XwkyY7Oz2X@v; zwVeqCEvD6-YR)%%Nw7JvbL@9gH{*oex3Nmxj?UEu!bps=LA%g$qv#_LLjJ3;^`hCgnceQ)M3`z&8bz(VR!Ikh8WA~gZuV4{*_R*F;!laQcF0t+^EKzew z6SXFEQp6{Y+jc>fq;qn+e68mlDsu#Cb0BC3tF}!L$>>V1XJ~@dev61{E^bV@on0lz zt!IBJ*V6t<#*JDLlBf3Vy#L~h@3ocvJjzkG;{{l}YZ$&u2^#d@&NSb`9}Vl_d>3EOD9Y!g+kX|dLknswroKD5q zmHoHw%WU-TEnmxr7UMM7y~4yFU&Q@Z!}kw4XmOrGQ*L>W()#oP)t_ zJ3f}>e$%})9SKVLu7|ioEqNx=XR@;L5p2yz))L@pqd1_4ddeBc4rB+k2Mc2@b&2|iC z!|Qltf0;M#`jRMI@8C3|*z*2pwQi_S&XXN0PD{QoXz*AKku~-GLHD{_Pm$yNU1)*b z;`D{-#;npYF4G*BxNeU$j#+}!J<2m5`zDyjX7J?6Pc&2q0j1m

8NobpuhzNTV?uul3`ryn|$?_jJoLc{1B>+ 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 From ac230b02c58dbb592571b81bb4bd0daf9ea77ff7 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 17:33:57 +0530 Subject: [PATCH 096/136] spotter api updates --- modules/ROOT/pages/api-changelog.adoc | 11 - modules/ROOT/pages/common/nav-rest-api.adoc | 2 + .../pages/customize-homepage-full-embed.adoc | 8 + modules/ROOT/pages/rest-api-java-sdk.adoc | 1 + .../ROOT/pages/rest-api-sdk-typescript.adoc | 1 + modules/ROOT/pages/rest-apiv2-changelog.adoc | 12 +- .../ROOT/pages/saved-conversations-api.adoc | 267 ---------- modules/ROOT/pages/spotter-agent-apis.adoc | 20 +- .../spotter-agent-conversation-mgmt-apis.adoc | 502 ++++++++++++++++++ .../pages/spotter-agent-instructions.adoc | 4 +- modules/ROOT/pages/spotter-apis.adoc | 4 +- modules/ROOT/pages/spotter-classic-apis.adoc | 8 +- .../ROOT/pages/spotter-nl-instructions.adoc | 4 +- modules/ROOT/pages/whats-new.adoc | 28 +- 14 files changed, 546 insertions(+), 326 deletions(-) delete mode 100644 modules/ROOT/pages/saved-conversations-api.adoc create mode 100644 modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index eabbadeb7..7777491d9 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -62,17 +62,6 @@ Trigger a manual cache refresh from the host application. Action ID to show or hide the cache refresh button in the Liveboard toolbar. |==== -|[tag greenBackground]#NEW FEATURE# a| - -[discrete] -===== Events for Spotter conversation history -* `HostEvent.LoadChat` + -Load a specific conversation by ID into the embedded Spotter interface. -* `HostEvent.DeleteChat` + -Delete a specific conversation by ID. -* `HostEvent.RenameChat` + -Rename a specific conversation by ID. - == Version 1.49.x, June 2026 [width="100%" cols="1,4"] diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index e5a0e317d..5e936f8f4 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -21,6 +21,8 @@ REST APIs * link:{{navprefix}}/fetch-data-and-report-apis[Data and Report APIs] * link:{{navprefix}}/spotter-api[Spotter APIs] ** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] +** link:{{navprefix}}/spotter-agent-instructions[Spotter AI agent instructions] +** link:{{navprefix}}/spotter-agent-conversation-mgmt-apis[Spotter AI Agent conversation management] ** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] ** link:{{navprefix}}/spotter-nl-instructions[Spotter instructions APIs ^BETA^] * link:{{navprefix}}/audit-logs[Audit logs] diff --git a/modules/ROOT/pages/customize-homepage-full-embed.adoc b/modules/ROOT/pages/customize-homepage-full-embed.adoc index 954cb8da5..bcffba68a 100644 --- a/modules/ROOT/pages/customize-homepage-full-embed.adoc +++ b/modules/ROOT/pages/customize-homepage-full-embed.adoc @@ -13,6 +13,14 @@ Developers can customize the home page experience in full application embedding The classic (V1) experience and V2 experience modes will be deprecated in an upcoming release in 2026. Therefore, ThoughtSpot recommends upgrading the UI experience of your full application embedding to the V3 experience. ==== + + +[NOTE] +==== +The focused homepage experience is in beta and disabled by default. To enable this experience in your embedding application, the feature must be enabled on your ThoughtSpot instance and in the Visual Embed SDK. +==== + + == Home page layout In the classic (V1) experience, the home page has a static layout and does not support SDK modular customization settings. diff --git a/modules/ROOT/pages/rest-api-java-sdk.adoc b/modules/ROOT/pages/rest-api-java-sdk.adoc index 9042d1d51..92512748e 100644 --- a/modules/ROOT/pages/rest-api-java-sdk.adoc +++ b/modules/ROOT/pages/rest-api-java-sdk.adoc @@ -281,6 +281,7 @@ Note the recommendation of Java SDK: [options='header'] |==== |ThoughtSpot release version|Supported SDK version +a|ThoughtSpot Cloud: 26.7.0.cl | v2.26.0 or later a|ThoughtSpot Cloud: 26.6.0.cl | v2.25.0 or later a|ThoughtSpot Cloud: 26.5.0.cl | v2.24.0 or later a|ThoughtSpot Cloud: 26.4.0.cl | v2.23.0 or later diff --git a/modules/ROOT/pages/rest-api-sdk-typescript.adoc b/modules/ROOT/pages/rest-api-sdk-typescript.adoc index ccb55b8ca..452dba9e6 100644 --- a/modules/ROOT/pages/rest-api-sdk-typescript.adoc +++ b/modules/ROOT/pages/rest-api-sdk-typescript.adoc @@ -203,6 +203,7 @@ Note the version recommendations for your ThoughtSpot instances: [options='header'] |==== |ThoughtSpot release version|Recommended SDK version +a|ThoughtSpot Cloud: 26.7.0.cl | v2.26.0 or later a|ThoughtSpot Cloud: 26.6.0.cl | v2.25.0 or later a|ThoughtSpot Cloud: 26.5.0.cl | v2.24.0 or later a|ThoughtSpot Cloud: 26.4.0.cl | v2.23.0 or later diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index b488ab953..b1234d5cb 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -30,7 +30,7 @@ Deletes a saved conversation and all its associated messages. * `GET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/answers/{answer_identifier}/details` + Loads the full answer payload for a specific answer item in an agent conversation. -For more information, see xref:saved-conversations-api.adoc[Saving and managing Spotter AI chat]. +For more information, see xref:spotter-agent-conversation-mgmt-apis.adoc[Saving and managing Spotter AI chat]. Agent instructions APIs:: The following new API endpoints allow you to set and retrieve persistent behavioral instructions for the Spotter agent. @@ -38,7 +38,7 @@ The following new API endpoints allow you to set and retrieve persistent behavio * `PUT /api/rest/2.0/ai/agent/instructions/set` + Sets behavioral instructions for the Spotter agent. Use this endpoint to define persistent guidance that Spotter applies when responding to queries in a conversation session. -* `GET /api/rest/2.0/ai/agent/instructions/get` +ß +* `GET /api/rest/2.0/ai/agent/instructions/get` + Retrieves the behavioral instructions currently configured by the administrator for the Spotter agent. For more information, see xref:spotter-agent-instructions.adoc[Spotter AI Agent instructions APIs]. @@ -117,23 +117,19 @@ Exports from this endpoint inherently respect Liveboard-level filters, Runtime F To export a specific personalized view of a pinned Answer, include the `personalised_view_identifier` parameter. Spotter Answer export:: -// SOURCE: SCAL-236681, SCAL-306548 XLSX and PDF export formats are now supported for Spotter (conversational) Answers. Custom PNG dimensions:: -// SOURCE: SCAL-236681, SCAL-306548 PNG exports now support custom dimensions via the following new parameters: + -* `x_resolution` — Sets the export width in pixels. Valid range: 600–3840 px. -* `y_resolution` — Sets the export height in pixels. Valid range: 600–3840 px. +* `x_resolution`: Sets the export width in pixels. Valid range: 600–3840 px. +* `y_resolution`: Sets the export height in pixels. Valid range: 600–3840 px. Display scaling:: -// SOURCE: SCAL-236681, SCAL-306548 A new `scaling` parameter allows you to adjust the relative size of visual elements in PNG exports without cropping. Valid range: 80–500%. Automatic file naming:: -// SOURCE: SCAL-236681, SCAL-306548 The API now automatically names exported files based on the Answer title and appends the correct file extension (`.png`, `.pdf`, `.csv`, or `.xlsx`). Contact ThoughtSpot support to enable these settings for PNG downloads on your ThoughtSpot instance. diff --git a/modules/ROOT/pages/saved-conversations-api.adoc b/modules/ROOT/pages/saved-conversations-api.adoc deleted file mode 100644 index da73d4e9c..000000000 --- a/modules/ROOT/pages/saved-conversations-api.adoc +++ /dev/null @@ -1,267 +0,0 @@ -= Saving and managing Spotter AI chat -:toc: true -:toclevels: 2 - -:page-title: Saved Chat APIs -:page-pageid: saved-conversations-api -:page-description: Use REST APIs and SDK methods to manage saved Spotter conversations from your host application. - -// SOURCE: SCAL-290720, SCAL-313991 - -ThoughtSpot provides public REST API endpoints and Visual Embed SDK host events for managing saved Spotter conversations. These APIs enable advanced embed developers to build fully headless conversation history experiences — for example, rendering a custom chat history list in the host application and loading or managing conversations without relying on the ThoughtSpot sidebar UI. - -== Prerequisites - -* ThoughtSpot Cloud 26.7.0.cl or later. -* Visual Embed SDK v1.50.0 or later. -* The authenticated user must have *Spotter access* on the instance. -* The *Save chat* feature must be enabled on your cluster. Contact ThoughtSpot Support to enable it. - -== Use case - -Some embedded applications manage navigation entirely in the host app and hide ThoughtSpot's native sidebar navigation. These integrations can use the Saved Chat APIs to: - -* Display a custom list of a user's saved Spotter conversations in the host application's own UI. -* Load a specific conversation into the embedded Spotter interface on user selection. -* Rename or delete conversations in response to user actions in the host app. -* React to conversation lifecycle events to keep an external history list in sync. - -== REST API: Fetch saved conversations - -Use the following endpoint to retrieve a paginated list of saved conversations for the authenticated user. - -=== Endpoint - ----- -GET /api/rest/2.0/ai/agent/conversations ----- - -=== Authentication - -Requires Bearer token authentication. The token must be scoped to the user whose conversation history is being accessed. - -=== Request parameters - -[cols="2,1,1,4"] -|==== -| Parameter | Type | Required | Description - -| `limit` -| integer -| No -| Number of conversations to return per page. Default: `20`. Maximum: `40`. - -| `offset` -| integer -| No -| Pagination offset. Default: `0`. - -| `skip_empty` -| boolean -| No -| When `true`, skips conversations where the user created a thread but did not ask any questions. Default: `true`. -|==== - -// TODO: verify with engineering — confirm whether GET /api/rest/2.0/ai/agent/conversations accepts parameters in the request body or as query parameters - -=== Example request - -[source,bash] ----- -curl -X GET \ - 'https:///api/rest/2.0/ai/agent/conversations?limit=20&offset=0&skip_empty=true' \ - -H 'Authorization: Bearer ' ----- - -=== Example response - -[source,json] ----- -{ - "conversations": [ - { - "conv_id": "yatqmyIIWfCQ", - "title": "Sales by region Q1", - "created_at": "2026-01-21T09:11:05.297252Z", - "updated_at": "2026-01-21T11:16:55.167147Z", - "worksheet_id": "cd252e5c-b552-49a8-821d-3eadaa049cca", - "worksheet_name": "Retail - Apparel", - "active_thread_length": 4 - } - ] -} ----- - -// SOURCE: SCAL-313991, design doc 17cu1O3lQa2-WQsBMwkv0gMGCwAaT5gPfHETQR_5VRcw - -=== Response fields - -[cols="2,1,4"] -|==== -| Field | Type | Description - -| `conv_id` -| string -| Unique identifier for the conversation. Pass this value to SDK host events. - -| `title` -| string -| User-visible title of the conversation. - -| `created_at` -| string (ISO 8601) -| Timestamp when the conversation was created. - -| `updated_at` -| string (ISO 8601) -| Timestamp of the most recent update to the conversation. - -| `worksheet_id` -| string -| GUID of the data source associated with the conversation. - -| `worksheet_name` -| string -| Display name of the associated data source. - -| `active_thread_length` -| integer -| Number of active messages in the conversation thread. -|==== - -== SDK host events - -After fetching the conversation list via the REST API, use the following `SpotterEmbed` host events to load or manage a specific conversation in the embedded interface. - -=== Load a conversation - -[source,JavaScript] ----- -spotterEmbed.trigger(HostEvent.LoadChat, { chatId: '' }); ----- - -Loads the specified conversation by ID into the embedded Spotter interface. When triggered, Spotter restores the conversation context and the user can continue the session from where they left off. - -[NOTE] -==== -Users can only load their own conversations. Attempting to load another user's conversation returns an error. -==== - -=== Delete a conversation - -[source,JavaScript] ----- -spotterEmbed.trigger(HostEvent.DeleteChat, { chatId: '' }); ----- - -Deletes the specified conversation by ID. After deletion, the embed emits `EmbedEvent.SpotterConversationDeleted`. Listen to this event to update your external conversation list. - -[source,JavaScript] ----- -spotterEmbed.on(EmbedEvent.SpotterConversationDeleted, (eventData) => { - // Remove the deleted conversation from your host app's list - removeConversationFromList(eventData.data.chatId); -}); ----- - -=== Rename a conversation - -[source,JavaScript] ----- -spotterEmbed.trigger(HostEvent.RenameChat, { - chatId: '', - title: 'New conversation title' -}); ----- - -Renames the specified conversation. After a successful rename, refresh your external conversation list by calling `GET /api/rest/2.0/ai/agent/conversations`. - -// TODO: verify with engineering — confirm whether a SpotterConversationRenamed EmbedEvent is emitted after a successful rename - -== Embed events for conversation lifecycle - -The following embed events are available to keep your host application's conversation list in sync with user actions inside the embedded Spotter interface: - -[cols="2,4"] -|==== -| Event | When emitted - -| `EmbedEvent.SpotterConversationDeleted` -| When a saved conversation is deleted by the user or via `HostEvent.DeleteChat`. - -| `EmbedEvent.SpotterConversationSelected` -| When a saved conversation is selected from the Spotter chat history sidebar. -|==== - -== Complete example: Custom conversation history list - -The following example demonstrates a pattern for rendering a custom conversation history list in the host application and allowing users to continue conversations inside the embedded Spotter interface. - -[source,JavaScript] ----- -import { - SpotterEmbed, - AuthType, - init, - EmbedEvent, - HostEvent -} from '@thoughtspot/visual-embed-sdk'; - -init({ - thoughtSpotHost: 'https://', - authType: AuthType.TrustedAuthToken, - getAuthToken: () => fetchToken(), -}); - -const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { - frameParams: { width: '100%', height: '100%' }, - worksheetId: 'auto_mode', -}); - -// Listen for conversation deletion inside the embed -spotterEmbed.on(EmbedEvent.SpotterConversationDeleted, (eventData) => { - refreshConversationList(); // Re-fetch via REST API and update host app UI -}); - -// Listen for conversation selection inside the embed -spotterEmbed.on(EmbedEvent.SpotterConversationSelected, (eventData) => { - highlightConversationInList(eventData.data.chatId); -}); - -spotterEmbed.render(); - -// Load a conversation when the user clicks in the host app's history list -function loadConversation(convId) { - spotterEmbed.trigger(HostEvent.LoadChat, { chatId: convId }); -} - -// Delete a conversation from the host app's history list -function deleteConversation(convId) { - spotterEmbed.trigger(HostEvent.DeleteChat, { chatId: convId }); -} - -// Rename a conversation from the host app's history list -function renameConversation(convId, newTitle) { - spotterEmbed.trigger(HostEvent.RenameChat, { chatId: convId, title: newTitle }); -} - -// Fetch conversation list from the REST API -async function fetchConversations(offset = 0) { - const response = await fetch( - `https:///api/rest/2.0/ai/agent/conversations?limit=20&offset=${offset}&skip_empty=true`, - { - method: 'GET', - headers: { - 'Authorization': `Bearer ${await fetchToken()}`, - }, - } - ); - return response.json(); -} ----- - -== Related topics - -* xref:embed-spotter.adoc[Embed Spotter] -* xref:api-changelog.adoc[Visual Embed SDK changelog] -* xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog] diff --git a/modules/ROOT/pages/spotter-agent-apis.adoc b/modules/ROOT/pages/spotter-agent-apis.adoc index 4b07695db..1b00e32ed 100644 --- a/modules/ROOT/pages/spotter-agent-apis.adoc +++ b/modules/ROOT/pages/spotter-agent-apis.adoc @@ -1,4 +1,4 @@ -= Spotter Agent AIs += Spotter Agent APIs :toc: true :toclevels: 2 @@ -47,7 +47,7 @@ __Replaces /api/rest/2.0/ai/agent/{conversation_identifier}/converse__. a|`POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/send/stream` [.version-badge.new]#New# + xref:spotter-agent-apis.adoc#_send_a_query_to_agent_and_get_streaming_responses[Sends one or more natural language messages] to an existing Spotter agent conversation and returns the response as a real-time Server-Sent Events (SSE) stream. -__Replaces /api/rest/2.0/ai/agent/{conversation_identifier}/converse__. +__Replaces /api/rest/2.0/ai/agent/converse/sse__. a|`POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response` [.version-badge.new]#New# + xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[Stops an in-progress Spotter agent response] for a given conversation session. The conversation session remains active after the response stops. + @@ -86,7 +86,7 @@ The request body must include the `metadata_context`. REST API clients must have * `type` + Metadata context type. The context type is mandatory. Select one of the following values: -** `AUTO_MODE` to allow Spotter Agent to automatically discover and select the most relevant datasets for user's queries. +** `AUTO_MODE` to allow Spotter Agent to automatically discover and select the most relevant datasets for users' queries. ** `DATA_SOURCE` to set a specific data source as the data context. You must specify `data_source_context` and data source IDs. + To set a specific data source object, use `data_source_identifier`. + To set multi-data context, use `data_source_identifiers`. @@ -452,7 +452,7 @@ data: [{"id":"hxWMDP-pgR3B","type":"answer","group_id":"m1MTvttEUa7o","metadata" data: [{"type":"notification","code":"FINAL_RESPONSE_NOTIFICATION"}] ---- -For the complete response in one payload, use `sendAgentConversationMessage` instead. +For the complete response in one payload, use the xref:spotter-agent-apis.adoc#_send_queries_to_a_conversation_session[`/send` endpoint] instead. //// [source,] @@ -755,7 +755,7 @@ A conversation title (`title`, `conv_id`). * `notification` + Progress or status update (`group_id`, `metadata`, `code`). For example, `TOOL_CALL_NOTIFICATION`, `nls_start`, `FINAL_RESPONSE_NOTIFICATION`. * `type` + -Type can be `thinking`, `text` +Type can be `thinking`, `text`. * `text` + Complete text block in markdown format. * `text-chunk` + @@ -784,7 +784,7 @@ Events in the thinking phase carry `"metadata": { "type": "thinking" }`. All oth Every event includes a `group_id`. Events sharing the same `group_id` belong together. During the thinking phase, each tool call gets its own `group_id`. A `FINAL_RESPONSE_NOTIFICATION` notification marks the boundary between the thinking and output phases. -[mermaid] +[listing] ---- THINKING PHASE ─────────────────────────────────────────────────────────── @@ -818,7 +818,7 @@ OUTPUT PHASE [width="100%" cols="2,4"] [options='header'] -|=== +|===== |Code| When it appears |`QH`|Query handling started |`TML_GEN` / `TML_GEN_RETRY`|Generating or retrying TML @@ -829,9 +829,9 @@ OUTPUT PHASE |`SUMMARIZING_RESULTS`|Summarizing results |`TOOL_CALL_NOTIFICATION`|Tool invocation (during thinking phase) |`FINAL_RESPONSE_NOTIFICATION`|Marks the transition from thinking to output -|`search_datasets_start` / +search_datasets_end+|Data source discovery in progress or complete +|`search_datasets_start` / `search_datasets_end`|Data source discovery in progress or complete |`approval_required`|An external tool requires user permission before proceeding -|=== +|===== === SSE event payload reference @@ -1070,7 +1070,7 @@ curl -X POST \ === Example response -If the API request is successful, ThoughtSpot stops the in-progress response and returns an 204 response code. +If the API request is successful, ThoughtSpot stops the in-progress response and returns a 204 response code. If the conversation session is not found or has expired, the API returns an error: diff --git a/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc b/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc new file mode 100644 index 000000000..effb4adce --- /dev/null +++ b/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc @@ -0,0 +1,502 @@ += Spotter AI agent conversation management +:toc: true +:toclevels: 3 + +:page-title: Spotter agent conversation management APIs +:page-pageid: spotter-agent-conversation-mgmt-apis +:page-description: Use the Spotter agent conversation management REST API endpoints to retrieve, update, and delete saved Spotter agent conversations and their messages. + +ThoughtSpot's Spotter Agent conversation management APIs allow you to retrieve, update, and delete saved Spotter agent conversations and their message history. These APIs allow you to build and render custom conversation history UI, audit trails, and administrative conversation management workflows in applications using Spotter engine or embedding Spotter interface. + +== Prerequisites +To create, save, and manage conversation sessions with the Spotter agent, the user generating the API request requires `CAN_USE_SPOTTER` privilege and access to the saved conversation. + +== Supported API operations + +[width="100%", cols="1"] +|===== +a|`POST /api/rest/2.0/ai/agent/conversation/create` + +Allows you to save a Spotter agent conversation session + +__Available on ThoughtSpot Cloud instances from 26.5.0.cl onwards.__ + +a|`GET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/messages` + +xref:spotter-agent-conversation-mgmt-apis.adoc#get-conversation[Retrieves the full message history of a saved Spotter agent conversation], including ordered user prompts, agent response items, and code-execution file metadata. + +__Available on ThoughtSpot Cloud instances from 26.7.0.cl onwards.__ + +a|`GET /api/rest/2.0/ai/agent/conversations` + +xref:spotter-agent-conversation-mgmt-apis.adoc#get-conversation-list[Retrieves a paginated list of saved conversations] for the currently authenticated user. + +__Available on ThoughtSpot Cloud instances from 26.7.0.cl onwards.__ + +a|`GET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/answers/{answer_identifier}/details` + +xref:spotter-agent-conversation-mgmt-apis.adoc#load-answer[Retrieves the full answer payload for a specific answer] within a saved conversation. Use this endpoint to resolve `answer_id` references returned by the get conversation messages endpoint. + +__Available on ThoughtSpot Cloud instances from 26.7.0.cl onwards.__ + +a|`POST /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/update` + +xref:spotter-agent-conversation-mgmt-apis.adoc#update-conversation[Updates the metadata of a saved conversation], such as renaming its title. + +__Available on ThoughtSpot Cloud instances from 26.7.0.cl onwards.__ + +a|`DELETE /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/delete` + +xref:spotter-agent-conversation-mgmt-apis.adoc#delete-conversation[Deletes a saved conversation] and all its messages. + +__Available on ThoughtSpot Cloud instances from 26.7.0.cl onwards.__ +|===== + +== Saving a conversation +To save a conversation, set the `enable_save_chat` parameter to `true` when sending a xref:spotter-agent-apis.adoc#_create_a_conversation_session_with_spotter_agent[conversation create `POST` request] to the `/api/rest/2.0/ai/agent/conversation/create` API endpoint. + +=== API request example + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/ai/agent/conversation/create' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "metadata_context": { + "type": "AUTO_MODE" + }, + "conversation_settings": { + "enable_save_chat": true + } +}' +---- + +If the API request is successful, ThoughtSpot returns the conversation IDs. + +[source,JSON] +---- +{ +"conversation_id":"MotUVRdguIcr", +"conversation_identifier":"MotUVRdguIcr" +} +---- + +Note these IDs. + +[#get-conversation] +== Get conversation messages +To retrieve a saved conversation, send a `GET` request to the `/api/rest/2.0/ai/agent/conversations/{conversation_identifier}/messages` API endpoint with the conversation ID in the API request URL. Use this endpoint to render a persisted conversation in a UI, build an audit trail, or post-process a completed conversation. + +[NOTE] +==== +The full answer payload for each turn is not embedded in the response. To retrieve it, call the +xref:spotter-agent-conversation-mgmt-apis.adoc#load-answer[load answer details] endpoint with +the `answer_id` returned in each `answer`-type response item. +==== + +=== Example request + +[source,cURL] +---- +curl -X GET \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/ai/agent/conversations/MotUVRdguIcr/messages' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ +---- + +=== Response body +A successful request returns an HTTP `200` response with top-level fields that include ordered conversation turns (user prompts and agent response items) and sanitized metadata for any files generated by the code-execution tool. + +When the agent conversation is initiated from a Liveboard, ThoughtSpot automatically seeds the conversation with the existing Liveboard visualization as the first response turn, without any user query. In the API response, this seeded turn appears as the first item in the `messages` array with `user_prompt` set to `null` and `message_id` set to the internal root node identifier of the conversation. All subsequent turns contain a populated `user_prompt`. When rendering conversation history, always check whether `user_prompt` is `null` before attempting to display a user query. + +=== API response +A successful request returns an HTTP `200` response with the following top-level fields. The response includes ordered conversation turns (user prompts and agent response items) and sanitized metadata for any files generated by the code-execution tool. + +When the agent conversation is initiated from a Liveboard, ThoughtSpot automatically seeds the conversation with the existing Liveboard visualization as the first response turn, without any user query. In the API response, this seeded turn appears as the first item in the `messages` array with `user_prompt` set to `null` and `message_id` set to the internal root node identifier of the conversation. All subsequent turns contain a populated `user_prompt`. When rendering conversation history, always check whether `user_prompt` is `null` before attempting to display a user query. + +[width="100%", cols="2,4"] +[options="header"] +|===== +|Field|Description +|`messages`|An ordered array of conversation turns, oldest to newest. +Returns an empty array when the conversation has no messages. +|`code_execution_files`|`CodeExecutionFileMetadata[]`. An array of sanitized metadata for all files generated by the code-execution tool across the entire conversation. Returns an empty array when no such files exist. +|===== + +==== ConversationMessage + +Each item in `messages` represents one conversational turn. + +[width="100%", cols="2,4"] +[options="header"] +|===== +|Field|Description +|`message_id`|__String__. Message ID. For Liveboard-initiated first turns, this ID is the root node identifier. +|`timestamp_in_millis`| Unix epoch timestamp for the turn, in milliseconds. +|`user_prompt`|`UserPrompt[]`. The user-authored prompt that started the turn, including the message text and any attachments. +|`response_items`|An array of agent response items produced for this turn. Returns an empty array for turns that are still in progress, which allows the UI to render the user message immediately while the agent is still processing. + +|===== + +==== UserPrompt + +[width="100%", cols="2,4"] +[options="header"] +|===== +|Field|Description +|`message`|`UserMessage`. The user-authored text query that started the turn. +|`attachments`|`UserAttachmentItem[]`. Files or connector resources attached to the user message. Returns an empty array when there are no attachments. + +|===== + +==== UserMessage + +[width="100%", cols="2,4"] +[options="header"] +|===== +|Field|Description +|`message_id`|__String__. Unique identifier of the user message. +|`content`|__String__. Text body of the user query. +|===== + +==== UserAttachmentItem + +Is distinguished by the `type` field. Valid values are `file` and `resource`. Only the fields for the indicated variant are populated. + +[width="100%", cols="2,4"] +[options="header"] +|===== +|Field|Description +|`type`|__String__. Attachment type. Valid values: `file`, `resource`. +|`file_id`|__String__. Unique identifier of the attached file. Matches a `file_id` in `code_execution_files`. +|`resource_identifier`|__String__. Identifier of the attached connector resource. +|===== + +==== ConversationResponseItem +Each agent response item carries a `type` distinguisher. The following types are supported. + +[width="100%", cols="2,4"] +[options="header"] +|===== +|Field|Description +|`type` a|__String__. Response item variant distinguisher. Supported values include: + +* `answer`: a Spotter-generated analytical answer. Carries an `answer_id` field. Pass this value as `answer_identifier` to the xref:spotter-agent-conversation-mgmt-apis.adoc#load-answer[load answer details] endpoint to retrieve the full answer payload. +* `text`: a free-text response from the agent. +* `notification`: an agent-generated notification, such as a conversation title suggestion. +|`answer_id` a|__String__. Unique identifier of the answer. Use this to call the load answer details endpoint. +|`content`|__String__. Text content of the response. +|===== + +==== CodeExecutionFileMetadata +Sanitized metadata for a file generated by the code-execution tool. + +[width="100%", cols="2,4"] +[options="header"] +|===== +|Field|Description +|`file_id`|__String__. Unique identifier of the code-execution-generated file. Stable across conversation turns. Use this to match attachment references in `UserAttachmentItem`. +|`display_name`|__String__. Human-readable file name. +|`file_type`|__String__. File type hint. Either a MIME type string (for example, `text/csv`) or a file extension (for example, `csv`). +|`created_time_in_millis`|Unix epoch timestamp when the file was created, in milliseconds. +|`expired`|__Boolean__. Set to `true` when the file is no longer downloadable because its storage has expired or been evicted. +|===== + +==== Response example + +[source,JSON] +---- +{ + "messages": [ + { + "message_id": "node_u_01", + "timestamp_in_millis": 1744000000000, + "user_prompt": { + "message": { + "message_id": "msg_u_01", + "content": "Show me revenue by region as a chart." + }, + "attachments": [] + }, + "response_items": [ + { + "type": "tool_call", + "tool_call_id": "toolu_01ABC", + "tool_name": "search_datasets", + "step_title": "Searching datasets", + "arguments": { "query": "revenue" }, + "timestamp_in_millis": 1744000001000, + "is_thinking": false + }, + { + "type": "answer", + "answer_id": "ans_01XYZ", + "tool_call_id": "toolu_02DEF", + "tool_name": "fetch_and_visualize", + "step_title": "Visualising", + "timestamp_in_millis": 1744000004000, + "is_thinking": false + }, + { + "type": "text", + "content": "Revenue is highest in APAC.", + "content_type": "TEXT_MARKDOWN", + "timestamp_in_millis": 1744000005000, + "is_thinking": false, + "step_title": null, + "file_reference": { + "file_id": "revenue_by_region.csv", + "display_name": "revenue_by_region.csv", + "created_time_in_millis": 1744027200000 + } + } + ] + } + ], + "code_execution_files": [ + { + "file_id": "revenue_by_region.csv", + "display_name": "revenue_by_region.csv", + "file_type": "csv", + "created_time_in_millis": 1744027200000, + "expired": false + } + ] +} +---- + +[#get-conversation-list] +== Get conversation list + +The `GET /api/rest/2.0/ai/agent/conversations` endpoint retrieves a paginated list of saved conversations for the currently authenticated user. Only conversations created with `enable_save_chat: true` are returned in the API response. + +=== Request parameters + +[width="100%", cols="2,4"] +[options="header"] +|===== +|Query parameter|Description +|`limit` a|__Number__. Maximum number of conversations to return per page. Use together with `offset` for pagination. +|`offset`|__Number__. Number of conversations to skip before returning results. Defaults to `0`. +|`skip_empty`|__Boolean__. When set to `true`, conversations with no messages are excluded from the results. Pass `skip_empty=false` to include empty conversations, for example, when listing conversations immediately after creation. +|===== + +=== API request + +[source,cURL] +---- +curl -X GET -G \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/ai/agent/conversations' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + -d 'limit=30' \ + -d 'offset=0' \ + -d 'skip_empty=true' +---- + +=== API response + +If the API request is successful, ThoughtSpot returns a response body. The API response does not include a `total_count` field. Use `has_more` to drive pagination controls. + +=== Response body + +[width="100%", cols="2,4"] +[options="header"] +|===== +|Field|Description +|`conversations`|`AgentConversationList[]`. Array of saved conversation summary objects for the current user. +|`has_more`|__Boolean__. Set to `true` when additional conversations exist beyond the current page. Set to `false` when the current page is the last. Use `offset` to fetch the next page. +|===== + +==== AgentConversationList + +Each item in `conversations` represents a saved conversation. + +[width="100%", cols="2,4"] +[options="header"] +|===== +|Field|Description +|`conversation_identifier`|__String__. Unique identifier of the conversation. Use this value as input in your API requests to the xref:spotter-agent-apis.adoc#_send_queries_to_a_conversation_session[send message], xref:spotter-agent-conversation-mgmt-apis.adoc#update-conversation[update conversation], xref:spotter-agent-conversation-mgmt-apis.adoc#delete-conversation[delete conversation], xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[stop response], and xref:spotter-agent-conversation-mgmt-apis.adoc#load-answer[load answer] endpoints. +|`conversation_title` a|__String__. Display name of the conversation. +|`created_at`|__String__. Timestamp of when the conversation was created. +|`updated_at`|__String__. Timestamp of when the conversation was last updated. +|`data_source_identifiers` a|__Array of strings__. Unique identifiers of the data sources associated with the conversation. +|`data_source_names` a|`DataSourceEntry[]`. Display names and identifiers for the data sources associated with the conversation. +|===== + +==== DataSourceEntry + +[width="100%", cols="2,4"] +[options="header"] +|===== +|Field|Description +|`id`|__String__. Unique identifier of the data source. +|`name`|__String__. Display name of the data source. +|===== + +=== Pagination + +Use `limit` and `offset` together to page through large result sets. The response does not include a `total_count` field. Use `has_more` to determine whether additional pages exist. + +---- +GET /api/rest/2.0/ai/agent/conversations?limit=20&offset=0 (first page) +GET /api/rest/2.0/ai/agent/conversations?limit=20&offset=20 (second page) +---- + +Continue incrementing `offset` by `limit` until `has_more` returns `false`. + +==== API response example + +[source,JSON] +---- +{ + "conversations": [ + { + "conversation_identifier": "abc123", + "conversation_title": "Sales by Region Q1", + "created_at": "2026-03-01T10:00:00Z", + "updated_at": "2026-03-05T14:23:00Z", + "data_source_identifiers": ["ds-001"], + "data_source_names": [{ "id": "ds-001", "name": "Retail Sales" }] + } + ], + "has_more": false +} +---- + +[#load-answer] +== Load answer details +To retrieve the full answer payload for a specific analytical answer within a saved conversation, send a `GET` request to the `GET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/answers/{answer_identifier}/details` endpoint with the conversation ID and answer ID in the request URL. + +=== Call sequence + +The following sequence is required to resolve a full answer from a saved conversation: + +. Call xref:spotter-agent-conversation-mgmt-apis.adoc#get-conversation-list[get conversation list] to retrieve saved conversations and obtain a `conversation_identifier`. +. Call xref:spotter-agent-conversation-mgmt-apis.adoc#get-conversation[get conversation messages] with the `conversation_identifier`. Locate `response_items` entries with `type: answer` and note the `answer_id` field on each. +. Call this endpoint with the `conversation_identifier` and the `answer_id` as `answer_identifier` to retrieve the full answer payload. +. Use the `tokens` array in the response to reconstruct or render the answer in your application. + +=== Request parameters +[width="100%", cols="2,4"] +[options="header"] +|===== +|Parameter|Description +|`conversation_identifier`|__String__. Path parameter. Unique identifier of the conversation. +|`answer_identifier`|__String__. Path parameter. The `answer_id` value from a `response_item` of `type: answer` in the get conversation messages response. You cannot pass arbitrary IDs to this endpoint. + +|===== + +=== API request + +[source,cURL] +---- +curl -X GET \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/ai/agent/conversations/0iwTDJU-tlkm/answers/5MS5xieDhefP/details' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ +---- + +=== Response body +If the API request is successful, ThoughtSpot returns a response body with the answer details. + +[width="100%", cols="2,2,4"] +[options="header"] +|===== + +|Field|Type|Description +|`answer` a|Full answer payload for the requested answer. Includes the following attributes: + +* `title`: __String__. Display title of the answer. +* `description`: __String__. Description of the answer. +* `session_identifier`: __String__. Unique identifier of the session in which the answer was generated. +* `generation_number`: __Integer__. Generation number of the answer. Incremented each time the answer is updated within the same session. +* `tokens`: __String[]__. Ordered list of TML token strings that make up the answer query. Use these to reconstruct or render the answer in the ThoughtSpot embed SDK or a custom UI. +* `visualization_type`: __String__. Visualization type selected for the answer. Valid values are: +** `Chart` / `CHART` +** `Table` / `TABLE` +** `Undefined` / `UNDEFINED`. Indicates that Spotter has not yet determined an appropriate visualization, or the answer type does not map to a chart or table. +* `formulas`: __Array of strings__. List of formula expressions used in the answer. +* `parameters`: __Array of strings__. List of parameter names applied in the answer. +* `sub_queries`: __Array of objects__. List of sub-queries used when the answer involves decomposed query processing. +* `ac_state`: Internal answer-context state used for session continuity. Includes the following attributes: +** `transaction_identifier`: __String__. Unique identifier of the answer transaction. +** `generation_number`: __Integer__. Generation number of the transaction. + +|===== + +=== Example response + +[source,JSON] +---- +{ + "answer":{ + "title":"total sales by state where item type is jackets", + "description":null, + "session_identifier":"5216568f-f808-4385-ad0a-3a40bb9b5dcb", + "generation_number":2, + "tokens":[ + "[sales] [state] [item type] = 'jackets'" + ], + "visualization_type":"UNDEFINED", + "formulas":[ + ], + "parameters":[ + ], + "sub_queries":[ + ], + "ac_state":{ + "transaction_identifier":"00ccc6e0-1117-4713-8798-d6201d3a5a40", + "generation_number":1 + } + } +} +---- + +[#update-conversation] +== Update a conversation +To update the metadata of an existing conversation, send a `POST` request to the `/api/rest/2.0/ai/agent/conversations/{conversation_identifier}/update` API endpoint with the conversation ID in the request URL. Currently, the API endpoint allows you to rename the conversation title only. + +=== Request parameters + +[width="100%", cols="2,4"] +[options="header"] +|===== +|Parameter|Description +|`conversation_identifier`|__String__. Path parameter. Unique identifier of the conversation to update. +|`title`|__String__. Form parameter to include in the request body. To rename the display title of the conversation, specify the title string. +|===== + +==== API request example + +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/ai/agent/conversations/0iwTDJU-tlkm/update' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ + --data-raw '{ + "title": "Revenue Analysis — Q1 2026" +}' +---- + +=== API response +A successful request returns the 204 response. The response body contains the updated conversation object reflecting the applied changes. + +[#delete-conversation] +== Delete a conversation +To delete a saved conversation and all its associated messages, send a `DELETE` request to the `/api/rest/2.0/ai/agent/conversations/{conversation_identifier}/delete` API endpoint with the conversation ID as a path parameter. + +[IMPORTANT] +==== +* ThoughtSpot allows only the conversation owners to delete a conversation. +* Deleted conversations and all their messages cannot be recovered. Therefore, we recommend exercising caution when deleting a saved conversation. +==== + +=== API request + +[source,cURL] +---- +curl -X DELETE \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/ai/agent/conversations/MotUVRdguIcr/delete' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' \ +---- + +=== API response +A successful request returns an HTTP `204 No Content` response with an empty body. After a successful deletion, subsequent calls to the get conversation messages or load answer endpoints for the same `conversation_identifier` result in the `404 Not Found` error. + +== Additional resources + +* See also xref:spotter-agent-apis.adoc[Spotter Agent APIs] +* To try out the request and response workflow, use the link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fai%2Fget-conversation[REST API Playground] diff --git a/modules/ROOT/pages/spotter-agent-instructions.adoc b/modules/ROOT/pages/spotter-agent-instructions.adoc index 6b5deff35..47f85add3 100644 --- a/modules/ROOT/pages/spotter-agent-instructions.adoc +++ b/modules/ROOT/pages/spotter-agent-instructions.adoc @@ -1,8 +1,8 @@ -= Spotter AI Agent instructions API += Spotter AI agent instructions APIs :toc: true :toclevels: 2 -:page-title: Spotter Agent instructions APIs +:page-title: Spotter AI agent instructions APIs :page-pageid: spotter-agent-instructions :page-description: Use the Spotter agent instructions APIs to set and retrieve persistent behavioral guidance for the Spotter agent in a conversation session. diff --git a/modules/ROOT/pages/spotter-apis.adoc b/modules/ROOT/pages/spotter-apis.adoc index 88aab5c4a..a7ebfc290 100644 --- a/modules/ROOT/pages/spotter-apis.adoc +++ b/modules/ROOT/pages/spotter-apis.adoc @@ -25,6 +25,7 @@ For information about supported API operations, see the following pages: * xref:spotter-classic-apis.adoc[APIs for Spotter classic workflow] * xref:spotter-agent-apis.adoc[APIs for Spotter agent workflows] +* xref:spotter-agent-conversation-mgmt-apis.adoc[APIs for Spotter conversation management] * xref:spotter-nl-instructions.adoc[APIs for Spotter coaching and NL instructions] * xref:spotter-agent-instructions.adoc[APIs for Spotter agent instructions] @@ -48,10 +49,9 @@ The following rate limits apply to Spotter agent APIs per user: |API endpoint| Rate Limit (per user, per minute) |`/api/rest/2.0/ai/agent/conversation/create` | 10 |`/api/rest/2.0/ai/agent/conversation/{conversation_identifier}/send`| 30 -|`POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/send/stream` | 30 +|`/api/rest/2.0/ai/agent/conversation/{conversation_identifier}/send/stream` | 30 |`/api/rest/2.0/ai/agent/{conversation_identifier}/converse` [.version-badge.deprecated]#Deprecated# | 30 |`/api/rest/2.0/ai/agent/converse/sse` [.version-badge.deprecated]#Deprecated# | 30 -|| |===== If you are integrating these APIs in your environment, consider implementing a retry logic to handle the rate limit errors. diff --git a/modules/ROOT/pages/spotter-classic-apis.adoc b/modules/ROOT/pages/spotter-classic-apis.adoc index 0b93fc5f2..2d8bb534a 100644 --- a/modules/ROOT/pages/spotter-classic-apis.adoc +++ b/modules/ROOT/pages/spotter-classic-apis.adoc @@ -6,7 +6,7 @@ :page-pageid: spotter-apis-classic :page-description: You can use Spotter REST APIs to receive Answers for your analytical queries sent through the conversational experience with ThoughtSpot. -This document describes how to use AI APIs with Spotter Classic to query and explore data through conversational interactions. +This page describes how to use AI APIs with Spotter Classic to query and explore data through conversational interactions. For information about APIs for agent interactions, see xref:spotter-agent-apis.adoc[Spotter Agent APIs]. @@ -102,7 +102,7 @@ If the API request is successful, a conversation identifier is created. Note the ---- == Send a query to a conversation session -To send a question to an ongoing conversation session or ask follow-up questions, send a `POST` request body with conversation ID and query text to the `POST /api/rest/2.0/ai/conversation/{conversation_identifier}/converse` API endpoint. +To send a question to an ongoing conversation session or ask follow-up questions, send a `POST` request to the `/api/rest/2.0/ai/conversation/{conversation_identifier}/converse` API endpoint with the conversation ID and query text in the request body. This API endpoint supports only the conversation sessions created using the `POST /api/rest/2.0/ai/conversation/create` API call. @@ -112,7 +112,7 @@ This API endpoint supports only the conversation sessions created using the `POS [options='header'] |===== |Parameter|Type| Description -|`conversation_identifier`|Path parameter|__String__. Required. Specify the GUID of the conversation received from the xref:spotter-apis.adoc#_create_a_conversation_session[create conversation API call]. +|`conversation_identifier`|Path parameter|__String__. Required. Specify the GUID of the conversation received from the xref:spotter-classic-apis.adoc#_create_a_conversation_session[create conversation API call]. |`metadata_identifier`|Form parameter|_String_. Required. Specify the GUID of the data source object, for example, Model. The metadata object specified in the API request will be used as a data source for the follow-up conversation. |`message`|Form parameter|_String_. Required. Specify a natural language query string. For example, `Sales data for Jackets`. |===== @@ -179,7 +179,7 @@ curl -X POST \ -H 'Authorization: Bearer {AUTH_TOKEN}' \ --data-raw '{ "metadata_identifier": "cd252e5c-b552-49a8-821d-3eadaa049cca", - "message": "which city has the better sales of jackets here?" + "message": "which city has the best sales of jackets here?" }' ---- diff --git a/modules/ROOT/pages/spotter-nl-instructions.adoc b/modules/ROOT/pages/spotter-nl-instructions.adoc index 950db8d4b..8a256e7ec 100644 --- a/modules/ROOT/pages/spotter-nl-instructions.adoc +++ b/modules/ROOT/pages/spotter-nl-instructions.adoc @@ -1,4 +1,4 @@ -= Data model instructions API += Data model instructions APIs :toc: true :toclevels: 2 @@ -15,7 +15,7 @@ To set instructions for a Model, send a `POST` request to the `/api/rest/2.0/ai/ [NOTE] ==== -To set NL instructions, you need administration or data management privileges, or at least edit access to the data Model. +To set NL instructions, you need `CAN_USE_SPOTTER` privilege and at least edit access to the data Model. ==== === Request parameters diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index d61f01e9a..70246a078 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -45,27 +45,22 @@ For SpotterViz customization in embedded view, the Visual Embed SDK also provide ThoughtSpot now enforces strict org isolation when users authenticate through a per-org identity provider (IdP). When a per-org IdP sends SAML or OIDC group claims that reference Orgs outside its authorized scope, ThoughtSpot silently drops those claims and records them as security audit events. This prevents a rogue IdP administrator in one Org from using group assertions to gain unauthorized access to another Org. Manually-assigned existing Org memberships are unaffected. [discrete] -==== Spotter file upload in embedded apps [.version-badge.new]#New# -Applications embedding Spotter interface can now allow their users to xref:embed-spotter.adoc#_enable_file_upload_in_spotter_chat[upload files directly in the Spotter chat panel]. The SDK introduces two new configuration parameters in `SpotterChatViewConfig` to enable and control this capability: +==== Spotter embedding -* `spotterFileUploadEnabled`: + -When set to `true`, enables the file upload feature in the Spotter chat panel. -* `spotterFileUploadFileTypes`: + -Restricts the file types allowed for upload. Accepts a `SpotterFileUploadFileTypes` object. +Spotter file upload in embedded apps:: +Applications embedding Spotter interface can now allow their users to xref:embed-spotter.adoc#_enable_file_upload_in_spotter_chat[upload files directly in the Spotter chat panel]. + +Spotter conversation history:: +You can now save your Spotter conversation and manage chat history using Spotter AI REST APIs. For more information, see xref:spotter-agent-conversation-mgmt-apis.adoc[Spotter AI agent conversation management]. --- [discrete] -==== Focused homepage experience [.version-badge.new]#New# -In full application embedding, when the V3 navigation and home page experience is enabled, ThoughtSpot provides an additional option to switch to the new focused home page experience. The focused home page experience provides a streamlined, contemporary experience along with the Spotter panel. For more information, see xref:customize-homepage-full-embed.adoc[Customize home page experience]. +==== Full application embedding +In full application embedding with the V3 navigation and home page experience enabled, ThoughtSpot provides an additional option to switch to the new focused home page experience. The focused home page experience provides a streamlined, contemporary experience along with the Spotter panel. For more information, see xref:customize-homepage-full-embed.adoc[Customize home page experience]. -[NOTE] -==== -The focused homepage experience is in beta and disabled by default. To enable this experience in your embedding application, the feature must be enabled on your ThoughtSpot instance and in the Visual Embed SDK. -==== --- - [discrete] ==== Webhooks enhancements [.version-badge.new]#New# @@ -90,13 +85,6 @@ The xref:webhooks-api.adoc#_updating_a_webhook[webhook update API endpoint] supp The Liveboard browser cache feature is now in Early Access. When `enableLiveboardDataCache` is set to `true` in your `LiveboardEmbed` configuration, ThoughtSpot caches Liveboard visualization data in the browser to significantly reduce reload times on revisit. For SDK event and action IDs, see the xref:api-changelog.adoc#_liveboard_browser_cache_refresh[Liveboard browser cache refresh]. ---- - -[discrete] -==== Spotter conversation history [.version-badge.new]#New# -You can now save your Spotter conversation and manage chat history using Spotter AI REST APIs. For more information, see xref:saved-conversations-api.adoc[Saved Chat public APIs]. - -For embedding applications using Spotter interface, Visual Embed SDK provides a set of host events to programmatically manage saved conversations. --- From f93d1cb8855ea15d990536a2048a337983eea139 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 18:05:55 +0530 Subject: [PATCH 097/136] edits --- modules/ROOT/pages/spotter-agent-apis.adoc | 3 +-- .../spotter-agent-conversation-mgmt-apis.adoc | 2 +- modules/ROOT/pages/spotter-agent-instructions.adoc | 14 +++++++------- modules/ROOT/pages/spotter-nl-instructions.adoc | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/modules/ROOT/pages/spotter-agent-apis.adoc b/modules/ROOT/pages/spotter-agent-apis.adoc index 1b00e32ed..5ea2587af 100644 --- a/modules/ROOT/pages/spotter-agent-apis.adoc +++ b/modules/ROOT/pages/spotter-agent-apis.adoc @@ -1043,8 +1043,7 @@ data: { The `/api/rest/2.0/ai/agent/conversation/{conversation_identifier}/stop-response` API endpoint stops a Spotter agent response that is currently in progress for a given conversation session. -Use this endpoint when you want to cancel a long-running Spotter response before it completes. -The conversation session remains active after you stop a response, so you can send a new query to the same session immediately. +Use this endpoint when you want to cancel a long-running Spotter response before it completes. The conversation session remains active after you stop a response, so you can send a new query to the same session immediately. === Request parameters diff --git a/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc b/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc index effb4adce..12b409904 100644 --- a/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc +++ b/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc @@ -9,7 +9,7 @@ ThoughtSpot's Spotter Agent conversation management APIs allow you to retrieve, update, and delete saved Spotter agent conversations and their message history. These APIs allow you to build and render custom conversation history UI, audit trails, and administrative conversation management workflows in applications using Spotter engine or embedding Spotter interface. == Prerequisites -To create, save, and manage conversation sessions with the Spotter agent, the user generating the API request requires `CAN_USE_SPOTTER` privilege and access to the saved conversation. +To create, save, and manage conversation sessions with the Spotter agent, you need CAN_USE_SPOTTER privilege and access to the saved conversation. Only conversation owners can delete or update their conversations. == Supported API operations diff --git a/modules/ROOT/pages/spotter-agent-instructions.adoc b/modules/ROOT/pages/spotter-agent-instructions.adoc index 47f85add3..45403134f 100644 --- a/modules/ROOT/pages/spotter-agent-instructions.adoc +++ b/modules/ROOT/pages/spotter-agent-instructions.adoc @@ -10,11 +10,6 @@ Administrators and developers can configure persistent behavioral instructions f Unlike xref:spotter-nl-instructions.adoc[data model instructions], which operate at the data model level, agent instructions operate at the agent level and do not require a data source identifier. -[NOTE] -==== -To use the agent instructions APIs, you need `CAN_USE_SPOTTER` privilege and valid authentication. -==== - == Supported API endpoints [width="100%", cols="1"] @@ -30,10 +25,12 @@ __Available on ThoughtSpot Cloud instances from 26.6.0.cl onwards.__ == Set agent instructions -The `PUT /api/rest/2.0/ai/agent/instructions/set` API endpoint sets behavioral instructions for the Spotter agent. -Use this endpoint to define persistent guidance that Spotter applies when responding to queries. +The `PUT /api/rest/2.0/ai/agent/instructions/set` API endpoint sets behavioral instructions for the Spotter agent. Use this endpoint to define persistent guidance that Spotter applies when responding to queries. Instructions persist until you overwrite or remove them by sending a new `PUT` request. +=== Prerequisites +To configure agent instructions, you need administration or `CAN_MANAGE_SPOTTER` (**Can manage Spotter**) privilege. + === Request parameters [width="100%", cols="2,4"] @@ -90,6 +87,9 @@ If the request fails, ThoughtSpot returns an error code and message. For example The `GET /api/rest/2.0/ai/agent/instructions/get` API endpoint retrieves the behavioral instructions currently configured for the Spotter agent. +=== Prerequisites +To retrieve agent instructions using REST API, administration privilege are required. + === Request parameters This endpoint does not require a request body or query parameters. diff --git a/modules/ROOT/pages/spotter-nl-instructions.adoc b/modules/ROOT/pages/spotter-nl-instructions.adoc index 8a256e7ec..e45519957 100644 --- a/modules/ROOT/pages/spotter-nl-instructions.adoc +++ b/modules/ROOT/pages/spotter-nl-instructions.adoc @@ -15,7 +15,7 @@ To set instructions for a Model, send a `POST` request to the `/api/rest/2.0/ai/ [NOTE] ==== -To set NL instructions, you need `CAN_USE_SPOTTER` privilege and at least edit access to the data Model. +To set NL instructions, you need `CAN_USE_SPOTTER` or `CAN_MANAGE_SPOTTER` privilege and at least edit access to the data Model. ==== === Request parameters From de4bf389687ad35482fb267599387b6dd6553699 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 18:18:06 +0530 Subject: [PATCH 098/136] edits --- modules/ROOT/pages/api-changelog.adoc | 2 +- modules/ROOT/pages/common/nav-rest-api.adoc | 2 +- modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc | 4 ++-- modules/ROOT/pages/whats-new.adoc | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index 7777491d9..bfb062b13 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -38,7 +38,7 @@ Renames a specific saved conversation by ID. + ==== Users can only load, delete, or rename their own conversations. These operations require the user to have Spotter access and the *Save chat* feature enabled on the cluster. ==== -For more information, see xref:saved-conversations-api.adoc[Saved Chat public APIs]. +For more information, see xref:saved-conversations-api.adoc[APIs for managing saved conversations]. |[tag redBackground]#BREAKING CHANGE# a| [discrete] diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index 5e936f8f4..c4f5cf2de 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -22,7 +22,7 @@ REST APIs * link:{{navprefix}}/spotter-api[Spotter APIs] ** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] ** link:{{navprefix}}/spotter-agent-instructions[Spotter AI agent instructions] -** link:{{navprefix}}/spotter-agent-conversation-mgmt-apis[Spotter AI Agent conversation management] +** link:{{navprefix}}/spotter-agent-conversation-mgmt-apis[APIs for managing saved conversations] ** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] ** link:{{navprefix}}/spotter-nl-instructions[Spotter instructions APIs ^BETA^] * link:{{navprefix}}/audit-logs[Audit logs] diff --git a/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc b/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc index 12b409904..e5028707f 100644 --- a/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc +++ b/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc @@ -1,8 +1,8 @@ -= Spotter AI agent conversation management += APIs for managing saved conversations :toc: true :toclevels: 3 -:page-title: Spotter agent conversation management APIs +:page-title: APIs for managing saved conversations :page-pageid: spotter-agent-conversation-mgmt-apis :page-description: Use the Spotter agent conversation management REST API endpoints to retrieve, update, and delete saved Spotter agent conversations and their messages. diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 70246a078..7510166a3 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -51,7 +51,7 @@ Spotter file upload in embedded apps:: Applications embedding Spotter interface can now allow their users to xref:embed-spotter.adoc#_enable_file_upload_in_spotter_chat[upload files directly in the Spotter chat panel]. Spotter conversation history:: -You can now save your Spotter conversation and manage chat history using Spotter AI REST APIs. For more information, see xref:spotter-agent-conversation-mgmt-apis.adoc[Spotter AI agent conversation management]. +You can now save your Spotter conversation and manage chat history using Spotter AI REST APIs. For more information, see xref:spotter-agent-conversation-mgmt-apis.adoc[APIs for managing saved conversations]. --- From 2f7bb8fbeb20788251c0ddd3845015299dee3386 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 18:22:05 +0530 Subject: [PATCH 099/136] typo fixes --- modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc b/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc index e5028707f..3d41456b4 100644 --- a/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc +++ b/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc @@ -28,7 +28,8 @@ xref:spotter-agent-conversation-mgmt-apis.adoc#get-conversation-list[Retrieves a __Available on ThoughtSpot Cloud instances from 26.7.0.cl onwards.__ a|`GET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/answers/{answer_identifier}/details` + -xref:spotter-agent-conversation-mgmt-apis.adoc#load-answer[Retrieves the full answer payload for a specific answer] within a saved conversation. Use this endpoint to resolve `answer_id` references returned by the get conversation messages endpoint. + +xref:spotter-agent-conversation-mgmt-apis.adoc#load-answer[Retrieves the full answer payload for a specific answer] within a saved conversation. + +Use this endpoint to resolve `answer_id` references returned by the get conversation messages endpoint. + __Available on ThoughtSpot Cloud instances from 26.7.0.cl onwards.__ a|`POST /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/update` + From d18bd306d2df3551162ce9ee4ff80e85bff1926f Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 19:08:15 +0530 Subject: [PATCH 100/136] edits --- modules/ROOT/pages/spotter-nl-instructions.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/spotter-nl-instructions.adoc b/modules/ROOT/pages/spotter-nl-instructions.adoc index e45519957..73fec65d7 100644 --- a/modules/ROOT/pages/spotter-nl-instructions.adoc +++ b/modules/ROOT/pages/spotter-nl-instructions.adoc @@ -15,7 +15,7 @@ To set instructions for a Model, send a `POST` request to the `/api/rest/2.0/ai/ [NOTE] ==== -To set NL instructions, you need `CAN_USE_SPOTTER` or `CAN_MANAGE_SPOTTER` privilege and at least edit access to the data Model. +To set NL instructions, you need `CAN_MANAGE_SPOTTER` (**Can manage Spotter**) privilege and at least edit access to the data model. ==== === Request parameters From 4c6f8b995ac055d3a691fe8599c0acd7ed1170d7 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 19:16:10 +0530 Subject: [PATCH 101/136] SCAL-321605 --- modules/ROOT/pages/spotter-nl-instructions.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/spotter-nl-instructions.adoc b/modules/ROOT/pages/spotter-nl-instructions.adoc index 950db8d4b..cc6e3c16d 100644 --- a/modules/ROOT/pages/spotter-nl-instructions.adoc +++ b/modules/ROOT/pages/spotter-nl-instructions.adoc @@ -15,7 +15,7 @@ To set instructions for a Model, send a `POST` request to the `/api/rest/2.0/ai/ [NOTE] ==== -To set NL instructions, you need administration or data management privileges, or at least edit access to the data Model. +To set NL instructions, you need `CAN_MANAGE_SPOTTER` (**Can manage Spotter**) privilege and either edit access or `SPOTTER_COACHING_PRIVILEGE` permission on the data model. Ensure that your bearer token is scoped to the Org where the data model resides. ==== === Request parameters From d736bf1bed14ceca5a2b3c83fdf32062ccaa13b3 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 19:16:10 +0530 Subject: [PATCH 102/136] SCAL-321605 --- modules/ROOT/pages/spotter-nl-instructions.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/spotter-nl-instructions.adoc b/modules/ROOT/pages/spotter-nl-instructions.adoc index 73fec65d7..8062ca369 100644 --- a/modules/ROOT/pages/spotter-nl-instructions.adoc +++ b/modules/ROOT/pages/spotter-nl-instructions.adoc @@ -15,7 +15,7 @@ To set instructions for a Model, send a `POST` request to the `/api/rest/2.0/ai/ [NOTE] ==== -To set NL instructions, you need `CAN_MANAGE_SPOTTER` (**Can manage Spotter**) privilege and at least edit access to the data model. +To set NL instructions, you need `CAN_MANAGE_SPOTTER` (**Can manage Spotter**) privilege and either edit access or `SPOTTER_COACHING_PRIVILEGE` permission on the data model. Ensure that your bearer token is scoped to the Org where the data model resides. ==== === Request parameters From bdcd6ada613061fbcde430ff2b664ba15a32647e Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 19:30:18 +0530 Subject: [PATCH 103/136] spotter 3 terminology --- .../pages/spotter-agent-conversation-mgmt-apis.adoc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc b/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc index 3d41456b4..371233233 100644 --- a/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc +++ b/modules/ROOT/pages/spotter-agent-conversation-mgmt-apis.adoc @@ -4,23 +4,23 @@ :page-title: APIs for managing saved conversations :page-pageid: spotter-agent-conversation-mgmt-apis -:page-description: Use the Spotter agent conversation management REST API endpoints to retrieve, update, and delete saved Spotter agent conversations and their messages. +:page-description: Use the Spotter 3 conversation management REST API endpoints to retrieve, update, and delete saved Spotter 3 conversations and their messages. -ThoughtSpot's Spotter Agent conversation management APIs allow you to retrieve, update, and delete saved Spotter agent conversations and their message history. These APIs allow you to build and render custom conversation history UI, audit trails, and administrative conversation management workflows in applications using Spotter engine or embedding Spotter interface. +ThoughtSpot's Spotter AI conversation management APIs allow you to retrieve, update, and delete saved Spotter 3 conversations and their message history. These APIs allow you to build and render custom conversation history UI, audit trails, and administrative conversation management workflows in applications using Spotter engine or embedding Spotter interface. == Prerequisites -To create, save, and manage conversation sessions with the Spotter agent, you need CAN_USE_SPOTTER privilege and access to the saved conversation. Only conversation owners can delete or update their conversations. +To create, save, and manage conversation sessions with the Spotter 3 agent, you need `CAN_USE_SPOTTER` (**Can use Spotter**) privilege and access to the saved conversation. Only conversation owners can delete or update their saved conversations. == Supported API operations [width="100%", cols="1"] |===== a|`POST /api/rest/2.0/ai/agent/conversation/create` + -Allows you to save a Spotter agent conversation session + +Allows you to save a conversation session with Spotter AI agent + __Available on ThoughtSpot Cloud instances from 26.5.0.cl onwards.__ a|`GET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/messages` + -xref:spotter-agent-conversation-mgmt-apis.adoc#get-conversation[Retrieves the full message history of a saved Spotter agent conversation], including ordered user prompts, agent response items, and code-execution file metadata. + +xref:spotter-agent-conversation-mgmt-apis.adoc#get-conversation[Retrieves the full message history of a saved Spotter 3 conversation], including ordered user prompts, agent response items, and code-execution file metadata. + __Available on ThoughtSpot Cloud instances from 26.7.0.cl onwards.__ a|`GET /api/rest/2.0/ai/agent/conversations` + From 8ba08ef0bbf90904bc85163c429e1256a6e47714 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 19:57:59 +0530 Subject: [PATCH 104/136] privilege update --- modules/ROOT/pages/spotter-nl-instructions.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/spotter-nl-instructions.adoc b/modules/ROOT/pages/spotter-nl-instructions.adoc index cc6e3c16d..829b5b244 100644 --- a/modules/ROOT/pages/spotter-nl-instructions.adoc +++ b/modules/ROOT/pages/spotter-nl-instructions.adoc @@ -15,7 +15,7 @@ To set instructions for a Model, send a `POST` request to the `/api/rest/2.0/ai/ [NOTE] ==== -To set NL instructions, you need `CAN_MANAGE_SPOTTER` (**Can manage Spotter**) privilege and either edit access or `SPOTTER_COACHING_PRIVILEGE` permission on the data model. Ensure that your bearer token is scoped to the Org where the data model resides. +To set NL instructions, you need `CAN_USE_SPOTTER` (**Can use Spotter**) privilege and either edit access or `SPOTTER_COACHING_PRIVILEGE` permission on the data model. Ensure that your bearer token is scoped to the Org where the data model resides. ==== === Request parameters From 69b64d9cbd58238d1ce6e1aa03b7d47be94af106 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 20:16:48 +0530 Subject: [PATCH 105/136] edits --- modules/ROOT/pages/spotter-agent-instructions.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/spotter-agent-instructions.adoc b/modules/ROOT/pages/spotter-agent-instructions.adoc index 45403134f..c6a26def7 100644 --- a/modules/ROOT/pages/spotter-agent-instructions.adoc +++ b/modules/ROOT/pages/spotter-agent-instructions.adoc @@ -6,7 +6,7 @@ :page-pageid: spotter-agent-instructions :page-description: Use the Spotter agent instructions APIs to set and retrieve persistent behavioral guidance for the Spotter agent in a conversation session. -Administrators and developers can configure persistent behavioral instructions for the Spotter agent using the agent instructions APIs. These instructions guide how Spotter responds within a conversation context. For example, to focus on specific business domains, enforce response formats, or apply analytical constraints. +Administrators and developers can configure persistent behavioral instructions for the Spotter agent using agent instructions APIs. These instructions guide how Spotter responds within a conversation context. For example, to focus on specific business domains, enforce response formats, or apply analytical constraints. Unlike xref:spotter-nl-instructions.adoc[data model instructions], which operate at the data model level, agent instructions operate at the agent level and do not require a data source identifier. @@ -88,7 +88,7 @@ If the request fails, ThoughtSpot returns an error code and message. For example The `GET /api/rest/2.0/ai/agent/instructions/get` API endpoint retrieves the behavioral instructions currently configured for the Spotter agent. === Prerequisites -To retrieve agent instructions using REST API, administration privilege are required. +To retrieve agent instructions via REST API, you need administration privileges. === Request parameters From 9a3e3b390887b1dd6486f11dcc8a7891899f28d4 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 22:12:08 +0530 Subject: [PATCH 106/136] RBAC updates --- modules/ROOT/pages/api-user-management.adoc | 15 ++++++- modules/ROOT/pages/privileges-and-roles.adoc | 9 +++-- modules/ROOT/pages/roles.adoc | 42 +++++++++----------- 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/modules/ROOT/pages/api-user-management.adoc b/modules/ROOT/pages/api-user-management.adoc index 29b93765c..7e04fb1fc 100644 --- a/modules/ROOT/pages/api-user-management.adoc +++ b/modules/ROOT/pages/api-user-management.adoc @@ -217,6 +217,17 @@ ThoughtSpot also has a default group called `All`. When you create new users in ==== == Roles -If Role-Based Access Control (RBAC) is enabled on your instance, administrators can define Role privileges and assign these to users via Groups. +If Role-Based Access Control (RBAC) is enabled on your instance, administrators can define role privileges and assign them to users via groups. Roles are always scoped to an Org, a role created in one Org cannot be assigned in another. -For more information, see xref:roles.adoc[Role-based access control] and link:https://docs.thoughtspot.com/cloud/latest/rbac[ThoughtSpot Product documentation, window=_blank]. +=== Assign roles to groups via REST API +When creating or updating a group using the REST API v2 endpoints, use the `role_identifiers` parameter to assign one or more roles to the group. The parameter accepts an array of role GUIDs or role names. For more information, see: + +* link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fgroups%2Fcreate-user-group[`POST /api/rest/2.0/groups/create`]: include `role_identifiers` in the request body. +* link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fapi-endpoints%2Fgroups%2Fupdate-user-group[`POST /api/rest/2.0/groups/{group_identifier}/update`]: include `role_identifiers` to add roles to an existing group. + +[NOTE] +==== +Roles must available before they can be assigned. Use the xref:roles-api.adoc[Roles API] to create roles programmatically before calling the group create or update endpoints. +==== + +For a complete list of available privileges and role categories, see xref:roles.adoc[Role-based access control]. \ No newline at end of file diff --git a/modules/ROOT/pages/privileges-and-roles.adoc b/modules/ROOT/pages/privileges-and-roles.adoc index f7967bac8..f602e2b55 100644 --- a/modules/ROOT/pages/privileges-and-roles.adoc +++ b/modules/ROOT/pages/privileges-and-roles.adoc @@ -6,7 +6,7 @@ :page-pageid: privileges-and-roles :page-description: Users are granted system features via privileges which are grouped into roles -System privileges determine the workflows and actions that users can perform within the ThoughtSpot application context. +System privileges determine the workflows and actions that users can perform within the ThoughtSpot application context. == Privileges ThoughtSpot allows you to define several types of privileges: @@ -14,13 +14,14 @@ ThoughtSpot allows you to define several types of privileges: * Role-specific privileges for administrators, developers, and other user personas. * Data-related privileges to allow or prevent access to upload, download, or manage data. * Workflow-specific privileges to enable or disable access to features such as SpotIQ analysis, scheduling Liveboards, or the experimental features available for evaluation and early adoption. +* Spotter-specific privileges to control access to Spotter and administer Spotter workflows. -For more information about privileges, see link:https://docs.thoughtspot.com/cloud/latest/groups-privileges[Understand groups and privileges, window=_blank]. +For more information about privileges, see link:https://docs.thoughtspot.com/cloud/latest/groups-privileges[Understand groups and privileges, window=_blank] and xref:roles.adoc#_application_control[Application control privileges]. == Roles -In ThoughtSpot 9.8.0.cl and later versions, privileges can be assigned via link:https://docs.thoughtspot.com/cloud/latest/rbac[Roles, window=_blank] and assigned to groups if Role-Based Access Control (RBAC) is enabled. The RBAC feature is in beta and turned off by default on ThoughtSpot instances. To enable this feature on your instance, contact ThoughtSpot Support. +Privileges can be assigned via link:https://docs.thoughtspot.com/cloud/latest/rbac[Roles, window=_blank] and grouped using Role-Based Access Control (RBAC). -If RBAC is not enabled, administrators can configure link:https://docs.thoughtspot.com/cloud/latest/groups-privileges[privileges, window=_blank] and assign it directly to groups. +If RBAC is not enabled, administrators can configure link:https://docs.thoughtspot.com/cloud/latest/groups-privileges[privileges, window=_blank] and assign them directly to groups. == User and group shareability *Shareable* is a property of a user or group object which controls visibility of users and groups in the *Share* dialog. diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 7ae0fc708..8af3dbb24 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -4,7 +4,7 @@ :page-title: Role-based access control :page-pageid: rbac -:page-description: Use the Robe-based access control feature for granular access control +:page-description: Use the Role-based access control feature for granular access control ThoughtSpot administrators can assign granular privileges to users with Role-Based Access Control (RBAC). @@ -47,12 +47,7 @@ Administrators can create a Role with a specific set of privileges and assign th Roles are unique to an Org and can be created only within the context of an Org. ==== -For more information about Role and Group assignment, see link:https://docs.thoughtspot.com/cloud/latest/rbac#_data_download_control_privileges[ThoughtSpot Product Documentation]. -//// -[.widthAuto] -image::./images/role-group.png[Roles] -//// - +For more information about Role and Group assignment, see link:https://docs.thoughtspot.com/cloud/latest/rbac[ThoughtSpot Product Documentation, window=_blank]. == Role categories and privileges @@ -77,13 +72,13 @@ UI: *Can manage users* | Allows users to create, edit, and manage users via UI |Group administration | API: `GROUP_ADMINISTRATION` + UI: *Can manage groups* | Allows users to create, edit, and manage groups via UI or REST API calls. |Role administration| API: `ROLE_ADMINISTRATION` + -UI: *Can manage roles* | Allows users to create, edit, and manage Roles vis UI or REST API calls. +UI: *Can manage roles* | Allows users to create, edit, and manage Roles via UI or REST API calls. |Authentication administration|API: `AUTHENTICATION_ADMINISTRATION` + UI: *Can manage authentication* | Allows users to manage authentication and authorization process for ThoughtSpot users. |Application administration|API: `APPLICATION_ADMINISTRATION` + UI: *Can manage application settings* | Provides access to manage cluster-wide application settings, activation and de-activation of features on an instance. |System monitoring|API: `SYSTEM_INFO_ADMINISTRATION` + -UI: *Can view system activities* | Allows users to manage system activities. +UI: *Can view system activities* | Allows users to view system activities and monitor health. |Billing administration|API: `BILLING_INFO_ADMINISTRATION` + UI: *Can view billing information* | Allows view access to billing information. |Trusted authentication control|API: `CONTROL_TRUSTED_AUTH` + @@ -105,7 +100,7 @@ link:https://docs.thoughtspot.com/cloud/latest/analyst-studio-getting-started[An === Application control -The application control privileges include the following: +The application control role privileges include the following: [width="100%" cols="2,4,4"] [options='header'] @@ -116,7 +111,7 @@ UI: *Has SpotIQ privilege* | Allows access to the SpotIQ feature in ThoughtSpot. |Developer| API: `DEVELOPER` + UI: *Has developer privilege* a| Allows users to access the following features and workflows: -** Access **Develop** page and Playground + +** Access *Develop* page and Playground + ** Embed a ThoughtSpot application page, object, or full experience in an external application + ** Customize styles for embedded content + ** Add custom actions to the embedded objects such as Liveboard and visualizations + @@ -126,22 +121,23 @@ UI: *Has developer privilege* a| Allows users to access the following features UI: *Can schedule for others* |Allows users to schedule, edit, and delete Liveboard jobs. |ThoughtSpot Sync|API: `SYNCMANAGEMENT` + UI: *Can manage sync settings* | Allows setting up secure pipelines to external business apps and sync data using ThoughtSpot Sync. -|ThoughtSpot Spotter|API: `CAN_USE_SPOTTER` + +|Spotter access|API: `CAN_USE_SPOTTER` + UI: *Can use Spotter* | Allows access to ThoughtSpot Spotter and natural language query and answer generation. -|Catalog management|API: `CAN_CREATE_CATALOG` + -UI: *Can manage catalog*| Allows users to create, edit, and manage a link:https://docs.thoughtspot.com/cloud/latest/catalog-integration[data connection to Alation, window=_blank], and import metadata. +|Spotter administration|API: `CAN_MANAGE_SPOTTER` + +UI: *Can manage Spotter* a| Allows a designated Spotter administrator to manage Spotter's behavior across the organization. This role provides the following capabilities: -//|R Analysis|API: `RANALYSIS` + -//UI: *Can invoke custom R analysis* |Allows invoking R scripts to explore search answers and share custom scripts. +* On data models: The user can manage global coaching, manage Spotter memory (including memory from multi-model Liveboards), and delegate coaching access to other users. +* Across all Orgs (regardless of data model access): the user can add and manage Spotter instructions. -|Liveboard verification|API: `LIVEBOARD_VERIFIER` + -UI: *Can verify Liveboards* | Allows Liveboard users to verify Liveboard access requests and mark a Liveboard as verified. -|Webhook management| API: `CAN_MANAGE_WEBHOOKS` + -UI: *Can manage webhooks* | Allows users to xref:webhooks.adoc#[create and manage a webhook]. -|Version control with Git | API: `CAN_MANAGE_VERSION_CONTROL` + -UI: *Can toggle version control for objects* | Allows users to enable version control on a Liveboard or Answer. -|=== +[NOTE] +==== +* The `CAN_MANAGE_SPOTTER` privilege implies `CAN_USE_SPOTTER`, so separate assignment is required. +* The `CAN_MANAGE_SPOTTER` privilege does not grant data model edit access, does not allow editing columns, synonyms, or descriptions, and does not override data access permissions. +==== +|Catalog management|API: `CAN_CREATE_CATALOG` + +UI: *Can manage catalog*| Allows users to create, edit, and manage a link:https://docs.thoughtspot.com/cloud/latest/catalog-integration[data connector catalog, window=_blank]. +|=== === Object access control From f2b60159c18df9b5641aa23986423752999ef4c4 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Wed, 1 Jul 2026 22:57:27 +0530 Subject: [PATCH 107/136] homepage edits --- .../pages/customize-homepage-full-embed.adoc | 45 +++++++++++++++++-- .../ROOT/pages/customize-nav-full-embed.adoc | 6 +++ modules/ROOT/pages/full-app-customize.adoc | 44 +++++++++++------- modules/ROOT/pages/full-embed.adoc | 4 +- 4 files changed, 80 insertions(+), 19 deletions(-) diff --git a/modules/ROOT/pages/customize-homepage-full-embed.adoc b/modules/ROOT/pages/customize-homepage-full-embed.adoc index bcffba68a..5eded5462 100644 --- a/modules/ROOT/pages/customize-homepage-full-embed.adoc +++ b/modules/ROOT/pages/customize-homepage-full-embed.adoc @@ -27,11 +27,45 @@ In the classic (V1) experience, the home page has a static layout and does not s In the V3 experience, the SDK provides the xref:HomePage.adoc[homePage] attribute to set the desired home page layout: +* `homePage: HomePage.Focused` + +Enables the V4 focused home page experience. +*Prerequisite*: Spotter must be enabled on your ThoughtSpot instance. * `homePage: HomePage.ModularWithStylingChanges` + Enables the V3 modular home page experience with customizable components, styling options, and enhanced layout. * `homePage: HomePage.Modular` + Enables the basic modular home page experience with customizable components. +[#_enable_focused_home_page] +=== V4 focused home page experience +The V4 focused home page (`HomePage.Focused`) consolidates the Watchlist and Recents sections into a unified, focused layout. Unlike the V3 modular home page, the V4 layout is designed to highlight the most relevant content immediately. + +[IMPORTANT] +==== +The V4 focused home page experience requires Spotter to be enabled on your ThoughtSpot instance. +==== + +The following example shows how to enable the V4 focused home page experience: + +[source,javascript] +---- +import { + AppEmbed, + PrimaryNavbarVersion, // Enum for V3 navigation experience + HomePage, // Enum for home page experience settings + HomepageModule // Enum for home page modules +} from '@thoughtspot/visual-embed-sdk'; + +const embed = new AppEmbed("#embed", { + // Enable V3 navigation and V4 home page experience + discoveryExperience: { + primaryNavbarVersion: PrimaryNavbarVersion.Sliding, // Enable V3 navigation experience + homePage: HomePage.Focused, // Enable V4 focused home page experience + }, + showPrimaryNavbar: true, + //... other embed view configuration attributes +}); +---- + After migrating from V2 to V3 experience, the home page experience shows the following changes: * The charts in the **Watchlist** module are arranged horizontally. Each chart includes menu actions to remove the KPI charts from the watchlist and create alerts, and allows drag-and-drop reordering. @@ -56,27 +90,30 @@ In both V2 and V3, the SDK allows customization to include or exclude modules, c == Customization settings for home page The following customization settings are available for the modular home page in the V2 and V3 experience modes. -[width="100%", cols="2,2,2,2"] +[width="100%", cols="2,2,2,2,2"] [options='header'] |==== -|SDK property|Classic (V1) experience|V2 experience|V3 experience +|SDK property|Classic (V1) experience|V2 experience|V3 experience|V4 experience + +(`HomePage.Focused`) | `hiddenHomepageModules` + Controls the visibility of the modules on the home page. | [tag redBackground tick]#x# Not supported | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported - +| | `reorderedHomepageModules` + Arranges home page modules in the specified order. | [tag redBackground tick]#x# Not supported | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported + | `homePageSearchBarMode` + Sets the home page search bar experience to object search, Spotter/AI search, or none. | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported +| [tag greenBackground tick]#✓# Supported | `isUnifiedSearchExperienceEnabled` + Enables a combined interface with both Object Search and Natural Language Search. The unified experience is disabled by default. @@ -84,6 +121,7 @@ Enables a combined interface with both Object Search and Natural Language Search | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported + | `hideHomepageLeftNav` + Hides the xref:customize-nav-full-embed.adoc#_customize_the_left_navigation_panel_on_home_page[left navigation panel] on the home page. | [tag redBackground tick]#x# Not supported @@ -95,6 +133,7 @@ Hides xref:customize-nav-full-embed.adoc#_customize_the_left_navigation_panel_on | [tag redBackground tick]#x# Not supported | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported +| // TODO: verify with engineering — confirm which nav items are available in V4 |==== == Control the visibility of home page modules diff --git a/modules/ROOT/pages/customize-nav-full-embed.adoc b/modules/ROOT/pages/customize-nav-full-embed.adoc index 29b2e42cd..1f94621c3 100644 --- a/modules/ROOT/pages/customize-nav-full-embed.adoc +++ b/modules/ROOT/pages/customize-nav-full-embed.adoc @@ -47,7 +47,13 @@ a| ** Left navigation menu that adjusts its contents according to the application context. |==== +[NOTE] +==== +The V4 focused home page experience (`HomePage.Focused`) uses the same navigation customization controls as the V3 experience. All SDK properties listed in this article apply to the V4 experience when `PrimaryNavbarVersion.Sliding` is also configured. +==== + == Customize the top navigation bar + The following customization settings are available for the top navigation bar. [width="100%", cols="2,2,2,2"] diff --git a/modules/ROOT/pages/full-app-customize.adoc b/modules/ROOT/pages/full-app-customize.adoc index 44d9e2530..d1300092f 100644 --- a/modules/ROOT/pages/full-app-customize.adoc +++ b/modules/ROOT/pages/full-app-customize.adoc @@ -40,10 +40,14 @@ Includes a left navigation panel that dynamically adjusts its menu based on cont Limited customization controls |Redesigned top navigation bar with an app selector and other icons + Separate left navigation panel for each application context| Sliding left navigation panel with persona-based application icons + A dynamic left navigation menu that adjusts its contents according to the application context. -|**Home page experience**| Static home page with limited customization control | Modular home page with customizable components |Modular home page with customizable components, enhanced styling, and visual elements. +|**Home page experience** | Static home page with limited customization control a| Modular home page with customizable components |Modular home page with customizable components, enhanced styling, and visual elements. -|**Feature availability**| Enabled by default| Disabled by default | Disabled by default +[NOTE] +==== +The SDK also supports a V4 focused home page experience. For more information, see xref:full-app-customize.adoc#_enable_the_v4_focused_home_page_experience[Enable the V4 focused home page experience]. +==== +|**Feature availability**| Enabled by default| Disabled by default | Disabled by default |===== -- @@ -88,11 +92,14 @@ Enables the V3 experience. The valid value for the V3 experience is `PrimaryNavb If this attribute is not set, no changes will be applied, and the currently enabled UI experience in your app will be retained. * `homePage` + -Enables the modular home page experience. Valid values include: -** `HomePage.ModularWithStylingChanges` (__Recommended__) + +Enables the modular or focused home page experience. Valid values include: +** `HomePage.ModularWithStylingChanges` (__Recommended for V3__) + Enables the V3 modular home page experience. You must include `primaryNavbarVersion` to update the UI experience to the V3 home page. +** `HomePage.Focused` [.version-badge.new]#New#+ +Enables the V4 focused home page experience, which consolidates the Watchlist and Recents sections into a single, focused view. Ensure that Spotter is enabled on your ThoughtSpot instance. + ** `HomePage.Modular` + -Enables the modular home page experience with customizable components. This experience does not include the styling options and visual changes available with the full V3 experience. We do not recommend using this option, as it will be deprecated in an upcoming 2026 release. +Enables the modular home page experience with customizable components. This experience does not include the styling options and visual changes available with the full V3 experience. We do not recommend using this option, as it will be deprecated in an upcoming release. + [IMPORTANT] ==== @@ -154,30 +161,37 @@ const embed = new AppEmbed("#embed", { //... other embed view configuration attributes }); ---- -//// -* `homePage: HomePage.Modular` for the V2 modular home page layout. This option doesn't include the customizable components available in the V3 experience. -+ + +[#_enable_the_v4_focused_home_page_experience] +=== Enable the V4 focused home page experience + +The V4 focused home page experience is available with SDK `1.50.0` and ThoughtSpot Cloud `26.7.0.cl`. This experience consolidates the Watchlist and Recents sections into a unified, focused view designed to surface the most relevant content for users. + +[IMPORTANT] +==== +Spotter must be enabled on your ThoughtSpot instance before enabling the V4 focused home page experience. Contact your ThoughtSpot administrator to verify that Spotter is enabled. +==== + +To enable the V4 focused home page, set `homePage` to `HomePage.Focused` in the `discoveryExperience` object: + [source,JavaScript] ---- -// Import required components and enums for V3 experience +// Import required components and enums import { - AppEmbed, // Main class to embed the full ThoughtSpot app + AppEmbed, HomePage, // Enum for home page experience settings PrimaryNavbarVersion // Enum for V3 navigation experience } from '@thoughtspot/visual-embed-sdk'; const embed = new AppEmbed("#embed", { - // Enable V3 navigation and home page experience discoveryExperience: { - primaryNavbarVersion: PrimaryNavbarVersion.Sliding, // Enables V3 navigation - homePage: HomePage.ModularWithStylingChanges, // Enables V2 modular home page + primaryNavbarVersion: PrimaryNavbarVersion.Sliding, // Enable V3 navigation experience + homePage: HomePage.Focused, // Enable V4 focused home page experience }, - // Show navigation panels showPrimaryNavbar: true, //... other embed view configuration attributes }); ---- -//// ==== Post migration checks After you enable the V3 experience: diff --git a/modules/ROOT/pages/full-embed.adoc b/modules/ROOT/pages/full-embed.adoc index 1a6aadcc8..def98a4c7 100644 --- a/modules/ROOT/pages/full-embed.adoc +++ b/modules/ROOT/pages/full-embed.adoc @@ -32,6 +32,8 @@ Import the AppEmbed SDK library to your application environment: import { AppEmbed, Page, + HomePage, + PrimaryNavbarVersion, AuthType, init, prefetch, @@ -115,7 +117,7 @@ The `AppEmbed` component allows you to embed a specific application page or the == Customize your embed view (Optional) The `xref:AppViewConfig.adoc[AppViewConfig]` object in the `AppEmbed` component various attributes and properties to xref:css-customization.adoc[the look and feel of the embedded app], xref:embed-actions.adoc[control the visibility of menu actions] and features, and xref:embed-events.adoc[manage interactions between the host and embedded app]. -By default, ThoughtSpot application loads in the classic (V1) experience mode. If the V3 navigation and modular home page feature is enabled on your instance, you can choose to enable this experience for your embedding application users and customize the UI experience as per your needs. +By default, ThoughtSpot application loads in the classic (V1) experience mode. If the V3 navigation and home page features are enabled on your instance, you can choose to enable these experiences for your embedded application users and customize the UI as needed. The SDK also supports the V4 focused home page experience (`HomePage.Focused`), which requires Spotter to be enabled on your instance. For more information, see the following pages: From 2a7d7f86aec56d7380961d683d2bac3ed3e749e5 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Thu, 2 Jul 2026 17:06:09 +0530 Subject: [PATCH 108/136] webhooks and focused home page edits --- .../pages/customize-homepage-full-embed.adoc | 103 ++++++++++++------ modules/ROOT/pages/full-app-customize.adoc | 97 +++++++++-------- modules/ROOT/pages/full-embed.adoc | 4 +- .../ROOT/pages/rest-api-sdk-libraries.adoc | 1 - modules/ROOT/pages/webhooks-ux.adoc | 25 +++-- modules/ROOT/pages/whats-new.adoc | 2 +- 6 files changed, 140 insertions(+), 92 deletions(-) diff --git a/modules/ROOT/pages/customize-homepage-full-embed.adoc b/modules/ROOT/pages/customize-homepage-full-embed.adoc index 5eded5462..5fec19b72 100644 --- a/modules/ROOT/pages/customize-homepage-full-embed.adoc +++ b/modules/ROOT/pages/customize-homepage-full-embed.adoc @@ -13,36 +13,48 @@ Developers can customize the home page experience in full application embedding The classic (V1) experience and V2 experience modes will be deprecated in an upcoming release in 2026. Therefore, ThoughtSpot recommends upgrading the UI experience of your full application embedding to the V3 experience. ==== - - [NOTE] ==== -The focused homepage experience is in beta and disabled by default. To enable this experience in your embedding application, the feature must be enabled on your ThoughtSpot instance and in the Visual Embed SDK. +The focused homepage experience is an Early Access feature and is disabled by default. To enable this experience in your embedding application, ensure that the feature is enabled on your ThoughtSpot instance and in the Visual Embed SDK. ==== - == Home page layout In the classic (V1) experience, the home page has a static layout and does not support SDK modular customization settings. -In the V3 experience, the SDK provides the xref:HomePage.adoc[homePage] attribute to set the desired home page layout: +The SDK provides the xref:HomePage.adoc[homePage] attribute to set the desired home page layout: -* `homePage: HomePage.Focused` + -Enables the V4 focused home page experience. -*Prerequisite*: Spotter must be enabled on your ThoughtSpot instance. +* `homePage: HomePage.Focused` [earlyAccess eaBackground]#Early Access# + +Enables the V4 home page experience. * `homePage: HomePage.ModularWithStylingChanges` + Enables the V3 modular home page experience with customizable components, styling options, and enhanced layout. * `homePage: HomePage.Modular` + Enables the basic modular home page experience with customizable components. +Both V2 and V3 home page experience show customization modules. The V3 home page experience improves the layout with the following enhancements: + +* The charts in the **Watchlist** module are arranged horizontally. Each chart includes menu actions to remove the KPI charts from the watchlist and create alerts, and allows drag-and-drop reordering. ++ +[.bordered] +[.widthAuto] +image::./images/watchlistv3andv2.png[V2 and V3 Watchlist module] +* The **Trending** module displays separate lists for Liveboards and Answers objects. Both these lists show the objects trending for the last 15 days, or based on the overall views, or both. ++ +[.bordered] +[.widthAuto] +image::./images/trendingv2andv3.png[V2 and V3 Trending module] +* The **Favorites** module can be accessed from the left navigation panel. ++ +[.bordered] +[.widthAuto] +image::./images/favoritesV3.png[V2 and V3 Trending module, scaledwidth=50%] +* Style and CSS improvements to the **Learning** module. + +In both V2 and V3, the SDK allows customization to include or exclude modules, change their order, and adjust the overall layout. + [#_enable_focused_home_page] === V4 focused home page experience -The V4 focused home page (`HomePage.Focused`) consolidates the Watchlist and Recents sections into a unified, focused layout. Unlike the V3 modular home page, the V4 layout is designed to highlight the most relevant content immediately. - -[IMPORTANT] -==== -The V4 focused home page experience requires Spotter to be enabled on your ThoughtSpot instance. -==== +The V4 focused home page (`HomePage.Focused`) provides a contemporary experience designed to highlight the most relevant content immediately. It provides quick access to the Spotter interface and consolidates the **Watchlist KPIs** and **Recents* sections into a unified, focused layout. The following example shows how to enable the V4 focused home page experience: @@ -66,30 +78,51 @@ const embed = new AppEmbed("#embed", { }); ---- -After migrating from V2 to V3 experience, the home page experience shows the following changes: +== Customization settings for home page +The following customization settings are available for the modular home page in the V2 and V3 experience modes. -* The charts in the **Watchlist** module are arranged horizontally. Each chart includes menu actions to remove the KPI charts from the watchlist and create alerts, and allows drag-and-drop reordering. -+ -[.bordered] -[.widthAuto] -image::./images/watchlistv3andv2.png[V2 and V3 Watchlist module] -* The **Trending** module displays separate lists for Liveboards and Answers objects. Both these lists show the objects trending for the last 15 days, or based on the overall views, or both. -+ -[.bordered] -[.widthAuto] -image::./images/trendingv2andv3.png[V2 and V3 Trending module] -* The **Favorites** module can be accessed from the left navigation panel. -+ -[.bordered] -[.widthAuto] -image::./images/favoritesV3.png[V2 and V3 Trending module, scaledwidth=50%] -* Style and CSS improvements to the **Learning** module. +[width="100%", cols="2,2,2,2"] +[options='header'] +|==== +|SDK property|Classic (V1) experience|V2 experience|V3 experience +| `hiddenHomepageModules` + +Controls the visibility of the modules on the home page. +| [tag redBackground tick]#x# Not supported +| [tag greenBackground tick]#✓# Supported +| [tag greenBackground tick]#✓# Supported -In both V2 and V3, the SDK allows customization to include or exclude modules, change their order, and adjust the overall layout. +| `reorderedHomepageModules` + +Arranges home page modules in the specified order. +| [tag redBackground tick]#x# Not supported +| [tag greenBackground tick]#✓# Supported +| [tag greenBackground tick]#✓# Supported -== Customization settings for home page -The following customization settings are available for the modular home page in the V2 and V3 experience modes. +| `homePageSearchBarMode` + +Sets the home page search bar experience to object search, Spotter/AI search, or none. +| [tag greenBackground tick]#✓# Supported +| [tag greenBackground tick]#✓# Supported +| [tag greenBackground tick]#✓# Supported +| `isUnifiedSearchExperienceEnabled` + +Enables a combined interface with both Object Search and Natural Language Search. The unified experience is disabled by default. +| [tag greenBackground tick]#✓# Supported +| [tag greenBackground tick]#✓# Supported +| [tag greenBackground tick]#✓# Supported + +| `hideHomepageLeftNav` + +Hides the xref:customize-nav-full-embed.adoc#_customize_the_left_navigation_panel_on_home_page[left navigation panel] on the home page. +| [tag redBackground tick]#x# Not supported +| [tag greenBackground tick]#✓# Supported +| [tag greenBackground tick]#✓# Supported + +| `hiddenHomeLeftNavItems` + +Hides xref:customize-nav-full-embed.adoc#_customize_the_left_navigation_panel_on_home_page[specific menu items of the left navigation panel] on the home page. +| [tag redBackground tick]#x# Not supported +| [tag greenBackground tick]#✓# Supported +| [tag greenBackground tick]#✓# Supported +|==== + +//// [width="100%", cols="2,2,2,2,2"] [options='header'] |==== @@ -107,7 +140,6 @@ Arranges home page modules in the specified order. | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported - | `homePageSearchBarMode` + Sets the home page search bar experience to object search, Spotter/AI search, or none. | [tag greenBackground tick]#✓# Supported @@ -135,6 +167,7 @@ Hides xref:customize-nav-full-embed.adoc#_customize_the_left_navigation_panel_on | [tag greenBackground tick]#✓# Supported | // TODO: verify with engineering — confirm which nav items are available in V4 |==== +//// == Control the visibility of home page modules diff --git a/modules/ROOT/pages/full-app-customize.adoc b/modules/ROOT/pages/full-app-customize.adoc index d1300092f..9e9ce35c2 100644 --- a/modules/ROOT/pages/full-app-customize.adoc +++ b/modules/ROOT/pages/full-app-customize.adoc @@ -44,7 +44,7 @@ A dynamic left navigation menu that adjusts its contents according to the applic [NOTE] ==== -The SDK also supports a V4 focused home page experience. For more information, see xref:full-app-customize.adoc#_enable_the_v4_focused_home_page_experience[Enable the V4 focused home page experience]. +The SDK also supports a V4 focused home page experience [earlyAccess eaBackground]#Early Access#. For more information, see xref:full-app-customize.adoc#_enable_the_v4_focused_home_page_experience[Enable the V4 focused home page experience]. ==== |**Feature availability**| Enabled by default| Disabled by default | Disabled by default @@ -66,7 +66,6 @@ image::./images/v2-experience.png[V2 UI experience] [.widthAuto] image::./images/v1-experience.png[Classic experience] - == Customize the embedded application UI for your users Before updating the UI experience, review the xref:full-app-customize.adoc#_ui_experience_modes[key features, limitations], and available SDK controls for customizing xref:customize-nav-full-embed.adoc[navigation] and the xref:customize-homepage-full-embed.adoc[home page]. @@ -88,15 +87,13 @@ Before you begin: To enable the V3 experience, you must use the `discoveryExperience` object in the SDK. This object supports the following properties: * `primaryNavbarVersion` + -Enables the V3 experience. The valid value for the V3 experience is `PrimaryNavbarVersion.Sliding`. + -If this attribute is not set, no changes will be applied, and the currently enabled UI experience in your app will be retained. - +Enables the V3 experience. The valid value is `PrimaryNavbarVersion.Sliding`. + * `homePage` + Enables the modular or focused home page experience. Valid values include: ** `HomePage.ModularWithStylingChanges` (__Recommended for V3__) + Enables the V3 modular home page experience. You must include `primaryNavbarVersion` to update the UI experience to the V3 home page. -** `HomePage.Focused` [.version-badge.new]#New#+ -Enables the V4 focused home page experience, which consolidates the Watchlist and Recents sections into a single, focused view. Ensure that Spotter is enabled on your ThoughtSpot instance. + +** `HomePage.Focused` [earlyAccess eaBackground]#Early Access# +Enables the V4 focused home page experience, which consolidates the **Watchlist** and **Recents** sections into a single, focused view. + ** `HomePage.Modular` + Enables the modular home page experience with customizable components. This experience does not include the styling options and visual changes available with the full V3 experience. We do not recommend using this option, as it will be deprecated in an upcoming release. @@ -165,11 +162,11 @@ const embed = new AppEmbed("#embed", { [#_enable_the_v4_focused_home_page_experience] === Enable the V4 focused home page experience -The V4 focused home page experience is available with SDK `1.50.0` and ThoughtSpot Cloud `26.7.0.cl`. This experience consolidates the Watchlist and Recents sections into a unified, focused view designed to surface the most relevant content for users. +The V4 focused home page experience is available with Visual Embed SDK v1.50.0 and ThoughtSpot Cloud 26.7.0.cl. This experience consolidates the **Watchlist** and **Recents** sections into a unified, focused view designed to surface the most relevant content for users. [IMPORTANT] ==== -Spotter must be enabled on your ThoughtSpot instance before enabling the V4 focused home page experience. Contact your ThoughtSpot administrator to verify that Spotter is enabled. +The focused home page experience is an Early Access feature and is disabled by default. To enable this feature, contact your ThoughtSpot administrator. ==== To enable the V4 focused home page, set `homePage` to `HomePage.Focused` in the `discoveryExperience` object: @@ -209,24 +206,7 @@ image::./images/new-nav3.png[New home page] * Verify that all the customization settings are applied correctly. * If you have set up custom routes for navigation within your embedded app, verify navigation workflows and check for breaking changes. - //// -* A sliding left navigation panel with the following components: -** The app selector icons for *Insights*, *Data workspace*, and *Develop* appear in the left navigation panel header. -** The *Liveboards*, *Answers*, *Search Data*, and *Spotter* menu options in the *Insights* section. The *Insights* panel also includes a list of users' favorites. -** The *Home* menu option in the *Insights* section. - -* A top navigation header with the following components: -** A hamburger icon to slide in or close the navigation overlay -** Object search bar -** The alert icon that shows notifications -** Help and user profile icons. The user profile menu includes the *Admin settings* menu. This option is visible only to users with administration privileges. -** Org switcher to switch between Org contexts - -* Home page experience -** Modular home page with specific sections for Search, Watchlist, Favorites, and so on. -//// - === Upgrade from classic (V1) experience to V2 experience Setting `modularHomeExperience` to `true` in the SDK enables the V2 experience. @@ -243,7 +223,7 @@ const embed = new AppEmbed("#embed", { ==== The V2 experience will be deprecated in an upcoming release. ThoughtSpot strongly recommends upgrading to the V3 experience to ensure continued support and access to the latest features. ==== -//// + The following figure shows the user interface with the V2 experience enabled: [.bordered] @@ -260,12 +240,8 @@ The following table summarizes the resulting UI experience for different configu [width="100%", cols="6,7,6"] [options='header'] |=== -|If `modularHomeExperience` is | And `discoveryExperience` is| UI experience will be - -|`true` / `false` + -Not set / Incorrect a| - - +|`discoveryExperience` setting| `modularHomeExperience` state | Resulting UI experience +a| [source,JavaScript] ---- discoveryExperience: { @@ -275,11 +251,25 @@ discoveryExperience: { homePage: HomePage.ModularWithStylingChanges } ---- +|`true` / `false` + +Not set / Incorrect | V3 navigation and V3 modular home page -|`true` / `false` + -Not set / Incorrect a| +a| +[source,JavaScript] +---- +discoveryExperience: { + // V3 experience and navigation + primaryNavbarVersion: PrimaryNavbarVersion.Sliding, + // V4 home page experience + homePage: HomePage.Focused + } +---- +|`true` / `false` + +Not set / Incorrect +| V3 navigation and V4 home page experience +a| [source,JavaScript] ---- discoveryExperience: { @@ -289,11 +279,12 @@ discoveryExperience: { homePage: HomePage.Modular }, ---- +|`true` / `false` + +Not set / Incorrect | V3 navigation and a modular home page that is similar to the V2 experience -|`true` / `false` + -/ Not set / incorrect a| +a| [source,JavaScript] ---- discoveryExperience: { @@ -301,10 +292,11 @@ discoveryExperience: { primaryNavbarVersion: PrimaryNavbarVersion.Sliding }, ---- +|`true` / `false` + +/ Not set / incorrect |V3 navigation and a modular home page that is similar to the V2 experience -|`true` / `false` + -/ Not set / incorrect a| +a| [source,JavaScript] ---- @@ -313,10 +305,11 @@ discoveryExperience: { homePage: HomePage.Modular }, ---- +|`true` / `false` + +/ Not set / incorrect | V2 navigation and V2 modular home page - -a|`true` a| +a| [source,JavaScript] ---- @@ -325,9 +318,10 @@ discoveryExperience: { homePage: HomePage.ModularWithStylingChanges }, ---- +a|`true` | V2 navigation and V2 modular home page -a| `false` / Not set / incorrect a| +a| [source,JavaScript] ---- @@ -336,15 +330,30 @@ discoveryExperience: { homePage: HomePage.ModularWithStylingChanges }, ---- +a| `false` / Not set / incorrect |Classic (V1) experience. +a| Not set +a|`true` | V2 navigation and V2 modular home page -a|`true` a| Not set | V2 navigation and V2 modular home page +a| Not set a|`false` / Not set / incorrect | Classic (V1) experience -a|`false` / Not set / incorrect a| Not set | Classic (V1) experience +a| +[source,JavaScript] +---- +discoveryExperience: { + // V3 navigation + primaryNavbarVersion: PrimaryNavbarVersion.Sliding + // V4 modular home page + homePage: HomePage.Focused + }, +---- +a|`false` +| V3 navigation and V4 home page experience |=== -- + == Customize navigation experience For information about the navigation elements in each UI experience mode and the related customization settings in the SDK, see xref:customize-nav-full-embed.adoc[Customize navigation experience]. diff --git a/modules/ROOT/pages/full-embed.adoc b/modules/ROOT/pages/full-embed.adoc index def98a4c7..85eb5b6eb 100644 --- a/modules/ROOT/pages/full-embed.adoc +++ b/modules/ROOT/pages/full-embed.adoc @@ -275,8 +275,8 @@ appEmbed.on(EmbedEvent.load, hideLoader) For more information about events, see the following pages: -* xref:HostEvent.adoc[HostEvent] -* xref:EmbedEvent.adoc[EmbedEvent] +* xref:event-embedEvents.adoc[Embed events] +* xref:events-hostEvents.adoc[Host events] * xref:embed-events.adoc[Events and app integration] == Code sample diff --git a/modules/ROOT/pages/rest-api-sdk-libraries.adoc b/modules/ROOT/pages/rest-api-sdk-libraries.adoc index 306ab3862..0db64352d 100644 --- a/modules/ROOT/pages/rest-api-sdk-libraries.adoc +++ b/modules/ROOT/pages/rest-api-sdk-libraries.adoc @@ -10,7 +10,6 @@ ThoughtSpot provides native SDK libraries to help client applications call REST Currently, the REST API client libraries are available for xref:rest-api-sdk-typescript.adoc[TypeScript] and xref:rest-api-java-sdk.adoc[Java]. These SDKs provide language-specific client libraries to call APIs from client applications. - == Community SDKs You can use the following open-source, community-supported SDKs. diff --git a/modules/ROOT/pages/webhooks-ux.adoc b/modules/ROOT/pages/webhooks-ux.adoc index 8f54ba54d..de44edbbb 100644 --- a/modules/ROOT/pages/webhooks-ux.adoc +++ b/modules/ROOT/pages/webhooks-ux.adoc @@ -14,6 +14,7 @@ The **Webhooks** option in the **Develop** page allows you to access the new **W [IMPORTANT] ==== * The new Webhooks UI experience is in Beta and is disabled by default. To enable this feature, contact ThoughtSpot Support. +* When the new Webhooks page is enabled, the existing Webhooks page will be displayed as the **Legacy Webhooks** menu action in the **Develop** page. * The **Webhooks** page supports webhooks for the Liveboard Schedule events only. ==== @@ -61,12 +62,19 @@ The webhook creation workflow allows configuring webhook properties, including a You can create a webhook for the Liveboard schedule event type to send a lightweight JSON payload and also send these as reports to a Cloud Storage destination in the file format supported by the Liveboard scheduled jobs. +For more information, see the following documentation: + +* xref:webhooks-lb-schedule.adoc#_through_the_webhooks_page_in_ui[Webhook configuration for Liveboard scheduled events]. +* xref:webhooks-s3-storage.adoc[AWS S3 storage configuration for webhooks] +* xref:webhooks-gcs-storage.adoc[GCS storage configuration for webhooks] + +//// To create a webhook: . Go to **Develop** > **Customizations** and click **Webhooks**. . In the *Webhooks* page, click *Create webhook*. . In the *Create webhook* modal, configure name, webhook endpoint, event type, authentication options and other parameters as needed. -. To deliver webhook reports to a Cloud storage destination, select **File storage** and define storage configuration parameters. For more information, see xref:webhooks-s3-storage.adoc[AWS S3 storage integration] and xref:webhooks-gcs-storage.adoc[GCS storage integration]. +. To deliver webhook reports to a Cloud storage destination, select **File storage** and define storage configuration parameters. . Specify the authentication type to authorize webhook delivery. + ThoughtSpot sends the configured credentials in every outbound request. The following options are available: * *No Authentication*: No authentication headers are added to the request. Not recommended for production use. @@ -79,11 +87,10 @@ ThoughtSpot sends the configured credentials in every outbound request. The foll * *Custom headers*: Use this feature to pass arbitrary metadata required by your endpoint in addition to standard and authentication headers. Define key-value pairs of custom headers to add to every outbound HTTP request. * *URL parameters*: Specify the query parameters to append to the webhook URL on every request. . Click **Save**. +//// -=== Activating a webhook connection -To activate the webhook, use one of the following options: -* Select the webhook and click *Enable*. -* In the webhook row, from the More options menu (`...`), click **Enable**. +=== Update webhook connection status +The webook connections are automatically enabled when they are created in the UI or via API. To update the webhook status, use the **Disable** and **Enable** options either in More options menu (`...`) or the buttons that appear above the list when a webhook row is selected. === Editing a webhook connection To edit webhook properties: @@ -108,7 +115,7 @@ To clear an authentication, signature verification, or storage destination confi Deleting a webhook is permanent. Delivery logs associated with the webhook are removed when they reach the 3-day retention limit. === Monitoring webhook status -The **Webhooks** page provides a dashboard view with cards indicating the delivery statistics. These cards are refreshed every 60 seconds. +The **Webhooks** page provides a dashboard view with cards indicating the delivery statistics. The cards refresh on reload. * *Delivery rate*: Percentage of webhook delivery attempts that succeeded. * *Failed*: Total count of delivery attempts that failed or resulted in an error. @@ -144,13 +151,13 @@ The **Legacy webhooks** option in the **Develop** > **Customizations** page prov === Accessing legacy webhooks To access the legacy webhook configuration: -. Go to **Develop** > **Customizations** and click **Legacy webhooks**. +. Navigate to the legacy webhooks page in the **Develop** section of the ThoughtSpot UI. . The page displays the list of webhooks registered for KPI monitor alerts. -=== Creating a legacy webhook for KPI alerts +=== Creating a webhook for KPI alerts To create a webhook for KPI monitor alerts: -. On the **Legacy webhooks** page, click **Create webhook**. +. On the webhooks page, click **Create webhook**. . Enter a display name and the fully qualified URL of the webhook endpoint. . Configure the authentication method required by your destination endpoint. . Click **Save**. diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 7510166a3..e47c833d3 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -57,7 +57,7 @@ You can now save your Spotter conversation and manage chat history using Spotter [discrete] ==== Full application embedding -In full application embedding with the V3 navigation and home page experience enabled, ThoughtSpot provides an additional option to switch to the new focused home page experience. The focused home page experience provides a streamlined, contemporary experience along with the Spotter panel. For more information, see xref:customize-homepage-full-embed.adoc[Customize home page experience]. +In full application embedding with the V3 navigation and home page experience, ThoughtSpot provides an additional option to switch to the V4 focused home page experience. The focused home page experience provides a streamlined, contemporary experience along with the Spotter panel. For more information, see xref:full-app-customize.adoc[Customize full application embedding]. --- From 347837fff3720cbca964b56d8ba2afade04292d6 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Fri, 3 Jul 2026 07:35:07 +0530 Subject: [PATCH 109/136] edits --- modules/ROOT/pages/webhooks-ux.adoc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/ROOT/pages/webhooks-ux.adoc b/modules/ROOT/pages/webhooks-ux.adoc index de44edbbb..fb6b2aa59 100644 --- a/modules/ROOT/pages/webhooks-ux.adoc +++ b/modules/ROOT/pages/webhooks-ux.adoc @@ -33,7 +33,6 @@ Note that ThoughtSpot allows only one webhook for the Liveboard Schedule event t The actions available for the list items include: * *Sort*: Click any column header to sort the webhook list by that column. -* *Filter controls*: Use the column filter controls to narrow the list by name, state, creator, or other attributes. * *Bulk selection*: Select multiple webhooks using the checkboxes to perform bulk actions. * *Row-level actions*: Hover over a webhook row and click the actions menu (*...*) to edit, delete, test, enable, or disable the webhook connection. @@ -115,7 +114,7 @@ To clear an authentication, signature verification, or storage destination confi Deleting a webhook is permanent. Delivery logs associated with the webhook are removed when they reach the 3-day retention limit. === Monitoring webhook status -The **Webhooks** page provides a dashboard view with cards indicating the delivery statistics. The cards refresh on reload. +The **Webhooks** page provides a dashboard view with cards indicating the delivery statistics. The cards refresh when the page is reloaded. * *Delivery rate*: Percentage of webhook delivery attempts that succeeded. * *Failed*: Total count of delivery attempts that failed or resulted in an error. From 6eecf788dd26298684c440e1997e4ed0046fc273 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Fri, 3 Jul 2026 08:25:50 +0530 Subject: [PATCH 110/136] webhooks enable status fix --- modules/ROOT/pages/webhooks-gcs-storage.adoc | 6 +----- modules/ROOT/pages/webhooks-lb-schedule.adoc | 7 +------ modules/ROOT/pages/webhooks-s3-storage.adoc | 5 +---- 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/modules/ROOT/pages/webhooks-gcs-storage.adoc b/modules/ROOT/pages/webhooks-gcs-storage.adoc index b9138fc51..8a7b1429d 100644 --- a/modules/ROOT/pages/webhooks-gcs-storage.adoc +++ b/modules/ROOT/pages/webhooks-gcs-storage.adoc @@ -200,11 +200,7 @@ image::./images/webhook-create-gcp.png[Webhooks for GCS storage] //. Select xref:webhooks-ux.adoc#_creating_a_webhook[the authentication method] to authorize payloads to the destination endpoint. + . To configure xref:webhooks-ux.adoc#_creating_a_webhook_connection[advanced settings] such as signature verification, custom headers, and URL query parameters, click **Advanced settings** and configure the fields as required. . Click *Save*. + -If the webhook creation is successful, it will be added to the list in the Webhooks page. - -. To activate the webhook, use one of the following options: -* Select the webhook and click *Enable*. -* In the webhook row, from the More options menu (`...`), click **Enable**. +If the webhook is created successfully, it is added to the Webhooks list and enabled by default. == Webhook payload format in GCS ThoughtSpot writes each webhook event as a separate object in your GCS bucket. Objects are named using the following pattern: diff --git a/modules/ROOT/pages/webhooks-lb-schedule.adoc b/modules/ROOT/pages/webhooks-lb-schedule.adoc index 3f2f5d008..ee159cc1d 100644 --- a/modules/ROOT/pages/webhooks-lb-schedule.adoc +++ b/modules/ROOT/pages/webhooks-lb-schedule.adoc @@ -191,12 +191,7 @@ Use this feature to pass arbitrary metadata required by your endpoint in additio * *URL parameters*: Specify the query parameters to append to the webhook URL on every request. . Click *Save*. + -If the webhook creation is successful, it will be added to the list in the Webhooks page. - -==== Activating a webhook -To activate the webhook, use one of the following options: -* Select the webhook and click *Enable*. -* In the webhook row, from the More options menu (`...`), click **Enable**. +If the webhook is created successfully, it is added to the Webhooks list and enabled by default. === Test webhook connection and verify delivery To validate the webhook channel configuration, use one of the following options: diff --git a/modules/ROOT/pages/webhooks-s3-storage.adoc b/modules/ROOT/pages/webhooks-s3-storage.adoc index bbe74f421..aeda7ce9e 100644 --- a/modules/ROOT/pages/webhooks-s3-storage.adoc +++ b/modules/ROOT/pages/webhooks-s3-storage.adoc @@ -336,10 +336,7 @@ image::./images/create-webhook-s3.png[Webhooks creation] //. Select xref:webhooks-ux.adoc#_creating_a_webhook[the authentication method] to authorize payloads to the destination endpoint. + . To configure xref:webhooks-ux.adoc#_creating_a_webhook[advanced settings] such as signature verification, custom headers, and URL query parameters, click **Advanced settings** and configure the fields as required. . Click *Save*. + -If the webhook creation is successful, it will be added to the list in the Webhooks page. -. To activate the webhook, use one of the following options: -* Select the webhook and click *Enable*. -* In the webhook row, from the More options menu (`...`), click **Enable**. +If the webhook is created successfully, it is added to the Webhooks list and enabled by default. == Viewing webhook configuration details To view the webhook details, use one of the following options: From 6eaaede7817ff7db6afdfe521fc88c59ba098e4a Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Fri, 3 Jul 2026 08:43:34 +0530 Subject: [PATCH 111/136] send test event instructions --- modules/ROOT/pages/webhooks-ux.adoc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/ROOT/pages/webhooks-ux.adoc b/modules/ROOT/pages/webhooks-ux.adoc index fb6b2aa59..e42988219 100644 --- a/modules/ROOT/pages/webhooks-ux.adoc +++ b/modules/ROOT/pages/webhooks-ux.adoc @@ -91,6 +91,14 @@ ThoughtSpot sends the configured credentials in every outbound request. The foll === Update webhook connection status The webook connections are automatically enabled when they are created in the UI or via API. To update the webhook status, use the **Disable** and **Enable** options either in More options menu (`...`) or the buttons that appear above the list when a webhook row is selected. +=== Testing a webhook connection +To verify a webhook connection: + +. Use one of the following options to open the edit panel: +* Select the webhook and click *Send test event*. +* In the webhook row, from the More options menu (`...`), click **Send test event**. +. To view the delivery status, click thw webhook and verify the webhook event log. + === Editing a webhook connection To edit webhook properties: From 4cc21898878091c1393628c6d8f67ad73b85007d Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Fri, 3 Jul 2026 09:46:39 +0530 Subject: [PATCH 112/136] status param update --- modules/ROOT/pages/webhooks-api.adoc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/webhooks-api.adoc b/modules/ROOT/pages/webhooks-api.adoc index aca898005..a49c83a07 100644 --- a/modules/ROOT/pages/webhooks-api.adoc +++ b/modules/ROOT/pages/webhooks-api.adoc @@ -44,7 +44,12 @@ send webhook notifications. | `url_params` a|A JSON map of key-value pairs to append as query parameters in the webhook URL. | `events` a|__Array of strings__. List of events to subscribe to. Specify `LIVEBOARD_SCHEDULE`. | `status` + -__Optional__ a|__String__. Status of the webhook. Specify `ENABLED` to activate the webhook immediately after creation, or `DISABLED` to create it in a deactivated state. When omitted, the status is not stored and will be absent from search results. Available from 26.7.0.cl. +__Optional__ a|__String__. Status of the webhook. Specify `ENABLED` to activate the webhook immediately after creation, or `DISABLED` to create it in a deactivated state. +[NOTE] +==== +When the status parameter is not specified in the API request, the API response returns "status": null, indicating that the status was not explicitly set. Despite the null value, the webhook is enabled by default. To create a webhook in a disabled state, set the status parameter to `DISABLED` in the API request. +==== + | `authentication` a|Defines the authentication method and credentials ThoughtSpot uses when sending HTTP requests to the webhook endpoint. From e794f4c095ee2ae23adb8c2e0ed2ee13d49d6b5c Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 29 Jun 2026 13:45:56 +0530 Subject: [PATCH 113/136] changes for allgrps --- modules/ROOT/pages/roles.adoc | 101 ++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 7ae0fc708..cc3b178f5 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -262,3 +262,104 @@ For example, if a group has `DATADOWNLOADING` access, the `DATADOWNLOADING` Role * *Can manage data models* (`CAN_MANAGE_WORKSHEET_VIEWS_TABLES`) For granular access, you can create a Role with required privileges and assign it to groups. + +== Restore correct privileges on the ALL group when roles are enabled +Every ThoughtSpot instance includes a built-in *ALL* group. All users are automatically members of this group. +When RBAC is enabled, the ALL group is assigned an *ALL role* that grants three base privileges: + +* `AUTHORING` — Allows users to create and edit ThoughtSpot content. +* `DATADOWNLOADING` — Allows users to download data from ThoughtSpot Answers and Liveboards. +* `USERDATAUPLOADING` — Allows users to upload data from a local file. + +Due to a limitation in the update group flow, additional privileges may be inadvertently assigned to the ALL group. +When this occurs, every user on that ThoughtSpot instance inherits those unexpected elevated privileges. + +[NOTE] +==== +The ALL role is a system role. It is not visible in the ThoughtSpot UI. You must use the REST APIs to retrieve its GUID and reassign it. +==== + +=== Before you begin +* Administrator access to your ThoughtSpot instance. + +=== Steps to unblock the users + +. Retrieve the GUID of the ALL group ++ +Call the `POST /api/rest/2.0/groups/search` endpoint and filter by the group name `All`. ++ +[source,cURL] +---- +curl -X POST \ + --url 'https://{ThoughtSpot-Host}/api/api/rest/2.0/groups/search' \ + -H 'Authorization: Bearer {access-token}'\ + -H 'Accept: application/json'\ + -H 'Content-Type: application/json' \ + --data-raw '{ + "group_identifier": "All", // <1> + "record_offset": 0, + "record_size": 10 +} +---- + +From the response, locate the `id` field. This is the GUID of the ALL group. + +[source,JSON] +---- +[ + { + "id": "", // + "name": "All", + "display_name": "All Group", + "system_group": true, + ... + } +] +---- +. Retrieve the GUID of the ALL role +The ALL role is a system role and does not appear in the ThoughtSpot UI. +Call the `POST /api/rest/2.0/roles/search` endpoint and filter by the `group_identifiers` +parameter, passing in the ALL group GUID retrieved in Step 1. ++ +[source,cURL] +---- +curl -X POST \ +--url 'https://{ThoughtSpot-Host}/api/rest/2.0/roles/search' \ +-H 'Authorization: Bearer {access-token}'\ +-H 'Accept: application/json'\ +-H 'Content-Type: application/json' \ +--data-raw '{ + "group_identifiers": [ + "" // + ], + "record_offset": 0, + "record_size": 10 +} +---- + +. Restore the ALL role on the ALL group +Call the `POST /api/rest/2.0/groups/{group_identifier}/update` endpoint using the ALL group GUID as the path parameter. + +Use `REPLACE` as the operation type. +This replaces the complete list of roles currently assigned to the ALL group +with only the ALL role, removing all unexpected role assignments in a single operation. ++ ++ +[source,cURL] +---- +curl -X POST \ +--url 'https://{ThoughtSpot-Host}/api/rest/2.0/groups//update' \ +-H 'Authorization: Bearer {access-token}'\ +-H 'Accept: application/json'\ +-H 'Content-Type: application/json' \ +--data-raw '{ + "role_identifiers": { + "operation": "REPLACE", // + "role_identifiers": [ + "" // + ] + } +} +---- + +A successful response returns an HTTP `204` status with an empty body. From 9b8da8aa3bf48035b31761cf6df001401cfbc282 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 29 Jun 2026 13:55:42 +0530 Subject: [PATCH 114/136] changes for allgrps --- modules/ROOT/pages/roles.adoc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index cc3b178f5..860caedd0 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -301,9 +301,9 @@ curl -X POST \ "record_size": 10 } ---- - ++ From the response, locate the `id` field. This is the GUID of the ALL group. - ++ [source,JSON] ---- [ @@ -338,13 +338,13 @@ curl -X POST \ ---- . Restore the ALL role on the ALL group ++ Call the `POST /api/rest/2.0/groups/{group_identifier}/update` endpoint using the ALL group GUID as the path parameter. - ++ Use `REPLACE` as the operation type. This replaces the complete list of roles currently assigned to the ALL group with only the ALL role, removing all unexpected role assignments in a single operation. + -+ [source,cURL] ---- curl -X POST \ @@ -361,5 +361,5 @@ curl -X POST \ } } ---- - ++ A successful response returns an HTTP `204` status with an empty body. From 117a9996662fdeb458a8fc0fb1d683a66a91bfeb Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Mon, 29 Jun 2026 18:26:53 +0530 Subject: [PATCH 115/136] edits --- modules/ROOT/pages/roles.adoc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 860caedd0..84a2a4f16 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -265,12 +265,18 @@ For granular access, you can create a Role with required privileges and assign i == Restore correct privileges on the ALL group when roles are enabled Every ThoughtSpot instance includes a built-in *ALL* group. All users are automatically members of this group. -When RBAC is enabled, the ALL group is assigned an *ALL role* that grants three base privileges: +When RBAC is enabled, the ALL group is assigned an *ALL role*. This role always grants the `AUTHORING` privilege, which is required for all users +and must remain assigned to the ALL group at all times. -* `AUTHORING` — Allows users to create and edit ThoughtSpot content. -* `DATADOWNLOADING` — Allows users to download data from ThoughtSpot Answers and Liveboards. +In addition to the ALL role, the ALL group may hold other roles that grant +the following privileges: + +* `DATADOWNLOADING` — Allows users to download data from answers and Liveboards. * `USERDATAUPLOADING` — Allows users to upload data from a local file. +These privileges are permitted on the ALL group and may be assigned through +additional roles depending on your ThoughtSpot instance's configuration. + Due to a limitation in the update group flow, additional privileges may be inadvertently assigned to the ALL group. When this occurs, every user on that ThoughtSpot instance inherits those unexpected elevated privileges. @@ -317,6 +323,7 @@ From the response, locate the `id` field. This is the GUID of the ALL group. ] ---- . Retrieve the GUID of the ALL role ++ The ALL role is a system role and does not appear in the ThoughtSpot UI. Call the `POST /api/rest/2.0/roles/search` endpoint and filter by the `group_identifiers` parameter, passing in the ALL group GUID retrieved in Step 1. From d3a089839f7777a51fbfa9c9caafe81198b13160 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 30 Jun 2026 12:04:26 +0530 Subject: [PATCH 116/136] feedback --- modules/ROOT/pages/roles.adoc | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 84a2a4f16..51cbd6a04 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -277,8 +277,7 @@ the following privileges: These privileges are permitted on the ALL group and may be assigned through additional roles depending on your ThoughtSpot instance's configuration. -Due to a limitation in the update group flow, additional privileges may be inadvertently assigned to the ALL group. -When this occurs, every user on that ThoughtSpot instance inherits those unexpected elevated privileges. +For users who have inherited unexpected elevated privileges, follow the steps listed below to restore privileges. [NOTE] ==== @@ -286,9 +285,12 @@ The ALL role is a system role. It is not visible in the ThoughtSpot UI. You must ==== === Before you begin -* Administrator access to your ThoughtSpot instance. +Before you start, ensure you have: -=== Steps to unblock the users +* Administrator privileges on your ThoughtSpot instance. +* A valid bearer token for authentication. + +=== Procedure to unblock the users . Retrieve the GUID of the ALL group + @@ -297,15 +299,14 @@ Call the `POST /api/rest/2.0/groups/search` endpoint and filter by the group nam [source,cURL] ---- curl -X POST \ - --url 'https://{ThoughtSpot-Host}/api/api/rest/2.0/groups/search' \ + --url 'https://{ThoughtSpot-Host}/api/rest/2.0/groups/search' \ -H 'Authorization: Bearer {access-token}'\ -H 'Accept: application/json'\ -H 'Content-Type: application/json' \ --data-raw '{ - "group_identifier": "All", // <1> "record_offset": 0, "record_size": 10 -} +}' ---- + From the response, locate the `id` field. This is the GUID of the ALL group. @@ -314,7 +315,7 @@ From the response, locate the `id` field. This is the GUID of the ALL group. ---- [ { - "id": "", // + "id": "", "name": "All", "display_name": "All Group", "system_group": true, @@ -337,11 +338,11 @@ curl -X POST \ -H 'Content-Type: application/json' \ --data-raw '{ "group_identifiers": [ - "" // + "" ], "record_offset": 0, "record_size": 10 -} +}' ---- . Restore the ALL role on the ALL group @@ -355,18 +356,18 @@ with only the ALL role, removing all unexpected role assignments in a single ope [source,cURL] ---- curl -X POST \ ---url 'https://{ThoughtSpot-Host}/api/rest/2.0/groups//update' \ +--url 'https://{ThoughtSpot-Host}/api/rest/2.0/groups//update' \ -H 'Authorization: Bearer {access-token}'\ -H 'Accept: application/json'\ -H 'Content-Type: application/json' \ --data-raw '{ "role_identifiers": { - "operation": "REPLACE", // + "operation": "REPLACE", "role_identifiers": [ - "" // + "" ] } -} +}' ---- + A successful response returns an HTTP `204` status with an empty body. From 511a843ad9fbd84dec21167551ff207ddba5e8a0 Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 30 Jun 2026 13:56:52 +0530 Subject: [PATCH 117/136] deleted step 2-vipul's input --- modules/ROOT/pages/roles.adoc | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 51cbd6a04..537b1527a 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -325,25 +325,8 @@ From the response, locate the `id` field. This is the GUID of the ALL group. ---- . Retrieve the GUID of the ALL role + -The ALL role is a system role and does not appear in the ThoughtSpot UI. -Call the `POST /api/rest/2.0/roles/search` endpoint and filter by the `group_identifiers` -parameter, passing in the ALL group GUID retrieved in Step 1. -+ -[source,cURL] ----- -curl -X POST \ ---url 'https://{ThoughtSpot-Host}/api/rest/2.0/roles/search' \ --H 'Authorization: Bearer {access-token}'\ --H 'Accept: application/json'\ --H 'Content-Type: application/json' \ ---data-raw '{ - "group_identifiers": [ - "" - ], - "record_offset": 0, - "record_size": 10 -}' ----- +Contact ThoughtSpot support for retrieving the guid for the ALL role. + . Restore the ALL role on the ALL group + From c11a1917039baa836fb957d6cad18fc762d17c9a Mon Sep 17 00:00:00 2001 From: Rani Gangwar Date: Tue, 30 Jun 2026 14:17:03 +0530 Subject: [PATCH 118/136] corrections --- modules/ROOT/pages/roles.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 537b1527a..6d203bc84 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -281,7 +281,7 @@ For users who have inherited unexpected elevated privileges, follow the steps li [NOTE] ==== -The ALL role is a system role. It is not visible in the ThoughtSpot UI. You must use the REST APIs to retrieve its GUID and reassign it. +The ALL role is a System role. You must contact ThoughtSpot support to retrieve its GUID. ==== === Before you begin From c1edd3c46207707bd7505fdf65fbe175b40f10b5 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 6 Jul 2026 15:56:41 +0530 Subject: [PATCH 119/136] edits --- modules/ROOT/pages/webhooks-api.adoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/ROOT/pages/webhooks-api.adoc b/modules/ROOT/pages/webhooks-api.adoc index a49c83a07..73a033fa5 100644 --- a/modules/ROOT/pages/webhooks-api.adoc +++ b/modules/ROOT/pages/webhooks-api.adoc @@ -300,6 +300,10 @@ The storage information is returned for GCP-hosted ThoughtSpot instances where t "provider": "GCP_GCS", "config": { "config_type": "GCP_TO_GCS_STORAGE", + "aws_account_id":null, + "gcp_service_account_id":null, + "oidc_provider":null, + "trust_policy_template":null, "service_account_email": "webhook-sa@example-project.iam.gserviceaccount.com", "required_role": "roles/iam.serviceAccountTokenCreator", "setup_instructions": [ From 7d5f098ba0e3ce6a81ba18e4b6753b1c7c631185 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 6 Jul 2026 15:57:54 +0530 Subject: [PATCH 120/136] review edits --- modules/ROOT/pages/webhooks-ux.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/webhooks-ux.adoc b/modules/ROOT/pages/webhooks-ux.adoc index e42988219..d2c551c4f 100644 --- a/modules/ROOT/pages/webhooks-ux.adoc +++ b/modules/ROOT/pages/webhooks-ux.adoc @@ -9,7 +9,7 @@ The **Develop** page in ThoughtSpot UI provides the option to configure and manage webhooks. == Webhook configuration and management (New experience) -The **Webhooks** option in the **Develop** page allows you to access the new **Webhooks** experience. This page provides a centralized interface with menu actions to create, edit, delete, enable, or disable a webhook, send test logs, verify delivery status and logs. +The **Webhooks** option in the **Develop** page allows you to access the new **Webhooks** experience. This page provides a centralized interface with menu actions to create, edit, delete, enable, or disable a webhook, send test requests, verify delivery status and logs. [IMPORTANT] ==== From 79c9657c243469047efbcac7b9ae41b0850e373e Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 6 Jul 2026 22:37:55 +0530 Subject: [PATCH 121/136] review edits --- modules/ROOT/pages/api-changelog.adoc | 1842 ++++++++++++++++- modules/ROOT/pages/api-user-management.adoc | 12 +- modules/ROOT/pages/common/nav-embedding.adoc | 57 +- .../pages/customize-homepage-full-embed.adoc | 8 +- .../ROOT/pages/customize-nav-full-embed.adoc | 36 +- modules/ROOT/pages/deprecated-features.adoc | 22 +- modules/ROOT/pages/developer-playground.adoc | 89 +- modules/ROOT/pages/embed-pinboard.adoc | 186 +- modules/ROOT/pages/embed-spotter.adoc | 72 +- modules/ROOT/pages/embed-spotterViz.adoc | 14 +- modules/ROOT/pages/full-app-customize.adoc | 10 +- modules/ROOT/pages/full-embed.adoc | 12 +- modules/ROOT/pages/rest-api-v2-reference.adoc | 18 +- modules/ROOT/pages/rest-apiv2-changelog.adoc | 49 +- modules/ROOT/pages/roles.adoc | 7 +- modules/ROOT/pages/webhooks-api.adoc | 18 +- modules/ROOT/pages/webhooks-comm-channel.adoc | 18 +- modules/ROOT/pages/webhooks-gcs-storage.adoc | 13 +- modules/ROOT/pages/webhooks-lb-schedule.adoc | 4 +- modules/ROOT/pages/webhooks-payload.adoc | 18 +- modules/ROOT/pages/webhooks-s3-storage.adoc | 7 +- modules/ROOT/pages/webhooks-ux.adoc | 19 +- modules/ROOT/pages/webhooks.adoc | 17 +- modules/ROOT/pages/whats-new.adoc | 77 +- 24 files changed, 2173 insertions(+), 452 deletions(-) diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index bfb062b13..fdb18a2de 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -3,14 +3,15 @@ :toclevels: 2 :page-title: Visual Embed SDK changelog -:page-pageid: api-changelog +:page-pageid: embed-sdk-changelog :page-description: Changelog for the Visual Embed SDK This page documents the changes introduced in each release of the Visual Embed SDK. For information about the REST API v2.0 changes, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + == Version 1.50.x, July 2026 -[width="100%" cols="1,4"] +[width="100%", cols="1,4"] |==== |[tag greenBackground]#NEW FEATURE# a| @@ -24,75 +25,1844 @@ A new `SpotterVizConfig` interface is available on `LiveboardViewConfig` and `Ap To customize app interactions, visibility of the UI elements, and style and appearance of the SpotterViz panel, the SDK also introduces CSS variables, action IDs, and embed and host event identifiers. For more information, see xref:embed-spotterViz.adoc[SpotterViz in embedded Liveboards]. |[tag greenBackground]#NEW FEATURE# a| + [discrete] -===== Saved Chat host events -The SDK introduces the following host events for managing saved Spotter conversations from the host application. These events complement the new REST API endpoints for saved conversations. -* `HostEvent.LoadChat` + -Loads a specific saved conversation by ID into the embedded Spotter interface. + -* `HostEvent.DeleteChat` + -Deletes a specific saved conversation by ID. The embed emits `EmbedEvent.SpotterConversationDeleted` after deletion. + -* `HostEvent.RenameChat` + -Renames a specific saved conversation by ID. + +===== Home page customization in full application embedding +For full application embedding, ThoughtSpot provides a focused and streamlined home page experience. To enable this feature, use the `HomePage.Focused` option with the `homePage` attribute in the `discoveryExperience` object. -[NOTE] -==== -Users can only load, delete, or rename their own conversations. These operations require the user to have Spotter access and the *Save chat* feature enabled on the cluster. -==== -For more information, see xref:saved-conversations-api.adoc[APIs for managing saved conversations]. +For more information, see xref:full-app-customize.adoc[Customize full application embedding]. +|==== + +== Version 1.49.x, June 2026 -|[tag redBackground]#BREAKING CHANGE# a| +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| [discrete] -===== Removal of `EmbedEvent.SpotterData` +===== Visual overrides for charts and tables +The SDK introduces the `visualOverrides` object in `SearchViewConfig` and +`AppViewConfig`, enabling embed developers to apply chart and table display +customizations to the new answers from an embedded Search data interface at initialization time. -`EmbedEvent.SpotterData` has been removed from the Visual Embed SDK. Update all references to `EmbedEvent.SpotterData` in your integration code to use `EmbedEvent.PreviewSpotterData`. +The `visualOverrides` object provides the following customization controls to modify the chart and table display: +* `legend`: control legend visibility, position, and color palette of charts. +* `dataLabel` attribute for data labels and per-column label filters. +* `display` attributes for such as regression line overlay and grid line visibility in charts and table themes and content density in tables. +* `axis` property for axis name and label visibility and fixed y-axis range. +* `columns` property for per-column series color and conditional formatting rules. +* `updateMaskPaths` property for partial updates +* `columns` property for column visibility, text wrapping, conditional formatting, and column summary in tables. + +For more information, see xref:viz-overrides.adoc[Visualization overrides]. |[tag greenBackground]#NEW FEATURE# a| + [discrete] ===== Liveboard browser cache refresh +For embedded Liveboards, the SDK provides `enableLiveboardDataCache` to clear browser cache and fetch new data for the visualizations on the Liveboard. -The Liveboard browser cache feature is now in Early Access. Set `enableLiveboardDataCache` to `true` in `LiveboardViewConfig` to enable client-side caching of Liveboard visualization data. - -The following events are available in the SDK for this feature: +The SDK also provides the following events and action ID to programmatically trigger cache refresh and control the visibility of the **Refresh** button. * `EmbedEvent.RefreshLiveboardBrowserCache` + Emitted when the Liveboard browser cache is refreshed. * `HostEvent.RefreshLiveboardBrowserCache` + Trigger a manual cache refresh from the host application. * `Action.RefreshLiveboardBrowserCache` + -Action ID to show or hide the cache refresh button in the Liveboard toolbar. -|==== +Action ID to show or hide the cache refresh button. -== Version 1.49.x, June 2026 +For more information, see xref:embed-pinboard.adoc#liveboard-data-cache[Enable Liveboard refresh]. -[width="100%" cols="1,4"] -|==== |[tag greenBackground]#NEW FEATURE# a| [discrete] ===== Spotter file upload +The SDK introduces the following configuration parameters in `SpotterChatConfig` object to enable and control file uploads in the embedded Spotter chat interface. + +* `spotterFileUploadEnabled` + +When set to `true`, enables the file upload feature in the Spotter chat panel. -The SDK introduces two new configuration parameters in `SpotterChatViewConfig`: +* `spotterFileUploadFileTypes` + +Restricts the file types allowed for upload in the Spotter chat panel. -* `spotterFileUploadEnabled` — When set to `true`, enables the file upload feature in the Spotter chat panel. -* `spotterFileUploadFileTypes` — Restricts file types allowed for upload. Accepts a `SpotterFileUploadFileTypes` object. +For more information, see xref:embed-spotter.adoc#fileUpload[Allowing file uploads in Spotter chats]. +|==== + + +== Version 1.48.x, May 2026 +[width="100%" cols="1,4"] +|==== |[tag greenBackground]#NEW FEATURE# a| [discrete] -===== Chart and table visualization overrides +===== Liveboard embedding +The SDK includes the following new features and enhancements in Liveboard embedding. + +Continuous Liveboard layout in PDF downloads [beta betaBackground]^Beta^:: + +When set to `true`, the `isContinuousLiveboardPDFEnabled` enables the Liveboard tab to render on a single page that matches the exact UI layout you see in ThoughtSpot. This update addresses the issue where visualizations for PDF downloads were split across multiple A4 pages regardless of how they appear on screen. This feature is in beta and can be enabled by setting `isContinuousLiveboardPDFEnabled` to `true`. + +New events and action IDs;; + +* `EmbedEvent.DownloadLiveboardAsContinuousPDF` + +Emits when the download action is triggered. +* `HostEvent.DownloadLiveboardAsContinuousPDF` + +Programmatically triggers the download action to export the PDF with a continuous Liveboard layout. +* `Action.DownloadLiveboardAsContinuousPDF` + +Action ID to control the visibility of download action that exports continuous PDFs. + +Liveboard download actions:: + +The following action IDs are introduced in the SDK for the download buttons at the Liveboard level: + +* `Action.DownloadLiveboard` + +* `Action.DownloadLiveboardAsXlsx` + +* `Action.DownloadLiveboardAsCsv` -The `visualOverrides` property is introduced in `SearchViewConfig` and `AppViewConfig`. Chart and table override options are available at embed initialization time. +Test email for Liveboard scheduled jobs:: -For more information, see xref:viz-overrides.adoc[Configuring visualization overrides]. +The SDK introduces the `isSendNowLiveboardSchedulingEnabled` to enable the **Send now** option for the Liveboard scheduled jobs. This option allows Liveboard users to send a test email notification to either themselves or the intended recipients of the Liveboard scheduled alerts. + +New events and action IDs;; + +* `EmbedEvent.SendTestScheduleEmail` + +Emits when *Send now* button is clicked. +* `HostEvent.SendTestScheduleEmail` + +Programmatically triggers the Send now action to send a test email notification for a Liveboard scheduled job. +* `Action.SendTestScheduleEmail` + +Action ID to disable, show, or hide the **Send now** button on the Liveboard schedule page. |[tag greenBackground]#NEW FEATURE# a| + [discrete] -===== EmbedEvent.SpotterConversationDeleted +===== Spotter embedding + +The SDK introduces the following action IDs to control the visibility of specific UI components in chat panel of the embedded Spotter interface: -Emitted when a saved Spotter conversation is deleted by the user inside the embedded interface. +* `Action.SpotterChatConnectorResources` + +For the connector resources section in the Spotter chat interface. +* `Action.SpotterChatConnectors` + +For the connectors panel section in the Spotter chat interface. +* `Action.SpotterChatModeSwitcher` + +For the mode switcher in the Spotter chat interface. |[tag greenBackground]#NEW FEATURE# a| + [discrete] -===== EmbedEvent.SpotterConversationSelected +===== Event handling +Note the following changes: + +EmbedEvent:: + +* `EmbedEvent.Subscribed` + +The SDK introduces the `EmbedEvent.Subscribed` to emit an event when a HostEvent listener is registered. You can use this event to dispatch host events during the initial load without race conditions. This is particularly useful for Spotter, where host events such as `HostEvent.ResetSpotterConversation` may be triggered immediately after load. +* `EmbedEvent.Error` + +The `EmbedEvent.Error` now fires on HostEvent payload validation failures. +* `EmbedEvent.ChangePersonalizedView` + +Emits when a user selects a different Personalized View or resets to default. + +HostEvent:: +* `HostEvent.GetExportRequestForCurrentPinboard` [.version-badge.breaking]#Breaking# + +The response payload of the `GetExportRequestForCurrentPinboard` passthrough +host event has been updated to include a `type` discriminator field, making it +consistent with the shape of other host event responses. It now returns `{ data: { v2Content }, type }` instead of `{ v2Content }` directly. This enhancement introduces a breaking change for any code that reads `result.v2Content` directly. Update your integration workflows to use `result.data.v2Content`. + +* `HostEvent.SelectPersonalizedView` + +Triggers the selection of a specific Personalized View and resets the default view on a Liveboard. + +⚠️Deprecated events and action IDs️:: +The following events are deprecated and replaced with new event IDs. + +* `EmbedEvent.UpdatePersonalisedView`. Use `EmbedEvent.UpdatePersonalizedView`. +* `EmbedEvent.SavePersonalisedView`. Use `EmbedEvent.SavePersonalizedView`. +* `EmbedEvent.DeletePersonalisedView`. Use `EmbedEvent.DeletePersonalizedView`. +* `HostEvent.ResetLiveboardPersonalisedView`. Use `HostEvent.ResetLiveboardPersonalizedView`. +* `Action.PersonalisedViewsDropdown`. Use `Action.PersonalizedViewsDropdown`. +* `Action.OrganiseFavourites`. Use `Action.OrganizeFavorites`. + + +|==== + + +== Version 1.47.x, April 2026 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| **Spotter chat history sidebar customization** + +The SDK introduces the `SpotterSidebarViewConfig` interface and the `spotterSidebarConfig` object with configuration controls to customize the appearance and contents of the chat history panel. Developers can use the following properties in the `spotterSidebarConfig` object to enable or disable chat history panel and customize the contents of the sidebar when enabled: + +* `enablePastConversationsSidebar` + +Controls the visibility of the past conversations sidebar panel. The chat history panel is disabled by default in embed view. When this property in `spotterSidebarConfig` is specified, it takes precedence over the standalone `enablePastConversationsSidebar` setting, which is deprecated from v1.47.0. + +* `spotterSidebarTitle` + +Allows adding custom title text for the sidebar header. + +* `spotterSidebarDefaultExpanded` + +Sets the default state of the sidebar to expanded or collapsed view. + +* `spotterChatRenameLabel` + +Allows setting a custom label for the **Rename** action in the conversation edit menu. + +* `spotterChatDeleteLabel` + +Allows setting a custom label for the **Delete** action in the conversation edit menu. + +* `spotterDeleteConversationModalTitle` + +Allows editing the title text of the chat delete confirmation modal. + +* `spotterPastConversationAlertMessage` + +Sets a custom message text for the past conversation banner alert. Defaults to the translated alert message. + +* `spotterBestPracticesLabel` + +Allows customizing the label for the best practices button in the sidebar footer. + +* `spotterDocumentationUrl` + +The best practices documentation link shown in the sidebar footer. You can customize the link by specifying the full URL. + +* `spotterConversationsBatchSize` + +Sets the number of conversations to fetch per batch when loading conversation history. Default is `30`. + +* `spotterNewChatButtonTitle` + +Allows customizing the title text for the **New chat** button in the sidebar. + +|[tag redBackground]#DEPRECATED# a| **Standalone `enablePastConversationsSidebar` attribute in Spotter embed** + +The standalone `enablePastConversationsSidebar` property on `SpotterEmbedViewConfig` and `AppViewConfig` is deprecated from SDK 1.47.0 and ThoughtSpot 26.4.0.cl. + +Use `enablePastConversationsSidebar` in the `spotterSidebarConfig` instead. When both are defined, the property in the `spotterSidebarConfig` object takes precedence. + +[source,javascript] +---- +// Deprecated +enablePastConversationsSidebar: false, + +// Recommended +spotterSidebarConfig: { + enablePastConversationsSidebar: true, + //... other config properties +} +---- + +|[tag greenBackground]#NEW FEATURE# a| **Spotter chat UI branding** + +The SDK introduces the `SpotterChatViewConfig` interface for customizing branding in Spotter tool response cards. You can pass these parameters as the `spotterChatConfig` object properties in `SpotterEmbed`, `AppEmbed`, or `LiveboardEmbed` where Spotter interface is used. + +* `hideToolResponseCardBranding` + +When set to `true`, hides the ThoughtSpot logo and icon in tool response cards. The branding label prefix is controlled separately via `toolResponseCardBrandingLabel`. Default value is `false`. + +* `toolResponseCardBrandingLabel` + +Custom label to replace the `ThoughtSpot` prefix in tool response cards. Set to an empty string (`''`) to hide the prefix entirely. + +[NOTE] +==== +These settings do not affect the external MCP tool branding. +==== + +|[tag greenBackground]#NEW FEATURE# a|**Liveboard embed enhancements** + +Personalized Liveboard view:: + +The `personalizedViewId` property allows embedding a saved personalized view of a Liveboard. A personalized view is a saved configuration that includes specific filter selections and changes applied by a user. To embed a personalized view of Liveboard, specify the GUID of the saved personalized view to load along with `liveboardId`. + +Centralized Liveboard filter setting:: + +When set to `true`, the `isCentralizedLiveboardFilterUXEnabled` enables displaying a unified modal to manage and update multiple filters at once, replacing the older individual filter interactions. This feature is disabled by default on ThoughtSpot Embedded instances. + +|[tag greenBackground]#NEW FEATURE# a|**Option to include current period in rolling date filters** + +If the current period inclusion in rolling date filters feature is enabled on your instance, the rolling date filters options such as **Last ** and **Next ** for the Liveboards and Answers in the embed view will allow you to include current period. For example, when you define a date range such as "Last 2 months", the date filter interface displays the **Include this month** checkbox. +To disable this feature, use the `isThisPeriodInDateFiltersEnabled` setting. To hide, show, or disable this option in the embed view, use the action ID, `Action.IncludeCurrentPeriod`. +|==== + + +== Version 1.46.x, March 2026 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| **Host events with page context framework** + +The Visual Embed SDK introduces the HostEvent V2 framework for improved handling and execution of host events in embedded ThoughtSpot experiences with multi-layer UI interactions. The v2 framework supports the page context feature, which tracks the top-most active layer in the user's current context. Developers can use this feature to route events based on the user's current context or set a specific target context for precise and predictable handling of host events. + +* To enable this feature, set `useHostEventsV2` to `true`. +* To retrieve the current context, use `getCurrentContext()`. +* To set a target context for a host event, use xref:ContextType.adoc[ContextType]. + +For more information, refer to the xref:events-context-aware-routing.adoc[Host events documentation]. + +|[tag redBackground]#DEPRECATED# a| **dataPanelV2** + +The `dataPanelV2` parameter is deprecated and can no longer be used to switch between the classic and new data panel experience. By default, the new data panel v2 experience is enabled on all ThoughtSpot embedded instances. + +|[tag greenBackground]#NEW FEATURE# a| **Spotter experience** +The SDK includes the following parameters, action IDs, and events to customize the Spotter embed experience. + +Chat history sidebar customization:: + +//* `SpotterSidebarViewConfig` interface with configuration parameters for customizing the visibility and appearance of the chat history sidebar. +//* `spotterSidebarConfig` properties for customizing the appearance and available options in the chat history sidebar. +* Action IDs for customizing the visibility and status of actions in the embedded Spotter interface: +** `Action.DataModelInstructions` for the data model instructions icon. +** `Action.SpotterSidebarHeader` for the chat history sidebar header +** `Action.SpotterSidebarFooter` for the chat history sidebar footer +** `Action.SpotterSidebarToggle` for the chat history toggle that expands or collapses the sidebar. +** `Action.SpotterNewChat` for the new chat icon in the chat history sidebar. +** `Action.SpotterPastChatBanner` for the banner in the chat history sidebar. +** `Action.SpotterChatMenu` for the chat menu component in the chat history sidebar. +** `Action.SpotterChatRename` for **Rename** action in the chat menu of a saved chat. +** `Action.SpotterChatDelete` for **Delete** action in the chat menu of a saved chat. +//** `Action.SpotterDocs` for best practices documentation icon in the chat history sidebar. + +Events:: +* `HostEvent.DataModelInstructions` + +Opens the Data Model instructions modal. +* `EmbedEvent.DataModelInstructions` + +Is emitted when a user clicks the Data Model instructions icon in the Spotter interface. +* `EmbedEvent.SpotterConversationRenamed` + +Is emitted when a user renames a saved chat. +* `EmbedEvent.SpotterConversationDeleted` + +Is emitted when a saved chat is deleted. +* `EmbedEvent.SpotterConversationSelected` + +Is emitted when a saved chat is selected in the chat history sidebar. + +|[tag greenBackground]#NEW FEATURE# | `enableLinkOverridesV2` + + +Use this configuration setting to override ThoughtSpot URLs on hover or when opening in a new tab. This is recommended over the earlier `linkOverride` flag for a better user experience. + +|[tag greenBackground]#NEW FEATURE# a| **Liveboard experience enhancements** + +* The `isLiveboardXLSXCSVDownloadEnabled` attribute adds XLSX and CSV to the available Liveboard download formats. +* The `isGranularXLSXCSVSchedulesEnabled` attribute allows you to include the entire Liveboard, specific visualizations, or only tables and pivot tables in the XLSX and CSV schedules. +|==== + +== Version 1.45.0, February 2026 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| **Spotter enhancements** + +You can now embed the Spotter 3 experience in your application and use features such as Auto mode for automatic data model selection, chat history, and a new chat prompt interface. + +* To enable the new chat prompt interface, set `updatedSpotterChatPrompt` to `true`. +* To use Auto mode, set the `worksheetId` to `auto_mode`. +* To enable Chat history, set `enablePastConversationsSidebar` to `true`. + +For more information, see xref:embed-spotter.adoc[Embedding Spotter] and xref:embed-ai-analytics.adoc#_feature_status_and_availability_in_embed_mode[Features available with Spotter 3 experience]. + +Events:: + +* `EmbedEvent.AddToCoaching` for the *Add to Coaching* workflow in a Spotter conversation session +* `HostEvent.AddToCoaching` to trigger the *Add to Coaching* action in a Spotter conversation session. +* `HostEvent.StartNewSpotterConversation` to trigger the action to start a new chat session with Spotter. + +[NOTE] +==== +On Spotter embed deployments running version 26.2.0.cl or later, the *Add to Coaching* feature is enabled by default. To disable or hide the *Add to Coaching* button, use the xref:Action.adoc#_inconversationtraining[InConversationTraining] action ID. +==== + +|[tag greenBackground]#NEW FEATURE# a| **Liveboard experience enhancements** + + +Styling and grouping:: + +* The `isLiveboardStylingAndGrouping` attribute, used to enable the Liveboard styling and grouping feature, is now replaced with `isLiveboardMasterpiecesEnabled`. While your existing configuration with the deprecated `isLiveboardStylingAndGrouping` attribute continues to work, we recommend switching to the new configuration setting. +* The following action IDs are now available to show, disable, or hide the grouping menu actions on a Liveboard: +** `Action.MoveToGroup` for the **Move to Group** menu action. +** `Action.MoveOutOfGroup` for the **Move out of Group** menu action. +** `Action.CreateGroup` for the *Create Group* menu action. +** `Action.UngroupLiveboardGroup` for the **Ungroup Liveboard Group** menu action. + +Filter chip masking:: +The `showMaskedFilterChip` boolean parameter is now available to control the visibility of masked filter chips on a Liveboard. When set to `true`, if a Liveboard is shared with a user who has restricted access due to column-level security, the filter chip corresponding to those inaccessible columns will be displayed as masked to that user. When set to `false`, the filter chip for inaccessible columns will not be visible to the user. ++ +For more information, see link:https://docs.thoughtspot.com/cloud/latest/security-data-object#csr-liveboard[Column security rules on Liveboards]. ++ +The `showMaskedFilterChip` setting is also available in full application embedding. + +|[tag greenBackground]#NEW FEATURE# a| **Publishing objects** + +The following action IDs are available for the data publishing menu actions in the *Data workspace* page: + +* `Action.Publish` for *Publish* +* `Action.ManagePublishing` for *Manage publishing* +* `Action.Unpublish` for *Unpublish* +* `Action.Parameterize` for *Parameterize* +|[tag greenBackground]#NEW FEATURE# a| **Error handling improvements** + +To handle errors in the embedding workflows, the SDK includes the following features: + +* `ErrorDetailsTypes` enum for categorizing error types, such as `API`, `VALIDATION_ERROR`, and `NETWORK`. +* `EmbedErrorCodes` enum with specific error codes for programmatic error handling. +* `EmbedErrorDetailsEvent` interface for structured error event handling. + +For more information, see link:https://developers.thoughtspot.com/docs/Enumeration_EmbedErrorCodes[EmbedErrorCodes] and link:https://developers.thoughtspot.com/docs/Enumeration_ErrorDetailsTypes[ErrorDetailsTypes]. +|==== + +== Version 1.44.x, January 2026 + +[width="100%" cols="1,4"] +|==== + +|[tag redBackground]#DEPRECATED# | **Use `minimumHeight` instead of `defaultHeight`** + + +The `defaultHeight` parameter is deprecated in Visual Embed SDK v1.44.2 and later. +To set the minimum height of the embed container for ThoughtSpot components such as a Liveboard, use the `minimumHeight` attribute instead. + +|[tag greenBackground]#NEW FEATURE# a| *Intercepting API calls* + +The SDK provides the following attributes to intercept API calls and handle interception via events and custom workflows: + +//* `enableApiIntercept` + +//When set to true, enables the feature on your ThoughtSpot embed. +* `interceptUrls` + +Allows configuring which API calls to intercept. +* `interceptTimeout` + +Sets the timeout duration for handling interception. +* `isOnBeforeGetVizDataInterceptEnabled` + +When set to true, it enables use of `EmbedEvent.OnBeforeGetVizDataIntercept` to emit and intercept search execution calls initiated by users and implement custom logic or workflows to allow or restrict search execution. +* `EmbedEvent.ApiIntercept` + +Emits when an API call matching the conditions defined in `interceptUrls` is detected. + +For more information, see xref:api-intercept.adoc[Intercept API calls and search requests]. +|==== + + +== Version 1.43.0, November 2025 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| *Code-based custom actions* + +The following enumerations are available for code-based custom actions: + +* `CustomActionTarget` + +To define the target object for the custom action, such as on a Liveboard, visualization, Answer, or in Spotter. +* `CustomActionsPosition` + +To define the position of the custom action in the target object, such as primary menu, **More** options menu image:./images/icon-more-10px.png[the more options menu], or the contextual menu. +|[tag greenBackground]#NEW FEATURE# | *Attribute to set Parameter chip visibility during overrides* + +The `HostEvent.UpdateParameters` event now supports configuring the `isVisibleToUser` attribute to show or hide the Parameter chips after an override. For more information, see xref:runtime-parameters.adoc#_show_or_hide_parameter_chips_in_embedded_sessions[Show or hide Parameter chips in embedded sessions]. +|==== + +== Version 1.42.0, October 2025 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a|*Runtime overrides in Spotter embed* + +The Visual Embed SDK now supports runtime overrides in Spotter embed. + +* To apply runtime filters, use the `runtimeFilters` object +* To apply runtime Parameters, use the `runtimeParameters` object. + +|[tag greenBackground]#NEW FEATURE# a|*PNG images in Liveboard schedule notifications* + +To enable embedding PNG images of Liveboards in scheduled job notifications sent to subscribers, the SDK provides the `isPNGInScheduledEmailsEnabled` boolean parameter. When set to true, scheduled emails will include a PNG image of the Liveboard. + +The SDK also provides the following action IDs: + +* `Action.PngScreenshotInEmail` + +Adds the option to include a PNG screenshot in the notification email body when scheduling emails in ThoughtSpot. +* `Action.RemoveAttachment` + +Allows the user to remove an attachment from the email configuration in the schedule email dialog. +|[tag greenBackground]#NEW FEATURE# a|*Spotter embed* + +Action IDs:: +The following action IDs are available for Spotter embedding and are currently supported only in the `hiddenActions` array: + +* `Action.SpotterWarningsBanner` + +Action ID to control the visibility of the Spotter warnings banner in the UI. This banner displays general warnings or informational messages related to Spotter results or queries. +* `Action.SpotterWarningsOnTokens` + +Action ID to control the visibility of warning indicators on individual Spotter tokens parsed from a Spotter query. +* `Action.SpotterTokenQuickEdit` + +Action ID to enable or disable the link:https://docs.thoughtspot.com/cloud/latest/spotter-getting-started#quick-edits[quick edit functionality^] for Spotter tokens. +|==== + +== Version 1.41.0, September 2025 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a|*React component for Spotter Agent embed* + +The Visual Embed SDK now supports embedding Spotter Agent feature without a body or Spotter interface in a React app. For ease of implementation, the SDK also provides a custom React hook, `useSpotterAgent`. + +For more information, see xref:embed-ts-react-app.adoc#_embed_spotter_agent_in_your_own_app[Spotter Agent embedding in a React app]. + +|[tag greenBackground]#NEW FEATURE# a|*Event handlers for Spotter embed* + +The following event handlers are now available for Spotter embed: + +* `EmbedEvent.SpotterInit` + +Fires when Spotter embed component rendering is initialized. +* `EmbedEvent.QueryChanged` + +Fires when the Spotter query is updated by the user. +* `HostEvent.AskSpotter` + +Triggers *Ask Spotter* action for visualizations. +* `HostEvent.GetParameters` + +Triggers the action to fetch runtime Parameters applied on a visualization. +* `HostEvent.UpdateParameters` + +Triggers the action to update runtime Parameters for a Spotter-generated Answer. +* `HostEvent.GetTML` + +Triggers the action to get TML representation of a Spotter-generated Answer. + +For more information, see xref:EmbedEvent.adoc[EmbedEvent] and xref:HostEvent.adoc[HostEvent]. + +|[tag greenBackground]#NEW FEATURE# a|*Event handlers for Spotter Agent embed* + +You can now use the following host events in Spotter Agent embedding: + +- `HostEvent.DownloadAsCsv` + +Triggers the action to download a Spotter-generated Answer in CSV format. +- `HostEvent.DownloadAsPng` + +Triggers the action to download a Spotter-generated Answer in PNG format. +- `HostEvent.DownloadAsXlsx` + +Triggers the action to download a Spotter-generated Answer in XLSX format. +- `HostEvent.DownloadAsPdf` + +Triggers the action to download the PDF version of a Spotter-generated Answer. +- `HostEvent.Pin` + +Triggers the action to add a Spotter-generated Answer to a Liveboard. +- `HostEvent.Save` + +Triggers the *Save* action for a Spotter-generated Answer. + +For more information, see xref:HostEvent.adoc[HostEvent]. + +|[tag greenBackground]#NEW FEATURE# a| *Lazy loading of visualizations on an embedded Liveboard* + +You can now use the `lazyLoadingForFullHeight` parameter with the `fullHeight` to progressively load visualizations on an embedded Liveboard. When both these attributes are enabled, only the visualizations in the current viewport are loaded initially, while the other visualizations load as the user scrolls the Liveboard page. + +You can also set the margin property for lazy loading to define when the visualization should load. + +For more information, see xref:lazy-loading-fullheight.adoc[Lazy loading of visualizations in an embedded Liveboard]. + +|[tag greenBackground]#NEW FEATURE# a| *Full application embed* + + +You can now enable the persona-based left navigation panel and home page experience on your ThoughtSpot instance. This feature is disabled by default on ThoughtSpot instances and is available for Early Access. When it's enabled on your ThoughtSpot instance, you can roll out the new experience on embedding applications by configuring the xref:AppViewConfig.adoc#_discoveryexperience[`discoveryExperience`] attribute. + +When enabled, the left navigation panel organizes the application menu into persona-based contextual sections. For example, the *Insights* icon for business users, the *Data Workspace* icon for Analysts and Data engineers, and the *Develop* icon for developers. Your application users can navigate to each option using the tabs in the left navigation panel. The new interface also provides a slider to allow users to view or hide the left navigation panel. +|==== + +== Version 1.40.0, July 2025 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| *Fullscreen presentation mode controls for embedded Liveboards and visualizations* + +Developers can now control whether a visualization or Liveboard can be presented in full screen mode using the `disableFullscreenPresentation` attribute. By default, the full screen mode is disabled on embedded Liveboards and visualizations. +|[tag greenBackground]#NEW FEATURE# a| *PDF download settings* + +Developers can now control the display of *Include cover page* and *Include filter page(s)* options on the Download PDF dialog for Liveboards. The *Include cover page* and *Include filter page(s)* options are disabled by default on ThoughtSpot instances. When this feature is enabled, developers can use the `coverAndFilterOptionInPDF` attribute to show or hide these options for the Liveboard users in their embedding app. + +|[tag greenBackground]#NEW FEATURE# a| *Parameter for overriding a default primary action* + + +If Spotter is enabled on your instance, the *Spotter* button appears by default as the primary action on embedded Liveboard charts; if Spotter is not enabled, the *Explore* button is set as the primary action. If you want to replace the primary action with a different action, you can now use the `primaryAction` attribute. + +For more information, see xref:embed-actions.adoc#_override_default_primary_actions[Override default primary action]. + +|[tag greenBackground]#NEW FEATURE# a| *Full application embed experience enhancements* + + +The SDK now includes the `hideObjectSearch` property, which allows developers to hide the object search button in the navigation bar when embedding the full application. + +|[tag greenBackground]#NEW FEATURE# a| *Host events* + + +In this version, the SDK introduces the following host event handlers: + +- `HostEvent.ExitPresentMode` + +Triggers the exit action that allows users to exit the Liveboard or visualization present mode. +- `HostEvent.SpotterSearch` + +Triggers a search operation for the specified query string in Spotter embed. +- `HostEvent.PreviewSpotterData` + +Triggers the *Preview data* action that shows the data used for Spotter conversations. +- `HostEvent.ResetSpotterConversation` + +Triggers the *Reset* action to reset a Spotter conversation. +- `HostEvent.EditLastPrompt` + +Triggers the edit prompt action. +- `HostEvent.DeleteLastPrompt` + +Triggers the delete prompt action. + +For more information, see xref:HostEvent.adoc[HostEvent]. + +|[tag greenBackground]#NEW FEATURE# a|*Events support for Spotter embed* + +You can now use the following host events in Spotter embed: -Emitted when a saved Spotter conversation is selected from the chat history sidebar in the embedded Spotter interface. +- `HostEvent.DownloadAsCsv` +- `HostEvent.DownloadAsPng` +- `HostEvent.DownloadAsXlsx` +- `HostEvent.Edit` +//- `HostEvent.GetParameters` +//- `HostEvent.GetTML` +- `HostEvent.MakeACopy` +- `HostEvent.Pin` +- `HostEvent.Save` +For more information, see xref:HostEvent.adoc[HostEvent]. + +|[tag greenBackground]#NEW FEATURE# a| *Lazy loading with full height* + +The SDK introduces `lazyLoadingForFullHeight` parameter, which enables progressive loading of visualizations on an embedded Liveboard. +This parameter works in conjunction with the `fullHeight` attribute. When both these attributes are enabled, only the visualizations in the current viewport are loaded initially, while the other visualizations load as the user scrolls the Liveboard page. + +[NOTE] +==== +To use these attributes effectively in embedded applications, your ThoughtSpot instance must be upgraded to version 10.12.0.cl or later. +==== +|==== + + +== Version 1.39.0, July 2025 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| *Spotter embed components with new names* + +The following Spotter embed components are now deprecated and replaced with new components in the SDK and Visual Embed Playground: + +* `ConversationEmbed` + +Replaced with `SpotterEmbed` +* `ConversationViewConfig` + +Replaced with `SpotterEmbedViewConfig` +* `BodylessConversation` + +Replaced with `SpotterAgentEmbed` +* `BodylessConversationViewConfig` + +Replaced with `SpotterAgentEmbedViewConfig` + +The deprecated components with old names in the existing Spotter embed implementations will continue to function until further notice. For code samples with new component names, see xref:embed-spotter.adoc[Spotter embed documentation]. + +|[tag greenBackground]#NEW FEATURE# a| *Action ID for Spotter in-conversation training* + +For ThoughtSpot instances that have the new Spotter in-conversation training workflow enabled, the SDK provides the action ID `Action.InConversationTraining` to manage the visibility of the *Add to Coaching* button on Answers generated from Spotter prompts. + +[NOTE] +The *Add to Coaching* feature is currently in beta and is turned off by default on embed deployments. To enable this feature on your instance, contact ThoughtSpot Support. + +|[tag greenBackground]#NEW FEATURE# a|*Events support for Spotter embed* + +New embed events:: + +- `EmbedEvent.ExitPresentMode` + +Emits when a user exits the Liveboard or visualization presentation mode. +- `EmbedEvent.LastPromptDeleted` + +Emits when a query prompt in Spotter embed is deleted. +- `EmbedEvent.LastPromptEdited` + +Emits when a query prompt in Spotter embed is edited. +- `EmbedEvent.ResetSpotterConversation` + +Emits when a Spotter query is reset. +- `EmbedEvent.PreviewSpotterData` + +Emits when a user clicks the Preview data button in the Spotter conversation panel. +- `EmbedEvent.SpotterQueryTriggered` +Emits when a Spotter query is triggered. + +The following embed events are also supported in Spotter embed: + +- `EmbedEvent.AddRemoveColumns` +- `EmbedEvent.AnswerChartSwitcher` +- `EmbedEvent.AuthExpire` +- `EmbedEvent.AuthInit` +- `EmbedEvent.CopyToClipboard` +- `EmbedEvent.CustomAction` +- `EmbedEvent.Data` +- `EmbedEvent.DataSourceSelected` +- `EmbedEvent.DialogClose` +- `EmbedEvent.DialogOpen` +- `EmbedEvent.Download` +- `EmbedEvent.DownloadAsCsv` +- `EmbedEvent.DownloadAsPng` +- `EmbedEvent.DownloadAsXlsx` +- `EmbedEvent.DrillDown` +- `EmbedEvent.DrillExclude` +- `EmbedEvent.DrillInclude` +- `EmbedEvent.Edit` +- `EmbedEvent.Error` +- `EmbedEvent.Load` +- `EmbedEvent.Pin` +- `EmbedEvent.Save` +- `EmbedEvent.TableVizRendered` +- `EmbedEvent.VizPointClick` +- `EmbedEvent.VizPointDoubleClick` +- `EmbedEvent.VizPointRightClick` + +For more information, see xref:EmbedEvent.adoc[EmbedEvent]. + +|==== + +== Version 1.38.0, June 2025 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| *String IDs for text customization* + +Developers can now customize a specific occurrence of a visible text string in the ThoughtSpot UI using the `stringIDs` object in the customization interface. + +To locate the string IDs, SDK provides the `exposeTranslationIds` attribute. By setting `exposeTranslationIds` to `true` in the Playground, you can find the string ID of the UI text and use it in your customization code. + +Additionally, the SDK provides the `StringIDsUrl` attribute to allow using a JSON file with string IDs and custom strings to override the visible text in the UI. + +For more information, see xref:customize-text-strings.adoc[Customize text strings]. + +|[tag greenBackground]#NEW FEATURE# a| *Hide columns on list pages* + + +In full app embedding, you can now hide the following columns on the *Liveboards* and *Answers* listing pages using the `hiddenListColumns` array: + +* *Author* + +`hiddenListColumns: [ListPageColumns.Author]` +* *Favorite* + +`hiddenListColumns: [ListPageColumns.Favourite]` +* *Last modified* + +`hiddenListColumns: [ListPageColumns.DateSort]` +* *Tags* + +`hiddenListColumns: [ListPageColumns.Tags]` +* *Share* + +`hiddenListColumns: [ListPageColumns.Share]` + + +For more information, see xref:full-app-customize.adoc#_hide_columns_on_list_pages_new_experience[Customize full application embed]. +|==== + +== Version 1.37.0, April 2025 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| +The SDK now provides the `customVariablesForThirdPartyTools` setting to pass custom variables when integrating third-party tools and running custom scripts in your embed. Developers can define this object in the **init()** function and add variables as key-value pairs. +This feature is available only if third-party integration is enabled on your instance and the script hosting domain URL is added to the CSP allowlist. + +For more information, see xref:3rd-party-script.adoc[Integrate third-party tools and allow custom scripts]. + +|[tag greenBackground]#NEW FEATURE# a| +You can now exclude search token string from the application URL by setting `excludeSearchTokenStringFromURL` to `true` in your embed with ThoughtSpot token-based Search or Search bar. + +|[tag greenBackground]#NEW FEATURE# a| This version of the SDK supports the following embed and host events: + +Embed Events:: + +* `EmbedEvent.TableVizRendered` + +Emits when a table visualization is rendered in the ThoughtSpot embedded app. You can also use this event as a hook to trigger host events such as `HostEvent.TransformTableVizData` on the table visualization. For more information, see the link:https://developers.thoughtspot.com/docs/Enumeration_EmbedEvent#_tablevizrendered[SDK reference documentation]. + +* `EmbedEvent.CreateLiveboard` + +Emits when a Liveboard is created. + +Host Events:: + +* `HostEvent.TransformTableVizData` + +Triggers the table visualization re-render with the updated data. You can use this event in conjunction with `EmbedEvent.TableVizRendered` to apply the modifications to table visualization payload. + +* `HostEvent.Remove` + +Triggers the *Delete* action on a Liveboard. +|==== + +== Version 1.36.0, February 2025 + +[width="100%" cols="1,4"] |==== +|[tag greenBackground]#NEW FEATURE# a| +The following HostEvents now allow custom parameters to set object properties programmatically: + +* `HostEvent.SaveAnswer` + +Allows adding `name` and `description` text strings. When these parameters are defined, the event triggers the Save action to save the Answer with the predefined properties without opening the *Describe your Answer* modal. +* `HostEvent.Pin` + +Allows adding custom properties for visualization ID, name, and description, Liveboard ID, and Tab ID. When these parameters are defined, the event triggers an action to pin the Answer to the Liveboard specified in the code, without opening the *Pin* modal. + +For more information, see xref:events-hostEvents.adoc#hostEventParameterization[Host Events] documentation. + +|[tag greenBackground]#NEW FEATURE# a| + +New configuration attributes:: + +* `disableSourceSelection` + +Disables data source selection panel for embed users when set to `true`. +* `hideSourceSelection` + +Hides data source selection panel when set to `true` +* `locale` + +Sets the xref:locale-setting.adoc[locale and regional settings] for the Spotter interface. +* `showSpotterLimitations` + +Shows functional limitations of Spotter when set to `true` +* `hideSampleQuestions` + +Hides sample questions that appear on the default Spotter page. + +Action IDs for menu customization:: +Use the following action IDs in the `disabledActions`, `visibleActions`, or `hiddenActions` array to disable, show, or hide menu actions and elements in the embedded Spotter interface: + +* `Action.PreviewDataSpotter` + +The *Preview data* button on the Spotter conversation panel. +* `Action.ResetSpotterChat` + +The *Reset* button on the Spotter conversation panel. +* `Action.SpotterFeedback` + +The feedback widget on Spotter-generated charts. +* `Action.EditPreviousPrompt` + +The edit icon on the prompt panel. +The Prompt panel appears after Spotter generates a response to a user query. +* `Action.DeletePreviousPrompt` + +The delete icon on the prompt panel. + +//// +* `Action.EditTokens` + +The option to edit tokens on a Spotter-generated chart or table. +//// +CSS variables:: + +The following new CSS variables are available for Spotter interface customization: + +* `--ts-var-spotter-input-background` +* `--ts-var-spotter-prompt-background` + +For more information about Spotter customization, see xref:embed-spotter.adoc#SpotterCSS[Customize styles]. +|[tag greenBackground]#NEW FEATURE# a| + + +Configuration attributes:: + +* `hideIrrelevantChipsInLiveboardTabs` + +Hides filter chips on a Liveboard when set to `true`. + +* `isLiveboardCompactHeaderEnabled` + +Enables the compact Liveboard header feature when set to `true`. + +Action IDs:: +Use the following action IDs in the `disabledActions`, `visibleActions`, or `hiddenActions` array to disable, show, or hide menu actions on an embedded Liveboard: + +* `Action.DisableChipReorder` + +ID for the action that disables filter chip reordering. +* `Action.ChangeFilterVisibilityInTab` + +|==== + +== Version 1.35.0, December 2024 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| +The SDK now provides the `isUnifiedSearchExperienceEnabled` setting to customize the Search experience on ThoughtSpot Home page for embedding application users: + +* When set to `true`, the split search experience is disabled and the Search bar on the Home page functions as Natural Language Search interface +* When set to `false`, the split search experience is enabled and object Search is set as the default Home page search experience. + +For more information, see xref:full-app-customize.adoc#_search_components[Search interface on the Home page in full application embedding]. + +|[tag greenBackground]#NEW FEATURE# a| The `overrideOrgId` parameter in the SDK provides the ability to override Org context for embedding application users. This parameter allows users authenticated to an Org to temporarily view content from another Org. Before specifying the Org ID for override, make sure the Per Org URL feature is enabled on your ThoughtSpot instance. To enable Per Org URL on your instance, contact ThoughtSpot Support. +|==== + +== Version 1.34.0, November 2024 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| You can now embed the following ThoughtSpot Spotter components in your app: + +* `SpotterEmbed` + +Embeds Spotter conversation interface in your app +* `SpotterAgentEmbed` + +Creates a conversation component without the body, which can be integrated into chatbots or other conversational apps. + +For more information, see xref:embed-spotter.adoc[Embed Spotter] and xref:spotter-in-custom-chatbot.adoc[Integrate Spotter into your chatbot]. + +|[tag greenBackground]#NEW FEATURE# a|The following parameters and enumerations are available for customizing Liveboard experience: + +* `showLiveboardVerifiedBadge` + +Shows or hides the Liveboard verified badge. Available if the Liveboard compact header feature is enabled. +* `showLiveboardReverifyBanner` + +Shows or hides the re-verify banner. Available if the Liveboard compact header feature is enabled. +* `Action.KPIAnalysisCTA` + +Action ID to show, hide, or disable the **Analyze CTA** action on a KPI chart. + +|[tag greenBackground]#NEW FEATURE# |You can now use the `HostEvent.GetIframeUrl` to get the iframe src URL from the Visual Embed Playground. If you are embedding ThoughtSpot in apps like Salesforce and Sharepoint without the SDK, use this event to generate the iframe URL. + +|[tag greenBackground]#NEW FEATURE# a|The following parameters are available for customizing Search experience: + +* `collapseDataPanel` +Minimizes the data panel view. Users can click the data panel header any time to expand the panel. +* `collapseSearchBar` +Sets the initial state of the search bar when embedding a saved Answer. + +|[tag greenBackground]#NEW FEATURE# a| The following settings are available for customizing the new home page and navigation experience in full app embedding: + +* `HomeLeftNavItem.LiveboardSchedules` + +The Liveboard schedules menu on the left navigation panel. + +Action enumerations:: + +* `Action.EditScheduleHomepage` + +To show, disable, or hide the *Edit* action on the *Liveboard schedules* page +* `Action.PauseScheduleHomepage` + +To show, disable, or hide the *Pause* action on the *Liveboard schedules* page +* `Action.ViewScheduleRunHomepage` + +To show, disable, or hide the *View run history* action on the *Liveboard schedules* page +* `Action.DeleteScheduleHomepage` + +To show, disable, or hide the *Delete* action on the *Liveboard schedules* page +* `Action.UnsubscribeScheduleHomepage` + +To show, disable, or hide the *Unsubscribe* action on the *Liveboard schedules* page +|==== + +== Version 1.33.x, October 2024 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| You can now customize the search experience for the embedded ThoughtSpot **Home** page using `homePageSearchBarMode`. By default, the **Home** page includes the Object Search bar, which allows finding popular Liveboards and Answers. + +You can set the `homePageSearchBarMode` property to one of the following options: + +** `aiAnswer` + +Displays the search bar for Natural Language Search. +** `none` +Hides the Search bar on the **Home** page. Note that it only hides the Search bar on the **Home** page and doesn't affect the Object Search bar visibility on the top navigation bar. +** `objectSearch` (default) + +Displays Object Search bar on the **Home** page. +|[tag greenBackground]#NEW FEATURE# a|The SDK now allows you to set the focus on the Search bar or outside the Search bar when rendering the embedded Search page. Use the `focusSearchBarOnRender` property to set the position of the cursor focus. +|[tag greenBackground]#NEW FEATURE# a| The SDK includes the following Event and Action enumeration members: + +Events:: + +* `EmbedEvent.OnBeforeGetVizDataIntercept` + +Developers can emit this event to intercept search execution, allow or restrict certain queries, and show an error message with custom text for restricted queries. To allow the embedded page to emit this event, you must set the `isOnBeforeGetVizDataInterceptEnabled` attribute to `true`. + +* `EmbedEvent.ParameterChanged` + +Emitted when a Parameter is changed on a saved Answer or Liveboard. + +Actions:: + +* `Action.ManageTags` + +Use this action enumeration to disable, show, or hide the **Manage tags** button on the Liveboards and Answers pages. +|==== + +== Version 1.32.x, August 2024 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| The following new action enumerations are available in this version: + + +* `Action.CreateLiveboard` for the *Create Liveboard* menu action on the Liveboards lists page. + +* `Action.SyncToTeams` for the **Sync to Teams** menu action on Liveboard visualizations. +* `Action.SyncToSlack` for the **Sync to Slack** action on Liveboard visualizations. +* `Action.AddQuerySet` for the **Add Query Set** action on the data panel (new experience) of the Search page. +* `Action.AddColumnSet` for the **Add Column Set** action on the data panel (new experience) of the Search page. +* `Action.AddDataPanelObjects` for the **Add** menu that includes sub-menu options such as Formulas, Parameters, Query set, and Column set actions. +* `Action.OrganiseFavourites` for the **Organize** action above the Favorites panel on the modular Homepage (New experience) +For more information, see xref:Action.adoc[Actions]. +|[tag greenBackground]#NEW FEATURE#| Developers can now use the `disableRedirectionLinksInNewTab` parameter to disable links and redirection of links in the embedded view. +|[tag greenBackground]#NEW FEATURE# a|You can now enable `enable2ColumnLayout` on a Liveboard to adjust the page view according to the width and resolution of users' devices. +|| +|==== + +== Version 1.31.x, July 2024 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| Runtime filters + + +* `NOT_IN` operator for Runtime filters. +For more information, see xref:runtime-filters.adoc#runtimeFilterOp[Runtime filters]. +* `excludeRuntimeParametersfromURL` parameter to exclude or remove runtimeParameters from the URL. +|[tag greenBackground]#NEW FEATURE# |For performance optimization, developers can choose to load embedded views in a lightweight V2 shell by setting `enableV2Shell_experimental` to `true`. +|==== + +== Version 1.30.0, June 2024 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| **CSS variables for new homepage experience** + +* `--ts-var-home-watchlist-selected-text-color` + +* `--ts-var-home-card-color` + +* `--ts-var-home-favorite-suggestion-card-text-color` + +* `--ts-var-home-favorite-suggestion-card-background` + +* `--ts-var-home-favorite-suggestion-card-icon-color` + +For more information, see xref:css-customization.adoc#_homepage_modules_new_experience_mode[CSS variables and overrides]. +|==== + +== Version 1.29.0, May 2024 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| **Ask Sage** + +With Ask Sage [beta betaBackground]^Beta^ embedded application users can ask follow-up questions on a visualization generated from a Natural Language Search query, converse with AI analyst, and refine results. To enable this feature, set `enableAskSage` to `true`. + +Action enumeration:: +To show, hide, or disable Ask Sage on a visualization, add `Action.AskAi`. For example, ++ +[source,JavaScript] +---- +hiddenActions: [Action.AskAi] +---- + +Events:: +* `HostEvent.AskSage` + +Triggers the **Ask Sage** action on a Liveboard visualization. +* `EmbedEvent.AskSageInit` + +Emits when the **Ask Sage** action is initialized. +* `HostEvent.GetParameters` + +Triggers a fetch action to get runtime Parameters. +* `HostEvent.UpdateParameters` + +Updates runtime Parameters +* `HostEvent.ResetLiveboardPersonalisedView` + +Resets a personalized Liveboard view. +* `HostEvent.UpdateCrossFilter` + +Updates cross filters applied on a Liveboard. +|==== + +== Version 1.28.x, April 2024 + +[width="100%" cols="1,4"] +|===== +|[tag greenBackground]#NEW FEATURE# a| The SDK includes the following new enumeration members in v1.28.0: + +** `Action.VerifiedLiveboard` + +Can be used to show or hide the *Verified Liveboard* banner. +|[tag greenBackground]#NEW FEATURE# a| To access the new Home page and global navigation experience in the full application embedding, you can use the `modularHomeExperience` property in the SDK. The modular homepage experience is turned off by default and is available as an Early Access feature in 9.12.5.cl release. When `modularHomeExperience` is set to `true`, you can use the following parameters in the SDK to control the application experience: + +* `hiddenhomeleftnavitems` +* `hiddenhomepagemodules` +* `hideapplicationswitcher` +* `hidehomepageleftnav` +* `hideorgswitcher` +* `reorderedhomepagemodules` +* `hiddenhomeleftnavitems` +* `HomeLeftNavItem` + +For more information, see xref:full-app-customize.adoc[Customize full application embedding] and xref:AppViewConfig.adoc[AppViewConfig]. +|[tag greenBackground]#NEW FEATURE# a| The following embed event is available from the v1.28.0 onwards: + +`EmbedEvent.Rename` + +Emits when an embedded Liveboard or visualization is renamed. +|[tag greenBackground]#NEW FEATURE# a| TML actions + +The following TML menu actions are now grouped under *TML* sub-menu of the **More** image:./images/icon-more-10px.png[the more options menu] menu on Answer page. + +* Export TML +* Edit TML +* Update TML + +To show, hide, or disable these actions in the embedded mode, use the following format: + +[source,JavaScript] +---- + // to show the TML menu and its sub-menu options +visibleActions: [Action.TML, Action.ExportTML, Action.EditTML] +---- + +[source,JavaScript] +---- + // to hide all TML actions +hiddenActions: [Action.TML] +---- + +[source,JavaScript] +---- + // to disable all TML actions +disabledActions: [Action.TML] +---- +|[tag greenBackground]#NEW FEATURE# | You can now reset authentication token and fetch a new token for new authentication requests. +For more information, see link:https://developers.thoughtspot.com/docs/Function_resetCachedAuthToken[resetCachedAuthToken]. + +|[tag greenBackground]#NEW FEATURE#| You can now override the default number, date, and currency format defined by your locale settings. To override the default settings, use the following parameters: + +* `numberFormatLocale` + +* `dateFormatLocale` + +* `currencyFormat` + +For more information, see xref:locale-setting.adoc#_set_locale_in_the_sdk[Customize locale]. + +|[tag greenBackground]#NEW FEATURE# |Tokenized fetch + +The SDK now provides a fetch wrapper that adds the authentication token to the API requests. +For more information, see link:https://developers.thoughtspot.com/docs/Function_tokenizedFetch#_tokenizedfetch[tokenizedFetch]. +|===== + +== Version 1.27.x, March 2024 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| The following action enumeration members are available from v1.27.9 and v1.27.10: + +* `Action.AIHighlights` +* `Action.AddToWatchlist` +* `Action.RemoveFromWatchlist` +* `Action.CopyKpiLink` + +For more information, see xref:Action.adoc[Action]. +| [tag greenBackground]#NEW FEATURE# a| You can now use `HostEvent.GetAnswerSession` to get Answer session data for a Search Answer or Liveboard Visualization in the embedded view. +|==== + +== Version 1.27.0, January 2024 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a|The `SageEmbed` package is now available on all clusters. You can use this SDK package to embed Natural Language Search capabilities and assist users with AI-suggested queries and AI-generated answers. This SDK package also allows you to customize the Natural Language Search experience in the embedded view. + +For a complete list of methods, functions, interface objects, and properties, see the following pages: + + +* xref:SageEmbed.adoc[SageEmbed] +* xref:SageViewConfig.adoc[SageViewConfig] + +|[tag orangeBackground]#MODIFIED# a| The `HostEvent.DrillDown` now supports the `vizId` parameter to trigger a drill-down action on a specific visualization of a Liveboard. +For more information, see xref:HostEvent.adoc#_drilldown[DrillDown]. +|[tag greenBackground]#NEW FEATURE# a| The new version of the SDK introduces the following new enumeration members: + +* Host Events +** `HostEvent.UpdateSageQuery` + +Updates the search query string for Natural Language Search operations. +* Embed Events +** `EmbedEvent.CreateConnection` + +Emitted when a user creates a new data connection on the **Data** page. +** `EmbedEvent.CreateWorksheet` + +Emitted when a user creates a new Worksheet. +|==== + +== Version 1.26.0, November 2023 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| The SDK provides `AnswerService` class to trigger the answer service with a custom action payload. +You can use this service to run GraphQL queries in the context of the Answer with a custom action trigger. For more information, see link:https://developers.thoughtspot.com/docs/Class_AnswerService[AnswerService]. Recommended ThoughtSpot application version is 9.10.0.cl. + +|[tag greenBackground]#NEW FEATURE# a|The following object properties and feature flags are introduced in the `LiveboardEmbed` and `AppEmbed` SDK packages: + +* `showLiveboardDescription` + +Shows the Liveboard description text when set to `true` +* `showLiveboardTitle` + +Shows the Liveboard title when set to `true` +* `isLiveboardHeaderSticky` + +Sets Liveboard header bar as a fixed element when set to `true` +* `hideLiveboardHeader` + +Hides the Liveboard header when set to `true` +* `hiddenTabs` + +Hides the specified tabs from the Liveboard page +* `visibleTabs` + +Displays the specified tabs on the Liveboard page + +|[tag greenBackground]#NEW FEATURE# |You can now enable the new data panel experience by setting `dataPanelV2` to `true` in the SDK when embedding ThoughtSpot Search. The new data panel experience is turned off by default on embedded ThoughtSpot instances. + +|[tag greenBackground]#NEW FEATURE# a|The new version of the SDK supports the following events: + +Embed events:: +* `EmbedEvent.hiddenTabs` +* `EmbedEvent.visibleTabs` +* `EmbedEvent.UpdatePersonalisedView` +* `EmbedEvent.SavePersonalisedView` +* `EmbedEvent.ResetLiveboard` +* `EmbedEvent.DeletePersonalisedView` +* `EmbedEvent.SageWorksheetUpdated` +* `EmbedEvent.SageEmbedQuery` ++ +For more information, see xref:EmbedEvent.adoc[EmbedEvent]. + +Host events:: + +* `HostEvent.GetTabs` +* `HostEvent.SetVisibleTabs` +* `HostEvent.SetHiddenTabs` +* `HostEvent.GetAnswerSession` +* `HostEvent.UpdateSageQuery` ++ +For more information, see xref:HostEvent.adoc[HostEvent]. + +|[tag greenBackground]#NEW FEATURE# a| The SDK introduces the following action enumeration members: + +* `Action.AddTab` + +Show, disable, or hide the **Add Tab** action on a Liveboard. +* `Action.PersonalisedViewsDropdown` + +Show, disable, or hide the Liveboard views saved by a user. +* `Action.LiveboardUsers` + +Show, disable, or hide Liveboard users. +* `Action.SageAnswerFeedback` +Show, disable, or hide the feedback widget on AI-generated Answer page. +* `Action.EditSageAnswer` +Show, disable, or hide the **Edit** action on the AI-generated Answer page. + +For more information, see xref:Action.adoc[Actions]. +|==== + +== Version 1.25.0, October 2023 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# | The SDK now supports runtime Parameter overrides on Liveboards and Answers. +For more information, see xref:runtime-parameters.adoc#_apply_parameter_overrides_using_visual_embed_sdk[Runtime Parameter overrides]. + +|[tag greenBackground]#NEW FEATURE# a| The SDK introduces the following action enumeration members: + +* `Action.RenameModalTitleDescription` +* `Action.EnableContextualChangeAnalysis` +* `Action.RequestVerification` +* `Action.AddTab` + +For more information, see xref:Action.adoc[Actions]. +|==== + +== Version 1.24.0, September 2023 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| ThoughtSpot now provides the `SageEmbed` package to embed the ThoughtSpot Search page with Sage features such as natural language search and AI-suggested search examples. This feature is in beta and not available in the Visual Embed Playground. +|[tag greenBackground]#NEW FEATURE# a| The `HostEvent.SetActiveTab` event in the upcoming version of the SDK allows you to set a tab as an active tab on a Liveboard. +|==== + +== Version 1.23.0, August 2023 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| The SDK supports the following performance optimization enhancements: + + +* Ability to pre-render a generic instance of the ThoughtSpot component using the `prerenderGeneric` attribute. The generic instance uses the default host and flags and can be rendered in the background to improve application response. +* Ability to use an iFrame from a pre-rendered iFrame pool using the `usePrerenderedIfAvailable` attribute. +|==== + +//// +|[tag greenBackground]#NEW FEATURE# a| New events for Liveboard filters + + +* `EmbedEvent.FilterChanged` + +* `HostEvent.GetFilters` + +* `HostEvent.UpdateFilters` +//// + +== Version 1.22.0, June 2023 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| The new version of the SDK introduces the `TrustedAuthTokenCookieless` `authType` property to allow Cookieless embedding. The Cookieless authentication method allows using a bearer token to identify the signed-in user instead of session cookies. + +For more information, see xref:embed-authentication.adoc#_cookieless_authentication[Cookieless authentication]. + +|[tag greenBackground]#NEW FEATURE# a|The new version of the SDK allows you to block user access to the non-embedded instance of the ThoughtSpot application. In full app embed deployments, you can use the `blockNonEmbedFullAppAccess` property in the SDK to restrict or allow your application users from accessing ThoughtSpot pages in the non-embed mode. + +For more information, see xref:security-settings.adoc#_block_access_to_non_embedded_thoughtspot_pages[Block access to non-embedded ThoughtSpot pages]. + +|==== + +//// +|[tag greenBackground]#NEW FEATURE# a| The SDK supports the following performance optimization enhancements: + + +* Ability to pre-render a generic instance of the ThoughtSpot component using the `prerenderGeneric` attribute. The generic instance uses the default host and flags and can be rendered in the background to improve application response. +* Ability to use an iFrame from a pre-rendered iFrame pool using the `usePrerenderedIfAvailable` attribute. +//// + +== Version 1.21.0, May 2023 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a|The new version of the SDK introduces the following action enumeration members: + +* `Action.AxisMenuAggregate` +* `Action.AxisMenuConditionalFormat` +* `Action.AxisMenuEdit` +* `Action.AxisMenuFilter` +* `Action.AxisMenuGroup` +* `Action.AxisMenuNumberFormat` +* `Action.AxisMenuPosition` +* `Action.AxisMenuRemove` +* `Action.AxisMenuRename` +* `Action.AxisMenuSort` +* `Action.AxisMenuTextWrapping` +* `Action.AxisMenuTimeBucket` +* `Action.CrossFilter` +* `Action.RemoveCrossFilter` + +For more information, see xref:embed-action-ref.adoc[Action reference]. + +|[tag greenBackground]#NEW FEATURE# a| The SDK introduces the following events: + +* `HostEvent.AddColumns` +* `HostEvent.OpenFilter` +* `HostEvent.RemoveColumn` +* `HostEvent.ResetSearch` +* `EmbedEvent.CrossFilterChanged` +* `EmbedEvent.DownloadAsPng` +* `EmbedEvent.VizPointRightClick` + +For more information, see xref:embed-events.adoc[Events]. + +|[tag redBackground]#DEPRECATED# a| + +The following events are deprecated from version 1.21.0 onwards. + +* `HostEvent.Download` + +* `EmbedEvent.Download` + +You can use the `DownloadAsPng`, `DownloadAsXlsx`, `DownloadAsCsv` and `DownloadAsPdf` events for download actions. + +For more information, see xref:embed-events.adoc[Events reference]. +|[tag orangeBackground]#MODIFIED# a| + +Events:: +The SDK supports omitting or executing a search query in xref:HostEvent.adoc#_search[`HostEvent.Search`]. +Actions:: +Use the following action enumeration members instead of `Action.Download` to show, hide, or disable the *Download* menu action on an embedded Liveboard, visualization, or Answer: ++ +* `Action.DownloadAsCsv` +* `Action.DownloadAsPdf` +* `Action.DownloadAsXlsx` +* `Action.DownloadAsPng` + ++ +To disable or hide download actions, you can use `Action.Download` in the `disabledActions` and `hiddenActions` arrays respectively. However, if you are using the `visibleActions` array to show or hide actions on a visualization or Answer, include the following download action enumerations along with `Action.Download` in the array: + + +** `Action.DownloadAsCsv` + +** `Action.DownloadAsPdf` + +** `Action.DownloadAsXlsx` + +** `Action.DownloadAsPng` + +|[tag greenBackground]#NEW FEATURE# a| The SDK includes new attributes to customize the experience for embedded app users: + +* `linkOverride` ++ +Allows overriding the *Open in new tab* link on embedded pages. + +* `contextMenuTrigger` ++ +Allows triggering contextual menu on the Liveboard visualizations and Answers from left-click to right-click. + +* `hideSearchBar` ++ +Allows hiding the Search bar on the embedded Search page. +|[tag greenBackground]#NEW FEATURE# | The SDK now allows setting the loading preference for embedded iFrames. +For performance optimization, you can set the `loading` attribute to `lazy` in the `FrameParams` property. +|==== + +== Version 1.20.0, April 2023 + +[width="100%" cols="1,4"] +|==== +|[tag redBackground]#DEPRECATED# a|The `dataSources` property in `SearchEmbed` and `SearchBarEmbed` is deprecated and replaced with the `dataSource` attribute. The SDK supports searching from a single data source only. +|[tag greenBackground]#NEW FEATURE# a|The embed SDK packages now include the `insertAsSibling` property. This attribute can be used to insert the embedded object as a sibling to the element inside the target container. +|==== + +== Version 1.19.0, February 2023 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a|The `customCSS` property in the `customizations` object supports new variables to customize the styles for dialogs, search bar, search navigation and search suggestions panels. +For more information, see xref:css-customization.adoc[Customize CSS]. +|[tag redBackground]#BREAKING CHANGE# a|The new Liveboard experience mode introduces changes to the data format of the JSON response payload triggered by callback custom actions. For example, the `reportBookData`, and `vizData` attributes are modified, and the custom action `id` now is part of the data attribute. These changes may break your current custom action event handlers. For interoperability, we recommend adding the data attribute to `payload` in your code as shown in the example here: + +[source,JavaScript] + +---- +liveboardEmbed.on(EmbedEvent.CustomAction, payload => { + if (payload.id === "callback-action-id" \|\| payload.data.id === "callback-action-id") { + console.log('Custom Action event:', payload.data); + } +}) +---- + +You may also want to update the data classes in your scripts to process the JSON response payload and handle complex data. For more information, see xref:custom-actions-callback.adoc#_define_functions_and_classes_to_handle_liveboard_data[Callback custom actions]. + +|[tag greenBackground]#NEW FEATURE# a|The new version of the SDK introduces the following Host events: + +* `HostEvent.Delete` +* `HostEvent.Download` +* `HostEvent.DownloadAsCsv` +* `HostEvent.DownloadAsXlsx` +* `HostEvent.ManagePipelines` +* `HostEvent.Save` +* `HostEvent.Share` +* `HostEvent.ShowUnderlyingData` +* `HostEvent.SpotIQAnalyze` +* `HostEvent.SyncToOtherApps` +* `HostEvent.SyncToSheets` + +For more information, see xref:events-hostEvents.adoc[Host events]. + +|[tag redBackground]#DEPRECATED# a|The `noRedirect` property in the SDK is deprecated and replaced with the `inPopup` attribute. When set to `true`, the `inPopup` attribute allows the SAML SSO authentication flow in a pop-up window. + +For more information, see xref:embed-authentication.adoc#_saml_redirection[SAML Redirection]. +|==== + +== Version 1.18.0, January 2023 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a|The new version of the SDK provides the `SearchBarEmbed` JavaScript package to embed only the ThoughtSpot Search bar in your app. + + +For more information, see xref:embed-searchbar.adoc[Embed ThoughtSpot search bar]. + +|[tag greenBackground]#NEW FEATURE# a|The `customCSS` property in the `customizations` object supports new variables to customize the UI elements on Liveboard, visualization, and Answer pages. You can also use these variables to define custom styles in the CSS file. + +For more information, see xref:css-customization.adoc[Customize CSS]. +|[tag greenBackground]#NEW FEATURE# |The new version of the SDK allows fetching TML objects via `GetTML` host event. This event is triggered when a user clicks on the *Show underlying data* action on a Liveboard visualization or Answer page. + + +For more information, see xref:HostEvent.adoc#_gettml[GetTML]. + +|[tag greenBackground]#NEW FEATURE# a| The new version of the SDK introduces the following enums in the `Action` object: + +* `Action.SyncToOtherApps` + +* `Action.SyncToSheets` + +* `Action.ManagePipelines` + + +You can use these enums to show, hide, or disable *Sync to sheets*, *Sync to other apps*, and *Manage pipelines* menu actions on a Liveboard visualization or Answer. + +For more information, see xref:embed-action-ref.adoc[Actions]. +|==== + +== Version 1.17.1, December 2022 + +Bug fixes to the trusted authentication feature. + +== Version 1.17.0, November 2022 + +The new version of the SDK introduces several new features and enhancements. +[width="100%" cols="1,4"] +|==== +|[tag orangeBackground]#MODIFIED# a|The `AuthType` property is modified and supports new enums. + + +* `AuthType.SAML` is renamed as `AuthType.SAMLRedirect` + +* `AuthType.OIDC` is renamed as `AuthType.OIDCRedirect` + +* `AuthType.AuthServer` is renamed to `AuthType.TrustedAuthToken` + +This enhancement does not introduce any breaking changes to your current implementation. +|[tag greenBackground]#NEW FEATURE# a|To use your current SAML or OIDC authentication setup and redirect users to the IdP for authentication within the embedded iFrame, you can now use `AuthType.EmbeddedSSO`. + +For more information, see xref:embed-authentication.adoc[Authentication]. +|[tag greenBackground]#NEW FEATURE#| +The `customizations` object in the SDK allows you to specify a custom CSS URL. You can also use this object to define CSS variables directly in the `init` code. + +For more information, see xref:css-customization.adoc[Customize CSS]. +|==== + +== Version 1.16.0, October 2022 + +The new version of the SDK includes bug fixes and improvements to the new Liveboard experience. + +== Version 1.15.1, September 2022 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#| +The `prefetch` method now supports the `url` and `prefetchFeatures` parameters. You can use these parameters to call the prefetch method before `init` and prefetch static resources on application load. + +For more information, see xref:prefetch-and-cache.adoc[Prefetch static resources]. +|==== + +== Version 1.15.0, September 2022 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#| +For embedded instances with the new Liveboard experience, the Visual Embed SDK provides the `activeTabId` attribute, using which you can set a Liveboard tab as an active tab. + +For more information, see xref:embed-pinboard.adoc#_liveboard_tabs[Customize Liveboard tabs]. + +|[tag greenBackground]#NEW FEATURE# a|The new version of the SDK supports firing events for Liveboard menu actions from the host application. The SDK introduces the following host event enumeration members for Liveboard objects: + +* CopyLink +* CreateMonitor +* DownloadAsPdf +* Edit +* EditTML +* Explore +* ExportTML +* LiveboardInfo +* MakeACopy +* ManageMonitor +* Pin +* Present +* Remove +* Schedule +* SchedulesList +* UpdateTML + +For more information, see xref:events-hostEvents.adoc[Events reference]. +|==== + +== Version 1.14.0, August 2022 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#| +The Visual Embed SDK now includes the `liveboardV2` attribute in the `LiveboardEmbed` package to allow developers to enable the new Liveboard experience on their embedded ThoughtSpot instance. + +For more information, see xref:embed-pinboard.adoc[Embed a Liveboard]. +|[tag orangeBackground]#MODIFIED#|If trusted authentication is enabled, the SDK makes a `POST` API call to get a login token and log the user into ThoughtSpot. +The earlier versions of the SDK supported only `GET` API requests. For more information, see xref:embed-authentication.adoc#_configure_token_based_authentication_method_in_visual_embed_sdk[Configure token-based authentication method in Visual Embed SDK]. +|==== + +== Version 1.13.0, July 2022 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#| +This version of Visual Embed SDK includes the `enableSearchAssist` attribute, using which you can turn on the Search Assist feature on an embedded instance. +|[tag greenBackground]#NEW FEATURE#| The new version of SDK introduces the `AuthType.SAML` enum for SAML-based SSO authentication. Note that `AuthType.SAML` replaces the `AuthType.SSO` enum, which is deprecated in the v1.13.0 version of the SDK. + +For more information, see xref:embed-authentication.adoc#saml-sso-embed[Authentication]. +|[tag redBackground]#DEPRECATED#| The `AuthType.SSO` enum is deprecated in v1.13.0. ThoughtSpot recommends using `AuthType.SAML` for the SAML SSO authentication method. + +This change does not impact your current embed implementation with `AuthType.SSO`. +|[tag greenBackground]#NEW FEATURE#| The SDK includes the `getExportRequestForCurrentPinboard` event, which is triggered when a user tries to export a Liveboard in its current state. + +For more information, see xref:events-hostEvents.adoc[Events reference]. +|==== + +== Version 1.12.0, June 2022 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#| +This version of Visual Embed SDK introduces the `navigate` host event, which is triggered when a user navigates to an application page without a page reload. + +For more information, see xref:events-hostEvents.adoc[Events reference]. +|[tag greenBackground]#NEW FEATURE# | The new `getThoughtSpotPostUrlParams` method fetches ThoughtSpot URL query parameters prefixed with `ts-`. +|==== + +== Version 1.11.2, June 2022 + +Bug fix for Typescript builds that affect Angular project configurations. + +== Version 1.11.1, May 2022 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#| The SDK includes the action enum `ReportError`, using which you can turn off ThoughtSpot-specific error reporting. +|==== + +== Version 1.11.0, May 2022 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| The new version of SDK includes the following new events: + +* `ALL` +* `AnswerChartSwitcher` +* `AnswerDelete` +* `CopyAEdit` +* `CopyToClipboard` +* `Download` +* `DownloadAsPdf` +* `DownloadAsCsv` +* `DownloadAsXlsx` +* `DrillExclude` +* `DrillInclude` +* `EditTML` +* `ExportTML` +* `Monitor` +* `Pin` +* `Save` +* `SaveAsView` +* `Share` +* `ShowUnderlyingData` +* `SpotIQAnalyze` +* `UpdateTML` +* `VizPointClick` + +For more information about how to register and handle these events, see xref:embed-events.adoc[Events and app integration]. +|[tag greenBackground]#NEW FEATURE# a| The new version of SDK supports the `showAlerts` attribute, using which you can show or hide alerts and error messages in the embedded view. + +|[tag greenBackground]#NEW FEATURE# a| The `Action.CreateMonitor` enumeration is available in the SDK for embedded ThoughtSpot environments on which the *Monitor* feature is enabled. +For more information, see xref:embed-actions.adoc[Show or hide UI actions]. +|==== + +== Version 1.10.4, May 2022 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#|The `detectCookieAccessSlow` parameter in the SDK allows your app to check if third-party cookies are enabled on the browser. This parameter is available only for trusted and `Basic` authentication types. +|==== +== Version 1.10.3, May 2022 + +Bug fix and improvements to the `logout` method. + +== Version 1.10.2, May 2022 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#|Ability to configure `redirectPath` on the origin when using the SAMLRedirect `authType`. +|==== + +== Version 1.10.1, May 2022 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#|You can now use the `logout` method to log out embed users. +|[tag orangeBackground]#MODIFIED# a| Note the following changes: + + +* You can now use the `loginFailedMessage` property on init to display the `Not logged in` message when a user login fails. You can customize this message by defining a custom text string in the `loginFailedMessage` attribute. +* The `init` method now returns an event emitter which can be used to listen to `AuthStatus` such as login failure, success, or user logout. +|==== + +== Version 1.10.0, April 2022 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| The `AddRemoveColumns` event is now available in the SDK. For more information, see xref:event-embedEvents.adoc[Events reference]. +|==== + +== Version 1.9.8, April 2022 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#|The `pageId` attribute now allows you to set the **SpotIQ** page as the home tab of your embedded ThoughtSpot app. + +For more information, see xref:full-embed.adoc[Embed full application]. +|==== + +== Version 1.9.6 and 1.9.7, April 2022 + +Bug fixes and improvements + +== Version 1.9.5, April 2022 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#|The `locale` attribute is now available in embed packages. You can use this attribute to set the locale or language of your embedded application view. +For more information, see xref:locale-setting.adoc[Set locale and display language]. +|==== + +== Version 1.9.4, April 2022 + +Bug fixes and improvements to React components. + +== Version 1.9.3, March 2022 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#| The SDK now supports the `disableLoginRedirect` attribute to improve the login experience for your application users. When enabled, this attribute prevents your app from redirecting users to the login page when their session expires. + +You can use this attribute along with `autoLogin` to automatically authenticate and re-login a user. + +This feature is applicable to token-based authentication, that is, when the `AuthType` is set as `TrustedAuthToken` in the SDK. + +For more information, see xref:embed-authentication.adoc#trusted-auth-embed[Authentication]. +|==== + +== Version 1.9.2, March 2022 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#| You can now trigger events on React components using the `useEmbedRef` hook. + +For more information, see xref:embed-ts-react-app.adoc[Embed ThoughtSpot in a React app]. +|==== + +== Version 1.9.1, March 2022 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE#| The SDK now includes the `visibleVizs` attribute in the `LiveboardEmbed` package. This attribute allows you to add visualization GUIDs that you want to display when a Liveboard renders for the first time. + +For more information, see xref:embed-pinboard.adoc[Embed a Liveboard]. + +|[tag greenBackground]#NEW FEATURE# a| The following events are now available in the SDK: + + +* `LiveboardRendered` (EmbedEvent) + +For more information, see xref:event-embedEvents.adoc[Events reference]. +|==== + +== Version 1.9.0, March 2022 +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a| The SDK now includes the following new enumerations for UI actions: + +* `Action.AnswerDelete` + +* `Action.AnswerChartSwitcher` + +* `Action.AddToFavorites` + +* `Action.EditDetails` + + +For more information, see xref:embed-actions.adoc#standard-actions[Show or hide UI actions]. + +|[tag greenBackground]#NEW FEATURE# a| The SDK now supports the `UpdateRuntimeFilters` host event. For more information, see xref:events-hostEvents.adoc[Events reference]. +|==== + +== Version 1.8.x, February 2022 + +[width="100%" cols="1,4"] +|==== +|[tag redBackground]#BREAKING CHANGE# | The `autoLogin` attribute is now set as `false` by default. This attribute is used in the `init` method to automatically re-login a user when a session expires. +|[tag greenBackground]#NEW FEATURE# | The `init` method now returns the `authPromise` which resolves when a user authentication is completed. +|==== + + +== Version 1.7.0, January 2022 + +[width="100%" cols="1,4"] +|==== +| +[tag greenBackground]#NEW FEATURE# |+++

OIDC AuthType
+++ + +The SDK supports the `OIDC` `authType` in `init` calls. If you want your application users to authenticate to an OpenID provider and use their SSO credentials to access the embedded ThoughtSpot content, you can enable the `OIDC` authentication type in the SDK. + +For more information, see xref:embed-authentication.adoc#oidc-auth[Authentication and security attributes]. +|[tag greenBackground]#NEW FEATURE# a|+++
Embed events
+++ + +The SDK includes the following new event: + +* `RouteChange` + +For more information, see xref:event-embedEvents.adoc[Events reference]. + +|==== + +== Version 1.6.x, November 2021 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a|+++
Visible actions
+++ + +You can now configure a set of ThoughtSpot UI actions as visible actions and display these actions in the embedded UI. If your embedded instance requires only a few actions, you can use the `visibleActions` API to show only these actions in the embedded ThoughtSpot UI. + +For more information, see xref:embed-actions.adoc[Show or hide UI actions]. + +|[tag orangeBackground]#MODIFIED# | +++
Terminology changes
+++ + +The SDK library and object parameter names are modified to rebrand pinboards as Liveboards. For a complete list of changes, see xref:terminology-update.adoc#sdk-changes[Terminology changes]. + +|[tag greenBackground]#NEW FEATURE# a|+++
Embed events
+++ + +The SDK supports the following new events: + +* `DialogOpen` +* `DialogClose` + +For more information, see xref:event-embedEvents.adoc[Events reference]. +|==== + +== Version 1.5.0, October 2021 + +[width="100%" cols="1,4"] +|==== +|| +|[tag greenBackground]#NEW FEATURE# | +++
Render embedded objects in queue
+++ + +The SDK now supports rendering embedded objects in a queue. If you have multiple embedded objects, you can enable the `queueMultiRenders` parameter to queue your embedded objects and render them one after another. This feature helps in decreasing the load on the web browsers and improving your application loading experience. By default, this attribute is set to `false`. + +|[tag greenBackground]#NEW FEATURE# a|+++
Liveboard embed
+++ + +The `pinboardEmbed` package includes the `defaultHeight` attribute that sets a minimum height for embedded objects on a pinboard page, and the corresponding visualization pages that a user can navigate to. + +For more information, see xref:embed-search.adoc[Embed a pinboard]. + +|[tag greenBackground]#NEW FEATURE# a|+++
Embed events
+++ + +The SDK EmbedEvent library includes the following new events: + +* `VizPointDoubleClick` +* `Drilldown` +* `SetVisibleVizs` + +For more information, see xref:event-embedEvents.adoc[Events reference]. + +|==== + +== Version 1.4.0, September 2021 + +[width="100%" cols="1,4"] +|==== +|| +|[tag greenBackground]#NEW FEATURE# a|+++
+++Prefetch API+++
+++ + +The `prefetch` API fetches static resources from a given URL before your application loads. Web browsers can then cache the prefetched resources locally and serve them from a user's local disk. You can use this API to load the embedded objects faster and improve your application response time. + +For more information, see xref:prefetch-and-cache.adoc[Prefetch static resources]. + +|[tag greenBackground]#NEW FEATURE# a|+++
+++In-app page navigation+++
+++ + +The `navigateToPage` method in the SDK lets you provide quick and direct access to a specific pinboard, saved Answer, or an application page. You can add a custom menu action or button in your application UI that calls the `navigateToPage` method and leads your users to the page specified in the `path` parameter. + +For more information, see xref:page-navigation.adoc[Add a custom action for in-app navigation]. + +|[tag greenBackground]#NEW FEATURE# a|+++
+++Full application embedding+++
+++ + +The `appEmbed` SDK package includes the following new attributes: + +* The `disableProfileAndHelp` attribute to show or hide the `Help (?)` and the user profile menu in the navigation bar of your embedded app. + +* The `hideObjects` attribute to hide specific objects from a user's page view. + +For more information, see xref:full-embed.adoc[Embed full application]. + +|[tag greenBackground]#NEW FEATURE# |+++
+++Search embed +++
+++ + +The `searchEmbed` package includes the `forceTable` attribute that sets tabular view as the default format for presenting search data. You can set this attribute to `true` to force search results to appear in the table view. + +For more information, see xref:embed-search.adoc[Embed ThoughtSpot search]. + +|[tag redBackground]#REMOVED# | + +The `searchQuery` parameter is no longer supported and is removed from the `searchEmbed` SDK package. +|[tag greenBackground]#NEW FEATURE# a|+++
+++Embed events +++
+++ +The SDK EmbedEvent library includes the following events: + +* `QueryChanged` +* `AuthExpire` + +For more information, see xref:embed-events.adoc[Events and app integration]. +|==== + +== Version 1.3.0, August 2021 + +[width="100%" cols="1,4"] +|==== +|| +|[tag greenBackground]#NEW FEATURE# a| +++
searchOptions
+++ + +The `searchEmbed` SDK package introduces the `searchOptions` parameter for setting search tokens. The `searchOptions` parameter includes the following attributes: + +* `searchTokenString` ++ +A TML query string to define search tokens. + +* `executeSearch` ++ +When set to `true`, it executes search and shows the search results. + +For more information, see xref:embed-search.adoc#search-query[Embed ThoughtSpot search]. + +|[tag redBackground]#DEPRECATED# a| +++
searchQuery
+++ + +The `searchQuery` parameter in the `searchEmbed` SDK package is deprecated in the Visual Embed SDK version 1.3.1. Instead, you can use the `searchOptions` parameter to define the search token string. + +For more information about `searchOptions`, see xref:embed-search.adoc#search-query[Embed ThoughtSpot search]. + +|[tag greenBackground]#NEW FEATURE# a| +++
autoLogin
+++ + +The SDK now supports logging in users automatically after a user session has expired. + +For more information, see xref:embed-authentication.adoc#embed-session-sec[Embed user authentication]. + +|[tag greenBackground]#NEW FEATURE# a| +++
shouldEncodeUrlQueryParams
+++ + +You can now convert query parameters in the ThoughtSpot generated URLs to base64-encoded format. You can enable this attribute to secure your cluster from cross-site scripting attacks. +|[tag redBackground]#BREAKING CHANGE# a| +++
Data structure changes in custom action response payloads
+++ + +* The data structure passed in the custom action response for search now shows as `payload.data.embedAnswerData` instead of `payload.data.columnsAndData`. + +* The Answer payload for custom actions includes the following metadata: + +** `reportBookmetadata` ++ +Includes visualization metadata attributes such as description, object header metadata, author details, timestamp of the Answer creation, and modification. + +** user data ++ +Includes user information such as username, GUID of the user, and email address. + +To view a sample response payload, see xref:callback-response-payload.adoc#search-data-payload[Custom action response payload]. + +|[tag greenBackground]#NEW FEATURE# a| +++
preventPinboardFilterRemoval
+++ + +The `pinboardEmbed` SDK package now includes the `preventPinboardFilterRemoval` attribute. You can use this attribute to disable the filter removal action and thus prevent users from removing the filter chips added on a pinboard page. + +For more information, see xref:embed-pinboard.adoc[Embed a pinboard] and xref:embed-a-viz.adoc[Embed a visualization]. +|[tag greenBackground]#NEW FEATURE# a| +++
suppressNoCookieAccessAlert
+++ + +You can now set custom alerts for `noCookieAccess` events. By default, the SDK triggers a `noCookieAccess` event and generates an alert when a user's browser blocks third-party cookies. The `suppressNoCookieAccessAlert` allows you to disable this alert. + +|[tag greenBackground]#NEW FEATURE# a| +++
Support for fetching callback custom action payload in batches
+++ + +The Visual Embed SDK now supports processing data in batches for callback custom action responses. +The callback custom action event in the SDK package supports defining `batchSize` and `offset` values to paginate the Answer payload and send the records in batches. + +For more information, see xref:push-data-to-external-app.adoc#large-dataset[Callback custom action workflow]. +|==== + +== Version 1.2.0, June 2021 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a|+++
SAML authentication
+++ + +The Visual Embed SDK packages now include the `noRedirect` attribute as an optional parameter for the SAMLRedirect SSO `AuthType`. If you want to display the SAML authentication workflow in a pop-up window, instead of refreshing the application web page to direct users to the SAML login page, you can set the `noRedirect` attribute to `true`. + +For more information, see the instructions for embedding xref:full-embed.adoc[ThoughtSpot pages], xref:embed-search.adoc[search], xref:embed-pinboard.adoc[pinboard], and xref:embed-a-viz.adoc[visualizations]. + +|[tag greenBackground]#NEW FEATURE# a|+++
Pinboard actions
+++ +The *More* menu image:./images/icon-more-10px.png[the more options menu] in the embedded Pinboard page now shows the following actions for pinboard and visualizations. + +Pinboard:: +* Save +* Make a copy +* Add filters +* Configure filters +* Present +* Download as PDF +* Pinboard info +* Manage schedules + + +[NOTE] +Users with edit permissions can view and access the *Save*, *Add filters*, *Configure filters*, and *Manage schedules* actions. +|[tag greenBackground]#NEW FEATURE# a|+++
Visualization actions
+++ + +Visualizations on a pinboard: + +* Pin +* Download +* Edit +* Present +* Download as CSV +* Download as XLSX +* Download as PDF + +[NOTE] +Users with edit permissions can view and access the *Edit* action. The *Download as CSV*, *Download as XLSX*, and *Download as PDF* actions are available for table visualizations. The *Download* action is available for chart visualizations. + +|==== + +== Version 1.1.0, May 2021 + +[width="100%" cols="1,4"] +|==== +|[tag greenBackground]#NEW FEATURE# a|+++
NoCookieAccess event
+++ + +When a user accesses the embedded application from a web browser that has third-party cookies disabled, the Visual Embed SDK emits the `NoCookieAccess` event to notify the developer. Cookies are disabled by default in Safari. Users can enable third-party cookies in Safari’s Preferences setting page or use another web browser. +To know how to enable this setting by default on Safari for a ThoughtSpot embedded instance, contact ThoughtSpot Support. +|==== \ No newline at end of file diff --git a/modules/ROOT/pages/api-user-management.adoc b/modules/ROOT/pages/api-user-management.adoc index 7e04fb1fc..2399ac229 100644 --- a/modules/ROOT/pages/api-user-management.adoc +++ b/modules/ROOT/pages/api-user-management.adoc @@ -16,7 +16,7 @@ While you can delete users, it is preferable to deactivate a user, which maintai When configuring xref:configure-saml.adoc[SAML SSO] in ThoughtSpot UI, you can select the *Automatically add SAML users to ThoughtSpot upon first authentication* option, which will use the values in the SAML assertion to create a user if they do not already exist on ThoughtSpot. ThoughtSpot can also add users to groups sent within the SAML assertion. To enable and configure the SAML group attributes, contact your ThoughtSpot team. -By default, ThoughtSpot sends e-mail messages to a new user and enables onboarding workflows when they log in for the first time, even when you are embedding ThoughtSpot content. To alter this behavior at a system-wide level, you need to xref:customize-email-settings.adoc[Customize the onboarding settings]. +By default, ThoughtSpot sends e-mail messages to a new user and enables onboarding workflows when they log in for the first time, even when you are embedding ThoughtSpot content. To alter this behavior at a system-wide level, you need to xref:customize-email-settings.adoc[Customize the onboarding settings]. The user update API also allows setting onboarding experience values for an individual user. If you need to modify the default behavior beyond the available UI options, contact your ThoughtSpot team. [NOTE] @@ -108,9 +108,9 @@ image::./images/unsuspend.png[Unsuspended state] === User migration to IAMv2 -ThoughtSpot is gradually migrating its user to link:https://docs.thoughtspot.com/cloud/latest/okta-iam[Identity and Access Management v2 (IAMv2), window=_blank] to provide a more secure login and authentication experience through internal authentication with Okta. The following are some of the important points to note with this upgrade: +ThoughtSpot is gradually migrating its users to link:https://docs.thoughtspot.com/cloud/latest/okta-iam[Identity and Access Management v2 (IAMv2), window=_blank] to provide a more secure login and authentication experience through internal authentication with Okta. The following are some of the important points to note with this upgrade: -* The `email` attribute is mandatory when creating a user in ThoughtSpot Okta. ThoughtSpot recommends users to provide a valid email address during the user creation. +* The `email` attribute is mandatory when creating a user in ThoughtSpot Okta. ThoughtSpot recommends that users provide a valid email address during user creation. * You must set a password during user creation if you do not want to trigger an activation email. * The default value for `usertype` will be `OIDC_USER`. @@ -193,7 +193,7 @@ To remove a user from a group, use the update group REST v2 endpoint, or the fol * xref:group-api.adoc#delete-user-assoc[POST /tspublic/v1/group/{groupid}/user/{userid}] + removes a user from a specific group * xref:group-api.adoc#removeMembers[POST /tspublic/v1/group/removememberships] + -removes a list of users] from many groups at once. +removes a list of users from many groups at once. == Access control (sharing) Access to objects is determined by content *shared* directly to the user or the groups they belong to. It is easier to manage and audit sharing through groups rather than object sharing at the individual user level. @@ -217,7 +217,7 @@ ThoughtSpot also has a default group called `All`. When you create new users in ==== == Roles -If Role-Based Access Control (RBAC) is enabled on your instance, administrators can define role privileges and assign them to users via groups. Roles are always scoped to an Org, a role created in one Org cannot be assigned in another. +If Role-Based Access Control (RBAC) is enabled on your instance, administrators can define role privileges and assign them to users via groups. Roles are always scoped to an Org; a role created in one Org cannot be assigned in another. === Assign roles to groups via REST API When creating or updating a group using the REST API v2 endpoints, use the `role_identifiers` parameter to assign one or more roles to the group. The parameter accepts an array of role GUIDs or role names. For more information, see: @@ -227,7 +227,7 @@ When creating or updating a group using the REST API v2 endpoints, use the `role [NOTE] ==== -Roles must available before they can be assigned. Use the xref:roles-api.adoc[Roles API] to create roles programmatically before calling the group create or update endpoints. +Roles must be available before they can be assigned. Use the xref:roles-api.adoc[Roles API] to create roles programmatically before calling the group create or update endpoints. ==== For a complete list of available privileges and role categories, see xref:roles.adoc[Role-based access control]. \ No newline at end of file diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc index 00bc3d977..016ecf47f 100644 --- a/modules/ROOT/pages/common/nav-embedding.adoc +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -14,8 +14,9 @@ Embed ThoughtSpot in a web app ** link:{{navprefix}}/embed-spotter-agent[Embed Spotter Agent] * link:{{navprefix}}/embed-liveboard[Embed Analytics] ** link:{{navprefix}}/embed-liveboard[Embed a Liveboard] -** link:{{navprefix}}/embed-a-viz[Embed a visualization] +** link:{{navprefix}}/embed-liveboard[Embed a Liveboard] ** link:{{navprefix}}/spotterViz-agent[SpotterViz AI agent in Liveboards] +** link:{{navprefix}}/embed-a-viz[Embed a visualization] * link:{{navprefix}}/full-embed[Embed full application] ** link:{{navprefix}}/full-app-customize[Customize your embed] ** link:{{navprefix}}/customize-nav-controls[Customize navigation panels] @@ -42,6 +43,34 @@ Embed without SDK ** link:{{navprefix}}/embed-without-sdk[Embed without SDK] ** link:{{navprefix}}/custom-viz-rest-api[Create a custom visualization] + +[.sidebar-title] +Authentication and data security + +* link:{{navprefix}}/embed-auth[Authentication] +** link:{{navprefix}}/trusted-auth[Trusted authentication] +*** link:{{navprefix}}/trusted-auth-secret-key[Secret key management] +*** link:{{navprefix}}/trusted-auth-sdk[Front-end trusted authentication integration] +*** link:{{navprefix}}/trusted-auth-token-request-service[Token request service] +*** link:{{navprefix}}/trusted-auth-troubleshoot[Troubleshoot trusted authentication] +** link:{{navprefix}}/saml-sso[SAML SSO authentication] +** link:{{navprefix}}/oidc-auth[OpenID Connect authentication] +** link:{{navprefix}}/just-in-time-provisioning[Just-in-time provisioning] +* link:{{navprefix}}/security-settings[Security settings] + +* link:{{navprefix}}/embed-object-access[Authorization] +** link:{{navprefix}}/access-control-sharing[Access control and sharing] +** link:{{navprefix}}/privileges-and-roles[Privileges and Roles] +** link:{{navprefix}}/data-security[Data security] +*** link:{{navprefix}}/rls-rules[RLS Rules] +*** link:{{navprefix}}/abac-via-rls-variables[ABAC via RLS with variables] +*** link:{{navprefix}}/jwt-abac-migration-guide[ABAC JWT migration guide] +**** link:{{navprefix}}/jwt-filter-parameters-rules-migration-guide[JWT ABAC with filter rules -> ABAC via RLS] +**** link:{{navprefix}}/jwt-abac-beta-migration-guide[JWT ABAC beta implementation -> ABAC via RLS] +*** link:{{navprefix}}/abac-user-parameters[ABAC via JWT with filter rules and parameters] +* link:{{navprefix}}/selective-user-access[User access] +* link:{{navprefix}}/troubleshoot-errors[Troubleshoot errors] + [.sidebar-title] Customize and integrate @@ -90,32 +119,6 @@ Customize and integrate ** link:{{navprefix}}/prefetch[Prefetch static resources] * link:{{navprefix}}/troubleshoot-errors[Troubleshoot errors] -[.sidebar-title] -Authentication and data security - -* link:{{navprefix}}/embed-auth[Authentication] -** link:{{navprefix}}/trusted-auth[Trusted authentication] -*** link:{{navprefix}}/trusted-auth-secret-key[Secret key management] -*** link:{{navprefix}}/trusted-auth-sdk[Front-end trusted authentication integration] -*** link:{{navprefix}}/trusted-auth-token-request-service[Token request service] -*** link:{{navprefix}}/trusted-auth-troubleshoot[Troubleshoot trusted authentication] -** link:{{navprefix}}/saml-sso[SAML SSO authentication] -** link:{{navprefix}}/oidc-auth[OpenID Connect authentication] -** link:{{navprefix}}/just-in-time-provisioning[Just-in-time provisioning] -* link:{{navprefix}}/security-settings[Security settings] - -* link:{{navprefix}}/embed-object-access[Authorization] -** link:{{navprefix}}/access-control-sharing[Access control and sharing] -** link:{{navprefix}}/privileges-and-roles[Privileges and Roles] -** link:{{navprefix}}/data-security[Data security] -*** link:{{navprefix}}/rls-rules[RLS Rules] -*** link:{{navprefix}}/abac-via-rls-variables[ABAC via RLS with variables] -*** link:{{navprefix}}/jwt-abac-migration-guide[ABAC JWT migration guide] -**** link:{{navprefix}}/jwt-filter-parameters-rules-migration-guide[JWT ABAC with filter rules -> ABAC via RLS] -**** link:{{navprefix}}/jwt-abac-beta-migration-guide[JWT ABAC beta implementation -> ABAC via RLS] -*** link:{{navprefix}}/abac-user-parameters[ABAC via JWT with filter rules and parameters] -* link:{{navprefix}}/selective-user-access[User access] -* link:{{navprefix}}/troubleshoot-errors[Troubleshoot errors] [.sidebar-title] Embedding tutorials diff --git a/modules/ROOT/pages/customize-homepage-full-embed.adoc b/modules/ROOT/pages/customize-homepage-full-embed.adoc index 5fec19b72..70d9b1bbf 100644 --- a/modules/ROOT/pages/customize-homepage-full-embed.adoc +++ b/modules/ROOT/pages/customize-homepage-full-embed.adoc @@ -54,7 +54,7 @@ In both V2 and V3, the SDK allows customization to include or exclude modules, c [#_enable_focused_home_page] === V4 focused home page experience -The V4 focused home page (`HomePage.Focused`) provides a contemporary experience designed to highlight the most relevant content immediately. It provides quick access to the Spotter interface and consolidates the **Watchlist KPIs** and **Recents* sections into a unified, focused layout. +The V4 focused home page (`HomePage.Focused`) provides a contemporary experience designed to highlight the most relevant content immediately. It provides quick access to the Spotter interface and consolidates the **Watchlist KPIs** and **Recents** sections into a unified, focused layout. The following example shows how to enable the V4 focused home page experience: @@ -227,7 +227,7 @@ The following example shows the configuration properties for customizing the hom ---- import { AppEmbed, // Main class to embed the full ThoughtSpot app - PrimaryNavbarVersion // Enum for V3 experience setting + PrimaryNavbarVersion, // Enum for V3 experience setting HomePage, // Enum for home page experience settings HomepageModule // Enum for home page modules } from '@thoughtspot/visual-embed-sdk'; @@ -266,7 +266,7 @@ The following example shows the configuration properties for customizing the hom } from '@thoughtspot/visual-embed-sdk'; const embed = new AppEmbed("#embed", { // Enable V2 experience - modularHomeExperience: true + modularHomeExperience: true, // Hide modules from the home page hiddenHomepageModules: [ HomepageModule.Learning, @@ -304,7 +304,7 @@ To hide the search bar on the home page, you can also use the xref:customize-hom [NOTE] ==== -If your instance is using the Classic (v1) experience and if the `homePageSearchBarMode` parameter does not set the search context defined in the attribute, set `isUnifiedSearchExperienceEnabled` to `false`. +If your instance is using the Classic (v1) experience and if the `homePageSearchBarMode` parameter does not set the search context defined in the attribute, set `isUnifiedSearchExperienceEnabled` to `false`. ==== ==== Examples diff --git a/modules/ROOT/pages/customize-nav-full-embed.adoc b/modules/ROOT/pages/customize-nav-full-embed.adoc index 1f94621c3..cb4b45ceb 100644 --- a/modules/ROOT/pages/customize-nav-full-embed.adoc +++ b/modules/ROOT/pages/customize-nav-full-embed.adoc @@ -44,7 +44,7 @@ a| * Left navigation ** A sliding left navigation panel controlled via the hamburger icon ** Persona-based app selection icons in the panel header -** Left navigation menu that adjusts its contents according to the application context. +** Left navigation menu that adjusts its contents according to the application context |==== [NOTE] @@ -80,7 +80,7 @@ In the V3 experience, hides the app selection icons on the left navigation panel To show or hide the help and user profile icons in top navigation bar. | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported + -Also hides or shows *Help* menu on the left navigation panel of the home page. +Also hides or shows the *Help* menu on the left navigation panel of the home page. | [tag greenBackground tick]#✓# Supported + | `hideOrgSwitcher` + @@ -104,8 +104,8 @@ The object search bar is hidden by default. | `hideHamburger` + To show or hide the hamburger icon in the top navigation bar. -| __ Not applicable__ -| __ Not applicable__ +| __Not applicable__ +| __Not applicable__ | [tag greenBackground tick]#✓# Supported + Hides the hamburger icon available on pages where the left navigation panel is hidden by default. |==== @@ -150,62 +150,62 @@ If you want to include the left navigation, but hide only a specific section in | `HomeLeftNavItem.Create` + To show or hide the `+` icon that allows users to create a Liveboard or Answer in the *Insights* panel. -| __ Not applicable__ -| __ Not applicable__ +| __Not applicable__ +| __Not applicable__ | [tag greenBackground tick]#✓# Supported | `HomeLeftNavItem.Home` + To show or hide the *Home* menu in the *Insights* panel. -| __ Not applicable__ +| __Not applicable__ | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | `HomeLeftNavItem.Spotter` + To show or hide the *Spotter* menu item in the *Insights* panel. -| __ Not applicable__ -| __ Not applicable__ +| __Not applicable__ +| __Not applicable__ | [tag greenBackground tick]#✓# Supported | `HomeLeftNavItem.SearchData` + To show or hide the *Search Data* in the *Insights* panel. -| __ Not applicable__ +| __Not applicable__ | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | `HomeLeftNavItem.Liveboards` + To show or hide the *Liveboards* menu in the *Insights* panel. -| __ Not applicable__ +| __Not applicable__ | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | `HomeLeftNavItem.Answers` + To show or hide the *Answers* menu in the *Insights* panel. -| __ Not applicable__ +| __Not applicable__ | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | `HomeLeftNavItem.LiveboardSchedules` + -To show or hide the *LiveboardSchedules* menu in the *Insights* panel. -| __ Not applicable__ +To show or hide the *Liveboard Schedules* menu in the *Insights* panel. +| __Not applicable__ | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | `HomeLeftNavItem.MonitorSubscription` + To show or hide the *Monitor subscriptions* in the *Insights* panel. -| __ Not applicable__ +| __Not applicable__ | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | `HomeLeftNavItem.SpotIQAnalysis` + To show or hide the *SpotIQ analyses* in the *Insights* panel. -| __ Not applicable__ +| __Not applicable__ | [tag greenBackground tick]#✓# Supported | [tag greenBackground tick]#✓# Supported | `HomeLeftNavItem.Favorites` + To show or hide the `Favorites` section in the *Insights* panel. -| __ Not applicable__ -| __ Not applicable__ +| __Not applicable__ +| __Not applicable__ | [tag greenBackground tick]#✓# Supported |=== diff --git a/modules/ROOT/pages/deprecated-features.adoc b/modules/ROOT/pages/deprecated-features.adoc index 480e99dc8..048a7b72c 100644 --- a/modules/ROOT/pages/deprecated-features.adoc +++ b/modules/ROOT/pages/deprecated-features.adoc @@ -14,6 +14,8 @@ As ThoughtSpot applications evolve, some existing features will be deprecated an [options='header'] |===== |Feature|Impacted interface and release versions|Deprecation date |End of Support / removal from the product +a|xref:deprecated-features.adoc#liveboardDiscoverable[Make this Liveboard discoverable checkbox] +a|ThoughtSpot Cloud 26.2.0.cl and later | February 2026 | August 2026 a|xref:deprecated-features.adoc#everynmins[Minute-level schedule frequency] |ThoughtSpot Cloud 26.8.0.cl and later | August 2026 | - a|xref:deprecated-features.adoc#hostEventv1[HostEvent v1 framework] @@ -89,9 +91,19 @@ a|xref:deprecated-features.adoc#_deprecated_parameter_in_rest_api_v2_0_authentic |||| |===== +[#liveboardDiscoverable] +== Make this Liveboard discoverable checkbox +The *Make this Liveboard discoverable* checkbox that appears in the Liveboard and Answer create, save, and share object UI workflows is deprecated and will be removed in ThoughtSpot Cloud 26.8.0.cl. + +Impact on your instance:: +When this feature is removed from the UI, your application users will no longer be able to find the objects that are marked as discoverable in the object search results. Object visibility and discoverability will be determined solely by explicit view, edit, or other owner-granted permissions. + +Recommended action:: +Before your instance is upgraded to ThoughtSpot Cloud 26.8.0.cl, identify Liveboards and Answers that are currently set as discoverable and share them with the relevant users or groups. + [#everynmins] == Minute-level schedule frequency -The `POST /api/rest/2.0/schedules/create` and `POST /api/rest/2.0/schedules/{schedule_identifier}/update` API endpoint no longer accept `minute` as a valid `frequency` value for schedule intervals. +The `POST /api/rest/2.0/schedules/create` and `POST /api/rest/2.0/schedules/{schedule_identifier}/update` API endpoints no longer accept `minute` as a valid `frequency` value for schedule intervals. Impact on your instance:: Starting ThoughtSpot 26.8.0.cl, all existing Liveboard schedules set to `minute` as the frequency will be automatically changed to an hourly frequency. @@ -135,7 +147,7 @@ Impact on your instance:: * For new users, API calls to the `POST /api/rest/2.0/report/liveboard` endpoint for PNG exports with `include_cover_page` and `include_filter_page` will result in an error. Use the new PNG export options. //If you still have to use these options for your ThoughtSpot instance contact ThoughtSpot support to revert to these legacy settings. -For more information on PNG export, see xref:data-report-v2-api.adoc#_liveboard_report_api[Liveboard Report API] +For more information on PNG export, see xref:data-report-v2-api.adoc#_liveboard_report_api[Liveboard Report API]. Recommended action:: * We recommend transitioning to the new flow for PNG exports, as the `include_cover_page` and `include_filter_page` attributes will be removed in a future release. @@ -199,7 +211,7 @@ Starting with 10.4.0.cl, Worksheets are deprecated and disabled by default in Th Impact on your instance:: -All existing Worksheets on your instance will be migrated automatically to Models, and Worksheets will no longer be available in the ThoughtSpot UI after the 10.12.0.cl release. Note that even adding a dbt connection will result in the creation of a Model. However, if you are using Worksheets in Git workflows or CI/CD pipelines that rely on import or create, those will continue to work temporarily until 10.13.0.cl. +All existing Worksheets on your instance will be migrated automatically to Models, and Worksheets will no longer be available in the ThoughtSpot UI after the 10.12.0.cl release. Note that even adding a dbt connection will result in the creation of a Model. However, if you are using Worksheets in Git workflows or CI/CD pipelines that rely on import or create operations, those will continue to work temporarily until 10.13.0.cl. + Starting with 10.13.0.cl, import of worksheet TMLs will be blocked. Any such operations will fail with an error, requiring users to convert Worksheets to Models before importing. You may want to update your CI/CD and Git workflows to use Model TMLs instead of Worksheets. @@ -315,7 +327,7 @@ Note that this change will not impact full application embedding if your host ap == Application background customization via UI -The application background customization option that is currently available on the **Admin** > **Style customization** and **Develop** > **Customizations** > **Styles** will be deprecated in the upcoming version. +The application background customization option that is currently available on the **Admin** > **Style customization** and **Develop** > **Customizations** > **Styles** page will be deprecated in the upcoming version. Effective from:: * ThoughtSpot Cloud 10.3.0.cl @@ -365,7 +377,7 @@ For more information, see xref:abac-user-parameters.adoc[ABAC via token ^Beta^]. == Deprecated parameters in Version Control APIs -The `default_branch_name` and `guid_mapping_branch_name` parameters available with the `/api/rest/2.0/vcs/git/config/create` and `/api/rest/2.0/vcs/git/config/update` endpoints are deprecated. +The `default_branch_name` and `guid_mapping_branch_name` parameters available with the `/api/rest/2.0/vcs/git/config/create` and `/api/rest/2.0/vcs/git/config/update` endpoints are deprecated. Effective from:: * ThoughtSpot Cloud 9.10.5.cl diff --git a/modules/ROOT/pages/developer-playground.adoc b/modules/ROOT/pages/developer-playground.adoc index 3394c7bd4..ae6544fd9 100644 --- a/modules/ROOT/pages/developer-playground.adoc +++ b/modules/ROOT/pages/developer-playground.adoc @@ -54,7 +54,7 @@ a|**Add search tokens** + Allows passing search tokens as a query string and executing search. -The following example shows how to create a search a `searchTokenString` and execute search: +The following example shows how to create a `searchTokenString` and execute search: [source, Javascript] ---- @@ -102,7 +102,7 @@ Allows you to view the code for a custom action event. If the embedded instance a|**Use Host Event** -Allows registering a host event. The registered event triggers an action in the embedded on clicking **Try Event**. +Allows registering a host event. The registered event triggers an action in the embedded view when **Try Event** is clicked. ++++
Try it out @@ -178,7 +178,7 @@ Allows you to view the code for a custom action event. If the embedded instance a|**Use Host Event** -Allows registering a host event. The registered event triggers an action in the embedded on clicking **Try Event**. +Allows registering a host event. The registered event triggers an action in the embedded view when **Try Event** is clicked. a|**Apply custom styles** @@ -228,7 +228,7 @@ Allows you to view the code for a custom action event. If the embedded instance a|**Use Host Event** -Allows registering a host event. The registered event triggers an action in the embedded on clicking **Try Event**. +Allows registering a host event. The registered event triggers an action in the embedded view when **Try Event** is clicked. a|**Apply custom styles** @@ -270,7 +270,7 @@ Allows you to view the code for a custom action event. If the embedded instance a|**Use Host Event** -Allows registering a host event. The registered event triggers an action in the embedded on clicking **Try Event**. +Allows registering a host event. The registered event triggers an action in the embedded view when **Try Event** is clicked. ++++ Try it out @@ -328,7 +328,7 @@ include::{path}/set-runtime-overrides.adoc[] Try it out ++++ -a|**Modify available actions ** +a|**Modify available actions** include::{path}/modify-available-actions.adoc[] @@ -342,7 +342,7 @@ Allows you to view the code for a custom action event. If the embedded instance a|**Use Host Event** + -Allows registering a host event. The registered event triggers an action in the embedded on clicking **Try Event**. +Allows registering a host event. The registered event triggers an action in the embedded view when **Try Event** is clicked. ++++ Try it out @@ -415,7 +415,7 @@ Allows you to view the code for a custom action event. If the embedded instance ++++ a|**Use Host Event** + -Allows registering a host event. The registered event triggers an action in the embedded on clicking **Try Event**. +Allows registering a host event. The registered event triggers an action in the embedded view when **Try Event** is clicked. ++++ Try it out @@ -431,6 +431,79 @@ For more information about CSS variables, styles, and customizations options, se ++++ |==== +[#spottercode-panel] +== SpotterCode panel +If SpotterCode Agent for Visual Embed Playground is enabled on your instance, the Playground page displays the SpotterCode slideout panel on the right side of the Playground area. SpotterCode Agent is an AI-powered coding assistant built into the Visual SDK Playground to help developers build embedding code rapidly and iterate on embed configurations without writing boilerplate code manually. + +To open SpotterCode in the Playground: + +. Go to *Develop* > *Playground* > *Visual embed*. +. Select the component you want to embed. +. Click *SpotterCode* on the right side of the Playground to open the panel. ++ +The SpotterCode panel opens on the right. The header shows *SpotterCode* on the left and a collapse/expand control on the right. + +=== Quick starter prompts +The SpotterCode panel displays a set of quick starter prompts for each embed component by default. + +[cols="1,3", options="header"] +|==== +| Embed component | Quick-starter prompts +| *Search Data* +a| +* Embed a search view with runtime filters +* Display search results in a structured table with sorting enabled +* Keep the data panel collapsed for a cleaner search view + +| *Liveboard* +a| +* Embed this Liveboard with default filters +* Add a custom action to send Liveboard data to Slack +* Apply runtime filters to this Liveboard + +| *Visualization* +a| +* Embed a single visualization from this Liveboard +* Add a custom action to send this chart data to Slack +* Apply runtime filters to this visualization + +| *Full App* +a| +* Embed full app with navigation enabled +* Enable Spotter in the embedded app +* Change the "Edit" label to "Modify" + +| *Spotter* +a| +* Embed Spotter as an AI assistant in my app +* Configure Spotter to open in a side panel +* Add a button to launch Spotter in the UI +|==== + +When a user clicks a quick-starter prompt, a query is sent to SpotterCode. + +=== Response generation +The chat interface includes the following options: + +* To get precise results: +** Be specific about the component, configuration, and desired behavior. +** Use one prompt per change. Break complex requests into smaller sequential steps. For prompt writing tips and examples, see xref:spottercode-prompt-guide.adoc[SpotterCode prompting guide]. +* To edit a request, click the edit icon to modify your prompt and resend it. +* To clear a chat and reset the conversation context, click *Reset chat*. +* To cancel a request or stop code generation, click the pause button in the chat prompt. + +When SpotterCode processes your prompt, it: + +. generates the embed code for your request. +. updates the code editor panel on the left with the generated code. +. scrolls automatically to show new content in the chat panel. + +After SpotterCode updates the code editor: + +. Review the generated code in the left panel. If SpotterCode detects a conflict between the generated code and the existing code in the editor, it does not update the editor. Ensure that you review the current code in the editor, clear conflicting sections, and try your prompt again. +. Click *Run* to execute the code and preview the embedded component in the preview panel. +. Iterate by entering a follow-up prompt or editing the code directly. + == Additional resources For more information about the configuration settings and parameters, see the following pages: diff --git a/modules/ROOT/pages/embed-pinboard.adoc b/modules/ROOT/pages/embed-pinboard.adoc index 79715ec88..17031b39c 100644 --- a/modules/ROOT/pages/embed-pinboard.adoc +++ b/modules/ROOT/pages/embed-pinboard.adoc @@ -103,7 +103,7 @@ image::./images/embed-lb.png[Liveboard embed] [#common-customizations] == Common customization options -The *xref:LiveboardViewConfig.adoc[LiveboardViewConfig]* object includes several properties and attributes that allow fine-grained control of the embedded experience. You can specify settings that enable or disable a specific feature, control visible or disabled menu elements and actions, set tabs and layout preferences, manage filters, hide header, and more. +The *xref:LiveboardViewConfig.adoc[LiveboardViewConfig]* object includes several properties and attributes that allow fine-grained control of the embedded experience. You can specify settings that enable or disable a specific feature, control visible or disabled menu elements and actions, set tabs and layout preferences, manage filters, hide the header, and more. === Show/hide large UI elements Parameters such as `hideLiveboardHeader`, `hideTabPanel`, `isLiveboardHeaderSticky`, `showLiveboardTitle`, and `showLiveboardDescription` control various aspects of the standard embedded Liveboard experience. Note the phrasing of the property name and the description in the documentation to understand whether `true` enables or disables the particular feature. @@ -170,49 +170,47 @@ You can add a link:https://docs.thoughtspot.com/cloud/latest/liveboard-notes[Liv * If you are adding links and images from an external site, or embedding multimedia or a web page in an iFrame, make sure the URLs are added to CORS and CSP allowlists. For more information, see xref:security-settings.adoc[Security settings]. === Redefine Liveboard breakpoint widths -When enabled, the `enable2ColumnLayout` allows customizing the Liveboard breakpoint width for embedded users. +When enabled, the `enable2ColumnLayout` allows you to customize the Liveboard breakpoint width for embedded users. The current 12 column layout changes to 2 columns per row at 1024px, and to 1 column per row layout at 630px in the new Liveboard experience. Once enabled, these breakpoints apply to all Liveboards in the ThoughtSpot instance, and cannot be set only for individual Liveboards. -These breakpoint widths are customisable for the embedded customers. Contact ThoughtSpot support for assistance with customisation. +These breakpoint widths are customizable for the embedded customers. Contact ThoughtSpot support for assistance with customization. +[#liveboard-data-cache] +=== Liveboard browser cache and refresh +To improve load performance for users who revisit the same Liveboard within a session, set `enableLiveboardDataCache` to `true`, so the embedded Liveboard caches visualization data in the browser. -//// -[#lbv2] -== Liveboard experience -Starting from 10.1.0.cl, the link:https://docs.thoughtspot.com/cloud/latest/deprecation#_removed_in_10_1_0_cl[classic experience for liveboards has been deprecated]. - -The new Liveboard experience provides an improved interface with several new features and enhancements. The following figure shows the menu actions available on a Liveboard page in the new experience: - -[.bordered] -[.widthAuto] -image:./images/liveboard-exp.png[Liveboard experience comparison] - - -=== Features in New Experience mode - -* Liveboard edit + -To edit a Liveboard in the new experience mode, click the *Edit* button on the Liveboard page. For example, to delete a visualization on a Liveboard, the user must click *Edit*, and then navigate to the *Delete* option on a visualization. +[source,javascript] +---- +const liveboardEmbed = new LiveboardEmbed('#embed-container', { + frameParams: { + width: '100%', + height: '100%', + }, + liveboardId: '', // + enableLiveboardDataCache: true, // +}); +---- -* Filter application in the new experience mode + -To apply filters, the application users must switch to the edit mode. Only users with edit access to the Liveboard can apply filters. When a user creates a copy of a Liveboard, the filters applied on its visualizations are also copied. For more information about Liveboard filters, see link:https://docs.thoughtspot.com/cloud/latest/liveboard-filters[Liveboard filter configuration options, window=_blank]. -* Actions + -The following actions are deprecated in the new experience mode: -** The *Copy embed link* and *Copy link* menu actions in the More image:./images/icon-more-10px.png[the more options menu] menu of a Liveboard -** The edit title icon on visualization tiles -** The *Share* button on visualizations +When browser cache is enabled, the *Refresh* button appears in the Liveboard header. Users can click this button to clear the browser cache and fetch fresh data from the data warehouse on demand. +The Visual Embed SDK provides the following action and event IDs to customize the cache refresh visibility and workflow. -=== Liveboard tabs +[width="100%",cols="2,1,4"] +|==== +|API | Description -Liveboard tabs allow you to logically group visualization into specific categories and allow users to access them easily. +|`Action.RefreshLiveboardBrowserCache` +|xref:Action.adoc#_refreshliveboardbrowsercache[Action] +|Action ID to show, hide, or disable the *Refresh* button in the Liveboard header. -To create, edit, or move visualizations to a tab, you require edit access to a Liveboard. +|`EmbedEvent.RefreshLiveboardBrowserCache` +|xref:EmbedEvent.adoc#_refreshliveboardbrowsercache[EmbedEvent] +|Emitted when a user clicks the *Refresh* button in the Liveboard header. -* To add a tab, click *Edit* and then click *Add tab* on the Liveboard page. -* To add a visualization to a tab on a Liveboard, click *Move to tab* from the More image:./images/icon-more-10px.png[the more options menu] menu. -+ -You can also pin a visualization to a Liveboard tab using the **Pin** action on the Answer page. -//// +|`HostEvent.RefreshLiveboardBrowserCache` +|xref:HostEvent.adoc#_refreshliveboardbrowsercache[HostEvent] +|Triggers a browser cache refresh programmatically for all visualization containers on the embedded Liveboard. +|==== === Customize filters @@ -255,18 +253,18 @@ Use the following host events in the Visual Embed SDK to update filters: For more information and examples, see xref:filters_overview.adoc[Filter types and application layers]. -== Liveboard download options +=== Liveboard download options Embedding application users can download Liveboards in the PDF, XLSX, and CSV formats. If the `isContinuousLiveboardPDFEnabled` is set to `true`, users can download the PDF with a continuous layout as seen in the UI, with each tab on a single page. When this parameter is set to `false`, users can download the Liveboard PDF in the A4 format with a paginated view. [NOTE] ==== -Starting with the 26.5.0.cl and Visual Embed SDK version 1.48.x, the new multi-format download experience is available on embedded Liveboards and can be enabled using the `isContinuousLiveboardPDFEnabled` and `isLiveboardXLSXCSVDownloadEnabled` parameters. The `Download` action in the Liveboard's more options menu is controlled by `Action.DownloadLiveboard` instead of `Action.Download` and `Action.DownloadAsPdf`. `Action.DownloadAsPdf` remains valid for controlling PDF download on individual visualizations (chart and table tiles) within a Liveboard. +Starting with ThoughtSpot Cloud version 26.5.0.cl and Visual Embed SDK version 1.48.x, the new multi-format download experience is available on embedded Liveboards and can be enabled using the `isContinuousLiveboardPDFEnabled` and `isLiveboardXLSXCSVDownloadEnabled` parameters. The `Download` action in the Liveboard's more options menu is controlled by `Action.DownloadLiveboard` instead of `Action.Download` and `Action.DownloadAsPdf`. `Action.DownloadAsPdf` remains valid for controlling PDF download on individual visualizations (chart and table tiles) within a Liveboard. ==== -=== XLSX and CSV in Liveboard scheduled exports -To enable Liveboard scheduled exports in XLSX and CSV format from the embed view, ensure that `isGranularXLSXCSVSchedulesEnabled` to `true`. +==== XLSX and CSV in Liveboard scheduled exports +To enable Liveboard scheduled exports in XLSX and CSV format from the embed view, ensure that `isGranularXLSXCSVSchedulesEnabled` is set to `true`. [source,javascript] ---- @@ -276,7 +274,7 @@ const embed = new LiveboardEmbed('#tsEmbed', { }); ---- -=== Download actions and behavior +==== Download actions and behavior [width=100%, cols="2,2,4"] [options='header'] @@ -307,7 +305,7 @@ a|`Action.DownloadLiveboardAsCsv` - action ID to show, hide, or disable the CSV a| Use `Action.CoverAndFilterOptionInPDF` to hide the checkboxes for including or excluding cover and filter pages in the Liveboard PDF download dialog. |===== -=== Example +==== Example The following example enables the **PDF (Continuous)**, **XLSX**, and **CSV** options in the Liveboard **Download** modal. @@ -349,12 +347,12 @@ const embed = new LiveboardEmbed('#tsEmbed', { Action.DownloadLiveboard,// Disables the Download parent action in the more options menu Action.DownloadLiveboardAsContinuousPDF, // Disables the Continuous PDF download option in the Download modal Action.DownloadLiveboardAsCsv, // Disables the CSV download option in the Download modal - Action.DownloadLiveboardAsXlsx, // Disables the XLSX download option in the Download modal) + Action.DownloadLiveboardAsXlsx, // Disables the XLSX download option in the Download modal ], }); ---- -=== HostEvent workflow for the download actions +==== HostEvent workflow for the download actions Use the HostEvent IDs to trigger download actions on an embedded Liveboard. * `HostEvent.DownloadLiveboardAsContinuousPDF` + @@ -366,102 +364,6 @@ To open the **Download** modal with the XLSX option selected when the `isLiveboa * `HostEvent.DownloadAsCsv` + To open the **Download** modal with the CSV option selected when `isLiveboardXLSXCSVDownloadEnabled` parameter is enabled in the embed view. - -//// -==== Customize filter visibility in Liveboard tabs -Filters and parameters that are not relevant to the visualizations in a tab can be hidden by default on an embedded Liveboard. This feature is disabled by default on ThoughtSpot embedded instances. To enable this feature, set `hideIrrelevantChipsInLiveboardTabs` to `true`. - -[NOTE] -==== -This feature is supported only if compact header is enabled on your Liveboard. To enable compact header, use the `isLiveboardCompactHeaderEnabled` attribute. -==== - -[source,JavaScript] ----- -const liveboardEmbed = new LiveboardEmbed(document.getElementById('ts-embed'), { - frameParams: { - width: '100%', - height: '100%', - }, - liveboardId: '<%=liveboardGUID%>', // Replace it with your Liveboard ID - isLiveboardCompactHeaderEnabled: true, - hideIrrelevantChipsInLiveboardTabs: true, - // ... other embed view configuration settings -}); ----- - -//// - - -//// - -| `EXACT_DATE_TIME` |Specify the date and time in epoch or the regular date and time format. For example, 2023/07/31 22:50:05. a|[source,JavaScript] ----- -liveboardEmbed.trigger(HostEvent.UpdateFilters, { - filter: { - column: "date", - oper: "EQ", - values: ["2023/07/31 22:50:05"], - type: "EXACT_DATE_TIME" - } - }); ----- - -|`EXACT_TIME` |Specify the time value in epoch or `hh:mm:ss` format. -a|[source,JavaScript] ----- -liveboardEmbed.trigger(HostEvent.UpdateFilters, { - filter: { - column: "date", - oper: "EQ", - values: ["22:50:05"], - type: "EXACT_TIME" - } - }); ----- - -|`MONTH_ONLY` |Specify the month. For example, July. -a|[source,JavaScript] ----- -liveboardEmbed.trigger(HostEvent.UpdateFilters, { - filter: { - column: "date", - oper: "EQ", - values: ["July"], - type: "MONTH_ONLY" - } - }); ----- -|`LAST_PERIOD` |Specify the time period. For example, Last week. You must also include the `datePeriod` attribute based on the time period specified in the filter object. Valid values for `datePeriod` are `DAY`, WEEK`, `MONTH`, QUARTER, and YEAR. - -a|[source,JavaScript] ----- -liveboardEmbed.trigger(HostEvent.UpdateFilters, { - filter: { - column: "date", - oper: "EQ", - values: [""], - datePeriod: "DAY", - type: "LAST_PERIOD" - } - }); ----- - -|`NEXT_PERIOD` |Specify the time period. For example, next week. You must also include the `datePeriod` attribute based on the time period specified in the filter object. Valid values for `datePeriod` are `DAY`, WEEK`, `MONTH`, QUARTER, and YEAR. -a|[source,JavaScript] ----- -liveboardEmbed.trigger(HostEvent.UpdateFilters, { - filter: { - column: "date", - oper: "EQ", - values: [""], - datePeriod: "DAY", - type: "LAST_PERIOD" - } - }); - -//// - === Liveboard grouping and styling [earlyAccess eaBackground]#Early Access# You can now create a visual group of Answers and note tiles together in the Liveboard. You can select multiple Answers and notes in the Liveboard editor. You can also style parts of the Liveboard, groups and Answers with the new styling panel. To enable this feature, set `isLiveboardMasterpiecesEnabled` to `true`. @@ -481,13 +383,7 @@ To embed a Liveboard that uses Groups, you must set `isLiveboardMasterpiecesEnab For more information, see link:https://docs.thoughtspot.com/cloud/latest/liveboard-grouping-styling[Liveboard grouping and styling, window=_blank]. -To understand about the CSS variables for this feature, see xref:customize-css-styles.adoc#grp-style[CSS variables reference]. - -=== Liveboard comments - -ThoughtSpot does not support adding comments, replying, or subscribing to comment threads on embedded Liveboards. - -//if the Liveboard is embedded in another application, the comment icon will not be visible to the embedded application users regardless of their access privileges. +For information about the CSS variables for this feature, see xref:customize-css-styles.adoc#grp-style[CSS variables reference]. == Additional resources * For information about runtime overrides, see xref:runtime-filters.adoc[Runtime filters] and xref:runtime-parameters.adoc[Runtime Parameter overrides]. diff --git a/modules/ROOT/pages/embed-spotter.adoc b/modules/ROOT/pages/embed-spotter.adoc index 03f7bf56c..eaaf2b1a0 100644 --- a/modules/ROOT/pages/embed-spotter.adoc +++ b/modules/ROOT/pages/embed-spotter.adoc @@ -163,7 +163,7 @@ spotterEmbed.render(); * Verify whether the customization settings are applied. [#configControls] -== Customizing embedded Spotter interface +== Customizing the embedded Spotter interface When you embed Spotter, you'll notice that the embedded component loads an initial page with a prompt interface. The look and feel of this page vary depending on the Spotter version used for embedding. === Spotter Classic and Spotter 2 experiences @@ -217,7 +217,7 @@ image::./images/spotter3-new-interface.png[Spotter 3 new interface] You can also include the *Chat history* panel to allow your users to access the chat history from their previous sessions. -To enable chat history features, set the `enablePastConversationsSidebar` attributes to `true`. Additionally, you can also customize the appearance and contents of the chat history panel using the configuration parameters available in the xref:SpotterSidebarViewConfig.adoc[`SpotterSidebarViewConfig`] interface and the xref:SpotterEmbedViewConfig.adoc#_spottersidebarconfig[spotterSidebarConfig] object. +To enable chat history features, set the `enablePastConversationsSidebar` attribute to `true`. Additionally, you can customize the appearance and contents of the chat history panel using the configuration parameters available in the xref:SpotterSidebarViewConfig.adoc[`SpotterSidebarViewConfig`] interface and the xref:SpotterEmbedViewConfig.adoc#_spottersidebarconfig[spotterSidebarConfig] object. [source,JavaScript] ---- @@ -282,7 +282,7 @@ If the new prompt interface in Spotter 3 is enabled, the Spotter page displays t The MCP connector module and the '+' icon are displayed by default if the new prompt interface is enabled in your embed. However, we do not recommend using this feature in your production environments. ==== -Currently, the Visual Embed SDK does not provide any attributes or action IDs to hide these elements. As a workaround, you can use the CSS selectors to hide these elements: +Currently, the Visual Embed SDK does not provide any attributes or action IDs to hide these elements. As a workaround, you can use CSS selectors to hide these elements: [source,JavaScript] ---- @@ -385,7 +385,7 @@ The following figures show the customized Spotter icon: [.bordered] image::./images/spotter-icon-customization.png[Spotter icon customization] -=== Hiding the Spotter icon and ThoughtSpot branding chat interface +=== Hiding the Spotter icon and ThoughtSpot branding from the chat interface To hide the Spotter logo and branding in the chat interface, use the following parameters in the `SpotterChatViewConfig` interface: * `hideToolResponseCardBranding` + @@ -413,71 +413,23 @@ spotterChatConfig: { ---- [#fileUpload] -=== Enable file upload in Spotter chat +=== Allowing file uploads in Spotter chats +To enable file uploads in the Spotter chat panel: -// SOURCE: https://github.com/thoughtspot/developer-docs/blob/main/modules/ROOT/pages/api-changelog.adoc (SDK v1.49.x — Spotter file upload) -// Available from: Visual Embed SDK v1.49.0, ThoughtSpot Cloud 26.7.0.cl -// TODO: verify minimum ThoughtSpot Cloud version with engineering - -The SDK introduces configuration parameters in `SpotterChatViewConfig` to enable users to upload files directly in the Spotter chat panel of an embedded application. - -[NOTE] -==== -File upload in the Spotter chat panel requires Visual Embed SDK version 1.49.0 or later and ThoughtSpot Cloud 26.7.0.cl or later. -// TODO: verify minimum version with engineering -==== - -To enable file upload: - -. Set `spotterFileUploadEnabled` to `true` in the `spotterChatConfig` object. -. Optionally, restrict the types of files users can upload by specifying a `SpotterFileUploadFileTypes` object in `spotterFileUploadFileTypes`. +. Ensure that `spotterFileUploadEnabled` is set to `true` in the `spotterChatConfig` object. This setting enables ** + Add files** option in the Spotter chat panel. +. Optionally, you can restrict the types of files users can upload by specifying the file types in the `SpotterFileUploadFileTypes` array. If no file format is specified, all supported file types are allowed for uploads. [source,JavaScript] ---- -import { - SpotterEmbed, - SpotterChatViewConfig, - AuthType, - init -} from '@thoughtspot/visual-embed-sdk'; - -init({ - thoughtSpotHost: 'https://your-thoughtspot-host', - authType: AuthType.None, -}); - -const spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { - frameParams: { - width: '100%', - height: '100%', - }, - worksheetId: '<%=datasourceGUID%>', +const embed = spotterEmbed = new SpotterEmbed(document.getElementById('ts-embed'), { + //... spotterChatConfig: { - spotterFileUploadEnabled: true, // Enables file upload in the chat panel - spotterFileUploadFileTypes: { // Optional: restrict allowed file types - // TODO: verify accepted SpotterFileUploadFileTypes values with engineering - }, + spotterFileUploadEnabled: true, + spotterFileUploadFileTypes: { types: ['pdf', 'png', 'xlsx'] }, }); - -spotterEmbed.render(); ---- -[cols="1,3"] -|=== -|Parameter |Description - -|`spotterFileUploadEnabled` -|Boolean. When set to `true`, enables the file upload button in the Spotter chat panel. Default: `false`. -// TODO: verify default value with engineering - -|`spotterFileUploadFileTypes` -|Accepts a `SpotterFileUploadFileTypes` object. Use this parameter to restrict the file formats that users can upload. If not specified, all supported file types are allowed. -// TODO: verify the full list of accepted file type values and the SpotterFileUploadFileTypes object shape with engineering -|=== - -For a complete list of `SpotterChatViewConfig` parameters, see xref:SpotterEmbedViewConfig.adoc[SpotterEmbedViewConfig]. - [#spotterMenuActions] === Customizing menu actions and elements diff --git a/modules/ROOT/pages/embed-spotterViz.adoc b/modules/ROOT/pages/embed-spotterViz.adoc index a43bb1bda..9c74008b6 100644 --- a/modules/ROOT/pages/embed-spotterViz.adoc +++ b/modules/ROOT/pages/embed-spotterViz.adoc @@ -6,7 +6,9 @@ :page-pageid: spotterViz-agent :page-description: Customize the SpotterViz panel in embedded Liveboards using the Visual Embed SDK. -The SpotterViz panel is supported in Liveboards embedded using `LiveboardEmbed` or `AppEmbed` components. ThoughtSpot link:https://docs.thoughtspot.com/cloud/26.6.0.cl/spotter-viz[SpotterViz, window=_blank] is the AI-powered analysis panel that appears when a user opens the Liveboard in the edit mode. It provides Liveboard users with an in-context AI assistant and a prompt interface to ask questions on Liveboard data and receive automatically generated visualizations and insights in response. +[earlyAccess eaBackground]#Early Access# + +The SpotterViz panel is supported in Liveboards embedded using `LiveboardEmbed` or `AppEmbed` components. ThoughtSpot link:https://docs.thoughtspot.com/cloud/26.6.0.cl/spotter-viz[SpotterViz, window=_blank] is the AI-powered analysis panel that appears when a user opens the Liveboard in edit mode. It provides Liveboard users with an in-context AI assistant and a prompt interface to ask questions on Liveboard data and receive automatically generated visualizations and insights in response. [NOTE] ==== @@ -30,7 +32,7 @@ image::./images/spotterviz-embed-mode.png[SpotterViz in embed view] To disable or hide SpotterViz in embedded view, use the `Action.SpotterViz` action ID in the `disabledActions` or `hiddenActions` array. == Customizing the SpotterViz panel contents -For SpotterViz panel customization, pass the `spotterViz` configuration object with the following properties as needed: +For SpotterViz panel customization, pass the `spotterViz` configuration object with the following properties as needed: Brand name:: To replace the default **SpotterViz** label with your product or assistant name, specify the brand name string in `brandName`. @@ -53,7 +55,7 @@ SpotterViz displays the question suggestions in the panel to help users begin an For example, you can set the display text as `displayText: 'Regional breakdown'` and `fullPrompt` to `Show me revenue broken down by region`. Button and other interface elements:: -The SpotterViz panel displays the restore button on checkpoint cards and thumbs up and down feedback buttons by default. To disable or hide these elements, use the following action IDs in the SDK: +The SpotterViz panel displays the restore button on checkpoint cards and thumbs-up and thumbs-down feedback buttons by default. To disable or hide these elements, use the following action IDs in the SDK: * `Action.SpotterVizCheckpointRestore` * `Action.SpotterVizFeedback` @@ -129,7 +131,7 @@ embed.render(); ---- == Customizing the style and appearance -You can customize the visual appearance of the SpotterViz panel using CSS customization framework in the SDK. Use any of the following CSS variables in the `customizations` object of the `init()` call to customize the panel style and appearance. +You can customize the visual appearance of the SpotterViz panel using the CSS customization framework in the SDK. Use any of the following CSS variables in the `customizations` object of the `init()` call to customize the panel style and appearance. [IMPORTANT] ==== @@ -479,8 +481,8 @@ No additional configuration is required. Runtime filters specified via `runtimeF See the following documentation for additional information about embedding Liveboards and customizing Liveboard experience: -* xref:embed-liveboard.adoc[Embed a Liveboard] +* xref:embed-pinboard.adoc[Embed a Liveboard] * xref:full-embed.adoc[Embed full ThoughtSpot experience] * xref:embed-events.adoc[Embed events reference] -* xref:host-events.adoc[Host events reference] +* xref:events-hostEvents.adoc[Host events reference] * xref:SpotterVizConfig.adoc[SpotterVizConfig interface] diff --git a/modules/ROOT/pages/full-app-customize.adoc b/modules/ROOT/pages/full-app-customize.adoc index 9e9ce35c2..b4e60b77e 100644 --- a/modules/ROOT/pages/full-app-customize.adoc +++ b/modules/ROOT/pages/full-app-customize.adoc @@ -100,9 +100,9 @@ Enables the modular home page experience with customizable components. This expe [IMPORTANT] ==== -* To enable the full V3 experience, both `primaryNavbarVersion` and `homePage` attributes must be set in the SDK. Not setting `primaryNavbarVersion` will result in no changes to the UI experience. +* To enable the full V3 experience, both `primaryNavbarVersion` and `homePage` attributes must be set in the SDK. Not setting `primaryNavbarVersion` will result in no changes to the UI experience. * If you include only the `homePage: HomePage.ModularWithStylingChanges` attribute in `discoveryExperience`, it will be ignored. + -* If you include only the homePage attribute with its value as `HomePage.Modular`, the v2 modular home page experience will be enabled. +* If you include only the homePage attribute with its value as `HomePage.Modular`, the V2 modular home page experience will be enabled. For information about these configuration combinations and their effects, see xref:full-app-customize.adoc#_ui_customization_options_and_resulting_experience[UI customization options and resulting experience]. ==== @@ -293,7 +293,7 @@ discoveryExperience: { }, ---- |`true` / `false` + -/ Not set / incorrect +Not set / Incorrect |V3 navigation and a modular home page that is similar to the V2 experience a| @@ -306,7 +306,7 @@ discoveryExperience: { }, ---- |`true` / `false` + -/ Not set / incorrect +Not set / Incorrect | V2 navigation and V2 modular home page a| @@ -343,7 +343,7 @@ a| ---- discoveryExperience: { // V3 navigation - primaryNavbarVersion: PrimaryNavbarVersion.Sliding + primaryNavbarVersion: PrimaryNavbarVersion.Sliding, // V4 modular home page homePage: HomePage.Focused }, diff --git a/modules/ROOT/pages/full-embed.adoc b/modules/ROOT/pages/full-embed.adoc index 85eb5b6eb..2f79ad030 100644 --- a/modules/ROOT/pages/full-embed.adoc +++ b/modules/ROOT/pages/full-embed.adoc @@ -4,7 +4,7 @@ :page-title: Embed Full Application :page-pageid: full-embed -:page-description: You can embed full ThoughtSpot experience in your application and allow your users to create content for live analytics +:page-description: You can embed the full ThoughtSpot experience in your application and allow your users to create content for live analytics Full app embedding allows you to embed the entire ThoughtSpot application or individual application pages in your app. It provides access to all core ThoughtSpot features, along with additional customization options through the Visual Embed SDK, including custom actions and CSS styling rules. @@ -20,7 +20,7 @@ The layout and feature set of the various pages in full app embedding are relati == Before you embed Before embedding the full ThoughtSpot application: -* Review ThoughtSpot UI, xref:full-app-customize.adoc[different experience modes and customization options] available in the SDK. +* Review the ThoughtSpot UI, xref:full-app-customize.adoc[different experience modes and customization options] available in the SDK. * Determine the xref:customize-nav-full-embed.adoc[navigation elements] and xref:customize-homepage-full-embed.adoc[modules] to enable or customize in the embed view == Import the AppEmbed package @@ -111,7 +111,7 @@ https://{ThoughtSpot-Host}/?embedApp=true&primaryNavHidden=true&profileAndHelpIn ---- //// -The `AppEmbed` component allows you to embed a specific application page or the entire application experience. If you are embedding full experience, you can xref:set-default-page.adoc[set a specific application page as the default page when the embedded content loads] using the `pageId` or `path` property. +The `AppEmbed` component allows you to embed a specific application page or the entire application experience. If you are embedding the full experience, you can xref:set-default-page.adoc[set a specific application page as the default page when the embedded content loads] using the `pageId` or `path` property. == Customize your embed view (Optional) @@ -281,7 +281,7 @@ For more information about events, see the following pages: == Code sample -The following example shows the minimal code required to embed full ThoughtSpot experience in an app. +The following example shows the minimal code required to embed the full ThoughtSpot experience in an app. [source,JavaScript] ---- @@ -294,7 +294,7 @@ import { // Alternatively, you can use the ES6 import from CDN as shown below: // import { AppEmbed, AuthType, init } from 'https://cdn.jsdelivr.net/npm/@thoughtspot/visual-embed-sdk/dist/tsembed.es.js'; -// Initialize th Visual Embed SDK with the host and authentication type +// Initialize the Visual Embed SDK with the host and authentication type init({ thoughtSpotHost: '', // Replace with your ThoughtSpot host authType: AuthType.None, // Use 'None' if authentication is handled outside the SDK @@ -308,7 +308,7 @@ const appEmbed = new AppEmbed( width: '100%', // Set the iframe width to 100% height: '100%', // Set the iframe height to 100% }, - pageId: Page.Liveboards, // Set the initial page to the Data page + pageId: Page.Liveboards, // Set the initial page to the Liveboards page } ); diff --git a/modules/ROOT/pages/rest-api-v2-reference.adoc b/modules/ROOT/pages/rest-api-v2-reference.adoc index 0f0e35da5..7ecd95b10 100644 --- a/modules/ROOT/pages/rest-api-v2-reference.adoc +++ b/modules/ROOT/pages/rest-api-v2-reference.adoc @@ -463,7 +463,7 @@ ThoughtSpot Software: __10.0.0.sw or later__ a| a|`POST /api/rest/2.0/dbt/generate-sync-tml` + -Resynchronizes the existing list of Models and Tables TML content for the specified DBT connection object and imports these to Thoughtspot. +Resynchronizes the existing list of Models and Tables TML content for the specified DBT connection object and imports these to ThoughtSpot. |ThoughtSpot Cloud: __9.10.0.cl or later__ + ThoughtSpot Software: __10.0.0.sw or later__ a| @@ -686,7 +686,7 @@ ThoughtSpot Software: __9.0.1.sw or later__ a| a|`POST /api/rest/2.0/metadata/tml/export/batch` + -Exports a complete set of TML for user, user group, or Role object. +Exports a complete set of TML for a user, user group, or Role object. |ThoughtSpot Cloud: __10.1.0.cl or later__ + ThoughtSpot Software: __10.1.0.sw or later__ a|+++Try it out +++ @@ -757,7 +757,7 @@ a| +++Try it out+++ a| `POST /api/rest/2.0/metadata/update-obj-id` + -Update object IDs for given metadata objects. +Updates object IDs for given metadata objects. |ThoughtSpot Cloud: __10.8.0.cl or later__ + ThoughtSpot Software: __10.10.0.sw or later__ a| @@ -952,7 +952,7 @@ Gets access permission details for metadata objects. To get object access detail ThoughtSpot Software: __9.0.1.sw or later__ a| +++Try it out+++ a| `POST /api/rest/2.0/security/metadata/manage-object-privilege` + -Allows assigning object-level permissions to other users and groups and granting access to Spotter coaching information. +Allows assigning object-level permissions to other users and groups and granting access to Spotter coaching information. |ThoughtSpot Cloud: __26.3.0.cl or later__ + ThoughtSpot Software: Not available a| +++Try it out+++ @@ -1013,7 +1013,7 @@ ThoughtSpot Software: __9.5.0.sw or later__ a| a| `POST /api/rest/2.0/system/config-update` + -Gets details of the current configuration running on your cluster. +Updates the current configuration of your instance. a|ThoughtSpot Cloud: __9.2.0.cl or later__ + ThoughtSpot Software: __9.5.1.sw or later__ a| +++Try it out +++ @@ -1074,7 +1074,7 @@ ThoughtSpot Software: __9.0.1.sw or later__ a| a| `POST /api/rest/2.0/tags/{tag_identifier}/delete` + -Deletes an Org object from ThoughtSpot. +Deletes a tag object from ThoughtSpot. a|ThoughtSpot Cloud: __9.0.0.cl or later__ + ThoughtSpot Software: __9.0.1.sw or later__ a| @@ -1133,7 +1133,7 @@ ThoughtSpot Software: __9.0.1.sw or later__ a| +++Try it out +++ a|`POST /api/rest/2.0/users/import` + -Gets an authentication token from ThoughtSpot that grants access to a full application session. +Imports users from an external database to ThoughtSpot. |ThoughtSpot Cloud: __9.0.0.cl or later__ + ThoughtSpot Software: __9.0.1.sw or later__ a| @@ -1154,7 +1154,7 @@ ThoughtSpot Software: __9.0.1.sw or later__ a| +++Try it out +++ a|`POST /api/rest/2.0/users/force-logout` + -Logs out a users from their current sessions. +Logs out users from their current sessions. |ThoughtSpot Cloud: __9.0.0.cl or later__ + @@ -1294,7 +1294,7 @@ a|ThoughtSpot Cloud: __26.4.0.cl or later__ a| +++Try it out +++ | `POST /api/rest/2.0/template/variables/update-values` [tag redBackground]#DEPRECATED# + -Allows updating properties one or several variable. +Allows updating properties of one or several variables. a|ThoughtSpot Cloud: __10.9.0.cl or later__ a| +++Try it out +++ diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index b1234d5cb..f2061ab9b 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -2,7 +2,7 @@ :toc: true :toclevels: 1 -:page-title: Changelog +:page-title: REST API v2.0 changelog :page-pageid: rest-v2-changelog :page-description: Changelog of REST APIs @@ -51,7 +51,7 @@ The `GET /api/rest/2.0/webhooks/storage-config` API endpoint allows retrieving t Enhancements:: * The `/api/rest/2.0/webhooks/create` endpoint allows activating a webhook and configuring GCS storage destination for webhook delivery. The API endpoint also returns GCS storage configuration details in the response. -* The `/api/rest/2.0/webhooks/{webhook_identifier}/update` API endpoint supports configuring webhook activate status, resetting authentication, signature verification, and storage destination properties. +* The `/api/rest/2.0/webhooks/{webhook_identifier}/update` API endpoint supports configuring webhook activate status, resetting authentication, signature verification, and storage destination properties. * API requests to the `/api/rest/2.0/system/communication-channels/validate` now return GCS storage properties in response. === Communication channel monitoring @@ -87,15 +87,15 @@ Stops a Spotter agent response that is currently in progress for a given convers For more information, see xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[Stop an in-progress agent response]. -==== Authentication -The following new endpoints allow searching for the authentication configuration at the cluster or Org level, and also allows enabling and disabling the authentication. Currently, only support trusted authentication. +=== Authentication +The following new endpoints allow searching for the authentication configuration at the cluster or Org level, and also allow enabling and disabling authentication. These endpoints currently support only trusted authentication. * `POST /api/rest/2.0/auth/configure` + Enables or disables authentication at cluster or Org level for the specified auth type. -* `POST /api/rest/2.0/auth/search` + +* `POST /api/rest/2.0/auth/search` + Returns the authentication configuration for the specified auth type at cluster and Org level. -==== Connection deactivate and activate API [beta betaBackground]^Beta^ +=== Connection deactivate and activate API [beta betaBackground]^Beta^ // SOURCE: SCAL-294844, SCAL-294845, SCAL-278132 @@ -122,8 +122,8 @@ XLSX and PDF export formats are now supported for Spotter (conversational) Answe Custom PNG dimensions:: PNG exports now support custom dimensions via the following new parameters: + -* `x_resolution`: Sets the export width in pixels. Valid range: 600–3840 px. -* `y_resolution`: Sets the export height in pixels. Valid range: 600–3840 px. +* `x_resolution`: Sets the export width in pixels. Valid range: 600–3840 px. +* `y_resolution`: Sets the export height in pixels. Valid range: 600–3840 px. Display scaling:: A new `scaling` parameter allows you to adjust the relative size of visual elements in PNG exports without cropping. @@ -163,14 +163,13 @@ These new endpoints replace the legacy agent conversation and SSE streaming APIs ==== Deprecated endpoints [.version-badge.deprecated]#Deprecated# -* `POST /api/rest/2.0/ai/agent/{conversation_identifier}/converse` + +* `POST /api/rest/2.0/ai/agent/{conversation_identifier}/converse` + Replaced by `POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/send`. * `POST /api/rest/2.0/ai/agent/converse/sse` + Replaced by `POST /api/rest/2.0/ai/agent/conversation/{conversation_identifier}/send/stream` -These endpoints are deprecated and will be removed -in a future release. Embedding applications and integrations using these APIs are advised to migrate to the new API endpoints for improved experience. +These endpoints are deprecated and will be removed in a future release. Embedding applications and integrations using these APIs are advised to migrate to the new API endpoints for improved experience. ==== Enhancements to conversation creation API [.version-badge.breaking]#Breaking# @@ -200,7 +199,7 @@ The API response now returns the `conversation_identifier`, which is used in all subsequent send message or SSE streaming calls. === Liveboard report API enhancements [beta betaBackground]^Beta^ -The `POST /api/rest/2.0/report/liveboard` API endpoint enhances the pdf downloads by introducing the following parameters: +The `POST /api/rest/2.0/report/liveboard` API endpoint enhances the PDF downloads by introducing the following parameters: * `"page_size": "CONTINUOUS"` for a seamless PDF export that matches the full length of your Liveboard. Unlike the A4 format, which introduces forced page breaks between visualizations, this continuous flow maintains your exact design and intended layout. * `zoom_level` offers various download size options to suit the viewer's screen dimensions, thereby enhancing legibility. This can be set only when `page_size` is specified as `CONTINUOUS`. @@ -244,16 +243,16 @@ You can now validate a webhook connection by sending a test payload via an API r Webhook monitoring:: To monitor the status of webhook jobs and scheduled events, ThoughtSpot introduces the `/api/rest/2.0/jobs/history/communication-channels/search` API endpoint. -For more information see xref:webhooks-comm-channel.adoc[Webhook configuration validation and monitoring]. +For more information, see xref:webhooks-comm-channel.adoc[Webhook configuration validation and monitoring]. === Collections API endpoints The following APIs are introduced for Collections: * `POST /api/rest/2.0/collections/create` [beta betaBackground]^Beta^ + -Creates a new Collection +Creates a new Collection. * `POST /api/rest/2.0/collections/search` [beta betaBackground]^Beta^ + -Search for a Collection in the existing Collections +Searches for a Collection in ThoughtSpot * `POST /api/rest/2.0/collections/{collection_identifier}/update` [beta betaBackground]^Beta^ + Updates an existing Collection * `POST /api/rest/2.0/collections/delete` [beta betaBackground]^Beta^ + @@ -402,7 +401,7 @@ For more information, see xref:abac-user-parameters.adoc[ABAC via tokens]. System:: This release introduces the following endpoints for configuring communication channel preferences. -* `POST /api/rest/2.0/system/preferences/communication-channels/configure` [beta betaBackground]^Beta^ + +* `POST /api/rest/2.0/system/preferences/communication-channels/configure` [beta betaBackground]^Beta^ + Sets a communication channel preference for all Orgs at the cluster level or at the individual Org level. * `POST /api/rest/2.0/system/preferences/communication-channels/search` [beta betaBackground]^Beta^ + Gets details of the communication channel preferences configured on ThoughtSpot. @@ -441,7 +440,7 @@ The variable API enhancements are listed in the following sections. For addition ==== Variable creation API -* The variable creation endpoint `/api/rest/2.0/template/variables/create` doesn't support assigning values to a variable. To assign values to a variable, use the `/api/rest/2.0/template/variables/update-values` endpoint. +* The variable creation endpoint `/api/rest/2.0/template/variables/create` does not support assigning values to a variable. To assign values to a variable, use the `/api/rest/2.0/template/variables/update-values` endpoint. * The `sensitive` parameter is renamed as `is_sensitive`. //* You can define the data type for variables using the `data_type`property. //* You can now create formula variables. To create a formula variable, use define the variable type as `FORMULA_VARIABLE` variable type in your API request . @@ -481,14 +480,14 @@ Support for `variable_values` property in `/api/rest/2.0/auth/session/user` API Spotter:: * `POST /api/rest/2.0/ai/agent/conversation/create` + -Creates a new AI-driven conversation session based on a specified data source. The resulting session sets the context for subsequent queries and responses. + +Creates a new AI-driven conversation session based on a specified data source. The resulting session sets the context for subsequent queries and responses. + * `POST /api/rest/2.0/ai/relevant-questions/` + Breaks down a user-submitted query into a series of analytical sub-questions using relevant contextual metadata. * `POST /api/rest/2.0/ai/agent/converse/sse` + -Allows sending a follow-up message or question to an ongoing conversation session and returns the AI agent's response, including answers, tokens, and visualization details. + +Allows sending a follow-up message or question to an ongoing conversation session and returns the AI agent's response, including answers, tokens, and visualization details. + //* `POST /api/rest/2.0/ai/data-source-suggestions` + //Returns a list of relevant data sources, such as Models, based on a query and thus helping users and agents choose the most appropriate data source for analytics. + @@ -572,7 +571,7 @@ The `POST /api/rest/2.0/metadata/tml/export` API request allows exporting column The search metadata (`/api/rest/2.0/metadata/search`) API includes the following enhancements: * The `liveboard_reponse_version` parameter. It allows you to specify the xref:rest-api-v2-metadata-search.adoc#_response_format_for_liveboards[response format for Liveboard objects]. -* The `subtypes` attribute to specify the sub-type for the `LOGICAL_TABLE` metadata type. The `LOGICAL_TABLE` type allows to fetch objects such as Tables, Models, and Views. The `subtypes` parameter allows you to filter API response by specifying subcategories of the object type. +* The `subtypes` attribute to specify the sub-type for the `LOGICAL_TABLE` metadata type. The `LOGICAL_TABLE` type allows you to fetch objects such as Tables, Models, and Views. The `subtypes` parameter allows you to filter API response by specifying subcategories of the object type. * The `include_only_published_objects` attribute to specify whether the search should include xref:publish-api.adoc[published objects]. @@ -598,9 +597,9 @@ Allows you to personalize the ThoughtSpot notification emails content. * `POST /api/rest/2.0/customization/email/{template_identifier}/delete` + Removes the customizations done for the ThoughtSpot notification emails. * `POST /api/rest/2.0/customization/email/search` + -Allows searching the email customization configuration if any set for ThoughtSpot. +Allows searching the email customization configuration if configured for ThoughtSpot. * `POST /api/rest/2.0/customization/email/validate` + -Validates the email customization configuration if any set for ThoughtSpot. +Validates the email customization configuration if configured for ThoughtSpot. === Group API @@ -699,7 +698,7 @@ Filters metadata objects by the user-defined object ID. This parameter returns d === TML APIs -* The `all_orgs_context` parameter in TML import APIs (` /api/rest/2.0/metadata/tml/import` and `/api/rest/2.0/metadata/tml/async/import`) is deprecated and removed from the Playground. Use `all_orgs_override` to define the Org context in your API requests. +* The `all_orgs_context` parameter in TML import APIs (`/api/rest/2.0/metadata/tml/import` and `/api/rest/2.0/metadata/tml/async/import`) is deprecated and removed from the Playground. Use `all_orgs_override` to define the Org context in your API requests. * The TML export API now allows exporting TML content with user feedback received for objects such as AI-generated Answers. The `export_with_associated_feedbacks` attribute is set to `false` by default. @@ -771,7 +770,7 @@ TML async import:: The `/api/rest/2.0/metadata/tml/async/import` supports setting the following properties via API requests: + * `import_policy` + -Allows you specify if all objects should be imported during the TML import operation. Valid values are: +Allows you to specify if all objects should be imported during the TML import operation. Valid values are: ** `PARTIAL_OBJECT` (default) ** `PARTIAL` @@ -823,7 +822,7 @@ Creates a conversation session. * `POST /api/rest/2.0/ai/conversation/{conversation_identifier}/converse` + Generates responses for user queries and follow-up questions. * `POST /api/rest/2.0/ai/answer/create` + -Generate an Answer from a Natural Language Search query +Generates an Answer from a Natural Language Search query. Authentication:: The `/api/rest/2.0/auth/token/custom` API endpoint is now available to generate an authentication token with custom rules and filter conditions for a user. diff --git a/modules/ROOT/pages/roles.adoc b/modules/ROOT/pages/roles.adoc index 8af3dbb24..dc89e4e37 100644 --- a/modules/ROOT/pages/roles.adoc +++ b/modules/ROOT/pages/roles.adoc @@ -131,8 +131,7 @@ UI: *Can manage Spotter* a| Allows a designated Spotter administrator to manage [NOTE] ==== -* The `CAN_MANAGE_SPOTTER` privilege implies `CAN_USE_SPOTTER`, so separate assignment is required. -* The `CAN_MANAGE_SPOTTER` privilege does not grant data model edit access, does not allow editing columns, synonyms, or descriptions, and does not override data access permissions. +The `CAN_MANAGE_SPOTTER` privilege does not grant data model edit access, does not allow editing columns, synonyms, or descriptions, and does not override data access permissions. ==== |Catalog management|API: `CAN_CREATE_CATALOG` + @@ -144,7 +143,7 @@ UI: *Can manage catalog*| Allows users to create, edit, and manage a link:https: The `SHAREWITHALL` (**Can share with all users**) Role privilege allows users to share objects with all the users and groups in ThoughtSpot. === Data control -The application control privileges include the following: +The data control privileges include the following: [width="100%" cols="2,4,4"] [options='header'] @@ -216,7 +215,7 @@ Removes the Roles assigned to a group Edit Role associations of a group object |Object query|To get the details of Roles assigned to a group object, use the following API endpoint: * xref:group-api.adoc#get-users-group[`GET /tspublic/v1/group/`] + -Note that the API response shows the assigned Roles and privileges in the `assignedRoles` and `granularPrivilges` arrays. +Note that the API response shows the assigned Roles and privileges in the `assignedRoles` and `granularPrivileges` arrays. |=== === REST API v2 endpoints for Role administration and assignment diff --git a/modules/ROOT/pages/webhooks-api.adoc b/modules/ROOT/pages/webhooks-api.adoc index 73a033fa5..ab781b24e 100644 --- a/modules/ROOT/pages/webhooks-api.adoc +++ b/modules/ROOT/pages/webhooks-api.adoc @@ -15,7 +15,7 @@ Allows xref:webhooks-api.adoc#_creating_a_webhook[creating a webhook] for the Li * `GET /api/rest/2.0/webhooks/storage-config` + xref:webhooks-api.adoc#_retrieving_storage_information_for_webhook_configuration[Gets storage setup information] for configuring customer-managed storage. * `POST /api/rest/2.0/webhooks/search` + -xref:webhooks-api.adoc#_getting_a_list_of_webhooks[Gets a list of webhooks] configured in the Org. +xref:webhooks-api.adoc#_retrieving_webhook_details[Gets a list of webhooks] configured in the Org. * `POST /api/rest/2.0/webhooks/{webhook_identifier}/update` + Allows xref:webhooks-api.adoc#_updating_a_webhook[updating configuration properties]. * `POST /api/rest/2.0/webhooks/delete` + @@ -128,12 +128,12 @@ To get storage setup information for your ThoughtSpot instance required for conf === Example request -[source, cURL] +[source,cURL] ---- curl -X GET \ --url 'https://{ThoughtSpot-Host}/api/rest/2.0/webhooks/storage-config' \ -H 'Accept: application/json' \ - -H 'Authorization: Bearer {AUTH_TOKEN}' \ + -H 'Authorization: Bearer {AUTH_TOKEN}' ---- === API response @@ -218,7 +218,7 @@ The response returned for AWS-hosted ThoughtSpot instances where the customer co ---- ==== Storage configuration attributes for GCP_TO_S3_STORAGE -This response returned for GCP-hosted ThoughtSpot instances where the customer configures an AWS S3 bucket as the storage destination includes the following attributes. +The following response is returned for GCP-hosted ThoughtSpot instances where the customer configures an AWS S3 bucket as the storage destination includes the following attributes. * `gcp_service_account_id`: The unique numeric ID of the ThoughtSpot GCP service account. This ID is used as the OIDC subject (`sub`) in the AWS IAM web identity trust policy condition, scoping the trust to exactly this service account. Use this value when configuring the `accounts.google.com:sub` condition in your IAM role's trust policy. @@ -407,13 +407,13 @@ If the webhook ID is valid, the API returns the following response: To update a webhook, send a `POST` request to the `/api/rest/2.0/webhooks/{webhook_identifier}/update` API endpoint. In the update request, include the webhook ID as a path parameter and the properties to modify in the request body. -To update existing configuration, specify the following parameters in the API request as needed: +To update the webhook configuration, specify the following parameters in the API request as needed: -* `name`: Name of the webhook. -* `description`: Description text. +* `name`: Name of the webhook. +* `description`: Description text. * `url`: Webhook endpoint URL. * `events`: Event type that initiates the webhook delivery. -* `url_params`: Key-value pairs for the URL query parameters. +* `url_params`: Key-value pairs for the URL query parameters. * `authentication`: Authentication type to use for authorizing webhook requests. * `signature_verification`: Signature verification type. * `storage_destination`: Storage configuration parameters for webhook delivery. @@ -472,7 +472,7 @@ curl -X POST \ === API response -If the API request is successful, the API returns the 200 response with the details of the deleted webhook. +If the API request is successful, the API returns a 200 response with the details of the deleted webhook. == Related resources * xref:webhooks-comm-channel.adoc[Configure webhook communication channels] diff --git a/modules/ROOT/pages/webhooks-comm-channel.adoc b/modules/ROOT/pages/webhooks-comm-channel.adoc index 01d7f55a2..736c721b1 100644 --- a/modules/ROOT/pages/webhooks-comm-channel.adoc +++ b/modules/ROOT/pages/webhooks-comm-channel.adoc @@ -271,7 +271,7 @@ The following example shows the preferences returned for a specific Org: ---- == Validate communication channel configuration -To ensure that a communication channel configuration is properly configured and can receive events, use the `/api/rest/2.0/system/communication-channels/validate` API endpoint to validate the communication channel configuration. +To ensure that a communication channel is properly configured and can receive events, use the `/api/rest/2.0/system/communication-channels/validate` API endpoint to validate the communication channel configuration. === Request parameters @@ -360,7 +360,7 @@ The following response shows the validation success and failure errors for a web ---- == Monitor webhook delivery and job status -To monitor job status for communication channels such as webhook, use the `/api/rest/2.0/jobs/history/communication-channels/search` API endpoint. +To monitor job status for communication channels such as webhooks, use the `/api/rest/2.0/jobs/history/communication-channels/search` API endpoint. === Request parameters In the API request, you must provide channel details such as channel type, ID, and event type, or specify the job ID. @@ -371,11 +371,11 @@ In the API request, you must provide channel details such as channel type, ID, a |===== |Parameter|Description -|`channel_type` a|__String__. Type of communication channel to validate. Specify `WEBHOOK` for webhook channels. -|`job_ids` |__Array of strings__. One or more IDs of the job. To get the ID for a given webhook channel, check the API response from the `/api/rest/2.0/system/communication-channels/validate` endpoint. +| `channel_type` a|__String__. Type of communication channel to validate. Specify `WEBHOOK` for webhook channels. +| `job_ids` |__Array of strings__. One or more IDs of the job. To get the ID for a given webhook channel, check the API response from the `/api/rest/2.0/system/communication-channels/validate` endpoint. -Required parameter if no channel identifier and event ID are specified in the API request. -|`channel_identifiers`|__Array of strings__. IDs or names of the communication channel. Required if no job ID is specified. +Required if neither a channel identifier nor an event ID is specified in the API request. +| `channel_identifiers`|__Array of strings__. IDs or names of the communication channel. Required if no job ID is specified. For webhook channels, specify the webhook ID. You can retrieve the webhook IDs from the `/api/rest/2.0/webhooks/search` API endpoint via an API request. |`channel_status` a|__String__. Status of the channel or the job. Specify one of the following values: @@ -388,7 +388,7 @@ Gets a list of jobs that were delivered successfully. * `FAILED` + Gets a list of failed job deliveries. -|`events` + +| `events` + __Optional__ a| Allows filtering API response by event type and ID. * `type` + @@ -396,8 +396,8 @@ Event type for which the webhook delivery is triggered. Default is `LIVEBOARD_SC * `identifier` + ID of the event. -|`start_epoch_time_in_millis` |__Decimal__. Allows filtering API response by records that were created on or after the specified epoch milliseconds. -|`end_epoch_time_in_millis` |__Decimal__. Specify the end time in epoch milliseconds to fetch records created before the specified timestamp. +| `start_epoch_time_in_millis` |__Decimal__. Allows filtering API response by records that were created on or after the specified epoch milliseconds. +| `end_epoch_time_in_millis` |__Decimal__. Filters the API response by records created before the specified timestamp (in epoch milliseconds). |===== diff --git a/modules/ROOT/pages/webhooks-gcs-storage.adoc b/modules/ROOT/pages/webhooks-gcs-storage.adoc index 8a7b1429d..82482f85a 100644 --- a/modules/ROOT/pages/webhooks-gcs-storage.adoc +++ b/modules/ROOT/pages/webhooks-gcs-storage.adoc @@ -19,8 +19,8 @@ GCS storage integration for webhooks is available for GCP-hosted ThoughtSpot ins [IMPORTANT] ==== * The new Webhooks UI experience is an Early Access feature and is disabled by default. To enable this feature, contact ThoughtSpot Support. -* The new Webhooks UI experience is available on only ThoughtSpot Cloud instances running 26.7.0.cl and later. -* In the current version, the new experience allows creating and managing created webhooks for Liveboard Schedule events only. +* The new Webhooks UI experience is available only on ThoughtSpot Cloud instances running 26.7.0.cl and later. +* In the current version, the new experience allows creating and managing webhooks for Liveboard Schedule events only. ==== == Before you begin @@ -64,7 +64,7 @@ ThoughtSpot allows only one webhook for the Liveboard Schedule event type per Or ==== Request parameters -[width="100%" cols="1,6"] +[width="100%", cols="1,6"] [options='header'] |==== |Parameter|Description @@ -86,10 +86,10 @@ __String__. Name of the GCS bucket where webhook payloads will be stored. For ex * `service_account_email` + __String__. Email of the GCP service account to impersonate for bucket access. For example, `my-sa@my-project.iam.gserviceaccount.com`. The platform's service account must be granted `roles/iam.serviceAccountTokenCreator`. * `path_prefix` __Optional__ + -__String__. Optional. Path prefix for organizing objects within the bucket. For example, `thoughtspot/`. +__String__. Path prefix for organizing objects within the bucket. For example, `thoughtspot/`. |`additional_headers` + -__Optional__ a|__Array of key-value pairs__. Allows including custom HTTP headers in every outbound webhook HTTP request that ThoughtSpot sends to the configured destination URL. You can use this parameter to pass arbitrary headers with custom metadata in key-value pairs, as required by the webhook receiver endpoint: When configured, ThoughtSpot sends these headers in addition to the authentication headers and standard HTTP headers such as `Content-Type`, `User-Agent`. +__Optional__ a|__Array of key-value pairs__. Allows including custom HTTP headers in every outbound webhook HTTP request that ThoughtSpot sends to the configured destination URL. You can use this parameter to pass arbitrary headers with custom metadata in key-value pairs, as required by the webhook receiver endpoint. When configured, ThoughtSpot sends these headers in addition to the authentication headers and standard HTTP headers such as `Content-Type`, `User-Agent`. [source,JSON] ---- @@ -238,7 +238,7 @@ To monitor the webhook delivery and status, use one of the following options: To verify the webhook delivery and job status, use the `/api/rest/2.0/jobs/history/communication-channels/search` API endpoint. For more information, see xref:webhooks-comm-channel.adoc#_monitor_webhook_delivery_and_job_status[Monitor webhook delivery and job status]. * Using the UI: + -If your ThoughtSpot instance has new Webhooks page enabled, use the **Webhooks** menu option in the **Develop** page to view the details of the webhook: +If your ThoughtSpot instance has new Webhooks page enabled, use the **Webhooks** menu option on the **Develop** page to view the details of the webhook: . Go to the **Develop** > **Customization** > **Webhooks** page. + The **Webhooks** page displays status cards and delivery rate for the webhooks configured in the Org. . Click the webhook from the list and verify the delivery details. For more information, see xref:webhooks-ux.adoc#_monitoring_webhook_status[Monitoring delivery status]. @@ -255,6 +255,7 @@ To verify that ThoughtSpot is delivering webhooks to your GCS bucket: == Troubleshooting errors [cols="2,3"] +[options="header"] |==== | Issue | Resolution diff --git a/modules/ROOT/pages/webhooks-lb-schedule.adoc b/modules/ROOT/pages/webhooks-lb-schedule.adoc index ee159cc1d..afc39d7e2 100644 --- a/modules/ROOT/pages/webhooks-lb-schedule.adoc +++ b/modules/ROOT/pages/webhooks-lb-schedule.adoc @@ -31,7 +31,7 @@ To create a webhook for the Liveboard schedule event, send a `POST` request to t ==== Request parameters -[width="100%" cols="1,6"] +[width="100%", cols="1,6"] [options='header'] |===== |Parameter|Description @@ -40,7 +40,7 @@ To create a webhook for the Liveboard schedule event, send a `POST` request to t __Optional__ a|__String__. Description text for the webhook. | `url` a|__String__. The fully qualified URL of the listening endpoint to which you want to send webhook notifications. -| `url_params` a|A JSON map of key-value pairs to append as query parameters in the webhook URL. +| `url_params` a|__Optional__. A JSON map of key-value pairs to append as query parameters in the webhook URL. | `events` a|__Array of strings__. List of events to subscribe to. Specify `LIVEBOARD_SCHEDULE`. | `authentication` a|Defines the authentication method and credentials ThoughtSpot uses when sending HTTP requests to the webhook endpoint. diff --git a/modules/ROOT/pages/webhooks-payload.adoc b/modules/ROOT/pages/webhooks-payload.adoc index 1a0afb671..5dbd05db6 100644 --- a/modules/ROOT/pages/webhooks-payload.adoc +++ b/modules/ROOT/pages/webhooks-payload.adoc @@ -179,7 +179,7 @@ For other webhook destinations, ThoughtSpot sends a `multipart/form-data` payloa The supported attachment file formats for webhook delivery are PDF, CSV, and XLSX. -[source,JSON] +[source,http] ---- Content-Type: multipart/form-data; boundary=------------------------boundary123 @@ -347,7 +347,7 @@ The `WebhookActorInfo` schema defines the properties of the entity that initiate | `actorType` | string | Initiator of the event such as the API client or user. The default actor type is `SYSTEM`. | Yes | `id` | string a| Unique identifier, such as a GUID or object ID. For system-generated responses, the `id` is set to `null`. | No -| `name` | string a| Name of the actor that initiated the event. For system-generated responses, the `name` will be set as `null`. | No +| `name` | string a| Name of the actor that initiated the event. For system-generated responses, the `name` is set to `null`. | No | `email` | string a| Email of the actor that initiated the event. For system-generated responses, the `email` is set to `null`. | No |===== @@ -379,7 +379,7 @@ The `LiveboardScheduleData` schema defines event-specific data for Liveboard sch | `recipients` | array | Details of the ThoughtSpot users, groups, and email addresses of external users configured as subscribers to Liveboard schedule notifications and recipients of the webhook payload. For more information, see xref:webhooks-payload.adoc#_recipientinfo[RecipientInfo]. | Yes | `viewInfo` | object | Information about the Liveboard view. Applicable if the Liveboard schedule event is triggered for a personalized view of the Liveboard. For more information, see xref:webhooks-payload.adoc#_viewinfo[ViewInfo]. | No | `aiHighlights` | string | AI Highlights information. Applicable if AI highlights feature is enabled for the visualizations on the Liveboard. | No -| `msgUniqueId` | string | Unique message identifier. Unique ID of the webhook payload message. This ID can be used for traceability and deduplication on the receiving end. | No +| `msgUniqueId` | string | Unique ID of the webhook payload message. This ID can be used for traceability and deduplication on the receiving end. | No | `channelID` | string | The communication channel ID used for event dissemination. | No | `channelType` | string | Type of the communication channel. The channel type used for webhook payloads is `webhook`. | No | `communicationType` | string | Type of the messaging event. For Liveboard schedule events, the communication type will be `LiveboardSchedules`. | No @@ -391,7 +391,7 @@ The `ScheduleDetails` schema defines the properties of the schedule that trigger [width="100%" cols="1,1,3,1"] [options='header'] -|==== +|===== | Field | Type | Description | Required? | `scheduleId` | string | ID of the Liveboard schedule. | Yes | `name` | string | Name of the Liveboard schedule. | Yes @@ -402,11 +402,11 @@ The `ScheduleDetails` schema defines the properties of the schedule that trigger | `userIds` | array | IDs of the ThoughtSpot users that are subscribed to the scheduled Liveboard notifications. | No | `groupIds` | array | IDs of the ThoughtSpot groups that are subscribed to the scheduled Liveboard notifications.| No | `runId` | string | Schedule run ID of the Liveboard job. | No -| `exportRequest` | object | Details of the file export request. If the scheduled notification includes PDF attachment, the `exportRequest` includes details of the Liveboard and PDF page attributes. | No +| `exportRequest` | object | Details of the file export request. If the scheduled notification includes a PDF attachment, the `exportRequest` includes details of the Liveboard and PDF page attributes. | No | `fileFormat` | string | File format for export. Schedule notifications generally include PDF attachments. | No | `status` | string | Status of the schedule. | No -| `emailIds` | array | Email IDs of users subscribed to Liveboard job schedule. | No -|==== +| `emailIds` | array | Email addresses of users subscribed to the Liveboard job schedule. | No +|===== ==== RecipientInfo @@ -434,12 +434,12 @@ The `ViewInfo` schema defines properties of the Liveboard view for which the eve [width="100%" cols="1,1,3,1"] [options='header'] -|====== +|===== | Field | Type | Description | Required? | `viewId` | string | ID of the Liveboard personalized view. | Yes | `viewName` | string | Name of the Liveboard personalized view. | Yes -|====== +|===== == Additional resources diff --git a/modules/ROOT/pages/webhooks-s3-storage.adoc b/modules/ROOT/pages/webhooks-s3-storage.adoc index aeda7ce9e..05d589219 100644 --- a/modules/ROOT/pages/webhooks-s3-storage.adoc +++ b/modules/ROOT/pages/webhooks-s3-storage.adoc @@ -36,7 +36,7 @@ To obtain the account ID, contact your ThoughtSpot representative. + You must allow this ID to access your S3 resources and grant the required permissions. | AWS S3 bucket a| Create an S3 bucket or use an existing S3 bucket that you intend to use as a storage destination for ThoughtSpot exports. -You can also add a prefix for example, `thoughtspot/`, to logically separate ThoughtSpot files. This serves as the S3 prefix for webhook delivery. +You can also add a prefix, for example, `thoughtspot/`, to logically separate ThoughtSpot files. This serves as the S3 prefix for webhook delivery. | Cross-account IAM role a| The IAM role that ThoughtSpot will assume to deliver webhook content to an S3 bucket. For example, `thoughtspot-s3-upload`. The IAM role must include the following policies: @@ -189,7 +189,7 @@ ThoughtSpot allows only one webhook for the Liveboard Schedule event type per Or ==== Request parameters -[width="100%" cols="1,6"] +[width="100%", cols="1,6"] [options='header'] |==== |Parameter|Description @@ -310,7 +310,7 @@ If the API request is successful, ThoughtSpot returns the webhook configuration ---- === Using Webhooks page in UI -If the new Webhooks page is enabled on your instance, you can create a webhook via UI. +If the new Webhooks page is enabled on your instance, you can create a webhook via the UI. To create a webhook with an AWS S3 storage as the target destination for payload delivery: . Go to **Develop** > **Customizations** and click **Webhooks**. @@ -392,6 +392,7 @@ To verify that ThoughtSpot is delivering webhooks to your S3 bucket: The common causes for webhook delivery failure are: [cols="2,4"] +[options="header"] |==== | Issue | Resolution diff --git a/modules/ROOT/pages/webhooks-ux.adoc b/modules/ROOT/pages/webhooks-ux.adoc index d2c551c4f..a29518606 100644 --- a/modules/ROOT/pages/webhooks-ux.adoc +++ b/modules/ROOT/pages/webhooks-ux.adoc @@ -9,12 +9,12 @@ The **Develop** page in ThoughtSpot UI provides the option to configure and manage webhooks. == Webhook configuration and management (New experience) -The **Webhooks** option in the **Develop** page allows you to access the new **Webhooks** experience. This page provides a centralized interface with menu actions to create, edit, delete, enable, or disable a webhook, send test requests, verify delivery status and logs. +The **Webhooks** option on the **Develop** page allows you to access the new **Webhooks** experience. This page provides a centralized interface with menu actions to create, edit, delete, enable, or disable a webhook, send test events, view delivery status and logs. [IMPORTANT] ==== * The new Webhooks UI experience is in Beta and is disabled by default. To enable this feature, contact ThoughtSpot Support. -* When the new Webhooks page is enabled, the existing Webhooks page will be displayed as the **Legacy Webhooks** menu action in the **Develop** page. +* When the new Webhooks page is enabled, the existing Webhooks page is displayed as the **Legacy Webhooks** menu action on the **Develop** page. * The **Webhooks** page supports webhooks for the Liveboard Schedule events only. ==== @@ -32,7 +32,7 @@ Note that ThoughtSpot allows only one webhook for the Liveboard Schedule event t The actions available for the list items include: -* *Sort*: Click any column header to sort the webhook list by that column. +* *Sort*: Click any column header to sort the webhook list by that column. * *Bulk selection*: Select multiple webhooks using the checkboxes to perform bulk actions. * *Row-level actions*: Hover over a webhook row and click the actions menu (*...*) to edit, delete, test, enable, or disable the webhook connection. @@ -46,7 +46,7 @@ image::./images/webhooks-dashboard.png[Webhooks dashboard] For each item in the webhooks list, the following actions are available: -* *Edit*: Opens the webhook edit panel +* *Edit*: Opens the webhook edit panel. * *Enable*: Enables selected webhooks. * *Disable*: Disables selected webhooks. * *Send test event*: Sends a test payload to all selected webhook endpoints. @@ -89,15 +89,15 @@ ThoughtSpot sends the configured credentials in every outbound request. The foll //// === Update webhook connection status -The webook connections are automatically enabled when they are created in the UI or via API. To update the webhook status, use the **Disable** and **Enable** options either in More options menu (`...`) or the buttons that appear above the list when a webhook row is selected. +The webhook connections are automatically enabled when they are created in the UI or via the API. To update the webhook status, use the **Disable** and **Enable** options either in More options menu (`...`) or the buttons that appear above the list when a webhook row is selected. === Testing a webhook connection To verify a webhook connection: -. Use one of the following options to open the edit panel: +. Use one of the following options to send a test event: * Select the webhook and click *Send test event*. * In the webhook row, from the More options menu (`...`), click **Send test event**. -. To view the delivery status, click thw webhook and verify the webhook event log. +. To view the delivery status, click the webhook and view the webhook event log. === Editing a webhook connection To edit webhook properties: @@ -134,7 +134,8 @@ To view delivery status of a specific webhook, click the webhook to open the del To filter the list, click **Add filter** and select any of the following options: * **Delivery status**: Filters the webhooks list by their delivery status. -* **Sent**: Allows filtering the list by webhook deliveries that were sent in the last 1, 2, 4, or 8 hours, or last 1, 2, or 3 days. By default, logs are retained for 3 days. +* **Sent**: Allows filtering the list by webhook deliveries that were sent in the last 1, 2, 4, or 8 hours, or the last 1, 2, or 3 days. + +By default, logs are retained for 3 days. If you want to store and retrieve logs for more than 3 days, contact ThoughtSpot Support. [.bordered] [.widthAuto] @@ -142,7 +143,7 @@ To filter the list, click **Add filter** and select any of the following options image::./images/webhooks-list-filter.png[Webhooks list] -- -To view the log details of a specific webhook delivery, click **View details**. The **Log details** modal shows details such as the event name, type, timestamp, ID, delivery status, payload properties and retry history. +To view the log details of a specific webhook delivery, click **View details**. The **Log details** modal shows details such as the event name, type, timestamp, ID, delivery status, payload properties, and retry history. [.bordered] [.widthAuto] diff --git a/modules/ROOT/pages/webhooks.adoc b/modules/ROOT/pages/webhooks.adoc index 5091730c3..566f76f13 100644 --- a/modules/ROOT/pages/webhooks.adoc +++ b/modules/ROOT/pages/webhooks.adoc @@ -11,16 +11,16 @@ ThoughtSpot webhooks provide a way to deliver data and reports to a target appli == Overview ThoughtSpot allows using webhooks for the following purposes: -Liveboard schedule notifications [beta betaBackground]^Beta^:: +Liveboard schedule notifications:: ThoughtSpot supports using webhooks to deliver scheduled Liveboard notifications to external applications and communication channels. For more information, see -xref:webhooks-lb-schedule.adoc[Deliver Liveboard reports to an external application]. +xref:webhooks-lb-schedule.adoc[Webhook configuration for Liveboard scheduled events]. Webhook delivery to Cloud Storage destinations:: ThoughtSpot supports delivering webhook payloads to the following cloud storage destinations: + * *Amazon S3*: Available on AWS-hosted and GCP-hosted ThoughtSpot Cloud instances. For configuration steps, see -xref:webhooks-s3-storage.adoc[Deliver content to cloud storage using webhooks]. -* *Google Cloud Storage (GCS)*: Available on GCP-hosted ThoughtSpot Cloud instances. For more information, see xref:webhooks-gcs-storage.adoc[GCS storage integration for webhook delivery]. +xref:webhooks-s3-storage.adoc[AWS S3 storage configuration for webhooks]. +* *Google Cloud Storage (GCS)*: Available on GCP-hosted ThoughtSpot Cloud instances. For more information, see xref:webhooks-gcs-storage.adoc[GCS storage configuration for webhooks]. KPI monitor alerts:: You can use a webhook to trigger KPI monitor alerts to an external application when a KPI metric meets a threshold condition or changes value. For more information, see xref:webhooks-kpi-alerts.adoc[Webhooks for KPI monitor alerts]. @@ -38,15 +38,14 @@ ThoughtSpot supports creating and managing webhooks through the UI or REST APIs. === Webhooks UI For managing webhooks via UI, use the following options in the **Develop** page of the ThoughtSpot UI: -* **Webhooks** [earlyAccess earlyAccessBackground]^Early Access^: + -The new *Webhooks* option in the *Develop* page provides a centralized view of webhooks configured in ThoughtSpot, including the options to create, monitor, and manage webhooks, and view stats and delivery logs in your ThoughtSpot Org. +* **Webhooks** : + +The new *Webhooks* option in the *Develop* page provides a centralized view of webhooks configured in ThoughtSpot, including the options to create, monitor, and manage webhooks, and view delivery statistics and logs in your ThoughtSpot Org. + [IMPORTANT] ==== -* The new Webhooks UI experience is an Early Access feature and is disabled by default. To enable this feature, contact ThoughtSpot Support. -* The new Webhooks UI experience is available on only ThoughtSpot Cloud instances running 26.7.0.cl and later. -* In the current version, the new experience allows creating and managing created webhooks for Liveboard Schedule events only. +* The new Webhooks UI experience is in Beta and is disabled by default. To enable this feature, contact ThoughtSpot Support. +* In the current version, the new experience allows creating and managing webhooks for Liveboard Schedule events only. ==== + diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index e47c833d3..960d5a38d 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -25,6 +25,10 @@ This page lists new features, enhancements, and deprecated functionality introdu == July 2026 +**Release version**: ThoughtSpot Cloud 26.7.0.cl + +*Upgrade notes*: No breaking changes. + +*Recommended SDK versions*: Visual Embed SDK v1.50.0 and later + [.cl-table, cols="2,4", frame=none, grid=none] |===== a| @@ -33,22 +37,18 @@ a| a| [discrete] -==== SpotterViz for Liveboards [.version-badge.new]#New# +==== SpotterViz for Liveboards [earlyAccess eaBackground]#Early Access# You can now use SpotterViz in your embedding application to help your users build and edit Liveboards through a conversational interface. Instead of manually configuring charts and layouts, your users can describe what they want and SpotterViz generates the Liveboard for them, including the new tabs, chart types, data filters, and scheduled deliveries. For SpotterViz customization in embedded view, the Visual Embed SDK also provides several options to customize the SpotterViz panel experience. For more information, see xref:embed-spotterViz.adoc[SpotterViz in embedded Liveboards]. --- -[discrete] -==== Org isolation for per-org SAML and OIDC authentication -ThoughtSpot now enforces strict org isolation when users authenticate through a per-org identity provider (IdP). When a per-org IdP sends SAML or OIDC group claims that reference Orgs outside its authorized scope, ThoughtSpot silently drops those claims and records them as security audit events. This prevents a rogue IdP administrator in one Org from using group assertions to gain unauthorized access to another Org. Manually-assigned existing Org memberships are unaffected. - [discrete] ==== Spotter embedding Spotter file upload in embedded apps:: -Applications embedding Spotter interface can now allow their users to xref:embed-spotter.adoc#_enable_file_upload_in_spotter_chat[upload files directly in the Spotter chat panel]. +Applications embedding the Spotter interface can now allow their users to xref:embed-spotter.adoc#_enable_file_upload_in_spotter_chat[upload files directly in the Spotter chat panel]. Spotter conversation history:: You can now save your Spotter conversation and manage chat history using Spotter AI REST APIs. For more information, see xref:spotter-agent-conversation-mgmt-apis.adoc[APIs for managing saved conversations]. @@ -56,51 +56,64 @@ You can now save your Spotter conversation and manage chat history using Spotter --- [discrete] -==== Full application embedding +==== Focused home page experience [earlyAccess eaBackground]#Early Access# + In full application embedding with the V3 navigation and home page experience, ThoughtSpot provides an additional option to switch to the V4 focused home page experience. The focused home page experience provides a streamlined, contemporary experience along with the Spotter panel. For more information, see xref:full-app-customize.adoc[Customize full application embedding]. --- [discrete] -==== Webhooks enhancements [.version-badge.new]#New# +==== Webhooks enhancements ThoughtSpot introduces the following features and enhancements for webhook configuration and management: -* Centralized Webhooks page [.version-badge.new]#New# + -The *Develop* tab now includes a dedicated *Webhooks* page for creating, managing, and -monitoring webhooks within the Org context. For more information, see xref:webhooks-ux.adoc[Webhooks UI]. -* Retrieve storage configuration + +* New Webhooks page in the UI [earlyAccess eaBackground]#Early Access# + +The *Develop* page now includes a xref:webhooks-ux.adoc[dedicated *Webhooks* page] for creating, managing, and monitoring webhooks within the Org context. +* Storage configuration retrieval + The `GET /api/rest/2.0/webhooks/storage-config` REST API endpoint to xref:webhooks-api.adoc#_retrieving_storage_information_for_webhook_configuration[get storage configuration details]. -* GCS storage destination configuration for webhook delivery + +* GCS storage configuration for webhook delivery + Administrators can now xref:webhooks-gcs-storage.adoc[configure Google Cloud Storage (GCS) buckets as a storage destination] for webhook payload delivery on GCP-hosted ThoughtSpot clusters. * Webhook activation and deactivation + -You can enable or disable a webhook in the UI or through REST API. +You can enable or disable a webhook connection in the UI or through REST API. * Selective configuration reset + -The xref:webhooks-api.adoc#_updating_a_webhook[webhook update API endpoint] supports the `reset_options` parameter, which removes specific optional configuration sections (`AUTHENTICATION`, `SIGNATURE_VERIFICATION`, or `STORAGE_DESTINATION`) without replacing the full webhook configuration. +The xref:webhooks-api.adoc#_updating_a_webhook[webhook update API endpoint] supports the `reset_options` parameter to remove specific optional configuration sections without replacing the full webhook configuration. --- [discrete] -==== Liveboard browser cache refresh [.version-badge.new]#New# -The Liveboard browser cache feature is now in Early Access. When `enableLiveboardDataCache` is set to `true` in your `LiveboardEmbed` configuration, ThoughtSpot caches Liveboard visualization data in the browser to significantly reduce reload times on revisit. +==== SpotterCode Agent in Visual Embed Playground [earlyAccess eaBackground]#Early Access# -For SDK event and action IDs, see the xref:api-changelog.adoc#_liveboard_browser_cache_refresh[Liveboard browser cache refresh]. +The Visual Embed SDK Playground now includes SpotterCode Agent, an AI-powered coding assistant. The SpotterCode panel displays pre-built prompts relevant to the component you are embedding, a prompt interface for user queries, and generates embed code. It generates boilerplate code automatically, accelerates building code and iterating embed configurations. + +For more information, see xref:developer-playground.adoc#spottercode-panel[Using SpotterCode in the Playground]. --- [discrete] -==== REST API v2 -For information about REST API v2 enhancements in this release, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. +==== Liveboard browser cache refresh [earlyAccess eaBackground]#Early Access# +To improve load performance and reduce, you can now enable the Liveboard cache option with a **Refresh** button to allow your users to clear cache and refresh visualization data when required. This is an early access feature. + +For SDK event and action IDs, see the xref:api-changelog.adoc#_liveboard_browser_cache_refresh[Liveboard browser cache refresh]. --- [discrete] -==== Visual Embed SDK [.version-badge.breaking]#Breaking# -The Visual Embed SDK version 1.50.0 includes several new features, enhancements, and a breaking change. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. +==== Org isolation for per-org SAML and OIDC authentication +ThoughtSpot now enforces strict org isolation when users authenticate through a per-org identity provider (IdP). When a per-org IdP sends SAML or OIDC group claims that reference Orgs outside its authorized scope, ThoughtSpot silently drops those claims and records them as security audit events. This prevents a rogue IdP administrator in one Org from using group assertions to gain unauthorized access to another Org. Manually-assigned existing Org memberships are unaffected. +--- -⚠️*Breaking change*: `EmbedEvent.SpotterData` has been removed. Update your integration code to use `EmbedEvent.PreviewSpotterData`. +[discrete] +==== Visual Embed SDK +The Visual Embed SDK version 1.50.0 includes several new features and enhancements. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. --- + +[discrete] +==== REST API v2 +For information about REST API v2 enhancements in this release, see the xref:rest-apiv2-changelog.adoc[REST API v2.0 changelog]. + +--- + |===== == June 2026 @@ -117,7 +130,7 @@ a| a| [discrete] -==== Chart and table overrides [.version-badge.new]#New# +==== Chart and table overrides [.version-badge.new]#New# You can now apply visualization overrides to charts and tables generated from a search query in ThoughtSpot search and full application embedding. The `visualOverrides` property in `SearchViewConfig` and `AppViewConfig` allows developers to apply at the embed initialization time: * Chart overrides + @@ -141,7 +154,7 @@ This release introduces the following enhancements for Spotter AI workflows and Spotter now includes data literacy skills that help users understand the underlying data model. Users can ask Spotter to explain available data sources, fields, and relationships in plain language within a conversation session. * Spotter AI APIs: + ** New REST API endpoints to configure and retrieve persistent behavioral xref:spotter-agent-instructions.adoc[instructions for the Spotter agent]. -** New API endpoint xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[stop and cancel a long-running Spotter response]. +** New API endpoint to xref:spotter-agent-apis.adoc#_stop_an_in_progress_agent_response[stop and cancel a long-running Spotter response]. --- @@ -171,7 +184,7 @@ This release introduces new API endpoints for Spotter, connections and trusted a == May 2026 **Release version**: ThoughtSpot Cloud 26.5.0.cl + -*Upgrade notes*: ⚠️Includes breaking changes to Spotter APIs. Refer to the xref:rest-apiv2-changelog.adoc[REST API changelog] for more information. + +*Upgrade notes*: ⚠️ Includes breaking changes to Spotter APIs. Refer to the xref:rest-apiv2-changelog.adoc[REST API changelog] for more information. + *Recommended SDK versions*: Visual Embed SDK v1.48.0 and later @@ -188,7 +201,7 @@ a| ==== Liveboard downloads Continuous Liveboard PDF export [beta betaBackground]^Beta^:: -In PDF downloads, Liveboard tabs can now be rendered in a single page matching the UI layout. This feature can be enabled by setting `isContinuousLiveboardPDFEnabled` to `true` in the SDK. Setting this flag to `false` returns to the paginated PDF view. +In PDF downloads, Liveboard tabs can now be rendered in a single page matching the UI layout. This feature can be enabled by setting `isContinuousLiveboardPDFEnabled` to `true` in the SDK. Setting this flag to `false` returns to the paginated PDF view. Liveboard download in XLSX and CSV formats:: Embedded Liveboards can now be downloaded in the PDF, XLSX and CSV file formats. To enable this feature, ensure that the `isLiveboardXLSXCSVDownloadEnabled` parameter is set to `true`. @@ -253,7 +266,7 @@ This release introduces new Spotter API endpoints and modifications to the agent == April 2026 **Release version**: ThoughtSpot Cloud 26.4.0.cl + -*Upgrade notes*: ⚠️Variable update and delete API and metadata parameterization endpoints are deprecated and replaced with new API endpoints. Refer to xref:rest-apiv2-changelog.adoc#version_26_4_0_cl_april_2026[REST API changelog] and xref:deprecated-features.adoc[Deprecation announcements]. + +*Upgrade notes*: ⚠️ Variable update and delete API and metadata parameterization endpoints are deprecated and replaced with new API endpoints. Refer to xref:rest-apiv2-changelog.adoc#version_26_4_0_cl_april_2026[REST API changelog] and xref:deprecated-features.adoc[Deprecation announcements]. + *Recommended SDK versions*: Visual Embed SDK v1.47.0 and later [.cl-table, cols="2,4", frame=none, grid=none] @@ -328,7 +341,7 @@ The ListPage V3 experience provides a refreshed list layout and styling, includi * The **Views** column to show the number of views for each object. * Sorting options for **Name**, **Author**, and **Views** columns. -* Filter addition by clicking the column header without opening the filter modal. This option is available for **Favorites**, **Views** columns, and **Verified** columns. +* Filters can be added by clicking the column header without opening the filter modal. This option is available for **Favorites**, **Views** columns, and **Verified** columns. For more information, see xref:full-app-customize.adoc#_customize_list_page_experience[List page customization]. @@ -390,7 +403,7 @@ For information about REST API v2 enhancements, see the xref:rest-apiv2-changelo == March 2026 **Release version**: ThoughtSpot Cloud 26.3.0.cl + -*Upgrade notes*: ⚠️Includes feature deprecations. Refer to xref:rest-apiv2-changelog.adoc#_custom_access_token_api[REST API changelog] and xref:deprecated-features.adoc[Deprecation announcements]. + +*Upgrade notes*: ⚠️ Includes feature deprecations. Refer to xref:rest-apiv2-changelog.adoc#_custom_access_token_api[REST API changelog] and xref:deprecated-features.adoc[Deprecation announcements]. + *Recommended SDK versions*: Visual Embed SDK v1.46.0 and later [.cl-table, cols="2,4", frame=none, grid=none] @@ -474,7 +487,7 @@ For information about REST API v2 enhancements, see the xref:rest-apiv2-changelo == February 2026 **Release version**: ThoughtSpot Cloud 26.2.0.cl + -*Upgrade notes*: ⚠️Includes API parameter deprecations. Refer to xref:rest-apiv2-changelog.adoc[REST API changelog] and xref:deprecated-features.adoc[Deprecation announcements]. + +*Upgrade notes*: ⚠️ Includes API parameter deprecations. Refer to xref:rest-apiv2-changelog.adoc[REST API changelog] and xref:deprecated-features.adoc[Deprecation announcements]. + *Recommended SDK versions*: Visual Embed SDK v1.45.0 and later @@ -496,7 +509,7 @@ SpotterCode is available as an Early Access feature and can be integrated with d [discrete] ==== Spotter 3 experience [earlyAccess eaBackground]#Early Access# -You can now embed the Spotter 3 experience, which introduces several new capabilities, agentic analytics, and enhanced user experience. Spotter 3 is an Early Access feature and is disabled by default on ThoughtSpot embedded instances. +You can now embed the Spotter 3 experience, which introduces several new capabilities, agentic analytics, and an enhanced user experience. Spotter 3 is an Early Access feature and is disabled by default on ThoughtSpot embedded instances. For more information, see xref:embed-ai-analytics.adoc[Embed AI Search and Analytics] and xref:embed-spotter.adoc[Spotter embedding documentation]. From 6480a2b0fa645ba439a6b625432718d3eb692387 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 6 Jul 2026 22:53:05 +0530 Subject: [PATCH 122/136] added missing blurbs --- modules/ROOT/pages/rest-apiv2-changelog.adoc | 32 +++++++++++++++++++- modules/ROOT/pages/whats-new.adoc | 3 ++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index f2061ab9b..30dd9cbf5 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -60,7 +60,37 @@ The `/api/rest/2.0/jobs/history/communication-channels/search` API endpoint supp === Style customization APIs -ThoughtSpot introduces new public REST API v2.0 endpoints for programmatic style customization. These APIs allow embedding applications to upload custom fonts and configure visual styles at the cluster or Org level without using the ThoughtSpot Admin UI. +ThoughtSpot introduces the following REST API v2.0 endpoints to manage style customization settings programmatically. + +Style configuration:: + +* `POST /api/rest/2.0/customization/styles/search` + +Returns the current style configuration at the `CLUSTER` or active `ORG` scope. + +* `POST /api/rest/2.0/customization/styles/update` + +Updates style settings at the `CLUSTER` or `ORG` scope. + +Custom fonts:: + +* `POST /api/rest/2.0/customization/styles/fonts/upload` + +Uploads a custom font file to ThoughtSpot. + +* `POST /api/rest/2.0/customization/styles/fonts/search` + +Returns custom fonts uploaded to the instance. +//Use the `include_font_assignments` parameter to include information about which visualization elements each font is assigned to. + +* `PUT /api/rest/2.0/customization/styles/fonts/{font_identifier}/update` + +Updates the display name, weight, style, or color of an existing custom font. + +* `POST /api/rest/2.0/customization/styles/fonts/delete` + +Deletes one or more custom fonts from the font library. + +Logo export:: + +* `POST /api/rest/2.0/customization/styles/logos/export` + +Exports the current logo files as a ZIP archive containing the default logo and the wide logo. + +For more information, see xref:customize-style-api.adoc[Style customization APIs]. === Manual translation APIs The manual translation API endpoints allow you to import, export, and delete translations of terms and labels that can be presented to the user based on their locale settings. diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 1702e051e..479802e0f 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -53,6 +53,9 @@ Applications embedding the Spotter interface can now allow their users to xref:e Spotter conversation history:: You can now save your Spotter conversation and manage chat history using Spotter AI REST APIs. For more information, see xref:spotter-agent-conversation-mgmt-apis.adoc[APIs for managing saved conversations]. +Spotter Agent instructions:: +You can configure and retrieve behavioral instructions for the Spotter agent using REST APIs. For more information, see xref:spotter-agent-instructions.adoc[Spotter AI agent instructions APIs]. + --- [discrete] From c99f50cdd28f2f14dcef8aa10889e3b0f93e26fe Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 6 Jul 2026 23:08:24 +0530 Subject: [PATCH 123/136] formatting fix --- modules/ROOT/pages/rest-apiv2-changelog.adoc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index 30dd9cbf5..0cad327a6 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -15,9 +15,7 @@ This changelog lists the features and enhancements introduced in REST API v2.0. Save chat AI APIs:: ThoughtSpot introduces the following REST API endpoints and enhancements to manage saved Spotter conversations programmatically. These endpoints allow you to build custom conversation history interfaces in embedded applications without using the native Spotter UI. -* `POST /api/rest/2.0/ai/agent/conversation/create` + -This API endpoint is modified to allow users to save conversations by setting `enable_save_chat: true` in the API request. -`POST /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/update` + +* `POST /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/update` + Updates attributes of an existing agent conversation. * `GET /api/rest/2.0/ai/agent/conversations` + Retrieves the list of saved agent conversations for the currently authenticated user. @@ -30,8 +28,13 @@ Deletes a saved conversation and all its associated messages. * `GET /api/rest/2.0/ai/agent/conversations/{conversation_identifier}/answers/{answer_identifier}/details` + Loads the full answer payload for a specific answer item in an agent conversation. ++ For more information, see xref:spotter-agent-conversation-mgmt-apis.adoc[Saving and managing Spotter AI chat]. +Save chat settings in conversation create API:: + +The `POST /api/rest/2.0/ai/agent/conversation/create` API endpoint is modified to allow users to save conversations by setting `enable_save_chat: true` in the API request. + Agent instructions APIs:: The following new API endpoints allow you to set and retrieve persistent behavioral instructions for the Spotter agent. @@ -40,7 +43,7 @@ Sets behavioral instructions for the Spotter agent. Use this endpoint to define * `GET /api/rest/2.0/ai/agent/instructions/get` + Retrieves the behavioral instructions currently configured by the administrator for the Spotter agent. - ++ For more information, see xref:spotter-agent-instructions.adoc[Spotter AI Agent instructions APIs]. === Webhooks From a783e0dd54dfb771d275811e9ea9e2dfe44e79d2 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Mon, 6 Jul 2026 23:20:32 +0530 Subject: [PATCH 124/136] minor edits --- modules/ROOT/pages/api-changelog.adoc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/ROOT/pages/api-changelog.adoc b/modules/ROOT/pages/api-changelog.adoc index fdb18a2de..da7ec9f9f 100644 --- a/modules/ROOT/pages/api-changelog.adoc +++ b/modules/ROOT/pages/api-changelog.adoc @@ -19,8 +19,7 @@ This page documents the changes introduced in each release of the Visual Embed S ===== SpotterViz embed customization The Visual Embed SDK 1.50.0 introduces the `SpotterVizConfig` interface and `SpotterVizStarterPrompt` interface to allow embed developers to customize the SpotterViz panel on embedded Liveboards and full-application embeds. -`SpotterVizConfig` interface:: -A new `SpotterVizConfig` interface is available on `LiveboardViewConfig` and `AppViewConfig` via the `spotterViz` object. This object provides branding customization controls for customizing the SpotterViz panel experience. +A new `SpotterVizConfig` interface is available on `LiveboardViewConfig` and `AppViewConfig` for the `spotterViz` object. This object provides branding customization controls for customizing the SpotterViz panel experience. To customize app interactions, visibility of the UI elements, and style and appearance of the SpotterViz panel, the SDK also introduces CSS variables, action IDs, and embed and host event identifiers. For more information, see xref:embed-spotterViz.adoc[SpotterViz in embedded Liveboards]. From a51d795ec145a09e7e985646d6f163c770eae0f4 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 7 Jul 2026 07:20:47 +0530 Subject: [PATCH 125/136] merge conflict fixes --- modules/ROOT/pages/rest-apiv2-changelog.adoc | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ROOT/pages/rest-apiv2-changelog.adoc b/modules/ROOT/pages/rest-apiv2-changelog.adoc index b5741eb03..0cad327a6 100644 --- a/modules/ROOT/pages/rest-apiv2-changelog.adoc +++ b/modules/ROOT/pages/rest-apiv2-changelog.adoc @@ -45,7 +45,6 @@ Sets behavioral instructions for the Spotter agent. Use this endpoint to define Retrieves the behavioral instructions currently configured by the administrator for the Spotter agent. + For more information, see xref:spotter-agent-instructions.adoc[Spotter AI Agent instructions APIs]. -//// === Webhooks From 72f633819ddd0a108add172fc9118c151e10a481 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 7 Jul 2026 07:50:48 +0530 Subject: [PATCH 126/136] webhook nav fix --- src/components/SecondaryHeader/index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/SecondaryHeader/index.tsx b/src/components/SecondaryHeader/index.tsx index 352945ae5..e49e3c408 100644 --- a/src/components/SecondaryHeader/index.tsx +++ b/src/components/SecondaryHeader/index.tsx @@ -67,6 +67,8 @@ export const CATEGORY_PAGEIDS: Record = { 'orgs-api-op', 'tse-cluster', 'external-tool-script-integration', 'pendo-integration', 'sf-integration', 'vercel-integration', 'embed-ts', 'get-started-tse', 'license-feature-matrix', 'faqs', 'code-samples', + 'webhooks-overview', 'webhooks-ui', 'webhooks-comm-channel', 'webhooks-lb-schedule', + 'webhooks-s3-integration', 'webhooks-gcs-storage', 'webhooks-lb-payload', 'webhooks-kpi', ], embedding: [ 'getting-started', 'tsembed', 'embed-liveboard', 'embed-a-viz', @@ -103,8 +105,7 @@ export const CATEGORY_PAGEIDS: Record = { 'fetch-data-and-report-apis', 'rest-api-sdk', 'rest-api-sdk-typescript', 'rest-api-sdk-java', 'rest-api-getstarted', 'api-auth-session', 'catalog-and-audit', 'rest-api-pagination', 'runtime-sort', 'v1v2-comparison', 'graphql-guide', - 'webhooks', 'webhooks-comm-channel', 'webhooks-s3-integration', 'webhooks-lb-schedule', - 'webhooks-lb-payload', 'webhooks-kpi', 'rest-v2-changelog', 'rest-v1-changelog', + 'webhooks-rest-api', 'rest-v2-changelog', 'rest-v1-changelog', ], 'mcp-server': [ 'mcp-integration', 'connect-mcp-server-to-clients', From 6d15cba51911baf4503ee7e2f3816b2f91ff34bf Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 7 Jul 2026 07:59:24 +0530 Subject: [PATCH 127/136] edits --- modules/ROOT/pages/whats-new.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 479802e0f..9e770babe 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -26,7 +26,7 @@ This page lists new features, enhancements, and deprecated functionality introdu == July 2026 **Release version**: ThoughtSpot Cloud 26.7.0.cl + -*Upgrade notes*: No breaking changes. + +*Upgrade notes*: No breaking changes + *Recommended SDK versions*: Visual Embed SDK v1.50.0 and later [.cl-table, cols="2,4", frame=none, grid=none] From 237513dc48d5346fb8ac9ddf401067121717f37f Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 7 Jul 2026 08:36:27 +0530 Subject: [PATCH 128/136] lb doc edits --- modules/ROOT/pages/common/nav-embedding.adoc | 1 - modules/ROOT/pages/embed-pinboard.adoc | 51 ++++++++++++------ modules/ROOT/pages/runtime-filters.adoc | 40 +++++++------- modules/ROOT/pages/whats-new.adoc | 14 +++-- .../doc-images/images/liveboard-refresh.png | Bin 0 -> 131073 bytes 5 files changed, 58 insertions(+), 48 deletions(-) create mode 100644 static/doc-images/images/liveboard-refresh.png diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc index 016ecf47f..004467551 100644 --- a/modules/ROOT/pages/common/nav-embedding.adoc +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -14,7 +14,6 @@ Embed ThoughtSpot in a web app ** link:{{navprefix}}/embed-spotter-agent[Embed Spotter Agent] * link:{{navprefix}}/embed-liveboard[Embed Analytics] ** link:{{navprefix}}/embed-liveboard[Embed a Liveboard] -** link:{{navprefix}}/embed-liveboard[Embed a Liveboard] ** link:{{navprefix}}/spotterViz-agent[SpotterViz AI agent in Liveboards] ** link:{{navprefix}}/embed-a-viz[Embed a visualization] * link:{{navprefix}}/full-embed[Embed full application] diff --git a/modules/ROOT/pages/embed-pinboard.adoc b/modules/ROOT/pages/embed-pinboard.adoc index 17031b39c..131108899 100644 --- a/modules/ROOT/pages/embed-pinboard.adoc +++ b/modules/ROOT/pages/embed-pinboard.adoc @@ -56,6 +56,7 @@ const liveboardEmbed = new LiveboardEmbed(document.getElementById('ts-embed'), { liveboardId: '<%=liveboardGUID%>', }); ---- + For more information about the Liveboard embed object, classes, methods, interface properties, and enumeration members, see the following pages: * xref:LiveboardEmbed.adoc[LiveboardEmbed] @@ -159,7 +160,7 @@ The `activeTabId` property is available only in the `LiveboardEmbed` package and === Reduce visible tabs and visualizations `visibleVizs` and `visibleTabs` allow you to limit the experience for certain users on a Liveboard with many more elements. -For example, a template Liveboard with many different KPIs could be reduced to a smaller set by giving a user an interface to select the particular visualizations to show, storing their selections, and using that saved set of visualization GUIDs as the array for `visibleVizs` on page load (there is an equivalent xref:embed-events.adoc[HostEvent] called `SetVisibleVizs` to make an update after the Liveboard has loaded). +For example, a template Liveboard with many different key performance indicators (KPIs) could be reduced to a smaller set by giving a user an interface to select the particular visualizations to show, storing their selections, and using that saved set of visualization globally unique identifiers (GUIDs) as the array for `visibleVizs` on page load (there is an equivalent xref:embed-events.adoc[HostEvent] called `SetVisibleVizs` to make an update after the Liveboard has loaded). [#noteTiles] === Add Note tiles @@ -170,14 +171,21 @@ You can add a link:https://docs.thoughtspot.com/cloud/latest/liveboard-notes[Liv * If you are adding links and images from an external site, or embedding multimedia or a web page in an iFrame, make sure the URLs are added to CORS and CSP allowlists. For more information, see xref:security-settings.adoc[Security settings]. === Redefine Liveboard breakpoint widths -When enabled, the `enable2ColumnLayout` allows you to customize the Liveboard breakpoint width for embedded users. +The `enable2ColumnLayout` property, when enabled, allows you to customize the Liveboard breakpoint width for embedded users. The current 12 column layout changes to 2 columns per row at 1024px, and to 1 column per row layout at 630px in the new Liveboard experience. Once enabled, these breakpoints apply to all Liveboards in the ThoughtSpot instance, and cannot be set only for individual Liveboards. These breakpoint widths are customizable for the embedded customers. Contact ThoughtSpot support for assistance with customization. [#liveboard-data-cache] === Liveboard browser cache and refresh -To improve load performance for users who revisit the same Liveboard within a session, set `enableLiveboardDataCache` to `true`, so the embedded Liveboard caches visualization data in the browser. +ThoughtSpot supports browser-side data caching for Liveboards to improve load performance for users who revisit the same Liveboard within a session. Users can clear cache by clicking the refresh icon in the Liveboard header. + +[NOTE] +==== +Liveboard browser cache and refresh is an Early Access feature and is disabled by default on ThoughtSpot instances. To enable this feature on your instance, contact ThoughtSpot support. +==== + +To enable Liveboard data caching, set `enableLiveboardDataCache` to `true`. [source,javascript] ---- @@ -191,9 +199,15 @@ const liveboardEmbed = new LiveboardEmbed('#embed-container', { }); ---- -When browser cache is enabled, the *Refresh* button appears in the Liveboard header. Users can click this button to clear the browser cache and fetch fresh data from the data warehouse on demand. +When data caching is enabled, the refresh icon appears in the Liveboard header. Users can click this button to clear the browser cache and fetch fresh data. + +[.bordered] +[.widthAuto] +-- +image::./images/liveboard-refresh.png[Liveboard refresh] +-- -The Visual Embed SDK provides the following action and event IDs to customize the cache refresh visibility and workflow. +The Visual Embed SDK also provides the following action IDs and events to customize the cache refresh visibility and workflow. [width="100%",cols="2,1,4"] |==== @@ -213,12 +227,14 @@ The Visual Embed SDK provides the following action and event IDs to customize th |==== === Customize filters - To view specific data across the tables and charts on an embedded Liveboard, users can use Liveboard filter options. By default, Liveboard filters cannot be applied at load. You can either embed a Liveboard that already includes filters or use the xref:runtime-filters.adoc[runtime filters] feature in the Visual Embed SDK to apply filters at load time. -WARNING: The SDK processes at most 49 entries per embed. Any objects at index 50 or -beyond are silently dropped without an error or warning. See -xref:runtime-filters.adoc#_maximum_filter_count[Runtime filter limit] for more information. +[IMPORTANT] +==== +The SDK processes up to 49 runtime filters per embed. Any objects at index 50 or +beyond are silently dropped without an error or warning. For more information, see +xref:runtime-filters.adoc#_maximum_filter_count[Runtime filter limit]. +==== ==== Customizing filter visibility To hide filters in an embedded Liveboard, you can use the following options: @@ -257,7 +273,6 @@ For more information and examples, see xref:filters_overview.adoc[Filter types a Embedding application users can download Liveboards in the PDF, XLSX, and CSV formats. If the `isContinuousLiveboardPDFEnabled` is set to `true`, users can download the PDF with a continuous layout as seen in the UI, with each tab on a single page. When this parameter is set to `false`, users can download the Liveboard PDF in the A4 format with a paginated view. - [NOTE] ==== Starting with ThoughtSpot Cloud version 26.5.0.cl and Visual Embed SDK version 1.48.x, the new multi-format download experience is available on embedded Liveboards and can be enabled using the `isContinuousLiveboardPDFEnabled` and `isLiveboardXLSXCSVDownloadEnabled` parameters. The `Download` action in the Liveboard's more options menu is controlled by `Action.DownloadLiveboard` instead of `Action.Download` and `Action.DownloadAsPdf`. `Action.DownloadAsPdf` remains valid for controlling PDF download on individual visualizations (chart and table tiles) within a Liveboard. @@ -277,7 +292,7 @@ const embed = new LiveboardEmbed('#tsEmbed', { ==== Download actions and behavior [width=100%, cols="2,2,4"] -[options='header'] +[options="header"] |===== | Download actions | SDK parameter @@ -358,20 +373,22 @@ Use the HostEvent IDs to trigger download actions on an embedded Liveboard. * `HostEvent.DownloadLiveboardAsContinuousPDF` + To open the **Download** modal with the continuous PDF download option selected. * `HostEvent.DownloadAsPdf` + -To trigger the standard PDF (A4) download action. To download a specific Liveboard visualization, specify the GUID of visualization in the `vizId` key. +To trigger the standard PDF (A4) download action. To download a specific Liveboard visualization, specify the GUID of the visualization in the `vizId` key. * `HostEvent.DownloadAsXlsx` + To open the **Download** modal with the XLSX option selected when the `isLiveboardXLSXCSVDownloadEnabled` is enabled in the embed view. * `HostEvent.DownloadAsCsv` + To open the **Download** modal with the CSV option selected when `isLiveboardXLSXCSVDownloadEnabled` parameter is enabled in the embed view. -=== Liveboard grouping and styling [earlyAccess eaBackground]#Early Access# +=== Liveboard grouping and styling +[earlyAccess eaBackground]#Early Access# + You can now create a visual group of Answers and note tiles together in the Liveboard. You can select multiple Answers and notes in the Liveboard editor. You can also style parts of the Liveboard, groups and Answers with the new styling panel. To enable this feature, set `isLiveboardMasterpiecesEnabled` to `true`. Note the following changes that occur in the Liveboard UI and layout when this feature is enabled. -* All tiles on the Liveboard will now have a default border and an increased border-radius, resulting in more pronounced curved corners. This is part of the broader visualization tile customization options to enhance the visual appearance of charts and tables. -* For Note tiles, the default scrollbar is now hidden for long content. Users must scroll within the tile area itself, and if the tile is not sized appropriately for its content, it may appear clipped due to the new container styles. This change emphasizes the importance of properly sizing Note tiles to avoid content being visually cut off. -* If a Liveboard is saved with Groups in the ThoughtSpot interface, but the embedding code does not have the grouping and styling feature enabled, the Liveboard will fail to load and throw an error. +* All tiles on the Liveboard now have a default border and an increased border-radius, resulting in more pronounced curved corners. This is part of the broader visualization tile customization options to enhance the visual appearance of charts and tables. +* For Note tiles, the default scrollbar is now hidden for long content. Users must scroll within the tile area itself, and if the tile is not sized appropriately for its content, it may appear clipped due to the new container styles. This change emphasizes the importance of sizing Note tiles correctly to avoid content being visually cut off. +* If a Liveboard is saved with Groups in the ThoughtSpot interface, but the embedding code does not have the grouping and styling feature enabled, the Liveboard fails to load and returns an error. + [.bordered] [.widthAuto] @@ -379,7 +396,7 @@ Note the following changes that occur in the Liveboard UI and layout when this f image::./images/lb-grp-styling-error.png[Liveboard with groups styling error] -- + -To embed a Liveboard that uses Groups, you must set `isLiveboardMasterpiecesEnabled` to `true` in your embedding configuration. This is required for compatibility with the new grouping and styling features; otherwise, the embedded Liveboard will not render correctly. +To embed a Liveboard that uses Groups, you must set `isLiveboardMasterpiecesEnabled` to `true` in your embedding configuration. This is required for compatibility with the new grouping and styling features; otherwise, the embedded Liveboard does not render correctly. For more information, see link:https://docs.thoughtspot.com/cloud/latest/liveboard-grouping-styling[Liveboard grouping and styling, window=_blank]. diff --git a/modules/ROOT/pages/runtime-filters.adoc b/modules/ROOT/pages/runtime-filters.adoc index 13b7fce33..338c9a5d5 100644 --- a/modules/ROOT/pages/runtime-filters.adoc +++ b/modules/ROOT/pages/runtime-filters.adoc @@ -6,7 +6,7 @@ :page-pageid: runtime-filters :page-description: Apply filters to visualizations at runtime and pass them as URL parameters -Runtime filters allow you to apply filters on a Liveboard, Answer, visualization, or conversation session with Spotter. These filters are not persistent filters saved in the object, but are applied dynamically at runtime. You can use runtime filters to pre-filter content for your application users based on context and embedding app's requirements. +Runtime filters allow you to apply filters on a Liveboard, Answer, visualization, or conversation session with Spotter. These filters are not persistent filters saved in the object, but are applied dynamically at runtime. You can use runtime filters to pre-filter content for your application users based on context and the embedding app's requirements. == Overview @@ -47,30 +47,28 @@ Some operators like `EQ` and `LE` accept a single operand, whereas `BW_INC_MAX`, === Maximum filter count -The SDK processes a maximum of *49 runtime filters* per embedded object. +The SDK processes a maximum of 49 runtime filters per embedded object. -NOTE: The internal constant `MAX_RUNTIME_FILTERS` is set to `50`, but the +The internal constant `MAX_RUNTIME_FILTERS` is set to `50`, but the parsing loop runs from index `1` up to (but not including) `50` (`index < MAX_RUNTIME_FILTERS`). This means filter values `col1`/`op1`/`val1` through `col49`/`op49`/`val49` are processed; `col50` and above are ignored. This applies to both input paths: -* URL query parameters — filter values appended to the embed URL +* URL query parameters: filter values appended to the embed URL (`col1=`, `op1=`, `val1=`, `col2=`, …) -* `runtimeFilters` embed config property — filters passed as an array in the -SDK initialisation config for `LiveboardEmbed`, `AppEmbed`, and +* `runtimeFilters` embed config property: filters passed as an array in the +SDK initialization config for `LiveboardEmbed`, `AppEmbed`, and `SearchEmbed` +[IMPORTANT] +==== When the number of runtime filters exceeds 49, filters beyond that index are silently dropped. No error is thrown, no warning is emitted, and no embed event is fired. The embedded object renders using only the first 49 filters -without any indication that additional filters were discarded. - -IMPORTANT: This silent-drop behaviour means that, if your application passes 60 -runtime filters, the last 11 are ignored without any notification to the -developer. Always validate filter counts in your application -before passing them to the SDK. +without any indication that additional filters were discarded. This silent-drop behavior means that, if your application passes 60 runtime filters, the last 11 are ignored without any notification to the developer. Always validate filter counts in your application before passing them to the SDK. +==== === Supported data types @@ -168,7 +166,7 @@ new Date('2020-05-22').getTime() / 1000 == Runtime filters in Visual Embed SDK -If you are embedding Spotter, Liveboard, visualization or the full application using Visual Embed SDK, you can apply filters using the `runtimeFilters` property. In the full app embed mode, ThoughtSpot applies runtime filters on all Liveboard, visualization, and Answer objects in the embedded app. +If you are embedding Spotter, Liveboard, visualization, or the full application using the Visual Embed SDK, you can apply filters using the `runtimeFilters` property. In the full app embed mode, ThoughtSpot applies runtime filters on all Liveboard, visualization, and Answer objects in the embedded app. The following example shows how to apply runtime filters on an embedded visualization in the SDK. Here, the runtime filter is operating on the `Revenue` column to filter the data matching `100000`. @@ -239,7 +237,7 @@ const liveboardEmbed = new LiveboardEmbed('#tsEmbed', { If the Liveboard or Answer already has one or more filters applied, runtime filters will act as an `AND` condition. This means that all filter conditions, including those supplied in the runtime filters and Liveboard filter, must match to get the desired data. -In the following example, the OR condition is applied; That is, if at least one condition matches, the Liveboard returns data. +In the following example, the OR condition is applied; that is, if at least one condition matches, the Liveboard returns data. .Example for OR condition [source,JavaScript] @@ -292,7 +290,7 @@ a| ---- | `NE` + -Not exactly or Not equal to + +Not equal to + Number of values allowed: 1 a| [source,JavaScript] ---- @@ -368,7 +366,7 @@ a| }] ---- -See also, xref:runtime-filters.adoc#_and_and_or_conditions_in_filters[AND/OR conditions in filters], for information about the AND and OR condition for filters. +See also, xref:runtime-filters.adoc#_and_and_or_conditions_in_filters[AND/OR conditions in filters], for information about the AND and OR conditions for filters. | `BEGINS_WITH` + begins with + @@ -475,7 +473,7 @@ The following video shows how to apply multiple runtime filters on a Liveboard. -- video::./images/runtime-filters.mp4[width=100%,options="autoplay,loop"] ++++ - Copy sample code + Copy sample code Try it out in Playground ++++ @@ -532,7 +530,7 @@ https://{ThoughtSpot-Host}/?embedApp=true&col1=State&op1=EQ&val1=michigan&col2=p ==== URL format when embedding without SDK -If embedding a ThoughtSpot Liveboard without the SDK, ensure that add the runtime filters before `#/path` in the URL as shown in the following example: +If embedding a ThoughtSpot Liveboard without the SDK, ensure that you add the runtime filters before `#/path` in the URL as shown in the following example: ---- https://{ThoughtSpot-Host}/?embedApp=true&col1=State&op1=EQ&val1=michigan#/embed/viz/{Liveboard_id}/{visualization_id} ---- @@ -581,7 +579,6 @@ curl -X POST \ * `POST /api/rest/2.0/report/answer` + Allows downloading Answer data in PDF, XLSX, CSV, and PNG format. - + [source,cURL] ---- @@ -661,13 +658,12 @@ curl -X POST \ * `POST /api/rest/2.0/metadata/answer/data` + Gets data from a saved Answer. - + [source,cURL] ---- curl -X POST \ --url 'https://{ThoughtSpot-Host}/api/rest/2.0/metadata/answer/data' \ - -H 'Authorization: Bearer {access-token}'\\ + -H 'Authorization: Bearer {access-token}'\ -H 'Accept: application/json'\ -H 'Content-Type: application/json' \ --data-raw '{ @@ -712,7 +708,7 @@ https://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/pinboarddata?id={Liveboard_id https://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/pinboarddata?id=543619d6-0015-4667-b257-eff547d13a12&vizid=%5B%224ff5b939-453d-40ff-8fc2-a1d972047c86%22%5D&col1=State&op1=EQ&val1=California ---- -The following is another example of a REST API request URL with a filter. Here the runtime filter is operating on the column `Category` and returning values that are equal to `mfgr%2324`. +The following is another example of a REST API request URL with a filter. Here, the runtime filter is operating on the column `Category` and returning values that are equal to `mfgr%2324`. ---- https://{ThoughtSpot-Host}/callosum/v1/tspublic/v1/pinboarddata? diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index 9e770babe..e196de200 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -92,14 +92,6 @@ For more information, see xref:developer-playground.adoc#spottercode-panel[Using --- -[discrete] -==== Liveboard browser cache refresh [earlyAccess eaBackground]#Early Access# -To improve load performance and reduce, you can now enable the Liveboard cache option with a **Refresh** button to allow your users to clear cache and refresh visualization data when required. This is an early access feature. - -For SDK event and action IDs, see the xref:api-changelog.adoc#_liveboard_browser_cache_refresh[Liveboard browser cache refresh]. - ---- - [discrete] ==== Org isolation for per-org SAML and OIDC authentication ThoughtSpot now enforces strict org isolation when users authenticate through a per-org identity provider (IdP). When a per-org IdP sends SAML or OIDC group claims that reference Orgs outside its authorized scope, ThoughtSpot silently drops those claims and records them as security audit events. This prevents a rogue IdP administrator in one Org from using group assertions to gain unauthorized access to another Org. Manually-assigned existing Org memberships are unaffected. @@ -171,6 +163,12 @@ The legacy REST Playground v1 has been removed from the left navigation. This ch * Removal of GraphQL playgrounds + The menu link to the GraphQL playground has been removed from the UI. +[discrete] +==== Liveboard browser cache refresh +To improve load performance and reduce, you can now enable the Liveboard cache option with a **Refresh** button to allow your users to clear cache and refresh visualization data when required. For more information, see xref:api-changelog.adoc#_liveboard_browser_cache_refresh[Liveboard browser cache refresh]. + +--- + [discrete] ==== Visual Embed SDK The Visual Embed SDK version 1.49.0 includes several new features and enhancements. For more information, see the xref:api-changelog.adoc[Visual Embed changelog]. diff --git a/static/doc-images/images/liveboard-refresh.png b/static/doc-images/images/liveboard-refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc8dfe50f9de6bc20748c408a78f11bda9e3723 GIT binary patch literal 131073 zcmb4q1yrOv(l#(KH10N7V6?(Q(SySux~Aj9D9?(S}b%i!(|{&RQt`*zRw-#vS` z`@ARVBu}c6RH`cVro-iB#o(a7K!bpQz)6S;D}sPP(u072;{!f_lz2t?-hzO@%9slY z$x8?c0p%TRznWW_fPjdHC#ylKD~+IMYbg?d1BCe{4`mSJk@+P7G`BH8N&+ZE$tWm+ zff(wx080#{@X&b`o4?1yQt_#Sp1-$o%~^@f5Gf3$~rl*`jIo>>-@;$MsqNYWmpF^nrKTf-hRFfg;+(fc7O$N1snT<`YP7!B3-w+|C|QSedm3MW&Y#{2Od@GqD z?p|)I2mSElS2<;pTzdFeS165#?4BAS38r^ zyInW~AGhinrD}XXRJ81+=fU5u8v@i10=2p@5DSPM#^v$NV>_#q3~=cWYYc{DhiMoh zMhtf^zQqEM8n8)#4Ei|C{@$aDMDF)eq)?uK5^Gml_GuXNSgCZ^ZwT?gpFR%e0xeK7 z0SN)QhiEwLeH#g16*P(fL)GNH>mYQQ4i=JeTPVuVO%&bxX9A`;EHDHyFs!i|^gPgW zd;9VjvW#hRkSFBVZ$mjZ=|f^}pf-sUl8r0|#)zmp7HI2tpJ{oY*{(?h8weI1d*3ze zQX!MfaBL9BHHgW+9`Eh(%D6rF$BJ=i%cT2F!r#YGaLWpr1F?oo9{C|zAtzxG zj7xe4VtbZP;+-u-Jb4EPKFQt$R(+ychMNYE)pI}XPpKCpSU}NTP%Q^nYWgI(Yj^PA zDx0^L4Iy7g{5kWM##714#`D)oHcEz$@=EFSn7Q;G868Z;4~F~GH6E$qUyQ=kxx>5d zamJQMmf=A5-o@_RJ<*tc>j|Wt={1vdfo^#_>FaMD&}knkfcQ9t<^&1pv17BoG!%o{ z?Z@#GP|4djUkm!_!E<^&-}*DqL$cE2nQnb<_rnK(=K`Vo1C8n7JaQnGT42Y)Zn_QS z!A83!tKpRcX!N;?K|Q;DrolCP>@Q*15oiO-wpg`!*0(qgKUMWWf(wWP;0%CIVNizQ zKZzy**jEBz@pi=M5~8zl(!v4caqh#&`LG(%%7m+Nn!94Vhz>X$kxqnc@z3H2*JRgt z1M<$wkSu}~(^ur!d*2PrxH-`#giU`0n=!QFRPdM0teX*e;PAxiinL81nDKq4XNd|= zH-yK;{$;434xQpZQVpR_p&FxN1g8$;HJMsNTaMuwiemqHvKMy?8omd`4wM%~&yTK; z>gr275?{F9;KeWR-=<*E`r_4OZpdyyBSF%=)PhjCnbnDQadyz1QtLrW!i4b>^`xzR zt_fG2|Od;P(^kUuO&$G;quq>^YW$gZDzGMFjKe#R>&8#r6`vAhHCT@*NN74ufwU zouP=H`O)j#5ZCNVG?EjdXyHzkUH2tgI#t|L^eycuv+G-a?!yn#V5}v=9}!3 z_@?t|t$PwUsGrjFHBjkuhmrH3M>JX#4Q`w7DUHzl^d$YFUFEh*pG%()kx`yLQOV5b zJQUH6L1`ntUsk^w2F0R0r7=l)NevSlNX2BbYn(K2RB6isoD&vIEzG_cmeQ|(T`_p- z8DF99DId0~TGnwaK zQR`t*VLDMqTVL7KX(Uv4)sSwkWbHVRVm8(|QL}FBIRoF|*f3UGR@x)ZyOU^+VXbDkX5?zXE%J)ums&I*&s$w$nNsB(e9%gBxBv=B?TAkzN^%{QDUglA)fSI~j^-jxSSx{ugQL%F@DwXc(bGJ<-m>su+?naw*q}Dc zL6}!%BeUug+tV2|_5fSNGXyV$3WTjG$s{MemSv-{%QH?JhtvT#1uW%@0WGf@eUo+e zQTxEn`P9MqW+RA3T<3S|+{fOX;PuD=j0NgK+DVNU%Xp=k;~!lq#5Cp%awC5=gzy6&D_#$129?p$!D$ZEG5933bc9JMeO)n3=ej)9L&dh=~RM_fRrm{MP; zZ#Np=NbX3Ej9Qj?sV$T*YU(sUZD)kBL|bZDN-e!L*gUn??a}UOEh;ThExM`%sWIDD z|EzZC8yYPiEmL_@@nrjAquqKnLAqTi_3f3F&5B_~v2pKJ^=c7&HK2(_RZAt+mdu9k z=bM|@PRtx%wQupdd3BxDL6J^^jt)x=3z_A*rR53iiRygbUBpxNdPy7IIn>X&wXNxD zYdS~UW!`GJnv3OFb3WZw{Kl>`kZ1lrxfDKY?qPQIl`!T>^Ha-Fi(?B}n{#edkK&4f zvc0XT7`_V&7V8Sma!wrH_>O6XOOeAv1d>ghX(-HqjS!Qd<8q4hPq&c83YnOn^Mo*g+=$bI5N z>;0D7wCh^2$<|rzel>^h<6HkAbAIAO;mL7%P^izi7k^u`lXzB?GG&l+0lNzaEB?s%wxtU4X*5sfGl=gwm|qGk$fs=V z5+&t>zMg>M$@)OR3t2g*5IlObqq(2wQ<`pbTMK-5CoYJ(fVT%F$P6>c4i5;Y{f;;; z?-*P*S8_05>a*4yU%^2^ps$j$>1@>t-a1%8DGcWN8w{dqAnlDsn*PW6BE>{q;;W1d z2<1l}00IGu4D#tC2m0{^0sR63@wYq(h$JZX|K=4z$^X#?38FGc5Xg^T$RAJ8cd-9y4N3p~)Bohb@jvQ71eAm%BtB9lBL@=`8%Hx+r^iI< z^^XE5J8=z15D;{dKORsCMdC{k5U^!)WpyWY8EH-2C@NZ3=EO`jkW#oZEwhkshR$6*mdO}`kAP~sy zVEmO+QCRdJ@Q+_Sgl0}ocARu{uCA`Mu1vJH4yJSr92^{U^o(?jj5HrDXdK;boDAG( zY#fRH-pT*;BW&Vm+WNvE%{G(q3LtAGj9zw!D2>tKp?|hoLng5fLjpILt^)W!Y zKWgY0XzA(x4CZA1_20n$sQEkWZ{zwqIqp9?JQd<89A8gx&KDz z|Eu~Zr+>Ffjfr&3~!-7w8{@;8Zkm zw6${nV-i(t%$;~YV1HKpe^DC$gz+*kGyenhuciMNq5h|ce=YsL2ssDykBKn&gEd}; ze^B_>vVXMaru$>@|3w)7E@^)&{SY-?Xl}ay62#$-$jLDlL+r=c4j=O4aGTQ+asnf+YB8dSXh@_Sad2p;f;#3+(T4t%HP&CA zXhCdHI};6!RB|FBA+OrQ1mGkz)THzaT?=ErJ>ffwMA-OT3?q~9yM&}H3-j3UaQ^Qb z3~~mF^x4@t6CWpKR5Ti7F%l_M3> zALNX^ECo0e<0gM~Q9hQBUsnW3#FQB1Phev5)dVFCy|*@w{zZwnkdU51j0ZQuQ5Agu z5eCZXw4WlBQnmdDPBOXfxB)Jz$2d7B5gnZln5VQdJ8Q;|yu3`x-v36B{9j@~VBZKM zh2=FhISV3Ut07Q@3)31TwL`E92P9F{{SslEk>}8^ksTGli{-Kqn-*9k|MvhaRM47 zB$N$fA#LQug!M&4>(OKy>!z$#@WRPkLYhZi`*vb!O#|=nv{Wm1a|~Nr00X$))S#Yt z;hAUbTucYq;ns|!({4Wmrz3AVqwwWgdHGmEdp}HIFp?b>=v8pQI^*`X0V)A+un|#- z;j*D}gCSI@N&_`Zsg}QmDuvXHf=yR|j;cQu+e|&R}ObL`cQi9Kt>3^?cQF%n}-Ibzq}|=D(3+3&9xuWB>~vh&skxsVJQvtbGTitTtPgMz}sBa zo}*HENsCskMw3d59vdrx4m&Fhu{!UlZ7b~s-KI*N>i#ELc zL$V~(>2)JX9t=9x`s5(wm#9Jzpz5aRD8l<_CXw=4$0o&|p-=M_-rkf-rQ*fK!ybP@ z7lUK^M~zEMN=nA#y=`ft^BQko$!X}88u=|au&;$oyt7j`sr}p;%_XT|ZG?n_F92I}C(2v2wxQDB!1+>Fbxw)j-prnC}f@QSoLF1WO?0doDg6kuC z-5R&sVLf9{Xuhyzq4Xob5XCJab)(16C&6kq9f5r4)V%&(<}Y?aj?h$odaCZPnze8L zalxBo`Qagpnp*-4!;e_~%~95HUaZg^Nr|>>!DDhb}&W(Lr%@AdUXB+W2r&ATm82IqV7yT_#e8bURz{a+tv01h?jw zg^yTMMx=ZR#$Q9gz|yfa>V^6TGMOD|USC%4<>kXa7WO~dz)K>qdvd80K%YT}NdtzO{P=FmCqA?a?6O`0@Cm(C9tCuRozL9ORX);1m_j&R@5qYsdAKRcY^<+V;L0U zQSm0VeJ?AWHn6eU^k$jr$Tj*axSd(U-?$uN-j*E`V(_9d7=k*!A*_wq{60bSemc|i zXb_b6*ePkQxDJ;8nJ<5CKmML;iW35Vb8lRjfRfU?s7LCbfUWH3i%TpI+ha;jFZK;8 z=O0FdCGL5W^S@R+=1Ub+D3xjf15kuanuw|KNZY7*s$tNQ^4e8?yMv#>QU^XGtmUPD zcyc<3F%%_7NpVS%kTKZ>XuhYpB$f{V#+!D9&2?c-$ z9nD2(GM5vEj~R*>fg6l0retr8SmO}+(S4(`OetE7E}N;~(Sk;H#F$WT4vxWZ+iK2@ zR>ZW=j_neMQ9J+MC{s4$thQ9A5Lx#hW#~i9{M*ApP}1CQTG7lZ=0tG1eO>VLs(gP6 zWA#Rtw<(IBsu#=GfJe6%(A=HQhf$``$=cVaycB$nyh$km78_NXRs9u7D)ED%w?YZ1vh~nj3DxZEdoz- zbp}sBCU+u#9lC8{A{p|jO3gQXTJ2s|OXc{%^@a2m=90<$Se^Xl?i>KH&|-O3q{O>M zQ&|Er<1WZ#KUA+OH$OGfCCdubyra!23Qy~Dh7%uNo0sZu;R9Ig%|ij393M} zg|I>a<95rjV+e#l_0`Vs_;>Q<@jf)&(H>hYnXyDABT>yYFQ+J zz~FY)>4s?KR>WXbg$@A52^1v_;_3RJW2DH`cy`j8%xq>456+G@Up#G>~dJ@xwUwT%S1^ z4T&ljDkG(?I*9!FCIeOxRNu&du6UvPa8=|I^G$T;a_&sP!Tdo0FF}#1yO6tYPg&-J z)j+0Iwx~kc3BzKa1#zOT@1*?dg-{5->W-gh_NDp1el^)9vVf-Zm*m$s%%amQ=L?*s zKHQFm5Kfd5#5~0{tIk5|*^QrHrks7DI60$t#RJuJ`$zpDHwS1=-rFoV^nx&iFjhUl z@KjQ{lca=9D)`rO01+AuFNBO&G}Wb%70il`F^?W8eZ|#Q9ik}kWR`@}i!d9#>Sc+B z2I;0&wu14tpJ$1|{RrJbn?oKD6#lJVd4&CVy#Q)}EPwhWF{KR+spNAV>>C-2BKF9ZQi zkIy>N60RdFvr6>*5u_1QA_8C0W1^8&(;st&VZke#@gR`22mP{u~^wgB=GGS4@SD-a)zsFAqf?Q{HL^%KOL^}Tv5@G|FMWL;8 z%3&Asw&C1g;i8@X=LR020-l|TBS+`sojo!p-@#w5)+qpj4Srd^oz8`IfgRZ|{|T~& z8UL` z>giZ$rIA21PkyMLgBWM)CWIfYg{kc6eo6!tRp^M2$HfBpPRq>5s!)u`ux7 z4$C21Y5SY_46yR8lWj}}LrL2r?cRe5fV6SQ=1Ap7uddb6mr;v<@9EG|JW3D&`$2}# z3vi1B0rO!iRf_-oU~#Uh21Q7FI(Qa(vmQ&(#J~0Ds>l6{zaCqmxD>rXbN?R^4gr3U zDZFw9GCE1v-os9OMh+4gb%Da)okj>AL3q<-eB$KW(A+mDjgQ-JmwPyA-M1teYpI)v z-BMSZuVfS?BX_A@_0^qL3)PG|>pu!NZ+Bv_Kz)JorNTJQ)_Sp&DwNv}4|Z90FHVGK zd|oSitlIJaW=+w+NynS{>EyZ)DUYl1qWJwqw@ye#f=n6dqzoM>3&Pw|bBU)RJ@!nX zM6~@)eY#ocHZk62v!JAX3C3QZP(j-<-`^fETYk~BTVWx2Jsr2AVql*s=`=Hmc5ecL zJ_0Wb&?FGy8bcMiJHcrCd~LC93n5hhW;^$Y>W@xI)Vm3psY^g$!{Fs00norNr90{G zyo!r|rQlT$OG%B{mC1ak6snT1fp&JC%#EVjPe`qCe$YfsdXm;hPol~iI&fDwm0kAk zb{?x0H0)FZfYk|=t+;#bm-`5afT*TrtuE#YHmB<(iig6{u%@%?d|O)7gX005e`Bz-0ZogtdaokrzK<296Ml}qJ3hJGv%~%?-2lUQU;W&QOXoZVieYy(zY^RB_+XfI#Ju6M>(1Y zXovsVssi;0{Qd|Aq*u{W$dTd``kB^CU(vS~6z%`x!gQ9RJ@ z6as%64L~5nWDF|Z{SZnM-ELOpDtGduJ)Slc$vP+`ogF%2r388vS7F^1B{b`4bZ@^P zfQY}Yea`=N!|Ya8+Vt}QSIiAqz~^SRqv2qKy$)0 zAL>9(^Jl}(+$d|{eh&ViKG;CZ(2tq!(;=L}a2yBg?8U9(LdHT8t?qSF3*eA*b>4e= z#0TvkijKCQ3I+%GHuHR#qCfReKQwf6j7}R*J?m*(#9Y|92ml{l^!xV@DaDwwBbWFv zcLk=#Pue6Rx}`A!#!r#`L2qedVjrzbX^wkMFDF{u##>D&9M@@ZlChc>X?`creOC;ewP_+Vjy zP{?z*0^{ngIT)@_2d#f~O%tUdU zNZm|0k~Q?N26jfIbPFsH;Vt$z=ucj=!pVDeMEgj%Xh(H#?PtUI%^qcmMQ1{AT5<;p zh^q|#M|&zmvf#c6sggWV@lFiM5oqBm8lYT;Yx+|Pc8oTX1YnQ9VuE_P*Jn~s_I<(o zb*Rsc*bXSN(H?Rz*oFY{$A4%Rq0rdba~@Cg_qR{VmD(DmN^PVIr7D5YL!aMtun4Qg zSrQTxk9r{@wNi(N#VNHKrO8W%TK_+h<_8t|n;W%hzo{kZ4owCa;|dljNN-kt%{}#x zot#PONSPKb#fzboTew@YmoH+Eh^VKAr(Vqz9Gc{e5%~E-7L}zOPh_Md)okN9lD0%8 z*QptpPwguL;bS0*yE45RU31R_QY@vIF?q_6Ba9XJzJU-q~xdskcg!=n#_4Mzs} z*A52zy_33`qD&t{7JKwOB~WySy^xNjLkIEPOOCBp>Vri$JiDeOq{lzqgvY@1h94nl zqxtl(haflhr1|RNB|=HlRpRXse|8`Pqh?_Ey8Y9PuHL1JVz95-KS6&S$&rfu26oL6sX zS*XRD$YNnZFrO;@|Bgf-PKo~81qZQW^#MSw8c2={B`ztV?8Dxeq=0q=kB~(_`I>w< z%^os%Ph;VPAb8#rJB4-7h@9t%QShWfM4@zvl+Xvl$BSXAQlxIl9nyWu2_p-o4Jwfnt{dKr1;wBdZ&S z>N*mQR+#KpotLD3%#l%xs>)c%Tp1HBIg2)@Dh0N{_O|dGn;z~E=*FIYAYIG^cp-+`gvzx;B0W{;*1%^J zM;wB@b1Z^b8ZFkM6q<~&`Z{0wug1nftLF+?ca~La3mhw!7ZN_-4*<9~Puy}j9AY;Z zw7EY-ewj`C>1KCNT4Vahi2<3YA`7Ln1gZenv+1Yr7eJod!@1fwF56CO8m6p$dZi%pP)8}B23<@$ z!n&s+el0=U^i8$|UmY4zMKdatkDWXd+-o&$~rlB5R|3=OI6P`Z~4 z-av+z?4u$P{5%DQ&k~6DJzJ}@ROuU@G>z>2ib?Ojz1$hp8@7+%DuxlG$c7XER z+%j3)`o$3`5pBxZ*|jQ~9mNIE^ya5mD&ni~`}-&PyLFxv$}gl9kTW(zJ+Kz?G>ReV zSc@z%o$6M&-{#gkUln|drtNR=UfKZmIVc&fbOn>J+gUyj;AL%2f zne*O$0em7hs^EQwru;?3gYW*tAue71?pgb0eIeS@9w1Tsh^*%62&?K-T?4n+eskR{ zt?yxXr>JvTQK9QGx`N#2mmlOeA9%Q!<}fr^_)HRhbQ&BQ>~)CvOU(CY<+y@u?`q6*wN_;>X{3?KFcwED=Vpys(OXygCl6*&)8VLJMPz)69@uRPk_Pke5N^tkMH!Ln^D<$w32_9%xUqGla@}ns&Rd7Q+rWer{Z1` zmR~4ME|J`moUha=1H&gVn!23U8Yvb?CZO9&cz7YJaCPoF`ILl+y*#!PgW8x9E6pj!*RC96_ybxYrwk^P z*uUk#EJW#{v2qJ5j1zxc3eZpg=mX0=_wcoC0&dWFj>!w-9#&K&$Coo+G^SHe7DAY0 z@vvsF0_M6J-m0=_>54VleL&&z&F7A!a>H=@Wyg)T79stp$?lg+1TUd`&8 z9|-#iJ&H$o^6-D;?;2AowW3--8Hr3UNQsLl1yMGpq|&O)8hK}X?UP7MmcWyCzJIE!^$l;J*wCu_V=B)r^e*4n@8QuO-Y$}Om}xOZ!a8(tQFDcjjs#W zx}|np-3w=MS{JStihyhQZg#lNUFHU!zQt6prolK6RQtS&e&M-SNRQoAm*cy#tK`h= z`6CAFC%AQ(PR;2y>uMZ$ytJMdaTDfpKP;8xKOf|&j+oB59nM(yo%ZRvfo1cKhT5Lg zU^$K2kezljL6WU8x*$QMx7a?qIL>~k?6O#!G!w6Fptk1ivE;yd&>m-=BBm1Mrj&Yz zM>L!-7CvY4$3)wl*?noGa+3ow+@X9LEz}@-Pz4XxVg=x?g)&7FfI}PES~RJLT*HuP zetsNzpRqgIrPq&Ep~8^xwvqFTQ@u(#SDAf%Q?7ri996(1B3Marlw^fqtzhR%x5rHZ zmt+`bhC#h_=6f^kL$e@FsgDRa5BGP>1*Dq@w0_4Okt?>YFq)^GrGq0c#YxhiuA-^= zm(_x^-qcQJM26v=e1)hc#yW-eIRn@hpqpYgw6qltAMd?eBHuqknm=NF#lOoer&NjV zfskBE|5~mjc7mzbhl9Y^iy&ku$c+b5o`sj)oi@0pRPFCi*czD{{iISeTBVvgd9?89 z>1M4m!k~T?vL&HW7jI^#wQ(@*Y`Dw9`YLGoaLz**);JI?82EIzTMVRHh=Gsu{>@%@ z7zjT-fRFHv%FzitmDhK^PihlI!SOb~g35X=t4Nl)?9D#w_Oax|wDY{Qvm!5}h;51S z?FB-!)sO~_PBp1jXGs7)F(pM72AwV$X8+a0b&TcqxWRW8N&r@8wG%FxPHm8Uv*UqJ z^X6HU)A@k$JHCI+CB&_((79{n&P5b)uqcR`)VxaruIy}zL=oDJi$!LSb^ zG9SL20f(U(j^=5dRf^@yZ*Ai2&8WNRCK&X5zf;S}yH{&sIrgjf`Ze)jz8tX`Wv^_o z$;&o-*0e5dt=S~6F?f~rz*~rqPMvZ<*L8_Xqt_C$KdA*g;JB_ds8?z>yBF8dC& z&GD7FNAS*V(qLp_GM_con`y^KhsKzPtca+xSk16O%h$Tl<%zn$Qa^HTv-k5Kz^>wv zQ`1`*EXD2IY<+0|xY0t*Rd#{tg1zp1fLO-KF5opQ^Nl9*4VaR_Vx3eb>odac^c%2^ zx6$Ir=6$&V9)Y-+PJNFAa@BlTq-PSWGKP*!t-hY@{rpx(NH^m%IDR1*)9vJ{tDS>1 zJOsyRF;(Fa(cU?< zJX)ko`5{s+HJr+)u{O|aO%0G99@Z5(d<(yq;MJh$exI*Im7qD%yo3OCBj5hp%Y2F%9LXeJ9 zt&!7!X73MfSOU^tbP%7+RG1?=eQR*m9~ZGW?Ro_dn@UWr%|ktCM0n!9OWN^8;TsZ! zs^CG5*2MtTH!;%ugmGS0%xfq(ikRgoxL1=$)z8QHqr>epE2cb4VTL8VGC#I^=ABU$ z&dtr&il4e&lh?1oWp(zSH1MdcK5-1aFsIx#iTY%u=j`u{2WgVESjDTqTWtzd$+}6k zCa(S-vY?_7Fr;j%t=?LzH;7hgc?56m57F{9|90Z$aBdYd`P7dC$)$^Zi(UT%)Y#mjv1zE}NOTIr zL+4~5+gQqo{avl;CTJct0RaVu|Km-ol_~tf6AOXZ4ENOnZrf$zCbT z?cuLqj!3DcU;s(4jf_jebq7biWSZD&UWLfU#-~fwuHV0JMBf|a7V5uXlRZD+e-8zx z4MVb!T711C+y3;BFiQBj-}cdA&zN_GTI)@V7R>Qr(${=y!&@{}9mq;2+9$aG{1_R< ziPldV{sN5tvRGsv8_N^+usa%)8{1Q0S^=$ z4|v9U@Sez6m=J-u=hjvS@55yyMywRN0h^8uH~oE%Bvhg7eHmXA_3)A(ZmYylqah8& zI#%5r(hXk|F67PU*R0*HpF)gKV*uJuYJ7C9($dMKeT4fB{WDzWSaHO~NoxN-(92W} z<=eVlmTV@sh-2qBxr_Gqn)1+#F0S*=*srqRtZtq+52H}vk;15uP20sNVK8c`{}zE^ z7yO8SjBVb<9E1OWMNdX_l@NNrK*w>!qCymt`sAWj!bjFd;pqC}V z6&14N<#TBunz;**@+fEUTL>!7($4kXQPjWkb1op-lY2H&QIGVOeNjho-*?|G!WbTN zGw5JuOV;FTG zjdKE}^JOWlUqI8U649Qp3egdNr6H_(g_<~g%G8#QRtG+BG9MybnY|FPrxvw~Ha6Uy zW;w}F-Q3U}{*EAEE&=^J)w^tghYC@NTAMnh8lko(Kd-x`y@&N6ga%#Q`_^)2t}{@q zJ}UXh=wz&Ws{1M|E$4=7!X7_6Y2Q`bU!uDDZr8&On~;=#y&Wd=Oc2B#qDDlwl`+Yx zX=KOJbGPGx%cPjcmVzsa%xjS1=Mm$0BsMKi+_tALzHeaG%Lpa|s#$qT?6XwJQh-}8~^{Dv8 z!lCNW_V8kAW_LNQKos4dUU!wy9%MQ6WuZ(n`AXsv$q#}!OpJuh>Fh@WEpD6BvAznz z`3b-N{l)4Z@d1J{{pgynXZZ64bpWnY*mZGO z4Ocki-ZlewO?@9a1iWHUuGl|pbchW{D-{?%Zt~8gVvMa1I#4@<>Q*w=JgBkz+iqdbWsZU9>s^zjEBiErQ^D zZ6=*#+)Sa_P%EE}@)RH|Eyj{3YCzbaul2#MesMat4@x>VLuB19qk6nnJecqTbUxlf z0M>^YOuP)?cZ#Tm zHP^Ood0%$_jK6NfGbZbNX0v&c>i_i;zQvn5zyyx?DP@x=+hC{y(?1}LpS(GCVPvR_ zyE-H2+t2-FdxrS?RKG)|l!(apY8N@^o%1V!f!#0Tb^>nRjr21I7TiC(FbBw1*!C>7 z=L9EPI4@~%f5Bc~8+)O{rQ3-j2h_fzCtPt`YpAXq<9posZYL36%fl01xLy2kdUi(d zbrpX2aXYSd)tJFKfugH@)RN25b*G!*B7huTN+7;ORVF;UD<;`i|Cv=FElVKA_54QnSukY8W05h_wteU;Ljikf+$lcRYw>v!N@M%8M(=v*r4 zoZ$?aVV;Xw)Lle3N?MOcV_hu|4rL}ck0A~AkHtC_zR7l?3?9T%7j^vm;NKQL=f}w9 z_Uj9C-<}{0Vm7u=EUeSJoo*u7SAxHHHJ^5rYc^O(%yqrZo)^!)aIeyoJPw%K?22PJ z>bOqo9I25}CJz+2!%7^6)A`2-#0_Zk4^t}al1`o(1T!9fMAbv`rv{SU4dq?S#q3{| zyG_TJ7aA*%cN`Jx;RSXn%;&#XR>z@sqGJTu9dWwJC&9Ri=@gS5`-3zz!i#sjvgbI7;y#xR(5ii1v_Sx)h&$OAN9p~3b(X{ z+oLo`g^X2})R$wSdJ_DK({^%6^@=fcgEwr;=Aq%VIZsbEUG@Rc)TsV)wkCn-M5oCK z0Se95&vt4WpXN zjim^ns`WgQ4R#mGd3cl6vgAidhXm29+VFGDQm!|b3e6Hyzvb7jA;g;klix&^-oMPq z-F%f9S0SgMNY{67)lq+Wuk$9$>az2{gdT|A71%9n8G*q8zz+Bb5^E@TZM=CAHv7_{^&_?WdC}Ys0`90)MTfOfI_x9dj)f zN#g!qtz@x1?X}v=~`JFVc>@H_06tkSwI)Sqq%CDd zF5u0*6u-lkOys}7c<#UMc@M4jCRUQ<=DJX!q;ZL{{0I-0UM zHW(fWwN+u8{dgG2<`|#qq2?B&he10%#QVE>{7txj^nA0)wekRV2{QY$3t$S&Eu}iV z(k4sO>5N59%R8s6bK)Xya;H@`ha)tFMoUC27B}_6ikpqcra7BZt&;qk^`j+~H_@8b z#ahER#P=qHJ`Y19eXdsPX+Q0!^4C{{mG(W`$E@&+Bc-CLX~mg`);nyo=NKJj9jji; z^-_rKhtNFsm7l{bmiG_W-jNq}+DhvEy?ZqRCU1Ifs&h7{+M&=9 zF>3WwHDgGl{*91_u{y1OM+isU7cuQCMn$8O6Pd04P_O9S5MS&R0bR8A4>HoBIXRTk zF?aLjmV}QW9sRJB%I|?4;V)|>vXwF_w}j|MR7jq+;^ihZR-s{B&{X1ez)6a*VV|Yl z@eysvg9GrH(!|u^z=qRVnH2Uy_9{)@UOS>lN6#PHPVRo_rdJ6x6_4Ir-%1cSuK-6}K?ww!KGOCo%eH$AY~qjsDN(a_VL?WSOE*sS%?}S z_(Sza08n;3A)%?x`gPwxs4|VN&H6;~ASsgNQ0k*Wn8SW$5oC4wB zqPDhrtohPnAGvLT?&fE#Y&fODu!bK%{j9%ZnsCXi<@&i z)j}F4d4W8eLkpag^%ME)_UCnJ{gp_uP*YH&uD5;2UddybJ`3k~AiaRgF{AT}v^%ua z$6cNABc`v|I(|vrf^T;^oTHv7Q-tR;**vXS&dOlBc^L?X-IM5xLsUWE%yjfC?$*~J zZubuG726ssZV3Zm##TdPN6~x{Xqi%B)aG-fpAu4Dm{a*#ITI2JBr!d{>tYLt|BT4v z(rWH~xy+j~Rtx(E13I(dx+QNE7%-0dPL9j_?S-#pS+FHCxXg&fG%6P*E$zflpic#3 z5J{L>+sEa|i^lu+Ie1^hWU)L5%KNiNA@Si==G3zffi-%5l8D2`1F$ID_sIEi{1|at zqrdKDBQ(*NdVhxKVm^|j1!A1QjjsKFBL^QjL4=S!NAZcxQ)@* zKbTvH>oDlzk z-uEMIgAe$W8Jh%i{cYl}s{9oXjzWhV}-t6%|!?ppTyo$Fq}Y(a)32=2r>dNWd%g9`L8; zBcqsyJ9I)BixnDARPwr$)Z2I_l8o%jGRXfQS8pBE))T&c7b{ST7uQ08;>F#Hdy(Mo z?!l$F6)&#EHMqOGySoJl?)K*Ud*+=-{z+y|X3lKR?%uoSzCYKsI%hos*27SeUxa;{ zLH4ksy1{!MG4shfUIlhGi)i&M03YBeXRWhM=>M4RU`YS=Hwm86=+A`DKZbEVkGKvz zF)Pmj)9?}j9bo%wBHBW&4>GzaQbfnWS(ImYS~k~iDbR((-kg-~_Q?tLbv9g0Cjcx- zqTPU*4zBGd%3Vt5DZPBe=Z5F^D??Nmj3q?Y$G;QPq@cT+P;1vuX26aly52|RyS5Ei zcv_}Y_lR~;0`l{C&Q!9O;e8`Ju=C|9;U@+N=rZrEVk^2-FDCPBYHmKsszTtW8KlO2 zQYYs#bY5qi3L~5S{4ywixZK;3m@W=RXXaNHP88zlz5X_v)cvO0`eZd`)q~Z?&>s{j z6BYqXjZOI$F1@#`9Tq@kW?4OjqJ-kCj)Wq68XJ1L?)QuI9%)obDpPA-S`+2F)0ZUL z6#DXQa70QN!@n3|30HnqH}-Liy@>b}{86$1?(_B9){&$^0EJ*76AIp|O$Hi~Q)FC7 zK_Hd}k%2!Z$ZkCQ$M#!`e0owTo$a%EXxsw!T^NDl?d&sWk)du5eB_zNFV2%FXNCrS zdIs4<8%#Am8PB_;(s+0$dE^~^IszAGp~NqJXP%U=l@92|S?Yf_+dS;b1oE5&rMn`; zG~tb8aOm~Enipz&mvN_d!Q=iI*=HK!Y@$<3+4c$Jt|H(1g%`j&2V+=_G8CQuam`L# zuSd)M=&TVx2;V3U+;V)@F5Rn)#6&1EA)Ld-@D)hU@&~0IhhRgv=@TOD$1(#d^7+`s zI!DUH{fn@Us^93x3~P^SBhiC}gEnqjWY9an``M)&yYO+Wmr0I)Sv3`6keGrv#`v_2wcSf;B zkry@MlB=%DsC?aog@-;j8`p{G!HVkahLSZcf;V8B*?}vKHBnEJw^7dG8r!K|Uc$O4 zfBkKGLlAT?_}6&%>~>%MpPI5SeFqAOk%nlsuNF7op?6#doy(ykpP2rsfEP=pPzPk? zQTjH@yK{tA5%C-tg4gY%TSN2>uT>B@%4DuD(m{o6MZ%uZfWX@O`!l-*7>Zind$DUDjQd|KKgnp z8g|*eFb5Q-2Jo>*RY59)&PXW>=CzZ}W^Ub0#nsJOt?4nRp%0oAiG`O_3xdGM*G!HVtaAuL8Y`O!`CC!L-ZXN0oDMs`hm zqb$$nY=B#{SK9~Mc9Y8*m;B0#h-y46d(6ngc_zA&fZ7X_xx+NE2pZq3j%*jXc&GYb_UCy^ruu2$W&@{pXyzdf&KAyIy^Ts5fR`9i<@ z(_{pom3q<0a$mRL_9yhKb30jrwK)m+>&2|OkoW3f;e8v}pNZXcx^8?WS7#)bdGHI2 zGSDJUMSKrXpP-i&B^9O5$nc&Bl(1iAqMVP#>S<|mnAM*2{PD5soAu00L*kDSpc2IT zmOpBL-nr^L76N!g@~VBz*)qT^sC$$J+6tR*ru zxI1;OEH&!cd2^;X_%8JUY0WFT*)PLzn++0vXt_T_7A1be9E=c0Ay{37TGnkQPek;( zz0q!dBRbGriRF;@u*b$su#Soi-|ajZoi`*kYV_fz!)q?^E$2cL*+)tLf0NKj=ic)(n^jl1u4GPvf){Q|Wk+(i+Vr zR;z)tZx>ZVzL6+a`Imp#_CG`bX;`aP(mhw-qeH7L zbv--IFKoNzSvVM+5yT&dQ5xI2Nb+;z$vU&Y>Za|ygb$MD6Fsj{Fm^kxZ(mJgf|hJx z%E=jnthbtL3rE=By7}@)QGND#bmY;AJj)X8B>G{~KKx@pT%}cGlIu+8+I%1l0G{W^ zY&JyXg^#oK)*u@<@qHvH*bxQ)*dfj0*p;PJpc$(54}|=HwDTAd$L7kooJi{oP6~P` z`kwzI{`TNS=4+*KS;`4+GP9j%CEVj+xJWeEg+pRRLYn$92TS|^djT|V4tZ<&pa5&qKyz-HxK+!|8NB*wv%iu+H%RL^?f4npO zyN{+^eH1u?X3}zX3<_!2^q<`HpcSYhyeyB{foM{uon!Vyz#W87*m}{PQ~iF_qa?mR z$`?~~JS$_|l}B3-LrEr$y_6=Q)%83<(llJN-HNKYw?m^k_b)ZBC$o;!w_YEc-KSC> zGSSa4wXNa|Z>^M2E~~y&Po46Il0#%w=`YwBv32`S22D^+L4Slo8e}zF6qYbiN9rhv z&=aVkvy82HQ@e2u2;5 z!SgD?21g8<{S%-RBH#AhaG?i6ToVip!t&(K7bVGRP`>YwH-CszR@1 zlcEwZ4#!sHCsJ$fO(kSHnxrPq8RJk<0`Djbw4T+fw?a~Hx;7DVfFWk$$FJHWzZeoV zhHe!87UP#o`8{l$sO?c*@#?MWwFrt6EmWaxQ4X_Ex>}pMY&rW zNSz6~)9BnVnvGo9YVhv2vRb;a0> zjez-JI_-rp>@xk~;Fr390`TXOvF+}XB8V8nEe6*~Rz>AYw@!%-K)*89>*)lqq2!0w zYqWbYC`9;}0cHGjM1`H*x3%De=3yU^uvCUajb(>ZlE7;Vn0r)13b)mOK|GInF}c1^ z1wE$f+V|QwL7)b~kwiMF@@=jrducF=kM0?zz$%Gtb9}TP-$J>;^39P|X9vh_%Oo1X zBK?VnlyGdfuEM-?OlL9qFl_X3Yw)o6I*(@0@l424f`2NP!u4fzJ$G;gz>Vu9`LzD=fH{l4*r#BWAu zDa`jFkPIa-8lDeUg12-_A~k~1tSo#*$+~PTonQR`S|Bbd(y0h2CTc$Rm3~Uq|5+M6 zJrS;G4Vct-7JCPcsbnJ#X};ZoTv8)rfP>HxPh=SJ9L*!A@x zBNIiOTI-xaJyMyh24ksvG7kOUJm2=#@ctzSt@lAQOvw`=u(vHA`)ptBy0I2wbG(L4 zbR<0k-qhP#+xS3AKp5ub;@<*lDRrtUI+(2QfwxpcBM~^_(N+_K7@|4xRcZaXX*E?T9M4{%xX5O=<0#$r{X4BpnY;~+V86$adH53%QyBl2 z5rI6bqJ&h3VUJfJ2_UXF&uP~Jq&frxvlZ@p@OFD0zjE+_fiQ+Z;3soK`T$!AeB@YI zBI3P&Y`yh6Mml>M!6kDwd9?W6f{{v04aKvHw@{aEMMO!s>j8ei(C8>^Bt;)aElt(T z@yxR4w8s4W`fX`jCZAhb{x>dLAH^-bp!8oFW5QJzpUcvA2Nm&cFJIP*n_oFTi5V4F zxhsQ^ZoTbi-d}2GEzpz~k~Z9N8(x}aG*Gp46cg#wYmxgcPR)#_bBWcF(()qV`PNBBB=7C}&2&z~?`fvr? z7eqn!ALH^7Np>RL)2*m50HZzEyIH3%jWZvBWm16^OTOrGD$;cm0@4jiA5BwjRA2;* zNn*pgpC3Dc=LiC;;Er7$hAygg0zG*fe%kc^gv96CGq^k;+JYTU^>)8^NJ9QM)qvlaZw??%Gun=ucq=(heS2YGFHDbFJ1 zsy=x^bfLjQoYuu|B%J79?>ISSpvYiwDRoTOr*ugLq!-1ArLhaE0G7$jTI%v!iGyct zX0{@M=1}j5PNH)MMHi0ApW*y zK8a?mSg4bsR^oZ&ZhL#=h+Wml)lKr@@y{Bcwk?RMQ^gU#&ei!!Kg`#aqdO zcf`Z_A@h_4^qK}G*h5xbCuxJfQg@74MgHo)efjsLMH6(JqY!*NnvE4KB5W5-+T5%G zkrO&_vBRYdKkF^3wWtpZMP6>B(e;geyZJYRwYk${Ri`@rS15fwBvK{2EsNZwI22wP7wF~6pm|JJb6UcX{w@&H#F@IoiMbQ)PjjNnNiwB}u znEuB*Bso)$BJIuQ<@R#48pUwR`)Vi)w__3AFwi@S#Eiyaugy%<3};+ZP+yA|FBsB! z5XPdDN#ioOCM?BUiw|fyVYU#c7#WxJ8^eyIAZHQTW7NOpTj#B6WI25jdS{)XQ_7dh z&@d7BE_4fCpvXMpb{@DA)uXZdJ37Bhqfo}=?RokwY(`v&vB;EuL8h@`J_w;8J}Bth zlWTPF_utRzeI2R+O-{F+CXG5(v&GJu20C2OU8yvz^J6KH^}sA~1m`<1Z)gS! zofE}3jNhxnd?D)+WTx8Uzdwks^($!c(|Sc@3Hf!8c)~>nc>bZSi;Rvg^oM)GPtuOW zeW#HAP@faY8NvN)SG7zHKouN$KGJixUIBdv!Ol85lnRBWPYCjY>`^K2F&0un&B zOS>;&K?>ARu0RU+OvquXc&14Su9ZpfQelw`2|r3lYUx?jaS-GewLso_8vf>ER2j|p zs8V#;hxT%FP0Rk8zU-QA9Orvn18@yr2fOODCCxJ6%_78E;P$<}m=1s1rh9a=d^KT$ zuKMd1Wjg!ob7i3-25&$7s;e42mF@bv@u$dOm6e*62Ok6PV+#LKEKtA$3l-97g_;Hg z>`x`~5dLM10zu`rujriQf4pvddn54Ru^Busy9W@P=Gwgae$k(>o{)Zmq&i_%U@X0F z!X*B^7kk$ZAv(On3O&^r2@K+l^gJZj@1y}*k9n@xlRH1Ja8z*J7CYI9b((Ky#zzHV>k%t#@{&B!QDhr?+6xCXIyeVfG8b9-%|YF6w0 zFY=4Vdo(w7bq+~EsN&`KGt%ELeKN%uDN}DSA{uljqXz+FL5T$wOGzy!8W{Es;HDS} z2=3D23g;@={(M?4bdO5Q+$EF0As zt50jsRXQ#hXiFfgh(57Ag~O1D8R-0eDOalbH6S-QU866V_z|MXn{DzH-Z&3s`q?<> zFwy8uGX`+YL~OhM9(%G|Y_~5(0O!1PVt&*WPAscbr`bUTz)F$AV&H3SqSRF-CWaLREvQ?cf)*N!B&w?Fi_j1GB*?k#@dtT>T}miy zZD>ofksC1;b!9$f zJpO&E*VXgcJc=Dv{j#e#jsQIMr_=XGqo z0g!R6L_V%!_nE4+(En7Qw_T_U-?l>oeZphZ%Z(_01=yOjIPFJ-lr7IwWUX8!b`k&$ zh7&jQWe=?jf>FwK7AhYTamU}2Ix_nR6g+$#<2bh(9@5L8 z?gXraKUSX2aV1nXaYb6y>)#kY+lJe?B9;|**Y@Ivb74v z)s#x7vihl|{9yt^X15F}sSJx->*0|DV_F07n?_o&t{((e#jjt;{8(EE^P9UQs2M7f zUa#6+ylhpmkn09pk(i={UXGmGhwMC0p|JbkVKU^H&lMHm-(xQqyOYOY>sBJM1VAvX zuh9ku@Giqg7R~Edw{0b3wW(u~HaXaq>D!)$!52oW>bYtYoF_BX}e1%uqv5edO4VLEfi8yGup`De9%u~%h! z)O9E+zU}PDR53Z0sXR;mJ-0(^X=80-M{KNtNg%#!9ery`h^6w3cwVN=l2_;vk=xdK zU(!)JmQ5n%tA%wfq_98DW6*vbrdV=w-5gamo1hP&wgcW0C1zN$1{6)*_Il zNJu+HLZ$h%*lEBdd!N@a>T~-3 z{l_XVa~Emps?sa4x)@TK(x^Re>`Hf-KS8-UAHNiQcF)G=)C!qGmTiiz(AfSY%B7KJBq&1|u6x7qFX{s>KbhYt zjHq-hoUYerjQd_*N=3!4sEsb|^ExLu6bj)u7*E~&bPijSdf~FxxzokQqGn#;`GRD`^CFb2$u}S8F#UZHT9RHAk@f~pai#W%!Ysqi%|nW3XU2qxu-jvCYtVR! zp>(%=Nxatb`E5kcZ4H)W9}mCG5w2uulJZKf+G21C%~%9qr47jzPC4Btk^(%5(^v7t|ch#%F;|Ii=Q;V>3fY}``|;{{yt%? zcK)mFISb>QOPi%(J=NH^%$mC0rA%4_1X*j?I6i#lnQaRxsBvGUpVl2ME{Qk?f+EUm<@|QM&Ak;WAMWY_ zX9vHK>uJzBaUkzuMAG z0KpRiUu<61r#TkIcmn^+CrEs_BoUPtmg&J#L1th9PEWpL0bgkwUFynJ@(c9~0op3M zgjSQ&pLw0Te?HCQ^=awI-NDAlR={Z^Gua8@lHs7U(dA+!(qk%AS&3QX9m^(IE`E(n z#s<(-5o$>U*6;r^+((+hffbX*MW)ms_!LusWv?MZfy(1OvO+i$f3n;uIjQj!Abu9% z2Fg)~)VbShw0#Y}Ln_lj`jP%5Mxb?N=CS>=iC^BU<}(g9$oT7Q(jLYNE2Z!|{K;}d z<5vdZ*}LZ--D&z&1GjuRD<7bA--^q%H|veBKoEES!|ulgr_`kdBT<8jQ0`caSa-AJ zyedNLU!7SDp~0~o*k9mNDDF*!(8}*~;9M?4xzqDJuaM@h{z*f-syS2Ndv8}-A@=_kL$TM zYUu(`G&27v1vhnOeSz;cR^+Ft6%KMa+lZM$)G;Id0(noWco=tR43(i2&tOq3ubNAN z92KoB@oo5R3c$;yuy(_giui;U?&|x)wqK;)2p) zN+k4kqg$|Rh2;T*wJaCLaCEt3IWI#O4To48zYYr0kY_EuF#_t48P$k*je;)(N>~XS zbWtoYoCM37c?CS<+#_ajG#N7)dJfuu*#tJ^+pVvJ04F07t&ytx$6!yOrNfSbARGGX zf1-AnEFYY8=+jR4cqPf$I$kG=uMSR_hurNYLTDYenks@gC`=~Ygrw9<3hC@Jvv4kV zZk9lu3{OmW3+^=Ehkvb>0zv|fX+$93@j4@MBe_#{Jd~ZDw}@pq_Wb_<>_mw;%W2jv zc0BqH_wlkQY}8WN7L9Z}kjlLM?*8WVlG&)5W)%30ix1e|u^q)1~m z7?w%Nm9|3ggoP}?LA@W~nIRV}Mb(*ZTHAhA@rsh6|m)c|6CDc3q^qLJuI0BD- zqH5=6fCgoam2`wj8iosI-4?mvU89oBu-fo*PHzlnHz;7{Vw^2fvs~F@%DPjtl9m8g zZ-i|$ZH_u8>pNB5JhxaZNVs(i2ahf|29axG(%@b}#i>_5$kry3SKE@=1T2D=c8tVC z^ktL^B{eyE&(9y}?~h7_UKsBW2Qu!nE27{_L7ma`a-h{)M_=8R9&SJjqh`y@P;X%f za^)YciMTF~&3fyYxX^LNjhD>hV}UQ9U!cU=he+)IYOJ`hKsp3BWGs+@hz4(jK5}x+ z-N>t@4>CF6Ww0P!my#LhVe>UfF3&5HgDB2XJDK~*$T8lKq!`@fREKjit=IY)y#j5U z)Ag>@#7d1`rini)*C-fe+ONm-B%)KLV4gCJM`}kr5+R>ZXtwuqigd4-Q3)hz%Xpsk zXEImmJhPxCfFa0wV+DuuyBK^^A0}!#^S^a}Mg!WueEsH&iuT`5W0h>X>C47HhtCTy z0UUPZEX+vGpTA|jklJ%wQJ`q#le79%mnrf{p9EM&TUrt%)k z)z-_EdvxJkR5_gL&W7e3q6hlh5{re~=oB%%zawgv{ZP7vCKe_!cbnNJ<%t%g@M^#- zBad>N){Hub5g+;{4hkEu`uXPre%ai?{@D}r$8h`)nRV!t%{`aZw7nFy$gwV%W)u+JtsMiz1Rq=bMEEf|{OG6i<&TTCyI^3v=` zEKMTdkyx4@YU^W{LGrSJI!d;nGlzPa5o02yL56kvriqOHLr#n?pX<&_#vp;6D2juO z)qXxUA|M0 z#SheKLT$kKcyI^ze2>}b|3*`5nCf+s^z{*Q zr9ev(bGoHynE84-hJ$;Pwt-JX@YEN<=`xagkskcl%@8o2DV3}yb~QO{p{1D65UDzX z+Nx;i=lDxAk#9l|P@e)?sd2kSw;HfnnZt?4dv8({Vbw$i%bD}>SD3^p^elOC10&~n z%2dWR3wq@TD0~pMl$Q4g9HzTcBd*fxw3_*dpZO&RUI)hQ%aSo0Yq_wdRx=K95%lc-S>(aMjiEev3;%)cABF}oMYxgNNs*DQLhP~z{<+lWHnbystc@| zwE#xVoB|P{#>bpoJUtFq$@);91T4g~(@r^!EU4!ptVAw(>Ro2PHg+*Qz4YDHS zpTYKdI4H}Y$M!!DnPR0VVpeK=_bwb8HjI?CeyW=v*hww(rsTJ$7qLDlUXq^PwG62j z(+GR%t*}?409c!zF_fSfO|?%HGYkA#L|Os7T#<1mJ4g4EGY104S9y)hj5{(57}Ydi z-&2kFJNRE=w|AvJwtKIbU4}JIERB&p7(t%;gQ+OjR(jg^7G96x-D-r8Pb6#qKy>?t zo~-p-;v{yoXcjTQ6*K;s!iDIE%5jUDMuw`K(B~Zmkt-(}5Ih|-@6yWj9hB=+#e-F& zb0SNOuxGYE6JV>H3ZSGxcN-xhQsnRwba~&+U%z1(8~qU;pXARrh_YVj%|3)~JKp-3 zr+nD_k70JmGoT*l;yDJ9=^vf(BD___@EBOB!Yyk?;KC7=ZdHYfPo%11Pf=z@r|~Ba ziW>p&1tYzYx|&&Z6q7oVTC|^P7PBfP-s8Lxu5JV%@ipHuj*#X7+&6cv-w znnqv~4lp-%nFnu~P2S5|^L3rkt>?>oC`K3Pf`Q8~xaY_G`XN=N zaDc};lt^z8$KW9gM-bD9UUKq7{+Ta+UC4d~*`8}je7*kz^?yr04nju?0QD$O#pS#g z$`eixCUpE@*uQzwSn_r_{SKzW%>|Z;wWG~UD@}0ayXR&T4yuinHUwzs)Z2WOe{-Uf z&t{PXa73rPx93StU3_i)lswAgmqCCd2Ahu8f=n;BKZ9ke-e{et{7}LYPsIYMOq2Szyd-w?Hn+k9o4Bm)yBZNOdN5LI!>ZT03 zRo#!kfg(QdN9*@OEK=X|uoF1rsg3SgtaM+3f8CHBzwLi$tjubtdB^3?lVTm+CY{O&iSgqa1(Ux&Z z#a)g3X`zT5W?RVs8p8oV!}XWCLCAKL0>50B7i@W%cB9o-sf*8#nK`XpWHe!#7)KZw zQzO?s`ICiV@<`+P_n-c5lW;?Z598S3A4y zBs*FoJa`26wPZ(w0##P7mZN|aWw!s=frASprHwldWKTfJh`mV)h<_4vlX)2!J0@3d zO7QXf6DE?GdAqHv6{GR` zCYT{$RYN0`5U@=4G~=-~{W?j#X?{Zqm4k!3X6y5DnU<8-bpdbJeo>D^o`7ScRZ zvj&#@G0dG+d4=uwIp=Zx5g9I6v{Os(8ls1G*C}2f_=bG_o(D_Upgv7G_u_TI|+|frw zM_8>~%ecuEkojBncaDAS8jp9C#?brNkgsRk?a~M=3Jw$UeR50N8~EBqj31qd>y@fD z+h^lW0Jg_5rRv8V0)#GcpLPi7z2S3$0~=?aG_L)|$xtOC!)XmpNl`fqMJExP6nszP z4=(t}1y8-vd>@{YZr}Fme~P|P@Nfhx%i5$BoPlBIv5tvB!wBCEd%q-OM>-`*6-CKO zDCd0+?EQpIgmN>EP)cF62x}|}+t^vPpps5xP+&f)d|rXf%v*2g#;zbj3%6mf;4U&C zHjp9mjh0n<@WbTpq6#$+75pt{^i1A)bAoH+LxL4s_hHW!2AS^IeG*;o$IOCJwc%%6 zP<}QP90!;Hy?tMH)eajJszhL_RnMDF1PQV}kfMy8W7okEJS`A0&-kG8+cg>ZnZ3{( z)sDxwcFNAXKWx04fz7Yp)Xy`s{d5%`mJ-afeg8mMnw6QDdcKTh(ei&;X;0myes!~ClTC1e;Vxkk>d=-x%@`8eG$DhHO;n^gZweOFZ!%MSbzSCOR5)UWSpUWgWzV?K}6zM zwlx7VkFkUA8Bn>J(TKfe^OPc)O7A!t|nx=tc+ryxy z$>=yUxCd}FiE=1qE$*z{RGWDvjF-8vN_5{gfLyaa%tNsMau2n$={OYgGVKY1U(U=P(43=NYXJKkuimE zaK~D>Pgb8uOkUT~onAA!^pl7P#uhOT-G#gEapc;gA7;7VK*Z`Z$08P$w4((ea zE-T^dLtkUAB<8F~%lCA#uuZ=G$e2BWkoyI<+PA|iH%oCt-M96|cS@U=A3~8W3cYq@ zVx5foDUofez>9RFxRmteeGr}GrjR!mV=}#gWMsOpjV zn_d^t=dMKZn7;Ze%DExc(nGz$#%C~a7qvOd5+hlK+V9(&9to&aHdix~yA|=wC)vXj z{Sn)b#QBv3QUdx!`9JkHFC-VN1#AB=v40!N>Enu^kXtR(rz^u3w#3bs*t#w3oZH8; z<|0|bD5?_UKUW(_b2SnWCn+_eP3K1PlfaXu_pc)K$dT^KtfW1Iil%w8 zzN4#*N-N#W1D_keI|!_BG==rngZ6zCpTF==cw{UcQHNwvwEHdBrj4&|O(!B%7;BH* zI!=S#A`Wg?NEl%lt0q48W$Fo#v((IGlI*NhKgZhH4M1m>U6aRkDH@l^*iyioQuc3D zOkr|LSYCxJvk|K#dsEY3R3mZl23K9c)23bR;aL5%y1M#uPX0%(T-ugOv$L0r-p|j$ z4^@WrVINP8X`RQKizXk2-?;WZQ453g3*GSAW?6XsQUpb{#?X1#4RCF>jZ4(&8i3&S zQTX48=!7YMRdjs!Zy_l@i@LAq%kAl>R_$iaa_Fd@>tG_Vd}DW@=~fPmi0-X~b~Q9z z_WW#LdscnJR=XD4J+tVdzPWxIdH3+xl$lW7+2t}=dLLkRdJ^NPta-!x_ELLH)#Xin zLuiFJIF0)%H<@;u?h|t4Q!FyDvXW-uc3zjcu-|&_Tcx?;^L!H*M;Yp7)k#KZ5s?uS~4C><(j;?f~qDXf417AHR{tPS>Df0 zXsq%^*WbP6>?iA+4Ug&j#^H?DY6>Y%e>vOmd zga!i-3p=Ry9_r02&_D*Jwkpz0NsB6>T6+j2>^cPntyZ@BXl!a4SacfkxGoZ|W>$S< z@_Ww%ba3u+cii{}lDO4elcs7rZ7s~#Tw0m37Q4l!2Z>1py~Up+>T{pSYM=UD>-6osVk)1l$eH2{bcALzYdVZ*37e+mGHmFFL5;qt zf*vEiNg}ls4Xb9OcG5R#$4hP#4{qy_ss4|Irvyf@LQlEhB!&GxV4TE!z!Ip{lN<-# zM<)=SvD~t?&&c$i(yu^|xm7sH)qH=7P>tWtJJfVsy1K(T=3i%A>^e+gp){3qBP#T0 zf0OE_yNpu$yO}&U|1RdAx@gwa;bb*Kf`2xR7mXn^IhT3{?#)ouf;dw+` z(}6YYlxKJl4TcjfgM$oQ9xr9HT837T;o!=%9thh()TN6cySlLSCpd{Sp8;EijhUmV@Nh)z zQj~}z-R3AK>&oLV%ovp{;eO<~S^8MuL2>KsjVK?RqYqD!5Q3I`$n)AG@anp}UrD`c z%!Q+c z;9PB4%kFt4j3-TCt=N{|uT9{m{4+MQ+M3ZkT+gzEztS~$$T6DsT1FT5>+7uhH++Yc zYT-jo>hm)qSuPZZNZ5BmOEW#Jgu zcE7ARGlT#7UQ$-d5Qh^Y=9j&P@GVO00}OnP##YuadQ1K0C>w5JYb-K6hA{Lh^jta= z1hgNz&V{Yq%YSt<)dMp&@VZAqbsEW&u&GUDZdbaQ%z%@Z1+>n28q9kgD_IJ( zyCPWn~**+RfODO2Hd-n0dgyve8rfoyxE((Y#T8T;N`6vS3V_@j^!b z)rhwK=#w=F|5k7!B-N_O*>?kT>U8w*{TeX0+fk|!ljfvpDt2$|mIL)_MHCO&(0QvIFeU;G?-j7x6}n87 zZTi&qz8fhE*RF1?MPP?~c0*Sk08p zj6C3>-W^_pl5koJz8BRU;H?T#9g}a}ZF*exiRcHmVRcEk=yp$4X;I@^pMKu3Dl}?s zJLS#W{l)ljPB4B-Sq!laV$p5%^GxFOPVnv3!1L_>bN0c|#r`v}-f{_;YGJ+Q!DVe0J0=_d+V>PX>Y8bO z*qw2R>wo#LyOQA*mTT2E-khRS(CWS;k;hWOQg2G!Y}^`8?w7C3e4VeXeUJQB4|Bjyc&t zx?Wye`Mh$vhKB#Xq!)F5WV&7akmixfNR?^JK+BZ$70zp<%FxH;>84o;v%bE5R9$E+ zPBQ!b*F;8BJ*uxnz44I5v5omqN$R+YKXjOq-wV8Ev8S=<p+TKG*Z6dB@88I2Z+*_0v zMRZxs?YFBakB?fSoUe!UL}TJdir6z)L|fhc zR*zg@V`NZma$?d2LyK;L|r)V~G7Sl#4&tjsFn}YPd^;VCJ zc$`=Ijp*zD-750fZ~l~S<#8knWl}TK+@E2Q@_!1SE48cF{!<0~l}?QbHM=IX5~%N3 z{#7#!5U3sIBm((SpGbXROL)rQqlSUvdi#d2rfYf`sK@p@#zrq{$Zy{Gmxj)r``bw4qzxD$Vjds~zV|7eqV; z(Zh_nL^^jgA=D8qcf)xO>8(cLun_>Kzd|kSZDI%Y9>nb0&Nty%@{){uU63sJ7Va`cS z_Ov%Mo~}lJO$#r%op~}fzN{_tG^@4c^d+59GVeH32xUE#N)rZ}HkWq}{2*vuiA{-K z-q>JrK3o{yquERtwf9Sfm>AC(@2Y;XXsovHcyG_}dv(5A@Dh?KLpB>wF0~#ty#}hs zPxm4Y)DW%y&x-TEM-=%MJZ~tcd*MPXCWKR=*kF$MG!3Y9 zWLkPUt_3HzJa`3ZbbePt-$eR?i#t@c|1{#?8l5oNkwH~aVXL$#KiHeWR-^#&JAlLP z()lh4X^*q1yOYV?MO4NZ3hHWuu7nSfWW&0OatZdG*+kA4%0jKZ$>)@Q8()Z0G3!PY+-4BJ1nnW6i5so@wRTBCAM_FAGU%6sDAzfwWIv+if@cRo8nv zv%Swl-q@Ru(%AX{`0@FsB1xc;gg#H5;+Zw>q`Tw)Y5yDMRM#+={w~3qO#2&jojA&l zP{M|H(lOWtjPCsvur?L0%+0VWi4ND8snr4}u|pRM*_G8oX~cPIB2{c>rxKGD0HgCf zXR;tocth|9v)q8wY*!ecC1#B7S^+bRMtroz<{!g+}J>f+2c*5{{Emo-q4)o z=4j!r+TRLJLMmfPW*VG*s%qkBTg)(-ocaoRs3@DkzU@A*0nNT8fYvqDF9;#-a= z#9{^uz6BRwuvi0asfE|PhN-t+ty2+HQ4%{)Xr`&P`9-DDcRLzyyoMrSLd&w{4KbP!kGxeR9=+EY%&vC`MTr}?2+7y*++%vaOBsyEgqKlEcwZQ6a) zer44mhw6WJW0JU2hbFZIqfWy!)TzdTMM7^^q28CT=T~Qcc&^e3B7xB!mKXvXxw?ZO zR?i$A$AO8OX)TvP;!4Wr|0nR7gmy)qFO1IG&yN<(rq|^4%whR6U}*UCD=!1{J}tYh zM=%uII+ZOgEiv34%o}xd%DU1rF~vvJV9~NwdefJ<07kv*GP(Tzh0A|g&aw3mSNd`! zM4h@wfII1N-)nBWf|%V8hyqANg*A~8q+nWVY`gjE36z=~BA1PFQGdVLQX%Vu@^eJa z+b;!ox8wKDCeTGhzH_;N6I*3=Dl+2K_$y?$)>!aUooqU)QA4V}YyFb&!A^^WWvM-< z(5qD2XF^qa?E4Mj1x;IodwsQVvP8=Nr=!WY6k$-Sj!s6i(@epVs14T3WPUXCv)SsA zT929r!7%-~y8Y4mwK@X~*?usbhbtBiO8SIdbLWscYfbsNh(-&E9N(Do^-`-?Mt#{D z-FeJa?^kw&75NWrot1uSje2Y}>i9F-(M#5FkG2yOP^tDgmYrhyBi{Uu`0ZWdMK|{c zSXzvu^&%OxHDJbR%e=-jnK&(X@Hv`g{Of*{B9X~<{KLEGj9b*m^{3lX+Q0JZ%#+Rt zX)*t2+^zm((Iu`wc&bdl zp@a0^4qOQ#E+t4 zy;xpUIaIC?TEkw!?oz|*XHzb6V&$%S)~Af(57fn7Yk7?OIdFc$Lga?>A1=RE zPak%5tL?dH+y2bQ!3r)G=}^2nu^eC`+&P)U6C0wk7m$YbyDd3V7qus=wZPnaf0#*U z*z2~+KaCzFxVY-z2Gtc?l_2q&*kygWxXcgex>#z0zXVmlI+_+p!zMI zc2Rsal!?doGv^&m!ww1Ci>QiaZ4;u5E4@>5b&^G#ZA_mb7Zwc}hh)%oeJu0wu!ZsJ zz$uFgllF7lX_io&mj~~i`bhPMZJn3Zo1Xuh@%_sTw=3flBZ zM)|x`IR8Vl{`oafH;~U9!Jukc9!MfEVq&HsjvLjYA1!{$?6q^#+WsS^qp&X5%h+q} zz;ChF*trRxF-d@bB>LFTW<%M0hhTluw`$60!MCcj?DD@ui2vP1&?wP4)7JTxVHw)q zb@R4JV|8_DyO-hDhBX{&PShY`Io%88+1}?|X*dMZ=C+3!xN@%5Ru{td&wB~YXX!o{ zCyCp2o?YFFmT@I{2cwOD^&eW~e^1<{96bE4yI)69^#r$D6iWMh>zsQXRyq>C63$NK zOnivX_UA1sGI!bA&DRuCl!Nh+UMLhvn{+B|8@6qKI}a-i+Vka+EHt_9QLo2NzFg(u zvc12H)8~-1dkiT+eFFVSs(+q~bF7zgF~~suviB}3>`j~ zj_+ z?Q^bTZxBSjfuF$Meod>gOcQ)4r8}|b`ATZPiGAa^O{k-N3rXC$>1`EQs*B@7KRe_= zTQn`R*?Oh}BFmk1TfvKuYW%PVER1Zb8J-I1vM7=(PQ0OS5%RvUNS0dhF9H20VjLm> zqBF4>O*c5XxME-4+w2ce6%35ony$^MVeY#Y0O(@{n0}7^Q+kn%0YOWA`h-X#oH%zn zI-z`Mj_s5E>kEd^D7%{Ob9?Tsb`Xg*Nw2jOoJDK67aIqQ&NW%f2rE5rV&Sia88uzu z_SMODf(F#c+%_v+ud^(WcR%_iba#x9Ie zXGvcsCJ5>}pO=^aIjGC2pqP~uS5kMlfg#x2N-~*)If6TOg-)U&Fq-yh;%!$EM$Pxs zCFidu*>&O{*>){J$|itO>j_t|%bn@gqt>3aM-55+m< z@Pyd;xg(a9<+KZtNM-XEC(MGmCY1E{1WJkcx|NyoaiYRuOHcJ__^pLEBeW(*Z&5_> zx{6__IaVad7A*_Em}@;v=+U=O$Qyk6K}p8~@+6jY-ZsB8D?dY3I9FZ%H2(bSIGO?) zrIER74iZR`ScdGDk>1vstEek4S2O4;P;2uNF|&FfxzvB>a+X{WnL5o9a!UhReDCP9 z=D+F5e?REyhQKqiS4!k%&fk^K@wJn*fB5SK;1daQHl*7^1{cOpKUV)@)Eh_K&Y!&i z08(DM1<>quF#YLz@^3M0&jd7q>avT&Sp&~qVGX4J(g^rl|IVEM{A#WhhzDld78g5f zAQ9Q6h6~fCB>zsE|0aasPwoT08{=66UjmAg#OY4(FXZ^IWkasA211nlx+BgSC{I9i zC-`o{Z=~aYmK3CV{!&9%rp&@`xd;R|!iYPSRm`A%9tW2i!XdFtzY&rDA%h&TO@6`i zSBnlT1PKB$rG#fuG*_-TRr>#FypmGM1?Ev%n+w>dyG!{1XiyGy`%i}cMYn(bqc=;g zhq+vnSU|)x596*|bJ5YgQfvjV{lDc8D~?$Bj=qjQ=O!&rY>S&pW=UR0V(f>wF(<)t z%;>rxKhpz(p9=1**)LTFl5iaCu9%rP0a>6x{@|O%68^IYb4v%1NiA`4x-$pf0A%g5 z^p3*sH-i_H39ww1i=FiTSpy#sy}#1H!@=<=^Wy6N1pfZgtN%$?;2%h$4e6b@SUk2g zwzH0-94kG66UiM6)@8wmXf(u>;J4Jr3%W%{)HWsY+(k*EwwRI%h(uSZt=aE|(2RS} zpCN{iQswH}CNeIXN@yDUd1PbM#!C?hREoxg#n(q?aBDUvuytCPB&Xyq@5GN}svPpd z4phA+>7DyY#qUhaEE~s|5WNuzr&`B<&^0K5NO*_loI#>_lhi7i2ox_nIJRs~jXr z18x&tuM?NLtc^E7hsM9Z4f?M7L+fp3FCRB2XU8+P#9tZse+iur^3@1_LL_tX5G=6gu4TjwMyVk6&>v-kWDMcsv6+L#MO8AxJTEY%Hn1mD(8} z`c^2A{@gQ?*19KmYNEI2hO)GN&v|{0^b#>9(t)LiqU1@@avx@Zv$HVx4S1)kZ%W)| z5N}8y)41RbP&}2O>h{?vrcnHO!||I_$|_5oOgCQYVJXUT=lMlb_lJF3 zL)|L+{}~SauX#(ziJm*|F$RW72SVzfmITy{68?4`ydd*)vzp<2J9uEhKyi{YBo)9Q z4*|7Hca`Q;7vvwCmje^MzuM6CDS4>Nh`symf35SM)Q%P-*kkfh(ZUmQl;IV=`up|b z6KQb(3O%Ii8pBxwpHl(wCW+SYKVsnjrKIJ~69ab(m*VfAInWM34`!RsZGXqPpL~7v z5kO#9r=6|N8u(fbAg7(N-I=(B^C!T$XLRw*fhA;D+bYBjeTWSVF`3m_Isl{vVs)-{ z2n4pa)=&WWJ&5e;)z?=OWEB)bw4Ug3w6rK_JvWv}BM(`4z-QEQXm=kvnY8DnV=Z#3 zFrcpk)NftMY&Ry;etS33fj2UF<8z?X&twt8VWCXUXwRB)iszVek}AY`SoO^G)$3|5rWgrd)LY!&}Z=ptjaT`g`XWn zErE??%E<-XO)oAjy^@#D@!{UUP+{8n9x_=F#qxV~{QAkHrLrlb(;pcv1ps}Jo@he) z-1{twaBFnP<$_C(asrQ|(>q+h8tLfs&9Nmcg*Le~QR)Usm>V=i?Siw_?#iCJ<8xp5 zfi1rTVc(PVH4qWw6CK`8pV?SCLO-u@gF?A_tmZt`&12JI4pbX7cC&k|axebkF+V9s zq*@;cGScN&LxsE1-)rU}sJqh3LRVH^uA=4^a`kFvrHvGO{|X9Ss=^wx3wBr1G(258 zU*DQ44w}6&B&dcI;V8*<;A}(+d$}+WU7_w}VOW$d*mbBm-}A;*$tBf}ru_>7f-)Zb zh1GotoGWiB;my+O>LJ)4N<^2w!2>5?-ni_7Z^@71g%>*9gIp(*(CZ3Er$f#3`+<1# zg5*rdNCz`X89LSL(P{+VxMk_&_tSm%jE-jDv2@*&Y z+gAE%0s5BevJUM!$WQ>GEROBs4ig(;xCBo&X1N9 zbmSL=E7_=t1n#fy-I%3pSLqDbKHI;Xg7L(Jp@`%5R*L*=H%sk zx4dlQ;U%iRNV`c+%Ui00(==RJY0xkAt>4>`6rXN4Q;Tm_ktCL)p$|)PtOharOy|AM zk^IqcG`ILEGP=M2{cFsZ(&;e%I#*fSnn^}&6J`CW>to*5my`$#49=6E&$8@cPH{(U z;cPrC65U+9JY5`qQ2z^YW4z^9&WNeplV2f-`2`Xcv~Ee z#kH;!$3=)5O{Vk=eqq^MfahG?9rxeJvs^`ZEihHyIwGa*eiP&6DA6|ii{tC8!79S} zSbu78Yz$meW~XGU#*a9(L3?9T6eeMauH-$KeOSc;yHLuCMaTQw&SUfoRrt~G-$#zt zldP%BZjSQ>$1l6!{C1HdBNNdBPZ;F-d;X}a7zZmtBt23w6ZbUSbHPnmXTyaHPd#Rc z*taHzeWd!{zgc*Y;nv-DbmD~8k#9scH4(&r-BI#DZi`J!Pr%pD_k3B=KDn8b>|P-( zJiFuB-i^q^X{#k6TJ{7QaWG3Hdf`}St2*xO`$8WfYPXq$)7AJCOHeI^sc7Q&A6l9u zlnl4p5_ly2wio-v4|u2-W)t#gd+|E>>kpSx7eC*pbkAY&o)z%I9Z_QUxCV}jsvO@l*SIyq ztkEj)9t(ZKT%4XRr+#fn$;#KxRU<3pL5?eJ6>KVq60*BeY3y|LjeS&Y9esfssX zD2j148&F#&D{Whck2;vAxS9BEmye6h$yYZmVhkAQ-BrSnFCNzzG?DLt}pD-5D&q%IU zrCczvZpmc4H8Y{=opqP>7e`;2bx)JfM1m4NO~v*Kj2-Vvab=`S`)i!beAkDZ6P$_QNmOLXAhX{V*^>R( z9lMY@i-y4C418H$_-bwN7H))pwWLlMtv(iErTOgRHP41R(Lguc?192cCB(X|ckb0_ zVSYeTU{g;kw4JC*_-+Y?PtuL?a6nZ_WKe*+Uig(l_Da87YZ0%ZeRW7U6Fl*1qD!lm za5IvVu#3)%J9z z++~-^WziKVtYXn}kkgw*G->_*wwK`ZFE1=h4(eR35w%;L1skZ5$uY}V2Y4ykVX*y! zMGjMCd}3nv%z@3N6A+bZVNu>Y#O_%0#6gerNk-S59##=L>mBT~1AFte@?qB=D%2Mw ze?3hZT7fpzu{D9$Eq+O;!LVY&=B3B*@IrrpkvXA9_j#sC-8A}%4S2OY{JvdYZsF&~hlpYkx+Pb#f`z() zL&*%Rlp$hnkJh;K7=fx65@ytaIrc~{TtK_v2*(50VJF_k>Jry~cr8djtR3h^P~#Bv zI4?BiX+Q=5PKxR2bsss)*sEWckC?vROYG3(697PwG+#Z7);Cex;^} zKxtLp5;05h1F+70} z&X(!|8rKkcfgM-Dz$&#GO^DqdqqfMjg9`P?m>3J-GgA2G2GQg&Eu{LrA~UYLHppAB zE0ttd`_9M--JY49(hi?Y-n5%LR_+C&2`}ebxcuO3<2lZ^I%TU3xPiPdB!Sg`o8U z`30ArgQTRTd}QrhY)n)ozADAeN}2z~G$&H?ql@@s{r;k|g zdQ6Yxt|}V5!ixx-YYb&Bx4$N6{(05zWpX9f-x5e{n-3pQf9JPz93zBTgYQm|AB8V< zi%qyDjSG3b^-13BkwhM!YXV(r`GaJi53$N6mP=a`cAWdQll#~q7}704vEd-$Z)^F~ zq4wAYZPmPu-SfnGNe4!%<;fcCEiidhw~?njUSNbG`i}%cT-5GY4tU{&^cH|uJaA%+ zQ-)XeI#o`Vw|slu-o!mvM?L64ogT?E4{lhk4tP|eRMGoKSkpZ}>VyY>+}pg86g`zA z`i0SDg-cF+}wH@al z5}9!x!R}U=U9^#QO>y`{FQ#67+-hjPlPunCH@XX?tWOLt6bh-kjimWbJGn#LvAHwz z)(2%$W`ZKk)b<4={N<~AIamq%j36N8t@#2&<%`+?g zffz*g$`1DAQuTDFt^G(zqWlP`dOF`W_+`BJ(Kds%=@(AN`c3FHuR*6BQo`<1=!A$| z2F52i-djo<$~?)b&FuLIYD^>L5@#J~KHb;mL0>y)f3mwH={!M9Yk=&3Kl<{I3A}ic zU0Pm)*<_hK+?(;0H>()X&GXXw9~o)~4-OJOMa4E#k{|xK{%)ah3-C__+EQjo_@h!i ztH%8?YR)~NldBY$mbdG7YLae{T)#PlT{^EHoa!Aeq;V29?lZEsQ?*~)Z=n*$S1$YB zbEdx0EJ=bsqNbRHe_Qcf<+y8#AIXwaa>i~GP=TC`=9?@}nP9nSXYDU{+2E-0>Ikphct(Oi--fziWKwSkVrDC8&HLY4$kp81|F)s|(ELHIqiV7e!_`mT7my#$5|k z1?0uoHu%d_Yi4M~4m9e`P0UvH&=!>lyF2&cD}(%#j_^5ek1ly^w&P@-^M(m<->Ylv z1#%s4eWUucbL%WRxtb3|sXId{cefeA}Mt{nxo` zvpqgI&YZ;WS5h3b%ehsgi%IxIxE}`_1KIEImaYi(&dnCXz!19v!?pE;by$3|`?6B^ zNAsx${0gM%+WuBJtQ*#-Nn!qQz&_6%wi3(RMSJiO^0sFETQgxSGhKv z&Dde4x?{<*H#^WXo1Nqs6QznMUv%r8$_K|=lPu;-HuCBYp|dmK-iUrxxc&SsAN95-o1qI5HVbbDpeA@-DkjU%E6-f;fGwiTiR@s zoMx((t?GRT0b#tNF-MelyC_~rtkigqsQRGp4VE@-++P!V07Ir^v|(LiBIerPw4no2 z!2xw!O+wFvQnqD=!wnZEE=mROw=Y?e)N~KA7_J^HAd>GZ`lg9*T6&~RSdQ^JSoQh1 zW8GSbEy`^lPm-U;&5mB!trCnMkE zFzY~M;7}J1Es%XPzL~gmxHzLx6RHasDZMm%hF-s^pwKzafuSNAioyxURKm8T3oBwL zn{SW4H-ioBR@Qw0a23Pb>Sz;CJ;x_ZHKtbW9=dApEm~(VzY+ z==wkIi5wg8h9IGk&WuT`&vlWRN5LQib*b;8=~G!Qs!Stm!c@Hj874ddKl<9bxpqN> zPd+x@qqw_Xf$3fsRZK87baHwzZUEPDtBXzB#yGB5d{_5`tr#27lx;JwKu&zRyKScA z+P;wUGKAmVNw|r{3xyd|96NWCbr&uX2$^P+uh*YEgBxL-n!YQ-F`n#$iox^-+2bea zez^50lHueGGv8O--rbVySccdSb9OoOs^0eHK125@Wev*0o;g;}bo-3!OLuEhQMv@j z*F4AAR|?9%iVV+{WOK8_t@eqnQ|&G2}8oZS5>yqK4te-l~?8hfgv195Q=SIK2ubn}pLktjC1 zkezYMxtP7wk;fkG(|Z~b{Okt!>QsN^{i!Zv+uZ*{qD zVk!%kcHBFCYxA%_BkcfyTWEdiEhzm*^>6+9AF<~o(@0Uw;n{~f7~DFzxr>q`nMcFp zBcylJ$bU(}{m>BSY-u3WD00&!G-YQo)~OKdWGk8M{C0@|o%e~4QQAB6n$wT#64qfA zx&e>+KuWWz^=AFp^{?B53vv7lN4*-+VMW{_d|tTYiw0DH3qsNys}<` z1Fpf>gGrGE#cFG1YY76M#!W|bCw*;4dbY}RX|K62%BPe*+-9i#F+MQu+DOj;fc}hg z-QMOJucD-*Lv}&PyS%Z| zBJ>2#w$UI|5jQ?COM8#< zEZ2^;8hCH7dJZ4$+wRJv^`eR~IV;C+a~xKG zk@EqeZ6Ck`&woXTd~&6sfh0hAED&A&@tTlf3y3nhfA?RUe{Th}cCQ zrw0W^$sB*7sF1)e+EhYpi^?C4YJ0(ZC@O=%_iXUAgS`?3a!vYe<#fZqPsC?zUtvbz zs%@bwLkf?zDnSM&xb+NuRS-4GZX9sr)@&zgWxGb5a2@q0nmk{6v22kaY$ArE%8hd;uX#+VyH3v3%wy$%mj`gK^l{KMUf9o~`J;S359*5f_hKgHm>uAeS z7R_3Vns*o1_V+fpi%aNxj`p`dIK~lgZ|m(}8(7bQbC1oHfy)%R03&dusyjKcB4RV! z`AkDwTbn7ikJ0^;1C6(IJkL`5y)|%U!qcBD%G0t7KRw1&clq3jTB&1xJPS3X-ZTjF zn2CiiQP8Tl!AcZ{@od9{m1$S4)84daL~XdC=t2|4bLAg0wQ0f>L}ps))7CWLI0gZs zN5R~n5Bd3#+YGC{4N03Vb&)-l_x^wy-;c^WaMKlD86u%2oqp;hFpj=4izQot6 zPjhrae3>rSP@e~QI&Z7QRbko$znbeRi~(=Q)UdX*yTY{FV^|w>0k>hUYWujI6A__X z7xz9o(D+6Vp(AabirQ|@JAy6m$-BF%!t0yypn~P)DThbRYleo5i!>6$J#R%rze1oZyM!u0|keWARUK1zun^0+pyUEe%WU z+2dI(A*BeHVP#PPZ5c;Zngfx)_RWTs+%&bL)e!EF`ZZrGzVk5(n!oPIJbrQyPPgMQ zqbi9VjeH%ASh0&=JZK0a9KYWsDjR!_H}P2!WK10mK%$nU2q<#9?F!(!SUtuY*fa8m z>kadjXhtM}#r*}qdau9r1L82#=#s8Z12UNx3RCCno{s&#=uMT4U zt~t3u51BBf1$bZ;m9Rw>7^1VYbNuM0nrD4&z)3KrqmhbdFx9vB5ZX_g}e?uGG=%Wib73N4v5_yv&Pa z)1*a@Ua$=p%HWno&TVpV>CWq0pWy&w|g z%e$}N-=)t)C1}(aSV@ILnHDDLJi_Ic5Yv1wkc>DauJ0GF9%`mdl%CX?@WNJMM%228hX9swWghQQ&|g zc=uiSkCL{u_Y0{3ed@sbm30*e-?0R2SdXe1`y5R=1b)F_*P(DC0#{t!Ze6W)YX!M( znM(Vb$2fN1y7FCLY)NWhZzbC&Uf}`T6en9^ruohSXiSt^cA|SqPZ# z&sBmRn(C$^aTI=@S+{qX z`$=v8+vahFp5qlSp8zju;b{Lg3Nbk5Cu;h%dI((PP4kVUuMUljn;s>H{Ph2^)neO6 zmO?W29=G55O!zPf-`oizWg(MDi7fFdT!M~Oi^=ZI!d^G3;PeV6f~_7_SNc4|Z8pF` z83T}-`YT0Z2d5`-0GUvLrvYm>&k|N)ZHQ%_Z_xMNy=cyRv=AX?|G1If#PE|XpWK!}CozAI}xa{I(TI&Z$pfi0(W>tH?&gR=3P1wIj) z?8C|9)vP{i1;0JSbf5P(c-%7&Jn1^ShV)Tk zQ6*n*;6Qzl{s6Wq9IQo%lRdoCtR5dnWJ&#Mv%e?8pTyYny9H#U;eG{t)+|z{scvOQ zO%3JT98uXGqakhPF=@67G9S`u`$O_cf80_Oo-jsV=yLhE&m^JXvoI7^Vo4A&(k+g2 z1U!@pll?K%BR6}GD)ow7n13b6y;R;eWrW4#uKlnVqHSBh0=P`I2d_)AndZws&#|J} z=>3Qkhh3foLOqlcF9N&{-{fEyMu$cwSod);<--Qe;0N{3vJt!6*GX|KPbe*oo`ZgT zyBVe8r1ZwF=KHH@R23Y@?RJr&Yuuqdiut@*7-7% z%Z_Zw3JmTB6jMYU+*Rq`=_1ryz^)MbA)^fTJSDFa7HlJtB=L zRa%M%Hm|Zs@Ej0p7x#+E%9vcX-jyDEuMp|jZ=xhh6I@#+eAfExKPyKS$+`6EB=}aE;-RfE52xTSx}J zp*@U7I&xR9yG|l<9{Q~2rQ5L2qzJ3ij($!@Ry=5q&t1?ION?Z59Ur2Wo-vAK5YbYX zo_o+Y^;%o_1vPXWh+;a3=0QikGa|4?Hh~LTo6C-^+-`#4Vj+6RdY@LFai`F=CMF3^ z3za77&>H|m67SbE_*!6AX z{SlD(*B_teGU`(t;Q@nqc_fUhFxhrQ-KFhu=O&tU-%@r# zzku6t>1)5ZxO>n2`0-@#AoJRFw=Vuo*-aavnQ!Gux&=%##Vz5RBlV6rE6SO$wRwJ{ z=gSju?`jsSUQhZTAf$H}`)*1O$)_x!4(@}Gc9O_qhmce9gcjeXPhYQ zdCY35Sa#julHz4~#!yI~WkTfc-4Usrw&1sA^*Cs4CpYQKVa@f!T(y2HZ^l5foZ zFPulAall(g>~JW3n12lOyw@Gq#Y+Pgc9WkmubvvfH-=r7ew0WQ^}y#)h)WDx7qG?f zy$9=i+1YGK*Yjuehldjv#(O^sT1^EyU_M>k?;7qwHsBLxn$*`hFE3e!xeu&erC78{ z7oomQzYFGCZV@;&!|q!Qa2*zeGZB$_te0C%5HtJ4%6J~*el+t*t1|OCbj+1Hy$gdk z-@pIxXX!O9hol03dL!y5yj@R6XC+qC=2hW$x%3Fn7_MKlhK2LiFE6hsz@vvUuxd7< z?6 zza2YTsykSPKy9+Nq^K%Jjrgh;U#3G-wY{6J$^7VGXJ#i|o&0`3_=&IxBd*}d-508- zuJqDtp6JBJ%Qw?{#B9sR;r;#3t!-?+tED&>-QeZr-T2lVg$A#c9Pnv+oGj~-GOcK} zQI7+D@hkwtwroZGK*dFsiL90>PBw#}#Aqs)B9`(|0!A6oq>7cEfc?{A)^U(5n2IudS{F|U%GIYaTa2Lm>uVgDzu(*z! z`Y=G_{a?`d(zj5#3HR#-hbZ2n(ieSN0Y-1G6}BAikppW>{mhH8SYWb9r%x&>*qFK> z)%jdV6vM_QSJj!&2eR*!AgZ~#sA>pfiNv+i7svB#M5%Bqe%(&m>X1Uqgr@QqJbtPiR&b= z+RIN^@QDfoCy?G6>~J83wSuD!DHikuo3uCo$mi4p)=nE#OKD0&L!+!?;S4L^m}|Z- zdHGw?|KlTO0|wGUoaeHUN`62MBC8LvmLE&b{tq;_2I}&nL7-2LEz9tKw&nQWBxpHH zAX^!!nvY8G%DUZ>5~2qb5Y*B3`sm`mKA{B?HfiR6RI^1xeS}8Fttd|g7<+tjcmtbc zxp`0^weLpH6}HQA4LAbto@GQ56v)B_^(V7qi2MB4NAN%r z$^tH=-}jq@sZ`eWhsnKd1pYN*eq9fSPA}A8J^wQmoYk5}DUaU7QOPexSX9)b0Zm7gZkbf997f zYf~i0KG6lTX_JISMUr&GQX-u_MDODT(GkCWdp@g+h!3f(@*oHH@mq5HtAYniRMhRQ zK0uwNvtXX*k)3*i&{E%p`)5I^fXus_QTP$a?_R3IcALVuGhX`wtYGD+9;coCsv zE|}`Js!u@#R_PTSZ7KL92`L0?tSJzqmd4`wm|GXEALkADh~*qOt$tIV%R>3iyCJ^Ynz0 zzwb3?qvZ~P=sM=pGS4-sr!4K=YaPdX%QrN(fvRzhpEq< zs%8GF(>&yk#+6i70aa};B!&bQCRNl>r;F}i#YgQVL6JWUWgdQ=zGzCqS9E{A*0Py6 zC-NWj|GmS%KmE{ec!Lnf`9p0tR%m?i239f$kj6m&o{nOsGYgxdi0ryhRKYGu>k)m` z8f{1V$ENk0Z=FSrFI?#YVvZO1hL2pH9ncXb5F;PLT}Lm-2Z=v;79=c2 z)zB3}No4;QK~CL$dvahzHDoj?q7iLFH0``E)+>^q(!L}sKzxUsKrjR6K6cor5Hj!R zLWSRze4N>P_jH^6uStSp$*sE7%p65|fSO2lKFe;q85hoC`FV{?+CXo>n)AA*HyYj! zjSX|Dsi}QTy7O<1MNT8L<~gfEH8TfMt2}`!j-8GcwJYaMNu2p9!ZdmA6lZNyR9ihr zI(1urZ~9SnVC$IhJlM=}$ByjPhL-WnU^46cQ$t~GT0eeapB4B~TX+b1e4J~WA|fx3 zQ}K+_SXM=1;nwVu3IZw@@-Gt-&z;81*&oJ#LQ&d0?ZQ`uS3dN|UTLr65w_)nPNJNpiemsNY&!v{~rHmRWb4@h|w^BE3RWxUpFg)_} z$Y?q*9nkn(Pyq2*_4H`rU;26Ka&MPPM4q)BYH4kd(Pz^xQ8&hk^p1#LUQ35wIXYf6 ztGt~=5QD+YMiGZ)PFxUGK0}@00oE|$qcxA3nGJ&nHwVXig35!@NV;UIn3YkX-JG{n zwi!DJjDx0#pxqUNtk3PPOc(OEZi*JC&&7UQI{wedA_Wo zVoXn8+XV)gAeAJ@h{N+RVN<}1w(rSdXdmoS$srtS&`S{S?6-gc0>AvOd}VaU-A^n) zm=N|E)wKeLh{$*C++#!u3v|nUhSh!SbLGZZ-Ae)cU=>V)WRb_qQb2jn@6JWgD%D~; zWY8)zuO4VGEPDV&K*oqe!@y=^Z&nE(-HV6;dKnC6V2L;g zS&98ndP=vF+42+ngUeUR0{$A{Gl?V$Bc z#Kt;)DN^*M(l;$mpwHUh1#bWSshaK5Yh@CGxNLidT%$M;{W(1wI~0_H%y_xdFe z+K#XF-sIpx!aoLs2MmZ(rKERU*cP-May7q=&xGKiN=XdA;JveHk)E8>s`LMBF<*$WH3 zc=i$+DZ>6;a8kzm^a`v$MWS5|pS@4eZbjHX`@~bM6xrmE5>Fn(-0(zU#XenxaiBYi z*!%jHGLPXbl-yMeZpQ)_3Hbd&FSQc~$;I|}6ka%Qz-OBZ)jpSlhlmCFn4U1aa*p(`Iv?zqIMOr-9 zYf<1VzAux~po`x%KmXL)+MYVblG7sVww9)r4MDuoH{X4^{-?h)6ReCx!k0D73?tM~ z{Z(aX5&@OBVI5tnO)Z-Wc(Cefg~TpmK2FZ}`JIBCyx$ed-!~wy|K4mmYs&dh@N#j- z0%gOP0xL5!*r1s38?Z%Of?mA4h{_v{^aeSwotzS?!p_E~abT7`_ZT33B$4|7;acm~8V+i&SV$Q=8sT4SnUe&%pya zdG@ZG+2#Y4Lmxo3W%8Y>@ug!$Jhvr+%9P71DuBM+F;AYxDupZw#+?P9q32^E-vvbS z95q3RvhvDD`pmAJN#VAT3SS*2oE9lxQC>c)CnTJ^P2l&`_vKH=w(S%S87mPYV)yHs zWO7Xnfc`6+r62WeY`N%g{iL)hTz{Xi(>`Ttq^GAhFd1lu8f3ciMsMI{M|uIS#PHLk zsoQ=B?tUVAr^a*s;$Ae2K-z{Y3jxZ^tG;cCNeF+HB^8*bY0k7+8Y|-$F`BF@Uk%uWSVJ7 zkY(}!^Un-dh~^2<2A;tQJOX@tCijwz+6N3ti^`(omNzW$yVwYgLGs@OuSpEcC+s@zZku?Uco#JsIpv zcIU)}Fe-mVuN9$6Z260XsK5An$f4-0N?>)9d^~s@X>L3J`zX_;*F?%! z`E5eTsY^d_lL_3sD)w#xKU-`1dCS`$=evHqNjM8o20aMUf^vM5CFmlGm7=^eq~X|c zrR9ox)0vIvGSB~UonE)dAf?8c8}vR0e?EVxz&_%j*s~j zu4G!Ao3#(Db}lDNIHQ3Q9s!!FS1*AZ)cp{7sU3qipku1#*HQ3$WfUm4L;UtCr(Fm+ zt>Cu1vJeu6=YmQUsTli6!)-vM`#XL66Lq%-$(1};2zR<8)Ud(RV1)3Fpys^i2?^ef zRy%_)-w3#_JehciY(C!=zKoPY-uDvyy|Z}EPJ}=K^f7%y)WDb|0ZNW;3L(4WmG`G? z{X)OB=LNPlW)cY9=k2+o7;j>5nV>7VF3j$X$W|aN$CKRXBF)8$50z3E?u_VtYznDx zR(AldRDL&K&^XyucYVe^3ufS!sZGuo0*`-(_}veFQt(nbflv?E9j~l21_I4(DX3W+ z#vjY?oPO=__u7J_s8}1igp@D-^=6H~PSJnRn2}2^u=?Z6)idaUN8rUK7YMP8y>{;J zSx)~X`Xms~)UJyAUu?>eH;;e~|6JzJC5lV5kr%zKWnM?Di+!OQR`@LiQIr z)*ts(jO7^aGV43k=jpcMc*o6P^Y-?0`8wztVXVn0zpu>ktP6U~L)+f9$8ROIZw^%B zn2(&Q{jUlBp&IZA_E;YavqV;-nVdT&12B^(hcm^t-=|w3#*<3^qKVk&WuVUrlL>4KFi-p z?UVYmK3N#{fBF2CrBJNl+7X(TaXXHA@g(8s5NQ|C4YC<-cMGi6ihGCk_#_S6q44SRKG`jTmAI3!VY4EjuRD_P1&^@${*4<-htm&G_Uq|0p)d~ z-0cna(wZr4YpRXeMt-jhqsfDc>Ik%{gL0Dnxu4}+HEHH|rAPNKMI2J$B>&o!ofeB!)z5Q~?i@bYg60}`b*~1cv zFQ{XwP={AYnjXrY3z_q;9qK)j;y1q?=W(bqDt%xdW0ZDlN0OW;k7eGbE=3tAlXV&l)bR}U+Kcw3k`Yr)GBi%?R`Vd+!yonDirgyi7^x!Mk)JFmUR8w4!N?*(gA zjeLOH$HFa3Y?GoODRoz5=|OU5FY@_Z*i>Rd(2lNM#r>zEvKGVjlHPd+Ny`+iNxm6! zM{v56dM5Ul`)9|r!j|X7RJzqb!)#+rQ-HGhr-i7er}C8{R#marv=k>Ym(oatlTLKQ z?VcvSPaIznh7-N)Fvc186!sjddMXKb8@Pl&n61vzmtOA4RO>`;2G@938o6UEtK+KG z(0P(0@9Oa!oh9?{K4E_`J%Q@D9dLjK&R^BodDrPp>_YuYbVV_ILs|8q*HD^EoeOG1 zdCbEca_Z6{jKwE4zyAB7oMUUMK%=Aa6OtfYbudK6jh8n4&?vHC6*^Sa!1-iVNzTr20E!U1i z!_{~D*->OiCOS%|fGI$Dn$b0n0$3EF&*TI_8y8r>D};n7VW!+~th_UFVc z_)^4bu|tUSiz3Vy-eNs1{g+KTY!}>;JL8 z{QGEnr8Zlt?awF1G@z;R+Rp{UNSaHg`Q*6K8Rnta#q*BdcUlah?=Iy(Somm8f+f9p zwlzsSEV2Ifl2`6Gxytt%dr-=()_O-4tdt5bEak7a2J!B#KFC<^PJz>ut@M~+ayLoPqvmS`uX5(n5xFt?i8=(C=>6olw7ZcS?S>=EN`qgrh%6&w2Qu4 z2}Un`jsGel9O{c}@~jF=q#@R*CloSA&oKc;v`1;fdQ>B5;V?bi>$<)RD#Vh8<33q5 zp+fpL?(yyqYN&XQ?#sB&al+3qI*-E%Un8tWK)|t);=U70u|#-8%G$PtaUuyM_IacW zfczozFri zK1KTcM3m0;-ruzPrrHPg$Dol%(VcUwcS1ciRNuxcqk3nuah70>Ay|O8FJq5#y}NyP z&_K{DHE)Jajdl4wc;EtZzwoJK|J3!3L{{$*y^V2cPnVr9K~6meHyl2Zw!6lJ)|iWR zSI(c+3iqi7_WGMtt*c*TpyVR#eNlUcKIO#d5sfznc+FzUY+6CqeJ!5`V)`|oIefpo zO~oH!uu*p{x#*8MYmJx`$jHVqX{1M2M}>2zb-^>zT8_)G9{b}1)$;|TUDhcr>7b4G zQ(Grd>ElF!R>rSZY{R;OAhD05F@GJGmpSgSgFH;@QvOPt-~gJ-bC-=%Bi5>)d+5k7 z_y=FWfH5vDn~DK(LioWoPq#Cg7NYl7bTeW;sm#UK=FTfF5$)Jfw+8AG0HtoXcu5!W zkBnSfJv*5{_{feyHwOrwh(~*efBhLrV~{=Hc~2fUNZ#^py$8+|6j2g7HU%zJXH%di zaniDF18w*+#RB>5;%idwE;qh8XDO7mW=P+wh8Iml=p3~vx)&W~uD!Bgkng8C#Y)Gf z=#z89L%2^$@BQWK`Tg!*fjFNp+je7%jBPOaH3@%POIg4>1u^eq@>5WAoXD;20A&Z4 zhIhU_V^G$o6lmva)3X!u$4WAknX_)2AEz{i3lsHt!QcSn9lscsEj}5wGnEK}2z)7Y zqnaBtP8!X+Og8To-}Jdp{!}#j?dM#>q}LwM^Dt?Alb=dN=9Nyi*!G4aBQWENlAn!r z%9a|l099hvy4n7$Qj5TKI7P{%Ne=Qow`{UP{M!m|U)wl&^Vx~&0;$l`!R6irJ{%1o7v3BGUvG}50ZUNe2bQVH@SSs^hjSmt zqh6SuDZE?G4i~neU=$3@vXl@$EfrS#nHN%h|Ssw~;-Kv&hH-Loz_kZSn#d?S(mCVo#Se8X96L$`6ZrK>lLTdwfA6MZf= zNtM>Gf$2Uz)Sb5C*%D^#Itl4R1iCmfar)Ofd`kP#3uu}{N(1}rj=qhSt zZl%`xiKu+n%tus&!qb{dX78f1027eDum*_{)p2`D_=1gVCXiS9t~;rr!O!OG(d(IO z1DBD89XCpa6OwD)8?l%XH^=^uj|7BXC*O~-q>*N7yqUy|E_dDv33MDj0;gt5>mDeC z`a&g^hdP_&=uvyIS!Q3tTV!UfYZtW^N(n<+Q-RcqpZ;?u@?ZJXY1chADfH_Zg=|p>_go6Zo87pQ&H^MVeHCA?{45<&g#u%2&)K5Le;g8fL!|n()l{~j zLV7Our#>@Brn)$HCO^f=k>i{+s-Cf5G2LN@F-H{x&uaJ&wprHpIP^6PDf=|+gd{?p z3px%_f0DSW=%|fJlZ0PPAu}|gR`vdQQBFO4STKo z!k}`*SWwXi^H{TUK0sQ{R~gZ~l=0VLak2hg%wfgpiipP{@HTJNk!lL}d8$I)x?m_T zUM#$r*zoY=s07A~V6E><2t}ZFiYKHM4jO-hFUk4u5T@Jno)t;zmO517#!m!|$ ziuJBAE665^erhVpW1%yUnHMtzSHZJwy5evES?*8{x(1&+{dxfl|8RQQmCRg<3wsWEL(j%Xk&2Y`wo6{ zW$6&abLz3J^~%}AB~YSPn%SvPJ9g;*oBAn{>OWeRI!Lne5ffh?A1RZ-K}F@wZ_c2> z%$lc`ia+qW`>&<=LN2mIyZOy%w`ySJexI?{UhU1VO3VN*-*E_F>yEkEl3!Eo5zqLI zHU5{2t$}m_=;Y+XS*^T0(tN{r14Vj4%=-OUKV|Y%nyeD))+)5DX}8 zvtEXU&xV86Ps00#QHQyu(k_)-V?>y8C?~Dp531(Mm;vYOz~$feh1%9XnD|v=txG63 zR9Y4Ji0M)5QH45x?TDKjkpCQc9lRO5I8t!4&Acwieb%RDJrVTIIeooNo;_Ia*;1jX zUDQ>DLas_RY>s9eqPn}ZeDrfjJ{T2mdIR9HhO_STAaR5}00(23)*EB((2Yw5&f7 z%SPm%LlDq=Q{?Q1)T?}*e2*YiGsh#cgNf~yg{C=C&JyamaW`P1nBFVn32<=S$h@}7 zLO_pA!RTAn@fzrCH}{#(Jh=@ZIfuN(qpos3Sxp%_c@e2F3jEd~jt2$pIFP?Hrz-LF zCj=ZGy3mA?oJ@FaRnjE%j-)>IW-c4Fu^Qmn$FSBw!-TlS=#kWNDD@jx|6Haqm3^lY z2OV1Yve#(0Z;-HvB}QWWar(82J9!2pfHR`IQ=8Ef4hj8i)a~r~zs7_rQrtI%07&}~w(*(!LPxB0L)$g&{5@Bc1?<~D+#O!}o@!Lnus>DGplngU z+?8VLbZ@yaWK}lQry!j!vzg)&%jA^oD!@tRtRUxn1g~-a0)#n$kFD06EPDeM42wN1 zJ)eSUDW|Xyym?f0$N)FGjViUY#=-t~Al| z@*YKroY>$QB1#WP^?p`|G+@t@+^%Dce9dR{A6Uc>WCu^48Bn@K2?Pmqm`;hf4(eAA z3xT1tF-?nd&I2qt5?~HD+9)h+TYm3Tzjw>kzj;_e5nG(sr*!+pjIs=k1n*j-TXMEl zf3_??x?UNw=8-XrGtbhRwc>Syx!_{!aWoj?Au9KVWT{#*mTS9#(<)+|;bG0S2`;!TljEvzIiB`clQQzp zyGy7Y>!*`9OCC(f7wlhRMJGr!cEl}3$pn=4?P~wuG@-cbDF(o& zpM9GToCQ_f1OVh-btyz(>enCW>;L(bktGfQqIs6E=W@e!MfItd^67SYaiZ^n|7L9- z9Uc`pxfgifZlKFj**Sx4j;lNrc|gvpWp3GulW-IoDG#7|E@H1(Cb$K zCpFqfa{n99|99XPcPWvh&i(cM9Xwt3bl*Wm)t@yB{)XD|+TnxZe)y zEH=#H{3r0H zWCfeCIFa4(Mqg=(A3wuCR>X_n-i{l)2mf+cw&9X()j{mvea*w)vHLEjbcsr6{B;@! z$U%??kKUb$m2LZ*W-GfQ?GFJL#>Hp-?QsAC_RtmGB&WY28hpRUgNgy4h<{V$Ie7Yo z^qzgG8#x{SS)lpf*2ZZo;KKTQP8a^}fcY#8Y~Nd^(?4)N|JN?`LJqjlzP$WzB`9BG zfiMAC=>G%p;=gY4a}sbNcKB}?Hb4bu8R+bw1hP;&|2L=V!LPT03$45s{Bfn)IhrsKbl-#>Tp z&%%-KHvD?Kmr@6ineIX-F2yO7Soggfsx#xeX;(h=o4PPkG2NL<2I8@@(P|I9l?>*` zVidAmEns$|6H`f9{9cOmf_jX3>}>LEfkp!rjlMoA_Dx~Y;hP&)oB>iLD`h0WdyPQ` zV3&%a2RkA8D=9!Oq8e+2ClQ-!tHfTqOvLSMS6*?t@ZRS2#=CSf#)gd6aBlkG(&W-1 zJOEhSi}5gHgl+9bExELL(FiTa3O+v2J)im7>P-NfH@?^it@cO?Um^z)Lh!7b>Tu>_ zQiFT`O2pPuK{$_ZK|lgQckz${S&61nAa~-D{e2)MSj8tPfIAozOvdz?eB%s9Au;|; zZP842@L}$P`;WIc5uhY{zBz2+sn`Nf=9J?fL8*JCaGmhcqC2TZ8(ZN^(nGlv+M&)2 z$*_koJflC#Im1Jb;_5jB0Q;W|Ckz`7pW19{R1JFr4IEg56u%VOTS=X?+`CEl)&OHu zX^?;hnntU38ITfxN|v`vu3$eA*5+`B8kx>Rg^rw3(Dd)+0un3Z_X;5Fufhsl_$lmx zAv`4P@oSUoL}QISr?9>g%KR;Z$6k}~efi3u!O~g)Bk;(lM3|Gb)364$_i7=YHgs(* z!-=2=C3o^Fv^MW@5|!Xve=xaUrnbMus``3ZIlvup=F=V{fJiu(*}r>p9QKT58Jben zX1mM<4XxqqysL$r$RTTWF}svXM1+1A{tCu5ThgKz^m7THm(`HV^C>o1`k)-C{@ZO0 z=2j=4l;4y*mKm|mlO6>Gowp8N77~+r^`LOa-uWJh%1f91=5|m-Br@FooEuF&RIgU) z%hK$-`L9pKphzvj%iQr$VX7}(z5TBQTfavh8}^V@9MGzMDV?AKE_WW%OAyZ*LCbq? zq<6FZ!G0UR?_9_g!a#kcH74rdO;nPo+_n;!ptZDWzyY#Fp7$cIme9CvxZ}oqq+(V{ z?1A%@Q!b1RSve6@z&U6DM8yu3>r$iEG+fQfQ_CE8r{1cuS->G!J97iuJ%eit;1uYa z2PxkZQAJcnT7RB_eo{BsUaTURrcnRw5`J}gal4FRj95m1tRZ5i#0+$CY=g$Hwt@3E zUG)bH|HD@HUlY^RRG@~jYlQ-x<@rqm0OghGjqQzDsEX5!39=r&N0%EfBjIyMNYEQ8 zw!wch-*;2y;T_f5n-oiEvMl)HAlTPNOb3E6_a)F?or}mIu37Y29nHY)^6_upK2*yg z5e#y7nL8<-FEtsidr10?jwkl~wA%$JVy%3dd3*k_5om)v=)9QIeWWT;dt(fx15V{~ zSxFCYuGyi=>AuLh4>s^h3GdJQetdY?)iqn5y6X|v;6C8Gu3zx&%eoUaPm>tLE$30_ zZN%qUFDi_}BKMHE<2#@8@l!piYn4KpR(91M;Nl(!JoSox?bYbOc2?zO;%F_Fal6DR zR)v#+so7kuEDb{xt&E)vR`y)~Rju+EOyjxXg5fO=A$eUC`FfOf97 z#r9Es@bO@*MPGt<#2a#{m8vsu;ZiDR%8)lVMPkJk4bc2%aemjIjgE&dy0Av8Rw*J8 zCnkb+__h5pO{)DC%4(rKr2zJOTMkI5HQu`)_oQRNqdXzr499%7PmO#8v~YJoV+AlA z7qJW$v2S8d z#Gdo2Eq4L-DIZ^g(%33Ln{fAKl1yb5i$ToRTzl_SVoT0Crl89n3_Yv8+IeliXXAUU zo%1R%-XWNq*gMv2hj<2gAy8GJNV{^NM~nIOVsqv^(zkHA&hasS3roPUGteK&tNJ3N zD&wmOhhbA=9hOdojL=5i`m69iR$PWEKIK@t@K}=>7Yq~O1XsQA)wEEn+4Sw}Z|z5} z));g%;2lpTi#=XF?#ZRAd5#6)(fhCq#E;~4+!SG(NT5oN)&i)P(vNq0ufp%sR4VLl z?#1Sq0-!R0GGqD+gLf-G}18+@Wp9l8H6S$0b&> z!{&fk4Pm}%z+-QAkhY*ADr_dtO$=6QKNS5uM@EwsYzN)ZIDcuNU~x8W7P`5%``6LD$Mr4!qyM2&G>DEp&tmsTf@c7RCQZL!My9OjGc{8i6Q>21U~|E|c9 zqJDpnRZ(><#@L+vCSCTo>UcC}Qhwhn+YF* z_YjyAxTi$&+CsRmhyx>gP~J_+D)`i*340*dL{m(KR7qOr9d9vc45%=zMSGyHEd-Es z`*=mNt+}?6i}<<2;17b0>WKOe+fTxUC)+F^V7}eqo)wY=U87~}Y5zJjRTB!_18kt! zwUW13&CeG^tVwxy<-fI`ee*KAM7CVl{B*$!z_7ZkNo9j7b7&%Ov4~|Rf2`>>+M#<9 zU%(*U^W5tfU4*s;|6X+3!iY2$Lb z1EQ${1FR+;ON-%a`|Hd zQ%95~hNBKv;kqGEJcqH9_6U3QNtm)r1Jft4AxX|^=zv#=Z9e;mRa>~H_ot%#*K$OQ zq@tsGtZ6HHRkkW@ZNP?~>jTzJDH5z(Y??Yx?S{#Vr^_D02QnufYeuI|5%Fz-7jy+=_^ZoTdRb;V^G{MoH?D`%VH@?rSCK`W5vzSov+F z!_d6F#?>JhMhDFd9h)eHo|*aGN+#q(eZdC*HNG9ZKHRNUs%Tt<6Omjc9wn6QF$Qy@ zdshM4RrvISx)%W??N5k#i5b_ftr0?m`Yh2$@Xnf-ZXI@Z7zn+$uZj>8PO0`GsF`FK zkP@uBRX4p(aR@WM2KorA-YS&nyu$+Q0hg0%`#KEIe}&JuUjUpM33IikqAm>*Kp!J5 z^6fVlrC5^V-txV5sacn`E^lV#`Z!b*u)3@XeN;`Xblrf7+_fWwm8vgAySeA~y%5BS z1~G*d^y=6za9B$NBuQj=+>f~?Lp#EY-#GBkH0xhU_xCcd_WVf~CY^>o><4Lz@lh7V!I=Frg2$>FabXLv&gwp_px306r=Hwc zlx&VpP|>tFqI}?{t7pGzJSBx%L&?Si^FP6COdvaDW^x#<_mg}*(-Q1blnypZ3UT~} zP!^6ei8tGLB4jlw8b0b%&U|+Vf^Y~4M&Q5oWAm@bOc_CJw*l+fCJ!SXvag%%FVEe)>_JE3K}H^aB+8SXl;ywuwr!u zuh&*6bt}z=LBH4|(x<>NXr0Sa4jzp}sm5|%Qu?Y9d!^%==o7)uWC8z!m#dfN3*gVu z`;~W?4I7)^SQ{w^qHjTAMN5B9l>oULiy^0waCy{ifC6v4BzPHiC%P9+{E3y~Wf8p% zB!k0aB7($>rn9x2IwFWYFlL=P;>{YZd5*@y3}H*f`OVe9X`vTu=InCtO!eaOP8RB$ zhW>|@=-I4A?troQ1@Kfh+6Xqa!mwc!041^CqEc+>OT#sr-@I?1Na}^CL%$}xT+$bJ z4AuT&zVltLTf*7VQFWJ@R2lxK7r@wQe+vN`G(x@{$YXmDS%rcc$^!e)QMPlqY(q-E z2~@1ONc>7YFw}1X&gA1n4%6yn!+OK~2d-zd8;K?gN{GBFx_!lAI=R8ya-}<6>O}=^ zNJ05nLWzf_fUS+PK(uguoC4$-4wngv$SIPzRn67M3WX=a9Szl=1-4l_&pwP@tdPz( zMu3xA`PNZ6znW8-nh@N0rfHTfE>I?vpLF5ak%Ep&0ig(`cybZx*JvRg)4nDwxCNfp z?WWn@dpkwe`S_6KY>e~fC7XADT+?vUBXSr`=4a4Y^O6Bk%E%2PfSak$92yz8hP@x= z)jqc?ShL)Ore&UR@{wGLsTFE|@fI^s7_I$=w-qdO482o@q=$2sX{jFS*P_#Kpm=4p z3aL>jq+k%a9SotAUC4Uy9Gbjkk{h!YmgnKWE42aQ(8I*P@%g2n7|+Nc9tCHx$5Ct5 z#KX)C+yzVXwfTB6hxzT_-zG_hnV#LzIIC?rvzZ_|1jxyRdaCf79N}kMv(7$0QPvUe zwhIX3B-tdE1SQKGmk-;_-BVpOfL!I4EGfPwr~)`@;Ka%vZkEmcN*Cv?-H$jnnIc^t zY3Yxa(Tl^^ehlm_n}27dtbrz(6zT=RyV|^a#q4)rRF34&nEszSCs9fi%U?Wf4*E_q zTLVjMmEY|O;A93n`n9;;6bsDr6a*{7QR$DmdW~Fh-b!|sMJ=0&Sy|;fx05e9b|3Nh zh1U5wQM=mQc;SnQ#2(4+D);a|TvA@mFKfZ+WN_IcqwTbXSQcZ*l7@{@X@+&$(7-nU zPl4WR@OeDe;~S>@_$8^|W7amG$L1_eFU?PPTCMN8do6RH->{Sf-Qq06|w01-B$GabnSkXv?!03Dv7U4EnPror7J3yOf+~NQ!hXGk2*zc2b&fyLf3LZA-%kag)90tKXbPN`d1GCb;m7ScUH!dhECD|`c6Xax>6DZ zzBPkAOlkESjAnf+t853qs^YJTtRm%S1rT8J?(AO)Vr{LxxI>EzX<7L=M5yy(nX zZmtDr!m!zl*Br{Lb7~`+qwpeThozBd3V(5aTJBhGl8=t#%tQO$L?F^ZY6%#OyCoZ zXsanB`eWDZ2yzd89qraIyuP_+y|l?v_SQ;xRA&q!kSnW;cx*(mZ4GWn1LyS=F;X`43H}EEw6dbyqk#FN%1#rPzv< zp^_?LZ%V9RUP0c^7>d2{d`gUCCWd3A2lPtlZoRAbY_s`A$>&iiT!>1>LI&ccL*BC) z7NQS4#5I%xnc_8_3rbRT=&Rh33s=!HN>uGjRyRG|#3|+9!zP6%ZQ)w&i7<3Wuj%eh zjz(*EZADt+*@^4H8>b>bqWfJfZ=C|U`slFMw>609tJU^&nRtN=Y!S0xzFHIx5kbM1 z{kHYNFH!goR-#_S&y4}-^r1SmmMt1CEPTNfGMZ%bOrk2vr=LjvEP6q;uDo`>SN%GZVB7|MA`B#lo%1#i{}iW^~|~H zBkrUoMMc2~a=1^JVgLH}(u=am(Fe;@CQVON+$Uv+u!NaqH;3cm!U5ZlZuVUTXUjb3 zC@x|sJ>OfjXac@z6+VlW$zaw+?C=wz*d-BgA9v+)fT3uihaf`qt*l6YA`Z-gwT1Wb z)}Asg;ZFNg#R=?psO-dxXQy$c4&<+L;CqKUbfQg zBg*h6-640_&2yxtWp*m@p7-!w5IwvK_d=WXCLw<*01s!+vmGZ@>GeJ+E1c|P15eqm zgnuPNEK5o6Ak1BE6-3;KZH7I0uRt2jtQM+;kd;3b& zUhz`Q=1-j}tL9El*g#s6Pw^1?Q%+yeHSE1Y9e}*K-C3N`;}%?pTWl0Y=kzOmUyYq-k33Bt4`;V(2gRKz z&I%fgZw+SHWNn$yk%{YhbR_pNja*CEsh>~Q)*cq*6)l(Cnu0+dG1R=fhH%r4ee>DK zMNzw|i%yrw00`BaT6zKHS57DhP-wV1u{lMZzK;VhGzg-1Ha%~(EDG+H4qc9p0+dNz zkA*?gD6V|t;uY}THfnb0f(HQh0LqUw?=XIhF(%X*#zp6Y8rD6!C^E4Y&YnRgYo}yi zrW7BhSL@=gAm~A!Zh^%+LkaHU@_)fViHyHkMm~@lFENz3C-O_vfN@fVveZ};jC;Fq zkQqjf=cF?i14k2;!mX+V8+3Z}oNE1cLvbBV55_Z*K2x&II_6?|ohhXUD>pWa6mD?+ zxY=U~{@fHAoLD58Yebd=VnlmyfWbU$bq#H28-HuGXr($Id!0O3%>)k4)qyo8;Am95Rhb!vTzpHHRjQpa>^5n((D9hGRRSRjLedL|1Nt@{qW?u1pU6K8P7+TFrh z7jX^R+|}9?hv3!>*{%j!;{^bWxsp&QTeVWLdFKL{Jlp4Ot2axi<~DM^J#_VYh2d-g z?C;QdvMMVM;~R&*yawrGD=9}~a)YDUR1qK8aO_;1-Cizeqm3wAGzm^);-6DP;kBKRyKmnbiCU2~xgMhsIJG)CD`4i9 zJ7pT~s3m4vWOt|f0>m^Q)h69^!EVCShjfbLIji%=_k4u3i;<&E*rj&2o9B-MYA-J_ zXi&1&WQ&+GOlFk*p-pLIbj$h?Bi+JicRxVoqeKnNG~X46abHl}l2z9cJn z^iV$5Z!L?mMwr`U$p5WYP6PU;;iAb5NsD>kimau|NMENpN~a=UWe}HGqj~04>p^1u z+(6M*4?(J~RjuRR=$@PQR-J-)F?_kfUsRF2WFt%R_f-D*5>{*51!JA^)xYK|jxs7N z>yLZqiT4_;B5FTZ6>t__WlguBhRnz|VU0TJKyFIguyau^?1Vhq2sft=3h?aJb9h^nzp~ zRy7)*R_)?*sl7l7PfEOes;2MyYhijsEExvr$PbmGVR3`Tb3uW_V@Ti}a8t*GQmOHd zMXn=tW}7}p&$`~VAt}oH=ktZ-`$}<>_khURD==H}Oz!bSU({7&S8Ej6HEgWsojcL& zIUyxYQlCAm%cc3SoWL)ayp=h#pTsiVY4*LMrA=KuH%Z6M}3vV%x`ZN=oRo+Vnk~ zUUB8(*~inSNfOD-%G*gD+caTtiy*%Bdg{oP=hDyq!lg;Y;%#rgv)qu^+>I*2KNyVd zQM*oGPQag&)Sbw|fwI2i;R@h>xZe#u&EG$lhMHBs>B0Q&UJF6^kxpMR>_}YMp6CfC z)&tHYo?V0#ROt0HyE^C9M3cMtu%^>{Tozb!274L}_x*<6Y3~A2A22^@55>{&IC#VeqLgCKi#z}HE&Q=0q!kZPNAOeNY zrQha}X|FR4L@qDtV&X*MV{d1Zvpk0?%|6j(#o}ZJ%?qKX>9UHm-B7ph_0T3Jb(8xW zq%alA#UPAlQL{~ZJ0Vu>;4y?Ah{=zZ>VR5WJMzNEutC1EDzc-xPdYc(Q~pCY!W zwxy9~J3GF$Z#=hosIj%0RPgV&9@gh+^1Bz*QQ;HHlz8Ud2(VFt=JPl>9 zf)3HzC<6sW$~x_hdri=iv}OGr0SpA=5?O!QXWxJN$^Nk$fBwF$yqSN&@HaSXSI`kMfMz z9I+A{T}ZXk-~}wz~87*!IGBC%D$#KCGd*BIxEUHAWJ=>JJBQi=b4!YIJDC+_b!SqI+> ziU4LbgLXY5uWr32)Ltft`MHN75 zyyYLR&G{;X+#GgFs94rmJn9W(-)zpPgsxY*L~g+LR&-6bN*+*pmK|DtqFa1xYJVSG zLVYP3&v9(kA030vQt3WkJ^s#}!+qX~RcF&xD*>?rXnU)!<`C8Z!oD6J!)IV`I!!3M zHxML|*5>9(UN}yygsN{ZKoh8?8&wMkiP=oFM0*p$IW@=CrM$@qY`Ra1mppIbS$WU> zH{EcO$ES!Ln@@t%G}tddnMK9KbNS=I=GMN@s%pUOu+-$Z-*De7wxcf5J5_X~1ND1&Zhy+AH zLlLC6d{_h>sro73808+K4W?~Zdsx;2MZ4@}!*L`csym~$nGnz>O;NDdTP?ah$JIwp z&U&)$v^Ksr%7r=Vu-U4M8ii~K5JB-LziA%PSUpY6vA2;}C2BNvy2Mvn*WbBG4K1ay zs$M5{!mN53_deP{V;c5Zg}+p#E&42bV@`mxy8-Z-;TBDPHxV z2=PH`+p4{i=LF)j6rNH8puE%ybg(&mwr ztrZfXCZJk&dtFka3P!3l9Ub_(suuJ3E0N#s>QDp5GOc0K7|#5x(*pNX#5y|-_u9y3 zQ@crNHC%O^owBV_dL;@`()cVZ?B0Qhop!3y56xjr6$Sb)SPQH;1O!@%pIyn(&#n;$ zZC`REe3v^+41UKC07aU!D*ZuH(g;$6(Ea44G?^9Ex<{;JzXsQA7^^v`NRGEo3|0+^^0Cq8`&jha`&jPZ6KdpCI2+(k~>R57_p;Cy{rrE*3 zl{G78@&5M_uKy#IH^UymNi`&_7Bjlw9Ql@cItpH%tURjG7oR`vp=>w0IRe z4ugmf(1VJtE4@f{y^|!%m5|caOZv#`qf!rcuOw)^8JP4^jecllAD%1xYDz<(0LYR? zvl@M#5WBOMTd!p-w+0g21H=kF3~66gV52`tTz4yjHc+wn-%5>Bg$cUfH~&V?=F!)V zZt96hhX~I?t)U%-?^*X*LRoxv+kLU92+oEzezqqg*Y)S2*%`H%@PMgpK)fD9;}>Md zBUh2<52Wst*t|7hSN%h*o$_M2WBlj+WbGDkkv^!-}Tc<4$x39bTRq#nv}jiL_iy^&Xitg&Gx zJW}+#c^i*Qk0>#ymEz1jMucF#K9+5;_~yT!a{!OXsfd^votd9?D5qoLd8$cyDfE#0eb9SS-sqbg>D;Ut!;oSh}HC zSHKvvI&ipL$wXsZ8dMo!pnj!TK8+i9S-V)w!qy^^UxpQ|P4@W8<-^NoFbUj+ zmA$Nv9Qle2atLT1~o-6<2CF4&eCD(FaN!7WQ}oyvn{N!GN6yIbYnY zf;lr^at^WYR`rb@5@^y2p-D!Et3oK}Ld2?{;`|R!IQv&)aCTtTCM(E5D}t2~=G6^a zUJvM7nF}_rjgq~-A>+kB0$dTCImw9b2O*U@ zi@k&4UTz17UM*L{$Hyx}TN+gYlj>(320xv^``iXc2S*2V7t4{?{U!&xk7zgJaI+^l z0|*DwLW~q*z3dKn$ca{Ij=+XUuX%xQV0NjhHCqH}_VcyP%oWA9txqGH)&m$}hk(f9e_BSqe4~(sacvj=O=SR`z+q;4y3aPc#j)=VS@j-Z? zlV!G_N86jnGQ-z*GR<=pu8^xIJF1-;^1L#u-Ucn*LpC%xCAuGvPH{Xgsk-lUKty+; zrV!JAv;N*qy_EOp86j}+#7V)Ui*v9>8oaZ*W>yLx^C_7^$zKGKMbIA~znP2jc{dR4 zdb1L(Xl`C@;|AhuUNGDw{i<-3Il$A4Ujo?NYO zscaPsrgMLxqeS%lQhxbu@@j%d*WlM0yu^j8TYbM<7d-rS zol6rmnv$P+FJs6G>>Du)I>nJUdsio8W4!IS6_ zZ(PE9cohFyjk8-wsZP+TjXk0~m zhhX^V*DS<`7Wx7`&wxK8L|cui+MBV!#=C;osKH`TXZ>2O{?WR{i=8R-57L%Nk?r!A zOXU{}WkKhJGTXaGu~_v*S8hU~pigjA27Q|xi0zWyCAv?x z`7j%KotUVE6nvfEt5ta()5sa45d!FS3P@dZ`Z+*t z6n0jExcSRkU%}AC+)y7@H`dj{-pY?RR9wD@dw2M1+VBYYmS-3F>xoAX6DF>2b_pXSYtxlv7n`{4MkjJ)p5*;d-6awhIk=sy#gsKJU=U>0g;4e%~zrK zARbKR#^gH{Vyp#%1U+Bt{^4C4wy|6myecCR4=T#XIu1nVEX^Jz5av#oAENo5Bwe|5 z1hUJsDNX{TjIpfLtG;;6>H!+vZVD;lYw!4nU25JUN~4jD;l=QhbfhgLYMVtA06$#s zR;BY?OGOX3UiEoTOf{l(U|GpFOv{pv5$>NfIae~;3d7iI7+$c=^UV`Jwbn?vUV}ao z=DS{avDqFMmi`IZ-?G|aJ)LQHX)yrJn-Fwn&et6S#I=Sv9Ba>*@u(Eg{ zxBN`&3BmIsitb*`LBmIfW>?K8`Xp-|X3;C!)s9%fOZ&_PpX$5~DrYuTdo$0z)195J zmfv=QtfjPMdDpg|47jRpll~OoKB?HE%LSx^zZgR!i$Y(N?$Lm?11ytww9%>bsMCt0 zYOkLL(q0f%PcIpBl}xkRZ19t~HYK?s27iM4N=wO~^)Va>Cd;KtUDq90Ik>|BMVXoq%_Eu)1=vKgK zX0{=CC3l3OQHmixKXKmZVi{w!(bd9{(gouNe{?kRMul_YaK_&&ohpD#rufez7@^n3 z)2`t5LJtG}+}P9wL%8G2MP7)G-WnAU+mtgDu7SBZ!QtLZ9&JJ-4Vt*h@MYRLmwLl9 zy*Fo36A^=ahCV9HN0%-!&%YJ{z*)s~ty-7h=j*p&LK)x;X$hqV;p8}VV?gco?hC6- z_sCV6tMOICE^C!WEgs8{+N|y(b81_0N}l4#v!O7Pb31syJzgh#^p>8 zvr#(q-n=F3;&y>Czwf;9=Fovu$1MXE{tC6>+Ww`L9UMoa^sXf+XFjxem$~=H1JW5p z3o;%JfABiy5Op(JVguC>lpwM3N=@=dm4#-@OD}BEm7-2_Lvnyt=Wfi~b4suLpsxEO zZK2__#rW(&6|{nosNZZ>02<(BwsR0u>cqBi^UswzMl^(n;SK)9R15QA{})1cLdFNl z`&S9n1HQIWkKO@Ed(cBQKxd&2&i4j1b=&IXbN>%}?-|wP)~yY1MP*yCp&}r~0tiTx zCZVYaN>_RZrS}?I2#6F#q)3&nQUfIPP5?paJ%msLNC^-iQbGtJ@ZIe9oM)W#ypK4( z|L-5hV0cGX*1gs&*SzL6bH^@d=2Gl4wr9I-*tCD9xh}77{}iUewYysO+`v`&kRB&Z zbjIWA?y)TAhHxF2oromgMDCla!Z9TbF*`kEO*sI?U(+yEe-h-A)`8?`VXE)^V<_LsG+l?9{o!)7z{ zB{2$4dny$(gn-31Kf3rKrT|aPDqxFKc3B_%R=l=p_%@K2#_q%Q*1aNJ`WMNQutLqRn#|#`P@y_hTvCU${1}5D;|7sz50$T)i;n*({B>6$8Oh$#2as-5veFAt9jk59g=bewD^WWMj8Lzq#|kovyL zH;#wp8qX2dbJD%YKLYslFYDBKy)3c;$p~32Qr1URa?#+zW_3|*AuQzJwaqwCMjtnU ztgYeN0ssxjJS}xp01(t)+!t$z$a!1aiMLEY4~=xL1Hh1JSzDvzO_s%MGP9sXPo@v z7>rEahGkxu!ag@E_q_LnPj7uHV3@T36dIqtp!;LkR)$M8@CDr1ZpU~iBKu9v^Z4Ap z!^AM3vb=(PJH;=HI8?5ZI85htkz#x^VpgRH0D?)xr& z!IMjN%XXxY#8YHjs{6tc*Avv45Fl*1)MNiM;+x!Re4sPOy|cpd#$Lr-87?0(&^s{S z$VP$v+lAX1&U8L~Lo6l9wIR~v;Pd{Vef7Mo8>_7pt)|>-`_CVuAS)(@Yz?*_bSjFY zGDhDWY}Lby$}&=2T7fpjO4?o7r9|8MvGZ*f^#$t@%d5IvzByAhcJ>w9t71@MHsW?s zdL}R({8}yR`Kwbk5(*nKG^T8?tWzOLX}${_mG^bPsr4+Izbz{orUMnl93QJXH18pG zzq)!{E`*uQe=iBT(wyo`87}!MA3iqcoV(+G*b*rtsO?>4)sq~IctEdKnx0gEs2<_R zy9E{HYl`Nyaum)WHo0`U^UMoiDMJfySyys5XUFEe5BqK|YJ7=*BX!aUL}(6a9Q|4G z=&)!{|B@r_@^zym{Z;GMtq5;@h`aLnL7b{t_h970p^dqYwdY{raKp<6qTG60Ql%P zO+5oG<~!r}c5=a!l3uLJ>p2R`QLopEIjJ3>|B)wxH+D4~LwxPr5MX&>ihZ!St+Y&7Mw z9~LQz(d^pq!$RAhYG()B2zd7Rc<^6eNLa~d1f=5C7g{UGBE%YE9#@N4%P+t$8w?}# ziobqkzlA&lJV3f^z#bgE*XtfC+1;I%bmjQzId?w}cR~#gTeI0f6Rq8lJ;$+J3&K`$8fKr3c_J`SaH%r1rTe3r<$`xn|t@Nb$`I! zFIVvfFhAnEx^CYh5e~^C=zi6W>b-CCkd1zBu4<2)Xt4T4|F9+H3}1xw?%>NbY3Vdm?H(d?usE~LiQ_4ujWfvxjnvj~ ztgVsg#i8ke(=B$vC9ZL|8U?hseP5JFrAfUk#Z2RScVPBM(0;y`+2Fn zJ#U(ni5HY{#wuXWE_pcxN2btIm9%R} z)wM?4HRd~bA?P*GWC3WI0v1HI`tS7e-po~o8)V0j$`;9RgVZz`9a4p;I0_9?J@B*n zi?vW9Ltvz&a9aXX51`m{2uY_a@X{gK&B%`?x(DmuAkN4;YG}7&(lVy5uBuKI-}NLz z(JFbpBgh(YV z6K_on37HxpZcF}7q7#n!d!B?*UZH`3O5d{Jq+7ZLlfBuif-@=DaGmGFB9HVP3avpH z_nMsa0(6a}m(N<&vyTrbjH2h1iqL!TL46PwH&n92JRkKmG##pwK2=&MH~w z?lMV?gX71kd9}OAN%nKwB?i=bCn~2T)K!uGmrjw+s7_dp*A!mNA?9t5NZr`}dbfFH z@&ly1+p@Qs)Kg=3-GiGU`$>Nn8ufA0Vi|q|f3>R~KmC?omGv?QgXX2SlJ8|*+*Ymk zjQ}c55~E`4q43Ge6DHndx&g3^=x54S3#R46+z|r@oQ@q=iBjBkht;kw{!@tl`(pp{ zV>*Efx|J!(>AQ8m^(25c$_qfC`ej(58c%o_da!FCgRLAv*M z0+W$L{|M|o{Un; zR*nkA^TZ{7m7i^n!~~^OIVC!ddv^3rLhcYf^5gDa6435}pb^@9RQD=}#P|YC*SBD~ z%Z!&^_BoDKH^lL4-&(23?V%LvSH19D8@pXcT8TX_B&0D|?>q?-&2mW6@W-)&{GL=2 zM&>aLPPvbepcnzu>Pt6{J~Zug$9+Ie69MdxWGFvrDL0&M2x%=3<@@*cS#)kmlzNQX zG1p7)H90cYV#TMZ_nt=H=;Q&ndMN`G{3I~ERE;j8{>x12Qrv()S z<&L}lH{0jGPxk+ERP7vxU#^>@uL;6@DaWA1?Avjm+nxF3neWfYZkAd8NP|*0G)TY9 zGn4LsCr*Ibq1r}1kKV-Y^>xIq2Cs%`0EOQ9lR<+YBTOHep9%siB@`Lmej3F&_Ikad zN+zLg-#hWi)29?-pm18g^g^kup|1fv+coR`RFXD?>6Th3cRL-tON@&Dn zUHMs1>r$$Wd%Af23OX~>V`-#S;ttiKVw(W>vajNXy%9BoCgP z1R`yxyoE&3F^(vk_!5noUq@0b-w);MYj?)+FG=rLz;-;w036mlHy^wW0Tb>PHITpD zko9lY30a${z?`Vg&Q_@C+-Re1(XI9u+^~m4h9b30L0{{S{!WJMx4foUy%>}p@^X(? z5w-3+jW;NJu=F%ljuy(-xT18%;m0h@eppQJkk2NL@xz@~CT1MGVQC*fesn|kcOi3u z6E<20XFkgyP(?A2_gzH??M2S_WtciKxn@^6uMcWtS7UP?YZ5dK3$Cf|H7l=%hlj@> zqt@bc9Pwh+xw+s-a>FtxxmTom>10&{uH;DJY<6H;-HA_+_9{A^S9UtS+6yFGvIJF1 zxHF6i@#?_oeD@xEY%h*s3r{a`f2Gc}nHrOJCqJ34I4;)4^9k7B*iP`Eb_NHxc&gAC zmMpTe>ORnU)qSOM%wtS9H%$gQ795iPSA|ss&t=2B&+hFM1B8Pux5k~`H35^_!SO~2 zL55JN^ZAs$Hjnl%Pf60^>fa?oo_kjySsFjwz7kZAwgJ@-0M`~Il?$+C+6yJlS^#&l zdpA5c=)=V%3gxn-RmULuQIzSs-cO%wmL|($p#?Ow^xws=8`U~gtc(Zrv(~w}WO(F0 zM=Q01DhkFkYAfu6>#5~h>R%1JgTJbcm$*k6=W39^J>AdYRz#ld{+X7icb2-x;+RrF z1ZEx^Da+wL4+FoFuf107m{m#7j+~zHm37uhQ1Fem|8<@J-6j7OIKc%(VKsy#i{;3% zN;^)Jb#Db;*$!{7wTlWCS1(k~1b_4`)X3iW7P>>E zO1(^;#K2ta(Rs^WA6Wjg2l=nH22LEZXTsC_7Wl^JFdf2j*cVGN99fF9zW#0Co{qpo zQgmO#&Z9^+*_*<+J^qiEK6)C`o@edva^9<1QAt`)A#IISM-V|FL2D=7JQe&YooAOysaP4bA?^epHwi z%?ku8?gQo$z9KJjR8r_SB0G~SZqU%EuuOb5aU3wOQ}rg{v&xR;At3ts7VFWNuI@l0 zb5;ABkggSOg8_Y@V3e;&r6w@u=$J44MpmUd@wz=5vleru%F+m)=|Gn;7whr(1 z(x`-?%;Y}J>H8aH1KS3^lV5^%cZ|hvZLDbI!(cG~Ha{`u#b#PT@Pk#V|gt{<@4f zkHI>Y>KVvAvF#O!z*&!g(GAi2%Xp#f=u>rG09Wtyoz0WX%d07N!^gn}Y1XNT4k=OxZjw&DEz;* z0HTNTU!cLTk&(yPhFPwd`td+!F2Beh*FX@p>FTK-tqL`7nC3UE7mlb={>*4vu#pkfKxxcKn!q8 z#eH}Mz+)pR&eyFlW9K|6t|8{g$#Jih4JTSBhjIUHy}UEsikjA4i)^jqnzKJ&&0ip4 z?{U0uqc!QQI2f;&$1b@`R-Tnb7ve2IM=!%IqKQK`WMv>T?7r^@u8VjyG7~_<#=;4P zm-LF8MwfKXe&SY6^W144_>A@&3xJ8iUwb@$lGZ@%HAH+YwNwh(tG4WlOUTQ+E7`M> z3}%*33#tIFz{nb)p{BIIN2Z3_h^|ykMJ0xWCyws}xnsMdxCviFUo+uE28*#FDoI96 zrXf$O@OdxpZpzW=2t#ZW2b-CKf=l5Pih)y&|EC?bOUx_g%VTkLcuc|%W!+AMF~kzH zhV<|C?R~FpkJKCxa~^CW+_xjITW4CfB)u-P4ClPRxRJhu@L4jlsPR$Y>MKN!e&ItW zMxHG?YQarE?z(iS-!#m7{>YFe?}GJuOuXB2oVC)(_wTd!q1%3xZjb!IW*OAygnO5q zn}sj*lry?p;_zj6hrBjxWd}h+p$nu zBUwPKW1VSHp{t7tLXy2suDBuL)?HT=xR6)mzqKX~7?V1|p3X|itom#j* z8ZiACFHMx$@;^SF1uJt%lqu^<7Ck4`EpwD1eBC5}$E8EpY`JW4tOmXZvJJJ_*_jA; zRssh5SrD*PtSCK%w0MWSkp{H`A#HJyaLdke3D52WELBBh=z|C&k+`zc$wCTwgn=r-i4D8^pc_I zcaNM@)n^Y@=mdbNLbq-s7;k~?v}JQCr_X(`?lGB0ngGEsa@^tfRR6eQ83r>*N9eZ(hO4vBxP1No&z$tWSby@!BX$T(OanPT z=Vl7W1F8v8S*9LVcXRdZg0_KIvuzBr$Dl$Hf0ZaE|&B3GDgp zZ@hon?73Mq+MA0mK#0zA`VY|n&%kQ%~ak2fRMwG(HRkj*js6?|&T2TYV8Yj0}&HNPoJ} zf#*)okwpa$zcnyiBThA?vbsrzjTo`Dh?URRhOdAU1|pFVQde-8rp4HneyM+p!T{Ag zEKH-w$q}YmmjfUNz}(q9{xr#oL}2=u#a8LdHtPMCrKu`v=OsBafgv6F?5ZguN?tpW zEOi#$>a&(>^;4F0qb61UL02Lp;%mY7Nqu^9c0+lbK%;BiDIz`x!e{;3L_jM%EHVL$ ztPKIBIvoVk&{__s`rK?Iu8nHHdiCltEAHrP+eE(9?sbb>f=`m)5pmnK5l36du zO9PlvKHnF${|Iq?(DduAzMfyD!^W14rx!~zZU3%$)v*$tsPw?&S-Rgc+XkxI^l{|6 zv`Y_KZhqh`A@=gZW)3EQ$lrhVw2 zzESk#VReRs6Qp$O7Js^;Rul)PW!O!lhd%3myZ4}5(_BJNuTy1n*c z`dL9!|9Lu}jy;R)C9Pt)P-6iu_4IQ-zVA;rIMq=7lcX$t+l6M%t0akOvii;`4&dh& zD#7EPjIOiB`uST!+#ZB_+{=N_B%`rU8UDS4OXHP>m?(#BjNzyk3VQU?qf%% z0^f!7Xqld}2c)Fp7J8VJYuqg7Kf^+eO6(%;nU-{lY840_kb0kPOjEsTBW>FlOe4?x zrn91!^io6}9dgto#PKhk&Pb@`ny+Hvu|`7Gjp+&aWB})LqtHAmPzLi%9J5+RC-5aF zEd^&<5SPJ~%Wjx8Y5xp4xo+9LbyxCMW);W%`}PvMgtOPiFP5t;Y4~H*oN<^iO%!wU zZ_AheIFP^_mw}PlIS5442fezqeQq>SnlM$=z#VjI zJ2qdNhwRyPjNWg5Gemc9H#N=rV7uC$P8EIvP!(_N`k?Qg`Vxx~KOhC3WAyL|#Y}7g zh3p2ZT~?}^;`*wRmmy}`k4UVVrwGmNwVpcr0_@la#*6PnpwbpNQ=x=3OcnrT5=yYr zbsfaphy>dGUkn(W)>MaPu5#a+as8}tolu9$ZOG~`USaT9lx#%bkoT#h&6&}Iz{2>4ht*DBP+ zYi*2W3ljY$mhtE@1TNT9J|+QOq);Gt4b5E{)^D3_Z{=U{;Joi=-H=G9I$`{rK!m&Dx3 z2S>&;>@Ft%tQWXw3>JVe#Z0PwQ&OafbZzZsVPmwMDpMN30S z@6mmPOv0%p=X z+2sSpbw0}H6LlF9y~42-@)o@vQ^8dbAqis`-gLJAAK#oIS$q6_M5KHfq!tgQ7f zcLg-==HN@crhLK+oVya>2wN*~^r=`zTk^(y?1#|!F9=M9GOf?P>A|{W;nh#O67R3k z5kzfEArXBIP~T^68>41pgyxka!U({38o2~Y(VOWM8F1WP@l=44;rP;8PK#pj%^>*gF@z&;SXkJ) ziClpea9{W&Jy&8TA=~c}P<`}>ZlRvZ*IT!dv!$i3yB_c1XZUn0Kdg))+X$C|Q3)}D zG`qXRlWW1rGCG)ScZGa( z`By`CV@J194@k8id?P~XmMyn6l9&LbP6G=K$ik;W2(>-vToz_=M^9pv-RQ)&ZMDP( zN??w9K^7e03KF>jT@0+tmZONN=_Z&^NO(Si|8&5Vc|iI_v8IW}gV){Z!hHnlmcNL% znyM-hZ~ezJP?|6_KS51LNy>UprQPhq*gkt}0?jPP4?W!{ZUk5^m0s1)&pAgvb@RN9 z_x8d8){6zr(~`g^HS-y7CI;U7HT&QY0hv0a@ZT~9Rgv)So|R7HGY-C{qJQmeZ5Cy_ zllEV>C`-?fPKM9dG85u1iDNl%r480oGLuLG!Qn%Op#Eig`ZQwD*sA9v-lA0g%gMZ5iGvURh;lyo;d%Z2vRd0sgqQTxfW*Z30}r72(WbIm0s_kWJP zMC`Aue0t!MZ$GIDoeHGN72Wn(`Bc{|q_>lg&ICyp05PZ`5T#D|jYDJHc0KZLBKG61 z^y$%g7G0m10{iU+D%}Kn-L4@pKx+W`WVpu0Nk>w43`r#9TD4H4EJnbARJUnQtq7)!~pNL*}Y$ zuqmcz;5Xr+=Tf8dygS+84~5jW`pH_Qo~Uc%)|^DOonIj&$qa)p{Rw~7Vpl))iHG$n zBR9rKS}SJ{q@WN$EHRRHcoxbUtVZ@FL8IDXnz{EyWJW&o8CG=^&xqFzXAG4feLdp8 z1@T|-G^ixn&f{XTyNoe)o;&dfnW;#6MJ_)tYUNYt24ZjNBW;$=z%75OHji!$Y06)l z)&Cc3qrWu{=sb556DHFJMUkLzf)6Z9$^y8<0`7( zGBWe3Bs5aKaUtwYpz~(j02QoYs_HffH0Fh=gO2xLl1wS8NVl->cD{9UawufMw&mE=|k8fr|3vmC@iFPA56$I&+=peLS$oL=7aT`6@ zs{OdsD7SlCpz=LIa{IEy`(ch<-&7nDgF1d!I3(D5K~RwHC486xkdy zc`QdK;u^1xh>J}>6z)Mc4DcW>6-rLZ7EM{15=q@^Oca1~oir3_mRRd8Y=oipWm6O)RU|z4436|x!Vk#)Yp_urXOEul8 zPg&&U!p`YfD&osaN5EC@?T-9bfaRa8yj}XZ&#k738uvs$Qj1<=hNwNpdWZW8_hl~W zIxp9VsY*WTUz>ouW;A3iUL1#c4xIO~t#z%pS0)b2xD1_ufhi-ZRMn}?>lY=5{hHBZ^y zmo(RE2r82u&YRcT<)Wl!ydpzAog2yTO--xQm_+ky&NJ|6^#exR=JobqqiG^$%C~Q6 z1A?R`FwY4D><2xOSJ)*25!l?Eg%64P5z#gEDyJhNGSZVsi_gjb%X(9QEaI{#ehz0kVGrG284&#*zo>8|`gh2G`FdOvV|&g4 zRIxaa*>=26Zq0e3{0F#D0qm6r3(`=_NRXA?uZo_T4?plTNcY=|Vz^g71R3nBJ7{_| zxn2d&gVdd%@Qh0$$eVRCO{U5ua(^wF=_q8HkE^F zJB3JEf}}eBA&zBer$1(u_j%p9ui?`dE|;BOml!427%(Ht==|zkwbW-Zk_7)}4STzi z7$M^W*DYPPE_Bl0bjA!FuiDx&KDecgc4^(#$%|emvIC>E*n?=dH|u(Z%6jM8GW?e? z40gB*%+z_`JTU&+BZ~0YXpyrzreA!Y)KK93tEtNv>Tz^1IL99-B^2UdVG(R3xu-uJ$-t!EFBXwzJ8Nbr8X(49uW z6iFJK+yxX*6i4r88@Js@t&iq8&sDv~PYJ%N#+&#R)z}dY$k1=Erugfi06bz0T>_t5 zoO;^8Cfw^h5?}&V-rZj2zsj3H!jmQeU?3EJoVbcw?PVEPT;F*WIGHr&{JasN1(-G< z0%F~+H<1R4arZ9L9#vBfG-8kDI<5lt2f{kzV>#Qhl&D0DiR#lExldW60pv;1Pe}cf z=d{_I?qq4*!-y>ClzD*v*0C_rn>o&u7PgGPnM{^H;Sn_&{*)dThuw6xY8K}=$lkOu z3RoTR)rWQ*gDHbBG*X+=`cxMgN6MMXfx~lX^u1OmUL=b+-BnKDCq<%py0M9-+yXKO z&S4eDdZA>6j&_{a?HcHSmUkJDT&ISGe5KM`+aw;H09;3u)WKWk1jAY3^fIZ;C}&k z$_T2~X0E#n};i;fQ}D?gR1Qzo;CX>9-e<@TPF zJaVn(0GL%Zr#x7%PtR?ND0CPp*I(!{yg0Z)P?zNd{PjkinvU1**77y6rlHOke+n@f z4$%#n_lKSWAmnX$X@VK^L(cLOQ+4=Kx+u<#oC5;`U-&;3>;~+t<35vwx85HEj`rYa zx#De~^$hi{3|7dPs2_l~+~3BXKJ*)rtK-S}Lj}j{%IY()BBemY(Xmk>ap`y7>K{uo z-F*6l>CSpH^5A4Z?zmHp3D#%xswTG{CyD?+w%C3F8*@wk=Y6P?TI%PQtF&y;WncV) zDzkDA6WW-Xv{daoa?xig#QMJbd#^$r6aTGm%wN%|qoV*$D7!d6R^iBztrUOG_k-He zwqb%J8hKh{ZP(!@A*U+I$z!2BV;)&$8sE#(QbePVG`Q-s^9^D#Gr{e7W(mYn!41O2#SVo;^CG|B(a>BHW??~d#; z?zhiMmEqGhg@o@ln3YUX_Ql*EC-8_;`D31X#>B?Lrxy4OEf4mC+yHCG4J7VE2 zUf`0;3Vg9-otZysp5{Z=i_adU-W3{naru(#`Vc#-vP$P*>}iJQ3oubZxg~jdg;U0; zn9lm=uh#sH>9un0&}>JaxxbFzj?FZ{^u zwLUrwc*vf3_~0OIi{sIl0(&$AP+{BrsfiOl8mVNDRz57nEd|X~{$G3dzax_NaG>tu zvku!#`oke;&juc>+4|;Ucy!|O_nbUXr>x%@B6t7kL5)C%vx1xRU5U!FxBm2Y{yNSO z{;=}oCx$NCh2N<~{mXK)lMeS2Yu%Fer~SkM<*Chy+c=s(?I+}LKM7?sy?@$I_rv{M z`?wkSr~O18?k8!~#rjX%BmwNF6seuu^rr_+fCnci4%Na(nr~pJZ7N^^(jjwxW`B6l zt>~fF8nR;3!`jw1CL#5nEjM>eLNZT`XFB$6mz5&B=@Xfcd3VF!MP3VIH|@K8i|fek zW+-`>ent=#qo%aH{)FBj#$aKXPzb%xrQW&p{YlunhD;c$ z(yos+=%X%~q`wsyAlF*tpBB=jkIE?OayLHmO9dL;jphPoVaBK{j=8=mHrk;olM)7F z)Sek=WzB_$DSF+bxd_||+6$~Paj4vE7l)hNT6tzBccy=T65N&_>us>& zl$#3mlM_!sbMAHKQ5&BT?hbS;sS z4zD!RT=KFH1Jh>U*S|@7p0gb`cO@)J;8umbcA|l3eyFti1t)B+ai!xphol$b;}8m_ z@%2f)7Tjnc)wG8&p_!}37!=_To$<_P5>8td&Ex|pO^4k9VUZmIx))XnUIwM7iI~F4 zJBo^2jt2<YQD*bSYU61CMKz`Ce_rgCskwmRGa8bi3B1Asjbn z-o=Sx;5rpCS_nNgfWnmalF?sPQSl?%UVH>HQAc_WO}N^XSc3Qw&Y(;J0rW4SfXK?O zZI-$fYMjVa(3yq3P@=u^lVHl!&#auBB$A~_;BxxYp4d}|ix&oEE=v%HK ztNVFH0U{*BN2iE{Bt!}6`0rUr76#KX7X(!eVr;MAg6Fck=Ca6PwiD03_FUk@oe;Ux zl~!W9%c-0Ik13H=ucSHHA8NVG$e6URC?WW`<%>WASxAm>!~Svg(*u{ce$u5@X(WdA?v^)`A+^gK)3N1duMbHog{)2E7*$Bbwp9#vAk= z4#m9ykuu@SU)p`>KI*sjB1aocxhs?~FY<|5(!aDjt#O38cj*zGFYzhnTm3?Qphl*F zB|##PxlzEtsxj8pwPa)DHt7Vb*rQDld3oG*dlW>g3v|6`=Jb?2nqF=F{QmUz{jp)j zK7mHEVkC2snd8I8wZTg8rrBGEspcQNb18&YGMnk_D4)h1HK%INcX*1&Ep9~_79w&= z;sO>@7RPNoSR~+rv)`1FR5e>GpV2)Z4P@+N#?&_2O@Gr{wDjk@dN3D+Z{`TU|1AqA zaOFz%7EQN%KWMk(uA)h$ibb%6{cE4)=|`ioyR?c%HA*pJ&hc+5?4Hep(%nJKTWaJv zrG54)#N9}jQI6y@DRR40E3mU%RgQ^BQ~%psVoq`G)epD_ zOG9eb9%8^GKakRfJT7ri*LX=fF=B$_^G&^KrGcO8@~T%&fRwu~-0xuagoJJWU)H^3 zW1z=^Wh*FE>}t7eM8>PAc%k^@2&Pj9>5^Om`n8=WY|K{?I=!OygH6G2T}!*PuG>ZD zI1a`gLi2nqW0l2}UIDtg)L-{`c$Aih5jUBJ;CdCkh^sZ`ZBC42vX>j`-539i7raCh zpov9Np-3C6MM4*vXqR`okvm1*wrsxM5Yv8Lgd~&a+Z!P<5gRcyBDo(iy=`s#C=BGZ*nRDv#C-r9y_C@VBSL@u@h z#7H^%?{;OFy26q;0YiiHDPT#4dj?L(fE(f+D{Qec(vqXD4UIWHf-kq8s9%R?RGCaB zYm|D|!()sA{xP+PwC*Bgl-BCa+U8mu3Kj`K>2*w)Ugj z+&c%~4O>Ml60?mH*W}_v7&!)PAN}u=@_kV02au9&6zrz_ua=?o+(wZ+>LSY7 zvZa-8+r3)|XQx+y@!ts?ub+M6xMu2UIdzd<+1CgqCy(`bTG$vV*hzAkn@v#{J?ql@Rq)o) zG|$w$RjvH3h{Ikc*!=bF7~bq=b38ES*Vt-tn3P$TAV zgI9-!tNm{S#k=^VGF%E(%zuiFE-D~RO7rd5#a)0>{u7#>mR+&e;F1IzWO0@yjF{%M z7vH3=j682lNaA*deCnKh?nq|beBK5=vlzK**zrMs)8TKRH-eAbYM=l2x?>hauOTzV zD@YmLvlmCmjb4sXp>af6>T|n&iad<+ZCqn5f!Xn(GN6$YX0H(Uvb+FJ-=oiBr=Jy)q;-ig($Bg zPI;zDrUG5ufT%W_ec%uq^%QGqu=^|bWVn)s5@pmOFq~g?)xwzBBva~AZ z!km|bwERv2cz39fEuK21)HBg#!M%fuy(BKczZ6u|dF>{GIY<&RdG>K+#537V1kic%h zYWR%}2D=Y_segLV(GcJ-Om*Y+Z{?;lrxI0$!_biV!- z?PLJ0>Z)gz_Ep(P=^HClgxXr?yuIhZ^H-nlxNVM{ak)hev@v}W1X}TT7Pnq|T!zKo zWX`i8CZbxC?1YUOv|8ZR%^{Y%g*BzvU_+)}8{li|Jm`M(OVYd_vG0@Y(rMWN;O#|rxMSy9T1085l1s9o?E~w>&Pl1^RiNek9z03)g zb`gAZE%~njuiA;xR`nE_%u?&e&!+4b-I<0O6CcFKdP)zoPmzH}(00~MoMDO@$3$&5 zML$*W;QA9@tqM`WsY^JpE4-0F-yQ&WaZ zjfPnnXi*333iz!Ix;6(q8BK8wbzZjC1$)P*tP!whk8(Q5pcVx5 z7T|hA{B-jkX;0ytkmY%c}p-2sx z^wHMVTvbmy*AvX`&@g2{zFuhidO>80Td~R!AdeA{om6A?1 z3gSq(2Y25TpW54G$ID)?VOJ}@A(m2eZ)R$~fPDe`s`9d?UE`la5%Nq74~_+*R1)lX zIl-nFGYkz0sN7bm0A-4`{C#QJ4?D0 zC6F|13ceIO*9W3AK*>#m_9kNGJ4(lRh#yPn#H zfme+i^jt6eF0^2f(#R^G@8X=Y}RV5to-eh zFMYMOOwjyR;oYGGkO%vk#)TirC8s^s6c{LXm1h26JD)9#%vBQ_Eipc;*`eF21C$v> zrx5rDF9*-T93S7#Z5H^>H>X!c|9V^Gkv*JATjhuGS7YJl1wA5#WXr)V56sE#$P|oq zf8I-D;Ru}F0M9czsHh0Vww~+6U}xK!@tD;je5~A#bC(|BC}__Kf~(l}ZGAR?;>yj? zzTYC3l9R^HeCq6EE@ECjcY4?N*Yr*2=SDReA)n3tBt^|U-VCd;7?4@d01Zaav1N?= zTTgVp&V5v?!pO7=1`SkTqu`&UrtpHx85tE;ll_ENZ=M>kI4p_9bZ5qoDVsI@`92wym68E(#}_ADmmdJhWeia@xJI z?Q{)4F>u(VsO7WlQOZLZ*1mEuu$ zEN2bR6q!g`;^EanRJ^4S*Iw~lEW_2ksP(<=a+LB{@_p?SvY&h=OBv zr#_7hCyS~;3&d8Zm^nv=a!~gr<0~s~e-}tg&^a(!hu^0YigWsHs-tqKC31Pi=&e16 zWe9{2$KqVi2Wi|HBe=d6PT$% zEMM?0AU=+7^mlD4@`m$l=WV_%qvyW2s#d=7=(9F`wt+C#m}#h!#%-^1(E2lRN$yh; zZWtCn^VrpAVV=q?IBlT}2z+WKf`H#(J;( zEEu5~me*FXEU1Sf`OkeDpAUET-$J1BG*1Q8nb*UjQ`vzwL5!LswW04DB6grblT&KT z(I5==kjP>r3j?SQgW;|86#pz=ksb#E}`7uGFigcydZP zp}&UF-7;4RnL|ucEGB|so~jzijIZ*!?@!HtF(Bs0Bhdw2I)&S31rv*;B%uy+^r5@^ zlNXnLcag&hNf)JtDi)vqThRKiUw;8jVOyjJ1PEd%b%?V>a^k+_pA%>6LUPNx7OSW>$%Grjm?3<5iOevXGoIPUDM(1cy42j&Jp+o zr9f$ZS~Dqu51*u?P1uVj`&$Bdftg6ae!sm~zE|-u+}*HlAv-xk1!ViyNGLA~_MwZx z!8?cIFBqQ&a?G#nN)|8G+y^lXEI$Ec8Pb-4o_Ecj4EkJog{%Nm%7r`a?R`>TU=3~0 zH+`B#V@uxa6x*Seo)IB&1D;zWqoV9*8ThYkh(Ob8d*{E%J+(+bt;~=Fi@lJ-ok1+? zF)bcin{sOrJY99oraheYhWFk8qm zTa>*ycS!?j*bYketYc?IrLwbkviIKMcU|YuT^#r4zu#Zq`=7f@zm&=Oqh|LR{R~U$l;L}(y}jfyE!PXpFz%YnODp8GI>RlId=W1zAYKX0y1FQ2nNez2FkL{wl_pJ?*!U2PAC5&*NUp)YqBw}zr%%DjbA-ymODfrvSjoFO(pp?imLs{ z_q4gL>!!!sae!+QSHaEYQlh_l%!F(cv={O5F0KOC8`yPhFB` zXUG_QnfM{3HucCY$%?{E@<-4t{ccAarphADA)|9)Qa zRLk15Q9I0oTlbbS@@YeJ4~NTLO#D!<*6GXF^{x4_NT)SV-fgz2(>7%(k4ux8}xhRmI1cGPQtoE3FoGM}k4lJAaInkz+*W%d}E=H$Sk z#tBiO(EZ;jhdN7~uO!=5UN+NDFo>=h*^OKlA2T{ei+pxG6+Qj6Ea1x2^IpZDx@#oD zhwOA?XcD>~0FD zNggykvxVav@q1ANnMEtb-uTjcU={Z>w6ZKOqOW_|?Nt#L{c=KNT1Ya8Ebb0x{e212 z7qM60Rx(!1qTyawjIwZ6wI>*B(T>kTR*ge_An zD>!uq&ikiy4<4#kkdF1KA5zJWQPnX#o>y0G-I$U;cNUhU&)QgbuuRmet6f`u8seV* zLx?dU<-qwenHLGkvSo%xVu>wUb8}?4m5vRkCjje^ReQAc#n}n7@I{RE7a0jn;ew!e zhnZi;Jd0`{mqx5CBV*GljBDMs6gp*EIjs0E*;KZhB$Q{+ayn%WHO@Oq_S&yC->IDC z`z}@j$|TQd{N>3 zQ_CsN*R)UN-aYonqGvH;wiKLTdbhWhlxwy`Lg4Fy@;ypP83Xxfg{j~*_3;^@)Y!Q( zOlU#vhtJx5>X^wdzlizkY(5L7mhN|qspDvg@vo(w;&W`YXx95j1N~hkkttDZ&AfU- zkt_05_t;a>XFCj?8ud8u)|<96UcW+rZf;y4BHzu|l@7F?tD^|?XfNP((t{TbSz0@>J>x-+1V)H+6jIs7{1VBE0L>g?pMH_Bgs zX1Y7>Oek*%^_%IgD#&=HruV7uZiFe4!XT`VA@9D1HJ5UswU6}T?7}3?)KY7NLrEEb za>!TEwIZk25u}vk3r~45D8!g(t)**Ab}d$AKEA_x$;Pzqsp#ToH?JEqNcT={fm^J3 zb<^k!F5CC@!Q-zjjM5iX8BOViT6qb=OdBHWm?)Y`GAT=CFifsi^)+Z zyHGU9Eh(oB?aS;6NeNx->D0*-lMZxVtt2^=TK_ILB_^}zalK-+@S4X>aAO22)^UD* z`4GENf_1H#PnFD>#QG5Wy{S6gi&D%LJd5^AzC31cV+1JfI?b1Cf1WT4*|$2Lx%^8y zMk?`CiDytjmqFK_#>?4k6$-4Lp}d)1b8aiiVJ(H7mO-j)V`sYJ`Hh@Z-?zu1v^y0q z7Uf5{n>-aN+oMI0upFE?9EI+JwGOoCy4)LK9GPC!Gd(@xbzYxNG_g(x^&eLzf zukl@6lnzKwbrO>kx*c;v7)(VQOBlyUH-tS2bL7-b@s5|7R=#UO-7CX1oK(^;^y~eZ z!Y{E=1%Xtet1Yw*JpwAPG)7}9?7v-W-P05J;I>(V#Xbs&tk9~Tt?3}((5rr>Vj*Xp zP!#6sTCc!+tUk1$UyH4kl+>%&zfsID-&w?6j#v4xgX2@1!ovk-bf$dzdbLBve8a*h z6`vuMyjp+3?vrxCC!*ZxEbTLnjz8OFL4ywAJ2v{I=H@#q|9+Jn19$Gx>K?r=$_ zuG_zWe)#B7=CH!h+jyS-$8P=qWQcs0SxHx6)#Y#U^K%71jhImy=1xFu{-do^WX<@( zQ@ym86#R1eL~P6b&&I zVf~}0EyLBFWMiM$wcLNilcz)^U}0l7bhFym{5v#uF880s+MIzOlU-}U(}zxmh;e&@;l8_|8Q7;qQ=YhQNf5)#+9vaxE( z4xR1qW_44)6pVlV@~A>{#8%F{>9|y1dB)9e9lRH&0wK7NyFcI?yg zT;@&wwbApMr13&t{pA?3Ib=~PnSHxqLu?ZJiKY1$7i-ITU$$nJwKy}q-0SLeQ}KjuVn1i=C?sU&$CY*u*o(^$-g>78X2Er0Qf)5CcQ)Ct?na4a0TauU{i)R#?XGr#%j=$m zM~R_01qBQDkzcpB`<#Rk*YL7i71#Q)*fp2&*rB}XQKq8u4s#=IH4!5Z(z{}Z7BkR? z!PVrVXX=YxKgA!duS&C;)tEjnOqisqn`uU~%0x%h;gzDhRF+zsToc&o?cZv_#^KNI zSnxv7?(27zzN!Wp=a3Gy5}tbRmdVvGsh8MwGprV0En8;XOix%m%R`$iH=N{7`8m{V z*rr@AdiJ|P;%I~lqt>en>Xt||dHzBh3Y826FDhA;5k|v&4Wkh4Wa^cA8UOcV<@5ov z^x!w_j8-TAv35&q{2r5_6#KlMz~RGd1G|SQi9?zz^drKZqG-WJbxTY*dVk|QYwNbd zJ^f$^@gVa6!;PJXo?8PKrLhOxo;jN;|7CUD{iR5R>ycfbo&MR`?@A_McB8m#Scdib z=fQWW5-phlSE4x~7WF3?MrlDQn8Y|OGYd#tR(>fZ73RwH&f z^p&$uLNfTD%#YHJoDCi`t4Vq$u&?Gt#_QxuezwBz?MykP15@ACo7T!ogsu);Pu7tJ z*LjU69#H@nt9{SkMZs;mq)x%Xw@>}OThu_V14u%Di8-W0b}}0LWRqn zn&Y*ueEo)Nx0a3a3mm5I>DE$?x-Hk6CF_ZZNs@i2aw(H4mOhg$-9IQ_IvFi>_)BkV z^s4K;y_>WAE3Fm*Vh^U}IkCos3$oUJ|Mb|5zBv<3;AmanZ;xJ^o1i^IGBV@PrzxMo zrc^5;T+25%2ZO;ZB3 zZ%ca+5F&_3sF{&}{Xv_Agxen3a_ZwD-n{bAW}0zS(1p?{qe4#Mhx2*AevY>4|D5QW zNSQCNZ#hMBle?sPox(E1?n+m=?pncgm&o|y)bqECZ{^&l zYtP(Yyy4JmpOPW^?P8{K``n~;=YF?k|F!*KUjZc@BF@v=8dZ*IIlU!>og<-5Es}*^ zWr@SzS3}1ao5v>wN9UuJow5g?CFqJxsulA5`c}9+tLm>s);{%vlURFDC#1EcNA~^v z?AdlRKH`eO$-2+)VqFiW0)dX3bAcDh#HS5Br&q)dfx!`%na~>!XqB$Mi1GH`syHgis0uRkyL*YePPvS-%HjCwMxz2Z8^dDGVS*9v}x>oC6pTI36ow!;w?{1m&+0|$u=t8ag zOqFOe8GYg8U@BGTQjO)9Ly9fAUxHih?1ZO7XPb>q0gLL50?V6=^%hUxy1utTuXOr2 z+r*rBSu1kZdC^jm%v5a6y~Ef?fH=Xp(LZg$& z{ZZ1*$_LdkEwKpPxBHXqDNQmhy?uMyB{7%j+>0 zQ`EIxK~ZCc-82I#KioOpPX8JyT!Pul}z+6$h}uaLGqE*p&LMSBLWEH;CS-toYq zoh*BoVU}VhxF-zx0l~DoB-Wm5KjahYzEB;&d2>l27hR%4F#_bPjK*Vt*R90mr(63!{ z?TBh$0z+h!^V}$dp5^p-N>|!E$p*X~BHvF?`!x zUrU9E{@KW=!x0<3T>>)UoH;cv8z}|dX3+5%qIx1RKa$Q z^N`kva-Vp)4^0IN>@I`SU84(SQCbM+@A;?O$KPqacrEY;JO9Q%3PDVNKri$5&C3mB zWi3n&+Xx-^eo;0ty){+&-HT=s+tC8Wh^j;&$}1%^w-+g(A(EMp&``WOu zx}2hLXEUmf!;8yQs5+WG!Xn>g zu%+Txly6l6kI>%cZ37kHu6F@<{oq8AH)Uhsc)C1#xXivp(Ip~Wz`dj6#}O`~5GvH< zng0mK)Idn!eZ}J-qa8V$Zb#fVWps1Bt-RA;0`X8cIa0Q#?_X4a`_(Wj6d?HTJ`u)TCZCQyj1)Rhz z?gf$+Bnk@U5~~jm<;y#{ZJ4Qi5gc-^cmaS`$63_oMmnd2J}>6X8x|ByHs~lS>bzM{ ze=O{+3SM1=`)-H(Run_^Eh?32dY#Xj%v%Zi4-Sy*J_%Ux3!v$h36P(3Yy`Iw5TW>g zh_GZ25TP$%LUj*dLT{aXWIW)*>;K?G2arl|FxVF;E){qzk@Bb*jhPQBZEK*AEP&4^ zj{}e(%H;y3=ce5dvh~63%`K0&)jF_=O7M~mwcgz7t_x!NF+=4Y=+SL+2wo}3>I^JN zy9y_kNqJR_D96S~{$S}}+(x>BFuGX_F!&yUb@l-}>;hetsHi>L>1jRGI_s0zJ=EwF ztq_GI@JI=<_=4Zr!Ec;i%0rSKVM%)O9=Qy;v|m6>1N@#F{x?3efK87O2i1ssoG&1M z8-WCZTj-N6+inj<17Huq$=C&?>|f1V^|%$w)CcF2vFl**h04d@g>Xqy{a6QBG{fem|+flGb2`A;b*uLef^NiLUr?Xm;5*WODLn$)Y z{bY~Ju0X0S8IjLEz@FOESoTb<9julQiWkKEnojTn)W?M&4=cxbOko&k1B5*N?|HLR z@e!l%v9^F4mHx(zf-F=>OMpe@qNEOqHV8$G({vJaJan-|b7@vh;=PeKX>2IjjNSi! z6&Q;}DAO=ty6zERTn-p>iR2cz2yk$AKALvO8qNWJ;Yr$UV96BR!RFd-lQvn<_QgC+ z=SPQzn~y(VW$-^Nv4+0*r8ykIwPkz$)Np$c!4mGl*B`OJDMl-!)w{md+5#%}G5ZyN z)8`}%_41FEKWsMZVr|@P!s-|oyt+qj^@|w$()h`LDqVI8Z?RjS*`cliiN6})A}w_u z5=fk#kw_aVH>}910c8v3178x^%BWTQT!;G4Lzb-!G<$7f87E|!E{~9vR?hbd1_m#E6WCn$d^V#O6A&ol6W^L*=V&BN84+ z9%9AoCZtV?_~|}kiD6)+q~H@&uOLk)Id2zoU3DG&Ux@hjQQ=^N=}hYPAY0Y_-HZo zdou^rqeOEU3xyF0JY_rwoGy4E-4OvEqg53;_0(T3Rz&v-jZ*eU(5}pv2-oei$&4-D zROqO_4DmOL`K4P_no_L=H#!eCT76ruuC46TmnZub(CX>g zb0o^T%v5ZggqkZkya>bZM#IvTDXQSiT(Sef)qW{?H-lPJ^6|6W_- z*;&E%)Uzr|l@@JTiUtOEt>aH1?vaq3-&KR*`de>UV_^t&0K1of>7(_DXkulfv5}uj z2wU1OC0FMYlZJOQ96;5OlL$&#CK3O=32qLsiIbkuv6(yfmj5qpK|KQ%G@ctUx?GZe`7ENH zo;mFv*dU{V%O$-ph^XD{{V^2cDb|ShDDd#Tu9H!BGmf<+&v0RP0K|=fB*vSh{?<{v~Geyojl^8SK9Y77PnFb>_f;wfn#8<$MtEye6w12PBUISs}_0R>m}v=fINd>(iOT)BpEv=p^&*sDQp0M$O=6hEPd?H z@+;CG>nKREj^b)yN`bEufX=zujP_Kdj>@T|5w&VJh_wlB)LGB4_^0nVwOf}Q^CEI~ z{UwN(nlPk#ij8>6T;C39I|Aqj*jt3OV1$znecGG$weD=1tO&+C6nM#dq%S!KWTN)i zQS!&m{b~P-;vhScaB-7u@Og_D0B`&znPq1huHDCaa0)pEb>H(1(9-eBMtX}Ih3wEb zs;#`#ed1r1=!F5?%IIRQ4qJ5d&r<(g{sA7G9Xe0ojub>uz|hx~{hGeJ zR#+jYZ#1O4x|nBRPUH30)(*oQ&=}@`ZEG*qsxfs`Bz2b}LF&jmGac)jMO1lPxbc1o zx80tm!>TdWR(_>zGtU~{rT&EkY@B6!nzOU{`z&0}UE#24c+-BdL)ql~GYiZh>yH<*B1sP;l0HYF2UF2a!iDUAoL zfMjl5xcZU3>=nrjYos7XD($gFcrkEtsy0(LPz=Dd(oox3?3ly`r5l0OMF^%KfOh7h zLqGj{6^M53Q$U|*{t;wfmB==o1{COKICTX!U_zZCClM+YCJgyQ)g!H-(fEdoU2}%j zycmvxwcBXWz{6ih@cXo#P3sMJ&j)Y>6qM|zwxiUno7`9%>?!Uww4r=h8>%|Fx1s+e zSzP6z&LmBQoy(lYI#@bRF^{;!K9c|QJump46!yJ_?$`W}4S^RrRN>N(b8G$^Zf)RS zw}zvEh-@FV-TsHkr~WXwvFRJJ91;72=gcq=*^7O%oQu4QXoyQ87Nq0) zz0C6oGCUDuYQYJoj0DCs0#rLr&L>GIkWP)N&MvbkZH(4IAObj`)BwO^Be>fas;(g)h7 zTOb`Q$zGF6mTdHYMIGl~6qm>|4g8uxvK+&`4RfZf!%W3ji@cBakC5B(+s(%XL11v> z05vjHuZ_4#O_wgnvliGL;K5kZWAc1s|9ZC&#g)%$1i3f1g}exB93OE(^ecBVI(`%( z(NcWnNNi5d;IZWPz8IDga~E{D$RF~*2ITrlz1C<$uBg{ABhSVH;z_};bg4);L{)u|jS`V;GZmHZ?(plazgVK9l7)?HC}Vig5R+4V=`;LS)8a2^qF?WS~M>k@lcs zPUw~KaXDSwNPMe>0lKF9+8%BQOa&&_Jh)6CLAzjS(=>}DJM+k)@cLt@DF7r)4mAiT@2<*U zay(5cvLW7$&pf97vZD$DsBfz3`z{H0`Maxild59C4rdAV{tge2T>#78S^&$BSDEe= zSJ_c)?l$}H`*N@1b#bL~a&Q7~EoP|vYWP_}SsWvjwV)M_#4?NBjc-_VgRSdWp)Tyq zZdIf+YzkI0BI8BtZBTy$`Y#Ml*f|5~>&m`CImye5%%12|12R?lE?m!dg#?6hmI@E8 zldJ$!F8)}c#nolHb;I_j==N+{wAuz0nA&c>Cog@n&Bv?P@cp%S6zh*f3V@gUV5JsO z-f{Y{=5KMVFFi{O;^EF5zOy)SME-(C+81Y}SIJeWHl)3=k4ciJ( zw{^_1`g`;mO7k%au7j`+33>k-%S5v~5)6n#4#46)tZ zre;MWbkrd&74i zBQ2l|Bys6zR#~gVUwQ&wW+Uw>t4OF!`kpk%j$;7`I|&VA*sxN*rgg*j%7)f%=+}Te z($>)3Vs71@Bya)F^x-&DUl{4L`SG|^q!=p3*{EUOg&T(q1tSQ;_gGhwG#zaL68_)d zg?~Vzi8ur_W1D&RMb!601ZDik6R^ z+rOb2QGmo_pfU`~4yD7Nc5d1c0qPt142^MkC&?L30nNoh0RrsK6i6W>WO0o6$d~wH z%WJPluUps|zofi`X#wx-~ zWe9g~EZn7?{D(H^{w*xM-5`P}^+>t0uDd4yALNLzUSLTHwMm(nkw5eiE6PSOH+$!+ zgtP84Rd_LW_OBC!McwhG5n$g#EPMPjpefTcRU&74JLBfNMHm?uPqH59?<-EJGs z$QD^)@*SJkyEIMOV2MTS64vuiKFMz~EI=l?G$52hzevUb3x$U6@d_tWsiE?H=5tf7 zFOe7X0x+9vZ^%P+62+>n>W@BBy%V0g!~c%^9Bqc>O-@;xe~xZvUqqBK5d|fxfrcjLR{+v6&$d z6=+G6x}G=PY@V5sdixOf0Ag3eglt{*wOh&Hxbx!(5Yui+EQwS(S6yWO73@0Z71&X3 zh>B^3BQd>(X0~i}yCE$8r#g8QeE~L1=&Z)N*j-^^LJ%vPIakK!XIm61@+4NF63RiX zMBLU;Rt`}DS%G>Bd3Xv$D!}$NrAlqMqdyEL>obtJ?Uj9yf;F8{Fp#yu1(Vkr3qEZ4 z$A4d#!I}uuqlNB$IX=tAb4^JVSh*m(;j1rkuikAeB;4%YiAZ)cSIbA5XIWC^vxXe#zt`aL)sZ zz{`l^YF1^5pAErZZQhV6$Di)DVc{b;w7UCXWh4z3bN%p-{WIs^_yjFA2$fM+zDt0| z>lC1GhM*(iHgoV~*o$>Me=UVNLIyY<98xtN;b_q<8gg;uIo9_hDPZpS1{)Ay9;js> z*%AfdP>e=l+ghZKY;E zAfF6~>{^`5)6j0+xy9vyucsp%LB7xLyr`oXsorv`{tTdIw+i6jU0jHKjc!PNU?Wlb zYgfD)pib(HCrpeKg%qF0Q5-?udKnMJ$|}sd7OJ*}Dn<&0z*qth6Y%h0S=jgEz{_J> zZ~;EStp)s3$*c_ogt9oGu;MvZ!ijgj4&j+DMj65Y5ja~+)xjthWTX=$suGtw<&$53 zy2W*Z(j;`Yvf-{b!Q++iaXZ`|`lZ{O@a&;Z7uFLOo1?lumMdSbnx1UF2d&d*Z1|3I z(%ps3vsedM?<%1}K)~gG<&wDarca@|NI=QUH!2EjTJI28Rz@3Z?z*#yGVmBn59A)4 z-$e`A<~_79#jg1puuq5rySc$CB0PX13ONcqjicMKk04G|s@&Us9I2-T*V4hQmAgA* ztK9?U`y4TFx^k|!f$RE#2G5sY!ahHqhjhWC?H_BCN;NiY* zk+Zl=37G{xVG(T(ewQ2HZiUFqbu9QjgVo%}4HqIBEi*Fn54pRKHOJbuRe52F)nh^B z3%L&P;FBewvHB^JjE5@EOxL*)%oB8da?q8*jk8rJgDq>GYQfB{6RAvz~A#w{%c zz}U9 z5!^bzfZN3YBKD?7@L~2uv#w`5Xu5v5=}J*CHWLEnQ&0k{HrU+QW@^r0&*dY1#XhZL zp6UUlHE?e)wTi?XPc0G+9>&K}q6CgRu8S59i!Bx4|8mZB{c?$%c)BJz}YWo>2 zx`d*>iK(gjPpW)<3JiC+AsgcS0UK3oO}OzRClKQ99OkZAc^w8AfZm}aV0h3N?|Pu=hCF;DB`L+T zG?sES&GRXa@hA02)r~gSS=Q5;eJAgXuR2|KPV2~}>U%Qj7KD>E$o$E+pZEeXb_!P~ zMPN$aVeo&GjJsoXlg~1Gv0);ZB%uwe4-?o@Kf=*+f;iyDonWs(6M_S}4jIq8t4$ya z=s>b(ZIkJ{H4DI!*-A9!tZ%X0q={u$_5QT`=AoP0;p_XMX1(yExS6G-tkL3uQTQs- zVd>sD*Xt{{p*kZyLHI%&!lC^~H|bx!LoyPypi^fHD=d{C=WAiGujD7WB9)lTl zZ>7IbN`JqL-NY7EjWj~}*Jm_{k_%YO=cO{jha$rftLoB!cMl*9>+dR%qN+}}Q;OO4 z&Zec=u!o7+3Wq%@6vn>Uj9}vq6Wu=!U|h^9_R_Tt^UH z1qBq2PrL&}cu^m6>P}zJTh1Nw{x|_wn}ZGUJFog|%>*EcH)+o??kEQXp_;Cj%SzpV zDt~Ta@_}X!bZ?1*x+8Xo{JWRmn*tn;B0e4F`kHT5igMvwZVk&nAHX|$7mN13liSn} z-*}1DvnYRgSl_@lx&FX>F~_Hu*bRI>`Xd74?WrBL4a{E@nLV+*uO>RZ=r`uM*v1l0 zInARabh{602IJlW?9$7pyuxeSBCjF_b%Fv@Tykl3V%&5Ka<4~^4Pz^CyFqj3{PD|P zTas(6+&~VGg~!aZIdMhWnCM%rhjgHv&j17dStbLuHQ$5(`U?RElWflt2M73ZuDJ}t z+J@wjAK;9Yg6(=Hya9;~jtodMtLW>TTfUX_F>H6O6xFQlZXvi6WCpRao~rZe41SSi z&|K~^aN_86!r0y9!4^vfI3f|-pS01FL8NjP>=B(E>eomXn;%iSIpk>wgPlk?SMsc- z<#*TOFG-_Ph;<6=c=GnS_dfMx$SMItZmSJE5Oa0PK+JsT>m_(!MAj1<#y&MaSlpZV zM6<&g8)D9aUSxx{jt~A}ME?Vq=ZnKyNzTAoY|x8UbCcPL`{ z%ktDSr}yhbc`XykQ+Y;uB`#iU&>{iqG*9Xpwv^y-5|}yer=l9W}-g-w$;|H43=FPwC7x>t~;B9Ds^jWJ`^S>Ctbgg`Cm%_uN4$3y4PLyfpx5} zS1Bb^(&%*xn99k5)+xW^oDcfX6@C*+OOt(P?vd(KHPy!AW4lfke^@E#OKI9SbQ)|+ zkPNJO>>0&27StPY>f^@vzIS^qc35sesYpzAkfze&_X2_6Lbq}k$5S@Sh0dzva$U8WxUN>f-5+pHY28T3{fq`n@myI9r z1pMG-P{p#YeW7o$^o5mjGzfl=+mMj3FNg(%vVVVkoio)D*r-t`{83ev$g;BguD1su z9WUju$9OHNqSQ7WJrMak+biUm84EM3zo^B2uufgCDqN&%G|OwM-nvod>7gJ9?I9;; z*yo7!MzGs=lI@z4zn|}%sB~|kPt(lx+Sr`#qelh4##;st*C|vuih^Koxi{-K<`aAv zSkMzgXk0Oi3sL{b()pl2oZ7^K=x>rD?;^yO%_1lcM7W>OD#&fhe#-#6s;~%?RBKNE z*R;a#z0kAW8T>Zf6>TP<8Krw2Sl@j&_-ACe&B1#heordlpx?1YP>@pk(|4AD>q122 z-*ql?wuIk{6a+?hsN6psuWES|UBsH|U?1w~;8-#0aOb&rFZ02hkgu%oi!L<_#kv2z zpWh}pk^!X*qU{?gBG;*Q%`cPXF$lE6^~`}wF5^G8geNnG@9rQ^N=nJ_eXDn>8O6y6 z|3(5-51;IB#2NMG}6n7bqi`FPeci2al{C98Y_f zyZ^f@H~2}$Z+^Z5*zlX1jnH;F>bb2JzBhpAeTt~oo^%?|pCAq%d(_;AHJ#Bk3Mln$ z1957)=%QXaJ&mh&FN=L)3FiX{Ab*#>0o(s(0vj_7vh293V2WoH(=v{;wpP&EYE8fT za}MZ_cexR$S_VQxr*KgxV^ zgb}0LPP#3FzF7L`u^~Q4lR!+IDd~3l^eNmq@Lo`s3otr8b00sC$*8lz6gLPqHAe%$ z+;1+6p=Jpj%<|R+-f-IpkN})M4hR@GHyH(q66bh645m<%!10z2r^1o#KQ_L>J=W{Y z?c~;A!tQ-NsKJjm!mtX)nH)!iR?k=O*!CsQpe_v(F`L!l;%+4`G7D{M`1Q0i2Ln3mj+t$a zKs`7F_p&V${M@R&Y+P@@Rr(K}JJk*eGyO zL*50cuUa4B2O-JK$+UMNt_KV6blX`9wO~2*;AkYJ8>=@ZzQPjtitQc;P-_9cCRVe= zag0XZ3ke~4gXpLN`GVquvGH4WY@Cr^L8u@nIH_~wjNW!?bMXhuefaHGGQO^ z_8L#?e?VsN1DDZkc*z~UzLg!3%DDVsHA=1c(*Ye$l|maBU)s`w@1I8CciI4P*aTtaQ@?KWR0jiO0bK!5=7kvF z%Uj8Vf5W$DJwvFS=2~rP4)HFBMQ;TipvM2{!Z$$^zE=w_c1`fV`m&+fvLy!#qjWFo%FDlTB;bS4BQImMAU6%@* zX+chcN|mPj03-HW5+L2&C%J2zbn_$$FuhI-rDF5%lV9n8AnX1S23Wo(1Ji)}@tPV#sbsPngqt$J&%YzBVZ{G9Ybp#D@Tz zb$1{Bm*6=ba5Ci1$p=B0TB+hk&GAcAO(ej?fbIohA6+#czG^gJMLq48MDB6G4Ku2S z5|A30rjD5pfuD0U*askW&`2TzKcph}A^_I)fyuoy>8ZwEqYJecNlWw#Mgtq!2)4DB(OAbk3n2<;p&T*x=_L z=)dop#t7gZ*sLwQ%6cH~2|MqYB(emmeEM#N2`e4YRZW}4Rp@;ck7u9!wQ7e%rDA_v70yPxXMY`_)((! zb`Lm6I;TynW!P2xHSlxt)wbk-M++!0i}WexJ^Zb ze7(kJ2aW=siTgMbTulkuPQcVOS3eQ}856z*>5_|rUzBF@`my1hKe%Y+#I66h)nta_ zj^NH9mA&pUc&^DZ)Mv)su7-vj>A=E8BfJoVcATm9oN7}3* z6D5w14?tOiu|^PRaq{Wh1BSsyS35yCe$T^w>e>VK>RtG^6PJ&##+Si_A%qFxybc7*5mq81RL=Vqpo&rz}Il)|H-r&N(xdpaZTzZQ`MJ|_RGRX={;O0Ehic1n; z*IV;k9)3d&Zco|+3oOG$r@o}$A2If3^alkN5^yh*NM8*rK0yKUdl2zt)1XX!^F-e* zSZR7buR0GN*^#0c@233${Ta$hF=FM(5Vq_K z!UhQ?(;*clUr-lBU4{9XVr?`AuUauHNTK%W6=W_*W-k;cLN_ExSrY`+Bm*dMO1$|t z!3mM%F>JkKX$sx&fvdDL0#qStczfc&B5@wzO){D1r?>H4)aGSXU|KkK;1|4vt!NLlRb6v*v5UQ17b>Ftn2REa&MJul!;}#G(Sox9K+HUFc zLiOZ4WCw?Arww#L|6RJEZW3osE!I-kCWj>`SR--YbrNvAngA}T_ncyzkT>Ck--U8e z9Bn7ZXw=4JffV;jkyt0)-Zv#%sKeC11 zv&0D^*ygCO0)}w6`?&L}%!#EWII}?)uzs<~=MN2I?q?1;%^-t`HtS&rKa~;f_x8Q z@)S60vF0B%F#OOCf6WK1L$+t#^*^2el-Fu%3E~nzJ3f#$q3(isru0OrHh!&Su8uAO zQMeCbAKGusYY`X@+nm4(AQlB#)KFc7YOUIKml_ly5uhp9LB>@pz7AnZ8(|?({fQg_ z41HJSw~AjkLEi{KIMd+QzePR;IP>0aSm%I)!)CTcs>0m0t6cKo;>CWkTfqHPq4FKjl|1y|uS}%gz+R*=kryif{yRD6rcgJ6YO2gul*1!Yhf5L$Q^<>(_HL7LyyHwaEi5 z>M12-0`O-%VM_IJR4rHsoC&6%>Rbt@@&Xlq0h5K#S3QtBK$p7J;|l*J{4j|NEb_$2 zr|+BrfxvX5nIY&uppHi(Y8|)6Lb$(SW83I853PVih?ddQ0=5Se0V@-|?D3O_j8uf- zKeo5>q^eLc-ffrzVBzpd<|3CM@2c&%_>~yg01B~RTyDoWIND8Td5MEzV;fH7VYUz1 zs;|SuhV!PpIOy+X`8izlKoWyQo;HkEdpkkrKpymQl~_kO2$omLWOO=1L9vm^D8H@6 z%^Bj`*Dc`xc|3y#9hU}7~uHxEw1$_KZA>l@cE zpr@Cmi)B{=3Gl#dJkb&Ocm>TdISO1oD||5AacKv%irORkG*FkM0UuHptFg5LJkaL$ zgSDBY;;`MY#0+GCsG1F~@kn2(gZ&(H&^E(!xPF7?y30R6IbzOO@nJj}rlJev z;3vQf0S;C+*p46`z1@8j@=@F_3!YK`e3bi4fGXeCA>efqy|vc;+oQshC19Sj1dQeQ z=E+h3&gv-uc}4y+hd*6{bYMGro*zOB(_AKS)r*E%9Cja z@U!;DyaJ;n@QS9fm~Nx(Xgj%4@pR@Tm(FUz_Ct}uAig&Up>W+Uz(2MR8{iKZ{lwOp z_GI?J{_cQokqGy47UuVvyiG`odx=aa&I5Vs^+)Fq0{+2aDAj~DL1}QA1(C8I|IKip z?V2g+*uKcAA}uhM2jI@1Fc33kVFcc<)D&-&4L`LdX#r`MiuyR(Py37O}^JqLWx zKB;8MqGG=82xhWQU0~T6Qy`gXI=i0kX9? znTzsTKE2Fj;cb`|aTyo~g>JDVu|Bmfb9v~_E_?_|A&h z2y19j-$=@Bca-JWMM4xZ8{QE-M7pGo%1MDEo&Sz2>N zXf)m%WKk$8(1LfPej&D9EY`dKoXGIU7oC|uKa{ANk23|lS8w0L>}LjIoRmPRyZBc@ z{%|4+&o8!k@~Q zJiryeL_z-Qras#(GEa_WGGM@^j;4KUsW9fZ`<*zQ9kRa&x=){vkhvPCwSX zYkIQEeP13;FAcK-FQG1)wdHaAmfL665%h*5&H2tDh`6y2!yPhL{7mG_U)E5_dmwd- z7=v8NHr=c7uaheBERt{t&eIv(8PvM$b%1FRcKeh8>f)#9!!{}QhSlCDAK6UzWKm#Q z|73k<1ll`((rJ?Z8kiXI+&4keeBpHH>+PbGT!ghHqWqC0X92n(c$_OjZJ^@INu1kbvr|x`6+^__bn?Q{sz3|y988_BLW2kN znh=MN2$^5&-ew`xUb5py49zdKh2}8w=yq`Edx4w1n7P2N@{;Zg;#F6$YhU6JpSQ-R zW#-v%ivH2ByH}AOb%EUBzWJ*_`N{1xaEaJgt|kA9+Nh`F%7Wo>;4XEa#uXjiuCqh3 zTS?DsoZHR(_UE~d#HJQ8Z>dgKp7JgqaD~w)7)q|~s@{Csc*FWFq$0|a`&Xo&Q(M1h zxFP2QtnzuN?#z%M55vv2LlZG^!2W{VI@`TB;O@bwqP-p%Rm69m1u`e{D5B!?bzX)H zovbIA7n8F+{j`Hxp}>%X8y2PoUsho2-FUch^<-K)cl+?bi>DG4Cp0xislR9y9lOP& ziy+=2RGbV@Kgj_8eh$28H)C!luZ3Z;II#=o4F&PW?GXEz{8!GjeA3#i{c&e~(IvN& zF`tKN57YpL-6P4~VNEU4xQ%+C9+Qt8K2&No?8ucT!>Za~$9DR)D~Q*?6agjMfYUZs zTtOdYc#|W Date: Tue, 7 Jul 2026 11:01:23 +0530 Subject: [PATCH 129/136] faq updates and edits --- modules/ROOT/pages/faqs.adoc | 215 ++++++++++++++++++++++++------ modules/ROOT/pages/whats-new.adoc | 1 + 2 files changed, 178 insertions(+), 38 deletions(-) diff --git a/modules/ROOT/pages/faqs.adoc b/modules/ROOT/pages/faqs.adoc index cc93a5b21..b5943d7ce 100644 --- a/modules/ROOT/pages/faqs.adoc +++ b/modules/ROOT/pages/faqs.adoc @@ -8,10 +8,9 @@ This article includes answers to some of the most commonly asked questions about embedding ThoughtSpot in an app. -For more FAQS and community help with deployment-related issues, visit the link:https://community.thoughtspot.com/customers/s/topic/0TO3n000000erVyGAI/developers?tabset-80a3b=2[ThoughtSpot Community site, window=_blank]. +For more FAQs and community help with deployment-related issues, visit the link:https://community.thoughtspot.com/customers/s/topic/0TO3n000000erVyGAI/developers?tabset-80a3b=2[ThoughtSpot Community site, window=_blank]. == ThoughtSpot application - [#tsHostName] .What is my ThoughtSpot instance? @@ -20,11 +19,10 @@ For more FAQS and community help with deployment-related issues, visit the link: A ThoughtSpot instance is allocated to customers upon registration and license purchase. Users with a valid license can use their ThoughtSpot application URL to access their instance, whereas evaluating users can use the free-trial instance to try out ThoughtSpot features. For example, `\https://Xyz-company.thoughtspot.cloud/`, `my1.thoughtspot.cloud` (free-trial instance). You can find your instance URL in account activation emails sent to your registered email address. ==== - -.What is ThoughtSpot Host? +.What is a ThoughtSpot Host? [%collapsible] ==== -Your ThoughtSpot application instance URL is also referred to as `ThoughtSpot Host`, `thoughtspotHost`, `tsURL` `TS_HOST`. The instance URL is required to initialize your embedded application and sign in to ThoughtSpot extensions, such as the Vercel integration, business app integration, and ThoughtSpot Google plugins. +Your ThoughtSpot application instance URL is also referred to as `ThoughtSpot Host`, `thoughtspotHost`, `tsURL`, `TS_HOST`. The instance URL is required to initialize your embedded application and sign in to ThoughtSpot extensions, such as the Vercel integration, business app integration, and ThoughtSpot Google plugins. ==== [#lbDef] @@ -43,7 +41,6 @@ image::./images/lb-image.png[Liveboard] ==== A data source is a data object, such as a Model, Table, or View, from which users can search data and create Answers and visualizations. ==== - == APIs and SDK @@ -51,24 +48,31 @@ A data source is a data object, such as a Model, Table, or View, from which user [%collapsible] ==== -You can embed any of the following components, or the entire ThoughtSpot experience: + +You can embed any of the following components, or the entire ThoughtSpot experience: * Search page * Liveboard * Individual visualizations from a Liveboard +* Spotter (AI-powered natural language search and analytics) * Specific pages of the application or the full application + +ThoughtSpot provides the following embedding options: + +* xref:onboarding-guide.adoc[Visual Embed SDK] for JavaScript and TypeScript web applications +* xref:embed-ts-react-app.adoc[React client library] for React applications +* xref:mobile-embed.adoc[For embedding ThoughtSpot in mobile apps] ==== .What is Visual Embed SDK? [%collapsible] ==== -The xref:VisualEmbedSdk.adoc[Visual Embed SDK] is a Javascript library using which you can embed ThoughtSpot application and its components in your web app. +The xref:VisualEmbedSdk.adoc[Visual Embed SDK] is a JavaScript library using which you can embed ThoughtSpot application and its components in your web app. ==== -.My app doesn't allow custom Javascript. Can I embed ThoughtSpot in my app? +.My app doesn't allow custom JavaScript. Can I embed ThoughtSpot in my app? [%collapsible] ==== -We recommend using Visual Embed SDK to embed ThoughtSpot in your app. However, if your application doesn't allow custom Javascript, you can embed ThoughtSpot in an iFrame without using the SDK. + +We recommend using Visual Embed SDK to embed ThoughtSpot in your app. However, if your application doesn't allow custom JavaScript, you can embed ThoughtSpot in an iFrame without using the SDK. + To embed ThoughtSpot without using the Visual Embed SDK: + @@ -97,6 +101,42 @@ The Visual Embed SDK not only allows you to embed ThoughtSpot, but also provides Yes. ThoughtSpot provides a client library using which you can embed ThoughtSpot components in a React app. For more information, see xref:embed-ts-react-app.adoc[Embed ThoughtSpot in a React app]. ==== +.What is Spotter? +[%collapsible] +==== +Spotter is ThoughtSpot's AI-powered natural language search and conversational analytics engine. It provides a chat interface for users to ask questions about their data in plain language and receive instant, business-ready insights and visualizations. + +For more information, see link:https://docs.thoughtspot.com/cloud/26.7.0.cl/spotter[Spotter documentation, window=_blank]. +==== + +.Can I embed Spotter in my application? +[%collapsible] +==== +Yes. You can embed the Spotter interface in your application using the `SpotterEmbed` component in the Visual Embed SDK. For more information, see xref:embed-ai-analytics.adoc[Embed AI Search and Analytics] and xref:embed-spotter.adoc[Embed Spotter experience]. +==== + +.Which Spotter version should I embed? +[%collapsible] +==== +The right Spotter version depends on your use case. + +* Spotter 3 (Recommended) + +Use when you want the most advanced AI analytics experience, including automatic data model discovery, deep research mode, chat history, and MCP connector support. Available from ThoughtSpot Cloud 26.2.0.cl and later. + +* Spotter 2 (Spotter Agent) + +Use when you want agentic AI analytics with richer contextual insights but do not require Spotter 3 features. + +* Spotter Classic + +Use when you need only metadata-level insights and do not require agentic workflows. + +Contact your ThoughtSpot administrator to enable the required Spotter version on your instance. For more information, see xref:embed-ai-analytics.adoc#_feature_status_and_availability_in_embed_mode[Spotter in embed mode]. +==== + +.Can I integrate Spotter into a custom chatbot? +[%collapsible] +==== +Yes. You can integrate Spotter in your custom application or chatbot by using the ThoughtSpot Spotter MCP Server. For more information, see xref:mcp-connect-custom-chatbot.adoc[Integrating Spotter MCP Server in a custom application or chatbot]. +==== == ThoughtSpot Embedded @@ -129,7 +169,7 @@ For a complete list of features, see xref:feature-matrix-license.adoc[Feature ma .Do I need a license to embed ThoughtSpot in my app? [%collapsible] ==== -To embed ThoughtSpot, you require ThoughtSpot Embedded license. For more information, see xref:get-started-tse.adoc[Get started with ThoughtSpot Embedded]. +To embed ThoughtSpot, you require a ThoughtSpot Embedded license. For more information, see xref:get-started-tse.adoc[Get started with ThoughtSpot Embedded]. ==== .Can I preview the SDK and APIs? @@ -156,9 +196,9 @@ Starting from 8.4.1-sw release, customers with license to embed ThoughtSpot can .Do I need a ThoughtSpot Embedded license to customize and rebrand my ThoughtSpot instance? [%collapsible] ==== -If you want to rebrand UI elements, customize fonts and color scheme of your charts, you can use the *Style customization* functionality available in the *Develop* or *Admin* tab. This option is available on all instances and doesn't require a ThoughtSpot Embedded license. +If you want to rebrand UI elements, customize the fonts and color scheme of your charts, you can use the *Style customization* functionality available in the *Develop* or *Admin* tab. This option is available on all instances and doesn't require a ThoughtSpot Embedded license. -However, for advanced customization controls, we recommend using ThoughtSpot Embedded features. For more information, contact ThoughtSpot Support. +However, for advanced customization controls, we recommend using ThoughtSpot Embedded features. For more information, contact ThoughtSpot Support. ==== @@ -173,10 +213,29 @@ However, for advanced customization controls, we recommend using ThoughtSpot Emb * xref:configure-oidc.adoc[OpenID connect authentication] ==== +.What is cookieless authentication and when should I use it? +[%collapsible] +==== +Cookieless authentication (`AuthType.TrustedAuthTokenCookieless`) uses a bearer token instead of session cookies to authenticate embedded ThoughtSpot content. Use this method when: + +* Your embedded application is served from a different domain than your ThoughtSpot instance, and the user's browser blocks third-party cookies. +* You require a stateless authentication flow that does not depend on cookie persistence. + +To use cookieless authentication: + +. Enable xref:trusted-authentication.adoc[Trusted authentication] on your ThoughtSpot instance. +. Set `authType` to `AuthType.TrustedAuthTokenCookieless` when initializing the SDK. +. Set `refreshAuthTokenOnNearExpiry: true` to enable proactive token refresh and prevent session interruptions. + +For more information, see xref:embed-authentication.adoc[Authentication]. +==== + .Can I sync users and groups with ThoughtSpot? [%collapsible] ==== -Yes. You can use the xref:user-api.adoc#user-sync[/tspublic/v1/user/sync] to sync users and groups from external systems with ThoughtSpot. To sync users and groups from Active Directory, you may need to use an AD sync script provided by ThoughtSpot. For more information and assistance, please contact ThoughtSpot Support. +Yes. You can use the `/api/rest/2.0/users/import` endpoint to create or update users and groups programmatically. This is the recommended approach for new integrations. For more information, see xref:rest-api-v2-reference.adoc[REST API v2.0 Reference]. + +To sync users and groups from Active Directory, you may need to use an AD sync script provided by ThoughtSpot. For assistance, contact ThoughtSpot Support. ==== .What is the default SSO experience with embedded ThoughtSpot instances? @@ -220,10 +279,48 @@ You can map a user’s groups in the SAML assertion with ThoughtSpot. For more i .Can I restrict my embed application users from accessing the non-embedded ThoughtSpot instance? [%collapsible] ==== -If you have a single ThoughtSpot cluster and you have embedded the full ThoughtSpot application in another app, you may want to prevent external users from accessing your non-embedded ThoughtSpot instance. ThoughtSpot allows you to restrict embed users from accessing your non-embedded ThoughtSpot instance using a TSCLI command. Please contact ThoughtSpot support to enable this flag on your instance. +If you have a single ThoughtSpot cluster and you have embedded the full ThoughtSpot application in another app, you may want to prevent external users from accessing your non-embedded ThoughtSpot instance. ThoughtSpot allows you to restrict embed users from accessing your non-embedded ThoughtSpot instance using a TSCLI command. Contact ThoughtSpot Support to enable this flag on your instance. +==== + +== Orgs and multi-tenancy + +.What are Orgs? +[%collapsible] +==== +Orgs is ThoughtSpot's multi-tenancy feature. It allows you to create isolated tenant containers within a single ThoughtSpot instance, each with its own users, groups, and data objects. Orgs are typically used for: + +* Logical separation of departments within a single organization +* Supporting multiple distinct customer tenants from a single ThoughtSpot deployment + +Each Org functions as an independent environment. Users assigned only to one Org experience ThoughtSpot as if it were a single-tenant deployment. Users with access to multiple Orgs can switch between them using a menu. + +Orgs are enabled by default on new ThoughtSpot Enterprise cloud instances. For more information, see xref:orgs.adoc[Multi-tenancy with Orgs]. +==== + +.Do I need a special license to use Orgs? +[%collapsible] +==== +Yes. The Orgs multi-tenancy feature requires the ThoughtSpot Analytics Enterprise Edition or ThoughtSpot Embedded license. For more information, see link:https://www.thoughtspot.com/pricing[License types and pricing, window=_blank]. +==== + +.How do Orgs work with the Visual Embed SDK? +[%collapsible] +==== +When embedding ThoughtSpot in a multi-tenant deployment using Orgs, you can scope authentication tokens and API requests to a specific Org. Use the `orgId` parameter in your trusted authentication token request to authenticate users into the correct Org context. + +For more information, see xref:orgs.adoc[Multi-tenancy with Orgs] and xref:orgs-api-op.adoc[Org administration via API]. +==== + +.Can I manage Orgs programmatically? +[%collapsible] +==== +Yes. ThoughtSpot REST API v2.0 provides endpoints to create, update, and manage Orgs. You must have cluster administrator privileges to create and manage Orgs. + +For more information, see xref:orgs-api-op.adoc[Org administration via API]. ==== == Customization and rebranding + .Can I change the look and feel of ThoughtSpot? [%collapsible] ==== @@ -240,9 +337,9 @@ No. The Style customization feature is available on ThoughtSpot Cloud and Though [%collapsible] ==== * UI Layout and style customization + -The style customization feature allows rebranding UI elements, logo, fonts, and color scheme of charts and tables. If you want to remove the Powered by ThoughtSpot logo, contact ThoughtSpot support. +The style customization feature allows rebranding UI elements, logo, fonts, and color scheme of charts and tables. If you want to remove the Powered by ThoughtSpot logo, contact ThoughtSpot Support. * Email customization + -If you want to use a xref:custom-domain-configuration.adoc#_email_customization[specific domain name and sender ID in the system-generated email notifications], contact ThoughtSpot support. +If you want to use a xref:custom-domain-configuration.adoc#_email_customization[specific domain name and sender ID in the system-generated email notifications], contact ThoughtSpot Support. * URL with custom domain name + To xref:custom-domain-configuration.adoc[customize the domain name of your ThoughtSpot instance], contact ThoughtSpot Support. ==== @@ -299,14 +396,18 @@ Yes. You can set the custom action availability to one or several groups. Users .Can I trigger custom actions programmatically? [%collapsible] ==== -You can use the xref:pinboarddata.adoc[/tspublic/v1/pinboarddata] API and the xref:search-data-api.adoc#search-data-api-ref[/tspublic/v1/searchdata] to pull data out of ThoughtSpot, read it, and then take action on it conditionally based on the results. For example, you could send a programmatic query to read Sales data of last week and then send an email if they were over or under a certain threshold. +You can use the xref:pinboarddata.adoc[/tspublic/v1/pinboarddata] API and the xref:search-data-api.adoc#search-data-api-ref[/tspublic/v1/searchdata] API to pull data out of ThoughtSpot, read it, and then take action on it conditionally based on the results. For example, you could send a programmatic query to read Sales data from last week and then send an email if they were over or under a certain threshold. ==== .Can I use custom actions to connect to third-party applications? [%collapsible] ==== -The upcoming ThoughtSpot Sync features allow you to connect ThoughtSpot with third-party business applications such as Slack, SalesForce, and Google Sheets. -Custom actions require writing a bit of code, but can be used to send data to applications that do not have a native integration via ThoughtSpot Sync. +Yes. ThoughtSpot custom actions allow you to send data from ThoughtSpot visualizations and Liveboards to third-party applications. + +* *URL actions*: Send data to an external URL endpoint. Useful for connecting to applications that expose a webhook or REST endpoint. +* *Callback actions*: Pass data back to your host application using the Visual Embed SDK event system, where your application code handles the data and routes it to the target system. + +For more information, see xref:custom-actions.adoc[Custom actions]. ==== .Can I pass authentication information with custom action? @@ -327,13 +428,13 @@ The URL-based custom actions allow you to pass query parameters as key-value pai .What is ThoughtSpot REST API? [%collapsible] ==== -The ThoughtSpot REST API allows you to send API requests directly to the ThoughtSpot server from your application client. You can use it to query the data, automate deployments using TML, manage users, groups, sessions, and objects, view logs and so on. +The ThoughtSpot REST API allows you to send API requests directly to the ThoughtSpot server from your application client. You can use it to query the data, automate deployments using TML, manage users, groups, sessions, and objects, view logs and so on. ==== .What’s the difference between the REST API and the Visual Embed SDK? [%collapsible] ==== -The Visual Embed SDK is a Javascript library specifically used for embedding ThoughtSpot web components into your web app, such as Search, Pinboards, and Visualizations. +The Visual Embed SDK is a JavaScript library specifically used for embedding ThoughtSpot web components into your web app, such as Search, Liveboards, and Visualizations. You can use REST APIs along with Visual Embed SDK to programmatically deploy, manage, and control embedded objects. ==== @@ -353,22 +454,52 @@ The REST API v2.0 framework is built upon the existing core API functionality an For more information, see xref:rest-api-v2.adoc[REST API v2.0] and xref:rest-api-v1v2-comparison.adoc[REST API v1 and v2.0 comparison]. ==== -//// -.Can I embed ThoughtSpot components using the REST API? +.What is REST API v2? [%collapsible] ==== -ThoughtSpot REST API framework supports data APIs, using which you can embed an Answer, Liveboard, or a specific visualization from a Liveboard. You can use these APIs with or without the Visual Embed SDK to embed ThoughtSpot content in your app. +The REST API v2.0 is the recommended API framework for API workflows and integration. It includes several structural enhancements with simplified request and response workflows, improved developer experience with an easy-to-use, interactive Playground. -For more information, see the following pages: +For more information, see xref:rest-api-v2.adoc[REST API v2.0]. +==== -* xref:embed-rest-api.adoc[Embed using REST APIs] -* xref:custom-viz-rest-api.adoc[Create a custom visualization using REST APIs] +.How do I authenticate REST API v2.0 requests? +[%collapsible] ==== -//// +REST API v2.0 supports basic and token-based authentication. + +You can obtain a bearer token by sending a `POST` request to one of the following endpoints and pass this token in the `Authorization: Bearer {AUTH_TOKEN}` header in the subsequent API requests: +* `/api/rest/2.0/auth/token/full`: Returns a token that grants full access to ThoughtSpot. +* `/api/rest/2.0/auth/token/object`: Returns a token scoped to a specific metadata object such as a Liveboard or saved Answer. -.Are there any Certificate requirements for REST API calls +For more information, see xref:authentication.adoc[REST API v2.0 authentication]. +==== + +.Where can I try out REST API v2.0 endpoints? +[%collapsible] +==== +Use the *REST API v2.0 Playground* available from *Develop* > *REST API* > *REST Playground v2.0* in your ThoughtSpot instance. The Playground lets you explore endpoints, try out API requests, view request and response workflows, and generate code samples. + +You can also preview the Playground on the link:https://try-everywhere.thoughtspot.cloud/v2/#/everywhere[public ThoughtSpot developer site, window=_blank] without signing in. +==== + +.Should I migrate from REST API v1 to REST API v2? +[%collapsible] +==== +ThoughtSpot strongly recommends using REST API v2.0. REST API v2 provides a robust framework with the following features: + +* Token-based bearer authentication +* Standardized request and response JSON structures +* An interactive Playground with code generation +* Logical endpoint groupings (for example, all metadata operations under `/metadata/`) + +Authentication tokens generated from REST API v1 endpoints can be used to authorize REST API v2.0 requests, which simplifies incremental migration. For a full comparison, see xref:rest-api-v1v2-comparison.adoc[REST API v1 and v2.0 comparison]. +==== + + + +.Are there any certificate requirements for REST API calls? [%collapsible] ==== @@ -411,27 +542,35 @@ You must add the SSL certificates obtained from your ThoughtSpot instance to Tru == Documentation and code samples -.Where can I find more information about Visual Embed SDK? +.Where can I find more information about the Visual Embed SDK? [%collapsible] ==== To learn more about the SDK, see the following resources: + * xref:getting-started.adoc[Embed using Visual Embed SDK] in Developer Documentation * xref:VisualEmbedSdk.adoc[Visual Embed SDK Reference Guide] -* link:https://developers.thoughtspot.com/guides[Quick starts and tutorials, window=_blank] ==== -.Where can I find code samples for Visual Embed SDK? +.Where can I find code samples for the Visual Embed SDK? [%collapsible] ==== Check the following resources for code samples: + -* link:https://developers.thoughtspot.com/codespot[CodeSpot, window=_blank] -* xref:VisualEmbedSdk.adoc[Developer Documentation] -* link:https://github.com/thoughtspot/visual-embed-sdk[Visual Embed SDK GitHub repository, window=_blank] -* link:https://github.com/thoughtspot/ts_everywhere_resources[ThoughtSpot Embedded Resources on GitHub, window=_blank] -* link:https://developers.thoughtspot.com/guides[Visual Embed Tutorials, window=_blank] +* link:https://developers.thoughtspot.com/docs[Developer documentation] +* xref:VisualEmbedSdk.adoc[Visual Embed SDK documentation] * link:{{previewPrefix}}/playground/search[Visual Embed Playground, window=_blank] +* xref:spottercode.adoc[SpotterCode] for code samples and scaffolding boilerplate code for embedding. +* link:https://github.com/thoughtspot/developer-examples/tree/main/visual-embed/spotter/spotter-agent-embed[Developer examples on GitHub, window=_blank] +==== + +.Where can I find resources for embedding Spotter? +[%collapsible] +==== +To learn more about embedding Spotter, refer to the following resources: + +* xref:embed-ai-analytics.adoc[Embed AI Search and Analytics] for an overview of Spotter versions and SDK components +* xref:embed-spotter.adoc[Embed Spotter experience] for information about embedding Spotter experience in your app +* xref:mcp-integration.adoc[ThoughtSpot Spotter MCP Server] for information about integrating Spotter using Spotter MCP server in your application or MCP client. ==== .Where can I find more information about ThoughtSpot REST APIs? diff --git a/modules/ROOT/pages/whats-new.adoc b/modules/ROOT/pages/whats-new.adoc index e196de200..dc99edbb4 100644 --- a/modules/ROOT/pages/whats-new.adoc +++ b/modules/ROOT/pages/whats-new.adoc @@ -95,6 +95,7 @@ For more information, see xref:developer-playground.adoc#spottercode-panel[Using [discrete] ==== Org isolation for per-org SAML and OIDC authentication ThoughtSpot now enforces strict org isolation when users authenticate through a per-org identity provider (IdP). When a per-org IdP sends SAML or OIDC group claims that reference Orgs outside its authorized scope, ThoughtSpot silently drops those claims and records them as security audit events. This prevents a rogue IdP administrator in one Org from using group assertions to gain unauthorized access to another Org. Manually-assigned existing Org memberships are unaffected. + --- [discrete] From 869d524baa4b724d56ae3524c11a0af100781145 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 7 Jul 2026 11:35:05 +0530 Subject: [PATCH 130/136] edits --- modules/ROOT/pages/deprecated-features.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/deprecated-features.adoc b/modules/ROOT/pages/deprecated-features.adoc index 048a7b72c..1828f4379 100644 --- a/modules/ROOT/pages/deprecated-features.adoc +++ b/modules/ROOT/pages/deprecated-features.adoc @@ -14,7 +14,7 @@ As ThoughtSpot applications evolve, some existing features will be deprecated an [options='header'] |===== |Feature|Impacted interface and release versions|Deprecation date |End of Support / removal from the product -a|xref:deprecated-features.adoc#liveboardDiscoverable[Make this Liveboard discoverable checkbox] +a|xref:deprecated-features.adoc#liveboardAnswerDiscoverable[Liveboard and answer discoverability] checkboxes a|ThoughtSpot Cloud 26.2.0.cl and later | February 2026 | August 2026 a|xref:deprecated-features.adoc#everynmins[Minute-level schedule frequency] |ThoughtSpot Cloud 26.8.0.cl and later | August 2026 | - @@ -92,8 +92,8 @@ a|xref:deprecated-features.adoc#_deprecated_parameter_in_rest_api_v2_0_authentic |===== [#liveboardDiscoverable] -== Make this Liveboard discoverable checkbox -The *Make this Liveboard discoverable* checkbox that appears in the Liveboard and Answer create, save, and share object UI workflows is deprecated and will be removed in ThoughtSpot Cloud 26.8.0.cl. +== Liveboard and answer discoverability +The **Make this Liveboard discoverable** and **Make this answer discoverable** checkboxes that appear in the Liveboard and Answer create and share workflows are deprecated and will be removed in ThoughtSpot Cloud 26.8.0.cl. Impact on your instance:: When this feature is removed from the UI, your application users will no longer be able to find the objects that are marked as discoverable in the object search results. Object visibility and discoverability will be determined solely by explicit view, edit, or other owner-granted permissions. From 2727b21cefc933612f0ddf4e1dc46ac3dc9f43f7 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 7 Jul 2026 11:38:33 +0530 Subject: [PATCH 131/136] edits --- modules/ROOT/pages/deprecated-features.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/deprecated-features.adoc b/modules/ROOT/pages/deprecated-features.adoc index 1828f4379..d90d833e3 100644 --- a/modules/ROOT/pages/deprecated-features.adoc +++ b/modules/ROOT/pages/deprecated-features.adoc @@ -14,7 +14,7 @@ As ThoughtSpot applications evolve, some existing features will be deprecated an [options='header'] |===== |Feature|Impacted interface and release versions|Deprecation date |End of Support / removal from the product -a|xref:deprecated-features.adoc#liveboardAnswerDiscoverable[Liveboard and answer discoverability] checkboxes +a|xref:deprecated-features.adoc#liveboardAnswerDiscoverable[Liveboard and answer discoverability] a|ThoughtSpot Cloud 26.2.0.cl and later | February 2026 | August 2026 a|xref:deprecated-features.adoc#everynmins[Minute-level schedule frequency] |ThoughtSpot Cloud 26.8.0.cl and later | August 2026 | - From 48000d837254e1f9f58e6a11476b7880e2519b77 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 7 Jul 2026 11:50:24 +0530 Subject: [PATCH 132/136] versio update --- src/configs/doc-configs.js | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/configs/doc-configs.js b/src/configs/doc-configs.js index ff8f6c417..ecbac0e4b 100644 --- a/src/configs/doc-configs.js +++ b/src/configs/doc-configs.js @@ -53,6 +53,43 @@ module.exports = { subLabel: 'Cloud (Latest)', iframeUrl: 'https://developer-docs-26-7-0-cl.vercel.app/docs/', }, + { + label: '26.6.0.cl', + link: ' ', + subLabel: 'Cloud', + iframeUrl: 'https://developer-docs-26-6-0-cl.vercel.app/docs/', + }, + { + label: '26.5.0.cl', + link: '26.5.0.cl', + subLabel: 'Cloud', + iframeUrl: 'https://developer-docs-26-5-0-cl.vercel.app/docs/', + }, + { + label: '26.4.0.cl', + link: '26.4.0.cl', + subLabel: 'Cloud', + iframeUrl: 'https://developer-docs-26-4-0-cl.vercel.app/docs/', + }, + { + label: '26.3.0.sw', + link: '26.3.0.sw', + subLabel: 'Software (Latest)', + iframeUrl: 'https://visual-embed-sdk-26-3.vercel.app/docs/', + }, + + { + label: '10.10.0.sw', + link: '10.10.0.sw', + subLabel: 'Software', + iframeUrl: 'https://visual-embed-sdk-10-10.vercel.app/docs/', + }, + { + label: '10.1.0.sw', + link: '10.1.0.sw', + subLabel: 'Software', + iframeUrl: 'https://visual-embed-sdk-10-1.vercel.app/docs/', + }, ], CUSTOM_PAGE_ID: { API_PLAYGROUND: 'restV2-playground', From fcbd292bb4e36e8dba02023aa1878385cd9af011 Mon Sep 17 00:00:00 2001 From: ShashiSubramanya Date: Tue, 7 Jul 2026 15:21:04 +0530 Subject: [PATCH 133/136] nav and style updates for standalone and in-product presentation and responsive layout --- modules/ROOT/pages/common/nav-embedding.adoc | 6 +- .../pages/common/nav-in-product-help.adoc | 308 ++++++++++++++++++ modules/ROOT/pages/common/nav-rest-api.adoc | 60 +--- modules/ROOT/pages/common/nav.adoc | 6 +- src/components/DevDocTemplate/index.tsx | 54 ++- src/components/LeftSidebar/NavContent.tsx | 14 + src/components/LeftSidebar/index.scss | 44 +++ src/components/SecondaryHeader/index.scss | 4 +- src/components/SecondaryHeader/index.tsx | 28 +- 9 files changed, 454 insertions(+), 70 deletions(-) create mode 100644 modules/ROOT/pages/common/nav-in-product-help.adoc diff --git a/modules/ROOT/pages/common/nav-embedding.adoc b/modules/ROOT/pages/common/nav-embedding.adoc index 004467551..4f5f8a246 100644 --- a/modules/ROOT/pages/common/nav-embedding.adoc +++ b/modules/ROOT/pages/common/nav-embedding.adoc @@ -173,10 +173,6 @@ include::generated/typedoc/CustomSideNav.adoc[] [.sidebar-title] Additional resources -* link:{{navprefix}}/embed-ts[About ThoughtSpot embedding] -* link:{{navprefix}}/get-started-tse[Embed licenses] -* link:{{navprefix}}/license-feature-matrix[Feature matrix] * link:{{navprefix}}/faqs[FAQs] -* link:{{navprefix}}/code-samples[Code samples] * link:https://codesandbox.io/s/big-tse-react-demo-i4g9xi[React CodeSandbox, window=_blank] -* link:https://codesandbox.io/s/graphqlcookieembed-wf4fk9?file=/src/App.js:418-426[GraphQL CodeSandbox, window=_blank] +* link:https://github.com/thoughtspot/developer-examples[Developer examples, window=_blank] diff --git a/modules/ROOT/pages/common/nav-in-product-help.adoc b/modules/ROOT/pages/common/nav-in-product-help.adoc new file mode 100644 index 000000000..cf7312ff9 --- /dev/null +++ b/modules/ROOT/pages/common/nav-in-product-help.adoc @@ -0,0 +1,308 @@ + +:page-pageid: nav-in-product-help +:page-description: In-product navigation + +[navSection] + +[.sidebar-title] +Release notes and changelogs + +* link:{{navprefix}}/whats-new[What's new] +* Changelog +** link:{{navprefix}}/embed-sdk-changelog[Visual Embed SDK changelog] +** link:{{navprefix}}/mobile-sdk-changelog[Mobile Embed SDK changelog] +** link:{{navprefix}}/rest-v2-changelog[REST API v2 changelog] +* link:{{navprefix}}/deprecated-features[Deprecation announcements] + +[.sidebar-title] +Live Playgrounds + +* +++Visual Embed Playground+++ +** link:{{navprefix}}/dev-playground[How to use] +* link:{{navprefix}}/restV2-playground?apiResourceId=http%2Fgetting-started%2Fintroduction[REST API v2 Playground] +** link:{{navprefix}}/rest-playground[How to use] +* +++Theme Builder+++ +** link:{{navprefix}}/theme-builder-doc[How to use] + +[.sidebar-title] +Embed ThoughtSpot in a web app + +* link:{{navprefix}}/getting-started[Embed with Visual Embed SDK] +* link:{{navprefix}}/tsembed[Quickstart guide] +* link:{{navprefix}}/embed-ai-search-analytics[Embed AI Search and Analytics] +** link:{{navprefix}}/embed-spotter[Embed Spotter experience] +** link:{{navprefix}}/embed-spotter-agent[Embed Spotter Agent] +* link:{{navprefix}}/embed-liveboard[Embed Analytics] +** link:{{navprefix}}/embed-liveboard[Embed a Liveboard] +** link:{{navprefix}}/spotterViz-agent[SpotterViz AI agent in Liveboards] +** link:{{navprefix}}/embed-a-viz[Embed a visualization] +* link:{{navprefix}}/full-embed[Embed full application] +** link:{{navprefix}}/full-app-customize[Customize your embed] +** link:{{navprefix}}/customize-nav-controls[Customize navigation panels] +** link:{{navprefix}}/set-default-page[Customize default page and navigation path] +** link:{{navprefix}}/customize-homepage-experience[Customize home page experience] +* Embed token-based Search +** link:{{navprefix}}/search-embed[Embed Search] +** link:{{navprefix}}/embed-searchbar[Embed search bar] +** link:{{navprefix}}/visualization-overrides[Visualization overrides] +* link:{{navprefix}}/react-app-embed[Embed with React components] + +[.sidebar-title] +Embed ThoughtSpot in a mobile app + +* link:{{navprefix}}/mobile-embed[Overview] +* link:{{navprefix}}/embed-ts-mobile-react-native[React Native SDK] +* link:{{navprefix}}/embed-ts-flutter[Flutter embed SDK] +* link:{{navprefix}}/embed-ts-swift[Swift Embed SDK] +* link:{{navprefix}}/embed-ts-android[Android Embed SDK] + +[.sidebar-title] +Embed without SDK + +** link:{{navprefix}}/embed-without-sdk[Embed without SDK] +** link:{{navprefix}}/custom-viz-rest-api[Create a custom visualization] + +[.sidebar-title] +Authentication and data security + +* link:{{navprefix}}/embed-auth[Authentication] +** link:{{navprefix}}/trusted-auth[Trusted authentication] +*** link:{{navprefix}}/trusted-auth-secret-key[Secret key management] +*** link:{{navprefix}}/trusted-auth-sdk[Front-end trusted authentication integration] +*** link:{{navprefix}}/trusted-auth-token-request-service[Token request service] +*** link:{{navprefix}}/trusted-auth-troubleshoot[Troubleshoot trusted authentication] +** link:{{navprefix}}/saml-sso[SAML SSO authentication] +** link:{{navprefix}}/oidc-auth[OpenID Connect authentication] +** link:{{navprefix}}/just-in-time-provisioning[Just-in-time provisioning] +* link:{{navprefix}}/security-settings[Security settings] + +* link:{{navprefix}}/embed-object-access[Authorization] +** link:{{navprefix}}/access-control-sharing[Access control and sharing] +** link:{{navprefix}}/privileges-and-roles[Privileges and Roles] +** link:{{navprefix}}/data-security[Data security] +*** link:{{navprefix}}/rls-rules[RLS Rules] +*** link:{{navprefix}}/abac-via-rls-variables[ABAC via RLS with variables] +*** link:{{navprefix}}/jwt-abac-migration-guide[ABAC JWT migration guide] +**** link:{{navprefix}}/jwt-filter-parameters-rules-migration-guide[JWT ABAC with filter rules -> ABAC via RLS] +**** link:{{navprefix}}/jwt-abac-beta-migration-guide[JWT ABAC beta implementation -> ABAC via RLS] +*** link:{{navprefix}}/abac-user-parameters[ABAC via JWT with filter rules and parameters] +* link:{{navprefix}}/selective-user-access[User access] +* link:{{navprefix}}/troubleshoot-errors[Troubleshoot errors] + +[.sidebar-title] +Customize and integrate + +* link:{{navprefix}}/style-customization[Customize UI layout and styles] +** link:{{navprefix}}/customize-style[Customize basic styles] +** link:{{navprefix}}/custom-css[CSS customization framework] +** link:{{navprefix}}/theme-builder-doc[Theme builder] +** link:{{navprefix}}/customize-icons[Customize icons] +** link:{{navprefix}}/customize-text[Customize text strings] +** link:{{navprefix}}/css-variables-reference[CSS variables reference] + +* link:{{navprefix}}/filters-overview[Filters types and application layers] +** link:{{navprefix}}/runtime-overrides[Runtime overrides] +** link:{{navprefix}}/runtime-filters[Runtime filters] +** link:{{navprefix}}/runtime-params[Runtime Parameters] +* link:{{navprefix}}/action-config[Customize menus] +** link:{{navprefix}}/actions[Action IDs in the SDK] +* link:{{navprefix}}/events-app-integration[Events and app interactions] +** link:{{navprefix}}/embed-events[Using embed events] +** link:{{navprefix}}/host-events[Using host events] +** link:{{navprefix}}/context-aware-event-routing[Context-based execution of host events] +** link:{{navprefix}}/hostEventsV2-migration[Migrating from Host Event v1 to Host Events v2 framework] +** link:{{navprefix}}/handling-embed-errors[Handling embed errors] +** link:{{navprefix}}/api-search-intercept[API intercept and data fetch requests] + +* link:{{navprefix}}/custom-action-intro[Custom actions] +** link:{{navprefix}}/customize-actions[Custom actions through the UI] +*** link:{{navprefix}}/custom-action-url[URL actions] +*** link:{{navprefix}}/custom-action-callback[Callback actions] +*** link:{{navprefix}}/edit-custom-action[Set the position of a custom action] +*** link:{{navprefix}}/add-action-viz[Add a local action to a visualization] +*** link:{{navprefix}}/add-action-worksheet[Add a local action to a model] +** link:{{navprefix}}/code-based-custom-action[Code based custom actions] +** link:{{navprefix}}/custom-action-payload[Callback response payload] + +* link:{{navprefix}}/customize-links[Customize links] +* link:{{navprefix}}/set-locale[Customize locale] +* link:{{navprefix}}/custom-domain-config[Custom domain configuration] +* link:{{navprefix}}/customize-emails[Customize onboarding settings] +* link:{{navprefix}}/customize-email-apis[Customize email template] +* link:{{navprefix}}/in-app-navigation[Create dynamic menus and navigation] +* link:{{navprefix}}/best-practices[Performance optimization] +** link:{{navprefix}}/best-practices[Best practices] +** link:{{navprefix}}/prerender[Prerender components] +** link:{{navprefix}}/lazy-load-fullHeight[Full height and lazy loading options] +** link:{{navprefix}}/prefetch[Prefetch static resources] +* link:{{navprefix}}/troubleshoot-errors[Troubleshoot errors] + +[.sidebar-title] +Visual Embed SDK reference guide + +* link:{{navprefix}}/VisualEmbedSdk[Visual Embed SDK Reference] +include::generated/typedoc/CustomSideNav.adoc[] +** Custom styles +*** [.typedoc-Interface]#link:{{navprefix}}/Interface_CustomStyles[CustomStyles]# +*** [.typedoc-Interface]#link:{{navprefix}}/Interface_CustomisationsInterface[CustomisationsInterface]# +*** [.typedoc-Interface]#link:{{navprefix}}/Interface_customCssInterface[customCssInterface]# +*** [.typedoc-Interface]#link:{{navprefix}}/Interface_CustomCssVariables[customCssVariables]# +** Runtime filters +*** [.typedoc-Interface]#link:{{navprefix}}/Interface_RuntimeFilter[RuntimeFilter]# +*** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_RuntimeFilterOp[RuntimeFilterOp]# +** Others +*** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_Action[Action]# +*** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_ContextMenuTriggerOptions[ContextMenuTriggerOptions]# +*** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_DataSourceVisualMode[DataSourceVisualMode]# +*** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_Page[Page]# +*** [.typedoc-Enumeration]#link:{{navprefix}}/Enumeration_PrefetchFeatures[PrefetchFeatures]# +*** [.typedoc-Function]#link:{{navprefix}}/Function_executeTML[executeTML]# +*** [.typedoc-Function]#link:{{navprefix}}/Function_exportTML[exportTML]# + + +[.sidebar-title] +Multi-tenancy + +* link:{{navprefix}}/multi-tenancy[Overview] +* link:{{navprefix}}/orgs[Multi-tenancy with Orgs] +** link:{{navprefix}}/orgs-api-op[Org administration] +** link:{{navprefix}}/multitenancy-within-an-org[Multi-tenancy within an Org] +** link:{{navprefix}}/single-tenant-data-models[Single-tenant data models with Orgs] +* link:{{navprefix}}/tse-cluster[Cluster maintenance and upgrade] + +[.sidebar-title] +Webhooks + +* link:{{navprefix}}/webhooks-overview[Overview] +* link:{{navprefix}}/webhooks-ui[Webhooks UI] +* link:{{navprefix}}/webhooks-comm-channel[Webhook communication channels] +* link:{{navprefix}}/webhooks-lb-schedule[Webhook connection for Liveboard scheduled events] +* link:{{navprefix}}/webhooks-s3-integration[AWS S3 storage integration for webhook delivery] +* link:{{navprefix}}/webhooks-gcs-storage[GCS storage integration for webhook delivery] +* link:{{navprefix}}/webhooks-lb-payload[Webhook response payload] +* link:{{navprefix}}/webhooks-kpi[Webhook connection for KPI alerts] + +[.sidebar-title] +Integration with external tools + +** link:{{navprefix}}/external-tool-script-integration[External tools and scripts] +** link:{{navprefix}}/pendo-integration[Pendo integration with embed] +** link:{{navprefix}}/sf-integration[Integration with Salesforce] +** link:{{navprefix}}/vercel-integration[Vercel integration] + +[.sidebar-title] +Build and deploy + +** link:{{navprefix}}/thoughtspot-objects[ThoughtSpot objects] +** link:{{navprefix}}/timezone-aware-filtering[Timezone-aware keywords and filters] +** link:{{navprefix}}/variables[Variables] +** link:{{navprefix}}/parameterize-metadata[Parameterize metadata] +* link:{{navprefix}}/development-and-deployment[Development and deployment] +** link:{{navprefix}}/deploy-with-tml-apis[Deploy with TML APIs] +*** link:{{navprefix}}/git-provider-integration[Git provider integration] +*** link:{{navprefix}}/modify-tml[TML modification] +* link:{{navprefix}}/publish-data-overview[Publish content to Orgs] +** link:{{navprefix}}/publish-to-orgs[Publish objects to Orgs] +* link:{{navprefix}}/git-integration[Deploy with GitHub APIs (legacy)] +** link:{{navprefix}}/git-configuration[Configure GitHub integration] +** link:{{navprefix}}/git-api[GitHub REST APIs] +** link:{{navprefix}}/guid-mapping[GUID mapping] + +[.sidebar-title] +REST APIs + +* link:{{navprefix}}/rest-apis[Overview] +* link:{{navprefix}}/rest-apiv2-getstarted[Get started] +* link:{{navprefix}}/api-authv2[REST API v2.0 authentication] +* link:{{navprefix}}/rest-apiv2-reference[REST API v2.0 Reference] +** link:{{navprefix}}/api-user-management[Users and group privileges] +** link:{{navprefix}}/rbac[Role-based access control] +** link:{{navprefix}}/rest-apiv2-search[Search API endpoints] +*** link:{{navprefix}}/rest-apiv2-users-search[Search users] +*** link:{{navprefix}}/rest-apiv2-groups-search[Search groups] +*** link:{{navprefix}}/rest-apiv2-metadata-search[Search metadata] +** link:{{navprefix}}/fetch-data-and-report-apis[Data and Report APIs] +** link:{{navprefix}}/spotter-api[Spotter APIs] +*** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] +*** link:{{navprefix}}/spotter-agent-instructions[Spotter AI agent instructions] +*** link:{{navprefix}}/spotter-agent-conversation-mgmt-apis[APIs for managing saved conversations] +*** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] +*** link:{{navprefix}}/spotter-nl-instructions[Data model instructions APIs ^BETA^] +** link:{{navprefix}}/style-customization-apis[Style customization APIs] +** link:{{navprefix}}/audit-logs[Audit logs] +** link:{{navprefix}}/tml[TML] +** link:{{navprefix}}/collections[Collections ^BETA^] +** link:{{navprefix}}/connections[Connections] +** link:{{navprefix}}/connection-config[Connection configuration] +** link:{{navprefix}}/runtime-sort[Runtime sorting] +* link:{{navprefix}}/manual-translation-api[Manual translations] +* link:{{navprefix}}/webhooks-rest-api[Webhook APIs] + +[.sidebar-title] +REST API SDK + +* link:{{navprefix}}/rest-api-sdk[Overview] +* link:{{navprefix}}/rest-api-sdk-typescript[TypeScript SDK] +* link:{{navprefix}}/rest-api-sdk-java[Java SDK] +* link:{{navprefix}}/rest-apiv2-js[REST API v2.0 in JavaScript] + +[.sidebar-title] +REST API v1 (DEPRECATED) + +* link:{{navprefix}}/rest-api-getstarted[Get started] +* link:{{navprefix}}/api-auth-session[REST API v1 authentication] +* link:{{navprefix}}/catalog-and-audit[Catalog and audit content] +* link:{{navprefix}}/rest-api-pagination[Paginate API response] +* link:{{navprefix}}/rest-api-reference[REST API v1 Reference] +* link:{{navprefix}}/rest-v1-changelog[REST API v1 changelog] +* link:{{navprefix}}/v1v2-comparison[REST v1 and v2.0 comparison] + + +[.sidebar-title] +SpotterCode + +* link:{{navprefix}}/SpotterCode[SpotterCode for IDEs] +* link:{{navprefix}}/integrate-SpotterCode[Integrating SpotterCode] +* link:{{navprefix}}/spottercode-prompting-guide[SpotterCode prompting guide] + +[.sidebar-title] +Tutorials + +* link:{{navprefix}}/tutorials/tutorials-overview[Embedding tutorials] +** link:{{navprefix}}/tutorials/tse-fundamentals/intro[Embedding Fundamentals] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-01[01 - Overview] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-02[02 - Set up for course] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-03[03 - Security setup] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-04[04 - Start coding] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-05[05 - Embed Search] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-06[06 - Embed Natural Language Search] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-07[07 - Embed Liveboard] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-08[08 - Embed Visualization] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-09[09 - Embed full application] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-10[10 - Style embedded app] +*** link:{{navprefix}}/tutorials/tse-fundamentals/lesson-11[11 - Course summary] +*** link:{{navprefix}}/tutorials/style-customization/tutorial[Style customization] +** link:{{navprefix}}/tutorials/react-components/intro[React components] +*** link:{{navprefix}}/tutorials/react-components/lesson-01[01 - Initialize Visual Embed SDK] +*** link:{{navprefix}}/tutorials/react-components/lesson-02[02 - ThoughtSpot component pages] +*** link:{{navprefix}}/tutorials/react-components/lesson-03[03 - Menus and navigation elements] +*** link:{{navprefix}}/tutorials/react-components/lesson-04[04 - Event handling] +** link:{{navprefix}}/tutorials/spotter/integrate-into-chatbot[Integrate Spotter into your Chatbot] + +* link:{{navprefix}}/tutorials/rest-api/intro[REST API Tutorials] +** link:{{navprefix}}/tutorials/rest-api/lesson-01[01 - REST API overview] +** link:{{navprefix}}/tutorials/rest-api/lesson-02[02 - Simple Python implementation] +** link:{{navprefix}}/tutorials/rest-api/lesson-03[03 - Complex REST API workflows] + + +[.sidebar-title] +Additional resources + +* link:{{navprefix}}/embed-ts[About ThoughtSpot embedding] +* link:{{navprefix}}/faqs[FAQs] +* link:https://codesandbox.io/s/big-tse-react-demo-i4g9xi[React CodeSandbox, window=_blank] +* link:https://community.thoughtspot.com/customers/s/[Community, window=_blank] +* link:https://training.thoughtspot.com/page/developer[Training resources, window=_blank] +* link:https://docs.thoughtspot.com[Product Documentation, window=_blank] +* link:https://github.com/thoughtspot/developer-examples[Developer examples, window=_blank] + diff --git a/modules/ROOT/pages/common/nav-rest-api.adoc b/modules/ROOT/pages/common/nav-rest-api.adoc index 04378ff93..faa813ba1 100644 --- a/modules/ROOT/pages/common/nav-rest-api.adoc +++ b/modules/ROOT/pages/common/nav-rest-api.adoc @@ -22,8 +22,10 @@ REST APIs ** link:{{navprefix}}/fetch-data-and-report-apis[Data and Report APIs] ** link:{{navprefix}}/spotter-api[Spotter APIs] *** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] -*** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] -*** link:{{navprefix}}/spotter-coaching-apis[Spotter coaching APIs ^BETA^] +*** link:{{navprefix}}/spotter-agent-instructions[Spotter AI agent instructions] +*** link:{{navprefix}}/spotter-agent-conversation-mgmt-apis[APIs for managing saved conversations] +** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] +** link:{{navprefix}}/spotter-nl-instructions[Data model instructions APIs ^BETA^] ** link:{{navprefix}}/style-customization-apis[Style customization APIs] ** link:{{navprefix}}/audit-logs[Audit logs] ** link:{{navprefix}}/tml[TML] @@ -31,28 +33,8 @@ REST APIs ** link:{{navprefix}}/connections[Connections] ** link:{{navprefix}}/connection-config[Connection configuration] ** link:{{navprefix}}/runtime-sort[Runtime sorting] -* link:{{navprefix}}/api-user-management[Users and group privileges] -* link:{{navprefix}}/rbac[Role-based access control] -* link:{{navprefix}}/rest-apiv2-search[Search API endpoints] -** link:{{navprefix}}/rest-apiv2-users-search[Search users] -** link:{{navprefix}}/rest-apiv2-groups-search[Search groups] -** link:{{navprefix}}/rest-apiv2-metadata-search[Search metadata] -* link:{{navprefix}}/fetch-data-and-report-apis[Data and Report APIs] -* link:{{navprefix}}/spotter-api[Spotter APIs] -** link:{{navprefix}}/spotter-agent-apis[AI APIs (Spotter Agent and Spotter 3)] -** link:{{navprefix}}/spotter-agent-instructions[Spotter AI agent instructions] -** link:{{navprefix}}/spotter-agent-conversation-mgmt-apis[APIs for managing saved conversations] -** link:{{navprefix}}/spotter-apis-classic[AI APIs (Spotter Classic) ^BETA^] -** link:{{navprefix}}/spotter-nl-instructions[Spotter instructions APIs ^BETA^] -** link:{{navprefix}}/spotter-agent-instructions[Spotter instructions APIs ^BETA^] -* link:{{navprefix}}/audit-logs[Audit logs] -* link:{{navprefix}}/tml[TML] -* link:{{navprefix}}/collections[Collections ^BETA^] -* link:{{navprefix}}/connections[Connections] -* link:{{navprefix}}/connection-config[Connection configuration] -* link:{{navprefix}}/runtime-sort[Runtime sorting] -* link:{{navprefix}}/manual-translation-api[Manual translations] -* link:{{navprefix}}/webhooks-rest-api[Webhook APIs] +** link:{{navprefix}}/manual-translation-api[Manual translations] +** link:{{navprefix}}/webhooks-rest-api[Webhook APIs] [.sidebar-title] @@ -79,28 +61,14 @@ REST API v1 (DEPRECATED) * link:{{navprefix}}/catalog-and-audit[Catalog and audit content] * link:{{navprefix}}/rest-api-pagination[Paginate API response] * link:{{navprefix}}/rest-api-reference[REST API v1 Reference] -** link:{{navprefix}}/orgs-api[Orgs API] -** link:{{navprefix}}/user-api[User API] -** link:{{navprefix}}/group-api[Group API] -** link:{{navprefix}}/role-api[Role API] -** link:{{navprefix}}/session-api[Session API] -** link:{{navprefix}}/connections-api[Data connection API] -** link:{{navprefix}}/metadata-api[Metadata API] -** link:{{navprefix}}/admin-api[Admin API] -** link:{{navprefix}}/tml-api[TML API] -** link:{{navprefix}}/dependent-objects-api[Dependent objects API] -** link:{{navprefix}}/search-data-api[Search data API] -** link:{{navprefix}}/liveboard-data-api[Liveboard data API] -** link:{{navprefix}}/liveboard-export-api[Liveboard export API] -** link:{{navprefix}}/security-api[Security API] -** link:{{navprefix}}/logs-api[Audit logs API] -** link:{{navprefix}}/materialization-api[Materialization API] -** link:{{navprefix}}/database-api[Database API] -** link:{{navprefix}}/rest-v1-changelog[REST API v1 changelog] -** link:{{navprefix}}/v1v2-comparison[REST v1 and v2.0 comparison] - - -//** link:{{navprefix}}/graphql-guide[GraphQL API ^Beta^] +* link:{{navprefix}}/rest-v1-changelog[REST API v1 changelog] +* link:{{navprefix}}/v1v2-comparison[REST v1 and v2.0 comparison] + +[.sidebar-title] +Additional resources + +* link:{{navprefix}}/faqs[FAQs] +* link:https://github.com/thoughtspot/developer-examples[Developer examples, window=_blank] diff --git a/modules/ROOT/pages/common/nav.adoc b/modules/ROOT/pages/common/nav.adoc index a848131e2..141aada68 100644 --- a/modules/ROOT/pages/common/nav.adoc +++ b/modules/ROOT/pages/common/nav.adoc @@ -100,11 +100,7 @@ Additional resources * link:{{navprefix}}/faqs[FAQs] * link:https://codesandbox.io/s/big-tse-react-demo-i4g9xi[React CodeSandbox, window=_blank] -//** link:https://codesandbox.io/s/graphqlcookieembed-wf4fk9?file=/src/App.js:418-426[GraphQL CodeSandbox, window=_blank] - * link:https://community.thoughtspot.com/customers/s/[Community, window=_blank] * link:https://training.thoughtspot.com/page/developer[Training resources, window=_blank] * link:https://docs.thoughtspot.com[Product Documentation, window=_blank] -* link:https://developers.thoughtspot.com[ThoughtSpot Developers, window=_blank] -* Deprecated feature docs -** link:{{navprefix}}/abac-user-parameters-beta[ABAC via tokens (pre-10.4.0.cl) (Deprecated)] +* link:https://github.com/thoughtspot/developer-examples[Developer examples, window=_blank] diff --git a/src/components/DevDocTemplate/index.tsx b/src/components/DevDocTemplate/index.tsx index bb83b7d80..4b0ac293c 100644 --- a/src/components/DevDocTemplate/index.tsx +++ b/src/components/DevDocTemplate/index.tsx @@ -53,6 +53,10 @@ import t from '../../utils/lang-utils'; import { getHTMLFromComponent } from '../../utils/react-utils'; import VersionIframe from '../VersionIframe'; +// Key of the merged nav-in-product-help.adoc entry in processedNavMap (pageid minus 'nav-' prefix). +// Not a real DocCategory/tab — used only to pick the left sidebar content when embedded in-product. +const IN_PRODUCT_NAV_KEY = 'in-product-help'; + const DevDocTemplate: FC = (props) => { const { data, @@ -127,21 +131,28 @@ const DevDocTemplate: FC = (props) => { []); // Breadcrumb data built from master nav + all category navs for full coverage + // (excludes the merged in-product nav, which duplicates the category navs) const breadcrumsData = React.useMemo(() => { if (typeof window === 'undefined') return []; const allHtmls = [ initialNavContentData, - ...Object.values(processedNavMap as Record), + ...Object.entries(processedNavMap as Record) + .filter(([cat]) => cat !== IN_PRODUCT_NAV_KEY) + .map(([, html]) => html), ]; return allHtmls.flatMap((html) => fetchChild(html)); }, [processedNavMap]); - // Pick the right sidebar content for the active category + // Pick the right sidebar content for the active category. + // In-product (embedded) presentation has no category tabs — always show the merged nav. const activeNavContent = React.useMemo(() => { + if (!isPublicSiteOpen) { + return processedNavMap[IN_PRODUCT_NAV_KEY] || navContent; + } const navId = CATEGORY_NAV_ID[activeCategory]; const mapKey = navId.startsWith('nav-') ? navId.slice(4) : null; return (mapKey && processedNavMap[mapKey]) || navContent; - }, [activeCategory, processedNavMap, navContent]); + }, [activeCategory, processedNavMap, navContent, isPublicSiteOpen]); const isCustomPage = _.values(CUSTOM_PAGE_ID).some( (pageId: string) => pageId === params[TS_PAGE_ID_PARAM], @@ -171,11 +182,13 @@ const isVersionedIframe = VERSION_DROPDOWN.some( const isAskDocsPage = params[TS_PAGE_ID_PARAM] === CUSTOM_PAGE_ID.ASK_DOCS; /* Build pageId → category map by parsing hrefs from each category's nav HTML. - * This means writers only need to update nav-*.adoc — no TypeScript changes needed. */ + * This means writers only need to update nav-*.adoc — no TypeScript changes needed. + * Excludes the merged in-product nav, which isn't a real tab/category. */ const pageIdToCategoryMap = React.useMemo(() => { if (typeof window === 'undefined') return {}; const map: Record = {}; Object.entries(processedNavMap).forEach(([cat, html]) => { + if (cat === IN_PRODUCT_NAV_KEY) return; const doc = new DOMParser().parseFromString(html as string, 'text/html'); doc.querySelectorAll('a[href]').forEach((a) => { const href = a.getAttribute('href') || ''; @@ -723,13 +736,28 @@ if (isVersionedIframe) { } > {!isIframeMode && !isVersionedIframe && ( - + isPublicSiteOpen ? ( + + ) : !isMaxMobileResolution && ( + // In-product presentation has no tabs — show just the nav + // toggle so the sidebar stays reachable on narrow viewports. + // Desktop-width embeds skip this entirely; the sidebar is + // always visible there. + + ) )}
diff --git a/src/components/LeftSidebar/NavContent.tsx b/src/components/LeftSidebar/NavContent.tsx index 7629d9022..f4fa1ea97 100644 --- a/src/components/LeftSidebar/NavContent.tsx +++ b/src/components/LeftSidebar/NavContent.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { navigate } from 'gatsby'; import { IconContext } from '@react-icons/all-files'; import { BiSearch } from '@react-icons/all-files/bi/BiSearch'; import BackButton from '../BackButton'; @@ -50,6 +51,19 @@ const NavContent = (props: { + {/* AskDocs lives in the top SecondaryHeader on the standalone site; + that bar is hidden in-product, so surface it here instead. */} + {!props.isPublicSiteOpen && ( +
+ +
+ )}