@projectcor/maia-components 2.49.0-beta.1 → 2.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
  2. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
  3. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +117 -0
  4. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +31 -101
  5. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +91 -0
  6. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +49 -140
  7. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +257 -0
  8. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -205
  9. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
  10. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
  11. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
  12. package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
  13. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
  14. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
  15. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +59 -0
  16. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -57
  17. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
  18. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +184 -0
  19. package/lib/components/atoms/MAIAInput/MAIAInput.js +127 -176
  20. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +96 -0
  21. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -113
  22. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
  23. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
  24. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +3 -4
  25. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +3 -11
  26. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
  27. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +2 -3
  28. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
  29. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
  30. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
  31. package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
  32. package/lib/components/atoms/TextArea/TextArea.js +11 -20
  33. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
  34. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +6 -29
  35. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +68 -0
  36. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +17 -56
  37. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +133 -0
  38. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +31 -112
  39. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
  40. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
  41. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
  42. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +197 -233
  43. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +398 -0
  44. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +209 -235
  45. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +515 -4
  46. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +228 -344
  47. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
  48. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
  49. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +49 -0
  50. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +36 -33
  51. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
  52. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
  53. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
  54. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
  55. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
  56. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
  57. package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
  58. package/lib/components/molecules/Sidebar/Sidebar.js +25 -22
  59. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +512 -0
  60. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +309 -643
  61. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
  62. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
  63. package/lib/constants/formatExtensions.js +7 -8
  64. package/lib/dev/DevReasoningTimeline.js +8 -50
  65. package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
  66. package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
  67. package/lib/hooks/useChatManager/useChatManager.helpers.js +902 -0
  68. package/lib/hooks/useChatManager/useChatManager.js +267 -741
  69. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +365 -0
  70. package/lib/hooks/useChatMessages/useChatMessages.js +59 -285
  71. package/lib/hooks/useClientSearch.helpers.js +36 -0
  72. package/lib/hooks/useClientSearch.js +4 -32
  73. package/lib/hooks/useContextMentions.helpers.js +212 -0
  74. package/lib/hooks/useContextMentions.js +5 -223
  75. package/lib/hooks/useContextMentions.types.js +2 -0
  76. package/lib/hooks/useContextPinPopover.helpers.js +95 -0
  77. package/lib/hooks/useContextPinPopover.js +16 -75
  78. package/lib/hooks/useEntitySearch.helpers.js +407 -0
  79. package/lib/hooks/useEntitySearch.js +52 -436
  80. package/lib/hooks/useMentionPopover.helpers.js +41 -0
  81. package/lib/hooks/useMentionPopover.js +9 -35
  82. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
  83. package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
  84. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
  85. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
  86. package/lib/hooks/useProjectSearch.helpers.js +61 -0
  87. package/lib/hooks/useProjectSearch.js +4 -58
  88. package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
  89. package/lib/hooks/useProjectSummaryConfig.js +14 -52
  90. package/lib/hooks/useReasoningTrace/reasoningStore.js +8 -39
  91. package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
  92. package/lib/hooks/useRecentClientsSearch.js +4 -32
  93. package/lib/lang/br/index.js +1 -7
  94. package/lib/lang/en/index.js +1 -7
  95. package/lib/lang/es/index.js +1 -7
  96. package/lib/lang/fr/index.js +1 -7
  97. package/lib/services/maia/Agents/getAgents.helpers.js +241 -0
  98. package/lib/services/maia/Agents/getAgents.js +90 -282
  99. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
  100. package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
  101. package/lib/services/utils/mapChatMessages.helpers.js +223 -0
  102. package/lib/services/utils/mapChatMessages.js +25 -254
  103. package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
  104. package/lib/store/sessions/sessionNotifications.js +35 -41
  105. package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
  106. package/lib/store/sessions/sessionStreamManager.js +172 -236
  107. package/lib/test/mockSseStream.js +121 -0
  108. package/lib/test/streamdownCodeMock.js +6 -0
  109. package/lib/test/streamdownMock.js +12 -0
  110. package/lib/types/Chat.js +1 -1
  111. package/lib/types/agentModal.js +1 -1
  112. package/lib/types/reasoning.js +1 -1
  113. package/lib/utils/imagePreprocessor.helpers.js +28 -0
  114. package/lib/utils/imagePreprocessor.js +12 -37
  115. package/lib/utils/renderContextMentions.helpers.js +110 -0
  116. package/lib/utils/renderContextMentions.js +4 -110
  117. package/lib/utils/streamActivityMessages.helpers.js +222 -0
  118. package/lib/utils/streamActivityMessages.js +4 -221
  119. package/package.json +2 -2
  120. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +0 -53
  121. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +0 -8
  122. package/lib/components/atoms/ContextCompactedNotice/index.js +0 -2
  123. package/lib/types/contextCompaction.js +0 -48
  124. package/lib/types/jest-dom.d.js +0 -2
