@projectcor/maia-components 2.11.40-4 → 2.11.40-5

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 (82) hide show
  1. package/lib/App.js +11 -22
  2. package/lib/components/atoms/MAIAInput/MAIAInput.js +321 -238
  3. package/lib/components/atoms/MAIAInput/styles.js +46 -75
  4. package/lib/components/atoms/icons/index.js +1 -2
  5. package/lib/components/index.js +1 -2
  6. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +4 -8
  7. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +3 -31
  8. package/lib/components/molecules/ChatAIMessages/newStyles.js +2 -5
  9. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +71 -9
  10. package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -5
  11. package/lib/components/molecules/Sidebar/Sidebar.js +5 -9
  12. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +2 -6
  13. package/lib/components/organisms/ChatAI/ChatAI.js +37 -4
  14. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +2 -5
  15. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +3 -6
  16. package/lib/constants/config.js +1 -3
  17. package/lib/context/cor-user.js +1 -1
  18. package/lib/context/global-context.js +5 -1
  19. package/lib/dev/Providers.js +6 -11
  20. package/lib/hooks/useChatManager/useChatManager.interface.js +1 -1
  21. package/lib/hooks/useChatManager/useChatManager.js +24 -22
  22. package/lib/hooks/useChatMessages/useChatMessages.interface.js +1 -1
  23. package/lib/hooks/useChatMessages/useChatMessages.js +14 -30
  24. package/lib/hooks/useClientSearch.js +2 -3
  25. package/lib/hooks/useEvent.js +1 -6
  26. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +4 -6
  27. package/lib/hooks/useProjectSearch.js +2 -3
  28. package/lib/hooks/useRecentClientsSearch.js +2 -3
  29. package/lib/hooks/useTaskPanel.js +10 -3
  30. package/lib/lang/br/index.js +1 -24
  31. package/lib/lang/en/index.js +1 -24
  32. package/lib/lang/es/index.js +1 -24
  33. package/lib/lang/fr/index.js +1 -23
  34. package/lib/services/maia/Chats/getChatMessages.js +4 -29
  35. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +8 -4
  36. package/lib/services/maia/Orchestrator/orchestrator.js +11 -8
  37. package/lib/services/maia/RecentProjects/getRecentProjects.js +4 -12
  38. package/lib/services/utils/mapChatMessages.js +5 -12
  39. package/lib/types/Chat.js +1 -1
  40. package/lib/types/agent.js +1 -1
  41. package/package.json +1 -1
  42. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +0 -36
  43. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +0 -181
  44. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +0 -39
  45. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +0 -324
  46. package/lib/components/atoms/ContextMentionChip/index.js +0 -4
  47. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +0 -195
  48. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +0 -6
  49. package/lib/components/atoms/ContextMentionEditor/index.js +0 -2
  50. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +0 -283
  51. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +0 -111
  52. package/lib/components/atoms/ContextMentionItem/index.js +0 -2
  53. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +0 -142
  54. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +0 -75
  55. package/lib/components/atoms/ContextMentionPopover/index.js +0 -3
  56. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +0 -269
  57. package/lib/components/atoms/icons/NotionIcon.js +0 -36
  58. package/lib/components/atoms/icons/SubtaskIcon.js +0 -36
  59. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +0 -68
  60. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +0 -6
  61. package/lib/components/molecules/ContextMentionInput/index.js +0 -2
  62. package/lib/constants/taskLinkIcon.js +0 -6
  63. package/lib/dev/DevContextMentionInput.js +0 -65
  64. package/lib/hooks/useCaretPosition.js +0 -35
  65. package/lib/hooks/useContextMentions.js +0 -270
  66. package/lib/hooks/useEntitySearch.js +0 -545
  67. package/lib/hooks/useMentionAllowedTypes.js +0 -103
  68. package/lib/hooks/useMentionPopover.js +0 -320
  69. package/lib/hooks/useTextOverflowEllipsisTooltip.js +0 -35
  70. package/lib/services/maia/RecentTasks/getRecentTasks.js +0 -54
  71. package/lib/services/maia/RecentTasks/index.js +0 -6
  72. package/lib/services/maia/RecentUsers/getRecentUsers.js +0 -59
  73. package/lib/services/maia/RecentUsers/index.js +0 -6
  74. package/lib/services/query/entitySearchQuery.js +0 -16
  75. package/lib/services/query/usersDirectoryQuery.js +0 -19
  76. package/lib/types/contextMention.js +0 -37
  77. package/lib/utils/contextMentionIcons.js +0 -115
  78. package/lib/utils/contextMentionLabel.js +0 -4
  79. package/lib/utils/contextMentionTypeLabel.js +0 -17
  80. package/lib/utils/maiaStreamdownRehypePlugins.js +0 -27
  81. package/lib/utils/openTaskInCorPanel.js +0 -18
  82. package/lib/utils/renderContextMentions.js +0 -293
