@dbx-tools/model 0.9.166 → 0.9.173
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/index.ts +4 -4
- package/lib/index.d.ts +4 -4
- package/lib/index.js +4 -4
- package/lib/scripts/generate-metadata.js +15 -3
- package/lib/src/_metadata-generator.d.ts +5 -1
- package/lib/src/_metadata-generator.js +168 -1
- package/lib/src/_ranking.js +9 -3
- package/lib/src/generated/model-capabilities.json +5 -3
- package/lib/src/generated/model-rate-limits.json +76 -71
- package/lib/src/generated/model-reasoning.json +24 -1
- package/lib/src/generated/modelparams-reasoning.json +477 -0
- package/lib/src/generated/models-dev-capabilities.json +3622 -0
- package/lib/src/generated/retired-models.json +3 -1
- package/lib/src/metadata-contract.d.ts +27 -0
- package/lib/src/metadata-contract.js +5 -1
- package/lib/src/metadata.d.ts +17 -9
- package/lib/src/metadata.js +147 -27
- package/lib/src/reasoning-translation.d.ts +8 -6
- package/lib/src/reasoning-translation.js +17 -13
- package/package.json +9 -8
- package/src/_metadata-generator.ts +181 -0
- package/src/_ranking.ts +12 -2
- package/src/generated/model-capabilities.json +5 -3
- package/src/generated/model-rate-limits.json +76 -71
- package/src/generated/model-reasoning.json +24 -1
- package/src/generated/modelparams-reasoning.json +477 -0
- package/src/generated/models-dev-capabilities.json +3622 -0
- package/src/generated/retired-models.json +3 -1
- package/src/metadata-contract.ts +33 -0
- package/src/metadata.ts +204 -33
- package/src/reasoning-translation.ts +16 -12
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt":
|
|
2
|
+
"generatedAt": 1793283170,
|
|
3
3
|
"models": [
|
|
4
4
|
"Anthropic Claude 3.7 Sonnet",
|
|
5
5
|
"Anthropic Claude Sonnet 4",
|
|
6
6
|
"DBRX",
|
|
7
7
|
"DBRX Instruct",
|
|
8
|
+
"DeepSeek V4 Flash (0731)",
|
|
8
9
|
"DeepSeek V4 Pro (0813)",
|
|
10
|
+
"DeepSeek V4.1 Flash",
|
|
9
11
|
"Gemini 2.5 Flash",
|
|
10
12
|
"Gemini 2.5 Pro",
|
|
11
13
|
"Gemini 3 Pro",
|
|
@@ -11,6 +11,10 @@ export declare const WEB_SEARCH_MODELS_URL = "https://docs.databricks.com/aws/en
|
|
|
11
11
|
export declare const MODEL_RATE_LIMITS_URL = "https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/limits";
|
|
12
12
|
/** Databricks documentation URL for reasoning-effort model policy. */
|
|
13
13
|
export declare const QUERY_REASON_MODELS_URL = "https://docs.databricks.com/aws/en/machine-learning/model-serving/query-reason-models";
|
|
14
|
+
/** models.dev provider catalogue URL. */
|
|
15
|
+
export declare const MODELS_DEV_API_URL = "https://models.dev/api.json";
|
|
16
|
+
/** modelparams.dev normalized model-parameter catalogue URL. */
|
|
17
|
+
export declare const MODELPARAMS_DEV_MODELS_URL = "https://modelparams.dev/api/v1/models.json";
|
|
14
18
|
/** Build-generated retired-model snapshot. */
|
|
15
19
|
export interface RetiredModelsSnapshot {
|
|
16
20
|
readonly generatedAt: number;
|
|
@@ -46,3 +50,26 @@ export interface ReasoningModelsSnapshot {
|
|
|
46
50
|
readonly generatedAt: number;
|
|
47
51
|
readonly catalogue: ReasoningModelCatalogue;
|
|
48
52
|
}
|
|
53
|
+
/** Portable capability sets normalized from models.dev. */
|
|
54
|
+
export interface ModelsDevCapabilityCatalogue {
|
|
55
|
+
readonly imageInput: readonly string[];
|
|
56
|
+
readonly reasoning: readonly string[];
|
|
57
|
+
readonly tools: readonly string[];
|
|
58
|
+
readonly structuredOutput: readonly string[];
|
|
59
|
+
readonly temperatureSupported: readonly string[];
|
|
60
|
+
readonly temperatureUnsupported: readonly string[];
|
|
61
|
+
}
|
|
62
|
+
/** Build-generated models.dev capability and reasoning snapshot. */
|
|
63
|
+
export interface ModelsDevSnapshot {
|
|
64
|
+
readonly generatedAt: number;
|
|
65
|
+
readonly capabilities: ModelsDevCapabilityCatalogue;
|
|
66
|
+
}
|
|
67
|
+
/** Reasoning support and discrete effort levels normalized from modelparams.dev. */
|
|
68
|
+
export interface ModelParamsCatalogue extends ReasoningModelCatalogue {
|
|
69
|
+
readonly reasoning: readonly string[];
|
|
70
|
+
}
|
|
71
|
+
/** Build-generated modelparams.dev reasoning snapshot. */
|
|
72
|
+
export interface ModelParamsSnapshot {
|
|
73
|
+
readonly generatedAt: number;
|
|
74
|
+
readonly catalogue: ModelParamsCatalogue;
|
|
75
|
+
}
|
|
@@ -10,4 +10,8 @@ export const WEB_SEARCH_MODELS_URL = "https://docs.databricks.com/aws/en/machine
|
|
|
10
10
|
export const MODEL_RATE_LIMITS_URL = "https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/limits";
|
|
11
11
|
/** Databricks documentation URL for reasoning-effort model policy. */
|
|
12
12
|
export const QUERY_REASON_MODELS_URL = "https://docs.databricks.com/aws/en/machine-learning/model-serving/query-reason-models";
|
|
13
|
-
|
|
13
|
+
/** models.dev provider catalogue URL. */
|
|
14
|
+
export const MODELS_DEV_API_URL = "https://models.dev/api.json";
|
|
15
|
+
/** modelparams.dev normalized model-parameter catalogue URL. */
|
|
16
|
+
export const MODELPARAMS_DEV_MODELS_URL = "https://modelparams.dev/api/v1/models.json";
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEtY29udHJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEtY29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV6RCxrRUFBa0U7QUFDbEUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQzdCLDJFQUEyRSxDQUFDO0FBRTlFLHVFQUF1RTtBQUN2RSxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FDdEMsMEZBQTBGLENBQUM7QUFFN0Ysd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUNoQyw4RUFBOEUsQ0FBQztBQUVqRixvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQ2hDLGtGQUFrRixDQUFDO0FBRXJGLHNFQUFzRTtBQUN0RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FDbEMsdUZBQXVGLENBQUM7QUFFMUYseUNBQXlDO0FBQ3pDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLDZCQUE2QixDQUFDO0FBRWhFLGdFQUFnRTtBQUNoRSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw0Q0FBNEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTW9kZWxSYXRlTGltaXRzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5cbi8qKiBPbmUgZGF5LCBtYXRjaGluZyB0aGUgcmVmcmVzaCBjYWRlbmNlIG9mIERhdGFicmlja3MgbW9kZWwgZG9jdW1lbnRhdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBNT0RFTF9NRVRBREFUQV9UVExfTVMgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKiogRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uIFVSTCBmb3IgcmV0aXJlZCBmb3VuZGF0aW9uIG1vZGVscy4gKi9cbmV4cG9ydCBjb25zdCBSRVRJUkVEX01PREVMU19VUkwgPVxuICBcImh0dHBzOi8vZG9jcy5kYXRhYnJpY2tzLmNvbS9hd3MvZW4vbWFjaGluZS1sZWFybmluZy9yZXRpcmVkLW1vZGVscy1wb2xpY3lcIjtcblxuLyoqIERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiBVUkwgZm9yIE9wZW5BSSBSZXNwb25zZXMgbW9kZWwgc3VwcG9ydC4gKi9cbmV4cG9ydCBjb25zdCBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwgPVxuICBcImh0dHBzOi8vZG9jcy5kYXRhYnJpY2tzLmNvbS9hd3MvZW4vbWFjaGluZS1sZWFybmluZy9tb2RlbC1zZXJ2aW5nL3F1ZXJ5LW9wZW5haS1yZXNwb25zZXNcIjtcblxuLyoqIERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiBVUkwgZm9yIG5hdGl2ZSB3ZWItc2VhcmNoIG1vZGVsIHN1cHBvcnQuICovXG5leHBvcnQgY29uc3QgV0VCX1NFQVJDSF9NT0RFTFNfVVJMID1cbiAgXCJodHRwczovL2RvY3MuZGF0YWJyaWNrcy5jb20vYXdzL2VuL21hY2hpbmUtbGVhcm5pbmcvbW9kZWwtc2VydmluZy93ZWItc2VhcmNoXCI7XG5cbi8qKiBEYXRhYnJpY2tzIGRvY3VtZW50YXRpb24gVVJMIGZvciBGb3VuZGF0aW9uIE1vZGVsIEFQSSBsaW1pdHMuICovXG5leHBvcnQgY29uc3QgTU9ERUxfUkFURV9MSU1JVFNfVVJMID1cbiAgXCJodHRwczovL2RvY3MuZGF0YWJyaWNrcy5jb20vYXdzL2VuL21hY2hpbmUtbGVhcm5pbmcvZm91bmRhdGlvbi1tb2RlbC1hcGlzL2xpbWl0c1wiO1xuXG4vKiogRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uIFVSTCBmb3IgcmVhc29uaW5nLWVmZm9ydCBtb2RlbCBwb2xpY3kuICovXG5leHBvcnQgY29uc3QgUVVFUllfUkVBU09OX01PREVMU19VUkwgPVxuICBcImh0dHBzOi8vZG9jcy5kYXRhYnJpY2tzLmNvbS9hd3MvZW4vbWFjaGluZS1sZWFybmluZy9tb2RlbC1zZXJ2aW5nL3F1ZXJ5LXJlYXNvbi1tb2RlbHNcIjtcblxuLyoqIG1vZGVscy5kZXYgcHJvdmlkZXIgY2F0YWxvZ3VlIFVSTC4gKi9cbmV4cG9ydCBjb25zdCBNT0RFTFNfREVWX0FQSV9VUkwgPSBcImh0dHBzOi8vbW9kZWxzLmRldi9hcGkuanNvblwiO1xuXG4vKiogbW9kZWxwYXJhbXMuZGV2IG5vcm1hbGl6ZWQgbW9kZWwtcGFyYW1ldGVyIGNhdGFsb2d1ZSBVUkwuICovXG5leHBvcnQgY29uc3QgTU9ERUxQQVJBTVNfREVWX01PREVMU19VUkwgPSBcImh0dHBzOi8vbW9kZWxwYXJhbXMuZGV2L2FwaS92MS9tb2RlbHMuanNvblwiO1xuXG4vKiogQnVpbGQtZ2VuZXJhdGVkIHJldGlyZWQtbW9kZWwgc25hcHNob3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldGlyZWRNb2RlbHNTbmFwc2hvdCB7XG4gIHJlYWRvbmx5IGdlbmVyYXRlZEF0OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1vZGVsczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKiBOb3JtYWxpemVkIG1vZGVsIGlkZW50aXRpZXMgZ3JvdXBlZCBieSBkb2N1bWVudGVkIGNhcGFiaWxpdHkuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZSB7XG4gIHJlYWRvbmx5IHJlc3BvbnNlczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGltYWdlSW5wdXQ6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBhcHBseVBhdGNoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgd2ViU2VhcmNoOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIEJ1aWxkLWdlbmVyYXRlZCBtb2RlbC1jYXBhYmlsaXR5IHNuYXBzaG90LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90IHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgY2FwYWJpbGl0aWVzOiBNb2RlbENhcGFiaWxpdHlDYXRhbG9ndWU7XG59XG5cbi8qKiBNb2RlbCBsaW1pdHMga2V5ZWQgYnkgbm9ybWFsaXplZCBEYXRhYnJpY2tzIG1vZGVsIGlkZW50aXR5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJhdGVMaW1pdENhdGFsb2d1ZSB7XG4gIHJlYWRvbmx5IG1vZGVsczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgTW9kZWxSYXRlTGltaXRzPj47XG59XG5cbi8qKiBCdWlsZC1nZW5lcmF0ZWQgbW9kZWwtcmF0ZS1saW1pdCBzbmFwc2hvdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxSYXRlTGltaXRzU25hcHNob3Qge1xuICByZWFkb25seSBnZW5lcmF0ZWRBdDogbnVtYmVyO1xuICByZWFkb25seSBjYXRhbG9ndWU6IE1vZGVsUmF0ZUxpbWl0Q2F0YWxvZ3VlO1xufVxuXG4vKiogRG9jdW1lbnRlZCBnZW5lcmljIHJlYXNvbmluZyBsZXZlbHMga2V5ZWQgYnkgbm9ybWFsaXplZCBtb2RlbCBpZGVudGl0eS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUge1xuICByZWFkb25seSBtb2RlbHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG59XG5cbi8qKiBCdWlsZC1nZW5lcmF0ZWQgcmVhc29uaW5nLWVmZm9ydCBkb2N1bWVudGF0aW9uIHNuYXBzaG90LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWFzb25pbmdNb2RlbHNTbmFwc2hvdCB7XG4gIHJlYWRvbmx5IGdlbmVyYXRlZEF0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNhdGFsb2d1ZTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWU7XG59XG5cbi8qKiBQb3J0YWJsZSBjYXBhYmlsaXR5IHNldHMgbm9ybWFsaXplZCBmcm9tIG1vZGVscy5kZXYuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsc0RldkNhcGFiaWxpdHlDYXRhbG9ndWUge1xuICByZWFkb25seSBpbWFnZUlucHV0OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcmVhc29uaW5nOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgdG9vbHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBzdHJ1Y3R1cmVkT3V0cHV0OiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgdGVtcGVyYXR1cmVTdXBwb3J0ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSB0ZW1wZXJhdHVyZVVuc3VwcG9ydGVkOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIEJ1aWxkLWdlbmVyYXRlZCBtb2RlbHMuZGV2IGNhcGFiaWxpdHkgYW5kIHJlYXNvbmluZyBzbmFwc2hvdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxzRGV2U25hcHNob3Qge1xuICByZWFkb25seSBnZW5lcmF0ZWRBdDogbnVtYmVyO1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IE1vZGVsc0RldkNhcGFiaWxpdHlDYXRhbG9ndWU7XG59XG5cbi8qKiBSZWFzb25pbmcgc3VwcG9ydCBhbmQgZGlzY3JldGUgZWZmb3J0IGxldmVscyBub3JtYWxpemVkIGZyb20gbW9kZWxwYXJhbXMuZGV2LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFBhcmFtc0NhdGFsb2d1ZSBleHRlbmRzIFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmVhZG9ubHkgcmVhc29uaW5nOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIEJ1aWxkLWdlbmVyYXRlZCBtb2RlbHBhcmFtcy5kZXYgcmVhc29uaW5nIHNuYXBzaG90LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFBhcmFtc1NuYXBzaG90IHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgY2F0YWxvZ3VlOiBNb2RlbFBhcmFtc0NhdGFsb2d1ZTtcbn1cbiJdfQ==
|
package/lib/src/metadata.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import type { ModelCapabilities, ModelMetadata, ModelRateLimits, ServingEndpointSummary } from "@dbx-tools/shared-model";
|
|
2
|
-
import { type ModelCapabilityCatalogue } from "./metadata-contract.ts";
|
|
3
2
|
import { type ReasoningLevel, type ReasoningModelCatalogue } from "./reasoning-translation.ts";
|
|
4
3
|
interface MetadataIndex {
|
|
5
4
|
readonly capabilities: {
|
|
6
|
-
readonly [Key in keyof
|
|
5
|
+
readonly [Key in keyof ModelCapabilities]: ReadonlySet<string>;
|
|
7
6
|
};
|
|
8
7
|
readonly rateLimits: ReadonlyMap<string, ModelRateLimits>;
|
|
9
8
|
readonly reasoning: ReasoningModelCatalogue;
|
|
9
|
+
readonly reasoningDocs: ReasoningModelCatalogue;
|
|
10
|
+
readonly modelParamsReasoning: ReasoningModelCatalogue;
|
|
10
11
|
readonly learnedReasoning: ReasoningModelCatalogue;
|
|
12
|
+
readonly temperatureUnsupported: ReadonlySet<string>;
|
|
11
13
|
}
|
|
12
14
|
/**
|
|
13
15
|
* Hydrate or refresh documentation + learned caches into the process index.
|
|
@@ -32,20 +34,24 @@ export declare function rememberReasoningLevels(model: string, levels: readonly
|
|
|
32
34
|
* Parse an upstream error body and persist the supported ladder for `model`.
|
|
33
35
|
*
|
|
34
36
|
* Accepts the same nested Databricks envelopes as {@link parseReasoningLevels}.
|
|
35
|
-
* Returns
|
|
36
|
-
*
|
|
37
|
+
* Returns a published ladder without parsing or storing error-derived levels
|
|
38
|
+
* when one exists. Otherwise returns the levels that were stored, or the
|
|
39
|
+
* current fallback when parsing yields nothing. The raw error body is never
|
|
40
|
+
* cached.
|
|
37
41
|
*/
|
|
38
42
|
export declare function learnReasoningLevelsFromError(model: string, body: unknown): Promise<ReasoningLevel[]>;
|
|
39
|
-
/** Resolve
|
|
43
|
+
/** Resolve published model capabilities from a name or endpoint summary. */
|
|
40
44
|
export declare function modelCapabilitiesFor(model: string | ServingEndpointSummary): ModelCapabilities;
|
|
45
|
+
/** Resolve explicit Databricks temperature support, or undefined when unpublished. */
|
|
46
|
+
export declare function modelTemperatureSupportFor(model: string | ServingEndpointSummary): boolean | undefined;
|
|
41
47
|
/** Resolve published ITPM, OTPM, and QPH limits from a model identity. */
|
|
42
48
|
export declare function modelRateLimitsFor(model: string | ServingEndpointSummary): ModelRateLimits | undefined;
|
|
43
49
|
/**
|
|
44
|
-
* Resolve reasoning levels:
|
|
45
|
-
* family defaults.
|
|
50
|
+
* Resolve reasoning levels: Databricks documentation, modelparams.dev,
|
|
51
|
+
* learned errors, then family defaults.
|
|
46
52
|
*
|
|
47
|
-
* Does not parse error bodies; callers should use
|
|
48
|
-
*
|
|
53
|
+
* Does not parse error bodies; callers handling an upstream error should use
|
|
54
|
+
* {@link learnReasoningLevelsFromError} so published levels keep precedence.
|
|
49
55
|
*/
|
|
50
56
|
export declare function modelReasoningLevelsFor(model: string | ServingEndpointSummary): ReasoningLevel[];
|
|
51
57
|
/** Resolve retirement, capability, and rate-limit metadata together. */
|
|
@@ -54,6 +60,8 @@ export declare function modelMetadataFor(model: string | ServingEndpointSummary)
|
|
|
54
60
|
export declare function modelMetadataGeneratedAt(): Readonly<{
|
|
55
61
|
retiredModels: number;
|
|
56
62
|
capabilities: number;
|
|
63
|
+
modelsDev: number;
|
|
64
|
+
modelParams: number;
|
|
57
65
|
rateLimits: number;
|
|
58
66
|
reasoning: number;
|
|
59
67
|
}>;
|
package/lib/src/metadata.js
CHANGED
|
@@ -1,27 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Build-generated Databricks model
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Build-generated Databricks and public model capability metadata, plus a
|
|
3
|
+
* daily write-through cache for refreshed sources and error-learned reasoning
|
|
4
|
+
* ladders.
|
|
5
5
|
*
|
|
6
6
|
* Committed snapshots seed every process. {@link refreshModelMetadata} pulls
|
|
7
|
-
* documentation through the shared
|
|
8
|
-
* rebuilds the in-memory index.
|
|
9
|
-
*
|
|
10
|
-
* shared model project cache.
|
|
7
|
+
* Databricks documentation, models.dev, and modelparams.dev through the shared
|
|
8
|
+
* memory-first {@link createMetadataCache} and rebuilds the in-memory index.
|
|
9
|
+
* Error-learned efforts use the same store via {@link rememberReasoningLevels}.
|
|
10
|
+
* Known-good values are written behind to the shared model project cache.
|
|
11
11
|
*
|
|
12
12
|
* @module
|
|
13
13
|
*/
|
|
14
14
|
import { memoize } from "@dbx-tools/shared-core";
|
|
15
|
-
import { parseModelCapabilities, parseModelRateLimits, parseReasoningModels, parseRetiredModels, } from "./_metadata-generator.js";
|
|
15
|
+
import { parseModelParams, parseModelCapabilities, parseModelRateLimits, parseModelsDev, parseReasoningModels, parseRetiredModels, } from "./_metadata-generator.js";
|
|
16
16
|
import capabilitiesSnapshotJson from "./generated/model-capabilities.json" with { type: "json" };
|
|
17
|
+
import modelParamsSnapshotJson from "./generated/modelparams-reasoning.json" with { type: "json" };
|
|
18
|
+
import modelsDevSnapshotJson from "./generated/models-dev-capabilities.json" with { type: "json" };
|
|
17
19
|
import rateLimitsSnapshotJson from "./generated/model-rate-limits.json" with { type: "json" };
|
|
18
20
|
import reasoningSnapshotJson from "./generated/model-reasoning.json" with { type: "json" };
|
|
19
21
|
import { createMetadataCache, mergePreferFreshList, mergePreferFreshRecord, } from "./metadata-cache.js";
|
|
20
|
-
import { MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, } from "./metadata-contract.js";
|
|
21
|
-
import { inheritsNativeWebSearch, isFoundationModelIdentity, modelSearchQuery } from "./policy.js";
|
|
22
|
+
import { MODELPARAMS_DEV_MODELS_URL, MODELS_DEV_API_URL, MODEL_RATE_LIMITS_URL, OPENAI_RESPONSES_MODELS_URL, QUERY_REASON_MODELS_URL, RETIRED_MODELS_URL, WEB_SEARCH_MODELS_URL, } from "./metadata-contract.js";
|
|
23
|
+
import { inheritsNativeWebSearch, isFoundationModelIdentity, modelReasoningEfforts, modelSearchQuery, modelSupportsTools, } from "./policy.js";
|
|
22
24
|
import { defaultReasoningLevels, documentedReasoningLevels, parseReasoning, parseReasoningLevels, uniqueReasoningLevels, } from "./reasoning-translation.js";
|
|
23
25
|
import { COMMITTED_RETIRED_MODELS, modelStatusFor, replaceRetiredModelNames, RETIRED_MODELS_GENERATED_AT, } from "./retirement.js";
|
|
24
26
|
const capabilitiesSnapshot = capabilitiesSnapshotJson;
|
|
27
|
+
const modelParamsSnapshot = modelParamsSnapshotJson;
|
|
28
|
+
const modelsDevSnapshot = modelsDevSnapshotJson;
|
|
25
29
|
const rateLimitsSnapshot = rateLimitsSnapshotJson;
|
|
26
30
|
const reasoningSnapshot = reasoningSnapshotJson;
|
|
27
31
|
const USER_AGENT = "dbx-tools-model-metadata/1";
|
|
@@ -76,17 +80,48 @@ const reasoningDocsCache = createMetadataCache({
|
|
|
76
80
|
load: async () => parseReasoningModels(await loadPage(QUERY_REASON_MODELS_URL), nowSeconds()).catalogue.models,
|
|
77
81
|
merge: mergePreferFreshRecord,
|
|
78
82
|
});
|
|
83
|
+
const modelsDevCache = createMetadataCache({
|
|
84
|
+
key: "models-dev-capabilities",
|
|
85
|
+
fallback: modelsDevSnapshot.capabilities,
|
|
86
|
+
load: async () => {
|
|
87
|
+
const snapshot = parseModelsDev(await loadJson(MODELS_DEV_API_URL), nowSeconds());
|
|
88
|
+
return snapshot.capabilities;
|
|
89
|
+
},
|
|
90
|
+
merge: mergeModelsDevData,
|
|
91
|
+
});
|
|
92
|
+
const modelParamsCache = createMetadataCache({
|
|
93
|
+
key: "modelparams-reasoning",
|
|
94
|
+
fallback: modelParamsSnapshot.catalogue,
|
|
95
|
+
load: async () => parseModelParams(await loadJson(MODELPARAMS_DEV_MODELS_URL), nowSeconds()).catalogue,
|
|
96
|
+
merge: (input) => ({
|
|
97
|
+
reasoning: mergePreferFreshList({
|
|
98
|
+
fresh: input.fresh?.reasoning,
|
|
99
|
+
previous: input.previous?.reasoning,
|
|
100
|
+
fallback: input.fallback.reasoning,
|
|
101
|
+
}),
|
|
102
|
+
models: mergePreferFreshRecord({
|
|
103
|
+
fresh: input.fresh?.models,
|
|
104
|
+
previous: input.previous?.models,
|
|
105
|
+
fallback: input.fallback.models,
|
|
106
|
+
}),
|
|
107
|
+
}),
|
|
108
|
+
});
|
|
79
109
|
const learnedReasoningCache = createMetadataCache({
|
|
80
110
|
key: "learned-reasoning",
|
|
81
111
|
fallback: {},
|
|
82
112
|
merge: mergePreferFreshRecord,
|
|
83
113
|
});
|
|
84
114
|
let liveIndex;
|
|
85
|
-
const
|
|
115
|
+
const committedMetadataIndex = memoize(buildIndexFromCommitted);
|
|
116
|
+
function metadataIndex() {
|
|
117
|
+
return liveIndex ?? committedMetadataIndex();
|
|
118
|
+
}
|
|
86
119
|
function buildIndexFromCommitted() {
|
|
87
120
|
return buildIndex({
|
|
88
121
|
retiredNames: COMMITTED_RETIRED_MODELS,
|
|
89
122
|
capabilities: capabilitiesSnapshot.capabilities,
|
|
123
|
+
modelsDev: modelsDevSnapshot.capabilities,
|
|
124
|
+
modelParams: modelParamsSnapshot.catalogue,
|
|
90
125
|
rateLimits: rateLimitsSnapshot.catalogue.models,
|
|
91
126
|
reasoning: reasoningSnapshot.catalogue.models,
|
|
92
127
|
learnedReasoning: {},
|
|
@@ -94,16 +129,34 @@ function buildIndexFromCommitted() {
|
|
|
94
129
|
}
|
|
95
130
|
function buildIndex(input) {
|
|
96
131
|
replaceRetiredModelNames(input.retiredNames);
|
|
132
|
+
const reasoningDocs = freezeReasoningCatalogue(input.reasoning);
|
|
133
|
+
const modelParamsReasoning = freezeReasoningCatalogue(input.modelParams.models);
|
|
97
134
|
return {
|
|
98
135
|
capabilities: {
|
|
99
136
|
responses: new Set(input.capabilities.responses),
|
|
100
|
-
imageInput: new Set(
|
|
137
|
+
imageInput: new Set([
|
|
138
|
+
...input.capabilities.imageInput,
|
|
139
|
+
...input.modelsDev.imageInput,
|
|
140
|
+
]),
|
|
101
141
|
applyPatch: new Set(input.capabilities.applyPatch),
|
|
102
142
|
webSearch: new Set(input.capabilities.webSearch),
|
|
143
|
+
reasoning: new Set([
|
|
144
|
+
...input.modelsDev.reasoning,
|
|
145
|
+
...input.modelParams.reasoning,
|
|
146
|
+
]),
|
|
147
|
+
tools: new Set(input.modelsDev.tools),
|
|
148
|
+
structuredOutput: new Set(input.modelsDev.structuredOutput),
|
|
149
|
+
temperature: new Set(input.modelsDev.temperatureSupported),
|
|
103
150
|
},
|
|
104
151
|
rateLimits: new Map(Object.entries(input.rateLimits)),
|
|
105
|
-
reasoning:
|
|
152
|
+
reasoning: Object.freeze({
|
|
153
|
+
...modelParamsReasoning,
|
|
154
|
+
...reasoningDocs,
|
|
155
|
+
}),
|
|
156
|
+
reasoningDocs,
|
|
157
|
+
modelParamsReasoning,
|
|
106
158
|
learnedReasoning: freezeLearnedCatalogue(input.learnedReasoning),
|
|
159
|
+
temperatureUnsupported: new Set(input.modelsDev.temperatureUnsupported),
|
|
107
160
|
};
|
|
108
161
|
}
|
|
109
162
|
function freezeReasoningCatalogue(models) {
|
|
@@ -128,9 +181,11 @@ export async function refreshModelMetadata() {
|
|
|
128
181
|
if (refreshInflight)
|
|
129
182
|
return refreshInflight;
|
|
130
183
|
refreshInflight = (async () => {
|
|
131
|
-
const [retiredNames, capabilities, rateLimits, reasoning, learnedReasoning] = await Promise.all([
|
|
184
|
+
const [retiredNames, capabilities, modelsDev, modelParams, rateLimits, reasoning, learnedReasoning,] = await Promise.all([
|
|
132
185
|
retiredCache.get(),
|
|
133
186
|
capabilitiesCache.get(),
|
|
187
|
+
modelsDevCache.get(),
|
|
188
|
+
modelParamsCache.get(),
|
|
134
189
|
rateLimitsCache.get(),
|
|
135
190
|
reasoningDocsCache.get(),
|
|
136
191
|
learnedReasoningCache.get(),
|
|
@@ -138,6 +193,8 @@ export async function refreshModelMetadata() {
|
|
|
138
193
|
liveIndex = buildIndex({
|
|
139
194
|
retiredNames,
|
|
140
195
|
capabilities,
|
|
196
|
+
modelsDev,
|
|
197
|
+
modelParams,
|
|
141
198
|
rateLimits,
|
|
142
199
|
reasoning,
|
|
143
200
|
learnedReasoning,
|
|
@@ -150,9 +207,11 @@ export async function refreshModelMetadata() {
|
|
|
150
207
|
}
|
|
151
208
|
/** Load shared cache entries without forcing a network refresh. */
|
|
152
209
|
export async function hydrateModelMetadata() {
|
|
153
|
-
const [retiredNames, capabilities, rateLimits, reasoning, learnedReasoning] = await Promise.all([
|
|
210
|
+
const [retiredNames, capabilities, modelsDev, modelParams, rateLimits, reasoning, learnedReasoning,] = await Promise.all([
|
|
154
211
|
peekOrFallback(retiredCache, COMMITTED_RETIRED_MODELS),
|
|
155
212
|
peekOrFallback(capabilitiesCache, capabilitiesSnapshot.capabilities),
|
|
213
|
+
peekOrFallback(modelsDevCache, modelsDevSnapshot.capabilities),
|
|
214
|
+
peekOrFallback(modelParamsCache, modelParamsSnapshot.catalogue),
|
|
156
215
|
peekOrFallback(rateLimitsCache, rateLimitsSnapshot.catalogue.models),
|
|
157
216
|
peekOrFallback(reasoningDocsCache, reasoningSnapshot.catalogue.models),
|
|
158
217
|
peekOrFallback(learnedReasoningCache, {}),
|
|
@@ -160,6 +219,8 @@ export async function hydrateModelMetadata() {
|
|
|
160
219
|
liveIndex = buildIndex({
|
|
161
220
|
retiredNames,
|
|
162
221
|
capabilities,
|
|
222
|
+
modelsDev,
|
|
223
|
+
modelParams,
|
|
163
224
|
rateLimits,
|
|
164
225
|
reasoning,
|
|
165
226
|
learnedReasoning,
|
|
@@ -208,13 +269,18 @@ export async function rememberReasoningLevels(model, levels) {
|
|
|
208
269
|
* Parse an upstream error body and persist the supported ladder for `model`.
|
|
209
270
|
*
|
|
210
271
|
* Accepts the same nested Databricks envelopes as {@link parseReasoningLevels}.
|
|
211
|
-
* Returns
|
|
212
|
-
*
|
|
272
|
+
* Returns a published ladder without parsing or storing error-derived levels
|
|
273
|
+
* when one exists. Otherwise returns the levels that were stored, or the
|
|
274
|
+
* current fallback when parsing yields nothing. The raw error body is never
|
|
275
|
+
* cached.
|
|
213
276
|
*/
|
|
214
277
|
export async function learnReasoningLevelsFromError(model, body) {
|
|
278
|
+
const published = publishedReasoningLevelsFor(model, metadataIndex());
|
|
279
|
+
if (published)
|
|
280
|
+
return published;
|
|
215
281
|
return rememberReasoningLevels(model, parseReasoningLevels(body));
|
|
216
282
|
}
|
|
217
|
-
/** Resolve
|
|
283
|
+
/** Resolve published model capabilities from a name or endpoint summary. */
|
|
218
284
|
export function modelCapabilitiesFor(model) {
|
|
219
285
|
const capabilities = metadataIndex().capabilities;
|
|
220
286
|
const identities = modelIdentities(model, false);
|
|
@@ -227,8 +293,23 @@ export function modelCapabilitiesFor(model) {
|
|
|
227
293
|
webSearch: keys.some((key) => capabilities.webSearch.has(key)) ||
|
|
228
294
|
identities.some((identity) => isFoundationModelIdentity(identity) &&
|
|
229
295
|
inheritsNativeWebSearch(identity, capabilities.webSearch)),
|
|
296
|
+
reasoning: keys.some((key) => capabilities.reasoning.has(key)) ||
|
|
297
|
+
identities.some((identity) => modelReasoningEfforts(identity).length > 0),
|
|
298
|
+
tools: keys.some((key) => capabilities.tools.has(key)) || identities.some(modelSupportsTools),
|
|
299
|
+
structuredOutput: keys.some((key) => capabilities.structuredOutput.has(key)),
|
|
300
|
+
temperature: modelTemperatureSupportFor(model) === true,
|
|
230
301
|
};
|
|
231
302
|
}
|
|
303
|
+
/** Resolve explicit Databricks temperature support, or undefined when unpublished. */
|
|
304
|
+
export function modelTemperatureSupportFor(model) {
|
|
305
|
+
const index = metadataIndex();
|
|
306
|
+
const keys = modelIdentities(model).flatMap((identity) => modelKey(identity) ?? []);
|
|
307
|
+
if (keys.some((key) => index.temperatureUnsupported.has(key)))
|
|
308
|
+
return false;
|
|
309
|
+
if (keys.some((key) => index.capabilities.temperature.has(key)))
|
|
310
|
+
return true;
|
|
311
|
+
return undefined;
|
|
312
|
+
}
|
|
232
313
|
/** Resolve published ITPM, OTPM, and QPH limits from a model identity. */
|
|
233
314
|
export function modelRateLimitsFor(model) {
|
|
234
315
|
const limits = metadataIndex().rateLimits;
|
|
@@ -243,26 +324,38 @@ export function modelRateLimitsFor(model) {
|
|
|
243
324
|
return undefined;
|
|
244
325
|
}
|
|
245
326
|
/**
|
|
246
|
-
* Resolve reasoning levels:
|
|
247
|
-
* family defaults.
|
|
327
|
+
* Resolve reasoning levels: Databricks documentation, modelparams.dev,
|
|
328
|
+
* learned errors, then family defaults.
|
|
248
329
|
*
|
|
249
|
-
* Does not parse error bodies; callers should use
|
|
250
|
-
*
|
|
330
|
+
* Does not parse error bodies; callers handling an upstream error should use
|
|
331
|
+
* {@link learnReasoningLevelsFromError} so published levels keep precedence.
|
|
251
332
|
*/
|
|
252
333
|
export function modelReasoningLevelsFor(model) {
|
|
253
334
|
const index = metadataIndex();
|
|
335
|
+
const published = publishedReasoningLevelsFor(model, index);
|
|
336
|
+
if (published)
|
|
337
|
+
return published;
|
|
254
338
|
for (const identity of modelIdentities(model)) {
|
|
255
339
|
const learned = documentedReasoningLevels(identity, index.learnedReasoning);
|
|
256
340
|
if (learned?.length)
|
|
257
341
|
return learned;
|
|
258
342
|
}
|
|
259
|
-
|
|
260
|
-
|
|
343
|
+
const primary = typeof model === "string" ? model : (model.modelServiceName ?? model.name);
|
|
344
|
+
return defaultReasoningLevels(primary);
|
|
345
|
+
}
|
|
346
|
+
function publishedReasoningLevelsFor(model, index) {
|
|
347
|
+
const identities = modelIdentities(model);
|
|
348
|
+
for (const identity of identities) {
|
|
349
|
+
const documented = documentedReasoningLevels(identity, index.reasoningDocs);
|
|
261
350
|
if (documented?.length)
|
|
262
351
|
return documented;
|
|
263
352
|
}
|
|
264
|
-
const
|
|
265
|
-
|
|
353
|
+
for (const identity of identities) {
|
|
354
|
+
const modelParams = documentedReasoningLevels(identity, index.modelParamsReasoning);
|
|
355
|
+
if (modelParams?.length)
|
|
356
|
+
return modelParams;
|
|
357
|
+
}
|
|
358
|
+
return undefined;
|
|
266
359
|
}
|
|
267
360
|
/** Resolve retirement, capability, and rate-limit metadata together. */
|
|
268
361
|
export function modelMetadataFor(model) {
|
|
@@ -278,6 +371,8 @@ export function modelMetadataGeneratedAt() {
|
|
|
278
371
|
return {
|
|
279
372
|
retiredModels: RETIRED_MODELS_GENERATED_AT,
|
|
280
373
|
capabilities: capabilitiesSnapshot.generatedAt,
|
|
374
|
+
modelsDev: modelsDevSnapshot.generatedAt,
|
|
375
|
+
modelParams: modelParamsSnapshot.generatedAt,
|
|
281
376
|
rateLimits: rateLimitsSnapshot.generatedAt,
|
|
282
377
|
reasoning: reasoningSnapshot.generatedAt,
|
|
283
378
|
};
|
|
@@ -305,7 +400,32 @@ async function loadPage(url) {
|
|
|
305
400
|
}
|
|
306
401
|
return response.text();
|
|
307
402
|
}
|
|
403
|
+
async function loadJson(url) {
|
|
404
|
+
const response = await fetch(url, {
|
|
405
|
+
headers: { "user-agent": USER_AGENT },
|
|
406
|
+
signal: AbortSignal.timeout(15_000),
|
|
407
|
+
});
|
|
408
|
+
if (!response.ok) {
|
|
409
|
+
throw new Error(`Model metadata source returned HTTP ${response.status}: ${url}`);
|
|
410
|
+
}
|
|
411
|
+
return response.json();
|
|
412
|
+
}
|
|
413
|
+
function mergeModelsDevData(input) {
|
|
414
|
+
const capability = (key) => mergePreferFreshList({
|
|
415
|
+
fresh: input.fresh?.[key],
|
|
416
|
+
previous: input.previous?.[key],
|
|
417
|
+
fallback: input.fallback[key],
|
|
418
|
+
});
|
|
419
|
+
return {
|
|
420
|
+
imageInput: capability("imageInput"),
|
|
421
|
+
reasoning: capability("reasoning"),
|
|
422
|
+
tools: capability("tools"),
|
|
423
|
+
structuredOutput: capability("structuredOutput"),
|
|
424
|
+
temperatureSupported: capability("temperatureSupported"),
|
|
425
|
+
temperatureUnsupported: capability("temperatureUnsupported"),
|
|
426
|
+
};
|
|
427
|
+
}
|
|
308
428
|
function nowSeconds() {
|
|
309
429
|
return Math.floor(Date.now() / 1000);
|
|
310
430
|
}
|
|
311
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBUWpELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLHdCQUF3QixNQUFNLHFDQUFxQyxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ2pHLE9BQU8sc0JBQXNCLE1BQU0sb0NBQW9DLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDOUYsT0FBTyxxQkFBcUIsTUFBTSxrQ0FBa0MsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUMzRixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixzQkFBc0IsR0FFdkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLDJCQUEyQixFQUMzQix1QkFBdUIsRUFDdkIsa0JBQWtCLEVBQ2xCLHFCQUFxQixHQUt0QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNuRyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHlCQUF5QixFQUN6QixjQUFjLEVBQ2Qsb0JBQW9CLEVBR3BCLHFCQUFxQixHQUN0QixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsY0FBYyxFQUNkLHdCQUF3QixFQUN4QiwyQkFBMkIsR0FDNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixNQUFNLG9CQUFvQixHQUFHLHdCQUFxRCxDQUFD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QUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCdWlsZC1nZW5lcmF0ZWQgRGF0YWJyaWNrcyBtb2RlbCByZXRpcmVtZW50LCBjYXBhYmlsaXR5LCByYXRlLWxpbWl0LCBhbmRcbiAqIHJlYXNvbmluZy1lZmZvcnQgbWV0YWRhdGEsIHBsdXMgYSBkYWlseSB3cml0ZS10aHJvdWdoIGNhY2hlIGZvciByZWZyZXNoZWRcbiAqIGRvY3MgYW5kIGVycm9yLWxlYXJuZWQgcmVhc29uaW5nIGxhZGRlcnMuXG4gKlxuICogQ29tbWl0dGVkIHNuYXBzaG90cyBzZWVkIGV2ZXJ5IHByb2Nlc3MuIHtAbGluayByZWZyZXNoTW9kZWxNZXRhZGF0YX0gcHVsbHNcbiAqIGRvY3VtZW50YXRpb24gdGhyb3VnaCB0aGUgc2hhcmVkIG1lbW9yeS1maXJzdCB7QGxpbmsgY3JlYXRlTWV0YWRhdGFDYWNoZX0gYW5kXG4gKiByZWJ1aWxkcyB0aGUgaW4tbWVtb3J5IGluZGV4LiBFcnJvci1sZWFybmVkIGVmZm9ydHMgdXNlIHRoZSBzYW1lIHN0b3JlIHZpYVxuICoge0BsaW5rIHJlbWVtYmVyUmVhc29uaW5nTGV2ZWxzfS4gS25vd24tZ29vZCB2YWx1ZXMgYXJlIHdyaXR0ZW4gYmVoaW5kIHRvIHRoZVxuICogc2hhcmVkIG1vZGVsIHByb2plY3QgY2FjaGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBtZW1vaXplIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHtcbiAgTW9kZWxDYXBhYmlsaXRpZXMsXG4gIE1vZGVsTWV0YWRhdGEsXG4gIE1vZGVsUmF0ZUxpbWl0cyxcbiAgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5cbmltcG9ydCB7XG4gIHBhcnNlTW9kZWxDYXBhYmlsaXRpZXMsXG4gIHBhcnNlTW9kZWxSYXRlTGltaXRzLFxuICBwYXJzZVJlYXNvbmluZ01vZGVscyxcbiAgcGFyc2VSZXRpcmVkTW9kZWxzLFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQgY2FwYWJpbGl0aWVzU25hcHNob3RKc29uIGZyb20gXCIuL2dlbmVyYXRlZC9tb2RlbC1jYXBhYmlsaXRpZXMuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IHJhdGVMaW1pdHNTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL21vZGVsLXJhdGUtbGltaXRzLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCByZWFzb25pbmdTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL21vZGVsLXJlYXNvbmluZy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQge1xuICBjcmVhdGVNZXRhZGF0YUNhY2hlLFxuICBtZXJnZVByZWZlckZyZXNoTGlzdCxcbiAgbWVyZ2VQcmVmZXJGcmVzaFJlY29yZCxcbiAgdHlwZSBNZXRhZGF0YUNhY2hlLFxufSBmcm9tIFwiLi9tZXRhZGF0YS1jYWNoZS50c1wiO1xuaW1wb3J0IHtcbiAgTU9ERUxfUkFURV9MSU1JVFNfVVJMLFxuICBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsXG4gIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLFxuICBSRVRJUkVEX01PREVMU19VUkwsXG4gIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCxcbiAgdHlwZSBNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90LFxuICB0eXBlIE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZSxcbiAgdHlwZSBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdCxcbiAgdHlwZSBSZWFzb25pbmdNb2RlbHNTbmFwc2hvdCxcbn0gZnJvbSBcIi4vbWV0YWRhdGEtY29udHJhY3QudHNcIjtcbmltcG9ydCB7IGluaGVyaXRzTmF0aXZlV2ViU2VhcmNoLCBpc0ZvdW5kYXRpb25Nb2RlbElkZW50aXR5LCBtb2RlbFNlYXJjaFF1ZXJ5IH0gZnJvbSBcIi4vcG9saWN5LnRzXCI7XG5pbXBvcnQge1xuICBkZWZhdWx0UmVhc29uaW5nTGV2ZWxzLFxuICBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzLFxuICBwYXJzZVJlYXNvbmluZyxcbiAgcGFyc2VSZWFzb25pbmdMZXZlbHMsXG4gIHR5cGUgUmVhc29uaW5nTGV2ZWwsXG4gIHR5cGUgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUsXG4gIHVuaXF1ZVJlYXNvbmluZ0xldmVscyxcbn0gZnJvbSBcIi4vcmVhc29uaW5nLXRyYW5zbGF0aW9uLnRzXCI7XG5pbXBvcnQge1xuICBDT01NSVRURURfUkVUSVJFRF9NT0RFTFMsXG4gIG1vZGVsU3RhdHVzRm9yLFxuICByZXBsYWNlUmV0aXJlZE1vZGVsTmFtZXMsXG4gIFJFVElSRURfTU9ERUxTX0dFTkVSQVRFRF9BVCxcbn0gZnJvbSBcIi4vcmV0aXJlbWVudC50c1wiO1xuXG5jb25zdCBjYXBhYmlsaXRpZXNTbmFwc2hvdCA9IGNhcGFiaWxpdGllc1NuYXBzaG90SnNvbiBhcyBNb2RlbENhcGFiaWxpdGllc1NuYXBzaG90O1xuY29uc3QgcmF0ZUxpbWl0c1NuYXBzaG90ID0gcmF0ZUxpbWl0c1NuYXBzaG90SnNvbiBhcyBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdDtcbmNvbnN0IHJlYXNvbmluZ1NuYXBzaG90ID0gcmVhc29uaW5nU25hcHNob3RKc29uIGFzIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90O1xuXG5pbnRlcmZhY2UgTWV0YWRhdGFJbmRleCB7XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczoge1xuICAgIHJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlXTogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcbiAgfTtcbiAgcmVhZG9ubHkgcmF0ZUxpbWl0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlO1xuICByZWFkb25seSBsZWFybmVkUmVhc29uaW5nOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbn1cblxudHlwZSBDYXBhYmlsaXR5U2V0cyA9IE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZTtcblxuY29uc3QgVVNFUl9BR0VOVCA9IFwiZGJ4LXRvb2xzLW1vZGVsLW1ldGFkYXRhLzFcIjtcblxuY29uc3QgcmV0aXJlZENhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxyZWFkb25seSBzdHJpbmdbXT4oe1xuICBrZXk6IFwicmV0aXJlZC1tb2RlbHNcIixcbiAgZmFsbGJhY2s6IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyxcbiAgbG9hZDogYXN5bmMgKCkgPT4gcGFyc2VSZXRpcmVkTW9kZWxzKGF3YWl0IGxvYWRQYWdlKFJFVElSRURfTU9ERUxTX1VSTCksIG5vd1NlY29uZHMoKSkubW9kZWxzLFxuICBtZXJnZTogbWVyZ2VQcmVmZXJGcmVzaExpc3QsXG59KTtcblxuY29uc3QgY2FwYWJpbGl0aWVzQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPENhcGFiaWxpdHlTZXRzPih7XG4gIGtleTogXCJtb2RlbC1jYXBhYmlsaXRpZXNcIixcbiAgZmFsbGJhY2s6IGNhcGFiaWxpdGllc1NuYXBzaG90LmNhcGFiaWxpdGllcyxcbiAgbG9hZDogYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtyZXNwb25zZXNIdG1sLCB3ZWJTZWFyY2hIdG1sXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGxvYWRQYWdlKE9QRU5BSV9SRVNQT05TRVNfTU9ERUxTX1VSTCksXG4gICAgICBsb2FkUGFnZShXRUJfU0VBUkNIX01PREVMU19VUkwpLFxuICAgIF0pO1xuICAgIHJldHVybiBwYXJzZU1vZGVsQ2FwYWJpbGl0aWVzKHJlc3BvbnNlc0h0bWwsIHdlYlNlYXJjaEh0bWwsIG5vd1NlY29uZHMoKSkuY2FwYWJpbGl0aWVzO1xuICB9LFxuICBtZXJnZTogKGlucHV0KSA9PiAoe1xuICAgIHJlc3BvbnNlczogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5yZXNwb25zZXMsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/LnJlc3BvbnNlcyxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay5yZXNwb25zZXMsXG4gICAgfSksXG4gICAgaW1hZ2VJbnB1dDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5pbWFnZUlucHV0LFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5pbWFnZUlucHV0LFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLmltYWdlSW5wdXQsXG4gICAgfSksXG4gICAgYXBwbHlQYXRjaDogbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5hcHBseVBhdGNoLFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy5hcHBseVBhdGNoLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLmFwcGx5UGF0Y2gsXG4gICAgfSksXG4gICAgd2ViU2VhcmNoOiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LndlYlNlYXJjaCxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8ud2ViU2VhcmNoLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLndlYlNlYXJjaCxcbiAgICB9KSxcbiAgfSksXG59KTtcblxuY29uc3QgcmF0ZUxpbWl0c0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+Pj4oe1xuICBrZXk6IFwibW9kZWwtcmF0ZS1saW1pdHNcIixcbiAgZmFsbGJhY2s6IHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzLFxuICBsb2FkOiBhc3luYyAoKSA9PlxuICAgIHBhcnNlTW9kZWxSYXRlTGltaXRzKGF3YWl0IGxvYWRQYWdlKE1PREVMX1JBVEVfTElNSVRTX1VSTCksIG5vd1NlY29uZHMoKSkuY2F0YWxvZ3VlLm1vZGVscyxcbiAgbWVyZ2U6IG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQsXG59KTtcblxuY29uc3QgcmVhc29uaW5nRG9jc0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+Pih7XG4gIGtleTogXCJtb2RlbC1yZWFzb25pbmdcIixcbiAgZmFsbGJhY2s6IHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgcGFyc2VSZWFzb25pbmdNb2RlbHMoYXdhaXQgbG9hZFBhZ2UoUVVFUllfUkVBU09OX01PREVMU19VUkwpLCBub3dTZWNvbmRzKCkpLmNhdGFsb2d1ZS5tb2RlbHMsXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmNvbnN0IGxlYXJuZWRSZWFzb25pbmdDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8XG4gIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+PlxuPih7XG4gIGtleTogXCJsZWFybmVkLXJlYXNvbmluZ1wiLFxuICBmYWxsYmFjazoge30sXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmxldCBsaXZlSW5kZXg6IE1ldGFkYXRhSW5kZXggfCB1bmRlZmluZWQ7XG5cbmNvbnN0IG1ldGFkYXRhSW5kZXggPSBtZW1vaXplPE1ldGFkYXRhSW5kZXg+KCgpID0+IGxpdmVJbmRleCA/PyBidWlsZEluZGV4RnJvbUNvbW1pdHRlZCgpKTtcblxuZnVuY3Rpb24gYnVpbGRJbmRleEZyb21Db21taXR0ZWQoKTogTWV0YWRhdGFJbmRleCB7XG4gIHJldHVybiBidWlsZEluZGV4KHtcbiAgICByZXRpcmVkTmFtZXM6IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyxcbiAgICBjYXBhYmlsaXRpZXM6IGNhcGFiaWxpdGllc1NuYXBzaG90LmNhcGFiaWxpdGllcyxcbiAgICByYXRlTGltaXRzOiByYXRlTGltaXRzU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyxcbiAgICByZWFzb25pbmc6IHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gICAgbGVhcm5lZFJlYXNvbmluZzoge30sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEluZGV4KGlucHV0OiB7XG4gIHJlYWRvbmx5IHJldGlyZWROYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogQ2FwYWJpbGl0eVNldHM7XG4gIHJlYWRvbmx5IHJhdGVMaW1pdHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIE1vZGVsUmF0ZUxpbWl0cz4+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG4gIHJlYWRvbmx5IGxlYXJuZWRSZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pjtcbn0pOiBNZXRhZGF0YUluZGV4IHtcbiAgcmVwbGFjZVJldGlyZWRNb2RlbE5hbWVzKGlucHV0LnJldGlyZWROYW1lcyk7XG4gIHJldHVybiB7XG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICByZXNwb25zZXM6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLnJlc3BvbnNlcyksXG4gICAgICBpbWFnZUlucHV0OiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy5pbWFnZUlucHV0KSxcbiAgICAgIGFwcGx5UGF0Y2g6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2gpLFxuICAgICAgd2ViU2VhcmNoOiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gpLFxuICAgIH0sXG4gICAgcmF0ZUxpbWl0czogbmV3IE1hcChPYmplY3QuZW50cmllcyhpbnB1dC5yYXRlTGltaXRzKSksXG4gICAgcmVhc29uaW5nOiBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoaW5wdXQucmVhc29uaW5nKSxcbiAgICBsZWFybmVkUmVhc29uaW5nOiBmcmVlemVMZWFybmVkQ2F0YWxvZ3VlKGlucHV0LmxlYXJuZWRSZWFzb25pbmcpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoXG4gIG1vZGVsczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+Pixcbik6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMobW9kZWxzKS5tYXAoKFtrZXksIGxldmVsc10pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICBPYmplY3QuZnJlZXplKFxuICAgICAgICAgIHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMuZmxhdE1hcCgobGV2ZWwpID0+IHBhcnNlUmVhc29uaW5nKGxldmVsKSA/PyBbXSkpLFxuICAgICAgICApLFxuICAgICAgXSksXG4gICAgKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gZnJlZXplTGVhcm5lZENhdGFsb2d1ZShcbiAgbW9kZWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj4sXG4pOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKG1vZGVscykubWFwKChba2V5LCBsZXZlbHNdKSA9PiBbXG4gICAgICAgIGtleSxcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh1bmlxdWVSZWFzb25pbmdMZXZlbHMobGV2ZWxzKSksXG4gICAgICBdKSxcbiAgICApLFxuICApO1xufVxuXG5sZXQgcmVmcmVzaEluZmxpZ2h0OiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEh5ZHJhdGUgb3IgcmVmcmVzaCBkb2N1bWVudGF0aW9uICsgbGVhcm5lZCBjYWNoZXMgaW50byB0aGUgcHJvY2VzcyBpbmRleC5cbiAqXG4gKiBTYWZlIHRvIGNhbGwgb24gZ2F0ZXdheSBzdGFydHVwLiBDb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgb25lIHJlZnJlc2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZyZXNoTW9kZWxNZXRhZGF0YSgpOiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHtcbiAgaWYgKHJlZnJlc2hJbmZsaWdodCkgcmV0dXJuIHJlZnJlc2hJbmZsaWdodDtcbiAgcmVmcmVzaEluZmxpZ2h0ID0gKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbcmV0aXJlZE5hbWVzLCBjYXBhYmlsaXRpZXMsIHJhdGVMaW1pdHMsIHJlYXNvbmluZywgbGVhcm5lZFJlYXNvbmluZ10gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFtcbiAgICAgICAgcmV0aXJlZENhY2hlLmdldCgpLFxuICAgICAgICBjYXBhYmlsaXRpZXNDYWNoZS5nZXQoKSxcbiAgICAgICAgcmF0ZUxpbWl0c0NhY2hlLmdldCgpLFxuICAgICAgICByZWFzb25pbmdEb2NzQ2FjaGUuZ2V0KCksXG4gICAgICAgIGxlYXJuZWRSZWFzb25pbmdDYWNoZS5nZXQoKSxcbiAgICAgIF0sXG4gICAgKTtcbiAgICBsaXZlSW5kZXggPSBidWlsZEluZGV4KHtcbiAgICAgIHJldGlyZWROYW1lcyxcbiAgICAgIGNhcGFiaWxpdGllcyxcbiAgICAgIHJhdGVMaW1pdHMsXG4gICAgICByZWFzb25pbmcsXG4gICAgICBsZWFybmVkUmVhc29uaW5nLFxuICAgIH0pO1xuICAgIHJldHVybiBsaXZlSW5kZXg7XG4gIH0pKCkuZmluYWxseSgoKSA9PiB7XG4gICAgcmVmcmVzaEluZmxpZ2h0ID0gdW5kZWZpbmVkO1xuICB9KTtcbiAgcmV0dXJuIHJlZnJlc2hJbmZsaWdodDtcbn1cblxuLyoqIExvYWQgc2hhcmVkIGNhY2hlIGVudHJpZXMgd2l0aG91dCBmb3JjaW5nIGEgbmV0d29yayByZWZyZXNoLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVNb2RlbE1ldGFkYXRhKCk6IFByb21pc2U8TWV0YWRhdGFJbmRleD4ge1xuICBjb25zdCBbcmV0aXJlZE5hbWVzLCBjYXBhYmlsaXRpZXMsIHJhdGVMaW1pdHMsIHJlYXNvbmluZywgbGVhcm5lZFJlYXNvbmluZ10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgcGVla09yRmFsbGJhY2socmV0aXJlZENhY2hlLCBDT01NSVRURURfUkVUSVJFRF9NT0RFTFMpLFxuICAgIHBlZWtPckZhbGxiYWNrKGNhcGFiaWxpdGllc0NhY2hlLCBjYXBhYmlsaXRpZXNTbmFwc2hvdC5jYXBhYmlsaXRpZXMpLFxuICAgIHBlZWtPckZhbGxiYWNrKHJhdGVMaW1pdHNDYWNoZSwgcmF0ZUxpbWl0c1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMpLFxuICAgIHBlZWtPckZhbGxiYWNrKHJlYXNvbmluZ0RvY3NDYWNoZSwgcmVhc29uaW5nU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyksXG4gICAgcGVla09yRmFsbGJhY2sobGVhcm5lZFJlYXNvbmluZ0NhY2hlLCB7fSksXG4gIF0pO1xuICBsaXZlSW5kZXggPSBidWlsZEluZGV4KHtcbiAgICByZXRpcmVkTmFtZXMsXG4gICAgY2FwYWJpbGl0aWVzLFxuICAgIHJhdGVMaW1pdHMsXG4gICAgcmVhc29uaW5nLFxuICAgIGxlYXJuZWRSZWFzb25pbmcsXG4gIH0pO1xuICByZXR1cm4gbGl2ZUluZGV4O1xufVxuXG5hc3luYyBmdW5jdGlvbiBwZWVrT3JGYWxsYmFjazxUPihjYWNoZTogTWV0YWRhdGFDYWNoZTxUPiwgZmFsbGJhY2s6IFQpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcGVla2VkID0gYXdhaXQgY2FjaGUucGVlaygpO1xuICBpZiAocGVla2VkICE9PSB1bmRlZmluZWQpIHJldHVybiBwZWVrZWQ7XG4gIHJldHVybiBjYWNoZS5nZXQoKS5jYXRjaCgoKSA9PiBmYWxsYmFjayk7XG59XG5cbi8qKiBSZXR1cm4gdGhlIGNvbW1pdHRlZCByZWFzb25pbmctZWZmb3J0IGNhdGFsb2d1ZS4gQ2FjaGVkIHBlciBwcm9jZXNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlKCk6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIG1ldGFkYXRhSW5kZXgoKS5yZWFzb25pbmc7XG59XG5cbi8qKiBSZXR1cm4gZXJyb3ItbGVhcm5lZCByZWFzb25pbmcgbGFkZGVycyBmcm9tIHRoZSBzaGFyZWQgbW9kZWwgY2FjaGUuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhcm5lZFJlYXNvbmluZ0NhdGFsb2d1ZSgpOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJldHVybiBtZXRhZGF0YUluZGV4KCkubGVhcm5lZFJlYXNvbmluZztcbn1cblxuLyoqXG4gKiBTdG9yZSBsZXZlbHMgbGVhcm5lZCBmcm9tIGFuIHVwc3RyZWFtIGVycm9yIGFuZCBwZXJzaXN0IHRoZW0gd3JpdGUtdGhyb3VnaC5cbiAqXG4gKiBFbXB0eSBsaXN0cyBhcmUgaWdub3JlZCBzbyBhIGZhaWxlZCBwYXJzZSBjYW5ub3Qgd2lwZSBkZWZhdWx0cy4gRXJyb3IgYm9kaWVzXG4gKiB0aGVtc2VsdmVzIGFyZSBuZXZlciBzdG9yZWQgLSBvbmx5IHRoZSBwYXJzZWQgbGFkZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtZW1iZXJSZWFzb25pbmdMZXZlbHMoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IFByb21pc2U8UmVhc29uaW5nTGV2ZWxbXT4ge1xuICBjb25zdCB1bmlxdWUgPSB1bmlxdWVSZWFzb25pbmdMZXZlbHMobGV2ZWxzKTtcbiAgaWYgKHVuaXF1ZS5sZW5ndGggPT09IDApIHJldHVybiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCk7XG4gIGNvbnN0IGtleSA9IG1vZGVsS2V5KG1vZGVsKTtcbiAgaWYgKCFrZXkpIHJldHVybiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCk7XG4gIGNvbnN0IGNhdGFsb2d1ZSA9IGF3YWl0IGxlYXJuZWRSZWFzb25pbmdDYWNoZS51cGRhdGUoKGN1cnJlbnQpID0+ICh7XG4gICAgLi4uY3VycmVudCxcbiAgICBba2V5XTogdW5pcXVlLFxuICB9KSk7XG4gIGNvbnN0IGN1cnJlbnQgPSBtZXRhZGF0YUluZGV4KCk7XG4gIGxpdmVJbmRleCA9IHtcbiAgICAuLi5jdXJyZW50LFxuICAgIGxlYXJuZWRSZWFzb25pbmc6IGZyZWV6ZUxlYXJuZWRDYXRhbG9ndWUoY2F0YWxvZ3VlKSxcbiAgfTtcbiAgcmV0dXJuIFsuLi51bmlxdWVdO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuIHVwc3RyZWFtIGVycm9yIGJvZHkgYW5kIHBlcnNpc3QgdGhlIHN1cHBvcnRlZCBsYWRkZXIgZm9yIGBtb2RlbGAuXG4gKlxuICogQWNjZXB0cyB0aGUgc2FtZSBuZXN0ZWQgRGF0YWJyaWNrcyBlbnZlbG9wZXMgYXMge0BsaW5rIHBhcnNlUmVhc29uaW5nTGV2ZWxzfS5cbiAqIFJldHVybnMgdGhlIGxldmVscyB0aGF0IHdlcmUgc3RvcmVkIChvciB0aGUgY3VycmVudCBsb29rdXAgd2hlbiBwYXJzZSB5aWVsZHNcbiAqIG5vdGhpbmcpLiBUaGUgcmF3IGVycm9yIGJvZHkgaXMgbmV2ZXIgY2FjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGVhcm5SZWFzb25pbmdMZXZlbHNGcm9tRXJyb3IoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGJvZHk6IHVua25vd24sXG4pOiBQcm9taXNlPFJlYXNvbmluZ0xldmVsW10+IHtcbiAgcmV0dXJuIHJlbWVtYmVyUmVhc29uaW5nTGV2ZWxzKG1vZGVsLCBwYXJzZVJlYXNvbmluZ0xldmVscyhib2R5KSk7XG59XG5cbi8qKiBSZXNvbHZlIGRvY3VtZW50ZWQgbW9kZWwgY2FwYWJpbGl0aWVzIGZyb20gYSBuYW1lIG9yIGVuZHBvaW50IHN1bW1hcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxDYXBhYmlsaXRpZXNGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbENhcGFiaWxpdGllcyB7XG4gIGNvbnN0IGNhcGFiaWxpdGllcyA9IG1ldGFkYXRhSW5kZXgoKS5jYXBhYmlsaXRpZXM7XG4gIGNvbnN0IGlkZW50aXRpZXMgPSBtb2RlbElkZW50aXRpZXMobW9kZWwsIGZhbHNlKTtcbiAgY29uc3Qga2V5cyA9IGlkZW50aXRpZXMuZmxhdE1hcCgoaWRlbnRpdHkpID0+IG1vZGVsS2V5KGlkZW50aXR5KSA/PyBbXSk7XG4gIHJldHVybiB7XG4gICAgcmVzcG9uc2VzOiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLnJlc3BvbnNlcy5oYXMoa2V5KSksXG4gICAgaW1hZ2VJbnB1dDoga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy5pbWFnZUlucHV0LmhhcyhrZXkpKSxcbiAgICBhcHBseVBhdGNoOiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2guaGFzKGtleSkpLFxuICAgIC8vIFZlcnNpb24gaW5oZXJpdGFuY2Ugb25seSBhcHBsaWVzIHRvIGhvc3RlZCBmb3VuZGF0aW9uIGlkZW50aXRpZXMuXG4gICAgd2ViU2VhcmNoOlxuICAgICAga2V5cy5zb21lKChrZXkpID0+IGNhcGFiaWxpdGllcy53ZWJTZWFyY2guaGFzKGtleSkpIHx8XG4gICAgICBpZGVudGl0aWVzLnNvbWUoXG4gICAgICAgIChpZGVudGl0eSkgPT5cbiAgICAgICAgICBpc0ZvdW5kYXRpb25Nb2RlbElkZW50aXR5KGlkZW50aXR5KSAmJlxuICAgICAgICAgIGluaGVyaXRzTmF0aXZlV2ViU2VhcmNoKGlkZW50aXR5LCBjYXBhYmlsaXRpZXMud2ViU2VhcmNoKSxcbiAgICAgICksXG4gIH07XG59XG5cbi8qKiBSZXNvbHZlIHB1Ymxpc2hlZCBJVFBNLCBPVFBNLCBhbmQgUVBIIGxpbWl0cyBmcm9tIGEgbW9kZWwgaWRlbnRpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxSYXRlTGltaXRzRm9yKFxuICBtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbik6IE1vZGVsUmF0ZUxpbWl0cyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxpbWl0cyA9IG1ldGFkYXRhSW5kZXgoKS5yYXRlTGltaXRzO1xuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBrZXkgPSBtb2RlbEtleShpZGVudGl0eSk7XG4gICAgaWYgKCFrZXkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZvdW5kID0gbGltaXRzLmdldChrZXkpO1xuICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSByZWFzb25pbmcgbGV2ZWxzOiBsZWFybmVkIGZyb20gZXJyb3JzLCB0aGVuIGRvY3VtZW50YXRpb24sIHRoZW5cbiAqIGZhbWlseSBkZWZhdWx0cy5cbiAqXG4gKiBEb2VzIG5vdCBwYXJzZSBlcnJvciBib2RpZXM7IGNhbGxlcnMgc2hvdWxkIHVzZSB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9XG4gKiBhbmQgdGhlbiB7QGxpbmsgcmVtZW1iZXJSZWFzb25pbmdMZXZlbHN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxSZWFzb25pbmdMZXZlbHNGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgY29uc3QgaW5kZXggPSBtZXRhZGF0YUluZGV4KCk7XG4gIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgbW9kZWxJZGVudGl0aWVzKG1vZGVsKSkge1xuICAgIGNvbnN0IGxlYXJuZWQgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKGlkZW50aXR5LCBpbmRleC5sZWFybmVkUmVhc29uaW5nKTtcbiAgICBpZiAobGVhcm5lZD8ubGVuZ3RoKSByZXR1cm4gbGVhcm5lZDtcbiAgfVxuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIG1vZGVsSWRlbnRpdGllcyhtb2RlbCkpIHtcbiAgICBjb25zdCBkb2N1bWVudGVkID0gZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyhpZGVudGl0eSwgaW5kZXgucmVhc29uaW5nKTtcbiAgICBpZiAoZG9jdW1lbnRlZD8ubGVuZ3RoKSByZXR1cm4gZG9jdW1lbnRlZDtcbiAgfVxuICBjb25zdCBwcmltYXJ5ID0gdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiAobW9kZWwubW9kZWxTZXJ2aWNlTmFtZSA/PyBtb2RlbC5uYW1lKTtcbiAgcmV0dXJuIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMocHJpbWFyeSk7XG59XG5cbi8qKiBSZXNvbHZlIHJldGlyZW1lbnQsIGNhcGFiaWxpdHksIGFuZCByYXRlLWxpbWl0IG1ldGFkYXRhIHRvZ2V0aGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsTWV0YWRhdGFGb3IobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBNb2RlbE1ldGFkYXRhIHtcbiAgY29uc3QgcmF0ZUxpbWl0cyA9IG1vZGVsUmF0ZUxpbWl0c0Zvcihtb2RlbCk7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiBtb2RlbFN0YXR1c0Zvcihtb2RlbCksXG4gICAgY2FwYWJpbGl0aWVzOiBtb2RlbENhcGFiaWxpdGllc0Zvcihtb2RlbCksXG4gICAgLi4uKHJhdGVMaW1pdHMgPyB7IHJhdGVMaW1pdHMgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIFJldHVybiBnZW5lcmF0aW9uIHRpbWVzdGFtcHMgZm9yIHRoZSBjb21taXR0ZWQgbWV0YWRhdGEgc25hcHNob3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsTWV0YWRhdGFHZW5lcmF0ZWRBdCgpOiBSZWFkb25seTx7XG4gIHJldGlyZWRNb2RlbHM6IG51bWJlcjtcbiAgY2FwYWJpbGl0aWVzOiBudW1iZXI7XG4gIHJhdGVMaW1pdHM6IG51bWJlcjtcbiAgcmVhc29uaW5nOiBudW1iZXI7XG59PiB7XG4gIHJldHVybiB7XG4gICAgcmV0aXJlZE1vZGVsczogUkVUSVJFRF9NT0RFTFNfR0VORVJBVEVEX0FULFxuICAgIGNhcGFiaWxpdGllczogY2FwYWJpbGl0aWVzU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gICAgcmF0ZUxpbWl0czogcmF0ZUxpbWl0c1NuYXBzaG90LmdlbmVyYXRlZEF0LFxuICAgIHJlYXNvbmluZzogcmVhc29uaW5nU25hcHNob3QuZ2VuZXJhdGVkQXQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1vZGVsSWRlbnRpdGllcyhcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIGluY2x1ZGVEaXNwbGF5TmFtZSA9IHRydWUsXG4pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIpIHJldHVybiBbbW9kZWxdO1xuICByZXR1cm4gW1xuICAgIG1vZGVsLm5hbWUsXG4gICAgLi4uKGluY2x1ZGVEaXNwbGF5TmFtZSA/IFttb2RlbC5kaXNwbGF5TmFtZV0gOiBbXSksXG4gICAgbW9kZWwubW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAuLi5PYmplY3QudmFsdWVzKG1vZGVsLnNlcnZpY2VOYW1lcyA/PyB7fSksXG4gIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIG1vZGVsS2V5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gbW9kZWxTZWFyY2hRdWVyeSh2YWx1ZSk/LnJlcGxhY2VBbGwoXCIgXCIsIFwiLVwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFBhZ2UodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIGhlYWRlcnM6IHsgXCJ1c2VyLWFnZW50XCI6IFVTRVJfQUdFTlQgfSxcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTVfMDAwKSxcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiByZXR1cm5lZCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHt1cmx9YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuZnVuY3Rpb24gbm93U2Vjb25kcygpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG59XG4iXX0=
|
|
431
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBUWpELE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sd0JBQXdCLE1BQU0scUNBQXFDLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDakcsT0FBTyx1QkFBdUIsTUFBTSx3Q0FBd0MsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNuRyxPQUFPLHFCQUFxQixNQUFNLDBDQUEwQyxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ25HLE9BQU8sc0JBQXNCLE1BQU0sb0NBQW9DLENBQUMsT0FBTyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDOUYsT0FBTyxxQkFBcUIsTUFBTSxrQ0FBa0MsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUMzRixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixzQkFBc0IsR0FFdkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsMkJBQTJCLEVBQzNCLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbEIscUJBQXFCLEdBU3RCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLHVCQUF1QixFQUN2Qix5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixrQkFBa0IsR0FDbkIsTUFBTSxhQUFhLENBQUM7QUFD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O0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJ1aWxkLWdlbmVyYXRlZCBEYXRhYnJpY2tzIGFuZCBwdWJsaWMgbW9kZWwgY2FwYWJpbGl0eSBtZXRhZGF0YSwgcGx1cyBhXG4gKiBkYWlseSB3cml0ZS10aHJvdWdoIGNhY2hlIGZvciByZWZyZXNoZWQgc291cmNlcyBhbmQgZXJyb3ItbGVhcm5lZCByZWFzb25pbmdcbiAqIGxhZGRlcnMuXG4gKlxuICogQ29tbWl0dGVkIHNuYXBzaG90cyBzZWVkIGV2ZXJ5IHByb2Nlc3MuIHtAbGluayByZWZyZXNoTW9kZWxNZXRhZGF0YX0gcHVsbHNcbiAqIERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiwgbW9kZWxzLmRldiwgYW5kIG1vZGVscGFyYW1zLmRldiB0aHJvdWdoIHRoZSBzaGFyZWRcbiAqIG1lbW9yeS1maXJzdCB7QGxpbmsgY3JlYXRlTWV0YWRhdGFDYWNoZX0gYW5kIHJlYnVpbGRzIHRoZSBpbi1tZW1vcnkgaW5kZXguXG4gKiBFcnJvci1sZWFybmVkIGVmZm9ydHMgdXNlIHRoZSBzYW1lIHN0b3JlIHZpYSB7QGxpbmsgcmVtZW1iZXJSZWFzb25pbmdMZXZlbHN9LlxuICogS25vd24tZ29vZCB2YWx1ZXMgYXJlIHdyaXR0ZW4gYmVoaW5kIHRvIHRoZSBzaGFyZWQgbW9kZWwgcHJvamVjdCBjYWNoZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUge1xuICBNb2RlbENhcGFiaWxpdGllcyxcbiAgTW9kZWxNZXRhZGF0YSxcbiAgTW9kZWxSYXRlTGltaXRzLFxuICBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcblxuaW1wb3J0IHtcbiAgcGFyc2VNb2RlbFBhcmFtcyxcbiAgcGFyc2VNb2RlbENhcGFiaWxpdGllcyxcbiAgcGFyc2VNb2RlbFJhdGVMaW1pdHMsXG4gIHBhcnNlTW9kZWxzRGV2LFxuICBwYXJzZVJlYXNvbmluZ01vZGVscyxcbiAgcGFyc2VSZXRpcmVkTW9kZWxzLFxufSBmcm9tIFwiLi9fbWV0YWRhdGEtZ2VuZXJhdG9yLnRzXCI7XG5pbXBvcnQgY2FwYWJpbGl0aWVzU25hcHNob3RKc29uIGZyb20gXCIuL2dlbmVyYXRlZC9tb2RlbC1jYXBhYmlsaXRpZXMuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IG1vZGVsUGFyYW1zU25hcHNob3RKc29uIGZyb20gXCIuL2dlbmVyYXRlZC9tb2RlbHBhcmFtcy1yZWFzb25pbmcuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IG1vZGVsc0RldlNuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvbW9kZWxzLWRldi1jYXBhYmlsaXRpZXMuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0IHJhdGVMaW1pdHNTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL21vZGVsLXJhdGUtbGltaXRzLmpzb25cIiB3aXRoIHsgdHlwZTogXCJqc29uXCIgfTtcbmltcG9ydCByZWFzb25pbmdTbmFwc2hvdEpzb24gZnJvbSBcIi4vZ2VuZXJhdGVkL21vZGVsLXJlYXNvbmluZy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQge1xuICBjcmVhdGVNZXRhZGF0YUNhY2hlLFxuICBtZXJnZVByZWZlckZyZXNoTGlzdCxcbiAgbWVyZ2VQcmVmZXJGcmVzaFJlY29yZCxcbiAgdHlwZSBNZXRhZGF0YUNhY2hlLFxufSBmcm9tIFwiLi9tZXRhZGF0YS1jYWNoZS50c1wiO1xuaW1wb3J0IHtcbiAgTU9ERUxQQVJBTVNfREVWX01PREVMU19VUkwsXG4gIE1PREVMU19ERVZfQVBJX1VSTCxcbiAgTU9ERUxfUkFURV9MSU1JVFNfVVJMLFxuICBPUEVOQUlfUkVTUE9OU0VTX01PREVMU19VUkwsXG4gIFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMLFxuICBSRVRJUkVEX01PREVMU19VUkwsXG4gIFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCxcbiAgdHlwZSBNb2RlbFBhcmFtc0NhdGFsb2d1ZSxcbiAgdHlwZSBNb2RlbFBhcmFtc1NuYXBzaG90LFxuICB0eXBlIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3QsXG4gIHR5cGUgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlLFxuICB0eXBlIE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90LFxuICB0eXBlIE1vZGVsc0RldkNhcGFiaWxpdHlDYXRhbG9ndWUsXG4gIHR5cGUgTW9kZWxzRGV2U25hcHNob3QsXG4gIHR5cGUgUmVhc29uaW5nTW9kZWxzU25hcHNob3QsXG59IGZyb20gXCIuL21ldGFkYXRhLWNvbnRyYWN0LnRzXCI7XG5pbXBvcnQge1xuICBpbmhlcml0c05hdGl2ZVdlYlNlYXJjaCxcbiAgaXNGb3VuZGF0aW9uTW9kZWxJZGVudGl0eSxcbiAgbW9kZWxSZWFzb25pbmdFZmZvcnRzLFxuICBtb2RlbFNlYXJjaFF1ZXJ5LFxuICBtb2RlbFN1cHBvcnRzVG9vbHMsXG59IGZyb20gXCIuL3BvbGljeS50c1wiO1xuaW1wb3J0IHtcbiAgZGVmYXVsdFJlYXNvbmluZ0xldmVscyxcbiAgZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyxcbiAgcGFyc2VSZWFzb25pbmcsXG4gIHBhcnNlUmVhc29uaW5nTGV2ZWxzLFxuICB0eXBlIFJlYXNvbmluZ0xldmVsLFxuICB0eXBlIFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlLFxuICB1bmlxdWVSZWFzb25pbmdMZXZlbHMsXG59IGZyb20gXCIuL3JlYXNvbmluZy10cmFuc2xhdGlvbi50c1wiO1xuaW1wb3J0IHtcbiAgQ09NTUlUVEVEX1JFVElSRURfTU9ERUxTLFxuICBtb2RlbFN0YXR1c0ZvcixcbiAgcmVwbGFjZVJldGlyZWRNb2RlbE5hbWVzLFxuICBSRVRJUkVEX01PREVMU19HRU5FUkFURURfQVQsXG59IGZyb20gXCIuL3JldGlyZW1lbnQudHNcIjtcblxuY29uc3QgY2FwYWJpbGl0aWVzU25hcHNob3QgPSBjYXBhYmlsaXRpZXNTbmFwc2hvdEpzb24gYXMgTW9kZWxDYXBhYmlsaXRpZXNTbmFwc2hvdDtcbmNvbnN0IG1vZGVsUGFyYW1zU25hcHNob3QgPSBtb2RlbFBhcmFtc1NuYXBzaG90SnNvbiBhcyBNb2RlbFBhcmFtc1NuYXBzaG90O1xuY29uc3QgbW9kZWxzRGV2U25hcHNob3QgPSBtb2RlbHNEZXZTbmFwc2hvdEpzb24gYXMgTW9kZWxzRGV2U25hcHNob3Q7XG5jb25zdCByYXRlTGltaXRzU25hcHNob3QgPSByYXRlTGltaXRzU25hcHNob3RKc29uIGFzIE1vZGVsUmF0ZUxpbWl0c1NuYXBzaG90O1xuY29uc3QgcmVhc29uaW5nU25hcHNob3QgPSByZWFzb25pbmdTbmFwc2hvdEpzb24gYXMgUmVhc29uaW5nTW9kZWxzU25hcHNob3Q7XG5cbmludGVyZmFjZSBNZXRhZGF0YUluZGV4IHtcbiAgcmVhZG9ubHkgY2FwYWJpbGl0aWVzOiB7XG4gICAgcmVhZG9ubHkgW0tleSBpbiBrZXlvZiBNb2RlbENhcGFiaWxpdGllc106IFJlYWRvbmx5U2V0PHN0cmluZz47XG4gIH07XG4gIHJlYWRvbmx5IHJhdGVMaW1pdHM6IFJlYWRvbmx5TWFwPHN0cmluZywgTW9kZWxSYXRlTGltaXRzPjtcbiAgcmVhZG9ubHkgcmVhc29uaW5nOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbiAgcmVhZG9ubHkgcmVhc29uaW5nRG9jczogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWU7XG4gIHJlYWRvbmx5IG1vZGVsUGFyYW1zUmVhc29uaW5nOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbiAgcmVhZG9ubHkgbGVhcm5lZFJlYXNvbmluZzogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWU7XG4gIHJlYWRvbmx5IHRlbXBlcmF0dXJlVW5zdXBwb3J0ZWQ6IFJlYWRvbmx5U2V0PHN0cmluZz47XG59XG5cbnR5cGUgQ2FwYWJpbGl0eVNldHMgPSBNb2RlbENhcGFiaWxpdHlDYXRhbG9ndWU7XG50eXBlIE1vZGVsc0RldkRhdGEgPSBNb2RlbHNEZXZDYXBhYmlsaXR5Q2F0YWxvZ3VlO1xuXG5jb25zdCBVU0VSX0FHRU5UID0gXCJkYngtdG9vbHMtbW9kZWwtbWV0YWRhdGEvMVwiO1xuXG5jb25zdCByZXRpcmVkQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPHJlYWRvbmx5IHN0cmluZ1tdPih7XG4gIGtleTogXCJyZXRpcmVkLW1vZGVsc1wiLFxuICBmYWxsYmFjazogQ09NTUlUVEVEX1JFVElSRURfTU9ERUxTLFxuICBsb2FkOiBhc3luYyAoKSA9PiBwYXJzZVJldGlyZWRNb2RlbHMoYXdhaXQgbG9hZFBhZ2UoUkVUSVJFRF9NT0RFTFNfVVJMKSwgbm93U2Vjb25kcygpKS5tb2RlbHMsXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoTGlzdCxcbn0pO1xuXG5jb25zdCBjYXBhYmlsaXRpZXNDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8Q2FwYWJpbGl0eVNldHM+KHtcbiAga2V5OiBcIm1vZGVsLWNhcGFiaWxpdGllc1wiLFxuICBmYWxsYmFjazogY2FwYWJpbGl0aWVzU25hcHNob3QuY2FwYWJpbGl0aWVzLFxuICBsb2FkOiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW3Jlc3BvbnNlc0h0bWwsIHdlYlNlYXJjaEh0bWxdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgbG9hZFBhZ2UoT1BFTkFJX1JFU1BPTlNFU19NT0RFTFNfVVJMKSxcbiAgICAgIGxvYWRQYWdlKFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCksXG4gICAgXSk7XG4gICAgcmV0dXJuIHBhcnNlTW9kZWxDYXBhYmlsaXRpZXMocmVzcG9uc2VzSHRtbCwgd2ViU2VhcmNoSHRtbCwgbm93U2Vjb25kcygpKS5jYXBhYmlsaXRpZXM7XG4gIH0sXG4gIG1lcmdlOiAoaW5wdXQpID0+ICh7XG4gICAgcmVzcG9uc2VzOiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LnJlc3BvbnNlcyxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8ucmVzcG9uc2VzLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLnJlc3BvbnNlcyxcbiAgICB9KSxcbiAgICBpbWFnZUlucHV0OiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LmltYWdlSW5wdXQsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/LmltYWdlSW5wdXQsXG4gICAgICBmYWxsYmFjazogaW5wdXQuZmFsbGJhY2suaW1hZ2VJbnB1dCxcbiAgICB9KSxcbiAgICBhcHBseVBhdGNoOiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LmFwcGx5UGF0Y2gsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/LmFwcGx5UGF0Y2gsXG4gICAgICBmYWxsYmFjazogaW5wdXQuZmFsbGJhY2suYXBwbHlQYXRjaCxcbiAgICB9KSxcbiAgICB3ZWJTZWFyY2g6IG1lcmdlUHJlZmVyRnJlc2hMaXN0KHtcbiAgICAgIGZyZXNoOiBpbnB1dC5mcmVzaD8ud2ViU2VhcmNoLFxuICAgICAgcHJldmlvdXM6IGlucHV0LnByZXZpb3VzPy53ZWJTZWFyY2gsXG4gICAgICBmYWxsYmFjazogaW5wdXQuZmFsbGJhY2sud2ViU2VhcmNoLFxuICAgIH0pLFxuICB9KSxcbn0pO1xuXG5jb25zdCByYXRlTGltaXRzQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIE1vZGVsUmF0ZUxpbWl0cz4+Pih7XG4gIGtleTogXCJtb2RlbC1yYXRlLWxpbWl0c1wiLFxuICBmYWxsYmFjazogcmF0ZUxpbWl0c1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMsXG4gIGxvYWQ6IGFzeW5jICgpID0+XG4gICAgcGFyc2VNb2RlbFJhdGVMaW1pdHMoYXdhaXQgbG9hZFBhZ2UoTU9ERUxfUkFURV9MSU1JVFNfVVJMKSwgbm93U2Vjb25kcygpKS5jYXRhbG9ndWUubW9kZWxzLFxuICBtZXJnZTogbWVyZ2VQcmVmZXJGcmVzaFJlY29yZCxcbn0pO1xuXG5jb25zdCByZWFzb25pbmdEb2NzQ2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj4+KHtcbiAga2V5OiBcIm1vZGVsLXJlYXNvbmluZ1wiLFxuICBmYWxsYmFjazogcmVhc29uaW5nU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyxcbiAgbG9hZDogYXN5bmMgKCkgPT5cbiAgICBwYXJzZVJlYXNvbmluZ01vZGVscyhhd2FpdCBsb2FkUGFnZShRVUVSWV9SRUFTT05fTU9ERUxTX1VSTCksIG5vd1NlY29uZHMoKSkuY2F0YWxvZ3VlLm1vZGVscyxcbiAgbWVyZ2U6IG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQsXG59KTtcblxuY29uc3QgbW9kZWxzRGV2Q2FjaGUgPSBjcmVhdGVNZXRhZGF0YUNhY2hlPE1vZGVsc0RldkRhdGE+KHtcbiAga2V5OiBcIm1vZGVscy1kZXYtY2FwYWJpbGl0aWVzXCIsXG4gIGZhbGxiYWNrOiBtb2RlbHNEZXZTbmFwc2hvdC5jYXBhYmlsaXRpZXMsXG4gIGxvYWQ6IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHBhcnNlTW9kZWxzRGV2KGF3YWl0IGxvYWRKc29uKE1PREVMU19ERVZfQVBJX1VSTCksIG5vd1NlY29uZHMoKSk7XG4gICAgcmV0dXJuIHNuYXBzaG90LmNhcGFiaWxpdGllcztcbiAgfSxcbiAgbWVyZ2U6IG1lcmdlTW9kZWxzRGV2RGF0YSxcbn0pO1xuXG5jb25zdCBtb2RlbFBhcmFtc0NhY2hlID0gY3JlYXRlTWV0YWRhdGFDYWNoZTxNb2RlbFBhcmFtc0NhdGFsb2d1ZT4oe1xuICBrZXk6IFwibW9kZWxwYXJhbXMtcmVhc29uaW5nXCIsXG4gIGZhbGxiYWNrOiBtb2RlbFBhcmFtc1NuYXBzaG90LmNhdGFsb2d1ZSxcbiAgbG9hZDogYXN5bmMgKCkgPT5cbiAgICBwYXJzZU1vZGVsUGFyYW1zKGF3YWl0IGxvYWRKc29uKE1PREVMUEFSQU1TX0RFVl9NT0RFTFNfVVJMKSwgbm93U2Vjb25kcygpKS5jYXRhbG9ndWUsXG4gIG1lcmdlOiAoaW5wdXQpID0+ICh7XG4gICAgcmVhc29uaW5nOiBtZXJnZVByZWZlckZyZXNoTGlzdCh7XG4gICAgICBmcmVzaDogaW5wdXQuZnJlc2g/LnJlYXNvbmluZyxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8ucmVhc29uaW5nLFxuICAgICAgZmFsbGJhY2s6IGlucHV0LmZhbGxiYWNrLnJlYXNvbmluZyxcbiAgICB9KSxcbiAgICBtb2RlbHM6IG1lcmdlUHJlZmVyRnJlc2hSZWNvcmQoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5tb2RlbHMsXG4gICAgICBwcmV2aW91czogaW5wdXQucHJldmlvdXM/Lm1vZGVscyxcbiAgICAgIGZhbGxiYWNrOiBpbnB1dC5mYWxsYmFjay5tb2RlbHMsXG4gICAgfSksXG4gIH0pLFxufSk7XG5cbmNvbnN0IGxlYXJuZWRSZWFzb25pbmdDYWNoZSA9IGNyZWF0ZU1ldGFkYXRhQ2FjaGU8XG4gIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+PlxuPih7XG4gIGtleTogXCJsZWFybmVkLXJlYXNvbmluZ1wiLFxuICBmYWxsYmFjazoge30sXG4gIG1lcmdlOiBtZXJnZVByZWZlckZyZXNoUmVjb3JkLFxufSk7XG5cbmxldCBsaXZlSW5kZXg6IE1ldGFkYXRhSW5kZXggfCB1bmRlZmluZWQ7XG5cbmNvbnN0IGNvbW1pdHRlZE1ldGFkYXRhSW5kZXggPSBtZW1vaXplPE1ldGFkYXRhSW5kZXg+KGJ1aWxkSW5kZXhGcm9tQ29tbWl0dGVkKTtcblxuZnVuY3Rpb24gbWV0YWRhdGFJbmRleCgpOiBNZXRhZGF0YUluZGV4IHtcbiAgcmV0dXJuIGxpdmVJbmRleCA/PyBjb21taXR0ZWRNZXRhZGF0YUluZGV4KCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSW5kZXhGcm9tQ29tbWl0dGVkKCk6IE1ldGFkYXRhSW5kZXgge1xuICByZXR1cm4gYnVpbGRJbmRleCh7XG4gICAgcmV0aXJlZE5hbWVzOiBDT01NSVRURURfUkVUSVJFRF9NT0RFTFMsXG4gICAgY2FwYWJpbGl0aWVzOiBjYXBhYmlsaXRpZXNTbmFwc2hvdC5jYXBhYmlsaXRpZXMsXG4gICAgbW9kZWxzRGV2OiBtb2RlbHNEZXZTbmFwc2hvdC5jYXBhYmlsaXRpZXMsXG4gICAgbW9kZWxQYXJhbXM6IG1vZGVsUGFyYW1zU25hcHNob3QuY2F0YWxvZ3VlLFxuICAgIHJhdGVMaW1pdHM6IHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzLFxuICAgIHJlYXNvbmluZzogcmVhc29uaW5nU25hcHNob3QuY2F0YWxvZ3VlLm1vZGVscyxcbiAgICBsZWFybmVkUmVhc29uaW5nOiB7fSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSW5kZXgoaW5wdXQ6IHtcbiAgcmVhZG9ubHkgcmV0aXJlZE5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXR5U2V0cztcbiAgcmVhZG9ubHkgbW9kZWxzRGV2OiBNb2RlbHNEZXZEYXRhO1xuICByZWFkb25seSBtb2RlbFBhcmFtczogTW9kZWxQYXJhbXNDYXRhbG9ndWU7XG4gIHJlYWRvbmx5IHJhdGVMaW1pdHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIE1vZGVsUmF0ZUxpbWl0cz4+O1xuICByZWFkb25seSByZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG4gIHJlYWRvbmx5IGxlYXJuZWRSZWFzb25pbmc6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pjtcbn0pOiBNZXRhZGF0YUluZGV4IHtcbiAgcmVwbGFjZVJldGlyZWRNb2RlbE5hbWVzKGlucHV0LnJldGlyZWROYW1lcyk7XG4gIGNvbnN0IHJlYXNvbmluZ0RvY3MgPSBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoaW5wdXQucmVhc29uaW5nKTtcbiAgY29uc3QgbW9kZWxQYXJhbXNSZWFzb25pbmcgPSBmcmVlemVSZWFzb25pbmdDYXRhbG9ndWUoaW5wdXQubW9kZWxQYXJhbXMubW9kZWxzKTtcbiAgcmV0dXJuIHtcbiAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgIHJlc3BvbnNlczogbmV3IFNldChpbnB1dC5jYXBhYmlsaXRpZXMucmVzcG9uc2VzKSxcbiAgICAgIGltYWdlSW5wdXQ6IG5ldyBTZXQoW1xuICAgICAgICAuLi5pbnB1dC5jYXBhYmlsaXRpZXMuaW1hZ2VJbnB1dCxcbiAgICAgICAgLi4uaW5wdXQubW9kZWxzRGV2LmltYWdlSW5wdXQsXG4gICAgICBdKSxcbiAgICAgIGFwcGx5UGF0Y2g6IG5ldyBTZXQoaW5wdXQuY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2gpLFxuICAgICAgd2ViU2VhcmNoOiBuZXcgU2V0KGlucHV0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gpLFxuICAgICAgcmVhc29uaW5nOiBuZXcgU2V0KFtcbiAgICAgICAgLi4uaW5wdXQubW9kZWxzRGV2LnJlYXNvbmluZyxcbiAgICAgICAgLi4uaW5wdXQubW9kZWxQYXJhbXMucmVhc29uaW5nLFxuICAgICAgXSksXG4gICAgICB0b29sczogbmV3IFNldChpbnB1dC5tb2RlbHNEZXYudG9vbHMpLFxuICAgICAgc3RydWN0dXJlZE91dHB1dDogbmV3IFNldChpbnB1dC5tb2RlbHNEZXYuc3RydWN0dXJlZE91dHB1dCksXG4gICAgICB0ZW1wZXJhdHVyZTogbmV3IFNldChpbnB1dC5tb2RlbHNEZXYudGVtcGVyYXR1cmVTdXBwb3J0ZWQpLFxuICAgIH0sXG4gICAgcmF0ZUxpbWl0czogbmV3IE1hcChPYmplY3QuZW50cmllcyhpbnB1dC5yYXRlTGltaXRzKSksXG4gICAgcmVhc29uaW5nOiBPYmplY3QuZnJlZXplKHtcbiAgICAgIC4uLm1vZGVsUGFyYW1zUmVhc29uaW5nLFxuICAgICAgLi4ucmVhc29uaW5nRG9jcyxcbiAgICB9KSxcbiAgICByZWFzb25pbmdEb2NzLFxuICAgIG1vZGVsUGFyYW1zUmVhc29uaW5nLFxuICAgIGxlYXJuZWRSZWFzb25pbmc6IGZyZWV6ZUxlYXJuZWRDYXRhbG9ndWUoaW5wdXQubGVhcm5lZFJlYXNvbmluZyksXG4gICAgdGVtcGVyYXR1cmVVbnN1cHBvcnRlZDogbmV3IFNldChpbnB1dC5tb2RlbHNEZXYudGVtcGVyYXR1cmVVbnN1cHBvcnRlZCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZyZWV6ZVJlYXNvbmluZ0NhdGFsb2d1ZShcbiAgbW9kZWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+LFxuKTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhtb2RlbHMpLm1hcCgoW2tleSwgbGV2ZWxzXSkgPT4gW1xuICAgICAgICBrZXksXG4gICAgICAgIE9iamVjdC5mcmVlemUoXG4gICAgICAgICAgdW5pcXVlUmVhc29uaW5nTGV2ZWxzKGxldmVscy5mbGF0TWFwKChsZXZlbCkgPT4gcGFyc2VSZWFzb25pbmcobGV2ZWwpID8/IFtdKSksXG4gICAgICAgICksXG4gICAgICBdKSxcbiAgICApLFxuICApO1xufVxuXG5mdW5jdGlvbiBmcmVlemVMZWFybmVkQ2F0YWxvZ3VlKFxuICBtb2RlbHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IFJlYXNvbmluZ0xldmVsW10+Pixcbik6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMobW9kZWxzKS5tYXAoKFtrZXksIGxldmVsc10pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICBPYmplY3QuZnJlZXplKHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMpKSxcbiAgICAgIF0pLFxuICAgICksXG4gICk7XG59XG5cbmxldCByZWZyZXNoSW5mbGlnaHQ6IFByb21pc2U8TWV0YWRhdGFJbmRleD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogSHlkcmF0ZSBvciByZWZyZXNoIGRvY3VtZW50YXRpb24gKyBsZWFybmVkIGNhY2hlcyBpbnRvIHRoZSBwcm9jZXNzIGluZGV4LlxuICpcbiAqIFNhZmUgdG8gY2FsbCBvbiBnYXRld2F5IHN0YXJ0dXAuIENvbmN1cnJlbnQgY2FsbGVycyBzaGFyZSBvbmUgcmVmcmVzaC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hNb2RlbE1ldGFkYXRhKCk6IFByb21pc2U8TWV0YWRhdGFJbmRleD4ge1xuICBpZiAocmVmcmVzaEluZmxpZ2h0KSByZXR1cm4gcmVmcmVzaEluZmxpZ2h0O1xuICByZWZyZXNoSW5mbGlnaHQgPSAoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtcbiAgICAgIHJldGlyZWROYW1lcyxcbiAgICAgIGNhcGFiaWxpdGllcyxcbiAgICAgIG1vZGVsc0RldixcbiAgICAgIG1vZGVsUGFyYW1zLFxuICAgICAgcmF0ZUxpbWl0cyxcbiAgICAgIHJlYXNvbmluZyxcbiAgICAgIGxlYXJuZWRSZWFzb25pbmcsXG4gICAgXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHJldGlyZWRDYWNoZS5nZXQoKSxcbiAgICAgIGNhcGFiaWxpdGllc0NhY2hlLmdldCgpLFxuICAgICAgbW9kZWxzRGV2Q2FjaGUuZ2V0KCksXG4gICAgICBtb2RlbFBhcmFtc0NhY2hlLmdldCgpLFxuICAgICAgcmF0ZUxpbWl0c0NhY2hlLmdldCgpLFxuICAgICAgcmVhc29uaW5nRG9jc0NhY2hlLmdldCgpLFxuICAgICAgbGVhcm5lZFJlYXNvbmluZ0NhY2hlLmdldCgpLFxuICAgIF0pO1xuICAgIGxpdmVJbmRleCA9IGJ1aWxkSW5kZXgoe1xuICAgICAgcmV0aXJlZE5hbWVzLFxuICAgICAgY2FwYWJpbGl0aWVzLFxuICAgICAgbW9kZWxzRGV2LFxuICAgICAgbW9kZWxQYXJhbXMsXG4gICAgICByYXRlTGltaXRzLFxuICAgICAgcmVhc29uaW5nLFxuICAgICAgbGVhcm5lZFJlYXNvbmluZyxcbiAgICB9KTtcbiAgICByZXR1cm4gbGl2ZUluZGV4O1xuICB9KSgpLmZpbmFsbHkoKCkgPT4ge1xuICAgIHJlZnJlc2hJbmZsaWdodCA9IHVuZGVmaW5lZDtcbiAgfSk7XG4gIHJldHVybiByZWZyZXNoSW5mbGlnaHQ7XG59XG5cbi8qKiBMb2FkIHNoYXJlZCBjYWNoZSBlbnRyaWVzIHdpdGhvdXQgZm9yY2luZyBhIG5ldHdvcmsgcmVmcmVzaC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlTW9kZWxNZXRhZGF0YSgpOiBQcm9taXNlPE1ldGFkYXRhSW5kZXg+IHtcbiAgY29uc3QgW1xuICAgIHJldGlyZWROYW1lcyxcbiAgICBjYXBhYmlsaXRpZXMsXG4gICAgbW9kZWxzRGV2LFxuICAgIG1vZGVsUGFyYW1zLFxuICAgIHJhdGVMaW1pdHMsXG4gICAgcmVhc29uaW5nLFxuICAgIGxlYXJuZWRSZWFzb25pbmcsXG4gIF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgcGVla09yRmFsbGJhY2socmV0aXJlZENhY2hlLCBDT01NSVRURURfUkVUSVJFRF9NT0RFTFMpLFxuICAgIHBlZWtPckZhbGxiYWNrKGNhcGFiaWxpdGllc0NhY2hlLCBjYXBhYmlsaXRpZXNTbmFwc2hvdC5jYXBhYmlsaXRpZXMpLFxuICAgIHBlZWtPckZhbGxiYWNrKG1vZGVsc0RldkNhY2hlLCBtb2RlbHNEZXZTbmFwc2hvdC5jYXBhYmlsaXRpZXMpLFxuICAgIHBlZWtPckZhbGxiYWNrKG1vZGVsUGFyYW1zQ2FjaGUsIG1vZGVsUGFyYW1zU25hcHNob3QuY2F0YWxvZ3VlKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyYXRlTGltaXRzQ2FjaGUsIHJhdGVMaW1pdHNTbmFwc2hvdC5jYXRhbG9ndWUubW9kZWxzKSxcbiAgICBwZWVrT3JGYWxsYmFjayhyZWFzb25pbmdEb2NzQ2FjaGUsIHJlYXNvbmluZ1NuYXBzaG90LmNhdGFsb2d1ZS5tb2RlbHMpLFxuICAgIHBlZWtPckZhbGxiYWNrKGxlYXJuZWRSZWFzb25pbmdDYWNoZSwge30pLFxuICBdKTtcbiAgbGl2ZUluZGV4ID0gYnVpbGRJbmRleCh7XG4gICAgcmV0aXJlZE5hbWVzLFxuICAgIGNhcGFiaWxpdGllcyxcbiAgICBtb2RlbHNEZXYsXG4gICAgbW9kZWxQYXJhbXMsXG4gICAgcmF0ZUxpbWl0cyxcbiAgICByZWFzb25pbmcsXG4gICAgbGVhcm5lZFJlYXNvbmluZyxcbiAgfSk7XG4gIHJldHVybiBsaXZlSW5kZXg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBlZWtPckZhbGxiYWNrPFQ+KGNhY2hlOiBNZXRhZGF0YUNhY2hlPFQ+LCBmYWxsYmFjazogVCk6IFByb21pc2U8VD4ge1xuICBjb25zdCBwZWVrZWQgPSBhd2FpdCBjYWNoZS5wZWVrKCk7XG4gIGlmIChwZWVrZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHBlZWtlZDtcbiAgcmV0dXJuIGNhY2hlLmdldCgpLmNhdGNoKCgpID0+IGZhbGxiYWNrKTtcbn1cblxuLyoqIFJldHVybiB0aGUgY29tbWl0dGVkIHJlYXNvbmluZy1lZmZvcnQgY2F0YWxvZ3VlLiBDYWNoZWQgcGVyIHByb2Nlc3MuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhc29uaW5nTW9kZWxDYXRhbG9ndWUoKTogUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUge1xuICByZXR1cm4gbWV0YWRhdGFJbmRleCgpLnJlYXNvbmluZztcbn1cblxuLyoqIFJldHVybiBlcnJvci1sZWFybmVkIHJlYXNvbmluZyBsYWRkZXJzIGZyb20gdGhlIHNoYXJlZCBtb2RlbCBjYWNoZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsZWFybmVkUmVhc29uaW5nQ2F0YWxvZ3VlKCk6IFJlYXNvbmluZ01vZGVsQ2F0YWxvZ3VlIHtcbiAgcmV0dXJuIG1ldGFkYXRhSW5kZXgoKS5sZWFybmVkUmVhc29uaW5nO1xufVxuXG4vKipcbiAqIFN0b3JlIGxldmVscyBsZWFybmVkIGZyb20gYW4gdXBzdHJlYW0gZXJyb3IgYW5kIHBlcnNpc3QgdGhlbSB3cml0ZS10aHJvdWdoLlxuICpcbiAqIEVtcHR5IGxpc3RzIGFyZSBpZ25vcmVkIHNvIGEgZmFpbGVkIHBhcnNlIGNhbm5vdCB3aXBlIGRlZmF1bHRzLiBFcnJvciBib2RpZXNcbiAqIHRoZW1zZWx2ZXMgYXJlIG5ldmVyIHN0b3JlZCAtIG9ubHkgdGhlIHBhcnNlZCBsYWRkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1lbWJlclJlYXNvbmluZ0xldmVscyhcbiAgbW9kZWw6IHN0cmluZyxcbiAgbGV2ZWxzOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdLFxuKTogUHJvbWlzZTxSZWFzb25pbmdMZXZlbFtdPiB7XG4gIGNvbnN0IHVuaXF1ZSA9IHVuaXF1ZVJlYXNvbmluZ0xldmVscyhsZXZlbHMpO1xuICBpZiAodW5pcXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG1vZGVsUmVhc29uaW5nTGV2ZWxzRm9yKG1vZGVsKTtcbiAgY29uc3Qga2V5ID0gbW9kZWxLZXkobW9kZWwpO1xuICBpZiAoIWtleSkgcmV0dXJuIG1vZGVsUmVhc29uaW5nTGV2ZWxzRm9yKG1vZGVsKTtcbiAgY29uc3QgY2F0YWxvZ3VlID0gYXdhaXQgbGVhcm5lZFJlYXNvbmluZ0NhY2hlLnVwZGF0ZSgoY3VycmVudCkgPT4gKHtcbiAgICAuLi5jdXJyZW50LFxuICAgIFtrZXldOiB1bmlxdWUsXG4gIH0pKTtcbiAgY29uc3QgY3VycmVudCA9IG1ldGFkYXRhSW5kZXgoKTtcbiAgbGl2ZUluZGV4ID0ge1xuICAgIC4uLmN1cnJlbnQsXG4gICAgbGVhcm5lZFJlYXNvbmluZzogZnJlZXplTGVhcm5lZENhdGFsb2d1ZShjYXRhbG9ndWUpLFxuICB9O1xuICByZXR1cm4gWy4uLnVuaXF1ZV07XG59XG5cbi8qKlxuICogUGFyc2UgYW4gdXBzdHJlYW0gZXJyb3IgYm9keSBhbmQgcGVyc2lzdCB0aGUgc3VwcG9ydGVkIGxhZGRlciBmb3IgYG1vZGVsYC5cbiAqXG4gKiBBY2NlcHRzIHRoZSBzYW1lIG5lc3RlZCBEYXRhYnJpY2tzIGVudmVsb3BlcyBhcyB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9LlxuICogUmV0dXJucyBhIHB1Ymxpc2hlZCBsYWRkZXIgd2l0aG91dCBwYXJzaW5nIG9yIHN0b3JpbmcgZXJyb3ItZGVyaXZlZCBsZXZlbHNcbiAqIHdoZW4gb25lIGV4aXN0cy4gT3RoZXJ3aXNlIHJldHVybnMgdGhlIGxldmVscyB0aGF0IHdlcmUgc3RvcmVkLCBvciB0aGVcbiAqIGN1cnJlbnQgZmFsbGJhY2sgd2hlbiBwYXJzaW5nIHlpZWxkcyBub3RoaW5nLiBUaGUgcmF3IGVycm9yIGJvZHkgaXMgbmV2ZXJcbiAqIGNhY2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxlYXJuUmVhc29uaW5nTGV2ZWxzRnJvbUVycm9yKFxuICBtb2RlbDogc3RyaW5nLFxuICBib2R5OiB1bmtub3duLFxuKTogUHJvbWlzZTxSZWFzb25pbmdMZXZlbFtdPiB7XG4gIGNvbnN0IHB1Ymxpc2hlZCA9IHB1Ymxpc2hlZFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbCwgbWV0YWRhdGFJbmRleCgpKTtcbiAgaWYgKHB1Ymxpc2hlZCkgcmV0dXJuIHB1Ymxpc2hlZDtcbiAgcmV0dXJuIHJlbWVtYmVyUmVhc29uaW5nTGV2ZWxzKG1vZGVsLCBwYXJzZVJlYXNvbmluZ0xldmVscyhib2R5KSk7XG59XG5cbi8qKiBSZXNvbHZlIHB1Ymxpc2hlZCBtb2RlbCBjYXBhYmlsaXRpZXMgZnJvbSBhIG5hbWUgb3IgZW5kcG9pbnQgc3VtbWFyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbENhcGFiaWxpdGllc0Zvcihtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IE1vZGVsQ2FwYWJpbGl0aWVzIHtcbiAgY29uc3QgY2FwYWJpbGl0aWVzID0gbWV0YWRhdGFJbmRleCgpLmNhcGFiaWxpdGllcztcbiAgY29uc3QgaWRlbnRpdGllcyA9IG1vZGVsSWRlbnRpdGllcyhtb2RlbCwgZmFsc2UpO1xuICBjb25zdCBrZXlzID0gaWRlbnRpdGllcy5mbGF0TWFwKChpZGVudGl0eSkgPT4gbW9kZWxLZXkoaWRlbnRpdHkpID8/IFtdKTtcbiAgcmV0dXJuIHtcbiAgICByZXNwb25zZXM6IGtleXMuc29tZSgoa2V5KSA9PiBjYXBhYmlsaXRpZXMucmVzcG9uc2VzLmhhcyhrZXkpKSxcbiAgICBpbWFnZUlucHV0OiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLmltYWdlSW5wdXQuaGFzKGtleSkpLFxuICAgIGFwcGx5UGF0Y2g6IGtleXMuc29tZSgoa2V5KSA9PiBjYXBhYmlsaXRpZXMuYXBwbHlQYXRjaC5oYXMoa2V5KSksXG4gICAgLy8gVmVyc2lvbiBpbmhlcml0YW5jZSBvbmx5IGFwcGxpZXMgdG8gaG9zdGVkIGZvdW5kYXRpb24gaWRlbnRpdGllcy5cbiAgICB3ZWJTZWFyY2g6XG4gICAgICBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLndlYlNlYXJjaC5oYXMoa2V5KSkgfHxcbiAgICAgIGlkZW50aXRpZXMuc29tZShcbiAgICAgICAgKGlkZW50aXR5KSA9PlxuICAgICAgICAgIGlzRm91bmRhdGlvbk1vZGVsSWRlbnRpdHkoaWRlbnRpdHkpICYmXG4gICAgICAgICAgaW5oZXJpdHNOYXRpdmVXZWJTZWFyY2goaWRlbnRpdHksIGNhcGFiaWxpdGllcy53ZWJTZWFyY2gpLFxuICAgICAgKSxcbiAgICByZWFzb25pbmc6XG4gICAgICBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLnJlYXNvbmluZy5oYXMoa2V5KSkgfHxcbiAgICAgIGlkZW50aXRpZXMuc29tZSgoaWRlbnRpdHkpID0+IG1vZGVsUmVhc29uaW5nRWZmb3J0cyhpZGVudGl0eSkubGVuZ3RoID4gMCksXG4gICAgdG9vbHM6XG4gICAgICBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLnRvb2xzLmhhcyhrZXkpKSB8fCBpZGVudGl0aWVzLnNvbWUobW9kZWxTdXBwb3J0c1Rvb2xzKSxcbiAgICBzdHJ1Y3R1cmVkT3V0cHV0OiBrZXlzLnNvbWUoKGtleSkgPT4gY2FwYWJpbGl0aWVzLnN0cnVjdHVyZWRPdXRwdXQuaGFzKGtleSkpLFxuICAgIHRlbXBlcmF0dXJlOiBtb2RlbFRlbXBlcmF0dXJlU3VwcG9ydEZvcihtb2RlbCkgPT09IHRydWUsXG4gIH07XG59XG5cbi8qKiBSZXNvbHZlIGV4cGxpY2l0IERhdGFicmlja3MgdGVtcGVyYXR1cmUgc3VwcG9ydCwgb3IgdW5kZWZpbmVkIHdoZW4gdW5wdWJsaXNoZWQuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxUZW1wZXJhdHVyZVN1cHBvcnRGb3IoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGluZGV4ID0gbWV0YWRhdGFJbmRleCgpO1xuICBjb25zdCBrZXlzID0gbW9kZWxJZGVudGl0aWVzKG1vZGVsKS5mbGF0TWFwKChpZGVudGl0eSkgPT4gbW9kZWxLZXkoaWRlbnRpdHkpID8/IFtdKTtcbiAgaWYgKGtleXMuc29tZSgoa2V5KSA9PiBpbmRleC50ZW1wZXJhdHVyZVVuc3VwcG9ydGVkLmhhcyhrZXkpKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoa2V5cy5zb21lKChrZXkpID0+IGluZGV4LmNhcGFiaWxpdGllcy50ZW1wZXJhdHVyZS5oYXMoa2V5KSkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogUmVzb2x2ZSBwdWJsaXNoZWQgSVRQTSwgT1RQTSwgYW5kIFFQSCBsaW1pdHMgZnJvbSBhIG1vZGVsIGlkZW50aXR5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsUmF0ZUxpbWl0c0ZvcihcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4pOiBNb2RlbFJhdGVMaW1pdHMgfCB1bmRlZmluZWQge1xuICBjb25zdCBsaW1pdHMgPSBtZXRhZGF0YUluZGV4KCkucmF0ZUxpbWl0cztcbiAgZm9yIChjb25zdCBpZGVudGl0eSBvZiBtb2RlbElkZW50aXRpZXMobW9kZWwpKSB7XG4gICAgY29uc3Qga2V5ID0gbW9kZWxLZXkoaWRlbnRpdHkpO1xuICAgIGlmICgha2V5KSBjb250aW51ZTtcbiAgICBjb25zdCBmb3VuZCA9IGxpbWl0cy5nZXQoa2V5KTtcbiAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgcmVhc29uaW5nIGxldmVsczogRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uLCBtb2RlbHBhcmFtcy5kZXYsXG4gKiBsZWFybmVkIGVycm9ycywgdGhlbiBmYW1pbHkgZGVmYXVsdHMuXG4gKlxuICogRG9lcyBub3QgcGFyc2UgZXJyb3IgYm9kaWVzOyBjYWxsZXJzIGhhbmRsaW5nIGFuIHVwc3RyZWFtIGVycm9yIHNob3VsZCB1c2VcbiAqIHtAbGluayBsZWFyblJlYXNvbmluZ0xldmVsc0Zyb21FcnJvcn0gc28gcHVibGlzaGVkIGxldmVscyBrZWVwIHByZWNlZGVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFJlYXNvbmluZ0xldmVsc0Zvcihtb2RlbDogc3RyaW5nIHwgU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IFJlYXNvbmluZ0xldmVsW10ge1xuICBjb25zdCBpbmRleCA9IG1ldGFkYXRhSW5kZXgoKTtcbiAgY29uc3QgcHVibGlzaGVkID0gcHVibGlzaGVkUmVhc29uaW5nTGV2ZWxzRm9yKG1vZGVsLCBpbmRleCk7XG4gIGlmIChwdWJsaXNoZWQpIHJldHVybiBwdWJsaXNoZWQ7XG4gIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgbW9kZWxJZGVudGl0aWVzKG1vZGVsKSkge1xuICAgIGNvbnN0IGxlYXJuZWQgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKGlkZW50aXR5LCBpbmRleC5sZWFybmVkUmVhc29uaW5nKTtcbiAgICBpZiAobGVhcm5lZD8ubGVuZ3RoKSByZXR1cm4gbGVhcm5lZDtcbiAgfVxuICBjb25zdCBwcmltYXJ5ID0gdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gbW9kZWwgOiAobW9kZWwubW9kZWxTZXJ2aWNlTmFtZSA/PyBtb2RlbC5uYW1lKTtcbiAgcmV0dXJuIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMocHJpbWFyeSk7XG59XG5cbmZ1bmN0aW9uIHB1Ymxpc2hlZFJlYXNvbmluZ0xldmVsc0ZvcihcbiAgbW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIGluZGV4OiBNZXRhZGF0YUluZGV4LFxuKTogUmVhc29uaW5nTGV2ZWxbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGlkZW50aXRpZXMgPSBtb2RlbElkZW50aXRpZXMobW9kZWwpO1xuICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIGlkZW50aXRpZXMpIHtcbiAgICBjb25zdCBkb2N1bWVudGVkID0gZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyhpZGVudGl0eSwgaW5kZXgucmVhc29uaW5nRG9jcyk7XG4gICAgaWYgKGRvY3VtZW50ZWQ/Lmxlbmd0aCkgcmV0dXJuIGRvY3VtZW50ZWQ7XG4gIH1cbiAgZm9yIChjb25zdCBpZGVudGl0eSBvZiBpZGVudGl0aWVzKSB7XG4gICAgY29uc3QgbW9kZWxQYXJhbXMgPSBkb2N1bWVudGVkUmVhc29uaW5nTGV2ZWxzKGlkZW50aXR5LCBpbmRleC5tb2RlbFBhcmFtc1JlYXNvbmluZyk7XG4gICAgaWYgKG1vZGVsUGFyYW1zPy5sZW5ndGgpIHJldHVybiBtb2RlbFBhcmFtcztcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogUmVzb2x2ZSByZXRpcmVtZW50LCBjYXBhYmlsaXR5LCBhbmQgcmF0ZS1saW1pdCBtZXRhZGF0YSB0b2dldGhlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbE1ldGFkYXRhRm9yKG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogTW9kZWxNZXRhZGF0YSB7XG4gIGNvbnN0IHJhdGVMaW1pdHMgPSBtb2RlbFJhdGVMaW1pdHNGb3IobW9kZWwpO1xuICByZXR1cm4ge1xuICAgIHN0YXR1czogbW9kZWxTdGF0dXNGb3IobW9kZWwpLFxuICAgIGNhcGFiaWxpdGllczogbW9kZWxDYXBhYmlsaXRpZXNGb3IobW9kZWwpLFxuICAgIC4uLihyYXRlTGltaXRzID8geyByYXRlTGltaXRzIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBSZXR1cm4gZ2VuZXJhdGlvbiB0aW1lc3RhbXBzIGZvciB0aGUgY29tbWl0dGVkIG1ldGFkYXRhIHNuYXBzaG90cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbE1ldGFkYXRhR2VuZXJhdGVkQXQoKTogUmVhZG9ubHk8e1xuICByZXRpcmVkTW9kZWxzOiBudW1iZXI7XG4gIGNhcGFiaWxpdGllczogbnVtYmVyO1xuICBtb2RlbHNEZXY6IG51bWJlcjtcbiAgbW9kZWxQYXJhbXM6IG51bWJlcjtcbiAgcmF0ZUxpbWl0czogbnVtYmVyO1xuICByZWFzb25pbmc6IG51bWJlcjtcbn0+IHtcbiAgcmV0dXJuIHtcbiAgICByZXRpcmVkTW9kZWxzOiBSRVRJUkVEX01PREVMU19HRU5FUkFURURfQVQsXG4gICAgY2FwYWJpbGl0aWVzOiBjYXBhYmlsaXRpZXNTbmFwc2hvdC5nZW5lcmF0ZWRBdCxcbiAgICBtb2RlbHNEZXY6IG1vZGVsc0RldlNuYXBzaG90LmdlbmVyYXRlZEF0LFxuICAgIG1vZGVsUGFyYW1zOiBtb2RlbFBhcmFtc1NuYXBzaG90LmdlbmVyYXRlZEF0LFxuICAgIHJhdGVMaW1pdHM6IHJhdGVMaW1pdHNTbmFwc2hvdC5nZW5lcmF0ZWRBdCxcbiAgICByZWFzb25pbmc6IHJlYXNvbmluZ1NuYXBzaG90LmdlbmVyYXRlZEF0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBtb2RlbElkZW50aXRpZXMoXG4gIG1vZGVsOiBzdHJpbmcgfCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBpbmNsdWRlRGlzcGxheU5hbWUgPSB0cnVlLFxuKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiKSByZXR1cm4gW21vZGVsXTtcbiAgcmV0dXJuIFtcbiAgICBtb2RlbC5uYW1lLFxuICAgIC4uLihpbmNsdWRlRGlzcGxheU5hbWUgPyBbbW9kZWwuZGlzcGxheU5hbWVdIDogW10pLFxuICAgIG1vZGVsLm1vZGVsU2VydmljZU5hbWUsXG4gICAgLi4uT2JqZWN0LnZhbHVlcyhtb2RlbC5zZXJ2aWNlTmFtZXMgPz8ge30pLFxuICBdLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBtb2RlbEtleSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIG1vZGVsU2VhcmNoUXVlcnkodmFsdWUpPy5yZXBsYWNlQWxsKFwiIFwiLCBcIi1cIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRQYWdlKHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBoZWFkZXJzOiB7IFwidXNlci1hZ2VudFwiOiBVU0VSX0FHRU5UIH0sXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDE1XzAwMCksXG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhYnJpY2tzIGRvY3VtZW50YXRpb24gcmV0dXJuZWQgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c306ICR7dXJsfWApO1xuICB9XG4gIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRKc29uKHVybDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgaGVhZGVyczogeyBcInVzZXItYWdlbnRcIjogVVNFUl9BR0VOVCB9LFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxNV8wMDApLFxuICB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgbWV0YWRhdGEgc291cmNlIHJldHVybmVkIEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3VybH1gKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG5mdW5jdGlvbiBtZXJnZU1vZGVsc0RldkRhdGEoaW5wdXQ6IHtcbiAgcmVhZG9ubHkgZnJlc2g6IE1vZGVsc0RldkRhdGEgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHByZXZpb3VzOiBNb2RlbHNEZXZEYXRhIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBmYWxsYmFjazogTW9kZWxzRGV2RGF0YTtcbn0pOiBNb2RlbHNEZXZEYXRhIHtcbiAgY29uc3QgY2FwYWJpbGl0eSA9IChrZXk6IGtleW9mIE1vZGVsc0RldkNhcGFiaWxpdHlDYXRhbG9ndWUpID0+XG4gICAgbWVyZ2VQcmVmZXJGcmVzaExpc3Qoe1xuICAgICAgZnJlc2g6IGlucHV0LmZyZXNoPy5ba2V5XSxcbiAgICAgIHByZXZpb3VzOiBpbnB1dC5wcmV2aW91cz8uW2tleV0sXG4gICAgICBmYWxsYmFjazogaW5wdXQuZmFsbGJhY2tba2V5XSxcbiAgICB9KTtcbiAgcmV0dXJuIHtcbiAgICBpbWFnZUlucHV0OiBjYXBhYmlsaXR5KFwiaW1hZ2VJbnB1dFwiKSxcbiAgICByZWFzb25pbmc6IGNhcGFiaWxpdHkoXCJyZWFzb25pbmdcIiksXG4gICAgdG9vbHM6IGNhcGFiaWxpdHkoXCJ0b29sc1wiKSxcbiAgICBzdHJ1Y3R1cmVkT3V0cHV0OiBjYXBhYmlsaXR5KFwic3RydWN0dXJlZE91dHB1dFwiKSxcbiAgICB0ZW1wZXJhdHVyZVN1cHBvcnRlZDogY2FwYWJpbGl0eShcInRlbXBlcmF0dXJlU3VwcG9ydGVkXCIpLFxuICAgIHRlbXBlcmF0dXJlVW5zdXBwb3J0ZWQ6IGNhcGFiaWxpdHkoXCJ0ZW1wZXJhdHVyZVVuc3VwcG9ydGVkXCIpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3dTZWNvbmRzKCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbn1cbiJdfQ==
|