@projectcor/maia-components 2.11.78-16 → 2.11.78-2
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/CHANGELOG.md +0 -15
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +17 -0
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +15 -0
- package/lib/components/atoms/SessionGeneratingDot/index.js +2 -0
- package/lib/components/atoms/SessionUnreadDot/SessionUnreadDot.js +12 -0
- package/lib/components/atoms/SessionUnreadDot/SessionUnreadDot.styles.js +8 -0
- package/lib/components/atoms/SessionUnreadDot/index.js +2 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +46 -7
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +4 -5
- package/lib/components/molecules/Sidebar/Sidebar.js +51 -42
- package/lib/components/molecules/Sidebar/Sidebar.styles.js +10 -6
- package/lib/components/organisms/ChatAI/ChatAI.js +10 -2
- package/lib/hooks/useChatManager/useChatManager.js +456 -428
- package/lib/hooks/useChatMessages/useChatMessages.js +411 -249
- package/lib/hooks/useChats/useChats.js +8 -3
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +140 -496
- package/lib/hooks/useStreamingMessage/index.js +2 -3
- package/lib/hooks/useStreamingMessage/useStreamingMessage.js +13 -17
- package/lib/lang/br/index.js +7 -4
- package/lib/lang/en/index.js +7 -4
- package/lib/lang/es/index.js +7 -4
- package/lib/lang/fr/index.js +9 -5
- package/lib/store/chatsSidebarOptimistic.js +87 -0
- package/lib/store/chatsStore.types.js +1 -1
- package/lib/store/sessions/activeView.js +22 -0
- package/lib/store/sessions/index.js +10 -0
- package/lib/store/sessions/sessionHitlContext.js +15 -0
- package/lib/store/sessions/sessionNotificationSound.js +57 -0
- package/lib/store/sessions/sessionNotifications.js +111 -0
- package/lib/store/sessions/sessionNotifications.types.js +2 -0
- package/lib/store/sessions/sessionStreamManager.js +585 -0
- package/lib/store/sessions/sessionStreamingText.js +80 -0
- package/lib/store/sessions/sessionUnreadPersistence.js +49 -0
- package/lib/store/sessions/sessions.types.js +35 -0
- package/lib/store/sessions/useSessionMeta.js +39 -0
- package/lib/store/sessions/useSessionStreamingText.js +18 -0
- package/lib/store/sessions/useSessionsStore.js +234 -0
- package/lib/store/useChatsStore.js +41 -9
- package/lib/types/streamActivity.js +1 -1
- package/lib/types/userType.d.js +1 -1
- package/package.json +31 -70
- package/lib/hooks/useStreamingMessage/streamingStore.js +0 -69
|
@@ -0,0 +1,585 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
4
|
+
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; }
|
|
5
|
+
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; }
|
|
6
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
7
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
8
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
9
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
10
|
+
/* eslint-disable no-console */
|
|
11
|
+
/* eslint-disable no-continue */
|
|
12
|
+
/* eslint-disable no-await-in-loop */
|
|
13
|
+
/* eslint-disable no-restricted-syntax */
|
|
14
|
+
/* eslint-disable no-constant-condition */
|
|
15
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
16
|
+
import maia from '../../services/maia';
|
|
17
|
+
import { getInitialStreamActivity, getThinkingLoadingMessage, getWritingStreamActivity, resolveHitlNodeStreamActivity, resolveInitialHitlStreamActivity } from '../../utils/streamActivityMessages';
|
|
18
|
+
import { isCompleteLikeSsePayload, mergeStreamChunk } from '../../utils/sseStreamContent';
|
|
19
|
+
import { sessionStreamingText } from './sessionStreamingText';
|
|
20
|
+
import { useSessionsStore } from './useSessionsStore';
|
|
21
|
+
import { ensureSessionNotificationsInitialized } from './sessionNotifications';
|
|
22
|
+
import { ensureSessionInSidebarFromRequest } from '../chatsSidebarOptimistic';
|
|
23
|
+
import { sessionHitlContext } from './sessionHitlContext';
|
|
24
|
+
|
|
25
|
+
/** Compatible con el `t` de i18next (uso de una sola key). */
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Máximo de sesiones generando en paralelo. Protege red/recursos del cliente.
|
|
29
|
+
* Ajustable a futuro vía flag del host.
|
|
30
|
+
*/
|
|
31
|
+
export var MAX_CONCURRENT_STREAMS = 4;
|
|
32
|
+
var STREAM_THROTTLE_MS = 16;
|
|
33
|
+
var activeStreams = new Map();
|
|
34
|
+
var store = function store() {
|
|
35
|
+
return useSessionsStore.getState();
|
|
36
|
+
};
|
|
37
|
+
var isStreamActive = function isStreamActive(sessionId) {
|
|
38
|
+
return activeStreams.has(sessionId);
|
|
39
|
+
};
|
|
40
|
+
var getActiveStreamCount = function getActiveStreamCount() {
|
|
41
|
+
return activeStreams.size;
|
|
42
|
+
};
|
|
43
|
+
var parseSessionSSE = /*#__PURE__*/function () {
|
|
44
|
+
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(response, active, params) {
|
|
45
|
+
var _params$hitlExecution, _response$body, _data$error, _data$error2, _callbacks$onError, _data$error3, _data$error4;
|
|
46
|
+
var sessionId, placeholderId, callbacks, t, hitlExecutionContext, pendingContent, throttleTimer, flushToStores, emitThrottled, flushPending, reader, decoder, buffer, accumulatedContent, hasStartedWriting, hasAddedToSidebar, maybeAddSessionToSidebar, ensureWritingStarted, applyStreamChunk, applyStreamComplete, _yield$reader$read, done, value, lines, _iterator, _step, line, _line$split, _line$split2, eventLine, dataLine, eventType, dataStr, data, chunk, _chunk, _callbacks$onApproval, isManualApproval, _t, _t2, _t3;
|
|
47
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
48
|
+
while (1) switch (_context.prev = _context.next) {
|
|
49
|
+
case 0:
|
|
50
|
+
sessionId = params.sessionId, placeholderId = params.placeholderId, callbacks = params.callbacks, t = params.t;
|
|
51
|
+
hitlExecutionContext = (_params$hitlExecution = params.hitlExecutionContext) !== null && _params$hitlExecution !== void 0 ? _params$hitlExecution : sessionHitlContext.get(sessionId);
|
|
52
|
+
pendingContent = null;
|
|
53
|
+
throttleTimer = null;
|
|
54
|
+
flushToStores = function flushToStores(content) {
|
|
55
|
+
var _callbacks$onStreamUp;
|
|
56
|
+
sessionStreamingText.setText(sessionId, placeholderId, content);
|
|
57
|
+
(_callbacks$onStreamUp = callbacks.onStreamUpdate) === null || _callbacks$onStreamUp === void 0 || _callbacks$onStreamUp.call(callbacks, content);
|
|
58
|
+
};
|
|
59
|
+
emitThrottled = function emitThrottled(content) {
|
|
60
|
+
pendingContent = content;
|
|
61
|
+
if (throttleTimer != null) return;
|
|
62
|
+
throttleTimer = window.setTimeout(function () {
|
|
63
|
+
throttleTimer = null;
|
|
64
|
+
if (pendingContent != null) {
|
|
65
|
+
var toEmit = pendingContent;
|
|
66
|
+
pendingContent = null;
|
|
67
|
+
flushToStores(toEmit);
|
|
68
|
+
}
|
|
69
|
+
}, STREAM_THROTTLE_MS);
|
|
70
|
+
};
|
|
71
|
+
flushPending = function flushPending() {
|
|
72
|
+
if (throttleTimer != null) {
|
|
73
|
+
window.clearTimeout(throttleTimer);
|
|
74
|
+
throttleTimer = null;
|
|
75
|
+
}
|
|
76
|
+
if (pendingContent != null) {
|
|
77
|
+
var toEmit = pendingContent;
|
|
78
|
+
pendingContent = null;
|
|
79
|
+
flushToStores(toEmit);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
reader = (_response$body = response.body) === null || _response$body === void 0 ? void 0 : _response$body.getReader();
|
|
83
|
+
if (reader) {
|
|
84
|
+
_context.next = 1;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
throw new Error('No reader available');
|
|
88
|
+
case 1:
|
|
89
|
+
decoder = new TextDecoder();
|
|
90
|
+
buffer = '';
|
|
91
|
+
accumulatedContent = '';
|
|
92
|
+
hasStartedWriting = false;
|
|
93
|
+
hasAddedToSidebar = false;
|
|
94
|
+
maybeAddSessionToSidebar = function maybeAddSessionToSidebar() {
|
|
95
|
+
if (hasAddedToSidebar || params.sidebarOnFirstToken === false) return;
|
|
96
|
+
hasAddedToSidebar = true;
|
|
97
|
+
ensureSessionInSidebarFromRequest(sessionId, params.request, params.agentEmoji);
|
|
98
|
+
};
|
|
99
|
+
ensureWritingStarted = function ensureWritingStarted() {
|
|
100
|
+
var _callbacks$onStartWri;
|
|
101
|
+
if (hasStartedWriting) return;
|
|
102
|
+
hasStartedWriting = true;
|
|
103
|
+
store().patchMeta(sessionId, {
|
|
104
|
+
isLoading: true,
|
|
105
|
+
isWriting: true
|
|
106
|
+
});
|
|
107
|
+
store().setStatus(sessionId, 'writing');
|
|
108
|
+
store().setActivity(sessionId, getWritingStreamActivity(t));
|
|
109
|
+
(_callbacks$onStartWri = callbacks.onStartWriting) === null || _callbacks$onStartWri === void 0 || _callbacks$onStartWri.call(callbacks);
|
|
110
|
+
};
|
|
111
|
+
applyStreamChunk = function applyStreamChunk(chunk) {
|
|
112
|
+
if (!chunk) return;
|
|
113
|
+
accumulatedContent = mergeStreamChunk(accumulatedContent, chunk);
|
|
114
|
+
emitThrottled(accumulatedContent);
|
|
115
|
+
};
|
|
116
|
+
applyStreamComplete = function applyStreamComplete(payload) {
|
|
117
|
+
var _payload$agent_id, _subagentRaw$resolved, _callbacks$onFinishSt;
|
|
118
|
+
var finalContent = payload.content || accumulatedContent;
|
|
119
|
+
var sources = payload.sources || null;
|
|
120
|
+
var memorySessionId = payload.memory_session_id || '';
|
|
121
|
+
var attachments = Array.isArray(payload.attachments) ? payload.attachments : null;
|
|
122
|
+
var suggestions = null;
|
|
123
|
+
if (Array.isArray(payload.suggest_reply)) {
|
|
124
|
+
suggestions = payload.suggest_reply;
|
|
125
|
+
} else if (Array.isArray(payload.suggestions)) {
|
|
126
|
+
suggestions = payload.suggestions;
|
|
127
|
+
}
|
|
128
|
+
var agentIdRaw = (_payload$agent_id = payload.agent_id) !== null && _payload$agent_id !== void 0 ? _payload$agent_id : payload.agentId;
|
|
129
|
+
var completedAgentId = agentIdRaw != null && String(agentIdRaw).trim() !== '' ? String(agentIdRaw).trim() : null;
|
|
130
|
+
var subagentRaw = payload.subagent;
|
|
131
|
+
var resolvedContext = (_subagentRaw$resolved = subagentRaw === null || subagentRaw === void 0 ? void 0 : subagentRaw.resolved_context) !== null && _subagentRaw$resolved !== void 0 ? _subagentRaw$resolved : null;
|
|
132
|
+
flushPending();
|
|
133
|
+
sessionStreamingText.clear(sessionId);
|
|
134
|
+
store().patchMeta(sessionId, {
|
|
135
|
+
isLoading: false,
|
|
136
|
+
isWriting: false
|
|
137
|
+
});
|
|
138
|
+
store().setActivity(sessionId, null);
|
|
139
|
+
store().setStatus(sessionId, 'complete');
|
|
140
|
+
var finishPayload = {
|
|
141
|
+
content: finalContent,
|
|
142
|
+
sources: sources,
|
|
143
|
+
memorySessionId: memorySessionId,
|
|
144
|
+
attachments: attachments,
|
|
145
|
+
suggestions: suggestions,
|
|
146
|
+
completedAgentId: completedAgentId,
|
|
147
|
+
resolvedContext: resolvedContext
|
|
148
|
+
};
|
|
149
|
+
(_callbacks$onFinishSt = callbacks.onFinishStream) === null || _callbacks$onFinishSt === void 0 || _callbacks$onFinishSt.call(callbacks, finishPayload);
|
|
150
|
+
};
|
|
151
|
+
_context.prev = 2;
|
|
152
|
+
case 3:
|
|
153
|
+
if (!true) {
|
|
154
|
+
_context.next = 28;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
if (!active.isStopped) {
|
|
158
|
+
_context.next = 4;
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
reader.cancel();
|
|
162
|
+
return _context.abrupt("continue", 28);
|
|
163
|
+
case 4:
|
|
164
|
+
_context.next = 5;
|
|
165
|
+
return reader.read();
|
|
166
|
+
case 5:
|
|
167
|
+
_yield$reader$read = _context.sent;
|
|
168
|
+
done = _yield$reader$read.done;
|
|
169
|
+
value = _yield$reader$read.value;
|
|
170
|
+
if (!done) {
|
|
171
|
+
_context.next = 6;
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
return _context.abrupt("continue", 28);
|
|
175
|
+
case 6:
|
|
176
|
+
if (!active.isStopped) {
|
|
177
|
+
_context.next = 7;
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
reader.cancel();
|
|
181
|
+
return _context.abrupt("continue", 28);
|
|
182
|
+
case 7:
|
|
183
|
+
buffer += decoder.decode(value, {
|
|
184
|
+
stream: true
|
|
185
|
+
});
|
|
186
|
+
lines = buffer.split('\n\n');
|
|
187
|
+
buffer = lines.pop() || '';
|
|
188
|
+
_iterator = _createForOfIteratorHelper(lines);
|
|
189
|
+
_context.prev = 8;
|
|
190
|
+
_iterator.s();
|
|
191
|
+
case 9:
|
|
192
|
+
if ((_step = _iterator.n()).done) {
|
|
193
|
+
_context.next = 24;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
line = _step.value;
|
|
197
|
+
if (!(line.trim() === '')) {
|
|
198
|
+
_context.next = 10;
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
return _context.abrupt("continue", 23);
|
|
202
|
+
case 10:
|
|
203
|
+
_line$split = line.split('\n'), _line$split2 = _slicedToArray(_line$split, 2), eventLine = _line$split2[0], dataLine = _line$split2[1];
|
|
204
|
+
if (!(!eventLine || !dataLine)) {
|
|
205
|
+
_context.next = 11;
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
return _context.abrupt("continue", 23);
|
|
209
|
+
case 11:
|
|
210
|
+
eventType = eventLine.replace('event: ', '').trim();
|
|
211
|
+
dataStr = dataLine.replace('data: ', '').trim();
|
|
212
|
+
_context.prev = 12;
|
|
213
|
+
data = JSON.parse(dataStr);
|
|
214
|
+
_t = eventType;
|
|
215
|
+
_context.next = _t === 'thinking' ? 13 : _t === 'token' ? 14 : _t === 'content' ? 15 : _t === 'node' ? 16 : _t === 'complete' ? 17 : _t === 'approval_required' ? 18 : _t === 'error' ? 19 : 20;
|
|
216
|
+
break;
|
|
217
|
+
case 13:
|
|
218
|
+
if (!hasStartedWriting) {
|
|
219
|
+
store().patchMeta(sessionId, {
|
|
220
|
+
isLoading: true
|
|
221
|
+
});
|
|
222
|
+
store().setStatus(sessionId, 'thinking');
|
|
223
|
+
store().setActivity(sessionId, {
|
|
224
|
+
phase: 'thinking',
|
|
225
|
+
message: getThinkingLoadingMessage(0, t)
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return _context.abrupt("continue", 21);
|
|
229
|
+
case 14:
|
|
230
|
+
chunk = typeof data.content === 'string' ? data.content : '';
|
|
231
|
+
maybeAddSessionToSidebar();
|
|
232
|
+
ensureWritingStarted();
|
|
233
|
+
applyStreamChunk(chunk);
|
|
234
|
+
return _context.abrupt("continue", 21);
|
|
235
|
+
case 15:
|
|
236
|
+
_chunk = typeof data.content === 'string' ? data.content : '';
|
|
237
|
+
ensureWritingStarted();
|
|
238
|
+
applyStreamChunk(_chunk);
|
|
239
|
+
if (isCompleteLikeSsePayload(data)) {
|
|
240
|
+
applyStreamComplete(data);
|
|
241
|
+
}
|
|
242
|
+
return _context.abrupt("continue", 21);
|
|
243
|
+
case 16:
|
|
244
|
+
if (data.node === 'agent_transfer') {
|
|
245
|
+
store().patchMeta(sessionId, {
|
|
246
|
+
isLoading: true
|
|
247
|
+
});
|
|
248
|
+
store().setStatus(sessionId, 'thinking');
|
|
249
|
+
} else if (data.message && typeof data.message === 'string') {
|
|
250
|
+
store().patchMeta(sessionId, {
|
|
251
|
+
isLoading: true
|
|
252
|
+
});
|
|
253
|
+
store().setStatus(sessionId, 'thinking');
|
|
254
|
+
store().setActivity(sessionId, resolveHitlNodeStreamActivity(data.message, t, hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : undefined, typeof data.thread_id === 'string' ? data.thread_id : undefined));
|
|
255
|
+
}
|
|
256
|
+
return _context.abrupt("continue", 21);
|
|
257
|
+
case 17:
|
|
258
|
+
applyStreamComplete(data);
|
|
259
|
+
return _context.abrupt("continue", 21);
|
|
260
|
+
case 18:
|
|
261
|
+
flushPending();
|
|
262
|
+
isManualApproval = data.manual_approval_detected === true;
|
|
263
|
+
store().patchMeta(sessionId, {
|
|
264
|
+
isWriting: false
|
|
265
|
+
});
|
|
266
|
+
if (!isManualApproval) {
|
|
267
|
+
store().patchMeta(sessionId, {
|
|
268
|
+
isLoading: false
|
|
269
|
+
});
|
|
270
|
+
sessionStreamingText.clear(sessionId);
|
|
271
|
+
store().setActivity(sessionId, null);
|
|
272
|
+
}
|
|
273
|
+
store().setStatus(sessionId, 'awaiting_approval');
|
|
274
|
+
(_callbacks$onApproval = callbacks.onApprovalRequired) === null || _callbacks$onApproval === void 0 || _callbacks$onApproval.call(callbacks, data, accumulatedContent);
|
|
275
|
+
if (isManualApproval && Array.isArray(data.pending_actions) && data.pending_actions.length > 0) {
|
|
276
|
+
store().patchMeta(sessionId, {
|
|
277
|
+
isLoading: true
|
|
278
|
+
});
|
|
279
|
+
store().setStatus(sessionId, 'thinking');
|
|
280
|
+
store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : undefined));
|
|
281
|
+
}
|
|
282
|
+
return _context.abrupt("continue", 21);
|
|
283
|
+
case 19:
|
|
284
|
+
console.error('SSE Error:', data.error);
|
|
285
|
+
flushPending();
|
|
286
|
+
sessionStreamingText.clear(sessionId);
|
|
287
|
+
store().patchMeta(sessionId, {
|
|
288
|
+
isLoading: false,
|
|
289
|
+
isWriting: false
|
|
290
|
+
});
|
|
291
|
+
store().setActivity(sessionId, null);
|
|
292
|
+
store().setError(sessionId, {
|
|
293
|
+
type: (_data$error = data.error) === null || _data$error === void 0 ? void 0 : _data$error.type,
|
|
294
|
+
message: (_data$error2 = data.error) === null || _data$error2 === void 0 ? void 0 : _data$error2.message
|
|
295
|
+
});
|
|
296
|
+
store().setStatus(sessionId, 'error');
|
|
297
|
+
(_callbacks$onError = callbacks.onError) === null || _callbacks$onError === void 0 || _callbacks$onError.call(callbacks, (_data$error3 = data.error) === null || _data$error3 === void 0 ? void 0 : _data$error3.type, (_data$error4 = data.error) === null || _data$error4 === void 0 ? void 0 : _data$error4.message);
|
|
298
|
+
return _context.abrupt("continue", 21);
|
|
299
|
+
case 20:
|
|
300
|
+
console.warn('Unknown SSE event type:', eventType);
|
|
301
|
+
return _context.abrupt("continue", 21);
|
|
302
|
+
case 21:
|
|
303
|
+
_context.next = 23;
|
|
304
|
+
break;
|
|
305
|
+
case 22:
|
|
306
|
+
_context.prev = 22;
|
|
307
|
+
_t2 = _context["catch"](12);
|
|
308
|
+
console.error('Error parsing SSE data:', _t2, dataStr);
|
|
309
|
+
case 23:
|
|
310
|
+
_context.next = 9;
|
|
311
|
+
break;
|
|
312
|
+
case 24:
|
|
313
|
+
_context.next = 26;
|
|
314
|
+
break;
|
|
315
|
+
case 25:
|
|
316
|
+
_context.prev = 25;
|
|
317
|
+
_t3 = _context["catch"](8);
|
|
318
|
+
_iterator.e(_t3);
|
|
319
|
+
case 26:
|
|
320
|
+
_context.prev = 26;
|
|
321
|
+
_iterator.f();
|
|
322
|
+
return _context.finish(26);
|
|
323
|
+
case 27:
|
|
324
|
+
_context.next = 3;
|
|
325
|
+
break;
|
|
326
|
+
case 28:
|
|
327
|
+
_context.prev = 28;
|
|
328
|
+
flushPending();
|
|
329
|
+
return _context.finish(28);
|
|
330
|
+
case 29:
|
|
331
|
+
case "end":
|
|
332
|
+
return _context.stop();
|
|
333
|
+
}
|
|
334
|
+
}, _callee, null, [[2,, 28, 29], [8, 25, 26, 27], [12, 22]]);
|
|
335
|
+
}));
|
|
336
|
+
return function parseSessionSSE(_x, _x2, _x3) {
|
|
337
|
+
return _ref.apply(this, arguments);
|
|
338
|
+
};
|
|
339
|
+
}();
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Manager singleton (module-level) que corre N streams del orchestrator en
|
|
343
|
+
* paralelo, uno por `sessionId`. Sobrevive a cambios de vista y al cierre del
|
|
344
|
+
* modal: los streams solo se cancelan con stop explícito del usuario o al
|
|
345
|
+
* completar/errorar.
|
|
346
|
+
*/
|
|
347
|
+
export var sessionStreamManager = {
|
|
348
|
+
isActive: isStreamActive,
|
|
349
|
+
getActiveCount: getActiveStreamCount,
|
|
350
|
+
getActiveSessionIds: function getActiveSessionIds() {
|
|
351
|
+
return Array.from(activeStreams.keys());
|
|
352
|
+
},
|
|
353
|
+
startStream: function startStream(params) {
|
|
354
|
+
return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
355
|
+
var sessionId, placeholderId, request, callbacks, t, activityOptions, agentId, agentName, controller, active, response, _callbacks$onError2, _t4;
|
|
356
|
+
return _regeneratorRuntime.wrap(function (_context2) {
|
|
357
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
358
|
+
case 0:
|
|
359
|
+
ensureSessionNotificationsInitialized();
|
|
360
|
+
sessionId = params.sessionId, placeholderId = params.placeholderId, request = params.request, callbacks = params.callbacks, t = params.t, activityOptions = params.activityOptions, agentId = params.agentId, agentName = params.agentName;
|
|
361
|
+
if (!isStreamActive(sessionId)) {
|
|
362
|
+
_context2.next = 1;
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
return _context2.abrupt("return", {
|
|
366
|
+
started: false,
|
|
367
|
+
reason: 'already_active'
|
|
368
|
+
});
|
|
369
|
+
case 1:
|
|
370
|
+
if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
371
|
+
_context2.next = 2;
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
return _context2.abrupt("return", {
|
|
375
|
+
started: false,
|
|
376
|
+
reason: 'limit'
|
|
377
|
+
});
|
|
378
|
+
case 2:
|
|
379
|
+
controller = new AbortController();
|
|
380
|
+
active = {
|
|
381
|
+
sessionId: sessionId,
|
|
382
|
+
controller: controller,
|
|
383
|
+
isStopped: false
|
|
384
|
+
};
|
|
385
|
+
activeStreams.set(sessionId, active);
|
|
386
|
+
store().ensureSession(sessionId);
|
|
387
|
+
store().patchMeta(sessionId, _objectSpread(_objectSpread({
|
|
388
|
+
placeholderId: placeholderId,
|
|
389
|
+
error: null,
|
|
390
|
+
isLoading: true,
|
|
391
|
+
isWriting: false
|
|
392
|
+
}, agentId != null ? {
|
|
393
|
+
agentId: agentId
|
|
394
|
+
} : {}), agentName != null ? {
|
|
395
|
+
agentName: agentName
|
|
396
|
+
} : {}));
|
|
397
|
+
store().setStatus(sessionId, 'thinking');
|
|
398
|
+
sessionStreamingText.start(sessionId, placeholderId);
|
|
399
|
+
store().setActivity(sessionId, getInitialStreamActivity(t, activityOptions !== null && activityOptions !== void 0 ? activityOptions : {}));
|
|
400
|
+
_context2.prev = 3;
|
|
401
|
+
_context2.next = 4;
|
|
402
|
+
return maia.Orchestrator.orchestrator(request, controller.signal);
|
|
403
|
+
case 4:
|
|
404
|
+
response = _context2.sent;
|
|
405
|
+
_context2.next = 5;
|
|
406
|
+
return parseSessionSSE(response, active, params);
|
|
407
|
+
case 5:
|
|
408
|
+
_context2.next = 7;
|
|
409
|
+
break;
|
|
410
|
+
case 6:
|
|
411
|
+
_context2.prev = 6;
|
|
412
|
+
_t4 = _context2["catch"](3);
|
|
413
|
+
if (!active.isStopped) {
|
|
414
|
+
sessionStreamingText.clear(sessionId);
|
|
415
|
+
store().patchMeta(sessionId, {
|
|
416
|
+
isLoading: false,
|
|
417
|
+
isWriting: false
|
|
418
|
+
});
|
|
419
|
+
store().setActivity(sessionId, null);
|
|
420
|
+
store().setStatus(sessionId, 'error');
|
|
421
|
+
(_callbacks$onError2 = callbacks.onError) === null || _callbacks$onError2 === void 0 || _callbacks$onError2.call(callbacks);
|
|
422
|
+
}
|
|
423
|
+
case 7:
|
|
424
|
+
_context2.prev = 7;
|
|
425
|
+
activeStreams["delete"](sessionId);
|
|
426
|
+
return _context2.finish(7);
|
|
427
|
+
case 8:
|
|
428
|
+
return _context2.abrupt("return", {
|
|
429
|
+
started: true
|
|
430
|
+
});
|
|
431
|
+
case 9:
|
|
432
|
+
case "end":
|
|
433
|
+
return _context2.stop();
|
|
434
|
+
}
|
|
435
|
+
}, _callee2, null, [[3, 6, 7, 8]]);
|
|
436
|
+
}))();
|
|
437
|
+
},
|
|
438
|
+
/** Resume HITL (`continue-thread`) keyed por sessionId — mismo motor que orchestrator. */startContinueStream: function startContinueStream(params) {
|
|
439
|
+
return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
440
|
+
var _ref2;
|
|
441
|
+
var sessionId, placeholderId, continueRequest, callbacks, t, hitlExecutionContext, agentId, agentName, controller, active, sseParams, response, _callbacks$onError3, _t5;
|
|
442
|
+
return _regeneratorRuntime.wrap(function (_context3) {
|
|
443
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
444
|
+
case 0:
|
|
445
|
+
ensureSessionNotificationsInitialized();
|
|
446
|
+
sessionId = params.sessionId, placeholderId = params.placeholderId, continueRequest = params.continueRequest, callbacks = params.callbacks, t = params.t, hitlExecutionContext = params.hitlExecutionContext, agentId = params.agentId, agentName = params.agentName;
|
|
447
|
+
if (!isStreamActive(sessionId)) {
|
|
448
|
+
_context3.next = 1;
|
|
449
|
+
break;
|
|
450
|
+
}
|
|
451
|
+
return _context3.abrupt("return", {
|
|
452
|
+
started: false,
|
|
453
|
+
reason: 'already_active'
|
|
454
|
+
});
|
|
455
|
+
case 1:
|
|
456
|
+
if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
457
|
+
_context3.next = 2;
|
|
458
|
+
break;
|
|
459
|
+
}
|
|
460
|
+
return _context3.abrupt("return", {
|
|
461
|
+
started: false,
|
|
462
|
+
reason: 'limit'
|
|
463
|
+
});
|
|
464
|
+
case 2:
|
|
465
|
+
if (hitlExecutionContext) {
|
|
466
|
+
sessionHitlContext.set(sessionId, hitlExecutionContext);
|
|
467
|
+
}
|
|
468
|
+
controller = new AbortController();
|
|
469
|
+
active = {
|
|
470
|
+
sessionId: sessionId,
|
|
471
|
+
controller: controller,
|
|
472
|
+
isStopped: false
|
|
473
|
+
};
|
|
474
|
+
activeStreams.set(sessionId, active);
|
|
475
|
+
store().ensureSession(sessionId);
|
|
476
|
+
store().patchMeta(sessionId, _objectSpread(_objectSpread({
|
|
477
|
+
placeholderId: placeholderId,
|
|
478
|
+
error: null,
|
|
479
|
+
isLoading: true,
|
|
480
|
+
isWriting: false
|
|
481
|
+
}, agentId != null ? {
|
|
482
|
+
agentId: agentId
|
|
483
|
+
} : {}), agentName != null ? {
|
|
484
|
+
agentName: agentName
|
|
485
|
+
} : {}));
|
|
486
|
+
store().setStatus(sessionId, 'thinking');
|
|
487
|
+
sessionStreamingText.start(sessionId, placeholderId);
|
|
488
|
+
store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, (_ref2 = hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : sessionHitlContext.get(sessionId)) !== null && _ref2 !== void 0 ? _ref2 : undefined));
|
|
489
|
+
sseParams = {
|
|
490
|
+
sessionId: sessionId,
|
|
491
|
+
placeholderId: placeholderId,
|
|
492
|
+
request: {},
|
|
493
|
+
callbacks: callbacks,
|
|
494
|
+
t: t,
|
|
495
|
+
hitlExecutionContext: hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : sessionHitlContext.get(sessionId),
|
|
496
|
+
agentId: agentId,
|
|
497
|
+
agentName: agentName,
|
|
498
|
+
sidebarOnFirstToken: false
|
|
499
|
+
};
|
|
500
|
+
_context3.prev = 3;
|
|
501
|
+
_context3.next = 4;
|
|
502
|
+
return maia.Orchestrator.continueThread(continueRequest, controller.signal);
|
|
503
|
+
case 4:
|
|
504
|
+
response = _context3.sent;
|
|
505
|
+
if (response.ok) {
|
|
506
|
+
_context3.next = 5;
|
|
507
|
+
break;
|
|
508
|
+
}
|
|
509
|
+
throw new Error("continue-thread failed: ".concat(response.status));
|
|
510
|
+
case 5:
|
|
511
|
+
_context3.next = 6;
|
|
512
|
+
return parseSessionSSE(response, active, sseParams);
|
|
513
|
+
case 6:
|
|
514
|
+
_context3.next = 8;
|
|
515
|
+
break;
|
|
516
|
+
case 7:
|
|
517
|
+
_context3.prev = 7;
|
|
518
|
+
_t5 = _context3["catch"](3);
|
|
519
|
+
if (!active.isStopped) {
|
|
520
|
+
sessionStreamingText.clear(sessionId);
|
|
521
|
+
store().patchMeta(sessionId, {
|
|
522
|
+
isLoading: false,
|
|
523
|
+
isWriting: false
|
|
524
|
+
});
|
|
525
|
+
store().setActivity(sessionId, null);
|
|
526
|
+
store().setStatus(sessionId, 'error');
|
|
527
|
+
(_callbacks$onError3 = callbacks.onError) === null || _callbacks$onError3 === void 0 || _callbacks$onError3.call(callbacks);
|
|
528
|
+
}
|
|
529
|
+
case 8:
|
|
530
|
+
_context3.prev = 8;
|
|
531
|
+
activeStreams["delete"](sessionId);
|
|
532
|
+
sessionHitlContext.clear(sessionId);
|
|
533
|
+
return _context3.finish(8);
|
|
534
|
+
case 9:
|
|
535
|
+
return _context3.abrupt("return", {
|
|
536
|
+
started: true
|
|
537
|
+
});
|
|
538
|
+
case 10:
|
|
539
|
+
case "end":
|
|
540
|
+
return _context3.stop();
|
|
541
|
+
}
|
|
542
|
+
}, _callee3, null, [[3, 7, 8, 9]]);
|
|
543
|
+
}))();
|
|
544
|
+
},
|
|
545
|
+
/** Cancelación explícita del usuario (mensaje "cancelado"). */stopStream: function stopStream(sessionId, callbacks) {
|
|
546
|
+
var _callbacks$onStop;
|
|
547
|
+
var active = activeStreams.get(sessionId);
|
|
548
|
+
if (!active) return;
|
|
549
|
+
active.isStopped = true;
|
|
550
|
+
active.controller.abort();
|
|
551
|
+
activeStreams["delete"](sessionId);
|
|
552
|
+
sessionStreamingText.clear(sessionId);
|
|
553
|
+
store().patchMeta(sessionId, {
|
|
554
|
+
isLoading: false,
|
|
555
|
+
isWriting: false
|
|
556
|
+
});
|
|
557
|
+
store().setActivity(sessionId, null);
|
|
558
|
+
store().setStatus(sessionId, 'cancelled');
|
|
559
|
+
callbacks === null || callbacks === void 0 || (_callbacks$onStop = callbacks.onStop) === null || _callbacks$onStop === void 0 || _callbacks$onStop.call(callbacks);
|
|
560
|
+
},
|
|
561
|
+
/** Aborta sin marcar "cancelado" (uso interno / limpieza). */abortSilently: function abortSilently(sessionId) {
|
|
562
|
+
var _store$getMeta;
|
|
563
|
+
var active = activeStreams.get(sessionId);
|
|
564
|
+
if (!active) return;
|
|
565
|
+
active.isStopped = true;
|
|
566
|
+
active.controller.abort();
|
|
567
|
+
activeStreams["delete"](sessionId);
|
|
568
|
+
sessionStreamingText.clear(sessionId);
|
|
569
|
+
store().patchMeta(sessionId, {
|
|
570
|
+
isLoading: false,
|
|
571
|
+
isWriting: false
|
|
572
|
+
});
|
|
573
|
+
store().setActivity(sessionId, null);
|
|
574
|
+
if (((_store$getMeta = store().getMeta(sessionId)) === null || _store$getMeta === void 0 ? void 0 : _store$getMeta.status) !== 'complete') {
|
|
575
|
+
store().setStatus(sessionId, 'idle');
|
|
576
|
+
}
|
|
577
|
+
},
|
|
578
|
+
abortAll: function abortAll() {
|
|
579
|
+
var _this = this;
|
|
580
|
+
Array.from(activeStreams.keys()).forEach(function (sessionId) {
|
|
581
|
+
return _this.abortSilently(sessionId);
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
};
|
|
585
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYWlhIiwiZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5IiwiZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSIsImdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSIsInJlc29sdmVIaXRsTm9kZVN0cmVhbUFjdGl2aXR5IiwicmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkiLCJpc0NvbXBsZXRlTGlrZVNzZVBheWxvYWQiLCJtZXJnZVN0cmVhbUNodW5rIiwic2Vzc2lvblN0cmVhbWluZ1RleHQiLCJ1c2VTZXNzaW9uc1N0b3JlIiwiZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCIsImVuc3VyZVNlc3Npb25JblNpZGViYXJGcm9tUmVxdWVzdCIsInNlc3Npb25IaXRsQ29udGV4dCIsIk1BWF9DT05DVVJSRU5UX1NUUkVBTVMiLCJTVFJFQU1fVEhST1RUTEVfTVMiLCJhY3RpdmVTdHJlYW1zIiwiTWFwIiwic3RvcmUiLCJnZXRTdGF0ZSIsImlzU3RyZWFtQWN0aXZlIiwic2Vzc2lvbklkIiwiaGFzIiwiZ2V0QWN0aXZlU3RyZWFtQ291bnQiLCJzaXplIiwicGFyc2VTZXNzaW9uU1NFIiwiX3JlZiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwicmVzcG9uc2UiLCJhY3RpdmUiLCJwYXJhbXMiLCJfcGFyYW1zJGhpdGxFeGVjdXRpb24iLCJfcmVzcG9uc2UkYm9keSIsIl9kYXRhJGVycm9yIiwiX2RhdGEkZXJyb3IyIiwiX2NhbGxiYWNrcyRvbkVycm9yIiwiX2RhdGEkZXJyb3IzIiwiX2RhdGEkZXJyb3I0IiwicGxhY2Vob2xkZXJJZCIsImNhbGxiYWNrcyIsInQiLCJoaXRsRXhlY3V0aW9uQ29udGV4dCIsInBlbmRpbmdDb250ZW50IiwidGhyb3R0bGVUaW1lciIsImZsdXNoVG9TdG9yZXMiLCJlbWl0VGhyb3R0bGVkIiwiZmx1c2hQZW5kaW5nIiwicmVhZGVyIiwiZGVjb2RlciIsImJ1ZmZlciIsImFjY3VtdWxhdGVkQ29udGVudCIsImhhc1N0YXJ0ZWRXcml0aW5nIiwiaGFzQWRkZWRUb1NpZGViYXIiLCJtYXliZUFkZFNlc3Npb25Ub1NpZGViYXIiLCJlbnN1cmVXcml0aW5nU3RhcnRlZCIsImFwcGx5U3RyZWFtQ2h1bmsiLCJhcHBseVN0cmVhbUNvbXBsZXRlIiwiX3lpZWxkJHJlYWRlciRyZWFkIiwiZG9uZSIsInZhbHVlIiwibGluZXMiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImxpbmUiLCJfbGluZSRzcGxpdCIsIl9saW5lJHNwbGl0MiIsImV2ZW50TGluZSIsImRhdGFMaW5lIiwiZXZlbnRUeXBlIiwiZGF0YVN0ciIsImRhdGEiLCJjaHVuayIsIl9jaHVuayIsIl9jYWxsYmFja3Mkb25BcHByb3ZhbCIsImlzTWFudWFsQXBwcm92YWwiLCJfdCIsIl90MiIsIl90MyIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiZ2V0IiwiY29udGVudCIsIl9jYWxsYmFja3Mkb25TdHJlYW1VcCIsInNldFRleHQiLCJvblN0cmVhbVVwZGF0ZSIsImNhbGwiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0IiwidG9FbWl0IiwiY2xlYXJUaW1lb3V0IiwiYm9keSIsImdldFJlYWRlciIsIkVycm9yIiwiVGV4dERlY29kZXIiLCJzaWRlYmFyT25GaXJzdFRva2VuIiwicmVxdWVzdCIsImFnZW50RW1vamkiLCJfY2FsbGJhY2tzJG9uU3RhcnRXcmkiLCJwYXRjaE1ldGEiLCJpc0xvYWRpbmciLCJpc1dyaXRpbmciLCJzZXRTdGF0dXMiLCJzZXRBY3Rpdml0eSIsIm9uU3RhcnRXcml0aW5nIiwicGF5bG9hZCIsIl9wYXlsb2FkJGFnZW50X2lkIiwiX3N1YmFnZW50UmF3JHJlc29sdmVkIiwiX2NhbGxiYWNrcyRvbkZpbmlzaFN0IiwiZmluYWxDb250ZW50Iiwic291cmNlcyIsIm1lbW9yeVNlc3Npb25JZCIsIm1lbW9yeV9zZXNzaW9uX2lkIiwiYXR0YWNobWVudHMiLCJBcnJheSIsImlzQXJyYXkiLCJzdWdnZXN0aW9ucyIsInN1Z2dlc3RfcmVwbHkiLCJhZ2VudElkUmF3IiwiYWdlbnRfaWQiLCJhZ2VudElkIiwiY29tcGxldGVkQWdlbnRJZCIsIlN0cmluZyIsInRyaW0iLCJzdWJhZ2VudFJhdyIsInN1YmFnZW50IiwicmVzb2x2ZWRDb250ZXh0IiwicmVzb2x2ZWRfY29udGV4dCIsImNsZWFyIiwiZmluaXNoUGF5bG9hZCIsIm9uRmluaXNoU3RyZWFtIiwiaXNTdG9wcGVkIiwiY2FuY2VsIiwiYWJydXB0IiwicmVhZCIsInNlbnQiLCJkZWNvZGUiLCJzdHJlYW0iLCJzcGxpdCIsInBvcCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwicyIsIm4iLCJfc2xpY2VkVG9BcnJheSIsInJlcGxhY2UiLCJKU09OIiwicGFyc2UiLCJwaGFzZSIsIm1lc3NhZ2UiLCJub2RlIiwidW5kZWZpbmVkIiwidGhyZWFkX2lkIiwibWFudWFsX2FwcHJvdmFsX2RldGVjdGVkIiwib25BcHByb3ZhbFJlcXVpcmVkIiwicGVuZGluZ19hY3Rpb25zIiwibGVuZ3RoIiwiY29uc29sZSIsImVycm9yIiwic2V0RXJyb3IiLCJ0eXBlIiwib25FcnJvciIsIndhcm4iLCJlIiwiZiIsImZpbmlzaCIsInN0b3AiLCJfeCIsIl94MiIsIl94MyIsImFwcGx5IiwiYXJndW1lbnRzIiwic2Vzc2lvblN0cmVhbU1hbmFnZXIiLCJpc0FjdGl2ZSIsImdldEFjdGl2ZUNvdW50IiwiZ2V0QWN0aXZlU2Vzc2lvbklkcyIsImZyb20iLCJrZXlzIiwic3RhcnRTdHJlYW0iLCJfY2FsbGVlMiIsImFjdGl2aXR5T3B0aW9ucyIsImFnZW50TmFtZSIsImNvbnRyb2xsZXIiLCJfY2FsbGJhY2tzJG9uRXJyb3IyIiwiX3Q0IiwiX2NvbnRleHQyIiwic3RhcnRlZCIsInJlYXNvbiIsIkFib3J0Q29udHJvbGxlciIsInNldCIsImVuc3VyZVNlc3Npb24iLCJfb2JqZWN0U3ByZWFkIiwic3RhcnQiLCJPcmNoZXN0cmF0b3IiLCJvcmNoZXN0cmF0b3IiLCJzaWduYWwiLCJzdGFydENvbnRpbnVlU3RyZWFtIiwiX2NhbGxlZTMiLCJfcmVmMiIsImNvbnRpbnVlUmVxdWVzdCIsInNzZVBhcmFtcyIsIl9jYWxsYmFja3Mkb25FcnJvcjMiLCJfdDUiLCJfY29udGV4dDMiLCJjb250aW51ZVRocmVhZCIsIm9rIiwiY29uY2F0Iiwic3RhdHVzIiwic3RvcFN0cmVhbSIsIl9jYWxsYmFja3Mkb25TdG9wIiwiYWJvcnQiLCJvblN0b3AiLCJhYm9ydFNpbGVudGx5IiwiX3N0b3JlJGdldE1ldGEiLCJnZXRNZXRhIiwiYWJvcnRBbGwiLCJfdGhpcyIsImZvckVhY2giXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvblN0cmVhbU1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29udGludWUgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWF3YWl0LWluLWxvb3AgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtc3ludGF4ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zdGFudC1jb25kaXRpb24gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCBtYWlhIGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEnXG5pbXBvcnQgdHlwZSB7IEFwcHJvdmFsUmVxdWVzdCB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQge1xuICBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHksXG4gIGdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UsXG4gIGdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSxcbiAgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHksXG4gIHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5LFxufSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHR5cGUgeyBIaXRsRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4uLy4uL3V0aWxzL3N0cmVhbUFjdGl2aXR5TWVzc2FnZXMnXG5pbXBvcnQgeyBpc0NvbXBsZXRlTGlrZVNzZVBheWxvYWQsIG1lcmdlU3RyZWFtQ2h1bmsgfSBmcm9tICcuLi8uLi91dGlscy9zc2VTdHJlYW1Db250ZW50J1xuaW1wb3J0IHsgc2Vzc2lvblN0cmVhbWluZ1RleHQgfSBmcm9tICcuL3Nlc3Npb25TdHJlYW1pbmdUZXh0J1xuaW1wb3J0IHsgdXNlU2Vzc2lvbnNTdG9yZSB9IGZyb20gJy4vdXNlU2Vzc2lvbnNTdG9yZSdcbmltcG9ydCB7IGVuc3VyZVNlc3Npb25Ob3RpZmljYXRpb25zSW5pdGlhbGl6ZWQgfSBmcm9tICcuL3Nlc3Npb25Ob3RpZmljYXRpb25zJ1xuaW1wb3J0IHsgZW5zdXJlU2Vzc2lvbkluU2lkZWJhckZyb21SZXF1ZXN0IH0gZnJvbSAnLi4vY2hhdHNTaWRlYmFyT3B0aW1pc3RpYydcbmltcG9ydCB7IHNlc3Npb25IaXRsQ29udGV4dCB9IGZyb20gJy4vc2Vzc2lvbkhpdGxDb250ZXh0J1xuaW1wb3J0IHR5cGUgeyBTZXNzaW9uRmluaXNoUGF5bG9hZCwgU2Vzc2lvblN0cmVhbUNhbGxiYWNrcywgU3RhcnRTdHJlYW1SZXN1bHQgfSBmcm9tICcuL3Nlc3Npb25zLnR5cGVzJ1xuXG50eXBlIE9yY2hlc3RyYXRvclJlcXVlc3QgPSBQYXJhbWV0ZXJzPHR5cGVvZiBtYWlhLk9yY2hlc3RyYXRvci5vcmNoZXN0cmF0b3I+WzBdXG50eXBlIENvbnRpbnVlVGhyZWFkUmVxdWVzdCA9IFBhcmFtZXRlcnM8dHlwZW9mIG1haWEuT3JjaGVzdHJhdG9yLmNvbnRpbnVlVGhyZWFkPlswXVxuXG4vKiogQ29tcGF0aWJsZSBjb24gZWwgYHRgIGRlIGkxOG5leHQgKHVzbyBkZSB1bmEgc29sYSBrZXkpLiAqL1xudHlwZSBUcmFuc2xhdGVGbiA9IChrZXk6IHN0cmluZykgPT4gc3RyaW5nXG5cbnR5cGUgU3RhcnRTdHJlYW1QYXJhbXMgPSB7XG4gIHNlc3Npb25JZDogc3RyaW5nXG4gIHBsYWNlaG9sZGVySWQ6IHN0cmluZ1xuICByZXF1ZXN0OiBPcmNoZXN0cmF0b3JSZXF1ZXN0XG4gIGNhbGxiYWNrczogU2Vzc2lvblN0cmVhbUNhbGxiYWNrc1xuICB0OiBUcmFuc2xhdGVGblxuICBhY3Rpdml0eU9wdGlvbnM/OiB7XG4gICAgaXNXZWJTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICAgIGhhc0F0dGFjaG1lbnRzPzogYm9vbGVhblxuICAgIGF0dGFjaG1lbnRzQ291bnQ/OiBudW1iZXJcbiAgfVxuICBoaXRsRXhlY3V0aW9uQ29udGV4dD86IEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbFxuICBhZ2VudElkPzogc3RyaW5nIHwgbnVtYmVyXG4gIGFnZW50TmFtZT86IHN0cmluZ1xuICAvKiogU2kgZmFsc2UsIG5vIGFncmVnYSBsYSBzZXNpw7NuIGFsIHNpZGViYXIgYWwgcHJpbWVyIHRva2VuIChwLiBlai4gY29udGludWUtdGhyZWFkKS4gKi9cbiAgc2lkZWJhck9uRmlyc3RUb2tlbj86IGJvb2xlYW5cbiAgYWdlbnRFbW9qaT86IHN0cmluZyB8IG51bGxcbn1cblxudHlwZSBTdGFydENvbnRpbnVlU3RyZWFtUGFyYW1zID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZ1xuICBwbGFjZWhvbGRlcklkOiBzdHJpbmdcbiAgY29udGludWVSZXF1ZXN0OiBDb250aW51ZVRocmVhZFJlcXVlc3RcbiAgY2FsbGJhY2tzOiBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzXG4gIHQ6IFRyYW5zbGF0ZUZuXG4gIGhpdGxFeGVjdXRpb25Db250ZXh0PzogSGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsXG4gIGFnZW50SWQ/OiBzdHJpbmcgfCBudW1iZXJcbiAgYWdlbnROYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgQWN0aXZlU3RyZWFtID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZ1xuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXJcbiAgaXNTdG9wcGVkOiBib29sZWFuXG59XG5cbi8qKlxuICogTcOheGltbyBkZSBzZXNpb25lcyBnZW5lcmFuZG8gZW4gcGFyYWxlbG8uIFByb3RlZ2UgcmVkL3JlY3Vyc29zIGRlbCBjbGllbnRlLlxuICogQWp1c3RhYmxlIGEgZnV0dXJvIHbDrWEgZmxhZyBkZWwgaG9zdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9DT05DVVJSRU5UX1NUUkVBTVMgPSA0XG5cbmNvbnN0IFNUUkVBTV9USFJPVFRMRV9NUyA9IDE2XG5cbmNvbnN0IGFjdGl2ZVN0cmVhbXMgPSBuZXcgTWFwPHN0cmluZywgQWN0aXZlU3RyZWFtPigpXG5cbmNvbnN0IHN0b3JlID0gKCkgPT4gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpXG5cbmNvbnN0IGlzU3RyZWFtQWN0aXZlID0gKHNlc3Npb25JZDogc3RyaW5nKTogYm9vbGVhbiA9PiBhY3RpdmVTdHJlYW1zLmhhcyhzZXNzaW9uSWQpXG5cbmNvbnN0IGdldEFjdGl2ZVN0cmVhbUNvdW50ID0gKCk6IG51bWJlciA9PiBhY3RpdmVTdHJlYW1zLnNpemVcblxuY29uc3QgcGFyc2VTZXNzaW9uU1NFID0gYXN5bmMgKHJlc3BvbnNlOiBSZXNwb25zZSwgYWN0aXZlOiBBY3RpdmVTdHJlYW0sIHBhcmFtczogU3RhcnRTdHJlYW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIGNhbGxiYWNrcywgdCB9ID0gcGFyYW1zXG4gIGNvbnN0IGhpdGxFeGVjdXRpb25Db250ZXh0ID0gcGFyYW1zLmhpdGxFeGVjdXRpb25Db250ZXh0ID8/IHNlc3Npb25IaXRsQ29udGV4dC5nZXQoc2Vzc2lvbklkKVxuXG4gIGxldCBwZW5kaW5nQ29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IHRocm90dGxlVGltZXI6IG51bWJlciB8IG51bGwgPSBudWxsXG5cbiAgY29uc3QgZmx1c2hUb1N0b3JlcyA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zZXRUZXh0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGVudClcbiAgICBjYWxsYmFja3Mub25TdHJlYW1VcGRhdGU/Lihjb250ZW50KVxuICB9XG5cbiAgY29uc3QgZW1pdFRocm90dGxlZCA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBwZW5kaW5nQ29udGVudCA9IGNvbnRlbnRcbiAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSByZXR1cm5cbiAgICB0aHJvdHRsZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICAgIGlmIChwZW5kaW5nQ29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICAgIHBlbmRpbmdDb250ZW50ID0gbnVsbFxuICAgICAgICBmbHVzaFRvU3RvcmVzKHRvRW1pdClcbiAgICAgIH1cbiAgICB9LCBTVFJFQU1fVEhST1RUTEVfTVMpXG4gIH1cblxuICBjb25zdCBmbHVzaFBlbmRpbmcgPSAoKSA9PiB7XG4gICAgaWYgKHRocm90dGxlVGltZXIgIT0gbnVsbCkge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aHJvdHRsZVRpbWVyKVxuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICB9XG4gICAgaWYgKHBlbmRpbmdDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICBwZW5kaW5nQ29udGVudCA9IG51bGxcbiAgICAgIGZsdXNoVG9TdG9yZXModG9FbWl0KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpXG4gIGlmICghcmVhZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWFkZXIgYXZhaWxhYmxlJylcbiAgfVxuXG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKVxuICBsZXQgYnVmZmVyID0gJydcbiAgbGV0IGFjY3VtdWxhdGVkQ29udGVudCA9ICcnXG4gIGxldCBoYXNTdGFydGVkV3JpdGluZyA9IGZhbHNlXG4gIGxldCBoYXNBZGRlZFRvU2lkZWJhciA9IGZhbHNlXG5cbiAgY29uc3QgbWF5YmVBZGRTZXNzaW9uVG9TaWRlYmFyID0gKCkgPT4ge1xuICAgIGlmIChoYXNBZGRlZFRvU2lkZWJhciB8fCBwYXJhbXMuc2lkZWJhck9uRmlyc3RUb2tlbiA9PT0gZmFsc2UpIHJldHVyblxuICAgIGhhc0FkZGVkVG9TaWRlYmFyID0gdHJ1ZVxuICAgIGVuc3VyZVNlc3Npb25JblNpZGViYXJGcm9tUmVxdWVzdChzZXNzaW9uSWQsIHBhcmFtcy5yZXF1ZXN0LCBwYXJhbXMuYWdlbnRFbW9qaSlcbiAgfVxuXG4gIGNvbnN0IGVuc3VyZVdyaXRpbmdTdGFydGVkID0gKCkgPT4ge1xuICAgIGlmIChoYXNTdGFydGVkV3JpdGluZykgcmV0dXJuXG4gICAgaGFzU3RhcnRlZFdyaXRpbmcgPSB0cnVlXG4gICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSwgaXNXcml0aW5nOiB0cnVlIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnd3JpdGluZycpXG4gICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIGdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSh0KSlcbiAgICBjYWxsYmFja3Mub25TdGFydFdyaXRpbmc/LigpXG4gIH1cblxuICBjb25zdCBhcHBseVN0cmVhbUNodW5rID0gKGNodW5rOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWNodW5rKSByZXR1cm5cbiAgICBhY2N1bXVsYXRlZENvbnRlbnQgPSBtZXJnZVN0cmVhbUNodW5rKGFjY3VtdWxhdGVkQ29udGVudCwgY2h1bmspXG4gICAgZW1pdFRocm90dGxlZChhY2N1bXVsYXRlZENvbnRlbnQpXG4gIH1cblxuICBjb25zdCBhcHBseVN0cmVhbUNvbXBsZXRlID0gKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgY29uc3QgZmluYWxDb250ZW50ID0gKHBheWxvYWQuY29udGVudCBhcyBzdHJpbmcpIHx8IGFjY3VtdWxhdGVkQ29udGVudFxuICAgIGNvbnN0IHNvdXJjZXMgPSBwYXlsb2FkLnNvdXJjZXMgfHwgbnVsbFxuICAgIGNvbnN0IG1lbW9yeVNlc3Npb25JZCA9IChwYXlsb2FkLm1lbW9yeV9zZXNzaW9uX2lkIGFzIHN0cmluZykgfHwgJydcbiAgICBjb25zdCBhdHRhY2htZW50cyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5hdHRhY2htZW50cykgPyBwYXlsb2FkLmF0dGFjaG1lbnRzIDogbnVsbFxuICAgIGxldCBzdWdnZXN0aW9uczogc3RyaW5nW10gfCBudWxsID0gbnVsbFxuICAgIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuc3VnZ2VzdF9yZXBseSkpIHtcbiAgICAgIHN1Z2dlc3Rpb25zID0gcGF5bG9hZC5zdWdnZXN0X3JlcGx5IGFzIHN0cmluZ1tdXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuc3VnZ2VzdGlvbnMpKSB7XG4gICAgICBzdWdnZXN0aW9ucyA9IHBheWxvYWQuc3VnZ2VzdGlvbnMgYXMgc3RyaW5nW11cbiAgICB9XG4gICAgY29uc3QgYWdlbnRJZFJhdyA9IHBheWxvYWQuYWdlbnRfaWQgPz8gcGF5bG9hZC5hZ2VudElkXG4gICAgY29uc3QgY29tcGxldGVkQWdlbnRJZCA9IGFnZW50SWRSYXcgIT0gbnVsbCAmJiBTdHJpbmcoYWdlbnRJZFJhdykudHJpbSgpICE9PSAnJyA/IFN0cmluZyhhZ2VudElkUmF3KS50cmltKCkgOiBudWxsXG4gICAgY29uc3Qgc3ViYWdlbnRSYXcgPSBwYXlsb2FkLnN1YmFnZW50IGFzIHsgcmVzb2x2ZWRfY29udGV4dD86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWRcbiAgICBjb25zdCByZXNvbHZlZENvbnRleHQgPSBzdWJhZ2VudFJhdz8ucmVzb2x2ZWRfY29udGV4dCA/PyBudWxsXG5cbiAgICBmbHVzaFBlbmRpbmcoKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2NvbXBsZXRlJylcblxuICAgIGNvbnN0IGZpbmlzaFBheWxvYWQ6IFNlc3Npb25GaW5pc2hQYXlsb2FkID0ge1xuICAgICAgY29udGVudDogZmluYWxDb250ZW50LFxuICAgICAgc291cmNlcyxcbiAgICAgIG1lbW9yeVNlc3Npb25JZCxcbiAgICAgIGF0dGFjaG1lbnRzLFxuICAgICAgc3VnZ2VzdGlvbnMsXG4gICAgICBjb21wbGV0ZWRBZ2VudElkLFxuICAgICAgcmVzb2x2ZWRDb250ZXh0LFxuICAgIH1cbiAgICBjYWxsYmFja3Mub25GaW5pc2hTdHJlYW0/LihmaW5pc2hQYXlsb2FkKVxuICB9XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKGFjdGl2ZS5pc1N0b3BwZWQpIHtcbiAgICAgICAgcmVhZGVyLmNhbmNlbCgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKClcbiAgICAgIGlmIChkb25lKSBicmVha1xuXG4gICAgICBpZiAoYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICByZWFkZXIuY2FuY2VsKClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgYnVmZmVyICs9IGRlY29kZXIuZGVjb2RlKHZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KVxuICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoJ1xcblxcbicpXG4gICAgICBidWZmZXIgPSBsaW5lcy5wb3AoKSB8fCAnJ1xuXG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKGxpbmUudHJpbSgpID09PSAnJykgY29udGludWVcblxuICAgICAgICBjb25zdCBbZXZlbnRMaW5lLCBkYXRhTGluZV0gPSBsaW5lLnNwbGl0KCdcXG4nKVxuICAgICAgICBpZiAoIWV2ZW50TGluZSB8fCAhZGF0YUxpbmUpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gZXZlbnRMaW5lLnJlcGxhY2UoJ2V2ZW50OiAnLCAnJykudHJpbSgpXG4gICAgICAgIGNvbnN0IGRhdGFTdHIgPSBkYXRhTGluZS5yZXBsYWNlKCdkYXRhOiAnLCAnJykudHJpbSgpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShkYXRhU3RyKVxuXG4gICAgICAgICAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3RoaW5raW5nJzpcbiAgICAgICAgICAgICAgaWYgKCFoYXNTdGFydGVkV3JpdGluZykge1xuICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIHsgcGhhc2U6ICd0aGlua2luZycsIG1lc3NhZ2U6IGdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UoMCwgdCkgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICd0b2tlbic6IHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0eXBlb2YgZGF0YS5jb250ZW50ID09PSAnc3RyaW5nJyA/IGRhdGEuY29udGVudCA6ICcnXG4gICAgICAgICAgICAgIG1heWJlQWRkU2Vzc2lvblRvU2lkZWJhcigpXG4gICAgICAgICAgICAgIGVuc3VyZVdyaXRpbmdTdGFydGVkKClcbiAgICAgICAgICAgICAgYXBwbHlTdHJlYW1DaHVuayhjaHVuaylcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAnY29udGVudCc6IHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0eXBlb2YgZGF0YS5jb250ZW50ID09PSAnc3RyaW5nJyA/IGRhdGEuY29udGVudCA6ICcnXG4gICAgICAgICAgICAgIGVuc3VyZVdyaXRpbmdTdGFydGVkKClcbiAgICAgICAgICAgICAgYXBwbHlTdHJlYW1DaHVuayhjaHVuaylcbiAgICAgICAgICAgICAgaWYgKGlzQ29tcGxldGVMaWtlU3NlUGF5bG9hZChkYXRhKSkge1xuICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ29tcGxldGUoZGF0YSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdub2RlJzpcbiAgICAgICAgICAgICAgaWYgKGRhdGEubm9kZSA9PT0gJ2FnZW50X3RyYW5zZmVyJykge1xuICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5tZXNzYWdlICYmIHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KFxuICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkoXG4gICAgICAgICAgICAgICAgICAgIGRhdGEubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgdCxcbiAgICAgICAgICAgICAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZGF0YS50aHJlYWRfaWQgPT09ICdzdHJpbmcnID8gZGF0YS50aHJlYWRfaWQgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSAnY29tcGxldGUnOlxuICAgICAgICAgICAgICBhcHBseVN0cmVhbUNvbXBsZXRlKGRhdGEpXG4gICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIGNhc2UgJ2FwcHJvdmFsX3JlcXVpcmVkJzoge1xuICAgICAgICAgICAgICBmbHVzaFBlbmRpbmcoKVxuICAgICAgICAgICAgICBjb25zdCBpc01hbnVhbEFwcHJvdmFsID0gZGF0YS5tYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQgPT09IHRydWVcbiAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzV3JpdGluZzogZmFsc2UgfSlcbiAgICAgICAgICAgICAgaWYgKCFpc01hbnVhbEFwcHJvdmFsKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UgfSlcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnYXdhaXRpbmdfYXBwcm92YWwnKVxuICAgICAgICAgICAgICBjYWxsYmFja3Mub25BcHByb3ZhbFJlcXVpcmVkPy4oZGF0YSBhcyBBcHByb3ZhbFJlcXVlc3QsIGFjY3VtdWxhdGVkQ29udGVudClcbiAgICAgICAgICAgICAgaWYgKGlzTWFudWFsQXBwcm92YWwgJiYgQXJyYXkuaXNBcnJheShkYXRhLnBlbmRpbmdfYWN0aW9ucykgJiYgZGF0YS5wZW5kaW5nX2FjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5KHQsIGhpdGxFeGVjdXRpb25Db250ZXh0ID8/IHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTU0UgRXJyb3I6JywgZGF0YS5lcnJvcilcbiAgICAgICAgICAgICAgZmx1c2hQZW5kaW5nKClcbiAgICAgICAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgICAgICAgc3RvcmUoKS5zZXRFcnJvcihzZXNzaW9uSWQsIHsgdHlwZTogZGF0YS5lcnJvcj8udHlwZSwgbWVzc2FnZTogZGF0YS5lcnJvcj8ubWVzc2FnZSB9KVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oZGF0YS5lcnJvcj8udHlwZSwgZGF0YS5lcnJvcj8ubWVzc2FnZSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbmtub3duIFNTRSBldmVudCB0eXBlOicsIGV2ZW50VHlwZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIFNTRSBkYXRhOicsIHBhcnNlRXJyb3IsIGRhdGFTdHIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgZmx1c2hQZW5kaW5nKClcbiAgfVxufVxuXG4vKipcbiAqIE1hbmFnZXIgc2luZ2xldG9uIChtb2R1bGUtbGV2ZWwpIHF1ZSBjb3JyZSBOIHN0cmVhbXMgZGVsIG9yY2hlc3RyYXRvciBlblxuICogcGFyYWxlbG8sIHVubyBwb3IgYHNlc3Npb25JZGAuIFNvYnJldml2ZSBhIGNhbWJpb3MgZGUgdmlzdGEgeSBhbCBjaWVycmUgZGVsXG4gKiBtb2RhbDogbG9zIHN0cmVhbXMgc29sbyBzZSBjYW5jZWxhbiBjb24gc3RvcCBleHBsw61jaXRvIGRlbCB1c3VhcmlvIG8gYWxcbiAqIGNvbXBsZXRhci9lcnJvcmFyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vzc2lvblN0cmVhbU1hbmFnZXIgPSB7XG4gIGlzQWN0aXZlOiBpc1N0cmVhbUFjdGl2ZSxcbiAgZ2V0QWN0aXZlQ291bnQ6IGdldEFjdGl2ZVN0cmVhbUNvdW50LFxuICBnZXRBY3RpdmVTZXNzaW9uSWRzOiAoKTogc3RyaW5nW10gPT4gQXJyYXkuZnJvbShhY3RpdmVTdHJlYW1zLmtleXMoKSksXG5cbiAgYXN5bmMgc3RhcnRTdHJlYW0ocGFyYW1zOiBTdGFydFN0cmVhbVBhcmFtcyk6IFByb21pc2U8U3RhcnRTdHJlYW1SZXN1bHQ+IHtcbiAgICBlbnN1cmVTZXNzaW9uTm90aWZpY2F0aW9uc0luaXRpYWxpemVkKClcblxuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCByZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGFjdGl2aXR5T3B0aW9ucywgYWdlbnRJZCwgYWdlbnROYW1lIH0gPSBwYXJhbXNcblxuICAgIGlmIChpc1N0cmVhbUFjdGl2ZShzZXNzaW9uSWQpKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnYWxyZWFkeV9hY3RpdmUnIH1cbiAgICB9XG4gICAgaWYgKGdldEFjdGl2ZVN0cmVhbUNvdW50KCkgPj0gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykge1xuICAgICAgcmV0dXJuIHsgc3RhcnRlZDogZmFsc2UsIHJlYXNvbjogJ2xpbWl0JyB9XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IGFjdGl2ZTogQWN0aXZlU3RyZWFtID0geyBzZXNzaW9uSWQsIGNvbnRyb2xsZXIsIGlzU3RvcHBlZDogZmFsc2UgfVxuICAgIGFjdGl2ZVN0cmVhbXMuc2V0KHNlc3Npb25JZCwgYWN0aXZlKVxuXG4gICAgc3RvcmUoKS5lbnN1cmVTZXNzaW9uKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHtcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAuLi4oYWdlbnRJZCAhPSBudWxsID8geyBhZ2VudElkIH0gOiB7fSksXG4gICAgICAuLi4oYWdlbnROYW1lICE9IG51bGwgPyB7IGFnZW50TmFtZSB9IDoge30pLFxuICAgIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5KHQsIGFjdGl2aXR5T3B0aW9ucyA/PyB7fSkpXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5vcmNoZXN0cmF0b3IocmVxdWVzdCwgY29udHJvbGxlci5zaWduYWwpXG4gICAgICBhd2FpdCBwYXJzZVNlc3Npb25TU0UocmVzcG9uc2UsIGFjdGl2ZSwgcGFyYW1zKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWFjdGl2ZS5pc1N0b3BwZWQpIHtcbiAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnZXJyb3InKVxuICAgICAgICBjYWxsYmFja3Mub25FcnJvcj8uKClcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgIH1cblxuICAgIHJldHVybiB7IHN0YXJ0ZWQ6IHRydWUgfVxuICB9LFxuXG4gIC8qKiBSZXN1bWUgSElUTCAoYGNvbnRpbnVlLXRocmVhZGApIGtleWVkIHBvciBzZXNzaW9uSWQg4oCUIG1pc21vIG1vdG9yIHF1ZSBvcmNoZXN0cmF0b3IuICovXG4gIGFzeW5jIHN0YXJ0Q29udGludWVTdHJlYW0ocGFyYW1zOiBTdGFydENvbnRpbnVlU3RyZWFtUGFyYW1zKTogUHJvbWlzZTxTdGFydFN0cmVhbVJlc3VsdD4ge1xuICAgIGVuc3VyZVNlc3Npb25Ob3RpZmljYXRpb25zSW5pdGlhbGl6ZWQoKVxuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIGNvbnRpbnVlUmVxdWVzdCwgY2FsbGJhY2tzLCB0LCBoaXRsRXhlY3V0aW9uQ29udGV4dCwgYWdlbnRJZCwgYWdlbnROYW1lIH0gPSBwYXJhbXNcblxuICAgIGlmIChpc1N0cmVhbUFjdGl2ZShzZXNzaW9uSWQpKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnYWxyZWFkeV9hY3RpdmUnIH1cbiAgICB9XG4gICAgaWYgKGdldEFjdGl2ZVN0cmVhbUNvdW50KCkgPj0gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykge1xuICAgICAgcmV0dXJuIHsgc3RhcnRlZDogZmFsc2UsIHJlYXNvbjogJ2xpbWl0JyB9XG4gICAgfVxuXG4gICAgaWYgKGhpdGxFeGVjdXRpb25Db250ZXh0KSB7XG4gICAgICBzZXNzaW9uSGl0bENvbnRleHQuc2V0KHNlc3Npb25JZCwgaGl0bEV4ZWN1dGlvbkNvbnRleHQpXG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IGFjdGl2ZTogQWN0aXZlU3RyZWFtID0geyBzZXNzaW9uSWQsIGNvbnRyb2xsZXIsIGlzU3RvcHBlZDogZmFsc2UgfVxuICAgIGFjdGl2ZVN0cmVhbXMuc2V0KHNlc3Npb25JZCwgYWN0aXZlKVxuXG4gICAgc3RvcmUoKS5lbnN1cmVTZXNzaW9uKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHtcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAuLi4oYWdlbnRJZCAhPSBudWxsID8geyBhZ2VudElkIH0gOiB7fSksXG4gICAgICAuLi4oYWdlbnROYW1lICE9IG51bGwgPyB7IGFnZW50TmFtZSB9IDoge30pLFxuICAgIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KFxuICAgICAgc2Vzc2lvbklkLFxuICAgICAgcmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkodCwgaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gc2Vzc2lvbkhpdGxDb250ZXh0LmdldChzZXNzaW9uSWQpID8/IHVuZGVmaW5lZClcbiAgICApXG5cbiAgICBjb25zdCBzc2VQYXJhbXM6IFN0YXJ0U3RyZWFtUGFyYW1zID0ge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIHJlcXVlc3Q6IHt9IGFzIE9yY2hlc3RyYXRvclJlcXVlc3QsXG4gICAgICBjYWxsYmFja3MsXG4gICAgICB0LFxuICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHQ6IGhpdGxFeGVjdXRpb25Db250ZXh0ID8/IHNlc3Npb25IaXRsQ29udGV4dC5nZXQoc2Vzc2lvbklkKSxcbiAgICAgIGFnZW50SWQsXG4gICAgICBhZ2VudE5hbWUsXG4gICAgICBzaWRlYmFyT25GaXJzdFRva2VuOiBmYWxzZSxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5jb250aW51ZVRocmVhZChjb250aW51ZVJlcXVlc3QsIGNvbnRyb2xsZXIuc2lnbmFsKVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbnRpbnVlLXRocmVhZCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICB9XG4gICAgICBhd2FpdCBwYXJzZVNlc3Npb25TU0UocmVzcG9uc2UsIGFjdGl2ZSwgc3NlUGFyYW1zKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWFjdGl2ZS5pc1N0b3BwZWQpIHtcbiAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnZXJyb3InKVxuICAgICAgICBjYWxsYmFja3Mub25FcnJvcj8uKClcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgICAgc2Vzc2lvbkhpdGxDb250ZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGFydGVkOiB0cnVlIH1cbiAgfSxcblxuICAvKiogQ2FuY2VsYWNpw7NuIGV4cGzDrWNpdGEgZGVsIHVzdWFyaW8gKG1lbnNhamUgXCJjYW5jZWxhZG9cIikuICovXG4gIHN0b3BTdHJlYW0oc2Vzc2lvbklkOiBzdHJpbmcsIGNhbGxiYWNrcz86IFNlc3Npb25TdHJlYW1DYWxsYmFja3MpIHtcbiAgICBjb25zdCBhY3RpdmUgPSBhY3RpdmVTdHJlYW1zLmdldChzZXNzaW9uSWQpXG4gICAgaWYgKCFhY3RpdmUpIHJldHVyblxuICAgIGFjdGl2ZS5pc1N0b3BwZWQgPSB0cnVlXG4gICAgYWN0aXZlLmNvbnRyb2xsZXIuYWJvcnQoKVxuICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UgfSlcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdjYW5jZWxsZWQnKVxuICAgIGNhbGxiYWNrcz8ub25TdG9wPy4oKVxuICB9LFxuXG4gIC8qKiBBYm9ydGEgc2luIG1hcmNhciBcImNhbmNlbGFkb1wiICh1c28gaW50ZXJubyAvIGxpbXBpZXphKS4gKi9cbiAgYWJvcnRTaWxlbnRseShzZXNzaW9uSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZVN0cmVhbXMuZ2V0KHNlc3Npb25JZClcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuXG4gICAgYWN0aXZlLmlzU3RvcHBlZCA9IHRydWVcbiAgICBhY3RpdmUuY29udHJvbGxlci5hYm9ydCgpXG4gICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgIGlmIChzdG9yZSgpLmdldE1ldGEoc2Vzc2lvbklkKT8uc3RhdHVzICE9PSAnY29tcGxldGUnKSB7XG4gICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdpZGxlJylcbiAgICB9XG4gIH0sXG5cbiAgYWJvcnRBbGwoKSB7XG4gICAgQXJyYXkuZnJvbShhY3RpdmVTdHJlYW1zLmtleXMoKSkuZm9yRWFjaChzZXNzaW9uSWQgPT4gdGhpcy5hYm9ydFNpbGVudGx5KHNlc3Npb25JZCkpXG4gIH0sXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU9BLElBQUksTUFBTSxxQkFBcUI7QUFFdEMsU0FDRUMsd0JBQXdCLEVBQ3hCQyx5QkFBeUIsRUFDekJDLHdCQUF3QixFQUN4QkMsNkJBQTZCLEVBQzdCQyxnQ0FBZ0MsUUFDM0Isb0NBQW9DO0FBRTNDLFNBQVNDLHdCQUF3QixFQUFFQyxnQkFBZ0IsUUFBUSw4QkFBOEI7QUFDekYsU0FBU0Msb0JBQW9CLFFBQVEsd0JBQXdCO0FBQzdELFNBQVNDLGdCQUFnQixRQUFRLG9CQUFvQjtBQUNyRCxTQUFTQyxxQ0FBcUMsUUFBUSx3QkFBd0I7QUFDOUUsU0FBU0MsaUNBQWlDLFFBQVEsMkJBQTJCO0FBQzdFLFNBQVNDLGtCQUFrQixRQUFRLHNCQUFzQjs7QUFNekQ7O0FBd0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxJQUFNQyxzQkFBc0IsR0FBRyxDQUFDO0FBRXZDLElBQU1DLGtCQUFrQixHQUFHLEVBQUU7QUFFN0IsSUFBTUMsYUFBYSxHQUFHLElBQUlDLEdBQUcsQ0FBdUIsQ0FBQztBQUVyRCxJQUFNQyxLQUFLLEdBQUcsU0FBUkEsS0FBS0EsQ0FBQTtFQUFBLE9BQVNSLGdCQUFnQixDQUFDUyxRQUFRLENBQUMsQ0FBQztBQUFBO0FBRS9DLElBQU1DLGNBQWMsR0FBRyxTQUFqQkEsY0FBY0EsQ0FBSUMsU0FBaUI7RUFBQSxPQUFjTCxhQUFhLENBQUNNLEdBQUcsQ0FBQ0QsU0FBUyxDQUFDO0FBQUE7QUFFbkYsSUFBTUUsb0JB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
|