@libs-ui/utils 0.2.348-8 → 0.2.350-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dom.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { DestroyRef } from '@angular/core';
2
2
  import { IBoundingClientRect } from '@libs-ui/interfaces-types';
3
- import Delta from 'quill-delta';
4
3
  import Bowser from 'bowser';
5
4
  export declare const getDeviceInfo: () => Bowser.Parser.Parser;
6
5
  export declare const isTouchDevice: () => boolean;
@@ -31,23 +30,3 @@ export declare const getDragEventByElement: (config: {
31
30
  functionMouseUp?: (event: MouseEvent) => void;
32
31
  destroyRef: DestroyRef;
33
32
  }) => import("rxjs").Observable<MouseEvent>;
34
- export declare const getHTMLFromQuill: (data: Delta | string, options?: {
35
- getRootHtml?: boolean;
36
- replaceNewLineTo?: string;
37
- replaceTagBRTo?: string;
38
- replaceBrToDiv?: boolean;
39
- functionReplaceDelta?: (op: Delta) => void;
40
- replaceTags?: {
41
- tag: string;
42
- replaceTo: string;
43
- }[];
44
- }) => Promise<string>;
45
- export declare const convertHtmlToDivBlocks: (html: string) => string;
46
- export declare const getDeltaFromHTML: (html: string) => Promise<Delta>;
47
- export declare const processPasteData: (e: ClipboardEvent, config: {
48
- element: HTMLElement;
49
- handlerPasteFile?: (files: FileList) => void;
50
- callBack?: (positonReturn: "file" | "range" | "content" | "no-content") => void;
51
- }) => Promise<void>;
52
- export declare const insertContentWithRange: (content: string, savedRange: Range, element: HTMLElement) => void;
53
- export declare const quill2xGetHtmlByDelta: (delta?: Delta | null) => string;
package/esm2022/dom.mjs CHANGED
@@ -1,13 +1,8 @@
1
1
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
2
- import Quill from 'quill';
3
- import Quill2x from 'quill2x';
4
- import { finalize, fromEvent, lastValueFrom, mergeMap, startWith, takeUntil, tap, timer } from 'rxjs';
5
- import { decodeEscapeHtml } from './format-text';
6
- import { set } from './helpers';
7
2
  import Bowser from 'bowser';
3
+ import { finalize, fromEvent, mergeMap, startWith, takeUntil, tap } from 'rxjs';
4
+ import { set } from './helpers';
8
5
  let parser = null;
9
- let quill = null;
10
- let quill2x = null;
11
6
  let bowserParser = null;
12
7
  export const getDeviceInfo = () => {
13
8
  if (!bowserParser) {
@@ -128,147 +123,4 @@ export const getDragEventByElement = (config) => {
128
123
  }), takeUntil(mouseup));
129
124
  return mouseDown.pipe(mergeMap((e) => (config.isStartWithMouseDownEvent ? mousemove.pipe(startWith(e)) : mousemove)), takeUntilDestroyed(config.destroyRef), finalize(removeClass));
130
125
  };
