@projectcor/maia-components 2.11.66-8 → 2.11.67-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 (99) hide show
  1. package/lib/components/atoms/Chip/Chip.js +15 -50
  2. package/lib/components/atoms/Chip/styles.js +5 -9
  3. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +9 -5
  4. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +4 -2
  5. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +35 -8
  6. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +37 -28
  7. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +30 -42
  8. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +13 -21
  9. package/lib/components/atoms/MAIAInput/MAIAInput.js +29 -24
  10. package/lib/components/atoms/icons/MAIAIsologo.js +5 -2
  11. package/lib/components/atoms/icons/SkillIcon.js +30 -0
  12. package/lib/components/atoms/icons/SkillsNavIcon.js +27 -0
  13. package/lib/components/atoms/icons/TaskLinkIcon.js +27 -0
  14. package/lib/components/atoms/icons/index.js +3 -1
  15. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +19 -2
  16. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +48 -298
  17. package/lib/components/molecules/ChatAIHome/styles.js +26 -63
  18. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +150 -57
  19. package/lib/components/molecules/ChatAIMessages/newStyles.js +12 -21
  20. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +80 -223
  21. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +4 -27
  22. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +46 -19
  23. package/lib/components/molecules/ChatAIModal/constants.js +6 -2
  24. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +123 -28
  25. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.styles.js +66 -41
  26. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +357 -0
  27. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +145 -0
  28. package/lib/components/molecules/ChatAIMySkills/index.js +2 -0
  29. package/lib/components/molecules/ChatFooter/ChatFooter.js +24 -78
  30. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +7 -22
  31. package/lib/components/molecules/ChatFooter/styles.js +2 -11
  32. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +3 -1
  33. package/lib/components/molecules/Sidebar/Sidebar.js +66 -21
  34. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +40 -26
  35. package/lib/components/molecules/Sidebar/Sidebar.styles.js +10 -7
  36. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +160 -0
  37. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.styles.js +34 -0
  38. package/lib/components/organisms/AbmSkillGenerateModal/index.js +2 -0
  39. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +446 -0
  40. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +98 -0
  41. package/lib/components/organisms/AbmSkillModal/index.js +2 -0
  42. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +8 -1
  43. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +2 -2
  44. package/lib/constants/config.js +4 -1
  45. package/lib/constants/maiaTaskPanelAccess.js +5 -7
  46. package/lib/constants/permissions/index.js +2 -2
  47. package/lib/constants/permissions/utils.js +4 -1
  48. package/lib/constants/taskLinkIcon.js +15 -6
  49. package/lib/constants/taskUrls.js +1 -3
  50. package/lib/context/global-context.js +1 -8
  51. package/lib/hooks/index.js +1 -2
  52. package/lib/hooks/useChatManager/useChatManager.js +125 -149
  53. package/lib/hooks/useChatMessages/useChatMessages.js +5 -34
  54. package/lib/hooks/useContextMentions.js +60 -15
  55. package/lib/hooks/useEntitySearch.js +337 -96
  56. package/lib/hooks/useEvent.js +4 -3
  57. package/lib/hooks/useFrequentlyAskedQuestions.js +10 -12
  58. package/lib/hooks/useFrequentlyUsedActions.js +3 -5
  59. package/lib/hooks/useMentionAllowedTypes.js +41 -16
  60. package/lib/hooks/useMentionPopover.js +54 -49
  61. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
  62. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +18 -27
  63. package/lib/hooks/useProjectSearch.js +28 -4
  64. package/lib/hooks/useProjectSummaryConfig.js +4 -74
  65. package/lib/hooks/useRecentClientsSearch.js +34 -4
  66. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +16 -24
  67. package/lib/lang/br/index.js +60 -32
  68. package/lib/lang/en/index.js +60 -32
  69. package/lib/lang/es/index.js +60 -32
  70. package/lib/lang/fr/index.js +60 -32
  71. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +3 -6
  72. package/lib/services/maia/Agents/getAgents.js +223 -199
  73. package/lib/services/maia/Chats/getChatMessages.js +6 -34
  74. package/lib/services/maia/Chats/getChatsByUserId.js +2 -10
  75. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +4 -6
  76. package/lib/services/maia/Orchestrator/orchestrator.js +5 -21
  77. package/lib/services/maia/Skills/createSkill.js +39 -0
  78. package/lib/services/maia/Skills/deleteSkill.js +38 -0
  79. package/lib/services/maia/Skills/generateSkill.js +41 -0
  80. package/lib/services/maia/Skills/getSkills.js +90 -0
  81. package/lib/services/maia/Skills/updateSkill.js +39 -0
  82. package/lib/services/maia/index.js +2 -4
  83. package/lib/services/utils/validateIsMaia.js +2 -2
  84. package/lib/types/agent.js +1 -1
  85. package/lib/types/contextMention.js +1 -1
  86. package/lib/types/skill.js +2 -0
  87. package/lib/utils/agentDisplayName.js +19 -11
  88. package/lib/utils/contextMentionIcons.js +35 -16
  89. package/lib/utils/contextMentionTriggers.js +53 -0
  90. package/lib/utils/corConnectorMentionTypes.js +37 -0
  91. package/lib/utils/hitlAnalytics.js +6 -5
  92. package/lib/utils/normalizeAgentConnectors.js +32 -0
  93. package/lib/utils/renderContextMentions.js +9 -6
  94. package/package.json +1 -1
  95. package/lib/hooks/useContextPinPopover.js +0 -235
  96. package/lib/hooks/useRecentContexts.js +0 -86
  97. package/lib/services/maia/RecentContexts/getRecentContexts.js +0 -54
  98. package/lib/services/maia/RecentContexts/index.js +0 -6
  99. package/lib/utils/entityLinkRender.js +0 -132
@@ -17,38 +17,17 @@ import { useState, useCallback, useRef } from 'react';
17
17
  import { useTranslation } from 'react-i18next';
18
18
  import { useSnackBarManager } from '../../../hooks/useSnackBarManager/useSnackBarManager';
19
19
  import { fetchMaia } from '../client';
20
+ import { withNormalizedConnectors } from '../../../utils/normalizeAgentConnectors';
20
21
  import { useUser } from '../../../context/cor-user';
21
22
  import { isMaiaCloneAgentsRoleBlocked } from '../../../constants/maiaTaskPanelAccess';
22
23
  import { mapCORLang } from '../../../lang/utils';
23
- var isMaiaAgent = function isMaiaAgent(agent) {
24
- return agent.type === 'orchestrator';
25
- };
26
- var isMarketplaceMaiakerEnabled = function isMarketplaceMaiakerEnabled() {
27
- return !!window.MAIA_MARKETPLACE_MAIAKER;
28
- };
29
- var is403AgentFetchError = function is403AgentFetchError(err) {
30
- var _error$response, _error$message, _error$message2;
31
- var error = err;
32
- return (error === null || error === void 0 || (_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) === 403 || (error === null || error === void 0 ? void 0 : error.status) === 403 || Boolean(error === null || error === void 0 || (_error$message = error.message) === null || _error$message === void 0 ? void 0 : _error$message.includes("You don't have permission to view agents")) || Boolean(error === null || error === void 0 || (_error$message2 = error.message) === null || _error$message2 === void 0 ? void 0 : _error$message2.includes('Failed fetching data'));
33
- };
34
- var mergeAgentsWithoutDuplicates = function mergeAgentsWithoutDuplicates(base, extra) {
35
- var ids = new Set(base.map(function (agent) {
36
- return agent.id;
37
- }));
38
- var merged = _toConsumableArray(base);
39
- extra.forEach(function (agent) {
40
- if (!ids.has(agent.id)) merged.push(agent);
41
- });
42
- return merged;
43
- };
44
-
45
- /**
46
- * Ordena los agentes: MAIA primero (si existe), luego favoritos alfabéticamente, luego no favoritos alfabéticamente
47
- */
48
24
  var sortAgents = function sortAgents(agents) {
49
- var maiaAgents = agents.filter(isMaiaAgent);
25
+ // Separar agentes clone del resto
26
+ var cloneAgents = agents.filter(function (ag) {
27
+ return ag.type === 'clone';
28
+ });
50
29
  var otherAgents = agents.filter(function (ag) {
51
- return !isMaiaAgent(ag);
30
+ return ag.type !== 'clone';
52
31
  });
53
32
 
54
33
  // Separar favoritos y no favoritos
@@ -62,7 +41,14 @@ var sortAgents = function sortAgents(agents) {
62
41
  }).sort(function (a, b) {
63
42
  return a.name.localeCompare(b.name);
64
43
  });
65
- return maiaAgents.length ? [].concat(_toConsumableArray(maiaAgents), _toConsumableArray(favorites), _toConsumableArray(nonFavorites)) : [].concat(_toConsumableArray(favorites), _toConsumableArray(nonFavorites));
44
+
45
+ // Combinar: clones primero, luego favoritos, luego no favoritos
46
+ return cloneAgents.length ? [].concat(_toConsumableArray(cloneAgents), _toConsumableArray(favorites), _toConsumableArray(nonFavorites)) : [].concat(_toConsumableArray(favorites), _toConsumableArray(nonFavorites));
47
+ };
48
+ var normalizeCustomAgentsFromApi = function normalizeCustomAgentsFromApi(agents) {
49
+ return agents.map(function (agent) {
50
+ return agent.type === 'custom' ? withNormalizedConnectors(agent) : agent;
51
+ });
66
52
  };
