@projectcor/maia-components 2.11.38 → 2.11.39-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.
@@ -0,0 +1,269 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ /* eslint-disable no-restricted-syntax */
6
+ /* eslint-disable no-continue */
7
+ /* eslint-disable no-void */
8
+ /* eslint-disable prefer-destructuring */
9
+ import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
10
+ import { StyledMAIAInput } from './styles';
11
+
12
+ /**
13
+ * Líneas visuales con wrap de palabras al ancho dado (aprox. el navegador en LTR).
14
+ */
15
+ import { jsx as _jsx } from "react/jsx-runtime";
16
+ function countVisualLinesWrapped(raw, contentWidthPx, measureTextWidth) {
17
+ if (contentWidthPx <= 1) {
18
+ return 1;
19
+ }
20
+ var paragraphs = raw.split('\n');
21
+ var total = 0;
22
+ var _iterator = _createForOfIteratorHelper(paragraphs),
23
+ _step;
24
+ try {
25
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
26
+ var paragraph = _step.value;
27
+ if (paragraph.length === 0) {
28
+ total += 1;
29
+ continue;
30
+ }
31
+ var words = paragraph.split(/\s+/).filter(function (w) {
32
+ return w.length > 0;
33
+ });
34
+ var linesInParagraph = 1;
35
+ var currentLineWidth = 0;
36
+ for (var i = 0; i < words.length; i += 1) {
37
+ var word = words[i];
38
+ var wordWidth = measureTextWidth(word);
39
+ var spaceWidth = i > 0 ? measureTextWidth(' ') : 0;
40
+ if (wordWidth > contentWidthPx) {
41
+ if (currentLineWidth > 0) {
42
+ linesInParagraph += 1;
43
+ currentLineWidth = 0;
44
+ }
45
+ linesInParagraph += Math.ceil(wordWidth / contentWidthPx) - 1;
46
+ continue;
47
+ }
48
+ var candidateWidth = currentLineWidth === 0 ? wordWidth : currentLineWidth + spaceWidth + wordWidth;
49
+ if (candidateWidth > contentWidthPx && currentLineWidth > 0) {
50
+ linesInParagraph += 1;
51
+ currentLineWidth = wordWidth;
52
+ } else {
53
+ currentLineWidth = candidateWidth;
54
+ }
55
+ }
56
+ total += linesInParagraph;
57
+ }
58
+ } catch (err) {
59
+ _iterator.e(err);
60
+ } finally {
61
+ _iterator.f();
62
+ }
63
+ return Math.max(1, total);
64
+ }
65
+ export var MAIAInputEditor = function MAIAInputEditor(_ref) {
66
+ var inputRef = _ref.inputRef,
67
+ disabled = _ref.disabled,
68
+ placeholder = _ref.placeholder,
69
+ alignButtons = _ref.alignButtons,
70
+ compactSingleRowToolbar = _ref.compactSingleRowToolbar,
71
+ setIsTextMultiline = _ref.setIsTextMultiline,
72
+ chatId = _ref.chatId,
73
+ newChatKey = _ref.newChatKey,
74
+ clearSeq = _ref.clearSeq,
75
+ sendDisabled = _ref.sendDisabled,
76
+ onTypingPresenceChange = _ref.onTypingPresenceChange,
77
+ onEnterSend = _ref.onEnterSend,
78
+ onChangeProp = _ref.onChangeProp;
79
+ var textareaMinContentWidthSeenRef = useRef(null);
80
+ var presencePrevRef = useRef(false);
81
+ /** Solo para re-agendar medición de alto sin guardar el string en el padre (aisla re-renders del toolbar). */
82
+ var _useState = useState(0),
83
+ _useState2 = _slicedToArray(_useState, 2),
84
+ resizeEpoch = _useState2[0],
85
+ setResizeEpoch = _useState2[1];
86
+ var handleResize = useCallback(function () {
87
+ var _textareaMinContentWi;
88
+ var textarea = inputRef.current;
89
+ if (!textarea) {
90
+ return;
91
+ }
92
+
93
+ /** Coincide con StyledMAIAInput: line-height 20px sobre fuente 14px (~una línea de texto visible). */
94
+ var minHeight = 20;
95
+ var maxHeight = 120;
96
+ var previousMinHeight = textarea.style.minHeight;
97
+ var previousMaxHeight = textarea.style.maxHeight;
98
+ textarea.style.height = 'auto';
99
+ textarea.style.minHeight = '0px';
100
+ textarea.style.maxHeight = 'none';
101
+ void textarea.offsetHeight;
102
+ var scrollHeight = textarea.scrollHeight;
103
+ var computedStyle = window.getComputedStyle(textarea);
104
+ var lineHeight = parseFloat(computedStyle.lineHeight) || 20;
105
+ var paddingTop = parseFloat(computedStyle.paddingTop) || 0;
106
+ var paddingBottom = parseFloat(computedStyle.paddingBottom) || 0;
107
+ var borderTop = parseFloat(computedStyle.borderTopWidth) || 0;
108
+ var borderBottom = parseFloat(computedStyle.borderBottomWidth) || 0;
109
+ var singleLineHeight = lineHeight + paddingTop + paddingBottom + borderTop + borderBottom;
110
+ var isEmpty = textarea.value.trim() === '';
111
+ var paddingLeft = parseFloat(computedStyle.paddingLeft) || 0;
112
+ var paddingRight = parseFloat(computedStyle.paddingRight) || 0;
113
+ var borderLeft = parseFloat(computedStyle.borderLeftWidth) || 0;
114
+ var borderRight = parseFloat(computedStyle.borderRightWidth) || 0;
115
+ var textareaWidth = textarea.offsetWidth - paddingLeft - paddingRight - borderLeft - borderRight;
116
+ if (!isEmpty) {
117
+ textareaMinContentWidthSeenRef.current = textareaMinContentWidthSeenRef.current === null ? textareaWidth : Math.min(textareaMinContentWidthSeenRef.current, textareaWidth);
118
+ }
119
+ var wrapCheckWidth = (_textareaMinContentWi = textareaMinContentWidthSeenRef.current) !== null && _textareaMinContentWi !== void 0 ? _textareaMinContentWi : textareaWidth;
120
+ var canvasMeasureIndicatesMultiline = false;
121
+ var canvas = document.createElement('canvas');
122
+ var canvasContext = canvas.getContext('2d');
123
+ var text = textarea.value || '';
124
+ var lines = text.split('\n');
125
+ if (!canvasContext) {
126
+ canvasMeasureIndicatesMultiline = scrollHeight > singleLineHeight * 2.05;
127
+ } else {
128
+ var textareaStyles = window.getComputedStyle(textarea);
129
+ canvasContext.font = "".concat(textareaStyles.fontWeight, " ").concat(textareaStyles.fontSize, " ").concat(textareaStyles.fontFamily);
130
+ if (lines.length > 1) {
131
+ canvasMeasureIndicatesMultiline = true;
132
+ } else {
133
+ var _iterator2 = _createForOfIteratorHelper(lines),
134
+ _step2;
135
+ try {
136
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
137
+ var line = _step2.value;
138
+ if (line.trim() === '') continue;
139
+ if (canvasContext.measureText(line).width > wrapCheckWidth) {
140
+ canvasMeasureIndicatesMultiline = true;
141
+ break;
142
+ }
143
+ }
144
+ } catch (err) {
145
+ _iterator2.e(err);
146
+ } finally {
147
+ _iterator2.f();
148
+ }
149
+ }
150
+ }
151
+ var hasMultipleVisualLines = canvasMeasureIndicatesMultiline;
152
+ var nextMultiline = !isEmpty && hasMultipleVisualLines;
153
+
154
+ /** Líneas según ancho estrecho (history min) — toolbar compacto y detección multiline */
155
+ var visualLinesAtWrapWidth = 1;
156
+ /** Líneas al ancho actual del textarea — en stacked suele ser mayor que wrapCheckWidth */
157
+ var visualLinesAtCurrentWidth = 1;
158
+ if (!isEmpty && canvasContext) {
159
+ visualLinesAtWrapWidth = countVisualLinesWrapped(text, wrapCheckWidth, function (segment) {
160
+ return canvasContext.measureText(segment).width;
161
+ });
162
+ visualLinesAtCurrentWidth = countVisualLinesWrapped(text, textareaWidth, function (segment) {
163
+ return canvasContext.measureText(segment).width;
164
+ });
165
+ } else if (!isEmpty && !canvasContext) {
166
+ visualLinesAtWrapWidth = scrollHeight > singleLineHeight * 1.85 ? Math.ceil(scrollHeight / singleLineHeight) : 1;
167
+ visualLinesAtCurrentWidth = visualLinesAtWrapWidth;
168
+ }
169
+ var linesForHeight = !isEmpty && canvasContext ? visualLinesAtCurrentWidth : visualLinesAtWrapWidth;
170
+ var newHeight;
171
+ /** Una línea al ancho actual: altura fijada por tipografía (+ padding/borde), no scrollHeight — evita ~39px al pasar a stacked cuando el canvas ya cuenta 1 línea a ancho amplio pero scrollHeight aún viene de líneas viejas/wrap anterior. */
172
+ var snappedSingleLineOuterHeight = Math.round(singleLineHeight);
173
+ if (isEmpty) {
174
+ newHeight = snappedSingleLineOuterHeight;
175
+ } else if (!hasMultipleVisualLines) {
176
+ newHeight = snappedSingleLineOuterHeight;
177
+ } else if (linesForHeight <= 1) {
178
+ newHeight = Math.min(Math.max(snappedSingleLineOuterHeight, minHeight), maxHeight);
179
+ } else {
180
+ var snappedHeight = paddingTop + paddingBottom + borderTop + borderBottom + linesForHeight * lineHeight;
181
+ newHeight = Math.min(Math.max(Math.min(scrollHeight, snappedHeight), minHeight), maxHeight);
182
+ }
183
+ setIsTextMultiline(function (prev) {
184
+ return prev === nextMultiline ? prev : nextMultiline;
185
+ });
186
+ textarea.style.minHeight = previousMinHeight || "".concat(minHeight, "px");
187
+ textarea.style.maxHeight = previousMaxHeight || '120px';
188
+ textarea.style.height = "".concat(newHeight, "px");
189
+ }, [inputRef, setIsTextMultiline]);
190
+
191
+ /** Compact↔stacked cambia el grid/CSS del textarea; medir en layout evita un frame con alto desincronizado (sobre todo compact→stacked). */
192
+ useLayoutEffect(function () {
193
+ handleResize();
194
+ }, [compactSingleRowToolbar, handleResize]);
195
+ useEffect(function () {
196
+ var _inputRef$current;
197
+ if (((_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.value.trim()) === '') {
198
+ textareaMinContentWidthSeenRef.current = null;
199
+ }
200
+ }, [resizeEpoch]);
201
+ useEffect(function () {
202
+ textareaMinContentWidthSeenRef.current = null;
203
+ }, [chatId, newChatKey]);
204
+ useEffect(function () {
205
+ if (inputRef.current && !disabled) {
206
+ inputRef.current.focus();
207
+ requestAnimationFrame(function () {
208
+ handleResize();
209
+ });
210
+ }
211
+ }, [disabled, handleResize]);
212
+ useEffect(function () {
213
+ if (clearSeq === 0) {
214
+ return;
215
+ }
216
+ textareaMinContentWidthSeenRef.current = null;
217
+ presencePrevRef.current = false;
218
+ requestAnimationFrame(function () {
219
+ handleResize();
220
+ });
221
+ }, [clearSeq, handleResize]);
222
+ useEffect(function () {
223
+ var id = requestAnimationFrame(function () {
224
+ handleResize();
225
+ });
226
+ return function () {
227
+ return cancelAnimationFrame(id);
228
+ };
229
+ }, [resizeEpoch, handleResize]);
230
+ var handleChange = function handleChange(e) {
231
+ var hasTrim = e.target.value.trim().length > 0;
232
+ if (hasTrim !== presencePrevRef.current) {
233
+ presencePrevRef.current = hasTrim;
234
+ onTypingPresenceChange(hasTrim);
235
+ }
236
+ setResizeEpoch(function (x) {
237
+ return x + 1;
238
+ });
239
+ onChangeProp === null || onChangeProp === void 0 || onChangeProp();
240
+ };
241
+ var handleBlur = function handleBlur() {
242
+ var _inputRef$current$val, _inputRef$current2;
243
+ var v = (_inputRef$current$val = (_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 ? void 0 : _inputRef$current2.value) !== null && _inputRef$current$val !== void 0 ? _inputRef$current$val : '';
244
+ var hasTrim = v.trim().length > 0;
245
+ if (hasTrim !== presencePrevRef.current) {
246
+ presencePrevRef.current = hasTrim;
247
+ onTypingPresenceChange(hasTrim);
248
+ }
249
+ };
250
+ var handleKeyDown = function handleKeyDown(e) {
251
+ if (e.key === 'Enter' && !e.shiftKey) {
252
+ e.preventDefault();
253
+ if (!sendDisabled && !disabled) {
254
+ onEnterSend();
255
+ }
256
+ }
257
+ };
258
+ return /*#__PURE__*/_jsx(StyledMAIAInput, {
259
+ ref: inputRef,
260
+ disabled: disabled,
261
+ onChange: handleChange,
262
+ onKeyDown: handleKeyDown,
263
+ placeholder: placeholder,
264
+ alignButtons: alignButtons,
265
+ $toolbarLayoutVariant: compactSingleRowToolbar ? 'compactRow' : 'stackedRows',
266
+ onBlur: handleBlur
267
+ });
268
+ };
269
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiU3R5bGVkTUFJQUlucHV0IiwianN4IiwiX2pzeCIsImNvdW50VmlzdWFsTGluZXNXcmFwcGVkIiwicmF3IiwiY29udGVudFdpZHRoUHgiLCJtZWFzdXJlVGV4dFdpZHRoIiwicGFyYWdyYXBocyIsInNwbGl0IiwidG90YWwiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwicGFyYWdyYXBoIiwidmFsdWUiLCJsZW5ndGgiLCJ3b3JkcyIsImZpbHRlciIsInciLCJsaW5lc0luUGFyYWdyYXBoIiwiY3VycmVudExpbmVXaWR0aCIsImkiLCJ3b3JkIiwid29yZFdpZHRoIiwic3BhY2VXaWR0aCIsIk1hdGgiLCJjZWlsIiwiY2FuZGlkYXRlV2lkdGgiLCJlcnIiLCJlIiwiZiIsIm1heCIsIk1BSUFJbnB1dEVkaXRvciIsIl9yZWYiLCJpbnB1dFJlZiIsImRpc2FibGVkIiwicGxhY2Vob2xkZXIiLCJhbGlnbkJ1dHRvbnMiLCJjb21wYWN0U2luZ2xlUm93VG9vbGJhciIsInNldElzVGV4dE11bHRpbGluZSIsImNoYXRJZCIsIm5ld0NoYXRLZXkiLCJjbGVhclNlcSIsInNlbmREaXNhYmxlZCIsIm9uVHlwaW5nUHJlc2VuY2VDaGFuZ2UiLCJvbkVudGVyU2VuZCIsIm9uQ2hhbmdlUHJvcCIsInRleHRhcmVhTWluQ29udGVudFdpZHRoU2VlblJlZiIsInByZXNlbmNlUHJldlJlZiIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInJlc2l6ZUVwb2NoIiwic2V0UmVzaXplRXBvY2giLCJoYW5kbGVSZXNpemUiLCJfdGV4dGFyZWFNaW5Db250ZW50V2kiLCJ0ZXh0YXJlYSIsImN1cnJlbnQiLCJtaW5IZWlnaHQiLCJtYXhIZWlnaHQiLCJwcmV2aW91c01pbkhlaWdodCIsInN0eWxlIiwicHJldmlvdXNNYXhIZWlnaHQiLCJoZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJzY3JvbGxIZWlnaHQiLCJjb21wdXRlZFN0eWxlIiwid2luZG93IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImxpbmVIZWlnaHQiLCJwYXJzZUZsb2F0IiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iLCJib3JkZXJUb3AiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlckJvdHRvbSIsImJvcmRlckJvdHRvbVdpZHRoIiwic2luZ2xlTGluZUhlaWdodCIsImlzRW1wdHkiLCJ0cmltIiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiLCJib3JkZXJMZWZ0IiwiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHQiLCJib3JkZXJSaWdodFdpZHRoIiwidGV4dGFyZWFXaWR0aCIsIm9mZnNldFdpZHRoIiwibWluIiwid3JhcENoZWNrV2lkdGgiLCJjYW52YXNNZWFzdXJlSW5kaWNhdGVzTXVsdGlsaW5lIiwiY2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2FudmFzQ29udGV4dCIsImdldENvbnRleHQiLCJ0ZXh0IiwibGluZXMiLCJ0ZXh0YXJlYVN0eWxlcyIsImZvbnQiLCJjb25jYXQiLCJmb250V2VpZ2h0IiwiZm9udFNpemUiLCJmb250RmFtaWx5IiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsImxpbmUiLCJtZWFzdXJlVGV4dCIsIndpZHRoIiwiaGFzTXVsdGlwbGVWaXN1YWxMaW5lcyIsIm5leHRNdWx0aWxpbmUiLCJ2aXN1YWxMaW5lc0F0V3JhcFdpZHRoIiwidmlzdWFsTGluZXNBdEN1cnJlbnRXaWR0aCIsInNlZ21lbnQiLCJsaW5lc0ZvckhlaWdodCIsIm5ld0hlaWdodCIsInNuYXBwZWRTaW5nbGVMaW5lT3V0ZXJIZWlnaHQiLCJyb3VuZCIsInNuYXBwZWRIZWlnaHQiLCJwcmV2IiwiX2lucHV0UmVmJGN1cnJlbnQiLCJmb2N1cyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImlkIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJoYW5kbGVDaGFuZ2UiLCJoYXNUcmltIiwidGFyZ2V0IiwieCIsImhhbmRsZUJsdXIiLCJfaW5wdXRSZWYkY3VycmVudCR2YWwiLCJfaW5wdXRSZWYkY3VycmVudDIiLCJ2IiwiaGFuZGxlS2V5RG93biIsImtleSIsInNoaWZ0S2V5IiwicHJldmVudERlZmF1bHQiLCJyZWYiLCJvbkNoYW5nZSIsIm9uS2V5RG93biIsIiR0b29sYmFyTGF5b3V0VmFyaWFudCIsIm9uQmx1ciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2F0b21zL01BSUFJbnB1dC9NQUlBSW5wdXRFZGl0b3IudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtc3ludGF4ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb250aW51ZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdm9pZCAqL1xuLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLWRlc3RydWN0dXJpbmcgKi9cbmltcG9ydCB7IENoYW5nZUV2ZW50LCBLZXlib2FyZEV2ZW50LCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHsgRGlzcGF0Y2gsIFJlZk9iamVjdCwgU2V0U3RhdGVBY3Rpb24gfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgU3R5bGVkTUFJQUlucHV0IH0gZnJvbSAnLi9zdHlsZXMnXG5cbi8qKlxuICogTMOtbmVhcyB2aXN1YWxlcyBjb24gd3JhcCBkZSBwYWxhYnJhcyBhbCBhbmNobyBkYWRvIChhcHJveC4gZWwgbmF2ZWdhZG9yIGVuIExUUikuXG4gKi9cbmZ1bmN0aW9uIGNvdW50VmlzdWFsTGluZXNXcmFwcGVkKHJhdzogc3RyaW5nLCBjb250ZW50V2lkdGhQeDogbnVtYmVyLCBtZWFzdXJlVGV4dFdpZHRoOiAoczogc3RyaW5nKSA9PiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoY29udGVudFdpZHRoUHggPD0gMSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgY29uc3QgcGFyYWdyYXBocyA9IHJhdy5zcGxpdCgnXFxuJylcbiAgbGV0IHRvdGFsID0gMFxuICBmb3IgKGNvbnN0IHBhcmFncmFwaCBvZiBwYXJhZ3JhcGhzKSB7XG4gICAgaWYgKHBhcmFncmFwaC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRvdGFsICs9IDFcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHdvcmRzID0gcGFyYWdyYXBoLnNwbGl0KC9cXHMrLykuZmlsdGVyKHcgPT4gdy5sZW5ndGggPiAwKVxuICAgIGxldCBsaW5lc0luUGFyYWdyYXBoID0gMVxuICAgIGxldCBjdXJyZW50TGluZVdpZHRoID0gMFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHdvcmQgPSB3b3Jkc1tpXVxuICAgICAgY29uc3Qgd29yZFdpZHRoID0gbWVhc3VyZVRleHRXaWR0aCh3b3JkKVxuICAgICAgY29uc3Qgc3BhY2VXaWR0aCA9IGkgPiAwID8gbWVhc3VyZVRleHRXaWR0aCgnICcpIDogMFxuXG4gICAgICBpZiAod29yZFdpZHRoID4gY29udGVudFdpZHRoUHgpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGggPiAwKSB7XG4gICAgICAgICAgbGluZXNJblBhcmFncmFwaCArPSAxXG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aCA9IDBcbiAgICAgICAgfVxuICAgICAgICBsaW5lc0luUGFyYWdyYXBoICs9IE1hdGguY2VpbCh3b3JkV2lkdGggLyBjb250ZW50V2lkdGhQeCkgLSAxXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZVdpZHRoID0gY3VycmVudExpbmVXaWR0aCA9PT0gMCA/IHdvcmRXaWR0aCA6IGN1cnJlbnRMaW5lV2lkdGggKyBzcGFjZVdpZHRoICsgd29yZFdpZHRoXG4gICAgICBpZiAoY2FuZGlkYXRlV2lkdGggPiBjb250ZW50V2lkdGhQeCAmJiBjdXJyZW50TGluZVdpZHRoID4gMCkge1xuICAgICAgICBsaW5lc0luUGFyYWdyYXBoICs9IDFcbiAgICAgICAgY3VycmVudExpbmVXaWR0aCA9IHdvcmRXaWR0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudExpbmVXaWR0aCA9IGNhbmRpZGF0ZVdpZHRoXG4gICAgICB9XG4gICAgfVxuICAgIHRvdGFsICs9IGxpbmVzSW5QYXJhZ3JhcGhcbiAgfVxuICByZXR1cm4gTWF0aC5tYXgoMSwgdG90YWwpXG59XG5cbmV4cG9ydCB0eXBlIE1BSUFJbnB1dEVkaXRvclByb3BzID0ge1xuICBpbnB1dFJlZjogUmVmT2JqZWN0PEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsPlxuICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgYWxpZ25CdXR0b25zPzogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJ1xuICBjb21wYWN0U2luZ2xlUm93VG9vbGJhcjogYm9vbGVhblxuICBzZXRJc1RleHRNdWx0aWxpbmU6IERpc3BhdGNoPFNldFN0YXRlQWN0aW9uPGJvb2xlYW4+PlxuICBjaGF0SWQ/OiBzdHJpbmdcbiAgbmV3Q2hhdEtleT86IG51bWJlclxuICAvKiogSW5jcmVtZW50YXIgZGVzZGUgZWwgcGFkcmUgdHJhcyBlbnZpYXIgLyBjYW1iaWFyIHNlc2nDs24gcGFyYSBzaW5jcm9uaXphciBtZWRpY2nDs24gc2luIGVzdGFkbyBkZWwgdGV4dG8gZW4gZWwgcGFkcmUuICovXG4gIGNsZWFyU2VxOiBudW1iZXJcbiAgc2VuZERpc2FibGVkOiBib29sZWFuXG4gIG9uVHlwaW5nUHJlc2VuY2VDaGFuZ2U6IChoYXNUcmltbWVkVGV4dDogYm9vbGVhbikgPT4gdm9pZFxuICBvbkVudGVyU2VuZDogKCkgPT4gdm9pZFxuICBvbkNoYW5nZVByb3A/OiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBjb25zdCBNQUlBSW5wdXRFZGl0b3IgPSAoe1xuICBpbnB1dFJlZixcbiAgZGlzYWJsZWQsXG4gIHBsYWNlaG9sZGVyLFxuICBhbGlnbkJ1dHRvbnMsXG4gIGNvbXBhY3RTaW5nbGVSb3dUb29sYmFyLFxuICBzZXRJc1RleHRNdWx0aWxpbmUsXG4gIGNoYXRJZCxcbiAgbmV3Q2hhdEtleSxcbiAgY2xlYXJTZXEsXG4gIHNlbmREaXNhYmxlZCxcbiAgb25UeXBpbmdQcmVzZW5jZUNoYW5nZSxcbiAgb25FbnRlclNlbmQsXG4gIG9uQ2hhbmdlUHJvcCxcbn06IE1BSUFJbnB1dEVkaXRvclByb3BzKSA9PiB7XG4gIGNvbnN0IHRleHRhcmVhTWluQ29udGVudFdpZHRoU2VlblJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKVxuICBjb25zdCBwcmVzZW5jZVByZXZSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIC8qKiBTb2xvIHBhcmEgcmUtYWdlbmRhciBtZWRpY2nDs24gZGUgYWx0byBzaW4gZ3VhcmRhciBlbCBzdHJpbmcgZW4gZWwgcGFkcmUgKGFpc2xhIHJlLXJlbmRlcnMgZGVsIHRvb2xiYXIpLiAqL1xuICBjb25zdCBbcmVzaXplRXBvY2gsIHNldFJlc2l6ZUVwb2NoXSA9IHVzZVN0YXRlKDApXG5cbiAgY29uc3QgaGFuZGxlUmVzaXplID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHRleHRhcmVhID0gaW5wdXRSZWYuY3VycmVudFxuICAgIGlmICghdGV4dGFyZWEpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8qKiBDb2luY2lkZSBjb24gU3R5bGVkTUFJQUlucHV0OiBsaW5lLWhlaWdodCAyMHB4IHNvYnJlIGZ1ZW50ZSAxNHB4ICh+dW5hIGzDrW5lYSBkZSB0ZXh0byB2aXNpYmxlKS4gKi9cbiAgICBjb25zdCBtaW5IZWlnaHQgPSAyMFxuICAgIGNvbnN0IG1heEhlaWdodCA9IDEyMFxuXG4gICAgY29uc3QgcHJldmlvdXNNaW5IZWlnaHQgPSB0ZXh0YXJlYS5zdHlsZS5taW5IZWlnaHRcbiAgICBjb25zdCBwcmV2aW91c01heEhlaWdodCA9IHRleHRhcmVhLnN0eWxlLm1heEhlaWdodFxuXG4gICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nXG4gICAgdGV4dGFyZWEuc3R5bGUubWluSGVpZ2h0ID0gJzBweCdcbiAgICB0ZXh0YXJlYS5zdHlsZS5tYXhIZWlnaHQgPSAnbm9uZSdcblxuICAgIHZvaWQgdGV4dGFyZWEub2Zmc2V0SGVpZ2h0XG5cbiAgICBjb25zdCBzY3JvbGxIZWlnaHQgPSB0ZXh0YXJlYS5zY3JvbGxIZWlnaHRcblxuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0ZXh0YXJlYSlcbiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLmxpbmVIZWlnaHQpIHx8IDIwXG4gICAgY29uc3QgcGFkZGluZ1RvcCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nVG9wKSB8fCAwXG4gICAgY29uc3QgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tKSB8fCAwXG4gICAgY29uc3QgYm9yZGVyVG9wID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoKSB8fCAwXG4gICAgY29uc3QgYm9yZGVyQm90dG9tID0gcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLmJvcmRlckJvdHRvbVdpZHRoKSB8fCAwXG5cbiAgICBjb25zdCBzaW5nbGVMaW5lSGVpZ2h0ID0gbGluZUhlaWdodCArIHBhZGRpbmdUb3AgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyVG9wICsgYm9yZGVyQm90dG9tXG5cbiAgICBjb25zdCBpc0VtcHR5ID0gdGV4dGFyZWEudmFsdWUudHJpbSgpID09PSAnJ1xuXG4gICAgY29uc3QgcGFkZGluZ0xlZnQgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ0xlZnQpIHx8IDBcbiAgICBjb25zdCBwYWRkaW5nUmlnaHQgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ1JpZ2h0KSB8fCAwXG4gICAgY29uc3QgYm9yZGVyTGVmdCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpIHx8IDBcbiAgICBjb25zdCBib3JkZXJSaWdodCA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5ib3JkZXJSaWdodFdpZHRoKSB8fCAwXG4gICAgY29uc3QgdGV4dGFyZWFXaWR0aCA9IHRleHRhcmVhLm9mZnNldFdpZHRoIC0gcGFkZGluZ0xlZnQgLSBwYWRkaW5nUmlnaHQgLSBib3JkZXJMZWZ0IC0gYm9yZGVyUmlnaHRcblxuICAgIGlmICghaXNFbXB0eSkge1xuICAgICAgdGV4dGFyZWFNaW5Db250ZW50V2lkdGhTZWVuUmVmLmN1cnJlbnQgPVxuICAgICAgICB0ZXh0YXJlYU1pbkNvbnRlbnRXaWR0aFNlZW5SZWYuY3VycmVudCA9PT0gbnVsbFxuICAgICAgICAgID8gdGV4dGFyZWFXaWR0aFxuICAgICAgICAgIDogTWF0aC5taW4odGV4dGFyZWFNaW5Db250ZW50V2lkdGhTZWVuUmVmLmN1cnJlbnQsIHRleHRhcmVhV2lkdGgpXG4gICAgfVxuXG4gICAgY29uc3Qgd3JhcENoZWNrV2lkdGggPSB0ZXh0YXJlYU1pbkNvbnRlbnRXaWR0aFNlZW5SZWYuY3VycmVudCA/PyB0ZXh0YXJlYVdpZHRoXG5cbiAgICBsZXQgY2FudmFzTWVhc3VyZUluZGljYXRlc011bHRpbGluZSA9IGZhbHNlXG5cbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgIGNvbnN0IGNhbnZhc0NvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgIGNvbnN0IHRleHQgPSB0ZXh0YXJlYS52YWx1ZSB8fCAnJ1xuICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJylcblxuICAgIGlmICghY2FudmFzQ29udGV4dCkge1xuICAgICAgY2FudmFzTWVhc3VyZUluZGljYXRlc011bHRpbGluZSA9IHNjcm9sbEhlaWdodCA+IHNpbmdsZUxpbmVIZWlnaHQgKiAyLjA1XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRleHRhcmVhU3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGV4dGFyZWEpXG4gICAgICBjYW52YXNDb250ZXh0LmZvbnQgPSBgJHt0ZXh0YXJlYVN0eWxlcy5mb250V2VpZ2h0fSAke3RleHRhcmVhU3R5bGVzLmZvbnRTaXplfSAke3RleHRhcmVhU3R5bGVzLmZvbnRGYW1pbHl9YFxuICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY2FudmFzTWVhc3VyZUluZGljYXRlc011bHRpbGluZSA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgIGlmIChsaW5lLnRyaW0oKSA9PT0gJycpIGNvbnRpbnVlXG4gICAgICAgICAgaWYgKGNhbnZhc0NvbnRleHQubWVhc3VyZVRleHQobGluZSkud2lkdGggPiB3cmFwQ2hlY2tXaWR0aCkge1xuICAgICAgICAgICAgY2FudmFzTWVhc3VyZUluZGljYXRlc011bHRpbGluZSA9IHRydWVcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFzTXVsdGlwbGVWaXN1YWxMaW5lcyA9IGNhbnZhc01lYXN1cmVJbmRpY2F0ZXNNdWx0aWxpbmVcblxuICAgIGNvbnN0IG5leHRNdWx0aWxpbmUgPSAhaXNFbXB0eSAmJiBoYXNNdWx0aXBsZVZpc3VhbExpbmVzXG5cbiAgICAvKiogTMOtbmVhcyBzZWfDum4gYW5jaG8gZXN0cmVjaG8gKGhpc3RvcnkgbWluKSDigJQgdG9vbGJhciBjb21wYWN0byB5IGRldGVjY2nDs24gbXVsdGlsaW5lICovXG4gICAgbGV0IHZpc3VhbExpbmVzQXRXcmFwV2lkdGggPSAxXG4gICAgLyoqIEzDrW5lYXMgYWwgYW5jaG8gYWN0dWFsIGRlbCB0ZXh0YXJlYSDigJQgZW4gc3RhY2tlZCBzdWVsZSBzZXIgbWF5b3IgcXVlIHdyYXBDaGVja1dpZHRoICovXG4gICAgbGV0IHZpc3VhbExpbmVzQXRDdXJyZW50V2lkdGggPSAxXG4gICAgaWYgKCFpc0VtcHR5ICYmIGNhbnZhc0NvbnRleHQpIHtcbiAgICAgIHZpc3VhbExpbmVzQXRXcmFwV2lkdGggPSBjb3VudFZpc3VhbExpbmVzV3JhcHBlZChcbiAgICAgICAgdGV4dCxcbiAgICAgICAgd3JhcENoZWNrV2lkdGgsXG4gICAgICAgIHNlZ21lbnQgPT4gY2FudmFzQ29udGV4dC5tZWFzdXJlVGV4dChzZWdtZW50KS53aWR0aFxuICAgICAgKVxuICAgICAgdmlzdWFsTGluZXNBdEN1cnJlbnRXaWR0aCA9IGNvdW50VmlzdWFsTGluZXNXcmFwcGVkKFxuICAgICAgICB0ZXh0LFxuICAgICAgICB0ZXh0YXJlYVdpZHRoLFxuICAgICAgICBzZWdtZW50ID0+IGNhbnZhc0NvbnRleHQubWVhc3VyZVRleHQoc2VnbWVudCkud2lkdGhcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKCFpc0VtcHR5ICYmICFjYW52YXNDb250ZXh0KSB7XG4gICAgICB2aXN1YWxMaW5lc0F0V3JhcFdpZHRoID0gc2Nyb2xsSGVpZ2h0ID4gc2luZ2xlTGluZUhlaWdodCAqIDEuODUgPyBNYXRoLmNlaWwoc2Nyb2xsSGVpZ2h0IC8gc2luZ2xlTGluZUhlaWdodCkgOiAxXG4gICAgICB2aXN1YWxMaW5lc0F0Q3VycmVudFdpZHRoID0gdmlzdWFsTGluZXNBdFdyYXBXaWR0aFxuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzRm9ySGVpZ2h0ID0gIWlzRW1wdHkgJiYgY2FudmFzQ29udGV4dCA/IHZpc3VhbExpbmVzQXRDdXJyZW50V2lkdGggOiB2aXN1YWxMaW5lc0F0V3JhcFdpZHRoXG5cbiAgICBsZXQgbmV3SGVpZ2h0OiBudW1iZXJcbiAgICAvKiogVW5hIGzDrW5lYSBhbCBhbmNobyBhY3R1YWw6IGFsdHVyYSBmaWphZGEgcG9yIHRpcG9ncmFmw61hICgrIHBhZGRpbmcvYm9yZGUpLCBubyBzY3JvbGxIZWlnaHQg4oCUIGV2aXRhIH4zOXB4IGFsIHBhc2FyIGEgc3RhY2tlZCBjdWFuZG8gZWwgY2FudmFzIHlhIGN1ZW50YSAxIGzDrW5lYSBhIGFuY2hvIGFtcGxpbyBwZXJvIHNjcm9sbEhlaWdodCBhw7puIHZpZW5lIGRlIGzDrW5lYXMgdmllamFzL3dyYXAgYW50ZXJpb3IuICovXG4gICAgY29uc3Qgc25hcHBlZFNpbmdsZUxpbmVPdXRlckhlaWdodCA9IE1hdGgucm91bmQoc2luZ2xlTGluZUhlaWdodClcbiAgICBpZiAoaXNFbXB0eSkge1xuICAgICAgbmV3SGVpZ2h0ID0gc25hcHBlZFNpbmdsZUxpbmVPdXRlckhlaWdodFxuICAgIH0gZWxzZSBpZiAoIWhhc011bHRpcGxlVmlzdWFsTGluZXMpIHtcbiAgICAgIG5ld0hlaWdodCA9IHNuYXBwZWRTaW5nbGVMaW5lT3V0ZXJIZWlnaHRcbiAgICB9IGVsc2UgaWYgKGxpbmVzRm9ySGVpZ2h0IDw9IDEpIHtcbiAgICAgIG5ld0hlaWdodCA9IE1hdGgubWluKE1hdGgubWF4KHNuYXBwZWRTaW5nbGVMaW5lT3V0ZXJIZWlnaHQsIG1pbkhlaWdodCksIG1heEhlaWdodClcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc25hcHBlZEhlaWdodCA9IHBhZGRpbmdUb3AgKyBwYWRkaW5nQm90dG9tICsgYm9yZGVyVG9wICsgYm9yZGVyQm90dG9tICsgbGluZXNGb3JIZWlnaHQgKiBsaW5lSGVpZ2h0XG4gICAgICBuZXdIZWlnaHQgPSBNYXRoLm1pbihNYXRoLm1heChNYXRoLm1pbihzY3JvbGxIZWlnaHQsIHNuYXBwZWRIZWlnaHQpLCBtaW5IZWlnaHQpLCBtYXhIZWlnaHQpXG4gICAgfVxuXG4gICAgc2V0SXNUZXh0TXVsdGlsaW5lKHByZXYgPT4gKHByZXYgPT09IG5leHRNdWx0aWxpbmUgPyBwcmV2IDogbmV4dE11bHRpbGluZSkpXG5cbiAgICB0ZXh0YXJlYS5zdHlsZS5taW5IZWlnaHQgPSBwcmV2aW91c01pbkhlaWdodCB8fCBgJHttaW5IZWlnaHR9cHhgXG4gICAgdGV4dGFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gcHJldmlvdXNNYXhIZWlnaHQgfHwgJzEyMHB4J1xuXG4gICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gYCR7bmV3SGVpZ2h0fXB4YFxuICB9LCBbaW5wdXRSZWYsIHNldElzVGV4dE11bHRpbGluZV0pXG5cbiAgLyoqIENvbXBhY3TihpRzdGFja2VkIGNhbWJpYSBlbCBncmlkL0NTUyBkZWwgdGV4dGFyZWE7IG1lZGlyIGVuIGxheW91dCBldml0YSB1biBmcmFtZSBjb24gYWx0byBkZXNpbmNyb25pemFkbyAoc29icmUgdG9kbyBjb21wYWN04oaSc3RhY2tlZCkuICovXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaGFuZGxlUmVzaXplKClcbiAgfSwgW2NvbXBhY3RTaW5nbGVSb3dUb29sYmFyLCBoYW5kbGVSZXNpemVdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlucHV0UmVmLmN1cnJlbnQ/LnZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRleHRhcmVhTWluQ29udGVudFdpZHRoU2VlblJlZi5jdXJyZW50ID0gbnVsbFxuICAgIH1cbiAgfSwgW3Jlc2l6ZUVwb2NoXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHRleHRhcmVhTWluQ29udGVudFdpZHRoU2VlblJlZi5jdXJyZW50ID0gbnVsbFxuICB9LCBbY2hhdElkLCBuZXdDaGF0S2V5XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbnB1dFJlZi5jdXJyZW50ICYmICFkaXNhYmxlZCkge1xuICAgICAgaW5wdXRSZWYuY3VycmVudC5mb2N1cygpXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBoYW5kbGVSZXNpemUoKVxuICAgICAgfSlcbiAgICB9XG4gIH0sIFtkaXNhYmxlZCwgaGFuZGxlUmVzaXplXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjbGVhclNlcSA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRleHRhcmVhTWluQ29udGVudFdpZHRoU2VlblJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHByZXNlbmNlUHJldlJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgaGFuZGxlUmVzaXplKClcbiAgICB9KVxuICB9LCBbY2xlYXJTZXEsIGhhbmRsZVJlc2l6ZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBpZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBoYW5kbGVSZXNpemUoKVxuICAgIH0pXG4gICAgcmV0dXJuICgpID0+IGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKVxuICB9LCBbcmVzaXplRXBvY2gsIGhhbmRsZVJlc2l6ZV0pXG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKGU6IENoYW5nZUV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XG4gICAgY29uc3QgaGFzVHJpbSA9IGUudGFyZ2V0LnZhbHVlLnRyaW0oKS5sZW5ndGggPiAwXG4gICAgaWYgKGhhc1RyaW0gIT09IHByZXNlbmNlUHJldlJlZi5jdXJyZW50KSB7XG4gICAgICBwcmVzZW5jZVByZXZSZWYuY3VycmVudCA9IGhhc1RyaW1cbiAgICAgIG9uVHlwaW5nUHJlc2VuY2VDaGFuZ2UoaGFzVHJpbSlcbiAgICB9XG4gICAgc2V0UmVzaXplRXBvY2goeCA9PiB4ICsgMSlcbiAgICBvbkNoYW5nZVByb3A/LigpXG4gIH1cblxuICBjb25zdCBoYW5kbGVCbHVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHYgPSBpbnB1dFJlZi5jdXJyZW50Py52YWx1ZSA/PyAnJ1xuICAgIGNvbnN0IGhhc1RyaW0gPSB2LnRyaW0oKS5sZW5ndGggPiAwXG4gICAgaWYgKGhhc1RyaW0gIT09IHByZXNlbmNlUHJldlJlZi5jdXJyZW50KSB7XG4gICAgICBwcmVzZW5jZVByZXZSZWYuY3VycmVudCA9IGhhc1RyaW1cbiAgICAgIG9uVHlwaW5nUHJlc2VuY2VDaGFuZ2UoaGFzVHJpbSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgaWYgKCFzZW5kRGlzYWJsZWQgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgIG9uRW50ZXJTZW5kKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxTdHlsZWRNQUlBSW5wdXRcbiAgICAgIHJlZj17aW5wdXRSZWYgYXMgUmVmT2JqZWN0PEhUTUxUZXh0QXJlYUVsZW1lbnQ+fVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgIGFsaWduQnV0dG9ucz17YWxpZ25CdXR0b25zfVxuICAgICAgJHRvb2xiYXJMYXlvdXRWYXJpYW50PXtjb21wYWN0U2luZ2xlUm93VG9vbGJhciA/ICdjb21wYWN0Um93JyA6ICdzdGFja2VkUm93cyd9XG4gICAgICBvbkJsdXI9e2hhbmRsZUJsdXJ9XG4gICAgLz5cbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFxQ0EsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLGVBQWUsRUFBRUMsTUFBTSxFQUFFQyxRQUFRLFFBQVEs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LGNBQWMsQ0FBQyxVQUFBMkUsQ0FBQztNQUFBLE9BQUlBLENBQUMsR0FBRyxDQUFDO0lBQUEsRUFBQztJQUMxQmxGLFlBQVksYUFBWkEsWUFBWSxlQUFaQSxZQUFZLENBQUcsQ0FBQztFQUNsQixDQUFDO0VBRUQsSUFBTW1GLFVBQVUsR0FBRyxTQUFiQSxVQUFVQSxDQUFBLEVBQVM7SUFBQSxJQUFBQyxxQkFBQSxFQUFBQyxrQkFBQTtJQUN2QixJQUFNQyxDQUFDLElBQUFGLHFCQUFBLElBQUFDLGtCQUFBLEdBQUdqRyxRQUFRLENBQUN1QixPQUFPLGNBQUEwRSxrQkFBQSx1QkFBaEJBLGtCQUFBLENBQWtCckgsS0FBSyxjQUFBb0gscUJBQUEsY0FBQUEscUJBQUEsR0FBSSxFQUFFO0lBQ3ZDLElBQU1KLE9BQU8sR0FBR00sQ0FBQyxDQUFDckQsSUFBSSxDQUFDLENBQUMsQ0FBQ2hFLE1BQU0sR0FBRyxDQUFDO0lBQ25DLElBQUkrRyxPQUFPLEtBQUs5RSxlQUFlLENBQUNTLE9BQU8sRUFBRTtNQUN2Q1QsZUFBZSxDQUFDUyxPQUFPLEdBQUdxRSxPQUFPO01BQ2pDbEYsc0JBQXNCLENBQUNrRixPQUFPLENBQUM7SUFDakM7RUFDRixDQUFDO0VBRUQsSUFBTU8sYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUFJeEcsQ0FBcUMsRUFBSztJQUMvRCxJQUFJQSxDQUFDLENBQUN5RyxHQUFHLEtBQUssT0FBTyxJQUFJLENBQUN6RyxDQUFDLENBQUMwRyxRQUFRLEVBQUU7TUFDcEMxRyxDQUFDLENBQUMyRyxjQUFjLENBQUMsQ0FBQztNQUNsQixJQUFJLENBQUM3RixZQUFZLElBQUksQ0FBQ1IsUUFBUSxFQUFFO1FBQzlCVSxXQUFXLENBQUMsQ0FBQztNQUNmO0lBQ0Y7RUFDRixDQUFDO0VBRUQsb0JBQ0U5QyxJQUFBLENBQUNGLGVBQWU7SUFDZDRJLEdBQUcsRUFBRXZHLFFBQTJDO0lBQ2hEQyxRQUFRLEVBQUVBLFFBQVM7SUFDbkJ1RyxRQUFRLEVBQUViLFlBQWE7SUFDdkJjLFNBQVMsRUFBRU4sYUFBYztJQUN6QmpHLFdBQVcsRUFBRUEsV0FBWTtJQUN6QkMsWUFBWSxFQUFFQSxZQUFhO0lBQzNCdUcscUJBQXFCLEVBQUV0Ryx1QkFBdUIsR0FBRyxZQUFZLEdBQUcsYUFBYztJQUM5RXVHLE1BQU0sRUFBRVo7RUFBVyxDQUNwQixDQUFDO0FBRU4sQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==