@mnaoumov/obsidian-lib 10.0.0 → 10.1.0
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/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/link.cjs +18 -2
- package/dist/lib/cjs/link.d.cts +60 -0
- package/dist/lib/cjs/resource-lock.cjs +20 -2
- package/dist/lib/cjs/resource-lock.d.cts +13 -0
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/link.d.mts +60 -0
- package/dist/lib/esm/link.mjs +18 -2
- package/dist/lib/esm/resource-lock.d.mts +13 -0
- package/dist/lib/esm/resource-lock.mjs +20 -2
- package/package.json +1 -1
|
@@ -241,6 +241,11 @@ export declare class ResourceLockComponent extends ComponentEx {
|
|
|
241
241
|
* Thrown by the vault-mutation blocker when a plugin tries to edit, delete, rename, move, or create a
|
|
242
242
|
* resource whose path is covered by a lock taken with
|
|
243
243
|
* {@link ResourceLockComponentLockForPathParams.shouldBlockMutations}.
|
|
244
|
+
*
|
|
245
|
+
* `instanceof ResourceLockedError` is structural: it matches any error named `ResourceLockedError` that carries a
|
|
246
|
+
* string `path`, whichever copy of this library threw it. The blocker belongs to the realm-wide lock manager in the
|
|
247
|
+
* shared-state bag, and that manager is built by whichever copy of the library touched it first, so the error a
|
|
248
|
+
* plugin catches is often another plugin's class.
|
|
244
249
|
*/
|
|
245
250
|
export declare class ResourceLockedError extends Error {
|
|
246
251
|
/**
|
|
@@ -253,6 +258,14 @@ export declare class ResourceLockedError extends Error {
|
|
|
253
258
|
* @param path - The vault path whose mutation was blocked.
|
|
254
259
|
*/
|
|
255
260
|
constructor(path: string);
|
|
261
|
+
/**
|
|
262
|
+
* Matches a {@link ResourceLockedError} thrown by any copy of this library, by its `name` and `path`.
|
|
263
|
+
* A subclass keeps the ordinary prototype check.
|
|
264
|
+
*
|
|
265
|
+
* @param instance - The value on the left of `instanceof`.
|
|
266
|
+
* @returns `true` if the value is a resource-locked error.
|
|
267
|
+
*/
|
|
268
|
+
static [Symbol.hasInstance](instance: unknown): boolean;
|
|
256
269
|
}
|
|
257
270
|
/**
|
|
258
271
|
* Checks whether the note at the given path is currently locked.
|
|
@@ -61,6 +61,7 @@ import {
|
|
|
61
61
|
isChildOrSelf
|
|
62
62
|
} from "./vault.mjs";
|
|
63
63
|
const RESOURCE_LOCK_STATE_KEY = "resourceLock";
|
|
64
|
+
const RESOURCE_LOCKED_ERROR_NAME = "ResourceLockedError";
|
|
64
65
|
const LOCK_ICON_ID = "lock";
|
|
65
66
|
const LOCK_INDICATOR_CSS_CLASS = "obsidian-lib-lock-indicator";
|
|
66
67
|
const LOCK_INDICATOR_FLASH_CSS_CLASS = "obsidian-lib-lock-indicator-flash";
|
|
@@ -952,9 +953,26 @@ class ResourceLockedError extends Error {
|
|
|
952
953
|
*/
|
|
953
954
|
constructor(path) {
|
|
954
955
|
super(`The resource "${path}" is locked and cannot be mutated.`);
|
|
955
|
-
this.name =
|
|
956
|
+
this.name = RESOURCE_LOCKED_ERROR_NAME;
|
|
956
957
|
this.path = path;
|
|
957
958
|
}
|
|
959
|
+
/**
|
|
960
|
+
* Matches a {@link ResourceLockedError} thrown by any copy of this library, by its `name` and `path`.
|
|
961
|
+
* A subclass keeps the ordinary prototype check.
|
|
962
|
+
*
|
|
963
|
+
* @param instance - The value on the left of `instanceof`.
|
|
964
|
+
* @returns `true` if the value is a resource-locked error.
|
|
965
|
+
*/
|
|
966
|
+
static [Symbol.hasInstance](instance) {
|
|
967
|
+
if (this !== ResourceLockedError) {
|
|
968
|
+
return Function.prototype[Symbol.hasInstance].call(this, instance);
|
|
969
|
+
}
|
|
970
|
+
if (typeof instance !== "object" || instance === null) {
|
|
971
|
+
return false;
|
|
972
|
+
}
|
|
973
|
+
const candidate = instance;
|
|
974
|
+
return candidate.name === RESOURCE_LOCKED_ERROR_NAME && typeof candidate.path === "string";
|
|
975
|
+
}
|
|
958
976
|
}
|
|
959
977
|
function isResourceLockedForPath(app, pathOrFile) {
|
|
960
978
|
return getManager().isLocked(app, pathOrFile);
|
|
@@ -994,4 +1012,4 @@ export {
|
|
|
994
1012
|
requestResourceUnlockForPath,
|
|
995
1013
|
unlockResourceForPath
|
|
996
1014
|
};
|
|
997
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXNvdXJjZS1sb2NrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIGZvciB2YXVsdCBmaWxlcyBhbmQgZm9sZGVycywgd2l0aCB0aHJlZSBlbmZvcmNlbWVudCBsYXllcnMgb3ZlciBvbmVcbiAqIHNoYXJlZCBsb2NrZWQtcGF0aCBzZXQ6XG4gKlxuICogMS4gKipFZGl0b3IgcmVhZC1vbmx5Kiog4oCUIHdoaWxlIGEgcGF0aCBpcyBsb2NrZWQsIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSBvZlxuICogICAgdGhhdCBub3RlIChpbiBhbnkgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cykgaXMgbWFkZSByZWFkLW9ubHkgYW5kIHNob3dzIGEgbG9jayBpbmRpY2F0b3IgaW4gaXRzXG4gKiAgICB0YWIgaGVhZGVyLCBpdHMgdmlldyBhY3Rpb24gYmFyLCBhbmQgdGhlIHN0YXR1cyBiYXI7IGEgbm90ZSBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpc1xuICogICAgY292ZXJlZCB0b28uIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBwZXIgbG9ja2luZyBwbHVnaW4gKHRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHdoaWNoXG4gKiAgICBwbHVnaW5zIGhvbGQgYSBsb2NrKSwgc28gbmVzdGVkL2NvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgc2FmZSDigJQgdGhlIHBhdGggaXMgdW5sb2NrZWQgb25seSB3aGVuXG4gKiAgICB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkLlxuICogMi4gKipWYXVsdC1tdXRhdGlvbiBibG9ja2luZyoqIChvcHQtaW4gdmlhIGBzaG91bGRCbG9ja011dGF0aW9uc2ApIOKAlCBhbnkgZWRpdC9kZWxldGUvcmVuYW1lL21vdmUvXG4gKiAgICBjcmVhdGUgb2YgYSBsb2NrZWQgcGF0aCB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0sXG4gKiAgICB1bmxlc3MgdGhlIG93bmluZyBvcGVyYXRpb24gaGFzIG9wZW5lZCBhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9uc30gc2NvcGVcbiAqICAgIG92ZXIgdGhhdCBwYXRoLlxuICogMy4gKipFeHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uKiog4oCUIGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBsb2NrZWQgcGF0aCB0aGF0IG5vIGJ5cGFzcyBzY29wZVxuICogICAgY292ZXJzIGlzIHRyZWF0ZWQgYXMgYW4gaW50cnVkZXIgKFN5bmMgLyByYXcgZmlsZXN5c3RlbSAvIGFub3RoZXIgcGx1Z2luKSBhbmQgYWJvcnRzIHRoZSBvd25pbmdcbiAqICAgIG9wZXJhdGlvbidzIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIEEgbG9jayAqKmZvbGxvd3MgaXRzIHJlc291cmNlIGFjcm9zcyBhIHJlbmFtZSoqOiB3aGVuIGEgbG9ja2VkIHBhdGggKG9yIGFuIGFuY2VzdG9yIGZvbGRlciBvZiBpdCkgaXNcbiAqIHJlbmFtZWQsIHRoZSBsb2NrIHJlZ2lzdHJ5IGFuZCBldmVyeSBhY3RpdmUgYnlwYXNzIHNjb3BlIGFyZSByZS1rZXllZCBvbnRvIHRoZSBuZXcgcGF0aCwgc28gYVxuICogbXVsdGktc3RlcCBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCBrZWVwcyBpdHMgY292ZXJhZ2UgZm9yIHRoZSByZXN0IG9mIHRoZVxuICogdHJhbnNhY3Rpb24uXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb24gdGhhdFxuICogcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tSZXNvdXJjZUZvclBhdGgoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGgsIHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkLCBvcGVyYXRpb25OYW1lOiAnUHJvY2VzcyBub3RlJyB9KTtcbiAqIC8vIC4uLiBsb25nLXJ1bm5pbmcgd29yayAocHJvY2VzcywgcHJvY2Vzc0Zyb250TWF0dGVyLCBtZXJnZS9zcGxpdCkgLi4uXG4gKiAvLyBhdXRvLXVubG9ja2VkIGF0IHNjb3BlIGV4aXRcbiAqIGBgYFxuICpcbiAqIFRoZSBleHBsaWNpdCB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBwYWlyIHJlbWFpbnMgYXZhaWxhYmxlIGZvciBub24tYHVzaW5nYCBjYWxsIHNpdGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgc25hcHNob3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXJyYXknO1xuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IEJlZXBlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9iZWVwZXInO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Z1bmN0aW9uJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IFZpZXdUeXBlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgRmlsZU1hbmFnZXIsXG4gIE1hcmtkb3duVmlldyxcbiAgTWVudSxcbiAgc2V0SWNvbixcbiAgc2V0VG9vbHRpcCxcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyB0b2dnbGVFZGl0b3JSZWFkT25seSB9IGZyb20gJy4vZWRpdG9yLnRzJztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4vaHRtbC1lbGVtZW50LnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnLi9tb2RhbHMvY29uZmlybS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgaXNDaGlsZCxcbiAgaXNDaGlsZE9yU2VsZlxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuY29uc3QgUkVTT1VSQ0VfTE9DS19TVEFURV9LRVkgPSAncmVzb3VyY2VMb2NrJztcbmNvbnN0IExPQ0tfSUNPTl9JRCA9ICdsb2NrJztcbmNvbnN0IExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTUyA9ICdvYnNpZGlhbi1saWItbG9jay1pbmRpY2F0b3InO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfRkxBU0hfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWxpYi1sb2NrLWluZGljYXRvci1mbGFzaCc7XG5jb25zdCBTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTID0gJ3N0YXR1cy1iYXItaXRlbSc7XG5jb25zdCBTVEFUVVNfQkFSX0NTU19TRUxFQ1RPUiA9ICcuc3RhdHVzLWJhcic7XG5jb25zdCBVTkxPQ0tfSUNPTl9JRCA9ICd1bmxvY2snO1xuY29uc3QgTUlERExFX01PVVNFX0JVVFRPTiA9IDE7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGxvY2tSZXNvdXJjZUZvclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2tSZXNvdXJjZUZvclBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiB0YWtpbmcgdGhlIGxvY2sgKGUuZy4gYCdNb3ZlIHNlbGVjdGlvbidgKS4gU2hvd24gbmV4dCB0b1xuICAgKiB0aGUgcGx1Z2luIG5hbWUgaW4gdGhlIHVubG9jayBjb25maXJtYXRpb24gZGlhbG9nLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGxvY2suXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGxvY2tpbmcgcGx1Z2luIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKS4gVGhlIGxvY2sgaXMgYXR0cmlidXRlZCB0byBpdCBmb3JcbiAgICogcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LmxvY2tGb3JQYXRofS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvY2suIFdoZW4gYSBsb2NrIGluZGljYXRvciBpcyBjbGlja2VkICh3aXRoXG4gICAqIGFueSBtb3VzZSBidXR0b24pIGFuZCB0aGUgdXNlciBjb25maXJtcyBhbiB1bmxvY2ssIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQgcnVucywgb3JcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5yZXF1ZXN0VW5sb2NrRm9yUGF0aH0gLyB7QGxpbmsgcmVxdWVzdFJlc291cmNlVW5sb2NrRm9yUGF0aH0gaXMgY2FsbGVkXG4gICAqIGZvciB0aGUgcGF0aCwgdGhpcyBjb250cm9sbGVyIGlzIGFib3J0ZWQgc28gdGhlIG9wZXJhdGlvbiBob2xkaW5nIHRoZSBsb2NrIGNhbiBjYW5jZWwgaXRzZWxmLiBVbmxlc3NcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0fSBpcyBzZXQsIHRoZSBvcGVyYXRpb24gaXNcbiAgICogZXhwZWN0ZWQgdG8gcmVsZWFzZSB0aGUgbG9jayBpbiBpdHMgb3duIGNsZWFudXAuIFdoZW4gb21pdHRlZCwgYW4gdW5sb2NrIHN0aWxsIHJlbGVhc2VzIHRoZSBsb2NrIGJ1dFxuICAgKiBjYW5ub3QgY2FuY2VsIHRoZSBvcGVyYXRpb24gdGhhdCB0b29rIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9jayBzY29wZS4gYCdzdWJ0cmVlJ2AgYWxzbyBsb2NrcyBldmVyeSBkZXNjZW5kYW50IG9mIGEgZm9sZGVyIHBhdGg7IGAnZmlsZSdgIGxvY2tzIG9ubHkgdGhlXG4gICAqIGV4YWN0IHBhdGguIEEgYHN1YnRyZWVgIGxvY2sgbXVzdCBiZSByZWxlYXNlZCB2aWEgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSAobm90IHRoZVxuICAgKiBleHBsaWNpdCB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnVubG9ja0ZvclBhdGh9KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdmaWxlJ2BcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBSZXNvdXJjZUxvY2tNb2RlO1xuXG4gIC8qKlxuICAgKiBXaGVuIHByb3ZpZGVkLCB0aGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhbiB1bmxvY2sgb2YgdGhlIGxvY2sgaXMgcmVxdWVzdGVkIOKAlCBpLmUuIHdoZW4gdGhlXG4gICAqIGxvY2sncyB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfSBpcyBhYm9ydGVkIChieSB0aGVcbiAgICogaW5kaWNhdG9yJ3MgXCJVbmxvY2tcIiBtZW51LCB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kLCB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnJlcXVlc3RVbmxvY2tGb3JQYXRofSxcbiAgICogb3Ige0BsaW5rIGhhbmRsZUV4dGVybmFsTXV0YXRpb259KS4gVXNlIGl0IHRvIGNsZWFyIGNvbnN1bWVyLXNpZGUgc3RhdGUgdGhhdCBzaGFkb3dzIHRoZSBsb2NrIChlLmcuXG4gICAqIGEgcGVuZGluZy1vcGVyYXRpb24gYnVmZmVyIG9yIGEgbm90aWNlKSB3aXRob3V0IGhhbmQtd2lyaW5nIGFuIGBhYm9ydGAgbGlzdGVuZXIuIEZpcmVzIGF0IG1vc3Qgb25jZS5cbiAgICovXG4gIHJlYWRvbmx5IG9uVW5sb2NrUmVxdWVzdGVkPzogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gdGhhdCB0b29rIHRoZSBsb2NrIChlLmcuIGAnTW92ZSBzZWxlY3Rpb24nYCwgYCdNZXJnZVxuICAgKiBub3RlcydgKS4gSXQgaXMgc2hvd24g4oCUIG5leHQgdG8gdGhlIGxvY2tpbmcgcGx1Z2luJ3MgbmFtZSDigJQgaW4gdGhlIHVubG9jayBjb25maXJtYXRpb24gZGlhbG9nLCBzb1xuICAgKiB0aGUgdXNlciBzZWVzIGV4YWN0bHkgd2hpY2ggb3BlcmF0aW9uIGFuIHVubG9jayB3b3VsZCBjYW5jZWwuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCB0aGUgbG9jayBhbHNvICoqYmxvY2tzIHZhdWx0IG11dGF0aW9ucyoqIG9mIHRoZSBjb3ZlcmVkIHBhdGgocyk6IGFueSBhdHRlbXB0IHRvIGVkaXQsXG4gICAqIGRlbGV0ZSwgcmVuYW1lLCBtb3ZlLCBvciAocmUpY3JlYXRlIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyBhXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS4gSW5zdGFsbGVkIGxhemlseSBvbiB0aGUgZmlyc3Qgc3VjaCBsb2NrIGFuZCByZW1vdmVkIHdoZW4gdGhlIGxhc3Qgb25lXG4gICAqIGlzIHJlbGVhc2VkLiBXaGVuIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSB0aGUgbG9jayBvbmx5IG1ha2VzIHRoZSBlZGl0b3IgcmVhZC1vbmx5IOKAlCBsZWdhY3kgYmVoYXZpb3IsXG4gICAqIHNvIGV4aXN0aW5nIGNvbnN1bWVycyB0aGF0IHdyaXRlIHRvIGEgbm90ZSB0aGV5IGhvbGQgYW4gZWRpdG9yIGxvY2sgb24gYXJlIHVuYWZmZWN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEJsb2NrTXV0YXRpb25zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsb2NrIHJlbGVhc2VzIGl0c2VsZiB0aGUgbW9tZW50IGl0c1xuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfSBpcyBhYm9ydGVkLCBpbnN0ZWFkIG9mIHJlbHlpbmcgb25cbiAgICogdGhlIG93bmluZyBvcGVyYXRpb24gdG8gcmVsZWFzZSBpdCBpbiBpdHMgb3duIGNsZWFudXAuIFVzZSBpdCBmb3IgYSBsb2NrIGhlbGQgKippbmRlZmluaXRlbHkqKlxuICAgKiBvdXRzaWRlIGEgYHVzaW5nYCBzY29wZSAoc28gdGhlcmUgaXMgbm8gYGZpbmFsbHlgIHRvIHJlbGVhc2UgaXQpIOKAlCBlLmcuIGEgbG9jayB0aGF0IHN0YXlzIHVudGlsIHRoZVxuICAgKiB1c2VyIGV4cGxpY2l0bHkgdW5sb2Nrcy4gTGVhdmUgaXQgYGZhbHNlYCBmb3IgYSB0cmFuc2FjdGlvbmFsIG9wZXJhdGlvbiB0aGF0IGhvbGRzIHRoZSBsb2NrIHRocm91Z2hcbiAgICogaXRzIG93biBhYm9ydC1kcml2ZW4gcm9sbGJhY2sgYW5kIHJlbGVhc2VzIGl0IHZpYSBgdXNpbmdgIGF0IHNjb3BlIGV4aXQuIEhhcyBubyBlZmZlY3Qgd2l0aG91dCBhblxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZU9uQWJvcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzY29wZSBvZiBhIGxvY2suXG4gKlxuICogLSBgJ2ZpbGUnYCBsb2NrcyBvbmx5IHRoZSBleGFjdCBwYXRoLlxuICogLSBgJ3N1YnRyZWUnYCBsb2NrcyB0aGUgcGF0aCBhbmQgZXZlcnkgZGVzY2VuZGFudCB1bmRlciBpdCAoaXRzIHdob2xlIGZvbGRlciBzdWJ0cmVlKSwgc28gYSBmaWxlXG4gKiAgIGluc2lkZSBhIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyIGlzIHRyZWF0ZWQgYXMgbG9ja2VkIHRvby5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VMb2NrTW9kZSA9ICdmaWxlJyB8ICdzdWJ0cmVlJztcblxuaW50ZXJmYWNlIExvY2tEZXNjcmlwdG9yIHtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBMb2NrRW50cnkge1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlciB8IG51bGw7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9uczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZTogUmVzb3VyY2VMb2NrTW9kZTtcbiAgcmVhZG9ubHkgb25VbmxvY2tSZXF1ZXN0ZWQ6ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRoZSBlbnRyeSBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCB1bmRlci4gRGVsaWJlcmF0ZWx5IG11dGFibGU6IGEgcmVuYW1lIHJlLWtleXMgdGhlXG4gICAqIHJlZ2lzdHJ5LCBhbmQgcmVsZWFzZSBtdXN0IGZpbmQgdGhlIGVudHJ5IGF0IGl0cyBDVVJSRU5UIHBhdGgg4oCUIGEgcmVsZWFzZSB0aGF0IGNhcHR1cmVkIHRoZSBwYXRoXG4gICAqIGF0IGxvY2sgdGltZSB3b3VsZCBzaWxlbnRseSBuby1vcCBhZnRlciB0aGUgcmVzb3VyY2UgbW92ZWQsIGxlYWtpbmcgdGhlIGxvY2sgZm9yZXZlci5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L3JlYWRvbmx5LWludGVyZmFjZS1tZW1iZXJzIC0tIFJlbmFtZXMgcmViYXNlIHRoaXMgZW50cnkgc28gcmVsZWFzaW5nIGl0IHVzZXMgaXRzIGN1cnJlbnQgcmVnaXN0cnkgcGF0aC5cbiAgcGF0aDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExvY2tJbmRpY2F0b3JzIHtcbiAgcmVhZG9ubHkgYWN0aW9uSWNvbkVsOiBIVE1MRWxlbWVudDtcbiAgcmVhZG9ubHkgZGlzcG9zZVR5cGVMaXN0ZW5lcjogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbmludGVyZmFjZSBNYW5hZ2VyTG9ja1BhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9ucz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG1vZGU/OiBSZXNvdXJjZUxvY2tNb2RlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZD86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudH0uXG4gKi9cbmludGVyZmFjZSBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBvbkNoYW5nZTogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuICByZWFkb25seSBvbkZpbGVNZW51OiAobWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25SZW5hbWU6IChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbjogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVzIHRvIHRoZSB3b3Jrc3BhY2UgZXZlbnRzIHRoYXQgc2hvdWxkIHRyaWdnZXIgYSBsb2NrIHJlY29uY2lsZSAoYW5kIHRoZSBmaWxlIGNvbnRleHQtbWVudVxuICogZXZlbnQgdGhhdCBvZmZlcnMgYW4gXCJVbmxvY2tcIiBpdGVtKS4gSW1wbGVtZW50ZWQgYXMgYSB7QGxpbmsgQ29tcG9uZW50RXh9IHNvIHRoZSBzdWJzY3JpcHRpb25zIGFyZVxuICogcmVnaXN0ZXJlZCBvbiBgbG9hZCgpYCBhbmQgYXV0b21hdGljYWxseSByZW1vdmVkIG9uIGB1bmxvYWQoKWAsIGluc3RlYWQgb2YgYmVpbmcgdHJhY2tlZCBieSBoYW5kLlxuICovXG5jbGFzcyBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25DaGFuZ2U6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRmlsZU1lbnU6IChtZW51OiBNZW51LCBmaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uUmVuYW1lOiAob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLm9uQ2hhbmdlID0gcGFyYW1zLm9uQ2hhbmdlO1xuICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uID0gcGFyYW1zLm9uRXh0ZXJuYWxNdXRhdGlvbjtcbiAgICB0aGlzLm9uRmlsZU1lbnUgPSBwYXJhbXMub25GaWxlTWVudTtcbiAgICB0aGlzLm9uUmVuYW1lID0gcGFyYW1zLm9uUmVuYW1lO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdhY3RpdmUtbGVhZi1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBTYW1lLWxlYWYgbmF2aWdhdGlvbiB0byBhbm90aGVyIG5vdGUgZmlyZXMgbm8gbGVhZi9sYXlvdXQgY2hhbmdlOyB3aXRob3V0IHRoaXMgaXQgc3RheXMgcmVhZC1vbmx5LlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtb3BlbicsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBBZGRzIGFuIFwiVW5sb2NrXCIgaXRlbSB0byBhIGxvY2tlZCBub3RlJ3MgdGFiL2ZpbGUgY29udGV4dCBtZW51IChhbG9uZ3NpZGUgdGhlIGluZGljYXRvciBtZW51cykuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignZmlsZS1tZW51JywgdGhpcy5vbkZpbGVNZW51KSk7XG4gICAgLy8gRXh0ZXJuYWwtY2hhbmdlIGJhY2tzdG9wOiBhIHZhdWx0L21ldGFkYXRhIGV2ZW50IG9uIGEgbXV0YXRpb24tYmxvY2tlZCBwYXRoIG5vdCBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSBieXBhc3Mgc2NvcGUgaXMgYW4gaW50cnVkZXIgKGEgc3luYy9GUy9hZGFwdGVyIGNoYW5nZSB0aGF0IGJ5cGFzc2VkIHRoZSBibG9ja2VyIHBhdGNoKS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2NyZWF0ZScsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIChmaWxlLCBvbGRQYXRoKTogdm9pZCA9PiB7XG4gICAgICAvLyBSZS1rZXkgRklSU1QsIHNvIHRoZSBjaGVja3MgYmVsb3cgcnVuIGFnYWluc3Qgd2hlcmUgdGhlIGxvY2tzIGFjdHVhbGx5IGFyZSBub3cuXG4gICAgICAvLyBJbnRydWRlciBkZXRlY3Rpb24gaXMgdW5hZmZlY3RlZDogdGhlIG9sZCBwYXRoIHN0b3BzIHJlc29sdmluZywgYnV0IHRoZSBuZXcgb25lIGlzIGNvdmVyZWQgaW5zdGVhZC5cbiAgICAgIHRoaXMub25SZW5hbWUob2xkUGF0aCwgZmlsZS5wYXRoKTtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKG9sZFBhdGgpO1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUub24oJ2RlbGV0ZWQnLCAoZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFja3MgcGF0aC1zY29wZWQgZWRpdG9yIGxvY2tzIGFuZCBrZWVwcyBldmVyeSBvcGVuIHtAbGluayBNYXJrZG93blZpZXd9IGluIHN5bmMgd2l0aCB0aGUgbG9ja2VkXG4gKiBzZXQuIEEgc2luZ2xlIGluc3RhbmNlIGxpdmVzIGluIHRoZSBzaGFyZWQgc3RhdGUgdW5kZXIgdGhlIGBfX29ic2lkaWFuTGliYCBnbG9iYWwuIEVhY2ggbG9jayBpcyBvbmVcbiAqIHtAbGluayBMb2NrRW50cnl9IGluIGEgcGVyLXBhdGggbGlzdCwgc28gYSBwYXRoIGNhbiBiZSBoZWxkIGJ5IHNldmVyYWwgcGx1Z2lucyAob3Igc2V2ZXJhbCB0aW1lcyBieVxuICogb25lKSBjb25jdXJyZW50bHkgYW5kIGlzIHJlbGVhc2VkIG9ubHkgd2hlbiBpdHMgbGFzdCBlbnRyeSBpcyByZW1vdmVkOyB0aGUgaW5kaWNhdG9ycyByZXBvcnQgd2hpY2hcbiAqIHBsdWdpbnMgY3VycmVudGx5IGhvbGQgYSBsb2NrLlxuICovXG5jbGFzcyBSZXNvdXJjZUxvY2tNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiZWVwZXIgPSBuZXcgQmVlcGVyKCk7XG4gIC8vIFRoZSBpbm5lciBzZXRzIGFyZSBtdXRhYmxlIHNvIGEgcmVuYW1lIGNhbiByZS1rZXkgdGhlIHBhdGhzIG9mIGFuIGluLWZsaWdodCBieXBhc3Mgc2NvcGUgaW4gcGxhY2U7XG4gIC8vIHRoZSBzY29wZSdzIGBEaXNwb3NhYmxlYCBkZWxldGVzIGJ5IHNldCBpZGVudGl0eSwgc28gbXV0YXRpbmcgdGhlIGNvbnRlbnRzIGNhbm5vdCBvcnBoYW4gaXQuXG4gIHByaXZhdGUgcmVhZG9ubHkgYnlwYXNzUGF0aFNldHMgPSBuZXcgU2V0PFNldDxzdHJpbmc+PigpO1xuICBwcml2YXRlIGV2ZW50c0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yc0J5VmlldyA9IG5ldyBNYXA8TWFya2Rvd25WaWV3LCBMb2NrSW5kaWNhdG9ycz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NrRW50cmllc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMb2NrRW50cnlbXT4oKTtcbiAgcHJpdmF0ZSBtdXRhdGlvbkJsb2NrZXJDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnQgPSBudWxsO1xuICBwcml2YXRlIHN0YXR1c0Jhckl0ZW1FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgYnlwYXNzKGFwcDogQXBwLCBwYXRoc09yRmlsZXM6IHJlYWRvbmx5IFBhdGhPckZpbGVbXSk6IERpc3Bvc2FibGUge1xuICAgIGNvbnN0IGJ5cGFzc2VkUGF0aHMgPSBuZXcgU2V0KHBhdGhzT3JGaWxlcy5tYXAoKHBhdGhPckZpbGUpID0+IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSkpO1xuICAgIHRoaXMuYnlwYXNzUGF0aFNldHMuYWRkKGJ5cGFzc2VkUGF0aHMpO1xuICAgIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuYnlwYXNzUGF0aFNldHMuZGVsZXRlKGJ5cGFzc2VkUGF0aHMpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxseSB1bmxvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLiBSZXNvbHZlcyB0aGUgbG9jayBjb3ZlcmluZyBpdCDigJQgdGhlIHBhdGggaXRzZWxmIHdoZW5cbiAgICogZGlyZWN0bHkgbG9ja2VkLCBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciDigJQgdGhlbiBhYm9ydHMgZXZlcnlcbiAgICoge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gcmVnaXN0ZXJlZCBvbiB0aGF0IG93bmVyIChjYW5jZWxsaW5nIHRoZSBvcGVyYXRpb25zIHRoYXQgdG9vayB0aGUgbG9ja3MpXG4gICAqIEFORCByZW1vdmVzIHRoZSBvd25lcidzIGxvY2sgZW50cmllcyAocmVsZWFzaW5nIHRoZSBsb2NrIHVuY29uZGl0aW9uYWxseSkuIFVubGlrZVxuICAgKiB7QGxpbmsgcmVxdWVzdFVubG9ja30sIHdoaWNoIG9ubHkgYWJvcnRzIHRoZSBleGFjdCBwYXRoJ3MgY29udHJvbGxlcnMgYW5kIHJlbGllcyBvbiBlYWNoIG9wZXJhdGlvblxuICAgKiByZWxlYXNpbmcgaXRzIG93biBsb2NrLCB0aGlzIHJlc29sdmVzIGFuY2VzdG9yIGNvdmVyYWdlIGFuZCBhbHdheXMgcmVsZWFzZXMg4oCUIHNvIGEgbm90ZSBoZWxkIGJ5IGFuXG4gICAqIGluZGVmaW5pdGVseS1oZWxkIGxvY2sgaXMgZ3VhcmFudGVlZCB0byBiZWNvbWUgZWRpdGFibGUuIEEgbm8tb3Agd2hlbiBub3RoaW5nIGNvdmVycyB0aGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gICAqL1xuICBwdWJsaWMgZm9yY2VVbmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgICBpZiAob3duZXJQYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHAsIG93bmVyUGF0aCk7XG4gIH1cblxuICBwdWJsaWMgaXNMb2NrZWQoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1BhdGhMb2NrZWQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBsb2NrZWQgZGlyZWN0bHkgb3IgaXMgY292ZXJlZCBieSBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3JcbiAgICogZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgaXRzZWxmIGxvY2tlZCBvciBsaWVzIHVuZGVyIGEgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRCeUFuY2VzdG9yKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIGNvdmVyZWQgYnkgYSBtdXRhdGlvbi1ibG9ja2luZyBsb2NrIChvbmUgdGFrZW4gd2l0aFxuICAgKiBgYmxvY2tzTXV0YXRpb25zYCkgZGlyZWN0bHkgb3Igb24gYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIGEgbXV0YXRpb24gb2YgdGhlIHBhdGggaXMgY3VycmVudGx5IGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBjb25zdCBleGFjdEVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoZXhhY3RFbnRyaWVzPy5zb21lKChlbnRyeSkgPT4gZW50cnkuYmxvY2tzTXV0YXRpb25zKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5tb2RlID09PSAnc3VidHJlZScgJiYgZW50cnkuYmxvY2tzTXV0YXRpb25zKSAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBsb2NrKHBhcmFtczogTWFuYWdlckxvY2tQYXJhbXMpOiBEaXNwb3NhYmxlIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGFyYW1zLnBhdGhPckZpbGUpO1xuICAgIGNvbnN0IGVudHJ5OiBMb2NrRW50cnkgPSB7XG4gICAgICBhYm9ydENvbnRyb2xsZXI6IHBhcmFtcy5hYm9ydENvbnRyb2xsZXIgPz8gbnVsbCxcbiAgICAgIGJsb2Nrc011dGF0aW9uczogcGFyYW1zLmJsb2Nrc011dGF0aW9ucyA/PyBmYWxzZSxcbiAgICAgIG1vZGU6IHBhcmFtcy5tb2RlID8/ICdmaWxlJyxcbiAgICAgIG9uVW5sb2NrUmVxdWVzdGVkOiBwYXJhbXMub25VbmxvY2tSZXF1ZXN0ZWQgPz8gbnVsbCxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgICAgcGF0aCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzaG91bGRSZWxlYXNlT25BYm9ydDogcGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0ID8/IGZhbHNlXG4gICAgfTtcbiAgICBsZXQgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgZW50cmllcyA9IFtdO1xuICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgZW50cmllcyk7XG4gICAgfVxuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgdGhpcy5lbnN1cmVTdWJzY3JpYmVkKGFwcCk7XG4gICAgaWYgKGVudHJ5LmJsb2Nrc011dGF0aW9ucykge1xuICAgICAgdGhpcy5lbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcCk7XG4gICAgfVxuICAgIHRoaXMud2lyZVJlbGVhc2VPbkFib3J0KGFwcCwgZW50cnkpO1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG5cbiAgICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5KGFwcCwgZW50cnkpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gY3VycmVudGx5IHJlZ2lzdGVyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCB3aGljaFxuICAgKiBjYW5jZWxzIHRoZSBvcGVyYXRpb25zIGhvbGRpbmcgdGhlIGxvY2suIEVhY2ggb3BlcmF0aW9uIHJlbGVhc2VzIGl0cyBvd24gbG9jayBpbiBpdHMgYGZpbmFsbHlgXG4gICAqIHdoZW4gaXQgb2JzZXJ2ZXMgdGhlIGFib3J0LCBzbyB0aGlzIGRvZXMgbm90IHVubG9jayB0aGUgcGF0aCBkaXJlY3RseS4gQSBuby1vcCB3aGVuIG5vIGNvbnRyb2xsZXJcbiAgICogaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gcmVxdWVzdCBhbiB1bmxvY2sgZm9yLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RVbmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgICBpZiAoIWVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQgPT09IHBsdWdpbklkKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2tBbGxGb3JQbHVnaW4oYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBlbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnBsdWdpbklkICE9PSBwbHVnaW5JZCk7XG4gICAgICBpZiAocmVtYWluaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nLmxlbmd0aCAhPT0gZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgcmVtYWluaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IG9uIHRoZSBnaXZlbiAoYWxyZWFkeS1yZXNvbHZlZCkgb3duZXIgcGF0aCdzIGxvY2sgZW50cmllcyDigJRcbiAgICogY2FuY2VsbGluZyB0aGUgb3duaW5nIG9wZXJhdGlvbnMg4oCUIGFuZCByZW1vdmVzIHRob3NlIGVudHJpZXMsIHJlbGVhc2luZyB0aGUgbG9jay4gVGhlIGVudHJpZXNcbiAgICogc25hcHNob3QgaXMgY29waWVkIGZpcnN0IGJlY2F1c2UgYW4gZW50cnkncyBgc2hvdWxkUmVsZWFzZU9uQWJvcnRgIGFib3J0IGxpc3RlbmVyIG11dGF0ZXMgdGhlXG4gICAqIGFycmF5IGFzIGl0IGZpcmVzLiBBbHdheXMgbGVhdmVzIHRoZSBvd25lciBwYXRoIHdpdGggbm8gZW50cmllcy5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBvd25lclBhdGggLSBUaGUgZGlyZWN0bHktbG9ja2VkIG93bmVyIHBhdGggd2hvc2UgZW50cmllcyB0byBhYm9ydCBhbmQgcmVsZWFzZS5cbiAgICovXG4gIHByaXZhdGUgYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHA6IEFwcCwgb3duZXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQob3duZXJQYXRoKTtcbiAgICBhc3NlcnROb25OdWxsYWJsZShlbnRyaWVzKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNuYXBzaG90KGVudHJpZXMpKSB7XG4gICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgfVxuICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKG93bmVyUGF0aCk7XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIGFkZFVubG9ja01lbnVJdGVtKGFwcDogQXBwLCBtZW51OiBNZW51LCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcbiAgICAgIGl0ZW1cbiAgICAgICAgLnNldFRpdGxlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucmVzb3VyY2VMb2NrLnVubG9ja01lbnVJdGVtKSlcbiAgICAgICAgLnNldEljb24oVU5MT0NLX0lDT05fSUQpXG4gICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNDb25maXJtZWQgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgICAgICAgIGFwcCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudW5sb2NrQ29uZmlybU1lc3NhZ2UoYXBwLCBwYXRoKSxcbiAgICAgICAgICAgIHRpdGxlOiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnJlc291cmNlTG9jay51bmxvY2tDb25maXJtVGl0bGUpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGlzQ29uZmlybWVkKSB7XG4gICAgICAgICAgICAvLyBgcGF0aGAgaXMgdGhlIHJlc29sdmVkIG93bmVyIHBhdGgsIHNvIGNhbmNlbCBpdHMgb3BlcmF0aW9ucyBhbmQgcmVsZWFzZSB0aGUgbG9jayBvdXRyaWdodC5cbiAgICAgICAgICAgIHRoaXMuYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHAsIHBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbmRpY2F0b3JzKGFwcDogQXBwLCB2aWV3OiBNYXJrZG93blZpZXcsIHRvb2x0aXA6IHN0cmluZyk6IExvY2tJbmRpY2F0b3JzIHtcbiAgICAvLyBUaGUgaW5kaWNhdG9ycyBvdXRsaXZlIGEgcmVuYW1lIG9mIHRoZSBub3RlIChvciBvZiBhbiBlbmNsb3NpbmcgbG9ja2VkIGZvbGRlciksIHNvIHRoZXkgcmVzb2x2ZVxuICAgIC8vIHRoZSBvd25lciBsb2NrIGF0IENMSUNLIHRpbWUgZnJvbSB0aGUgdmlldydzIGN1cnJlbnQgZmlsZSwgZXhhY3RseSBhcyB0aGUgc3RhdHVzLWJhciBpdGVtIGRvZXMuXG4gICAgLy8gQSBjYXB0dXJlZCBvd25lciBwYXRoIHdvdWxkIGdvIHN0YWxlIHRoZSBtb21lbnQgdGhlIGxvY2sgaXMgcmUta2V5ZWQuXG4gICAgY29uc3QgZ2V0T3duZXJQYXRoID0gKCk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB0aGlzLnJlc29sdmVWaWV3T3duZXJQYXRoKGFwcCwgdmlldyk7XG5cbiAgICBjb25zdCBhY3Rpb25JY29uRWwgPSB2aWV3LmFkZEFjdGlvbihMT0NLX0lDT05fSUQsIHRvb2x0aXAsIG5vb3ApO1xuICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgYWN0aW9uSWNvbkVsLCBnZXRPd25lclBhdGgpO1xuXG4gICAgbGV0IHRhYkljb25FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCB0YWJTdGF0dXNDb250YWluZXJFbCA9IHZpZXcubGVhZi50YWJIZWFkZXJTdGF0dXNDb250YWluZXJFbDtcbiAgICBpZiAodGFiU3RhdHVzQ29udGFpbmVyRWwpIHtcbiAgICAgIHRhYkljb25FbCA9IHRhYlN0YXR1c0NvbnRhaW5lckVsLmNyZWF0ZVNwYW4oeyBjbHM6IExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTUyB9KTtcbiAgICAgIHNldEljb24odGFiSWNvbkVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgc2V0VG9vbHRpcCh0YWJJY29uRWwsIHRvb2x0aXApO1xuICAgICAgdGhpcy5yZWdpc3RlclVubG9ja01lbnUoYXBwLCB0YWJJY29uRWwsIGdldE93bmVyUGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQSBsb2NrZWQgdmlldyBpcyByZWFkLW9ubHkgYnV0IHN0aWxsIGVkaXRhYmxlLWZvY3VzYWJsZSwgc28gYSBrZXlzdHJva2UgZmlyZXMgYGJlZm9yZWlucHV0YC5cbiAgICAvLyBPbiB0aGF0IHJlamVjdGVkIGF0dGVtcHQsIGZsYXNoIHRoZSBpbmRpY2F0b3JzIGFuZCBiZWVwIHNvIGl0J3MgY2xlYXIgdGhlIG5vdGUgaXMgbG9ja2VkLlxuICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZW1vdmVkIG9uIHVubG9jay5cbiAgICBjb25zdCBvblR5cGVBdHRlbXB0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5mbGFzaEluZGljYXRvcnModmlldyk7XG4gICAgICB0aGlzLmJlZXBlci5iZWVwKCk7XG4gICAgfTtcbiAgICB2aWV3LmNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVpbnB1dCcsIG9uVHlwZUF0dGVtcHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbkljb25FbCxcbiAgICAgIGRpc3Bvc2VUeXBlTGlzdGVuZXI6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdmlldy5jb250ZW50RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCBvblR5cGVBdHRlbXB0KTtcbiAgICAgIH0sXG4gICAgICB0YWJJY29uRWxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbmV3IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCh7XG4gICAgICBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aCk6IGJvb2xlYW4gPT4gdGhpcy5zaG91bGRCbG9ja011dGF0aW9uKGFwcCwgcGF0aClcbiAgICB9KTtcbiAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVN1YnNjcmliZWQoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudHNDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBuZXcgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50KHtcbiAgICAgIGFwcCxcbiAgICAgIG9uQ2hhbmdlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgICB9LFxuICAgICAgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUV4dGVybmFsTXV0YXRpb24oYXBwLCBwYXRoKTtcbiAgICAgIH0sXG4gICAgICBvbkZpbGVNZW51OiAobWVudSwgZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUZpbGVNZW51KGFwcCwgbWVudSwgZmlsZSk7XG4gICAgICB9LFxuICAgICAgb25SZW5hbWU6IChvbGRQYXRoLCBuZXdQYXRoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlUmVuYW1lKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbGVtZW50LnJlbW92ZUNsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gICAgLy8gUmVhZCBsYXlvdXQgdG8gZm9yY2UgYSByZWZsb3cgc28gdGhlIGZsYXNoIGFuaW1hdGlvbiByZXN0YXJ0cyBvbiBldmVyeSByZWplY3RlZCBrZXlzdHJva2UuXG4gICAgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBlbGVtZW50LmFkZENsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoSW5kaWNhdG9ycyh2aWV3OiBNYXJrZG93blZpZXcpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW2luZGljYXRvcnM/LmFjdGlvbkljb25FbCwgaW5kaWNhdG9ycz8udGFiSWNvbkVsLCB0aGlzLnN0YXR1c0Jhckl0ZW1FbF0pIHtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZmxhc2hFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFjdHMgdG8gYSB2YXVsdC9tZXRhZGF0YSBldmVudCBvbiBhIHBhdGguIElmIHRoZSBwYXRoIGlzIG11dGF0aW9uLWJsb2NrZWQgYW5kIE5PVCBjb3ZlcmVkIGJ5IGFuXG4gICAqIGFjdGl2ZSBieXBhc3Mgc2NvcGUsIHRoZSBjaGFuZ2UgYnlwYXNzZWQgdGhlIGJsb2NrZXIgcGF0Y2ggKHN5bmMgLyBmaWxlc3lzdGVtIC8gYSByYXctYWRhcHRlclxuICAgKiB3cml0ZSkg4oCUIGFuIGludHJ1ZGVyLiBBYm9ydCB0aGUgYGFib3J0Q29udHJvbGxlcmAgb2YgZXZlcnkgbXV0YXRpb24tYmxvY2tpbmcgbG9jayBjb3ZlcmluZyB0aGUgcGF0aFxuICAgKiBzbyB0aGUgb3duaW5nIG9wZXJhdGlvbiBjYW5jZWxzIGFuZCByb2xscyBiYWNrLiBBIG5vLW9wIGZvciB0aGUgb3duZXIncyBvd24gKGJ5cGFzc2VkKSBtdXRhdGlvbnMsXG4gICAqIGZvciB1bmJsb2NrZWQgcGF0aHMsIGFuZCBmb3IgYmxvY2tpbmcgbG9ja3Mgd2l0aCBubyBgYWJvcnRDb250cm9sbGVyYC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdGhlIGV2ZW50IGZpcmVkIG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVFeHRlcm5hbE11dGF0aW9uKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkgfHwgdGhpcy5pc0J5cGFzc2VkKGFwcCwgcGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbbG9ja2VkUGF0aCwgZW50cmllc10gb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aCkge1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmICghZW50cnkuYmxvY2tzTXV0YXRpb25zIHx8ICFlbnRyeS5hYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb2VzQ292ZXJQYXRoID0gbG9ja2VkUGF0aCA9PT0gcGF0aCB8fCAoZW50cnkubW9kZSA9PT0gJ3N1YnRyZWUnICYmIGlzQ2hpbGQoeyBhcHAsIGNoaWxkUGF0aE9yRmlsZTogcGF0aCwgcGFyZW50UGF0aE9yRmlsZTogbG9ja2VkUGF0aCB9KSk7XG4gICAgICAgIGlmIChkb2VzQ292ZXJQYXRoKSB7XG4gICAgICAgICAgZW50cnkuYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZpbGVNZW51KGFwcDogQXBwLCBtZW51OiBNZW51LCBmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gICAgLy8gT2ZmZXIgXCJVbmxvY2tcIiBmb3IgYSBkaXJlY3RseS1sb2NrZWQgZmlsZS9mb2xkZXIsIG9yIGFueXRoaW5nIGNvdmVyZWQgYnkgYSBgc3VidHJlZWAgbG9jayBvbiBhbiBhbmNlc3Rvci4gVGhlIG1lbnUgdGFyZ2V0cyB0aGUgb3duZXIgbG9jaydzIHBhdGguXG4gICAgY29uc3Qgb3duZXJQYXRoID0gdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGZpbGUucGF0aCk7XG4gICAgaWYgKG93bmVyUGF0aCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFkZFVubG9ja01lbnVJdGVtKGFwcCwgbWVudSwgb3duZXJQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1rZXlzIHRoZSByZWdpc3RyeSBvbnRvIGEgcmVuYW1lZCBwYXRoLCBzbyBhIGxvY2sgZm9sbG93cyB0aGUgcmVzb3VyY2UgaXQgd2FzIHRha2VuIG9uLiBNb3Zlc1xuICAgKiB0aGUgZW50cmllcyBvZiB0aGUgcmVuYW1lZCBwYXRoIEFORCBvZiBldmVyeSBkZXNjZW5kYW50IGtleSAoYSBmb2xkZXIgcmVuYW1lIGNoYW5nZXMgYSB3aG9sZSBwYXRoXG4gICAqIHByZWZpeCksIGFuZCByZWJhc2VzIGV2ZXJ5IGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlIHRoZSBzYW1lIHdheSDigJQgd2l0aG91dFxuICAgKiB0aGF0IHNlY29uZCBoYWxmIGFuIG9wZXJhdGlvbiB0aGF0IHJlbmFtZXMgYSBmb2xkZXIgaXQgbG9ja2VkIHdvdWxkIGhhdmUgaXRzIE9XTiBsYXRlciBtdXRhdGlvbnNcbiAgICogcmVhZCBhcyBpbnRydWRlcnMuXG4gICAqXG4gICAqIElkZW1wb3RlbnQ6IGEgcGF0aCB0aGF0IG5vIGxvbmdlciBtYXRjaGVzIGlzIGxlZnQgYWxvbmUsIHNvIGl0IGRvZXMgbm90IG1hdHRlciB3aGV0aGVyIE9ic2lkaWFuXG4gICAqIGVtaXRzIHRoZSBmb2xkZXIncyByZW5hbWUgZXZlbnQgYmVmb3JlIG9yIGFmdGVyIGl0cyBkZXNjZW5kYW50cycuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gb2xkUGF0aCAtIFRoZSBwYXRoIHRoZSByZXNvdXJjZSB3YXMgcmVuYW1lZCBmcm9tLlxuICAgKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBwYXRoIHRoZSByZXNvdXJjZSB3YXMgcmVuYW1lZCB0by5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlUmVuYW1lKGFwcDogQXBwLCBvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIENvbGxlY3QgZmlyc3QsIGFwcGx5IGFmdGVyOiB3cml0aW5nIGJhY2sgd2hpbGUgaXRlcmF0aW5nIHdvdWxkIHJlLXZpc2l0IHRoZSBqdXN0LW1vdmVkIGtleXMuXG4gICAgY29uc3QgbW92ZWRFbnRyaWVzQnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIExvY2tFbnRyeVtdPigpO1xuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGNvbnN0IHJlYmFzZWRQYXRoID0gcmViYXNlUGF0aChsb2NrZWRQYXRoLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIGlmIChyZWJhc2VkUGF0aCA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBlbnRyeS5wYXRoID0gcmViYXNlZFBhdGg7XG4gICAgICB9XG4gICAgICBtb3ZlZEVudHJpZXNCeVBhdGguc2V0KHJlYmFzZWRQYXRoLCBlbnRyaWVzKTtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKGxvY2tlZFBhdGgpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3JlYmFzZWRQYXRoLCBlbnRyaWVzXSBvZiBtb3ZlZEVudHJpZXNCeVBhdGgpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHJlYmFzZWRQYXRoKTtcbiAgICAgIGlmIChleGlzdGluZ0VudHJpZXMpIHtcbiAgICAgICAgLy8gQSBzd2FwIHJlbmFtZXMgb25lIGxvY2tlZCBwYXRoIG9udG8gYW5vdGhlciwgc28gdGhlIHR3byBlbnRyeSBsaXN0cyBNRVJHRSDigJQgbmVpdGhlciBob2xkZXIgbG9zZXMgaXRzIGxvY2suXG4gICAgICAgIGV4aXN0aW5nRW50cmllcy5wdXNoKC4uLmVudHJpZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocmViYXNlZFBhdGgsIGVudHJpZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgYnlwYXNzZWRQYXRocyBvZiB0aGlzLmJ5cGFzc1BhdGhTZXRzKSB7XG4gICAgICAvLyBTYW1lIGNvbGxlY3QtdGhlbi1hcHBseSBzaGFwZTogdGhlIHNldCBtYXkgbm90IGJlIG11dGF0ZWQgd2hpbGUgaXQgaXMgYmVpbmcgaXRlcmF0ZWQuXG4gICAgICBjb25zdCByZWJhc2VkQnlwYXNzZWRQYXRocyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aCBvZiBieXBhc3NlZFBhdGhzKSB7XG4gICAgICAgIGNvbnN0IHJlYmFzZWRQYXRoID0gcmViYXNlUGF0aChieXBhc3NlZFBhdGgsIG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgICBpZiAocmViYXNlZFBhdGggIT09IG51bGwpIHtcbiAgICAgICAgICByZWJhc2VkQnlwYXNzZWRQYXRocy5zZXQoYnlwYXNzZWRQYXRoLCByZWJhc2VkUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2J5cGFzc2VkUGF0aCwgcmViYXNlZFBhdGhdIG9mIHJlYmFzZWRCeXBhc3NlZFBhdGhzKSB7XG4gICAgICAgIGJ5cGFzc2VkUGF0aHMuZGVsZXRlKGJ5cGFzc2VkUGF0aCk7XG4gICAgICAgIGJ5cGFzc2VkUGF0aHMuYWRkKHJlYmFzZWRQYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWNvbmNpbGUgdW5jb25kaXRpb25hbGx5OiBhIHJlbmFtZSBjaGFuZ2VzIGNvdmVyYWdlIGV2ZW4gd2hlbiBubyBrZXkgbW92ZWQg4oCUIGEgbm90ZSByZW5hbWVkIElOVE9cbiAgICAvLyBBIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyIGJlY29tZXMgY292ZXJlZCwgb25lIHJlbmFtZWQgT1VUIG9mIGl0IHN0b3BzIGJlaW5nIGNvdmVyZWQuXG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQmxvY2tpbmdMb2NrKCk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgZW50cmllcyBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkuYmxvY2tzTXV0YXRpb25zKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwYXRoIGlzIGNvdmVyZWQgYnkgYW4gYWN0aXZlIHtAbGluayBSZXNvdXJjZUxvY2tNYW5hZ2VyLmJ5cGFzc30gc2NvcGUg4oCUIHRoZVxuICAgKiBvd25lciBkZWNsYXJpbmcgdGhhdCBpdHMgb3duIG11dGF0aW9ucyBvZiB0aGUgcGF0aCAoYW5kLCBmb3IgYSBmb2xkZXIsIGl0cyBzdWJ0cmVlKSBhcmUgc2FuY3Rpb25lZC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggYmVpbmcgbXV0YXRlZC5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHNvbWUgYWN0aXZlIGJ5cGFzcyBzY29wZSBjb3ZlcnMgdGhlIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGlzQnlwYXNzZWQoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgYnlwYXNzZWRQYXRocyBvZiB0aGlzLmJ5cGFzc1BhdGhTZXRzKSB7XG4gICAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aCBvZiBieXBhc3NlZFBhdGhzKSB7XG4gICAgICAgIGlmIChpc0NoaWxkT3JTZWxmKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGJ5cGFzc2VkUGF0aCB9KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNQYXRoTG9ja2VkKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk/Lmxlbmd0aCA/PyAwKSA+IDA7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBkZWR1cGxpY2F0ZWQgbGlzdCBvZiBgKHBsdWdpbiBuYW1lLCBvcGVyYXRpb24gbmFtZSlgIHBhaXJzIGRlc2NyaWJpbmcgdGhlIGxvY2tzIG9uIGFcbiAgICogcGF0aCDigJQgb25lIHBlciBkaXN0aW5jdCBwbHVnaW4rb3BlcmF0aW9uLiBEcml2ZXMgdGhlIHVubG9jayBjb25maXJtYXRpb24sIHNvIHRoZSB1c2VyIHNlZXMgZXhhY3RseVxuICAgKiB3aGljaCBvcGVyYXRpb25zIGFuIHVubG9jayB3b3VsZCBjYW5jZWwuIE9ubHkgZXZlciBjYWxsZWQgZm9yIGEgbG9ja2VkIHBhdGgsIHNvIGl0cyBlbnRyaWVzIGFyZVxuICAgKiBhbHdheXMgcHJlc2VudC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIGRpcmVjdGx5LWxvY2tlZCBwYXRoIHdob3NlIGxvY2sgZGVzY3JpcHRvcnMgdG8gYnVpbGQuXG4gICAqIEByZXR1cm5zIFRoZSBkaXN0aW5jdCBsb2NrIGRlc2NyaXB0b3JzIGNvdmVyaW5nIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBsb2NrRGVzY3JpcHRvcnMoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IExvY2tEZXNjcmlwdG9yW10ge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKTtcbiAgICBhc3NlcnROb25OdWxsYWJsZShlbnRyaWVzKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgZGVzY3JpcHRvcnM6IExvY2tEZXNjcmlwdG9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHBsdWdpbk5hbWUgPSBhcHAucGx1Z2lucy5tYW5pZmVzdHNbZW50cnkucGx1Z2luSWRdPy5uYW1lID8/IGVudHJ5LnBsdWdpbklkO1xuICAgICAgY29uc3Qga2V5ID0gYCR7cGx1Z2luTmFtZX1cXG4ke2VudHJ5Lm9wZXJhdGlvbk5hbWV9YDtcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgIGRlc2NyaXB0b3JzLnB1c2goeyBvcGVyYXRpb25OYW1lOiBlbnRyeS5vcGVyYXRpb25OYW1lLCBwbHVnaW5OYW1lIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGVzY3JpcHRvcnM7XG4gIH1cblxuICBwcml2YXRlIGxvY2tpbmdQbHVnaW5OYW1lcyhhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKTtcbiAgICAvLyBgbG9ja2luZ1BsdWdpbk5hbWVzYCBpcyBvbmx5IGV2ZXIgY2FsbGVkIGZvciBhIGxvY2tlZCBwYXRoLCBzbyBpdHMgZW50cmllcyBhcmUgYWx3YXlzIHByZXNlbnQuXG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZW50cmllcyk7XG4gICAgY29uc3QgcGx1Z2luSWRzID0gWy4uLm5ldyBTZXQoZW50cmllcy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5wbHVnaW5JZCkpXTtcbiAgICByZXR1cm4gcGx1Z2luSWRzLm1hcCgocGx1Z2luSWQpID0+IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF0/Lm5hbWUgPz8gcGx1Z2luSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2NrVG9vbHRpcChhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBoZWFkZXIgPSB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnJlc291cmNlTG9jay5sb2NrZWRCeVRvb2x0aXApO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiBwbHVnaW4gbmFtZXMsIG9uZSBwZXIgbGluZSB1bmRlciB0aGUgaGVhZGVyLlxuICAgIHJldHVybiBbaGVhZGVyLCAuLi50aGlzLmxvY2tpbmdQbHVnaW5OYW1lcyhhcHAsIHBhdGgpXS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3NUb0xvY2sgPSBuZXcgU2V0PE1hcmtkb3duVmlldz4oKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHRoZSBsb2NrIGNvdmVyaW5nIHRoaXMgdmlldzogdGhlIGV4YWN0IHBhdGggd2hlbiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLiBJbmRpY2F0b3JzL3Rvb2x0aXAvdW5sb2NrIG1lbnUga2V5IG9mZiB0aGF0IG93bmVyIHBhdGguXG4gICAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCk7XG4gICAgICBpZiAob3duZXJQYXRoID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2aWV3c1RvTG9jay5hZGQodmlldyk7XG4gICAgICBjb25zdCB0b29sdGlwID0gdGhpcy5sb2NrVG9vbHRpcChhcHAsIG93bmVyUGF0aCk7XG4gICAgICAvLyBSZS1hcHBseSB0aGUgcmVhZC1vbmx5IHRvZ2dsZSBvbiBldmVyeSByZWNvbmNpbGUsIG5vdCBvbmx5IHRoZSBmaXJzdCB0aW1lIGEgdmlldyBpcyB0cmFja2VkLlxuICAgICAgLy8gVGhlIHRvZ2dsZSBpcyBpZGVtcG90ZW50LCBzbyByZS1hcHBseWluZyB0byBhbiBhbHJlYWR5LWxvY2tlZCB2aWV3IGlzIGNoZWFwLlxuICAgICAgLy8gQSB2aWV3IG9wZW5lZCBhZnRlciB0aGUgbG9jayBpcyByZWNvbmNpbGVkIHN5bmNocm9ub3VzbHksIGJlZm9yZSBpdHMgQ29kZU1pcnJvciBpcyByZWFkeS5cbiAgICAgIC8vIEl0cyBmaXJzdCB0b2dnbGUgaXMgdGhlcmVmb3JlIGEgbm8tb3A7IHJlLWFwcGx5aW5nIG1ha2VzIHRoZSBsb2NrIHRha2UgaG9sZCBvbmNlIGl0IHNldHRsZXMuXG4gICAgICB0b2dnbGVFZGl0b3JSZWFkT25seSh2aWV3LmVkaXRvciwgdHJ1ZSk7XG4gICAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICAgIGlmIChpbmRpY2F0b3JzKSB7XG4gICAgICAgIHRoaXMudXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9ycywgdG9vbHRpcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuc2V0KHZpZXcsIHRoaXMuY3JlYXRlSW5kaWNhdG9ycyhhcHAsIHZpZXcsIHRvb2x0aXApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFt2aWV3LCBpbmRpY2F0b3JzXSBvZiB0aGlzLmluZGljYXRvcnNCeVZpZXcpIHtcbiAgICAgIGlmICh2aWV3c1RvTG9jay5oYXModmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCBmYWxzZSk7XG4gICAgICBpbmRpY2F0b3JzLmRpc3Bvc2VUeXBlTGlzdGVuZXIoKTtcbiAgICAgIGluZGljYXRvcnMuYWN0aW9uSWNvbkVsLnJlbW92ZSgpO1xuICAgICAgaW5kaWNhdG9ycy50YWJJY29uRWw/LnJlbW92ZSgpO1xuICAgICAgdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmRlbGV0ZSh2aWV3KTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhcihhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvbmNpbGVBbmRDbGVhbnVwKGFwcDogQXBwKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcbiAgICBpZiAodGhpcy5sb2NrRW50cmllc0J5UGF0aC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Jsb2NraW5nTG9jaygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tdXRhdGlvbkJsb2NrZXJDb21wb25lbnQ/LnVubG9hZCgpO1xuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJVbmxvY2tNZW51KGFwcDogQXBwLCBlbGVtZW50OiBIVE1MRWxlbWVudCwgZ2V0Q29udGV4dFBhdGg6ICgpID0+IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIEEgY2xpY2sgb2YgQU5ZIG1vdXNlIGJ1dHRvbiBvbiBhIGxvY2sgaW5kaWNhdG9yIG9wZW5zIHRoZSBzYW1lIHVubG9jayBjb250ZXh0IG1lbnU6XG4gICAgLy8gYGNsaWNrYCBmaXJlcyBvbmx5IGZvciB0aGUgcHJpbWFyeSAobGVmdCkgYnV0dG9uLCBgY29udGV4dG1lbnVgIGZvciB0aGUgcmlnaHQgYnV0dG9uLCBhbmRcbiAgICAvLyBgYXV4Y2xpY2tgIGZvciB0aGUgbWlkZGxlIGJ1dHRvbiAodGhlIGJyb3dzZXIgZmlyZXMgbm8gYGNsaWNrYCBmb3IgaXQpLiBgYXV4Y2xpY2tgIGFsc28gZmlyZXMgZm9yXG4gICAgLy8gdGhlIHJpZ2h0IGJ1dHRvbiwgc28gaXQgaXMgZ3VhcmRlZCB0byB0aGUgbWlkZGxlIGJ1dHRvbiB0byBhdm9pZCBkb3VibGUtb3BlbmluZyBhbG9uZ3NpZGUgYGNvbnRleHRtZW51YC5cbiAgICAvLyBBIHBsYWluIGxpc3RlbmVyIGRpZXMgd2l0aCB0aGUgZWxlbWVudCB3aGVuIGl0IGlzIGAucmVtb3ZlKClgZCBvbiB1bmxvY2ssIHNvIGl0IG5ldmVyIGxlYWtzLlxuICAgIGNvbnN0IG9wZW5VbmxvY2tNZW51ID0gKCRldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0Q29udGV4dFBhdGgoKTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVudSA9IG5ldyBNZW51KCk7XG4gICAgICB0aGlzLmFkZFVubG9ja01lbnVJdGVtKGFwcCwgbWVudSwgcGF0aCk7XG4gICAgICBtZW51LnNob3dBdE1vdXNlRXZlbnQoJGV2ZW50KTtcbiAgICB9O1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuVW5sb2NrTWVudSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIG9wZW5VbmxvY2tNZW51KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2F1eGNsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgaWYgKCRldmVudC5idXR0b24gPT09IE1JRERMRV9NT1VTRV9CVVRUT04pIHtcbiAgICAgICAgb3BlblVubG9ja01lbnUoJGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRW50cnkoYXBwOiBBcHAsIGVudHJ5OiBMb2NrRW50cnkpOiB2b2lkIHtcbiAgICAvLyBSZWFkIHRoZSBlbnRyeSdzIENVUlJFTlQgcGF0aCwgbm90IG9uZSBjYXB0dXJlZCB3aGVuIHRoZSBsb2NrIHdhcyB0YWtlbjogYSByZW5hbWUgbWF5IGhhdmVcbiAgICAvLyByZS1rZXllZCBpdCBzaW5jZSwgYW5kIGxvb2tpbmcgaXQgdXAgdW5kZXIgdGhlIG9sZCBwYXRoIHdvdWxkIHNpbGVudGx5IGxlYWsgdGhlIGxvY2suXG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KGVudHJ5LnBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShlbnRyeS5wYXRoKTtcbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgd2hpY2ggbG9ja2VkIHBhdGggKGlmIGFueSkgY292ZXJzIHRoZSBnaXZlbiBwYXRoOiB0aGUgcGF0aCBpdHNlbGYgd2hlbiBkaXJlY3RseSBsb2NrZWQsXG4gICAqIG90aGVyd2lzZSB0aGUgbG9uZ2VzdCBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlciB0aGF0IGNvbnRhaW5zIGl0IChsb25nZXN0IHNvIGEgbmVzdGVkXG4gICAqIHN1YnRyZWUgbG9jayB3aW5zIGRldGVybWluaXN0aWNhbGx5IG92ZXIgYW4gb3V0ZXIgb25lKS5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gcmVzb2x2ZSBhbiBvd25lciBsb2NrIGZvci5cbiAgICogQHJldHVybnMgVGhlIGNvdmVyaW5nIGxvY2tlZCBwYXRoLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIGNvdmVycyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzUGF0aExvY2tlZChwYXRoKSkge1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuICAgIGxldCBiZXN0T3duZXJQYXRoOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBoYXNTdWJ0cmVlTG9jayA9IGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyk7XG4gICAgICBpZiAoaGFzU3VidHJlZUxvY2sgJiYgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBsb2NrZWRQYXRoIH0pICYmIChiZXN0T3duZXJQYXRoID09PSBudWxsIHx8IGxvY2tlZFBhdGgubGVuZ3RoID4gYmVzdE93bmVyUGF0aC5sZW5ndGgpKSB7XG4gICAgICAgIGJlc3RPd25lclBhdGggPSBsb2NrZWRQYXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdE93bmVyUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbG9jayBjb3ZlcmluZyB0aGUgbm90ZSBhIHZpZXcgY3VycmVudGx5IHNob3dzIOKAlCBpdHMgb3duIHBhdGggd2hlbiBkaXJlY3RseSBsb2NrZWQsXG4gICAqIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLiBSZWFkIGF0IGNsaWNrIHRpbWUgYnkgdGhlIHZpZXcncyBsb2NrIGluZGljYXRvcnMsXG4gICAqIHNvIGl0IHJlZmxlY3RzIHJlbmFtZXMgb2YgdGhlIG5vdGUgYW5kIG9mIHRoZSBsb2NrZWQgZm9sZGVyIGFsaWtlLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHZpZXcgLSBUaGUgdmlldyB3aG9zZSBjdXJyZW50IGZpbGUgdG8gcmVzb2x2ZSBhbiBvd25lciBsb2NrIGZvci5cbiAgICogQHJldHVybnMgVGhlIGNvdmVyaW5nIGxvY2tlZCBwYXRoLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSB2aWV3IGhhcyBubyBmaWxlIG9yIG5vdGhpbmcgY292ZXJzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVmlld093bmVyUGF0aChhcHA6IEFwcCwgdmlldzogTWFya2Rvd25WaWV3KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXRoID0gdmlldy5maWxlPy5wYXRoO1xuICAgIHJldHVybiBwYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCkgPz8gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBhIG11dGF0aW9uIG9mIHRoZSBwYXRoIG11c3QgYmUgYmxvY2tlZDogYHRydWVgIHdoZW4gdGhlIHBhdGggaXMgbXV0YXRpb24tYmxvY2tlZFxuICAgKiBhbmQgbm90IGNvdmVyZWQgYnkgYW55IGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBiZWluZyBtdXRhdGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgdG8gcmVqZWN0IHRoZSBtdXRhdGlvbiwgYGZhbHNlYCB0byBhbGxvdyBpdC5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkQmxvY2tNdXRhdGlvbihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkgJiYgIXRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmxvY2tDb25maXJtTWVzc2FnZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGZyYWdtZW50LmFwcGVuZFRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5yZXNvdXJjZUxvY2sudW5sb2NrQ29uZmlybU1lc3NhZ2UpKTtcbiAgICAvLyBBIHJ1bnRpbWUtbGVuZ3RoIGxpc3Qgb2YgdGhlIGxvY2tzIGN1cnJlbnRseSBoZWxkOiBlYWNoIHBsdWdpbiBuYW1lIGFzIGEgY29kZSBibG9jayBmb2xsb3dlZCBieVxuICAgIC8vIHRoZSBvcGVyYXRpb24gaXQgaXMgcnVubmluZywgb25lIHBlciBsaW5lLlxuICAgIGZvciAoY29uc3QgZGVzY3JpcHRvciBvZiB0aGlzLmxvY2tEZXNjcmlwdG9ycyhhcHAsIHBhdGgpKSB7XG4gICAgICBmcmFnbWVudC5jcmVhdGVFbCgnYnInKTtcbiAgICAgIGFwcGVuZENvZGVCbG9jayhmcmFnbWVudCwgZGVzY3JpcHRvci5wbHVnaW5OYW1lKTtcbiAgICAgIGZyYWdtZW50LmFwcGVuZFRleHQoYDogJHtkZXNjcmlwdG9yLm9wZXJhdGlvbk5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9yczogTG9ja0luZGljYXRvcnMsIHRvb2x0aXA6IHN0cmluZyk6IHZvaWQge1xuICAgIHNldFRvb2x0aXAoaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwsIHRvb2x0aXApO1xuICAgIGlmIChpbmRpY2F0b3JzLnRhYkljb25FbCkge1xuICAgICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLnRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNCYXIoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgY29uc3QgYWN0aXZlUGF0aCA9IGFjdGl2ZVZpZXc/LmZpbGU/LnBhdGg7XG4gICAgY29uc3QgYWN0aXZlT3duZXJQYXRoID0gYWN0aXZlUGF0aCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBhY3RpdmVQYXRoKTtcblxuICAgIGlmIChhY3RpdmVPd25lclBhdGggPT09IG51bGwgfHwgIWFjdGl2ZVZpZXcpIHtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsPy5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhdHVzQmFySXRlbUVsKSB7XG4gICAgICBjb25zdCBzdGF0dXNCYXJFbCA9IGFjdGl2ZVZpZXcuY29udGFpbmVyRWwub3duZXJEb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SKTtcbiAgICAgIGlmICghc3RhdHVzQmFyRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBzdGF0dXNCYXJFbC5jcmVhdGVEaXYoeyBjbHM6IFtTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTLCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1NdIH0pO1xuICAgICAgc2V0SWNvbih0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgTE9DS19JQ09OX0lEKTtcbiAgICAgIC8vIFRoZSBzaW5nbGUgc3RhdHVzLWJhciBpdGVtIGlzIHJldXNlZCBhY3Jvc3MgYWN0aXZlLW5vdGUgc3dpdGNoZXMuXG4gICAgICAvLyBJdCBtdXN0IHJlc29sdmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgbm90ZSdzIG93bmVyIGxvY2sgYXQgY2xpY2sgdGltZSByYXRoZXIgdGhhbiBjYXB0dXJpbmcgb25lIHBhdGguXG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRoaXMuc3RhdHVzQmFySXRlbUVsLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KT8uZmlsZT8ucGF0aDtcbiAgICAgICAgcmV0dXJuIHBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBwYXRoKSA/PyB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRUb29sdGlwKHRoaXMuc3RhdHVzQmFySXRlbUVsLCB0aGlzLmxvY2tUb29sdGlwKGFwcCwgYWN0aXZlT3duZXJQYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogV2lyZXMgYW4gb3B0LWluIGBhYm9ydGAgbGlzdGVuZXIgZm9yIGEgbG9jayBlbnRyeTogd2hlbiB0aGUgZW50cnkncyBjb250cm9sbGVyIGFib3J0cywgcmVsZWFzZXNcbiAgICogdGhlIGVudHJ5IChpZiB7QGxpbmsgTG9ja0VudHJ5LnNob3VsZFJlbGVhc2VPbkFib3J0fSkgYW5kL29yIGludm9rZXNcbiAgICoge0BsaW5rIExvY2tFbnRyeS5vblVubG9ja1JlcXVlc3RlZH0uIEEgbm8tb3Agd2hlbiB0aGUgZW50cnkgaGFzIG5vIGNvbnRyb2xsZXIgb3IgbmVpdGhlciBvcHQtaW4gaXNcbiAgICogc2V0LCBzbyB0cmFuc2FjdGlvbmFsIGxvY2tzIGtlZXAgcmVsZWFzaW5nIHZpYSB0aGVpciBvd24gY2xlYW51cC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBlbnRyeSAtIFRoZSBsb2NrIGVudHJ5IHdob3NlIGNvbnRyb2xsZXIgdG8gb2JzZXJ2ZS5cbiAgICovXG4gIHByaXZhdGUgd2lyZVJlbGVhc2VPbkFib3J0KGFwcDogQXBwLCBlbnRyeTogTG9ja0VudHJ5KTogdm9pZCB7XG4gICAgY29uc3QgeyBvblVubG9ja1JlcXVlc3RlZCwgc2hvdWxkUmVsZWFzZU9uQWJvcnQgfSA9IGVudHJ5O1xuICAgIGlmICghZW50cnkuYWJvcnRDb250cm9sbGVyIHx8ICghc2hvdWxkUmVsZWFzZU9uQWJvcnQgJiYgIW9uVW5sb2NrUmVxdWVzdGVkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgaWYgKHNob3VsZFJlbGVhc2VPbkFib3J0KSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRW50cnkoYXBwLCBlbnRyeSk7XG4gICAgICB9XG4gICAgICBvblVubG9ja1JlcXVlc3RlZD8uKCk7XG4gICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbi8qKlxuICogTW9ua2V5LXBhdGNoZXMgdGhlIHZhdWx0LW11dGF0aW9uIGNob2tlIHBvaW50cyBvbiBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgc28gdGhhdCBhbnkgZWRpdCwgZGVsZXRlLFxuICogcmVuYW1lLCBtb3ZlLCBvciAocmUpY3JlYXRlIG9mIGEgbXV0YXRpb24tYmxvY2tlZCBwYXRoIHRocm93cyBhIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS5cbiAqIEluc3RhbGxlZCBsYXppbHkgYnkge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXJ9IG9uIHRoZSBmaXJzdCBgc2hvdWxkQmxvY2tNdXRhdGlvbnNgIGxvY2sgYW5kIHJlbW92ZWRcbiAqIHdoZW4gdGhlIGxhc3Qgb25lIGlzIHJlbGVhc2VkOyBiZWluZyBhIHtAbGluayBNb25rZXlBcm91bmRDb21wb25lbnR9LCBldmVyeSBwYXRjaCBpcyB0b3JuIGRvd24gb25cbiAqIGB1bmxvYWRgLiBSZW5hbWUvY29weSBjaGVjayBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb247IHRoZSBvdGhlciBtZXRob2RzIGNoZWNrIHRoZWlyIHNpbmdsZSBwYXRoLlxuICovXG5jbGFzcyBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZEJsb2NrTXV0YXRpb246IChwYXRoOiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVzb3VyY2VMb2NrTXV0YXRpb25CbG9ja2VyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2hvdWxkQmxvY2tNdXRhdGlvbiA9IHBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9uO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcblxuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2FwcGVuZCc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdhcHBlbmQnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NvcHknPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnY29weScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogWywgbmV3UGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW25ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY3JlYXRlJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2NyZWF0ZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtwYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NyZWF0ZUJpbmFyeSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdjcmVhdGVCaW5hcnknLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtwYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbcGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjcmVhdGVGb2xkZXInPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnY3JlYXRlRm9sZGVyJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbcGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW3BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnZGVsZXRlJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2RlbGV0ZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnbW9kaWZ5Jz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ21vZGlmeScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnbW9kaWZ5QmluYXJ5Jz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ21vZGlmeUJpbmFyeScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAncHJvY2Vzcyc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdwcm9jZXNzJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdyZW5hbWUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAncmVuYW1lJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgbmV3UGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aCwgbmV3UGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICd0cmFzaCc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICd0cmFzaCcsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPEZpbGVNYW5hZ2VyLCAncmVuYW1lRmlsZSc+KHtcbiAgICAgICRvYmplY3Q6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdyZW5hbWVGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgbmV3UGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aCwgbmV3UGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICd0cmFzaEZpbGUnPih7XG4gICAgICAkb2JqZWN0OiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0Tm90QmxvY2tlZChwYXRoczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZEJsb2NrTXV0YXRpb24ocGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlTG9ja2VkRXJyb3IocGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSBwZXItcGx1Z2luIGhhbmRsZSBmb3IgcGF0aC1zY29wZWQgcmVzb3VyY2UgbG9ja2luZyAoZWRpdG9yIHJlYWQtb25seSwgb3B0aW9uYWwgdmF1bHQtbXV0YXRpb25cbiAqIGJsb2NraW5nLCBhbmQgZXh0ZXJuYWwtY2hhbmdlIGRldGVjdGlvbiDigJQgc2VlIHRoZSBmaWxlIG92ZXJ2aWV3KS4gQWRkIGl0IGFzIGEgY2hpbGQgb2YgeW91ciBwbHVnaW5cbiAqIChgdGhpcy5hZGRDaGlsZChuZXcgUmVzb3VyY2VMb2NrQ29tcG9uZW50KHRoaXMuYXBwKSlgKSBzbyB0aGF0IGFueSBsb2NrcyBpdCBzdGlsbCBob2xkcyBhcmUgcmVsZWFzZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMg4oCUIGEgcmVzb3VyY2UgY2FuIG5ldmVyIGJlIGxlZnQgc3R1Y2sgbG9ja2VkIGJlY2F1c2UgdGhlIHBsdWdpblxuICogdGhhdCBsb2NrZWQgaXQgd2FzIGRpc2FibGVkIG9yIHJlbG9hZGVkIG1pZC1vcGVyYXRpb24uXG4gKlxuICogTG9ja3MgYXJlIHJlZmVyZW5jZS1jb3VudGVkIGFuZCBhdHRyaWJ1dGVkIHRvIHRoaXMgcGx1Z2luLCBzbyB0aGUgbG9jayBpbmRpY2F0b3JzJyB0b29sdGlwIG5hbWVzIGl0XG4gKiBhbW9uZyB0aGUgcGx1Z2lucyBjdXJyZW50bHkgaG9sZGluZyBhIGxvY2suXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxvY2tDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIG93bmluZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBMb2NrcyBhcmUgYXR0cmlidXRlZCB0byBpdCBmb3JcbiAgICogcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gcmVzb3VyY2UtbG9jayBoYW5kbGUgb3duZWQgYnkgYSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIG93bmluZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBMb2NrcyBhcmUgYXR0cmlidXRlZCB0b1xuICAgKiBpdCBmb3IgcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICB0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYW4gKiphbWJpZW50IGJ5cGFzcyBzY29wZSoqOiB3aGlsZSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IGlzIG5vdCBkaXNwb3NlZCwgdGhpc1xuICAgKiBwbHVnaW4ncyBvd24gbXV0YXRpb25zIG9mIHRoZSBnaXZlbiBwYXRocyAoYW5kLCBmb3IgYSBmb2xkZXIsIGl0cyB3aG9sZSBzdWJ0cmVlKSBwYXNzIHRocm91Z2ggdGhlXG4gICAqIG11dGF0aW9uIGJsb2NrZXIgaW5zdGVhZCBvZiB0aHJvd2luZyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uIEFueSBtdXRhdGlvbiBvZiBhIGJsb2NrZWQgcGF0aFxuICAgKiBOT1QgY292ZXJlZCBieSBhbiBhY3RpdmUgYnlwYXNzIHNjb3BlIGlzIHN0aWxsIHJlamVjdGVkLiBVc2UgaXQgd2l0aCBhIGB1c2luZ2AgZGVjbGFyYXRpb24gYXJvdW5kXG4gICAqIHRoZSBvcGVyYXRpb24gdGhhdCBsZWdpdGltYXRlbHkgbXV0YXRlcyByZXNvdXJjZXMgaXQgaGFzIGxvY2tlZCB3aXRoXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9uc306XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIHVzaW5nIF9ieXBhc3MgPSBjb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9ucyhbc291cmNlRmlsZSwgdGFyZ2V0RmlsZV0pO1xuICAgKiAvLyAuLi4gdGhlIG9wZXJhdGlvbidzIG93biB2YXVsdCBtdXRhdGlvbnMgb2YgdGhvc2UgcGF0aHMgYXJlIGFsbG93ZWQgLi4uXG4gICAqIC8vIHNjb3BlIGVuZDogdGhlIHBhdGhzIGFyZSBlbmZvcmNlZCBhZ2FpblxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhdGhzT3JGaWxlcyAtIFRoZSBwYXRocyAob3IgZmlsZXMvZm9sZGVycykgd2hvc2UgbXV0YXRpb24gYnkgdGhpcyBvcGVyYXRpb24gaXMgc2FuY3Rpb25lZC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCBlbmRzIHRoZSBieXBhc3Mgc2NvcGUgd2hlbiBkaXNwb3NlZC5cbiAgICovXG4gIHB1YmxpYyBieXBhc3NCbG9ja2VkTXV0YXRpb25zKHBhdGhzT3JGaWxlczogcmVhZG9ubHkgUGF0aE9yRmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5ieXBhc3ModGhpcy5hcHAsIHBhdGhzT3JGaWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBhdGggaXMgbG9ja2VkIGRpcmVjdGx5IG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgaXRzZWxmIGxvY2tlZCBvciBpcyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRCeUFuY2VzdG9yRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZEJ5QW5jZXN0b3IodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQgYnkgYW55IHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vdGUgaGFzIGF0IGxlYXN0IG9uZSBhY3RpdmUgbG9jaywgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIHZhdWx0IG11dGF0aW9uIG9mIHRoZSBwYXRoIGlzIGN1cnJlbnRseSBibG9ja2VkIGJ5IGEgYHNob3VsZEJsb2NrTXV0YXRpb25zYCBsb2NrXG4gICAqIG9uIHRoZSBwYXRoIGl0c2VsZiBvciBvbiBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBlZGl0aW5nL2RlbGV0aW5nL3JlbmFtaW5nL21vdmluZy9jcmVhdGluZyB0aGUgcGF0aCB3b3VsZCB0aHJvdyBhXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS5cbiAgICovXG4gIHB1YmxpYyBpc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3JGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3Rvcih0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggb24gYmVoYWxmIG9mIHRoaXMgcGx1Z2luLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnRcbiAgICogYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZC4gUmVmZXJlbmNlLWNvdW50ZWQ6IGJhbGFuY2UgZWFjaCBjYWxsXG4gICAqIHdpdGggYSBkaXNwb3NlIG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gKGlkZWFsbHkgdmlhIGB1c2luZ2ApIG9yIHtAbGluayB1bmxvY2tGb3JQYXRofS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIExvY2tpbmcgcGFyYW1ldGVycy4gSXRzIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5wYXRoT3JGaWxlfVxuICAgKiBhbmQge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLm9wZXJhdGlvbk5hbWV9IGFyZSByZXF1aXJlZCAodGhlIGxhdHRlciBpcyBzaG93blxuICAgKiBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbikuIFBhc3MgYW4ge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn1cbiAgICogdG8gbWFrZSB0aGUgbG9jayBjYW5jZWxhYmxlIHZpYSBhIGxvY2sgaW5kaWNhdG9yJ3MgXCJ1bmxvY2tcIiBtZW51LCB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kLFxuICAgKiBvciB7QGxpbmsgcmVxdWVzdFJlc291cmNlVW5sb2NrRm9yUGF0aH0uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICAgKi9cbiAgcHVibGljIGxvY2tGb3JQYXRoKHBhcmFtczogUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMpOiBEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmxvY2soe1xuICAgICAgYWJvcnRDb250cm9sbGVyOiBwYXJhbXMuYWJvcnRDb250cm9sbGVyLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGJsb2Nrc011dGF0aW9uczogcGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb25zLFxuICAgICAgbW9kZTogcGFyYW1zLm1vZGUsXG4gICAgICBvblVubG9ja1JlcXVlc3RlZDogcGFyYW1zLm9uVW5sb2NrUmVxdWVzdGVkLFxuICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUsXG4gICAgICBwYXRoT3JGaWxlOiBwYXJhbXMucGF0aE9yRmlsZSxcbiAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbklkLFxuICAgICAgc2hvdWxkUmVsZWFzZU9uQWJvcnQ6IHBhcmFtcy5zaG91bGRSZWxlYXNlT25BYm9ydFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGV2ZXJ5IGxvY2sgc3RpbGwgaGVsZCBieSB0aGlzIHBsdWdpbiB3aGVuIHRoZSBjb21wb25lbnQgKGFuZCB0aHVzIHRoZSBwbHVnaW4pIHVubG9hZHMsXG4gICAqIHNvIG5vIG5vdGUgaXMgbGVmdCBzdHVjayByZWFkLW9ubHkgYnkgYW4gb3BlcmF0aW9uIHRoYXQgbmV2ZXIgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2tBbGxGb3JQbHVnaW4odGhpcy5hcHAsIHRoaXMucGx1Z2luSWQpO1xuICAgIHN1cGVyLm9udW5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdW5sb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aDogcmVzb2x2ZXMgdGhlIGxvY2sgY292ZXJpbmcgaXQgKHRoZSBwYXRoIGl0c2VsZiB3aGVuXG4gICAqIGRpcmVjdGx5IGxvY2tlZCwgb3RoZXJ3aXNlIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIpLCBjYW5jZWxzIHRoZSBvcGVyYXRpb24ocykgdGhhdCB0b29rXG4gICAqIHRoZSBsb2NrIGJ5IGFib3J0aW5nIHRoZWlyIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9cywgYW5kIHJlbGVhc2VzIHRoZSBsb2NrIHNvIHRoZSBub3RlIGJlY29tZXNcbiAgICogZWRpdGFibGUg4oCUIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggcGx1Z2luIGhvbGRzIHRoZSBsb2NrLiBQb3dlcnMgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZC4gQVxuICAgKiBuby1vcCB3aGVuIG5vdGhpbmcgY292ZXJzIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RVbmxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkuZm9yY2VVbmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIG9uZSBsb2NrIHByZXZpb3VzbHkgYWNxdWlyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIHZpYSB7QGxpbmsgbG9ja0ZvclBhdGh9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIHVubG9ja0ZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUsIHRoaXMucGx1Z2luSWQpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIGJ5IHRoZSB2YXVsdC1tdXRhdGlvbiBibG9ja2VyIHdoZW4gYSBwbHVnaW4gdHJpZXMgdG8gZWRpdCwgZGVsZXRlLCByZW5hbWUsIG1vdmUsIG9yIGNyZWF0ZSBhXG4gKiByZXNvdXJjZSB3aG9zZSBwYXRoIGlzIGNvdmVyZWQgYnkgYSBsb2NrIHRha2VuIHdpdGhcbiAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9uc30uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxvY2tlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIHZhdWx0IHBhdGggd2hvc2UgbXV0YXRpb24gd2FzIGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSB2YXVsdCBwYXRoIHdob3NlIG11dGF0aW9uIHdhcyBibG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZykge1xuICAgIHN1cGVyKGBUaGUgcmVzb3VyY2UgXCIke3BhdGh9XCIgaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgbXV0YXRlZC5gKTtcbiAgICB0aGlzLm5hbWUgPSAnUmVzb3VyY2VMb2NrZWRFcnJvcic7XG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vdGUgaGFzIGF0IGxlYXN0IG9uZSBhY3RpdmUgbG9jaywgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZCBkaXJlY3RseSBPUiBpcyBjb3ZlcmVkIGJ5IGFcbiAqIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICpcbiAqIFVubGlrZSB7QGxpbmsgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGh9LCB3aGljaCBvbmx5IHJlcG9ydHMgYW4gZXhhY3QtcGF0aCBsb2NrLCB0aGlzIGFsc28gcmVwb3J0cyBhXG4gKiBwYXRoIHRoYXQgbGllcyB1bmRlciBhIGZvbGRlciBsb2NrZWQgaW4gYHN1YnRyZWVgIG1vZGUuIFVzZSBpdCB0byBkZXRlY3QgdGhhdCBhIHJlbmFtZS9tb3ZlIGlzXG4gKiBoYXBwZW5pbmcgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGUgYWZmZWN0ZWQgZm9sZGVyXG4gKiBzdWJ0cmVlKSwgc28gdGhhdCBhIGJ5c3RhbmRlciAoZS5nLiB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyKSBjYW4gc3RheSBvdXQgb2YgdGhlIHdheSBhbmQgbGV0IHRoZVxuICogdHJhbnNhY3Rpb24ncyBvd25lciBrZWVwIGl0cyBvd24gbGlua3MgY29uc2lzdGVudC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZVxuICoge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIGFuZCBzaG93aW5nIGEgbG9jayBpbmRpY2F0b3IgaW4gdGhlIHRhYiBoZWFkZXIsXG4gKiB2aWV3IGFjdGlvbiBiYXIsIGFuZCAod2hpbGUgYWN0aXZlKSB0aGUgc3RhdHVzIGJhci4gVGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgdGhlIHBsdWdpbnNcbiAqIHRoYXQgY3VycmVudGx5IGhvbGQgYSBsb2NrIG9uIHRoZSBub3RlLlxuICpcbiAqIFRoZSBsb2NrIGlzIHJlZmVyZW5jZS1jb3VudGVkIHBlciBjYWxsaW5nIHBsdWdpbjogZWFjaCBjYWxsIG11c3QgYmUgYmFsYW5jZWQgYnkgZXhhY3RseSBvbmVcbiAqIHJlbGVhc2UgKGVpdGhlciBkaXNwb3NpbmcgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSDigJQgaWRlYWxseSB2aWEgYSBgdXNpbmdgIGRlY2xhcmF0aW9uIOKAlCBvclxuICogYSBtYXRjaGluZyB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBjYWxsKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGxvY2tpbmcgdGhlIG5vdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2tSZXNvdXJjZUZvclBhdGgocGFyYW1zOiBMb2NrUmVzb3VyY2VGb3JQYXRoUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayh7XG4gICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgIHBhdGhPckZpbGU6IHBhcmFtcy5wYXRoT3JGaWxlLFxuICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWRcbiAgfSk7XG59XG5cbi8qKlxuICogUmVxdWVzdHMgYW4gdW5sb2NrIG9mIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGJ5IGFib3J0aW5nIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IHRoYXQgd2FzXG4gKiBhc3NvY2lhdGVkIHdpdGggYSBsb2NrIG9uIGl0ICh2aWEge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5sb2NrRm9yUGF0aH0nc1xuICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn0pLiBUaGUgb3BlcmF0aW9ucyBob2xkaW5nIHRoZSBsb2NrXG4gKiBvYnNlcnZlIHRoZSBhYm9ydCBhbmQgcmVsZWFzZSB0aGVpciBvd24gbG9ja3MuIEEgbm8tb3Agd2hlbiBubyBhYm9ydGFibGUgbG9jayBpcyByZWdpc3RlcmVkIGZvciB0aGVcbiAqIHBhdGguXG4gKlxuICogVGhpcyBsZXRzIGEgY29uc3VtaW5nIHBsdWdpbiB3aXJlIGl0cyBvd24gXCJ1bmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kIHdpdGhvdXQgcmVhY2hpbmcgaW50byB0aGVcbiAqIGxvY2sgbWFuYWdlciBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byByZXF1ZXN0IGFuIHVubG9jayBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS5yZXF1ZXN0VW5sb2NrKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrUmVzb3VyY2VGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGhvbGRzIHRoZSBsb2NrIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKTsgb25lIG9mIGl0c1xuICogbG9ja3Mgb24gdGhlIG5vdGUgaXMgcmVsZWFzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tSZXNvdXJjZUZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnVubG9jayhhcHAsIHBhdGhPckZpbGUsIHBsdWdpbklkKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBSZXNvdXJjZUxvY2tNYW5hZ2VyIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuTGliU3RhdGU8UmVzb3VyY2VMb2NrTWFuYWdlcj4oUkVTT1VSQ0VfTE9DS19TVEFURV9LRVksIG5ldyBSZXNvdXJjZUxvY2tNYW5hZ2VyKCkpLnZhbHVlO1xufVxuXG4vKipcbiAqIE1hcHMgYSBzdG9yZWQgcGF0aCB0aHJvdWdoIGEgcmVuYW1lOiB0aGUgcmVuYW1lZCBwYXRoIGl0c2VsZiBiZWNvbWVzIHRoZSBuZXcgcGF0aCwgYW5kIGEgZGVzY2VuZGFudFxuICogb2YgaXQga2VlcHMgaXRzIHN1ZmZpeCB1bmRlciB0aGUgbmV3IHBhdGguIFNwZWxsZWQgb3V0IHJhdGhlciB0aGFuIHJldXNpbmcge0BsaW5rIGlzQ2hpbGRPclNlbGZ9XG4gKiBiZWNhdXNlIHRoZSByZWJhc2VkIHN1ZmZpeCBoYXMgdG8gYmUgY29tcHV0ZWQgZnJvbSB0aGUgc2FtZSBwcmVmaXggdGhlIHRlc3QgbWF0Y2hlZCwgYW5kIGEgcmVuYW1lXG4gKiBzb3VyY2UgaXMgbmV2ZXIgdGhlIHZhdWx0IHJvb3QgKHRoZSBvbmUgY2FzZSB0aG9zZSBoZWxwZXJzIHRyZWF0IHNwZWNpYWxseSkuXG4gKlxuICogQHBhcmFtIHBhdGggLSBUaGUgc3RvcmVkIHBhdGggdG8gbWFwLlxuICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgZnJvbS5cbiAqIEBwYXJhbSBuZXdQYXRoIC0gVGhlIHBhdGggdGhlIHJlc291cmNlIHdhcyByZW5hbWVkIHRvLlxuICogQHJldHVybnMgVGhlIHJlYmFzZWQgcGF0aCwgb3IgYG51bGxgIHdoZW4gdGhlIHJlbmFtZSBkb2VzIG5vdCBhZmZlY3QgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlYmFzZVBhdGgocGF0aDogc3RyaW5nLCBvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICBpZiAocGF0aCA9PT0gb2xkUGF0aCkge1xuICAgIHJldHVybiBuZXdQYXRoO1xuICB9XG4gIHJldHVybiBwYXRoLnN0YXJ0c1dpdGgoYCR7b2xkUGF0aH0vYCkgPyBuZXdQYXRoICsgcGF0aC5zbGljZShvbGRQYXRoLmxlbmd0aCkgOiBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBDQSxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLGNBQWM7QUFDdkI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxnQkFBZ0I7QUFDekI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBSVAsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyw0QkFBNEI7QUFDckMsU0FBUyxlQUFlO0FBQ3hCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsU0FBUztBQUNsQixTQUFTLGVBQWU7QUFDeEIsU0FBUywyQkFBMkI7QUFDcEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLGVBQWU7QUFDckIsTUFBTSwyQkFBMkI7QUFDakMsTUFBTSxpQ0FBaUM7QUFDdkMsTUFBTSw0QkFBNEI7QUFDbEMsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxzQkFBc0I7QUF3SzVCLE1BQU0sb0NBQW9DLFlBQVk7QUFBQSxFQUNuQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUVWLFlBQVksUUFBc0Q7QUFDdkUsVUFBTTtBQUNOLFNBQUssTUFBTSxPQUFPO0FBQ2xCLFNBQUssV0FBVyxPQUFPO0FBQ3ZCLFNBQUsscUJBQXFC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
|
|
1015
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXNvdXJjZS1sb2NrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIGZvciB2YXVsdCBmaWxlcyBhbmQgZm9sZGVycywgd2l0aCB0aHJlZSBlbmZvcmNlbWVudCBsYXllcnMgb3ZlciBvbmVcbiAqIHNoYXJlZCBsb2NrZWQtcGF0aCBzZXQ6XG4gKlxuICogMS4gKipFZGl0b3IgcmVhZC1vbmx5Kiog4oCUIHdoaWxlIGEgcGF0aCBpcyBsb2NrZWQsIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSBvZlxuICogICAgdGhhdCBub3RlIChpbiBhbnkgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cykgaXMgbWFkZSByZWFkLW9ubHkgYW5kIHNob3dzIGEgbG9jayBpbmRpY2F0b3IgaW4gaXRzXG4gKiAgICB0YWIgaGVhZGVyLCBpdHMgdmlldyBhY3Rpb24gYmFyLCBhbmQgdGhlIHN0YXR1cyBiYXI7IGEgbm90ZSBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpc1xuICogICAgY292ZXJlZCB0b28uIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBwZXIgbG9ja2luZyBwbHVnaW4gKHRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHdoaWNoXG4gKiAgICBwbHVnaW5zIGhvbGQgYSBsb2NrKSwgc28gbmVzdGVkL2NvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgc2FmZSDigJQgdGhlIHBhdGggaXMgdW5sb2NrZWQgb25seSB3aGVuXG4gKiAgICB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkLlxuICogMi4gKipWYXVsdC1tdXRhdGlvbiBibG9ja2luZyoqIChvcHQtaW4gdmlhIGBzaG91bGRCbG9ja011dGF0aW9uc2ApIOKAlCBhbnkgZWRpdC9kZWxldGUvcmVuYW1lL21vdmUvXG4gKiAgICBjcmVhdGUgb2YgYSBsb2NrZWQgcGF0aCB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0sXG4gKiAgICB1bmxlc3MgdGhlIG93bmluZyBvcGVyYXRpb24gaGFzIG9wZW5lZCBhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9uc30gc2NvcGVcbiAqICAgIG92ZXIgdGhhdCBwYXRoLlxuICogMy4gKipFeHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uKiog4oCUIGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBsb2NrZWQgcGF0aCB0aGF0IG5vIGJ5cGFzcyBzY29wZVxuICogICAgY292ZXJzIGlzIHRyZWF0ZWQgYXMgYW4gaW50cnVkZXIgKFN5bmMgLyByYXcgZmlsZXN5c3RlbSAvIGFub3RoZXIgcGx1Z2luKSBhbmQgYWJvcnRzIHRoZSBvd25pbmdcbiAqICAgIG9wZXJhdGlvbidzIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIEEgbG9jayAqKmZvbGxvd3MgaXRzIHJlc291cmNlIGFjcm9zcyBhIHJlbmFtZSoqOiB3aGVuIGEgbG9ja2VkIHBhdGggKG9yIGFuIGFuY2VzdG9yIGZvbGRlciBvZiBpdCkgaXNcbiAqIHJlbmFtZWQsIHRoZSBsb2NrIHJlZ2lzdHJ5IGFuZCBldmVyeSBhY3RpdmUgYnlwYXNzIHNjb3BlIGFyZSByZS1rZXllZCBvbnRvIHRoZSBuZXcgcGF0aCwgc28gYVxuICogbXVsdGktc3RlcCBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCBrZWVwcyBpdHMgY292ZXJhZ2UgZm9yIHRoZSByZXN0IG9mIHRoZVxuICogdHJhbnNhY3Rpb24uXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb24gdGhhdFxuICogcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tSZXNvdXJjZUZvclBhdGgoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGgsIHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkLCBvcGVyYXRpb25OYW1lOiAnUHJvY2VzcyBub3RlJyB9KTtcbiAqIC8vIC4uLiBsb25nLXJ1bm5pbmcgd29yayAocHJvY2VzcywgcHJvY2Vzc0Zyb250TWF0dGVyLCBtZXJnZS9zcGxpdCkgLi4uXG4gKiAvLyBhdXRvLXVubG9ja2VkIGF0IHNjb3BlIGV4aXRcbiAqIGBgYFxuICpcbiAqIFRoZSBleHBsaWNpdCB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBwYWlyIHJlbWFpbnMgYXZhaWxhYmxlIGZvciBub24tYHVzaW5nYCBjYWxsIHNpdGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgc25hcHNob3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXJyYXknO1xuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IEJlZXBlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9iZWVwZXInO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Z1bmN0aW9uJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IFZpZXdUeXBlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgRmlsZU1hbmFnZXIsXG4gIE1hcmtkb3duVmlldyxcbiAgTWVudSxcbiAgc2V0SWNvbixcbiAgc2V0VG9vbHRpcCxcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyB0b2dnbGVFZGl0b3JSZWFkT25seSB9IGZyb20gJy4vZWRpdG9yLnRzJztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4vaHRtbC1lbGVtZW50LnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnLi9tb2RhbHMvY29uZmlybS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgaXNDaGlsZCxcbiAgaXNDaGlsZE9yU2VsZlxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuY29uc3QgUkVTT1VSQ0VfTE9DS19TVEFURV9LRVkgPSAncmVzb3VyY2VMb2NrJztcbi8vIEEgY3Jvc3MtY29weSB3aXJlIG5hbWU6IGBSZXNvdXJjZUxvY2tlZEVycm9yYCdzIGBpbnN0YW5jZW9mYCBtYXRjaGVzIG9uIGl0LCBzbyBpdCBuZXZlciBjaGFuZ2VzLlxuY29uc3QgUkVTT1VSQ0VfTE9DS0VEX0VSUk9SX05BTUUgPSAnUmVzb3VyY2VMb2NrZWRFcnJvcic7XG5jb25zdCBMT0NLX0lDT05fSUQgPSAnbG9jayc7XG5jb25zdCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tbGliLWxvY2staW5kaWNhdG9yJztcbmNvbnN0IExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyA9ICdvYnNpZGlhbi1saWItbG9jay1pbmRpY2F0b3ItZmxhc2gnO1xuY29uc3QgU1RBVFVTX0JBUl9JVEVNX0NTU19DTEFTUyA9ICdzdGF0dXMtYmFyLWl0ZW0nO1xuY29uc3QgU1RBVFVTX0JBUl9DU1NfU0VMRUNUT1IgPSAnLnN0YXR1cy1iYXInO1xuY29uc3QgVU5MT0NLX0lDT05fSUQgPSAndW5sb2NrJztcbmNvbnN0IE1JRERMRV9NT1VTRV9CVVRUT04gPSAxO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBsb2NrUmVzb3VyY2VGb3JQYXRofS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NrUmVzb3VyY2VGb3JQYXRoUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gdGFraW5nIHRoZSBsb2NrIChlLmcuIGAnTW92ZSBzZWxlY3Rpb24nYCkuIFNob3duIG5leHQgdG9cbiAgICogdGhlIHBsdWdpbiBuYW1lIGluIHRoZSB1bmxvY2sgY29uZmlybWF0aW9uIGRpYWxvZy5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBsb2NraW5nIHBsdWdpbiAoZS5nLiBpdHMgYG1hbmlmZXN0LmlkYCkuIFRoZSBsb2NrIGlzIGF0dHJpYnV0ZWQgdG8gaXQgZm9yXG4gICAqIHJlZmVyZW5jZS1jb3VudGluZyBhbmQgdGhlIGluZGljYXRvcnMnIFwibG9ja2VkIGJ5XCIgdG9vbHRpcC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5sb2NrRm9yUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMge1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2NrLiBXaGVuIGEgbG9jayBpbmRpY2F0b3IgaXMgY2xpY2tlZCAod2l0aFxuICAgKiBhbnkgbW91c2UgYnV0dG9uKSBhbmQgdGhlIHVzZXIgY29uZmlybXMgYW4gdW5sb2NrLCB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kIHJ1bnMsIG9yXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQucmVxdWVzdFVubG9ja0ZvclBhdGh9IC8ge0BsaW5rIHJlcXVlc3RSZXNvdXJjZVVubG9ja0ZvclBhdGh9IGlzIGNhbGxlZFxuICAgKiBmb3IgdGhlIHBhdGgsIHRoaXMgY29udHJvbGxlciBpcyBhYm9ydGVkIHNvIHRoZSBvcGVyYXRpb24gaG9sZGluZyB0aGUgbG9jayBjYW4gY2FuY2VsIGl0c2VsZi4gVW5sZXNzXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5zaG91bGRSZWxlYXNlT25BYm9ydH0gaXMgc2V0LCB0aGUgb3BlcmF0aW9uIGlzXG4gICAqIGV4cGVjdGVkIHRvIHJlbGVhc2UgdGhlIGxvY2sgaW4gaXRzIG93biBjbGVhbnVwLiBXaGVuIG9taXR0ZWQsIGFuIHVubG9jayBzdGlsbCByZWxlYXNlcyB0aGUgbG9jayBidXRcbiAgICogY2Fubm90IGNhbmNlbCB0aGUgb3BlcmF0aW9uIHRoYXQgdG9vayBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcblxuICAvKipcbiAgICogVGhlIGxvY2sgc2NvcGUuIGAnc3VidHJlZSdgIGFsc28gbG9ja3MgZXZlcnkgZGVzY2VuZGFudCBvZiBhIGZvbGRlciBwYXRoOyBgJ2ZpbGUnYCBsb2NrcyBvbmx5IHRoZVxuICAgKiBleGFjdCBwYXRoLiBBIGBzdWJ0cmVlYCBsb2NrIG11c3QgYmUgcmVsZWFzZWQgdmlhIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gKG5vdCB0aGVcbiAgICogZXhwbGljaXQge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC51bmxvY2tGb3JQYXRofSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnZmlsZSdgXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogUmVzb3VyY2VMb2NrTW9kZTtcblxuICAvKipcbiAgICogV2hlbiBwcm92aWRlZCwgdGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYW4gdW5sb2NrIG9mIHRoZSBsb2NrIGlzIHJlcXVlc3RlZCDigJQgaS5lLiB3aGVuIHRoZVxuICAgKiBsb2NrJ3Mge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn0gaXMgYWJvcnRlZCAoYnkgdGhlXG4gICAqIGluZGljYXRvcidzIFwiVW5sb2NrXCIgbWVudSwgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZCwge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5yZXF1ZXN0VW5sb2NrRm9yUGF0aH0sXG4gICAqIG9yIHtAbGluayBoYW5kbGVFeHRlcm5hbE11dGF0aW9ufSkuIFVzZSBpdCB0byBjbGVhciBjb25zdW1lci1zaWRlIHN0YXRlIHRoYXQgc2hhZG93cyB0aGUgbG9jayAoZS5nLlxuICAgKiBhIHBlbmRpbmctb3BlcmF0aW9uIGJ1ZmZlciBvciBhIG5vdGljZSkgd2l0aG91dCBoYW5kLXdpcmluZyBhbiBgYWJvcnRgIGxpc3RlbmVyLiBGaXJlcyBhdCBtb3N0IG9uY2UuXG4gICAqL1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZD86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIHRoYXQgdG9vayB0aGUgbG9jayAoZS5nLiBgJ01vdmUgc2VsZWN0aW9uJ2AsIGAnTWVyZ2VcbiAgICogbm90ZXMnYCkuIEl0IGlzIHNob3duIOKAlCBuZXh0IHRvIHRoZSBsb2NraW5nIHBsdWdpbidzIG5hbWUg4oCUIGluIHRoZSB1bmxvY2sgY29uZmlybWF0aW9uIGRpYWxvZywgc29cbiAgICogdGhlIHVzZXIgc2VlcyBleGFjdGx5IHdoaWNoIG9wZXJhdGlvbiBhbiB1bmxvY2sgd291bGQgY2FuY2VsLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGxvY2suXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgdGhlIGxvY2sgYWxzbyAqKmJsb2NrcyB2YXVsdCBtdXRhdGlvbnMqKiBvZiB0aGUgY292ZXJlZCBwYXRoKHMpOiBhbnkgYXR0ZW1wdCB0byBlZGl0LFxuICAgKiBkZWxldGUsIHJlbmFtZSwgbW92ZSwgb3IgKHJlKWNyZWF0ZSB0aGUgcmVzb3VyY2UgdGhyb3VnaCB0aGUgYFZhdWx0YC9gRmlsZU1hbmFnZXJgIEFQSSB0aHJvd3MgYVxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uIEluc3RhbGxlZCBsYXppbHkgb24gdGhlIGZpcnN0IHN1Y2ggbG9jayBhbmQgcmVtb3ZlZCB3aGVuIHRoZSBsYXN0IG9uZVxuICAgKiBpcyByZWxlYXNlZC4gV2hlbiBgZmFsc2VgICh0aGUgZGVmYXVsdCkgdGhlIGxvY2sgb25seSBtYWtlcyB0aGUgZWRpdG9yIHJlYWQtb25seSDigJQgbGVnYWN5IGJlaGF2aW9yLFxuICAgKiBzbyBleGlzdGluZyBjb25zdW1lcnMgdGhhdCB3cml0ZSB0byBhIG5vdGUgdGhleSBob2xkIGFuIGVkaXRvciBsb2NrIG9uIGFyZSB1bmFmZmVjdGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRCbG9ja011dGF0aW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCB0aGUgbG9jayByZWxlYXNlcyBpdHNlbGYgdGhlIG1vbWVudCBpdHNcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn0gaXMgYWJvcnRlZCwgaW5zdGVhZCBvZiByZWx5aW5nIG9uXG4gICAqIHRoZSBvd25pbmcgb3BlcmF0aW9uIHRvIHJlbGVhc2UgaXQgaW4gaXRzIG93biBjbGVhbnVwLiBVc2UgaXQgZm9yIGEgbG9jayBoZWxkICoqaW5kZWZpbml0ZWx5KipcbiAgICogb3V0c2lkZSBhIGB1c2luZ2Agc2NvcGUgKHNvIHRoZXJlIGlzIG5vIGBmaW5hbGx5YCB0byByZWxlYXNlIGl0KSDigJQgZS5nLiBhIGxvY2sgdGhhdCBzdGF5cyB1bnRpbCB0aGVcbiAgICogdXNlciBleHBsaWNpdGx5IHVubG9ja3MuIExlYXZlIGl0IGBmYWxzZWAgZm9yIGEgdHJhbnNhY3Rpb25hbCBvcGVyYXRpb24gdGhhdCBob2xkcyB0aGUgbG9jayB0aHJvdWdoXG4gICAqIGl0cyBvd24gYWJvcnQtZHJpdmVuIHJvbGxiYWNrIGFuZCByZWxlYXNlcyBpdCB2aWEgYHVzaW5nYCBhdCBzY29wZSBleGl0LiBIYXMgbm8gZWZmZWN0IHdpdGhvdXQgYW5cbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlbGVhc2VPbkFib3J0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgc2NvcGUgb2YgYSBsb2NrLlxuICpcbiAqIC0gYCdmaWxlJ2AgbG9ja3Mgb25seSB0aGUgZXhhY3QgcGF0aC5cbiAqIC0gYCdzdWJ0cmVlJ2AgbG9ja3MgdGhlIHBhdGggYW5kIGV2ZXJ5IGRlc2NlbmRhbnQgdW5kZXIgaXQgKGl0cyB3aG9sZSBmb2xkZXIgc3VidHJlZSksIHNvIGEgZmlsZVxuICogICBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpcyB0cmVhdGVkIGFzIGxvY2tlZCB0b28uXG4gKi9cbmV4cG9ydCB0eXBlIFJlc291cmNlTG9ja01vZGUgPSAnZmlsZScgfCAnc3VidHJlZSc7XG5cbmludGVyZmFjZSBMb2NrRGVzY3JpcHRvciB7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTG9ja0VudHJ5IHtcbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIgfCBudWxsO1xuICByZWFkb25seSBibG9ja3NNdXRhdGlvbnM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1vZGU6IFJlc291cmNlTG9ja01vZGU7XG4gIHJlYWRvbmx5IG9uVW5sb2NrUmVxdWVzdGVkOiAoKCkgPT4gdm9pZCkgfCBudWxsO1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0aGUgZW50cnkgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgdW5kZXIuIERlbGliZXJhdGVseSBtdXRhYmxlOiBhIHJlbmFtZSByZS1rZXlzIHRoZVxuICAgKiByZWdpc3RyeSwgYW5kIHJlbGVhc2UgbXVzdCBmaW5kIHRoZSBlbnRyeSBhdCBpdHMgQ1VSUkVOVCBwYXRoIOKAlCBhIHJlbGVhc2UgdGhhdCBjYXB0dXJlZCB0aGUgcGF0aFxuICAgKiBhdCBsb2NrIHRpbWUgd291bGQgc2lsZW50bHkgbm8tb3AgYWZ0ZXIgdGhlIHJlc291cmNlIG1vdmVkLCBsZWFraW5nIHRoZSBsb2NrIGZvcmV2ZXIuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZWFkb25seS1pbnRlcmZhY2UtbWVtYmVycyAtLSBSZW5hbWVzIHJlYmFzZSB0aGlzIGVudHJ5IHNvIHJlbGVhc2luZyBpdCB1c2VzIGl0cyBjdXJyZW50IHJlZ2lzdHJ5IHBhdGguXG4gIHBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZU9uQWJvcnQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBMb2NrSW5kaWNhdG9ycyB7XG4gIHJlYWRvbmx5IGFjdGlvbkljb25FbDogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IGRpc3Bvc2VUeXBlTGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHRhYkljb25FbDogSFRNTEVsZW1lbnQgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgTWFuYWdlckxvY2tQYXJhbXMge1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXIgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBibG9ja3NNdXRhdGlvbnM/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBtb2RlPzogUmVzb3VyY2VMb2NrTW9kZSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb25VbmxvY2tSZXF1ZXN0ZWQ/OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZU9uQWJvcnQ/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdG9yIHBhcmFtZXRlcnMgZm9yIHtAbGluayBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnR9LlxuICovXG5pbnRlcmZhY2UgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgb25DaGFuZ2U6ICgpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IG9uRXh0ZXJuYWxNdXRhdGlvbjogKHBhdGg6IHN0cmluZykgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25GaWxlTWVudTogKG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IG9uUmVuYW1lOiAob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbmludGVyZmFjZSBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IHNob3VsZEJsb2NrTXV0YXRpb246IChwYXRoOiBzdHJpbmcpID0+IGJvb2xlYW47XG59XG5cbi8qKlxuICogU3Vic2NyaWJlcyB0byB0aGUgd29ya3NwYWNlIGV2ZW50cyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgbG9jayByZWNvbmNpbGUgKGFuZCB0aGUgZmlsZSBjb250ZXh0LW1lbnVcbiAqIGV2ZW50IHRoYXQgb2ZmZXJzIGFuIFwiVW5sb2NrXCIgaXRlbSkuIEltcGxlbWVudGVkIGFzIGEge0BsaW5rIENvbXBvbmVudEV4fSBzbyB0aGUgc3Vic2NyaXB0aW9ucyBhcmVcbiAqIHJlZ2lzdGVyZWQgb24gYGxvYWQoKWAgYW5kIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBvbiBgdW5sb2FkKClgLCBpbnN0ZWFkIG9mIGJlaW5nIHRyYWNrZWQgYnkgaGFuZC5cbiAqL1xuY2xhc3MgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uQ2hhbmdlOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRXh0ZXJuYWxNdXRhdGlvbjogKHBhdGg6IHN0cmluZykgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkZpbGVNZW51OiAobWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvblJlbmFtZTogKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5vbkNoYW5nZSA9IHBhcmFtcy5vbkNoYW5nZTtcbiAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbiA9IHBhcmFtcy5vbkV4dGVybmFsTXV0YXRpb247XG4gICAgdGhpcy5vbkZpbGVNZW51ID0gcGFyYW1zLm9uRmlsZU1lbnU7XG4gICAgdGhpcy5vblJlbmFtZSA9IHBhcmFtcy5vblJlbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignYWN0aXZlLWxlYWYtY2hhbmdlJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2xheW91dC1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgLy8gU2FtZS1sZWFmIG5hdmlnYXRpb24gdG8gYW5vdGhlciBub3RlIGZpcmVzIG5vIGxlYWYvbGF5b3V0IGNoYW5nZTsgd2l0aG91dCB0aGlzIGl0IHN0YXlzIHJlYWQtb25seS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgLy8gQWRkcyBhbiBcIlVubG9ja1wiIGl0ZW0gdG8gYSBsb2NrZWQgbm90ZSdzIHRhYi9maWxlIGNvbnRleHQgbWVudSAoYWxvbmdzaWRlIHRoZSBpbmRpY2F0b3IgbWVudXMpLlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtbWVudScsIHRoaXMub25GaWxlTWVudSkpO1xuICAgIC8vIEV4dGVybmFsLWNoYW5nZSBiYWNrc3RvcDogYSB2YXVsdC9tZXRhZGF0YSBldmVudCBvbiBhIG11dGF0aW9uLWJsb2NrZWQgcGF0aCBub3QgY292ZXJlZCBieSBhbiBhY3RpdmUgYnlwYXNzIHNjb3BlIGlzIGFuIGludHJ1ZGVyIChhIHN5bmMvRlMvYWRhcHRlciBjaGFuZ2UgdGhhdCBieXBhc3NlZCB0aGUgYmxvY2tlciBwYXRjaCkuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdjcmVhdGUnLCAoZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdkZWxldGUnLCAoZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoZmlsZSwgb2xkUGF0aCk6IHZvaWQgPT4ge1xuICAgICAgLy8gUmUta2V5IEZJUlNULCBzbyB0aGUgY2hlY2tzIGJlbG93IHJ1biBhZ2FpbnN0IHdoZXJlIHRoZSBsb2NrcyBhY3R1YWxseSBhcmUgbm93LlxuICAgICAgLy8gSW50cnVkZXIgZGV0ZWN0aW9uIGlzIHVuYWZmZWN0ZWQ6IHRoZSBvbGQgcGF0aCBzdG9wcyByZXNvbHZpbmcsIGJ1dCB0aGUgbmV3IG9uZSBpcyBjb3ZlcmVkIGluc3RlYWQuXG4gICAgICB0aGlzLm9uUmVuYW1lKG9sZFBhdGgsIGZpbGUucGF0aCk7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihvbGRQYXRoKTtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKGZpbGUucGF0aCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJywgKGZpbGUpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKGZpbGUucGF0aCk7XG4gICAgfSkpO1xuICB9XG59XG5cbi8qKlxuICogVHJhY2tzIHBhdGgtc2NvcGVkIGVkaXRvciBsb2NrcyBhbmQga2VlcHMgZXZlcnkgb3BlbiB7QGxpbmsgTWFya2Rvd25WaWV3fSBpbiBzeW5jIHdpdGggdGhlIGxvY2tlZFxuICogc2V0LiBBIHNpbmdsZSBpbnN0YW5jZSBsaXZlcyBpbiB0aGUgc2hhcmVkIHN0YXRlIHVuZGVyIHRoZSBgX19vYnNpZGlhbkxpYmAgZ2xvYmFsLiBFYWNoIGxvY2sgaXMgb25lXG4gKiB7QGxpbmsgTG9ja0VudHJ5fSBpbiBhIHBlci1wYXRoIGxpc3QsIHNvIGEgcGF0aCBjYW4gYmUgaGVsZCBieSBzZXZlcmFsIHBsdWdpbnMgKG9yIHNldmVyYWwgdGltZXMgYnlcbiAqIG9uZSkgY29uY3VycmVudGx5IGFuZCBpcyByZWxlYXNlZCBvbmx5IHdoZW4gaXRzIGxhc3QgZW50cnkgaXMgcmVtb3ZlZDsgdGhlIGluZGljYXRvcnMgcmVwb3J0IHdoaWNoXG4gKiBwbHVnaW5zIGN1cnJlbnRseSBob2xkIGEgbG9jay5cbiAqL1xuY2xhc3MgUmVzb3VyY2VMb2NrTWFuYWdlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmVlcGVyID0gbmV3IEJlZXBlcigpO1xuICAvLyBUaGUgaW5uZXIgc2V0cyBhcmUgbXV0YWJsZSBzbyBhIHJlbmFtZSBjYW4gcmUta2V5IHRoZSBwYXRocyBvZiBhbiBpbi1mbGlnaHQgYnlwYXNzIHNjb3BlIGluIHBsYWNlO1xuICAvLyB0aGUgc2NvcGUncyBgRGlzcG9zYWJsZWAgZGVsZXRlcyBieSBzZXQgaWRlbnRpdHksIHNvIG11dGF0aW5nIHRoZSBjb250ZW50cyBjYW5ub3Qgb3JwaGFuIGl0LlxuICBwcml2YXRlIHJlYWRvbmx5IGJ5cGFzc1BhdGhTZXRzID0gbmV3IFNldDxTZXQ8c3RyaW5nPj4oKTtcbiAgcHJpdmF0ZSBldmVudHNDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnQgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvcnNCeVZpZXcgPSBuZXcgTWFwPE1hcmtkb3duVmlldywgTG9ja0luZGljYXRvcnM+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja0VudHJpZXNCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgTG9ja0VudHJ5W10+KCk7XG4gIHByaXZhdGUgbXV0YXRpb25CbG9ja2VyQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrTXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0dXNCYXJJdGVtRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIGJ5cGFzcyhhcHA6IEFwcCwgcGF0aHNPckZpbGVzOiByZWFkb25seSBQYXRoT3JGaWxlW10pOiBEaXNwb3NhYmxlIHtcbiAgICBjb25zdCBieXBhc3NlZFBhdGhzID0gbmV3IFNldChwYXRoc09yRmlsZXMubWFwKChwYXRoT3JGaWxlKSA9PiBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpKTtcbiAgICB0aGlzLmJ5cGFzc1BhdGhTZXRzLmFkZChieXBhc3NlZFBhdGhzKTtcbiAgICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmJ5cGFzc1BhdGhTZXRzLmRlbGV0ZShieXBhc3NlZFBhdGhzKTtcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdW5sb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aC4gUmVzb2x2ZXMgdGhlIGxvY2sgY292ZXJpbmcgaXQg4oCUIHRoZSBwYXRoIGl0c2VsZiB3aGVuXG4gICAqIGRpcmVjdGx5IGxvY2tlZCwgb3RoZXJ3aXNlIHRoZSBlbmNsb3NpbmcgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIg4oCUIHRoZW4gYWJvcnRzIGV2ZXJ5XG4gICAqIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IHJlZ2lzdGVyZWQgb24gdGhhdCBvd25lciAoY2FuY2VsbGluZyB0aGUgb3BlcmF0aW9ucyB0aGF0IHRvb2sgdGhlIGxvY2tzKVxuICAgKiBBTkQgcmVtb3ZlcyB0aGUgb3duZXIncyBsb2NrIGVudHJpZXMgKHJlbGVhc2luZyB0aGUgbG9jayB1bmNvbmRpdGlvbmFsbHkpLiBVbmxpa2VcbiAgICoge0BsaW5rIHJlcXVlc3RVbmxvY2t9LCB3aGljaCBvbmx5IGFib3J0cyB0aGUgZXhhY3QgcGF0aCdzIGNvbnRyb2xsZXJzIGFuZCByZWxpZXMgb24gZWFjaCBvcGVyYXRpb25cbiAgICogcmVsZWFzaW5nIGl0cyBvd24gbG9jaywgdGhpcyByZXNvbHZlcyBhbmNlc3RvciBjb3ZlcmFnZSBhbmQgYWx3YXlzIHJlbGVhc2VzIOKAlCBzbyBhIG5vdGUgaGVsZCBieSBhblxuICAgKiBpbmRlZmluaXRlbHktaGVsZCBsb2NrIGlzIGd1YXJhbnRlZWQgdG8gYmVjb21lIGVkaXRhYmxlLiBBIG5vLW9wIHdoZW4gbm90aGluZyBjb3ZlcnMgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIGZvcmNlVW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgY29uc3Qgb3duZXJQYXRoID0gdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSk7XG4gICAgaWYgKG93bmVyUGF0aCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFib3J0QW5kUmVsZWFzZUVudHJpZXMoYXBwLCBvd25lclBhdGgpO1xuICB9XG5cbiAgcHVibGljIGlzTG9ja2VkKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNQYXRoTG9ja2VkKGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgbG9ja2VkIGRpcmVjdGx5IG9yIGlzIGNvdmVyZWQgYnkgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yXG4gICAqIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGl0c2VsZiBsb2NrZWQgb3IgbGllcyB1bmRlciBhIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBjb3ZlcmVkIGJ5IGEgbXV0YXRpb24tYmxvY2tpbmcgbG9jayAob25lIHRha2VuIHdpdGhcbiAgICogYGJsb2Nrc011dGF0aW9uc2ApIGRpcmVjdGx5IG9yIG9uIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBhIG11dGF0aW9uIG9mIHRoZSBwYXRoIGlzIGN1cnJlbnRseSBibG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZXhhY3RFbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKGV4YWN0RW50cmllcz8uc29tZSgoZW50cnkpID0+IGVudHJ5LmJsb2Nrc011dGF0aW9ucykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBpZiAoZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkubW9kZSA9PT0gJ3N1YnRyZWUnICYmIGVudHJ5LmJsb2Nrc011dGF0aW9ucykgJiYgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBsb2NrZWRQYXRoIH0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgbG9jayhwYXJhbXM6IE1hbmFnZXJMb2NrUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhcmFtcy5wYXRoT3JGaWxlKTtcbiAgICBjb25zdCBlbnRyeTogTG9ja0VudHJ5ID0ge1xuICAgICAgYWJvcnRDb250cm9sbGVyOiBwYXJhbXMuYWJvcnRDb250cm9sbGVyID8/IG51bGwsXG4gICAgICBibG9ja3NNdXRhdGlvbnM6IHBhcmFtcy5ibG9ja3NNdXRhdGlvbnMgPz8gZmFsc2UsXG4gICAgICBtb2RlOiBwYXJhbXMubW9kZSA/PyAnZmlsZScsXG4gICAgICBvblVubG9ja1JlcXVlc3RlZDogcGFyYW1zLm9uVW5sb2NrUmVxdWVzdGVkID8/IG51bGwsXG4gICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSxcbiAgICAgIHBhdGgsXG4gICAgICBwbHVnaW5JZDogcGFyYW1zLnBsdWdpbklkLFxuICAgICAgc2hvdWxkUmVsZWFzZU9uQWJvcnQ6IHBhcmFtcy5zaG91bGRSZWxlYXNlT25BYm9ydCA/PyBmYWxzZVxuICAgIH07XG4gICAgbGV0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoIWVudHJpZXMpIHtcbiAgICAgIGVudHJpZXMgPSBbXTtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2V0KHBhdGgsIGVudHJpZXMpO1xuICAgIH1cbiAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIHRoaXMuZW5zdXJlU3Vic2NyaWJlZChhcHApO1xuICAgIGlmIChlbnRyeS5ibG9ja3NNdXRhdGlvbnMpIHtcbiAgICAgIHRoaXMuZW5zdXJlQmxvY2tlckluc3RhbGxlZChhcHApO1xuICAgIH1cbiAgICB0aGlzLndpcmVSZWxlYXNlT25BYm9ydChhcHAsIGVudHJ5KTtcbiAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuXG4gICAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmVFbnRyeShhcHAsIGVudHJ5KTtcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IGN1cnJlbnRseSByZWdpc3RlcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCwgd2hpY2hcbiAgICogY2FuY2VscyB0aGUgb3BlcmF0aW9ucyBob2xkaW5nIHRoZSBsb2NrLiBFYWNoIG9wZXJhdGlvbiByZWxlYXNlcyBpdHMgb3duIGxvY2sgaW4gaXRzIGBmaW5hbGx5YFxuICAgKiB3aGVuIGl0IG9ic2VydmVzIHRoZSBhYm9ydCwgc28gdGhpcyBkb2VzIG5vdCB1bmxvY2sgdGhlIHBhdGggZGlyZWN0bHkuIEEgbm8tb3Agd2hlbiBubyBjb250cm9sbGVyXG4gICAqIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHJlcXVlc3QgYW4gdW5sb2NrIGZvci5cbiAgICovXG4gIHB1YmxpYyByZXF1ZXN0VW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgZW50cnkuYWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoIWVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZW50cnkpID0+IGVudHJ5LnBsdWdpbklkID09PSBwbHVnaW5JZCk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrQWxsRm9yUGx1Z2luKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbcGF0aCwgZW50cmllc10gb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aCkge1xuICAgICAgY29uc3QgcmVtYWluaW5nID0gZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5wbHVnaW5JZCAhPT0gcGx1Z2luSWQpO1xuICAgICAgaWYgKHJlbWFpbmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5kZWxldGUocGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZy5sZW5ndGggIT09IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2V0KHBhdGgsIHJlbWFpbmluZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0cyBldmVyeSB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSBvbiB0aGUgZ2l2ZW4gKGFscmVhZHktcmVzb2x2ZWQpIG93bmVyIHBhdGgncyBsb2NrIGVudHJpZXMg4oCUXG4gICAqIGNhbmNlbGxpbmcgdGhlIG93bmluZyBvcGVyYXRpb25zIOKAlCBhbmQgcmVtb3ZlcyB0aG9zZSBlbnRyaWVzLCByZWxlYXNpbmcgdGhlIGxvY2suIFRoZSBlbnRyaWVzXG4gICAqIHNuYXBzaG90IGlzIGNvcGllZCBmaXJzdCBiZWNhdXNlIGFuIGVudHJ5J3MgYHNob3VsZFJlbGVhc2VPbkFib3J0YCBhYm9ydCBsaXN0ZW5lciBtdXRhdGVzIHRoZVxuICAgKiBhcnJheSBhcyBpdCBmaXJlcy4gQWx3YXlzIGxlYXZlcyB0aGUgb3duZXIgcGF0aCB3aXRoIG5vIGVudHJpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gb3duZXJQYXRoIC0gVGhlIGRpcmVjdGx5LWxvY2tlZCBvd25lciBwYXRoIHdob3NlIGVudHJpZXMgdG8gYWJvcnQgYW5kIHJlbGVhc2UuXG4gICAqL1xuICBwcml2YXRlIGFib3J0QW5kUmVsZWFzZUVudHJpZXMoYXBwOiBBcHAsIG93bmVyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KG93bmVyUGF0aCk7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZW50cmllcyk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBzbmFwc2hvdChlbnRyaWVzKSkge1xuICAgICAgZW50cnkuYWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIH1cbiAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShvd25lclBhdGgpO1xuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRVbmxvY2tNZW51SXRlbShhcHA6IEFwcCwgbWVudTogTWVudSwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgbWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG4gICAgICBpdGVtXG4gICAgICAgIC5zZXRUaXRsZSh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnJlc291cmNlTG9jay51bmxvY2tNZW51SXRlbSkpXG4gICAgICAgIC5zZXRJY29uKFVOTE9DS19JQ09OX0lEKVxuICAgICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzQ29uZmlybWVkID0gYXdhaXQgY29uZmlybSh7XG4gICAgICAgICAgICBhcHAsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnVubG9ja0NvbmZpcm1NZXNzYWdlKGFwcCwgcGF0aCksXG4gICAgICAgICAgICB0aXRsZTogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5yZXNvdXJjZUxvY2sudW5sb2NrQ29uZmlybVRpdGxlKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChpc0NvbmZpcm1lZCkge1xuICAgICAgICAgICAgLy8gYHBhdGhgIGlzIHRoZSByZXNvbHZlZCBvd25lciBwYXRoLCBzbyBjYW5jZWwgaXRzIG9wZXJhdGlvbnMgYW5kIHJlbGVhc2UgdGhlIGxvY2sgb3V0cmlnaHQuXG4gICAgICAgICAgICB0aGlzLmFib3J0QW5kUmVsZWFzZUVudHJpZXMoYXBwLCBwYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW5kaWNhdG9ycyhhcHA6IEFwcCwgdmlldzogTWFya2Rvd25WaWV3LCB0b29sdGlwOiBzdHJpbmcpOiBMb2NrSW5kaWNhdG9ycyB7XG4gICAgLy8gVGhlIGluZGljYXRvcnMgb3V0bGl2ZSBhIHJlbmFtZSBvZiB0aGUgbm90ZSAob3Igb2YgYW4gZW5jbG9zaW5nIGxvY2tlZCBmb2xkZXIpLCBzbyB0aGV5IHJlc29sdmVcbiAgICAvLyB0aGUgb3duZXIgbG9jayBhdCBDTElDSyB0aW1lIGZyb20gdGhlIHZpZXcncyBjdXJyZW50IGZpbGUsIGV4YWN0bHkgYXMgdGhlIHN0YXR1cy1iYXIgaXRlbSBkb2VzLlxuICAgIC8vIEEgY2FwdHVyZWQgb3duZXIgcGF0aCB3b3VsZCBnbyBzdGFsZSB0aGUgbW9tZW50IHRoZSBsb2NrIGlzIHJlLWtleWVkLlxuICAgIGNvbnN0IGdldE93bmVyUGF0aCA9ICgpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4gdGhpcy5yZXNvbHZlVmlld093bmVyUGF0aChhcHAsIHZpZXcpO1xuXG4gICAgY29uc3QgYWN0aW9uSWNvbkVsID0gdmlldy5hZGRBY3Rpb24oTE9DS19JQ09OX0lELCB0b29sdGlwLCBub29wKTtcbiAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIGFjdGlvbkljb25FbCwgZ2V0T3duZXJQYXRoKTtcblxuICAgIGxldCB0YWJJY29uRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgdGFiU3RhdHVzQ29udGFpbmVyRWwgPSB2aWV3LmxlYWYudGFiSGVhZGVyU3RhdHVzQ29udGFpbmVyRWw7XG4gICAgaWYgKHRhYlN0YXR1c0NvbnRhaW5lckVsKSB7XG4gICAgICB0YWJJY29uRWwgPSB0YWJTdGF0dXNDb250YWluZXJFbC5jcmVhdGVTcGFuKHsgY2xzOiBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1MgfSk7XG4gICAgICBzZXRJY29uKHRhYkljb25FbCwgTE9DS19JQ09OX0lEKTtcbiAgICAgIHNldFRvb2x0aXAodGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgdGFiSWNvbkVsLCBnZXRPd25lclBhdGgpO1xuICAgIH1cblxuICAgIC8vIEEgbG9ja2VkIHZpZXcgaXMgcmVhZC1vbmx5IGJ1dCBzdGlsbCBlZGl0YWJsZS1mb2N1c2FibGUsIHNvIGEga2V5c3Ryb2tlIGZpcmVzIGBiZWZvcmVpbnB1dGAuXG4gICAgLy8gT24gdGhhdCByZWplY3RlZCBhdHRlbXB0LCBmbGFzaCB0aGUgaW5kaWNhdG9ycyBhbmQgYmVlcCBzbyBpdCdzIGNsZWFyIHRoZSBub3RlIGlzIGxvY2tlZC5cbiAgICAvLyBUaGUgbGlzdGVuZXIgaXMgcmVtb3ZlZCBvbiB1bmxvY2suXG4gICAgY29uc3Qgb25UeXBlQXR0ZW1wdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuZmxhc2hJbmRpY2F0b3JzKHZpZXcpO1xuICAgICAgdGhpcy5iZWVwZXIuYmVlcCgpO1xuICAgIH07XG4gICAgdmlldy5jb250ZW50RWwuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCBvblR5cGVBdHRlbXB0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25JY29uRWwsXG4gICAgICBkaXNwb3NlVHlwZUxpc3RlbmVyOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHZpZXcuY29udGVudEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZWlucHV0Jywgb25UeXBlQXR0ZW1wdCk7XG4gICAgICB9LFxuICAgICAgdGFiSWNvbkVsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlQmxvY2tlckluc3RhbGxlZChhcHA6IEFwcCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG5ldyBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnQoe1xuICAgICAgc2hvdWxkQmxvY2tNdXRhdGlvbjogKHBhdGgpOiBib29sZWFuID0+IHRoaXMuc2hvdWxkQmxvY2tNdXRhdGlvbihhcHAsIHBhdGgpXG4gICAgfSk7XG4gICAgdGhpcy5tdXRhdGlvbkJsb2NrZXJDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTdWJzY3JpYmVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXZlbnRzQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gbmV3IFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCh7XG4gICAgICBhcHAsXG4gICAgICBvbkNoYW5nZTogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgICAgfSxcbiAgICAgIG9uRXh0ZXJuYWxNdXRhdGlvbjogKHBhdGgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVFeHRlcm5hbE11dGF0aW9uKGFwcCwgcGF0aCk7XG4gICAgICB9LFxuICAgICAgb25GaWxlTWVudTogKG1lbnUsIGZpbGUpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVGaWxlTWVudShhcHAsIG1lbnUsIGZpbGUpO1xuICAgICAgfSxcbiAgICAgIG9uUmVuYW1lOiAob2xkUGF0aCwgbmV3UGF0aCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVJlbmFtZShhcHAsIG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50LmxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmxhc2hFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZWxlbWVudC5yZW1vdmVDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICAgIC8vIFJlYWQgbGF5b3V0IHRvIGZvcmNlIGEgcmVmbG93IHNvIHRoZSBmbGFzaCBhbmltYXRpb24gcmVzdGFydHMgb24gZXZlcnkgcmVqZWN0ZWQga2V5c3Ryb2tlLlxuICAgIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgZWxlbWVudC5hZGRDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEluZGljYXRvcnModmlldzogTWFya2Rvd25WaWV3KTogdm9pZCB7XG4gICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtpbmRpY2F0b3JzPy5hY3Rpb25JY29uRWwsIGluZGljYXRvcnM/LnRhYkljb25FbCwgdGhpcy5zdGF0dXNCYXJJdGVtRWxdKSB7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICB0aGlzLmZsYXNoRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhY3RzIHRvIGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBwYXRoLiBJZiB0aGUgcGF0aCBpcyBtdXRhdGlvbi1ibG9ja2VkIGFuZCBOT1QgY292ZXJlZCBieSBhblxuICAgKiBhY3RpdmUgYnlwYXNzIHNjb3BlLCB0aGUgY2hhbmdlIGJ5cGFzc2VkIHRoZSBibG9ja2VyIHBhdGNoIChzeW5jIC8gZmlsZXN5c3RlbSAvIGEgcmF3LWFkYXB0ZXJcbiAgICogd3JpdGUpIOKAlCBhbiBpbnRydWRlci4gQWJvcnQgdGhlIGBhYm9ydENvbnRyb2xsZXJgIG9mIGV2ZXJ5IG11dGF0aW9uLWJsb2NraW5nIGxvY2sgY292ZXJpbmcgdGhlIHBhdGhcbiAgICogc28gdGhlIG93bmluZyBvcGVyYXRpb24gY2FuY2VscyBhbmQgcm9sbHMgYmFjay4gQSBuby1vcCBmb3IgdGhlIG93bmVyJ3Mgb3duIChieXBhc3NlZCkgbXV0YXRpb25zLFxuICAgKiBmb3IgdW5ibG9ja2VkIHBhdGhzLCBhbmQgZm9yIGJsb2NraW5nIGxvY2tzIHdpdGggbm8gYGFib3J0Q29udHJvbGxlcmAuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRoZSBldmVudCBmaXJlZCBvbi5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRXh0ZXJuYWxNdXRhdGlvbihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGgpIHx8IHRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoIWVudHJ5LmJsb2Nrc011dGF0aW9ucyB8fCAhZW50cnkuYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9lc0NvdmVyUGF0aCA9IGxvY2tlZFBhdGggPT09IHBhdGggfHwgKGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkpO1xuICAgICAgICBpZiAoZG9lc0NvdmVyUGF0aCkge1xuICAgICAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGaWxlTWVudShhcHA6IEFwcCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIC8vIE9mZmVyIFwiVW5sb2NrXCIgZm9yIGEgZGlyZWN0bHktbG9ja2VkIGZpbGUvZm9sZGVyLCBvciBhbnl0aGluZyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuIFRoZSBtZW51IHRhcmdldHMgdGhlIG93bmVyIGxvY2sncyBwYXRoLlxuICAgIGNvbnN0IG93bmVyUGF0aCA9IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBmaWxlLnBhdGgpO1xuICAgIGlmIChvd25lclBhdGggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRVbmxvY2tNZW51SXRlbShhcHAsIG1lbnUsIG93bmVyUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmUta2V5cyB0aGUgcmVnaXN0cnkgb250byBhIHJlbmFtZWQgcGF0aCwgc28gYSBsb2NrIGZvbGxvd3MgdGhlIHJlc291cmNlIGl0IHdhcyB0YWtlbiBvbi4gTW92ZXNcbiAgICogdGhlIGVudHJpZXMgb2YgdGhlIHJlbmFtZWQgcGF0aCBBTkQgb2YgZXZlcnkgZGVzY2VuZGFudCBrZXkgKGEgZm9sZGVyIHJlbmFtZSBjaGFuZ2VzIGEgd2hvbGUgcGF0aFxuICAgKiBwcmVmaXgpLCBhbmQgcmViYXNlcyBldmVyeSBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZSB0aGUgc2FtZSB3YXkg4oCUIHdpdGhvdXRcbiAgICogdGhhdCBzZWNvbmQgaGFsZiBhbiBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCB3b3VsZCBoYXZlIGl0cyBPV04gbGF0ZXIgbXV0YXRpb25zXG4gICAqIHJlYWQgYXMgaW50cnVkZXJzLlxuICAgKlxuICAgKiBJZGVtcG90ZW50OiBhIHBhdGggdGhhdCBubyBsb25nZXIgbWF0Y2hlcyBpcyBsZWZ0IGFsb25lLCBzbyBpdCBkb2VzIG5vdCBtYXR0ZXIgd2hldGhlciBPYnNpZGlhblxuICAgKiBlbWl0cyB0aGUgZm9sZGVyJ3MgcmVuYW1lIGV2ZW50IGJlZm9yZSBvciBhZnRlciBpdHMgZGVzY2VuZGFudHMnLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgZnJvbS5cbiAgICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgdG8uXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVJlbmFtZShhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDb2xsZWN0IGZpcnN0LCBhcHBseSBhZnRlcjogd3JpdGluZyBiYWNrIHdoaWxlIGl0ZXJhdGluZyB3b3VsZCByZS12aXNpdCB0aGUganVzdC1tb3ZlZCBrZXlzLlxuICAgIGNvbnN0IG1vdmVkRW50cmllc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMb2NrRW50cnlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgobG9ja2VkUGF0aCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBpZiAocmViYXNlZFBhdGggPT09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgZW50cnkucGF0aCA9IHJlYmFzZWRQYXRoO1xuICAgICAgfVxuICAgICAgbW92ZWRFbnRyaWVzQnlQYXRoLnNldChyZWJhc2VkUGF0aCwgZW50cmllcyk7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShsb2NrZWRQYXRoKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtyZWJhc2VkUGF0aCwgZW50cmllc10gb2YgbW92ZWRFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0VudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChyZWJhc2VkUGF0aCk7XG4gICAgICBpZiAoZXhpc3RpbmdFbnRyaWVzKSB7XG4gICAgICAgIC8vIEEgc3dhcCByZW5hbWVzIG9uZSBsb2NrZWQgcGF0aCBvbnRvIGFub3RoZXIsIHNvIHRoZSB0d28gZW50cnkgbGlzdHMgTUVSR0Ug4oCUIG5laXRoZXIgaG9sZGVyIGxvc2VzIGl0cyBsb2NrLlxuICAgICAgICBleGlzdGluZ0VudHJpZXMucHVzaCguLi5lbnRyaWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2V0KHJlYmFzZWRQYXRoLCBlbnRyaWVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgLy8gU2FtZSBjb2xsZWN0LXRoZW4tYXBwbHkgc2hhcGU6IHRoZSBzZXQgbWF5IG5vdCBiZSBtdXRhdGVkIHdoaWxlIGl0IGlzIGJlaW5nIGl0ZXJhdGVkLlxuICAgICAgY29uc3QgcmViYXNlZEJ5cGFzc2VkUGF0aHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgoYnlwYXNzZWRQYXRoLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgaWYgKHJlYmFzZWRQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgcmViYXNlZEJ5cGFzc2VkUGF0aHMuc2V0KGJ5cGFzc2VkUGF0aCwgcmViYXNlZFBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtieXBhc3NlZFBhdGgsIHJlYmFzZWRQYXRoXSBvZiByZWJhc2VkQnlwYXNzZWRQYXRocykge1xuICAgICAgICBieXBhc3NlZFBhdGhzLmRlbGV0ZShieXBhc3NlZFBhdGgpO1xuICAgICAgICBieXBhc3NlZFBhdGhzLmFkZChyZWJhc2VkUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVjb25jaWxlIHVuY29uZGl0aW9uYWxseTogYSByZW5hbWUgY2hhbmdlcyBjb3ZlcmFnZSBldmVuIHdoZW4gbm8ga2V5IG1vdmVkIOKAlCBhIG5vdGUgcmVuYW1lZCBJTlRPXG4gICAgLy8gQSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBiZWNvbWVzIGNvdmVyZWQsIG9uZSByZW5hbWVkIE9VVCBvZiBpdCBzdG9wcyBiZWluZyBjb3ZlcmVkLlxuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0Jsb2NraW5nTG9jaygpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGVudHJpZXMgb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aC52YWx1ZXMoKSkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmJsb2Nrc011dGF0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGF0aCBpcyBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlIOKAlCB0aGVcbiAgICogb3duZXIgZGVjbGFyaW5nIHRoYXQgaXRzIG93biBtdXRhdGlvbnMgb2YgdGhlIHBhdGggKGFuZCwgZm9yIGEgZm9sZGVyLCBpdHMgc3VidHJlZSkgYXJlIHNhbmN0aW9uZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBzb21lIGFjdGl2ZSBieXBhc3Mgc2NvcGUgY292ZXJzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0J5cGFzc2VkKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBpZiAoaXNDaGlsZE9yU2VsZih7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBieXBhc3NlZFBhdGggfSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aExvY2tlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVkdXBsaWNhdGVkIGxpc3Qgb2YgYChwbHVnaW4gbmFtZSwgb3BlcmF0aW9uIG5hbWUpYCBwYWlycyBkZXNjcmliaW5nIHRoZSBsb2NrcyBvbiBhXG4gICAqIHBhdGgg4oCUIG9uZSBwZXIgZGlzdGluY3QgcGx1Z2luK29wZXJhdGlvbi4gRHJpdmVzIHRoZSB1bmxvY2sgY29uZmlybWF0aW9uLCBzbyB0aGUgdXNlciBzZWVzIGV4YWN0bHlcbiAgICogd2hpY2ggb3BlcmF0aW9ucyBhbiB1bmxvY2sgd291bGQgY2FuY2VsLiBPbmx5IGV2ZXIgY2FsbGVkIGZvciBhIGxvY2tlZCBwYXRoLCBzbyBpdHMgZW50cmllcyBhcmVcbiAgICogYWx3YXlzIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBkaXJlY3RseS1sb2NrZWQgcGF0aCB3aG9zZSBsb2NrIGRlc2NyaXB0b3JzIHRvIGJ1aWxkLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzdGluY3QgbG9jayBkZXNjcmlwdG9ycyBjb3ZlcmluZyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgbG9ja0Rlc2NyaXB0b3JzKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBMb2NrRGVzY3JpcHRvcltdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZW50cmllcyk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzOiBMb2NrRGVzY3JpcHRvcltdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBwbHVnaW5OYW1lID0gYXBwLnBsdWdpbnMubWFuaWZlc3RzW2VudHJ5LnBsdWdpbklkXT8ubmFtZSA/PyBlbnRyeS5wbHVnaW5JZDtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BsdWdpbk5hbWV9XFxuJHtlbnRyeS5vcGVyYXRpb25OYW1lfWA7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICBkZXNjcmlwdG9ycy5wdXNoKHsgb3BlcmF0aW9uTmFtZTogZW50cnkub3BlcmF0aW9uTmFtZSwgcGx1Z2luTmFtZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2NraW5nUGx1Z2luTmFtZXMoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgLy8gYGxvY2tpbmdQbHVnaW5OYW1lc2AgaXMgb25seSBldmVyIGNhbGxlZCBmb3IgYSBsb2NrZWQgcGF0aCwgc28gaXRzIGVudHJpZXMgYXJlIGFsd2F5cyBwcmVzZW50LlxuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGNvbnN0IHBsdWdpbklkcyA9IFsuLi5uZXcgU2V0KGVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQpKV07XG4gICAgcmV0dXJuIHBsdWdpbklkcy5tYXAoKHBsdWdpbklkKSA9PiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy5uYW1lID8/IHBsdWdpbklkKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja1Rvb2x0aXAoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaGVhZGVyID0gdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5yZXNvdXJjZUxvY2subG9ja2VkQnlUb29sdGlwKTtcbiAgICAvLyBBIHJ1bnRpbWUtbGVuZ3RoIGxpc3Qgb2YgcGx1Z2luIG5hbWVzLCBvbmUgcGVyIGxpbmUgdW5kZXIgdGhlIGhlYWRlci5cbiAgICByZXR1cm4gW2hlYWRlciwgLi4udGhpcy5sb2NraW5nUGx1Z2luTmFtZXMoYXBwLCBwYXRoKV0uam9pbignXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZShhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZXdzVG9Mb2NrID0gbmV3IFNldDxNYXJrZG93blZpZXc+KCk7XG4gICAgZm9yIChjb25zdCBsZWFmIG9mIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZpZXdUeXBlLk1hcmtkb3duKSkge1xuICAgICAgY29uc3QgdmlldyA9IGxlYWYudmlldztcbiAgICAgIGlmICghKHZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRoID0gdmlldy5maWxlPy5wYXRoO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzb2x2ZSB0aGUgbG9jayBjb3ZlcmluZyB0aGlzIHZpZXc6IHRoZSBleGFjdCBwYXRoIHdoZW4gZGlyZWN0bHkgbG9ja2VkLCBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyBgc3VidHJlZWAtbG9ja2VkIGZvbGRlci4gSW5kaWNhdG9ycy90b29sdGlwL3VubG9jayBtZW51IGtleSBvZmYgdGhhdCBvd25lciBwYXRoLlxuICAgICAgY29uc3Qgb3duZXJQYXRoID0gdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIHBhdGgpO1xuICAgICAgaWYgKG93bmVyUGF0aCA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmlld3NUb0xvY2suYWRkKHZpZXcpO1xuICAgICAgY29uc3QgdG9vbHRpcCA9IHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBvd25lclBhdGgpO1xuICAgICAgLy8gUmUtYXBwbHkgdGhlIHJlYWQtb25seSB0b2dnbGUgb24gZXZlcnkgcmVjb25jaWxlLCBub3Qgb25seSB0aGUgZmlyc3QgdGltZSBhIHZpZXcgaXMgdHJhY2tlZC5cbiAgICAgIC8vIFRoZSB0b2dnbGUgaXMgaWRlbXBvdGVudCwgc28gcmUtYXBwbHlpbmcgdG8gYW4gYWxyZWFkeS1sb2NrZWQgdmlldyBpcyBjaGVhcC5cbiAgICAgIC8vIEEgdmlldyBvcGVuZWQgYWZ0ZXIgdGhlIGxvY2sgaXMgcmVjb25jaWxlZCBzeW5jaHJvbm91c2x5LCBiZWZvcmUgaXRzIENvZGVNaXJyb3IgaXMgcmVhZHkuXG4gICAgICAvLyBJdHMgZmlyc3QgdG9nZ2xlIGlzIHRoZXJlZm9yZSBhIG5vLW9wOyByZS1hcHBseWluZyBtYWtlcyB0aGUgbG9jayB0YWtlIGhvbGQgb25jZSBpdCBzZXR0bGVzLlxuICAgICAgdG9nZ2xlRWRpdG9yUmVhZE9ubHkodmlldy5lZGl0b3IsIHRydWUpO1xuICAgICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgICBpZiAoaW5kaWNhdG9ycykge1xuICAgICAgICB0aGlzLnVwZGF0ZUluZGljYXRvclRvb2x0aXBzKGluZGljYXRvcnMsIHRvb2x0aXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JzQnlWaWV3LnNldCh2aWV3LCB0aGlzLmNyZWF0ZUluZGljYXRvcnMoYXBwLCB2aWV3LCB0b29sdGlwKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbdmlldywgaW5kaWNhdG9yc10gb2YgdGhpcy5pbmRpY2F0b3JzQnlWaWV3KSB7XG4gICAgICBpZiAodmlld3NUb0xvY2suaGFzKHZpZXcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0b2dnbGVFZGl0b3JSZWFkT25seSh2aWV3LmVkaXRvciwgZmFsc2UpO1xuICAgICAgaW5kaWNhdG9ycy5kaXNwb3NlVHlwZUxpc3RlbmVyKCk7XG4gICAgICBpbmRpY2F0b3JzLmFjdGlvbkljb25FbC5yZW1vdmUoKTtcbiAgICAgIGluZGljYXRvcnMudGFiSWNvbkVsPy5yZW1vdmUoKTtcbiAgICAgIHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5kZWxldGUodmlldyk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTdGF0dXNCYXIoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlQW5kQ2xlYW51cChhcHA6IEFwcCk6IHZvaWQge1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgaWYgKHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5ldmVudHNDb21wb25lbnQ/LnVubG9hZCgpO1xuICAgICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNCbG9ja2luZ0xvY2soKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyVW5sb2NrTWVudShhcHA6IEFwcCwgZWxlbWVudDogSFRNTEVsZW1lbnQsIGdldENvbnRleHRQYXRoOiAoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAvLyBBIGNsaWNrIG9mIEFOWSBtb3VzZSBidXR0b24gb24gYSBsb2NrIGluZGljYXRvciBvcGVucyB0aGUgc2FtZSB1bmxvY2sgY29udGV4dCBtZW51OlxuICAgIC8vIGBjbGlja2AgZmlyZXMgb25seSBmb3IgdGhlIHByaW1hcnkgKGxlZnQpIGJ1dHRvbiwgYGNvbnRleHRtZW51YCBmb3IgdGhlIHJpZ2h0IGJ1dHRvbiwgYW5kXG4gICAgLy8gYGF1eGNsaWNrYCBmb3IgdGhlIG1pZGRsZSBidXR0b24gKHRoZSBicm93c2VyIGZpcmVzIG5vIGBjbGlja2AgZm9yIGl0KS4gYGF1eGNsaWNrYCBhbHNvIGZpcmVzIGZvclxuICAgIC8vIHRoZSByaWdodCBidXR0b24sIHNvIGl0IGlzIGd1YXJkZWQgdG8gdGhlIG1pZGRsZSBidXR0b24gdG8gYXZvaWQgZG91YmxlLW9wZW5pbmcgYWxvbmdzaWRlIGBjb250ZXh0bWVudWAuXG4gICAgLy8gQSBwbGFpbiBsaXN0ZW5lciBkaWVzIHdpdGggdGhlIGVsZW1lbnQgd2hlbiBpdCBpcyBgLnJlbW92ZSgpYGQgb24gdW5sb2NrLCBzbyBpdCBuZXZlciBsZWFrcy5cbiAgICBjb25zdCBvcGVuVW5sb2NrTWVudSA9ICgkZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgcGF0aCA9IGdldENvbnRleHRQYXRoKCk7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lbnUgPSBuZXcgTWVudSgpO1xuICAgICAgdGhpcy5hZGRVbmxvY2tNZW51SXRlbShhcHAsIG1lbnUsIHBhdGgpO1xuICAgICAgbWVudS5zaG93QXRNb3VzZUV2ZW50KCRldmVudCk7XG4gICAgfTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlblVubG9ja01lbnUpO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvcGVuVW5sb2NrTWVudSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdhdXhjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgIGlmICgkZXZlbnQuYnV0dG9uID09PSBNSURETEVfTU9VU0VfQlVUVE9OKSB7XG4gICAgICAgIG9wZW5VbmxvY2tNZW51KCRldmVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUVudHJ5KGFwcDogQXBwLCBlbnRyeTogTG9ja0VudHJ5KTogdm9pZCB7XG4gICAgLy8gUmVhZCB0aGUgZW50cnkncyBDVVJSRU5UIHBhdGgsIG5vdCBvbmUgY2FwdHVyZWQgd2hlbiB0aGUgbG9jayB3YXMgdGFrZW46IGEgcmVuYW1lIG1heSBoYXZlXG4gICAgLy8gcmUta2V5ZWQgaXQgc2luY2UsIGFuZCBsb29raW5nIGl0IHVwIHVuZGVyIHRoZSBvbGQgcGF0aCB3b3VsZCBzaWxlbnRseSBsZWFrIHRoZSBsb2NrLlxuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChlbnRyeS5wYXRoKTtcbiAgICBpZiAoIWVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSBlbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5kZWxldGUoZW50cnkucGF0aCk7XG4gICAgfVxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHdoaWNoIGxvY2tlZCBwYXRoIChpZiBhbnkpIGNvdmVycyB0aGUgZ2l2ZW4gcGF0aDogdGhlIHBhdGggaXRzZWxmIHdoZW4gZGlyZWN0bHkgbG9ja2VkLFxuICAgKiBvdGhlcndpc2UgdGhlIGxvbmdlc3QgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIgdGhhdCBjb250YWlucyBpdCAobG9uZ2VzdCBzbyBhIG5lc3RlZFxuICAgKiBzdWJ0cmVlIGxvY2sgd2lucyBkZXRlcm1pbmlzdGljYWxseSBvdmVyIGFuIG91dGVyIG9uZSkuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRvIHJlc29sdmUgYW4gb3duZXIgbG9jayBmb3IuXG4gICAqIEByZXR1cm5zIFRoZSBjb3ZlcmluZyBsb2NrZWQgcGF0aCwgb3IgYG51bGxgIHdoZW4gbm90aGluZyBjb3ZlcnMgaXQuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVMb2NrT3duZXJQYXRoKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc1BhdGhMb2NrZWQocGF0aCkpIHtcbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbiAgICBsZXQgYmVzdE93bmVyUGF0aDogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gICAgZm9yIChjb25zdCBbbG9ja2VkUGF0aCwgZW50cmllc10gb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aCkge1xuICAgICAgY29uc3QgaGFzU3VidHJlZUxvY2sgPSBlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5tb2RlID09PSAnc3VidHJlZScpO1xuICAgICAgaWYgKGhhc1N1YnRyZWVMb2NrICYmIGlzQ2hpbGQoeyBhcHAsIGNoaWxkUGF0aE9yRmlsZTogcGF0aCwgcGFyZW50UGF0aE9yRmlsZTogbG9ja2VkUGF0aCB9KSAmJiAoYmVzdE93bmVyUGF0aCA9PT0gbnVsbCB8fCBsb2NrZWRQYXRoLmxlbmd0aCA+IGJlc3RPd25lclBhdGgubGVuZ3RoKSkge1xuICAgICAgICBiZXN0T3duZXJQYXRoID0gbG9ja2VkUGF0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJlc3RPd25lclBhdGg7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGxvY2sgY292ZXJpbmcgdGhlIG5vdGUgYSB2aWV3IGN1cnJlbnRseSBzaG93cyDigJQgaXRzIG93biBwYXRoIHdoZW4gZGlyZWN0bHkgbG9ja2VkLFxuICAgKiBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyBgc3VidHJlZWAtbG9ja2VkIGZvbGRlci4gUmVhZCBhdCBjbGljayB0aW1lIGJ5IHRoZSB2aWV3J3MgbG9jayBpbmRpY2F0b3JzLFxuICAgKiBzbyBpdCByZWZsZWN0cyByZW5hbWVzIG9mIHRoZSBub3RlIGFuZCBvZiB0aGUgbG9ja2VkIGZvbGRlciBhbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB2aWV3IC0gVGhlIHZpZXcgd2hvc2UgY3VycmVudCBmaWxlIHRvIHJlc29sdmUgYW4gb3duZXIgbG9jayBmb3IuXG4gICAqIEByZXR1cm5zIFRoZSBjb3ZlcmluZyBsb2NrZWQgcGF0aCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgdmlldyBoYXMgbm8gZmlsZSBvciBub3RoaW5nIGNvdmVycyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVZpZXdPd25lclBhdGgoYXBwOiBBcHAsIHZpZXc6IE1hcmtkb3duVmlldyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0aCA9IHZpZXcuZmlsZT8ucGF0aDtcbiAgICByZXR1cm4gcGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIHBhdGgpID8/IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBtdXRhdGlvbiBvZiB0aGUgcGF0aCBtdXN0IGJlIGJsb2NrZWQ6IGB0cnVlYCB3aGVuIHRoZSBwYXRoIGlzIG11dGF0aW9uLWJsb2NrZWRcbiAgICogYW5kIG5vdCBjb3ZlcmVkIGJ5IGFueSBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZS5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggYmVpbmcgbXV0YXRlZC5cbiAgICogQHJldHVybnMgYHRydWVgIHRvIHJlamVjdCB0aGUgbXV0YXRpb24sIGBmYWxzZWAgdG8gYWxsb3cgaXQuXG4gICAqL1xuICBwcml2YXRlIHNob3VsZEJsb2NrTXV0YXRpb24oYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGgpICYmICF0aGlzLmlzQnlwYXNzZWQoYXBwLCBwYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5sb2NrQ29uZmlybU1lc3NhZ2UoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIucmVzb3VyY2VMb2NrLnVubG9ja0NvbmZpcm1NZXNzYWdlKSk7XG4gICAgLy8gQSBydW50aW1lLWxlbmd0aCBsaXN0IG9mIHRoZSBsb2NrcyBjdXJyZW50bHkgaGVsZDogZWFjaCBwbHVnaW4gbmFtZSBhcyBhIGNvZGUgYmxvY2sgZm9sbG93ZWQgYnlcbiAgICAvLyB0aGUgb3BlcmF0aW9uIGl0IGlzIHJ1bm5pbmcsIG9uZSBwZXIgbGluZS5cbiAgICBmb3IgKGNvbnN0IGRlc2NyaXB0b3Igb2YgdGhpcy5sb2NrRGVzY3JpcHRvcnMoYXBwLCBwYXRoKSkge1xuICAgICAgZnJhZ21lbnQuY3JlYXRlRWwoJ2JyJyk7XG4gICAgICBhcHBlbmRDb2RlQmxvY2soZnJhZ21lbnQsIGRlc2NyaXB0b3IucGx1Z2luTmFtZSk7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KGA6ICR7ZGVzY3JpcHRvci5vcGVyYXRpb25OYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUluZGljYXRvclRvb2x0aXBzKGluZGljYXRvcnM6IExvY2tJbmRpY2F0b3JzLCB0b29sdGlwOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzZXRUb29sdGlwKGluZGljYXRvcnMuYWN0aW9uSWNvbkVsLCB0b29sdGlwKTtcbiAgICBpZiAoaW5kaWNhdG9ycy50YWJJY29uRWwpIHtcbiAgICAgIHNldFRvb2x0aXAoaW5kaWNhdG9ycy50YWJJY29uRWwsIHRvb2x0aXApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhdHVzQmFyKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlVmlldyA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICAgIGNvbnN0IGFjdGl2ZVBhdGggPSBhY3RpdmVWaWV3Py5maWxlPy5wYXRoO1xuICAgIGNvbnN0IGFjdGl2ZU93bmVyUGF0aCA9IGFjdGl2ZVBhdGggPT09IHVuZGVmaW5lZCA/IG51bGwgOiB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgYWN0aXZlUGF0aCk7XG5cbiAgICBpZiAoYWN0aXZlT3duZXJQYXRoID09PSBudWxsIHx8ICFhY3RpdmVWaWV3KSB7XG4gICAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbD8ucmVtb3ZlKCk7XG4gICAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0YXR1c0Jhckl0ZW1FbCkge1xuICAgICAgY29uc3Qgc3RhdHVzQmFyRWwgPSBhY3RpdmVWaWV3LmNvbnRhaW5lckVsLm93bmVyRG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihTVEFUVVNfQkFSX0NTU19TRUxFQ1RPUik7XG4gICAgICBpZiAoIXN0YXR1c0JhckVsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsID0gc3RhdHVzQmFyRWwuY3JlYXRlRGl2KHsgY2xzOiBbU1RBVFVTX0JBUl9JVEVNX0NTU19DTEFTUywgTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTXSB9KTtcbiAgICAgIHNldEljb24odGhpcy5zdGF0dXNCYXJJdGVtRWwsIExPQ0tfSUNPTl9JRCk7XG4gICAgICAvLyBUaGUgc2luZ2xlIHN0YXR1cy1iYXIgaXRlbSBpcyByZXVzZWQgYWNyb3NzIGFjdGl2ZS1ub3RlIHN3aXRjaGVzLlxuICAgICAgLy8gSXQgbXVzdCByZXNvbHZlIHRoZSBjdXJyZW50bHkgYWN0aXZlIG5vdGUncyBvd25lciBsb2NrIGF0IGNsaWNrIHRpbWUgcmF0aGVyIHRoYW4gY2FwdHVyaW5nIG9uZSBwYXRoLlxuICAgICAgdGhpcy5yZWdpc3RlclVubG9ja01lbnUoYXBwLCB0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYXRoID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk/LmZpbGU/LnBhdGg7XG4gICAgICAgIHJldHVybiBwYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCkgPz8gdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0VG9vbHRpcCh0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgdGhpcy5sb2NrVG9vbHRpcChhcHAsIGFjdGl2ZU93bmVyUGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpcmVzIGFuIG9wdC1pbiBgYWJvcnRgIGxpc3RlbmVyIGZvciBhIGxvY2sgZW50cnk6IHdoZW4gdGhlIGVudHJ5J3MgY29udHJvbGxlciBhYm9ydHMsIHJlbGVhc2VzXG4gICAqIHRoZSBlbnRyeSAoaWYge0BsaW5rIExvY2tFbnRyeS5zaG91bGRSZWxlYXNlT25BYm9ydH0pIGFuZC9vciBpbnZva2VzXG4gICAqIHtAbGluayBMb2NrRW50cnkub25VbmxvY2tSZXF1ZXN0ZWR9LiBBIG5vLW9wIHdoZW4gdGhlIGVudHJ5IGhhcyBubyBjb250cm9sbGVyIG9yIG5laXRoZXIgb3B0LWluIGlzXG4gICAqIHNldCwgc28gdHJhbnNhY3Rpb25hbCBsb2NrcyBrZWVwIHJlbGVhc2luZyB2aWEgdGhlaXIgb3duIGNsZWFudXAuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gZW50cnkgLSBUaGUgbG9jayBlbnRyeSB3aG9zZSBjb250cm9sbGVyIHRvIG9ic2VydmUuXG4gICAqL1xuICBwcml2YXRlIHdpcmVSZWxlYXNlT25BYm9ydChhcHA6IEFwcCwgZW50cnk6IExvY2tFbnRyeSk6IHZvaWQge1xuICAgIGNvbnN0IHsgb25VbmxvY2tSZXF1ZXN0ZWQsIHNob3VsZFJlbGVhc2VPbkFib3J0IH0gPSBlbnRyeTtcbiAgICBpZiAoIWVudHJ5LmFib3J0Q29udHJvbGxlciB8fCAoIXNob3VsZFJlbGVhc2VPbkFib3J0ICYmICFvblVubG9ja1JlcXVlc3RlZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW50cnkuYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgIGlmIChzaG91bGRSZWxlYXNlT25BYm9ydCkge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5KGFwcCwgZW50cnkpO1xuICAgICAgfVxuICAgICAgb25VbmxvY2tSZXF1ZXN0ZWQ/LigpO1xuICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIE1vbmtleS1wYXRjaGVzIHRoZSB2YXVsdC1tdXRhdGlvbiBjaG9rZSBwb2ludHMgb24gYFZhdWx0YC9gRmlsZU1hbmFnZXJgIHNvIHRoYXQgYW55IGVkaXQsIGRlbGV0ZSxcbiAqIHJlbmFtZSwgbW92ZSwgb3IgKHJlKWNyZWF0ZSBvZiBhIG11dGF0aW9uLWJsb2NrZWQgcGF0aCB0aHJvd3MgYSB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gKiBJbnN0YWxsZWQgbGF6aWx5IGJ5IHtAbGluayBSZXNvdXJjZUxvY2tNYW5hZ2VyfSBvbiB0aGUgZmlyc3QgYHNob3VsZEJsb2NrTXV0YXRpb25zYCBsb2NrIGFuZCByZW1vdmVkXG4gKiB3aGVuIHRoZSBsYXN0IG9uZSBpcyByZWxlYXNlZDsgYmVpbmcgYSB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50fSwgZXZlcnkgcGF0Y2ggaXMgdG9ybiBkb3duIG9uXG4gKiBgdW5sb2FkYC4gUmVuYW1lL2NvcHkgY2hlY2sgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOyB0aGUgb3RoZXIgbWV0aG9kcyBjaGVjayB0aGVpciBzaW5nbGUgcGF0aC5cbiAqL1xuY2xhc3MgUmVzb3VyY2VMb2NrTXV0YXRpb25CbG9ja2VyQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNob3VsZEJsb2NrTXV0YXRpb24gPSBwYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdhcHBlbmQnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnYXBwZW5kJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjb3B5Jz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2NvcHknLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFssIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NyZWF0ZSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdjcmVhdGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtwYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbcGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjcmVhdGVCaW5hcnknPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnY3JlYXRlQmluYXJ5JyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbcGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW3BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY3JlYXRlRm9sZGVyJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2NyZWF0ZUZvbGRlcicsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtwYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2RlbGV0ZSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdkZWxldGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ21vZGlmeSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdtb2RpZnknLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ21vZGlmeUJpbmFyeSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdtb2RpZnlCaW5hcnknLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3Byb2Nlc3MnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAncHJvY2VzcycsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAncmVuYW1lJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3JlbmFtZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGUsIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGgsIG5ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAndHJhc2gnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2gnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3JlbmFtZUZpbGUnPih7XG4gICAgICAkb2JqZWN0OiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAncmVuYW1lRmlsZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGUsIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGgsIG5ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPEZpbGVNYW5hZ2VyLCAndHJhc2hGaWxlJz4oe1xuICAgICAgJG9iamVjdDogRmlsZU1hbmFnZXIucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoRmlsZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzc2VydE5vdEJsb2NrZWQocGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRCbG9ja011dGF0aW9uKHBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUxvY2tlZEVycm9yKHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEEgcGVyLXBsdWdpbiBoYW5kbGUgZm9yIHBhdGgtc2NvcGVkIHJlc291cmNlIGxvY2tpbmcgKGVkaXRvciByZWFkLW9ubHksIG9wdGlvbmFsIHZhdWx0LW11dGF0aW9uXG4gKiBibG9ja2luZywgYW5kIGV4dGVybmFsLWNoYW5nZSBkZXRlY3Rpb24g4oCUIHNlZSB0aGUgZmlsZSBvdmVydmlldykuIEFkZCBpdCBhcyBhIGNoaWxkIG9mIHlvdXIgcGx1Z2luXG4gKiAoYHRoaXMuYWRkQ2hpbGQobmV3IFJlc291cmNlTG9ja0NvbXBvbmVudCh0aGlzLmFwcCkpYCkgc28gdGhhdCBhbnkgbG9ja3MgaXQgc3RpbGwgaG9sZHMgYXJlIHJlbGVhc2VkXG4gKiBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBsdWdpbiB1bmxvYWRzIOKAlCBhIHJlc291cmNlIGNhbiBuZXZlciBiZSBsZWZ0IHN0dWNrIGxvY2tlZCBiZWNhdXNlIHRoZSBwbHVnaW5cbiAqIHRoYXQgbG9ja2VkIGl0IHdhcyBkaXNhYmxlZCBvciByZWxvYWRlZCBtaWQtb3BlcmF0aW9uLlxuICpcbiAqIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBhbmQgYXR0cmlidXRlZCB0byB0aGlzIHBsdWdpbiwgc28gdGhlIGxvY2sgaW5kaWNhdG9ycycgdG9vbHRpcCBuYW1lcyBpdFxuICogYW1vbmcgdGhlIHBsdWdpbnMgY3VycmVudGx5IGhvbGRpbmcgYSBsb2NrLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VMb2NrQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBvd25pbmcgcGx1Z2luIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKS4gTG9ja3MgYXJlIGF0dHJpYnV0ZWQgdG8gaXQgZm9yXG4gICAqIHJlZmVyZW5jZS1jb3VudGluZyBhbmQgdGhlIGluZGljYXRvcnMnIFwibG9ja2VkIGJ5XCIgdG9vbHRpcC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIHJlc291cmNlLWxvY2sgaGFuZGxlIG93bmVkIGJ5IGEgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGlkIG9mIHRoZSBvd25pbmcgcGx1Z2luIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKS4gTG9ja3MgYXJlIGF0dHJpYnV0ZWQgdG9cbiAgICogaXQgZm9yIHJlZmVyZW5jZS1jb3VudGluZyBhbmQgdGhlIGluZGljYXRvcnMnIFwibG9ja2VkIGJ5XCIgdG9vbHRpcC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGFuICoqYW1iaWVudCBieXBhc3Mgc2NvcGUqKjogd2hpbGUgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBpcyBub3QgZGlzcG9zZWQsIHRoaXNcbiAgICogcGx1Z2luJ3Mgb3duIG11dGF0aW9ucyBvZiB0aGUgZ2l2ZW4gcGF0aHMgKGFuZCwgZm9yIGEgZm9sZGVyLCBpdHMgd2hvbGUgc3VidHJlZSkgcGFzcyB0aHJvdWdoIHRoZVxuICAgKiBtdXRhdGlvbiBibG9ja2VyIGluc3RlYWQgb2YgdGhyb3dpbmcge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LiBBbnkgbXV0YXRpb24gb2YgYSBibG9ja2VkIHBhdGhcbiAgICogTk9UIGNvdmVyZWQgYnkgYW4gYWN0aXZlIGJ5cGFzcyBzY29wZSBpcyBzdGlsbCByZWplY3RlZC4gVXNlIGl0IHdpdGggYSBgdXNpbmdgIGRlY2xhcmF0aW9uIGFyb3VuZFxuICAgKiB0aGUgb3BlcmF0aW9uIHRoYXQgbGVnaXRpbWF0ZWx5IG11dGF0ZXMgcmVzb3VyY2VzIGl0IGhhcyBsb2NrZWQgd2l0aFxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbnN9OlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiB1c2luZyBfYnlwYXNzID0gY29tcG9uZW50LmJ5cGFzc0Jsb2NrZWRNdXRhdGlvbnMoW3NvdXJjZUZpbGUsIHRhcmdldEZpbGVdKTtcbiAgICogLy8gLi4uIHRoZSBvcGVyYXRpb24ncyBvd24gdmF1bHQgbXV0YXRpb25zIG9mIHRob3NlIHBhdGhzIGFyZSBhbGxvd2VkIC4uLlxuICAgKiAvLyBzY29wZSBlbmQ6IHRoZSBwYXRocyBhcmUgZW5mb3JjZWQgYWdhaW5cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoc09yRmlsZXMgLSBUaGUgcGF0aHMgKG9yIGZpbGVzL2ZvbGRlcnMpIHdob3NlIG11dGF0aW9uIGJ5IHRoaXMgb3BlcmF0aW9uIGlzIHNhbmN0aW9uZWQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgZW5kcyB0aGUgYnlwYXNzIHNjb3BlIHdoZW4gZGlzcG9zZWQuXG4gICAqL1xuICBwdWJsaWMgYnlwYXNzQmxvY2tlZE11dGF0aW9ucyhwYXRoc09yRmlsZXM6IHJlYWRvbmx5IFBhdGhPckZpbGVbXSk6IERpc3Bvc2FibGUge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuYnlwYXNzKHRoaXMuYXBwLCBwYXRoc09yRmlsZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwYXRoIGlzIGxvY2tlZCBkaXJlY3RseSBvciBsaWVzIHVuZGVyIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGl0c2VsZiBsb2NrZWQgb3IgaXMgY292ZXJlZCBieSBhIGBzdWJ0cmVlYCBsb2NrIG9uIGFuIGFuY2VzdG9yLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkQnlBbmNlc3RvckZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWRCeUFuY2VzdG9yKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkIGJ5IGFueSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub3RlIGhhcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGxvY2ssIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZCh0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSB2YXVsdCBtdXRhdGlvbiBvZiB0aGUgcGF0aCBpcyBjdXJyZW50bHkgYmxvY2tlZCBieSBhIGBzaG91bGRCbG9ja011dGF0aW9uc2AgbG9ja1xuICAgKiBvbiB0aGUgcGF0aCBpdHNlbGYgb3Igb24gYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgZWRpdGluZy9kZWxldGluZy9yZW5hbWluZy9tb3ZpbmcvY3JlYXRpbmcgdGhlIHBhdGggd291bGQgdGhyb3cgYVxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gICAqL1xuICBwdWJsaWMgaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3IodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIG9uIGJlaGFsZiBvZiB0aGlzIHBsdWdpbiwgbWFraW5nIGl0IHJlYWQtb25seSBpbiBldmVyeSBjdXJyZW50XG4gICAqIGFuZCBmdXR1cmUge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQuIFJlZmVyZW5jZS1jb3VudGVkOiBiYWxhbmNlIGVhY2ggY2FsbFxuICAgKiB3aXRoIGEgZGlzcG9zZSBvZiB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IChpZGVhbGx5IHZpYSBgdXNpbmdgKSBvciB7QGxpbmsgdW5sb2NrRm9yUGF0aH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBMb2NraW5nIHBhcmFtZXRlcnMuIEl0cyB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMucGF0aE9yRmlsZX1cbiAgICogYW5kIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5vcGVyYXRpb25OYW1lfSBhcmUgcmVxdWlyZWQgKHRoZSBsYXR0ZXIgaXMgc2hvd25cbiAgICogaW4gdGhlIHVubG9jayBjb25maXJtYXRpb24pLiBQYXNzIGFuIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9XG4gICAqIHRvIG1ha2UgdGhlIGxvY2sgY2FuY2VsYWJsZSB2aWEgYSBsb2NrIGluZGljYXRvcidzIFwidW5sb2NrXCIgbWVudSwgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZCxcbiAgICogb3Ige0BsaW5rIHJlcXVlc3RSZXNvdXJjZVVubG9ja0ZvclBhdGh9LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAgICovXG4gIHB1YmxpYyBsb2NrRm9yUGF0aChwYXJhbXM6IFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKHtcbiAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlcixcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBibG9ja3NNdXRhdGlvbnM6IHBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9ucyxcbiAgICAgIG1vZGU6IHBhcmFtcy5tb2RlLFxuICAgICAgb25VbmxvY2tSZXF1ZXN0ZWQ6IHBhcmFtcy5vblVubG9ja1JlcXVlc3RlZCxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgICAgcGF0aE9yRmlsZTogcGFyYW1zLnBhdGhPckZpbGUsXG4gICAgICBwbHVnaW5JZDogdGhpcy5wbHVnaW5JZCxcbiAgICAgIHNob3VsZFJlbGVhc2VPbkFib3J0OiBwYXJhbXMuc2hvdWxkUmVsZWFzZU9uQWJvcnRcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBldmVyeSBsb2NrIHN0aWxsIGhlbGQgYnkgdGhpcyBwbHVnaW4gd2hlbiB0aGUgY29tcG9uZW50IChhbmQgdGh1cyB0aGUgcGx1Z2luKSB1bmxvYWRzLFxuICAgKiBzbyBubyBub3RlIGlzIGxlZnQgc3R1Y2sgcmVhZC1vbmx5IGJ5IGFuIG9wZXJhdGlvbiB0aGF0IG5ldmVyIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkudW5sb2NrQWxsRm9yUGx1Z2luKHRoaXMuYXBwLCB0aGlzLnBsdWdpbklkKTtcbiAgICBzdXBlci5vbnVubG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHVubG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGg6IHJlc29sdmVzIHRoZSBsb2NrIGNvdmVyaW5nIGl0ICh0aGUgcGF0aCBpdHNlbGYgd2hlblxuICAgKiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyKSwgY2FuY2VscyB0aGUgb3BlcmF0aW9uKHMpIHRoYXQgdG9va1xuICAgKiB0aGUgbG9jayBieSBhYm9ydGluZyB0aGVpciB7QGxpbmsgQWJvcnRDb250cm9sbGVyfXMsIGFuZCByZWxlYXNlcyB0aGUgbG9jayBzbyB0aGUgbm90ZSBiZWNvbWVzXG4gICAqIGVkaXRhYmxlIOKAlCByZWdhcmRsZXNzIG9mIHdoaWNoIHBsdWdpbiBob2xkcyB0aGUgbG9jay4gUG93ZXJzIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQuIEFcbiAgICogbm8tb3Agd2hlbiBub3RoaW5nIGNvdmVycyB0aGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAgICovXG4gIHB1YmxpYyByZXF1ZXN0VW5sb2NrRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLmZvcmNlVW5sb2NrKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tGb3JQYXRofS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAgICovXG4gIHB1YmxpYyB1bmxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkudW5sb2NrKHRoaXMuYXBwLCBwYXRoT3JGaWxlLCB0aGlzLnBsdWdpbklkKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biBieSB0aGUgdmF1bHQtbXV0YXRpb24gYmxvY2tlciB3aGVuIGEgcGx1Z2luIHRyaWVzIHRvIGVkaXQsIGRlbGV0ZSwgcmVuYW1lLCBtb3ZlLCBvciBjcmVhdGUgYVxuICogcmVzb3VyY2Ugd2hvc2UgcGF0aCBpcyBjb3ZlcmVkIGJ5IGEgbG9jayB0YWtlbiB3aXRoXG4gKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbnN9LlxuICpcbiAqIGBpbnN0YW5jZW9mIFJlc291cmNlTG9ja2VkRXJyb3JgIGlzIHN0cnVjdHVyYWw6IGl0IG1hdGNoZXMgYW55IGVycm9yIG5hbWVkIGBSZXNvdXJjZUxvY2tlZEVycm9yYCB0aGF0IGNhcnJpZXMgYVxuICogc3RyaW5nIGBwYXRoYCwgd2hpY2hldmVyIGNvcHkgb2YgdGhpcyBsaWJyYXJ5IHRocmV3IGl0LiBUaGUgYmxvY2tlciBiZWxvbmdzIHRvIHRoZSByZWFsbS13aWRlIGxvY2sgbWFuYWdlciBpbiB0aGVcbiAqIHNoYXJlZC1zdGF0ZSBiYWcsIGFuZCB0aGF0IG1hbmFnZXIgaXMgYnVpbHQgYnkgd2hpY2hldmVyIGNvcHkgb2YgdGhlIGxpYnJhcnkgdG91Y2hlZCBpdCBmaXJzdCwgc28gdGhlIGVycm9yIGFcbiAqIHBsdWdpbiBjYXRjaGVzIGlzIG9mdGVuIGFub3RoZXIgcGx1Z2luJ3MgY2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxvY2tlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIHZhdWx0IHBhdGggd2hvc2UgbXV0YXRpb24gd2FzIGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSB2YXVsdCBwYXRoIHdob3NlIG11dGF0aW9uIHdhcyBibG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZykge1xuICAgIHN1cGVyKGBUaGUgcmVzb3VyY2UgXCIke3BhdGh9XCIgaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgbXV0YXRlZC5gKTtcbiAgICB0aGlzLm5hbWUgPSBSRVNPVVJDRV9MT0NLRURfRVJST1JfTkFNRTtcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGNoZXMgYSB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0gdGhyb3duIGJ5IGFueSBjb3B5IG9mIHRoaXMgbGlicmFyeSwgYnkgaXRzIGBuYW1lYCBhbmQgYHBhdGhgLlxuICAgKiBBIHN1YmNsYXNzIGtlZXBzIHRoZSBvcmRpbmFyeSBwcm90b3R5cGUgY2hlY2suXG4gICAqXG4gICAqIEBwYXJhbSBpbnN0YW5jZSAtIFRoZSB2YWx1ZSBvbiB0aGUgbGVmdCBvZiBgaW5zdGFuY2VvZmAuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgYSByZXNvdXJjZS1sb2NrZWQgZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFtTeW1ib2wuaGFzSW5zdGFuY2VdKGluc3RhbmNlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY2xhc3MtcmVmZXJlbmNlLWluLXN0YXRpYy1tZXRob2RzIC0tIFRlbGxpbmcgdGhpcyBjbGFzcyBmcm9tIGEgc3ViY2xhc3MgaXMgdGhlIHBvaW50IG9mIHRoZSBjb21wYXJpc29uLlxuICAgIGlmICh0aGlzICE9PSBSZXNvdXJjZUxvY2tlZEVycm9yKSB7XG4gICAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0uY2FsbCh0aGlzLCBpbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UgIT09ICdvYmplY3QnIHx8IGluc3RhbmNlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGluc3RhbmNlIGFzIFBhcnRpYWw8UmVjb3JkPCduYW1lJyB8ICdwYXRoJywgdW5rbm93bj4+O1xuICAgIHJldHVybiBjYW5kaWRhdGUubmFtZSA9PT0gUkVTT1VSQ0VfTE9DS0VEX0VSUk9SX05BTUUgJiYgdHlwZW9mIGNhbmRpZGF0ZS5wYXRoID09PSAnc3RyaW5nJztcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vdGUgaGFzIGF0IGxlYXN0IG9uZSBhY3RpdmUgbG9jaywgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZCBkaXJlY3RseSBPUiBpcyBjb3ZlcmVkIGJ5IGFcbiAqIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICpcbiAqIFVubGlrZSB7QGxpbmsgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGh9LCB3aGljaCBvbmx5IHJlcG9ydHMgYW4gZXhhY3QtcGF0aCBsb2NrLCB0aGlzIGFsc28gcmVwb3J0cyBhXG4gKiBwYXRoIHRoYXQgbGllcyB1bmRlciBhIGZvbGRlciBsb2NrZWQgaW4gYHN1YnRyZWVgIG1vZGUuIFVzZSBpdCB0byBkZXRlY3QgdGhhdCBhIHJlbmFtZS9tb3ZlIGlzXG4gKiBoYXBwZW5pbmcgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGUgYWZmZWN0ZWQgZm9sZGVyXG4gKiBzdWJ0cmVlKSwgc28gdGhhdCBhIGJ5c3RhbmRlciAoZS5nLiB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyKSBjYW4gc3RheSBvdXQgb2YgdGhlIHdheSBhbmQgbGV0IHRoZVxuICogdHJhbnNhY3Rpb24ncyBvd25lciBrZWVwIGl0cyBvd24gbGlua3MgY29uc2lzdGVudC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZVxuICoge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIGFuZCBzaG93aW5nIGEgbG9jayBpbmRpY2F0b3IgaW4gdGhlIHRhYiBoZWFkZXIsXG4gKiB2aWV3IGFjdGlvbiBiYXIsIGFuZCAod2hpbGUgYWN0aXZlKSB0aGUgc3RhdHVzIGJhci4gVGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgdGhlIHBsdWdpbnNcbiAqIHRoYXQgY3VycmVudGx5IGhvbGQgYSBsb2NrIG9uIHRoZSBub3RlLlxuICpcbiAqIFRoZSBsb2NrIGlzIHJlZmVyZW5jZS1jb3VudGVkIHBlciBjYWxsaW5nIHBsdWdpbjogZWFjaCBjYWxsIG11c3QgYmUgYmFsYW5jZWQgYnkgZXhhY3RseSBvbmVcbiAqIHJlbGVhc2UgKGVpdGhlciBkaXNwb3NpbmcgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSDigJQgaWRlYWxseSB2aWEgYSBgdXNpbmdgIGRlY2xhcmF0aW9uIOKAlCBvclxuICogYSBtYXRjaGluZyB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBjYWxsKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGxvY2tpbmcgdGhlIG5vdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2tSZXNvdXJjZUZvclBhdGgocGFyYW1zOiBMb2NrUmVzb3VyY2VGb3JQYXRoUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayh7XG4gICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgIHBhdGhPckZpbGU6IHBhcmFtcy5wYXRoT3JGaWxlLFxuICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWRcbiAgfSk7XG59XG5cbi8qKlxuICogUmVxdWVzdHMgYW4gdW5sb2NrIG9mIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGJ5IGFib3J0aW5nIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IHRoYXQgd2FzXG4gKiBhc3NvY2lhdGVkIHdpdGggYSBsb2NrIG9uIGl0ICh2aWEge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5sb2NrRm9yUGF0aH0nc1xuICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn0pLiBUaGUgb3BlcmF0aW9ucyBob2xkaW5nIHRoZSBsb2NrXG4gKiBvYnNlcnZlIHRoZSBhYm9ydCBhbmQgcmVsZWFzZSB0aGVpciBvd24gbG9ja3MuIEEgbm8tb3Agd2hlbiBubyBhYm9ydGFibGUgbG9jayBpcyByZWdpc3RlcmVkIGZvciB0aGVcbiAqIHBhdGguXG4gKlxuICogVGhpcyBsZXRzIGEgY29uc3VtaW5nIHBsdWdpbiB3aXJlIGl0cyBvd24gXCJ1bmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kIHdpdGhvdXQgcmVhY2hpbmcgaW50byB0aGVcbiAqIGxvY2sgbWFuYWdlciBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byByZXF1ZXN0IGFuIHVubG9jayBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS5yZXF1ZXN0VW5sb2NrKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrUmVzb3VyY2VGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGhvbGRzIHRoZSBsb2NrIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKTsgb25lIG9mIGl0c1xuICogbG9ja3Mgb24gdGhlIG5vdGUgaXMgcmVsZWFzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tSZXNvdXJjZUZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnVubG9jayhhcHAsIHBhdGhPckZpbGUsIHBsdWdpbklkKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBSZXNvdXJjZUxvY2tNYW5hZ2VyIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuTGliU3RhdGU8UmVzb3VyY2VMb2NrTWFuYWdlcj4oUkVTT1VSQ0VfTE9DS19TVEFURV9LRVksIG5ldyBSZXNvdXJjZUxvY2tNYW5hZ2VyKCkpLnZhbHVlO1xufVxuXG4vKipcbiAqIE1hcHMgYSBzdG9yZWQgcGF0aCB0aHJvdWdoIGEgcmVuYW1lOiB0aGUgcmVuYW1lZCBwYXRoIGl0c2VsZiBiZWNvbWVzIHRoZSBuZXcgcGF0aCwgYW5kIGEgZGVzY2VuZGFudFxuICogb2YgaXQga2VlcHMgaXRzIHN1ZmZpeCB1bmRlciB0aGUgbmV3IHBhdGguIFNwZWxsZWQgb3V0IHJhdGhlciB0aGFuIHJldXNpbmcge0BsaW5rIGlzQ2hpbGRPclNlbGZ9XG4gKiBiZWNhdXNlIHRoZSByZWJhc2VkIHN1ZmZpeCBoYXMgdG8gYmUgY29tcHV0ZWQgZnJvbSB0aGUgc2FtZSBwcmVmaXggdGhlIHRlc3QgbWF0Y2hlZCwgYW5kIGEgcmVuYW1lXG4gKiBzb3VyY2UgaXMgbmV2ZXIgdGhlIHZhdWx0IHJvb3QgKHRoZSBvbmUgY2FzZSB0aG9zZSBoZWxwZXJzIHRyZWF0IHNwZWNpYWxseSkuXG4gKlxuICogQHBhcmFtIHBhdGggLSBUaGUgc3RvcmVkIHBhdGggdG8gbWFwLlxuICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgZnJvbS5cbiAqIEBwYXJhbSBuZXdQYXRoIC0gVGhlIHBhdGggdGhlIHJlc291cmNlIHdhcyByZW5hbWVkIHRvLlxuICogQHJldHVybnMgVGhlIHJlYmFzZWQgcGF0aCwgb3IgYG51bGxgIHdoZW4gdGhlIHJlbmFtZSBkb2VzIG5vdCBhZmZlY3QgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlYmFzZVBhdGgocGF0aDogc3RyaW5nLCBvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICBpZiAocGF0aCA9PT0gb2xkUGF0aCkge1xuICAgIHJldHVybiBuZXdQYXRoO1xuICB9XG4gIHJldHVybiBwYXRoLnN0YXJ0c1dpdGgoYCR7b2xkUGF0aH0vYCkgPyBuZXdQYXRoICsgcGF0aC5zbGljZShvbGRQYXRoLmxlbmd0aCkgOiBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBDQSxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLGNBQWM7QUFDdkI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7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
|
package/package.json
CHANGED