@projectcor/maia-components 2.11.40 → 2.11.41-1

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 (79) hide show
  1. package/lib/App.js +22 -11
  2. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +38 -0
  3. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +184 -0
  4. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +39 -0
  5. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +390 -0
  6. package/lib/components/atoms/ContextMentionChip/index.js +4 -0
  7. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +195 -0
  8. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +6 -0
  9. package/lib/components/atoms/ContextMentionEditor/index.js +2 -0
  10. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +282 -0
  11. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +145 -0
  12. package/lib/components/atoms/ContextMentionItem/index.js +2 -0
  13. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +168 -0
  14. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +79 -0
  15. package/lib/components/atoms/ContextMentionPopover/index.js +3 -0
  16. package/lib/components/atoms/MAIAInput/MAIAInput.js +238 -321
  17. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +269 -0
  18. package/lib/components/atoms/MAIAInput/styles.js +75 -46
  19. package/lib/components/atoms/icons/NotionIcon.js +36 -0
  20. package/lib/components/atoms/icons/SubtaskIcon.js +36 -0
  21. package/lib/components/atoms/icons/index.js +2 -1
  22. package/lib/components/index.js +2 -1
  23. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +8 -4
  24. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +31 -3
  25. package/lib/components/molecules/ChatAIMessages/newStyles.js +5 -2
  26. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +8 -6
  27. package/lib/components/molecules/ChatFooter/ChatFooter.js +5 -4
  28. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +68 -0
  29. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +6 -0
  30. package/lib/components/molecules/ContextMentionInput/index.js +2 -0
  31. package/lib/components/molecules/Sidebar/Sidebar.js +9 -5
  32. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +6 -2
  33. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +5 -2
  34. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +6 -3
  35. package/lib/constants/config.js +3 -1
  36. package/lib/constants/taskLinkIcon.js +6 -0
  37. package/lib/context/cor-user.js +1 -1
  38. package/lib/dev/DevContextMentionInput.js +65 -0
  39. package/lib/dev/Providers.js +11 -6
  40. package/lib/hooks/useCaretPosition.js +35 -0
  41. package/lib/hooks/useChatManager/useChatManager.interface.js +1 -1
  42. package/lib/hooks/useChatManager/useChatManager.js +21 -11
  43. package/lib/hooks/useChatMessages/useChatMessages.interface.js +1 -1
  44. package/lib/hooks/useChatMessages/useChatMessages.js +30 -14
  45. package/lib/hooks/useClientSearch.js +3 -2
  46. package/lib/hooks/useContextMentions.js +270 -0
  47. package/lib/hooks/useEntitySearch.js +1010 -0
  48. package/lib/hooks/useEvent.js +6 -1
  49. package/lib/hooks/useMentionAllowedTypes.js +103 -0
  50. package/lib/hooks/useMentionPopover.js +333 -0
  51. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +6 -4
  52. package/lib/hooks/useProjectSearch.js +3 -2
  53. package/lib/hooks/useRecentClientsSearch.js +3 -2
  54. package/lib/hooks/useTaskPanel.js +3 -10
  55. package/lib/hooks/useTextOverflowEllipsisTooltip.js +34 -0
  56. package/lib/lang/br/index.js +24 -1
  57. package/lib/lang/en/index.js +24 -1
  58. package/lib/lang/es/index.js +24 -1
  59. package/lib/lang/fr/index.js +23 -1
  60. package/lib/services/maia/Chats/getChatMessages.js +29 -4
  61. package/lib/services/maia/Orchestrator/orchestrator.js +8 -5
  62. package/lib/services/maia/RecentProjects/getRecentProjects.js +12 -4
  63. package/lib/services/maia/RecentTasks/getRecentTasks.js +54 -0
  64. package/lib/services/maia/RecentTasks/index.js +6 -0
  65. package/lib/services/maia/RecentUsers/getRecentUsers.js +59 -0
  66. package/lib/services/maia/RecentUsers/index.js +6 -0
  67. package/lib/services/query/entitySearchQuery.js +18 -0
  68. package/lib/services/query/usersDirectoryQuery.js +19 -0
  69. package/lib/services/utils/mapChatMessages.js +12 -5
  70. package/lib/types/Chat.js +1 -1
  71. package/lib/types/agent.js +1 -1
  72. package/lib/types/contextMention.js +37 -0
  73. package/lib/utils/contextMentionIcons.js +115 -0
  74. package/lib/utils/contextMentionLabel.js +4 -0
  75. package/lib/utils/contextMentionTypeLabel.js +17 -0
  76. package/lib/utils/maiaStreamdownRehypePlugins.js +27 -0
  77. package/lib/utils/openTaskInCorPanel.js +18 -0
  78. package/lib/utils/renderContextMentions.js +299 -0
  79. package/package.json +2 -1
