@dbx-tools/genie 0.9.129 → 0.9.132

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,31 +1,35 @@
1
1
  # @dbx-tools/genie
2
2
 
3
- Server-side Databricks Genie chat drivers.
3
+ Run Databricks Genie turns from Node or AppKit code as raw message snapshots or
4
+ a typed event stream. AppKit requests keep their on-behalf-of-user (OBO)
5
+ identity, standalone callers use the Databricks SDK authentication chain, and
6
+ both modes support cancellation.
4
7
 
5
- Run a Genie turn from Node or AppKit code and consume raw message snapshots or a
6
- typed event stream. AppKit requests keep their OBO identity; standalone callers
7
- use the Databricks SDK authentication chain. Both modes support cancellation.
8
-
9
- ## Quick Start
8
+ ## Quick start
10
9
 
11
10
  ```ts
12
11
  import { chat } from "@dbx-tools/genie";
13
12
 
13
+ const spaceId = process.env.DATABRICKS_GENIE_SPACE_ID!;
14
+
14
15
  for await (const event of chat.genieEventChat(spaceId, "Top stores by revenue?")) {
15
16
  console.log(event.type, event);
16
17
  }
17
18
  ```
18
19
 
19
20
  Pure Genie schemas and event detector helpers live in
20
- [`@dbx-tools/shared-genie`](../../shared/genie).
21
+ [@dbx-tools/shared-genie](../../shared/genie).
21
22
 
22
- Key features:
23
+ The driver:
23
24
 
24
25
  - Streams the Genie Agent Mode API by default, including reasoning, SQL calls,
25
26
  query output, and the synthesized answer.
26
27
  - Starts new Genie conversations or continues an existing `conversationId`.
27
28
  - Projects Agent Mode response items onto the existing `GenieMessage` snapshot
28
- and semantic-event contracts.
29
+ and semantic-event contracts, including statement ids and visualization
30
+ attachments.
31
+ - Loads Agent Mode conversation items and groups them back into one
32
+ `GenieMessage` per turn for history replay.
29
33
  - Retains the Conversation API polling driver behind `agentMode: false` and as
30
34
  an automatic pre-stream fallback for `FEATURE_DISABLED` or preview-toggle
31
35
  errors.
@@ -37,15 +41,17 @@ Key features:
37
41
  CLI tools.
38
42
  - Fetches Genie space metadata and starter questions for UI suggestions.
39
43
 
40
- ## Choose The Driver Or AppKit Genie
44
+ ## Choose Genie integration
41
45
 
42
- Native AppKit's Genie plugin is the right choice for a standalone Genie chat
43
- experience: it provides named space aliases, SSE status updates, conversation
46
+ Use native AppKit's Genie plugin for a standalone Genie chat experience. It
47
+ provides named space aliases, SSE status updates, conversation
44
48
  history replay, query result fetching, OBO execution, and the AppKit UI
45
49
  `GenieChat` component.
46
50
 
47
- Use this package when Genie is one capability inside a larger agent or custom
48
- backend:
51
+ Use direct Genie when one Genie space owns the conversation and answer. Use
52
+ [@dbx-tools/appkit-mastra](../appkit-mastra) when a supervising agent must
53
+ combine Genie with other tools, Mastra memory, approvals, or workflows. Use
54
+ this package directly when custom backend code needs the lower-level stream:
49
55
 
50
56
  - You want a low-level async iterator rather than an AppKit HTTP route.
51
57
  - You want raw message snapshots or a normalized event stream that can be fed
@@ -57,7 +63,7 @@ backend:
57
63
  - You need the same driver to work inside AppKit with OBO auth and outside
58
64
  AppKit from scripts using normal Databricks SDK auth.
59
65
 
60
- ## Handle Semantic Events
66
+ ## Handle semantic events
61
67
 
62
68
  ```ts
63
69
  import { chat } from "@dbx-tools/genie";
@@ -82,10 +88,10 @@ for await (const event of chat.genieEventChat(spaceId, "Top stores by revenue?")
82
88
 
83
89
  `chat.genieEventChat()` wraps the lower-level snapshot stream and yields a
84
90
  `GenieChatEvent` union. Use it for SSE streams, log pipelines, and tool writer
85
- events where consumers care about progress and SQL, not just the terminal
91
+ events where consumers care about progress and SQL rather than only the terminal
86
92
  message.
87
93
 
88
- ## Stream Raw Message Snapshots
94
+ ## Stream raw message snapshots
89
95
 
90
96
  ```ts
91
97
  import { chat } from "@dbx-tools/genie";
@@ -100,10 +106,11 @@ conversation, projects SSE output into `GenieMessage` snapshots, filters
100
106
  identical consecutive payloads, and stops after a terminal response. Set
101
107
  `agentMode: false` to force the Conversation API start/create/get-message
102
108
  polling flow. Use it when you want to run your own diffing or persist the
103
- normalized wire shape. Agent Mode returns query output inline as Markdown; use
104
- polling when a consumer specifically requires a `statement_id`.
109
+ normalized wire shape. Agent Mode returns query output inline as Markdown and
110
+ copies a query output's `statement_id` onto the matching query attachment when
111
+ Databricks supplies one.
105
112
 
106
- ## Continue A Conversation
113
+ ## Continue a conversation
107
114
 
108
115
  ```ts
109
116
  let conversationId: string | undefined;
@@ -122,7 +129,7 @@ message or event and passing it into the next turn. This works in stateless
122
129
  route handlers, durable thread stores, and one-off scripts. AppKit-Mastra stores
123
130
  the id with its thread and passes it back when a conversation continues.
124
131
 
125
- ## Resolve A Workspace Client
132
+ ## Resolve a workspace client
126
133
 
127
134
  ```ts
128
135
  import { createWorkspaceClient } from "@databricks/appkit";
