@projectcor/maia-components 2.11.67-2 → 2.11.68-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 (75) 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/ContextMentionPopover/ContextMentionPopover.js +6 -38
  4. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +13 -21
  5. package/lib/components/atoms/MAIAInput/MAIAInput.js +215 -71
  6. package/lib/components/atoms/MAIAInput/styles.js +64 -24
  7. package/lib/components/atoms/MAIAMessage/MAIAMessage.js +4 -2
  8. package/lib/components/atoms/MAIAViz/MAIAViz.js +97 -0
  9. package/lib/components/atoms/MAIAViz/MAIAViz.parse.js +131 -0
  10. package/lib/components/atoms/MAIAViz/MAIAViz.skeleton.js +40 -0
  11. package/lib/components/atoms/MAIAViz/MAIAViz.styles.js +8 -0
  12. package/lib/components/atoms/MAIAViz/MAIAViz.types.js +49 -0
  13. package/lib/components/atoms/MAIAViz/MAIAVizBar.js +123 -0
  14. package/lib/components/atoms/MAIAViz/MAIAVizDonut.js +111 -0
  15. package/lib/components/atoms/MAIAViz/MAIAVizKpis.js +34 -0
  16. package/lib/components/atoms/MAIAViz/README.md +85 -0
  17. package/lib/components/atoms/MAIAViz/index.js +2 -0
  18. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +46 -297
  19. package/lib/components/molecules/ChatAIHome/styles.js +26 -63
  20. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +159 -84
  21. package/lib/components/molecules/ChatAIMessages/newStyles.js +9 -19
  22. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +47 -223
  23. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +1 -26
  24. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +29 -22
  25. package/lib/components/molecules/ChatFooter/ChatFooter.js +18 -75
  26. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +7 -22
  27. package/lib/components/molecules/ChatFooter/styles.js +2 -11
  28. package/lib/components/molecules/Sidebar/Sidebar.js +10 -12
  29. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +5 -5
  30. package/lib/components/molecules/Sidebar/Sidebar.styles.js +13 -7
  31. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +2 -2
  32. package/lib/constants/maiaTaskPanelAccess.js +5 -7
  33. package/lib/constants/taskUrls.js +1 -3
  34. package/lib/context/global-context.js +1 -8
  35. package/lib/dev/DevContextMentionInput.js +3 -1
  36. package/lib/hooks/index.js +1 -2
  37. package/lib/hooks/useChatManager/useChatManager.js +144 -155
  38. package/lib/hooks/useChatMessages/useChatMessages.js +2 -33
  39. package/lib/hooks/useEntitySearch.js +129 -74
  40. package/lib/hooks/useEvent.js +1 -2
  41. package/lib/hooks/useFrequentlyAskedQuestions.js +10 -12
  42. package/lib/hooks/useFrequentlyUsedActions.js +3 -5
  43. package/lib/hooks/useMentionAllowedTypes.js +1 -11
  44. package/lib/hooks/useMentionPopover.js +2 -3
  45. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
  46. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +22 -28
  47. package/lib/hooks/useProjectSearch.js +28 -4
  48. package/lib/hooks/useProjectSummaryConfig.js +33 -88
  49. package/lib/hooks/useRecentClientsSearch.js +34 -4
  50. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +16 -24
  51. package/lib/lang/br/index.js +10 -28
  52. package/lib/lang/en/index.js +10 -28
  53. package/lib/lang/es/index.js +10 -28
  54. package/lib/lang/fr/index.js +10 -28
  55. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +3 -6
  56. package/lib/services/maia/Agents/getAgents.js +175 -225
  57. package/lib/services/maia/Chats/getChatMessages.js +3 -13
  58. package/lib/services/maia/Chats/getChatsByUserId.js +2 -10
  59. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +4 -6
  60. package/lib/services/maia/Orchestrator/orchestrator.js +11 -25
  61. package/lib/services/maia/index.js +2 -4
  62. package/lib/services/utils/validateIsMaia.js +2 -2
  63. package/lib/types/Chat.js +1 -1
  64. package/lib/types/Hitl.js +2 -0
  65. package/lib/types/agent.js +1 -1
  66. package/lib/utils/agentDisplayName.js +1 -9
  67. package/lib/utils/hitlAnalytics.js +3 -3
  68. package/lib/utils/maiaStreamdownRenderers.js +16 -0
  69. package/lib/utils/renderContextMentions.js +1 -3
  70. package/package.json +1 -1
  71. package/lib/hooks/useContextPinPopover.js +0 -235
  72. package/lib/hooks/useRecentContexts.js +0 -86
  73. package/lib/services/maia/RecentContexts/getRecentContexts.js +0 -54
  74. package/lib/services/maia/RecentContexts/index.js +0 -6
  75. package/lib/utils/entityLinkRender.js +0 -132
@@ -20,35 +20,17 @@ import { fetchMaia } from '../client';
20
20
  import { useUser } from '../../../context/cor-user';
21
21
  import { isMaiaCloneAgentsRoleBlocked } from '../../../constants/maiaTaskPanelAccess';
22
22
  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
23
 
45
24
  /**
46
- * Ordena los agentes: MAIA primero (si existe), luego favoritos alfabéticamente, luego no favoritos alfabéticamente
25
+ * Ordena los agentes: agentes clone primero (si existen), luego favoritos alfabéticamente, luego no favoritos alfabéticamente
47
26
  */
48
27
  var sortAgents = function sortAgents(agents) {
49
- var maiaAgents = agents.filter(isMaiaAgent);
28
+ // Separar agentes clone del resto
29
+ var cloneAgents = agents.filter(function (ag) {
30
+ return ag.type === 'clone';
31
+ });
50
32
  var otherAgents = agents.filter(function (ag) {
51
- return !isMaiaAgent(ag);
33
+ return ag.type !== 'clone';
52
34
  });
53
35
 
54
36
  // Separar favoritos y no favoritos
@@ -62,7 +44,9 @@ var sortAgents = function sortAgents(agents) {
62
44
  }).sort(function (a, b) {
63
45
  return a.name.localeCompare(b.name);
64
46
  });
65
- return maiaAgents.length ? [].concat(_toConsumableArray(maiaAgents), _toConsumableArray(favorites), _toConsumableArray(nonFavorites)) : [].concat(_toConsumableArray(favorites), _toConsumableArray(nonFavorites));
47
+
48
+ // Combinar: clones primero, luego favoritos, luego no favoritos
49
+ return cloneAgents.length ? [].concat(_toConsumableArray(cloneAgents), _toConsumableArray(favorites), _toConsumableArray(nonFavorites)) : [].concat(_toConsumableArray(favorites), _toConsumableArray(nonFavorites));
66
50
  };