131
- export const getHTMLFromQuill = async (data, options) => {
132
- if (!quill) {
133
- quill = new Quill(document.createElement('div'));
134
- }
135
- const { replaceNewLineTo = '<br>', replaceTagBRTo, replaceTags, replaceBrToDiv } = options || {};
136
- const delta = typeof data === 'string' ? await getDeltaFromHTML(data) : data;
137
- if (options?.functionReplaceDelta) {
138
- options.functionReplaceDelta(delta);
139
- }
140
- delta.ops.forEach((op) => {
141
- if (op.insert) {
142
- if (typeof op.insert === 'string') {
143
- if (replaceNewLineTo) {
144
- op.insert = op.insert.replace(/\n/g, replaceNewLineTo);
145
- }
146
- if (replaceTagBRTo) {
147
- op.insert = op.insert.replace(/<br>/g, replaceTagBRTo);
148
- }
149
- if (replaceTags?.length) {
150
- for (const tag of replaceTags) {
151
- op.insert = op.insert.replace(new RegExp(`<${tag.tag}>`, 'g'), `<${tag.replaceTo}>`);
152
- op.insert = op.insert.replace(new RegExp(`</${tag.tag}>`, 'g'), `</${tag.replaceTo}>`);
153
- }
154
- }
155
- }
156
- }
157
- });
158
- quill.setContents(delta);
159
- let htmlText = options?.getRootHtml ? quill.root.innerHTML : quill.root.firstElementChild?.innerHTML;
160
- if (replaceBrToDiv) {
161
- htmlText = convertHtmlToDivBlocks(htmlText || '');
162
- }
163
- return decodeEscapeHtml(htmlText || '');
164
- };
165
- export const convertHtmlToDivBlocks = (html) => {
166
- const BREAK_TOKEN = '<<<BREAK>>>';
167
- // Bước 1: thay <br> thành token tạm
168
- const normalizedHtml = html.replace(/<br\s*\/?>/gi, BREAK_TOKEN);
169
- // Bước 2: tách theo token
170
- const parts = normalizedHtml.split(BREAK_TOKEN);
171
- const parser = new DOMParser();
172
- const divs = [];
173
- for (const raw of parts) {
174
- const trimmed = raw.trim();
175
- if (!trimmed)
176
- continue;
177
- // parse mỗi phần nhỏ như một document riêng
178
- const doc = parser.parseFromString(trimmed, 'text/html');
179
- const body = doc.body;
180
- // Lấy lại nội dung bên trong body
181
- divs.push(`<div>${body.innerHTML}</div>`);
182
- }
183
- return divs.join('');
184
- };
185
- export const getDeltaFromHTML = async (html) => {
186
- if (!quill) {
187
- quill = new Quill(document.createElement('div'));
188
- }
189
- quill.root.innerHTML = html;
190
- await lastValueFrom(timer(1000));
191
- return quill.getContents();
192
- };
193
- export const processPasteData = async (e, config) => {
194
- const element = config.element;
195
- const files = e.clipboardData?.files;
196
- if (files?.length) {
197
- e.preventDefault();
198
- config.handlerPasteFile?.(files);
199
- config.callBack?.('file');
200
- return;
201
- }
202
- // Lưu selection TRƯỚC khi prevent default
203
- const selection = window.getSelection();
204
- let savedRange = null;
205
- if (selection && selection.rangeCount > 0) {
206
- const range = selection.getRangeAt(0);
207
- // Chỉ lưu nếu range nằm trong contentText element
208
- const container = range.commonAncestorContainer;
209
- const isInContentElement = element.contains(container.nodeType === Node.TEXT_NODE ? container.parentNode : container);
210
- if (isInContentElement) {
211
- savedRange = range.cloneRange();
212
- }
213
- }
214
- // Prevent default để tự xử lý paste
215
- e.preventDefault();
216
- // Sử dụng Quill để clean HTML content
217
- const htmlContent = e.clipboardData?.getData('text/html') || '';
218
- const plainText = e.clipboardData?.getData('text/plain') || '';
219
- let contentToInsert = (plainText || '').replace(/\n/g, '<br>');
220
- if (htmlContent) {
221
- contentToInsert = await getHTMLFromQuill(htmlContent);
222
- }
223
- if (!contentToInsert) {
224
- config.callBack?.('no-content');
225
- return;
226
- }
227
- if (savedRange) {
228
- insertContentWithRange(contentToInsert, savedRange, element);
229
- config.callBack?.('range');
230
- return;
231
- }
232
- element.innerHTML += contentToInsert;
233
- config.callBack?.('content');
234
- };
235
- export const insertContentWithRange = (content, savedRange, element) => {
236
- const selection = window.getSelection();
237
- if (!selection) {
238
- // Fallback: append vào cuối
239
- element.innerHTML += content;
240
- return;
241
- }
242
- // Restore selection
243
- selection.removeAllRanges();
244
- selection.addRange(savedRange);
245
- // Xóa nội dung đã select (nếu có)
246
- savedRange.deleteContents();
247
- // Tạo document fragment từ HTML content
248
- const tempDiv = document.createElement('div');
249
- tempDiv.innerHTML = content;
250
- const fragment = document.createDocumentFragment();
251
- while (tempDiv.firstChild) {
252
- fragment.appendChild(tempDiv.firstChild);
253
- }
254
- // Insert fragment tại vị trí range
255
- savedRange.insertNode(fragment);
256
- // Di chuyển cursor đến cuối nội dung vừa insert
257
- if (fragment.lastChild) {
258
- savedRange.setStartAfter(fragment.lastChild);
259
- }
260
- savedRange.collapse(true);
261
- selection.removeAllRanges();
262
- selection.addRange(savedRange);
263
- };
264
- export const quill2xGetHtmlByDelta = (delta) => {
265
- if (!quill2x) {
266
- quill2x = new Quill2x(document.createElement('div'));
267
- }
268
- if (!delta || !delta.ops || !delta.ops.length) {
269
- return '';
270
- }
271
- quill2x.setContents(delta);
272
- return quill2x.root.innerHTML;
273
- };
274
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy11aS91dGlscy9zcmMvZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFFOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLElBQUksTUFBTSxHQUFxQixJQUFJLENBQUM7QUFDcEMsSUFBSSxLQUFLLEdBQWlCLElBQUksQ0FBQztBQUMvQixJQUFJLE9BQU8sR0FBbUIsSUFBSSxDQUFDO0FBQ25DLElBQUksWUFBWSxHQUFnQyxJQUFJLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRTtJQUNoQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsWUFBWSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQVksRUFBRSxDQUFDLENBQUMsZUFBZSxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLGNBQWMsSUFBSSxNQUFNLElBQUksQ0FBQyxN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QUFDO0FBQ2hDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc3Ryb3lSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IElCb3VuZGluZ0NsaWVudFJlY3QgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCBRdWlsbCBmcm9tICdxdWlsbCc7XG5pbXBvcnQgUXVpbGwyeCBmcm9tICdxdWlsbDJ4JztcbmltcG9ydCBEZWx0YSBmcm9tICdxdWlsbC1kZWx0YSc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgZnJvbUV2ZW50LCBsYXN0VmFsdWVGcm9tLCBtZXJnZU1hcCwgc3RhcnRXaXRoLCB0YWtlVW50aWwsIHRhcCwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlY29kZUVzY2FwZUh0bWwgfSBmcm9tICcuL2Zvcm1hdC10ZXh0JztcbmltcG9ydCB7IHNldCB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgQm93c2VyIGZyb20gJ2Jvd3Nlcic7XG5cbmxldCBwYXJzZXI6IERPTVBhcnNlciB8IG51bGwgPSBudWxsO1xubGV0IHF1aWxsOiBRdWlsbCB8IG51bGwgPSBudWxsO1xubGV0IHF1aWxsMng6IFF1aWxsMnggfCBudWxsID0gbnVsbDtcbmxldCBib3dzZXJQYXJzZXI6IEJvd3Nlci5QYXJzZXIuUGFyc2VyIHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBjb25zdCBnZXREZXZpY2VJbmZvID0gKCkgPT4ge1xuICBpZiAoIWJvd3NlclBhcnNlcikge1xuICAgIGJvd3NlclBhcnNlciA9IEJvd3Nlci5nZXRQYXJzZXIod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB9XG4gIHJldHVybiBib3dzZXJQYXJzZXI7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUb3VjaERldmljZSA9ICgpOiBib29sZWFuID0+ICgnb25wb2ludGVyZG93bicgaW4gbmF2aWdhdG9yICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDApIHx8ICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCAod2luZG93Lm1hdGNoTWVkaWE/LignKHBvaW50ZXI6IGNvYXJzZSknKS5tYXRjaGVzID8/IGZhbHNlKTtcblxuZXhwb3J0IGNvbnN0IGdldEV2ZW50TmFtZUhhbmRsZUNsaWNrID0gKCgpID0+IHtcbiAgaWYgKGlzVG91Y2hEZXZpY2UoKSkge1xuICAgIHJldHVybiAncG9pbnRlcmRvd24nO1xuICB9XG4gIGNvbnN0IGRldmljZUluZm8gPSBnZXREZXZpY2VJbmZvKCk7XG5cbiAgcmV0dXJuIGRldmljZUluZm8uaXNQbGF0Zm9ybSgnZGVza3RvcCcpID8gJ2NsaWNrJyA6ICd0b3VjaHN0YXJ0Jztcbn0pKCk7XG5cbmV4cG9ydCBjb25zdCBnZXREb2N1bWVudEJ5U3RyaW5nID0gKGh0bWxTdHI6IHN0cmluZyk6IERvY3VtZW50ID0+IHtcbiAgaWYgKCFwYXJzZXIpIHtcbiAgICBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaHRtbFN0ciwgJ3RleHQvaHRtbCcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsb25lSUJvdW5kaW5nQ2xpZW50UmVjdCA9IChyZWN0OiBJQm91bmRpbmdDbGllbnRSZWN0KTogSUJvdW5kaW5nQ2xpZW50UmVjdCA9PiB7XG4gIHJldHVybiB7XG4gICAgdG9wOiByZWN0Wyd0b3AnXSxcbiAgICBsZWZ0OiByZWN0WydsZWZ0J10sXG4gICAgd2lkdGg6IHJlY3RbJ3dpZHRoJ10sXG4gICAgaGVpZ2h0OiByZWN0WydoZWlnaHQnXSxcbiAgICBib3R0b206IHJlY3RbJ2JvdHRvbSddLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFN0eWxlc0VsZW1lbnQgPSAoZWw6IEhUTUxFbGVtZW50LCBzdHlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkID0+IHtcbiAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4gc2V0KGVsLCBgc3R5bGUuJHtrZXl9YCwgc3R5bGVzW2tleV0pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWaWV3cG9ydCA9ICh3aW46IFdpbmRvdyA9IHdpbmRvdyk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IGRvYyA9IHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgYm9keSA9IHdpbi5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLFxuICAgIHcgPSB3aW4uaW5uZXJXaWR0aCB8fCBkb2MuY2xpZW50V2lkdGggfHwgYm9keS5jbGllbnRXaWR0aCxcbiAgICBoID0gd2luLmlubmVySGVpZ2h0IHx8IGRvYy5jbGllbnRIZWlnaHQgfHwgYm9keS5jbGllbnRIZWlnaHQ7XG5cbiAgcmV0dXJuIHsgd2lkdGg6IHcsIGhlaWdodDogaCB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHNldENhcmV0UG9zaXRpb24gPSAoZWxlbWVudDogSFRNTFRleHRBcmVhRWxlbWVudCB8IEhUTUxJbnB1dEVsZW1lbnQsIHBvc2l0aW9uOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGVsZW1lbnQuZm9jdXMoKTtcbiAgZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShwb3NpdGlvbiwgcG9zaXRpb24pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrVmlld0luU2NyZWVuID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBlbGVtZW50U2Nyb2xsPzogSFRNTEVsZW1lbnQsIG1heFRvcExlZnQ/OiB7IHRvcD86IG51bWJlcjsgbGVmdD86IG51bWJlciB9KTogYm9vbGVhbiA9PiB7XG4gIGlmICghY29udGFpbmVyIHx8ICFlbGVtZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcmVjdENvbnRhaW5lciA9IGNsb25lSUJvdW5kaW5nQ2xpZW50UmVjdChjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuXG4gIGlmIChlbGVtZW50U2Nyb2xsKSB7XG4gICAgY29uc3QgcmVjdEVsZW1lbnRTY3JvbGwgPSBlbGVtZW50U2Nyb2xsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgcmVjdENvbnRhaW5lclsnbGVmdCddID0gcmVjdEVsZW1lbnRTY3JvbGwubGVmdDtcbiAgICByZWN0Q29udGFpbmVyWyd0b3AnXSA9IHJlY3RFbGVtZW50U2Nyb2xsLnRvcDtcbiAgfVxuXG4gIGNvbnN0IHJlY3RFbGVtZW50ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgeyBsZWZ0LCB0b3AgfSA9IHJlY3RFbGVtZW50O1xuICBjb25zdCB0b3BDb250YWluZXIgPSByZWN0Q29udGFpbmVyWyd0b3AnXTtcbiAgY29uc3QgbGVmdENvbnRhaW5lciA9IHJlY3RDb250YWluZXJbJ2xlZnQnXTtcbiAgY29uc3Qgd2lkdGhDb250YWluZXIgPSByZWN0Q29udGFpbmVyWyd3aWR0aCddO1xuICBjb25zdCBoZWlnaHRDb250YWluZXIgPSByZWN0Q29udGFpbmVyWydoZWlnaHQnXTtcbiAgY29uc3Qgc2Nyb2xsVG9wQ29udGFpbmVyID0gY29udGFpbmVyLnNjcm9sbFRvcDtcbiAgY29uc3Qgc2Nyb2xsTGVmdENvbnRhaW5lciA9IGNvbnRhaW5lci5zY3JvbGxMZWZ0O1xuICBjb25zdCBsaW1pdFRvcCA9IHRvcENvbnRhaW5lciArIHNjcm9sbFRvcENvbnRhaW5lciArIGhlaWdodENvbnRhaW5lcjtcbiAgY29uc3QgbGltaXRMZWZ0ID0gbGVmdENvbnRhaW5lciArIHNjcm9sbExlZnRDb250YWluZXIgKyB3aWR0aENvbnRhaW5lcjtcblxuICBjb25zdCBtYXhUb3BJdGVtID0gdG9wICsgKG1heFRvcExlZnQ/LnRvcCB8fCAwKTtcbiAgY29uc3QgbWF4TGVmdEl0ZW0gPSBsZWZ0ICsgKG1heFRvcExlZnQ/LmxlZnQgfHwgMCk7XG5cbiAgaWYgKHRvcENvbnRhaW5lciA8PSBtYXhUb3BJdGVtICYmIG1heFRvcEl0ZW0gPD0gbGltaXRUb3AgJiYgbGVmdENvbnRhaW5lciA8PSBtYXhMZWZ0SXRlbSAmJiBtYXhMZWZ0SXRlbSA8PSBsaW1pdExlZnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGVja01vdXNlT3ZlckluQ29udGFpbmVyID0gKG1vdXNlUG9zaXRpb246IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSwgZWxlbWVudD86IEhUTUxFbGVtZW50LCByZWN0PzogRE9NUmVjdCk6IGJvb2xlYW4gPT4ge1xuICBpZiAoIWVsZW1lbnQgJiYgIXJlY3QpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcmVjdEVsZW1lbnQgPSByZWN0IHx8IGVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHx8ICh7fSBhcyBET01SZWN0KTtcbiAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IHJlY3RFbGVtZW50O1xuICBjb25zdCBsaW1pdExlZnQgPSBsZWZ0ICsgd2lkdGg7XG4gIGNvbnN0IGxpbWl0VG9wID0gdG9wICsgaGVpZ2h0O1xuICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFkgfSA9IG1vdXNlUG9zaXRpb247XG4gIGlmIChsZWZ0IDw9IGNsaWVudFggJiYgY2xpZW50WCA8PSBsaW1pdExlZnQgJiYgdG9wIDw9IGNsaWVudFkgJiYgY2xpZW50WSA8PSBsaW1pdFRvcCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERyYWdFdmVudEJ5RWxlbWVudCA9IChjb25maWc6IHtcbiAgZWxlbWVudE1vdXNlRG93bjogSFRNTEVsZW1lbnQ7XG4gIGZ1bmN0aW9uTW91c2VEb3duPzogKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBpc1N0YXJ0V2l0aE1vdXNlRG93bkV2ZW50PzogYm9vbGVhbjtcbiAgZWxlbWVudE1vdXNlTW92ZT86IEhUTUxFbGVtZW50O1xuICBmdW5jdGlvbk1vdXNlTW92ZT86IChldmVudDogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgZWxlbWVudE1vdXNlVXA/OiBIVE1MRWxlbWVudDtcbiAgZnVuY3Rpb25Nb3VzZVVwPzogKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBkZXN0cm95UmVmOiBEZXN0cm95UmVmO1xufSkgPT4ge1xuICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBjb25zdCBhZGRDbGFzcyA9ICgpID0+IHtcbiAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCchc2VsZWN0LW5vbmUnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnIWN1cnNvci1ncmFiYmluZycpO1xuICAgIH0sIDI1MCk7XG4gIH07XG4gIGNvbnN0IHJlbW92ZUNsYXNzID0gKCkgPT4ge1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnIXNlbGVjdC1ub25lJyk7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCchY3Vyc29yLWdyYWJiaW5nJyk7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgfTtcbiAgZnJvbUV2ZW50KGNvbmZpZy5lbGVtZW50TW91c2VEb3duLCAnbW91c2VsZWF2ZScpXG4gICAgLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdjdXJzb3ItcG9pbnRlcicpKSxcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZChjb25maWcuZGVzdHJveVJlZilcbiAgICApXG4gICAgLnN1YnNjcmliZSgpO1xuICBmcm9tRXZlbnQoY29uZmlnLmVsZW1lbnRNb3VzZURvd24sICdtb3VzZWVudGVyJylcbiAgICAucGlwZShcbiAgICAgIHRhcCgoKSA9PiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2N1cnNvci1wb2ludGVyJykpLFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKGNvbmZpZy5kZXN0cm95UmVmKVxuICAgIClcbiAgICAuc3Vic2NyaWJlKCk7XG5cbiAgY29uc3QgbW91c2VEb3duID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbmZpZy5lbGVtZW50TW91c2VEb3duLCAnbW91c2Vkb3duJykucGlwZShcbiAgICB0YXAoKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBhZGRDbGFzcygpO1xuICAgICAgY29uZmlnLmZ1bmN0aW9uTW91c2VEb3duPy4oZSk7XG4gICAgfSlcbiAgKTtcbiAgY29uc3QgbW91c2V1cCA9IGZyb21FdmVudDxNb3VzZUV2ZW50Pihjb25maWcuZWxlbWVudE1vdXNlVXAgfHwgZG9jdW1lbnQsICdtb3VzZXVwJykucGlwZShcbiAgICB0YXAoKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZW1vdmVDbGFzcygpO1xuICAgICAgY29uZmlnLmZ1bmN0aW9uTW91c2VVcD8uKGUpO1xuICAgIH0pXG4gICk7XG5cbiAgY29uc3QgbW91c2Vtb3ZlID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbmZpZy5lbGVtZW50TW91c2VNb3ZlIHx8IGRvY3VtZW50LCAnbW91c2Vtb3ZlJykucGlwZShcbiAgICB0YXAoKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25maWcuZnVuY3Rpb25Nb3VzZU1vdmU/LihlKTtcbiAgICB9KSxcbiAgICB0YWtlVW50aWwobW91c2V1cClcbiAgKTtcblxuICByZXR1cm4gbW91c2VEb3duLnBpcGUoXG4gICAgbWVyZ2VNYXAoKGU6IE1vdXNlRXZlbnQpID0+IChjb25maWcuaXNTdGFydFdpdGhNb3VzZURvd25FdmVudCA/IG1vdXNlbW92ZS5waXBlKHN0YXJ0V2l0aChlKSkgOiBtb3VzZW1vdmUpKSxcbiAgICB0YWtlVW50aWxEZXN0cm95ZWQoY29uZmlnLmRlc3Ryb3lSZWYpLFxuICAgIGZpbmFsaXplKHJlbW92ZUNsYXNzKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhUTUxGcm9tUXVpbGwgPSBhc3luYyAoXG4gIGRhdGE6IERlbHRhIHwgc3RyaW5nLFxuICBvcHRpb25zPzoge1xuICAgIGdldFJvb3RIdG1sPzogYm9vbGVhbjtcbiAgICByZXBsYWNlTmV3TGluZVRvPzogc3RyaW5nO1xuICAgIHJlcGxhY2VUYWdCUlRvPzogc3RyaW5nO1xuICAgIHJlcGxhY2VCclRvRGl2PzogYm9vbGVhbjtcbiAgICBmdW5jdGlvblJlcGxhY2VEZWx0YT86IChvcDogRGVsdGEpID0+IHZvaWQ7XG4gICAgcmVwbGFjZVRhZ3M/OiB7XG4gICAgICB0YWc6IHN0cmluZztcbiAgICAgIHJlcGxhY2VUbzogc3RyaW5nO1xuICAgIH1bXTtcbiAgfVxuKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgaWYgKCFxdWlsbCkge1xuICAgIHF1aWxsID0gbmV3IFF1aWxsKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgfVxuICBjb25zdCB7IHJlcGxhY2VOZXdMaW5lVG8gPSAnPGJyPicsIHJlcGxhY2VUYWdCUlRvLCByZXBsYWNlVGFncywgcmVwbGFjZUJyVG9EaXYgfSA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IGRlbHRhID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gYXdhaXQgZ2V0RGVsdGFGcm9tSFRNTChkYXRhKSA6IGRhdGE7XG4gIGlmIChvcHRpb25zPy5mdW5jdGlvblJlcGxhY2VEZWx0YSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25SZXBsYWNlRGVsdGEoZGVsdGEpO1xuICB9XG5cbiAgZGVsdGEub3BzLmZvckVhY2goKG9wKSA9PiB7XG4gICAgaWYgKG9wLmluc2VydCkge1xuICAgICAgaWYgKHR5cGVvZiBvcC5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChyZXBsYWNlTmV3TGluZVRvKSB7XG4gICAgICAgICAgb3AuaW5zZXJ0ID0gb3AuaW5zZXJ0LnJlcGxhY2UoL1xcbi9nLCByZXBsYWNlTmV3TGluZVRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVwbGFjZVRhZ0JSVG8pIHtcbiAgICAgICAgICBvcC5pbnNlcnQgPSBvcC5pbnNlcnQucmVwbGFjZSgvPGJyPi9nLCByZXBsYWNlVGFnQlJUbyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVwbGFjZVRhZ3M/Lmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHJlcGxhY2VUYWdzKSB7XG4gICAgICAgICAgICBvcC5pbnNlcnQgPSBvcC5pbnNlcnQucmVwbGFjZShuZXcgUmVnRXhwKGA8JHt0YWcudGFnfT5gLCAnZycpLCBgPCR7dGFnLnJlcGxhY2VUb30+YCkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgb3AuaW5zZXJ0ID0gb3AuaW5zZXJ0LnJlcGxhY2UobmV3IFJlZ0V4cChgPC8ke3RhZy50YWd9PmAsICdnJyksIGA8LyR7dGFnLnJlcGxhY2VUb30+YCkgYXMgc3RyaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHF1aWxsLnNldENvbnRlbnRzKGRlbHRhKTtcbiAgbGV0IGh0bWxUZXh0ID0gb3B0aW9ucz8uZ2V0Um9vdEh0bWwgPyBxdWlsbC5yb290LmlubmVySFRNTCA6IHF1aWxsLnJvb3QuZmlyc3RFbGVtZW50Q2hpbGQ/LmlubmVySFRNTDtcbiAgaWYgKHJlcGxhY2VCclRvRGl2KSB7XG4gICAgaHRtbFRleHQgPSBjb252ZXJ0SHRtbFRvRGl2QmxvY2tzKGh0bWxUZXh0IHx8ICcnKTtcbiAgfVxuICByZXR1cm4gZGVjb2RlRXNjYXBlSHRtbChodG1sVGV4dCB8fCAnJyk7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydEh0bWxUb0RpdkJsb2NrcyA9IChodG1sOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBCUkVBS19UT0tFTiA9ICc8PDxCUkVBSz4+Pic7XG4gIC8vIELGsOG7m2MgMTogdGhheSA8YnI+IHRow6BuaCB0b2tlbiB04bqhbVxuICBjb25zdCBub3JtYWxpemVkSHRtbCA9IGh0bWwucmVwbGFjZSgvPGJyXFxzKlxcLz8+L2dpLCBCUkVBS19UT0tFTik7XG5cbiAgLy8gQsaw4bubYyAyOiB0w6FjaCB0aGVvIHRva2VuXG4gIGNvbnN0IHBhcnRzID0gbm9ybWFsaXplZEh0bWwuc3BsaXQoQlJFQUtfVE9LRU4pO1xuXG4gIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgY29uc3QgZGl2czogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhdyBvZiBwYXJ0cykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkgY29udGludWU7XG5cbiAgICAvLyBwYXJzZSBt4buXaSBwaOG6p24gbmjhu48gbmjGsCBt4buZdCBkb2N1bWVudCByacOqbmdcbiAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRyaW1tZWQsICd0ZXh0L2h0bWwnKTtcbiAgICBjb25zdCBib2R5ID0gZG9jLmJvZHk7XG5cbiAgICAvLyBM4bqleSBs4bqhaSBu4buZaSBkdW5nIGLDqm4gdHJvbmcgYm9keVxuICAgIGRpdnMucHVzaChgPGRpdj4ke2JvZHkuaW5uZXJIVE1MfTwvZGl2PmApO1xuICB9XG5cbiAgcmV0dXJuIGRpdnMuam9pbignJyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGVsdGFGcm9tSFRNTCA9IGFzeW5jIChodG1sOiBzdHJpbmcpOiBQcm9taXNlPERlbHRhPiA9PiB7XG4gIGlmICghcXVpbGwpIHtcbiAgICBxdWlsbCA9IG5ldyBRdWlsbChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gIH1cbiAgcXVpbGwucm9vdC5pbm5lckhUTUwgPSBodG1sO1xuXG4gIGF3YWl0IGxhc3RWYWx1ZUZyb20odGltZXIoMTAwMCkpO1xuICByZXR1cm4gcXVpbGwuZ2V0Q29udGVudHMoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzUGFzdGVEYXRhID0gYXN5bmMgKFxuICBlOiBDbGlwYm9hcmRFdmVudCxcbiAgY29uZmlnOiB7XG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgaGFuZGxlclBhc3RlRmlsZT86IChmaWxlczogRmlsZUxpc3QpID0+IHZvaWQ7XG4gICAgY2FsbEJhY2s/OiAocG9zaXRvblJldHVybjogJ2ZpbGUnIHwgJ3JhbmdlJyB8ICdjb250ZW50JyB8ICduby1jb250ZW50JykgPT4gdm9pZDtcbiAgfVxuKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnQgPSBjb25maWcuZWxlbWVudDtcbiAgY29uc3QgZmlsZXMgPSBlLmNsaXBib2FyZERhdGE/LmZpbGVzO1xuICBpZiAoZmlsZXM/Lmxlbmd0aCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25maWcuaGFuZGxlclBhc3RlRmlsZT8uKGZpbGVzKTtcbiAgICBjb25maWcuY2FsbEJhY2s/LignZmlsZScpO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBMxrB1IHNlbGVjdGlvbiBUUsav4buaQyBraGkgcHJldmVudCBkZWZhdWx0XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgbGV0IHNhdmVkUmFuZ2U6IFJhbmdlIHwgbnVsbCA9IG51bGw7XG4gIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAvLyBDaOG7iSBsxrB1IG7hur91IHJhbmdlIG7hurFtIHRyb25nIGNvbnRlbnRUZXh0IGVsZW1lbnRcbiAgICBjb25zdCBjb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcbiAgICBjb25zdCBpc0luQ29udGVudEVsZW1lbnQgPSBlbGVtZW50LmNvbnRhaW5zKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcik7XG4gICAgaWYgKGlzSW5Db250ZW50RWxlbWVudCkge1xuICAgICAgc2F2ZWRSYW5nZSA9IHJhbmdlLmNsb25lUmFuZ2UoKTtcbiAgICB9XG4gIH1cbiAgLy8gUHJldmVudCBkZWZhdWx0IMSR4buDIHThu7EgeOG7rSBsw70gcGFzdGVcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBT4butIGThu6VuZyBRdWlsbCDEkeG7gyBjbGVhbiBIVE1MIGNvbnRlbnRcbiAgY29uc3QgaHRtbENvbnRlbnQgPSBlLmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQvaHRtbCcpIHx8ICcnO1xuICBjb25zdCBwbGFpblRleHQgPSBlLmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQvcGxhaW4nKSB8fCAnJztcbiAgbGV0IGNvbnRlbnRUb0luc2VydCA9IChwbGFpblRleHQgfHwgJycpLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xuICBpZiAoaHRtbENvbnRlbnQpIHtcbiAgICBjb250ZW50VG9JbnNlcnQgPSBhd2FpdCBnZXRIVE1MRnJvbVF1aWxsKGh0bWxDb250ZW50KTtcbiAgfVxuXG4gIGlmICghY29udGVudFRvSW5zZXJ0KSB7XG4gICAgY29uZmlnLmNhbGxCYWNrPy4oJ25vLWNvbnRlbnQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2F2ZWRSYW5nZSkge1xuICAgIGluc2VydENvbnRlbnRXaXRoUmFuZ2UoY29udGVudFRvSW5zZXJ0LCBzYXZlZFJhbmdlLCBlbGVtZW50KTtcbiAgICBjb25maWcuY2FsbEJhY2s/LigncmFuZ2UnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgZWxlbWVudC5pbm5lckhUTUwgKz0gY29udGVudFRvSW5zZXJ0O1xuICBjb25maWcuY2FsbEJhY2s/LignY29udGVudCcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydENvbnRlbnRXaXRoUmFuZ2UgPSAoY29udGVudDogc3RyaW5nLCBzYXZlZFJhbmdlOiBSYW5nZSwgZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoIXNlbGVjdGlvbikge1xuICAgIC8vIEZhbGxiYWNrOiBhcHBlbmQgdsOgbyBjdeG7kWlcbiAgICBlbGVtZW50LmlubmVySFRNTCArPSBjb250ZW50O1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBSZXN0b3JlIHNlbGVjdGlvblxuICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIHNlbGVjdGlvbi5hZGRSYW5nZShzYXZlZFJhbmdlKTtcbiAgLy8gWMOzYSBu4buZaSBkdW5nIMSRw6Mgc2VsZWN0IChu4bq/dSBjw7MpXG4gIHNhdmVkUmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbiAgLy8gVOG6oW8gZG9jdW1lbnQgZnJhZ21lbnQgdOG7qyBIVE1MIGNvbnRlbnRcbiAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICB0ZW1wRGl2LmlubmVySFRNTCA9IGNvbnRlbnQ7XG4gIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICB3aGlsZSAodGVtcERpdi5maXJzdENoaWxkKSB7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQodGVtcERpdi5maXJzdENoaWxkKTtcbiAgfVxuICAvLyBJbnNlcnQgZnJhZ21lbnQgdOG6oWkgduG7iyB0csOtIHJhbmdlXG4gIHNhdmVkUmFuZ2UuaW5zZXJ0Tm9kZShmcmFnbWVudCk7XG4gIC8vIERpIGNodXnhu4NuIGN1cnNvciDEkeG6v24gY3Xhu5FpIG7hu5lpIGR1bmcgduG7q2EgaW5zZXJ0XG4gIGlmIChmcmFnbWVudC5sYXN0Q2hpbGQpIHtcbiAgICBzYXZlZFJhbmdlLnNldFN0YXJ0QWZ0ZXIoZnJhZ21lbnQubGFzdENoaWxkKTtcbiAgfVxuICBzYXZlZFJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIHNlbGVjdGlvbi5hZGRSYW5nZShzYXZlZFJhbmdlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBxdWlsbDJ4R2V0SHRtbEJ5RGVsdGEgPSAoZGVsdGE/OiBEZWx0YSB8IG51bGwpID0+IHtcbiAgaWYgKCFxdWlsbDJ4KSB7XG4gICAgcXVpbGwyeCA9IG5ldyBRdWlsbDJ4KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgfVxuICBpZiAoIWRlbHRhIHx8ICFkZWx0YS5vcHMgfHwgIWRlbHRhLm9wcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcXVpbGwyeC5zZXRDb250ZW50cyhkZWx0YSk7XG4gIHJldHVybiBxdWlsbDJ4LnJvb3QuaW5uZXJIVE1MO1xufTtcbiJdfQ==
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy11aS91dGlscy9zcmMvZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR2hFLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVoQyxJQUFJLE1BQU0sR0FBcUIsSUFBSSxDQUFDO0FBQ3BDLElBQUksWUFBWSxHQUFnQyxJQUFJLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRTtJQUNoQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsWUFBWSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQVksRUFBRSxDQUFDLENBQUMsZUFBZSxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLGNBQWMsSUFBSSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLENBQUM7QUFFdE0sTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxHQUFHLEVBQUU7SUFDM0MsSUFBSSxhQUFhLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxNQUFNLFVB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Q0FDdEYsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDUixDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDcEIsV0FBVyxFQUFFLENBQUM7UUFDZCxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBYSxNQUFNLENBQUMsZ0JBQWdCLElBQUksUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FDNUYsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDUixDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDcEIsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUNuQixDQUFDO0lBRUYsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUNuQixRQUFRLENBQUMsQ0FBQyxDQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUMxRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQ3JDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FDdEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlc3Ryb3lSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IElCb3VuZGluZ0NsaWVudFJlY3QgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcblxuaW1wb3J0IEJvd3NlciBmcm9tICdib3dzZXInO1xuaW1wb3J0IHsgZmluYWxpemUsIGZyb21FdmVudCwgbWVyZ2VNYXAsIHN0YXJ0V2l0aCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNldCB9IGZyb20gJy4vaGVscGVycyc7XG5cbmxldCBwYXJzZXI6IERPTVBhcnNlciB8IG51bGwgPSBudWxsO1xubGV0IGJvd3NlclBhcnNlcjogQm93c2VyLlBhcnNlci5QYXJzZXIgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGNvbnN0IGdldERldmljZUluZm8gPSAoKSA9PiB7XG4gIGlmICghYm93c2VyUGFyc2VyKSB7XG4gICAgYm93c2VyUGFyc2VyID0gQm93c2VyLmdldFBhcnNlcih3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gIH1cbiAgcmV0dXJuIGJvd3NlclBhcnNlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1RvdWNoRGV2aWNlID0gKCk6IGJvb2xlYW4gPT4gKCdvbnBvaW50ZXJkb3duJyBpbiBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMCkgfHwgJ29udG91Y2hzdGFydCcgaW4gd2luZG93IHx8ICh3aW5kb3cubWF0Y2hNZWRpYT8uKCcocG9pbnRlcjogY29hcnNlKScpLm1hdGNoZXMgPz8gZmFsc2UpO1xuXG5leHBvcnQgY29uc3QgZ2V0RXZlbnROYW1lSGFuZGxlQ2xpY2sgPSAoKCkgPT4ge1xuICBpZiAoaXNUb3VjaERldmljZSgpKSB7XG4gICAgcmV0dXJuICdwb2ludGVyZG93bic7XG4gIH1cbiAgY29uc3QgZGV2aWNlSW5mbyA9IGdldERldmljZUluZm8oKTtcblxuICByZXR1cm4gZGV2aWNlSW5mby5pc1BsYXRmb3JtKCdkZXNrdG9wJykgPyAnY2xpY2snIDogJ3RvdWNoc3RhcnQnO1xufSkoKTtcblxuZXhwb3J0IGNvbnN0IGdldERvY3VtZW50QnlTdHJpbmcgPSAoaHRtbFN0cjogc3RyaW5nKTogRG9jdW1lbnQgPT4ge1xuICBpZiAoIXBhcnNlcikge1xuICAgIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgfVxuICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sU3RyLCAndGV4dC9odG1sJyk7XG59O1xuXG5leHBvcnQgY29uc3QgY2xvbmVJQm91bmRpbmdDbGllbnRSZWN0ID0gKHJlY3Q6IElCb3VuZGluZ0NsaWVudFJlY3QpOiBJQm91bmRpbmdDbGllbnRSZWN0ID0+IHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IHJlY3RbJ3RvcCddLFxuICAgIGxlZnQ6IHJlY3RbJ2xlZnQnXSxcbiAgICB3aWR0aDogcmVjdFsnd2lkdGgnXSxcbiAgICBoZWlnaHQ6IHJlY3RbJ2hlaWdodCddLFxuICAgIGJvdHRvbTogcmVjdFsnYm90dG9tJ10sXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0U3R5bGVzRWxlbWVudCA9IChlbDogSFRNTEVsZW1lbnQsIHN0eWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHZvaWQgPT4ge1xuICBPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiBzZXQoZWwsIGBzdHlsZS4ke2tleX1gLCBzdHlsZXNba2V5XSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFZpZXdwb3J0ID0gKHdpbjogV2luZG93ID0gd2luZG93KTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9ID0+IHtcbiAgY29uc3QgZG9jID0gd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICBib2R5ID0gd2luLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0sXG4gICAgdyA9IHdpbi5pbm5lcldpZHRoIHx8IGRvYy5jbGllbnRXaWR0aCB8fCBib2R5LmNsaWVudFdpZHRoLFxuICAgIGggPSB3aW4uaW5uZXJIZWlnaHQgfHwgZG9jLmNsaWVudEhlaWdodCB8fCBib2R5LmNsaWVudEhlaWdodDtcblxuICByZXR1cm4geyB3aWR0aDogdywgaGVpZ2h0OiBoIH07XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q2FyZXRQb3NpdGlvbiA9IChlbGVtZW50OiBIVE1MVGV4dEFyZWFFbGVtZW50IHwgSFRNTElucHV0RWxlbWVudCwgcG9zaXRpb246IG51bWJlcik6IHZvaWQgPT4ge1xuICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZWxlbWVudC5mb2N1cygpO1xuICBlbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHBvc2l0aW9uLCBwb3NpdGlvbik7XG59O1xuXG5leHBvcnQgY29uc3QgY2hlY2tWaWV3SW5TY3JlZW4gPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgZWxlbWVudDogSFRNTEVsZW1lbnQsIGVsZW1lbnRTY3JvbGw/OiBIVE1MRWxlbWVudCwgbWF4VG9wTGVmdD86IHsgdG9wPzogbnVtYmVyOyBsZWZ0PzogbnVtYmVyIH0pOiBib29sZWFuID0+IHtcbiAgaWYgKCFjb250YWluZXIgfHwgIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCByZWN0Q29udGFpbmVyID0gY2xvbmVJQm91bmRpbmdDbGllbnRSZWN0KGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG5cbiAgaWYgKGVsZW1lbnRTY3JvbGwpIHtcbiAgICBjb25zdCByZWN0RWxlbWVudFNjcm9sbCA9IGVsZW1lbnRTY3JvbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICByZWN0Q29udGFpbmVyWydsZWZ0J10gPSByZWN0RWxlbWVudFNjcm9sbC5sZWZ0O1xuICAgIHJlY3RDb250YWluZXJbJ3RvcCddID0gcmVjdEVsZW1lbnRTY3JvbGwudG9wO1xuICB9XG5cbiAgY29uc3QgcmVjdEVsZW1lbnQgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gcmVjdEVsZW1lbnQ7XG4gIGNvbnN0IHRvcENvbnRhaW5lciA9IHJlY3RDb250YWluZXJbJ3RvcCddO1xuICBjb25zdCBsZWZ0Q29udGFpbmVyID0gcmVjdENvbnRhaW5lclsnbGVmdCddO1xuICBjb25zdCB3aWR0aENvbnRhaW5lciA9IHJlY3RDb250YWluZXJbJ3dpZHRoJ107XG4gIGNvbnN0IGhlaWdodENvbnRhaW5lciA9IHJlY3RDb250YWluZXJbJ2hlaWdodCddO1xuICBjb25zdCBzY3JvbGxUb3BDb250YWluZXIgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuICBjb25zdCBzY3JvbGxMZWZ0Q29udGFpbmVyID0gY29udGFpbmVyLnNjcm9sbExlZnQ7XG4gIGNvbnN0IGxpbWl0VG9wID0gdG9wQ29udGFpbmVyICsgc2Nyb2xsVG9wQ29udGFpbmVyICsgaGVpZ2h0Q29udGFpbmVyO1xuICBjb25zdCBsaW1pdExlZnQgPSBsZWZ0Q29udGFpbmVyICsgc2Nyb2xsTGVmdENvbnRhaW5lciArIHdpZHRoQ29udGFpbmVyO1xuXG4gIGNvbnN0IG1heFRvcEl0ZW0gPSB0b3AgKyAobWF4VG9wTGVmdD8udG9wIHx8IDApO1xuICBjb25zdCBtYXhMZWZ0SXRlbSA9IGxlZnQgKyAobWF4VG9wTGVmdD8ubGVmdCB8fCAwKTtcblxuICBpZiAodG9wQ29udGFpbmVyIDw9IG1heFRvcEl0ZW0gJiYgbWF4VG9wSXRlbSA8PSBsaW1pdFRvcCAmJiBsZWZ0Q29udGFpbmVyIDw9IG1heExlZnRJdGVtICYmIG1heExlZnRJdGVtIDw9IGxpbWl0TGVmdCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrTW91c2VPdmVySW5Db250YWluZXIgPSAobW91c2VQb3NpdGlvbjogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9LCBlbGVtZW50PzogSFRNTEVsZW1lbnQsIHJlY3Q/OiBET01SZWN0KTogYm9vbGVhbiA9PiB7XG4gIGlmICghZWxlbWVudCAmJiAhcmVjdCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCByZWN0RWxlbWVudCA9IHJlY3QgfHwgZWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgfHwgKHt9IGFzIERPTVJlY3QpO1xuICBjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gcmVjdEVsZW1lbnQ7XG4gIGNvbnN0IGxpbWl0TGVmdCA9IGxlZnQgKyB3aWR0aDtcbiAgY29uc3QgbGltaXRUb3AgPSB0b3AgKyBoZWlnaHQ7XG4gIGNvbnN0IHsgY2xpZW50WCwgY2xpZW50WSB9ID0gbW91c2VQb3NpdGlvbjtcbiAgaWYgKGxlZnQgPD0gY2xpZW50WCAmJiBjbGllbnRYIDw9IGxpbWl0TGVmdCAmJiB0b3AgPD0gY2xpZW50WSAmJiBjbGllbnRZIDw9IGxpbWl0VG9wKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RHJhZ0V2ZW50QnlFbGVtZW50ID0gKGNvbmZpZzoge1xuICBlbGVtZW50TW91c2VEb3duOiBIVE1MRWxlbWVudDtcbiAgZnVuY3Rpb25Nb3VzZURvd24/OiAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIGlzU3RhcnRXaXRoTW91c2VEb3duRXZlbnQ/OiBib29sZWFuO1xuICBlbGVtZW50TW91c2VNb3ZlPzogSFRNTEVsZW1lbnQ7XG4gIGZ1bmN0aW9uTW91c2VNb3ZlPzogKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBlbGVtZW50TW91c2VVcD86IEhUTUxFbGVtZW50O1xuICBmdW5jdGlvbk1vdXNlVXA/OiAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIGRlc3Ryb3lSZWY6IERlc3Ryb3lSZWY7XG59KSA9PiB7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIGNvbnN0IGFkZENsYXNzID0gKCkgPT4ge1xuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJyFzZWxlY3Qtbm9uZScpO1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCchY3Vyc29yLWdyYWJiaW5nJyk7XG4gICAgfSwgMjUwKTtcbiAgfTtcbiAgY29uc3QgcmVtb3ZlQ2xhc3MgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCchc2VsZWN0LW5vbmUnKTtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJyFjdXJzb3ItZ3JhYmJpbmcnKTtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9O1xuICBmcm9tRXZlbnQoY29uZmlnLmVsZW1lbnRNb3VzZURvd24sICdtb3VzZWxlYXZlJylcbiAgICAucGlwZShcbiAgICAgIHRhcCgoKSA9PiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2N1cnNvci1wb2ludGVyJykpLFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKGNvbmZpZy5kZXN0cm95UmVmKVxuICAgIClcbiAgICAuc3Vic2NyaWJlKCk7XG4gIGZyb21FdmVudChjb25maWcuZWxlbWVudE1vdXNlRG93biwgJ21vdXNlZW50ZXInKVxuICAgIC5waXBlKFxuICAgICAgdGFwKCgpID0+IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnY3Vyc29yLXBvaW50ZXInKSksXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoY29uZmlnLmRlc3Ryb3lSZWYpXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKTtcblxuICBjb25zdCBtb3VzZURvd24gPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4oY29uZmlnLmVsZW1lbnRNb3VzZURvd24sICdtb3VzZWRvd24nKS5waXBlKFxuICAgIHRhcCgoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGFkZENsYXNzKCk7XG4gICAgICBjb25maWcuZnVuY3Rpb25Nb3VzZURvd24/LihlKTtcbiAgICB9KVxuICApO1xuICBjb25zdCBtb3VzZXVwID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbmZpZy5lbGVtZW50TW91c2VVcCB8fCBkb2N1bWVudCwgJ21vdXNldXAnKS5waXBlKFxuICAgIHRhcCgoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJlbW92ZUNsYXNzKCk7XG4gICAgICBjb25maWcuZnVuY3Rpb25Nb3VzZVVwPy4oZSk7XG4gICAgfSlcbiAgKTtcblxuICBjb25zdCBtb3VzZW1vdmUgPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4oY29uZmlnLmVsZW1lbnRNb3VzZU1vdmUgfHwgZG9jdW1lbnQsICdtb3VzZW1vdmUnKS5waXBlKFxuICAgIHRhcCgoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbmZpZy5mdW5jdGlvbk1vdXNlTW92ZT8uKGUpO1xuICAgIH0pLFxuICAgIHRha2VVbnRpbChtb3VzZXVwKVxuICApO1xuXG4gIHJldHVybiBtb3VzZURvd24ucGlwZShcbiAgICBtZXJnZU1hcCgoZTogTW91c2VFdmVudCkgPT4gKGNvbmZpZy5pc1N0YXJ0V2l0aE1vdXNlRG93bkV2ZW50ID8gbW91c2Vtb3ZlLnBpcGUoc3RhcnRXaXRoKGUpKSA6IG1vdXNlbW92ZSkpLFxuICAgIHRha2VVbnRpbERlc3Ryb3llZChjb25maWcuZGVzdHJveVJlZiksXG4gICAgZmluYWxpemUocmVtb3ZlQ2xhc3MpXG4gICk7XG59O1xuIl19