@@ -1,293 +0,0 @@
1
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
- import styled, { css } from 'styled-components';
3
- import { CONTEXT_MENTION_CHIP_CLASS } from '../types/contextMention';
4
- import { MENTION_CHIP_COLORS, MENTION_CHIP_NON_TASK_HOVER_BG } from '../components/atoms/ContextMentionChip/ContextMentionChip.styles';
5
- import { SCTaskLink } from '../components/molecules/ChatAIMessages/newStyles';
6
- import { getContextMentionIcon } from './contextMentionIcons';
7
- import { normalizeContextMentionLabel } from './contextMentionLabel';
8
- import { openTaskInCorPanel } from './openTaskInCorPanel';
9
-
10
- /**
11
- * Formato del marcador que viaja en el texto del mensaje:
12
- * [[mention:<type>:<id>|<label>]]
13
- *
14
- * El editor lo emite cuando serializa el contenteditable, el backend lo
15
- * persiste tal cual y al renderizar se transforma en un link markdown con
16
- * un protocolo propio que `CustomLink` intercepta y dibuja como span
17
- * estilado.
18
- *
19
- * Por separado, la metadata `context_message` lleva los valores limpios
20
- * (id + name) para que el backend pueda interpretar las entidades sin
21
- * tener que parsear el texto.
22
- */
23
- /**
24
- * Label puede contener `]` (ej: "[Educate]Blog Post ..."), por eso
25
- * se captura de forma lazy hasta el cierre real `]]`.
26
- */
27
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
28
- export var MENTION_MARKER_REGEX = /\[\[mention:(client|project|task|user|mcp):([^|\]]+)\|([\s\S]*?)\]\]/g;
29
- export var MAIA_MENTION_PROTOCOL = 'maia-mention://';
30
- var INCOMPLETE_MENTION_MARKER_REGEX = /\[\[mention:[\s\S]*$/;
31
- var ALLOWED_TYPES = ['client', 'project', 'task', 'user', 'mcp'];
32
- var parseMentionProtocolHref = function parseMentionProtocolHref(href) {
33
- var rest = href.slice(MAIA_MENTION_PROTOCOL.length);
34
- var slashIdx = rest.indexOf('/');
35
- var rawType = slashIdx >= 0 ? rest.slice(0, slashIdx) : rest;
36
- var rawId = slashIdx >= 0 ? rest.slice(slashIdx + 1) : '';
37
- var id = '';
38
- try {
39
- id = rawId ? decodeURIComponent(rawId) : '';
40
- } catch (_unused) {
41
- id = rawId;
42
- }
43
- var type = ALLOWED_TYPES.includes(rawType) ? rawType : 'user';
44
- return {
45
- type: type,
46
- id: id
47
- };
48
- };
49
-
50
- /** Genera el marcador para un mention dado. Lo usa el editor al serializar. */
51
- export var serializeMention = function serializeMention(mention) {
52
- return "[[mention:".concat(mention.type, ":").concat(mention.id, "|").concat(mention.label, "]]");
53
- };
54
-
55
- /**
56
- * Convierte cada `[[mention:...]]` en un link markdown con protocolo propio
57
- * para que Streamdown lo emita como `<a>` y `CustomLink` lo intercepte.
58
- */
59
- export var transformMentionMarkers = function transformMentionMarkers(text) {
60
- if (!text) return text;
61
- return text.replace(MENTION_MARKER_REGEX, function (_m, type, id, label) {
62
- var safeLabel = String(label).replace(/[\\\]]/g, '\\$&');
63
- return "[".concat(safeLabel, "](").concat(MAIA_MENTION_PROTOCOL).concat(type, "/").concat(encodeURIComponent(String(id)), ")");
64
- });
65
- };
66
- var mentionChildrenToLabel = function mentionChildrenToLabel(children) {
67
- if (typeof children === 'string') return normalizeContextMentionLabel(children);
68
- if (children == null || children === false) return '';
69
- if (Array.isArray(children)) {
70
- return normalizeContextMentionLabel(children.map(function (c) {
71
- return typeof c === 'string' ? c : '';
72
- }).join(''));
73
- }
74
- return normalizeContextMentionLabel(String(children));
75
- };
76
- var inlineMentionHoverCss = function inlineMentionHoverCss(isClickable) {
77
- return css(["background:", ";opacity:", ";"], MENTION_CHIP_NON_TASK_HOVER_BG, isClickable ? 0.95 : 1);
78
- };
79
-
80
- /** Span inline estilado (menciones no-task en chat). */
81
- var SCInlineMention = styled.span.withConfig({
82
- displayName: "renderContextMentions__SCInlineMention",
83
- componentId: "sc-f3uz3m-0"
84
- })(["display:inline;padding:2px 4px;margin:0 1px;border-radius:4px;font-family:var(--cor-typography-font-family,'Work Sans');font-weight:500;font-size:inherit;line-height:inherit;background:", ";color:", ";white-space:normal;overflow-wrap:break-word;word-break:break-word;cursor:", ";text-decoration:none;box-sizing:border-box;&:hover{", "}"], function (_ref) {
85
- var _MENTION_CHIP_COLORS$;
86
- var $type = _ref.$type;
87
- return ((_MENTION_CHIP_COLORS$ = MENTION_CHIP_COLORS[$type]) !== null && _MENTION_CHIP_COLORS$ !== void 0 ? _MENTION_CHIP_COLORS$ : MENTION_CHIP_COLORS.user).bg;
88
- }, function (_ref2) {
89
- var _MENTION_CHIP_COLORS$2;
90
- var $type = _ref2.$type;
91
- return ((_MENTION_CHIP_COLORS$2 = MENTION_CHIP_COLORS[$type]) !== null && _MENTION_CHIP_COLORS$2 !== void 0 ? _MENTION_CHIP_COLORS$2 : MENTION_CHIP_COLORS.user).fg;
92
- }, function (_ref3) {
93
- var $isClickable = _ref3.$isClickable;
94
- return $isClickable ? 'pointer' : 'default';
95
- }, function (_ref4) {
96
- var $isClickable = _ref4.$isClickable;
97
- return inlineMentionHoverCss($isClickable);
98
- });
99
- var SCInlineMentionIcon = styled.span.withConfig({
100
- displayName: "renderContextMentions__SCInlineMentionIcon",
101
- componentId: "sc-f3uz3m-1"
102
- })(["display:inline-block;vertical-align:middle;margin-right:2px;line-height:1;width:", ";height:", ";"], function (_ref5) {
103
- var $task = _ref5.$task;
104
- return $task ? '16px' : '14px';
105
- }, function (_ref6) {
106
- var $task = _ref6.$task;
107
- return $task ? '16px' : '14px';
108
- });
109
-
110
- /**
111
- * Si el href corresponde al protocolo de mention, devuelve un nodo estilado por tipo.
112
- * Las tareas usan `<a>` como los enlaces de tarea del agente (`.has-task-links`).
113
- */
114
- export var renderMentionLink = function renderMentionLink(href, children) {
115
- if (!href || !href.startsWith(MAIA_MENTION_PROTOCOL)) return null;
116
- var _parseMentionProtocol = parseMentionProtocolHref(href),
117
- type = _parseMentionProtocol.type,
118
- id = _parseMentionProtocol.id;
119
- var label = mentionChildrenToLabel(children);
120
- var isTask = type === 'task';
121
- var iconSize = isTask ? 16 : 14;
122
- var taskUrl = "/tasks/".concat(id, "/detail");
123
- var handleTaskClick = function handleTaskClick(e) {
124
- if (e.metaKey || e.ctrlKey) return;
125
- e.preventDefault();
126
- e.stopPropagation();
127
- openTaskInCorPanel(id, 'detail');
128
- };
129
- var handleTaskKeyDown = function handleTaskKeyDown(e) {
130
- if (e.key !== 'Enter' && e.key !== ' ') return;
131
- e.preventDefault();
132
- openTaskInCorPanel(id, 'detail');
133
- };
134
- if (isTask) {
135
- return /*#__PURE__*/_jsx(SCTaskLink, {
136
- href: taskUrl,
137
- className: CONTEXT_MENTION_CHIP_CLASS,
138
- "data-mention-type": type,
139
- "data-mention-surface": "chat",
140
- onClick: handleTaskClick,
141
- onKeyDown: handleTaskKeyDown,
142
- children: label
143
- });
144
- }
145
- var isProject = type === 'project';
146
- var projectUrl = isProject ? "/project/".concat(id, "/dashboard") : null;
147
- var handleProjectClick = function handleProjectClick(e) {
148
- if (!projectUrl) return;
149
- e.preventDefault();
150
- e.stopPropagation();
151
- window.open(projectUrl, '_blank');
152
- };
153
- return /*#__PURE__*/_jsxs(SCInlineMention, {
154
- $type: type,
155
- $isClickable: isProject,
156
- className: CONTEXT_MENTION_CHIP_CLASS,
157
- "data-mention-type": type,
158
- "data-mention-surface": "chat",
159
- onClick: isProject ? handleProjectClick : undefined,
160
- role: isProject ? 'button' : undefined,
161
- tabIndex: isProject ? 0 : undefined,
162
- children: [/*#__PURE__*/_jsx(SCInlineMentionIcon, {
163
- $task: isTask,
164
- children: getContextMentionIcon(type, MENTION_CHIP_COLORS[type].fg, id, iconSize)
165
- }), label]
166
- });
167
- };
168
-
169
- /** Quita los markers del texto, dejando solo `label`. Útil para fallback plano. */
170
- export var stripMentionMarkers = function stripMentionMarkers(text) {
171
- return text.replace(MENTION_MARKER_REGEX, function (_m, _type, _id, label) {
172
- return normalizeContextMentionLabel(String(label));
173
- });
174
- };
175
-
176
- /**
177
- * Títulos de conversación (p. ej. `last_question` derivado del primer mensaje) pueden
178
- * incluir el texto serializado `[[mention:type:id|label]]`. Para sidebar y listados,
179
- * reemplaza cada bloque por `label` en texto plano, sin el marcador crudo.
180
- */
181
- export var formatChatListTitleMentions = function formatChatListTitleMentions(text) {
182
- if (text == null || text === '') return text !== null && text !== void 0 ? text : '';
183
- var withoutCompleteMarkers = text.replace(MENTION_MARKER_REGEX, function (_m, _type, _id, label) {
184
- return normalizeContextMentionLabel(String(label).trim());
185
- });
186
- return withoutCompleteMarkers.replace(INCOMPLETE_MENTION_MARKER_REGEX, '').trim();
187
- };
188
-
189
- /** Genera la URL de navegación para un mention según su tipo. */
190
- var getMentionUrl = function getMentionUrl(type, id) {
191
- switch (type) {
192
- case 'client':
193
- return "/clients/".concat(id);
194
- case 'project':
195
- return "/project/".concat(id, "/dashboard");
196
- case 'task':
197
- return "/tasks/".concat(id, "/detail");
198
- case 'user':
199
- return null;
200
- // Los users no son clickeables
201
- case 'mcp':
202
- return null;
203
- default:
204
- return null;
205
- }
206
- };
207
- var MentionChip = function MentionChip(_ref7) {
208
- var type = _ref7.type,
209
- id = _ref7.id,
210
- label = _ref7.label;
211
- var normalizedLabel = normalizeContextMentionLabel(label);
212
- var url = getMentionUrl(type, id);
213
- var isClickable = !!url;
214
- var isTask = type === 'task';
215
- var iconSize = isTask ? 16 : 14;
216
- var handleClick = function handleClick(e) {
217
- if (!isClickable || !url) return;
218
- if (type === 'task') {
219
- if (e.metaKey || e.ctrlKey) return;
220
- e.preventDefault();
221
- e.stopPropagation();
222
- openTaskInCorPanel(id, 'detail');
223
- return;
224
- }
225
- e.preventDefault();
226
- window.open(url, '_blank');
227
- };
228
- var handleKeyDown = function handleKeyDown(e) {
229
- if (!isClickable || type !== 'task') return;
230
- if (e.key !== 'Enter' && e.key !== ' ') return;
231
- e.preventDefault();
232
- openTaskInCorPanel(id, 'detail');
233
- };
234
- if (type === 'task') {
235
- return /*#__PURE__*/_jsx(SCTaskLink, {
236
- href: url !== null && url !== void 0 ? url : '#',
237
- className: CONTEXT_MENTION_CHIP_CLASS,
238
- "data-mention-type": "task",
239
- "data-mention-surface": "chat",
240
- onClick: handleClick,
241
- onKeyDown: handleKeyDown,
242
- children: normalizedLabel
243
- });
244
- }
245
- return /*#__PURE__*/_jsxs(SCInlineMention, {
246
- $type: type,
247
- $isClickable: isClickable,
248
- className: CONTEXT_MENTION_CHIP_CLASS,
249
- "data-mention-type": type,
250
- "data-mention-surface": "chat",
251
- onClick: isClickable ? handleClick : undefined,
252
- role: isClickable ? 'button' : undefined,
253
- tabIndex: isClickable ? 0 : undefined,
254
- children: [/*#__PURE__*/_jsx(SCInlineMentionIcon, {
255
- $task: isTask,
256
- children: getContextMentionIcon(type, MENTION_CHIP_COLORS[type].fg, id, iconSize)
257
- }), normalizedLabel]
258
- });
259
- };
260
-
261
- /**
262
- * Splitea el texto por markers y devuelve un array de ReactNodes:
263
- * texto plano + spans estilados para cada mention. Renderiza directamente
264
- * sin pasar por Streamdown (no soporta markdown en este modo).
265
- */
266
- export var renderTextWithMentions = function renderTextWithMentions(text) {
267
- if (!text) return [text];
268
- var out = [];
269
- var lastIdx = 0;
270
- MENTION_MARKER_REGEX.lastIndex = 0;
271
- var match = MENTION_MARKER_REGEX.exec(text);
272
- var keyIdx = 0;
273
- while (match) {
274
- if (match.index > lastIdx) out.push(text.slice(lastIdx, match.index));
275
- var _match = match,
276
- _match2 = _slicedToArray(_match, 4),
277
- rawType = _match2[1],
278
- id = _match2[2],
279
- label = _match2[3];
280
- var type = ALLOWED_TYPES.includes(rawType) ? rawType : 'user';
281
- out.push(/*#__PURE__*/_jsx(MentionChip, {
282
- type: type,
283
- id: id,
284
- label: label
285
- }, "mention-".concat(keyIdx, "-").concat(match.index)));
286
- lastIdx = match.index + match[0].length;
287
- keyIdx += 1;
288
- match = MENTION_MARKER_REGEX.exec(text);
289
- }
290
- if (lastIdx < text.length) out.push(text.slice(lastIdx));
291
- return out;
292
- };
293
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzdHlsZWQiLCJjc3MiLCJDT05URVhUX01FTlRJT05fQ0hJUF9DTEFTUyIsIk1FTlRJT05fQ0hJUF9DT0xPUlMiLCJNRU5USU9OX0NISVBfTk9OX1RBU0tfSE9WRVJfQkciLCJTQ1Rhc2tMaW5rIiwiZ2V0Q29udGV4dE1lbnRpb25JY29uIiwibm9ybWFsaXplQ29udGV4dE1lbnRpb25MYWJlbCIsIm9wZW5UYXNrSW5Db3JQYW5lbCIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJNRU5USU9OX01BUktFUl9SRUdFWCIsIk1BSUFfTUVOVElPTl9QUk9UT0NPTCIsIklOQ09NUExFVEVfTUVOVElPTl9NQVJLRVJfUkVHRVgiLCJBTExPV0VEX1RZUEVTIiwicGFyc2VNZW50aW9uUHJvdG9jb2xIcmVmIiwiaHJlZiIsInJlc3QiLCJzbGljZSIsImxlbmd0aCIsInNsYXNoSWR4IiwiaW5kZXhPZiIsInJhd1R5cGUiLCJyYXdJZCIsImlkIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiX3VudXNlZCIsInR5cGUiLCJpbmNsdWRlcyIsInNlcmlhbGl6ZU1lbnRpb24iLCJtZW50aW9uIiwiY29uY2F0IiwibGFiZWwiLCJ0cmFuc2Zvcm1NZW50aW9uTWFya2VycyIsInRleHQiLCJyZXBsYWNlIiwiX20iLCJzYWZlTGFiZWwiLCJTdHJpbmciLCJlbmNvZGVVUklDb21wb25lbnQiLCJtZW50aW9uQ2hpbGRyZW5Ub0xhYmVsIiwiY2hpbGRyZW4iLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJjIiwiam9pbiIsImlubGluZU1lbnRpb25Ib3ZlckNzcyIsImlzQ2xpY2thYmxlIiwiU0NJbmxpbmVNZW50aW9uIiwic3BhbiIsIndpdGhDb25maWciLCJkaXNwbGF5TmFtZSIsImNvbXBvbmVudElkIiwiX3JlZiIsIl9NRU5USU9OX0NISVBfQ09MT1JTJCIsIiR0eXBlIiwidXNlciIsImJnIiwiX3JlZjIiLCJfTUVOVElPTl9DSElQX0NPTE9SUyQyIiwiZmciLCJfcmVmMyIsIiRpc0NsaWNrYWJsZSIsIl9yZWY0IiwiU0NJbmxpbmVNZW50aW9uSWNvbiIsIl9yZWY1IiwiJHRhc2siLCJfcmVmNiIsInJlbmRlck1lbnRpb25MaW5rIiwic3RhcnRzV2l0aCIsIl9wYXJzZU1lbnRpb25Qcm90b2NvbCIsImlzVGFzayIsImljb25TaXplIiwidGFza1VybCIsImhhbmRsZVRhc2tDbGljayIsImUiLCJtZXRhS2V5IiwiY3RybEtleSIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwiaGFuZGxlVGFza0tleURvd24iLCJrZXkiLCJjbGFzc05hbWUiLCJvbkNsaWNrIiwib25LZXlEb3duIiwiaXNQcm9qZWN0IiwicHJvamVjdFVybCIsImhhbmRsZVByb2plY3RDbGljayIsIndpbmRvdyIsIm9wZW4iLCJ1bmRlZmluZWQiLCJyb2xlIiwidGFiSW5kZXgiLCJzdHJpcE1lbnRpb25NYXJrZXJzIiwiX3R5cGUiLCJfaWQiLCJmb3JtYXRDaGF0TGlzdFRpdGxlTWVudGlvbnMiLCJ3aXRob3V0Q29tcGxldGVNYXJrZXJzIiwidHJpbSIsImdldE1lbnRpb25VcmwiLCJNZW50aW9uQ2hpcCIsIl9yZWY3Iiwibm9ybWFsaXplZExhYmVsIiwidXJsIiwiaGFuZGxlQ2xpY2siLCJoYW5kbGVLZXlEb3duIiwicmVuZGVyVGV4dFdpdGhNZW50aW9ucyIsIm91dCIsImxhc3RJZHgiLCJsYXN0SW5kZXgiLCJtYXRjaCIsImV4ZWMiLCJrZXlJZHgiLCJpbmRleCIsInB1c2giLCJfbWF0Y2giLCJfbWF0Y2gyIiwiX3NsaWNlZFRvQXJyYXkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcmVuZGVyQ29udGV4dE1lbnRpb25zLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWFjdE5vZGUsIFJlYWN0RWxlbWVudCwgTW91c2VFdmVudCwgS2V5Ym9hcmRFdmVudCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHN0eWxlZCwgeyBjc3MgfSBmcm9tICdzdHlsZWQtY29tcG9uZW50cydcbmltcG9ydCB7IENvbnRleHRFbnRpdHlUeXBlLCBDb250ZXh0TWVudGlvbiwgQ09OVEVYVF9NRU5USU9OX0NISVBfQ0xBU1MgfSBmcm9tICcuLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB7XG4gIE1FTlRJT05fQ0hJUF9DT0xPUlMsXG4gIE1FTlRJT05fQ0hJUF9OT05fVEFTS19IT1ZFUl9CRyxcbn0gZnJvbSAnLi4vY29tcG9uZW50cy9hdG9tcy9Db250ZXh0TWVudGlvbkNoaXAvQ29udGV4dE1lbnRpb25DaGlwLnN0eWxlcydcbmltcG9ydCB7IFNDVGFza0xpbmsgfSBmcm9tICcuLi9jb21wb25lbnRzL21vbGVjdWxlcy9DaGF0QUlNZXNzYWdlcy9uZXdTdHlsZXMnXG5pbXBvcnQgeyBnZXRDb250ZXh0TWVudGlvbkljb24gfSBmcm9tICcuL2NvbnRleHRNZW50aW9uSWNvbnMnXG5pbXBvcnQgeyBub3JtYWxpemVDb250ZXh0TWVudGlvbkxhYmVsIH0gZnJvbSAnLi9jb250ZXh0TWVudGlvbkxhYmVsJ1xuaW1wb3J0IHsgb3BlblRhc2tJbkNvclBhbmVsIH0gZnJvbSAnLi9vcGVuVGFza0luQ29yUGFuZWwnXG5cbi8qKlxuICogRm9ybWF0byBkZWwgbWFyY2Fkb3IgcXVlIHZpYWphIGVuIGVsIHRleHRvIGRlbCBtZW5zYWplOlxuICogICBbW21lbnRpb246PHR5cGU+OjxpZD58PGxhYmVsPl1dXG4gKlxuICogRWwgZWRpdG9yIGxvIGVtaXRlIGN1YW5kbyBzZXJpYWxpemEgZWwgY29udGVudGVkaXRhYmxlLCBlbCBiYWNrZW5kIGxvXG4gKiBwZXJzaXN0ZSB0YWwgY3VhbCB5IGFsIHJlbmRlcml6YXIgc2UgdHJhbnNmb3JtYSBlbiB1biBsaW5rIG1hcmtkb3duIGNvblxuICogdW4gcHJvdG9jb2xvIHByb3BpbyBxdWUgYEN1c3RvbUxpbmtgIGludGVyY2VwdGEgeSBkaWJ1amEgY29tbyBzcGFuXG4gKiBlc3RpbGFkby5cbiAqXG4gKiBQb3Igc2VwYXJhZG8sIGxhIG1ldGFkYXRhIGBjb250ZXh0X21lc3NhZ2VgIGxsZXZhIGxvcyB2YWxvcmVzIGxpbXBpb3NcbiAqIChpZCArIG5hbWUpIHBhcmEgcXVlIGVsIGJhY2tlbmQgcHVlZGEgaW50ZXJwcmV0YXIgbGFzIGVudGlkYWRlcyBzaW5cbiAqIHRlbmVyIHF1ZSBwYXJzZWFyIGVsIHRleHRvLlxuICovXG4vKipcbiAqIExhYmVsIHB1ZWRlIGNvbnRlbmVyIGBdYCAoZWo6IFwiW0VkdWNhdGVdQmxvZyBQb3N0IC4uLlwiKSwgcG9yIGVzb1xuICogc2UgY2FwdHVyYSBkZSBmb3JtYSBsYXp5IGhhc3RhIGVsIGNpZXJyZSByZWFsIGBdXWAuXG4gKi9cbmV4cG9ydCBjb25zdCBNRU5USU9OX01BUktFUl9SRUdFWCA9IC9cXFtcXFttZW50aW9uOihjbGllbnR8cHJvamVjdHx0YXNrfHVzZXJ8bWNwKTooW158XFxdXSspXFx8KFtcXHNcXFNdKj8pXFxdXFxdL2dcbmV4cG9ydCBjb25zdCBNQUlBX01FTlRJT05fUFJPVE9DT0wgPSAnbWFpYS1tZW50aW9uOi8vJ1xuY29uc3QgSU5DT01QTEVURV9NRU5USU9OX01BUktFUl9SRUdFWCA9IC9cXFtcXFttZW50aW9uOltcXHNcXFNdKiQvXG5cbmNvbnN0IEFMTE9XRURfVFlQRVM6IENvbnRleHRFbnRpdHlUeXBlW10gPSBbJ2NsaWVudCcsICdwcm9qZWN0JywgJ3Rhc2snLCAndXNlcicsICdtY3AnXVxuXG5jb25zdCBwYXJzZU1lbnRpb25Qcm90b2NvbEhyZWYgPSAoaHJlZjogc3RyaW5nKTogeyB0eXBlOiBDb250ZXh0RW50aXR5VHlwZTsgaWQ6IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgcmVzdCA9IGhyZWYuc2xpY2UoTUFJQV9NRU5USU9OX1BST1RPQ09MLmxlbmd0aClcbiAgY29uc3Qgc2xhc2hJZHggPSByZXN0LmluZGV4T2YoJy8nKVxuICBjb25zdCByYXdUeXBlID0gc2xhc2hJZHggPj0gMCA/IHJlc3Quc2xpY2UoMCwgc2xhc2hJZHgpIDogcmVzdFxuICBjb25zdCByYXdJZCA9IHNsYXNoSWR4ID49IDAgPyByZXN0LnNsaWNlKHNsYXNoSWR4ICsgMSkgOiAnJ1xuICBsZXQgaWQgPSAnJ1xuICB0cnkge1xuICAgIGlkID0gcmF3SWQgPyBkZWNvZGVVUklDb21wb25lbnQocmF3SWQpIDogJydcbiAgfSBjYXRjaCB7XG4gICAgaWQgPSByYXdJZFxuICB9XG4gIGNvbnN0IHR5cGUgPSBBTExPV0VEX1RZUEVTLmluY2x1ZGVzKHJhd1R5cGUgYXMgQ29udGV4dEVudGl0eVR5cGUpID8gKHJhd1R5cGUgYXMgQ29udGV4dEVudGl0eVR5cGUpIDogJ3VzZXInXG4gIHJldHVybiB7IHR5cGUsIGlkIH1cbn1cblxuLyoqIEdlbmVyYSBlbCBtYXJjYWRvciBwYXJhIHVuIG1lbnRpb24gZGFkby4gTG8gdXNhIGVsIGVkaXRvciBhbCBzZXJpYWxpemFyLiAqL1xuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZU1lbnRpb24gPSAobWVudGlvbjogQ29udGV4dE1lbnRpb24pOiBzdHJpbmcgPT5cbiAgYFtbbWVudGlvbjoke21lbnRpb24udHlwZX06JHttZW50aW9uLmlkfXwke21lbnRpb24ubGFiZWx9XV1gXG5cbi8qKlxuICogQ29udmllcnRlIGNhZGEgYFtbbWVudGlvbjouLi5dXWAgZW4gdW4gbGluayBtYXJrZG93biBjb24gcHJvdG9jb2xvIHByb3Bpb1xuICogcGFyYSBxdWUgU3RyZWFtZG93biBsbyBlbWl0YSBjb21vIGA8YT5gIHkgYEN1c3RvbUxpbmtgIGxvIGludGVyY2VwdGUuXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1NZW50aW9uTWFya2VycyA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXRleHQpIHJldHVybiB0ZXh0XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoTUVOVElPTl9NQVJLRVJfUkVHRVgsIChfbSwgdHlwZSwgaWQsIGxhYmVsKSA9PiB7XG4gICAgY29uc3Qgc2FmZUxhYmVsID0gU3RyaW5nKGxhYmVsKS5yZXBsYWNlKC9bXFxcXFxcXV0vZywgJ1xcXFwkJicpXG4gICAgcmV0dXJuIGBbJHtzYWZlTGFiZWx9XSgke01BSUFfTUVOVElPTl9QUk9UT0NPTH0ke3R5cGV9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhpZCkpfSlgXG4gIH0pXG59XG5cbmNvbnN0IG1lbnRpb25DaGlsZHJlblRvTGFiZWwgPSAoY2hpbGRyZW46IFJlYWN0Tm9kZSk6IHN0cmluZyA9PiB7XG4gIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdzdHJpbmcnKSByZXR1cm4gbm9ybWFsaXplQ29udGV4dE1lbnRpb25MYWJlbChjaGlsZHJlbilcbiAgaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4gPT09IGZhbHNlKSByZXR1cm4gJydcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUNvbnRleHRNZW50aW9uTGFiZWwoY2hpbGRyZW4ubWFwKGMgPT4gKHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAnJykpLmpvaW4oJycpKVxuICB9XG4gIHJldHVybiBub3JtYWxpemVDb250ZXh0TWVudGlvbkxhYmVsKFN0cmluZyhjaGlsZHJlbikpXG59XG5cbmNvbnN0IGlubGluZU1lbnRpb25Ib3ZlckNzcyA9IChpc0NsaWNrYWJsZT86IGJvb2xlYW4pID0+IGNzc2BcbiAgYmFja2dyb3VuZDogJHtNRU5USU9OX0NISVBfTk9OX1RBU0tfSE9WRVJfQkd9O1xuICBvcGFjaXR5OiAke2lzQ2xpY2thYmxlID8gMC45NSA6IDF9O1xuYFxuXG4vKiogU3BhbiBpbmxpbmUgZXN0aWxhZG8gKG1lbmNpb25lcyBuby10YXNrIGVuIGNoYXQpLiAqL1xuY29uc3QgU0NJbmxpbmVNZW50aW9uID0gc3R5bGVkLnNwYW48eyAkdHlwZTogQ29udGV4dEVudGl0eVR5cGU7ICRpc0NsaWNrYWJsZT86IGJvb2xlYW4gfT5gXG4gIGRpc3BsYXk6IGlubGluZTtcbiAgcGFkZGluZzogMnB4IDRweDtcbiAgbWFyZ2luOiAwIDFweDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBmb250LWZhbWlseTogdmFyKC0tY29yLXR5cG9ncmFwaHktZm9udC1mYW1pbHksICdXb3JrIFNhbnMnKTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgYmFja2dyb3VuZDogJHsoeyAkdHlwZSB9KSA9PiAoTUVOVElPTl9DSElQX0NPTE9SU1skdHlwZV0gPz8gTUVOVElPTl9DSElQX0NPTE9SUy51c2VyKS5iZ307XG4gIGNvbG9yOiAkeyh7ICR0eXBlIH0pID0+IChNRU5USU9OX0NISVBfQ09MT1JTWyR0eXBlXSA/PyBNRU5USU9OX0NISVBfQ09MT1JTLnVzZXIpLmZnfTtcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDtcbiAgd29yZC1icmVhazogYnJlYWstd29yZDtcbiAgY3Vyc29yOiAkeyh7ICRpc0NsaWNrYWJsZSB9KSA9PiAoJGlzQ2xpY2thYmxlID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnKX07XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcblxuICAmOmhvdmVyIHtcbiAgICAkeyh7ICRpc0NsaWNrYWJsZSB9KSA9PiBpbmxpbmVNZW50aW9uSG92ZXJDc3MoJGlzQ2xpY2thYmxlKX1cbiAgfVxuYFxuXG5jb25zdCBTQ0lubGluZU1lbnRpb25JY29uID0gc3R5bGVkLnNwYW48eyAkdGFzaz86IGJvb2xlYW4gfT5gXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICB3aWR0aDogJHsoeyAkdGFzayB9KSA9PiAoJHRhc2sgPyAnMTZweCcgOiAnMTRweCcpfTtcbiAgaGVpZ2h0OiAkeyh7ICR0YXNrIH0pID0+ICgkdGFzayA/ICcxNnB4JyA6ICcxNHB4Jyl9O1xuYFxuXG4vKipcbiAqIFNpIGVsIGhyZWYgY29ycmVzcG9uZGUgYWwgcHJvdG9jb2xvIGRlIG1lbnRpb24sIGRldnVlbHZlIHVuIG5vZG8gZXN0aWxhZG8gcG9yIHRpcG8uXG4gKiBMYXMgdGFyZWFzIHVzYW4gYDxhPmAgY29tbyBsb3MgZW5sYWNlcyBkZSB0YXJlYSBkZWwgYWdlbnRlIChgLmhhcy10YXNrLWxpbmtzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCByZW5kZXJNZW50aW9uTGluayA9IChocmVmOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNoaWxkcmVuOiBSZWFjdE5vZGUpOiBSZWFjdE5vZGUgfCBudWxsID0+IHtcbiAgaWYgKCFocmVmIHx8ICFocmVmLnN0YXJ0c1dpdGgoTUFJQV9NRU5USU9OX1BST1RPQ09MKSkgcmV0dXJuIG51bGxcbiAgY29uc3QgeyB0eXBlLCBpZCB9ID0gcGFyc2VNZW50aW9uUHJvdG9jb2xIcmVmKGhyZWYpXG4gIGNvbnN0IGxhYmVsID0gbWVudGlvbkNoaWxkcmVuVG9MYWJlbChjaGlsZHJlbilcbiAgY29uc3QgaXNUYXNrID0gdHlwZSA9PT0gJ3Rhc2snXG4gIGNvbnN0IGljb25TaXplID0gaXNUYXNrID8gMTYgOiAxNFxuICBjb25zdCB0YXNrVXJsID0gYC90YXNrcy8ke2lkfS9kZXRhaWxgXG5cbiAgY29uc3QgaGFuZGxlVGFza0NsaWNrID0gKGU6IE1vdXNlRXZlbnQ8SFRNTEFuY2hvckVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpIHJldHVyblxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBvcGVuVGFza0luQ29yUGFuZWwoaWQsICdkZXRhaWwnKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlVGFza0tleURvd24gPSAoZTogS2V5Ym9hcmRFdmVudDxIVE1MQW5jaG9yRWxlbWVudD4pID0+IHtcbiAgICBpZiAoZS5rZXkgIT09ICdFbnRlcicgJiYgZS5rZXkgIT09ICcgJykgcmV0dXJuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgb3BlblRhc2tJbkNvclBhbmVsKGlkLCAnZGV0YWlsJylcbiAgfVxuXG4gIGlmIChpc1Rhc2spIHtcbiAgICByZXR1cm4gKFxuICAgICAgPFNDVGFza0xpbmtcbiAgICAgICAgaHJlZj17dGFza1VybH1cbiAgICAgICAgY2xhc3NOYW1lPXtDT05URVhUX01FTlRJT05fQ0hJUF9DTEFTU31cbiAgICAgICAgZGF0YS1tZW50aW9uLXR5cGU9e3R5cGV9XG4gICAgICAgIGRhdGEtbWVudGlvbi1zdXJmYWNlPVwiY2hhdFwiXG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZVRhc2tDbGlja31cbiAgICAgICAgb25LZXlEb3duPXtoYW5kbGVUYXNrS2V5RG93bn1cbiAgICAgID5cbiAgICAgICAge2xhYmVsfVxuICAgICAgPC9TQ1Rhc2tMaW5rPlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGlzUHJvamVjdCA9IHR5cGUgPT09ICdwcm9qZWN0J1xuICBjb25zdCBwcm9qZWN0VXJsID0gaXNQcm9qZWN0ID8gYC9wcm9qZWN0LyR7aWR9L2Rhc2hib2FyZGAgOiBudWxsXG5cbiAgY29uc3QgaGFuZGxlUHJvamVjdENsaWNrID0gKGU6IE1vdXNlRXZlbnQ8SFRNTFNwYW5FbGVtZW50PikgPT4ge1xuICAgIGlmICghcHJvamVjdFVybCkgcmV0dXJuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIHdpbmRvdy5vcGVuKHByb2plY3RVcmwsICdfYmxhbmsnKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8U0NJbmxpbmVNZW50aW9uXG4gICAgICAkdHlwZT17dHlwZX1cbiAgICAgICRpc0NsaWNrYWJsZT17aXNQcm9qZWN0fVxuICAgICAgY2xhc3NOYW1lPXtDT05URVhUX01FTlRJT05fQ0hJUF9DTEFTU31cbiAgICAgIGRhdGEtbWVudGlvbi10eXBlPXt0eXBlfVxuICAgICAgZGF0YS1tZW50aW9uLXN1cmZhY2U9XCJjaGF0XCJcbiAgICAgIG9uQ2xpY2s9e2lzUHJvamVjdCA/IGhhbmRsZVByb2plY3RDbGljayA6IHVuZGVmaW5lZH1cbiAgICAgIHJvbGU9e2lzUHJvamVjdCA/ICdidXR0b24nIDogdW5kZWZpbmVkfVxuICAgICAgdGFiSW5kZXg9e2lzUHJvamVjdCA/IDAgOiB1bmRlZmluZWR9XG4gICAgPlxuICAgICAgPFNDSW5saW5lTWVudGlvbkljb24gJHRhc2s9e2lzVGFza30+XG4gICAgICAgIHtnZXRDb250ZXh0TWVudGlvbkljb24odHlwZSwgTUVOVElPTl9DSElQX0NPTE9SU1t0eXBlXS5mZywgaWQsIGljb25TaXplKX1cbiAgICAgIDwvU0NJbmxpbmVNZW50aW9uSWNvbj5cbiAgICAgIHtsYWJlbH1cbiAgICA8L1NDSW5saW5lTWVudGlvbj5cbiAgKVxufVxuXG4vKiogUXVpdGEgbG9zIG1hcmtlcnMgZGVsIHRleHRvLCBkZWphbmRvIHNvbG8gYGxhYmVsYC4gw5p0aWwgcGFyYSBmYWxsYmFjayBwbGFuby4gKi9cbmV4cG9ydCBjb25zdCBzdHJpcE1lbnRpb25NYXJrZXJzID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICB0ZXh0LnJlcGxhY2UoTUVOVElPTl9NQVJLRVJfUkVHRVgsIChfbSwgX3R5cGUsIF9pZCwgbGFiZWwpID0+IG5vcm1hbGl6ZUNvbnRleHRNZW50aW9uTGFiZWwoU3RyaW5nKGxhYmVsKSkpXG5cbi8qKlxuICogVMOtdHVsb3MgZGUgY29udmVyc2FjacOzbiAocC4gZWouIGBsYXN0X3F1ZXN0aW9uYCBkZXJpdmFkbyBkZWwgcHJpbWVyIG1lbnNhamUpIHB1ZWRlblxuICogaW5jbHVpciBlbCB0ZXh0byBzZXJpYWxpemFkbyBgW1ttZW50aW9uOnR5cGU6aWR8bGFiZWxdXWAuIFBhcmEgc2lkZWJhciB5IGxpc3RhZG9zLFxuICogcmVlbXBsYXphIGNhZGEgYmxvcXVlIHBvciBgbGFiZWxgIGVuIHRleHRvIHBsYW5vLCBzaW4gZWwgbWFyY2Fkb3IgY3J1ZG8uXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRDaGF0TGlzdFRpdGxlTWVudGlvbnMgPSAodGV4dDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dCA9PT0gJycpIHJldHVybiB0ZXh0ID8/ICcnXG4gIGNvbnN0IHdpdGhvdXRDb21wbGV0ZU1hcmtlcnMgPSB0ZXh0LnJlcGxhY2UoTUVOVElPTl9NQVJLRVJfUkVHRVgsIChfbSwgX3R5cGUsIF9pZCwgbGFiZWwpID0+XG4gICAgbm9ybWFsaXplQ29udGV4dE1lbnRpb25MYWJlbChTdHJpbmcobGFiZWwpLnRyaW0oKSlcbiAgKVxuICByZXR1cm4gd2l0aG91dENvbXBsZXRlTWFya2Vycy5yZXBsYWNlKElOQ09NUExFVEVfTUVOVElPTl9NQVJLRVJfUkVHRVgsICcnKS50cmltKClcbn1cblxuLyoqIEdlbmVyYSBsYSBVUkwgZGUgbmF2ZWdhY2nDs24gcGFyYSB1biBtZW50aW9uIHNlZ8O6biBzdSB0aXBvLiAqL1xuY29uc3QgZ2V0TWVudGlvblVybCA9ICh0eXBlOiBDb250ZXh0RW50aXR5VHlwZSwgaWQ6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB8IG51bGwgPT4ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdjbGllbnQnOlxuICAgICAgcmV0dXJuIGAvY2xpZW50cy8ke2lkfWBcbiAgICBjYXNlICdwcm9qZWN0JzpcbiAgICAgIHJldHVybiBgL3Byb2plY3QvJHtpZH0vZGFzaGJvYXJkYFxuICAgIGNhc2UgJ3Rhc2snOlxuICAgICAgcmV0dXJuIGAvdGFza3MvJHtpZH0vZGV0YWlsYFxuICAgIGNhc2UgJ3VzZXInOlxuICAgICAgcmV0dXJuIG51bGwgLy8gTG9zIHVzZXJzIG5vIHNvbiBjbGlja2VhYmxlc1xuICAgIGNhc2UgJ21jcCc6XG4gICAgICByZXR1cm4gbnVsbFxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmNvbnN0IE1lbnRpb25DaGlwID0gKHsgdHlwZSwgaWQsIGxhYmVsIH06IHsgdHlwZTogQ29udGV4dEVudGl0eVR5cGU7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfSkgPT4ge1xuICBjb25zdCBub3JtYWxpemVkTGFiZWwgPSBub3JtYWxpemVDb250ZXh0TWVudGlvbkxhYmVsKGxhYmVsKVxuICBjb25zdCB1cmwgPSBnZXRNZW50aW9uVXJsKHR5cGUsIGlkKVxuICBjb25zdCBpc0NsaWNrYWJsZSA9ICEhdXJsXG4gIGNvbnN0IGlzVGFzayA9IHR5cGUgPT09ICd0YXNrJ1xuICBjb25zdCBpY29uU2l6ZSA9IGlzVGFzayA/IDE2IDogMTRcblxuICBjb25zdCBoYW5kbGVDbGljayA9IChlOiBNb3VzZUV2ZW50PEhUTUxBbmNob3JFbGVtZW50IHwgSFRNTFNwYW5FbGVtZW50PikgPT4ge1xuICAgIGlmICghaXNDbGlja2FibGUgfHwgIXVybCkgcmV0dXJuXG4gICAgaWYgKHR5cGUgPT09ICd0YXNrJykge1xuICAgICAgaWYgKGUubWV0YUtleSB8fCBlLmN0cmxLZXkpIHJldHVyblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICBvcGVuVGFza0luQ29yUGFuZWwoaWQsICdkZXRhaWwnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpXG4gIH1cblxuICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQ8SFRNTEFuY2hvckVsZW1lbnQgfCBIVE1MU3BhbkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKCFpc0NsaWNrYWJsZSB8fCB0eXBlICE9PSAndGFzaycpIHJldHVyblxuICAgIGlmIChlLmtleSAhPT0gJ0VudGVyJyAmJiBlLmtleSAhPT0gJyAnKSByZXR1cm5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBvcGVuVGFza0luQ29yUGFuZWwoaWQsICdkZXRhaWwnKVxuICB9XG5cbiAgaWYgKHR5cGUgPT09ICd0YXNrJykge1xuICAgIHJldHVybiAoXG4gICAgICA8U0NUYXNrTGlua1xuICAgICAgICBocmVmPXt1cmwgPz8gJyMnfVxuICAgICAgICBjbGFzc05hbWU9e0NPTlRFWFRfTUVOVElPTl9DSElQX0NMQVNTfVxuICAgICAgICBkYXRhLW1lbnRpb24tdHlwZT1cInRhc2tcIlxuICAgICAgICBkYXRhLW1lbnRpb24tc3VyZmFjZT1cImNoYXRcIlxuICAgICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICAgICAgb25LZXlEb3duPXtoYW5kbGVLZXlEb3dufVxuICAgICAgPlxuICAgICAgICB7bm9ybWFsaXplZExhYmVsfVxuICAgICAgPC9TQ1Rhc2tMaW5rPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDSW5saW5lTWVudGlvblxuICAgICAgJHR5cGU9e3R5cGV9XG4gICAgICAkaXNDbGlja2FibGU9e2lzQ2xpY2thYmxlfVxuICAgICAgY2xhc3NOYW1lPXtDT05URVhUX01FTlRJT05fQ0hJUF9DTEFTU31cbiAgICAgIGRhdGEtbWVudGlvbi10eXBlPXt0eXBlfVxuICAgICAgZGF0YS1tZW50aW9uLXN1cmZhY2U9XCJjaGF0XCJcbiAgICAgIG9uQ2xpY2s9e2lzQ2xpY2thYmxlID8gaGFuZGxlQ2xpY2sgOiB1bmRlZmluZWR9XG4gICAgICByb2xlPXtpc0NsaWNrYWJsZSA/ICdidXR0b24nIDogdW5kZWZpbmVkfVxuICAgICAgdGFiSW5kZXg9e2lzQ2xpY2thYmxlID8gMCA6IHVuZGVmaW5lZH1cbiAgICA+XG4gICAgICA8U0NJbmxpbmVNZW50aW9uSWNvbiAkdGFzaz17aXNUYXNrfT5cbiAgICAgICAge2dldENvbnRleHRNZW50aW9uSWNvbih0eXBlLCBNRU5USU9OX0NISVBfQ09MT1JTW3R5cGVdLmZnLCBpZCwgaWNvblNpemUpfVxuICAgICAgPC9TQ0lubGluZU1lbnRpb25JY29uPlxuICAgICAge25vcm1hbGl6ZWRMYWJlbH1cbiAgICA8L1NDSW5saW5lTWVudGlvbj5cbiAgKVxufVxuXG4vKipcbiAqIFNwbGl0ZWEgZWwgdGV4dG8gcG9yIG1hcmtlcnMgeSBkZXZ1ZWx2ZSB1biBhcnJheSBkZSBSZWFjdE5vZGVzOlxuICogdGV4dG8gcGxhbm8gKyBzcGFucyBlc3RpbGFkb3MgcGFyYSBjYWRhIG1lbnRpb24uIFJlbmRlcml6YSBkaXJlY3RhbWVudGVcbiAqIHNpbiBwYXNhciBwb3IgU3RyZWFtZG93biAobm8gc29wb3J0YSBtYXJrZG93biBlbiBlc3RlIG1vZG8pLlxuICovXG5leHBvcnQgY29uc3QgcmVuZGVyVGV4dFdpdGhNZW50aW9ucyA9ICh0ZXh0OiBzdHJpbmcpOiBBcnJheTxzdHJpbmcgfCBSZWFjdEVsZW1lbnQ+ID0+IHtcbiAgaWYgKCF0ZXh0KSByZXR1cm4gW3RleHRdXG4gIGNvbnN0IG91dDogQXJyYXk8c3RyaW5nIHwgUmVhY3RFbGVtZW50PiA9IFtdXG4gIGxldCBsYXN0SWR4ID0gMFxuICBNRU5USU9OX01BUktFUl9SRUdFWC5sYXN0SW5kZXggPSAwXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbCA9IE1FTlRJT05fTUFSS0VSX1JFR0VYLmV4ZWModGV4dClcbiAgbGV0IGtleUlkeCA9IDBcbiAgd2hpbGUgKG1hdGNoKSB7XG4gICAgaWYgKG1hdGNoLmluZGV4ID4gbGFzdElkeCkgb3V0LnB1c2godGV4dC5zbGljZShsYXN0SWR4LCBtYXRjaC5pbmRleCkpXG4gICAgY29uc3QgWywgcmF3VHlwZSwgaWQsIGxhYmVsXSA9IG1hdGNoXG4gICAgY29uc3QgdHlwZSA9IEFMTE9XRURfVFlQRVMuaW5jbHVkZXMocmF3VHlwZSBhcyBDb250ZXh0RW50aXR5VHlwZSkgPyAocmF3VHlwZSBhcyBDb250ZXh0RW50aXR5VHlwZSkgOiAndXNlcidcblxuICAgIG91dC5wdXNoKDxNZW50aW9uQ2hpcCBrZXk9e2BtZW50aW9uLSR7a2V5SWR4fS0ke21hdGNoLmluZGV4fWB9IHR5cGU9e3R5cGV9IGlkPXtpZH0gbGFiZWw9e2xhYmVsfSAvPilcblxuICAgIGxhc3RJZHggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aFxuICAgIGtleUlkeCArPSAxXG4gICAgbWF0Y2ggPSBNRU5USU9OX01BUktFUl9SRUdFWC5leGVjKHRleHQpXG4gIH1cbiAgaWYgKGxhc3RJZHggPCB0ZXh0Lmxlbmd0aCkgb3V0LnB1c2godGV4dC5zbGljZShsYXN0SWR4KSlcbiAgcmV0dXJuIG91dFxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBT0EsTUFBTSxJQUFJQyxHQUFHLFFBQVEsbUJBQW1CO0FBQy9DLFNBQTRDQywwQkFBMEIsUUFBUSx5QkFBeUI7QUFDdkcsU0FDRUMsbUJBQW1CLEVBQ25CQyw4QkFBOEIsUUFDekIsa0VBQWtFO0FBQ3pFLFNBQVNDLFVBQVUsUUFBUSxrREFBa0Q7QUFDN0UsU0FBU0MscUJBQXFCLFFBQVEsdUJBQXVCO0FBQzdELFNBQVNDLDRCQUE0QixRQUFRLHVCQUF1QjtBQUNwRSxTQUFTQyxrQkFBa0IsUUFBUSxzQkFBc0I7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQSxTQUFBQyxHQUFBLElBQUFDLElBQUEsRUFBQUMsSUFBQSxJQUFBQyxLQUFBO0FBSUEsT0FBTyxJQUFNQyxvQkFBb0IsR0FBRyx1RUFBdUU7QUFDM0csT0FBTyxJQUFNQyxxQkFBcUIsR0FBRyxpQkFBaUI7QUFDdEQsSUFBTUMsK0JBQStCLEdBQUcsc0JBQXNCO0FBRTlELElBQU1DLGFBQWtDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDO0FBRXZGLElBQU1DLHdCQUF3QixHQUFHLFNBQTNCQSx3QkFBd0JBLENBQUlDLElBQVksRUFBOEM7RUFDMUYsSUFBTUMsSUFBSSxHQUFHRCxJQUFJLENBQUNFLEtBQUssQ0FBQ04scUJBQXFCLENBQUNPLE1BQU0sQ0FBQztFQUNy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