genassist-chat-react 1.0.26 → 1.0.28
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 +2 -0
- package/dist/components/GenAgentChat.js +40 -31
- package/dist/components/GenAgentConfigPanel.d.ts +1 -0
- package/dist/components/GenAgentConfigPanel.js +2 -1
- package/dist/components/InteractiveContent.js +3 -2
- package/dist/components/MarkdownMessage.d.ts +11 -0
- package/dist/components/MarkdownMessage.js +56 -0
- package/dist/components/WelcomeCard.js +3 -3
- package/dist/hooks/useChat.d.ts +6 -2
- package/dist/hooks/useChat.js +314 -67
- package/dist/services/chatService.d.ts +24 -2
- package/dist/services/chatService.js +146 -48
- package/dist/types/index.d.ts +22 -0
- package/dist/types/index.js +1 -1
- package/package.json +5 -2
|
@@ -49,8 +49,9 @@ import axios from "axios";
|
|
|
49
49
|
import { createWebSocket, createWebSocketDiagnostic, } from "../utils/websocket";
|
|
50
50
|
export var GENASSIST_AGENT_METADATA_UPDATED = "genassist_agent_metadata_updated";
|
|
51
51
|
var ChatService = /** @class */ (function () {
|
|
52
|
-
function ChatService(baseUrl, apiKey, metadata, tenant, language, useWs) {
|
|
52
|
+
function ChatService(baseUrl, apiKey, metadata, tenant, language, useWs, usePoll) {
|
|
53
53
|
if (useWs === void 0) { useWs = true; }
|
|
54
|
+
if (usePoll === void 0) { usePoll = false; }
|
|
54
55
|
this.conversationId = null;
|
|
55
56
|
this.conversationCreateTime = null; // Track conversation start time
|
|
56
57
|
this.guestToken = null; // Guest token for authorization
|
|
@@ -67,12 +68,14 @@ var ChatService = /** @class */ (function () {
|
|
|
67
68
|
this.thinkingConfig = { phrases: [], delayMs: 1000 };
|
|
68
69
|
this.chatInputMetadata = {};
|
|
69
70
|
this.welcomeObjectUrl = null; // to revoke on reset
|
|
71
|
+
this.usePoll = false;
|
|
70
72
|
this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
|
|
71
73
|
this.apiKey = apiKey;
|
|
72
74
|
this.metadata = metadata;
|
|
73
75
|
this.tenant = tenant;
|
|
74
76
|
this.language = language;
|
|
75
77
|
this.useWs = useWs;
|
|
78
|
+
this.usePoll = usePoll;
|
|
76
79
|
// Try to load a saved conversation for this apiKey from localStorage
|
|
77
80
|
this.loadSavedConversation();
|
|
78
81
|
}
|
|
@@ -80,6 +83,32 @@ var ChatService = /** @class */ (function () {
|
|
|
80
83
|
// Pointer to current conversation metadata for this apiKey
|
|
81
84
|
return "".concat(this.storageKeyBase, ":").concat(this.apiKey);
|
|
82
85
|
};
|
|
86
|
+
/**
|
|
87
|
+
* Handle conversation finalized: emit special message, call finalized handler, persist state.
|
|
88
|
+
*/
|
|
89
|
+
ChatService.prototype.handleConversationFinalized = function () {
|
|
90
|
+
if (this.messageHandler) {
|
|
91
|
+
var now = Date.now() / 1000;
|
|
92
|
+
var finalizedMessage = {
|
|
93
|
+
create_time: now,
|
|
94
|
+
start_time: this.conversationCreateTime
|
|
95
|
+
? now - this.conversationCreateTime
|
|
96
|
+
: 0,
|
|
97
|
+
end_time: this.conversationCreateTime
|
|
98
|
+
? now - this.conversationCreateTime + 0.01
|
|
99
|
+
: 0.01,
|
|
100
|
+
speaker: "special",
|
|
101
|
+
text: "Conversation Finalized",
|
|
102
|
+
type: "finalized",
|
|
103
|
+
};
|
|
104
|
+
this.messageHandler(finalizedMessage);
|
|
105
|
+
}
|
|
106
|
+
if (this.finalizedHandler) {
|
|
107
|
+
this.finalizedHandler();
|
|
108
|
+
}
|
|
109
|
+
this.isFinalized = true;
|
|
110
|
+
this.saveConversation();
|
|
111
|
+
};
|
|
83
112
|
/**
|
|
84
113
|
* Persist agent_chat_input_metadata to localStorage and dispatch a global event.
|
|
85
114
|
* Any consumer (e.g. config panel) can listen for GENASSIST_AGENT_METADATA_UPDATED
|
|
@@ -289,6 +318,27 @@ var ChatService = /** @class */ (function () {
|
|
|
289
318
|
error.response.data.message === "Token has expired." ||
|
|
290
319
|
(typeof error.response.data === "string" && error.response.data.includes("Token has expired"))));
|
|
291
320
|
};
|
|
321
|
+
/**
|
|
322
|
+
* Internal handler for takeover events: emits a special message and invokes takeoverHandler.
|
|
323
|
+
* Runs only once per conversation (idempotent).
|
|
324
|
+
*/
|
|
325
|
+
ChatService.prototype.handleTakeover = function (now) {
|
|
326
|
+
var t = now !== null && now !== void 0 ? now : Date.now() / 1000;
|
|
327
|
+
if (this.messageHandler) {
|
|
328
|
+
var takeoverMessage = {
|
|
329
|
+
create_time: t,
|
|
330
|
+
start_time: this.conversationCreateTime ? t - this.conversationCreateTime : 0,
|
|
331
|
+
end_time: this.conversationCreateTime ? t - this.conversationCreateTime + 0.01 : 0.01,
|
|
332
|
+
speaker: "special",
|
|
333
|
+
text: "Supervisor took over",
|
|
334
|
+
type: "takeover",
|
|
335
|
+
};
|
|
336
|
+
this.messageHandler(takeoverMessage);
|
|
337
|
+
}
|
|
338
|
+
if (this.takeoverHandler) {
|
|
339
|
+
this.takeoverHandler();
|
|
340
|
+
}
|
|
341
|
+
};
|
|
292
342
|
/**
|
|
293
343
|
* Reset the current conversation by clearing the ID and websocket
|
|
294
344
|
*/
|
|
@@ -448,6 +498,7 @@ var ChatService = /** @class */ (function () {
|
|
|
448
498
|
ChatService.prototype.sendMessage = function (message, attachments, extraMetadata, reCaptchaToken) {
|
|
449
499
|
return __awaiter(this, void 0, void 0, function () {
|
|
450
500
|
var now, chatMessage, requestBody, mergedMetadata, response, responseData, i, messageData, agentMessage, error_2, errorMessage;
|
|
501
|
+
var _this = this;
|
|
451
502
|
var _a, _b;
|
|
452
503
|
return __generator(this, function (_c) {
|
|
453
504
|
switch (_c.label) {
|
|
@@ -483,13 +534,23 @@ var ChatService = /** @class */ (function () {
|
|
|
483
534
|
}
|
|
484
535
|
return [4 /*yield*/, axios.patch("".concat(this.baseUrl, "/api/conversations/in-progress/update/").concat(this.conversationId), requestBody, {
|
|
485
536
|
headers: this.getHeaders(),
|
|
537
|
+
}).catch(function (e) {
|
|
538
|
+
var _a;
|
|
539
|
+
var err = (_a = e === null || e === void 0 ? void 0 : e.response) === null || _a === void 0 ? void 0 : _a.data;
|
|
540
|
+
// Handle error when conversation is finalized
|
|
541
|
+
if ((err === null || err === void 0 ? void 0 : err.error_key) === 'CONVERSATION_FINALIZED') {
|
|
542
|
+
_this.handleConversationFinalized();
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
throw e;
|
|
546
|
+
}
|
|
486
547
|
})];
|
|
487
548
|
case 2:
|
|
488
549
|
response = _c.sent();
|
|
489
550
|
// If not using WebSocket, try to retrieve the response message from the update conversation response
|
|
490
|
-
if (!this.useWs && this.messageHandler) {
|
|
551
|
+
if (!this.useWs && this.messageHandler && (!this.useWs || !this.usePoll)) { // usePoll is true when using heartbeat polling
|
|
491
552
|
try {
|
|
492
|
-
responseData = response.data;
|
|
553
|
+
responseData = (response === null || response === void 0 ? void 0 : response.data) || {};
|
|
493
554
|
if (responseData.messages && Array.isArray(responseData.messages)) {
|
|
494
555
|
// Look for the latest agent message in the response
|
|
495
556
|
for (i = responseData.messages.length - 1; i >= 0; i--) {
|
|
@@ -648,52 +709,10 @@ var ChatService = /** @class */ (function () {
|
|
|
648
709
|
}
|
|
649
710
|
}
|
|
650
711
|
else if (data.type === "takeover") {
|
|
651
|
-
|
|
652
|
-
// Create special message for the takeover indicator
|
|
653
|
-
if (_this.messageHandler) {
|
|
654
|
-
var now = Date.now() / 1000;
|
|
655
|
-
var takeoverMessage = {
|
|
656
|
-
create_time: now,
|
|
657
|
-
start_time: _this.conversationCreateTime
|
|
658
|
-
? now - _this.conversationCreateTime
|
|
659
|
-
: 0,
|
|
660
|
-
end_time: _this.conversationCreateTime
|
|
661
|
-
? now - _this.conversationCreateTime + 0.01
|
|
662
|
-
: 0.01,
|
|
663
|
-
speaker: "special",
|
|
664
|
-
text: "Supervisor took over",
|
|
665
|
-
};
|
|
666
|
-
_this.messageHandler(takeoverMessage);
|
|
667
|
-
}
|
|
668
|
-
// Call the takeover handler if provided
|
|
669
|
-
if (_this.takeoverHandler) {
|
|
670
|
-
_this.takeoverHandler();
|
|
671
|
-
}
|
|
712
|
+
_this.handleTakeover();
|
|
672
713
|
}
|
|
673
714
|
else if (data.type === "finalize") {
|
|
674
|
-
|
|
675
|
-
// Create special message for the finalized indicator
|
|
676
|
-
if (_this.messageHandler) {
|
|
677
|
-
var now = Date.now() / 1000;
|
|
678
|
-
var finalizedMessage = {
|
|
679
|
-
create_time: now,
|
|
680
|
-
start_time: _this.conversationCreateTime
|
|
681
|
-
? now - _this.conversationCreateTime
|
|
682
|
-
: 0,
|
|
683
|
-
end_time: _this.conversationCreateTime
|
|
684
|
-
? now - _this.conversationCreateTime + 0.01
|
|
685
|
-
: 0.01,
|
|
686
|
-
speaker: "special",
|
|
687
|
-
text: "Conversation Finalized",
|
|
688
|
-
};
|
|
689
|
-
_this.messageHandler(finalizedMessage);
|
|
690
|
-
}
|
|
691
|
-
// Call the finalized handler if provided
|
|
692
|
-
if (_this.finalizedHandler) {
|
|
693
|
-
_this.finalizedHandler();
|
|
694
|
-
}
|
|
695
|
-
_this.isFinalized = true;
|
|
696
|
-
_this.saveConversation();
|
|
715
|
+
_this.handleConversationFinalized();
|
|
697
716
|
}
|
|
698
717
|
}
|
|
699
718
|
catch (error) {
|
|
@@ -804,7 +823,86 @@ var ChatService = /** @class */ (function () {
|
|
|
804
823
|
}
|
|
805
824
|
return __assign(__assign({}, message), { start_time: message.start_time - this.conversationCreateTime, end_time: message.end_time - this.conversationCreateTime });
|
|
806
825
|
};
|
|
826
|
+
/************ Heartbeat polling ************/
|
|
827
|
+
/**
|
|
828
|
+
* Poll in-progress conversation (heartbeat when WebSocket is disabled).
|
|
829
|
+
* Returns status and messages normalized to ChatMessage[].
|
|
830
|
+
*/
|
|
831
|
+
ChatService.prototype.pollInProgressConversation = function () {
|
|
832
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
833
|
+
var response, pollMessages;
|
|
834
|
+
var _this = this;
|
|
835
|
+
return __generator(this, function (_a) {
|
|
836
|
+
switch (_a.label) {
|
|
837
|
+
case 0:
|
|
838
|
+
if (!this.conversationId || !this.conversationCreateTime) {
|
|
839
|
+
throw new Error("Conversation not started");
|
|
840
|
+
}
|
|
841
|
+
return [4 /*yield*/, axios.get("".concat(this.baseUrl, "/api/conversations/in-progress/poll/").concat(this.conversationId), { headers: this.getHeaders() })];
|
|
842
|
+
case 1:
|
|
843
|
+
response = _a.sent();
|
|
844
|
+
pollMessages = (response.data.messages || []).map(function (m) {
|
|
845
|
+
return _this.normalizePollMessageToChatMessage(m);
|
|
846
|
+
});
|
|
847
|
+
return [2 /*return*/, { status: response.data.status, pollMessages: pollMessages }];
|
|
848
|
+
}
|
|
849
|
+
});
|
|
850
|
+
});
|
|
851
|
+
};
|
|
852
|
+
ChatService.prototype.normalizePollMessageToChatMessage = function (m) {
|
|
853
|
+
var createTime = typeof m.create_time === "number"
|
|
854
|
+
? m.create_time
|
|
855
|
+
: m.create_time
|
|
856
|
+
? +new Date(m.create_time)
|
|
857
|
+
: Math.floor(Date.now() / 1000);
|
|
858
|
+
// Normalize to seconds: ISO string gives ms (>1e12); if so convert. Otherwise assume already seconds.
|
|
859
|
+
if (createTime >= 1e12) {
|
|
860
|
+
createTime = Math.round(createTime / 1000);
|
|
861
|
+
}
|
|
862
|
+
var startTime = this.conversationCreateTime != null
|
|
863
|
+
? createTime - this.conversationCreateTime
|
|
864
|
+
: m.start_time;
|
|
865
|
+
var endTime = this.conversationCreateTime != null
|
|
866
|
+
? startTime + (m.end_time - m.start_time) || 0.01
|
|
867
|
+
: m.end_time;
|
|
868
|
+
return {
|
|
869
|
+
id: m.id,
|
|
870
|
+
create_time: createTime,
|
|
871
|
+
start_time: startTime,
|
|
872
|
+
end_time: endTime,
|
|
873
|
+
speaker: m.speaker,
|
|
874
|
+
text: m.text,
|
|
875
|
+
type: m.type,
|
|
876
|
+
feedback: m.feedback,
|
|
877
|
+
};
|
|
878
|
+
};
|
|
879
|
+
ChatService.prototype.notifyTakeoverFromPoll = function () {
|
|
880
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
881
|
+
return __generator(this, function (_a) {
|
|
882
|
+
// Poll already adds the "Supervisor took over" message from the message list.
|
|
883
|
+
// Only run the handler so UI state updates; do not call handleTakeover() or we duplicate the message.
|
|
884
|
+
if (this.takeoverHandler) {
|
|
885
|
+
this.takeoverHandler();
|
|
886
|
+
}
|
|
887
|
+
return [2 /*return*/];
|
|
888
|
+
});
|
|
889
|
+
});
|
|
890
|
+
};
|
|
891
|
+
ChatService.prototype.notifyFinalizedFromPoll = function () {
|
|
892
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
893
|
+
return __generator(this, function (_a) {
|
|
894
|
+
// Poll already adds the "Conversation Finalized" message from the message list.
|
|
895
|
+
// Only update state and run the handler; do not call handleConversationFinalized() or we duplicate the message.
|
|
896
|
+
if (this.finalizedHandler) {
|
|
897
|
+
this.finalizedHandler();
|
|
898
|
+
}
|
|
899
|
+
this.isFinalized = true;
|
|
900
|
+
this.saveConversation();
|
|
901
|
+
return [2 /*return*/];
|
|
902
|
+
});
|
|
903
|
+
});
|
|
904
|
+
};
|
|
807
905
|
return ChatService;
|
|
808
906
|
}());
|
|
809
907
|
export { ChatService };
|
|
810
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdFNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvY2hhdFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFTMUIsT0FBTyxFQUNMLGVBQWUsRUFDZix5QkFBeUIsR0FDMUIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixNQUFNLENBQUMsSUFBTSxnQ0FBZ0MsR0FBRyxrQ0FBa0MsQ0FBQztBQUVuRjtJQThCRSxxQkFDRSxPQUFlLEVBQ2YsTUFBYyxFQUNkLFFBQThCLEVBQzlCLE1BQWUsRUFDZixRQUFpQixFQUNqQixLQUFxQjtRQUFyQixzQkFBQSxFQUFBLFlBQXFCO1FBaENmLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUNyQywyQkFBc0IsR0FBa0IsSUFBSSxDQUFDLENBQUMsZ0NBQWdDO1FBQzlFLGVBQVUsR0FBa0IsSUFBSSxDQUFDLENBQUMsZ0NBQWdDO1FBQ2xFLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLGNBQVMsR0FBcUIsSUFBSSxDQUFDO1FBQ25DLG1CQUFjLEdBQTRDLElBQUksQ0FBQztRQUMvRCxvQkFBZSxHQUF3QixJQUFJLENBQUM7UUFDNUMscUJBQWdCLEdBQXdCLElBQUksQ0FBQztRQUM3QywyQkFBc0IsR0FFbkIsSUFBSSxDQUFDO1FBQ1IsdUJBQWtCLEdBQThDLElBQUksQ0FBQztRQUNyRSxtQkFBYyxHQUFHLHdCQUF3QixDQUFDO1FBQzFDLG9CQUFlLEdBQWEsRUFBRSxDQUFDO1FBQy9CLGdCQUFXLEdBQXFCLEVBQUUsQ0FBQztRQUNuQyxtQkFBYyxHQUF3QixFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3JFLHNCQUFpQixHQUE0QixFQUFFLENBQUM7UUFDaEQscUJBQWdC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T0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDcEMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7d0JBQy9CLENBQUM7d0JBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRTs0QkFDekMsT0FBTyxFQUFFLE9BQUssQ0FBQyxPQUFPOzRCQUN0QixRQUFRLEVBQUUsTUFBQSxPQUFLLENBQUMsUUFBUSwwQ0FBRSxJQUFJOzRCQUM5QixNQUFNLEVBQUUsTUFBQSxPQUFLLENBQUMsUUFBUSwwQ0FBRSxNQUFNO3lCQUMvQixDQUFDLENBQUM7d0JBQ0gsTUFBTSxPQUFLLENBQUM7Ozs7O0tBRWY7SUFFRCw0RUFBNEU7SUFDcEUsNkNBQXVCLEdBQS9CLFVBQWdDLE9BQW9CO1FBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNqQyxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBRUQsNkJBQ0ssT0FBTyxLQUNWLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFDNUQsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixJQUN4RDtJQUNKLENBQUM7SUFDSCxrQkFBQztBQUFELENBQUMsQUExMkJELElBMDJCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCB7XG4gIENoYXRNZXNzYWdlLFxuICBTdGFydENvbnZlcnNhdGlvblJlc3BvbnNlLFxuICBBdHRhY2htZW50LFxuICBBZ2VudFRoaW5raW5nQ29uZmlnLFxuICBBZ2VudFdlbGNvbWVEYXRhLFxuICBGaWxlVXBsb2FkUmVzcG9uc2UsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgY3JlYXRlV2ViU29ja2V0LFxuICBjcmVhdGVXZWJTb2NrZXREaWFnbm9zdGljLFxufSBmcm9tIFwiLi4vdXRpbHMvd2Vic29ja2V0XCI7XG5leHBvcnQgY29uc3QgR0VOQVNTSVNUX0FHRU5UX01FVEFEQVRBX1VQREFURUQgPSBcImdlbmFzc2lzdF9hZ2VudF9tZXRhZGF0YV91cGRhdGVkXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGF0U2VydmljZSB7XG4gIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICBwcml2YXRlIGFwaUtleTogc3RyaW5nO1xuICBwcml2YXRlIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb252ZXJzYXRpb25DcmVhdGVUaW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgY29udmVyc2F0aW9uIHN0YXJ0IHRpbWVcbiAgcHJpdmF0ZSBndWVzdFRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gR3Vlc3QgdG9rZW4gZm9yIGF1dGhvcml6YXRpb25cbiAgcHJpdmF0ZSBpc0ZpbmFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHdlYlNvY2tldDogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZUhhbmRsZXI6ICgobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdGFrZW92ZXJIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmaW5hbGl6ZWRIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uU3RhdGVIYW5kbGVyOlxuICAgIHwgKChzdGF0ZTogXCJjb25uZWN0aW5nXCIgfCBcImNvbm5lY3RlZFwiIHwgXCJkaXNjb25uZWN0ZWRcIikgPT4gdm9pZClcbiAgICB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHdlbGNvbWVEYXRhSGFuZGxlcjogKChkYXRhOiBBZ2VudFdlbGNvbWVEYXRhKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0b3JhZ2VLZXlCYXNlID0gXCJnZW5hc3Npc3RfY29udmVyc2F0aW9uXCI7XG4gIHByaXZhdGUgcG9zc2libGVRdWVyaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIHdlbGNvbWVEYXRhOiBBZ2VudFdlbGNvbWVEYXRhID0ge307XG4gIHByaXZhdGUgdGhpbmtpbmdDb25maWc6IEFnZW50VGhpbmtpbmdDb25maWcgPSB7IHBocmFzZXM6IFtdLCBkZWxheU1zOiAxMDAwIH07XG4gIHByaXZhdGUgY2hhdElucHV0TWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIHByaXZhdGUgd2VsY29tZU9iamVjdFVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIHRvIHJldm9rZSBvbiByZXNldFxuICBwcml2YXRlIHRlbmFudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGFnZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBsYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHVzZVdzOiBib29sZWFuO1xuICBwcml2YXRlIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYmFzZVVybDogc3RyaW5nLFxuICAgIGFwaUtleTogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICB0ZW5hbnQ/OiBzdHJpbmcsXG4gICAgbGFuZ3VhZ2U/OiBzdHJpbmcsXG4gICAgdXNlV3M6IGJvb2xlYW4gPSB0cnVlXG4gICkge1xuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmwuZW5kc1dpdGgoXCIvXCIpID8gYmFzZVVybC5zbGljZSgwLCAtMSkgOiBiYXNlVXJsO1xuICAgIHRoaXMuYXBpS2V5ID0gYXBpS2V5O1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICB0aGlzLnRlbmFudCA9IHRlbmFudDtcbiAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgdGhpcy51c2VXcyA9IHVzZVdzO1xuICAgIC8vIFRyeSB0byBsb2FkIGEgc2F2ZWQgY29udmVyc2F0aW9uIGZvciB0aGlzIGFwaUtleSBmcm9tIGxvY2FsU3RvcmFnZVxuICAgIHRoaXMubG9hZFNhdmVkQ29udmVyc2F0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFN0b3JhZ2VLZXkoKTogc3RyaW5nIHtcbiAgICAvLyBQb2ludGVyIHRvIGN1cnJlbnQgY29udmVyc2F0aW9uIG1ldGFkYXRhIGZvciB0aGlzIGFwaUtleVxuICAgIHJldHVybiBgJHt0aGlzLnN0b3JhZ2VLZXlCYXNlfToke3RoaXMuYXBpS2V5fWA7XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdCBhZ2VudF9jaGF0X2lucHV0X21ldGFkYXRhIHRvIGxvY2FsU3RvcmFnZSBhbmQgZGlzcGF0Y2ggYSBnbG9iYWwgZXZlbnQuXG4gICAqIEFueSBjb25zdW1lciAoZS5nLiBjb25maWcgcGFuZWwpIGNhbiBsaXN0ZW4gZm9yIEdFTkFTU0lTVF9BR0VOVF9NRVRBREFUQV9VUERBVEVEXG4gICAqIG9yIHJlYWQgZnJvbSBsb2NhbFN0b3JhZ2Ugb24gbW91bnQ7IG5vIG5lZWQgdG8gcGFzcyBjYWxsYmFja3MgaW50byB0aGUgY2hhdC5cbiAgICovXG4gIHByaXZhdGUgcGVyc2lzdEFuZEVtaXRBZ2VudE1ldGFkYXRhKG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBrZXkgPSBgZ2VuYXNzaXN0X2FnZW50X2NoYXRfaW5wdXRfbWV0YWRhdGE6JHt0aGlzLmFwaUtleX1gO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShtZXRhZGF0YSkpO1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KEdFTkFTU0lTVF9BR0VOVF9NRVRBREFUQV9VUERBVEVELCB7XG4gICAgICAgICAgICBkZXRhaWw6IHsgYXBpS2V5OiB0aGlzLmFwaUtleSwgbWV0YWRhdGE6IHsgLi4ubWV0YWRhdGEgfSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBsYW5ndWFnZSBmb3IgQWNjZXB0LUxhbmd1YWdlIGhlYWRlclxuICAgKi9cbiAgc2V0TGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbWV0YWRhdGEgKHVzZWZ1bCBmb3IgdXBkYXRpbmcgbGFuZ3VhZ2Ugb3Igb3RoZXIgZHluYW1pYyBtZXRhZGF0YSlcbiAgICovXG4gIHNldE1ldGFkYXRhKG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBsYW5ndWFnZSBjb2RlIGZvciBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyXG4gICAqIENvbnZlcnRzIHNpbXBsZSBsYW5ndWFnZSBjb2RlcyAoZS5nLiwgXCJlblwiLCBcImVzXCIpIHRvIHByb3BlciBmb3JtYXQgKGUuZy4sIFwiZW4tVVMsZW47cT0wLjlcIilcbiAgICogRm9sbG93cyBIVFRQIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXIgc3RhbmRhcmRzXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdEFjY2VwdExhbmd1YWdlKGxhbmdDb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbGFuZ0NvZGUpIHJldHVybiAnJztcbiAgICBcbiAgICAvLyBOb3JtYWxpemUgbGFuZ3VhZ2UgY29kZSAobG93ZXJjYXNlLCBoYW5kbGUgY29tbW9uIGZvcm1hdHMpXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IGxhbmdDb2RlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIFxuICAgIC8vIE1hcCBjb21tb24gbGFuZ3VhZ2UgY29kZXMgdG8gdGhlaXIgZnVsbCBsb2NhbGUgZm9ybWF0XG4gICAgY29uc3QgbGFuZ3VhZ2VNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnZW4nOiAnZW4tVVMnLFxuICAgICAgJ2VzJzogJ2VzLUVTJyxcbiAgICAgICdmcic6ICdmci1GUicsXG4gICAgICAnZGUnOiAnZGUtREUnLFxuICAgICAgJ2l0JzogJ2l0LUlUJyxcbiAgICAgICdwdCc6ICdwdC1QVCcsXG4gICAgICAnYXInOiAnYXItU0EnLFxuICAgICAgJ3NxJzogJ3NxLUFMJyxcbiAgICB9O1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHRoZSBjb2RlIGFscmVhZHkgaGFzIGEgcmVnaW9uIChlLmcuLCBcImVuLVVTXCIsIFwiZXMtRVNcIilcbiAgICBjb25zdCBoYXNSZWdpb24gPSBub3JtYWxpemVkLmluY2x1ZGVzKCctJyk7XG4gICAgXG4gICAgLy8gR2V0IHRoZSBmdWxsIGxvY2FsZSBvciB1c2UgdGhlIHByb3ZpZGVkIGNvZGUgaWYgaXQgYWxyZWFkeSBoYXMgYSByZWdpb25cbiAgICBjb25zdCBmdWxsTG9jYWxlID0gaGFzUmVnaW9uID8gbm9ybWFsaXplZCA6IChsYW5ndWFnZU1hcFtub3JtYWxpemVkXSB8fCBub3JtYWxpemVkKTtcbiAgICBcbiAgICAvLyBFeHRyYWN0IGJhc2UgbGFuZ3VhZ2UgZnJvbSB0aGUgZnVsbCBsb2NhbGUgKGUuZy4sIFwiZW5cIiBmcm9tIFwiZW4tVVNcIilcbiAgICBjb25zdCBmdWxsQmFzZUxhbmcgPSBmdWxsTG9jYWxlLnNwbGl0KCctJylbMF0udG9Mb3dlckNhc2UoKTtcbiAgICBcbiAgICAvLyBCdWlsZCBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyOiBwcmltYXJ5IGxvY2FsZSwgYmFzZSBsYW5ndWFnZSB3aXRoIHF1YWxpdHksIEVuZ2xpc2ggZmFsbGJhY2tcbiAgICAvLyBGb3JtYXQ6IFwibG9jYWxlLGJhc2UtbGFuZztxPTAuOSxlbjtxPTAuOFwiXG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW2Z1bGxMb2NhbGVdO1xuICAgIFxuICAgIC8vIGZhbGxiYWNrXG4gICAgcGFydHMucHVzaChgJHtmdWxsQmFzZUxhbmd9O3E9MC45YCk7XG4gICAgXG4gICAgLy8gQWRkIEVuZ2xpc2ggYXMgZmFsbGJhY2sgaWYgbm90IGFscmVhZHkgdGhlIHByaW1hcnkgbGFuZ3VhZ2VcbiAgICBpZiAoZnVsbEJhc2VMYW5nICE9PSAnZW4nKSB7XG4gICAgICBwYXJ0cy5wdXNoKCdlbjtxPTAuOCcpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcGFydHMuam9pbignLCAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaGVhZGVycyBmb3IgQVBJIHJlcXVlc3RzLCBpbmNsdWRpbmcgYXV0aG9yaXphdGlvbiBpZiBndWVzdCB0b2tlbiBpcyBhdmFpbGFibGVcbiAgICovXG4gIHByaXZhdGUgZ2V0SGVhZGVycyhjb250ZW50VHlwZTogc3RyaW5nID0gXCJhcHBsaWNhdGlvbi9qc29uXCIpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgXCJ4LWFwaS1rZXlcIjogdGhpcy5hcGlLZXksXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBjb250ZW50VHlwZSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHRlbmFudCBoZWFkZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy50ZW5hbnQpIHtcbiAgICAgIGhlYWRlcnNbXCJ4LXRlbmFudC1pZFwiXSA9IHRoaXMudGVuYW50O1xuICAgIH1cblxuICAgIC8vIEFkZCBhdXRob3JpemF0aW9uIGhlYWRlciBpZiBndWVzdCB0b2tlbiBpcyBhdmFpbGFibGVcbiAgICBpZiAodGhpcy5ndWVzdFRva2VuKSB7XG4gICAgICBoZWFkZXJzW1wiQXV0aG9yaXphdGlvblwiXSA9IGBCZWFyZXIgJHt0aGlzLmd1ZXN0VG9rZW59YDtcbiAgICB9XG5cbiAgICAvLyBBZGQgQWNjZXB0LUxhbmd1YWdlIGhlYWRlciBpZiBsYW5ndWFnZSBpcyBzZXRcbiAgICBpZiAodGhpcy5sYW5ndWFnZSkge1xuICAgICAgY29uc3QgYWNjZXB0TGFuZ3VhZ2UgPSB0aGlzLmZvcm1hdEFjY2VwdExhbmd1YWdlKHRoaXMubGFuZ3VhZ2UpO1xuICAgICAgaWYgKGFjY2VwdExhbmd1YWdlKSB7XG4gICAgICAgIGhlYWRlcnNbXCJBY2NlcHQtTGFuZ3VhZ2VcIl0gPSBhY2NlcHRMYW5ndWFnZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuXG4gIHNldE1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI6IChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgc2V0VGFrZW92ZXJIYW5kbGVyKGhhbmRsZXI6ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLnRha2VvdmVySGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBzZXRGaW5hbGl6ZWRIYW5kbGVyKGhhbmRsZXI6ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLmZpbmFsaXplZEhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgc2V0Q29ubmVjdGlvblN0YXRlSGFuZGxlcihcbiAgICBoYW5kbGVyOiAoc3RhdGU6IFwiY29ubmVjdGluZ1wiIHwgXCJjb25uZWN0ZWRcIiB8IFwiZGlzY29ubmVjdGVkXCIpID0+IHZvaWRcbiAgKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHNldFdlbGNvbWVEYXRhSGFuZGxlcihoYW5kbGVyOiAoKGRhdGE6IEFnZW50V2VsY29tZURhdGEpID0+IHZvaWQpIHwgbnVsbCkge1xuICAgIHRoaXMud2VsY29tZURhdGFIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHNldFNlcnZlclVuYXZhaWxhYmxlQ29uZmlnKFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcsXG4gICAgY29udGFjdFVybD86IHN0cmluZyxcbiAgICBjb250YWN0TGFiZWw/OiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsID0gY29udGFjdFVybDtcbiAgICB0aGlzLnNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsID0gY29udGFjdExhYmVsO1xuICB9XG5cbiAgZ2V0UG9zc2libGVRdWVyaWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wb3NzaWJsZVF1ZXJpZXM7XG4gIH1cblxuICBnZXRXZWxjb21lRGF0YSgpOiBBZ2VudFdlbGNvbWVEYXRhIHtcbiAgICByZXR1cm4gdGhpcy53ZWxjb21lRGF0YTtcbiAgfVxuXG4gIGdldFRoaW5raW5nQ29uZmlnKCk6IEFnZW50VGhpbmtpbmdDb25maWcge1xuICAgIHJldHVybiB0aGlzLnRoaW5raW5nQ29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGFkYXRhIGtleXMvZGVmYXVsdHMgZnJvbSB0aGUgd29ya2Zsb3cncyBDaGF0IElucHV0IG5vZGUgKHJldHVybmVkIHdoZW4gY29udmVyc2F0aW9uIHN0YXJ0cykuXG4gICAqIFVzZWQgdG8gc2hvdyB3b3JrZmxvdy1kZWZpbmVkIG1ldGFkYXRhIGluIHRoZSBjb25maWcgcGFuZWwuXG4gICAqL1xuICBnZXRDaGF0SW5wdXRNZXRhZGF0YSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5jaGF0SW5wdXRNZXRhZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBzYXZlZCBjb252ZXJzYXRpb24gSUQgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICovXG4gIHByaXZhdGUgbG9hZFNhdmVkQ29udmVyc2F0aW9uKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBsZXQgc2F2ZWRDb252ZXJzYXRpb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmdldFN0b3JhZ2VLZXkoKSk7XG4gICAgICAvLyBCYWNrd2FyZC1jb21wYXQ6IGNoZWNrIG9sZCB1bnNjb3BlZCBrZXkgaWYgc2NvcGVkIG9uZSBtaXNzaW5nXG4gICAgICBpZiAoIXNhdmVkQ29udmVyc2F0aW9uKSB7XG4gICAgICAgIHNhdmVkQ29udmVyc2F0aW9uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlS2V5QmFzZSk7XG4gICAgICB9XG4gICAgICBpZiAoc2F2ZWRDb252ZXJzYXRpb24pIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgIGNyZWF0ZVRpbWUsXG4gICAgICAgICAgaXNGaW5hbGl6ZWQsXG4gICAgICAgICAgcG9zc2libGVRdWVyaWVzLFxuICAgICAgICAgIHdlbGNvbWVEYXRhLFxuICAgICAgICAgIHRoaW5raW5nQ29uZmlnLFxuICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgZ3Vlc3RUb2tlbixcbiAgICAgICAgfSA9IEpTT04ucGFyc2Uoc2F2ZWRDb252ZXJzYXRpb24pO1xuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSA9IGNyZWF0ZVRpbWU7XG4gICAgICAgIHRoaXMuaXNGaW5hbGl6ZWQgPSBpc0ZpbmFsaXplZCB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5ndWVzdFRva2VuID0gZ3Vlc3RUb2tlbiB8fCBudWxsO1xuICAgICAgICB0aGlzLnBvc3NpYmxlUXVlcmllcyA9IEFycmF5LmlzQXJyYXkocG9zc2libGVRdWVyaWVzKVxuICAgICAgICAgID8gcG9zc2libGVRdWVyaWVzXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgdGhpcy53ZWxjb21lRGF0YSA9IHdlbGNvbWVEYXRhIHx8IHt9O1xuICAgICAgICBpZiAoIXRoaXMud2VsY29tZURhdGEucG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgICAgdGhpcy53ZWxjb21lRGF0YS5wb3NzaWJsZVF1ZXJpZXMgPSB0aGlzLnBvc3NpYmxlUXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRoaW5raW5nQ29uZmlnID0ge1xuICAgICAgICAgIHBocmFzZXM6ICh0aGlua2luZ0NvbmZpZyAmJiB0aGlua2luZ0NvbmZpZy5waHJhc2VzKSB8fCBbXSxcbiAgICAgICAgICBkZWxheU1zOlxuICAgICAgICAgICAgdGhpbmtpbmdDb25maWcgJiYgdHlwZW9mIHRoaW5raW5nQ29uZmlnLmRlbGF5TXMgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgPyB0aGlua2luZ0NvbmZpZy5kZWxheU1zXG4gICAgICAgICAgICAgIDogMTAwMCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hZ2VudElkID0gYWdlbnRJZDtcbiAgICAgICAgaWYgKCF0aGlzLndlbGNvbWVEYXRhLmltYWdlVXJsICYmIHRoaXMuYWdlbnRJZCkge1xuICAgICAgICAgIHRoaXMuZmV0Y2hXZWxjb21lSW1hZ2UodGhpcy5hZ2VudElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53ZWxjb21lRGF0YUhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLndlbGNvbWVEYXRhSGFuZGxlcih0aGlzLndlbGNvbWVEYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0aGUgY3VycmVudCBjb252ZXJzYXRpb24gSUQgdG8gbG9jYWxTdG9yYWdlXG4gICAqL1xuICBwcml2YXRlIHNhdmVDb252ZXJzYXRpb24oKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbklkICYmIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSkge1xuICAgICAgICBjb25zdCBjb252ZXJzYXRpb25EYXRhID0ge1xuICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgIGNyZWF0ZVRpbWU6IHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSxcbiAgICAgICAgICBpc0ZpbmFsaXplZDogdGhpcy5pc0ZpbmFsaXplZCxcbiAgICAgICAgICBwb3NzaWJsZVF1ZXJpZXM6IHRoaXMucG9zc2libGVRdWVyaWVzLFxuICAgICAgICAgIHdlbGNvbWVEYXRhOiB7XG4gICAgICAgICAgICAuLi50aGlzLndlbGNvbWVEYXRhLFxuICAgICAgICAgICAgaW1hZ2VVcmw6XG4gICAgICAgICAgICAgIHRoaXMud2VsY29tZU9iamVjdFVybCAmJlxuICAgICAgICAgICAgICB0aGlzLndlbGNvbWVEYXRhLmltYWdlVXJsICYmXG4gICAgICAgICAgICAgIHRoaXMud2VsY29tZURhdGEuaW1hZ2VVcmwuc3RhcnRzV2l0aChcImJsb2I6XCIpXG4gICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgOiB0aGlzLndlbGNvbWVEYXRhLmltYWdlVXJsIHx8IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlua2luZ0NvbmZpZzogdGhpcy50aGlua2luZ0NvbmZpZyxcbiAgICAgICAgICBhZ2VudElkOiB0aGlzLmFnZW50SWQsXG4gICAgICAgICAgZ3Vlc3RUb2tlbjogdGhpcy5ndWVzdFRva2VuLFxuICAgICAgICB9O1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmdldFN0b3JhZ2VLZXkoKSwgSlNPTi5zdHJpbmdpZnkoY29udmVyc2F0aW9uRGF0YSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpZiBhbiBlcnJvciBpcyBhIHRva2VuIGV4cGlyYXRpb24gZXJyb3JcbiAgcHJpdmF0ZSBpc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZXJyb3IucmVzcG9uc2UgJiZcbiAgICAgIGVycm9yLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxICYmXG4gICAgICBlcnJvci5yZXNwb25zZS5kYXRhICYmXG4gICAgICAoZXJyb3IucmVzcG9uc2UuZGF0YS5lcnJvciA9PT0gXCJUb2tlbiBoYXMgZXhwaXJlZC5cIiB8fFxuICAgICAgICBlcnJvci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgPT09IFwiVG9rZW4gaGFzIGV4cGlyZWQuXCIgfHxcbiAgICAgICAgKHR5cGVvZiBlcnJvci5yZXNwb25zZS5kYXRhID09PSBcInN0cmluZ1wiICYmIGVycm9yLnJlc3BvbnNlLmRhdGEuaW5jbHVkZXMoXCJUb2tlbiBoYXMgZXhwaXJlZFwiKSkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgY3VycmVudCBjb252ZXJzYXRpb24gYnkgY2xlYXJpbmcgdGhlIElEIGFuZCB3ZWJzb2NrZXRcbiAgICovXG4gIHJlc2V0Q2hhdENvbnZlcnNhdGlvbigpOiB2b2lkIHtcbiAgICAvLyBDbG9zZSB0aGUgY3VycmVudCB3ZWJzb2NrZXQgY29ubmVjdGlvbiBpZiBpdCBleGlzdHNcbiAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcbiAgICAgIHRoaXMud2ViU29ja2V0LmNsb3NlKCk7XG4gICAgICB0aGlzLndlYlNvY2tldCA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgdGhlIGNvbnZlcnNhdGlvbiBJRFxuICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBudWxsO1xuICAgIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSA9IG51bGw7XG4gICAgdGhpcy5ndWVzdFRva2VuID0gbnVsbDtcbiAgICB0aGlzLmlzRmluYWxpemVkID0gZmFsc2U7XG5cbiAgICAvLyBDbGVhciBwb3NzaWJsZSBxdWVyaWVzIGFuZCB3b3JrZmxvdyBtZXRhZGF0YVxuICAgIHRoaXMucG9zc2libGVRdWVyaWVzID0gW107XG4gICAgdGhpcy53ZWxjb21lRGF0YSA9IHt9O1xuICAgIHRoaXMudGhpbmtpbmdDb25maWcgPSB7IHBocmFzZXM6IFtdLCBkZWxheU1zOiAxMDAwIH07XG4gICAgdGhpcy5jaGF0SW5wdXRNZXRhZGF0YSA9IHt9O1xuICAgIGlmICh0aGlzLndlbGNvbWVPYmplY3RVcmwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy53ZWxjb21lT2JqZWN0VXJsKTtcbiAgICAgIH0gY2F0Y2gge31cbiAgICAgIHRoaXMud2VsY29tZU9iamVjdFVybCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuYWdlbnRJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIFJlbW92ZSBmcm9tIGxvY2FsIHN0b3JhZ2VcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5nZXRTdG9yYWdlS2V5KCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlcmUncyBhIGN1cnJlbnQgY29udmVyc2F0aW9uXG4gICAqL1xuICBoYXNBY3RpdmVDb252ZXJzYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb252ZXJzYXRpb25JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgY29udmVyc2F0aW9uIElEXG4gICAqL1xuICBnZXRDb252ZXJzYXRpb25JZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jb252ZXJzYXRpb25JZDtcbiAgfVxuXG4gIGdldENvbnZlcnNhdGlvbkNyZWF0ZVRpbWUoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZTtcbiAgfVxuXG4gIGlzQ29udmVyc2F0aW9uRmluYWxpemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRmluYWxpemVkO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW4/OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0Qm9keTogYW55ID0ge1xuICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICAgIHJlY29yZGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGRhdGFfc291cmNlX2lkOiBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgICAgfTtcblxuICAgICAgaWYgKHJlQ2FwdGNoYVRva2VuKSB7XG4gICAgICAgIHJlcXVlc3RCb2R5LnJlY2FwdGNoYV90b2tlbiA9IHJlQ2FwdGNoYVRva2VuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tZXRhZGF0YSkge1xuICAgICAgICByZXF1ZXN0Qm9keS5tZXRhZGF0YSA9IHRoaXMubWV0YWRhdGE7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdDxTdGFydENvbnZlcnNhdGlvblJlc3BvbnNlPihcbiAgICAgICAgYCR7dGhpcy5iYXNlVXJsfS9hcGkvY29udmVyc2F0aW9ucy9pbi1wcm9ncmVzcy9zdGFydGAsXG4gICAgICAgIHJlcXVlc3RCb2R5LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSByZXNwb25zZS5kYXRhLmNvbnZlcnNhdGlvbl9pZDtcbiAgICAgIC8vIFN0b3JlIGNvbnZlcnNhdGlvbiBjcmVhdGUgdGltZSAodXNlIGZyb20gcmVzcG9uc2UgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY3VycmVudCB0aW1lKVxuICAgICAgdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lID0gcmVzcG9uc2UuZGF0YS5jcmVhdGVfdGltZVxuICAgICAgICA/IHJlc3BvbnNlLmRhdGEuY3JlYXRlX3RpbWUgLyAxMDAwXG4gICAgICAgIDogRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgICAvLyBTdG9yZSBndWVzdCB0b2tlbiBpZiBwcm92aWRlZFxuICAgICAgdGhpcy5ndWVzdFRva2VuID0gcmVzcG9uc2UuZGF0YS5ndWVzdF90b2tlbiB8fCBudWxsO1xuICAgICAgdGhpcy5pc0ZpbmFsaXplZCA9IGZhbHNlO1xuXG4gICAgICAvLyBTdG9yZSBwb3NzaWJsZSBxdWVyaWVzIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKFxuICAgICAgICByZXNwb25zZS5kYXRhLmFnZW50X3Bvc3NpYmxlX3F1ZXJpZXMgJiZcbiAgICAgICAgcmVzcG9uc2UuZGF0YS5hZ2VudF9wb3NzaWJsZV9xdWVyaWVzLmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICB0aGlzLnBvc3NpYmxlUXVlcmllcyA9IHJlc3BvbnNlLmRhdGEuYWdlbnRfcG9zc2libGVfcXVlcmllcy5maWx0ZXIoXG4gICAgICAgICAgKHF1ZXJ5KSA9PiB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgJiYgcXVlcnkudHJpbSgpLmxlbmd0aCA+IDBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYW55RGF0YTogYW55ID0gcmVzcG9uc2UuZGF0YSBhcyBhbnk7XG4gICAgICBjb25zdCBhZ2VudElkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBhbnlEYXRhLmFnZW50X2lkO1xuICAgICAgdGhpcy5hZ2VudElkID0gYWdlbnRJZDtcbiAgICAgIGNvbnN0IHJhd01ldGEgPSBhbnlEYXRhLmFnZW50X2NoYXRfaW5wdXRfbWV0YWRhdGE7XG4gICAgICBpZiAoXG4gICAgICAgIHJhd01ldGEgIT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgcmF3TWV0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkocmF3TWV0YSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNoYXRJbnB1dE1ldGFkYXRhID0geyAuLi5yYXdNZXRhIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoYXRJbnB1dE1ldGFkYXRhID0ge307XG4gICAgICB9XG4gICAgICB0aGlzLnBlcnNpc3RBbmRFbWl0QWdlbnRNZXRhZGF0YSh0aGlzLmNoYXRJbnB1dE1ldGFkYXRhKTtcbiAgICAgIGNvbnN0IHdlbGNvbWVUaXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gYW55RGF0YS5hZ2VudF93ZWxjb21lX3RpdGxlO1xuICAgICAgY29uc3Qgd2VsY29tZUltYWdlVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgICBhbnlEYXRhLmFnZW50X3dlbGNvbWVfaW1hZ2VfdXJsO1xuICAgICAgY29uc3QgdGhpbmtpbmdQaHJhc2VzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIGFueURhdGEuYWdlbnRfdGhpbmtpbmdfcGhyYXNlcztcbiAgICAgIGNvbnN0IHRoaW5raW5nRGVsYXlTZWM6IG51bWJlciB8IHVuZGVmaW5lZCA9XG4gICAgICAgIGFueURhdGEuYWdlbnRfdGhpbmtpbmdfcGhyYXNlX2RlbGF5O1xuXG4gICAgICB0aGlzLndlbGNvbWVEYXRhID0ge1xuICAgICAgICB0aXRsZTogd2VsY29tZVRpdGxlIHx8IG51bGwsXG4gICAgICAgIG1lc3NhZ2U6IG51bGwsXG4gICAgICAgIGltYWdlVXJsOiB3ZWxjb21lSW1hZ2VVcmwgfHwgbnVsbCxcbiAgICAgICAgcG9zc2libGVRdWVyaWVzOiB0aGlzLnBvc3NpYmxlUXVlcmllcyxcbiAgICAgIH07XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaW5raW5nUGhyYXNlcykgJiYgdGhpbmtpbmdQaHJhc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50aGlua2luZ0NvbmZpZy5waHJhc2VzID0gdGhpbmtpbmdQaHJhc2VzO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0aGlua2luZ0RlbGF5U2VjID09PSBcIm51bWJlclwiICYmIHRoaW5raW5nRGVsYXlTZWMgPj0gMCkge1xuICAgICAgICB0aGlzLnRoaW5raW5nQ29uZmlnLmRlbGF5TXMgPSBNYXRoLm1heChcbiAgICAgICAgICAyNTAsXG4gICAgICAgICAgTWF0aC5yb3VuZCh0aGlua2luZ0RlbGF5U2VjICogMTAwMClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLndlbGNvbWVEYXRhLmltYWdlVXJsICYmIGFnZW50SWQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaFdlbGNvbWVJbWFnZShhZ2VudElkKTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2VzcyBhZ2VudCB3ZWxjb21lIG1lc3NhZ2UgaWYgYXZhaWxhYmxlXG4gICAgICBpZiAocmVzcG9uc2UuZGF0YS5hZ2VudF93ZWxjb21lX21lc3NhZ2UgJiYgdGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICAgICAgY29uc3Qgd2VsY29tZU1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAgIGNyZWF0ZV90aW1lOiBub3csXG4gICAgICAgICAgc3RhcnRfdGltZTogbm93IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lLCAvLyBSZWxhdGl2ZSB0byBjb252ZXJzYXRpb24gc3RhcnRcbiAgICAgICAgICBlbmRfdGltZTogbm93IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lICsgMC4wMSwgLy8gUmVsYXRpdmUgdG8gY29udmVyc2F0aW9uIHN0YXJ0XG4gICAgICAgICAgc3BlYWtlcjogXCJhZ2VudFwiLFxuICAgICAgICAgIHRleHQ6IHJlc3BvbnNlLmRhdGEuYWdlbnRfd2VsY29tZV9tZXNzYWdlLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLndlbGNvbWVEYXRhLm1lc3NhZ2UgPSByZXNwb25zZS5kYXRhLmFnZW50X3dlbGNvbWVfbWVzc2FnZTtcbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcih3ZWxjb21lTWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLndlbGNvbWVEYXRhSGFuZGxlcikge1xuICAgICAgICB0aGlzLndlbGNvbWVEYXRhSGFuZGxlcih0aGlzLndlbGNvbWVEYXRhKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zYXZlQ29udmVyc2F0aW9uKCk7XG4gICAgICBpZiAodGhpcy51c2VXcykge1xuICAgICAgICB0aGlzLmNvbm5lY3RXZWJTb2NrZXQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhLmNvbnZlcnNhdGlvbl9pZDtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5pc1Rva2VuRXhwaXJlZEVycm9yKGVycm9yKSkge1xuICAgICAgICB0aGlzLnJlc2V0Q2hhdENvbnZlcnNhdGlvbigpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2VuZE1lc3NhZ2UoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudFtdLFxuICAgIGV4dHJhTWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb252ZXJzYXRpb25JZCB8fCAhdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb252ZXJzYXRpb24gbm90IHN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgY29uc3QgY2hhdE1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xuICAgICAgY3JlYXRlX3RpbWU6IG5vdyxcbiAgICAgIHN0YXJ0X3RpbWU6IG5vdyAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSwgLy8gUmVsYXRpdmUgdG8gY29udmVyc2F0aW9uIHN0YXJ0XG4gICAgICBlbmRfdGltZTogbm93IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lICsgMC4wMSwgLy8gUmVsYXRpdmUgdG8gY29udmVyc2F0aW9uIHN0YXJ0XG4gICAgICBzcGVha2VyOiBcImN1c3RvbWVyXCIsXG4gICAgICB0ZXh0OiBtZXNzYWdlLFxuICAgICAgYXR0YWNobWVudHM6IGF0dGFjaG1lbnRzLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcihjaGF0TWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RCb2R5OiBhbnkgPSB7XG4gICAgICAgIG1lc3NhZ2VzOiBbY2hhdE1lc3NhZ2VdLFxuICAgICAgICByZWNvcmRlZF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcblxuICAgICAgaWYgKHJlQ2FwdGNoYVRva2VuKSB7XG4gICAgICAgIHJlcXVlc3RCb2R5LnJlY2FwdGNoYV90b2tlbiA9IHJlQ2FwdGNoYVRva2VuO1xuICAgICAgfVxuXG4gICAgICAvLyBJbmNsdWRlIG1ldGFkYXRhXG4gICAgICBjb25zdCBtZXJnZWRNZXRhZGF0YSA9IHtcbiAgICAgICAgLi4uKHRoaXMubWV0YWRhdGEgfHwge30pLFxuICAgICAgICAuLi4oZXh0cmFNZXRhZGF0YSB8fCB7fSksXG4gICAgICB9O1xuICAgICAgaWYgKE9iamVjdC5rZXlzKG1lcmdlZE1ldGFkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcXVlc3RCb2R5Lm1ldGFkYXRhID0gbWVyZ2VkTWV0YWRhdGE7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucGF0Y2goXG4gICAgICAgIGAke3RoaXMuYmFzZVVybH0vYXBpL2NvbnZlcnNhdGlvbnMvaW4tcHJvZ3Jlc3MvdXBkYXRlLyR7dGhpcy5jb252ZXJzYXRpb25JZH1gLFxuICAgICAgICByZXF1ZXN0Qm9keSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyBJZiBub3QgdXNpbmcgV2ViU29ja2V0LCB0cnkgdG8gcmV0cmlldmUgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgZnJvbSB0aGUgdXBkYXRlIGNvbnZlcnNhdGlvbiByZXNwb25zZVxuICAgICAgaWYgKCF0aGlzLnVzZVdzICYmIHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5kYXRhIGFzIGFueTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAocmVzcG9uc2VEYXRhLm1lc3NhZ2VzICYmIEFycmF5LmlzQXJyYXkocmVzcG9uc2VEYXRhLm1lc3NhZ2VzKSkge1xuICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlIGxhdGVzdCBhZ2VudCBtZXNzYWdlIGluIHRoZSByZXNwb25zZVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJlc3BvbnNlRGF0YS5tZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlRGF0YSA9IHJlc3BvbnNlRGF0YS5tZXNzYWdlc1tpXTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBtZXNzYWdlRGF0YS5zcGVha2VyID09PSBcImFnZW50XCIgJiZcbiAgICAgICAgICAgICAgICBtZXNzYWdlRGF0YS50ZXh0ICYmXG4gICAgICAgICAgICAgICAgbWVzc2FnZURhdGEuY3JlYXRlX3RpbWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIG1lc3NhZ2VEYXRhLnN0YXJ0X3RpbWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIG1lc3NhZ2VEYXRhLmVuZF90aW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWdlbnRNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZV90aW1lOiBtZXNzYWdlRGF0YS5jcmVhdGVfdGltZSxcbiAgICAgICAgICAgICAgICAgIHN0YXJ0X3RpbWU6IHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZVxuICAgICAgICAgICAgICAgICAgICA/IG1lc3NhZ2VEYXRhLnN0YXJ0X3RpbWUgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWVcbiAgICAgICAgICAgICAgICAgICAgOiBtZXNzYWdlRGF0YS5zdGFydF90aW1lLFxuICAgICAgICAgICAgICAgICAgZW5kX3RpbWU6IHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZVxuICAgICAgICAgICAgICAgICAgICA/IG1lc3NhZ2VEYXRhLmVuZF90aW1lIC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lXG4gICAgICAgICAgICAgICAgICAgIDogbWVzc2FnZURhdGEuZW5kX3RpbWUsXG4gICAgICAgICAgICAgICAgICBzcGVha2VyOiBcImFnZW50XCIsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiBtZXNzYWdlRGF0YS50ZXh0LFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogbWVzc2FnZURhdGEubWVzc2FnZV9pZCB8fCBtZXNzYWdlRGF0YS5pZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VzcyBpZiB0aGlzIGlzIGEgbmV3IG1lc3NhZ2Ugd2UgaGF2ZW4ndCBzZWVuIGJlZm9yZVxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IGVhc2lseSBjaGVjayBoZXJlLCBzbyB3ZSdsbCBsZXQgdGhlIGhhbmRsZXIgbWFuYWdlIGR1cGxpY2F0ZXNcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyKGFnZW50TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIHVwZGF0ZSBjb252ZXJzYXRpb24gcmVzcG9uc2U6XCIsIHBhcnNlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHRva2VuIGV4cGlyYXRpb24gZXJyb3JcbiAgICAgIGlmICh0aGlzLmlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHRoaXMucmVzZXRDaGF0Q29udmVyc2F0aW9uKCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIHRoZSBhZ2VudCBpbmFjdGl2ZSBlcnJvclxuICAgICAgaWYgKFxuICAgICAgICBlcnJvci5yZXNwb25zZSAmJlxuICAgICAgICBlcnJvci5yZXNwb25zZS5kYXRhICYmXG4gICAgICAgIGVycm9yLnJlc3BvbnNlLmRhdGEuZXJyb3Jfa2V5ID09PSBcIkFHRU5UX0lOQUNUSVZFXCJcbiAgICAgICkge1xuICAgICAgICAvLyBDcmVhdGUgYSBjdXN0b20gbWVzc2FnZSBmb3IgdGhlIGFnZW50IGluYWN0aXZlIGVycm9yXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGNyZWF0ZV90aW1lOiBub3csXG4gICAgICAgICAgICBzdGFydF90aW1lOiBub3cgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUsXG4gICAgICAgICAgICBlbmRfdGltZTogbm93IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lICsgMC4wMSxcbiAgICAgICAgICAgIHNwZWFrZXI6IFwic3BlY2lhbFwiLFxuICAgICAgICAgICAgdGV4dDogdGhpcy5zZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UgPz8gXCJUaGUgYWdlbnQgaXMgY3VycmVudGx5IG9mZmxpbmUsIHBsZWFzZSBjaGVjayBiYWNrIGxhdGVyLiBUaGFuayB5b3UhXCIsXG4gICAgICAgICAgICAuLi4odGhpcy5zZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwgJiYge1xuICAgICAgICAgICAgICBsaW5rVXJsOiB0aGlzLnNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgICAgICAgbGlua0xhYmVsOiB0aGlzLnNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsID8/IFwiQ29udGFjdCBzdXBwb3J0XCIsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEb24ndCB0aHJvdyB0aGUgZXJyb3Igc2luY2Ugd2UgaGFuZGxlZCBpdCB3aXRoIGEgbWVzc2FnZVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwbG9hZEZpbGUoY2hhdElkOiBzdHJpbmcsIGZpbGU6IEZpbGUpOiBQcm9taXNlPEZpbGVVcGxvYWRSZXNwb25zZSB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnZlcnNhdGlvbiBub3Qgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZChcImNoYXRfaWRcIiwgY2hhdElkKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlXCIsIGZpbGUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdDxGaWxlVXBsb2FkUmVzcG9uc2U+KFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9nZW5hZ2VudC9rbm93bGVkZ2UvdXBsb2FkLWNoYXQtZmlsZWAsXG4gICAgICAgIGZvcm1EYXRhLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiKSxcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEgYXMgRmlsZVVwbG9hZFJlc3BvbnNlO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLmlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHRoaXMucmVzZXRDaGF0Q29udmVyc2F0aW9uKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBjb25uZWN0V2ViU29ja2V0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy51c2VXcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndlYlNvY2tldCkge1xuICAgICAgdGhpcy53ZWJTb2NrZXQuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnZlcnNhdGlvbiBJRCBpcyByZXF1aXJlZCBmb3IgV2ViU29ja2V0IGNvbm5lY3Rpb25cIik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXRlSGFuZGxlcikgdGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyKFwiY29ubmVjdGluZ1wiKTtcbiAgICBcbiAgICAvLyBCdWlsZCBXZWJTb2NrZXQgVVJMIHdpdGggcHJvcGVyIGF1dGhlbnRpY2F0aW9uXG4gICAgY29uc3Qgd3NCYXNlID0gdGhpcy5iYXNlVXJsLnJlcGxhY2UoXCJodHRwXCIsIFwid3NcIik7XG4gICAgY29uc3QgdG9waWNzID0gW1wibWVzc2FnZVwiLCBcInRha2VvdmVyXCIsIFwiZmluYWxpemVcIl07XG4gICAgY29uc3QgdG9waWNzUXVlcnkgPSB0b3BpY3MubWFwKCh0KSA9PiBgdG9waWNzPSR7dH1gKS5qb2luKFwiJlwiKTtcbiAgICBcbiAgICAvLyBVc2UgZ3Vlc3RfdG9rZW4gaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIGFwaV9rZXlcbiAgICBjb25zdCBhdXRoUGFyYW0gPSB0aGlzLmd1ZXN0VG9rZW4gXG4gICAgICA/IGBhY2Nlc3NfdG9rZW49JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5ndWVzdFRva2VuKX1gXG4gICAgICA6IGBhcGlfa2V5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYXBpS2V5KX1gO1xuICAgIFxuICAgIGxldCB3c1VybCA9IGAke3dzQmFzZX0vYXBpL2NvbnZlcnNhdGlvbnMvd3MvJHt0aGlzLmNvbnZlcnNhdGlvbklkfT8ke2F1dGhQYXJhbX0mbGFuZz1lbiYke3RvcGljc1F1ZXJ5fWA7XG4gICAgXG4gICAgLy8gQWRkIHRlbmFudCBhcyBxdWVyeSBwYXJhbWV0ZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy50ZW5hbnQpIHtcbiAgICAgIHdzVXJsICs9IGAmeC10ZW5hbnQtaWQ9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy50ZW5hbnQpfWA7XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBuYXRpdmUgYnJvd3NlciBXZWJTb2NrZXQgZmFjdG9yeVxuICAgIHRoaXMud2ViU29ja2V0ID0gY3JlYXRlV2ViU29ja2V0KHdzVXJsKTtcblxuXG4gICAgdGhpcy53ZWJTb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXRlSGFuZGxlcikgdGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyKFwiY29ubmVjdGVkXCIpO1xuICAgIH07XG5cbiAgICB0aGlzLndlYlNvY2tldC5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSBhcyBzdHJpbmcpO1xuXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09IFwibWVzc2FnZVwiICYmIHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnBheWxvYWQpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGRhdGEucGF5bG9hZCBhcyBDaGF0TWVzc2FnZVtdO1xuICAgICAgICAgICAgLy8gQWRqdXN0IHRpbWVzdGFtcHMgdG8gYmUgcmVsYXRpdmUgdG8gY29udmVyc2F0aW9uIHN0YXJ0XG4gICAgICAgICAgICAvLyBBbHNvIG5vcm1hbGl6ZSBtZXNzYWdlX2lkIGZpZWxkIChiYWNrZW5kIG1pZ2h0IHNlbmQgJ2lkJyBpbnN0ZWFkIG9mICdtZXNzYWdlX2lkJylcbiAgICAgICAgICAgIGNvbnN0IGFkanVzdGVkTWVzc2FnZXMgPSBtZXNzYWdlc1xuICAgICAgICAgICAgICAubWFwKChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZGp1c3RlZCA9IHRoaXMuYWRqdXN0TWVzc2FnZVRpbWVzdGFtcHMobXNnKTtcbiAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemU6IGlmIGJhY2tlbmQgc2VuZHMgJ2lkJywgdXNlIGl0IGFzICdtZXNzYWdlX2lkJ1xuICAgICAgICAgICAgICAgIGlmICghYWRqdXN0ZWQubWVzc2FnZV9pZCAmJiAobXNnIGFzIGFueSkuaWQpIHtcbiAgICAgICAgICAgICAgICAgIGFkanVzdGVkLm1lc3NhZ2VfaWQgPSAobXNnIGFzIGFueSkuaWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhZGp1c3RlZDtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobXNnKSA9PiBtc2cuc3BlYWtlciAhPT0gXCJjdXN0b21lclwiKTtcbiAgICAgICAgICAgIGFkanVzdGVkTWVzc2FnZXMuZm9yRWFjaCh0aGlzLm1lc3NhZ2VIYW5kbGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYWRqdXN0ZWRNZXNzYWdlID0gdGhpcy5hZGp1c3RNZXNzYWdlVGltZXN0YW1wcyhcbiAgICAgICAgICAgICAgZGF0YS5wYXlsb2FkIGFzIENoYXRNZXNzYWdlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gTm9ybWFsaXplOiBpZiBiYWNrZW5kIHNlbmRzICdpZCcsIHVzZSBpdCBhcyAnbWVzc2FnZV9pZCdcbiAgICAgICAgICAgIGlmICghYWRqdXN0ZWRNZXNzYWdlLm1lc3NhZ2VfaWQgJiYgKGRhdGEucGF5bG9hZCBhcyBhbnkpLmlkKSB7XG4gICAgICAgICAgICAgIGFkanVzdGVkTWVzc2FnZS5tZXNzYWdlX2lkID0gKGRhdGEucGF5bG9hZCBhcyBhbnkpLmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFkanVzdGVkTWVzc2FnZS5zcGVha2VyICE9PSBcImN1c3RvbWVyXCIpIHtcbiAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcihhZGp1c3RlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09IFwidGFrZW92ZXJcIikge1xuICAgICAgICAgIC8vIEhhbmRsZSB0YWtlb3ZlciBldmVudFxuICAgICAgICAgIC8vIENyZWF0ZSBzcGVjaWFsIG1lc3NhZ2UgZm9yIHRoZSB0YWtlb3ZlciBpbmRpY2F0b3JcbiAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgICAgICAgICBjb25zdCB0YWtlb3Zlck1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAgICAgICBjcmVhdGVfdGltZTogbm93LFxuICAgICAgICAgICAgICBzdGFydF90aW1lOiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWVcbiAgICAgICAgICAgICAgICA/IG5vdyAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZVxuICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgICAgZW5kX3RpbWU6IHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZVxuICAgICAgICAgICAgICAgID8gbm93IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lICsgMC4wMVxuICAgICAgICAgICAgICAgIDogMC4wMSxcbiAgICAgICAgICAgICAgc3BlYWtlcjogXCJzcGVjaWFsXCIsXG4gICAgICAgICAgICAgIHRleHQ6IFwiU3VwZXJ2aXNvciB0b29rIG92ZXJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyKHRha2VvdmVyTWVzc2FnZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2FsbCB0aGUgdGFrZW92ZXIgaGFuZGxlciBpZiBwcm92aWRlZFxuICAgICAgICAgIGlmICh0aGlzLnRha2VvdmVySGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy50YWtlb3ZlckhhbmRsZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSBcImZpbmFsaXplXCIpIHtcbiAgICAgICAgICAvLyBIYW5kbGUgZmluYWxpemVkIGV2ZW50XG4gICAgICAgICAgLy8gQ3JlYXRlIHNwZWNpYWwgbWVzc2FnZSBmb3IgdGhlIGZpbmFsaXplZCBpbmRpY2F0b3JcbiAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgICAgICAgICBjb25zdCBmaW5hbGl6ZWRNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgY3JlYXRlX3RpbWU6IG5vdyxcbiAgICAgICAgICAgICAgc3RhcnRfdGltZTogdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lXG4gICAgICAgICAgICAgICAgPyBub3cgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWVcbiAgICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgICAgIGVuZF90aW1lOiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWVcbiAgICAgICAgICAgICAgICA/IG5vdyAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSArIDAuMDFcbiAgICAgICAgICAgICAgICA6IDAuMDEsXG4gICAgICAgICAgICAgIHNwZWFrZXI6IFwic3BlY2lhbFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBcIkNvbnZlcnNhdGlvbiBGaW5hbGl6ZWRcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyKGZpbmFsaXplZE1lc3NhZ2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENhbGwgdGhlIGZpbmFsaXplZCBoYW5kbGVyIGlmIHByb3ZpZGVkXG4gICAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5maW5hbGl6ZWRIYW5kbGVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNGaW5hbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuc2F2ZUNvbnZlcnNhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy53ZWJTb2NrZXQub25lcnJvciA9IChlcnJvcjogRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0ZUhhbmRsZXIpXG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlSGFuZGxlcihcImRpc2Nvbm5lY3RlZFwiKTtcbiAgICAgIFxuICAgICAgLy8gTG9nIGRpYWdub3N0aWNcbiAgICAgIGNvbnN0IGRpYWdub3N0aWMgPSBjcmVhdGVXZWJTb2NrZXREaWFnbm9zdGljKGVycm9yLCB3c1VybCk7XG4gICAgICBjb25zb2xlLmVycm9yKGBbR2VuQXNzaXN0IENoYXRdICR7ZGlhZ25vc3RpY31gKTtcbiAgICB9O1xuXG4gICAgdGhpcy53ZWJTb2NrZXQub25jbG9zZSA9IChldmVudDogQ2xvc2VFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXRlSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyKFwiZGlzY29ubmVjdGVkXCIpO1xuICAgICAgXG4gICAgICAvLyBMb2cgZGlhZ25vc3RpY1xuICAgICAgaWYgKCFldmVudC53YXNDbGVhbikge1xuICAgICAgICBjb25zdCBkaWFnbm9zdGljID0gY3JlYXRlV2ViU29ja2V0RGlhZ25vc3RpYyhldmVudCwgd3NVcmwpO1xuICAgICAgICBjb25zb2xlLndhcm4oYFtHZW5Bc3Npc3QgQ2hhdF0gJHtkaWFnbm9zdGljfWApO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndlYlNvY2tldCkge1xuICAgICAgdGhpcy53ZWJTb2NrZXQuY2xvc2UoKTtcbiAgICAgIHRoaXMud2ViU29ja2V0ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoV2VsY29tZUltYWdlKGFnZW50SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbWFnZVJlc3BvbnNlID0gYXdhaXQgYXhpb3MuZ2V0KFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9nZW5hZ2VudC9hZ2VudHMvY29uZmlncy8ke2FnZW50SWR9L3dlbGNvbWUtaW1hZ2VgLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGltYWdlUmVzcG9uc2UuZGF0YSk7XG4gICAgICB0aGlzLndlbGNvbWVPYmplY3RVcmwgPSBibG9iVXJsO1xuICAgICAgdGhpcy53ZWxjb21lRGF0YS5pbWFnZVVybCA9IGJsb2JVcmw7XG4gICAgICBpZiAodGhpcy53ZWxjb21lRGF0YUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy53ZWxjb21lRGF0YUhhbmRsZXIodGhpcy53ZWxjb21lRGF0YSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLmlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyKSkge1xuICAgICAgICB0aGlzLnJlc2V0Q2hhdENvbnZlcnNhdGlvbigpO1xuICAgICAgfVxuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGZlZWRiYWNrIHRvIGEgc3BlY2lmaWMgYWdlbnQgbWVzc2FnZSBpbiB0aGUgY29udmVyc2F0aW9uXG4gIGFzeW5jIGFkZEZlZWRiYWNrKFxuICAgIG1lc3NhZ2VJZDogc3RyaW5nLFxuICAgIGZlZWRiYWNrOiBcImdvb2RcIiB8IFwiYmFkXCIsXG4gICAgZmVlZGJhY2tfbWVzc2FnZT86IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIW1lc3NhZ2VJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWVzc2FnZSBJRCBpcyByZXF1aXJlZCBmb3IgZmVlZGJhY2tcIik7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBtZXNzYWdlIElEIGluIHRoZSBVUkwgcGF0aCwgbm90IGNvbnZlcnNhdGlvbiBJRFxuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfS9hcGkvY29udmVyc2F0aW9ucy9tZXNzYWdlL2FkZC1mZWVkYmFjay8ke21lc3NhZ2VJZH1gO1xuICAgICAgLy8gQm9keSBzaG91bGQgb25seSBjb250YWluIGZlZWRiYWNrIGFuZCBmZWVkYmFja19tZXNzYWdlIChubyBtZXNzYWdlX2lkKVxuICAgICAgY29uc3QgcGF5bG9hZDoge1xuICAgICAgICBmZWVkYmFjazogXCJnb29kXCIgfCBcImJhZFwiO1xuICAgICAgICBmZWVkYmFja19tZXNzYWdlPzogc3RyaW5nO1xuICAgICAgfSA9IHtcbiAgICAgICAgZmVlZGJhY2ssXG4gICAgICB9O1xuICAgICAgXG4gICAgICBpZiAoZmVlZGJhY2tfbWVzc2FnZSkge1xuICAgICAgICBwYXlsb2FkLmZlZWRiYWNrX21lc3NhZ2UgPSBmZWVkYmFja19tZXNzYWdlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBhd2FpdCBheGlvcy5wYXRjaCh1cmwsIHBheWxvYWQsIHtcbiAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksXG4gICAgICB9KTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLmlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHRoaXMucmVzZXRDaGF0Q29udmVyc2F0aW9uKCk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmVycm9yKCdGZWVkYmFjayBBUEkgY2FsbCBmYWlsZWQ6Jywge1xuICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICByZXNwb25zZTogZXJyb3IucmVzcG9uc2U/LmRhdGEsXG4gICAgICAgIHN0YXR1czogZXJyb3IucmVzcG9uc2U/LnN0YXR1cyxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBhZGp1c3QgbWVzc2FnZSB0aW1lc3RhbXBzIHJlbGF0aXZlIHRvIGNvbnZlcnNhdGlvbiBzdGFydFxuICBwcml2YXRlIGFkanVzdE1lc3NhZ2VUaW1lc3RhbXBzKG1lc3NhZ2U6IENoYXRNZXNzYWdlKTogQ2hhdE1lc3NhZ2Uge1xuICAgIGlmICghdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWVzc2FnZSxcbiAgICAgIHN0YXJ0X3RpbWU6IG1lc3NhZ2Uuc3RhcnRfdGltZSAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSxcbiAgICAgIGVuZF90aW1lOiBtZXNzYWdlLmVuZF90aW1lIC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
908
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdFNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvY2hhdFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFXMUIsT0FBTyxFQUNMLGVBQWUsRUFDZix5QkFBeUIsR0FDMUIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixNQUFNLENBQUMsSUFBTSxnQ0FBZ0MsR0FBRyxrQ0FBa0MsQ0FBQztBQUVuRjtJQStCRSxxQkFDRSxPQUFlLEVBQ2YsTUFBYyxFQUNkLFFBQThCLEVBQzlCLE1BQWUsRUFDZixRQUFpQixFQUNqQixLQUFxQixFQUNyQixPQUF3QjtRQUR4QixzQkFBQSxFQUFBLFlBQXFCO1FBQ3JCLHdCQUFBLEVBQUEsZUFBd0I7UUFsQ2xCLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUNyQywyQkFBc0IsR0FBa0IsSUFBSSxDQUFDLENBQUMsZ0NBQWdDO1FBQzlFLGVBQVUsR0FBa0IsSUFBSSxDQUFDLENBQUMsZ0NBQWdDO1FBQ2xFLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLGNBQVMsR0FBcUIsSUFBSSxDQUFDO1FBQ25DLG1CQUFjLEdBQTRDLElBQUksQ0FBQztRQUMvRCxvQkFBZSxHQUF3QixJQUFJLENBQUM7UUFDNUMscUJBQWdCLEdBQXdCLElBQUksQ0FBQztRQUM3QywyQkFBc0IsR0FFbkIsSUFBSSxDQUFDO1FBQ1IsdUJBQWtCLEdBQThDLElBQUksQ0FBQztRQUNyRSxtQkFBYyxHQUFHLHdCQUF3QixDQUFDO1FBQzFDLG9CQUFlLEdBQWEsRUFBRSxDQUFDO1FBQy9CLGdCQUFXLEdBQXFCLEVBQUUsQ0FBQztRQUNuQyxtQkFBYyxHQUF3QixFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3JF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QzlFLHNHQUFzRztnQkFDdEcsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDekIsQ0FBQzs7OztLQUNGO0lBRUssNkNBQXVCLEdBQTdCOzs7Z0JBQ0UsZ0ZBQWdGO2dCQUNoRixnSEFBZ0g7Z0JBQ2hILElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7b0JBQzFCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMxQixDQUFDO2dCQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7OztLQUN6QjtJQUdILGtCQUFDO0FBQUQsQ0FBQyxBQXo4QkQsSUF5OEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHtcbiAgQ2hhdE1lc3NhZ2UsXG4gIFN0YXJ0Q29udmVyc2F0aW9uUmVzcG9uc2UsXG4gIEF0dGFjaG1lbnQsXG4gIEFnZW50VGhpbmtpbmdDb25maWcsXG4gIEFnZW50V2VsY29tZURhdGEsXG4gIEZpbGVVcGxvYWRSZXNwb25zZSxcbiAgSW5Qcm9ncmVzc1BvbGxSZXNwb25zZSxcbiAgSW5Qcm9ncmVzc1BvbGxNZXNzYWdlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZVdlYlNvY2tldCxcbiAgY3JlYXRlV2ViU29ja2V0RGlhZ25vc3RpYyxcbn0gZnJvbSBcIi4uL3V0aWxzL3dlYnNvY2tldFwiO1xuZXhwb3J0IGNvbnN0IEdFTkFTU0lTVF9BR0VOVF9NRVRBREFUQV9VUERBVEVEID0gXCJnZW5hc3Npc3RfYWdlbnRfbWV0YWRhdGFfdXBkYXRlZFwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhdFNlcnZpY2Uge1xuICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSBhcGlLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBjb252ZXJzYXRpb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29udmVyc2F0aW9uQ3JlYXRlVGltZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7IC8vIFRyYWNrIGNvbnZlcnNhdGlvbiBzdGFydCB0aW1lXG4gIHByaXZhdGUgZ3Vlc3RUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIEd1ZXN0IHRva2VuIGZvciBhdXRob3JpemF0aW9uXG4gIHByaXZhdGUgaXNGaW5hbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB3ZWJTb2NrZXQ6IFdlYlNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1lc3NhZ2VIYW5kbGVyOiAoKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRha2VvdmVySGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZmluYWxpemVkSGFuZGxlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGlvblN0YXRlSGFuZGxlcjpcbiAgICB8ICgoc3RhdGU6IFwiY29ubmVjdGluZ1wiIHwgXCJjb25uZWN0ZWRcIiB8IFwiZGlzY29ubmVjdGVkXCIpID0+IHZvaWQpXG4gICAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB3ZWxjb21lRGF0YUhhbmRsZXI6ICgoZGF0YTogQWdlbnRXZWxjb21lRGF0YSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdG9yYWdlS2V5QmFzZSA9IFwiZ2VuYXNzaXN0X2NvbnZlcnNhdGlvblwiO1xuICBwcml2YXRlIHBvc3NpYmxlUXVlcmllczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSB3ZWxjb21lRGF0YTogQWdlbnRXZWxjb21lRGF0YSA9IHt9O1xuICBwcml2YXRlIHRoaW5raW5nQ29uZmlnOiBBZ2VudFRoaW5raW5nQ29uZmlnID0geyBwaHJhc2VzOiBbXSwgZGVsYXlNczogMTAwMCB9O1xuICBwcml2YXRlIGNoYXRJbnB1dE1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBwcml2YXRlIHdlbGNvbWVPYmplY3RVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyB0byByZXZva2Ugb24gcmVzZXRcbiAgcHJpdmF0ZSB0ZW5hbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBhZ2VudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgbGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSB1c2VXczogYm9vbGVhbjtcbiAgcHJpdmF0ZSBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHVzZVBvbGw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBiYXNlVXJsOiBzdHJpbmcsXG4gICAgYXBpS2V5OiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHRlbmFudD86IHN0cmluZyxcbiAgICBsYW5ndWFnZT86IHN0cmluZyxcbiAgICB1c2VXczogYm9vbGVhbiA9IHRydWUsXG4gICAgdXNlUG9sbDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmwuZW5kc1dpdGgoXCIvXCIpID8gYmFzZVVybC5zbGljZSgwLCAtMSkgOiBiYXNlVXJsO1xuICAgIHRoaXMuYXBpS2V5ID0gYXBpS2V5O1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICB0aGlzLnRlbmFudCA9IHRlbmFudDtcbiAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgdGhpcy51c2VXcyA9IHVzZVdzO1xuICAgIHRoaXMudXNlUG9sbCA9IHVzZVBvbGw7XG4gICAgLy8gVHJ5IHRvIGxvYWQgYSBzYXZlZCBjb252ZXJzYXRpb24gZm9yIHRoaXMgYXBpS2V5IGZyb20gbG9jYWxTdG9yYWdlXG4gICAgdGhpcy5sb2FkU2F2ZWRDb252ZXJzYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RvcmFnZUtleSgpOiBzdHJpbmcge1xuICAgIC8vIFBvaW50ZXIgdG8gY3VycmVudCBjb252ZXJzYXRpb24gbWV0YWRhdGEgZm9yIHRoaXMgYXBpS2V5XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcmFnZUtleUJhc2V9OiR7dGhpcy5hcGlLZXl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY29udmVyc2F0aW9uIGZpbmFsaXplZDogZW1pdCBzcGVjaWFsIG1lc3NhZ2UsIGNhbGwgZmluYWxpemVkIGhhbmRsZXIsIHBlcnNpc3Qgc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlQ29udmVyc2F0aW9uRmluYWxpemVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICAgIGNvbnN0IGZpbmFsaXplZE1lc3NhZ2U6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICBjcmVhdGVfdGltZTogbm93LFxuICAgICAgICBzdGFydF90aW1lOiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWVcbiAgICAgICAgICA/IG5vdyAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZVxuICAgICAgICAgIDogMCxcbiAgICAgICAgZW5kX3RpbWU6IHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZVxuICAgICAgICAgID8gbm93IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lICsgMC4wMVxuICAgICAgICAgIDogMC4wMSxcbiAgICAgICAgc3BlYWtlcjogXCJzcGVjaWFsXCIsXG4gICAgICAgIHRleHQ6IFwiQ29udmVyc2F0aW9uIEZpbmFsaXplZFwiLFxuICAgICAgICB0eXBlOiBcImZpbmFsaXplZFwiLFxuICAgICAgfTtcbiAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIoZmluYWxpemVkTWVzc2FnZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmZpbmFsaXplZEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuZmluYWxpemVkSGFuZGxlcigpO1xuICAgIH1cbiAgICB0aGlzLmlzRmluYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLnNhdmVDb252ZXJzYXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0IGFnZW50X2NoYXRfaW5wdXRfbWV0YWRhdGEgdG8gbG9jYWxTdG9yYWdlIGFuZCBkaXNwYXRjaCBhIGdsb2JhbCBldmVudC5cbiAgICogQW55IGNvbnN1bWVyIChlLmcuIGNvbmZpZyBwYW5lbCkgY2FuIGxpc3RlbiBmb3IgR0VOQVNTSVNUX0FHRU5UX01FVEFEQVRBX1VQREFURURcbiAgICogb3IgcmVhZCBmcm9tIGxvY2FsU3RvcmFnZSBvbiBtb3VudDsgbm8gbmVlZCB0byBwYXNzIGNhbGxiYWNrcyBpbnRvIHRoZSBjaGF0LlxuICAgKi9cbiAgcHJpdmF0ZSBwZXJzaXN0QW5kRW1pdEFnZW50TWV0YWRhdGEobWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGtleSA9IGBnZW5hc3Npc3RfYWdlbnRfY2hhdF9pbnB1dF9tZXRhZGF0YToke3RoaXMuYXBpS2V5fWA7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KG1ldGFkYXRhKSk7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoR0VOQVNTSVNUX0FHRU5UX01FVEFEQVRBX1VQREFURUQsIHtcbiAgICAgICAgICAgIGRldGFpbDogeyBhcGlLZXk6IHRoaXMuYXBpS2V5LCBtZXRhZGF0YTogeyAuLi5tZXRhZGF0YSB9IH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGxhbmd1YWdlIGZvciBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyXG4gICAqL1xuICBzZXRMYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtZXRhZGF0YSAodXNlZnVsIGZvciB1cGRhdGluZyBsYW5ndWFnZSBvciBvdGhlciBkeW5hbWljIG1ldGFkYXRhKVxuICAgKi9cbiAgc2V0TWV0YWRhdGEobWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGxhbmd1YWdlIGNvZGUgZm9yIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXJcbiAgICogQ29udmVydHMgc2ltcGxlIGxhbmd1YWdlIGNvZGVzIChlLmcuLCBcImVuXCIsIFwiZXNcIikgdG8gcHJvcGVyIGZvcm1hdCAoZS5nLiwgXCJlbi1VUyxlbjtxPTAuOVwiKVxuICAgKiBGb2xsb3dzIEhUVFAgQWNjZXB0LUxhbmd1YWdlIGhlYWRlciBzdGFuZGFyZHNcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0QWNjZXB0TGFuZ3VhZ2UobGFuZ0NvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFsYW5nQ29kZSkgcmV0dXJuICcnO1xuXG4gICAgLy8gTm9ybWFsaXplIGxhbmd1YWdlIGNvZGUgKGxvd2VyY2FzZSwgaGFuZGxlIGNvbW1vbiBmb3JtYXRzKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBsYW5nQ29kZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgIC8vIE1hcCBjb21tb24gbGFuZ3VhZ2UgY29kZXMgdG8gdGhlaXIgZnVsbCBsb2NhbGUgZm9ybWF0XG4gICAgY29uc3QgbGFuZ3VhZ2VNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnZW4nOiAnZW4tVVMnLFxuICAgICAgJ2VzJzogJ2VzLUVTJyxcbiAgICAgICdmcic6ICdmci1GUicsXG4gICAgICAnZGUnOiAnZGUtREUnLFxuICAgICAgJ2l0JzogJ2l0LUlUJyxcbiAgICAgICdwdCc6ICdwdC1QVCcsXG4gICAgICAnYXInOiAnYXItU0EnLFxuICAgICAgJ3NxJzogJ3NxLUFMJyxcbiAgICB9O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvZGUgYWxyZWFkeSBoYXMgYSByZWdpb24gKGUuZy4sIFwiZW4tVVNcIiwgXCJlcy1FU1wiKVxuICAgIGNvbnN0IGhhc1JlZ2lvbiA9IG5vcm1hbGl6ZWQuaW5jbHVkZXMoJy0nKTtcblxuICAgIC8vIEdldCB0aGUgZnVsbCBsb2NhbGUgb3IgdXNlIHRoZSBwcm92aWRlZCBjb2RlIGlmIGl0IGFscmVhZHkgaGFzIGEgcmVnaW9uXG4gICAgY29uc3QgZnVsbExvY2FsZSA9IGhhc1JlZ2lvbiA/IG5vcm1hbGl6ZWQgOiAobGFuZ3VhZ2VNYXBbbm9ybWFsaXplZF0gfHwgbm9ybWFsaXplZCk7XG5cbiAgICAvLyBFeHRyYWN0IGJhc2UgbGFuZ3VhZ2UgZnJvbSB0aGUgZnVsbCBsb2NhbGUgKGUuZy4sIFwiZW5cIiBmcm9tIFwiZW4tVVNcIilcbiAgICBjb25zdCBmdWxsQmFzZUxhbmcgPSBmdWxsTG9jYWxlLnNwbGl0KCctJylbMF0udG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIEJ1aWxkIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXI6IHByaW1hcnkgbG9jYWxlLCBiYXNlIGxhbmd1YWdlIHdpdGggcXVhbGl0eSwgRW5nbGlzaCBmYWxsYmFja1xuICAgIC8vIEZvcm1hdDogXCJsb2NhbGUsYmFzZS1sYW5nO3E9MC45LGVuO3E9MC44XCJcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbZnVsbExvY2FsZV07XG5cbiAgICAvLyBmYWxsYmFja1xuICAgIHBhcnRzLnB1c2goYCR7ZnVsbEJhc2VMYW5nfTtxPTAuOWApO1xuXG4gICAgLy8gQWRkIEVuZ2xpc2ggYXMgZmFsbGJhY2sgaWYgbm90IGFscmVhZHkgdGhlIHByaW1hcnkgbGFuZ3VhZ2VcbiAgICBpZiAoZnVsbEJhc2VMYW5nICE9PSAnZW4nKSB7XG4gICAgICBwYXJ0cy5wdXNoKCdlbjtxPTAuOCcpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcsICcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBoZWFkZXJzIGZvciBBUEkgcmVxdWVzdHMsIGluY2x1ZGluZyBhdXRob3JpemF0aW9uIGlmIGd1ZXN0IHRva2VuIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBcIngtYXBpLWtleVwiOiB0aGlzLmFwaUtleSxcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IGNvbnRlbnRUeXBlLFxuICAgIH07XG5cbiAgICAvLyBBZGQgdGVuYW50IGhlYWRlciBpZiBwcm92aWRlZFxuICAgIGlmICh0aGlzLnRlbmFudCkge1xuICAgICAgaGVhZGVyc1tcIngtdGVuYW50LWlkXCJdID0gdGhpcy50ZW5hbnQ7XG4gICAgfVxuXG4gICAgLy8gQWRkIGF1dGhvcml6YXRpb24gaGVhZGVyIGlmIGd1ZXN0IHRva2VuIGlzIGF2YWlsYWJsZVxuICAgIGlmICh0aGlzLmd1ZXN0VG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbXCJBdXRob3JpemF0aW9uXCJdID0gYEJlYXJlciAke3RoaXMuZ3Vlc3RUb2tlbn1gO1xuICAgIH1cblxuICAgIC8vIEFkZCBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyIGlmIGxhbmd1YWdlIGlzIHNldFxuICAgIGlmICh0aGlzLmxhbmd1YWdlKSB7XG4gICAgICBjb25zdCBhY2NlcHRMYW5ndWFnZSA9IHRoaXMuZm9ybWF0QWNjZXB0TGFuZ3VhZ2UodGhpcy5sYW5ndWFnZSk7XG4gICAgICBpZiAoYWNjZXB0TGFuZ3VhZ2UpIHtcbiAgICAgICAgaGVhZGVyc1tcIkFjY2VwdC1MYW5ndWFnZVwiXSA9IGFjY2VwdExhbmd1YWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG5cbiAgc2V0TWVzc2FnZUhhbmRsZXIoaGFuZGxlcjogKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBzZXRUYWtlb3ZlckhhbmRsZXIoaGFuZGxlcjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMudGFrZW92ZXJIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHNldEZpbmFsaXplZEhhbmRsZXIoaGFuZGxlcjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMuZmluYWxpemVkSGFuZGxlciA9IGhhbmRsZXI7XG4gIH1cblxuICBzZXRDb25uZWN0aW9uU3RhdGVIYW5kbGVyKFxuICAgIGhhbmRsZXI6IChzdGF0ZTogXCJjb25uZWN0aW5nXCIgfCBcImNvbm5lY3RlZFwiIHwgXCJkaXNjb25uZWN0ZWRcIikgPT4gdm9pZFxuICApIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgc2V0V2VsY29tZURhdGFIYW5kbGVyKGhhbmRsZXI6ICgoZGF0YTogQWdlbnRXZWxjb21lRGF0YSkgPT4gdm9pZCkgfCBudWxsKSB7XG4gICAgdGhpcy53ZWxjb21lRGF0YUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgc2V0U2VydmVyVW5hdmFpbGFibGVDb25maWcoXG4gICAgbWVzc2FnZT86IHN0cmluZyxcbiAgICBjb250YWN0VXJsPzogc3RyaW5nLFxuICAgIGNvbnRhY3RMYWJlbD86IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5zZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwgPSBjb250YWN0VXJsO1xuICAgIHRoaXMuc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwgPSBjb250YWN0TGFiZWw7XG4gIH1cblxuICBnZXRQb3NzaWJsZVF1ZXJpZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnBvc3NpYmxlUXVlcmllcztcbiAgfVxuXG4gIGdldFdlbGNvbWVEYXRhKCk6IEFnZW50V2VsY29tZURhdGEge1xuICAgIHJldHVybiB0aGlzLndlbGNvbWVEYXRhO1xuICB9XG5cbiAgZ2V0VGhpbmtpbmdDb25maWcoKTogQWdlbnRUaGlua2luZ0NvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMudGhpbmtpbmdDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogTWV0YWRhdGEga2V5cy9kZWZhdWx0cyBmcm9tIHRoZSB3b3JrZmxvdydzIENoYXQgSW5wdXQgbm9kZSAocmV0dXJuZWQgd2hlbiBjb252ZXJzYXRpb24gc3RhcnRzKS5cbiAgICogVXNlZCB0byBzaG93IHdvcmtmbG93LWRlZmluZWQgbWV0YWRhdGEgaW4gdGhlIGNvbmZpZyBwYW5lbC5cbiAgICovXG4gIGdldENoYXRJbnB1dE1ldGFkYXRhKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4geyAuLi50aGlzLmNoYXRJbnB1dE1ldGFkYXRhIH07XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIHNhdmVkIGNvbnZlcnNhdGlvbiBJRCBmcm9tIGxvY2FsU3RvcmFnZVxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkU2F2ZWRDb252ZXJzYXRpb24oKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBzYXZlZENvbnZlcnNhdGlvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZ2V0U3RvcmFnZUtleSgpKTtcbiAgICAgIC8vIEJhY2t3YXJkLWNvbXBhdDogY2hlY2sgb2xkIHVuc2NvcGVkIGtleSBpZiBzY29wZWQgb25lIG1pc3NpbmdcbiAgICAgIGlmICghc2F2ZWRDb252ZXJzYXRpb24pIHtcbiAgICAgICAgc2F2ZWRDb252ZXJzYXRpb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXlCYXNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzYXZlZENvbnZlcnNhdGlvbikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgY3JlYXRlVGltZSxcbiAgICAgICAgICBpc0ZpbmFsaXplZCxcbiAgICAgICAgICBwb3NzaWJsZVF1ZXJpZXMsXG4gICAgICAgICAgd2VsY29tZURhdGEsXG4gICAgICAgICAgdGhpbmtpbmdDb25maWcsXG4gICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICBndWVzdFRva2VuLFxuICAgICAgICB9ID0gSlNPTi5wYXJzZShzYXZlZENvbnZlcnNhdGlvbik7XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb25JZDtcbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lID0gY3JlYXRlVGltZTtcbiAgICAgICAgdGhpcy5pc0ZpbmFsaXplZCA9IGlzRmluYWxpemVkIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmd1ZXN0VG9rZW4gPSBndWVzdFRva2VuIHx8IG51bGw7XG4gICAgICAgIHRoaXMucG9zc2libGVRdWVyaWVzID0gQXJyYXkuaXNBcnJheShwb3NzaWJsZVF1ZXJpZXMpXG4gICAgICAgICAgPyBwb3NzaWJsZVF1ZXJpZXNcbiAgICAgICAgICA6IFtdO1xuICAgICAgICB0aGlzLndlbGNvbWVEYXRhID0gd2VsY29tZURhdGEgfHwge307XG4gICAgICAgIGlmICghdGhpcy53ZWxjb21lRGF0YS5wb3NzaWJsZVF1ZXJpZXMpIHtcbiAgICAgICAgICB0aGlzLndlbGNvbWVEYXRhLnBvc3NpYmxlUXVlcmllcyA9IHRoaXMucG9zc2libGVRdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGhpbmtpbmdDb25maWcgPSB7XG4gICAgICAgICAgcGhyYXNlczogKHRoaW5raW5nQ29uZmlnICYmIHRoaW5raW5nQ29uZmlnLnBocmFzZXMpIHx8IFtdLFxuICAgICAgICAgIGRlbGF5TXM6XG4gICAgICAgICAgICB0aGlua2luZ0NvbmZpZyAmJiB0eXBlb2YgdGhpbmtpbmdDb25maWcuZGVsYXlNcyA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgICAgICA/IHRoaW5raW5nQ29uZmlnLmRlbGF5TXNcbiAgICAgICAgICAgICAgOiAxMDAwLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFnZW50SWQgPSBhZ2VudElkO1xuICAgICAgICBpZiAoIXRoaXMud2VsY29tZURhdGEuaW1hZ2VVcmwgJiYgdGhpcy5hZ2VudElkKSB7XG4gICAgICAgICAgdGhpcy5mZXRjaFdlbGNvbWVJbWFnZSh0aGlzLmFnZW50SWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndlbGNvbWVEYXRhSGFuZGxlcikge1xuICAgICAgICAgIHRoaXMud2VsY29tZURhdGFIYW5kbGVyKHRoaXMud2VsY29tZURhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSBjdXJyZW50IGNvbnZlcnNhdGlvbiBJRCB0byBsb2NhbFN0b3JhZ2VcbiAgICovXG4gIHByaXZhdGUgc2F2ZUNvbnZlcnNhdGlvbigpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuY29udmVyc2F0aW9uSWQgJiYgdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lKSB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbkRhdGEgPSB7XG4gICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHRoaXMuY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgY3JlYXRlVGltZTogdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lLFxuICAgICAgICAgIGlzRmluYWxpemVkOiB0aGlzLmlzRmluYWxpemVkLFxuICAgICAgICAgIHBvc3NpYmxlUXVlcmllczogdGhpcy5wb3NzaWJsZVF1ZXJpZXMsXG4gICAgICAgICAgd2VsY29tZURhdGE6IHtcbiAgICAgICAgICAgIC4uLnRoaXMud2VsY29tZURhdGEsXG4gICAgICAgICAgICBpbWFnZVVybDpcbiAgICAgICAgICAgICAgdGhpcy53ZWxjb21lT2JqZWN0VXJsICYmXG4gICAgICAgICAgICAgIHRoaXMud2VsY29tZURhdGEuaW1hZ2VVcmwgJiZcbiAgICAgICAgICAgICAgdGhpcy53ZWxjb21lRGF0YS5pbWFnZVVybC5zdGFydHNXaXRoKFwiYmxvYjpcIilcbiAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICA6IHRoaXMud2VsY29tZURhdGEuaW1hZ2VVcmwgfHwgbnVsbCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaW5raW5nQ29uZmlnOiB0aGlzLnRoaW5raW5nQ29uZmlnLFxuICAgICAgICAgIGFnZW50SWQ6IHRoaXMuYWdlbnRJZCxcbiAgICAgICAgICBndWVzdFRva2VuOiB0aGlzLmd1ZXN0VG9rZW4sXG4gICAgICAgIH07XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZ2V0U3RvcmFnZUtleSgpLCBKU09OLnN0cmluZ2lmeShjb252ZXJzYXRpb25EYXRhKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIGFuIGVycm9yIGlzIGEgdG9rZW4gZXhwaXJhdGlvbiBlcnJvclxuICBwcml2YXRlIGlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3I6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBlcnJvci5yZXNwb25zZSAmJlxuICAgICAgZXJyb3IucmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiZcbiAgICAgIGVycm9yLnJlc3BvbnNlLmRhdGEgJiZcbiAgICAgIChlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yID09PSBcIlRva2VuIGhhcyBleHBpcmVkLlwiIHx8XG4gICAgICAgIGVycm9yLnJlc3BvbnNlLmRhdGEubWVzc2FnZSA9PT0gXCJUb2tlbiBoYXMgZXhwaXJlZC5cIiB8fFxuICAgICAgICAodHlwZW9mIGVycm9yLnJlc3BvbnNlLmRhdGEgPT09IFwic3RyaW5nXCIgJiYgZXJyb3IucmVzcG9uc2UuZGF0YS5pbmNsdWRlcyhcIlRva2VuIGhhcyBleHBpcmVkXCIpKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIGhhbmRsZXIgZm9yIHRha2VvdmVyIGV2ZW50czogZW1pdHMgYSBzcGVjaWFsIG1lc3NhZ2UgYW5kIGludm9rZXMgdGFrZW92ZXJIYW5kbGVyLlxuICAgKiBSdW5zIG9ubHkgb25jZSBwZXIgY29udmVyc2F0aW9uIChpZGVtcG90ZW50KS5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlVGFrZW92ZXIobm93PzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdCA9IG5vdyA/PyBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikge1xuICAgICAgY29uc3QgdGFrZW92ZXJNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgY3JlYXRlX3RpbWU6IHQsXG4gICAgICAgIHN0YXJ0X3RpbWU6IHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSA/IHQgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgOiAwLFxuICAgICAgICBlbmRfdGltZTogdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lID8gdCAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSArIDAuMDEgOiAwLjAxLFxuICAgICAgICBzcGVha2VyOiBcInNwZWNpYWxcIixcbiAgICAgICAgdGV4dDogXCJTdXBlcnZpc29yIHRvb2sgb3ZlclwiLFxuICAgICAgICB0eXBlOiBcInRha2VvdmVyXCIsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyKHRha2VvdmVyTWVzc2FnZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRha2VvdmVySGFuZGxlcikge1xuICAgICAgdGhpcy50YWtlb3ZlckhhbmRsZXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIGN1cnJlbnQgY29udmVyc2F0aW9uIGJ5IGNsZWFyaW5nIHRoZSBJRCBhbmQgd2Vic29ja2V0XG4gICAqL1xuICByZXNldENoYXRDb252ZXJzYXRpb24oKTogdm9pZCB7XG4gICAgLy8gQ2xvc2UgdGhlIGN1cnJlbnQgd2Vic29ja2V0IGNvbm5lY3Rpb24gaWYgaXQgZXhpc3RzXG4gICAgaWYgKHRoaXMud2ViU29ja2V0KSB7XG4gICAgICB0aGlzLndlYlNvY2tldC5jbG9zZSgpO1xuICAgICAgdGhpcy53ZWJTb2NrZXQgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIENsZWFyIHRoZSBjb252ZXJzYXRpb24gSURcbiAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gbnVsbDtcbiAgICB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgPSBudWxsO1xuICAgIHRoaXMuZ3Vlc3RUb2tlbiA9IG51bGw7XG4gICAgdGhpcy5pc0ZpbmFsaXplZCA9IGZhbHNlO1xuXG4gICAgLy8gQ2xlYXIgcG9zc2libGUgcXVlcmllcyBhbmQgd29ya2Zsb3cgbWV0YWRhdGFcbiAgICB0aGlzLnBvc3NpYmxlUXVlcmllcyA9IFtdO1xuICAgIHRoaXMud2VsY29tZURhdGEgPSB7fTtcbiAgICB0aGlzLnRoaW5raW5nQ29uZmlnID0geyBwaHJhc2VzOiBbXSwgZGVsYXlNczogMTAwMCB9O1xuICAgIHRoaXMuY2hhdElucHV0TWV0YWRhdGEgPSB7fTtcbiAgICBpZiAodGhpcy53ZWxjb21lT2JqZWN0VXJsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMud2VsY29tZU9iamVjdFVybCk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgICB0aGlzLndlbGNvbWVPYmplY3RVcmwgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmFnZW50SWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBsb2NhbCBzdG9yYWdlXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuZ2V0U3RvcmFnZUtleSgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZXJlJ3MgYSBjdXJyZW50IGNvbnZlcnNhdGlvblxuICAgKi9cbiAgaGFzQWN0aXZlQ29udmVyc2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY29udmVyc2F0aW9uSWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGNvbnZlcnNhdGlvbiBJRFxuICAgKi9cbiAgZ2V0Q29udmVyc2F0aW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udmVyc2F0aW9uSWQ7XG4gIH1cblxuICBnZXRDb252ZXJzYXRpb25DcmVhdGVUaW1lKCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWU7XG4gIH1cblxuICBpc0NvbnZlcnNhdGlvbkZpbmFsaXplZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0ZpbmFsaXplZDtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0Q29udmVyc2F0aW9uKHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVxdWVzdEJvZHk6IGFueSA9IHtcbiAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICByZWNvcmRlZF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBkYXRhX3NvdXJjZV9pZDogXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZUNhcHRjaGFUb2tlbikge1xuICAgICAgICByZXF1ZXN0Qm9keS5yZWNhcHRjaGFfdG9rZW4gPSByZUNhcHRjaGFUb2tlbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWV0YWRhdGEpIHtcbiAgICAgICAgcmVxdWVzdEJvZHkubWV0YWRhdGEgPSB0aGlzLm1ldGFkYXRhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3Q8U3RhcnRDb252ZXJzYXRpb25SZXNwb25zZT4oXG4gICAgICAgIGAke3RoaXMuYmFzZVVybH0vYXBpL2NvbnZlcnNhdGlvbnMvaW4tcHJvZ3Jlc3Mvc3RhcnRgLFxuICAgICAgICByZXF1ZXN0Qm9keSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gcmVzcG9uc2UuZGF0YS5jb252ZXJzYXRpb25faWQ7XG4gICAgICAvLyBTdG9yZSBjb252ZXJzYXRpb24gY3JlYXRlIHRpbWUgKHVzZSBmcm9tIHJlc3BvbnNlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGN1cnJlbnQgdGltZSlcbiAgICAgIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSA9IHJlc3BvbnNlLmRhdGEuY3JlYXRlX3RpbWVcbiAgICAgICAgPyByZXNwb25zZS5kYXRhLmNyZWF0ZV90aW1lIC8gMTAwMFxuICAgICAgICA6IERhdGUubm93KCkgLyAxMDAwO1xuICAgICAgLy8gU3RvcmUgZ3Vlc3QgdG9rZW4gaWYgcHJvdmlkZWRcbiAgICAgIHRoaXMuZ3Vlc3RUb2tlbiA9IHJlc3BvbnNlLmRhdGEuZ3Vlc3RfdG9rZW4gfHwgbnVsbDtcbiAgICAgIHRoaXMuaXNGaW5hbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgLy8gU3RvcmUgcG9zc2libGUgcXVlcmllcyBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChcbiAgICAgICAgcmVzcG9uc2UuZGF0YS5hZ2VudF9wb3NzaWJsZV9xdWVyaWVzICYmXG4gICAgICAgIHJlc3BvbnNlLmRhdGEuYWdlbnRfcG9zc2libGVfcXVlcmllcy5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5wb3NzaWJsZVF1ZXJpZXMgPSByZXNwb25zZS5kYXRhLmFnZW50X3Bvc3NpYmxlX3F1ZXJpZXMuZmlsdGVyKFxuICAgICAgICAgIChxdWVyeSkgPT4gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiICYmIHF1ZXJ5LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFueURhdGE6IGFueSA9IHJlc3BvbnNlLmRhdGEgYXMgYW55O1xuICAgICAgY29uc3QgYWdlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gYW55RGF0YS5hZ2VudF9pZDtcbiAgICAgIHRoaXMuYWdlbnRJZCA9IGFnZW50SWQ7XG4gICAgICBjb25zdCByYXdNZXRhID0gYW55RGF0YS5hZ2VudF9jaGF0X2lucHV0X21ldGFkYXRhO1xuICAgICAgaWYgKFxuICAgICAgICByYXdNZXRhICE9IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIHJhd01ldGEgPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KHJhd01ldGEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jaGF0SW5wdXRNZXRhZGF0YSA9IHsgLi4ucmF3TWV0YSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jaGF0SW5wdXRNZXRhZGF0YSA9IHt9O1xuICAgICAgfVxuICAgICAgdGhpcy5wZXJzaXN0QW5kRW1pdEFnZW50TWV0YWRhdGEodGhpcy5jaGF0SW5wdXRNZXRhZGF0YSk7XG4gICAgICBjb25zdCB3ZWxjb21lVGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGFueURhdGEuYWdlbnRfd2VsY29tZV90aXRsZTtcbiAgICAgIGNvbnN0IHdlbGNvbWVJbWFnZVVybDogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgICAgYW55RGF0YS5hZ2VudF93ZWxjb21lX2ltYWdlX3VybDtcbiAgICAgIGNvbnN0IHRoaW5raW5nUGhyYXNlczogc3RyaW5nW10gfCB1bmRlZmluZWQgPVxuICAgICAgICBhbnlEYXRhLmFnZW50X3RoaW5raW5nX3BocmFzZXM7XG4gICAgICBjb25zdCB0aGlua2luZ0RlbGF5U2VjOiBudW1iZXIgfCB1bmRlZmluZWQgPVxuICAgICAgICBhbnlEYXRhLmFnZW50X3RoaW5raW5nX3BocmFzZV9kZWxheTtcblxuICAgICAgdGhpcy53ZWxjb21lRGF0YSA9IHtcbiAgICAgICAgdGl0bGU6IHdlbGNvbWVUaXRsZSB8fCBudWxsLFxuICAgICAgICBtZXNzYWdlOiBudWxsLFxuICAgICAgICBpbWFnZVVybDogd2VsY29tZUltYWdlVXJsIHx8IG51bGwsXG4gICAgICAgIHBvc3NpYmxlUXVlcmllczogdGhpcy5wb3NzaWJsZVF1ZXJpZXMsXG4gICAgICB9O1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlua2luZ1BocmFzZXMpICYmIHRoaW5raW5nUGhyYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudGhpbmtpbmdDb25maWcucGhyYXNlcyA9IHRoaW5raW5nUGhyYXNlcztcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdGhpbmtpbmdEZWxheVNlYyA9PT0gXCJudW1iZXJcIiAmJiB0aGlua2luZ0RlbGF5U2VjID49IDApIHtcbiAgICAgICAgdGhpcy50aGlua2luZ0NvbmZpZy5kZWxheU1zID0gTWF0aC5tYXgoXG4gICAgICAgICAgMjUwLFxuICAgICAgICAgIE1hdGgucm91bmQodGhpbmtpbmdEZWxheVNlYyAqIDEwMDApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy53ZWxjb21lRGF0YS5pbWFnZVVybCAmJiBhZ2VudElkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hXZWxjb21lSW1hZ2UoYWdlbnRJZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgYWdlbnQgd2VsY29tZSBtZXNzYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuYWdlbnRfd2VsY29tZV9tZXNzYWdlICYmIHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKSAvIDEwMDA7XG4gICAgICAgIGNvbnN0IHdlbGNvbWVNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICBjcmVhdGVfdGltZTogbm93LFxuICAgICAgICAgIHN0YXJ0X3RpbWU6IG5vdyAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSwgLy8gUmVsYXRpdmUgdG8gY29udmVyc2F0aW9uIHN0YXJ0XG4gICAgICAgICAgZW5kX3RpbWU6IG5vdyAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSArIDAuMDEsIC8vIFJlbGF0aXZlIHRvIGNvbnZlcnNhdGlvbiBzdGFydFxuICAgICAgICAgIHNwZWFrZXI6IFwiYWdlbnRcIixcbiAgICAgICAgICB0ZXh0OiByZXNwb25zZS5kYXRhLmFnZW50X3dlbGNvbWVfbWVzc2FnZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy53ZWxjb21lRGF0YS5tZXNzYWdlID0gcmVzcG9uc2UuZGF0YS5hZ2VudF93ZWxjb21lX21lc3NhZ2U7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIod2VsY29tZU1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy53ZWxjb21lRGF0YUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy53ZWxjb21lRGF0YUhhbmRsZXIodGhpcy53ZWxjb21lRGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2F2ZUNvbnZlcnNhdGlvbigpO1xuICAgICAgaWYgKHRoaXMudXNlV3MpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0V2ViU29ja2V0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5jb252ZXJzYXRpb25faWQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKHRoaXMuaXNUb2tlbkV4cGlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgdGhpcy5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRbXSxcbiAgICBleHRyYU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICByZUNhcHRjaGFUb2tlbj86IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29udmVyc2F0aW9uSWQgfHwgIXRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udmVyc2F0aW9uIG5vdCBzdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCkgLyAxMDAwO1xuICAgIGNvbnN0IGNoYXRNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgIGNyZWF0ZV90aW1lOiBub3csXG4gICAgICBzdGFydF90aW1lOiBub3cgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUsIC8vIFJlbGF0aXZlIHRvIGNvbnZlcnNhdGlvbiBzdGFydFxuICAgICAgZW5kX3RpbWU6IG5vdyAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZSArIDAuMDEsIC8vIFJlbGF0aXZlIHRvIGNvbnZlcnNhdGlvbiBzdGFydFxuICAgICAgc3BlYWtlcjogXCJjdXN0b21lclwiLFxuICAgICAgdGV4dDogbWVzc2FnZSxcbiAgICAgIGF0dGFjaG1lbnRzOiBhdHRhY2htZW50cyxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIoY2hhdE1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0Qm9keTogYW55ID0ge1xuICAgICAgICBtZXNzYWdlczogW2NoYXRNZXNzYWdlXSxcbiAgICAgICAgcmVjb3JkZWRfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZUNhcHRjaGFUb2tlbikge1xuICAgICAgICByZXF1ZXN0Qm9keS5yZWNhcHRjaGFfdG9rZW4gPSByZUNhcHRjaGFUb2tlbjtcbiAgICAgIH1cblxuICAgICAgLy8gSW5jbHVkZSBtZXRhZGF0YVxuICAgICAgY29uc3QgbWVyZ2VkTWV0YWRhdGEgPSB7XG4gICAgICAgIC4uLih0aGlzLm1ldGFkYXRhIHx8IHt9KSxcbiAgICAgICAgLi4uKGV4dHJhTWV0YWRhdGEgfHwge30pLFxuICAgICAgfTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhtZXJnZWRNZXRhZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICByZXF1ZXN0Qm9keS5tZXRhZGF0YSA9IG1lcmdlZE1ldGFkYXRhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBhdGNoKFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9jb252ZXJzYXRpb25zL2luLXByb2dyZXNzL3VwZGF0ZS8ke3RoaXMuY29udmVyc2F0aW9uSWR9YCxcbiAgICAgICAgcmVxdWVzdEJvZHksXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSxcbiAgICAgICAgfVxuICAgICAgKS5jYXRjaChlID0+IHtcbiAgICAgICAgY29uc3QgZXJyID0gZT8ucmVzcG9uc2U/LmRhdGE7XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvciB3aGVuIGNvbnZlcnNhdGlvbiBpcyBmaW5hbGl6ZWRcbiAgICAgICAgaWYgKGVycj8uZXJyb3Jfa2V5ID09PSAnQ09OVkVSU0FUSU9OX0ZJTkFMSVpFRCcpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUNvbnZlcnNhdGlvbkZpbmFsaXplZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiBub3QgdXNpbmcgV2ViU29ja2V0LCB0cnkgdG8gcmV0cmlldmUgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgZnJvbSB0aGUgdXBkYXRlIGNvbnZlcnNhdGlvbiByZXNwb25zZVxuICAgICAgaWYgKCF0aGlzLnVzZVdzICYmIHRoaXMubWVzc2FnZUhhbmRsZXIgJiYgKCF0aGlzLnVzZVdzIHx8ICF0aGlzLnVzZVBvbGwpKSB7IC8vIHVzZVBvbGwgaXMgdHJ1ZSB3aGVuIHVzaW5nIGhlYXJ0YmVhdCBwb2xsaW5nXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2U/LmRhdGEgYXMgYW55IHx8IHt9O1xuXG4gICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YS5tZXNzYWdlcyAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlRGF0YS5tZXNzYWdlcykpIHtcblxuICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlIGxhdGVzdCBhZ2VudCBtZXNzYWdlIGluIHRoZSByZXNwb25zZVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJlc3BvbnNlRGF0YS5tZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlRGF0YSA9IHJlc3BvbnNlRGF0YS5tZXNzYWdlc1tpXTtcblxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWVzc2FnZURhdGEuc3BlYWtlciA9PT0gXCJhZ2VudFwiICYmXG4gICAgICAgICAgICAgICAgbWVzc2FnZURhdGEudGV4dCAmJlxuICAgICAgICAgICAgICAgIG1lc3NhZ2VEYXRhLmNyZWF0ZV90aW1lICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBtZXNzYWdlRGF0YS5zdGFydF90aW1lICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBtZXNzYWdlRGF0YS5lbmRfdGltZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFnZW50TWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICBjcmVhdGVfdGltZTogbWVzc2FnZURhdGEuY3JlYXRlX3RpbWUsXG4gICAgICAgICAgICAgICAgICBzdGFydF90aW1lOiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWVcbiAgICAgICAgICAgICAgICAgICAgPyBtZXNzYWdlRGF0YS5zdGFydF90aW1lIC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lXG4gICAgICAgICAgICAgICAgICAgIDogbWVzc2FnZURhdGEuc3RhcnRfdGltZSxcbiAgICAgICAgICAgICAgICAgIGVuZF90aW1lOiB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWVcbiAgICAgICAgICAgICAgICAgICAgPyBtZXNzYWdlRGF0YS5lbmRfdGltZSAtIHRoaXMuY29udmVyc2F0aW9uQ3JlYXRlVGltZVxuICAgICAgICAgICAgICAgICAgICA6IG1lc3NhZ2VEYXRhLmVuZF90aW1lLFxuICAgICAgICAgICAgICAgICAgc3BlYWtlcjogXCJhZ2VudFwiLFxuICAgICAgICAgICAgICAgICAgdGV4dDogbWVzc2FnZURhdGEudGV4dCxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IG1lc3NhZ2VEYXRhLm1lc3NhZ2VfaWQgfHwgbWVzc2FnZURhdGEuaWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VzcyBpZiB0aGlzIGlzIGEgbmV3IG1lc3NhZ2Ugd2UgaGF2ZW4ndCBzZWVuIGJlZm9yZVxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IGVhc2lseSBjaGVjayBoZXJlLCBzbyB3ZSdsbCBsZXQgdGhlIGhhbmRsZXIgbWFuYWdlIGR1cGxpY2F0ZXNcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyKGFnZW50TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIHVwZGF0ZSBjb252ZXJzYXRpb24gcmVzcG9uc2U6XCIsIHBhcnNlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHRva2VuIGV4cGlyYXRpb24gZXJyb3JcbiAgICAgIGlmICh0aGlzLmlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHRoaXMucmVzZXRDaGF0Q29udmVyc2F0aW9uKCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIHRoZSBhZ2VudCBpbmFjdGl2ZSBlcnJvclxuICAgICAgaWYgKFxuICAgICAgICBlcnJvci5yZXNwb25zZSAmJlxuICAgICAgICBlcnJvci5yZXNwb25zZS5kYXRhICYmXG4gICAgICAgIGVycm9yLnJlc3BvbnNlLmRhdGEuZXJyb3Jfa2V5ID09PSBcIkFHRU5UX0lOQUNUSVZFXCJcbiAgICAgICkge1xuICAgICAgICAvLyBDcmVhdGUgYSBjdXN0b20gbWVzc2FnZSBmb3IgdGhlIGFnZW50IGluYWN0aXZlIGVycm9yXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGNyZWF0ZV90aW1lOiBub3csXG4gICAgICAgICAgICBzdGFydF90aW1lOiBub3cgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUsXG4gICAgICAgICAgICBlbmRfdGltZTogbm93IC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lICsgMC4wMSxcbiAgICAgICAgICAgIHNwZWFrZXI6IFwic3BlY2lhbFwiLFxuICAgICAgICAgICAgdGV4dDogdGhpcy5zZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UgPz8gXCJUaGUgYWdlbnQgaXMgY3VycmVudGx5IG9mZmxpbmUsIHBsZWFzZSBjaGVjayBiYWNrIGxhdGVyLiBUaGFuayB5b3UhXCIsXG4gICAgICAgICAgICAuLi4odGhpcy5zZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwgJiYge1xuICAgICAgICAgICAgICBsaW5rVXJsOiB0aGlzLnNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgICAgICAgbGlua0xhYmVsOiB0aGlzLnNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsID8/IFwiQ29udGFjdCBzdXBwb3J0XCIsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEb24ndCB0aHJvdyB0aGUgZXJyb3Igc2luY2Ugd2UgaGFuZGxlZCBpdCB3aXRoIGEgbWVzc2FnZVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwbG9hZEZpbGUoY2hhdElkOiBzdHJpbmcsIGZpbGU6IEZpbGUpOiBQcm9taXNlPEZpbGVVcGxvYWRSZXNwb25zZSB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnZlcnNhdGlvbiBub3Qgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZChcImNoYXRfaWRcIiwgY2hhdElkKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlXCIsIGZpbGUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdDxGaWxlVXBsb2FkUmVzcG9uc2U+KFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9L2FwaS9nZW5hZ2VudC9rbm93bGVkZ2UvdXBsb2FkLWNoYXQtZmlsZWAsXG4gICAgICAgIGZvcm1EYXRhLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiKSxcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEgYXMgRmlsZVVwbG9hZFJlc3BvbnNlO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLmlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHRoaXMucmVzZXRDaGF0Q29udmVyc2F0aW9uKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBjb25uZWN0V2ViU29ja2V0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy51c2VXcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndlYlNvY2tldCkge1xuICAgICAgdGhpcy53ZWJTb2NrZXQuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnZlcnNhdGlvbiBJRCBpcyByZXF1aXJlZCBmb3IgV2ViU29ja2V0IGNvbm5lY3Rpb25cIik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXRlSGFuZGxlcikgdGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyKFwiY29ubmVjdGluZ1wiKTtcblxuICAgIC8vIEJ1aWxkIFdlYlNvY2tldCBVUkwgd2l0aCBwcm9wZXIgYXV0aGVudGljYXRpb25cbiAgICBjb25zdCB3c0Jhc2UgPSB0aGlzLmJhc2VVcmwucmVwbGFjZShcImh0dHBcIiwgXCJ3c1wiKTtcbiAgICBjb25zdCB0b3BpY3MgPSBbXCJtZXNzYWdlXCIsIFwidGFrZW92ZXJcIiwgXCJmaW5hbGl6ZVwiXTtcbiAgICBjb25zdCB0b3BpY3NRdWVyeSA9IHRvcGljcy5tYXAoKHQpID0+IGB0b3BpY3M9JHt0fWApLmpvaW4oXCImXCIpO1xuXG4gICAgLy8gVXNlIGd1ZXN0X3Rva2VuIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBhcGlfa2V5XG4gICAgY29uc3QgYXV0aFBhcmFtID0gdGhpcy5ndWVzdFRva2VuXG4gICAgICA/IGBhY2Nlc3NfdG9rZW49JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5ndWVzdFRva2VuKX1gXG4gICAgICA6IGBhcGlfa2V5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYXBpS2V5KX1gO1xuXG4gICAgbGV0IHdzVXJsID0gYCR7d3NCYXNlfS9hcGkvY29udmVyc2F0aW9ucy93cy8ke3RoaXMuY29udmVyc2F0aW9uSWR9PyR7YXV0aFBhcmFtfSZsYW5nPWVuJiR7dG9waWNzUXVlcnl9YDtcblxuICAgIC8vIEFkZCB0ZW5hbnQgYXMgcXVlcnkgcGFyYW1ldGVyIGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMudGVuYW50KSB7XG4gICAgICB3c1VybCArPSBgJngtdGVuYW50LWlkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMudGVuYW50KX1gO1xuICAgIH1cblxuICAgIC8vIFVzZSBuYXRpdmUgYnJvd3NlciBXZWJTb2NrZXQgZmFjdG9yeVxuICAgIHRoaXMud2ViU29ja2V0ID0gY3JlYXRlV2ViU29ja2V0KHdzVXJsKTtcblxuXG4gICAgdGhpcy53ZWJTb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXRlSGFuZGxlcikgdGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyKFwiY29ubmVjdGVkXCIpO1xuICAgIH07XG5cbiAgICB0aGlzLndlYlNvY2tldC5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSBhcyBzdHJpbmcpO1xuXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09IFwibWVzc2FnZVwiICYmIHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnBheWxvYWQpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGRhdGEucGF5bG9hZCBhcyBDaGF0TWVzc2FnZVtdO1xuICAgICAgICAgICAgLy8gQWRqdXN0IHRpbWVzdGFtcHMgdG8gYmUgcmVsYXRpdmUgdG8gY29udmVyc2F0aW9uIHN0YXJ0XG4gICAgICAgICAgICAvLyBBbHNvIG5vcm1hbGl6ZSBtZXNzYWdlX2lkIGZpZWxkIChiYWNrZW5kIG1pZ2h0IHNlbmQgJ2lkJyBpbnN0ZWFkIG9mICdtZXNzYWdlX2lkJylcbiAgICAgICAgICAgIGNvbnN0IGFkanVzdGVkTWVzc2FnZXMgPSBtZXNzYWdlc1xuICAgICAgICAgICAgICAubWFwKChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhZGp1c3RlZCA9IHRoaXMuYWRqdXN0TWVzc2FnZVRpbWVzdGFtcHMobXNnKTtcbiAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemU6IGlmIGJhY2tlbmQgc2VuZHMgJ2lkJywgdXNlIGl0IGFzICdtZXNzYWdlX2lkJ1xuICAgICAgICAgICAgICAgIGlmICghYWRqdXN0ZWQubWVzc2FnZV9pZCAmJiAobXNnIGFzIGFueSkuaWQpIHtcbiAgICAgICAgICAgICAgICAgIGFkanVzdGVkLm1lc3NhZ2VfaWQgPSAobXNnIGFzIGFueSkuaWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhZGp1c3RlZDtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobXNnKSA9PiBtc2cuc3BlYWtlciAhPT0gXCJjdXN0b21lclwiKTtcbiAgICAgICAgICAgIGFkanVzdGVkTWVzc2FnZXMuZm9yRWFjaCh0aGlzLm1lc3NhZ2VIYW5kbGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYWRqdXN0ZWRNZXNzYWdlID0gdGhpcy5hZGp1c3RNZXNzYWdlVGltZXN0YW1wcyhcbiAgICAgICAgICAgICAgZGF0YS5wYXlsb2FkIGFzIENoYXRNZXNzYWdlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gTm9ybWFsaXplOiBpZiBiYWNrZW5kIHNlbmRzICdpZCcsIHVzZSBpdCBhcyAnbWVzc2FnZV9pZCdcbiAgICAgICAgICAgIGlmICghYWRqdXN0ZWRNZXNzYWdlLm1lc3NhZ2VfaWQgJiYgKGRhdGEucGF5bG9hZCBhcyBhbnkpLmlkKSB7XG4gICAgICAgICAgICAgIGFkanVzdGVkTWVzc2FnZS5tZXNzYWdlX2lkID0gKGRhdGEucGF5bG9hZCBhcyBhbnkpLmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFkanVzdGVkTWVzc2FnZS5zcGVha2VyICE9PSBcImN1c3RvbWVyXCIpIHtcbiAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcihhZGp1c3RlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09IFwidGFrZW92ZXJcIikge1xuICAgICAgICAgIHRoaXMuaGFuZGxlVGFrZW92ZXIoKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09IFwiZmluYWxpemVcIikge1xuICAgICAgICAgIHRoaXMuaGFuZGxlQ29udmVyc2F0aW9uRmluYWxpemVkKCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLndlYlNvY2tldC5vbmVycm9yID0gKGVycm9yOiBFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXRlSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyKFwiZGlzY29ubmVjdGVkXCIpO1xuXG4gICAgICAvLyBMb2cgZGlhZ25vc3RpY1xuICAgICAgY29uc3QgZGlhZ25vc3RpYyA9IGNyZWF0ZVdlYlNvY2tldERpYWdub3N0aWMoZXJyb3IsIHdzVXJsKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtHZW5Bc3Npc3QgQ2hhdF0gJHtkaWFnbm9zdGljfWApO1xuICAgIH07XG5cbiAgICB0aGlzLndlYlNvY2tldC5vbmNsb3NlID0gKGV2ZW50OiBDbG9zZUV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdGVIYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoXCJkaXNjb25uZWN0ZWRcIik7XG5cbiAgICAgIC8vIExvZyBkaWFnbm9zdGljXG4gICAgICBpZiAoIWV2ZW50Lndhc0NsZWFuKSB7XG4gICAgICAgIGNvbnN0IGRpYWdub3N0aWMgPSBjcmVhdGVXZWJTb2NrZXREaWFnbm9zdGljKGV2ZW50LCB3c1VybCk7XG4gICAgICAgIGNvbnNvbGUud2FybihgW0dlbkFzc2lzdCBDaGF0XSAke2RpYWdub3N0aWN9YCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2ViU29ja2V0KSB7XG4gICAgICB0aGlzLndlYlNvY2tldC5jbG9zZSgpO1xuICAgICAgdGhpcy53ZWJTb2NrZXQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hXZWxjb21lSW1hZ2UoYWdlbnRJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGltYWdlUmVzcG9uc2UgPSBhd2FpdCBheGlvcy5nZXQoXG4gICAgICAgIGAke3RoaXMuYmFzZVVybH0vYXBpL2dlbmFnZW50L2FnZW50cy9jb25maWdzLyR7YWdlbnRJZH0vd2VsY29tZS1pbWFnZWAsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSxcbiAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgY29uc3QgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoaW1hZ2VSZXNwb25zZS5kYXRhKTtcbiAgICAgIHRoaXMud2VsY29tZU9iamVjdFVybCA9IGJsb2JVcmw7XG4gICAgICB0aGlzLndlbGNvbWVEYXRhLmltYWdlVXJsID0gYmxvYlVybDtcbiAgICAgIGlmICh0aGlzLndlbGNvbWVEYXRhSGFuZGxlcikge1xuICAgICAgICB0aGlzLndlbGNvbWVEYXRhSGFuZGxlcih0aGlzLndlbGNvbWVEYXRhKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKHRoaXMuaXNUb2tlbkV4cGlyZWRFcnJvcihlcnIpKSB7XG4gICAgICAgIHRoaXMucmVzZXRDaGF0Q29udmVyc2F0aW9uKCk7XG4gICAgICB9XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgZmVlZGJhY2sgdG8gYSBzcGVjaWZpYyBhZ2VudCBtZXNzYWdlIGluIHRoZSBjb252ZXJzYXRpb25cbiAgYXN5bmMgYWRkRmVlZGJhY2soXG4gICAgbWVzc2FnZUlkOiBzdHJpbmcsXG4gICAgZmVlZGJhY2s6IFwiZ29vZFwiIHwgXCJiYWRcIixcbiAgICBmZWVkYmFja19tZXNzYWdlPzogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghbWVzc2FnZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXNzYWdlIElEIGlzIHJlcXVpcmVkIGZvciBmZWVkYmFja1wiKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVXNlIG1lc3NhZ2UgSUQgaW4gdGhlIFVSTCBwYXRoLCBub3QgY29udmVyc2F0aW9uIElEXG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmJhc2VVcmx9L2FwaS9jb252ZXJzYXRpb25zL21lc3NhZ2UvYWRkLWZlZWRiYWNrLyR7bWVzc2FnZUlkfWA7XG4gICAgICAvLyBCb2R5IHNob3VsZCBvbmx5IGNvbnRhaW4gZmVlZGJhY2sgYW5kIGZlZWRiYWNrX21lc3NhZ2UgKG5vIG1lc3NhZ2VfaWQpXG4gICAgICBjb25zdCBwYXlsb2FkOiB7XG4gICAgICAgIGZlZWRiYWNrOiBcImdvb2RcIiB8IFwiYmFkXCI7XG4gICAgICAgIGZlZWRiYWNrX21lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICB9ID0ge1xuICAgICAgICBmZWVkYmFjayxcbiAgICAgIH07XG5cbiAgICAgIGlmIChmZWVkYmFja19tZXNzYWdlKSB7XG4gICAgICAgIHBheWxvYWQuZmVlZGJhY2tfbWVzc2FnZSA9IGZlZWRiYWNrX21lc3NhZ2U7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGF4aW9zLnBhdGNoKHVybCwgcGF5bG9hZCwge1xuICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMoKSxcbiAgICAgIH0pO1xuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKHRoaXMuaXNUb2tlbkV4cGlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgdGhpcy5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZlZWRiYWNrIEFQSSBjYWxsIGZhaWxlZDonLCB7XG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgIHJlc3BvbnNlOiBlcnJvci5yZXNwb25zZT8uZGF0YSxcbiAgICAgICAgc3RhdHVzOiBlcnJvci5yZXNwb25zZT8uc3RhdHVzLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGFkanVzdCBtZXNzYWdlIHRpbWVzdGFtcHMgcmVsYXRpdmUgdG8gY29udmVyc2F0aW9uIHN0YXJ0XG4gIHByaXZhdGUgYWRqdXN0TWVzc2FnZVRpbWVzdGFtcHMobWVzc2FnZTogQ2hhdE1lc3NhZ2UpOiBDaGF0TWVzc2FnZSB7XG4gICAgaWYgKCF0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUpIHtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5tZXNzYWdlLFxuICAgICAgc3RhcnRfdGltZTogbWVzc2FnZS5zdGFydF90aW1lIC0gdGhpcy5jb252ZXJzYXRpb25DcmVhdGVUaW1lLFxuICAgICAgZW5kX3RpbWU6IG1lc3NhZ2UuZW5kX3RpbWUgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKioqKioqKioqKiogSGVhcnRiZWF0IHBvbGxpbmcgKioqKioqKioqKioqL1xuICAvKipcbiAgICogUG9sbCBpbi1wcm9ncmVzcyBjb252ZXJzYXRpb24gKGhlYXJ0YmVhdCB3aGVuIFdlYlNvY2tldCBpcyBkaXNhYmxlZCkuXG4gICAqIFJldHVybnMgc3RhdHVzIGFuZCBtZXNzYWdlcyBub3JtYWxpemVkIHRvIENoYXRNZXNzYWdlW10uXG4gICAqL1xuICBhc3luYyBwb2xsSW5Qcm9ncmVzc0NvbnZlcnNhdGlvbigpOiBQcm9taXNlPHtcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBwb2xsTWVzc2FnZXM6IEluUHJvZ3Jlc3NQb2xsTWVzc2FnZVtdO1xuICB9PiB7XG4gICAgaWYgKCF0aGlzLmNvbnZlcnNhdGlvbklkIHx8ICF0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnZlcnNhdGlvbiBub3Qgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldDxJblByb2dyZXNzUG9sbFJlc3BvbnNlPihcbiAgICAgIGAke3RoaXMuYmFzZVVybH0vYXBpL2NvbnZlcnNhdGlvbnMvaW4tcHJvZ3Jlc3MvcG9sbC8ke3RoaXMuY29udmVyc2F0aW9uSWR9YCxcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCkgfVxuICAgICk7XG5cbiAgICBjb25zdCBwb2xsTWVzc2FnZXMgPSAocmVzcG9uc2UuZGF0YS5tZXNzYWdlcyB8fCBbXSkubWFwKChtKSA9PlxuICAgICAgdGhpcy5ub3JtYWxpemVQb2xsTWVzc2FnZVRvQ2hhdE1lc3NhZ2UobSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgc3RhdHVzOiByZXNwb25zZS5kYXRhLnN0YXR1cywgcG9sbE1lc3NhZ2VzIH07XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVBvbGxNZXNzYWdlVG9DaGF0TWVzc2FnZShtOiBJblByb2dyZXNzUG9sbE1lc3NhZ2UpOiBJblByb2dyZXNzUG9sbE1lc3NhZ2Uge1xuICAgIGxldCBjcmVhdGVUaW1lID1cbiAgICAgIHR5cGVvZiBtLmNyZWF0ZV90aW1lID09PSBcIm51bWJlclwiXG4gICAgICAgID8gbS5jcmVhdGVfdGltZVxuICAgICAgICA6IG0uY3JlYXRlX3RpbWVcbiAgICAgICAgICA/ICtuZXcgRGF0ZShtLmNyZWF0ZV90aW1lKVxuICAgICAgICAgIDogTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgICAvLyBOb3JtYWxpemUgdG8gc2Vjb25kczogSVNPIHN0cmluZyBnaXZlcyBtcyAoPjFlMTIpOyBpZiBzbyBjb252ZXJ0LiBPdGhlcndpc2UgYXNzdW1lIGFscmVhZHkgc2Vjb25kcy5cbiAgICBpZiAoY3JlYXRlVGltZSA+PSAxZTEyKSB7XG4gICAgICBjcmVhdGVUaW1lID0gTWF0aC5yb3VuZChjcmVhdGVUaW1lIC8gMTAwMCk7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0VGltZSA9XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgIT0gbnVsbFxuICAgICAgICA/IGNyZWF0ZVRpbWUgLSB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWVcbiAgICAgICAgOiBtLnN0YXJ0X3RpbWU7XG4gICAgY29uc3QgZW5kVGltZSA9XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbkNyZWF0ZVRpbWUgIT0gbnVsbFxuICAgICAgICA/IHN0YXJ0VGltZSArIChtLmVuZF90aW1lIC0gbS5zdGFydF90aW1lKSB8fCAwLjAxXG4gICAgICAgIDogbS5lbmRfdGltZTtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IG0uaWQsXG4gICAgICBjcmVhdGVfdGltZTogY3JlYXRlVGltZSxcbiAgICAgIHN0YXJ0X3RpbWU6IHN0YXJ0VGltZSxcbiAgICAgIGVuZF90aW1lOiBlbmRUaW1lLFxuICAgICAgc3BlYWtlcjogbS5zcGVha2VyIGFzIFwiY3VzdG9tZXJcIiB8IFwiYWdlbnRcIiB8IFwic3BlY2lhbFwiLFxuICAgICAgdGV4dDogbS50ZXh0LFxuICAgICAgdHlwZTogbS50eXBlLFxuICAgICAgZmVlZGJhY2s6IG0uZmVlZGJhY2ssXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIG5vdGlmeVRha2VvdmVyRnJvbVBvbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUG9sbCBhbHJlYWR5IGFkZHMgdGhlIFwiU3VwZXJ2aXNvciB0b29rIG92ZXJcIiBtZXNzYWdlIGZyb20gdGhlIG1lc3NhZ2UgbGlzdC5cbiAgICAvLyBPbmx5IHJ1biB0aGUgaGFuZGxlciBzbyBVSSBzdGF0ZSB1cGRhdGVzOyBkbyBub3QgY2FsbCBoYW5kbGVUYWtlb3ZlcigpIG9yIHdlIGR1cGxpY2F0ZSB0aGUgbWVzc2FnZS5cbiAgICBpZiAodGhpcy50YWtlb3ZlckhhbmRsZXIpIHtcbiAgICAgIHRoaXMudGFrZW92ZXJIYW5kbGVyKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbm90aWZ5RmluYWxpemVkRnJvbVBvbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUG9sbCBhbHJlYWR5IGFkZHMgdGhlIFwiQ29udmVyc2F0aW9uIEZpbmFsaXplZFwiIG1lc3NhZ2UgZnJvbSB0aGUgbWVzc2FnZSBsaXN0LlxuICAgIC8vIE9ubHkgdXBkYXRlIHN0YXRlIGFuZCBydW4gdGhlIGhhbmRsZXI7IGRvIG5vdCBjYWxsIGhhbmRsZUNvbnZlcnNhdGlvbkZpbmFsaXplZCgpIG9yIHdlIGR1cGxpY2F0ZSB0aGUgbWVzc2FnZS5cbiAgICBpZiAodGhpcy5maW5hbGl6ZWRIYW5kbGVyKSB7XG4gICAgICB0aGlzLmZpbmFsaXplZEhhbmRsZXIoKTtcbiAgICB9XG4gICAgdGhpcy5pc0ZpbmFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5zYXZlQ29udmVyc2F0aW9uKCk7XG4gIH1cblxuICAvKioqKioqIEVuZCBvZiBIZWFydGJlYXQgcG9sbGluZyAqKioqKioqKioqKiovXG59XG4iXX0=
|
package/dist/types/index.d.ts
CHANGED
|
@@ -97,6 +97,7 @@ export interface GenAgentChatProps {
|
|
|
97
97
|
tenant: string | undefined;
|
|
98
98
|
metadata?: Record<string, any>;
|
|
99
99
|
useWs?: boolean;
|
|
100
|
+
usePoll?: boolean;
|
|
100
101
|
onError?: (error: Error) => void;
|
|
101
102
|
onTakeover?: () => void;
|
|
102
103
|
onFinalize?: () => void;
|
|
@@ -135,6 +136,10 @@ export interface GenAgentChatProps {
|
|
|
135
136
|
serverUnavailableMessage?: string;
|
|
136
137
|
serverUnavailableContactUrl?: string;
|
|
137
138
|
serverUnavailableContactLabel?: string;
|
|
139
|
+
inputDisclaimer?: string | React.ReactNode;
|
|
140
|
+
onConfigLoaded?: (props: {
|
|
141
|
+
chatInputMetadata?: Record<string, any>;
|
|
142
|
+
}) => void;
|
|
138
143
|
}
|
|
139
144
|
export type AllowedExtension = 'image/*' | 'image/png' | 'image/jpeg' | 'image/jpg' | 'image/gif' | 'application/pdf' | 'application/msword' | 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
|
|
140
145
|
export type { Translations } from '../utils/i18n';
|
|
@@ -146,3 +151,20 @@ export interface FileUploadResponse {
|
|
|
146
151
|
file_url: string;
|
|
147
152
|
file_id?: string;
|
|
148
153
|
}
|
|
154
|
+
/** Message shape returned by in-progress poll API (backend uses datetime for create_time) */
|
|
155
|
+
export interface InProgressPollMessage {
|
|
156
|
+
id: string;
|
|
157
|
+
create_time?: string | number;
|
|
158
|
+
start_time: number;
|
|
159
|
+
end_time: number;
|
|
160
|
+
speaker: string;
|
|
161
|
+
text: string;
|
|
162
|
+
type?: string;
|
|
163
|
+
sequence_number?: number;
|
|
164
|
+
feedback?: MessageFeedback[];
|
|
165
|
+
}
|
|
166
|
+
/** Response from GET /api/conversations/in-progress/poll/{conversation_id} */
|
|
167
|
+
export interface InProgressPollResponse {
|
|
168
|
+
status: string;
|
|
169
|
+
messages: InProgressPollMessage[];
|
|
170
|
+
}
|