67
53
  export var useGetAgents = function useGetAgents(_ref) {
68
54
  var selectAgent = _ref.selectAgent,
@@ -84,10 +70,14 @@ export var useGetAgents = function useGetAgents(_ref) {
84
70
  _useState6 = _slicedToArray(_useState5, 2),
85
71
  loadingMore = _useState6[0],
86
72
  setLoadingMore = _useState6[1];
87
- var _useState7 = useState(null),
73
+ var _useState7 = useState(false),
88
74
  _useState8 = _slicedToArray(_useState7, 2),
89
- error = _useState8[0],
90
- setError = _useState8[1];
75
+ searchLoading = _useState8[0],
76
+ setSearchLoading = _useState8[1];
77
+ var _useState9 = useState(null),
78
+ _useState0 = _slicedToArray(_useState9, 2),
79
+ error = _useState0[0],
80
+ setError = _useState0[1];
91
81
  var _useSnackBarManager = useSnackBarManager(),
92
82
  handleSnackbarError = _useSnackBarManager.handleSnackbarError;
93
83
  var _useTranslation = useTranslation('chat_ai_section'),
@@ -96,6 +86,10 @@ export var useGetAgents = function useGetAgents(_ref) {
96
86
  var lastSelectedAgentRef = useRef(null);
97
87
  var isRefreshingRef = useRef(false);
98
88
  var lastRequestRef = useRef(null);
89
+ var agentsRef = useRef(agents);
90
+ var preSearchAgentsRef = useRef(null);
91
+ agentsRef.current = agents;
92
+ var canFetchCloneAgents = !isMaiaCloneAgentsRoleBlocked(user, section);
99
93
  var addAgent = useCallback(function (newAgent, options) {
100
94
  setAgents(function (prev) {
101
95
  // Verificar si el agente ya existe para evitar duplicados
@@ -193,195 +187,150 @@ export var useGetAgents = function useGetAgents(_ref) {
193
187
  }
194
188
  }, [agents.data, selectAgent]);
195
189
  var handleGetAgents = useCallback(/*#__PURE__*/function () {
196
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(agentToSelect) {
190
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(agentToSelect) {
197
191
  var _agentToSelect$id;
198
- var requestKey, isMultiAgents, agentParsed, hasMore, nextOffset, cloneAgentsRoleBlocked, canFetchCloneAgents, fetchGlobalCloneAgents, customAgents, customHasMore, customNextOffset, is403, maiaAgents, loadCloneAgents, loadCustomAgents, queryParams, queryString, path, response, data, globalCloneAgents, _responseError$respon, _responseError$messag, _responseError$messag2, is403Error, _agentParsed, _agentParsed2, _lastSelectedAgentRef, _lastSelectedAgentRef2, availableAgents, _availableAgents, firstAgent, _lastSelectedAgentRef3, _availableAgents2, _availableAgents3, firstAvailableAgent, _t4, _t5;
199
- return _regeneratorRuntime.wrap(function (_context4) {
200
- while (1) switch (_context4.prev = _context4.next) {
192
+ var requestKey, isMultiAgents, agentParsed, hasMore, nextOffset, cloneAgents, customAgents, customHasMore, customNextOffset, is403, loadCloneAgents, loadCustomAgents, shouldRequestCloneAgents, queryParams, path, response, data, _responseError$respon, _responseError$messag, _responseError$messag2, is403Error, _agentParsed, _agentParsed2, _lastSelectedAgentRef, _lastSelectedAgentRef2, availableAgents, _availableAgents, firstAgent, _lastSelectedAgentRef3, _availableAgents2, _availableAgents3, firstAvailableAgent, _t3, _t4;
193
+ return _regeneratorRuntime.wrap(function (_context3) {
194
+ while (1) switch (_context3.prev = _context3.next) {
201
195
  case 0:
202
196
  if (!isRefreshingRef.current) {
203
- _context4.next = 1;
197
+ _context3.next = 1;
204
198
  break;
205
199
  }
206
- return _context4.abrupt("return");
200
+ return _context3.abrupt("return");
207
201
  case 1:
208
202
  requestKey = (agentToSelect === null || agentToSelect === void 0 || (_agentToSelect$id = agentToSelect.id) === null || _agentToSelect$id === void 0 ? void 0 : _agentToSelect$id.toString()) || 'default';
209
203
  if (!(lastRequestRef.current === requestKey && !loading)) {
210
- _context4.next = 2;
204
+ _context3.next = 2;
211
205
  break;
212
206
  }
213
- return _context4.abrupt("return");
207
+ return _context3.abrupt("return");
214
208
  case 2:
215
209
  isRefreshingRef.current = true;
216
210
  lastRequestRef.current = requestKey;
217
211
  setLoading(true);
218
212
  setError(null);
219
213
  isMultiAgents = !!window.MAIA_CHAT_AI_FEATURE_ACCESS && !!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
220
- _context4.prev = 3;
214
+ _context3.prev = 3;
221
215
  agentParsed = [];
222
216
  hasMore = false;
223
- nextOffset = null;
224
- cloneAgentsRoleBlocked = isMaiaCloneAgentsRoleBlocked(user, section);
225
- canFetchCloneAgents = !cloneAgentsRoleBlocked;
226
- fetchGlobalCloneAgents = /*#__PURE__*/function () {
217
+ nextOffset = null; // Si tiene feature access multi agents, hacer dos queries (Maia + custom) en cualquier sección
218
+ if (!isMultiAgents) {
219
+ _context3.next = 5;
220
+ break;
221
+ }
222
+ // Query clone (Maia) y custom son independientes → se disparan en paralelo.
223
+ cloneAgents = [];
224
+ customAgents = [];
225
+ customHasMore = false;
226
+ customNextOffset = null;
227
+ is403 = function is403(err) {
228
+ var _err$response, _err$message, _err$message2;
229
+ return (err === null || err === void 0 || (_err$response = err.response) === null || _err$response === void 0 ? void 0 : _err$response.status) === 403 || (err === null || err === void 0 ? void 0 : err.status) === 403 || (err === null || err === void 0 || (_err$message = err.message) === null || _err$message === void 0 ? void 0 : _err$message.includes("You don't have permission to view agents")) || (err === null || err === void 0 || (_err$message2 = err.message) === null || _err$message2 === void 0 ? void 0 : _err$message2.includes('Failed fetching data'));
230
+ }; // fetchCOR lanza esto para 403 sin 'Access denied'
231
+ loadCloneAgents = /*#__PURE__*/function () {
227
232
  var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
228
- var cloneResponse, cloneData, _t;
233
+ var _maiaData$data, orderParam, maiaResponse, maiaData, _t;
229
234
  return _regeneratorRuntime.wrap(function (_context) {
230
235
  while (1) switch (_context.prev = _context.next) {
231
236
  case 0:
232
- if (!(!isMarketplaceMaiakerEnabled() || !canFetchCloneAgents)) {
237
+ if (canFetchCloneAgents) {
233
238
  _context.next = 1;
234
239
  break;
235
240
  }
236
- return _context.abrupt("return", []);
241
+ return _context.abrupt("return");
237
242
  case 1:
238
243
  _context.prev = 1;
244
+ orderParam = section === 'client' ? '&order=client,project' : section === 'project' || section === 'header' || section === 'task' ? '&order=project,client' : '';
239
245
  _context.next = 2;
240
246
  return fetchMaia({
241
- path: "agents?agent_type=clone&entity=global&lang=".concat(mapCORLang(i18n.language)),
247
+ path: "agents?agent_type=clone&lang=".concat(mapCORLang(i18n.language)).concat(orderParam),
242
248
  method: 'GET'
243
249
  });
244
250
  case 2:
245
- cloneResponse = _context.sent;
251
+ maiaResponse = _context.sent;
246
252
  _context.next = 3;
247
- return cloneResponse.json();
253
+ return maiaResponse.json();
248
254
  case 3:
249
- cloneData = _context.sent;
250
- return _context.abrupt("return", (cloneData.data || []).filter(function (ag) {
255
+ maiaData = _context.sent;
256
+ cloneAgents = ((_maiaData$data = maiaData.data) === null || _maiaData$data === void 0 ? void 0 : _maiaData$data.filter(function (ag) {
251
257
  return ag.type === 'clone';
252
- }));
258
+ })) || [];
259
+ _context.next = 5;
260
+ break;
253
261
  case 4:
254
262
  _context.prev = 4;
255
263
  _t = _context["catch"](1);
256
- if (!is403AgentFetchError(_t)) {
264
+ if (is403(_t)) {
257
265
  _context.next = 5;
258
266
  break;
259
267
  }
260
- return _context.abrupt("return", []);
261
- case 5:
262
268
  throw _t;
263
- case 6:
269
+ case 5:
264
270
  case "end":
265
271
  return _context.stop();
266
272
  }
267
273
  }, _callee, null, [[1, 4]]);
268
274
  }));
269
- return function fetchGlobalCloneAgents() {
275
+ return function loadCloneAgents() {
270
276
  return _ref6.apply(this, arguments);
271
277
  };
272
- }(); // Si tiene feature access multi agents, hacer dos queries (Maia + custom) en cualquier sección
273
- if (!isMultiAgents) {
274
- _context4.next = 5;
275
- break;
276
- }
277
- // Query clone (Maia) y custom son independientes → se disparan en paralelo.
278
- customAgents = [];
279
- customHasMore = false;
280
- customNextOffset = null;
281
- is403 = is403AgentFetchError;
282
- maiaAgents = [];
283
- loadCloneAgents = /*#__PURE__*/function () {
278
+ }();
279
+ loadCustomAgents = /*#__PURE__*/function () {
284
280
  var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
285
- var _maiaData$data, maiaResponse, maiaData, globalCloneAgents, _t2;
281
+ var customResponse, customData, _t2;
286
282
  return _regeneratorRuntime.wrap(function (_context2) {
287
283
  while (1) switch (_context2.prev = _context2.next) {
288
284
  case 0:
289
- if (canFetchCloneAgents) {
290
- _context2.next = 1;
291
- break;
292
- }
293
- return _context2.abrupt("return");
294
- case 1:
295
- _context2.prev = 1;
296
- _context2.next = 2;
297
- return fetchMaia({
298
- path: "agents?agent_type=orchestrator&lang=".concat(mapCORLang(i18n.language)),
299
- method: 'GET'
300
- });
301
- case 2:
302
- maiaResponse = _context2.sent;
303
- _context2.next = 3;
304
- return maiaResponse.json();
305
- case 3:
306
- maiaData = _context2.sent;
307
- maiaAgents = ((_maiaData$data = maiaData.data) === null || _maiaData$data === void 0 ? void 0 : _maiaData$data.filter(isMaiaAgent)) || [];
308
- _context2.next = 4;
309
- return fetchGlobalCloneAgents();
310
- case 4:
311
- globalCloneAgents = _context2.sent;
312
- maiaAgents = mergeAgentsWithoutDuplicates(maiaAgents, globalCloneAgents);
313
- _context2.next = 6;
314
- break;
315
- case 5:
316
- _context2.prev = 5;
317
- _t2 = _context2["catch"](1);
318
- if (is403(_t2)) {
319
- _context2.next = 6;
320
- break;
321
- }
322
- throw _t2;
323
- case 6:
324
- case "end":
325
- return _context2.stop();
326
- }
327
- }, _callee2, null, [[1, 5]]);
328
- }));
329
- return function loadCloneAgents() {
330
- return _ref7.apply(this, arguments);
331
- };
332
- }();
333
- loadCustomAgents = /*#__PURE__*/function () {
334
- var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
335
- var customResponse, customData, _t3;
336
- return _regeneratorRuntime.wrap(function (_context3) {
337
- while (1) switch (_context3.prev = _context3.next) {
338
- case 0:
339
- _context3.prev = 0;
340
- _context3.next = 1;
285
+ _context2.prev = 0;
286
+ _context2.next = 1;
341
287
  return fetchMaia({
342
288
  path: 'agents?agent_type=custom&limit=7&offset=0',
343
289
  method: 'GET'
344
290
  });
345
291
  case 1:
346
- customResponse = _context3.sent;
347
- _context3.next = 2;
292
+ customResponse = _context2.sent;
293
+ _context2.next = 2;
348
294
  return customResponse.json();
349
295
  case 2:
350
- customData = _context3.sent;
351
- customAgents = customData.data || [];
296
+ customData = _context2.sent;
297
+ customAgents = normalizeCustomAgentsFromApi(customData.data || []);
352
298
  customHasMore = customData.has_more || false;
353
299
  customNextOffset = customData.next_offset || null;
354
- _context3.next = 4;
300
+ _context2.next = 4;
355
301
  break;
356
302
  case 3:
357
- _context3.prev = 3;
358
- _t3 = _context3["catch"](0);
359
- if (is403(_t3)) {
360
- _context3.next = 4;
303
+ _context2.prev = 3;
304
+ _t2 = _context2["catch"](0);
305
+ if (is403(_t2)) {
306
+ _context2.next = 4;
361
307
  break;
362
308
  }
363
- throw _t3;
309
+ throw _t2;
364
310
  case 4:
365
311
  case "end":
366
- return _context3.stop();
312
+ return _context2.stop();
367
313
  }
368
- }, _callee3, null, [[0, 3]]);
314
+ }, _callee2, null, [[0, 3]]);
369
315
  }));
370
316
  return function loadCustomAgents() {
371
- return _ref8.apply(this, arguments);
317
+ return _ref7.apply(this, arguments);
372
318
  };
373
319
  }();
374
- _context4.next = 4;
320
+ _context3.next = 4;
375
321
  return Promise.all([loadCloneAgents(), loadCustomAgents()]);
376
322
  case 4:
377
323
  // Combinar: agentes clone primero, luego los custom (si existen)
378
324
  // Si el usuario tiene un rol deshabilitado, no incluir cloneAgents
379
325
  if (!canFetchCloneAgents) {
380
- // Rol sin acceso a clones (p. ej. freelancer/cliente o colaborador en project/client): solo customAgents
326
+ // Rol sin acceso a clones (p. ej. colaborador fuera del piloto): solo customAgents
381
327
  // Si customAgents está vacío (por 403), agentParsed será []
382
328
  agentParsed = customAgents;
383
329
  } else {
384
- agentParsed = maiaAgents.length ? [].concat(_toConsumableArray(maiaAgents), _toConsumableArray(customAgents)) : customAgents;
330
+ // Rol con acceso a clones: cloneAgents + customAgents
331
+ // Si customAgents está vacío (por 403) pero hay cloneAgents, agentParsed tendrá los clones
332
+ // Si no hay cloneAgents ni customAgents, agentParsed será []
333
+ agentParsed = cloneAgents.length ? [].concat(_toConsumableArray(cloneAgents), _toConsumableArray(customAgents)) : customAgents;
385
334
  }
386
335
  // Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
387
336
  agentParsed = sortAgents(agentParsed);
@@ -397,60 +346,64 @@ export var useGetAgents = function useGetAgents(_ref) {
397
346
  if (agentParsed.length === 0) {
398
347
  setError(null);
399
348
  }
400
- _context4.next = 12;
349
+ _context3.next = 12;
401
350
  break;
402
351
  case 5:
403
- // Lógica para project, client o header sin multiAgents (mismo criterio de orden project/client; header añade paginación)
352
+ shouldRequestCloneAgents = canFetchCloneAgents && (section === 'project' || section === 'client' || section === 'header' || section === 'task');
353
+ if (shouldRequestCloneAgents) {
354
+ _context3.next = 6;
355
+ break;
356
+ }
357
+ setAgents({
358
+ data: [],
359
+ has_more: false,
360
+ next_offset: null
361
+ });
362
+ setError(null);
363
+ _context3.next = 12;
364
+ break;
365
+ case 6:
404
366
  queryParams = new URLSearchParams();
405
- if (section === 'project' || section === 'client' || section === 'header' || section === 'task') {
406
- queryParams.append('agent_type', 'orchestrator');
407
- queryParams.append('lang', mapCORLang(i18n.language));
408
- if (section === 'header') {
409
- queryParams.append('limit', '7');
410
- queryParams.append('offset', '0');
411
- }
367
+ queryParams.append('agent_type', 'clone');
368
+ queryParams.append('lang', mapCORLang(i18n.language));
369
+ queryParams.append('order', section === 'client' ? 'client,project' : 'project,client');
370
+ if (section === 'header') {
371
+ queryParams.append('limit', '7');
372
+ queryParams.append('offset', '0');
412
373
  }
413
- queryString = queryParams.toString();
414
- path = "agents".concat(queryString ? "?".concat(queryString) : '');
415
- _context4.prev = 6;
416
- _context4.next = 7;
374
+ path = "agents?".concat(queryParams.toString());
375
+ _context3.prev = 7;
376
+ _context3.next = 8;
417
377
  return fetchMaia({
418
378
  path: path,
419
379
  method: 'GET'
420
380
  });
421
- case 7:
422
- response = _context4.sent;
423
- _context4.next = 8;
424
- return response.json();
425
381
  case 8:
426
- data = _context4.sent;
427
- // data.data ya contiene el/los agentes orquestadores de la query agent_type=orchestrator
428
- agentParsed = data.data || [];
429
- _context4.next = 9;
430
- return fetchGlobalCloneAgents();
382
+ response = _context3.sent;
383
+ _context3.next = 9;
384
+ return response.json();
431
385
  case 9:
432
- globalCloneAgents = _context4.sent;
433
- agentParsed = mergeAgentsWithoutDuplicates(agentParsed, globalCloneAgents);
434
- // Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
386
+ data = _context3.sent;
387
+ agentParsed = data.data || [];
435
388
  agentParsed = sortAgents(agentParsed);
436
389
  hasMore = data.has_more;
437
390
  nextOffset = data.next_offset;
438
391
  setAgents(_objectSpread(_objectSpread({}, data), {}, {
439
392
  data: agentParsed
440
393
  }));
441
- _context4.next = 12;
394
+ _context3.next = 12;
442
395
  break;
443
396
  case 10:
444
- _context4.prev = 10;
445
- _t4 = _context4["catch"](6);
397
+ _context3.prev = 10;
398
+ _t3 = _context3["catch"](7);
446
399
  // Verificar si el error es 403
447
400
  // fetchCOR puede lanzar diferentes tipos de errores:
448
401
  // 1. Error con errorData.detail si incluye 'Access denied'
449
402
  // 2. Error genérico 'Failed fetching data' si es 403 pero no incluye 'Access denied'
450
403
  // 3. Necesitamos verificar el status code si está disponible
451
- is403Error = (_t4 === null || _t4 === void 0 || (_responseError$respon = _t4.response) === null || _responseError$respon === void 0 ? void 0 : _responseError$respon.status) === 403 || (_t4 === null || _t4 === void 0 ? void 0 : _t4.status) === 403 || (_t4 === null || _t4 === void 0 || (_responseError$messag = _t4.message) === null || _responseError$messag === void 0 ? void 0 : _responseError$messag.includes("You don't have permission to view agents")) || (_t4 === null || _t4 === void 0 || (_responseError$messag2 = _t4.message) === null || _responseError$messag2 === void 0 ? void 0 : _responseError$messag2.includes('Failed fetching data')); // fetchCOR lanza esto para 403 sin 'Access denied'
404
+ is403Error = (_t3 === null || _t3 === void 0 || (_responseError$respon = _t3.response) === null || _responseError$respon === void 0 ? void 0 : _responseError$respon.status) === 403 || (_t3 === null || _t3 === void 0 ? void 0 : _t3.status) === 403 || (_t3 === null || _t3 === void 0 || (_responseError$messag = _t3.message) === null || _responseError$messag === void 0 ? void 0 : _responseError$messag.includes("You don't have permission to view agents")) || (_t3 === null || _t3 === void 0 || (_responseError$messag2 = _t3.message) === null || _responseError$messag2 === void 0 ? void 0 : _responseError$messag2.includes('Failed fetching data')); // fetchCOR lanza esto para 403 sin 'Access denied'
452
405
  if (!is403Error) {
453
- _context4.next = 11;
406
+ _context3.next = 11;
454
407
  break;
455
408
  }
456
409
  // Si es 403, establecer agentes vacíos y continuar
@@ -460,10 +413,10 @@ export var useGetAgents = function useGetAgents(_ref) {
460
413
  next_offset: null
461
414
  });
462
415
  setError(null);
463
- _context4.next = 12;
416
+ _context3.next = 12;
464
417
  break;
465
418
  case 11:
466
- throw _t4;
419
+ throw _t3;
467
420
  case 12:
468
421
  // Lógica de select agent - Solo seleccionar si hay agentes disponibles
469
422
  if (agentParsed.length > 0) {
@@ -477,8 +430,8 @@ export var useGetAgents = function useGetAgents(_ref) {
477
430
  } else if ((_agentParsed = agentParsed) !== null && _agentParsed !== void 0 && _agentParsed[0] && (!agent || !agentParsed.find(function (a) {
478
431
  return a.id === agent.id;
479
432
  }))) {
480
- availableAgents = window.MAIA_CHAT_AI_FEATURE_ACCESS && !cloneAgentsRoleBlocked ? agentParsed : agentParsed.filter(function (agentItem) {
481
- return !isMaiaAgent(agentItem);
433
+ availableAgents = window.MAIA_CHAT_AI_FEATURE_ACCESS && canFetchCloneAgents ? agentParsed : agentParsed.filter(function (agentItem) {
434
+ return agentItem.type !== 'clone';
482
435
  });
483
436
  _availableAgents = _slicedToArray(availableAgents, 1), firstAgent = _availableAgents[0];
484
437
  if (firstAgent && ((_lastSelectedAgentRef2 = lastSelectedAgentRef.current) === null || _lastSelectedAgentRef2 === void 0 ? void 0 : _lastSelectedAgentRef2.id) !== firstAgent.id) {
@@ -486,8 +439,8 @@ export var useGetAgents = function useGetAgents(_ref) {
486
439
  selectAgent(firstAgent);
487
440
  }
488
441
  } else if (agentToSelect && (_agentParsed2 = agentParsed) !== null && _agentParsed2 !== void 0 && _agentParsed2.length) {
489
- _availableAgents2 = window.MAIA_CHAT_AI_FEATURE_ACCESS && !cloneAgentsRoleBlocked ? agentParsed : agentParsed.filter(function (agentItem) {
490
- return !isMaiaAgent(agentItem);
442
+ _availableAgents2 = window.MAIA_CHAT_AI_FEATURE_ACCESS && canFetchCloneAgents ? agentParsed : agentParsed.filter(function (agentItem) {
443
+ return agentItem.type !== 'clone';
491
444
  });
492
445
  _availableAgents3 = _slicedToArray(_availableAgents2, 1), firstAvailableAgent = _availableAgents3[0];
493
446
  if (firstAvailableAgent && ((_lastSelectedAgentRef3 = lastSelectedAgentRef.current) === null || _lastSelectedAgentRef3 === void 0 ? void 0 : _lastSelectedAgentRef3.id) !== firstAvailableAgent.id) {
@@ -497,32 +450,95 @@ export var useGetAgents = function useGetAgents(_ref) {
497
450
  }
498
451
  }
499
452
  setLoading(false);
500
- _context4.next = 14;
453
+ _context3.next = 14;
501
454
  break;
502
455
  case 13:
503
- _context4.prev = 13;
504
- _t5 = _context4["catch"](3);
505
- setError(_t5 instanceof Error ? _t5.message : 'An unknown error occurred');
456
+ _context3.prev = 13;
457
+ _t4 = _context3["catch"](3);
458
+ setError(_t4 instanceof Error ? _t4.message : 'An unknown error occurred');
506
459
  setLoading(false);
507
460
  case 14:
508
- _context4.prev = 14;
461
+ _context3.prev = 14;
509
462
  isRefreshingRef.current = false;
510
463
  setTimeout(function () {
511
464
  if (!isRefreshingRef.current) {
512
465
  lastRequestRef.current = null;
513
466
  }
514
467
  }, 100);
515
- return _context4.finish(14);
468
+ return _context3.finish(14);
516
469
  case 15:
517
470
  case "end":
518
- return _context4.stop();
471
+ return _context3.stop();
519
472
  }
520
- }, _callee4, null, [[3, 13, 14, 15], [6, 10]]);
473
+ }, _callee3, null, [[3, 13, 14, 15], [7, 10]]);
521
474
  }));
522
475
  return function (_x) {
523
476
  return _ref5.apply(this, arguments);
524
477
  };
525
- }(), [selectAgent, section, agent, loading]);
478
+ }(), [selectAgent, section, agent, loading, canFetchCloneAgents, i18n.language]);
479
+ var searchCustomAgents = useCallback(/*#__PURE__*/function () {
480
+ var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(query) {
481
+ var response, data, _t5;
482
+ return _regeneratorRuntime.wrap(function (_context4) {
483
+ while (1) switch (_context4.prev = _context4.next) {
484
+ case 0:
485
+ if (query) {
486
+ _context4.next = 1;
487
+ break;
488
+ }
489
+ if (preSearchAgentsRef.current) {
490
+ setAgents(preSearchAgentsRef.current);
491
+ preSearchAgentsRef.current = null;
492
+ }
493
+ return _context4.abrupt("return");
494
+ case 1:
495
+ if (!preSearchAgentsRef.current) {
496
+ preSearchAgentsRef.current = agentsRef.current;
497
+ }
498
+ setSearchLoading(true);
499
+ _context4.prev = 2;
500
+ _context4.next = 3;
501
+ return fetchMaia({
502
+ path: "agents?agent_type=custom&limit=20&offset=0&q=".concat(encodeURIComponent(query)),
503
+ method: 'GET'
504
+ });
505
+ case 3:
506
+ response = _context4.sent;
507
+ _context4.next = 4;
508
+ return response.json();
509
+ case 4:
510
+ data = _context4.sent;
511
+ setAgents(function (prev) {
512
+ var cloneAgents = prev.data.filter(function (ag) {
513
+ return ag.type === 'clone';
514
+ });
515
+ var customResults = data.data || [];
516
+ return {
517
+ data: cloneAgents.length ? [].concat(_toConsumableArray(cloneAgents), _toConsumableArray(customResults)) : customResults,
518
+ has_more: false,
519
+ next_offset: null
520
+ };
521
+ });
522
+ _context4.next = 6;
523
+ break;
524
+ case 5:
525
+ _context4.prev = 5;
526
+ _t5 = _context4["catch"](2);
527
+ handleSnackbarError(t('snackbar.loadMoreAgents.error'));
528
+ case 6:
529
+ _context4.prev = 6;
530
+ setSearchLoading(false);
531
+ return _context4.finish(6);
532
+ case 7:
533
+ case "end":
534
+ return _context4.stop();
535
+ }
536
+ }, _callee4, null, [[2, 5, 6, 7]]);
537
+ }));
538
+ return function (_x2) {
539
+ return _ref8.apply(this, arguments);
540
+ };
541
+ }(), []);
526
542
  var loadMoreAgents = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
527
543
  var isMultiAgents, canLoadMore, path, queryParams, response, data, _t6;
528
544
  return _regeneratorRuntime.wrap(function (_context5) {
@@ -544,10 +560,11 @@ export var useGetAgents = function useGetAgents(_ref) {
544
560
  // Mantener cantidad impar de cards: primera carga 7, siguientes +6 (7, 13, 19, ...)
545
561
  path = "agents?agent_type=custom&limit=6&offset=".concat(agents.next_offset);
546
562
  } else {
547
- // Si no es multiAgents, cargar más agentes orquestadores (MAIA)
563
+ // Si no es multiAgents, cargar más agentes clone (Maia) — mismo order que project para header
548
564
  queryParams = new URLSearchParams();
549
- queryParams.append('agent_type', 'orchestrator');
565
+ queryParams.append('agent_type', 'clone');
550
566
  queryParams.append('lang', mapCORLang(i18n.language));
567
+ queryParams.append('order', 'project,client');
551
568
  queryParams.append('limit', '7');
552
569
  queryParams.append('offset', agents.next_offset.toString());
553
570
  path = "agents?".concat(queryParams.toString());
@@ -566,24 +583,29 @@ export var useGetAgents = function useGetAgents(_ref) {
566
583
  // Acumular agentes, excluyendo duplicados
567
584
  setAgents(function (prev) {
568
585
  if (isMultiAgents) {
569
- // Lógica para multiAgents: separar MAIA y custom
570
- var existingMaiaAgents = prev.data.filter(isMaiaAgent);
586
+ // Lógica para multiAgents: separar clone y custom
587
+ // Mantener todos los agentes clone existentes al inicio
588
+ var existingCloneAgents = prev.data.filter(function (ag) {
589
+ return ag.type === 'clone';
590
+ });
571
591
 
572
- // Obtener IDs existentes (excluyendo MAIA)
592
+ // Obtener IDs existentes (excluyendo clones)
573
593
  var _existingIds = new Set(prev.data.filter(function (ag) {
574
- return !isMaiaAgent(ag);
594
+ return ag.type !== 'clone';
575
595
  }).map(function (ag) {
576
596
  return ag.id;
577
597
  }));
578
598
 
579
- // Filtrar nuevos agents que no estén ya en la lista (y que no sean MAIA)
580
- var _newAgents = data.data.filter(function (ag) {
581
- return !isMaiaAgent(ag) && !_existingIds.has(ag.id);
582
- });
583
- var _newData = existingMaiaAgents.length ? [].concat(_toConsumableArray(existingMaiaAgents), _toConsumableArray(prev.data.filter(function (ag) {
584
- return !isMaiaAgent(ag);
599
+ // Filtrar nuevos agents que no estén ya en la lista (y que no sean clone)
600
+ var _newAgents = normalizeCustomAgentsFromApi(data.data.filter(function (ag) {
601
+ return ag.type !== 'clone' && !_existingIds.has(ag.id);
602
+ }));
603
+
604
+ // Construir el nuevo array: clones primero, luego los agents existentes que no sean clone, luego los nuevos
605
+ var _newData = existingCloneAgents.length ? [].concat(_toConsumableArray(existingCloneAgents), _toConsumableArray(prev.data.filter(function (ag) {
606
+ return ag.type !== 'clone';
585
607
  })), _toConsumableArray(_newAgents)) : [].concat(_toConsumableArray(prev.data.filter(function (ag) {
586
- return !isMaiaAgent(ag);
608
+ return ag.type !== 'clone';
587
609
  })), _toConsumableArray(_newAgents));
588
610
 
589
611
  // Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
@@ -594,7 +616,7 @@ export var useGetAgents = function useGetAgents(_ref) {
594
616
  next_offset: data.next_offset
595
617
  };
596
618
  }
597
- // Lógica para !isMultiAgents: agregar evitando duplicados
619
+ // Lógica para !isMultiAgents: todos los agentes son clone, simplemente agregar evitando duplicados
598
620
  var existingIds = new Set(prev.data.map(function (ag) {
599
621
  return ag.id;
600
622
  }));
@@ -632,6 +654,8 @@ export var useGetAgents = function useGetAgents(_ref) {
632
654
  error: error,
633
655
  handleGetAgents: handleGetAgents,
634
656
  loadMoreAgents: loadMoreAgents,
657
+ searchCustomAgents: searchCustomAgents,
658
+ searchLoading: searchLoading,
635
659
  addAgent: addAgent,
636
660
  removeAgent: removeAgent,
637
661
  updateAgent: updateAgent,
@@ -640,4 +664,4 @@ export var useGetAgents = function useGetAgents(_ref) {
640
664
  sortAgentsList: sortAgentsList
641
665
  };
642
666
  };
643
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUNhbGxiYWNrIiwidXNlUmVmIiwidXNlVHJhbnNsYXRpb24iLCJ1c2VTbmFja0Jhck1hbmFnZXIiLCJmZXRjaE1haWEiLCJ1c2VVc2VyIiwiaXNNYWlhQ2xvbmVBZ2VudHNSb2xlQmxvY2tlZCIsIm1hcENPUkxhbmciLCJpc01haWFBZ2VudCIsImFnZW50IiwidHlwZSIsImlzTWFya2V0cGxhY2VNYWlha2VyRW5hYmxlZCIsIndpbmRvdyIsIk1BSUFfTUFSS0VUUExBQ0VfTUFJQUtFUiIsImlzNDAzQWdlbnRGZXRjaEVycm9yIiwiZXJyIiwiX2Vycm9yJHJlc3BvbnNlIiwiX2Vycm9yJG1lc3NhZ2UiLCJfZXJyb3IkbWVzc2FnZTIiLCJlcnJvciIsInJlc3BvbnNlIiwic3RhdHVzIiwiQm9vbGVhbiIsIm1lc3NhZ2UiLCJpbmNsdWRlcyIsIm1lcmdlQWdlbnRzV2l0aG91dER1cGxpY2F0ZXMiLCJiYXNlIiwiZXh0cmEiLCJpZHMiLCJTZXQiLCJtYXAiLCJpZCIsIm1lcmdlZCIsIl90b0NvbnN1bWFibGVBcnJheSIsImZvckVhY2giLCJoYXMiLCJwdXNoIiwic29ydEFnZW50cyIsImFnZW50cyIsIm1haWFBZ2VudHMiLCJmaWx0ZXIiLCJvdGhlckFnZW50cyIsImFnIiwiZmF2b3JpdGVzIiwiaXNfZmF2b3JpdGUiLCJzb3J0IiwiYSIsImIiLCJuYW1lIiwibG9jYWxlQ29tcGFyZSIsIm5vbkZhdm9yaXRlcyIsImxlbmd0aCIsImNvbmNhdCIsInVzZUdldEFnZW50cyIsIl9yZWYiLCJzZWxlY3RBZ2VudCIsInNlY3Rpb24iLCJoYW5kbGVHb0hvbWUiLCJ1c2VyIiwiX3VzZVN0YXRlIiwiZGF0YSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInNldEFnZW50cyIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwibG9hZGluZyIsInNldExvYWRpbmciLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImxvYWRpbmdNb3JlIiwic2V0TG9hZGluZ01vcmUiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInNldEVycm9yIiwiX3VzZVNuYWNrQmFyTWFuYWdlciIsImhhbmRsZVNuYWNrYmFyRXJyb3IiLCJfdXNlVHJhbnNsYXRpb24iLCJ0IiwiaTE4biIsImxhc3RTZWxlY3RlZEFnZW50UmVmIiwiaXNSZWZyZXNoaW5nUmVmIiwibGFzdFJlcXVlc3RSZWYiLCJhZGRBZ2VudCIsIm5ld0FnZW50Iiwib3B0aW9ucyIsInByZXYiLCJhZ2VudEV4aXN0cyIsInNvbWUiLCJleGlzdGluZ0FnZW50IiwibmV3RGF0YSIsInNvcnRlZERhdGEiLCJfb2JqZWN0U3ByZWFkIiwibmF2aWdhdGVIb21lIiwicmVtb3ZlQWdlbnQiLCJhZ2VudElkIiwidG9TdHJpbmciLCJ1cGRhdGVBZ2VudCIsInVwZGF0ZWRBZ2VudCIsInVwZGF0ZWREYXRhIiwidXBkYXRlQWdlbnRGYXZvcml0ZSIsInNob3VsZFNvcnQiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJfcmVmMiIsImFnZW50RmllbGRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwibWVyZ2VkQWdlbnQiLCJmaW5hbERhdGEiLCJmaW5kIiwiX3JlZjMiLCJfZXhjbHVkZWQyIiwiX3JlZjQiLCJfZXhjbHVkZWQzIiwic29ydEFnZW50c0xpc3QiLCJzZWxlY3RGaXJzdEFnZW50IiwiZmlyc3RBZ2VudCIsImZpbmRJbmRleCIsImFnZW50RGF0YSIsImN1cnJlbnQiLCJoYW5kbGVHZXRBZ2VudHMiLCJfcmVmNSIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlNCIsImFnZW50VG9TZWxlY3QiLCJfYWdlbnRUb1NlbGVjdCRpZCIsInJlcXVlc3RLZXkiLCJpc011bHRpQWdlbnRzIiwiYWdlbnRQYXJzZWQiLCJoYXNNb3JlIiwibmV4dE9mZnNldCIsImNsb25lQWdlbnRzUm9sZUJsb2NrZWQiLCJjYW5GZXRjaENsb25lQWdlbnRzIiwiZmV0Y2hHbG9iYWxDbG9uZUFnZW50cyIsImN1c3RvbUFnZW50cyIsImN1c3RvbUhhc01vcmUiLCJjdXN0b21OZXh0T2Zmc2V0IiwiaXM0MDMiLCJsb2FkQ2xvbmVBZ2VudHMiLCJsb2FkQ3VzdG9tQWdlbnRzIiwicXVlcnlQYXJhbXMiLCJxdWVyeVN0cmluZyIsInBhdGgiLCJnbG9iYWxDbG9uZUFnZW50cyIsIl9yZXNwb25zZUVycm9yJHJlc3BvbiIsIl9yZXNwb25zZUVycm9yJG1lc3NhZyIsIl9yZXNwb25zZUVycm9yJG1lc3NhZzIiLCJpczQwM0Vycm9yIiwiX2FnZW50UGFyc2VkIiwiX2FnZW50UGFyc2VkMiIsIl9sYXN0U2VsZWN0ZWRBZ2VudFJlZiIsIl9sYXN0U2VsZWN0ZWRBZ2VudFJlZjIiLCJhdmFpbGFibGVBZ2VudHMiLCJfYXZhaWxhYmxlQWdlbnRzIiwiX2xhc3RTZWxlY3RlZEFnZW50UmVmMyIsIl9hdmFpbGFibGVBZ2VudHMyIiwiX2F2YWlsYWJsZUFnZW50czMiLCJmaXJzdEF2YWlsYWJsZUFnZW50IiwiX3Q0IiwiX3Q1Iiwid3JhcCIsIl9jb250ZXh0NCIsIm5leHQiLCJhYnJ1cHQiLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MiLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwiX3JlZjYiLCJfY2FsbGVlIiwiY2xvbmVSZXNwb25zZSIsImNsb25lRGF0YSIsIl90IiwiX2NvbnRleHQiLCJsYW5ndWFnZSIsIm1ldGhvZCIsInNlbnQiLCJqc29uIiwic3RvcCIsImFwcGx5IiwiX3JlZjciLCJfY2FsbGVlMiIsIl9tYWlhRGF0YSRkYXRhIiwibWFpYVJlc3BvbnNlIiwibWFpYURhdGEiLCJfdDIiLCJfY29udGV4dDIiLCJfcmVmOCIsIl9jYWxsZWUzIiwiY3VzdG9tUmVzcG9uc2UiLCJjdXN0b21EYXRhIiwiX3QzIiwiX2NvbnRleHQzIiwiaGFzX21vcmUiLCJuZXh0X29mZnNldCIsIlByb21pc2UiLCJhbGwiLCJVUkxTZWFyY2hQYXJhbXMiLCJhcHBlbmQiLCJhZ2VudFRvUmVxdWVzdCIsImFnZW50SXRlbSIsIkVycm9yIiwic2V0VGltZW91dCIsImZpbmlzaCIsIl94IiwibG9hZE1vcmVBZ2VudHMiLCJfY2FsbGVlNSIsImNhbkxvYWRNb3JlIiwiX3Q2IiwiX2NvbnRleHQ1IiwiZXhpc3RpbmdNYWlhQWdlbnRzIiwiZXhpc3RpbmdJZHMiLCJuZXdBZ2VudHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvbWFpYS9BZ2VudHMvZ2V0QWdlbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCB7IHVzZVN0YXRlLCB1c2VDYWxsYmFjaywgdXNlUmVmIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5pbXBvcnQgeyB1c2VTbmFja0Jhck1hbmFnZXIgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VTbmFja0Jhck1hbmFnZXIvdXNlU25hY2tCYXJNYW5hZ2VyJ1xuaW1wb3J0IHsgZmV0Y2hNYWlhIH0gZnJvbSAnLi4vY2xpZW50J1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9hZ2VudCdcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgaXNNYWlhQ2xvbmVBZ2VudHNSb2xlQmxvY2tlZCB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9tYWlhVGFza1BhbmVsQWNjZXNzJ1xuaW1wb3J0IHsgU2VjdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBtYXBDT1JMYW5nIH0gZnJvbSAnLi4vLi4vLi4vbGFuZy91dGlscydcblxuY29uc3QgaXNNYWlhQWdlbnQgPSAoYWdlbnQ6IEFnZW50KSA9PiBhZ2VudC50eXBlID09PSAnb3JjaGVzdHJhdG9yJ1xuXG5jb25zdCBpc01hcmtldHBsYWNlTWFpYWtlckVuYWJsZWQgPSAoKSA9PiAhIXdpbmRvdy5NQUlBX01BUktFVFBMQUNFX01BSUFLRVJcblxuY29uc3QgaXM0MDNBZ2VudEZldGNoRXJyb3IgPSAoZXJyOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGVycm9yID0gZXJyIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlciB9OyBzdGF0dXM/OiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmcgfVxuICByZXR1cm4gKFxuICAgIGVycm9yPy5yZXNwb25zZT8uc3RhdHVzID09PSA0MDMgfHxcbiAgICBlcnJvcj8uc3RhdHVzID09PSA0MDMgfHxcbiAgICBCb29sZWFuKGVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcyhcIllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldyBhZ2VudHNcIikpIHx8XG4gICAgQm9vbGVhbihlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ0ZhaWxlZCBmZXRjaGluZyBkYXRhJykpXG4gIClcbn1cblxuY29uc3QgbWVyZ2VBZ2VudHNXaXRob3V0RHVwbGljYXRlcyA9IChiYXNlOiBBZ2VudFtdLCBleHRyYTogQWdlbnRbXSk6IEFnZW50W10gPT4ge1xuICBjb25zdCBpZHMgPSBuZXcgU2V0KGJhc2UubWFwKGFnZW50ID0+IGFnZW50LmlkKSlcbiAgY29uc3QgbWVyZ2VkID0gWy4uLmJhc2VdXG4gIGV4dHJhLmZvckVhY2goYWdlbnQgPT4ge1xuICAgIGlmICghaWRzLmhhcyhhZ2VudC5pZCkpIG1lcmdlZC5wdXNoKGFnZW50KVxuICB9KVxuICByZXR1cm4gbWVyZ2VkXG59XG5cbi8qKlxuICogT3JkZW5hIGxvcyBhZ2VudGVzOiBNQUlBIHByaW1lcm8gKHNpIGV4aXN0ZSksIGx1ZWdvIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlLCBsdWVnbyBubyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZVxuICovXG5jb25zdCBzb3J0QWdlbnRzID0gKGFnZW50czogQWdlbnRbXSk6IEFnZW50W10gPT4ge1xuICBjb25zdCBtYWlhQWdlbnRzID0gYWdlbnRzLmZpbHRlcihpc01haWFBZ2VudClcbiAgY29uc3Qgb3RoZXJBZ2VudHMgPSBhZ2VudHMuZmlsdGVyKGFnID0+ICFpc01haWFBZ2VudChhZykpXG5cbiAgLy8gU2VwYXJhciBmYXZvcml0b3MgeSBubyBmYXZvcml0b3NcbiAgY29uc3QgZmF2b3JpdGVzID0gb3RoZXJBZ2VudHMuZmlsdGVyKGFnID0+IGFnLmlzX2Zhdm9yaXRlKS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKVxuICBjb25zdCBub25GYXZvcml0ZXMgPSBvdGhlckFnZW50cy5maWx0ZXIoYWcgPT4gIWFnLmlzX2Zhdm9yaXRlKS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKVxuXG4gIHJldHVybiBtYWlhQWdlbnRzLmxlbmd0aCA/IFsuLi5tYWlhQWdlbnRzLCAuLi5mYXZvcml0ZXMsIC4uLm5vbkZhdm9yaXRlc10gOiBbLi4uZmF2b3JpdGVzLCAuLi5ub25GYXZvcml0ZXNdXG59XG5cbnR5cGUgVXNlR2V0QWdlbnRzUHJvcHMgPSB7XG4gIHNlbGVjdEFnZW50OiAoYWdlbnQ6IEFnZW50KSA9PiB2b2lkXG4gIHNlY3Rpb246IFNlY3Rpb25cbiAgYWdlbnQ6IEFnZW50IHwgbnVsbFxuICBoYW5kbGVHb0hvbWU6ICgpID0+IHZvaWRcbn1cblxuZXhwb3J0IHR5cGUgQWRkQWdlbnRPcHRpb25zID0ge1xuICAvKiogUG9yIGRlZmVjdG8gYHRydWVgIChjb21wb3J0YW1pZW50byBBQk0pLiBQYXNhciBgZmFsc2VgIGFsIGluc2VydGFyIGFnZW50ZSBjcmVhZG8gcG9yIGNoYXQgc2luIGNhbWJpYXIgZGUgdmlzdGEuICovXG4gIG5hdmlnYXRlSG9tZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IHVzZUdldEFnZW50cyA9ICh7IHNlbGVjdEFnZW50LCBzZWN0aW9uLCBhZ2VudCwgaGFuZGxlR29Ib21lIH06IFVzZUdldEFnZW50c1Byb3BzKSA9PiB7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgW2FnZW50cywgc2V0QWdlbnRzXSA9IHVzZVN0YXRlPHsgZGF0YTogQWdlbnRbXTsgaGFzX21vcmU/OiBib29sZWFuOyBuZXh0X29mZnNldD86IG51bWJlciB8IG51bGwgfT4oeyBkYXRhOiBbXSB9KVxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2xvYWRpbmdNb3JlLCBzZXRMb2FkaW5nTW9yZV0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCB7IGhhbmRsZVNuYWNrYmFyRXJyb3IgfSA9IHVzZVNuYWNrQmFyTWFuYWdlcigpXG4gIGNvbnN0IHsgdCwgaTE4biB9ID0gdXNlVHJhbnNsYXRpb24oJ2NoYXRfYWlfc2VjdGlvbicpXG4gIGNvbnN0IGxhc3RTZWxlY3RlZEFnZW50UmVmID0gdXNlUmVmPEFnZW50IHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNSZWZyZXNoaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBsYXN0UmVxdWVzdFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuXG4gIGNvbnN0IGFkZEFnZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld0FnZW50OiBBZ2VudCwgb3B0aW9ucz86IEFkZEFnZW50T3B0aW9ucykgPT4ge1xuICAgICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgICAvLyBWZXJpZmljYXIgc2kgZWwgYWdlbnRlIHlhIGV4aXN0ZSBwYXJhIGV2aXRhciBkdXBsaWNhZG9zXG4gICAgICAgIGNvbnN0IGFnZW50RXhpc3RzID0gcHJldi5kYXRhLnNvbWUoZXhpc3RpbmdBZ2VudCA9PiBleGlzdGluZ0FnZW50LmlkID09PSBuZXdBZ2VudC5pZClcbiAgICAgICAgaWYgKGFnZW50RXhpc3RzKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdEYXRhID0gWy4uLnByZXYuZGF0YSwgbmV3QWdlbnRdXG4gICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKG9wdGlvbnM/Lm5hdmlnYXRlSG9tZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgaGFuZGxlR29Ib21lKClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtoYW5kbGVHb0hvbWVdXG4gIClcblxuICBjb25zdCByZW1vdmVBZ2VudCA9IHVzZUNhbGxiYWNrKChhZ2VudElkOiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgICBzZXRBZ2VudHMocHJldiA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIGRhdGE6IHByZXYuZGF0YS5maWx0ZXIoYSA9PiBhLmlkICE9PSBhZ2VudElkLnRvU3RyaW5nKCkpLFxuICAgIH0pKVxuICB9LCBbXSlcblxuICBjb25zdCB1cGRhdGVBZ2VudCA9IHVzZUNhbGxiYWNrKCh1cGRhdGVkQWdlbnQ6IEFnZW50KSA9PiB7XG4gICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBwcmV2LmRhdGEubWFwKGV4aXN0aW5nQWdlbnQgPT5cbiAgICAgICAgZXhpc3RpbmdBZ2VudC5pZCA9PT0gdXBkYXRlZEFnZW50LmlkID8gdXBkYXRlZEFnZW50IDogZXhpc3RpbmdBZ2VudFxuICAgICAgKVxuICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHModXBkYXRlZERhdGEpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgfVxuICAgIH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZUFnZW50RmF2b3JpdGUgPSB1c2VDYWxsYmFjayhcbiAgICAodXBkYXRlZEFnZW50OiBBZ2VudCwgc2hvdWxkU29ydDogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG4gICAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gcHJldi5kYXRhLm1hcChleGlzdGluZ0FnZW50ID0+IHtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdBZ2VudC5pZCA9PT0gdXBkYXRlZEFnZW50LmlkKSB7XG4gICAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmFnZW50RmllbGRzIH0gPSB1cGRhdGVkQWdlbnQgYXMgYW55XG4gICAgICAgICAgICBjb25zdCBtZXJnZWRBZ2VudCA9IHsgLi4uZXhpc3RpbmdBZ2VudCwgLi4uYWdlbnRGaWVsZHMgfVxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlZEFnZW50XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBleGlzdGluZ0FnZW50XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU29sbyBvcmRlbmFyIHNpIHNob3VsZFNvcnQgZXMgdHJ1ZVxuICAgICAgICBjb25zdCBmaW5hbERhdGEgPSBzaG91bGRTb3J0ID8gc29ydEFnZW50cyh1cGRhdGVkRGF0YSkgOiB1cGRhdGVkRGF0YVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBkYXRhOiBmaW5hbERhdGEsXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIEFjdHVhbGl6YXIgZWwgYWdlbnRlIHNlbGVjY2lvbmFkbyBzaSBlcyBlbCBxdWUgc2UgZXN0w6EgYWN0dWFsaXphbmRvXG4gICAgICBpZiAoYWdlbnQ/LmlkID09PSB1cGRhdGVkQWdlbnQuaWQpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmQoYSA9PiBhLmlkID09PSB1cGRhdGVkQWdlbnQuaWQpXG4gICAgICAgIGlmIChleGlzdGluZ0FnZW50KSB7XG4gICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5hZ2VudEZpZWxkcyB9ID0gdXBkYXRlZEFnZW50IGFzIGFueVxuICAgICAgICAgIGNvbnN0IG1lcmdlZEFnZW50ID0geyAuLi5leGlzdGluZ0FnZW50LCAuLi5hZ2VudEZpZWxkcyB9XG4gICAgICAgICAgc2VsZWN0QWdlbnQobWVyZ2VkQWdlbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5hZ2VudEZpZWxkcyB9ID0gdXBkYXRlZEFnZW50IGFzIGFueVxuICAgICAgICAgIHNlbGVjdEFnZW50KGFnZW50RmllbGRzIGFzIEFnZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbYWdlbnQsIHNlbGVjdEFnZW50LCBhZ2VudHMuZGF0YV1cbiAgKVxuXG4gIGNvbnN0IHNvcnRBZ2VudHNMaXN0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKHByZXYuZGF0YSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICB9XG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgc2VsZWN0Rmlyc3RBZ2VudCA9IHVzZUNhbGxiYWNrKFxuICAgIChhZ2VudElkPzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoYWdlbnRzLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWdlbnQgPSBhZ2VudHMuZGF0YS5maW5kSW5kZXgoYWdlbnREYXRhID0+IGFnZW50RGF0YS5pZCA9PT0gYWdlbnRJZClcbiAgICAgICAgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudCA9IGFnZW50cy5kYXRhW2ZpcnN0QWdlbnQgPT09IDAgPyAxIDogMF1cbiAgICAgICAgc2VsZWN0QWdlbnQoYWdlbnRzLmRhdGFbZmlyc3RBZ2VudCA9PT0gMCA/IDEgOiAwXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudHMuZGF0YSwgc2VsZWN0QWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVHZXRBZ2VudHMgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoYWdlbnRUb1NlbGVjdD86IEFnZW50KSA9PiB7XG4gICAgICBpZiAoaXNSZWZyZXNoaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RLZXkgPSBhZ2VudFRvU2VsZWN0Py5pZD8udG9TdHJpbmcoKSB8fCAnZGVmYXVsdCdcbiAgICAgIGlmIChsYXN0UmVxdWVzdFJlZi5jdXJyZW50ID09PSByZXF1ZXN0S2V5ICYmICFsb2FkaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpc1JlZnJlc2hpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGxhc3RSZXF1ZXN0UmVmLmN1cnJlbnQgPSByZXF1ZXN0S2V5XG4gICAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgICBzZXRFcnJvcihudWxsKVxuXG4gICAgICBjb25zdCBpc011bHRpQWdlbnRzID0gISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmICEhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGFnZW50UGFyc2VkOiBBZ2VudFtdID0gW11cbiAgICAgICAgbGV0IGhhc01vcmUgPSBmYWxzZVxuICAgICAgICBsZXQgbmV4dE9mZnNldDogbnVtYmVyIHwgbnVsbCA9IG51bGxcbiAgICAgICAgY29uc3QgY2xvbmVBZ2VudHNSb2xlQmxvY2tlZCA9IGlzTWFpYUNsb25lQWdlbnRzUm9sZUJsb2NrZWQodXNlciwgc2VjdGlvbilcbiAgICAgICAgY29uc3QgY2FuRmV0Y2hDbG9uZUFnZW50cyA9ICFjbG9uZUFnZW50c1JvbGVCbG9ja2VkXG5cbiAgICAgICAgY29uc3QgZmV0Y2hHbG9iYWxDbG9uZUFnZW50cyA9IGFzeW5jICgpOiBQcm9taXNlPEFnZW50W10+ID0+IHtcbiAgICAgICAgICBpZiAoIWlzTWFya2V0cGxhY2VNYWlha2VyRW5hYmxlZCgpIHx8ICFjYW5GZXRjaENsb25lQWdlbnRzKSByZXR1cm4gW11cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY2xvbmVSZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgIHBhdGg6IGBhZ2VudHM/YWdlbnRfdHlwZT1jbG9uZSZlbnRpdHk9Z2xvYmFsJmxhbmc9JHttYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpfWAsXG4gICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc3QgY2xvbmVEYXRhID0gYXdhaXQgY2xvbmVSZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgIHJldHVybiAoY2xvbmVEYXRhLmRhdGEgfHwgW10pLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlID09PSAnY2xvbmUnKVxuICAgICAgICAgIH0gY2F0Y2ggKGNsb25lRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpczQwM0FnZW50RmV0Y2hFcnJvcihjbG9uZUVycm9yKSkgcmV0dXJuIFtdXG4gICAgICAgICAgICB0aHJvdyBjbG9uZUVycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2kgdGllbmUgZmVhdHVyZSBhY2Nlc3MgbXVsdGkgYWdlbnRzLCBoYWNlciBkb3MgcXVlcmllcyAoTWFpYSArIGN1c3RvbSkgZW4gY3VhbHF1aWVyIHNlY2Npw7NuXG4gICAgICAgIGlmIChpc011bHRpQWdlbnRzKSB7XG4gICAgICAgICAgLy8gUXVlcnkgY2xvbmUgKE1haWEpIHkgY3VzdG9tIHNvbiBpbmRlcGVuZGllbnRlcyDihpIgc2UgZGlzcGFyYW4gZW4gcGFyYWxlbG8uXG4gICAgICAgICAgbGV0IGN1c3RvbUFnZW50czogQWdlbnRbXSA9IFtdXG4gICAgICAgICAgbGV0IGN1c3RvbUhhc01vcmUgPSBmYWxzZVxuICAgICAgICAgIGxldCBjdXN0b21OZXh0T2Zmc2V0OiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gICAgICAgICAgY29uc3QgaXM0MDMgPSBpczQwM0FnZW50RmV0Y2hFcnJvclxuXG4gICAgICAgICAgbGV0IG1haWFBZ2VudHM6IEFnZW50W10gPSBbXVxuXG4gICAgICAgICAgY29uc3QgbG9hZENsb25lQWdlbnRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjYW5GZXRjaENsb25lQWdlbnRzKSByZXR1cm5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1haWFSZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgICAgcGF0aDogYGFnZW50cz9hZ2VudF90eXBlPW9yY2hlc3RyYXRvciZsYW5nPSR7bWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKX1gLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnN0IG1haWFEYXRhID0gYXdhaXQgbWFpYVJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgICBtYWlhQWdlbnRzID0gbWFpYURhdGEuZGF0YT8uZmlsdGVyKGlzTWFpYUFnZW50KSB8fCBbXVxuICAgICAgICAgICAgICBjb25zdCBnbG9iYWxDbG9uZUFnZW50cyA9IGF3YWl0IGZldGNoR2xvYmFsQ2xvbmVBZ2VudHMoKVxuICAgICAgICAgICAgICBtYWlhQWdlbnRzID0gbWVyZ2VBZ2VudHNXaXRob3V0RHVwbGljYXRlcyhtYWlhQWdlbnRzLCBnbG9iYWxDbG9uZUFnZW50cylcbiAgICAgICAgICAgIH0gY2F0Y2ggKG1haWFFcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgICAvLyBTaSBlcyA0MDMsIGNvbnRpbnVhciBzaW4gbG9zIGNsb25lQWdlbnRzOyBzaSBlcyBvdHJvIGVycm9yLCBwcm9wYWdhcmxvXG4gICAgICAgICAgICAgIGlmICghaXM0MDMobWFpYUVycm9yKSkgdGhyb3cgbWFpYUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbG9hZEN1c3RvbUFnZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbVJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnYWdlbnRzP2FnZW50X3R5cGU9Y3VzdG9tJmxpbWl0PTcmb2Zmc2V0PTAnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbURhdGEgPSBhd2FpdCBjdXN0b21SZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgY3VzdG9tQWdlbnRzID0gY3VzdG9tRGF0YS5kYXRhIHx8IFtdXG4gICAgICAgICAgICAgIGN1c3RvbUhhc01vcmUgPSBjdXN0b21EYXRhLmhhc19tb3JlIHx8IGZhbHNlXG4gICAgICAgICAgICAgIGN1c3RvbU5leHRPZmZzZXQgPSBjdXN0b21EYXRhLm5leHRfb2Zmc2V0IHx8IG51bGxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGN1c3RvbUVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgLy8gU2kgZXMgNDAzLCBjb250aW51YXIgc2luIGxvcyBjdXN0b21BZ2VudHMgKHF1ZWRhIGNvbW8gYXJyYXkgdmFjw61vKTsgc2kgbm8sIHByb3BhZ2FybG9cbiAgICAgICAgICAgICAgaWYgKCFpczQwMyhjdXN0b21FcnJvcikpIHRocm93IGN1c3RvbUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW2xvYWRDbG9uZUFnZW50cygpLCBsb2FkQ3VzdG9tQWdlbnRzKCldKVxuXG4gICAgICAgICAgLy8gQ29tYmluYXI6IGFnZW50ZXMgY2xvbmUgcHJpbWVybywgbHVlZ28gbG9zIGN1c3RvbSAoc2kgZXhpc3RlbilcbiAgICAgICAgICAvLyBTaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHJvbCBkZXNoYWJpbGl0YWRvLCBubyBpbmNsdWlyIGNsb25lQWdlbnRzXG4gICAgICAgICAgaWYgKCFjYW5GZXRjaENsb25lQWdlbnRzKSB7XG4gICAgICAgICAgICAvLyBSb2wgc2luIGFjY2VzbyBhIGNsb25lcyAocC4gZWouIGZyZWVsYW5jZXIvY2xpZW50ZSBvIGNvbGFib3JhZG9yIGVuIHByb2plY3QvY2xpZW50KTogc29sbyBjdXN0b21BZ2VudHNcbiAgICAgICAgICAgIC8vIFNpIGN1c3RvbUFnZW50cyBlc3TDoSB2YWPDrW8gKHBvciA0MDMpLCBhZ2VudFBhcnNlZCBzZXLDoSBbXVxuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBjdXN0b21BZ2VudHNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBtYWlhQWdlbnRzLmxlbmd0aCA/IFsuLi5tYWlhQWdlbnRzLCAuLi5jdXN0b21BZ2VudHNdIDogY3VzdG9tQWdlbnRzXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE9yZGVuYXI6IE1haWEgcHJpbWVybywgbHVlZ28gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGUsIGx1ZWdvIG5vIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlXG4gICAgICAgICAgYWdlbnRQYXJzZWQgPSBzb3J0QWdlbnRzKGFnZW50UGFyc2VkKVxuICAgICAgICAgIGhhc01vcmUgPSBjdXN0b21IYXNNb3JlXG4gICAgICAgICAgbmV4dE9mZnNldCA9IGN1c3RvbU5leHRPZmZzZXRcblxuICAgICAgICAgIHNldEFnZW50cyh7XG4gICAgICAgICAgICBkYXRhOiBhZ2VudFBhcnNlZCxcbiAgICAgICAgICAgIGhhc19tb3JlOiBoYXNNb3JlLFxuICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IG5leHRPZmZzZXQsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIFNpIG5vIGhheSBhZ2VudGVzIGRlc3B1w6lzIGRlIHByb2Nlc2FyIGxhcyBxdWVyaWVzLCBsaW1waWFyIGVsIGVycm9yXG4gICAgICAgICAgaWYgKGFnZW50UGFyc2VkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgc2V0RXJyb3IobnVsbClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTMOzZ2ljYSBwYXJhIHByb2plY3QsIGNsaWVudCBvIGhlYWRlciBzaW4gbXVsdGlBZ2VudHMgKG1pc21vIGNyaXRlcmlvIGRlIG9yZGVuIHByb2plY3QvY2xpZW50OyBoZWFkZXIgYcOxYWRlIHBhZ2luYWNpw7NuKVxuICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gICAgICAgICAgaWYgKHNlY3Rpb24gPT09ICdwcm9qZWN0JyB8fCBzZWN0aW9uID09PSAnY2xpZW50JyB8fCBzZWN0aW9uID09PSAnaGVhZGVyJyB8fCBzZWN0aW9uID09PSAndGFzaycpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnYWdlbnRfdHlwZScsICdvcmNoZXN0cmF0b3InKVxuICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdsYW5nJywgbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSlcbiAgICAgICAgICAgIGlmIChzZWN0aW9uID09PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xpbWl0JywgJzcnKVxuICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ29mZnNldCcsICcwJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBxdWVyeVN0cmluZyA9IHF1ZXJ5UGFyYW1zLnRvU3RyaW5nKClcbiAgICAgICAgICBjb25zdCBwYXRoID0gYGFnZW50cyR7cXVlcnlTdHJpbmcgPyBgPyR7cXVlcnlTdHJpbmd9YCA6ICcnfWBcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAvLyBkYXRhLmRhdGEgeWEgY29udGllbmUgZWwvbG9zIGFnZW50ZXMgb3JxdWVzdGFkb3JlcyBkZSBsYSBxdWVyeSBhZ2VudF90eXBlPW9yY2hlc3RyYXRvclxuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBkYXRhLmRhdGEgfHwgW11cbiAgICAgICAgICAgIGNvbnN0IGdsb2JhbENsb25lQWdlbnRzID0gYXdhaXQgZmV0Y2hHbG9iYWxDbG9uZUFnZW50cygpXG4gICAgICAgICAgICBhZ2VudFBhcnNlZCA9IG1lcmdlQWdlbnRzV2l0aG91dER1cGxpY2F0ZXMoYWdlbnRQYXJzZWQsIGdsb2JhbENsb25lQWdlbnRzKVxuICAgICAgICAgICAgLy8gT3JkZW5hcjogTWFpYSBwcmltZXJvLCBsdWVnbyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZSwgbHVlZ28gbm8gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGVcbiAgICAgICAgICAgIGFnZW50UGFyc2VkID0gc29ydEFnZW50cyhhZ2VudFBhcnNlZClcbiAgICAgICAgICAgIGhhc01vcmUgPSBkYXRhLmhhc19tb3JlXG4gICAgICAgICAgICBuZXh0T2Zmc2V0ID0gZGF0YS5uZXh0X29mZnNldFxuXG4gICAgICAgICAgICBzZXRBZ2VudHMoe1xuICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICBkYXRhOiBhZ2VudFBhcnNlZCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBjYXRjaCAocmVzcG9uc2VFcnJvcjogYW55KSB7XG4gICAgICAgICAgICAvLyBWZXJpZmljYXIgc2kgZWwgZXJyb3IgZXMgNDAzXG4gICAgICAgICAgICAvLyBmZXRjaENPUiBwdWVkZSBsYW56YXIgZGlmZXJlbnRlcyB0aXBvcyBkZSBlcnJvcmVzOlxuICAgICAgICAgICAgLy8gMS4gRXJyb3IgY29uIGVycm9yRGF0YS5kZXRhaWwgc2kgaW5jbHV5ZSAnQWNjZXNzIGRlbmllZCdcbiAgICAgICAgICAgIC8vIDIuIEVycm9yIGdlbsOpcmljbyAnRmFpbGVkIGZldGNoaW5nIGRhdGEnIHNpIGVzIDQwMyBwZXJvIG5vIGluY2x1eWUgJ0FjY2VzcyBkZW5pZWQnXG4gICAgICAgICAgICAvLyAzLiBOZWNlc2l0YW1vcyB2ZXJpZmljYXIgZWwgc3RhdHVzIGNvZGUgc2kgZXN0w6EgZGlzcG9uaWJsZVxuICAgICAgICAgICAgY29uc3QgaXM0MDNFcnJvciA9XG4gICAgICAgICAgICAgIHJlc3BvbnNlRXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgICAgICAgICAgICByZXNwb25zZUVycm9yPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgICAgICAgICAgICByZXNwb25zZUVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcyhcIllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldyBhZ2VudHNcIikgfHxcbiAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ0ZhaWxlZCBmZXRjaGluZyBkYXRhJykgLy8gZmV0Y2hDT1IgbGFuemEgZXN0byBwYXJhIDQwMyBzaW4gJ0FjY2VzcyBkZW5pZWQnXG5cbiAgICAgICAgICAgIGlmIChpczQwM0Vycm9yKSB7XG4gICAgICAgICAgICAgIC8vIFNpIGVzIDQwMywgZXN0YWJsZWNlciBhZ2VudGVzIHZhY8Otb3MgeSBjb250aW51YXJcbiAgICAgICAgICAgICAgc2V0QWdlbnRzKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgICAgICBoYXNfbW9yZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IG51bGwsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHNldEVycm9yKG51bGwpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBTaSBlcyBvdHJvIGVycm9yLCBsYW56YXJsb1xuICAgICAgICAgICAgICB0aHJvdyByZXNwb25zZUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTMOzZ2ljYSBkZSBzZWxlY3QgYWdlbnQgLSBTb2xvIHNlbGVjY2lvbmFyIHNpIGhheSBhZ2VudGVzIGRpc3BvbmlibGVzXG4gICAgICAgIGlmIChhZ2VudFBhcnNlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKGFnZW50VG9TZWxlY3QgJiYgYWdlbnRQYXJzZWQuZmluZCgoYWdlbnRUb1JlcXVlc3Q6IEFnZW50KSA9PiBhZ2VudFRvUmVxdWVzdC5pZCA9PT0gYWdlbnRUb1NlbGVjdC5pZCkpIHtcbiAgICAgICAgICAgIGlmIChsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50Py5pZCAhPT0gYWdlbnRUb1NlbGVjdC5pZCkge1xuICAgICAgICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gYWdlbnRUb1NlbGVjdFxuICAgICAgICAgICAgICBzZWxlY3RBZ2VudChhZ2VudFRvU2VsZWN0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWdlbnRQYXJzZWQ/LlswXSAmJiAoIWFnZW50IHx8ICFhZ2VudFBhcnNlZC5maW5kKChhOiBBZ2VudCkgPT4gYS5pZCA9PT0gYWdlbnQuaWQpKSkge1xuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdlbnRzID1cbiAgICAgICAgICAgICAgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyAmJiAhY2xvbmVBZ2VudHNSb2xlQmxvY2tlZFxuICAgICAgICAgICAgICAgID8gYWdlbnRQYXJzZWRcbiAgICAgICAgICAgICAgICA6IGFnZW50UGFyc2VkLmZpbHRlcigoYWdlbnRJdGVtOiBBZ2VudCkgPT4gIWlzTWFpYUFnZW50KGFnZW50SXRlbSkpXG5cbiAgICAgICAgICAgIGNvbnN0IFtmaXJzdEFnZW50XSA9IGF2YWlsYWJsZUFnZW50c1xuICAgICAgICAgICAgaWYgKGZpcnN0QWdlbnQgJiYgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudD8uaWQgIT09IGZpcnN0QWdlbnQuaWQpIHtcbiAgICAgICAgICAgICAgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudCA9IGZpcnN0QWdlbnRcbiAgICAgICAgICAgICAgc2VsZWN0QWdlbnQoZmlyc3RBZ2VudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFnZW50VG9TZWxlY3QgJiYgYWdlbnRQYXJzZWQ/Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdlbnRzID1cbiAgICAgICAgICAgICAgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyAmJiAhY2xvbmVBZ2VudHNSb2xlQmxvY2tlZFxuICAgICAgICAgICAgICAgID8gYWdlbnRQYXJzZWRcbiAgICAgICAgICAgICAgICA6IGFnZW50UGFyc2VkLmZpbHRlcigoYWdlbnRJdGVtOiBBZ2VudCkgPT4gIWlzTWFpYUFnZW50KGFnZW50SXRlbSkpXG5cbiAgICAgICAgICAgIGNvbnN0IFtmaXJzdEF2YWlsYWJsZUFnZW50XSA9IGF2YWlsYWJsZUFnZW50c1xuICAgICAgICAgICAgaWYgKGZpcnN0QXZhaWxhYmxlQWdlbnQgJiYgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudD8uaWQgIT09IGZpcnN0QXZhaWxhYmxlQWdlbnQuaWQpIHtcbiAgICAgICAgICAgICAgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudCA9IGZpcnN0QXZhaWxhYmxlQWdlbnRcbiAgICAgICAgICAgICAgc2VsZWN0QWdlbnQoZmlyc3RBdmFpbGFibGVBZ2VudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNldEVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCcpXG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpc1JlZnJlc2hpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICghaXNSZWZyZXNoaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGxhc3RSZXF1ZXN0UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApXG4gICAgICB9XG4gICAgfSxcbiAgICBbc2VsZWN0QWdlbnQsIHNlY3Rpb24sIGFnZW50LCBsb2FkaW5nXVxuICApXG5cbiAgY29uc3QgbG9hZE1vcmVBZ2VudHMgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaXNNdWx0aUFnZW50cyA9ICEhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyAmJiAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTXG4gICAgLy8gQ2FyZ2FyIG3DoXM6IGVuIGhlYWRlciBzaWVtcHJlOyBlbiBwcm9qZWN0IHNvbG8gc2kgaXNNdWx0aUFnZW50cyAocG9ycXVlIHNvbG8gZW50b25jZXMgaGF5IHBhZ2luYWNpw7NuIGRlIGN1c3RvbSlcbiAgICBjb25zdCBjYW5Mb2FkTW9yZSA9IHNlY3Rpb24gPT09ICdoZWFkZXInIHx8IGlzTXVsdGlBZ2VudHNcbiAgICBpZiAoIWNhbkxvYWRNb3JlIHx8ICFhZ2VudHMuaGFzX21vcmUgfHwgIWFnZW50cy5uZXh0X29mZnNldCB8fCBsb2FkaW5nTW9yZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0TG9hZGluZ01vcmUodHJ1ZSlcbiAgICBzZXRFcnJvcihudWxsKVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBwYXRoOiBzdHJpbmdcblxuICAgICAgLy8gU2kgZXMgbXVsdGlBZ2VudHMsIHNvbG8gY2FyZ2FyIGFnZW50cyBjdXN0b20gKE1haWEgeWEgZXN0w6EgY2FyZ2FkbylcbiAgICAgIGlmIChpc011bHRpQWdlbnRzKSB7XG4gICAgICAgIC8vIE1hbnRlbmVyIGNhbnRpZGFkIGltcGFyIGRlIGNhcmRzOiBwcmltZXJhIGNhcmdhIDcsIHNpZ3VpZW50ZXMgKzYgKDcsIDEzLCAxOSwgLi4uKVxuICAgICAgICBwYXRoID0gYGFnZW50cz9hZ2VudF90eXBlPWN1c3RvbSZsaW1pdD02Jm9mZnNldD0ke2FnZW50cy5uZXh0X29mZnNldH1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaSBubyBlcyBtdWx0aUFnZW50cywgY2FyZ2FyIG3DoXMgYWdlbnRlcyBvcnF1ZXN0YWRvcmVzIChNQUlBKVxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2FnZW50X3R5cGUnLCAnb3JjaGVzdHJhdG9yJylcbiAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdsYW5nJywgbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSlcbiAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdsaW1pdCcsICc3JylcbiAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdvZmZzZXQnLCBhZ2VudHMubmV4dF9vZmZzZXQudG9TdHJpbmcoKSlcbiAgICAgICAgcGF0aCA9IGBhZ2VudHM/JHtxdWVyeVBhcmFtcy50b1N0cmluZygpfWBcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaE1haWEoe1xuICAgICAgICBwYXRoLFxuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICAvLyBBY3VtdWxhciBhZ2VudGVzLCBleGNsdXllbmRvIGR1cGxpY2Fkb3NcbiAgICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgICAgaWYgKGlzTXVsdGlBZ2VudHMpIHtcbiAgICAgICAgICAvLyBMw7NnaWNhIHBhcmEgbXVsdGlBZ2VudHM6IHNlcGFyYXIgTUFJQSB5IGN1c3RvbVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTWFpYUFnZW50cyA9IHByZXYuZGF0YS5maWx0ZXIoaXNNYWlhQWdlbnQpXG5cbiAgICAgICAgICAvLyBPYnRlbmVyIElEcyBleGlzdGVudGVzIChleGNsdXllbmRvIE1BSUEpXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYuZGF0YS5maWx0ZXIoKGFnOiBBZ2VudCkgPT4gIWlzTWFpYUFnZW50KGFnKSkubWFwKChhZzogQWdlbnQpID0+IGFnLmlkKSlcblxuICAgICAgICAgIC8vIEZpbHRyYXIgbnVldm9zIGFnZW50cyBxdWUgbm8gZXN0w6luIHlhIGVuIGxhIGxpc3RhICh5IHF1ZSBubyBzZWFuIE1BSUEpXG4gICAgICAgICAgY29uc3QgbmV3QWdlbnRzID0gZGF0YS5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiAhaXNNYWlhQWdlbnQoYWcpICYmICFleGlzdGluZ0lkcy5oYXMoYWcuaWQpKVxuXG4gICAgICAgICAgY29uc3QgbmV3RGF0YSA9IGV4aXN0aW5nTWFpYUFnZW50cy5sZW5ndGhcbiAgICAgICAgICAgID8gWy4uLmV4aXN0aW5nTWFpYUFnZW50cywgLi4ucHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiAhaXNNYWlhQWdlbnQoYWcpKSwgLi4ubmV3QWdlbnRzXVxuICAgICAgICAgICAgOiBbLi4ucHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiAhaXNNYWlhQWdlbnQoYWcpKSwgLi4ubmV3QWdlbnRzXVxuXG4gICAgICAgICAgLy8gT3JkZW5hcjogTWFpYSBwcmltZXJvLCBsdWVnbyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZSwgbHVlZ28gbm8gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGVcbiAgICAgICAgICBjb25zdCBzb3J0ZWREYXRhID0gc29ydEFnZW50cyhuZXdEYXRhKVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICAgICAgICBoYXNfbW9yZTogZGF0YS5oYXNfbW9yZSxcbiAgICAgICAgICAgIG5leHRfb2Zmc2V0OiBkYXRhLm5leHRfb2Zmc2V0LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBMw7NnaWNhIHBhcmEgIWlzTXVsdGlBZ2VudHM6IGFncmVnYXIgZXZpdGFuZG8gZHVwbGljYWRvc1xuICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5kYXRhLm1hcCgoYWc6IEFnZW50KSA9PiBhZy5pZCkpXG4gICAgICAgIGNvbnN0IG5ld0FnZW50cyA9IChkYXRhLmRhdGEgfHwgW10pLmZpbHRlcigoYWc6IEFnZW50KSA9PiAhZXhpc3RpbmdJZHMuaGFzKGFnLmlkKSlcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IFsuLi5wcmV2LmRhdGEsIC4uLm5ld0FnZW50c11cblxuICAgICAgICAvLyBPcmRlbmFyOiBNYWlhIHByaW1lcm8sIGx1ZWdvIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlLCBsdWVnbyBubyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZVxuICAgICAgICBjb25zdCBzb3J0ZWREYXRhID0gc29ydEFnZW50cyhuZXdEYXRhKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogc29ydGVkRGF0YSxcbiAgICAgICAgICBoYXNfbW9yZTogZGF0YS5oYXNfbW9yZSxcbiAgICAgICAgICBuZXh0X29mZnNldDogZGF0YS5uZXh0X29mZnNldCxcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgc2V0TG9hZGluZ01vcmUoZmFsc2UpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBoYW5kbGVTbmFja2JhckVycm9yKHQoJ3NuYWNrYmFyLmxvYWRNb3JlQWdlbnRzLmVycm9yJykpXG4gICAgICBzZXRMb2FkaW5nTW9yZShmYWxzZSlcbiAgICB9XG4gIH0sIFtzZWN0aW9uLCBhZ2VudHMuaGFzX21vcmUsIGFnZW50cy5uZXh0X29mZnNldCwgbG9hZGluZ01vcmUsIGkxOG4ubGFuZ3VhZ2VdKVxuXG4gIHJldHVybiB7XG4gICAgYWdlbnRzLFxuICAgIGxvYWRpbmcsXG4gICAgbG9hZGluZ01vcmUsXG4gICAgZXJyb3IsXG4gICAgaGFuZGxlR2V0QWdlbnRzLFxuICAgIGxvYWRNb3JlQWdlbnRzLFxuICAgIGFkZEFnZW50LFxuICAgIHJlbW92ZUFnZW50LFxuICAgIHVwZGF0ZUFnZW50LFxuICAgIHVwZGF0ZUFnZW50RmF2b3JpdGUsXG4gICAgc2VsZWN0Rmlyc3RBZ2VudCxcbiAgICBzb3J0QWdlbnRzTGlzdCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsUUFBUSxFQUFFQyxXQUFXLEVBQUVDLE1BQU0sUUFBUSxPQUFPO0FBQ3JELFNBQVNDLGNBQWMsUUFBUSxlQUFlO0FBQzlDLFNBQVND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
667
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUNhbGxiYWNrIiwidXNlUmVmIiwidXNlVHJhbnNsYXRpb24iLCJ1c2VTbmFja0Jhck1hbmFnZXIiLCJmZXRjaE1haWEiLCJ3aXRoTm9ybWFsaXplZENvbm5lY3RvcnMiLCJ1c2VVc2VyIiwiaXNNYWlhQ2xvbmVBZ2VudHNSb2xlQmxvY2tlZCIsIm1hcENPUkxhbmciLCJzb3J0QWdlbnRzIiwiYWdlbnRzIiwiY2xvbmVBZ2VudHMiLCJmaWx0ZXIiLCJhZyIsInR5cGUiLCJvdGhlckFnZW50cyIsImZhdm9yaXRlcyIsImlzX2Zhdm9yaXRlIiwic29ydCIsImEiLCJiIiwibmFtZSIsImxvY2FsZUNvbXBhcmUiLCJub25GYXZvcml0ZXMiLCJsZW5ndGgiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJub3JtYWxpemVDdXN0b21BZ2VudHNGcm9tQXBpIiwibWFwIiwiYWdlbnQiLCJ1c2VHZXRBZ2VudHMiLCJfcmVmIiwic2VsZWN0QWdlbnQiLCJzZWN0aW9uIiwiaGFuZGxlR29Ib21lIiwidXNlciIsIl91c2VTdGF0ZSIsImRhdGEiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXRBZ2VudHMiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJsb2FkaW5nTW9yZSIsInNldExvYWRpbmdNb3JlIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJzZWFyY2hMb2FkaW5nIiwic2V0U2VhcmNoTG9hZGluZyIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwiZXJyb3IiLCJzZXRFcnJvciIsIl91c2VTbmFja0Jhck1hbmFnZXIiLCJoYW5kbGVTbmFja2JhckVycm9yIiwiX3VzZVRyYW5zbGF0aW9uIiwidCIsImkxOG4iLCJsYXN0U2VsZWN0ZWRBZ2VudFJlZiIsImlzUmVmcmVzaGluZ1JlZiIsImxhc3RSZXF1ZXN0UmVmIiwiYWdlbnRzUmVmIiwicHJlU2VhcmNoQWdlbnRzUmVmIiwiY3VycmVudCIsImNhbkZldGNoQ2xvbmVBZ2VudHMiLCJhZGRBZ2VudCIsIm5ld0FnZW50Iiwib3B0aW9ucyIsInByZXYiLCJhZ2VudEV4aXN0cyIsInNvbWUiLCJleGlzdGluZ0FnZW50IiwiaWQiLCJuZXdEYXRhIiwic29ydGVkRGF0YSIsIl9vYmplY3RTcHJlYWQiLCJuYXZpZ2F0ZUhvbWUiLCJyZW1vdmVBZ2VudCIsImFnZW50SWQiLCJ0b1N0cmluZyIsInVwZGF0ZUFnZW50IiwidXBkYXRlZEFnZW50IiwidXBkYXRlZERhdGEiLCJ1cGRhdGVBZ2VudEZhdm9yaXRlIiwic2hvdWxkU29ydCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsIl9yZWYyIiwibWVzc2FnZSIsImFnZW50RmllbGRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwibWVyZ2VkQWdlbnQiLCJmaW5hbERhdGEiLCJmaW5kIiwiX3JlZjMiLCJfZXhjbHVkZWQyIiwiX3JlZjQiLCJfZXhjbHVkZWQzIiwic29ydEFnZW50c0xpc3QiLCJzZWxlY3RGaXJzdEFnZW50IiwiZmlyc3RBZ2VudCIsImZpbmRJbmRleCIsImFnZW50RGF0YSIsImhhbmRsZUdldEFnZW50cyIsIl9yZWY1IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUzIiwiYWdlbnRUb1NlbGVjdCIsIl9hZ2VudFRvU2VsZWN0JGlkIiwicmVxdWVzdEtleSIsImlzTXVsdGlBZ2VudHMiLCJhZ2VudFBhcnNlZCIsImhhc01vcmUiLCJuZXh0T2Zmc2V0IiwiY3VzdG9tQWdlbnRzIiwiY3VzdG9tSGFzTW9yZSIsImN1c3RvbU5leHRPZmZzZXQiLCJpczQwMyIsImxvYWRDbG9uZUFnZW50cyIsImxvYWRDdXN0b21BZ2VudHMiLCJzaG91bGRSZXF1ZXN0Q2xvbmVBZ2VudHMiLCJxdWVyeVBhcmFtcyIsInBhdGgiLCJyZXNwb25zZSIsIl9yZXNwb25zZUVycm9yJHJlc3BvbiIsIl9yZXNwb25zZUVycm9yJG1lc3NhZyIsIl9yZXNwb25zZUVycm9yJG1lc3NhZzIiLCJpczQwM0Vycm9yIiwiX2FnZW50UGFyc2VkIiwiX2FnZW50UGFyc2VkMiIsIl9sYXN0U2VsZWN0ZWRBZ2VudFJlZiIsIl9sYXN0U2VsZWN0ZWRBZ2VudFJlZjIiLCJhdmFpbGFibGVBZ2VudHMiLCJfYXZhaWxhYmxlQWdlbnRzIiwiX2xhc3RTZWxlY3RlZEFnZW50UmVmMyIsIl9hdmFpbGFibGVBZ2VudHMyIiwiX2F2YWlsYWJsZUFnZW50czMiLCJmaXJzdEF2YWlsYWJsZUFnZW50IiwiX3QzIiwiX3Q0Iiwid3JhcCIsIl9jb250ZXh0MyIsIm5leHQiLCJhYnJ1cHQiLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MiLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwiZXJyIiwiX2VyciRyZXNwb25zZSIsIl9lcnIkbWVzc2FnZSIsIl9lcnIkbWVzc2FnZTIiLCJzdGF0dXMiLCJpbmNsdWRlcyIsIl9yZWY2IiwiX2NhbGxlZSIsIl9tYWlhRGF0YSRkYXRhIiwib3JkZXJQYXJhbSIsIm1haWFSZXNwb25zZSIsIm1haWFEYXRhIiwiX3QiLCJfY29udGV4dCIsImxhbmd1YWdlIiwibWV0aG9kIiwic2VudCIsImpzb24iLCJzdG9wIiwiYXBwbHkiLCJfcmVmNyIsIl9jYWxsZWUyIiwiY3VzdG9tUmVzcG9uc2UiLCJjdXN0b21EYXRhIiwiX3QyIiwiX2NvbnRleHQyIiwiaGFzX21vcmUiLCJuZXh0X29mZnNldCIsIlByb21pc2UiLCJhbGwiLCJVUkxTZWFyY2hQYXJhbXMiLCJhcHBlbmQiLCJhZ2VudFRvUmVxdWVzdCIsImFnZW50SXRlbSIsIkVycm9yIiwic2V0VGltZW91dCIsImZpbmlzaCIsIl94Iiwic2VhcmNoQ3VzdG9tQWdlbnRzIiwiX3JlZjgiLCJfY2FsbGVlNCIsInF1ZXJ5IiwiX3Q1IiwiX2NvbnRleHQ0IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiY3VzdG9tUmVzdWx0cyIsIl94MiIsImxvYWRNb3JlQWdlbnRzIiwiX2NhbGxlZTUiLCJjYW5Mb2FkTW9yZSIsIl90NiIsIl9jb250ZXh0NSIsImV4aXN0aW5nQ2xvbmVBZ2VudHMiLCJleGlzdGluZ0lkcyIsIlNldCIsIm5ld0FnZW50cyIsImhhcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9tYWlhL0FnZW50cy9nZXRBZ2VudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUNhbGxiYWNrLCB1c2VSZWYgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IHVzZVNuYWNrQmFyTWFuYWdlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVNuYWNrQmFyTWFuYWdlci91c2VTbmFja0Jhck1hbmFnZXInXG5pbXBvcnQgeyBmZXRjaE1haWEgfSBmcm9tICcuLi9jbGllbnQnXG5pbXBvcnQgeyB3aXRoTm9ybWFsaXplZENvbm5lY3RvcnMgfSBmcm9tICcuLi8uLi8uLi91dGlscy9ub3JtYWxpemVBZ2VudENvbm5lY3RvcnMnXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2FnZW50J1xuaW1wb3J0IHsgdXNlVXNlciB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyBpc01haWFDbG9uZUFnZW50c1JvbGVCbG9ja2VkIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL21haWFUYXNrUGFuZWxBY2Nlc3MnXG5pbXBvcnQgeyBtYXBDT1JMYW5nIH0gZnJvbSAnLi4vLi4vLi4vbGFuZy91dGlscydcblxuY29uc3Qgc29ydEFnZW50cyA9IChhZ2VudHM6IEFnZW50W10pOiBBZ2VudFtdID0+IHtcbiAgLy8gU2VwYXJhciBhZ2VudGVzIGNsb25lIGRlbCByZXN0b1xuICBjb25zdCBjbG9uZUFnZW50cyA9IGFnZW50cy5maWx0ZXIoYWcgPT4gYWcudHlwZSA9PT0gJ2Nsb25lJylcbiAgY29uc3Qgb3RoZXJBZ2VudHMgPSBhZ2VudHMuZmlsdGVyKGFnID0+IGFnLnR5cGUgIT09ICdjbG9uZScpXG5cbiAgLy8gU2VwYXJhciBmYXZvcml0b3MgeSBubyBmYXZvcml0b3NcbiAgY29uc3QgZmF2b3JpdGVzID0gb3RoZXJBZ2VudHMuZmlsdGVyKGFnID0+IGFnLmlzX2Zhdm9yaXRlKS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKVxuICBjb25zdCBub25GYXZvcml0ZXMgPSBvdGhlckFnZW50cy5maWx0ZXIoYWcgPT4gIWFnLmlzX2Zhdm9yaXRlKS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKVxuXG4gIC8vIENvbWJpbmFyOiBjbG9uZXMgcHJpbWVybywgbHVlZ28gZmF2b3JpdG9zLCBsdWVnbyBubyBmYXZvcml0b3NcbiAgcmV0dXJuIGNsb25lQWdlbnRzLmxlbmd0aCA/IFsuLi5jbG9uZUFnZW50cywgLi4uZmF2b3JpdGVzLCAuLi5ub25GYXZvcml0ZXNdIDogWy4uLmZhdm9yaXRlcywgLi4ubm9uRmF2b3JpdGVzXVxufVxuXG5jb25zdCBub3JtYWxpemVDdXN0b21BZ2VudHNGcm9tQXBpID0gKGFnZW50czogQWdlbnRbXSk6IEFnZW50W10gPT5cbiAgYWdlbnRzLm1hcChhZ2VudCA9PiAoYWdlbnQudHlwZSA9PT0gJ2N1c3RvbScgPyB3aXRoTm9ybWFsaXplZENvbm5lY3RvcnMoYWdlbnQpIDogYWdlbnQpKVxuXG50eXBlIFVzZUdldEFnZW50c1Byb3BzID0ge1xuICBzZWxlY3RBZ2VudDogKGFnZW50OiBBZ2VudCkgPT4gdm9pZFxuICBzZWN0aW9uOiAncHJvamVjdCcgfCAnaGVhZGVyJyB8ICdjbGllbnQnIHwgJ3Rhc2snXG4gIGFnZW50OiBBZ2VudCB8IG51bGxcbiAgaGFuZGxlR29Ib21lOiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCB0eXBlIEFkZEFnZW50T3B0aW9ucyA9IHtcbiAgLyoqIFBvciBkZWZlY3RvIGB0cnVlYCAoY29tcG9ydGFtaWVudG8gQUJNKS4gUGFzYXIgYGZhbHNlYCBhbCBpbnNlcnRhciBhZ2VudGUgY3JlYWRvIHBvciBjaGF0IHNpbiBjYW1iaWFyIGRlIHZpc3RhLiAqL1xuICBuYXZpZ2F0ZUhvbWU/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCB1c2VHZXRBZ2VudHMgPSAoeyBzZWxlY3RBZ2VudCwgc2VjdGlvbiwgYWdlbnQsIGhhbmRsZUdvSG9tZSB9OiBVc2VHZXRBZ2VudHNQcm9wcykgPT4ge1xuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IFthZ2VudHMsIHNldEFnZW50c10gPSB1c2VTdGF0ZTx7IGRhdGE6IEFnZW50W107IGhhc19tb3JlPzogYm9vbGVhbjsgbmV4dF9vZmZzZXQ/OiBudW1iZXIgfCBudWxsIH0+KHsgZGF0YTogW10gfSlcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtsb2FkaW5nTW9yZSwgc2V0TG9hZGluZ01vcmVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzZWFyY2hMb2FkaW5nLCBzZXRTZWFyY2hMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHsgaGFuZGxlU25hY2tiYXJFcnJvciB9ID0gdXNlU25hY2tCYXJNYW5hZ2VyKClcbiAgY29uc3QgeyB0LCBpMThuIH0gPSB1c2VUcmFuc2xhdGlvbignY2hhdF9haV9zZWN0aW9uJylcbiAgY29uc3QgbGFzdFNlbGVjdGVkQWdlbnRSZWYgPSB1c2VSZWY8QWdlbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBpc1JlZnJlc2hpbmdSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGxhc3RSZXF1ZXN0UmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGFnZW50c1JlZiA9IHVzZVJlZihhZ2VudHMpXG4gIGNvbnN0IHByZVNlYXJjaEFnZW50c1JlZiA9IHVzZVJlZjx7IGRhdGE6IEFnZW50W107IGhhc19tb3JlPzogYm9vbGVhbjsgbmV4dF9vZmZzZXQ/OiBudW1iZXIgfCBudWxsIH0gfCBudWxsPihudWxsKVxuXG4gIGFnZW50c1JlZi5jdXJyZW50ID0gYWdlbnRzXG5cbiAgY29uc3QgY2FuRmV0Y2hDbG9uZUFnZW50cyA9ICFpc01haWFDbG9uZUFnZW50c1JvbGVCbG9ja2VkKHVzZXIsIHNlY3Rpb24pXG5cbiAgY29uc3QgYWRkQWdlbnQgPSB1c2VDYWxsYmFjayhcbiAgICAobmV3QWdlbnQ6IEFnZW50LCBvcHRpb25zPzogQWRkQWdlbnRPcHRpb25zKSA9PiB7XG4gICAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICAgIC8vIFZlcmlmaWNhciBzaSBlbCBhZ2VudGUgeWEgZXhpc3RlIHBhcmEgZXZpdGFyIGR1cGxpY2Fkb3NcbiAgICAgICAgY29uc3QgYWdlbnRFeGlzdHMgPSBwcmV2LmRhdGEuc29tZShleGlzdGluZ0FnZW50ID0+IGV4aXN0aW5nQWdlbnQuaWQgPT09IG5ld0FnZW50LmlkKVxuICAgICAgICBpZiAoYWdlbnRFeGlzdHMpIHtcbiAgICAgICAgICByZXR1cm4gcHJldlxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0RhdGEgPSBbLi4ucHJldi5kYXRhLCBuZXdBZ2VudF1cbiAgICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHMobmV3RGF0YSlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAob3B0aW9ucz8ubmF2aWdhdGVIb21lICE9PSBmYWxzZSkge1xuICAgICAgICBoYW5kbGVHb0hvbWUoKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2hhbmRsZUdvSG9tZV1cbiAgKVxuXG4gIGNvbnN0IHJlbW92ZUFnZW50ID0gdXNlQ2FsbGJhY2soKGFnZW50SWQ6IG51bWJlciB8IHN0cmluZykgPT4ge1xuICAgIHNldEFnZW50cyhwcmV2ID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgZGF0YTogcHJldi5kYXRhLmZpbHRlcihhID0+IGEuaWQgIT09IGFnZW50SWQudG9TdHJpbmcoKSksXG4gICAgfSkpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZUFnZW50ID0gdXNlQ2FsbGJhY2soKHVwZGF0ZWRBZ2VudDogQWdlbnQpID0+IHtcbiAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHByZXYuZGF0YS5tYXAoZXhpc3RpbmdBZ2VudCA9PlxuICAgICAgICBleGlzdGluZ0FnZW50LmlkID09PSB1cGRhdGVkQWdlbnQuaWQgPyB1cGRhdGVkQWdlbnQgOiBleGlzdGluZ0FnZW50XG4gICAgICApXG4gICAgICBjb25zdCBzb3J0ZWREYXRhID0gc29ydEFnZW50cyh1cGRhdGVkRGF0YSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICB9XG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3QgdXBkYXRlQWdlbnRGYXZvcml0ZSA9IHVzZUNhbGxiYWNrKFxuICAgICh1cGRhdGVkQWdlbnQ6IEFnZW50LCBzaG91bGRTb3J0OiBib29sZWFuID0gZmFsc2UpID0+IHtcbiAgICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBwcmV2LmRhdGEubWFwKGV4aXN0aW5nQWdlbnQgPT4ge1xuICAgICAgICAgIGlmIChleGlzdGluZ0FnZW50LmlkID09PSB1cGRhdGVkQWdlbnQuaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4uYWdlbnRGaWVsZHMgfSA9IHVwZGF0ZWRBZ2VudCBhcyBhbnlcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZEFnZW50ID0geyAuLi5leGlzdGluZ0FnZW50LCAuLi5hZ2VudEZpZWxkcyB9XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VkQWdlbnRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQWdlbnRcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTb2xvIG9yZGVuYXIgc2kgc2hvdWxkU29ydCBlcyB0cnVlXG4gICAgICAgIGNvbnN0IGZpbmFsRGF0YSA9IHNob3VsZFNvcnQgPyBzb3J0QWdlbnRzKHVwZGF0ZWREYXRhKSA6IHVwZGF0ZWREYXRhXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIGRhdGE6IGZpbmFsRGF0YSxcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gQWN0dWFsaXphciBlbCBhZ2VudGUgc2VsZWNjaW9uYWRvIHNpIGVzIGVsIHF1ZSBzZSBlc3TDoSBhY3R1YWxpemFuZG9cbiAgICAgIGlmIChhZ2VudD8uaWQgPT09IHVwZGF0ZWRBZ2VudC5pZCkge1xuICAgICAgICBjb25zdCBleGlzdGluZ0FnZW50ID0gYWdlbnRzLmRhdGEuZmluZChhID0+IGEuaWQgPT09IHVwZGF0ZWRBZ2VudC5pZClcbiAgICAgICAgaWYgKGV4aXN0aW5nQWdlbnQpIHtcbiAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmFnZW50RmllbGRzIH0gPSB1cGRhdGVkQWdlbnQgYXMgYW55XG4gICAgICAgICAgY29uc3QgbWVyZ2VkQWdlbnQgPSB7IC4uLmV4aXN0aW5nQWdlbnQsIC4uLmFnZW50RmllbGRzIH1cbiAgICAgICAgICBzZWxlY3RBZ2VudChtZXJnZWRBZ2VudClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmFnZW50RmllbGRzIH0gPSB1cGRhdGVkQWdlbnQgYXMgYW55XG4gICAgICAgICAgc2VsZWN0QWdlbnQoYWdlbnRGaWVsZHMgYXMgQWdlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudCwgc2VsZWN0QWdlbnQsIGFnZW50cy5kYXRhXVxuICApXG5cbiAgY29uc3Qgc29ydEFnZW50c0xpc3QgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHMocHJldi5kYXRhKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgZGF0YTogc29ydGVkRGF0YSxcbiAgICAgIH1cbiAgICB9KVxuICB9LCBbXSlcblxuICBjb25zdCBzZWxlY3RGaXJzdEFnZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKGFnZW50SWQ/OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChhZ2VudHMuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmlyc3RBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmRJbmRleChhZ2VudERhdGEgPT4gYWdlbnREYXRhLmlkID09PSBhZ2VudElkKVxuICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gYWdlbnRzLmRhdGFbZmlyc3RBZ2VudCA9PT0gMCA/IDEgOiAwXVxuICAgICAgICBzZWxlY3RBZ2VudChhZ2VudHMuZGF0YVtmaXJzdEFnZW50ID09PSAwID8gMSA6IDBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FnZW50cy5kYXRhLCBzZWxlY3RBZ2VudF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZUdldEFnZW50cyA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChhZ2VudFRvU2VsZWN0PzogQWdlbnQpID0+IHtcbiAgICAgIGlmIChpc1JlZnJlc2hpbmdSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdEtleSA9IGFnZW50VG9TZWxlY3Q/LmlkPy50b1N0cmluZygpIHx8ICdkZWZhdWx0J1xuICAgICAgaWYgKGxhc3RSZXF1ZXN0UmVmLmN1cnJlbnQgPT09IHJlcXVlc3RLZXkgJiYgIWxvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlzUmVmcmVzaGluZ1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgbGFzdFJlcXVlc3RSZWYuY3VycmVudCA9IHJlcXVlc3RLZXlcbiAgICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICAgIHNldEVycm9yKG51bGwpXG5cbiAgICAgIGNvbnN0IGlzTXVsdGlBZ2VudHMgPSAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgJiYgISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgYWdlbnRQYXJzZWQ6IEFnZW50W10gPSBbXVxuICAgICAgICBsZXQgaGFzTW9yZSA9IGZhbHNlXG4gICAgICAgIGxldCBuZXh0T2Zmc2V0OiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gICAgICAgIC8vIFNpIHRpZW5lIGZlYXR1cmUgYWNjZXNzIG11bHRpIGFnZW50cywgaGFjZXIgZG9zIHF1ZXJpZXMgKE1haWEgKyBjdXN0b20pIGVuIGN1YWxxdWllciBzZWNjacOzblxuICAgICAgICBpZiAoaXNNdWx0aUFnZW50cykge1xuICAgICAgICAgIC8vIFF1ZXJ5IGNsb25lIChNYWlhKSB5IGN1c3RvbSBzb24gaW5kZXBlbmRpZW50ZXMg4oaSIHNlIGRpc3BhcmFuIGVuIHBhcmFsZWxvLlxuICAgICAgICAgIGxldCBjbG9uZUFnZW50czogQWdlbnRbXSA9IFtdXG4gICAgICAgICAgbGV0IGN1c3RvbUFnZW50czogQWdlbnRbXSA9IFtdXG4gICAgICAgICAgbGV0IGN1c3RvbUhhc01vcmUgPSBmYWxzZVxuICAgICAgICAgIGxldCBjdXN0b21OZXh0T2Zmc2V0OiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gICAgICAgICAgY29uc3QgaXM0MDMgPSAoZXJyOiBhbnkpOiBib29sZWFuID0+XG4gICAgICAgICAgICBlcnI/LnJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgICAgICAgICAgZXJyPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgICAgICAgICAgZXJyPy5tZXNzYWdlPy5pbmNsdWRlcyhcIllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldyBhZ2VudHNcIikgfHxcbiAgICAgICAgICAgIGVycj8ubWVzc2FnZT8uaW5jbHVkZXMoJ0ZhaWxlZCBmZXRjaGluZyBkYXRhJykgLy8gZmV0Y2hDT1IgbGFuemEgZXN0byBwYXJhIDQwMyBzaW4gJ0FjY2VzcyBkZW5pZWQnXG5cbiAgICAgICAgICBjb25zdCBsb2FkQ2xvbmVBZ2VudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNhbkZldGNoQ2xvbmVBZ2VudHMpIHJldHVyblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3Qgb3JkZXJQYXJhbSA9XG4gICAgICAgICAgICAgICAgc2VjdGlvbiA9PT0gJ2NsaWVudCdcbiAgICAgICAgICAgICAgICAgID8gJyZvcmRlcj1jbGllbnQscHJvamVjdCdcbiAgICAgICAgICAgICAgICAgIDogc2VjdGlvbiA9PT0gJ3Byb2plY3QnIHx8IHNlY3Rpb24gPT09ICdoZWFkZXInIHx8IHNlY3Rpb24gPT09ICd0YXNrJ1xuICAgICAgICAgICAgICAgICAgICA/ICcmb3JkZXI9cHJvamVjdCxjbGllbnQnXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgY29uc3QgbWFpYVJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgICBwYXRoOiBgYWdlbnRzP2FnZW50X3R5cGU9Y2xvbmUmbGFuZz0ke21hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSl9JHtvcmRlclBhcmFtfWAsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgY29uc3QgbWFpYURhdGEgPSBhd2FpdCBtYWlhUmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAgIGNsb25lQWdlbnRzID0gbWFpYURhdGEuZGF0YT8uZmlsdGVyKChhZzogQWdlbnQpID0+IGFnLnR5cGUgPT09ICdjbG9uZScpIHx8IFtdXG4gICAgICAgICAgICB9IGNhdGNoIChtYWlhRXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAvLyBTaSBlcyA0MDMsIGNvbnRpbnVhciBzaW4gbG9zIGNsb25lQWdlbnRzOyBzaSBlcyBvdHJvIGVycm9yLCBwcm9wYWdhcmxvXG4gICAgICAgICAgICAgIGlmICghaXM0MDMobWFpYUVycm9yKSkgdGhyb3cgbWFpYUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbG9hZEN1c3RvbUFnZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbVJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnYWdlbnRzP2FnZW50X3R5cGU9Y3VzdG9tJmxpbWl0PTcmb2Zmc2V0PTAnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbURhdGEgPSBhd2FpdCBjdXN0b21SZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgY3VzdG9tQWdlbnRzID0gbm9ybWFsaXplQ3VzdG9tQWdlbnRzRnJvbUFwaShjdXN0b21EYXRhLmRhdGEgfHwgW10pXG4gICAgICAgICAgICAgIGN1c3RvbUhhc01vcmUgPSBjdXN0b21EYXRhLmhhc19tb3JlIHx8IGZhbHNlXG4gICAgICAgICAgICAgIGN1c3RvbU5leHRPZmZzZXQgPSBjdXN0b21EYXRhLm5leHRfb2Zmc2V0IHx8IG51bGxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGN1c3RvbUVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgLy8gU2kgZXMgNDAzLCBjb250aW51YXIgc2luIGxvcyBjdXN0b21BZ2VudHMgKHF1ZWRhIGNvbW8gYXJyYXkgdmFjw61vKTsgc2kgbm8sIHByb3BhZ2FybG9cbiAgICAgICAgICAgICAgaWYgKCFpczQwMyhjdXN0b21FcnJvcikpIHRocm93IGN1c3RvbUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW2xvYWRDbG9uZUFnZW50cygpLCBsb2FkQ3VzdG9tQWdlbnRzKCldKVxuXG4gICAgICAgICAgLy8gQ29tYmluYXI6IGFnZW50ZXMgY2xvbmUgcHJpbWVybywgbHVlZ28gbG9zIGN1c3RvbSAoc2kgZXhpc3RlbilcbiAgICAgICAgICAvLyBTaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHJvbCBkZXNoYWJpbGl0YWRvLCBubyBpbmNsdWlyIGNsb25lQWdlbnRzXG4gICAgICAgICAgaWYgKCFjYW5GZXRjaENsb25lQWdlbnRzKSB7XG4gICAgICAgICAgICAvLyBSb2wgc2luIGFjY2VzbyBhIGNsb25lcyAocC4gZWouIGNvbGFib3JhZG9yIGZ1ZXJhIGRlbCBwaWxvdG8pOiBzb2xvIGN1c3RvbUFnZW50c1xuICAgICAgICAgICAgLy8gU2kgY3VzdG9tQWdlbnRzIGVzdMOhIHZhY8OtbyAocG9yIDQwMyksIGFnZW50UGFyc2VkIHNlcsOhIFtdXG4gICAgICAgICAgICBhZ2VudFBhcnNlZCA9IGN1c3RvbUFnZW50c1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSb2wgY29uIGFjY2VzbyBhIGNsb25lczogY2xvbmVBZ2VudHMgKyBjdXN0b21BZ2VudHNcbiAgICAgICAgICAgIC8vIFNpIGN1c3RvbUFnZW50cyBlc3TDoSB2YWPDrW8gKHBvciA0MDMpIHBlcm8gaGF5IGNsb25lQWdlbnRzLCBhZ2VudFBhcnNlZCB0ZW5kcsOhIGxvcyBjbG9uZXNcbiAgICAgICAgICAgIC8vIFNpIG5vIGhheSBjbG9uZUFnZW50cyBuaSBjdXN0b21BZ2VudHMsIGFnZW50UGFyc2VkIHNlcsOhIFtdXG4gICAgICAgICAgICBhZ2VudFBhcnNlZCA9IGNsb25lQWdlbnRzLmxlbmd0aCA/IFsuLi5jbG9uZUFnZW50cywgLi4uY3VzdG9tQWdlbnRzXSA6IGN1c3RvbUFnZW50c1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBPcmRlbmFyOiBNYWlhIHByaW1lcm8sIGx1ZWdvIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlLCBsdWVnbyBubyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZVxuICAgICAgICAgIGFnZW50UGFyc2VkID0gc29ydEFnZW50cyhhZ2VudFBhcnNlZClcbiAgICAgICAgICBoYXNNb3JlID0gY3VzdG9tSGFzTW9yZVxuICAgICAgICAgIG5leHRPZmZzZXQgPSBjdXN0b21OZXh0T2Zmc2V0XG5cbiAgICAgICAgICBzZXRBZ2VudHMoe1xuICAgICAgICAgICAgZGF0YTogYWdlbnRQYXJzZWQsXG4gICAgICAgICAgICBoYXNfbW9yZTogaGFzTW9yZSxcbiAgICAgICAgICAgIG5leHRfb2Zmc2V0OiBuZXh0T2Zmc2V0LFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICAvLyBTaSBubyBoYXkgYWdlbnRlcyBkZXNwdcOpcyBkZSBwcm9jZXNhciBsYXMgcXVlcmllcywgbGltcGlhciBlbCBlcnJvclxuICAgICAgICAgIGlmIChhZ2VudFBhcnNlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHNldEVycm9yKG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNob3VsZFJlcXVlc3RDbG9uZUFnZW50cyA9XG4gICAgICAgICAgICBjYW5GZXRjaENsb25lQWdlbnRzICYmXG4gICAgICAgICAgICAoc2VjdGlvbiA9PT0gJ3Byb2plY3QnIHx8IHNlY3Rpb24gPT09ICdjbGllbnQnIHx8IHNlY3Rpb24gPT09ICdoZWFkZXInIHx8IHNlY3Rpb24gPT09ICd0YXNrJylcblxuICAgICAgICAgIGlmICghc2hvdWxkUmVxdWVzdENsb25lQWdlbnRzKSB7XG4gICAgICAgICAgICBzZXRBZ2VudHMoeyBkYXRhOiBbXSwgaGFzX21vcmU6IGZhbHNlLCBuZXh0X29mZnNldDogbnVsbCB9KVxuICAgICAgICAgICAgc2V0RXJyb3IobnVsbClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnYWdlbnRfdHlwZScsICdjbG9uZScpXG4gICAgICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xhbmcnLCBtYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpKVxuICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdvcmRlcicsIHNlY3Rpb24gPT09ICdjbGllbnQnID8gJ2NsaWVudCxwcm9qZWN0JyA6ICdwcm9qZWN0LGNsaWVudCcpXG4gICAgICAgICAgICBpZiAoc2VjdGlvbiA9PT0gJ2hlYWRlcicpIHtcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdsaW1pdCcsICc3JylcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdvZmZzZXQnLCAnMCcpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBgYWdlbnRzPyR7cXVlcnlQYXJhbXMudG9TdHJpbmcoKX1gXG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgICBhZ2VudFBhcnNlZCA9IGRhdGEuZGF0YSB8fCBbXVxuICAgICAgICAgICAgICBhZ2VudFBhcnNlZCA9IHNvcnRBZ2VudHMoYWdlbnRQYXJzZWQpXG4gICAgICAgICAgICAgIGhhc01vcmUgPSBkYXRhLmhhc19tb3JlXG4gICAgICAgICAgICAgIG5leHRPZmZzZXQgPSBkYXRhLm5leHRfb2Zmc2V0XG5cbiAgICAgICAgICAgICAgc2V0QWdlbnRzKHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgIGRhdGE6IGFnZW50UGFyc2VkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBjYXRjaCAocmVzcG9uc2VFcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgIC8vIFZlcmlmaWNhciBzaSBlbCBlcnJvciBlcyA0MDNcbiAgICAgICAgICAgICAgLy8gZmV0Y2hDT1IgcHVlZGUgbGFuemFyIGRpZmVyZW50ZXMgdGlwb3MgZGUgZXJyb3JlczpcbiAgICAgICAgICAgICAgLy8gMS4gRXJyb3IgY29uIGVycm9yRGF0YS5kZXRhaWwgc2kgaW5jbHV5ZSAnQWNjZXNzIGRlbmllZCdcbiAgICAgICAgICAgICAgLy8gMi4gRXJyb3IgZ2Vuw6lyaWNvICdGYWlsZWQgZmV0Y2hpbmcgZGF0YScgc2kgZXMgNDAzIHBlcm8gbm8gaW5jbHV5ZSAnQWNjZXNzIGRlbmllZCdcbiAgICAgICAgICAgICAgLy8gMy4gTmVjZXNpdGFtb3MgdmVyaWZpY2FyIGVsIHN0YXR1cyBjb2RlIHNpIGVzdMOhIGRpc3BvbmlibGVcbiAgICAgICAgICAgICAgY29uc3QgaXM0MDNFcnJvciA9XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDAzIHx8XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8uc3RhdHVzID09PSA0MDMgfHxcbiAgICAgICAgICAgICAgICByZXNwb25zZUVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcyhcIllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldyBhZ2VudHNcIikgfHxcbiAgICAgICAgICAgICAgICByZXNwb25zZUVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcygnRmFpbGVkIGZldGNoaW5nIGRhdGEnKSAvLyBmZXRjaENPUiBsYW56YSBlc3RvIHBhcmEgNDAzIHNpbiAnQWNjZXNzIGRlbmllZCdcblxuICAgICAgICAgICAgICBpZiAoaXM0MDNFcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIFNpIGVzIDQwMywgZXN0YWJsZWNlciBhZ2VudGVzIHZhY8Otb3MgeSBjb250aW51YXJcbiAgICAgICAgICAgICAgICBzZXRBZ2VudHMoe1xuICAgICAgICAgICAgICAgICAgZGF0YTogW10sXG4gICAgICAgICAgICAgICAgICBoYXNfbW9yZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBuZXh0X29mZnNldDogbnVsbCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHNldEVycm9yKG51bGwpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU2kgZXMgb3RybyBlcnJvciwgbGFuemFybG9cbiAgICAgICAgICAgICAgICB0aHJvdyByZXNwb25zZUVycm9yXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMw7NnaWNhIGRlIHNlbGVjdCBhZ2VudCAtIFNvbG8gc2VsZWNjaW9uYXIgc2kgaGF5IGFnZW50ZXMgZGlzcG9uaWJsZXNcbiAgICAgICAgaWYgKGFnZW50UGFyc2VkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAoYWdlbnRUb1NlbGVjdCAmJiBhZ2VudFBhcnNlZC5maW5kKChhZ2VudFRvUmVxdWVzdDogQWdlbnQpID0+IGFnZW50VG9SZXF1ZXN0LmlkID09PSBhZ2VudFRvU2VsZWN0LmlkKSkge1xuICAgICAgICAgICAgaWYgKGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQ/LmlkICE9PSBhZ2VudFRvU2VsZWN0LmlkKSB7XG4gICAgICAgICAgICAgIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQgPSBhZ2VudFRvU2VsZWN0XG4gICAgICAgICAgICAgIHNlbGVjdEFnZW50KGFnZW50VG9TZWxlY3QpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhZ2VudFBhcnNlZD8uWzBdICYmICghYWdlbnQgfHwgIWFnZW50UGFyc2VkLmZpbmQoKGE6IEFnZW50KSA9PiBhLmlkID09PSBhZ2VudC5pZCkpKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVBZ2VudHMgPVxuICAgICAgICAgICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmIGNhbkZldGNoQ2xvbmVBZ2VudHNcbiAgICAgICAgICAgICAgICA/IGFnZW50UGFyc2VkXG4gICAgICAgICAgICAgICAgOiBhZ2VudFBhcnNlZC5maWx0ZXIoKGFnZW50SXRlbTogQWdlbnQpID0+IGFnZW50SXRlbS50eXBlICE9PSAnY2xvbmUnKVxuXG4gICAgICAgICAgICBjb25zdCBbZmlyc3RBZ2VudF0gPSBhdmFpbGFibGVBZ2VudHNcbiAgICAgICAgICAgIGlmIChmaXJzdEFnZW50ICYmIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQ/LmlkICE9PSBmaXJzdEFnZW50LmlkKSB7XG4gICAgICAgICAgICAgIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQgPSBmaXJzdEFnZW50XG4gICAgICAgICAgICAgIHNlbGVjdEFnZW50KGZpcnN0QWdlbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhZ2VudFRvU2VsZWN0ICYmIGFnZW50UGFyc2VkPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZUFnZW50cyA9XG4gICAgICAgICAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgJiYgY2FuRmV0Y2hDbG9uZUFnZW50c1xuICAgICAgICAgICAgICAgID8gYWdlbnRQYXJzZWRcbiAgICAgICAgICAgICAgICA6IGFnZW50UGFyc2VkLmZpbHRlcigoYWdlbnRJdGVtOiBBZ2VudCkgPT4gYWdlbnRJdGVtLnR5cGUgIT09ICdjbG9uZScpXG5cbiAgICAgICAgICAgIGNvbnN0IFtmaXJzdEF2YWlsYWJsZUFnZW50XSA9IGF2YWlsYWJsZUFnZW50c1xuICAgICAgICAgICAgaWYgKGZpcnN0QXZhaWxhYmxlQWdlbnQgJiYgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudD8uaWQgIT09IGZpcnN0QXZhaWxhYmxlQWdlbnQuaWQpIHtcbiAgICAgICAgICAgICAgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudCA9IGZpcnN0QXZhaWxhYmxlQWdlbnRcbiAgICAgICAgICAgICAgc2VsZWN0QWdlbnQoZmlyc3RBdmFpbGFibGVBZ2VudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNldEVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCcpXG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpc1JlZnJlc2hpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICghaXNSZWZyZXNoaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGxhc3RSZXF1ZXN0UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApXG4gICAgICB9XG4gICAgfSxcbiAgICBbc2VsZWN0QWdlbnQsIHNlY3Rpb24sIGFnZW50LCBsb2FkaW5nLCBjYW5GZXRjaENsb25lQWdlbnRzLCBpMThuLmxhbmd1YWdlXVxuICApXG5cbiAgY29uc3Qgc2VhcmNoQ3VzdG9tQWdlbnRzID0gdXNlQ2FsbGJhY2soYXN5bmMgKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICBpZiAocHJlU2VhcmNoQWdlbnRzUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgc2V0QWdlbnRzKHByZVNlYXJjaEFnZW50c1JlZi5jdXJyZW50KVxuICAgICAgICBwcmVTZWFyY2hBZ2VudHNSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghcHJlU2VhcmNoQWdlbnRzUmVmLmN1cnJlbnQpIHtcbiAgICAgIHByZVNlYXJjaEFnZW50c1JlZi5jdXJyZW50ID0gYWdlbnRzUmVmLmN1cnJlbnRcbiAgICB9XG5cbiAgICBzZXRTZWFyY2hMb2FkaW5nKHRydWUpXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaE1haWEoe1xuICAgICAgICBwYXRoOiBgYWdlbnRzP2FnZW50X3R5cGU9Y3VzdG9tJmxpbWl0PTIwJm9mZnNldD0wJnE9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWAsXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICB9KVxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICAgIGNvbnN0IGNsb25lQWdlbnRzID0gcHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlID09PSAnY2xvbmUnKVxuICAgICAgICBjb25zdCBjdXN0b21SZXN1bHRzOiBBZ2VudFtdID0gZGF0YS5kYXRhIHx8IFtdXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogY2xvbmVBZ2VudHMubGVuZ3RoID8gWy4uLmNsb25lQWdlbnRzLCAuLi5jdXN0b21SZXN1bHRzXSA6IGN1c3RvbVJlc3VsdHMsXG4gICAgICAgICAgaGFzX21vcmU6IGZhbHNlLFxuICAgICAgICAgIG5leHRfb2Zmc2V0OiBudWxsLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdzbmFja2Jhci5sb2FkTW9yZUFnZW50cy5lcnJvcicpKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRTZWFyY2hMb2FkaW5nKGZhbHNlKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgbG9hZE1vcmVBZ2VudHMgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaXNNdWx0aUFnZW50cyA9ICEhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyAmJiAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTXG4gICAgLy8gQ2FyZ2FyIG3DoXM6IGVuIGhlYWRlciBzaWVtcHJlOyBlbiBwcm9qZWN0IHNvbG8gc2kgaXNNdWx0aUFnZW50cyAocG9ycXVlIHNvbG8gZW50b25jZXMgaGF5IHBhZ2luYWNpw7NuIGRlIGN1c3RvbSlcbiAgICBjb25zdCBjYW5Mb2FkTW9yZSA9IHNlY3Rpb24gPT09ICdoZWFkZXInIHx8IGlzTXVsdGlBZ2VudHNcbiAgICBpZiAoIWNhbkxvYWRNb3JlIHx8ICFhZ2VudHMuaGFzX21vcmUgfHwgIWFnZW50cy5uZXh0X29mZnNldCB8fCBsb2FkaW5nTW9yZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0TG9hZGluZ01vcmUodHJ1ZSlcbiAgICBzZXRFcnJvcihudWxsKVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBwYXRoOiBzdHJpbmdcblxuICAgICAgLy8gU2kgZXMgbXVsdGlBZ2VudHMsIHNvbG8gY2FyZ2FyIGFnZW50cyBjdXN0b20gKE1haWEgeWEgZXN0w6EgY2FyZ2FkbylcbiAgICAgIGlmIChpc011bHRpQWdlbnRzKSB7XG4gICAgICAgIC8vIE1hbnRlbmVyIGNhbnRpZGFkIGltcGFyIGRlIGNhcmRzOiBwcmltZXJhIGNhcmdhIDcsIHNpZ3VpZW50ZXMgKzYgKDcsIDEzLCAxOSwgLi4uKVxuICAgICAgICBwYXRoID0gYGFnZW50cz9hZ2VudF90eXBlPWN1c3RvbSZsaW1pdD02Jm9mZnNldD0ke2FnZW50cy5uZXh0X29mZnNldH1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaSBubyBlcyBtdWx0aUFnZW50cywgY2FyZ2FyIG3DoXMgYWdlbnRlcyBjbG9uZSAoTWFpYSkg4oCUIG1pc21vIG9yZGVyIHF1ZSBwcm9qZWN0IHBhcmEgaGVhZGVyXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnYWdlbnRfdHlwZScsICdjbG9uZScpXG4gICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnbGFuZycsIG1hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSkpXG4gICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnb3JkZXInLCAncHJvamVjdCxjbGllbnQnKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xpbWl0JywgJzcnKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ29mZnNldCcsIGFnZW50cy5uZXh0X29mZnNldC50b1N0cmluZygpKVxuICAgICAgICBwYXRoID0gYGFnZW50cz8ke3F1ZXJ5UGFyYW1zLnRvU3RyaW5nKCl9YFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIC8vIEFjdW11bGFyIGFnZW50ZXMsIGV4Y2x1eWVuZG8gZHVwbGljYWRvc1xuICAgICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgICBpZiAoaXNNdWx0aUFnZW50cykge1xuICAgICAgICAgIC8vIEzDs2dpY2EgcGFyYSBtdWx0aUFnZW50czogc2VwYXJhciBjbG9uZSB5IGN1c3RvbVxuICAgICAgICAgIC8vIE1hbnRlbmVyIHRvZG9zIGxvcyBhZ2VudGVzIGNsb25lIGV4aXN0ZW50ZXMgYWwgaW5pY2lvXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdDbG9uZUFnZW50cyA9IHByZXYuZGF0YS5maWx0ZXIoKGFnOiBBZ2VudCkgPT4gYWcudHlwZSA9PT0gJ2Nsb25lJylcblxuICAgICAgICAgIC8vIE9idGVuZXIgSURzIGV4aXN0ZW50ZXMgKGV4Y2x1eWVuZG8gY2xvbmVzKVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+IGFnLnR5cGUgIT09ICdjbG9uZScpLm1hcCgoYWc6IEFnZW50KSA9PiBhZy5pZCkpXG5cbiAgICAgICAgICAvLyBGaWx0cmFyIG51ZXZvcyBhZ2VudHMgcXVlIG5vIGVzdMOpbiB5YSBlbiBsYSBsaXN0YSAoeSBxdWUgbm8gc2VhbiBjbG9uZSlcbiAgICAgICAgICBjb25zdCBuZXdBZ2VudHMgPSBub3JtYWxpemVDdXN0b21BZ2VudHNGcm9tQXBpKFxuICAgICAgICAgICAgZGF0YS5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlICE9PSAnY2xvbmUnICYmICFleGlzdGluZ0lkcy5oYXMoYWcuaWQpKVxuICAgICAgICAgIClcblxuICAgICAgICAgIC8vIENvbnN0cnVpciBlbCBudWV2byBhcnJheTogY2xvbmVzIHByaW1lcm8sIGx1ZWdvIGxvcyBhZ2VudHMgZXhpc3RlbnRlcyBxdWUgbm8gc2VhbiBjbG9uZSwgbHVlZ28gbG9zIG51ZXZvc1xuICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSBleGlzdGluZ0Nsb25lQWdlbnRzLmxlbmd0aFxuICAgICAgICAgICAgPyBbLi4uZXhpc3RpbmdDbG9uZUFnZW50cywgLi4ucHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlICE9PSAnY2xvbmUnKSwgLi4ubmV3QWdlbnRzXVxuICAgICAgICAgICAgOiBbLi4ucHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlICE9PSAnY2xvbmUnKSwgLi4ubmV3QWdlbnRzXVxuXG4gICAgICAgICAgLy8gT3JkZW5hcjogTWFpYSBwcmltZXJvLCBsdWVnbyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZSwgbHVlZ28gbm8gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGVcbiAgICAgICAgICBjb25zdCBzb3J0ZWREYXRhID0gc29ydEFnZW50cyhuZXdEYXRhKVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICAgICAgICBoYXNfbW9yZTogZGF0YS5oYXNfbW9yZSxcbiAgICAgICAgICAgIG5leHRfb2Zmc2V0OiBkYXRhLm5leHRfb2Zmc2V0LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBMw7NnaWNhIHBhcmEgIWlzTXVsdGlBZ2VudHM6IHRvZG9zIGxvcyBhZ2VudGVzIHNvbiBjbG9uZSwgc2ltcGxlbWVudGUgYWdyZWdhciBldml0YW5kbyBkdXBsaWNhZG9zXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2LmRhdGEubWFwKChhZzogQWdlbnQpID0+IGFnLmlkKSlcbiAgICAgICAgY29uc3QgbmV3QWdlbnRzID0gKGRhdGEuZGF0YSB8fCBbXSkuZmlsdGVyKChhZzogQWdlbnQpID0+ICFleGlzdGluZ0lkcy5oYXMoYWcuaWQpKVxuICAgICAgICBjb25zdCBuZXdEYXRhID0gWy4uLnByZXYuZGF0YSwgLi4ubmV3QWdlbnRzXVxuXG4gICAgICAgIC8vIE9yZGVuYXI6IE1haWEgcHJpbWVybywgbHVlZ28gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGUsIGx1ZWdvIG5vIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlXG4gICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgICAgIGhhc19tb3JlOiBkYXRhLmhhc19tb3JlLFxuICAgICAgICAgIG5leHRfb2Zmc2V0OiBkYXRhLm5leHRfb2Zmc2V0LFxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBzZXRMb2FkaW5nTW9yZShmYWxzZSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodCgnc25hY2tiYXIubG9hZE1vcmVBZ2VudHMuZXJyb3InKSlcbiAgICAgIHNldExvYWRpbmdNb3JlKGZhbHNlKVxuICAgIH1cbiAgfSwgW3NlY3Rpb24sIGFnZW50cy5oYXNfbW9yZSwgYWdlbnRzLm5leHRfb2Zmc2V0LCBsb2FkaW5nTW9yZSwgaTE4bi5sYW5ndWFnZV0pXG5cbiAgcmV0dXJuIHtcbiAgICBhZ2VudHMsXG4gICAgbG9hZGluZyxcbiAgICBsb2FkaW5nTW9yZSxcbiAgICBlcnJvcixcbiAgICBoYW5kbGVHZXRBZ2VudHMsXG4gICAgbG9hZE1vcmVBZ2VudHMsXG4gICAgc2VhcmNoQ3VzdG9tQWdlbnRzLFxuICAgIHNlYXJjaExvYWRpbmcsXG4gICAgYWRkQWdlbnQsXG4gICAgcmVtb3ZlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgICBzZWxlY3RGaXJzdEFnZW50LFxuICAgIHNvcnRBZ2VudHNMaXN0LFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7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