@dbx-tools/model 0.6.168 → 0.6.175
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/index.ts +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/src/resolve.d.ts +4 -4
- package/lib/src/resolve.js +9 -9
- package/lib/src/serving.d.ts +1 -1
- package/lib/src/serving.js +2 -2
- package/package.json +5 -5
- package/src/resolve.ts +8 -8
- package/src/serving.ts +1 -1
package/index.ts
CHANGED
|
@@ -3,6 +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/model";
|
|
6
|
+
export const PACKAGE_VERSION = "0.6.175";
|
|
6
7
|
export * as classes from "./src/classes.ts";
|
|
7
8
|
export * as fallback from "./src/fallback.ts";
|
|
8
9
|
export * as invoke from "./src/invoke.ts";
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
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/model";
|
|
5
|
+
export const PACKAGE_VERSION = "0.6.175";
|
|
5
6
|
export * as classes from "./src/classes.js";
|
|
6
7
|
export * as fallback from "./src/fallback.js";
|
|
7
8
|
export * as invoke from "./src/invoke.js";
|
|
@@ -11,4 +12,4 @@ export { CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./src/classes.js";
|
|
|
11
12
|
export { FALLBACK_MODEL_IDS } from "./src/fallback.js";
|
|
12
13
|
export { INVOCATIONS_SUFFIX, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH } from "./src/invoke.js";
|
|
13
14
|
export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/serving.js";
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHakgsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjYuMTc1XCI7XG5leHBvcnQgKiBhcyBjbGFzc2VzIGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgKiBhcyBmYWxsYmFjayBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIGludm9rZSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgKiBhcyByZXNvbHZlIGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nIGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMgfSBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCB7IElOVk9DQVRJT05TX1NVRkZJWCwgUkVTUE9OU0VTX1BBVEgsIE9QRU5fUkVTUE9OU0VTX1BBVEgsIENIQVRfQ09NUExFVElPTlNfUEFUSCB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXV0aGVudGljYXRpbmdDbGllbnRMaWtlIH0gZnJvbSBcIi4vc3JjL2ludm9rZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlTW9kZWxJbnB1dCwgUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbiwgU2VsZWN0TW9kZWxJbnB1dCwgU2VhcmNoTW9kZWxzSW5wdXQgfSBmcm9tIFwiLi9zcmMvcmVzb2x2ZS50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9NT0RFTF9DQUNIRV9UVExfTVMsIERFRkFVTFRfRlVaWllfVEhSRVNIT0xEIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50TGlrZSwgTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zLCBSZXNvbHZlZE1vZGVsLCBSZXNvbHZlTW9kZWxPcHRpb25zLCBTY29yZWRFbmRwb2ludCB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG4iXX0=
|
package/lib/src/resolve.d.ts
CHANGED
|
@@ -86,9 +86,9 @@ export interface SearchModelsInput extends ModelQuery {
|
|
|
86
86
|
* A `limit` truncates the result. Returns `[]` when nothing is eligible or
|
|
87
87
|
* matches - callers layer their own fallback.
|
|
88
88
|
*/
|
|
89
|
-
export declare function
|
|
89
|
+
export declare function lookupModels(endpoints: readonly ServingEndpointSummary[], query?: ModelQuery): RankedModel[];
|
|
90
90
|
/**
|
|
91
|
-
* Collapse {@link
|
|
91
|
+
* Collapse {@link lookupModels} to a single id: the closest endpoint to `search`
|
|
92
92
|
* in a catalogue snapshot, or the input verbatim when nothing scores within the
|
|
93
93
|
* threshold.
|
|
94
94
|
*
|
|
@@ -117,7 +117,7 @@ export declare function rankModelId(endpoints: readonly ServingEndpointSummary[]
|
|
|
117
117
|
export declare function rankModelIdLive(load: (force: boolean) => Promise<readonly ServingEndpointSummary[]>, search: string, options?: ResolveModelOptions): Promise<ResolvedModel>;
|
|
118
118
|
/**
|
|
119
119
|
* Rank a workspace's catalogue in one call: list its `/serving-endpoints`
|
|
120
|
-
* (cached) and run {@link
|
|
120
|
+
* (cached) and run {@link lookupModels} over the result. The list counterpart to
|
|
121
121
|
* {@link selectModel}, for a consumer that wants the full ranked set (a model
|
|
122
122
|
* picker, a CLI) rather than a single id. Catalogue fetches fail loud: network
|
|
123
123
|
* / auth errors propagate so the caller sees the real SDK message.
|
|
@@ -143,7 +143,7 @@ export declare function searchModels(client: WorkspaceClientLike, host: string,
|
|
|
143
143
|
export declare function selectModel(client: WorkspaceClientLike, host: string, input?: SelectModelInput): Promise<ResolvedModelSelection>;
|
|
144
144
|
/**
|
|
145
145
|
* Resolve a single model id from the live catalogue and caller intent,
|
|
146
|
-
* delegating the live selection to {@link
|
|
146
|
+
* delegating the live selection to {@link lookupModels} with `limit: 1`.
|
|
147
147
|
*
|
|
148
148
|
* 1. **Explicit ask**: with `fuzzy` off, returned verbatim; otherwise
|
|
149
149
|
* fuzzy-ranked within the (optional) class ceiling and the best taken,
|
package/lib/src/resolve.js
CHANGED
|
@@ -59,7 +59,7 @@ function matchBucket(score) {
|
|
|
59
59
|
* A `limit` truncates the result. Returns `[]` when nothing is eligible or
|
|
60
60
|
* matches - callers layer their own fallback.
|
|
61
61
|
*/
|
|
62
|
-
export function
|
|
62
|
+
export function lookupModels(endpoints, query = {}) {
|
|
63
63
|
const classified = classify.classifyEndpoints(endpoints);
|
|
64
64
|
const eligible = query.modelClass !== undefined ? classesAtOrBelow(query.modelClass) : CHAT_CLASS_ORDER;
|
|
65
65
|
// Flatten eligible classes in capability order, carrying each endpoint's
|
|
@@ -109,7 +109,7 @@ export function rankModels(endpoints, query = {}) {
|
|
|
109
109
|
return query.limit !== undefined ? ranked.slice(0, Math.max(0, query.limit)) : ranked;
|
|
110
110
|
}
|
|
111
111
|
/**
|
|
112
|
-
* Collapse {@link
|
|
112
|
+
* Collapse {@link lookupModels} to a single id: the closest endpoint to `search`
|
|
113
113
|
* in a catalogue snapshot, or the input verbatim when nothing scores within the
|
|
114
114
|
* threshold.
|
|
115
115
|
*
|
|
@@ -121,7 +121,7 @@ export function rankModels(endpoints, query = {}) {
|
|
|
121
121
|
* silently rewritten, and Databricks surfaces a clean 404.
|
|
122
122
|
*/
|
|
123
123
|
export function rankModelId(endpoints, search, options = {}) {
|
|
124
|
-
const [top] =
|
|
124
|
+
const [top] = lookupModels(endpoints, {
|
|
125
125
|
search,
|
|
126
126
|
limit: 1,
|
|
127
127
|
...(options.threshold !== undefined ? { threshold: options.threshold } : {}),
|
|
@@ -153,7 +153,7 @@ export async function rankModelIdLive(load, search, options = {}) {
|
|
|
153
153
|
}
|
|
154
154
|
/**
|
|
155
155
|
* Rank a workspace's catalogue in one call: list its `/serving-endpoints`
|
|
156
|
-
* (cached) and run {@link
|
|
156
|
+
* (cached) and run {@link lookupModels} over the result. The list counterpart to
|
|
157
157
|
* {@link selectModel}, for a consumer that wants the full ranked set (a model
|
|
158
158
|
* picker, a CLI) rather than a single id. Catalogue fetches fail loud: network
|
|
159
159
|
* / auth errors propagate so the caller sees the real SDK message.
|
|
@@ -163,7 +163,7 @@ export async function rankModelIdLive(load, search, options = {}) {
|
|
|
163
163
|
*/
|
|
164
164
|
export async function searchModels(client, host, input = {}) {
|
|
165
165
|
const endpoints = await listServingEndpoints(client, host, input.ttlMs !== undefined ? { ttlMs: input.ttlMs } : {});
|
|
166
|
-
return
|
|
166
|
+
return lookupModels(endpoints, input);
|
|
167
167
|
}
|
|
168
168
|
/**
|
|
169
169
|
* Resolve a model id for a workspace in one call: list its `/serving-endpoints`
|
|
@@ -190,7 +190,7 @@ export async function selectModel(client, host, input = {}) {
|
|
|
190
190
|
}
|
|
191
191
|
/**
|
|
192
192
|
* Resolve a single model id from the live catalogue and caller intent,
|
|
193
|
-
* delegating the live selection to {@link
|
|
193
|
+
* delegating the live selection to {@link lookupModels} with `limit: 1`.
|
|
194
194
|
*
|
|
195
195
|
* 1. **Explicit ask**: with `fuzzy` off, returned verbatim; otherwise
|
|
196
196
|
* fuzzy-ranked within the (optional) class ceiling and the best taken,
|
|
@@ -207,7 +207,7 @@ export function resolveModel(endpoints, input = {}) {
|
|
|
207
207
|
assertToolSupport(endpoints, input.explicit);
|
|
208
208
|
return { modelId: input.explicit, source: "explicit" };
|
|
209
209
|
}
|
|
210
|
-
const [top] =
|
|
210
|
+
const [top] = lookupModels(endpoints, buildQuery(input, input.explicit));
|
|
211
211
|
if (input.requiresTools && !top) {
|
|
212
212
|
throw new Error(`No tool-capable model matches "${input.explicit}"`);
|
|
213
213
|
}
|
|
@@ -224,7 +224,7 @@ export function resolveModel(endpoints, input = {}) {
|
|
|
224
224
|
return { modelId: pinned, source: "fallback" };
|
|
225
225
|
}
|
|
226
226
|
const source = input.modelClass !== undefined ? "class" : "fallback";
|
|
227
|
-
const [top] =
|
|
227
|
+
const [top] = lookupModels(endpoints, buildQuery(input, undefined));
|
|
228
228
|
if (top)
|
|
229
229
|
return { modelId: top.endpoint.name, source };
|
|
230
230
|
// Live catalogue yielded nothing in range: walk the static floor.
|
|
@@ -272,4 +272,4 @@ function pickFirstAvailable(candidates, endpoints) {
|
|
|
272
272
|
}
|
|
273
273
|
return candidates[0] ?? FALLBACK_MODEL_IDS[0];
|
|
274
274
|
}
|
|
275
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsUUFBUSxHQUtULE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixzQkFBc0IsR0FJdkIsTUFBTSxjQUFjLENBQUM7QUFJdEIsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN4QyxRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxLQUFLO0lBQ0wsS0FBSztJQUNMLE9BQU87SUFDUCxNQUFNO0NBQ1AsQ0FBQyxDQUFDO0FBcURIOzs7OztHQUtHO0FBQ0gsU0FBUyxXQUFXLENBQUMsS0FBeUI7SUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQ3hCLFNBQTRDLEVBQzVDLFFBQW9CLEVBQUU7SUFFdEIsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sUUFBUSxHQUNaLEtBQUssQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixD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LENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsa0JBQWtCLENBQ3pCLFVBQTZCLEVBQzdCLFNBQTRDO0lBRTVDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RELEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7UUFDbkMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUUsQ0FBQztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXb3Jrc3BhY2UtYXdhcmUgbW9kZWwgc2VsZWN0aW9uLlxuICpcbiAqIEdpdmVuIGEgY2FsbGVyJ3MgaW50ZW50IC0gYSBzZWFyY2ggc3RyaW5nLCBhIGNhcGFiaWxpdHkge0BsaW5rIE1vZGVsQ2xhc3N9XG4gKiBjZWlsaW5nLCBib3RoLCBvciBub3RoaW5nIC0gdGhlIHRvb2xraXQgcmV0dXJucyBtYXRjaGluZyBlbmRwb2ludHMgcmFua2VkIGJ5XG4gKiBtYXRjaCBxdWFsaXR5IHRoZW4gY2xhc3MsIG9yIGNvbGxhcHNlcyB0byB0aGUgc2luZ2xlIGJlc3QgaWQgdGhlIHdvcmtzcGFjZVxuICogYWN0dWFsbHkgaGFzLCBkZWdyYWRpbmcgZnJvbSBcImJlc3QgaW4gcmFuZ2VcIiBkb3duIHRvIHRoZSBzdGF0aWMgZmFsbGJhY2tcbiAqIGZsb29yLiBTZWxlY3Rpb24gaXMgY2hhdC1vbmx5OiBlbWJlZGRpbmcgZW5kcG9pbnRzIHN1cmZhY2Ugb25seSB3aGVuXG4gKiBgbW9kZWxDbGFzc2AgaXMgZXhwbGljaXRseSB7QGxpbmsgTW9kZWxDbGFzcy5FbWJlZGRpbmd9LlxuICpcbiAqIFR3byBzaGFwZXMgb2Ygc2VsZWN0aW9uLCBlYWNoIGluIGEgcHVyZSBmb3JtIChvdmVyIGFuIGVuZHBvaW50IGxpc3QgdGhlXG4gKiBjYWxsZXIgYWxyZWFkeSBob2xkcykgYW5kIGFuIEkvTyB3cmFwcGVyICh0aGF0IGxpc3RzIGAvc2VydmluZy1lbmRwb2ludHNgXG4gKiBmaXJzdCk6IHJhbmtpbmcsIHdoaWNoIHJldHVybnMgYSBtYXRjaC0gdGhlbiBjbGFzcy1vcmRlcmVkIGxpc3QsIGFuZFxuICogc2luZ2xlLXNlbGVjdGlvbiwgd2hpY2ggY29sbGFwc2VzIHRvIG9uZSBpZCBwbHVzIGhvdyBpdCB3YXMgcmVhY2hlZCBhbmRcbiAqIGxheWVycyB0aGUgb3BlcmF0b3ItcGlubmVkIGZhbGxiYWNrIC8gc3RhdGljLWZsb29yIHNhZmV0eSBuZXQgb24gdG9wLiBBIGNoYXRcbiAqIGBtb2RlbENsYXNzYCBhY3RzIGFzIGEgY2VpbGluZzogdGhhdCBiYW5kIGFuZCB0aGUgbGVzcy1jYXBhYmxlIGNoYXQgYmFuZHNcbiAqIGJlbG93IGl0IGFyZSBlbGlnaWJsZSAoc2VlIHtAbGluayBjbGFzc2VzQXRPckJlbG93fSksIHNvIGEgYGNoYXQtYmFsYW5jZWRgXG4gKiBhc2sgY2FuIGZhbGwgdG8gYGNoYXQtZmFzdGAgYnV0IG5ldmVyIGVzY2FsYXRlIHRvIGBjaGF0LXRoaW5raW5nYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIGNsYXNzaWZ5LFxuICBtb2RlbCxcbiAgdHlwZSBNb2RlbFF1ZXJ5LFxuICB0eXBlIFJhbmtlZE1vZGVsLFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuXG5pbXBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBjbGFzc2VzQXRPckJlbG93LCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL2NsYXNzZXMudHNcIjtcbmltcG9ydCB7IEZBTExCQUNLX01PREVMX0lEUywgbW9kZWxzRm9yQ2xhc3MgfSBmcm9tIFwiLi9mYWxsYmFjay50c1wiO1xuaW1wb3J0IHtcbiAgbGlzdFNlcnZpbmdFbmRwb2ludHMsXG4gIHNlYXJjaFNlcnZpbmdFbmRwb2ludHMsXG4gIHR5cGUgUmVzb2x2ZWRNb2RlbCxcbiAgdHlwZSBSZXNvbHZlTW9kZWxPcHRpb25zLFxuICB0eXBlIFdvcmtzcGFjZUNsaWVudExpa2UsXG59IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcblxudHlwZSBNb2RlbENsYXNzID0gbW9kZWwuTW9kZWxDbGFzcztcblxuY29uc3QgVkVSU0lPTkVEX0ZBTUlMWV9TRUFSQ0hFUyA9IG5ldyBTZXQoW1xuICBcImNsYXVkZVwiLFxuICBcImdlbWluaVwiLFxuICBcImdlbW1hXCIsXG4gIFwiZ2xtXCIsXG4gIFwiZ3B0XCIsXG4gIFwibGxhbWFcIixcbiAgXCJxd2VuXCIsXG5dKTtcblxuLyoqIENhbGxlciBpbnRlbnQgcGFzc2VkIHRvIHtAbGluayByZXNvbHZlTW9kZWx9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlTW9kZWxJbnB1dCB7XG4gIC8qKlxuICAgKiBFeHBsaWNpdCBtb2RlbCBpZCAvIGxvb3NlIG5hbWUgKHBlci1yZXF1ZXN0IG92ZXJyaWRlLCBhZ2VudCAvIHBsdWdpblxuICAgKiBkZWZhdWx0LCBvciBlbnYgdmFyKS4gV2hlbiBzZXQgaXQgd2lucyBvdmVyIGBtb2RlbENsYXNzYCBhbmQgYGZhbGxiYWNrc2AuXG4gICAqL1xuICBleHBsaWNpdD86IHN0cmluZztcbiAgLyoqXG4gICAqIEZ1enp5LW1hdGNoIGFuIGBleHBsaWNpdGAgbmFtZSBhZ2FpbnN0IHRoZSBsaXZlIGNhdGFsb2d1ZSBzbyBsb29zZSBuYW1lc1xuICAgKiBsaWtlIGBcImNsYXVkZSBzb25uZXRcImAgcmVzb2x2ZS4gRGVmYXVsdCBgdHJ1ZWAuIFdoZW4gYGZhbHNlYCB0aGUgZXhwbGljaXRcbiAgICogaW5wdXQgaXMgcmV0dXJuZWQgdmVyYmF0aW0gKERhdGFicmlja3Mgc3VyZmFjZXMgdGhlIGNhbm9uaWNhbCA0MDQgaWYgaXRcbiAgICogZG9lc24ndCBleGlzdCkuXG4gICAqL1xuICBmdXp6eT86IGJvb2xlYW47XG4gIC8qKiBGdXNlLmpzIHRocmVzaG9sZCBmb3J3YXJkZWQgdG8gdGhlIGZ1enp5IGBzZWFyY2hgIG1hdGNoICh7QGxpbmsgc2VhcmNoU2VydmluZ0VuZHBvaW50c30pLiAqL1xuICB0aHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1aXJlIGEgbW9kZWwgdGhhdCBzdXBwb3J0cyBhIGNvbXBsZXRlIGZ1bmN0aW9uLXRvb2wgcm91bmQtdHJpcC4gKi9cbiAgcmVxdWlyZXNUb29scz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDaGF0IGNhcGFiaWxpdHkgY2xhc3MgdG8gcmVzb2x2ZSB3aGVuIG5vIGBleHBsaWNpdGAgaWQgaXMgZ2l2ZW4uIFRoZSBsaXZlXG4gICAqIGNhdGFsb2d1ZSBpcyBjbGFzc2lmaWVkIGJ5IGl0cyBGb3VuZGF0aW9uIE1vZGVsIEFQSSBzY29yZXMgYW5kIHRoZSB0b3BcbiAgICogYXZhaWxhYmxlIG1vZGVsIGluIHRoZSBjbGFzcyAoYW5kIHRoZSBjaGF0IGJhbmRzIGJlbG93IGl0KSB3aW5zLCBmYWxsaW5nXG4gICAqIGJhY2sgdG8gdGhlIGNsYXNzJ3Mgc21hbGwgc3RhdGljIGxpc3QuXG4gICAqL1xuICBtb2RlbENsYXNzPzogTW9kZWxDbGFzcztcbiAgLyoqXG4gICAqIE9wZXJhdG9yLXN1cHBsaWVkIGZhbGxiYWNrIGlkcyB0cmllZCAqZmlyc3QqIGluIHRoZSBuby1leHBsaWNpdCwgbm8tY2xhc3NcbiAgICogcGF0aCAoZS5nLiBhIHJlZ3VsYXRlZCB3b3Jrc3BhY2UgcGlubmVkIHRvIGFuIGFwcHJvdmVkIHN1YnNldCksIGFoZWFkIG9mXG4gICAqIHRoZSBhdXRvLWNsYXNzaWZpZWQgY2F0YWxvZ3VlLlxuICAgKi9cbiAgZmFsbGJhY2tzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKiBPdXRjb21lIG9mIHtAbGluayByZXNvbHZlTW9kZWx9OiB0aGUgY2hvc2VuIGlkIHBsdXMgaG93IGl0IHdhcyByZWFjaGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uIHtcbiAgbW9kZWxJZDogc3RyaW5nO1xuICBzb3VyY2U6IFwiZXhwbGljaXRcIiB8IFwiZnV6enktbWF0Y2hcIiB8IFwiY2xhc3NcIiB8IFwiZmFsbGJhY2tcIjtcbn1cblxuLyoqIEludGVudCArIGNhdGFsb2d1ZSBrbm9icyBwYXNzZWQgdG8ge0BsaW5rIHNlbGVjdE1vZGVsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0TW9kZWxJbnB1dCBleHRlbmRzIFJlc29sdmVNb2RlbElucHV0IHtcbiAgLyoqIFRUTCBvdmVycmlkZSBmb3IgdGhlIGNhY2hlZCBgL3NlcnZpbmctZW5kcG9pbnRzYCBsaXN0aW5nLCBpbiBtcy4gKi9cbiAgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBUVEwgb3ZlcnJpZGUgbWVyZ2VkIGludG8gYSB7QGxpbmsgTW9kZWxRdWVyeX0gZm9yIHtAbGluayBzZWFyY2hNb2RlbHN9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hNb2RlbHNJbnB1dCBleHRlbmRzIE1vZGVsUXVlcnkge1xuICAvKiogVFRMIG92ZXJyaWRlIGZvciB0aGUgY2FjaGVkIGAvc2VydmluZy1lbmRwb2ludHNgIGxpc3RpbmcsIGluIG1zLiAqL1xuICB0dGxNcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSb3VuZCBhIEZ1c2Ugc2NvcmUgdG8gdGhlIGRpc3BsYXkgcHJlY2lzaW9uIHNvIHZlcnNpb24gc2libGluZ3MgdGhhdCBtYXRjaCBhXG4gKiB0b2tlbiBpZGVudGljYWxseSAoZS5nLiBgb3B1cy00LTdgIHZzIGBvcHVzLTQtOGAgZm9yIHRoZSBxdWVyeSBgXCJvcHVzXCJgKSB0aWVcbiAqIG9uIG1hdGNoIGFuZCBsZXQgdGhlIGNsYXNzIC8gd2l0aGluLWNsYXNzIHJhbmsgZGVjaWRlIC0gd2hpY2ggaXMgd2hhdFxuICogc3VyZmFjZXMgdGhlIG5ld2VyLCBoaWdoZXItcXVhbGl0eSBzaWJsaW5nLlxuICovXG5mdW5jdGlvbiBtYXRjaEJ1Y2tldChzY29yZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoKHNjb3JlID8/IDApICogMTAwMCk7XG59XG5cbi8qKlxuICogUmFuayB0aGUgbGl2ZSBjYXRhbG9ndWUgYWdhaW5zdCBhIHtAbGluayBNb2RlbFF1ZXJ5fSwgYmVzdC1maXJzdC5cbiAqXG4gKiBDYW5kaWRhdGVzIGFyZSB0aGUgY2xhc3NpZmllZCBlbmRwb2ludHMgaW4gdGhlIGVsaWdpYmxlIGNsYXNzZXM6XG4gKiB7QGxpbmsgY2xhc3Nlc0F0T3JCZWxvd30gdGhlIHJlcXVlc3RlZCBgbW9kZWxDbGFzc2AsIG9yIC0gd2hlbiBub25lIGlzIGdpdmVuXG4gKiAtIHRoZSBjaGF0IGJhbmRzIG9ubHkgKHtAbGluayBDSEFUX0NMQVNTX09SREVSfSksIHNvIGEgZ2VuZXJhbCBhc2sgbmV2ZXJcbiAqIHN1cmZhY2VzIGFuIGVtYmVkZGluZyBlbmRwb2ludC4gRWFjaCBjbGFzcyBidWNrZXQgaXMgYWxyZWFkeSBiZXN0LWZpcnN0IGZyb21cbiAqIHtAbGluayBjbGFzc2lmeS5jbGFzc2lmeUVuZHBvaW50c30uIFJhbmtpbmcgaXMgKiptYXRjaCB0aGVuIGNsYXNzKio6XG4gKlxuICogMS4gV2l0aCBhIGBzZWFyY2hgLCBvbmx5IGVuZHBvaW50cyBtYXRjaGluZyBpdCBzdXJ2aXZlLCBvcmRlcmVkIGJ5IG1hdGNoXG4gKiAgICBkaXN0YW5jZSAoYnVja2V0ZWQgdmlhIHtAbGluayBtYXRjaEJ1Y2tldH0gc28gbmVhci1pZGVudGljYWwgc2NvcmVzIHRpZSksXG4gKiAgICB0aGVuIGJ5IGNsYXNzIChtb3JlIGNhcGFibGUgZmlyc3QpLCB0aGVuIGJ5IHRoZSBzdGFibGUgd2l0aGluLWNsYXNzIHJhbmsuXG4gKiAyLiBXaXRob3V0IGEgYHNlYXJjaGAsIHRoZSBjbGFzcy10aGVuLXJhbmsgY2FuZGlkYXRlIG9yZGVyIHN0YW5kcy5cbiAqXG4gKiBBIGBsaW1pdGAgdHJ1bmNhdGVzIHRoZSByZXN1bHQuIFJldHVybnMgYFtdYCB3aGVuIG5vdGhpbmcgaXMgZWxpZ2libGUgb3JcbiAqIG1hdGNoZXMgLSBjYWxsZXJzIGxheWVyIHRoZWlyIG93biBmYWxsYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmtNb2RlbHMoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBxdWVyeTogTW9kZWxRdWVyeSA9IHt9LFxuKTogUmFua2VkTW9kZWxbXSB7XG4gIGNvbnN0IGNsYXNzaWZpZWQgPSBjbGFzc2lmeS5jbGFzc2lmeUVuZHBvaW50cyhlbmRwb2ludHMpO1xuICBjb25zdCBlbGlnaWJsZSA9XG4gICAgcXVlcnkubW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkID8gY2xhc3Nlc0F0T3JCZWxvdyhxdWVyeS5tb2RlbENsYXNzKSA6IENIQVRfQ0xBU1NfT1JERVI7XG5cbiAgLy8gRmxhdHRlbiBlbGlnaWJsZSBjbGFzc2VzIGluIGNhcGFiaWxpdHkgb3JkZXIsIGNhcnJ5aW5nIGVhY2ggZW5kcG9pbnQnc1xuICAvLyBjbGFzczsgYnVja2V0IG9yZGVyIGlzIGFscmVhZHkgYmVzdC1maXJzdC5cbiAgY29uc3QgY2FuZGlkYXRlczogUmFua2VkTW9kZWxbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgZWxpZ2libGUpIHtcbiAgICBmb3IgKGNvbnN0IGVuZHBvaW50IG9mIGNsYXNzaWZpZWRbbW9kZWxDbGFzc10pIHtcbiAgICAgIGlmIChxdWVyeS5yZXF1aXJlc1Rvb2xzICYmICFjbGFzc2lmeS5lbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludCkudG9vbHMpIGNvbnRpbnVlO1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHsgZW5kcG9pbnQsIG1vZGVsQ2xhc3MgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2VhcmNoID0gcXVlcnkuc2VhcmNoPy50cmltKCk7XG4gIGxldCByYW5rZWQ6IFJhbmtlZE1vZGVsW107XG4gIGlmIChzZWFyY2gpIHtcbiAgICBjb25zdCBncHRGYW1pbHlTZWFyY2ggPSBzZWFyY2gudG9Mb3dlckNhc2UoKSA9PT0gXCJncHRcIjtcbiAgICBjb25zdCB2ZXJzaW9uZWRGYW1pbHlTZWFyY2ggPSBWRVJTSU9ORURfRkFNSUxZX1NFQVJDSEVTLmhhcyhzZWFyY2gudG9Mb3dlckNhc2UoKSk7XG4gICAgY29uc3Qgc2NvcmVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoXG4gICAgICBzZWFyY2gsXG4gICAgICBjYW5kaWRhdGVzLm1hcCgoYykgPT4gYy5lbmRwb2ludCksXG4gICAgICBxdWVyeS50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZXNob2xkOiBxdWVyeS50aHJlc2hvbGQgfSA6IHt9LFxuICAgICkpIHtcbiAgICAgIHNjb3Jlcy5zZXQobWF0Y2guZW5kcG9pbnQubmFtZSwgbWF0Y2guc2NvcmUpO1xuICAgIH1cbiAgICAvLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGlzIHN0YWJsZSwgc28gZW5kcG9pbnRzIGVxdWFsIG9uIG1hdGNoIGFuZCBjbGFzc1xuICAgIC8vIGtlZXAgdGhlaXIgYmVzdC1maXJzdCB3aXRoaW4tY2xhc3Mgb3JkZXIuXG4gICAgcmFua2VkID0gY2FuZGlkYXRlc1xuICAgICAgLmZpbHRlcigoYykgPT4gc2NvcmVzLmhhcyhjLmVuZHBvaW50Lm5hbWUpKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGMpID0+ICFncHRGYW1pbHlTZWFyY2ggfHwgIS8oPzpefFstXy5dKWdwdFstXy5dP29zcyg/OlstXy5dfCQpL2kudGVzdChjLmVuZHBvaW50Lm5hbWUpLFxuICAgICAgKVxuICAgICAgLm1hcCgoYykgPT4gKHsgLi4uYywgc2NvcmU6IHNjb3Jlcy5nZXQoYy5lbmRwb2ludC5uYW1lKSB9KSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ5TWF0Y2ggPSBtYXRjaEJ1Y2tldChhLnNjb3JlKSAtIG1hdGNoQnVja2V0KGIuc2NvcmUpO1xuICAgICAgICBpZiAoYnlNYXRjaCAhPT0gMCkgcmV0dXJuIGJ5TWF0Y2g7XG4gICAgICAgIGlmICh2ZXJzaW9uZWRGYW1pbHlTZWFyY2gpIHtcbiAgICAgICAgICBjb25zdCBhVmVyc2lvbiA9IGNsYXNzaWZ5LnZlcnNpb25UdXBsZShhLmVuZHBvaW50Lm5hbWUpO1xuICAgICAgICAgIGNvbnN0IGJWZXJzaW9uID0gY2xhc3NpZnkudmVyc2lvblR1cGxlKGIuZW5kcG9pbnQubmFtZSk7XG4gICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDM7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJ5VmVyc2lvbiA9IChiVmVyc2lvbltpbmRleF0gPz8gMCkgLSAoYVZlcnNpb25baW5kZXhdID8/IDApO1xuICAgICAgICAgICAgaWYgKGJ5VmVyc2lvbiAhPT0gMCkgcmV0dXJuIGJ5VmVyc2lvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1PREVMX0NMQVNTX09SREVSLmluZGV4T2YoYS5tb2RlbENsYXNzKSAtIE1PREVMX0NMQVNTX09SREVSLmluZGV4T2YoYi5tb2RlbENsYXNzKTtcbiAgICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJhbmtlZCA9IGNhbmRpZGF0ZXM7XG4gIH1cblxuICByZXR1cm4gcXVlcnkubGltaXQgIT09IHVuZGVmaW5lZCA/IHJhbmtlZC5zbGljZSgwLCBNYXRoLm1heCgwLCBxdWVyeS5saW1pdCkpIDogcmFua2VkO1xufVxuXG4vKipcbiAqIENvbGxhcHNlIHtAbGluayByYW5rTW9kZWxzfSB0byBhIHNpbmdsZSBpZDogdGhlIGNsb3Nlc3QgZW5kcG9pbnQgdG8gYHNlYXJjaGBcbiAqIGluIGEgY2F0YWxvZ3VlIHNuYXBzaG90LCBvciB0aGUgaW5wdXQgdmVyYmF0aW0gd2hlbiBub3RoaW5nIHNjb3JlcyB3aXRoaW4gdGhlXG4gKiB0aHJlc2hvbGQuXG4gKlxuICogVGhlIHJhbmstYmFzZWQgY291bnRlcnBhcnQgdG8gdGhlIEZ1c2Utb25seSB7QGxpbmsgcmVzb2x2ZU1vZGVsSWR9OiBlcXVhbFxuICogbWF0Y2ggc2NvcmVzIGFyZSBicm9rZW4gYnkgY2xhc3MgYW5kIHRoZW4gd2l0aGluLWNsYXNzIHZlcnNpb24sIHNvIGEgbG9vc2VcbiAqIGBcIm9wdXNcImAgcHJlZmVycyBgb3B1cy01YCBvdmVyIGBvcHVzLTQtN2AgaW5zdGVhZCBvZiBwaWNraW5nIHdoaWNoZXZlclxuICogc2libGluZyBGdXNlIGhhcHBlbmVkIHRvIG9yZGVyIGZpcnN0LiBSZXR1cm5pbmcgdGhlIGlucHV0IHVubWF0Y2hlZCAocmF0aGVyXG4gKiB0aGFuIGEgbmVhciBuZWlnaGJvdXIpIGlzIGRlbGliZXJhdGUgLSBhIGRlbGliZXJhdGUgZW5kcG9pbnQgaWQgaXMgbmV2ZXJcbiAqIHNpbGVudGx5IHJld3JpdHRlbiwgYW5kIERhdGFicmlja3Mgc3VyZmFjZXMgYSBjbGVhbiA0MDQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5rTW9kZWxJZChcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIHNlYXJjaDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxPcHRpb25zID0ge30sXG4pOiBSZXNvbHZlZE1vZGVsIHtcbiAgY29uc3QgW3RvcF0gPSByYW5rTW9kZWxzKGVuZHBvaW50cywge1xuICAgIHNlYXJjaCxcbiAgICBsaW1pdDogMSxcbiAgICAuLi4ob3B0aW9ucy50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZXNob2xkOiBvcHRpb25zLnRocmVzaG9sZCB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLnJlcXVpcmVzVG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgcmVxdWlyZXNUb29sczogb3B0aW9ucy5yZXF1aXJlc1Rvb2xzIH0gOiB7fSksXG4gIH0pO1xuICBpZiAoIXRvcCkgcmV0dXJuIHsgbW9kZWxJZDogc2VhcmNoLCBtYXRjaGVkOiBmYWxzZSB9O1xuICByZXR1cm4geyBtb2RlbElkOiB0b3AuZW5kcG9pbnQubmFtZSwgbWF0Y2hlZDogdHJ1ZSwgc2NvcmU6IHRvcC5zY29yZSB9O1xufVxuXG4vKipcbiAqIHtAbGluayByYW5rTW9kZWxJZH0gYWdhaW5zdCBhIGNhdGFsb2d1ZSB0aGUgY2FsbGVyIG1heSBiZSBob2xkaW5nIHN0YWxlOlxuICogbWF0Y2ggdGhlIGxvYWRlZCBzbmFwc2hvdCwgYW5kIG9uIGEgbWlzcyByZWxvYWQgb25jZSB3aXRoIGBmb3JjZWAgYW5kIG1hdGNoXG4gKiBhZ2Fpbi4gVGhhdCB3YXkgYSBtb2RlbCBkZXBsb3llZCBhZnRlciB0aGUgY2F0YWxvZ3VlIHdhcyBjYWNoZWQgc3RpbGxcbiAqIHJlc29sdmVzIG9uIGZpcnN0IHVzZSwgd2l0aG91dCBhIHJlc3RhcnQgYW5kIHdpdGhvdXQgZ2l2aW5nIHVwIGNhY2hpbmcuXG4gKlxuICogVGhlIGNhdGFsb2d1ZSBhcnJpdmVzIGFzIGEgbG9hZGVyIHJhdGhlciB0aGFuIGEgY2xpZW50IHNvIHRoZSBjYWxsZXIga2VlcHNcbiAqIG93bmVyc2hpcCBvZiAqaG93KiBpdCBpcyBjYWNoZWQgLSB7QGxpbmsgbGlzdFNlcnZpbmdFbmRwb2ludHN9IGFuZCBpdHNcbiAqIGBDYWNoZU1hbmFnZXJgLCBhIHBsYWluIHByb2Nlc3MtbGlmZXRpbWUgZmllbGQgaW4gYSBDTEksIG9yIGEgdGVzdCBkb3VibGUuXG4gKiBPbmx5IG9uZSByZWxvYWQgaXMgYXR0ZW1wdGVkOiBhIGdlbnVpbmVseSB1bmtub3duIG5hbWUgc2hvdWxkIGZhaWwgZmFzdFxuICogcmF0aGVyIHRoYW4gcmUtbGlzdCBvbiBldmVyeSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBsb2FkIC0gUmV0dXJucyB0aGUgY2F0YWxvZ3VlOyBgZm9yY2VgIGFza3MgaXQgdG8gYnlwYXNzIGl0cyBjYWNoZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJhbmtNb2RlbElkTGl2ZShcbiAgbG9hZDogKGZvcmNlOiBib29sZWFuKSA9PiBQcm9taXNlPHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4sXG4gIHNlYXJjaDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFJlc29sdmVkTW9kZWw+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByYW5rTW9kZWxJZChhd2FpdCBsb2FkKGZhbHNlKSwgc2VhcmNoLCBvcHRpb25zKTtcbiAgaWYgKHJlc29sdmVkLm1hdGNoZWQpIHJldHVybiByZXNvbHZlZDtcbiAgcmV0dXJuIHJhbmtNb2RlbElkKGF3YWl0IGxvYWQodHJ1ZSksIHNlYXJjaCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmFuayBhIHdvcmtzcGFjZSdzIGNhdGFsb2d1ZSBpbiBvbmUgY2FsbDogbGlzdCBpdHMgYC9zZXJ2aW5nLWVuZHBvaW50c2BcbiAqIChjYWNoZWQpIGFuZCBydW4ge0BsaW5rIHJhbmtNb2RlbHN9IG92ZXIgdGhlIHJlc3VsdC4gVGhlIGxpc3QgY291bnRlcnBhcnQgdG9cbiAqIHtAbGluayBzZWxlY3RNb2RlbH0sIGZvciBhIGNvbnN1bWVyIHRoYXQgd2FudHMgdGhlIGZ1bGwgcmFua2VkIHNldCAoYSBtb2RlbFxuICogcGlja2VyLCBhIENMSSkgcmF0aGVyIHRoYW4gYSBzaW5nbGUgaWQuIENhdGFsb2d1ZSBmZXRjaGVzIGZhaWwgbG91ZDogbmV0d29ya1xuICogLyBhdXRoIGVycm9ycyBwcm9wYWdhdGUgc28gdGhlIGNhbGxlciBzZWVzIHRoZSByZWFsIFNESyBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBob3N0IC0gV29ya3NwYWNlIGhvc3QgdXNlZCBhcyB0aGUgY2FjaGUga2V5LiBQYXNzIHRoZSB2YWx1ZSByZXNvbHZlZFxuICogICBmcm9tIGBjbGllbnQuY29uZmlnLmdldEhvc3QoKWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWFyY2hNb2RlbHMoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgaG9zdDogc3RyaW5nLFxuICBpbnB1dDogU2VhcmNoTW9kZWxzSW5wdXQgPSB7fSxcbik6IFByb21pc2U8UmFua2VkTW9kZWxbXT4ge1xuICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50cyhcbiAgICBjbGllbnQsXG4gICAgaG9zdCxcbiAgICBpbnB1dC50dGxNcyAhPT0gdW5kZWZpbmVkID8geyB0dGxNczogaW5wdXQudHRsTXMgfSA6IHt9LFxuICApO1xuICByZXR1cm4gcmFua01vZGVscyhlbmRwb2ludHMsIGlucHV0KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgbW9kZWwgaWQgZm9yIGEgd29ya3NwYWNlIGluIG9uZSBjYWxsOiBsaXN0IGl0cyBgL3NlcnZpbmctZW5kcG9pbnRzYFxuICogKGNhY2hlZCkgYW5kIHJ1biB7QGxpbmsgcmVzb2x2ZU1vZGVsfSBvdmVyIHRoZSByZXN1bHQuIFRoaXMgaXMgdGhlIGVudHJ5XG4gKiBwb2ludCBmb3IgYW55IGNvbnN1bWVyIHRoYXQgaG9sZHMgYSBgV29ya3NwYWNlQ2xpZW50YCBhbmQganVzdCB3YW50cyBhIHVzYWJsZVxuICogbW9kZWwgbmFtZSAtIGEgTGFrZWZsb3cgam9iLCBhIG9uZS1vZmYgc2NyaXB0LCBvciB0aGUgTWFzdHJhIHBsdWdpbiBhbGlrZS5cbiAqXG4gKiBDaGVhcCBleGl0OiB3aGVuIGFuIGBleHBsaWNpdGAgbmFtZSBpcyBnaXZlbiwgYGZ1enp5YCBpcyBvZmYsIGFuZCB0b29sXG4gKiBjYXBhYmlsaXR5IGlzIG5vdCByZXF1aXJlZCwgdGhlIGNhdGFsb2d1ZSBpcyBuZXZlciBmZXRjaGVkLiBDYXRhbG9ndWVcbiAqIGZldGNoZXMgb3RoZXJ3aXNlIGZhaWwgbG91ZDogbmV0d29yayAvIGF1dGggZXJyb3JzIHByb3BhZ2F0ZSBzbyB0aGUgY2FsbGVyXG4gKiBzZWVzIHRoZSByZWFsIFNESyBtZXNzYWdlIGluc3RlYWQgb2YgYSBzaWxlbnQgZmFsbGJhY2suXG4gKlxuICogQHBhcmFtIGhvc3QgLSBXb3Jrc3BhY2UgaG9zdCB1c2VkIGFzIHRoZSBjYWNoZSBrZXkuIFBhc3MgdGhlIHZhbHVlIHJlc29sdmVkXG4gKiAgIGZyb20gYGNsaWVudC5jb25maWcuZ2V0SG9zdCgpYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbGVjdE1vZGVsKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIGhvc3Q6IHN0cmluZyxcbiAgaW5wdXQ6IFNlbGVjdE1vZGVsSW5wdXQgPSB7fSxcbik6IFByb21pc2U8UmVzb2x2ZWRNb2RlbFNlbGVjdGlvbj4ge1xuICBpZiAoaW5wdXQuZXhwbGljaXQgIT09IHVuZGVmaW5lZCAmJiBpbnB1dC5mdXp6eSA9PT0gZmFsc2UgJiYgIWlucHV0LnJlcXVpcmVzVG9vbHMpIHtcbiAgICByZXR1cm4geyBtb2RlbElkOiBpbnB1dC5leHBsaWNpdCwgc291cmNlOiBcImV4cGxpY2l0XCIgfTtcbiAgfVxuICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50cyhjbGllbnQsIGhvc3QsIHtcbiAgICAuLi4oaW5wdXQudHRsTXMgIT09IHVuZGVmaW5lZCA/IHsgdHRsTXM6IGlucHV0LnR0bE1zIH0gOiB7fSksXG4gIH0pO1xuICByZXR1cm4gcmVzb2x2ZU1vZGVsKGVuZHBvaW50cywgaW5wdXQpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBzaW5nbGUgbW9kZWwgaWQgZnJvbSB0aGUgbGl2ZSBjYXRhbG9ndWUgYW5kIGNhbGxlciBpbnRlbnQsXG4gKiBkZWxlZ2F0aW5nIHRoZSBsaXZlIHNlbGVjdGlvbiB0byB7QGxpbmsgcmFua01vZGVsc30gd2l0aCBgbGltaXQ6IDFgLlxuICpcbiAqIDEuICoqRXhwbGljaXQgYXNrKio6IHdpdGggYGZ1enp5YCBvZmYsIHJldHVybmVkIHZlcmJhdGltOyBvdGhlcndpc2VcbiAqICAgIGZ1enp5LXJhbmtlZCB3aXRoaW4gdGhlIChvcHRpb25hbCkgY2xhc3MgY2VpbGluZyBhbmQgdGhlIGJlc3QgdGFrZW4sXG4gKiAgICBmYWxsaW5nIGJhY2sgdG8gdGhlIGlucHV0IHZlcmJhdGltIHdoZW4gbm90aGluZyBtYXRjaGVzLlxuICogMi4gKipObyBleHBsaWNpdCBhc2sqKjogYW4gb3BlcmF0b3ItcGlubmVkIGBmYWxsYmFja2AgdGhhdCBleGlzdHMgaW4gdGhlIGxpdmVcbiAqICAgIGNhdGFsb2d1ZSB3aW5zIGZpcnN0OyB0aGVuIHRoZSByYW5rZWQgbGl2ZSBjYXRhbG9ndWUgKGNsYXNzIGNlaWxpbmdcbiAqICAgIGFwcGxpZWQpOyB0aGVuIHRoZSBzdGF0aWMge0BsaW5rIEZBTExCQUNLX01PREVMX0lEU30gZmxvb3Igd2hlbiB0aGVcbiAqICAgIGNhdGFsb2d1ZSB5aWVsZHMgbm90aGluZyBpbiByYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNb2RlbChcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIGlucHV0OiBSZXNvbHZlTW9kZWxJbnB1dCA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbiB7XG4gIGlmIChpbnB1dC5leHBsaWNpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGlucHV0LmZ1enp5ID09PSBmYWxzZSkge1xuICAgICAgaWYgKGlucHV0LnJlcXVpcmVzVG9vbHMpIGFzc2VydFRvb2xTdXBwb3J0KGVuZHBvaW50cywgaW5wdXQuZXhwbGljaXQpO1xuICAgICAgcmV0dXJuIHsgbW9kZWxJZDogaW5wdXQuZXhwbGljaXQsIHNvdXJjZTogXCJleHBsaWNpdFwiIH07XG4gICAgfVxuICAgIGNvbnN0IFt0b3BdID0gcmFua01vZGVscyhlbmRwb2ludHMsIGJ1aWxkUXVlcnkoaW5wdXQsIGlucHV0LmV4cGxpY2l0KSk7XG4gICAgaWYgKGlucHV0LnJlcXVpcmVzVG9vbHMgJiYgIXRvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0b29sLWNhcGFibGUgbW9kZWwgbWF0Y2hlcyBcIiR7aW5wdXQuZXhwbGljaXR9XCJgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbW9kZWxJZDogdG9wPy5lbmRwb2ludC5uYW1lID8/IGlucHV0LmV4cGxpY2l0LCBzb3VyY2U6IFwiZnV6enktbWF0Y2hcIiB9O1xuICB9XG5cbiAgLy8gT3BlcmF0b3ItcGlubmVkIGZhbGxiYWNrcyB3aW4gd2hlbiBwcmVzZW50IGFuZCBsaXZlIChlLmcuIGEgcmVndWxhdGVkXG4gIC8vIHdvcmtzcGFjZSByZXN0cmljdGVkIHRvIGFuIGFwcHJvdmVkIHN1YnNldCkuXG4gIGlmIChpbnB1dC5tb2RlbENsYXNzID09PSB1bmRlZmluZWQgJiYgaW5wdXQuZmFsbGJhY2tzICYmIGlucHV0LmZhbGxiYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcHJlc2VudCA9IG5ldyBTZXQoXG4gICAgICBlbmRwb2ludHNcbiAgICAgICAgLmZpbHRlcigoZW5kcG9pbnQpID0+ICFpbnB1dC5yZXF1aXJlc1Rvb2xzIHx8IGNsYXNzaWZ5LmVuZHBvaW50Q2FwYWJpbGl0aWVzKGVuZHBvaW50KS50b29scylcbiAgICAgICAgLm1hcCgoZW5kcG9pbnQpID0+IGVuZHBvaW50Lm5hbWUpLFxuICAgICk7XG4gICAgY29uc3QgcGlubmVkID0gaW5wdXQuZmFsbGJhY2tzLmZpbmQoKGlkKSA9PiBwcmVzZW50LmhhcyhpZCkpO1xuICAgIGlmIChwaW5uZWQpIHJldHVybiB7IG1vZGVsSWQ6IHBpbm5lZCwgc291cmNlOiBcImZhbGxiYWNrXCIgfTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZSA9IGlucHV0Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IFwiY2xhc3NcIiA6IFwiZmFsbGJhY2tcIjtcbiAgY29uc3QgW3RvcF0gPSByYW5rTW9kZWxzKGVuZHBvaW50cywgYnVpbGRRdWVyeShpbnB1dCwgdW5kZWZpbmVkKSk7XG4gIGlmICh0b3ApIHJldHVybiB7IG1vZGVsSWQ6IHRvcC5lbmRwb2ludC5uYW1lLCBzb3VyY2UgfTtcblxuICAvLyBMaXZlIGNhdGFsb2d1ZSB5aWVsZGVkIG5vdGhpbmcgaW4gcmFuZ2U6IHdhbGsgdGhlIHN0YXRpYyBmbG9vci5cbiAgY29uc3QgZmxvb3JTb3VyY2UgPVxuICAgIGlucHV0Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IG1vZGVsc0ZvckNsYXNzKGlucHV0Lm1vZGVsQ2xhc3MpIDogKGlucHV0LmZhbGxiYWNrcyA/PyBbXSk7XG4gIGNvbnN0IGZsb29yID0gb2JqZWN0LnNlcXVlbmNlKGZsb29yU291cmNlKS5jb25jYXQoRkFMTEJBQ0tfTU9ERUxfSURTKS5kaXN0aW5jdCgpLnRvQXJyYXkoKTtcbiAgaWYgKGlucHV0LnJlcXVpcmVzVG9vbHMpIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBuZXcgU2V0KFxuICAgICAgZW5kcG9pbnRzXG4gICAgICAgIC5maWx0ZXIoKGVuZHBvaW50KSA9PiBjbGFzc2lmeS5lbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludCkudG9vbHMpXG4gICAgICAgIC5tYXAoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lKSxcbiAgICApO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gZmxvb3IuZmluZCgoaWQpID0+IGF2YWlsYWJsZS5oYXMoaWQpKTtcbiAgICBpZiAoIXNlbGVjdGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJObyB0b29sLWNhcGFibGUgbW9kZWwgaXMgYXZhaWxhYmxlXCIpO1xuICAgIHJldHVybiB7IG1vZGVsSWQ6IHNlbGVjdGVkLCBzb3VyY2UgfTtcbiAgfVxuICByZXR1cm4geyBtb2RlbElkOiBwaWNrRmlyc3RBdmFpbGFibGUoZmxvb3IsIGVuZHBvaW50cyksIHNvdXJjZSB9O1xufVxuXG4vKiogQnVpbGQgYSB7QGxpbmsgTW9kZWxRdWVyeX0gZnJvbSB7QGxpbmsgUmVzb2x2ZU1vZGVsSW5wdXR9IGZvciB0aGUgYGxpbWl0OiAxYCBkZWxlZ2F0aW9uLiAqL1xuZnVuY3Rpb24gYnVpbGRRdWVyeShpbnB1dDogUmVzb2x2ZU1vZGVsSW5wdXQsIHNlYXJjaDogc3RyaW5nIHwgdW5kZWZpbmVkKTogTW9kZWxRdWVyeSB7XG4gIHJldHVybiB7XG4gICAgLi4uKHNlYXJjaCAhPT0gdW5kZWZpbmVkID8geyBzZWFyY2ggfSA6IHt9KSxcbiAgICAuLi4oaW5wdXQubW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkID8geyBtb2RlbENsYXNzOiBpbnB1dC5tb2RlbENsYXNzIH0gOiB7fSksXG4gICAgLi4uKGlucHV0LnJlcXVpcmVzVG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgcmVxdWlyZXNUb29sczogaW5wdXQucmVxdWlyZXNUb29scyB9IDoge30pLFxuICAgIC4uLihpbnB1dC50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZXNob2xkOiBpbnB1dC50aHJlc2hvbGQgfSA6IHt9KSxcbiAgICBsaW1pdDogMSxcbiAgfTtcbn1cblxuLyoqIFRocm93IHdoZW4gYW4gZXhwbGljaXQgaWQgaXMgYWJzZW50IG9yIG5vdCB2ZXJpZmllZCBmb3IgZnVuY3Rpb24gdG9vbHMuICovXG5mdW5jdGlvbiBhc3NlcnRUb29sU3VwcG9ydChlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSwgbW9kZWxJZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGVuZHBvaW50ID0gZW5kcG9pbnRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IG1vZGVsSWQpO1xuICBpZiAoIWVuZHBvaW50IHx8ICFjbGFzc2lmeS5lbmRwb2ludENhcGFiaWxpdGllcyhlbmRwb2ludCkudG9vbHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsIFwiJHttb2RlbElkfVwiIGRvZXMgbm90IHN1cHBvcnQgZnVuY3Rpb24gdG9vbHNgKTtcbiAgfVxufVxuXG4vKipcbiAqIEZpbmQgdGhlIGZpcnN0IGlkIGluIGBjYW5kaWRhdGVzYCB3aG9zZSBlbmRwb2ludCBpcyBwcmVzZW50IGluIGBlbmRwb2ludHNgLlxuICogUmV0dXJucyB0aGUgdG9wIGNhbmRpZGF0ZSB3aGVuIHRoZSB3b3Jrc3BhY2UgaGFzIG5vbmUgb2YgdGhlbSBzbyBjYWxsZXJzXG4gKiBhbHdheXMgZ2V0IGEgc3RyaW5nOyBhbiBvZmZsaW5lIHdvcmtzcGFjZSB0aGVuIHJlY2VpdmVzIGEgY2xlYW4gNDA0IGZyb21cbiAqIERhdGFicmlja3MgaW5zdGVhZCBvZiBhIG1hbGZvcm1lZCBjb25maWcuXG4gKi9cbmZ1bmN0aW9uIHBpY2tGaXJzdEF2YWlsYWJsZShcbiAgY2FuZGlkYXRlczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcHJlc2VudCA9IG5ldyBTZXQoZW5kcG9pbnRzLm1hcCgoZSkgPT4gZS5uYW1lKSk7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAocHJlc2VudC5oYXMoY2FuZGlkYXRlKSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlc1swXSA/PyBGQUxMQkFDS19NT0RFTF9JRFNbMF0hO1xufVxuIl19
|
|
275
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsUUFBUSxHQUtULE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixzQkFBc0IsR0FJdkIsTUFBTSxjQUFjLENBQUM7QUFJdEIsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN4QyxRQUFRO0lBQ1IsUUFBUTtJQUNSLE9BQU87SUFDUCxLQUFLO0lBQ0wsS0FBSztJQUNMLE9BQU87SUFDUCxNQUFNO0NBQ1AsQ0FBQyxDQUFDO0FBcURIOzs7OztHQUtHO0FBQ0gsU0FBUyxXQUFXLENBQUMsS0FBeUI7SUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQzFCLFNBQTRDLEVBQzVDLFFBQW9CLEVBQUU7SUFFdEIsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sUUFBUSxHQUNaLEtBQUssQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixD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LENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsa0JBQWtCLENBQ3pCLFVBQTZCLEVBQzdCLFNBQTRDO0lBRTVDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RELEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7UUFDbkMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUUsQ0FBQztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXb3Jrc3BhY2UtYXdhcmUgbW9kZWwgc2VsZWN0aW9uLlxuICpcbiAqIEdpdmVuIGEgY2FsbGVyJ3MgaW50ZW50IC0gYSBzZWFyY2ggc3RyaW5nLCBhIGNhcGFiaWxpdHkge0BsaW5rIE1vZGVsQ2xhc3N9XG4gKiBjZWlsaW5nLCBib3RoLCBvciBub3RoaW5nIC0gdGhlIHRvb2xraXQgcmV0dXJucyBtYXRjaGluZyBlbmRwb2ludHMgcmFua2VkIGJ5XG4gKiBtYXRjaCBxdWFsaXR5IHRoZW4gY2xhc3MsIG9yIGNvbGxhcHNlcyB0byB0aGUgc2luZ2xlIGJlc3QgaWQgdGhlIHdvcmtzcGFjZVxuICogYWN0dWFsbHkgaGFzLCBkZWdyYWRpbmcgZnJvbSBcImJlc3QgaW4gcmFuZ2VcIiBkb3duIHRvIHRoZSBzdGF0aWMgZmFsbGJhY2tcbiAqIGZsb29yLiBTZWxlY3Rpb24gaXMgY2hhdC1vbmx5OiBlbWJlZGRpbmcgZW5kcG9pbnRzIHN1cmZhY2Ugb25seSB3aGVuXG4gKiBgbW9kZWxDbGFzc2AgaXMgZXhwbGljaXRseSB7QGxpbmsgTW9kZWxDbGFzcy5FbWJlZGRpbmd9LlxuICpcbiAqIFR3byBzaGFwZXMgb2Ygc2VsZWN0aW9uLCBlYWNoIGluIGEgcHVyZSBmb3JtIChvdmVyIGFuIGVuZHBvaW50IGxpc3QgdGhlXG4gKiBjYWxsZXIgYWxyZWFkeSBob2xkcykgYW5kIGFuIEkvTyB3cmFwcGVyICh0aGF0IGxpc3RzIGAvc2VydmluZy1lbmRwb2ludHNgXG4gKiBmaXJzdCk6IHJhbmtpbmcsIHdoaWNoIHJldHVybnMgYSBtYXRjaC0gdGhlbiBjbGFzcy1vcmRlcmVkIGxpc3QsIGFuZFxuICogc2luZ2xlLXNlbGVjdGlvbiwgd2hpY2ggY29sbGFwc2VzIHRvIG9uZSBpZCBwbHVzIGhvdyBpdCB3YXMgcmVhY2hlZCBhbmRcbiAqIGxheWVycyB0aGUgb3BlcmF0b3ItcGlubmVkIGZhbGxiYWNrIC8gc3RhdGljLWZsb29yIHNhZmV0eSBuZXQgb24gdG9wLiBBIGNoYXRcbiAqIGBtb2RlbENsYXNzYCBhY3RzIGFzIGEgY2VpbGluZzogdGhhdCBiYW5kIGFuZCB0aGUgbGVzcy1jYXBhYmxlIGNoYXQgYmFuZHNcbiAqIGJlbG93IGl0IGFyZSBlbGlnaWJsZSAoc2VlIHtAbGluayBjbGFzc2VzQXRPckJlbG93fSksIHNvIGEgYGNoYXQtYmFsYW5jZWRgXG4gKiBhc2sgY2FuIGZhbGwgdG8gYGNoYXQtZmFzdGAgYnV0IG5ldmVyIGVzY2FsYXRlIHRvIGBjaGF0LXRoaW5raW5nYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgb2JqZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIGNsYXNzaWZ5LFxuICBtb2RlbCxcbiAgdHlwZSBNb2RlbFF1ZXJ5LFxuICB0eXBlIFJhbmtlZE1vZGVsLFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuXG5pbXBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBjbGFzc2VzQXRPckJlbG93LCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL2NsYXNzZXMudHNcIjtcbmltcG9ydCB7IEZBTExCQUNLX01PREVMX0lEUywgbW9kZWxzRm9yQ2xhc3MgfSBmcm9tIFwiLi9mYWxsYmFjay50c1wiO1xuaW1wb3J0IHtcbiAgbGlzdFNlcnZpbmdFbmRwb2ludHMsXG4gIHNlYXJjaFNlcnZpbmdFbmRwb2ludHMsXG4gIHR5cGUgUmVzb2x2ZWRNb2RlbCxcbiAgdHlwZSBSZXNvbHZlTW9kZWxPcHRpb25zLFxuICB0eXBlIFdvcmtzcGFjZUNsaWVudExpa2UsXG59IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcblxudHlwZSBNb2RlbENsYXNzID0gbW9kZWwuTW9kZWxDbGFzcztcblxuY29uc3QgVkVSU0lPTkVEX0ZBTUlMWV9TRUFSQ0hFUyA9IG5ldyBTZXQoW1xuICBcImNsYXVkZVwiLFxuICBcImdlbWluaVwiLFxuICBcImdlbW1hXCIsXG4gIFwiZ2xtXCIsXG4gIFwiZ3B0XCIsXG4gIFwibGxhbWFcIixcbiAgXCJxd2VuXCIsXG5dKTtcblxuLyoqIENhbGxlciBpbnRlbnQgcGFzc2VkIHRvIHtAbGluayByZXNvbHZlTW9kZWx9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlTW9kZWxJbnB1dCB7XG4gIC8qKlxuICAgKiBFeHBsaWNpdCBtb2RlbCBpZCAvIGxvb3NlIG5hbWUgKHBlci1yZXF1ZXN0IG92ZXJyaWRlLCBhZ2VudCAvIHBsdWdpblxuICAgKiBkZWZhdWx0LCBvciBlbnYgdmFyKS4gV2hlbiBzZXQgaXQgd2lucyBvdmVyIGBtb2RlbENsYXNzYCBhbmQgYGZhbGxiYWNrc2AuXG4gICAqL1xuICBleHBsaWNpdD86IHN0cmluZztcbiAgLyoqXG4gICAqIEZ1enp5LW1hdGNoIGFuIGBleHBsaWNpdGAgbmFtZSBhZ2FpbnN0IHRoZSBsaXZlIGNhdGFsb2d1ZSBzbyBsb29zZSBuYW1lc1xuICAgKiBsaWtlIGBcImNsYXVkZSBzb25uZXRcImAgcmVzb2x2ZS4gRGVmYXVsdCBgdHJ1ZWAuIFdoZW4gYGZhbHNlYCB0aGUgZXhwbGljaXRcbiAgICogaW5wdXQgaXMgcmV0dXJuZWQgdmVyYmF0aW0gKERhdGFicmlja3Mgc3VyZmFjZXMgdGhlIGNhbm9uaWNhbCA0MDQgaWYgaXRcbiAgICogZG9lc24ndCBleGlzdCkuXG4gICAqL1xuICBmdXp6eT86IGJvb2xlYW47XG4gIC8qKiBGdXNlLmpzIHRocmVzaG9sZCBmb3J3YXJkZWQgdG8gdGhlIGZ1enp5IGBzZWFyY2hgIG1hdGNoICh7QGxpbmsgc2VhcmNoU2VydmluZ0VuZHBvaW50c30pLiAqL1xuICB0aHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1aXJlIGEgbW9kZWwgdGhhdCBzdXBwb3J0cyBhIGNvbXBsZXRlIGZ1bmN0aW9uLXRvb2wgcm91bmQtdHJpcC4gKi9cbiAgcmVxdWlyZXNUb29scz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDaGF0IGNhcGFiaWxpdHkgY2xhc3MgdG8gcmVzb2x2ZSB3aGVuIG5vIGBleHBsaWNpdGAgaWQgaXMgZ2l2ZW4uIFRoZSBsaXZlXG4gICAqIGNhdGFsb2d1ZSBpcyBjbGFzc2lmaWVkIGJ5IGl0cyBGb3VuZGF0aW9uIE1vZGVsIEFQSSBzY29yZXMgYW5kIHRoZSB0b3BcbiAgICogYXZhaWxhYmxlIG1vZGVsIGluIHRoZSBjbGFzcyAoYW5kIHRoZSBjaGF0IGJhbmRzIGJlbG93IGl0KSB3aW5zLCBmYWxsaW5nXG4gICAqIGJhY2sgdG8gdGhlIGNsYXNzJ3Mgc21hbGwgc3RhdGljIGxpc3QuXG4gICAqL1xuICBtb2RlbENsYXNzPzogTW9kZWxDbGFzcztcbiAgLyoqXG4gICAqIE9wZXJhdG9yLXN1cHBsaWVkIGZhbGxiYWNrIGlkcyB0cmllZCAqZmlyc3QqIGluIHRoZSBuby1leHBsaWNpdCwgbm8tY2xhc3NcbiAgICogcGF0aCAoZS5nLiBhIHJlZ3VsYXRlZCB3b3Jrc3BhY2UgcGlubmVkIHRvIGFuIGFwcHJvdmVkIHN1YnNldCksIGFoZWFkIG9mXG4gICAqIHRoZSBhdXRvLWNsYXNzaWZpZWQgY2F0YWxvZ3VlLlxuICAgKi9cbiAgZmFsbGJhY2tzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKiBPdXRjb21lIG9mIHtAbGluayByZXNvbHZlTW9kZWx9OiB0aGUgY2hvc2VuIGlkIHBsdXMgaG93IGl0IHdhcyByZWFjaGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uIHtcbiAgbW9kZWxJZDogc3RyaW5nO1xuICBzb3VyY2U6IFwiZXhwbGljaXRcIiB8IFwiZnV6enktbWF0Y2hcIiB8IFwiY2xhc3NcIiB8IFwiZmFsbGJhY2tcIjtcbn1cblxuLyoqIEludGVudCArIGNhdGFsb2d1ZSBrbm9icyBwYXNzZWQgdG8ge0BsaW5rIHNlbGVjdE1vZGVsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0TW9kZWxJbnB1dCBleHRlbmRzIFJlc29sdmVNb2RlbElucHV0IHtcbiAgLyoqIFRUTCBvdmVycmlkZSBmb3IgdGhlIGNhY2hlZCBgL3NlcnZpbmctZW5kcG9pbnRzYCBsaXN0aW5nLCBpbiBtcy4gKi9cbiAgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBUVEwgb3ZlcnJpZGUgbWVyZ2VkIGludG8gYSB7QGxpbmsgTW9kZWxRdWVyeX0gZm9yIHtAbGluayBzZWFyY2hNb2RlbHN9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hNb2RlbHNJbnB1dCBleHRlbmRzIE1vZGVsUXVlcnkge1xuICAvKiogVFRMIG92ZXJyaWRlIGZvciB0aGUgY2FjaGVkIGAvc2VydmluZy1lbmRwb2ludHNgIGxpc3RpbmcsIGluIG1zLiAqL1xuICB0dGxNcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSb3VuZCBhIEZ1c2Ugc2NvcmUgdG8gdGhlIGRpc3BsYXkgcHJlY2lzaW9uIHNvIHZlcnNpb24gc2libGluZ3MgdGhhdCBtYXRjaCBhXG4gKiB0b2tlbiBpZGVudGljYWxseSAoZS5nLiBgb3B1cy00LTdgIHZzIGBvcHVzLTQtOGAgZm9yIHRoZSBxdWVyeSBgXCJvcHVzXCJgKSB0aWVcbiAqIG9uIG1hdGNoIGFuZCBsZXQgdGhlIGNsYXNzIC8gd2l0aGluLWNsYXNzIHJhbmsgZGVjaWRlIC0gd2hpY2ggaXMgd2hhdFxuICogc3VyZmFjZXMgdGhlIG5ld2VyLCBoaWdoZXItcXVhbGl0eSBzaWJsaW5nLlxuICovXG5mdW5jdGlvbiBtYXRjaEJ1Y2tldChzY29yZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoKHNjb3JlID8/IDApICogMTAwMCk7XG59XG5cbi8qKlxuICogUmFuayB0aGUgbGl2ZSBjYXRhbG9ndWUgYWdhaW5zdCBhIHtAbGluayBNb2RlbFF1ZXJ5fSwgYmVzdC1maXJzdC5cbiAqXG4gKiBDYW5kaWRhdGVzIGFyZSB0aGUgY2xhc3NpZmllZCBlbmRwb2ludHMgaW4gdGhlIGVsaWdpYmxlIGNsYXNzZXM6XG4gKiB7QGxpbmsgY2xhc3Nlc0F0T3JCZWxvd30gdGhlIHJlcXVlc3RlZCBgbW9kZWxDbGFzc2AsIG9yIC0gd2hlbiBub25lIGlzIGdpdmVuXG4gKiAtIHRoZSBjaGF0IGJhbmRzIG9ubHkgKHtAbGluayBDSEFUX0NMQVNTX09SREVSfSksIHNvIGEgZ2VuZXJhbCBhc2sgbmV2ZXJcbiAqIHN1cmZhY2VzIGFuIGVtYmVkZGluZyBlbmRwb2ludC4gRWFjaCBjbGFzcyBidWNrZXQgaXMgYWxyZWFkeSBiZXN0LWZpcnN0IGZyb21cbiAqIHtAbGluayBjbGFzc2lmeS5jbGFzc2lmeUVuZHBvaW50c30uIFJhbmtpbmcgaXMgKiptYXRjaCB0aGVuIGNsYXNzKio6XG4gKlxuICogMS4gV2l0aCBhIGBzZWFyY2hgLCBvbmx5IGVuZHBvaW50cyBtYXRjaGluZyBpdCBzdXJ2aXZlLCBvcmRlcmVkIGJ5IG1hdGNoXG4gKiAgICBkaXN0YW5jZSAoYnVja2V0ZWQgdmlhIHtAbGluayBtYXRjaEJ1Y2tldH0gc28gbmVhci1pZGVudGljYWwgc2NvcmVzIHRpZSksXG4gKiAgICB0aGVuIGJ5IGNsYXNzIChtb3JlIGNhcGFibGUgZmlyc3QpLCB0aGVuIGJ5IHRoZSBzdGFibGUgd2l0aGluLWNsYXNzIHJhbmsuXG4gKiAyLiBXaXRob3V0IGEgYHNlYXJjaGAsIHRoZSBjbGFzcy10aGVuLXJhbmsgY2FuZGlkYXRlIG9yZGVyIHN0YW5kcy5cbiAqXG4gKiBBIGBsaW1pdGAgdHJ1bmNhdGVzIHRoZSByZXN1bHQuIFJldHVybnMgYFtdYCB3aGVuIG5vdGhpbmcgaXMgZWxpZ2libGUgb3JcbiAqIG1hdGNoZXMgLSBjYWxsZXJzIGxheWVyIHRoZWlyIG93biBmYWxsYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cE1vZGVscyhcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIHF1ZXJ5OiBNb2RlbFF1ZXJ5ID0ge30sXG4pOiBSYW5rZWRNb2RlbFtdIHtcbiAgY29uc3QgY2xhc3NpZmllZCA9IGNsYXNzaWZ5LmNsYXNzaWZ5RW5kcG9pbnRzKGVuZHBvaW50cyk7XG4gIGNvbnN0IGVsaWdpYmxlID1cbiAgICBxdWVyeS5tb2RlbENsYXNzICE9PSB1bmRlZmluZWQgPyBjbGFzc2VzQXRPckJlbG93KHF1ZXJ5Lm1vZGVsQ2xhc3MpIDogQ0hBVF9DTEFTU19PUkRFUjtcblxuICAvLyBGbGF0dGVuIGVsaWdpYmxlIGNsYXNzZXMgaW4gY2FwYWJpbGl0eSBvcmRlciwgY2FycnlpbmcgZWFjaCBlbmRwb2ludCdzXG4gIC8vIGNsYXNzOyBidWNrZXQgb3JkZXIgaXMgYWxyZWFkeSBiZXN0LWZpcnN0LlxuICBjb25zdCBjYW5kaWRhdGVzOiBSYW5rZWRNb2RlbFtdID0gW107XG4gIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiBlbGlnaWJsZSkge1xuICAgIGZvciAoY29uc3QgZW5kcG9pbnQgb2YgY2xhc3NpZmllZFttb2RlbENsYXNzXSkge1xuICAgICAgaWYgKHF1ZXJ5LnJlcXVpcmVzVG9vbHMgJiYgIWNsYXNzaWZ5LmVuZHBvaW50Q2FwYWJpbGl0aWVzKGVuZHBvaW50KS50b29scykgY29udGludWU7XG4gICAgICBjYW5kaWRhdGVzLnB1c2goeyBlbmRwb2ludCwgbW9kZWxDbGFzcyB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzZWFyY2ggPSBxdWVyeS5zZWFyY2g/LnRyaW0oKTtcbiAgbGV0IHJhbmtlZDogUmFua2VkTW9kZWxbXTtcbiAgaWYgKHNlYXJjaCkge1xuICAgIGNvbnN0IGdwdEZhbWlseVNlYXJjaCA9IHNlYXJjaC50b0xvd2VyQ2FzZSgpID09PSBcImdwdFwiO1xuICAgIGNvbnN0IHZlcnNpb25lZEZhbWlseVNlYXJjaCA9IFZFUlNJT05FRF9GQU1JTFlfU0VBUkNIRVMuaGFzKHNlYXJjaC50b0xvd2VyQ2FzZSgpKTtcbiAgICBjb25zdCBzY29yZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2Ygc2VhcmNoU2VydmluZ0VuZHBvaW50cyhcbiAgICAgIHNlYXJjaCxcbiAgICAgIGNhbmRpZGF0ZXMubWFwKChjKSA9PiBjLmVuZHBvaW50KSxcbiAgICAgIHF1ZXJ5LnRocmVzaG9sZCAhPT0gdW5kZWZpbmVkID8geyB0aHJlc2hvbGQ6IHF1ZXJ5LnRocmVzaG9sZCB9IDoge30sXG4gICAgKSkge1xuICAgICAgc2NvcmVzLnNldChtYXRjaC5lbmRwb2ludC5uYW1lLCBtYXRjaC5zY29yZSk7XG4gICAgfVxuICAgIC8vIGBBcnJheS5wcm90b3R5cGUuc29ydGAgaXMgc3RhYmxlLCBzbyBlbmRwb2ludHMgZXF1YWwgb24gbWF0Y2ggYW5kIGNsYXNzXG4gICAgLy8ga2VlcCB0aGVpciBiZXN0LWZpcnN0IHdpdGhpbi1jbGFzcyBvcmRlci5cbiAgICByYW5rZWQgPSBjYW5kaWRhdGVzXG4gICAgICAuZmlsdGVyKChjKSA9PiBzY29yZXMuaGFzKGMuZW5kcG9pbnQubmFtZSkpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoYykgPT4gIWdwdEZhbWlseVNlYXJjaCB8fCAhLyg/Ol58Wy1fLl0pZ3B0Wy1fLl0/b3NzKD86Wy1fLl18JCkvaS50ZXN0KGMuZW5kcG9pbnQubmFtZSksXG4gICAgICApXG4gICAgICAubWFwKChjKSA9PiAoeyAuLi5jLCBzY29yZTogc2NvcmVzLmdldChjLmVuZHBvaW50Lm5hbWUpIH0pKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYnlNYXRjaCA9IG1hdGNoQnVja2V0KGEuc2NvcmUpIC0gbWF0Y2hCdWNrZXQoYi5zY29yZSk7XG4gICAgICAgIGlmIChieU1hdGNoICE9PSAwKSByZXR1cm4gYnlNYXRjaDtcbiAgICAgICAgaWYgKHZlcnNpb25lZEZhbWlseVNlYXJjaCkge1xuICAgICAgICAgIGNvbnN0IGFWZXJzaW9uID0gY2xhc3NpZnkudmVyc2lvblR1cGxlKGEuZW5kcG9pbnQubmFtZSk7XG4gICAgICAgICAgY29uc3QgYlZlcnNpb24gPSBjbGFzc2lmeS52ZXJzaW9uVHVwbGUoYi5lbmRwb2ludC5uYW1lKTtcbiAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMzsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgYnlWZXJzaW9uID0gKGJWZXJzaW9uW2luZGV4XSA/PyAwKSAtIChhVmVyc2lvbltpbmRleF0gPz8gMCk7XG4gICAgICAgICAgICBpZiAoYnlWZXJzaW9uICE9PSAwKSByZXR1cm4gYnlWZXJzaW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihhLm1vZGVsQ2xhc3MpIC0gTU9ERUxfQ0xBU1NfT1JERVIuaW5kZXhPZihiLm1vZGVsQ2xhc3MpO1xuICAgICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmFua2VkID0gY2FuZGlkYXRlcztcbiAgfVxuXG4gIHJldHVybiBxdWVyeS5saW1pdCAhPT0gdW5kZWZpbmVkID8gcmFua2VkLnNsaWNlKDAsIE1hdGgubWF4KDAsIHF1ZXJ5LmxpbWl0KSkgOiByYW5rZWQ7XG59XG5cbi8qKlxuICogQ29sbGFwc2Uge0BsaW5rIGxvb2t1cE1vZGVsc30gdG8gYSBzaW5nbGUgaWQ6IHRoZSBjbG9zZXN0IGVuZHBvaW50IHRvIGBzZWFyY2hgXG4gKiBpbiBhIGNhdGFsb2d1ZSBzbmFwc2hvdCwgb3IgdGhlIGlucHV0IHZlcmJhdGltIHdoZW4gbm90aGluZyBzY29yZXMgd2l0aGluIHRoZVxuICogdGhyZXNob2xkLlxuICpcbiAqIFRoZSByYW5rLWJhc2VkIGNvdW50ZXJwYXJ0IHRvIHRoZSBGdXNlLW9ubHkge0BsaW5rIHJlc29sdmVNb2RlbElkfTogZXF1YWxcbiAqIG1hdGNoIHNjb3JlcyBhcmUgYnJva2VuIGJ5IGNsYXNzIGFuZCB0aGVuIHdpdGhpbi1jbGFzcyB2ZXJzaW9uLCBzbyBhIGxvb3NlXG4gKiBgXCJvcHVzXCJgIHByZWZlcnMgYG9wdXMtNWAgb3ZlciBgb3B1cy00LTdgIGluc3RlYWQgb2YgcGlja2luZyB3aGljaGV2ZXJcbiAqIHNpYmxpbmcgRnVzZSBoYXBwZW5lZCB0byBvcmRlciBmaXJzdC4gUmV0dXJuaW5nIHRoZSBpbnB1dCB1bm1hdGNoZWQgKHJhdGhlclxuICogdGhhbiBhIG5lYXIgbmVpZ2hib3VyKSBpcyBkZWxpYmVyYXRlIC0gYSBkZWxpYmVyYXRlIGVuZHBvaW50IGlkIGlzIG5ldmVyXG4gKiBzaWxlbnRseSByZXdyaXR0ZW4sIGFuZCBEYXRhYnJpY2tzIHN1cmZhY2VzIGEgY2xlYW4gNDA0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFua01vZGVsSWQoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBzZWFyY2g6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbCB7XG4gIGNvbnN0IFt0b3BdID0gbG9va3VwTW9kZWxzKGVuZHBvaW50cywge1xuICAgIHNlYXJjaCxcbiAgICBsaW1pdDogMSxcbiAgICAuLi4ob3B0aW9ucy50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZXNob2xkOiBvcHRpb25zLnRocmVzaG9sZCB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLnJlcXVpcmVzVG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgcmVxdWlyZXNUb29sczogb3B0aW9ucy5yZXF1aXJlc1Rvb2xzIH0gOiB7fSksXG4gIH0pO1xuICBpZiAoIXRvcCkgcmV0dXJuIHsgbW9kZWxJZDogc2VhcmNoLCBtYXRjaGVkOiBmYWxzZSB9O1xuICByZXR1cm4geyBtb2RlbElkOiB0b3AuZW5kcG9pbnQubmFtZSwgbWF0Y2hlZDogdHJ1ZSwgc2NvcmU6IHRvcC5zY29yZSB9O1xufVxuXG4vKipcbiAqIHtAbGluayByYW5rTW9kZWxJZH0gYWdhaW5zdCBhIGNhdGFsb2d1ZSB0aGUgY2FsbGVyIG1heSBiZSBob2xkaW5nIHN0YWxlOlxuICogbWF0Y2ggdGhlIGxvYWRlZCBzbmFwc2hvdCwgYW5kIG9uIGEgbWlzcyByZWxvYWQgb25jZSB3aXRoIGBmb3JjZWAgYW5kIG1hdGNoXG4gKiBhZ2Fpbi4gVGhhdCB3YXkgYSBtb2RlbCBkZXBsb3llZCBhZnRlciB0aGUgY2F0YWxvZ3VlIHdhcyBjYWNoZWQgc3RpbGxcbiAqIHJlc29sdmVzIG9uIGZpcnN0IHVzZSwgd2l0aG91dCBhIHJlc3RhcnQgYW5kIHdpdGhvdXQgZ2l2aW5nIHVwIGNhY2hpbmcuXG4gKlxuICogVGhlIGNhdGFsb2d1ZSBhcnJpdmVzIGFzIGEgbG9hZGVyIHJhdGhlciB0aGFuIGEgY2xpZW50IHNvIHRoZSBjYWxsZXIga2VlcHNcbiAqIG93bmVyc2hpcCBvZiAqaG93KiBpdCBpcyBjYWNoZWQgLSB7QGxpbmsgbGlzdFNlcnZpbmdFbmRwb2ludHN9IGFuZCBpdHNcbiAqIGBDYWNoZU1hbmFnZXJgLCBhIHBsYWluIHByb2Nlc3MtbGlmZXRpbWUgZmllbGQgaW4gYSBDTEksIG9yIGEgdGVzdCBkb3VibGUuXG4gKiBPbmx5IG9uZSByZWxvYWQgaXMgYXR0ZW1wdGVkOiBhIGdlbnVpbmVseSB1bmtub3duIG5hbWUgc2hvdWxkIGZhaWwgZmFzdFxuICogcmF0aGVyIHRoYW4gcmUtbGlzdCBvbiBldmVyeSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBsb2FkIC0gUmV0dXJucyB0aGUgY2F0YWxvZ3VlOyBgZm9yY2VgIGFza3MgaXQgdG8gYnlwYXNzIGl0cyBjYWNoZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJhbmtNb2RlbElkTGl2ZShcbiAgbG9hZDogKGZvcmNlOiBib29sZWFuKSA9PiBQcm9taXNlPHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4sXG4gIHNlYXJjaDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFJlc29sdmVkTW9kZWw+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByYW5rTW9kZWxJZChhd2FpdCBsb2FkKGZhbHNlKSwgc2VhcmNoLCBvcHRpb25zKTtcbiAgaWYgKHJlc29sdmVkLm1hdGNoZWQpIHJldHVybiByZXNvbHZlZDtcbiAgcmV0dXJuIHJhbmtNb2RlbElkKGF3YWl0IGxvYWQodHJ1ZSksIHNlYXJjaCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmFuayBhIHdvcmtzcGFjZSdzIGNhdGFsb2d1ZSBpbiBvbmUgY2FsbDogbGlzdCBpdHMgYC9zZXJ2aW5nLWVuZHBvaW50c2BcbiAqIChjYWNoZWQpIGFuZCBydW4ge0BsaW5rIGxvb2t1cE1vZGVsc30gb3ZlciB0aGUgcmVzdWx0LiBUaGUgbGlzdCBjb3VudGVycGFydCB0b1xuICoge0BsaW5rIHNlbGVjdE1vZGVsfSwgZm9yIGEgY29uc3VtZXIgdGhhdCB3YW50cyB0aGUgZnVsbCByYW5rZWQgc2V0IChhIG1vZGVsXG4gKiBwaWNrZXIsIGEgQ0xJKSByYXRoZXIgdGhhbiBhIHNpbmdsZSBpZC4gQ2F0YWxvZ3VlIGZldGNoZXMgZmFpbCBsb3VkOiBuZXR3b3JrXG4gKiAvIGF1dGggZXJyb3JzIHByb3BhZ2F0ZSBzbyB0aGUgY2FsbGVyIHNlZXMgdGhlIHJlYWwgU0RLIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIGhvc3QgLSBXb3Jrc3BhY2UgaG9zdCB1c2VkIGFzIHRoZSBjYWNoZSBrZXkuIFBhc3MgdGhlIHZhbHVlIHJlc29sdmVkXG4gKiAgIGZyb20gYGNsaWVudC5jb25maWcuZ2V0SG9zdCgpYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlYXJjaE1vZGVscyhcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBob3N0OiBzdHJpbmcsXG4gIGlucHV0OiBTZWFyY2hNb2RlbHNJbnB1dCA9IHt9LFxuKTogUHJvbWlzZTxSYW5rZWRNb2RlbFtdPiB7XG4gIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGxpc3RTZXJ2aW5nRW5kcG9pbnRzKFxuICAgIGNsaWVudCxcbiAgICBob3N0LFxuICAgIGlucHV0LnR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bE1zOiBpbnB1dC50dGxNcyB9IDoge30sXG4gICk7XG4gIHJldHVybiBsb29rdXBNb2RlbHMoZW5kcG9pbnRzLCBpbnB1dCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIG1vZGVsIGlkIGZvciBhIHdvcmtzcGFjZSBpbiBvbmUgY2FsbDogbGlzdCBpdHMgYC9zZXJ2aW5nLWVuZHBvaW50c2BcbiAqIChjYWNoZWQpIGFuZCBydW4ge0BsaW5rIHJlc29sdmVNb2RlbH0gb3ZlciB0aGUgcmVzdWx0LiBUaGlzIGlzIHRoZSBlbnRyeVxuICogcG9pbnQgZm9yIGFueSBjb25zdW1lciB0aGF0IGhvbGRzIGEgYFdvcmtzcGFjZUNsaWVudGAgYW5kIGp1c3Qgd2FudHMgYSB1c2FibGVcbiAqIG1vZGVsIG5hbWUgLSBhIExha2VmbG93IGpvYiwgYSBvbmUtb2ZmIHNjcmlwdCwgb3IgdGhlIE1hc3RyYSBwbHVnaW4gYWxpa2UuXG4gKlxuICogQ2hlYXAgZXhpdDogd2hlbiBhbiBgZXhwbGljaXRgIG5hbWUgaXMgZ2l2ZW4sIGBmdXp6eWAgaXMgb2ZmLCBhbmQgdG9vbFxuICogY2FwYWJpbGl0eSBpcyBub3QgcmVxdWlyZWQsIHRoZSBjYXRhbG9ndWUgaXMgbmV2ZXIgZmV0Y2hlZC4gQ2F0YWxvZ3VlXG4gKiBmZXRjaGVzIG90aGVyd2lzZSBmYWlsIGxvdWQ6IG5ldHdvcmsgLyBhdXRoIGVycm9ycyBwcm9wYWdhdGUgc28gdGhlIGNhbGxlclxuICogc2VlcyB0aGUgcmVhbCBTREsgbWVzc2FnZSBpbnN0ZWFkIG9mIGEgc2lsZW50IGZhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSBob3N0IC0gV29ya3NwYWNlIGhvc3QgdXNlZCBhcyB0aGUgY2FjaGUga2V5LiBQYXNzIHRoZSB2YWx1ZSByZXNvbHZlZFxuICogICBmcm9tIGBjbGllbnQuY29uZmlnLmdldEhvc3QoKWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWxlY3RNb2RlbChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlLFxuICBob3N0OiBzdHJpbmcsXG4gIGlucHV0OiBTZWxlY3RNb2RlbElucHV0ID0ge30sXG4pOiBQcm9taXNlPFJlc29sdmVkTW9kZWxTZWxlY3Rpb24+IHtcbiAgaWYgKGlucHV0LmV4cGxpY2l0ICE9PSB1bmRlZmluZWQgJiYgaW5wdXQuZnV6enkgPT09IGZhbHNlICYmICFpbnB1dC5yZXF1aXJlc1Rvb2xzKSB7XG4gICAgcmV0dXJuIHsgbW9kZWxJZDogaW5wdXQuZXhwbGljaXQsIHNvdXJjZTogXCJleHBsaWNpdFwiIH07XG4gIH1cbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdFNlcnZpbmdFbmRwb2ludHMoY2xpZW50LCBob3N0LCB7XG4gICAgLi4uKGlucHV0LnR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bE1zOiBpbnB1dC50dGxNcyB9IDoge30pLFxuICB9KTtcbiAgcmV0dXJuIHJlc29sdmVNb2RlbChlbmRwb2ludHMsIGlucHV0KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgc2luZ2xlIG1vZGVsIGlkIGZyb20gdGhlIGxpdmUgY2F0YWxvZ3VlIGFuZCBjYWxsZXIgaW50ZW50LFxuICogZGVsZWdhdGluZyB0aGUgbGl2ZSBzZWxlY3Rpb24gdG8ge0BsaW5rIGxvb2t1cE1vZGVsc30gd2l0aCBgbGltaXQ6IDFgLlxuICpcbiAqIDEuICoqRXhwbGljaXQgYXNrKio6IHdpdGggYGZ1enp5YCBvZmYsIHJldHVybmVkIHZlcmJhdGltOyBvdGhlcndpc2VcbiAqICAgIGZ1enp5LXJhbmtlZCB3aXRoaW4gdGhlIChvcHRpb25hbCkgY2xhc3MgY2VpbGluZyBhbmQgdGhlIGJlc3QgdGFrZW4sXG4gKiAgICBmYWxsaW5nIGJhY2sgdG8gdGhlIGlucHV0IHZlcmJhdGltIHdoZW4gbm90aGluZyBtYXRjaGVzLlxuICogMi4gKipObyBleHBsaWNpdCBhc2sqKjogYW4gb3BlcmF0b3ItcGlubmVkIGBmYWxsYmFja2AgdGhhdCBleGlzdHMgaW4gdGhlIGxpdmVcbiAqICAgIGNhdGFsb2d1ZSB3aW5zIGZpcnN0OyB0aGVuIHRoZSByYW5rZWQgbGl2ZSBjYXRhbG9ndWUgKGNsYXNzIGNlaWxpbmdcbiAqICAgIGFwcGxpZWQpOyB0aGVuIHRoZSBzdGF0aWMge0BsaW5rIEZBTExCQUNLX01PREVMX0lEU30gZmxvb3Igd2hlbiB0aGVcbiAqICAgIGNhdGFsb2d1ZSB5aWVsZHMgbm90aGluZyBpbiByYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNb2RlbChcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIGlucHV0OiBSZXNvbHZlTW9kZWxJbnB1dCA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbiB7XG4gIGlmIChpbnB1dC5leHBsaWNpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGlucHV0LmZ1enp5ID09PSBmYWxzZSkge1xuICAgICAgaWYgKGlucHV0LnJlcXVpcmVzVG9vbHMpIGFzc2VydFRvb2xTdXBwb3J0KGVuZHBvaW50cywgaW5wdXQuZXhwbGljaXQpO1xuICAgICAgcmV0dXJuIHsgbW9kZWxJZDogaW5wdXQuZXhwbGljaXQsIHNvdXJjZTogXCJleHBsaWNpdFwiIH07XG4gICAgfVxuICAgIGNvbnN0IFt0b3BdID0gbG9va3VwTW9kZWxzKGVuZHBvaW50cywgYnVpbGRRdWVyeShpbnB1dCwgaW5wdXQuZXhwbGljaXQpKTtcbiAgICBpZiAoaW5wdXQucmVxdWlyZXNUb29scyAmJiAhdG9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRvb2wtY2FwYWJsZSBtb2RlbCBtYXRjaGVzIFwiJHtpbnB1dC5leHBsaWNpdH1cImApO1xuICAgIH1cbiAgICByZXR1cm4geyBtb2RlbElkOiB0b3A/LmVuZHBvaW50Lm5hbWUgPz8gaW5wdXQuZXhwbGljaXQsIHNvdXJjZTogXCJmdXp6eS1tYXRjaFwiIH07XG4gIH1cblxuICAvLyBPcGVyYXRvci1waW5uZWQgZmFsbGJhY2tzIHdpbiB3aGVuIHByZXNlbnQgYW5kIGxpdmUgKGUuZy4gYSByZWd1bGF0ZWRcbiAgLy8gd29ya3NwYWNlIHJlc3RyaWN0ZWQgdG8gYW4gYXBwcm92ZWQgc3Vic2V0KS5cbiAgaWYgKGlucHV0Lm1vZGVsQ2xhc3MgPT09IHVuZGVmaW5lZCAmJiBpbnB1dC5mYWxsYmFja3MgJiYgaW5wdXQuZmFsbGJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBwcmVzZW50ID0gbmV3IFNldChcbiAgICAgIGVuZHBvaW50c1xuICAgICAgICAuZmlsdGVyKChlbmRwb2ludCkgPT4gIWlucHV0LnJlcXVpcmVzVG9vbHMgfHwgY2xhc3NpZnkuZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLnRvb2xzKVxuICAgICAgICAubWFwKChlbmRwb2ludCkgPT4gZW5kcG9pbnQubmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBwaW5uZWQgPSBpbnB1dC5mYWxsYmFja3MuZmluZCgoaWQpID0+IHByZXNlbnQuaGFzKGlkKSk7XG4gICAgaWYgKHBpbm5lZCkgcmV0dXJuIHsgbW9kZWxJZDogcGlubmVkLCBzb3VyY2U6IFwiZmFsbGJhY2tcIiB9O1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gaW5wdXQubW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkID8gXCJjbGFzc1wiIDogXCJmYWxsYmFja1wiO1xuICBjb25zdCBbdG9wXSA9IGxvb2t1cE1vZGVscyhlbmRwb2ludHMsIGJ1aWxkUXVlcnkoaW5wdXQsIHVuZGVmaW5lZCkpO1xuICBpZiAodG9wKSByZXR1cm4geyBtb2RlbElkOiB0b3AuZW5kcG9pbnQubmFtZSwgc291cmNlIH07XG5cbiAgLy8gTGl2ZSBjYXRhbG9ndWUgeWllbGRlZCBub3RoaW5nIGluIHJhbmdlOiB3YWxrIHRoZSBzdGF0aWMgZmxvb3IuXG4gIGNvbnN0IGZsb29yU291cmNlID1cbiAgICBpbnB1dC5tb2RlbENsYXNzICE9PSB1bmRlZmluZWQgPyBtb2RlbHNGb3JDbGFzcyhpbnB1dC5tb2RlbENsYXNzKSA6IChpbnB1dC5mYWxsYmFja3MgPz8gW10pO1xuICBjb25zdCBmbG9vciA9IG9iamVjdC5zZXF1ZW5jZShmbG9vclNvdXJjZSkuY29uY2F0KEZBTExCQUNLX01PREVMX0lEUykuZGlzdGluY3QoKS50b0FycmF5KCk7XG4gIGlmIChpbnB1dC5yZXF1aXJlc1Rvb2xzKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gbmV3IFNldChcbiAgICAgIGVuZHBvaW50c1xuICAgICAgICAuZmlsdGVyKChlbmRwb2ludCkgPT4gY2xhc3NpZnkuZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLnRvb2xzKVxuICAgICAgICAubWFwKChlbmRwb2ludCkgPT4gZW5kcG9pbnQubmFtZSksXG4gICAgKTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGZsb29yLmZpbmQoKGlkKSA9PiBhdmFpbGFibGUuaGFzKGlkKSk7XG4gICAgaWYgKCFzZWxlY3RlZCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gdG9vbC1jYXBhYmxlIG1vZGVsIGlzIGF2YWlsYWJsZVwiKTtcbiAgICByZXR1cm4geyBtb2RlbElkOiBzZWxlY3RlZCwgc291cmNlIH07XG4gIH1cbiAgcmV0dXJuIHsgbW9kZWxJZDogcGlja0ZpcnN0QXZhaWxhYmxlKGZsb29yLCBlbmRwb2ludHMpLCBzb3VyY2UgfTtcbn1cblxuLyoqIEJ1aWxkIGEge0BsaW5rIE1vZGVsUXVlcnl9IGZyb20ge0BsaW5rIFJlc29sdmVNb2RlbElucHV0fSBmb3IgdGhlIGBsaW1pdDogMWAgZGVsZWdhdGlvbi4gKi9cbmZ1bmN0aW9uIGJ1aWxkUXVlcnkoaW5wdXQ6IFJlc29sdmVNb2RlbElucHV0LCBzZWFyY2g6IHN0cmluZyB8IHVuZGVmaW5lZCk6IE1vZGVsUXVlcnkge1xuICByZXR1cm4ge1xuICAgIC4uLihzZWFyY2ggIT09IHVuZGVmaW5lZCA/IHsgc2VhcmNoIH0gOiB7fSksXG4gICAgLi4uKGlucHV0Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IHsgbW9kZWxDbGFzczogaW5wdXQubW9kZWxDbGFzcyB9IDoge30pLFxuICAgIC4uLihpbnB1dC5yZXF1aXJlc1Rvb2xzICE9PSB1bmRlZmluZWQgPyB7IHJlcXVpcmVzVG9vbHM6IGlucHV0LnJlcXVpcmVzVG9vbHMgfSA6IHt9KSxcbiAgICAuLi4oaW5wdXQudGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB7IHRocmVzaG9sZDogaW5wdXQudGhyZXNob2xkIH0gOiB7fSksXG4gICAgbGltaXQ6IDEsXG4gIH07XG59XG5cbi8qKiBUaHJvdyB3aGVuIGFuIGV4cGxpY2l0IGlkIGlzIGFic2VudCBvciBub3QgdmVyaWZpZWQgZm9yIGZ1bmN0aW9uIHRvb2xzLiAqL1xuZnVuY3Rpb24gYXNzZXJ0VG9vbFN1cHBvcnQoZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sIG1vZGVsSWQ6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBlbmRwb2ludCA9IGVuZHBvaW50cy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09PSBtb2RlbElkKTtcbiAgaWYgKCFlbmRwb2ludCB8fCAhY2xhc3NpZnkuZW5kcG9pbnRDYXBhYmlsaXRpZXMoZW5kcG9pbnQpLnRvb2xzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBcIiR7bW9kZWxJZH1cIiBkb2VzIG5vdCBzdXBwb3J0IGZ1bmN0aW9uIHRvb2xzYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBmaXJzdCBpZCBpbiBgY2FuZGlkYXRlc2Agd2hvc2UgZW5kcG9pbnQgaXMgcHJlc2VudCBpbiBgZW5kcG9pbnRzYC5cbiAqIFJldHVybnMgdGhlIHRvcCBjYW5kaWRhdGUgd2hlbiB0aGUgd29ya3NwYWNlIGhhcyBub25lIG9mIHRoZW0gc28gY2FsbGVyc1xuICogYWx3YXlzIGdldCBhIHN0cmluZzsgYW4gb2ZmbGluZSB3b3Jrc3BhY2UgdGhlbiByZWNlaXZlcyBhIGNsZWFuIDQwNCBmcm9tXG4gKiBEYXRhYnJpY2tzIGluc3RlYWQgb2YgYSBtYWxmb3JtZWQgY29uZmlnLlxuICovXG5mdW5jdGlvbiBwaWNrRmlyc3RBdmFpbGFibGUoXG4gIGNhbmRpZGF0ZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHByZXNlbnQgPSBuZXcgU2V0KGVuZHBvaW50cy5tYXAoKGUpID0+IGUubmFtZSkpO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHByZXNlbnQuaGFzKGNhbmRpZGF0ZSkpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gRkFMTEJBQ0tfTU9ERUxfSURTWzBdITtcbn1cbiJdfQ==
|
package/lib/src/serving.d.ts
CHANGED
|
@@ -119,7 +119,7 @@ export interface ScoredEndpoint {
|
|
|
119
119
|
* Returns `[]` for an empty endpoint list or when `input` tokenizes to nothing,
|
|
120
120
|
* so callers fall back to the raw input and let Databricks surface a clean 404.
|
|
121
121
|
* This multi-result core is shared by {@link resolveModelId} (single best) and
|
|
122
|
-
* the ranked `
|
|
122
|
+
* the ranked `lookupModels` selector.
|
|
123
123
|
*/
|
|
124
124
|
export declare function searchServingEndpoints(input: string, endpoints: readonly ServingEndpointSummary[], options?: ResolveModelOptions): ScoredEndpoint[];
|
|
125
125
|
/**
|
package/lib/src/serving.js
CHANGED
|
@@ -241,7 +241,7 @@ export async function clearServingEndpointsCache(host) {
|
|
|
241
241
|
* Returns `[]` for an empty endpoint list or when `input` tokenizes to nothing,
|
|
242
242
|
* so callers fall back to the raw input and let Databricks surface a clean 404.
|
|
243
243
|
* This multi-result core is shared by {@link resolveModelId} (single best) and
|
|
244
|
-
* the ranked `
|
|
244
|
+
* the ranked `lookupModels` selector.
|
|
245
245
|
*/
|
|
246
246
|
export function searchServingEndpoints(input, endpoints, options = {}) {
|
|
247
247
|
if (endpoints.length === 0)
|
|
@@ -284,4 +284,4 @@ export function resolveModelId(input, endpoints, options = {}) {
|
|
|
284
284
|
}
|
|
285
285
|
return { modelId: input, matched: false };
|
|
286
286
|
}
|
|
287
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUNMLFFBQVEsRUFDUixPQUFPLEVBQ1AsS0FBSyxHQUdOLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRTNCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVqRCxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBRTdCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFTM0MsMEdBQTBHO0FBQzFHLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXhELDZFQUE2RTtBQUM3RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFM0MsZ0VBQWdFO0FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7QUFFaEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQVd2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLE1BQTJCLEVBQzNCLElBQVksRUFDWixVQUF1QyxFQUFFO0lBRXpDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJ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S0FBSztLQUN2QixDQUFDLENBQUM7SUFDSCxPQUFPLElBQUk7U0FDUixNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO1NBQzFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsS0FBYSxFQUNiLFNBQTRDLEVBQzVDLFVBQStCLEVBQUU7SUFFakMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLHNCQUFzQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNULE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGl2ZSBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgY2F0YWxvZ3VlIGFjY2Vzcy5cbiAqXG4gKiBMaXN0cyB0aGUgd29ya3NwYWNlJ3MgYC9zZXJ2aW5nLWVuZHBvaW50c2Agb25jZSBwZXIgaG9zdCBhbmQgY2FjaGVzIHRoZVxuICogcmVzdWx0IHdpdGggYSBUVEwgdmlhIEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgLCB3aXRoIGNvbmN1cnJlbnQgY2FsbGVyc1xuICogc2hhcmluZyBvbmUgaW4tZmxpZ2h0IHByb21pc2UgKHRoZSBjb2FsZXNjaW5nIHBhdHRlcm4gb2YgUHl0aG9uJ3NcbiAqIGBjYWNoZXRvb2xzLWFzeW5jYCkuIFN1cmZhY2VzIGVhY2ggZW5kcG9pbnQgYXMgYSBzdGFibGVcbiAqIHtAbGluayBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5fSAtIGluY2x1ZGluZyB0aGUgRm91bmRhdGlvbiBNb2RlbCBBUElcbiAqIGBxdWFsaXR5YCAvIGBzcGVlZGAgLyBgY29zdGAgcHJvZmlsZSB3aGVuIHByZXNlbnQsIHRoZSBjbGFzc2lmaWVkXG4gKiB7QGxpbmsgTW9kZWxDbGFzc30sIGFuZCAoZm9yIGVtYmVkZGluZyBlbmRwb2ludHMpIHRoZSBtZWFzdXJlZCB2ZWN0b3JcbiAqIGBkaW1lbnNpb25gIC0gYW5kIHNuYXBzIGxvb3NlLCBodW1hbi10eXBlZCBuYW1lcyB0byByZWFsIGVuZHBvaW50IGlkc1xuICogdGhyb3VnaCBgZnVzZS5qc2AgZXh0ZW5kZWQgc2VhcmNoIHNvIHRva2VucyBsaWtlIGBcImNsYXVkZSBzb25uZXRcImAgcmVzb2x2ZSB0b1xuICogYGRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZgLlxuICpcbiAqIFRoZSBjbGFzcyBzdGFtcCBhbmQgZW1iZWRkaW5nIGRpbWVuc2lvbiBhcmUgY29tcHV0ZWQgb25jZSBwZXIgY2FjaGUgbG9hZDpcbiAqIGV2ZXJ5IGVtYmVkZGluZyBlbmRwb2ludCBpcyBcInBpbmdlZFwiIGluIHBhcmFsbGVsIGFuZCB0aGUgcmVzdWx0aW5nIHZlY3RvclxuICogbGVuZ3RoIHJlY29yZGVkLCBzbyB0aGUgY29zdCBpcyBwYWlkIG9uIGEgY2FjaGUgbWlzcywgbm90IHBlciByZWFkLiBUaGUgcGluZ1xuICogaXMgYmVzdC1lZmZvcnQgLSBhIGZhaWx1cmUgbG9ncyBhdCBkZWJ1ZyBhbmQgbGVhdmVzIGBkaW1lbnNpb25gIHVuc2V0IHJhdGhlclxuICogdGhhbiBmYWlsaW5nIHRoZSB3aG9sZSBsaXN0aW5nLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBDYWNoZU1hbmFnZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yLCBsb2csIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBjbGFzc2lmeSxcbiAgZGlzcGxheSxcbiAgbW9kZWwsXG4gIHR5cGUgTW9kZWxQcm9maWxlLFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW1wb3J0IHsgTU9ERUxfQ0xBU1NfT1JERVIgfSBmcm9tIFwiLi9jbGFzc2VzLnRzXCI7XG5cbmNvbnN0IHsgTW9kZWxDbGFzcyB9ID0gbW9kZWw7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtb2RlbC9zZXJ2aW5nXCIpO1xuXG4vKipcbiAqIFN0cnVjdHVyYWwgdHlwZSBmb3IgdGhlIERhdGFicmlja3Mgd29ya3NwYWNlIGNsaWVudCwgcmUtZXhwb3J0ZWQgc28gdGhlIHJlc3RcbiAqIG9mIHRoaXMgcGFja2FnZSBjYW4ga2VlcCBpbXBvcnRpbmcgaXQgZnJvbSBoZXJlLiBTZWVcbiAqIGBhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZWAgKG5vZGUtYXBwa2l0KSBmb3IgdGhlIGNhbm9uaWNhbCBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gUGljazxhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZSwgXCJzZXJ2aW5nRW5kcG9pbnRzXCI+O1xuXG4vKiogRGVmYXVsdCBUVEwgZm9yIHRoZSBpbi1tZW1vcnkgZW5kcG9pbnQgY2FjaGUuIE1hdGNoZXMgdGhlIERhdGFicmlja3MgU0RLJ3Mgc2Vzc2lvbiBsaWZldGltZSBidWRnZXQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RFTF9DQUNIRV9UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG4vKiogRGVmYXVsdCBGdXNlLmpzIHNjb3JlIHRocmVzaG9sZCBiZWxvdyB3aGljaCBhIGZ1enp5IG1hdGNoIGlzIGFjY2VwdGVkLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRlVaWllfVEhSRVNIT0xEID0gMC40O1xuXG4vKiogQ2FjaGUga2V5IHBhcnRzIHVuZGVyIHdoaWNoIGVuZHBvaW50IGxpc3RpbmdzIGFyZSBzdG9yZWQuICovXG5jb25zdCBDQUNIRV9LRVlfTkFNRVNQQUNFID0gXCJzZXJ2aW5nLWVuZHBvaW50c1wiO1xuXG4vKipcbiAqIFN0YWJsZSBgdXNlcktleWAgYXJnIGZvciBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyLmdldE9yRXhlY3V0ZWAuIEVuZHBvaW50XG4gKiB2aXNpYmlsaXR5IGlzIGVmZmVjdGl2ZWx5IHdvcmtzcGFjZS1zY29wZWQgKHdlIGNhY2hlIGJ5IGhvc3QgaW4gdGhlIGtleVxuICogcGFydHMpLCBzbyBhIHNpbmdsZSBzaGFyZWQga2V5IGxldHMgZXZlcnkgdXNlciBvZiB0aGUgc2FtZSB3b3Jrc3BhY2Ugc2hhcmVcbiAqIG9uZSBjYWNoZWQgZmV0Y2ggYW5kIGNvYWxlc2NlIG9uIHRoZSBpbi1mbGlnaHQgcHJvbWlzZS4gUGVybWlzc2lvbnMgY2FuXG4gKiBkaWZmZXIgaW4gdGhlb3J5LCBidXQgdGhlIEZvdW5kYXRpb24gTW9kZWwgQVBJIGNhdGFsb2d1ZSBpcyB0aGUgc2FtZSB2aWV3IGZvclxuICogZXZlcnkgY2FsbGVyLlxuICovXG5jb25zdCBTSEFSRURfVVNFUl9LRVkgPSBcIm1vZGVsLXNoYXJlZFwiO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGxpc3RTZXJ2aW5nRW5kcG9pbnRzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGNhY2hlIFRUTCBmb3IgdGhpcyBjYWxsLCBpbiBtaWxsaXNlY29uZHMuIEZvcndhcmRlZCB0b1xuICAgKiBgQ2FjaGVNYW5hZ2VyYCBhcyBzZWNvbmRzLlxuICAgKi9cbiAgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTGlzdCBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50cyBmb3IgdGhlIHdvcmtzcGFjZSBvd25pbmcgYGNsaWVudGAsIHJvdXRlZFxuICogdGhyb3VnaCBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyYC4gVGhlIG1hbmFnZXIgZ2l2ZXMgdXMgZXZlcnl0aGluZ1xuICogYGNhY2hldG9vbHMuVFRMQ2FjaGVgIHByb3ZpZGVzIHBsdXMgd2hhdCBgY2FjaGV0b29scy1hc3luY2AgYWRkcyBvbiB0b3A6XG4gKiBwZXItZW50cnkgVFRMLCBpbi1mbGlnaHQgcmVxdWVzdCBjb2FsZXNjaW5nIChjb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgb25lXG4gKiBmZXRjaCB2aWEgdGhlIG1hbmFnZXIncyBpbnRlcm5hbCBgaW5GbGlnaHRSZXF1ZXN0c2AgbWFwKSwgYm91bmRlZCBzaXplLFxuICogdGVsZW1ldHJ5IHNwYW5zIChgY2FjaGUuZ2V0T3JFeGVjdXRlYCksIGFuZCBvcHRpb25hbCBMYWtlYmFzZSBwZXJzaXN0ZW5jZSBzb1xuICogdGhlIGNhdGFsb2d1ZSBzdXJ2aXZlcyByZXN0YXJ0cyB3aGVuIHRoZSBsYWtlYmFzZSBwbHVnaW4gaXMgd2lyZWQgdXAuXG4gKlxuICogUmV0dXJucyBwbGFpbiB7QGxpbmsgU2VydmluZ0VuZHBvaW50U3VtbWFyeX0gb2JqZWN0cyAoYSBzdGFibGUgc3Vic2V0IG9mIHRoZVxuICogU0RLIHR5cGUpIHNvIGNhY2hlIGhpdHMgbmV2ZXIgZXhwb3NlIHN0YWxlIFNESyBpbnRlcm5hbHMuIEVycm9ycyBmcm9tXG4gKiBgQ2FjaGVNYW5hZ2VyYCBvciB0aGUgU0RLIGZldGNoIHByb3BhZ2F0ZSB0byB0aGUgY2FsbGVyIC0gd2UgZG9uJ3Qgc3dhbGxvd1xuICogdGhlbSBzbyB1c2VycyBzZWUgdGhlIHJlYWwgYXV0aCAvIG5ldHdvcmsgaXNzdWUuXG4gKlxuICogQHBhcmFtIGhvc3QgLSBXb3Jrc3BhY2UgaG9zdCB1c2VkIGFzIHRoZSBjYWNoZSBrZXkuIFBhc3MgdGhlIHZhbHVlIHJlc29sdmVkXG4gKiAgIGZyb20gYGNsaWVudC5jb25maWcuZ2V0SG9zdCgpYCBzbyBtdWx0aS1ob3N0IGFwcHMgc2hhcmUgb25lIGVudHJ5IHBlclxuICogICB3b3Jrc3BhY2UuXG4gKiBAcGFyYW0gb3B0aW9ucy50dGxNcyAtIE92ZXJyaWRlIHRoZSBkZWZhdWx0IFRUTCBqdXN0IGZvciB0aGlzIGNhbGwuIEZvcndhcmRlZFxuICogICB0byBgQ2FjaGVNYW5hZ2VyYCBhcyBzZWNvbmRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNlcnZpbmdFbmRwb2ludHMoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgaG9zdDogc3RyaW5nLFxuICBvcHRpb25zOiBMaXN0U2VydmluZ0VuZHBvaW50c09wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIGNvbnN0IHR0bFNlYyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoKG9wdGlvbnMudHRsTXMgPz8gREVGQVVMVF9NT0RFTF9DQUNIRV9UVExfTVMpIC8gMTAwMCkpO1xuICByZXR1cm4gQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmdldE9yRXhlY3V0ZShcbiAgICBbQ0FDSEVfS0VZX05BTUVTUEFDRSwgaG9zdF0sXG4gICAgKCkgPT4gZmV0Y2hFbmRwb2ludHMoY2xpZW50KSxcbiAgICBTSEFSRURfVVNFUl9LRVksXG4gICAgeyB0dGw6IHR0bFNlYyB9LFxuICApO1xufVxuXG4vKipcbiAqIExpc3QgdGhlIHdvcmtzcGFjZSdzIHNlcnZpbmcgZW5kcG9pbnRzIGFzIG1pbmltYWxcbiAqIHtAbGluayBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5fSBvYmplY3RzIHN0cmFpZ2h0IGZyb20gdGhlIFNESzogbm8gY2FjaGluZywgYW5kXG4gKiBub25lIG9mIHRoZSBjYWNoZS1sb2FkIGVucmljaG1lbnQgKHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gYWRkcyB0aGVcbiAqIHtAbGluayBNb2RlbENsYXNzfSBzdGFtcCBhbmQgdGhlIGVtYmVkZGluZy1kaW1lbnNpb24gcHJvYmUpLiBVc2UgdGhpcyBmb3IgYVxuICogb25lLXNob3QsIGRlcGVuZGVuY3ktbGlnaHQgbGlzdGluZyAtIGUuZy4gYSBDTEkgdGhhdCBvbmx5IG5lZWRzIG5hbWVzL3Rhc2tzXG4gKiBmb3IgZnV6enkgcmVzb2x1dGlvbiBhbmQgZG9lc24ndCB3YW50IEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgIG9yIHRoZVxuICogcGVyLWVtYmVkZGluZyBwaW5nIGNvc3QuIFByZWZlciB7QGxpbmsgbGlzdFNlcnZpbmdFbmRwb2ludHN9IGZvciB0aGUgY2FjaGVkLFxuICogZW5yaWNoZWQgdmlldy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2aW5nRW5kcG9pbnRzVW5jYWNoZWQoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbik6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIGNvbnN0IG91dDogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdID0gW107XG4gIGZvciBhd2FpdCAoY29uc3QgZXAgb2YgY2xpZW50LnNlcnZpbmdFbmRwb2ludHMubGlzdCgpKSB7XG4gICAgaWYgKCFlcC5uYW1lKSBjb250aW51ZTtcbiAgICBjb25zdCBwcm9maWxlID0gZXh0cmFjdFByb2ZpbGUoZXApO1xuICAgIG91dC5wdXNoKHtcbiAgICAgIG5hbWU6IGVwLm5hbWUsXG4gICAgICAvLyBQcmVmZXIgYSBEYXRhYnJpY2tzLXByb3ZpZGVkIGh1bWFuIG5hbWUgKGEgZGlzcGxheS1uYW1lIHRhZyBvciBhblxuICAgICAgLy8gZXh0ZXJuYWwtbW9kZWwgbmFtZSk7IGVsc2UgZGVyaXZlIGEgdGl0bGUtY2FzZWQgbGFiZWwgZnJvbSB0aGUgaWQuXG4gICAgICBkaXNwbGF5TmFtZTogZGlzcGxheS50b01vZGVsRGlzcGxheU5hbWUoZXAubmFtZSwgcHJvdmlkZWREaXNwbGF5TmFtZShlcCkpLFxuICAgICAgLi4uKGVwLnRhc2sgIT09IHVuZGVmaW5lZCA/IHsgdGFzazogZXAudGFzayB9IDoge30pLFxuICAgICAgLi4uKGVwLnN0YXRlPy5yZWFkeSAhPT0gdW5kZWZpbmVkID8geyBzdGF0ZTogU3RyaW5nKGVwLnN0YXRlLnJlYWR5KSB9IDoge30pLFxuICAgICAgLi4uKGVwLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgPyB7IGRlc2NyaXB0aW9uOiBlcC5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgc3VwcG9ydHNUb29sczogY2xhc3NpZnkuc3VwcG9ydHNUb29sc0J5RmFtaWx5KGVwLm5hbWUpLFxuICAgICAgLi4uKHByb2ZpbGUgPyB7IHByb2ZpbGUgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFB1bGwgYSBEYXRhYnJpY2tzLXByb3ZpZGVkIGh1bWFuIG5hbWUgb2ZmIGEgc2VydmluZyBlbmRwb2ludCwgaWYgYW55OlxuICogYSBgZGlzcGxheV9uYW1lYCAvIGBkaXNwbGF5TmFtZWAgLyBgbmFtZWAgdGFnIGZpcnN0LCB0aGVuIGFuXG4gKiBleHRlcm5hbC1tb2RlbCBgbmFtZWAgZnJvbSB0aGUgc2VydmVkLWVudGl0eSBjb25maWcuIFJldHVybnMgYG51bGxgXG4gKiB3aGVuIHRoZSBlbmRwb2ludCBjYXJyaWVzIG5vIGV4cGxpY2l0IG5hbWUgKHRoZSBjb21tb24gY2FzZSBmb3JcbiAqIEZvdW5kYXRpb24gTW9kZWwgQVBJIGVuZHBvaW50cyksIHNvIHRoZSBjYWxsZXIgZmFsbHMgYmFjayB0byBkZXJpdmluZ1xuICogb25lIGZyb20gdGhlIGlkLlxuICovXG5mdW5jdGlvbiBwcm92aWRlZERpc3BsYXlOYW1lKGVwOiB7XG4gIHRhZ3M/OiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZT86IHN0cmluZyB9PjtcbiAgY29uZmlnPzogeyBzZXJ2ZWRfZW50aXRpZXM/OiBBcnJheTx7IGV4dGVybmFsX21vZGVsPzogeyBuYW1lPzogc3RyaW5nIH0gfT4gfTtcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgdGFnID0gZXAudGFncz8uZmluZChcbiAgICAodCkgPT4gdC5rZXkgPT09IFwiZGlzcGxheV9uYW1lXCIgfHwgdC5rZXkgPT09IFwiZGlzcGxheU5hbWVcIiB8fCB0LmtleSA9PT0gXCJuYW1lXCIsXG4gICk7XG4gIGNvbnN0IGZyb21UYWcgPSBzdHJpbmcudHJpbVRvTnVsbCh0YWc/LnZhbHVlKTtcbiAgaWYgKGZyb21UYWcpIHJldHVybiBmcm9tVGFnO1xuICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlcC5jb25maWc/LnNlcnZlZF9lbnRpdGllcyA/PyBbXSkge1xuICAgIGNvbnN0IGV4dGVybmFsID0gc3RyaW5nLnRyaW1Ub051bGwoZW50aXR5LmV4dGVybmFsX21vZGVsPy5uYW1lKTtcbiAgICBpZiAoZXh0ZXJuYWwpIHJldHVybiBleHRlcm5hbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hFbmRwb2ludHMoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgbGlzdFNlcnZpbmdFbmRwb2ludHNVbmNhY2hlZChjbGllbnQpO1xuICBzdGFtcE1vZGVsQ2xhc3NlcyhvdXQpO1xuICBhd2FpdCBtZWFzdXJlRW1iZWRkaW5nRGltZW5zaW9ucyhjbGllbnQsIG91dCk7XG4gIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZFwiLCB7IGNvdW50OiBvdXQubGVuZ3RoLCBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQgfSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogU3RhbXAgZWFjaCBzdW1tYXJ5J3Mge0BsaW5rIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkuY2xhc3N9IGZyb20gdGhlIHJlbGF0aXZlXG4gKiBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgd2hvbGUgc2V0LiBNdXRhdGVzIGBzdW1tYXJpZXNgIGluIHBsYWNlLiBFbmRwb2ludHMgdGhlXG4gKiBjbGFzc2lmaWVyIGRvZXNuJ3QgcmVjb2duaXplIChjdXN0b20sIHVuc2NvcmVkLCBub24tTExNKSBhcmUgbGVmdCB3aXRob3V0IGFcbiAqIGNsYXNzLlxuICovXG5mdW5jdGlvbiBzdGFtcE1vZGVsQ2xhc3NlcyhzdW1tYXJpZXM6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSk6IHZvaWQge1xuICBjb25zdCBidWNrZXRzID0gY2xhc3NpZnkuY2xhc3NpZnlFbmRwb2ludHMoc3VtbWFyaWVzKTtcbiAgY29uc3QgY2xhc3NPZiA9IG5ldyBNYXA8c3RyaW5nLCBtb2RlbC5Nb2RlbENsYXNzPigpO1xuICBmb3IgKGNvbnN0IGNscyBvZiBNT0RFTF9DTEFTU19PUkRFUikge1xuICAgIGZvciAoY29uc3QgZXAgb2YgYnVja2V0c1tjbHNdKSBjbGFzc09mLnNldChlcC5uYW1lLCBjbHMpO1xuICB9XG4gIGZvciAoY29uc3Qgc3VtbWFyeSBvZiBzdW1tYXJpZXMpIHtcbiAgICBjb25zdCBjbHMgPSBjbGFzc09mLmdldChzdW1tYXJ5Lm5hbWUpO1xuICAgIGlmIChjbHMgIT09IHVuZGVmaW5lZCkgc3VtbWFyeS5jbGFzcyA9IGNscztcbiAgfVxufVxuXG4vKipcbiAqIE1lYXN1cmUgdGhlIGVtYmVkZGluZyB2ZWN0b3IgZGltZW5zaW9uIG9mIGV2ZXJ5IHtAbGluayBNb2RlbENsYXNzLkVtYmVkZGluZ31cbiAqIGVuZHBvaW50IGJ5IHBpbmdpbmcgaXQgb25jZSwgYWxsIGluIHBhcmFsbGVsLiBNdXRhdGVzIHRoZSBtYXRjaGluZyBzdW1tYXJpZXNcbiAqIGluIHBsYWNlIHdpdGggdGhlIHJlc3VsdGluZyBgZGltZW5zaW9uYC4gUnVucyBvbmx5IG9uIGEgY2FjaGUgbWlzcyAoaXQnc1xuICogY2FsbGVkIGZyb20ge0BsaW5rIGZldGNoRW5kcG9pbnRzfSksIHNvIHRoZSBwcm9iZSBjb3N0IGlzIGFtb3J0aXplZCBhY3Jvc3MgdGhlXG4gKiBjYWNoZWQgVFRMIHdpbmRvdy4gUGVyLWVuZHBvaW50IGZhaWx1cmVzIGFyZSBzd2FsbG93ZWQgKGxvZ2dlZCBhdCB3YXJuKSBzb1xuICogb25lIHVucmVhY2hhYmxlIGVtYmVkZGluZyBtb2RlbCBuZXZlciBmYWlscyB0aGUgbGlzdGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWVhc3VyZUVtYmVkZGluZ0RpbWVuc2lvbnMoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgc3VtbWFyaWVzOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgc3VtbWFyaWVzXG4gICAgICAuZmlsdGVyKChzKSA9PiBzLmNsYXNzID09PSBNb2RlbENsYXNzLkVtYmVkZGluZylcbiAgICAgIC5tYXAoYXN5bmMgKHN1bW1hcnkpID0+IHtcbiAgICAgICAgY29uc3QgZGltZW5zaW9uID0gYXdhaXQgcGluZ0VtYmVkZGluZ0RpbWVuc2lvbihjbGllbnQsIHN1bW1hcnkubmFtZSk7XG4gICAgICAgIGlmIChkaW1lbnNpb24gIT09IHVuZGVmaW5lZCkgc3VtbWFyeS5kaW1lbnNpb24gPSBkaW1lbnNpb247XG4gICAgICB9KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBlbWJlZGRpbmcgZGltZW5zaW9uIHByb2JlOiBxdWVyeSBgbmFtZWAgd2l0aCBhIHRpbnkgYFwicGluZ1wiYFxuICogaW5wdXQgYW5kIHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZXR1cm5lZCB2ZWN0b3IuIFJldHVybnMgYHVuZGVmaW5lZGAgKGFuZFxuICogbG9ncyBhdCB3YXJuKSB3aGVuIHRoZSBlbmRwb2ludCBjYW4ndCBiZSBxdWVyaWVkIG9yIHJldHVybnMgbm8gdmVjdG9yIC0gdGhlXG4gKiBkaW1lbnNpb24gaXMgaW5mb3JtYXRpb25hbCwgbmV2ZXIgcmVxdWlyZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpbmdFbWJlZGRpbmdEaW1lbnNpb24oXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgbmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZXJ2aW5nRW5kcG9pbnRzLnF1ZXJ5KHsgbmFtZSwgaW5wdXQ6IFwicGluZ1wiIH0pO1xuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHJlc3BvbnNlLmRhdGE/LlswXT8uZW1iZWRkaW5nPy5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBkaW1lbnNpb24gPT09IFwibnVtYmVyXCIgJiYgZGltZW5zaW9uID4gMCkgcmV0dXJuIGRpbWVuc2lvbjtcbiAgICBsb2dnZXIud2FybihcImVtYmVkZGluZyBwaW5nIHJldHVybmVkIG5vIHZlY3RvclwiLCB7IG5hbWUgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJlbWJlZGRpbmcgcGluZyBmYWlsZWRcIiwgeyBuYW1lLCBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFB1bGwgdGhlIEZvdW5kYXRpb24gTW9kZWwgQVBJIGBxdWFsaXR5YCAvIGBzcGVlZGAgLyBgY29zdGAgc2NvcmVzIG9mZiBhXG4gKiBzZXJ2aW5nLWVuZHBvaW50IGxpc3RpbmcgZW50cnkuIERhdGFicmlja3MgcmV0dXJucyB0aGVzZSB1bmRlclxuICogYGNvbmZpZy5zZXJ2ZWRfZW50aXRpZXNbXS5mb3VuZGF0aW9uX21vZGVsLmFpX2dhdGV3YXlfbW9kZWxfcHJvZmlsZWBcbiAqIChzbmFrZV9jYXNlIGF0IHRoZSB3aXJlIGxldmVsLCBwcmVzZXJ2ZWQgdmVyYmF0aW0gYnkgdGhlIFNESyksIGJ1dCB0aGUgZmllbGRcbiAqIGlzIG5ld2VyIHRoYW4gdGhlIHR5cGVkIGBGb3VuZGF0aW9uTW9kZWxgIGludGVyZmFjZSwgc28gd2UgcmVhZCBpdCB0aHJvdWdoIGFcbiAqIHN0cnVjdHVyYWwgY2FzdC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIG5vIHNlcnZlZCBlbnRpdHkgY2FycmllcyBhIHByb2ZpbGVcbiAqIChjdXN0b20gbW9kZWxzLCBlbWJlZGRpbmdzLCBhbmQgYnJhbmQtbmV3IGVuZHBvaW50cyB0aGF0IERhdGFicmlja3MgaGFzIG5vdFxuICogc2NvcmVkIHlldCkuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RQcm9maWxlKGVwOiB1bmtub3duKTogTW9kZWxQcm9maWxlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW50aXRpZXMgPSAoXG4gICAgZXAgYXMge1xuICAgICAgY29uZmlnPzoge1xuICAgICAgICBzZXJ2ZWRfZW50aXRpZXM/OiBBcnJheTx7XG4gICAgICAgICAgZm91bmRhdGlvbl9tb2RlbD86IHtcbiAgICAgICAgICAgIGFpX2dhdGV3YXlfbW9kZWxfcHJvZmlsZT86IHtcbiAgICAgICAgICAgICAgcXVhbGl0eT86IG51bWJlcjtcbiAgICAgICAgICAgICAgc3BlZWQ/OiBudW1iZXI7XG4gICAgICAgICAgICAgIGNvc3Q/OiBudW1iZXI7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH07XG4gICAgICAgIH0+O1xuICAgICAgfTtcbiAgICB9XG4gICkuY29uZmlnPy5zZXJ2ZWRfZW50aXRpZXM7XG4gIGlmICghZW50aXRpZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZW50aXR5IG9mIGVudGl0aWVzKSB7XG4gICAgY29uc3QgcmF3ID0gZW50aXR5LmZvdW5kYXRpb25fbW9kZWw/LmFpX2dhdGV3YXlfbW9kZWxfcHJvZmlsZTtcbiAgICBpZiAoIXJhdykgY29udGludWU7XG4gICAgY29uc3QgcHJvZmlsZTogTW9kZWxQcm9maWxlID0ge307XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShyYXcucXVhbGl0eSkpIHByb2ZpbGUucXVhbGl0eSA9IHJhdy5xdWFsaXR5O1xuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUocmF3LnNwZWVkKSkgcHJvZmlsZS5zcGVlZCA9IHJhdy5zcGVlZDtcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHJhdy5jb3N0KSkgcHJvZmlsZS5jb3N0ID0gcmF3LmNvc3Q7XG4gICAgaWYgKE9iamVjdC5rZXlzKHByb2ZpbGUpLmxlbmd0aCA+IDApIHJldHVybiBwcm9maWxlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRm9yY2UtZXZpY3QgY2FjaGVkIGVuZHBvaW50IGxpc3RpbmdzIHZpYSBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyYC4gV2l0aCBhXG4gKiBgaG9zdGAgZGVsZXRlcyB0aGF0IG9uZSB3b3Jrc3BhY2UncyBlbnRyeTsgd2l0aG91dCBvbmUgY2xlYXJzIGV2ZXJ5IGNhY2hlXG4gKiBlbnRyeSBvbiB0aGUgbWFuYWdlciAoc2luY2UgYENhY2hlTWFuYWdlcmAgZG9lc24ndCBleHBvc2UgYSBuYW1lc3BhY2Utc2NvcGVkXG4gKiBjbGVhciwgdGhpcyBpcyB0aGUgYnJ1dGUtZm9yY2UgcGF0aCAtIGZpbmUgZm9yIHRlc3RzLCBhdm9pZCBpbiBzdGVhZHktc3RhdGVcbiAqIGNvZGUpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJTZXJ2aW5nRW5kcG9pbnRzQ2FjaGUoaG9zdD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKTtcbiAgaWYgKGhvc3QpIHtcbiAgICBjb25zdCBrZXkgPSBjYWNoZS5nZW5lcmF0ZUtleShbQ0FDSEVfS0VZX05BTUVTUEFDRSwgaG9zdF0sIFNIQVJFRF9VU0VSX0tFWSk7XG4gICAgYXdhaXQgY2FjaGUuZGVsZXRlKGtleSk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgY2FjaGUuY2xlYXIoKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBmdXp6eS1yZXNvbHZpbmcgYSB1c2VyLXN1cHBsaWVkIG1vZGVsIG5hbWUgYWdhaW5zdCB0aGUgbGl2ZVxuICogZW5kcG9pbnQgbGlzdC4gYHNjb3JlYCBpcyBGdXNlLmpzJ3MgZGlzdGFuY2UgKGAwYCBpcyBleGFjdCwgYDFgIGlzIG5vIG1hdGNoKTtcbiAqIGBtYXRjaGVkYCBpcyBgZmFsc2VgIHdoZW4gdGhlIHNjb3JlIGV4Y2VlZHMgdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkIHNvXG4gKiBjYWxsZXJzIGNhbiBmYWxsIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGlucHV0IChEYXRhYnJpY2tzIHdpbGwgdGhlbiByZXR1cm4gYVxuICogY2xlYW4gNDA0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZE1vZGVsIHtcbiAgbW9kZWxJZDogc3RyaW5nO1xuICBtYXRjaGVkOiBib29sZWFuO1xuICBzY29yZT86IG51bWJlcjtcbn1cblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkge0BsaW5rIHJlc29sdmVNb2RlbElkfSAvIHtAbGluayBzZWFyY2hTZXJ2aW5nRW5kcG9pbnRzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZU1vZGVsT3B0aW9ucyB7XG4gIC8qKiBGdXNlLmpzIHRocmVzaG9sZCAoMCA9IGV4YWN0LCAxID0gYW55dGhpbmcpLiBEZWZhdWx0IGAwLjRgLiAqL1xuICB0aHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1aXJlIGEgbW9kZWwgdmVyaWZpZWQgZm9yIGEgY29tcGxldGUgZnVuY3Rpb24tdG9vbCByb3VuZC10cmlwLiAqL1xuICByZXF1aXJlc1Rvb2xzPzogYm9vbGVhbjtcbn1cblxuLyoqIEEgc2VydmluZyBlbmRwb2ludCBwYWlyZWQgd2l0aCBpdHMgZnV6enktbWF0Y2ggZGlzdGFuY2UgZm9yIGEgcXVlcnkuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3JlZEVuZHBvaW50IHtcbiAgZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnk7XG4gIC8qKiBGdXNlLmpzIGRpc3RhbmNlOiBgMGAgaXMgZXhhY3QsIGAxYCBpcyBubyBtYXRjaC4gKi9cbiAgc2NvcmU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGdXp6eS1yYW5rIGVuZHBvaW50cyBieSBob3cgY2xvc2VseSB0aGVpciBgbmFtZWAgbWF0Y2hlcyBgaW5wdXRgLCBiZXN0XG4gKiAobG93ZXN0IHNjb3JlKSBmaXJzdCwga2VlcGluZyBvbmx5IHRob3NlIHdpdGhpbiBgdGhyZXNob2xkYDpcbiAqXG4gKiAxLiBBbiBleGFjdCBuYW1lIG1hdGNoIHNob3J0LWNpcmN1aXRzIHRvIGEgc2luZ2xlIGBzY29yZTogMGAgcmVzdWx0LlxuICogMi4gT3RoZXJ3aXNlIHRoZSBpbnB1dCBpcyB0b2tlbml6ZWQgKGRhc2hlcyAvIHVuZGVyc2NvcmVzIC8gc3BhY2VzIGJlY29tZVxuICogICAgc2VwYXJhdG9ycykgYW5kIGZlZCB0aHJvdWdoIEZ1c2UuanMgZXh0ZW5kZWQgc2VhcmNoLCB3aGljaCBBTkQtcyBlYWNoXG4gKiAgICB0b2tlbiB3aXRoIGZ1enp5IG1hdGNoaW5nIGVuYWJsZWQgLSB0aGUgXCJ0b2tlbml6ZWQgZnV6enkgbWF0Y2hcIiBhIGNhbGxlclxuICogICAgcmVhY2hlcyBmb3Igd2hlbiB0aGV5IHR5cGUgYFwiY2xhdWRlIHNvbm5ldFwiYCBpbnN0ZWFkIG9mIHRoZSBmdWxsIGVuZHBvaW50XG4gKiAgICBuYW1lLlxuICpcbiAqIFJldHVybnMgYFtdYCBmb3IgYW4gZW1wdHkgZW5kcG9pbnQgbGlzdCBvciB3aGVuIGBpbnB1dGAgdG9rZW5pemVzIHRvIG5vdGhpbmcsXG4gKiBzbyBjYWxsZXJzIGZhbGwgYmFjayB0byB0aGUgcmF3IGlucHV0IGFuZCBsZXQgRGF0YWJyaWNrcyBzdXJmYWNlIGEgY2xlYW4gNDA0LlxuICogVGhpcyBtdWx0aS1yZXN1bHQgY29yZSBpcyBzaGFyZWQgYnkge0BsaW5rIHJlc29sdmVNb2RlbElkfSAoc2luZ2xlIGJlc3QpIGFuZFxuICogdGhlIHJhbmtlZCBgcmFua01vZGVsc2Agc2VsZWN0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWFyY2hTZXJ2aW5nRW5kcG9pbnRzKFxuICBpbnB1dDogc3RyaW5nLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogU2NvcmVkRW5kcG9pbnRbXSB7XG4gIGlmIChlbmRwb2ludHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGZvciAoY29uc3QgZXAgb2YgZW5kcG9pbnRzKSB7XG4gICAgaWYgKGVwLm5hbWUgPT09IGlucHV0KSByZXR1cm4gW3sgZW5kcG9pbnQ6IGVwLCBzY29yZTogMCB9XTtcbiAgfVxuICBjb25zdCB0aHJlc2hvbGQgPSBvcHRpb25zLnRocmVzaG9sZCA/PyBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRDtcbiAgLy8gRnVzZSA3LjMgaGFzIG5vIGJ1aWx0LWluIHRva2VuaXplIGhvb2s7IGluIGV4dGVuZGVkIHNlYXJjaCwgc3BhY2Utc2VwYXJhdGVkXG4gIC8vIHRva2VucyBhcmUgQU5ELWVkIHdpdGggZnV6enkgbWF0Y2hpbmcgZW5hYmxlZC4gV2UgbGVhbiBvbiB0aGUgc2hhcmVkXG4gIC8vIHRva2VuaXplciBzbyB0aGUgc3BsaXR0aW5nIHJ1bGVzIHN0YXkgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSB0b29sa2l0LlxuICBjb25zdCBxdWVyeSA9IEFycmF5LmZyb20oXG4gICAgc3RyaW5nLnRva2VuaXplV2l0aE9wdGlvbnMoeyBsb3dlckNhc2U6IHRydWUsIGNhbWVsQ2FzZTogZmFsc2UgfSwgaW5wdXQpLFxuICApLmpvaW4oXCIgXCIpO1xuICBpZiAoIXF1ZXJ5KSByZXR1cm4gW107XG4gIGNvbnN0IGZ1c2UgPSBuZXcgRnVzZShlbmRwb2ludHMsIHtcbiAgICBrZXlzOiBbXCJuYW1lXCJdLFxuICAgIHRocmVzaG9sZCxcbiAgICBpZ25vcmVMb2NhdGlvbjogdHJ1ZSxcbiAgICBpbmNsdWRlU2NvcmU6IHRydWUsXG4gICAgdXNlRXh0ZW5kZWRTZWFyY2g6IHRydWUsXG4gICAgaXNDYXNlU2Vuc2l0aXZlOiBmYWxzZSxcbiAgfSk7XG4gIHJldHVybiBmdXNlXG4gICAgLnNlYXJjaChxdWVyeSlcbiAgICAuZmlsdGVyKChyKSA9PiAoci5zY29yZSA/PyAwKSA8PSB0aHJlc2hvbGQpXG4gICAgLm1hcCgocikgPT4gKHsgZW5kcG9pbnQ6IHIuaXRlbSwgc2NvcmU6IHIuc2NvcmUgPz8gMCB9KSk7XG59XG5cbi8qKlxuICogU25hcCBhIHVzZXItc3VwcGxpZWQgbW9kZWwgbmFtZSB0byB0aGUgc2luZ2xlIGNsb3Nlc3QgY29uZmlndXJlZCBzZXJ2aW5nXG4gKiBlbmRwb2ludCB2aWEge0BsaW5rIHNlYXJjaFNlcnZpbmdFbmRwb2ludHN9LiBSZXR1cm5zIHRoZSBpbnB1dCB1bmNoYW5nZWQgd2l0aFxuICogYG1hdGNoZWQ6IGZhbHNlYCB3aGVuIG5vdGhpbmcgc2NvcmVzIHdpdGhpbiB0aGUgdGhyZXNob2xkIChvciB0aGUgY2F0YWxvZ3VlXG4gKiBpcyBlbXB0eSksIHNvIGEgZGVsaWJlcmF0ZSBtb2RlbCBpZCBpcyBuZXZlciBzaWxlbnRseSByZXdyaXR0ZW4gdG8gYVxuICogc2ltaWxhci1sb29raW5nIG5laWdoYm91ciBhbmQgdGhlIHVwc3RyZWFtIGNhbGwgc3VyZmFjZXMgdGhlIGNhbm9uaWNhbCA0MDQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kZWxJZChcbiAgaW5wdXQ6IHN0cmluZyxcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIG9wdGlvbnM6IFJlc29sdmVNb2RlbE9wdGlvbnMgPSB7fSxcbik6IFJlc29sdmVkTW9kZWwge1xuICBjb25zdCBbYmVzdF0gPSBzZWFyY2hTZXJ2aW5nRW5kcG9pbnRzKGlucHV0LCBlbmRwb2ludHMsIG9wdGlvbnMpO1xuICBpZiAoYmVzdCkge1xuICAgIHJldHVybiB7IG1vZGVsSWQ6IGJlc3QuZW5kcG9pbnQubmFtZSwgbWF0Y2hlZDogdHJ1ZSwgc2NvcmU6IGJlc3Quc2NvcmUgfTtcbiAgfVxuICByZXR1cm4geyBtb2RlbElkOiBpbnB1dCwgbWF0Y2hlZDogZmFsc2UgfTtcbn1cbiJdfQ==
|
|
287
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUNMLFFBQVEsRUFDUixPQUFPLEVBQ1AsS0FBSyxHQUdOLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRTNCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVqRCxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBRTdCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFTM0MsMEdBQTBHO0FBQzFHLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXhELDZFQUE2RTtBQUM3RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFM0MsZ0VBQWdFO0FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7QUFFaEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQVd2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLE1BQTJCLEVBQzNCLElBQVksRUFDWixVQUF1QyxFQUFFO0lBRXpDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJ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S0FBSztLQUN2QixDQUFDLENBQUM7SUFDSCxPQUFPLElBQUk7U0FDUixNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO1NBQzFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsS0FBYSxFQUNiLFNBQTRDLEVBQzVDLFVBQStCLEVBQUU7SUFFakMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLHNCQUFzQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNULE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGl2ZSBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgY2F0YWxvZ3VlIGFjY2Vzcy5cbiAqXG4gKiBMaXN0cyB0aGUgd29ya3NwYWNlJ3MgYC9zZXJ2aW5nLWVuZHBvaW50c2Agb25jZSBwZXIgaG9zdCBhbmQgY2FjaGVzIHRoZVxuICogcmVzdWx0IHdpdGggYSBUVEwgdmlhIEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgLCB3aXRoIGNvbmN1cnJlbnQgY2FsbGVyc1xuICogc2hhcmluZyBvbmUgaW4tZmxpZ2h0IHByb21pc2UgKHRoZSBjb2FsZXNjaW5nIHBhdHRlcm4gb2YgUHl0aG9uJ3NcbiAqIGBjYWNoZXRvb2xzLWFzeW5jYCkuIFN1cmZhY2VzIGVhY2ggZW5kcG9pbnQgYXMgYSBzdGFibGVcbiAqIHtAbGluayBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5fSAtIGluY2x1ZGluZyB0aGUgRm91bmRhdGlvbiBNb2RlbCBBUElcbiAqIGBxdWFsaXR5YCAvIGBzcGVlZGAgLyBgY29zdGAgcHJvZmlsZSB3aGVuIHByZXNlbnQsIHRoZSBjbGFzc2lmaWVkXG4gKiB7QGxpbmsgTW9kZWxDbGFzc30sIGFuZCAoZm9yIGVtYmVkZGluZyBlbmRwb2ludHMpIHRoZSBtZWFzdXJlZCB2ZWN0b3JcbiAqIGBkaW1lbnNpb25gIC0gYW5kIHNuYXBzIGxvb3NlLCBodW1hbi10eXBlZCBuYW1lcyB0byByZWFsIGVuZHBvaW50IGlkc1xuICogdGhyb3VnaCBgZnVzZS5qc2AgZXh0ZW5kZWQgc2VhcmNoIHNvIHRva2VucyBsaWtlIGBcImNsYXVkZSBzb25uZXRcImAgcmVzb2x2ZSB0b1xuICogYGRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZgLlxuICpcbiAqIFRoZSBjbGFzcyBzdGFtcCBhbmQgZW1iZWRkaW5nIGRpbWVuc2lvbiBhcmUgY29tcHV0ZWQgb25jZSBwZXIgY2FjaGUgbG9hZDpcbiAqIGV2ZXJ5IGVtYmVkZGluZyBlbmRwb2ludCBpcyBcInBpbmdlZFwiIGluIHBhcmFsbGVsIGFuZCB0aGUgcmVzdWx0aW5nIHZlY3RvclxuICogbGVuZ3RoIHJlY29yZGVkLCBzbyB0aGUgY29zdCBpcyBwYWlkIG9uIGEgY2FjaGUgbWlzcywgbm90IHBlciByZWFkLiBUaGUgcGluZ1xuICogaXMgYmVzdC1lZmZvcnQgLSBhIGZhaWx1cmUgbG9ncyBhdCBkZWJ1ZyBhbmQgbGVhdmVzIGBkaW1lbnNpb25gIHVuc2V0IHJhdGhlclxuICogdGhhbiBmYWlsaW5nIHRoZSB3aG9sZSBsaXN0aW5nLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBDYWNoZU1hbmFnZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yLCBsb2csIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBjbGFzc2lmeSxcbiAgZGlzcGxheSxcbiAgbW9kZWwsXG4gIHR5cGUgTW9kZWxQcm9maWxlLFxuICB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW1wb3J0IHsgTU9ERUxfQ0xBU1NfT1JERVIgfSBmcm9tIFwiLi9jbGFzc2VzLnRzXCI7XG5cbmNvbnN0IHsgTW9kZWxDbGFzcyB9ID0gbW9kZWw7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtb2RlbC9zZXJ2aW5nXCIpO1xuXG4vKipcbiAqIFN0cnVjdHVyYWwgdHlwZSBmb3IgdGhlIERhdGFicmlja3Mgd29ya3NwYWNlIGNsaWVudCwgcmUtZXhwb3J0ZWQgc28gdGhlIHJlc3RcbiAqIG9mIHRoaXMgcGFja2FnZSBjYW4ga2VlcCBpbXBvcnRpbmcgaXQgZnJvbSBoZXJlLiBTZWVcbiAqIGBhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZWAgKG5vZGUtYXBwa2l0KSBmb3IgdGhlIGNhbm9uaWNhbCBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gUGljazxhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZSwgXCJzZXJ2aW5nRW5kcG9pbnRzXCI+O1xuXG4vKiogRGVmYXVsdCBUVEwgZm9yIHRoZSBpbi1tZW1vcnkgZW5kcG9pbnQgY2FjaGUuIE1hdGNoZXMgdGhlIERhdGFicmlja3MgU0RLJ3Mgc2Vzc2lvbiBsaWZldGltZSBidWRnZXQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RFTF9DQUNIRV9UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG4vKiogRGVmYXVsdCBGdXNlLmpzIHNjb3JlIHRocmVzaG9sZCBiZWxvdyB3aGljaCBhIGZ1enp5IG1hdGNoIGlzIGFjY2VwdGVkLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRlVaWllfVEhSRVNIT0xEID0gMC40O1xuXG4vKiogQ2FjaGUga2V5IHBhcnRzIHVuZGVyIHdoaWNoIGVuZHBvaW50IGxpc3RpbmdzIGFyZSBzdG9yZWQuICovXG5jb25zdCBDQUNIRV9LRVlfTkFNRVNQQUNFID0gXCJzZXJ2aW5nLWVuZHBvaW50c1wiO1xuXG4vKipcbiAqIFN0YWJsZSBgdXNlcktleWAgYXJnIGZvciBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyLmdldE9yRXhlY3V0ZWAuIEVuZHBvaW50XG4gKiB2aXNpYmlsaXR5IGlzIGVmZmVjdGl2ZWx5IHdvcmtzcGFjZS1zY29wZWQgKHdlIGNhY2hlIGJ5IGhvc3QgaW4gdGhlIGtleVxuICogcGFydHMpLCBzbyBhIHNpbmdsZSBzaGFyZWQga2V5IGxldHMgZXZlcnkgdXNlciBvZiB0aGUgc2FtZSB3b3Jrc3BhY2Ugc2hhcmVcbiAqIG9uZSBjYWNoZWQgZmV0Y2ggYW5kIGNvYWxlc2NlIG9uIHRoZSBpbi1mbGlnaHQgcHJvbWlzZS4gUGVybWlzc2lvbnMgY2FuXG4gKiBkaWZmZXIgaW4gdGhlb3J5LCBidXQgdGhlIEZvdW5kYXRpb24gTW9kZWwgQVBJIGNhdGFsb2d1ZSBpcyB0aGUgc2FtZSB2aWV3IGZvclxuICogZXZlcnkgY2FsbGVyLlxuICovXG5jb25zdCBTSEFSRURfVVNFUl9LRVkgPSBcIm1vZGVsLXNoYXJlZFwiO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGxpc3RTZXJ2aW5nRW5kcG9pbnRzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGNhY2hlIFRUTCBmb3IgdGhpcyBjYWxsLCBpbiBtaWxsaXNlY29uZHMuIEZvcndhcmRlZCB0b1xuICAgKiBgQ2FjaGVNYW5hZ2VyYCBhcyBzZWNvbmRzLlxuICAgKi9cbiAgdHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTGlzdCBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50cyBmb3IgdGhlIHdvcmtzcGFjZSBvd25pbmcgYGNsaWVudGAsIHJvdXRlZFxuICogdGhyb3VnaCBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyYC4gVGhlIG1hbmFnZXIgZ2l2ZXMgdXMgZXZlcnl0aGluZ1xuICogYGNhY2hldG9vbHMuVFRMQ2FjaGVgIHByb3ZpZGVzIHBsdXMgd2hhdCBgY2FjaGV0b29scy1hc3luY2AgYWRkcyBvbiB0b3A6XG4gKiBwZXItZW50cnkgVFRMLCBpbi1mbGlnaHQgcmVxdWVzdCBjb2FsZXNjaW5nIChjb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgb25lXG4gKiBmZXRjaCB2aWEgdGhlIG1hbmFnZXIncyBpbnRlcm5hbCBgaW5GbGlnaHRSZXF1ZXN0c2AgbWFwKSwgYm91bmRlZCBzaXplLFxuICogdGVsZW1ldHJ5IHNwYW5zIChgY2FjaGUuZ2V0T3JFeGVjdXRlYCksIGFuZCBvcHRpb25hbCBMYWtlYmFzZSBwZXJzaXN0ZW5jZSBzb1xuICogdGhlIGNhdGFsb2d1ZSBzdXJ2aXZlcyByZXN0YXJ0cyB3aGVuIHRoZSBsYWtlYmFzZSBwbHVnaW4gaXMgd2lyZWQgdXAuXG4gKlxuICogUmV0dXJucyBwbGFpbiB7QGxpbmsgU2VydmluZ0VuZHBvaW50U3VtbWFyeX0gb2JqZWN0cyAoYSBzdGFibGUgc3Vic2V0IG9mIHRoZVxuICogU0RLIHR5cGUpIHNvIGNhY2hlIGhpdHMgbmV2ZXIgZXhwb3NlIHN0YWxlIFNESyBpbnRlcm5hbHMuIEVycm9ycyBmcm9tXG4gKiBgQ2FjaGVNYW5hZ2VyYCBvciB0aGUgU0RLIGZldGNoIHByb3BhZ2F0ZSB0byB0aGUgY2FsbGVyIC0gd2UgZG9uJ3Qgc3dhbGxvd1xuICogdGhlbSBzbyB1c2VycyBzZWUgdGhlIHJlYWwgYXV0aCAvIG5ldHdvcmsgaXNzdWUuXG4gKlxuICogQHBhcmFtIGhvc3QgLSBXb3Jrc3BhY2UgaG9zdCB1c2VkIGFzIHRoZSBjYWNoZSBrZXkuIFBhc3MgdGhlIHZhbHVlIHJlc29sdmVkXG4gKiAgIGZyb20gYGNsaWVudC5jb25maWcuZ2V0SG9zdCgpYCBzbyBtdWx0aS1ob3N0IGFwcHMgc2hhcmUgb25lIGVudHJ5IHBlclxuICogICB3b3Jrc3BhY2UuXG4gKiBAcGFyYW0gb3B0aW9ucy50dGxNcyAtIE92ZXJyaWRlIHRoZSBkZWZhdWx0IFRUTCBqdXN0IGZvciB0aGlzIGNhbGwuIEZvcndhcmRlZFxuICogICB0byBgQ2FjaGVNYW5hZ2VyYCBhcyBzZWNvbmRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNlcnZpbmdFbmRwb2ludHMoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgaG9zdDogc3RyaW5nLFxuICBvcHRpb25zOiBMaXN0U2VydmluZ0VuZHBvaW50c09wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIGNvbnN0IHR0bFNlYyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoKG9wdGlvbnMudHRsTXMgPz8gREVGQVVMVF9NT0RFTF9DQUNIRV9UVExfTVMpIC8gMTAwMCkpO1xuICByZXR1cm4gQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmdldE9yRXhlY3V0ZShcbiAgICBbQ0FDSEVfS0VZX05BTUVTUEFDRSwgaG9zdF0sXG4gICAgKCkgPT4gZmV0Y2hFbmRwb2ludHMoY2xpZW50KSxcbiAgICBTSEFSRURfVVNFUl9LRVksXG4gICAgeyB0dGw6IHR0bFNlYyB9LFxuICApO1xufVxuXG4vKipcbiAqIExpc3QgdGhlIHdvcmtzcGFjZSdzIHNlcnZpbmcgZW5kcG9pbnRzIGFzIG1pbmltYWxcbiAqIHtAbGluayBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5fSBvYmplY3RzIHN0cmFpZ2h0IGZyb20gdGhlIFNESzogbm8gY2FjaGluZywgYW5kXG4gKiBub25lIG9mIHRoZSBjYWNoZS1sb2FkIGVucmljaG1lbnQgKHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gYWRkcyB0aGVcbiAqIHtAbGluayBNb2RlbENsYXNzfSBzdGFtcCBhbmQgdGhlIGVtYmVkZGluZy1kaW1lbnNpb24gcHJvYmUpLiBVc2UgdGhpcyBmb3IgYVxuICogb25lLXNob3QsIGRlcGVuZGVuY3ktbGlnaHQgbGlzdGluZyAtIGUuZy4gYSBDTEkgdGhhdCBvbmx5IG5lZWRzIG5hbWVzL3Rhc2tzXG4gKiBmb3IgZnV6enkgcmVzb2x1dGlvbiBhbmQgZG9lc24ndCB3YW50IEFwcEtpdCdzIGBDYWNoZU1hbmFnZXJgIG9yIHRoZVxuICogcGVyLWVtYmVkZGluZyBwaW5nIGNvc3QuIFByZWZlciB7QGxpbmsgbGlzdFNlcnZpbmdFbmRwb2ludHN9IGZvciB0aGUgY2FjaGVkLFxuICogZW5yaWNoZWQgdmlldy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RTZXJ2aW5nRW5kcG9pbnRzVW5jYWNoZWQoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbik6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gIGNvbnN0IG91dDogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdID0gW107XG4gIGZvciBhd2FpdCAoY29uc3QgZXAgb2YgY2xpZW50LnNlcnZpbmdFbmRwb2ludHMubGlzdCgpKSB7XG4gICAgaWYgKCFlcC5uYW1lKSBjb250aW51ZTtcbiAgICBjb25zdCBwcm9maWxlID0gZXh0cmFjdFByb2ZpbGUoZXApO1xuICAgIG91dC5wdXNoKHtcbiAgICAgIG5hbWU6IGVwLm5hbWUsXG4gICAgICAvLyBQcmVmZXIgYSBEYXRhYnJpY2tzLXByb3ZpZGVkIGh1bWFuIG5hbWUgKGEgZGlzcGxheS1uYW1lIHRhZyBvciBhblxuICAgICAgLy8gZXh0ZXJuYWwtbW9kZWwgbmFtZSk7IGVsc2UgZGVyaXZlIGEgdGl0bGUtY2FzZWQgbGFiZWwgZnJvbSB0aGUgaWQuXG4gICAgICBkaXNwbGF5TmFtZTogZGlzcGxheS50b01vZGVsRGlzcGxheU5hbWUoZXAubmFtZSwgcHJvdmlkZWREaXNwbGF5TmFtZShlcCkpLFxuICAgICAgLi4uKGVwLnRhc2sgIT09IHVuZGVmaW5lZCA/IHsgdGFzazogZXAudGFzayB9IDoge30pLFxuICAgICAgLi4uKGVwLnN0YXRlPy5yZWFkeSAhPT0gdW5kZWZpbmVkID8geyBzdGF0ZTogU3RyaW5nKGVwLnN0YXRlLnJlYWR5KSB9IDoge30pLFxuICAgICAgLi4uKGVwLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgPyB7IGRlc2NyaXB0aW9uOiBlcC5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgc3VwcG9ydHNUb29sczogY2xhc3NpZnkuc3VwcG9ydHNUb29sc0J5RmFtaWx5KGVwLm5hbWUpLFxuICAgICAgLi4uKHByb2ZpbGUgPyB7IHByb2ZpbGUgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFB1bGwgYSBEYXRhYnJpY2tzLXByb3ZpZGVkIGh1bWFuIG5hbWUgb2ZmIGEgc2VydmluZyBlbmRwb2ludCwgaWYgYW55OlxuICogYSBgZGlzcGxheV9uYW1lYCAvIGBkaXNwbGF5TmFtZWAgLyBgbmFtZWAgdGFnIGZpcnN0LCB0aGVuIGFuXG4gKiBleHRlcm5hbC1tb2RlbCBgbmFtZWAgZnJvbSB0aGUgc2VydmVkLWVudGl0eSBjb25maWcuIFJldHVybnMgYG51bGxgXG4gKiB3aGVuIHRoZSBlbmRwb2ludCBjYXJyaWVzIG5vIGV4cGxpY2l0IG5hbWUgKHRoZSBjb21tb24gY2FzZSBmb3JcbiAqIEZvdW5kYXRpb24gTW9kZWwgQVBJIGVuZHBvaW50cyksIHNvIHRoZSBjYWxsZXIgZmFsbHMgYmFjayB0byBkZXJpdmluZ1xuICogb25lIGZyb20gdGhlIGlkLlxuICovXG5mdW5jdGlvbiBwcm92aWRlZERpc3BsYXlOYW1lKGVwOiB7XG4gIHRhZ3M/OiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZT86IHN0cmluZyB9PjtcbiAgY29uZmlnPzogeyBzZXJ2ZWRfZW50aXRpZXM/OiBBcnJheTx7IGV4dGVybmFsX21vZGVsPzogeyBuYW1lPzogc3RyaW5nIH0gfT4gfTtcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgdGFnID0gZXAudGFncz8uZmluZChcbiAgICAodCkgPT4gdC5rZXkgPT09IFwiZGlzcGxheV9uYW1lXCIgfHwgdC5rZXkgPT09IFwiZGlzcGxheU5hbWVcIiB8fCB0LmtleSA9PT0gXCJuYW1lXCIsXG4gICk7XG4gIGNvbnN0IGZyb21UYWcgPSBzdHJpbmcudHJpbVRvTnVsbCh0YWc/LnZhbHVlKTtcbiAgaWYgKGZyb21UYWcpIHJldHVybiBmcm9tVGFnO1xuICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlcC5jb25maWc/LnNlcnZlZF9lbnRpdGllcyA/PyBbXSkge1xuICAgIGNvbnN0IGV4dGVybmFsID0gc3RyaW5nLnRyaW1Ub051bGwoZW50aXR5LmV4dGVybmFsX21vZGVsPy5uYW1lKTtcbiAgICBpZiAoZXh0ZXJuYWwpIHJldHVybiBleHRlcm5hbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hFbmRwb2ludHMoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgbGlzdFNlcnZpbmdFbmRwb2ludHNVbmNhY2hlZChjbGllbnQpO1xuICBzdGFtcE1vZGVsQ2xhc3NlcyhvdXQpO1xuICBhd2FpdCBtZWFzdXJlRW1iZWRkaW5nRGltZW5zaW9ucyhjbGllbnQsIG91dCk7XG4gIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZFwiLCB7IGNvdW50OiBvdXQubGVuZ3RoLCBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQgfSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogU3RhbXAgZWFjaCBzdW1tYXJ5J3Mge0BsaW5rIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkuY2xhc3N9IGZyb20gdGhlIHJlbGF0aXZlXG4gKiBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgd2hvbGUgc2V0LiBNdXRhdGVzIGBzdW1tYXJpZXNgIGluIHBsYWNlLiBFbmRwb2ludHMgdGhlXG4gKiBjbGFzc2lmaWVyIGRvZXNuJ3QgcmVjb2duaXplIChjdXN0b20sIHVuc2NvcmVkLCBub24tTExNKSBhcmUgbGVmdCB3aXRob3V0IGFcbiAqIGNsYXNzLlxuICovXG5mdW5jdGlvbiBzdGFtcE1vZGVsQ2xhc3NlcyhzdW1tYXJpZXM6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSk6IHZvaWQge1xuICBjb25zdCBidWNrZXRzID0gY2xhc3NpZnkuY2xhc3NpZnlFbmRwb2ludHMoc3VtbWFyaWVzKTtcbiAgY29uc3QgY2xhc3NPZiA9IG5ldyBNYXA8c3RyaW5nLCBtb2RlbC5Nb2RlbENsYXNzPigpO1xuICBmb3IgKGNvbnN0IGNscyBvZiBNT0RFTF9DTEFTU19PUkRFUikge1xuICAgIGZvciAoY29uc3QgZXAgb2YgYnVja2V0c1tjbHNdKSBjbGFzc09mLnNldChlcC5uYW1lLCBjbHMpO1xuICB9XG4gIGZvciAoY29uc3Qgc3VtbWFyeSBvZiBzdW1tYXJpZXMpIHtcbiAgICBjb25zdCBjbHMgPSBjbGFzc09mLmdldChzdW1tYXJ5Lm5hbWUpO1xuICAgIGlmIChjbHMgIT09IHVuZGVmaW5lZCkgc3VtbWFyeS5jbGFzcyA9IGNscztcbiAgfVxufVxuXG4vKipcbiAqIE1lYXN1cmUgdGhlIGVtYmVkZGluZyB2ZWN0b3IgZGltZW5zaW9uIG9mIGV2ZXJ5IHtAbGluayBNb2RlbENsYXNzLkVtYmVkZGluZ31cbiAqIGVuZHBvaW50IGJ5IHBpbmdpbmcgaXQgb25jZSwgYWxsIGluIHBhcmFsbGVsLiBNdXRhdGVzIHRoZSBtYXRjaGluZyBzdW1tYXJpZXNcbiAqIGluIHBsYWNlIHdpdGggdGhlIHJlc3VsdGluZyBgZGltZW5zaW9uYC4gUnVucyBvbmx5IG9uIGEgY2FjaGUgbWlzcyAoaXQnc1xuICogY2FsbGVkIGZyb20ge0BsaW5rIGZldGNoRW5kcG9pbnRzfSksIHNvIHRoZSBwcm9iZSBjb3N0IGlzIGFtb3J0aXplZCBhY3Jvc3MgdGhlXG4gKiBjYWNoZWQgVFRMIHdpbmRvdy4gUGVyLWVuZHBvaW50IGZhaWx1cmVzIGFyZSBzd2FsbG93ZWQgKGxvZ2dlZCBhdCB3YXJuKSBzb1xuICogb25lIHVucmVhY2hhYmxlIGVtYmVkZGluZyBtb2RlbCBuZXZlciBmYWlscyB0aGUgbGlzdGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbWVhc3VyZUVtYmVkZGluZ0RpbWVuc2lvbnMoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgc3VtbWFyaWVzOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgc3VtbWFyaWVzXG4gICAgICAuZmlsdGVyKChzKSA9PiBzLmNsYXNzID09PSBNb2RlbENsYXNzLkVtYmVkZGluZylcbiAgICAgIC5tYXAoYXN5bmMgKHN1bW1hcnkpID0+IHtcbiAgICAgICAgY29uc3QgZGltZW5zaW9uID0gYXdhaXQgcGluZ0VtYmVkZGluZ0RpbWVuc2lvbihjbGllbnQsIHN1bW1hcnkubmFtZSk7XG4gICAgICAgIGlmIChkaW1lbnNpb24gIT09IHVuZGVmaW5lZCkgc3VtbWFyeS5kaW1lbnNpb24gPSBkaW1lbnNpb247XG4gICAgICB9KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBlbWJlZGRpbmcgZGltZW5zaW9uIHByb2JlOiBxdWVyeSBgbmFtZWAgd2l0aCBhIHRpbnkgYFwicGluZ1wiYFxuICogaW5wdXQgYW5kIHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZXR1cm5lZCB2ZWN0b3IuIFJldHVybnMgYHVuZGVmaW5lZGAgKGFuZFxuICogbG9ncyBhdCB3YXJuKSB3aGVuIHRoZSBlbmRwb2ludCBjYW4ndCBiZSBxdWVyaWVkIG9yIHJldHVybnMgbm8gdmVjdG9yIC0gdGhlXG4gKiBkaW1lbnNpb24gaXMgaW5mb3JtYXRpb25hbCwgbmV2ZXIgcmVxdWlyZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpbmdFbWJlZGRpbmdEaW1lbnNpb24oXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgbmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZXJ2aW5nRW5kcG9pbnRzLnF1ZXJ5KHsgbmFtZSwgaW5wdXQ6IFwicGluZ1wiIH0pO1xuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHJlc3BvbnNlLmRhdGE/LlswXT8uZW1iZWRkaW5nPy5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBkaW1lbnNpb24gPT09IFwibnVtYmVyXCIgJiYgZGltZW5zaW9uID4gMCkgcmV0dXJuIGRpbWVuc2lvbjtcbiAgICBsb2dnZXIud2FybihcImVtYmVkZGluZyBwaW5nIHJldHVybmVkIG5vIHZlY3RvclwiLCB7IG5hbWUgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJlbWJlZGRpbmcgcGluZyBmYWlsZWRcIiwgeyBuYW1lLCBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFB1bGwgdGhlIEZvdW5kYXRpb24gTW9kZWwgQVBJIGBxdWFsaXR5YCAvIGBzcGVlZGAgLyBgY29zdGAgc2NvcmVzIG9mZiBhXG4gKiBzZXJ2aW5nLWVuZHBvaW50IGxpc3RpbmcgZW50cnkuIERhdGFicmlja3MgcmV0dXJucyB0aGVzZSB1bmRlclxuICogYGNvbmZpZy5zZXJ2ZWRfZW50aXRpZXNbXS5mb3VuZGF0aW9uX21vZGVsLmFpX2dhdGV3YXlfbW9kZWxfcHJvZmlsZWBcbiAqIChzbmFrZV9jYXNlIGF0IHRoZSB3aXJlIGxldmVsLCBwcmVzZXJ2ZWQgdmVyYmF0aW0gYnkgdGhlIFNESyksIGJ1dCB0aGUgZmllbGRcbiAqIGlzIG5ld2VyIHRoYW4gdGhlIHR5cGVkIGBGb3VuZGF0aW9uTW9kZWxgIGludGVyZmFjZSwgc28gd2UgcmVhZCBpdCB0aHJvdWdoIGFcbiAqIHN0cnVjdHVyYWwgY2FzdC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIG5vIHNlcnZlZCBlbnRpdHkgY2FycmllcyBhIHByb2ZpbGVcbiAqIChjdXN0b20gbW9kZWxzLCBlbWJlZGRpbmdzLCBhbmQgYnJhbmQtbmV3IGVuZHBvaW50cyB0aGF0IERhdGFicmlja3MgaGFzIG5vdFxuICogc2NvcmVkIHlldCkuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RQcm9maWxlKGVwOiB1bmtub3duKTogTW9kZWxQcm9maWxlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW50aXRpZXMgPSAoXG4gICAgZXAgYXMge1xuICAgICAgY29uZmlnPzoge1xuICAgICAgICBzZXJ2ZWRfZW50aXRpZXM/OiBBcnJheTx7XG4gICAgICAgICAgZm91bmRhdGlvbl9tb2RlbD86IHtcbiAgICAgICAgICAgIGFpX2dhdGV3YXlfbW9kZWxfcHJvZmlsZT86IHtcbiAgICAgICAgICAgICAgcXVhbGl0eT86IG51bWJlcjtcbiAgICAgICAgICAgICAgc3BlZWQ/OiBudW1iZXI7XG4gICAgICAgICAgICAgIGNvc3Q/OiBudW1iZXI7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH07XG4gICAgICAgIH0+O1xuICAgICAgfTtcbiAgICB9XG4gICkuY29uZmlnPy5zZXJ2ZWRfZW50aXRpZXM7XG4gIGlmICghZW50aXRpZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZW50aXR5IG9mIGVudGl0aWVzKSB7XG4gICAgY29uc3QgcmF3ID0gZW50aXR5LmZvdW5kYXRpb25fbW9kZWw/LmFpX2dhdGV3YXlfbW9kZWxfcHJvZmlsZTtcbiAgICBpZiAoIXJhdykgY29udGludWU7XG4gICAgY29uc3QgcHJvZmlsZTogTW9kZWxQcm9maWxlID0ge307XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShyYXcucXVhbGl0eSkpIHByb2ZpbGUucXVhbGl0eSA9IHJhdy5xdWFsaXR5O1xuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUocmF3LnNwZWVkKSkgcHJvZmlsZS5zcGVlZCA9IHJhdy5zcGVlZDtcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHJhdy5jb3N0KSkgcHJvZmlsZS5jb3N0ID0gcmF3LmNvc3Q7XG4gICAgaWYgKE9iamVjdC5rZXlzKHByb2ZpbGUpLmxlbmd0aCA+IDApIHJldHVybiBwcm9maWxlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRm9yY2UtZXZpY3QgY2FjaGVkIGVuZHBvaW50IGxpc3RpbmdzIHZpYSBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyYC4gV2l0aCBhXG4gKiBgaG9zdGAgZGVsZXRlcyB0aGF0IG9uZSB3b3Jrc3BhY2UncyBlbnRyeTsgd2l0aG91dCBvbmUgY2xlYXJzIGV2ZXJ5IGNhY2hlXG4gKiBlbnRyeSBvbiB0aGUgbWFuYWdlciAoc2luY2UgYENhY2hlTWFuYWdlcmAgZG9lc24ndCBleHBvc2UgYSBuYW1lc3BhY2Utc2NvcGVkXG4gKiBjbGVhciwgdGhpcyBpcyB0aGUgYnJ1dGUtZm9yY2UgcGF0aCAtIGZpbmUgZm9yIHRlc3RzLCBhdm9pZCBpbiBzdGVhZHktc3RhdGVcbiAqIGNvZGUpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJTZXJ2aW5nRW5kcG9pbnRzQ2FjaGUoaG9zdD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKTtcbiAgaWYgKGhvc3QpIHtcbiAgICBjb25zdCBrZXkgPSBjYWNoZS5nZW5lcmF0ZUtleShbQ0FDSEVfS0VZX05BTUVTUEFDRSwgaG9zdF0sIFNIQVJFRF9VU0VSX0tFWSk7XG4gICAgYXdhaXQgY2FjaGUuZGVsZXRlKGtleSk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgY2FjaGUuY2xlYXIoKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBmdXp6eS1yZXNvbHZpbmcgYSB1c2VyLXN1cHBsaWVkIG1vZGVsIG5hbWUgYWdhaW5zdCB0aGUgbGl2ZVxuICogZW5kcG9pbnQgbGlzdC4gYHNjb3JlYCBpcyBGdXNlLmpzJ3MgZGlzdGFuY2UgKGAwYCBpcyBleGFjdCwgYDFgIGlzIG5vIG1hdGNoKTtcbiAqIGBtYXRjaGVkYCBpcyBgZmFsc2VgIHdoZW4gdGhlIHNjb3JlIGV4Y2VlZHMgdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkIHNvXG4gKiBjYWxsZXJzIGNhbiBmYWxsIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGlucHV0IChEYXRhYnJpY2tzIHdpbGwgdGhlbiByZXR1cm4gYVxuICogY2xlYW4gNDA0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZE1vZGVsIHtcbiAgbW9kZWxJZDogc3RyaW5nO1xuICBtYXRjaGVkOiBib29sZWFuO1xuICBzY29yZT86IG51bWJlcjtcbn1cblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkge0BsaW5rIHJlc29sdmVNb2RlbElkfSAvIHtAbGluayBzZWFyY2hTZXJ2aW5nRW5kcG9pbnRzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZU1vZGVsT3B0aW9ucyB7XG4gIC8qKiBGdXNlLmpzIHRocmVzaG9sZCAoMCA9IGV4YWN0LCAxID0gYW55dGhpbmcpLiBEZWZhdWx0IGAwLjRgLiAqL1xuICB0aHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1aXJlIGEgbW9kZWwgdmVyaWZpZWQgZm9yIGEgY29tcGxldGUgZnVuY3Rpb24tdG9vbCByb3VuZC10cmlwLiAqL1xuICByZXF1aXJlc1Rvb2xzPzogYm9vbGVhbjtcbn1cblxuLyoqIEEgc2VydmluZyBlbmRwb2ludCBwYWlyZWQgd2l0aCBpdHMgZnV6enktbWF0Y2ggZGlzdGFuY2UgZm9yIGEgcXVlcnkuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3JlZEVuZHBvaW50IHtcbiAgZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnk7XG4gIC8qKiBGdXNlLmpzIGRpc3RhbmNlOiBgMGAgaXMgZXhhY3QsIGAxYCBpcyBubyBtYXRjaC4gKi9cbiAgc2NvcmU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGdXp6eS1yYW5rIGVuZHBvaW50cyBieSBob3cgY2xvc2VseSB0aGVpciBgbmFtZWAgbWF0Y2hlcyBgaW5wdXRgLCBiZXN0XG4gKiAobG93ZXN0IHNjb3JlKSBmaXJzdCwga2VlcGluZyBvbmx5IHRob3NlIHdpdGhpbiBgdGhyZXNob2xkYDpcbiAqXG4gKiAxLiBBbiBleGFjdCBuYW1lIG1hdGNoIHNob3J0LWNpcmN1aXRzIHRvIGEgc2luZ2xlIGBzY29yZTogMGAgcmVzdWx0LlxuICogMi4gT3RoZXJ3aXNlIHRoZSBpbnB1dCBpcyB0b2tlbml6ZWQgKGRhc2hlcyAvIHVuZGVyc2NvcmVzIC8gc3BhY2VzIGJlY29tZVxuICogICAgc2VwYXJhdG9ycykgYW5kIGZlZCB0aHJvdWdoIEZ1c2UuanMgZXh0ZW5kZWQgc2VhcmNoLCB3aGljaCBBTkQtcyBlYWNoXG4gKiAgICB0b2tlbiB3aXRoIGZ1enp5IG1hdGNoaW5nIGVuYWJsZWQgLSB0aGUgXCJ0b2tlbml6ZWQgZnV6enkgbWF0Y2hcIiBhIGNhbGxlclxuICogICAgcmVhY2hlcyBmb3Igd2hlbiB0aGV5IHR5cGUgYFwiY2xhdWRlIHNvbm5ldFwiYCBpbnN0ZWFkIG9mIHRoZSBmdWxsIGVuZHBvaW50XG4gKiAgICBuYW1lLlxuICpcbiAqIFJldHVybnMgYFtdYCBmb3IgYW4gZW1wdHkgZW5kcG9pbnQgbGlzdCBvciB3aGVuIGBpbnB1dGAgdG9rZW5pemVzIHRvIG5vdGhpbmcsXG4gKiBzbyBjYWxsZXJzIGZhbGwgYmFjayB0byB0aGUgcmF3IGlucHV0IGFuZCBsZXQgRGF0YWJyaWNrcyBzdXJmYWNlIGEgY2xlYW4gNDA0LlxuICogVGhpcyBtdWx0aS1yZXN1bHQgY29yZSBpcyBzaGFyZWQgYnkge0BsaW5rIHJlc29sdmVNb2RlbElkfSAoc2luZ2xlIGJlc3QpIGFuZFxuICogdGhlIHJhbmtlZCBgbG9va3VwTW9kZWxzYCBzZWxlY3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoXG4gIGlucHV0OiBzdHJpbmcsXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxPcHRpb25zID0ge30sXG4pOiBTY29yZWRFbmRwb2ludFtdIHtcbiAgaWYgKGVuZHBvaW50cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgZm9yIChjb25zdCBlcCBvZiBlbmRwb2ludHMpIHtcbiAgICBpZiAoZXAubmFtZSA9PT0gaW5wdXQpIHJldHVybiBbeyBlbmRwb2ludDogZXAsIHNjb3JlOiAwIH1dO1xuICB9XG4gIGNvbnN0IHRocmVzaG9sZCA9IG9wdGlvbnMudGhyZXNob2xkID8/IERFRkFVTFRfRlVaWllfVEhSRVNIT0xEO1xuICAvLyBGdXNlIDcuMyBoYXMgbm8gYnVpbHQtaW4gdG9rZW5pemUgaG9vazsgaW4gZXh0ZW5kZWQgc2VhcmNoLCBzcGFjZS1zZXBhcmF0ZWRcbiAgLy8gdG9rZW5zIGFyZSBBTkQtZWQgd2l0aCBmdXp6eSBtYXRjaGluZyBlbmFibGVkLiBXZSBsZWFuIG9uIHRoZSBzaGFyZWRcbiAgLy8gdG9rZW5pemVyIHNvIHRoZSBzcGxpdHRpbmcgcnVsZXMgc3RheSBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRvb2xraXQuXG4gIGNvbnN0IHF1ZXJ5ID0gQXJyYXkuZnJvbShcbiAgICBzdHJpbmcudG9rZW5pemVXaXRoT3B0aW9ucyh7IGxvd2VyQ2FzZTogdHJ1ZSwgY2FtZWxDYXNlOiBmYWxzZSB9LCBpbnB1dCksXG4gICkuam9pbihcIiBcIik7XG4gIGlmICghcXVlcnkpIHJldHVybiBbXTtcbiAgY29uc3QgZnVzZSA9IG5ldyBGdXNlKGVuZHBvaW50cywge1xuICAgIGtleXM6IFtcIm5hbWVcIl0sXG4gICAgdGhyZXNob2xkLFxuICAgIGlnbm9yZUxvY2F0aW9uOiB0cnVlLFxuICAgIGluY2x1ZGVTY29yZTogdHJ1ZSxcbiAgICB1c2VFeHRlbmRlZFNlYXJjaDogdHJ1ZSxcbiAgICBpc0Nhc2VTZW5zaXRpdmU6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIGZ1c2VcbiAgICAuc2VhcmNoKHF1ZXJ5KVxuICAgIC5maWx0ZXIoKHIpID0+IChyLnNjb3JlID8/IDApIDw9IHRocmVzaG9sZClcbiAgICAubWFwKChyKSA9PiAoeyBlbmRwb2ludDogci5pdGVtLCBzY29yZTogci5zY29yZSA/PyAwIH0pKTtcbn1cblxuLyoqXG4gKiBTbmFwIGEgdXNlci1zdXBwbGllZCBtb2RlbCBuYW1lIHRvIHRoZSBzaW5nbGUgY2xvc2VzdCBjb25maWd1cmVkIHNlcnZpbmdcbiAqIGVuZHBvaW50IHZpYSB7QGxpbmsgc2VhcmNoU2VydmluZ0VuZHBvaW50c30uIFJldHVybnMgdGhlIGlucHV0IHVuY2hhbmdlZCB3aXRoXG4gKiBgbWF0Y2hlZDogZmFsc2VgIHdoZW4gbm90aGluZyBzY29yZXMgd2l0aGluIHRoZSB0aHJlc2hvbGQgKG9yIHRoZSBjYXRhbG9ndWVcbiAqIGlzIGVtcHR5KSwgc28gYSBkZWxpYmVyYXRlIG1vZGVsIGlkIGlzIG5ldmVyIHNpbGVudGx5IHJld3JpdHRlbiB0byBhXG4gKiBzaW1pbGFyLWxvb2tpbmcgbmVpZ2hib3VyIGFuZCB0aGUgdXBzdHJlYW0gY2FsbCBzdXJmYWNlcyB0aGUgY2Fub25pY2FsIDQwNC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNb2RlbElkKFxuICBpbnB1dDogc3RyaW5nLFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUmVzb2x2ZWRNb2RlbCB7XG4gIGNvbnN0IFtiZXN0XSA9IHNlYXJjaFNlcnZpbmdFbmRwb2ludHMoaW5wdXQsIGVuZHBvaW50cywgb3B0aW9ucyk7XG4gIGlmIChiZXN0KSB7XG4gICAgcmV0dXJuIHsgbW9kZWxJZDogYmVzdC5lbmRwb2ludC5uYW1lLCBtYXRjaGVkOiB0cnVlLCBzY29yZTogYmVzdC5zY29yZSB9O1xuICB9XG4gIHJldHVybiB7IG1vZGVsSWQ6IGlucHV0LCBtYXRjaGVkOiBmYWxzZSB9O1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -18,16 +18,16 @@
|
|
|
18
18
|
"projen": "projen"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@dbx-tools/test-polyglot": "0.6.
|
|
21
|
+
"@dbx-tools/test-polyglot": "0.6.175",
|
|
22
22
|
"@types/bun": "1.3.14",
|
|
23
23
|
"@types/node": "^24.6.0",
|
|
24
24
|
"typescript": "^5.9.3"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@databricks/appkit": "^0.60.0",
|
|
28
|
-
"@dbx-tools/appkit": "0.6.
|
|
29
|
-
"@dbx-tools/shared-core": "0.6.
|
|
30
|
-
"@dbx-tools/shared-model": "0.6.
|
|
28
|
+
"@dbx-tools/appkit": "0.6.175",
|
|
29
|
+
"@dbx-tools/shared-core": "0.6.175",
|
|
30
|
+
"@dbx-tools/shared-model": "0.6.175",
|
|
31
31
|
"fuse.js": "^7.4.2"
|
|
32
32
|
},
|
|
33
33
|
"main": "./lib/index.js",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"./package.json": "./package.json"
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
|
-
"version": "0.6.
|
|
47
|
+
"version": "0.6.175",
|
|
48
48
|
"types": "./lib/index.d.ts",
|
|
49
49
|
"type": "module",
|
|
50
50
|
"exports": {
|
package/src/resolve.ts
CHANGED
|
@@ -129,7 +129,7 @@ function matchBucket(score: number | undefined): number {
|
|
|
129
129
|
* A `limit` truncates the result. Returns `[]` when nothing is eligible or
|
|
130
130
|
* matches - callers layer their own fallback.
|
|
131
131
|
*/
|
|
132
|
-
export function
|
|
132
|
+
export function lookupModels(
|
|
133
133
|
endpoints: readonly ServingEndpointSummary[],
|
|
134
134
|
query: ModelQuery = {},
|
|
135
135
|
): RankedModel[] {
|
|
@@ -189,7 +189,7 @@ export function rankModels(
|
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
/**
|
|
192
|
-
* Collapse {@link
|
|
192
|
+
* Collapse {@link lookupModels} to a single id: the closest endpoint to `search`
|
|
193
193
|
* in a catalogue snapshot, or the input verbatim when nothing scores within the
|
|
194
194
|
* threshold.
|
|
195
195
|
*
|
|
@@ -205,7 +205,7 @@ export function rankModelId(
|
|
|
205
205
|
search: string,
|
|
206
206
|
options: ResolveModelOptions = {},
|
|
207
207
|
): ResolvedModel {
|
|
208
|
-
const [top] =
|
|
208
|
+
const [top] = lookupModels(endpoints, {
|
|
209
209
|
search,
|
|
210
210
|
limit: 1,
|
|
211
211
|
...(options.threshold !== undefined ? { threshold: options.threshold } : {}),
|
|
@@ -241,7 +241,7 @@ export async function rankModelIdLive(
|
|
|
241
241
|
|
|
242
242
|
/**
|
|
243
243
|
* Rank a workspace's catalogue in one call: list its `/serving-endpoints`
|
|
244
|
-
* (cached) and run {@link
|
|
244
|
+
* (cached) and run {@link lookupModels} over the result. The list counterpart to
|
|
245
245
|
* {@link selectModel}, for a consumer that wants the full ranked set (a model
|
|
246
246
|
* picker, a CLI) rather than a single id. Catalogue fetches fail loud: network
|
|
247
247
|
* / auth errors propagate so the caller sees the real SDK message.
|
|
@@ -259,7 +259,7 @@ export async function searchModels(
|
|
|
259
259
|
host,
|
|
260
260
|
input.ttlMs !== undefined ? { ttlMs: input.ttlMs } : {},
|
|
261
261
|
);
|
|
262
|
-
return
|
|
262
|
+
return lookupModels(endpoints, input);
|
|
263
263
|
}
|
|
264
264
|
|
|
265
265
|
/**
|
|
@@ -292,7 +292,7 @@ export async function selectModel(
|
|
|
292
292
|
|
|
293
293
|
/**
|
|
294
294
|
* Resolve a single model id from the live catalogue and caller intent,
|
|
295
|
-
* delegating the live selection to {@link
|
|
295
|
+
* delegating the live selection to {@link lookupModels} with `limit: 1`.
|
|
296
296
|
*
|
|
297
297
|
* 1. **Explicit ask**: with `fuzzy` off, returned verbatim; otherwise
|
|
298
298
|
* fuzzy-ranked within the (optional) class ceiling and the best taken,
|
|
@@ -311,7 +311,7 @@ export function resolveModel(
|
|
|
311
311
|
if (input.requiresTools) assertToolSupport(endpoints, input.explicit);
|
|
312
312
|
return { modelId: input.explicit, source: "explicit" };
|
|
313
313
|
}
|
|
314
|
-
const [top] =
|
|
314
|
+
const [top] = lookupModels(endpoints, buildQuery(input, input.explicit));
|
|
315
315
|
if (input.requiresTools && !top) {
|
|
316
316
|
throw new Error(`No tool-capable model matches "${input.explicit}"`);
|
|
317
317
|
}
|
|
@@ -331,7 +331,7 @@ export function resolveModel(
|
|
|
331
331
|
}
|
|
332
332
|
|
|
333
333
|
const source = input.modelClass !== undefined ? "class" : "fallback";
|
|
334
|
-
const [top] =
|
|
334
|
+
const [top] = lookupModels(endpoints, buildQuery(input, undefined));
|
|
335
335
|
if (top) return { modelId: top.endpoint.name, source };
|
|
336
336
|
|
|
337
337
|
// Live catalogue yielded nothing in range: walk the static floor.
|
package/src/serving.ts
CHANGED
|
@@ -333,7 +333,7 @@ export interface ScoredEndpoint {
|
|
|
333
333
|
* Returns `[]` for an empty endpoint list or when `input` tokenizes to nothing,
|
|
334
334
|
* so callers fall back to the raw input and let Databricks surface a clean 404.
|
|
335
335
|
* This multi-result core is shared by {@link resolveModelId} (single best) and
|
|
336
|
-
* the ranked `
|
|
336
|
+
* the ranked `lookupModels` selector.
|
|
337
337
|
*/
|
|
338
338
|
export function searchServingEndpoints(
|
|
339
339
|
input: string,
|