genassist-chat-react 1.0.37 → 1.0.38
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 +26 -4
- package/dist/components/AudioPlayer.d.ts +11 -0
- package/dist/components/AudioPlayer.js +199 -0
- package/dist/components/ChatMessage.d.ts +3 -0
- package/dist/components/ChatMessage.js +5 -4
- package/dist/components/GenAgentChat.js +147 -838
- package/dist/components/VoiceInput.d.ts +1 -3
- package/dist/components/VoiceInput.js +262 -48
- package/dist/hooks/useAudioRecorder.d.ts +8 -0
- package/dist/hooks/useAudioRecorder.js +124 -0
- package/dist/hooks/useChat.d.ts +1 -0
- package/dist/hooks/useChat.js +45 -9
- package/dist/hooks/useFileAttachments.d.ts +16 -0
- package/dist/hooks/useFileAttachments.js +183 -0
- package/dist/hooks/useScrollManagement.d.ts +15 -0
- package/dist/hooks/useScrollManagement.js +124 -0
- package/dist/hooks/useThinkingAnimation.d.ts +12 -0
- package/dist/hooks/useThinkingAnimation.js +53 -0
- package/dist/hooks/useViewportManager.d.ts +20 -0
- package/dist/hooks/useViewportManager.js +100 -0
- package/dist/services/chatService.d.ts +1 -0
- package/dist/services/chatService.js +67 -12
- package/dist/styles/genAgentChatStyles.d.ts +80 -0
- package/dist/styles/genAgentChatStyles.js +427 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +1 -1
- package/package.json +6 -2
package/dist/hooks/useChat.js
CHANGED
|
@@ -678,7 +678,6 @@ export var useChat = function (_a) {
|
|
|
678
678
|
setThinkingDelayMs(thinking.delayMs || 1000);
|
|
679
679
|
}
|
|
680
680
|
if (chatServiceRef.current.getAvailableLanguages) {
|
|
681
|
-
debugger;
|
|
682
681
|
langs = chatServiceRef.current.getAvailableLanguages();
|
|
683
682
|
if (Array.isArray(langs)) {
|
|
684
683
|
setAvailableLanguages(langs);
|
|
@@ -831,8 +830,44 @@ export var useChat = function (_a) {
|
|
|
831
830
|
serverUnavailableContactUrl,
|
|
832
831
|
serverUnavailableContactLabel,
|
|
833
832
|
]);
|
|
833
|
+
var sendAudioMessage = useCallback(function (audioBlob, audioFormat) { return __awaiter(void 0, void 0, void 0, function () {
|
|
834
|
+
var error_4;
|
|
835
|
+
return __generator(this, function (_a) {
|
|
836
|
+
switch (_a.label) {
|
|
837
|
+
case 0:
|
|
838
|
+
if (!chatServiceRef.current) {
|
|
839
|
+
throw new Error("Chat service not initialized");
|
|
840
|
+
}
|
|
841
|
+
_a.label = 1;
|
|
842
|
+
case 1:
|
|
843
|
+
_a.trys.push([1, 3, 4, 5]);
|
|
844
|
+
setIsLoading(true);
|
|
845
|
+
if (!isTakenOver) {
|
|
846
|
+
setIsAgentTyping(true);
|
|
847
|
+
}
|
|
848
|
+
return [4 /*yield*/, chatServiceRef.current.sendAudioMessage(audioBlob, audioFormat)];
|
|
849
|
+
case 2:
|
|
850
|
+
_a.sent();
|
|
851
|
+
return [3 /*break*/, 5];
|
|
852
|
+
case 3:
|
|
853
|
+
error_4 = _a.sent();
|
|
854
|
+
setIsAgentTyping(false);
|
|
855
|
+
if (isTokenExpiredError(error_4)) {
|
|
856
|
+
resetToInitialState();
|
|
857
|
+
}
|
|
858
|
+
else if (onErrorRef.current && error_4 instanceof Error) {
|
|
859
|
+
onErrorRef.current(error_4);
|
|
860
|
+
}
|
|
861
|
+
return [3 /*break*/, 5];
|
|
862
|
+
case 4:
|
|
863
|
+
setIsLoading(false);
|
|
864
|
+
return [7 /*endfinally*/];
|
|
865
|
+
case 5: return [2 /*return*/];
|
|
866
|
+
}
|
|
867
|
+
});
|
|
868
|
+
}); }, [isTakenOver, isTokenExpiredError, resetToInitialState]);
|
|
834
869
|
var startConversation = useCallback(function (reCaptchaToken) { return __awaiter(void 0, void 0, void 0, function () {
|
|
835
|
-
var key, convId, queries, welcome, thinking, meta,
|
|
870
|
+
var key, convId, queries, welcome, thinking, meta, error_5;
|
|
836
871
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
837
872
|
return __generator(this, function (_h) {
|
|
838
873
|
switch (_h.label) {
|
|
@@ -891,11 +926,11 @@ export var useChat = function (_a) {
|
|
|
891
926
|
});
|
|
892
927
|
return [3 /*break*/, 5];
|
|
893
928
|
case 3:
|
|
894
|
-
|
|
929
|
+
error_5 = _h.sent();
|
|
895
930
|
setConnectionState("disconnected");
|
|
896
931
|
setIsAgentTyping(false);
|
|
897
|
-
if (onErrorRef.current &&
|
|
898
|
-
onErrorRef.current(
|
|
932
|
+
if (onErrorRef.current && error_5 instanceof Error) {
|
|
933
|
+
onErrorRef.current(error_5);
|
|
899
934
|
}
|
|
900
935
|
else {
|
|
901
936
|
// ignore
|
|
@@ -910,7 +945,7 @@ export var useChat = function (_a) {
|
|
|
910
945
|
}); }, []);
|
|
911
946
|
// Add feedback to an agent message
|
|
912
947
|
var addFeedback = useCallback(function (messageId, value, feedbackMessage) { return __awaiter(void 0, void 0, void 0, function () {
|
|
913
|
-
var newFeedback_1,
|
|
948
|
+
var newFeedback_1, error_6;
|
|
914
949
|
return __generator(this, function (_a) {
|
|
915
950
|
switch (_a.label) {
|
|
916
951
|
case 0:
|
|
@@ -943,9 +978,9 @@ export var useChat = function (_a) {
|
|
|
943
978
|
});
|
|
944
979
|
return [3 /*break*/, 4];
|
|
945
980
|
case 3:
|
|
946
|
-
|
|
981
|
+
error_6 = _a.sent();
|
|
947
982
|
if (onErrorRef.current) {
|
|
948
|
-
onErrorRef.current(
|
|
983
|
+
onErrorRef.current(error_6);
|
|
949
984
|
}
|
|
950
985
|
return [3 /*break*/, 4];
|
|
951
986
|
case 4: return [2 /*return*/];
|
|
@@ -956,6 +991,7 @@ export var useChat = function (_a) {
|
|
|
956
991
|
messages: messages,
|
|
957
992
|
isLoading: isLoading,
|
|
958
993
|
sendMessage: sendMessage,
|
|
994
|
+
sendAudioMessage: sendAudioMessage,
|
|
959
995
|
uploadFile: uploadFile,
|
|
960
996
|
resetConversation: resetConversation,
|
|
961
997
|
startConversation: startConversation,
|
|
@@ -977,4 +1013,4 @@ export var useChat = function (_a) {
|
|
|
977
1013
|
chatInputMetadata: chatInputMetadata,
|
|
978
1014
|
};
|
|
979
1015
|
};
|
|
980
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBMkJ0RCxJQUFNLGtDQUFrQyxHQUN0QyxpRUFBaUUsQ0FBQztBQUNwRSxJQUFNLHdDQUF3QyxHQUFHLGlCQUFpQixDQUFDO0FBRW5FLFNBQVMsc0JBQXNCLENBQUMsS0FBVTs7SUFDeEMsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEIsSUFBTSxJQUFJLEdBQUcsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLElBQUksQ0FBQztRQUN6QixJQUNFLElBQUksS0FBSyxhQUFhO1lBQ3RCLElBQUksS0FBSyxjQUFjO1lBQ3ZCLElBQUksS0FBSyxXQUFXO1lBQ3BCLElBQUksS0FBSyx3QkFBd0I7WUFFakMsT0FBTyxJQUFJLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQyxDQUFDLHdFQUF3RTtJQUN2RixDQUFDO0lBQ0QsSUFBTSxNQUFNLEdBQUcsTUFBQSxLQUFLLENBQUMsUUFBUSwwQ0FBRSxNQUFNLENBQUM7SUFDdEMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUNyRCxDQUFDO0FBRUQsTUFBTSxDQUFDLElBQU0sT0FBTyxHQUFHLFVBQUMsRUFnQlQ7UUFmYixPQUFPLGFBQUEsRUFDUCxZQUFZLGtC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LEtBQUssS0FBSyxTQUFTO2dDQUN4QixDQUFDLHVCQUFNLENBQUMsS0FBRSxRQUFRLGtDQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsVUFBRSxhQUFXLGFBQ3ZELENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ1IsQ0FBQyxDQUFDO29CQU5GLENBTUUsQ0FDSCxDQUFDOzs7O29CQUVGLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN2QixVQUFVLENBQUMsT0FBTyxDQUFDLE9BQWMsQ0FBQyxDQUFDO29CQUNyQyxDQUFDOzs7OztTQUVKLEVBQ0QsRUFBRSxDQUNILENBQUM7SUFFRixPQUFPO1FBQ0wsUUFBUSxVQUFBO1FBQ1IsU0FBUyxXQUFBO1FBQ1QsV0FBVyxhQUFBO1FBQ1gsVUFBVSxZQUFBO1FBQ1YsaUJBQWlCLG1CQUFBO1FBQ2pCLGlCQUFpQixtQkFBQTtRQUNqQixlQUFlLGlCQUFBO1FBQ2YsY0FBYyxnQkFBQTtRQUNkLFVBQVUsWUFBQTtRQUNWLGVBQWUsaUJBQUE7UUFDZixXQUFXLGFBQUE7UUFDWCxXQUFXLGFBQUE7UUFDWCxhQUFhLGVBQUE7UUFDYixXQUFXLGFBQUE7UUFDWCxZQUFZLGNBQUE7UUFDWixlQUFlLGlCQUFBO1FBQ2YsY0FBYyxnQkFBQTtRQUNkLG1CQUFtQixxQkFBQTtRQUNuQixlQUFlLGlCQUFBO1FBQ2YsZUFBZSxpQkFBQTtRQUNmLGtCQUFrQixvQkFBQTtRQUNsQixpQkFBaUIsbUJBQUE7S0FDbEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2NoYXRTZXJ2aWNlXCI7XG5pbXBvcnQgeyB1c2VDaGF0V2ViU29ja2V0IH0gZnJvbSBcIi4vdXNlQ2hhdFdlYlNvY2tldFwiO1xuaW1wb3J0IHtcbiAgQ2hhdE1lc3NhZ2UsXG4gIEF0dGFjaG1lbnQsXG4gIE1lc3NhZ2VGZWVkYmFjayxcbiAgSW5Qcm9ncmVzc1BvbGxNZXNzYWdlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VDaGF0UHJvcHMge1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIHdlYnNvY2tldFVybD86IHN0cmluZztcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIHRlbmFudD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvLyAgSWYgZmFsc2UsIHRoZSBjaGF0IHdpbGwgcnVuIGluIEhUVFAtb25seSBtb2RlIChubyBXZWJTb2NrZXQgY29ubmVjdGlvbikuXG4gIHVzZVdzPzogYm9vbGVhbjtcbiAgdXNlUG9sbD86IGJvb2xlYW47XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuICBvbkVycm9yPzogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgb25UYWtlb3Zlcj86ICgpID0+IHZvaWQ7XG4gIG9uRmluYWxpemU/OiAoKSA9PiB2b2lkO1xuICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2U/OiBzdHJpbmc7IC8vIEN1c3RvbSBtZXNzYWdlIHdoZW4gc2VydmVyIGlzIGRvd25cbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsPzogc3RyaW5nOyAvLyBPcHRpb25hbCBVUkwgZm9yIGNvbnRhY3Qvc3VwcG9ydFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbD86IHN0cmluZzsgLy8gTGFiZWwgZm9yIHRoZSBjb250YWN0IGxpbmtcbiAgb25Db25maWdMb2FkZWQ/OiAocHJvcHM6IHsgY2hhdElucHV0TWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0pID0+IHZvaWQ7IC8vIENhbGxiYWNrIGZvciB3aGVuIHRoZSBjaGF0IGlucHV0IG1ldGFkYXRhIGlzIGxvYWRlZFxufVxuXG5jb25zdCBERUZBVUxUX1NFUlZFUl9VTkFWQUlMQUJMRV9NRVNTQUdFID1cbiAgXCJUaGUgc2VydmljZSBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZS4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIjtcbmNvbnN0IERFRkFVTFRfU0VSVkVSX1VOQVZBSUxBQkxFX0NPTlRBQ1RfTEFCRUwgPSBcIkNvbnRhY3Qgc3VwcG9ydFwiO1xuXG5mdW5jdGlvbiBpc05ldHdvcmtPclNlcnZlckVycm9yKGVycm9yOiBhbnkpOiBib29sZWFuIHtcbiAgLy8gTm8gcmVzcG9uc2UgPSBuZXR3b3JrIGVycm9yXG4gIGlmICghZXJyb3IucmVzcG9uc2UpIHtcbiAgICBjb25zdCBjb2RlID0gZXJyb3I/LmNvZGU7XG4gICAgaWYgKFxuICAgICAgY29kZSA9PT0gXCJFUlJfTkVUV09SS1wiIHx8XG4gICAgICBjb2RlID09PSBcIkVDT05OUkVGVVNFRFwiIHx8XG4gICAgICBjb2RlID09PSBcIkVUSU1FRE9VVFwiIHx8XG4gICAgICBjb2RlID09PSBcIkVSUl9DT05ORUNUSU9OX1JFRlVTRURcIlxuICAgIClcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0cnVlOyAvLyBhbnkgcmVxdWVzdCBlcnJvciB3aXRob3V0IHJlc3BvbnNlIGlzIHRyZWF0ZWQgYXMgc2VydmVyL25ldHdvcmsgaXNzdWVcbiAgfVxuICBjb25zdCBzdGF0dXMgPSBlcnJvci5yZXNwb25zZT8uc3RhdHVzO1xuICByZXR1cm4gdHlwZW9mIHN0YXR1cyA9PT0gXCJudW1iZXJcIiAmJiBzdGF0dXMgPj0gNTAwO1xufVxuXG5leHBvcnQgY29uc3QgdXNlQ2hhdCA9ICh7XG4gIGJhc2VVcmwsXG4gIHdlYnNvY2tldFVybCxcbiAgYXBpS2V5LFxuICB0ZW5hbnQsXG4gIG1ldGFkYXRhLFxuICB1c2VXcyA9IHRydWUsXG4gIHVzZVBvbGwgPSBmYWxzZSxcbiAgbGFuZ3VhZ2UsXG4gIG9uRXJyb3IsXG4gIG9uVGFrZW92ZXIsXG4gIG9uRmluYWxpemUsXG4gIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgb25Db25maWdMb2FkZWQsXG59OiBVc2VDaGF0UHJvcHMpID0+IHtcbiAgY29uc3QgW21lc3NhZ2VzLCBzZXRNZXNzYWdlc10gPSB1c2VTdGF0ZTxDaGF0TWVzc2FnZVtdPihbXSk7XG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtwcmVsb2FkZWRBdHRhY2htZW50cywgc2V0UHJlbG9hZGVkQXR0YWNobWVudHNdID0gdXNlU3RhdGU8XG4gICAgQXR0YWNobWVudFtdXG4gID4oW10pO1xuICBjb25zdCBbY29ubmVjdGlvblN0YXRlLCBzZXRDb25uZWN0aW9uU3RhdGVdID0gdXNlU3RhdGU8XG4gICAgXCJjb25uZWN0aW5nXCIgfCBcImNvbm5lY3RlZFwiIHwgXCJkaXNjb25uZWN0ZWRcIlxuICA+KFwiZGlzY29ubmVjdGVkXCIpO1xuICBjb25zdCBbaXNBZ2VudFR5cGluZywgc2V0SXNBZ2VudFR5cGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IGNoYXRTZXJ2aWNlUmVmID0gdXNlUmVmPENoYXRTZXJ2aWNlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtjb252ZXJzYXRpb25JZCwgc2V0Q29udmVyc2F0aW9uSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtndWVzdFRva2VuLCBzZXRHdWVzdFRva2VuXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbcG9zc2libGVRdWVyaWVzLCBzZXRQb3NzaWJsZVF1ZXJpZXNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFtdKTtcbiAgY29uc3QgW3dlbGNvbWVUaXRsZSwgc2V0V2VsY29tZVRpdGxlXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbd2VsY29tZUltYWdlVXJsLCBzZXRXZWxjb21lSW1hZ2VVcmxdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFt3ZWxjb21lTWVzc2FnZSwgc2V0V2VsY29tZU1lc3NhZ2VdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtpbnB1dERpc2NsYWltZXJIdG1sLCBzZXRJbnB1dERpc2NsYWltZXJIdG1sXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbdGhpbmtpbmdQaHJhc2VzLCBzZXRUaGlua2luZ1BocmFzZXNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFtdKTtcbiAgY29uc3QgW3RoaW5raW5nRGVsYXlNcywgc2V0VGhpbmtpbmdEZWxheU1zXSA9IHVzZVN0YXRlPG51bWJlcj4oMTAwMCk7XG4gIGNvbnN0IFthdmFpbGFibGVMYW5ndWFnZXMsIHNldEF2YWlsYWJsZUxhbmd1YWdlc10gPSB1c2VTdGF0ZTxzdHJpbmdbXSB8IG51bGw+KFxuICAgIG51bGwsXG4gICk7XG4gIGNvbnN0IFtjaGF0SW5wdXRNZXRhZGF0YSwgc2V0Q2hhdElucHV0TWV0YWRhdGFdID0gdXNlU3RhdGU8XG4gICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgPih7fSk7XG4gIGNvbnN0IFtpc1Rha2VuT3Zlciwgc2V0SXNUYWtlbk92ZXJdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbaXNGaW5hbGl6ZWQsIHNldElzRmluYWxpemVkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdCBsYW5ndWFnZVJlZiA9IHVzZVJlZihsYW5ndWFnZSk7XG4gIGxhbmd1YWdlUmVmLmN1cnJlbnQgPSBsYW5ndWFnZTtcblxuICAvLyBVbmlmaWVkIFdlYlNvY2tldCBjb25uZWN0aW9uIChyZWNvbm5lY3QsIGtlZXAtYWxpdmUpXG4gIGNvbnN0IG9uV3NNZXNzYWdlID0gdXNlQ2FsbGJhY2soKGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudD8ucHJvY2Vzc1dlYlNvY2tldE1lc3NhZ2UoZGF0YSk7XG4gIH0sIFtdKTtcblxuICB1c2VDaGF0V2ViU29ja2V0KHtcbiAgICBiYXNlVXJsLFxuICAgIHdlYnNvY2tldFVybCxcbiAgICBhcGlLZXksXG4gICAgdGVuYW50LFxuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIGd1ZXN0VG9rZW4sXG4gICAgdXNlV3M6IHVzZVdzID8/IHRydWUsXG4gICAgbGFuZ3VhZ2UsXG4gICAgb25NZXNzYWdlOiBvbldzTWVzc2FnZSxcbiAgICBvbkNvbm5lY3Rpb25TdGF0ZTogc2V0Q29ubmVjdGlvblN0YXRlLFxuICAgIHJlY29ubmVjdDogdHJ1ZSxcbiAgfSk7XG5cbiAgLy8gU2NvcGVkIG1lc3NhZ2VzIGtleSBmb3IgYXBpS2V5LCBjb252ZXJzYXRpb0lkXG4gIGNvbnN0IGJ1aWxkTWVzc2FnZXNLZXkgPSB1c2VDYWxsYmFjayhcbiAgICAoYXBpS2V5VmFsOiBzdHJpbmcsIGNvbnZJZDogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKCFjb252SWQpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGBnZW5hc3Npc3RfY29udmVyc2F0aW9uX21lc3NhZ2VzOiR7YXBpS2V5VmFsfToke2NvbnZJZH1gO1xuICAgIH0sXG4gICAgW10sXG4gICk7XG5cbiAgY29uc3QgdmFsaWRhdGVNZXNzYWdlcyA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSkgPT4ge1xuICAgICAgY29uc3QgaGFzVGFrZU92ZXJNc2cgPSBtZXNzYWdlcy5zb21lKChtKSA9PiBtPy50eXBlID09PSBcInRha2VvdmVyXCIpO1xuICAgICAgY29uc3QgaGFzRmluYWxpemVkTXNnID0gbWVzc2FnZXMuc29tZSgobSkgPT4gbT8udHlwZSA9PT0gXCJmaW5hbGl6ZWRcIik7XG4gICAgICBzZXRJc1Rha2VuT3ZlcihoYXNUYWtlT3Zlck1zZyk7XG4gICAgICBzZXRJc0ZpbmFsaXplZChoYXNGaW5hbGl6ZWRNc2cpO1xuICAgIH0sXG4gICAgW3NldElzVGFrZW5PdmVyLCBzZXRJc0ZpbmFsaXplZF0sXG4gICk7XG5cbiAgLy8gQ2hlY2sgaWYgYW4gZXJyb3IgaXMgYSB0b2tlbiBleHBpcmF0aW9uIGVycm9yICg0MDEgKyBcIlRva2VuIGhhcyBleHBpcmVkLlwiKVxuICBjb25zdCBpc1Rva2VuRXhwaXJlZEVycm9yID0gdXNlQ2FsbGJhY2soKGVycm9yOiBhbnkpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gISEoXG4gICAgICBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDAxICYmXG4gICAgICBlcnJvcj8ucmVzcG9uc2U/LmRhdGEgJiZcbiAgICAgIChlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yID09PSBcIlRva2VuIGhhcyBleHBpcmVkLlwiIHx8XG4gICAgICAgIGVycm9yLnJlc3BvbnNlLmRhdGEubWVzc2FnZSA9PT0gXCJUb2tlbiBoYXMgZXhwaXJlZC5cIiB8fFxuICAgICAgICAodHlwZW9mIGVycm9yLnJlc3BvbnNlLmRhdGEgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICBlcnJvci5yZXNwb25zZS5kYXRhLmluY2x1ZGVzKFwiVG9rZW4gaGFzIGV4cGlyZWRcIikpKVxuICAgICk7XG4gIH0sIFtdKTtcblxuICAvLyBSZXNldCBjb252ZXJzYXRpb24gc3RhdGUgdG8gaW5pdGlhbCAoZS5nLiBhZnRlciB0b2tlbiBleHBpcmF0aW9uKVxuICBjb25zdCByZXNldFRvSW5pdGlhbFN0YXRlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldENvbnZlcnNhdGlvbklkKG51bGwpO1xuICAgIHNldEd1ZXN0VG9rZW4obnVsbCk7XG4gICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgIHNldElzVGFrZW5PdmVyKGZhbHNlKTtcbiAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJkaXNjb25uZWN0ZWRcIik7XG4gICAgc2V0V2VsY29tZVRpdGxlKG51bGwpO1xuICAgIHNldFdlbGNvbWVJbWFnZVVybChudWxsKTtcbiAgICBzZXRXZWxjb21lTWVzc2FnZShudWxsKTtcbiAgICBzZXRJbnB1dERpc2NsYWltZXJIdG1sKG51bGwpO1xuICAgIHNldFBvc3NpYmxlUXVlcmllcyhbXSk7XG4gICAgc2V0VGhpbmtpbmdQaHJhc2VzKFtdKTtcbiAgICBzZXRUaGlua2luZ0RlbGF5TXMoMTAwMCk7XG4gICAgc2V0Q2hhdElucHV0TWV0YWRhdGEoe30pO1xuICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50ID0gMDtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmIChrZXkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgIH1cbiAgfSwgW2FwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBEZWVwIGNvbXBhcmUgbWV0YWRhdGEgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1pbml0aWFsaXphdGlvbnNcbiAgLy8gT25seSByZS1pbml0aWFsaXplIGlmIG1ldGFkYXRhIGFjdHVhbGx5IGNoYW5nZXMgKGJ5IHZhbHVlLCBub3QgcmVmZXJlbmNlKVxuICBjb25zdCBtZXRhZGF0YVN0cmluZyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEgfHwge30pLFxuICAgIFttZXRhZGF0YV0sXG4gICk7XG4gIGNvbnN0IHByZXZCYXNlVXJsUmVmID0gdXNlUmVmPHN0cmluZz4oYmFzZVVybCk7XG4gIGNvbnN0IHByZXZXZWJzb2NrZXRVcmxSZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih3ZWJzb2NrZXRVcmwpO1xuICBjb25zdCBwcmV2QXBpS2V5UmVmID0gdXNlUmVmPHN0cmluZz4oYXBpS2V5KTtcbiAgY29uc3QgcHJldlRlbmFudFJlZiA9IHVzZVJlZjxzdHJpbmcgfCB1bmRlZmluZWQ+KHRlbmFudCk7XG4gIGNvbnN0IHByZXZVc2VXc1JlZiA9IHVzZVJlZjxib29sZWFuPih1c2VXcyk7XG4gIGNvbnN0IHByZXZVc2VQb2xsUmVmID0gdXNlUmVmPGJvb2xlYW4+KHVzZVBvbGwpO1xuXG4gIC8vIEhlYXJ0YmVhdCBwb2xsaW5nIHN0YXRlICh3aGVuIFdlYlNvY2tldCBpcyBkaXNhYmxlZClcbiAgY29uc3QgaGVhcnRiZWF0RmFpbHVyZUNvdW50UmVmID0gdXNlUmVmPG51bWJlcj4oMCk7XG4gIGNvbnN0IGhlYXJ0YmVhdEludGVydmFsUmVmID0gdXNlUmVmPG51bWJlcj4oMCk7XG4gIGNvbnN0IGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmID0gdXNlUmVmPG51bWJlcj4oMCk7XG4gIC8vIFJlZnMgc28gd2Ugb25seSBydW4gdGFrZW92ZXIvZmluYWxpemVkIG9uY2UgcGVyIGNvbnZlcnNhdGlvbiAoYXZvaWQgc3RhbGUgaXNUYWtlbk92ZXIvaXNGaW5hbGl6ZWQgaW4gcG9sbCBjbG9zdXJlKVxuICBjb25zdCB0YWtlb3ZlclByb2Nlc3NlZFJlZiA9IHVzZVJlZjxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IGZpbmFsaXplZFByb2Nlc3NlZFJlZiA9IHVzZVJlZjxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gU3RvcmUgY2FsbGJhY2tzIGluIHJlZnMgc28gdGhleSBkb24ndCB0cmlnZ2VyIHJlLWluaXRpYWxpemF0aW9uXG4gIGNvbnN0IG9uRXJyb3JSZWYgPSB1c2VSZWYob25FcnJvcik7XG4gIGNvbnN0IG9uVGFrZW92ZXJSZWYgPSB1c2VSZWYob25UYWtlb3Zlcik7XG4gIGNvbnN0IG9uRmluYWxpemVSZWYgPSB1c2VSZWYob25GaW5hbGl6ZSk7XG4gIGNvbnN0IG9uQ29uZmlnTG9hZGVkUmVmID0gdXNlUmVmKG9uQ29uZmlnTG9hZGVkKTtcblxuICAvLyBVcGRhdGUgY2FsbGJhY2sgcmVmcyB3aGVuIHRoZXkgY2hhbmdlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25FcnJvclJlZi5jdXJyZW50ID0gb25FcnJvcjtcbiAgfSwgW29uRXJyb3JdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uVGFrZW92ZXJSZWYuY3VycmVudCA9IG9uVGFrZW92ZXI7XG4gIH0sIFtvblRha2VvdmVyXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbkZpbmFsaXplUmVmLmN1cnJlbnQgPSBvbkZpbmFsaXplO1xuICB9LCBbb25GaW5hbGl6ZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25Db25maWdMb2FkZWRSZWYuY3VycmVudCA9IG9uQ29uZmlnTG9hZGVkO1xuICB9LCBbb25Db25maWdMb2FkZWRdKTtcblxuICAvLyBTeW5jIG1ldGFkYXRhIChlLmcuIGBsYW5ndWFnZWAgZm9yIG91dGJvdW5kIHJlcXVlc3RzKSB3aXRob3V0IGNhbmNlbGxpbmcgYm9vdHN0cmFwIG9yIHJlY3JlYXRpbmcgdGhlIHNlcnZpY2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50Py5zZXRNZXRhZGF0YShtZXRhZGF0YSk7XG4gIH0sIFttZXRhZGF0YVN0cmluZywgbWV0YWRhdGFdKTtcblxuICAvLyBJbml0aWFsaXplIGNoYXQgc2VydmljZSAtIG9ubHkgd2hlbiBjb25uZWN0aW9uLXJlbGF0ZWQgaW5wdXRzIGNoYW5nZSAobm90IGxhbmd1YWdlL21ldGFkYXRhIOKAlCB0aG9zZSBjYW5jZWwgaW4tZmxpZ2h0IGxvY2FsZSBmZXRjaClcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgYmFzZVVybENoYW5nZWQgPSBwcmV2QmFzZVVybFJlZi5jdXJyZW50ICE9PSBiYXNlVXJsO1xuICAgIGNvbnN0IHdlYnNvY2tldFVybENoYW5nZWQgPSBwcmV2V2Vic29ja2V0VXJsUmVmLmN1cnJlbnQgIT09IHdlYnNvY2tldFVybDtcbiAgICBjb25zdCBhcGlLZXlDaGFuZ2VkID0gcHJldkFwaUtleVJlZi5jdXJyZW50ICE9PSBhcGlLZXk7XG4gICAgY29uc3QgdGVuYW50Q2hhbmdlZCA9IHByZXZUZW5hbnRSZWYuY3VycmVudCAhPT0gdGVuYW50O1xuICAgIGNvbnN0IHVzZVdzQ2hhbmdlZCA9IHByZXZVc2VXc1JlZi5jdXJyZW50ICE9PSB1c2VXcztcbiAgICBjb25zdCB1c2VQb2xsQ2hhbmdlZCA9IHByZXZVc2VQb2xsUmVmLmN1cnJlbnQgIT09IHVzZVBvbGw7XG4gICAgLy8gT25seSByZS1pbml0aWFsaXplIGZvciBjb25uZWN0aW9uLXJlbGF0ZWQgY2hhbmdlcywgTk9UIGZvciBtZXRhZGF0YSBjaGFuZ2VzXG4gICAgY29uc3QgbmVlZHNSZWluaXQgPVxuICAgICAgIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQgfHxcbiAgICAgIGJhc2VVcmxDaGFuZ2VkIHx8XG4gICAgICB3ZWJzb2NrZXRVcmxDaGFuZ2VkIHx8XG4gICAgICBhcGlLZXlDaGFuZ2VkIHx8XG4gICAgICB0ZW5hbnRDaGFuZ2VkIHx8XG4gICAgICB1c2VXc0NoYW5nZWQ7XG5cbiAgICBpZiAobmVlZHNSZWluaXQpIHtcbiAgICAgIC8vIFVwZGF0ZSByZWZzXG4gICAgICBpZiAoYmFzZVVybENoYW5nZWQpIHByZXZCYXNlVXJsUmVmLmN1cnJlbnQgPSBiYXNlVXJsO1xuICAgICAgaWYgKHdlYnNvY2tldFVybENoYW5nZWQpIHByZXZXZWJzb2NrZXRVcmxSZWYuY3VycmVudCA9IHdlYnNvY2tldFVybDtcbiAgICAgIGlmIChhcGlLZXlDaGFuZ2VkKSBwcmV2QXBpS2V5UmVmLmN1cnJlbnQgPSBhcGlLZXk7XG4gICAgICBpZiAodGVuYW50Q2hhbmdlZCkgcHJldlRlbmFudFJlZi5jdXJyZW50ID0gdGVuYW50O1xuICAgICAgaWYgKHVzZVdzQ2hhbmdlZCkgcHJldlVzZVdzUmVmLmN1cnJlbnQgPSB1c2VXcztcbiAgICAgIGlmICh1c2VQb2xsQ2hhbmdlZCkgcHJldlVzZVBvbGxSZWYuY3VycmVudCA9IHVzZVBvbGw7XG5cbiAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIHNlcnZpY2UgaWYgaXQgZXhpc3RzXG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldENvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoKCkgPT4ge30pO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRXZWxjb21lRGF0YUhhbmRsZXIobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQgPSBuZXcgQ2hhdFNlcnZpY2UoXG4gICAgICAgIGJhc2VVcmwsXG4gICAgICAgIHdlYnNvY2tldFVybCxcbiAgICAgICAgYXBpS2V5LFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgdGVuYW50LFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgdXNlV3MsXG4gICAgICAgIHVzZVBvbGwsXG4gICAgICApO1xuICAgICAgc2V0QXZhaWxhYmxlTGFuZ3VhZ2VzKG51bGwpO1xuXG4gICAgICAvLyBTZXQgdXAgaGFuZGxlcnNcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0TWVzc2FnZUhhbmRsZXIoKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgIGNyZWF0ZV90aW1lOlxuICAgICAgICAgICAgIW1lc3NhZ2UuY3JlYXRlX3RpbWUgfHwgaXNOYU4obWVzc2FnZS5jcmVhdGVfdGltZSlcbiAgICAgICAgICAgICAgPyBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKVxuICAgICAgICAgICAgICA6IG1lc3NhZ2UuY3JlYXRlX3RpbWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVHJhY2sgbGF0ZXN0IGNyZWF0ZV90aW1lIHdlJ3ZlIHNlZW4gZnJvbSBzZXJ2ZXIvd2Vic29ja2V0IChpbiBzZWNvbmRzKVxuICAgICAgICBpZiAobm9ybWFsaXplZE1lc3NhZ2UuY3JlYXRlX3RpbWUgJiYgbm9ybWFsaXplZE1lc3NhZ2UuY3JlYXRlX3RpbWUgPiAwKSB7XG4gICAgICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IE1hdGgucm91bmQobm9ybWFsaXplZE1lc3NhZ2UuY3JlYXRlX3RpbWUpICogMTAwMCAvIDEwMDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgbWVzc2FnZSB0byBtZXNzYWdlcyBhcnJheVxuICAgICAgICBzZXRNZXNzYWdlcygocHJldk1lc3NhZ2VzKSA9PiB7XG4gICAgICAgICAgLy8gQXZvaWQgYWRkaW5nIGR1cGxpY2F0ZSBtZXNzYWdlcyB3aXRoIHNhbWUgbWVzc2FnZV9pZCBhbmQgdHlwZVxuICAgICAgICAgIGlmIChub3JtYWxpemVkTWVzc2FnZS5tZXNzYWdlX2lkKSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSBwcmV2TWVzc2FnZXMuc29tZSgobSkgPT4gbS5tZXNzYWdlX2lkID09PSBub3JtYWxpemVkTWVzc2FnZS5tZXNzYWdlX2lkKTtcbiAgICAgICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHByZXZNZXNzYWdlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFsuLi5wcmV2TWVzc2FnZXMsIG5vcm1hbGl6ZWRNZXNzYWdlXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RvcCB0eXBpbmcgYW5pbWF0aW9uIHdoZW4gYWdlbnQgb3Igc3lzdGVtIG1lc3NhZ2UgYXJyaXZlc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbm9ybWFsaXplZE1lc3NhZ2Uuc3BlYWtlciA9PT0gXCJhZ2VudFwiIHx8XG4gICAgICAgICAgbm9ybWFsaXplZE1lc3NhZ2Uuc3BlYWtlciA9PT0gXCJzcGVjaWFsXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFRha2VvdmVySGFuZGxlcigoKSA9PiB7XG4gICAgICAgIHNldElzVGFrZW5PdmVyKHRydWUpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uVGFrZW92ZXJSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uVGFrZW92ZXJSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRGaW5hbGl6ZWRIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25GaW5hbGl6ZVJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25GaW5hbGl6ZVJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldENvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoKHN0YXRlKSA9PiB7XG4gICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShzdGF0ZSk7XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gXCJjb25uZWN0ZWRcIikge1xuICAgICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRXZWxjb21lRGF0YUhhbmRsZXIoKGRhdGEpID0+IHtcbiAgICAgICAgc2V0V2VsY29tZVRpdGxlKGRhdGEudGl0bGUgPz8gbnVsbCk7XG4gICAgICAgIHNldFdlbGNvbWVJbWFnZVVybChkYXRhLmltYWdlVXJsID8/IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lTWVzc2FnZShkYXRhLm1lc3NhZ2UgPz8gbnVsbCk7XG4gICAgICAgIHNldElucHV0RGlzY2xhaW1lckh0bWwoZGF0YS5pbnB1dERpc2NsYWltZXJIdG1sID8/IG51bGwpO1xuICAgICAgICBpZiAoZGF0YS5wb3NzaWJsZVF1ZXJpZXMgJiYgZGF0YS5wb3NzaWJsZVF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhkYXRhLnBvc3NpYmxlUXVlcmllcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFNlcnZlclVuYXZhaWxhYmxlQ29uZmlnKFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzZXJ2aWNlID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudDtcbiAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgW2luZm9dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIHNlcnZpY2UuZmV0Y2hBZ2VudEluZm8/LigpID8/IFByb21pc2UucmVzb2x2ZShudWxsKSxcbiAgICAgICAgICBzZXJ2aWNlLmZldGNoQWdlbnRDaGF0TG9jYWxlcz8uKCkgPz8gUHJvbWlzZS5yZXNvbHZlKG51bGwpLFxuICAgICAgICBdKTtcblxuICAgICAgICAvLyBzZXQgYXZhaWxhYmxlIGxhbmd1YWdlcyBmcm9tIHRoZSBhZ2VudCBpbmZvXG4gICAgICAgIGlmIChpbmZvICYmIEFycmF5LmlzQXJyYXkoaW5mby5hZ2VudF9hdmFpbGFibGVfbGFuZ3VhZ2VzKSkge1xuICAgICAgICAgIHNldEF2YWlsYWJsZUxhbmd1YWdlcyhpbmZvLmFnZW50X2F2YWlsYWJsZV9sYW5ndWFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAoaW5mbyAmJiBBcnJheS5pc0FycmF5KGluZm8uYWdlbnRfYXZhaWxhYmxlX2xhbmd1YWdlcykpIHtcbiAgICAgICAgICBzZXRBdmFpbGFibGVMYW5ndWFnZXMoaW5mby5hZ2VudF9hdmFpbGFibGVfbGFuZ3VhZ2VzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYW5nID0gbGFuZ3VhZ2VSZWYuY3VycmVudCB8fCBcImVuXCI7XG4gICAgICAgIGNvbnN0IGFwcGxpZWQgPSBzZXJ2aWNlLmFwcGx5TGFuZ3VhZ2VGcm9tTG9jYWxlcyhsYW5nKTtcbiAgICAgICAgaWYgKCFjYW5jZWxsZWQgJiYgYXBwbGllZCkge1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyhhcHBsaWVkLnRoaW5raW5nUGhyYXNlcyk7XG4gICAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKGFwcGxpZWQudGhpbmtpbmdEZWxheU1zKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gc2VydmljZS5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhY2FuY2VsbGVkICYmXG4gICAgICAgICAgbWV0YSAmJlxuICAgICAgICAgIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgT2JqZWN0LmtleXMobWV0YSkubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oeyBjaGF0SW5wdXRNZXRhZGF0YTogbWV0YSB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGEgc2F2ZWQgY29udmVyc2F0aW9uXG4gICAgICBjb25zdCBjb252SWQgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENvbnZlcnNhdGlvbklkKCk7XG4gICAgICBpZiAoY29udklkKSB7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICAgIHNldEd1ZXN0VG9rZW4oY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRHdWVzdFRva2VuKCkpO1xuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5pc0NvbnZlcnNhdGlvbkZpbmFsaXplZCgpKSB7XG4gICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXVzZVdzKSB7XG4gICAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiY29ubmVjdGVkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBQdWxsIGluaXRpYWwgc3RhdGljIGRhdGFcbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcz8uKCkgfHwgW107XG4gICAgICAgIGlmIChxdWVyaWVzLmxlbmd0aCkgc2V0UG9zc2libGVRdWVyaWVzKHF1ZXJpZXMpO1xuICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YT8uKCk7XG4gICAgICAgIGlmICh3ZWxjb21lKSB7XG4gICAgICAgICAgc2V0V2VsY29tZVRpdGxlKHdlbGNvbWUudGl0bGUgfHwgbnVsbCk7XG4gICAgICAgICAgc2V0V2VsY29tZUltYWdlVXJsKHdlbGNvbWUuaW1hZ2VVcmwgfHwgbnVsbCk7XG4gICAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2Uod2VsY29tZS5tZXNzYWdlIHx8IG51bGwpO1xuICAgICAgICAgIHNldElucHV0RGlzY2xhaW1lckh0bWwod2VsY29tZS5pbnB1dERpc2NsYWltZXJIdG1sID8/IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZz8uKCk7XG4gICAgICAgIGlmICh0aGlua2luZykge1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKG1ldGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYW5ncyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0QXZhaWxhYmxlTGFuZ3VhZ2VzPy4oKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGFuZ3MpKSB7XG4gICAgICAgICAgc2V0QXZhaWxhYmxlTGFuZ3VhZ2VzKGxhbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oeyBjaGF0SW5wdXRNZXRhZGF0YTogbWV0YSA/PyB7fSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbHdheXMgdXBkYXRlIGhhbmRsZXJzIHdoZW4gY2FsbGJhY2tzIGNoYW5nZSAod2l0aG91dCByZS1pbml0aWFsaXppbmcpXG4gICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0VGFrZW92ZXJIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25UYWtlb3ZlclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25UYWtlb3ZlclJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldEZpbmFsaXplZEhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc0ZpbmFsaXplZCh0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvbkZpbmFsaXplUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkZpbmFsaXplUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0U2VydmVyVW5hdmFpbGFibGVDb25maWcoXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW51cCBvbmx5IG9uIHVubW91bnRcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbXG4gICAgYmFzZVVybCxcbiAgICB3ZWJzb2NrZXRVcmwsXG4gICAgYXBpS2V5LFxuICAgIHRlbmFudCxcbiAgICB1c2VXcyxcbiAgICB1c2VQb2xsLFxuICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gIF0pO1xuXG4gIC8vIFdoZW4gdGhlIHBsdWdpbiBsYW5ndWFnZSBjaGFuZ2VzOiB1cGRhdGUgQWNjZXB0LUxhbmd1YWdlIGFuZCBhcHBseSB0aGUgYWdlbnQgbG9jYWxlIGJ1bmRsZSAoZnJvbSBmZXRjaEFnZW50Q2hhdExvY2FsZXMpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc3ZjID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudDtcbiAgICBpZiAoIXN2YykgcmV0dXJuO1xuICAgIHN2Yy5zZXRMYW5ndWFnZShsYW5ndWFnZSk7XG4gICAgY29uc3QgbGFuZyA9IGxhbmd1YWdlIHx8IFwiZW5cIjtcbiAgICBjb25zdCBhcHBsaWVkID0gc3ZjLmFwcGx5TGFuZ3VhZ2VGcm9tTG9jYWxlcyhsYW5nKTtcbiAgICBpZiAoYXBwbGllZCkge1xuICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKGFwcGxpZWQudGhpbmtpbmdQaHJhc2VzKTtcbiAgICAgIHNldFRoaW5raW5nRGVsYXlNcyhhcHBsaWVkLnRoaW5raW5nRGVsYXlNcyk7XG4gICAgfVxuICB9LCBbbGFuZ3VhZ2VdKTtcblxuICAvLyBMb2FkIG1lc3NhZ2VzIGZvciBjdXJyZW50IHBhaXIgd2hlbiBhdmFpbGFibGVcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmICgha2V5KSB7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50ID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICBjb25zdCBwYXJzZWQ6IENoYXRNZXNzYWdlW10gPSBzdG9yZWQgPyBKU09OLnBhcnNlKHN0b3JlZCkgOiBbXTtcblxuICAgICAgc2V0TWVzc2FnZXMocGFyc2VkKTtcbiAgICAgIC8vIEluaXRpYWxpemUgbGFzdCBzZWVuIGNyZWF0ZV90aW1lIGZyb20gY2FjaGVkIG1lc3NhZ2VzXG4gICAgICBpZiAocGFyc2VkLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBtYXhDcmVhdGVUaW1lID0gTWF0aC5tYXgoXG4gICAgICAgICAgLi4ucGFyc2VkLm1hcCgobSkgPT4gKG0uY3JlYXRlX3RpbWUgPyBtLmNyZWF0ZV90aW1lIDogMCkpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgbGFzdCBzZWVuIGNyZWF0ZV90aW1lIGZyb20gY2FjaGVkIG1lc3NhZ2VzXG4gICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSBNYXRoLnJvdW5kKG1heENyZWF0ZVRpbWUpICogMTAwMCAvIDEwMDA7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSAwO1xuICAgIH1cbiAgfSwgW2FwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBWYWxpZGF0ZSBtZXNzYWdlcyBmb3IgdGFrZW92ZXIgYW5kIGZpbmFsaXplZFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZhbGlkYXRlTWVzc2FnZXMobWVzc2FnZXMpO1xuICB9LCBbbWVzc2FnZXNdKTtcblxuICAvLyBQZXJzaXN0IG1lc3NhZ2VzIGZvciBjdXJyZW50IHBhaXJcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobWVzc2FnZXMpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbbWVzc2FnZXMsIGFwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBIZWFydGJlYXQgbG9uZyBwb2xsaW5nIHdoZW4gV2ViU29ja2V0IGlzIGRpc2FibGVkIGFuZCB3ZSBoYXZlIGFuIGluLXByb2dyZXNzIGNvbnZlcnNhdGlvbi5cbiAgLy8gLSBTdGFydHMgd2l0aCBhIHNob3J0IGludGVydmFsXG4gIC8vIC0gSW5jcmVhc2VzIHRoZSBpbnRlcnZhbCBvdmVyIHRpbWUgKGV2ZXJ5IHN1Y2Nlc3NmdWwgcG9sbClcbiAgLy8gLSBSZXRyaWVzIHVwIHRvIDUgdGltZXMgb24gZXJyb3JzLCB0aGVuIHN0b3BzXG4gIGNvbnN0IEhFQVJUQkVBVF9JTklUSUFMX0lOVEVSVkFMX01TID0gMjAwMDtcbiAgY29uc3QgSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVMgPSA1MDAwO1xuICBjb25zdCBIRUFSVEJFQVRfTUFYX0lOVEVSVkFMX01TID0gMzAwMDA7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodXNlV3MgfHwgIWNvbnZlcnNhdGlvbklkIHx8IGlzRmluYWxpemVkKSByZXR1cm47XG4gICAgY29uc3Qgc3ZjID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudDtcbiAgICBpZiAoIXN2YykgcmV0dXJuO1xuXG4gICAgLy8gUmVzZXQgcGVyLWNvbnZlcnNhdGlvbiBmbGFncyBzbyB3ZSBvbmx5IG5vdGlmeSB0YWtlb3Zlci9maW5hbGl6ZWQgb25jZVxuICAgIHRha2VvdmVyUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuXG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgIGxldCB0aW1lb3V0SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgc2NoZWR1bGVOZXh0ID0gKGRlbGF5TXM6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQocG9sbCwgZGVsYXlNcyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHBvbGwgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgcG9sbE1lc3NhZ2VzIH0gPSBhd2FpdCBzdmMucG9sbEluUHJvZ3Jlc3NDb252ZXJzYXRpb24oKTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFJlc2V0IGZhaWx1cmUgY291bnRlciBvbiBzdWNjZXNzXG4gICAgICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ID0gMDtcblxuICAgICAgICAvLyBPbmx5IHRha2UgbWVzc2FnZXMgbmV3ZXIgdGhhbiBvciBlcXVhbCB0byBsYXN0IHNlZW4gY3JlYXRlX3RpbWUgKHNlY29uZHMpLlxuICAgICAgICAvLyBVc2Ugc2Vjb25kcyBjb25zaXN0ZW50bHk6IHBvbGwgbWVzc2FnZXMgYXJlIG5vcm1hbGl6ZWQgdG8gc2Vjb25kcyBpbiBjaGF0U2VydmljZS5cbiAgICAgICAgY29uc3QgbGFzdFNlcnZlckNyZWF0ZVRpbWUgPSBNYXRoLmZsb29yKE51bWJlcihsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50KSB8fCAwKTtcblxuICAgICAgICBjb25zdCBuZXdNZXNzYWdlc1JhdyA9IChwb2xsTWVzc2FnZXMgfHwgW10pLmZpbHRlcigobSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN0ID0gTnVtYmVyKChtIGFzIGFueSkuY3JlYXRlX3RpbWUpO1xuICAgICAgICAgIGlmIChjdCA9PT0gMCB8fCAhTnVtYmVyLmlzRmluaXRlKGN0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIHJldHVybiBjdCA+IGxhc3RTZXJ2ZXJDcmVhdGVUaW1lO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobmV3TWVzc2FnZXNSYXcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHNwZWFrZXJUeXBlID0gKHNwZWFrZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHNwZWFrZXIgPT09IFwiY3VzdG9tZXJcIikgcmV0dXJuIFwiY3VzdG9tZXJcIjtcbiAgICAgICAgICAgIGlmIChzcGVha2VyID09PSBcImFnZW50XCIpIHJldHVybiBcImFnZW50XCI7XG4gICAgICAgICAgICByZXR1cm4gXCJzcGVjaWFsXCI7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IHRleHQgPSAobTogSW5Qcm9ncmVzc1BvbGxNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBpZiAobS50eXBlID09PSBcInRha2VvdmVyXCIpIHJldHVybiBcIlN1cGVydmlzb3IgdG9vayBvdmVyXCI7XG4gICAgICAgICAgICBpZiAobS50eXBlID09PSBcImZpbmFsaXplZFwiKSByZXR1cm4gXCJDb252ZXJzYXRpb24gRmluYWxpemVkXCI7XG4gICAgICAgICAgICByZXR1cm4gKG0gYXMgYW55KS50ZXh0O1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBuZXdNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSA9IG5ld01lc3NhZ2VzUmF3Lm1hcCgobSkgPT4gKHtcbiAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IChtIGFzIGFueSkuaWQsXG4gICAgICAgICAgICBjcmVhdGVfdGltZTogTnVtYmVyKChtIGFzIGFueSkuY3JlYXRlX3RpbWUpLFxuICAgICAgICAgICAgc3RhcnRfdGltZTogTnVtYmVyKChtIGFzIGFueSkuc3RhcnRfdGltZSA/PyAwKSxcbiAgICAgICAgICAgIGVuZF90aW1lOiBOdW1iZXIoKG0gYXMgYW55KS5lbmRfdGltZSA/PyAwKSxcbiAgICAgICAgICAgIHNwZWFrZXI6IHNwZWFrZXJUeXBlKChtIGFzIGFueSkuc3BlYWtlciksXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0KG0pLFxuICAgICAgICAgICAgdHlwZTogKG0gYXMgYW55KS50eXBlLFxuICAgICAgICAgICAgZmVlZGJhY2s6IChtIGFzIGFueSkuZmVlZGJhY2ssXG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgLy8gQXBwZW5kIG9ubHkgbWVzc2FnZXMgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIChkZWR1cGUgYnkgbWVzc2FnZV9pZDsgc2FtZSBjcmVhdGVfdGltZSBjYW4gcmVwZWF0IGV2ZXJ5IHBvbGwpXG4gICAgICAgICAgaWYgKG5ld01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNldE1lc3NhZ2VzKChwcmV2TWVzc2FnZXMpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgIHByZXZNZXNzYWdlcy5tYXAoKG0pID0+IG0ubWVzc2FnZV9pZCkuZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCB0b0FkZCA9IG5ld01lc3NhZ2VzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAobSkgPT4gbS5tZXNzYWdlX2lkID09IG51bGwgfHwgIWV4aXN0aW5nSWRzLmhhcyhtLm1lc3NhZ2VfaWQpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAodG9BZGQubGVuZ3RoID09PSAwKSByZXR1cm4gcHJldk1lc3NhZ2VzO1xuICAgICAgICAgICAgICBjb25zdCBtYXhDcmVhdGVUaW1lRnJvbVBvbGwgPSB0b0FkZC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKG1heCwgbXNnKSA9PlxuICAgICAgICAgICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG1zZy5jcmVhdGVfdGltZSlcbiAgICAgICAgICAgICAgICAgICAgPyBNYXRoLm1heChtYXgsIG1zZy5jcmVhdGVfdGltZSlcbiAgICAgICAgICAgICAgICAgICAgOiBtYXgsXG4gICAgICAgICAgICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWUsXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IG1heENyZWF0ZVRpbWVGcm9tUG9sbDtcbiAgICAgICAgICAgICAgcmV0dXJuIFsuLi5wcmV2TWVzc2FnZXMsIC4uLnRvQWRkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIG5ldyBtZXNzYWdlcyBmb3IgdGFrZW92ZXIvZmluYWxpemUgbWFya2Vyc1xuICAgICAgICAgIGNvbnN0IGhhc1Rha2VvdmVyTWVzc2FnZSA9IG5ld01lc3NhZ2VzLnNvbWUoXG4gICAgICAgICAgICAobSkgPT4gbS50eXBlID09PSBcInRha2VvdmVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBoYXNGaW5hbGl6ZWRNZXNzYWdlID0gbmV3TWVzc2FnZXMuc29tZShcbiAgICAgICAgICAgIChtKSA9PiBtLnR5cGUgPT09IFwiZmluYWxpemVkXCIsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICgoc3RhdHVzID09PSBcImZpbmFsaXplZFwiIHx8IGhhc0ZpbmFsaXplZE1lc3NhZ2UpICYmICFmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoc3RhdHVzID09PSBcInRha2VvdmVyXCIgfHwgaGFzVGFrZW92ZXJNZXNzYWdlKSAmJiAhdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICBzZXRJc1Rha2VuT3Zlcih0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gbmV3IG1lc3NhZ2VzOyBzdGlsbCBob25vciBzdGF0dXMgaWYgaXQgaW5kaWNhdGVzIGEgdGVybWluYWwgc3RhdGUgKG9uY2UgcGVyIGNvbnZlcnNhdGlvbilcbiAgICAgICAgICBpZiAoc3RhdHVzID09PSBcImZpbmFsaXplZFwiICYmICFmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc3ZjLmhhbmRsZUNvbnZlcnNhdGlvbkZpbmFsaXplZCgpO1xuICAgICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IFwidGFrZW92ZXJcIiAmJiAhdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICBzdmMubm90aWZ5VGFrZW92ZXJGcm9tUG9sbCgpO1xuICAgICAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJmaW5hbGl6ZWRcIikge1xuICAgICAgICAgIC8vIE1hcmsgZmluYWxpemVkIGFuZCBsZXQgdGhlIGVmZmVjdCBjbGVhbnVwIHByZXZlbnQgZnVydGhlciBzY2hlZHVsaW5nXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jcmVhc2UgcG9sbGluZyBpbnRlcnZhbCBvdmVyIHRpbWUgb24gc3VjY2Vzc1xuICAgICAgICAvLyBjb25zdCBuZXh0SW50ZXJ2YWwgPSBNYXRoLm1pbihcbiAgICAgICAgLy8gICAoaGVhcnRiZWF0SW50ZXJ2YWxSZWYuY3VycmVudCB8fCBIRUFSVEJFQVRfSU5JVElBTF9JTlRFUlZBTF9NUykgK1xuICAgICAgICAvLyAgICAgSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVMsXG4gICAgICAgIC8vICAgSEVBUlRCRUFUX01BWF9JTlRFUlZBTF9NUyxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgY29uc3QgbmV4dEludGVydmFsID0gSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVM7XG4gICAgICAgIGhlYXJ0YmVhdEludGVydmFsUmVmLmN1cnJlbnQgPSBuZXh0SW50ZXJ2YWw7XG4gICAgICAgIHNjaGVkdWxlTmV4dChuZXh0SW50ZXJ2YWwpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcbiAgICAgICAgLy8gSW5jcmVtZW50IGZhaWx1cmUgY291bnRlciBhbmQgc3RvcCBhZnRlciA1IGNvbnNlY3V0aXZlIGZhaWx1cmVzXG4gICAgICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ICs9IDE7XG4gICAgICAgIGlmIChoZWFydGJlYXRGYWlsdXJlQ291bnRSZWYuY3VycmVudCA+PSA1KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldHJ5RGVsYXkgPVxuICAgICAgICAgIGhlYXJ0YmVhdEludGVydmFsUmVmLmN1cnJlbnQgfHwgSEVBUlRCRUFUX0lOSVRJQUxfSU5URVJWQUxfTVM7XG4gICAgICAgIHNjaGVkdWxlTmV4dChyZXRyeURlbGF5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gUmVzZXQgY291bnRlcnMgZm9yIHRoaXMgY29udmVyc2F0aW9uIGFuZCBzdGFydCBpbW1lZGlhdGVseVxuICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ID0gMDtcbiAgICBoZWFydGJlYXRJbnRlcnZhbFJlZi5jdXJyZW50ID0gSEVBUlRCRUFUX0lOSVRJQUxfSU5URVJWQUxfTVM7XG5cbiAgICBpZiAodXNlUG9sbCAmJiAhdXNlV3MpIHtcbiAgICAgIHBvbGwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IG51bGwpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3VzZVdzLCBjb252ZXJzYXRpb25JZCwgaXNGaW5hbGl6ZWQsIHVzZVBvbGxdKTtcblxuICAvLyBSZXNldCBjb252ZXJzYXRpb25cbiAgY29uc3QgcmVzZXRDb252ZXJzYXRpb24gPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAocmVDYXB0Y2hhVG9rZW4/OiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RpbmdcIik7XG4gICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgICAgc2V0V2VsY29tZVRpdGxlKG51bGwpO1xuICAgICAgc2V0V2VsY29tZUltYWdlVXJsKG51bGwpO1xuICAgICAgc2V0V2VsY29tZU1lc3NhZ2UobnVsbCk7XG4gICAgICBzZXRJbnB1dERpc2NsYWltZXJIdG1sKG51bGwpO1xuICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKFtdKTtcbiAgICAgIHNldFRoaW5raW5nRGVsYXlNcygxMDAwKTtcbiAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSAwO1xuICAgICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIH1cbiAgICAgIHNldElzRmluYWxpemVkKGZhbHNlKTtcbiAgICAgIHNldElzVGFrZW5PdmVyKGZhbHNlKTtcbiAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBSZXNldCB0aGUgY29udmVyc2F0aW9uIGluIHRoZSBjaGF0IHNlcnZpY2VcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcbiAgICAgICAgc2V0Q29udmVyc2F0aW9uSWQobnVsbCk7XG4gICAgICAgIHNldEd1ZXN0VG9rZW4obnVsbCk7XG5cbiAgICAgICAgLy8gU3RhcnQgYSBuZXcgY29udmVyc2F0aW9uXG4gICAgICAgIGNvbnN0IGNvbnZJZCA9XG4gICAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zdGFydENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlbik7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICAgIHNldEd1ZXN0VG9rZW4oY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRHdWVzdFRva2VuKCkpO1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJjb25uZWN0ZWRcIik7XG5cbiAgICAgICAgLy8gR2V0IHBvc3NpYmxlIHF1ZXJpZXMgZnJvbSBBUEkgcmVzcG9uc2VcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKCk7XG4gICAgICAgICAgaWYgKHF1ZXJpZXMgJiYgcXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHdlbGNvbWUgYW5kIHRoaW5raW5nIGRhdGFcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEpIHtcbiAgICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSgpO1xuICAgICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRJbnB1dERpc2NsYWltZXJIdG1sKHdlbGNvbWUuaW5wdXREaXNjbGFpbWVySHRtbCA/PyBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZygpO1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRBdmFpbGFibGVMYW5ndWFnZXMpIHtcbiAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICBjb25zdCBsYW5ncyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0QXZhaWxhYmxlTGFuZ3VhZ2VzKCk7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGFuZ3MpKSB7XG4gICAgICAgICAgICBzZXRBdmFpbGFibGVMYW5ndWFnZXMobGFuZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKG1ldGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgIGNoYXRJbnB1dE1ldGFkYXRhOlxuICAgICAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCkgPz8ge30sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiZGlzY29ubmVjdGVkXCIpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIGNvbnN0IHVwbG9hZEZpbGUgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoZmlsZTogRmlsZSk6IFByb21pc2U8QXR0YWNobWVudCB8IG51bGw+ID0+IHtcbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbklkID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudD8uZ2V0Q29udmVyc2F0aW9uSWQoKTtcbiAgICAgIGlmICghY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVwbG9hZFJlc3VsdCA9IGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ/LnVwbG9hZEZpbGUoXG4gICAgICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIGZpbGUgdXJsIHdpdGggdGhlIGJhc2UgdXJsXG4gICAgICAgIGNvbnN0IGZpbGVfdXJsID0gbmV3IFVSTCh1cGxvYWRSZXN1bHQhLmZpbGVfdXJsISwgYmFzZVVybCkuaHJlZjtcblxuICAgICAgICBjb25zdCBhdHRhY2htZW50OiBBdHRhY2htZW50ID0ge1xuICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgIHVybDogZmlsZV91cmwsXG4gICAgICAgICAgZmlsZV9pZDogdXBsb2FkUmVzdWx0Py5maWxlX2lkLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzKChwcmV2KSA9PiBbLi4ucHJldiwgYXR0YWNobWVudF0pO1xuICAgICAgICByZXR1cm4gYXR0YWNobWVudDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgcmVzZXRUb0luaXRpYWxTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IgYXMgRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgYXBpS2V5LFxuICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICBidWlsZE1lc3NhZ2VzS2V5LFxuICAgICAgaXNUb2tlbkV4cGlyZWRFcnJvcixcbiAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUsXG4gICAgXSxcbiAgKTtcblxuICAvLyBTZW5kIG1lc3NhZ2VcbiAgY29uc3Qgc2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoXG4gICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICBmaWxlczogRmlsZVtdID0gW10sXG4gICAgICBleHRyYU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNoYXQgc2VydmljZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcblxuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50czogQXR0YWNobWVudFtdID0gW107XG5cbiAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB1cGxvYWRlZEZpbGVzID0gZmlsZXNcbiAgICAgICAgICAgIC5tYXAoKGYpID0+XG4gICAgICAgICAgICAgIHByZWxvYWRlZEF0dGFjaG1lbnRzLmZpbmQoXG4gICAgICAgICAgICAgICAgKHBhKSA9PiBwYS5uYW1lID09PSBmLm5hbWUgJiYgcGEuc2l6ZSA9PT0gZi5zaXplLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBBdHRhY2htZW50W107XG4gICAgICAgICAgbmV3QXR0YWNobWVudHMucHVzaCguLi51cGxvYWRlZEZpbGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IHR5cGluZyBpbW1lZGlhdGVseSB3aGVuIHVzZXIgc2VuZHMsIHVubGVzcyBjb252ZXJzYXRpb24gaXMgdGFrZW4gb3ZlciBieSBhIGh1bWFuXG4gICAgICAgIGlmICghaXNUYWtlbk92ZXIpIHtcbiAgICAgICAgICBzZXRJc0FnZW50VHlwaW5nKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZW5kTWVzc2FnZShcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIG5ld0F0dGFjaG1lbnRzLFxuICAgICAgICAgIGV4dHJhTWV0YWRhdGEsXG4gICAgICAgICAgcmVDYXB0Y2hhVG9rZW4sXG4gICAgICAgICk7XG5cbiAgICAgICAgc2V0UHJlbG9hZGVkQXR0YWNobWVudHMoW10pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKGlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgcmVzZXRUb0luaXRpYWxTdGF0ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTmV0d29ya09yU2VydmVyRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgLy8gU2hvdyBjdXN0b20gc2VydmVyLXVuYXZhaWxhYmxlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICAgICAgICBjb25zdCBjcmVhdGVUaW1lID1cbiAgICAgICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ/LmdldENvbnZlcnNhdGlvbkNyZWF0ZVRpbWUoKTtcbiAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBjcmVhdGVUaW1lICE9IG51bGwgPyBub3cgLSBjcmVhdGVUaW1lIDogMDtcbiAgICAgICAgICBjb25zdCBlbmRUaW1lID0gc3RhcnRUaW1lICsgMC4wMTtcbiAgICAgICAgICBjb25zdCBzcGVjaWFsTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICBjcmVhdGVfdGltZTogbm93LFxuICAgICAgICAgICAgc3RhcnRfdGltZTogc3RhcnRUaW1lLFxuICAgICAgICAgICAgZW5kX3RpbWU6IGVuZFRpbWUsXG4gICAgICAgICAgICBzcGVha2VyOiBcInNwZWNpYWxcIixcbiAgICAgICAgICAgIHRleHQ6XG4gICAgICAgICAgICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSA/PyBERUZBVUxUX1NFUlZFUl9VTkFWQUlMQUJMRV9NRVNTQUdFLFxuICAgICAgICAgICAgLi4uKHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCAmJiB7XG4gICAgICAgICAgICAgIGxpbmtVcmw6IHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgICAgICAgbGlua0xhYmVsOlxuICAgICAgICAgICAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsID8/XG4gICAgICAgICAgICAgICAgREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfQ09OVEFDVF9MQUJFTCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzZXRNZXNzYWdlcygocHJldikgPT4gWy4uLnByZXYsIHNwZWNpYWxNZXNzYWdlXSk7XG4gICAgICAgICAgLy8gRG9uJ3QgY2FsbCBvbkVycm9yIHNvIHRoZSB1c2VyIG9ubHkgc2VlcyBvdXIgY3VzdG9tIG1lc3NhZ2VcbiAgICAgICAgfSBlbHNlIGlmIChvbkVycm9yUmVmLmN1cnJlbnQgJiYgZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBwcmVsb2FkZWRBdHRhY2htZW50cyxcbiAgICAgIGlzVGFrZW5PdmVyLFxuICAgICAgaXNUb2tlbkV4cGlyZWRFcnJvcixcbiAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUsXG4gICAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICBdLFxuICApO1xuXG4gIGNvbnN0IHN0YXJ0Q29udmVyc2F0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiY29ubmVjdGluZ1wiKTtcbiAgICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuXG4gICAgICAgIC8vIFJlc2V0IHN0YXRlIGZvciBuZXcgY29udmVyc2F0aW9uXG4gICAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICAgICAgc2V0UG9zc2libGVRdWVyaWVzKFtdKTtcbiAgICAgICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgICAgICBzZXRJc1Rha2VuT3ZlcihmYWxzZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnJlc2V0Q2hhdENvbnZlcnNhdGlvbigpO1xuICAgICAgICBzZXRDb252ZXJzYXRpb25JZChudWxsKTtcbiAgICAgICAgc2V0R3Vlc3RUb2tlbihudWxsKTtcblxuICAgICAgICBjb25zdCBjb252SWQgPVxuICAgICAgICAgIGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc3RhcnRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW4pO1xuICAgICAgICBzZXRDb252ZXJzYXRpb25JZChjb252SWQpO1xuICAgICAgICBzZXRHdWVzdFRva2VuKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0R3Vlc3RUb2tlbigpKTtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiY29ubmVjdGVkXCIpO1xuXG4gICAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcykge1xuICAgICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcygpO1xuICAgICAgICAgIGlmIChxdWVyaWVzICYmIHF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2V0UG9zc2libGVRdWVyaWVzKHF1ZXJpZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSkge1xuICAgICAgICAgIGNvbnN0IHdlbGNvbWUgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFdlbGNvbWVEYXRhKCk7XG4gICAgICAgICAgc2V0V2VsY29tZVRpdGxlKHdlbGNvbWUudGl0bGUgfHwgbnVsbCk7XG4gICAgICAgICAgc2V0V2VsY29tZUltYWdlVXJsKHdlbGNvbWUuaW1hZ2VVcmwgfHwgbnVsbCk7XG4gICAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2Uod2VsY29tZS5tZXNzYWdlIHx8IG51bGwpO1xuICAgICAgICAgIHNldElucHV0RGlzY2xhaW1lckh0bWwod2VsY29tZS5pbnB1dERpc2NsYWltZXJIdG1sID8/IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFRoaW5raW5nQ29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgdGhpbmtpbmcgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFRoaW5raW5nQ29uZmlnKCk7XG4gICAgICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKHRoaW5raW5nLnBocmFzZXMgfHwgW10pO1xuICAgICAgICAgIHNldFRoaW5raW5nRGVsYXlNcyh0aGlua2luZy5kZWxheU1zIHx8IDEwMDApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGEgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENoYXRJbnB1dE1ldGFkYXRhPy4oKTtcbiAgICAgICAgaWYgKG1ldGEgJiYgdHlwZW9mIG1ldGEgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMobWV0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldENoYXRJbnB1dE1ldGFkYXRhKG1ldGEpO1xuICAgICAgICB9XG4gICAgICAgIG9uQ29uZmlnTG9hZGVkUmVmLmN1cnJlbnQ/Lih7XG4gICAgICAgICAgY2hhdElucHV0TWV0YWRhdGE6XG4gICAgICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENoYXRJbnB1dE1ldGFkYXRhPy4oKSA/PyB7fSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJkaXNjb25uZWN0ZWRcIik7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50ICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW10sXG4gICk7XG5cbiAgLy8gQWRkIGZlZWRiYWNrIHRvIGFuIGFnZW50IG1lc3NhZ2VcbiAgY29uc3QgYWRkRmVlZGJhY2sgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoXG4gICAgICBtZXNzYWdlSWQ6IHN0cmluZyxcbiAgICAgIHZhbHVlOiBcImdvb2RcIiB8IFwiYmFkXCIsXG4gICAgICBmZWVkYmFja01lc3NhZ2U/OiBzdHJpbmcsXG4gICAgKSA9PiB7XG4gICAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkNhbm5vdCBzZW5kIGZlZWRiYWNrOiBDaGF0U2VydmljZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghbWVzc2FnZUlkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYW5ub3Qgc2VuZCBmZWVkYmFjazogbWVzc2FnZUlkIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuYWRkRmVlZGJhY2soXG4gICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGZlZWRiYWNrTWVzc2FnZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBuZXdGZWVkYmFjazogTWVzc2FnZUZlZWRiYWNrID0ge1xuICAgICAgICAgIGZlZWRiYWNrOiB2YWx1ZSxcbiAgICAgICAgICBmZWVkYmFja19tZXNzYWdlOiBmZWVkYmFja01lc3NhZ2UsXG4gICAgICAgICAgZmVlZGJhY2tfdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0TWVzc2FnZXMoKHByZXYpID0+XG4gICAgICAgICAgcHJldi5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgIC8vIE1hdGNoIGJ5IG1lc3NhZ2VfaWQgb3IgaWQgZmllbGRcbiAgICAgICAgICAgIGNvbnN0IG1zZ0lkID0gbS5tZXNzYWdlX2lkIHx8IChtIGFzIGFueSkuaWQ7XG4gICAgICAgICAgICByZXR1cm4gbXNnSWQgPT09IG1lc3NhZ2VJZFxuICAgICAgICAgICAgICA/IHsgLi4ubSwgZmVlZGJhY2s6IFsuLi4obS5mZWVkYmFjayB8fCBbXSksIG5ld0ZlZWRiYWNrXSB9XG4gICAgICAgICAgICAgIDogbTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IgYXMgRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXSxcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzLFxuICAgIGlzTG9hZGluZyxcbiAgICBzZW5kTWVzc2FnZSxcbiAgICB1cGxvYWRGaWxlLFxuICAgIHJlc2V0Q29udmVyc2F0aW9uLFxuICAgIHN0YXJ0Q29udmVyc2F0aW9uLFxuICAgIGNvbm5lY3Rpb25TdGF0ZSxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBndWVzdFRva2VuLFxuICAgIHBvc3NpYmxlUXVlcmllcyxcbiAgICBpc1Rha2VuT3ZlcixcbiAgICBpc0ZpbmFsaXplZCxcbiAgICBpc0FnZW50VHlwaW5nLFxuICAgIGFkZEZlZWRiYWNrLFxuICAgIHdlbGNvbWVUaXRsZSxcbiAgICB3ZWxjb21lSW1hZ2VVcmwsXG4gICAgd2VsY29tZU1lc3NhZ2UsXG4gICAgaW5wdXREaXNjbGFpbWVySHRtbCxcbiAgICB0aGlua2luZ1BocmFzZXMsXG4gICAgdGhpbmtpbmdEZWxheU1zLFxuICAgIGF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICBjaGF0SW5wdXRNZXRhZGF0YSxcbiAgfTtcbn07XG4iXX0=
|
|
1016
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlQ2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VDaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBMkJ0RCxJQUFNLGtDQUFrQyxHQUN0QyxpRUFBaUUsQ0FBQztBQUNwRSxJQUFNLHdDQUF3QyxHQUFHLGlCQUFpQixDQUFDO0FBRW5FLFNBQVMsc0JBQXNCLENBQUMsS0FBVTs7SUFDeEMsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEIsSUFBTSxJQUFJLEdBQUcsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLElBQUksQ0FBQztRQUN6QixJQUNFLElBQUksS0FBSyxhQUFhO1lBQ3RCLElBQUksS0FBSyxjQUFjO1lBQ3ZCLElBQUksS0FBSyxXQUFXO1lBQ3BCLElBQUksS0FBSyx3QkFBd0I7WUFFakMsT0FBTyxJQUFJLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQyxDQUFDLHdFQUF3RTtJQUN2RixDQUFDO0lBQ0QsSUFBTSxNQUFNLEdBQUcsTUFBQSxLQUFLLENBQUMsUUFBUSwwQ0FBRSxNQUFNLENBQUM7SUFDdEMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUNyRCxDQUFDO0FBRUQsTUFBTSxDQUFDLElBQU0sT0FBTyxHQUFHLFVBQUMsRUFnQlQ7UUFmYixPQUFPLGFBQUEsRUFDUCxZQUFZLGtC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QUFDLENBQUM7b0JBQ3JDLENBQUM7Ozs7O1NBRUosRUFDRCxFQUFFLENBQ0gsQ0FBQztJQUVGLE9BQU87UUFDTCxRQUFRLFVBQUE7UUFDUixTQUFTLFdBQUE7UUFDVCxXQUFXLGFBQUE7UUFDWCxnQkFBZ0Isa0JBQUE7UUFDaEIsVUFBVSxZQUFBO1FBQ1YsaUJBQWlCLG1CQUFBO1FBQ2pCLGlCQUFpQixtQkFBQTtRQUNqQixlQUFlLGlCQUFBO1FBQ2YsY0FBYyxnQkFBQTtRQUNkLFVBQVUsWUFBQTtRQUNWLGVBQWUsaUJBQUE7UUFDZixXQUFXLGFBQUE7UUFDWCxXQUFXLGFBQUE7UUFDWCxhQUFhLGVBQUE7UUFDYixXQUFXLGFBQUE7UUFDWCxZQUFZLGNBQUE7UUFDWixlQUFlLGlCQUFBO1FBQ2YsY0FBYyxnQkFBQTtRQUNkLG1CQUFtQixxQkFBQTtRQUNuQixlQUFlLGlCQUFBO1FBQ2YsZUFBZSxpQkFBQTtRQUNmLGtCQUFrQixvQkFBQTtRQUNsQixpQkFBaUIsbUJBQUE7S0FDbEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2NoYXRTZXJ2aWNlXCI7XG5pbXBvcnQgeyB1c2VDaGF0V2ViU29ja2V0IH0gZnJvbSBcIi4vdXNlQ2hhdFdlYlNvY2tldFwiO1xuaW1wb3J0IHtcbiAgQ2hhdE1lc3NhZ2UsXG4gIEF0dGFjaG1lbnQsXG4gIE1lc3NhZ2VGZWVkYmFjayxcbiAgSW5Qcm9ncmVzc1BvbGxNZXNzYWdlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VDaGF0UHJvcHMge1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIHdlYnNvY2tldFVybD86IHN0cmluZztcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIHRlbmFudD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvLyAgSWYgZmFsc2UsIHRoZSBjaGF0IHdpbGwgcnVuIGluIEhUVFAtb25seSBtb2RlIChubyBXZWJTb2NrZXQgY29ubmVjdGlvbikuXG4gIHVzZVdzPzogYm9vbGVhbjtcbiAgdXNlUG9sbD86IGJvb2xlYW47XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuICBvbkVycm9yPzogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgb25UYWtlb3Zlcj86ICgpID0+IHZvaWQ7XG4gIG9uRmluYWxpemU/OiAoKSA9PiB2b2lkO1xuICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2U/OiBzdHJpbmc7IC8vIEN1c3RvbSBtZXNzYWdlIHdoZW4gc2VydmVyIGlzIGRvd25cbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsPzogc3RyaW5nOyAvLyBPcHRpb25hbCBVUkwgZm9yIGNvbnRhY3Qvc3VwcG9ydFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbD86IHN0cmluZzsgLy8gTGFiZWwgZm9yIHRoZSBjb250YWN0IGxpbmtcbiAgb25Db25maWdMb2FkZWQ/OiAocHJvcHM6IHsgY2hhdElucHV0TWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0pID0+IHZvaWQ7IC8vIENhbGxiYWNrIGZvciB3aGVuIHRoZSBjaGF0IGlucHV0IG1ldGFkYXRhIGlzIGxvYWRlZFxufVxuXG5jb25zdCBERUZBVUxUX1NFUlZFUl9VTkFWQUlMQUJMRV9NRVNTQUdFID1cbiAgXCJUaGUgc2VydmljZSBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZS4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIjtcbmNvbnN0IERFRkFVTFRfU0VSVkVSX1VOQVZBSUxBQkxFX0NPTlRBQ1RfTEFCRUwgPSBcIkNvbnRhY3Qgc3VwcG9ydFwiO1xuXG5mdW5jdGlvbiBpc05ldHdvcmtPclNlcnZlckVycm9yKGVycm9yOiBhbnkpOiBib29sZWFuIHtcbiAgLy8gTm8gcmVzcG9uc2UgPSBuZXR3b3JrIGVycm9yXG4gIGlmICghZXJyb3IucmVzcG9uc2UpIHtcbiAgICBjb25zdCBjb2RlID0gZXJyb3I/LmNvZGU7XG4gICAgaWYgKFxuICAgICAgY29kZSA9PT0gXCJFUlJfTkVUV09SS1wiIHx8XG4gICAgICBjb2RlID09PSBcIkVDT05OUkVGVVNFRFwiIHx8XG4gICAgICBjb2RlID09PSBcIkVUSU1FRE9VVFwiIHx8XG4gICAgICBjb2RlID09PSBcIkVSUl9DT05ORUNUSU9OX1JFRlVTRURcIlxuICAgIClcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0cnVlOyAvLyBhbnkgcmVxdWVzdCBlcnJvciB3aXRob3V0IHJlc3BvbnNlIGlzIHRyZWF0ZWQgYXMgc2VydmVyL25ldHdvcmsgaXNzdWVcbiAgfVxuICBjb25zdCBzdGF0dXMgPSBlcnJvci5yZXNwb25zZT8uc3RhdHVzO1xuICByZXR1cm4gdHlwZW9mIHN0YXR1cyA9PT0gXCJudW1iZXJcIiAmJiBzdGF0dXMgPj0gNTAwO1xufVxuXG5leHBvcnQgY29uc3QgdXNlQ2hhdCA9ICh7XG4gIGJhc2VVcmwsXG4gIHdlYnNvY2tldFVybCxcbiAgYXBpS2V5LFxuICB0ZW5hbnQsXG4gIG1ldGFkYXRhLFxuICB1c2VXcyA9IHRydWUsXG4gIHVzZVBvbGwgPSBmYWxzZSxcbiAgbGFuZ3VhZ2UsXG4gIG9uRXJyb3IsXG4gIG9uVGFrZW92ZXIsXG4gIG9uRmluYWxpemUsXG4gIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgb25Db25maWdMb2FkZWQsXG59OiBVc2VDaGF0UHJvcHMpID0+IHtcbiAgY29uc3QgW21lc3NhZ2VzLCBzZXRNZXNzYWdlc10gPSB1c2VTdGF0ZTxDaGF0TWVzc2FnZVtdPihbXSk7XG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtwcmVsb2FkZWRBdHRhY2htZW50cywgc2V0UHJlbG9hZGVkQXR0YWNobWVudHNdID0gdXNlU3RhdGU8XG4gICAgQXR0YWNobWVudFtdXG4gID4oW10pO1xuICBjb25zdCBbY29ubmVjdGlvblN0YXRlLCBzZXRDb25uZWN0aW9uU3RhdGVdID0gdXNlU3RhdGU8XG4gICAgXCJjb25uZWN0aW5nXCIgfCBcImNvbm5lY3RlZFwiIHwgXCJkaXNjb25uZWN0ZWRcIlxuICA+KFwiZGlzY29ubmVjdGVkXCIpO1xuICBjb25zdCBbaXNBZ2VudFR5cGluZywgc2V0SXNBZ2VudFR5cGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IGNoYXRTZXJ2aWNlUmVmID0gdXNlUmVmPENoYXRTZXJ2aWNlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtjb252ZXJzYXRpb25JZCwgc2V0Q29udmVyc2F0aW9uSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtndWVzdFRva2VuLCBzZXRHdWVzdFRva2VuXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbcG9zc2libGVRdWVyaWVzLCBzZXRQb3NzaWJsZVF1ZXJpZXNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFtdKTtcbiAgY29uc3QgW3dlbGNvbWVUaXRsZSwgc2V0V2VsY29tZVRpdGxlXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbd2VsY29tZUltYWdlVXJsLCBzZXRXZWxjb21lSW1hZ2VVcmxdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFt3ZWxjb21lTWVzc2FnZSwgc2V0V2VsY29tZU1lc3NhZ2VdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtpbnB1dERpc2NsYWltZXJIdG1sLCBzZXRJbnB1dERpc2NsYWltZXJIdG1sXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbdGhpbmtpbmdQaHJhc2VzLCBzZXRUaGlua2luZ1BocmFzZXNdID0gdXNlU3RhdGU8c3RyaW5nW10+KFtdKTtcbiAgY29uc3QgW3RoaW5raW5nRGVsYXlNcywgc2V0VGhpbmtpbmdEZWxheU1zXSA9IHVzZVN0YXRlPG51bWJlcj4oMTAwMCk7XG4gIGNvbnN0IFthdmFpbGFibGVMYW5ndWFnZXMsIHNldEF2YWlsYWJsZUxhbmd1YWdlc10gPSB1c2VTdGF0ZTxzdHJpbmdbXSB8IG51bGw+KFxuICAgIG51bGwsXG4gICk7XG4gIGNvbnN0IFtjaGF0SW5wdXRNZXRhZGF0YSwgc2V0Q2hhdElucHV0TWV0YWRhdGFdID0gdXNlU3RhdGU8XG4gICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgPih7fSk7XG4gIGNvbnN0IFtpc1Rha2VuT3Zlciwgc2V0SXNUYWtlbk92ZXJdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbaXNGaW5hbGl6ZWQsIHNldElzRmluYWxpemVkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdCBsYW5ndWFnZVJlZiA9IHVzZVJlZihsYW5ndWFnZSk7XG4gIGxhbmd1YWdlUmVmLmN1cnJlbnQgPSBsYW5ndWFnZTtcblxuICAvLyBVbmlmaWVkIFdlYlNvY2tldCBjb25uZWN0aW9uIChyZWNvbm5lY3QsIGtlZXAtYWxpdmUpXG4gIGNvbnN0IG9uV3NNZXNzYWdlID0gdXNlQ2FsbGJhY2soKGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudD8ucHJvY2Vzc1dlYlNvY2tldE1lc3NhZ2UoZGF0YSk7XG4gIH0sIFtdKTtcblxuICB1c2VDaGF0V2ViU29ja2V0KHtcbiAgICBiYXNlVXJsLFxuICAgIHdlYnNvY2tldFVybCxcbiAgICBhcGlLZXksXG4gICAgdGVuYW50LFxuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIGd1ZXN0VG9rZW4sXG4gICAgdXNlV3M6IHVzZVdzID8/IHRydWUsXG4gICAgbGFuZ3VhZ2UsXG4gICAgb25NZXNzYWdlOiBvbldzTWVzc2FnZSxcbiAgICBvbkNvbm5lY3Rpb25TdGF0ZTogc2V0Q29ubmVjdGlvblN0YXRlLFxuICAgIHJlY29ubmVjdDogdHJ1ZSxcbiAgfSk7XG5cbiAgLy8gU2NvcGVkIG1lc3NhZ2VzIGtleSBmb3IgYXBpS2V5LCBjb252ZXJzYXRpb0lkXG4gIGNvbnN0IGJ1aWxkTWVzc2FnZXNLZXkgPSB1c2VDYWxsYmFjayhcbiAgICAoYXBpS2V5VmFsOiBzdHJpbmcsIGNvbnZJZDogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKCFjb252SWQpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGBnZW5hc3Npc3RfY29udmVyc2F0aW9uX21lc3NhZ2VzOiR7YXBpS2V5VmFsfToke2NvbnZJZH1gO1xuICAgIH0sXG4gICAgW10sXG4gICk7XG5cbiAgY29uc3QgdmFsaWRhdGVNZXNzYWdlcyA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSkgPT4ge1xuICAgICAgY29uc3QgaGFzVGFrZU92ZXJNc2cgPSBtZXNzYWdlcy5zb21lKChtKSA9PiBtPy50eXBlID09PSBcInRha2VvdmVyXCIpO1xuICAgICAgY29uc3QgaGFzRmluYWxpemVkTXNnID0gbWVzc2FnZXMuc29tZSgobSkgPT4gbT8udHlwZSA9PT0gXCJmaW5hbGl6ZWRcIik7XG4gICAgICBzZXRJc1Rha2VuT3ZlcihoYXNUYWtlT3Zlck1zZyk7XG4gICAgICBzZXRJc0ZpbmFsaXplZChoYXNGaW5hbGl6ZWRNc2cpO1xuICAgIH0sXG4gICAgW3NldElzVGFrZW5PdmVyLCBzZXRJc0ZpbmFsaXplZF0sXG4gICk7XG5cbiAgLy8gQ2hlY2sgaWYgYW4gZXJyb3IgaXMgYSB0b2tlbiBleHBpcmF0aW9uIGVycm9yICg0MDEgKyBcIlRva2VuIGhhcyBleHBpcmVkLlwiKVxuICBjb25zdCBpc1Rva2VuRXhwaXJlZEVycm9yID0gdXNlQ2FsbGJhY2soKGVycm9yOiBhbnkpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gISEoXG4gICAgICBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDAxICYmXG4gICAgICBlcnJvcj8ucmVzcG9uc2U/LmRhdGEgJiZcbiAgICAgIChlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yID09PSBcIlRva2VuIGhhcyBleHBpcmVkLlwiIHx8XG4gICAgICAgIGVycm9yLnJlc3BvbnNlLmRhdGEubWVzc2FnZSA9PT0gXCJUb2tlbiBoYXMgZXhwaXJlZC5cIiB8fFxuICAgICAgICAodHlwZW9mIGVycm9yLnJlc3BvbnNlLmRhdGEgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICBlcnJvci5yZXNwb25zZS5kYXRhLmluY2x1ZGVzKFwiVG9rZW4gaGFzIGV4cGlyZWRcIikpKVxuICAgICk7XG4gIH0sIFtdKTtcblxuICAvLyBSZXNldCBjb252ZXJzYXRpb24gc3RhdGUgdG8gaW5pdGlhbCAoZS5nLiBhZnRlciB0b2tlbiBleHBpcmF0aW9uKVxuICBjb25zdCByZXNldFRvSW5pdGlhbFN0YXRlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldENvbnZlcnNhdGlvbklkKG51bGwpO1xuICAgIHNldEd1ZXN0VG9rZW4obnVsbCk7XG4gICAgc2V0SXNGaW5hbGl6ZWQoZmFsc2UpO1xuICAgIHNldElzVGFrZW5PdmVyKGZhbHNlKTtcbiAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJkaXNjb25uZWN0ZWRcIik7XG4gICAgc2V0V2VsY29tZVRpdGxlKG51bGwpO1xuICAgIHNldFdlbGNvbWVJbWFnZVVybChudWxsKTtcbiAgICBzZXRXZWxjb21lTWVzc2FnZShudWxsKTtcbiAgICBzZXRJbnB1dERpc2NsYWltZXJIdG1sKG51bGwpO1xuICAgIHNldFBvc3NpYmxlUXVlcmllcyhbXSk7XG4gICAgc2V0VGhpbmtpbmdQaHJhc2VzKFtdKTtcbiAgICBzZXRUaGlua2luZ0RlbGF5TXMoMTAwMCk7XG4gICAgc2V0Q2hhdElucHV0TWV0YWRhdGEoe30pO1xuICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50ID0gMDtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmIChrZXkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgIH1cbiAgfSwgW2FwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBEZWVwIGNvbXBhcmUgbWV0YWRhdGEgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1pbml0aWFsaXphdGlvbnNcbiAgLy8gT25seSByZS1pbml0aWFsaXplIGlmIG1ldGFkYXRhIGFjdHVhbGx5IGNoYW5nZXMgKGJ5IHZhbHVlLCBub3QgcmVmZXJlbmNlKVxuICBjb25zdCBtZXRhZGF0YVN0cmluZyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEgfHwge30pLFxuICAgIFttZXRhZGF0YV0sXG4gICk7XG4gIGNvbnN0IHByZXZCYXNlVXJsUmVmID0gdXNlUmVmPHN0cmluZz4oYmFzZVVybCk7XG4gIGNvbnN0IHByZXZXZWJzb2NrZXRVcmxSZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih3ZWJzb2NrZXRVcmwpO1xuICBjb25zdCBwcmV2QXBpS2V5UmVmID0gdXNlUmVmPHN0cmluZz4oYXBpS2V5KTtcbiAgY29uc3QgcHJldlRlbmFudFJlZiA9IHVzZVJlZjxzdHJpbmcgfCB1bmRlZmluZWQ+KHRlbmFudCk7XG4gIGNvbnN0IHByZXZVc2VXc1JlZiA9IHVzZVJlZjxib29sZWFuPih1c2VXcyk7XG4gIGNvbnN0IHByZXZVc2VQb2xsUmVmID0gdXNlUmVmPGJvb2xlYW4+KHVzZVBvbGwpO1xuXG4gIC8vIEhlYXJ0YmVhdCBwb2xsaW5nIHN0YXRlICh3aGVuIFdlYlNvY2tldCBpcyBkaXNhYmxlZClcbiAgY29uc3QgaGVhcnRiZWF0RmFpbHVyZUNvdW50UmVmID0gdXNlUmVmPG51bWJlcj4oMCk7XG4gIGNvbnN0IGhlYXJ0YmVhdEludGVydmFsUmVmID0gdXNlUmVmPG51bWJlcj4oMCk7XG4gIGNvbnN0IGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmID0gdXNlUmVmPG51bWJlcj4oMCk7XG4gIC8vIFJlZnMgc28gd2Ugb25seSBydW4gdGFrZW92ZXIvZmluYWxpemVkIG9uY2UgcGVyIGNvbnZlcnNhdGlvbiAoYXZvaWQgc3RhbGUgaXNUYWtlbk92ZXIvaXNGaW5hbGl6ZWQgaW4gcG9sbCBjbG9zdXJlKVxuICBjb25zdCB0YWtlb3ZlclByb2Nlc3NlZFJlZiA9IHVzZVJlZjxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IGZpbmFsaXplZFByb2Nlc3NlZFJlZiA9IHVzZVJlZjxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gU3RvcmUgY2FsbGJhY2tzIGluIHJlZnMgc28gdGhleSBkb24ndCB0cmlnZ2VyIHJlLWluaXRpYWxpemF0aW9uXG4gIGNvbnN0IG9uRXJyb3JSZWYgPSB1c2VSZWYob25FcnJvcik7XG4gIGNvbnN0IG9uVGFrZW92ZXJSZWYgPSB1c2VSZWYob25UYWtlb3Zlcik7XG4gIGNvbnN0IG9uRmluYWxpemVSZWYgPSB1c2VSZWYob25GaW5hbGl6ZSk7XG4gIGNvbnN0IG9uQ29uZmlnTG9hZGVkUmVmID0gdXNlUmVmKG9uQ29uZmlnTG9hZGVkKTtcblxuICAvLyBVcGRhdGUgY2FsbGJhY2sgcmVmcyB3aGVuIHRoZXkgY2hhbmdlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25FcnJvclJlZi5jdXJyZW50ID0gb25FcnJvcjtcbiAgfSwgW29uRXJyb3JdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIG9uVGFrZW92ZXJSZWYuY3VycmVudCA9IG9uVGFrZW92ZXI7XG4gIH0sIFtvblRha2VvdmVyXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbkZpbmFsaXplUmVmLmN1cnJlbnQgPSBvbkZpbmFsaXplO1xuICB9LCBbb25GaW5hbGl6ZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25Db25maWdMb2FkZWRSZWYuY3VycmVudCA9IG9uQ29uZmlnTG9hZGVkO1xuICB9LCBbb25Db25maWdMb2FkZWRdKTtcblxuICAvLyBTeW5jIG1ldGFkYXRhIChlLmcuIGBsYW5ndWFnZWAgZm9yIG91dGJvdW5kIHJlcXVlc3RzKSB3aXRob3V0IGNhbmNlbGxpbmcgYm9vdHN0cmFwIG9yIHJlY3JlYXRpbmcgdGhlIHNlcnZpY2VcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50Py5zZXRNZXRhZGF0YShtZXRhZGF0YSk7XG4gIH0sIFttZXRhZGF0YVN0cmluZywgbWV0YWRhdGFdKTtcblxuICAvLyBJbml0aWFsaXplIGNoYXQgc2VydmljZSAtIG9ubHkgd2hlbiBjb25uZWN0aW9uLXJlbGF0ZWQgaW5wdXRzIGNoYW5nZSAobm90IGxhbmd1YWdlL21ldGFkYXRhIOKAlCB0aG9zZSBjYW5jZWwgaW4tZmxpZ2h0IGxvY2FsZSBmZXRjaClcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgYmFzZVVybENoYW5nZWQgPSBwcmV2QmFzZVVybFJlZi5jdXJyZW50ICE9PSBiYXNlVXJsO1xuICAgIGNvbnN0IHdlYnNvY2tldFVybENoYW5nZWQgPSBwcmV2V2Vic29ja2V0VXJsUmVmLmN1cnJlbnQgIT09IHdlYnNvY2tldFVybDtcbiAgICBjb25zdCBhcGlLZXlDaGFuZ2VkID0gcHJldkFwaUtleVJlZi5jdXJyZW50ICE9PSBhcGlLZXk7XG4gICAgY29uc3QgdGVuYW50Q2hhbmdlZCA9IHByZXZUZW5hbnRSZWYuY3VycmVudCAhPT0gdGVuYW50O1xuICAgIGNvbnN0IHVzZVdzQ2hhbmdlZCA9IHByZXZVc2VXc1JlZi5jdXJyZW50ICE9PSB1c2VXcztcbiAgICBjb25zdCB1c2VQb2xsQ2hhbmdlZCA9IHByZXZVc2VQb2xsUmVmLmN1cnJlbnQgIT09IHVzZVBvbGw7XG4gICAgLy8gT25seSByZS1pbml0aWFsaXplIGZvciBjb25uZWN0aW9uLXJlbGF0ZWQgY2hhbmdlcywgTk9UIGZvciBtZXRhZGF0YSBjaGFuZ2VzXG4gICAgY29uc3QgbmVlZHNSZWluaXQgPVxuICAgICAgIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQgfHxcbiAgICAgIGJhc2VVcmxDaGFuZ2VkIHx8XG4gICAgICB3ZWJzb2NrZXRVcmxDaGFuZ2VkIHx8XG4gICAgICBhcGlLZXlDaGFuZ2VkIHx8XG4gICAgICB0ZW5hbnRDaGFuZ2VkIHx8XG4gICAgICB1c2VXc0NoYW5nZWQ7XG5cbiAgICBpZiAobmVlZHNSZWluaXQpIHtcbiAgICAgIC8vIFVwZGF0ZSByZWZzXG4gICAgICBpZiAoYmFzZVVybENoYW5nZWQpIHByZXZCYXNlVXJsUmVmLmN1cnJlbnQgPSBiYXNlVXJsO1xuICAgICAgaWYgKHdlYnNvY2tldFVybENoYW5nZWQpIHByZXZXZWJzb2NrZXRVcmxSZWYuY3VycmVudCA9IHdlYnNvY2tldFVybDtcbiAgICAgIGlmIChhcGlLZXlDaGFuZ2VkKSBwcmV2QXBpS2V5UmVmLmN1cnJlbnQgPSBhcGlLZXk7XG4gICAgICBpZiAodGVuYW50Q2hhbmdlZCkgcHJldlRlbmFudFJlZi5jdXJyZW50ID0gdGVuYW50O1xuICAgICAgaWYgKHVzZVdzQ2hhbmdlZCkgcHJldlVzZVdzUmVmLmN1cnJlbnQgPSB1c2VXcztcbiAgICAgIGlmICh1c2VQb2xsQ2hhbmdlZCkgcHJldlVzZVBvbGxSZWYuY3VycmVudCA9IHVzZVBvbGw7XG5cbiAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIHNlcnZpY2UgaWYgaXQgZXhpc3RzXG4gICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldENvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoKCkgPT4ge30pO1xuICAgICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRXZWxjb21lRGF0YUhhbmRsZXIobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQgPSBuZXcgQ2hhdFNlcnZpY2UoXG4gICAgICAgIGJhc2VVcmwsXG4gICAgICAgIHdlYnNvY2tldFVybCxcbiAgICAgICAgYXBpS2V5LFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgdGVuYW50LFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgdXNlV3MsXG4gICAgICAgIHVzZVBvbGwsXG4gICAgICApO1xuICAgICAgc2V0QXZhaWxhYmxlTGFuZ3VhZ2VzKG51bGwpO1xuXG4gICAgICAvLyBTZXQgdXAgaGFuZGxlcnNcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0TWVzc2FnZUhhbmRsZXIoKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNZXNzYWdlOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgIGNyZWF0ZV90aW1lOlxuICAgICAgICAgICAgIW1lc3NhZ2UuY3JlYXRlX3RpbWUgfHwgaXNOYU4obWVzc2FnZS5jcmVhdGVfdGltZSlcbiAgICAgICAgICAgICAgPyBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKVxuICAgICAgICAgICAgICA6IG1lc3NhZ2UuY3JlYXRlX3RpbWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVHJhY2sgbGF0ZXN0IGNyZWF0ZV90aW1lIHdlJ3ZlIHNlZW4gZnJvbSBzZXJ2ZXIvd2Vic29ja2V0IChpbiBzZWNvbmRzKVxuICAgICAgICBpZiAobm9ybWFsaXplZE1lc3NhZ2UuY3JlYXRlX3RpbWUgJiYgbm9ybWFsaXplZE1lc3NhZ2UuY3JlYXRlX3RpbWUgPiAwKSB7XG4gICAgICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IE1hdGgucm91bmQobm9ybWFsaXplZE1lc3NhZ2UuY3JlYXRlX3RpbWUpICogMTAwMCAvIDEwMDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgbWVzc2FnZSB0byBtZXNzYWdlcyBhcnJheVxuICAgICAgICBzZXRNZXNzYWdlcygocHJldk1lc3NhZ2VzKSA9PiB7XG4gICAgICAgICAgLy8gQXZvaWQgYWRkaW5nIGR1cGxpY2F0ZSBtZXNzYWdlcyB3aXRoIHNhbWUgbWVzc2FnZV9pZCBhbmQgdHlwZVxuICAgICAgICAgIGlmIChub3JtYWxpemVkTWVzc2FnZS5tZXNzYWdlX2lkKSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSBwcmV2TWVzc2FnZXMuc29tZSgobSkgPT4gbS5tZXNzYWdlX2lkID09PSBub3JtYWxpemVkTWVzc2FnZS5tZXNzYWdlX2lkKTtcbiAgICAgICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHByZXZNZXNzYWdlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFsuLi5wcmV2TWVzc2FnZXMsIG5vcm1hbGl6ZWRNZXNzYWdlXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RvcCB0eXBpbmcgYW5pbWF0aW9uIHdoZW4gYWdlbnQgb3Igc3lzdGVtIG1lc3NhZ2UgYXJyaXZlc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbm9ybWFsaXplZE1lc3NhZ2Uuc3BlYWtlciA9PT0gXCJhZ2VudFwiIHx8XG4gICAgICAgICAgbm9ybWFsaXplZE1lc3NhZ2Uuc3BlYWtlciA9PT0gXCJzcGVjaWFsXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFRha2VvdmVySGFuZGxlcigoKSA9PiB7XG4gICAgICAgIHNldElzVGFrZW5PdmVyKHRydWUpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uVGFrZW92ZXJSZWYuY3VycmVudCkge1xuICAgICAgICAgIG9uVGFrZW92ZXJSZWYuY3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRGaW5hbGl6ZWRIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25GaW5hbGl6ZVJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25GaW5hbGl6ZVJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldENvbm5lY3Rpb25TdGF0ZUhhbmRsZXIoKHN0YXRlKSA9PiB7XG4gICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShzdGF0ZSk7XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gXCJjb25uZWN0ZWRcIikge1xuICAgICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZXRXZWxjb21lRGF0YUhhbmRsZXIoKGRhdGEpID0+IHtcbiAgICAgICAgc2V0V2VsY29tZVRpdGxlKGRhdGEudGl0bGUgPz8gbnVsbCk7XG4gICAgICAgIHNldFdlbGNvbWVJbWFnZVVybChkYXRhLmltYWdlVXJsID8/IG51bGwpO1xuICAgICAgICBzZXRXZWxjb21lTWVzc2FnZShkYXRhLm1lc3NhZ2UgPz8gbnVsbCk7XG4gICAgICAgIHNldElucHV0RGlzY2xhaW1lckh0bWwoZGF0YS5pbnB1dERpc2NsYWltZXJIdG1sID8/IG51bGwpO1xuICAgICAgICBpZiAoZGF0YS5wb3NzaWJsZVF1ZXJpZXMgJiYgZGF0YS5wb3NzaWJsZVF1ZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhkYXRhLnBvc3NpYmxlUXVlcmllcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldFNlcnZlclVuYXZhaWxhYmxlQ29uZmlnKFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzZXJ2aWNlID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudDtcbiAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgW2luZm9dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIHNlcnZpY2UuZmV0Y2hBZ2VudEluZm8/LigpID8/IFByb21pc2UucmVzb2x2ZShudWxsKSxcbiAgICAgICAgICBzZXJ2aWNlLmZldGNoQWdlbnRDaGF0TG9jYWxlcz8uKCkgPz8gUHJvbWlzZS5yZXNvbHZlKG51bGwpLFxuICAgICAgICBdKTtcblxuICAgICAgICAvLyBzZXQgYXZhaWxhYmxlIGxhbmd1YWdlcyBmcm9tIHRoZSBhZ2VudCBpbmZvXG4gICAgICAgIGlmIChpbmZvICYmIEFycmF5LmlzQXJyYXkoaW5mby5hZ2VudF9hdmFpbGFibGVfbGFuZ3VhZ2VzKSkge1xuICAgICAgICAgIHNldEF2YWlsYWJsZUxhbmd1YWdlcyhpbmZvLmFnZW50X2F2YWlsYWJsZV9sYW5ndWFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAoaW5mbyAmJiBBcnJheS5pc0FycmF5KGluZm8uYWdlbnRfYXZhaWxhYmxlX2xhbmd1YWdlcykpIHtcbiAgICAgICAgICBzZXRBdmFpbGFibGVMYW5ndWFnZXMoaW5mby5hZ2VudF9hdmFpbGFibGVfbGFuZ3VhZ2VzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYW5nID0gbGFuZ3VhZ2VSZWYuY3VycmVudCB8fCBcImVuXCI7XG4gICAgICAgIGNvbnN0IGFwcGxpZWQgPSBzZXJ2aWNlLmFwcGx5TGFuZ3VhZ2VGcm9tTG9jYWxlcyhsYW5nKTtcbiAgICAgICAgaWYgKCFjYW5jZWxsZWQgJiYgYXBwbGllZCkge1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyhhcHBsaWVkLnRoaW5raW5nUGhyYXNlcyk7XG4gICAgICAgICAgc2V0VGhpbmtpbmdEZWxheU1zKGFwcGxpZWQudGhpbmtpbmdEZWxheU1zKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gc2VydmljZS5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhY2FuY2VsbGVkICYmXG4gICAgICAgICAgbWV0YSAmJlxuICAgICAgICAgIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgT2JqZWN0LmtleXMobWV0YSkubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oeyBjaGF0SW5wdXRNZXRhZGF0YTogbWV0YSB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGEgc2F2ZWQgY29udmVyc2F0aW9uXG4gICAgICBjb25zdCBjb252SWQgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldENvbnZlcnNhdGlvbklkKCk7XG4gICAgICBpZiAoY29udklkKSB7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICAgIHNldEd1ZXN0VG9rZW4oY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRHdWVzdFRva2VuKCkpO1xuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5pc0NvbnZlcnNhdGlvbkZpbmFsaXplZCgpKSB7XG4gICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXVzZVdzKSB7XG4gICAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiY29ubmVjdGVkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBQdWxsIGluaXRpYWwgc3RhdGljIGRhdGFcbiAgICAgIGlmIChjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldFBvc3NpYmxlUXVlcmllcz8uKCkgfHwgW107XG4gICAgICAgIGlmIChxdWVyaWVzLmxlbmd0aCkgc2V0UG9zc2libGVRdWVyaWVzKHF1ZXJpZXMpO1xuICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YT8uKCk7XG4gICAgICAgIGlmICh3ZWxjb21lKSB7XG4gICAgICAgICAgc2V0V2VsY29tZVRpdGxlKHdlbGNvbWUudGl0bGUgfHwgbnVsbCk7XG4gICAgICAgICAgc2V0V2VsY29tZUltYWdlVXJsKHdlbGNvbWUuaW1hZ2VVcmwgfHwgbnVsbCk7XG4gICAgICAgICAgc2V0V2VsY29tZU1lc3NhZ2Uod2VsY29tZS5tZXNzYWdlIHx8IG51bGwpO1xuICAgICAgICAgIHNldElucHV0RGlzY2xhaW1lckh0bWwod2VsY29tZS5pbnB1dERpc2NsYWltZXJIdG1sID8/IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZz8uKCk7XG4gICAgICAgIGlmICh0aGlua2luZykge1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKG1ldGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYW5ncyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0QXZhaWxhYmxlTGFuZ3VhZ2VzPy4oKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGFuZ3MpKSB7XG4gICAgICAgICAgc2V0QXZhaWxhYmxlTGFuZ3VhZ2VzKGxhbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oeyBjaGF0SW5wdXRNZXRhZGF0YTogbWV0YSA/PyB7fSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbHdheXMgdXBkYXRlIGhhbmRsZXJzIHdoZW4gY2FsbGJhY2tzIGNoYW5nZSAod2l0aG91dCByZS1pbml0aWFsaXppbmcpXG4gICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0VGFrZW92ZXJIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAob25UYWtlb3ZlclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25UYWtlb3ZlclJlZi5jdXJyZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNldEZpbmFsaXplZEhhbmRsZXIoKCkgPT4ge1xuICAgICAgICBzZXRJc0ZpbmFsaXplZCh0cnVlKTtcbiAgICAgICAgc2V0SXNBZ2VudFR5cGluZyhmYWxzZSk7XG4gICAgICAgIGlmIChvbkZpbmFsaXplUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkZpbmFsaXplUmVmLmN1cnJlbnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuc2V0U2VydmVyVW5hdmFpbGFibGVDb25maWcoXG4gICAgICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgICAgICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW51cCBvbmx5IG9uIHVubW91bnRcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICB9O1xuICB9LCBbXG4gICAgYmFzZVVybCxcbiAgICB3ZWJzb2NrZXRVcmwsXG4gICAgYXBpS2V5LFxuICAgIHRlbmFudCxcbiAgICB1c2VXcyxcbiAgICB1c2VQb2xsLFxuICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gIF0pO1xuXG4gIC8vIFdoZW4gdGhlIHBsdWdpbiBsYW5ndWFnZSBjaGFuZ2VzOiB1cGRhdGUgQWNjZXB0LUxhbmd1YWdlIGFuZCBhcHBseSB0aGUgYWdlbnQgbG9jYWxlIGJ1bmRsZSAoZnJvbSBmZXRjaEFnZW50Q2hhdExvY2FsZXMpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc3ZjID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudDtcbiAgICBpZiAoIXN2YykgcmV0dXJuO1xuICAgIHN2Yy5zZXRMYW5ndWFnZShsYW5ndWFnZSk7XG4gICAgY29uc3QgbGFuZyA9IGxhbmd1YWdlIHx8IFwiZW5cIjtcbiAgICBjb25zdCBhcHBsaWVkID0gc3ZjLmFwcGx5TGFuZ3VhZ2VGcm9tTG9jYWxlcyhsYW5nKTtcbiAgICBpZiAoYXBwbGllZCkge1xuICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKGFwcGxpZWQudGhpbmtpbmdQaHJhc2VzKTtcbiAgICAgIHNldFRoaW5raW5nRGVsYXlNcyhhcHBsaWVkLnRoaW5raW5nRGVsYXlNcyk7XG4gICAgfVxuICB9LCBbbGFuZ3VhZ2VdKTtcblxuICAvLyBMb2FkIG1lc3NhZ2VzIGZvciBjdXJyZW50IHBhaXIgd2hlbiBhdmFpbGFibGVcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmICgha2V5KSB7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50ID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICBjb25zdCBwYXJzZWQ6IENoYXRNZXNzYWdlW10gPSBzdG9yZWQgPyBKU09OLnBhcnNlKHN0b3JlZCkgOiBbXTtcblxuICAgICAgc2V0TWVzc2FnZXMocGFyc2VkKTtcbiAgICAgIC8vIEluaXRpYWxpemUgbGFzdCBzZWVuIGNyZWF0ZV90aW1lIGZyb20gY2FjaGVkIG1lc3NhZ2VzXG4gICAgICBpZiAocGFyc2VkLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBtYXhDcmVhdGVUaW1lID0gTWF0aC5tYXgoXG4gICAgICAgICAgLi4ucGFyc2VkLm1hcCgobSkgPT4gKG0uY3JlYXRlX3RpbWUgPyBtLmNyZWF0ZV90aW1lIDogMCkpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgbGFzdCBzZWVuIGNyZWF0ZV90aW1lIGZyb20gY2FjaGVkIG1lc3NhZ2VzXG4gICAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSBNYXRoLnJvdW5kKG1heENyZWF0ZVRpbWUpICogMTAwMCAvIDEwMDA7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldE1lc3NhZ2VzKFtdKTtcbiAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSAwO1xuICAgIH1cbiAgfSwgW2FwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBWYWxpZGF0ZSBtZXNzYWdlcyBmb3IgdGFrZW92ZXIgYW5kIGZpbmFsaXplZFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZhbGlkYXRlTWVzc2FnZXMobWVzc2FnZXMpO1xuICB9LCBbbWVzc2FnZXNdKTtcblxuICAvLyBQZXJzaXN0IG1lc3NhZ2VzIGZvciBjdXJyZW50IHBhaXJcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBidWlsZE1lc3NhZ2VzS2V5KGFwaUtleSwgY29udmVyc2F0aW9uSWQpO1xuICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkobWVzc2FnZXMpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbbWVzc2FnZXMsIGFwaUtleSwgY29udmVyc2F0aW9uSWQsIGJ1aWxkTWVzc2FnZXNLZXldKTtcblxuICAvLyBIZWFydGJlYXQgbG9uZyBwb2xsaW5nIHdoZW4gV2ViU29ja2V0IGlzIGRpc2FibGVkIGFuZCB3ZSBoYXZlIGFuIGluLXByb2dyZXNzIGNvbnZlcnNhdGlvbi5cbiAgLy8gLSBTdGFydHMgd2l0aCBhIHNob3J0IGludGVydmFsXG4gIC8vIC0gSW5jcmVhc2VzIHRoZSBpbnRlcnZhbCBvdmVyIHRpbWUgKGV2ZXJ5IHN1Y2Nlc3NmdWwgcG9sbClcbiAgLy8gLSBSZXRyaWVzIHVwIHRvIDUgdGltZXMgb24gZXJyb3JzLCB0aGVuIHN0b3BzXG4gIGNvbnN0IEhFQVJUQkVBVF9JTklUSUFMX0lOVEVSVkFMX01TID0gMjAwMDtcbiAgY29uc3QgSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVMgPSA1MDAwO1xuICBjb25zdCBIRUFSVEJFQVRfTUFYX0lOVEVSVkFMX01TID0gMzAwMDA7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodXNlV3MgfHwgIWNvbnZlcnNhdGlvbklkIHx8IGlzRmluYWxpemVkKSByZXR1cm47XG4gICAgY29uc3Qgc3ZjID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudDtcbiAgICBpZiAoIXN2YykgcmV0dXJuO1xuXG4gICAgLy8gUmVzZXQgcGVyLWNvbnZlcnNhdGlvbiBmbGFncyBzbyB3ZSBvbmx5IG5vdGlmeSB0YWtlb3Zlci9maW5hbGl6ZWQgb25jZVxuICAgIHRha2VvdmVyUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuXG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgIGxldCB0aW1lb3V0SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgc2NoZWR1bGVOZXh0ID0gKGRlbGF5TXM6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuICAgICAgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQocG9sbCwgZGVsYXlNcyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHBvbGwgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgcG9sbE1lc3NhZ2VzIH0gPSBhd2FpdCBzdmMucG9sbEluUHJvZ3Jlc3NDb252ZXJzYXRpb24oKTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFJlc2V0IGZhaWx1cmUgY291bnRlciBvbiBzdWNjZXNzXG4gICAgICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ID0gMDtcblxuICAgICAgICAvLyBPbmx5IHRha2UgbWVzc2FnZXMgbmV3ZXIgdGhhbiBvciBlcXVhbCB0byBsYXN0IHNlZW4gY3JlYXRlX3RpbWUgKHNlY29uZHMpLlxuICAgICAgICAvLyBVc2Ugc2Vjb25kcyBjb25zaXN0ZW50bHk6IHBvbGwgbWVzc2FnZXMgYXJlIG5vcm1hbGl6ZWQgdG8gc2Vjb25kcyBpbiBjaGF0U2VydmljZS5cbiAgICAgICAgY29uc3QgbGFzdFNlcnZlckNyZWF0ZVRpbWUgPSBNYXRoLmZsb29yKE51bWJlcihsYXN0U2VydmVyQ3JlYXRlVGltZVJlZi5jdXJyZW50KSB8fCAwKTtcblxuICAgICAgICBjb25zdCBuZXdNZXNzYWdlc1JhdyA9IChwb2xsTWVzc2FnZXMgfHwgW10pLmZpbHRlcigobSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN0ID0gTnVtYmVyKChtIGFzIGFueSkuY3JlYXRlX3RpbWUpO1xuICAgICAgICAgIGlmIChjdCA9PT0gMCB8fCAhTnVtYmVyLmlzRmluaXRlKGN0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIHJldHVybiBjdCA+IGxhc3RTZXJ2ZXJDcmVhdGVUaW1lO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobmV3TWVzc2FnZXNSYXcubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHNwZWFrZXJUeXBlID0gKHNwZWFrZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHNwZWFrZXIgPT09IFwiY3VzdG9tZXJcIikgcmV0dXJuIFwiY3VzdG9tZXJcIjtcbiAgICAgICAgICAgIGlmIChzcGVha2VyID09PSBcImFnZW50XCIpIHJldHVybiBcImFnZW50XCI7XG4gICAgICAgICAgICByZXR1cm4gXCJzcGVjaWFsXCI7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IHRleHQgPSAobTogSW5Qcm9ncmVzc1BvbGxNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBpZiAobS50eXBlID09PSBcInRha2VvdmVyXCIpIHJldHVybiBcIlN1cGVydmlzb3IgdG9vayBvdmVyXCI7XG4gICAgICAgICAgICBpZiAobS50eXBlID09PSBcImZpbmFsaXplZFwiKSByZXR1cm4gXCJDb252ZXJzYXRpb24gRmluYWxpemVkXCI7XG4gICAgICAgICAgICByZXR1cm4gKG0gYXMgYW55KS50ZXh0O1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBuZXdNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSA9IG5ld01lc3NhZ2VzUmF3Lm1hcCgobSkgPT4gKHtcbiAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IChtIGFzIGFueSkuaWQsXG4gICAgICAgICAgICBjcmVhdGVfdGltZTogTnVtYmVyKChtIGFzIGFueSkuY3JlYXRlX3RpbWUpLFxuICAgICAgICAgICAgc3RhcnRfdGltZTogTnVtYmVyKChtIGFzIGFueSkuc3RhcnRfdGltZSA/PyAwKSxcbiAgICAgICAgICAgIGVuZF90aW1lOiBOdW1iZXIoKG0gYXMgYW55KS5lbmRfdGltZSA/PyAwKSxcbiAgICAgICAgICAgIHNwZWFrZXI6IHNwZWFrZXJUeXBlKChtIGFzIGFueSkuc3BlYWtlciksXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0KG0pLFxuICAgICAgICAgICAgdHlwZTogKG0gYXMgYW55KS50eXBlLFxuICAgICAgICAgICAgZmVlZGJhY2s6IChtIGFzIGFueSkuZmVlZGJhY2ssXG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgLy8gQXBwZW5kIG9ubHkgbWVzc2FnZXMgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIChkZWR1cGUgYnkgbWVzc2FnZV9pZDsgc2FtZSBjcmVhdGVfdGltZSBjYW4gcmVwZWF0IGV2ZXJ5IHBvbGwpXG4gICAgICAgICAgaWYgKG5ld01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNldE1lc3NhZ2VzKChwcmV2TWVzc2FnZXMpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgIHByZXZNZXNzYWdlcy5tYXAoKG0pID0+IG0ubWVzc2FnZV9pZCkuZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCB0b0FkZCA9IG5ld01lc3NhZ2VzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAobSkgPT4gbS5tZXNzYWdlX2lkID09IG51bGwgfHwgIWV4aXN0aW5nSWRzLmhhcyhtLm1lc3NhZ2VfaWQpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAodG9BZGQubGVuZ3RoID09PSAwKSByZXR1cm4gcHJldk1lc3NhZ2VzO1xuICAgICAgICAgICAgICBjb25zdCBtYXhDcmVhdGVUaW1lRnJvbVBvbGwgPSB0b0FkZC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKG1heCwgbXNnKSA9PlxuICAgICAgICAgICAgICAgICAgTnVtYmVyLmlzRmluaXRlKG1zZy5jcmVhdGVfdGltZSlcbiAgICAgICAgICAgICAgICAgICAgPyBNYXRoLm1heChtYXgsIG1zZy5jcmVhdGVfdGltZSlcbiAgICAgICAgICAgICAgICAgICAgOiBtYXgsXG4gICAgICAgICAgICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWUsXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgbGFzdFNlcnZlckNyZWF0ZVRpbWVSZWYuY3VycmVudCA9IG1heENyZWF0ZVRpbWVGcm9tUG9sbDtcbiAgICAgICAgICAgICAgcmV0dXJuIFsuLi5wcmV2TWVzc2FnZXMsIC4uLnRvQWRkXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIG5ldyBtZXNzYWdlcyBmb3IgdGFrZW92ZXIvZmluYWxpemUgbWFya2Vyc1xuICAgICAgICAgIGNvbnN0IGhhc1Rha2VvdmVyTWVzc2FnZSA9IG5ld01lc3NhZ2VzLnNvbWUoXG4gICAgICAgICAgICAobSkgPT4gbS50eXBlID09PSBcInRha2VvdmVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBoYXNGaW5hbGl6ZWRNZXNzYWdlID0gbmV3TWVzc2FnZXMuc29tZShcbiAgICAgICAgICAgIChtKSA9PiBtLnR5cGUgPT09IFwiZmluYWxpemVkXCIsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICgoc3RhdHVzID09PSBcImZpbmFsaXplZFwiIHx8IGhhc0ZpbmFsaXplZE1lc3NhZ2UpICYmICFmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoc3RhdHVzID09PSBcInRha2VvdmVyXCIgfHwgaGFzVGFrZW92ZXJNZXNzYWdlKSAmJiAhdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICBzZXRJc1Rha2VuT3Zlcih0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gbmV3IG1lc3NhZ2VzOyBzdGlsbCBob25vciBzdGF0dXMgaWYgaXQgaW5kaWNhdGVzIGEgdGVybWluYWwgc3RhdGUgKG9uY2UgcGVyIGNvbnZlcnNhdGlvbilcbiAgICAgICAgICBpZiAoc3RhdHVzID09PSBcImZpbmFsaXplZFwiICYmICFmaW5hbGl6ZWRQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgZmluYWxpemVkUHJvY2Vzc2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgc3ZjLmhhbmRsZUNvbnZlcnNhdGlvbkZpbmFsaXplZCgpO1xuICAgICAgICAgICAgc2V0SXNGaW5hbGl6ZWQodHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IFwidGFrZW92ZXJcIiAmJiAhdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgdGFrZW92ZXJQcm9jZXNzZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICBzdmMubm90aWZ5VGFrZW92ZXJGcm9tUG9sbCgpO1xuICAgICAgICAgICAgc2V0SXNUYWtlbk92ZXIodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gXCJmaW5hbGl6ZWRcIikge1xuICAgICAgICAgIC8vIE1hcmsgZmluYWxpemVkIGFuZCBsZXQgdGhlIGVmZmVjdCBjbGVhbnVwIHByZXZlbnQgZnVydGhlciBzY2hlZHVsaW5nXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jcmVhc2UgcG9sbGluZyBpbnRlcnZhbCBvdmVyIHRpbWUgb24gc3VjY2Vzc1xuICAgICAgICAvLyBjb25zdCBuZXh0SW50ZXJ2YWwgPSBNYXRoLm1pbihcbiAgICAgICAgLy8gICAoaGVhcnRiZWF0SW50ZXJ2YWxSZWYuY3VycmVudCB8fCBIRUFSVEJFQVRfSU5JVElBTF9JTlRFUlZBTF9NUykgK1xuICAgICAgICAvLyAgICAgSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVMsXG4gICAgICAgIC8vICAgSEVBUlRCRUFUX01BWF9JTlRFUlZBTF9NUyxcbiAgICAgICAgLy8gKTtcbiAgICAgICAgY29uc3QgbmV4dEludGVydmFsID0gSEVBUlRCRUFUX0lOVEVSVkFMX1NURVBfTVM7XG4gICAgICAgIGhlYXJ0YmVhdEludGVydmFsUmVmLmN1cnJlbnQgPSBuZXh0SW50ZXJ2YWw7XG4gICAgICAgIHNjaGVkdWxlTmV4dChuZXh0SW50ZXJ2YWwpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHJldHVybjtcbiAgICAgICAgLy8gSW5jcmVtZW50IGZhaWx1cmUgY291bnRlciBhbmQgc3RvcCBhZnRlciA1IGNvbnNlY3V0aXZlIGZhaWx1cmVzXG4gICAgICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ICs9IDE7XG4gICAgICAgIGlmIChoZWFydGJlYXRGYWlsdXJlQ291bnRSZWYuY3VycmVudCA+PSA1KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldHJ5RGVsYXkgPVxuICAgICAgICAgIGhlYXJ0YmVhdEludGVydmFsUmVmLmN1cnJlbnQgfHwgSEVBUlRCRUFUX0lOSVRJQUxfSU5URVJWQUxfTVM7XG4gICAgICAgIHNjaGVkdWxlTmV4dChyZXRyeURlbGF5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gUmVzZXQgY291bnRlcnMgZm9yIHRoaXMgY29udmVyc2F0aW9uIGFuZCBzdGFydCBpbW1lZGlhdGVseVxuICAgIGhlYXJ0YmVhdEZhaWx1cmVDb3VudFJlZi5jdXJyZW50ID0gMDtcbiAgICBoZWFydGJlYXRJbnRlcnZhbFJlZi5jdXJyZW50ID0gSEVBUlRCRUFUX0lOSVRJQUxfSU5URVJWQUxfTVM7XG5cbiAgICBpZiAodXNlUG9sbCAmJiAhdXNlV3MpIHtcbiAgICAgIHBvbGwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IG51bGwpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3VzZVdzLCBjb252ZXJzYXRpb25JZCwgaXNGaW5hbGl6ZWQsIHVzZVBvbGxdKTtcblxuICAvLyBSZXNldCBjb252ZXJzYXRpb25cbiAgY29uc3QgcmVzZXRDb252ZXJzYXRpb24gPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAocmVDYXB0Y2hhVG9rZW4/OiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmICghY2hhdFNlcnZpY2VSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RpbmdcIik7XG4gICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMoW10pO1xuICAgICAgc2V0V2VsY29tZVRpdGxlKG51bGwpO1xuICAgICAgc2V0V2VsY29tZUltYWdlVXJsKG51bGwpO1xuICAgICAgc2V0V2VsY29tZU1lc3NhZ2UobnVsbCk7XG4gICAgICBzZXRJbnB1dERpc2NsYWltZXJIdG1sKG51bGwpO1xuICAgICAgc2V0VGhpbmtpbmdQaHJhc2VzKFtdKTtcbiAgICAgIHNldFRoaW5raW5nRGVsYXlNcygxMDAwKTtcbiAgICAgIGxhc3RTZXJ2ZXJDcmVhdGVUaW1lUmVmLmN1cnJlbnQgPSAwO1xuICAgICAgY29uc3Qga2V5ID0gYnVpbGRNZXNzYWdlc0tleShhcGlLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIH1cbiAgICAgIHNldElzRmluYWxpemVkKGZhbHNlKTtcbiAgICAgIHNldElzVGFrZW5PdmVyKGZhbHNlKTtcbiAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBSZXNldCB0aGUgY29udmVyc2F0aW9uIGluIHRoZSBjaGF0IHNlcnZpY2VcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcbiAgICAgICAgc2V0Q29udmVyc2F0aW9uSWQobnVsbCk7XG4gICAgICAgIHNldEd1ZXN0VG9rZW4obnVsbCk7XG5cbiAgICAgICAgLy8gU3RhcnQgYSBuZXcgY29udmVyc2F0aW9uXG4gICAgICAgIGNvbnN0IGNvbnZJZCA9XG4gICAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zdGFydENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlbik7XG4gICAgICAgIHNldENvbnZlcnNhdGlvbklkKGNvbnZJZCk7XG4gICAgICAgIHNldEd1ZXN0VG9rZW4oY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRHdWVzdFRva2VuKCkpO1xuICAgICAgICBzZXRDb25uZWN0aW9uU3RhdGUoXCJjb25uZWN0ZWRcIik7XG5cbiAgICAgICAgLy8gR2V0IHBvc3NpYmxlIHF1ZXJpZXMgZnJvbSBBUEkgcmVzcG9uc2VcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgcXVlcmllcyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0UG9zc2libGVRdWVyaWVzKCk7XG4gICAgICAgICAgaWYgKHF1ZXJpZXMgJiYgcXVlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzZXRQb3NzaWJsZVF1ZXJpZXMocXVlcmllcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHdlbGNvbWUgYW5kIHRoaW5raW5nIGRhdGFcbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEpIHtcbiAgICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSgpO1xuICAgICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRJbnB1dERpc2NsYWltZXJIdG1sKHdlbGNvbWUuaW5wdXREaXNjbGFpbWVySHRtbCA/PyBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZygpO1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRBdmFpbGFibGVMYW5ndWFnZXMpIHtcbiAgICAgICAgICBjb25zdCBsYW5ncyA9IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0QXZhaWxhYmxlTGFuZ3VhZ2VzKCk7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGFuZ3MpKSB7XG4gICAgICAgICAgICBzZXRBdmFpbGFibGVMYW5ndWFnZXMobGFuZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKG1ldGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgIGNoYXRJbnB1dE1ldGFkYXRhOlxuICAgICAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCkgPz8ge30sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiZGlzY29ubmVjdGVkXCIpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIGNvbnN0IHVwbG9hZEZpbGUgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoZmlsZTogRmlsZSk6IFByb21pc2U8QXR0YWNobWVudCB8IG51bGw+ID0+IHtcbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbklkID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudD8uZ2V0Q29udmVyc2F0aW9uSWQoKTtcbiAgICAgIGlmICghY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVwbG9hZFJlc3VsdCA9IGF3YWl0IGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ/LnVwbG9hZEZpbGUoXG4gICAgICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIGZpbGUgdXJsIHdpdGggdGhlIGJhc2UgdXJsXG4gICAgICAgIGNvbnN0IGZpbGVfdXJsID0gbmV3IFVSTCh1cGxvYWRSZXN1bHQhLmZpbGVfdXJsISwgYmFzZVVybCkuaHJlZjtcblxuICAgICAgICBjb25zdCBhdHRhY2htZW50OiBBdHRhY2htZW50ID0ge1xuICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgIHVybDogZmlsZV91cmwsXG4gICAgICAgICAgZmlsZV9pZDogdXBsb2FkUmVzdWx0Py5maWxlX2lkLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNldFByZWxvYWRlZEF0dGFjaG1lbnRzKChwcmV2KSA9PiBbLi4ucHJldiwgYXR0YWNobWVudF0pO1xuICAgICAgICByZXR1cm4gYXR0YWNobWVudDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgcmVzZXRUb0luaXRpYWxTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbkVycm9yUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IgYXMgRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgYXBpS2V5LFxuICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICBidWlsZE1lc3NhZ2VzS2V5LFxuICAgICAgaXNUb2tlbkV4cGlyZWRFcnJvcixcbiAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUsXG4gICAgXSxcbiAgKTtcblxuICAvLyBTZW5kIG1lc3NhZ2VcbiAgY29uc3Qgc2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoXG4gICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICBmaWxlczogRmlsZVtdID0gW10sXG4gICAgICBleHRyYU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIHJlQ2FwdGNoYVRva2VuPzogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNoYXQgc2VydmljZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcblxuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50czogQXR0YWNobWVudFtdID0gW107XG5cbiAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB1cGxvYWRlZEZpbGVzID0gZmlsZXNcbiAgICAgICAgICAgIC5tYXAoKGYpID0+XG4gICAgICAgICAgICAgIHByZWxvYWRlZEF0dGFjaG1lbnRzLmZpbmQoXG4gICAgICAgICAgICAgICAgKHBhKSA9PiBwYS5uYW1lID09PSBmLm5hbWUgJiYgcGEuc2l6ZSA9PT0gZi5zaXplLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBBdHRhY2htZW50W107XG4gICAgICAgICAgbmV3QXR0YWNobWVudHMucHVzaCguLi51cGxvYWRlZEZpbGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IHR5cGluZyBpbW1lZGlhdGVseSB3aGVuIHVzZXIgc2VuZHMsIHVubGVzcyBjb252ZXJzYXRpb24gaXMgdGFrZW4gb3ZlciBieSBhIGh1bWFuXG4gICAgICAgIGlmICghaXNUYWtlbk92ZXIpIHtcbiAgICAgICAgICBzZXRJc0FnZW50VHlwaW5nKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5zZW5kTWVzc2FnZShcbiAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIG5ld0F0dGFjaG1lbnRzLFxuICAgICAgICAgIGV4dHJhTWV0YWRhdGEsXG4gICAgICAgICAgcmVDYXB0Y2hhVG9rZW4sXG4gICAgICAgICk7XG5cbiAgICAgICAgc2V0UHJlbG9hZGVkQXR0YWNobWVudHMoW10pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKGlzVG9rZW5FeHBpcmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgcmVzZXRUb0luaXRpYWxTdGF0ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTmV0d29ya09yU2VydmVyRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgLy8gU2hvdyBjdXN0b20gc2VydmVyLXVuYXZhaWxhYmxlIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpIC8gMTAwMDtcbiAgICAgICAgICBjb25zdCBjcmVhdGVUaW1lID1cbiAgICAgICAgICAgIGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQ/LmdldENvbnZlcnNhdGlvbkNyZWF0ZVRpbWUoKTtcbiAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBjcmVhdGVUaW1lICE9IG51bGwgPyBub3cgLSBjcmVhdGVUaW1lIDogMDtcbiAgICAgICAgICBjb25zdCBlbmRUaW1lID0gc3RhcnRUaW1lICsgMC4wMTtcbiAgICAgICAgICBjb25zdCBzcGVjaWFsTWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICBjcmVhdGVfdGltZTogbm93LFxuICAgICAgICAgICAgc3RhcnRfdGltZTogc3RhcnRUaW1lLFxuICAgICAgICAgICAgZW5kX3RpbWU6IGVuZFRpbWUsXG4gICAgICAgICAgICBzcGVha2VyOiBcInNwZWNpYWxcIixcbiAgICAgICAgICAgIHRleHQ6XG4gICAgICAgICAgICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSA/PyBERUZBVUxUX1NFUlZFUl9VTkFWQUlMQUJMRV9NRVNTQUdFLFxuICAgICAgICAgICAgLi4uKHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCAmJiB7XG4gICAgICAgICAgICAgIGxpbmtVcmw6IHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICAgICAgICAgICAgbGlua0xhYmVsOlxuICAgICAgICAgICAgICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsID8/XG4gICAgICAgICAgICAgICAgREVGQVVMVF9TRVJWRVJfVU5BVkFJTEFCTEVfQ09OVEFDVF9MQUJFTCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzZXRNZXNzYWdlcygocHJldikgPT4gWy4uLnByZXYsIHNwZWNpYWxNZXNzYWdlXSk7XG4gICAgICAgICAgLy8gRG9uJ3QgY2FsbCBvbkVycm9yIHNvIHRoZSB1c2VyIG9ubHkgc2VlcyBvdXIgY3VzdG9tIG1lc3NhZ2VcbiAgICAgICAgfSBlbHNlIGlmIChvbkVycm9yUmVmLmN1cnJlbnQgJiYgZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIG9uRXJyb3JSZWYuY3VycmVudChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBwcmVsb2FkZWRBdHRhY2htZW50cyxcbiAgICAgIGlzVGFrZW5PdmVyLFxuICAgICAgaXNUb2tlbkV4cGlyZWRFcnJvcixcbiAgICAgIHJlc2V0VG9Jbml0aWFsU3RhdGUsXG4gICAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gICAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICBdLFxuICApO1xuXG4gIGNvbnN0IHNlbmRBdWRpb01lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoYXVkaW9CbG9iOiBCbG9iLCBhdWRpb0Zvcm1hdDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIWNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2hhdCBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKHRydWUpO1xuICAgICAgICBpZiAoIWlzVGFrZW5PdmVyKSB7XG4gICAgICAgICAgc2V0SXNBZ2VudFR5cGluZyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnNlbmRBdWRpb01lc3NhZ2UoYXVkaW9CbG9iLCBhdWRpb0Zvcm1hdCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHNldElzQWdlbnRUeXBpbmcoZmFsc2UpO1xuICAgICAgICBpZiAoaXNUb2tlbkV4cGlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICByZXNldFRvSW5pdGlhbFN0YXRlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAob25FcnJvclJlZi5jdXJyZW50ICYmIGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2lzVGFrZW5PdmVyLCBpc1Rva2VuRXhwaXJlZEVycm9yLCByZXNldFRvSW5pdGlhbFN0YXRlXSxcbiAgKTtcblxuICBjb25zdCBzdGFydENvbnZlcnNhdGlvbiA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChyZUNhcHRjaGFUb2tlbj86IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RpbmdcIik7XG4gICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcblxuICAgICAgICAvLyBSZXNldCBzdGF0ZSBmb3IgbmV3IGNvbnZlcnNhdGlvblxuICAgICAgICBzZXRNZXNzYWdlcyhbXSk7XG4gICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhbXSk7XG4gICAgICAgIGNvbnN0IGtleSA9IGJ1aWxkTWVzc2FnZXNLZXkoYXBpS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHNldElzRmluYWxpemVkKGZhbHNlKTtcbiAgICAgICAgc2V0SXNUYWtlbk92ZXIoZmFsc2UpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5yZXNldENoYXRDb252ZXJzYXRpb24oKTtcbiAgICAgICAgc2V0Q29udmVyc2F0aW9uSWQobnVsbCk7XG4gICAgICAgIHNldEd1ZXN0VG9rZW4obnVsbCk7XG5cbiAgICAgICAgY29uc3QgY29udklkID1cbiAgICAgICAgICBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LnN0YXJ0Q29udmVyc2F0aW9uKHJlQ2FwdGNoYVRva2VuKTtcbiAgICAgICAgc2V0Q29udmVyc2F0aW9uSWQoY29udklkKTtcbiAgICAgICAgc2V0R3Vlc3RUb2tlbihjaGF0U2VydmljZVJlZi5jdXJyZW50LmdldEd1ZXN0VG9rZW4oKSk7XG4gICAgICAgIHNldENvbm5lY3Rpb25TdGF0ZShcImNvbm5lY3RlZFwiKTtcblxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXMpIHtcbiAgICAgICAgICBjb25zdCBxdWVyaWVzID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRQb3NzaWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgICBpZiAocXVlcmllcyAmJiBxdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNldFBvc3NpYmxlUXVlcmllcyhxdWVyaWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXRTZXJ2aWNlUmVmLmN1cnJlbnQuZ2V0V2VsY29tZURhdGEpIHtcbiAgICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRXZWxjb21lRGF0YSgpO1xuICAgICAgICAgIHNldFdlbGNvbWVUaXRsZSh3ZWxjb21lLnRpdGxlIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVJbWFnZVVybCh3ZWxjb21lLmltYWdlVXJsIHx8IG51bGwpO1xuICAgICAgICAgIHNldFdlbGNvbWVNZXNzYWdlKHdlbGNvbWUubWVzc2FnZSB8fCBudWxsKTtcbiAgICAgICAgICBzZXRJbnB1dERpc2NsYWltZXJIdG1sKHdlbGNvbWUuaW5wdXREaXNjbGFpbWVySHRtbCA/PyBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHRoaW5raW5nID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRUaGlua2luZ0NvbmZpZygpO1xuICAgICAgICAgIHNldFRoaW5raW5nUGhyYXNlcyh0aGlua2luZy5waHJhc2VzIHx8IFtdKTtcbiAgICAgICAgICBzZXRUaGlua2luZ0RlbGF5TXModGhpbmtpbmcuZGVsYXlNcyB8fCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCk7XG4gICAgICAgIGlmIChtZXRhICYmIHR5cGVvZiBtZXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKG1ldGEpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRDaGF0SW5wdXRNZXRhZGF0YShtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBvbkNvbmZpZ0xvYWRlZFJlZi5jdXJyZW50Py4oe1xuICAgICAgICAgIGNoYXRJbnB1dE1ldGFkYXRhOlxuICAgICAgICAgICAgY2hhdFNlcnZpY2VSZWYuY3VycmVudC5nZXRDaGF0SW5wdXRNZXRhZGF0YT8uKCkgPz8ge30sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKFwiZGlzY29ubmVjdGVkXCIpO1xuICAgICAgICBzZXRJc0FnZW50VHlwaW5nKGZhbHNlKTtcbiAgICAgICAgaWYgKG9uRXJyb3JSZWYuY3VycmVudCAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIC8vIEFkZCBmZWVkYmFjayB0byBhbiBhZ2VudCBtZXNzYWdlXG4gIGNvbnN0IGFkZEZlZWRiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgbWVzc2FnZUlkOiBzdHJpbmcsXG4gICAgICB2YWx1ZTogXCJnb29kXCIgfCBcImJhZFwiLFxuICAgICAgZmVlZGJhY2tNZXNzYWdlPzogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFjaGF0U2VydmljZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYW5ub3Qgc2VuZCBmZWVkYmFjazogQ2hhdFNlcnZpY2Ugbm90IGluaXRpYWxpemVkXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIW1lc3NhZ2VJZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IHNlbmQgZmVlZGJhY2s6IG1lc3NhZ2VJZCBpcyByZXF1aXJlZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjaGF0U2VydmljZVJlZi5jdXJyZW50LmFkZEZlZWRiYWNrKFxuICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBmZWVkYmFja01lc3NhZ2UsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbmV3RmVlZGJhY2s6IE1lc3NhZ2VGZWVkYmFjayA9IHtcbiAgICAgICAgICBmZWVkYmFjazogdmFsdWUsXG4gICAgICAgICAgZmVlZGJhY2tfbWVzc2FnZTogZmVlZGJhY2tNZXNzYWdlLFxuICAgICAgICAgIGZlZWRiYWNrX3RpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNldE1lc3NhZ2VzKChwcmV2KSA9PlxuICAgICAgICAgIHByZXYubWFwKChtKSA9PiB7XG4gICAgICAgICAgICAvLyBNYXRjaCBieSBtZXNzYWdlX2lkIG9yIGlkIGZpZWxkXG4gICAgICAgICAgICBjb25zdCBtc2dJZCA9IG0ubWVzc2FnZV9pZCB8fCAobSBhcyBhbnkpLmlkO1xuICAgICAgICAgICAgcmV0dXJuIG1zZ0lkID09PSBtZXNzYWdlSWRcbiAgICAgICAgICAgICAgPyB7IC4uLm0sIGZlZWRiYWNrOiBbLi4uKG0uZmVlZGJhY2sgfHwgW10pLCBuZXdGZWVkYmFja10gfVxuICAgICAgICAgICAgICA6IG07XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAob25FcnJvclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgb25FcnJvclJlZi5jdXJyZW50KGVycm9yIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW10sXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlcyxcbiAgICBpc0xvYWRpbmcsXG4gICAgc2VuZE1lc3NhZ2UsXG4gICAgc2VuZEF1ZGlvTWVzc2FnZSxcbiAgICB1cGxvYWRGaWxlLFxuICAgIHJlc2V0Q29udmVyc2F0aW9uLFxuICAgIHN0YXJ0Q29udmVyc2F0aW9uLFxuICAgIGNvbm5lY3Rpb25TdGF0ZSxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBndWVzdFRva2VuLFxuICAgIHBvc3NpYmxlUXVlcmllcyxcbiAgICBpc1Rha2VuT3ZlcixcbiAgICBpc0ZpbmFsaXplZCxcbiAgICBpc0FnZW50VHlwaW5nLFxuICAgIGFkZEZlZWRiYWNrLFxuICAgIHdlbGNvbWVUaXRsZSxcbiAgICB3ZWxjb21lSW1hZ2VVcmwsXG4gICAgd2VsY29tZU1lc3NhZ2UsXG4gICAgaW5wdXREaXNjbGFpbWVySHRtbCxcbiAgICB0aGlua2luZ1BocmFzZXMsXG4gICAgdGhpbmtpbmdEZWxheU1zLFxuICAgIGF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICBjaGF0SW5wdXRNZXRhZGF0YSxcbiAgfTtcbn07XG4iXX0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Attachment, AttachmentWithFile } from '../types';
|
|
2
|
+
interface UseFileAttachmentsOptions {
|
|
3
|
+
uploadFile: (file: File) => Promise<Attachment | null>;
|
|
4
|
+
t: (key: string, fallback?: string) => string;
|
|
5
|
+
}
|
|
6
|
+
export declare function useFileAttachments({ uploadFile, t }: UseFileAttachmentsOptions): {
|
|
7
|
+
attachments: AttachmentWithFile[];
|
|
8
|
+
setAttachments: import("react").Dispatch<import("react").SetStateAction<AttachmentWithFile[]>>;
|
|
9
|
+
uploadingFiles: Set<string>;
|
|
10
|
+
fileErrorToast: string | null;
|
|
11
|
+
fileInputRef: import("react").RefObject<HTMLInputElement>;
|
|
12
|
+
handleFileChange: (e: React.ChangeEvent<HTMLInputElement>) => Promise<void>;
|
|
13
|
+
handleRemoveAttachment: (fileName: string) => void;
|
|
14
|
+
clearAttachments: () => void;
|
|
15
|
+
};
|
|
16
|
+
export {};
|