@dbx-tools/model 0.9.40 → 0.9.43
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 +3 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.js +3 -2
- package/lib/package.json +137 -0
- package/lib/src/_metadata-generator.js +11 -8
- package/lib/src/_ranking.js +2 -2
- package/lib/src/_retirement.d.ts +10 -0
- package/lib/src/_retirement.js +59 -0
- package/lib/src/bindings.d.ts +42 -0
- package/lib/src/bindings.js +43 -0
- package/lib/src/classify.d.ts +5 -0
- package/lib/src/classify.js +13 -5
- package/lib/src/metadata-cache.js +7 -10
- package/lib/src/metadata.d.ts +2 -7
- package/lib/src/metadata.js +16 -53
- package/lib/src/model-client.d.ts +2 -0
- package/lib/src/model-client.js +13 -7
- package/lib/src/policy.d.ts +14 -0
- package/lib/src/policy.js +47 -2
- package/lib/src/reasoning-translation.js +8 -3
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -6
- package/src/_metadata-generator.ts +11 -11
- package/src/_ranking.ts +1 -1
- package/src/_retirement.ts +70 -0
- package/src/bindings.ts +77 -0
- package/src/classify.ts +13 -4
- package/src/metadata-cache.ts +6 -11
- package/src/metadata.ts +43 -77
- package/src/model-client.ts +13 -8
- package/src/policy.ts +45 -1
- package/src/reasoning-translation.ts +7 -4
package/lib/src/metadata.js
CHANGED
|
@@ -11,26 +11,23 @@
|
|
|
11
11
|
* @module
|
|
12
12
|
*/
|
|
13
13
|
import * as functionUtils from "@dbx-tools/shared-core/function-utils";
|
|
14
|
-
import * as log from "@dbx-tools/shared-core/log";
|
|
15
14
|
import { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, } from "./_metadata-contract.js";
|
|
16
15
|
import { parseModelCapabilities, parseModelRateLimits, parseReasoningModels, parseRetiredModels, } from "./_metadata-generator.js";
|
|
17
|
-
import {
|
|
16
|
+
import { COMMITTED_RETIRED_MODELS, modelStatusFor, replaceRetiredModelNames, RETIRED_MODELS_GENERATED_AT, } from "./_retirement.js";
|
|
18
17
|
import capabilitiesSnapshotJson from "./generated/model-capabilities.json" with { type: "json" };
|
|
19
18
|
import rateLimitsSnapshotJson from "./generated/model-rate-limits.json" with { type: "json" };
|
|
20
19
|
import reasoningSnapshotJson from "./generated/model-reasoning.json" with { type: "json" };
|
|
21
|
-
import
|
|
22
|
-
import { modelSearchQuery } from "./policy.js";
|
|
20
|
+
import { createMetadataCache, mergePreferFreshList, mergePreferFreshRecord, } from "./metadata-cache.js";
|
|
21
|
+
import { inheritsNativeWebSearch, isFoundationModelIdentity, modelSearchQuery } from "./policy.js";
|
|
23
22
|
import { defaultReasoningLevels, documentedReasoningLevels, parseReasoning, parseReasoningLevels, uniqueReasoningLevels, } from "./reasoning-translation.js";
|
|
24
23
|
export { MODEL_METADATA_TTL_MS, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, };
|
|
25
|
-
const logger = log.logger("model/metadata");
|
|
26
|
-
const retiredModelsSnapshot = retiredModelsSnapshotJson;
|
|
27
24
|
const capabilitiesSnapshot = capabilitiesSnapshotJson;
|
|
28
25
|
const rateLimitsSnapshot = rateLimitsSnapshotJson;
|
|
29
26
|
const reasoningSnapshot = reasoningSnapshotJson;
|
|
30
27
|
const USER_AGENT = "dbx-tools-model-metadata/1";
|
|
31
28
|
const retiredCache = createMetadataCache({
|
|
32
29
|
key: "retired-models",
|
|
33
|
-
fallback:
|
|
30
|
+
fallback: COMMITTED_RETIRED_MODELS,
|
|
34
31
|
load: async () => parseRetiredModels(await loadPage(RETIRED_MODELS_URL), nowSeconds()).models,
|
|
35
32
|
merge: mergePreferFreshList,
|
|
36
33
|
});
|
|
@@ -88,7 +85,7 @@ let liveIndex;
|
|
|
88
85
|
const metadataIndex = functionUtils.memoize(() => liveIndex ?? buildIndexFromCommitted());
|
|
89
86
|
function buildIndexFromCommitted() {
|
|
90
87
|
return buildIndex({
|
|
91
|
-
retiredNames:
|
|
88
|
+
retiredNames: COMMITTED_RETIRED_MODELS,
|
|
92
89
|
capabilities: capabilitiesSnapshot.capabilities,
|
|
93
90
|
rateLimits: rateLimitsSnapshot.catalogue.models,
|
|
94
91
|
reasoning: reasoningSnapshot.catalogue.models,
|
|
@@ -96,9 +93,8 @@ function buildIndexFromCommitted() {
|
|
|
96
93
|
});
|
|
97
94
|
}
|
|
98
95
|
function buildIndex(input) {
|
|
96
|
+
replaceRetiredModelNames(input.retiredNames);
|
|
99
97
|
return {
|
|
100
|
-
retiredNames: Object.freeze([...input.retiredNames]),
|
|
101
|
-
retiredKeys: new Set(input.retiredNames.map(retiredModelKey).filter(Boolean)),
|
|
102
98
|
capabilities: {
|
|
103
99
|
responses: new Set(input.capabilities.responses),
|
|
104
100
|
imageInput: new Set(input.capabilities.imageInput),
|
|
@@ -152,13 +148,10 @@ export async function refreshModelMetadata() {
|
|
|
152
148
|
});
|
|
153
149
|
return refreshInflight;
|
|
154
150
|
}
|
|
155
|
-
void hydrateModelMetadata().catch((error) => {
|
|
156
|
-
logger.warn("metadata cache hydrate failed; using committed snapshots", { error });
|
|
157
|
-
});
|
|
158
151
|
/** Load cacache / memory entries without forcing a network refresh. */
|
|
159
152
|
export async function hydrateModelMetadata() {
|
|
160
153
|
const [retiredNames, capabilities, rateLimits, reasoning, learnedReasoning] = await Promise.all([
|
|
161
|
-
peekOrFallback(retiredCache,
|
|
154
|
+
peekOrFallback(retiredCache, COMMITTED_RETIRED_MODELS),
|
|
162
155
|
peekOrFallback(capabilitiesCache, capabilitiesSnapshot.capabilities),
|
|
163
156
|
peekOrFallback(rateLimitsCache, rateLimitsSnapshot.catalogue.models),
|
|
164
157
|
peekOrFallback(reasoningDocsCache, reasoningSnapshot.catalogue.models),
|
|
@@ -183,10 +176,7 @@ async function peekOrFallback(cache, fallback) {
|
|
|
183
176
|
export function modelMetadataCachePath() {
|
|
184
177
|
return retiredCache.path;
|
|
185
178
|
}
|
|
186
|
-
|
|
187
|
-
export function retiredModelNames() {
|
|
188
|
-
return metadataIndex().retiredNames;
|
|
189
|
-
}
|
|
179
|
+
export { modelStatusFor, retiredModelNames } from "./_retirement.js";
|
|
190
180
|
/** Return the committed reasoning-effort catalogue. Cached per process. */
|
|
191
181
|
export function reasoningModelCatalogue() {
|
|
192
182
|
return metadataIndex().reasoning;
|
|
@@ -229,30 +219,19 @@ export async function rememberReasoningLevels(model, levels) {
|
|
|
229
219
|
export async function learnReasoningLevelsFromError(model, body) {
|
|
230
220
|
return rememberReasoningLevels(model, parseReasoningLevels(body));
|
|
231
221
|
}
|
|
232
|
-
/** Resolve whether any supplied identity is listed in the retirement snapshot. */
|
|
233
|
-
export function modelStatusFor(...models) {
|
|
234
|
-
const retired = metadataIndex().retiredKeys;
|
|
235
|
-
const deprecated = models
|
|
236
|
-
.flatMap((model) => modelIdentities(model))
|
|
237
|
-
.some((identity) => {
|
|
238
|
-
const candidate = retiredModelKey(identity);
|
|
239
|
-
for (const key of retired) {
|
|
240
|
-
if (candidate === key || candidate.startsWith(`${key}-`))
|
|
241
|
-
return true;
|
|
242
|
-
}
|
|
243
|
-
return false;
|
|
244
|
-
});
|
|
245
|
-
return { deprecated };
|
|
246
|
-
}
|
|
247
222
|
/** Resolve documented model capabilities from a name or endpoint summary. */
|
|
248
223
|
export function modelCapabilitiesFor(model) {
|
|
249
224
|
const capabilities = metadataIndex().capabilities;
|
|
250
|
-
const
|
|
225
|
+
const identities = modelIdentities(model, false);
|
|
226
|
+
const keys = identities.flatMap((identity) => modelKey(identity) ?? []);
|
|
251
227
|
return {
|
|
252
228
|
responses: keys.some((key) => capabilities.responses.has(key)),
|
|
253
229
|
imageInput: keys.some((key) => capabilities.imageInput.has(key)),
|
|
254
230
|
applyPatch: keys.some((key) => capabilities.applyPatch.has(key)),
|
|
255
|
-
|
|
231
|
+
// Version inheritance only applies to hosted foundation identities.
|
|
232
|
+
webSearch: keys.some((key) => capabilities.webSearch.has(key)) ||
|
|
233
|
+
identities.some((identity) => isFoundationModelIdentity(identity) &&
|
|
234
|
+
inheritsNativeWebSearch(identity, capabilities.webSearch)),
|
|
256
235
|
};
|
|
257
236
|
}
|
|
258
237
|
/** Resolve published ITPM, OTPM, and QPH limits from a model identity. */
|
|
@@ -302,7 +281,7 @@ export function modelMetadataFor(model) {
|
|
|
302
281
|
/** Return generation timestamps for the committed metadata snapshots. */
|
|
303
282
|
export function modelMetadataGeneratedAt() {
|
|
304
283
|
return {
|
|
305
|
-
retiredModels:
|
|
284
|
+
retiredModels: RETIRED_MODELS_GENERATED_AT,
|
|
306
285
|
capabilities: capabilitiesSnapshot.generatedAt,
|
|
307
286
|
rateLimits: rateLimitsSnapshot.generatedAt,
|
|
308
287
|
reasoning: reasoningSnapshot.generatedAt,
|
|
@@ -321,22 +300,6 @@ function modelIdentities(model, includeDisplayName = true) {
|
|
|
321
300
|
function modelKey(value) {
|
|
322
301
|
return modelSearchQuery(value)?.replaceAll(" ", "-");
|
|
323
302
|
}
|
|
324
|
-
const RETIRED_MODEL_PREFIXES = new Set([
|
|
325
|
-
"ai",
|
|
326
|
-
"anthropic",
|
|
327
|
-
"databricks",
|
|
328
|
-
"dbx",
|
|
329
|
-
"google",
|
|
330
|
-
"meta",
|
|
331
|
-
"openai",
|
|
332
|
-
"system",
|
|
333
|
-
]);
|
|
334
|
-
function retiredModelKey(value) {
|
|
335
|
-
const tokens = value.toLowerCase().match(/[a-z0-9]+/g) ?? [];
|
|
336
|
-
while (tokens[0] && RETIRED_MODEL_PREFIXES.has(tokens[0]))
|
|
337
|
-
tokens.shift();
|
|
338
|
-
return tokens.join("-");
|
|
339
|
-
}
|
|
340
303
|
async function loadPage(url) {
|
|
341
304
|
const response = await fetch(url, {
|
|
342
305
|
headers: { "user-agent": USER_AGENT },
|
|
@@ -350,4 +313,4 @@ async function loadPage(url) {
|
|
|
350
313
|
function nowSeconds() {
|
|
351
314
|
return Math.floor(Date.now() / 1000);
|
|
352
315
|
}
|
|
353
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxPQUFPLEtBQUssYUFBYSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3ZFLE9BQU8sS0FBSyxHQUFHLE1BQU0sNEJBQTRCLENBQUM7QUFTbEQsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsMkJBQTJCLEVBQzNCLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbEIscUJBQXFCLEdBTXRCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLHNCQUFzQixHQUV2QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sd0JBQXdCLE1BQU0scUNBQXFDLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDakcsT0FBTyxzQkFBc0IsTUFBTSxvQ0FBb0MsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUM5RixPQUFPLHFCQUFxQixNQUFNLGtDQUFrQyxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzNGLE9BQU8seUJBQXlCLE1BQU0saUNBQWlDLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDOUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIseUJBQXlCLEVBQ3pCLGNBQWMsRUFDZCxvQkFBb0IsRUFHcEIscUJBQXFCLEdBQ3RCLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixx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Q0FBQyxDQUFDO1FBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsS0FBSyxVQUFVLFFBQVEsQ0FBQyxHQUFXO0lBQ2pDLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRTtRQUNoQyxPQUFPLEVBQUUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFO1FBQ3JDLE1BQU0sRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztLQUNwQyxDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDekIsQ0FBQztBQUVELFNBQVMsVUFBVTtJQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJ1aWxkLWdlbmVyYXRlZCBEYXRhYnJpY2tzIG1vZGVsIHJldGlyZW1lbnQsIGNhcGFiaWxpdHksIHJhdGUtbGltaXQsIGFuZFxuICogcmVhc29uaW5nLWVmZm9ydCBtZXRhZGF0YSwgcGx1cyBhIGRhaWx5IHdyaXRlLXRocm91Z2ggY2FjaGUgZm9yIHJlZnJlc2hlZFxuICogZG9jcyBhbmQgZXJyb3ItbGVhcm5lZCByZWFzb25pbmcgbGFkZGVycy5cbiAqXG4gKiBDb21taXR0ZWQgc25hcHNob3RzIHNlZWQgZXZlcnkgcHJvY2Vzcy4ge0BsaW5rIHJlZnJlc2hNb2RlbE1ldGFkYXRhfSBwdWxsc1xuICogZG9jdW1lbnRhdGlvbiB0aHJvdWdoIHtAbGluayBjcmVhdGVNZXRhZGF0YUNhY2hlfSAoY2FjYWNoZSBtZW1vaXplICsgZGlzaykgYW5kXG4gKiByZWJ1aWxkcyB0aGUgaW4tbWVtb3J5IGluZGV4LiBFcnJvci1sZWFybmVkIGVmZm9ydHMgdXNlIHRoZSBzYW1lIHN0b3JlIHZpYVxuICoge0BsaW5rIHJlbWVtYmVyUmVhc29uaW5nTGV2ZWxzfS4gRGlzayB3cml0ZXMgYXJlIHNraXBwZWQgaW4gRGF0YWJyaWNrcyBBcHBzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0ICogYXMgZnVuY3Rpb25VdGlscyBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9mdW5jdGlvbi11dGlsc1wiO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2xvZ1wiO1xuaW1wb3J0IHR5cGUge1xuICBNb2RlbENhcGFiaWxpdGllcyxcbiAgTW9kZWxNZXRhZGF0YSxcbiAgTW9kZWxSYXRlTGltaXRzLFxuICBNb2RlbFN0YXR1cyxcbiAgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuXG5pbXBvcnQge1xuICBNT0RFTF9NRVRBREFUQV9UVExfTVMsXG4gIE1PREVMX1JBVEVfTElNSVRTX1VSTCxcbiAgT1BFTkFJX1JFU1BPTlNFU19NT0RFTFNfVVJMLFxuICBRVUVSWV9SRUFTT05fTU9ERUxTX1VSTCxcbiAgUkVUSVJFRF9NT0RFTFNfVVJMLFxuICBXRUJfU0VBUkNIX01PREVMU19VUkwsXG4gIHR5cGUgTW9kZWxDYXBhYmlsaXRpZXNTbmFwc2hvdCxcbiAgdHlwZSBNb2RlbENhcGFiaWxpdHlDYXRhbG9ndWUsXG4gIHR5cGUgTW9kZWxSYXRlTGltaXRzU25hcHNob3QsXG4gIHR5cGUgUmVhc29uaW5nTW9kZWxzU25hcHNob3QsXG4gIHR5cGUgUmV0aXJlZE1vZGVsc1NuYXBzaG90LFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtY29udHJhY3QudHNcIjtcbmltcG9ydCB7XG4gIHBhcnNlTW9kZWxDYXBhYmlsaXRpZXMsXG4gIHBhcnNlTW9kZWxSYXRlTGltaXRzLFxuICBwYXJzZVJlYXNvbmluZ01vZGVscyxcbiAgcGFyc2VSZXRpcmVkTW9kZWxzLFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVNZXRhZGF0YUNhY2hlLFxuICBtZXJnZVByZWZlckZyZXNoTGlzdCxcbiAgbWVyZ2VQcmVmZXJGcmVzaFJlY29yZCxcbiAgdHlwZSBNZXRhZGF0YUNhY2hlLFxufSBmcm9tIFwiLi9tZXRhZGF0YS1jYWNoZS50c1wiO1xuaW1wb3J0IGNhcGFiaWxpdGllc1NuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvbW9kZWwtY2FwYWJpbGl0aWVzLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCByYXRlTGltaXRzU25hcHNob3RKc29uIGZyb20gXCIuL2dlbmVyYXRlZC9tb2RlbC1yYXRlLWxpbWl0cy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgcmVhc29uaW5nU25hcHNob3RKc29uIGZyb20gXCIuL2dlbmVyYXRlZC9tb2RlbC1yZWFzb25pbmcuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IHJldGlyZWRNb2RlbHNTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL3JldGlyZWQtbW9kZWxzLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCB7IG1vZGVsU2VhcmNoUXVlcnkgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcbmltcG9ydCB7XG4gIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMsXG4gIGRvY3VtZW50ZWRSZWFzb25pbmdMZXZlbHMsXG4gIHBhcnNlUmVhc29uaW5nLFxuICBwYXJzZVJlYXNvbmluZ0xldmVscyxcbiAgdHlwZSBSZWFzb25pbmdMZXZlbCxcbiAgdHlwZSBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSxcbiAgdW5pcXVlUmVhc29uaW5nTGV2ZWxzLFxufSBmcm9tIFwiLi9yZWFzb25pbmctdHJhbnNsYXRpb24udHNcIjtcblxuZXhwb3J0IHtcbiAgTU9ERUxfTUVUQURBVEFfVFRMX01TLFxuICBNT0RFTF9SQVRFX0xJTUlUU19VUkwsXG4gIE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCxcbiAgUVVFUllfUkVBU09OX01PREVMU19VUkwsXG4gIFJFVElSRURfTU9ERUxTX1VSTCxcbiAgV0VCX1NFQVJDSF9NT0RFTFNfVVJMLFxufTtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1vZGVsL21ldGFkYXRhXCIpO1xuXG5jb25zdCByZXRpcmVkTW9kZWxzU25hcHNob3QgPSByZXRpcmVkTW9kZWxzU25hcHNob3RKc29uIGFzIFJldGlyZWRNb2RlbHNTbmFwc2hvdDtcbmNvbnN0IGNhcGFiaWxpdGllc1NuYXBzaG90ID0gY2FwYWJpbGl0aWVzU25hcHNob3RKc29uIGFzIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3Q7XG5jb25zdCByYXRlTGltaXRzU25hcHNob3QgPSByYXRlTGltaXRzU25hcHNob3RKc29uIGFzIE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90O1xuY29uc3QgcmVhc29uaW5nU25hcHNob3QgPSByZWFzb25pbmdTbmFwc2hvdEpzb24gYXMgUmVhc29uaW5nTW9kZWxzU25hcHNob3Q7XG5cbmludGVyZmFjZSBNZXRhZGF0YUluZGV4IHtcbiAgcmVhZG9ubHkgcmV0aXJlZE5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcmV0aXJlZEtleXM6IFJlYWRvbmx5U2V0PHN0cmluZz47XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczoge1xuICAgIHJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlXTogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcbiAgfTtcbiAgcmVhZG9ubHkgcmF0ZUxpbWl0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlO1xuICByZWFkb25seSBsZWFybmVkUmVhc29uaW5nOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbn1cblxudHlwZSBDYXBhYmlsaXR5U2V0cyA9IE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZTtcblxuY29uc3QgVVNFUl9BR0VOVCA9IFwiZGJ4LXRvb2xzLW1vZGVsLW1ldGFkYXRhLzFcIjtcblxuY29uc3QgcmV0aXJlZENhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxyZWFkb25seSBzdHJpbmdbXT4oe1xuICBrZXk6IFwicmV0aXJlZC1tb2RlbHNcIixcbiAgZmFsbGJhY2s6IHJldGlyZWRNb2RlbHNTbmFwc2hvdC5tb2RlbHMsXG4gIGxvYWQ6IGFzeW5jICgpID0+IHBhcnNlUmV0aXJlZE1vZGVscyhhd2FpdCBsb2FkUGFnZShSRVRJUkVEX01PREVMU19VUkwpLCBub3dTZWNvbmRzKCkpLm1vZGVscyxcbiAgbWVyZ2U6IG1lcmdlUHJlZmVyRnJlc2hMaXN0LFxufSk7XG5cbmNvbnN0IGNhcGFiaWxpdGllc0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxDYXBhYmlsaXR5U2V0cz4oe1xuICBrZXk6IFwibW9kZWwtY2FwYWJpbGl0aWVzXCIsXG4gIGZhbGxiYWNrOiBjYXBhYmlsaXRpZXNTbmFwc2hvdC5jYXBhYmlsaXRpZXMsXG4gIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbcmVzcG9uc2VzSHRtbCwgd2ViU2VhcmNoSHRtbF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBsb2FkUGFnZShPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwpLFxuICAgICAgbG9hZFBhZ2UoV0VCX1NFQVJDSF9NT0RFTFNfVVJMKSxcbiAgICBdKTtcbiAgICByZXR1cm4gcGFyc2VNb2RlbENhcGFiaWxpdGllcyhyZXNwb25zZXNIdG1sLCB3ZWJTZWFyY2hIdG1sLCBub3dTZWNvbmRzKCkpLmNhcGFiaWxpdGllcztcbiAgfSxcbiAgbWVyZ2U6IChpbnB1dCkgPT4gKHtcbiAgICByZXNwb25zZXM6IG1lcmdlUHJlZmVyRnJlc2hMaXN0KHtcbiAgICAgIGZyZXNoOiBpbnB1dC5mcmVzaD8ucmVzcG9uc2VzLFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5yZXNwb25zZXMsXG4gICAgICBmYWxsYmFjazogaW5wdXQuZmFsbGJhY2sucmVzcG9uc2VzLFxuICAgIH0pLFxuICAgIGltYWdlSW5wdXQ6IG1lcmdlUHJlZmVyRnJlc2hMaXN0KHtcbiAgICAgIGZyZXNoOiBpbnB1dC5mcmVzaD8uaW1hZ2VJbnB1dCxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8uaW1hZ2VJbnB1dCxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay5pbWFnZUlucHV0LFxuICAgIH0pLFxuICAgIGFwcGx5UGF0Y2g6IG1lcmdlUHJlZmVyRnJlc2hMaXN0KHtcbiAgICAgIGZyZXNoOiBpbnB1dC5mcmVzaD8uYXBwbHlQYXRjaCxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8uYXBwbHlQYXRjaCxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay5hcHBseVBhdGNoLFxuICAgIH0pLFxuICAgIHdlYlNlYXJjaDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy53ZWJTZWFyY2gsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/LndlYlNlYXJjaCxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay53ZWJTZWFyY2gsXG4gICAgfSksXG4gIH0pLFxufSk7XG5cbmNvbnN0IHJhdGVMaW1pdHNDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgTW9kZWxSYXRlTGltaXRzPj4+KHtcbiAga2V5OiBcIm1vZGVsLXJhdGUtbGltaXRzXCIsXG4gIGZhbGxiYWNrOiByYXRlTGltaXRzU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyxcbiAgbG9hZDogYXN5bmMgKCkgPT5cbiAgICBwYXJzZU1vZGVsUmF0ZUxpbWl0cyhhd2FpdCBsb2FkUGFnZShNT0RFTF9SQVRFX0xJTUlUU19VUkwpLCBub3dTZWNvbmRzKCkpLmNhdGFsb2d1ZS5tb2RlbHMsXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmNvbnN0IHJlYXNvbmluZ0RvY3NDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+Pj4oe1xuICBrZXk6IFwibW9kZWwtcmVhc29uaW5nXCIsXG4gIGZhbGxiYWNrOiByZWFzb25pbmdTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzLFxuICBsb2FkOiBhc3luYyAoKSA9PlxuICAgIHBhcnNlUmVhc29uaW5nTW9kZWxzKGF3YWl0IGxvYWRQYWdlKFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMKSwgbm93U2Vjb25kcygpKS5jYXRhbG9ndWUubW9kZWxzLFxuICBtZXJnZTogbWVyZ2VQcmVmZXJGcmVzaFJlY29yZCxcbn0pO1xuXG5jb25zdCBsZWFybmVkUmVhc29uaW5nQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pj4oe1xuICBrZXk6IFwibGVhcm5lZC1yZWFzb25pbmdcIixcbiAgZmFsbGJhY2s6IHt9LFxuICBtZXJnZTogbWVyZ2VQcmVmZXJGcmVzaFJlY29yZCxcbn0pO1xuXG5sZXQgbGl2ZUluZGV4OiBNZXRhZGF0YUluZGV4IHwgdW5kZWZpbmVkO1xuXG5jb25zdCBtZXRhZGF0YUluZGV4ID0gZnVuY3Rpb25VdGlscy5tZW1vaXplPE1ldGFkYXRhSW5kZXg+KCgpID0+IGxpdmVJbmRleCA/PyBidWlsZEluZGV4RnJvbUNvbW1pdHRlZCgpKTtcblxuZnVuY3Rpb24gYnVpbGRJbmRleEZyb21Db21taXR0ZWQoKTogTWV0YWRhdGFJbmRleCB7XG4gIHJldHVybiBidWlsZEluZGV4KHtcbiAgICByZXRpcmVkTmFtZXM6IHJldGlyZWRNb2RlbHNTbmFwc2hvdC5tb2RlbHMsXG4gICAgY2FwYWJpbGl0aWVzOiBjYXBhYmlsaXRpZXNTbmFwc2hvdC5jYXBhYmlsaXRpZXMsXG4gICAgcmF0ZUxpbWl0czogcmF0ZUxpbWl0c1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gICAgcmVhc29uaW5nOiByZWFzb25pbmdTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzLFxuICAgIGxlYXJuZWRSZWFzb25pbmc6IHt9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRJbmRleChpbnB1dDoge1xuICByZWFkb25seSByZXRpcmVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IENhcGFiaWxpdHlTZXRzO1xuICByZWFkb25seSByYXRlTGltaXRzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+PjtcbiAgcmVhZG9ubHkgcmVhc29uaW5nOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+O1xuICByZWFkb25seSBsZWFybmVkUmVhc29uaW5nOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj47XG59KTogTWV0YWRhdGFJbmRleCB7XG4gIHJldHVybiB7XG4gICAgcmV0aXJlZE5hbWVzOiBPYmplY3QuZnJlZXplKFsuLi5pbnB1dC5yZXRpcmVkTmFtZXNdKSxcbiAgICByZXRpcmVkS2V5czogbmV3IFNldChpbnB1dC5yZXRpcmVkTmFtZXMubWFwKHJldGlyZWRNb2RlbEtleSkuZmlsdGVyKEJvb2xlYW4pKSxcbiAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgIHJlc3BvbnNlczogbmV3IFNldChpbnB1dC5jYXBhYmlsaXRpZXMucmVzcG9uc2VzKSxcbiAgICAgIGltYWdlSW5wdXQ6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLmltYWdlSW5wdXQpLFxuICAgICAgYXBwbHlQYXRjaDogbmV3IFNldChpbnB1dC5jYXBhYmlsaXRpZXMuYXBwbHlQYXRjaCksXG4gICAgICB3ZWJTZWFyY2g6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCksXG4gICAgfSxcbiAgICByYXRlTGltaXRzOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGlucHV0LnJhdGVMaW1pdHMpKSxcbiAgICByZWFzb25pbmc6IGZyZWV6ZVJlYXNvbmluZ0NhdGFsb2d1ZShpbnB1dC5yZWFzb25pbmcpLFxuICAgIGxlYXJuZWRSZWFzb25pbmc6IGZyZWV6ZUxlYXJuZWRDYXRhbG9ndWUoaW5wdXQubGVhcm5lZFJlYXNvbmluZyksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZyZWV6ZVJlYXNvbmluZ0NhdGFsb2d1ZShcbiAgbW9kZWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+LFxuKTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhtb2RlbHMpLm1hcCgoW2tleSwgbGV2ZWxzXSkgPT4gW1xuICAgICAgICBrZXksXG4gICAgICAgIE9iamVjdC5mcmVlemUoXG4gICAgICAgICAgdW5pcXVlUmVhc29uaW5nTGV2ZWxzKGxldmVscy5mbGF0TWFwKChsZXZlbCkgPT4gcGFyc2VSZWFzb25pbmcobGV2ZWwpID8/IFtdKSksXG4gICAgICAgICksXG4gICAgICBdKSxcbiAgICApLFxuICApO1xufVxuXG5mdW5jdGlvbiBmcmVlemVMZWFybmVkQ2F0YWxvZ3VlKFxuICBtb2RlbHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pixcbik6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMobW9kZWxzKS5tYXAoKFtrZXksIGxldmVsc10pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICBPYmplY3QuZnJlZXplKHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMpKSxcbiAgICAgIF0pLFxuICAgICksXG4gICk7XG59XG5cbmxldCByZWZyZXNoSW5mbGlnaHQ6IFByb21pc2U8TWV0YWRhdGFJbmRleD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogSHlkcmF0ZSBvciByZWZyZXNoIGRvY3VtZW50YXRpb24gKyBsZWFybmVkIGNhY2hlcyBpbnRvIHRoZSBwcm9jZXNzIGluZGV4LlxuICpcbiAqIFNhZmUgdG8gY2FsbCBvbiBnYXRld2F5IHN0YXJ0dXAuIENvbmN1cnJlbnQgY2FsbGVycyBzaGFyZSBvbmUgcmVmcmVzaC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hNb2RlbE1ldGFkYXRhKCk6IFByb21pc2U8TWV0YWRhdGFJbmRleD4ge1xuICBpZiAocmVmcmVzaEluZmxpZ2h0KSByZXR1cm4gcmVmcmVzaEluZmxpZ2h0O1xuICByZWZyZXNoSW5mbGlnaHQgPSAoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtyZXRpcmVkTmFtZXMsIGNhcGFiaWxpdGllcywgcmF0ZUxpbWl0cywgcmVhc29uaW5nLCBsZWFybmVkUmVhc29uaW5nXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHJldGlyZWRDYWNoZS5nZXQoKSxcbiAgICAgIGNhcGFiaWxpdGllc0NhY2hlLmdldCgpLFxuICAgICAgcmF0ZUxpbWl0c0NhY2hlLmdldCgpLFxuICAgICAgcmVhc29uaW5nRG9jc0NhY2hlLmdldCgpLFxuICAgICAgbGVhcm5lZFJlYXNvbmluZ0NhY2hlLmdldCgpLFxuICAgIF0pO1xuICAgIGxpdmVJbmRleCA9IGJ1aWxkSW5kZXgoe1xuICAgICAgcmV0aXJlZE5hbWVzLFxuICAgICAgY2FwYWJpbGl0aWVzLFxuICAgICAgcmF0ZUxpbWl0cyxcbiAgICAgIHJlYXNvbmluZyxcbiAgICAgIGxlYXJuZWRSZWFzb25pbmcsXG4gICAgfSk7XG4gICAgcmV0dXJuIGxpdmVJbmRleDtcbiAgfSkoKS5maW5hbGx5KCgpID0+IHtcbiAgICByZWZyZXNoSW5mbGlnaHQgPSB1bmRlZmluZWQ7XG4gIH0pO1xuICByZXR1cm4gcmVmcmVzaEluZmxpZ2h0O1xufVxuXG52b2lkIGh5ZHJhdGVNb2RlbE1ldGFkYXRhKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gIGxvZ2dlci53YXJuKFwibWV0YWRhdGEgY2FjaGUgaHlkcmF0ZSBmYWlsZWQ7IHVzaW5nIGNvbW1pdHRlZCBzbmFwc2hvdHNcIiwgeyBlcnJvciB9KTtcbn0pO1xuXG4vKiogTG9hZCBjYWNhY2hlIC8gbWVtb3J5IGVudHJpZXMgd2l0aG91dCBmb3JjaW5nIGEgbmV0d29yayByZWZyZXNoLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVNb2RlbE1ldGFkYXRhKCk6IFByb21pc2U8TWV0YWRhdGFJbmRleD4ge1xuICBjb25zdCBbcmV0aXJlZE5hbWVzLCBjYXBhYmlsaXRpZXMsIHJhdGVMaW1pdHMsIHJlYXNvbmluZywgbGVhcm5lZFJlYXNvbmluZ10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgcGVla09yRmFsbGJhY2socmV0aXJlZENhY2hlLCByZXRpcmVkTW9kZWxzU25hcHNob3QubW9kZWxzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhjYXBhYmlsaXRpZXNDYWNoZSwgY2FwYWJpbGl0aWVzU25hcHNob3QuY2FwYWJpbGl0aWVzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyYXRlTGltaXRzQ2FjaGUsIHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyZWFzb25pbmdEb2NzQ2FjaGUsIHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMpLFxuICAgIHBlZWtPckZhbGxiYWNrKGxlYXJuZWRSZWFzb25pbmdDYWNoZSwge30pLFxuICBdKTtcbiAgbGl2ZUluZGV4ID0gYnVpbGRJbmRleCh7XG4gICAgcmV0aXJlZE5hbWVzLFxuICAgIGNhcGFiaWxpdGllcyxcbiAgICByYXRlTGltaXRzLFxuICAgIHJlYXNvbmluZyxcbiAgICBsZWFybmVkUmVhc29uaW5nLFxuICB9KTtcbiAgcmV0dXJuIGxpdmVJbmRleDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGVla09yRmFsbGJhY2s8VD4oY2FjaGU6IE1ldGFkYXRhQ2FjaGU8VD4sIGZhbGxiYWNrOiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHBlZWtlZCA9IGF3YWl0IGNhY2hlLnBlZWsoKTtcbiAgaWYgKHBlZWtlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcGVla2VkO1xuICByZXR1cm4gY2FjaGUuZ2V0KCkuY2F0Y2goKCkgPT4gZmFsbGJhY2spO1xufVxuXG4vKiogQWJzb2x1dGUgY2FjYWNoZSByb290IHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gLyBsZWFybmVkIGNhY2hlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbE1ldGFkYXRhQ2FjaGVQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiByZXRpcmVkQ2FjaGUucGF0aDtcbn1cblxuLyoqIFJldHVybiB0aGUgY29tbWl0dGVkIHJldGlyZWQtbW9kZWwgbmFtZXMuIFRoZSBhcnJheSBpcyBjYWNoZWQgYW5kIGltbXV0YWJsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXRpcmVkTW9kZWxOYW1lcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIHJldHVybiBtZXRhZGF0YUluZGV4KCkucmV0aXJlZE5hbWVzO1xufVxuXG4vKiogUmV0dXJuIHRoZSBjb21taXR0ZWQgcmVhc29uaW5nLWVmZm9ydCBjYXRhbG9ndWUuIENhY2hlZCBwZXIgcHJvY2Vzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFzb25pbmdNb2RlbENhdGFsb2d1ZSgpOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBtZXRhZGF0YUluZGV4KCkucmVhc29uaW5nO1xufVxuXG4vKiogUmV0dXJuIGVycm9yLWxlYXJuZWQgcmVhc29uaW5nIGxhZGRlcnMgcGVyc2lzdGVkIGluIHRoZSBtZXRhZGF0YSBjYWNoZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZWFybmVkUmVhc29uaW5nQ2F0YWxvZ3VlKCk6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIG1ldGFkYXRhSW5kZXgoKS5sZWFybmVkUmVhc29uaW5nO1xufVxuXG4vKipcbiAqIFN0b3JlIGxldmVscyBsZWFybmVkIGZyb20gYW4gdXBzdHJlYW0gZXJyb3IgYW5kIHBlcnNpc3QgdGhlbSB3cml0ZS10aHJvdWdoLlxuICpcbiAqIEVtcHR5IGxpc3RzIGFyZSBpZ25vcmVkIHNvIGEgZmFpbGVkIHBhcnNlIGNhbm5vdCB3aXBlIGRlZmF1bHRzLiBFcnJvciBib2RpZXNcbiAqIHRoZW1zZWx2ZXMgYXJlIG5ldmVyIHN0b3JlZCAtIG9ubHkgdGhlIHBhcnNlZCBsYWRkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1lbWJlclJlYXNvbmluZ0xldmVscyhcbiAgbW9kZWw6IHN0cmluZyxcbiAgbGV2ZWxzOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdLFxuKTogUHJvbWlzZTxSZWFzb25pbmdMZXZlbFtdPiB7XG4gIGNvbnN0IHVuaXF1ZSA9IHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMpO1xuICBpZiAodW5pcXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG1vZGVsUmVhc29uaW5nTGV2ZWxzRm9yKG1vZGVsKTtcbiAgY29uc3Qga2V5ID0gbW9kZWxLZXkobW9kZWwpO1xuICBpZiAoIWtleSkgcmV0dXJuIG1vZGVsUmVhc29uaW5nTGV2ZWxzRm9yKG1vZGVsKTtcbiAgY29uc3QgY2F0YWxvZ3VlID0gYXdhaXQgbGVhcm5lZFJlYXNvbmluZ0NhY2hlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHtcbiAgICAuLi5jdXJyZW50LFxuICAgIFtrZXldOiB1bmlxdWUsXG4gIH0pKTtcbiAgY29uc3QgY3VycmVudCA9IG1ldGFkYXRhSW5kZXgoKTtcbiAgbGl2ZUluZGV4ID0ge1xuICAgIC4uLmN1cnJlbnQsXG4gICAgbGVhcm5lZFJlYXNvbmluZzogZnJlZXplTGVhcm5lZENhdGFsb2d1ZShjYXRhbG9ndWUpLFxuICB9O1xuICByZXR1cm4gWy4uLnVuaXF1ZV07XG59XG5cbi8qKlxuICogUGFyc2UgYW4gdXBzdHJlYW0gZXJyb3IgYm9keSBhbmQgcGVyc2lzdCB0aGUgc3VwcG9ydGVkIGxhZGRlciBmb3IgYG1vZGVsYC5cbiAqXG4gKiBBY2NlcHRzIHRoZSBzYW1lIG5lc3RlZCBEYXRhYnJpY2tzIGVudmVsb3BlcyBhcyB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9LlxuICogUmV0dXJucyB0aGUgbGV2ZWxzIHRoYXQgd2VyZSBzdG9yZWQgKG9yIHRoZSBjdXJyZW50IGxvb2t1cCB3aGVuIHBhcnNlIHlpZWxkc1xuICogbm90aGluZykuIFRoZSByYXcgZXJyb3IgYm9keSBpcyBuZXZlciB3cml0dGVuIHRvIGRpc2suXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsZWFyblJlYXNvbmluZ0xldmVsc0Zyb21FcnJvcihcbiAgbW9kZWw6IHN0cmluZyxcbiAgYm9keTogdW5rbm93bixcbik6IFByb21pc2U8UmVhc29uaW5nTGV2ZWxbXT4ge1xuICByZXR1cm4gcmVtZW1iZXJSZWFzb25pbmdMZXZlbHMobW9kZWwsIHBhcnNlUmVhc29uaW5nTGV2ZWxzKGJvZHkpKTtcbn1cblxuLyoqIFJlc29sdmUgd2hldGhlciBhbnkgc3VwcGxpZWQgaWRlbnRpdHkgaXMgbGlzdGVkIGluIHRoZSByZXRpcmVtZW50IHNuYXBzaG90LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsU3RhdHVzRm9yKFxuICAuLi5tb2RlbHM6IHJlYWRvbmx5IChzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KVtdXG4pOiBNb2RlbFN0YXR1cyB7XG4gIGNvbnN0IHJldGlyZWQgPSBtZXRhZGF0YUluZGV4KCkucmV0aXJlZEtleXM7XG4gIGNvbnN0IGRlcHJlY2F0ZWQgPSBtb2RlbHNcbiAgICAuZmxhdE1hcCgobW9kZWwpID0+IG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpXG4gICAgLnNvbWUoKGlkZW50aXR5KSA9PiB7XG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSByZXRpcmVkTW9kZWxLZXkoaWRlbnRpdHkpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmV0aXJlZCkge1xuICAgICAgICBpZiAoY2FuZGlkYXRlID09PSBrZXkgfHwgY2FuZGlkYXRlLnN0YXJ0c1dpdGgoYCR7a2V5fS1gKSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIHJldHVybiB7IGRlcHJlY2F0ZWQgfTtcbn1cblxuLyoqIFJlc29sdmUgZG9jdW1lbnRlZCBtb2RlbCBjYXBhYmlsaXRpZXMgZnJvbSBhIG5hbWUgb3IgZW5kcG9pbnQgc3VtbWFyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbENhcGFiaWxpdGllc0Zvcihtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsQ2FwYWJpbGl0aWVzIHtcbiAgY29uc3QgY2FwYWJpbGl0aWVzID0gbWV0YWRhdGFJbmRleCgpLmNhcGFiaWxpdGllcztcbiAgY29uc3Qga2V5cyA9IG1vZGVsSWRlbnRpdGllcyhtb2RlbCwgZmFsc2UpLmZsYXRNYXAoKGlkZW50aXR5KSA9PiBtb2RlbEtleShpZGVudGl0eSkgPz8gW10pO1xuICByZXR1cm4ge1xuICAgIHJlc3BvbnNlczoga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy5yZXNwb25zZXMuaGFzKGtleSkpLFxuICAgIGltYWdlSW5wdXQ6IGtleXMuc29tZSgoa2V5KSA9PiBjYXBhYmlsaXRpZXMuaW1hZ2VJbnB1dC5oYXMoa2V5KSksXG4gICAgYXBwbHlQYXRjaDoga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy5hcHBseVBhdGNoLmhhcyhrZXkpKSxcbiAgICB3ZWJTZWFyY2g6IGtleXMuc29tZSgoa2V5KSA9PiBjYXBhYmlsaXRpZXMud2ViU2VhcmNoLmhhcyhrZXkpKSxcbiAgfTtcbn1cblxuLyoqIFJlc29sdmUgcHVibGlzaGVkIElUUE0sIE9UUE0sIGFuZCBRUEggbGltaXRzIGZyb20gYSBtb2RlbCBpZGVudGl0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFJhdGVMaW1pdHNGb3IoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuKTogTW9kZWxSYXRlTGltaXRzIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbGltaXRzID0gbWV0YWRhdGFJbmRleCgpLnJhdGVMaW1pdHM7XG4gIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgbW9kZWxJZGVudGl0aWVzKG1vZGVsKSkge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsS2V5KGlkZW50aXR5KTtcbiAgICBpZiAoIWtleSkgY29udGludWU7XG4gICAgY29uc3QgZm91bmQgPSBsaW1pdHMuZ2V0KGtleSk7XG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHJlYXNvbmluZyBsZXZlbHM6IGxlYXJuZWQgZnJvbSBlcnJvcnMsIHRoZW4gZG9jdW1lbnRhdGlvbiwgdGhlblxuICogZmFtaWx5IGRlZmF1bHRzLlxuICpcbiAqIERvZXMgbm90IHBhcnNlIGVycm9yIGJvZGllczsgY2FsbGVycyBzaG91bGQgdXNlIHtAbGluayBwYXJzZVJlYXNvbmluZ0xldmVsc31cbiAqIGFuZCB0aGVuIHtAbGluayByZW1lbWJlclJlYXNvbmluZ0xldmVsc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFJlYXNvbmluZ0xldmVsc0ZvcihcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4pOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgY29uc3QgaW5kZXggPSBtZXRhZGF0YUluZGV4KCk7XG4gIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgbW9kZWxJZGVudGl0aWVzKG1vZGVsKSkge1xuICAgIGNvbnN0IGxlYXJuZWQgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKGlkZW50aXR5LCBpbmRleC5sZWFybmVkUmVhc29uaW5nKTtcbiAgICBpZiAobGVhcm5lZD8ubGVuZ3RoKSByZXR1cm4gbGVhcm5lZDtcbiAgfVxuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBkb2N1bWVudGVkID0gZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyhpZGVudGl0eSwgaW5kZXgucmVhc29uaW5nKTtcbiAgICBpZiAoZG9jdW1lbnRlZD8ubGVuZ3RoKSByZXR1cm4gZG9jdW1lbnRlZDtcbiAgfVxuICBjb25zdCBwcmltYXJ5ID1cbiAgICB0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyBtb2RlbCA6IChtb2RlbC5tb2RlbFNlcnZpY2VOYW1lID8/IG1vZGVsLm5hbWUpO1xuICByZXR1cm4gZGVmYXVsdFJlYXNvbmluZ0xldmVscyhwcmltYXJ5KTtcbn1cblxuLyoqIFJlc29sdmUgcmV0aXJlbWVudCwgY2FwYWJpbGl0eSwgYW5kIHJhdGUtbGltaXQgbWV0YWRhdGEgdG9nZXRoZXIuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxNZXRhZGF0YUZvcihtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsTWV0YWRhdGEge1xuICBjb25zdCByYXRlTGltaXRzID0gbW9kZWxSYXRlTGltaXRzRm9yKG1vZGVsKTtcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6IG1vZGVsU3RhdHVzRm9yKG1vZGVsKSxcbiAgICBjYXBhYmlsaXRpZXM6IG1vZGVsQ2FwYWJpbGl0aWVzRm9yKG1vZGVsKSxcbiAgICAuLi4ocmF0ZUxpbWl0cyA/IHsgcmF0ZUxpbWl0cyB9IDoge30pLFxuICB9O1xufVxuXG4vKiogUmV0dXJuIGdlbmVyYXRpb24gdGltZXN0YW1wcyBmb3IgdGhlIGNvbW1pdHRlZCBtZXRhZGF0YSBzbmFwc2hvdHMuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxNZXRhZGF0YUdlbmVyYXRlZEF0KCk6IFJlYWRvbmx5PHtcbiAgcmV0aXJlZE1vZGVsczogbnVtYmVyO1xuICBjYXBhYmlsaXRpZXM6IG51bWJlcjtcbiAgcmF0ZUxpbWl0czogbnVtYmVyO1xuICByZWFzb25pbmc6IG51bWJlcjtcbn0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXRpcmVkTW9kZWxzOiByZXRpcmVkTW9kZWxzU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gICAgY2FwYWJpbGl0aWVzOiBjYXBhYmlsaXRpZXNTbmFwc2hvdC5nZW5lcmF0ZWRBdCxcbiAgICByYXRlTGltaXRzOiByYXRlTGltaXRzU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gICAgcmVhc29uaW5nOiByZWFzb25pbmdTbmFwc2hvdC5nZW5lcmF0ZWRBdCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbW9kZWxJZGVudGl0aWVzKFxuICBtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgaW5jbHVkZURpc3BsYXlOYW1lID0gdHJ1ZSxcbik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFttb2RlbF07XG4gIHJldHVybiBbXG4gICAgbW9kZWwubmFtZSxcbiAgICAuLi4oaW5jbHVkZURpc3BsYXlOYW1lID8gW21vZGVsLmRpc3BsYXlOYW1lXSA6IFtdKSxcbiAgICBtb2RlbC5tb2RlbFNlcnZpY2VOYW1lLFxuICAgIC4uLk9iamVjdC52YWx1ZXMobW9kZWwuc2VydmljZU5hbWVzID8/IHt9KSxcbiAgXS5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gbW9kZWxLZXkodmFsdWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBtb2RlbFNlYXJjaFF1ZXJ5KHZhbHVlKT8ucmVwbGFjZUFsbChcIiBcIiwgXCItXCIpO1xufVxuXG5jb25zdCBSRVRJUkVEX01PREVMX1BSRUZJWEVTID0gbmV3IFNldChbXG4gIFwiYWlcIixcbiAgXCJhbnRocm9waWNcIixcbiAgXCJkYXRhYnJpY2tzXCIsXG4gIFwiZGJ4XCIsXG4gIFwiZ29vZ2xlXCIsXG4gIFwibWV0YVwiLFxuICBcIm9wZW5haVwiLFxuICBcInN5c3RlbVwiLFxuXSk7XG5cbmZ1bmN0aW9uIHJldGlyZWRNb2RlbEtleSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zID0gdmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaCgvW2EtejAtOV0rL2cpID8/IFtdO1xuICB3aGlsZSAodG9rZW5zWzBdICYmIFJFVElSRURfTU9ERUxfUFJFRklYRVMuaGFzKHRva2Vuc1swXSkpIHRva2Vucy5zaGlmdCgpO1xuICByZXR1cm4gdG9rZW5zLmpvaW4oXCItXCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkUGFnZSh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgaGVhZGVyczogeyBcInVzZXItYWdlbnRcIjogVVNFUl9BR0VOVCB9LFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxNV8wMDApLFxuICB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uIHJldHVybmVkIEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3VybH1gKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xufVxuXG5mdW5jdGlvbiBub3dTZWNvbmRzKCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbn1cbiJdfQ==
|
|
316
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxPQUFPLEtBQUssYUFBYSxNQUFNLHVDQUF1QyxDQUFDO0FBUXZFLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDJCQUEyQixFQUMzQix1QkFBdUIsRUFDdkIsa0JBQWtCLEVBQ2xCLHFCQUFxQixHQUt0QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLGNBQWMsRUFDZCx3QkFBd0IsRUFDeEIsMkJBQTJCLEdBQzVCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyx3QkFBd0IsTUFBTSxxQ0FBcUMsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNqRyxPQUFPLHNCQUFzQixNQUFNLG9DQUFvQyxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzlGLE9BQU8scUJBQXFCLE1BQU0sa0NBQWtDLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDM0YsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsc0JBQXNCLEdBRXZCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHlCQUF5QixFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25HLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIseUJBQXlCLEVBQ3pCLGNBQWMsRUFDZCxvQkFBb0IsRUFHcEIscUJBQXFCLEdBQ3RCLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsT0FBTyxFQUNMLHFCQUFxQixFQUNy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Q3BDLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUN6QixDQUFDO0FBRUQsU0FBUyxVQUFVO0lBQ2pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnVpbGQtZ2VuZXJhdGVkIERhdGFicmlja3MgbW9kZWwgcmV0aXJlbWVudCwgY2FwYWJpbGl0eSwgcmF0ZS1saW1pdCwgYW5kXG4gKiByZWFzb25pbmctZWZmb3J0IG1ldGFkYXRhLCBwbHVzIGEgZGFpbHkgd3JpdGUtdGhyb3VnaCBjYWNoZSBmb3IgcmVmcmVzaGVkXG4gKiBkb2NzIGFuZCBlcnJvci1sZWFybmVkIHJlYXNvbmluZyBsYWRkZXJzLlxuICpcbiAqIENvbW1pdHRlZCBzbmFwc2hvdHMgc2VlZCBldmVyeSBwcm9jZXNzLiB7QGxpbmsgcmVmcmVzaE1vZGVsTWV0YWRhdGF9IHB1bGxzXG4gKiBkb2N1bWVudGF0aW9uIHRocm91Z2gge0BsaW5rIGNyZWF0ZU1ldGFkYXRhQ2FjaGV9IChjYWNhY2hlIG1lbW9pemUgKyBkaXNrKSBhbmRcbiAqIHJlYnVpbGRzIHRoZSBpbi1tZW1vcnkgaW5kZXguIEVycm9yLWxlYXJuZWQgZWZmb3J0cyB1c2UgdGhlIHNhbWUgc3RvcmUgdmlhXG4gKiB7QGxpbmsgcmVtZW1iZXJSZWFzb25pbmdMZXZlbHN9LiBEaXNrIHdyaXRlcyBhcmUgc2tpcHBlZCBpbiBEYXRhYnJpY2tzIEFwcHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgKiBhcyBmdW5jdGlvblV0aWxzIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2Z1bmN0aW9uLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsQ2FwYWJpbGl0aWVzLFxuICBNb2RlbE1ldGFkYXRhLFxuICBNb2RlbFJhdGVMaW1pdHMsXG4gIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC9jb250cmFjdHNcIjtcblxuaW1wb3J0IHtcbiAgTU9ERUxfTUVUQURBVEFfVFRMX01TLFxuICBNT0RFTF9SQVRFX0xJTUlUU19VUkwsXG4gIE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCxcbiAgUVVFUllfUkVBU09OX01PREVMU19VUkwsXG4gIFJFVElSRURfTU9ERUxTX1VSTCxcbiAgV0VCX1NFQVJDSF9NT0RFTFNfVVJMLFxuICB0eXBlIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3QsXG4gIHR5cGUgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlLFxuICB0eXBlIE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90LFxuICB0eXBlIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90LFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtY29udHJhY3QudHNcIjtcbmltcG9ydCB7XG4gIHBhcnNlTW9kZWxDYXBhYmlsaXRpZXMsXG4gIHBhcnNlTW9kZWxSYXRlTGltaXRzLFxuICBwYXJzZVJlYXNvbmluZ01vZGVscyxcbiAgcGFyc2VSZXRpcmVkTW9kZWxzLFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQge1xuICBDT01NSVRURURfUkVUSVJFRF9NT0RFTFMsXG4gIG1vZGVsU3RhdHVzRm9yLFxuICByZXBsYWNlUmV0aXJlZE1vZGVsTmFtZXMsXG4gIFJFVElSRURfTU9ERUxTX0dFTkVSQVRFRF9BVCxcbn0gZnJvbSBcIi4vX3JldGlyZW1lbnQudHNcIjtcbmltcG9ydCBjYXBhYmlsaXRpZXNTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL21vZGVsLWNhcGFiaWxpdGllcy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgcmF0ZUxpbWl0c1NuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvbW9kZWwtcmF0ZS1saW1pdHMuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IHJlYXNvbmluZ1NuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvbW9kZWwtcmVhc29uaW5nLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCB7XG4gIGNyZWF0ZU1ldGFkYXRhQ2FjaGUsXG4gIG1lcmdlUHJlZmVyRnJlc2hMaXN0LFxuICBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxuICB0eXBlIE1ldGFkYXRhQ2FjaGUsXG59IGZyb20gXCIuL21ldGFkYXRhLWNhY2hlLnRzXCI7XG5pbXBvcnQgeyBpbmhlcml0c05hdGl2ZVdlYlNlYXJjaCwgaXNGb3VuZGF0aW9uTW9kZWxJZGVudGl0eSwgbW9kZWxTZWFyY2hRdWVyeSB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuaW1wb3J0IHtcbiAgZGVmYXVsdFJlYXNvbmluZ0xldmVscyxcbiAgZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyxcbiAgcGFyc2VSZWFzb25pbmcsXG4gIHBhcnNlUmVhc29uaW5nTGV2ZWxzLFxuICB0eXBlIFJlYXNvbmluZ0xldmVsLFxuICB0eXBlIFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlLFxuICB1bmlxdWVSZWFzb25pbmdMZXZlbHMsXG59IGZyb20gXCIuL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuXG5leHBvcnQge1xuICBNT0RFTF9NRVRBREFUQV9UVExfTVMsXG4gIE1PREVMX1JBVEVfTElNSVRTX1VSTCxcbiAgT1BFTkFJX1JFU1BPTlNFU19NT0RFTFNfVVJMLFxuICBRVUVSWV9SRUFTT05fTU9ERUxTX1VSTCxcbiAgUkVUSVJFRF9NT0RFTFNfVVJMLFxuICBXRUJfU0VBUkNIX01PREVMU19VUkwsXG59O1xuXG5jb25zdCBjYXBhYmlsaXRpZXNTbmFwc2hvdCA9IGNhcGFiaWxpdGllc1NuYXBzaG90SnNvbiBhcyBNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90O1xuY29uc3QgcmF0ZUxpbWl0c1NuYXBzaG90ID0gcmF0ZUxpbWl0c1NuYXBzaG90SnNvbiBhcyBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdDtcbmNvbnN0IHJlYXNvbmluZ1NuYXBzaG90ID0gcmVhc29uaW5nU25hcHNob3RKc29uIGFzIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90O1xuXG5pbnRlcmZhY2UgTWV0YWRhdGFJbmRleCB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczoge1xuICAgIHJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlXTogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcbiAgfTtcbiAgcmVhZG9ubHkgcmF0ZUxpbWl0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlO1xuICByZWFkb25seSBsZWFybmVkUmVhc29uaW5nOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbn1cblxudHlwZSBDYXBhYmlsaXR5U2V0cyA9IE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZTtcblxuY29uc3QgVVNFUl9BR0VOVCA9IFwiZGJ4LXRvb2xzLW1vZGVsLW1ldGFkYXRhLzFcIjtcblxuY29uc3QgcmV0aXJlZENhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxyZWFkb25seSBzdHJpbmdbXT4oe1xuICBrZXk6IFwicmV0aXJlZC1tb2RlbHNcIixcbiAgZmFsbGJhY2s6IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyxcbiAgbG9hZDogYXN5bmMgKCkgPT4gcGFyc2VSZXRpcmVkTW9kZWxzKGF3YWl0IGxvYWRQYWdlKFJFVElSRURfTU9ERUxTX1VSTCksIG5vd1NlY29uZHMoKSkubW9kZWxzLFxuICBtZXJnZTogbWVyZ2VQcmVmZXJGcmVzaExpc3QsXG59KTtcblxuY29uc3QgY2FwYWJpbGl0aWVzQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPENhcGFiaWxpdHlTZXRzPih7XG4gIGtleTogXCJtb2RlbC1jYXBhYmlsaXRpZXNcIixcbiAgZmFsbGJhY2s6IGNhcGFiaWxpdGllc1NuYXBzaG90LmNhcGFiaWxpdGllcyxcbiAgbG9hZDogYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtyZXNwb25zZXNIdG1sLCB3ZWJTZWFyY2hIdG1sXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGxvYWRQYWdlKE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCksXG4gICAgICBsb2FkUGFnZShXRUJfU0VBUkNIX01PREVMU19VUkwpLFxuICAgIF0pO1xuICAgIHJldHVybiBwYXJzZU1vZGVsQ2FwYWJpbGl0aWVzKHJlc3BvbnNlc0h0bWwsIHdlYlNlYXJjaEh0bWwsIG5vd1NlY29uZHMoKSkuY2FwYWJpbGl0aWVzO1xuICB9LFxuICBtZXJnZTogKGlucHV0KSA9PiAoe1xuICAgIHJlc3BvbnNlczogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5yZXNwb25zZXMsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/LnJlc3BvbnNlcyxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay5yZXNwb25zZXMsXG4gICAgfSksXG4gICAgaW1hZ2VJbnB1dDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5pbWFnZUlucHV0LFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5pbWFnZUlucHV0LFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLmltYWdlSW5wdXQsXG4gICAgfSksXG4gICAgYXBwbHlQYXRjaDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5hcHBseVBhdGNoLFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5hcHBseVBhdGNoLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLmFwcGx5UGF0Y2gsXG4gICAgfSksXG4gICAgd2ViU2VhcmNoOiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LndlYlNlYXJjaCxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8ud2ViU2VhcmNoLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLndlYlNlYXJjaCxcbiAgICB9KSxcbiAgfSksXG59KTtcblxuY29uc3QgcmF0ZUxpbWl0c0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+Pj4oe1xuICBrZXk6IFwibW9kZWwtcmF0ZS1saW1pdHNcIixcbiAgZmFsbGJhY2s6IHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzLFxuICBsb2FkOiBhc3luYyAoKSA9PlxuICAgIHBhcnNlTW9kZWxSYXRlTGltaXRzKGF3YWl0IGxvYWRQYWdlKE1PREVMX1JBVEVfTElNSVRTX1VSTCksIG5vd1NlY29uZHMoKSkuY2F0YWxvZ3VlLm1vZGVscyxcbiAgbWVyZ2U6IG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQsXG59KTtcblxuY29uc3QgcmVhc29uaW5nRG9jc0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+Pih7XG4gIGtleTogXCJtb2RlbC1yZWFzb25pbmdcIixcbiAgZmFsbGJhY2s6IHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgcGFyc2VSZWFzb25pbmdNb2RlbHMoYXdhaXQgbG9hZFBhZ2UoUVVFUllfUkVBU09OX01PREVMU19VUkwpLCBub3dTZWNvbmRzKCkpLmNhdGFsb2d1ZS5tb2RlbHMsXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmNvbnN0IGxlYXJuZWRSZWFzb25pbmdDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8XG4gIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+PlxuPih7XG4gIGtleTogXCJsZWFybmVkLXJlYXNvbmluZ1wiLFxuICBmYWxsYmFjazoge30sXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmxldCBsaXZlSW5kZXg6IE1ldGFkYXRhSW5kZXggfCB1bmRlZmluZWQ7XG5cbmNvbnN0IG1ldGFkYXRhSW5kZXggPSBmdW5jdGlvblV0aWxzLm1lbW9pemU8TWV0YWRhdGFJbmRleD4oXG4gICgpID0+IGxpdmVJbmRleCA/PyBidWlsZEluZGV4RnJvbUNvbW1pdHRlZCgpLFxuKTtcblxuZnVuY3Rpb24gYnVpbGRJbmRleEZyb21Db21taXR0ZWQoKTogTWV0YWRhdGFJbmRleCB7XG4gIHJldHVybiBidWlsZEluZGV4KHtcbiAgICByZXRpcmVkTmFtZXM6IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyxcbiAgICBjYXBhYmlsaXRpZXM6IGNhcGFiaWxpdGllc1NuYXBzaG90LmNhcGFiaWxpdGllcyxcbiAgICByYXRlTGltaXRzOiByYXRlTGltaXRzU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyxcbiAgICByZWFzb25pbmc6IHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gICAgbGVhcm5lZFJlYXNvbmluZzoge30sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEluZGV4KGlucHV0OiB7XG4gIHJlYWRvbmx5IHJldGlyZWROYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogQ2FwYWJpbGl0eVNldHM7XG4gIHJlYWRvbmx5IHJhdGVMaW1pdHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIE1vZGVsUmF0ZUxpbWl0cz4+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG4gIHJlYWRvbmx5IGxlYXJuZWRSZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pjtcbn0pOiBNZXRhZGF0YUluZGV4IHtcbiAgcmVwbGFjZVJldGlyZWRNb2RlbE5hbWVzKGlucHV0LnJldGlyZWROYW1lcyk7XG4gIHJldHVybiB7XG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICByZXNwb25zZXM6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyksXG4gICAgICBpbWFnZUlucHV0OiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy5pbWFnZUlucHV0KSxcbiAgICAgIGFwcGx5UGF0Y2g6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2gpLFxuICAgICAgd2ViU2VhcmNoOiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gpLFxuICAgIH0sXG4gICAgcmF0ZUxpbWl0czogbmV3IE1hcChPYmplY3QuZW50cmllcyhpbnB1dC5yYXRlTGltaXRzKSksXG4gICAgcmVhc29uaW5nOiBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoaW5wdXQucmVhc29uaW5nKSxcbiAgICBsZWFybmVkUmVhc29uaW5nOiBmcmVlemVMZWFybmVkQ2F0YWxvZ3VlKGlucHV0LmxlYXJuZWRSZWFzb25pbmcpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoXG4gIG1vZGVsczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+Pixcbik6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMobW9kZWxzKS5tYXAoKFtrZXksIGxldmVsc10pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICBPYmplY3QuZnJlZXplKFxuICAgICAgICAgIHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMuZmxhdE1hcCgobGV2ZWwpID0+IHBhcnNlUmVhc29uaW5nKGxldmVsKSA/PyBbXSkpLFxuICAgICAgICApLFxuICAgICAgXSksXG4gICAgKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gZnJlZXplTGVhcm5lZENhdGFsb2d1ZShcbiAgbW9kZWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj4sXG4pOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKG1vZGVscykubWFwKChba2V5LCBsZXZlbHNdKSA9PiBbXG4gICAgICAgIGtleSxcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh1bmlxdWVSZWFzb25pbmdMZXZlbHMobGV2ZWxzKSksXG4gICAgICBdKSxcbiAgICApLFxuICApO1xufVxuXG5sZXQgcmVmcmVzaEluZmxpZ2h0OiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEh5ZHJhdGUgb3IgcmVmcmVzaCBkb2N1bWVudGF0aW9uICsgbGVhcm5lZCBjYWNoZXMgaW50byB0aGUgcHJvY2VzcyBpbmRleC5cbiAqXG4gKiBTYWZlIHRvIGNhbGwgb24gZ2F0ZXdheSBzdGFydHVwLiBDb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgb25lIHJlZnJlc2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZyZXNoTW9kZWxNZXRhZGF0YSgpOiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHtcbiAgaWYgKHJlZnJlc2hJbmZsaWdodCkgcmV0dXJuIHJlZnJlc2hJbmZsaWdodDtcbiAgcmVmcmVzaEluZmxpZ2h0ID0gKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbcmV0aXJlZE5hbWVzLCBjYXBhYmlsaXRpZXMsIHJhdGVMaW1pdHMsIHJlYXNvbmluZywgbGVhcm5lZFJlYXNvbmluZ10gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFtcbiAgICAgICAgcmV0aXJlZENhY2hlLmdldCgpLFxuICAgICAgICBjYXBhYmlsaXRpZXNDYWNoZS5nZXQoKSxcbiAgICAgICAgcmF0ZUxpbWl0c0NhY2hlLmdldCgpLFxuICAgICAgICByZWFzb25pbmdEb2NzQ2FjaGUuZ2V0KCksXG4gICAgICAgIGxlYXJuZWRSZWFzb25pbmdDYWNoZS5nZXQoKSxcbiAgICAgIF0sXG4gICAgKTtcbiAgICBsaXZlSW5kZXggPSBidWlsZEluZGV4KHtcbiAgICAgIHJldGlyZWROYW1lcyxcbiAgICAgIGNhcGFiaWxpdGllcyxcbiAgICAgIHJhdGVMaW1pdHMsXG4gICAgICByZWFzb25pbmcsXG4gICAgICBsZWFybmVkUmVhc29uaW5nLFxuICAgIH0pO1xuICAgIHJldHVybiBsaXZlSW5kZXg7XG4gIH0pKCkuZmluYWxseSgoKSA9PiB7XG4gICAgcmVmcmVzaEluZmxpZ2h0ID0gdW5kZWZpbmVkO1xuICB9KTtcbiAgcmV0dXJuIHJlZnJlc2hJbmZsaWdodDtcbn1cblxuLyoqIExvYWQgY2FjYWNoZSAvIG1lbW9yeSBlbnRyaWVzIHdpdGhvdXQgZm9yY2luZyBhIG5ldHdvcmsgcmVmcmVzaC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlTW9kZWxNZXRhZGF0YSgpOiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHtcbiAgY29uc3QgW3JldGlyZWROYW1lcywgY2FwYWJpbGl0aWVzLCByYXRlTGltaXRzLCByZWFzb25pbmcsIGxlYXJuZWRSZWFzb25pbmddID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHBlZWtPckZhbGxiYWNrKHJldGlyZWRDYWNoZSwgQ09NTUlUVEVEX1JFVElSRURfTU9ERUxTKSxcbiAgICBwZWVrT3JGYWxsYmFjayhjYXBhYmlsaXRpZXNDYWNoZSwgY2FwYWJpbGl0aWVzU25hcHNob3QuY2FwYWJpbGl0aWVzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyYXRlTGltaXRzQ2FjaGUsIHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyZWFzb25pbmdEb2NzQ2FjaGUsIHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMpLFxuICAgIHBlZWtPckZhbGxiYWNrKGxlYXJuZWRSZWFzb25pbmdDYWNoZSwge30pLFxuICBdKTtcbiAgbGl2ZUluZGV4ID0gYnVpbGRJbmRleCh7XG4gICAgcmV0aXJlZE5hbWVzLFxuICAgIGNhcGFiaWxpdGllcyxcbiAgICByYXRlTGltaXRzLFxuICAgIHJlYXNvbmluZyxcbiAgICBsZWFybmVkUmVhc29uaW5nLFxuICB9KTtcbiAgcmV0dXJuIGxpdmVJbmRleDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGVla09yRmFsbGJhY2s8VD4oY2FjaGU6IE1ldGFkYXRhQ2FjaGU8VD4sIGZhbGxiYWNrOiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHBlZWtlZCA9IGF3YWl0IGNhY2hlLnBlZWsoKTtcbiAgaWYgKHBlZWtlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcGVla2VkO1xuICByZXR1cm4gY2FjaGUuZ2V0KCkuY2F0Y2goKCkgPT4gZmFsbGJhY2spO1xufVxuXG4vKiogQWJzb2x1dGUgY2FjYWNoZSByb290IHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gLyBsZWFybmVkIGNhY2hlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbE1ldGFkYXRhQ2FjaGVQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiByZXRpcmVkQ2FjaGUucGF0aDtcbn1cblxuZXhwb3J0IHsgbW9kZWxTdGF0dXNGb3IsIHJldGlyZWRNb2RlbE5hbWVzIH0gZnJvbSBcIi4vX3JldGlyZW1lbnQudHNcIjtcblxuLyoqIFJldHVybiB0aGUgY29tbWl0dGVkIHJlYXNvbmluZy1lZmZvcnQgY2F0YWxvZ3VlLiBDYWNoZWQgcGVyIHByb2Nlc3MuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhc29uaW5nTW9kZWxDYXRhbG9ndWUoKTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUge1xuICByZXR1cm4gbWV0YWRhdGFJbmRleCgpLnJlYXNvbmluZztcbn1cblxuLyoqIFJldHVybiBlcnJvci1sZWFybmVkIHJlYXNvbmluZyBsYWRkZXJzIHBlcnNpc3RlZCBpbiB0aGUgbWV0YWRhdGEgY2FjaGUuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhcm5lZFJlYXNvbmluZ0NhdGFsb2d1ZSgpOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBtZXRhZGF0YUluZGV4KCkubGVhcm5lZFJlYXNvbmluZztcbn1cblxuLyoqXG4gKiBTdG9yZSBsZXZlbHMgbGVhcm5lZCBmcm9tIGFuIHVwc3RyZWFtIGVycm9yIGFuZCBwZXJzaXN0IHRoZW0gd3JpdGUtdGhyb3VnaC5cbiAqXG4gKiBFbXB0eSBsaXN0cyBhcmUgaWdub3JlZCBzbyBhIGZhaWxlZCBwYXJzZSBjYW5ub3Qgd2lwZSBkZWZhdWx0cy4gRXJyb3IgYm9kaWVzXG4gKiB0aGVtc2VsdmVzIGFyZSBuZXZlciBzdG9yZWQgLSBvbmx5IHRoZSBwYXJzZWQgbGFkZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtZW1iZXJSZWFzb25pbmdMZXZlbHMoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IFByb21pc2U8UmVhc29uaW5nTGV2ZWxbXT4ge1xuICBjb25zdCB1bmlxdWUgPSB1bmlxdWVSZWFzb25pbmdMZXZlbHMobGV2ZWxzKTtcbiAgaWYgKHVuaXF1ZS5sZW5ndGggPT09IDApIHJldHVybiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCk7XG4gIGNvbnN0IGtleSA9IG1vZGVsS2V5KG1vZGVsKTtcbiAgaWYgKCFrZXkpIHJldHVybiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCk7XG4gIGNvbnN0IGNhdGFsb2d1ZSA9IGF3YWl0IGxlYXJuZWRSZWFzb25pbmdDYWNoZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7XG4gICAgLi4uY3VycmVudCxcbiAgICBba2V5XTogdW5pcXVlLFxuICB9KSk7XG4gIGNvbnN0IGN1cnJlbnQgPSBtZXRhZGF0YUluZGV4KCk7XG4gIGxpdmVJbmRleCA9IHtcbiAgICAuLi5jdXJyZW50LFxuICAgIGxlYXJuZWRSZWFzb25pbmc6IGZyZWV6ZUxlYXJuZWRDYXRhbG9ndWUoY2F0YWxvZ3VlKSxcbiAgfTtcbiAgcmV0dXJuIFsuLi51bmlxdWVdO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuIHVwc3RyZWFtIGVycm9yIGJvZHkgYW5kIHBlcnNpc3QgdGhlIHN1cHBvcnRlZCBsYWRkZXIgZm9yIGBtb2RlbGAuXG4gKlxuICogQWNjZXB0cyB0aGUgc2FtZSBuZXN0ZWQgRGF0YWJyaWNrcyBlbnZlbG9wZXMgYXMge0BsaW5rIHBhcnNlUmVhc29uaW5nTGV2ZWxzfS5cbiAqIFJldHVybnMgdGhlIGxldmVscyB0aGF0IHdlcmUgc3RvcmVkIChvciB0aGUgY3VycmVudCBsb29rdXAgd2hlbiBwYXJzZSB5aWVsZHNcbiAqIG5vdGhpbmcpLiBUaGUgcmF3IGVycm9yIGJvZHkgaXMgbmV2ZXIgd3JpdHRlbiB0byBkaXNrLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGVhcm5SZWFzb25pbmdMZXZlbHNGcm9tRXJyb3IoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGJvZHk6IHVua25vd24sXG4pOiBQcm9taXNlPFJlYXNvbmluZ0xldmVsW10+IHtcbiAgcmV0dXJuIHJlbWVtYmVyUmVhc29uaW5nTGV2ZWxzKG1vZGVsLCBwYXJzZVJlYXNvbmluZ0xldmVscyhib2R5KSk7XG59XG5cbi8qKiBSZXNvbHZlIGRvY3VtZW50ZWQgbW9kZWwgY2FwYWJpbGl0aWVzIGZyb20gYSBuYW1lIG9yIGVuZHBvaW50IHN1bW1hcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxDYXBhYmlsaXRpZXNGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbENhcGFiaWxpdGllcyB7XG4gIGNvbnN0IGNhcGFiaWxpdGllcyA9IG1ldGFkYXRhSW5kZXgoKS5jYXBhYmlsaXRpZXM7XG4gIGNvbnN0IGlkZW50aXRpZXMgPSBtb2RlbElkZW50aXRpZXMobW9kZWwsIGZhbHNlKTtcbiAgY29uc3Qga2V5cyA9IGlkZW50aXRpZXMuZmxhdE1hcCgoaWRlbnRpdHkpID0+IG1vZGVsS2V5KGlkZW50aXR5KSA/PyBbXSk7XG4gIHJldHVybiB7XG4gICAgcmVzcG9uc2VzOiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLnJlc3BvbnNlcy5oYXMoa2V5KSksXG4gICAgaW1hZ2VJbnB1dDoga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy5pbWFnZUlucHV0LmhhcyhrZXkpKSxcbiAgICBhcHBseVBhdGNoOiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2guaGFzKGtleSkpLFxuICAgIC8vIFZlcnNpb24gaW5oZXJpdGFuY2Ugb25seSBhcHBsaWVzIHRvIGhvc3RlZCBmb3VuZGF0aW9uIGlkZW50aXRpZXMuXG4gICAgd2ViU2VhcmNoOlxuICAgICAga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy53ZWJTZWFyY2guaGFzKGtleSkpIHx8XG4gICAgICBpZGVudGl0aWVzLnNvbWUoXG4gICAgICAgIChpZGVudGl0eSkgPT5cbiAgICAgICAgICBpc0ZvdW5kYXRpb25Nb2RlbElkZW50aXR5KGlkZW50aXR5KSAmJlxuICAgICAgICAgIGluaGVyaXRzTmF0aXZlV2ViU2VhcmNoKGlkZW50aXR5LCBjYXBhYmlsaXRpZXMud2ViU2VhcmNoKSxcbiAgICAgICksXG4gIH07XG59XG5cbi8qKiBSZXNvbHZlIHB1Ymxpc2hlZCBJVFBNLCBPVFBNLCBhbmQgUVBIIGxpbWl0cyBmcm9tIGEgbW9kZWwgaWRlbnRpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxSYXRlTGltaXRzRm9yKFxuICBtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbik6IE1vZGVsUmF0ZUxpbWl0cyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxpbWl0cyA9IG1ldGFkYXRhSW5kZXgoKS5yYXRlTGltaXRzO1xuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBrZXkgPSBtb2RlbEtleShpZGVudGl0eSk7XG4gICAgaWYgKCFrZXkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZvdW5kID0gbGltaXRzLmdldChrZXkpO1xuICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSByZWFzb25pbmcgbGV2ZWxzOiBsZWFybmVkIGZyb20gZXJyb3JzLCB0aGVuIGRvY3VtZW50YXRpb24sIHRoZW5cbiAqIGZhbWlseSBkZWZhdWx0cy5cbiAqXG4gKiBEb2VzIG5vdCBwYXJzZSBlcnJvciBib2RpZXM7IGNhbGxlcnMgc2hvdWxkIHVzZSB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9XG4gKiBhbmQgdGhlbiB7QGxpbmsgcmVtZW1iZXJSZWFzb25pbmdMZXZlbHN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxSZWFzb25pbmdMZXZlbHNGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgY29uc3QgaW5kZXggPSBtZXRhZGF0YUluZGV4KCk7XG4gIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgbW9kZWxJZGVudGl0aWVzKG1vZGVsKSkge1xuICAgIGNvbnN0IGxlYXJuZWQgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKGlkZW50aXR5LCBpbmRleC5sZWFybmVkUmVhc29uaW5nKTtcbiAgICBpZiAobGVhcm5lZD8ubGVuZ3RoKSByZXR1cm4gbGVhcm5lZDtcbiAgfVxuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBkb2N1bWVudGVkID0gZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyhpZGVudGl0eSwgaW5kZXgucmVhc29uaW5nKTtcbiAgICBpZiAoZG9jdW1lbnRlZD8ubGVuZ3RoKSByZXR1cm4gZG9jdW1lbnRlZDtcbiAgfVxuICBjb25zdCBwcmltYXJ5ID0gdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiAobW9kZWwubW9kZWxTZXJ2aWNlTmFtZSA/PyBtb2RlbC5uYW1lKTtcbiAgcmV0dXJuIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMocHJpbWFyeSk7XG59XG5cbi8qKiBSZXNvbHZlIHJldGlyZW1lbnQsIGNhcGFiaWxpdHksIGFuZCByYXRlLWxpbWl0IG1ldGFkYXRhIHRvZ2V0aGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsTWV0YWRhdGFGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbE1ldGFkYXRhIHtcbiAgY29uc3QgcmF0ZUxpbWl0cyA9IG1vZGVsUmF0ZUxpbWl0c0Zvcihtb2RlbCk7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiBtb2RlbFN0YXR1c0Zvcihtb2RlbCksXG4gICAgY2FwYWJpbGl0aWVzOiBtb2RlbENhcGFiaWxpdGllc0Zvcihtb2RlbCksXG4gICAgLi4uKHJhdGVMaW1pdHMgPyB7IHJhdGVMaW1pdHMgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIFJldHVybiBnZW5lcmF0aW9uIHRpbWVzdGFtcHMgZm9yIHRoZSBjb21taXR0ZWQgbWV0YWRhdGEgc25hcHNob3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsTWV0YWRhdGFHZW5lcmF0ZWRBdCgpOiBSZWFkb25seTx7XG4gIHJldGlyZWRNb2RlbHM6IG51bWJlcjtcbiAgY2FwYWJpbGl0aWVzOiBudW1iZXI7XG4gIHJhdGVMaW1pdHM6IG51bWJlcjtcbiAgcmVhc29uaW5nOiBudW1iZXI7XG59PiB7XG4gIHJldHVybiB7XG4gICAgcmV0aXJlZE1vZGVsczogUkVUSVJFRF9NT0RFTFNfR0VORVJBVEVEX0FULFxuICAgIGNhcGFiaWxpdGllczogY2FwYWJpbGl0aWVzU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gICAgcmF0ZUxpbWl0czogcmF0ZUxpbWl0c1NuYXBzaG90LmdlbmVyYXRlZEF0LFxuICAgIHJlYXNvbmluZzogcmVhc29uaW5nU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1vZGVsSWRlbnRpdGllcyhcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIGluY2x1ZGVEaXNwbGF5TmFtZSA9IHRydWUsXG4pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIpIHJldHVybiBbbW9kZWxdO1xuICByZXR1cm4gW1xuICAgIG1vZGVsLm5hbWUsXG4gICAgLi4uKGluY2x1ZGVEaXNwbGF5TmFtZSA/IFttb2RlbC5kaXNwbGF5TmFtZV0gOiBbXSksXG4gICAgbW9kZWwubW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAuLi5PYmplY3QudmFsdWVzKG1vZGVsLnNlcnZpY2VOYW1lcyA/PyB7fSksXG4gIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIG1vZGVsS2V5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gbW9kZWxTZWFyY2hRdWVyeSh2YWx1ZSk/LnJlcGxhY2VBbGwoXCIgXCIsIFwiLVwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFBhZ2UodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIGhlYWRlcnM6IHsgXCJ1c2VyLWFnZW50XCI6IFVTRVJfQUdFTlQgfSxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTVfMDAwKSxcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiByZXR1cm5lZCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHt1cmx9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuZnVuY3Rpb24gbm93U2Vjb25kcygpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG59XG4iXX0=
|
|
@@ -13,6 +13,8 @@ export interface ModelClientOptions {
|
|
|
13
13
|
auth?: ModelAuthOptions;
|
|
14
14
|
/** In-memory endpoint catalogue TTL in milliseconds. */
|
|
15
15
|
cacheTtlMs?: number;
|
|
16
|
+
/** Hydrate Node-only metadata caches before constructing the client. */
|
|
17
|
+
hydrateMetadata?: boolean;
|
|
16
18
|
}
|
|
17
19
|
/** Secret-free runtime identity and cache configuration. */
|
|
18
20
|
export interface ModelClientStatus {
|
package/lib/src/model-client.js
CHANGED
|
@@ -3,18 +3,20 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This is the portable entry point used by generated Python bindings. It keeps
|
|
5
5
|
* authentication, endpoint discovery, caching, normalization, ranking, route
|
|
6
|
-
* selection, and published metadata in Node while exposing
|
|
6
|
+
* selection, route construction, and published metadata in Node while exposing
|
|
7
|
+
* one small client.
|
|
7
8
|
*
|
|
8
9
|
* @module
|
|
9
10
|
*/
|
|
10
|
-
import {
|
|
11
|
+
import { createAuthClient, } from "@dbx-tools/auth/client";
|
|
12
|
+
import { listProfiles as listAuthProfiles } from "@dbx-tools/auth/profile";
|
|
11
13
|
import * as log from "@dbx-tools/shared-core/log";
|
|
12
14
|
import * as object from "@dbx-tools/shared-core/object";
|
|
13
15
|
import { ModelClass, } from "@dbx-tools/shared-model/contracts";
|
|
14
16
|
import { normalizeEndpoints } from "./_ranking.js";
|
|
15
17
|
import { lookupModels, resolveModel } from "./_selection.js";
|
|
16
18
|
import { chatCompletionsUrl, invocationsUrl, responsesUpstreamUrl } from "./invoke.js";
|
|
17
|
-
import { modelMetadataFor } from "./metadata.js";
|
|
19
|
+
import { hydrateModelMetadata, modelMetadataFor } from "./metadata.js";
|
|
18
20
|
import { modelServingApi } from "./policy.js";
|
|
19
21
|
const logger = log.logger("model/client");
|
|
20
22
|
/** Default lifetime for one live endpoint catalogue. */
|
|
@@ -142,11 +144,13 @@ class DefaultModelClient {
|
|
|
142
144
|
/** Create an authentication-aware Databricks model client. */
|
|
143
145
|
export async function createModelClient(options = {}) {
|
|
144
146
|
const cacheTtlMs = validateCacheTtl(options.cacheTtlMs);
|
|
145
|
-
|
|
147
|
+
if (options.hydrateMetadata ?? true)
|
|
148
|
+
await hydrateModelMetadata();
|
|
149
|
+
return new DefaultModelClient(new AuthenticatedModelClient(await createAuthClient(options.auth), globalThis.fetch), cacheTtlMs);
|
|
146
150
|
}
|
|
147
151
|
/** List configured Databricks profiles outside the model client facade. */
|
|
148
152
|
export function listProfiles(refresh = false) {
|
|
149
|
-
return
|
|
153
|
+
return listAuthProfiles({ refresh });
|
|
150
154
|
}
|
|
151
155
|
/** @internal Construct a model client around a test or host-owned Databricks client. */
|
|
152
156
|
export function createModelClientWithDatabricksClient(client, cacheTtlMs = DEFAULT_MODEL_CLIENT_CACHE_TTL_MS) {
|
|
@@ -154,7 +158,9 @@ export function createModelClientWithDatabricksClient(client, cacheTtlMs = DEFAU
|
|
|
154
158
|
}
|
|
155
159
|
/** @internal Create a model client with injectable auth host capabilities. */
|
|
156
160
|
export async function createModelClientWithDependencies(options, dependencies) {
|
|
157
|
-
|
|
161
|
+
if (options.hydrateMetadata ?? true)
|
|
162
|
+
await hydrateModelMetadata();
|
|
163
|
+
return new DefaultModelClient(new AuthenticatedModelClient(await createAuthClient(options.auth, dependencies), dependencies.fetch ?? globalThis.fetch), validateCacheTtl(options.cacheTtlMs));
|
|
158
164
|
}
|
|
159
165
|
function validateCacheTtl(value = DEFAULT_MODEL_CLIENT_CACHE_TTL_MS) {
|
|
160
166
|
if (!Number.isFinite(value) || value <= 0) {
|
|
@@ -196,4 +202,4 @@ function cloneEndpoint(endpoint) {
|
|
|
196
202
|
...(endpoint.status ? { status: { ...endpoint.status } } : {}),
|
|
197
203
|
};
|
|
198
204
|
}
|
|
199
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFDTCxNQUFNLElBQUksVUFBVSxFQUNwQixPQUFPLElBQUksV0FBVyxHQUd2QixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sS0FBSyxHQUFHLE1BQU0sNEJBQTRCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsVUFBVSxHQU9YLE1BQU0sbUNBQW1DLENBQUM7QUFFM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTFDLHdEQUF3RDtBQUN4RCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQW9FL0QsTUFBTSx3QkFBd0I7SUFFakI7SUFDUTtJQUZuQixZQUNXLElBQWdCLEVBQ1IsT0FBZ0M7UUFEeEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNSLFlBQU8sR0FBUCxPQUFPLENBQXlCO0lBQ2hELENBQUM7SUFFSixJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUztRQUNQ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R0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQy9ELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBdXRoZW50aWNhdGlvbi1hd2FyZSBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgY2xpZW50LlxuICpcbiAqIFRoaXMgaXMgdGhlIHBvcnRhYmxlIGVudHJ5IHBvaW50IHVzZWQgYnkgZ2VuZXJhdGVkIFB5dGhvbiBiaW5kaW5ncy4gSXQga2VlcHNcbiAqIGF1dGhlbnRpY2F0aW9uLCBlbmRwb2ludCBkaXNjb3ZlcnksIGNhY2hpbmcsIG5vcm1hbGl6YXRpb24sIHJhbmtpbmcsIHJvdXRlXG4gKiBzZWxlY3Rpb24sIGFuZCBwdWJsaXNoZWQgbWV0YWRhdGEgaW4gTm9kZSB3aGlsZSBleHBvc2luZyBvbmUgc21hbGwgY2xpZW50LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHtcbiAgY2xpZW50IGFzIGF1dGhDbGllbnQsXG4gIHByb2ZpbGUgYXMgYXV0aFByb2ZpbGUsXG4gIHR5cGUgQXV0aENsaWVudCxcbiAgdHlwZSBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXV0aFwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYnJpY2tzUHJvZmlsZVN1bW1hcnkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtYXV0aFwiO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2xvZ1wiO1xuaW1wb3J0ICogYXMgb2JqZWN0IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL29iamVjdFwiO1xuaW1wb3J0IHtcbiAgTW9kZWxDbGFzcyxcbiAgdHlwZSBNb2RlbE1ldGFkYXRhLFxuICB0eXBlIE1vZGVsUXVlcnksXG4gIHR5cGUgUmFua2VkTW9kZWwsXG4gIHR5cGUgUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbixcbiAgdHlwZSBSZXNvbHZlTW9kZWxJbnB1dCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUVuZHBvaW50cyB9IGZyb20gXCIuL19yYW5raW5nLnRzXCI7XG5pbXBvcnQgeyBsb29rdXBNb2RlbHMsIHJlc29sdmVNb2RlbCB9IGZyb20gXCIuL19zZWxlY3Rpb24udHNcIjtcbmltcG9ydCB7IGNoYXRDb21wbGV0aW9uc1VybCwgaW52b2NhdGlvbnNVcmwsIHJlc3BvbnNlc1Vwc3RyZWFtVXJsIH0gZnJvbSBcIi4vaW52b2tlLnRzXCI7XG5pbXBvcnQgeyBtb2RlbE1ldGFkYXRhRm9yIH0gZnJvbSBcIi4vbWV0YWRhdGEudHNcIjtcbmltcG9ydCB7IG1vZGVsU2VydmluZ0FwaSB9IGZyb20gXCIuL3BvbGljeS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibW9kZWwvY2xpZW50XCIpO1xuXG4vKiogRGVmYXVsdCBsaWZldGltZSBmb3Igb25lIGxpdmUgZW5kcG9pbnQgY2F0YWxvZ3VlLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTU9ERUxfQ0xJRU5UX0NBQ0hFX1RUTF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbi8qKiBBdXRoZW50aWNhdGlvbiBvcHRpb25zIGV4cG9zZWQgYnkgdGhlIHBvcnRhYmxlIG1vZGVsIGNsaWVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxBdXRoT3B0aW9ucyB7XG4gIC8qKiBEYXRhYnJpY2tzIHByb2ZpbGUgbmFtZS4gKi9cbiAgcHJvZmlsZT86IHN0cmluZztcbn1cblxuLyoqIENvbnN0cnVjdGlvbiBvcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlTW9kZWxDbGllbnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENsaWVudE9wdGlvbnMge1xuICAvKiogRGF0YWJyaWNrcyBhdXRoZW50aWNhdGlvbiBhbmQgcHJvZmlsZSBzZWxlY3Rpb24gb3B0aW9ucy4gKi9cbiAgYXV0aD86IE1vZGVsQXV0aE9wdGlvbnM7XG4gIC8qKiBJbi1tZW1vcnkgZW5kcG9pbnQgY2F0YWxvZ3VlIFRUTCBpbiBtaWxsaXNlY29uZHMuICovXG4gIGNhY2hlVHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBTZWNyZXQtZnJlZSBydW50aW1lIGlkZW50aXR5IGFuZCBjYWNoZSBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENsaWVudFN0YXR1cyB7XG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJpbmNpcGFsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdvcmtzcGFjZUlkPzogc3RyaW5nO1xuICByZWFkb25seSBjYWNoZVR0bE1zOiBudW1iZXI7XG59XG5cbi8qKiBTZXJ2aW5nIHByb3RvY29sIHNlbGVjdGVkIGZvciBvbmUgcmVzb2x2ZWQgbW9kZWwuICovXG5leHBvcnQgdHlwZSBNb2RlbFByb3RvY29sID0gXCJjaGF0XCIgfCBcInJlc3BvbnNlc1wiIHwgXCJlbWJlZGRpbmdzXCI7XG5cbi8qKiBNb2RlbCBzZWxlY3Rpb24gcGx1cyByb3V0ZSBjb250cm9scy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxSb3V0ZUlucHV0IGV4dGVuZHMgUmVzb2x2ZU1vZGVsSW5wdXQge1xuICAvKiogRm9yY2UgYSBsaXZlIGVuZHBvaW50IGNhdGFsb2d1ZSByZWZyZXNoIGJlZm9yZSBzZWxlY3Rpb24uICovXG4gIHJlZnJlc2g/OiBib29sZWFuO1xuICAvKiogUmVxdWVzdGVkIHVwc3RyZWFtIHByb3RvY29sLiBEZWZhdWx0cyBmcm9tIGVuZHBvaW50IHRhc2sgYW5kIG1vZGVsIHBvbGljeS4gKi9cbiAgcHJvdG9jb2w/OiBNb2RlbFByb3RvY29sO1xuICAvKiogV2hldGhlciBhdXRoZW50aWNhdGlvbiBtYXkgcnVuIGFuIGludGVyYWN0aXZlIGxvZ2luLiAqL1xuICBsb2dpbj86IGJvb2xlYW47XG59XG5cbi8qKiBGdWxseSByZXNvbHZlZCBEYXRhYnJpY2tzIHJvdXRlIGZvciBhIG1vZGVsIHJlcXVlc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUm91dGUge1xuICByZWFkb25seSBtb2RlbElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVuZHBvaW50PzogU2VydmluZ0VuZHBvaW50U3VtbWFyeTtcbiAgcmVhZG9ubHkgc291cmNlOiBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uW1wic291cmNlXCJdO1xuICByZWFkb25seSBwcm90b2NvbDogTW9kZWxQcm90b2NvbDtcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBhcGlCYXNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICByZWFkb25seSBoZWFkZXJzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcmVhZG9ubHkgbWV0YWRhdGE6IE1vZGVsTWV0YWRhdGE7XG59XG5cbi8qKiBTdGFibGUgbW9kZWwgZmFjYWRlIHNoYXJlZCBieSBOb2RlIGFuZCBnZW5lcmF0ZWQgbGFuZ3VhZ2UgYmluZGluZ3MuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2xpZW50IHtcbiAgbGlzdE1vZGVscyhyZWZyZXNoPzogYm9vbGVhbik6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPjtcbiAgc2VhcmNoTW9kZWxzKHF1ZXJ5PzogTW9kZWxRdWVyeSwgcmVmcmVzaD86IGJvb2xlYW4pOiBQcm9taXNlPFJhbmtlZE1vZGVsW10+O1xuICByb3V0ZShpbnB1dD86IE1vZGVsUm91dGVJbnB1dCk6IFByb21pc2U8TW9kZWxSb3V0ZT47XG4gIG1ldGFkYXRhKG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogTW9kZWxNZXRhZGF0YTtcbiAgc3RhdHVzKCk6IE1vZGVsQ2xpZW50U3RhdHVzO1xufVxuXG5pbnRlcmZhY2UgRGF0YWJyaWNrc01vZGVsQ2xpZW50IHtcbiAgcmVhZG9ubHkgYXV0aDogQXV0aENsaWVudDtcbiAgaG9zdCgpOiBzdHJpbmc7XG4gIHByaW5jaXBhbCgpOiBzdHJpbmc7XG4gIHdvcmtzcGFjZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVxdWVzdChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+O1xufVxuXG5jbGFzcyBBdXRoZW50aWNhdGVkTW9kZWxDbGllbnQgaW1wbGVtZW50cyBEYXRhYnJpY2tzTW9kZWxDbGllbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBhdXRoOiBBdXRoQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmV0Y2hlcjogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2gsXG4gICkge31cblxuICBob3N0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5ob3N0O1xuICB9XG5cbiAgcHJpbmNpcGFsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5wcmluY2lwYWw7XG4gIH1cblxuICB3b3Jrc3BhY2VJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmF1dGgud29ya3NwYWNlSWQ7XG4gIH1cblxuICBhc3luYyByZXF1ZXN0KHBhdGg6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aCwgYCR7dGhpcy5ob3N0KCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpfS9gKS50b1N0cmluZygpO1xuICAgIGxldCBoZWFkZXJzID0gYXdhaXQgdGhpcy5hdXRoLmhlYWRlcnMoKTtcbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoZXIodXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICBoZWFkZXJzID0gYXdhaXQgdGhpcy5hdXRoLmhlYWRlcnMoeyByZWZyZXNoOiB0cnVlIH0pO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoZXIodXJsLCB7IGhlYWRlcnMgfSk7XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIEFQSSAke3BhdGh9IHJldHVybmVkIEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3RleHR9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0ID8gSlNPTi5wYXJzZSh0ZXh0KSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2F0YWxvZ3VlRW50cnkge1xuICByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT47XG4gIGV4cGlyZXNBdDogbnVtYmVyO1xufVxuXG5jb25zdCBjYXRhbG9ndWVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBDYXRhbG9ndWVFbnRyeT4oKTtcblxuY2xhc3MgRGVmYXVsdE1vZGVsQ2xpZW50IGltcGxlbWVudHMgTW9kZWxDbGllbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogRGF0YWJyaWNrc01vZGVsQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FjaGVUdGxNczogbnVtYmVyLFxuICApIHt9XG5cbiAgYXN5bmMgbGlzdE1vZGVscyhyZWZyZXNoID0gZmFsc2UpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICAgIHJldHVybiBjbG9uZUVuZHBvaW50cyhhd2FpdCB0aGlzLmNhdGFsb2d1ZShyZWZyZXNoKSk7XG4gIH1cblxuICBhc3luYyBzZWFyY2hNb2RlbHMocXVlcnk6IE1vZGVsUXVlcnkgPSB7fSwgcmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxSYW5rZWRNb2RlbFtdPiB7XG4gICAgcmV0dXJuIGxvb2t1cE1vZGVscyhhd2FpdCB0aGlzLmNhdGFsb2d1ZShyZWZyZXNoKSwgcXVlcnkpLm1hcCgoeyBlbmRwb2ludCwgLi4ucmFua2VkIH0pID0+ICh7XG4gICAgICAuLi5yYW5rZWQsXG4gICAgICBlbmRwb2ludDogY2xvbmVFbmRwb2ludChlbmRwb2ludCksXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgcm91dGUoaW5wdXQ6IE1vZGVsUm91dGVJbnB1dCA9IHt9KTogUHJvbWlzZTxNb2RlbFJvdXRlPiB7XG4gICAgY29uc3QgeyByZWZyZXNoID0gZmFsc2UsIHByb3RvY29sOiByZXF1ZXN0ZWRQcm90b2NvbCwgbG9naW4sIC4uLnNlbGVjdGlvbiB9ID0gaW5wdXQ7XG4gICAgY29uc3QgZWZmZWN0aXZlU2VsZWN0aW9uID1cbiAgICAgIHJlcXVlc3RlZFByb3RvY29sID09PSBcImVtYmVkZGluZ3NcIiAmJiBzZWxlY3Rpb24ubW9kZWxDbGFzcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8geyAuLi5zZWxlY3Rpb24sIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MuRW1iZWRkaW5nIH1cbiAgICAgICAgOiBzZWxlY3Rpb247XG4gICAgY29uc3QgY2F0YWxvZ3VlID0gYXdhaXQgdGhpcy5jYXRhbG9ndWUocmVmcmVzaCk7XG4gICAgbGV0IHJlc29sdmVkID0gcmVzb2x2ZU1vZGVsKGNhdGFsb2d1ZSwgZWZmZWN0aXZlU2VsZWN0aW9uKTtcbiAgICBpZiAoaXNVbm1hdGNoZWRFeHBsaWNpdChjYXRhbG9ndWUsIGVmZmVjdGl2ZVNlbGVjdGlvbiwgcmVzb2x2ZWQpKSB7XG4gICAgICByZXNvbHZlZCA9IHJlc29sdmVNb2RlbChhd2FpdCB0aGlzLmNhdGFsb2d1ZSh0cnVlKSwgZWZmZWN0aXZlU2VsZWN0aW9uKTtcbiAgICB9XG4gICAgY29uc3QgZW5kcG9pbnQgPSAoYXdhaXQgdGhpcy5jYXRhbG9ndWUoZmFsc2UpKS5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IHJlc29sdmVkLm1vZGVsSWQsXG4gICAgKTtcbiAgICBjb25zdCBwcm90b2NvbCA9IHJlcXVlc3RlZFByb3RvY29sID8/IGluZmVyUHJvdG9jb2woZW5kcG9pbnQsIHJlc29sdmVkLm1vZGVsSWQpO1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmNsaWVudC5ob3N0KCk7XG4gICAgY29uc3QgdXJsID0gcm91dGVVcmwoaG9zdCwgcmVzb2x2ZWQubW9kZWxJZCwgcHJvdG9jb2wpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLmNsaWVudC5hdXRoLmhlYWRlcnMoeyBsb2dpbiB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZWxJZDogcmVzb2x2ZWQubW9kZWxJZCxcbiAgICAgIC4uLihlbmRwb2ludCA/IHsgZW5kcG9pbnQ6IGNsb25lRW5kcG9pbnQoZW5kcG9pbnQpIH0gOiB7fSksXG4gICAgICBzb3VyY2U6IHJlc29sdmVkLnNvdXJjZSxcbiAgICAgIHByb3RvY29sLFxuICAgICAgaG9zdCxcbiAgICAgIGFwaUJhc2U6IG5ldyBVUkwoXCJzZXJ2aW5nLWVuZHBvaW50c1wiLCBgJHtob3N0LnJlcGxhY2UoL1xcLyQvLCBcIlwiKX0vYCkudG9TdHJpbmcoKSxcbiAgICAgIHVybCxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRhZGF0YTogbW9kZWxNZXRhZGF0YUZvcihlbmRwb2ludCA/PyByZXNvbHZlZC5tb2RlbElkKSxcbiAgICB9O1xuICB9XG5cbiAgbWV0YWRhdGEobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbE1ldGFkYXRhIHtcbiAgICByZXR1cm4gbW9kZWxNZXRhZGF0YUZvcihtb2RlbCk7XG4gIH1cblxuICBzdGF0dXMoKTogTW9kZWxDbGllbnRTdGF0dXMge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odGhpcy5jbGllbnQuYXV0aC5wcm9maWxlID8geyBwcm9maWxlOiB0aGlzLmNsaWVudC5hdXRoLnByb2ZpbGUgfSA6IHt9KSxcbiAgICAgIGhvc3Q6IHRoaXMuY2xpZW50Lmhvc3QoKSxcbiAgICAgIHByaW5jaXBhbDogdGhpcy5jbGllbnQucHJpbmNpcGFsKCksXG4gICAgICAuLi4odGhpcy5jbGllbnQud29ya3NwYWNlSWQoKSA/IHsgd29ya3NwYWNlSWQ6IHRoaXMuY2xpZW50LndvcmtzcGFjZUlkKCkgfSA6IHt9KSxcbiAgICAgIGNhY2hlVHRsTXM6IHRoaXMuY2FjaGVUdGxNcyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYXRhbG9ndWUocmVmcmVzaDogYm9vbGVhbik6IFByb21pc2U8cmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gICAgY29uc3Qga2V5ID0gY2F0YWxvZ3VlS2V5KHRoaXMuY2xpZW50KTtcbiAgICBpZiAocmVmcmVzaCkgY2F0YWxvZ3VlQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgY29uc3QgY3VycmVudCA9IGNhdGFsb2d1ZUNhY2hlLmdldChrZXkpO1xuICAgIGlmIChjdXJyZW50ICYmIERhdGUubm93KCkgPCBjdXJyZW50LmV4cGlyZXNBdCkgcmV0dXJuIGN1cnJlbnQucHJvbWlzZTtcbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5mZXRjaENhdGFsb2d1ZSgpO1xuICAgIGNvbnN0IGVudHJ5OiBDYXRhbG9ndWVFbnRyeSA9IHsgcHJvbWlzZSwgZXhwaXJlc0F0OiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfTtcbiAgICBjYXRhbG9ndWVDYWNoZS5zZXQoa2V5LCBlbnRyeSk7XG4gICAgdm9pZCBwcm9taXNlLnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGVudHJ5LmV4cGlyZXNBdCA9IERhdGUubm93KCkgKyB0aGlzLmNhY2hlVHRsTXM7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAoY2F0YWxvZ3VlQ2FjaGUuZ2V0KGtleSkgPT09IGVudHJ5KSBjYXRhbG9ndWVDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hDYXRhbG9ndWUoKTogUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQucmVxdWVzdChcIi9hcGkvMi4wL3NlcnZpbmctZW5kcG9pbnRzXCIpO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHJlc3BvbnNlKSB8fCAhQXJyYXkuaXNBcnJheShyZXNwb25zZS5lbmRwb2ludHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYnJpY2tzIHNlcnZpbmctZW5kcG9pbnRzIHJlc3BvbnNlIGlzIG1pc3NpbmcgYW4gZW5kcG9pbnRzIGFycmF5XCIpO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludHMgPSBub3JtYWxpemVFbmRwb2ludHMocmVzcG9uc2UuZW5kcG9pbnRzKTtcbiAgICBsb2dnZXIuZGVidWcoXCJsaXN0ZWRcIiwge1xuICAgICAgY291bnQ6IGVuZHBvaW50cy5sZW5ndGgsXG4gICAgICBob3N0OiB0aGlzLmNsaWVudC5ob3N0KCksXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGVuZHBvaW50cztcbiAgfVxufVxuXG4vKiogQ3JlYXRlIGFuIGF1dGhlbnRpY2F0aW9uLWF3YXJlIERhdGFicmlja3MgbW9kZWwgY2xpZW50LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1vZGVsQ2xpZW50KG9wdGlvbnM6IE1vZGVsQ2xpZW50T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxNb2RlbENsaWVudD4ge1xuICBjb25zdCBjYWNoZVR0bE1zID0gdmFsaWRhdGVDYWNoZVR0bChvcHRpb25zLmNhY2hlVHRsTXMpO1xuICByZXR1cm4gbmV3IERlZmF1bHRNb2RlbENsaWVudChcbiAgICBuZXcgQXV0aGVudGljYXRlZE1vZGVsQ2xpZW50KGF3YWl0IGF1dGhDbGllbnQuY3JlYXRlQXV0aENsaWVudChvcHRpb25zLmF1dGgpLCBnbG9iYWxUaGlzLmZldGNoKSxcbiAgICBjYWNoZVR0bE1zLFxuICApO1xufVxuXG4vKiogTGlzdCBjb25maWd1cmVkIERhdGFicmlja3MgcHJvZmlsZXMgb3V0c2lkZSB0aGUgbW9kZWwgY2xpZW50IGZhY2FkZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0UHJvZmlsZXMocmVmcmVzaCA9IGZhbHNlKTogRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5W10ge1xuICByZXR1cm4gYXV0aFByb2ZpbGUubGlzdFByb2ZpbGVzKHsgcmVmcmVzaCB9KTtcbn1cblxuLyoqIEBpbnRlcm5hbCBDb25zdHJ1Y3QgYSBtb2RlbCBjbGllbnQgYXJvdW5kIGEgdGVzdCBvciBob3N0LW93bmVkIERhdGFicmlja3MgY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsQ2xpZW50V2l0aERhdGFicmlja3NDbGllbnQoXG4gIGNsaWVudDogRGF0YWJyaWNrc01vZGVsQ2xpZW50LFxuICBjYWNoZVR0bE1zID0gREVGQVVMVF9NT0RFTF9DTElFTlRfQ0FDSEVfVFRMX01TLFxuKTogTW9kZWxDbGllbnQge1xuICByZXR1cm4gbmV3IERlZmF1bHRNb2RlbENsaWVudChjbGllbnQsIHZhbGlkYXRlQ2FjaGVUdGwoY2FjaGVUdGxNcykpO1xufVxuXG4vKiogQGludGVybmFsIENyZWF0ZSBhIG1vZGVsIGNsaWVudCB3aXRoIGluamVjdGFibGUgYXV0aCBob3N0IGNhcGFiaWxpdGllcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVNb2RlbENsaWVudFdpdGhEZXBlbmRlbmNpZXMoXG4gIG9wdGlvbnM6IE1vZGVsQ2xpZW50T3B0aW9ucyxcbiAgZGVwZW5kZW5jaWVzOiBEYXRhYnJpY2tzQXV0aERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8TW9kZWxDbGllbnQ+IHtcbiAgcmV0dXJuIG5ldyBEZWZhdWx0TW9kZWxDbGllbnQoXG4gICAgbmV3IEF1dGhlbnRpY2F0ZWRNb2RlbENsaWVudChcbiAgICAgIGF3YWl0IGF1dGhDbGllbnQuY3JlYXRlQXV0aENsaWVudChvcHRpb25zLmF1dGgsIGRlcGVuZGVuY2llcyksXG4gICAgICBkZXBlbmRlbmNpZXMuZmV0Y2ggPz8gZ2xvYmFsVGhpcy5mZXRjaCxcbiAgICApLFxuICAgIHZhbGlkYXRlQ2FjaGVUdGwob3B0aW9ucy5jYWNoZVR0bE1zKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDYWNoZVR0bCh2YWx1ZSA9IERFRkFVTFRfTU9ERUxfQ0xJRU5UX0NBQ0hFX1RUTF9NUyk6IG51bWJlciB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTW9kZWwgY2xpZW50IGNhY2hlVHRsTXMgbXVzdCBiZSBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXJcIik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVLZXkoY2xpZW50OiBEYXRhYnJpY2tzTW9kZWxDbGllbnQpOiBzdHJpbmcge1xuICByZXR1cm4gW2NsaWVudC5ob3N0KCksIGNsaWVudC53b3Jrc3BhY2VJZCgpID8/IFwiXCIsIGNsaWVudC5wcmluY2lwYWwoKV0uam9pbihcIlxcdTAwMDBcIik7XG59XG5cbmZ1bmN0aW9uIGluZmVyUHJvdG9jb2woXG4gIGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IHwgdW5kZWZpbmVkLFxuICBtb2RlbElkOiBzdHJpbmcsXG4pOiBNb2RlbFByb3RvY29sIHtcbiAgaWYgKGVuZHBvaW50Py50YXNrID09PSBcImxsbS92MS9lbWJlZGRpbmdzXCIpIHJldHVybiBcImVtYmVkZGluZ3NcIjtcbiAgcmV0dXJuIG1vZGVsU2VydmluZ0FwaShtb2RlbElkKTtcbn1cblxuZnVuY3Rpb24gcm91dGVVcmwoaG9zdDogc3RyaW5nLCBtb2RlbElkOiBzdHJpbmcsIHByb3RvY29sOiBNb2RlbFByb3RvY29sKTogc3RyaW5nIHtcbiAgaWYgKHByb3RvY29sID09PSBcInJlc3BvbnNlc1wiKSByZXR1cm4gcmVzcG9uc2VzVXBzdHJlYW1VcmwoaG9zdCwgbW9kZWxJZCk7XG4gIGlmIChwcm90b2NvbCA9PT0gXCJjaGF0XCIgJiYgbW9kZWxTZXJ2aW5nQXBpKG1vZGVsSWQpID09PSBcInJlc3BvbnNlc1wiKSB7XG4gICAgcmV0dXJuIGNoYXRDb21wbGV0aW9uc1VybChob3N0KTtcbiAgfVxuICByZXR1cm4gaW52b2NhdGlvbnNVcmwoaG9zdCwgbW9kZWxJZCk7XG59XG5cbmZ1bmN0aW9uIGlzVW5tYXRjaGVkRXhwbGljaXQoXG4gIGNhdGFsb2d1ZTogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBpbnB1dDogUmVzb2x2ZU1vZGVsSW5wdXQsXG4gIHJlc29sdmVkOiBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaW5wdXQuZXhwbGljaXQgIT09IHVuZGVmaW5lZCAmJlxuICAgIGlucHV0LmZ1enp5ICE9PSBmYWxzZSAmJlxuICAgIHJlc29sdmVkLm1vZGVsSWQgPT09IGlucHV0LmV4cGxpY2l0ICYmXG4gICAgIWNhdGFsb2d1ZS5zb21lKChlbmRwb2ludCkgPT4gZW5kcG9pbnQubmFtZSA9PT0gaW5wdXQuZXhwbGljaXQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNsb25lRW5kcG9pbnRzKGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdKTogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdIHtcbiAgcmV0dXJuIGVuZHBvaW50cy5tYXAoY2xvbmVFbmRwb2ludCk7XG59XG5cbmZ1bmN0aW9uIGNsb25lRW5kcG9pbnQoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5lbmRwb2ludCxcbiAgICAuLi4oZW5kcG9pbnQucHJvZmlsZSA/IHsgcHJvZmlsZTogeyAuLi5lbmRwb2ludC5wcm9maWxlIH0gfSA6IHt9KSxcbiAgICAuLi4oZW5kcG9pbnQuc2VydmljZU5hbWVzID8geyBzZXJ2aWNlTmFtZXM6IHsgLi4uZW5kcG9pbnQuc2VydmljZU5hbWVzIH0gfSA6IHt9KSxcbiAgICAuLi4oZW5kcG9pbnQucmVhc29uaW5nRWZmb3J0cyA/IHsgcmVhc29uaW5nRWZmb3J0czogWy4uLmVuZHBvaW50LnJlYXNvbmluZ0VmZm9ydHNdIH0gOiB7fSksXG4gICAgLi4uKGVuZHBvaW50LnN0YXR1cyA/IHsgc3RhdHVzOiB7IC4uLmVuZHBvaW50LnN0YXR1cyB9IH0gOiB7fSksXG4gIH07XG59XG4iXX0=
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGVsLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFDSCxPQUFPLEVBQ0wsZ0JBQWdCLEdBR2pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksSUFBSSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTNFLE9BQU8sS0FBSyxHQUFHLE1BQU0sNEJBQTRCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsVUFBVSxHQU9YLE1BQU0sbUNBQW1DLENBQUM7QUFFM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTFDLHdEQUF3RDtBQUN4RCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQXNFL0QsTUFBTSx3QkFBd0I7SUFFakI7SUFDUTtJQUZuQixZQUNXLElBQWdCLEVBQ1IsT0FBZ0M7UUFEeEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNSLFlBQU8sR0FBUCxPQUFPLENBQXlCO0lBQ2hELENBQUM7SUFFSixJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxD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QWdCLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRixHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDL0QsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dGhlbnRpY2F0aW9uLWF3YXJlIERhdGFicmlja3MgTW9kZWwgU2VydmluZyBjbGllbnQuXG4gKlxuICogVGhpcyBpcyB0aGUgcG9ydGFibGUgZW50cnkgcG9pbnQgdXNlZCBieSBnZW5lcmF0ZWQgUHl0aG9uIGJpbmRpbmdzLiBJdCBrZWVwc1xuICogYXV0aGVudGljYXRpb24sIGVuZHBvaW50IGRpc2NvdmVyeSwgY2FjaGluZywgbm9ybWFsaXphdGlvbiwgcmFua2luZywgcm91dGVcbiAqIHNlbGVjdGlvbiwgcm91dGUgY29uc3RydWN0aW9uLCBhbmQgcHVibGlzaGVkIG1ldGFkYXRhIGluIE5vZGUgd2hpbGUgZXhwb3NpbmdcbiAqIG9uZSBzbWFsbCBjbGllbnQuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQge1xuICBjcmVhdGVBdXRoQ2xpZW50LFxuICB0eXBlIEF1dGhDbGllbnQsXG4gIHR5cGUgRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL2F1dGgvY2xpZW50XCI7XG5pbXBvcnQgeyBsaXN0UHJvZmlsZXMgYXMgbGlzdEF1dGhQcm9maWxlcyB9IGZyb20gXCJAZGJ4LXRvb2xzL2F1dGgvcHJvZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYnJpY2tzUHJvZmlsZVN1bW1hcnkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtYXV0aFwiO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2xvZ1wiO1xuaW1wb3J0ICogYXMgb2JqZWN0IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL29iamVjdFwiO1xuaW1wb3J0IHtcbiAgTW9kZWxDbGFzcyxcbiAgdHlwZSBNb2RlbE1ldGFkYXRhLFxuICB0eXBlIE1vZGVsUXVlcnksXG4gIHR5cGUgUmFua2VkTW9kZWwsXG4gIHR5cGUgUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbixcbiAgdHlwZSBSZXNvbHZlTW9kZWxJbnB1dCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUVuZHBvaW50cyB9IGZyb20gXCIuL19yYW5raW5nLnRzXCI7XG5pbXBvcnQgeyBsb29rdXBNb2RlbHMsIHJlc29sdmVNb2RlbCB9IGZyb20gXCIuL19zZWxlY3Rpb24udHNcIjtcbmltcG9ydCB7IGNoYXRDb21wbGV0aW9uc1VybCwgaW52b2NhdGlvbnNVcmwsIHJlc3BvbnNlc1Vwc3RyZWFtVXJsIH0gZnJvbSBcIi4vaW52b2tlLnRzXCI7XG5pbXBvcnQgeyBoeWRyYXRlTW9kZWxNZXRhZGF0YSwgbW9kZWxNZXRhZGF0YUZvciB9IGZyb20gXCIuL21ldGFkYXRhLnRzXCI7XG5pbXBvcnQgeyBtb2RlbFNlcnZpbmdBcGkgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1vZGVsL2NsaWVudFwiKTtcblxuLyoqIERlZmF1bHQgbGlmZXRpbWUgZm9yIG9uZSBsaXZlIGVuZHBvaW50IGNhdGFsb2d1ZS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG4vKiogQXV0aGVudGljYXRpb24gb3B0aW9ucyBleHBvc2VkIGJ5IHRoZSBwb3J0YWJsZSBtb2RlbCBjbGllbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQXV0aE9wdGlvbnMge1xuICAvKiogRGF0YWJyaWNrcyBwcm9maWxlIG5hbWUuICovXG4gIHByb2ZpbGU/OiBzdHJpbmc7XG59XG5cbi8qKiBDb25zdHJ1Y3Rpb24gb3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZU1vZGVsQ2xpZW50fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDbGllbnRPcHRpb25zIHtcbiAgLyoqIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gYW5kIHByb2ZpbGUgc2VsZWN0aW9uIG9wdGlvbnMuICovXG4gIGF1dGg/OiBNb2RlbEF1dGhPcHRpb25zO1xuICAvKiogSW4tbWVtb3J5IGVuZHBvaW50IGNhdGFsb2d1ZSBUVEwgaW4gbWlsbGlzZWNvbmRzLiAqL1xuICBjYWNoZVR0bE1zPzogbnVtYmVyO1xuICAvKiogSHlkcmF0ZSBOb2RlLW9ubHkgbWV0YWRhdGEgY2FjaGVzIGJlZm9yZSBjb25zdHJ1Y3RpbmcgdGhlIGNsaWVudC4gKi9cbiAgaHlkcmF0ZU1ldGFkYXRhPzogYm9vbGVhbjtcbn1cblxuLyoqIFNlY3JldC1mcmVlIHJ1bnRpbWUgaWRlbnRpdHkgYW5kIGNhY2hlIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2xpZW50U3RhdHVzIHtcbiAgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSBwcmluY2lwYWw6IHN0cmluZztcbiAgcmVhZG9ubHkgd29ya3NwYWNlSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNhY2hlVHRsTXM6IG51bWJlcjtcbn1cblxuLyoqIFNlcnZpbmcgcHJvdG9jb2wgc2VsZWN0ZWQgZm9yIG9uZSByZXNvbHZlZCBtb2RlbC4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUHJvdG9jb2wgPSBcImNoYXRcIiB8IFwicmVzcG9uc2VzXCIgfCBcImVtYmVkZGluZ3NcIjtcblxuLyoqIE1vZGVsIHNlbGVjdGlvbiBwbHVzIHJvdXRlIGNvbnRyb2xzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJvdXRlSW5wdXQgZXh0ZW5kcyBSZXNvbHZlTW9kZWxJbnB1dCB7XG4gIC8qKiBGb3JjZSBhIGxpdmUgZW5kcG9pbnQgY2F0YWxvZ3VlIHJlZnJlc2ggYmVmb3JlIHNlbGVjdGlvbi4gKi9cbiAgcmVmcmVzaD86IGJvb2xlYW47XG4gIC8qKiBSZXF1ZXN0ZWQgdXBzdHJlYW0gcHJvdG9jb2wuIERlZmF1bHRzIGZyb20gZW5kcG9pbnQgdGFzayBhbmQgbW9kZWwgcG9saWN5LiAqL1xuICBwcm90b2NvbD86IE1vZGVsUHJvdG9jb2w7XG4gIC8qKiBXaGV0aGVyIGF1dGhlbnRpY2F0aW9uIG1heSBydW4gYW4gaW50ZXJhY3RpdmUgbG9naW4uICovXG4gIGxvZ2luPzogYm9vbGVhbjtcbn1cblxuLyoqIEZ1bGx5IHJlc29sdmVkIERhdGFicmlja3Mgcm91dGUgZm9yIGEgbW9kZWwgcmVxdWVzdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxSb3V0ZSB7XG4gIHJlYWRvbmx5IG1vZGVsSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZW5kcG9pbnQ/OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5O1xuICByZWFkb25seSBzb3VyY2U6IFJlc29sdmVkTW9kZWxTZWxlY3Rpb25bXCJzb3VyY2VcIl07XG4gIHJlYWRvbmx5IHByb3RvY29sOiBNb2RlbFByb3RvY29sO1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFwaUJhc2U6IHN0cmluZztcbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICByZWFkb25seSBtZXRhZGF0YTogTW9kZWxNZXRhZGF0YTtcbn1cblxuLyoqIFN0YWJsZSBtb2RlbCBmYWNhZGUgc2hhcmVkIGJ5IE5vZGUgYW5kIGdlbmVyYXRlZCBsYW5ndWFnZSBiaW5kaW5ncy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDbGllbnQge1xuICBsaXN0TW9kZWxzKHJlZnJlc2g/OiBib29sZWFuKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+O1xuICBzZWFyY2hNb2RlbHMocXVlcnk/OiBNb2RlbFF1ZXJ5LCByZWZyZXNoPzogYm9vbGVhbik6IFByb21pc2U8UmFua2VkTW9kZWxbXT47XG4gIHJvdXRlKGlucHV0PzogTW9kZWxSb3V0ZUlucHV0KTogUHJvbWlzZTxNb2RlbFJvdXRlPjtcbiAgbWV0YWRhdGEobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbE1ldGFkYXRhO1xuICBzdGF0dXMoKTogTW9kZWxDbGllbnRTdGF0dXM7XG59XG5cbmludGVyZmFjZSBEYXRhYnJpY2tzTW9kZWxDbGllbnQge1xuICByZWFkb25seSBhdXRoOiBBdXRoQ2xpZW50O1xuICBob3N0KCk6IHN0cmluZztcbiAgcHJpbmNpcGFsKCk6IHN0cmluZztcbiAgd29ya3NwYWNlSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZXF1ZXN0KHBhdGg6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj47XG59XG5cbmNsYXNzIEF1dGhlbnRpY2F0ZWRNb2RlbENsaWVudCBpbXBsZW1lbnRzIERhdGFicmlja3NNb2RlbENsaWVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGF1dGg6IEF1dGhDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmZXRjaGVyOiB0eXBlb2YgZ2xvYmFsVGhpcy5mZXRjaCxcbiAgKSB7fVxuXG4gIGhvc3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLmhvc3Q7XG4gIH1cblxuICBwcmluY2lwYWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLnByaW5jaXBhbDtcbiAgfVxuXG4gIHdvcmtzcGFjZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC53b3Jrc3BhY2VJZDtcbiAgfVxuXG4gIGFzeW5jIHJlcXVlc3QocGF0aDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoLCBgJHt0aGlzLmhvc3QoKS5yZXBsYWNlKC9cXC8kLywgXCJcIil9L2ApLnRvU3RyaW5nKCk7XG4gICAgbGV0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLmF1dGguaGVhZGVycygpO1xuICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hlcih1cmwsIHsgaGVhZGVycyB9KTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgIGhlYWRlcnMgPSBhd2FpdCB0aGlzLmF1dGguaGVhZGVycyh7IHJlZnJlc2g6IHRydWUgfSk7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hlcih1cmwsIHsgaGVhZGVycyB9KTtcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhYnJpY2tzIE1vZGVsIFNlcnZpbmcgQVBJICR7cGF0aH0gcmV0dXJuZWQgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7dGV4dH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQgPyBKU09OLnBhcnNlKHRleHQpIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbmludGVyZmFjZSBDYXRhbG9ndWVFbnRyeSB7XG4gIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8cmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPjtcbiAgZXhwaXJlc0F0OiBudW1iZXI7XG59XG5cbmNvbnN0IGNhdGFsb2d1ZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIENhdGFsb2d1ZUVudHJ5PigpO1xuXG5jbGFzcyBEZWZhdWx0TW9kZWxDbGllbnQgaW1wbGVtZW50cyBNb2RlbENsaWVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBEYXRhYnJpY2tzTW9kZWxDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWNoZVR0bE1zOiBudW1iZXIsXG4gICkge31cblxuICBhc3luYyBsaXN0TW9kZWxzKHJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gICAgcmV0dXJuIGNsb25lRW5kcG9pbnRzKGF3YWl0IHRoaXMuY2F0YWxvZ3VlKHJlZnJlc2gpKTtcbiAgfVxuXG4gIGFzeW5jIHNlYXJjaE1vZGVscyhxdWVyeTogTW9kZWxRdWVyeSA9IHt9LCByZWZyZXNoID0gZmFsc2UpOiBQcm9taXNlPFJhbmtlZE1vZGVsW10+IHtcbiAgICByZXR1cm4gbG9va3VwTW9kZWxzKGF3YWl0IHRoaXMuY2F0YWxvZ3VlKHJlZnJlc2gpLCBxdWVyeSkubWFwKCh7IGVuZHBvaW50LCAuLi5yYW5rZWQgfSkgPT4gKHtcbiAgICAgIC4uLnJhbmtlZCxcbiAgICAgIGVuZHBvaW50OiBjbG9uZUVuZHBvaW50KGVuZHBvaW50KSxcbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyByb3V0ZShpbnB1dDogTW9kZWxSb3V0ZUlucHV0ID0ge30pOiBQcm9taXNlPE1vZGVsUm91dGU+IHtcbiAgICBjb25zdCB7IHJlZnJlc2ggPSBmYWxzZSwgcHJvdG9jb2w6IHJlcXVlc3RlZFByb3RvY29sLCBsb2dpbiwgLi4uc2VsZWN0aW9uIH0gPSBpbnB1dDtcbiAgICBjb25zdCBlZmZlY3RpdmVTZWxlY3Rpb24gPVxuICAgICAgcmVxdWVzdGVkUHJvdG9jb2wgPT09IFwiZW1iZWRkaW5nc1wiICYmIHNlbGVjdGlvbi5tb2RlbENsYXNzID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IC4uLnNlbGVjdGlvbiwgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfVxuICAgICAgICA6IHNlbGVjdGlvbjtcbiAgICBjb25zdCBjYXRhbG9ndWUgPSBhd2FpdCB0aGlzLmNhdGFsb2d1ZShyZWZyZXNoKTtcbiAgICBsZXQgcmVzb2x2ZWQgPSByZXNvbHZlTW9kZWwoY2F0YWxvZ3VlLCBlZmZlY3RpdmVTZWxlY3Rpb24pO1xuICAgIGlmIChpc1VubWF0Y2hlZEV4cGxpY2l0KGNhdGFsb2d1ZSwgZWZmZWN0aXZlU2VsZWN0aW9uLCByZXNvbHZlZCkpIHtcbiAgICAgIHJlc29sdmVkID0gcmVzb2x2ZU1vZGVsKGF3YWl0IHRoaXMuY2F0YWxvZ3VlKHRydWUpLCBlZmZlY3RpdmVTZWxlY3Rpb24pO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludCA9IChhd2FpdCB0aGlzLmNhdGFsb2d1ZShmYWxzZSkpLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PT0gcmVzb2x2ZWQubW9kZWxJZCxcbiAgICApO1xuICAgIGNvbnN0IHByb3RvY29sID0gcmVxdWVzdGVkUHJvdG9jb2wgPz8gaW5mZXJQcm90b2NvbChlbmRwb2ludCwgcmVzb2x2ZWQubW9kZWxJZCk7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuY2xpZW50Lmhvc3QoKTtcbiAgICBjb25zdCB1cmwgPSByb3V0ZVVybChob3N0LCByZXNvbHZlZC5tb2RlbElkLCBwcm90b2NvbCk7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMuY2xpZW50LmF1dGguaGVhZGVycyh7IGxvZ2luIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlbElkOiByZXNvbHZlZC5tb2RlbElkLFxuICAgICAgLi4uKGVuZHBvaW50ID8geyBlbmRwb2ludDogY2xvbmVFbmRwb2ludChlbmRwb2ludCkgfSA6IHt9KSxcbiAgICAgIHNvdXJjZTogcmVzb2x2ZWQuc291cmNlLFxuICAgICAgcHJvdG9jb2wsXG4gICAgICBob3N0LFxuICAgICAgYXBpQmFzZTogbmV3IFVSTChcInNlcnZpbmctZW5kcG9pbnRzXCIsIGAke2hvc3QucmVwbGFjZSgvXFwvJC8sIFwiXCIpfS9gKS50b1N0cmluZygpLFxuICAgICAgdXJsLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGFkYXRhOiBtb2RlbE1ldGFkYXRhRm9yKGVuZHBvaW50ID8/IHJlc29sdmVkLm1vZGVsSWQpLFxuICAgIH07XG4gIH1cblxuICBtZXRhZGF0YShtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsTWV0YWRhdGEge1xuICAgIHJldHVybiBtb2RlbE1ldGFkYXRhRm9yKG1vZGVsKTtcbiAgfVxuXG4gIHN0YXR1cygpOiBNb2RlbENsaWVudFN0YXR1cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLih0aGlzLmNsaWVudC5hdXRoLnByb2ZpbGUgPyB7IHByb2ZpbGU6IHRoaXMuY2xpZW50LmF1dGgucHJvZmlsZSB9IDoge30pLFxuICAgICAgaG9zdDogdGhpcy5jbGllbnQuaG9zdCgpLFxuICAgICAgcHJpbmNpcGFsOiB0aGlzLmNsaWVudC5wcmluY2lwYWwoKSxcbiAgICAgIC4uLih0aGlzLmNsaWVudC53b3Jrc3BhY2VJZCgpID8geyB3b3Jrc3BhY2VJZDogdGhpcy5jbGllbnQud29ya3NwYWNlSWQoKSB9IDoge30pLFxuICAgICAgY2FjaGVUdGxNczogdGhpcy5jYWNoZVR0bE1zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNhdGFsb2d1ZShyZWZyZXNoOiBib29sZWFuKTogUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+IHtcbiAgICBjb25zdCBrZXkgPSBjYXRhbG9ndWVLZXkodGhpcy5jbGllbnQpO1xuICAgIGlmIChyZWZyZXNoKSBjYXRhbG9ndWVDYWNoZS5kZWxldGUoa2V5KTtcbiAgICBjb25zdCBjdXJyZW50ID0gY2F0YWxvZ3VlQ2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKGN1cnJlbnQgJiYgRGF0ZS5ub3coKSA8IGN1cnJlbnQuZXhwaXJlc0F0KSByZXR1cm4gY3VycmVudC5wcm9taXNlO1xuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLmZldGNoQ2F0YWxvZ3VlKCk7XG4gICAgY29uc3QgZW50cnk6IENhdGFsb2d1ZUVudHJ5ID0geyBwcm9taXNlLCBleHBpcmVzQXQ6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB9O1xuICAgIGNhdGFsb2d1ZUNhY2hlLnNldChrZXksIGVudHJ5KTtcbiAgICB2b2lkIHByb21pc2UudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgZW50cnkuZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIHRoaXMuY2FjaGVUdGxNcztcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmIChjYXRhbG9ndWVDYWNoZS5nZXQoa2V5KSA9PT0gZW50cnkpIGNhdGFsb2d1ZUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaENhdGFsb2d1ZSgpOiBQcm9taXNlPHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXF1ZXN0KFwiL2FwaS8yLjAvc2VydmluZy1lbmRwb2ludHNcIik7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQocmVzcG9uc2UpIHx8ICFBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVuZHBvaW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRhdGFicmlja3Mgc2VydmluZy1lbmRwb2ludHMgcmVzcG9uc2UgaXMgbWlzc2luZyBhbiBlbmRwb2ludHMgYXJyYXlcIik7XG4gICAgfVxuICAgIGNvbnN0IGVuZHBvaW50cyA9IG5vcm1hbGl6ZUVuZHBvaW50cyhyZXNwb25zZS5lbmRwb2ludHMpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZFwiLCB7XG4gICAgICBjb3VudDogZW5kcG9pbnRzLmxlbmd0aCxcbiAgICAgIGhvc3Q6IHRoaXMuY2xpZW50Lmhvc3QoKSxcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICB9KTtcbiAgICByZXR1cm4gZW5kcG9pbnRzO1xuICB9XG59XG5cbi8qKiBDcmVhdGUgYW4gYXV0aGVudGljYXRpb24tYXdhcmUgRGF0YWJyaWNrcyBtb2RlbCBjbGllbnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTW9kZWxDbGllbnQob3B0aW9uczogTW9kZWxDbGllbnRPcHRpb25zID0ge30pOiBQcm9taXNlPE1vZGVsQ2xpZW50PiB7XG4gIGNvbnN0IGNhY2hlVHRsTXMgPSB2YWxpZGF0ZUNhY2hlVHRsKG9wdGlvbnMuY2FjaGVUdGxNcyk7XG4gIGlmIChvcHRpb25zLmh5ZHJhdGVNZXRhZGF0YSA/PyB0cnVlKSBhd2FpdCBoeWRyYXRlTW9kZWxNZXRhZGF0YSgpO1xuICByZXR1cm4gbmV3IERlZmF1bHRNb2RlbENsaWVudChcbiAgICBuZXcgQXV0aGVudGljYXRlZE1vZGVsQ2xpZW50KGF3YWl0IGNyZWF0ZUF1dGhDbGllbnQob3B0aW9ucy5hdXRoKSwgZ2xvYmFsVGhpcy5mZXRjaCksXG4gICAgY2FjaGVUdGxNcyxcbiAgKTtcbn1cblxuLyoqIExpc3QgY29uZmlndXJlZCBEYXRhYnJpY2tzIHByb2ZpbGVzIG91dHNpZGUgdGhlIG1vZGVsIGNsaWVudCBmYWNhZGUuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFByb2ZpbGVzKHJlZnJlc2ggPSBmYWxzZSk6IERhdGFicmlja3NQcm9maWxlU3VtbWFyeVtdIHtcbiAgcmV0dXJuIGxpc3RBdXRoUHJvZmlsZXMoeyByZWZyZXNoIH0pO1xufVxuXG4vKiogQGludGVybmFsIENvbnN0cnVjdCBhIG1vZGVsIGNsaWVudCBhcm91bmQgYSB0ZXN0IG9yIGhvc3Qtb3duZWQgRGF0YWJyaWNrcyBjbGllbnQuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxDbGllbnRXaXRoRGF0YWJyaWNrc0NsaWVudChcbiAgY2xpZW50OiBEYXRhYnJpY2tzTW9kZWxDbGllbnQsXG4gIGNhY2hlVHRsTXMgPSBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMsXG4pOiBNb2RlbENsaWVudCB7XG4gIHJldHVybiBuZXcgRGVmYXVsdE1vZGVsQ2xpZW50KGNsaWVudCwgdmFsaWRhdGVDYWNoZVR0bChjYWNoZVR0bE1zKSk7XG59XG5cbi8qKiBAaW50ZXJuYWwgQ3JlYXRlIGEgbW9kZWwgY2xpZW50IHdpdGggaW5qZWN0YWJsZSBhdXRoIGhvc3QgY2FwYWJpbGl0aWVzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1vZGVsQ2xpZW50V2l0aERlcGVuZGVuY2llcyhcbiAgb3B0aW9uczogTW9kZWxDbGllbnRPcHRpb25zLFxuICBkZXBlbmRlbmNpZXM6IERhdGFicmlja3NBdXRoRGVwZW5kZW5jaWVzLFxuKTogUHJvbWlzZTxNb2RlbENsaWVudD4ge1xuICBpZiAob3B0aW9ucy5oeWRyYXRlTWV0YWRhdGEgPz8gdHJ1ZSkgYXdhaXQgaHlkcmF0ZU1vZGVsTWV0YWRhdGEoKTtcbiAgcmV0dXJuIG5ldyBEZWZhdWx0TW9kZWxDbGllbnQoXG4gICAgbmV3IEF1dGhlbnRpY2F0ZWRNb2RlbENsaWVudChcbiAgICAgIGF3YWl0IGNyZWF0ZUF1dGhDbGllbnQob3B0aW9ucy5hdXRoLCBkZXBlbmRlbmNpZXMpLFxuICAgICAgZGVwZW5kZW5jaWVzLmZldGNoID8/IGdsb2JhbFRoaXMuZmV0Y2gsXG4gICAgKSxcbiAgICB2YWxpZGF0ZUNhY2hlVHRsKG9wdGlvbnMuY2FjaGVUdGxNcyksXG4gICk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2FjaGVUdGwodmFsdWUgPSBERUZBVUxUX01PREVMX0NMSUVOVF9DQUNIRV9UVExfTVMpOiBudW1iZXIge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk1vZGVsIGNsaWVudCBjYWNoZVR0bE1zIG11c3QgYmUgYSBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyXCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2F0YWxvZ3VlS2V5KGNsaWVudDogRGF0YWJyaWNrc01vZGVsQ2xpZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIFtjbGllbnQuaG9zdCgpLCBjbGllbnQud29ya3NwYWNlSWQoKSA/PyBcIlwiLCBjbGllbnQucHJpbmNpcGFsKCldLmpvaW4oXCJcXHUwMDAwXCIpO1xufVxuXG5mdW5jdGlvbiBpbmZlclByb3RvY29sKFxuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSB8IHVuZGVmaW5lZCxcbiAgbW9kZWxJZDogc3RyaW5nLFxuKTogTW9kZWxQcm90b2NvbCB7XG4gIGlmIChlbmRwb2ludD8udGFzayA9PT0gXCJsbG0vdjEvZW1iZWRkaW5nc1wiKSByZXR1cm4gXCJlbWJlZGRpbmdzXCI7XG4gIHJldHVybiBtb2RlbFNlcnZpbmdBcGkobW9kZWxJZCk7XG59XG5cbmZ1bmN0aW9uIHJvdXRlVXJsKGhvc3Q6IHN0cmluZywgbW9kZWxJZDogc3RyaW5nLCBwcm90b2NvbDogTW9kZWxQcm90b2NvbCk6IHN0cmluZyB7XG4gIGlmIChwcm90b2NvbCA9PT0gXCJyZXNwb25zZXNcIikgcmV0dXJuIHJlc3BvbnNlc1Vwc3RyZWFtVXJsKGhvc3QsIG1vZGVsSWQpO1xuICBpZiAocHJvdG9jb2wgPT09IFwiY2hhdFwiICYmIG1vZGVsU2VydmluZ0FwaShtb2RlbElkKSA9PT0gXCJyZXNwb25zZXNcIikge1xuICAgIHJldHVybiBjaGF0Q29tcGxldGlvbnNVcmwoaG9zdCk7XG4gIH1cbiAgcmV0dXJuIGludm9jYXRpb25zVXJsKGhvc3QsIG1vZGVsSWQpO1xufVxuXG5mdW5jdGlvbiBpc1VubWF0Y2hlZEV4cGxpY2l0KFxuICBjYXRhbG9ndWU6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgaW5wdXQ6IFJlc29sdmVNb2RlbElucHV0LFxuICByZXNvbHZlZDogUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbixcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlucHV0LmV4cGxpY2l0ICE9PSB1bmRlZmluZWQgJiZcbiAgICBpbnB1dC5mdXp6eSAhPT0gZmFsc2UgJiZcbiAgICByZXNvbHZlZC5tb2RlbElkID09PSBpbnB1dC5leHBsaWNpdCAmJlxuICAgICFjYXRhbG9ndWUuc29tZSgoZW5kcG9pbnQpID0+IGVuZHBvaW50Lm5hbWUgPT09IGlucHV0LmV4cGxpY2l0KVxuICApO1xufVxuXG5mdW5jdGlvbiBjbG9uZUVuZHBvaW50cyhlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSk6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSB7XG4gIHJldHVybiBlbmRwb2ludHMubWFwKGNsb25lRW5kcG9pbnQpO1xufVxuXG5mdW5jdGlvbiBjbG9uZUVuZHBvaW50KGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogU2VydmluZ0VuZHBvaW50U3VtbWFyeSB7XG4gIHJldHVybiB7XG4gICAgLi4uZW5kcG9pbnQsXG4gICAgLi4uKGVuZHBvaW50LnByb2ZpbGUgPyB7IHByb2ZpbGU6IHsgLi4uZW5kcG9pbnQucHJvZmlsZSB9IH0gOiB7fSksXG4gICAgLi4uKGVuZHBvaW50LnNlcnZpY2VOYW1lcyA/IHsgc2VydmljZU5hbWVzOiB7IC4uLmVuZHBvaW50LnNlcnZpY2VOYW1lcyB9IH0gOiB7fSksXG4gICAgLi4uKGVuZHBvaW50LnJlYXNvbmluZ0VmZm9ydHMgPyB7IHJlYXNvbmluZ0VmZm9ydHM6IFsuLi5lbmRwb2ludC5yZWFzb25pbmdFZmZvcnRzXSB9IDoge30pLFxuICAgIC4uLihlbmRwb2ludC5zdGF0dXMgPyB7IHN0YXR1czogeyAuLi5lbmRwb2ludC5zdGF0dXMgfSB9IDoge30pLFxuICB9O1xufVxuIl19
|
package/lib/src/policy.d.ts
CHANGED
|
@@ -6,6 +6,20 @@ export declare function modelFamily(name: string): string | undefined;
|
|
|
6
6
|
export declare function modelFamilyRank(family: string): number;
|
|
7
7
|
/** Normalize a recognized model identity into family, version, and variant tokens. */
|
|
8
8
|
export declare function modelSearchQuery(name: string): string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Return whether `name` has native web search: an exact documented identity, or
|
|
11
|
+
* a later {@link versionTuple} in the same family as a documented native
|
|
12
|
+
* web-search model. Intra-family floors use the name digit parser so identities
|
|
13
|
+
* like `databricks-claude-opus-4-8` and `system.ai.gpt-6-1-sol` compare.
|
|
14
|
+
* Hosted GPT-OSS weights never inherit.
|
|
15
|
+
*/
|
|
16
|
+
export declare function inheritsNativeWebSearch(name: string, documented: Iterable<string>): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Return whether an identity names a Databricks-hosted foundation model
|
|
19
|
+
* (`databricks-*` endpoint or `system.ai.*` model service). Custom and
|
|
20
|
+
* external endpoints use arbitrary names, so their digits are not versions.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isFoundationModelIdentity(name: string): boolean;
|
|
9
23
|
/** Return the reasoning efforts accepted by a model family. */
|
|
10
24
|
export declare function modelReasoningEfforts(name: string): ReasoningEffort[];
|
|
11
25
|
/** Return whether policy verifies a complete tool-calling round trip. */
|