@@ -135,14 +142,14 @@ await chat.genieEventChat(spaceId, content, {
135
142
 
136
143
  Client resolution order:
137
144
 
138
- 1. `options.workspaceClient`;
139
- 2. AppKit execution-context client, when present;
140
- 3. `createWorkspaceClient()` using AppKit's normal Databricks auth chain.
145
+ 1. `options.workspaceClient`.
146
+ 1. AppKit execution-context client, when present.
147
+ 1. `createWorkspaceClient()` using AppKit's normal Databricks auth chain.
141
148
 
142
149
  Pass `options.context` as an `AbortSignal` or SDK context to cancel the Agent
143
150
  Mode stream, SDK calls, and any polling fallback sleep.
144
151
 
145
- ## Read Space Metadata And Starter Questions
152
+ ## Read space metadata and starter questions
146
153
 
147
154
  ```ts
148
155
  import { space } from "@dbx-tools/genie";
@@ -159,7 +166,7 @@ The serialized blob needs `Can Edit` on the space, while `Can Run` is enough for
159
166
  title and description. When the workspace rejects the serialized request for
160
167
  lack of permission, `getGenieSpace()` retries once without it and logs
161
168
  `serialized-space:forbidden`, so an app service principal holding only `Can Run`
162
- still resolves the space and simply reports no starter questions. Every other
169
+ still resolves the space and reports no starter questions. Every other
163
170
  failure - a cancelled request, a missing space, a retry that also fails - is
164
171
  thrown.
165
172
 
@@ -168,7 +175,9 @@ thrown.
168
175
  `chat.GenieChatOptions` is shared by both drivers:
169
176
 
170
177
  - `conversationId` - append to an existing Genie conversation.
171
- - `agentMode` - use Agent Mode SSE, default `true`; `false` forces polling.
178
+ - `agentMode` - use Agent Mode SSE, default `true`. `false` forces polling.
179
+ - `agentModeFallback` - fall back to classic polling when Agent Mode is
180
+ unavailable, default `true`. Direct Agent-only callers set `false`.
172
181
  - `enableVisualization` - request Agent Mode visualization generation.
173
182
  - `workspaceClient` - explicit Databricks SDK client.
174
183
  - `pollIntervalMs` - fallback polling cadence, default `500`.
@@ -179,9 +188,9 @@ thrown.
179
188
  - `chat` - `genieChat()` raw snapshot stream and `genieEventChat()` typed event
180
189
  stream.
181
190
  - `agentMode` - `genieAgentModeChat()`, availability classification, and Agent
182
- Mode transport options.
191
+ Mode transport options plus Agent Mode conversation history.
183
192
  - `space` - `getGenieSpace()` and `genieSampleQuestions()`.
184
193
 
185
- The AppKit-Mastra package builds its Genie tools on top of this driver; see
186
- [`@dbx-tools/appkit-mastra`](../appkit-mastra) for the agent-level
194
+ The AppKit-Mastra package builds its Genie tools on top of this driver. See
195
+ [@dbx-tools/appkit-mastra](../appkit-mastra) for the agent-level
187
196
  workflow.
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/genie";
6
- export const PACKAGE_VERSION = "0.9.129";
6
+ export const PACKAGE_VERSION = "0.9.132";
7
7
  export * as agentMode from "./src/agent-mode.ts";
8
8
  export * as chat from "./src/chat.ts";
9
9
  export * as space from "./src/space.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/genie";
2
- export declare const PACKAGE_VERSION = "0.9.129";
2
+ export declare const PACKAGE_VERSION = "0.9.132";
3
3
  export * as agentMode from "./src/agent-mode.ts";
4
4
  export * as chat from "./src/chat.ts";
5
5
  export * as space from "./src/space.ts";
package/lib/index.js CHANGED
@@ -2,8 +2,8 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/genie";
5
- export const PACKAGE_VERSION = "0.9.129";
5
+ export const PACKAGE_VERSION = "0.9.132";
6
6
  export * as agentMode from "./src/agent-mode.js";
7
7
  export * as chat from "./src/chat.js";
8
8
  export * as space from "./src/space.js";
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvZ2VuaWVcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMjlcIjtcbmV4cG9ydCAqIGFzIGFnZW50TW9kZSBmcm9tIFwiLi9zcmMvYWdlbnQtbW9kZS50c1wiO1xuZXhwb3J0ICogYXMgY2hhdCBmcm9tIFwiLi9zcmMvY2hhdC50c1wiO1xuZXhwb3J0ICogYXMgc3BhY2UgZnJvbSBcIi4vc3JjL3NwYWNlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEdlbmllQWdlbnRNb2RlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9hZ2VudC1tb2RlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEdlbmllQ2hhdE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvY2hhdC50c1wiO1xuZXhwb3J0IHR5cGUgeyBHZXRHZW5pZVNwYWNlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zcGFjZS50c1wiO1xuIl19
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxTQUFTLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvZ2VuaWVcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMzJcIjtcbmV4cG9ydCAqIGFzIGFnZW50TW9kZSBmcm9tIFwiLi9zcmMvYWdlbnQtbW9kZS50c1wiO1xuZXhwb3J0ICogYXMgY2hhdCBmcm9tIFwiLi9zcmMvY2hhdC50c1wiO1xuZXhwb3J0ICogYXMgc3BhY2UgZnJvbSBcIi4vc3JjL3NwYWNlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEdlbmllQWdlbnRNb2RlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9hZ2VudC1tb2RlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEdlbmllQ2hhdE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvY2hhdC50c1wiO1xuZXhwb3J0IHR5cGUgeyBHZXRHZW5pZVNwYWNlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy9zcGFjZS50c1wiO1xuIl19
@@ -19,5 +19,12 @@ export interface GenieAgentModeOptions {
19
19
  }
20
20
  /** Stream one Agent Mode response as `GenieMessage` snapshots. */
21
21
  export declare function genieAgentModeChat(client: WorkspaceClient, agentId: string, content: string, options?: GenieAgentModeOptions): AsyncGenerator<GenieMessage, void, void>;
22
+ /**
23
+ * Load an Agent Mode conversation's full item history and project it onto one
24
+ * `GenieMessage` per turn, oldest first.
25
+ */
26
+ export declare function listAgentModeConversation(client: WorkspaceClient, agentId: string, conversationId: string, options?: {
27
+ context?: databricks.ContextLike;
28
+ }): Promise<GenieMessage[]>;
22
29
  /** Return whether Agent Mode is disabled or its preview toggle is unavailable. */
23
30
  export declare function isAgentModeUnavailable(value: unknown): boolean;
@@ -13,6 +13,7 @@ import { errorUtils, json, log, object } from "@dbx-tools/shared-core";
13
13
  import { agentMode as agentModeWire, } from "@dbx-tools/shared-genie";
14
14
  const logger = log.logger("genie/agent-mode");
15
15
  const CANCEL_TIMEOUT_MS = 5_000;
16
+ const ITEM_PAGE_SIZE = 100;
16
17
  /** Stream one Agent Mode response as `GenieMessage` snapshots. */
17
18
  export async function* genieAgentModeChat(client, agentId, content, options = {}) {
18
19
  const ownedController = options.context ? undefined : new AbortController();
@@ -66,6 +67,29 @@ export async function* genieAgentModeChat(client, agentId, content, options = {}
66
67
  }
67
68
  }
68
69
  }
70
+ /**
71
+ * Load an Agent Mode conversation's full item history and project it onto one
72
+ * `GenieMessage` per turn, oldest first.
73
+ */
74
+ export async function listAgentModeConversation(client, agentId, conversationId, options = {}) {
75
+ const context = options.context ? databricks.toContext(options.context) : undefined;
76
+ const items = [];
77
+ let after;
78
+ let status = "completed";
79
+ do {
80
+ const page = agentModeWire.GenieAgentConversationItemsSchema.parse(await client.apiClient.request({
81
+ path: `/api/2.0/genie/agents/${encodeURIComponent(agentId)}/conversations/${encodeURIComponent(conversationId)}/items`,
82
+ method: "GET",
83
+ headers: new Headers({ accept: "application/json" }),
84
+ query: { limit: ITEM_PAGE_SIZE, order: "asc", ...(after ? { after } : {}) },
85
+ raw: false,
86
+ }, context));
87
+ items.push(...page.data);
88
+ status = page.status ?? status;
89
+ after = page.has_more ? page.last_id : undefined;
90
+ } while (after);
91
+ return agentModeWire.projectAgentModeConversation(agentId, conversationId, items, status);
92
+ }
69
93
  /** Return whether Agent Mode is disabled or its preview toggle is unavailable. */
70
94
  export function isAgentModeUnavailable(value) {
71
95
  const context = errorUtils.errorContext(value);
@@ -138,4 +162,4 @@ function parseSseFrame(frame) {
138
162
  return undefined;
139
163
  return agentModeWire.GenieAgentModeEventSchema.parse(json.parse(data));
140
164
  }
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtbW9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZ2VudC1tb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUdILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkUsT0FBTyxFQUNMLFNBQVMsSUFBSSxhQUFhLEdBRzNCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQzlDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDO0FBU2hDLGtFQUFrRTtBQUNsRSxNQUFNLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxrQkFBa0IsQ0FDdkMsTUFBdUIsRUFDdkIsT0FBZSxFQUNmLE9BQWUsRUFDZixVQUFpQyxFQUFFO0lBRW5DLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUM1RSxNQUFNLFVBQVUsR0FBRyxJQUFJLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEYsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU87WUFDN0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUN2QyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxlQUFnQixDQUFDLENBQUM7UUFDM0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDN0M7WUFDRSxJQUFJLEVBQUUseUJBQXlCLGtC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QUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNkLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNqRCxPQUFPLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmllIEFnZW50IE1vZGUgU1NFIHRyYW5zcG9ydC5cbiAqXG4gKiBTdHJlYW1zIHRoZSBSZXNwb25zZXMtc2hhcGVkIEFnZW50IE1vZGUgQVBJIGFuZCBwcm9qZWN0cyBpdHMgcmVhc29uaW5nLCBTUUwsXG4gKiBxdWVyeSBvdXRwdXQsIGFuZCBmaW5hbCBhbnN3ZXIgaXRlbXMgb250byB0aGUgZXhpc3RpbmcgYEdlbmllTWVzc2FnZWBcbiAqIGNvbnRyYWN0IHNvIGNhbGxlcnMgY2FuIGtlZXAgb25lIHNlbWFudGljIGV2ZW50IHBpcGVsaW5lIGFjcm9zcyBBZ2VudCBNb2RlXG4gKiBhbmQgdGhlIGxlZ2FjeSBwb2xsaW5nIEFQSS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBkYXRhYnJpY2tzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBqc29uLCBsb2csIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBhZ2VudE1vZGUgYXMgYWdlbnRNb2RlV2lyZSxcbiAgdHlwZSBHZW5pZUFnZW50TW9kZUV2ZW50LFxuICB0eXBlIEdlbmllTWVzc2FnZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWdlbmllXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJnZW5pZS9hZ2VudC1tb2RlXCIpO1xuY29uc3QgQ0FOQ0VMX1RJTUVPVVRfTVMgPSA1XzAwMDtcblxuLyoqIElucHV0cyBmb3Igb25lIEFnZW50IE1vZGUgcmVzcG9uc2Ugc3RyZWFtLiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5pZUFnZW50TW9kZU9wdGlvbnMge1xuICBjb252ZXJzYXRpb25JZD86IHN0cmluZztcbiAgZW5hYmxlVmlzdWFsaXphdGlvbj86IGJvb2xlYW47XG4gIGNvbnRleHQ/OiBkYXRhYnJpY2tzLkNvbnRleHRMaWtlO1xufVxuXG4vKiogU3RyZWFtIG9uZSBBZ2VudCBNb2RlIHJlc3BvbnNlIGFzIGBHZW5pZU1lc3NhZ2VgIHNuYXBzaG90cy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiogZ2VuaWVBZ2VudE1vZGVDaGF0KFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgYWdlbnRJZDogc3RyaW5nLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIG9wdGlvbnM6IEdlbmllQWdlbnRNb2RlT3B0aW9ucyA9IHt9LFxuKTogQXN5bmNHZW5lcmF0b3I8R2VuaWVNZXNzYWdlLCB2b2lkLCB2b2lkPiB7XG4gIGNvbnN0IG93bmVkQ29udHJvbGxlciA9IG9wdGlvbnMuY29udGV4dCA/IHVuZGVmaW5lZCA6IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgcHJvamVjdGlvbiA9IG5ldyBhZ2VudE1vZGVXaXJlLkdlbmllQWdlbnRNb2RlUHJvamVjdGlvbihhZ2VudElkLCBjb250ZW50KTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0XG4gICAgICA/IGRhdGFicmlja3MudG9Db250ZXh0KG9wdGlvbnMuY29udGV4dClcbiAgICAgIDogZGF0YWJyaWNrcy50b0NvbnRleHQob3duZWRDb250cm9sbGVyISk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuYXBpQ2xpZW50LnJlcXVlc3QoXG4gICAgICB7XG4gICAgICAgIHBhdGg6IGAvYXBpLzIuMC9nZW5pZS9hZ2VudHMvJHtlbmNvZGVVUklDb21wb25lbnQoYWdlbnRJZCl9L3Jlc3BvbnNlc2AsXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgICBhY2NlcHQ6IFwidGV4dC9ldmVudC1zdHJlYW1cIixcbiAgICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgfSksXG4gICAgICAgIHJhdzogdHJ1ZSxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgIGlucHV0OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgICByb2xlOiBcInVzZXJcIixcbiAgICAgICAgICAgICAgY29udGVudDogW3sgdHlwZTogXCJpbnB1dF90ZXh0XCIsIHRleHQ6IGNvbnRlbnQgfV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgLi4uKG9wdGlvbnMuY29udmVyc2F0aW9uSWQgPyB7IGNvbnZlcnNhdGlvbl9pZDogb3B0aW9ucy5jb252ZXJzYXRpb25JZCB9IDoge30pLFxuICAgICAgICAgIC4uLihvcHRpb25zLmVuYWJsZVZpc3VhbGl6YXRpb24gPyB7IGVuYWJsZV92aXo6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjb250ZXh0LFxuICAgICk7XG4gICAgY29uc3Qgc3RyZWFtID0gb2JqZWN0LmlzUmVjb3JkKHJlc3BvbnNlKSA/IHJlc3BvbnNlLmNvbnRlbnRzIDogdW5kZWZpbmVkO1xuICAgIGlmICghaXNSZWFkYWJsZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuaWUgQWdlbnQgTW9kZSBkaWQgbm90IHJldHVybiBhbiBTU0Ugc3RyZWFtXCIpO1xuICAgIH1cblxuICAgIGxldCBwcmV2aW91czogR2VuaWVNZXNzYWdlIHwgdW5kZWZpbmVkO1xuICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgcGFyc2VTc2Uoc3RyZWFtKSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHByb2plY3Rpb24uYXBwbHkoZXZlbnQpO1xuICAgICAgaWYgKCFtZXNzYWdlKSBjb250aW51ZTtcbiAgICAgIGlmICghb2JqZWN0LmRlZXBFcXVhbChtZXNzYWdlLCBwcmV2aW91cykpIHtcbiAgICAgICAgeWllbGQgbWVzc2FnZTtcbiAgICAgICAgcHJldmlvdXMgPSBtZXNzYWdlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXByb2plY3Rpb24udGVybWluYWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmllIEFnZW50IE1vZGUgc3RyZWFtIGVuZGVkIGJlZm9yZSBhIHRlcm1pbmFsIHJlc3BvbnNlXCIpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBvd25lZENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgaWYgKCFwcm9qZWN0aW9uLnRlcm1pbmFsICYmIHByb2plY3Rpb24ucmVzcG9uc2VJZCAmJiBwcm9qZWN0aW9uLmNvbnZlcnNhdGlvbklkKSB7XG4gICAgICBhd2FpdCBjYW5jZWxSZXNwb25zZShjbGllbnQsIGFnZW50SWQsIHByb2plY3Rpb24uY29udmVyc2F0aW9uSWQsIHByb2plY3Rpb24ucmVzcG9uc2VJZCk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBBZ2VudCBNb2RlIGlzIGRpc2FibGVkIG9yIGl0cyBwcmV2aWV3IHRvZ2dsZSBpcyB1bmF2YWlsYWJsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FnZW50TW9kZVVuYXZhaWxhYmxlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRleHQgPSBlcnJvclV0aWxzLmVycm9yQ29udGV4dCh2YWx1ZSk7XG4gIHJldHVybiBjb250ZXh0Lmhhc01lc3NhZ2UoXCJmZWF0dXJlXCIsIFwiZGlzYWJsZWRcIikgfHwgY29udGV4dC5oYXNNZXNzYWdlKFwicHJldmlld1wiLCBcInRvZ2dsZVwiKTtcbn1cblxuZnVuY3Rpb24gaXNSZWFkYWJsZVN0cmVhbSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIG9iamVjdC5pc1JlY29yZCh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlLmdldFJlYWRlciA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjYW5jZWxSZXNwb25zZShcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIGFnZW50SWQ6IHN0cmluZyxcbiAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyxcbiAgcmVzcG9uc2VJZDogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgQ0FOQ0VMX1RJTUVPVVRfTVMpO1xuICB0cnkge1xuICAgIGF3YWl0IGNsaWVudC5hcGlDbGllbnQucmVxdWVzdChcbiAgICAgIHtcbiAgICAgICAgcGF0aDogYC9hcGkvMi4wL2dlbmllL2FnZW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChhZ2VudElkKX0vY29udmVyc2F0aW9ucy8ke2VuY29kZVVSSUNvbXBvbmVudChjb252ZXJzYXRpb25JZCl9L3Jlc3BvbnNlcy8ke2VuY29kZVVSSUNvbXBvbmVudChyZXNwb25zZUlkKX0vY2FuY2VsYCxcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoe1xuICAgICAgICAgIGFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIH0pLFxuICAgICAgICByYXc6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGRhdGFicmlja3MudG9Db250ZXh0KGNvbnRyb2xsZXIpLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJlc3BvbnNlOmNhbmNlbC1mYWlsZWRcIiwge1xuICAgICAgYWdlbnRJZCxcbiAgICAgIGNvbnZlcnNhdGlvbklkLFxuICAgICAgcmVzcG9uc2VJZCxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24qIHBhcnNlU3NlKFxuICBzdHJlYW06IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+LFxuKTogQXN5bmNHZW5lcmF0b3I8R2VuaWVBZ2VudE1vZGVFdmVudCwgdm9pZCwgdm9pZD4ge1xuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgbGV0IGJ1ZmZlciA9IFwiXCI7XG4gIHRyeSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiAhZG9uZSB9KTtcbiAgICAgIGNvbnN0IGZyYW1lcyA9IGJ1ZmZlci5zcGxpdCgvXFxyP1xcblxccj9cXG4vKTtcbiAgICAgIGJ1ZmZlciA9IGZyYW1lcy5wb3AoKSA/PyBcIlwiO1xuICAgICAgZm9yIChjb25zdCBmcmFtZSBvZiBmcmFtZXMpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBwYXJzZVNzZUZyYW1lKGZyYW1lKTtcbiAgICAgICAgaWYgKGV2ZW50KSB5aWVsZCBldmVudDtcbiAgICAgIH1cbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gcGFyc2VTc2VGcmFtZShidWZmZXIpO1xuICAgICAgICBpZiAoZXZlbnQpIHlpZWxkIGV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VTc2VGcmFtZShmcmFtZTogc3RyaW5nKTogR2VuaWVBZ2VudE1vZGVFdmVudCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGEgPSBmcmFtZVxuICAgIC5zcGxpdCgvXFxyP1xcbi8pXG4gICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5zdGFydHNXaXRoKFwiZGF0YTpcIikpXG4gICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSg1KS50cmltU3RhcnQoKSlcbiAgICAuam9pbihcIlxcblwiKTtcbiAgaWYgKCFkYXRhIHx8IGRhdGEgPT09IFwiW0RPTkVdXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBhZ2VudE1vZGVXaXJlLkdlbmllQWdlbnRNb2RlRXZlbnRTY2hlbWEucGFyc2UoanNvbi5wYXJzZShkYXRhKSk7XG59XG4iXX0=
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtbW9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZ2VudC1tb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUdILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkUsT0FBTyxFQUNMLFNBQVMsSUFBSSxhQUFhLEdBRzNCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQzlDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDO0FBQ2hDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQztBQVMzQixrRUFBa0U7QUFDbEUsTUFBTSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsa0JBQWtCLENBQ3ZDLE1BQXVCLEVBQ3ZCLE9BQWUsRUFDZixPQUFlLEVBQ2YsVUFBaUMsRUFBRTtJQUVuQyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxFQUFFLENBQUM7SUFDNUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxhQUFhLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hGLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPO1lBQzdCLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDdkMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsZUFBZ0IsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFP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QUFhLENBQUMsS0FBYTtJQUNsQyxNQUFNLElBQUksR0FBRyxLQUFLO1NBQ2YsS0FBSyxDQUFDLE9BQU8sQ0FBQztTQUNkLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMxQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2QsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2pELE9BQU8sYUFBYSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuaWUgQWdlbnQgTW9kZSBTU0UgdHJhbnNwb3J0LlxuICpcbiAqIFN0cmVhbXMgdGhlIFJlc3BvbnNlcy1zaGFwZWQgQWdlbnQgTW9kZSBBUEkgYW5kIHByb2plY3RzIGl0cyByZWFzb25pbmcsIFNRTCxcbiAqIHF1ZXJ5IG91dHB1dCwgYW5kIGZpbmFsIGFuc3dlciBpdGVtcyBvbnRvIHRoZSBleGlzdGluZyBgR2VuaWVNZXNzYWdlYFxuICogY29udHJhY3Qgc28gY2FsbGVycyBjYW4ga2VlcCBvbmUgc2VtYW50aWMgZXZlbnQgcGlwZWxpbmUgYWNyb3NzIEFnZW50IE1vZGVcbiAqIGFuZCB0aGUgbGVnYWN5IHBvbGxpbmcgQVBJLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGRhdGFicmlja3MgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGpzb24sIGxvZywgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIGFnZW50TW9kZSBhcyBhZ2VudE1vZGVXaXJlLFxuICB0eXBlIEdlbmllQWdlbnRNb2RlRXZlbnQsXG4gIHR5cGUgR2VuaWVNZXNzYWdlLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZ2VuaWVcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImdlbmllL2FnZW50LW1vZGVcIik7XG5jb25zdCBDQU5DRUxfVElNRU9VVF9NUyA9IDVfMDAwO1xuY29uc3QgSVRFTV9QQUdFX1NJWkUgPSAxMDA7XG5cbi8qKiBJbnB1dHMgZm9yIG9uZSBBZ2VudCBNb2RlIHJlc3BvbnNlIHN0cmVhbS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuaWVBZ2VudE1vZGVPcHRpb25zIHtcbiAgY29udmVyc2F0aW9uSWQ/OiBzdHJpbmc7XG4gIGVuYWJsZVZpc3VhbGl6YXRpb24/OiBib29sZWFuO1xuICBjb250ZXh0PzogZGF0YWJyaWNrcy5Db250ZXh0TGlrZTtcbn1cblxuLyoqIFN0cmVhbSBvbmUgQWdlbnQgTW9kZSByZXNwb25zZSBhcyBgR2VuaWVNZXNzYWdlYCBzbmFwc2hvdHMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24qIGdlbmllQWdlbnRNb2RlQ2hhdChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIGFnZW50SWQ6IHN0cmluZyxcbiAgY29udGVudDogc3RyaW5nLFxuICBvcHRpb25zOiBHZW5pZUFnZW50TW9kZU9wdGlvbnMgPSB7fSxcbik6IEFzeW5jR2VuZXJhdG9yPEdlbmllTWVzc2FnZSwgdm9pZCwgdm9pZD4ge1xuICBjb25zdCBvd25lZENvbnRyb2xsZXIgPSBvcHRpb25zLmNvbnRleHQgPyB1bmRlZmluZWQgOiBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHByb2plY3Rpb24gPSBuZXcgYWdlbnRNb2RlV2lyZS5HZW5pZUFnZW50TW9kZVByb2plY3Rpb24oYWdlbnRJZCwgY29udGVudCk7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGV4dCA9IG9wdGlvbnMuY29udGV4dFxuICAgICAgPyBkYXRhYnJpY2tzLnRvQ29udGV4dChvcHRpb25zLmNvbnRleHQpXG4gICAgICA6IGRhdGFicmlja3MudG9Db250ZXh0KG93bmVkQ29udHJvbGxlciEpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmFwaUNsaWVudC5yZXF1ZXN0KFxuICAgICAge1xuICAgICAgICBwYXRoOiBgL2FwaS8yLjAvZ2VuaWUvYWdlbnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGFnZW50SWQpfS9yZXNwb25zZXNgLFxuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgYWNjZXB0OiBcInRleHQvZXZlbnQtc3RyZWFtXCIsXG4gICAgICAgICAgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIH0pLFxuICAgICAgICByYXc6IHRydWUsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBpbnB1dDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgICAgcm9sZTogXCJ1c2VyXCIsXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwiaW5wdXRfdGV4dFwiLCB0ZXh0OiBjb250ZW50IH1dLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIC4uLihvcHRpb25zLmNvbnZlcnNhdGlvbklkID8geyBjb252ZXJzYXRpb25faWQ6IG9wdGlvbnMuY29udmVyc2F0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5lbmFibGVWaXN1YWxpemF0aW9uID8geyBlbmFibGVfdml6OiB0cnVlIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29udGV4dCxcbiAgICApO1xuICAgIGNvbnN0IHN0cmVhbSA9IG9iamVjdC5pc1JlY29yZChyZXNwb25zZSkgPyByZXNwb25zZS5jb250ZW50cyA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIWlzUmVhZGFibGVTdHJlYW0oc3RyZWFtKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmllIEFnZW50IE1vZGUgZGlkIG5vdCByZXR1cm4gYW4gU1NFIHN0cmVhbVwiKTtcbiAgICB9XG5cbiAgICBsZXQgcHJldmlvdXM6IEdlbmllTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIHBhcnNlU3NlKHN0cmVhbSkpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBwcm9qZWN0aW9uLmFwcGx5KGV2ZW50KTtcbiAgICAgIGlmICghbWVzc2FnZSkgY29udGludWU7XG4gICAgICBpZiAoIW9iamVjdC5kZWVwRXF1YWwobWVzc2FnZSwgcHJldmlvdXMpKSB7XG4gICAgICAgIHlpZWxkIG1lc3NhZ2U7XG4gICAgICAgIHByZXZpb3VzID0gbWVzc2FnZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFwcm9qZWN0aW9uLnRlcm1pbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5pZSBBZ2VudCBNb2RlIHN0cmVhbSBlbmRlZCBiZWZvcmUgYSB0ZXJtaW5hbCByZXNwb25zZVwiKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgb3duZWRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIGlmICghcHJvamVjdGlvbi50ZXJtaW5hbCAmJiBwcm9qZWN0aW9uLnJlc3BvbnNlSWQgJiYgcHJvamVjdGlvbi5jb252ZXJzYXRpb25JZCkge1xuICAgICAgYXdhaXQgY2FuY2VsUmVzcG9uc2UoY2xpZW50LCBhZ2VudElkLCBwcm9qZWN0aW9uLmNvbnZlcnNhdGlvbklkLCBwcm9qZWN0aW9uLnJlc3BvbnNlSWQpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIExvYWQgYW4gQWdlbnQgTW9kZSBjb252ZXJzYXRpb24ncyBmdWxsIGl0ZW0gaGlzdG9yeSBhbmQgcHJvamVjdCBpdCBvbnRvIG9uZVxuICogYEdlbmllTWVzc2FnZWAgcGVyIHR1cm4sIG9sZGVzdCBmaXJzdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RBZ2VudE1vZGVDb252ZXJzYXRpb24oXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICBhZ2VudElkOiBzdHJpbmcsXG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHsgY29udGV4dD86IGRhdGFicmlja3MuQ29udGV4dExpa2UgfSA9IHt9LFxuKTogUHJvbWlzZTxHZW5pZU1lc3NhZ2VbXT4ge1xuICBjb25zdCBjb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0ID8gZGF0YWJyaWNrcy50b0NvbnRleHQob3B0aW9ucy5jb250ZXh0KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgaXRlbXM6IGFnZW50TW9kZVdpcmUuR2VuaWVBZ2VudE91dHB1dEl0ZW1bXSA9IFtdO1xuICBsZXQgYWZ0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0YXR1cyA9IFwiY29tcGxldGVkXCI7XG4gIGRvIHtcbiAgICBjb25zdCBwYWdlID0gYWdlbnRNb2RlV2lyZS5HZW5pZUFnZW50Q29udmVyc2F0aW9uSXRlbXNTY2hlbWEucGFyc2UoXG4gICAgICBhd2FpdCBjbGllbnQuYXBpQ2xpZW50LnJlcXVlc3QoXG4gICAgICAgIHtcbiAgICAgICAgICBwYXRoOiBgL2FwaS8yLjAvZ2VuaWUvYWdlbnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGFnZW50SWQpfS9jb252ZXJzYXRpb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvbnZlcnNhdGlvbklkKX0vaXRlbXNgLFxuICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7IGFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSksXG4gICAgICAgICAgcXVlcnk6IHsgbGltaXQ6IElURU1fUEFHRV9TSVpFLCBvcmRlcjogXCJhc2NcIiwgLi4uKGFmdGVyID8geyBhZnRlciB9IDoge30pIH0sXG4gICAgICAgICAgcmF3OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICksXG4gICAgKTtcbiAgICBpdGVtcy5wdXNoKC4uLnBhZ2UuZGF0YSk7XG4gICAgc3RhdHVzID0gcGFnZS5zdGF0dXMgPz8gc3RhdHVzO1xuICAgIGFmdGVyID0gcGFnZS5oYXNfbW9yZSA/IHBhZ2UubGFzdF9pZCA6IHVuZGVmaW5lZDtcbiAgfSB3aGlsZSAoYWZ0ZXIpO1xuICByZXR1cm4gYWdlbnRNb2RlV2lyZS5wcm9qZWN0QWdlbnRNb2RlQ29udmVyc2F0aW9uKGFnZW50SWQsIGNvbnZlcnNhdGlvbklkLCBpdGVtcywgc3RhdHVzKTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIEFnZW50IE1vZGUgaXMgZGlzYWJsZWQgb3IgaXRzIHByZXZpZXcgdG9nZ2xlIGlzIHVuYXZhaWxhYmxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWdlbnRNb2RlVW5hdmFpbGFibGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgY29uc3QgY29udGV4dCA9IGVycm9yVXRpbHMuZXJyb3JDb250ZXh0KHZhbHVlKTtcbiAgcmV0dXJuIGNvbnRleHQuaGFzTWVzc2FnZShcImZlYXR1cmVcIiwgXCJkaXNhYmxlZFwiKSB8fCBjb250ZXh0Lmhhc01lc3NhZ2UoXCJwcmV2aWV3XCIsIFwidG9nZ2xlXCIpO1xufVxuXG5mdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4ge1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUuZ2V0UmVhZGVyID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbmNlbFJlc3BvbnNlKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgYWdlbnRJZDogc3RyaW5nLFxuICBjb252ZXJzYXRpb25JZDogc3RyaW5nLFxuICByZXNwb25zZUlkOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCBDQU5DRUxfVElNRU9VVF9NUyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgY2xpZW50LmFwaUNsaWVudC5yZXF1ZXN0KFxuICAgICAge1xuICAgICAgICBwYXRoOiBgL2FwaS8yLjAvZ2VuaWUvYWdlbnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGFnZW50SWQpfS9jb252ZXJzYXRpb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvbnZlcnNhdGlvbklkKX0vcmVzcG9uc2VzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHJlc3BvbnNlSWQpfS9jYW5jZWxgLFxuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgYWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgfSksXG4gICAgICAgIHJhdzogZmFsc2UsXG4gICAgICB9LFxuICAgICAgZGF0YWJyaWNrcy50b0NvbnRleHQoY29udHJvbGxlciksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVzcG9uc2U6Y2FuY2VsLWZhaWxlZFwiLCB7XG4gICAgICBhZ2VudElkLFxuICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICByZXNwb25zZUlkLFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiogcGFyc2VTc2UoXG4gIHN0cmVhbTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sXG4pOiBBc3luY0dlbmVyYXRvcjxHZW5pZUFnZW50TW9kZUV2ZW50LCB2b2lkLCB2b2lkPiB7XG4gIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICBsZXQgYnVmZmVyID0gXCJcIjtcbiAgdHJ5IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgIGJ1ZmZlciArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06ICFkb25lIH0pO1xuICAgICAgY29uc3QgZnJhbWVzID0gYnVmZmVyLnNwbGl0KC9cXHI/XFxuXFxyP1xcbi8pO1xuICAgICAgYnVmZmVyID0gZnJhbWVzLnBvcCgpID8/IFwiXCI7XG4gICAgICBmb3IgKGNvbnN0IGZyYW1lIG9mIGZyYW1lcykge1xuICAgICAgICBjb25zdCBldmVudCA9IHBhcnNlU3NlRnJhbWUoZnJhbWUpO1xuICAgICAgICBpZiAoZXZlbnQpIHlpZWxkIGV2ZW50O1xuICAgICAgfVxuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBwYXJzZVNzZUZyYW1lKGJ1ZmZlcik7XG4gICAgICAgIGlmIChldmVudCkgeWllbGQgZXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVNzZUZyYW1lKGZyYW1lOiBzdHJpbmcpOiBHZW5pZUFnZW50TW9kZUV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGF0YSA9IGZyYW1lXG4gICAgLnNwbGl0KC9cXHI/XFxuLylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSlcbiAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKDUpLnRyaW1TdGFydCgpKVxuICAgIC5qb2luKFwiXFxuXCIpO1xuICBpZiAoIWRhdGEgfHwgZGF0YSA9PT0gXCJbRE9ORV1cIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGFnZW50TW9kZVdpcmUuR2VuaWVBZ2VudE1vZGVFdmVudFNjaGVtYS5wYXJzZShqc29uLnBhcnNlKGRhdGEpKTtcbn1cbiJdfQ==
package/lib/src/chat.d.ts CHANGED
@@ -34,6 +34,11 @@ export interface GenieChatOptions {
34
34
  * force the legacy start/create/get-message polling flow.
35
35
  */
36
36
  agentMode?: boolean;
37
+ /**
38
+ * Fall back to Conversation API polling when Agent Mode is unavailable.
39
+ * Defaults to `true`; set `false` when the caller requires Agent Mode.
40
+ */
41
+ agentModeFallback?: boolean;
37
42
  /** Ask Agent Mode to generate visualizations when appropriate. */
38
43
  enableVisualization?: boolean;
39
44
  /**
package/lib/src/chat.js CHANGED
@@ -108,8 +108,9 @@ export async function* genieChat(space_id, content, options) {
108
108
  return;
109
109
  }
110
110
  catch (err) {
111
- if (yielded || !isAgentModeUnavailable(err))
111
+ if (options?.agentModeFallback === false || yielded || !isAgentModeUnavailable(err)) {
112
112
  throw err;
113
+ }
113
114
  logger.warn("agent-mode:unavailable, falling back to polling", {
114
115
  space_id,
115
116
  error: errorUtils.toError(err),
@@ -281,4 +282,4 @@ async function getWorkspaceClient(options) {
281
282
  }
282
283
  return createWorkspaceClient();
283
284
  }
284
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBRUgsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixtQkFBbUIsR0FFcEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFvQixNQUFNLHdCQUF3QixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUEwQyxNQUFNLHlCQUF5QixDQUFDO0FBRXBHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFeEM7Ozs7Ozs7R0FPRztBQUNILFNBQVMsZUFBZSxDQUFDLEdBQWlCO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUQsSUFBSSxNQUFNLENBQUMsT0FBTztRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztJQUN2QyxNQUFNLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFO1FBQ3ZDLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQ3BDLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNO0tBQ25DLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQW9DRCwwRUFBMEU7QUFFMUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBQ0gsTUFBTSxDQUFDLEtBQUss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QU87YUFDekIsQ0FBQztZQUNGLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDekIsQ0FBQztRQUNELEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQzlCLElBQUksVUFBVSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDeEMsTUFBTTtnQkFDSixJQUFJLEVBQUUsUUFBUTtnQkFDZCxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7Z0JBQzFCLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZTtnQkFDeEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO2dCQUM5QixNQUFNO2dCQUNOLE9BQU87YUFDUixDQUFDO1FBQ0osQ0FBQztRQUNELFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDckIsQ0FBQztBQUNILENBQUM7QUFFRCwwRUFBMEU7QUFFMUU7Ozs7Ozs7R0FPRztBQUNILEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxPQUEwQjtJQUMxRCxJQUFJLE9BQU8sRUFBRSxlQUFlO1FBQUUsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDO0lBQzdELElBQUksQ0FBQztRQUNILE9BQU8sbUJBQW1CLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDdEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLHNFQUFzRTtJQUN4RSxDQUFDO0lBQ0QsT0FBTyxxQkFBcUIsRUFBRSxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmllIGNoYXQgZHJpdmVyLlxuICpcbiAqIERyaXZlcyBhIHNpbmdsZSB0dXJuIGFnYWluc3QgYSBHZW5pZSBzcGFjZSBmcm9tIG9uZSBgY29udGVudGAgc3RyaW5nO1xuICogbXVsdGktdHVybiBjb252ZXJzYXRpb25zIGFyZSB0aGUgY2FsbGVyJ3Mgam9iICh0aHJlYWQgdGhlIGBjb252ZXJzYXRpb25faWRgXG4gKiByZXR1cm5lZCBvbiBlYWNoIGBHZW5pZU1lc3NhZ2VgIGJhY2sgaW50byB0aGUgbmV4dCB0dXJuJ3NcbiAqIGBvcHRpb25zLmNvbnZlcnNhdGlvbklkYCkuXG4gKlxuICogQWdlbnQgTW9kZSBTU0UgaXMgdGhlIGRlZmF1bHQgdHJhbnNwb3J0LiBJdHMgUmVzcG9uc2VzLXN0eWxlIHJlYXNvbmluZywgU1FMLFxuICogcXVlcnkgb3V0cHV0LCBhbmQgZmluYWwgYW5zd2VyIGl0ZW1zIGFyZSBwcm9qZWN0ZWQgaW50byBgR2VuaWVNZXNzYWdlYFxuICogc25hcHNob3RzOyBgYWdlbnRNb2RlOiBmYWxzZWAgcmV0YWlucyB0aGUgQ29udmVyc2F0aW9uIEFQSSBwb2xsaW5nIHBhdGguXG4gKlxuICogVHdvIGxheWVycyBzZXJ2ZSB0d28ga2luZHMgb2YgY29uc3VtZXIuIFRoZSBsb3ctbGV2ZWwgbGF5ZXIgeWllbGRzIGV2ZXJ5XG4gKiBvYnNlcnZlZCBgR2VuaWVNZXNzYWdlYCAodmFsaWRhdGVkIGFnYWluc3QgYEdlbmllTWVzc2FnZVNjaGVtYWAsIGZhbGxpbmcgYmFja1xuICogdG8gdGhlIHJhdyBzbmFwc2hvdCBvbiBhIHNjaGVtYSBtaXNzKSBhbmQgb3ducyBjYW5jZWxsYXRpb24sIGNvbnZlcnNhdGlvblxuICogc2VlZGluZywgZGlzdGluY3QtZmlsdGVyaW5nLCBhbmQgU0RLIHF1aXJrczsgcmVhY2ggZm9yIGl0IHdoZW4geW91IHdhbnQgdGhlXG4gKiByYXcgc3RyZWFtLiBUaGVcbiAqIGhpZ2gtbGV2ZWwgbGF5ZXIgd3JhcHMgaXQgYW5kIGVtaXRzIHNlbWFudGljLCBkZWR1cGxpY2F0ZWQgYHsgdHlwZSwgcGF5bG9hZCB9YFxuICogZXZlbnRzIChzZWUge0BsaW5rIEdlbmllQ2hhdEV2ZW50fSksIGFsd2F5cyBjbG9zaW5nIGEgc3VjY2Vzc2Z1bCB0dXJuIHdpdGggYVxuICogdGVybWluYWwgYHJlc3VsdGAgZXZlbnQgY2FycnlpbmcgdGhlIGZpbmFsIGBHZW5pZU1lc3NhZ2VgOyBlcnJvcnMgcHJvcGFnYXRlXG4gKiBieSB0aHJvd2luZywgd2l0aCBubyBgZXJyb3JgIHZhcmlhbnQuIEl0ZXJhdGluZyBVSSAvIGFnZW50IGNvZGUgdGhhdCB3YW50c1xuICogZXZlcnkgbWVzc2FnZSB2ZXJiYXRpbSB0YWtlcyB0aGUgbG93LWxldmVsIHN0cmVhbTsgc3Vic2NyaWJlcnMgcmVhY3RpbmcgdG9cbiAqIFwiR2VuaWUgaXMgdGhpbmtpbmcgYWJvdXQgWFwiIG9yIFwiR2VuaWUgcHJvZHVjZWQgdGV4dCBZXCIgdGFrZSB0aGUgZXZlbnQgbGF5ZXIuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCxcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCxcbiAgdHlwZSBXb3Jrc3BhY2VDbGllbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGRhdGFicmlja3MgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGFzeW5jVXRpbHMsIGVycm9yVXRpbHMsIGxvZywgdHlwZSBQb2xsQ29udGV4dCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBldmVudCwgZ2VuaWVNb2RlbCwgdHlwZSBHZW5pZUNoYXRFdmVudCwgdHlwZSBHZW5pZU1lc3NhZ2UgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZ2VuaWVcIjtcblxuaW1wb3J0IHsgZ2VuaWVBZ2VudE1vZGVDaGF0LCBpc0FnZW50TW9kZVVuYXZhaWxhYmxlIH0gZnJvbSBcIi4vYWdlbnQtbW9kZS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiZ2VuaWUvY2hhdFwiKTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBhIHBvbGxlZCB3aXJlIHNuYXBzaG90IGFnYWluc3Qge0BsaW5rIEdlbmllTWVzc2FnZVNjaGVtYX1cbiAqIGFuZCByZXR1cm4gdGhlIHNjaGVtYS1ub3JtYWxpemVkIG1lc3NhZ2UuIEdlbmllJ3Mgd2lyZSBvY2Nhc2lvbmFsbHkgc2hpcHMgYVxuICogc2hhcGUgdGhlIChTREstZGVyaXZlZCkgc2NoZW1hIGRvZXNuJ3QgbW9kZWwgZXhhY3RseSAtIGUuZy4gYW4gZWFybHkgcG9sbFxuICogdGhhdCBvbWl0cyB0aGUgU0RLLXJlcXVpcmVkIGBtZXNzYWdlX2lkYCAtIHNvIGEgbWlzcyBkZWdyYWRlcyB0byB0aGUgcmF3XG4gKiBzbmFwc2hvdCByYXRoZXIgdGhhbiB0aHJvd2luZywga2VlcGluZyBhIHNpbmdsZSBvZGQgcG9sbCBmcm9tIGFib3J0aW5nIHRoZVxuICogd2hvbGUgdHVybi5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVNZXNzYWdlKHJhdzogR2VuaWVNZXNzYWdlKTogR2VuaWVNZXNzYWdlIHtcbiAgY29uc3QgcmVzdWx0ID0gZ2VuaWVNb2RlbC5HZW5pZU1lc3NhZ2VTY2hlbWEuc2FmZVBhcnNlKHJhdyk7XG4gIGlmIChyZXN1bHQuc3VjY2VzcykgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICBsb2dnZXIuZGVidWcoXCJ3aXJlLW1lc3NhZ2U6c2NoZW1hLW1pc3NcIiwge1xuICAgIG1lc3NhZ2VfaWQ6IHJhdy5tZXNzYWdlX2lkID8/IHJhdy5pZCxcbiAgICBpc3N1ZXM6IHJlc3VsdC5lcnJvci5pc3N1ZXMubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHJhdztcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2hhcmVkIG9wdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgYm90aCB7QGxpbmsgZ2VuaWVDaGF0fSBhbmQge0BsaW5rIGdlbmllRXZlbnRDaGF0fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuaWVDaGF0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIHN0cmVhbWluZyBHZW5pZSBBZ2VudCBNb2RlIEFQSS4gRGVmYXVsdHMgdG8gYHRydWVgOyBzZXQgYGZhbHNlYCB0b1xuICAgKiBmb3JjZSB0aGUgbGVnYWN5IHN0YXJ0L2NyZWF0ZS9nZXQtbWVzc2FnZSBwb2xsaW5nIGZsb3cuXG4gICAqL1xuICBhZ2VudE1vZGU/OiBib29sZWFuO1xuICAvKiogQXNrIEFnZW50IE1vZGUgdG8gZ2VuZXJhdGUgdmlzdWFsaXphdGlvbnMgd2hlbiBhcHByb3ByaWF0ZS4gKi9cbiAgZW5hYmxlVmlzdWFsaXphdGlvbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDb250aW51ZSBhbiBleGlzdGluZyBjb252ZXJzYXRpb24uIEFnZW50IE1vZGUgc2VuZHMgaXQgYXNcbiAgICogYGNvbnZlcnNhdGlvbl9pZGA7IGxlZ2FjeSBwb2xsaW5nIHBhc3NlcyBpdCB0byBgY3JlYXRlTWVzc2FnZWAuIFJlYWQgdGhlIGlkXG4gICAqIGZyb20gdGhlIHByaW9yIHR1cm4ncyB0ZXJtaW5hbCBgR2VuaWVNZXNzYWdlYCBvciBgcmVzdWx0YCBldmVudC5cbiAgICovXG4gIGNvbnZlcnNhdGlvbklkPzogc3RyaW5nO1xuICAvKipcbiAgICogRXhwbGljaXQgYFdvcmtzcGFjZUNsaWVudGAuIERlZmF1bHRzIHRvIEFwcEtpdCdzIHBlci1yZXF1ZXN0XG4gICAqIGV4ZWN1dGlvbi1jb250ZXh0IGNsaWVudCB3aGVuIEFwcEtpdCBpcyBpbnN0YWxsZWQgYW5kIHdlJ3JlIGluc2lkZSBhXG4gICAqIHJlcXVlc3Q7IGZhbGxzIGJhY2sgdG8gYGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpYCAoZGVmYXVsdCBhdXRoKVxuICAgKiBvdGhlcndpc2UuXG4gICAqL1xuICB3b3Jrc3BhY2VDbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIC8qKiBMZWdhY3kgZmFsbGJhY2sgY2FkZW5jZSBiZXR3ZWVuIHN1Y2Nlc3NpdmUgYGdldE1lc3NhZ2VgIGNhbGxzIChkZWZhdWx0IDUwMG1zKS4gKi9cbiAgcG9sbEludGVydmFsTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uIEFjY2VwdHMgYSBXSEFUV0cgYEFib3J0U2lnbmFsYCBvciBhIGZ1bGx5LWJ1aWx0IFNES1xuICAgKiBgQ29udGV4dGAgKHNlZSBgZGF0YWJyaWNrcy5Db250ZXh0TGlrZWApLiBBYm9ydGluZyBpdCBjYW5jZWxzIGV2ZXJ5IGluLWZsaWdodFxuICAgKiBBZ2VudCBNb2RlIHN0cmVhbSwgU0RLIGNhbGwsIGFuZCB0aGUgbmV4dCBpbnRlci1wb2xsIHNsZWVwLlxuICAgKi9cbiAgY29udGV4dD86IGRhdGFicmlja3MuQ29udGV4dExpa2U7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGxvdy1sZXZlbDogZ2VuaWVDaGF0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHR1cm4gYWdhaW5zdCBhIEdlbmllIHNwYWNlLCB5aWVsZGVkIGFzIGEgc3RyZWFtIG9mIGBHZW5pZU1lc3NhZ2VgXG4gKiBzbmFwc2hvdHMuXG4gKlxuICogVHVybiBsaWZlY3ljbGU6XG4gKlxuICogICAtIEFnZW50IE1vZGUgKGRlZmF1bHQpOiBQT1NUIG9uZSBSZXNwb25zZXMtc3R5bGUgbWVzc2FnZSB0b1xuICogICAgIGAvYXBpLzIuMC9nZW5pZS9hZ2VudHMve2lkfS9yZXNwb25zZXNgIGFuZCB5aWVsZCBwcm9qZWN0ZWQgc25hcHNob3RzIGZyb21cbiAqICAgICBpdHMgU1NFIGV2ZW50cy5cbiAqICAgLSBMZWdhY3kgcG9sbGluZyAoYGFnZW50TW9kZTogZmFsc2VgKTogc3RhcnQvY3JlYXRlIGEgQ29udmVyc2F0aW9uIEFQSVxuICogICAgIG1lc3NhZ2UgYW5kIHBvbGwgYGdldE1lc3NhZ2VgIHVudGlsIHRlcm1pbmFsLlxuICogICAtIEEgcHJlLXN0cmVhbSBgRkVBVFVSRV9ESVNBQkxFRGAgb3IgcHJldmlldy10b2dnbGUgcmVzcG9uc2UgZmFsbHMgYmFjayB0b1xuICogICAgIGxlZ2FjeSBwb2xsaW5nIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogQ2FuY2VsbGF0aW9uOiBhIHNpbmdsZSBpbnRlcm5hbCBgQWJvcnRDb250cm9sbGVyYCBjb3ZlcnMgdGhlIHdob2xlIHR1cm4uXG4gKiBgb3B0aW9ucy5jb250ZXh0YCBpcyB0aWVkIGludG8gdGhhdCBjb250cm9sbGVyIHNvIGFuIGV4dGVybmFsIGFib3J0IHRlYXJzXG4gKiBkb3duIHRoZSBBZ2VudCBNb2RlIFNTRSBjb25uZWN0aW9uLCBTREsgY2FsbHMsIGFuZCBhbnkgaW50ZXItcG9sbCBzbGVlcC5cbiAqIEJyZWFraW5nIG91dCBvZiB0aGUgYGZvciBhd2FpdGAgYWxzbyBpbnZva2VzIHRoZSBBZ2VudCBNb2RlIHNlcnZlci1zaWRlXG4gKiBjYW5jZWwgZW5kcG9pbnQgYmVmb3JlIHRoZSBnZW5lcmF0b3IgY2xvc2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTaW5nbGUgdHVybi5cbiAqIGZvciBhd2FpdCAoY29uc3QgbSBvZiBnZW5pZUNoYXQoc3BhY2VJZCwgXCJUb3AgNSBzdG9yZXM/XCIpKSB7XG4gKiAgIHJlbmRlcihtKTtcbiAqIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTXVsdGktdHVybjogY2FsbGVyIHRocmVhZHMgdGhlIGNvbnZlcnNhdGlvbiBpZC5cbiAqIGxldCBjb252ZXJzYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICogZm9yIChjb25zdCBxdWVzdGlvbiBvZiBxdWVzdGlvbnMpIHtcbiAqICAgZm9yIGF3YWl0IChjb25zdCBtIG9mIGdlbmllQ2hhdChzcGFjZUlkLCBxdWVzdGlvbiwgeyBjb252ZXJzYXRpb25JZCB9KSkge1xuICogICAgIGNvbnZlcnNhdGlvbklkID0gbS5jb252ZXJzYXRpb25faWQgPz8gY29udmVyc2F0aW9uSWQ7XG4gKiAgICAgcmVuZGVyKG0pO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiogZ2VuaWVDaGF0KFxuICBzcGFjZV9pZDogc3RyaW5nLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBHZW5pZUNoYXRPcHRpb25zLFxuKTogQXN5bmNHZW5lcmF0b3I8R2VuaWVNZXNzYWdlLCB2b2lkLCB2b2lkPiB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIHRyeSB7XG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgZ2V0V29ya3NwYWNlQ2xpZW50KG9wdGlvbnMpO1xuICAgIC8vIEJ1aWxkIHRoZSBTREsgQ29udGV4dCBPTkNFLiBCdWlsZGluZyBpdCBpbnNpZGUgdGhlIHBvbGwgcHJvZHVjZXIgd291bGRcbiAgICAvLyByZS1hdHRhY2ggYW4gYWJvcnQgbGlzdGVuZXIgdG8gYG9wdGlvbnMuY29udGV4dGAgb24gZXZlcnkgcG9sbCBpdGVyYXRpb25cbiAgICAvLyAodmlhIGBkYXRhYnJpY2tzLnRvQ29udGV4dGAgLT4gYGFzeW5jLnRpZUFib3J0U2lnbmFsYCksIGV2ZW50dWFsbHkgdHJpcHBpbmdcbiAgICAvLyBOb2RlJ3MgYE1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZ2AuXG4gICAgY29uc3QgY3R4ID0gZGF0YWJyaWNrcy50b0NvbnRleHQoY29udHJvbGxlciwgb3B0aW9ucz8uY29udGV4dCk7XG4gICAgaWYgKG9wdGlvbnM/LmFnZW50TW9kZSAhPT0gZmFsc2UpIHtcbiAgICAgIGxldCB5aWVsZGVkID0gZmFsc2U7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IG1lc3NhZ2Ugb2YgZ2VuaWVBZ2VudE1vZGVDaGF0KGNsaWVudCwgc3BhY2VfaWQsIGNvbnRlbnQsIHtcbiAgICAgICAgICAuLi4ob3B0aW9ucz8uY29udmVyc2F0aW9uSWQgPyB7IGNvbnZlcnNhdGlvbklkOiBvcHRpb25zLmNvbnZlcnNhdGlvbklkIH0gOiB7fSksXG4gICAgICAgICAgLi4uKG9wdGlvbnM/LmVuYWJsZVZpc3VhbGl6YXRpb24gPyB7IGVuYWJsZVZpc3VhbGl6YXRpb246IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICBjb250ZXh0OiBjdHgsXG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgeWllbGRlZCA9IHRydWU7XG4gICAgICAgICAgeWllbGQgdmFsaWRhdGVNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoeWllbGRlZCB8fCAhaXNBZ2VudE1vZGVVbmF2YWlsYWJsZShlcnIpKSB0aHJvdyBlcnI7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiYWdlbnQtbW9kZTp1bmF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvIHBvbGxpbmdcIiwge1xuICAgICAgICAgIHNwYWNlX2lkLFxuICAgICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBjb252ZXJzYXRpb25JZCA9IG9wdGlvbnM/LmNvbnZlcnNhdGlvbklkO1xuICAgIGxldCBtZXNzYWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHBvbGxQcm9kdWNlciA9IGFzeW5jIChwb2xsQ3R4OiBQb2xsQ29udGV4dDxHZW5pZU1lc3NhZ2U+KTogUHJvbWlzZTxHZW5pZU1lc3NhZ2U+ID0+IHtcbiAgICAgIGlmICghY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgLy8gRmlyc3QgcG9sbDogb3BlbiB0aGUgY29udmVyc2F0aW9uLiBSZWZ1c2UgdG8gcmV0cnk6IGlmXG4gICAgICAgIC8vIGBzdGFydENvbnZlcnNhdGlvbmAgcmV0dXJuZWQgYSByZXNwb25zZSB3aXRob3V0IGEgYGNvbnZlcnNhdGlvbl9pZGAsXG4gICAgICAgIC8vIHJldHJ5aW5nIHdvdWxkIGp1c3Qgb3BlbiBjb252ZXJzYXRpb24gYWZ0ZXIgY29udmVyc2F0aW9uLlxuICAgICAgICBpZiAocG9sbEN0eC5hdHRlbXB0ID4gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmllIGRpZCBub3QgcmV0dXJuIGEgY29udmVyc2F0aW9uIGlkOyByZWZ1c2luZyB0byByZXRyeVwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFydFJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdlbmllLnN0YXJ0Q29udmVyc2F0aW9uKHsgc3BhY2VfaWQsIGNvbnRlbnQgfSwgY3R4KTtcbiAgICAgICAgY29udmVyc2F0aW9uSWQgPSBzdGFydFJlc3BvbnNlLmNvbnZlcnNhdGlvbl9pZDtcbiAgICAgICAgbWVzc2FnZUlkID0gc3RhcnRSZXNwb25zZS5tZXNzYWdlX2lkO1xuICAgICAgICByZXR1cm4gc3RhcnRSZXNwb25zZS5tZXNzYWdlITtcbiAgICAgIH1cbiAgICAgIGlmICghbWVzc2FnZUlkKSB7XG4gICAgICAgIC8vIEZpcnN0IHBvbGwgb2YgYSBmb2xsb3ctdXAgdHVybjogYXBwZW5kIHRvIHRoZSBzZWVkZWQgY29udmVyc2F0aW9uLlxuICAgICAgICAvLyBgY2xpZW50LmdlbmllLmNyZWF0ZU1lc3NhZ2VgIHJldHVybnMgYSBgV2FpdGVyPEdlbmllTWVzc2FnZT5gXG4gICAgICAgIC8vIChgeyAuLi5tZXNzYWdlLCB3YWl0OiBhc3luYyAoKSA9PiAuLi4gfWApLiBTdHJpcCBgd2FpdGAgaGVyZSBzb1xuICAgICAgICAvLyBkb3duc3RyZWFtIHNlcmlhbGl6ZXJzIChlLmcuIHlhbWwuc3RyaW5naWZ5KSBkb24ndCBjaG9rZSBvbiB0aGVcbiAgICAgICAgLy8gQXN5bmNGdW5jdGlvbiB2YWx1ZS5cbiAgICAgICAgY29uc3QgeyB3YWl0OiBfd2FpdCwgLi4uY3JlYXRlUmVzcG9uc2UgfSA9IGF3YWl0IGNsaWVudC5nZW5pZS5jcmVhdGVNZXNzYWdlKFxuICAgICAgICAgIHsgc3BhY2VfaWQsIGNvbnZlcnNhdGlvbl9pZDogY29udmVyc2F0aW9uSWQsIGNvbnRlbnQgfSxcbiAgICAgICAgICBjdHgsXG4gICAgICAgICk7XG4gICAgICAgIG1lc3NhZ2VJZCA9IGNyZWF0ZVJlc3BvbnNlLm1lc3NhZ2VfaWQ7XG4gICAgICAgIHJldHVybiBjcmVhdGVSZXNwb25zZTtcbiAgICAgIH1cbiAgICAgIC8vIFN1YnNlcXVlbnQgcG9sbHM6IHJlLWZldGNoIHRoZSBjdXJyZW50IG1lc3NhZ2UgdW50aWwgaXRzIHN0YXR1cyBiZWNvbWVzXG4gICAgICAvLyB0ZXJtaW5hbC5cbiAgICAgIHJldHVybiBjbGllbnQuZ2VuaWUuZ2V0TWVzc2FnZShcbiAgICAgICAge1xuICAgICAgICAgIHNwYWNlX2lkLFxuICAgICAgICAgIGNvbnZlcnNhdGlvbl9pZDogY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgbWVzc2FnZV9pZDogbWVzc2FnZUlkLFxuICAgICAgICB9LFxuICAgICAgICBjdHgsXG4gICAgICApO1xuICAgIH07XG5cbiAgICB5aWVsZCogYXN5bmNVdGlscy5wb2xsKFxuICAgICAgYXN5bmMgKHBvbGxDdHg6IFBvbGxDb250ZXh0PEdlbmllTWVzc2FnZT4pID0+IHZhbGlkYXRlTWVzc2FnZShhd2FpdCBwb2xsUHJvZHVjZXIocG9sbEN0eCkpLFxuICAgICAge1xuICAgICAgICBpbnRlcnZhbE1zOiBvcHRpb25zPy5wb2xsSW50ZXJ2YWxNcyA/PyA1MDAsXG4gICAgICAgIC8vIFNraXAgeWllbGRpbmcgaWRlbnRpY2FsIGNvbnNlY3V0aXZlIHNuYXBzaG90czsgR2VuaWUgb2Z0ZW4gcmV0dXJuc1xuICAgICAgICAvLyB0aGUgZXhhY3Qgc2FtZSBwYXlsb2FkIHR3aWNlIGR1cmluZyBxdWlldCBwZXJpb2RzLiBgcG9sbGAgZG9lcyBhIGRlZXBcbiAgICAgICAgLy8gZXF1YWwgb24gdGhlIHByZXZpb3VzIHlpZWxkLlxuICAgICAgICBmaWx0ZXI6IFwiZGlzdGluY3RcIixcbiAgICAgICAgLy8gU3RvcCBhZnRlciB0aGUgdGVybWluYWwgbWVzc2FnZSBpcyB5aWVsZGVkLiBgcG9sbGAgY2hlY2tzIHRoZVxuICAgICAgICAvLyBwcmVkaWNhdGUgQUZURVIgeWllbGRpbmcsIHNvIHRoZSB0ZXJtaW5hbCBtZXNzYWdlIHN0aWxsIHJlYWNoZXMgdGhlXG4gICAgICAgIC8vIGNvbnN1bWVyLlxuICAgICAgICBwcmVkaWNhdGU6IChtKSA9PiAhZ2VuaWVNb2RlbC5pc1Rlcm1pbmFsU3RhdHVzKG0uc3RhdHVzKSxcbiAgICAgICAgLy8gV2FrZSB0aGUgaW50ZXItcG9sbCBzbGVlcCBvbiBhYm9ydCBzbyBhIGBmb3IgYXdhaXRgIGJyZWFrIChvclxuICAgICAgICAvLyBleHRlcm5hbCBhYm9ydCkgdGVhcnMgZG93biBwcm9tcHRseSBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHRoZVxuICAgICAgICAvLyBpbnRlcnZhbC5cbiAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDYW5jZWxzIGFueSBzdGlsbC1wZW5kaW5nIFNESyBjYWxsIGFuZCB0aGUgaW50ZXItcG9sbCBzbGVlcCB3aGV0aGVyIHdlJ3JlXG4gICAgLy8gdW53aW5kaW5nIGZyb20gYSBub3JtYWwgcmV0dXJuLCBhIGNvbnN1bWVyIGJyZWFrLCBvciBhIHRocm93biBlcnJvci5cbiAgICAvLyBJZGVtcG90ZW50LlxuICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhpZ2gtbGV2ZWw6IGdlbmllRXZlbnRDaGF0IC0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSB0dXJuIGFnYWluc3QgYSBHZW5pZSBzcGFjZSwgeWllbGRlZCBhcyBhIHR5cGVkIHtAbGluayBHZW5pZUNoYXRFdmVudH1cbiAqIHN0cmVhbS4gRHJpdmVzIHtAbGluayBnZW5pZUNoYXR9IHVuZGVybmVhdGggYW5kIGRlY29yYXRlcyBlYWNoIHNuYXBzaG90IHdpdGhcbiAqIHRoZSBkZXJpdmVkIGV2ZW50cyB0aGUgZmllbGQtbGV2ZWwgZGlmZiBwcm9kdWNlZC4gU3RyZWFtIG9yZGVyOlxuICpcbiAqICAgMS4gYHsgdHlwZTogXCJtZXNzYWdlXCIsIG1lc3NhZ2UgfWAgLSB0aGUgcmF3IGBHZW5pZU1lc3NhZ2VgLCBvbmNlIHBlciBwb2xsXG4gKiAgICAgIHlpZWxkLlxuICogICAyLiBgeyB0eXBlOiBcInF1ZXN0aW9uXCIsIGNvbnRlbnQsIG1lc3NhZ2VfaWQsIC4uLiB9YCBmaXJlcyBleGFjdGx5IG9uY2UsIG9uXG4gKiAgICAgIHRoZSBGSVJTVCBgbWVzc2FnZWAgeWllbGQuIFdlIHJlYWQgYGNvbnRlbnRgIGFuZCBgbWVzc2FnZV9pZGAgc3RyYWlnaHRcbiAqICAgICAgb2ZmIHRoZSBzbmFwc2hvdCBzbyBldmVyeSBkb3duc3RyZWFtIGV2ZW50IGZvciB0aGlzIHR1cm4gc2hhcmVzIHRoZSBzYW1lXG4gKiAgICAgIGBtZXNzYWdlX2lkYCAodGhlIHF1ZXN0aW9uIGluY2x1ZGVkKSAtIHN1YnNjcmliZXJzIGNhbiBncm91cCBldmVyeXRoaW5nXG4gKiAgICAgIGZvciBvbmUgR2VuaWUgY2FsbCB1bmRlciB0aGF0IG9uZSBrZXkuXG4gKiAgIDMuIEFueSBvZiBgc3RhdHVzYCAvIGBhdHRhY2htZW50YCAvIGB0aGlua2luZ2AgLyBgdGV4dGAgLyBgcXVlcnlgIC9cbiAqICAgICAgYHN0YXRlbWVudGAgLyBgcm93c2AgLyBgc3VnZ2VzdGVkX3F1ZXN0aW9uc2AgdGhlIGRpZmYgYWdhaW5zdCB0aGUgcHJpb3JcbiAqICAgICAgc25hcHNob3QgcHJvZHVjZWQuXG4gKiAgIDQuIE9uIHRoZSB0ZXJtaW5hbCBzbmFwc2hvdCwgYHsgdHlwZTogXCJyZXN1bHRcIiwgLi4uIH1gIGFzIHRoZSBmaW5hbCB5aWVsZC5cbiAqXG4gKiBFcnJvcnMgcHJvcGFnYXRlIGJ5IHRoZSBnZW5lcmF0b3IgdGhyb3dpbmcgLSB0aGVyZSdzIG5vIGBcImVycm9yXCJgIHZhcmlhbnQuXG4gKiBXcmFwIHRoZSBgZm9yIGF3YWl0YCBpbiBgdHJ5L2NhdGNoYCBpZiB5b3UgbmVlZCB0byBoYW5kbGUgZmFpbHVyZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGZvciBhd2FpdCAoY29uc3QgZXZ0IG9mIGdlbmllRXZlbnRDaGF0KHNwYWNlSWQsIFwiVG9wIHN0b3Jlcz9cIikpIHtcbiAqICAgc3dpdGNoIChldnQudHlwZSkge1xuICogICAgIGNhc2UgXCJ0aGlua2luZ1wiOlxuICogICAgICAgY29uc29sZS5sb2coXCJbdGhpbmtpbmddXCIsIGV2dC50aG91Z2h0X3R5cGUsIGV2dC50ZXh0KTtcbiAqICAgICAgIGJyZWFrO1xuICogICAgIGNhc2UgXCJ0ZXh0XCI6XG4gKiAgICAgICBjb25zb2xlLmxvZyhcIlt0ZXh0XVwiLCBldnQudGV4dCk7XG4gKiAgICAgICBicmVhaztcbiAqICAgICBjYXNlIFwicmVzdWx0XCI6XG4gKiAgICAgICBjb25zb2xlLmxvZyhcIltkb25lXVwiLCBldnQuc3RhdHVzKTtcbiAqICAgICAgIGJyZWFrO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiogZ2VuaWVFdmVudENoYXQoXG4gIHNwYWNlX2lkOiBzdHJpbmcsXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IEdlbmllQ2hhdE9wdGlvbnMsXG4pOiBBc3luY0dlbmVyYXRvcjxHZW5pZUNoYXRFdmVudCwgdm9pZCwgdm9pZD4ge1xuICAvLyBEaWZmIHNvdXJjZSBmb3IgdGhlIGN1cnJlbnQgdHVybi4gQWx3YXlzIGB1bmRlZmluZWRgIG9uIHRoZSBmaXJzdCBzbmFwc2hvdFxuICAvLyBzbyB0aGUgaW5pdGlhbCBzdGF0dXMgLyBhdHRhY2htZW50cyBlbWl0IGZyZXNoOyB1cGRhdGVkIHRvIHRoZSBtb3N0IHJlY2VudFxuICAvLyBzbmFwc2hvdCBhZnRlciBlYWNoIHlpZWxkLlxuICBsZXQgcHJldmlvdXM6IEdlbmllTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgLy8gVGhlIGBxdWVzdGlvbmAgZXZlbnQgaXMgZGVmZXJyZWQgdG8gdGhlIGZpcnN0IGBtZXNzYWdlYCB5aWVsZCBzbyBpdCBjYW5cbiAgLy8gY2FycnkgdGhlIGFzc2lnbmVkIGBtZXNzYWdlX2lkYCAoc3Vic2NyaWJlcnMgdXNlIGl0IGFzIHRoZSBncm91cGluZyBrZXkgZm9yXG4gIC8vIGV2ZXJ5IGV2ZW50IGluIHRoaXMgdHVybikuIFRoZSBmaXJzdCBzbmFwc2hvdCBpcyB0aGUgZWFybGllc3QgcG9pbnQgdGhhdCBpZFxuICAvLyBleGlzdHMuXG4gIGxldCBxdWVzdGlvbkVtaXR0ZWQgPSBmYWxzZTtcbiAgZm9yIGF3YWl0IChjb25zdCByYXdNZXNzYWdlIG9mIGdlbmllQ2hhdChzcGFjZV9pZCwgY29udGVudCwgb3B0aW9ucykpIHtcbiAgICAvLyBOb3JtYWxpemUgYG1lc3NhZ2VfaWRgIGZyb20gdGhlIGxlZ2FjeSBgaWRgIGZpZWxkIHdoZW4gR2VuaWUncyB3aXJlXG4gICAgLy8gcmVzcG9uc2Ugb25seSBwb3B1bGF0ZXMgb25lIG9mIHRoZW0uIFRoZSBTREsgc2NoZW1hIG1hcmtzIGJvdGggYXNcbiAgICAvLyByZXF1aXJlZCwgYnV0IGluIHByYWN0aWNlIHRoZSBgc3RhcnRDb252ZXJzYXRpb25gIC8gYGNyZWF0ZU1lc3NhZ2VgIGlubmVyXG4gICAgLy8gYG1lc3NhZ2VgIHBheWxvYWQgc29tZXRpbWVzIHNoaXBzIG9ubHkgYGlkYCB3aGlsZSB0aGUgbmV3IGBtZXNzYWdlX2lkYFxuICAgIC8vIGZpZWxkIGxhbmRzIHVuZGVmaW5lZC4gRXZlcnkgZG93bnN0cmVhbSBldmVudCBkZXRlY3RvciBrZXlzIGdyb3VwaW5nIG9mZlxuICAgIC8vIGBtZXNzYWdlX2lkYDsgdGhlIGZhbGxiYWNrIGtlZXBzIG9uZSBHZW5pZSB0dXJuJ3MgZXZlbnRzIGZyb20gc3BsaXR0aW5nXG4gICAgLy8gYWNyb3NzIGFuIGFub24gZ3JvdXAgKyB0aGUgcmVhbC1pZCBncm91cCB3aGVuIHN1YnNjcmliZXJzIGJ1Y2tldCBieVxuICAgIC8vIGBtZXNzYWdlX2lkYC5cbiAgICBjb25zdCBtZXNzYWdlOiBHZW5pZU1lc3NhZ2UgPSByYXdNZXNzYWdlLm1lc3NhZ2VfaWRcbiAgICAgID8gcmF3TWVzc2FnZVxuICAgICAgOiB7IC4uLnJhd01lc3NhZ2UsIG1lc3NhZ2VfaWQ6IHJhd01lc3NhZ2UuaWQgfTtcbiAgICB5aWVsZCB7XG4gICAgICB0eXBlOiBcIm1lc3NhZ2VcIixcbiAgICAgIHNwYWNlX2lkOiBtZXNzYWdlLnNwYWNlX2lkLFxuICAgICAgbWVzc2FnZV9pZDogbWVzc2FnZS5tZXNzYWdlX2lkLFxuICAgICAgbWVzc2FnZSxcbiAgICB9O1xuICAgIGlmICghcXVlc3Rpb25FbWl0dGVkKSB7XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHR5cGU6IFwicXVlc3Rpb25cIixcbiAgICAgICAgc3BhY2VfaWQ6IG1lc3NhZ2Uuc3BhY2VfaWQsXG4gICAgICAgIC4uLihtZXNzYWdlLmNvbnZlcnNhdGlvbl9pZCA/IHsgY29udmVyc2F0aW9uX2lkOiBtZXNzYWdlLmNvbnZlcnNhdGlvbl9pZCB9IDoge30pLFxuICAgICAgICAuLi4obWVzc2FnZS5tZXNzYWdlX2lkID8geyBtZXNzYWdlX2lkOiBtZXNzYWdlLm1lc3NhZ2VfaWQgfSA6IHt9KSxcbiAgICAgICAgY29udGVudDogbWVzc2FnZS5jb250ZW50LFxuICAgICAgfTtcbiAgICAgIHF1ZXN0aW9uRW1pdHRlZCA9IHRydWU7XG4gICAgfVxuICAgIHlpZWxkKiBldmVudC5ldmVudHNGcm9tTWVzc2FnZShtZXNzYWdlLCBwcmV2aW91cywgbWVzc2FnZS5zcGFjZV9pZCk7XG4gICAgY29uc3Qgc3RhdHVzID0gbWVzc2FnZS5zdGF0dXM7XG4gICAgaWYgKGdlbmllTW9kZWwuaXNUZXJtaW5hbFN0YXR1cyhzdGF0dXMpKSB7XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHR5cGU6IFwicmVzdWx0XCIsXG4gICAgICAgIHNwYWNlX2lkOiBtZXNzYWdlLnNwYWNlX2lkLFxuICAgICAgICBjb252ZXJzYXRpb25faWQ6IG1lc3NhZ2UuY29udmVyc2F0aW9uX2lkLFxuICAgICAgICBtZXNzYWdlX2lkOiBtZXNzYWdlLm1lc3NhZ2VfaWQsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgIH07XG4gICAgfVxuICAgIHByZXZpb3VzID0gbWVzc2FnZTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHdvcmtzcGFjZSBjbGllbnQgaGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFJlc29sdmUgYSBgV29ya3NwYWNlQ2xpZW50YCBpbiB0aGlzIHByZWZlcmVuY2Ugb3JkZXI6XG4gKlxuICogICAxLiBDYWxsZXItc3VwcGxpZWQgYG9wdGlvbnMud29ya3NwYWNlQ2xpZW50YC5cbiAqICAgMi4gQXBwS2l0J3MgcGVyLXJlcXVlc3QgZXhlY3V0aW9uLWNvbnRleHQgY2xpZW50IGluc2lkZSBhIHJlcXVlc3Qgc2NvcGUuXG4gKiAgIDMuIEZyZXNoIG5hdGl2ZSBBcHBLaXQgYGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpYC5cbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFdvcmtzcGFjZUNsaWVudChvcHRpb25zPzogR2VuaWVDaGF0T3B0aW9ucyk6IFByb21pc2U8V29ya3NwYWNlQ2xpZW50PiB7XG4gIGlmIChvcHRpb25zPy53b3Jrc3BhY2VDbGllbnQpIHJldHVybiBvcHRpb25zLndvcmtzcGFjZUNsaWVudDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTm90IGluc2lkZSBhbiBBcHBLaXQgcmVxdWVzdCBjb250ZXh0OyBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCBhdXRoLlxuICB9XG4gIHJldHVybiBjcmVhdGVXb3Jrc3BhY2VDbGllbnQoKTtcbn1cbiJdfQ==
285
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBRUgsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixtQkFBbUIsR0FFcEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFvQixNQUFNLHdCQUF3QixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUEwQyxNQUFNLHlCQUF5QixDQUFDO0FBRXBHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFeEM7Ozs7Ozs7R0FPRztBQUNILFNBQVMsZUFBZSxDQUFDLEdBQWlCO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUQsSUFBSSxNQUFNLENBQUMsT0FBTztRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztJQUN2QyxNQUFNLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFO1FBQ3ZDLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQ3BDLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNO0tBQ25DLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQXlDRCwwRUFBMEU7QUFFMUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBQ0gsTUFBTSxDQUFDLEtBQUss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QUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTzthQUN6QixDQUFDO1lBQ0YsZUFBZSxHQUFHLElBQUksQ0FBQztRQUN6QixDQUFDO1FBQ0QsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDOUIsSUFBSSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNO2dCQUNKLElBQUksRUFBRSxRQUFRO2dCQUNkLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtnQkFDMUIsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlO2dCQUN4QyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7Z0JBQzlCLE1BQU07Z0JBQ04sT0FBTzthQUNSLENBQUM7UUFDSixDQUFDO1FBQ0QsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUNyQixDQUFDO0FBQ0gsQ0FBQztBQUVELDBFQUEwRTtBQUUxRTs7Ozs7OztHQU9HO0FBQ0gsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE9BQTBCO0lBQzFELElBQUksT0FBTyxFQUFFLGVBQWU7UUFBRSxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUM7SUFDN0QsSUFBSSxDQUFDO1FBQ0gsT0FBTyxtQkFBbUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUN0QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1Asc0VBQXNFO0lBQ3hFLENBQUM7SUFDRCxPQUFPLHFCQUFxQixFQUFFLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuaWUgY2hhdCBkcml2ZXIuXG4gKlxuICogRHJpdmVzIGEgc2luZ2xlIHR1cm4gYWdhaW5zdCBhIEdlbmllIHNwYWNlIGZyb20gb25lIGBjb250ZW50YCBzdHJpbmc7XG4gKiBtdWx0aS10dXJuIGNvbnZlcnNhdGlvbnMgYXJlIHRoZSBjYWxsZXIncyBqb2IgKHRocmVhZCB0aGUgYGNvbnZlcnNhdGlvbl9pZGBcbiAqIHJldHVybmVkIG9uIGVhY2ggYEdlbmllTWVzc2FnZWAgYmFjayBpbnRvIHRoZSBuZXh0IHR1cm4nc1xuICogYG9wdGlvbnMuY29udmVyc2F0aW9uSWRgKS5cbiAqXG4gKiBBZ2VudCBNb2RlIFNTRSBpcyB0aGUgZGVmYXVsdCB0cmFuc3BvcnQuIEl0cyBSZXNwb25zZXMtc3R5bGUgcmVhc29uaW5nLCBTUUwsXG4gKiBxdWVyeSBvdXRwdXQsIGFuZCBmaW5hbCBhbnN3ZXIgaXRlbXMgYXJlIHByb2plY3RlZCBpbnRvIGBHZW5pZU1lc3NhZ2VgXG4gKiBzbmFwc2hvdHM7IGBhZ2VudE1vZGU6IGZhbHNlYCByZXRhaW5zIHRoZSBDb252ZXJzYXRpb24gQVBJIHBvbGxpbmcgcGF0aC5cbiAqXG4gKiBUd28gbGF5ZXJzIHNlcnZlIHR3byBraW5kcyBvZiBjb25zdW1lci4gVGhlIGxvdy1sZXZlbCBsYXllciB5aWVsZHMgZXZlcnlcbiAqIG9ic2VydmVkIGBHZW5pZU1lc3NhZ2VgICh2YWxpZGF0ZWQgYWdhaW5zdCBgR2VuaWVNZXNzYWdlU2NoZW1hYCwgZmFsbGluZyBiYWNrXG4gKiB0byB0aGUgcmF3IHNuYXBzaG90IG9uIGEgc2NoZW1hIG1pc3MpIGFuZCBvd25zIGNhbmNlbGxhdGlvbiwgY29udmVyc2F0aW9uXG4gKiBzZWVkaW5nLCBkaXN0aW5jdC1maWx0ZXJpbmcsIGFuZCBTREsgcXVpcmtzOyByZWFjaCBmb3IgaXQgd2hlbiB5b3Ugd2FudCB0aGVcbiAqIHJhdyBzdHJlYW0uIFRoZVxuICogaGlnaC1sZXZlbCBsYXllciB3cmFwcyBpdCBhbmQgZW1pdHMgc2VtYW50aWMsIGRlZHVwbGljYXRlZCBgeyB0eXBlLCBwYXlsb2FkIH1gXG4gKiBldmVudHMgKHNlZSB7QGxpbmsgR2VuaWVDaGF0RXZlbnR9KSwgYWx3YXlzIGNsb3NpbmcgYSBzdWNjZXNzZnVsIHR1cm4gd2l0aCBhXG4gKiB0ZXJtaW5hbCBgcmVzdWx0YCBldmVudCBjYXJyeWluZyB0aGUgZmluYWwgYEdlbmllTWVzc2FnZWA7IGVycm9ycyBwcm9wYWdhdGVcbiAqIGJ5IHRocm93aW5nLCB3aXRoIG5vIGBlcnJvcmAgdmFyaWFudC4gSXRlcmF0aW5nIFVJIC8gYWdlbnQgY29kZSB0aGF0IHdhbnRzXG4gKiBldmVyeSBtZXNzYWdlIHZlcmJhdGltIHRha2VzIHRoZSBsb3ctbGV2ZWwgc3RyZWFtOyBzdWJzY3JpYmVycyByZWFjdGluZyB0b1xuICogXCJHZW5pZSBpcyB0aGlua2luZyBhYm91dCBYXCIgb3IgXCJHZW5pZSBwcm9kdWNlZCB0ZXh0IFlcIiB0YWtlIHRoZSBldmVudCBsYXllci5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgY3JlYXRlV29ya3NwYWNlQ2xpZW50LFxuICBnZXRFeGVjdXRpb25Db250ZXh0LFxuICB0eXBlIFdvcmtzcGFjZUNsaWVudCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZGF0YWJyaWNrcyB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXN5bmNVdGlscywgZXJyb3JVdGlscywgbG9nLCB0eXBlIFBvbGxDb250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGV2ZW50LCBnZW5pZU1vZGVsLCB0eXBlIEdlbmllQ2hhdEV2ZW50LCB0eXBlIEdlbmllTWVzc2FnZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1nZW5pZVwiO1xuXG5pbXBvcnQgeyBnZW5pZUFnZW50TW9kZUNoYXQsIGlzQWdlbnRNb2RlVW5hdmFpbGFibGUgfSBmcm9tIFwiLi9hZ2VudC1tb2RlLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJnZW5pZS9jaGF0XCIpO1xuXG4vKipcbiAqIFZhbGlkYXRlIGEgcG9sbGVkIHdpcmUgc25hcHNob3QgYWdhaW5zdCB7QGxpbmsgR2VuaWVNZXNzYWdlU2NoZW1hfVxuICogYW5kIHJldHVybiB0aGUgc2NoZW1hLW5vcm1hbGl6ZWQgbWVzc2FnZS4gR2VuaWUncyB3aXJlIG9jY2FzaW9uYWxseSBzaGlwcyBhXG4gKiBzaGFwZSB0aGUgKFNESy1kZXJpdmVkKSBzY2hlbWEgZG9lc24ndCBtb2RlbCBleGFjdGx5IC0gZS5nLiBhbiBlYXJseSBwb2xsXG4gKiB0aGF0IG9taXRzIHRoZSBTREstcmVxdWlyZWQgYG1lc3NhZ2VfaWRgIC0gc28gYSBtaXNzIGRlZ3JhZGVzIHRvIHRoZSByYXdcbiAqIHNuYXBzaG90IHJhdGhlciB0aGFuIHRocm93aW5nLCBrZWVwaW5nIGEgc2luZ2xlIG9kZCBwb2xsIGZyb20gYWJvcnRpbmcgdGhlXG4gKiB3aG9sZSB0dXJuLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU1lc3NhZ2UocmF3OiBHZW5pZU1lc3NhZ2UpOiBHZW5pZU1lc3NhZ2Uge1xuICBjb25zdCByZXN1bHQgPSBnZW5pZU1vZGVsLkdlbmllTWVzc2FnZVNjaGVtYS5zYWZlUGFyc2UocmF3KTtcbiAgaWYgKHJlc3VsdC5zdWNjZXNzKSByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIGxvZ2dlci5kZWJ1ZyhcIndpcmUtbWVzc2FnZTpzY2hlbWEtbWlzc1wiLCB7XG4gICAgbWVzc2FnZV9pZDogcmF3Lm1lc3NhZ2VfaWQgPz8gcmF3LmlkLFxuICAgIGlzc3VlczogcmVzdWx0LmVycm9yLmlzc3Vlcy5sZW5ndGgsXG4gIH0pO1xuICByZXR1cm4gcmF3O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzaGFyZWQgb3B0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogT3B0aW9ucyBhY2NlcHRlZCBieSBib3RoIHtAbGluayBnZW5pZUNoYXR9IGFuZCB7QGxpbmsgZ2VuaWVFdmVudENoYXR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5pZUNoYXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgc3RyZWFtaW5nIEdlbmllIEFnZW50IE1vZGUgQVBJLiBEZWZhdWx0cyB0byBgdHJ1ZWA7IHNldCBgZmFsc2VgIHRvXG4gICAqIGZvcmNlIHRoZSBsZWdhY3kgc3RhcnQvY3JlYXRlL2dldC1tZXNzYWdlIHBvbGxpbmcgZmxvdy5cbiAgICovXG4gIGFnZW50TW9kZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGYWxsIGJhY2sgdG8gQ29udmVyc2F0aW9uIEFQSSBwb2xsaW5nIHdoZW4gQWdlbnQgTW9kZSBpcyB1bmF2YWlsYWJsZS5cbiAgICogRGVmYXVsdHMgdG8gYHRydWVgOyBzZXQgYGZhbHNlYCB3aGVuIHRoZSBjYWxsZXIgcmVxdWlyZXMgQWdlbnQgTW9kZS5cbiAgICovXG4gIGFnZW50TW9kZUZhbGxiYWNrPzogYm9vbGVhbjtcbiAgLyoqIEFzayBBZ2VudCBNb2RlIHRvIGdlbmVyYXRlIHZpc3VhbGl6YXRpb25zIHdoZW4gYXBwcm9wcmlhdGUuICovXG4gIGVuYWJsZVZpc3VhbGl6YXRpb24/OiBib29sZWFuO1xuICAvKipcbiAgICogQ29udGludWUgYW4gZXhpc3RpbmcgY29udmVyc2F0aW9uLiBBZ2VudCBNb2RlIHNlbmRzIGl0IGFzXG4gICAqIGBjb252ZXJzYXRpb25faWRgOyBsZWdhY3kgcG9sbGluZyBwYXNzZXMgaXQgdG8gYGNyZWF0ZU1lc3NhZ2VgLiBSZWFkIHRoZSBpZFxuICAgKiBmcm9tIHRoZSBwcmlvciB0dXJuJ3MgdGVybWluYWwgYEdlbmllTWVzc2FnZWAgb3IgYHJlc3VsdGAgZXZlbnQuXG4gICAqL1xuICBjb252ZXJzYXRpb25JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIEV4cGxpY2l0IGBXb3Jrc3BhY2VDbGllbnRgLiBEZWZhdWx0cyB0byBBcHBLaXQncyBwZXItcmVxdWVzdFxuICAgKiBleGVjdXRpb24tY29udGV4dCBjbGllbnQgd2hlbiBBcHBLaXQgaXMgaW5zdGFsbGVkIGFuZCB3ZSdyZSBpbnNpZGUgYVxuICAgKiByZXF1ZXN0OyBmYWxscyBiYWNrIHRvIGBjcmVhdGVXb3Jrc3BhY2VDbGllbnQoKWAgKGRlZmF1bHQgYXV0aClcbiAgICogb3RoZXJ3aXNlLlxuICAgKi9cbiAgd29ya3NwYWNlQ2xpZW50PzogV29ya3NwYWNlQ2xpZW50O1xuICAvKiogTGVnYWN5IGZhbGxiYWNrIGNhZGVuY2UgYmV0d2VlbiBzdWNjZXNzaXZlIGBnZXRNZXNzYWdlYCBjYWxscyAoZGVmYXVsdCA1MDBtcykuICovXG4gIHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiBBY2NlcHRzIGEgV0hBVFdHIGBBYm9ydFNpZ25hbGAgb3IgYSBmdWxseS1idWlsdCBTREtcbiAgICogYENvbnRleHRgIChzZWUgYGRhdGFicmlja3MuQ29udGV4dExpa2VgKS4gQWJvcnRpbmcgaXQgY2FuY2VscyBldmVyeSBpbi1mbGlnaHRcbiAgICogQWdlbnQgTW9kZSBzdHJlYW0sIFNESyBjYWxsLCBhbmQgdGhlIG5leHQgaW50ZXItcG9sbCBzbGVlcC5cbiAgICovXG4gIGNvbnRleHQ/OiBkYXRhYnJpY2tzLkNvbnRleHRMaWtlO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsb3ctbGV2ZWw6IGdlbmllQ2hhdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSB0dXJuIGFnYWluc3QgYSBHZW5pZSBzcGFjZSwgeWllbGRlZCBhcyBhIHN0cmVhbSBvZiBgR2VuaWVNZXNzYWdlYFxuICogc25hcHNob3RzLlxuICpcbiAqIFR1cm4gbGlmZWN5Y2xlOlxuICpcbiAqICAgLSBBZ2VudCBNb2RlIChkZWZhdWx0KTogUE9TVCBvbmUgUmVzcG9uc2VzLXN0eWxlIG1lc3NhZ2UgdG9cbiAqICAgICBgL2FwaS8yLjAvZ2VuaWUvYWdlbnRzL3tpZH0vcmVzcG9uc2VzYCBhbmQgeWllbGQgcHJvamVjdGVkIHNuYXBzaG90cyBmcm9tXG4gKiAgICAgaXRzIFNTRSBldmVudHMuXG4gKiAgIC0gTGVnYWN5IHBvbGxpbmcgKGBhZ2VudE1vZGU6IGZhbHNlYCk6IHN0YXJ0L2NyZWF0ZSBhIENvbnZlcnNhdGlvbiBBUElcbiAqICAgICBtZXNzYWdlIGFuZCBwb2xsIGBnZXRNZXNzYWdlYCB1bnRpbCB0ZXJtaW5hbC5cbiAqICAgLSBBIHByZS1zdHJlYW0gYEZFQVRVUkVfRElTQUJMRURgIG9yIHByZXZpZXctdG9nZ2xlIHJlc3BvbnNlIGZhbGxzIGJhY2sgdG9cbiAqICAgICBsZWdhY3kgcG9sbGluZyBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIENhbmNlbGxhdGlvbjogYSBzaW5nbGUgaW50ZXJuYWwgYEFib3J0Q29udHJvbGxlcmAgY292ZXJzIHRoZSB3aG9sZSB0dXJuLlxuICogYG9wdGlvbnMuY29udGV4dGAgaXMgdGllZCBpbnRvIHRoYXQgY29udHJvbGxlciBzbyBhbiBleHRlcm5hbCBhYm9ydCB0ZWFyc1xuICogZG93biB0aGUgQWdlbnQgTW9kZSBTU0UgY29ubmVjdGlvbiwgU0RLIGNhbGxzLCBhbmQgYW55IGludGVyLXBvbGwgc2xlZXAuXG4gKiBCcmVha2luZyBvdXQgb2YgdGhlIGBmb3IgYXdhaXRgIGFsc28gaW52b2tlcyB0aGUgQWdlbnQgTW9kZSBzZXJ2ZXItc2lkZVxuICogY2FuY2VsIGVuZHBvaW50IGJlZm9yZSB0aGUgZ2VuZXJhdG9yIGNsb3Nlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2luZ2xlIHR1cm4uXG4gKiBmb3IgYXdhaXQgKGNvbnN0IG0gb2YgZ2VuaWVDaGF0KHNwYWNlSWQsIFwiVG9wIDUgc3RvcmVzP1wiKSkge1xuICogICByZW5kZXIobSk7XG4gKiB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE11bHRpLXR1cm46IGNhbGxlciB0aHJlYWRzIHRoZSBjb252ZXJzYXRpb24gaWQuXG4gKiBsZXQgY29udmVyc2F0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAqIGZvciAoY29uc3QgcXVlc3Rpb24gb2YgcXVlc3Rpb25zKSB7XG4gKiAgIGZvciBhd2FpdCAoY29uc3QgbSBvZiBnZW5pZUNoYXQoc3BhY2VJZCwgcXVlc3Rpb24sIHsgY29udmVyc2F0aW9uSWQgfSkpIHtcbiAqICAgICBjb252ZXJzYXRpb25JZCA9IG0uY29udmVyc2F0aW9uX2lkID8/IGNvbnZlcnNhdGlvbklkO1xuICogICAgIHJlbmRlcihtKTtcbiAqICAgfVxuICogfVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24qIGdlbmllQ2hhdChcbiAgc3BhY2VfaWQ6IHN0cmluZyxcbiAgY29udGVudDogc3RyaW5nLFxuICBvcHRpb25zPzogR2VuaWVDaGF0T3B0aW9ucyxcbik6IEFzeW5jR2VuZXJhdG9yPEdlbmllTWVzc2FnZSwgdm9pZCwgdm9pZD4ge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICB0cnkge1xuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IGdldFdvcmtzcGFjZUNsaWVudChvcHRpb25zKTtcbiAgICAvLyBCdWlsZCB0aGUgU0RLIENvbnRleHQgT05DRS4gQnVpbGRpbmcgaXQgaW5zaWRlIHRoZSBwb2xsIHByb2R1Y2VyIHdvdWxkXG4gICAgLy8gcmUtYXR0YWNoIGFuIGFib3J0IGxpc3RlbmVyIHRvIGBvcHRpb25zLmNvbnRleHRgIG9uIGV2ZXJ5IHBvbGwgaXRlcmF0aW9uXG4gICAgLy8gKHZpYSBgZGF0YWJyaWNrcy50b0NvbnRleHRgIC0+IGBhc3luYy50aWVBYm9ydFNpZ25hbGApLCBldmVudHVhbGx5IHRyaXBwaW5nXG4gICAgLy8gTm9kZSdzIGBNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmdgLlxuICAgIGNvbnN0IGN0eCA9IGRhdGFicmlja3MudG9Db250ZXh0KGNvbnRyb2xsZXIsIG9wdGlvbnM/LmNvbnRleHQpO1xuICAgIGlmIChvcHRpb25zPy5hZ2VudE1vZGUgIT09IGZhbHNlKSB7XG4gICAgICBsZXQgeWllbGRlZCA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBtZXNzYWdlIG9mIGdlbmllQWdlbnRNb2RlQ2hhdChjbGllbnQsIHNwYWNlX2lkLCBjb250ZW50LCB7XG4gICAgICAgICAgLi4uKG9wdGlvbnM/LmNvbnZlcnNhdGlvbklkID8geyBjb252ZXJzYXRpb25JZDogb3B0aW9ucy5jb252ZXJzYXRpb25JZCB9IDoge30pLFxuICAgICAgICAgIC4uLihvcHRpb25zPy5lbmFibGVWaXN1YWxpemF0aW9uID8geyBlbmFibGVWaXN1YWxpemF0aW9uOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgY29udGV4dDogY3R4LFxuICAgICAgICB9KSkge1xuICAgICAgICAgIHlpZWxkZWQgPSB0cnVlO1xuICAgICAgICAgIHlpZWxkIHZhbGlkYXRlTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LmFnZW50TW9kZUZhbGxiYWNrID09PSBmYWxzZSB8fCB5aWVsZGVkIHx8ICFpc0FnZW50TW9kZVVuYXZhaWxhYmxlKGVycikpIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLndhcm4oXCJhZ2VudC1tb2RlOnVuYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gcG9sbGluZ1wiLCB7XG4gICAgICAgICAgc3BhY2VfaWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGNvbnZlcnNhdGlvbklkID0gb3B0aW9ucz8uY29udmVyc2F0aW9uSWQ7XG4gICAgbGV0IG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcG9sbFByb2R1Y2VyID0gYXN5bmMgKHBvbGxDdHg6IFBvbGxDb250ZXh0PEdlbmllTWVzc2FnZT4pOiBQcm9taXNlPEdlbmllTWVzc2FnZT4gPT4ge1xuICAgICAgaWYgKCFjb252ZXJzYXRpb25JZCkge1xuICAgICAgICAvLyBGaXJzdCBwb2xsOiBvcGVuIHRoZSBjb252ZXJzYXRpb24uIFJlZnVzZSB0byByZXRyeTogaWZcbiAgICAgICAgLy8gYHN0YXJ0Q29udmVyc2F0aW9uYCByZXR1cm5lZCBhIHJlc3BvbnNlIHdpdGhvdXQgYSBgY29udmVyc2F0aW9uX2lkYCxcbiAgICAgICAgLy8gcmV0cnlpbmcgd291bGQganVzdCBvcGVuIGNvbnZlcnNhdGlvbiBhZnRlciBjb252ZXJzYXRpb24uXG4gICAgICAgIGlmIChwb2xsQ3R4LmF0dGVtcHQgPiAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuaWUgZGlkIG5vdCByZXR1cm4gYSBjb252ZXJzYXRpb24gaWQ7IHJlZnVzaW5nIHRvIHJldHJ5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0UmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2VuaWUuc3RhcnRDb252ZXJzYXRpb24oeyBzcGFjZV9pZCwgY29udGVudCB9LCBjdHgpO1xuICAgICAgICBjb252ZXJzYXRpb25JZCA9IHN0YXJ0UmVzcG9uc2UuY29udmVyc2F0aW9uX2lkO1xuICAgICAgICBtZXNzYWdlSWQgPSBzdGFydFJlc3BvbnNlLm1lc3NhZ2VfaWQ7XG4gICAgICAgIHJldHVybiBzdGFydFJlc3BvbnNlLm1lc3NhZ2UhO1xuICAgICAgfVxuICAgICAgaWYgKCFtZXNzYWdlSWQpIHtcbiAgICAgICAgLy8gRmlyc3QgcG9sbCBvZiBhIGZvbGxvdy11cCB0dXJuOiBhcHBlbmQgdG8gdGhlIHNlZWRlZCBjb252ZXJzYXRpb24uXG4gICAgICAgIC8vIGBjbGllbnQuZ2VuaWUuY3JlYXRlTWVzc2FnZWAgcmV0dXJucyBhIGBXYWl0ZXI8R2VuaWVNZXNzYWdlPmBcbiAgICAgICAgLy8gKGB7IC4uLm1lc3NhZ2UsIHdhaXQ6IGFzeW5jICgpID0+IC4uLiB9YCkuIFN0cmlwIGB3YWl0YCBoZXJlIHNvXG4gICAgICAgIC8vIGRvd25zdHJlYW0gc2VyaWFsaXplcnMgKGUuZy4geWFtbC5zdHJpbmdpZnkpIGRvbid0IGNob2tlIG9uIHRoZVxuICAgICAgICAvLyBBc3luY0Z1bmN0aW9uIHZhbHVlLlxuICAgICAgICBjb25zdCB7IHdhaXQ6IF93YWl0LCAuLi5jcmVhdGVSZXNwb25zZSB9ID0gYXdhaXQgY2xpZW50LmdlbmllLmNyZWF0ZU1lc3NhZ2UoXG4gICAgICAgICAgeyBzcGFjZV9pZCwgY29udmVyc2F0aW9uX2lkOiBjb252ZXJzYXRpb25JZCwgY29udGVudCB9LFxuICAgICAgICAgIGN0eCxcbiAgICAgICAgKTtcbiAgICAgICAgbWVzc2FnZUlkID0gY3JlYXRlUmVzcG9uc2UubWVzc2FnZV9pZDtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVJlc3BvbnNlO1xuICAgICAgfVxuICAgICAgLy8gU3Vic2VxdWVudCBwb2xsczogcmUtZmV0Y2ggdGhlIGN1cnJlbnQgbWVzc2FnZSB1bnRpbCBpdHMgc3RhdHVzIGJlY29tZXNcbiAgICAgIC8vIHRlcm1pbmFsLlxuICAgICAgcmV0dXJuIGNsaWVudC5nZW5pZS5nZXRNZXNzYWdlKFxuICAgICAgICB7XG4gICAgICAgICAgc3BhY2VfaWQsXG4gICAgICAgICAgY29udmVyc2F0aW9uX2lkOiBjb252ZXJzYXRpb25JZCxcbiAgICAgICAgICBtZXNzYWdlX2lkOiBtZXNzYWdlSWQsXG4gICAgICAgIH0sXG4gICAgICAgIGN0eCxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIHlpZWxkKiBhc3luY1V0aWxzLnBvbGwoXG4gICAgICBhc3luYyAocG9sbEN0eDogUG9sbENvbnRleHQ8R2VuaWVNZXNzYWdlPikgPT4gdmFsaWRhdGVNZXNzYWdlKGF3YWl0IHBvbGxQcm9kdWNlcihwb2xsQ3R4KSksXG4gICAgICB7XG4gICAgICAgIGludGVydmFsTXM6IG9wdGlvbnM/LnBvbGxJbnRlcnZhbE1zID8/IDUwMCxcbiAgICAgICAgLy8gU2tpcCB5aWVsZGluZyBpZGVudGljYWwgY29uc2VjdXRpdmUgc25hcHNob3RzOyBHZW5pZSBvZnRlbiByZXR1cm5zXG4gICAgICAgIC8vIHRoZSBleGFjdCBzYW1lIHBheWxvYWQgdHdpY2UgZHVyaW5nIHF1aWV0IHBlcmlvZHMuIGBwb2xsYCBkb2VzIGEgZGVlcFxuICAgICAgICAvLyBlcXVhbCBvbiB0aGUgcHJldmlvdXMgeWllbGQuXG4gICAgICAgIGZpbHRlcjogXCJkaXN0aW5jdFwiLFxuICAgICAgICAvLyBTdG9wIGFmdGVyIHRoZSB0ZXJtaW5hbCBtZXNzYWdlIGlzIHlpZWxkZWQuIGBwb2xsYCBjaGVja3MgdGhlXG4gICAgICAgIC8vIHByZWRpY2F0ZSBBRlRFUiB5aWVsZGluZywgc28gdGhlIHRlcm1pbmFsIG1lc3NhZ2Ugc3RpbGwgcmVhY2hlcyB0aGVcbiAgICAgICAgLy8gY29uc3VtZXIuXG4gICAgICAgIHByZWRpY2F0ZTogKG0pID0+ICFnZW5pZU1vZGVsLmlzVGVybWluYWxTdGF0dXMobS5zdGF0dXMpLFxuICAgICAgICAvLyBXYWtlIHRoZSBpbnRlci1wb2xsIHNsZWVwIG9uIGFib3J0IHNvIGEgYGZvciBhd2FpdGAgYnJlYWsgKG9yXG4gICAgICAgIC8vIGV4dGVybmFsIGFib3J0KSB0ZWFycyBkb3duIHByb21wdGx5IGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlXG4gICAgICAgIC8vIGludGVydmFsLlxuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSxcbiAgICApO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENhbmNlbHMgYW55IHN0aWxsLXBlbmRpbmcgU0RLIGNhbGwgYW5kIHRoZSBpbnRlci1wb2xsIHNsZWVwIHdoZXRoZXIgd2UncmVcbiAgICAvLyB1bndpbmRpbmcgZnJvbSBhIG5vcm1hbCByZXR1cm4sIGEgY29uc3VtZXIgYnJlYWssIG9yIGEgdGhyb3duIGVycm9yLlxuICAgIC8vIElkZW1wb3RlbnQuXG4gICAgY29udHJvbGxlci5hYm9ydCgpO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGlnaC1sZXZlbDogZ2VuaWVFdmVudENoYXQgLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHR1cm4gYWdhaW5zdCBhIEdlbmllIHNwYWNlLCB5aWVsZGVkIGFzIGEgdHlwZWQge0BsaW5rIEdlbmllQ2hhdEV2ZW50fVxuICogc3RyZWFtLiBEcml2ZXMge0BsaW5rIGdlbmllQ2hhdH0gdW5kZXJuZWF0aCBhbmQgZGVjb3JhdGVzIGVhY2ggc25hcHNob3Qgd2l0aFxuICogdGhlIGRlcml2ZWQgZXZlbnRzIHRoZSBmaWVsZC1sZXZlbCBkaWZmIHByb2R1Y2VkLiBTdHJlYW0gb3JkZXI6XG4gKlxuICogICAxLiBgeyB0eXBlOiBcIm1lc3NhZ2VcIiwgbWVzc2FnZSB9YCAtIHRoZSByYXcgYEdlbmllTWVzc2FnZWAsIG9uY2UgcGVyIHBvbGxcbiAqICAgICAgeWllbGQuXG4gKiAgIDIuIGB7IHR5cGU6IFwicXVlc3Rpb25cIiwgY29udGVudCwgbWVzc2FnZV9pZCwgLi4uIH1gIGZpcmVzIGV4YWN0bHkgb25jZSwgb25cbiAqICAgICAgdGhlIEZJUlNUIGBtZXNzYWdlYCB5aWVsZC4gV2UgcmVhZCBgY29udGVudGAgYW5kIGBtZXNzYWdlX2lkYCBzdHJhaWdodFxuICogICAgICBvZmYgdGhlIHNuYXBzaG90IHNvIGV2ZXJ5IGRvd25zdHJlYW0gZXZlbnQgZm9yIHRoaXMgdHVybiBzaGFyZXMgdGhlIHNhbWVcbiAqICAgICAgYG1lc3NhZ2VfaWRgICh0aGUgcXVlc3Rpb24gaW5jbHVkZWQpIC0gc3Vic2NyaWJlcnMgY2FuIGdyb3VwIGV2ZXJ5dGhpbmdcbiAqICAgICAgZm9yIG9uZSBHZW5pZSBjYWxsIHVuZGVyIHRoYXQgb25lIGtleS5cbiAqICAgMy4gQW55IG9mIGBzdGF0dXNgIC8gYGF0dGFjaG1lbnRgIC8gYHRoaW5raW5nYCAvIGB0ZXh0YCAvIGBxdWVyeWAgL1xuICogICAgICBgc3RhdGVtZW50YCAvIGByb3dzYCAvIGBzdWdnZXN0ZWRfcXVlc3Rpb25zYCB0aGUgZGlmZiBhZ2FpbnN0IHRoZSBwcmlvclxuICogICAgICBzbmFwc2hvdCBwcm9kdWNlZC5cbiAqICAgNC4gT24gdGhlIHRlcm1pbmFsIHNuYXBzaG90LCBgeyB0eXBlOiBcInJlc3VsdFwiLCAuLi4gfWAgYXMgdGhlIGZpbmFsIHlpZWxkLlxuICpcbiAqIEVycm9ycyBwcm9wYWdhdGUgYnkgdGhlIGdlbmVyYXRvciB0aHJvd2luZyAtIHRoZXJlJ3Mgbm8gYFwiZXJyb3JcImAgdmFyaWFudC5cbiAqIFdyYXAgdGhlIGBmb3IgYXdhaXRgIGluIGB0cnkvY2F0Y2hgIGlmIHlvdSBuZWVkIHRvIGhhbmRsZSBmYWlsdXJlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogZm9yIGF3YWl0IChjb25zdCBldnQgb2YgZ2VuaWVFdmVudENoYXQoc3BhY2VJZCwgXCJUb3Agc3RvcmVzP1wiKSkge1xuICogICBzd2l0Y2ggKGV2dC50eXBlKSB7XG4gKiAgICAgY2FzZSBcInRoaW5raW5nXCI6XG4gKiAgICAgICBjb25zb2xlLmxvZyhcIlt0aGlua2luZ11cIiwgZXZ0LnRob3VnaHRfdHlwZSwgZXZ0LnRleHQpO1xuICogICAgICAgYnJlYWs7XG4gKiAgICAgY2FzZSBcInRleHRcIjpcbiAqICAgICAgIGNvbnNvbGUubG9nKFwiW3RleHRdXCIsIGV2dC50ZXh0KTtcbiAqICAgICAgIGJyZWFrO1xuICogICAgIGNhc2UgXCJyZXN1bHRcIjpcbiAqICAgICAgIGNvbnNvbGUubG9nKFwiW2RvbmVdXCIsIGV2dC5zdGF0dXMpO1xuICogICAgICAgYnJlYWs7XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uKiBnZW5pZUV2ZW50Q2hhdChcbiAgc3BhY2VfaWQ6IHN0cmluZyxcbiAgY29udGVudDogc3RyaW5nLFxuICBvcHRpb25zPzogR2VuaWVDaGF0T3B0aW9ucyxcbik6IEFzeW5jR2VuZXJhdG9yPEdlbmllQ2hhdEV2ZW50LCB2b2lkLCB2b2lkPiB7XG4gIC8vIERpZmYgc291cmNlIGZvciB0aGUgY3VycmVudCB0dXJuLiBBbHdheXMgYHVuZGVmaW5lZGAgb24gdGhlIGZpcnN0IHNuYXBzaG90XG4gIC8vIHNvIHRoZSBpbml0aWFsIHN0YXR1cyAvIGF0dGFjaG1lbnRzIGVtaXQgZnJlc2g7IHVwZGF0ZWQgdG8gdGhlIG1vc3QgcmVjZW50XG4gIC8vIHNuYXBzaG90IGFmdGVyIGVhY2ggeWllbGQuXG4gIGxldCBwcmV2aW91czogR2VuaWVNZXNzYWdlIHwgdW5kZWZpbmVkO1xuICAvLyBUaGUgYHF1ZXN0aW9uYCBldmVudCBpcyBkZWZlcnJlZCB0byB0aGUgZmlyc3QgYG1lc3NhZ2VgIHlpZWxkIHNvIGl0IGNhblxuICAvLyBjYXJyeSB0aGUgYXNzaWduZWQgYG1lc3NhZ2VfaWRgIChzdWJzY3JpYmVycyB1c2UgaXQgYXMgdGhlIGdyb3VwaW5nIGtleSBmb3JcbiAgLy8gZXZlcnkgZXZlbnQgaW4gdGhpcyB0dXJuKS4gVGhlIGZpcnN0IHNuYXBzaG90IGlzIHRoZSBlYXJsaWVzdCBwb2ludCB0aGF0IGlkXG4gIC8vIGV4aXN0cy5cbiAgbGV0IHF1ZXN0aW9uRW1pdHRlZCA9IGZhbHNlO1xuICBmb3IgYXdhaXQgKGNvbnN0IHJhd01lc3NhZ2Ugb2YgZ2VuaWVDaGF0KHNwYWNlX2lkLCBjb250ZW50LCBvcHRpb25zKSkge1xuICAgIC8vIE5vcm1hbGl6ZSBgbWVzc2FnZV9pZGAgZnJvbSB0aGUgbGVnYWN5IGBpZGAgZmllbGQgd2hlbiBHZW5pZSdzIHdpcmVcbiAgICAvLyByZXNwb25zZSBvbmx5IHBvcHVsYXRlcyBvbmUgb2YgdGhlbS4gVGhlIFNESyBzY2hlbWEgbWFya3MgYm90aCBhc1xuICAgIC8vIHJlcXVpcmVkLCBidXQgaW4gcHJhY3RpY2UgdGhlIGBzdGFydENvbnZlcnNhdGlvbmAgLyBgY3JlYXRlTWVzc2FnZWAgaW5uZXJcbiAgICAvLyBgbWVzc2FnZWAgcGF5bG9hZCBzb21ldGltZXMgc2hpcHMgb25seSBgaWRgIHdoaWxlIHRoZSBuZXcgYG1lc3NhZ2VfaWRgXG4gICAgLy8gZmllbGQgbGFuZHMgdW5kZWZpbmVkLiBFdmVyeSBkb3duc3RyZWFtIGV2ZW50IGRldGVjdG9yIGtleXMgZ3JvdXBpbmcgb2ZmXG4gICAgLy8gYG1lc3NhZ2VfaWRgOyB0aGUgZmFsbGJhY2sga2VlcHMgb25lIEdlbmllIHR1cm4ncyBldmVudHMgZnJvbSBzcGxpdHRpbmdcbiAgICAvLyBhY3Jvc3MgYW4gYW5vbiBncm91cCArIHRoZSByZWFsLWlkIGdyb3VwIHdoZW4gc3Vic2NyaWJlcnMgYnVja2V0IGJ5XG4gICAgLy8gYG1lc3NhZ2VfaWRgLlxuICAgIGNvbnN0IG1lc3NhZ2U6IEdlbmllTWVzc2FnZSA9IHJhd01lc3NhZ2UubWVzc2FnZV9pZFxuICAgICAgPyByYXdNZXNzYWdlXG4gICAgICA6IHsgLi4ucmF3TWVzc2FnZSwgbWVzc2FnZV9pZDogcmF3TWVzc2FnZS5pZCB9O1xuICAgIHlpZWxkIHtcbiAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgc3BhY2VfaWQ6IG1lc3NhZ2Uuc3BhY2VfaWQsXG4gICAgICBtZXNzYWdlX2lkOiBtZXNzYWdlLm1lc3NhZ2VfaWQsXG4gICAgICBtZXNzYWdlLFxuICAgIH07XG4gICAgaWYgKCFxdWVzdGlvbkVtaXR0ZWQpIHtcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgdHlwZTogXCJxdWVzdGlvblwiLFxuICAgICAgICBzcGFjZV9pZDogbWVzc2FnZS5zcGFjZV9pZCxcbiAgICAgICAgLi4uKG1lc3NhZ2UuY29udmVyc2F0aW9uX2lkID8geyBjb252ZXJzYXRpb25faWQ6IG1lc3NhZ2UuY29udmVyc2F0aW9uX2lkIH0gOiB7fSksXG4gICAgICAgIC4uLihtZXNzYWdlLm1lc3NhZ2VfaWQgPyB7IG1lc3NhZ2VfaWQ6IG1lc3NhZ2UubWVzc2FnZV9pZCB9IDoge30pLFxuICAgICAgICBjb250ZW50OiBtZXNzYWdlLmNvbnRlbnQsXG4gICAgICB9O1xuICAgICAgcXVlc3Rpb25FbWl0dGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgeWllbGQqIGV2ZW50LmV2ZW50c0Zyb21NZXNzYWdlKG1lc3NhZ2UsIHByZXZpb3VzLCBtZXNzYWdlLnNwYWNlX2lkKTtcbiAgICBjb25zdCBzdGF0dXMgPSBtZXNzYWdlLnN0YXR1cztcbiAgICBpZiAoZ2VuaWVNb2RlbC5pc1Rlcm1pbmFsU3RhdHVzKHN0YXR1cykpIHtcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgdHlwZTogXCJyZXN1bHRcIixcbiAgICAgICAgc3BhY2VfaWQ6IG1lc3NhZ2Uuc3BhY2VfaWQsXG4gICAgICAgIGNvbnZlcnNhdGlvbl9pZDogbWVzc2FnZS5jb252ZXJzYXRpb25faWQsXG4gICAgICAgIG1lc3NhZ2VfaWQ6IG1lc3NhZ2UubWVzc2FnZV9pZCxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgfTtcbiAgICB9XG4gICAgcHJldmlvdXMgPSBtZXNzYWdlO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gd29ya3NwYWNlIGNsaWVudCBoZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogUmVzb2x2ZSBhIGBXb3Jrc3BhY2VDbGllbnRgIGluIHRoaXMgcHJlZmVyZW5jZSBvcmRlcjpcbiAqXG4gKiAgIDEuIENhbGxlci1zdXBwbGllZCBgb3B0aW9ucy53b3Jrc3BhY2VDbGllbnRgLlxuICogICAyLiBBcHBLaXQncyBwZXItcmVxdWVzdCBleGVjdXRpb24tY29udGV4dCBjbGllbnQgaW5zaWRlIGEgcmVxdWVzdCBzY29wZS5cbiAqICAgMy4gRnJlc2ggbmF0aXZlIEFwcEtpdCBgY3JlYXRlV29ya3NwYWNlQ2xpZW50KClgLlxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0V29ya3NwYWNlQ2xpZW50KG9wdGlvbnM/OiBHZW5pZUNoYXRPcHRpb25zKTogUHJvbWlzZTxXb3Jrc3BhY2VDbGllbnQ+IHtcbiAgaWYgKG9wdGlvbnM/LndvcmtzcGFjZUNsaWVudCkgcmV0dXJuIG9wdGlvbnMud29ya3NwYWNlQ2xpZW50O1xuICB0cnkge1xuICAgIHJldHVybiBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICB9IGNhdGNoIHtcbiAgICAvLyBOb3QgaW5zaWRlIGFuIEFwcEtpdCByZXF1ZXN0IGNvbnRleHQ7IGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0IGF1dGguXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpO1xufVxuIl19
package/package.json CHANGED
@@ -24,9 +24,9 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@databricks/appkit": "0.81.0",
27
- "@dbx-tools/appkit": "^0.9.129",
28
- "@dbx-tools/shared-core": "^0.9.129",
29
- "@dbx-tools/shared-genie": "^0.9.129"
27
+ "@dbx-tools/appkit": "^0.9.132",
28
+ "@dbx-tools/shared-core": "^0.9.132",
29
+ "@dbx-tools/shared-genie": "^0.9.132"
30
30
  },
31
31
  "main": "./lib/index.js",
32
32
  "license": "Apache-2.0",
@@ -58,7 +58,7 @@
58
58
  "./package.json": "./package.json"
59
59
  }
60
60
  },
61
- "version": "0.9.129",
61
+ "version": "0.9.132",
62
62
  "types": "./lib/index.d.ts",
63
63
  "dbxToolsConfig": {
64
64
  "tags": [
package/src/agent-mode.ts CHANGED
@@ -20,6 +20,7 @@ import {
20
20
 
21
21
  const logger = log.logger("genie/agent-mode");
22
22
  const CANCEL_TIMEOUT_MS = 5_000;
23
+ const ITEM_PAGE_SIZE = 100;
23
24
 
24
25
  /** Inputs for one Agent Mode response stream. */
25
26
  export interface GenieAgentModeOptions {
@@ -89,6 +90,40 @@ export async function* genieAgentModeChat(
89
90
  }
90
91
  }
91
92
 
93
+ /**
94
+ * Load an Agent Mode conversation's full item history and project it onto one
95
+ * `GenieMessage` per turn, oldest first.
96
+ */
97
+ export async function listAgentModeConversation(
98
+ client: WorkspaceClient,
99
+ agentId: string,
100
+ conversationId: string,
101
+ options: { context?: databricks.ContextLike } = {},
102
+ ): Promise<GenieMessage[]> {
103
+ const context = options.context ? databricks.toContext(options.context) : undefined;
104
+ const items: agentModeWire.GenieAgentOutputItem[] = [];
105
+ let after: string | undefined;
106
+ let status = "completed";
107
+ do {
108
+ const page = agentModeWire.GenieAgentConversationItemsSchema.parse(
109
+ await client.apiClient.request(
110
+ {
111
+ path: `/api/2.0/genie/agents/${encodeURIComponent(agentId)}/conversations/${encodeURIComponent(conversationId)}/items`,
112
+ method: "GET",
113
+ headers: new Headers({ accept: "application/json" }),
114
+ query: { limit: ITEM_PAGE_SIZE, order: "asc", ...(after ? { after } : {}) },
115
+ raw: false,
116
+ },
117
+ context,
118
+ ),
119
+ );
120
+ items.push(...page.data);
121
+ status = page.status ?? status;
122
+ after = page.has_more ? page.last_id : undefined;
123
+ } while (after);
124
+ return agentModeWire.projectAgentModeConversation(agentId, conversationId, items, status);
125
+ }
126
+
92
127
  /** Return whether Agent Mode is disabled or its preview toggle is unavailable. */
93
128
  export function isAgentModeUnavailable(value: unknown): boolean {
94
129
  const context = errorUtils.errorContext(value);
package/src/chat.ts CHANGED
@@ -65,6 +65,11 @@ export interface GenieChatOptions {
65
65
  * force the legacy start/create/get-message polling flow.
66
66
  */
67
67
  agentMode?: boolean;
68
+ /**
69
+ * Fall back to Conversation API polling when Agent Mode is unavailable.
70
+ * Defaults to `true`; set `false` when the caller requires Agent Mode.
71
+ */
72
+ agentModeFallback?: boolean;
68
73
  /** Ask Agent Mode to generate visualizations when appropriate. */
69
74
  enableVisualization?: boolean;
70
75
  /**
@@ -154,7 +159,9 @@ export async function* genieChat(
154
159
  }
155
160
  return;
156
161
  } catch (err) {
157
- if (yielded || !isAgentModeUnavailable(err)) throw err;
162
+ if (options?.agentModeFallback === false || yielded || !isAgentModeUnavailable(err)) {
163
+ throw err;
164
+ }
158
165
  logger.warn("agent-mode:unavailable, falling back to polling", {
159
166
  space_id,
160
167
  error: errorUtils.toError(err),