@projectcor/maia-components 2.11.40-9 → 2.11.40

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