@@ -0,0 +1,398 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ import { Feedback } from '../MessageFeedback/MessageFeedback';
5
+ import { ChatHistoryRole } from '../../../types/Chat';
6
+ import { isStreamingPlaceholderMessageId } from '../../../utils/streamActivityMessages';
7
+ export var turnAnchorOffset = function turnAnchorOffset(viewportHeight) {
8
+ return Math.min(viewportHeight * 0.18, 200);
9
+ };
10
+ export var TURN_SCROLL_DURATION_MS = 600;
11
+ export var TURN_SCROLL_MAX_DURATION_MS = 800;
12
+ export var TURN_SCROLL_LONG_DISTANCE_PX = 1200;
13
+ export var computeTurnScrollDurationMs = function computeTurnScrollDurationMs(distance) {
14
+ return TURN_SCROLL_DURATION_MS + (TURN_SCROLL_MAX_DURATION_MS - TURN_SCROLL_DURATION_MS) * Math.min(1, Math.abs(distance) / TURN_SCROLL_LONG_DISTANCE_PX);
15
+ };
16
+ export var computeDistanceFromBottom = function computeDistanceFromBottom(scrollHeight, spacerHeight, scrollTop, clientHeight) {
17
+ return scrollHeight - spacerHeight - scrollTop - clientHeight;
18
+ };
19
+ export var shouldShowScrollToBottom = function shouldShowScrollToBottom(distanceFromBottom) {
20
+ var threshold = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 50;
21
+ return distanceFromBottom > threshold;
22
+ };
23
+ export var SCROLL_GRADIENT_THRESHOLD_PX = 1;
24
+ export var SCROLL_NEAR_BOTTOM_DEFAULT_THRESHOLD = 39;
25
+ export var SCROLL_NEAR_BOTTOM_UP_THRESHOLD = 15;
26
+ export var SCROLL_AT_BOTTOM_TOLERANCE_PX = 100;
27
+ export var SPACER_HEIGHT_EPSILON_PX = 1;
28
+ export var shouldShowTopScrollGradient = function shouldShowTopScrollGradient(scrollTop) {
29
+ var threshold = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SCROLL_GRADIENT_THRESHOLD_PX;
30
+ return scrollTop > threshold;
31
+ };
32
+ export var shouldShowBottomScrollGradient = function shouldShowBottomScrollGradient(distanceFromBottom) {
33
+ var threshold = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SCROLL_GRADIENT_THRESHOLD_PX;
34
+ return distanceFromBottom > threshold;
35
+ };
36
+ export var isScrollingUpward = function isScrollingUpward(scrollTop, lastScrollTop) {
37
+ return scrollTop < lastScrollTop;
38
+ };
39
+ export var isNearScrollBottom = function isNearScrollBottom(scrollHeight, scrollTop, clientHeight, threshold) {
40
+ return scrollHeight - scrollTop - clientHeight < threshold;
41
+ };
42
+ export var resolveScrollNearBottomThreshold = function resolveScrollNearBottomThreshold(currentThreshold, isScrollingUp, isNearBottom) {
43
+ if (isNearBottom) return SCROLL_NEAR_BOTTOM_DEFAULT_THRESHOLD;
44
+ if (isScrollingUp) return SCROLL_NEAR_BOTTOM_UP_THRESHOLD;
45
+ return currentThreshold;
46
+ };
47
+ export var shouldSkipTurnScrollAnimation = function shouldSkipTurnScrollAnimation(distance) {
48
+ return Math.abs(distance) < 1;
49
+ };
50
+ export var easeOutExpoScrollProgress = function easeOutExpoScrollProgress(progress) {
51
+ return progress === 1 ? 1 : 1 - Math.pow(2, -12 * progress);
52
+ };
53
+ export var computeTurnScrollTargetTop = function computeTurnScrollTargetTop(questionTop, viewportHeight) {
54
+ var offset = turnAnchorOffset(viewportHeight);
55
+ return Math.max(0, questionTop - offset);
56
+ };
57
+ export var shouldSkipTurnSpaceReservation = function shouldSkipTurnSpaceReservation(currentScrollTop, targetScrollTop) {
58
+ return targetScrollTop <= currentScrollTop;
59
+ };
60
+ export var shouldUpdateSpacerHeight = function shouldUpdateSpacerHeight(currentHeight, nextHeight) {
61
+ return Math.abs(currentHeight - nextHeight) >= SPACER_HEIGHT_EPSILON_PX;
62
+ };
63
+ export var computeSyncedTurnSpacerHeight = function computeSyncedTurnSpacerHeight(clientHeight, turnHeight, currentSpacerHeight) {
64
+ var offset = turnAnchorOffset(clientHeight);
65
+ var reserved = Math.max(0, clientHeight - turnHeight - offset);
66
+ return Math.min(currentSpacerHeight, reserved);
67
+ };
68
+ export var shouldDrainTurnSpaceOnScroll = function shouldDrainTurnSpaceOnScroll(anchoredTurnId) {
69
+ return !anchoredTurnId;
70
+ };
71
+ export var shouldReleaseTurnSpace = function shouldReleaseTurnSpace(anchoredTurnId, spacerHeight) {
72
+ return Boolean(anchoredTurnId) || spacerHeight > 0;
73
+ };
74
+ export var shouldPersistMaiaPanelScroll = function shouldPersistMaiaPanelScroll(initialChatId, scrollTop) {
75
+ return Boolean(initialChatId) && scrollTop > 0;
76
+ };
77
+ export var isContainerAtScrollBottom = function isContainerAtScrollBottom(scrollHeight, scrollTop, clientHeight) {
78
+ var tolerance = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : SCROLL_AT_BOTTOM_TOLERANCE_PX;
79
+ return scrollHeight - scrollTop <= clientHeight + tolerance;
80
+ };
81
+ export var isNewChatMessageEvent = function isNewChatMessageEvent(lastId, prevId, messagesLength, prevLength) {
82
+ return lastId !== prevId || messagesLength !== prevLength;
83
+ };
84
+ export var hasInitialUserMessageInList = function hasInitialUserMessageInList(messages) {
85
+ return messages.some(function (msg) {
86
+ return msg.id === 'user-initial-message';
87
+ });
88
+ };
89
+ export var isApprovalChatMessage = function isApprovalChatMessage(message) {
90
+ var _message$id;
91
+ return Boolean(message && (((_message$id = message.id) === null || _message$id === void 0 ? void 0 : _message$id.startsWith('approval-')) || message.approval));
92
+ };
93
+ export var isAnswerOrQuestionChatMessageId = function isAnswerOrQuestionChatMessageId(messageId) {
94
+ return Boolean((messageId === null || messageId === void 0 ? void 0 : messageId.startsWith('answer-')) || (messageId === null || messageId === void 0 ? void 0 : messageId.startsWith('question-')));
95
+ };
96
+ export var shouldAutoScrollOnMessagesChange = function shouldAutoScrollOnMessagesChange(params) {
97
+ if (!params.isNewMessage) return 'affordances-only';
98
+ if (params.anchoredTurnId) return 'sync-turn';
99
+ if (params.waitingResponse || params.isWriting) return 'affordances-only';
100
+ if (params.isAnswerOrQuestion && params.isAtBottom) return 'scroll';
101
+ if (!params.isAnswerOrQuestion && !params.isApproval && !params.hasInitialMessage && params.messagesLength > params.prevMessagesLength) {
102
+ return 'scroll';
103
+ }
104
+ return 'affordances-only';
105
+ };
106
+ export var shouldRunStreamTurnSyncEffect = function shouldRunStreamTurnSyncEffect(waitingResponse, isWriting) {
107
+ return waitingResponse || isWriting;
108
+ };
109
+ export var hasMessageLevelStreamIndicator = function hasMessageLevelStreamIndicator(lastMessageId, waitingResponse, isWriting) {
110
+ return Boolean(lastMessageId && isStreamingPlaceholderMessageId(lastMessageId) && (waitingResponse || isWriting));
111
+ };
112
+ export var shouldShowGlobalStreamLoadingIndicator = function shouldShowGlobalStreamLoadingIndicator(hasMessageLevelIndicator, streamLoadingDisplay) {
113
+ return !hasMessageLevelIndicator && Boolean(streamLoadingDisplay);
114
+ };
115
+ export var isCurrentUserMessage = function isCurrentUserMessage(role, userId, authUserId) {
116
+ return role === ChatHistoryRole.USER || userId === authUserId;
117
+ };
118
+ export var isAssistantChatMessage = function isAssistantChatMessage(role, userId) {
119
+ return role === ChatHistoryRole.ASSISTANT || userId === 'assistant';
120
+ };
121
+ export var isActiveStreamingState = function isActiveStreamingState(isStreaming, isStreamingPlaceholder) {
122
+ return Boolean(isStreaming) || isStreamingPlaceholder;
123
+ };
124
+ export var shouldShowStreamingMessageBody = function shouldShowStreamingMessageBody(isActiveStreaming, hasStreamText, streamNarrationInTimeline) {
125
+ return isActiveStreaming && hasStreamText && !streamNarrationInTimeline;
126
+ };
127
+ export var shouldShowStreamActivityIndicator = function shouldShowStreamActivityIndicator(isAssistant, isActiveStreaming, streamActivity) {
128
+ return isAssistant && isActiveStreaming && Boolean(streamActivity);
129
+ };
130
+ export var shouldRenderChangeProjectMessage = function shouldRenderChangeProjectMessage(isChangeProject, options) {
131
+ return Boolean(isChangeProject && options);
132
+ };
133
+ export var shouldShowMessageAttachmentsRow = function shouldShowMessageAttachmentsRow(attachmentCount) {
134
+ return attachmentCount > 0;
135
+ };
136
+ export var shouldRenderMessageTextBody = function shouldRenderMessageTextBody(params) {
137
+ return Boolean(params.messageText || params.showStreamingBody) && !(params.isAssistant && params.attachmentCount > 0);
138
+ };
139
+ export var shouldShowApprovalActions = function shouldShowApprovalActions(approval) {
140
+ return Boolean(approval === null || approval === void 0 ? void 0 : approval.pending_actions);
141
+ };
142
+ export var shouldHideEmptyStreamingBody = function shouldHideEmptyStreamingBody(displayText, isStreaming) {
143
+ return !displayText && !isStreaming;
144
+ };
145
+ export var shouldRenderAssistantFeedback = function shouldRenderAssistantFeedback(params) {
146
+ return params.isAssistant && !params.isError && !params.approval && !params.isStreaming && (!params.isFrontendCancelled || Boolean(params.onRetry));
147
+ };
148
+ export var shouldRenderAssistantSuggestions = function shouldRenderAssistantSuggestions(params) {
149
+ return params.isAssistant && !params.isFrontendCancelled && !params.approval && (!params.isError || params.suggestionsLength > 0);
150
+ };
151
+ export var shouldHideAssistantSuggestions = function shouldHideAssistantSuggestions(isStreaming, isLastMessage, suggestionsDisabled) {
152
+ return Boolean(isStreaming || !isLastMessage || suggestionsDisabled);
153
+ };
154
+ export var shouldRenderCreateAgentActions = function shouldRenderCreateAgentActions(params) {
155
+ return params.isAssistant && !params.isError && !params.isFrontendCancelled && !params.approval && Boolean(params.agentId);
156
+ };
157
+ export var resolveChatListItemStreamingFlags = function resolveChatListItemStreamingFlags(params) {
158
+ var isAssistant = isAssistantChatMessage(params.role, params.userId);
159
+ var isStreamingPlaceholder = isAssistant && params.isLastMessage && isStreamingPlaceholderMessageId(params.messageId);
160
+ return {
161
+ isStreamingPlaceholder: isStreamingPlaceholder,
162
+ isStreaming: isStreamingPlaceholder && (params.waitingResponse || params.isWriting)
163
+ };
164
+ };
165
+ export var countUserMessageAttachments = function countUserMessageAttachments(message) {
166
+ if (!message) return 0;
167
+ var attachmentCount = Array.isArray(message.attachments) ? message.attachments.length : 0;
168
+ var sourceCount = Array.isArray(message.sources) ? message.sources.length : 0;
169
+ return attachmentCount || sourceCount;
170
+ };
171
+ export var shouldIgnoreSuggestionClick = function shouldIgnoreSuggestionClick(suggestion, alreadySelected) {
172
+ return !(suggestion !== null && suggestion !== void 0 && suggestion.trim()) || alreadySelected;
173
+ };
174
+ export var isRetrySuggestionSelection = function isRetrySuggestionSelection(isError, suggestion, retryLabel) {
175
+ return Boolean(isError && suggestion === retryLabel);
176
+ };
177
+ export var resolveRetryAttachmentsFromUserMessage = function resolveRetryAttachmentsFromUserMessage(userMessage) {
178
+ if (Array.isArray(userMessage.attachments)) return userMessage.attachments;
179
+ if (Array.isArray(userMessage.sources)) return userMessage.sources;
180
+ return [];
181
+ };
182
+ export var shouldOpenMessageOption = function shouldOpenMessageOption(selectedOption) {
183
+ return !selectedOption;
184
+ };
185
+ export var resolveAttachmentDownloadBlobStrategy = function resolveAttachmentDownloadBlobStrategy(fileUrl, file) {
186
+ if (fileUrl) return 'remote-url';
187
+ if (file instanceof File) return 'local-file';
188
+ return null;
189
+ };
190
+ export var extractFeedbackSessionId = function extractFeedbackSessionId(messageId) {
191
+ return messageId.split('-').filter(function (questionId) {
192
+ return questionId !== 'answer';
193
+ }).join('-');
194
+ };
195
+ var AUDIO_EXTENSIONS = ['.flac', '.m4a', '.mp3', '.mp4', '.oga', '.ogg', '.wav', '.webm'];
196
+ var AUDIO_TYPES = ['flac', 'm4a', 'mp3', 'mp4', 'oga', 'ogg', 'wav', 'webm'];
197
+ export var isAudioAttachment = function isAudioAttachment(attachment) {
198
+ var _attachment$type, _attachment$name;
199
+ var attachmentType = (attachment === null || attachment === void 0 || (_attachment$type = attachment.type) === null || _attachment$type === void 0 ? void 0 : _attachment$type.toLowerCase()) || '';
200
+ var attachmentName = (attachment === null || attachment === void 0 || (_attachment$name = attachment.name) === null || _attachment$name === void 0 ? void 0 : _attachment$name.toLowerCase()) || '';
201
+ return attachmentType.startsWith('audio/') || AUDIO_TYPES.includes(attachmentType) || AUDIO_EXTENSIONS.some(function (ext) {
202
+ return attachmentName.endsWith(ext);
203
+ });
204
+ };
205
+ export var canOpenAttachmentPreview = function canOpenAttachmentPreview(attachment) {
206
+ return attachment.file instanceof File || attachment.originalFile instanceof File || Boolean(attachment.url_thumbnail || attachment.url_original || attachment.url_file);
207
+ };
208
+ export var findLastQuestionId = function findLastQuestionId(messages) {
209
+ for (var index = messages.length - 1; index >= 0; index -= 1) {
210
+ var _messages$index;
211
+ var messageId = (_messages$index = messages[index]) === null || _messages$index === void 0 ? void 0 : _messages$index.id;
212
+ if (messageId !== null && messageId !== void 0 && messageId.startsWith('question-')) {
213
+ return messageId;
214
+ }
215
+ }
216
+ return null;
217
+ };
218
+ export var computeReservedTurnSpace = function computeReservedTurnSpace(clientHeight, turnHeight, viewportHeight) {
219
+ var offset = turnAnchorOffset(viewportHeight);
220
+ return Math.max(0, clientHeight - turnHeight - offset);
221
+ };
222
+ export var resolveMessageAttachments = function resolveMessageAttachments(attachments, isAssistant, sources) {
223
+ if (attachments && attachments.length > 0) {
224
+ return attachments;
225
+ }
226
+ if (!isAssistant && Array.isArray(sources)) {
227
+ return sources;
228
+ }
229
+ return [];
230
+ };
231
+ export var resolveAttachmentDownloadFileName = function resolveAttachmentDownloadFileName(attachment) {
232
+ var extension = attachment.name.includes('.') ? '' : ".".concat(attachment.type);
233
+ return "".concat(attachment.name).concat(extension);
234
+ };
235
+ export var resolveAttachmentDownloadUrl = function resolveAttachmentDownloadUrl(attachment) {
236
+ return attachment.url_original || attachment.url_file || attachment.url_thumbnail;
237
+ };
238
+ export var shouldSkipEmptyChatListMessage = function shouldSkipEmptyChatListMessage(params) {
239
+ if (params.isStreamingPlaceholder || params.isStreaming) return false;
240
+ if (params.attachmentCount > 0 || params.sourceCount > 0) return false;
241
+ if (params.messageText) return false;
242
+ if (params.projectName) return false;
243
+ if (params.hasApproval) return false;
244
+ return true;
245
+ };
246
+ export var resolveDisableFeedbackFromWasHelpful = function resolveDisableFeedbackFromWasHelpful(wasHelpful) {
247
+ if (wasHelpful === undefined || wasHelpful === null) return null;
248
+ return wasHelpful ? Feedback.THUMBS_UP : Feedback.THUMBS_DOWN;
249
+ };
250
+ export var canRetryAssistantMessage = function canRetryAssistantMessage(params) {
251
+ if (!params.hasUserMessageForRetry || params.isStreaming || params.isError || params.hasApproval) {
252
+ return false;
253
+ }
254
+ return Boolean(params.isFrontendCancelled || !params.isCancelled && params.turnId);
255
+ };
256
+ export var computeRemovableTurnSpace = function computeRemovableTurnSpace(scrollHeight, clientHeight, scrollTop, currentSpacerHeight) {
257
+ if (currentSpacerHeight <= 0) return currentSpacerHeight;
258
+ var removable = Math.max(0, scrollHeight - clientHeight - scrollTop);
259
+ return Math.max(0, currentSpacerHeight - removable);
260
+ };
261
+ export var readSmoothStreamWindowFlags = function readSmoothStreamWindowFlags() {
262
+ if (typeof window === 'undefined') return {};
263
+ return window;
264
+ };
265
+ export var buildSmoothStreamTextOptions = function buildSmoothStreamTextOptions(flags, isStreaming) {
266
+ return _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
267
+ enabled: isStreaming,
268
+ maxCharsPerFrame: 24,
269
+ snapToWordBoundary: true
270
+ }, flags.streamLagMs != null && {
271
+ targetLagMs: flags.streamLagMs
272
+ }), flags.streamAdapt != null && {
273
+ adaptToBackendRate: flags.streamAdapt
274
+ }), flags.streamBufferMs != null && {
275
+ targetBufferMs: flags.streamBufferMs
276
+ }), flags.streamMinBuffer != null && {
277
+ minBufferChars: flags.streamMinBuffer
278
+ }), flags.streamWarmupMs != null && {
279
+ warmupMs: flags.streamWarmupMs
280
+ });
281
+ };
282
+ export var resolveStreamingRawText = function resolveStreamingRawText(isStreaming, streamingText, message) {
283
+ return isStreaming ? streamingText : message;
284
+ };
285
+ export var shouldRenderMentionInlineNodes = function shouldRenderMentionInlineNodes(hasMentions, mentionNodes) {
286
+ return Boolean(hasMentions && mentionNodes);
287
+ };
288
+ export var resolveFeedbackPropsForCancelled = function resolveFeedbackPropsForCancelled(isFrontendCancelled, sources, handleFeedbackClick) {
289
+ return {
290
+ sources: isFrontendCancelled ? undefined : sources,
291
+ handleFeedback: isFrontendCancelled ? undefined : handleFeedbackClick
292
+ };
293
+ };
294
+ export var resolveStreamingMessageHookId = function resolveStreamingMessageHookId(isStreaming, messageId) {
295
+ return isStreaming ? messageId : null;
296
+ };
297
+ export var shouldInitializeChat = function shouldInitializeChat(alreadyInitialized) {
298
+ return !alreadyInitialized;
299
+ };
300
+ export var shouldClearLastReservedQuestion = function shouldClearLastReservedQuestion(loadingMessages) {
301
+ return loadingMessages;
302
+ };
303
+ export var shouldScheduleTurnSpaceReservation = function shouldScheduleTurnSpaceReservation(loadingMessages, isLoadingMoreMessages, questionId, lastReservedQuestionId) {
304
+ return !loadingMessages && !isLoadingMoreMessages && Boolean(questionId) && questionId !== lastReservedQuestionId;
305
+ };
306
+ export var shouldSkipMessagesScrollEffect = function shouldSkipMessagesScrollEffect(hasContainer, loadingMessages, isLoadingMoreMessages, isLoadingMoreRef) {
307
+ return !hasContainer || loadingMessages || isLoadingMoreMessages || isLoadingMoreRef;
308
+ };
309
+ export var resolveContainerAtBottom = function resolveContainerAtBottom(container) {
310
+ return container ? isContainerAtScrollBottom(container.scrollHeight, container.scrollTop, container.clientHeight) : false;
311
+ };
312
+ export var shouldRunSessionCacheScrollToBottom = function shouldRunSessionCacheScrollToBottom(loadingMessages, initialChatId, messagesLength, lastScrolledSessionId) {
313
+ return !loadingMessages && Boolean(initialChatId) && messagesLength > 0 && lastScrolledSessionId !== initialChatId;
314
+ };
315
+ export var detectJustFinishedLoadingMessages = function detectJustFinishedLoadingMessages(wasLoading, loadingMessages) {
316
+ return wasLoading && !loadingMessages;
317
+ };
318
+ export var shouldScrollToBottomAfterLoad = function shouldScrollToBottomAfterLoad(justFinishedLoading, messagesLength) {
319
+ return justFinishedLoading && messagesLength > 0;
320
+ };
321
+ export var shouldUpdateScrollAffordancesOnLoadEnd = function shouldUpdateScrollAffordancesOnLoadEnd(loadingMessages) {
322
+ return !loadingMessages;
323
+ };
324
+ export var shouldClearScrollRestoreWithoutChat = function shouldClearScrollRestoreWithoutChat(initialChatId) {
325
+ return !initialChatId;
326
+ };
327
+ export var resolvePendingScrollTopFromSession = function resolvePendingScrollTopFromSession(session, initialChatId) {
328
+ if (!initialChatId || !session) return null;
329
+ if (session.scrollSessionId === initialChatId && typeof session.scrollTop === 'number' && session.scrollTop > 0) {
330
+ return session.scrollTop;
331
+ }
332
+ return null;
333
+ };
334
+ export var shouldApplyPendingScrollRestore = function shouldApplyPendingScrollRestore(loadingMessages, pendingScrollTop, hasContainer) {
335
+ return !loadingMessages && pendingScrollTop != null && pendingScrollTop > 0 && hasContainer;
336
+ };
337
+ export var shouldRestoreScrollOnExpandedChange = function shouldRestoreScrollOnExpandedChange(previousExpanded, expanded, hasContainer) {
338
+ return previousExpanded !== expanded && hasContainer;
339
+ };
340
+ export var resolveMessageListItemKey = function resolveMessageListItemKey(messageId, index) {
341
+ return messageId !== null && messageId !== void 0 ? messageId : "msg-".concat(index);
342
+ };
343
+ export var resolveCreateAgentActionsAgentId = function resolveCreateAgentActionsAgentId(followUp) {
344
+ return followUp === null || followUp === void 0 ? void 0 : followUp.agentId;
345
+ };
346
+ export var resolveStreamingTextHookId = function resolveStreamingTextHookId(isStreaming, isStreamingPlaceholder, messageId) {
347
+ return isStreaming || isStreamingPlaceholder ? messageId : null;
348
+ };
349
+ export var resolveReasoningTraceHookId = function resolveReasoningTraceHookId(isAssistant, isActiveStreaming, id) {
350
+ return isAssistant && isActiveStreaming ? id : '';
351
+ };
352
+ export var resolveScrollOnParentMode = function resolveScrollOnParentMode(expanded) {
353
+ return Boolean(expanded);
354
+ };
355
+ export var resolveLastUserMessageForAttachments = function resolveLastUserMessageForAttachments(messages, authUserId) {
356
+ return messages.filter(function (msg) {
357
+ return msg.role === ChatHistoryRole.USER || msg.user.id === authUserId.toString();
358
+ }).at(-1);
359
+ };
360
+ export var resolveSuggestionAnalyticsAgentType = function resolveSuggestionAnalyticsAgentType(isMarketplaceGlobalAgent, agentType) {
361
+ return isMarketplaceGlobalAgent ? 'marketplace' : agentType;
362
+ };
363
+ export var processChatMessagesScrollFrame = function processChatMessagesScrollFrame(input) {
364
+ var isScrollingUp = isScrollingUpward(input.scrollTop, input.lastScrollTop);
365
+ var isNearBottom = isNearScrollBottom(input.scrollHeight, input.scrollTop, input.clientHeight, input.scrollThreshold);
366
+ var nextScrollThreshold = resolveScrollNearBottomThreshold(input.scrollThreshold, isScrollingUp, isNearBottom);
367
+ return {
368
+ nextScrollThreshold: nextScrollThreshold,
369
+ lastScrollTop: input.scrollTop,
370
+ shouldDrainTurnSpace: shouldDrainTurnSpaceOnScroll(input.anchoredTurnId),
371
+ shouldScheduleScrollPersist: shouldPersistMaiaPanelScroll(input.initialChatId, input.scrollTop),
372
+ shouldNotifyScrollToBottom: isNearBottom
373
+ };
374
+ };
375
+ export var computeMeasureTurnLayout = function computeMeasureTurnLayout(params) {
376
+ var questionScrollTop = params.questionTop - params.containerTop + params.scrollTop;
377
+ var contentBottomScroll = params.contentBottom - params.containerTop + params.scrollTop;
378
+ return {
379
+ questionTop: questionScrollTop,
380
+ turnHeight: contentBottomScroll - questionScrollTop
381
+ };
382
+ };
383
+ export var resolveReserveTurnSpacePlan = function resolveReserveTurnSpacePlan(params) {
384
+ if (shouldSkipTurnSpaceReservation(params.currentScrollTop, params.targetScrollTop)) {
385
+ return {
386
+ kind: 'skip-reservation'
387
+ };
388
+ }
389
+ return {
390
+ kind: 'reserve',
391
+ spacerHeight: computeReservedTurnSpace(params.clientHeight, params.turnHeight, params.clientHeight),
392
+ targetScrollTop: params.targetScrollTop
393
+ };
394
+ };
395
+ export var resolveScrollToBottomTargetTop = function resolveScrollToBottomTargetTop(scrollHeight, clientHeight) {
396
+ return scrollHeight - clientHeight;
397
+ };
398
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZWVkYmFjayIsIkNoYXRIaXN0b3J5Um9sZSIsImlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQiLCJ0dXJuQW5jaG9yT2Zmc2V0Iiwidmlld3BvcnRIZWlnaHQiLCJNYXRoIiwibWluIiwiVFVSTl9TQ1JPTExfRFVSQVRJT05fTVMiLCJUVVJOX1NDUk9MTF9NQVhfRFVSQVRJT05fTVMiLCJUVVJOX1NDUk9MTF9MT05HX0RJU1RBTkNFX1BYIiwiY29tcHV0ZVR1cm5TY3JvbGxEdXJhdGlvbk1zIiwiZGlzdGFuY2UiLCJhYnMiLCJjb21wdXRlRGlzdGFuY2VGcm9tQm90dG9tIiwic2Nyb2xsSGVpZ2h0Iiwic3BhY2VySGVpZ2h0Iiwic2Nyb2xsVG9wIiwiY2xpZW50SGVpZ2h0Iiwic2hvdWxkU2hvd1Njcm9sbFRvQm90dG9tIiwiZGlzdGFuY2VGcm9tQm90dG9tIiwidGhyZXNob2xkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiU0NST0xMX0dSQURJRU5UX1RIUkVTSE9MRF9QWCIsIlNDUk9MTF9ORUFSX0JPVFRPTV9ERUZBVUxUX1RIUkVTSE9MRCIsIlNDUk9MTF9ORUFSX0JPVFRPTV9VUF9USFJFU0hPTEQiLCJTQ1JPTExfQVRfQk9UVE9NX1RPTEVSQU5DRV9QWCIsIlNQQUNFUl9IRUlHSFRfRVBTSUxPTl9QWCIsInNob3VsZFNob3dUb3BTY3JvbGxHcmFkaWVudCIsInNob3VsZFNob3dCb3R0b21TY3JvbGxHcmFkaWVudCIsImlzU2Nyb2xsaW5nVXB3YXJkIiwibGFzdFNjcm9sbFRvcCIsImlzTmVhclNjcm9sbEJvdHRvbSIsInJlc29sdmVTY3JvbGxOZWFyQm90dG9tVGhyZXNob2xkIiwiY3VycmVudFRocmVzaG9sZCIsImlzU2Nyb2xsaW5nVXAiLCJpc05lYXJCb3R0b20iLCJzaG91bGRTa2lwVHVyblNjcm9sbEFuaW1hdGlvbiIsImVhc2VPdXRFeHBvU2Nyb2xsUHJvZ3Jlc3MiLCJwcm9ncmVzcyIsInBvdyIsImNvbXB1dGVUdXJuU2Nyb2xsVGFyZ2V0VG9wIiwicXVlc3Rpb25Ub3AiLCJvZmZzZXQiLCJtYXgiLCJzaG91bGRTa2lwVHVyblNwYWNlUmVzZXJ2YXRpb24iLCJjdXJyZW50U2Nyb2xsVG9wIiwidGFyZ2V0U2Nyb2xsVG9wIiwic2hvdWxkVXBkYXRlU3BhY2VySGVpZ2h0IiwiY3VycmVudEhlaWdodCIsIm5leHRIZWlnaHQiLCJjb21wdXRlU3luY2VkVHVyblNwYWNlckhlaWdodCIsInR1cm5IZWlnaHQiLCJjdXJyZW50U3BhY2VySGVpZ2h0IiwicmVzZXJ2ZWQiLCJzaG91bGREcmFpblR1cm5TcGFjZU9uU2Nyb2xsIiwiYW5jaG9yZWRUdXJuSWQiLCJzaG91bGRSZWxlYXNlVHVyblNwYWNlIiwiQm9vbGVhbiIsInNob3VsZFBlcnNpc3RNYWlhUGFuZWxTY3JvbGwiLCJpbml0aWFsQ2hhdElkIiwiaXNDb250YWluZXJBdFNjcm9sbEJvdHRvbSIsInRvbGVyYW5jZSIsImlzTmV3Q2hhdE1lc3NhZ2VFdmVudCIsImxhc3RJZCIsInByZXZJZCIsIm1lc3NhZ2VzTGVuZ3RoIiwicHJldkxlbmd0aCIsImhhc0luaXRpYWxVc2VyTWVzc2FnZUluTGlzdCIsIm1lc3NhZ2VzIiwic29tZSIsIm1zZyIsImlkIiwiaXNBcHByb3ZhbENoYXRNZXNzYWdlIiwibWVzc2FnZSIsIl9tZXNzYWdlJGlkIiwic3RhcnRzV2l0aCIsImFwcHJvdmFsIiwiaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZCIsIm1lc3NhZ2VJZCIsInNob3VsZEF1dG9TY3JvbGxPbk1lc3NhZ2VzQ2hhbmdlIiwicGFyYW1zIiwiaXNOZXdNZXNzYWdlIiwid2FpdGluZ1Jlc3BvbnNlIiwiaXNXcml0aW5nIiwiaXNBbnN3ZXJPclF1ZXN0aW9uIiwiaXNBdEJvdHRvbSIsImlzQXBwcm92YWwiLCJoYXNJbml0aWFsTWVzc2FnZSIsInByZXZNZXNzYWdlc0xlbmd0aCIsInNob3VsZFJ1blN0cmVhbVR1cm5TeW5jRWZmZWN0IiwiaGFzTWVzc2FnZUxldmVsU3RyZWFtSW5kaWNhdG9yIiwibGFzdE1lc3NhZ2VJZCIsInNob3VsZFNob3dHbG9iYWxTdHJlYW1Mb2FkaW5nSW5kaWNhdG9yIiwiaGFzTWVzc2FnZUxldmVsSW5kaWNhdG9yIiwic3RyZWFtTG9hZGluZ0Rpc3BsYXkiLCJpc0N1cnJlbnRVc2VyTWVzc2FnZSIsInJvbGUiLCJ1c2VySWQiLCJhdXRoVXNlcklkIiwiVVNFUiIsImlzQXNzaXN0YW50Q2hhdE1lc3NhZ2UiLCJBU1NJU1RBTlQiLCJpc0FjdGl2ZVN0cmVhbWluZ1N0YXRlIiwiaXNTdHJlYW1pbmciLCJpc1N0cmVhbWluZ1BsYWNlaG9sZGVyIiwic2hvdWxkU2hvd1N0cmVhbWluZ01lc3NhZ2VCb2R5IiwiaXNBY3RpdmVTdHJlYW1pbmciLCJoYXNTdHJlYW1UZXh0Iiwic3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZSIsInNob3VsZFNob3dTdHJlYW1BY3Rpdml0eUluZGljYXRvciIsImlzQXNzaXN0YW50Iiwic3RyZWFtQWN0aXZpdHkiLCJzaG91bGRSZW5kZXJDaGFuZ2VQcm9qZWN0TWVzc2FnZSIsImlzQ2hhbmdlUHJvamVjdCIsIm9wdGlvbnMiLCJzaG91bGRTaG93TWVzc2FnZUF0dGFjaG1lbnRzUm93IiwiYXR0YWNobWVudENvdW50Iiwic2hvdWxkUmVuZGVyTWVzc2FnZVRleHRCb2R5IiwibWVzc2FnZVRleHQiLCJzaG93U3RyZWFtaW5nQm9keSIsInNob3VsZFNob3dBcHByb3ZhbEFjdGlvbnMiLCJwZW5kaW5nX2FjdGlvbnMiLCJzaG91bGRIaWRlRW1wdHlTdHJlYW1pbmdCb2R5IiwiZGlzcGxheVRleHQiLCJzaG91bGRSZW5kZXJBc3Npc3RhbnRGZWVkYmFjayIsImlzRXJyb3IiLCJpc0Zyb250ZW5kQ2FuY2VsbGVkIiwib25SZXRyeSIsInNob3VsZFJlbmRlckFzc2lzdGFudFN1Z2dlc3Rpb25zIiwic3VnZ2VzdGlvbnNMZW5ndGgiLCJzaG91bGRIaWRlQXNzaXN0YW50U3VnZ2VzdGlvbnMiLCJpc0xhc3RNZXNzYWdlIiwic3VnZ2VzdGlvbnNEaXNhYmxlZCIsInNob3VsZFJlbmRlckNyZWF0ZUFnZW50QWN0aW9ucyIsImFnZW50SWQiLCJyZXNvbHZlQ2hhdExpc3RJdGVtU3RyZWFtaW5nRmxhZ3MiLCJjb3VudFVzZXJNZXNzYWdlQXR0YWNobWVudHMiLCJBcnJheSIsImlzQXJyYXkiLCJhdHRhY2htZW50cyIsInNvdXJjZUNvdW50Iiwic291cmNlcyIsInNob3VsZElnbm9yZVN1Z2dlc3Rpb25DbGljayIsInN1Z2dlc3Rpb24iLCJhbHJlYWR5U2VsZWN0ZWQiLCJ0cmltIiwiaXNSZXRyeVN1Z2dlc3Rpb25TZWxlY3Rpb24iLCJyZXRyeUxhYmVsIiwicmVzb2x2ZVJldHJ5QXR0YWNobWVudHNGcm9tVXNlck1lc3NhZ2UiLCJ1c2VyTWVzc2FnZSIsInNob3VsZE9wZW5NZXNzYWdlT3B0aW9uIiwic2VsZWN0ZWRPcHRpb24iLCJyZXNvbHZlQXR0YWNobWVudERvd25sb2FkQmxvYlN0cmF0ZWd5IiwiZmlsZVVybCIsImZpbGUiLCJGaWxlIiwiZXh0cmFjdEZlZWRiYWNrU2Vzc2lvbklkIiwic3BsaXQiLCJmaWx0ZXIiLCJxdWVzdGlvbklkIiwiam9pbiIsIkFVRElPX0VYVEVOU0lPTlMiLCJBVURJT19UWVBFUyIsImlzQXVkaW9BdHRhY2htZW50IiwiYXR0YWNobWVudCIsIl9hdHRhY2htZW50JHR5cGUiLCJfYXR0YWNobWVudCRuYW1lIiwiYXR0YWNobWVudFR5cGUiLCJ0eXBlIiwidG9Mb3dlckNhc2UiLCJhdHRhY2htZW50TmFtZSIsIm5hbWUiLCJpbmNsdWRlcyIsImV4dCIsImVuZHNXaXRoIiwiY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3Iiwib3JpZ2luYWxGaWxlIiwidXJsX3RodW1ibmFpbCIsInVybF9vcmlnaW5hbCIsInVybF9maWxlIiwiZmluZExhc3RRdWVzdGlvbklkIiwiaW5kZXgiLCJfbWVzc2FnZXMkaW5kZXgiLCJjb21wdXRlUmVzZXJ2ZWRUdXJuU3BhY2UiLCJyZXNvbHZlTWVzc2FnZUF0dGFjaG1lbnRzIiwicmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEZpbGVOYW1lIiwiZXh0ZW5zaW9uIiwiY29uY2F0IiwicmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCIsInNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSIsInByb2plY3ROYW1lIiwiaGFzQXBwcm92YWwiLCJyZXNvbHZlRGlzYWJsZUZlZWRiYWNrRnJvbVdhc0hlbHBmdWwiLCJ3YXNIZWxwZnVsIiwiVEhVTUJTX1VQIiwiVEhVTUJTX0RPV04iLCJjYW5SZXRyeUFzc2lzdGFudE1lc3NhZ2UiLCJoYXNVc2VyTWVzc2FnZUZvclJldHJ5IiwiaXNDYW5jZWxsZWQiLCJ0dXJuSWQiLCJjb21wdXRlUmVtb3ZhYmxlVHVyblNwYWNlIiwicmVtb3ZhYmxlIiwicmVhZFNtb290aFN0cmVhbVdpbmRvd0ZsYWdzIiwid2luZG93IiwiYnVpbGRTbW9vdGhTdHJlYW1UZXh0T3B0aW9ucyIsImZsYWdzIiwiX29iamVjdFNwcmVhZCIsImVuYWJsZWQiLCJtYXhDaGFyc1BlckZyYW1lIiwic25hcFRvV29yZEJvdW5kYXJ5Iiwic3RyZWFtTGFnTXMiLCJ0YXJnZXRMYWdNcyIsInN0cmVhbUFkYXB0IiwiYWRhcHRUb0JhY2tlbmRSYXRlIiwic3RyZWFtQnVmZmVyTXMiLCJ0YXJnZXRCdWZmZXJNcyIsInN0cmVhbU1pbkJ1ZmZlciIsIm1pbkJ1ZmZlckNoYXJzIiwic3RyZWFtV2FybXVwTXMiLCJ3YXJtdXBNcyIsInJlc29sdmVTdHJlYW1pbmdSYXdUZXh0Iiwic3RyZWFtaW5nVGV4dCIsInNob3VsZFJlbmRlck1lbnRpb25JbmxpbmVOb2RlcyIsImhhc01lbnRpb25zIiwibWVudGlvbk5vZGVzIiwicmVzb2x2ZUZlZWRiYWNrUHJvcHNGb3JDYW5jZWxsZWQiLCJoYW5kbGVGZWVkYmFja0NsaWNrIiwiaGFuZGxlRmVlZGJhY2siLCJyZXNvbHZlU3RyZWFtaW5nTWVzc2FnZUhvb2tJZCIsInNob3VsZEluaXRpYWxpemVDaGF0IiwiYWxyZWFkeUluaXRpYWxpemVkIiwic2hvdWxkQ2xlYXJMYXN0UmVzZXJ2ZWRRdWVzdGlvbiIsImxvYWRpbmdNZXNzYWdlcyIsInNob3VsZFNjaGVkdWxlVHVyblNwYWNlUmVzZXJ2YXRpb24iLCJpc0xvYWRpbmdNb3JlTWVzc2FnZXMiLCJsYXN0UmVzZXJ2ZWRRdWVzdGlvbklkIiwic2hvdWxkU2tpcE1lc3NhZ2VzU2Nyb2xsRWZmZWN0IiwiaGFzQ29udGFpbmVyIiwiaXNMb2FkaW5nTW9yZVJlZiIsInJlc29sdmVDb250YWluZXJBdEJvdHRvbSIsImNvbnRhaW5lciIsInNob3VsZFJ1blNlc3Npb25DYWNoZVNjcm9sbFRvQm90dG9tIiwibGFzdFNjcm9sbGVkU2Vzc2lvbklkIiwiZGV0ZWN0SnVzdEZpbmlzaGVkTG9hZGluZ01lc3NhZ2VzIiwid2FzTG9hZGluZyIsInNob3VsZFNjcm9sbFRvQm90dG9tQWZ0ZXJMb2FkIiwianVzdEZpbmlzaGVkTG9hZGluZyIsInNob3VsZFVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzT25Mb2FkRW5kIiwic2hvdWxkQ2xlYXJTY3JvbGxSZXN0b3JlV2l0aG91dENoYXQiLCJyZXNvbHZlUGVuZGluZ1Njcm9sbFRvcEZyb21TZXNzaW9uIiwic2Vzc2lvbiIsInNjcm9sbFNlc3Npb25JZCIsInNob3VsZEFwcGx5UGVuZGluZ1Njcm9sbFJlc3RvcmUiLCJwZW5kaW5nU2Nyb2xsVG9wIiwic2hvdWxkUmVzdG9yZVNjcm9sbE9uRXhwYW5kZWRDaGFuZ2UiLCJwcmV2aW91c0V4cGFuZGVkIiwiZXhwYW5kZWQiLCJyZXNvbHZlTWVzc2FnZUxpc3RJdGVtS2V5IiwicmVzb2x2ZUNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQiLCJmb2xsb3dVcCIsInJlc29sdmVTdHJlYW1pbmdUZXh0SG9va0lkIiwicmVzb2x2ZVJlYXNvbmluZ1RyYWNlSG9va0lkIiwicmVzb2x2ZVNjcm9sbE9uUGFyZW50TW9kZSIsInJlc29sdmVMYXN0VXNlck1lc3NhZ2VGb3JBdHRhY2htZW50cyIsInVzZXIiLCJ0b1N0cmluZyIsImF0IiwicmVzb2x2ZVN1Z2dlc3Rpb25BbmFseXRpY3NBZ2VudFR5cGUiLCJpc01hcmtldHBsYWNlR2xvYmFsQWdlbnQiLCJhZ2VudFR5cGUiLCJwcm9jZXNzQ2hhdE1lc3NhZ2VzU2Nyb2xsRnJhbWUiLCJpbnB1dCIsInNjcm9sbFRocmVzaG9sZCIsIm5leHRTY3JvbGxUaHJlc2hvbGQiLCJzaG91bGREcmFpblR1cm5TcGFjZSIsInNob3VsZFNjaGVkdWxlU2Nyb2xsUGVyc2lzdCIsInNob3VsZE5vdGlmeVNjcm9sbFRvQm90dG9tIiwiY29tcHV0ZU1lYXN1cmVUdXJuTGF5b3V0IiwicXVlc3Rpb25TY3JvbGxUb3AiLCJjb250YWluZXJUb3AiLCJjb250ZW50Qm90dG9tU2Nyb2xsIiwiY29udGVudEJvdHRvbSIsInJlc29sdmVSZXNlcnZlVHVyblNwYWNlUGxhbiIsImtpbmQiLCJyZXNvbHZlU2Nyb2xsVG9Cb3R0b21UYXJnZXRUb3AiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEFJTWVzc2FnZXMvQ2hhdEFJTWVzc2FnZXMuaGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vQ2hhdEZvb3Rlci9DaGF0Rm9vdGVyJ1xuaW1wb3J0IHsgRmVlZGJhY2sgfSBmcm9tICcuLi9NZXNzYWdlRmVlZGJhY2svTWVzc2FnZUZlZWRiYWNrJ1xuaW1wb3J0IHsgQ2hhdEhpc3RvcnlSb2xlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuXG5leHBvcnQgY29uc3QgdHVybkFuY2hvck9mZnNldCA9ICh2aWV3cG9ydEhlaWdodDogbnVtYmVyKTogbnVtYmVyID0+IE1hdGgubWluKHZpZXdwb3J0SGVpZ2h0ICogMC4xOCwgMjAwKVxuXG5leHBvcnQgY29uc3QgVFVSTl9TQ1JPTExfRFVSQVRJT05fTVMgPSA2MDBcbmV4cG9ydCBjb25zdCBUVVJOX1NDUk9MTF9NQVhfRFVSQVRJT05fTVMgPSA4MDBcbmV4cG9ydCBjb25zdCBUVVJOX1NDUk9MTF9MT05HX0RJU1RBTkNFX1BYID0gMTIwMFxuXG5leHBvcnQgY29uc3QgY29tcHV0ZVR1cm5TY3JvbGxEdXJhdGlvbk1zID0gKGRpc3RhbmNlOiBudW1iZXIpOiBudW1iZXIgPT5cbiAgVFVSTl9TQ1JPTExfRFVSQVRJT05fTVMgK1xuICAoVFVSTl9TQ1JPTExfTUFYX0RVUkFUSU9OX01TIC0gVFVSTl9TQ1JPTExfRFVSQVRJT05fTVMpICpcbiAgICBNYXRoLm1pbigxLCBNYXRoLmFicyhkaXN0YW5jZSkgLyBUVVJOX1NDUk9MTF9MT05HX0RJU1RBTkNFX1BYKVxuXG5leHBvcnQgY29uc3QgY29tcHV0ZURpc3RhbmNlRnJvbUJvdHRvbSA9IChcbiAgc2Nyb2xsSGVpZ2h0OiBudW1iZXIsXG4gIHNwYWNlckhlaWdodDogbnVtYmVyLFxuICBzY3JvbGxUb3A6IG51bWJlcixcbiAgY2xpZW50SGVpZ2h0OiBudW1iZXJcbik6IG51bWJlciA9PiBzY3JvbGxIZWlnaHQgLSBzcGFjZXJIZWlnaHQgLSBzY3JvbGxUb3AgLSBjbGllbnRIZWlnaHRcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNob3dTY3JvbGxUb0JvdHRvbSA9IChkaXN0YW5jZUZyb21Cb3R0b206IG51bWJlciwgdGhyZXNob2xkID0gNTApOiBib29sZWFuID0+XG4gIGRpc3RhbmNlRnJvbUJvdHRvbSA+IHRocmVzaG9sZFxuXG5leHBvcnQgY29uc3QgU0NST0xMX0dSQURJRU5UX1RIUkVTSE9MRF9QWCA9IDFcbmV4cG9ydCBjb25zdCBTQ1JPTExfTkVBUl9CT1RUT01fREVGQVVMVF9USFJFU0hPTEQgPSAzOVxuZXhwb3J0IGNvbnN0IFNDUk9MTF9ORUFSX0JPVFRPTV9VUF9USFJFU0hPTEQgPSAxNVxuZXhwb3J0IGNvbnN0IFNDUk9MTF9BVF9CT1RUT01fVE9MRVJBTkNFX1BYID0gMTAwXG5leHBvcnQgY29uc3QgU1BBQ0VSX0hFSUdIVF9FUFNJTE9OX1BYID0gMVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkU2hvd1RvcFNjcm9sbEdyYWRpZW50ID0gKHNjcm9sbFRvcDogbnVtYmVyLCB0aHJlc2hvbGQgPSBTQ1JPTExfR1JBRElFTlRfVEhSRVNIT0xEX1BYKTogYm9vbGVhbiA9PlxuICBzY3JvbGxUb3AgPiB0aHJlc2hvbGRcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNob3dCb3R0b21TY3JvbGxHcmFkaWVudCA9IChcbiAgZGlzdGFuY2VGcm9tQm90dG9tOiBudW1iZXIsXG4gIHRocmVzaG9sZCA9IFNDUk9MTF9HUkFESUVOVF9USFJFU0hPTERfUFhcbik6IGJvb2xlYW4gPT4gZGlzdGFuY2VGcm9tQm90dG9tID4gdGhyZXNob2xkXG5cbmV4cG9ydCBjb25zdCBpc1Njcm9sbGluZ1Vwd2FyZCA9IChzY3JvbGxUb3A6IG51bWJlciwgbGFzdFNjcm9sbFRvcDogbnVtYmVyKTogYm9vbGVhbiA9PiBzY3JvbGxUb3AgPCBsYXN0U2Nyb2xsVG9wXG5cbmV4cG9ydCBjb25zdCBpc05lYXJTY3JvbGxCb3R0b20gPSAoXG4gIHNjcm9sbEhlaWdodDogbnVtYmVyLFxuICBzY3JvbGxUb3A6IG51bWJlcixcbiAgY2xpZW50SGVpZ2h0OiBudW1iZXIsXG4gIHRocmVzaG9sZDogbnVtYmVyXG4pOiBib29sZWFuID0+IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodCA8IHRocmVzaG9sZFxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVNjcm9sbE5lYXJCb3R0b21UaHJlc2hvbGQgPSAoXG4gIGN1cnJlbnRUaHJlc2hvbGQ6IG51bWJlcixcbiAgaXNTY3JvbGxpbmdVcDogYm9vbGVhbixcbiAgaXNOZWFyQm90dG9tOiBib29sZWFuXG4pOiBudW1iZXIgPT4ge1xuICBpZiAoaXNOZWFyQm90dG9tKSByZXR1cm4gU0NST0xMX05FQVJfQk9UVE9NX0RFRkFVTFRfVEhSRVNIT0xEXG4gIGlmIChpc1Njcm9sbGluZ1VwKSByZXR1cm4gU0NST0xMX05FQVJfQk9UVE9NX1VQX1RIUkVTSE9MRFxuICByZXR1cm4gY3VycmVudFRocmVzaG9sZFxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkU2tpcFR1cm5TY3JvbGxBbmltYXRpb24gPSAoZGlzdGFuY2U6IG51bWJlcik6IGJvb2xlYW4gPT4gTWF0aC5hYnMoZGlzdGFuY2UpIDwgMVxuXG5leHBvcnQgY29uc3QgZWFzZU91dEV4cG9TY3JvbGxQcm9ncmVzcyA9IChwcm9ncmVzczogbnVtYmVyKTogbnVtYmVyID0+IChwcm9ncmVzcyA9PT0gMSA/IDEgOiAxIC0gMiAqKiAoLTEyICogcHJvZ3Jlc3MpKVxuXG5leHBvcnQgY29uc3QgY29tcHV0ZVR1cm5TY3JvbGxUYXJnZXRUb3AgPSAocXVlc3Rpb25Ub3A6IG51bWJlciwgdmlld3BvcnRIZWlnaHQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIGNvbnN0IG9mZnNldCA9IHR1cm5BbmNob3JPZmZzZXQodmlld3BvcnRIZWlnaHQpXG4gIHJldHVybiBNYXRoLm1heCgwLCBxdWVzdGlvblRvcCAtIG9mZnNldClcbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFNraXBUdXJuU3BhY2VSZXNlcnZhdGlvbiA9IChjdXJyZW50U2Nyb2xsVG9wOiBudW1iZXIsIHRhcmdldFNjcm9sbFRvcDogbnVtYmVyKTogYm9vbGVhbiA9PlxuICB0YXJnZXRTY3JvbGxUb3AgPD0gY3VycmVudFNjcm9sbFRvcFxuXG5leHBvcnQgY29uc3Qgc2hvdWxkVXBkYXRlU3BhY2VySGVpZ2h0ID0gKGN1cnJlbnRIZWlnaHQ6IG51bWJlciwgbmV4dEhlaWdodDogbnVtYmVyKTogYm9vbGVhbiA9PlxuICBNYXRoLmFicyhjdXJyZW50SGVpZ2h0IC0gbmV4dEhlaWdodCkgPj0gU1BBQ0VSX0hFSUdIVF9FUFNJTE9OX1BYXG5cbmV4cG9ydCBjb25zdCBjb21wdXRlU3luY2VkVHVyblNwYWNlckhlaWdodCA9IChcbiAgY2xpZW50SGVpZ2h0OiBudW1iZXIsXG4gIHR1cm5IZWlnaHQ6IG51bWJlcixcbiAgY3VycmVudFNwYWNlckhlaWdodDogbnVtYmVyXG4pOiBudW1iZXIgPT4ge1xuICBjb25zdCBvZmZzZXQgPSB0dXJuQW5jaG9yT2Zmc2V0KGNsaWVudEhlaWdodClcbiAgY29uc3QgcmVzZXJ2ZWQgPSBNYXRoLm1heCgwLCBjbGllbnRIZWlnaHQgLSB0dXJuSGVpZ2h0IC0gb2Zmc2V0KVxuICByZXR1cm4gTWF0aC5taW4oY3VycmVudFNwYWNlckhlaWdodCwgcmVzZXJ2ZWQpXG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGREcmFpblR1cm5TcGFjZU9uU2Nyb2xsID0gKGFuY2hvcmVkVHVybklkOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiA9PiAhYW5jaG9yZWRUdXJuSWRcblxuZXhwb3J0IGNvbnN0IHNob3VsZFJlbGVhc2VUdXJuU3BhY2UgPSAoYW5jaG9yZWRUdXJuSWQ6IHN0cmluZyB8IG51bGwsIHNwYWNlckhlaWdodDogbnVtYmVyKTogYm9vbGVhbiA9PlxuICBCb29sZWFuKGFuY2hvcmVkVHVybklkKSB8fCBzcGFjZXJIZWlnaHQgPiAwXG5cbmV4cG9ydCBjb25zdCBzaG91bGRQZXJzaXN0TWFpYVBhbmVsU2Nyb2xsID0gKGluaXRpYWxDaGF0SWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIHNjcm9sbFRvcDogbnVtYmVyKTogYm9vbGVhbiA9PlxuICBCb29sZWFuKGluaXRpYWxDaGF0SWQpICYmIHNjcm9sbFRvcCA+IDBcblxuZXhwb3J0IGNvbnN0IGlzQ29udGFpbmVyQXRTY3JvbGxCb3R0b20gPSAoXG4gIHNjcm9sbEhlaWdodDogbnVtYmVyLFxuICBzY3JvbGxUb3A6IG51bWJlcixcbiAgY2xpZW50SGVpZ2h0OiBudW1iZXIsXG4gIHRvbGVyYW5jZSA9IFNDUk9MTF9BVF9CT1RUT01fVE9MRVJBTkNFX1BYXG4pOiBib29sZWFuID0+IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCA8PSBjbGllbnRIZWlnaHQgKyB0b2xlcmFuY2VcblxuZXhwb3J0IGNvbnN0IGlzTmV3Q2hhdE1lc3NhZ2VFdmVudCA9IChcbiAgbGFzdElkOiBzdHJpbmcgfCBudWxsLFxuICBwcmV2SWQ6IHN0cmluZyB8IG51bGwsXG4gIG1lc3NhZ2VzTGVuZ3RoOiBudW1iZXIsXG4gIHByZXZMZW5ndGg6IG51bWJlclxuKTogYm9vbGVhbiA9PiBsYXN0SWQgIT09IHByZXZJZCB8fCBtZXNzYWdlc0xlbmd0aCAhPT0gcHJldkxlbmd0aFxuXG5leHBvcnQgY29uc3QgaGFzSW5pdGlhbFVzZXJNZXNzYWdlSW5MaXN0ID0gKG1lc3NhZ2VzOiBBcnJheTx7IGlkPzogc3RyaW5nIH0+KTogYm9vbGVhbiA9PlxuICBtZXNzYWdlcy5zb21lKG1zZyA9PiBtc2cuaWQgPT09ICd1c2VyLWluaXRpYWwtbWVzc2FnZScpXG5cbmV4cG9ydCBjb25zdCBpc0FwcHJvdmFsQ2hhdE1lc3NhZ2UgPSAobWVzc2FnZTogeyBpZD86IHN0cmluZzsgYXBwcm92YWw/OiB1bmtub3duIH0gfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PlxuICBCb29sZWFuKG1lc3NhZ2UgJiYgKG1lc3NhZ2UuaWQ/LnN0YXJ0c1dpdGgoJ2FwcHJvdmFsLScpIHx8IG1lc3NhZ2UuYXBwcm92YWwpKVxuXG5leHBvcnQgY29uc3QgaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZCA9IChtZXNzYWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT5cbiAgQm9vbGVhbihtZXNzYWdlSWQ/LnN0YXJ0c1dpdGgoJ2Fuc3dlci0nKSB8fCBtZXNzYWdlSWQ/LnN0YXJ0c1dpdGgoJ3F1ZXN0aW9uLScpKVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2UgPSAocGFyYW1zOiB7XG4gIGlzTmV3TWVzc2FnZTogYm9vbGVhblxuICBhbmNob3JlZFR1cm5JZDogc3RyaW5nIHwgbnVsbFxuICB3YWl0aW5nUmVzcG9uc2U6IGJvb2xlYW5cbiAgaXNXcml0aW5nOiBib29sZWFuXG4gIGlzQXRCb3R0b206IGJvb2xlYW5cbiAgaXNBbnN3ZXJPclF1ZXN0aW9uOiBib29sZWFuXG4gIGlzQXBwcm92YWw6IGJvb2xlYW5cbiAgaGFzSW5pdGlhbE1lc3NhZ2U6IGJvb2xlYW5cbiAgbWVzc2FnZXNMZW5ndGg6IG51bWJlclxuICBwcmV2TWVzc2FnZXNMZW5ndGg6IG51bWJlclxufSk6ICdzY3JvbGwnIHwgJ3N5bmMtdHVybicgfCAnYWZmb3JkYW5jZXMtb25seScgPT4ge1xuICBpZiAoIXBhcmFtcy5pc05ld01lc3NhZ2UpIHJldHVybiAnYWZmb3JkYW5jZXMtb25seSdcbiAgaWYgKHBhcmFtcy5hbmNob3JlZFR1cm5JZCkgcmV0dXJuICdzeW5jLXR1cm4nXG4gIGlmIChwYXJhbXMud2FpdGluZ1Jlc3BvbnNlIHx8IHBhcmFtcy5pc1dyaXRpbmcpIHJldHVybiAnYWZmb3JkYW5jZXMtb25seSdcbiAgaWYgKHBhcmFtcy5pc0Fuc3dlck9yUXVlc3Rpb24gJiYgcGFyYW1zLmlzQXRCb3R0b20pIHJldHVybiAnc2Nyb2xsJ1xuICBpZiAoXG4gICAgIXBhcmFtcy5pc0Fuc3dlck9yUXVlc3Rpb24gJiZcbiAgICAhcGFyYW1zLmlzQXBwcm92YWwgJiZcbiAgICAhcGFyYW1zLmhhc0luaXRpYWxNZXNzYWdlICYmXG4gICAgcGFyYW1zLm1lc3NhZ2VzTGVuZ3RoID4gcGFyYW1zLnByZXZNZXNzYWdlc0xlbmd0aFxuICApIHtcbiAgICByZXR1cm4gJ3Njcm9sbCdcbiAgfVxuICByZXR1cm4gJ2FmZm9yZGFuY2VzLW9ubHknXG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSdW5TdHJlYW1UdXJuU3luY0VmZmVjdCA9ICh3YWl0aW5nUmVzcG9uc2U6IGJvb2xlYW4sIGlzV3JpdGluZzogYm9vbGVhbik6IGJvb2xlYW4gPT5cbiAgd2FpdGluZ1Jlc3BvbnNlIHx8IGlzV3JpdGluZ1xuXG5leHBvcnQgY29uc3QgaGFzTWVzc2FnZUxldmVsU3RyZWFtSW5kaWNhdG9yID0gKFxuICBsYXN0TWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHdhaXRpbmdSZXNwb25zZTogYm9vbGVhbixcbiAgaXNXcml0aW5nOiBib29sZWFuXG4pOiBib29sZWFuID0+IEJvb2xlYW4obGFzdE1lc3NhZ2VJZCAmJiBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKGxhc3RNZXNzYWdlSWQpICYmICh3YWl0aW5nUmVzcG9uc2UgfHwgaXNXcml0aW5nKSlcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNob3dHbG9iYWxTdHJlYW1Mb2FkaW5nSW5kaWNhdG9yID0gKFxuICBoYXNNZXNzYWdlTGV2ZWxJbmRpY2F0b3I6IGJvb2xlYW4sXG4gIHN0cmVhbUxvYWRpbmdEaXNwbGF5OiB1bmtub3duXG4pOiBib29sZWFuID0+ICFoYXNNZXNzYWdlTGV2ZWxJbmRpY2F0b3IgJiYgQm9vbGVhbihzdHJlYW1Mb2FkaW5nRGlzcGxheSlcblxuZXhwb3J0IGNvbnN0IGlzQ3VycmVudFVzZXJNZXNzYWdlID0gKHJvbGU6IENoYXRIaXN0b3J5Um9sZSB8IHVuZGVmaW5lZCwgdXNlcklkOiBzdHJpbmcsIGF1dGhVc2VySWQ6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgcm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgfHwgdXNlcklkID09PSBhdXRoVXNlcklkXG5cbmV4cG9ydCBjb25zdCBpc0Fzc2lzdGFudENoYXRNZXNzYWdlID0gKHJvbGU6IENoYXRIaXN0b3J5Um9sZSB8IHVuZGVmaW5lZCwgdXNlcklkOiBzdHJpbmcpOiBib29sZWFuID0+XG4gIHJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQgfHwgdXNlcklkID09PSAnYXNzaXN0YW50J1xuXG5leHBvcnQgY29uc3QgaXNBY3RpdmVTdHJlYW1pbmdTdGF0ZSA9IChpc1N0cmVhbWluZzogYm9vbGVhbiB8IHVuZGVmaW5lZCwgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogYm9vbGVhbik6IGJvb2xlYW4gPT5cbiAgQm9vbGVhbihpc1N0cmVhbWluZykgfHwgaXNTdHJlYW1pbmdQbGFjZWhvbGRlclxuXG5leHBvcnQgY29uc3Qgc2hvdWxkU2hvd1N0cmVhbWluZ01lc3NhZ2VCb2R5ID0gKFxuICBpc0FjdGl2ZVN0cmVhbWluZzogYm9vbGVhbixcbiAgaGFzU3RyZWFtVGV4dDogYm9vbGVhbixcbiAgc3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZTogYm9vbGVhblxuKTogYm9vbGVhbiA9PiBpc0FjdGl2ZVN0cmVhbWluZyAmJiBoYXNTdHJlYW1UZXh0ICYmICFzdHJlYW1OYXJyYXRpb25JblRpbWVsaW5lXG5cbmV4cG9ydCBjb25zdCBzaG91bGRTaG93U3RyZWFtQWN0aXZpdHlJbmRpY2F0b3IgPSAoXG4gIGlzQXNzaXN0YW50OiBib29sZWFuLFxuICBpc0FjdGl2ZVN0cmVhbWluZzogYm9vbGVhbixcbiAgc3RyZWFtQWN0aXZpdHk6IHVua25vd25cbik6IGJvb2xlYW4gPT4gaXNBc3Npc3RhbnQgJiYgaXNBY3RpdmVTdHJlYW1pbmcgJiYgQm9vbGVhbihzdHJlYW1BY3Rpdml0eSlcblxuZXhwb3J0IGNvbnN0IHNob3VsZFJlbmRlckNoYW5nZVByb2plY3RNZXNzYWdlID0gKFxuICBpc0NoYW5nZVByb2plY3Q6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IHVua25vd25bXSB8IG51bGwgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4gPT4gQm9vbGVhbihpc0NoYW5nZVByb2plY3QgJiYgb3B0aW9ucylcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNob3dNZXNzYWdlQXR0YWNobWVudHNSb3cgPSAoYXR0YWNobWVudENvdW50OiBudW1iZXIpOiBib29sZWFuID0+IGF0dGFjaG1lbnRDb3VudCA+IDBcblxuZXhwb3J0IGNvbnN0IHNob3VsZFJlbmRlck1lc3NhZ2VUZXh0Qm9keSA9IChwYXJhbXM6IHtcbiAgbWVzc2FnZVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGxcbiAgc2hvd1N0cmVhbWluZ0JvZHk6IGJvb2xlYW5cbiAgaXNBc3Npc3RhbnQ6IGJvb2xlYW5cbiAgYXR0YWNobWVudENvdW50OiBudW1iZXJcbn0pOiBib29sZWFuID0+XG4gIEJvb2xlYW4ocGFyYW1zLm1lc3NhZ2VUZXh0IHx8IHBhcmFtcy5zaG93U3RyZWFtaW5nQm9keSkgJiYgIShwYXJhbXMuaXNBc3Npc3RhbnQgJiYgcGFyYW1zLmF0dGFjaG1lbnRDb3VudCA+IDApXG5cbmV4cG9ydCBjb25zdCBzaG91bGRTaG93QXBwcm92YWxBY3Rpb25zID0gKGFwcHJvdmFsOiB7IHBlbmRpbmdfYWN0aW9ucz86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gIEJvb2xlYW4oYXBwcm92YWw/LnBlbmRpbmdfYWN0aW9ucylcblxuZXhwb3J0IGNvbnN0IHNob3VsZEhpZGVFbXB0eVN0cmVhbWluZ0JvZHkgPSAoZGlzcGxheVRleHQ6IHN0cmluZywgaXNTdHJlYW1pbmc6IGJvb2xlYW4pOiBib29sZWFuID0+XG4gICFkaXNwbGF5VGV4dCAmJiAhaXNTdHJlYW1pbmdcblxuZXhwb3J0IGNvbnN0IHNob3VsZFJlbmRlckFzc2lzdGFudEZlZWRiYWNrID0gKHBhcmFtczoge1xuICBpc0Fzc2lzdGFudDogYm9vbGVhblxuICBpc0Vycm9yPzogYm9vbGVhblxuICBhcHByb3ZhbD86IHVua25vd25cbiAgaXNTdHJlYW1pbmc6IGJvb2xlYW5cbiAgaXNGcm9udGVuZENhbmNlbGxlZD86IGJvb2xlYW5cbiAgb25SZXRyeT86ICgpID0+IHZvaWRcbn0pOiBib29sZWFuID0+XG4gIHBhcmFtcy5pc0Fzc2lzdGFudCAmJlxuICAhcGFyYW1zLmlzRXJyb3IgJiZcbiAgIXBhcmFtcy5hcHByb3ZhbCAmJlxuICAhcGFyYW1zLmlzU3RyZWFtaW5nICYmXG4gICghcGFyYW1zLmlzRnJvbnRlbmRDYW5jZWxsZWQgfHwgQm9vbGVhbihwYXJhbXMub25SZXRyeSkpXG5cbmV4cG9ydCBjb25zdCBzaG91bGRSZW5kZXJBc3Npc3RhbnRTdWdnZXN0aW9ucyA9IChwYXJhbXM6IHtcbiAgaXNBc3Npc3RhbnQ6IGJvb2xlYW5cbiAgaXNGcm9udGVuZENhbmNlbGxlZD86IGJvb2xlYW5cbiAgYXBwcm92YWw/OiB1bmtub3duXG4gIGlzRXJyb3I/OiBib29sZWFuXG4gIHN1Z2dlc3Rpb25zTGVuZ3RoOiBudW1iZXJcbn0pOiBib29sZWFuID0+XG4gIHBhcmFtcy5pc0Fzc2lzdGFudCAmJlxuICAhcGFyYW1zLmlzRnJvbnRlbmRDYW5jZWxsZWQgJiZcbiAgIXBhcmFtcy5hcHByb3ZhbCAmJlxuICAoIXBhcmFtcy5pc0Vycm9yIHx8IHBhcmFtcy5zdWdnZXN0aW9uc0xlbmd0aCA+IDApXG5cbmV4cG9ydCBjb25zdCBzaG91bGRIaWRlQXNzaXN0YW50U3VnZ2VzdGlvbnMgPSAoXG4gIGlzU3RyZWFtaW5nOiBib29sZWFuLFxuICBpc0xhc3RNZXNzYWdlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBzdWdnZXN0aW9uc0Rpc2FibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuID0+IEJvb2xlYW4oaXNTdHJlYW1pbmcgfHwgIWlzTGFzdE1lc3NhZ2UgfHwgc3VnZ2VzdGlvbnNEaXNhYmxlZClcblxuZXhwb3J0IGNvbnN0IHNob3VsZFJlbmRlckNyZWF0ZUFnZW50QWN0aW9ucyA9IChwYXJhbXM6IHtcbiAgaXNBc3Npc3RhbnQ6IGJvb2xlYW5cbiAgaXNFcnJvcj86IGJvb2xlYW5cbiAgaXNGcm9udGVuZENhbmNlbGxlZD86IGJvb2xlYW5cbiAgYXBwcm92YWw/OiB1bmtub3duXG4gIGFnZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxufSk6IGJvb2xlYW4gPT5cbiAgcGFyYW1zLmlzQXNzaXN0YW50ICYmICFwYXJhbXMuaXNFcnJvciAmJiAhcGFyYW1zLmlzRnJvbnRlbmRDYW5jZWxsZWQgJiYgIXBhcmFtcy5hcHByb3ZhbCAmJiBCb29sZWFuKHBhcmFtcy5hZ2VudElkKVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNoYXRMaXN0SXRlbVN0cmVhbWluZ0ZsYWdzID0gKHBhcmFtczoge1xuICByb2xlOiBDaGF0SGlzdG9yeVJvbGUgfCB1bmRlZmluZWRcbiAgdXNlcklkOiBzdHJpbmdcbiAgbWVzc2FnZUlkOiBzdHJpbmdcbiAgaXNMYXN0TWVzc2FnZTogYm9vbGVhblxuICB3YWl0aW5nUmVzcG9uc2U6IGJvb2xlYW5cbiAgaXNXcml0aW5nOiBib29sZWFuXG59KTogeyBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBib29sZWFuOyBpc1N0cmVhbWluZzogYm9vbGVhbiB9ID0+IHtcbiAgY29uc3QgaXNBc3Npc3RhbnQgPSBpc0Fzc2lzdGFudENoYXRNZXNzYWdlKHBhcmFtcy5yb2xlLCBwYXJhbXMudXNlcklkKVxuICBjb25zdCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyID1cbiAgICBpc0Fzc2lzdGFudCAmJiBwYXJhbXMuaXNMYXN0TWVzc2FnZSAmJiBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKHBhcmFtcy5tZXNzYWdlSWQpXG4gIHJldHVybiB7XG4gICAgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcixcbiAgICBpc1N0cmVhbWluZzogaXNTdHJlYW1pbmdQbGFjZWhvbGRlciAmJiAocGFyYW1zLndhaXRpbmdSZXNwb25zZSB8fCBwYXJhbXMuaXNXcml0aW5nKSxcbiAgfVxufVxuXG50eXBlIFVzZXJNZXNzYWdlQXR0YWNobWVudHNTb3VyY2UgPSB7XG4gIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXVxuICBzb3VyY2VzPzogdW5rbm93blxufVxuXG5leHBvcnQgY29uc3QgY291bnRVc2VyTWVzc2FnZUF0dGFjaG1lbnRzID0gKG1lc3NhZ2U6IFVzZXJNZXNzYWdlQXR0YWNobWVudHNTb3VyY2UgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyID0+IHtcbiAgaWYgKCFtZXNzYWdlKSByZXR1cm4gMFxuICBjb25zdCBhdHRhY2htZW50Q291bnQgPSBBcnJheS5pc0FycmF5KG1lc3NhZ2UuYXR0YWNobWVudHMpID8gbWVzc2FnZS5hdHRhY2htZW50cy5sZW5ndGggOiAwXG4gIGNvbnN0IHNvdXJjZUNvdW50ID0gQXJyYXkuaXNBcnJheShtZXNzYWdlLnNvdXJjZXMpID8gbWVzc2FnZS5zb3VyY2VzLmxlbmd0aCA6IDBcbiAgcmV0dXJuIGF0dGFjaG1lbnRDb3VudCB8fCBzb3VyY2VDb3VudFxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkSWdub3JlU3VnZ2VzdGlvbkNsaWNrID0gKHN1Z2dlc3Rpb246IHN0cmluZywgYWxyZWFkeVNlbGVjdGVkOiBib29sZWFuKTogYm9vbGVhbiA9PlxuICAhc3VnZ2VzdGlvbj8udHJpbSgpIHx8IGFscmVhZHlTZWxlY3RlZFxuXG5leHBvcnQgY29uc3QgaXNSZXRyeVN1Z2dlc3Rpb25TZWxlY3Rpb24gPSAoXG4gIGlzRXJyb3I6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHN1Z2dlc3Rpb246IHN0cmluZyxcbiAgcmV0cnlMYWJlbDogc3RyaW5nXG4pOiBib29sZWFuID0+IEJvb2xlYW4oaXNFcnJvciAmJiBzdWdnZXN0aW9uID09PSByZXRyeUxhYmVsKVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVJldHJ5QXR0YWNobWVudHNGcm9tVXNlck1lc3NhZ2UgPSAodXNlck1lc3NhZ2U6IHtcbiAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdXG4gIHNvdXJjZXM/OiB1bmtub3duXG59KTogQXR0YWNobWVudEZpbGVbXSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHVzZXJNZXNzYWdlLmF0dGFjaG1lbnRzKSkgcmV0dXJuIHVzZXJNZXNzYWdlLmF0dGFjaG1lbnRzXG4gIGlmIChBcnJheS5pc0FycmF5KHVzZXJNZXNzYWdlLnNvdXJjZXMpKSByZXR1cm4gdXNlck1lc3NhZ2Uuc291cmNlcyBhcyBBdHRhY2htZW50RmlsZVtdXG4gIHJldHVybiBbXVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkT3Blbk1lc3NhZ2VPcHRpb24gPSAoc2VsZWN0ZWRPcHRpb246IHVua25vd24pOiBib29sZWFuID0+ICFzZWxlY3RlZE9wdGlvblxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEJsb2JTdHJhdGVneSA9IChcbiAgZmlsZVVybDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBmaWxlOiB1bmtub3duXG4pOiAncmVtb3RlLXVybCcgfCAnbG9jYWwtZmlsZScgfCBudWxsID0+IHtcbiAgaWYgKGZpbGVVcmwpIHJldHVybiAncmVtb3RlLXVybCdcbiAgaWYgKGZpbGUgaW5zdGFuY2VvZiBGaWxlKSByZXR1cm4gJ2xvY2FsLWZpbGUnXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBleHRyYWN0RmVlZGJhY2tTZXNzaW9uSWQgPSAobWVzc2FnZUlkOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgbWVzc2FnZUlkXG4gICAgLnNwbGl0KCctJylcbiAgICAuZmlsdGVyKHF1ZXN0aW9uSWQgPT4gcXVlc3Rpb25JZCAhPT0gJ2Fuc3dlcicpXG4gICAgLmpvaW4oJy0nKVxuXG5jb25zdCBBVURJT19FWFRFTlNJT05TID0gWycuZmxhYycsICcubTRhJywgJy5tcDMnLCAnLm1wNCcsICcub2dhJywgJy5vZ2cnLCAnLndhdicsICcud2VibSddIGFzIGNvbnN0XG5jb25zdCBBVURJT19UWVBFUyA9IFsnZmxhYycsICdtNGEnLCAnbXAzJywgJ21wNCcsICdvZ2EnLCAnb2dnJywgJ3dhdicsICd3ZWJtJ10gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IGlzQXVkaW9BdHRhY2htZW50ID0gKGF0dGFjaG1lbnQ6IFBpY2s8QXR0YWNobWVudEZpbGUsICd0eXBlJyB8ICduYW1lJz4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgYXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50Py50eXBlPy50b0xvd2VyQ2FzZSgpIHx8ICcnXG4gIGNvbnN0IGF0dGFjaG1lbnROYW1lID0gYXR0YWNobWVudD8ubmFtZT8udG9Mb3dlckNhc2UoKSB8fCAnJ1xuXG4gIHJldHVybiAoXG4gICAgYXR0YWNobWVudFR5cGUuc3RhcnRzV2l0aCgnYXVkaW8vJykgfHxcbiAgICBBVURJT19UWVBFUy5pbmNsdWRlcyhhdHRhY2htZW50VHlwZSBhcyAodHlwZW9mIEFVRElPX1RZUEVTKVtudW1iZXJdKSB8fFxuICAgIEFVRElPX0VYVEVOU0lPTlMuc29tZShleHQgPT4gYXR0YWNobWVudE5hbWUuZW5kc1dpdGgoZXh0KSlcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3ID0gKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRGaWxlKTogYm9vbGVhbiA9PlxuICBhdHRhY2htZW50LmZpbGUgaW5zdGFuY2VvZiBGaWxlIHx8XG4gIGF0dGFjaG1lbnQub3JpZ2luYWxGaWxlIGluc3RhbmNlb2YgRmlsZSB8fFxuICBCb29sZWFuKGF0dGFjaG1lbnQudXJsX3RodW1ibmFpbCB8fCBhdHRhY2htZW50LnVybF9vcmlnaW5hbCB8fCBhdHRhY2htZW50LnVybF9maWxlKVxuXG5leHBvcnQgY29uc3QgZmluZExhc3RRdWVzdGlvbklkID0gKG1lc3NhZ2VzOiBBcnJheTx7IGlkPzogc3RyaW5nIH0+KTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGZvciAobGV0IGluZGV4ID0gbWVzc2FnZXMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXggLT0gMSkge1xuICAgIGNvbnN0IG1lc3NhZ2VJZCA9IG1lc3NhZ2VzW2luZGV4XT8uaWRcbiAgICBpZiAobWVzc2FnZUlkPy5zdGFydHNXaXRoKCdxdWVzdGlvbi0nKSkge1xuICAgICAgcmV0dXJuIG1lc3NhZ2VJZFxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgY29tcHV0ZVJlc2VydmVkVHVyblNwYWNlID0gKGNsaWVudEhlaWdodDogbnVtYmVyLCB0dXJuSGVpZ2h0OiBudW1iZXIsIHZpZXdwb3J0SGVpZ2h0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICBjb25zdCBvZmZzZXQgPSB0dXJuQW5jaG9yT2Zmc2V0KHZpZXdwb3J0SGVpZ2h0KVxuICByZXR1cm4gTWF0aC5tYXgoMCwgY2xpZW50SGVpZ2h0IC0gdHVybkhlaWdodCAtIG9mZnNldClcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVNZXNzYWdlQXR0YWNobWVudHMgPSAoXG4gIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50RmlsZVtdIHwgdW5kZWZpbmVkLFxuICBpc0Fzc2lzdGFudDogYm9vbGVhbixcbiAgc291cmNlczogdW5rbm93blxuKTogQXR0YWNobWVudEZpbGVbXSA9PiB7XG4gIGlmIChhdHRhY2htZW50cyAmJiBhdHRhY2htZW50cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGF0dGFjaG1lbnRzXG4gIH1cbiAgaWYgKCFpc0Fzc2lzdGFudCAmJiBBcnJheS5pc0FycmF5KHNvdXJjZXMpKSB7XG4gICAgcmV0dXJuIHNvdXJjZXMgYXMgQXR0YWNobWVudEZpbGVbXVxuICB9XG4gIHJldHVybiBbXVxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEZpbGVOYW1lID0gKGF0dGFjaG1lbnQ6IFBpY2s8QXR0YWNobWVudEZpbGUsICduYW1lJyB8ICd0eXBlJz4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBleHRlbnNpb24gPSBhdHRhY2htZW50Lm5hbWUuaW5jbHVkZXMoJy4nKSA/ICcnIDogYC4ke2F0dGFjaG1lbnQudHlwZX1gXG4gIHJldHVybiBgJHthdHRhY2htZW50Lm5hbWV9JHtleHRlbnNpb259YFxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCA9IChcbiAgYXR0YWNobWVudDogUGljazxBdHRhY2htZW50RmlsZSwgJ3VybF9vcmlnaW5hbCcgfCAndXJsX2ZpbGUnIHwgJ3VybF90aHVtYm5haWwnPlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IGF0dGFjaG1lbnQudXJsX29yaWdpbmFsIHx8IGF0dGFjaG1lbnQudXJsX2ZpbGUgfHwgYXR0YWNobWVudC51cmxfdGh1bWJuYWlsXG5cbmV4cG9ydCBjb25zdCBzaG91bGRTa2lwRW1wdHlDaGF0TGlzdE1lc3NhZ2UgPSAocGFyYW1zOiB7XG4gIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IGJvb2xlYW5cbiAgaXNTdHJlYW1pbmc6IGJvb2xlYW5cbiAgYXR0YWNobWVudENvdW50OiBudW1iZXJcbiAgc291cmNlQ291bnQ6IG51bWJlclxuICBtZXNzYWdlVGV4dDogc3RyaW5nXG4gIHByb2plY3ROYW1lPzogc3RyaW5nXG4gIGhhc0FwcHJvdmFsOiBib29sZWFuXG59KTogYm9vbGVhbiA9PiB7XG4gIGlmIChwYXJhbXMuaXNTdHJlYW1pbmdQbGFjZWhvbGRlciB8fCBwYXJhbXMuaXNTdHJlYW1pbmcpIHJldHVybiBmYWxzZVxuICBpZiAocGFyYW1zLmF0dGFjaG1lbnRDb3VudCA+IDAgfHwgcGFyYW1zLnNvdXJjZUNvdW50ID4gMCkgcmV0dXJuIGZhbHNlXG4gIGlmIChwYXJhbXMubWVzc2FnZVRleHQpIHJldHVybiBmYWxzZVxuICBpZiAocGFyYW1zLnByb2plY3ROYW1lKSByZXR1cm4gZmFsc2VcbiAgaWYgKHBhcmFtcy5oYXNBcHByb3ZhbCkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRGlzYWJsZUZlZWRiYWNrRnJvbVdhc0hlbHBmdWwgPSAod2FzSGVscGZ1bDogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpOiBGZWVkYmFjayB8IG51bGwgPT4ge1xuICBpZiAod2FzSGVscGZ1bCA9PT0gdW5kZWZpbmVkIHx8IHdhc0hlbHBmdWwgPT09IG51bGwpIHJldHVybiBudWxsXG4gIHJldHVybiB3YXNIZWxwZnVsID8gRmVlZGJhY2suVEhVTUJTX1VQIDogRmVlZGJhY2suVEhVTUJTX0RPV05cbn1cblxuZXhwb3J0IGNvbnN0IGNhblJldHJ5QXNzaXN0YW50TWVzc2FnZSA9IChwYXJhbXM6IHtcbiAgaGFzVXNlck1lc3NhZ2VGb3JSZXRyeTogYm9vbGVhblxuICBpc1N0cmVhbWluZzogYm9vbGVhblxuICBpc0Vycm9yOiBib29sZWFuXG4gIGhhc0FwcHJvdmFsOiBib29sZWFuXG4gIGlzRnJvbnRlbmRDYW5jZWxsZWQ/OiBib29sZWFuXG4gIGlzQ2FuY2VsbGVkPzogYm9vbGVhblxuICB0dXJuSWQ6IHN0cmluZyB8IG51bGxcbn0pOiBib29sZWFuID0+IHtcbiAgaWYgKCFwYXJhbXMuaGFzVXNlck1lc3NhZ2VGb3JSZXRyeSB8fCBwYXJhbXMuaXNTdHJlYW1pbmcgfHwgcGFyYW1zLmlzRXJyb3IgfHwgcGFyYW1zLmhhc0FwcHJvdmFsKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIEJvb2xlYW4ocGFyYW1zLmlzRnJvbnRlbmRDYW5jZWxsZWQgfHwgKCFwYXJhbXMuaXNDYW5jZWxsZWQgJiYgcGFyYW1zLnR1cm5JZCkpXG59XG5cbmV4cG9ydCBjb25zdCBjb21wdXRlUmVtb3ZhYmxlVHVyblNwYWNlID0gKFxuICBzY3JvbGxIZWlnaHQ6IG51bWJlcixcbiAgY2xpZW50SGVpZ2h0OiBudW1iZXIsXG4gIHNjcm9sbFRvcDogbnVtYmVyLFxuICBjdXJyZW50U3BhY2VySGVpZ2h0OiBudW1iZXJcbik6IG51bWJlciA9PiB7XG4gIGlmIChjdXJyZW50U3BhY2VySGVpZ2h0IDw9IDApIHJldHVybiBjdXJyZW50U3BhY2VySGVpZ2h0XG4gIGNvbnN0IHJlbW92YWJsZSA9IE1hdGgubWF4KDAsIHNjcm9sbEhlaWdodCAtIGNsaWVudEhlaWdodCAtIHNjcm9sbFRvcClcbiAgcmV0dXJuIE1hdGgubWF4KDAsIGN1cnJlbnRTcGFjZXJIZWlnaHQgLSByZW1vdmFibGUpXG59XG5cbmV4cG9ydCB0eXBlIFNtb290aFN0cmVhbVdpbmRvd0ZsYWdzID0ge1xuICBzdHJlYW1BZGFwdD86IGJvb2xlYW5cbiAgc3RyZWFtQnVmZmVyTXM/OiBudW1iZXJcbiAgc3RyZWFtTGFnTXM/OiBudW1iZXJcbiAgc3RyZWFtTWluQnVmZmVyPzogbnVtYmVyXG4gIHN0cmVhbVdhcm11cE1zPzogbnVtYmVyXG59XG5cbmV4cG9ydCBjb25zdCByZWFkU21vb3RoU3RyZWFtV2luZG93RmxhZ3MgPSAoKTogU21vb3RoU3RyZWFtV2luZG93RmxhZ3MgPT4ge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiB7fVxuICByZXR1cm4gd2luZG93IGFzIHVua25vd24gYXMgU21vb3RoU3RyZWFtV2luZG93RmxhZ3Ncbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkU21vb3RoU3RyZWFtVGV4dE9wdGlvbnMgPSAoXG4gIGZsYWdzOiBTbW9vdGhTdHJlYW1XaW5kb3dGbGFncyxcbiAgaXNTdHJlYW1pbmc6IGJvb2xlYW5cbik6IHtcbiAgZW5hYmxlZDogYm9vbGVhblxuICBtYXhDaGFyc1BlckZyYW1lOiBudW1iZXJcbiAgc25hcFRvV29yZEJvdW5kYXJ5OiBib29sZWFuXG4gIHRhcmdldExhZ01zPzogbnVtYmVyXG4gIGFkYXB0VG9CYWNrZW5kUmF0ZT86IGJvb2xlYW5cbiAgdGFyZ2V0QnVmZmVyTXM/OiBudW1iZXJcbiAgbWluQnVmZmVyQ2hhcnM/OiBudW1iZXJcbiAgd2FybXVwTXM/OiBudW1iZXJcbn0gPT4gKHtcbiAgZW5hYmxlZDogaXNTdHJlYW1pbmcsXG4gIG1heENoYXJzUGVyRnJhbWU6IDI0LFxuICBzbmFwVG9Xb3JkQm91bmRhcnk6IHRydWUsXG4gIC4uLihmbGFncy5zdHJlYW1MYWdNcyAhPSBudWxsICYmIHsgdGFyZ2V0TGFnTXM6IGZsYWdzLnN0cmVhbUxhZ01zIH0pLFxuICAuLi4oZmxhZ3Muc3RyZWFtQWRhcHQgIT0gbnVsbCAmJiB7IGFkYXB0VG9CYWNrZW5kUmF0ZTogZmxhZ3Muc3RyZWFtQWRhcHQgfSksXG4gIC4uLihmbGFncy5zdHJlYW1CdWZmZXJNcyAhPSBudWxsICYmIHsgdGFyZ2V0QnVmZmVyTXM6IGZsYWdzLnN0cmVhbUJ1ZmZlck1zIH0pLFxuICAuLi4oZmxhZ3Muc3RyZWFtTWluQnVmZmVyICE9IG51bGwgJiYgeyBtaW5CdWZmZXJDaGFyczogZmxhZ3Muc3RyZWFtTWluQnVmZmVyIH0pLFxuICAuLi4oZmxhZ3Muc3RyZWFtV2FybXVwTXMgIT0gbnVsbCAmJiB7IHdhcm11cE1zOiBmbGFncy5zdHJlYW1XYXJtdXBNcyB9KSxcbn0pXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3RyZWFtaW5nUmF3VGV4dCA9IChpc1N0cmVhbWluZzogYm9vbGVhbiwgc3RyZWFtaW5nVGV4dDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgaXNTdHJlYW1pbmcgPyBzdHJlYW1pbmdUZXh0IDogbWVzc2FnZVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUmVuZGVyTWVudGlvbklubGluZU5vZGVzID0gKGhhc01lbnRpb25zOiBib29sZWFuLCBtZW50aW9uTm9kZXM6IHVua25vd24pOiBib29sZWFuID0+XG4gIEJvb2xlYW4oaGFzTWVudGlvbnMgJiYgbWVudGlvbk5vZGVzKVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZlZWRiYWNrUHJvcHNGb3JDYW5jZWxsZWQgPSA8VFNvdXJjZXMsIFRIYW5kbGVyPihcbiAgaXNGcm9udGVuZENhbmNlbGxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgc291cmNlczogVFNvdXJjZXMsXG4gIGhhbmRsZUZlZWRiYWNrQ2xpY2s6IFRIYW5kbGVyXG4pOiB7IHNvdXJjZXM6IFRTb3VyY2VzIHwgdW5kZWZpbmVkOyBoYW5kbGVGZWVkYmFjazogVEhhbmRsZXIgfCB1bmRlZmluZWQgfSA9PiAoe1xuICBzb3VyY2VzOiBpc0Zyb250ZW5kQ2FuY2VsbGVkID8gdW5kZWZpbmVkIDogc291cmNlcyxcbiAgaGFuZGxlRmVlZGJhY2s6IGlzRnJvbnRlbmRDYW5jZWxsZWQgPyB1bmRlZmluZWQgOiBoYW5kbGVGZWVkYmFja0NsaWNrLFxufSlcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVTdHJlYW1pbmdNZXNzYWdlSG9va0lkID0gKGlzU3RyZWFtaW5nOiBib29sZWFuLCBtZXNzYWdlSWQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT5cbiAgaXNTdHJlYW1pbmcgPyBtZXNzYWdlSWQgOiBudWxsXG5cbmV4cG9ydCBjb25zdCBzaG91bGRJbml0aWFsaXplQ2hhdCA9IChhbHJlYWR5SW5pdGlhbGl6ZWQ6IGJvb2xlYW4pOiBib29sZWFuID0+ICFhbHJlYWR5SW5pdGlhbGl6ZWRcblxuZXhwb3J0IGNvbnN0IHNob3VsZENsZWFyTGFzdFJlc2VydmVkUXVlc3Rpb24gPSAobG9hZGluZ01lc3NhZ2VzOiBib29sZWFuKTogYm9vbGVhbiA9PiBsb2FkaW5nTWVzc2FnZXNcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNjaGVkdWxlVHVyblNwYWNlUmVzZXJ2YXRpb24gPSAoXG4gIGxvYWRpbmdNZXNzYWdlczogYm9vbGVhbixcbiAgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzOiBib29sZWFuLFxuICBxdWVzdGlvbklkOiBzdHJpbmcgfCBudWxsLFxuICBsYXN0UmVzZXJ2ZWRRdWVzdGlvbklkOiBzdHJpbmcgfCBudWxsXG4pOiBib29sZWFuID0+ICFsb2FkaW5nTWVzc2FnZXMgJiYgIWlzTG9hZGluZ01vcmVNZXNzYWdlcyAmJiBCb29sZWFuKHF1ZXN0aW9uSWQpICYmIHF1ZXN0aW9uSWQgIT09IGxhc3RSZXNlcnZlZFF1ZXN0aW9uSWRcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNraXBNZXNzYWdlc1Njcm9sbEVmZmVjdCA9IChcbiAgaGFzQ29udGFpbmVyOiBib29sZWFuLFxuICBsb2FkaW5nTWVzc2FnZXM6IGJvb2xlYW4sXG4gIGlzTG9hZGluZ01vcmVNZXNzYWdlczogYm9vbGVhbixcbiAgaXNMb2FkaW5nTW9yZVJlZjogYm9vbGVhblxuKTogYm9vbGVhbiA9PiAhaGFzQ29udGFpbmVyIHx8IGxvYWRpbmdNZXNzYWdlcyB8fCBpc0xvYWRpbmdNb3JlTWVzc2FnZXMgfHwgaXNMb2FkaW5nTW9yZVJlZlxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNvbnRhaW5lckF0Qm90dG9tID0gKFxuICBjb250YWluZXI6IHsgc2Nyb2xsSGVpZ2h0OiBudW1iZXI7IHNjcm9sbFRvcDogbnVtYmVyOyBjbGllbnRIZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiA9PlxuICBjb250YWluZXIgPyBpc0NvbnRhaW5lckF0U2Nyb2xsQm90dG9tKGNvbnRhaW5lci5zY3JvbGxIZWlnaHQsIGNvbnRhaW5lci5zY3JvbGxUb3AsIGNvbnRhaW5lci5jbGllbnRIZWlnaHQpIDogZmFsc2VcblxuZXhwb3J0IGNvbnN0IHNob3VsZFJ1blNlc3Npb25DYWNoZVNjcm9sbFRvQm90dG9tID0gKFxuICBsb2FkaW5nTWVzc2FnZXM6IGJvb2xlYW4sXG4gIGluaXRpYWxDaGF0SWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG1lc3NhZ2VzTGVuZ3RoOiBudW1iZXIsXG4gIGxhc3RTY3JvbGxlZFNlc3Npb25JZDogc3RyaW5nIHwgbnVsbFxuKTogYm9vbGVhbiA9PlxuICAhbG9hZGluZ01lc3NhZ2VzICYmIEJvb2xlYW4oaW5pdGlhbENoYXRJZCkgJiYgbWVzc2FnZXNMZW5ndGggPiAwICYmIGxhc3RTY3JvbGxlZFNlc3Npb25JZCAhPT0gaW5pdGlhbENoYXRJZFxuXG5leHBvcnQgY29uc3QgZGV0ZWN0SnVzdEZpbmlzaGVkTG9hZGluZ01lc3NhZ2VzID0gKHdhc0xvYWRpbmc6IGJvb2xlYW4sIGxvYWRpbmdNZXNzYWdlczogYm9vbGVhbik6IGJvb2xlYW4gPT5cbiAgd2FzTG9hZGluZyAmJiAhbG9hZGluZ01lc3NhZ2VzXG5cbmV4cG9ydCBjb25zdCBzaG91bGRTY3JvbGxUb0JvdHRvbUFmdGVyTG9hZCA9IChqdXN0RmluaXNoZWRMb2FkaW5nOiBib29sZWFuLCBtZXNzYWdlc0xlbmd0aDogbnVtYmVyKTogYm9vbGVhbiA9PlxuICBqdXN0RmluaXNoZWRMb2FkaW5nICYmIG1lc3NhZ2VzTGVuZ3RoID4gMFxuXG5leHBvcnQgY29uc3Qgc2hvdWxkVXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXNPbkxvYWRFbmQgPSAobG9hZGluZ01lc3NhZ2VzOiBib29sZWFuKTogYm9vbGVhbiA9PiAhbG9hZGluZ01lc3NhZ2VzXG5cbmV4cG9ydCBjb25zdCBzaG91bGRDbGVhclNjcm9sbFJlc3RvcmVXaXRob3V0Q2hhdCA9IChpbml0aWFsQ2hhdElkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiAhaW5pdGlhbENoYXRJZFxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVBlbmRpbmdTY3JvbGxUb3BGcm9tU2Vzc2lvbiA9IChcbiAgc2Vzc2lvbjogeyBzY3JvbGxTZXNzaW9uSWQ/OiBzdHJpbmc7IHNjcm9sbFRvcD86IG51bWJlciB9IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgaW5pdGlhbENoYXRJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogbnVtYmVyIHwgbnVsbCA9PiB7XG4gIGlmICghaW5pdGlhbENoYXRJZCB8fCAhc2Vzc2lvbikgcmV0dXJuIG51bGxcbiAgaWYgKHNlc3Npb24uc2Nyb2xsU2Vzc2lvbklkID09PSBpbml0aWFsQ2hhdElkICYmIHR5cGVvZiBzZXNzaW9uLnNjcm9sbFRvcCA9PT0gJ251bWJlcicgJiYgc2Vzc2lvbi5zY3JvbGxUb3AgPiAwKSB7XG4gICAgcmV0dXJuIHNlc3Npb24uc2Nyb2xsVG9wXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZEFwcGx5UGVuZGluZ1Njcm9sbFJlc3RvcmUgPSAoXG4gIGxvYWRpbmdNZXNzYWdlczogYm9vbGVhbixcbiAgcGVuZGluZ1Njcm9sbFRvcDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgaGFzQ29udGFpbmVyOiBib29sZWFuXG4pOiBib29sZWFuID0+ICFsb2FkaW5nTWVzc2FnZXMgJiYgcGVuZGluZ1Njcm9sbFRvcCAhPSBudWxsICYmIHBlbmRpbmdTY3JvbGxUb3AgPiAwICYmIGhhc0NvbnRhaW5lclxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUmVzdG9yZVNjcm9sbE9uRXhwYW5kZWRDaGFuZ2UgPSAoXG4gIHByZXZpb3VzRXhwYW5kZWQ6IGJvb2xlYW4sXG4gIGV4cGFuZGVkOiBib29sZWFuLFxuICBoYXNDb250YWluZXI6IGJvb2xlYW5cbik6IGJvb2xlYW4gPT4gcHJldmlvdXNFeHBhbmRlZCAhPT0gZXhwYW5kZWQgJiYgaGFzQ29udGFpbmVyXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlTWVzc2FnZUxpc3RJdGVtS2V5ID0gKG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBpbmRleDogbnVtYmVyKTogc3RyaW5nID0+XG4gIG1lc3NhZ2VJZCA/PyBgbXNnLSR7aW5kZXh9YFxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQgPSAoXG4gIGZvbGxvd1VwOiB7IGFnZW50SWQ6IHN0cmluZyB9IHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IGZvbGxvd1VwPy5hZ2VudElkXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3RyZWFtaW5nVGV4dEhvb2tJZCA9IChcbiAgaXNTdHJlYW1pbmc6IGJvb2xlYW4sXG4gIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IGJvb2xlYW4sXG4gIG1lc3NhZ2VJZDogc3RyaW5nXG4pOiBzdHJpbmcgfCBudWxsID0+IChpc1N0cmVhbWluZyB8fCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyID8gbWVzc2FnZUlkIDogbnVsbClcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVSZWFzb25pbmdUcmFjZUhvb2tJZCA9IChpc0Fzc2lzdGFudDogYm9vbGVhbiwgaXNBY3RpdmVTdHJlYW1pbmc6IGJvb2xlYW4sIGlkOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgaXNBc3Npc3RhbnQgJiYgaXNBY3RpdmVTdHJlYW1pbmcgPyBpZCA6ICcnXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU2Nyb2xsT25QYXJlbnRNb2RlID0gKGV4cGFuZGVkOiBib29sZWFuIHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiBCb29sZWFuKGV4cGFuZGVkKVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUxhc3RVc2VyTWVzc2FnZUZvckF0dGFjaG1lbnRzID0gPFQgZXh0ZW5kcyB7IHJvbGU/OiBDaGF0SGlzdG9yeVJvbGU7IHVzZXI6IHsgaWQ6IHN0cmluZyB9IH0+KFxuICBtZXNzYWdlczogVFtdLFxuICBhdXRoVXNlcklkOiBzdHJpbmdcbik6IFQgfCB1bmRlZmluZWQgPT5cbiAgbWVzc2FnZXMuZmlsdGVyKG1zZyA9PiBtc2cucm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgfHwgbXNnLnVzZXIuaWQgPT09IGF1dGhVc2VySWQudG9TdHJpbmcoKSkuYXQoLTEpXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU3VnZ2VzdGlvbkFuYWx5dGljc0FnZW50VHlwZSA9IChcbiAgaXNNYXJrZXRwbGFjZUdsb2JhbEFnZW50OiBib29sZWFuLFxuICBhZ2VudFR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IChpc01hcmtldHBsYWNlR2xvYmFsQWdlbnQgPyAnbWFya2V0cGxhY2UnIDogYWdlbnRUeXBlKVxuXG5leHBvcnQgdHlwZSBDaGF0TWVzc2FnZXNTY3JvbGxGcmFtZUlucHV0ID0ge1xuICBzY3JvbGxUb3A6IG51bWJlclxuICBzY3JvbGxIZWlnaHQ6IG51bWJlclxuICBjbGllbnRIZWlnaHQ6IG51bWJlclxuICBsYXN0U2Nyb2xsVG9wOiBudW1iZXJcbiAgc2Nyb2xsVGhyZXNob2xkOiBudW1iZXJcbiAgYW5jaG9yZWRUdXJuSWQ6IHN0cmluZyB8IG51bGxcbiAgaW5pdGlhbENoYXRJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc0NoYXRNZXNzYWdlc1Njcm9sbEZyYW1lID0gKGlucHV0OiBDaGF0TWVzc2FnZXNTY3JvbGxGcmFtZUlucHV0KSA9PiB7XG4gIGNvbnN0IGlzU2Nyb2xsaW5nVXAgPSBpc1Njcm9sbGluZ1Vwd2FyZChpbnB1dC5zY3JvbGxUb3AsIGlucHV0Lmxhc3RTY3JvbGxUb3ApXG4gIGNvbnN0IGlzTmVhckJvdHRvbSA9IGlzTmVhclNjcm9sbEJvdHRvbShcbiAgICBpbnB1dC5zY3JvbGxIZWlnaHQsXG4gICAgaW5wdXQuc2Nyb2xsVG9wLFxuICAgIGlucHV0LmNsaWVudEhlaWdodCxcbiAgICBpbnB1dC5zY3JvbGxUaHJlc2hvbGRcbiAgKVxuICBjb25zdCBuZXh0U2Nyb2xsVGhyZXNob2xkID0gcmVzb2x2ZVNjcm9sbE5lYXJCb3R0b21UaHJlc2hvbGQoaW5wdXQuc2Nyb2xsVGhyZXNob2xkLCBpc1Njcm9sbGluZ1VwLCBpc05lYXJCb3R0b20pXG5cbiAgcmV0dXJuIHtcbiAgICBuZXh0U2Nyb2xsVGhyZXNob2xkLFxuICAgIGxhc3RTY3JvbGxUb3A6IGlucHV0LnNjcm9sbFRvcCxcbiAgICBzaG91bGREcmFpblR1cm5TcGFjZTogc2hvdWxkRHJhaW5UdXJuU3BhY2VPblNjcm9sbChpbnB1dC5hbmNob3JlZFR1cm5JZCksXG4gICAgc2hvdWxkU2NoZWR1bGVTY3JvbGxQZXJzaXN0OiBzaG91bGRQZXJzaXN0TWFpYVBhbmVsU2Nyb2xsKGlucHV0LmluaXRpYWxDaGF0SWQsIGlucHV0LnNjcm9sbFRvcCksXG4gICAgc2hvdWxkTm90aWZ5U2Nyb2xsVG9Cb3R0b206IGlzTmVhckJvdHRvbSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY29tcHV0ZU1lYXN1cmVUdXJuTGF5b3V0ID0gKHBhcmFtczoge1xuICBjb250YWluZXJUb3A6IG51bWJlclxuICBxdWVzdGlvblRvcDogbnVtYmVyXG4gIGNvbnRlbnRCb3R0b206IG51bWJlclxuICBzY3JvbGxUb3A6IG51bWJlclxufSk6IHsgcXVlc3Rpb25Ub3A6IG51bWJlcjsgdHVybkhlaWdodDogbnVtYmVyIH0gPT4ge1xuICBjb25zdCBxdWVzdGlvblNjcm9sbFRvcCA9IHBhcmFtcy5xdWVzdGlvblRvcCAtIHBhcmFtcy5jb250YWluZXJUb3AgKyBwYXJhbXMuc2Nyb2xsVG9wXG4gIGNvbnN0IGNvbnRlbnRCb3R0b21TY3JvbGwgPSBwYXJhbXMuY29udGVudEJvdHRvbSAtIHBhcmFtcy5jb250YWluZXJUb3AgKyBwYXJhbXMuc2Nyb2xsVG9wXG4gIHJldHVybiB7IHF1ZXN0aW9uVG9wOiBxdWVzdGlvblNjcm9sbFRvcCwgdHVybkhlaWdodDogY29udGVudEJvdHRvbVNjcm9sbCAtIHF1ZXN0aW9uU2Nyb2xsVG9wIH1cbn1cblxuZXhwb3J0IHR5cGUgUmVzZXJ2ZVR1cm5TcGFjZVBsYW4gPVxuICB7IGtpbmQ6ICdza2lwLXJlc2VydmF0aW9uJyB9IHwgeyBraW5kOiAncmVzZXJ2ZSc7IHNwYWNlckhlaWdodDogbnVtYmVyOyB0YXJnZXRTY3JvbGxUb3A6IG51bWJlciB9XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUmVzZXJ2ZVR1cm5TcGFjZVBsYW4gPSAocGFyYW1zOiB7XG4gIGN1cnJlbnRTY3JvbGxUb3A6IG51bWJlclxuICB0YXJnZXRTY3JvbGxUb3A6IG51bWJlclxuICBjbGllbnRIZWlnaHQ6IG51bWJlclxuICB0dXJuSGVpZ2h0OiBudW1iZXJcbn0pOiBSZXNlcnZlVHVyblNwYWNlUGxhbiA9PiB7XG4gIGlmIChzaG91bGRTa2lwVHVyblNwYWNlUmVzZXJ2YXRpb24ocGFyYW1zLmN1cnJlbnRTY3JvbGxUb3AsIHBhcmFtcy50YXJnZXRTY3JvbGxUb3ApKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ3NraXAtcmVzZXJ2YXRpb24nIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGtpbmQ6ICdyZXNlcnZlJyxcbiAgICBzcGFjZXJIZWlnaHQ6IGNvbXB1dGVSZXNlcnZlZFR1cm5TcGFjZShwYXJhbXMuY2xpZW50SGVpZ2h0LCBwYXJhbXMudHVybkhlaWdodCwgcGFyYW1zLmNsaWVudEhlaWdodCksXG4gICAgdGFyZ2V0U2Nyb2xsVG9wOiBwYXJhbXMudGFyZ2V0U2Nyb2xsVG9wLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU2Nyb2xsVG9Cb3R0b21UYXJnZXRUb3AgPSAoc2Nyb2xsSGVpZ2h0OiBudW1iZXIsIGNsaWVu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