genassist-chat-react 1.0.39 → 1.0.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dist/components/BubbleDock.d.ts +19 -0
- package/dist/components/BubbleDock.js +129 -0
- package/dist/components/DynamicFormMessage.d.ts +8 -2
- package/dist/components/DynamicFormMessage.js +99 -55
- package/dist/components/GenAgentChat.js +427 -247
- package/dist/components/GenAgentConfigPanel.d.ts +2 -0
- package/dist/components/GenAgentConfigPanel.js +4 -2
- package/dist/hooks/useChat.d.ts +4 -1
- package/dist/hooks/useChat.js +81 -39
- package/dist/hooks/useViewportManager.d.ts +2 -0
- package/dist/hooks/useViewportManager.js +14 -1
- package/dist/services/chatService.d.ts +19 -2
- package/dist/services/chatService.js +46 -3
- package/dist/styles/genAgentChatStyles.d.ts +13 -7
- package/dist/styles/genAgentChatStyles.js +127 -43
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.js +1 -1
- package/package.json +6 -3
|
@@ -76,6 +76,9 @@ var ChatService = /** @class */ (function () {
|
|
|
76
76
|
this.welcomeData = {};
|
|
77
77
|
this.thinkingConfig = { phrases: [], delayMs: 1000 };
|
|
78
78
|
this.chatInputMetadata = {};
|
|
79
|
+
// Set from the start response: when true, a Human In The Loop node with "show_on_start"
|
|
80
|
+
// is wired directly after Start, so the widget auto-runs the workflow as the chat opens.
|
|
81
|
+
this.triggerStartForm = false;
|
|
79
82
|
this.welcomeObjectUrl = null; // to revoke on reset
|
|
80
83
|
this.availableLanguages = null;
|
|
81
84
|
this.agentChatLocales = null;
|
|
@@ -255,6 +258,13 @@ var ChatService = /** @class */ (function () {
|
|
|
255
258
|
ChatService.prototype.getChatInputMetadata = function () {
|
|
256
259
|
return __assign({}, this.chatInputMetadata);
|
|
257
260
|
};
|
|
261
|
+
/**
|
|
262
|
+
* Whether the widget should auto-run the workflow as the conversation opens to surface
|
|
263
|
+
* a Human In The Loop form wired directly after Start (its "show_on_start" is enabled).
|
|
264
|
+
*/
|
|
265
|
+
ChatService.prototype.shouldTriggerStartForm = function () {
|
|
266
|
+
return this.triggerStartForm;
|
|
267
|
+
};
|
|
258
268
|
/**
|
|
259
269
|
* Supported languages for the current agent (if provided by the server).
|
|
260
270
|
*/
|
|
@@ -392,6 +402,17 @@ var ChatService = /** @class */ (function () {
|
|
|
392
402
|
thinkingDelayMs: this.thinkingConfig.delayMs,
|
|
393
403
|
};
|
|
394
404
|
};
|
|
405
|
+
/** HITL form strings from the locale bundle, as `{ lang: { nodeId: slice } }`. */
|
|
406
|
+
ChatService.prototype.getFormNodeLocales = function () {
|
|
407
|
+
var out = {};
|
|
408
|
+
for (var _i = 0, _a = Object.entries(this.agentChatLocales || {}); _i < _a.length; _i++) {
|
|
409
|
+
var _b = _a[_i], code = _b[0], slice = _b[1];
|
|
410
|
+
if (slice && slice.nodes && Object.keys(slice.nodes).length > 0) {
|
|
411
|
+
out[code.toLowerCase()] = slice.nodes;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return out;
|
|
415
|
+
};
|
|
395
416
|
/**
|
|
396
417
|
* Load a saved conversation ID from localStorage
|
|
397
418
|
*/
|
|
@@ -509,6 +530,7 @@ var ChatService = /** @class */ (function () {
|
|
|
509
530
|
this.welcomeData = {};
|
|
510
531
|
this.thinkingConfig = { phrases: [], delayMs: 1000 };
|
|
511
532
|
this.chatInputMetadata = {};
|
|
533
|
+
this.triggerStartForm = false;
|
|
512
534
|
if (this.welcomeObjectUrl) {
|
|
513
535
|
try {
|
|
514
536
|
URL.revokeObjectURL(this.welcomeObjectUrl);
|
|
@@ -599,6 +621,7 @@ var ChatService = /** @class */ (function () {
|
|
|
599
621
|
else {
|
|
600
622
|
this.chatInputMetadata = {};
|
|
601
623
|
}
|
|
624
|
+
this.triggerStartForm = anyData.agent_trigger_start_form === true;
|
|
602
625
|
this.persistAndEmitAgentMetadata(this.chatInputMetadata);
|
|
603
626
|
welcomeTitle = anyData.agent_welcome_title;
|
|
604
627
|
welcomeImageUrl = anyData.agent_welcome_image_url;
|
|
@@ -653,7 +676,7 @@ var ChatService = /** @class */ (function () {
|
|
|
653
676
|
});
|
|
654
677
|
});
|
|
655
678
|
};
|
|
656
|
-
ChatService.prototype.sendMessage = function (message, attachments, extraMetadata, reCaptchaToken) {
|
|
679
|
+
ChatService.prototype.sendMessage = function (message, attachments, extraMetadata, reCaptchaToken, opts) {
|
|
657
680
|
return __awaiter(this, void 0, void 0, function () {
|
|
658
681
|
var now, chatMessage, requestBody, mergedMetadata, response, responseData, i, messageData, agentMessage, error_2, errorMessage;
|
|
659
682
|
var _this = this;
|
|
@@ -673,7 +696,9 @@ var ChatService = /** @class */ (function () {
|
|
|
673
696
|
text: message,
|
|
674
697
|
attachments: attachments,
|
|
675
698
|
};
|
|
676
|
-
|
|
699
|
+
// `silent` suppresses the optimistic user bubble — used by the invisible start-form
|
|
700
|
+
// trigger, which must run the workflow without showing or storing a user message.
|
|
701
|
+
if (this.messageHandler && !(opts === null || opts === void 0 ? void 0 : opts.silent)) {
|
|
677
702
|
this.messageHandler(chatMessage);
|
|
678
703
|
}
|
|
679
704
|
_c.label = 1;
|
|
@@ -772,6 +797,24 @@ var ChatService = /** @class */ (function () {
|
|
|
772
797
|
});
|
|
773
798
|
});
|
|
774
799
|
};
|
|
800
|
+
/**
|
|
801
|
+
* Run the workflow as the conversation opens to surface a Human In The Loop form wired
|
|
802
|
+
* directly after Start (its "show_on_start" is enabled). Sends an empty, invisible
|
|
803
|
+
* trigger message flagged so the backend runs the workflow but neither shows nor stores
|
|
804
|
+
* it — only the resulting form comes back through the normal response/WS path.
|
|
805
|
+
*/
|
|
806
|
+
ChatService.prototype.sendStartFormTrigger = function (reCaptchaToken) {
|
|
807
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
808
|
+
return __generator(this, function (_a) {
|
|
809
|
+
switch (_a.label) {
|
|
810
|
+
case 0: return [4 /*yield*/, this.sendMessage("", [], { start_form_trigger: true }, reCaptchaToken, { silent: true })];
|
|
811
|
+
case 1:
|
|
812
|
+
_a.sent();
|
|
813
|
+
return [2 /*return*/];
|
|
814
|
+
}
|
|
815
|
+
});
|
|
816
|
+
});
|
|
817
|
+
};
|
|
775
818
|
ChatService.prototype.sendAudioMessage = function (audioBlob, audioFormat, extraMetadata) {
|
|
776
819
|
return __awaiter(this, void 0, void 0, function () {
|
|
777
820
|
var now, chatMessage, mergedMetadata, model, formData, error_3;
|
|
@@ -1165,4 +1208,4 @@ var ChatService = /** @class */ (function () {
|
|
|
1165
1208
|
return ChatService;
|
|
1166
1209
|
}());
|
|
1167
1210
|
export { ChatService };
|
|
1168
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdFNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvY2hhdFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFjMUIsT0FBTyxFQUNMLGVBQWUsRUFDZiw4QkFBOEIsRUFDOUIseUJBQXlCLEdBQzFCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsTUFBTSxDQUFDLElBQU0sZ0NBQWdDLEdBQUcsa0NBQWtDLENBQUM7QUFFbkY7SUFtQ0UscUJBQ0UsT0FBZSxFQUNmLFlBQWdDLEVBQ2hDLE1BQWMsRUFDZCxRQUE4QixFQUM5QixNQUFlLEVBQ2YsUUFBaUIsRUFDakIsS0FBcUIsRUFDckIsT0FBd0I7UUFEeEIsc0JBQUEsRUFBQSxZQUFxQjtRQUNyQix3QkFBQSxFQUFBLGVBQXdCO1FBdENsQixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFDckMsMkJBQXNCLEdBQWtCLElBQUksQ0FBQyxDQUFDLGdDQUFnQztRQUM5RSxlQUFVLEdBQWtCLElBQUksQ0FBQyxDQUFDLGdDQUFnQztRQUNsRSxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixjQUFTLEdBQXFCLElBQUksQ0FBQztRQUNuQyxtQkFBYyxHQUE0QyxJQUFJLENBQUM7UUFDL0Qsb0JBQWUsR0FBd0IsSUFBSSxDQUFDO1FBQzVDLHFCQUFnQixHQUF3QixJQUFJLENBQUM7UUFDN0MsMkJBQXNCLEdBRW5CLElBQUksQ0FBQztRQUNSLHVCQUFrQixHQUE4QyxJQUFJLENBQUM7UUFDckUsbUJBQWMsR0FBRyx3QkFBd0IsQ0FBQztRQUMxQyxvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQUMvQixnQkFBVyxHQUFxQixFQUFFLENBQUM7UUFDbkMsbUJBQWMsR0FBd0IsRUFBRSxPQUFPLEVBQUUsRUFBRSxF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RSxPQUFPO1lBQ2pCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBMkM7WUFDdEQsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO1NBQ3JCLENBQUM7SUFDSixDQUFDO0lBRUssNENBQXNCLEdBQTVCOzs7Z0JBQ0UsOEVBQThFO2dCQUM5RSxzR0FBc0c7Z0JBQ3RHLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN6QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3pCLENBQUM7Ozs7S0FDRjtJQUVLLDZDQUF1QixHQUE3Qjs7O2dCQUNFLGdGQUFnRjtnQkFDaEYsZ0hBQWdIO2dCQUNoSCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO29CQUMxQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUIsQ0FBQztnQkFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Ozs7S0FDekI7SUFHSCxrQkFBQztBQUFELENBQUMsQUExdUNELElBMHVDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCB7XG4gIENoYXRNZXNzYWdlLFxuICBBZ2VudEluZm9SZXNwb25zZSxcbiAgQWdlbnRDaGF0TG9jYWxlc1Jlc3BvbnNlLFxuICBBZ2VudENoYXRMb2NhbGVDb250ZW50LFxuICBTdGFydENvbnZlcnNhdGlvblJlc3BvbnNlLFxuICBBdHRhY2htZW50LFxuICBBZ2VudFRoaW5raW5nQ29uZmlnLFxuICBBZ2VudFdlbGNvbWVEYXRhLFxuICBGaWxlVXBsb2FkUmVzcG9uc2UsXG4gIEluUHJvZ3Jlc3NQb2xsUmVzcG9uc2UsXG4gIEluUHJvZ3Jlc3NQb2xsTWVzc2FnZSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXQsXG4gIGNyZWF0ZVdlYlNvY2tldENvbnZlcnNhdGlvblVybCxcbiAgY3JlYXRlV2ViU29ja2V0RGlhZ25vc3RpYyxcbn0gZnJvbSBcIi4uL3V0aWxzL3dlYnNvY2tldFwiO1xuZXhwb3J0IGNvbnN0IEdFTkFTU0lTVF9BR0VOVF9NRVRBREFUQV9VUERBVEVEID0gXCJnZW5hc3Npc3RfYWdlbnRfbWV0YWRhdGFfdXBkYXRlZFwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhdFNlcnZpY2Uge1xuICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSB3ZWJzb2NrZXRVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBhcGlLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjb252ZXJzYXRpb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29udmVyc2F0aW9uQ3JlYXRlVGltZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7IC8vIFRyYWNrIGNvbnZlcnNhdGlvbiBzdGFydCB0aW1lXG4gIHByaXZhdGUgZ3Vlc3RUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIEd1ZXN0IHRva2VuIGZvciBhdXRob3JpemF0aW9uXG4gIHByaXZhdGUgaXNGaW5hbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB3ZWJTb2NrZXQ6IFdlYlNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1lc3NhZ2VIYW5kbGVyOiAoKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRha2VvdmVySGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZmluYWxpemVkSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGlvblN0YXRlSGFuZGxlcjpcbiAgICB8ICgoc3RhdGU6IFwiY29ubmVjdGluZ1wiIHwgXCJjb25uZWN0ZWRcIiB8IFwiZGlzY29ubmVjdGVkXCIpID0+IHZvaWQpXG4gICAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB3ZWxjb21lRGF0YUhhbmRsZXI6ICgoZGF0YTogQWdlbnRXZWxjb21lRGF0YSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdG9yYWdlS2V5QmFzZSA9IFwiZ2VuYXNzaXN0X2NvbnZlcnNhdGlvblwiO1xuICBwcml2YXRlIHBvc3NpYmxlUXVlcmllczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSB3ZWxjb21lRGF0YTogQWdlbnRXZWxjb21lRGF0YSA9IHt9O1xuICBwcml2YXRlIHRoaW5raW5nQ29uZmlnOiBBZ2VudFRoaW5raW5nQ29uZmlnID0geyBwaHJhc2VzOiBbXSwgZGVsYXlNczogMTAwMCB9O1xuICBwcml2YXRlIGNoYXRJbnB1dE1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBwcml2YXRlIHdlbGNvbWVPYmplY3RVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyB0byByZXZva2Ugb24gcmVzZXRcbiAgcHJpdmF0ZSB0ZW5hbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBhZ2VudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgYXZhaWxhYmxlTGFuZ3VhZ2VzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFnZW50Q2hhdExvY2FsZXM6IFJlY29yZDxzdHJpbmcsIEFnZW50Q2hhdExvY2FsZUNvbnRlbnQ+IHwgbnVsbCA9XG4gICAgbnVsbDtcbiAgcHJpdmF0ZSBsYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHVzZVdzOiBib29sZWFuO1xuICBwcml2YXRlIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXNlUG9sbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJhc2VVcmw6IHN0cmluZyxcbiAgICB3ZWJzb2NrZXRVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBhcGlLZXk6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgdGVuYW50Pzogc3RyaW5nLFxuICAgIGxhbmd1YWdlPzogc3RyaW5nLFxuICAgIHVzZVdzOiBib29sZWFuID0gdHJ1ZSxcbiAgICB1c2VQb2xsOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybC5lbmRzV2l0aChcIi9cIikgPyBiYXNlVXJsLnNsaWNlKDAsIC0xKSA6IGJhc2VVcmw7XG4gICAgdGhpcy53ZWJzb2NrZXRVcmwgPSB3ZWJzb2NrZXRVcmw7XG4gICAgdGhpcy5hcGlLZXkgPSBhcGlLZXk7XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICAgIHRoaXMudGVuYW50ID0gdGVuYW50O1xuICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICB0aGlzLnVzZVdzID0gdXNlV3M7XG4gICAgdGhpcy51c2VQb2xsID0gdXNlUG9sbDtcbiAgICAvLyBUcnkgdG8gbG9hZCBhIHNhdmVkIGNvbnZlcnNhdGlvbiBmb3IgdGhpcyBhcGlLZXkgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICB0aGlzLmxvYWRTYXZlZENvbnZlcnNhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdG9yYWdlS2V5KCk6IHN0cmluZyB7XG4gICAgLy8gUG9pbnRlciB0byBjdXJyZW50IGNvbnZlcnNhdGlvbiBtZXRhZGF0YSBmb3IgdGhpcyBhcGlLZXlcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9yYWdlS2V5QmFzZX06JHt0aGlzLmFwaUtleX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjb252ZXJzYXRpb24gZmluYWxpemVkOiBlbWl0IHNwZWNpYWwgbWVzc2FnZSwgY2FsbCBmaW5hbGl6ZWQgaGFuZGxlciwgcGVyc2lzdCBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBoYW5kbGVDb252ZXJzYXRpb25GaW5hbGl6ZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCkgLyAxMDAwO1xuICAgICAgY29uc3QgZmluYWxpemVkTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgIGNyZWF0ZV90aW1lOiBub3csXG4gICAgICAgIHN0YXJ0X3RpbWU6IHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZVxuICAgICAgICAgID8gbm93IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lXG4gICAgICAgICAgOiAwLFxuICAgICAgICBlbmRfdGltZTogdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lXG4gICAgICAgICAgPyBub3cgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgKyAwLjAxXG4gICAgICAgICAgOiAwLjAxLFxuICAgICAgICBzcGVha2VyOiBcInNwZWNpYWxcIixcbiAgICAgICAgdGV4dDogXCJDb252ZXJzYXRpb24gRmluYWxpemVkXCIsXG4gICAgICAgIHR5cGU6IFwiZmluYWxpemVkXCIsXG4gICAgICB9O1xuICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcihmaW5hbGl6ZWRNZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmluYWxpemVkSGFuZGxlcikge1xuICAgICAgdGhpcy5maW5hbGl6ZWRIYW5kbGVyKCk7XG4gICAgfVxuICAgIHRoaXMuaXNGaW5hbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuc2F2ZUNvbnZlcnNhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3QgYWdlbnRfY2hhdF9pbnB1dF9tZXRhZGF0YSB0byBsb2NhbFN0b3JhZ2UgYW5kIGRpc3BhdGNoIGEgZ2xvYmFsIGV2ZW50LlxuICAgKiBBbnkgY29uc3VtZXIgKGUuZy4gY29uZmlnIHBhbmVsKSBjYW4gbGlzdGVuIGZvciBHRU5BU1NJU1RfQUdFTlRfTUVUQURBVEFfVVBEQVRFRFxuICAgKiBvciByZWFkIGZyb20gbG9jYWxTdG9yYWdlIG9uIG1vdW50OyBubyBuZWVkIHRvIHBhc3MgY2FsbGJhY2tzIGludG8gdGhlIGNoYXQuXG4gICAqL1xuICBwcml2YXRlIHBlcnNpc3RBbmRFbWl0QWdlbnRNZXRhZGF0YShtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qga2V5ID0gYGdlbmFzc2lzdF9hZ2VudF9jaGF0X2lucHV0X21ldGFkYXRhOiR7dGhpcy5hcGlLZXl9YDtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpKTtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5kaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudChHRU5BU1NJU1RfQUdFTlRfTUVUQURBVEFfVVBEQVRFRCwge1xuICAgICAgICAgICAgZGV0YWlsOiB7IGFwaUtleTogdGhpcy5hcGlLZXksIG1ldGFkYXRhOiB7IC4uLm1ldGFkYXRhIH0gfSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbGFuZ3VhZ2UgZm9yIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXJcbiAgICovXG4gIHNldExhbmd1YWdlKGxhbmd1YWdlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG1ldGFkYXRhICh1c2VmdWwgZm9yIHVwZGF0aW5nIGxhbmd1YWdlIG9yIG90aGVyIGR5bmFtaWMgbWV0YWRhdGEpXG4gICAqL1xuICBzZXRNZXRhZGF0YShtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgbGFuZ3VhZ2UgY29kZSBmb3IgQWNjZXB0LUxhbmd1YWdlIGhlYWRlclxuICAgKiBDb252ZXJ0cyBzaW1wbGUgbGFuZ3VhZ2UgY29kZXMgKGUuZy4sIFwiZW5cIiwgXCJlc1wiKSB0byBwcm9wZXIgZm9ybWF0IChlLmcuLCBcImVuLVVTLGVuO3E9MC45XCIpXG4gICAqIEZvbGxvd3MgSFRUUCBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyIHN0YW5kYXJkc1xuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRBY2NlcHRMYW5ndWFnZShsYW5nQ29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWxhbmdDb2RlKSByZXR1cm4gJyc7XG5cbiAgICAvLyBOb3JtYWxpemUgbGFuZ3VhZ2UgY29kZSAobG93ZXJjYXNlLCBoYW5kbGUgY29tbW9uIGZvcm1hdHMpXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IGxhbmdDb2RlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgLy8gTWFwIGNvbW1vbiBsYW5ndWFnZSBjb2RlcyB0byB0aGVpciBmdWxsIGxvY2FsZSBmb3JtYXRcbiAgICBjb25zdCBsYW5ndWFnZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdlbic6ICdlbi1VUycsXG4gICAgICAnZXMnOiAnZXMtRVMnLFxuICAgICAgJ2ZyJzogJ2ZyLUZSJyxcbiAgICAgICdkZSc6ICdkZS1ERScsXG4gICAgICAnaXQnOiAnaXQtSVQnLFxuICAgICAgJ3B0JzogJ3B0LVBUJyxcbiAgICAgICdhcic6ICdhci1TQScsXG4gICAgICAnc3EnOiAnc3EtQUwnLFxuICAgICAgJ3poJzogJ3poLUNOJyxcbiAgICB9O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvZGUgYWxyZWFkeSBoYXMgYSByZWdpb24gKGUuZy4sIFwiZW4tVVNcIiwgXCJlcy1FU1wiKVxuICAgIGNvbnN0IGhhc1JlZ2lvbiA9IG5vcm1hbGl6ZWQuaW5jbHVkZXMoJy0nKTtcblxuICAgIC8vIEdldCB0aGUgZnVsbCBsb2NhbGUgb3IgdXNlIHRoZSBwcm92aWRlZCBjb2RlIGlmIGl0IGFscmVhZHkgaGFzIGEgcmVnaW9uXG4gICAgY29uc3QgZnVsbExvY2FsZSA9IGhhc1JlZ2lvbiA/IG5vcm1hbGl6ZWQgOiAobGFuZ3VhZ2VNYXBbbm9ybWFsaXplZF0gfHwgbm9ybWFsaXplZCk7XG5cbiAgICAvLyBFeHRyYWN0IGJhc2UgbGFuZ3VhZ2UgZnJvbSB0aGUgZnVsbCBsb2NhbGUgKGUuZy4sIFwiZW5cIiBmcm9tIFwiZW4tVVNcIilcbiAgICBjb25zdCBmdWxsQmFzZUxhbmcgPSBmdWxsTG9jYWxlLnNwbGl0KCctJylbMF0udG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIEJ1aWxkIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXI6IHByaW1hcnkgbG9jYWxlLCBiYXNlIGxhbmd1YWdlIHdpdGggcXVhbGl0eSwgRW5nbGlzaCBmYWxsYmFja1xuICAgIC8vIEZvcm1hdDogXCJsb2NhbGUsYmFzZS1sYW5nO3E9MC45LGVuO3E9MC44XCJcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbZnVsbExvY2FsZV07XG5cbiAgICAvLyBmYWxsYmFja1xuICAgIHBhcnRzLnB1c2goYCR7ZnVsbEJhc2VMYW5nfTtxPTAuOWApO1xuXG4gICAgLy8gQWRkIEVuZ2xpc2ggYXMgZmFsbGJhY2sgaWYgbm90IGFscmVhZHkgdGhlIHByaW1hcnkgbGFuZ3VhZ2VcbiAgICBpZiAoZnVsbEJhc2VMYW5nICE9PSAnZW4nKSB7XG4gICAgICBwYXJ0cy5wdXNoKCdlbjtxPTAuOCcpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcsICcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBoZWFkZXJzIGZvciBBUEkgcmVxdWVzdHMsIGluY2x1ZGluZyBhdXRob3JpemF0aW9uIGlmIGd1ZXN0IHRva2VuIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBjb250ZW50VHlwZSxcbiAgICB9O1xuXG4gICAgLy8gUHJlZmVyIGd1ZXN0IEpXVCBmb3Igc2Vzc2lvbiBjYWxsczsgb21pdCBzaGFyZWQgQVBJIGtleSBvbmNlIHNjb3BlZCB0b2tlbiBleGlzdHMuXG4gICAgaWYgKHRoaXMuZ3Vlc3RUb2tlbikge1xuICAgICAgaGVhZGVyc1tcIkF1dGhvcml6YXRpb25cIl0gPSBgQmVhcmVyICR7dGhpcy5ndWVzdFRva2VufWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlcnNbXCJ4LWFwaS1rZXlcIl0gPSB0aGlzLmFwaUtleTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGVuYW50IGhlYWRlciBpZiBwcm92aWRlZFxuICAgIGlmICh0aGlzLnRlbmFudCkge1xuICAgICAgaGVhZGVyc1tcIngtdGVuYW50LWlkXCJdID0gdGhpcy50ZW5hbnQ7XG4gICAgfVxuXG4gICAgLy8gQWRkIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXIgaWYgbGFuZ3VhZ2UgaXMgc2V0XG4gICAgaWYgKHRoaXMubGFuZ3VhZ2UpIHtcbiAgICAgIGNvbnN0IGFjY2VwdExhbmd1YWdlID0gdGhpcy5mb3JtYXRBY2NlcHRMYW5ndWFnZSh0aGlzLmxhbmd1YWdlKTtcbiAgICAgIGlmIChhY2NlcHRMYW5ndWFnZSkge1xuICAgICAgICBoZWFkZXJzW1wiQWNjZXB0LUxhbmd1YWdlXCJdID0gYWNjZXB0TGFuZ3VhZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBzZXRNZXNzYWdlSGFuZGxlcihoYW5kbGVyOiAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHNldFRha2VvdmVySGFuZGxlcihoYW5kbGVyOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy50YWtlb3ZlckhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgc2V0RmluYWxpemVkSGFuZGxlcihoYW5kbGVyOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5maW5hbGl6ZWRIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHNldENvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoXG4gICAgaGFuZGxlcjogKHN0YXRlOiBcImNvbm5lY3RpbmdcIiB8IFwiY29ubmVjdGVkXCIgfCBcImRpc2Nvbm5lY3RlZFwiKSA9PiB2b2lkXG4gICkge1xuICAgIHRoaXMuY29ubmVjdGlvblN0YXRlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBzZXRXZWxjb21lRGF0YUhhbmRsZXIoaGFuZGxlcjogKChkYXRhOiBBZ2VudFdlbGNvbWVEYXRhKSA9PiB2b2lkKSB8IG51bGwpIHtcbiAgICB0aGlzLndlbGNvbWVEYXRhSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBzZXRTZXJ2ZXJVbmF2YWlsYWJsZUNvbmZpZyhcbiAgICBtZXNzYWdlPzogc3RyaW5nLFxuICAgIGNvbnRhY3RVcmw/OiBzdHJpbmcsXG4gICAgY29udGFjdExhYmVsPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLnNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCA9IGNvbnRhY3RVcmw7XG4gICAgdGhpcy5zZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCA9IGNvbnRhY3RMYWJlbDtcbiAgfVxuXG4gIGdldFBvc3NpYmxlUXVlcmllcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucG9zc2libGVRdWVyaWVzO1xuICB9XG5cbiAgZ2V0V2VsY29tZURhdGEoKTogQWdlbnRXZWxjb21lRGF0YSB7XG4gICAgcmV0dXJuIHRoaXMud2VsY29tZURhdGE7XG4gIH1cblxuICBnZXRUaGlua2luZ0NvbmZpZygpOiBBZ2VudFRoaW5raW5nQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy50aGlua2luZ0NvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBrZXlzL2RlZmF1bHRzIGZyb20gdGhlIHdvcmtmbG93J3MgQ2hhdCBJbnB1dCBub2RlIChyZXR1cm5lZCB3aGVuIGNvbnZlcnNhdGlvbiBzdGFydHMpLlxuICAgKiBVc2VkIHRvIHNob3cgd29ya2Zsb3ctZGVmaW5lZCBtZXRhZGF0YSBpbiB0aGUgY29uZmlnIHBhbmVsLlxuICAgKi9cbiAgZ2V0Q2hhdElucHV0TWV0YWRhdGEoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuY2hhdElucHV0TWV0YWRhdGEgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdXBwb3J0ZWQgbGFuZ3VhZ2VzIGZvciB0aGUgY3VycmVudCBhZ2VudCAoaWYgcHJvdmlkZWQgYnkgdGhlIHNlcnZlcikuXG4gICAqL1xuICBnZXRBdmFpbGFibGVMYW5ndWFnZXMoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMgPyBbLi4udGhpcy5hdmFpbGFibGVMYW5ndWFnZXNdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhZ2VudCBtZXRhZGF0YSAoZS5nLiBzdXBwb3J0ZWQgbGFuZ3VhZ2VzKSB3aXRob3V0IHN0YXJ0aW5nIGEgY29udmVyc2F0aW9uLlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hBZ2VudEluZm8oKTogUHJvbWlzZTxBZ2VudEluZm9SZXNwb25zZSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5nZXQ8QWdlbnRJbmZvUmVzcG9uc2U+KFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9jb252ZXJzYXRpb25zL2luLXByb2dyZXNzL2FnZW50LWluZm9gLFxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpIH1cbiAgICAgICk7XG4gICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UuZGF0YSB8fCB7fTtcbiAgICAgIGNvbnN0IGFnZW50SWQgPVxuICAgICAgICB0eXBlb2YgZGF0YS5hZ2VudF9pZCA9PT0gXCJzdHJpbmdcIiA/IGRhdGEuYWdlbnRfaWQgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByYXdMYW5ndWFnZXMgPSBBcnJheS5pc0FycmF5KGRhdGEuYWdlbnRfYXZhaWxhYmxlX2xhbmd1YWdlcylcbiAgICAgICAgPyBkYXRhLmFnZW50X2F2YWlsYWJsZV9sYW5ndWFnZXNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBhdmFpbGFibGVMYW5ndWFnZXMgPSByYXdMYW5ndWFnZXNcbiAgICAgICAgPyByYXdMYW5ndWFnZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGxhbmcpID0+IHR5cGVvZiBsYW5nID09PSBcInN0cmluZ1wiICYmIGxhbmcudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAubWFwKChsYW5nKSA9PiBsYW5nLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoYWdlbnRJZCkge1xuICAgICAgICB0aGlzLmFnZW50SWQgPSBhZ2VudElkO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXZhaWxhYmxlTGFuZ3VhZ2VzKSB7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gYXZhaWxhYmxlTGFuZ3VhZ2VzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZ2VudF9pZDogYWdlbnRJZCxcbiAgICAgICAgYWdlbnRfYXZhaWxhYmxlX2xhbmd1YWdlczogYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgICBsaXZlX3ZvaWNlX2VuYWJsZWQ6IGRhdGEubGl2ZV92b2ljZV9lbmFibGVkID09PSB0cnVlLFxuICAgICAgICBsaXZlX3ZvaWNlX3JlYWR5OiBkYXRhLmxpdmVfdm9pY2VfcmVhZHkgPT09IHRydWUsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHJlc29sdmVkIHdlbGNvbWUgLyBGQVEgLyB0aGlua2luZyBzdHJpbmdzIGZvciBhbGwgYWdlbnQgbG9jYWxlcyAobm8gY29udmVyc2F0aW9uIHJlcXVpcmVkKS5cbiAgICogUmVxdWVzdCBoZWFkZXJzIGluY2x1ZGUgYEFjY2VwdC1MYW5ndWFnZWAgZnJvbSB0aGUgY3VycmVudCB7QGxpbmsgc2V0TGFuZ3VhZ2V9IHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hBZ2VudENoYXRMb2NhbGVzKCk6IFByb21pc2U8QWdlbnRDaGF0TG9jYWxlc1Jlc3BvbnNlIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldDxBZ2VudENoYXRMb2NhbGVzUmVzcG9uc2U+KFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9jb252ZXJzYXRpb25zL2luLXByb2dyZXNzL2FnZW50LWNoYXQtbG9jYWxlc2AsXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCkgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhO1xuICAgICAgaWYgKGRhdGE/LmxvY2FsZXMgJiYgdHlwZW9mIGRhdGEubG9jYWxlcyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aGlzLmFnZW50Q2hhdExvY2FsZXMgPSBkYXRhLmxvY2FsZXM7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLmFnZW50X2F2YWlsYWJsZV9sYW5ndWFnZXMpKSB7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gZGF0YS5hZ2VudF9hdmFpbGFibGVfbGFuZ3VhZ2VzXG4gICAgICAgICAgLmZpbHRlcigobGFuZykgPT4gdHlwZW9mIGxhbmcgPT09IFwic3RyaW5nXCIgJiYgbGFuZy50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAubWFwKChsYW5nKSA9PiBsYW5nLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkYXRhLmFnZW50X2lkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRoaXMuYWdlbnRJZCA9IGRhdGEuYWdlbnRfaWQ7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBkYXRhLmFnZW50X3RoaW5raW5nX3BocmFzZV9kZWxheSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICBkYXRhLmFnZW50X3RoaW5raW5nX3BocmFzZV9kZWxheSA+PSAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy50aGlua2luZ0NvbmZpZy5kZWxheU1zID0gTWF0aC5tYXgoXG4gICAgICAgICAgMjUwLFxuICAgICAgICAgIE1hdGgucm91bmQoZGF0YS5hZ2VudF90aGlua2luZ19waHJhc2VfZGVsYXkgKiAxMDAwKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBkYXRhLmFnZW50X2NoYXRfaW5wdXRfbWV0YWRhdGEgIT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgZGF0YS5hZ2VudF9jaGF0X2lucHV0X21ldGFkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGRhdGEuYWdlbnRfY2hhdF9pbnB1dF9tZXRhZGF0YSkgJiZcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5jaGF0SW5wdXRNZXRhZGF0YSkubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jaGF0SW5wdXRNZXRhZGF0YSA9IHsgLi4uZGF0YS5hZ2VudF9jaGF0X2lucHV0X21ldGFkYXRhIH07XG4gICAgICAgIHRoaXMucGVyc2lzdEFuZEVtaXRBZ2VudE1ldGFkYXRhKHRoaXMuY2hhdElucHV0TWV0YWRhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgcHJlLWZldGNoZWQgbG9jYWxlIHN0cmluZ3MgZm9yIHRoZSB3aWRnZXQgVUkgd2l0aG91dCByZXN0YXJ0aW5nIHRoZSBjb252ZXJzYXRpb24uXG4gICAqIFJldHVybnMgY3VycmVudCB0aGlua2luZyBjb25maWcgd2hlbiBhIGxvY2FsZSBidW5kbGUgd2FzIGFwcGxpZWQsIHNvIFJlYWN0IHN0YXRlIGNhbiBzeW5jLlxuICAgKi9cbiAgYXBwbHlMYW5ndWFnZUZyb21Mb2NhbGVzKGxhbmc6IHN0cmluZyk6IHtcbiAgICB0aGlua2luZ1BocmFzZXM6IHN0cmluZ1tdO1xuICAgIHRoaW5raW5nRGVsYXlNczogbnVtYmVyO1xuICB9IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmFnZW50Q2hhdExvY2FsZXMgfHwgIWxhbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb2RlID0gbGFuZy50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiLVwiKVswXTtcbiAgICBjb25zdCBidW5kbGUgPSB0aGlzLmFnZW50Q2hhdExvY2FsZXM7XG4gICAgY29uc3Qgc2xpY2UgPVxuICAgICAgYnVuZGxlW2NvZGVdIHx8IGJ1bmRsZVtcImVuXCJdIHx8IE9iamVjdC52YWx1ZXMoYnVuZGxlKVswXTtcbiAgICBpZiAoIXNsaWNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzbGljZS5wb3NzaWJsZV9xdWVyaWVzKSkge1xuICAgICAgdGhpcy5wb3NzaWJsZVF1ZXJpZXMgPSBzbGljZS5wb3NzaWJsZV9xdWVyaWVzLmZpbHRlcihcbiAgICAgICAgKHF1ZXJ5KSA9PiB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgJiYgcXVlcnkudHJpbSgpLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy53ZWxjb21lRGF0YSA9IHtcbiAgICAgIC4uLnRoaXMud2VsY29tZURhdGEsXG4gICAgICB0aXRsZTogc2xpY2Uud2VsY29tZV90aXRsZSA/PyB0aGlzLndlbGNvbWVEYXRhLnRpdGxlID8/IG51bGwsXG4gICAgICBtZXNzYWdlOiBzbGljZS53ZWxjb21lX21lc3NhZ2UgPz8gdGhpcy53ZWxjb21lRGF0YS5tZXNzYWdlID8/IG51bGwsXG4gICAgICBpbnB1dERpc2NsYWltZXJIdG1sOlxuICAgICAgICBzbGljZS5pbnB1dF9kaXNjbGFpbWVyX2h0bWwgPz8gdGhpcy53ZWxjb21lRGF0YS5pbnB1dERpc2NsYWltZXJIdG1sID8/IG51bGwsXG4gICAgICBwb3NzaWJsZVF1ZXJpZXM6XG4gICAgICAgIHRoaXMucG9zc2libGVRdWVyaWVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHRoaXMucG9zc2libGVRdWVyaWVzXG4gICAgICAgICAgOiB0aGlzLndlbGNvbWVEYXRhLnBvc3NpYmxlUXVlcmllcyxcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2xpY2UudGhpbmtpbmdfcGhyYXNlcykpIHtcbiAgICAgIGNvbnN0IHBocmFzZXMgPSBzbGljZS50aGlua2luZ19waHJhc2VzLmZpbHRlcihcbiAgICAgICAgKHApID0+IHR5cGVvZiBwID09PSBcInN0cmluZ1wiICYmIHAudHJpbSgpLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAocGhyYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudGhpbmtpbmdDb25maWcgPSB7XG4gICAgICAgICAgLi4udGhpcy50aGlua2luZ0NvbmZpZyxcbiAgICAgICAgICBwaHJhc2VzLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLndlbGNvbWVEYXRhSGFuZGxlcikge1xuICAgICAgdGhpcy53ZWxjb21lRGF0YUhhbmRsZXIoe1xuICAgICAgICB0aXRsZTogdGhpcy53ZWxjb21lRGF0YS50aXRsZSA/PyBudWxsLFxuICAgICAgICBtZXNzYWdlOiB0aGlzLndlbGNvbWVEYXRhLm1lc3NhZ2UgPz8gbnVsbCxcbiAgICAgICAgaW1hZ2VVcmw6IHRoaXMud2VsY29tZURhdGEuaW1hZ2VVcmwgPz8gbnVsbCxcbiAgICAgICAgcG9zc2libGVRdWVyaWVzOiB0aGlzLnBvc3NpYmxlUXVlcmllcyxcbiAgICAgICAgaW5wdXREaXNjbGFpbWVySHRtbDogdGhpcy53ZWxjb21lRGF0YS5pbnB1dERpc2NsYWltZXJIdG1sID8/IG51bGwsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNhdmVDb252ZXJzYXRpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgdGhpbmtpbmdQaHJhc2VzOiBbLi4udGhpcy50aGlua2luZ0NvbmZpZy5waHJhc2VzXSxcbiAgICAgIHRoaW5raW5nRGVsYXlNczogdGhpcy50aGlua2luZ0NvbmZpZy5kZWxheU1zLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIHNhdmVkIGNvbnZlcnNhdGlvbiBJRCBmcm9tIGxvY2FsU3RvcmFnZVxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkU2F2ZWRDb252ZXJzYXRpb24oKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBzYXZlZENvbnZlcnNhdGlvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U3RvcmFnZUtleSgpKTtcbiAgICAgIC8vIEJhY2t3YXJkLWNvbXBhdDogY2hlY2sgb2xkIHVuc2NvcGVkIGtleSBpZiBzY29wZWQgb25lIG1pc3NpbmdcbiAgICAgIGlmICghc2F2ZWRDb252ZXJzYXRpb24pIHtcbiAgICAgICAgc2F2ZWRDb252ZXJzYXRpb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXlCYXNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzYXZlZENvbnZlcnNhdGlvbikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgY3JlYXRlVGltZSxcbiAgICAgICAgICBpc0ZpbmFsaXplZCxcbiAgICAgICAgICBwb3NzaWJsZVF1ZXJpZXMsXG4gICAgICAgICAgd2VsY29tZURhdGEsXG4gICAgICAgICAgdGhpbmtpbmdDb25maWcsXG4gICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICBndWVzdFRva2VuLFxuICAgICAgICAgIGF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgICAgfSA9IEpTT04ucGFyc2Uoc2F2ZWRDb252ZXJzYXRpb24pO1xuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSA9IGNyZWF0ZVRpbWU7XG4gICAgICAgIHRoaXMuaXNGaW5hbGl6ZWQgPSBpc0ZpbmFsaXplZCB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5ndWVzdFRva2VuID0gZ3Vlc3RUb2tlbiB8fCBudWxsO1xuICAgICAgICB0aGlzLnBvc3NpYmxlUXVlcmllcyA9IEFycmF5LmlzQXJyYXkocG9zc2libGVRdWVyaWVzKVxuICAgICAgICAgID8gcG9zc2libGVRdWVyaWVzXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgdGhpcy53ZWxjb21lRGF0YSA9IHdlbGNvbWVEYXRhIHx8IHt9O1xuICAgICAgICBpZiAoIXRoaXMud2VsY29tZURhdGEucG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgICAgdGhpcy53ZWxjb21lRGF0YS5wb3NzaWJsZVF1ZXJpZXMgPSB0aGlzLnBvc3NpYmxlUXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRoaW5raW5nQ29uZmlnID0ge1xuICAgICAgICAgIHBocmFzZXM6ICh0aGlua2luZ0NvbmZpZyAmJiB0aGlua2luZ0NvbmZpZy5waHJhc2VzKSB8fCBbXSxcbiAgICAgICAgICBkZWxheU1zOlxuICAgICAgICAgICAgdGhpbmtpbmdDb25maWcgJiYgdHlwZW9mIHRoaW5raW5nQ29uZmlnLmRlbGF5TXMgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgPyB0aGlua2luZ0NvbmZpZy5kZWxheU1zXG4gICAgICAgICAgICAgIDogMTAwMCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hZ2VudElkID0gYWdlbnRJZDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXZhaWxhYmxlTGFuZ3VhZ2VzKSkge1xuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gYXZhaWxhYmxlTGFuZ3VhZ2VzO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy53ZWxjb21lRGF0YS5pbWFnZVVybCAmJiB0aGlzLmFnZW50SWQpIHtcbiAgICAgICAgICB0aGlzLmZldGNoV2VsY29tZUltYWdlKHRoaXMuYWdlbnRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMud2VsY29tZURhdGFIYW5kbGVyKSB7XG4gICAgICAgICAgdGhpcy53ZWxjb21lRGF0YUhhbmRsZXIodGhpcy53ZWxjb21lRGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIGN1cnJlbnQgY29udmVyc2F0aW9uIElEIHRvIGxvY2FsU3RvcmFnZVxuICAgKi9cbiAgcHJpdmF0ZSBzYXZlQ29udmVyc2F0aW9uKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5jb252ZXJzYXRpb25JZCAmJiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUpIHtcbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uRGF0YSA9IHtcbiAgICAgICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5jb252ZXJzYXRpb25JZCxcbiAgICAgICAgICBjcmVhdGVUaW1lOiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUsXG4gICAgICAgICAgaXNGaW5hbGl6ZWQ6IHRoaXMuaXNGaW5hbGl6ZWQsXG4gICAgICAgICAgcG9zc2libGVRdWVyaWVzOiB0aGlzLnBvc3NpYmxlUXVlcmllcyxcbiAgICAgICAgICB3ZWxjb21lRGF0YToge1xuICAgICAgICAgICAgLi4udGhpcy53ZWxjb21lRGF0YSxcbiAgICAgICAgICAgIGltYWdlVXJsOlxuICAgICAgICAgICAgICB0aGlzLndlbGNvbWVPYmplY3RVcmwgJiZcbiAgICAgICAgICAgICAgdGhpcy53ZWxjb21lRGF0YS5pbWFnZVVybCAmJlxuICAgICAgICAgICAgICB0aGlzLndlbGNvbWVEYXRhLmltYWdlVXJsLnN0YXJ0c1dpdGgoXCJibG9iOlwiKVxuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDogdGhpcy53ZWxjb21lRGF0YS5pbWFnZVVybCB8fCBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpbmtpbmdDb25maWc6IHRoaXMudGhpbmtpbmdDb25maWcsXG4gICAgICAgICAgYWdlbnRJZDogdGhpcy5hZ2VudElkLFxuICAgICAgICAgIGd1ZXN0VG9rZW46IHRoaXMuZ3Vlc3RUb2tlbixcbiAgICAgICAgICBhdmFpbGFibGVMYW5ndWFnZXM6IHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgICB9O1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFN0b3JhZ2VLZXkoKSwgSlNPTi5zdHJpbmdpZnkoY29udmVyc2F0aW9uRGF0YSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpZiBhbiBlcnJvciBpcyBhIHRva2VuIGV4cGlyYXRpb24gZXJyb3JcbiAgcHJpdmF0ZSBpc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZXJyb3IucmVzcG9uc2UgJiZcbiAgICAgIGVycm9yLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxICYmXG4gICAgICBlcnJvci5yZXNwb25zZS5kYXRhICYmXG4gICAgICAoZXJyb3IucmVzcG9uc2UuZGF0YS5lcnJvciA9PT0gXCJUb2tlbiBoYXMgZXhwaXJlZC5cIiB8fFxuICAgICAgICBlcnJvci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgPT09IFwiVG9rZW4gaGFzIGV4cGlyZWQuXCIgfHxcbiAgICAgICAgKHR5cGVvZiBlcnJvci5yZXNwb25zZS5kYXRhID09PSBcInN0cmluZ1wiICYmIGVycm9yLnJlc3BvbnNlLmRhdGEuaW5jbHVkZXMoXCJUb2tlbiBoYXMgZXhwaXJlZFwiKSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBoYW5kbGVyIGZvciB0YWtlb3ZlciBldmVudHM6IGVtaXRzIGEgc3BlY2lhbCBtZXNzYWdlIGFuZCBpbnZva2VzIHRha2VvdmVySGFuZGxlci5cbiAgICogUnVucyBvbmx5IG9uY2UgcGVyIGNvbnZlcnNhdGlvbiAoaWRlbXBvdGVudCkuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVRha2VvdmVyKG5vdz86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHQgPSBub3cgPz8gRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IHRha2VvdmVyTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgIGNyZWF0ZV90aW1lOiB0LFxuICAgICAgICBzdGFydF90aW1lOiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgPyB0IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lIDogMCxcbiAgICAgICAgZW5kX3RpbWU6IHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSA/IHQgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgKyAwLjAxIDogMC4wMSxcbiAgICAgICAgc3BlYWtlcjogXCJzcGVjaWFsXCIsXG4gICAgICAgIHRleHQ6IFwiU3VwZXJ2aXNvciB0b29rIG92ZXJcIixcbiAgICAgICAgdHlwZTogXCJ0YWtlb3ZlclwiLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcih0YWtlb3Zlck1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YWtlb3ZlckhhbmRsZXIpIHtcbiAgICAgIHRoaXMudGFrZW92ZXJIYW5kbGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBjdXJyZW50IGNvbnZlcnNhdGlvbiBieSBjbGVhcmluZyB0aGUgSUQgYW5kIHdlYnNvY2tldFxuICAgKi9cbiAgcmVzZXRDaGF0Q29udmVyc2F0aW9uKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHRoZSBjb252ZXJzYXRpb24gSURcbiAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gbnVsbDtcbiAgICB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgPSBudWxsO1xuICAgIHRoaXMuZ3Vlc3RUb2tlbiA9IG51bGw7XG4gICAgdGhpcy5pc0ZpbmFsaXplZCA9IGZhbHNlO1xuXG4gICAgLy8gQ2xlYXIgcG9zc2libGUgcXVlcmllcyBhbmQgd29ya2Zsb3cgbWV0YWRhdGFcbiAgICB0aGlzLnBvc3NpYmxlUXVlcmllcyA9IFtdO1xuICAgIHRoaXMud2VsY29tZURhdGEgPSB7fTtcbiAgICB0aGlzLnRoaW5raW5nQ29uZmlnID0geyBwaHJhc2VzOiBbXSwgZGVsYXlNczogMTAwMCB9O1xuICAgIHRoaXMuY2hhdElucHV0TWV0YWRhdGEgPSB7fTtcbiAgICBpZiAodGhpcy53ZWxjb21lT2JqZWN0VXJsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMud2VsY29tZU9iamVjdFVybCk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgICB0aGlzLndlbGNvbWVPYmplY3RVcmwgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmFnZW50SWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBsb2NhbCBzdG9yYWdlXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuZ2V0U3RvcmFnZUtleSgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZXJlJ3MgYSBjdXJyZW50IGNvbnZlcnNhdGlvblxuICAgKi9cbiAgaGFzQWN0aXZlQ29udmVyc2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY29udmVyc2F0aW9uSWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGNvbnZlcnNhdGlvbiBJRFxuICAgKi9cbiAgZ2V0Q29udmVyc2F0aW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udmVyc2F0aW9uSWQ7XG4gIH1cblxuICBnZXRDb252ZXJzYXRpb25DcmVhdGVUaW1lKCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWU7XG4gIH1cblxuICBpc0NvbnZlcnNhdGlvbkZpbmFsaXplZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0ZpbmFsaXplZDtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0Q29udmVyc2F0aW9uKHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVxdWVzdEJvZHk6IGFueSA9IHtcbiAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICByZWNvcmRlZF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBkYXRhX3NvdXJjZV9pZDogXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZUNhcHRjaGFUb2tlbikge1xuICAgICAgICByZXF1ZXN0Qm9keS5yZWNhcHRjaGFfdG9rZW4gPSByZUNhcHRjaGFUb2tlbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWV0YWRhdGEpIHtcbiAgICAgICAgcmVxdWVzdEJvZHkubWV0YWRhdGEgPSB0aGlzLm1ldGFkYXRhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3Q8U3RhcnRDb252ZXJzYXRpb25SZXNwb25zZT4oXG4gICAgICAgIGAke3RoaXMuYmFzZVVybH0vYXBpL2NvbnZlcnNhdGlvbnMvaW4tcHJvZ3Jlc3Mvc3RhcnRgLFxuICAgICAgICByZXF1ZXN0Qm9keSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gcmVzcG9uc2UuZGF0YS5jb252ZXJzYXRpb25faWQ7XG4gICAgICAvLyBTdG9yZSBjb252ZXJzYXRpb24gY3JlYXRlIHRpbWUgKHVzZSBmcm9tIHJlc3BvbnNlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGN1cnJlbnQgdGltZSlcbiAgICAgIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSA9IHJlc3BvbnNlLmRhdGEuY3JlYXRlX3RpbWVcbiAgICAgICAgPyByZXNwb25zZS5kYXRhLmNyZWF0ZV90aW1lIC8gMTAwMFxuICAgICAgICA6IERhdGUubm93KCkgLyAxMDAwO1xuICAgICAgLy8gU3RvcmUgZ3Vlc3QgdG9rZW4gaWYgcHJvdmlkZWRcbiAgICAgIHRoaXMuZ3Vlc3RUb2tlbiA9IHJlc3BvbnNlLmRhdGEuZ3Vlc3RfdG9rZW4gfHwgbnVsbDtcbiAgICAgIHRoaXMuaXNGaW5hbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgLy8gU3RvcmUgcG9zc2libGUgcXVlcmllcyBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChcbiAgICAgICAgcmVzcG9uc2UuZGF0YS5hZ2VudF9wb3NzaWJsZV9xdWVyaWVzICYmXG4gICAgICAgIHJlc3BvbnNlLmRhdGEuYWdlbnRfcG9zc2libGVfcXVlcmllcy5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5wb3NzaWJsZVF1ZXJpZXMgPSByZXNwb25zZS5kYXRhLmFnZW50X3Bvc3NpYmxlX3F1ZXJpZXMuZmlsdGVyKFxuICAgICAgICAgIChxdWVyeSkgPT4gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiICYmIHF1ZXJ5LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFueURhdGE6IGFueSA9IHJlc3BvbnNlLmRhdGEgYXMgYW55O1xuICAgICAgY29uc3QgYWdlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gYW55RGF0YS5hZ2VudF9pZDtcbiAgICAgIHRoaXMuYWdlbnRJZCA9IGFnZW50SWQ7XG4gICAgICBjb25zdCByYXdMYW5ndWFnZXMgPSBBcnJheS5pc0FycmF5KGFueURhdGEuYWdlbnRfYXZhaWxhYmxlX2xhbmd1YWdlcylcbiAgICAgICAgPyBhbnlEYXRhLmFnZW50X2F2YWlsYWJsZV9sYW5ndWFnZXNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAocmF3TGFuZ3VhZ2VzKSB7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gcmF3TGFuZ3VhZ2VzXG4gICAgICAgICAgLmZpbHRlcigobGFuZzogYW55KSA9PiB0eXBlb2YgbGFuZyA9PT0gXCJzdHJpbmdcIiAmJiBsYW5nLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgIC5tYXAoKGxhbmc6IHN0cmluZykgPT4gbGFuZy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhd01ldGEgPSBhbnlEYXRhLmFnZW50X2NoYXRfaW5wdXRfbWV0YWRhdGE7XG4gICAgICBpZiAoXG4gICAgICAgIHJhd01ldGEgIT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgcmF3TWV0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkocmF3TWV0YSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNoYXRJbnB1dE1ldGFkYXRhID0geyAuLi5yYXdNZXRhIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoYXRJbnB1dE1ldGFkYXRhID0ge307XG4gICAgICB9XG4gICAgICB0aGlzLnBlcnNpc3RBbmRFbWl0QWdlbnRNZXRhZGF0YSh0aGlzLmNoYXRJbnB1dE1ldGFkYXRhKTtcbiAgICAgIGNvbnN0IHdlbGNvbWVUaXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gYW55RGF0YS5hZ2VudF93ZWxjb21lX3RpdGxlO1xuICAgICAgY29uc3Qgd2VsY29tZUltYWdlVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgICBhbnlEYXRhLmFnZW50X3dlbGNvbWVfaW1hZ2VfdXJsO1xuICAgICAgY29uc3QgdGhpbmtpbmdQaHJhc2VzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIGFueURhdGEuYWdlbnRfdGhpbmtpbmdfcGhyYXNlcztcbiAgICAgIGNvbnN0IHRoaW5raW5nRGVsYXlTZWM6IG51bWJlciB8IHVuZGVmaW5lZCA9XG4gICAgICAgIGFueURhdGEuYWdlbnRfdGhpbmtpbmdfcGhyYXNlX2RlbGF5O1xuICAgICAgY29uc3QgaW5wdXREaXNjbGFpbWVySHRtbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gYW55RGF0YS5hZ2VudF9pbnB1dF9kaXNjbGFpbWVyX2h0bWw7XG5cbiAgICAgIHRoaXMud2VsY29tZURhdGEgPSB7XG4gICAgICAgIHRpdGxlOiB3ZWxjb21lVGl0bGUgfHwgbnVsbCxcbiAgICAgICAgbWVzc2FnZTogbnVsbCxcbiAgICAgICAgaW1hZ2VVcmw6IHdlbGNvbWVJbWFnZVVybCB8fCBudWxsLFxuICAgICAgICBwb3NzaWJsZVF1ZXJpZXM6IHRoaXMucG9zc2libGVRdWVyaWVzLFxuICAgICAgICBpbnB1dERpc2NsYWltZXJIdG1sOiBpbnB1dERpc2NsYWltZXJIdG1sID8/IG51bGwsXG4gICAgICB9O1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlua2luZ1BocmFzZXMpICYmIHRoaW5raW5nUGhyYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudGhpbmtpbmdDb25maWcucGhyYXNlcyA9IHRoaW5raW5nUGhyYXNlcztcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdGhpbmtpbmdEZWxheVNlYyA9PT0gXCJudW1iZXJcIiAmJiB0aGlua2luZ0RlbGF5U2VjID49IDApIHtcbiAgICAgICAgdGhpcy50aGlua2luZ0NvbmZpZy5kZWxheU1zID0gTWF0aC5tYXgoXG4gICAgICAgICAgMjUwLFxuICAgICAgICAgIE1hdGgucm91bmQodGhpbmtpbmdEZWxheVNlYyAqIDEwMDApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy53ZWxjb21lRGF0YS5pbWFnZVVybCAmJiBhZ2VudElkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hXZWxjb21lSW1hZ2UoYWdlbnRJZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgYWdlbnQgd2VsY29tZSBtZXNzYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuYWdlbnRfd2VsY29tZV9tZXNzYWdlICYmIHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgICAgIGNvbnN0IHdlbGNvbWVNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICBjcmVhdGVfdGltZTogbm93LFxuICAgICAgICAgIHN0YXJ0X3RpbWU6IG5vdyAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSwgLy8gUmVsYXRpdmUgdG8gY29udmVyc2F0aW9uIHN0YXJ0XG4gICAgICAgICAgZW5kX3RpbWU6IG5vdyAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSArIDAuMDEsIC8vIFJlbGF0aXZlIHRvIGNvbnZlcnNhdGlvbiBzdGFydFxuICAgICAgICAgIHNwZWFrZXI6IFwiYWdlbnRcIixcbiAgICAgICAgICB0ZXh0OiByZXNwb25zZS5kYXRhLmFnZW50X3dlbGNvbWVfbWVzc2FnZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy53ZWxjb21lRGF0YS5tZXNzYWdlID0gcmVzcG9uc2UuZGF0YS5hZ2VudF93ZWxjb21lX21lc3NhZ2U7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIod2VsY29tZU1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy53ZWxjb21lRGF0YUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy53ZWxjb21lRGF0YUhhbmRsZXIodGhpcy53ZWxjb21lRGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2F2ZUNvbnZlcnNhdGlvbigpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuY29udmVyc2F0aW9uX2lkO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLmlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHRoaXMucmVzZXRDaGF0Q29udmVyc2F0aW9uKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZW5kTWVzc2FnZShcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50W10sXG4gICAgZXh0cmFNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcmVDYXB0Y2hhVG9rZW4/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNvbnZlcnNhdGlvbklkIHx8ICF0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnZlcnNhdGlvbiBub3Qgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICBjb25zdCBjaGF0TWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICBjcmVhdGVfdGltZTogbm93LFxuICAgICAgc3RhcnRfdGltZTogbm93IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lLCAvLyBSZWxhdGl2ZSB0byBjb252ZXJzYXRpb24gc3RhcnRcbiAgICAgIGVuZF90aW1lOiBub3cgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgKyAwLjAxLCAvLyBSZWxhdGl2ZSB0byBjb252ZXJzYXRpb24gc3RhcnRcbiAgICAgIHNwZWFrZXI6IFwiY3VzdG9tZXJcIixcbiAgICAgIHRleHQ6IG1lc3NhZ2UsXG4gICAgICBhdHRhY2htZW50czogYXR0YWNobWVudHMsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyKGNoYXRNZXNzYWdlKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVxdWVzdEJvZHk6IGFueSA9IHtcbiAgICAgICAgbWVzc2FnZXM6IFtjaGF0TWVzc2FnZV0sXG4gICAgICAgIHJlY29yZGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuXG4gICAgICBpZiAocmVDYXB0Y2hhVG9rZW4pIHtcbiAgICAgICAgcmVxdWVzdEJvZHkucmVjYXB0Y2hhX3Rva2VuID0gcmVDYXB0Y2hhVG9rZW47XG4gICAgICB9XG5cbiAgICAgIC8vIEluY2x1ZGUgbWV0YWRhdGFcbiAgICAgIGNvbnN0IG1lcmdlZE1ldGFkYXRhID0ge1xuICAgICAgICAuLi4odGhpcy5tZXRhZGF0YSB8fCB7fSksXG4gICAgICAgIC4uLihleHRyYU1ldGFkYXRhIHx8IHt9KSxcbiAgICAgIH07XG4gICAgICBpZiAoT2JqZWN0LmtleXMobWVyZ2VkTWV0YWRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVxdWVzdEJvZHkubWV0YWRhdGEgPSBtZXJnZWRNZXRhZGF0YTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wYXRjaChcbiAgICAgICAgYCR7dGhpcy5iYXNlVXJsfS9hcGkvY29udmVyc2F0aW9ucy9pbi1wcm9ncmVzcy91cGRhdGUvJHt0aGlzLmNvbnZlcnNhdGlvbklkfWAsXG4gICAgICAgIHJlcXVlc3RCb2R5LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksXG4gICAgICAgIH1cbiAgICAgICkuY2F0Y2goZSA9PiB7XG4gICAgICAgIGNvbnN0IGVyciA9IGU/LnJlc3BvbnNlPy5kYXRhO1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3Igd2hlbiBjb252ZXJzYXRpb24gaXMgZmluYWxpemVkXG4gICAgICAgIGlmIChlcnI/LmVycm9yX2tleSA9PT0gJ0NPTlZFUlNBVElPTl9GSU5BTElaRUQnIHx8IGVycj8uZXJyb3Jfa2V5ID09PSAnQUdFTlRfTk9UX0ZPVU5EJykge1xuICAgICAgICAgIHRoaXMuaGFuZGxlQ29udmVyc2F0aW9uRmluYWxpemVkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIG5vdCB1c2luZyBXZWJTb2NrZXQsIHRyeSB0byByZXRyaWV2ZSB0aGUgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIHRoZSB1cGRhdGUgY29udmVyc2F0aW9uIHJlc3BvbnNlXG4gICAgICBpZiAoIXRoaXMudXNlV3MgJiYgdGhpcy5tZXNzYWdlSGFuZGxlciAmJiAoIXRoaXMudXNlV3MgfHwgIXRoaXMudXNlUG9sbCkpIHsgLy8gdXNlUG9sbCBpcyB0cnVlIHdoZW4gdXNpbmcgaGVhcnRiZWF0IHBvbGxpbmdcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZT8uZGF0YSBhcyBhbnkgfHwge307XG5cbiAgICAgICAgICBpZiAocmVzcG9uc2VEYXRhLm1lc3NhZ2VzICYmIEFycmF5LmlzQXJyYXkocmVzcG9uc2VEYXRhLm1lc3NhZ2VzKSkge1xuXG4gICAgICAgICAgICAvLyBMb29rIGZvciB0aGUgbGF0ZXN0IGFnZW50IG1lc3NhZ2UgaW4gdGhlIHJlc3BvbnNlXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gcmVzcG9uc2VEYXRhLm1lc3NhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VEYXRhID0gcmVzcG9uc2VEYXRhLm1lc3NhZ2VzW2ldO1xuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBtZXNzYWdlRGF0YS5zcGVha2VyID09PSBcImFnZW50XCIgJiZcbiAgICAgICAgICAgICAgICBtZXNzYWdlRGF0YS50ZXh0ICYmXG4gICAgICAgICAgICAgICAgbWVzc2FnZURhdGEuY3JlYXRlX3RpbWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIG1lc3NhZ2VEYXRhLnN0YXJ0X3RpbWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIG1lc3NhZ2VEYXRhLmVuZF90aW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWdlbnRNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZV90aW1lOiBtZXNzYWdlRGF0YS5jcmVhdGVfdGltZSxcbiAgICAgICAgICAgICAgICAgIHN0YXJ0X3RpbWU6IHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZVxuICAgICAgICAgICAgICAgICAgICA/IG1lc3NhZ2VEYXRhLnN0YXJ0X3RpbWUgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWVcbiAgICAgICAgICAgICAgICAgICAgOiBtZXNzYWdlRGF0YS5zdGFydF90aW1lLFxuICAgICAgICAgICAgICAgICAgZW5kX3RpbWU6IHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZVxuICAgICAgICAgICAgICAgICAgICA/IG1lc3NhZ2VEYXRhLmVuZF90aW1lIC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lXG4gICAgICAgICAgICAgICAgICAgIDogbWVzc2FnZURhdGEuZW5kX3RpbWUsXG4gICAgICAgICAgICAgICAgICBzcGVha2VyOiBcImFnZW50XCIsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiBtZXNzYWdlRGF0YS50ZXh0LFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogbWVzc2FnZURhdGEubWVzc2FnZV9pZCB8fCBtZXNzYWdlRGF0YS5pZCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VEYXRhLnR5cGUsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VzcyBpZiB0aGlzIGlzIGEgbmV3IG1lc3NhZ2Ugd2UgaGF2ZW4ndCBzZWVuIGJlZm9yZVxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IGVhc2lseSBjaGVjayBoZXJlLCBzbyB3ZSdsbCBsZXQgdGhlIGhhbmRsZXIgbWFuYWdlIGR1cGxpY2F0ZXNcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyKGFnZW50TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIHVwZGF0ZSBjb252ZXJzYXRpb24gcmVzcG9uc2U6XCIsIHBhcnNlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHRva2VuIGV4cGlyYXRpb24gZXJyb3JcbiAgICAgIGlmICh0aGlzLmlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHRoaXMucmVzZXRDaGF0Q29udmVyc2F0aW9uKCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIHRoZSBhZ2VudCBpbmFjdGl2ZSBlcnJvclxuICAgICAgaWYgKFxuICAgICAgICBlcnJvci5yZXNwb25zZSAmJlxuICAgICAgICBlcnJvci5yZXNwb25zZS5kYXRhICYmXG4gICAgICAgIGVycm9yLnJlc3BvbnNlLmRhdGEuZXJyb3Jfa2V5ID09PSBcIkFHRU5UX0lOQUNUSVZFXCJcbiAgICAgICkge1xuICAgICAgICAvLyBDcmVhdGUgYSBjdXN0b20gbWVzc2FnZSBmb3IgdGhlIGFnZW50IGluYWN0aXZlIGVycm9yXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGNyZWF0ZV90aW1lOiBub3csXG4gICAgICAgICAgICBzdGFydF90aW1lOiBub3cgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUsXG4gICAgICAgICAgICBlbmRfdGltZTogbm93IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lICsgMC4wMSxcbiAgICAgICAgICAgIHNwZWFrZXI6IFwic3BlY2lhbFwiLFxuICAgICAgICAgICAgdGV4dDogdGhpcy5zZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UgPz8gXCJUaGUgYWdlbnQgaXMgY3VycmVudGx5IG9mZmxpbmUsIHBsZWFzZSBjaGVjayBiYWNrIGxhdGVyLiBUaGFuayB5b3UhXCIsXG4gICAgICAgICAgICAuLi4odGhpcy5zZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwgJiYge1xuICAgICAgICAgICAgICBsaW5rVXJsOiB0aGlzLnNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgICAgICAgbGlua0xhYmVsOiB0aGlzLnNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsID8/IFwiQ29udGFjdCBzdXBwb3J0XCIsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEb24ndCB0aHJvdyB0aGUgZXJyb3Igc2luY2Ugd2UgaGFuZGxlZCBpdCB3aXRoIGEgbWVzc2FnZVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNlbmRBdWRpb01lc3NhZ2UoXG4gICAgYXVkaW9CbG9iOiBCbG9iLFxuICAgIGF1ZGlvRm9ybWF0OiBzdHJpbmcsXG4gICAgZXh0cmFNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb252ZXJzYXRpb25JZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udmVyc2F0aW9uIG5vdCBzdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCkgLyAxMDAwO1xuICAgIGNvbnN0IGNoYXRNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgIGNyZWF0ZV90aW1lOiBub3csXG4gICAgICBzdGFydF90aW1lOiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgPyBub3cgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgOiAwLFxuICAgICAgZW5kX3RpbWU6IHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSA/IG5vdyAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSArIDAuMDEgOiAwLjAxLFxuICAgICAgc3BlYWtlcjogXCJjdXN0b21lclwiLFxuICAgICAgdGV4dDogXCJbVm9pY2UgbWVzc2FnZV1cIixcbiAgICAgIHR5cGU6IFwiYXVkaW9cIixcbiAgICAgIGF1ZGlvT2JqZWN0VXJsOiBVUkwuY3JlYXRlT2JqZWN0VVJMKGF1ZGlvQmxvYiksXG4gICAgfTtcblxuICAgIC8vIFNob3cgdXNlciBtZXNzYWdlIGluIFVJIGltbWVkaWF0ZWx5XG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIoY2hhdE1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lcmdlZE1ldGFkYXRhID0ge1xuICAgICAgLi4uKHRoaXMubWV0YWRhdGEgfHwge30pLFxuICAgICAgLi4uKGV4dHJhTWV0YWRhdGEgfHwge30pLFxuICAgIH07XG5cbiAgICBjb25zdCBtb2RlbCA9IHtcbiAgICAgIG1lc3NhZ2VzOiBbY2hhdE1lc3NhZ2VdLFxuICAgICAgbWV0YWRhdGE6IE9iamVjdC5rZXlzKG1lcmdlZE1ldGFkYXRhKS5sZW5ndGggPiAwID8gbWVyZ2VkTWV0YWRhdGEgOiB7fSxcbiAgICB9O1xuXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJtb2RlbFwiLCBKU09OLnN0cmluZ2lmeShtb2RlbCkpO1xuICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgIFwiYXVkaW9fZmlsZVwiLFxuICAgICAgYXVkaW9CbG9iLFxuICAgICAgYHJlY29yZGluZy4ke2F1ZGlvRm9ybWF0fWAsXG4gICAgKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJhdWRpb19mb3JtYXRcIiwgYXVkaW9Gb3JtYXQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGF4aW9zLnBhdGNoKFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9jb252ZXJzYXRpb25zL2luLXByb2dyZXNzL3VwZGF0ZS8ke3RoaXMuY29udmVyc2F0aW9uSWR9YCxcbiAgICAgICAgZm9ybURhdGEsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIpLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5pc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yKSkge1xuICAgICAgICB0aGlzLnJlc2V0Q2hhdENvbnZlcnNhdGlvbigpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBsb2FkRmlsZShjaGF0SWQ6IHN0cmluZywgZmlsZTogRmlsZSk6IFByb21pc2U8RmlsZVVwbG9hZFJlc3BvbnNlIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5jb252ZXJzYXRpb25JZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udmVyc2F0aW9uIG5vdCBzdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKFwiY2hhdF9pZFwiLCBjaGF0SWQpO1xuICAgIGZvcm1EYXRhLmFwcGVuZChcImZpbGVcIiwgZmlsZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0PEZpbGVVcGxvYWRSZXNwb25zZT4oXG4gICAgICAgIGAke3RoaXMuYmFzZVVybH0vYXBpL2dlbmFnZW50L2tub3dsZWRnZS91cGxvYWQtY2hhdC1maWxlYCxcbiAgICAgICAgZm9ybURhdGEsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIpLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YSBhcyBGaWxlVXBsb2FkUmVzcG9uc2U7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKHRoaXMuaXNUb2tlbkV4cGlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgdGhpcy5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHJhdyBXZWJTb2NrZXQgbWVzc2FnZSBkYXRhLiBDYWxsZWQgZnJvbSB1c2VDaGF0V2ViU29ja2V0IGhvb2suXG4gICAqIEhhbmRsZXMgbWVzc2FnZSwgdGFrZW92ZXIsIGFuZCBmaW5hbGl6ZSBldmVudHMuIFBpbmcvcG9uZyBpcyBoYW5kbGVkIGJ5IHRoZSBob29rLlxuICAgKi9cbiAgcHJvY2Vzc1dlYlNvY2tldE1lc3NhZ2UoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAoZGF0YS50eXBlID09PSBcInBpbmdcIikgcmV0dXJuOyAvLyBIYW5kbGVkIGJ5IHVzZUNoYXRXZWJTb2NrZXQgKGtlZXAtYWxpdmUpXG5cbiAgICBpZiAoZGF0YS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiB0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gZGF0YS5wYXlsb2FkO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBwYXlsb2FkIGFzIENoYXRNZXNzYWdlW107XG4gICAgICAgIGNvbnN0IGFkanVzdGVkTWVzc2FnZXMgPSBtZXNzYWdlc1xuICAgICAgICAgIC5tYXAoKG1zZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWRqdXN0ZWQgPSB0aGlzLmFkanVzdE1lc3NhZ2VUaW1lc3RhbXBzKG1zZyk7XG4gICAgICAgICAgICBpZiAoIWFkanVzdGVkLm1lc3NhZ2VfaWQgJiYgKG1zZyBhcyBhbnkpLmlkKSB7XG4gICAgICAgICAgICAgIGFkanVzdGVkLm1lc3NhZ2VfaWQgPSAobXNnIGFzIGFueSkuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWRqdXN0ZWQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKChtc2cpID0+IG1zZy5zcGVha2VyICE9PSBcImN1c3RvbWVyXCIpO1xuICAgICAgICBhZGp1c3RlZE1lc3NhZ2VzLmZvckVhY2goKG0pID0+IHRoaXMubWVzc2FnZUhhbmRsZXIhKG0pKTtcbiAgICAgIH0gZWxzZSBpZiAocGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBjb25zdCBhZGp1c3RlZE1lc3NhZ2UgPSB0aGlzLmFkanVzdE1lc3NhZ2VUaW1lc3RhbXBzKFxuICAgICAgICAgIHBheWxvYWQgYXMgQ2hhdE1lc3NhZ2VcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFhZGp1c3RlZE1lc3NhZ2UubWVzc2FnZV9pZCAmJiAocGF5bG9hZCBhcyBhbnkpLmlkKSB7XG4gICAgICAgICAgYWRqdXN0ZWRNZXNzYWdlLm1lc3NhZ2VfaWQgPSAocGF5bG9hZCBhcyBhbnkpLmlkO1xuICAgICAgICB9XG4gICAgICAgIGlmICgocGF5bG9hZCBhcyBhbnkpLmF1ZGlvX2Zvcm1hdCkge1xuICAgICAgICAgIGFkanVzdGVkTWVzc2FnZS5hdWRpb19mb3JtYXQgPSAocGF5bG9hZCBhcyBhbnkpLmF1ZGlvX2Zvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRqdXN0ZWRNZXNzYWdlLnNwZWFrZXIgIT09IFwiY3VzdG9tZXJcIikge1xuICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIoYWRqdXN0ZWRNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSBcInRha2VvdmVyXCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlVGFrZW92ZXIoKTtcbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gXCJmaW5hbGl6ZVwiKSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbnZlcnNhdGlvbkZpbmFsaXplZCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldEd1ZXN0VG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ3Vlc3RUb2tlbjtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBXZWJTb2NrZXQgaXMgbm93IG1hbmFnZWQgYnkgdXNlQ2hhdFdlYlNvY2tldCBob29rLiBOby1vcC4gKi9cbiAgY29ubmVjdFdlYlNvY2tldCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudXNlV3MgJiYgIXRoaXMud2Vic29ja2V0VXJsKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJXZWJTb2NrZXQgaXMgZGlzYWJsZWQgb3IgVVJMIGlzIG5vdCBzZXRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMud2ViU29ja2V0ICYmIHRoaXMud2ViU29ja2V0IGluc3RhbmNlb2YgV2ViU29ja2V0KSB7XG4gICAgICB0aGlzLndlYlNvY2tldD8uY2xvc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnZlcnNhdGlvbiBJRCBpcyByZXF1aXJlZCBmb3IgV2ViU29ja2V0IGNvbm5lY3Rpb25cIik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXRlSGFuZGxlcikgdGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyKFwiY29ubmVjdGluZ1wiKTtcblxuXG4gICAgLy8gVXNlIGd1ZXN0X3Rva2VuIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBhcGlfa2V5XG4gICAgY29uc3QgYXV0aFBhcmFtID0gdGhpcy5ndWVzdFRva2VuXG4gICAgICA/IGBhY2Nlc3NfdG9rZW49JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5ndWVzdFRva2VuKX1gXG4gICAgICA6IGBhcGlfa2V5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYXBpS2V5KX1gO1xuXG4gICAgLy8gQnVpbGQgV2ViU29ja2V0IFVSTCB3aXRoIHByb3BlciBhdXRoZW50aWNhdGlvblxuICAgIGNvbnN0IHdzVXJsID0gY3JlYXRlV2ViU29ja2V0Q29udmVyc2F0aW9uVXJsKFxuICAgICAgdGhpcy5iYXNlVXJsLFxuICAgICAgdGhpcy53ZWJzb2NrZXRVcmwsXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkLFxuICAgICAgYXV0aFBhcmFtLFxuICAgICAgdGhpcy50ZW5hbnQsXG4gICAgICB0aGlzLmxhbmd1YWdlIHx8IFwiZW5cIixcbiAgICApO1xuXG4gICAgLy8gVXNlIG5hdGl2ZSBicm93c2VyIFdlYlNvY2tldCBmYWN0b3J5XG4gICAgdGhpcy53ZWJTb2NrZXQgPSBjcmVhdGVXZWJTb2NrZXQod3NVcmwpO1xuXG5cbiAgICB0aGlzLndlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyKSB0aGlzLmNvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoXCJjb25uZWN0ZWRcIik7XG4gICAgfTtcblxuICAgIHRoaXMud2ViU29ja2V0Lm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhIGFzIHN0cmluZyk7XG5cbiAgICAgICAgLy8gUmVzcG9uZCB0byBzZXJ2ZXItc2lkZSBoZWFydGJlYXQgcGluZ3NcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gXCJwaW5nXCIpIHtcbiAgICAgICAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiBcInBvbmdcIiB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gXCJtZXNzYWdlXCIgJiYgdGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEucGF5bG9hZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gZGF0YS5wYXlsb2FkIGFzIENoYXRNZXNzYWdlW107XG4gICAgICAgICAgICAvLyBBZGp1c3QgdGltZXN0YW1wcyB0byBiZSByZWxhdGl2ZSB0byBjb252ZXJzYXRpb24gc3RhcnRcbiAgICAgICAgICAgIC8vIEFsc28gbm9ybWFsaXplIG1lc3NhZ2VfaWQgZmllbGQgKGJhY2tlbmQgbWlnaHQgc2VuZCAnaWQnIGluc3RlYWQgb2YgJ21lc3NhZ2VfaWQnKVxuICAgICAgICAgICAgY29uc3QgYWRqdXN0ZWRNZXNzYWdlcyA9IG1lc3NhZ2VzXG4gICAgICAgICAgICAgIC5tYXAoKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkanVzdGVkID0gdGhpcy5hZGp1c3RNZXNzYWdlVGltZXN0YW1wcyhtc2cpO1xuICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZTogaWYgYmFja2VuZCBzZW5kcyAnaWQnLCB1c2UgaXQgYXMgJ21lc3NhZ2VfaWQnXG4gICAgICAgICAgICAgICAgaWYgKCFhZGp1c3RlZC5tZXNzYWdlX2lkICYmIChtc2cgYXMgYW55KS5pZCkge1xuICAgICAgICAgICAgICAgICAgYWRqdXN0ZWQubWVzc2FnZV9pZCA9IChtc2cgYXMgYW55KS5pZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkanVzdGVkO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuZmlsdGVyKChtc2cpID0+IG1zZy5zcGVha2VyICE9PSBcImN1c3RvbWVyXCIpO1xuICAgICAgICAgICAgYWRqdXN0ZWRNZXNzYWdlcy5mb3JFYWNoKHRoaXMubWVzc2FnZUhhbmRsZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBhZGp1c3RlZE1lc3NhZ2UgPSB0aGlzLmFkanVzdE1lc3NhZ2VUaW1lc3RhbXBzKFxuICAgICAgICAgICAgICBkYXRhLnBheWxvYWQgYXMgQ2hhdE1lc3NhZ2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBOb3JtYWxpemU6IGlmIGJhY2tlbmQgc2VuZHMgJ2lkJywgdXNlIGl0IGFzICdtZXNzYWdlX2lkJ1xuICAgICAgICAgICAgaWYgKCFhZGp1c3RlZE1lc3NhZ2UubWVzc2FnZV9pZCAmJiAoZGF0YS5wYXlsb2FkIGFzIGFueSkuaWQpIHtcbiAgICAgICAgICAgICAgYWRqdXN0ZWRNZXNzYWdlLm1lc3NhZ2VfaWQgPSAoZGF0YS5wYXlsb2FkIGFzIGFueSkuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWRqdXN0ZWRNZXNzYWdlLnNwZWFrZXIgIT09IFwiY3VzdG9tZXJcIikge1xuICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyKGFkanVzdGVkTWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gXCJ0YWtlb3ZlclwiKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVUYWtlb3ZlcigpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gXCJmaW5hbGl6ZVwiKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVDb252ZXJzYXRpb25GaW5hbGl6ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMud2ViU29ja2V0Lm9uZXJyb3IgPSAoZXJyb3I6IEV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoXCJkaXNjb25uZWN0ZWRcIik7XG5cbiAgICAgIC8vIExvZyBkaWFnbm9zdGljXG4gICAgICBjb25zdCBkaWFnbm9zdGljID0gY3JlYXRlV2ViU29ja2V0RGlhZ25vc3RpYyhlcnJvciwgd3NVcmwpO1xuICAgICAgY29uc29sZS5lcnJvcihgW0dlbkFzc2lzdCBDaGF0XSAke2RpYWdub3N0aWN9YCk7XG4gICAgfTtcblxuICAgIHRoaXMud2ViU29ja2V0Lm9uY2xvc2UgPSAoZXZlbnQ6IENsb3NlRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0ZUhhbmRsZXIpXG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlSGFuZGxlcihcImRpc2Nvbm5lY3RlZFwiKTtcblxuICAgICAgLy8gTG9nIGRpYWdub3N0aWNcbiAgICAgIGlmICghZXZlbnQud2FzQ2xlYW4pIHtcbiAgICAgICAgY29uc3QgZGlhZ25vc3RpYyA9IGNyZWF0ZVdlYlNvY2tldERpYWdub3N0aWMoZXZlbnQsIHdzVXJsKTtcbiAgICAgICAgY29uc29sZS53YXJuKGBbR2VuQXNzaXN0IENoYXRdICR7ZGlhZ25vc3RpY31gKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcbiAgICAgIHRoaXMud2ViU29ja2V0LmNsb3NlKCk7XG4gICAgICB0aGlzLndlYlNvY2tldCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFdlbGNvbWVJbWFnZShhZ2VudElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW1hZ2VSZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldChcbiAgICAgICAgYCR7dGhpcy5iYXNlVXJsfS9hcGkvZ2VuYWdlbnQvYWdlbnRzL2NvbmZpZ3MvJHthZ2VudElkfS93ZWxjb21lLWltYWdlYCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLFxuICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBjb25zdCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChpbWFnZVJlc3BvbnNlLmRhdGEpO1xuICAgICAgdGhpcy53ZWxjb21lT2JqZWN0VXJsID0gYmxvYlVybDtcbiAgICAgIHRoaXMud2VsY29tZURhdGEuaW1hZ2VVcmwgPSBibG9iVXJsO1xuICAgICAgaWYgKHRoaXMud2VsY29tZURhdGFIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMud2VsY29tZURhdGFIYW5kbGVyKHRoaXMud2VsY29tZURhdGEpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAodGhpcy5pc1Rva2VuRXhwaXJlZEVycm9yKGVycikpIHtcbiAgICAgICAgdGhpcy5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBmZWVkYmFjayB0byBhIHNwZWNpZmljIGFnZW50IG1lc3NhZ2UgaW4gdGhlIGNvbnZlcnNhdGlvblxuICBhc3luYyBhZGRGZWVkYmFjayhcbiAgICBtZXNzYWdlSWQ6IHN0cmluZyxcbiAgICBmZWVkYmFjazogXCJnb29kXCIgfCBcImJhZFwiLFxuICAgIGZlZWRiYWNrX21lc3NhZ2U/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFtZXNzYWdlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk1lc3NhZ2UgSUQgaXMgcmVxdWlyZWQgZm9yIGZlZWRiYWNrXCIpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgbWVzc2FnZSBJRCBpbiB0aGUgVVJMIHBhdGgsIG5vdCBjb252ZXJzYXRpb24gSURcbiAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYmFzZVVybH0vYXBpL2NvbnZlcnNhdGlvbnMvbWVzc2FnZS9hZGQtZmVlZGJhY2svJHttZXNzYWdlSWR9YDtcbiAgICAgIC8vIEJvZHkgc2hvdWxkIG9ubHkgY29udGFpbiBmZWVkYmFjayBhbmQgZmVlZGJhY2tfbWVzc2FnZSAobm8gbWVzc2FnZV9pZClcbiAgICAgIGNvbnN0IHBheWxvYWQ6IHtcbiAgICAgICAgZmVlZGJhY2s6IFwiZ29vZFwiIHwgXCJiYWRcIjtcbiAgICAgICAgZmVlZGJhY2tfbWVzc2FnZT86IHN0cmluZztcbiAgICAgIH0gPSB7XG4gICAgICAgIGZlZWRiYWNrLFxuICAgICAgfTtcblxuICAgICAgaWYgKGZlZWRiYWNrX21lc3NhZ2UpIHtcbiAgICAgICAgcGF5bG9hZC5mZWVkYmFja19tZXNzYWdlID0gZmVlZGJhY2tfbWVzc2FnZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYXhpb3MucGF0Y2godXJsLCBwYXlsb2FkLCB7XG4gICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLFxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5pc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yKSkge1xuICAgICAgICB0aGlzLnJlc2V0Q2hhdENvbnZlcnNhdGlvbigpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcignRmVlZGJhY2sgQVBJIGNhbGwgZmFpbGVkOicsIHtcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgcmVzcG9uc2U6IGVycm9yLnJlc3BvbnNlPy5kYXRhLFxuICAgICAgICBzdGF0dXM6IGVycm9yLnJlc3BvbnNlPy5zdGF0dXMsXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gYWRqdXN0IG1lc3NhZ2UgdGltZXN0YW1wcyByZWxhdGl2ZSB0byBjb252ZXJzYXRpb24gc3RhcnRcbiAgcHJpdmF0ZSBhZGp1c3RNZXNzYWdlVGltZXN0YW1wcyhtZXNzYWdlOiBDaGF0TWVzc2FnZSk6IENoYXRNZXNzYWdlIHtcbiAgICBpZiAoIXRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSkge1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICBzdGFydF90aW1lOiBtZXNzYWdlLnN0YXJ0X3RpbWUgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUsXG4gICAgICBlbmRfdGltZTogbWVzc2FnZS5lbmRfdGltZSAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqKioqKioqKioqKiBIZWFydGJlYXQgcG9sbGluZyAqKioqKioqKioqKiovXG4gIC8qKlxuICAgKiBQb2xsIGluLXByb2dyZXNzIGNvbnZlcnNhdGlvbiAoaGVhcnRiZWF0IHdoZW4gV2ViU29ja2V0IGlzIGRpc2FibGVkKS5cbiAgICogUmV0dXJucyBzdGF0dXMgYW5kIG1lc3NhZ2VzIG5vcm1hbGl6ZWQgdG8gQ2hhdE1lc3NhZ2VbXS5cbiAgICovXG4gIGFzeW5jIHBvbGxJblByb2dyZXNzQ29udmVyc2F0aW9uKCk6IFByb21pc2U8e1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIHBvbGxNZXNzYWdlczogSW5Qcm9ncmVzc1BvbGxNZXNzYWdlW107XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMuY29udmVyc2F0aW9uSWQgfHwgIXRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udmVyc2F0aW9uIG5vdCBzdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MuZ2V0PEluUHJvZ3Jlc3NQb2xsUmVzcG9uc2U+KFxuICAgICAgYCR7dGhpcy5iYXNlVXJsfS9hcGkvY29udmVyc2F0aW9ucy9pbi1wcm9ncmVzcy9wb2xsLyR7dGhpcy5jb252ZXJzYXRpb25JZH1gLFxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSB9XG4gICAgKTtcblxuICAgIGNvbnN0IHBvbGxNZXNzYWdlcyA9IChyZXNwb25zZS5kYXRhLm1lc3NhZ2VzIHx8IFtdKS5tYXAoKG0pID0+XG4gICAgICB0aGlzLm5vcm1hbGl6ZVBvbGxNZXNzYWdlVG9DaGF0TWVzc2FnZShtKVxuICAgICk7XG5cbiAgICByZXR1cm4geyBzdGF0dXM6IHJlc3BvbnNlLmRhdGEuc3RhdHVzLCBwb2xsTWVzc2FnZXMgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplUG9sbE1lc3NhZ2VUb0NoYXRNZXNzYWdlKG06IEluUHJvZ3Jlc3NQb2xsTWVzc2FnZSk6IEluUHJvZ3Jlc3NQb2xsTWVzc2FnZSB7XG4gICAgbGV0IGNyZWF0ZVRpbWUgPVxuICAgICAgdHlwZW9mIG0uY3JlYXRlX3RpbWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgPyBtLmNyZWF0ZV90aW1lXG4gICAgICAgIDogbS5jcmVhdGVfdGltZVxuICAgICAgICAgID8gK25ldyBEYXRlKG0uY3JlYXRlX3RpbWUpXG4gICAgICAgICAgOiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcblxuICAgIC8vIE5vcm1hbGl6ZSB0byBzZWNvbmRzOiBJU08gc3RyaW5nIGdpdmVzIG1zICg+MWUxMik7IGlmIHNvIGNvbnZlcnQuIE90aGVyd2lzZSBhc3N1bWUgYWxyZWFkeSBzZWNvbmRzLlxuICAgIGlmIChjcmVhdGVUaW1lID49IDFlMTIpIHtcbiAgICAgIGNyZWF0ZVRpbWUgPSBNYXRoLnJvdW5kKGNyZWF0ZVRpbWUgLyAxMDAwKTtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnRUaW1lID1cbiAgICAgIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSAhPSBudWxsXG4gICAgICAgID8gY3JlYXRlVGltZSAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZVxuICAgICAgICA6IG0uc3RhcnRfdGltZTtcbiAgICBjb25zdCBlbmRUaW1lID1cbiAgICAgIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSAhPSBudWxsXG4gICAgICAgID8gc3RhcnRUaW1lICsgKG0uZW5kX3RpbWUgLSBtLnN0YXJ0X3RpbWUpIHx8IDAuMDFcbiAgICAgICAgOiBtLmVuZF90aW1lO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogbS5pZCxcbiAgICAgIGNyZWF0ZV90aW1lOiBjcmVhdGVUaW1lLFxuICAgICAgc3RhcnRfdGltZTogc3RhcnRUaW1lLFxuICAgICAgZW5kX3RpbWU6IGVuZFRpbWUsXG4gICAgICBzcGVha2VyOiBtLnNwZWFrZXIgYXMgXCJjdXN0b21lclwiIHwgXCJhZ2VudFwiIHwgXCJzcGVjaWFsXCIsXG4gICAgICB0ZXh0OiBtLnRleHQsXG4gICAgICB0eXBlOiBtLnR5cGUsXG4gICAgICBmZWVkYmFjazogbS5mZWVkYmFjayxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgbm90aWZ5VGFrZW92ZXJGcm9tUG9sbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBQb2xsIGFscmVhZHkgYWRkcyB0aGUgXCJTdXBlcnZpc29yIHRvb2sgb3ZlclwiIG1lc3NhZ2UgZnJvbSB0aGUgbWVzc2FnZSBsaXN0LlxuICAgIC8vIE9ubHkgcnVuIHRoZSBoYW5kbGVyIHNvIFVJIHN0YXRlIHVwZGF0ZXM7IGRvIG5vdCBjYWxsIGhhbmRsZVRha2VvdmVyKCkgb3Igd2UgZHVwbGljYXRlIHRoZSBtZXNzYWdlLlxuICAgIGlmICh0aGlzLnRha2VvdmVySGFuZGxlcikge1xuICAgICAgdGhpcy50YWtlb3ZlckhhbmRsZXIoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBub3RpZnlGaW5hbGl6ZWRGcm9tUG9sbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBQb2xsIGFscmVhZHkgYWRkcyB0aGUgXCJDb252ZXJzYXRpb24gRmluYWxpemVkXCIgbWVzc2FnZSBmcm9tIHRoZSBtZXNzYWdlIGxpc3QuXG4gICAgLy8gT25seSB1cGRhdGUgc3RhdGUgYW5kIHJ1biB0aGUgaGFuZGxlcjsgZG8gbm90IGNhbGwgaGFuZGxlQ29udmVyc2F0aW9uRmluYWxpemVkKCkgb3Igd2UgZHVwbGljYXRlIHRoZSBtZXNzYWdlLlxuICAgIGlmICh0aGlzLmZpbmFsaXplZEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuZmluYWxpemVkSGFuZGxlcigpO1xuICAgIH1cbiAgICB0aGlzLmlzRmluYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLnNhdmVDb252ZXJzYXRpb24oKTtcbiAgfVxuXG4gIC8qKioqKiogRW5kIG9mIEhlYXJ0YmVhdCBwb2xsaW5nICoqKioqKioqKioqKi9cbn1cbiJdfQ==
|
|
1211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdFNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvY2hhdFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFlMUIsT0FBTyxFQUNMLGVBQWUsRUFDZiw4QkFBOEIsRUFDOUIseUJBQXlCLEdBQzFCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsTUFBTSxDQUFDLElBQU0sZ0NBQWdDLEdBQUcsa0NBQWtDLENBQUM7QUFFbkY7SUFzQ0UscUJBQ0UsT0FBZSxFQUNmLFlBQWdDLEVBQ2hDLE1BQWMsRUFDZCxRQUE4QixFQUM5QixNQUFlLEVBQ2YsUUFBaUIsRUFDakIsS0FBcUIsRUFDckIsT0FBd0I7UUFEeEIsc0JBQUEsRUFBQSxZQUFxQjtRQUNyQix3QkFBQSxFQUFBLGVBQXdCO1FBekNsQixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFDckMsMkJBQXNCLEdBQWtCLElBQUksQ0FBQyxDQUFDLGdDQUFnQztRQUM5RSxlQUFVLEdBQWtCLElBQUksQ0FBQyxDQUFDLGdDQUFnQztRQUNsRSxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixjQUFTLEdBQXFCLElBQUksQ0FBQztRQUNuQyxtQkFBYyxHQUE0QyxJQUFJLENBQUM7UUFDL0Qsb0JBQWUsR0FBd0IsSUFBSSxDQUFDO1FBQzVDLHFCQUFnQixHQUF3QixJQUFJLENBQUM7UUFDN0MsMkJBQXNCLEdBRW5CLElBQUksQ0FBQztRQUNSLHVCQUFrQixHQUE4QyxJQUFJLENBQUM7UUFDckUsbUJBQWMsR0FBRyx3QkFBd0IsQ0FBQztRQUMxQyxvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQUMvQixnQkFBVyxHQUFxQixFQUFFLENBQUM7UUFDbkMsbUJBQWMsR0FBd0IsRUFBRSxPQUFPLEVBQUUsRUFBRSxF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RUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQ1IsV0FBVyxFQUFFLFVBQVU7WUFDdkIsVUFBVSxFQUFFLFNBQVM7WUFDckIsUUFBUSxFQUFFLE9BQU87WUFDakIsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUEyQztZQUN0RCxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7WUFDWixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7WUFDWixRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7U0FDckIsQ0FBQztJQUNKLENBQUM7SUFFSyw0Q0FBc0IsR0FBNUI7OztnQkFDRSw4RUFBOEU7Z0JBQzlFLHNHQUFzRztnQkFDdEcsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDekIsQ0FBQzs7OztLQUNGO0lBRUssNkNBQXVCLEdBQTdCOzs7Z0JBQ0UsZ0ZBQWdGO2dCQUNoRixnSEFBZ0g7Z0JBQ2hILElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7b0JBQzFCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMxQixDQUFDO2dCQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7OztLQUN6QjtJQUdILGtCQUFDO0FBQUQsQ0FBQyxBQXJ4Q0QsSUFxeENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHtcbiAgQ2hhdE1lc3NhZ2UsXG4gIEFnZW50SW5mb1Jlc3BvbnNlLFxuICBBZ2VudENoYXRMb2NhbGVzUmVzcG9uc2UsXG4gIEFnZW50Q2hhdExvY2FsZUNvbnRlbnQsXG4gIEZvcm1Ob2RlTG9jYWxlLFxuICBTdGFydENvbnZlcnNhdGlvblJlc3BvbnNlLFxuICBBdHRhY2htZW50LFxuICBBZ2VudFRoaW5raW5nQ29uZmlnLFxuICBBZ2VudFdlbGNvbWVEYXRhLFxuICBGaWxlVXBsb2FkUmVzcG9uc2UsXG4gIEluUHJvZ3Jlc3NQb2xsUmVzcG9uc2UsXG4gIEluUHJvZ3Jlc3NQb2xsTWVzc2FnZSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXQsXG4gIGNyZWF0ZVdlYlNvY2tldENvbnZlcnNhdGlvblVybCxcbiAgY3JlYXRlV2ViU29ja2V0RGlhZ25vc3RpYyxcbn0gZnJvbSBcIi4uL3V0aWxzL3dlYnNvY2tldFwiO1xuZXhwb3J0IGNvbnN0IEdFTkFTU0lTVF9BR0VOVF9NRVRBREFUQV9VUERBVEVEID0gXCJnZW5hc3Npc3RfYWdlbnRfbWV0YWRhdGFfdXBkYXRlZFwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhdFNlcnZpY2Uge1xuICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSB3ZWJzb2NrZXRVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBhcGlLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjb252ZXJzYXRpb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29udmVyc2F0aW9uQ3JlYXRlVGltZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7IC8vIFRyYWNrIGNvbnZlcnNhdGlvbiBzdGFydCB0aW1lXG4gIHByaXZhdGUgZ3Vlc3RUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIEd1ZXN0IHRva2VuIGZvciBhdXRob3JpemF0aW9uXG4gIHByaXZhdGUgaXNGaW5hbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB3ZWJTb2NrZXQ6IFdlYlNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1lc3NhZ2VIYW5kbGVyOiAoKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRha2VvdmVySGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZmluYWxpemVkSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGlvblN0YXRlSGFuZGxlcjpcbiAgICB8ICgoc3RhdGU6IFwiY29ubmVjdGluZ1wiIHwgXCJjb25uZWN0ZWRcIiB8IFwiZGlzY29ubmVjdGVkXCIpID0+IHZvaWQpXG4gICAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB3ZWxjb21lRGF0YUhhbmRsZXI6ICgoZGF0YTogQWdlbnRXZWxjb21lRGF0YSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdG9yYWdlS2V5QmFzZSA9IFwiZ2VuYXNzaXN0X2NvbnZlcnNhdGlvblwiO1xuICBwcml2YXRlIHBvc3NpYmxlUXVlcmllczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSB3ZWxjb21lRGF0YTogQWdlbnRXZWxjb21lRGF0YSA9IHt9O1xuICBwcml2YXRlIHRoaW5raW5nQ29uZmlnOiBBZ2VudFRoaW5raW5nQ29uZmlnID0geyBwaHJhc2VzOiBbXSwgZGVsYXlNczogMTAwMCB9O1xuICBwcml2YXRlIGNoYXRJbnB1dE1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAvLyBTZXQgZnJvbSB0aGUgc3RhcnQgcmVzcG9uc2U6IHdoZW4gdHJ1ZSwgYSBIdW1hbiBJbiBUaGUgTG9vcCBub2RlIHdpdGggXCJzaG93X29uX3N0YXJ0XCJcbiAgLy8gaXMgd2lyZWQgZGlyZWN0bHkgYWZ0ZXIgU3RhcnQsIHNvIHRoZSB3aWRnZXQgYXV0by1ydW5zIHRoZSB3b3JrZmxvdyBhcyB0aGUgY2hhdCBvcGVucy5cbiAgcHJpdmF0ZSB0cmlnZ2VyU3RhcnRGb3JtOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgd2VsY29tZU9iamVjdFVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIHRvIHJldm9rZSBvbiByZXNldFxuICBwcml2YXRlIHRlbmFudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGFnZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBhdmFpbGFibGVMYW5ndWFnZXM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYWdlbnRDaGF0TG9jYWxlczogUmVjb3JkPHN0cmluZywgQWdlbnRDaGF0TG9jYWxlQ29udGVudD4gfCBudWxsID1cbiAgICBudWxsO1xuICBwcml2YXRlIGxhbmd1YWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXNlV3M6IGJvb2xlYW47XG4gIHByaXZhdGUgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSB1c2VQb2xsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYmFzZVVybDogc3RyaW5nLFxuICAgIHdlYnNvY2tldFVybDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGFwaUtleTogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICB0ZW5hbnQ/OiBzdHJpbmcsXG4gICAgbGFuZ3VhZ2U/OiBzdHJpbmcsXG4gICAgdXNlV3M6IGJvb2xlYW4gPSB0cnVlLFxuICAgIHVzZVBvbGw6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsLmVuZHNXaXRoKFwiL1wiKSA/IGJhc2VVcmwuc2xpY2UoMCwgLTEpIDogYmFzZVVybDtcbiAgICB0aGlzLndlYnNvY2tldFVybCA9IHdlYnNvY2tldFVybDtcbiAgICB0aGlzLmFwaUtleSA9IGFwaUtleTtcbiAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gICAgdGhpcy50ZW5hbnQgPSB0ZW5hbnQ7XG4gICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlO1xuICAgIHRoaXMudXNlV3MgPSB1c2VXcztcbiAgICB0aGlzLnVzZVBvbGwgPSB1c2VQb2xsO1xuICAgIC8vIFRyeSB0byBsb2FkIGEgc2F2ZWQgY29udmVyc2F0aW9uIGZvciB0aGlzIGFwaUtleSBmcm9tIGxvY2FsU3RvcmFnZVxuICAgIHRoaXMubG9hZFNhdmVkQ29udmVyc2F0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFN0b3JhZ2VLZXkoKTogc3RyaW5nIHtcbiAgICAvLyBQb2ludGVyIHRvIGN1cnJlbnQgY29udmVyc2F0aW9uIG1ldGFkYXRhIGZvciB0aGlzIGFwaUtleVxuICAgIHJldHVybiBgJHt0aGlzLnN0b3JhZ2VLZXlCYXNlfToke3RoaXMuYXBpS2V5fWA7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNvbnZlcnNhdGlvbiBmaW5hbGl6ZWQ6IGVtaXQgc3BlY2lhbCBtZXNzYWdlLCBjYWxsIGZpbmFsaXplZCBoYW5kbGVyLCBwZXJzaXN0IHN0YXRlLlxuICAgKi9cbiAgcHVibGljIGhhbmRsZUNvbnZlcnNhdGlvbkZpbmFsaXplZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgICBjb25zdCBmaW5hbGl6ZWRNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgY3JlYXRlX3RpbWU6IG5vdyxcbiAgICAgICAgc3RhcnRfdGltZTogdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lXG4gICAgICAgICAgPyBub3cgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWVcbiAgICAgICAgICA6IDAsXG4gICAgICAgIGVuZF90aW1lOiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWVcbiAgICAgICAgICA/IG5vdyAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSArIDAuMDFcbiAgICAgICAgICA6IDAuMDEsXG4gICAgICAgIHNwZWFrZXI6IFwic3BlY2lhbFwiLFxuICAgICAgICB0ZXh0OiBcIkNvbnZlcnNhdGlvbiBGaW5hbGl6ZWRcIixcbiAgICAgICAgdHlwZTogXCJmaW5hbGl6ZWRcIixcbiAgICAgIH07XG4gICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyKGZpbmFsaXplZE1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy5maW5hbGl6ZWRIYW5kbGVyKSB7XG4gICAgICB0aGlzLmZpbmFsaXplZEhhbmRsZXIoKTtcbiAgICB9XG4gICAgdGhpcy5pc0ZpbmFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5zYXZlQ29udmVyc2F0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdCBhZ2VudF9jaGF0X2lucHV0X21ldGFkYXRhIHRvIGxvY2FsU3RvcmFnZSBhbmQgZGlzcGF0Y2ggYSBnbG9iYWwgZXZlbnQuXG4gICAqIEFueSBjb25zdW1lciAoZS5nLiBjb25maWcgcGFuZWwpIGNhbiBsaXN0ZW4gZm9yIEdFTkFTU0lTVF9BR0VOVF9NRVRBREFUQV9VUERBVEVEXG4gICAqIG9yIHJlYWQgZnJvbSBsb2NhbFN0b3JhZ2Ugb24gbW91bnQ7IG5vIG5lZWQgdG8gcGFzcyBjYWxsYmFja3MgaW50byB0aGUgY2hhdC5cbiAgICovXG4gIHByaXZhdGUgcGVyc2lzdEFuZEVtaXRBZ2VudE1ldGFkYXRhKG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBrZXkgPSBgZ2VuYXNzaXN0X2FnZW50X2NoYXRfaW5wdXRfbWV0YWRhdGE6JHt0aGlzLmFwaUtleX1gO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShtZXRhZGF0YSkpO1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KEdFTkFTU0lTVF9BR0VOVF9NRVRBREFUQV9VUERBVEVELCB7XG4gICAgICAgICAgICBkZXRhaWw6IHsgYXBpS2V5OiB0aGlzLmFwaUtleSwgbWV0YWRhdGE6IHsgLi4ubWV0YWRhdGEgfSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBsYW5ndWFnZSBmb3IgQWNjZXB0LUxhbmd1YWdlIGhlYWRlclxuICAgKi9cbiAgc2V0TGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbWV0YWRhdGEgKHVzZWZ1bCBmb3IgdXBkYXRpbmcgbGFuZ3VhZ2Ugb3Igb3RoZXIgZHluYW1pYyBtZXRhZGF0YSlcbiAgICovXG4gIHNldE1ldGFkYXRhKG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBsYW5ndWFnZSBjb2RlIGZvciBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyXG4gICAqIENvbnZlcnRzIHNpbXBsZSBsYW5ndWFnZSBjb2RlcyAoZS5nLiwgXCJlblwiLCBcImVzXCIpIHRvIHByb3BlciBmb3JtYXQgKGUuZy4sIFwiZW4tVVMsZW47cT0wLjlcIilcbiAgICogRm9sbG93cyBIVFRQIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXIgc3RhbmRhcmRzXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdEFjY2VwdExhbmd1YWdlKGxhbmdDb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbGFuZ0NvZGUpIHJldHVybiAnJztcblxuICAgIC8vIE5vcm1hbGl6ZSBsYW5ndWFnZSBjb2RlIChsb3dlcmNhc2UsIGhhbmRsZSBjb21tb24gZm9ybWF0cylcbiAgICBjb25zdCBub3JtYWxpemVkID0gbGFuZ0NvZGUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAvLyBNYXAgY29tbW9uIGxhbmd1YWdlIGNvZGVzIHRvIHRoZWlyIGZ1bGwgbG9jYWxlIGZvcm1hdFxuICAgIGNvbnN0IGxhbmd1YWdlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2VuJzogJ2VuLVVTJyxcbiAgICAgICdlcyc6ICdlcy1FUycsXG4gICAgICAnZnInOiAnZnItRlInLFxuICAgICAgJ2RlJzogJ2RlLURFJyxcbiAgICAgICdpdCc6ICdpdC1JVCcsXG4gICAgICAncHQnOiAncHQtUFQnLFxuICAgICAgJ2FyJzogJ2FyLVNBJyxcbiAgICAgICdzcSc6ICdzcS1BTCcsXG4gICAgICAnemgnOiAnemgtQ04nLFxuICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY29kZSBhbHJlYWR5IGhhcyBhIHJlZ2lvbiAoZS5nLiwgXCJlbi1VU1wiLCBcImVzLUVTXCIpXG4gICAgY29uc3QgaGFzUmVnaW9uID0gbm9ybWFsaXplZC5pbmNsdWRlcygnLScpO1xuXG4gICAgLy8gR2V0IHRoZSBmdWxsIGxvY2FsZSBvciB1c2UgdGhlIHByb3ZpZGVkIGNvZGUgaWYgaXQgYWxyZWFkeSBoYXMgYSByZWdpb25cbiAgICBjb25zdCBmdWxsTG9jYWxlID0gaGFzUmVnaW9uID8gbm9ybWFsaXplZCA6IChsYW5ndWFnZU1hcFtub3JtYWxpemVkXSB8fCBub3JtYWxpemVkKTtcblxuICAgIC8vIEV4dHJhY3QgYmFzZSBsYW5ndWFnZSBmcm9tIHRoZSBmdWxsIGxvY2FsZSAoZS5nLiwgXCJlblwiIGZyb20gXCJlbi1VU1wiKVxuICAgIGNvbnN0IGZ1bGxCYXNlTGFuZyA9IGZ1bGxMb2NhbGUuc3BsaXQoJy0nKVswXS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gQnVpbGQgQWNjZXB0LUxhbmd1YWdlIGhlYWRlcjogcHJpbWFyeSBsb2NhbGUsIGJhc2UgbGFuZ3VhZ2Ugd2l0aCBxdWFsaXR5LCBFbmdsaXNoIGZhbGxiYWNrXG4gICAgLy8gRm9ybWF0OiBcImxvY2FsZSxiYXNlLWxhbmc7cT0wLjksZW47cT0wLjhcIlxuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtmdWxsTG9jYWxlXTtcblxuICAgIC8vIGZhbGxiYWNrXG4gICAgcGFydHMucHVzaChgJHtmdWxsQmFzZUxhbmd9O3E9MC45YCk7XG5cbiAgICAvLyBBZGQgRW5nbGlzaCBhcyBmYWxsYmFjayBpZiBub3QgYWxyZWFkeSB0aGUgcHJpbWFyeSBsYW5ndWFnZVxuICAgIGlmIChmdWxsQmFzZUxhbmcgIT09ICdlbicpIHtcbiAgICAgIHBhcnRzLnB1c2goJ2VuO3E9MC44Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJywgJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGhlYWRlcnMgZm9yIEFQSSByZXF1ZXN0cywgaW5jbHVkaW5nIGF1dGhvcml6YXRpb24gaWYgZ3Vlc3QgdG9rZW4gaXMgYXZhaWxhYmxlXG4gICAqL1xuICBwcml2YXRlIGdldEhlYWRlcnMoY29udGVudFR5cGU6IHN0cmluZyA9IFwiYXBwbGljYXRpb24vanNvblwiKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IGNvbnRlbnRUeXBlLFxuICAgIH07XG5cbiAgICAvLyBQcmVmZXIgZ3Vlc3QgSldUIGZvciBzZXNzaW9uIGNhbGxzOyBvbWl0IHNoYXJlZCBBUEkga2V5IG9uY2Ugc2NvcGVkIHRva2VuIGV4aXN0cy5cbiAgICBpZiAodGhpcy5ndWVzdFRva2VuKSB7XG4gICAgICBoZWFkZXJzW1wiQXV0aG9yaXphdGlvblwiXSA9IGBCZWFyZXIgJHt0aGlzLmd1ZXN0VG9rZW59YDtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZGVyc1tcIngtYXBpLWtleVwiXSA9IHRoaXMuYXBpS2V5O1xuICAgIH1cblxuICAgIC8vIEFkZCB0ZW5hbnQgaGVhZGVyIGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMudGVuYW50KSB7XG4gICAgICBoZWFkZXJzW1wieC10ZW5hbnQtaWRcIl0gPSB0aGlzLnRlbmFudDtcbiAgICB9XG5cbiAgICAvLyBBZGQgQWNjZXB0LUxhbmd1YWdlIGhlYWRlciBpZiBsYW5ndWFnZSBpcyBzZXRcbiAgICBpZiAodGhpcy5sYW5ndWFnZSkge1xuICAgICAgY29uc3QgYWNjZXB0TGFuZ3VhZ2UgPSB0aGlzLmZvcm1hdEFjY2VwdExhbmd1YWdlKHRoaXMubGFuZ3VhZ2UpO1xuICAgICAgaWYgKGFjY2VwdExhbmd1YWdlKSB7XG4gICAgICAgIGhlYWRlcnNbXCJBY2NlcHQtTGFuZ3VhZ2VcIl0gPSBhY2NlcHRMYW5ndWFnZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuXG4gIHNldE1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI6IChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgc2V0VGFrZW92ZXJIYW5kbGVyKGhhbmRsZXI6ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLnRha2VvdmVySGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBzZXRGaW5hbGl6ZWRIYW5kbGVyKGhhbmRsZXI6ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLmZpbmFsaXplZEhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgc2V0Q29ubmVjdGlvblN0YXRlSGFuZGxlcihcbiAgICBoYW5kbGVyOiAoc3RhdGU6IFwiY29ubmVjdGluZ1wiIHwgXCJjb25uZWN0ZWRcIiB8IFwiZGlzY29ubmVjdGVkXCIpID0+IHZvaWRcbiAgKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHNldFdlbGNvbWVEYXRhSGFuZGxlcihoYW5kbGVyOiAoKGRhdGE6IEFnZW50V2VsY29tZURhdGEpID0+IHZvaWQpIHwgbnVsbCkge1xuICAgIHRoaXMud2VsY29tZURhdGFIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHNldFNlcnZlclVuYXZhaWxhYmxlQ29uZmlnKFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcsXG4gICAgY29udGFjdFVybD86IHN0cmluZyxcbiAgICBjb250YWN0TGFiZWw/OiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsID0gY29udGFjdFVybDtcbiAgICB0aGlzLnNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsID0gY29udGFjdExhYmVsO1xuICB9XG5cbiAgZ2V0UG9zc2libGVRdWVyaWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wb3NzaWJsZVF1ZXJpZXM7XG4gIH1cblxuICBnZXRXZWxjb21lRGF0YSgpOiBBZ2VudFdlbGNvbWVEYXRhIHtcbiAgICByZXR1cm4gdGhpcy53ZWxjb21lRGF0YTtcbiAgfVxuXG4gIGdldFRoaW5raW5nQ29uZmlnKCk6IEFnZW50VGhpbmtpbmdDb25maWcge1xuICAgIHJldHVybiB0aGlzLnRoaW5raW5nQ29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGFkYXRhIGtleXMvZGVmYXVsdHMgZnJvbSB0aGUgd29ya2Zsb3cncyBDaGF0IElucHV0IG5vZGUgKHJldHVybmVkIHdoZW4gY29udmVyc2F0aW9uIHN0YXJ0cykuXG4gICAqIFVzZWQgdG8gc2hvdyB3b3JrZmxvdy1kZWZpbmVkIG1ldGFkYXRhIGluIHRoZSBjb25maWcgcGFuZWwuXG4gICAqL1xuICBnZXRDaGF0SW5wdXRNZXRhZGF0YSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5jaGF0SW5wdXRNZXRhZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHdpZGdldCBzaG91bGQgYXV0by1ydW4gdGhlIHdvcmtmbG93IGFzIHRoZSBjb252ZXJzYXRpb24gb3BlbnMgdG8gc3VyZmFjZVxuICAgKiBhIEh1bWFuIEluIFRoZSBMb29wIGZvcm0gd2lyZWQgZGlyZWN0bHkgYWZ0ZXIgU3RhcnQgKGl0cyBcInNob3dfb25fc3RhcnRcIiBpcyBlbmFibGVkKS5cbiAgICovXG4gIHNob3VsZFRyaWdnZXJTdGFydEZvcm0oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlclN0YXJ0Rm9ybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdXBwb3J0ZWQgbGFuZ3VhZ2VzIGZvciB0aGUgY3VycmVudCBhZ2VudCAoaWYgcHJvdmlkZWQgYnkgdGhlIHNlcnZlcikuXG4gICAqL1xuICBnZXRBdmFpbGFibGVMYW5ndWFnZXMoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMgPyBbLi4udGhpcy5hdmFpbGFibGVMYW5ndWFnZXNdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhZ2VudCBtZXRhZGF0YSAoZS5nLiBzdXBwb3J0ZWQgbGFuZ3VhZ2VzKSB3aXRob3V0IHN0YXJ0aW5nIGEgY29udmVyc2F0aW9uLlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hBZ2VudEluZm8oKTogUHJvbWlzZTxBZ2VudEluZm9SZXNwb25zZSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5nZXQ8QWdlbnRJbmZvUmVzcG9uc2U+KFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9jb252ZXJzYXRpb25zL2luLXByb2dyZXNzL2FnZW50LWluZm9gLFxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpIH1cbiAgICAgICk7XG4gICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UuZGF0YSB8fCB7fTtcbiAgICAgIGNvbnN0IGFnZW50SWQgPVxuICAgICAgICB0eXBlb2YgZGF0YS5hZ2VudF9pZCA9PT0gXCJzdHJpbmdcIiA/IGRhdGEuYWdlbnRfaWQgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByYXdMYW5ndWFnZXMgPSBBcnJheS5pc0FycmF5KGRhdGEuYWdlbnRfYXZhaWxhYmxlX2xhbmd1YWdlcylcbiAgICAgICAgPyBkYXRhLmFnZW50X2F2YWlsYWJsZV9sYW5ndWFnZXNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBhdmFpbGFibGVMYW5ndWFnZXMgPSByYXdMYW5ndWFnZXNcbiAgICAgICAgPyByYXdMYW5ndWFnZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGxhbmcpID0+IHR5cGVvZiBsYW5nID09PSBcInN0cmluZ1wiICYmIGxhbmcudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAubWFwKChsYW5nKSA9PiBsYW5nLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoYWdlbnRJZCkge1xuICAgICAgICB0aGlzLmFnZW50SWQgPSBhZ2VudElkO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXZhaWxhYmxlTGFuZ3VhZ2VzKSB7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gYXZhaWxhYmxlTGFuZ3VhZ2VzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZ2VudF9pZDogYWdlbnRJZCxcbiAgICAgICAgYWdlbnRfYXZhaWxhYmxlX2xhbmd1YWdlczogYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgICBsaXZlX3ZvaWNlX2VuYWJsZWQ6IGRhdGEubGl2ZV92b2ljZV9lbmFibGVkID09PSB0cnVlLFxuICAgICAgICBsaXZlX3ZvaWNlX3JlYWR5OiBkYXRhLmxpdmVfdm9pY2VfcmVhZHkgPT09IHRydWUsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHJlc29sdmVkIHdlbGNvbWUgLyBGQVEgLyB0aGlua2luZyBzdHJpbmdzIGZvciBhbGwgYWdlbnQgbG9jYWxlcyAobm8gY29udmVyc2F0aW9uIHJlcXVpcmVkKS5cbiAgICogUmVxdWVzdCBoZWFkZXJzIGluY2x1ZGUgYEFjY2VwdC1MYW5ndWFnZWAgZnJvbSB0aGUgY3VycmVudCB7QGxpbmsgc2V0TGFuZ3VhZ2V9IHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hBZ2VudENoYXRMb2NhbGVzKCk6IFByb21pc2U8QWdlbnRDaGF0TG9jYWxlc1Jlc3BvbnNlIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldDxBZ2VudENoYXRMb2NhbGVzUmVzcG9uc2U+KFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9jb252ZXJzYXRpb25zL2luLXByb2dyZXNzL2FnZW50LWNoYXQtbG9jYWxlc2AsXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCkgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhO1xuICAgICAgaWYgKGRhdGE/LmxvY2FsZXMgJiYgdHlwZW9mIGRhdGEubG9jYWxlcyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aGlzLmFnZW50Q2hhdExvY2FsZXMgPSBkYXRhLmxvY2FsZXM7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLmFnZW50X2F2YWlsYWJsZV9sYW5ndWFnZXMpKSB7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gZGF0YS5hZ2VudF9hdmFpbGFibGVfbGFuZ3VhZ2VzXG4gICAgICAgICAgLmZpbHRlcigobGFuZykgPT4gdHlwZW9mIGxhbmcgPT09IFwic3RyaW5nXCIgJiYgbGFuZy50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAubWFwKChsYW5nKSA9PiBsYW5nLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkYXRhLmFnZW50X2lkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRoaXMuYWdlbnRJZCA9IGRhdGEuYWdlbnRfaWQ7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBkYXRhLmFnZW50X3RoaW5raW5nX3BocmFzZV9kZWxheSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICBkYXRhLmFnZW50X3RoaW5raW5nX3BocmFzZV9kZWxheSA+PSAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy50aGlua2luZ0NvbmZpZy5kZWxheU1zID0gTWF0aC5tYXgoXG4gICAgICAgICAgMjUwLFxuICAgICAgICAgIE1hdGgucm91bmQoZGF0YS5hZ2VudF90aGlua2luZ19waHJhc2VfZGVsYXkgKiAxMDAwKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBkYXRhLmFnZW50X2NoYXRfaW5wdXRfbWV0YWRhdGEgIT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgZGF0YS5hZ2VudF9jaGF0X2lucHV0X21ldGFkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGRhdGEuYWdlbnRfY2hhdF9pbnB1dF9tZXRhZGF0YSkgJiZcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5jaGF0SW5wdXRNZXRhZGF0YSkubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jaGF0SW5wdXRNZXRhZGF0YSA9IHsgLi4uZGF0YS5hZ2VudF9jaGF0X2lucHV0X21ldGFkYXRhIH07XG4gICAgICAgIHRoaXMucGVyc2lzdEFuZEVtaXRBZ2VudE1ldGFkYXRhKHRoaXMuY2hhdElucHV0TWV0YWRhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgcHJlLWZldGNoZWQgbG9jYWxlIHN0cmluZ3MgZm9yIHRoZSB3aWRnZXQgVUkgd2l0aG91dCByZXN0YXJ0aW5nIHRoZSBjb252ZXJzYXRpb24uXG4gICAqIFJldHVybnMgY3VycmVudCB0aGlua2luZyBjb25maWcgd2hlbiBhIGxvY2FsZSBidW5kbGUgd2FzIGFwcGxpZWQsIHNvIFJlYWN0IHN0YXRlIGNhbiBzeW5jLlxuICAgKi9cbiAgYXBwbHlMYW5ndWFnZUZyb21Mb2NhbGVzKGxhbmc6IHN0cmluZyk6IHtcbiAgICB0aGlua2luZ1BocmFzZXM6IHN0cmluZ1tdO1xuICAgIHRoaW5raW5nRGVsYXlNczogbnVtYmVyO1xuICB9IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmFnZW50Q2hhdExvY2FsZXMgfHwgIWxhbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb2RlID0gbGFuZy50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiLVwiKVswXTtcbiAgICBjb25zdCBidW5kbGUgPSB0aGlzLmFnZW50Q2hhdExvY2FsZXM7XG4gICAgY29uc3Qgc2xpY2UgPVxuICAgICAgYnVuZGxlW2NvZGVdIHx8IGJ1bmRsZVtcImVuXCJdIHx8IE9iamVjdC52YWx1ZXMoYnVuZGxlKVswXTtcbiAgICBpZiAoIXNsaWNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzbGljZS5wb3NzaWJsZV9xdWVyaWVzKSkge1xuICAgICAgdGhpcy5wb3NzaWJsZVF1ZXJpZXMgPSBzbGljZS5wb3NzaWJsZV9xdWVyaWVzLmZpbHRlcihcbiAgICAgICAgKHF1ZXJ5KSA9PiB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgJiYgcXVlcnkudHJpbSgpLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy53ZWxjb21lRGF0YSA9IHtcbiAgICAgIC4uLnRoaXMud2VsY29tZURhdGEsXG4gICAgICB0aXRsZTogc2xpY2Uud2VsY29tZV90aXRsZSA/PyB0aGlzLndlbGNvbWVEYXRhLnRpdGxlID8/IG51bGwsXG4gICAgICBtZXNzYWdlOiBzbGljZS53ZWxjb21lX21lc3NhZ2UgPz8gdGhpcy53ZWxjb21lRGF0YS5tZXNzYWdlID8/IG51bGwsXG4gICAgICBpbnB1dERpc2NsYWltZXJIdG1sOlxuICAgICAgICBzbGljZS5pbnB1dF9kaXNjbGFpbWVyX2h0bWwgPz8gdGhpcy53ZWxjb21lRGF0YS5pbnB1dERpc2NsYWltZXJIdG1sID8/IG51bGwsXG4gICAgICBwb3NzaWJsZVF1ZXJpZXM6XG4gICAgICAgIHRoaXMucG9zc2libGVRdWVyaWVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHRoaXMucG9zc2libGVRdWVyaWVzXG4gICAgICAgICAgOiB0aGlzLndlbGNvbWVEYXRhLnBvc3NpYmxlUXVlcmllcyxcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2xpY2UudGhpbmtpbmdfcGhyYXNlcykpIHtcbiAgICAgIGNvbnN0IHBocmFzZXMgPSBzbGljZS50aGlua2luZ19waHJhc2VzLmZpbHRlcihcbiAgICAgICAgKHApID0+IHR5cGVvZiBwID09PSBcInN0cmluZ1wiICYmIHAudHJpbSgpLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAocGhyYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudGhpbmtpbmdDb25maWcgPSB7XG4gICAgICAgICAgLi4udGhpcy50aGlua2luZ0NvbmZpZyxcbiAgICAgICAgICBwaHJhc2VzLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLndlbGNvbWVEYXRhSGFuZGxlcikge1xuICAgICAgdGhpcy53ZWxjb21lRGF0YUhhbmRsZXIoe1xuICAgICAgICB0aXRsZTogdGhpcy53ZWxjb21lRGF0YS50aXRsZSA/PyBudWxsLFxuICAgICAgICBtZXNzYWdlOiB0aGlzLndlbGNvbWVEYXRhLm1lc3NhZ2UgPz8gbnVsbCxcbiAgICAgICAgaW1hZ2VVcmw6IHRoaXMud2VsY29tZURhdGEuaW1hZ2VVcmwgPz8gbnVsbCxcbiAgICAgICAgcG9zc2libGVRdWVyaWVzOiB0aGlzLnBvc3NpYmxlUXVlcmllcyxcbiAgICAgICAgaW5wdXREaXNjbGFpbWVySHRtbDogdGhpcy53ZWxjb21lRGF0YS5pbnB1dERpc2NsYWltZXJIdG1sID8/IG51bGwsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNhdmVDb252ZXJzYXRpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgdGhpbmtpbmdQaHJhc2VzOiBbLi4udGhpcy50aGlua2luZ0NvbmZpZy5waHJhc2VzXSxcbiAgICAgIHRoaW5raW5nRGVsYXlNczogdGhpcy50aGlua2luZ0NvbmZpZy5kZWxheU1zLFxuICAgIH07XG4gIH1cblxuICAvKiogSElUTCBmb3JtIHN0cmluZ3MgZnJvbSB0aGUgbG9jYWxlIGJ1bmRsZSwgYXMgYHsgbGFuZzogeyBub2RlSWQ6IHNsaWNlIH0gfWAuICovXG4gIGdldEZvcm1Ob2RlTG9jYWxlcygpOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBGb3JtTm9kZUxvY2FsZT4+IHtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEZvcm1Ob2RlTG9jYWxlPj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtjb2RlLCBzbGljZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5hZ2VudENoYXRMb2NhbGVzIHx8IHt9KSkge1xuICAgICAgaWYgKHNsaWNlICYmIHNsaWNlLm5vZGVzICYmIE9iamVjdC5rZXlzKHNsaWNlLm5vZGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIG91dFtjb2RlLnRvTG93ZXJDYXNlKCldID0gc2xpY2Uubm9kZXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIHNhdmVkIGNvbnZlcnNhdGlvbiBJRCBmcm9tIGxvY2FsU3RvcmFnZVxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkU2F2ZWRDb252ZXJzYXRpb24oKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBzYXZlZENvbnZlcnNhdGlvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U3RvcmFnZUtleSgpKTtcbiAgICAgIC8vIEJhY2t3YXJkLWNvbXBhdDogY2hlY2sgb2xkIHVuc2NvcGVkIGtleSBpZiBzY29wZWQgb25lIG1pc3NpbmdcbiAgICAgIGlmICghc2F2ZWRDb252ZXJzYXRpb24pIHtcbiAgICAgICAgc2F2ZWRDb252ZXJzYXRpb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXlCYXNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzYXZlZENvbnZlcnNhdGlvbikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgY3JlYXRlVGltZSxcbiAgICAgICAgICBpc0ZpbmFsaXplZCxcbiAgICAgICAgICBwb3NzaWJsZVF1ZXJpZXMsXG4gICAgICAgICAgd2VsY29tZURhdGEsXG4gICAgICAgICAgdGhpbmtpbmdDb25maWcsXG4gICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICBndWVzdFRva2VuLFxuICAgICAgICAgIGF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgICAgfSA9IEpTT04ucGFyc2Uoc2F2ZWRDb252ZXJzYXRpb24pO1xuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSA9IGNyZWF0ZVRpbWU7XG4gICAgICAgIHRoaXMuaXNGaW5hbGl6ZWQgPSBpc0ZpbmFsaXplZCB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5ndWVzdFRva2VuID0gZ3Vlc3RUb2tlbiB8fCBudWxsO1xuICAgICAgICB0aGlzLnBvc3NpYmxlUXVlcmllcyA9IEFycmF5LmlzQXJyYXkocG9zc2libGVRdWVyaWVzKVxuICAgICAgICAgID8gcG9zc2libGVRdWVyaWVzXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgdGhpcy53ZWxjb21lRGF0YSA9IHdlbGNvbWVEYXRhIHx8IHt9O1xuICAgICAgICBpZiAoIXRoaXMud2VsY29tZURhdGEucG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgICAgdGhpcy53ZWxjb21lRGF0YS5wb3NzaWJsZVF1ZXJpZXMgPSB0aGlzLnBvc3NpYmxlUXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRoaW5raW5nQ29uZmlnID0ge1xuICAgICAgICAgIHBocmFzZXM6ICh0aGlua2luZ0NvbmZpZyAmJiB0aGlua2luZ0NvbmZpZy5waHJhc2VzKSB8fCBbXSxcbiAgICAgICAgICBkZWxheU1zOlxuICAgICAgICAgICAgdGhpbmtpbmdDb25maWcgJiYgdHlwZW9mIHRoaW5raW5nQ29uZmlnLmRlbGF5TXMgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgPyB0aGlua2luZ0NvbmZpZy5kZWxheU1zXG4gICAgICAgICAgICAgIDogMTAwMCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hZ2VudElkID0gYWdlbnRJZDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXZhaWxhYmxlTGFuZ3VhZ2VzKSkge1xuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gYXZhaWxhYmxlTGFuZ3VhZ2VzO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy53ZWxjb21lRGF0YS5pbWFnZVVybCAmJiB0aGlzLmFnZW50SWQpIHtcbiAgICAgICAgICB0aGlzLmZldGNoV2VsY29tZUltYWdlKHRoaXMuYWdlbnRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMud2VsY29tZURhdGFIYW5kbGVyKSB7XG4gICAgICAgICAgdGhpcy53ZWxjb21lRGF0YUhhbmRsZXIodGhpcy53ZWxjb21lRGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIGN1cnJlbnQgY29udmVyc2F0aW9uIElEIHRvIGxvY2FsU3RvcmFnZVxuICAgKi9cbiAgcHJpdmF0ZSBzYXZlQ29udmVyc2F0aW9uKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5jb252ZXJzYXRpb25JZCAmJiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUpIHtcbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uRGF0YSA9IHtcbiAgICAgICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5jb252ZXJzYXRpb25JZCxcbiAgICAgICAgICBjcmVhdGVUaW1lOiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUsXG4gICAgICAgICAgaXNGaW5hbGl6ZWQ6IHRoaXMuaXNGaW5hbGl6ZWQsXG4gICAgICAgICAgcG9zc2libGVRdWVyaWVzOiB0aGlzLnBvc3NpYmxlUXVlcmllcyxcbiAgICAgICAgICB3ZWxjb21lRGF0YToge1xuICAgICAgICAgICAgLi4udGhpcy53ZWxjb21lRGF0YSxcbiAgICAgICAgICAgIGltYWdlVXJsOlxuICAgICAgICAgICAgICB0aGlzLndlbGNvbWVPYmplY3RVcmwgJiZcbiAgICAgICAgICAgICAgdGhpcy53ZWxjb21lRGF0YS5pbWFnZVVybCAmJlxuICAgICAgICAgICAgICB0aGlzLndlbGNvbWVEYXRhLmltYWdlVXJsLnN0YXJ0c1dpdGgoXCJibG9iOlwiKVxuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDogdGhpcy53ZWxjb21lRGF0YS5pbWFnZVVybCB8fCBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpbmtpbmdDb25maWc6IHRoaXMudGhpbmtpbmdDb25maWcsXG4gICAgICAgICAgYWdlbnRJZDogdGhpcy5hZ2VudElkLFxuICAgICAgICAgIGd1ZXN0VG9rZW46IHRoaXMuZ3Vlc3RUb2tlbixcbiAgICAgICAgICBhdmFpbGFibGVMYW5ndWFnZXM6IHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgICB9O1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFN0b3JhZ2VLZXkoKSwgSlNPTi5zdHJpbmdpZnkoY29udmVyc2F0aW9uRGF0YSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpZiBhbiBlcnJvciBpcyBhIHRva2VuIGV4cGlyYXRpb24gZXJyb3JcbiAgcHJpdmF0ZSBpc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZXJyb3IucmVzcG9uc2UgJiZcbiAgICAgIGVycm9yLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxICYmXG4gICAgICBlcnJvci5yZXNwb25zZS5kYXRhICYmXG4gICAgICAoZXJyb3IucmVzcG9uc2UuZGF0YS5lcnJvciA9PT0gXCJUb2tlbiBoYXMgZXhwaXJlZC5cIiB8fFxuICAgICAgICBlcnJvci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgPT09IFwiVG9rZW4gaGFzIGV4cGlyZWQuXCIgfHxcbiAgICAgICAgKHR5cGVvZiBlcnJvci5yZXNwb25zZS5kYXRhID09PSBcInN0cmluZ1wiICYmIGVycm9yLnJlc3BvbnNlLmRhdGEuaW5jbHVkZXMoXCJUb2tlbiBoYXMgZXhwaXJlZFwiKSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBoYW5kbGVyIGZvciB0YWtlb3ZlciBldmVudHM6IGVtaXRzIGEgc3BlY2lhbCBtZXNzYWdlIGFuZCBpbnZva2VzIHRha2VvdmVySGFuZGxlci5cbiAgICogUnVucyBvbmx5IG9uY2UgcGVyIGNvbnZlcnNhdGlvbiAoaWRlbXBvdGVudCkuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVRha2VvdmVyKG5vdz86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHQgPSBub3cgPz8gRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IHRha2VvdmVyTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgIGNyZWF0ZV90aW1lOiB0LFxuICAgICAgICBzdGFydF90aW1lOiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgPyB0IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lIDogMCxcbiAgICAgICAgZW5kX3RpbWU6IHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSA/IHQgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgKyAwLjAxIDogMC4wMSxcbiAgICAgICAgc3BlYWtlcjogXCJzcGVjaWFsXCIsXG4gICAgICAgIHRleHQ6IFwiU3VwZXJ2aXNvciB0b29rIG92ZXJcIixcbiAgICAgICAgdHlwZTogXCJ0YWtlb3ZlclwiLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcih0YWtlb3Zlck1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YWtlb3ZlckhhbmRsZXIpIHtcbiAgICAgIHRoaXMudGFrZW92ZXJIYW5kbGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBjdXJyZW50IGNvbnZlcnNhdGlvbiBieSBjbGVhcmluZyB0aGUgSUQgYW5kIHdlYnNvY2tldFxuICAgKi9cbiAgcmVzZXRDaGF0Q29udmVyc2F0aW9uKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHRoZSBjb252ZXJzYXRpb24gSURcbiAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gbnVsbDtcbiAgICB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgPSBudWxsO1xuICAgIHRoaXMuZ3Vlc3RUb2tlbiA9IG51bGw7XG4gICAgdGhpcy5pc0ZpbmFsaXplZCA9IGZhbHNlO1xuXG4gICAgLy8gQ2xlYXIgcG9zc2libGUgcXVlcmllcyBhbmQgd29ya2Zsb3cgbWV0YWRhdGFcbiAgICB0aGlzLnBvc3NpYmxlUXVlcmllcyA9IFtdO1xuICAgIHRoaXMud2VsY29tZURhdGEgPSB7fTtcbiAgICB0aGlzLnRoaW5raW5nQ29uZmlnID0geyBwaHJhc2VzOiBbXSwgZGVsYXlNczogMTAwMCB9O1xuICAgIHRoaXMuY2hhdElucHV0TWV0YWRhdGEgPSB7fTtcbiAgICB0aGlzLnRyaWdnZXJTdGFydEZvcm0gPSBmYWxzZTtcbiAgICBpZiAodGhpcy53ZWxjb21lT2JqZWN0VXJsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMud2VsY29tZU9iamVjdFVybCk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgICB0aGlzLndlbGNvbWVPYmplY3RVcmwgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmFnZW50SWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBsb2NhbCBzdG9yYWdlXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuZ2V0U3RvcmFnZUtleSgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZXJlJ3MgYSBjdXJyZW50IGNvbnZlcnNhdGlvblxuICAgKi9cbiAgaGFzQWN0aXZlQ29udmVyc2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY29udmVyc2F0aW9uSWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGNvbnZlcnNhdGlvbiBJRFxuICAgKi9cbiAgZ2V0Q29udmVyc2F0aW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udmVyc2F0aW9uSWQ7XG4gIH1cblxuICBnZXRDb252ZXJzYXRpb25DcmVhdGVUaW1lKCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWU7XG4gIH1cblxuICBpc0NvbnZlcnNhdGlvbkZpbmFsaXplZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0ZpbmFsaXplZDtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0Q29udmVyc2F0aW9uKHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVxdWVzdEJvZHk6IGFueSA9IHtcbiAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICByZWNvcmRlZF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBkYXRhX3NvdXJjZV9pZDogXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZUNhcHRjaGFUb2tlbikge1xuICAgICAgICByZXF1ZXN0Qm9keS5yZWNhcHRjaGFfdG9rZW4gPSByZUNhcHRjaGFUb2tlbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWV0YWRhdGEpIHtcbiAgICAgICAgcmVxdWVzdEJvZHkubWV0YWRhdGEgPSB0aGlzLm1ldGFkYXRhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3Q8U3RhcnRDb252ZXJzYXRpb25SZXNwb25zZT4oXG4gICAgICAgIGAke3RoaXMuYmFzZVVybH0vYXBpL2NvbnZlcnNhdGlvbnMvaW4tcHJvZ3Jlc3Mvc3RhcnRgLFxuICAgICAgICByZXF1ZXN0Qm9keSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gcmVzcG9uc2UuZGF0YS5jb252ZXJzYXRpb25faWQ7XG4gICAgICAvLyBTdG9yZSBjb252ZXJzYXRpb24gY3JlYXRlIHRpbWUgKHVzZSBmcm9tIHJlc3BvbnNlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGN1cnJlbnQgdGltZSlcbiAgICAgIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSA9IHJlc3BvbnNlLmRhdGEuY3JlYXRlX3RpbWVcbiAgICAgICAgPyByZXNwb25zZS5kYXRhLmNyZWF0ZV90aW1lIC8gMTAwMFxuICAgICAgICA6IERhdGUubm93KCkgLyAxMDAwO1xuICAgICAgLy8gU3RvcmUgZ3Vlc3QgdG9rZW4gaWYgcHJvdmlkZWRcbiAgICAgIHRoaXMuZ3Vlc3RUb2tlbiA9IHJlc3BvbnNlLmRhdGEuZ3Vlc3RfdG9rZW4gfHwgbnVsbDtcbiAgICAgIHRoaXMuaXNGaW5hbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgLy8gU3RvcmUgcG9zc2libGUgcXVlcmllcyBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChcbiAgICAgICAgcmVzcG9uc2UuZGF0YS5hZ2VudF9wb3NzaWJsZV9xdWVyaWVzICYmXG4gICAgICAgIHJlc3BvbnNlLmRhdGEuYWdlbnRfcG9zc2libGVfcXVlcmllcy5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5wb3NzaWJsZVF1ZXJpZXMgPSByZXNwb25zZS5kYXRhLmFnZW50X3Bvc3NpYmxlX3F1ZXJpZXMuZmlsdGVyKFxuICAgICAgICAgIChxdWVyeSkgPT4gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiICYmIHF1ZXJ5LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFueURhdGE6IGFueSA9IHJlc3BvbnNlLmRhdGEgYXMgYW55O1xuICAgICAgY29uc3QgYWdlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gYW55RGF0YS5hZ2VudF9pZDtcbiAgICAgIHRoaXMuYWdlbnRJZCA9IGFnZW50SWQ7XG4gICAgICBjb25zdCByYXdMYW5ndWFnZXMgPSBBcnJheS5pc0FycmF5KGFueURhdGEuYWdlbnRfYXZhaWxhYmxlX2xhbmd1YWdlcylcbiAgICAgICAgPyBhbnlEYXRhLmFnZW50X2F2YWlsYWJsZV9sYW5ndWFnZXNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAocmF3TGFuZ3VhZ2VzKSB7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gcmF3TGFuZ3VhZ2VzXG4gICAgICAgICAgLmZpbHRlcigobGFuZzogYW55KSA9PiB0eXBlb2YgbGFuZyA9PT0gXCJzdHJpbmdcIiAmJiBsYW5nLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgIC5tYXAoKGxhbmc6IHN0cmluZykgPT4gbGFuZy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhd01ldGEgPSBhbnlEYXRhLmFnZW50X2NoYXRfaW5wdXRfbWV0YWRhdGE7XG4gICAgICBpZiAoXG4gICAgICAgIHJhd01ldGEgIT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgcmF3TWV0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkocmF3TWV0YSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNoYXRJbnB1dE1ldGFkYXRhID0geyAuLi5yYXdNZXRhIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoYXRJbnB1dE1ldGFkYXRhID0ge307XG4gICAgICB9XG4gICAgICB0aGlzLnRyaWdnZXJTdGFydEZvcm0gPSBhbnlEYXRhLmFnZW50X3RyaWdnZXJfc3RhcnRfZm9ybSA9PT0gdHJ1ZTtcbiAgICAgIHRoaXMucGVyc2lzdEFuZEVtaXRBZ2VudE1ldGFkYXRhKHRoaXMuY2hhdElucHV0TWV0YWRhdGEpO1xuICAgICAgY29uc3Qgd2VsY29tZVRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBhbnlEYXRhLmFnZW50X3dlbGNvbWVfdGl0bGU7XG4gICAgICBjb25zdCB3ZWxjb21lSW1hZ2VVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gICAgICAgIGFueURhdGEuYWdlbnRfd2VsY29tZV9pbWFnZV91cmw7XG4gICAgICBjb25zdCB0aGlua2luZ1BocmFzZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID1cbiAgICAgICAgYW55RGF0YS5hZ2VudF90aGlua2luZ19waHJhc2VzO1xuICAgICAgY29uc3QgdGhpbmtpbmdEZWxheVNlYzogbnVtYmVyIHwgdW5kZWZpbmVkID1cbiAgICAgICAgYW55RGF0YS5hZ2VudF90aGlua2luZ19waHJhc2VfZGVsYXk7XG4gICAgICBjb25zdCBpbnB1dERpc2NsYWltZXJIdG1sOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBhbnlEYXRhLmFnZW50X2lucHV0X2Rpc2NsYWltZXJfaHRtbDtcblxuICAgICAgdGhpcy53ZWxjb21lRGF0YSA9IHtcbiAgICAgICAgdGl0bGU6IHdlbGNvbWVUaXRsZSB8fCBudWxsLFxuICAgICAgICBtZXNzYWdlOiBudWxsLFxuICAgICAgICBpbWFnZVVybDogd2VsY29tZUltYWdlVXJsIHx8IG51bGwsXG4gICAgICAgIHBvc3NpYmxlUXVlcmllczogdGhpcy5wb3NzaWJsZVF1ZXJpZXMsXG4gICAgICAgIGlucHV0RGlzY2xhaW1lckh0bWw6IGlucHV0RGlzY2xhaW1lckh0bWwgPz8gbnVsbCxcbiAgICAgIH07XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaW5raW5nUGhyYXNlcykgJiYgdGhpbmtpbmdQaHJhc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50aGlua2luZ0NvbmZpZy5waHJhc2VzID0gdGhpbmtpbmdQaHJhc2VzO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0aGlua2luZ0RlbGF5U2VjID09PSBcIm51bWJlclwiICYmIHRoaW5raW5nRGVsYXlTZWMgPj0gMCkge1xuICAgICAgICB0aGlzLnRoaW5raW5nQ29uZmlnLmRlbGF5TXMgPSBNYXRoLm1heChcbiAgICAgICAgICAyNTAsXG4gICAgICAgICAgTWF0aC5yb3VuZCh0aGlua2luZ0RlbGF5U2VjICogMTAwMClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLndlbGNvbWVEYXRhLmltYWdlVXJsICYmIGFnZW50SWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaFdlbGNvbWVJbWFnZShhZ2VudElkKTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2VzcyBhZ2VudCB3ZWxjb21lIG1lc3NhZ2UgaWYgYXZhaWxhYmxlXG4gICAgICBpZiAocmVzcG9uc2UuZGF0YS5hZ2VudF93ZWxjb21lX21lc3NhZ2UgJiYgdGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICAgICAgY29uc3Qgd2VsY29tZU1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAgIGNyZWF0ZV90aW1lOiBub3csXG4gICAgICAgICAgc3RhcnRfdGltZTogbm93IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lLCAvLyBSZWxhdGl2ZSB0byBjb252ZXJzYXRpb24gc3RhcnRcbiAgICAgICAgICBlbmRfdGltZTogbm93IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lICsgMC4wMSwgLy8gUmVsYXRpdmUgdG8gY29udmVyc2F0aW9uIHN0YXJ0XG4gICAgICAgICAgc3BlYWtlcjogXCJhZ2VudFwiLFxuICAgICAgICAgIHRleHQ6IHJlc3BvbnNlLmRhdGEuYWdlbnRfd2VsY29tZV9tZXNzYWdlLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLndlbGNvbWVEYXRhLm1lc3NhZ2UgPSByZXNwb25zZS5kYXRhLmFnZW50X3dlbGNvbWVfbWVzc2FnZTtcbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcih3ZWxjb21lTWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLndlbGNvbWVEYXRhSGFuZGxlcikge1xuICAgICAgICB0aGlzLndlbGNvbWVEYXRhSGFuZGxlcih0aGlzLndlbGNvbWVEYXRhKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zYXZlQ29udmVyc2F0aW9uKCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5jb252ZXJzYXRpb25faWQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKHRoaXMuaXNUb2tlbkV4cGlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgdGhpcy5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRbXSxcbiAgICBleHRyYU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICByZUNhcHRjaGFUb2tlbj86IHN0cmluZyxcbiAgICBvcHRzPzogeyBzaWxlbnQ/OiBib29sZWFuIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNvbnZlcnNhdGlvbklkIHx8ICF0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnZlcnNhdGlvbiBub3Qgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICBjb25zdCBjaGF0TWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICBjcmVhdGVfdGltZTogbm93LFxuICAgICAgc3RhcnRfdGltZTogbm93IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lLCAvLyBSZWxhdGl2ZSB0byBjb252ZXJzYXRpb24gc3RhcnRcbiAgICAgIGVuZF90aW1lOiBub3cgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgKyAwLjAxLCAvLyBSZWxhdGl2ZSB0byBjb252ZXJzYXRpb24gc3RhcnRcbiAgICAgIHNwZWFrZXI6IFwiY3VzdG9tZXJcIixcbiAgICAgIHRleHQ6IG1lc3NhZ2UsXG4gICAgICBhdHRhY2htZW50czogYXR0YWNobWVudHMsXG4gICAgfTtcblxuICAgIC8vIGBzaWxlbnRgIHN1cHByZXNzZXMgdGhlIG9wdGltaXN0aWMgdXNlciBidWJibGUg4oCUIHVzZWQgYnkgdGhlIGludmlzaWJsZSBzdGFydC1mb3JtXG4gICAgLy8gdHJpZ2dlciwgd2hpY2ggbXVzdCBydW4gdGhlIHdvcmtmbG93IHdpdGhvdXQgc2hvd2luZyBvciBzdG9yaW5nIGEgdXNlciBtZXNzYWdlLlxuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyICYmICFvcHRzPy5zaWxlbnQpIHtcbiAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIoY2hhdE1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0Qm9keTogYW55ID0ge1xuICAgICAgICBtZXNzYWdlczogW2NoYXRNZXNzYWdlXSxcbiAgICAgICAgcmVjb3JkZWRfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZUNhcHRjaGFUb2tlbikge1xuICAgICAgICByZXF1ZXN0Qm9keS5yZWNhcHRjaGFfdG9rZW4gPSByZUNhcHRjaGFUb2tlbjtcbiAgICAgIH1cblxuICAgICAgLy8gSW5jbHVkZSBtZXRhZGF0YVxuICAgICAgY29uc3QgbWVyZ2VkTWV0YWRhdGEgPSB7XG4gICAgICAgIC4uLih0aGlzLm1ldGFkYXRhIHx8IHt9KSxcbiAgICAgICAgLi4uKGV4dHJhTWV0YWRhdGEgfHwge30pLFxuICAgICAgfTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhtZXJnZWRNZXRhZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICByZXF1ZXN0Qm9keS5tZXRhZGF0YSA9IG1lcmdlZE1ldGFkYXRhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBhdGNoKFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9jb252ZXJzYXRpb25zL2luLXByb2dyZXNzL3VwZGF0ZS8ke3RoaXMuY29udmVyc2F0aW9uSWR9YCxcbiAgICAgICAgcmVxdWVzdEJvZHksXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSxcbiAgICAgICAgfVxuICAgICAgKS5jYXRjaChlID0+IHtcbiAgICAgICAgY29uc3QgZXJyID0gZT8ucmVzcG9uc2U/LmRhdGE7XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvciB3aGVuIGNvbnZlcnNhdGlvbiBpcyBmaW5hbGl6ZWRcbiAgICAgICAgaWYgKGVycj8uZXJyb3Jfa2V5ID09PSAnQ09OVkVSU0FUSU9OX0ZJTkFMSVpFRCcgfHwgZXJyPy5lcnJvcl9rZXkgPT09ICdBR0VOVF9OT1RfRk9VTkQnKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVDb252ZXJzYXRpb25GaW5hbGl6ZWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgbm90IHVzaW5nIFdlYlNvY2tldCwgdHJ5IHRvIHJldHJpZXZlIHRoZSByZXNwb25zZSBtZXNzYWdlIGZyb20gdGhlIHVwZGF0ZSBjb252ZXJzYXRpb24gcmVzcG9uc2VcbiAgICAgIGlmICghdGhpcy51c2VXcyAmJiB0aGlzLm1lc3NhZ2VIYW5kbGVyICYmICghdGhpcy51c2VXcyB8fCAhdGhpcy51c2VQb2xsKSkgeyAvLyB1c2VQb2xsIGlzIHRydWUgd2hlbiB1c2luZyBoZWFydGJlYXQgcG9sbGluZ1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlPy5kYXRhIGFzIGFueSB8fCB7fTtcblxuICAgICAgICAgIGlmIChyZXNwb25zZURhdGEubWVzc2FnZXMgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZURhdGEubWVzc2FnZXMpKSB7XG5cbiAgICAgICAgICAgIC8vIExvb2sgZm9yIHRoZSBsYXRlc3QgYWdlbnQgbWVzc2FnZSBpbiB0aGUgcmVzcG9uc2VcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSByZXNwb25zZURhdGEubWVzc2FnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZURhdGEgPSByZXNwb25zZURhdGEubWVzc2FnZXNbaV07XG5cbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VEYXRhLnNwZWFrZXIgPT09IFwiYWdlbnRcIiAmJlxuICAgICAgICAgICAgICAgIG1lc3NhZ2VEYXRhLnRleHQgJiZcbiAgICAgICAgICAgICAgICBtZXNzYWdlRGF0YS5jcmVhdGVfdGltZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgbWVzc2FnZURhdGEuc3RhcnRfdGltZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgbWVzc2FnZURhdGEuZW5kX3RpbWUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZ2VudE1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgY3JlYXRlX3RpbWU6IG1lc3NhZ2VEYXRhLmNyZWF0ZV90aW1lLFxuICAgICAgICAgICAgICAgICAgc3RhcnRfdGltZTogdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lXG4gICAgICAgICAgICAgICAgICAgID8gbWVzc2FnZURhdGEuc3RhcnRfdGltZSAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZVxuICAgICAgICAgICAgICAgICAgICA6IG1lc3NhZ2VEYXRhLnN0YXJ0X3RpbWUsXG4gICAgICAgICAgICAgICAgICBlbmRfdGltZTogdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lXG4gICAgICAgICAgICAgICAgICAgID8gbWVzc2FnZURhdGEuZW5kX3RpbWUgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWVcbiAgICAgICAgICAgICAgICAgICAgOiBtZXNzYWdlRGF0YS5lbmRfdGltZSxcbiAgICAgICAgICAgICAgICAgIHNwZWFrZXI6IFwiYWdlbnRcIixcbiAgICAgICAgICAgICAgICAgIHRleHQ6IG1lc3NhZ2VEYXRhLnRleHQsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBtZXNzYWdlRGF0YS5tZXNzYWdlX2lkIHx8IG1lc3NhZ2VEYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZURhdGEudHlwZSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLy8gT25seSBwcm9jZXNzIGlmIHRoaXMgaXMgYSBuZXcgbWVzc2FnZSB3ZSBoYXZlbid0IHNlZW4gYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgZWFzaWx5IGNoZWNrIGhlcmUsIHNvIHdlJ2xsIGxldCB0aGUgaGFuZGxlciBtYW5hZ2UgZHVwbGljYXRlc1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIoYWdlbnRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgdXBkYXRlIGNvbnZlcnNhdGlvbiByZXNwb25zZTpcIiwgcGFyc2VFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgdG9rZW4gZXhwaXJhdGlvbiBlcnJvclxuICAgICAgaWYgKHRoaXMuaXNUb2tlbkV4cGlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgdGhpcy5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgdGhlIGFnZW50IGluYWN0aXZlIGVycm9yXG4gICAgICBpZiAoXG4gICAgICAgIGVycm9yLnJlc3BvbnNlICYmXG4gICAgICAgIGVycm9yLnJlc3BvbnNlLmRhdGEgJiZcbiAgICAgICAgZXJyb3IucmVzcG9uc2UuZGF0YS5lcnJvcl9rZXkgPT09IFwiQUdFTlRfSU5BQ1RJVkVcIlxuICAgICAgKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGN1c3RvbSBtZXNzYWdlIGZvciB0aGUgYWdlbnQgaW5hY3RpdmUgZXJyb3JcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAgICAgY3JlYXRlX3RpbWU6IG5vdyxcbiAgICAgICAgICAgIHN0YXJ0X3RpbWU6IG5vdyAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSxcbiAgICAgICAgICAgIGVuZF90aW1lOiBub3cgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgKyAwLjAxLFxuICAgICAgICAgICAgc3BlYWtlcjogXCJzcGVjaWFsXCIsXG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSA/PyBcIlRoZSBhZ2VudCBpcyBjdXJyZW50bHkgb2ZmbGluZSwgcGxlYXNlIGNoZWNrIGJhY2sgbGF0ZXIuIFRoYW5rIHlvdSFcIixcbiAgICAgICAgICAgIC4uLih0aGlzLnNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCAmJiB7XG4gICAgICAgICAgICAgIGxpbmtVcmw6IHRoaXMuc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgICAgICAgICAgICBsaW5rTGFiZWw6IHRoaXMuc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwgPz8gXCJDb250YWN0IHN1cHBvcnRcIixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvbid0IHRocm93IHRoZSBlcnJvciBzaW5jZSB3ZSBoYW5kbGVkIGl0IHdpdGggYSBtZXNzYWdlXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgd29ya2Zsb3cgYXMgdGhlIGNvbnZlcnNhdGlvbiBvcGVucyB0byBzdXJmYWNlIGEgSHVtYW4gSW4gVGhlIExvb3AgZm9ybSB3aXJlZFxuICAgKiBkaXJlY3RseSBhZnRlciBTdGFydCAoaXRzIFwic2hvd19vbl9zdGFydFwiIGlzIGVuYWJsZWQpLiBTZW5kcyBhbiBlbXB0eSwgaW52aXNpYmxlXG4gICAqIHRyaWdnZXIgbWVzc2FnZSBmbGFnZ2VkIHNvIHRoZSBiYWNrZW5kIHJ1bnMgdGhlIHdvcmtmbG93IGJ1dCBuZWl0aGVyIHNob3dzIG5vciBzdG9yZXNcbiAgICogaXQg4oCUIG9ubHkgdGhlIHJlc3VsdGluZyBmb3JtIGNvbWVzIGJhY2sgdGhyb3VnaCB0aGUgbm9ybWFsIHJlc3BvbnNlL1dTIHBhdGguXG4gICAqL1xuICBhc3luYyBzZW5kU3RhcnRGb3JtVHJpZ2dlcihyZUNhcHRjaGFUb2tlbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2UoXG4gICAgICBcIlwiLFxuICAgICAgW10sXG4gICAgICB7IHN0YXJ0X2Zvcm1fdHJpZ2dlcjogdHJ1ZSB9LFxuICAgICAgcmVDYXB0Y2hhVG9rZW4sXG4gICAgICB7IHNpbGVudDogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRBdWRpb01lc3NhZ2UoXG4gICAgYXVkaW9CbG9iOiBCbG9iLFxuICAgIGF1ZGlvRm9ybWF0OiBzdHJpbmcsXG4gICAgZXh0cmFNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb252ZXJzYXRpb25JZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udmVyc2F0aW9uIG5vdCBzdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCkgLyAxMDAwO1xuICAgIGNvbnN0IGNoYXRNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgIGNyZWF0ZV90aW1lOiBub3csXG4gICAgICBzdGFydF90aW1lOiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgPyBub3cgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgOiAwLFxuICAgICAgZW5kX3RpbWU6IHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSA/IG5vdyAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSArIDAuMDEgOiAwLjAxLFxuICAgICAgc3BlYWtlcjogXCJjdXN0b21lclwiLFxuICAgICAgdGV4dDogXCJbVm9pY2UgbWVzc2FnZV1cIixcbiAgICAgIHR5cGU6IFwiYXVkaW9cIixcbiAgICAgIGF1ZGlvT2JqZWN0VXJsOiBVUkwuY3JlYXRlT2JqZWN0VVJMKGF1ZGlvQmxvYiksXG4gICAgfTtcblxuICAgIC8vIFNob3cgdXNlciBtZXNzYWdlIGluIFVJIGltbWVkaWF0ZWx5XG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIoY2hhdE1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lcmdlZE1ldGFkYXRhID0ge1xuICAgICAgLi4uKHRoaXMubWV0YWRhdGEgfHwge30pLFxuICAgICAgLi4uKGV4dHJhTWV0YWRhdGEgfHwge30pLFxuICAgIH07XG5cbiAgICBjb25zdCBtb2RlbCA9IHtcbiAgICAgIG1lc3NhZ2VzOiBbY2hhdE1lc3NhZ2VdLFxuICAgICAgbWV0YWRhdGE6IE9iamVjdC5rZXlzKG1lcmdlZE1ldGFkYXRhKS5sZW5ndGggPiAwID8gbWVyZ2VkTWV0YWRhdGEgOiB7fSxcbiAgICB9O1xuXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJtb2RlbFwiLCBKU09OLnN0cmluZ2lmeShtb2RlbCkpO1xuICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgIFwiYXVkaW9fZmlsZVwiLFxuICAgICAgYXVkaW9CbG9iLFxuICAgICAgYHJlY29yZGluZy4ke2F1ZGlvRm9ybWF0fWAsXG4gICAgKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJhdWRpb19mb3JtYXRcIiwgYXVkaW9Gb3JtYXQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGF4aW9zLnBhdGNoKFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9jb252ZXJzYXRpb25zL2luLXByb2dyZXNzL3VwZGF0ZS8ke3RoaXMuY29udmVyc2F0aW9uSWR9YCxcbiAgICAgICAgZm9ybURhdGEsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIpLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5pc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yKSkge1xuICAgICAgICB0aGlzLnJlc2V0Q2hhdENvbnZlcnNhdGlvbigpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBsb2FkRmlsZShjaGF0SWQ6IHN0cmluZywgZmlsZTogRmlsZSk6IFByb21pc2U8RmlsZVVwbG9hZFJlc3BvbnNlIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5jb252ZXJzYXRpb25JZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udmVyc2F0aW9uIG5vdCBzdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKFwiY2hhdF9pZFwiLCBjaGF0SWQpO1xuICAgIGZvcm1EYXRhLmFwcGVuZChcImZpbGVcIiwgZmlsZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0PEZpbGVVcGxvYWRSZXNwb25zZT4oXG4gICAgICAgIGAke3RoaXMuYmFzZVVybH0vYXBpL2dlbmFnZW50L2tub3dsZWRnZS91cGxvYWQtY2hhdC1maWxlYCxcbiAgICAgICAgZm9ybURhdGEsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIpLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YSBhcyBGaWxlVXBsb2FkUmVzcG9uc2U7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKHRoaXMuaXNUb2tlbkV4cGlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgdGhpcy5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHJhdyBXZWJTb2NrZXQgbWVzc2FnZSBkYXRhLiBDYWxsZWQgZnJvbSB1c2VDaGF0V2ViU29ja2V0IGhvb2suXG4gICAqIEhhbmRsZXMgbWVzc2FnZSwgdGFrZW92ZXIsIGFuZCBmaW5hbGl6ZSBldmVudHMuIFBpbmcvcG9uZyBpcyBoYW5kbGVkIGJ5IHRoZSBob29rLlxuICAgKi9cbiAgcHJvY2Vzc1dlYlNvY2tldE1lc3NhZ2UoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAoZGF0YS50eXBlID09PSBcInBpbmdcIikgcmV0dXJuOyAvLyBIYW5kbGVkIGJ5IHVzZUNoYXRXZWJTb2NrZXQgKGtlZXAtYWxpdmUpXG5cbiAgICBpZiAoZGF0YS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiB0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gZGF0YS5wYXlsb2FkO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBwYXlsb2FkIGFzIENoYXRNZXNzYWdlW107XG4gICAgICAgIGNvbnN0IGFkanVzdGVkTWVzc2FnZXMgPSBtZXNzYWdlc1xuICAgICAgICAgIC5tYXAoKG1zZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWRqdXN0ZWQgPSB0aGlzLmFkanVzdE1lc3NhZ2VUaW1lc3RhbXBzKG1zZyk7XG4gICAgICAgICAgICBpZiAoIWFkanVzdGVkLm1lc3NhZ2VfaWQgJiYgKG1zZyBhcyBhbnkpLmlkKSB7XG4gICAgICAgICAgICAgIGFkanVzdGVkLm1lc3NhZ2VfaWQgPSAobXNnIGFzIGFueSkuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWRqdXN0ZWQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKChtc2cpID0+IG1zZy5zcGVha2VyICE9PSBcImN1c3RvbWVyXCIpO1xuICAgICAgICBhZGp1c3RlZE1lc3NhZ2VzLmZvckVhY2goKG0pID0+IHRoaXMubWVzc2FnZUhhbmRsZXIhKG0pKTtcbiAgICAgIH0gZWxzZSBpZiAocGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBjb25zdCBhZGp1c3RlZE1lc3NhZ2UgPSB0aGlzLmFkanVzdE1lc3NhZ2VUaW1lc3RhbXBzKFxuICAgICAgICAgIHBheWxvYWQgYXMgQ2hhdE1lc3NhZ2VcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFhZGp1c3RlZE1lc3NhZ2UubWVzc2FnZV9pZCAmJiAocGF5bG9hZCBhcyBhbnkpLmlkKSB7XG4gICAgICAgICAgYWRqdXN0ZWRNZXNzYWdlLm1lc3NhZ2VfaWQgPSAocGF5bG9hZCBhcyBhbnkpLmlkO1xuICAgICAgICB9XG4gICAgICAgIGlmICgocGF5bG9hZCBhcyBhbnkpLmF1ZGlvX2Zvcm1hdCkge1xuICAgICAgICAgIGFkanVzdGVkTWVzc2FnZS5hdWRpb19mb3JtYXQgPSAocGF5bG9hZCBhcyBhbnkpLmF1ZGlvX2Zvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRqdXN0ZWRNZXNzYWdlLnNwZWFrZXIgIT09IFwiY3VzdG9tZXJcIikge1xuICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIoYWRqdXN0ZWRNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSBcInRha2VvdmVyXCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlVGFrZW92ZXIoKTtcbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gXCJmaW5hbGl6ZVwiKSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbnZlcnNhdGlvbkZpbmFsaXplZCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldEd1ZXN0VG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ3Vlc3RUb2tlbjtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBXZWJTb2NrZXQgaXMgbm93IG1hbmFnZWQgYnkgdXNlQ2hhdFdlYlNvY2tldCBob29rLiBOby1vcC4gKi9cbiAgY29ubmVjdFdlYlNvY2tldCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudXNlV3MgJiYgIXRoaXMud2Vic29ja2V0VXJsKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJXZWJTb2NrZXQgaXMgZGlzYWJsZWQgb3IgVVJMIGlzIG5vdCBzZXRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMud2ViU29ja2V0ICYmIHRoaXMud2ViU29ja2V0IGluc3RhbmNlb2YgV2ViU29ja2V0KSB7XG4gICAgICB0aGlzLndlYlNvY2tldD8uY2xvc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnZlcnNhdGlvbiBJRCBpcyByZXF1aXJlZCBmb3IgV2ViU29ja2V0IGNvbm5lY3Rpb25cIik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXRlSGFuZGxlcikgdGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyKFwiY29ubmVjdGluZ1wiKTtcblxuXG4gICAgLy8gVXNlIGd1ZXN0X3Rva2VuIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBhcGlfa2V5XG4gICAgY29uc3QgYXV0aFBhcmFtID0gdGhpcy5ndWVzdFRva2VuXG4gICAgICA/IGBhY2Nlc3NfdG9rZW49JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5ndWVzdFRva2VuKX1gXG4gICAgICA6IGBhcGlfa2V5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYXBpS2V5KX1gO1xuXG4gICAgLy8gQnVpbGQgV2ViU29ja2V0IFVSTCB3aXRoIHByb3BlciBhdXRoZW50aWNhdGlvblxuICAgIGNvbnN0IHdzVXJsID0gY3JlYXRlV2ViU29ja2V0Q29udmVyc2F0aW9uVXJsKFxuICAgICAgdGhpcy5iYXNlVXJsLFxuICAgICAgdGhpcy53ZWJzb2NrZXRVcmwsXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkLFxuICAgICAgYXV0aFBhcmFtLFxuICAgICAgdGhpcy50ZW5hbnQsXG4gICAgICB0aGlzLmxhbmd1YWdlIHx8IFwiZW5cIixcbiAgICApO1xuXG4gICAgLy8gVXNlIG5hdGl2ZSBicm93c2VyIFdlYlNvY2tldCBmYWN0b3J5XG4gICAgdGhpcy53ZWJTb2NrZXQgPSBjcmVhdGVXZWJTb2NrZXQod3NVcmwpO1xuXG5cbiAgICB0aGlzLndlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyKSB0aGlzLmNvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoXCJjb25uZWN0ZWRcIik7XG4gICAgfTtcblxuICAgIHRoaXMud2ViU29ja2V0Lm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhIGFzIHN0cmluZyk7XG5cbiAgICAgICAgLy8gUmVzcG9uZCB0byBzZXJ2ZXItc2lkZSBoZWFydGJlYXQgcGluZ3NcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gXCJwaW5nXCIpIHtcbiAgICAgICAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiBcInBvbmdcIiB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gXCJtZXNzYWdlXCIgJiYgdGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEucGF5bG9hZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gZGF0YS5wYXlsb2FkIGFzIENoYXRNZXNzYWdlW107XG4gICAgICAgICAgICAvLyBBZGp1c3QgdGltZXN0YW1wcyB0byBiZSByZWxhdGl2ZSB0byBjb252ZXJzYXRpb24gc3RhcnRcbiAgICAgICAgICAgIC8vIEFsc28gbm9ybWFsaXplIG1lc3NhZ2VfaWQgZmllbGQgKGJhY2tlbmQgbWlnaHQgc2VuZCAnaWQnIGluc3RlYWQgb2YgJ21lc3NhZ2VfaWQnKVxuICAgICAgICAgICAgY29uc3QgYWRqdXN0ZWRNZXNzYWdlcyA9IG1lc3NhZ2VzXG4gICAgICAgICAgICAgIC5tYXAoKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkanVzdGVkID0gdGhpcy5hZGp1c3RNZXNzYWdlVGltZXN0YW1wcyhtc2cpO1xuICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZTogaWYgYmFja2VuZCBzZW5kcyAnaWQnLCB1c2UgaXQgYXMgJ21lc3NhZ2VfaWQnXG4gICAgICAgICAgICAgICAgaWYgKCFhZGp1c3RlZC5tZXNzYWdlX2lkICYmIChtc2cgYXMgYW55KS5pZCkge1xuICAgICAgICAgICAgICAgICAgYWRqdXN0ZWQubWVzc2FnZV9pZCA9IChtc2cgYXMgYW55KS5pZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkanVzdGVkO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuZmlsdGVyKChtc2cpID0+IG1zZy5zcGVha2VyICE9PSBcImN1c3RvbWVyXCIpO1xuICAgICAgICAgICAgYWRqdXN0ZWRNZXNzYWdlcy5mb3JFYWNoKHRoaXMubWVzc2FnZUhhbmRsZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBhZGp1c3RlZE1lc3NhZ2UgPSB0aGlzLmFkanVzdE1lc3NhZ2VUaW1lc3RhbXBzKFxuICAgICAgICAgICAgICBkYXRhLnBheWxvYWQgYXMgQ2hhdE1lc3NhZ2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBOb3JtYWxpemU6IGlmIGJhY2tlbmQgc2VuZHMgJ2lkJywgdXNlIGl0IGFzICdtZXNzYWdlX2lkJ1xuICAgICAgICAgICAgaWYgKCFhZGp1c3RlZE1lc3NhZ2UubWVzc2FnZV9pZCAmJiAoZGF0YS5wYXlsb2FkIGFzIGFueSkuaWQpIHtcbiAgICAgICAgICAgICAgYWRqdXN0ZWRNZXNzYWdlLm1lc3NhZ2VfaWQgPSAoZGF0YS5wYXlsb2FkIGFzIGFueSkuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWRqdXN0ZWRNZXNzYWdlLnNwZWFrZXIgIT09IFwiY3VzdG9tZXJcIikge1xuICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyKGFkanVzdGVkTWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gXCJ0YWtlb3ZlclwiKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVUYWtlb3ZlcigpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gXCJmaW5hbGl6ZVwiKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVDb252ZXJzYXRpb25GaW5hbGl6ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMud2ViU29ja2V0Lm9uZXJyb3IgPSAoZXJyb3I6IEV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoXCJkaXNjb25uZWN0ZWRcIik7XG5cbiAgICAgIC8vIExvZyBkaWFnbm9zdGljXG4gICAgICBjb25zdCBkaWFnbm9zdGljID0gY3JlYXRlV2ViU29ja2V0RGlhZ25vc3RpYyhlcnJvciwgd3NVcmwpO1xuICAgICAgY29uc29sZS5lcnJvcihgW0dlbkFzc2lzdCBDaGF0XSAke2RpYWdub3N0aWN9YCk7XG4gICAgfTtcblxuICAgIHRoaXMud2ViU29ja2V0Lm9uY2xvc2UgPSAoZXZlbnQ6IENsb3NlRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0ZUhhbmRsZXIpXG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlSGFuZGxlcihcImRpc2Nvbm5lY3RlZFwiKTtcblxuICAgICAgLy8gTG9nIGRpYWdub3N0aWNcbiAgICAgIGlmICghZXZlbnQud2FzQ2xlYW4pIHtcbiAgICAgICAgY29uc3QgZGlhZ25vc3RpYyA9IGNyZWF0ZVdlYlNvY2tldERpYWdub3N0aWMoZXZlbnQsIHdzVXJsKTtcbiAgICAgICAgY29uc29sZS53YXJuKGBbR2VuQXNzaXN0IENoYXRdICR7ZGlhZ25vc3RpY31gKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcbiAgICAgIHRoaXMud2ViU29ja2V0LmNsb3NlKCk7XG4gICAgICB0aGlzLndlYlNvY2tldCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFdlbGNvbWVJbWFnZShhZ2VudElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW1hZ2VSZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldChcbiAgICAgICAgYCR7dGhpcy5iYXNlVXJsfS9hcGkvZ2VuYWdlbnQvYWdlbnRzL2NvbmZpZ3MvJHthZ2VudElkfS93ZWxjb21lLWltYWdlYCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLFxuICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBjb25zdCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChpbWFnZVJlc3BvbnNlLmRhdGEpO1xuICAgICAgdGhpcy53ZWxjb21lT2JqZWN0VXJsID0gYmxvYlVybDtcbiAgICAgIHRoaXMud2VsY29tZURhdGEuaW1hZ2VVcmwgPSBibG9iVXJsO1xuICAgICAgaWYgKHRoaXMud2VsY29tZURhdGFIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMud2VsY29tZURhdGFIYW5kbGVyKHRoaXMud2VsY29tZURhdGEpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAodGhpcy5pc1Rva2VuRXhwaXJlZEVycm9yKGVycikpIHtcbiAgICAgICAgdGhpcy5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBmZWVkYmFjayB0byBhIHNwZWNpZmljIGFnZW50IG1lc3NhZ2UgaW4gdGhlIGNvbnZlcnNhdGlvblxuICBhc3luYyBhZGRGZWVkYmFjayhcbiAgICBtZXNzYWdlSWQ6IHN0cmluZyxcbiAgICBmZWVkYmFjazogXCJnb29kXCIgfCBcImJhZFwiLFxuICAgIGZlZWRiYWNrX21lc3NhZ2U/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFtZXNzYWdlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk1lc3NhZ2UgSUQgaXMgcmVxdWlyZWQgZm9yIGZlZWRiYWNrXCIpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgbWVzc2FnZSBJRCBpbiB0aGUgVVJMIHBhdGgsIG5vdCBjb252ZXJzYXRpb24gSURcbiAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYmFzZVVybH0vYXBpL2NvbnZlcnNhdGlvbnMvbWVzc2FnZS9hZGQtZmVlZGJhY2svJHttZXNzYWdlSWR9YDtcbiAgICAgIC8vIEJvZHkgc2hvdWxkIG9ubHkgY29udGFpbiBmZWVkYmFjayBhbmQgZmVlZGJhY2tfbWVzc2FnZSAobm8gbWVzc2FnZV9pZClcbiAgICAgIGNvbnN0IHBheWxvYWQ6IHtcbiAgICAgICAgZmVlZGJhY2s6IFwiZ29vZFwiIHwgXCJiYWRcIjtcbiAgICAgICAgZmVlZGJhY2tfbWVzc2FnZT86IHN0cmluZztcbiAgICAgIH0gPSB7XG4gICAgICAgIGZlZWRiYWNrLFxuICAgICAgfTtcblxuICAgICAgaWYgKGZlZWRiYWNrX21lc3NhZ2UpIHtcbiAgICAgICAgcGF5bG9hZC5mZWVkYmFja19tZXNzYWdlID0gZmVlZGJhY2tfbWVzc2FnZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYXhpb3MucGF0Y2godXJsLCBwYXlsb2FkLCB7XG4gICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLFxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5pc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yKSkge1xuICAgICAgICB0aGlzLnJlc2V0Q2hhdENvbnZlcnNhdGlvbigpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcignRmVlZGJhY2sgQVBJIGNhbGwgZmFpbGVkOicsIHtcbiAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgcmVzcG9uc2U6IGVycm9yLnJlc3BvbnNlPy5kYXRhLFxuICAgICAgICBzdGF0dXM6IGVycm9yLnJlc3BvbnNlPy5zdGF0dXMsXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gYWRqdXN0IG1lc3NhZ2UgdGltZXN0YW1wcyByZWxhdGl2ZSB0byBjb252ZXJzYXRpb24gc3RhcnRcbiAgcHJpdmF0ZSBhZGp1c3RNZXNzYWdlVGltZXN0YW1wcyhtZXNzYWdlOiBDaGF0TWVzc2FnZSk6IENoYXRNZXNzYWdlIHtcbiAgICBpZiAoIXRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSkge1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICBzdGFydF90aW1lOiBtZXNzYWdlLnN0YXJ0X3RpbWUgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUsXG4gICAgICBlbmRfdGltZTogbWVzc2FnZS5lbmRfdGltZSAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqKioqKioqKioqKiBIZWFydGJlYXQgcG9sbGluZyAqKioqKioqKioqKiovXG4gIC8qKlxuICAgKiBQb2xsIGluLXByb2dyZXNzIGNvbnZlcnNhdGlvbiAoaGVhcnRiZWF0IHdoZW4gV2ViU29ja2V0IGlzIGRpc2FibGVkKS5cbiAgICogUmV0dXJucyBzdGF0dXMgYW5kIG1lc3NhZ2VzIG5vcm1hbGl6ZWQgdG8gQ2hhdE1lc3NhZ2VbXS5cbiAgICovXG4gIGFzeW5jIHBvbGxJblByb2dyZXNzQ29udmVyc2F0aW9uKCk6IFByb21pc2U8e1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIHBvbGxNZXNzYWdlczogSW5Qcm9ncmVzc1BvbGxNZXNzYWdlW107XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMuY29udmVyc2F0aW9uSWQgfHwgIXRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udmVyc2F0aW9uIG5vdCBzdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MuZ2V0PEluUHJvZ3Jlc3NQb2xsUmVzcG9uc2U+KFxuICAgICAgYCR7dGhpcy5iYXNlVXJsfS9hcGkvY29udmVyc2F0aW9ucy9pbi1wcm9ncmVzcy9wb2xsLyR7dGhpcy5jb252ZXJzYXRpb25JZH1gLFxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSB9XG4gICAgKTtcblxuICAgIGNvbnN0IHBvbGxNZXNzYWdlcyA9IChyZXNwb25zZS5kYXRhLm1lc3NhZ2VzIHx8IFtdKS5tYXAoKG0pID0+XG4gICAgICB0aGlzLm5vcm1hbGl6ZVBvbGxNZXNzYWdlVG9DaGF0TWVzc2FnZShtKVxuICAgICk7XG5cbiAgICByZXR1cm4geyBzdGF0dXM6IHJlc3BvbnNlLmRhdGEuc3RhdHVzLCBwb2xsTWVzc2FnZXMgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplUG9sbE1lc3NhZ2VUb0NoYXRNZXNzYWdlKG06IEluUHJvZ3Jlc3NQb2xsTWVzc2FnZSk6IEluUHJvZ3Jlc3NQb2xsTWVzc2FnZSB7XG4gICAgbGV0IGNyZWF0ZVRpbWUgPVxuICAgICAgdHlwZW9mIG0uY3JlYXRlX3RpbWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgPyBtLmNyZWF0ZV90aW1lXG4gICAgICAgIDogbS5jcmVhdGVfdGltZVxuICAgICAgICAgID8gK25ldyBEYXRlKG0uY3JlYXRlX3RpbWUpXG4gICAgICAgICAgOiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcblxuICAgIC8vIE5vcm1hbGl6ZSB0byBzZWNvbmRzOiBJU08gc3RyaW5nIGdpdmVzIG1zICg+MWUxMik7IGlmIHNvIGNvbnZlcnQuIE90aGVyd2lzZSBhc3N1bWUgYWxyZWFkeSBzZWNvbmRzLlxuICAgIGlmIChjcmVhdGVUaW1lID49IDFlMTIpIHtcbiAgICAgIGNyZWF0ZVRpbWUgPSBNYXRoLnJvdW5kKGNyZWF0ZVRpbWUgLyAxMDAwKTtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnRUaW1lID1cbiAgICAgIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSAhPSBudWxsXG4gICAgICAgID8gY3JlYXRlVGltZSAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZVxuICAgICAgICA6IG0uc3RhcnRfdGltZTtcbiAgICBjb25zdCBlbmRUaW1lID1cbiAgICAgIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSAhPSBudWxsXG4gICAgICAgID8gc3RhcnRUaW1lICsgKG0uZW5kX3RpbWUgLSBtLnN0YXJ0X3RpbWUpIHx8IDAuMDFcbiAgICAgICAgOiBtLmVuZF90aW1lO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogbS5pZCxcbiAgICAgIGNyZWF0ZV90aW1lOiBjcmVhdGVUaW1lLFxuICAgICAgc3RhcnRfdGltZTogc3RhcnRUaW1lLFxuICAgICAgZW5kX3RpbWU6IGVuZFRpbWUsXG4gICAgICBzcGVha2VyOiBtLnNwZWFrZXIgYXMgXCJjdXN0b21lclwiIHwgXCJhZ2VudFwiIHwgXCJzcGVjaWFsXCIsXG4gICAgICB0ZXh0OiBtLnRleHQsXG4gICAgICB0eXBlOiBtLnR5cGUsXG4gICAgICBmZWVkYmFjazogbS5mZWVkYmFjayxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgbm90aWZ5VGFrZW92ZXJGcm9tUG9sbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBQb2xsIGFscmVhZHkgYWRkcyB0aGUgXCJTdXBlcnZpc29yIHRvb2sgb3ZlclwiIG1lc3NhZ2UgZnJvbSB0aGUgbWVzc2FnZSBsaXN0LlxuICAgIC8vIE9ubHkgcnVuIHRoZSBoYW5kbGVyIHNvIFVJIHN0YXRlIHVwZGF0ZXM7IGRvIG5vdCBjYWxsIGhhbmRsZVRha2VvdmVyKCkgb3Igd2UgZHVwbGljYXRlIHRoZSBtZXNzYWdlLlxuICAgIGlmICh0aGlzLnRha2VvdmVySGFuZGxlcikge1xuICAgICAgdGhpcy50YWtlb3ZlckhhbmRsZXIoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBub3RpZnlGaW5hbGl6ZWRGcm9tUG9sbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBQb2xsIGFscmVhZHkgYWRkcyB0aGUgXCJDb252ZXJzYXRpb24gRmluYWxpemVkXCIgbWVzc2FnZSBmcm9tIHRoZSBtZXNzYWdlIGxpc3QuXG4gICAgLy8gT25seSB1cGRhdGUgc3RhdGUgYW5kIHJ1biB0aGUgaGFuZGxlcjsgZG8gbm90IGNhbGwgaGFuZGxlQ29udmVyc2F0aW9uRmluYWxpemVkKCkgb3Igd2UgZHVwbGljYXRlIHRoZSBtZXNzYWdlLlxuICAgIGlmICh0aGlzLmZpbmFsaXplZEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuZmluYWxpemVkSGFuZGxlcigpO1xuICAgIH1cbiAgICB0aGlzLmlzRmluYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLnNhdmVDb252ZXJzYXRpb24oKTtcbiAgfVxuXG4gIC8qKioqKiogRW5kIG9mIEhlYXJ0YmVhdCBwb2xsaW5nICoqKioqKioqKioqKi9cbn1cbiJdfQ==
|