velocious 1.0.701 → 1.0.702
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 +1 -0
- package/build/configuration-types.js +72 -2
- package/build/configuration.js +61 -3
- package/build/frontend-model-resource/base-resource.js +150 -2
- package/build/frontend-models/resource-definition.js +47 -0
- package/build/src/configuration-types.d.ts +166 -5
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +67 -3
- package/build/src/configuration.d.ts +11 -2
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +61 -4
- package/build/src/frontend-model-resource/base-resource.d.ts +76 -3
- package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
- package/build/src/frontend-model-resource/base-resource.js +127 -3
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +43 -1
- package/build/src/sync/local-mutation-log.d.ts +6 -3
- package/build/src/sync/local-mutation-log.d.ts.map +1 -1
- package/build/src/sync/local-mutation-log.js +11 -4
- package/build/src/sync/peer-mutation-bundle.d.ts +26 -0
- package/build/src/sync/peer-mutation-bundle.d.ts.map +1 -1
- package/build/src/sync/peer-mutation-bundle.js +7 -1
- package/build/src/sync/sync-api-client.d.ts +3 -1
- package/build/src/sync/sync-api-client.d.ts.map +1 -1
- package/build/src/sync/sync-api-client.js +46 -8
- package/build/src/sync/sync-client-types.d.ts +24 -12
- package/build/src/sync/sync-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-client-types.js +7 -5
- package/build/src/sync/sync-client.d.ts +101 -0
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +236 -24
- package/build/src/sync/sync-offline-session.d.ts +328 -0
- package/build/src/sync/sync-offline-session.d.ts.map +1 -0
- package/build/src/sync/sync-offline-session.js +617 -0
- package/build/src/sync/sync-resource-base.d.ts +26 -28
- package/build/src/sync/sync-resource-base.d.ts.map +1 -1
- package/build/src/sync/sync-resource-base.js +11 -45
- package/build/sync/local-mutation-log.js +10 -3
- package/build/sync/peer-mutation-bundle.js +6 -0
- package/build/sync/sync-api-client.js +53 -7
- package/build/sync/sync-client-types.js +6 -4
- package/build/sync/sync-client.js +264 -21
- package/build/sync/sync-offline-session.js +713 -0
- package/build/sync/sync-resource-base.js +10 -53
- package/package.json +1 -1
- package/src/configuration-types.js +72 -2
- package/src/configuration.js +61 -3
- package/src/frontend-model-resource/base-resource.js +150 -2
- package/src/frontend-models/resource-definition.js +47 -0
- package/src/sync/local-mutation-log.js +10 -3
- package/src/sync/peer-mutation-bundle.js +6 -0
- package/src/sync/sync-api-client.js +53 -7
- package/src/sync/sync-client-types.js +6 -4
- package/src/sync/sync-client.js +264 -21
- package/src/sync/sync-offline-session.js +713 -0
- package/src/sync/sync-resource-base.js +10 -53
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-definition.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/resource-definition.js"],"names":[],"mappings":"AAUG,YAAkB,yCAAyC,GAC3D;;;;IAAmB,SAAS,EAAjB,MAAM,CACjB;;;;IAA+E,aAAa,EAAjF,OAAO,2BAA2B,EAAE,8BAA8B,CAC7E;;;;IAA6F,qBAAqB,EAAvG,OAAO,2BAA2B,EAAE,4CAA4C,CAC7F;CAAA,CAAA;
|
|
1
|
+
{"version":3,"file":"resource-definition.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/resource-definition.js"],"names":[],"mappings":"AAUG,YAAkB,yCAAyC,GAC3D;;;;IAAmB,SAAS,EAAjB,MAAM,CACjB;;;;IAA+E,aAAa,EAAjF,OAAO,2BAA2B,EAAE,8BAA8B,CAC7E;;;;IAA6F,qBAAqB,EAAvG,OAAO,2BAA2B,EAAE,4CAA4C,CAC7F;CAAA,CAAA;AAyBD;;;;GAIG;AACH,wBAAgB,uCAAuC,CAAC,cAAc,EAH3D,OAAO,2BAA2B,EAAE,2BAGuB,GAFzD,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,8BAA8B,CAAC,CAc9F;AAED;;;;GAIG;AACH,wBAAgB,sCAAsC,CAAC,KAAK,EAHjD,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAGqB,GAF/C,KAAK,IAAI,OAAO,2BAA2B,EAAE,8BAA8B,CAIvF;AAED;;;;GAIG;AACH,wBAAgB,wCAAwC,CAAC,kBAAkB,EAHhE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAGoC,GAF9D,OAAO,2BAA2B,EAAE,8BAA8B,GAAG,IAAI,CAIrF;AAED;;;;GAIG;AACH,wBAAgB,gDAAgD,CAAC,kBAAkB,EAHxE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAG4C,GAFtE,OAAO,2BAA2B,EAAE,4CAA4C,GAAG,IAAI,CAQnG;AAoLD;;;;GAIG;AACH,wBAAgB,2CAA2C,CAAC,eAAe,EAHhE,OAAO,2BAA2B,EAAE,2BAA2B,EAGC,GAF9D,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,gDAAgD,CAAC,CAuBhH;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,eAAe,EAH7C,OAAO,2BAA2B,EAAE,2BAA2B,EAGlB,GAF3C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmFnC;AA8bD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAJxC,MAIwC,EAAE,kBAAkB,EAH5D,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAGgC,GAF1D,MAAM,CAUlB;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,EAAC,WAAW,EAAE,SAAS,EAAE,kBAAkB,EAAC,EALvF;IAAqB,WAAW,EAAxB,MAAM,CACd;IAAqB,SAAS,EAAtB,MAAM,CACd;IAA4C,kBAAkB,EAAtD,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;CAEuF,GAF7E,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,IAAI,CA2BrG;AAED;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,EAAC,eAAe,EAAE,WAAW,EAAC,EAJ7E;IAAgF,eAAe,EAAvF,OAAO,2BAA2B,EAAE,2BAA2B,EAAE,CACzE;IAAqB,WAAW,EAAxB,MAAM,CACd;CAE6E,GAFnE;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,GAAG,QAAQ,CAAA;CAAC,GAAG,IAAI,CA8DxJ;AAiBD;;;;;;;;;;GAUG;AACH,wBAAgB,iCAAiC,CAAC,EAAC,aAAa,EAAE,YAAY,EAAC,EAJ5E;IAA4G,aAAa,EAAjH;QAAC,kBAAkB,EAAE,MAAM,OAAO,2BAA2B,EAAE,2BAA2B,EAAE,CAAA;KAAC,CACrG;IAAqB,YAAY,EAAzB,MAAM,CACd;CAE4E,GAFlE,yCAAyC,GAAG,IAAI,CA0B5D"}
|
|
@@ -25,6 +25,7 @@ const RESOURCE_STATIC_CONFIG_KEYS = new Set([
|
|
|
25
25
|
"ModelClass",
|
|
26
26
|
"primaryKey",
|
|
27
27
|
"quickSearchColumns",
|
|
28
|
+
"quickSearchNumericColumns",
|
|
28
29
|
"relationships",
|
|
29
30
|
"ReplayServiceClass",
|
|
30
31
|
"server",
|
|
@@ -145,6 +146,8 @@ function normalizeFrontendModelResourceConfiguration(resourceConfiguration) {
|
|
|
145
146
|
"memberCommands",
|
|
146
147
|
"modelName",
|
|
147
148
|
"primaryKey",
|
|
149
|
+
"quickSearchColumns",
|
|
150
|
+
"quickSearchNumericColumns",
|
|
148
151
|
"relationships",
|
|
149
152
|
"server",
|
|
150
153
|
"sync"
|
|
@@ -155,6 +158,8 @@ function normalizeFrontendModelResourceConfiguration(resourceConfiguration) {
|
|
|
155
158
|
validateFrontendModelResourcePrimaryKey(resourceConfiguration.primaryKey);
|
|
156
159
|
const normalizedCommands = normalizeFrontendModelResourceCommands(resourceConfiguration);
|
|
157
160
|
const sync = normalizeFrontendModelResourceSync(resourceConfiguration);
|
|
161
|
+
const quickSearchColumns = normalizeFrontendModelQuickSearchColumns(resourceConfiguration.quickSearchColumns, "quickSearchColumns");
|
|
162
|
+
const quickSearchNumericColumns = normalizeFrontendModelQuickSearchColumns(resourceConfiguration.quickSearchNumericColumns, "quickSearchNumericColumns");
|
|
158
163
|
return {
|
|
159
164
|
...resourceConfiguration,
|
|
160
165
|
abilities: normalizeFrontendModelResourceAbilities(resourceConfiguration.abilities),
|
|
@@ -166,6 +171,8 @@ function normalizeFrontendModelResourceConfiguration(resourceConfiguration) {
|
|
|
166
171
|
// generator uses it to type each custom command method.
|
|
167
172
|
commandMetadata: normalizedCommands.commandMetadata,
|
|
168
173
|
memberCommands: normalizedCommands.memberCommands,
|
|
174
|
+
quickSearchColumns,
|
|
175
|
+
quickSearchNumericColumns,
|
|
169
176
|
sync
|
|
170
177
|
};
|
|
171
178
|
}
|
|
@@ -456,6 +463,41 @@ function normalizeSyncOperations(operations) {
|
|
|
456
463
|
});
|
|
457
464
|
return [...new Set(normalized)].sort();
|
|
458
465
|
}
|
|
466
|
+
/**
|
|
467
|
+
* Normalizes declarative quick-search column entries into a stable list.
|
|
468
|
+
* Each entry is a plain column-name string or a `{path, column}` object whose
|
|
469
|
+
* path is a relationship path from the root model.
|
|
470
|
+
* @param {unknown} columns - Raw quick-search column declarations.
|
|
471
|
+
* @param {string} label - Config key label for error messages.
|
|
472
|
+
* @returns {Array<import("../configuration-types.js").FrontendModelQuickSearchColumn> | null} - Normalized columns, or null when undeclared.
|
|
473
|
+
*/
|
|
474
|
+
function normalizeFrontendModelQuickSearchColumns(columns, label) {
|
|
475
|
+
if (columns === undefined || columns === null)
|
|
476
|
+
return null;
|
|
477
|
+
if (!Array.isArray(columns))
|
|
478
|
+
throw new Error(`Resource ${label} must be an array of column names or {path, column} objects.`);
|
|
479
|
+
return columns.map((entry) => {
|
|
480
|
+
if (typeof entry === "string") {
|
|
481
|
+
if (entry.length < 1)
|
|
482
|
+
throw new Error(`Resource ${label} entries must be non-empty column names.`);
|
|
483
|
+
return { column: entry };
|
|
484
|
+
}
|
|
485
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
486
|
+
throw new Error(`Resource ${label} entries must be column names or {path, column} objects, got: ${JSON.stringify(entry)}`);
|
|
487
|
+
}
|
|
488
|
+
const entryRecord = /** @type {Record<string, unknown>} */ (entry);
|
|
489
|
+
const column = entryRecord.column;
|
|
490
|
+
const path = entryRecord.path;
|
|
491
|
+
if (typeof column !== "string" || column.length < 1)
|
|
492
|
+
throw new Error(`Resource ${label} entries require a non-empty column name.`);
|
|
493
|
+
if (path === undefined || path === null)
|
|
494
|
+
return { column };
|
|
495
|
+
if (!Array.isArray(path) || path.some((pathSegment) => typeof pathSegment !== "string" || pathSegment.length < 1)) {
|
|
496
|
+
throw new Error(`Resource ${label} entry paths must be arrays of non-empty relationship names.`);
|
|
497
|
+
}
|
|
498
|
+
return { column, path: [...path] };
|
|
499
|
+
});
|
|
500
|
+
}
|
|
459
501
|
/**
|
|
460
502
|
* Builds a deterministic policy hash.
|
|
461
503
|
* @param {unknown} value - Hash input.
|
|
@@ -826,4 +868,4 @@ export function resolveFrontendModelResourceClass({ configuration, resourceType
|
|
|
826
868
|
}
|
|
827
869
|
return null;
|
|
828
870
|
}
|
|
829
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyx5QkFBeUIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNuRixPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM5QyxPQUFPLEVBQUMsd0NBQXdDLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV4Rjs7Ozs7O0dBTUc7QUFDSCxNQUFNLG1DQUFtQyxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDbkYsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMxQyxXQUFXO0lBQ1gsYUFBYTtJQUNiLFlBQVk7SUFDWiwyQkFBMkI7SUFDM0IsdUJBQXVCO0lBQ3ZCLG9CQUFvQjtJQUNwQixVQUFVO0lBQ1YsZ0JBQWdCO0lBQ2hCLFdBQVc7SUFDWCxZQUFZO0lBQ1osWUFBWTtJQUNaLG9CQUFvQjtJQUNwQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLFFBQVE7SUFDUixnQkFBZ0I7SUFDaEIsTUFBTTtJQUNOLHNCQUFzQjtJQUN0QixvQkFBb0I7Q0FDckIsQ0FBQyxDQUFBO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx1Q0FBdUMsQ0FBQyxjQUFjO0lBQ3BFLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQUE7SUFFL0MsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNoRCxNQUFNLElBQUksS0FBSyxD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QXVFO1lBQ3ZFLElBQUksbUJBQW1CLEtBQUssWUFBWSxJQUFJLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsQ0FBQztnQkFBRSxTQUFRO1lBRTNHLE1BQU0scUJBQXFCLEdBQUcsZ0RBQWdELENBQUMsa0JBQWtCLENBQUMsQ0FBQTtZQUVsRyxJQUFJLENBQUMscUJBQXFCO2dCQUFFLFNBQVE7WUFDcEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsSUFBSSxtQkFBbUIsQ0FBQyxLQUFLLFlBQVk7Z0JBQUUsU0FBUTtZQUV2RixPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUMsQ0FBQTtRQUN4RSxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuaW1wb3J0IHNoYTI1NkhleCBmcm9tIFwiLi4vdXRpbHMvc2hhMjU2LWhleC5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZE5hbWV9IGZyb20gXCIuL3Jlc291cmNlLWNvbmZpZy12YWxpZGF0aW9uLmpzXCJcblxuLyoqXG4gKiBSZXNvbHZlZCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZSByZWdpc3RyYXRpb24gZm9yIGEgcmVwbGF5IHJlc291cmNlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUmVzb2x2ZWRSZXNvdXJjZVJlZ2lzdHJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsTmFtZSAtIEVmZmVjdGl2ZSBmcm9udGVuZCBtb2RlbCBuYW1lIChtb2RlbE5hbWUgb3ZlcnJpZGUgb3IgcmVnaXN0cnkga2V5KS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IHJlc291cmNlQ2xhc3MgLSBSZWdpc3RlcmVkIHJlc291cmNlIGNsYXNzLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSByZXNvdXJjZUNvbmZpZ3VyYXRpb24gLSBOb3JtYWxpemVkIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmNvbnN0IEJBU0VfRlJPTlRFTkRfTU9ERUxfQUJJTElUWV9BQ1RJT05TID0gW1wiY3JlYXRlXCIsIFwiZGVzdHJveVwiLCBcInJlYWRcIiwgXCJ1cGRhdGVcIl1cbmNvbnN0IFJFU09VUkNFX1NUQVRJQ19DT05GSUdfS0VZUyA9IG5ldyBTZXQoW1xuICBcImFiaWxpdGllc1wiLFxuICBcImF0dGFjaG1lbnRzXCIsXG4gIFwiYXR0cmlidXRlc1wiLFxuICBcImJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcIixcbiAgXCJidWlsdEluTWVtYmVyQ29tbWFuZHNcIixcbiAgXCJjb2xsZWN0aW9uQ29tbWFuZHNcIixcbiAgXCJjb21tYW5kc1wiLFxuICBcIm1lbWJlckNvbW1hbmRzXCIsXG4gIFwibW9kZWxOYW1lXCIsXG4gIFwiTW9kZWxDbGFzc1wiLFxuICBcInByaW1hcnlLZXlcIixcbiAgXCJxdWlja1NlYXJjaENvbHVtbnNcIixcbiAgXCJyZWxhdGlvbnNoaXBzXCIsXG4gIFwiUmVwbGF5U2VydmljZUNsYXNzXCIsXG4gIFwic2VydmVyXCIsXG4gIFwiU2hhcmVkUmVzb3VyY2VcIixcbiAgXCJzeW5jXCIsXG4gIFwidHJhbnNsYXRlZEF0dHJpYnV0ZXNcIixcbiAgXCJ3cml0YWJsZUF0dHJpYnV0ZXNcIlxuXSlcblxuLyoqXG4gKiBSdW5zIHRoZSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QgaGVscGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbn0gYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlnLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlPn0gLSBSZXNvdXJjZSBkZWZpbml0aW9ucyBrZXllZCBieSBtb2RlbCBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KSB7XG4gIGNvbnN0IHJlc291cmNlcyA9IGJhY2tlbmRQcm9qZWN0LmZyb250ZW5kTW9kZWxzXG5cbiAgaWYgKHJlc291cmNlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZXNvdXJjZXMgfHwgdHlwZW9mIHJlc291cmNlcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBiYWNrZW5kIHByb2plY3QgZnJvbnRlbmRNb2RlbHMgb2JqZWN0IGJ1dCBnb3Q6ICR7cmVzb3VyY2VzfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc291cmNlc1xuICB9XG5cbiAgcmV0dXJuIHt9XG59XG5cbi8qKlxuICogUnVucyB0aGUgZnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvbklzQ2xhc3MgaGVscGVyLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBDYW5kaWRhdGUgcmVzb3VyY2UgZGVmaW5pdGlvbi5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZX0gLSBXaGV0aGVyIHZhbHVlIGlzIGEgcmVzb3VyY2UgY2xhc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uSXNDbGFzcyh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgJiYgKHZhbHVlID09PSBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIHx8IHZhbHVlLnByb3RvdHlwZSBpbnN0YW5jZW9mIEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UpXG59XG5cbi8qKlxuICogUnVucyB0aGUgZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbiBoZWxwZXIuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByZXNvdXJjZURlZmluaXRpb24gLSBSZXNvdXJjZSBkZWZpbml0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgbnVsbH0gLSBSZXNvdXJjZSBjbGFzcyB3aGVuIGRlZmluaXRpb24gaXMgY2xhc3MtYmFzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc0Zyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbikge1xuICByZXR1cm4gZnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvbklzQ2xhc3MocmVzb3VyY2VEZWZpbml0aW9uKSA/IHJlc291cmNlRGVmaW5pdGlvbiA6IG51bGxcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24gaGVscGVyLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVzb3VyY2VEZWZpbml0aW9uIC0gUmVzb3VyY2UgZGVmaW5pdGlvbi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uIHwgbnVsbH0gLSBOb3JtYWxpemVkIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKSB7XG4gIGlmICghZnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvbklzQ2xhc3MocmVzb3VyY2VEZWZpbml0aW9uKSkgcmV0dXJuIG51bGxcblxuICBhc3NlcnRSZXNvdXJjZUNvbmZpZ0lzRnJhbWV3b3JrRGVmaW5lZChyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24ocmVzb3VyY2VEZWZpbml0aW9uLnJlc291cmNlQ29uZmlnKCkpXG59XG5cbi8qKlxuICogRW5zdXJlcyByZXNvdXJjZXMgdXNlIGRlY2xhcmF0aXZlIHN0YXRpYyBjb25maWcgcHJvcGVydGllcyBpbnN0ZWFkIG9mIG92ZXJyaWRpbmcgcmVzb3VyY2VDb25maWcoKS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IFJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAqIEBwYXJhbSB7U2V0PGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlPn0gW3Zpc2l0ZWRdIC0gQWxyZWFkeSBpbnNwZWN0ZWQgc2hhcmVkIHJlc291cmNlcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnRSZXNvdXJjZUNvbmZpZ0lzRnJhbWV3b3JrRGVmaW5lZChSZXNvdXJjZUNsYXNzLCB2aXNpdGVkID0gbmV3IFNldCgpKSB7XG4gIGlmICh2aXNpdGVkLmhhcyhSZXNvdXJjZUNsYXNzKSkgcmV0dXJuXG5cbiAgdmlzaXRlZC5hZGQoUmVzb3VyY2VDbGFzcylcbiAgYXNzZXJ0S25vd25SZXNvdXJjZVN0YXRpY0NvbmZpZ1Byb3BlcnRpZXMoUmVzb3VyY2VDbGFzcylcblxuICBjb25zdCBvd25lciA9IHN0YXRpY01ldGhvZE93bmVyRm9yKFJlc291cmNlQ2xhc3MsIFwicmVzb3VyY2VDb25maWdcIilcblxuICBpZiAob3duZXIgJiYgb3duZXIgIT09IEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7UmVzb3VyY2VDbGFzcy5uYW1lfSBvdmVycmlkZXMgc3RhdGljIHJlc291cmNlQ29uZmlnKCksIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBzdGF0aWMgcmVzb3VyY2UgcHJvcGVydGllcyBpbnN0ZWFkLmApXG4gIH1cblxuICBjb25zdCBTaGFyZWRSZXNvdXJjZSA9IFJlc291cmNlQ2xhc3Muc2hhcmVkUmVzb3VyY2VDbGFzcygpXG5cbiAgaWYgKFNoYXJlZFJlc291cmNlKSBhc3NlcnRSZXNvdXJjZUNvbmZpZ0lzRnJhbWV3b3JrRGVmaW5lZChTaGFyZWRSZXNvdXJjZSwgdmlzaXRlZClcbn1cblxuLyoqXG4gKiBFbnN1cmVzIGRlY2xhcmF0aXZlIHN0YXRpYyByZXNvdXJjZSBjb25maWcgZG9lcyBub3Qgc2lsZW50bHkgaWdub3JlIHR5cG9zIG9yIHJlbW92ZWQga2V5cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IFJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnRLbm93blJlc291cmNlU3RhdGljQ29uZmlnUHJvcGVydGllcyhSZXNvdXJjZUNsYXNzKSB7XG4gIGxldCBjdXJyZW50Q2xhc3MgPSBSZXNvdXJjZUNsYXNzXG5cbiAgd2hpbGUgKGN1cnJlbnRDbGFzcyAmJiBjdXJyZW50Q2xhc3MgIT09IEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UgJiYgY3VycmVudENsYXNzICE9PSBGdW5jdGlvbi5wcm90b3R5cGUpIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgICBjb25zdCB1bmtub3duU3RhdGljQ29uZmlnID0ge31cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGN1cnJlbnRDbGFzcykpIHtcbiAgICAgIGlmICghUkVTT1VSQ0VfU1RBVElDX0NPTkZJR19LRVlTLmhhcyhrZXkpKSB1bmtub3duU3RhdGljQ29uZmlnW2tleV0gPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGN1cnJlbnRDbGFzcykpW2tleV1cbiAgICB9XG5cbiAgICByZXN0QXJnc0Vycm9yKHVua25vd25TdGF0aWNDb25maWcpXG5cbiAgICBjdXJyZW50Q2xhc3MgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudENsYXNzKVxuICB9XG59XG5cbi8qKlxuICogTG9jYXRlcyB3aGljaCBjb25zdHJ1Y3RvciBvd25zIGEgc3RhdGljIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IFJlc291cmNlQ2xhc3MgLSBSZXNvdXJjZSBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIC0gTWV0aG9kIG5hbWUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgfCB0eXBlb2YgRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSB8IG51bGx9IC0gQ2xhc3MgdGhhdCBvd25zIHRoZSBzdGF0aWMgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBzdGF0aWNNZXRob2RPd25lckZvcihSZXNvdXJjZUNsYXNzLCBtZXRob2ROYW1lKSB7XG4gIGxldCBjdXJyZW50Q2xhc3MgPSBSZXNvdXJjZUNsYXNzXG5cbiAgd2hpbGUgKGN1cnJlbnRDbGFzcyAmJiBjdXJyZW50Q2xhc3MgIT09IEZ1bmN0aW9uLnByb3RvdHlwZSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudENsYXNzLCBtZXRob2ROYW1lKSkgcmV0dXJuIGN1cnJlbnRDbGFzc1xuXG4gICAgY3VycmVudENsYXNzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnRDbGFzcylcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSByZXNvdXJjZUNvbmZpZ3VyYXRpb24gLSBSYXcgcmVzb3VyY2UgY29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSAtIE5vcm1hbGl6ZWQgcmVzb3VyY2UgY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbihyZXNvdXJjZUNvbmZpZ3VyYXRpb24pIHtcbiAgY29uc3QgcmVzdEFyZ3MgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHsuLi5yZXNvdXJjZUNvbmZpZ3VyYXRpb259KVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIFtcbiAgICBcImFiaWxpdGllc1wiLFxuICAgIFwiYXR0cmlidXRlc1wiLFxuICAgIFwiYXR0YWNobWVudHNcIixcbiAgICBcImJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcIixcbiAgICBcImJ1aWx0SW5NZW1iZXJDb21tYW5kc1wiLFxuICAgIFwiY29sbGVjdGlvbkNvbW1hbmRzXCIsXG4gICAgXCJjb21tYW5kc1wiLFxuICAgIFwibWVtYmVyQ29tbWFuZHNcIixcbiAgICBcIm1vZGVsTmFtZVwiLFxuICAgIFwicHJpbWFyeUtleVwiLFxuICAgIFwicmVsYXRpb25zaGlwc1wiLFxuICAgIFwic2VydmVyXCIsXG4gICAgXCJzeW5jXCJcbiAgXSkge1xuICAgIGRlbGV0ZSByZXN0QXJnc1trZXldXG4gIH1cblxuICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuICB2YWxpZGF0ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVByaW1hcnlLZXkocmVzb3VyY2VDb25maWd1cmF0aW9uLnByaW1hcnlLZXkpXG5cbiAgY29uc3Qgbm9ybWFsaXplZENvbW1hbmRzID0gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZHMocmVzb3VyY2VDb25maWd1cmF0aW9uKVxuICBjb25zdCBzeW5jID0gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFJlc291cmNlU3luYyhyZXNvdXJjZUNvbmZpZ3VyYXRpb24pXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNvdXJjZUNvbmZpZ3VyYXRpb24sXG4gICAgYWJpbGl0aWVzOiBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VBYmlsaXRpZXMocmVzb3VyY2VDb25maWd1cmF0aW9uLmFiaWxpdGllcyksXG4gICAgYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kczogbm9ybWFsaXplZENvbW1hbmRzLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMsXG4gICAgYnVpbHRJbk1lbWJlckNvbW1hbmRzOiBub3JtYWxpemVkQ29tbWFuZHMuYnVpbHRJbk1lbWJlckNvbW1hbmRzLFxuICAgIGNvbGxlY3Rpb25Db21tYW5kczogbm9ybWFsaXplZENvbW1hbmRzLmNvbGxlY3Rpb25Db21tYW5kcyxcbiAgICAvLyBQZXItY29tbWFuZCBtZXRhZGF0YSAodHlwZWQgYXJncyArIGRlY2xhcmVkIHJldHVybiB0eXBlKSBrZXllZCBieSBtZXRob2RcbiAgICAvLyBuYW1lLCBkZXJpdmVkIGZyb20gYHtuYW1lLCBhcmdzPywgcmV0dXJuVHlwZT99YCBjb21tYW5kIGVudHJpZXMuIFRoZVxuICAgIC8vIGdlbmVyYXRvciB1c2VzIGl0IHRvIHR5cGUgZWFjaCBjdXN0b20gY29tbWFuZCBtZXRob2QuXG4gICAgY29tbWFuZE1ldGFkYXRhOiBub3JtYWxpemVkQ29tbWFuZHMuY29tbWFuZE1ldGFkYXRhLFxuICAgIG1lbWJlckNvbW1hbmRzOiBub3JtYWxpemVkQ29tbWFuZHMubWVtYmVyQ29tbWFuZHMsXG4gICAgc3luY1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgcmVzb3VyY2UgcHJpbWFyeS1rZXkgZGVmaW5pdGlvbiBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgQ1JVRCBjb25kaXRpb25zLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi91dGlscy9tb2RlbC1wcmltYXJ5LWtleS5qc1wiKS5Nb2RlbFByaW1hcnlLZXlEZWZpbml0aW9uIHwgdW5kZWZpbmVkfSBwcmltYXJ5S2V5IC0gUmVzb3VyY2UgcHJpbWFyeSBrZXkuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGcm9udGVuZE1vZGVsUmVzb3VyY2VQcmltYXJ5S2V5KHByaW1hcnlLZXkpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHByaW1hcnlLZXkpKSByZXR1cm5cblxuICBpZiAocHJpbWFyeUtleS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvdXJjZSBwcmltYXJ5S2V5IGFycmF5cyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGF0dHJpYnV0ZS5cIilcbiAgfVxuXG4gIGlmIChuZXcgU2V0KHByaW1hcnlLZXkpLnNpemUgIT09IHByaW1hcnlLZXkubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb3VyY2UgcHJpbWFyeUtleSBhcnJheXMgbXVzdCBjb250YWluIHVuaXF1ZSBhdHRyaWJ1dGVzLlwiKVxuICB9XG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgYWJpbGl0aWVzLlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHVuZGVmaW5lZH0gYWJpbGl0aWVzIC0gUmVzb3VyY2UgYWJpbGl0aWVzIGNvbmZpZyAoY2FtZWxDYXNlIGFjdGlvbiBsaXN0KS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAtIE5vcm1hbGl6ZWQgYWJpbGl0aWVzIGNvbmZpZy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFJlc291cmNlQWJpbGl0aWVzKGFiaWxpdGllcykge1xuICBjb25zdCBub3JtYWxpemVkID0gZGVmYXVsdENydWRBYmlsaXRpZXMoKVxuXG4gIGlmIChhYmlsaXRpZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5vcm1hbGl6ZWRcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoYWJpbGl0aWVzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJlc291cmNlIGFiaWxpdGllcyBtdXN0IGJlIGFuIGFycmF5IG9mIGFjdGlvbiBuYW1lcy4gT2JqZWN0IGZvcm0gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5cIilcbiAgfVxuXG4gIGNvbnN0IGR1cGxpY2F0ZWRCYXNlQWJpbGl0aWVzID0gYWJpbGl0aWVzLmZpbHRlcigoYWJpbGl0eSkgPT4gQkFTRV9GUk9OVEVORF9NT0RFTF9BQklMSVRZX0FDVElPTlMuaW5jbHVkZXMoYWJpbGl0eSkpXG5cbiAgaWYgKGR1cGxpY2F0ZWRCYXNlQWJpbGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlc291cmNlIGFiaWxpdGllcyBtdXN0IG5vdCBpbmNsdWRlIGJhc2UgYWN0aW9uczogJHtkdXBsaWNhdGVkQmFzZUFiaWxpdGllcy5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIGZvciAoY29uc3QgYWJpbGl0eSBvZiBhYmlsaXRpZXMpIHtcbiAgICBpZiAodHlwZW9mIGFiaWxpdHkgIT09IFwic3RyaW5nXCIgfHwgYWJpbGl0eS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvdXJjZSBhYmlsaXRpZXMgZW50cmllcyBtdXN0IGJlIG5vbi1lbXB0eSBzdHJpbmdzLlwiKVxuICAgIH1cblxuICAgIG5vcm1hbGl6ZWRbYWJpbGl0eV0gPSBhYmlsaXR5XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG4vKipcbiAqIFJ1bnMgZGVmYXVsdCBjcnVkIGFiaWxpdGllcy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAtIERlZmF1bHQgQ1JVRCBhYmlsaXR5IG1hcC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdENydWRBYmlsaXRpZXMoKSB7XG4gIHJldHVybiB7XG4gICAgY3JlYXRlOiBcImNyZWF0ZVwiLFxuICAgIGRlc3Ryb3k6IFwiZGVzdHJveVwiLFxuICAgIGZpbmQ6IFwicmVhZFwiLFxuICAgIGluZGV4OiBcInJlYWRcIixcbiAgICB1cGRhdGU6IFwidXBkYXRlXCJcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGZyb250ZW5kLXNhZmUgc3luYyBtYW5pZmVzdCBmb3IgYWxsIHN5bmMtZW5hYmxlZCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uW119IGJhY2tlbmRQcm9qZWN0cyAtIEJhY2tlbmQgcHJvamVjdHMgdG8gc2Nhbi5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jQ29uZmlndXJhdGlvbj59IC0gU3luYyBtZXRhZGF0YSBrZXllZCBieSBtb2RlbCBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFN5bmNNYW5pZmVzdEZvckJhY2tlbmRQcm9qZWN0cyhiYWNrZW5kUHJvamVjdHMpIHtcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jQ29uZmlndXJhdGlvbj59ICovXG4gIGNvbnN0IG1hbmlmZXN0ID0ge31cblxuICBmb3IgKGNvbnN0IGJhY2tlbmRQcm9qZWN0IG9mIGJhY2tlbmRQcm9qZWN0cykge1xuICAgIGNvbnN0IHJlc291cmNlcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcblxuICAgIGZvciAoY29uc3QgY29uZmlndXJlZE1vZGVsTmFtZSBvZiBPYmplY3Qua2V5cyhyZXNvdXJjZXMpLnNvcnQoKSkge1xuICAgICAgY29uc3QgcmVzb3VyY2VEZWZpbml0aW9uID0gcmVzb3VyY2VzW2NvbmZpZ3VyZWRNb2RlbE5hbWVdXG4gICAgICBjb25zdCByZXNvdXJjZUNvbmZpZ3VyYXRpb24gPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKVxuXG4gICAgICBpZiAoIXJlc291cmNlQ29uZmlndXJhdGlvbikgY29udGludWVcbiAgICAgIGlmICghcmVzb3VyY2VDb25maWd1cmF0aW9uLnN5bmM/LmVuYWJsZWQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5tb2RlbE5hbWUgfHwgY29uZmlndXJlZE1vZGVsTmFtZVxuXG4gICAgICBtYW5pZmVzdFttb2RlbE5hbWVdID0gcmVzb3VyY2VDb25maWd1cmF0aW9uLnN5bmNcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWFuaWZlc3Rcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBmcm9udGVuZC1zYWZlIEFQSSBtYW5pZmVzdCBmb3IgYWxsIHJlZ2lzdGVyZWQgZnJvbnRlbmQtbW9kZWxcbiAqIHJlc291cmNlcy4gVGhlIG1hbmlmZXN0IGlzIGRldGVybWluaXN0aWMgKHNvcnRlZCBtb2RlbCBuYW1lcywgc29ydGVkXG4gKiBhdHRyaWJ1dGVzLCBzb3J0ZWQgY29tbWFuZHMpIGFuZCBpbmNsdWRlcyBvbmx5IHB1YmxpYy1zYWZlIG1ldGFkYXRhOiBub1xuICogc2VjcmV0cywgbm8gc2VydmVyIGNhbGxiYWNrcywgbm8gYmFja2VuZCBmaWxlIHBhdGhzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbltdfSBiYWNrZW5kUHJvamVjdHMgLSBCYWNrZW5kIHByb2plY3RzIHRvIHNjYW4uXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IC0gRnJvbnRlbmQtc2FmZSBBUEkgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9udGVuZE1vZGVsQXBpTWFuaWZlc3QoYmFja2VuZFByb2plY3RzKSB7XG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovXG4gIGNvbnN0IHJlc291cmNlcyA9IHt9XG5cbiAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBiYWNrZW5kUHJvamVjdHMpIHtcbiAgICBjb25zdCBwcm9qZWN0UmVzb3VyY2VzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuXG4gICAgZm9yIChjb25zdCBjb25maWd1cmVkTW9kZWxOYW1lIG9mIE9iamVjdC5rZXlzKHByb2plY3RSZXNvdXJjZXMpLnNvcnQoKSkge1xuICAgICAgY29uc3QgcmVzb3VyY2VEZWZpbml0aW9uID0gcHJvamVjdFJlc291cmNlc1tjb25maWd1cmVkTW9kZWxOYW1lXVxuICAgICAgY29uc3QgcmVzb3VyY2VDb25maWd1cmF0aW9uID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcbiAgICAgIGNvbnN0IHJlc291cmNlQ2xhc3MgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc0Zyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcblxuICAgICAgaWYgKCFyZXNvdXJjZUNvbmZpZ3VyYXRpb24gfHwgIXJlc291cmNlQ2xhc3MpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5tb2RlbE5hbWUgfHwgY29uZmlndXJlZE1vZGVsTmFtZVxuICAgICAgY29uc3QgcmVzb3VyY2VQYXRoID0gYC8ke2luZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24ucGx1cmFsaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShjb25maWd1cmVkTW9kZWxOYW1lKSkpfWBcblxuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi9cbiAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIHBhdGg6IHJlc291cmNlUGF0aCxcbiAgICAgICAgcHJpbWFyeUtleTogcmVzb3VyY2VDbGFzcy5yZXNvbHZlZFByaW1hcnlLZXkocmVzb3VyY2VDb25maWd1cmF0aW9uKSxcbiAgICAgICAgYXR0cmlidXRlczogbWFuaWZlc3RBdHRyaWJ1dGVzKHJlc291cmNlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVzKSxcbiAgICAgICAgYWJpbGl0aWVzOiByZXNvdXJjZUNvbmZpZ3VyYXRpb24uYWJpbGl0aWVzLFxuICAgICAgICBidWlsdEluQ29tbWFuZHM6IHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiByZXNvdXJjZUNvbmZpZ3VyYXRpb24uYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcyxcbiAgICAgICAgICBtZW1iZXI6IHJlc291cmNlQ29uZmlndXJhdGlvbi5idWlsdEluTWVtYmVyQ29tbWFuZHNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gcmVzb3VyY2VDb25maWd1cmF0aW9uLnJlbGF0aW9uc2hpcHNcbiAgICAgIGlmIChyZWxhdGlvbnNoaXBzICYmIHJlbGF0aW9uc2hpcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqL1xuICAgICAgICBjb25zdCByZWxzID0ge31cbiAgICAgICAgZm9yIChjb25zdCByZWxOYW1lIG9mIHJlbGF0aW9uc2hpcHMpIHtcbiAgICAgICAgICByZWxzW3JlbE5hbWVdID0ge31cbiAgICAgICAgfVxuICAgICAgICBlbnRyeS5yZWxhdGlvbnNoaXBzID0gcmVsc1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdHRhY2htZW50cyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5hdHRhY2htZW50c1xuICAgICAgaWYgKGF0dGFjaG1lbnRzICYmIE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudHJ5LmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29sbGVjdGlvbkNvbW1hbmRzID0gbWFuaWZlc3RDb21tYW5kRW50cmllcyh7XG4gICAgICAgIGNvbW1hbmRNZXRhZGF0YTogcmVzb3VyY2VDb25maWd1cmF0aW9uLmNvbW1hbmRNZXRhZGF0YSB8fCB7fSxcbiAgICAgICAgY29tbWFuZHM6IHJlc291cmNlQ29uZmlndXJhdGlvbi5jb2xsZWN0aW9uQ29tbWFuZHMsXG4gICAgICAgIHJlc291cmNlUGF0aCxcbiAgICAgICAgc2NvcGU6IFwiY29sbGVjdGlvblwiXG4gICAgICB9KVxuICAgICAgY29uc3QgbWVtYmVyQ29tbWFuZHMgPSBtYW5pZmVzdENvbW1hbmRFbnRyaWVzKHtcbiAgICAgICAgY29tbWFuZE1ldGFkYXRhOiByZXNvdXJjZUNvbmZpZ3VyYXRpb24uY29tbWFuZE1ldGFkYXRhIHx8IHt9LFxuICAgICAgICBjb21tYW5kczogcmVzb3VyY2VDb25maWd1cmF0aW9uLm1lbWJlckNvbW1hbmRzLFxuICAgICAgICByZXNvdXJjZVBhdGgsXG4gICAgICAgIHNjb3BlOiBcIm1lbWJlclwiXG4gICAgICB9KVxuXG4gICAgICBpZiAoY29sbGVjdGlvbkNvbW1hbmRzLmxlbmd0aCA+IDAgfHwgbWVtYmVyQ29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqL1xuICAgICAgICBjb25zdCBjbWRzID0ge31cbiAgICAgICAgaWYgKGNvbGxlY3Rpb25Db21tYW5kcy5sZW5ndGggPiAwKSBjbWRzW1wiY29sbGVjdGlvblwiXSA9IGNvbGxlY3Rpb25Db21tYW5kc1xuICAgICAgICBpZiAobWVtYmVyQ29tbWFuZHMubGVuZ3RoID4gMCkgY21kc1tcIm1lbWJlclwiXSA9IG1lbWJlckNvbW1hbmRzXG4gICAgICAgIGVudHJ5LmNvbW1hbmRzID0gY21kc1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzb3VyY2VDb25maWd1cmF0aW9uLnN5bmM/LmVuYWJsZWQpIHtcbiAgICAgICAgZW50cnkuc3luYyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5zeW5jXG4gICAgICB9XG5cbiAgICAgIHJlc291cmNlc1tjb25maWd1cmVkTW9kZWxOYW1lXSA9IGVudHJ5XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXRWZXJzaW9uOiAxLFxuICAgIHJlc291cmNlczogT2JqZWN0LmtleXMocmVzb3VyY2VzKS5zb3J0KCkucmVkdWNlKChzb3J0ZWQsIGtleSkgPT4ge1xuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHNvcnRlZClba2V5XSA9IHJlc291cmNlc1trZXldXG4gICAgICByZXR1cm4gc29ydGVkXG4gICAgfSwgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHt9KSlcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgcmVzb3VyY2UgYXR0cmlidXRlIGRlZmluaXRpb25zIGludG8gYSBzb3J0ZWQgYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGF0dHJpYnV0ZXMgLSBSYXcgYXR0cmlidXRlcyBjb25maWcgKGFycmF5IG9yIG9iamVjdCkuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gU29ydGVkIGF0dHJpYnV0ZSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbWFuaWZlc3RBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpIHtcbiAgaWYgKCFhdHRyaWJ1dGVzKSByZXR1cm4gW11cblxuICBsZXQgbmFtZXNcblxuICBpZiAoQXJyYXkuaXNBcnJheShhdHRyaWJ1dGVzKSkge1xuICAgIG5hbWVzID0gYXR0cmlidXRlcy5tYXAoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgPyBlbnRyeSA6IGVudHJ5Lm5hbWUpLmZpbHRlcihCb29sZWFuKVxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZXMgJiYgdHlwZW9mIGF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIHtcbiAgICBuYW1lcyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gbmFtZXMuc29ydCgpXG59XG5cbi8qKlxuICogQnVpbGRzIG1hbmlmZXN0LXNhZmUgY29tbWFuZCBlbnRyeSBsaXN0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+fSBhcmdzLmNvbW1hbmRNZXRhZGF0YSAtIFBlci1jb21tYW5kIG1ldGFkYXRhLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLmNvbW1hbmRzIC0gTWV0aG9kIG5hbWUg4oaSIGtlYmFiIHNsdWcgbWFwLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVzb3VyY2VQYXRoIC0gUmVzb3VyY2UgcGF0aC5cbiAqIEBwYXJhbSB7XCJjb2xsZWN0aW9uXCIgfCBcIm1lbWJlclwifSBhcmdzLnNjb3BlIC0gQ29tbWFuZCBzY29wZS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdfSAtIE1hbmlmZXN0IGNvbW1hbmQgZW50cmllcy5cbiAqL1xuZnVuY3Rpb24gbWFuaWZlc3RDb21tYW5kRW50cmllcyh7Y29tbWFuZE1ldGFkYXRhLCBjb21tYW5kcywgcmVzb3VyY2VQYXRoLCBzY29wZX0pIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbW1hbmRzKS5zb3J0KCkubWFwKChtZXRob2ROYW1lKSA9PiB7XG4gICAgY29uc3Qgc2x1ZyA9IGNvbW1hbmRzW21ldGhvZE5hbWVdXG4gICAgY29uc3QgbWV0YWRhdGEgPSBjb21tYW5kTWV0YWRhdGFbbWV0aG9kTmFtZV0gfHwge2FyZ3M6IFtdLCByZXR1cm5UeXBlOiBudWxsfVxuICAgIGNvbnN0IHBhdGggPSBzY29wZSA9PT0gXCJtZW1iZXJcIlxuICAgICAgPyBgJHtyZXNvdXJjZVBhdGh9LzxpZD4vJHtzbHVnfWBcbiAgICAgIDogYCR7cmVzb3VyY2VQYXRofS8ke3NsdWd9YFxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi9cbiAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgIG1ldGhvZE5hbWUsXG4gICAgICBzY29wZSxcbiAgICAgIHBhdGgsXG4gICAgICBhcmdzOiBtZXRhZGF0YS5hcmdzXG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLnJldHVyblR5cGUpIHtcbiAgICAgIGVudHJ5LnJldHVyblR5cGUgPSBtZXRhZGF0YS5yZXR1cm5UeXBlXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJ5XG4gIH0pXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBzeW5jIHBvbGljeSBtZXRhZGF0YSBhbmQgY29tcHV0ZXMgYSBkZXRlcm1pbmlzdGljIGhhc2ggZnJvbSBzYWZlIHBvbGljeSBpbnB1dHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gcmVzb3VyY2VDb25maWd1cmF0aW9uIC0gUmF3IHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWR9IC0gRnJvbnRlbmQtc2FmZSBzeW5jIG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jKHJlc291cmNlQ29uZmlndXJhdGlvbikge1xuICBjb25zdCBzeW5jID0gcmVzb3VyY2VDb25maWd1cmF0aW9uLnN5bmNcblxuICBpZiAoc3luYyA9PT0gdW5kZWZpbmVkIHx8IHN5bmMgPT09IG51bGwpIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKHN5bmMgPT09IGZhbHNlKSByZXR1cm4ge2NvbmZsaWN0U3RyYXRlZ3k6IFwib3B0aW1pc3RpY1ZlcnNpb25cIiwgZW5hYmxlZDogZmFsc2UsIG9wZXJhdGlvbnM6IFtdLCBwb2xpY3lIYXNoOiBzeW5jUG9saWN5SGFzaCh7Y29uZmxpY3RTdHJhdGVneTogXCJvcHRpbWlzdGljVmVyc2lvblwiLCBlbmFibGVkOiBmYWxzZX0pLCBwb2xpY3lWZXJzaW9uOiBudWxsfVxuICBpZiAoc3luYyA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jKHtcbiAgICAgIC4uLnJlc291cmNlQ29uZmlndXJhdGlvbixcbiAgICAgIHN5bmM6IHtvcGVyYXRpb25zOiBbXCJpbmRleFwiLCBcImZpbmRcIl19XG4gICAgfSlcbiAgfVxuICBpZiAoIXN5bmMgfHwgdHlwZW9mIHN5bmMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzeW5jKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJlc291cmNlIHN5bmMgY29uZmlndXJhdGlvbiBtdXN0IGJlIHRydWUsIGZhbHNlLCBvciBhbiBvYmplY3QuXCIpXG4gIH1cblxuICBjb25zdCB7Y29uZmxpY3RTdHJhdGVneSwgZW5hYmxlZCA9IHRydWUsIG1ldGFkYXRhLCBvcGVyYXRpb25zLCBwb2xpY3ksIHBvbGljeVZlcnNpb24sIC4uLnJlc3R9ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmNDb25maWd1cmF0aW9ufSAqLyAoc3luYylcblxuICBpZiAoT2JqZWN0LmtleXMocmVzdCkubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBzeW5jIGtleXM6ICR7T2JqZWN0LmtleXMocmVzdCkuam9pbihcIiwgXCIpfS4gQWxsb3dlZDogY29uZmxpY3RTdHJhdGVneSwgZW5hYmxlZCwgbWV0YWRhdGEsIG9wZXJhdGlvbnMsIHBvbGljeSwgcG9saWN5VmVyc2lvbmApXG4gIH1cbiAgaWYgKGVuYWJsZWQgIT09IHRydWUgJiYgZW5hYmxlZCAhPT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcihcIlJlc291cmNlIHN5bmMgZW5hYmxlZCBtdXN0IGJlIHRydWUgb3IgZmFsc2Ugd2hlbiBwcm92aWRlZC5cIilcblxuICBjb25zdCBub3JtYWxpemVkQ29uZmxpY3RTdHJhdGVneSA9IG5vcm1hbGl6ZVN5bmNDb25mbGljdFN0cmF0ZWd5KGNvbmZsaWN0U3RyYXRlZ3kpXG4gIGNvbnN0IG5vcm1hbGl6ZWRPcGVyYXRpb25zID0gbm9ybWFsaXplU3luY09wZXJhdGlvbnMob3BlcmF0aW9ucylcbiAgY29uc3Qgbm9ybWFsaXplZE1ldGFkYXRhID0gbWV0YWRhdGEgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGRldGVybWluaXN0aWNTeW5jSnNvbih7bGFiZWw6IFwibWV0YWRhdGFcIiwgdmFsdWU6IG1ldGFkYXRhfSlcbiAgY29uc3Qgbm9ybWFsaXplZFBvbGljeSA9IHBvbGljeSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZGV0ZXJtaW5pc3RpY1N5bmNKc29uKHtsYWJlbDogXCJwb2xpY3lcIiwgdmFsdWU6IHBvbGljeX0pXG4gIGNvbnN0IG5vcm1hbGl6ZWRQb2xpY3lWZXJzaW9uID0gcG9saWN5VmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IHBvbGljeVZlcnNpb24gPT09IG51bGwgPyBudWxsIDogU3RyaW5nKHBvbGljeVZlcnNpb24pXG4gIGNvbnN0IGhhc2hJbnB1dCA9IHtcbiAgICBjb25mbGljdFN0cmF0ZWd5OiBub3JtYWxpemVkQ29uZmxpY3RTdHJhdGVneSxcbiAgICBlbmFibGVkLFxuICAgIG1ldGFkYXRhOiBub3JtYWxpemVkTWV0YWRhdGEsXG4gICAgbW9kZWxOYW1lOiByZXNvdXJjZUNvbmZpZ3VyYXRpb24ubW9kZWxOYW1lIHx8IG51bGwsXG4gICAgb3BlcmF0aW9uczogbm9ybWFsaXplZE9wZXJhdGlvbnMsXG4gICAgcG9saWN5OiBub3JtYWxpemVkUG9saWN5LFxuICAgIHBvbGljeVZlcnNpb246IG5vcm1hbGl6ZWRQb2xpY3lWZXJzaW9uXG4gIH1cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jQ29uZmlndXJhdGlvbn0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICBjb25mbGljdFN0cmF0ZWd5OiBub3JtYWxpemVkQ29uZmxpY3RTdHJhdGVneSxcbiAgICBlbmFibGVkLFxuICAgIG9wZXJhdGlvbnM6IG5vcm1hbGl6ZWRPcGVyYXRpb25zLFxuICAgIHBvbGljeUhhc2g6IHN5bmNQb2xpY3lIYXNoKGhhc2hJbnB1dCksXG4gICAgcG9saWN5VmVyc2lvbjogbm9ybWFsaXplZFBvbGljeVZlcnNpb25cbiAgfVxuXG4gIGlmIChub3JtYWxpemVkTWV0YWRhdGEgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5tZXRhZGF0YSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChub3JtYWxpemVkTWV0YWRhdGEpXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBzeW5jIGNvbmZsaWN0IHN0cmF0ZWd5IGZvciByZXBsYXkgY2xpZW50cy9zZXJ2ZXJzLlxuICogQHBhcmFtIHt1bmtub3dufSBjb25mbGljdFN0cmF0ZWd5IC0gUmF3IHN0cmF0ZWd5LlxuICogQHJldHVybnMge1wib3B0aW1pc3RpY1ZlcnNpb25cIiB8IFwic2VydmVyV2luc1wiIHwgXCJsYXN0V3JpdGVyV2luc1wiIHwgXCJmaWVsZFRocmVlV2F5XCIgfCBcImFwcGVuZE9ubHlcIn0gLSBOb3JtYWxpemVkIHN0cmF0ZWd5LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTeW5jQ29uZmxpY3RTdHJhdGVneShjb25mbGljdFN0cmF0ZWd5KSB7XG4gIGlmIChjb25mbGljdFN0cmF0ZWd5ID09PSB1bmRlZmluZWQgfHwgY29uZmxpY3RTdHJhdGVneSA9PT0gbnVsbCkgcmV0dXJuIFwib3B0aW1pc3RpY1ZlcnNpb25cIlxuICBpZiAoW1wib3B0aW1pc3RpY1ZlcnNpb25cIiwgXCJzZXJ2ZXJXaW5zXCIsIFwibGFzdFdyaXRlcldpbnNcIiwgXCJmaWVsZFRocmVlV2F5XCIsIFwiYXBwZW5kT25seVwiXS5pbmNsdWRlcyhTdHJpbmcoY29uZmxpY3RTdHJhdGVneSkpKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7XCJvcHRpbWlzdGljVmVyc2lvblwiIHwgXCJzZXJ2ZXJXaW5zXCIgfCBcImxhc3RXcml0ZXJXaW5zXCIgfCBcImZpZWxkVGhyZWVXYXlcIiB8IFwiYXBwZW5kT25seVwifSAqLyAoY29uZmxpY3RTdHJhdGVneSlcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByZXNvdXJjZSBzeW5jIGNvbmZsaWN0U3RyYXRlZ3k6ICR7U3RyaW5nKGNvbmZsaWN0U3RyYXRlZ3kpfWApXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBzeW5jIG9wZXJhdGlvbnMgaW50byBhIHN0YWJsZSwgZHVwbGljYXRlLWZyZWUgbGlzdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gb3BlcmF0aW9ucyAtIFJhdyBvcGVyYXRpb25zIHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIE5vcm1hbGl6ZWQgb3BlcmF0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU3luY09wZXJhdGlvbnMob3BlcmF0aW9ucykge1xuICBpZiAob3BlcmF0aW9ucyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW11cbiAgaWYgKCFBcnJheS5pc0FycmF5KG9wZXJhdGlvbnMpKSB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvdXJjZSBzeW5jIG9wZXJhdGlvbnMgbXVzdCBiZSBhbiBhcnJheSBvZiBvcGVyYXRpb24gbmFtZXMuXCIpXG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IG9wZXJhdGlvbnMubWFwKChvcGVyYXRpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIG9wZXJhdGlvbiAhPT0gXCJzdHJpbmdcIiB8fCBvcGVyYXRpb24ubGVuZ3RoIDwgMSkgdGhyb3cgbmV3IEVycm9yKFwiUmVzb3VyY2Ugc3luYyBvcGVyYXRpb25zIGVudHJpZXMgbXVzdCBiZSBub24tZW1wdHkgc3RyaW5ncy5cIilcblxuICAgIHJldHVybiBvcGVyYXRpb25cbiAgfSlcblxuICByZXR1cm4gWy4uLm5ldyBTZXQobm9ybWFsaXplZCldLnNvcnQoKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGRldGVybWluaXN0aWMgcG9saWN5IGhhc2guXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gSGFzaCBpbnB1dC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gc2hhMjU2LXByZWZpeGVkIGhhc2guXG4gKi9cbmZ1bmN0aW9uIHN5bmNQb2xpY3lIYXNoKHZhbHVlKSB7XG4gIHJldHVybiBgc2hhMjU2LSR7c2hhMjU2SGV4KHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpKX1gXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoYXQgYSBzeW5jIGNvbmZpZyBzdWJ0cmVlIGlzIGRldGVybWluaXN0aWMgSlNPTiBhbmQgZG9lcyBub3QgY29udGFpbiBvYnZpb3VzIHNlY3JldHMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmxhYmVsIC0gRGlhZ25vc3RpYyBwYXRoIGxhYmVsLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLnZhbHVlIC0gVmFsdWUgdG8gdmFsaWRhdGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZX0gLSBTdGFibGUgSlNPTiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5pc3RpY1N5bmNKc29uKHtsYWJlbCwgdmFsdWV9KSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB2YWx1ZVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGVudHJ5LCBpbmRleCkgPT4gZGV0ZXJtaW5pc3RpY1N5bmNKc29uKHtsYWJlbDogYCR7bGFiZWx9LyR7aW5kZXh9YCwgdmFsdWU6IGVudHJ5fSkpXG4gIH1cblxuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKSkge1xuICAgICAgY29uc3QgY2hpbGRWYWx1ZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSlba2V5XVxuXG4gICAgICBpZiAoY2hpbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgaWYgKHN5bmNDb25maWdLZXlMb29rc1NlY3JldChrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3luYyBwb2xpY3kgJHtsYWJlbH0vJHtrZXl9IGlzIG5vdCBhbGxvd2VkIGluIGZyb250ZW5kLXZpc2libGUgc3luYyBwb2xpY3kgY29uZmlnYClcbiAgICAgIH1cblxuICAgICAgbm9ybWFsaXplZFtrZXldID0gZGV0ZXJtaW5pc3RpY1N5bmNKc29uKHtsYWJlbDogYCR7bGFiZWx9LyR7a2V5fWAsIHZhbHVlOiBjaGlsZFZhbHVlfSlcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZFxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiU3luYyBwb2xpY3kgaW5wdXQgbXVzdCBiZSBkZXRlcm1pbmlzdGljIEpTT05cIilcbn1cblxuLyoqXG4gKiBTdGFibGUgSlNPTiBzdHJpbmdpZmllciB3aXRoIHNvcnRlZCBvYmplY3Qga2V5cy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBWYWx1ZSB0byBzdHJpbmdpZnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0YWJsZSBKU09OLlxuICovXG5mdW5jdGlvbiBzdGFibGVKc29uU3RyaW5naWZ5KHZhbHVlKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShkZXRlcm1pbmlzdGljU3luY0pzb24oe2xhYmVsOiBcImhhc2hcIiwgdmFsdWV9KSlcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgYSBzeW5jIGNvbmZpZyBrZXkgbG9va3MgbGlrZSBhIGNyZWRlbnRpYWwvc2VjcmV0LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIE9iamVjdCBrZXkuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGtleSBpcyBkaXNhbGxvd2VkLlxuICovXG5mdW5jdGlvbiBzeW5jQ29uZmlnS2V5TG9va3NTZWNyZXQoa2V5KSB7XG4gIHJldHVybiAvc2VjcmV0fHRva2VufHBhc3N3b3JkfHByaXZhdGUuP2tleXxzaWduaW5nLj9rZXkvaS50ZXN0KGtleSlcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBjb21tYW5kcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSByZXNvdXJjZUNvbmZpZ3VyYXRpb24gLSBSYXcgcmVzb3VyY2UgY29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIHt7YnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgYnVpbHRJbk1lbWJlckNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBjb2xsZWN0aW9uQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGNvbW1hbmRNZXRhZGF0YTogUmVjb3JkPHN0cmluZywge2FyZ3M6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlOiBzdHJpbmcgfCBudWxsfT4sIG1lbWJlckNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fX0gLSBOb3JtYWxpemVkIGNvbW1hbmQgY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZHMocmVzb3VyY2VDb25maWd1cmF0aW9uKSB7XG4gIGNvbnN0IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMgPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24uYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc1xuICBjb25zdCBidWlsdEluTWVtYmVyQ29tbWFuZHMgPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24uYnVpbHRJbk1lbWJlckNvbW1hbmRzXG4gIGNvbnN0IGN1c3RvbUNvbGxlY3Rpb25Db21tYW5kcyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5jb2xsZWN0aW9uQ29tbWFuZHNcbiAgY29uc3QgY3VzdG9tTWVtYmVyQ29tbWFuZHMgPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24ubWVtYmVyQ29tbWFuZHNcbiAgY29uc3Qgbm9ybWFsaXplZEJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMgPSBub3JtYWxpemVGcm9udGVuZE1vZGVsQnVpbHRJbkNvbW1hbmRzKHtcbiAgICBjb21tYW5kRGVmYXVsdHM6IHtcbiAgICAgIGNyZWF0ZTogXCJjcmVhdGVcIixcbiAgICAgIGluZGV4OiBcImluZGV4XCJcbiAgICB9LFxuICAgIGNvbW1hbmRzQ29uZmlnOiBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLFxuICAgIG1vZGVsTmFtZTogXCJDb2xsZWN0aW9uQ29tbWFuZFwiXG4gIH0pXG4gIGNvbnN0IG5vcm1hbGl6ZWRCdWlsdEluTWVtYmVyQ29tbWFuZHMgPSBub3JtYWxpemVGcm9udGVuZE1vZGVsQnVpbHRJbkNvbW1hbmRzKHtcbiAgICBjb21tYW5kRGVmYXVsdHM6IHtcbiAgICAgIGF0dGFjaDogXCJhdHRhY2hcIixcbiAgICAgIGF0dGFjaG1lbnRMaXN0OiBcImF0dGFjaG1lbnRMaXN0XCIsXG4gICAgICBkZXN0cm95OiBcImRlc3Ryb3lcIixcbiAgICAgIGRvd25sb2FkOiBcImRvd25sb2FkXCIsXG4gICAgICBmaW5kOiBcImZpbmRcIixcbiAgICAgIHVwZGF0ZTogXCJ1cGRhdGVcIixcbiAgICAgIHVybDogXCJ1cmxcIlxuICAgIH0sXG4gICAgY29tbWFuZHNDb25maWc6IGJ1aWx0SW5NZW1iZXJDb21tYW5kcyxcbiAgICBtb2RlbE5hbWU6IFwiTWVtYmVyQ29tbWFuZFwiXG4gIH0pXG5cbiAgY29uc3Qgbm9ybWFsaXplZENvbGxlY3Rpb25Db21tYW5kcyA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kcyh7Y29tbWFuZHNDb25maWc6IGN1c3RvbUNvbGxlY3Rpb25Db21tYW5kcywgbW9kZWxOYW1lOiBcIkNvbGxlY3Rpb25Db21tYW5kXCJ9KVxuICBjb25zdCBub3JtYWxpemVkTWVtYmVyQ29tbWFuZHMgPSBub3JtYWxpemVGcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZHMoe2NvbW1hbmRzQ29uZmlnOiBjdXN0b21NZW1iZXJDb21tYW5kcywgbW9kZWxOYW1lOiBcIk1lbWJlckNvbW1hbmRcIn0pXG5cbiAgcmV0dXJuIHtcbiAgICBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzOiBub3JtYWxpemVkQnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcyxcbiAgICBidWlsdEluTWVtYmVyQ29tbWFuZHM6IG5vcm1hbGl6ZWRCdWlsdEluTWVtYmVyQ29tbWFuZHMsXG4gICAgY29sbGVjdGlvbkNvbW1hbmRzOiBub3JtYWxpemVkQ29sbGVjdGlvbkNvbW1hbmRzLmNvbW1hbmRzLFxuICAgIGNvbW1hbmRNZXRhZGF0YTogey4uLm5vcm1hbGl6ZWRDb2xsZWN0aW9uQ29tbWFuZHMubWV0YWRhdGEsIC4uLm5vcm1hbGl6ZWRNZW1iZXJDb21tYW5kcy5tZXRhZGF0YX0sXG4gICAgbWVtYmVyQ29tbWFuZHM6IG5vcm1hbGl6ZWRNZW1iZXJDb21tYW5kcy5jb21tYW5kc1xuICB9XG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgZnJvbnRlbmQgbW9kZWwgYnVpbHQgaW4gY29tbWFuZHMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gYXJncy5jb21tYW5kRGVmYXVsdHMgLSBCdWlsdC1pbiBkZWZhdWx0IGNvbW1hbmQgbmFtZXMuXG4gKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSBhcmdzLmNvbW1hbmRzQ29uZmlnIC0gQnVpbHQtaW4gY29tbWFuZHMgY29uZmlnIChjYW1lbENhc2UgY29tbWFuZCB0eXBlIGxpc3QpLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubW9kZWxOYW1lIC0gRGlhZ25vc3RpYyBtb2RlbCBuYW1lLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IC0gTm9ybWFsaXplZCBidWlsdC1pbiBjb21tYW5kIGNvbmZpZy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEJ1aWx0SW5Db21tYW5kcyh7Y29tbWFuZERlZmF1bHRzLCBjb21tYW5kc0NvbmZpZywgbW9kZWxOYW1lfSkge1xuICBpZiAoIWNvbW1hbmRzQ29uZmlnKSB7XG4gICAgcmV0dXJuIGNvbW1hbmREZWZhdWx0c1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGNvbW1hbmRzQ29uZmlnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IGNvbmZpZ3VyYXRpb24gbXVzdCB1c2UgdGhlIGFycmF5IGZvcm0uIE9iamVjdCBmb3JtIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuYClcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVkIGNvbW1hbmRzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZENvbW1hbmRzID0ge31cblxuICBmb3IgKGNvbnN0IGNvbW1hbmRUeXBlIG9mIGNvbW1hbmRzQ29uZmlnKSB7XG4gICAgY29uc3QgZGVmYXVsdENvbW1hbmROYW1lID0gY29tbWFuZERlZmF1bHRzW2NvbW1hbmRUeXBlXVxuXG4gICAgaWYgKCFkZWZhdWx0Q29tbWFuZE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBidWlsdC1pbiBmcm9udGVuZCBtb2RlbCBjb21tYW5kICcke2NvbW1hbmRUeXBlfScgZm9yICR7bW9kZWxOYW1lfWApXG4gICAgfVxuXG4gICAgbm9ybWFsaXplZENvbW1hbmRzW2NvbW1hbmRUeXBlXSA9IHZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZE5hbWUoe1xuICAgICAgY29tbWFuZE5hbWU6IGRlZmF1bHRDb21tYW5kTmFtZSxcbiAgICAgIGNvbW1hbmRUeXBlOiBkZWZhdWx0Q29tbWFuZE5hbWUsXG4gICAgICBtb2RlbE5hbWVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRDb21tYW5kc1xufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIGN1c3RvbSBjb21tYW5kcy4gRW50cmllcyBhcmUgZWl0aGVyIGEgcGxhaW5cbiAqIGNhbWVsQ2FzZSBtZXRob2QtbmFtZSBzdHJpbmcgb3IgYSBge25hbWUsIGFyZ3M/LCByZXR1cm5UeXBlP31gIG9iamVjdCB0aGF0XG4gKiBhbHNvIGRlY2xhcmVzIHRoZSBjb21tYW5kJ3MgdHlwZWQgYXJndW1lbnRzIGFuZC9vciByZXNwb25zZSB0eXBlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHtuYW1lOiBzdHJpbmcsIGFyZ3M/OiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZT86IHN0cmluZ30+IHwgdW5kZWZpbmVkfSBhcmdzLmNvbW1hbmRzQ29uZmlnIC0gQ3VzdG9tIGNvbW1hbmRzIGNvbmZpZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1vZGVsTmFtZSAtIERpYWdub3N0aWMgbW9kZWwgbmFtZS5cbiAqIEByZXR1cm5zIHt7Y29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB7YXJnczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHN0cmluZyB8IG51bGx9Pn19IC0gUm91dGUgbWFwIChtZXRob2QgbmFtZSDihpIga2ViYWIgc2x1ZykgKyBwZXItY29tbWFuZCBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRzKHtjb21tYW5kc0NvbmZpZywgbW9kZWxOYW1lfSkge1xuICBpZiAoIWNvbW1hbmRzQ29uZmlnKSB7XG4gICAgcmV0dXJuIHtjb21tYW5kczoge30sIG1ldGFkYXRhOiB7fX1cbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShjb21tYW5kc0NvbmZpZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSBjb25maWd1cmF0aW9uIG11c3QgdXNlIHRoZSBhcnJheSBmb3JtLiBPYmplY3QgZm9ybSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLmApXG4gIH1cblxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IGNvbW1hbmRzID0ge31cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB7YXJnczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHN0cmluZyB8IG51bGx9Pn0gKi9cbiAgY29uc3QgbWV0YWRhdGEgPSB7fVxuXG4gIGZvciAoY29uc3QgY29tbWFuZEVudHJ5IG9mIGNvbW1hbmRzQ29uZmlnKSB7XG4gICAgY29uc3Qge21ldGhvZE5hbWUsIGFyZ3MsIHJldHVyblR5cGV9ID0gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRFbnRyeSh7Y29tbWFuZEVudHJ5LCBtb2RlbE5hbWV9KVxuICAgIGNvbnN0IHZhbGlkYXRlZE1ldGhvZE5hbWUgPSB2YWxpZGF0ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbW1hbmROYW1lKHtcbiAgICAgIGNvbW1hbmROYW1lOiBtZXRob2ROYW1lLFxuICAgICAgY29tbWFuZFR5cGU6IG1ldGhvZE5hbWUsXG4gICAgICBtb2RlbE5hbWVcbiAgICB9KVxuICAgIGNvbnN0IGNvbW1hbmRTbHVnID0gaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHZhbGlkYXRlZE1ldGhvZE5hbWUpKVxuXG4gICAgY29tbWFuZHNbdmFsaWRhdGVkTWV0aG9kTmFtZV0gPSBjb21tYW5kU2x1Z1xuICAgIG1ldGFkYXRhW3ZhbGlkYXRlZE1ldGhvZE5hbWVdID0ge2FyZ3MsIHJldHVyblR5cGV9XG4gIH1cblxuICByZXR1cm4ge2NvbW1hbmRzLCBtZXRhZGF0YX1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIG9uZSBjdXN0b20tY29tbWFuZCBlbnRyeSAoc3RyaW5nIHNob3J0aGFuZCBvciBjb250cmFjdCBvYmplY3QpLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MuY29tbWFuZEVudHJ5IC0gUmF3IGNvbW1hbmQgZW50cnkuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tb2RlbE5hbWUgLSBEaWFnbm9zdGljIG1vZGVsIG5hbWUuXG4gKiBAcmV0dXJucyB7e21ldGhvZE5hbWU6IHN0cmluZywgYXJnczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHN0cmluZyB8IG51bGx9fSAtIE1ldGhvZCBuYW1lICsgbWV0YWRhdGEuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kRW50cnkoe2NvbW1hbmRFbnRyeSwgbW9kZWxOYW1lfSkge1xuICBpZiAodHlwZW9mIGNvbW1hbmRFbnRyeSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7bWV0aG9kTmFtZTogY29tbWFuZEVudHJ5LCBhcmdzOiBbXSwgcmV0dXJuVHlwZTogbnVsbH1cbiAgfVxuXG4gIGlmICghY29tbWFuZEVudHJ5IHx8IHR5cGVvZiBjb21tYW5kRW50cnkgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjb21tYW5kRW50cnkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gZW50cmllcyBtdXN0IGJlIGEgY2FtZWxDYXNlIG5hbWUgc3RyaW5nIG9yIGEge25hbWUsIGFyZ3M/LCByZXR1cm5UeXBlP30gb2JqZWN0YClcbiAgfVxuXG4gIGNvbnN0IHtuYW1lLCBhcmdzLCByZXR1cm5UeXBlLCAuLi5yZXN0fSA9IC8qKiBAdHlwZSB7e25hbWU/OiB1bmtub3duLCBhcmdzPzogdW5rbm93biwgcmV0dXJuVHlwZT86IHVua25vd259fSAqLyAoY29tbWFuZEVudHJ5KVxuXG4gIGlmIChPYmplY3Qua2V5cyhyZXN0KS5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkICR7bW9kZWxOYW1lfSBrZXlzOiAke09iamVjdC5rZXlzKHJlc3QpLmpvaW4oXCIsIFwiKX0uIEFsbG93ZWQ6IG5hbWUsIGFyZ3MsIHJldHVyblR5cGVgKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiIHx8IG5hbWUubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IG9iamVjdCBlbnRyaWVzIHJlcXVpcmUgYSBub24tZW1wdHkgJ25hbWUnIHN0cmluZ2ApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1ldGhvZE5hbWU6IG5hbWUsXG4gICAgYXJnczogbm9ybWFsaXplRnJvbnRlbmRNb2RlbENvbW1hbmRBcmdzKHthcmdzLCBjb21tYW5kTmFtZTogbmFtZSwgbW9kZWxOYW1lfSksXG4gICAgcmV0dXJuVHlwZTogbm9ybWFsaXplRnJvbnRlbmRNb2RlbENvbW1hbmRSZXR1cm5UeXBlKHtjb21tYW5kTmFtZTogbmFtZSwgbW9kZWxOYW1lLCByZXR1cm5UeXBlfSlcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhbmQgbm9ybWFsaXplcyBhIGN1c3RvbSBjb21tYW5kJ3MgdHlwZWQtYXJndW1lbnQgbGlzdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLmFyZ3MgLSBSYXcgY29tbWFuZCBhcmdzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29tbWFuZE5hbWUgLSBDb21tYW5kIG5hbWUgZm9yIGRpYWdub3N0aWNzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubW9kZWxOYW1lIC0gRGlhZ25vc3RpYyBtb2RlbCBuYW1lLlxuICogQHJldHVybnMge0FycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+fSAtIE5vcm1hbGl6ZWQgdHlwZWQgY29tbWFuZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxDb21tYW5kQXJncyh7YXJncywgY29tbWFuZE5hbWUsIG1vZGVsTmFtZX0pIHtcbiAgaWYgKGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJncykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSAnJHtjb21tYW5kTmFtZX0nIGFyZ3MgbXVzdCBiZSBhbiBhcnJheSBvZiB7bmFtZSwgdHlwZX0gb2JqZWN0c2ApXG4gIH1cblxuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4ge1xuICAgIGlmICghYXJnIHx8IHR5cGVvZiBhcmcgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGFyZy5uYW1lICE9PSBcInN0cmluZ1wiIHx8IGFyZy5uYW1lLmxlbmd0aCA8IDEgfHwgdHlwZW9mIGFyZy50eXBlICE9PSBcInN0cmluZ1wiIHx8IGFyZy50eXBlLnRyaW0oKS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSAnJHtjb21tYW5kTmFtZX0nIGFyZ3MgZW50cmllcyByZXF1aXJlIG5vbi1lbXB0eSAnbmFtZScgYW5kIEpTRG9jLXR5cGUgJ3R5cGUnIHN0cmluZ3NgKVxuICAgIH1cblxuICAgIHJldHVybiB7bmFtZTogYXJnLm5hbWUsIHR5cGU6IGFyZy50eXBlLnRyaW0oKX1cbiAgfSlcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW5kIG5vcm1hbGl6ZXMgYSBjdXN0b20gY29tbWFuZCdzIGRlY2xhcmVkIEpTRG9jIHJldHVybiB0eXBlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21tYW5kTmFtZSAtIENvbW1hbmQgbmFtZSBmb3IgZGlhZ25vc3RpY3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tb2RlbE5hbWUgLSBEaWFnbm9zdGljIG1vZGVsIG5hbWUuXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MucmV0dXJuVHlwZSAtIFJhdyByZXR1cm4gdHlwZS5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIE5vcm1hbGl6ZWQgSlNEb2MgcmV0dXJuIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxDb21tYW5kUmV0dXJuVHlwZSh7Y29tbWFuZE5hbWUsIG1vZGVsTmFtZSwgcmV0dXJuVHlwZX0pIHtcbiAgaWYgKHJldHVyblR5cGUgPT09IHVuZGVmaW5lZCB8fCByZXR1cm5UeXBlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGlmICh0eXBlb2YgcmV0dXJuVHlwZSAhPT0gXCJzdHJpbmdcIiB8fCByZXR1cm5UeXBlLnRyaW0oKS5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gJyR7Y29tbWFuZE5hbWV9JyByZXR1cm5UeXBlIG11c3QgYmUgYSBub24tZW1wdHkgSlNEb2MgdHlwZSBzdHJpbmdgKVxuICB9XG5cbiAgcmV0dXJuIHJldHVyblR5cGUudHJpbSgpXG59XG5cbi8qKlxuICogUnVucyB0aGUgZnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aCBoZWxwZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlc291cmNlRGVmaW5pdGlvbiAtIFJlc291cmNlIGRlZmluaXRpb24uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgcmVzb3VyY2UgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGgobW9kZWxOYW1lLCByZXNvdXJjZURlZmluaXRpb24pIHtcbiAgY29uc3QgcmVzb3VyY2VDb25maWd1cmF0aW9uID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcblxuICBpZiAoIXJlc291cmNlQ29uZmlndXJhdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBkZWZpbml0aW9uIGZvciAke21vZGVsTmFtZX1gKVxuICB9XG5cbiAgcmV0dXJuIGAvJHtpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUobW9kZWxOYW1lKSkpfWBcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBmcm9udGVuZE1vZGVsQWN0aW9uRm9yQ29tbWFuZCBoZWxwZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbW1hbmROYW1lIC0gQ29tbWFuZCBwYXRoIHNlZ21lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tb2RlbE5hbWUgLSBNb2RlbCBjbGFzcyBuYW1lLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJncy5yZXNvdXJjZURlZmluaXRpb24gLSBSZXNvdXJjZSBkZWZpbml0aW9uLlxuICogQHJldHVybnMge1wiZGVzdHJveVwiIHwgXCJmaW5kXCIgfCBcImluZGV4XCIgfCBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiYXR0YWNoXCIgfCBcImRvd25sb2FkXCIgfCBcInVybFwiIHwgbnVsbH0gLSBGcm9udGVuZCBhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9udGVuZE1vZGVsQWN0aW9uRm9yQ29tbWFuZCh7Y29tbWFuZE5hbWUsIG1vZGVsTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9ufSkge1xuICBjb25zdCByZXNvdXJjZUNvbmZpZ3VyYXRpb24gPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKVxuXG4gIGlmICghcmVzb3VyY2VDb25maWd1cmF0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGRlZmluaXRpb24gZm9yICR7bW9kZWxOYW1lfWApXG4gIH1cblxuICBmb3IgKGNvbnN0IFthY3Rpb24sIGNvbmZpZ3VyZWRDb21tYW5kTmFtZV0gb2YgT2JqZWN0LmVudHJpZXMoe1xuICAgIC4uLnJlc291cmNlQ29uZmlndXJhdGlvbi5idWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLFxuICAgIC4uLnJlc291cmNlQ29uZmlndXJhdGlvbi5idWlsdEluTWVtYmVyQ29tbWFuZHNcbiAgfSkpIHtcbiAgICBpZiAoY29uZmlndXJlZENvbW1hbmROYW1lID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG5cbiAgICBjb25zdCB2YWxpZGF0ZWRDb21tYW5kTmFtZSA9IHZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZE5hbWUoe1xuICAgICAgY29tbWFuZE5hbWU6IGNvbmZpZ3VyZWRDb21tYW5kTmFtZSxcbiAgICAgIGNvbW1hbmRUeXBlOiAvKiogQHR5cGUge1wiYXR0YWNoXCIgfCBcImNyZWF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImRvd25sb2FkXCIgfCBcImZpbmRcIiB8IFwiaW5kZXhcIiB8IFwidXBkYXRlXCIgfCBcInVybFwifSAqLyAoYWN0aW9uKSxcbiAgICAgIG1vZGVsTmFtZVxuICAgIH0pXG5cbiAgICBpZiAoY29tbWFuZE5hbWUgPT09IHZhbGlkYXRlZENvbW1hbmROYW1lKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtcImF0dGFjaFwiIHwgXCJjcmVhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJkb3dubG9hZFwiIHwgXCJmaW5kXCIgfCBcImluZGV4XCIgfCBcInVwZGF0ZVwiIHwgXCJ1cmxcIn0gKi8gKGFjdGlvbilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kRm9yUGF0aCBoZWxwZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb25bXX0gYXJncy5iYWNrZW5kUHJvamVjdHMgLSBCYWNrZW5kIHByb2plY3RzIHRvIHNjYW4uXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jdXJyZW50UGF0aCAtIFJlcXVlc3QgcGF0aCB3aXRob3V0IHF1ZXJ5LlxuICogQHJldHVybnMge3tjb21tYW5kTmFtZTogc3RyaW5nLCBtZW1iZXJJZD86IHN0cmluZywgbWV0aG9kTmFtZTogc3RyaW5nLCBtb2RlbE5hbWU6IHN0cmluZywgcmVzb3VyY2VQYXRoOiBzdHJpbmcsIHNjb3BlOiBcImNvbGxlY3Rpb25cIiB8IFwibWVtYmVyXCJ9IHwgbnVsbH0gLSBNYXRjaGVkIGN1c3RvbSBjb21tYW5kIG1ldGFkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRGb3JQYXRoKHtiYWNrZW5kUHJvamVjdHMsIGN1cnJlbnRQYXRofSkge1xuICBjb25zdCBub3JtYWxpemVkQ3VycmVudFBhdGggPSBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoRm9yTWF0Y2goY3VycmVudFBhdGgpXG5cbiAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBiYWNrZW5kUHJvamVjdHMpIHtcbiAgICBjb25zdCByZXNvdXJjZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsTmFtZSBpbiByZXNvdXJjZXMpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IHJlc291cmNlc1ttb2RlbE5hbWVdXG4gICAgICBjb25zdCByZXNvdXJjZUNvbmZpZ3VyYXRpb24gPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKVxuXG4gICAgICBpZiAoIXJlc291cmNlQ29uZmlndXJhdGlvbikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNvdXJjZVBhdGggPSBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoRm9yTWF0Y2goZnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aChtb2RlbE5hbWUsIHJlc291cmNlRGVmaW5pdGlvbikpXG4gICAgICBjb25zdCBleHBlY3RlZFByZWZpeCA9IGAke3Jlc291cmNlUGF0aH0vYFxuXG4gICAgICBpZiAoIW5vcm1hbGl6ZWRDdXJyZW50UGF0aC5zdGFydHNXaXRoKGV4cGVjdGVkUHJlZml4KSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBub3JtYWxpemVkQ3VycmVudFBhdGhcbiAgICAgICAgLnNsaWNlKGV4cGVjdGVkUHJlZml4Lmxlbmd0aClcbiAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG5cbiAgICAgIGlmIChwYXRoU2VnbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRDb2xsZWN0aW9uQ29tbWFuZCA9IE9iamVjdC5lbnRyaWVzKHJlc291cmNlQ29uZmlndXJhdGlvbi5jb2xsZWN0aW9uQ29tbWFuZHMpXG4gICAgICAgICAgLmZpbmQoKFssIGNvbW1hbmROYW1lXSkgPT4gY29tbWFuZE5hbWUgPT09IHBhdGhTZWdtZW50c1swXSlcblxuICAgICAgICBpZiAobWF0Y2hlZENvbGxlY3Rpb25Db21tYW5kKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbW1hbmROYW1lOiBtYXRjaGVkQ29sbGVjdGlvbkNvbW1hbmRbMV0sXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBtYXRjaGVkQ29sbGVjdGlvbkNvbW1hbmRbMF0sXG4gICAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgICByZXNvdXJjZVBhdGgsXG4gICAgICAgICAgICBzY29wZTogXCJjb2xsZWN0aW9uXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBhdGhTZWdtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZE1lbWJlckNvbW1hbmQgPSBPYmplY3QuZW50cmllcyhyZXNvdXJjZUNvbmZpZ3VyYXRpb24ubWVtYmVyQ29tbWFuZHMpXG4gICAgICAgICAgLmZpbmQoKFssIGNvbW1hbmROYW1lXSkgPT4gY29tbWFuZE5hbWUgPT09IHBhdGhTZWdtZW50c1sxXSlcblxuICAgICAgICBpZiAobWF0Y2hlZE1lbWJlckNvbW1hbmQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tbWFuZE5hbWU6IG1hdGNoZWRNZW1iZXJDb21tYW5kWzFdLFxuICAgICAgICAgICAgbWVtYmVySWQ6IGRlY29kZVVSSUNvbXBvbmVudChwYXRoU2VnbWVudHNbMF0pLFxuICAgICAgICAgICAgbWV0aG9kTmFtZTogbWF0Y2hlZE1lbWJlckNvbW1hbmRbMF0sXG4gICAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgICByZXNvdXJjZVBhdGgsXG4gICAgICAgICAgICBzY29wZTogXCJtZW1iZXJcIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgcGF0aCBmb3IgbWF0Y2guXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGggdmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgcGF0aCB3aXRoIGxlYWRpbmcgc2xhc2ggYW5kIG5vIHRyYWlsaW5nIHNsYXNoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoRm9yTWF0Y2gocGF0aCkge1xuICBjb25zdCB3aXRoTGVhZGluZ1NsYXNoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gXG5cbiAgaWYgKHdpdGhMZWFkaW5nU2xhc2gubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiB3aXRoTGVhZGluZ1NsYXNoLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgfVxuXG4gIHJldHVybiB3aXRoTGVhZGluZ1NsYXNoXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHJlZ2lzdGVyZWQgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2UgY2xhc3MgZm9yIGEgcmVzb3VyY2UgdHlwZVxuICogYWNyb3NzIGFsbCBiYWNrZW5kIHByb2plY3RzLiBBIHJlc291cmNlJ3MgZWZmZWN0aXZlIG5hbWUgaXMgaXRzXG4gKiBgbW9kZWxOYW1lYCBvdmVycmlkZSB3aGVuIGRlY2xhcmVkLCBvdGhlcndpc2UgaXRzIHJlZ2lzdHJ5IGtleSDigJQgbWF0Y2hpbmdcbiAqIHtAbGluayBmcm9udGVuZE1vZGVsU3luY01hbmlmZXN0Rm9yQmFja2VuZFByb2plY3RzfS4gQSByZWdpc3RyeSBrZXkgc2hhZG93ZWRcbiAqIGJ5IGEgYG1vZGVsTmFtZWAgb3ZlcnJpZGUgZG9lcyBub3QgcmVzb2x2ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7e2dldEJhY2tlbmRQcm9qZWN0czogKCkgPT4gaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb25bXX19IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gZXhwb3NpbmcgdGhlIGJhY2tlbmQgcHJvamVjdHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZXNvdXJjZVR5cGUgLSBGcm9udGVuZCBtb2RlbCBuYW1lIHRvIHJlc29sdmUuXG4gKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFJlc29sdmVkUmVzb3VyY2VSZWdpc3RyYXRpb24gfCBudWxsfSBSZXNvbHZlZCByZWdpc3RyYXRpb24gb3IgbnVsbCB3aGVuIHRoZSByZXNvdXJjZSB0eXBlIGlzIG5vdCByZWdpc3RlcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzKHtjb25maWd1cmF0aW9uLCByZXNvdXJjZVR5cGV9KSB7XG4gIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgY29uZmlndXJhdGlvbi5nZXRCYWNrZW5kUHJvamVjdHMoKSkge1xuICAgIGNvbnN0IHJlc291cmNlcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcblxuICAgIGZvciAoY29uc3QgY29uZmlndXJlZE1vZGVsTmFtZSBvZiBPYmplY3Qua2V5cyhyZXNvdXJjZXMpKSB7XG4gICAgICBjb25zdCByZXNvdXJjZURlZmluaXRpb24gPSByZXNvdXJjZXNbY29uZmlndXJlZE1vZGVsTmFtZV1cbiAgICAgIGNvbnN0IHJlc291cmNlQ2xhc3MgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc0Zyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcblxuICAgICAgaWYgKCFyZXNvdXJjZUNsYXNzKSBjb250aW51ZVxuXG4gICAgICAvLyBDaGVhcCBkaXJlY3Qta2V5IG1pc21hdGNoIHNraXA6IG9ubHkgbm9ybWFsaXplIGNvbmZpZ3VyYXRpb25zIGZvciB0aGVcbiAgICAgIC8vIG1hdGNoaW5nIGtleSBvciB3aGVuIGEgbW9kZWxOYW1lIG92ZXJyaWRlIGNvdWxkIHJlbmFtZSB0aGUgcmVzb3VyY2UuXG4gICAgICBpZiAoY29uZmlndXJlZE1vZGVsTmFtZSAhPT0gcmVzb3VyY2VUeXBlICYmICFyZXNvdXJjZUNsYXNzLnNoYXJlZFJlc291cmNlU3RhdGljVmFsdWUoXCJtb2RlbE5hbWVcIikpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlc291cmNlQ29uZmlndXJhdGlvbiA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgICAgIGlmICghcmVzb3VyY2VDb25maWd1cmF0aW9uKSBjb250aW51ZVxuICAgICAgaWYgKChyZXNvdXJjZUNvbmZpZ3VyYXRpb24ubW9kZWxOYW1lIHx8IGNvbmZpZ3VyZWRNb2RlbE5hbWUpICE9PSByZXNvdXJjZVR5cGUpIGNvbnRpbnVlXG5cbiAgICAgIHJldHVybiB7bW9kZWxOYW1lOiByZXNvdXJjZVR5cGUsIHJlc291cmNlQ2xhc3MsIHJlc291cmNlQ29uZmlndXJhdGlvbn1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuIl19
|
|
871
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyx5QkFBeUIsTUFBTSw2Q0FBNkMsQ0FBQTtBQUNuRixPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM5QyxPQUFPLEVBQUMsd0NBQXdDLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV4Rjs7Ozs7O0dBTUc7QUFDSCxNQUFNLG1DQUFtQyxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDbkYsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMxQyxXQUFXO0lBQ1gsYUFBYTtJQUNiLFlBQVk7SUFDWiwyQkFBMkI7SUFDM0IsdUJBQXVCO0lBQ3ZCLG9CQUFvQjtJQUNwQixVQUFVO0lBQ1YsZ0JBQWdCO0lBQ2hCLFdBQVc7SUFDWCxZQUFZO0lBQ1osWUFBWTtJQUNaLG9CQUFvQjtJQUNwQiwyQkFBMkI7SUFDM0IsZUFBZTtJQUNmLG9CQUFvQjtJQUNwQixRQUFRO0lBQ1IsZ0JBQWdCO0lBQ2hCLE1BQU07SUFDTixzQkFBc0I7SUFDdEIsb0JBQW9CO0NBQ3JCLENBQUMsQ0FBQTtBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUNBQXVDLENBQUMsY0FBYztJQUNwRSxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFBO0lBRS9DLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEQsTUFB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Q0FBQTtRQUN4RSxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlIGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuaW1wb3J0IHNoYTI1NkhleCBmcm9tIFwiLi4vdXRpbHMvc2hhMjU2LWhleC5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZE5hbWV9IGZyb20gXCIuL3Jlc291cmNlLWNvbmZpZy12YWxpZGF0aW9uLmpzXCJcblxuLyoqXG4gKiBSZXNvbHZlZCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZSByZWdpc3RyYXRpb24gZm9yIGEgcmVwbGF5IHJlc291cmNlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUmVzb2x2ZWRSZXNvdXJjZVJlZ2lzdHJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsTmFtZSAtIEVmZmVjdGl2ZSBmcm9udGVuZCBtb2RlbCBuYW1lIChtb2RlbE5hbWUgb3ZlcnJpZGUgb3IgcmVnaXN0cnkga2V5KS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IHJlc291cmNlQ2xhc3MgLSBSZWdpc3RlcmVkIHJlc291cmNlIGNsYXNzLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLk5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9ufSByZXNvdXJjZUNvbmZpZ3VyYXRpb24gLSBOb3JtYWxpemVkIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmNvbnN0IEJBU0VfRlJPTlRFTkRfTU9ERUxfQUJJTElUWV9BQ1RJT05TID0gW1wiY3JlYXRlXCIsIFwiZGVzdHJveVwiLCBcInJlYWRcIiwgXCJ1cGRhdGVcIl1cbmNvbnN0IFJFU09VUkNFX1NUQVRJQ19DT05GSUdfS0VZUyA9IG5ldyBTZXQoW1xuICBcImFiaWxpdGllc1wiLFxuICBcImF0dGFjaG1lbnRzXCIsXG4gIFwiYXR0cmlidXRlc1wiLFxuICBcImJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcIixcbiAgXCJidWlsdEluTWVtYmVyQ29tbWFuZHNcIixcbiAgXCJjb2xsZWN0aW9uQ29tbWFuZHNcIixcbiAgXCJjb21tYW5kc1wiLFxuICBcIm1lbWJlckNvbW1hbmRzXCIsXG4gIFwibW9kZWxOYW1lXCIsXG4gIFwiTW9kZWxDbGFzc1wiLFxuICBcInByaW1hcnlLZXlcIixcbiAgXCJxdWlja1NlYXJjaENvbHVtbnNcIixcbiAgXCJxdWlja1NlYXJjaE51bWVyaWNDb2x1bW5zXCIsXG4gIFwicmVsYXRpb25zaGlwc1wiLFxuICBcIlJlcGxheVNlcnZpY2VDbGFzc1wiLFxuICBcInNlcnZlclwiLFxuICBcIlNoYXJlZFJlc291cmNlXCIsXG4gIFwic3luY1wiLFxuICBcInRyYW5zbGF0ZWRBdHRyaWJ1dGVzXCIsXG4gIFwid3JpdGFibGVBdHRyaWJ1dGVzXCJcbl0pXG5cbi8qKlxuICogUnVucyB0aGUgZnJvbnRlbmRNb2RlbFJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0IGhlbHBlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb259IGJhY2tlbmRQcm9qZWN0IC0gQmFja2VuZCBwcm9qZWN0IGNvbmZpZy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZT59IC0gUmVzb3VyY2UgZGVmaW5pdGlvbnMga2V5ZWQgYnkgbW9kZWwgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb250ZW5kTW9kZWxSZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdCkge1xuICBjb25zdCByZXNvdXJjZXMgPSBiYWNrZW5kUHJvamVjdC5mcm9udGVuZE1vZGVsc1xuXG4gIGlmIChyZXNvdXJjZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghcmVzb3VyY2VzIHx8IHR5cGVvZiByZXNvdXJjZXMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYmFja2VuZCBwcm9qZWN0IGZyb250ZW5kTW9kZWxzIG9iamVjdCBidXQgZ290OiAke3Jlc291cmNlc31gKVxuICAgIH1cblxuICAgIHJldHVybiByZXNvdXJjZXNcbiAgfVxuXG4gIHJldHVybiB7fVxufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb25Jc0NsYXNzIGhlbHBlci5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FuZGlkYXRlIHJlc291cmNlIGRlZmluaXRpb24uXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IC0gV2hldGhlciB2YWx1ZSBpcyBhIHJlc291cmNlIGNsYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvbklzQ2xhc3ModmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmICh2YWx1ZSA9PT0gRnJvbnRlbmRNb2RlbEJhc2VSZXNvdXJjZSB8fCB2YWx1ZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlKVxufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzRnJvbURlZmluaXRpb24gaGVscGVyLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVzb3VyY2VEZWZpbml0aW9uIC0gUmVzb3VyY2UgZGVmaW5pdGlvbi5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZSB8IG51bGx9IC0gUmVzb3VyY2UgY2xhc3Mgd2hlbiBkZWZpbml0aW9uIGlzIGNsYXNzLWJhc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pIHtcbiAgcmV0dXJuIGZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb25Jc0NsYXNzKHJlc291cmNlRGVmaW5pdGlvbikgPyByZXNvdXJjZURlZmluaXRpb24gOiBudWxsXG59XG5cbi8qKlxuICogUnVucyB0aGUgZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uIGhlbHBlci5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlc291cmNlRGVmaW5pdGlvbiAtIFJlc291cmNlIGRlZmluaXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbiB8IG51bGx9IC0gTm9ybWFsaXplZCByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbikge1xuICBpZiAoIWZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb25Jc0NsYXNzKHJlc291cmNlRGVmaW5pdGlvbikpIHJldHVybiBudWxsXG5cbiAgYXNzZXJ0UmVzb3VyY2VDb25maWdJc0ZyYW1ld29ya0RlZmluZWQocmVzb3VyY2VEZWZpbml0aW9uKVxuXG4gIHJldHVybiBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uKHJlc291cmNlRGVmaW5pdGlvbi5yZXNvdXJjZUNvbmZpZygpKVxufVxuXG4vKipcbiAqIEVuc3VyZXMgcmVzb3VyY2VzIHVzZSBkZWNsYXJhdGl2ZSBzdGF0aWMgY29uZmlnIHByb3BlcnRpZXMgaW5zdGVhZCBvZiBvdmVycmlkaW5nIHJlc291cmNlQ29uZmlnKCkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlfSBSZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gKiBAcGFyYW0ge1NldDxpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZT59IFt2aXNpdGVkXSAtIEFscmVhZHkgaW5zcGVjdGVkIHNoYXJlZCByZXNvdXJjZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0UmVzb3VyY2VDb25maWdJc0ZyYW1ld29ya0RlZmluZWQoUmVzb3VyY2VDbGFzcywgdmlzaXRlZCA9IG5ldyBTZXQoKSkge1xuICBpZiAodmlzaXRlZC5oYXMoUmVzb3VyY2VDbGFzcykpIHJldHVyblxuXG4gIHZpc2l0ZWQuYWRkKFJlc291cmNlQ2xhc3MpXG4gIGFzc2VydEtub3duUmVzb3VyY2VTdGF0aWNDb25maWdQcm9wZXJ0aWVzKFJlc291cmNlQ2xhc3MpXG5cbiAgY29uc3Qgb3duZXIgPSBzdGF0aWNNZXRob2RPd25lckZvcihSZXNvdXJjZUNsYXNzLCBcInJlc291cmNlQ29uZmlnXCIpXG5cbiAgaWYgKG93bmVyICYmIG93bmVyICE9PSBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke1Jlc291cmNlQ2xhc3MubmFtZX0gb3ZlcnJpZGVzIHN0YXRpYyByZXNvdXJjZUNvbmZpZygpLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiBVc2Ugc3RhdGljIHJlc291cmNlIHByb3BlcnRpZXMgaW5zdGVhZC5gKVxuICB9XG5cbiAgY29uc3QgU2hhcmVkUmVzb3VyY2UgPSBSZXNvdXJjZUNsYXNzLnNoYXJlZFJlc291cmNlQ2xhc3MoKVxuXG4gIGlmIChTaGFyZWRSZXNvdXJjZSkgYXNzZXJ0UmVzb3VyY2VDb25maWdJc0ZyYW1ld29ya0RlZmluZWQoU2hhcmVkUmVzb3VyY2UsIHZpc2l0ZWQpXG59XG5cbi8qKlxuICogRW5zdXJlcyBkZWNsYXJhdGl2ZSBzdGF0aWMgcmVzb3VyY2UgY29uZmlnIGRvZXMgbm90IHNpbGVudGx5IGlnbm9yZSB0eXBvcyBvciByZW1vdmVkIGtleXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlfSBSZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0S25vd25SZXNvdXJjZVN0YXRpY0NvbmZpZ1Byb3BlcnRpZXMoUmVzb3VyY2VDbGFzcykge1xuICBsZXQgY3VycmVudENsYXNzID0gUmVzb3VyY2VDbGFzc1xuXG4gIHdoaWxlIChjdXJyZW50Q2xhc3MgJiYgY3VycmVudENsYXNzICE9PSBGcm9udGVuZE1vZGVsQmFzZVJlc291cmNlICYmIGN1cnJlbnRDbGFzcyAhPT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gICAgY29uc3QgdW5rbm93blN0YXRpY0NvbmZpZyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjdXJyZW50Q2xhc3MpKSB7XG4gICAgICBpZiAoIVJFU09VUkNFX1NUQVRJQ19DT05GSUdfS0VZUy5oYXMoa2V5KSkgdW5rbm93blN0YXRpY0NvbmZpZ1trZXldID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChjdXJyZW50Q2xhc3MpKVtrZXldXG4gICAgfVxuXG4gICAgcmVzdEFyZ3NFcnJvcih1bmtub3duU3RhdGljQ29uZmlnKVxuXG4gICAgY3VycmVudENsYXNzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnRDbGFzcylcbiAgfVxufVxuXG4vKipcbiAqIExvY2F0ZXMgd2hpY2ggY29uc3RydWN0b3Igb3ducyBhIHN0YXRpYyBtZXRob2QgaW1wbGVtZW50YXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlfSBSZXNvdXJjZUNsYXNzIC0gUmVzb3VyY2UgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSAtIE1ldGhvZCBuYW1lLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIHwgdHlwZW9mIEZyb250ZW5kTW9kZWxCYXNlUmVzb3VyY2UgfCBudWxsfSAtIENsYXNzIHRoYXQgb3ducyB0aGUgc3RhdGljIG1ldGhvZC5cbiAqL1xuZnVuY3Rpb24gc3RhdGljTWV0aG9kT3duZXJGb3IoUmVzb3VyY2VDbGFzcywgbWV0aG9kTmFtZSkge1xuICBsZXQgY3VycmVudENsYXNzID0gUmVzb3VyY2VDbGFzc1xuXG4gIHdoaWxlIChjdXJyZW50Q2xhc3MgJiYgY3VycmVudENsYXNzICE9PSBGdW5jdGlvbi5wcm90b3R5cGUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnRDbGFzcywgbWV0aG9kTmFtZSkpIHJldHVybiBjdXJyZW50Q2xhc3NcblxuICAgIGN1cnJlbnRDbGFzcyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50Q2xhc3MpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gcmVzb3VyY2VDb25maWd1cmF0aW9uIC0gUmF3IHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbn0gLSBOb3JtYWxpemVkIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb24ocmVzb3VyY2VDb25maWd1cmF0aW9uKSB7XG4gIGNvbnN0IHJlc3RBcmdzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovICh7Li4ucmVzb3VyY2VDb25maWd1cmF0aW9ufSlcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbXG4gICAgXCJhYmlsaXRpZXNcIixcbiAgICBcImF0dHJpYnV0ZXNcIixcbiAgICBcImF0dGFjaG1lbnRzXCIsXG4gICAgXCJidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzXCIsXG4gICAgXCJidWlsdEluTWVtYmVyQ29tbWFuZHNcIixcbiAgICBcImNvbGxlY3Rpb25Db21tYW5kc1wiLFxuICAgIFwiY29tbWFuZHNcIixcbiAgICBcIm1lbWJlckNvbW1hbmRzXCIsXG4gICAgXCJtb2RlbE5hbWVcIixcbiAgICBcInByaW1hcnlLZXlcIixcbiAgICBcInF1aWNrU2VhcmNoQ29sdW1uc1wiLFxuICAgIFwicXVpY2tTZWFyY2hOdW1lcmljQ29sdW1uc1wiLFxuICAgIFwicmVsYXRpb25zaGlwc1wiLFxuICAgIFwic2VydmVyXCIsXG4gICAgXCJzeW5jXCJcbiAgXSkge1xuICAgIGRlbGV0ZSByZXN0QXJnc1trZXldXG4gIH1cblxuICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuICB2YWxpZGF0ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVByaW1hcnlLZXkocmVzb3VyY2VDb25maWd1cmF0aW9uLnByaW1hcnlLZXkpXG5cbiAgY29uc3Qgbm9ybWFsaXplZENvbW1hbmRzID0gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZHMocmVzb3VyY2VDb25maWd1cmF0aW9uKVxuICBjb25zdCBzeW5jID0gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFJlc291cmNlU3luYyhyZXNvdXJjZUNvbmZpZ3VyYXRpb24pXG4gIGNvbnN0IHF1aWNrU2VhcmNoQ29sdW1ucyA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxRdWlja1NlYXJjaENvbHVtbnMocmVzb3VyY2VDb25maWd1cmF0aW9uLnF1aWNrU2VhcmNoQ29sdW1ucywgXCJxdWlja1NlYXJjaENvbHVtbnNcIilcbiAgY29uc3QgcXVpY2tTZWFyY2hOdW1lcmljQ29sdW1ucyA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxRdWlja1NlYXJjaENvbHVtbnMocmVzb3VyY2VDb25maWd1cmF0aW9uLnF1aWNrU2VhcmNoTnVtZXJpY0NvbHVtbnMsIFwicXVpY2tTZWFyY2hOdW1lcmljQ29sdW1uc1wiKVxuXG4gIHJldHVybiB7XG4gICAgLi4ucmVzb3VyY2VDb25maWd1cmF0aW9uLFxuICAgIGFiaWxpdGllczogbm9ybWFsaXplRnJvbnRlbmRNb2RlbFJlc291cmNlQWJpbGl0aWVzKHJlc291cmNlQ29uZmlndXJhdGlvbi5hYmlsaXRpZXMpLFxuICAgIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHM6IG5vcm1hbGl6ZWRDb21tYW5kcy5idWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLFxuICAgIGJ1aWx0SW5NZW1iZXJDb21tYW5kczogbm9ybWFsaXplZENvbW1hbmRzLmJ1aWx0SW5NZW1iZXJDb21tYW5kcyxcbiAgICBjb2xsZWN0aW9uQ29tbWFuZHM6IG5vcm1hbGl6ZWRDb21tYW5kcy5jb2xsZWN0aW9uQ29tbWFuZHMsXG4gICAgLy8gUGVyLWNvbW1hbmQgbWV0YWRhdGEgKHR5cGVkIGFyZ3MgKyBkZWNsYXJlZCByZXR1cm4gdHlwZSkga2V5ZWQgYnkgbWV0aG9kXG4gICAgLy8gbmFtZSwgZGVyaXZlZCBmcm9tIGB7bmFtZSwgYXJncz8sIHJldHVyblR5cGU/fWAgY29tbWFuZCBlbnRyaWVzLiBUaGVcbiAgICAvLyBnZW5lcmF0b3IgdXNlcyBpdCB0byB0eXBlIGVhY2ggY3VzdG9tIGNvbW1hbmQgbWV0aG9kLlxuICAgIGNvbW1hbmRNZXRhZGF0YTogbm9ybWFsaXplZENvbW1hbmRzLmNvbW1hbmRNZXRhZGF0YSxcbiAgICBtZW1iZXJDb21tYW5kczogbm9ybWFsaXplZENvbW1hbmRzLm1lbWJlckNvbW1hbmRzLFxuICAgIHF1aWNrU2VhcmNoQ29sdW1ucyxcbiAgICBxdWlja1NlYXJjaE51bWVyaWNDb2x1bW5zLFxuICAgIHN5bmNcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIHJlc291cmNlIHByaW1hcnkta2V5IGRlZmluaXRpb24gYmVmb3JlIGl0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIENSVUQgY29uZGl0aW9ucy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanNcIikuTW9kZWxQcmltYXJ5S2V5RGVmaW5pdGlvbiB8IHVuZGVmaW5lZH0gcHJpbWFyeUtleSAtIFJlc291cmNlIHByaW1hcnkga2V5LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlUHJpbWFyeUtleShwcmltYXJ5S2V5KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShwcmltYXJ5S2V5KSkgcmV0dXJuXG5cbiAgaWYgKHByaW1hcnlLZXkubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb3VyY2UgcHJpbWFyeUtleSBhcnJheXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBhdHRyaWJ1dGUuXCIpXG4gIH1cblxuICBpZiAobmV3IFNldChwcmltYXJ5S2V5KS5zaXplICE9PSBwcmltYXJ5S2V5Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJlc291cmNlIHByaW1hcnlLZXkgYXJyYXlzIG11c3QgY29udGFpbiB1bmlxdWUgYXR0cmlidXRlcy5cIilcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGFiaWxpdGllcy5cbiAqIEBwYXJhbSB7c3RyaW5nW10gfCB1bmRlZmluZWR9IGFiaWxpdGllcyAtIFJlc291cmNlIGFiaWxpdGllcyBjb25maWcgKGNhbWVsQ2FzZSBhY3Rpb24gbGlzdCkuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBOb3JtYWxpemVkIGFiaWxpdGllcyBjb25maWcuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZUFiaWxpdGllcyhhYmlsaXRpZXMpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGRlZmF1bHRDcnVkQWJpbGl0aWVzKClcblxuICBpZiAoYWJpbGl0aWVzID09PSB1bmRlZmluZWQpIHJldHVybiBub3JtYWxpemVkXG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGFiaWxpdGllcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvdXJjZSBhYmlsaXRpZXMgbXVzdCBiZSBhbiBhcnJheSBvZiBhY3Rpb24gbmFtZXMuIE9iamVjdCBmb3JtIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXCIpXG4gIH1cblxuICBjb25zdCBkdXBsaWNhdGVkQmFzZUFiaWxpdGllcyA9IGFiaWxpdGllcy5maWx0ZXIoKGFiaWxpdHkpID0+IEJBU0VfRlJPTlRFTkRfTU9ERUxfQUJJTElUWV9BQ1RJT05TLmluY2x1ZGVzKGFiaWxpdHkpKVxuXG4gIGlmIChkdXBsaWNhdGVkQmFzZUFiaWxpdGllcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXNvdXJjZSBhYmlsaXRpZXMgbXVzdCBub3QgaW5jbHVkZSBiYXNlIGFjdGlvbnM6ICR7ZHVwbGljYXRlZEJhc2VBYmlsaXRpZXMuam9pbihcIiwgXCIpfWApXG4gIH1cblxuICBmb3IgKGNvbnN0IGFiaWxpdHkgb2YgYWJpbGl0aWVzKSB7XG4gICAgaWYgKHR5cGVvZiBhYmlsaXR5ICE9PSBcInN0cmluZ1wiIHx8IGFiaWxpdHkubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb3VyY2UgYWJpbGl0aWVzIGVudHJpZXMgbXVzdCBiZSBub24tZW1wdHkgc3RyaW5ncy5cIilcbiAgICB9XG5cbiAgICBub3JtYWxpemVkW2FiaWxpdHldID0gYWJpbGl0eVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBSdW5zIGRlZmF1bHQgY3J1ZCBhYmlsaXRpZXMuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBEZWZhdWx0IENSVUQgYWJpbGl0eSBtYXAuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRDcnVkQWJpbGl0aWVzKCkge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZTogXCJjcmVhdGVcIixcbiAgICBkZXN0cm95OiBcImRlc3Ryb3lcIixcbiAgICBmaW5kOiBcInJlYWRcIixcbiAgICBpbmRleDogXCJyZWFkXCIsXG4gICAgdXBkYXRlOiBcInVwZGF0ZVwiXG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBmcm9udGVuZC1zYWZlIHN5bmMgbWFuaWZlc3QgZm9yIGFsbCBzeW5jLWVuYWJsZWQgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2VzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbltdfSBiYWNrZW5kUHJvamVjdHMgLSBCYWNrZW5kIHByb2plY3RzIHRvIHNjYW4uXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb24+fSAtIFN5bmMgbWV0YWRhdGEga2V5ZWQgYnkgbW9kZWwgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb250ZW5kTW9kZWxTeW5jTWFuaWZlc3RGb3JCYWNrZW5kUHJvamVjdHMoYmFja2VuZFByb2plY3RzKSB7XG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb24+fSAqL1xuICBjb25zdCBtYW5pZmVzdCA9IHt9XG5cbiAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBiYWNrZW5kUHJvamVjdHMpIHtcbiAgICBjb25zdCByZXNvdXJjZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG5cbiAgICBmb3IgKGNvbnN0IGNvbmZpZ3VyZWRNb2RlbE5hbWUgb2YgT2JqZWN0LmtleXMocmVzb3VyY2VzKS5zb3J0KCkpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IHJlc291cmNlc1tjb25maWd1cmVkTW9kZWxOYW1lXVxuICAgICAgY29uc3QgcmVzb3VyY2VDb25maWd1cmF0aW9uID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcblxuICAgICAgaWYgKCFyZXNvdXJjZUNvbmZpZ3VyYXRpb24pIGNvbnRpbnVlXG4gICAgICBpZiAoIXJlc291cmNlQ29uZmlndXJhdGlvbi5zeW5jPy5lbmFibGVkKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24ubW9kZWxOYW1lIHx8IGNvbmZpZ3VyZWRNb2RlbE5hbWVcblxuICAgICAgbWFuaWZlc3RbbW9kZWxOYW1lXSA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5zeW5jXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hbmlmZXN0XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZnJvbnRlbmQtc2FmZSBBUEkgbWFuaWZlc3QgZm9yIGFsbCByZWdpc3RlcmVkIGZyb250ZW5kLW1vZGVsXG4gKiByZXNvdXJjZXMuIFRoZSBtYW5pZmVzdCBpcyBkZXRlcm1pbmlzdGljIChzb3J0ZWQgbW9kZWwgbmFtZXMsIHNvcnRlZFxuICogYXR0cmlidXRlcywgc29ydGVkIGNvbW1hbmRzKSBhbmQgaW5jbHVkZXMgb25seSBwdWJsaWMtc2FmZSBtZXRhZGF0YTogbm9cbiAqIHNlY3JldHMsIG5vIHNlcnZlciBjYWxsYmFja3MsIG5vIGJhY2tlbmQgZmlsZSBwYXRocy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5CYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb25bXX0gYmFja2VuZFByb2plY3RzIC0gQmFja2VuZCBwcm9qZWN0cyB0byBzY2FuLlxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAtIEZyb250ZW5kLXNhZmUgQVBJIG1hbmlmZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbEFwaU1hbmlmZXN0KGJhY2tlbmRQcm9qZWN0cykge1xuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqL1xuICBjb25zdCByZXNvdXJjZXMgPSB7fVxuXG4gIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgY29uc3QgcHJvamVjdFJlc291cmNlcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcblxuICAgIGZvciAoY29uc3QgY29uZmlndXJlZE1vZGVsTmFtZSBvZiBPYmplY3Qua2V5cyhwcm9qZWN0UmVzb3VyY2VzKS5zb3J0KCkpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IHByb2plY3RSZXNvdXJjZXNbY29uZmlndXJlZE1vZGVsTmFtZV1cbiAgICAgIGNvbnN0IHJlc291cmNlQ29uZmlndXJhdGlvbiA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG4gICAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgICAgIGlmICghcmVzb3VyY2VDb25maWd1cmF0aW9uIHx8ICFyZXNvdXJjZUNsYXNzKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24ubW9kZWxOYW1lIHx8IGNvbmZpZ3VyZWRNb2RlbE5hbWVcbiAgICAgIGNvbnN0IHJlc291cmNlUGF0aCA9IGAvJHtpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoY29uZmlndXJlZE1vZGVsTmFtZSkpKX1gXG5cbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovXG4gICAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBwYXRoOiByZXNvdXJjZVBhdGgsXG4gICAgICAgIHByaW1hcnlLZXk6IHJlc291cmNlQ2xhc3MucmVzb2x2ZWRQcmltYXJ5S2V5KHJlc291cmNlQ29uZmlndXJhdGlvbiksXG4gICAgICAgIGF0dHJpYnV0ZXM6IG1hbmlmZXN0QXR0cmlidXRlcyhyZXNvdXJjZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlcyksXG4gICAgICAgIGFiaWxpdGllczogcmVzb3VyY2VDb25maWd1cmF0aW9uLmFiaWxpdGllcyxcbiAgICAgICAgYnVpbHRJbkNvbW1hbmRzOiB7XG4gICAgICAgICAgY29sbGVjdGlvbjogcmVzb3VyY2VDb25maWd1cmF0aW9uLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMsXG4gICAgICAgICAgbWVtYmVyOiByZXNvdXJjZUNvbmZpZ3VyYXRpb24uYnVpbHRJbk1lbWJlckNvbW1hbmRzXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5yZWxhdGlvbnNoaXBzXG4gICAgICBpZiAocmVsYXRpb25zaGlwcyAmJiByZWxhdGlvbnNoaXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi9cbiAgICAgICAgY29uc3QgcmVscyA9IHt9XG4gICAgICAgIGZvciAoY29uc3QgcmVsTmFtZSBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgICAgcmVsc1tyZWxOYW1lXSA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgZW50cnkucmVsYXRpb25zaGlwcyA9IHJlbHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXR0YWNobWVudHMgPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24uYXR0YWNobWVudHNcbiAgICAgIGlmIChhdHRhY2htZW50cyAmJiBPYmplY3Qua2V5cyhhdHRhY2htZW50cykubGVuZ3RoID4gMCkge1xuICAgICAgICBlbnRyeS5hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25Db21tYW5kcyA9IG1hbmlmZXN0Q29tbWFuZEVudHJpZXMoe1xuICAgICAgICBjb21tYW5kTWV0YWRhdGE6IHJlc291cmNlQ29uZmlndXJhdGlvbi5jb21tYW5kTWV0YWRhdGEgfHwge30sXG4gICAgICAgIGNvbW1hbmRzOiByZXNvdXJjZUNvbmZpZ3VyYXRpb24uY29sbGVjdGlvbkNvbW1hbmRzLFxuICAgICAgICByZXNvdXJjZVBhdGgsXG4gICAgICAgIHNjb3BlOiBcImNvbGxlY3Rpb25cIlxuICAgICAgfSlcbiAgICAgIGNvbnN0IG1lbWJlckNvbW1hbmRzID0gbWFuaWZlc3RDb21tYW5kRW50cmllcyh7XG4gICAgICAgIGNvbW1hbmRNZXRhZGF0YTogcmVzb3VyY2VDb25maWd1cmF0aW9uLmNvbW1hbmRNZXRhZGF0YSB8fCB7fSxcbiAgICAgICAgY29tbWFuZHM6IHJlc291cmNlQ29uZmlndXJhdGlvbi5tZW1iZXJDb21tYW5kcyxcbiAgICAgICAgcmVzb3VyY2VQYXRoLFxuICAgICAgICBzY29wZTogXCJtZW1iZXJcIlxuICAgICAgfSlcblxuICAgICAgaWYgKGNvbGxlY3Rpb25Db21tYW5kcy5sZW5ndGggPiAwIHx8IG1lbWJlckNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi9cbiAgICAgICAgY29uc3QgY21kcyA9IHt9XG4gICAgICAgIGlmIChjb2xsZWN0aW9uQ29tbWFuZHMubGVuZ3RoID4gMCkgY21kc1tcImNvbGxlY3Rpb25cIl0gPSBjb2xsZWN0aW9uQ29tbWFuZHNcbiAgICAgICAgaWYgKG1lbWJlckNvbW1hbmRzLmxlbmd0aCA+IDApIGNtZHNbXCJtZW1iZXJcIl0gPSBtZW1iZXJDb21tYW5kc1xuICAgICAgICBlbnRyeS5jb21tYW5kcyA9IGNtZHNcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc291cmNlQ29uZmlndXJhdGlvbi5zeW5jPy5lbmFibGVkKSB7XG4gICAgICAgIGVudHJ5LnN5bmMgPSByZXNvdXJjZUNvbmZpZ3VyYXRpb24uc3luY1xuICAgICAgfVxuXG4gICAgICByZXNvdXJjZXNbY29uZmlndXJlZE1vZGVsTmFtZV0gPSBlbnRyeVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0VmVyc2lvbjogMSxcbiAgICByZXNvdXJjZXM6IE9iamVjdC5rZXlzKHJlc291cmNlcykuc29ydCgpLnJlZHVjZSgoc29ydGVkLCBrZXkpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChzb3J0ZWQpW2tleV0gPSByZXNvdXJjZXNba2V5XVxuICAgICAgcmV0dXJuIHNvcnRlZFxuICAgIH0sIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh7fSkpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHJlc291cmNlIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBpbnRvIGEgc29ydGVkIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhdHRyaWJ1dGVzIC0gUmF3IGF0dHJpYnV0ZXMgY29uZmlnIChhcnJheSBvciBvYmplY3QpLlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIFNvcnRlZCBhdHRyaWJ1dGUgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIG1hbmlmZXN0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKSB7XG4gIGlmICghYXR0cmlidXRlcykgcmV0dXJuIFtdXG5cbiAgbGV0IG5hbWVzXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYXR0cmlidXRlcykpIHtcbiAgICBuYW1lcyA9IGF0dHJpYnV0ZXMubWFwKChlbnRyeSkgPT4gdHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiID8gZW50cnkgOiBlbnRyeS5uYW1lKS5maWx0ZXIoQm9vbGVhbilcbiAgfSBlbHNlIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSB7XG4gICAgbmFtZXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIG5hbWVzLnNvcnQoKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBtYW5pZmVzdC1zYWZlIGNvbW1hbmQgZW50cnkgbGlzdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB7YXJnczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHN0cmluZyB8IG51bGx9Pn0gYXJncy5jb21tYW5kTWV0YWRhdGEgLSBQZXItY29tbWFuZCBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gYXJncy5jb21tYW5kcyAtIE1ldGhvZCBuYW1lIOKGkiBrZWJhYiBzbHVnIG1hcC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlc291cmNlUGF0aCAtIFJlc291cmNlIHBhdGguXG4gKiBAcGFyYW0ge1wiY29sbGVjdGlvblwiIHwgXCJtZW1iZXJcIn0gYXJncy5zY29wZSAtIENvbW1hbmQgc2NvcGUuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj5bXX0gLSBNYW5pZmVzdCBjb21tYW5kIGVudHJpZXMuXG4gKi9cbmZ1bmN0aW9uIG1hbmlmZXN0Q29tbWFuZEVudHJpZXMoe2NvbW1hbmRNZXRhZGF0YSwgY29tbWFuZHMsIHJlc291cmNlUGF0aCwgc2NvcGV9KSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhjb21tYW5kcykuc29ydCgpLm1hcCgobWV0aG9kTmFtZSkgPT4ge1xuICAgIGNvbnN0IHNsdWcgPSBjb21tYW5kc1ttZXRob2ROYW1lXVxuICAgIGNvbnN0IG1ldGFkYXRhID0gY29tbWFuZE1ldGFkYXRhW21ldGhvZE5hbWVdIHx8IHthcmdzOiBbXSwgcmV0dXJuVHlwZTogbnVsbH1cbiAgICBjb25zdCBwYXRoID0gc2NvcGUgPT09IFwibWVtYmVyXCJcbiAgICAgID8gYCR7cmVzb3VyY2VQYXRofS88aWQ+LyR7c2x1Z31gXG4gICAgICA6IGAke3Jlc291cmNlUGF0aH0vJHtzbHVnfWBcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovXG4gICAgY29uc3QgZW50cnkgPSB7XG4gICAgICBtZXRob2ROYW1lLFxuICAgICAgc2NvcGUsXG4gICAgICBwYXRoLFxuICAgICAgYXJnczogbWV0YWRhdGEuYXJnc1xuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5yZXR1cm5UeXBlKSB7XG4gICAgICBlbnRyeS5yZXR1cm5UeXBlID0gbWV0YWRhdGEucmV0dXJuVHlwZVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyeVxuICB9KVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgc3luYyBwb2xpY3kgbWV0YWRhdGEgYW5kIGNvbXB1dGVzIGEgZGV0ZXJtaW5pc3RpYyBoYXNoIGZyb20gc2FmZSBwb2xpY3kgaW5wdXRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IHJlc291cmNlQ29uZmlndXJhdGlvbiAtIFJhdyByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmNDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkfSAtIEZyb250ZW5kLXNhZmUgc3luYyBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFJlc291cmNlU3luYyhyZXNvdXJjZUNvbmZpZ3VyYXRpb24pIHtcbiAgY29uc3Qgc3luYyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5zeW5jXG5cbiAgaWYgKHN5bmMgPT09IHVuZGVmaW5lZCB8fCBzeW5jID09PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkXG4gIGlmIChzeW5jID09PSBmYWxzZSkgcmV0dXJuIHtjb25mbGljdFN0cmF0ZWd5OiBcIm9wdGltaXN0aWNWZXJzaW9uXCIsIGVuYWJsZWQ6IGZhbHNlLCBvcGVyYXRpb25zOiBbXSwgcG9saWN5SGFzaDogc3luY1BvbGljeUhhc2goe2NvbmZsaWN0U3RyYXRlZ3k6IFwib3B0aW1pc3RpY1ZlcnNpb25cIiwgZW5hYmxlZDogZmFsc2V9KSwgcG9saWN5VmVyc2lvbjogbnVsbH1cbiAgaWYgKHN5bmMgPT09IHRydWUpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRnJvbnRlbmRNb2RlbFJlc291cmNlU3luYyh7XG4gICAgICAuLi5yZXNvdXJjZUNvbmZpZ3VyYXRpb24sXG4gICAgICBzeW5jOiB7b3BlcmF0aW9uczogW1wiaW5kZXhcIiwgXCJmaW5kXCJdfVxuICAgIH0pXG4gIH1cbiAgaWYgKCFzeW5jIHx8IHR5cGVvZiBzeW5jICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoc3luYykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvdXJjZSBzeW5jIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSB0cnVlLCBmYWxzZSwgb3IgYW4gb2JqZWN0LlwiKVxuICB9XG5cbiAgY29uc3Qge2NvbmZsaWN0U3RyYXRlZ3ksIGVuYWJsZWQgPSB0cnVlLCBtZXRhZGF0YSwgb3BlcmF0aW9ucywgcG9saWN5LCBwb2xpY3lWZXJzaW9uLCAuLi5yZXN0fSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jQ29uZmlndXJhdGlvbn0gKi8gKHN5bmMpXG5cbiAgaWYgKE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc3luYyBrZXlzOiAke09iamVjdC5rZXlzKHJlc3QpLmpvaW4oXCIsIFwiKX0uIEFsbG93ZWQ6IGNvbmZsaWN0U3RyYXRlZ3ksIGVuYWJsZWQsIG1ldGFkYXRhLCBvcGVyYXRpb25zLCBwb2xpY3ksIHBvbGljeVZlcnNpb25gKVxuICB9XG4gIGlmIChlbmFibGVkICE9PSB0cnVlICYmIGVuYWJsZWQgIT09IGZhbHNlKSB0aHJvdyBuZXcgRXJyb3IoXCJSZXNvdXJjZSBzeW5jIGVuYWJsZWQgbXVzdCBiZSB0cnVlIG9yIGZhbHNlIHdoZW4gcHJvdmlkZWQuXCIpXG5cbiAgY29uc3Qgbm9ybWFsaXplZENvbmZsaWN0U3RyYXRlZ3kgPSBub3JtYWxpemVTeW5jQ29uZmxpY3RTdHJhdGVneShjb25mbGljdFN0cmF0ZWd5KVxuICBjb25zdCBub3JtYWxpemVkT3BlcmF0aW9ucyA9IG5vcm1hbGl6ZVN5bmNPcGVyYXRpb25zKG9wZXJhdGlvbnMpXG4gIGNvbnN0IG5vcm1hbGl6ZWRNZXRhZGF0YSA9IG1ldGFkYXRhID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBkZXRlcm1pbmlzdGljU3luY0pzb24oe2xhYmVsOiBcIm1ldGFkYXRhXCIsIHZhbHVlOiBtZXRhZGF0YX0pXG4gIGNvbnN0IG5vcm1hbGl6ZWRQb2xpY3kgPSBwb2xpY3kgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGRldGVybWluaXN0aWNTeW5jSnNvbih7bGFiZWw6IFwicG9saWN5XCIsIHZhbHVlOiBwb2xpY3l9KVxuICBjb25zdCBub3JtYWxpemVkUG9saWN5VmVyc2lvbiA9IHBvbGljeVZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBwb2xpY3lWZXJzaW9uID09PSBudWxsID8gbnVsbCA6IFN0cmluZyhwb2xpY3lWZXJzaW9uKVxuICBjb25zdCBoYXNoSW5wdXQgPSB7XG4gICAgY29uZmxpY3RTdHJhdGVneTogbm9ybWFsaXplZENvbmZsaWN0U3RyYXRlZ3ksXG4gICAgZW5hYmxlZCxcbiAgICBtZXRhZGF0YTogbm9ybWFsaXplZE1ldGFkYXRhLFxuICAgIG1vZGVsTmFtZTogcmVzb3VyY2VDb25maWd1cmF0aW9uLm1vZGVsTmFtZSB8fCBudWxsLFxuICAgIG9wZXJhdGlvbnM6IG5vcm1hbGl6ZWRPcGVyYXRpb25zLFxuICAgIHBvbGljeTogbm9ybWFsaXplZFBvbGljeSxcbiAgICBwb2xpY3lWZXJzaW9uOiBub3JtYWxpemVkUG9saWN5VmVyc2lvblxuICB9XG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Ob3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb259ICovXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgY29uZmxpY3RTdHJhdGVneTogbm9ybWFsaXplZENvbmZsaWN0U3RyYXRlZ3ksXG4gICAgZW5hYmxlZCxcbiAgICBvcGVyYXRpb25zOiBub3JtYWxpemVkT3BlcmF0aW9ucyxcbiAgICBwb2xpY3lIYXNoOiBzeW5jUG9saWN5SGFzaChoYXNoSW5wdXQpLFxuICAgIHBvbGljeVZlcnNpb246IG5vcm1hbGl6ZWRQb2xpY3lWZXJzaW9uXG4gIH1cblxuICBpZiAobm9ybWFsaXplZE1ldGFkYXRhICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQubWV0YWRhdGEgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSAqLyAobm9ybWFsaXplZE1ldGFkYXRhKVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyB0aGUgc3luYyBjb25mbGljdCBzdHJhdGVneSBmb3IgcmVwbGF5IGNsaWVudHMvc2VydmVycy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gY29uZmxpY3RTdHJhdGVneSAtIFJhdyBzdHJhdGVneS5cbiAqIEByZXR1cm5zIHtcIm9wdGltaXN0aWNWZXJzaW9uXCIgfCBcInNlcnZlcldpbnNcIiB8IFwibGFzdFdyaXRlcldpbnNcIiB8IFwiZmllbGRUaHJlZVdheVwiIHwgXCJhcHBlbmRPbmx5XCJ9IC0gTm9ybWFsaXplZCBzdHJhdGVneS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU3luY0NvbmZsaWN0U3RyYXRlZ3koY29uZmxpY3RTdHJhdGVneSkge1xuICBpZiAoY29uZmxpY3RTdHJhdGVneSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZsaWN0U3RyYXRlZ3kgPT09IG51bGwpIHJldHVybiBcIm9wdGltaXN0aWNWZXJzaW9uXCJcbiAgaWYgKFtcIm9wdGltaXN0aWNWZXJzaW9uXCIsIFwic2VydmVyV2luc1wiLCBcImxhc3RXcml0ZXJXaW5zXCIsIFwiZmllbGRUaHJlZVdheVwiLCBcImFwcGVuZE9ubHlcIl0uaW5jbHVkZXMoU3RyaW5nKGNvbmZsaWN0U3RyYXRlZ3kpKSkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1wib3B0aW1pc3RpY1ZlcnNpb25cIiB8IFwic2VydmVyV2luc1wiIHwgXCJsYXN0V3JpdGVyV2luc1wiIHwgXCJmaWVsZFRocmVlV2F5XCIgfCBcImFwcGVuZE9ubHlcIn0gKi8gKGNvbmZsaWN0U3RyYXRlZ3kpXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVzb3VyY2Ugc3luYyBjb25mbGljdFN0cmF0ZWd5OiAke1N0cmluZyhjb25mbGljdFN0cmF0ZWd5KX1gKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgc3luYyBvcGVyYXRpb25zIGludG8gYSBzdGFibGUsIGR1cGxpY2F0ZS1mcmVlIGxpc3QuXG4gKiBAcGFyYW0ge3Vua25vd259IG9wZXJhdGlvbnMgLSBSYXcgb3BlcmF0aW9ucyB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBOb3JtYWxpemVkIG9wZXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN5bmNPcGVyYXRpb25zKG9wZXJhdGlvbnMpIHtcbiAgaWYgKG9wZXJhdGlvbnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdXG4gIGlmICghQXJyYXkuaXNBcnJheShvcGVyYXRpb25zKSkgdGhyb3cgbmV3IEVycm9yKFwiUmVzb3VyY2Ugc3luYyBvcGVyYXRpb25zIG11c3QgYmUgYW4gYXJyYXkgb2Ygb3BlcmF0aW9uIG5hbWVzLlwiKVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBvcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcGVyYXRpb24gIT09IFwic3RyaW5nXCIgfHwgb3BlcmF0aW9uLmxlbmd0aCA8IDEpIHRocm93IG5ldyBFcnJvcihcIlJlc291cmNlIHN5bmMgb3BlcmF0aW9ucyBlbnRyaWVzIG11c3QgYmUgbm9uLWVtcHR5IHN0cmluZ3MuXCIpXG5cbiAgICByZXR1cm4gb3BlcmF0aW9uXG4gIH0pXG5cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KG5vcm1hbGl6ZWQpXS5zb3J0KClcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGRlY2xhcmF0aXZlIHF1aWNrLXNlYXJjaCBjb2x1bW4gZW50cmllcyBpbnRvIGEgc3RhYmxlIGxpc3QuXG4gKiBFYWNoIGVudHJ5IGlzIGEgcGxhaW4gY29sdW1uLW5hbWUgc3RyaW5nIG9yIGEgYHtwYXRoLCBjb2x1bW59YCBvYmplY3Qgd2hvc2VcbiAqIHBhdGggaXMgYSByZWxhdGlvbnNoaXAgcGF0aCBmcm9tIHRoZSByb290IG1vZGVsLlxuICogQHBhcmFtIHt1bmtub3dufSBjb2x1bW5zIC0gUmF3IHF1aWNrLXNlYXJjaCBjb2x1bW4gZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gQ29uZmlnIGtleSBsYWJlbCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcmV0dXJucyB7QXJyYXk8aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUXVpY2tTZWFyY2hDb2x1bW4+IHwgbnVsbH0gLSBOb3JtYWxpemVkIGNvbHVtbnMsIG9yIG51bGwgd2hlbiB1bmRlY2xhcmVkLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsUXVpY2tTZWFyY2hDb2x1bW5zKGNvbHVtbnMsIGxhYmVsKSB7XG4gIGlmIChjb2x1bW5zID09PSB1bmRlZmluZWQgfHwgY29sdW1ucyA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoY29sdW1ucykpIHRocm93IG5ldyBFcnJvcihgUmVzb3VyY2UgJHtsYWJlbH0gbXVzdCBiZSBhbiBhcnJheSBvZiBjb2x1bW4gbmFtZXMgb3Ige3BhdGgsIGNvbHVtbn0gb2JqZWN0cy5gKVxuXG4gIHJldHVybiBjb2x1bW5zLm1hcCgoZW50cnkpID0+IHtcbiAgICBpZiAodHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoZW50cnkubGVuZ3RoIDwgMSkgdGhyb3cgbmV3IEVycm9yKGBSZXNvdXJjZSAke2xhYmVsfSBlbnRyaWVzIG11c3QgYmUgbm9uLWVtcHR5IGNvbHVtbiBuYW1lcy5gKVxuXG4gICAgICByZXR1cm4ge2NvbHVtbjogZW50cnl9XG4gICAgfVxuXG4gICAgaWYgKCFlbnRyeSB8fCB0eXBlb2YgZW50cnkgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShlbnRyeSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVzb3VyY2UgJHtsYWJlbH0gZW50cmllcyBtdXN0IGJlIGNvbHVtbiBuYW1lcyBvciB7cGF0aCwgY29sdW1ufSBvYmplY3RzLCBnb3Q6ICR7SlNPTi5zdHJpbmdpZnkoZW50cnkpfWApXG4gICAgfVxuXG4gICAgY29uc3QgZW50cnlSZWNvcmQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoZW50cnkpXG4gICAgY29uc3QgY29sdW1uID0gZW50cnlSZWNvcmQuY29sdW1uXG4gICAgY29uc3QgcGF0aCA9IGVudHJ5UmVjb3JkLnBhdGhcblxuICAgIGlmICh0eXBlb2YgY29sdW1uICE9PSBcInN0cmluZ1wiIHx8IGNvbHVtbi5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoYFJlc291cmNlICR7bGFiZWx9IGVudHJpZXMgcmVxdWlyZSBhIG5vbi1lbXB0eSBjb2x1bW4gbmFtZS5gKVxuXG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCB8fCBwYXRoID09PSBudWxsKSByZXR1cm4ge2NvbHVtbn1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSB8fCBwYXRoLnNvbWUoKHBhdGhTZWdtZW50KSA9PiB0eXBlb2YgcGF0aFNlZ21lbnQgIT09IFwic3RyaW5nXCIgfHwgcGF0aFNlZ21lbnQubGVuZ3RoIDwgMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVzb3VyY2UgJHtsYWJlbH0gZW50cnkgcGF0aHMgbXVzdCBiZSBhcnJheXMgb2Ygbm9uLWVtcHR5IHJlbGF0aW9uc2hpcCBuYW1lcy5gKVxuICAgIH1cblxuICAgIHJldHVybiB7Y29sdW1uLCBwYXRoOiBbLi4ucGF0aF19XG4gIH0pXG59XG5cbi8qKlxuICogQnVpbGRzIGEgZGV0ZXJtaW5pc3RpYyBwb2xpY3kgaGFzaC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBIYXNoIGlucHV0LlxuICogQHJldHVybnMge3N0cmluZ30gLSBzaGEyNTYtcHJlZml4ZWQgaGFzaC5cbiAqL1xuZnVuY3Rpb24gc3luY1BvbGljeUhhc2godmFsdWUpIHtcbiAgcmV0dXJuIGBzaGEyNTYtJHtzaGEyNTZIZXgoc3RhYmxlSnNvblN0cmluZ2lmeSh2YWx1ZSkpfWBcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCBhIHN5bmMgY29uZmlnIHN1YnRyZWUgaXMgZGV0ZXJtaW5pc3RpYyBKU09OIGFuZCBkb2VzIG5vdCBjb250YWluIG9idmlvdXMgc2VjcmV0cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubGFiZWwgLSBEaWFnbm9zdGljIHBhdGggbGFiZWwuXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MudmFsdWUgLSBWYWx1ZSB0byB2YWxpZGF0ZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlfSAtIFN0YWJsZSBKU09OIHZhbHVlLlxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmlzdGljU3luY0pzb24oe2xhYmVsLCB2YWx1ZX0pIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHZhbHVlXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgoZW50cnksIGluZGV4KSA9PiBkZXRlcm1pbmlzdGljU3luY0pzb24oe2xhYmVsOiBgJHtsYWJlbH0vJHtpbmRleH1gLCB2YWx1ZTogZW50cnl9KSlcbiAgfVxuXG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpKSB7XG4gICAgICBjb25zdCBjaGlsZFZhbHVlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKVtrZXldXG5cbiAgICAgIGlmIChjaGlsZFZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICBpZiAoc3luY0NvbmZpZ0tleUxvb2tzU2VjcmV0KGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIHBvbGljeSAke2xhYmVsfS8ke2tleX0gaXMgbm90IGFsbG93ZWQgaW4gZnJvbnRlbmQtdmlzaWJsZSBzeW5jIHBvbGljeSBjb25maWdgKVxuICAgICAgfVxuXG4gICAgICBub3JtYWxpemVkW2tleV0gPSBkZXRlcm1pbmlzdGljU3luY0pzb24oe2xhYmVsOiBgJHtsYWJlbH0vJHtrZXl9YCwgdmFsdWU6IGNoaWxkVmFsdWV9KVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIHBvbGljeSBpbnB1dCBtdXN0IGJlIGRldGVybWluaXN0aWMgSlNPTlwiKVxufVxuXG4vKipcbiAqIFN0YWJsZSBKU09OIHN0cmluZ2lmaWVyIHdpdGggc29ydGVkIG9iamVjdCBrZXlzLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFZhbHVlIHRvIHN0cmluZ2lmeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIEpTT04uXG4gKi9cbmZ1bmN0aW9uIHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRldGVybWluaXN0aWNTeW5jSnNvbih7bGFiZWw6IFwiaGFzaFwiLCB2YWx1ZX0pKVxufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBhIHN5bmMgY29uZmlnIGtleSBsb29rcyBsaWtlIGEgY3JlZGVudGlhbC9zZWNyZXQuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gT2JqZWN0IGtleS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIga2V5IGlzIGRpc2FsbG93ZWQuXG4gKi9cbmZ1bmN0aW9uIHN5bmNDb25maWdLZXlMb29rc1NlY3JldChrZXkpIHtcbiAgcmV0dXJuIC9zZWNyZXR8dG9rZW58cGFzc3dvcmR8cHJpdmF0ZS4/a2V5fHNpZ25pbmcuP2tleS9pLnRlc3Qoa2V5KVxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGNvbW1hbmRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb259IHJlc291cmNlQ29uZmlndXJhdGlvbiAtIFJhdyByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMge3tidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBidWlsdEluTWVtYmVyQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGNvbGxlY3Rpb25Db21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgY29tbWFuZE1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB7YXJnczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHN0cmluZyB8IG51bGx9PiwgbWVtYmVyQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz59fSAtIE5vcm1hbGl6ZWQgY29tbWFuZCBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsUmVzb3VyY2VDb21tYW5kcyhyZXNvdXJjZUNvbmZpZ3VyYXRpb24pIHtcbiAgY29uc3QgYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5idWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzXG4gIGNvbnN0IGJ1aWx0SW5NZW1iZXJDb21tYW5kcyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5idWlsdEluTWVtYmVyQ29tbWFuZHNcbiAgY29uc3QgY3VzdG9tQ29sbGVjdGlvbkNvbW1hbmRzID0gcmVzb3VyY2VDb25maWd1cmF0aW9uLmNvbGxlY3Rpb25Db21tYW5kc1xuICBjb25zdCBjdXN0b21NZW1iZXJDb21tYW5kcyA9IHJlc291cmNlQ29uZmlndXJhdGlvbi5tZW1iZXJDb21tYW5kc1xuICBjb25zdCBub3JtYWxpemVkQnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kcyA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxCdWlsdEluQ29tbWFuZHMoe1xuICAgIGNvbW1hbmREZWZhdWx0czoge1xuICAgICAgY3JlYXRlOiBcImNyZWF0ZVwiLFxuICAgICAgaW5kZXg6IFwiaW5kZXhcIlxuICAgIH0sXG4gICAgY29tbWFuZHNDb25maWc6IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMsXG4gICAgbW9kZWxOYW1lOiBcIkNvbGxlY3Rpb25Db21tYW5kXCJcbiAgfSlcbiAgY29uc3Qgbm9ybWFsaXplZEJ1aWx0SW5NZW1iZXJDb21tYW5kcyA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxCdWlsdEluQ29tbWFuZHMoe1xuICAgIGNvbW1hbmREZWZhdWx0czoge1xuICAgICAgYXR0YWNoOiBcImF0dGFjaFwiLFxuICAgICAgYXR0YWNobWVudExpc3Q6IFwiYXR0YWNobWVudExpc3RcIixcbiAgICAgIGRlc3Ryb3k6IFwiZGVzdHJveVwiLFxuICAgICAgZG93bmxvYWQ6IFwiZG93bmxvYWRcIixcbiAgICAgIGZpbmQ6IFwiZmluZFwiLFxuICAgICAgdXBkYXRlOiBcInVwZGF0ZVwiLFxuICAgICAgdXJsOiBcInVybFwiXG4gICAgfSxcbiAgICBjb21tYW5kc0NvbmZpZzogYnVpbHRJbk1lbWJlckNvbW1hbmRzLFxuICAgIG1vZGVsTmFtZTogXCJNZW1iZXJDb21tYW5kXCJcbiAgfSlcblxuICBjb25zdCBub3JtYWxpemVkQ29sbGVjdGlvbkNvbW1hbmRzID0gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRzKHtjb21tYW5kc0NvbmZpZzogY3VzdG9tQ29sbGVjdGlvbkNvbW1hbmRzLCBtb2RlbE5hbWU6IFwiQ29sbGVjdGlvbkNvbW1hbmRcIn0pXG4gIGNvbnN0IG5vcm1hbGl6ZWRNZW1iZXJDb21tYW5kcyA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kcyh7Y29tbWFuZHNDb25maWc6IGN1c3RvbU1lbWJlckNvbW1hbmRzLCBtb2RlbE5hbWU6IFwiTWVtYmVyQ29tbWFuZFwifSlcblxuICByZXR1cm4ge1xuICAgIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHM6IG5vcm1hbGl6ZWRCdWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLFxuICAgIGJ1aWx0SW5NZW1iZXJDb21tYW5kczogbm9ybWFsaXplZEJ1aWx0SW5NZW1iZXJDb21tYW5kcyxcbiAgICBjb2xsZWN0aW9uQ29tbWFuZHM6IG5vcm1hbGl6ZWRDb2xsZWN0aW9uQ29tbWFuZHMuY29tbWFuZHMsXG4gICAgY29tbWFuZE1ldGFkYXRhOiB7Li4ubm9ybWFsaXplZENvbGxlY3Rpb25Db21tYW5kcy5tZXRhZGF0YSwgLi4ubm9ybWFsaXplZE1lbWJlckNvbW1hbmRzLm1ldGFkYXRhfSxcbiAgICBtZW1iZXJDb21tYW5kczogbm9ybWFsaXplZE1lbWJlckNvbW1hbmRzLmNvbW1hbmRzXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCBidWlsdCBpbiBjb21tYW5kcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBhcmdzLmNvbW1hbmREZWZhdWx0cyAtIEJ1aWx0LWluIGRlZmF1bHQgY29tbWFuZCBuYW1lcy5cbiAqIEBwYXJhbSB7c3RyaW5nW10gfCB1bmRlZmluZWR9IGFyZ3MuY29tbWFuZHNDb25maWcgLSBCdWlsdC1pbiBjb21tYW5kcyBjb25maWcgKGNhbWVsQ2FzZSBjb21tYW5kIHR5cGUgbGlzdCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tb2RlbE5hbWUgLSBEaWFnbm9zdGljIG1vZGVsIG5hbWUuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBOb3JtYWxpemVkIGJ1aWx0LWluIGNvbW1hbmQgY29uZmlnLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsQnVpbHRJbkNvbW1hbmRzKHtjb21tYW5kRGVmYXVsdHMsIGNvbW1hbmRzQ29uZmlnLCBtb2RlbE5hbWV9KSB7XG4gIGlmICghY29tbWFuZHNDb25maWcpIHtcbiAgICByZXR1cm4gY29tbWFuZERlZmF1bHRzXG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkoY29tbWFuZHNDb25maWcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gY29uZmlndXJhdGlvbiBtdXN0IHVzZSB0aGUgYXJyYXkgZm9ybS4gT2JqZWN0IGZvcm0gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5gKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZWQgY29tbWFuZHMuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBub3JtYWxpemVkQ29tbWFuZHMgPSB7fVxuXG4gIGZvciAoY29uc3QgY29tbWFuZFR5cGUgb2YgY29tbWFuZHNDb25maWcpIHtcbiAgICBjb25zdCBkZWZhdWx0Q29tbWFuZE5hbWUgPSBjb21tYW5kRGVmYXVsdHNbY29tbWFuZFR5cGVdXG5cbiAgICBpZiAoIWRlZmF1bHRDb21tYW5kTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGJ1aWx0LWluIGZyb250ZW5kIG1vZGVsIGNvbW1hbmQgJyR7Y29tbWFuZFR5cGV9JyBmb3IgJHttb2RlbE5hbWV9YClcbiAgICB9XG5cbiAgICBub3JtYWxpemVkQ29tbWFuZHNbY29tbWFuZFR5cGVdID0gdmFsaWRhdGVGcm9udGVuZE1vZGVsUmVzb3VyY2VDb21tYW5kTmFtZSh7XG4gICAgICBjb21tYW5kTmFtZTogZGVmYXVsdENvbW1hbmROYW1lLFxuICAgICAgY29tbWFuZFR5cGU6IGRlZmF1bHRDb21tYW5kTmFtZSxcbiAgICAgIG1vZGVsTmFtZVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZENvbW1hbmRzXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgZnJvbnRlbmQgbW9kZWwgY3VzdG9tIGNvbW1hbmRzLiBFbnRyaWVzIGFyZSBlaXRoZXIgYSBwbGFpblxuICogY2FtZWxDYXNlIG1ldGhvZC1uYW1lIHN0cmluZyBvciBhIGB7bmFtZSwgYXJncz8sIHJldHVyblR5cGU/fWAgb2JqZWN0IHRoYXRcbiAqIGFsc28gZGVjbGFyZXMgdGhlIGNvbW1hbmQncyB0eXBlZCBhcmd1bWVudHMgYW5kL29yIHJlc3BvbnNlIHR5cGUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwge25hbWU6IHN0cmluZywgYXJncz86IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+LCByZXR1cm5UeXBlPzogc3RyaW5nfT4gfCB1bmRlZmluZWR9IGFyZ3MuY29tbWFuZHNDb25maWcgLSBDdXN0b20gY29tbWFuZHMgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubW9kZWxOYW1lIC0gRGlhZ25vc3RpYyBtb2RlbCBuYW1lLlxuICogQHJldHVybnMge3tjb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+fX0gLSBSb3V0ZSBtYXAgKG1ldGhvZCBuYW1lIOKGkiBrZWJhYiBzbHVnKSArIHBlci1jb21tYW5kIG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVGcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZHMoe2NvbW1hbmRzQ29uZmlnLCBtb2RlbE5hbWV9KSB7XG4gIGlmICghY29tbWFuZHNDb25maWcpIHtcbiAgICByZXR1cm4ge2NvbW1hbmRzOiB7fSwgbWV0YWRhdGE6IHt9fVxuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGNvbW1hbmRzQ29uZmlnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9IGNvbmZpZ3VyYXRpb24gbXVzdCB1c2UgdGhlIGFycmF5IGZvcm0uIE9iamVjdCBmb3JtIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuYClcbiAgfVxuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3QgY29tbWFuZHMgPSB7fVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+fSAqL1xuICBjb25zdCBtZXRhZGF0YSA9IHt9XG5cbiAgZm9yIChjb25zdCBjb21tYW5kRW50cnkgb2YgY29tbWFuZHNDb25maWcpIHtcbiAgICBjb25zdCB7bWV0aG9kTmFtZSwgYXJncywgcmV0dXJuVHlwZX0gPSBub3JtYWxpemVGcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZEVudHJ5KHtjb21tYW5kRW50cnksIG1vZGVsTmFtZX0pXG4gICAgY29uc3QgdmFsaWRhdGVkTWV0aG9kTmFtZSA9IHZhbGlkYXRlRnJvbnRlbmRNb2RlbFJlc291cmNlQ29tbWFuZE5hbWUoe1xuICAgICAgY29tbWFuZE5hbWU6IG1ldGhvZE5hbWUsXG4gICAgICBjb21tYW5kVHlwZTogbWV0aG9kTmFtZSxcbiAgICAgIG1vZGVsTmFtZVxuICAgIH0pXG4gICAgY29uc3QgY29tbWFuZFNsdWcgPSBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUodmFsaWRhdGVkTWV0aG9kTmFtZSkpXG5cbiAgICBjb21tYW5kc1t2YWxpZGF0ZWRNZXRob2ROYW1lXSA9IGNvbW1hbmRTbHVnXG4gICAgbWV0YWRhdGFbdmFsaWRhdGVkTWV0aG9kTmFtZV0gPSB7YXJncywgcmV0dXJuVHlwZX1cbiAgfVxuXG4gIHJldHVybiB7Y29tbWFuZHMsIG1ldGFkYXRhfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgb25lIGN1c3RvbS1jb21tYW5kIGVudHJ5IChzdHJpbmcgc2hvcnRoYW5kIG9yIGNvbnRyYWN0IG9iamVjdCkuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy5jb21tYW5kRW50cnkgLSBSYXcgY29tbWFuZCBlbnRyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1vZGVsTmFtZSAtIERpYWdub3N0aWMgbW9kZWwgbmFtZS5cbiAqIEByZXR1cm5zIHt7bWV0aG9kTmFtZTogc3RyaW5nLCBhcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH19IC0gTWV0aG9kIG5hbWUgKyBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRFbnRyeSh7Y29tbWFuZEVudHJ5LCBtb2RlbE5hbWV9KSB7XG4gIGlmICh0eXBlb2YgY29tbWFuZEVudHJ5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHttZXRob2ROYW1lOiBjb21tYW5kRW50cnksIGFyZ3M6IFtdLCByZXR1cm5UeXBlOiBudWxsfVxuICB9XG5cbiAgaWYgKCFjb21tYW5kRW50cnkgfHwgdHlwZW9mIGNvbW1hbmRFbnRyeSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNvbW1hbmRFbnRyeSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSBlbnRyaWVzIG11c3QgYmUgYSBjYW1lbENhc2UgbmFtZSBzdHJpbmcgb3IgYSB7bmFtZSwgYXJncz8sIHJldHVyblR5cGU/fSBvYmplY3RgKVxuICB9XG5cbiAgY29uc3Qge25hbWUsIGFyZ3MsIHJldHVyblR5cGUsIC4uLnJlc3R9ID0gLyoqIEB0eXBlIHt7bmFtZT86IHVua25vd24sIGFyZ3M/OiB1bmtub3duLCByZXR1cm5UeXBlPzogdW5rbm93bn19ICovIChjb21tYW5kRW50cnkpXG5cbiAgaWYgKE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgJHttb2RlbE5hbWV9IGtleXM6ICR7T2JqZWN0LmtleXMocmVzdCkuam9pbihcIiwgXCIpfS4gQWxsb3dlZDogbmFtZSwgYXJncywgcmV0dXJuVHlwZWApXG4gIH1cblxuICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIgfHwgbmFtZS5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21vZGVsTmFtZX0gb2JqZWN0IGVudHJpZXMgcmVxdWlyZSBhIG5vbi1lbXB0eSAnbmFtZScgc3RyaW5nYClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWV0aG9kTmFtZTogbmFtZSxcbiAgICBhcmdzOiBub3JtYWxpemVGcm9udGVuZE1vZGVsQ29tbWFuZEFyZ3Moe2FyZ3MsIGNvbW1hbmROYW1lOiBuYW1lLCBtb2RlbE5hbWV9KSxcbiAgICByZXR1cm5UeXBlOiBub3JtYWxpemVGcm9udGVuZE1vZGVsQ29tbWFuZFJldHVyblR5cGUoe2NvbW1hbmROYW1lOiBuYW1lLCBtb2RlbE5hbWUsIHJldHVyblR5cGV9KVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGFuZCBub3JtYWxpemVzIGEgY3VzdG9tIGNvbW1hbmQncyB0eXBlZC1hcmd1bWVudCBsaXN0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MuYXJncyAtIFJhdyBjb21tYW5kIGFyZ3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21tYW5kTmFtZSAtIENvbW1hbmQgbmFtZSBmb3IgZGlhZ25vc3RpY3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tb2RlbE5hbWUgLSBEaWFnbm9zdGljIG1vZGVsIG5hbWUuXG4gKiBAcmV0dXJucyB7QXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT59IC0gTm9ybWFsaXplZCB0eXBlZCBjb21tYW5kIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbENvbW1hbmRBcmdzKHthcmdzLCBjb21tYW5kTmFtZSwgbW9kZWxOYW1lfSkge1xuICBpZiAoYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3MgPT09IG51bGwpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShhcmdzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9ICcke2NvbW1hbmROYW1lfScgYXJncyBtdXN0IGJlIGFuIGFycmF5IG9mIHtuYW1lLCB0eXBlfSBvYmplY3RzYClcbiAgfVxuXG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiB7XG4gICAgaWYgKCFhcmcgfHwgdHlwZW9mIGFyZyAhPT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgYXJnLm5hbWUgIT09IFwic3RyaW5nXCIgfHwgYXJnLm5hbWUubGVuZ3RoIDwgMSB8fCB0eXBlb2YgYXJnLnR5cGUgIT09IFwic3RyaW5nXCIgfHwgYXJnLnR5cGUudHJpbSgpLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbE5hbWV9ICcke2NvbW1hbmROYW1lfScgYXJncyBlbnRyaWVzIHJlcXVpcmUgbm9uLWVtcHR5ICduYW1lJyBhbmQgSlNEb2MtdHlwZSAndHlwZScgc3RyaW5nc2ApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtuYW1lOiBhcmcubmFtZSwgdHlwZTogYXJnLnR5cGUudHJpbSgpfVxuICB9KVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhbmQgbm9ybWFsaXplcyBhIGN1c3RvbSBjb21tYW5kJ3MgZGVjbGFyZWQgSlNEb2MgcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbW1hbmROYW1lIC0gQ29tbWFuZCBuYW1lIGZvciBkaWFnbm9zdGljcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1vZGVsTmFtZSAtIERpYWdub3N0aWMgbW9kZWwgbmFtZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJncy5yZXR1cm5UeXBlIC0gUmF3IHJldHVybiB0eXBlLlxuICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gTm9ybWFsaXplZCBKU0RvYyByZXR1cm4gdHlwZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRnJvbnRlbmRNb2RlbENvbW1hbmRSZXR1cm5UeXBlKHtjb21tYW5kTmFtZSwgbW9kZWxOYW1lLCByZXR1cm5UeXBlfSkge1xuICBpZiAocmV0dXJuVHlwZSA9PT0gdW5kZWZpbmVkIHx8IHJldHVyblR5cGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaWYgKHR5cGVvZiByZXR1cm5UeXBlICE9PSBcInN0cmluZ1wiIHx8IHJldHVyblR5cGUudHJpbSgpLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxOYW1lfSAnJHtjb21tYW5kTmFtZX0nIHJldHVyblR5cGUgbXVzdCBiZSBhIG5vbi1lbXB0eSBKU0RvYyB0eXBlIHN0cmluZ2ApXG4gIH1cblxuICByZXR1cm4gcmV0dXJuVHlwZS50cmltKClcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBmcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoIGhlbHBlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgLSBNb2RlbCBjbGFzcyBuYW1lLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVzb3VyY2VEZWZpbml0aW9uIC0gUmVzb3VyY2UgZGVmaW5pdGlvbi5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTm9ybWFsaXplZCByZXNvdXJjZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aChtb2RlbE5hbWUsIHJlc291cmNlRGVmaW5pdGlvbikge1xuICBjb25zdCByZXNvdXJjZUNvbmZpZ3VyYXRpb24gPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKVxuXG4gIGlmICghcmVzb3VyY2VDb25maWd1cmF0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGRlZmluaXRpb24gZm9yICR7bW9kZWxOYW1lfWApXG4gIH1cblxuICByZXR1cm4gYC8ke2luZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24ucGx1cmFsaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShtb2RlbE5hbWUpKSl9YFxufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGZyb250ZW5kTW9kZWxBY3Rpb25Gb3JDb21tYW5kIGhlbHBlci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29tbWFuZE5hbWUgLSBDb21tYW5kIHBhdGggc2VnbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1vZGVsTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLnJlc291cmNlRGVmaW5pdGlvbiAtIFJlc291cmNlIGRlZmluaXRpb24uXG4gKiBAcmV0dXJucyB7XCJkZXN0cm95XCIgfCBcImZpbmRcIiB8IFwiaW5kZXhcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJhdHRhY2hcIiB8IFwiZG93bmxvYWRcIiB8IFwidXJsXCIgfCBudWxsfSAtIEZyb250ZW5kIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb250ZW5kTW9kZWxBY3Rpb25Gb3JDb21tYW5kKHtjb21tYW5kTmFtZSwgbW9kZWxOYW1lLCByZXNvdXJjZURlZmluaXRpb259KSB7XG4gIGNvbnN0IHJlc291cmNlQ29uZmlndXJhdGlvbiA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgaWYgKCFyZXNvdXJjZUNvbmZpZ3VyYXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZnJvbnRlbmQgbW9kZWwgcmVzb3VyY2UgZGVmaW5pdGlvbiBmb3IgJHttb2RlbE5hbWV9YClcbiAgfVxuXG4gIGZvciAoY29uc3QgW2FjdGlvbiwgY29uZmlndXJlZENvbW1hbmROYW1lXSBvZiBPYmplY3QuZW50cmllcyh7XG4gICAgLi4ucmVzb3VyY2VDb25maWd1cmF0aW9uLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMsXG4gICAgLi4ucmVzb3VyY2VDb25maWd1cmF0aW9uLmJ1aWx0SW5NZW1iZXJDb21tYW5kc1xuICB9KSkge1xuICAgIGlmIChjb25maWd1cmVkQ29tbWFuZE5hbWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgIGNvbnN0IHZhbGlkYXRlZENvbW1hbmROYW1lID0gdmFsaWRhdGVGcm9udGVuZE1vZGVsUmVzb3VyY2VDb21tYW5kTmFtZSh7XG4gICAgICBjb21tYW5kTmFtZTogY29uZmlndXJlZENvbW1hbmROYW1lLFxuICAgICAgY29tbWFuZFR5cGU6IC8qKiBAdHlwZSB7XCJhdHRhY2hcIiB8IFwiY3JlYXRlXCIgfCBcImRlc3Ryb3lcIiB8IFwiZG93bmxvYWRcIiB8IFwiZmluZFwiIHwgXCJpbmRleFwiIHwgXCJ1cGRhdGVcIiB8IFwidXJsXCJ9ICovIChhY3Rpb24pLFxuICAgICAgbW9kZWxOYW1lXG4gICAgfSlcblxuICAgIGlmIChjb21tYW5kTmFtZSA9PT0gdmFsaWRhdGVkQ29tbWFuZE5hbWUpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge1wiYXR0YWNoXCIgfCBcImNyZWF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImRvd25sb2FkXCIgfCBcImZpbmRcIiB8IFwiaW5kZXhcIiB8IFwidXBkYXRlXCIgfCBcInVybFwifSAqLyAoYWN0aW9uKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogUnVucyB0aGUgZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRGb3JQYXRoIGhlbHBlci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbltdfSBhcmdzLmJhY2tlbmRQcm9qZWN0cyAtIEJhY2tlbmQgcHJvamVjdHMgdG8gc2Nhbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkuXG4gKiBAcmV0dXJucyB7e2NvbW1hbmROYW1lOiBzdHJpbmcsIG1lbWJlcklkPzogc3RyaW5nLCBtZXRob2ROYW1lOiBzdHJpbmcsIG1vZGVsTmFtZTogc3RyaW5nLCByZXNvdXJjZVBhdGg6IHN0cmluZywgc2NvcGU6IFwiY29sbGVjdGlvblwiIHwgXCJtZW1iZXJcIn0gfCBudWxsfSAtIE1hdGNoZWQgY3VzdG9tIGNvbW1hbmQgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZEZvclBhdGgoe2JhY2tlbmRQcm9qZWN0cywgY3VycmVudFBhdGh9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDdXJyZW50UGF0aCA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGhGb3JNYXRjaChjdXJyZW50UGF0aClcblxuICBmb3IgKGNvbnN0IGJhY2tlbmRQcm9qZWN0IG9mIGJhY2tlbmRQcm9qZWN0cykge1xuICAgIGNvbnN0IHJlc291cmNlcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcblxuICAgIGZvciAoY29uc3QgbW9kZWxOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgY29uc3QgcmVzb3VyY2VEZWZpbml0aW9uID0gcmVzb3VyY2VzW21vZGVsTmFtZV1cbiAgICAgIGNvbnN0IHJlc291cmNlQ29uZmlndXJhdGlvbiA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pXG5cbiAgICAgIGlmICghcmVzb3VyY2VDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc291cmNlUGF0aCA9IG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGhGb3JNYXRjaChmcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoKG1vZGVsTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9uKSlcbiAgICAgIGNvbnN0IGV4cGVjdGVkUHJlZml4ID0gYCR7cmVzb3VyY2VQYXRofS9gXG5cbiAgICAgIGlmICghbm9ybWFsaXplZEN1cnJlbnRQYXRoLnN0YXJ0c1dpdGgoZXhwZWN0ZWRQcmVmaXgpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGhTZWdtZW50cyA9IG5vcm1hbGl6ZWRDdXJyZW50UGF0aFxuICAgICAgICAuc2xpY2UoZXhwZWN0ZWRQcmVmaXgubGVuZ3RoKVxuICAgICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcblxuICAgICAgaWYgKHBhdGhTZWdtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZENvbGxlY3Rpb25Db21tYW5kID0gT2JqZWN0LmVudHJpZXMocmVzb3VyY2VDb25maWd1cmF0aW9uLmNvbGxlY3Rpb25Db21tYW5kcylcbiAgICAgICAgICAuZmluZCgoWywgY29tbWFuZE5hbWVdKSA9PiBjb21tYW5kTmFtZSA9PT0gcGF0aFNlZ21lbnRzWzBdKVxuXG4gICAgICAgIGlmIChtYXRjaGVkQ29sbGVjdGlvbkNvbW1hbmQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tbWFuZE5hbWU6IG1hdGNoZWRDb2xsZWN0aW9uQ29tbWFuZFsxXSxcbiAgICAgICAgICAgIG1ldGhvZE5hbWU6IG1hdGNoZWRDb2xsZWN0aW9uQ29tbWFuZFswXSxcbiAgICAgICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgICAgIHJlc291cmNlUGF0aCxcbiAgICAgICAgICAgIHNjb3BlOiBcImNvbGxlY3Rpb25cIlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocGF0aFNlZ21lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBtYXRjaGVkTWVtYmVyQ29tbWFuZCA9IE9iamVjdC5lbnRyaWVzKHJlc291cmNlQ29uZmlndXJhdGlvbi5tZW1iZXJDb21tYW5kcylcbiAgICAgICAgICAuZmluZCgoWywgY29tbWFuZE5hbWVdKSA9PiBjb21tYW5kTmFtZSA9PT0gcGF0aFNlZ21lbnRzWzFdKVxuXG4gICAgICAgIGlmIChtYXRjaGVkTWVtYmVyQ29tbWFuZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21tYW5kTmFtZTogbWF0Y2hlZE1lbWJlckNvbW1hbmRbMV0sXG4gICAgICAgICAgICBtZW1iZXJJZDogZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhTZWdtZW50c1swXSksXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBtYXRjaGVkTWVtYmVyQ29tbWFuZFswXSxcbiAgICAgICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgICAgIHJlc291cmNlUGF0aCxcbiAgICAgICAgICAgIHNjb3BlOiBcIm1lbWJlclwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBwYXRoIGZvciBtYXRjaC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTm9ybWFsaXplZCBwYXRoIHdpdGggbGVhZGluZyBzbGFzaCBhbmQgbm8gdHJhaWxpbmcgc2xhc2guXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGhGb3JNYXRjaChwYXRoKSB7XG4gIGNvbnN0IHdpdGhMZWFkaW5nU2xhc2ggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWBcblxuICBpZiAod2l0aExlYWRpbmdTbGFzaC5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2gucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICB9XG5cbiAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2hcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcmVnaXN0ZXJlZCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZSBjbGFzcyBmb3IgYSByZXNvdXJjZSB0eXBlXG4gKiBhY3Jvc3MgYWxsIGJhY2tlbmQgcHJvamVjdHMuIEEgcmVzb3VyY2UncyBlZmZlY3RpdmUgbmFtZSBpcyBpdHNcbiAqIGBtb2RlbE5hbWVgIG92ZXJyaWRlIHdoZW4gZGVjbGFyZWQsIG90aGVyd2lzZSBpdHMgcmVnaXN0cnkga2V5IOKAlCBtYXRjaGluZ1xuICoge0BsaW5rIGZyb250ZW5kTW9kZWxTeW5jTWFuaWZlc3RGb3JCYWNrZW5kUHJvamVjdHN9LiBBIHJlZ2lzdHJ5IGtleSBzaGFkb3dlZFxuICogYnkgYSBgbW9kZWxOYW1lYCBvdmVycmlkZSBkb2VzIG5vdCByZXNvbHZlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHt7Z2V0QmFja2VuZFByb2plY3RzOiAoKSA9PiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbltdfX0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBleHBvc2luZyB0aGUgYmFja2VuZCBwcm9qZWN0cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlc291cmNlVHlwZSAtIEZyb250ZW5kIG1vZGVsIG5hbWUgdG8gcmVzb2x2ZS5cbiAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsUmVzb2x2ZWRSZXNvdXJjZVJlZ2lzdHJhdGlvbiB8IG51bGx9IFJlc29sdmVkIHJlZ2lzdHJhdGlvbiBvciBudWxsIHdoZW4gdGhlIHJlc291cmNlIHR5cGUgaXMgbm90IHJlZ2lzdGVyZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3Moe2NvbmZpZ3VyYXRpb24sIHJlc291cmNlVHlwZX0pIHtcbiAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBjb25maWd1cmF0aW9uLmdldEJhY2tlbmRQcm9qZWN0cygpKSB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuXG4gICAgZm9yIChjb25zdCBjb25maWd1cmVkTW9kZWxOYW1lIG9mIE9iamVjdC5rZXlzKHJlc291cmNlcykpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IHJlc291cmNlc1tjb25maWd1cmVkTW9kZWxOYW1lXVxuICAgICAgY29uc3QgcmVzb3VyY2VDbGFzcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKVxuXG4gICAgICBpZiAoIXJlc291cmNlQ2xhc3MpIGNvbnRpbnVlXG5cbiAgICAgIC8vIENoZWFwIGRpcmVjdC1rZXkgbWlzbWF0Y2ggc2tpcDogb25seSBub3JtYWxpemUgY29uZmlndXJhdGlvbnMgZm9yIHRoZVxuICAgICAgLy8gbWF0Y2hpbmcga2V5IG9yIHdoZW4gYSBtb2RlbE5hbWUgb3ZlcnJpZGUgY291bGQgcmVuYW1lIHRoZSByZXNvdXJjZS5cbiAgICAgIGlmIChjb25maWd1cmVkTW9kZWxOYW1lICE9PSByZXNvdXJjZVR5cGUgJiYgIXJlc291cmNlQ2xhc3Muc2hhcmVkUmVzb3VyY2VTdGF0aWNWYWx1ZShcIm1vZGVsTmFtZVwiKSkgY29udGludWVcblxuICAgICAgY29uc3QgcmVzb3VyY2VDb25maWd1cmF0aW9uID0gZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uKHJlc291cmNlRGVmaW5pdGlvbilcblxuICAgICAgaWYgKCFyZXNvdXJjZUNvbmZpZ3VyYXRpb24pIGNvbnRpbnVlXG4gICAgICBpZiAoKHJlc291cmNlQ29uZmlndXJhdGlvbi5tb2RlbE5hbWUgfHwgY29uZmlndXJlZE1vZGVsTmFtZSkgIT09IHJlc291cmNlVHlwZSkgY29udGludWVcblxuICAgICAgcmV0dXJuIHttb2RlbE5hbWU6IHJlc291cmNlVHlwZSwgcmVzb3VyY2VDbGFzcywgcmVzb3VyY2VDb25maWd1cmF0aW9ufVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG4iXX0=
|
|
@@ -186,13 +186,16 @@ export default class LocalMutationLog {
|
|
|
186
186
|
}): Promise<LocalMutationLogRecord>;
|
|
187
187
|
/**
|
|
188
188
|
* Replaces the mutation payload of a still-pending record. Used when an
|
|
189
|
-
* acknowledged predecessor supplies the authoritative base for its successor
|
|
190
|
-
*
|
|
189
|
+
* acknowledged predecessor supplies the authoritative base for its successor
|
|
190
|
+
* and when an offline session re-signs a pending record under a refreshed
|
|
191
|
+
* grant (pass the new `signedMutation` envelope together with the mutation).
|
|
192
|
+
* @param {{id: string, mutation: import("./device-identity.js").SyncMutation, signedMutation?: import("./device-identity.js").SignedSyncMutation}} args - Record and replacement mutation.
|
|
191
193
|
* @returns {Promise<LocalMutationLogRecord>} Updated record.
|
|
192
194
|
*/
|
|
193
|
-
updateMutation({ id, mutation }: {
|
|
195
|
+
updateMutation({ id, mutation, signedMutation }: {
|
|
194
196
|
id: string;
|
|
195
197
|
mutation: import("./device-identity.js").SyncMutation;
|
|
198
|
+
signedMutation?: import("./device-identity.js").SignedSyncMutation;
|
|
196
199
|
}): Promise<LocalMutationLogRecord>;
|
|
197
200
|
/**
|
|
198
201
|
* Resolves a durable conflict explicitly. Keeping the server acknowledges the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-mutation-log.d.ts","sourceRoot":"","sources":["../../../src/sync/local-mutation-log.js"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"local-mutation-log.d.ts","sourceRoot":"","sources":["../../../src/sync/local-mutation-log.js"],"names":[],"mappings":"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"}
|