@dbx-tools/appkit-mastra 0.6.213 → 0.6.215

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/lib/src/model.js CHANGED
@@ -26,7 +26,7 @@ import { getExecutionContext } from "@databricks/appkit";
26
26
  import { classes, resolve } from "@dbx-tools/model";
27
27
  import { functionModule, json, log, net } from "@dbx-tools/shared-core";
28
28
  import { MASTRA_USER_KEY } from "./config.js";
29
- import { rewriteServingBody, rewriteServingResponseBody } from "./serving-sanitize.js";
29
+ import { rewriteServingBody, rewriteServingResponseBody, rewriteServingResponseStream, } from "./serving-sanitize.js";
30
30
  import { MASTRA_MODEL_OVERRIDE_KEY, resolveServingConfig } from "./serving.js";
31
31
  const { parseModelClass } = classes;
32
32
  const { selectModel } = resolve;
@@ -103,10 +103,9 @@ const SERVING_ENDPOINTS_PATH_PREFIX = "/serving-endpoints/";
103
103
  * 2. At `LOG_LEVEL=debug`, dumps the (post-sanitize) JSON body so
104
104
  * 4xx debugging doesn't have to fight AI SDK's `[Array]`
105
105
  * formatter.
106
- * 3. Repairs the non-streaming JSON response, where Databricks-hosted
107
- * Gemini returns `choices[].message.content` as a parts array that
108
- * the AI SDK's OpenAI schema rejects (see
109
- * {@link rewriteServingResponseBody}).
106
+ * 3. Repairs buffered and streaming responses where a provider returns
107
+ * `choices[].message.content` or `choices[].delta.content` as a parts
108
+ * array that the AI SDK's OpenAI schema rejects.
110
109
  *
111
110
  * Safe to call from any hot path: {@link functionModule.memoize} ensures
112
111
  * the wrapper is installed at most once per process, so subsequent
@@ -136,33 +135,38 @@ const setupFetchInterceptor = functionModule.memoize(() => {
136
135
  });
137
136
  });
138
137
  /**
139
- * Rewrite a non-streaming serving response whose body needs repair, leaving
140
- * everything else byte-identical.
138
+ * Rewrite a serving response whose body needs repair, leaving unsupported
139
+ * content types byte-identical.
141
140
  *
142
- * Streaming turns are passed straight through: an SSE body must stay a live
143
- * stream (buffering it to a string would defeat streaming and break
144
- * `text/event-stream` parsing), and the delta frames already carry string
145
- * content, so they never hit the array-shaped `content` bug. Likewise a
146
- * non-JSON or error body is returned untouched, so the caller still sees the
147
- * original status and headers.
141
+ * SSE remains a live stream: a TransformStream repairs complete `data:` lines
142
+ * as bytes arrive and preserves partial lines across network chunks. JSON is
143
+ * buffered through the existing response-body repair. A non-JSON/non-SSE body
144
+ * is returned untouched so the caller still sees the original response.
148
145
  */