@@ -0,0 +1,1010 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
4
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
6
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
7
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
8
+ import { useLazyQuery } from '@apollo/client';
9
+ import { useCallback, useEffect, useMemo, useState } from 'react';
10
+ import { getRecentClients } from '../services/maia/RecentClients/getRecentClients';
11
+ import { getRecentProjects } from '../services/maia/RecentProjects/getRecentProjects';
12
+ import { getRecentTasks } from '../services/maia/RecentTasks/getRecentTasks';
13
+ import { useUser } from '../context/cor-user';
14
+ import { PROJECTS_FALLBACK, SEARCH_ENTITIES, TASK_FAMILY_FALLBACK } from '../services/query/entitySearchQuery';
15
+ import { SEARCH_CLIENTS } from '../services/query/ClientSearchQuery';
16
+ import { USERS_DIRECTORY } from '../services/query/usersDirectoryQuery';
17
+ import { SEARCH_QUERY_DEBOUNCE_MS } from '../constants/config';
18
+ import { useDebounce } from './useDebounce';
19
+ import { useT } from './useT';
20
+ var normalizePositiveInt = function normalizePositiveInt(value, fallback) {
21
+ var parsed = Number(value);
22
+ if (!Number.isFinite(parsed)) return fallback;
23
+ var normalized = Math.floor(parsed);
24
+ return normalized > 0 ? normalized : fallback;
25
+ };
26
+
27
+ /**
28
+ * Restringe los resultados al `clientId`/`projectId` del agente activo.
29
+ * Cuando el agente está scopeado a un client/project, tanto los recents como
30
+ * el search deben filtrar por ese contexto. Si el backend no entiende algún
31
+ * campo lo ignora y se cae al comportamiento global.
32
+ */
33
+
34
+ var BASE_FILTERS_BY_TYPE = {
35
+ project: {
36
+ project: 'true',
37
+ archived: 'all'
38
+ },
39
+ task: {
40
+ task: 'true',
41
+ archived: 'false'
42
+ }
43
+ };
44
+
45
+ /**
46
+ * Entradas para el argumento GraphQL `extra` (JSON string de array) al buscar tareas con contexto.
47
+ * Ej.: [{"projectId":"881552"}]
48
+ */
49
+ var buildTaskSearchExtraEntries = function buildTaskSearchExtraEntries(scope) {
50
+ var rawClient = (scope === null || scope === void 0 ? void 0 : scope.clientId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== '' ? String(scope.clientId) : null;
51
+ var rawProject = (scope === null || scope === void 0 ? void 0 : scope.projectId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.projectId) !== null && (scope === null || scope === void 0 ? void 0 : scope.projectId) !== '' ? String(scope.projectId) : null;
52
+ var agentEntity = scope === null || scope === void 0 ? void 0 : scope.agentEntity;
53
+ var entries = [];
54
+ var pushClient = function pushClient() {
55
+ if (rawClient) entries.push({
56
+ clientId: rawClient
57
+ });
58
+ };
59
+ var pushProject = function pushProject() {
60
+ if (rawProject) entries.push({
61
+ projectId: rawProject
62
+ });
63
+ };
64
+ if (agentEntity === 'project') {
65
+ if (rawProject) {
66
+ pushProject();
67
+ } else if (rawClient) {
68
+ pushClient();
69
+ }
70
+ } else if (agentEntity === 'client') {
71
+ pushClient();
72
+ pushProject();
73
+ } else {
74
+ pushClient();
75
+ pushProject();
76
+ }
77
+ return entries;
78
+ };
79
+ var buildTaskSearchExtra = function buildTaskSearchExtra(scope) {
80
+ var entries = buildTaskSearchExtraEntries(scope);
81
+ if (entries.length === 0) return undefined;
82
+ return JSON.stringify(entries);
83
+ };
84
+
85
+ /**
86
+ * Tab proyecto: con `clientId` en el scope, `extra` acota la búsqueda a proyectos de ese cliente.
87
+ * Ej.: `[{"clientId":"47105"}]` junto a `filters` `{"project":"true","archived":"all"}`.
88
+ */
89
+ var buildProjectSearchExtra = function buildProjectSearchExtra(scope) {
90
+ var rawClient = (scope === null || scope === void 0 ? void 0 : scope.clientId) !== undefined && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && (scope === null || scope === void 0 ? void 0 : scope.clientId) !== '' ? String(scope.clientId) : null;
91
+ if (!rawClient) return undefined;
92
+ return JSON.stringify([{
93
+ clientId: rawClient
94
+ }]);
95
+ };
96
+ var buildSearchEntitiesExtra = function buildSearchEntitiesExtra(type, scope) {
97
+ if (type === 'task') return buildTaskSearchExtra(scope);
98
+ if (type === 'project') return buildProjectSearchExtra(scope);
99
+ return undefined;
100
+ };
101
+
102
+ /**
103
+ * Tab `task` / `project`: `filters` sólo tipo + archived (tareas: no archivadas); scope (clientId / projectId en tareas) en `extra`.
104
+ */
105
+ var buildFiltersForType = function buildFiltersForType(type) {
106
+ if (type === 'project') {
107
+ return JSON.stringify(BASE_FILTERS_BY_TYPE.project);
108
+ }
109
+ return JSON.stringify(BASE_FILTERS_BY_TYPE.task);
110
+ };
111
+
112
+ /**
113
+ * Filtros para usersDirectory. El backend espera un JSON string con
114
+ * withPosition, withTeams y searchInput. Le agregamos clientId/projectId
115
+ * del scope en caso de que el backend los aproveche para filtrar por
116
+ * contexto (si no los entiende los ignora).
117
+ */
118
+ var buildUsersDirectoryFilters = function buildUsersDirectoryFilters(q) {
119
+ var base = {
120
+ withPosition: true,
121
+ withTeams: true
122
+ };
123
+ var trimmedQ = q.trim();
124
+ if (trimmedQ) {
125
+ base.searchInput = trimmedQ;
126
+ }
127
+ return JSON.stringify(base);
128
+ };
129
+ var highlightRange = function highlightRange(text, searchValue) {
130
+ if (!searchValue) return undefined;
131
+ var idx = text.toLowerCase().indexOf(searchValue.toLowerCase());
132
+ if (idx < 0) return undefined;
133
+ return {
134
+ start: idx,
135
+ length: searchValue.length
136
+ };
137
+ };
138
+ var firstDefined = function firstDefined() {
139
+ for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {
140
+ values[_key] = arguments[_key];
141
+ }
142
+ return values.find(function (value) {
143
+ return value !== undefined && value !== null;
144
+ });
145
+ };
146
+ var mapClientToItem = function mapClientToItem(c, searchValue) {
147
+ var _c$totalProyectos, _c$totalProyectos2;
148
+ return {
149
+ id: c.id,
150
+ type: 'client',
151
+ primary: c.name,
152
+ primaryHighlight: highlightRange(c.name, searchValue),
153
+ breadcrumb: {
154
+ count: (_c$totalProyectos = c.totalProyectos) !== null && _c$totalProyectos !== void 0 ? _c$totalProyectos : undefined,
155
+ countLabel: 'projects'
156
+ },
157
+ raw: {
158
+ id: c.id,
159
+ name: c.name,
160
+ totalProyectos: (_c$totalProyectos2 = c.totalProyectos) !== null && _c$totalProyectos2 !== void 0 ? _c$totalProyectos2 : null
161
+ }
162
+ };
163
+ };
164
+ var mapUserToItem = function mapUserToItem(u, searchValue) {
165
+ var _u$firstName, _u$lastName, _u$picture, _u$positionName, _u$email;
166
+ var fullName = "".concat((_u$firstName = u.firstName) !== null && _u$firstName !== void 0 ? _u$firstName : '', " ").concat((_u$lastName = u.lastName) !== null && _u$lastName !== void 0 ? _u$lastName : '').trim();
167
+ var primary = fullName || u.email || String(u.id);
168
+ return {
169
+ id: u.id,
170
+ type: 'user',
171
+ primary: primary,
172
+ primaryHighlight: highlightRange(primary, searchValue),
173
+ raw: {
174
+ id: u.id,
175
+ name: primary,
176
+ picture: (_u$picture = u.picture) !== null && _u$picture !== void 0 ? _u$picture : null,
177
+ positionName: (_u$positionName = u.positionName) !== null && _u$positionName !== void 0 ? _u$positionName : null,
178
+ email: (_u$email = u.email) !== null && _u$email !== void 0 ? _u$email : null
179
+ }
180
+ };
181
+ };
182
+ var mapCorUserToUserItem = function mapCorUserToUserItem(user, searchValue, meLabel) {
183
+ var _user$firstName, _user$lastName, _user$user_position, _user$email;
184
+ var fullName = "".concat((_user$firstName = user.firstName) !== null && _user$firstName !== void 0 ? _user$firstName : '', " ").concat((_user$lastName = user.lastName) !== null && _user$lastName !== void 0 ? _user$lastName : '').trim();
185
+ /** Solo cargo real; sin fallback a `role` (la UI muestra “Sin posición” si falta). */
186
+ var positionLine = ((_user$user_position = user.user_position) === null || _user$user_position === void 0 ? void 0 : _user$user_position.trim()) || null;
187
+ return {
188
+ id: user.id,
189
+ type: 'user',
190
+ primary: meLabel,
191
+ primaryHighlight: highlightRange(meLabel, searchValue),
192
+ raw: {
193
+ id: user.id,
194
+ name: fullName || String(user.id),
195
+ picture: user.picture || null,
196
+ positionName: positionLine,
197
+ email: ((_user$email = user.email) === null || _user$email === void 0 ? void 0 : _user$email.trim()) || null
198
+ }
199
+ };
200
+ };
201
+ var mapRecentTaskToItem = function mapRecentTaskToItem(task, searchValue) {
202
+ var _task$projectName;
203
+ var showProjectNameInTaskRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
204
+ var primary = task.title && task.title.trim() || String(task.id);
205
+ var projectName = showProjectNameInTaskRow ? (_task$projectName = task.projectName) !== null && _task$projectName !== void 0 ? _task$projectName : null : null;
206
+ return {
207
+ id: task.id,
208
+ type: 'task',
209
+ primary: primary,
210
+ primaryHighlight: highlightRange(primary, searchValue),
211
+ breadcrumb: projectName ? {
212
+ parent: projectName
213
+ } : undefined,
214
+ raw: {
215
+ id: task.id,
216
+ name: primary,
217
+ projectName: projectName
218
+ }
219
+ };
220
+ };
221
+ var normalizeTaskFamilyRecord = function normalizeTaskFamilyRecord(record) {
222
+ var _record$title, _firstDefined, _record$project, _record$father, _record$father2;
223
+ var taskFamilyId = record._id;
224
+ var id = taskFamilyId;
225
+ if (id === undefined || id === null || String(id) === '') return null;
226
+ var title = ((_record$title = record.title) !== null && _record$title !== void 0 ? _record$title : '').trim() || String(id);
227
+ var projectName = (_firstDefined = firstDefined((_record$project = record.project) === null || _record$project === void 0 ? void 0 : _record$project.name, (_record$father = record.father) === null || _record$father === void 0 ? void 0 : _record$father.title)) !== null && _firstDefined !== void 0 ? _firstDefined : null;
228
+ var hasFather = !!firstDefined(record.taskFather, (_record$father2 = record.father) === null || _record$father2 === void 0 ? void 0 : _record$father2.id);
229
+ return {
230
+ id: id,
231
+ title: title,
232
+ type: hasFather ? 'subtask' : 'task',
233
+ projectName: projectName
234
+ };
235
+ };
236
+ var normalizeProjectsFallbackRecord = function normalizeProjectsFallbackRecord(record) {
237
+ var _record$name, _firstDefined2, _record$client, _record$client$name, _record$client2;
238
+ var id = record.id;
239
+ if (id === undefined || id === null || String(id) === '') return null;
240
+ var title = (_record$name = record.name) !== null && _record$name !== void 0 ? _record$name : '';
241
+ var clientId = (_firstDefined2 = firstDefined(record.clientId, (_record$client = record.client) === null || _record$client === void 0 ? void 0 : _record$client.id)) !== null && _firstDefined2 !== void 0 ? _firstDefined2 : null;
242
+ var clientName = (_record$client$name = (_record$client2 = record.client) === null || _record$client2 === void 0 ? void 0 : _record$client2.name) !== null && _record$client$name !== void 0 ? _record$client$name : null;
243
+ return {
244
+ id: id,
245
+ title: title,
246
+ type: 'project',
247
+ clientId: clientId,
248
+ clientName: clientName
249
+ };
250
+ };
251
+ var mapSearchToItem = function mapSearchToItem(r, type, searchValue) {
252
+ var _r$projectName, _r$projectName2, _r$clientId, _r$clientName, _r$feeId, _father$title;
253
+ var showProjectNameInTaskRow = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
254
+ var primary = r.title || r.projectName || '';
255
+ var parent;
256
+ if (type === 'project') parent = r.clientName;else if (type === 'task') parent = undefined;else parent = (_r$projectName = r.projectName) !== null && _r$projectName !== void 0 ? _r$projectName : r.clientName;
257
+ var father = type === 'task' ? r.father : null;
258
+ var hasFather = type === 'task' && father != null && father.id != null && String(father.id).length > 0;
259
+ var taskProjectName = type === 'task' && !showProjectNameInTaskRow ? null : (_r$projectName2 = r.projectName) !== null && _r$projectName2 !== void 0 ? _r$projectName2 : null;
260
+ return {
261
+ id: r.id,
262
+ type: type,
263
+ primary: primary,
264
+ primaryHighlight: highlightRange(primary, searchValue),
265
+ breadcrumb: parent ? {
266
+ parent: parent
267
+ } : undefined,
268
+ raw: {
269
+ id: r.id,
270
+ name: primary,
271
+ clientId: (_r$clientId = r.clientId) !== null && _r$clientId !== void 0 ? _r$clientId : null,
272
+ clientName: (_r$clientName = r.clientName) !== null && _r$clientName !== void 0 ? _r$clientName : null,
273
+ projectName: taskProjectName,
274
+ feeId: (_r$feeId = r.feeId) !== null && _r$feeId !== void 0 ? _r$feeId : null,
275
+ fatherId: hasFather ? father.id : null,
276
+ fatherTitle: hasFather ? ((_father$title = father.title) === null || _father$title === void 0 ? void 0 : _father$title.trim()) || null : null
277
+ }
278
+ };
279
+ };
280
+ var formatMcpPrimaryLabel = function formatMcpPrimaryLabel(slug) {
281
+ return slug.replace(/_/g, ' ').replace(/\b\w/g, function (_char) {
282
+ return _char.toUpperCase();
283
+ });
284
+ };
285
+ var mapMcpSlugsToItems = function mapMcpSlugsToItems(slugs, searchValue) {
286
+ var q = searchValue.trim().toLowerCase();
287
+ var filtered = slugs;
288
+ if (q) {
289
+ filtered = slugs.filter(function (s) {
290
+ var primary = formatMcpPrimaryLabel(s);
291
+ return s.toLowerCase().includes(q) || primary.toLowerCase().includes(q);
292
+ });
293
+ }
294
+ return filtered.map(function (slug) {
295
+ var primary = formatMcpPrimaryLabel(slug);
296
+ return {
297
+ id: slug,
298
+ type: 'mcp',
299
+ primary: primary,
300
+ primaryHighlight: highlightRange(primary, searchValue),
301
+ raw: {
302
+ id: slug,
303
+ name: primary
304
+ }
305
+ };
306
+ });
307
+ };
308
+ export var useEntitySearch = function useEntitySearch(type, scope) {
309
+ var _scope$mcpSlugs;
310
+ var corUser = useUser();
311
+ var _useT = useT(),
312
+ t = _useT.t;
313
+ var _useState = useState(''),
314
+ _useState2 = _slicedToArray(_useState, 2),
315
+ searchValue = _useState2[0],
316
+ setSearchValue = _useState2[1];
317
+ var debouncedSearchValue = useDebounce(searchValue, SEARCH_QUERY_DEBOUNCE_MS);
318
+ var _useState3 = useState([]),
319
+ _useState4 = _slicedToArray(_useState3, 2),
320
+ items = _useState4[0],
321
+ setItems = _useState4[1];
322
+ var _useState5 = useState(false),
323
+ _useState6 = _slicedToArray(_useState5, 2),
324
+ loading = _useState6[0],
325
+ setLoading = _useState6[1];
326
+ var _useState7 = useState(false),
327
+ _useState8 = _slicedToArray(_useState7, 2),
328
+ error = _useState8[0],
329
+ setError = _useState8[1];
330
+ var _useState9 = useState(false),
331
+ _useState0 = _slicedToArray(_useState9, 2),
332
+ hideRecentsLabel = _useState0[0],
333
+ setHideRecentsLabel = _useState0[1];
334
+ var _useState1 = useState(false),
335
+ _useState10 = _slicedToArray(_useState1, 2),
336
+ hasMore = _useState10[0],
337
+ setHasMore = _useState10[1];
338
+ var _useState11 = useState(false),
339
+ _useState12 = _slicedToArray(_useState11, 2),
340
+ isLoadingMore = _useState12[0],
341
+ setIsLoadingMore = _useState12[1];
342
+ var _useState13 = useState(1),
343
+ _useState14 = _slicedToArray(_useState13, 2),
344
+ currentPage = _useState14[0],
345
+ setCurrentPage = _useState14[1];
346
+ var _useState15 = useState('none'),
347
+ _useState16 = _slicedToArray(_useState15, 2),
348
+ activePaginationSource = _useState16[0],
349
+ setActivePaginationSource = _useState16[1];
350
+ var mcpSlugsKey = ((_scope$mcpSlugs = scope === null || scope === void 0 ? void 0 : scope.mcpSlugs) !== null && _scope$mcpSlugs !== void 0 ? _scope$mcpSlugs : []).join('|');
351
+ var showProjectNameInTaskRow = (scope === null || scope === void 0 ? void 0 : scope.agentEntity) !== 'project';
352
+
353
+ // Estabilizamos el scope para no disparar fetchs por cambios de identidad de objeto.
354
+ var stableScope = useMemo(function () {
355
+ var _scope$clientId, _scope$projectId, _scope$mcpSlugs2, _scope$agentEntity;
356
+ return {
357
+ clientId: (_scope$clientId = scope === null || scope === void 0 ? void 0 : scope.clientId) !== null && _scope$clientId !== void 0 ? _scope$clientId : null,
358
+ projectId: (_scope$projectId = scope === null || scope === void 0 ? void 0 : scope.projectId) !== null && _scope$projectId !== void 0 ? _scope$projectId : null,
359
+ mcpSlugs: (_scope$mcpSlugs2 = scope === null || scope === void 0 ? void 0 : scope.mcpSlugs) !== null && _scope$mcpSlugs2 !== void 0 ? _scope$mcpSlugs2 : [],
360
+ agentEntity: (_scope$agentEntity = scope === null || scope === void 0 ? void 0 : scope.agentEntity) !== null && _scope$agentEntity !== void 0 ? _scope$agentEntity : null
361
+ };
362
+ }, [scope === null || scope === void 0 ? void 0 : scope.clientId, scope === null || scope === void 0 ? void 0 : scope.projectId, mcpSlugsKey, scope === null || scope === void 0 ? void 0 : scope.agentEntity]);
363
+
364
+ // --- Search: project | task (GraphQL: search) ---
365
+ var _useLazyQuery = useLazyQuery(SEARCH_ENTITIES, {
366
+ variables: {
367
+ limit: 20
368
+ },
369
+ fetchPolicy: 'network-only'
370
+ }),
371
+ _useLazyQuery2 = _slicedToArray(_useLazyQuery, 2),
372
+ fetchSearchEntities = _useLazyQuery2[0],
373
+ _useLazyQuery2$ = _useLazyQuery2[1],
374
+ searchData = _useLazyQuery2$.data,
375
+ searchLoading = _useLazyQuery2$.loading,
376
+ searchError = _useLazyQuery2$.error;
377
+
378
+ // --- Search: client (GraphQL) ---
379
+ var _useLazyQuery3 = useLazyQuery(SEARCH_CLIENTS, {
380
+ fetchPolicy: 'network-only'
381
+ }),
382
+ _useLazyQuery4 = _slicedToArray(_useLazyQuery3, 2),
383
+ fetchSearchClients = _useLazyQuery4[0],
384
+ _useLazyQuery4$ = _useLazyQuery4[1],
385
+ clientsData = _useLazyQuery4$.data,
386
+ clientsLoading = _useLazyQuery4$.loading,
387
+ clientsError = _useLazyQuery4$.error;
388
+
389
+ // --- Search: user (GraphQL: usersDirectory) ---
390
+ var _useLazyQuery5 = useLazyQuery(USERS_DIRECTORY, {
391
+ fetchPolicy: 'network-only'
392
+ }),
393
+ _useLazyQuery6 = _slicedToArray(_useLazyQuery5, 2),
394
+ fetchUsersDirectory = _useLazyQuery6[0],
395
+ _useLazyQuery6$ = _useLazyQuery6[1],
396
+ usersData = _useLazyQuery6$.data,
397
+ usersLoading = _useLazyQuery6$.loading,
398
+ usersError = _useLazyQuery6$.error;
399
+ var syncUsersPagination = useCallback(function (payload) {
400
+ var _payload$usersDirecto, _payload$usersDirecto2;
401
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$usersDirecto = payload.usersDirectory) === null || _payload$usersDirecto === void 0 ? void 0 : _payload$usersDirecto.page, 1);
402
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$usersDirecto2 = payload.usersDirectory) === null || _payload$usersDirecto2 === void 0 ? void 0 : _payload$usersDirecto2.lastPage, page);
403
+ setCurrentPage(page);
404
+ setHasMore(page < lastPage);
405
+ }, []);
406
+ var syncClientsPagination = useCallback(function (payload) {
407
+ var _payload$clients, _payload$clients2;
408
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$clients = payload.clients) === null || _payload$clients === void 0 ? void 0 : _payload$clients.page, 1);
409
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$clients2 = payload.clients) === null || _payload$clients2 === void 0 ? void 0 : _payload$clients2.lastPage, page);
410
+ setCurrentPage(page);
411
+ setHasMore(page < lastPage);
412
+ }, []);
413
+ var syncTaskFallbackPagination = useCallback(function (payload) {
414
+ var _payload$taskFamily, _payload$taskFamily2;
415
+ var rawPage = Number(payload === null || payload === void 0 || (_payload$taskFamily = payload.taskFamily) === null || _payload$taskFamily === void 0 ? void 0 : _payload$taskFamily.page);
416
+ // taskFamily usa páginas 0-based; convertimos a 1-based para consistencia con el resto
417
+ var page = Number.isFinite(rawPage) && rawPage >= 0 ? Math.floor(rawPage) + 1 : 1;
418
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$taskFamily2 = payload.taskFamily) === null || _payload$taskFamily2 === void 0 ? void 0 : _payload$taskFamily2.lastPage, page);
419
+ setCurrentPage(page);
420
+ setHasMore(page < lastPage);
421
+ }, []);
422
+ var syncProjectFallbackPagination = useCallback(function (payload) {
423
+ var _payload$projects, _payload$projects2;
424
+ var page = normalizePositiveInt(payload === null || payload === void 0 || (_payload$projects = payload.projects) === null || _payload$projects === void 0 ? void 0 : _payload$projects.page, 1);
425
+ var lastPage = normalizePositiveInt(payload === null || payload === void 0 || (_payload$projects2 = payload.projects) === null || _payload$projects2 === void 0 ? void 0 : _payload$projects2.lastPage, page);
426
+ setCurrentPage(page);
427
+ setHasMore(page < lastPage);
428
+ }, []);
429
+ var _useLazyQuery7 = useLazyQuery(TASK_FAMILY_FALLBACK, {
430
+ fetchPolicy: 'network-only'
431
+ }),
432
+ _useLazyQuery8 = _slicedToArray(_useLazyQuery7, 1),
433
+ fetchTaskFamilyFallback = _useLazyQuery8[0];
434
+ var _useLazyQuery9 = useLazyQuery(PROJECTS_FALLBACK, {
435
+ fetchPolicy: 'network-only'
436
+ }),
437
+ _useLazyQuery0 = _slicedToArray(_useLazyQuery9, 1),
438
+ fetchProjectsFallback = _useLazyQuery0[0];
439
+ var fetchRecent = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
440
+ var _stableScope$mcpSlugs, slugs, data, mapped, _data, _mapped, _fallbackData$project, _fallbackData$project2, argumentsFilter, _yield$fetchProjectsF, fallbackData, fallbackMapped, recentTaskFilters, _data2, taskItems, _fallbackData$taskFam, _fallbackData$taskFam2, filter, _yield$fetchTaskFamil, _fallbackData, _data3$usersDirectory, _data3$usersDirectory2, _yield$fetchUsersDire, _data3, _mapped2, meItem, withoutMe, _t;
441
+ return _regeneratorRuntime.wrap(function (_context) {
442
+ while (1) switch (_context.prev = _context.next) {
443
+ case 0:
444
+ if (!(type === 'mcp')) {
445
+ _context.next = 1;
446
+ break;
447
+ }
448
+ slugs = (_stableScope$mcpSlugs = stableScope.mcpSlugs) !== null && _stableScope$mcpSlugs !== void 0 ? _stableScope$mcpSlugs : [];
449
+ setLoading(false);
450
+ setError(false);
451
+ setItems(mapMcpSlugsToItems(slugs, ''));
452
+ setHideRecentsLabel(false);
453
+ setActivePaginationSource('none');
454
+ setHasMore(false);
455
+ return _context.abrupt("return");
456
+ case 1:
457
+ setLoading(true);
458
+ setError(false);
459
+ _context.prev = 2;
460
+ if (!(type === 'client')) {
461
+ _context.next = 4;
462
+ break;
463
+ }
464
+ _context.next = 3;
465
+ return getRecentClients();
466
+ case 3:
467
+ data = _context.sent;
468
+ mapped = (data !== null && data !== void 0 ? data : []).map(function (c) {
469
+ return mapClientToItem(c, '');
470
+ });
471
+ setItems(mapped);
472
+ setHideRecentsLabel(false);
473
+ setActivePaginationSource('none');
474
+ setHasMore(false);
475
+ _context.next = 17;
476
+ break;
477
+ case 4:
478
+ if (!(type === 'project')) {
479
+ _context.next = 9;
480
+ break;
481
+ }
482
+ _context.next = 5;
483
+ return getRecentProjects(stableScope.clientId ? {
484
+ clientId: stableScope.clientId
485
+ } : undefined);
486
+ case 5:
487
+ _data = _context.sent;
488
+ _mapped = (Array.isArray(_data) ? _data : []).map(function (p) {
489
+ return mapSearchToItem({
490
+ id: p.id,
491
+ title: p.title,
492
+ type: 'project',
493
+ clientId: p.clientId,
494
+ feeId: p.feeId,
495
+ clientName: p.clientName
496
+ }, 'project', '');
497
+ });
498
+ if (!(_mapped.length === 0)) {
499
+ _context.next = 7;
500
+ break;
501
+ }
502
+ argumentsFilter = stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '' ? {
503
+ client_id: [String(stableScope.clientId)]
504
+ } : undefined;
505
+ _context.next = 6;
506
+ return fetchProjectsFallback({
507
+ variables: _objectSpread(_objectSpread({}, argumentsFilter ? {
508
+ arguments: argumentsFilter
509
+ } : {}), {}, {
510
+ page: 1,
511
+ perPage: 20
512
+ })
513
+ });
514
+ case 6:
515
+ _yield$fetchProjectsF = _context.sent;
516
+ fallbackData = _yield$fetchProjectsF.data;
517
+ fallbackMapped = ((_fallbackData$project = fallbackData === null || fallbackData === void 0 || (_fallbackData$project2 = fallbackData.projects) === null || _fallbackData$project2 === void 0 ? void 0 : _fallbackData$project2.data) !== null && _fallbackData$project !== void 0 ? _fallbackData$project : []).map(normalizeProjectsFallbackRecord).filter(function (item) {
518
+ return item !== null;
519
+ }).map(function (item) {
520
+ return mapSearchToItem(item, 'project', '');
521
+ });
522
+ _mapped = fallbackMapped;
523
+ setHideRecentsLabel(fallbackMapped.length > 0);
524
+ setActivePaginationSource('project-fallback');
525
+ syncProjectFallbackPagination(fallbackData);
526
+ _context.next = 8;
527
+ break;
528
+ case 7:
529
+ setHideRecentsLabel(false);
530
+ setActivePaginationSource('none');
531
+ setHasMore(false);
532
+ case 8:
533
+ setItems(_mapped);
534
+ _context.next = 17;
535
+ break;
536
+ case 9:
537
+ if (!(type === 'task')) {
538
+ _context.next = 14;
539
+ break;
540
+ }
541
+ if (stableScope.agentEntity === 'project') {
542
+ recentTaskFilters = {
543
+ projectId: stableScope.projectId
544
+ };
545
+ } else if (stableScope.agentEntity === 'client') {
546
+ recentTaskFilters = {
547
+ clientId: stableScope.clientId
548
+ };
549
+ }
550
+ _context.next = 10;
551
+ return getRecentTasks(recentTaskFilters);
552
+ case 10:
553
+ _data2 = _context.sent;
554
+ taskItems = (_data2 !== null && _data2 !== void 0 ? _data2 : []).map(function (task) {
555
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
556
+ });
557
+ if (!(taskItems.length === 0)) {
558
+ _context.next = 12;
559
+ break;
560
+ }
561
+ filter = {};
562
+ if (stableScope.projectId !== null && stableScope.projectId !== undefined && stableScope.projectId !== '') {
563
+ filter.projectIds = [String(stableScope.projectId)];
564
+ }
565
+ if (stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '') {
566
+ filter.clientIds = [String(stableScope.clientId)];
567
+ }
568
+ _context.next = 11;
569
+ return fetchTaskFamilyFallback({
570
+ variables: {
571
+ filter: _objectSpread({
572
+ archived: false
573
+ }, filter),
574
+ pagination: {
575
+ offset: 0,
576
+ size: 20
577
+ }
578
+ }
579
+ });
580
+ case 11:
581
+ _yield$fetchTaskFamil = _context.sent;
582
+ _fallbackData = _yield$fetchTaskFamil.data;
583
+ taskItems = ((_fallbackData$taskFam = _fallbackData === null || _fallbackData === void 0 || (_fallbackData$taskFam2 = _fallbackData.taskFamily) === null || _fallbackData$taskFam2 === void 0 ? void 0 : _fallbackData$taskFam2.data) !== null && _fallbackData$taskFam !== void 0 ? _fallbackData$taskFam : []).map(normalizeTaskFamilyRecord).filter(function (item) {
584
+ return item !== null;
585
+ }).map(function (task) {
586
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
587
+ });
588
+ setHideRecentsLabel(taskItems.length > 0);
589
+ setActivePaginationSource('task-fallback');
590
+ syncTaskFallbackPagination(_fallbackData);
591
+ _context.next = 13;
592
+ break;
593
+ case 12:
594
+ setHideRecentsLabel(false);
595
+ setActivePaginationSource('none');
596
+ setHasMore(false);
597
+ case 13:
598
+ setItems(taskItems);
599
+ _context.next = 17;
600
+ break;
601
+ case 14:
602
+ if (!(type === 'user')) {
603
+ _context.next = 16;
604
+ break;
605
+ }
606
+ _context.next = 15;
607
+ return fetchUsersDirectory({
608
+ variables: {
609
+ filters: buildUsersDirectoryFilters(''),
610
+ page: 1
611
+ }
612
+ });
613
+ case 15:
614
+ _yield$fetchUsersDire = _context.sent;
615
+ _data3 = _yield$fetchUsersDire.data;
616
+ _mapped2 = ((_data3$usersDirectory = _data3 === null || _data3 === void 0 || (_data3$usersDirectory2 = _data3.usersDirectory) === null || _data3$usersDirectory2 === void 0 ? void 0 : _data3$usersDirectory2.data) !== null && _data3$usersDirectory !== void 0 ? _data3$usersDirectory : []).map(function (u) {
617
+ return mapUserToItem(u, '');
618
+ });
619
+ meItem = mapCorUserToUserItem(corUser, '', t('contextMention.me'));
620
+ withoutMe = _mapped2.filter(function (item) {
621
+ return String(item.id) !== String(meItem.id);
622
+ });
623
+ setItems([meItem].concat(_toConsumableArray(withoutMe)));
624
+ syncUsersPagination(_data3);
625
+ setHideRecentsLabel(false);
626
+ setActivePaginationSource('users');
627
+ _context.next = 17;
628
+ break;
629
+ case 16:
630
+ setItems([]);
631
+ setHideRecentsLabel(false);
632
+ setActivePaginationSource('none');
633
+ setHasMore(false);
634
+ setCurrentPage(1);
635
+ case 17:
636
+ _context.next = 19;
637
+ break;
638
+ case 18:
639
+ _context.prev = 18;
640
+ _t = _context["catch"](2);
641
+ setError(true);
642
+ setItems([]);
643
+ setHideRecentsLabel(false);
644
+ case 19:
645
+ _context.prev = 19;
646
+ setLoading(false);
647
+ return _context.finish(19);
648
+ case 20:
649
+ case "end":
650
+ return _context.stop();
651
+ }
652
+ }, _callee, null, [[2, 18, 19, 20]]);
653
+ })), [type, stableScope, fetchUsersDirectory, fetchTaskFamilyFallback, fetchProjectsFallback, syncUsersPagination, syncTaskFallbackPagination, syncProjectFallbackPagination, showProjectNameInTaskRow, corUser, t]);
654
+
655
+ // Disparar search al cambiar debounced value
656
+ useEffect(function () {
657
+ var q = debouncedSearchValue.trim();
658
+ if (type === 'mcp') {
659
+ var _stableScope$mcpSlugs2;
660
+ var slugs = (_stableScope$mcpSlugs2 = stableScope.mcpSlugs) !== null && _stableScope$mcpSlugs2 !== void 0 ? _stableScope$mcpSlugs2 : [];
661
+ setLoading(false);
662
+ setError(false);
663
+ setItems(mapMcpSlugsToItems(slugs, q));
664
+ return;
665
+ }
666
+ if (!q) return;
667
+ if (type === 'client') {
668
+ fetchSearchClients({
669
+ variables: {
670
+ filter: {
671
+ name: q
672
+ },
673
+ page: 1,
674
+ perPage: 20
675
+ }
676
+ });
677
+ setActivePaginationSource('clients-search');
678
+ } else if (type === 'user') {
679
+ fetchUsersDirectory({
680
+ variables: {
681
+ filters: buildUsersDirectoryFilters(q),
682
+ page: 1
683
+ }
684
+ });
685
+ setActivePaginationSource('users');
686
+ } else {
687
+ var filters = buildFiltersForType(type);
688
+ var extra = buildSearchEntitiesExtra(type, stableScope);
689
+ fetchSearchEntities({
690
+ variables: _objectSpread({
691
+ q: q,
692
+ filters: filters
693
+ }, extra !== undefined ? {
694
+ extra: extra
695
+ } : {})
696
+ });
697
+ setActivePaginationSource('none');
698
+ setHasMore(false);
699
+ }
700
+ }, [debouncedSearchValue, type, stableScope, fetchSearchEntities, fetchSearchClients, fetchUsersDirectory]);
701
+
702
+ // Sincronizar resultados de search
703
+ useEffect(function () {
704
+ if (type === 'mcp') return;
705
+ var q = debouncedSearchValue.trim();
706
+ if (!q) return;
707
+ setHideRecentsLabel(false);
708
+ if (type === 'client') {
709
+ var _clientsData$clients;
710
+ setLoading(clientsLoading);
711
+ if (clientsError) {
712
+ setError(true);
713
+ return;
714
+ }
715
+ if (clientsData !== null && clientsData !== void 0 && (_clientsData$clients = clientsData.clients) !== null && _clientsData$clients !== void 0 && _clientsData$clients.data) {
716
+ setItems(clientsData.clients.data.map(function (c) {
717
+ return mapClientToItem(c, q);
718
+ }));
719
+ syncClientsPagination(clientsData);
720
+ setError(false);
721
+ }
722
+ } else if (type === 'user') {
723
+ var _usersData$usersDirec;
724
+ setLoading(usersLoading);
725
+ if (usersError) {
726
+ setError(true);
727
+ return;
728
+ }
729
+ if (usersData !== null && usersData !== void 0 && (_usersData$usersDirec = usersData.usersDirectory) !== null && _usersData$usersDirec !== void 0 && _usersData$usersDirec.data) {
730
+ var mapped = usersData.usersDirectory.data.map(function (u) {
731
+ return mapUserToItem(u, q);
732
+ });
733
+ var meId = String(corUser.id);
734
+ var hasMeInResults = mapped.some(function (item) {
735
+ return String(item.id) === meId;
736
+ });
737
+ var withoutMe = mapped.filter(function (item) {
738
+ return String(item.id) !== meId;
739
+ });
740
+ var meItem = mapCorUserToUserItem(corUser, q, t('contextMention.me'));
741
+ setItems(hasMeInResults ? [meItem].concat(_toConsumableArray(withoutMe)) : mapped);
742
+ syncUsersPagination(usersData);
743
+ setError(false);
744
+ }
745
+ } else {
746
+ setLoading(searchLoading);
747
+ if (searchError) {
748
+ setError(true);
749
+ return;
750
+ }
751
+ if (searchData !== null && searchData !== void 0 && searchData.search) {
752
+ setItems(searchData.search.map(function (r) {
753
+ return mapSearchToItem(r, type, q, showProjectNameInTaskRow);
754
+ }));
755
+ setHasMore(false);
756
+ setError(false);
757
+ }
758
+ }
759
+ }, [searchData, clientsData, usersData, searchLoading, clientsLoading, usersLoading, searchError, clientsError, usersError, debouncedSearchValue, type, syncClientsPagination, syncUsersPagination, showProjectNameInTaskRow, corUser, t]);
760
+ var loadMore = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
761
+ var safeCurrentPage, nextPage, q, _data$usersDirectory, _data$usersDirectory2, _data$usersDirectory$, _data$usersDirectory3, _data$usersDirectory$2, _data$usersDirectory4, _yield$fetchUsersDire2, data, nextItems, _data4$clients, _data4$clients2, _data4$clients$data$l, _data4$clients3, _data4$clients$data, _data4$clients4, _yield$fetchSearchCli, _data4, _nextItems, _data5$taskFamily, _data5$taskFamily2, _data5$taskFamily$dat, _data5$taskFamily3, _data5$taskFamily$dat2, _data5$taskFamily4, filter, _yield$fetchTaskFamil2, _data5, _nextItems2, _data6$projects, _data6$projects2, _data6$projects$data$, _data6$projects3, _data6$projects$data, _data6$projects4, argumentsFilter, _yield$fetchProjectsF2, _data6, _nextItems3, _t2;
762
+ return _regeneratorRuntime.wrap(function (_context2) {
763
+ while (1) switch (_context2.prev = _context2.next) {
764
+ case 0:
765
+ if (!(isLoadingMore || !hasMore || activePaginationSource === 'none')) {
766
+ _context2.next = 1;
767
+ break;
768
+ }
769
+ console.info('[useEntitySearch] loadMore skipped', {
770
+ isLoadingMore: isLoadingMore,
771
+ hasMore: hasMore,
772
+ activePaginationSource: activePaginationSource
773
+ });
774
+ return _context2.abrupt("return");
775
+ case 1:
776
+ safeCurrentPage = normalizePositiveInt(currentPage, 1);
777
+ nextPage = safeCurrentPage + 1;
778
+ q = debouncedSearchValue.trim();
779
+ console.info('[useEntitySearch] loadMore start', {
780
+ source: activePaginationSource,
781
+ currentPage: currentPage,
782
+ nextPage: nextPage,
783
+ query: q
784
+ });
785
+ setIsLoadingMore(true);
786
+ _context2.prev = 2;
787
+ if (!(activePaginationSource === 'users')) {
788
+ _context2.next = 4;
789
+ break;
790
+ }
791
+ _context2.next = 3;
792
+ return fetchUsersDirectory({
793
+ variables: {
794
+ filters: buildUsersDirectoryFilters(q),
795
+ page: nextPage
796
+ }
797
+ });
798
+ case 3:
799
+ _yield$fetchUsersDire2 = _context2.sent;
800
+ data = _yield$fetchUsersDire2.data;
801
+ console.info('[useEntitySearch] users loadMore response', {
802
+ page: data === null || data === void 0 || (_data$usersDirectory = data.usersDirectory) === null || _data$usersDirectory === void 0 ? void 0 : _data$usersDirectory.page,
803
+ lastPage: data === null || data === void 0 || (_data$usersDirectory2 = data.usersDirectory) === null || _data$usersDirectory2 === void 0 ? void 0 : _data$usersDirectory2.lastPage,
804
+ count: (_data$usersDirectory$ = data === null || data === void 0 || (_data$usersDirectory3 = data.usersDirectory) === null || _data$usersDirectory3 === void 0 || (_data$usersDirectory3 = _data$usersDirectory3.data) === null || _data$usersDirectory3 === void 0 ? void 0 : _data$usersDirectory3.length) !== null && _data$usersDirectory$ !== void 0 ? _data$usersDirectory$ : 0
805
+ });
806
+ nextItems = ((_data$usersDirectory$2 = data === null || data === void 0 || (_data$usersDirectory4 = data.usersDirectory) === null || _data$usersDirectory4 === void 0 ? void 0 : _data$usersDirectory4.data) !== null && _data$usersDirectory$2 !== void 0 ? _data$usersDirectory$2 : []).map(function (u) {
807
+ return mapUserToItem(u, q);
808
+ });
809
+ setItems(function (prev) {
810
+ if (!q) {
811
+ var _prev$;
812
+ var meItem = ((_prev$ = prev[0]) === null || _prev$ === void 0 ? void 0 : _prev$.type) === 'user' ? prev[0] : mapCorUserToUserItem(corUser, '', t('contextMention.me'));
813
+ var _existingIds = new Set(prev.map(function (item) {
814
+ return String(item.id);
815
+ }));
816
+ var _appended = nextItems.filter(function (item) {
817
+ return !_existingIds.has(String(item.id));
818
+ });
819
+ var withoutMe = prev.filter(function (item) {
820
+ return String(item.id) !== String(meItem.id);
821
+ });
822
+ return [meItem].concat(_toConsumableArray(withoutMe), _toConsumableArray(_appended));
823
+ }
824
+ var existingIds = new Set(prev.map(function (item) {
825
+ return "".concat(item.type, "-").concat(item.id);
826
+ }));
827
+ var appended = nextItems.filter(function (item) {
828
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
829
+ });
830
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
831
+ });
832
+ syncUsersPagination(data);
833
+ _context2.next = 10;
834
+ break;
835
+ case 4:
836
+ if (!(activePaginationSource === 'clients-search')) {
837
+ _context2.next = 6;
838
+ break;
839
+ }
840
+ _context2.next = 5;
841
+ return fetchSearchClients({
842
+ variables: {
843
+ filter: {
844
+ name: q
845
+ },
846
+ page: nextPage,
847
+ perPage: 20
848
+ }
849
+ });
850
+ case 5:
851
+ _yield$fetchSearchCli = _context2.sent;
852
+ _data4 = _yield$fetchSearchCli.data;
853
+ console.info('[useEntitySearch] clients loadMore response', {
854
+ page: _data4 === null || _data4 === void 0 || (_data4$clients = _data4.clients) === null || _data4$clients === void 0 ? void 0 : _data4$clients.page,
855
+ lastPage: _data4 === null || _data4 === void 0 || (_data4$clients2 = _data4.clients) === null || _data4$clients2 === void 0 ? void 0 : _data4$clients2.lastPage,
856
+ count: (_data4$clients$data$l = _data4 === null || _data4 === void 0 || (_data4$clients3 = _data4.clients) === null || _data4$clients3 === void 0 || (_data4$clients3 = _data4$clients3.data) === null || _data4$clients3 === void 0 ? void 0 : _data4$clients3.length) !== null && _data4$clients$data$l !== void 0 ? _data4$clients$data$l : 0
857
+ });
858
+ _nextItems = ((_data4$clients$data = _data4 === null || _data4 === void 0 || (_data4$clients4 = _data4.clients) === null || _data4$clients4 === void 0 ? void 0 : _data4$clients4.data) !== null && _data4$clients$data !== void 0 ? _data4$clients$data : []).map(function (c) {
859
+ return mapClientToItem(c, q);
860
+ });
861
+ setItems(function (prev) {
862
+ var existingIds = new Set(prev.map(function (item) {
863
+ return "".concat(item.type, "-").concat(item.id);
864
+ }));
865
+ var appended = _nextItems.filter(function (item) {
866
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
867
+ });
868
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
869
+ });
870
+ syncClientsPagination(_data4);
871
+ _context2.next = 10;
872
+ break;
873
+ case 6:
874
+ if (!(activePaginationSource === 'task-fallback')) {
875
+ _context2.next = 8;
876
+ break;
877
+ }
878
+ filter = {};
879
+ if (stableScope.projectId !== null && stableScope.projectId !== undefined && stableScope.projectId !== '') {
880
+ filter.projectIds = [String(stableScope.projectId)];
881
+ }
882
+ if (stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '') {
883
+ filter.clientIds = [String(stableScope.clientId)];
884
+ }
885
+ _context2.next = 7;
886
+ return fetchTaskFamilyFallback({
887
+ variables: {
888
+ filter: _objectSpread({
889
+ archived: false
890
+ }, filter),
891
+ pagination: {
892
+ offset: (nextPage - 1) * 20,
893
+ size: 20
894
+ }
895
+ }
896
+ });
897
+ case 7:
898
+ _yield$fetchTaskFamil2 = _context2.sent;
899
+ _data5 = _yield$fetchTaskFamil2.data;
900
+ console.info('[useEntitySearch] task fallback loadMore response', {
901
+ page: _data5 === null || _data5 === void 0 || (_data5$taskFamily = _data5.taskFamily) === null || _data5$taskFamily === void 0 ? void 0 : _data5$taskFamily.page,
902
+ lastPage: _data5 === null || _data5 === void 0 || (_data5$taskFamily2 = _data5.taskFamily) === null || _data5$taskFamily2 === void 0 ? void 0 : _data5$taskFamily2.lastPage,
903
+ count: (_data5$taskFamily$dat = _data5 === null || _data5 === void 0 || (_data5$taskFamily3 = _data5.taskFamily) === null || _data5$taskFamily3 === void 0 || (_data5$taskFamily3 = _data5$taskFamily3.data) === null || _data5$taskFamily3 === void 0 ? void 0 : _data5$taskFamily3.length) !== null && _data5$taskFamily$dat !== void 0 ? _data5$taskFamily$dat : 0
904
+ });
905
+ _nextItems2 = ((_data5$taskFamily$dat2 = _data5 === null || _data5 === void 0 || (_data5$taskFamily4 = _data5.taskFamily) === null || _data5$taskFamily4 === void 0 ? void 0 : _data5$taskFamily4.data) !== null && _data5$taskFamily$dat2 !== void 0 ? _data5$taskFamily$dat2 : []).map(normalizeTaskFamilyRecord).filter(function (item) {
906
+ return item !== null;
907
+ }).map(function (task) {
908
+ return mapRecentTaskToItem(task, '', showProjectNameInTaskRow);
909
+ });
910
+ setItems(function (prev) {
911
+ var existingIds = new Set(prev.map(function (item) {
912
+ return "".concat(item.type, "-").concat(item.id);
913
+ }));
914
+ var appended = _nextItems2.filter(function (item) {
915
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
916
+ });
917
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
918
+ });
919
+ syncTaskFallbackPagination(_data5);
920
+ _context2.next = 10;
921
+ break;
922
+ case 8:
923
+ if (!(activePaginationSource === 'project-fallback')) {
924
+ _context2.next = 10;
925
+ break;
926
+ }
927
+ argumentsFilter = stableScope.clientId !== null && stableScope.clientId !== undefined && stableScope.clientId !== '' ? {
928
+ client_id: [String(stableScope.clientId)]
929
+ } : undefined;
930
+ _context2.next = 9;
931
+ return fetchProjectsFallback({
932
+ variables: _objectSpread(_objectSpread({}, argumentsFilter ? {
933
+ arguments: argumentsFilter
934
+ } : {}), {}, {
935
+ page: nextPage,
936
+ perPage: 20
937
+ })
938
+ });
939
+ case 9:
940
+ _yield$fetchProjectsF2 = _context2.sent;
941
+ _data6 = _yield$fetchProjectsF2.data;
942
+ console.info('[useEntitySearch] project fallback loadMore response', {
943
+ page: _data6 === null || _data6 === void 0 || (_data6$projects = _data6.projects) === null || _data6$projects === void 0 ? void 0 : _data6$projects.page,
944
+ lastPage: _data6 === null || _data6 === void 0 || (_data6$projects2 = _data6.projects) === null || _data6$projects2 === void 0 ? void 0 : _data6$projects2.lastPage,
945
+ count: (_data6$projects$data$ = _data6 === null || _data6 === void 0 || (_data6$projects3 = _data6.projects) === null || _data6$projects3 === void 0 || (_data6$projects3 = _data6$projects3.data) === null || _data6$projects3 === void 0 ? void 0 : _data6$projects3.length) !== null && _data6$projects$data$ !== void 0 ? _data6$projects$data$ : 0
946
+ });
947
+ _nextItems3 = ((_data6$projects$data = _data6 === null || _data6 === void 0 || (_data6$projects4 = _data6.projects) === null || _data6$projects4 === void 0 ? void 0 : _data6$projects4.data) !== null && _data6$projects$data !== void 0 ? _data6$projects$data : []).map(normalizeProjectsFallbackRecord).filter(function (item) {
948
+ return item !== null;
949
+ }).map(function (item) {
950
+ return mapSearchToItem(item, 'project', '');
951
+ });
952
+ setItems(function (prev) {
953
+ var existingIds = new Set(prev.map(function (item) {
954
+ return "".concat(item.type, "-").concat(item.id);
955
+ }));
956
+ var appended = _nextItems3.filter(function (item) {
957
+ return !existingIds.has("".concat(item.type, "-").concat(item.id));
958
+ });
959
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(appended));
960
+ });
961
+ syncProjectFallbackPagination(_data6);
962
+ case 10:
963
+ _context2.next = 12;
964
+ break;
965
+ case 11:
966
+ _context2.prev = 11;
967
+ _t2 = _context2["catch"](2);
968
+ console.error('[useEntitySearch] loadMore failed', {
969
+ source: activePaginationSource,
970
+ nextPage: nextPage,
971
+ error: _t2
972
+ });
973
+ // Evita loop de reintentos automáticos por scroll cuando backend está caído (ej. 503).
974
+ setError(true);
975
+ setHasMore(false);
976
+ case 12:
977
+ _context2.prev = 12;
978
+ setIsLoadingMore(false);
979
+ console.info('[useEntitySearch] loadMore finished', {
980
+ source: activePaginationSource,
981
+ nextPage: nextPage
982
+ });
983
+ return _context2.finish(12);
984
+ case 13:
985
+ case "end":
986
+ return _context2.stop();
987
+ }
988
+ }, _callee2, null, [[2, 11, 12, 13]]);
989
+ })), [isLoadingMore, hasMore, currentPage, activePaginationSource, debouncedSearchValue, fetchUsersDirectory, fetchSearchClients, fetchTaskFamilyFallback, fetchProjectsFallback, stableScope.projectId, stableScope.clientId, showProjectNameInTaskRow, corUser, t, syncClientsPagination, syncUsersPagination, syncTaskFallbackPagination, syncProjectFallbackPagination]);
990
+
991
+ // Cuando se limpia el search, volver a recents
992
+ useEffect(function () {
993
+ if (!debouncedSearchValue.trim()) {
994
+ fetchRecent();
995
+ }
996
+ }, [debouncedSearchValue, fetchRecent]);
997
+ return {
998
+ items: items,
999
+ loading: loading,
1000
+ error: error,
1001
+ hideRecentsLabel: hideRecentsLabel,
1002
+ hasMore: hasMore,
1003
+ isLoadingMore: isLoadingMore,
1004
+ loadMore: loadMore,
1005
+ searchValue: searchValue,
1006
+ updateSearchValue: setSearchValue,
1007
+ fetchRecent: fetchRecent
1008
+ };
1009
+ };
1010
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VMYXp5UXVlcnkiLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsImdldFJlY2VudENsaWVudHMiLCJnZXRSZWNlbnRQcm9qZWN0cyIsImdldFJlY2VudFRhc2tzIiwidXNlVXNlciIsIlBST0pFQ1RTX0ZBTExCQUNLIiwiU0VBUkNIX0VOVElUSUVTIiwiVEFTS19GQU1JTFlfRkFMTEJBQ0siLCJTRUFSQ0hfQ0xJRU5UUyIsIlVTRVJTX0RJUkVDVE9SWSIsIlNFQVJDSF9RVUVSWV9ERUJPVU5DRV9NUyIsInVzZURlYm91bmNlIiwidXNlVCIsIm5vcm1hbGl6ZVBvc2l0aXZlSW50IiwidmFsdWUiLCJmYWxsYmFjayIsInBhcnNlZCIsIk51bWJlciIsImlzRmluaXRlIiwibm9ybWFsaXplZCIsIk1hdGgiLCJmbG9vciIsIkJBU0VfRklMVEVSU19CWV9UWVBFIiwicHJvamVjdCIsImFyY2hpdmVkIiwidGFzayIsImJ1aWxkVGFza1NlYXJjaEV4dHJhRW50cmllcyIsInNjb3BlIiwicmF3Q2xpZW50IiwiY2xpZW50SWQiLCJ1bmRlZmluZWQiLCJTdHJpbmciLCJyYXdQcm9qZWN0IiwicHJvamVjdElkIiwiYWdlbnRFbnRpdHkiLCJlbnRyaWVzIiwicHVzaENsaWVudCIsInB1c2giLCJwdXNoUHJvamVjdCIsImJ1aWxkVGFza1NlYXJjaEV4dHJhIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsImJ1aWxkUHJvamVjdFNlYXJjaEV4dHJhIiwiYnVpbGRTZWFyY2hFbnRpdGllc0V4dHJhIiwidHlwZSIsImJ1aWxkRmlsdGVyc0ZvclR5cGUiLCJidWlsZFVzZXJzRGlyZWN0b3J5RmlsdGVycyIsInEiLCJiYXNlIiwid2l0aFBvc2l0aW9uIiwid2l0aFRlYW1zIiwidHJpbW1lZFEiLCJ0cmltIiwic2VhcmNoSW5wdXQiLCJoaWdobGlnaHRSYW5nZSIsInRleHQiLCJzZWFyY2hWYWx1ZSIsImlkeCIsInRvTG93ZXJDYXNlIiwiaW5kZXhPZiIsInN0YXJ0IiwiZmlyc3REZWZpbmVkIiwiX2xlbiIsImFyZ3VtZW50cyIsInZhbHVlcyIsIkFycmF5IiwiX2tleSIsImZpbmQiLCJtYXBDbGllbnRUb0l0ZW0iLCJjIiwiX2MkdG90YWxQcm95ZWN0b3MiLCJfYyR0b3RhbFByb3llY3RvczIiLCJpZCIsInByaW1hcnkiLCJuYW1lIiwicHJpbWFyeUhpZ2hsaWdodCIsImJyZWFkY3J1bWIiLCJjb3VudCIsInRvdGFsUHJveWVjdG9zIiwiY291bnRMYWJlbCIsInJhdyIsIm1hcFVzZXJUb0l0ZW0iLCJ1IiwiX3UkZmlyc3ROYW1lIiwiX3UkbGFzdE5hbWUiLCJfdSRwaWN0dXJlIiwiX3UkcG9zaXRpb25OYW1lIiwiX3UkZW1haWwiLCJmdWxsTmFtZSIsImNvbmNhdCIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiZW1haWwiLCJwaWN0dXJlIiwicG9zaXRpb25OYW1lIiwibWFwQ29yVXNlclRvVXNlckl0ZW0iLCJ1c2VyIiwibWVMYWJlbCIsIl91c2VyJGZpcnN0TmFtZSIsIl91c2VyJGxhc3ROYW1lIiwiX3VzZXIkdXNlcl9wb3NpdGlvbiIsIl91c2VyJGVtYWlsIiwicG9zaXRpb25MaW5lIiwidXNlcl9wb3NpdGlvbiIsIm1hcFJlY2VudFRhc2tUb0l0ZW0iLCJfdGFzayRwcm9qZWN0TmFtZSIsInNob3dQcm9qZWN0TmFtZUluVGFza1JvdyIsInRpdGxlIiwicHJvamVjdE5hbWUiLCJwYXJlbnQiLCJub3JtYWxpemVUYXNrRmFtaWx5UmVjb3JkIiwicmVjb3JkIiwiX3JlY29yZCR0aXRsZSIsIl9maXJzdERlZmluZWQiLCJfcmVjb3JkJHByb2plY3QiLCJfcmVjb3JkJGZhdGhlciIsIl9yZWNvcmQkZmF0aGVyMiIsInRhc2tGYW1pbHlJZCIsIl9pZCIsImZhdGhlciIsImhhc0ZhdGhlciIsInRhc2tGYXRoZXIiLCJub3JtYWxpemVQcm9qZWN0c0ZhbGxiYWNrUmVjb3JkIiwiX3JlY29yZCRuYW1lIiwiX2ZpcnN0RGVmaW5lZDIiLCJfcmVjb3JkJGNsaWVudCIsIl9yZWNvcmQkY2xpZW50JG5hbWUiLCJfcmVjb3JkJGNsaWVudDIiLCJjbGllbnQiLCJjbGllbnROYW1lIiwibWFwU2VhcmNoVG9JdGVtIiwiciIsIl9yJHByb2plY3ROYW1lIiwiX3IkcHJvamVjdE5hbWUyIiwiX3IkY2xpZW50SWQiLCJfciRjbGllbnROYW1lIiwiX3IkZmVlSWQiLCJfZmF0aGVyJHRpdGxlIiwidGFza1Byb2plY3ROYW1lIiwiZmVlSWQiLCJmYXRoZXJJZCIsImZhdGhlclRpdGxlIiwiZm9ybWF0TWNwUHJpbWFyeUxhYmVsIiwic2x1ZyIsInJlcGxhY2UiLCJjaGFyIiwidG9VcHBlckNhc2UiLCJtYXBNY3BTbHVnc1RvSXRlbXMiLCJzbHVncyIsImZpbHRlcmVkIiwiZmlsdGVyIiwicyIsImluY2x1ZGVzIiwibWFwIiwidXNlRW50aXR5U2VhcmNoIiwiX3Njb3BlJG1jcFNsdWdzIiwiY29yVXNlciIsIl91c2VUIiwidCIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInNldFNlYXJjaFZhbHVlIiwiZGVib3VuY2VkU2VhcmNoVmFsdWUiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsIml0ZW1zIiwic2V0SXRlbXMiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJlcnJvciIsInNldEVycm9yIiwiX3VzZVN0YXRlOSIsIl91c2VTdGF0ZTAiLCJoaWRlUmVjZW50c0xhYmVsIiwic2V0SGlkZVJlY2VudHNMYWJlbCIsIl91c2VTdGF0ZTEiLCJfdXNlU3RhdGUxMCIsImhhc01vcmUiLCJzZXRIYXNNb3JlIiwiX3VzZVN0YXRlMTEiLCJfdXNlU3RhdGUxMiIsImlzTG9hZGluZ01vcmUiLCJzZXRJc0xvYWRpbmdNb3JlIiwiX3VzZVN0YXRlMTMiLCJfdXNlU3RhdGUxNCIsImN1cnJlbnRQYWdlIiwic2V0Q3VycmVudFBhZ2UiLCJfdXNlU3RhdGUxNSIsIl91c2VTdGF0ZTE2IiwiYWN0aXZlUGFnaW5hdGlvblNvdXJjZSIsInNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UiLCJtY3BTbHVnc0tleSIsIm1jcFNsdWdzIiwiam9pbiIsInN0YWJsZVNjb3BlIiwiX3Njb3BlJGNsaWVudElkIiwiX3Njb3BlJHByb2plY3RJZCIsIl9zY29wZSRtY3BTbHVnczIiLCJfc2NvcGUkYWdlbnRFbnRpdHkiLCJfdXNlTGF6eVF1ZXJ5IiwidmFyaWFibGVzIiwibGltaXQiLCJmZXRjaFBvbGljeSIsIl91c2VMYXp5UXVlcnkyIiwiZmV0Y2hTZWFyY2hFbnRpdGllcyIsIl91c2VMYXp5UXVlcnkyJCIsInNlYXJjaERhdGEiLCJkYXRhIiwic2VhcmNoTG9hZGluZyIsInNlYXJjaEVycm9yIiwiX3VzZUxhenlRdWVyeTMiLCJfdXNlTGF6eVF1ZXJ5NCIsImZldGNoU2VhcmNoQ2xpZW50cyIsIl91c2VMYXp5UXVlcnk0JCIsImNsaWVudHNEYXRhIiwiY2xpZW50c0xvYWRpbmciLCJjbGllbnRzRXJyb3IiLCJfdXNlTGF6eVF1ZXJ5NSIsIl91c2VMYXp5UXVlcnk2IiwiZmV0Y2hVc2Vyc0RpcmVjdG9yeSIsIl91c2VMYXp5UXVlcnk2JCIsInVzZXJzRGF0YSIsInVzZXJzTG9hZGluZyIsInVzZXJzRXJyb3IiLCJzeW5jVXNlcnNQYWdpbmF0aW9uIiwicGF5bG9hZCIsIl9wYXlsb2FkJHVzZXJzRGlyZWN0byIsIl9wYXlsb2FkJHVzZXJzRGlyZWN0bzIiLCJwYWdlIiwidXNlcnNEaXJlY3RvcnkiLCJsYXN0UGFnZSIsInN5bmNDbGllbnRzUGFnaW5hdGlvbiIsIl9wYXlsb2FkJGNsaWVudHMiLCJfcGF5bG9hZCRjbGllbnRzMiIsImNsaWVudHMiLCJzeW5jVGFza0ZhbGxiYWNrUGFnaW5hdGlvbiIsIl9wYXlsb2FkJHRhc2tGYW1pbHkiLCJfcGF5bG9hZCR0YXNrRmFtaWx5MiIsInJhd1BhZ2UiLCJ0YXNrRmFtaWx5Iiwic3luY1Byb2plY3RGYWxsYmFja1BhZ2luYXRpb24iLCJfcGF5bG9hZCRwcm9qZWN0cyIsIl9wYXlsb2FkJHByb2plY3RzMiIsInByb2plY3RzIiwiX3VzZUxhenlRdWVyeTciLCJfdXNlTGF6eVF1ZXJ5OCIsImZldGNoVGFza0ZhbWlseUZhbGxiYWNrIiwiX3VzZUxhenlRdWVyeTkiLCJfdXNlTGF6eVF1ZXJ5MCIsImZldGNoUHJvamVjdHNGYWxsYmFjayIsImZldGNoUmVjZW50IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJfc3RhYmxlU2NvcGUkbWNwU2x1Z3MiLCJtYXBwZWQiLCJfZGF0YSIsIl9tYXBwZWQiLCJfZmFsbGJhY2tEYXRhJHByb2plY3QiLCJfZmFsbGJhY2tEYXRhJHByb2plY3QyIiwiYXJndW1lbnRzRmlsdGVyIiwiX3lpZWxkJGZldGNoUHJvamVjdHNGIiwiZmFsbGJhY2tEYXRhIiwiZmFsbGJhY2tNYXBwZWQiLCJyZWNlbnRUYXNrRmlsdGVycyIsIl9kYXRhMiIsInRhc2tJdGVtcyIsIl9mYWxsYmFja0RhdGEkdGFza0ZhbSIsIl9mYWxsYmFja0RhdGEkdGFza0ZhbTIiLCJfeWllbGQkZmV0Y2hUYXNrRmFtaWwiLCJfZmFsbGJhY2tEYXRhIiwiX2RhdGEzJHVzZXJzRGlyZWN0b3J5IiwiX2RhdGEzJHVzZXJzRGlyZWN0b3J5MiIsIl95aWVsZCRmZXRjaFVzZXJzRGlyZSIsIl9kYXRhMyIsIl9tYXBwZWQyIiwibWVJdGVtIiwid2l0aG91dE1lIiwiX3QiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImFicnVwdCIsInNlbnQiLCJpc0FycmF5IiwicCIsImNsaWVudF9pZCIsIl9vYmplY3RTcHJlYWQiLCJwZXJQYWdlIiwiaXRlbSIsInByb2plY3RJZHMiLCJjbGllbnRJZHMiLCJwYWdpbmF0aW9uIiwib2Zmc2V0Iiwic2l6ZSIsImZpbHRlcnMiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJmaW5pc2giLCJzdG9wIiwiX3N0YWJsZVNjb3BlJG1jcFNsdWdzMiIsImV4dHJhIiwiX2NsaWVudHNEYXRhJGNsaWVudHMiLCJfdXNlcnNEYXRhJHVzZXJzRGlyZWMiLCJtZUlkIiwiaGFzTWVJblJlc3VsdHMiLCJzb21lIiwic2VhcmNoIiwibG9hZE1vcmUiLCJfY2FsbGVlMiIsInNhZmVDdXJyZW50UGFnZSIsIm5leHRQYWdlIiwiX2RhdGEkdXNlcnNEaXJlY3RvcnkiLCJfZGF0YSR1c2Vyc0RpcmVjdG9yeTIiLCJfZGF0YSR1c2Vyc0RpcmVjdG9yeSQiLCJfZGF0YSR1c2Vyc0RpcmVjdG9yeTMiLCJfZGF0YSR1c2Vyc0RpcmVjdG9yeSQyIiwiX2RhdGEkdXNlcnNEaXJlY3Rvcnk0IiwiX3lpZWxkJGZldGNoVXNlcnNEaXJlMiIsIm5leHRJdGVtcyIsIl9kYXRhNCRjbGllbnRzIiwiX2RhdGE0JGNsaWVudHMyIiwiX2RhdGE0JGNsaWVudHMkZGF0YSRsIiwiX2RhdGE0JGNsaWVudHMzIiwiX2RhdGE0JGNsaWVudHMkZGF0YSIsIl9kYXRhNCRjbGllbnRzNCIsIl95aWVsZCRmZXRjaFNlYXJjaENsaSIsIl9kYXRhNCIsIl9uZXh0SXRlbXMiLCJfZGF0YTUkdGFza0ZhbWlseSIsIl9kYXRhNSR0YXNrRmFtaWx5MiIsIl9kYXRhNSR0YXNrRmFtaWx5JGRhdCIsIl9kYXRhNSR0YXNrRmFtaWx5MyIsIl9kYXRhNSR0YXNrRmFtaWx5JGRhdDIiLCJfZGF0YTUkdGFza0ZhbWlseTQiLCJfeWllbGQkZmV0Y2hUYXNrRmFtaWwyIiwiX2RhdGE1IiwiX25leHRJdGVtczIiLCJfZGF0YTYkcHJvamVjdHMiLCJfZGF0YTYkcHJvamVjdHMyIiwiX2RhdGE2JHByb2plY3RzJGRhdGEkIiwiX2RhdGE2JHByb2plY3RzMyIsIl9kYXRhNiRwcm9qZWN0cyRkYXRhIiwiX2RhdGE2JHByb2plY3RzNCIsIl95aWVsZCRmZXRjaFByb2plY3RzRjIiLCJfZGF0YTYiLCJfbmV4dEl0ZW1zMyIsIl90MiIsIl9jb250ZXh0MiIsImNvbnNvbGUiLCJpbmZvIiwic291cmNlIiwicXVlcnkiLCJfcHJldiQiLCJleGlzdGluZ0lkcyIsIlNldCIsImFwcGVuZGVkIiwiaGFzIiwidXBkYXRlU2VhcmNoVmFsdWUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvdXNlRW50aXR5U2VhcmNoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUxhenlRdWVyeSB9IGZyb20gJ0BhcG9sbG8vY2xpZW50J1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGdldFJlY2VudENsaWVudHMgfSBmcm9tICcuLi9zZXJ2aWNlcy9tYWlhL1JlY2VudENsaWVudHMvZ2V0UmVjZW50Q2xpZW50cydcbmltcG9ydCB7IGdldFJlY2VudFByb2plY3RzIH0gZnJvbSAnLi4vc2VydmljZXMvbWFpYS9SZWNlbnRQcm9qZWN0cy9nZXRSZWNlbnRQcm9qZWN0cydcbmltcG9ydCB7IGdldFJlY2VudFRhc2tzIH0gZnJvbSAnLi4vc2VydmljZXMvbWFpYS9SZWNlbnRUYXNrcy9nZXRSZWNlbnRUYXNrcydcbmltcG9ydCB0eXBlIHsgUmVjZW50VGFza0l0ZW0gfSBmcm9tICcuLi9zZXJ2aWNlcy9tYWlhL1JlY2VudFRhc2tzL2dldFJlY2VudFRhc2tzJ1xuaW1wb3J0IHsgdXNlVXNlciB9IGZyb20gJy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyBQUk9KRUNUU19GQUxMQkFDSywgU0VBUkNIX0VOVElUSUVTLCBUQVNLX0ZBTUlMWV9GQUxMQkFDSyB9IGZyb20gJy4uL3NlcnZpY2VzL3F1ZXJ5L2VudGl0eVNlYXJjaFF1ZXJ5J1xuaW1wb3J0IHsgU0VBUkNIX0NMSUVOVFMgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWVyeS9DbGllbnRTZWFyY2hRdWVyeSdcbmltcG9ydCB7IFVTRVJTX0RJUkVDVE9SWSB9IGZyb20gJy4uL3NlcnZpY2VzL3F1ZXJ5L3VzZXJzRGlyZWN0b3J5UXVlcnknXG5pbXBvcnQgeyBTRUFSQ0hfUVVFUllfREVCT1VOQ0VfTVMgfSBmcm9tICcuLi9jb25zdGFudHMvY29uZmlnJ1xuaW1wb3J0IHsgdXNlRGVib3VuY2UgfSBmcm9tICcuL3VzZURlYm91bmNlJ1xuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4vdXNlVCdcbmltcG9ydCB7IENvbnRleHRFbnRpdHlUeXBlLCBDb250ZXh0TWVudGlvbkl0ZW0gfSBmcm9tICcuLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB0eXBlIHsgQWdlbnRFbnRpdHkgfSBmcm9tICcuLi90eXBlcy9hZ2VudCdcblxudHlwZSBSYXdTZWFyY2hSZXN1bHQgPSB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgdGl0bGU6IHN0cmluZ1xuICB0eXBlPzogc3RyaW5nXG4gIGNsaWVudElkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbFxuICBmZWVJZD86IG51bWJlciB8IHN0cmluZyB8IG51bGxcbiAgY2xpZW50TmFtZT86IHN0cmluZyB8IG51bGxcbiAgcHJvamVjdE5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIGZhdGhlcj86IHsgaWQ6IHN0cmluZyB8IG51bWJlcjsgdGl0bGU/OiBzdHJpbmcgfCBudWxsIH0gfCBudWxsXG59XG5cbnR5cGUgUmF3Q2xpZW50ID0ge1xuICBpZDogbnVtYmVyIHwgc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICB0b3RhbFByb3llY3Rvcz86IG51bWJlciB8IG51bGxcbn1cblxudHlwZSBSYXdEaXJlY3RvcnlVc2VyID0ge1xuICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gIGZpcnN0TmFtZT86IHN0cmluZyB8IG51bGxcbiAgbGFzdE5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIGVtYWlsPzogc3RyaW5nIHwgbnVsbFxuICBwaWN0dXJlPzogc3RyaW5nIHwgbnVsbFxuICBwb3NpdGlvbk5hbWU/OiBzdHJpbmcgfCBudWxsXG59XG5cbnR5cGUgU2VhcmNoRW50aXRpZXNEYXRhID0geyBzZWFyY2g6IFJhd1NlYXJjaFJlc3VsdFtdIHwgbnVsbCB9XG50eXBlIFNlYXJjaENsaWVudHNEYXRhID0ge1xuICBjbGllbnRzOiB7XG4gICAgdG90YWw/OiBudW1iZXIgfCBudWxsXG4gICAgcGVyUGFnZT86IG51bWJlciB8IG51bGxcbiAgICBwYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGxhc3RQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGRhdGE6IFJhd0NsaWVudFtdXG4gIH0gfCBudWxsXG59XG50eXBlIFVzZXJzRGlyZWN0b3J5RGF0YSA9IHtcbiAgdXNlcnNEaXJlY3Rvcnk6IHtcbiAgICB0b3RhbD86IG51bWJlciB8IG51bGxcbiAgICBwZXJQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIHBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgbGFzdFBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgZGF0YTogUmF3RGlyZWN0b3J5VXNlcltdIHwgbnVsbFxuICB9IHwgbnVsbFxufVxuXG50eXBlIFRhc2tGYW1pbHlSZWNvcmQgPSB7XG4gIF9pZD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgdGl0bGU/OiBzdHJpbmcgfCBudWxsXG4gIHByb2plY3RJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgdGFza0ZhdGhlcj86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgZmF0aGVyPzogeyBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGw7IHRpdGxlPzogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbFxuICBwcm9qZWN0PzogeyBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGw7IG5hbWU/OiBzdHJpbmcgfCBudWxsIH0gfCBudWxsXG59XG5cbnR5cGUgVGFza0ZhbWlseURhdGEgPSB7XG4gIHRhc2tGYW1pbHk/OiB7XG4gICAgdG90YWw/OiBudW1iZXIgfCBudWxsXG4gICAgcGVyUGFnZT86IG51bWJlciB8IG51bGxcbiAgICBwYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGxhc3RQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIGRhdGE/OiBUYXNrRmFtaWx5UmVjb3JkW10gfCBudWxsXG4gIH0gfCBudWxsXG59XG5cbnR5cGUgRmFsbGJhY2tQcm9qZWN0UmVjb3JkID0ge1xuICBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgbmFtZT86IHN0cmluZyB8IG51bGxcbiAgY2xpZW50SWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIGNsaWVudD86IHsgaWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsOyBuYW1lPzogc3RyaW5nIHwgbnVsbCB9IHwgbnVsbFxufVxuXG50eXBlIFByb2plY3RzRmFsbGJhY2tEYXRhID0ge1xuICBwcm9qZWN0cz86IHtcbiAgICB0b3RhbD86IG51bWJlciB8IG51bGxcbiAgICBwZXJQYWdlPzogbnVtYmVyIHwgbnVsbFxuICAgIHBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgbGFzdFBhZ2U/OiBudW1iZXIgfCBudWxsXG4gICAgZGF0YT86IEZhbGxiYWNrUHJvamVjdFJlY29yZFtdIHwgbnVsbFxuICB9IHwgbnVsbFxufVxuXG50eXBlIFBhZ2luYXRpb25Tb3VyY2UgPSAnbm9uZScgfCAndXNlcnMnIHwgJ2NsaWVudHMtc2VhcmNoJyB8ICd0YXNrLWZhbGxiYWNrJyB8ICdwcm9qZWN0LWZhbGxiYWNrJ1xuXG5jb25zdCBub3JtYWxpemVQb3NpdGl2ZUludCA9ICh2YWx1ZTogdW5rbm93biwgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSlcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSkgcmV0dXJuIGZhbGxiYWNrXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBNYXRoLmZsb29yKHBhcnNlZClcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgPiAwID8gbm9ybWFsaXplZCA6IGZhbGxiYWNrXG59XG5cbi8qKlxuICogUmVzdHJpbmdlIGxvcyByZXN1bHRhZG9zIGFsIGBjbGllbnRJZGAvYHByb2plY3RJZGAgZGVsIGFnZW50ZSBhY3Rpdm8uXG4gKiBDdWFuZG8gZWwgYWdlbnRlIGVzdMOhIHNjb3BlYWRvIGEgdW4gY2xpZW50L3Byb2plY3QsIHRhbnRvIGxvcyByZWNlbnRzIGNvbW9cbiAqIGVsIHNlYXJjaCBkZWJlbiBmaWx0cmFyIHBvciBlc2UgY29udGV4dG8uIFNpIGVsIGJhY2tlbmQgbm8gZW50aWVuZGUgYWxnw7puXG4gKiBjYW1wbyBsbyBpZ25vcmEgeSBzZSBjYWUgYWwgY29tcG9ydGFtaWVudG8gZ2xvYmFsLlxuICovXG5leHBvcnQgdHlwZSBFbnRpdHlTZWFyY2hTY29wZSA9IHtcbiAgY2xpZW50SWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIHByb2plY3RJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgLyoqIFNsdWdzIGRlbCBjb25lY3RvciBNQ1AgZGVsIGFnZW50ZSAobGlzdGFkbyBsb2NhbCwgc2luIEdyYXBoUUwpLiAqL1xuICBtY3BTbHVncz86IHN0cmluZ1tdXG4gIC8qKlxuICAgKiBgZW50aXR5YCBkZWwgYWdlbnRlIGFjdGl2by4gUGFyYSBlc3BlY2lhbGlzdGFzOlxuICAgKiAtIGBwcm9qZWN0YDogYsO6c3F1ZWRhIGRlIHRhcmVhcyBmdWVyemEgZmlsdHJvIHBvciBgcHJvamVjdElkYCBkZWwgY29udGV4dG8uXG4gICAqIC0gYGNsaWVudGA6IGLDunNxdWVkYSBkZSBwcm95ZWN0b3MgcG9yIGBjbGllbnRJZGA7IHRhcmVhcyBwb3IgY2xpZW50ZSAoeSBwcm95ZWN0byBzaSBhcGxpY2EpLlxuICAgKi9cbiAgYWdlbnRFbnRpdHk/OiBBZ2VudEVudGl0eSB8IG51bGxcbn1cblxudHlwZSBTZWFyY2hGaWx0ZXJhYmxlVHlwZSA9ICdwcm9qZWN0JyB8ICd0YXNrJ1xuXG5jb25zdCBCQVNFX0ZJTFRFUlNfQllfVFlQRTogUmVjb3JkPFNlYXJjaEZpbHRlcmFibGVUeXBlLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgcHJvamVjdDogeyBwcm9qZWN0OiAndHJ1ZScsIGFyY2hpdmVkOiAnYWxsJyB9LFxuICB0YXNrOiB7IHRhc2s6ICd0cnVlJywgYXJjaGl2ZWQ6ICdmYWxzZScgfSxcbn1cblxuLyoqXG4gKiBFbnRyYWRhcyBwYXJhIGVsIGFyZ3VtZW50byBHcmFwaFFMIGBleHRyYWAgKEpTT04gc3RyaW5nIGRlIGFycmF5KSBhbCBidXNjYXIgdGFyZWFzIGNvbiBjb250ZXh0by5cbiAqIEVqLjogW3tcInByb2plY3RJZFwiOlwiODgxNTUyXCJ9XVxuICovXG5jb25zdCBidWlsZFRhc2tTZWFyY2hFeHRyYUVudHJpZXMgPSAoc2NvcGU/OiBFbnRpdHlTZWFyY2hTY29wZSk6IEFycmF5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+IHtcbiAgY29uc3QgcmF3Q2xpZW50ID1cbiAgICBzY29wZT8uY2xpZW50SWQgIT09IHVuZGVmaW5lZCAmJiBzY29wZT8uY2xpZW50SWQgIT09IG51bGwgJiYgc2NvcGU/LmNsaWVudElkICE9PSAnJyA/IFN0cmluZyhzY29wZS5jbGllbnRJZCkgOiBudWxsXG4gIGNvbnN0IHJhd1Byb2plY3QgPVxuICAgIHNjb3BlPy5wcm9qZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBzY29wZT8ucHJvamVjdElkICE9PSBudWxsICYmIHNjb3BlPy5wcm9qZWN0SWQgIT09ICcnXG4gICAgICA/IFN0cmluZyhzY29wZS5wcm9qZWN0SWQpXG4gICAgICA6IG51bGxcblxuICBjb25zdCBhZ2VudEVudGl0eSA9IHNjb3BlPy5hZ2VudEVudGl0eVxuICBjb25zdCBlbnRyaWVzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IFtdXG5cbiAgY29uc3QgcHVzaENsaWVudCA9ICgpID0+IHtcbiAgICBpZiAocmF3Q2xpZW50KSBlbnRyaWVzLnB1c2goeyBjbGllbnRJZDogcmF3Q2xpZW50IH0pXG4gIH1cbiAgY29uc3QgcHVzaFByb2plY3QgPSAoKSA9PiB7XG4gICAgaWYgKHJhd1Byb2plY3QpIGVudHJpZXMucHVzaCh7IHByb2plY3RJZDogcmF3UHJvamVjdCB9KVxuICB9XG5cbiAgaWYgKGFnZW50RW50aXR5ID09PSAncHJvamVjdCcpIHtcbiAgICBpZiAocmF3UHJvamVjdCkge1xuICAgICAgcHVzaFByb2plY3QoKVxuICAgIH0gZWxzZSBpZiAocmF3Q2xpZW50KSB7XG4gICAgICBwdXNoQ2xpZW50KClcbiAgICB9XG4gIH0gZWxzZSBpZiAoYWdlbnRFbnRpdHkgPT09ICdjbGllbnQnKSB7XG4gICAgcHVzaENsaWVudCgpXG4gICAgcHVzaFByb2plY3QoKVxuICB9IGVsc2Uge1xuICAgIHB1c2hDbGllbnQoKVxuICAgIHB1c2hQcm9qZWN0KClcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzXG59XG5cbmNvbnN0IGJ1aWxkVGFza1NlYXJjaEV4dHJhID0gKHNjb3BlPzogRW50aXR5U2VhcmNoU2NvcGUpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBlbnRyaWVzID0gYnVpbGRUYXNrU2VhcmNoRXh0cmFFbnRyaWVzKHNjb3BlKVxuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVudHJpZXMpXG59XG5cbi8qKlxuICogVGFiIHByb3llY3RvOiBjb24gYGNsaWVudElkYCBlbiBlbCBzY29wZSwgYGV4dHJhYCBhY290YSBsYSBiw7pzcXVlZGEgYSBwcm95ZWN0b3MgZGUgZXNlIGNsaWVudGUuXG4gKiBFai46IGBbe1wiY2xpZW50SWRcIjpcIjQ3MTA1XCJ9XWAganVudG8gYSBgZmlsdGVyc2AgYHtcInByb2plY3RcIjpcInRydWVcIixcImFyY2hpdmVkXCI6XCJhbGxcIn1gLlxuICovXG5jb25zdCBidWlsZFByb2plY3RTZWFyY2hFeHRyYSA9IChzY29wZT86IEVudGl0eVNlYXJjaFNjb3BlKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgcmF3Q2xpZW50ID1cbiAgICBzY29wZT8uY2xpZW50SWQgIT09IHVuZGVmaW5lZCAmJiBzY29wZT8uY2xpZW50SWQgIT09IG51bGwgJiYgc2NvcGU/LmNsaWVudElkICE9PSAnJyA/IFN0cmluZyhzY29wZS5jbGllbnRJZCkgOiBudWxsXG4gIGlmICghcmF3Q2xpZW50KSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbeyBjbGllbnRJZDogcmF3Q2xpZW50IH1dKVxufVxuXG5jb25zdCBidWlsZFNlYXJjaEVudGl0aWVzRXh0cmEgPSAodHlwZTogU2VhcmNoRmlsdGVyYWJsZVR5cGUsIHNjb3BlPzogRW50aXR5U2VhcmNoU2NvcGUpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodHlwZSA9PT0gJ3Rhc2snKSByZXR1cm4gYnVpbGRUYXNrU2VhcmNoRXh0cmEoc2NvcGUpXG4gIGlmICh0eXBlID09PSAncHJvamVjdCcpIHJldHVybiBidWlsZFByb2plY3RTZWFyY2hFeHRyYShzY29wZSlcbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIFRhYiBgdGFza2AgLyBgcHJvamVjdGA6IGBmaWx0ZXJzYCBzw7NsbyB0aXBvICsgYXJjaGl2ZWQgKHRhcmVhczogbm8gYXJjaGl2YWRhcyk7IHNjb3BlIChjbGllbnRJZCAvIHByb2plY3RJZCBlbiB0YXJlYXMpIGVuIGBleHRyYWAuXG4gKi9cbmNvbnN0IGJ1aWxkRmlsdGVyc0ZvclR5cGUgPSAodHlwZTogU2VhcmNoRmlsdGVyYWJsZVR5cGUpOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZSA9PT0gJ3Byb2plY3QnKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KEJBU0VfRklMVEVSU19CWV9UWVBFLnByb2plY3QpXG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KEJBU0VfRklMVEVSU19CWV9UWVBFLnRhc2spXG59XG5cbi8qKlxuICogRmlsdHJvcyBwYXJhIHVzZXJzRGlyZWN0b3J5LiBFbCBiYWNrZW5kIGVzcGVyYSB1biBKU09OIHN0cmluZyBjb25cbiAqIHdpdGhQb3NpdGlvbiwgd2l0aFRlYW1zIHkgc2VhcmNoSW5wdXQuIExlIGFncmVnYW1vcyBjbGllbnRJZC9wcm9qZWN0SWRcbiAqIGRlbCBzY29wZSBlbiBjYXNvIGRlIHF1ZSBlbCBiYWNrZW5kIGxvcyBhcHJvdmVjaGUgcGFyYSBmaWx0cmFyIHBvclxuICogY29udGV4dG8gKHNpIG5vIGxvcyBlbnRpZW5kZSBsb3MgaWdub3JhKS5cbiAqL1xuY29uc3QgYnVpbGRVc2Vyc0RpcmVjdG9yeUZpbHRlcnMgPSAocTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgYmFzZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgd2l0aFBvc2l0aW9uOiB0cnVlLFxuICAgIHdpdGhUZWFtczogdHJ1ZSxcbiAgfVxuICBjb25zdCB0cmltbWVkUSA9IHEudHJpbSgpXG4gIGlmICh0cmltbWVkUSkge1xuICAgIGJhc2Uuc2VhcmNoSW5wdXQgPSB0cmltbWVkUVxuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShiYXNlKVxufVxuXG5jb25zdCBoaWdobGlnaHRSYW5nZSA9ICh0ZXh0OiBzdHJpbmcsIHNlYXJjaFZhbHVlOiBzdHJpbmcpID0+IHtcbiAgaWYgKCFzZWFyY2hWYWx1ZSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBpZHggPSB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpKVxuICBpZiAoaWR4IDwgMCkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4geyBzdGFydDogaWR4LCBsZW5ndGg6IHNlYXJjaFZhbHVlLmxlbmd0aCB9XG59XG5cbmNvbnN0IGZpcnN0RGVmaW5lZCA9IDxUPiguLi52YWx1ZXM6IEFycmF5PFQgfCBudWxsIHwgdW5kZWZpbmVkPik6IFQgfCB1bmRlZmluZWQgPT5cbiAgdmFsdWVzLmZpbmQodmFsdWUgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbClcblxuY29uc3QgbWFwQ2xpZW50VG9JdGVtID0gKGM6IFJhd0NsaWVudCwgc2VhcmNoVmFsdWU6IHN0cmluZyk6IENvbnRleHRNZW50aW9uSXRlbSA9PiAoe1xuICBpZDogYy5pZCxcbiAgdHlwZTogJ2NsaWVudCcsXG4gIHByaW1hcnk6IGMubmFtZSxcbiAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UoYy5uYW1lLCBzZWFyY2hWYWx1ZSksXG4gIGJyZWFkY3J1bWI6IHtcbiAgICBjb3VudDogYy50b3RhbFByb3llY3RvcyA/PyB1bmRlZmluZWQsXG4gICAgY291bnRMYWJlbDogJ3Byb2plY3RzJyxcbiAgfSxcbiAgcmF3OiB7XG4gICAgaWQ6IGMuaWQsXG4gICAgbmFtZTogYy5uYW1lLFxuICAgIHRvdGFsUHJveWVjdG9zOiBjLnRvdGFsUHJveWVjdG9zID8/IG51bGwsXG4gIH0sXG59KVxuXG5jb25zdCBtYXBVc2VyVG9JdGVtID0gKHU6IFJhd0RpcmVjdG9yeVVzZXIsIHNlYXJjaFZhbHVlOiBzdHJpbmcpOiBDb250ZXh0TWVudGlvbkl0ZW0gPT4ge1xuICBjb25zdCBmdWxsTmFtZSA9IGAke3UuZmlyc3ROYW1lID8/ICcnfSAke3UubGFzdE5hbWUgPz8gJyd9YC50cmltKClcbiAgY29uc3QgcHJpbWFyeSA9IGZ1bGxOYW1lIHx8IHUuZW1haWwgfHwgU3RyaW5nKHUuaWQpXG5cbiAgcmV0dXJuIHtcbiAgICBpZDogdS5pZCxcbiAgICB0eXBlOiAndXNlcicsXG4gICAgcHJpbWFyeSxcbiAgICBwcmltYXJ5SGlnaGxpZ2h0OiBoaWdobGlnaHRSYW5nZShwcmltYXJ5LCBzZWFyY2hWYWx1ZSksXG4gICAgcmF3OiB7XG4gICAgICBpZDogdS5pZCxcbiAgICAgIG5hbWU6IHByaW1hcnksXG4gICAgICBwaWN0dXJlOiB1LnBpY3R1cmUgPz8gbnVsbCxcbiAgICAgIHBvc2l0aW9uTmFtZTogdS5wb3NpdGlvbk5hbWUgPz8gbnVsbCxcbiAgICAgIGVtYWlsOiB1LmVtYWlsID8/IG51bGwsXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCBtYXBDb3JVc2VyVG9Vc2VySXRlbSA9IChcbiAgdXNlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlVXNlcj4sXG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcsXG4gIG1lTGFiZWw6IHN0cmluZ1xuKTogQ29udGV4dE1lbnRpb25JdGVtID0+IHtcbiAgY29uc3QgZnVsbE5hbWUgPSBgJHt1c2VyLmZpcnN0TmFtZSA/PyAnJ30gJHt1c2VyLmxhc3ROYW1lID8/ICcnfWAudHJpbSgpXG4gIC8qKiBTb2xvIGNhcmdvIHJlYWw7IHNpbiBmYWxsYmFjayBhIGByb2xlYCAobGEgVUkgbXVlc3RyYSDigJxTaW4gcG9zaWNpw7Nu4oCdIHNpIGZhbHRhKS4gKi9cbiAgY29uc3QgcG9zaXRpb25MaW5lID0gdXNlci51c2VyX3Bvc2l0aW9uPy50cmltKCkgfHwgbnVsbFxuXG4gIHJldHVybiB7XG4gICAgaWQ6IHVzZXIuaWQsXG4gICAgdHlwZTogJ3VzZXInLFxuICAgIHByaW1hcnk6IG1lTGFiZWwsXG4gICAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UobWVMYWJlbCwgc2VhcmNoVmFsdWUpLFxuICAgIHJhdzoge1xuICAgICAgaWQ6IHVzZXIuaWQsXG4gICAgICBuYW1lOiBmdWxsTmFtZSB8fCBTdHJpbmcodXNlci5pZCksXG4gICAgICBwaWN0dXJlOiB1c2VyLnBpY3R1cmUgfHwgbnVsbCxcbiAgICAgIHBvc2l0aW9uTmFtZTogcG9zaXRpb25MaW5lLFxuICAgICAgZW1haWw6IHVzZXIuZW1haWw/LnRyaW0oKSB8fCBudWxsLFxuICAgIH0sXG4gIH1cbn1cblxuY29uc3QgbWFwUmVjZW50VGFza1RvSXRlbSA9IChcbiAgdGFzazogUmVjZW50VGFza0l0ZW0sXG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcsXG4gIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdyA9IHRydWVcbik6IENvbnRleHRNZW50aW9uSXRlbSA9PiB7XG4gIGNvbnN0IHByaW1hcnkgPSAodGFzay50aXRsZSAmJiB0YXNrLnRpdGxlLnRyaW0oKSkgfHwgU3RyaW5nKHRhc2suaWQpXG4gIGNvbnN0IHByb2plY3ROYW1lID0gc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93ID8gKHRhc2sucHJvamVjdE5hbWUgPz8gbnVsbCkgOiBudWxsXG4gIHJldHVybiB7XG4gICAgaWQ6IHRhc2suaWQsXG4gICAgdHlwZTogJ3Rhc2snLFxuICAgIHByaW1hcnksXG4gICAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UocHJpbWFyeSwgc2VhcmNoVmFsdWUpLFxuICAgIGJyZWFkY3J1bWI6IHByb2plY3ROYW1lID8geyBwYXJlbnQ6IHByb2plY3ROYW1lIH0gOiB1bmRlZmluZWQsXG4gICAgcmF3OiB7XG4gICAgICBpZDogdGFzay5pZCxcbiAgICAgIG5hbWU6IHByaW1hcnksXG4gICAgICBwcm9qZWN0TmFtZSxcbiAgICB9LFxuICB9XG59XG5cbmNvbnN0IG5vcm1hbGl6ZVRhc2tGYW1pbHlSZWNvcmQgPSAocmVjb3JkOiBUYXNrRmFtaWx5UmVjb3JkKTogUmVjZW50VGFza0l0ZW0gfCBudWxsID0+IHtcbiAgY29uc3QgeyBfaWQ6IHRhc2tGYW1pbHlJZCB9ID0gcmVjb3JkXG4gIGNvbnN0IGlkID0gdGFza0ZhbWlseUlkXG4gIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsIHx8IFN0cmluZyhpZCkgPT09ICcnKSByZXR1cm4gbnVsbFxuICBjb25zdCB0aXRsZSA9IChyZWNvcmQudGl0bGUgPz8gJycpLnRyaW0oKSB8fCBTdHJpbmcoaWQpXG4gIGNvbnN0IHByb2plY3ROYW1lID0gZmlyc3REZWZpbmVkKHJlY29yZC5wcm9qZWN0Py5uYW1lLCByZWNvcmQuZmF0aGVyPy50aXRsZSkgPz8gbnVsbFxuICBjb25zdCBoYXNGYXRoZXIgPSAhIWZpcnN0RGVmaW5lZChyZWNvcmQudGFza0ZhdGhlciwgcmVjb3JkLmZhdGhlcj8uaWQpXG4gIHJldHVybiB7XG4gICAgaWQsXG4gICAgdGl0bGUsXG4gICAgdHlwZTogaGFzRmF0aGVyID8gJ3N1YnRhc2snIDogJ3Rhc2snLFxuICAgIHByb2plY3ROYW1lLFxuICB9XG59XG5cbmNvbnN0IG5vcm1hbGl6ZVByb2plY3RzRmFsbGJhY2tSZWNvcmQgPSAocmVjb3JkOiBGYWxsYmFja1Byb2plY3RSZWNvcmQpOiBSYXdTZWFyY2hSZXN1bHQgfCBudWxsID0+IHtcbiAgY29uc3QgeyBpZCB9ID0gcmVjb3JkXG4gIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsIHx8IFN0cmluZyhpZCkgPT09ICcnKSByZXR1cm4gbnVsbFxuICBjb25zdCB0aXRsZSA9IHJlY29yZC5uYW1lID8/ICcnXG4gIGNvbnN0IGNsaWVudElkID0gZmlyc3REZWZpbmVkKHJlY29yZC5jbGllbnRJZCwgcmVjb3JkLmNsaWVudD8uaWQpID8/IG51bGxcbiAgY29uc3QgY2xpZW50TmFtZSA9IHJlY29yZC5jbGllbnQ/Lm5hbWUgPz8gbnVsbFxuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIHRpdGxlLFxuICAgIHR5cGU6ICdwcm9qZWN0JyxcbiAgICBjbGllbnRJZCxcbiAgICBjbGllbnROYW1lLFxuICB9XG59XG5cbmNvbnN0IG1hcFNlYXJjaFRvSXRlbSA9IChcbiAgcjogUmF3U2VhcmNoUmVzdWx0LFxuICB0eXBlOiBDb250ZXh0RW50aXR5VHlwZSxcbiAgc2VhcmNoVmFsdWU6IHN0cmluZyxcbiAgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93ID0gdHJ1ZVxuKTogQ29udGV4dE1lbnRpb25JdGVtID0+IHtcbiAgY29uc3QgcHJpbWFyeSA9IHIudGl0bGUgfHwgci5wcm9qZWN0TmFtZSB8fCAnJ1xuICBsZXQgcGFyZW50OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gIGlmICh0eXBlID09PSAncHJvamVjdCcpIHBhcmVudCA9IHIuY2xpZW50TmFtZVxuICBlbHNlIGlmICh0eXBlID09PSAndGFzaycpIHBhcmVudCA9IHVuZGVmaW5lZFxuICBlbHNlIHBhcmVudCA9IHIucHJvamVjdE5hbWUgPz8gci5jbGllbnROYW1lXG5cbiAgY29uc3QgZmF0aGVyID0gdHlwZSA9PT0gJ3Rhc2snID8gci5mYXRoZXIgOiBudWxsXG4gIGNvbnN0IGhhc0ZhdGhlciA9IHR5cGUgPT09ICd0YXNrJyAmJiBmYXRoZXIgIT0gbnVsbCAmJiBmYXRoZXIuaWQgIT0gbnVsbCAmJiBTdHJpbmcoZmF0aGVyLmlkKS5sZW5ndGggPiAwXG5cbiAgY29uc3QgdGFza1Byb2plY3ROYW1lID0gdHlwZSA9PT0gJ3Rhc2snICYmICFzaG93UHJvamVjdE5hbWVJblRhc2tSb3cgPyBudWxsIDogKHIucHJvamVjdE5hbWUgPz8gbnVsbClcblxuICByZXR1cm4ge1xuICAgIGlkOiByLmlkLFxuICAgIHR5cGUsXG4gICAgcHJpbWFyeSxcbiAgICBwcmltYXJ5SGlnaGxpZ2h0OiBoaWdobGlnaHRSYW5nZShwcmltYXJ5LCBzZWFyY2hWYWx1ZSksXG4gICAgYnJlYWRjcnVtYjogcGFyZW50ID8geyBwYXJlbnQgfSA6IHVuZGVmaW5lZCxcbiAgICByYXc6IHtcbiAgICAgIGlkOiByLmlkLFxuICAgICAgbmFtZTogcHJpbWFyeSxcbiAgICAgIGNsaWVudElkOiByLmNsaWVudElkID8/IG51bGwsXG4gICAgICBjbGllbnROYW1lOiByLmNsaWVudE5hbWUgPz8gbnVsbCxcbiAgICAgIHByb2plY3ROYW1lOiB0YXNrUHJvamVjdE5hbWUsXG4gICAgICBmZWVJZDogci5mZWVJZCA/PyBudWxsLFxuICAgICAgZmF0aGVySWQ6IGhhc0ZhdGhlciA/IGZhdGhlci5pZCA6IG51bGwsXG4gICAgICBmYXRoZXJUaXRsZTogaGFzRmF0aGVyID8gZmF0aGVyLnRpdGxlPy50cmltKCkgfHwgbnVsbCA6IG51bGwsXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCBmb3JtYXRNY3BQcmltYXJ5TGFiZWwgPSAoc2x1Zzogc3RyaW5nKTogc3RyaW5nID0+XG4gIHNsdWcucmVwbGFjZSgvXy9nLCAnICcpLnJlcGxhY2UoL1xcYlxcdy9nLCBjaGFyID0+IGNoYXIudG9VcHBlckNhc2UoKSlcblxuY29uc3QgbWFwTWNwU2x1Z3NUb0l0ZW1zID0gKHNsdWdzOiBzdHJpbmdbXSwgc2VhcmNoVmFsdWU6IHN0cmluZyk6IENvbnRleHRNZW50aW9uSXRlbVtdID0+IHtcbiAgY29uc3QgcSA9IHNlYXJjaFZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gIGxldCBmaWx0ZXJlZCA9IHNsdWdzXG4gIGlmIChxKSB7XG4gICAgZmlsdGVyZWQgPSBzbHVncy5maWx0ZXIocyA9PiB7XG4gICAgICBjb25zdCBwcmltYXJ5ID0gZm9ybWF0TWNwUHJpbWFyeUxhYmVsKHMpXG4gICAgICByZXR1cm4gcy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8IHByaW1hcnkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkLm1hcChzbHVnID0+IHtcbiAgICBjb25zdCBwcmltYXJ5ID0gZm9ybWF0TWNwUHJpbWFyeUxhYmVsKHNsdWcpXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBzbHVnLFxuICAgICAgdHlwZTogJ21jcCcgYXMgY29uc3QsXG4gICAgICBwcmltYXJ5LFxuICAgICAgcHJpbWFyeUhpZ2hsaWdodDogaGlnaGxpZ2h0UmFuZ2UocHJpbWFyeSwgc2VhcmNoVmFsdWUpLFxuICAgICAgcmF3OiB7XG4gICAgICAgIGlkOiBzbHVnLFxuICAgICAgICBuYW1lOiBwcmltYXJ5LFxuICAgICAgfSxcbiAgICB9XG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCB1c2VFbnRpdHlTZWFyY2ggPSAodHlwZTogQ29udGV4dEVudGl0eVR5cGUsIHNjb3BlPzogRW50aXR5U2VhcmNoU2NvcGUpID0+IHtcbiAgY29uc3QgY29yVXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCB7IHQgfSA9IHVzZVQoKVxuICBjb25zdCBbc2VhcmNoVmFsdWUsIHNldFNlYXJjaFZhbHVlXSA9IHVzZVN0YXRlKCcnKVxuICBjb25zdCBkZWJvdW5jZWRTZWFyY2hWYWx1ZSA9IHVzZURlYm91bmNlKHNlYXJjaFZhbHVlLCBTRUFSQ0hfUVVFUllfREVCT1VOQ0VfTVMpXG5cbiAgY29uc3QgW2l0ZW1zLCBzZXRJdGVtc10gPSB1c2VTdGF0ZTxDb250ZXh0TWVudGlvbkl0ZW1bXT4oW10pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbaGlkZVJlY2VudHNMYWJlbCwgc2V0SGlkZVJlY2VudHNMYWJlbF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2hhc01vcmUsIHNldEhhc01vcmVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc0xvYWRpbmdNb3JlLCBzZXRJc0xvYWRpbmdNb3JlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbY3VycmVudFBhZ2UsIHNldEN1cnJlbnRQYWdlXSA9IHVzZVN0YXRlKDEpXG4gIGNvbnN0IFthY3RpdmVQYWdpbmF0aW9uU291cmNlLCBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlXSA9IHVzZVN0YXRlPFBhZ2luYXRpb25Tb3VyY2U+KCdub25lJylcblxuICBjb25zdCBtY3BTbHVnc0tleSA9IChzY29wZT8ubWNwU2x1Z3MgPz8gW10pLmpvaW4oJ3wnKVxuICBjb25zdCBzaG93UHJvamVjdE5hbWVJblRhc2tSb3cgPSBzY29wZT8uYWdlbnRFbnRpdHkgIT09ICdwcm9qZWN0J1xuXG4gIC8vIEVzdGFiaWxpemFtb3MgZWwgc2NvcGUgcGFyYSBubyBkaXNwYXJhciBmZXRjaHMgcG9yIGNhbWJpb3MgZGUgaWRlbnRpZGFkIGRlIG9iamV0by5cbiAgY29uc3Qgc3RhYmxlU2NvcGUgPSB1c2VNZW1vPEVudGl0eVNlYXJjaFNjb3BlPihcbiAgICAoKSA9PiAoe1xuICAgICAgY2xpZW50SWQ6IHNjb3BlPy5jbGllbnRJZCA/PyBudWxsLFxuICAgICAgcHJvamVjdElkOiBzY29wZT8ucHJvamVjdElkID8/IG51bGwsXG4gICAgICBtY3BTbHVnczogc2NvcGU/Lm1jcFNsdWdzID8/IFtdLFxuICAgICAgYWdlbnRFbnRpdHk6IHNjb3BlPy5hZ2VudEVudGl0eSA/PyBudWxsLFxuICAgIH0pLFxuICAgIFtzY29wZT8uY2xpZW50SWQsIHNjb3BlPy5wcm9qZWN0SWQsIG1jcFNsdWdzS2V5LCBzY29wZT8uYWdlbnRFbnRpdHldXG4gIClcblxuICAvLyAtLS0gU2VhcmNoOiBwcm9qZWN0IHwgdGFzayAoR3JhcGhRTDogc2VhcmNoKSAtLS1cbiAgY29uc3QgW2ZldGNoU2VhcmNoRW50aXRpZXMsIHsgZGF0YTogc2VhcmNoRGF0YSwgbG9hZGluZzogc2VhcmNoTG9hZGluZywgZXJyb3I6IHNlYXJjaEVycm9yIH1dID1cbiAgICB1c2VMYXp5UXVlcnk8U2VhcmNoRW50aXRpZXNEYXRhPihTRUFSQ0hfRU5USVRJRVMsIHtcbiAgICAgIHZhcmlhYmxlczogeyBsaW1pdDogMjAgfSxcbiAgICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgICB9KVxuXG4gIC8vIC0tLSBTZWFyY2g6IGNsaWVudCAoR3JhcGhRTCkgLS0tXG4gIGNvbnN0IFtmZXRjaFNlYXJjaENsaWVudHMsIHsgZGF0YTogY2xpZW50c0RhdGEsIGxvYWRpbmc6IGNsaWVudHNMb2FkaW5nLCBlcnJvcjogY2xpZW50c0Vycm9yIH1dID1cbiAgICB1c2VMYXp5UXVlcnk8U2VhcmNoQ2xpZW50c0RhdGE+KFNFQVJDSF9DTElFTlRTLCB7XG4gICAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScsXG4gICAgfSlcblxuICAvLyAtLS0gU2VhcmNoOiB1c2VyIChHcmFwaFFMOiB1c2Vyc0RpcmVjdG9yeSkgLS0tXG4gIGNvbnN0IFtmZXRjaFVzZXJzRGlyZWN0b3J5LCB7IGRhdGE6IHVzZXJzRGF0YSwgbG9hZGluZzogdXNlcnNMb2FkaW5nLCBlcnJvcjogdXNlcnNFcnJvciB9XSA9XG4gICAgdXNlTGF6eVF1ZXJ5PFVzZXJzRGlyZWN0b3J5RGF0YT4oVVNFUlNfRElSRUNUT1JZLCB7XG4gICAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScsXG4gICAgfSlcblxuICBjb25zdCBzeW5jVXNlcnNQYWdpbmF0aW9uID0gdXNlQ2FsbGJhY2soKHBheWxvYWQ/OiBVc2Vyc0RpcmVjdG9yeURhdGEgfCBudWxsKSA9PiB7XG4gICAgY29uc3QgcGFnZSA9IG5vcm1hbGl6ZVBvc2l0aXZlSW50KHBheWxvYWQ/LnVzZXJzRGlyZWN0b3J5Py5wYWdlLCAxKVxuICAgIGNvbnN0IGxhc3RQYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQocGF5bG9hZD8udXNlcnNEaXJlY3Rvcnk/Lmxhc3RQYWdlLCBwYWdlKVxuICAgIHNldEN1cnJlbnRQYWdlKHBhZ2UpXG4gICAgc2V0SGFzTW9yZShwYWdlIDwgbGFzdFBhZ2UpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHN5bmNDbGllbnRzUGFnaW5hdGlvbiA9IHVzZUNhbGxiYWNrKChwYXlsb2FkPzogU2VhcmNoQ2xpZW50c0RhdGEgfCBudWxsKSA9PiB7XG4gICAgY29uc3QgcGFnZSA9IG5vcm1hbGl6ZVBvc2l0aXZlSW50KHBheWxvYWQ/LmNsaWVudHM/LnBhZ2UsIDEpXG4gICAgY29uc3QgbGFzdFBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy5jbGllbnRzPy5sYXN0UGFnZSwgcGFnZSlcbiAgICBzZXRDdXJyZW50UGFnZShwYWdlKVxuICAgIHNldEhhc01vcmUocGFnZSA8IGxhc3RQYWdlKVxuICB9LCBbXSlcblxuICBjb25zdCBzeW5jVGFza0ZhbGxiYWNrUGFnaW5hdGlvbiA9IHVzZUNhbGxiYWNrKChwYXlsb2FkPzogVGFza0ZhbWlseURhdGEgfCBudWxsKSA9PiB7XG4gICAgY29uc3QgcmF3UGFnZSA9IE51bWJlcihwYXlsb2FkPy50YXNrRmFtaWx5Py5wYWdlKVxuICAgIC8vIHRhc2tGYW1pbHkgdXNhIHDDoWdpbmFzIDAtYmFzZWQ7IGNvbnZlcnRpbW9zIGEgMS1iYXNlZCBwYXJhIGNvbnNpc3RlbmNpYSBjb24gZWwgcmVzdG9cbiAgICBjb25zdCBwYWdlID0gTnVtYmVyLmlzRmluaXRlKHJhd1BhZ2UpICYmIHJhd1BhZ2UgPj0gMCA/IE1hdGguZmxvb3IocmF3UGFnZSkgKyAxIDogMVxuICAgIGNvbnN0IGxhc3RQYWdlID0gbm9ybWFsaXplUG9zaXRpdmVJbnQocGF5bG9hZD8udGFza0ZhbWlseT8ubGFzdFBhZ2UsIHBhZ2UpXG4gICAgc2V0Q3VycmVudFBhZ2UocGFnZSlcbiAgICBzZXRIYXNNb3JlKHBhZ2UgPCBsYXN0UGFnZSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgc3luY1Byb2plY3RGYWxsYmFja1BhZ2luYXRpb24gPSB1c2VDYWxsYmFjaygocGF5bG9hZD86IFByb2plY3RzRmFsbGJhY2tEYXRhIHwgbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhZ2UgPSBub3JtYWxpemVQb3NpdGl2ZUludChwYXlsb2FkPy5wcm9qZWN0cz8ucGFnZSwgMSlcbiAgICBjb25zdCBsYXN0UGFnZSA9IG5vcm1hbGl6ZVBvc2l0aXZlSW50KHBheWxvYWQ/LnByb2plY3RzPy5sYXN0UGFnZSwgcGFnZSlcbiAgICBzZXRDdXJyZW50UGFnZShwYWdlKVxuICAgIHNldEhhc01vcmUocGFnZSA8IGxhc3RQYWdlKVxuICB9LCBbXSlcblxuICBjb25zdCBbZmV0Y2hUYXNrRmFtaWx5RmFsbGJhY2tdID0gdXNlTGF6eVF1ZXJ5PFRhc2tGYW1pbHlEYXRhPihUQVNLX0ZBTUlMWV9GQUxMQkFDSywge1xuICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgfSlcblxuICBjb25zdCBbZmV0Y2hQcm9qZWN0c0ZhbGxiYWNrXSA9IHVzZUxhenlRdWVyeTxQcm9qZWN0c0ZhbGxiYWNrRGF0YT4oUFJPSkVDVFNfRkFMTEJBQ0ssIHtcbiAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seScsXG4gIH0pXG5cbiAgY29uc3QgZmV0Y2hSZWNlbnQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKHR5cGUgPT09ICdtY3AnKSB7XG4gICAgICBjb25zdCBzbHVncyA9IHN0YWJsZVNjb3BlLm1jcFNsdWdzID8/IFtdXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgICBzZXRJdGVtcyhtYXBNY3BTbHVnc1RvSXRlbXMoc2x1Z3MsICcnKSlcbiAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdub25lJylcbiAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlID09PSAnY2xpZW50Jykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0UmVjZW50Q2xpZW50cygpXG4gICAgICAgIGNvbnN0IG1hcHBlZCA9IChkYXRhID8/IFtdKS5tYXAoYyA9PiBtYXBDbGllbnRUb0l0ZW0oYywgJycpKVxuICAgICAgICBzZXRJdGVtcyhtYXBwZWQpXG4gICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ25vbmUnKVxuICAgICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAncHJvamVjdCcpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldFJlY2VudFByb2plY3RzKHN0YWJsZVNjb3BlLmNsaWVudElkID8geyBjbGllbnRJZDogc3RhYmxlU2NvcGUuY2xpZW50SWQgfSA6IHVuZGVmaW5lZClcbiAgICAgICAgbGV0IG1hcHBlZCA9IChBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtdKS5tYXAocCA9PlxuICAgICAgICAgIG1hcFNlYXJjaFRvSXRlbShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6IHAuaWQsXG4gICAgICAgICAgICAgIHRpdGxlOiBwLnRpdGxlLFxuICAgICAgICAgICAgICB0eXBlOiAncHJvamVjdCcsXG4gICAgICAgICAgICAgIGNsaWVudElkOiBwLmNsaWVudElkLFxuICAgICAgICAgICAgICBmZWVJZDogcC5mZWVJZCxcbiAgICAgICAgICAgICAgY2xpZW50TmFtZTogcC5jbGllbnROYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdwcm9qZWN0JyxcbiAgICAgICAgICAgICcnXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIGlmIChtYXBwZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgYXJndW1lbnRzRmlsdGVyID1cbiAgICAgICAgICAgIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSBudWxsICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09ICcnXG4gICAgICAgICAgICAgID8geyBjbGllbnRfaWQ6IFtTdHJpbmcoc3RhYmxlU2NvcGUuY2xpZW50SWQpXSB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3QgeyBkYXRhOiBmYWxsYmFja0RhdGEgfSA9IGF3YWl0IGZldGNoUHJvamVjdHNGYWxsYmFjayh7XG4gICAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgICAgLi4uKGFyZ3VtZW50c0ZpbHRlciA/IHsgYXJndW1lbnRzOiBhcmd1bWVudHNGaWx0ZXIgfSA6IHt9KSxcbiAgICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICAgICAgcGVyUGFnZTogMjAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29uc3QgZmFsbGJhY2tNYXBwZWQgPSAoZmFsbGJhY2tEYXRhPy5wcm9qZWN0cz8uZGF0YSA/PyBbXSlcbiAgICAgICAgICAgIC5tYXAobm9ybWFsaXplUHJvamVjdHNGYWxsYmFja1JlY29yZClcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIFJhd1NlYXJjaFJlc3VsdCA9PiBpdGVtICE9PSBudWxsKVxuICAgICAgICAgICAgLm1hcChpdGVtID0+IG1hcFNlYXJjaFRvSXRlbShpdGVtLCAncHJvamVjdCcsICcnKSlcbiAgICAgICAgICBtYXBwZWQgPSBmYWxsYmFja01hcHBlZFxuICAgICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsbGJhY2tNYXBwZWQubGVuZ3RoID4gMClcbiAgICAgICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdwcm9qZWN0LWZhbGxiYWNrJylcbiAgICAgICAgICBzeW5jUHJvamVjdEZhbGxiYWNrUGFnaW5hdGlvbihmYWxsYmFja0RhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcbiAgICAgICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCdub25lJylcbiAgICAgICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgICB9XG4gICAgICAgIHNldEl0ZW1zKG1hcHBlZClcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3Rhc2snKSB7XG4gICAgICAgIGxldCByZWNlbnRUYXNrRmlsdGVyczogeyBwcm9qZWN0SWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsOyBjbGllbnRJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwgfSB8IHVuZGVmaW5lZFxuICAgICAgICBpZiAoc3RhYmxlU2NvcGUuYWdlbnRFbnRpdHkgPT09ICdwcm9qZWN0Jykge1xuICAgICAgICAgIHJlY2VudFRhc2tGaWx0ZXJzID0geyBwcm9qZWN0SWQ6IHN0YWJsZVNjb3BlLnByb2plY3RJZCB9XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhYmxlU2NvcGUuYWdlbnRFbnRpdHkgPT09ICdjbGllbnQnKSB7XG4gICAgICAgICAgcmVjZW50VGFza0ZpbHRlcnMgPSB7IGNsaWVudElkOiBzdGFibGVTY29wZS5jbGllbnRJZCB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldFJlY2VudFRhc2tzKHJlY2VudFRhc2tGaWx0ZXJzKVxuICAgICAgICBsZXQgdGFza0l0ZW1zID0gKGRhdGEgPz8gW10pLm1hcCh0YXNrID0+IG1hcFJlY2VudFRhc2tUb0l0ZW0odGFzaywgJycsIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdykpXG4gICAgICAgIGlmICh0YXNrSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fVxuICAgICAgICAgIGlmIChzdGFibGVTY29wZS5wcm9qZWN0SWQgIT09IG51bGwgJiYgc3RhYmxlU2NvcGUucHJvamVjdElkICE9PSB1bmRlZmluZWQgJiYgc3RhYmxlU2NvcGUucHJvamVjdElkICE9PSAnJykge1xuICAgICAgICAgICAgZmlsdGVyLnByb2plY3RJZHMgPSBbU3RyaW5nKHN0YWJsZVNjb3BlLnByb2plY3RJZCldXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gbnVsbCAmJiBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSAnJykge1xuICAgICAgICAgICAgZmlsdGVyLmNsaWVudElkcyA9IFtTdHJpbmcoc3RhYmxlU2NvcGUuY2xpZW50SWQpXVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7IGRhdGE6IGZhbGxiYWNrRGF0YSB9ID0gYXdhaXQgZmV0Y2hUYXNrRmFtaWx5RmFsbGJhY2soe1xuICAgICAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgICAgIGZpbHRlcjogeyBhcmNoaXZlZDogZmFsc2UsIC4uLmZpbHRlciB9LFxuICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB7IG9mZnNldDogMCwgc2l6ZTogMjAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICB0YXNrSXRlbXMgPSAoZmFsbGJhY2tEYXRhPy50YXNrRmFtaWx5Py5kYXRhID8/IFtdKVxuICAgICAgICAgICAgLm1hcChub3JtYWxpemVUYXNrRmFtaWx5UmVjb3JkKVxuICAgICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgUmVjZW50VGFza0l0ZW0gPT4gaXRlbSAhPT0gbnVsbClcbiAgICAgICAgICAgIC5tYXAodGFzayA9PiBtYXBSZWNlbnRUYXNrVG9JdGVtKHRhc2ssICcnLCBzaG93UHJvamVjdE5hbWVJblRhc2tSb3cpKVxuICAgICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwodGFza0l0ZW1zLmxlbmd0aCA+IDApXG4gICAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgndGFzay1mYWxsYmFjaycpXG4gICAgICAgICAgc3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24oZmFsbGJhY2tEYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnbm9uZScpXG4gICAgICAgICAgc2V0SGFzTW9yZShmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICBzZXRJdGVtcyh0YXNrSXRlbXMpXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1c2VyJykge1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGZldGNoVXNlcnNEaXJlY3Rvcnkoe1xuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgZmlsdGVyczogYnVpbGRVc2Vyc0RpcmVjdG9yeUZpbHRlcnMoJycpLFxuICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBtYXBwZWQgPSAoZGF0YT8udXNlcnNEaXJlY3Rvcnk/LmRhdGEgPz8gW10pLm1hcCh1ID0+IG1hcFVzZXJUb0l0ZW0odSwgJycpKVxuICAgICAgICBjb25zdCBtZUl0ZW0gPSBtYXBDb3JVc2VyVG9Vc2VySXRlbShjb3JVc2VyLCAnJywgdCgnY29udGV4dE1lbnRpb24ubWUnKSlcbiAgICAgICAgY29uc3Qgd2l0aG91dE1lID0gbWFwcGVkLmZpbHRlcihpdGVtID0+IFN0cmluZyhpdGVtLmlkKSAhPT0gU3RyaW5nKG1lSXRlbS5pZCkpXG4gICAgICAgIHNldEl0ZW1zKFttZUl0ZW0sIC4uLndpdGhvdXRNZV0pXG4gICAgICAgIHN5bmNVc2Vyc1BhZ2luYXRpb24oZGF0YSlcbiAgICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcbiAgICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgndXNlcnMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SXRlbXMoW10pXG4gICAgICAgIHNldEhpZGVSZWNlbnRzTGFiZWwoZmFsc2UpXG4gICAgICAgIHNldEFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UoJ25vbmUnKVxuICAgICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgICBzZXRDdXJyZW50UGFnZSgxKVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgc2V0RXJyb3IodHJ1ZSlcbiAgICAgIHNldEl0ZW1zKFtdKVxuICAgICAgc2V0SGlkZVJlY2VudHNMYWJlbChmYWxzZSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH0sIFtcbiAgICB0eXBlLFxuICAgIHN0YWJsZVNjb3BlLFxuICAgIGZldGNoVXNlcnNEaXJlY3RvcnksXG4gICAgZmV0Y2hUYXNrRmFtaWx5RmFsbGJhY2ssXG4gICAgZmV0Y2hQcm9qZWN0c0ZhbGxiYWNrLFxuICAgIHN5bmNVc2Vyc1BhZ2luYXRpb24sXG4gICAgc3luY1Rhc2tGYWxsYmFja1BhZ2luYXRpb24sXG4gICAgc3luY1Byb2plY3RGYWxsYmFja1BhZ2luYXRpb24sXG4gICAgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93LFxuICAgIGNvclVzZXIsXG4gICAgdCxcbiAgXSlcblxuICAvLyBEaXNwYXJhciBzZWFyY2ggYWwgY2FtYmlhciBkZWJvdW5jZWQgdmFsdWVcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBxID0gZGVib3VuY2VkU2VhcmNoVmFsdWUudHJpbSgpXG5cbiAgICBpZiAodHlwZSA9PT0gJ21jcCcpIHtcbiAgICAgIGNvbnN0IHNsdWdzID0gc3RhYmxlU2NvcGUubWNwU2x1Z3MgPz8gW11cbiAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICBzZXRFcnJvcihmYWxzZSlcbiAgICAgIHNldEl0ZW1zKG1hcE1jcFNsdWdzVG9JdGVtcyhzbHVncywgcSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXEpIHJldHVyblxuXG4gICAgaWYgKHR5cGUgPT09ICdjbGllbnQnKSB7XG4gICAgICBmZXRjaFNlYXJjaENsaWVudHMoe1xuICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICBmaWx0ZXI6IHsgbmFtZTogcSB9LFxuICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgcGVyUGFnZTogMjAsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnY2xpZW50cy1zZWFyY2gnKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3VzZXInKSB7XG4gICAgICBmZXRjaFVzZXJzRGlyZWN0b3J5KHtcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgZmlsdGVyczogYnVpbGRVc2Vyc0RpcmVjdG9yeUZpbHRlcnMocSksXG4gICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICBzZXRBY3RpdmVQYWdpbmF0aW9uU291cmNlKCd1c2VycycpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpbHRlcnMgPSBidWlsZEZpbHRlcnNGb3JUeXBlKHR5cGUpXG4gICAgICBjb25zdCBleHRyYSA9IGJ1aWxkU2VhcmNoRW50aXRpZXNFeHRyYSh0eXBlLCBzdGFibGVTY29wZSlcbiAgICAgIGZldGNoU2VhcmNoRW50aXRpZXMoe1xuICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICBxLFxuICAgICAgICAgIGZpbHRlcnMsXG4gICAgICAgICAgLi4uKGV4dHJhICE9PSB1bmRlZmluZWQgPyB7IGV4dHJhIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgc2V0QWN0aXZlUGFnaW5hdGlvblNvdXJjZSgnbm9uZScpXG4gICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgIH1cbiAgfSwgW2RlYm91bmNlZFNlYXJjaFZhbHVlLCB0eXBlLCBzdGFibGVTY29wZSwgZmV0Y2hTZWFyY2hFbnRpdGllcywgZmV0Y2hTZWFyY2hDbGllbnRzLCBmZXRjaFVzZXJzRGlyZWN0b3J5XSlcblxuICAvLyBTaW5jcm9uaXphciByZXN1bHRhZG9zIGRlIHNlYXJjaFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlID09PSAnbWNwJykgcmV0dXJuXG5cbiAgICBjb25zdCBxID0gZGVib3VuY2VkU2VhcmNoVmFsdWUudHJpbSgpXG4gICAgaWYgKCFxKSByZXR1cm5cbiAgICBzZXRIaWRlUmVjZW50c0xhYmVsKGZhbHNlKVxuXG4gICAgaWYgKHR5cGUgPT09ICdjbGllbnQnKSB7XG4gICAgICBzZXRMb2FkaW5nKGNsaWVudHNMb2FkaW5nKVxuICAgICAgaWYgKGNsaWVudHNFcnJvcikge1xuICAgICAgICBzZXRFcnJvcih0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChjbGllbnRzRGF0YT8uY2xpZW50cz8uZGF0YSkge1xuICAgICAgICBzZXRJdGVtcyhjbGllbnRzRGF0YS5jbGllbnRzLmRhdGEubWFwKGMgPT4gbWFwQ2xpZW50VG9JdGVtKGMsIHEpKSlcbiAgICAgICAgc3luY0NsaWVudHNQYWdpbmF0aW9uKGNsaWVudHNEYXRhKVxuICAgICAgICBzZXRFcnJvcihmYWxzZSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1c2VyJykge1xuICAgICAgc2V0TG9hZGluZyh1c2Vyc0xvYWRpbmcpXG4gICAgICBpZiAodXNlcnNFcnJvcikge1xuICAgICAgICBzZXRFcnJvcih0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmICh1c2Vyc0RhdGE/LnVzZXJzRGlyZWN0b3J5Py5kYXRhKSB7XG4gICAgICAgIGNvbnN0IG1hcHBlZCA9IHVzZXJzRGF0YS51c2Vyc0RpcmVjdG9yeS5kYXRhLm1hcCh1ID0+IG1hcFVzZXJUb0l0ZW0odSwgcSkpXG4gICAgICAgIGNvbnN0IG1lSWQgPSBTdHJpbmcoY29yVXNlci5pZClcbiAgICAgICAgY29uc3QgaGFzTWVJblJlc3VsdHMgPSBtYXBwZWQuc29tZShpdGVtID0+IFN0cmluZyhpdGVtLmlkKSA9PT0gbWVJZClcbiAgICAgICAgY29uc3Qgd2l0aG91dE1lID0gbWFwcGVkLmZpbHRlcihpdGVtID0+IFN0cmluZyhpdGVtLmlkKSAhPT0gbWVJZClcbiAgICAgICAgY29uc3QgbWVJdGVtID0gbWFwQ29yVXNlclRvVXNlckl0ZW0oY29yVXNlciwgcSwgdCgnY29udGV4dE1lbnRpb24ubWUnKSlcbiAgICAgICAgc2V0SXRlbXMoaGFzTWVJblJlc3VsdHMgPyBbbWVJdGVtLCAuLi53aXRob3V0TWVdIDogbWFwcGVkKVxuICAgICAgICBzeW5jVXNlcnNQYWdpbmF0aW9uKHVzZXJzRGF0YSlcbiAgICAgICAgc2V0RXJyb3IoZmFsc2UpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldExvYWRpbmcoc2VhcmNoTG9hZGluZylcbiAgICAgIGlmIChzZWFyY2hFcnJvcikge1xuICAgICAgICBzZXRFcnJvcih0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChzZWFyY2hEYXRhPy5zZWFyY2gpIHtcbiAgICAgICAgc2V0SXRlbXMoc2VhcmNoRGF0YS5zZWFyY2gubWFwKHIgPT4gbWFwU2VhcmNoVG9JdGVtKHIsIHR5cGUsIHEsIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdykpKVxuICAgICAgICBzZXRIYXNNb3JlKGZhbHNlKVxuICAgICAgICBzZXRFcnJvcihmYWxzZSlcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtcbiAgICBzZWFyY2hEYXRhLFxuICAgIGNsaWVudHNEYXRhLFxuICAgIHVzZXJzRGF0YSxcbiAgICBzZWFyY2hMb2FkaW5nLFxuICAgIGNsaWVudHNMb2FkaW5nLFxuICAgIHVzZXJzTG9hZGluZyxcbiAgICBzZWFyY2hFcnJvcixcbiAgICBjbGllbnRzRXJyb3IsXG4gICAgdXNlcnNFcnJvcixcbiAgICBkZWJvdW5jZWRTZWFyY2hWYWx1ZSxcbiAgICB0eXBlLFxuICAgIHN5bmNDbGllbnRzUGFnaW5hdGlvbixcbiAgICBzeW5jVXNlcnNQYWdpbmF0aW9uLFxuICAgIHNob3dQcm9qZWN0TmFtZUluVGFza1JvdyxcbiAgICBjb3JVc2VyLFxuICAgIHQsXG4gIF0pXG5cbiAgY29uc3QgbG9hZE1vcmUgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzTG9hZGluZ01vcmUgfHwgIWhhc01vcmUgfHwgYWN0aXZlUGFnaW5hdGlvblNvdXJjZSA9PT0gJ25vbmUnKSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1t1c2VFbnRpdHlTZWFyY2hdIGxvYWRNb3JlIHNraXBwZWQnLCB7XG4gICAgICAgIGlzTG9hZGluZ01vcmUsXG4gICAgICAgIGhhc01vcmUsXG4gICAgICAgIGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHNhZmVDdXJyZW50UGFnZSA9IG5vcm1hbGl6ZVBvc2l0aXZlSW50KGN1cnJlbnRQYWdlLCAxKVxuICAgIGNvbnN0IG5leHRQYWdlID0gc2FmZUN1cnJlbnRQYWdlICsgMVxuICAgIGNvbnN0IHEgPSBkZWJvdW5jZWRTZWFyY2hWYWx1ZS50cmltKClcbiAgICBjb25zb2xlLmluZm8oJ1t1c2VFbnRpdHlTZWFyY2hdIGxvYWRNb3JlIHN0YXJ0Jywge1xuICAgICAgc291cmNlOiBhY3RpdmVQYWdpbmF0aW9uU291cmNlLFxuICAgICAgY3VycmVudFBhZ2UsXG4gICAgICBuZXh0UGFnZSxcbiAgICAgIHF1ZXJ5OiBxLFxuICAgIH0pXG4gICAgc2V0SXNMb2FkaW5nTW9yZSh0cnVlKVxuICAgIHRyeSB7XG4gICAgICBpZiAoYWN0aXZlUGFnaW5hdGlvblNvdXJjZSA9PT0gJ3VzZXJzJykge1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGZldGNoVXNlcnNEaXJlY3Rvcnkoe1xuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgZmlsdGVyczogYnVpbGRVc2Vyc0RpcmVjdG9yeUZpbHRlcnMocSksXG4gICAgICAgICAgICBwYWdlOiBuZXh0UGFnZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBjb25zb2xlLmluZm8oJ1t1c2VFbnRpdHlTZWFyY2hdIHVzZXJzIGxvYWRNb3JlIHJlc3BvbnNlJywge1xuICAgICAgICAgIHBhZ2U6IGRhdGE/LnVzZXJzRGlyZWN0b3J5Py5wYWdlLFxuICAgICAgICAgIGxhc3RQYWdlOiBkYXRhPy51c2Vyc0RpcmVjdG9yeT8ubGFzdFBhZ2UsXG4gICAgICAgICAgY291bnQ6IGRhdGE/LnVzZXJzRGlyZWN0b3J5Py5kYXRhPy5sZW5ndGggPz8gMCxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgbmV4dEl0ZW1zID0gKGRhdGE/LnVzZXJzRGlyZWN0b3J5Py5kYXRhID8/IFtdKS5tYXAodSA9PiBtYXBVc2VyVG9JdGVtKHUsIHEpKVxuICAgICAgICBzZXRJdGVtcyhwcmV2ID0+IHtcbiAgICAgICAgICBpZiAoIXEpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lSXRlbSA9XG4gICAgICAgICAgICAgIHByZXZbMF0/LnR5cGUgPT09ICd1c2VyJyA/IHByZXZbMF0gOiBtYXBDb3JVc2VyVG9Vc2VySXRlbShjb3JVc2VyLCAnJywgdCgnY29udGV4dE1lbnRpb24ubWUnKSlcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2Lm1hcChpdGVtID0+IFN0cmluZyhpdGVtLmlkKSkpXG4gICAgICAgICAgICBjb25zdCBhcHBlbmRlZCA9IG5leHRJdGVtcy5maWx0ZXIoaXRlbSA9PiAhZXhpc3RpbmdJZHMuaGFzKFN0cmluZyhpdGVtLmlkKSkpXG4gICAgICAgICAgICBjb25zdCB3aXRob3V0TWUgPSBwcmV2LmZpbHRlcihpdGVtID0+IFN0cmluZyhpdGVtLmlkKSAhPT0gU3RyaW5nKG1lSXRlbS5pZCkpXG4gICAgICAgICAgICByZXR1cm4gW21lSXRlbSwgLi4ud2l0aG91dE1lLCAuLi5hcHBlbmRlZF1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYubWFwKGl0ZW0gPT4gYCR7aXRlbS50eXBlfS0ke2l0ZW0uaWR9YCkpXG4gICAgICAgICAgY29uc3QgYXBwZW5kZWQgPSBuZXh0SXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWV4aXN0aW5nSWRzLmhhcyhgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICByZXR1cm4gWy4uLnByZXYsIC4uLmFwcGVuZGVkXVxuICAgICAgICB9KVxuICAgICAgICBzeW5jVXNlcnNQYWdpbmF0aW9uKGRhdGEpXG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UgPT09ICdjbGllbnRzLXNlYXJjaCcpIHtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBmZXRjaFNlYXJjaENsaWVudHMoe1xuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgZmlsdGVyOiB7IG5hbWU6IHEgfSxcbiAgICAgICAgICAgIHBhZ2U6IG5leHRQYWdlLFxuICAgICAgICAgICAgcGVyUGFnZTogMjAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc29sZS5pbmZvKCdbdXNlRW50aXR5U2VhcmNoXSBjbGllbnRzIGxvYWRNb3JlIHJlc3BvbnNlJywge1xuICAgICAgICAgIHBhZ2U6IGRhdGE/LmNsaWVudHM/LnBhZ2UsXG4gICAgICAgICAgbGFzdFBhZ2U6IGRhdGE/LmNsaWVudHM/Lmxhc3RQYWdlLFxuICAgICAgICAgIGNvdW50OiBkYXRhPy5jbGllbnRzPy5kYXRhPy5sZW5ndGggPz8gMCxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgbmV4dEl0ZW1zID0gKGRhdGE/LmNsaWVudHM/LmRhdGEgPz8gW10pLm1hcChjID0+IG1hcENsaWVudFRvSXRlbShjLCBxKSlcbiAgICAgICAgc2V0SXRlbXMocHJldiA9PiB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYubWFwKGl0ZW0gPT4gYCR7aXRlbS50eXBlfS0ke2l0ZW0uaWR9YCkpXG4gICAgICAgICAgY29uc3QgYXBwZW5kZWQgPSBuZXh0SXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWV4aXN0aW5nSWRzLmhhcyhgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICByZXR1cm4gWy4uLnByZXYsIC4uLmFwcGVuZGVkXVxuICAgICAgICB9KVxuICAgICAgICBzeW5jQ2xpZW50c1BhZ2luYXRpb24oZGF0YSlcbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZlUGFnaW5hdGlvblNvdXJjZSA9PT0gJ3Rhc2stZmFsbGJhY2snKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge31cbiAgICAgICAgaWYgKHN0YWJsZVNjb3BlLnByb2plY3RJZCAhPT0gbnVsbCAmJiBzdGFibGVTY29wZS5wcm9qZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBzdGFibGVTY29wZS5wcm9qZWN0SWQgIT09ICcnKSB7XG4gICAgICAgICAgZmlsdGVyLnByb2plY3RJZHMgPSBbU3RyaW5nKHN0YWJsZVNjb3BlLnByb2plY3RJZCldXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSBudWxsICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgc3RhYmxlU2NvcGUuY2xpZW50SWQgIT09ICcnKSB7XG4gICAgICAgICAgZmlsdGVyLmNsaWVudElkcyA9IFtTdHJpbmcoc3RhYmxlU2NvcGUuY2xpZW50SWQpXVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgZmV0Y2hUYXNrRmFtaWx5RmFsbGJhY2soe1xuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgZmlsdGVyOiB7IGFyY2hpdmVkOiBmYWxzZSwgLi4uZmlsdGVyIH0sXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7IG9mZnNldDogKG5leHRQYWdlIC0gMSkgKiAyMCwgc2l6ZTogMjAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBjb25zb2xlLmluZm8oJ1t1c2VFbnRpdHlTZWFyY2hdIHRhc2sgZmFsbGJhY2sgbG9hZE1vcmUgcmVzcG9uc2UnLCB7XG4gICAgICAgICAgcGFnZTogZGF0YT8udGFza0ZhbWlseT8ucGFnZSxcbiAgICAgICAgICBsYXN0UGFnZTogZGF0YT8udGFza0ZhbWlseT8ubGFzdFBhZ2UsXG4gICAgICAgICAgY291bnQ6IGRhdGE/LnRhc2tGYW1pbHk/LmRhdGE/Lmxlbmd0aCA/PyAwLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBuZXh0SXRlbXMgPSAoZGF0YT8udGFza0ZhbWlseT8uZGF0YSA/PyBbXSlcbiAgICAgICAgICAubWFwKG5vcm1hbGl6ZVRhc2tGYW1pbHlSZWNvcmQpXG4gICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgUmVjZW50VGFza0l0ZW0gPT4gaXRlbSAhPT0gbnVsbClcbiAgICAgICAgICAubWFwKHRhc2sgPT4gbWFwUmVjZW50VGFza1RvSXRlbSh0YXNrLCAnJywgc2hvd1Byb2plY3ROYW1lSW5UYXNrUm93KSlcbiAgICAgICAgc2V0SXRlbXMocHJldiA9PiB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYubWFwKGl0ZW0gPT4gYCR7aXRlbS50eXBlfS0ke2l0ZW0uaWR9YCkpXG4gICAgICAgICAgY29uc3QgYXBwZW5kZWQgPSBuZXh0SXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWV4aXN0aW5nSWRzLmhhcyhgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICByZXR1cm4gWy4uLnByZXYsIC4uLmFwcGVuZGVkXVxuICAgICAgICB9KVxuICAgICAgICBzeW5jVGFza0ZhbGxiYWNrUGFnaW5hdGlvbihkYXRhKVxuICAgICAgfSBlbHNlIGlmIChhY3RpdmVQYWdpbmF0aW9uU291cmNlID09PSAncHJvamVjdC1mYWxsYmFjaycpIHtcbiAgICAgICAgY29uc3QgYXJndW1lbnRzRmlsdGVyID1cbiAgICAgICAgICBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gbnVsbCAmJiBzdGFibGVTY29wZS5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHN0YWJsZVNjb3BlLmNsaWVudElkICE9PSAnJ1xuICAgICAgICAgICAgPyB7IGNsaWVudF9pZDogW1N0cmluZyhzdGFibGVTY29wZS5jbGllbnRJZCldIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgZmV0Y2hQcm9qZWN0c0ZhbGxiYWNrKHtcbiAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgIC4uLihhcmd1bWVudHNGaWx0ZXIgPyB7IGFyZ3VtZW50czogYXJndW1lbnRzRmlsdGVyIH0gOiB7fSksXG4gICAgICAgICAgICBwYWdlOiBuZXh0UGFnZSxcbiAgICAgICAgICAgIHBlclBhZ2U6IDIwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnNvbGUuaW5mbygnW3VzZUVudGl0eVNlYXJjaF0gcHJvamVjdCBmYWxsYmFjayBsb2FkTW9yZSByZXNwb25zZScsIHtcbiAgICAgICAgICBwYWdlOiBkYXRhPy5wcm9qZWN0cz8ucGFnZSxcbiAgICAgICAgICBsYXN0UGFnZTogZGF0YT8ucHJvamVjdHM/Lmxhc3RQYWdlLFxuICAgICAgICAgIGNvdW50OiBkYXRhPy5wcm9qZWN0cz8uZGF0YT8ubGVuZ3RoID8/IDAsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IG5leHRJdGVtcyA9IChkYXRhPy5wcm9qZWN0cz8uZGF0YSA/PyBbXSlcbiAgICAgICAgICAubWFwKG5vcm1hbGl6ZVByb2plY3RzRmFsbGJhY2tSZWNvcmQpXG4gICAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgUmF3U2VhcmNoUmVzdWx0ID0+IGl0ZW0gIT09IG51bGwpXG4gICAgICAgICAgLm1hcChpdGVtID0+IG1hcFNlYXJjaFRvSXRlbShpdGVtLCAncHJvamVjdCcsICcnKSlcbiAgICAgICAgc2V0SXRlbXMocHJldiA9PiB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KHByZXYubWFwKGl0ZW0gPT4gYCR7aXRlbS50eXBlfS0ke2l0ZW0uaWR9YCkpXG4gICAgICAgICAgY29uc3QgYXBwZW5kZWQgPSBuZXh0SXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWV4aXN0aW5nSWRzLmhhcyhgJHtpdGVtLnR5cGV9LSR7aXRlbS5pZH1gKSlcbiAgICAgICAgICByZXR1cm4gWy4uLnByZXYsIC4uLmFwcGVuZGVkXVxuICAgICAgICB9KVxuICAgICAgICBzeW5jUHJvamVjdEZhbGxiYWNrUGFnaW5hdGlvbihkYXRhKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW3VzZUVudGl0eVNlYXJjaF0gbG9hZE1vcmUgZmFpbGVkJywge1xuICAgICAgICBzb3VyY2U6IGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UsXG4gICAgICAgIG5leHRQYWdlLFxuICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgfSlcbiAgICAgIC8vIEV2aXRhIGxvb3AgZGUgcmVpbnRlbnRvcyBhdXRvbcOhdGljb3MgcG9yIHNjcm9sbCBjdWFuZG8gYmFja2VuZCBlc3TDoSBjYcOtZG8gKGVqLiA1MDMpLlxuICAgICAgc2V0RXJyb3IodHJ1ZSlcbiAgICAgIHNldEhhc01vcmUoZmFsc2UpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzTG9hZGluZ01vcmUoZmFsc2UpXG4gICAgICBjb25zb2xlLmluZm8oJ1t1c2VFbnRpdHlTZWFyY2hdIGxvYWRNb3JlIGZpbmlzaGVkJywgeyBzb3VyY2U6IGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UsIG5leHRQYWdlIH0pXG4gICAgfVxuICB9LCBbXG4gICAgaXNMb2FkaW5nTW9yZSxcbiAgICBoYXNNb3JlLFxuICAgIGN1cnJlbnRQYWdlLFxuICAgIGFjdGl2ZVBhZ2luYXRpb25Tb3VyY2UsXG4gICAgZGVib3VuY2VkU2VhcmNoVmFsdWUsXG4gICAgZmV0Y2hVc2Vyc0RpcmVjdG9yeSxcbiAgICBmZXRjaFNlYXJjaENsaWVudHMsXG4gICAgZmV0Y2hUYXNrRmFtaWx5RmFsbGJhY2ssXG4gICAgZmV0Y2hQcm9qZWN0c0ZhbGxiYWNrLFxuICAgIHN0YWJsZVNjb3BlLnByb2plY3RJZCxcbiAgICBzdGFibGVTY29wZS5jbGllbnRJZCxcbiAgICBzaG93UHJvamVjdE5hbWVJblRhc2tSb3csXG4gICAgY29yVXNlcixcbiAgICB0LFxuICAgIHN5bmNDbGllbnRzUGFnaW5hdGlvbixcbiAgICBzeW5jVXNlcnNQYWdpbmF0aW9uLFxuICAgIHN5bmNUYXNrRmFsbGJhY2tQYWdpbmF0aW9uLFxuICAgIHN5bmNQcm9qZWN0RmFsbGJhY2tQYWdpbmF0aW9uLFxuICBdKVxuXG4gIC8vIEN1YW5kbyBzZSBsaW1waWEgZWwgc2VhcmNoLCB2b2x2ZXIgYSByZWNlbnRzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFkZWJvdW5jZWRTZWFyY2hWYWx1ZS50cmltKCkpIHtcbiAgICAgIGZldGNoUmVjZW50KClcbiAgICB9XG4gIH0sIFtkZWJvdW5jZWRTZWFyY2hWYWx1ZSwgZmV0Y2hSZWNlbnRdKVxuXG4gIHJldHVybiB7XG4gICAgaXRlbXMsXG4gICAgbG9hZGluZyxcbiAgICBlcnJvcixcbiAgICBoaWRlUmVjZW50c0xhYmVsLFxuICAgIGhhc01vcmUsXG4gICAgaXNMb2FkaW5nTW9yZSxcbiAgICBsb2FkTW9yZSxcbiAgICBzZWFyY2hWYWx1ZSxcbiAgICB1cGRhdGVTZWFyY2hWYWx1ZTogc2V0U2VhcmNoVmFsdWUsXG4gICAgZmV0Y2hSZWNlbnQsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLFNBQVNBLFlBQVksUUFBUSxnQkFBZ0I7QUFDN0MsU0FBU0MsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLE9BQU8sRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFDakUsU0FBU0MsZ0JBQWdCLFFBQVEsaURBQWlEO0FBQ2xGLFNBQVNDLGlCQUFpQixRQUFRLG1EQUFtRDtBQUNyRixTQUFTQyxjQUFjLFFBQVEsNkNBQTZDO0FBRTVFLFNBQVNDLE9BQU8sUUFBUSxxQkFBcUI7QUFDN0MsU0FBU0MsaUJBQWlCLEVBQUVDLGVBQWUsRUFBRUMsb0JBQW9CLFFBQVEscUNBQXFDO0FBQzlHLFNBQVNDLGNBQWMsUUFBUSxxQ0FBcUM7QUFDcEUsU0FBU0MsZUFBZSxRQUFRLHVDQUF1QztBQUN2RSxTQUFTQyx3QkFBd0IsUUFBUSxxQkFBcUI7QUFDOUQsU0FBU0MsV0FBVyxRQUFRLGVBQWU7QUFDM0MsU0FBU0MsSUFBSSxRQUFRLFFBQVE7QUF3RjdCLElBQU1DLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUlDLEtBQWMsRUFBRUMsUUFBZ0IsRUFBYTtFQUN6RSxJQUFNQyxNQUFNLEdBQUdDLE1BQU0sQ0FBQ0gsS0FBSyxDQUFDO0VBQzVCLElBQUksQ0FBQ0csTUFBTSxDQUFDQyxRQUFRLENBQUNGLE1BQU0sQ0FBQyxFQUFFLE9BQU9ELFFBQVE7RUFDN0MsSUFBTUksVUFBVSxHQUFHQyxJQUFJLENBQUNDLEtBQUssQ0FBQ0wsTUFBTSxDQUFDO0VBQ3JDLE9BQU9HLFVBQVUsR0FBRyxDQUFDLEdBQUdBLFVBQVUsR0FBR0os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