67
51
  export var useGetAgents = function useGetAgents(_ref) {
68
52
  var selectAgent = _ref.selectAgent,
@@ -103,6 +87,7 @@ export var useGetAgents = function useGetAgents(_ref) {
103
87
  var agentsRef = useRef(agents);
104
88
  var preSearchAgentsRef = useRef(null);
105
89
  agentsRef.current = agents;
90
+ var canFetchCloneAgents = !isMaiaCloneAgentsRoleBlocked(user, section);
106
91
  var addAgent = useCallback(function (newAgent, options) {
107
92
  setAgents(function (prev) {
108
93
  // Verificar si el agente ya existe para evitar duplicados
@@ -200,195 +185,150 @@ export var useGetAgents = function useGetAgents(_ref) {
200
185
  }
201
186
  }, [agents.data, selectAgent]);
202
187
  var handleGetAgents = useCallback(/*#__PURE__*/function () {
203
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(agentToSelect) {
188
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(agentToSelect) {
204
189
  var _agentToSelect$id;
205
- 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;
206
- return _regeneratorRuntime.wrap(function (_context4) {
207
- while (1) switch (_context4.prev = _context4.next) {
190
+ 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;
191
+ return _regeneratorRuntime.wrap(function (_context3) {
192
+ while (1) switch (_context3.prev = _context3.next) {
208
193
  case 0:
209
194
  if (!isRefreshingRef.current) {
210
- _context4.next = 1;
195
+ _context3.next = 1;
211
196
  break;
212
197
  }
213
- return _context4.abrupt("return");
198
+ return _context3.abrupt("return");
214
199
  case 1:
215
200
  requestKey = (agentToSelect === null || agentToSelect === void 0 || (_agentToSelect$id = agentToSelect.id) === null || _agentToSelect$id === void 0 ? void 0 : _agentToSelect$id.toString()) || 'default';
216
201
  if (!(lastRequestRef.current === requestKey && !loading)) {
217
- _context4.next = 2;
202
+ _context3.next = 2;
218
203
  break;
219
204
  }
220
- return _context4.abrupt("return");
205
+ return _context3.abrupt("return");
221
206
  case 2:
222
207
  isRefreshingRef.current = true;
223
208
  lastRequestRef.current = requestKey;
224
209
  setLoading(true);
225
210
  setError(null);
226
211
  isMultiAgents = !!window.MAIA_CHAT_AI_FEATURE_ACCESS && !!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
227
- _context4.prev = 3;
212
+ _context3.prev = 3;
228
213
  agentParsed = [];
229
214
  hasMore = false;
230
- nextOffset = null;
231
- cloneAgentsRoleBlocked = isMaiaCloneAgentsRoleBlocked(user, section);
232
- canFetchCloneAgents = !cloneAgentsRoleBlocked;
233
- fetchGlobalCloneAgents = /*#__PURE__*/function () {
215
+ nextOffset = null; // Si tiene feature access multi agents, hacer dos queries (Maia + custom) en cualquier sección
216
+ if (!isMultiAgents) {
217
+ _context3.next = 5;
218
+ break;
219
+ }
220
+ // Query clone (Maia) y custom son independientes → se disparan en paralelo.
221
+ cloneAgents = [];
222
+ customAgents = [];
223
+ customHasMore = false;
224
+ customNextOffset = null;
225
+ is403 = function is403(err) {
226
+ var _err$response, _err$message, _err$message2;
227
+ 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'));
228
+ }; // fetchCOR lanza esto para 403 sin 'Access denied'
229
+ loadCloneAgents = /*#__PURE__*/function () {
234
230
  var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
235
- var cloneResponse, cloneData, _t;
231
+ var _maiaData$data, orderParam, maiaResponse, maiaData, _t;
236
232
  return _regeneratorRuntime.wrap(function (_context) {
237
233
  while (1) switch (_context.prev = _context.next) {
238
234
  case 0:
239
- if (!(!isMarketplaceMaiakerEnabled() || !canFetchCloneAgents)) {
235
+ if (canFetchCloneAgents) {
240
236
  _context.next = 1;
241
237
  break;
242
238
  }
243
- return _context.abrupt("return", []);
239
+ return _context.abrupt("return");
244
240
  case 1:
245
241
  _context.prev = 1;
242
+ orderParam = section === 'client' ? '&order=client,project' : section === 'project' || section === 'header' || section === 'task' ? '&order=project,client' : '';
246
243
  _context.next = 2;
247
244
  return fetchMaia({
248
- path: "agents?agent_type=clone&entity=global&lang=".concat(mapCORLang(i18n.language)),
245
+ path: "agents?agent_type=clone&lang=".concat(mapCORLang(i18n.language)).concat(orderParam),
249
246
  method: 'GET'
250
247
  });
251
248
  case 2:
252
- cloneResponse = _context.sent;
249
+ maiaResponse = _context.sent;
253
250
  _context.next = 3;
254
- return cloneResponse.json();
251
+ return maiaResponse.json();
255
252
  case 3:
256
- cloneData = _context.sent;
257
- return _context.abrupt("return", (cloneData.data || []).filter(function (ag) {
253
+ maiaData = _context.sent;
254
+ cloneAgents = ((_maiaData$data = maiaData.data) === null || _maiaData$data === void 0 ? void 0 : _maiaData$data.filter(function (ag) {
258
255
  return ag.type === 'clone';
259
- }));
256
+ })) || [];
257
+ _context.next = 5;
258
+ break;
260
259
  case 4:
261
260
  _context.prev = 4;
262
261
  _t = _context["catch"](1);
263
- if (!is403AgentFetchError(_t)) {
262
+ if (is403(_t)) {
264
263
  _context.next = 5;
265
264
  break;
266
265
  }
267
- return _context.abrupt("return", []);
268
- case 5:
269
266
  throw _t;
270
- case 6:
267
+ case 5:
271
268
  case "end":
272
269
  return _context.stop();
273
270
  }
274
271
  }, _callee, null, [[1, 4]]);
275
272
  }));
276
- return function fetchGlobalCloneAgents() {
273
+ return function loadCloneAgents() {
277
274
  return _ref6.apply(this, arguments);
278
275
  };
279
- }(); // Si tiene feature access multi agents, hacer dos queries (Maia + custom) en cualquier sección
280
- if (!isMultiAgents) {
281
- _context4.next = 5;
282
- break;
283
- }
284
- // Query clone (Maia) y custom son independientes → se disparan en paralelo.
285
- customAgents = [];
286
- customHasMore = false;
287
- customNextOffset = null;
288
- is403 = is403AgentFetchError;
289
- maiaAgents = [];
290
- loadCloneAgents = /*#__PURE__*/function () {
276
+ }();
277
+ loadCustomAgents = /*#__PURE__*/function () {
291
278
  var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
292
- var _maiaData$data, maiaResponse, maiaData, globalCloneAgents, _t2;
279
+ var customResponse, customData, _t2;
293
280
  return _regeneratorRuntime.wrap(function (_context2) {
294
281
  while (1) switch (_context2.prev = _context2.next) {
295
282
  case 0:
296
- if (canFetchCloneAgents) {
297
- _context2.next = 1;
298
- break;
299
- }
300
- return _context2.abrupt("return");
301
- case 1:
302
- _context2.prev = 1;
303
- _context2.next = 2;
304
- return fetchMaia({
305
- path: "agents?agent_type=orchestrator&lang=".concat(mapCORLang(i18n.language)),
306
- method: 'GET'
307
- });
308
- case 2:
309
- maiaResponse = _context2.sent;
310
- _context2.next = 3;
311
- return maiaResponse.json();
312
- case 3:
313
- maiaData = _context2.sent;
314
- maiaAgents = ((_maiaData$data = maiaData.data) === null || _maiaData$data === void 0 ? void 0 : _maiaData$data.filter(isMaiaAgent)) || [];
315
- _context2.next = 4;
316
- return fetchGlobalCloneAgents();
317
- case 4:
318
- globalCloneAgents = _context2.sent;
319
- maiaAgents = mergeAgentsWithoutDuplicates(maiaAgents, globalCloneAgents);
320
- _context2.next = 6;
321
- break;
322
- case 5:
323
- _context2.prev = 5;
324
- _t2 = _context2["catch"](1);
325
- if (is403(_t2)) {
326
- _context2.next = 6;
327
- break;
328
- }
329
- throw _t2;
330
- case 6:
331
- case "end":
332
- return _context2.stop();
333
- }
334
- }, _callee2, null, [[1, 5]]);
335
- }));
336
- return function loadCloneAgents() {
337
- return _ref7.apply(this, arguments);
338
- };
339
- }();
340
- loadCustomAgents = /*#__PURE__*/function () {
341
- var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
342
- var customResponse, customData, _t3;
343
- return _regeneratorRuntime.wrap(function (_context3) {
344
- while (1) switch (_context3.prev = _context3.next) {
345
- case 0:
346
- _context3.prev = 0;
347
- _context3.next = 1;
283
+ _context2.prev = 0;
284
+ _context2.next = 1;
348
285
  return fetchMaia({
349
286
  path: 'agents?agent_type=custom&limit=7&offset=0',
350
287
  method: 'GET'
351
288
  });
352
289
  case 1:
353
- customResponse = _context3.sent;
354
- _context3.next = 2;
290
+ customResponse = _context2.sent;
291
+ _context2.next = 2;
355
292
  return customResponse.json();
356
293
  case 2:
357
- customData = _context3.sent;
294
+ customData = _context2.sent;
358
295
  customAgents = customData.data || [];
359
296
  customHasMore = customData.has_more || false;
360
297
  customNextOffset = customData.next_offset || null;
361
- _context3.next = 4;
298
+ _context2.next = 4;
362
299
  break;
363
300
  case 3:
364
- _context3.prev = 3;
365
- _t3 = _context3["catch"](0);
366
- if (is403(_t3)) {
367
- _context3.next = 4;
301
+ _context2.prev = 3;
302
+ _t2 = _context2["catch"](0);
303
+ if (is403(_t2)) {
304
+ _context2.next = 4;
368
305
  break;
369
306
  }
370
- throw _t3;
307
+ throw _t2;
371
308
  case 4:
372
309
  case "end":
373
- return _context3.stop();
310
+ return _context2.stop();
374
311
  }
375
- }, _callee3, null, [[0, 3]]);
312
+ }, _callee2, null, [[0, 3]]);
376
313
  }));
377
314
  return function loadCustomAgents() {
378
- return _ref8.apply(this, arguments);
315
+ return _ref7.apply(this, arguments);
379
316
  };
380
317
  }();
381
- _context4.next = 4;
318
+ _context3.next = 4;
382
319
  return Promise.all([loadCloneAgents(), loadCustomAgents()]);
383
320
  case 4:
384
321
  // Combinar: agentes clone primero, luego los custom (si existen)
385
322
  // Si el usuario tiene un rol deshabilitado, no incluir cloneAgents
386
323
  if (!canFetchCloneAgents) {
387
- // Rol sin acceso a clones (p. ej. freelancer/cliente o colaborador en project/client): solo customAgents
324
+ // Rol sin acceso a clones (p. ej. colaborador fuera del piloto): solo customAgents
388
325
  // Si customAgents está vacío (por 403), agentParsed será []
389
326
  agentParsed = customAgents;
390
327
  } else {
391
- agentParsed = maiaAgents.length ? [].concat(_toConsumableArray(maiaAgents), _toConsumableArray(customAgents)) : customAgents;
328
+ // Rol con acceso a clones: cloneAgents + customAgents
329
+ // Si customAgents está vacío (por 403) pero hay cloneAgents, agentParsed tendrá los clones
330
+ // Si no hay cloneAgents ni customAgents, agentParsed será []
331
+ agentParsed = cloneAgents.length ? [].concat(_toConsumableArray(cloneAgents), _toConsumableArray(customAgents)) : customAgents;
392
332
  }
393
333
  // Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
394
334
  agentParsed = sortAgents(agentParsed);
@@ -404,60 +344,64 @@ export var useGetAgents = function useGetAgents(_ref) {
404
344
  if (agentParsed.length === 0) {
405
345
  setError(null);
406
346
  }
407
- _context4.next = 12;
347
+ _context3.next = 12;
408
348
  break;
409
349
  case 5:
410
- // Lógica para project, client o header sin multiAgents (mismo criterio de orden project/client; header añade paginación)
350
+ shouldRequestCloneAgents = canFetchCloneAgents && (section === 'project' || section === 'client' || section === 'header' || section === 'task');
351
+ if (shouldRequestCloneAgents) {
352
+ _context3.next = 6;
353
+ break;
354
+ }
355
+ setAgents({
356
+ data: [],
357
+ has_more: false,
358
+ next_offset: null
359
+ });
360
+ setError(null);
361
+ _context3.next = 12;
362
+ break;
363
+ case 6:
411
364
  queryParams = new URLSearchParams();
412
- if (section === 'project' || section === 'client' || section === 'header' || section === 'task') {
413
- queryParams.append('agent_type', 'orchestrator');
414
- queryParams.append('lang', mapCORLang(i18n.language));
415
- if (section === 'header') {
416
- queryParams.append('limit', '7');
417
- queryParams.append('offset', '0');
418
- }
365
+ queryParams.append('agent_type', 'clone');
366
+ queryParams.append('lang', mapCORLang(i18n.language));
367
+ queryParams.append('order', section === 'client' ? 'client,project' : 'project,client');
368
+ if (section === 'header') {
369
+ queryParams.append('limit', '7');
370
+ queryParams.append('offset', '0');
419
371
  }
420
- queryString = queryParams.toString();
421
- path = "agents".concat(queryString ? "?".concat(queryString) : '');
422
- _context4.prev = 6;
423
- _context4.next = 7;
372
+ path = "agents?".concat(queryParams.toString());
373
+ _context3.prev = 7;
374
+ _context3.next = 8;
424
375
  return fetchMaia({
425
376
  path: path,
426
377
  method: 'GET'
427
378
  });
428
- case 7:
429
- response = _context4.sent;
430
- _context4.next = 8;
431
- return response.json();
432
379
  case 8:
433
- data = _context4.sent;
434
- // data.data ya contiene el/los agentes orquestadores de la query agent_type=orchestrator
435
- agentParsed = data.data || [];
436
- _context4.next = 9;
437
- return fetchGlobalCloneAgents();
380
+ response = _context3.sent;
381
+ _context3.next = 9;
382
+ return response.json();
438
383
  case 9:
439
- globalCloneAgents = _context4.sent;
440
- agentParsed = mergeAgentsWithoutDuplicates(agentParsed, globalCloneAgents);
441
- // Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
384
+ data = _context3.sent;
385
+ agentParsed = data.data || [];
442
386
  agentParsed = sortAgents(agentParsed);
443
387
  hasMore = data.has_more;
444
388
  nextOffset = data.next_offset;
445
389
  setAgents(_objectSpread(_objectSpread({}, data), {}, {
446
390
  data: agentParsed
447
391
  }));
448
- _context4.next = 12;
392
+ _context3.next = 12;
449
393
  break;
450
394
  case 10:
451
- _context4.prev = 10;
452
- _t4 = _context4["catch"](6);
395
+ _context3.prev = 10;
396
+ _t3 = _context3["catch"](7);
453
397
  // Verificar si el error es 403
454
398
  // fetchCOR puede lanzar diferentes tipos de errores:
455
399
  // 1. Error con errorData.detail si incluye 'Access denied'
456
400
  // 2. Error genérico 'Failed fetching data' si es 403 pero no incluye 'Access denied'
457
401
  // 3. Necesitamos verificar el status code si está disponible
458
- 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'
402
+ 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'
459
403
  if (!is403Error) {
460
- _context4.next = 11;
404
+ _context3.next = 11;
461
405
  break;
462
406
  }
463
407
  // Si es 403, establecer agentes vacíos y continuar
@@ -467,10 +411,10 @@ export var useGetAgents = function useGetAgents(_ref) {
467
411
  next_offset: null
468
412
  });
469
413
  setError(null);
470
- _context4.next = 12;
414
+ _context3.next = 12;
471
415
  break;
472
416
  case 11:
473
- throw _t4;
417
+ throw _t3;
474
418
  case 12:
475
419
  // Lógica de select agent - Solo seleccionar si hay agentes disponibles
476
420
  if (agentParsed.length > 0) {
@@ -484,8 +428,8 @@ export var useGetAgents = function useGetAgents(_ref) {
484
428
  } else if ((_agentParsed = agentParsed) !== null && _agentParsed !== void 0 && _agentParsed[0] && (!agent || !agentParsed.find(function (a) {
485
429
  return a.id === agent.id;
486
430
  }))) {
487
- availableAgents = window.MAIA_CHAT_AI_FEATURE_ACCESS && !cloneAgentsRoleBlocked ? agentParsed : agentParsed.filter(function (agentItem) {
488
- return !isMaiaAgent(agentItem);
431
+ availableAgents = window.MAIA_CHAT_AI_FEATURE_ACCESS && canFetchCloneAgents ? agentParsed : agentParsed.filter(function (agentItem) {
432
+ return agentItem.type !== 'clone';
489
433
  });
490
434
  _availableAgents = _slicedToArray(availableAgents, 1), firstAgent = _availableAgents[0];
491
435
  if (firstAgent && ((_lastSelectedAgentRef2 = lastSelectedAgentRef.current) === null || _lastSelectedAgentRef2 === void 0 ? void 0 : _lastSelectedAgentRef2.id) !== firstAgent.id) {
@@ -493,8 +437,8 @@ export var useGetAgents = function useGetAgents(_ref) {
493
437
  selectAgent(firstAgent);
494
438
  }
495
439
  } else if (agentToSelect && (_agentParsed2 = agentParsed) !== null && _agentParsed2 !== void 0 && _agentParsed2.length) {
496
- _availableAgents2 = window.MAIA_CHAT_AI_FEATURE_ACCESS && !cloneAgentsRoleBlocked ? agentParsed : agentParsed.filter(function (agentItem) {
497
- return !isMaiaAgent(agentItem);
440
+ _availableAgents2 = window.MAIA_CHAT_AI_FEATURE_ACCESS && canFetchCloneAgents ? agentParsed : agentParsed.filter(function (agentItem) {
441
+ return agentItem.type !== 'clone';
498
442
  });
499
443
  _availableAgents3 = _slicedToArray(_availableAgents2, 1), firstAvailableAgent = _availableAgents3[0];
500
444
  if (firstAvailableAgent && ((_lastSelectedAgentRef3 = lastSelectedAgentRef.current) === null || _lastSelectedAgentRef3 === void 0 ? void 0 : _lastSelectedAgentRef3.id) !== firstAvailableAgent.id) {
@@ -504,64 +448,64 @@ export var useGetAgents = function useGetAgents(_ref) {
504
448
  }
505
449
  }
506
450
  setLoading(false);
507
- _context4.next = 14;
451
+ _context3.next = 14;
508
452
  break;
509
453
  case 13:
510
- _context4.prev = 13;
511
- _t5 = _context4["catch"](3);
512
- setError(_t5 instanceof Error ? _t5.message : 'An unknown error occurred');
454
+ _context3.prev = 13;
455
+ _t4 = _context3["catch"](3);
456
+ setError(_t4 instanceof Error ? _t4.message : 'An unknown error occurred');
513
457
  setLoading(false);
514
458
  case 14:
515
- _context4.prev = 14;
459
+ _context3.prev = 14;
516
460
  isRefreshingRef.current = false;
517
461
  setTimeout(function () {
518
462
  if (!isRefreshingRef.current) {
519
463
  lastRequestRef.current = null;
520
464
  }
521
465
  }, 100);
522
- return _context4.finish(14);
466
+ return _context3.finish(14);
523
467
  case 15:
524
468
  case "end":
525
- return _context4.stop();
469
+ return _context3.stop();
526
470
  }
527
- }, _callee4, null, [[3, 13, 14, 15], [6, 10]]);
471
+ }, _callee3, null, [[3, 13, 14, 15], [7, 10]]);
528
472
  }));
529
473
  return function (_x) {
530
474
  return _ref5.apply(this, arguments);
531
475
  };
532
- }(), [selectAgent, section, agent, loading]);
476
+ }(), [selectAgent, section, agent, loading, canFetchCloneAgents, i18n.language]);
533
477
  var searchCustomAgents = useCallback(/*#__PURE__*/function () {
534
- var _ref9 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(query) {
535
- var response, data, _t6;
536
- return _regeneratorRuntime.wrap(function (_context5) {
537
- while (1) switch (_context5.prev = _context5.next) {
478
+ var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(query) {
479
+ var response, data, _t5;
480
+ return _regeneratorRuntime.wrap(function (_context4) {
481
+ while (1) switch (_context4.prev = _context4.next) {
538
482
  case 0:
539
483
  if (query) {
540
- _context5.next = 1;
484
+ _context4.next = 1;
541
485
  break;
542
486
  }
543
487
  if (preSearchAgentsRef.current) {
544
488
  setAgents(preSearchAgentsRef.current);
545
489
  preSearchAgentsRef.current = null;
546
490
  }
547
- return _context5.abrupt("return");
491
+ return _context4.abrupt("return");
548
492
  case 1:
549
493
  if (!preSearchAgentsRef.current) {
550
494
  preSearchAgentsRef.current = agentsRef.current;
551
495
  }
552
496
  setSearchLoading(true);
553
- _context5.prev = 2;
554
- _context5.next = 3;
497
+ _context4.prev = 2;
498
+ _context4.next = 3;
555
499
  return fetchMaia({
556
500
  path: "agents?agent_type=custom&limit=20&offset=0&q=".concat(encodeURIComponent(query)),
557
501
  method: 'GET'
558
502
  });
559
503
  case 3:
560
- response = _context5.sent;
561
- _context5.next = 4;
504
+ response = _context4.sent;
505
+ _context4.next = 4;
562
506
  return response.json();
563
507
  case 4:
564
- data = _context5.sent;
508
+ data = _context4.sent;
565
509
  setAgents(function (prev) {
566
510
  var cloneAgents = prev.data.filter(function (ag) {
567
511
  return ag.type === 'clone';
@@ -573,87 +517,93 @@ export var useGetAgents = function useGetAgents(_ref) {
573
517
  next_offset: null
574
518
  };
575
519
  });
576
- _context5.next = 6;
520
+ _context4.next = 6;
577
521
  break;
578
522
  case 5:
579
- _context5.prev = 5;
580
- _t6 = _context5["catch"](2);
523
+ _context4.prev = 5;
524
+ _t5 = _context4["catch"](2);
581
525
  handleSnackbarError(t('snackbar.loadMoreAgents.error'));
582
526
  case 6:
583
- _context5.prev = 6;
527
+ _context4.prev = 6;
584
528
  setSearchLoading(false);
585
- return _context5.finish(6);
529
+ return _context4.finish(6);
586
530
  case 7:
587
531
  case "end":
588
- return _context5.stop();
532
+ return _context4.stop();
589
533
  }
590
- }, _callee5, null, [[2, 5, 6, 7]]);
534
+ }, _callee4, null, [[2, 5, 6, 7]]);
591
535
  }));
592
536
  return function (_x2) {
593
- return _ref9.apply(this, arguments);
537
+ return _ref8.apply(this, arguments);
594
538
  };
595
539
  }(), []);
596
- var loadMoreAgents = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6() {
597
- var isMultiAgents, canLoadMore, path, queryParams, response, data, _t7;
598
- return _regeneratorRuntime.wrap(function (_context6) {
599
- while (1) switch (_context6.prev = _context6.next) {
540
+ var loadMoreAgents = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
541
+ var isMultiAgents, canLoadMore, path, queryParams, response, data, _t6;
542
+ return _regeneratorRuntime.wrap(function (_context5) {
543
+ while (1) switch (_context5.prev = _context5.next) {
600
544
  case 0:
601
545
  isMultiAgents = !!window.MAIA_CHAT_AI_FEATURE_ACCESS && !!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS; // Cargar más: en header siempre; en project solo si isMultiAgents (porque solo entonces hay paginación de custom)
602
546
  canLoadMore = section === 'header' || isMultiAgents;
603
547
  if (!(!canLoadMore || !agents.has_more || !agents.next_offset || loadingMore)) {
604
- _context6.next = 1;
548
+ _context5.next = 1;
605
549
  break;
606
550
  }
607
- return _context6.abrupt("return");
551
+ return _context5.abrupt("return");
608
552
  case 1:
609
553
  setLoadingMore(true);
610
554
  setError(null);
611
- _context6.prev = 2;
555
+ _context5.prev = 2;
612
556
  // Si es multiAgents, solo cargar agents custom (Maia ya está cargado)
613
557
  if (isMultiAgents) {
614
558
  // Mantener cantidad impar de cards: primera carga 7, siguientes +6 (7, 13, 19, ...)
615
559
  path = "agents?agent_type=custom&limit=6&offset=".concat(agents.next_offset);
616
560
  } else {
617
- // Si no es multiAgents, cargar más agentes orquestadores (MAIA)
561
+ // Si no es multiAgents, cargar más agentes clone (Maia) — mismo order que project para header
618
562
  queryParams = new URLSearchParams();
619
- queryParams.append('agent_type', 'orchestrator');
563
+ queryParams.append('agent_type', 'clone');
620
564
  queryParams.append('lang', mapCORLang(i18n.language));
565
+ queryParams.append('order', 'project,client');
621
566
  queryParams.append('limit', '7');
622
567
  queryParams.append('offset', agents.next_offset.toString());
623
568
  path = "agents?".concat(queryParams.toString());
624
569
  }
625
- _context6.next = 3;
570
+ _context5.next = 3;
626
571
  return fetchMaia({
627
572
  path: path,
628
573
  method: 'GET'
629
574
  });
630
575
  case 3:
631
- response = _context6.sent;
632
- _context6.next = 4;
576
+ response = _context5.sent;
577
+ _context5.next = 4;
633
578
  return response.json();
634
579
  case 4:
635
- data = _context6.sent;
580
+ data = _context5.sent;
636
581
  // Acumular agentes, excluyendo duplicados
637
582
  setAgents(function (prev) {
638
583
  if (isMultiAgents) {
639
- // Lógica para multiAgents: separar MAIA y custom
640
- var existingMaiaAgents = prev.data.filter(isMaiaAgent);
584
+ // Lógica para multiAgents: separar clone y custom
585
+ // Mantener todos los agentes clone existentes al inicio
586
+ var existingCloneAgents = prev.data.filter(function (ag) {
587
+ return ag.type === 'clone';
588
+ });
641
589
 
642
- // Obtener IDs existentes (excluyendo MAIA)
590
+ // Obtener IDs existentes (excluyendo clones)
643
591
  var _existingIds = new Set(prev.data.filter(function (ag) {
644
- return !isMaiaAgent(ag);
592
+ return ag.type !== 'clone';
645
593
  }).map(function (ag) {
646
594
  return ag.id;
647
595
  }));
648
596
 
649
- // Filtrar nuevos agents que no estén ya en la lista (y que no sean MAIA)
597
+ // Filtrar nuevos agents que no estén ya en la lista (y que no sean clone)
650
598
  var _newAgents = data.data.filter(function (ag) {
651
- return !isMaiaAgent(ag) && !_existingIds.has(ag.id);
599
+ return ag.type !== 'clone' && !_existingIds.has(ag.id);
652
600
  });
653
- var _newData = existingMaiaAgents.length ? [].concat(_toConsumableArray(existingMaiaAgents), _toConsumableArray(prev.data.filter(function (ag) {
654
- return !isMaiaAgent(ag);
601
+
602
+ // Construir el nuevo array: clones primero, luego los agents existentes que no sean clone, luego los nuevos
603
+ var _newData = existingCloneAgents.length ? [].concat(_toConsumableArray(existingCloneAgents), _toConsumableArray(prev.data.filter(function (ag) {
604
+ return ag.type !== 'clone';
655
605
  })), _toConsumableArray(_newAgents)) : [].concat(_toConsumableArray(prev.data.filter(function (ag) {
656
- return !isMaiaAgent(ag);
606
+ return ag.type !== 'clone';
657
607
  })), _toConsumableArray(_newAgents));
658
608
 
659
609
  // Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
@@ -664,7 +614,7 @@ export var useGetAgents = function useGetAgents(_ref) {
664
614
  next_offset: data.next_offset
665
615
  };
666
616
  }
667
- // Lógica para !isMultiAgents: agregar evitando duplicados
617
+ // Lógica para !isMultiAgents: todos los agentes son clone, simplemente agregar evitando duplicados
668
618
  var existingIds = new Set(prev.data.map(function (ag) {
669
619
  return ag.id;
670
620
  }));
@@ -682,18 +632,18 @@ export var useGetAgents = function useGetAgents(_ref) {
682
632
  };
683
633
  });
684
634
  setLoadingMore(false);
685
- _context6.next = 6;
635
+ _context5.next = 6;
686
636
  break;
687
637
  case 5:
688
- _context6.prev = 5;
689
- _t7 = _context6["catch"](2);
638
+ _context5.prev = 5;
639
+ _t6 = _context5["catch"](2);
690
640
  handleSnackbarError(t('snackbar.loadMoreAgents.error'));
691
641
  setLoadingMore(false);
692
642
  case 6:
693
643
  case "end":
694
- return _context6.stop();
644
+ return _context5.stop();
695
645
  }
696
- }, _callee6, null, [[2, 5]]);
646
+ }, _callee5, null, [[2, 5]]);
697
647
  })), [section, agents.has_more, agents.next_offset, loadingMore, i18n.language]);
698
648
  return {
699
649
  agents: agents,
@@ -712,4 +662,4 @@ export var useGetAgents = function useGetAgents(_ref) {
712
662
  sortAgentsList: sortAgentsList
713
663
  };
714
664
  };
715
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUNhbGxiYWNrIiwidXNlUmVmIiwidXNlVHJhbnNsYXRpb24iLCJ1c2VTbmFja0Jhck1hbmFnZXIiLCJmZXRjaE1haWEiLCJ1c2VVc2VyIiwiaXNNYWlhQ2xvbmVBZ2VudHNSb2xlQmxvY2tlZCIsIm1hcENPUkxhbmciLCJpc01haWFBZ2VudCIsImFnZW50IiwidHlwZSIsImlzTWFya2V0cGxhY2VNYWlha2VyRW5hYmxlZCIsIndpbmRvdyIsIk1BSUFfTUFSS0VUUExBQ0VfTUFJQUtFUiIsImlzNDAzQWdlbnRGZXRjaEVycm9yIiwiZXJyIiwiX2Vycm9yJHJlc3BvbnNlIiwiX2Vycm9yJG1lc3NhZ2UiLCJfZXJyb3IkbWVzc2FnZTIiLCJlcnJvciIsInJlc3BvbnNlIiwic3RhdHVzIiwiQm9vbGVhbiIsIm1lc3NhZ2UiLCJpbmNsdWRlcyIsIm1lcmdlQWdlbnRzV2l0aG91dER1cGxpY2F0ZXMiLCJiYXNlIiwiZXh0cmEiLCJpZHMiLCJTZXQiLCJtYXAiLCJpZCIsIm1lcmdlZCIsIl90b0NvbnN1bWFibGVBcnJheSIsImZvckVhY2giLCJoYXMiLCJwdXNoIiwic29ydEFnZW50cyIsImFnZW50cyIsIm1haWFBZ2VudHMiLCJmaWx0ZXIiLCJvdGhlckFnZW50cyIsImFnIiwiZmF2b3JpdGVzIiwiaXNfZmF2b3JpdGUiLCJzb3J0IiwiYSIsImIiLCJuYW1lIiwibG9jYWxlQ29tcGFyZSIsIm5vbkZhdm9yaXRlcyIsImxlbmd0aCIsImNvbmNhdCIsInVzZUdldEFnZW50cyIsIl9yZWYiLCJzZWxlY3RBZ2VudCIsInNlY3Rpb24iLCJoYW5kbGVHb0hvbWUiLCJ1c2VyIiwiX3VzZVN0YXRlIiwiZGF0YSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInNldEFnZW50cyIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwibG9hZGluZyIsInNldExvYWRpbmciLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImxvYWRpbmdNb3JlIiwic2V0TG9hZGluZ01vcmUiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInNlYXJjaExvYWRpbmciLCJzZXRTZWFyY2hMb2FkaW5nIiwiX3VzZVN0YXRlOSIsIl91c2VTdGF0ZTAiLCJzZXRFcnJvciIsIl91c2VTbmFja0Jhck1hbmFnZXIiLCJoYW5kbGVTbmFja2JhckVycm9yIiwiX3VzZVRyYW5zbGF0aW9uIiwidCIsImkxOG4iLCJsYXN0U2VsZWN0ZWRBZ2VudFJlZiIsImlzUmVmcmVzaGluZ1JlZiIsImxhc3RSZXF1ZXN0UmVmIiwiYWdlbnRzUmVmIiwicHJlU2VhcmNoQWdlbnRzUmVmIiwiY3VycmVudCIsImFkZEFnZW50IiwibmV3QWdlbnQiLCJvcHRpb25zIiwicHJldiIsImFnZW50RXhpc3RzIiwic29tZSIsImV4aXN0aW5nQWdlbnQiLCJuZXdEYXRhIiwic29ydGVkRGF0YSIsIl9vYmplY3RTcHJlYWQiLCJuYXZpZ2F0ZUhvbWUiLCJyZW1vdmVBZ2VudCIsImFnZW50SWQiLCJ0b1N0cmluZyIsInVwZGF0ZUFnZW50IiwidXBkYXRlZEFnZW50IiwidXBkYXRlZERhdGEiLCJ1cGRhdGVBZ2VudEZhdm9yaXRlIiwic2hvdWxkU29ydCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsIl9yZWYyIiwiYWdlbnRGaWVsZHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJtZXJnZWRBZ2VudCIsImZpbmFsRGF0YSIsImZpbmQiLCJfcmVmMyIsIl9leGNsdWRlZDIiLCJfcmVmNCIsIl9leGNsdWRlZDMiLCJzb3J0QWdlbnRzTGlzdCIsInNlbGVjdEZpcnN0QWdlbnQiLCJmaXJzdEFnZW50IiwiZmluZEluZGV4IiwiYWdlbnREYXRhIiwiaGFuZGxlR2V0QWdlbnRzIiwiX3JlZjUiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZTQiLCJhZ2VudFRvU2VsZWN0IiwiX2FnZW50VG9TZWxlY3QkaWQiLCJyZXF1ZXN0S2V5IiwiaXNNdWx0aUFnZW50cyIsImFnZW50UGFyc2VkIiwiaGFzTW9yZSIsIm5leHRPZmZzZXQiLCJjbG9uZUFnZW50c1JvbGVCbG9ja2VkIiwiY2FuRmV0Y2hDbG9uZUFnZW50cyIsImZldGNoR2xvYmFsQ2xvbmVBZ2VudHMiLCJjdXN0b21BZ2VudHMiLCJjdXN0b21IYXNNb3JlIiwiY3VzdG9tTmV4dE9mZnNldCIsImlzNDAzIiwibG9hZENsb25lQWdlbnRzIiwibG9hZEN1c3RvbUFnZW50cyIsInF1ZXJ5UGFyYW1zIiwicXVlcnlTdHJpbmciLCJwYXRoIiwiZ2xvYmFsQ2xvbmVBZ2VudHMiLCJfcmVzcG9uc2VFcnJvciRyZXNwb24iLCJfcmVzcG9uc2VFcnJvciRtZXNzYWciLCJfcmVzcG9uc2VFcnJvciRtZXNzYWcyIiwiaXM0MDNFcnJvciIsIl9hZ2VudFBhcnNlZCIsIl9hZ2VudFBhcnNlZDIiLCJfbGFzdFNlbGVjdGVkQWdlbnRSZWYiLCJfbGFzdFNlbGVjdGVkQWdlbnRSZWYyIiwiYXZhaWxhYmxlQWdlbnRzIiwiX2F2YWlsYWJsZUFnZW50cyIsIl9sYXN0U2VsZWN0ZWRBZ2VudFJlZjMiLCJfYXZhaWxhYmxlQWdlbnRzMiIsIl9hdmFpbGFibGVBZ2VudHMzIiwiZmlyc3RBdmFpbGFibGVBZ2VudCIsIl90NCIsIl90NSIsIndyYXAiLCJfY29udGV4dDQiLCJuZXh0IiwiYWJydXB0IiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTIiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsIl9yZWY2IiwiX2NhbGxlZSIsImNsb25lUmVzcG9uc2UiLCJjbG9uZURhdGEiLCJfdCIsIl9jb250ZXh0IiwibGFuZ3VhZ2UiLCJtZXRob2QiLCJzZW50IiwianNvbiIsInN0b3AiLCJhcHBseSIsIl9yZWY3IiwiX2NhbGxlZTIiLCJfbWFpYURhdGEkZGF0YSIsIm1haWFSZXNwb25zZSIsIm1haWFEYXRhIiwiX3QyIiwiX2NvbnRleHQyIiwiX3JlZjgiLCJfY2FsbGVlMyIsImN1c3RvbVJlc3BvbnNlIiwiY3VzdG9tRGF0YSIsIl90MyIsIl9jb250ZXh0MyIsImhhc19tb3JlIiwibmV4dF9vZmZzZXQiLCJQcm9taXNlIiwiYWxsIiwiVVJMU2VhcmNoUGFyYW1zIiwiYXBwZW5kIiwiYWdlbnRUb1JlcXVlc3QiLCJhZ2VudEl0ZW0iLCJFcnJvciIsInNldFRpbWVvdXQiLCJmaW5pc2giLCJfeCIsInNlYXJjaEN1c3RvbUFnZW50cyIsIl9yZWY5IiwiX2NhbGxlZTUiLCJxdWVyeSIsIl90NiIsIl9jb250ZXh0NSIsImVuY29kZVVSSUNvbXBvbmVudCIsImNsb25lQWdlbnRzIiwiY3VzdG9tUmVzdWx0cyIsIl94MiIsImxvYWRNb3JlQWdlbnRzIiwiX2NhbGxlZTYiLCJjYW5Mb2FkTW9yZSIsIl90NyIsIl9jb250ZXh0NiIsImV4aXN0aW5nTWFpYUFnZW50cyIsImV4aXN0aW5nSWRzIiwibmV3QWdlbnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL21haWEvQWdlbnRzL2dldEFnZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZVJlZiB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IHsgdXNlU25hY2tCYXJNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU25hY2tCYXJNYW5hZ2VyL3VzZVNuYWNrQmFyTWFuYWdlcidcbmltcG9ydCB7IGZldGNoTWFpYSB9IGZyb20gJy4uL2NsaWVudCdcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IGlzTWFpYUNsb25lQWdlbnRzUm9sZUJsb2NrZWQgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvbWFpYVRhc2tQYW5lbEFjY2VzcydcbmltcG9ydCB7IFNlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgbWFwQ09STGFuZyB9IGZyb20gJy4uLy4uLy4uL2xhbmcvdXRpbHMnXG5cbmNvbnN0IGlzTWFpYUFnZW50ID0gKGFnZW50OiBBZ2VudCkgPT4gYWdlbnQudHlwZSA9PT0gJ29yY2hlc3RyYXRvcidcblxuY29uc3QgaXNNYXJrZXRwbGFjZU1haWFrZXJFbmFibGVkID0gKCkgPT4gISF3aW5kb3cuTUFJQV9NQVJLRVRQTEFDRV9NQUlBS0VSXG5cbmNvbnN0IGlzNDAzQWdlbnRGZXRjaEVycm9yID0gKGVycjogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBlcnJvciA9IGVyciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXIgfTsgc3RhdHVzPzogbnVtYmVyOyBtZXNzYWdlPzogc3RyaW5nIH1cbiAgcmV0dXJuIChcbiAgICBlcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDAzIHx8XG4gICAgZXJyb3I/LnN0YXR1cyA9PT0gNDAzIHx8XG4gICAgQm9vbGVhbihlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoXCJZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHZpZXcgYWdlbnRzXCIpKSB8fFxuICAgIEJvb2xlYW4oZXJyb3I/Lm1lc3NhZ2U/LmluY2x1ZGVzKCdGYWlsZWQgZmV0Y2hpbmcgZGF0YScpKVxuICApXG59XG5cbmNvbnN0IG1lcmdlQWdlbnRzV2l0aG91dER1cGxpY2F0ZXMgPSAoYmFzZTogQWdlbnRbXSwgZXh0cmE6IEFnZW50W10pOiBBZ2VudFtdID0+IHtcbiAgY29uc3QgaWRzID0gbmV3IFNldChiYXNlLm1hcChhZ2VudCA9PiBhZ2VudC5pZCkpXG4gIGNvbnN0IG1lcmdlZCA9IFsuLi5iYXNlXVxuICBleHRyYS5mb3JFYWNoKGFnZW50ID0+IHtcbiAgICBpZiAoIWlkcy5oYXMoYWdlbnQuaWQpKSBtZXJnZWQucHVzaChhZ2VudClcbiAgfSlcbiAgcmV0dXJuIG1lcmdlZFxufVxuXG4vKipcbiAqIE9yZGVuYSBsb3MgYWdlbnRlczogTUFJQSBwcmltZXJvIChzaSBleGlzdGUpLCBsdWVnbyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZSwgbHVlZ28gbm8gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGVcbiAqL1xuY29uc3Qgc29ydEFnZW50cyA9IChhZ2VudHM6IEFnZW50W10pOiBBZ2VudFtdID0+IHtcbiAgY29uc3QgbWFpYUFnZW50cyA9IGFnZW50cy5maWx0ZXIoaXNNYWlhQWdlbnQpXG4gIGNvbnN0IG90aGVyQWdlbnRzID0gYWdlbnRzLmZpbHRlcihhZyA9PiAhaXNNYWlhQWdlbnQoYWcpKVxuXG4gIC8vIFNlcGFyYXIgZmF2b3JpdG9zIHkgbm8gZmF2b3JpdG9zXG4gIGNvbnN0IGZhdm9yaXRlcyA9IG90aGVyQWdlbnRzLmZpbHRlcihhZyA9PiBhZy5pc19mYXZvcml0ZSkuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSlcbiAgY29uc3Qgbm9uRmF2b3JpdGVzID0gb3RoZXJBZ2VudHMuZmlsdGVyKGFnID0+ICFhZy5pc19mYXZvcml0ZSkuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSlcblxuICByZXR1cm4gbWFpYUFnZW50cy5sZW5ndGggPyBbLi4ubWFpYUFnZW50cywgLi4uZmF2b3JpdGVzLCAuLi5ub25GYXZvcml0ZXNdIDogWy4uLmZhdm9yaXRlcywgLi4ubm9uRmF2b3JpdGVzXVxufVxuXG50eXBlIFVzZUdldEFnZW50c1Byb3BzID0ge1xuICBzZWxlY3RBZ2VudDogKGFnZW50OiBBZ2VudCkgPT4gdm9pZFxuICBzZWN0aW9uOiBTZWN0aW9uXG4gIGFnZW50OiBBZ2VudCB8IG51bGxcbiAgaGFuZGxlR29Ib21lOiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCB0eXBlIEFkZEFnZW50T3B0aW9ucyA9IHtcbiAgLyoqIFBvciBkZWZlY3RvIGB0cnVlYCAoY29tcG9ydGFtaWVudG8gQUJNKS4gUGFzYXIgYGZhbHNlYCBhbCBpbnNlcnRhciBhZ2VudGUgY3JlYWRvIHBvciBjaGF0IHNpbiBjYW1iaWFyIGRlIHZpc3RhLiAqL1xuICBuYXZpZ2F0ZUhvbWU/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCB1c2VHZXRBZ2VudHMgPSAoeyBzZWxlY3RBZ2VudCwgc2VjdGlvbiwgYWdlbnQsIGhhbmRsZUdvSG9tZSB9OiBVc2VHZXRBZ2VudHNQcm9wcykgPT4ge1xuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IFthZ2VudHMsIHNldEFnZW50c10gPSB1c2VTdGF0ZTx7IGRhdGE6IEFnZW50W107IGhhc19tb3JlPzogYm9vbGVhbjsgbmV4dF9vZmZzZXQ/OiBudW1iZXIgfCBudWxsIH0+KHsgZGF0YTogW10gfSlcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtsb2FkaW5nTW9yZSwgc2V0TG9hZGluZ01vcmVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzZWFyY2hMb2FkaW5nLCBzZXRTZWFyY2hMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHsgaGFuZGxlU25hY2tiYXJFcnJvciB9ID0gdXNlU25hY2tCYXJNYW5hZ2VyKClcbiAgY29uc3QgeyB0LCBpMThuIH0gPSB1c2VUcmFuc2xhdGlvbignY2hhdF9haV9zZWN0aW9uJylcbiAgY29uc3QgbGFzdFNlbGVjdGVkQWdlbnRSZWYgPSB1c2VSZWY8QWdlbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBpc1JlZnJlc2hpbmdSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGxhc3RSZXF1ZXN0UmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGFnZW50c1JlZiA9IHVzZVJlZihhZ2VudHMpXG4gIGNvbnN0IHByZVNlYXJjaEFnZW50c1JlZiA9IHVzZVJlZjx7IGRhdGE6IEFnZW50W107IGhhc19tb3JlPzogYm9vbGVhbjsgbmV4dF9vZmZzZXQ/OiBudW1iZXIgfCBudWxsIH0gfCBudWxsPihudWxsKVxuXG4gIGFnZW50c1JlZi5jdXJyZW50ID0gYWdlbnRzXG5cbiAgY29uc3QgYWRkQWdlbnQgPSB1c2VDYWxsYmFjayhcbiAgICAobmV3QWdlbnQ6IEFnZW50LCBvcHRpb25zPzogQWRkQWdlbnRPcHRpb25zKSA9PiB7XG4gICAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICAgIC8vIFZlcmlmaWNhciBzaSBlbCBhZ2VudGUgeWEgZXhpc3RlIHBhcmEgZXZpdGFyIGR1cGxpY2Fkb3NcbiAgICAgICAgY29uc3QgYWdlbnRFeGlzdHMgPSBwcmV2LmRhdGEuc29tZShleGlzdGluZ0FnZW50ID0+IGV4aXN0aW5nQWdlbnQuaWQgPT09IG5ld0FnZW50LmlkKVxuICAgICAgICBpZiAoYWdlbnRFeGlzdHMpIHtcbiAgICAgICAgICByZXR1cm4gcHJldlxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0RhdGEgPSBbLi4ucHJldi5kYXRhLCBuZXdBZ2VudF1cbiAgICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHMobmV3RGF0YSlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAob3B0aW9ucz8ubmF2aWdhdGVIb21lICE9PSBmYWxzZSkge1xuICAgICAgICBoYW5kbGVHb0hvbWUoKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2hhbmRsZUdvSG9tZV1cbiAgKVxuXG4gIGNvbnN0IHJlbW92ZUFnZW50ID0gdXNlQ2FsbGJhY2soKGFnZW50SWQ6IG51bWJlciB8IHN0cmluZykgPT4ge1xuICAgIHNldEFnZW50cyhwcmV2ID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgZGF0YTogcHJldi5kYXRhLmZpbHRlcihhID0+IGEuaWQgIT09IGFnZW50SWQudG9TdHJpbmcoKSksXG4gICAgfSkpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZUFnZW50ID0gdXNlQ2FsbGJhY2soKHVwZGF0ZWRBZ2VudDogQWdlbnQpID0+IHtcbiAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHByZXYuZGF0YS5tYXAoZXhpc3RpbmdBZ2VudCA9PlxuICAgICAgICBleGlzdGluZ0FnZW50LmlkID09PSB1cGRhdGVkQWdlbnQuaWQgPyB1cGRhdGVkQWdlbnQgOiBleGlzdGluZ0FnZW50XG4gICAgICApXG4gICAgICBjb25zdCBzb3J0ZWREYXRhID0gc29ydEFnZW50cyh1cGRhdGVkRGF0YSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICB9XG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3QgdXBkYXRlQWdlbnRGYXZvcml0ZSA9IHVzZUNhbGxiYWNrKFxuICAgICh1cGRhdGVkQWdlbnQ6IEFnZW50LCBzaG91bGRTb3J0OiBib29sZWFuID0gZmFsc2UpID0+IHtcbiAgICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBwcmV2LmRhdGEubWFwKGV4aXN0aW5nQWdlbnQgPT4ge1xuICAgICAgICAgIGlmIChleGlzdGluZ0FnZW50LmlkID09PSB1cGRhdGVkQWdlbnQuaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4uYWdlbnRGaWVsZHMgfSA9IHVwZGF0ZWRBZ2VudCBhcyBhbnlcbiAgICAgICAgICAgIGNvbnN0IG1lcmdlZEFnZW50ID0geyAuLi5leGlzdGluZ0FnZW50LCAuLi5hZ2VudEZpZWxkcyB9XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VkQWdlbnRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQWdlbnRcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTb2xvIG9yZGVuYXIgc2kgc2hvdWxkU29ydCBlcyB0cnVlXG4gICAgICAgIGNvbnN0IGZpbmFsRGF0YSA9IHNob3VsZFNvcnQgPyBzb3J0QWdlbnRzKHVwZGF0ZWREYXRhKSA6IHVwZGF0ZWREYXRhXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIGRhdGE6IGZpbmFsRGF0YSxcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gQWN0dWFsaXphciBlbCBhZ2VudGUgc2VsZWNjaW9uYWRvIHNpIGVzIGVsIHF1ZSBzZSBlc3TDoSBhY3R1YWxpemFuZG9cbiAgICAgIGlmIChhZ2VudD8uaWQgPT09IHVwZGF0ZWRBZ2VudC5pZCkge1xuICAgICAgICBjb25zdCBleGlzdGluZ0FnZW50ID0gYWdlbnRzLmRhdGEuZmluZChhID0+IGEuaWQgPT09IHVwZGF0ZWRBZ2VudC5pZClcbiAgICAgICAgaWYgKGV4aXN0aW5nQWdlbnQpIHtcbiAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmFnZW50RmllbGRzIH0gPSB1cGRhdGVkQWdlbnQgYXMgYW55XG4gICAgICAgICAgY29uc3QgbWVyZ2VkQWdlbnQgPSB7IC4uLmV4aXN0aW5nQWdlbnQsIC4uLmFnZW50RmllbGRzIH1cbiAgICAgICAgICBzZWxlY3RBZ2VudChtZXJnZWRBZ2VudClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmFnZW50RmllbGRzIH0gPSB1cGRhdGVkQWdlbnQgYXMgYW55XG4gICAgICAgICAgc2VsZWN0QWdlbnQoYWdlbnRGaWVsZHMgYXMgQWdlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudCwgc2VsZWN0QWdlbnQsIGFnZW50cy5kYXRhXVxuICApXG5cbiAgY29uc3Qgc29ydEFnZW50c0xpc3QgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHMocHJldi5kYXRhKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgZGF0YTogc29ydGVkRGF0YSxcbiAgICAgIH1cbiAgICB9KVxuICB9LCBbXSlcblxuICBjb25zdCBzZWxlY3RGaXJzdEFnZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKGFnZW50SWQ/OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChhZ2VudHMuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmlyc3RBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmRJbmRleChhZ2VudERhdGEgPT4gYWdlbnREYXRhLmlkID09PSBhZ2VudElkKVxuICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gYWdlbnRzLmRhdGFbZmlyc3RBZ2VudCA9PT0gMCA/IDEgOiAwXVxuICAgICAgICBzZWxlY3RBZ2VudChhZ2VudHMuZGF0YVtmaXJzdEFnZW50ID09PSAwID8gMSA6IDBdKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FnZW50cy5kYXRhLCBzZWxlY3RBZ2VudF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZUdldEFnZW50cyA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChhZ2VudFRvU2VsZWN0PzogQWdlbnQpID0+IHtcbiAgICAgIGlmIChpc1JlZnJlc2hpbmdSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdEtleSA9IGFnZW50VG9TZWxlY3Q/LmlkPy50b1N0cmluZygpIHx8ICdkZWZhdWx0J1xuICAgICAgaWYgKGxhc3RSZXF1ZXN0UmVmLmN1cnJlbnQgPT09IHJlcXVlc3RLZXkgJiYgIWxvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlzUmVmcmVzaGluZ1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgbGFzdFJlcXVlc3RSZWYuY3VycmVudCA9IHJlcXVlc3RLZXlcbiAgICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICAgIHNldEVycm9yKG51bGwpXG5cbiAgICAgIGNvbnN0IGlzTXVsdGlBZ2VudHMgPSAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgJiYgISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgYWdlbnRQYXJzZWQ6IEFnZW50W10gPSBbXVxuICAgICAgICBsZXQgaGFzTW9yZSA9IGZhbHNlXG4gICAgICAgIGxldCBuZXh0T2Zmc2V0OiBudW1iZXIgfCBudWxsID0gbnVsbFxuICAgICAgICBjb25zdCBjbG9uZUFnZW50c1JvbGVCbG9ja2VkID0gaXNNYWlhQ2xvbmVBZ2VudHNSb2xlQmxvY2tlZCh1c2VyLCBzZWN0aW9uKVxuICAgICAgICBjb25zdCBjYW5GZXRjaENsb25lQWdlbnRzID0gIWNsb25lQWdlbnRzUm9sZUJsb2NrZWRcblxuICAgICAgICBjb25zdCBmZXRjaEdsb2JhbENsb25lQWdlbnRzID0gYXN5bmMgKCk6IFByb21pc2U8QWdlbnRbXT4gPT4ge1xuICAgICAgICAgIGlmICghaXNNYXJrZXRwbGFjZU1haWFrZXJFbmFibGVkKCkgfHwgIWNhbkZldGNoQ2xvbmVBZ2VudHMpIHJldHVybiBbXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjbG9uZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgcGF0aDogYGFnZW50cz9hZ2VudF90eXBlPWNsb25lJmVudGl0eT1nbG9iYWwmbGFuZz0ke21hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSl9YCxcbiAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zdCBjbG9uZURhdGEgPSBhd2FpdCBjbG9uZVJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgcmV0dXJuIChjbG9uZURhdGEuZGF0YSB8fCBbXSkuZmlsdGVyKChhZzogQWdlbnQpID0+IGFnLnR5cGUgPT09ICdjbG9uZScpXG4gICAgICAgICAgfSBjYXRjaCAoY2xvbmVFcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzNDAzQWdlbnRGZXRjaEVycm9yKGNsb25lRXJyb3IpKSByZXR1cm4gW11cbiAgICAgICAgICAgIHRocm93IGNsb25lRXJyb3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaSB0aWVuZSBmZWF0dXJlIGFjY2VzcyBtdWx0aSBhZ2VudHMsIGhhY2VyIGRvcyBxdWVyaWVzIChNYWlhICsgY3VzdG9tKSBlbiBjdWFscXVpZXIgc2VjY2nDs25cbiAgICAgICAgaWYgKGlzTXVsdGlBZ2VudHMpIHtcbiAgICAgICAgICAvLyBRdWVyeSBjbG9uZSAoTWFpYSkgeSBjdXN0b20gc29uIGluZGVwZW5kaWVudGVzIOKGkiBzZSBkaXNwYXJhbiBlbiBwYXJhbGVsby5cbiAgICAgICAgICBsZXQgY3VzdG9tQWdlbnRzOiBBZ2VudFtdID0gW11cbiAgICAgICAgICBsZXQgY3VzdG9tSGFzTW9yZSA9IGZhbHNlXG4gICAgICAgICAgbGV0IGN1c3RvbU5leHRPZmZzZXQ6IG51bWJlciB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgICBjb25zdCBpczQwMyA9IGlzNDAzQWdlbnRGZXRjaEVycm9yXG5cbiAgICAgICAgICBsZXQgbWFpYUFnZW50czogQWdlbnRbXSA9IFtdXG5cbiAgICAgICAgICBjb25zdCBsb2FkQ2xvbmVBZ2VudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNhbkZldGNoQ2xvbmVBZ2VudHMpIHJldHVyblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgbWFpYVJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgICBwYXRoOiBgYWdlbnRzP2FnZW50X3R5cGU9b3JjaGVzdHJhdG9yJmxhbmc9JHttYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpfWAsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgY29uc3QgbWFpYURhdGEgPSBhd2FpdCBtYWlhUmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAgIG1haWFBZ2VudHMgPSBtYWlhRGF0YS5kYXRhPy5maWx0ZXIoaXNNYWlhQWdlbnQpIHx8IFtdXG4gICAgICAgICAgICAgIGNvbnN0IGdsb2JhbENsb25lQWdlbnRzID0gYXdhaXQgZmV0Y2hHbG9iYWxDbG9uZUFnZW50cygpXG4gICAgICAgICAgICAgIG1haWFBZ2VudHMgPSBtZXJnZUFnZW50c1dpdGhvdXREdXBsaWNhdGVzKG1haWFBZ2VudHMsIGdsb2JhbENsb25lQWdlbnRzKVxuICAgICAgICAgICAgfSBjYXRjaCAobWFpYUVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgIC8vIFNpIGVzIDQwMywgY29udGludWFyIHNpbiBsb3MgY2xvbmVBZ2VudHM7IHNpIGVzIG90cm8gZXJyb3IsIHByb3BhZ2FybG9cbiAgICAgICAgICAgICAgaWYgKCFpczQwMyhtYWlhRXJyb3IpKSB0aHJvdyBtYWlhRXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBsb2FkQ3VzdG9tQWdlbnRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgY3VzdG9tUmVzcG9uc2UgPSBhd2FpdCBmZXRjaE1haWEoe1xuICAgICAgICAgICAgICAgIHBhdGg6ICdhZ2VudHM/YWdlbnRfdHlwZT1jdXN0b20mbGltaXQ9NyZvZmZzZXQ9MCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRGF0YSA9IGF3YWl0IGN1c3RvbVJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgICBjdXN0b21BZ2VudHMgPSBjdXN0b21EYXRhLmRhdGEgfHwgW11cbiAgICAgICAgICAgICAgY3VzdG9tSGFzTW9yZSA9IGN1c3RvbURhdGEuaGFzX21vcmUgfHwgZmFsc2VcbiAgICAgICAgICAgICAgY3VzdG9tTmV4dE9mZnNldCA9IGN1c3RvbURhdGEubmV4dF9vZmZzZXQgfHwgbnVsbFxuICAgICAgICAgICAgfSBjYXRjaCAoY3VzdG9tRXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAvLyBTaSBlcyA0MDMsIGNvbnRpbnVhciBzaW4gbG9zIGN1c3RvbUFnZW50cyAocXVlZGEgY29tbyBhcnJheSB2YWPDrW8pOyBzaSBubywgcHJvcGFnYXJsb1xuICAgICAgICAgICAgICBpZiAoIWlzNDAzKGN1c3RvbUVycm9yKSkgdGhyb3cgY3VzdG9tRXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbbG9hZENsb25lQWdlbnRzKCksIGxvYWRDdXN0b21BZ2VudHMoKV0pXG5cbiAgICAgICAgICAvLyBDb21iaW5hcjogYWdlbnRlcyBjbG9uZSBwcmltZXJvLCBsdWVnbyBsb3MgY3VzdG9tIChzaSBleGlzdGVuKVxuICAgICAgICAgIC8vIFNpIGVsIHVzdWFyaW8gdGllbmUgdW4gcm9sIGRlc2hhYmlsaXRhZG8sIG5vIGluY2x1aXIgY2xvbmVBZ2VudHNcbiAgICAgICAgICBpZiAoIWNhbkZldGNoQ2xvbmVBZ2VudHMpIHtcbiAgICAgICAgICAgIC8vIFJvbCBzaW4gYWNjZXNvIGEgY2xvbmVzIChwLiBlai4gZnJlZWxhbmNlci9jbGllbnRlIG8gY29sYWJvcmFkb3IgZW4gcHJvamVjdC9jbGllbnQpOiBzb2xvIGN1c3RvbUFnZW50c1xuICAgICAgICAgICAgLy8gU2kgY3VzdG9tQWdlbnRzIGVzdMOhIHZhY8OtbyAocG9yIDQwMyksIGFnZW50UGFyc2VkIHNlcsOhIFtdXG4gICAgICAgICAgICBhZ2VudFBhcnNlZCA9IGN1c3RvbUFnZW50c1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZ2VudFBhcnNlZCA9IG1haWFBZ2VudHMubGVuZ3RoID8gWy4uLm1haWFBZ2VudHMsIC4uLmN1c3RvbUFnZW50c10gOiBjdXN0b21BZ2VudHNcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gT3JkZW5hcjogTWFpYSBwcmltZXJvLCBsdWVnbyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZSwgbHVlZ28gbm8gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGVcbiAgICAgICAgICBhZ2VudFBhcnNlZCA9IHNvcnRBZ2VudHMoYWdlbnRQYXJzZWQpXG4gICAgICAgICAgaGFzTW9yZSA9IGN1c3RvbUhhc01vcmVcbiAgICAgICAgICBuZXh0T2Zmc2V0ID0gY3VzdG9tTmV4dE9mZnNldFxuXG4gICAgICAgICAgc2V0QWdlbnRzKHtcbiAgICAgICAgICAgIGRhdGE6IGFnZW50UGFyc2VkLFxuICAgICAgICAgICAgaGFzX21vcmU6IGhhc01vcmUsXG4gICAgICAgICAgICBuZXh0X29mZnNldDogbmV4dE9mZnNldCxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gU2kgbm8gaGF5IGFnZW50ZXMgZGVzcHXDqXMgZGUgcHJvY2VzYXIgbGFzIHF1ZXJpZXMsIGxpbXBpYXIgZWwgZXJyb3JcbiAgICAgICAgICBpZiAoYWdlbnRQYXJzZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzZXRFcnJvcihudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBMw7NnaWNhIHBhcmEgcHJvamVjdCwgY2xpZW50IG8gaGVhZGVyIHNpbiBtdWx0aUFnZW50cyAobWlzbW8gY3JpdGVyaW8gZGUgb3JkZW4gcHJvamVjdC9jbGllbnQ7IGhlYWRlciBhw7FhZGUgcGFnaW5hY2nDs24pXG4gICAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICAgICAgICBpZiAoc2VjdGlvbiA9PT0gJ3Byb2plY3QnIHx8IHNlY3Rpb24gPT09ICdjbGllbnQnIHx8IHNlY3Rpb24gPT09ICdoZWFkZXInIHx8IHNlY3Rpb24gPT09ICd0YXNrJykge1xuICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdhZ2VudF90eXBlJywgJ29yY2hlc3RyYXRvcicpXG4gICAgICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xhbmcnLCBtYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpKVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24gPT09ICdoZWFkZXInKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnbGltaXQnLCAnNycpXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnb2Zmc2V0JywgJzAnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcXVlcnlQYXJhbXMudG9TdHJpbmcoKVxuICAgICAgICAgIGNvbnN0IHBhdGggPSBgYWdlbnRzJHtxdWVyeVN0cmluZyA/IGA/JHtxdWVyeVN0cmluZ31gIDogJyd9YFxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgIC8vIGRhdGEuZGF0YSB5YSBjb250aWVuZSBlbC9sb3MgYWdlbnRlcyBvcnF1ZXN0YWRvcmVzIGRlIGxhIHF1ZXJ5IGFnZW50X3R5cGU9b3JjaGVzdHJhdG9yXG4gICAgICAgICAgICBhZ2VudFBhcnNlZCA9IGRhdGEuZGF0YSB8fCBbXVxuICAgICAgICAgICAgY29uc3QgZ2xvYmFsQ2xvbmVBZ2VudHMgPSBhd2FpdCBmZXRjaEdsb2JhbENsb25lQWdlbnRzKClcbiAgICAgICAgICAgIGFnZW50UGFyc2VkID0gbWVyZ2VBZ2VudHNXaXRob3V0RHVwbGljYXRlcyhhZ2VudFBhcnNlZCwgZ2xvYmFsQ2xvbmVBZ2VudHMpXG4gICAgICAgICAgICAvLyBPcmRlbmFyOiBNYWlhIHByaW1lcm8sIGx1ZWdvIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlLCBsdWVnbyBubyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZVxuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBzb3J0QWdlbnRzKGFnZW50UGFyc2VkKVxuICAgICAgICAgICAgaGFzTW9yZSA9IGRhdGEuaGFzX21vcmVcbiAgICAgICAgICAgIG5leHRPZmZzZXQgPSBkYXRhLm5leHRfb2Zmc2V0XG5cbiAgICAgICAgICAgIHNldEFnZW50cyh7XG4gICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgIGRhdGE6IGFnZW50UGFyc2VkLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGNhdGNoIChyZXNwb25zZUVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIC8vIFZlcmlmaWNhciBzaSBlbCBlcnJvciBlcyA0MDNcbiAgICAgICAgICAgIC8vIGZldGNoQ09SIHB1ZWRlIGxhbnphciBkaWZlcmVudGVzIHRpcG9zIGRlIGVycm9yZXM6XG4gICAgICAgICAgICAvLyAxLiBFcnJvciBjb24gZXJyb3JEYXRhLmRldGFpbCBzaSBpbmNsdXllICdBY2Nlc3MgZGVuaWVkJ1xuICAgICAgICAgICAgLy8gMi4gRXJyb3IgZ2Vuw6lyaWNvICdGYWlsZWQgZmV0Y2hpbmcgZGF0YScgc2kgZXMgNDAzIHBlcm8gbm8gaW5jbHV5ZSAnQWNjZXNzIGRlbmllZCdcbiAgICAgICAgICAgIC8vIDMuIE5lY2VzaXRhbW9zIHZlcmlmaWNhciBlbCBzdGF0dXMgY29kZSBzaSBlc3TDoSBkaXNwb25pYmxlXG4gICAgICAgICAgICBjb25zdCBpczQwM0Vycm9yID1cbiAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8ucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDAzIHx8XG4gICAgICAgICAgICAgIHJlc3BvbnNlRXJyb3I/LnN0YXR1cyA9PT0gNDAzIHx8XG4gICAgICAgICAgICAgIHJlc3BvbnNlRXJyb3I/Lm1lc3NhZ2U/LmluY2x1ZGVzKFwiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IGFnZW50c1wiKSB8fFxuICAgICAgICAgICAgICByZXNwb25zZUVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcygnRmFpbGVkIGZldGNoaW5nIGRhdGEnKSAvLyBmZXRjaENPUiBsYW56YSBlc3RvIHBhcmEgNDAzIHNpbiAnQWNjZXNzIGRlbmllZCdcblxuICAgICAgICAgICAgaWYgKGlzNDAzRXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gU2kgZXMgNDAzLCBlc3RhYmxlY2VyIGFnZW50ZXMgdmFjw61vcyB5IGNvbnRpbnVhclxuICAgICAgICAgICAgICBzZXRBZ2VudHMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgICAgIGhhc19tb3JlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBuZXh0X29mZnNldDogbnVsbCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgc2V0RXJyb3IobnVsbClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFNpIGVzIG90cm8gZXJyb3IsIGxhbnphcmxvXG4gICAgICAgICAgICAgIHRocm93IHJlc3BvbnNlRXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMw7NnaWNhIGRlIHNlbGVjdCBhZ2VudCAtIFNvbG8gc2VsZWNjaW9uYXIgc2kgaGF5IGFnZW50ZXMgZGlzcG9uaWJsZXNcbiAgICAgICAgaWYgKGFnZW50UGFyc2VkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAoYWdlbnRUb1NlbGVjdCAmJiBhZ2VudFBhcnNlZC5maW5kKChhZ2VudFRvUmVxdWVzdDogQWdlbnQpID0+IGFnZW50VG9SZXF1ZXN0LmlkID09PSBhZ2VudFRvU2VsZWN0LmlkKSkge1xuICAgICAgICAgICAgaWYgKGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQ/LmlkICE9PSBhZ2VudFRvU2VsZWN0LmlkKSB7XG4gICAgICAgICAgICAgIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQgPSBhZ2VudFRvU2VsZWN0XG4gICAgICAgICAgICAgIHNlbGVjdEFnZW50KGFnZW50VG9TZWxlY3QpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhZ2VudFBhcnNlZD8uWzBdICYmICghYWdlbnQgfHwgIWFnZW50UGFyc2VkLmZpbmQoKGE6IEFnZW50KSA9PiBhLmlkID09PSBhZ2VudC5pZCkpKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVBZ2VudHMgPVxuICAgICAgICAgICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmICFjbG9uZUFnZW50c1JvbGVCbG9ja2VkXG4gICAgICAgICAgICAgICAgPyBhZ2VudFBhcnNlZFxuICAgICAgICAgICAgICAgIDogYWdlbnRQYXJzZWQuZmlsdGVyKChhZ2VudEl0ZW06IEFnZW50KSA9PiAhaXNNYWlhQWdlbnQoYWdlbnRJdGVtKSlcblxuICAgICAgICAgICAgY29uc3QgW2ZpcnN0QWdlbnRdID0gYXZhaWxhYmxlQWdlbnRzXG4gICAgICAgICAgICBpZiAoZmlyc3RBZ2VudCAmJiBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50Py5pZCAhPT0gZmlyc3RBZ2VudC5pZCkge1xuICAgICAgICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gZmlyc3RBZ2VudFxuICAgICAgICAgICAgICBzZWxlY3RBZ2VudChmaXJzdEFnZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWdlbnRUb1NlbGVjdCAmJiBhZ2VudFBhcnNlZD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVBZ2VudHMgPVxuICAgICAgICAgICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmICFjbG9uZUFnZW50c1JvbGVCbG9ja2VkXG4gICAgICAgICAgICAgICAgPyBhZ2VudFBhcnNlZFxuICAgICAgICAgICAgICAgIDogYWdlbnRQYXJzZWQuZmlsdGVyKChhZ2VudEl0ZW06IEFnZW50KSA9PiAhaXNNYWlhQWdlbnQoYWdlbnRJdGVtKSlcblxuICAgICAgICAgICAgY29uc3QgW2ZpcnN0QXZhaWxhYmxlQWdlbnRdID0gYXZhaWxhYmxlQWdlbnRzXG4gICAgICAgICAgICBpZiAoZmlyc3RBdmFpbGFibGVBZ2VudCAmJiBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50Py5pZCAhPT0gZmlyc3RBdmFpbGFibGVBZ2VudC5pZCkge1xuICAgICAgICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gZmlyc3RBdmFpbGFibGVBZ2VudFxuICAgICAgICAgICAgICBzZWxlY3RBZ2VudChmaXJzdEF2YWlsYWJsZUFnZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2V0RXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6ICdBbiB1bmtub3duIGVycm9yIG9jY3VycmVkJylcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlzUmVmcmVzaGluZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFpc1JlZnJlc2hpbmdSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgbGFzdFJlcXVlc3RSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtzZWxlY3RBZ2VudCwgc2VjdGlvbiwgYWdlbnQsIGxvYWRpbmddXG4gIClcblxuICBjb25zdCBzZWFyY2hDdXN0b21BZ2VudHMgPSB1c2VDYWxsYmFjayhhc3luYyAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgIGlmICghcXVlcnkpIHtcbiAgICAgIGlmIChwcmVTZWFyY2hBZ2VudHNSZWYuY3VycmVudCkge1xuICAgICAgICBzZXRBZ2VudHMocHJlU2VhcmNoQWdlbnRzUmVmLmN1cnJlbnQpXG4gICAgICAgIHByZVNlYXJjaEFnZW50c1JlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFwcmVTZWFyY2hBZ2VudHNSZWYuY3VycmVudCkge1xuICAgICAgcHJlU2VhcmNoQWdlbnRzUmVmLmN1cnJlbnQgPSBhZ2VudHNSZWYuY3VycmVudFxuICAgIH1cblxuICAgIHNldFNlYXJjaExvYWRpbmcodHJ1ZSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgIHBhdGg6IGBhZ2VudHM/YWdlbnRfdHlwZT1jdXN0b20mbGltaXQ9MjAmb2Zmc2V0PTAmcT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9YCxcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIH0pXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgICAgY29uc3QgY2xvbmVBZ2VudHMgPSBwcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+IGFnLnR5cGUgPT09ICdjbG9uZScpXG4gICAgICAgIGNvbnN0IGN1c3RvbVJlc3VsdHM6IEFnZW50W10gPSBkYXRhLmRhdGEgfHwgW11cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBjbG9uZUFnZW50cy5sZW5ndGggPyBbLi4uY2xvbmVBZ2VudHMsIC4uLmN1c3RvbVJlc3VsdHNdIDogY3VzdG9tUmVzdWx0cyxcbiAgICAgICAgICBoYXNfbW9yZTogZmFsc2UsXG4gICAgICAgICAgbmV4dF9vZmZzZXQ6IG51bGwsXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBoYW5kbGVTbmFja2JhckVycm9yKHQoJ3NuYWNrYmFyLmxvYWRNb3JlQWdlbnRzLmVycm9yJykpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFNlYXJjaExvYWRpbmcoZmFsc2UpXG4gICAgfVxuICB9LCBbXSlcblxuICBjb25zdCBsb2FkTW9yZUFnZW50cyA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpc011bHRpQWdlbnRzID0gISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmICEhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcbiAgICAvLyBDYXJnYXIgbcOhczogZW4gaGVhZGVyIHNpZW1wcmU7IGVuIHByb2plY3Qgc29sbyBzaSBpc011bHRpQWdlbnRzIChwb3JxdWUgc29sbyBlbnRvbmNlcyBoYXkgcGFnaW5hY2nDs24gZGUgY3VzdG9tKVxuICAgIGNvbnN0IGNhbkxvYWRNb3JlID0gc2VjdGlvbiA9PT0gJ2hlYWRlcicgfHwgaXNNdWx0aUFnZW50c1xuICAgIGlmICghY2FuTG9hZE1vcmUgfHwgIWFnZW50cy5oYXNfbW9yZSB8fCAhYWdlbnRzLm5leHRfb2Zmc2V0IHx8IGxvYWRpbmdNb3JlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRMb2FkaW5nTW9yZSh0cnVlKVxuICAgIHNldEVycm9yKG51bGwpXG5cbiAgICB0cnkge1xuICAgICAgbGV0IHBhdGg6IHN0cmluZ1xuXG4gICAgICAvLyBTaSBlcyBtdWx0aUFnZW50cywgc29sbyBjYXJnYXIgYWdlbnRzIGN1c3RvbSAoTWFpYSB5YSBlc3TDoSBjYXJnYWRvKVxuICAgICAgaWYgKGlzTXVsdGlBZ2VudHMpIHtcbiAgICAgICAgLy8gTWFudGVuZXIgY2FudGlkYWQgaW1wYXIgZGUgY2FyZHM6IHByaW1lcmEgY2FyZ2EgNywgc2lndWllbnRlcyArNiAoNywgMTMsIDE5LCAuLi4pXG4gICAgICAgIHBhdGggPSBgYWdlbnRzP2FnZW50X3R5cGU9Y3VzdG9tJmxpbWl0PTYmb2Zmc2V0PSR7YWdlbnRzLm5leHRfb2Zmc2V0fWBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNpIG5vIGVzIG11bHRpQWdlbnRzLCBjYXJnYXIgbcOhcyBhZ2VudGVzIG9ycXVlc3RhZG9yZXMgKE1BSUEpXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnYWdlbnRfdHlwZScsICdvcmNoZXN0cmF0b3InKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xhbmcnLCBtYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xpbWl0JywgJzcnKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ29mZnNldCcsIGFnZW50cy5uZXh0X29mZnNldC50b1N0cmluZygpKVxuICAgICAgICBwYXRoID0gYGFnZW50cz8ke3F1ZXJ5UGFyYW1zLnRvU3RyaW5nKCl9YFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG5cbiAgICAgIC8vIEFjdW11bGFyIGFnZW50ZXMsIGV4Y2x1eWVuZG8gZHVwbGljYWRvc1xuICAgICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgICBpZiAoaXNNdWx0aUFnZW50cykge1xuICAgICAgICAgIC8vIEzDs2dpY2EgcGFyYSBtdWx0aUFnZW50czogc2VwYXJhciBNQUlBIHkgY3VzdG9tXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdNYWlhQWdlbnRzID0gcHJldi5kYXRhLmZpbHRlcihpc01haWFBZ2VudClcblxuICAgICAgICAgIC8vIE9idGVuZXIgSURzIGV4aXN0ZW50ZXMgKGV4Y2x1eWVuZG8gTUFJQSlcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiAhaXNNYWlhQWdlbnQoYWcpKS5tYXAoKGFnOiBBZ2VudCkgPT4gYWcuaWQpKVxuXG4gICAgICAgICAgLy8gRmlsdHJhciBudWV2b3MgYWdlbnRzIHF1ZSBubyBlc3TDqW4geWEgZW4gbGEgbGlzdGEgKHkgcXVlIG5vIHNlYW4gTUFJQSlcbiAgICAgICAgICBjb25zdCBuZXdBZ2VudHMgPSBkYXRhLmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+ICFpc01haWFBZ2VudChhZykgJiYgIWV4aXN0aW5nSWRzLmhhcyhhZy5pZCkpXG5cbiAgICAgICAgICBjb25zdCBuZXdEYXRhID0gZXhpc3RpbmdNYWlhQWdlbnRzLmxlbmd0aFxuICAgICAgICAgICAgPyBbLi4uZXhpc3RpbmdNYWlhQWdlbnRzLCAuLi5wcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+ICFpc01haWFBZ2VudChhZykpLCAuLi5uZXdBZ2VudHNdXG4gICAgICAgICAgICA6IFsuLi5wcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+ICFpc01haWFBZ2VudChhZykpLCAuLi5uZXdBZ2VudHNdXG5cbiAgICAgICAgICAvLyBPcmRlbmFyOiBNYWlhIHByaW1lcm8sIGx1ZWdvIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlLCBsdWVnbyBubyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZVxuICAgICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogc29ydGVkRGF0YSxcbiAgICAgICAgICAgIGhhc19tb3JlOiBkYXRhLmhhc19tb3JlLFxuICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IGRhdGEubmV4dF9vZmZzZXQsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEzDs2dpY2EgcGFyYSAhaXNNdWx0aUFnZW50czogYWdyZWdhciBldml0YW5kbyBkdXBsaWNhZG9zXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2LmRhdGEubWFwKChhZzogQWdlbnQpID0+IGFnLmlkKSlcbiAgICAgICAgY29uc3QgbmV3QWdlbnRzID0gKGRhdGEuZGF0YSB8fCBbXSkuZmlsdGVyKChhZzogQWdlbnQpID0+ICFleGlzdGluZ0lkcy5oYXMoYWcuaWQpKVxuICAgICAgICBjb25zdCBuZXdEYXRhID0gWy4uLnByZXYuZGF0YSwgLi4ubmV3QWdlbnRzXVxuXG4gICAgICAgIC8vIE9yZGVuYXI6IE1haWEgcHJpbWVybywgbHVlZ28gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGUsIGx1ZWdvIG5vIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlXG4gICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgICAgIGhhc19tb3JlOiBkYXRhLmhhc19tb3JlLFxuICAgICAgICAgIG5leHRfb2Zmc2V0OiBkYXRhLm5leHRfb2Zmc2V0LFxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBzZXRMb2FkaW5nTW9yZShmYWxzZSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodCgnc25hY2tiYXIubG9hZE1vcmVBZ2VudHMuZXJyb3InKSlcbiAgICAgIHNldExvYWRpbmdNb3JlKGZhbHNlKVxuICAgIH1cbiAgfSwgW3NlY3Rpb24sIGFnZW50cy5oYXNfbW9yZSwgYWdlbnRzLm5leHRfb2Zmc2V0LCBsb2FkaW5nTW9yZSwgaTE4bi5sYW5ndWFnZV0pXG5cbiAgcmV0dXJuIHtcbiAgICBhZ2VudHMsXG4gICAgbG9hZGluZyxcbiAgICBsb2FkaW5nTW9yZSxcbiAgICBlcnJvcixcbiAgICBoYW5kbGVHZXRBZ2VudHMsXG4gICAgbG9hZE1vcmVBZ2VudHMsXG4gICAgc2VhcmNoQ3VzdG9tQWdlbnRzLFxuICAgIHNlYXJjaExvYWRpbmcsXG4gICAgYWRkQWdlbnQsXG4gICAgcmVtb3ZlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgICBzZWxlY3RGaXJzdEFnZW50LFxuICAgIHNvcnRBZ2VudHNMaXN0LFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxRQUFRLEVBQUVDLFdBQVcsRUFBRUMsTUFBTSxRQUFRLE9BQU87QUFDckQsU0FBU0MsY0FBYyxRQUFRLGVBQWU7QUFDOUMsU0FBU0Msa0JBQWtCLFFBQVEsc0RBQXNEO0FBQ3pGLFNBQVNDLFNBQVMsUUFBUSxXQUFXO0FBRXJDLFNBQVNDLE9BQU8sUUFBUSwyQkFBMkI7QUFDbkQsU0FBU0MsNEJBQTRCLFFBQVEsd0NBQXdDO0FBRXJGLFNBQVNDLFVBQVUsUUFBUSxxQkFBcUI7QUFFaEQsSUFBTUMsV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQUlDLEtBQVk7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
665
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUNhbGxiYWNrIiwidXNlUmVmIiwidXNlVHJhbnNsYXRpb24iLCJ1c2VTbmFja0Jhck1hbmFnZXIiLCJmZXRjaE1haWEiLCJ1c2VVc2VyIiwiaXNNYWlhQ2xvbmVBZ2VudHNSb2xlQmxvY2tlZCIsIm1hcENPUkxhbmciLCJzb3J0QWdlbnRzIiwiYWdlbnRzIiwiY2xvbmVBZ2VudHMiLCJmaWx0ZXIiLCJhZyIsInR5cGUiLCJvdGhlckFnZW50cyIsImZhdm9yaXRlcyIsImlzX2Zhdm9yaXRlIiwic29ydCIsImEiLCJiIiwibmFtZSIsImxvY2FsZUNvbXBhcmUiLCJub25GYXZvcml0ZXMiLCJsZW5ndGgiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJ1c2VHZXRBZ2VudHMiLCJfcmVmIiwic2VsZWN0QWdlbnQiLCJzZWN0aW9uIiwiYWdlbnQiLCJoYW5kbGVHb0hvbWUiLCJ1c2VyIiwiX3VzZVN0YXRlIiwiZGF0YSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInNldEFnZW50cyIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwibG9hZGluZyIsInNldExvYWRpbmciLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImxvYWRpbmdNb3JlIiwic2V0TG9hZGluZ01vcmUiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInNlYXJjaExvYWRpbmciLCJzZXRTZWFyY2hMb2FkaW5nIiwiX3VzZVN0YXRlOSIsIl91c2VTdGF0ZTAiLCJlcnJvciIsInNldEVycm9yIiwiX3VzZVNuYWNrQmFyTWFuYWdlciIsImhhbmRsZVNuYWNrYmFyRXJyb3IiLCJfdXNlVHJhbnNsYXRpb24iLCJ0IiwiaTE4biIsImxhc3RTZWxlY3RlZEFnZW50UmVmIiwiaXNSZWZyZXNoaW5nUmVmIiwibGFzdFJlcXVlc3RSZWYiLCJhZ2VudHNSZWYiLCJwcmVTZWFyY2hBZ2VudHNSZWYiLCJjdXJyZW50IiwiY2FuRmV0Y2hDbG9uZUFnZW50cyIsImFkZEFnZW50IiwibmV3QWdlbnQiLCJvcHRpb25zIiwicHJldiIsImFnZW50RXhpc3RzIiwic29tZSIsImV4aXN0aW5nQWdlbnQiLCJpZCIsIm5ld0RhdGEiLCJzb3J0ZWREYXRhIiwiX29iamVjdFNwcmVhZCIsIm5hdmlnYXRlSG9tZSIsInJlbW92ZUFnZW50IiwiYWdlbnRJZCIsInRvU3RyaW5nIiwidXBkYXRlQWdlbnQiLCJ1cGRhdGVkQWdlbnQiLCJ1cGRhdGVkRGF0YSIsIm1hcCIsInVwZGF0ZUFnZW50RmF2b3JpdGUiLCJzaG91bGRTb3J0IiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiX3JlZjIiLCJtZXNzYWdlIiwiYWdlbnRGaWVsZHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJtZXJnZWRBZ2VudCIsImZpbmFsRGF0YSIsImZpbmQiLCJfcmVmMyIsIl9leGNsdWRlZDIiLCJfcmVmNCIsIl9leGNsdWRlZDMiLCJzb3J0QWdlbnRzTGlzdCIsInNlbGVjdEZpcnN0QWdlbnQiLCJmaXJzdEFnZW50IiwiZmluZEluZGV4IiwiYWdlbnREYXRhIiwiaGFuZGxlR2V0QWdlbnRzIiwiX3JlZjUiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZTMiLCJhZ2VudFRvU2VsZWN0IiwiX2FnZW50VG9TZWxlY3QkaWQiLCJyZXF1ZXN0S2V5IiwiaXNNdWx0aUFnZW50cyIsImFnZW50UGFyc2VkIiwiaGFzTW9yZSIsIm5leHRPZmZzZXQiLCJjdXN0b21BZ2VudHMiLCJjdXN0b21IYXNNb3JlIiwiY3VzdG9tTmV4dE9mZnNldCIsImlzNDAzIiwibG9hZENsb25lQWdlbnRzIiwibG9hZEN1c3RvbUFnZW50cyIsInNob3VsZFJlcXVlc3RDbG9uZUFnZW50cyIsInF1ZXJ5UGFyYW1zIiwicGF0aCIsInJlc3BvbnNlIiwiX3Jlc3BvbnNlRXJyb3IkcmVzcG9uIiwiX3Jlc3BvbnNlRXJyb3IkbWVzc2FnIiwiX3Jlc3BvbnNlRXJyb3IkbWVzc2FnMiIsImlzNDAzRXJyb3IiLCJfYWdlbnRQYXJzZWQiLCJfYWdlbnRQYXJzZWQyIiwiX2xhc3RTZWxlY3RlZEFnZW50UmVmIiwiX2xhc3RTZWxlY3RlZEFnZW50UmVmMiIsImF2YWlsYWJsZUFnZW50cyIsIl9hdmFpbGFibGVBZ2VudHMiLCJfbGFzdFNlbGVjdGVkQWdlbnRSZWYzIiwiX2F2YWlsYWJsZUFnZW50czIiLCJfYXZhaWxhYmxlQWdlbnRzMyIsImZpcnN0QXZhaWxhYmxlQWdlbnQiLCJfdDMiLCJfdDQiLCJ3cmFwIiwiX2NvbnRleHQzIiwibmV4dCIsImFicnVwdCIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJlcnIiLCJfZXJyJHJlc3BvbnNlIiwiX2VyciRtZXNzYWdlIiwiX2VyciRtZXNzYWdlMiIsInN0YXR1cyIsImluY2x1ZGVzIiwiX3JlZjYiLCJfY2FsbGVlIiwiX21haWFEYXRhJGRhdGEiLCJvcmRlclBhcmFtIiwibWFpYVJlc3BvbnNlIiwibWFpYURhdGEiLCJfdCIsIl9jb250ZXh0IiwibGFuZ3VhZ2UiLCJtZXRob2QiLCJzZW50IiwianNvbiIsInN0b3AiLCJhcHBseSIsIl9yZWY3IiwiX2NhbGxlZTIiLCJjdXN0b21SZXNwb25zZSIsImN1c3RvbURhdGEiLCJfdDIiLCJfY29udGV4dDIiLCJoYXNfbW9yZSIsIm5leHRfb2Zmc2V0IiwiUHJvbWlzZSIsImFsbCIsIlVSTFNlYXJjaFBhcmFtcyIsImFwcGVuZCIsImFnZW50VG9SZXF1ZXN0IiwiYWdlbnRJdGVtIiwiRXJyb3IiLCJzZXRUaW1lb3V0IiwiZmluaXNoIiwiX3giLCJzZWFyY2hDdXN0b21BZ2VudHMiLCJfcmVmOCIsIl9jYWxsZWU0IiwicXVlcnkiLCJfdDUiLCJfY29udGV4dDQiLCJlbmNvZGVVUklDb21wb25lbnQiLCJjdXN0b21SZXN1bHRzIiwiX3gyIiwibG9hZE1vcmVBZ2VudHMiLCJfY2FsbGVlNSIsImNhbkxvYWRNb3JlIiwiX3Q2IiwiX2NvbnRleHQ1IiwiZXhpc3RpbmdDbG9uZUFnZW50cyIsImV4aXN0aW5nSWRzIiwiU2V0IiwibmV3QWdlbnRzIiwiaGFzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL21haWEvQWdlbnRzL2dldEFnZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZVJlZiB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IHsgdXNlU25hY2tCYXJNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU25hY2tCYXJNYW5hZ2VyL3VzZVNuYWNrQmFyTWFuYWdlcidcbmltcG9ydCB7IGZldGNoTWFpYSB9IGZyb20gJy4uL2NsaWVudCdcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IGlzTWFpYUNsb25lQWdlbnRzUm9sZUJsb2NrZWQgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvbWFpYVRhc2tQYW5lbEFjY2VzcydcbmltcG9ydCB7IG1hcENPUkxhbmcgfSBmcm9tICcuLi8uLi8uLi9sYW5nL3V0aWxzJ1xuXG4vKipcbiAqIE9yZGVuYSBsb3MgYWdlbnRlczogYWdlbnRlcyBjbG9uZSBwcmltZXJvIChzaSBleGlzdGVuKSwgbHVlZ28gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGUsIGx1ZWdvIG5vIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlXG4gKi9cbmNvbnN0IHNvcnRBZ2VudHMgPSAoYWdlbnRzOiBBZ2VudFtdKTogQWdlbnRbXSA9PiB7XG4gIC8vIFNlcGFyYXIgYWdlbnRlcyBjbG9uZSBkZWwgcmVzdG9cbiAgY29uc3QgY2xvbmVBZ2VudHMgPSBhZ2VudHMuZmlsdGVyKGFnID0+IGFnLnR5cGUgPT09ICdjbG9uZScpXG4gIGNvbnN0IG90aGVyQWdlbnRzID0gYWdlbnRzLmZpbHRlcihhZyA9PiBhZy50eXBlICE9PSAnY2xvbmUnKVxuXG4gIC8vIFNlcGFyYXIgZmF2b3JpdG9zIHkgbm8gZmF2b3JpdG9zXG4gIGNvbnN0IGZhdm9yaXRlcyA9IG90aGVyQWdlbnRzLmZpbHRlcihhZyA9PiBhZy5pc19mYXZvcml0ZSkuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSlcbiAgY29uc3Qgbm9uRmF2b3JpdGVzID0gb3RoZXJBZ2VudHMuZmlsdGVyKGFnID0+ICFhZy5pc19mYXZvcml0ZSkuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSlcblxuICAvLyBDb21iaW5hcjogY2xvbmVzIHByaW1lcm8sIGx1ZWdvIGZhdm9yaXRvcywgbHVlZ28gbm8gZmF2b3JpdG9zXG4gIHJldHVybiBjbG9uZUFnZW50cy5sZW5ndGggPyBbLi4uY2xvbmVBZ2VudHMsIC4uLmZhdm9yaXRlcywgLi4ubm9uRmF2b3JpdGVzXSA6IFsuLi5mYXZvcml0ZXMsIC4uLm5vbkZhdm9yaXRlc11cbn1cblxudHlwZSBVc2VHZXRBZ2VudHNQcm9wcyA9IHtcbiAgc2VsZWN0QWdlbnQ6IChhZ2VudDogQWdlbnQpID0+IHZvaWRcbiAgc2VjdGlvbjogJ3Byb2plY3QnIHwgJ2hlYWRlcicgfCAnY2xpZW50JyB8ICd0YXNrJ1xuICBhZ2VudDogQWdlbnQgfCBudWxsXG4gIGhhbmRsZUdvSG9tZTogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgdHlwZSBBZGRBZ2VudE9wdGlvbnMgPSB7XG4gIC8qKiBQb3IgZGVmZWN0byBgdHJ1ZWAgKGNvbXBvcnRhbWllbnRvIEFCTSkuIFBhc2FyIGBmYWxzZWAgYWwgaW5zZXJ0YXIgYWdlbnRlIGNyZWFkbyBwb3IgY2hhdCBzaW4gY2FtYmlhciBkZSB2aXN0YS4gKi9cbiAgbmF2aWdhdGVIb21lPzogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgdXNlR2V0QWdlbnRzID0gKHsgc2VsZWN0QWdlbnQsIHNlY3Rpb24sIGFnZW50LCBoYW5kbGVHb0hvbWUgfTogVXNlR2V0QWdlbnRzUHJvcHMpID0+IHtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCBbYWdlbnRzLCBzZXRBZ2VudHNdID0gdXNlU3RhdGU8eyBkYXRhOiBBZ2VudFtdOyBoYXNfbW9yZT86IGJvb2xlYW47IG5leHRfb2Zmc2V0PzogbnVtYmVyIHwgbnVsbCB9Pih7IGRhdGE6IFtdIH0pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbbG9hZGluZ01vcmUsIHNldExvYWRpbmdNb3JlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2VhcmNoTG9hZGluZywgc2V0U2VhcmNoTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCB7IGhhbmRsZVNuYWNrYmFyRXJyb3IgfSA9IHVzZVNuYWNrQmFyTWFuYWdlcigpXG4gIGNvbnN0IHsgdCwgaTE4biB9ID0gdXNlVHJhbnNsYXRpb24oJ2NoYXRfYWlfc2VjdGlvbicpXG4gIGNvbnN0IGxhc3RTZWxlY3RlZEFnZW50UmVmID0gdXNlUmVmPEFnZW50IHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNSZWZyZXNoaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBsYXN0UmVxdWVzdFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBhZ2VudHNSZWYgPSB1c2VSZWYoYWdlbnRzKVxuICBjb25zdCBwcmVTZWFyY2hBZ2VudHNSZWYgPSB1c2VSZWY8eyBkYXRhOiBBZ2VudFtdOyBoYXNfbW9yZT86IGJvb2xlYW47IG5leHRfb2Zmc2V0PzogbnVtYmVyIHwgbnVsbCB9IHwgbnVsbD4obnVsbClcblxuICBhZ2VudHNSZWYuY3VycmVudCA9IGFnZW50c1xuXG4gIGNvbnN0IGNhbkZldGNoQ2xvbmVBZ2VudHMgPSAhaXNNYWlhQ2xvbmVBZ2VudHNSb2xlQmxvY2tlZCh1c2VyLCBzZWN0aW9uKVxuXG4gIGNvbnN0IGFkZEFnZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld0FnZW50OiBBZ2VudCwgb3B0aW9ucz86IEFkZEFnZW50T3B0aW9ucykgPT4ge1xuICAgICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgICAvLyBWZXJpZmljYXIgc2kgZWwgYWdlbnRlIHlhIGV4aXN0ZSBwYXJhIGV2aXRhciBkdXBsaWNhZG9zXG4gICAgICAgIGNvbnN0IGFnZW50RXhpc3RzID0gcHJldi5kYXRhLnNvbWUoZXhpc3RpbmdBZ2VudCA9PiBleGlzdGluZ0FnZW50LmlkID09PSBuZXdBZ2VudC5pZClcbiAgICAgICAgaWYgKGFnZW50RXhpc3RzKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdEYXRhID0gWy4uLnByZXYuZGF0YSwgbmV3QWdlbnRdXG4gICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKG9wdGlvbnM/Lm5hdmlnYXRlSG9tZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgaGFuZGxlR29Ib21lKClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtoYW5kbGVHb0hvbWVdXG4gIClcblxuICBjb25zdCByZW1vdmVBZ2VudCA9IHVzZUNhbGxiYWNrKChhZ2VudElkOiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgICBzZXRBZ2VudHMocHJldiA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIGRhdGE6IHByZXYuZGF0YS5maWx0ZXIoYSA9PiBhLmlkICE9PSBhZ2VudElkLnRvU3RyaW5nKCkpLFxuICAgIH0pKVxuICB9LCBbXSlcblxuICBjb25zdCB1cGRhdGVBZ2VudCA9IHVzZUNhbGxiYWNrKCh1cGRhdGVkQWdlbnQ6IEFnZW50KSA9PiB7XG4gICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBwcmV2LmRhdGEubWFwKGV4aXN0aW5nQWdlbnQgPT5cbiAgICAgICAgZXhpc3RpbmdBZ2VudC5pZCA9PT0gdXBkYXRlZEFnZW50LmlkID8gdXBkYXRlZEFnZW50IDogZXhpc3RpbmdBZ2VudFxuICAgICAgKVxuICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHModXBkYXRlZERhdGEpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgfVxuICAgIH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZUFnZW50RmF2b3JpdGUgPSB1c2VDYWxsYmFjayhcbiAgICAodXBkYXRlZEFnZW50OiBBZ2VudCwgc2hvdWxkU29ydDogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG4gICAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gcHJldi5kYXRhLm1hcChleGlzdGluZ0FnZW50ID0+IHtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdBZ2VudC5pZCA9PT0gdXBkYXRlZEFnZW50LmlkKSB7XG4gICAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmFnZW50RmllbGRzIH0gPSB1cGRhdGVkQWdlbnQgYXMgYW55XG4gICAgICAgICAgICBjb25zdCBtZXJnZWRBZ2VudCA9IHsgLi4uZXhpc3RpbmdBZ2VudCwgLi4uYWdlbnRGaWVsZHMgfVxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlZEFnZW50XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBleGlzdGluZ0FnZW50XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU29sbyBvcmRlbmFyIHNpIHNob3VsZFNvcnQgZXMgdHJ1ZVxuICAgICAgICBjb25zdCBmaW5hbERhdGEgPSBzaG91bGRTb3J0ID8gc29ydEFnZW50cyh1cGRhdGVkRGF0YSkgOiB1cGRhdGVkRGF0YVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBkYXRhOiBmaW5hbERhdGEsXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIEFjdHVhbGl6YXIgZWwgYWdlbnRlIHNlbGVjY2lvbmFkbyBzaSBlcyBlbCBxdWUgc2UgZXN0w6EgYWN0dWFsaXphbmRvXG4gICAgICBpZiAoYWdlbnQ/LmlkID09PSB1cGRhdGVkQWdlbnQuaWQpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmQoYSA9PiBhLmlkID09PSB1cGRhdGVkQWdlbnQuaWQpXG4gICAgICAgIGlmIChleGlzdGluZ0FnZW50KSB7XG4gICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5hZ2VudEZpZWxkcyB9ID0gdXBkYXRlZEFnZW50IGFzIGFueVxuICAgICAgICAgIGNvbnN0IG1lcmdlZEFnZW50ID0geyAuLi5leGlzdGluZ0FnZW50LCAuLi5hZ2VudEZpZWxkcyB9XG4gICAgICAgICAgc2VsZWN0QWdlbnQobWVyZ2VkQWdlbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5hZ2VudEZpZWxkcyB9ID0gdXBkYXRlZEFnZW50IGFzIGFueVxuICAgICAgICAgIHNlbGVjdEFnZW50KGFnZW50RmllbGRzIGFzIEFnZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbYWdlbnQsIHNlbGVjdEFnZW50LCBhZ2VudHMuZGF0YV1cbiAgKVxuXG4gIGNvbnN0IHNvcnRBZ2VudHNMaXN0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKHByZXYuZGF0YSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICB9XG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgc2VsZWN0Rmlyc3RBZ2VudCA9IHVzZUNhbGxiYWNrKFxuICAgIChhZ2VudElkPzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoYWdlbnRzLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWdlbnQgPSBhZ2VudHMuZGF0YS5maW5kSW5kZXgoYWdlbnREYXRhID0+IGFnZW50RGF0YS5pZCA9PT0gYWdlbnRJZClcbiAgICAgICAgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudCA9IGFnZW50cy5kYXRhW2ZpcnN0QWdlbnQgPT09IDAgPyAxIDogMF1cbiAgICAgICAgc2VsZWN0QWdlbnQoYWdlbnRzLmRhdGFbZmlyc3RBZ2VudCA9PT0gMCA/IDEgOiAwXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudHMuZGF0YSwgc2VsZWN0QWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVHZXRBZ2VudHMgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoYWdlbnRUb1NlbGVjdD86IEFnZW50KSA9PiB7XG4gICAgICBpZiAoaXNSZWZyZXNoaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RLZXkgPSBhZ2VudFRvU2VsZWN0Py5pZD8udG9TdHJpbmcoKSB8fCAnZGVmYXVsdCdcbiAgICAgIGlmIChsYXN0UmVxdWVzdFJlZi5jdXJyZW50ID09PSByZXF1ZXN0S2V5ICYmICFsb2FkaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpc1JlZnJlc2hpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGxhc3RSZXF1ZXN0UmVmLmN1cnJlbnQgPSByZXF1ZXN0S2V5XG4gICAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgICBzZXRFcnJvcihudWxsKVxuXG4gICAgICBjb25zdCBpc011bHRpQWdlbnRzID0gISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmICEhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGFnZW50UGFyc2VkOiBBZ2VudFtdID0gW11cbiAgICAgICAgbGV0IGhhc01vcmUgPSBmYWxzZVxuICAgICAgICBsZXQgbmV4dE9mZnNldDogbnVtYmVyIHwgbnVsbCA9IG51bGxcblxuICAgICAgICAvLyBTaSB0aWVuZSBmZWF0dXJlIGFjY2VzcyBtdWx0aSBhZ2VudHMsIGhhY2VyIGRvcyBxdWVyaWVzIChNYWlhICsgY3VzdG9tKSBlbiBjdWFscXVpZXIgc2VjY2nDs25cbiAgICAgICAgaWYgKGlzTXVsdGlBZ2VudHMpIHtcbiAgICAgICAgICAvLyBRdWVyeSBjbG9uZSAoTWFpYSkgeSBjdXN0b20gc29uIGluZGVwZW5kaWVudGVzIOKGkiBzZSBkaXNwYXJhbiBlbiBwYXJhbGVsby5cbiAgICAgICAgICBsZXQgY2xvbmVBZ2VudHM6IEFnZW50W10gPSBbXVxuICAgICAgICAgIGxldCBjdXN0b21BZ2VudHM6IEFnZW50W10gPSBbXVxuICAgICAgICAgIGxldCBjdXN0b21IYXNNb3JlID0gZmFsc2VcbiAgICAgICAgICBsZXQgY3VzdG9tTmV4dE9mZnNldDogbnVtYmVyIHwgbnVsbCA9IG51bGxcblxuICAgICAgICAgIGNvbnN0IGlzNDAzID0gKGVycjogYW55KTogYm9vbGVhbiA9PlxuICAgICAgICAgICAgZXJyPy5yZXNwb25zZT8uc3RhdHVzID09PSA0MDMgfHxcbiAgICAgICAgICAgIGVycj8uc3RhdHVzID09PSA0MDMgfHxcbiAgICAgICAgICAgIGVycj8ubWVzc2FnZT8uaW5jbHVkZXMoXCJZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHZpZXcgYWdlbnRzXCIpIHx8XG4gICAgICAgICAgICBlcnI/Lm1lc3NhZ2U/LmluY2x1ZGVzKCdGYWlsZWQgZmV0Y2hpbmcgZGF0YScpIC8vIGZldGNoQ09SIGxhbnphIGVzdG8gcGFyYSA0MDMgc2luICdBY2Nlc3MgZGVuaWVkJ1xuXG4gICAgICAgICAgY29uc3QgbG9hZENsb25lQWdlbnRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjYW5GZXRjaENsb25lQWdlbnRzKSByZXR1cm5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9yZGVyUGFyYW0gPVxuICAgICAgICAgICAgICAgIHNlY3Rpb24gPT09ICdjbGllbnQnXG4gICAgICAgICAgICAgICAgICA/ICcmb3JkZXI9Y2xpZW50LHByb2plY3QnXG4gICAgICAgICAgICAgICAgICA6IHNlY3Rpb24gPT09ICdwcm9qZWN0JyB8fCBzZWN0aW9uID09PSAnaGVhZGVyJyB8fCBzZWN0aW9uID09PSAndGFzaydcbiAgICAgICAgICAgICAgICAgICAgPyAnJm9yZGVyPXByb2plY3QsY2xpZW50J1xuICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICAgIGNvbnN0IG1haWFSZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgICAgcGF0aDogYGFnZW50cz9hZ2VudF90eXBlPWNsb25lJmxhbmc9JHttYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpfSR7b3JkZXJQYXJhbX1gLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnN0IG1haWFEYXRhID0gYXdhaXQgbWFpYVJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgICBjbG9uZUFnZW50cyA9IG1haWFEYXRhLmRhdGE/LmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlID09PSAnY2xvbmUnKSB8fCBbXVxuICAgICAgICAgICAgfSBjYXRjaCAobWFpYUVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgLy8gU2kgZXMgNDAzLCBjb250aW51YXIgc2luIGxvcyBjbG9uZUFnZW50czsgc2kgZXMgb3RybyBlcnJvciwgcHJvcGFnYXJsb1xuICAgICAgICAgICAgICBpZiAoIWlzNDAzKG1haWFFcnJvcikpIHRocm93IG1haWFFcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxvYWRDdXN0b21BZ2VudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjdXN0b21SZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgICAgcGF0aDogJ2FnZW50cz9hZ2VudF90eXBlPWN1c3RvbSZsaW1pdD03Jm9mZnNldD0wJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBjb25zdCBjdXN0b21EYXRhID0gYXdhaXQgY3VzdG9tUmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAgIGN1c3RvbUFnZW50cyA9IGN1c3RvbURhdGEuZGF0YSB8fCBbXVxuICAgICAgICAgICAgICBjdXN0b21IYXNNb3JlID0gY3VzdG9tRGF0YS5oYXNfbW9yZSB8fCBmYWxzZVxuICAgICAgICAgICAgICBjdXN0b21OZXh0T2Zmc2V0ID0gY3VzdG9tRGF0YS5uZXh0X29mZnNldCB8fCBudWxsXG4gICAgICAgICAgICB9IGNhdGNoIChjdXN0b21FcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgIC8vIFNpIGVzIDQwMywgY29udGludWFyIHNpbiBsb3MgY3VzdG9tQWdlbnRzIChxdWVkYSBjb21vIGFycmF5IHZhY8Otbyk7IHNpIG5vLCBwcm9wYWdhcmxvXG4gICAgICAgICAgICAgIGlmICghaXM0MDMoY3VzdG9tRXJyb3IpKSB0aHJvdyBjdXN0b21FcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtsb2FkQ2xvbmVBZ2VudHMoKSwgbG9hZEN1c3RvbUFnZW50cygpXSlcblxuICAgICAgICAgIC8vIENvbWJpbmFyOiBhZ2VudGVzIGNsb25lIHByaW1lcm8sIGx1ZWdvIGxvcyBjdXN0b20gKHNpIGV4aXN0ZW4pXG4gICAgICAgICAgLy8gU2kgZWwgdXN1YXJpbyB0aWVuZSB1biByb2wgZGVzaGFiaWxpdGFkbywgbm8gaW5jbHVpciBjbG9uZUFnZW50c1xuICAgICAgICAgIGlmICghY2FuRmV0Y2hDbG9uZUFnZW50cykge1xuICAgICAgICAgICAgLy8gUm9sIHNpbiBhY2Nlc28gYSBjbG9uZXMgKHAuIGVqLiBjb2xhYm9yYWRvciBmdWVyYSBkZWwgcGlsb3RvKTogc29sbyBjdXN0b21BZ2VudHNcbiAgICAgICAgICAgIC8vIFNpIGN1c3RvbUFnZW50cyBlc3TDoSB2YWPDrW8gKHBvciA0MDMpLCBhZ2VudFBhcnNlZCBzZXLDoSBbXVxuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBjdXN0b21BZ2VudHNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUm9sIGNvbiBhY2Nlc28gYSBjbG9uZXM6IGNsb25lQWdlbnRzICsgY3VzdG9tQWdlbnRzXG4gICAgICAgICAgICAvLyBTaSBjdXN0b21BZ2VudHMgZXN0w6EgdmFjw61vIChwb3IgNDAzKSBwZXJvIGhheSBjbG9uZUFnZW50cywgYWdlbnRQYXJzZWQgdGVuZHLDoSBsb3MgY2xvbmVzXG4gICAgICAgICAgICAvLyBTaSBubyBoYXkgY2xvbmVBZ2VudHMgbmkgY3VzdG9tQWdlbnRzLCBhZ2VudFBhcnNlZCBzZXLDoSBbXVxuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBjbG9uZUFnZW50cy5sZW5ndGggPyBbLi4uY2xvbmVBZ2VudHMsIC4uLmN1c3RvbUFnZW50c10gOiBjdXN0b21BZ2VudHNcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gT3JkZW5hcjogTWFpYSBwcmltZXJvLCBsdWVnbyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZSwgbHVlZ28gbm8gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGVcbiAgICAgICAgICBhZ2VudFBhcnNlZCA9IHNvcnRBZ2VudHMoYWdlbnRQYXJzZWQpXG4gICAgICAgICAgaGFzTW9yZSA9IGN1c3RvbUhhc01vcmVcbiAgICAgICAgICBuZXh0T2Zmc2V0ID0gY3VzdG9tTmV4dE9mZnNldFxuXG4gICAgICAgICAgc2V0QWdlbnRzKHtcbiAgICAgICAgICAgIGRhdGE6IGFnZW50UGFyc2VkLFxuICAgICAgICAgICAgaGFzX21vcmU6IGhhc01vcmUsXG4gICAgICAgICAgICBuZXh0X29mZnNldDogbmV4dE9mZnNldCxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gU2kgbm8gaGF5IGFnZW50ZXMgZGVzcHXDqXMgZGUgcHJvY2VzYXIgbGFzIHF1ZXJpZXMsIGxpbXBpYXIgZWwgZXJyb3JcbiAgICAgICAgICBpZiAoYWdlbnRQYXJzZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzZXRFcnJvcihudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzaG91bGRSZXF1ZXN0Q2xvbmVBZ2VudHMgPVxuICAgICAgICAgICAgY2FuRmV0Y2hDbG9uZUFnZW50cyAmJlxuICAgICAgICAgICAgKHNlY3Rpb24gPT09ICdwcm9qZWN0JyB8fCBzZWN0aW9uID09PSAnY2xpZW50JyB8fCBzZWN0aW9uID09PSAnaGVhZGVyJyB8fCBzZWN0aW9uID09PSAndGFzaycpXG5cbiAgICAgICAgICBpZiAoIXNob3VsZFJlcXVlc3RDbG9uZUFnZW50cykge1xuICAgICAgICAgICAgc2V0QWdlbnRzKHsgZGF0YTogW10sIGhhc19tb3JlOiBmYWxzZSwgbmV4dF9vZmZzZXQ6IG51bGwgfSlcbiAgICAgICAgICAgIHNldEVycm9yKG51bGwpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gICAgICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2FnZW50X3R5cGUnLCAnY2xvbmUnKVxuICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdsYW5nJywgbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSlcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnb3JkZXInLCBzZWN0aW9uID09PSAnY2xpZW50JyA/ICdjbGllbnQscHJvamVjdCcgOiAncHJvamVjdCxjbGllbnQnKVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24gPT09ICdoZWFkZXInKSB7XG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnbGltaXQnLCAnNycpXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnb2Zmc2V0JywgJzAnKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXRoID0gYGFnZW50cz8ke3F1ZXJ5UGFyYW1zLnRvU3RyaW5nKCl9YFxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBkYXRhLmRhdGEgfHwgW11cbiAgICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBzb3J0QWdlbnRzKGFnZW50UGFyc2VkKVxuICAgICAgICAgICAgICBoYXNNb3JlID0gZGF0YS5oYXNfbW9yZVxuICAgICAgICAgICAgICBuZXh0T2Zmc2V0ID0gZGF0YS5uZXh0X29mZnNldFxuXG4gICAgICAgICAgICAgIHNldEFnZW50cyh7XG4gICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgICBkYXRhOiBhZ2VudFBhcnNlZCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKHJlc3BvbnNlRXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAvLyBWZXJpZmljYXIgc2kgZWwgZXJyb3IgZXMgNDAzXG4gICAgICAgICAgICAgIC8vIGZldGNoQ09SIHB1ZWRlIGxhbnphciBkaWZlcmVudGVzIHRpcG9zIGRlIGVycm9yZXM6XG4gICAgICAgICAgICAgIC8vIDEuIEVycm9yIGNvbiBlcnJvckRhdGEuZGV0YWlsIHNpIGluY2x1eWUgJ0FjY2VzcyBkZW5pZWQnXG4gICAgICAgICAgICAgIC8vIDIuIEVycm9yIGdlbsOpcmljbyAnRmFpbGVkIGZldGNoaW5nIGRhdGEnIHNpIGVzIDQwMyBwZXJvIG5vIGluY2x1eWUgJ0FjY2VzcyBkZW5pZWQnXG4gICAgICAgICAgICAgIC8vIDMuIE5lY2VzaXRhbW9zIHZlcmlmaWNhciBlbCBzdGF0dXMgY29kZSBzaSBlc3TDoSBkaXNwb25pYmxlXG4gICAgICAgICAgICAgIGNvbnN0IGlzNDAzRXJyb3IgPVxuICAgICAgICAgICAgICAgIHJlc3BvbnNlRXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlRXJyb3I/LnN0YXR1cyA9PT0gNDAzIHx8XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoXCJZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHZpZXcgYWdlbnRzXCIpIHx8XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ0ZhaWxlZCBmZXRjaGluZyBkYXRhJykgLy8gZmV0Y2hDT1IgbGFuemEgZXN0byBwYXJhIDQwMyBzaW4gJ0FjY2VzcyBkZW5pZWQnXG5cbiAgICAgICAgICAgICAgaWYgKGlzNDAzRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBTaSBlcyA0MDMsIGVzdGFibGVjZXIgYWdlbnRlcyB2YWPDrW9zIHkgY29udGludWFyXG4gICAgICAgICAgICAgICAgc2V0QWdlbnRzKHtcbiAgICAgICAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgICAgICAgaGFzX21vcmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBzZXRFcnJvcihudWxsKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNpIGVzIG90cm8gZXJyb3IsIGxhbnphcmxvXG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2VFcnJvclxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTMOzZ2ljYSBkZSBzZWxlY3QgYWdlbnQgLSBTb2xvIHNlbGVjY2lvbmFyIHNpIGhheSBhZ2VudGVzIGRpc3BvbmlibGVzXG4gICAgICAgIGlmIChhZ2VudFBhcnNlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKGFnZW50VG9TZWxlY3QgJiYgYWdlbnRQYXJzZWQuZmluZCgoYWdlbnRUb1JlcXVlc3Q6IEFnZW50KSA9PiBhZ2VudFRvUmVxdWVzdC5pZCA9PT0gYWdlbnRUb1NlbGVjdC5pZCkpIHtcbiAgICAgICAgICAgIGlmIChsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50Py5pZCAhPT0gYWdlbnRUb1NlbGVjdC5pZCkge1xuICAgICAgICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gYWdlbnRUb1NlbGVjdFxuICAgICAgICAgICAgICBzZWxlY3RBZ2VudChhZ2VudFRvU2VsZWN0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWdlbnRQYXJzZWQ/LlswXSAmJiAoIWFnZW50IHx8ICFhZ2VudFBhcnNlZC5maW5kKChhOiBBZ2VudCkgPT4gYS5pZCA9PT0gYWdlbnQuaWQpKSkge1xuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdlbnRzID1cbiAgICAgICAgICAgICAgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyAmJiBjYW5GZXRjaENsb25lQWdlbnRzXG4gICAgICAgICAgICAgICAgPyBhZ2VudFBhcnNlZFxuICAgICAgICAgICAgICAgIDogYWdlbnRQYXJzZWQuZmlsdGVyKChhZ2VudEl0ZW06IEFnZW50KSA9PiBhZ2VudEl0ZW0udHlwZSAhPT0gJ2Nsb25lJylcblxuICAgICAgICAgICAgY29uc3QgW2ZpcnN0QWdlbnRdID0gYXZhaWxhYmxlQWdlbnRzXG4gICAgICAgICAgICBpZiAoZmlyc3RBZ2VudCAmJiBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50Py5pZCAhPT0gZmlyc3RBZ2VudC5pZCkge1xuICAgICAgICAgICAgICBsYXN0U2VsZWN0ZWRBZ2VudFJlZi5jdXJyZW50ID0gZmlyc3RBZ2VudFxuICAgICAgICAgICAgICBzZWxlY3RBZ2VudChmaXJzdEFnZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWdlbnRUb1NlbGVjdCAmJiBhZ2VudFBhcnNlZD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVBZ2VudHMgPVxuICAgICAgICAgICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmIGNhbkZldGNoQ2xvbmVBZ2VudHNcbiAgICAgICAgICAgICAgICA/IGFnZW50UGFyc2VkXG4gICAgICAgICAgICAgICAgOiBhZ2VudFBhcnNlZC5maWx0ZXIoKGFnZW50SXRlbTogQWdlbnQpID0+IGFnZW50SXRlbS50eXBlICE9PSAnY2xvbmUnKVxuXG4gICAgICAgICAgICBjb25zdCBbZmlyc3RBdmFpbGFibGVBZ2VudF0gPSBhdmFpbGFibGVBZ2VudHNcbiAgICAgICAgICAgIGlmIChmaXJzdEF2YWlsYWJsZUFnZW50ICYmIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQ/LmlkICE9PSBmaXJzdEF2YWlsYWJsZUFnZW50LmlkKSB7XG4gICAgICAgICAgICAgIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQgPSBmaXJzdEF2YWlsYWJsZUFnZW50XG4gICAgICAgICAgICAgIHNlbGVjdEFnZW50KGZpcnN0QXZhaWxhYmxlQWdlbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzZXRFcnJvcihlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQnKVxuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNSZWZyZXNoaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAoIWlzUmVmcmVzaGluZ1JlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICBsYXN0UmVxdWVzdFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKVxuICAgICAgfVxuICAgIH0sXG4gICAgW3NlbGVjdEFnZW50LCBzZWN0aW9uLCBhZ2VudCwgbG9hZGluZywgY2FuRmV0Y2hDbG9uZUFnZW50cywgaTE4bi5sYW5ndWFnZV1cbiAgKVxuXG4gIGNvbnN0IHNlYXJjaEN1c3RvbUFnZW50cyA9IHVzZUNhbGxiYWNrKGFzeW5jIChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFxdWVyeSkge1xuICAgICAgaWYgKHByZVNlYXJjaEFnZW50c1JlZi5jdXJyZW50KSB7XG4gICAgICAgIHNldEFnZW50cyhwcmVTZWFyY2hBZ2VudHNSZWYuY3VycmVudClcbiAgICAgICAgcHJlU2VhcmNoQWdlbnRzUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXByZVNlYXJjaEFnZW50c1JlZi5jdXJyZW50KSB7XG4gICAgICBwcmVTZWFyY2hBZ2VudHNSZWYuY3VycmVudCA9IGFnZW50c1JlZi5jdXJyZW50XG4gICAgfVxuXG4gICAgc2V0U2VhcmNoTG9hZGluZyh0cnVlKVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgcGF0aDogYGFnZW50cz9hZ2VudF90eXBlPWN1c3RvbSZsaW1pdD0yMCZvZmZzZXQ9MCZxPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX1gLFxuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgICBjb25zdCBjbG9uZUFnZW50cyA9IHByZXYuZGF0YS5maWx0ZXIoKGFnOiBBZ2VudCkgPT4gYWcudHlwZSA9PT0gJ2Nsb25lJylcbiAgICAgICAgY29uc3QgY3VzdG9tUmVzdWx0czogQWdlbnRbXSA9IGRhdGEuZGF0YSB8fCBbXVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IGNsb25lQWdlbnRzLmxlbmd0aCA/IFsuLi5jbG9uZUFnZW50cywgLi4uY3VzdG9tUmVzdWx0c10gOiBjdXN0b21SZXN1bHRzLFxuICAgICAgICAgIGhhc19tb3JlOiBmYWxzZSxcbiAgICAgICAgICBuZXh0X29mZnNldDogbnVsbCxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodCgnc25hY2tiYXIubG9hZE1vcmVBZ2VudHMuZXJyb3InKSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0U2VhcmNoTG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH0sIFtdKVxuXG4gIGNvbnN0IGxvYWRNb3JlQWdlbnRzID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlzTXVsdGlBZ2VudHMgPSAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgJiYgISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuICAgIC8vIENhcmdhciBtw6FzOiBlbiBoZWFkZXIgc2llbXByZTsgZW4gcHJvamVjdCBzb2xvIHNpIGlzTXVsdGlBZ2VudHMgKHBvcnF1ZSBzb2xvIGVudG9uY2VzIGhheSBwYWdpbmFjacOzbiBkZSBjdXN0b20pXG4gICAgY29uc3QgY2FuTG9hZE1vcmUgPSBzZWN0aW9uID09PSAnaGVhZGVyJyB8fCBpc011bHRpQWdlbnRzXG4gICAgaWYgKCFjYW5Mb2FkTW9yZSB8fCAhYWdlbnRzLmhhc19tb3JlIHx8ICFhZ2VudHMubmV4dF9vZmZzZXQgfHwgbG9hZGluZ01vcmUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldExvYWRpbmdNb3JlKHRydWUpXG4gICAgc2V0RXJyb3IobnVsbClcblxuICAgIHRyeSB7XG4gICAgICBsZXQgcGF0aDogc3RyaW5nXG5cbiAgICAgIC8vIFNpIGVzIG11bHRpQWdlbnRzLCBzb2xvIGNhcmdhciBhZ2VudHMgY3VzdG9tIChNYWlhIHlhIGVzdMOhIGNhcmdhZG8pXG4gICAgICBpZiAoaXNNdWx0aUFnZW50cykge1xuICAgICAgICAvLyBNYW50ZW5lciBjYW50aWRhZCBpbXBhciBkZSBjYXJkczogcHJpbWVyYSBjYXJnYSA3LCBzaWd1aWVudGVzICs2ICg3LCAxMywgMTksIC4uLilcbiAgICAgICAgcGF0aCA9IGBhZ2VudHM/YWdlbnRfdHlwZT1jdXN0b20mbGltaXQ9NiZvZmZzZXQ9JHthZ2VudHMubmV4dF9vZmZzZXR9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2kgbm8gZXMgbXVsdGlBZ2VudHMsIGNhcmdhciBtw6FzIGFnZW50ZXMgY2xvbmUgKE1haWEpIOKAlCBtaXNtbyBvcmRlciBxdWUgcHJvamVjdCBwYXJhIGhlYWRlclxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2FnZW50X3R5cGUnLCAnY2xvbmUnKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2xhbmcnLCBtYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpKVxuICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ29yZGVyJywgJ3Byb2plY3QsY2xpZW50JylcbiAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdsaW1pdCcsICc3JylcbiAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdvZmZzZXQnLCBhZ2VudHMubmV4dF9vZmZzZXQudG9TdHJpbmcoKSlcbiAgICAgICAgcGF0aCA9IGBhZ2VudHM/JHtxdWVyeVBhcmFtcy50b1N0cmluZygpfWBcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaE1haWEoe1xuICAgICAgICBwYXRoLFxuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICAvLyBBY3VtdWxhciBhZ2VudGVzLCBleGNsdXllbmRvIGR1cGxpY2Fkb3NcbiAgICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgICAgaWYgKGlzTXVsdGlBZ2VudHMpIHtcbiAgICAgICAgICAvLyBMw7NnaWNhIHBhcmEgbXVsdGlBZ2VudHM6IHNlcGFyYXIgY2xvbmUgeSBjdXN0b21cbiAgICAgICAgICAvLyBNYW50ZW5lciB0b2RvcyBsb3MgYWdlbnRlcyBjbG9uZSBleGlzdGVudGVzIGFsIGluaWNpb1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xvbmVBZ2VudHMgPSBwcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+IGFnLnR5cGUgPT09ICdjbG9uZScpXG5cbiAgICAgICAgICAvLyBPYnRlbmVyIElEcyBleGlzdGVudGVzIChleGNsdXllbmRvIGNsb25lcylcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQocHJldi5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlICE9PSAnY2xvbmUnKS5tYXAoKGFnOiBBZ2VudCkgPT4gYWcuaWQpKVxuXG4gICAgICAgICAgLy8gRmlsdHJhciBudWV2b3MgYWdlbnRzIHF1ZSBubyBlc3TDqW4geWEgZW4gbGEgbGlzdGEgKHkgcXVlIG5vIHNlYW4gY2xvbmUpXG4gICAgICAgICAgY29uc3QgbmV3QWdlbnRzID0gZGF0YS5kYXRhLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlICE9PSAnY2xvbmUnICYmICFleGlzdGluZ0lkcy5oYXMoYWcuaWQpKVxuXG4gICAgICAgICAgLy8gQ29uc3RydWlyIGVsIG51ZXZvIGFycmF5OiBjbG9uZXMgcHJpbWVybywgbHVlZ28gbG9zIGFnZW50cyBleGlzdGVudGVzIHF1ZSBubyBzZWFuIGNsb25lLCBsdWVnbyBsb3MgbnVldm9zXG4gICAgICAgICAgY29uc3QgbmV3RGF0YSA9IGV4aXN0aW5nQ2xvbmVBZ2VudHMubGVuZ3RoXG4gICAgICAgICAgICA/IFsuLi5leGlzdGluZ0Nsb25lQWdlbnRzLCAuLi5wcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+IGFnLnR5cGUgIT09ICdjbG9uZScpLCAuLi5uZXdBZ2VudHNdXG4gICAgICAgICAgICA6IFsuLi5wcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+IGFnLnR5cGUgIT09ICdjbG9uZScpLCAuLi5uZXdBZ2VudHNdXG5cbiAgICAgICAgICAvLyBPcmRlbmFyOiBNYWlhIHByaW1lcm8sIGx1ZWdvIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlLCBsdWVnbyBubyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZVxuICAgICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogc29ydGVkRGF0YSxcbiAgICAgICAgICAgIGhhc19tb3JlOiBkYXRhLmhhc19tb3JlLFxuICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IGRhdGEubmV4dF9vZmZzZXQsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEzDs2dpY2EgcGFyYSAhaXNNdWx0aUFnZW50czogdG9kb3MgbG9zIGFnZW50ZXMgc29uIGNsb25lLCBzaW1wbGVtZW50ZSBhZ3JlZ2FyIGV2aXRhbmRvIGR1cGxpY2Fkb3NcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYuZGF0YS5tYXAoKGFnOiBBZ2VudCkgPT4gYWcuaWQpKVxuICAgICAgICBjb25zdCBuZXdBZ2VudHMgPSAoZGF0YS5kYXRhIHx8IFtdKS5maWx0ZXIoKGFnOiBBZ2VudCkgPT4gIWV4aXN0aW5nSWRzLmhhcyhhZy5pZCkpXG4gICAgICAgIGNvbnN0IG5ld0RhdGEgPSBbLi4ucHJldi5kYXRhLCAuLi5uZXdBZ2VudHNdXG5cbiAgICAgICAgLy8gT3JkZW5hcjogTWFpYSBwcmltZXJvLCBsdWVnbyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZSwgbHVlZ28gbm8gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGVcbiAgICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHMobmV3RGF0YSlcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICAgICAgaGFzX21vcmU6IGRhdGEuaGFzX21vcmUsXG4gICAgICAgICAgbmV4dF9vZmZzZXQ6IGRhdGEubmV4dF9vZmZzZXQsXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIHNldExvYWRpbmdNb3JlKGZhbHNlKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdzbmFja2Jhci5sb2FkTW9yZUFnZW50cy5lcnJvcicpKVxuICAgICAgc2V0TG9hZGluZ01vcmUoZmFsc2UpXG4gICAgfVxuICB9LCBbc2VjdGlvbiwgYWdlbnRzLmhhc19tb3JlLCBhZ2VudHMubmV4dF9vZmZzZXQsIGxvYWRpbmdNb3JlLCBpMThuLmxhbmd1YWdlXSlcblxuICByZXR1cm4ge1xuICAgIGFnZW50cyxcbiAgICBsb2FkaW5nLFxuICAgIGxvYWRpbmdNb3JlLFxuICAgIGVycm9yLFxuICAgIGhhbmRsZUdldEFnZW50cyxcbiAgICBsb2FkTW9yZUFnZW50cyxcbiAgICBzZWFyY2hDdXN0b21BZ2VudHMsXG4gICAgc2VhcmNoTG9hZGluZyxcbiAgICBhZGRBZ2VudCxcbiAgICByZW1vdmVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudEZhdm9yaXRlLFxuICAgIHNlbGVjdEZpcnN0QWdlbnQsXG4gICAgc29ydEFnZW50c0xpc3QsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFFBQVEsRUFBRUMsV0FBVyxFQUFFQyxNQUFNLFFBQVEsT0FBTztBQUNyRCxTQUFTQyxjQUFjLFFBQVEsZUFBZTtBQUM5QyxTQUFTQyxrQkFBa0IsUUFBUSxzREFBc0Q7QUFDekYsU0FBU0MsU0FBUyxRQUFRLFdBQVc7QUFFckMsU0FBU0MsT0FBTyxRQUFRLDJCQUEyQjtBQUNuRCxTQUFTQyw0QkFBNEIsUUFBUSx3Q0FBd0M7QUFDckYsU0FBU0MsVUFBVSxRQUFRLHFCQUFxQjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0EsSUFBTUMsVUFBVSxHQUFHLFNBQWJBLFVBQVVBLENBQUlDLE1BQWUsRUFBYztFQUMvQztFQUNBLElBQU1DLFdBQVcsR0FBR0QsTUFBTSxDQUFDRSxNQUFNLENBQUMsVUFBQUMsRUFBRTtJQUFBLE9BQUlBLEVBQUUsQ0FBQ0MsSUFBSSxLQUFLLE9BQU87RUFBQSxFQUFDO0VBQzVELElBQU1DLFdBQVcsR0FBR0wsTUFBTSxDQUFDRSxNQUFNLENBQUMsVUFBQUMsRUFBRTtJQUFBLE9BQUlBLEVBQUUsQ0FBQ0MsSUFBSSxLQUFLLE9BQU87RUFBQSxFQUFDOztFQUU1RDtFQUNBLElBQU1FLFNBQVMsR0FBR0QsV0FBVyxDQUFDSCxNQUFNLENBQUMsVUFBQUMsRUFBRTtJQUFBLE9BQUlBLEVBQUUsQ0FBQ0ksV0FBVztFQUFBLEVBQUMsQ0FBQ0MsSUFBSSxDQUFDLFVBQUNDLENBQUMsRUFBRUMsQ0FBQztJQUFBLE9BQUtELENBQUMsQ0FBQ0UsSUFBSSxDQUFDQyxhQUFhLENBQUNGLENBQUMsQ0FBQ0MsSUFBSSxDQUFDO0VBQUEsRUFBQztFQUN2RyxJQUFNRSxZQUFZLEdBQUdSLFdBQVcsQ0FBQ0gsTUFBTSxDQUFDLFVBQUFDLEVBQUU7SUFBQSxPQUFJLENBQUNBLEVBQUUsQ0FBQ0ksV0FBVztFQUFBLEVBQUMsQ0FBQ0MsSUFBSSxDQUFDLFVBQUNDLENBQUMsRUFBRUMsQ0FBQztJQUFBLE9BQUtELENBQUMsQ0FBQ0UsSUFBSSxDQUFDQyxhQUFhLENBQUNGLENBQUMsQ0FBQ0MsSUFBSSxDQUFDO0VBQUEsRUFBQzs7RUFFM0c7RUFDQSxPQUFPVixXQUFXLENBQUNhLE1BQU0sTUFBQUMsTUFBQSxDQUFBQyxrQkFBQSxDQUFPZixXQUFXLEdBQUFlLGtCQUFBLENBQUtWLFNBQVMsR0FBQVUsa0JBQUEsQ0FBS0gsWUFBWSxRQUFBRSxNQUFBLENBQUFDLGtCQUFBLENBQVFWLFNBQVMsR0FBQVUsa0JBQUEsQ0FBS0gsWUFBWSxFQUFDO0FBQy9HLENBQUM7QUFjRCxPQUFPLElBQU1JLFlBQVksR0FBRyxTQUFmQSxZQUFZQSxDQUFBQyxJQUFBLEVBQXlFO0VBQUEsSUFBbkVDLFdBQVcsR0FBQUQsSUFBQSxDQUFYQyxXQUFXO0lBQUVDLE9BQU8sR0FBQUYsSUFBQSxDQUFQRSxPQUFPO0lBQUVDLEtBQUssR0FBQUgsSUFBQSxDQUFMRyxLQUFLO0lBQUVDLFlBQVksR0FBQUosSUFBQSxDQUFaSSxZQUFZO0VBQ3RFLElBQU1DLElBQUksR0FBRzNCLE9BQU8sQ0FBQyxDQUFDO0VBQ3RCLElBQUE0QixTQUFBLEdBQTRCbEMsUUFBUSxDQUFxRTtNQUFFbUMsSUFBSSxFQUFFO0lBQUcsQ0FBQyxDQUFDO0lBQUFDLFVBQUEsR0FBQUMsY0FBQSxDQUFBSCxTQUFBO0lBQS9HeEIsTUFBTSxHQUFBMEIsVUFBQTtJQUFFRSxTQUFTLEdBQUFGLFVBQUE7RUFDeEIsSUFBQUcsVUFBQSxHQUE4QnZDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFBQXdDLFVBQUEsR0FBQUgsY0FBQSxDQUFBRSxVQUFBO0lBQXRDRSxPQUFPLEdBQUFELFVBQUE7SUFBRUUsVUFBVSxHQUFBRixVQUFBO0VBQzFCLElBQUFHLFVBQUEsR0FBc0MzQyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUE0QyxVQUFBLEdBQUFQLGNBQUEsQ0FBQU0sVUFBQTtJQUE5Q0UsV0FBVyxHQUFBRCxVQUFBO0lBQUVFLGNBQWMsR0FBQUYsVUFBQTtFQUNsQyxJQUFBRyxVQUFBLEdBQTBDL0MsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUFBZ0QsVUFBQSxHQUFBWCxjQUFBLENBQUFVLFVBQUE7SUFBbERFLGFBQWEsR0FBQUQsVUFBQTtJQUFFRSxnQkFBZ0IsR0FBQUYsVUFBQTtFQUN0QyxJQUFBRyxVQUFBLEdBQTBCbkQsUUFBUSxDQUFnQixJQUFJLENBQUM7SUFBQW9ELFVBQUEsR0FBQWYsY0FBQSxDQUFBYyxVQUFBO0lBQWhERSxLQUFLLEdBQUFELFVBQUE7SUFBRUUsUUFBUSxHQUFBRixVQUFBO0VBQ3RCLElBQUFHLG1CQUFBLEdBQWdDbkQsa0JBQWtCLENBQUMsQ0FBQztJQUE1Q29ELG1CQUFtQixHQUFBRCxtQkFBQSxDQUFuQkMsbUJBQW1CO0VBQzNCLElBQUFDLGVBQUEsR0FBb0J0RCxjQUFjLENBQUMsaUJBQWlCLENBQUM7SUFBN0N1RCxDQUFDLEdBQUFELGVBQUEsQ0FBREMsQ0FBQztJQUFFQyxJQUFJLEdBQUFGLGVBQUEsQ0FBSkUsSUFBSTtFQUNmLElBQU1DLG9CQUFvQixHQUFHMUQsTUFBTSxDQUFlLElBQUksQ0FBQztFQUN2RCxJQUFNMkQsZUFBZSxHQUFHM0QsTUFBTSxDQUFDLEtBQUssQ0FBQztFQUNyQyxJQUFNNEQsY0FBYyxHQUFHNUQsTUFBTSxDQUFnQixJQUFJLENBQUM7RUFDbEQsSUFBTTZELFNBQVMsR0FBRzdELE1BQU0sQ0FBQ1EsTUFBTSxDQUFDO0VBQ2hDLElBQU1zRCxrQkFBa0IsR0FBRzlELE1BQU0sQ0FBNEUsSUFBSSxDQUFDO0VBRWxINkQsU0FBUyxDQUFDRSxPQUFPLEdBQUd2RCxNQUFNO0VBRTFCLElBQU13RCxtQkFBbUIsR0FBRyxDQUFDM0QsNEJBQTRCLENBQUMwQixJQUFJLEVBQUVILE9BQU8sQ0FBQztFQUV4RSxJQUFNcUMsUUFBUSxHQUFHbEUsV0FBVyxDQUMxQixVQUFDbUUsUUFBZSxFQUFFQyxPQUF5QixFQUFLO0lBQzlDL0IsU0FBUyxDQUFDLFVBQUFnQyxJQUFJLEVBQUk7TUFDaEI7TUFDQSxJQUFNQyxXQUFXLEdBQUdELElBQUksQ0FBQ25DLElBQUksQ0FBQ3FDLElBQUksQ0FBQyxVQUFBQyxhQUFhO1FBQUEsT0FBSUEsYUFBYSxDQUFDQyxFQUFFLEtBQUtOLFFBQVEsQ0FBQ00sRUFBRTtNQUFBLEVBQUM7TUFDckYsSUFBSUgsV0FBVyxFQUFFO1FBQ2YsT0FBT0QsSUFBSTtNQUNiO01BQ0EsSUFBTUssT0FBTyxNQUFBbEQsTUFBQSxDQUFBQyxrQkFBQSxDQUFPNEMsSUFBSSxDQUFDbkMsSUFBSSxJQUFFaUMsUUFBUSxFQUFDO01BQ3hDLElBQU1RLFVBQVUsR0FBR25FLFVBQVUsQ0FBQ2tFLE9BQU8sQ0FBQztNQUN0QyxPQUFBRSxhQUFBLENBQUFBLGFBQUEsS0FDS1AsSUFBSTtRQUNQbkMsSUFBSSxFQUFFeUM7TUFBVTtJQUVwQixDQUFDLENBQUM7SUFDRixJQUFJLENBQUFQLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFUyxZQUFZLE1BQUssS0FBSyxFQUFFO01BQ25DOUMsWUFBWSxDQUFDLENBQUM7SUFDaEI7RUFDRixDQUFDLEVBQ0QsQ0FBQ0EsWUFBWSxDQUNmLENBQUM7RUFFRCxJQUFNK0MsV0FBVyxHQUFHOUUsV0FBVyxDQUFDLFVBQUMrRSxPQUF3QixFQUFLO0lBQzVEMUMsU0FBUyxDQUFDLFVBQUFnQyxJQUFJO01BQUEsT0FBQU8sYUFBQSxDQUFBQSxhQUFBLEtBQ1RQLElBQUk7UUFDUG5DLElBQUksRUFBRW1DLElBQUksQ0FBQ25DLElBQUksQ0FBQ3ZCLE1BQU0sQ0FBQyxVQUFBTyxDQUFDO1VBQUEsT0FBSUEsQ0FBQyxDQUFDdUQsRUFBRSxLQUFLTSxPQUFPLENBQUNDLFFBQVEsQ0FBQyxDQUFDO1FBQUE7TUFBQztJQUFBLENBQ3hELENBQUM7RUFDTCxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBRU4sSUFBTUMsV0FBVyxHQUFHakYsV0FBVyxDQUFDLFVBQUNrRixZQUFtQixFQUFLO0lBQ3ZEN0MsU0FBUyxDQUFDLFVBQUFnQyxJQUFJLEVBQUk7TUFDaEIsSUFBTWMsV0FBVyxHQUFHZCxJQUFJLENBQUNuQyxJQUFJLENBQUNrRCxHQUFHLENBQUMsVUFBQVosYUFBYTtRQUFBLE9BQzdDQSxhQUFhLENBQUNDLEVBQUUsS0FBS1MsWUFBWSxDQUFDVCxFQUFFLEdBQUdTLFlBQVksR0FBR1YsYUFBYTtNQUFBLENBQ3JFLENBQUM7TUFDRCxJQUFNRyxVQUFVLEdBQUduRSxVQUFVLENBQUMyRSxXQUFXLENBQUM7TUFDMUMsT0FBQVAsYUFBQSxDQUFBQSxhQUFBLEtBQ0tQLElBQUk7UUFDUG5DLElBQUksRUFBRXlDO01BQVU7SUFFcEIsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUVOLElBQU1VLG1CQUFtQixHQUFHckYsV0FBVyxDQUNyQyxVQUFDa0YsWUFBbUIsRUFBa0M7SUFBQSxJQUFoQ0ksVUFBbUIsR0FBQUMsU0FBQSxDQUFBaEUsTUFBQSxRQUFBZ0UsU0FBQSxRQUFBQyxTQUFBLEdBQUFELFNBQUEsTUFBRyxLQUFLO0lBQy9DbEQsU0FBUyxDQUFDLFVBQUFnQyxJQUFJLEVBQUk7TUFDaEIsSUFBTWMsV0FBVyxHQUFHZCxJQUFJLENBQUNuQyxJQUFJLENBQUNrRCxHQUFHLENBQUMsVUFBQVosYUFBYSxFQUFJO1FBQ2pELElBQUlBLGFBQWEsQ0FBQ0MsRUFBRSxLQUFLUyxZQUFZLENBQUNULEVBQUUsRUFBRTtVQUN4QyxJQUFBZ0IsS0FBQSxHQUFvQ1AsWUFBWTtZQUF4Q1EsT0FBTyxHQUFBRCxLQUFBLENBQVBDLE9BQU87WUFBS0MsV0FBVyxHQUFBQyx3QkFBQSxDQUFBSCxLQUFBLEVBQUFJLFNBQUE7VUFDL0IsSUFBTUMsV0FBVyxHQUFBbEIsYUFBQSxDQUFBQSxhQUFBLEtBQVFKLGFBQWEsR0FBS21CLFdBQVcsQ0FBRTtVQUN4RCxPQUFPRyxXQUFXO1FBQ3BCO1FBQ0EsT0FBT3RCLGFBQWE7TUFDdEIsQ0FBQyxDQUFDOztNQUVGO01BQ0EsSUFBTXVCLFNBQVMsR0FBR1QsVUFBVSxHQUFHOUUsVUFBVSxDQUFDMkUsV0FBVyxDQUFDLEdBQUdBLFdBQVc7TUFFcEUsT0FBQVAsYUFBQSxDQUFBQSxhQUFBLEtBQ0tQLElBQUk7UUFDUG5DLElBQUksRUFBRTZEO01BQVM7SUFFbkIsQ0FBQyxDQUFDOztJQUVGO0lBQ0EsSUFBSSxDQUFBakUsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUUyQyxFQUFFLE1BQUtTLFlBQVksQ0FBQ1QsRUFBRSxFQUFFO01BQ2pDLElBQU1ELGFBQWEsR0FBRy9ELE1BQU0sQ0FBQ3lCLElBQUksQ0FBQzhELElBQUksQ0FBQyxVQUFBOUUsQ0FBQztRQUFBLE9BQUlBLENBQUMsQ0FBQ3VELEVBQUUsS0FBS1MsWUFBWSxDQUFDVCxFQUFFO01BQUEsRUFBQztNQUNyRSxJQUFJRCxhQUFhLEVBQUU7UUFDakIsSUFBQXlCLEtBQUEsR0FBb0NmLFlBQVk7VUFBeENRLE9BQU8sR0FBQU8sS0FBQSxDQUFQUCxPQUFPO1VBQUtDLFdBQVcsR0FBQUMsd0JBQUEsQ0FBQUssS0FBQSxFQUFBQyxVQUFBO1FBQy9CLElBQU1KLFdBQVcsR0FBQWxCLGFBQUEsQ0FBQUEsYUFBQSxLQUFRSixhQUFhLEdBQUttQixXQUFXLENBQUU7UUFDeEQvRCxXQUFXLENBQUNrRSxXQUFXLENBQUM7TUFDMUIsQ0FBQyxNQUFNO1FBQ0wsSUFBQUssS0FBQSxHQUFvQ2pCLFlBQVk7VUFBeENRLFFBQU8sR0FBQVMsS0FBQSxDQUFQVCxPQUFPO1VBQUtDLFlBQVcsR0FBQUMsd0JBQUEsQ0FBQU8sS0FBQSxFQUFBQyxVQUFBO1FBQy9CeEUsV0FBVyxDQUFDK0QsWUFBb0IsQ0FBQztNQUNuQztJQUNGO0VBQ0YsQ0FBQyxFQUNELENBQUM3RCxLQUFLLEVBQUVGLFdBQVcsRUFBRW5CLE1BQU0sQ0FBQ3lCLElBQUksQ0FDbEMsQ0FBQztFQUVELElBQU1tRSxjQUFjLEdBQUdyRyxXQUFXLENBQUMsWUFBTTtJQUN2Q3FDLFNBQVMsQ0FBQyxVQUFBZ0MsSUFBSSxFQUFJO01BQ2hCLElBQU1NLFVBQVUsR0FBR25FLFVBQVUsQ0FBQzZELElBQUksQ0FBQ25DLElBQUksQ0FBQztNQUN4QyxPQUFBMEMsYUFBQSxDQUFBQSxhQUFBLEtBQ0tQLElBQUk7UUFDUG5DLElBQUksRUFBRXlDO01BQVU7SUFFcEIsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUVOLElBQU0yQixnQkFBZ0IsR0FBR3RHLFdBQVcsQ0FDbEMsVUFBQytFLE9BQWdCLEVBQUs7SUFDcEIsSUFBSXRFLE1BQU0sQ0FBQ3lCLElBQUksQ0FBQ1gsTUFBTSxFQUFFO01BQ3RCLElBQU1nRixVQUFVLEdBQUc5RixNQUFNLENBQUN5QixJQUFJLENBQUNzRSxTQUFTLENBQUMsVUFBQUMsU0FBUztRQUFBLE9BQUlBLFNBQVMsQ0FBQ2hDLEVBQUUsS0FBS00sT0FBTztNQUFBLEVBQUM7TUFDL0VwQixvQkFBb0IsQ0FBQ0ssT0FBTyxHQUFHdkQsTUFBTSxDQUFDeUIsSUFBSSxDQUFDcUUsVUFBVSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO01BQ3BFM0UsV0FBVyxDQUFDbkIsTUFBTSxDQUFDeUIsSUFBSSxDQUFDcUUsVUFBVSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEQ7RUFDRixDQUFDLEVBQ0QsQ0FBQzlGLE1BQU0sQ0FBQ3lCLElBQUksRUFBRU4sV0FBVyxDQUMzQixDQUFDO0VBRUQsSUFBTThFLGVBQWUsR0FBRzFHLFdBQVc7SUFBQSxJQUFBMkcsS0FBQSxHQUFBQyxpQkFBQSxjQUFBQyxtQkFBQSxDQUFBQyxJQUFBLENBQ2pDLFNBQUFDLFNBQU9DLGFBQXFCO01BQUEsSUFBQUMsaUJBQUE7TUFBQSxJQUFBQyxVQUFBLEVBQUFDLGFBQUEsRUFBQUMsV0FBQSxFQUFBQyxPQUFBLEVBQUFDLFVBQUEsRUFBQTVHLFdBQUEsRUFBQTZHLFlBQUEsRUFBQUMsYUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxLQUFBLEVBQUFDLGVBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsd0JBQUEsRUFBQUMsV0FBQSxFQUFBQyxJQUFBLEVBQUFDLFFBQUEsRUFBQTlGLElBQUEsRUFBQStGLHFCQUFBLEVBQUFDLHFCQUFBLEVBQUFDLHNCQUFBLEVBQUFDLFVBQUEsRUFBQUMsWUFBQSxFQUFBQyxhQUFBLEVBQUFDLHFCQUFBLEVBQUFDLHNCQUFBLEVBQUFDLGVBQUEsRUFBQUMsZ0JBQUEsRUFBQW5DLFVBQUEsRUFBQW9DLHNCQUFBLEVBQUFDLGlCQUFBLEVBQUFDLGlCQUFBLEVBQUFDLG1CQUFBLEVBQUFDLEdBQUEsRUFBQUMsR0FBQTtNQUFBLE9BQUFuQyxtQkFBQSxDQUFBb0MsSUFBQSxXQUFBQyxTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQTdFLElBQUEsR0FBQTZFLFNBQUEsQ0FBQUMsSUFBQTtVQUFBO1lBQUEsS0FDdEJ2RixlQUFlLENBQUNJLE9BQU87Y0FBQWtGLFNBQUEsQ0FBQUMsSUFBQTtjQUFBO1lBQUE7WUFBQSxPQUFBRCxTQUFBLENBQUFFLE1BQUE7VUFBQTtZQUlyQmxDLFVBQVUsR0FBRyxDQUFBRixhQUFhLGFBQWJBLGFBQWEsZ0JBQUFDLGlCQUFBLEdBQWJELGFBQWEsQ0FBRXZDLEVBQUUsY0FBQXdDLGlCQUFBLHVCQUFqQkEsaUJBQUEsQ0FBbUJqQyxRQUFRLENBQUMsQ0FBQyxLQUFJLFNBQVM7WUFBQSxNQUN6RG5CLGNBQWMsQ0FBQ0csT0FBTyxLQUFLa0QsVUFBVSxJQUFJLENBQUMxRSxPQUFPO2NBQUEwRyxTQUFBLENBQUFDLElBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQUQsU0FBQSxDQUFBRSxNQUFBO1VBQUE7WUFJckR4RixlQUFlLENBQUNJLE9BQU8sR0FBRyxJQUFJO1lBQzlCSCxjQUFjLENBQUNHLE9BQU8sR0FBR2tELFVBQVU7WUFDbkN6RSxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2hCWSxRQUFRLENBQUMsSUFBSSxDQUFDO1lBRVI4RCxhQUFhLEdBQUcsQ0FBQyxDQUFDa0MsTUFBTSxDQUFDQywyQkFBMkIsSUFBSSxDQUFDLENBQUNELE1BQU0sQ0FBQ0Usd0NBQXdDO1lBQUFMLFNBQUEsQ0FBQTdFLElBQUE7WUFHekcrQyxXQUFvQixHQUFHLEVBQUU7WUFDekJDLE9BQU8sR0FBRyxLQUFLO1lBQ2ZDLFVBQXlCLEdBQUcsSUFBSSxFQUVwQztZQUFBLEtBQ0lILGFBQWE7Y0FBQStCLFNBQUEsQ0FBQUMsSUFBQTtjQUFBO1lBQUE7WUFDZjtZQUNJekksV0FBb0IsR0FBRyxFQUFFO1lBQ3pCNkcsWUFBcUIsR0FBRyxFQUFFO1lBQzFCQyxhQUFhLEdBQUcsS0FBSztZQUNyQkMsZ0JBQStCLEdBQUcsSUFBSTtZQUVwQ0MsS0FBSyxHQUFHLFNBQVJBLEtBQUtBLENBQUk4QixHQUFRO2NBQUEsSUFBQUMsYUFBQSxFQUFBQyxZQUFBLEVBQUFDLGFBQUE7Y0FBQSxPQUNyQixDQUFBSCxHQUFHLGFBQUhBLEdBQUcsZ0JBQUFDLGFBQUEsR0FBSEQsR0FBRyxDQUFFeEIsUUFBUSxjQUFBeUIsYUFBQSx1QkFBYkEsYUFBQSxDQUFlRyxNQUFNLE1BQUssR0FBRyxJQUM3QixDQUFBSixHQUFHLGFBQUhBLEdBQUcsdUJBQUhBLEdBQUcsQ0FBRUksTUFBTSxNQUFLLEdBQUcsS0FDbkJKLEdBQUcsYUFBSEEsR0FBRyxnQkFBQUUsWUFBQSxHQUFIRixHQUFHLENBQUU5RCxPQUFPLGNBQUFnRSxZQUFBLHVCQUFaQSxZQUFBLENBQWNHLFFBQVEsQ0FBQywwQ0FBMEMsQ0FBQyxNQUNsRUwsR0FBRyxhQUFIQSxHQUFHLGdCQUFBRyxhQUFBLEdBQUhILEdBQUcsQ0FBRTlELE9BQU8sY0FBQWlFLGFBQUEsdUJBQVpBLGFBQUEsQ0FBY0UsUUFBUSxDQUFDLHNCQUFzQixDQUFDO1lBQUEsR0FBQztZQUUzQ2xDLGVBQWU7Y0FBQSxJQUFBbUMsS0FBQSxHQUFBbEQsaUJBQUEsY0FBQUMsbUJBQUEsQ0FBQUMsSUFBQSxDQUFHLFNBQUFpRCxRQUFBO2dCQUFBLElBQUFDLGNBQUEsRUFBQUMsVUFBQSxFQUFBQyxZQUFBLEVBQUFDLFFBQUEsRUFBQUMsRUFBQTtnQkFBQSxPQUFBdkQsbUJBQUEsQ0FBQW9DLElBQUEsV0FBQW9CLFFBQUE7a0JBQUEsa0JBQUFBLFFBQUEsQ0FBQWhHLElBQUEsR0FBQWdHLFFBQUEsQ0FBQWxCLElBQUE7b0JBQUE7c0JBQUEsSUFDakJsRixtQkFBbUI7d0JBQUFvRyxRQUFBLENBQUFsQixJQUFBO3dCQUFBO3NCQUFBO3NCQUFBLE9BQUFrQixRQUFBLENBQUFqQixNQUFBO29CQUFBO3NCQUFBaUIsUUFBQSxDQUFBaEcsSUFBQTtzQkFFaEI0RixVQUFVLEdBQ2RwSSxPQUFPLEtBQUssUUFBUSxHQUNoQix1QkFBdUIsR0FDdkJBLE9BQU8sS0FBSyxTQUFTLElBQUlBLE9BQU8sS0FBSyxRQUFRLElBQUlBLE9BQU8sS0FBSyxNQUFNLEdBQ2pFLHVCQUF1QixHQUN2QixFQUFFO3NCQUFBd0ksUUFBQSxDQUFBbEIsSUFBQTtzQkFBQSxPQUNpQi9JLFNBQVMsQ0FBQzt3QkFDbkMySCxJQUFJLGtDQUFBdkcsTUFBQSxDQUFrQ2pCLFVBQVUsQ0FBQ21ELElBQUksQ0FBQzRHLFFBQVEsQ0FBQyxFQUFBOUksTUFBQSxDQUFHeUksVUFBVSxDQUFFO3dCQUM5RU0sTUFBTSxFQUFFO3NCQUNWLENBQUMsQ0FBQztvQkFBQTtzQkFISUwsWUFBWSxHQUFBRyxRQUFBLENBQUFHLElBQUE7c0JBQUFILFFBQUEsQ0FBQWxCLElBQUE7c0JBQUEsT0FJS2UsWUFBWSxDQUFDTyxJQUFJLENBQUMsQ0FBQztvQkFBQTtzQkFBcENOLFFBQVEsR0FBQUUsUUFBQSxDQUFBRyxJQUFBO3NCQUNkOUosV0FBVyxHQUFHLEVBQUFzSixjQUFBLEdBQUFHLFFBQVEsQ0FBQ2pJLElBQUksY0FBQThILGNBQUEsdUJBQWJBLGNBQUEsQ0FBZXJKLE1BQU0sQ0FBQyxVQUFDQyxFQUFTO3dCQUFBLE9BQUtBLEVBQUUsQ0FBQ0MsSUFBSSxLQUFLLE9BQU87c0JBQUEsRUFBQyxLQUFJLEVBQUU7c0JBQUF3SixRQUFBLENBQUFsQixJQUFBO3NCQUFBO29CQUFBO3NCQUFBa0IsUUFBQSxDQUFBaEcsSUFBQTtzQkFBQStGLEVBQUEsR0FBQUMsUUFBQTtzQkFBQSxJQUd4RTNDLEtBQUssQ0FBQTBDLEVBQVUsQ0FBQzt3QkFBQUMsUUFBQSxDQUFBbEIsSUFBQTt3QkFBQTtzQkFBQTtzQkFBQSxNQUFBaUIsRUFBQTtvQkFBQTtvQkFBQTtzQkFBQSxPQUFBQyxRQUFBLENBQUFLLElBQUE7a0JBQUE7Z0JBQUEsR0FBQVgsT0FBQTtjQUFBLENBRXhCO2NBQUEsZ0JBbkJLcEMsZUFBZUEsQ0FBQTtnQkFBQSxPQUFBbUMsS0FBQSxDQUFBYSxLQUFBLE9BQUFwRixTQUFBO2NBQUE7WUFBQTtZQXFCZnFDLGdCQUFnQjtjQUFBLElBQUFnRCxLQUFBLEdBQUFoRSxpQkFBQSxjQUFBQyxtQkFBQSxDQUFBQyxJQUFBLENBQUcsU0FBQStELFNBQUE7Z0JBQUEsSUFBQUMsY0FBQSxFQUFBQyxVQUFBLEVBQUFDLEdBQUE7Z0JBQUEsT0FBQW5FLG1CQUFBLENBQUFvQyxJQUFBLFdBQUFnQyxTQUFBO2tCQUFBLGtCQUFBQSxTQUFBLENBQUE1RyxJQUFBLEdBQUE0RyxTQUFBLENBQUE5QixJQUFBO29CQUFBO3NCQUFBOEIsU0FBQSxDQUFBNUcsSUFBQTtzQkFBQTRHLFNBQUEsQ0FBQTlCLElBQUE7c0JBQUEsT0FFUS9JLFNBQVMsQ0FBQzt3QkFDckMySCxJQUFJLEVBQUUsMkNBQTJDO3dCQUNqRHdDLE1BQU0sRUFBRTtzQkFDVixDQUFDLENBQUM7b0JBQUE7c0JBSElPLGNBQWMsR0FBQUcsU0FBQSxDQUFBVCxJQUFBO3NCQUFBUyxTQUFBLENBQUE5QixJQUFBO3NCQUFBLE9BSUsyQixjQUFjLENBQUNMLElBQUksQ0FBQyxDQUFDO29CQUFBO3NCQUF4Q00sVUFBVSxHQUFBRSxTQUFBLENBQUFULElBQUE7c0JBQ2hCakQsWUFBWSxHQUFHd0QsVUFBVSxDQUFDN0ksSUFBSSxJQUFJLEVBQUU7c0JBQ3BDc0YsYUFBYSxHQUFHdUQsVUFBVSxDQUFDRyxRQUFRLElBQUksS0FBSztzQkFDNUN6RCxnQkFBZ0IsR0FBR3NELFVBQVUsQ0FBQ0ksV0FBVyxJQUFJLElBQUk7c0JBQUFGLFNBQUEsQ0FBQTlCLElBQUE7c0JBQUE7b0JBQUE7c0JBQUE4QixTQUFBLENBQUE1RyxJQUFBO3NCQUFBMkcsR0FBQSxHQUFBQyxTQUFBO3NCQUFBLElBRzVDdkQsS0FBSyxDQUFBc0QsR0FBWSxDQUFDO3dCQUFBQyxTQUFBLENBQUE5QixJQUFBO3dCQUFBO3NCQUFBO3NCQUFBLE1BQUE2QixHQUFBO29CQUFBO29CQUFBO3NCQUFBLE9BQUFDLFNBQUEsQ0FBQVAsSUFBQTtrQkFBQTtnQkFBQSxHQUFBRyxRQUFBO2NBQUEsQ0FFMUI7Y0FBQSxnQkFkS2pELGdCQUFnQkEsQ0FBQTtnQkFBQSxPQUFBZ0QsS0FBQSxDQUFBRCxLQUFBLE9BQUFwRixTQUFBO2NBQUE7WUFBQTtZQUFBMkQsU0FBQSxDQUFBQyxJQUFBO1lBQUEsT0FnQmhCaUMsT0FBTyxDQUFDQyxHQUFHLENBQUMsQ0FBQzFELGVBQWUsQ0FBQyxDQUFDLEVBQUVDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1VBQUE7WUFFMUQ7WUFDQTtZQUNBLElBQUksQ0FBQzNELG1CQUFtQixFQUFFO2NBQ3hCO2NBQ0E7Y0FDQW1ELFdBQVcsR0FBR0csWUFBWTtZQUM1QixDQUFDLE1BQU07Y0FDTDtjQUNBO2NBQ0E7Y0FDQUgsV0FBVyxHQUFHMUcsV0FBVyxDQUFDYSxNQUFNLE1BQUFDLE1BQUEsQ0FBQUMsa0JBQUEsQ0FBT2YsV0FBVyxHQUFBZSxrQkFBQSxDQUFLOEYsWUFBWSxLQUFJQSxZQUFZO1lBQ3JGO1lBQ0E7WUFDQUgsV0FBVyxHQUFHNUcsVUFBVSxDQUFDNEcsV0FBVyxDQUFDO1lBQ3JDQyxPQUFPLEdBQUdHLGFBQWE7WUFDdkJGLFVBQVUsR0FBR0csZ0JBQWdCO1lBRTdCcEYsU0FBUyxDQUFDO2NBQ1JILElBQUksRUFBRWtGLFdBQVc7Y0FDakI4RCxRQUFRLEVBQUU3RCxPQUFPO2NBQ2pCOEQsV0FBVyxFQUFFN0Q7WUFDZixDQUFDLENBQUM7O1lBRUY7WUFDQSxJQUFJRixXQUFXLENBQUM3RixNQUFNLEtBQUssQ0FBQyxFQUFFO2NBQzVCOEIsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNoQjtZQUFDNkYsU0FBQSxDQUFBQyxJQUFBO1lBQUE7VUFBQTtZQUVLdEIsd0JBQXdCLEdBQzVCNUQsbUJBQW1CLEtBQ2xCcEMsT0FBTyxLQUFLLFNBQVMsSUFBSUEsT0FBTyxLQUFLLFFBQVEsSUFBSUEsT0FBTyxLQUFLLFFBQVEsSUFBSUEsT0FBTyxLQUFLLE1BQU0sQ0FBQztZQUFBLElBRTFGZ0csd0JBQXdCO2NBQUFxQixTQUFBLENBQUFDLElBQUE7Y0FBQTtZQUFBO1lBQzNCOUcsU0FBUyxDQUFDO2NBQUVILElBQUksRUFBRSxFQUFFO2NBQUVnSixRQUFRLEVBQUUsS0FBSztjQUFFQyxXQUFXLEVBQUU7WUFBSyxDQUFDLENBQUM7WUFDM0Q5SCxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQUE2RixTQUFBLENBQUFDLElBQUE7WUFBQTtVQUFBO1lBRVJyQixXQUFXLEdBQUcsSUFBSXdELGVBQWUsQ0FBQyxDQUFDO1lBQ3pDeEQsV0FBVyxDQUFDeUQsTUFBTSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUM7WUFDekN6RCxXQUFXLENBQUN5RCxNQUFNLENBQUMsTUFBTSxFQUFFaEwsVUFBVSxDQUFDbUQsSUFBSSxDQUFDNEcsUUFBUSxDQUFDLENBQUM7WUFDckR4QyxXQUFXLENBQUN5RCxNQUFNLENBQUMsT0FBTyxFQUFFMUosT0FBTyxLQUFLLFFBQVEsR0FBRyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztZQUN2RixJQUFJQSxPQUFPLEtBQUssUUFBUSxFQUFFO2NBQ3hCaUcsV0FBVyxDQUFDeUQsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUM7Y0FDaEN6RCxXQUFXLENBQUN5RCxNQUFNLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQztZQUNuQztZQUVNeEQsSUFBSSxhQUFBdkcsTUFBQSxDQUFhc0csV0FBVyxDQUFDOUMsUUFBUSxDQUFDLENBQUM7WUFBQWtFLFNBQUEsQ0FBQTdFLElBQUE7WUFBQTZFLFNBQUEsQ0FBQUMsSUFBQTtZQUFBLE9BR3BCL0ksU0FBUyxDQUFDO2NBQy9CMkgsSUFBSSxFQUFKQSxJQUFJO2NBQ0p3QyxNQUFNLEVBQUU7WUFDVixDQUFDLENBQUM7VUFBQTtZQUhJdkMsUUFBUSxHQUFBa0IsU0FBQSxDQUFBc0IsSUFBQTtZQUFBdEIsU0FBQSxDQUFBQyxJQUFBO1lBQUEsT0FLS25CLFFBQVEsQ0FBQ3lDLElBQUksQ0FBQyxDQUFDO1VBQUE7WUFBNUJ2SSxJQUFJLEdBQUFnSCxTQUFBLENBQUFzQixJQUFBO1lBQ1ZwRCxXQUFXLEdBQUdsRixJQUFJLENBQUNBLElBQUksSUFBSSxFQUFFO1lBQzdCa0YsV0FBVyxHQUFHNUcsVUFBVSxDQUFDNEcsV0FBVyxDQUFDO1lBQ3JDQyxPQUFPLEdBQUduRixJQUFJLENBQUNnSixRQUFRO1lBQ3ZCNUQsVUFBVSxHQUFHcEYsSUFBSSxDQUFDaUosV0FBVztZQUU3QjlJLFNBQVMsQ0FBQXVDLGFBQUEsQ0FBQUEsYUFBQSxLQUNKMUMsSUFBSTtjQUNQQSxJQUFJLEVBQUVrRjtZQUFXLEVBQ2xCLENBQUM7WUFBQThCLFNBQUEsQ0FBQUMsSUFBQTtZQUFBO1VBQUE7WUFBQUQsU0FBQSxDQUFBN0UsSUFBQTtZQUFBMEUsR0FBQSxHQUFBRyxTQUFBO1lBRUY7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNNZCxVQUFVLEdBQ2QsQ0FBQVcsR0FBQSxhQUFBQSxHQUFBLGdCQUFBZCxxQkFBQSxHQUFBYyxHQUFBLENBQWVmLFFBQVEsY0FBQUMscUJBQUEsdUJBQXZCQSxxQkFBQSxDQUF5QjJCLE1BQU0sTUFBSyxHQUFHLElBQ3ZDLENBQUFiLEdBQUEsYUFBQUEsR0FBQSx1QkFBQUEsR0FBQSxDQUFlYSxNQUFNLE1BQUssR0FBRyxLQUFBYixHQUFBLGFBQUFBLEdBQUEsZ0JBQUFiLHFCQUFBLEdBQzdCYSxHQUFBLENBQWVyRCxPQUFPLGNBQUF3QyxxQkFBQSx1QkFBdEJBLHFCQUFBLENBQXdCMkIsUUFBUSxDQUFDLDBDQUEwQyxDQUFDLE1BQUFkLEdBQUEsYUFBQUEsR0FBQSxnQkFBQVosc0JBQUEsR0FDNUVZLEdBQUEsQ0FBZXJELE9BQU8sY0FBQXlDLHNCQUFBLHVCQUF0QkEsc0JBQUEsQ0FBd0IwQixRQUFRLENBQUMsc0JBQXNCLENBQUMsR0FBQztZQUFBLEtBRXZEekIsVUFBVTtjQUFBYyxTQUFBLENBQUFDLElBQUE7Y0FBQTtZQUFBO1lBQ1o7WUFDQTlHLFNBQVMsQ0FBQztjQUNSSCxJQUFJLEVBQUUsRUFBRTtjQUNSZ0osUUFBUSxFQUFFLEtBQUs7Y0FDZkMsV0FBVyxFQUFFO1lBQ2YsQ0FBQyxDQUFDO1lBQ0Y5SCxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQUE2RixTQUFBLENBQUFDLElBQUE7WUFBQTtVQUFBO1lBQUEsTUFBQUosR0FBQTtVQUFBO1lBU3RCO1lBQ0EsSUFBSTNCLFdBQVcsQ0FBQzdGLE1BQU0sR0FBRyxDQUFDLEVBQUU7Y0FDMUIsSUFBSXlGLGFBQWEsSUFBSUksV0FBVyxDQUFDcEIsSUFBSSxDQUFDLFVBQUN3RixjQUFxQjtnQkFBQSxPQUFLQSxjQUFjLENBQUMvRyxFQUFFLEtBQUt1QyxhQUFhLENBQUN2QyxFQUFFO2NBQUEsRUFBQyxFQUFFO2dCQUN4RyxJQUFJLEVBQUE4RCxxQkFBQSxHQUFBNUUsb0JBQW9CLENBQUNLLE9BQU8sY0FBQXVFLHFCQUFBLHVCQUE1QkEscUJBQUEsQ0FBOEI5RCxFQUFFLE1BQUt1QyxhQUFhLENBQUN2QyxFQUFFLEVBQUU7a0JBQ3pEZCxvQkFBb0IsQ0FBQ0ssT0FBTyxHQUFHZ0QsYUFBYTtrQkFDNUNwRixXQUFXLENBQUNvRixhQUFhLENBQUM7Z0JBQzVCO2NBQ0YsQ0FBQyxNQUFNLElBQUksQ0FBQXFCLFlBQUEsR0FBQWpCLFdBQVcsY0FBQWlCLFlBQUEsZUFBWEEsWUFBQSxDQUFjLENBQUMsQ0FBQyxLQUFLLENBQUN2RyxLQUFLLElBQUksQ0FBQ3NGLFdBQVcsQ0FBQ3BCLElBQUksQ0FBQyxVQUFDOUUsQ0FBUTtnQkFBQSxPQUFLQSxDQUFDLENBQUN1RCxFQUFFLEtBQUszQyxLQUFLLENBQUMyQyxFQUFFO2NBQUEsRUFBQyxDQUFDLEVBQUU7Z0JBQ3ZGZ0UsZUFBZSxHQUNuQlksTUFBTSxDQUFDQywyQkFBMkIsSUFBSXJGLG1CQUFtQixHQUNyRG1ELFdBQVcsR0FDWEEsV0FBVyxDQUFDekcsTUFBTSxDQUFDLFVBQUM4SyxTQUFnQjtrQkFBQSxPQUFLQSxTQUFTLENBQUM1SyxJQUFJLEtBQUssT0FBTztnQkFBQSxFQUFDO2dCQUFBNkgsZ0JBQUEsR0FBQXRHLGNBQUEsQ0FFckRxRyxlQUFlLE1BQTdCbEMsVUFBVSxHQUFBbUMsZ0JBQUE7Z0JBQ2pCLElBQUluQyxVQUFVLElBQUksRUFBQWlDLHNCQUFBLEdBQUE3RSxvQkFBb0IsQ0FBQ0ssT0FBTyxjQUFBd0Usc0JBQUEsdUJBQTVCQSxzQkFBQSxDQUE4Qi9ELEVBQUUsTUFBSzhCLFVBQVUsQ0FBQzlCLEVBQUUsRUFBRTtrQkFDcEVkLG9CQUFvQixDQUFDSyxPQUFPLEdBQUd1QyxVQUFVO2tCQUN6QzNFLFdBQVcsQ0FBQzJFLFVBQVUsQ0FBQztnQkFDekI7Y0FDRixDQUFDLE1BQU0sSUFBSVMsYUFBYSxLQUFBc0IsYUFBQSxHQUFJbEIsV0FBVyxjQUFBa0IsYUFBQSxlQUFYQSxhQUFBLENBQWEvRyxNQUFNLEVBQUU7Z0JBQ3pDa0gsaUJBQWUsR0FDbkJZLE1BQU0sQ0FBQ0MsMkJBQTJCLElBQUlyRixtQkFBbUIsR0FDckRtRCxXQUFXLEdBQ1hBLFdBQVcsQ0FBQ3pHLE1BQU0sQ0FBQyxVQUFDOEssU0FBZ0I7a0JBQUEsT0FBS0EsU0FBUyxDQUFDNUssSUFBSSxLQUFLLE9BQU87Z0JBQUEsRUFBQztnQkFBQWdJLGlCQUFBLEdBQUF6RyxjQUFBLENBRTVDcUcsaUJBQWUsTUFBdENLLG1CQUFtQixHQUFBRCxpQkFBQTtnQkFDMUIsSUFBSUMsbUJBQW1CLElBQUksRUFBQUgsc0JBQUEsR0FBQWhGLG9CQUFvQixDQUFDSyxPQUFPLGNBQUEyRSxzQkFBQSx1QkFBNUJBLHNCQUFBLENBQThCbEUsRUFBRSxNQUFLcUUsbUJBQW1CLENBQUNyRSxFQUFFLEVBQUU7a0JBQ3RGZCxvQkFBb0IsQ0FBQ0ssT0FBTyxHQUFHOEUsbUJBQW1CO2tCQUNsRGxILFdBQVcsQ0FBQ2tILG1CQUFtQixDQUFDO2dCQUNsQztjQUNGO1lBQ0Y7WUFFQXJHLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFBQXlHLFNBQUEsQ0FBQUMsSUFBQTtZQUFBO1VBQUE7WUFBQUQsU0FBQSxDQUFBN0UsSUFBQTtZQUFBMkUsR0FBQSxHQUFBRSxTQUFBO1lBRWpCN0YsUUFBUSxDQUFDMkYsR0FBQSxZQUFlMEMsS0FBSyxHQUFHMUMsR0FBQSxDQUFJdEQsT0FBTyxHQUFHLDJCQUEyQixDQUFDO1lBQzFFakQsVUFBVSxDQUFDLEtBQUssQ0FBQztVQUFBO1lBQUF5RyxTQUFBLENBQUE3RSxJQUFBO1lBRWpCVCxlQUFlLENBQUNJLE9BQU8sR0FBRyxLQUFLO1lBQy9CMkgsVUFBVSxDQUFDLFlBQU07Y0FDZixJQUFJLENBQUMvSCxlQUFlLENBQUNJLE9BQU8sRUFBRTtnQkFDNUJILGNBQWMsQ0FBQ0csT0FBTyxHQUFHLElBQUk7Y0FDL0I7WUFDRixDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQUEsT0FBQWtGLFNBQUEsQ0FBQTBDLE1BQUE7VUFBQTtVQUFBO1lBQUEsT0FBQTFDLFNBQUEsQ0FBQXdCLElBQUE7UUFBQTtNQUFBLEdBQUEzRCxRQUFBO0lBQUEsQ0FFVjtJQUFBLGlCQUFBOEUsRUFBQTtNQUFBLE9BQUFsRixLQUFBLENBQUFnRSxLQUFBLE9BQUFwRixTQUFBO0lBQUE7RUFBQSxLQUNELENBQUMzRCxXQUFXLEVBQUVDLE9BQU8sRUFBRUMsS0FBSyxFQUFFVSxPQUFPLEVBQUV5QixtQkFBbUIsRUFBRVAsSUFBSSxDQUFDNEcsUUFBUSxDQUMzRSxDQUFDO0VBRUQsSUFBTXdCLGtCQUFrQixHQUFHOUwsV0FBVztJQUFBLElBQUErTCxLQUFBLEdBQUFuRixpQkFBQSxjQUFBQyxtQkFBQSxDQUFBQyxJQUFBLENBQUMsU0FBQWtGLFNBQU9DLEtBQWE7TUFBQSxJQUFBakUsUUFBQSxFQUFBOUYsSUFBQSxFQUFBZ0ssR0FBQTtNQUFBLE9BQUFyRixtQkFBQSxDQUFBb0MsSUFBQSxXQUFBa0QsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUE5SCxJQUFBLEdBQUE4SCxTQUFBLENBQUFoRCxJQUFBO1VBQUE7WUFBQSxJQUNwRDhDLEtBQUs7Y0FBQUUsU0FBQSxDQUFBaEQsSUFBQTtjQUFBO1lBQUE7WUFDUixJQUFJcEYsa0JBQWtCLENBQUNDLE9BQU8sRUFBRTtjQUM5QjNCLFNBQVMsQ0FBQzBCLGtCQUFrQixDQUFDQyxPQUFPLENBQUM7Y0FDckNELGtCQUFrQixDQUFDQyxPQUFPLEdBQUcsSUFBSTtZQUNuQztZQUFDLE9BQUFtSSxTQUFBLENBQUEvQyxNQUFBO1VBQUE7WUFJSCxJQUFJLENBQUNyRixrQkFBa0IsQ0FBQ0MsT0FBTyxFQUFFO2NBQy9CRCxrQkFBa0IsQ0FBQ0MsT0FBTyxHQUFHRixTQUFTLENBQUNFLE9BQU87WUFDaEQ7WUFFQWYsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQUFrSixTQUFBLENBQUE5SCxJQUFBO1lBQUE4SCxTQUFBLENBQUFoRCxJQUFBO1lBQUEsT0FHRy9JLFNBQVMsQ0FBQztjQUMvQjJILElBQUksa0RBQUF2RyxNQUFBLENBQWtENEssa0JBQWtCLENBQUNILEtBQUssQ0FBQyxDQUFFO2NBQ2pGMUIsTUFBTSxFQUFFO1lBQ1YsQ0FBQyxDQUFDO1VBQUE7WUFISXZDLFFBQVEsR0FBQW1FLFNBQUEsQ0FBQTNCLElBQUE7WUFBQTJCLFNBQUEsQ0FBQWhELElBQUE7WUFBQSxPQUlLbkIsUUFBUSxDQUFDeUMsSUFBSSxDQUFDLENBQUM7VUFBQTtZQUE1QnZJLElBQUksR0FBQWlLLFNBQUEsQ0FBQTNCLElBQUE7WUFFVm5JLFNBQVMsQ0FBQyxVQUFBZ0MsSUFBSSxFQUFJO2NBQ2hCLElBQU0zRCxXQUFXLEdBQUcyRCxJQUFJLENBQUNuQyxJQUFJLENBQUN2QixNQUFNLENBQUMsVUFBQ0MsRUFBUztnQkFBQSxPQUFLQSxFQUFFLENBQUNDLElBQUksS0FBSyxPQUFPO2NBQUEsRUFBQztjQUN4RSxJQUFNd0wsYUFBc0IsR0FBR25LLElBQUksQ0FBQ0EsSUFBSSxJQUFJLEVBQUU7Y0FDOUMsT0FBTztnQkFDTEEsSUFBSSxFQUFFeEIsV0FBVyxDQUFDYSxNQUFNLE1BQUFDLE1BQUEsQ0FBQUMsa0JBQUEsQ0FBT2YsV0FBVyxHQUFBZSxrQkFBQSxDQUFLNEssYUFBYSxLQUFJQSxhQUFhO2dCQUM3RW5CLFFBQVEsRUFBRSxLQUFLO2dCQUNmQyxXQUFXLEVBQUU7Y0FDZixDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBQUFnQixTQUFBLENBQUFoRCxJQUFBO1lBQUE7VUFBQTtZQUFBZ0QsU0FBQSxDQUFBOUgsSUFBQTtZQUFBNkgsR0FBQSxHQUFBQyxTQUFBO1lBRUY1SSxtQkFBbUIsQ0FBQ0UsQ0FBQyxDQUFDLCtCQUErQixDQUFDLENBQUM7VUFBQTtZQUFBMEksU0FBQSxDQUFBOUgsSUFBQTtZQUV2RHBCLGdCQUFnQixDQUFDLEtBQUssQ0FBQztZQUFBLE9BQUFrSixTQUFBLENBQUFQLE1BQUE7VUFBQTtVQUFBO1lBQUEsT0FBQU8sU0FBQSxDQUFBekIsSUFBQTtRQUFBO01BQUEsR0FBQXNCLFFBQUE7SUFBQSxDQUUxQjtJQUFBLGlCQUFBTSxHQUFBO01BQUEsT0FBQVAsS0FBQSxDQUFBcEIsS0FBQSxPQUFBcEYsU0FBQTtJQUFBO0VBQUEsS0FBRSxFQUFFLENBQUM7RUFFTixJQUFNZ0gsY0FBYyxHQUFHdk0sV0FBVyxjQUFBNEcsaUJBQUEsY0FBQUMsbUJBQUEsQ0FBQUMsSUFBQSxDQUFDLFNBQUEwRixTQUFBO0lBQUEsSUFBQXJGLGFBQUEsRUFBQXNGLFdBQUEsRUFBQTFFLElBQUEsRUFBQUQsV0FBQSxFQUFBRSxRQUFBLEVBQUE5RixJQUFBLEVBQUF3SyxHQUFBO0lBQUEsT0FBQTdGLG1CQUFBLENBQUFvQyxJQUFBLFdBQUEwRCxTQUFBO01BQUEsa0JBQUFBLFNBQUEsQ0FBQXRJLElBQUEsR0FBQXNJLFNBQUEsQ0FBQXhELElBQUE7UUFBQTtVQUMzQmhDLGFBQWEsR0FBRyxDQUFDLENBQUNrQyxNQUFNLENBQUNDLDJCQUEyQixJQUFJLENBQUMsQ0FBQ0QsTUFBTSxDQUFDRSx3Q0FBd0MsRUFDL0c7VUFDTWtELFdBQVcsR0FBRzVLLE9BQU8sS0FBSyxRQUFRLElBQUlzRixhQUFhO1VBQUEsTUFDckQsQ0FBQ3NGLFdBQVcsSUFBSSxDQUFDaE0sTUFBTSxDQUFDeUssUUFBUSxJQUFJLENBQUN6SyxNQUFNLENBQUMwSyxXQUFXLElBQUl2SSxXQUFXO1lBQUErSixTQUFBLENBQUF4RCxJQUFBO1lBQUE7VUFBQTtVQUFBLE9BQUF3RCxTQUFBLENBQUF2RCxNQUFBO1FBQUE7VUFJMUV2RyxjQUFjLENBQUMsSUFBSSxDQUFDO1VBQ3BCUSxRQUFRLENBQUMsSUFBSSxDQUFDO1VBQUFzSixTQUFBLENBQUF0SSxJQUFBO1VBS1o7VUFDQSxJQUFJOEMsYUFBYSxFQUFFO1lBQ2pCO1lBQ0FZLElBQUksOENBQUF2RyxNQUFBLENBQThDZixNQUFNLENBQUMwSyxXQUFXLENBQUU7VUFDeEUsQ0FBQyxNQUFNO1lBQ0w7WUFDTXJELFdBQVcsR0FBRyxJQUFJd0QsZUFBZSxDQUFDLENBQUM7WUFDekN4RCxXQUFXLENBQUN5RCxNQUFNLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQztZQUN6Q3pELFdBQVcsQ0FBQ3lELE1BQU0sQ0FBQyxNQUFNLEVBQUVoTCxVQUFVLENBQUNtRCxJQUFJLENBQUM0RyxRQUFRLENBQUMsQ0FBQztZQUNyRHhDLFdBQVcsQ0FBQ3lELE1BQU0sQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUM7WUFDN0N6RCxXQUFXLENBQUN5RCxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQztZQUNoQ3pELFdBQVcsQ0FBQ3lELE1BQU0sQ0FBQyxRQUFRLEVBQUU5SyxNQUFNLENBQUMwSyxXQUFXLENBQUNuRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzNEK0MsSUFBSSxhQUFBdkcsTUFBQSxDQUFhc0csV0FBVyxDQUFDOUMsUUFBUSxDQUFDLENBQUMsQ0FBRTtVQUMzQztVQUFDMkgsU0FBQSxDQUFBeEQsSUFBQTtVQUFBLE9BRXNCL0ksU0FBUyxDQUFDO1lBQy9CMkgsSUFBSSxFQUFKQSxJQUFJO1lBQ0p3QyxNQUFNLEVBQUU7VUFDVixDQUFDLENBQUM7UUFBQTtVQUhJdkMsUUFBUSxHQUFBMkUsU0FBQSxDQUFBbkMsSUFBQTtVQUFBbUMsU0FBQSxDQUFBeEQsSUFBQTtVQUFBLE9BS0tuQixRQUFRLENBQUN5QyxJQUFJLENBQUMsQ0FBQztRQUFBO1VBQTVCdkksSUFBSSxHQUFBeUssU0FBQSxDQUFBbkMsSUFBQTtVQUVWO1VBQ0FuSSxTQUFTLENBQUMsVUFBQWdDLElBQUksRUFBSTtZQUNoQixJQUFJOEMsYUFBYSxFQUFFO2NBQ2pCO2NBQ0E7Y0FDQSxJQUFNeUYsbUJBQW1CLEdBQUd2SSxJQUFJLENBQUNuQyxJQUFJLENBQUN2QixNQUFNLENBQUMsVUFBQ0MsRUFBUztnQkFBQSxPQUFLQSxFQUFFLENBQUNDLElBQUksS0FBSyxPQUFPO2NBQUEsRUFBQzs7Y0FFaEY7Y0FDQSxJQUFNZ00sWUFBVyxHQUFHLElBQUlDLEdBQUcsQ0FBQ3pJLElBQUksQ0FBQ25DLElBQUksQ0FBQ3ZCLE1BQU0sQ0FBQyxVQUFDQyxFQUFTO2dCQUFBLE9BQUtBLEVBQUUsQ0FBQ0MsSUFBSSxLQUFLLE9BQU87Y0FBQSxFQUFDLENBQUN1RSxHQUFHLENBQUMsVUFBQ3hFLEVBQVM7Z0JBQUEsT0FBS0EsRUFBRSxDQUFDNkQsRUFBRTtjQUFBLEVBQUMsQ0FBQzs7Y0FFM0c7Y0FDQSxJQUFNc0ksVUFBUyxHQUFHN0ssSUFBSSxDQUFDQSxJQUFJLENBQUN2QixNQUFNLENBQUMsVUFBQ0MsRUFBUztnQkFBQSxPQUFLQSxFQUFFLENBQUNDLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQ2dNLFlBQVcsQ0FBQ0csR0FBRyxDQUFDcE0sRUFBRSxDQUFDNkQsRUFBRSxDQUFDO2NBQUEsRUFBQzs7Y0FFakc7Y0FDQSxJQUFNQyxRQUFPLEdBQUdrSSxtQkFBbUIsQ0FBQ3JMLE1BQU0sTUFBQUMsTUFBQSxDQUFBQyxrQkFBQSxDQUNsQ21MLG1CQUFtQixHQUFBbkwsa0JBQUEsQ0FBSzRDLElBQUksQ0FBQ25DLElBQUksQ0FBQ3ZCLE1BQU0sQ0FBQyxVQUFDQyxFQUFTO2dCQUFBLE9BQUtBLEVBQUUsQ0FBQ0MsSUFBSSxLQUFLLE9BQU87Y0FBQSxFQUFDLEdBQUFZLGtCQUFBLENBQUtzTCxVQUFTLFFBQUF2TCxNQUFBLENBQUFDLGtCQUFBLENBQzFGNEMsSUFBSSxDQUFDbkMsSUFBSSxDQUFDdkIsTUFBTSxDQUFDLFVBQUNDLEVBQVM7Z0JBQUEsT0FBS0EsRUFBRSxDQUFDQyxJQUFJLEtBQUssT0FBTztjQUFBLEVBQUMsR0FBQVksa0JBQUEsQ0FBS3NMLFVBQVMsRUFBQzs7Y0FFM0U7Y0FDQSxJQUFNcEksV0FBVSxHQUFHbkUsVUFBVSxDQUFDa0UsUUFBTyxDQUFDO2NBRXRDLE9BQU87Z0JBQ0x4QyxJQUFJLEVBQUV5QyxXQUFVO2dCQUNoQnVHLFFBQVEsRUFBRWhKLElBQUksQ0FBQ2dKLFFBQVE7Z0JBQ3ZCQyxXQUFXLEVBQUVqSixJQUFJLENBQUNpSjtjQUNwQixDQUFDO1lBQ0g7WUFDQTtZQUNBLElBQU0wQixXQUFXLEdBQUcsSUFBSUMsR0FBRyxDQUFDekksSUFBSSxDQUFDbkMsSUFBSSxDQUFDa0QsR0FBRyxDQUFDLFVBQUN4RSxFQUFTO2NBQUEsT0FBS0EsRUFBRSxDQUFDNkQsRUFBRTtZQUFBLEVBQUMsQ0FBQztZQUNoRSxJQUFNc0ksU0FBUyxHQUFHLENBQUM3SyxJQUFJLENBQUNBLElBQUksSUFBSSxFQUFFLEVBQUV2QixNQUFNLENBQUMsVUFBQ0MsRUFBUztjQUFBLE9BQUssQ0FBQ2lNLFdBQVcsQ0FBQ0csR0FBRyxDQUFDcE0sRUFBRSxDQUFDNkQsRUFBRSxDQUFDO1lBQUEsRUFBQztZQUNsRixJQUFNQyxPQUFPLE1BQUFsRCxNQUFBLENBQUFDLGtCQUFBLENBQU80QyxJQUFJLENBQUNuQyxJQUFJLEdBQUFULGtCQUFBLENBQUtzTCxTQUFTLEVBQUM7O1lBRTVDO1lBQ0EsSUFBTXBJLFVBQVUsR0FBR25FLFVBQVUsQ0FBQ2tFLE9BQU8sQ0FBQztZQUV0QyxPQUFPO2NBQ0x4QyxJQUFJLEVBQUV5QyxVQUFVO2NBQ2hCdUcsUUFBUSxFQUFFaEosSUFBSSxDQUFDZ0osUUFBUTtjQUN2QkMsV0FBVyxFQUFFakosSUFBSSxDQUFDaUo7WUFDcEIsQ0FBQztVQUNILENBQUMsQ0FBQztVQUVGdEksY0FBYyxDQUFDLEtBQUssQ0FBQztVQUFBOEosU0FBQSxDQUFBeEQsSUFBQTtVQUFBO1FBQUE7VUFBQXdELFNBQUEsQ0FBQXRJLElBQUE7VUFBQXFJLEdBQUEsR0FBQUMsU0FBQTtVQUVyQnBKLG1CQUFtQixDQUFDRSxDQUFDLENBQUMsK0JBQStCLENBQUMsQ0FBQztVQUN2RFosY0FBYyxDQUFDLEtBQUssQ0FBQztRQUFBO1FBQUE7VUFBQSxPQUFBOEosU0FBQSxDQUFBakMsSUFBQTtNQUFBO0lBQUEsR0FBQThCLFFBQUE7RUFBQSxDQUV4QixJQUFFLENBQUMzSyxPQUFPLEVBQUVwQixNQUFNLENBQUN5SyxRQUFRLEVBQUV6SyxNQUFNLENBQUMwSyxXQUFXLEVBQUV2SSxXQUFXLEVBQUVjLElBQUksQ0FBQzRHLFFBQVEsQ0FBQyxDQUFDO0VBRTlFLE9BQU87SUFDTDdKLE1BQU0sRUFBTkEsTUFBTTtJQUNOK0IsT0FBTyxFQUFQQSxPQUFPO0lBQ1BJLFdBQVcsRUFBWEEsV0FBVztJQUNYUSxLQUFLLEVBQUxBLEtBQUs7SUFDTHNELGVBQWUsRUFBZkEsZUFBZTtJQUNmNkYsY0FBYyxFQUFkQSxjQUFjO0lBQ2RULGtCQUFrQixFQUFsQkEsa0JBQWtCO0lBQ2xCOUksYUFBYSxFQUFiQSxhQUFhO0lBQ2JrQixRQUFRLEVBQVJBLFFBQVE7SUFDUlksV0FBVyxFQUFYQSxXQUFXO0lBQ1hHLFdBQVcsRUFBWEEsV0FBVztJQUNYSSxtQkFBbUIsRUFBbkJBLG1CQUFtQjtJQUNuQmlCLGdCQUFnQixFQUFoQkEsZ0JBQWdCO0lBQ2hCRCxjQUFjLEVBQWRBO0VBQ0YsQ0FBQztBQUNILENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=