149
146
  async function repairServingResponse(response) {
150
147
  const contentType = response.headers.get("content-type") ?? "";
148
+ if (contentType.includes("text/event-stream") && response.body) {
149
+ return rebuildServingResponse(response, rewriteServingResponseStream(response.body));
150
+ }
151
151
  if (!contentType.includes("application/json"))
152
152
  return response;
153
153
  const body = await response.clone().text();
154
154
  const rewritten = rewriteServingResponseBody(body);
155
155
  if (rewritten === body)
156
156
  return response;
157
+ return rebuildServingResponse(response, rewritten);
158
+ }
159
+ /** Rebuild a transformed response without stale byte-length/encoding headers. */
160
+ function rebuildServingResponse(response, body) {
157
161
  // `content-length` / `content-encoding` describe the ORIGINAL bytes, so they
158
162
  // are dropped: the rewritten body is a different length and already decoded.
159
163
  const headers = new Headers(response.headers);
160
164
  headers.delete("content-length");
161
165
  headers.delete("content-encoding");
162
- return new Response(rewritten, {
166
+ return new Response(body, {
163
167
  status: response.status,
164
168
  statusText: response.statusText,
165
169
  headers,
166
170
  });
167
171
  }
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFLeEUsT0FBTyxFQUFFLGVBQWUsRUFBc0MsTUFBTSxhQUFhLENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRy9FLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDcEMsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQXFCaEM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQzlCLE1BQTBCLEVBQzFCLGNBQThCLEVBQzlCLFlBQWlDLEVBQUU7SUFFbkMsS0FBSyxxQkFBcUIsRUFBRSxDQUFDO0lBQzdCLGtFQUFrRTtJQUNsRSxxRUFBcUU7SUFDckUscUVBQXFFO0lBQ3JFLHFFQUFxRTtJQUNyRSxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBcUIsQ0FBQztJQUNyRSxNQUFNLGdCQUFnQixHQUFHLElBQUksRUFBRSxnQkFBZ0IsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQ3pFLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDcEQsTUFBTSxJ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OztHQVVHO0FBQ0gsS0FBSyxVQUFVLHFCQUFxQixDQUFDLFFBQWtCO0lBQ3JELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBRS9ELE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNDLE1BQU0sU0FBUyxHQUFHLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25ELElBQUksU0FBUyxLQUFLLElBQUk7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUV4Qyw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDakMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFO1FBQzdCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtRQUN2QixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7UUFDL0IsT0FBTztLQUNSLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERhdGFicmlja3MgTW9kZWwgU2VydmluZyByZXNvbHZlciBmb3IgTWFzdHJhIGFnZW50cy5cbiAqXG4gKiBFYWNoIGFnZW50IHN0ZXAgY2FsbHMge0BsaW5rIGJ1aWxkTW9kZWx9IHdpdGggdGhlIGFjdGl2ZVxuICogYFJlcXVlc3RDb250ZXh0YC4gVGhlIHVzZXIgc3RhbXBlZCBieSBgTWFzdHJhU2VydmVyYCBjYXJyaWVzIGFuXG4gKiBBcHBLaXQgYFdvcmtzcGFjZUNsaWVudGA7IHdlIGFzayBpdCBmb3IgdGhlIHdvcmtzcGFjZSBob3N0IGFuZCBhXG4gKiBmcmVzaCBiZWFyZXIgaGVhZGVyLCB0aGVuIHBvaW50IE1hc3RyYSdzIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVyXG4gKiBhdCBgL3NlcnZpbmctZW5kcG9pbnRzYCBvbiB0aGF0IGhvc3QuXG4gKlxuICogVGhpcyBtb2R1bGUgb25seSBhZGRzIHRoZSBNYXN0cmEtc3BlY2lmaWMgZ2x1ZS4gVGhlIGFjdHVhbCBtb2RlbFxuICogc2VsZWN0aW9uIC0gbGlzdGluZyB0aGUgd29ya3NwYWNlIGNhdGFsb2d1ZSBhbmQgcmVzb2x2aW5nIGFuXG4gKiBleHBsaWNpdCBuYW1lIC8gY2xhc3MgLyBmYWxsYmFjayBjaGFpbiB0byBhIHJlYWwgZW5kcG9pbnQgaWQgLSBsaXZlc1xuICogaW4gYEBkYngtdG9vbHMvbW9kZWxgICh7QGxpbmsgc2VsZWN0TW9kZWx9KSBzbyBub24tTWFzdHJhIGNvbnN1bWVyc1xuICogKGUuZy4gYSBqb2IgdGhhdCBqdXN0IG5lZWRzIGEgbW9kZWwgbmFtZSkgY2FuIHJldXNlIGl0LiBIZXJlIHdlXG4gKiBhc3NlbWJsZSB0aGUgZXhwbGljaXQgYXNrIGZyb20gTWFzdHJhJ3MgcmVxdWVzdCBjb250ZXh0ICh0aGVcbiAqIHBlci1yZXF1ZXN0IG92ZXJyaWRlIHVuZGVyIHtAbGluayBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZfSwgdGhlXG4gKiBhZ2VudCAvIHBsdWdpbiBgbW9kZWxJZGAsIG9yIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWApLFxuICogcGFzcyB0aGUgcGx1Z2luJ3MgZnV6enkgLyBjbGFzcyAvIGZhbGxiYWNrIGtub2JzIHRocm91Z2gsIGFuZCB3cmFwXG4gKiB0aGUgcmVzb2x2ZWQgaWQgaW4gdGhlIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVyIGNvbmZpZyBNYXN0cmFcbiAqIGV4cGVjdHMuIENhdGFsb2d1ZSBmZXRjaGVzIGZhaWwgbG91ZDogbmV0d29yayAvIGF1dGggZXJyb3JzXG4gKiBwcm9wYWdhdGUgc28gY2FsbGVycyBzZWUgdGhlIHJlYWwgU0RLIG1lc3NhZ2UuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBjbGFzc2VzLCByZXNvbHZlIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGZ1bmN0aW9uTW9kdWxlLCBqc29uLCBsb2csIG5ldCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFNb2RlbENvbmZpZyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvbGxtXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcblxuaW1wb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZywgdHlwZSBVc2VyIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyByZXdyaXRlU2VydmluZ0JvZHksIHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VCb2R5IH0gZnJvbSBcIi4vc2VydmluZy1zYW5pdGl6ZS50c1wiO1xuaW1wb3J0IHsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgcmVzb2x2ZVNlcnZpbmdDb25maWcgfSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5cbnR5cGUgTW9kZWxDbGFzcyA9IG1vZGVsLk1vZGVsQ2xhc3M7XG5jb25zdCB7IHBhcnNlTW9kZWxDbGFzcyB9ID0gY2xhc3NlcztcbmNvbnN0IHsgc2VsZWN0TW9kZWwgfSA9IHJlc29sdmU7XG5cbi8qKiBPcHRpb25hbCBvdmVycmlkZXMgYWNjZXB0ZWQgYnkge0BsaW5rIGJ1aWxkTW9kZWx9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE1vZGVsT3ZlcnJpZGVzIHtcbiAgLyoqXG4gICAqIFN0YXRpYyBtb2RlbCBpZCBmcm9tIHRoZSBhZ2VudCAvIHBsdWdpbiBjb25maWcgKHN0cmluZyBzdWdhciBvblxuICAgKiBgZGVmLm1vZGVsYCBvciBgY29uZmlnLmRlZmF1bHRNb2RlbGApLiBMb3NlcyB0byB0aGUgcGVyLXJlcXVlc3RcbiAgICogb3ZlcnJpZGUgYnV0IHdpbnMgb3ZlciBlbnYgLyBjbGFzcyAvIGZhbGxiYWNrLlxuICAgKi9cbiAgbW9kZWxJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIENoYXQgY2FwYWJpbGl0eSBjbGFzcyB0byByZXNvbHZlIHdoZW4gbm8gZXhwbGljaXQgbW9kZWwgaWQgaXNcbiAgICogc3VwcGxpZWQuIFVzZWQgYnkgaW50ZXJuYWwgYWdlbnRzIChlLmcuIHRoZSBjaGFydCBwbGFubmVyIGFza3MgZm9yXG4gICAqIHtAbGluayBtb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0fSkgdG8gZXhwcmVzcyBpbnRlbnQgd2l0aG91dCBwaW5uaW5nIGFuXG4gICAqIGVuZHBvaW50IG5hbWU7IHRoZSBsaXZlIGNhdGFsb2d1ZSBpcyBjbGFzc2lmaWVkIGFuZCB0aGUgdG9wXG4gICAqIGF2YWlsYWJsZSBtb2RlbCBpbiB0aGUgY2xhc3MgaXMgY2hvc2VuLCBmYWxsaW5nIGJhY2sgdG8gdGhlXG4gICAqIGNsYXNzJ3Mgc3RhdGljIGxpc3Qgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBub25lLlxuICAgKi9cbiAgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGBNYXN0cmFNb2RlbENvbmZpZ2AgZm9yIHRoZSBjdXJyZW50IGFnZW50IHN0ZXAuIFJ1bnNcbiAqIHdoaWxlIGBhZ2VudC5zdHJlYW1gIGlzIGluc2lkZSB0aGUgYGFzVXNlcihyZXEpYCBzY29wZSBzbyB0b2tlbnNcbiAqIGFyZSB1c2VyLXNjb3BlZDsgb3V0c2lkZSBhbiBhY3RpdmUgdXNlciBjb250ZXh0IHRoZSB3b3Jrc3BhY2VcbiAqIGNsaWVudCBmYWxscyBiYWNrIHRvIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC5cbiAqXG4gKiBFbmRwb2ludCBwcmVjZWRlbmNlOiB0aGUgcGVyLXJlcXVlc3Qgb3ZlcnJpZGVcbiAqICh7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIG9ubHkgd2hlbiBgY29uZmlnLm1vZGVsT3ZlcnJpZGVgIGFsbG93c1xuICogaXQpLCB0aGVuIHtAbGluayBCdWlsZE1vZGVsT3ZlcnJpZGVzLm1vZGVsSWR9IGZyb20gdGhlIGFnZW50IC8gcGx1Z2luXG4gKiBjb25maWcsIHRoZW4gYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYC4gV2l0aCBub25lIG9mIHRob3NlIHNldCB0aGVcbiAqIGNhcGFiaWxpdHkgY2xhc3MgYW5kIGZhbGxiYWNrIGxhZGRlciBpbiBgQGRieC10b29scy9tb2RlbGAgY2hvb3NlIHRoZVxuICogZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBvdmVycmlkZXM6IEJ1aWxkTW9kZWxPdmVycmlkZXMgPSB7fSxcbik6IFByb21pc2U8TWFzdHJhTW9kZWxDb25maWc+IHtcbiAgdm9pZCBzZXR1cEZldGNoSW50ZXJjZXB0b3IoKTtcbiAgLy8gVGhlIGNoYXQgcGF0aCBzdGFtcHMgdGhlIEFwcEtpdCB1c2VyIG9uIHRoZSByZXF1ZXN0IGNvbnRleHQgdmlhXG4gIC8vIGBNYXN0cmFTZXJ2ZXJgLiBUaGUgTUNQIHRyYW5zcG9ydCByb3V0ZXMgZG9uJ3QgdGhyZWFkIHRoYXQgY29udGV4dFxuICAvLyBpbnRvIHRvb2wgZXhlY3V0aW9uLCBzbyBmYWxsIGJhY2sgdG8gdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHRcbiAgLy8gKHRoZSBhY3RpdmUgT0JPIHNjb3BlLCBvciB0aGUgc2VydmljZSBwcmluY2lwYWwpIHdoZW4gaXQncyBhYnNlbnQuXG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gdXNlcj8uZXhlY3V0aW9uQ29udGV4dCA/PyBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGNvbnN0IGNsaWVudENvbmZpZyA9IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LmNvbmZpZztcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnRDb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgYXdhaXQgY2xpZW50Q29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgLy8gVGhlIE9wZW5BSSBOb2RlIFNESyBhcHBlbmRzIHBhdGhzIGxpa2UgYC9jaGF0L2NvbXBsZXRpb25zYCB0byB3aGF0ZXZlclxuICAvLyBVUkwgd2UgaGFuZCBpdC4gRHJvcCB0aGUgdHJhaWxpbmcgc2xhc2ggc28gdGhlIHJlc3VsdGluZyBVUkwgc3RheXNcbiAgLy8gd2VsbC1mb3JtZWQgKGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2ApLlxuICBjb25zdCB1cmwgPSBuZXcgVVJMKFwiL3NlcnZpbmctZW5kcG9pbnRzXCIsIGhvc3QpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuXG4gIGNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoY29uZmlnKTtcbiAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKGNvbmZpZyk7XG4gIGNvbnN0IG92ZXJyaWRlID0gc2VydmluZy5hbGxvd092ZXJyaWRlXG4gICAgPyAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVkpIGFzIHN0cmluZyB8IHVuZGVmaW5lZClcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBUaGUgb3ZlcnJpZGUgLyBhZ2VudCBkZWZhdWx0IC8gZW52IHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBjb25jcmV0ZVxuICAvLyBlbmRwb2ludCBuYW1lIG9yIGEgbW9kZWwgY2xhc3Mgc2x1ZyAoXCJjaGF0LXRoaW5raW5nXCIgL1xuICAvLyBcImNoYXQtYmFsYW5jZWRcIiAvIFwiY2hhdC1mYXN0XCIpLiBBIGNsYXNzIHNsdWcgYmVjb21lcyBhIGNsYXNzIGludGVudFxuICAvLyAobGV0IHRoZSBsaXZlIGNhdGFsb2d1ZSBwaWNrIHRoZSBiZXN0IG1vZGVsIGluIHRoYXQgYmFuZCk7IGFueXRoaW5nXG4gIC8vIGVsc2UgaXMgYW4gZXhwbGljaXQgbmFtZSBmdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlIGNhdGFsb2d1ZS4gQW5cbiAgLy8gaW50ZXJuYWwgYG92ZXJyaWRlcy5tb2RlbENsYXNzYCAoZS5nLiB0aGUgY2hhcnQgcGxhbm5lcikgaXMgdGhlXG4gIC8vIGZsb29yIHdoZW4gbm90aGluZyB3YXMgcmVxdWVzdGVkLlxuICBjb25zdCByZXF1ZXN0ZWQgPSBvdmVycmlkZSA/PyBvdmVycmlkZXMubW9kZWxJZCA/PyBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRTtcbiAgY29uc3QgcmVxdWVzdGVkQ2xhc3MgPSByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCA/IHBhcnNlTW9kZWxDbGFzcyhyZXF1ZXN0ZWQpIDogbnVsbDtcbiAgY29uc3QgZXhwbGljaXQgPSByZXF1ZXN0ZWRDbGFzcyA9PT0gbnVsbCA/IHJlcXVlc3RlZCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbW9kZWxDbGFzcyA9IHJlcXVlc3RlZENsYXNzID8/IG92ZXJyaWRlcy5tb2RlbENsYXNzO1xuXG4gIGNvbnN0IHsgbW9kZWxJZCwgc291cmNlIH0gPSBhd2FpdCBzZWxlY3RNb2RlbChleGVjdXRpb25Db250ZXh0LmNsaWVudCwgaG9zdCwge1xuICAgIC4uLihleHBsaWNpdCAhPT0gdW5kZWZpbmVkID8geyBleHBsaWNpdCB9IDoge30pLFxuICAgIGZ1enp5OiBzZXJ2aW5nLmZ1enp5LFxuICAgIHRocmVzaG9sZDogc2VydmluZy50aHJlc2hvbGQsXG4gICAgLi4uKG1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IHsgbW9kZWxDbGFzcyB9IDoge30pLFxuICAgIGZhbGxiYWNrczogc2VydmluZy5mYWxsYmFja3MsXG4gICAgdHRsTXM6IHNlcnZpbmcudHRsTXMsXG4gIH0pO1xuICBsb2dnZXIuZGVidWcoXCJtb2RlbCBzZWxlY3RlZFwiLCB7IG1vZGVsSWQsIHNvdXJjZSwgcmVxdWVzdGVkIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcHJvdmlkZXJJZDogY29uZmlnLnByb3ZpZGVySWQgPz8gXCJkYXRhYnJpY2tzXCIsXG4gICAgbW9kZWxJZCxcbiAgICB1cmwsXG4gICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKGhlYWRlcnMuZW50cmllcygpKSxcbiAgfTtcbn1cblxuLyoqIFBhdGggcHJlZml4IHRoYXQgaWRlbnRpZmllcyBhIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBSRVNUIGNhbGwuICovXG5jb25zdCBTRVJWSU5HX0VORFBPSU5UU19QQVRIX1BSRUZJWCA9IFwiL3NlcnZpbmctZW5kcG9pbnRzL1wiO1xuXG4vKipcbiAqIEluc3RhbGwgYSBzaW5nbGUgc2hhcmVkIGBnbG9iYWxUaGlzLmZldGNoYCB3cmFwcGVyIGZvciBldmVyeSBQT1NUIHRvXG4gKiBgL3NlcnZpbmctZW5kcG9pbnRzLy4uLmAuIFRoZSB3cmFwcGVyIGRvZXMgdHdvIHRoaW5nczpcbiAqXG4gKiAgIDEuIFJld3JpdGVzIHRoZSBvdXRnb2luZyBgbWVzc2FnZXNgIGFycmF5IHRvIHJlcGFpciBNYXN0cmEvQUkgU0RLXG4gKiAgICAgIHN0cmVhbS1yZXBsYXkgcXVpcmtzIHRoYXQgRGF0YWJyaWNrcy1ob3N0ZWQgQ2xhdWRlIHJlamVjdHMgKHNlZVxuICogICAgICB7QGxpbmsgcmV3cml0ZVNlcnZpbmdCb2R5fSBpbiBgLi9zZXJ2aW5nLXNhbml0aXplLmpzYCkuXG4gKiAgIDIuIEF0IGBMT0dfTEVWRUw9ZGVidWdgLCBkdW1wcyB0aGUgKHBvc3Qtc2FuaXRpemUpIEpTT04gYm9keSBzb1xuICogICAgICA0eHggZGVidWdnaW5nIGRvZXNuJ3QgaGF2ZSB0byBmaWdodCBBSSBTREsncyBgW0FycmF5XWBcbiAqICAgICAgZm9ybWF0dGVyLlxuICogICAzLiBSZXBhaXJzIHRoZSBub24tc3RyZWFtaW5nIEpTT04gcmVzcG9uc2UsIHdoZXJlIERhdGFicmlja3MtaG9zdGVkXG4gKiAgICAgIEdlbWluaSByZXR1cm5zIGBjaG9pY2VzW10ubWVzc2FnZS5jb250ZW50YCBhcyBhIHBhcnRzIGFycmF5IHRoYXRcbiAqICAgICAgdGhlIEFJIFNESydzIE9wZW5BSSBzY2hlbWEgcmVqZWN0cyAoc2VlXG4gKiAgICAgIHtAbGluayByZXdyaXRlU2VydmluZ1Jlc3BvbnNlQm9keX0pLlxuICpcbiAqIFNhZmUgdG8gY2FsbCBmcm9tIGFueSBob3QgcGF0aDoge0BsaW5rIGZ1bmN0aW9uTW9kdWxlLm1lbW9pemV9IGVuc3VyZXNcbiAqIHRoZSB3cmFwcGVyIGlzIGluc3RhbGxlZCBhdCBtb3N0IG9uY2UgcGVyIHByb2Nlc3MsIHNvIHN1YnNlcXVlbnRcbiAqIGNhbGxzIGFyZSBhIG5vLW9wIGV2ZW4gd2hlbiB7QGxpbmsgYnVpbGRNb2RlbH0gZmlyZXMgb24gZXZlcnkgYWdlbnRcbiAqIHN0ZXAuXG4gKi9cbmNvbnN0IHNldHVwRmV0Y2hJbnRlcmNlcHRvciA9IGZ1bmN0aW9uTW9kdWxlLm1lbW9pemUoKCk6IHZvaWQgPT4ge1xuICBjb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL2xsbVwiKTtcbiAgY29uc3Qgb3JpZ2luYWwgPSBnbG9iYWxUaGlzLmZldGNoLmJpbmQoZ2xvYmFsVGhpcyk7XG4gIGdsb2JhbFRoaXMuZmV0Y2ggPSAoYXN5bmMgKGlucHV0LCBpbml0KSA9PiB7XG4gICAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIoaW5wdXQpO1xuICAgIGlmIChcbiAgICAgICF1cmwgfHxcbiAgICAgICF1cmwucGF0aG5hbWUuc3RhcnRzV2l0aChTRVJWSU5HX0VORFBPSU5UU19QQVRIX1BSRUZJWCkgfHxcbiAgICAgIHR5cGVvZiBpbml0Py5ib2R5ICE9PSBcInN0cmluZ1wiXG4gICAgKSB7XG4gICAgICByZXR1cm4gb3JpZ2luYWwoaW5wdXQsIGluaXQpO1xuICAgIH1cbiAgICBjb25zdCByZXdyaXR0ZW4gPSByZXdyaXRlU2VydmluZ0JvZHkoaW5pdC5ib2R5KTtcbiAgICBpZiAocmV3cml0dGVuICE9PSBpbml0LmJvZHkpIHtcbiAgICAgIGluaXQgPSB7IC4uLmluaXQsIGJvZHk6IHJld3JpdHRlbiB9O1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlPHVua25vd24+KHJld3JpdHRlbik7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJQT1NUXCIsXG4gICAgICBwYXJzZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgdXJsOiB1cmwudG9TdHJpbmcoKSwgYm9keVR5cGU6IFwibm9uLUpTT05cIiB9XG4gICAgICAgIDogeyB1cmw6IHVybC50b1N0cmluZygpLCBib2R5OiBwYXJzZWQgfSxcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb3JpZ2luYWwoaW5wdXQsIGluaXQpO1xuICAgIHJldHVybiByZXBhaXJTZXJ2aW5nUmVzcG9uc2UocmVzcG9uc2UpO1xuICB9KSBhcyB0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaDtcbn0pO1xuXG4vKipcbiAqIFJld3JpdGUgYSBub24tc3RyZWFtaW5nIHNlcnZpbmcgcmVzcG9uc2Ugd2hvc2UgYm9keSBuZWVkcyByZXBhaXIsIGxlYXZpbmdcbiAqIGV2ZXJ5dGhpbmcgZWxzZSBieXRlLWlkZW50aWNhbC5cbiAqXG4gKiBTdHJlYW1pbmcgdHVybnMgYXJlIHBhc3NlZCBzdHJhaWdodCB0aHJvdWdoOiBhbiBTU0UgYm9keSBtdXN0IHN0YXkgYSBsaXZlXG4gKiBzdHJlYW0gKGJ1ZmZlcmluZyBpdCB0byBhIHN0cmluZyB3b3VsZCBkZWZlYXQgc3RyZWFtaW5nIGFuZCBicmVha1xuICogYHRleHQvZXZlbnQtc3RyZWFtYCBwYXJzaW5nKSwgYW5kIHRoZSBkZWx0YSBmcmFtZXMgYWxyZWFkeSBjYXJyeSBzdHJpbmdcbiAqIGNvbnRlbnQsIHNvIHRoZXkgbmV2ZXIgaGl0IHRoZSBhcnJheS1zaGFwZWQgYGNvbnRlbnRgIGJ1Zy4gTGlrZXdpc2UgYVxuICogbm9uLUpTT04gb3IgZXJyb3IgYm9keSBpcyByZXR1cm5lZCB1bnRvdWNoZWQsIHNvIHRoZSBjYWxsZXIgc3RpbGwgc2VlcyB0aGVcbiAqIG9yaWdpbmFsIHN0YXR1cyBhbmQgaGVhZGVycy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVwYWlyU2VydmluZ1Jlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSA/PyBcIlwiO1xuICBpZiAoIWNvbnRlbnRUeXBlLmluY2x1ZGVzKFwiYXBwbGljYXRpb24vanNvblwiKSkgcmV0dXJuIHJlc3BvbnNlO1xuXG4gIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwb25zZS5jbG9uZSgpLnRleHQoKTtcbiAgY29uc3QgcmV3cml0dGVuID0gcmV3cml0ZVNlcnZpbmdSZXNwb25zZUJvZHkoYm9keSk7XG4gIGlmIChyZXdyaXR0ZW4gPT09IGJvZHkpIHJldHVybiByZXNwb25zZTtcblxuICAvLyBgY29udGVudC1sZW5ndGhgIC8gYGNvbnRlbnQtZW5jb2RpbmdgIGRlc2NyaWJlIHRoZSBPUklHSU5BTCBieXRlcywgc28gdGhleVxuICAvLyBhcmUgZHJvcHBlZDogdGhlIHJld3JpdHRlbiBib2R5IGlzIGEgZGlmZmVyZW50IGxlbmd0aCBhbmQgYWxyZWFkeSBkZWNvZGVkLlxuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gIGhlYWRlcnMuZGVsZXRlKFwiY29udGVudC1sZW5ndGhcIik7XG4gIGhlYWRlcnMuZGVsZXRlKFwiY29udGVudC1lbmNvZGluZ1wiKTtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXdyaXR0ZW4sIHtcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgIGhlYWRlcnMsXG4gIH0pO1xufVxuIl19
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFLeEUsT0FBTyxFQUFFLGVBQWUsRUFBc0MsTUFBTSxhQUFhLENBQUM7QUFDbEYsT0FBTyxFQUNMLGtCQUFrQixFQUNsQiwwQkFBMEIsRUFDMUIsNEJBQTRCLEdBQzdCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLHlCQUF5QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRy9FLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDcEMsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQXFCaEM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQzlCLE1BQTBCLEVBQzFCLGNBQThCLEVBQzlCLFlBQWlDLEVBQUU7SUFFbkMsS0FBSyxxQkFBcUIsRUFBRSxDQUFDO0lBQzdCLGtFQUFrRTtJQUNsRSxxRUFBcUU7SUFDckUscUVBQXFFO0lBQ3JFLHFFQUFxRTtJQUNyRSxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBcUIsQ0FBQztJQUNyRSxNQUFNLGdCQUFnQixHQUFHLElBQUksRUFBRSxnQkFBZ0IsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQ3pFLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENB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Qy9CLE9BQU87S0FDUixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgcmVzb2x2ZXIgZm9yIE1hc3RyYSBhZ2VudHMuXG4gKlxuICogRWFjaCBhZ2VudCBzdGVwIGNhbGxzIHtAbGluayBidWlsZE1vZGVsfSB3aXRoIHRoZSBhY3RpdmVcbiAqIGBSZXF1ZXN0Q29udGV4dGAuIFRoZSB1c2VyIHN0YW1wZWQgYnkgYE1hc3RyYVNlcnZlcmAgY2FycmllcyBhblxuICogQXBwS2l0IGBXb3Jrc3BhY2VDbGllbnRgOyB3ZSBhc2sgaXQgZm9yIHRoZSB3b3Jrc3BhY2UgaG9zdCBhbmQgYVxuICogZnJlc2ggYmVhcmVyIGhlYWRlciwgdGhlbiBwb2ludCBNYXN0cmEncyBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlclxuICogYXQgYC9zZXJ2aW5nLWVuZHBvaW50c2Agb24gdGhhdCBob3N0LlxuICpcbiAqIFRoaXMgbW9kdWxlIG9ubHkgYWRkcyB0aGUgTWFzdHJhLXNwZWNpZmljIGdsdWUuIFRoZSBhY3R1YWwgbW9kZWxcbiAqIHNlbGVjdGlvbiAtIGxpc3RpbmcgdGhlIHdvcmtzcGFjZSBjYXRhbG9ndWUgYW5kIHJlc29sdmluZyBhblxuICogZXhwbGljaXQgbmFtZSAvIGNsYXNzIC8gZmFsbGJhY2sgY2hhaW4gdG8gYSByZWFsIGVuZHBvaW50IGlkIC0gbGl2ZXNcbiAqIGluIGBAZGJ4LXRvb2xzL21vZGVsYCAoe0BsaW5rIHNlbGVjdE1vZGVsfSkgc28gbm9uLU1hc3RyYSBjb25zdW1lcnNcbiAqIChlLmcuIGEgam9iIHRoYXQganVzdCBuZWVkcyBhIG1vZGVsIG5hbWUpIGNhbiByZXVzZSBpdC4gSGVyZSB3ZVxuICogYXNzZW1ibGUgdGhlIGV4cGxpY2l0IGFzayBmcm9tIE1hc3RyYSdzIHJlcXVlc3QgY29udGV4dCAodGhlXG4gKiBwZXItcmVxdWVzdCBvdmVycmlkZSB1bmRlciB7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIHRoZVxuICogYWdlbnQgLyBwbHVnaW4gYG1vZGVsSWRgLCBvciBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgKSxcbiAqIHBhc3MgdGhlIHBsdWdpbidzIGZ1enp5IC8gY2xhc3MgLyBmYWxsYmFjayBrbm9icyB0aHJvdWdoLCBhbmQgd3JhcFxuICogdGhlIHJlc29sdmVkIGlkIGluIHRoZSBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlciBjb25maWcgTWFzdHJhXG4gKiBleHBlY3RzLiBDYXRhbG9ndWUgZmV0Y2hlcyBmYWlsIGxvdWQ6IG5ldHdvcmsgLyBhdXRoIGVycm9yc1xuICogcHJvcGFnYXRlIHNvIGNhbGxlcnMgc2VlIHRoZSByZWFsIFNESyBtZXNzYWdlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY2xhc3NlcywgcmVzb2x2ZSB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBmdW5jdGlvbk1vZHVsZSwganNvbiwgbG9nLCBuZXQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhTW9kZWxDb25maWcgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2xsbVwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5cbmltcG9ydCB7IE1BU1RSQV9VU0VSX0tFWSwgdHlwZSBNYXN0cmFQbHVnaW5Db25maWcsIHR5cGUgVXNlciB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgcmV3cml0ZVNlcnZpbmdCb2R5LFxuICByZXdyaXRlU2VydmluZ1Jlc3BvbnNlQm9keSxcbiAgcmV3cml0ZVNlcnZpbmdSZXNwb25zZVN0cmVhbSxcbn0gZnJvbSBcIi4vc2VydmluZy1zYW5pdGl6ZS50c1wiO1xuaW1wb3J0IHsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgcmVzb2x2ZVNlcnZpbmdDb25maWcgfSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5cbnR5cGUgTW9kZWxDbGFzcyA9IG1vZGVsLk1vZGVsQ2xhc3M7XG5jb25zdCB7IHBhcnNlTW9kZWxDbGFzcyB9ID0gY2xhc3NlcztcbmNvbnN0IHsgc2VsZWN0TW9kZWwgfSA9IHJlc29sdmU7XG5cbi8qKiBPcHRpb25hbCBvdmVycmlkZXMgYWNjZXB0ZWQgYnkge0BsaW5rIGJ1aWxkTW9kZWx9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZE1vZGVsT3ZlcnJpZGVzIHtcbiAgLyoqXG4gICAqIFN0YXRpYyBtb2RlbCBpZCBmcm9tIHRoZSBhZ2VudCAvIHBsdWdpbiBjb25maWcgKHN0cmluZyBzdWdhciBvblxuICAgKiBgZGVmLm1vZGVsYCBvciBgY29uZmlnLmRlZmF1bHRNb2RlbGApLiBMb3NlcyB0byB0aGUgcGVyLXJlcXVlc3RcbiAgICogb3ZlcnJpZGUgYnV0IHdpbnMgb3ZlciBlbnYgLyBjbGFzcyAvIGZhbGxiYWNrLlxuICAgKi9cbiAgbW9kZWxJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIENoYXQgY2FwYWJpbGl0eSBjbGFzcyB0byByZXNvbHZlIHdoZW4gbm8gZXhwbGljaXQgbW9kZWwgaWQgaXNcbiAgICogc3VwcGxpZWQuIFVzZWQgYnkgaW50ZXJuYWwgYWdlbnRzIChlLmcuIHRoZSBjaGFydCBwbGFubmVyIGFza3MgZm9yXG4gICAqIHtAbGluayBtb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0fSkgdG8gZXhwcmVzcyBpbnRlbnQgd2l0aG91dCBwaW5uaW5nIGFuXG4gICAqIGVuZHBvaW50IG5hbWU7IHRoZSBsaXZlIGNhdGFsb2d1ZSBpcyBjbGFzc2lmaWVkIGFuZCB0aGUgdG9wXG4gICAqIGF2YWlsYWJsZSBtb2RlbCBpbiB0aGUgY2xhc3MgaXMgY2hvc2VuLCBmYWxsaW5nIGJhY2sgdG8gdGhlXG4gICAqIGNsYXNzJ3Mgc3RhdGljIGxpc3Qgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBub25lLlxuICAgKi9cbiAgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGBNYXN0cmFNb2RlbENvbmZpZ2AgZm9yIHRoZSBjdXJyZW50IGFnZW50IHN0ZXAuIFJ1bnNcbiAqIHdoaWxlIGBhZ2VudC5zdHJlYW1gIGlzIGluc2lkZSB0aGUgYGFzVXNlcihyZXEpYCBzY29wZSBzbyB0b2tlbnNcbiAqIGFyZSB1c2VyLXNjb3BlZDsgb3V0c2lkZSBhbiBhY3RpdmUgdXNlciBjb250ZXh0IHRoZSB3b3Jrc3BhY2VcbiAqIGNsaWVudCBmYWxscyBiYWNrIHRvIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC5cbiAqXG4gKiBFbmRwb2ludCBwcmVjZWRlbmNlOiB0aGUgcGVyLXJlcXVlc3Qgb3ZlcnJpZGVcbiAqICh7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIG9ubHkgd2hlbiBgY29uZmlnLm1vZGVsT3ZlcnJpZGVgIGFsbG93c1xuICogaXQpLCB0aGVuIHtAbGluayBCdWlsZE1vZGVsT3ZlcnJpZGVzLm1vZGVsSWR9IGZyb20gdGhlIGFnZW50IC8gcGx1Z2luXG4gKiBjb25maWcsIHRoZW4gYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYC4gV2l0aCBub25lIG9mIHRob3NlIHNldCB0aGVcbiAqIGNhcGFiaWxpdHkgY2xhc3MgYW5kIGZhbGxiYWNrIGxhZGRlciBpbiBgQGRieC10b29scy9tb2RlbGAgY2hvb3NlIHRoZVxuICogZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZE1vZGVsKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBvdmVycmlkZXM6IEJ1aWxkTW9kZWxPdmVycmlkZXMgPSB7fSxcbik6IFByb21pc2U8TWFzdHJhTW9kZWxDb25maWc+IHtcbiAgdm9pZCBzZXR1cEZldGNoSW50ZXJjZXB0b3IoKTtcbiAgLy8gVGhlIGNoYXQgcGF0aCBzdGFtcHMgdGhlIEFwcEtpdCB1c2VyIG9uIHRoZSByZXF1ZXN0IGNvbnRleHQgdmlhXG4gIC8vIGBNYXN0cmFTZXJ2ZXJgLiBUaGUgTUNQIHRyYW5zcG9ydCByb3V0ZXMgZG9uJ3QgdGhyZWFkIHRoYXQgY29udGV4dFxuICAvLyBpbnRvIHRvb2wgZXhlY3V0aW9uLCBzbyBmYWxsIGJhY2sgdG8gdGhlIGFtYmllbnQgZXhlY3V0aW9uIGNvbnRleHRcbiAgLy8gKHRoZSBhY3RpdmUgT0JPIHNjb3BlLCBvciB0aGUgc2VydmljZSBwcmluY2lwYWwpIHdoZW4gaXQncyBhYnNlbnQuXG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gdXNlcj8uZXhlY3V0aW9uQ29udGV4dCA/PyBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGNvbnN0IGNsaWVudENvbmZpZyA9IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LmNvbmZpZztcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnRDb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgYXdhaXQgY2xpZW50Q29uZmlnLmF1dGhlbnRpY2F0ZShoZWFkZXJzKTtcbiAgLy8gVGhlIE9wZW5BSSBOb2RlIFNESyBhcHBlbmRzIHBhdGhzIGxpa2UgYC9jaGF0L2NvbXBsZXRpb25zYCB0byB3aGF0ZXZlclxuICAvLyBVUkwgd2UgaGFuZCBpdC4gRHJvcCB0aGUgdHJhaWxpbmcgc2xhc2ggc28gdGhlIHJlc3VsdGluZyBVUkwgc3RheXNcbiAgLy8gd2VsbC1mb3JtZWQgKGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2ApLlxuICBjb25zdCB1cmwgPSBuZXcgVVJMKFwiL3NlcnZpbmctZW5kcG9pbnRzXCIsIGhvc3QpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuXG4gIGNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoY29uZmlnKTtcbiAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKGNvbmZpZyk7XG4gIGNvbnN0IG92ZXJyaWRlID0gc2VydmluZy5hbGxvd092ZXJyaWRlXG4gICAgPyAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVkpIGFzIHN0cmluZyB8IHVuZGVmaW5lZClcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBUaGUgb3ZlcnJpZGUgLyBhZ2VudCBkZWZhdWx0IC8gZW52IHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBjb25jcmV0ZVxuICAvLyBlbmRwb2ludCBuYW1lIG9yIGEgbW9kZWwgY2xhc3Mgc2x1ZyAoXCJjaGF0LXRoaW5raW5nXCIgL1xuICAvLyBcImNoYXQtYmFsYW5jZWRcIiAvIFwiY2hhdC1mYXN0XCIpLiBBIGNsYXNzIHNsdWcgYmVjb21lcyBhIGNsYXNzIGludGVudFxuICAvLyAobGV0IHRoZSBsaXZlIGNhdGFsb2d1ZSBwaWNrIHRoZSBiZXN0IG1vZGVsIGluIHRoYXQgYmFuZCk7IGFueXRoaW5nXG4gIC8vIGVsc2UgaXMgYW4gZXhwbGljaXQgbmFtZSBmdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlIGNhdGFsb2d1ZS4gQW5cbiAgLy8gaW50ZXJuYWwgYG92ZXJyaWRlcy5tb2RlbENsYXNzYCAoZS5nLiB0aGUgY2hhcnQgcGxhbm5lcikgaXMgdGhlXG4gIC8vIGZsb29yIHdoZW4gbm90aGluZyB3YXMgcmVxdWVzdGVkLlxuICBjb25zdCByZXF1ZXN0ZWQgPSBvdmVycmlkZSA/PyBvdmVycmlkZXMubW9kZWxJZCA/PyBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRTtcbiAgY29uc3QgcmVxdWVzdGVkQ2xhc3MgPSByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCA/IHBhcnNlTW9kZWxDbGFzcyhyZXF1ZXN0ZWQpIDogbnVsbDtcbiAgY29uc3QgZXhwbGljaXQgPSByZXF1ZXN0ZWRDbGFzcyA9PT0gbnVsbCA/IHJlcXVlc3RlZCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbW9kZWxDbGFzcyA9IHJlcXVlc3RlZENsYXNzID8/IG92ZXJyaWRlcy5tb2RlbENsYXNzO1xuXG4gIGNvbnN0IHsgbW9kZWxJZCwgc291cmNlIH0gPSBhd2FpdCBzZWxlY3RNb2RlbChleGVjdXRpb25Db250ZXh0LmNsaWVudCwgaG9zdCwge1xuICAgIC4uLihleHBsaWNpdCAhPT0gdW5kZWZpbmVkID8geyBleHBsaWNpdCB9IDoge30pLFxuICAgIGZ1enp5OiBzZXJ2aW5nLmZ1enp5LFxuICAgIHRocmVzaG9sZDogc2VydmluZy50aHJlc2hvbGQsXG4gICAgLi4uKG1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IHsgbW9kZWxDbGFzcyB9IDoge30pLFxuICAgIGZhbGxiYWNrczogc2VydmluZy5mYWxsYmFja3MsXG4gICAgdHRsTXM6IHNlcnZpbmcudHRsTXMsXG4gIH0pO1xuICBsb2dnZXIuZGVidWcoXCJtb2RlbCBzZWxlY3RlZFwiLCB7IG1vZGVsSWQsIHNvdXJjZSwgcmVxdWVzdGVkIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcHJvdmlkZXJJZDogY29uZmlnLnByb3ZpZGVySWQgPz8gXCJkYXRhYnJpY2tzXCIsXG4gICAgbW9kZWxJZCxcbiAgICB1cmwsXG4gICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKGhlYWRlcnMuZW50cmllcygpKSxcbiAgfTtcbn1cblxuLyoqIFBhdGggcHJlZml4IHRoYXQgaWRlbnRpZmllcyBhIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBSRVNUIGNhbGwuICovXG5jb25zdCBTRVJWSU5HX0VORFBPSU5UU19QQVRIX1BSRUZJWCA9IFwiL3NlcnZpbmctZW5kcG9pbnRzL1wiO1xuXG4vKipcbiAqIEluc3RhbGwgYSBzaW5nbGUgc2hhcmVkIGBnbG9iYWxUaGlzLmZldGNoYCB3cmFwcGVyIGZvciBldmVyeSBQT1NUIHRvXG4gKiBgL3NlcnZpbmctZW5kcG9pbnRzLy4uLmAuIFRoZSB3cmFwcGVyIGRvZXMgdHdvIHRoaW5nczpcbiAqXG4gKiAgIDEuIFJld3JpdGVzIHRoZSBvdXRnb2luZyBgbWVzc2FnZXNgIGFycmF5IHRvIHJlcGFpciBNYXN0cmEvQUkgU0RLXG4gKiAgICAgIHN0cmVhbS1yZXBsYXkgcXVpcmtzIHRoYXQgRGF0YWJyaWNrcy1ob3N0ZWQgQ2xhdWRlIHJlamVjdHMgKHNlZVxuICogICAgICB7QGxpbmsgcmV3cml0ZVNlcnZpbmdCb2R5fSBpbiBgLi9zZXJ2aW5nLXNhbml0aXplLmpzYCkuXG4gKiAgIDIuIEF0IGBMT0dfTEVWRUw9ZGVidWdgLCBkdW1wcyB0aGUgKHBvc3Qtc2FuaXRpemUpIEpTT04gYm9keSBzb1xuICogICAgICA0eHggZGVidWdnaW5nIGRvZXNuJ3QgaGF2ZSB0byBmaWdodCBBSSBTREsncyBgW0FycmF5XWBcbiAqICAgICAgZm9ybWF0dGVyLlxuICogICAzLiBSZXBhaXJzIGJ1ZmZlcmVkIGFuZCBzdHJlYW1pbmcgcmVzcG9uc2VzIHdoZXJlIGEgcHJvdmlkZXIgcmV0dXJuc1xuICogICAgICBgY2hvaWNlc1tdLm1lc3NhZ2UuY29udGVudGAgb3IgYGNob2ljZXNbXS5kZWx0YS5jb250ZW50YCBhcyBhIHBhcnRzXG4gKiAgICAgIGFycmF5IHRoYXQgdGhlIEFJIFNESydzIE9wZW5BSSBzY2hlbWEgcmVqZWN0cy5cbiAqXG4gKiBTYWZlIHRvIGNhbGwgZnJvbSBhbnkgaG90IHBhdGg6IHtAbGluayBmdW5jdGlvbk1vZHVsZS5tZW1vaXplfSBlbnN1cmVzXG4gKiB0aGUgd3JhcHBlciBpcyBpbnN0YWxsZWQgYXQgbW9zdCBvbmNlIHBlciBwcm9jZXNzLCBzbyBzdWJzZXF1ZW50XG4gKiBjYWxscyBhcmUgYSBuby1vcCBldmVuIHdoZW4ge0BsaW5rIGJ1aWxkTW9kZWx9IGZpcmVzIG9uIGV2ZXJ5IGFnZW50XG4gKiBzdGVwLlxuICovXG5jb25zdCBzZXR1cEZldGNoSW50ZXJjZXB0b3IgPSBmdW5jdGlvbk1vZHVsZS5tZW1vaXplKCgpOiB2b2lkID0+IHtcbiAgY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9sbG1cIik7XG4gIGNvbnN0IG9yaWdpbmFsID0gZ2xvYmFsVGhpcy5mZXRjaC5iaW5kKGdsb2JhbFRoaXMpO1xuICBnbG9iYWxUaGlzLmZldGNoID0gKGFzeW5jIChpbnB1dCwgaW5pdCkgPT4ge1xuICAgIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKGlucHV0KTtcbiAgICBpZiAoXG4gICAgICAhdXJsIHx8XG4gICAgICAhdXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoU0VSVklOR19FTkRQT0lOVFNfUEFUSF9QUkVGSVgpIHx8XG4gICAgICB0eXBlb2YgaW5pdD8uYm9keSAhPT0gXCJzdHJpbmdcIlxuICAgICkge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsKGlucHV0LCBpbml0KTtcbiAgICB9XG4gICAgY29uc3QgcmV3cml0dGVuID0gcmV3cml0ZVNlcnZpbmdCb2R5KGluaXQuYm9keSk7XG4gICAgaWYgKHJld3JpdHRlbiAhPT0gaW5pdC5ib2R5KSB7XG4gICAgICBpbml0ID0geyAuLi5pbml0LCBib2R5OiByZXdyaXR0ZW4gfTtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkID0ganNvbi5wYXJzZTx1bmtub3duPihyZXdyaXR0ZW4pO1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiUE9TVFwiLFxuICAgICAgcGFyc2VkID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IHVybDogdXJsLnRvU3RyaW5nKCksIGJvZHlUeXBlOiBcIm5vbi1KU09OXCIgfVxuICAgICAgICA6IHsgdXJsOiB1cmwudG9TdHJpbmcoKSwgYm9keTogcGFyc2VkIH0sXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9yaWdpbmFsKGlucHV0LCBpbml0KTtcbiAgICByZXR1cm4gcmVwYWlyU2VydmluZ1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfSkgYXMgdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG59KTtcblxuLyoqXG4gKiBSZXdyaXRlIGEgc2VydmluZyByZXNwb25zZSB3aG9zZSBib2R5IG5lZWRzIHJlcGFpciwgbGVhdmluZyB1bnN1cHBvcnRlZFxuICogY29udGVudCB0eXBlcyBieXRlLWlkZW50aWNhbC5cbiAqXG4gKiBTU0UgcmVtYWlucyBhIGxpdmUgc3RyZWFtOiBhIFRyYW5zZm9ybVN0cmVhbSByZXBhaXJzIGNvbXBsZXRlIGBkYXRhOmAgbGluZXNcbiAqIGFzIGJ5dGVzIGFycml2ZSBhbmQgcHJlc2VydmVzIHBhcnRpYWwgbGluZXMgYWNyb3NzIG5ldHdvcmsgY2h1bmtzLiBKU09OIGlzXG4gKiBidWZmZXJlZCB0aHJvdWdoIHRoZSBleGlzdGluZyByZXNwb25zZS1ib2R5IHJlcGFpci4gQSBub24tSlNPTi9ub24tU1NFIGJvZHlcbiAqIGlzIHJldHVybmVkIHVudG91Y2hlZCBzbyB0aGUgY2FsbGVyIHN0aWxsIHNlZXMgdGhlIG9yaWdpbmFsIHJlc3BvbnNlLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXBhaXJTZXJ2aW5nUmVzcG9uc2UocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpID8/IFwiXCI7XG4gIGlmIChjb250ZW50VHlwZS5pbmNsdWRlcyhcInRleHQvZXZlbnQtc3RyZWFtXCIpICYmIHJlc3BvbnNlLmJvZHkpIHtcbiAgICByZXR1cm4gcmVidWlsZFNlcnZpbmdSZXNwb25zZShyZXNwb25zZSwgcmV3cml0ZVNlcnZpbmdSZXNwb25zZVN0cmVhbShyZXNwb25zZS5ib2R5KSk7XG4gIH1cbiAgaWYgKCFjb250ZW50VHlwZS5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikpIHJldHVybiByZXNwb25zZTtcblxuICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UuY2xvbmUoKS50ZXh0KCk7XG4gIGNvbnN0IHJld3JpdHRlbiA9IHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VCb2R5KGJvZHkpO1xuICBpZiAocmV3cml0dGVuID09PSBib2R5KSByZXR1cm4gcmVzcG9uc2U7XG4gIHJldHVybiByZWJ1aWxkU2VydmluZ1Jlc3BvbnNlKHJlc3BvbnNlLCByZXdyaXR0ZW4pO1xufVxuXG4vKiogUmVidWlsZCBhIHRyYW5zZm9ybWVkIHJlc3BvbnNlIHdpdGhvdXQgc3RhbGUgYnl0ZS1sZW5ndGgvZW5jb2RpbmcgaGVhZGVycy4gKi9cbmZ1bmN0aW9uIHJlYnVpbGRTZXJ2aW5nUmVzcG9uc2UoXG4gIHJlc3BvbnNlOiBSZXNwb25zZSxcbiAgYm9keTogc3RyaW5nIHwgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sXG4pOiBSZXNwb25zZSB7XG4gIC8vIGBjb250ZW50LWxlbmd0aGAgLyBgY29udGVudC1lbmNvZGluZ2AgZGVzY3JpYmUgdGhlIE9SSUdJTkFMIGJ5dGVzLCBzbyB0aGV5XG4gIC8vIGFyZSBkcm9wcGVkOiB0aGUgcmV3cml0dGVuIGJvZHkgaXMgYSBkaWZmZXJlbnQgbGVuZ3RoIGFuZCBhbHJlYWR5IGRlY29kZWQuXG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKTtcbiAgaGVhZGVycy5kZWxldGUoXCJjb250ZW50LWxlbmd0aFwiKTtcbiAgaGVhZGVycy5kZWxldGUoXCJjb250ZW50LWVuY29kaW5nXCIpO1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKGJvZHksIHtcbiAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgIGhlYWRlcnMsXG4gIH0pO1xufVxuIl19
@@ -7,8 +7,9 @@
7
7
  * Databricks-hosted Claude rejects replayed extended-thinking blocks and reads
8
8
  * a trailing assistant message as a prefill request.
9
9
  *
10
- * Inbound ({@link rewriteServingResponseBody}), because Databricks-hosted
11
- * Gemini answers with its native content-parts array where the OpenAI contract
10
+ * Inbound ({@link rewriteServingResponseBody} and
11
+ * {@link rewriteServingResponseStream}), because Databricks-hosted Gemini and
12
+ * Claude can answer with native content-parts arrays where the OpenAI contract
12
13
  * (and therefore the AI SDK's response schema) requires a plain string.
13
14
  *
14
15
  * Every repair here is a provider quirk rather than a schema violation, so all
@@ -75,6 +76,13 @@ export declare function repairAssistantPrefill(messages: ServingChatMessage[]):
75
76
  * {@link rewriteServingBody} on the request side.
76
77
  */
77
78
  export declare function rewriteServingResponseBody(body: string): string;
79
+ /**
80
+ * Repair array-valued `choices[].delta.content` inside an OpenAI SSE stream
81
+ * without buffering the response. The decoder retains partial lines across
82
+ * arbitrary network chunk boundaries; each complete `data:` line is parsed and
83
+ * re-encoded only when its content needs normalization.
84
+ */
85
+ export declare function rewriteServingResponseStream(body: ReadableStream<Uint8Array>): ReadableStream<Uint8Array>;
78
86
  /**
79
87
  * Collapse a structured `choices[].message.content` array to the plain string
80
88
  * the OpenAI Chat Completions contract specifies.
@@ -93,12 +101,17 @@ export declare function rewriteServingResponseBody(body: string): string;
93
101
  * uses `doGenerate` for its side calls, so the visible symptom is
94
102
  * `Error generating title` - every thread keeps its placeholder name.
95
103
  *
96
- * Flattening on the wire keeps the repair in one place: the streaming path is
97
- * unaffected (deltas already carry string content), and neither the agent's
104
+ * Flattening on the wire keeps the repair in one place: neither the agent's
98
105
  * stored transcript nor the UI has to know the provider emitted parts. Any
99
- * non-text part (a `thoughtSignature`-only entry, an inline image) contributes
100
- * nothing, matching {@link openaiChat.chatContentToText}, and an all-parts-empty
101
- * message flattens to `""` rather than being dropped, so `finish_reason` and
102
- * `usage` still round-trip.
106
+ * non-text part (a reasoning block, `thoughtSignature`-only entry, or inline
107
+ * image) contributes nothing, matching {@link openaiChat.chatContentToText},
108
+ * and an all-parts-empty message flattens to `""` rather than being dropped, so
109
+ * `finish_reason` and `usage` still round-trip.
103
110
  */
104
111
  export declare function flattenChoiceMessageContent(payload: Record<string, unknown>): boolean;
112
+ /**
113
+ * Collapse structured streaming `choices[].delta.content` arrays to strings.
114
+ * Claude reasoning-only chunks become an empty content delta while text parts
115
+ * are concatenated in order.
116
+ */
117
+ export declare function flattenChoiceDeltaContent(payload: Record<string, unknown>): boolean;
@@ -7,8 +7,9 @@
7
7
  * Databricks-hosted Claude rejects replayed extended-thinking blocks and reads
8
8
  * a trailing assistant message as a prefill request.
9
9
  *
10
- * Inbound ({@link rewriteServingResponseBody}), because Databricks-hosted
11
- * Gemini answers with its native content-parts array where the OpenAI contract
10
+ * Inbound ({@link rewriteServingResponseBody} and
11
+ * {@link rewriteServingResponseStream}), because Databricks-hosted Gemini and
12
+ * Claude can answer with native content-parts arrays where the OpenAI contract
12
13
  * (and therefore the AI SDK's response schema) requires a plain string.
13
14
  *
14
15
  * Every repair here is a provider quirk rather than a schema violation, so all
@@ -74,9 +75,10 @@ export function stripReasoningFromServingMessages(messages) {
74
75
  delete msg.reasoning_content;
75
76
  changed = true;
76
77
  }
77
- if (!Array.isArray(msg.content))
78
+ const parts = openaiChat.chatContentParts(msg.content);
79
+ if (!parts)
78
80
  continue;
79
- const filtered = msg.content.filter((part) => {
81
+ const filtered = parts.filter((part) => {
80
82
  const type = part?.type;
81
83
  if (typeof type === "string" && REASONING_PART_TYPES.has(type)) {
82
84
  changed = true;
@@ -84,7 +86,7 @@ export function stripReasoningFromServingMessages(messages) {
84
86
  }
85
87
  return true;
86
88
  });
87
- if (filtered.length !== msg.content.length) {
89
+ if (filtered.length !== parts.length) {
88
90
  msg.content = filtered;
89
91
  }
90
92
  const hasToolCalls = Array.isArray(msg.tool_calls) && msg.tool_calls.length > 0;
@@ -160,9 +162,10 @@ function isEmptyServingContent(content) {
160
162
  return true;
161
163
  if (typeof content === "string")
162
164
  return content.trim().length === 0;
163
- if (!Array.isArray(content))
165
+ const parts = openaiChat.chatContentParts(content);
166
+ if (!parts)
164
167
  return true;
165
- return content.every((part) => {
168
+ return parts.every((part) => {
166
169
  if (part?.type === "text") {
167
170
  return typeof part.text !== "string" || part.text.trim().length === 0;
168
171
  }
@@ -181,6 +184,46 @@ export function rewriteServingResponseBody(body) {
181
184
  return body;
182
185
  return flattenChoiceMessageContent(parsed) ? JSON.stringify(parsed) : body;
183
186
  }
187
+ /**
188
+ * Repair array-valued `choices[].delta.content` inside an OpenAI SSE stream
189
+ * without buffering the response. The decoder retains partial lines across
190
+ * arbitrary network chunk boundaries; each complete `data:` line is parsed and
191
+ * re-encoded only when its content needs normalization.
192
+ */
193
+ export function rewriteServingResponseStream(body) {
194
+ const decoder = new TextDecoder();
195
+ const encoder = new TextEncoder();
196
+ let buffer = "";
197
+ return body.pipeThrough(new TransformStream({
198
+ transform(chunk, controller) {
199
+ buffer += decoder.decode(chunk, { stream: true });
200
+ let newline = buffer.indexOf("\n");
201
+ while (newline >= 0) {
202
+ const line = buffer.slice(0, newline + 1);
203
+ buffer = buffer.slice(newline + 1);
204
+ controller.enqueue(encoder.encode(rewriteServingResponseStreamLine(line)));
205
+ newline = buffer.indexOf("\n");
206
+ }
207
+ },
208
+ flush(controller) {
209
+ buffer += decoder.decode();
210
+ if (buffer)
211
+ controller.enqueue(encoder.encode(rewriteServingResponseStreamLine(buffer)));
212
+ },
213
+ }));
214
+ }
215
+ /** Normalize one SSE line while preserving its `data:` spacing and line ending. */
216
+ function rewriteServingResponseStreamLine(line) {
217
+ const lineEnding = line.endsWith("\r\n") ? "\r\n" : line.endsWith("\n") ? "\n" : "";
218
+ const content = lineEnding ? line.slice(0, -lineEnding.length) : line;
219
+ const match = /^(data:\s*)(.*)$/.exec(content);
220
+ if (!match || match[2] === "[DONE]")
221
+ return line;
222
+ const parsed = json.parseRecord(match[2]);
223
+ if (!parsed || !flattenChoiceDeltaContent(parsed))
224
+ return line;
225
+ return `${match[1]}${JSON.stringify(parsed)}${lineEnding}`;
226
+ }
184
227
  /**
185
228
  * Collapse a structured `choices[].message.content` array to the plain string
186
229
  * the OpenAI Chat Completions contract specifies.
@@ -199,30 +242,42 @@ export function rewriteServingResponseBody(body) {
199
242
  * uses `doGenerate` for its side calls, so the visible symptom is
200
243
  * `Error generating title` - every thread keeps its placeholder name.
201
244
  *
202
- * Flattening on the wire keeps the repair in one place: the streaming path is
203
- * unaffected (deltas already carry string content), and neither the agent's
245
+ * Flattening on the wire keeps the repair in one place: neither the agent's
204
246
  * stored transcript nor the UI has to know the provider emitted parts. Any
205
- * non-text part (a `thoughtSignature`-only entry, an inline image) contributes
206
- * nothing, matching {@link openaiChat.chatContentToText}, and an all-parts-empty
207
- * message flattens to `""` rather than being dropped, so `finish_reason` and
208
- * `usage` still round-trip.
247
+ * non-text part (a reasoning block, `thoughtSignature`-only entry, or inline
248
+ * image) contributes nothing, matching {@link openaiChat.chatContentToText},
249
+ * and an all-parts-empty message flattens to `""` rather than being dropped, so
250
+ * `finish_reason` and `usage` still round-trip.
209
251
  */
210
252
  export function flattenChoiceMessageContent(payload) {
253
+ return flattenChoiceContent(payload, "message");
254
+ }
255
+ /**
256
+ * Collapse structured streaming `choices[].delta.content` arrays to strings.
257
+ * Claude reasoning-only chunks become an empty content delta while text parts
258
+ * are concatenated in order.
259
+ */
260
+ export function flattenChoiceDeltaContent(payload) {
261
+ return flattenChoiceContent(payload, "delta");
262
+ }
263
+ /** Shared choice walker for buffered `message` and streaming `delta` payloads. */
264
+ function flattenChoiceContent(payload, field) {
211
265
  if (!Array.isArray(payload.choices))
212
266
  return false;
213
267
  let changed = false;
214
268
  for (const choice of payload.choices) {
215
269
  if (!choice || typeof choice !== "object")
216
270
  continue;
217
- const message = choice.message;
218
- if (!message || typeof message !== "object")
271
+ const container = choice[field];
272
+ if (!container || typeof container !== "object")
219
273
  continue;
220
- const target = message;
221
- if (!Array.isArray(target.content))
274
+ const target = container;
275
+ const parts = openaiChat.chatContentParts(target.content);
276
+ if (!parts)
222
277
  continue;
223
- target.content = openaiChat.chatContentToText(target.content, { types: ["text"] });
278
+ target.content = openaiChat.chatContentToText(parts, { types: ["text"] });
224
279
  changed = true;
225
280
  }
226
281
  return changed;
227
282
  }
228
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmluZy1zYW5pdGl6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aW5nLXNhbml0aXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBR0wsVUFBVSxFQUNWLGVBQWUsR0FDaEIsTUFBTSx5QkFBeUIsQ0FBQztBQWVqQyw4RUFBOEU7QUFDOUUsc0NBQXNDO0FBQ3RDLE1BQU0sb0JBQW9CLEdBQUcsZUFBZSxDQUFDLGVBQWUsQ0FBQztBQUU3RDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQVk7SUFDN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXpCLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFdkUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFnQyxDQUFDO1FBQ3pELHVFQUF1RTtRQUN2RSwwRUFBMEU7UUFDMUUsTUFBTSxRQUFRLEdBQUcsaUNBQWlDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsT0FBTyxHQUFHLE9BQU8sSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDO0lBQzVDLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNB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QU8sS0FBSyxDQUFDO0lBQ2xELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7WUFBRSxTQUFTO1FBQ3BELE1BQU0sT0FBTyxHQUFJLE1BQWdDLENBQUMsT0FBTyxDQUFDO1FBQzFELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUTtZQUFFLFNBQVM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsT0FBZ0MsQ0FBQztRQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQUUsU0FBUztRQUM3QyxNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDakIsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlcGFpcnMgdHJhZmZpYyBiZXR3ZWVuIE1hc3RyYSAvIHRoZSBBSSBTREsgYW5kIERhdGFicmlja3MgTW9kZWwgU2VydmluZydzXG4gKiBPcGVuQUktY29tcGF0aWJsZSBgL2NoYXQvY29tcGxldGlvbnNgIHJvdXRlLCBpbiBib3RoIGRpcmVjdGlvbnMuXG4gKlxuICogT3V0Ym91bmQgKHtAbGluayByZXdyaXRlU2VydmluZ0JvZHl9KSwgYmVjYXVzZSB0aGUgdHJhbnNjcmlwdCBNYXN0cmFcbiAqIHBlcnNpc3RzIGlzIG5vdCBhbHdheXMgYSB0cmFuc2NyaXB0IHRoZSBwcm92aWRlciB3aWxsIGFjY2VwdCBiYWNrOlxuICogRGF0YWJyaWNrcy1ob3N0ZWQgQ2xhdWRlIHJlamVjdHMgcmVwbGF5ZWQgZXh0ZW5kZWQtdGhpbmtpbmcgYmxvY2tzIGFuZCByZWFkc1xuICogYSB0cmFpbGluZyBhc3Npc3RhbnQgbWVzc2FnZSBhcyBhIHByZWZpbGwgcmVxdWVzdC5cbiAqXG4gKiBJbmJvdW5kICh7QGxpbmsgcmV3cml0ZVNlcnZpbmdSZXNwb25zZUJvZHl9KSwgYmVjYXVzZSBEYXRhYnJpY2tzLWhvc3RlZFxuICogR2VtaW5pIGFuc3dlcnMgd2l0aCBpdHMgbmF0aXZlIGNvbnRlbnQtcGFydHMgYXJyYXkgd2hlcmUgdGhlIE9wZW5BSSBjb250cmFjdFxuICogKGFuZCB0aGVyZWZvcmUgdGhlIEFJIFNESydzIHJlc3BvbnNlIHNjaGVtYSkgcmVxdWlyZXMgYSBwbGFpbiBzdHJpbmcuXG4gKlxuICogRXZlcnkgcmVwYWlyIGhlcmUgaXMgYSBwcm92aWRlciBxdWlyayByYXRoZXIgdGhhbiBhIHNjaGVtYSB2aW9sYXRpb24sIHNvIGFsbFxuICogb2YgdGhlbSBhcmUgYXBwbGllZCBvbiB0aGUgd2lyZSAoc2VlIHRoZSBgZ2xvYmFsVGhpcy5mZXRjaGAgd3JhcHBlciBpblxuICogYG1vZGVsLnRzYCkgcmF0aGVyIHRoYW4gYnkgY2hhbmdpbmcgd2hhdCB0aGUgYWdlbnQgc3RvcmVzIG9yIHdoYXQgdGhlIFVJXG4gKiBzaG93cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsganNvbiwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ2hhdE1lc3NhZ2UsXG4gIHR5cGUgQ2hhdFJvbGUsXG4gIG9wZW5haUNoYXQsXG4gIG9wZW5haVJlc3BvbnNlcyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5cbi8qKlxuICogQSBjaGF0IG1lc3NhZ2UgYXMgaXQgYXJyaXZlcyBvbiB0aGUgc2VydmluZyB3aXJlLCBwbHVzIHRoZSBleHRlbmRlZC10aGlua2luZ1xuICogZmllbGRzIERhdGFicmlja3MtaG9zdGVkIENsYXVkZSBhZGRzLiBUaGUgT3BlbkFJLXN0YW5kYXJkIHBhcnQgb2YgdGhlIHNoYXBlXG4gKiBpcyB7QGxpbmsgQ2hhdE1lc3NhZ2V9IGZyb20gYEBkYngtdG9vbHMvc2hhcmVkLW1vZGVsYDsgb25seSB0aGUgcHJvdmlkZXJcbiAqIGV4dGVuc2lvbnMgdGhpcyBtb2R1bGUgc3RyaXBzIGFyZSBkZWNsYXJlZCBoZXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpbmdDaGF0TWVzc2FnZSBleHRlbmRzIENoYXRNZXNzYWdlIHtcbiAgLyoqIE5hcnJvd2VkIHRvIHRoZSByb2xlcyB0aGlzIHJlcGFpciBwYXNzIHJlYXNvbnMgYWJvdXQsIHBsdXMgQ2xhdWRlJ3MgYHJlYXNvbmluZ2AgdHVybi4gKi9cbiAgcm9sZTogQ2hhdFJvbGUgfCBcInJlYXNvbmluZ1wiO1xuICByZWFzb25pbmc/OiB1bmtub3duO1xuICByZWFzb25pbmdfY29udGVudD86IHVua25vd247XG59XG5cbi8vIFNoYXJlZCB3aXRoIHRoZSBSZXNwb25zZXMgc2FuaXRpemUgcGF0aCBzbyBib3RoIHdpcmUgc3VyZmFjZXMgYWdyZWUgb24gd2hhdFxuLy8gY291bnRzIGFzIGEgc2lnbmVkIHJlYXNvbmluZyBibG9jay5cbmNvbnN0IFJFQVNPTklOR19QQVJUX1RZUEVTID0gb3BlbmFpUmVzcG9uc2VzLlJFQVNPTklOR19UWVBFUztcblxuLyoqXG4gKiBQYXJzZSwgc2FuaXRpemUsIGFuZCByZS1zZXJpYWxpemUgYSBgL3NlcnZpbmctZW5kcG9pbnRzLy4uLmAgUE9TVFxuICogYm9keS4gUmV0dXJucyB0aGUgb3JpZ2luYWwgc3RyaW5nIHZlcmJhdGltIHdoZW4gdGhlIGJvZHkgaXMgbm90XG4gKiBKU09OIG9yIG5vIHJld3JpdGUgd2FzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJld3JpdGVTZXJ2aW5nQm9keShib2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlUmVjb3JkKGJvZHkpO1xuICBpZiAoIXBhcnNlZCkgcmV0dXJuIGJvZHk7XG5cbiAgLy8gUnVucyByZWdhcmRsZXNzIG9mIGBtZXNzYWdlc2A6IERhdGFicmlja3MgcmVmdXNlcyB0byBwYXJzZSBhIGJvZHkgY2FycnlpbmdcbiAgLy8gYW4gdW5rbm93biB0b3AtbGV2ZWwgZmllbGQsIHNvIHRoaXMgZmFpbHVyZSBpcyBub3Qgc3BlY2lmaWMgdG8gYSB0cmFuc2NyaXB0LlxuICBsZXQgY2hhbmdlZCA9IG9wZW5haUNoYXQuc3RyaXBVbnN1cHBvcnRlZENoYXRGaWVsZHMocGFyc2VkKS5sZW5ndGggPiAwO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHBhcnNlZC5tZXNzYWdlcykpIHtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHBhcnNlZC5tZXNzYWdlcyBhcyBTZXJ2aW5nQ2hhdE1lc3NhZ2VbXTtcbiAgICAvLyBFdmFsdWF0ZWQgZWFnZXJseSwgbm90IHNob3J0LWNpcmN1aXRlZDogb25lIHRyYW5zY3JpcHQgY2FuIG5lZWQgYm90aFxuICAgIC8vIHJlYXNvbmluZyBibG9ja3Mgc3RyaXBwZWQgQU5EIGEgdHJhaWxpbmcgYXNzaXN0YW50IHByZWZpbGwgZm9sZGVkIGJhY2suXG4gICAgY29uc3Qgc3RyaXBwZWQgPSBzdHJpcFJlYXNvbmluZ0Zyb21TZXJ2aW5nTWVzc2FnZXMobWVzc2FnZXMpO1xuICAgIGNvbnN0IHJlcGFpcmVkID0gcmVwYWlyQXNzaXN0YW50UHJlZmlsbChtZXNzYWdlcyk7XG4gICAgY2hhbmdlZCA9IGNoYW5nZWQgfHwgc3RyaXBwZWQgfHwgcmVwYWlyZWQ7XG4gIH1cblxuICByZXR1cm4gY2hhbmdlZCA/IEpTT04uc3RyaW5naWZ5KHBhcnNlZCkgOiBib2R5O1xufVxuXG4vKipcbiAqIERyb3AgZXh0ZW5kZWQtdGhpbmtpbmcgLyByZWFzb25pbmcgYmxvY2tzIGZyb20gYSByZXBsYXllZCB0cmFuc2NyaXB0LlxuICpcbiAqIEh5YnJpZCBDbGF1ZGUgZW5kcG9pbnRzIChlLmcuIFNvbm5ldCA0LjUrKSBtYXkgZW1pdCBgcmVhc29uaW5nYCBjb250ZW50XG4gKiBwYXJ0cyBvbiB0aGUgZmlyc3QgdHVybi4gTWFzdHJhIHBlcnNpc3RzIGFuZCByZXBsYXlzIHRoZW0gb24gdGhlIG5leHRcbiAqIGFnZW50IHN0ZXAsIGJ1dCBEYXRhYnJpY2tzLWhvc3RlZCBDbGF1ZGUgcmVqZWN0cyB0aG9zZSBibG9ja3Mgb25cbiAqIG11bHRpLXR1cm4gdG9vbCBjb250aW51YXRpb25zLiBUaGUgVUkgYWxyZWFkeSBjYXB0dXJlZCByZWFzb25pbmcgZm9yXG4gKiBkaXNwbGF5OyBzdHJpcHBpbmcgaGVyZSBrZWVwcyBwcm92aWRlciByZXBsYXkgY29tcGF0aWJsZSB3aXRob3V0XG4gKiBjaGFuZ2luZyB3aGF0IHVzZXJzIHNlZSBpbiB0aGUgY2hhdCBidWJibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFJlYXNvbmluZ0Zyb21TZXJ2aW5nTWVzc2FnZXMobWVzc2FnZXM6IFNlcnZpbmdDaGF0TWVzc2FnZVtdKTogYm9vbGVhbiB7XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAobGV0IGkgPSBtZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IG1zZyA9IG1lc3NhZ2VzW2ldO1xuICAgIGlmICghbXNnKSBjb250aW51ZTtcbiAgICBpZiAobXNnLnJvbGUgPT09IFwicmVhc29uaW5nXCIpIHtcbiAgICAgIG1lc3NhZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChtc2cucmVhc29uaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBtc2cucmVhc29uaW5nO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChtc2cucmVhc29uaW5nX2NvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIG1zZy5yZWFzb25pbmdfY29udGVudDtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobXNnLmNvbnRlbnQpKSBjb250aW51ZTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IG1zZy5jb250ZW50LmZpbHRlcigocGFydCkgPT4ge1xuICAgICAgY29uc3QgdHlwZSA9IHBhcnQ/LnR5cGU7XG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIgJiYgUkVBU09OSU5HX1BBUlRfVFlQRVMuaGFzKHR5cGUpKSB7XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBpZiAoZmlsdGVyZWQubGVuZ3RoICE9PSBtc2cuY29udGVudC5sZW5ndGgpIHtcbiAgICAgIG1zZy5jb250ZW50ID0gZmlsdGVyZWQ7XG4gICAgfVxuICAgIGNvbnN0IGhhc1Rvb2xDYWxscyA9IEFycmF5LmlzQXJyYXkobXNnLnRvb2xfY2FsbHMpICYmIG1zZy50b29sX2NhbGxzLmxlbmd0aCA+IDA7XG4gICAgaWYgKG1zZy5yb2xlID09PSBcImFzc2lzdGFudFwiICYmICFoYXNUb29sQ2FsbHMgJiYgaXNFbXB0eVNlcnZpbmdDb250ZW50KG1zZy5jb250ZW50KSkge1xuICAgICAgbWVzc2FnZXMuc3BsaWNlKGksIDEpO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG4vKipcbiAqIFJlcGFpciBhIE1hc3RyYS9BSSBTREsgbWVzc2FnZSByZXBsYXkgdGhhdCBEYXRhYnJpY2tzLWhvc3RlZCBDbGF1ZGVcbiAqIHJlamVjdHMgd2l0aCBgXCJUaGlzIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgYXNzaXN0YW50IG1lc3NhZ2VcbiAqIHByZWZpbGwuIFRoZSBjb252ZXJzYXRpb24gbXVzdCBlbmQgd2l0aCBhIHVzZXIgbWVzc2FnZS5cImAuXG4gKlxuICogVGhlIGJ1ZyBwYXR0ZXJuOiB3aGVuIGFuIGFzc2lzdGFudCB0dXJuIHN0cmVhbXMgdGV4dCAqYW5kKiBhXG4gKiBgdG9vbF9jYWxsYCwgdGhlIEFJIFNESyBwZXJzaXN0cyB0aGVtIGFzIHR3byBzZXBhcmF0ZSBhc3Npc3RhbnRcbiAqIGVudHJpZXMgKHRleHQtb25seSBhbmQgdG9vbC1jYWxsLW9ubHkpLiBPbiB0aGUgbmV4dCBhZ2VudCBzdGVwIHRoZVxuICogdG9vbC1jYWxsIGVudHJ5IGlzIHJlcGxheWVkICpiZWZvcmUqIHRoZSB0b29sIHJlc3VsdCBhbmQgdGhlXG4gKiB0ZXh0IGVudHJ5IGlzIHJlcGxheWVkICphZnRlciogaXQsIHNvIHRoZSBjb252ZXJzYXRpb24gZW5kcyB3aXRoIGFcbiAqIHRyYWlsaW5nIGFzc2lzdGFudCB0ZXh0IG1lc3NhZ2UuIEFudGhyb3BpYyBpbnRlcnByZXRzIHRoYXQgYXMgYVxuICogcHJlZmlsbCByZXF1ZXN0IGFuZCByZWplY3RzIGl0IG9uIERhdGFicmlja3MgKHRoZSB1cHN0cmVhbSBCZWRyb2NrXG4gKiByb3V0ZSBkaXNhbGxvd3MgcHJlZmlsbCkuXG4gKlxuICogRml4OiB3aGVuIHRoZSBsYXN0IG1lc3NhZ2UgaXMgYW4gYXNzaXN0YW50IHRleHQgd2l0aCBubyBgdG9vbF9jYWxsc2BcbiAqIGFuZCB0aGUgY2hhaW4gaW1tZWRpYXRlbHkgYmVmb3JlIGl0IGlzIGBhc3Npc3RhbnQodG9vbF9jYWxscz0uLi4pYFxuICogZm9sbG93ZWQgb25seSBieSBgdG9vbCguLi4pYCByZXN1bHRzLCBmb2xkIHRoZSB0cmFpbGluZyB0ZXh0IGJhY2tcbiAqIGludG8gdGhlIGBjb250ZW50YCBvZiB0aGF0IG9wZW5pbmcgYXNzaXN0YW50IGFuZCBkcm9wIHRoZSBkdXBsaWNhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBhaXJBc3Npc3RhbnRQcmVmaWxsKG1lc3NhZ2VzOiBTZXJ2aW5nQ2hhdE1lc3NhZ2VbXSk6IGJvb2xlYW4ge1xuICBpZiAobWVzc2FnZXMubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBsYXN0ID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV07XG4gIGlmICghbGFzdCB8fCBsYXN0LnJvbGUgIT09IFwiYXNzaXN0YW50XCIgfHwgKGxhc3QudG9vbF9jYWxscyAmJiBsYXN0LnRvb2xfY2FsbHMubGVuZ3RoID4gMCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgaSA9IG1lc3NhZ2VzLmxlbmd0aCAtIDI7XG4gIHdoaWxlIChpID49IDAgJiYgbWVzc2FnZXNbaV0/LnJvbGUgPT09IFwidG9vbFwiKSBpLS07XG4gIGlmIChpIDwgMCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBvcGVuZXIgPSBtZXNzYWdlc1tpXTtcbiAgaWYgKFxuICAgICFvcGVuZXIgfHxcbiAgICBvcGVuZXIucm9sZSAhPT0gXCJhc3Npc3RhbnRcIiB8fFxuICAgICFvcGVuZXIudG9vbF9jYWxscyB8fFxuICAgIG9wZW5lci50b29sX2NhbGxzLmxlbmd0aCA9PT0gMFxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXJnZWQgPSBbXG4gICAgc3RyaW5nLnRyaW1Ub051bGwodGV4dEZyb21TZXJ2aW5nQ29udGVudChvcGVuZXIuY29udGVudCkpLFxuICAgIHN0cmluZy50cmltVG9OdWxsKHRleHRGcm9tU2VydmluZ0NvbnRlbnQobGFzdC5jb250ZW50KSksXG4gIF1cbiAgICAuZmlsdGVyKChzKTogcyBpcyBzdHJpbmcgPT4gcyAhPT0gbnVsbClcbiAgICAuam9pbihcIlxcblxcblwiKTtcbiAgb3BlbmVyLmNvbnRlbnQgPSBtZXJnZWQ7XG4gIG1lc3NhZ2VzLnBvcCgpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGNvbnRlbnQgdG8gdGhlIHByb3NlIGEgaHVtYW4gd291bGQgcmVhZDogdGV4dCBwYXJ0cyBvbmx5LCBzZXBhcmF0ZWRcbiAqIGJ5IGJsYW5rIGxpbmVzLCBzaW5jZSB0aGUgcmVzdWx0IGlzIHNwbGljZWQgaW50byBhbm90aGVyIHR1cm4ncyBtZXNzYWdlIGJvZHkuXG4gKi9cbmZ1bmN0aW9uIHRleHRGcm9tU2VydmluZ0NvbnRlbnQoY29udGVudDogU2VydmluZ0NoYXRNZXNzYWdlW1wiY29udGVudFwiXSk6IHN0cmluZyB7XG4gIHJldHVybiBvcGVuYWlDaGF0LmNoYXRDb250ZW50VG9UZXh0KGNvbnRlbnQsIHsgc2VwYXJhdG9yOiBcIlxcblxcblwiLCB0eXBlczogW1widGV4dFwiXSB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgdHVybiBjYXJyaWVzIG5vdGhpbmcgd29ydGggcmVwbGF5aW5nLiBEZWxpYmVyYXRlbHkgc3RyaWN0ZXIgdGhhblxuICogXCJoYXMgbm8gdGV4dFwiOiBhIHBhcnQgb2YgYW55IG90aGVyIHR5cGUgKGFuIGltYWdlLCBhIGNhY2hlIG1hcmtlcikgY291bnRzIGFzXG4gKiBjb250ZW50LCBzbyBhIG1lc3NhZ2UgaG9sZGluZyBvbmUgaXMga2VwdCBldmVuIHRob3VnaCBpdCBoYXMgbm8gcHJvc2UuXG4gKi9cbmZ1bmN0aW9uIGlzRW1wdHlTZXJ2aW5nQ29udGVudChjb250ZW50OiBTZXJ2aW5nQ2hhdE1lc3NhZ2VbXCJjb250ZW50XCJdKTogYm9vbGVhbiB7XG4gIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICBpZiAodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHJldHVybiBjb250ZW50LnRyaW0oKS5sZW5ndGggPT09IDA7XG4gIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBjb250ZW50LmV2ZXJ5KChwYXJ0KSA9PiB7XG4gICAgaWYgKHBhcnQ/LnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHBhcnQudGV4dCAhPT0gXCJzdHJpbmdcIiB8fCBwYXJ0LnRleHQudHJpbSgpLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSwgc2FuaXRpemUsIGFuZCByZS1zZXJpYWxpemUgYSBgL3NlcnZpbmctZW5kcG9pbnRzLy4uLmAgbm9uLXN0cmVhbWluZ1xuICogSlNPTiBSRVNQT05TRSBib2R5LiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzdHJpbmcgdmVyYmF0aW0gd2hlbiB0aGUgYm9keSBpc1xuICogbm90IEpTT04gb3Igbm8gcmV3cml0ZSB3YXMgbmVlZGVkLCBtaXJyb3JpbmdcbiAqIHtAbGluayByZXdyaXRlU2VydmluZ0JvZHl9IG9uIHRoZSByZXF1ZXN0IHNpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXdyaXRlU2VydmluZ1Jlc3BvbnNlQm9keShib2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlUmVjb3JkKGJvZHkpO1xuICBpZiAoIXBhcnNlZCkgcmV0dXJuIGJvZHk7XG4gIHJldHVybiBmbGF0dGVuQ2hvaWNlTWVzc2FnZUNvbnRlbnQocGFyc2VkKSA/IEpTT04uc3RyaW5naWZ5KHBhcnNlZCkgOiBib2R5O1xufVxuXG4vKipcbiAqIENvbGxhcHNlIGEgc3RydWN0dXJlZCBgY2hvaWNlc1tdLm1lc3NhZ2UuY29udGVudGAgYXJyYXkgdG8gdGhlIHBsYWluIHN0cmluZ1xuICogdGhlIE9wZW5BSSBDaGF0IENvbXBsZXRpb25zIGNvbnRyYWN0IHNwZWNpZmllcy5cbiAqXG4gKiBEYXRhYnJpY2tzLWhvc3RlZCBHZW1pbmkgYW5zd2VycyBhIG5vbi1zdHJlYW1pbmcgYC9jaGF0L2NvbXBsZXRpb25zYCBjYWxsXG4gKiB3aXRoIHRoZSBHZW1pbmktbmF0aXZlIHBhcnRzIHNoYXBlOlxuICpcbiAqIGBgYGpzb25cbiAqIFwiY29udGVudFwiOiBbeyBcInR5cGVcIjogXCJ0ZXh0XCIsIFwidGV4dFwiOiBcIi4uLlwiLCBcInRob3VnaHRTaWduYXR1cmVcIjogXCIuLi5cIiB9XVxuICogYGBgXG4gKlxuICogYEBhaS1zZGsvb3BlbmFpLWNvbXBhdGlibGVgIHZhbGlkYXRlcyB0aGUgcmVzcG9uc2UgYWdhaW5zdCB0aGUgT3BlbkFJXG4gKiBzY2hlbWEsIHdoZXJlIGBjb250ZW50YCBpcyBhIG51bGxhYmxlIHN0cmluZywgc28gaXQgdGhyb3dzXG4gKiBgVHlwZSB2YWxpZGF0aW9uIGZhaWxlZDogLi4uIGV4cGVjdGVkIHN0cmluZywgcmVjZWl2ZWQgYXJyYXlgIGFuZCB0aGUgd2hvbGVcbiAqIGNhbGwgZmFpbHMgKGBBSV9BUElDYWxsRXJyb3I6IEludmFsaWQgSlNPTiByZXNwb25zZWAgb24gYW4gSFRUUCAyMDApLiBNYXN0cmFcbiAqIHVzZXMgYGRvR2VuZXJhdGVgIGZvciBpdHMgc2lkZSBjYWxscywgc28gdGhlIHZpc2libGUgc3ltcHRvbSBpc1xuICogYEVycm9yIGdlbmVyYXRpbmcgdGl0bGVgIC0gZXZlcnkgdGhyZWFkIGtlZXBzIGl0cyBwbGFjZWhvbGRlciBuYW1lLlxuICpcbiAqIEZsYXR0ZW5pbmcgb24gdGhlIHdpcmUga2VlcHMgdGhlIHJlcGFpciBpbiBvbmUgcGxhY2U6IHRoZSBzdHJlYW1pbmcgcGF0aCBpc1xuICogdW5hZmZlY3RlZCAoZGVsdGFzIGFscmVhZHkgY2Fycnkgc3RyaW5nIGNvbnRlbnQpLCBhbmQgbmVpdGhlciB0aGUgYWdlbnQnc1xuICogc3RvcmVkIHRyYW5zY3JpcHQgbm9yIHRoZSBVSSBoYXMgdG8ga25vdyB0aGUgcHJvdmlkZXIgZW1pdHRlZCBwYXJ0cy4gQW55XG4gKiBub24tdGV4dCBwYXJ0IChhIGB0aG91Z2h0U2lnbmF0dXJlYC1vbmx5IGVudHJ5LCBhbiBpbmxpbmUgaW1hZ2UpIGNvbnRyaWJ1dGVzXG4gKiBub3RoaW5nLCBtYXRjaGluZyB7QGxpbmsgb3BlbmFpQ2hhdC5jaGF0Q29udGVudFRvVGV4dH0sIGFuZCBhbiBhbGwtcGFydHMtZW1wdHlcbiAqIG1lc3NhZ2UgZmxhdHRlbnMgdG8gYFwiXCJgIHJhdGhlciB0aGFuIGJlaW5nIGRyb3BwZWQsIHNvIGBmaW5pc2hfcmVhc29uYCBhbmRcbiAqIGB1c2FnZWAgc3RpbGwgcm91bmQtdHJpcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5DaG9pY2VNZXNzYWdlQ29udGVudChwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IGJvb2xlYW4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkocGF5bG9hZC5jaG9pY2VzKSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGNob2ljZSBvZiBwYXlsb2FkLmNob2ljZXMpIHtcbiAgICBpZiAoIWNob2ljZSB8fCB0eXBlb2YgY2hvaWNlICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICBjb25zdCBtZXNzYWdlID0gKGNob2ljZSBhcyB7IG1lc3NhZ2U/OiB1bmtub3duIH0pLm1lc3NhZ2U7XG4gICAgaWYgKCFtZXNzYWdlIHx8IHR5cGVvZiBtZXNzYWdlICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICBjb25zdCB0YXJnZXQgPSBtZXNzYWdlIGFzIHsgY29udGVudD86IHVua25vd24gfTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFyZ2V0LmNvbnRlbnQpKSBjb250aW51ZTtcbiAgICB0YXJnZXQuY29udGVudCA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRUb1RleHQodGFyZ2V0LmNvbnRlbnQsIHsgdHlwZXM6IFtcInRleHRcIl0gfSk7XG4gICAgY2hhbmdlZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoYW5nZWQ7XG59XG4iXX0=
283
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmluZy1zYW5pdGl6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aW5nLXNhbml0aXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUdMLFVBQVUsRUFDVixlQUFlLEdBQ2hCLE1BQU0seUJBQXlCLENBQUM7QUFlakMsOEVBQThFO0FBQzlFLHNDQUFzQztBQUN0QyxNQUFNLG9CQUFvQixHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUM7QUFFN0Q7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxJQUFZO0lBQzdDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUV6Qiw2RUFBNkU7SUFDN0UsK0VBQStFO0lBQy9FLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRXZFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBZ0MsQ0FBQztRQUN6RCx1RUFBdUU7UUFDdkUsMEVBQTBFO1FBQzFFLE1BQU0sUUFBUSxHQUFHLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdELE1BQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sR0FBRyxPQUFPLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxT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RUFDaEMsS0FBMEI7SUFFMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2xELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7WUFBRSxTQUFTO1FBQ3BELE1BQU0sU0FBUyxHQUFJLE1BQWtDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRO1lBQUUsU0FBUztRQUMxRCxNQUFNLE1BQU0sR0FBRyxTQUFrQyxDQUFDO1FBQ2xELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLEtBQUs7WUFBRSxTQUFTO1FBQ3JCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRSxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBhaXJzIHRyYWZmaWMgYmV0d2VlbiBNYXN0cmEgLyB0aGUgQUkgU0RLIGFuZCBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcnc1xuICogT3BlbkFJLWNvbXBhdGlibGUgYC9jaGF0L2NvbXBsZXRpb25zYCByb3V0ZSwgaW4gYm90aCBkaXJlY3Rpb25zLlxuICpcbiAqIE91dGJvdW5kICh7QGxpbmsgcmV3cml0ZVNlcnZpbmdCb2R5fSksIGJlY2F1c2UgdGhlIHRyYW5zY3JpcHQgTWFzdHJhXG4gKiBwZXJzaXN0cyBpcyBub3QgYWx3YXlzIGEgdHJhbnNjcmlwdCB0aGUgcHJvdmlkZXIgd2lsbCBhY2NlcHQgYmFjazpcbiAqIERhdGFicmlja3MtaG9zdGVkIENsYXVkZSByZWplY3RzIHJlcGxheWVkIGV4dGVuZGVkLXRoaW5raW5nIGJsb2NrcyBhbmQgcmVhZHNcbiAqIGEgdHJhaWxpbmcgYXNzaXN0YW50IG1lc3NhZ2UgYXMgYSBwcmVmaWxsIHJlcXVlc3QuXG4gKlxuICogSW5ib3VuZCAoe0BsaW5rIHJld3JpdGVTZXJ2aW5nUmVzcG9uc2VCb2R5fSBhbmRcbiAqIHtAbGluayByZXdyaXRlU2VydmluZ1Jlc3BvbnNlU3RyZWFtfSksIGJlY2F1c2UgRGF0YWJyaWNrcy1ob3N0ZWQgR2VtaW5pIGFuZFxuICogQ2xhdWRlIGNhbiBhbnN3ZXIgd2l0aCBuYXRpdmUgY29udGVudC1wYXJ0cyBhcnJheXMgd2hlcmUgdGhlIE9wZW5BSSBjb250cmFjdFxuICogKGFuZCB0aGVyZWZvcmUgdGhlIEFJIFNESydzIHJlc3BvbnNlIHNjaGVtYSkgcmVxdWlyZXMgYSBwbGFpbiBzdHJpbmcuXG4gKlxuICogRXZlcnkgcmVwYWlyIGhlcmUgaXMgYSBwcm92aWRlciBxdWlyayByYXRoZXIgdGhhbiBhIHNjaGVtYSB2aW9sYXRpb24sIHNvIGFsbFxuICogb2YgdGhlbSBhcmUgYXBwbGllZCBvbiB0aGUgd2lyZSAoc2VlIHRoZSBgZ2xvYmFsVGhpcy5mZXRjaGAgd3JhcHBlciBpblxuICogYG1vZGVsLnRzYCkgcmF0aGVyIHRoYW4gYnkgY2hhbmdpbmcgd2hhdCB0aGUgYWdlbnQgc3RvcmVzIG9yIHdoYXQgdGhlIFVJXG4gKiBzaG93cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsganNvbiwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ2hhdE1lc3NhZ2UsXG4gIHR5cGUgQ2hhdFJvbGUsXG4gIG9wZW5haUNoYXQsXG4gIG9wZW5haVJlc3BvbnNlcyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5cbi8qKlxuICogQSBjaGF0IG1lc3NhZ2UgYXMgaXQgYXJyaXZlcyBvbiB0aGUgc2VydmluZyB3aXJlLCBwbHVzIHRoZSBleHRlbmRlZC10aGlua2luZ1xuICogZmllbGRzIERhdGFicmlja3MtaG9zdGVkIENsYXVkZSBhZGRzLiBUaGUgT3BlbkFJLXN0YW5kYXJkIHBhcnQgb2YgdGhlIHNoYXBlXG4gKiBpcyB7QGxpbmsgQ2hhdE1lc3NhZ2V9IGZyb20gYEBkYngtdG9vbHMvc2hhcmVkLW1vZGVsYDsgb25seSB0aGUgcHJvdmlkZXJcbiAqIGV4dGVuc2lvbnMgdGhpcyBtb2R1bGUgc3RyaXBzIGFyZSBkZWNsYXJlZCBoZXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpbmdDaGF0TWVzc2FnZSBleHRlbmRzIENoYXRNZXNzYWdlIHtcbiAgLyoqIE5hcnJvd2VkIHRvIHRoZSByb2xlcyB0aGlzIHJlcGFpciBwYXNzIHJlYXNvbnMgYWJvdXQsIHBsdXMgQ2xhdWRlJ3MgYHJlYXNvbmluZ2AgdHVybi4gKi9cbiAgcm9sZTogQ2hhdFJvbGUgfCBcInJlYXNvbmluZ1wiO1xuICByZWFzb25pbmc/OiB1bmtub3duO1xuICByZWFzb25pbmdfY29udGVudD86IHVua25vd247XG59XG5cbi8vIFNoYXJlZCB3aXRoIHRoZSBSZXNwb25zZXMgc2FuaXRpemUgcGF0aCBzbyBib3RoIHdpcmUgc3VyZmFjZXMgYWdyZWUgb24gd2hhdFxuLy8gY291bnRzIGFzIGEgc2lnbmVkIHJlYXNvbmluZyBibG9jay5cbmNvbnN0IFJFQVNPTklOR19QQVJUX1RZUEVTID0gb3BlbmFpUmVzcG9uc2VzLlJFQVNPTklOR19UWVBFUztcblxuLyoqXG4gKiBQYXJzZSwgc2FuaXRpemUsIGFuZCByZS1zZXJpYWxpemUgYSBgL3NlcnZpbmctZW5kcG9pbnRzLy4uLmAgUE9TVFxuICogYm9keS4gUmV0dXJucyB0aGUgb3JpZ2luYWwgc3RyaW5nIHZlcmJhdGltIHdoZW4gdGhlIGJvZHkgaXMgbm90XG4gKiBKU09OIG9yIG5vIHJld3JpdGUgd2FzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJld3JpdGVTZXJ2aW5nQm9keShib2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlUmVjb3JkKGJvZHkpO1xuICBpZiAoIXBhcnNlZCkgcmV0dXJuIGJvZHk7XG5cbiAgLy8gUnVucyByZWdhcmRsZXNzIG9mIGBtZXNzYWdlc2A6IERhdGFicmlja3MgcmVmdXNlcyB0byBwYXJzZSBhIGJvZHkgY2FycnlpbmdcbiAgLy8gYW4gdW5rbm93biB0b3AtbGV2ZWwgZmllbGQsIHNvIHRoaXMgZmFpbHVyZSBpcyBub3Qgc3BlY2lmaWMgdG8gYSB0cmFuc2NyaXB0LlxuICBsZXQgY2hhbmdlZCA9IG9wZW5haUNoYXQuc3RyaXBVbnN1cHBvcnRlZENoYXRGaWVsZHMocGFyc2VkKS5sZW5ndGggPiAwO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHBhcnNlZC5tZXNzYWdlcykpIHtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHBhcnNlZC5tZXNzYWdlcyBhcyBTZXJ2aW5nQ2hhdE1lc3NhZ2VbXTtcbiAgICAvLyBFdmFsdWF0ZWQgZWFnZXJseSwgbm90IHNob3J0LWNpcmN1aXRlZDogb25lIHRyYW5zY3JpcHQgY2FuIG5lZWQgYm90aFxuICAgIC8vIHJlYXNvbmluZyBibG9ja3Mgc3RyaXBwZWQgQU5EIGEgdHJhaWxpbmcgYXNzaXN0YW50IHByZWZpbGwgZm9sZGVkIGJhY2suXG4gICAgY29uc3Qgc3RyaXBwZWQgPSBzdHJpcFJlYXNvbmluZ0Zyb21TZXJ2aW5nTWVzc2FnZXMobWVzc2FnZXMpO1xuICAgIGNvbnN0IHJlcGFpcmVkID0gcmVwYWlyQXNzaXN0YW50UHJlZmlsbChtZXNzYWdlcyk7XG4gICAgY2hhbmdlZCA9IGNoYW5nZWQgfHwgc3RyaXBwZWQgfHwgcmVwYWlyZWQ7XG4gIH1cblxuICByZXR1cm4gY2hhbmdlZCA/IEpTT04uc3RyaW5naWZ5KHBhcnNlZCkgOiBib2R5O1xufVxuXG4vKipcbiAqIERyb3AgZXh0ZW5kZWQtdGhpbmtpbmcgLyByZWFzb25pbmcgYmxvY2tzIGZyb20gYSByZXBsYXllZCB0cmFuc2NyaXB0LlxuICpcbiAqIEh5YnJpZCBDbGF1ZGUgZW5kcG9pbnRzIChlLmcuIFNvbm5ldCA0LjUrKSBtYXkgZW1pdCBgcmVhc29uaW5nYCBjb250ZW50XG4gKiBwYXJ0cyBvbiB0aGUgZmlyc3QgdHVybi4gTWFzdHJhIHBlcnNpc3RzIGFuZCByZXBsYXlzIHRoZW0gb24gdGhlIG5leHRcbiAqIGFnZW50IHN0ZXAsIGJ1dCBEYXRhYnJpY2tzLWhvc3RlZCBDbGF1ZGUgcmVqZWN0cyB0aG9zZSBibG9ja3Mgb25cbiAqIG11bHRpLXR1cm4gdG9vbCBjb250aW51YXRpb25zLiBUaGUgVUkgYWxyZWFkeSBjYXB0dXJlZCByZWFzb25pbmcgZm9yXG4gKiBkaXNwbGF5OyBzdHJpcHBpbmcgaGVyZSBrZWVwcyBwcm92aWRlciByZXBsYXkgY29tcGF0aWJsZSB3aXRob3V0XG4gKiBjaGFuZ2luZyB3aGF0IHVzZXJzIHNlZSBpbiB0aGUgY2hhdCBidWJibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFJlYXNvbmluZ0Zyb21TZXJ2aW5nTWVzc2FnZXMobWVzc2FnZXM6IFNlcnZpbmdDaGF0TWVzc2FnZVtdKTogYm9vbGVhbiB7XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAobGV0IGkgPSBtZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IG1zZyA9IG1lc3NhZ2VzW2ldO1xuICAgIGlmICghbXNnKSBjb250aW51ZTtcbiAgICBpZiAobXNnLnJvbGUgPT09IFwicmVhc29uaW5nXCIpIHtcbiAgICAgIG1lc3NhZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChtc2cucmVhc29uaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBtc2cucmVhc29uaW5nO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChtc2cucmVhc29uaW5nX2NvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIG1zZy5yZWFzb25pbmdfY29udGVudDtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRQYXJ0cyhtc2cuY29udGVudCk7XG4gICAgaWYgKCFwYXJ0cykgY29udGludWU7XG4gICAgY29uc3QgZmlsdGVyZWQgPSBwYXJ0cy5maWx0ZXIoKHBhcnQpID0+IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBwYXJ0Py50eXBlO1xuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSBcInN0cmluZ1wiICYmIFJFQVNPTklOR19QQVJUX1RZUEVTLmhhcyh0eXBlKSkge1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCAhPT0gcGFydHMubGVuZ3RoKSB7XG4gICAgICBtc2cuY29udGVudCA9IGZpbHRlcmVkO1xuICAgIH1cbiAgICBjb25zdCBoYXNUb29sQ2FsbHMgPSBBcnJheS5pc0FycmF5KG1zZy50b29sX2NhbGxzKSAmJiBtc2cudG9vbF9jYWxscy5sZW5ndGggPiAwO1xuICAgIGlmIChtc2cucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJiAhaGFzVG9vbENhbGxzICYmIGlzRW1wdHlTZXJ2aW5nQ29udGVudChtc2cuY29udGVudCkpIHtcbiAgICAgIG1lc3NhZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlZDtcbn1cblxuLyoqXG4gKiBSZXBhaXIgYSBNYXN0cmEvQUkgU0RLIG1lc3NhZ2UgcmVwbGF5IHRoYXQgRGF0YWJyaWNrcy1ob3N0ZWQgQ2xhdWRlXG4gKiByZWplY3RzIHdpdGggYFwiVGhpcyBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IGFzc2lzdGFudCBtZXNzYWdlXG4gKiBwcmVmaWxsLiBUaGUgY29udmVyc2F0aW9uIG11c3QgZW5kIHdpdGggYSB1c2VyIG1lc3NhZ2UuXCJgLlxuICpcbiAqIFRoZSBidWcgcGF0dGVybjogd2hlbiBhbiBhc3Npc3RhbnQgdHVybiBzdHJlYW1zIHRleHQgKmFuZCogYVxuICogYHRvb2xfY2FsbGAsIHRoZSBBSSBTREsgcGVyc2lzdHMgdGhlbSBhcyB0d28gc2VwYXJhdGUgYXNzaXN0YW50XG4gKiBlbnRyaWVzICh0ZXh0LW9ubHkgYW5kIHRvb2wtY2FsbC1vbmx5KS4gT24gdGhlIG5leHQgYWdlbnQgc3RlcCB0aGVcbiAqIHRvb2wtY2FsbCBlbnRyeSBpcyByZXBsYXllZCAqYmVmb3JlKiB0aGUgdG9vbCByZXN1bHQgYW5kIHRoZVxuICogdGV4dCBlbnRyeSBpcyByZXBsYXllZCAqYWZ0ZXIqIGl0LCBzbyB0aGUgY29udmVyc2F0aW9uIGVuZHMgd2l0aCBhXG4gKiB0cmFpbGluZyBhc3Npc3RhbnQgdGV4dCBtZXNzYWdlLiBBbnRocm9waWMgaW50ZXJwcmV0cyB0aGF0IGFzIGFcbiAqIHByZWZpbGwgcmVxdWVzdCBhbmQgcmVqZWN0cyBpdCBvbiBEYXRhYnJpY2tzICh0aGUgdXBzdHJlYW0gQmVkcm9ja1xuICogcm91dGUgZGlzYWxsb3dzIHByZWZpbGwpLlxuICpcbiAqIEZpeDogd2hlbiB0aGUgbGFzdCBtZXNzYWdlIGlzIGFuIGFzc2lzdGFudCB0ZXh0IHdpdGggbm8gYHRvb2xfY2FsbHNgXG4gKiBhbmQgdGhlIGNoYWluIGltbWVkaWF0ZWx5IGJlZm9yZSBpdCBpcyBgYXNzaXN0YW50KHRvb2xfY2FsbHM9Li4uKWBcbiAqIGZvbGxvd2VkIG9ubHkgYnkgYHRvb2woLi4uKWAgcmVzdWx0cywgZm9sZCB0aGUgdHJhaWxpbmcgdGV4dCBiYWNrXG4gKiBpbnRvIHRoZSBgY29udGVudGAgb2YgdGhhdCBvcGVuaW5nIGFzc2lzdGFudCBhbmQgZHJvcCB0aGUgZHVwbGljYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwYWlyQXNzaXN0YW50UHJlZmlsbChtZXNzYWdlczogU2VydmluZ0NoYXRNZXNzYWdlW10pOiBib29sZWFuIHtcbiAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbGFzdCA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdO1xuICBpZiAoIWxhc3QgfHwgbGFzdC5yb2xlICE9PSBcImFzc2lzdGFudFwiIHx8IChsYXN0LnRvb2xfY2FsbHMgJiYgbGFzdC50b29sX2NhbGxzLmxlbmd0aCA+IDApKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGkgPSBtZXNzYWdlcy5sZW5ndGggLSAyO1xuICB3aGlsZSAoaSA+PSAwICYmIG1lc3NhZ2VzW2ldPy5yb2xlID09PSBcInRvb2xcIikgaS0tO1xuICBpZiAoaSA8IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgb3BlbmVyID0gbWVzc2FnZXNbaV07XG4gIGlmIChcbiAgICAhb3BlbmVyIHx8XG4gICAgb3BlbmVyLnJvbGUgIT09IFwiYXNzaXN0YW50XCIgfHxcbiAgICAhb3BlbmVyLnRvb2xfY2FsbHMgfHxcbiAgICBvcGVuZXIudG9vbF9jYWxscy5sZW5ndGggPT09IDBcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWVyZ2VkID0gW1xuICAgIHN0cmluZy50cmltVG9OdWxsKHRleHRGcm9tU2VydmluZ0NvbnRlbnQob3BlbmVyLmNvbnRlbnQpKSxcbiAgICBzdHJpbmcudHJpbVRvTnVsbCh0ZXh0RnJvbVNlcnZpbmdDb250ZW50KGxhc3QuY29udGVudCkpLFxuICBdXG4gICAgLmZpbHRlcigocyk6IHMgaXMgc3RyaW5nID0+IHMgIT09IG51bGwpXG4gICAgLmpvaW4oXCJcXG5cXG5cIik7XG4gIG9wZW5lci5jb250ZW50ID0gbWVyZ2VkO1xuICBtZXNzYWdlcy5wb3AoKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogRmxhdHRlbiBjb250ZW50IHRvIHRoZSBwcm9zZSBhIGh1bWFuIHdvdWxkIHJlYWQ6IHRleHQgcGFydHMgb25seSwgc2VwYXJhdGVkXG4gKiBieSBibGFuayBsaW5lcywgc2luY2UgdGhlIHJlc3VsdCBpcyBzcGxpY2VkIGludG8gYW5vdGhlciB0dXJuJ3MgbWVzc2FnZSBib2R5LlxuICovXG5mdW5jdGlvbiB0ZXh0RnJvbVNlcnZpbmdDb250ZW50KGNvbnRlbnQ6IFNlcnZpbmdDaGF0TWVzc2FnZVtcImNvbnRlbnRcIl0pOiBzdHJpbmcge1xuICByZXR1cm4gb3BlbmFpQ2hhdC5jaGF0Q29udGVudFRvVGV4dChjb250ZW50LCB7IHNlcGFyYXRvcjogXCJcXG5cXG5cIiwgdHlwZXM6IFtcInRleHRcIl0gfSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHR1cm4gY2FycmllcyBub3RoaW5nIHdvcnRoIHJlcGxheWluZy4gRGVsaWJlcmF0ZWx5IHN0cmljdGVyIHRoYW5cbiAqIFwiaGFzIG5vIHRleHRcIjogYSBwYXJ0IG9mIGFueSBvdGhlciB0eXBlIChhbiBpbWFnZSwgYSBjYWNoZSBtYXJrZXIpIGNvdW50cyBhc1xuICogY29udGVudCwgc28gYSBtZXNzYWdlIGhvbGRpbmcgb25lIGlzIGtlcHQgZXZlbiB0aG91Z2ggaXQgaGFzIG5vIHByb3NlLlxuICovXG5mdW5jdGlvbiBpc0VtcHR5U2VydmluZ0NvbnRlbnQoY29udGVudDogU2VydmluZ0NoYXRNZXNzYWdlW1wiY29udGVudFwiXSk6IGJvb2xlYW4ge1xuICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKSByZXR1cm4gY29udGVudC50cmltKCkubGVuZ3RoID09PSAwO1xuICBjb25zdCBwYXJ0cyA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRQYXJ0cyhjb250ZW50KTtcbiAgaWYgKCFwYXJ0cykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBwYXJ0cy5ldmVyeSgocGFydCkgPT4ge1xuICAgIGlmIChwYXJ0Py50eXBlID09PSBcInRleHRcIikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBwYXJ0LnRleHQgIT09IFwic3RyaW5nXCIgfHwgcGFydC50ZXh0LnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59XG5cbi8qKlxuICogUGFyc2UsIHNhbml0aXplLCBhbmQgcmUtc2VyaWFsaXplIGEgYC9zZXJ2aW5nLWVuZHBvaW50cy8uLi5gIG5vbi1zdHJlYW1pbmdcbiAqIEpTT04gUkVTUE9OU0UgYm9keS4gUmV0dXJucyB0aGUgb3JpZ2luYWwgc3RyaW5nIHZlcmJhdGltIHdoZW4gdGhlIGJvZHkgaXNcbiAqIG5vdCBKU09OIG9yIG5vIHJld3JpdGUgd2FzIG5lZWRlZCwgbWlycm9yaW5nXG4gKiB7QGxpbmsgcmV3cml0ZVNlcnZpbmdCb2R5fSBvbiB0aGUgcmVxdWVzdCBzaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV3cml0ZVNlcnZpbmdSZXNwb25zZUJvZHkoYm9keTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyc2VkID0ganNvbi5wYXJzZVJlY29yZChib2R5KTtcbiAgaWYgKCFwYXJzZWQpIHJldHVybiBib2R5O1xuICByZXR1cm4gZmxhdHRlbkNob2ljZU1lc3NhZ2VDb250ZW50KHBhcnNlZCkgPyBKU09OLnN0cmluZ2lmeShwYXJzZWQpIDogYm9keTtcbn1cblxuLyoqXG4gKiBSZXBhaXIgYXJyYXktdmFsdWVkIGBjaG9pY2VzW10uZGVsdGEuY29udGVudGAgaW5zaWRlIGFuIE9wZW5BSSBTU0Ugc3RyZWFtXG4gKiB3aXRob3V0IGJ1ZmZlcmluZyB0aGUgcmVzcG9uc2UuIFRoZSBkZWNvZGVyIHJldGFpbnMgcGFydGlhbCBsaW5lcyBhY3Jvc3NcbiAqIGFyYml0cmFyeSBuZXR3b3JrIGNodW5rIGJvdW5kYXJpZXM7IGVhY2ggY29tcGxldGUgYGRhdGE6YCBsaW5lIGlzIHBhcnNlZCBhbmRcbiAqIHJlLWVuY29kZWQgb25seSB3aGVuIGl0cyBjb250ZW50IG5lZWRzIG5vcm1hbGl6YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXdyaXRlU2VydmluZ1Jlc3BvbnNlU3RyZWFtKFxuICBib2R5OiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pixcbik6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGxldCBidWZmZXIgPSBcIlwiO1xuXG4gIHJldHVybiBib2R5LnBpcGVUaHJvdWdoKFxuICAgIG5ldyBUcmFuc2Zvcm1TdHJlYW08VWludDhBcnJheSwgVWludDhBcnJheT4oe1xuICAgICAgdHJhbnNmb3JtKGNodW5rLCBjb250cm9sbGVyKSB7XG4gICAgICAgIGJ1ZmZlciArPSBkZWNvZGVyLmRlY29kZShjaHVuaywgeyBzdHJlYW06IHRydWUgfSk7XG4gICAgICAgIGxldCBuZXdsaW5lID0gYnVmZmVyLmluZGV4T2YoXCJcXG5cIik7XG4gICAgICAgIHdoaWxlIChuZXdsaW5lID49IDApIHtcbiAgICAgICAgICBjb25zdCBsaW5lID0gYnVmZmVyLnNsaWNlKDAsIG5ld2xpbmUgKyAxKTtcbiAgICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UobmV3bGluZSArIDEpO1xuICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShlbmNvZGVyLmVuY29kZShyZXdyaXRlU2VydmluZ1Jlc3BvbnNlU3RyZWFtTGluZShsaW5lKSkpO1xuICAgICAgICAgIG5ld2xpbmUgPSBidWZmZXIuaW5kZXhPZihcIlxcblwiKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZsdXNoKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgYnVmZmVyICs9IGRlY29kZXIuZGVjb2RlKCk7XG4gICAgICAgIGlmIChidWZmZXIpIGNvbnRyb2xsZXIuZW5xdWV1ZShlbmNvZGVyLmVuY29kZShyZXdyaXRlU2VydmluZ1Jlc3BvbnNlU3RyZWFtTGluZShidWZmZXIpKSk7XG4gICAgICB9LFxuICAgIH0pLFxuICApO1xufVxuXG4vKiogTm9ybWFsaXplIG9uZSBTU0UgbGluZSB3aGlsZSBwcmVzZXJ2aW5nIGl0cyBgZGF0YTpgIHNwYWNpbmcgYW5kIGxpbmUgZW5kaW5nLiAqL1xuZnVuY3Rpb24gcmV3cml0ZVNlcnZpbmdSZXNwb25zZVN0cmVhbUxpbmUobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZUVuZGluZyA9IGxpbmUuZW5kc1dpdGgoXCJcXHJcXG5cIikgPyBcIlxcclxcblwiIDogbGluZS5lbmRzV2l0aChcIlxcblwiKSA/IFwiXFxuXCIgOiBcIlwiO1xuICBjb25zdCBjb250ZW50ID0gbGluZUVuZGluZyA/IGxpbmUuc2xpY2UoMCwgLWxpbmVFbmRpbmcubGVuZ3RoKSA6IGxpbmU7XG4gIGNvbnN0IG1hdGNoID0gL14oZGF0YTpcXHMqKSguKikkLy5leGVjKGNvbnRlbnQpO1xuICBpZiAoIW1hdGNoIHx8IG1hdGNoWzJdID09PSBcIltET05FXVwiKSByZXR1cm4gbGluZTtcblxuICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlUmVjb3JkKG1hdGNoWzJdKTtcbiAgaWYgKCFwYXJzZWQgfHwgIWZsYXR0ZW5DaG9pY2VEZWx0YUNvbnRlbnQocGFyc2VkKSkgcmV0dXJuIGxpbmU7XG4gIHJldHVybiBgJHttYXRjaFsxXX0ke0pTT04uc3RyaW5naWZ5KHBhcnNlZCl9JHtsaW5lRW5kaW5nfWA7XG59XG5cbi8qKlxuICogQ29sbGFwc2UgYSBzdHJ1Y3R1cmVkIGBjaG9pY2VzW10ubWVzc2FnZS5jb250ZW50YCBhcnJheSB0byB0aGUgcGxhaW4gc3RyaW5nXG4gKiB0aGUgT3BlbkFJIENoYXQgQ29tcGxldGlvbnMgY29udHJhY3Qgc3BlY2lmaWVzLlxuICpcbiAqIERhdGFicmlja3MtaG9zdGVkIEdlbWluaSBhbnN3ZXJzIGEgbm9uLXN0cmVhbWluZyBgL2NoYXQvY29tcGxldGlvbnNgIGNhbGxcbiAqIHdpdGggdGhlIEdlbWluaS1uYXRpdmUgcGFydHMgc2hhcGU6XG4gKlxuICogYGBganNvblxuICogXCJjb250ZW50XCI6IFt7IFwidHlwZVwiOiBcInRleHRcIiwgXCJ0ZXh0XCI6IFwiLi4uXCIsIFwidGhvdWdodFNpZ25hdHVyZVwiOiBcIi4uLlwiIH1dXG4gKiBgYGBcbiAqXG4gKiBgQGFpLXNkay9vcGVuYWktY29tcGF0aWJsZWAgdmFsaWRhdGVzIHRoZSByZXNwb25zZSBhZ2FpbnN0IHRoZSBPcGVuQUlcbiAqIHNjaGVtYSwgd2hlcmUgYGNvbnRlbnRgIGlzIGEgbnVsbGFibGUgc3RyaW5nLCBzbyBpdCB0aHJvd3NcbiAqIGBUeXBlIHZhbGlkYXRpb24gZmFpbGVkOiAuLi4gZXhwZWN0ZWQgc3RyaW5nLCByZWNlaXZlZCBhcnJheWAgYW5kIHRoZSB3aG9sZVxuICogY2FsbCBmYWlscyAoYEFJX0FQSUNhbGxFcnJvcjogSW52YWxpZCBKU09OIHJlc3BvbnNlYCBvbiBhbiBIVFRQIDIwMCkuIE1hc3RyYVxuICogdXNlcyBgZG9HZW5lcmF0ZWAgZm9yIGl0cyBzaWRlIGNhbGxzLCBzbyB0aGUgdmlzaWJsZSBzeW1wdG9tIGlzXG4gKiBgRXJyb3IgZ2VuZXJhdGluZyB0aXRsZWAgLSBldmVyeSB0aHJlYWQga2VlcHMgaXRzIHBsYWNlaG9sZGVyIG5hbWUuXG4gKlxuICogRmxhdHRlbmluZyBvbiB0aGUgd2lyZSBrZWVwcyB0aGUgcmVwYWlyIGluIG9uZSBwbGFjZTogbmVpdGhlciB0aGUgYWdlbnQnc1xuICogc3RvcmVkIHRyYW5zY3JpcHQgbm9yIHRoZSBVSSBoYXMgdG8ga25vdyB0aGUgcHJvdmlkZXIgZW1pdHRlZCBwYXJ0cy4gQW55XG4gKiBub24tdGV4dCBwYXJ0IChhIHJlYXNvbmluZyBibG9jaywgYHRob3VnaHRTaWduYXR1cmVgLW9ubHkgZW50cnksIG9yIGlubGluZVxuICogaW1hZ2UpIGNvbnRyaWJ1dGVzIG5vdGhpbmcsIG1hdGNoaW5nIHtAbGluayBvcGVuYWlDaGF0LmNoYXRDb250ZW50VG9UZXh0fSxcbiAqIGFuZCBhbiBhbGwtcGFydHMtZW1wdHkgbWVzc2FnZSBmbGF0dGVucyB0byBgXCJcImAgcmF0aGVyIHRoYW4gYmVpbmcgZHJvcHBlZCwgc29cbiAqIGBmaW5pc2hfcmVhc29uYCBhbmQgYHVzYWdlYCBzdGlsbCByb3VuZC10cmlwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbkNob2ljZU1lc3NhZ2VDb250ZW50KHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogYm9vbGVhbiB7XG4gIHJldHVybiBmbGF0dGVuQ2hvaWNlQ29udGVudChwYXlsb2FkLCBcIm1lc3NhZ2VcIik7XG59XG5cbi8qKlxuICogQ29sbGFwc2Ugc3RydWN0dXJlZCBzdHJlYW1pbmcgYGNob2ljZXNbXS5kZWx0YS5jb250ZW50YCBhcnJheXMgdG8gc3RyaW5ncy5cbiAqIENsYXVkZSByZWFzb25pbmctb25seSBjaHVua3MgYmVjb21lIGFuIGVtcHR5IGNvbnRlbnQgZGVsdGEgd2hpbGUgdGV4dCBwYXJ0c1xuICogYXJlIGNvbmNhdGVuYXRlZCBpbiBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5DaG9pY2VEZWx0YUNvbnRlbnQocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGZsYXR0ZW5DaG9pY2VDb250ZW50KHBheWxvYWQsIFwiZGVsdGFcIik7XG59XG5cbi8qKiBTaGFyZWQgY2hvaWNlIHdhbGtlciBmb3IgYnVmZmVyZWQgYG1lc3NhZ2VgIGFuZCBzdHJlYW1pbmcgYGRlbHRhYCBwYXlsb2Fkcy4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5DaG9pY2VDb250ZW50KFxuICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgZmllbGQ6IFwibWVzc2FnZVwiIHwgXCJkZWx0YVwiLFxuKTogYm9vbGVhbiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShwYXlsb2FkLmNob2ljZXMpKSByZXR1cm4gZmFsc2U7XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgY2hvaWNlIG9mIHBheWxvYWQuY2hvaWNlcykge1xuICAgIGlmICghY2hvaWNlIHx8IHR5cGVvZiBjaG9pY2UgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IChjaG9pY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2ZpZWxkXTtcbiAgICBpZiAoIWNvbnRhaW5lciB8fCB0eXBlb2YgY29udGFpbmVyICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICBjb25zdCB0YXJnZXQgPSBjb250YWluZXIgYXMgeyBjb250ZW50PzogdW5rbm93biB9O1xuICAgIGNvbnN0IHBhcnRzID0gb3BlbmFpQ2hhdC5jaGF0Q29udGVudFBhcnRzKHRhcmdldC5jb250ZW50KTtcbiAgICBpZiAoIXBhcnRzKSBjb250aW51ZTtcbiAgICB0YXJnZXQuY29udGVudCA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRUb1RleHQocGFydHMsIHsgdHlwZXM6IFtcInRleHRcIl0gfSk7XG4gICAgY2hhbmdlZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoYW5nZWQ7XG59XG4iXX0=
package/package.json CHANGED
@@ -31,18 +31,18 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@databricks/appkit": "^0.60.0",
34
- "@dbx-tools/appkit": "0.6.213",
35
- "@dbx-tools/core": "0.6.213",
36
- "@dbx-tools/databricks": "0.6.213",
37
- "@dbx-tools/fs": "0.6.213",
38
- "@dbx-tools/genie": "0.6.213",
39
- "@dbx-tools/model": "0.6.213",
40
- "@dbx-tools/path": "0.6.213",
41
- "@dbx-tools/shared-core": "0.6.213",
42
- "@dbx-tools/shared-fs": "0.6.213",
43
- "@dbx-tools/shared-genie": "0.6.213",
44
- "@dbx-tools/shared-mastra": "0.6.213",
45
- "@dbx-tools/shared-model": "0.6.213",
34
+ "@dbx-tools/appkit": "0.6.215",
35
+ "@dbx-tools/core": "0.6.215",
36
+ "@dbx-tools/databricks": "0.6.215",
37
+ "@dbx-tools/fs": "0.6.215",
38
+ "@dbx-tools/genie": "0.6.215",
39
+ "@dbx-tools/model": "0.6.215",
40
+ "@dbx-tools/path": "0.6.215",
41
+ "@dbx-tools/shared-core": "0.6.215",
42
+ "@dbx-tools/shared-fs": "0.6.215",
43
+ "@dbx-tools/shared-genie": "0.6.215",
44
+ "@dbx-tools/shared-mastra": "0.6.215",
45
+ "@dbx-tools/shared-model": "0.6.215",
46
46
  "@mastra/ai-sdk": "1.6.0",
47
47
  "@mastra/core": "1.47.0",
48
48
  "@mastra/express": "1.4.2",
@@ -72,7 +72,7 @@
72
72
  "./package.json": "./package.json"
73
73
  }
74
74
  },
75
- "version": "0.6.213",
75
+ "version": "0.6.215",
76
76
  "types": "./lib/index.d.ts",
77
77
  "type": "module",
78
78
  "exports": {
package/src/genie.ts CHANGED
@@ -402,8 +402,9 @@ function buildAskGenieTool(opts: {
402
402
 
403
403
  Returns the final \`GenieMessage\`. Agent Mode includes the
404
404
  synthesized answer and can include SQL result values as a
405
- Markdown text attachment. A legacy polling result instead
406
- carries a \`statement_id\` (at
405
+ Markdown text attachment. Agent Mode has no \`statement_id\`;
406
+ use \`render_data\` with its inline rows when a chart is needed.
407
+ A legacy polling result instead carries a \`statement_id\` (at
407
408
  \`message.query_result.statement_id\` or the first
408
409
  attachment's \`query.statement_id\`); call
409
410
  \`get_statement\` with that id only when you need to read
@@ -823,10 +824,17 @@ export const GENIE_INSTRUCTIONS = string.toDescription([
823
824
  `
824
825
  Each \`ask_genie\` call returns the terminal \`GenieMessage\`.
825
826
  Read Agent Mode's synthesized answer and Markdown query output
826
- directly from its text attachments. A legacy polling result may
827
- instead expose a \`statement_id\` at
827
+ directly from its text attachments. Agent Mode does NOT expose a
828
+ \`statement_id\`. To chart its result, call \`render_data\` with
829
+ rows copied from the Markdown table or structured table metadata,
830
+ then copy the returned marker. Never pass an Agent Mode response id,
831
+ conversation id, function-call id, or any other identifier to
832
+ \`prepare_chart\`.
833
+
834
+ A legacy polling result may instead expose a \`statement_id\` at
828
835
  \`message.query_result.statement_id\` (or the first
829
- attachment's \`query.statement_id\`).
836
+ attachment's \`query.statement_id\`). Only that real statement id
837
+ belongs in \`prepare_chart\` or a \`[data:<statement_id>]\` marker.
830
838
  `,
831
839
  [
832
840
  `
@@ -837,34 +845,35 @@ export const GENIE_INSTRUCTIONS = string.toDescription([
837
845
  {
838
846
  bullets: [
839
847
  `
840
- \`[data:<statement_id>]\` - render the rows as a table.
848
+ \`[data:<statement_id>]\` - render legacy polling rows as a table.
841
849
  Use this when there's no clear visual story (long lists,
842
850
  reference data, single-row results, or the user just
843
- wants to see the data). Embed the marker directly; no
844
- tool call needed.
851
+ wants to see the data). Embed the marker directly when
852
+ \`ask_genie\` returned a real \`statement_id\`; Agent Mode
853
+ already carries its query output inline.
845
854
  `,
846
855
  `
847
856
  \`[chart:<chartId>]\` - render the rows as a chart. To
848
- get one, call \`prepare_chart\` with the
849
- statement's id (and an optional \`title\` / one-line
850
- \`description\` of the insight to surface). The tool
851
- returns the complete \`marker\` synchronously and
852
- prepares the chart spec in the background; copy that
853
- marker VERBATIM onto its own line wherever the chart
854
- should appear. Use a chart when the data has a
855
- story a visual conveys better than a table (trends,
856
- rankings, distributions, parts-of-a-whole).
857
+ get one from Agent Mode, call \`render_data\` with the
858
+ inline rows. To get one from legacy polling, call
859
+ \`prepare_chart\` with the real statement id. Both tools
860
+ accept an optional \`title\` / one-line \`description\`
861
+ of the insight to surface, return the complete \`marker\`
862
+ synchronously, and prepare the chart spec in the
863
+ background. Copy that marker VERBATIM onto its own line
864
+ wherever the chart should appear. Use a chart when the
865
+ data has a story a visual conveys better than a table
866
+ (trends, rankings, distributions, parts-of-a-whole).
857
867
 
858
868
  NEVER invent or hand-build a marker. A valid marker is
859
- the complete opaque string a \`prepare_chart\` call
860
- returned to you in THIS turn - nothing else. Its id is
861
- NOT a \`statement_id\`, and it is NOT a
869
+ the complete opaque string a \`render_data\` or
870
+ \`prepare_chart\` call returned to you in THIS turn -
871
+ nothing else. Its id is NOT a \`statement_id\`, and it is NOT a
862
872
  \`statement_id\` prefix with a label appended (e.g.
863
873
  \`01f1...-region-fill\`). If you have not called
864
- \`prepare_chart\` and received an id back, do not write
865
- a \`[chart:...]\` marker at all - use \`[data:...]\`
866
- instead. A fabricated chart id renders nothing and
867
- wastes a request.
874
+ one of those chart tools and received an id back, do not
875
+ write a \`[chart:...]\` marker at all. A fabricated chart
876
+ id renders nothing and wastes a request.
868
877
  `,
869
878
  ],
870
879
  },
@@ -872,10 +881,10 @@ export const GENIE_INSTRUCTIONS = string.toDescription([
872
881
  The host UI resolves both markers on its own once it sees
873
882
  them - you do NOT need to call \`get_statement\` just to
874
883
  display data, and you do NOT need to wait on
875
- \`prepare_chart\` (it returns the id immediately and the
876
- host UI fetches the cached chart later). Pick at most one
877
- marker per statement; don't chart AND table the same result
878
- side by side.
884
+ \`render_data\` or \`prepare_chart\` (they return the id
885
+ immediately and the host UI fetches the cached chart later).
886
+ Pick at most one marker per result; don't chart AND table the
887
+ same result side by side.
879
888
  `,
880
889
  ],
881
890
  `