@flogeez/angular-tiptap-editor 3.8.0 → 3.9.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/CHANGELOG.md +25 -0
- package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +30 -20
- package/esm2022/lib/components/editor/ate-block-controls.component.mjs +67 -18
- package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +5 -7
- package/esm2022/lib/extensions/ate-block-controls.extension.mjs +222 -4
- package/esm2022/lib/services/ate-image.service.mjs +83 -36
- package/fesm2022/flogeez-angular-tiptap-editor.mjs +550 -231
- package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
- package/lib/components/editor/angular-tiptap-editor.component.d.ts +7 -0
- package/lib/components/editor/ate-block-controls.component.d.ts +9 -0
- package/lib/extensions/ate-block-controls.extension.d.ts +10 -0
- package/lib/services/ate-image.service.d.ts +15 -1
- package/package.json +1 -1
- package/src/lib/styles/index.css +13 -0
- package/styles/index.css +13 -0
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { Injectable, signal, computed, inject } from "@angular/core";
|
|
2
|
+
import { NodeSelection } from "@tiptap/pm/state";
|
|
2
3
|
import { isObservable, firstValueFrom } from "rxjs";
|
|
3
4
|
import { AteEditorI18n } from "./ate-editor-i18n.service";
|
|
4
5
|
import { ateResolveImageSrc } from "../utils/ate-image-src-resolver.utils";
|
|
5
6
|
import { AteImageValidationError, } from "../models/ate-image.model";
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
8
|
+
/** Whether `pos` holds an image node (`NodeSelection.create` throws on an empty position) */
|
|
9
|
+
function isImageAt(doc, pos) {
|
|
10
|
+
return pos >= 0 && pos < doc.content.size && doc.nodeAt(pos)?.type.name === "resizableImage";
|
|
11
|
+
}
|
|
7
12
|
export class AteImageService {
|
|
8
13
|
constructor() {
|
|
9
14
|
/** Signals for image state */
|
|
@@ -50,11 +55,15 @@ export class AteImageService {
|
|
|
50
55
|
.chain()
|
|
51
56
|
.focus()
|
|
52
57
|
.setResizableImage(imageData)
|
|
53
|
-
.command(({ tr
|
|
58
|
+
.command(({ tr }) => {
|
|
54
59
|
// Selection is usually after the node. Node is at tr.selection.from - 1.
|
|
60
|
+
// Only select a position that holds an image: NodeSelection throws on an empty position.
|
|
55
61
|
const { from } = tr.selection;
|
|
56
|
-
|
|
57
|
-
|
|
62
|
+
const imagePos = [from, from - 1].find(pos => isImageAt(tr.doc, pos));
|
|
63
|
+
if (imagePos !== undefined) {
|
|
64
|
+
tr.setSelection(NodeSelection.create(tr.doc, imagePos));
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
58
67
|
})
|
|
59
68
|
.run();
|
|
60
69
|
}
|
|
@@ -418,42 +427,80 @@ export class AteImageService {
|
|
|
418
427
|
}
|
|
419
428
|
/** Select file and replace currently selected image */
|
|
420
429
|
async selectAndReplaceImage(editor, options) {
|
|
421
|
-
//
|
|
422
|
-
|
|
423
|
-
|
|
430
|
+
// Remember the image now: opening the file picker can move the selection (e.g. on WebKit)
|
|
431
|
+
const target = this.trackSelectedImage(editor);
|
|
432
|
+
try {
|
|
433
|
+
await this.selectFileAndProcess(editor, (ed, file, opts, source) => this.uploadAndReplaceImage(ed, file, opts, source, target), options);
|
|
434
|
+
}
|
|
435
|
+
finally {
|
|
436
|
+
target.stop();
|
|
437
|
+
}
|
|
424
438
|
}
|
|
425
439
|
/** Internal helper used by replacement logic */
|
|
426
|
-
async uploadAndReplaceImage(editor, file, options, source = "api") {
|
|
427
|
-
//
|
|
428
|
-
const
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
440
|
+
async uploadAndReplaceImage(editor, file, options, source = "api", target) {
|
|
441
|
+
// The image to replace is the one selected when the replacement started, wherever the selection is after the upload
|
|
442
|
+
const tracked = target ?? this.trackSelectedImage(editor);
|
|
443
|
+
try {
|
|
444
|
+
await this.uploadImageWithProgress(editor, file, (ed, result) => {
|
|
445
|
+
const imageData = {
|
|
446
|
+
src: result.src,
|
|
447
|
+
alt: result.name,
|
|
448
|
+
title: `${result.name} (${result.width}×${result.height})`,
|
|
449
|
+
width: result.width,
|
|
450
|
+
height: result.height,
|
|
451
|
+
};
|
|
452
|
+
if (this.replaceImageAt(ed, tracked.pos(), imageData)) {
|
|
453
|
+
this.updateSelectedImage(imageData);
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
// No image to replace (none was selected, or it was removed during the upload): insert at cursor
|
|
457
|
+
this.insertImage(ed, imageData);
|
|
458
|
+
}
|
|
459
|
+
// After replacement, ensure the image is tracked in our signals
|
|
460
|
+
this.selectImage(ed);
|
|
461
|
+
}, this.t().replacingImage, options, source);
|
|
462
|
+
}
|
|
463
|
+
finally {
|
|
464
|
+
if (!target) {
|
|
465
|
+
tracked.stop();
|
|
449
466
|
}
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Remembers the selected image and follows its position through the transactions
|
|
471
|
+
* dispatched until `stop()` (e.g. while the file picker is open and the image uploads).
|
|
472
|
+
*/
|
|
473
|
+
trackSelectedImage(editor) {
|
|
474
|
+
const { selection } = editor.state;
|
|
475
|
+
let pos = selection instanceof NodeSelection && isImageAt(editor.state.doc, selection.from)
|
|
476
|
+
? selection.from
|
|
477
|
+
: null;
|
|
478
|
+
const onTransaction = ({ transaction }) => {
|
|
479
|
+
if (pos !== null && transaction.docChanged) {
|
|
480
|
+
pos = transaction.mapping.map(pos);
|
|
453
481
|
}
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
482
|
+
};
|
|
483
|
+
editor.on("transaction", onTransaction);
|
|
484
|
+
return {
|
|
485
|
+
pos: () => pos,
|
|
486
|
+
stop: () => editor.off("transaction", onTransaction),
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
/** Replaces the image at `pos` with `imageData` (keeping its other attributes) and selects it */
|
|
490
|
+
replaceImageAt(editor, pos, imageData) {
|
|
491
|
+
if (pos === null || !isImageAt(editor.state.doc, pos)) {
|
|
492
|
+
return false;
|
|
493
|
+
}
|
|
494
|
+
return editor
|
|
495
|
+
.chain()
|
|
496
|
+
.focus()
|
|
497
|
+
.command(({ tr }) => {
|
|
498
|
+
const node = tr.doc.nodeAt(pos);
|
|
499
|
+
tr.setNodeMarkup(pos, undefined, { ...node.attrs, ...imageData });
|
|
500
|
+
tr.setSelection(NodeSelection.create(tr.doc, pos));
|
|
501
|
+
return true;
|
|
502
|
+
})
|
|
503
|
+
.run();
|
|
457
504
|
}
|
|
458
505
|
/**
|
|
459
506
|
* Handle image drop event.
|
|
@@ -500,4 +547,4 @@ export class AteImageService {
|
|
|
500
547
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteImageService, decorators: [{
|
|
501
548
|
type: Injectable
|
|
502
549
|
}] });
|
|
503
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWltYWdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXRpcHRhcC1lZGl0b3Ivc3JjL2xpYi9zZXJ2aWNlcy9hdGUtaW1hZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJFLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRSxPQUFPLEVBU0wsdUJBQXVCLEdBRXhCLE1BQU0sMkJBQTJCLENBQUM7O0FBR25DLE1BQU0sT0FBTyxlQUFlO0lBRDVCO1FBS0UsOEJBQThCO1FBQzlCLGtCQUFhLEdBQUcsTUFBTSxDQUFzQixJQUFJLENBQUMsQ0FBQztRQUNsRCxvQkFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7UUFFaEUscUJBQXFCO1FBQ3JCLGVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbkIsU0FBSSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNwQixNQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFM0MsMkJBQTJCO1FBQzNCLGdCQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLG1CQUFjLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLGtCQUFhLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTNCOzs7V0FHRztRQUNILGtC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LE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXLENBQUMsTUFBYyxFQUFFLEtBQXFCLEVBQUUsT0FBK0I7UUFDaEYsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUM7UUFDbEQsSUFBSSxDQUFDLGNBQWMsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25ELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUMxRixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7K0dBL21CVSxlQUFlO21IQUFmLGVBQWU7OzRGQUFmLGVBQWU7a0JBRDNCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwsIGNvbXB1dGVkLCBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBBdGVFZGl0b3JJMThuIH0gZnJvbSBcIi4vYXRlLWVkaXRvci1pMThuLnNlcnZpY2VcIjtcbmltcG9ydCB7IGF0ZVJlc29sdmVJbWFnZVNyYyB9IGZyb20gXCIuLi91dGlscy9hdGUtaW1hZ2Utc3JjLXJlc29sdmVyLnV0aWxzXCI7XG5pbXBvcnQge1xuICBBdGVSZXNpemVPcHRpb25zLFxuICBBdGVJbWFnZVVwbG9hZE9wdGlvbnMsXG4gIEF0ZUltYWdlVXBsb2FkSGFuZGxlcixcbiAgQXRlSW1hZ2VTcmNSZXNvbHZlcixcbiAgQXRlSW1hZ2VVcGxvYWRSZXN1bHQsXG4gIEF0ZUltYWdlRGF0YSxcbiAgQXRlSW1hZ2VSZWplY3Rpb24sXG4gIEF0ZUltYWdlU291cmNlLFxuICBBdGVJbWFnZVZhbGlkYXRpb25FcnJvcixcbiAgQXRlSW1hZ2VWYWxpZGF0aW9uUmVhc29uLFxufSBmcm9tIFwiLi4vbW9kZWxzL2F0ZS1pbWFnZS5tb2RlbFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXRlSW1hZ2VTZXJ2aWNlIHtcbiAgb25JbWFnZVVwbG9hZGVkQ2FsbGJhY2s/OiAocmVzdWx0OiBBdGVJbWFnZVVwbG9hZFJlc3VsdCkgPT4gdm9pZDtcbiAgb25JbWFnZVJlamVjdGVkQ2FsbGJhY2s/OiAocmVqZWN0aW9uOiBBdGVJbWFnZVJlamVjdGlvbikgPT4gdm9pZDtcblxuICAvKiogU2lnbmFscyBmb3IgaW1hZ2Ugc3RhdGUgKi9cbiAgc2VsZWN0ZWRJbWFnZSA9IHNpZ25hbDxBdGVJbWFnZURhdGEgfCBudWxsPihudWxsKTtcbiAgaXNJbWFnZVNlbGVjdGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3RlZEltYWdlKCkgIT09IG51bGwpO1xuXG4gIC8qKiBSZXNpemluZyBzdGF0ZSAqL1xuICBpc1Jlc2l6aW5nID0gc2lnbmFsKGZhbHNlKTtcblxuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoQXRlRWRpdG9ySTE4bik7XG4gIHByaXZhdGUgcmVhZG9ubHkgdCA9IHRoaXMuaTE4bi5pbWFnZVVwbG9hZDtcblxuICAvKiogVXBsb2FkIHN0YXRlIHNpZ25hbHMgKi9cbiAgaXNVcGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICB1cGxvYWRQcm9ncmVzcyA9IHNpZ25hbCgwKTtcbiAgdXBsb2FkTWVzc2FnZSA9IHNpZ25hbChcIlwiKTtcblxuICAvKipcbiAgICogQ3VzdG9tIHVwbG9hZCBoYW5kbGVyLlxuICAgKiBJZiBzZXQsIHRoaXMgaGFuZGxlciByZXBsYWNlcyB0aGUgZGVmYXVsdCBiYXNlNjQgY29udmVyc2lvbi5cbiAgICovXG4gIHVwbG9hZEhhbmRsZXI6IEF0ZUltYWdlVXBsb2FkSGFuZGxlciB8IG51bGwgPSBudWxsO1xuXG4gIHNyY1Jlc29sdmVyOiBBdGVJbWFnZVNyY1Jlc29sdmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBjdXJyZW50RWRpdG9yOiBFZGl0b3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogU2VsZWN0IGFuZCB0cmFjayBhbiBpbWFnZSBmcm9tIHRoZSBlZGl0b3IgKi9cbiAgc2VsZWN0SW1hZ2UoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoZWRpdG9yLmlzQWN0aXZlKFwicmVzaXphYmxlSW1hZ2VcIikpIHtcbiAgICAgIGNvbnN0IGF0dHJzID0gZWRpdG9yLmdldEF0dHJpYnV0ZXMoXCJyZXNpemFibGVJbWFnZVwiKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZS5zZXQoe1xuICAgICAgICBzcmM6IGF0dHJzW1wic3JjXCJdLFxuICAgICAgICBhbHQ6IGF0dHJzW1wiYWx0XCJdLFxuICAgICAgICB0aXRsZTogYXR0cnNbXCJ0aXRsZVwiXSxcbiAgICAgICAgd2lkdGg6IGF0dHJzW1wid2lkdGhcIl0sXG4gICAgICAgIGhlaWdodDogYXR0cnNbXCJoZWlnaHRcIl0sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZEltYWdlLnNldChudWxsKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkSW1hZ2Uuc2V0KG51bGwpO1xuICB9XG5cbiAgLyoqIEluc2VydCBhIG5ldyBpbWFnZSBhbmQgZW5zdXJlIGl0J3Mgc2VsZWN0ZWQgKi9cbiAgaW5zZXJ0SW1hZ2UoZWRpdG9yOiBFZGl0b3IsIGltYWdlRGF0YTogQXRlSW1hZ2VEYXRhKTogdm9pZCB7XG4gICAgZWRpdG9yXG4gICAgICAuY2hhaW4oKVxuICAgICAgLmZvY3VzKClcbiAgICAgIC5zZXRSZXNpemFibGVJbWFnZShpbWFnZURhdGEpXG4gICAgICAuY29tbWFuZCgoeyB0ciwgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAvLyBTZWxlY3Rpb24gaXMgdXN1YWxseSBhZnRlciB0aGUgbm9kZS4gTm9kZSBpcyBhdCB0ci5zZWxlY3Rpb24uZnJvbSAtIDEuXG4gICAgICAgIGNvbnN0IHsgZnJvbSB9ID0gdHIuc2VsZWN0aW9uO1xuICAgICAgICAvLyBUcnkgdG8gc2VsZWN0IG5vZGUgYXQgY3VycmVudCBwb3MgKGlmIGl0IHdhcyBhbHJlYWR5IHNlbGVjdGVkKSBvciBwcmV2aW91cyBwb3NcbiAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE5vZGVTZWxlY3Rpb24oZnJvbSkgfHwgY29tbWFuZHMuc2V0Tm9kZVNlbGVjdGlvbihmcm9tIC0gMSkgfHwgdHJ1ZTtcbiAgICAgIH0pXG4gICAgICAucnVuKCk7XG4gIH1cblxuICAvKiogVXBkYXRlIGF0dHJpYnV0ZXMgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW1hZ2UgKi9cbiAgdXBkYXRlSW1hZ2VBdHRyaWJ1dGVzKGVkaXRvcjogRWRpdG9yLCBhdHRyaWJ1dGVzOiBQYXJ0aWFsPEF0ZUltYWdlRGF0YT4pOiB2b2lkIHtcbiAgICBpZiAoZWRpdG9yLmlzQWN0aXZlKFwicmVzaXphYmxlSW1hZ2VcIikpIHtcbiAgICAgIGNvbnN0IHBvcyA9IGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZnJvbTtcbiAgICAgIGVkaXRvclxuICAgICAgICAuY2hhaW4oKVxuICAgICAgICAuZm9jdXMoKVxuICAgICAgICAudXBkYXRlQXR0cmlidXRlcyhcInJlc2l6YWJsZUltYWdlXCIsIGF0dHJpYnV0ZXMpXG4gICAgICAgIC5zZXROb2RlU2VsZWN0aW9uKHBvcylcbiAgICAgICAgLnJ1bigpO1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEltYWdlKGF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXNpemUgaW1hZ2Ugd2l0aCBvcHRpb25hbCBhc3BlY3QgcmF0aW8gbWFpbnRlbmFuY2UgKi9cbiAgcmVzaXplSW1hZ2UoZWRpdG9yOiBFZGl0b3IsIG9wdGlvbnM6IEF0ZVJlc2l6ZU9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvci5pc0FjdGl2ZShcInJlc2l6YWJsZUltYWdlXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudEF0dHJzID0gZWRpdG9yLmdldEF0dHJpYnV0ZXMoXCJyZXNpemFibGVJbWFnZVwiKTtcbiAgICBsZXQgbmV3V2lkdGggPSBvcHRpb25zLndpZHRoO1xuICAgIGxldCBuZXdIZWlnaHQgPSBvcHRpb25zLmhlaWdodDtcblxuICAgIC8vIE1haW50YWluIGFzcGVjdCByYXRpbyBpZiByZXF1ZXN0ZWRcbiAgICBpZiAob3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvICE9PSBmYWxzZSAmJiBjdXJyZW50QXR0cnNbXCJ3aWR0aFwiXSAmJiBjdXJyZW50QXR0cnNbXCJoZWlnaHRcIl0pIHtcbiAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gY3VycmVudEF0dHJzW1wid2lkdGhcIl0gLyBjdXJyZW50QXR0cnNbXCJoZWlnaHRcIl07XG5cbiAgICAgIGlmIChuZXdXaWR0aCAmJiAhbmV3SGVpZ2h0KSB7XG4gICAgICAgIG5ld0hlaWdodCA9IE1hdGgucm91bmQobmV3V2lkdGggLyBhc3BlY3RSYXRpbyk7XG4gICAgICB9IGVsc2UgaWYgKG5ld0hlaWdodCAmJiAhbmV3V2lkdGgpIHtcbiAgICAgICAgbmV3V2lkdGggPSBNYXRoLnJvdW5kKG5ld0hlaWdodCAqIGFzcGVjdFJhdGlvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBseSBtaW5pbXVtIGxpbWl0c1xuICAgIGlmIChuZXdXaWR0aCkge1xuICAgICAgbmV3V2lkdGggPSBNYXRoLm1heCg1MCwgbmV3V2lkdGgpO1xuICAgIH1cbiAgICBpZiAobmV3SGVpZ2h0KSB7XG4gICAgICBuZXdIZWlnaHQgPSBNYXRoLm1heCg1MCwgbmV3SGVpZ2h0KTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUltYWdlQXR0cmlidXRlcyhlZGl0b3IsIHtcbiAgICAgIHdpZHRoOiBuZXdXaWR0aCxcbiAgICAgIGhlaWdodDogbmV3SGVpZ2h0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFByZWRldGVybWluZWQgcmVzaXplIGhlbHBlcnMgdXNlZCBieSBVSSAqL1xuICByZXNpemVJbWFnZVRvU21hbGwoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZUltYWdlKGVkaXRvciwgeyB3aWR0aDogMzAwLCBoZWlnaHQ6IDIwMCwgbWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSB9KTtcbiAgfVxuXG4gIHJlc2l6ZUltYWdlVG9NZWRpdW0oZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZUltYWdlKGVkaXRvciwgeyB3aWR0aDogNTAwLCBoZWlnaHQ6IDM1MCwgbWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSB9KTtcbiAgfVxuXG4gIHJlc2l6ZUltYWdlVG9MYXJnZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIHRoaXMucmVzaXplSW1hZ2UoZWRpdG9yLCB7IHdpZHRoOiA4MDAsIGhlaWdodDogNjAwLCBtYWludGFpbkFzcGVjdFJhdGlvOiB0cnVlIH0pO1xuICB9XG5cbiAgcmVzaXplSW1hZ2VUb09yaWdpbmFsKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IuaXNBY3RpdmUoXCJyZXNpemFibGVJbWFnZVwiKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgdGhpcy5yZXNpemVJbWFnZShlZGl0b3IsIHsgd2lkdGg6IGltZy5uYXR1cmFsV2lkdGgsIGhlaWdodDogaW1nLm5hdHVyYWxIZWlnaHQgfSk7XG4gICAgfTtcbiAgICBjb25zdCBzdG9yZWRTcmMgPSBlZGl0b3IuZ2V0QXR0cmlidXRlcyhcInJlc2l6YWJsZUltYWdlXCIpW1wic3JjXCJdO1xuICAgIGF0ZVJlc29sdmVJbWFnZVNyYyh0aGlzLnNyY1Jlc29sdmVyLCBzdG9yZWRTcmMpLnRoZW4oc3JjID0+IHtcbiAgICAgIGltZy5zcmMgPSBzcmM7XG4gICAgfSk7XG4gIH1cblxuICAvKiogR2V0IGN1cnJlbnQgaW1hZ2UgZGltZW5zaW9ucyAqL1xuICBnZXRJbWFnZURpbWVuc2lvbnMoZWRpdG9yOiBFZGl0b3IpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBpZiAoIWVkaXRvci5pc0FjdGl2ZShcInJlc2l6YWJsZUltYWdlXCIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSBlZGl0b3IuZ2V0QXR0cmlidXRlcyhcInJlc2l6YWJsZUltYWdlXCIpO1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogYXR0cnNbXCJ3aWR0aFwiXSB8fCAwLFxuICAgICAgaGVpZ2h0OiBhdHRyc1tcImhlaWdodFwiXSB8fCAwLFxuICAgIH07XG4gIH1cblxuICAvKiogUmVtb3ZlIHRoZSBzZWxlY3RlZCBpbWFnZSAqL1xuICBkZWxldGVJbWFnZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmIChlZGl0b3IuaXNBY3RpdmUoXCJyZXNpemFibGVJbWFnZVwiKSkge1xuICAgICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5kZWxldGVTZWxlY3Rpb24oKS5ydW4oKTtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICAvKiogRG93bmxvYWQgdGhlIGN1cnJlbnQgaW1hZ2UgKi9cbiAgZG93bmxvYWRJbWFnZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGNvbnN0IGF0dHJzID0gZWRpdG9yLmdldEF0dHJpYnV0ZXMoXCJyZXNpemFibGVJbWFnZVwiKTtcbiAgICBpZiAoIWF0dHJzIHx8ICFhdHRyc1tcInNyY1wiXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVOYW1lID0gYXR0cnNbXCJhbHRcIl0gfHwgXCJpbWFnZVwiO1xuXG4gICAgYXRlUmVzb2x2ZUltYWdlU3JjKHRoaXMuc3JjUmVzb2x2ZXIsIGF0dHJzW1wic3JjXCJdKS50aGVuKHNyYyA9PlxuICAgICAgdGhpcy5kb3dubG9hZFJlc29sdmVkSW1hZ2Uoc3JjLCBmaWxlTmFtZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkb3dubG9hZFJlc29sdmVkSW1hZ2Uoc3JjOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBEZXRlY3QgaWYgaXQncyBiYXNlNjQgb3IgcmVtb3RlIFVSTFxuICAgIGlmIChcbiAgICAgIHNyYy5zdGFydHNXaXRoKFwiZGF0YTpcIikgfHxcbiAgICAgIHNyYy5zdGFydHNXaXRoKFwiYmxvYjpcIikgfHxcbiAgICAgICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHNyYy5zdGFydHNXaXRoKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pKVxuICAgICkge1xuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgbGluay5ocmVmID0gc3JjO1xuICAgICAgbGluay5kb3dubG9hZCA9IGZpbGVOYW1lO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciByZW1vdGUgVVJMcywgd2UgdHJ5IHRvIGZldGNoIGl0IHRvIGJ5cGFzcyBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zIG9uICdkb3dubG9hZCcgYXR0cmlidXRlXG4gICAgICBmZXRjaChzcmMpXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmJsb2IoKSlcbiAgICAgICAgLnRoZW4oYmxvYiA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZG93bmxvYWRpbmcgaW1hZ2U6XCIsIGVycik7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gb3BlbmluZyBpbiBuZXcgdGFiXG4gICAgICAgICAgd2luZG93Lm9wZW4oc3JjLCBcIl9ibGFua1wiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3RlZEltYWdlKGF0dHJpYnV0ZXM6IFBhcnRpYWw8QXRlSW1hZ2VEYXRhPik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnNlbGVjdGVkSW1hZ2UoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgdGhpcy5zZWxlY3RlZEltYWdlLnNldCh7IC4uLmN1cnJlbnQsIC4uLmF0dHJpYnV0ZXMgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFZhbGlkYXRlIGZpbGUgdHlwZSBhbmQgc2l6ZSAqL1xuICB2YWxpZGF0ZUltYWdlKFxuICAgIGZpbGU6IEZpbGUsXG4gICAgb3B0aW9ucz86IHsgbWF4U2l6ZT86IG51bWJlcjsgYWxsb3dlZFR5cGVzPzogc3RyaW5nW10gfVxuICApOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZzsgcmVhc29uPzogQXRlSW1hZ2VWYWxpZGF0aW9uUmVhc29uIH0ge1xuICAgIGNvbnN0IG1heFNpemUgPSBvcHRpb25zPy5tYXhTaXplIHx8IDEwICogMTAyNCAqIDEwMjQ7XG4gICAgY29uc3QgYWxsb3dlZFR5cGVzID0gb3B0aW9ucz8uYWxsb3dlZFR5cGVzIHx8IFtdO1xuXG4gICAgaWYgKGFsbG93ZWRUeXBlcy5sZW5ndGggPiAwICYmICFhbGxvd2VkVHlwZXMuaW5jbHVkZXMoZmlsZS50eXBlKSkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogdGhpcy50KCkuaW52YWxpZEZpbGVUeXBlLCByZWFzb246IFwiaW52YWxpZC10eXBlXCIgfTtcbiAgICB9XG5cbiAgICBpZiAoZmlsZS5zaXplID4gbWF4U2l6ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogYCR7dGhpcy50KCkuaW1hZ2VUb29MYXJnZX0gKG1heCAke01hdGgucm91bmQobWF4U2l6ZSAvIDEwMjQgLyAxMDI0KX1NQilgLFxuICAgICAgICByZWFzb246IFwidG9vLWxhcmdlXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqIENvbXByZXNzIGFuZCBwcm9jZXNzIGltYWdlIG9uIGNsaWVudCBzaWRlICovXG4gIGFzeW5jIGNvbXByZXNzSW1hZ2UoXG4gICAgZmlsZTogRmlsZSxcbiAgICBxdWFsaXR5ID0gMC44LFxuICAgIG1heFdpZHRoID0gMTkyMCxcbiAgICBtYXhIZWlnaHQgPSAxMjAwXG4gICk6IFByb21pc2U8QXRlSW1hZ2VVcGxvYWRSZXN1bHQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcblxuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNVcGxvYWRpbmcoKSkge1xuICAgICAgICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3Muc2V0KDQwKTtcbiAgICAgICAgICB0aGlzLnVwbG9hZE1lc3NhZ2Uuc2V0KHRoaXMudCgpLnJlc2l6aW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB7IHdpZHRoLCBoZWlnaHQgfSA9IGltZztcbiAgICAgICAgaWYgKHdpZHRoID4gbWF4V2lkdGggfHwgaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgICAgY29uc3QgcmF0aW8gPSBNYXRoLm1pbihtYXhXaWR0aCAvIHdpZHRoLCBtYXhIZWlnaHQgLyBoZWlnaHQpO1xuICAgICAgICAgIHdpZHRoICo9IHJhdGlvO1xuICAgICAgICAgIGhlaWdodCAqPSByYXRpbztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBjdHg/LmRyYXdJbWFnZShpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nKCkpIHtcbiAgICAgICAgICB0aGlzLnVwbG9hZFByb2dyZXNzLnNldCg2MCk7XG4gICAgICAgICAgdGhpcy51cGxvYWRNZXNzYWdlLnNldCh0aGlzLnQoKS5jb21wcmVzc2luZyk7XG4gICAgICAgIH1cblxuICAgICAgICBjYW52YXMudG9CbG9iKFxuICAgICAgICAgIGJsb2IgPT4ge1xuICAgICAgICAgICAgaWYgKGJsb2IpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGUudGFyZ2V0Py5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgc3JjOiBiYXNlNjQsXG4gICAgICAgICAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICAgICAgICBzaXplOiBibG9iLnNpemUsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgICAgICAgICB3aWR0aDogTWF0aC5yb3VuZCh3aWR0aCksXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQoaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy50KCkuY29tcHJlc3Npb25FcnJvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmlsZS50eXBlLFxuICAgICAgICAgIHF1YWxpdHlcbiAgICAgICAgKTtcbiAgICAgIH07XG5cbiAgICAgIGltZy5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcih0aGlzLnQoKS5sb2FkRXJyb3IpKTtcbiAgICAgIGltZy5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIENvcmUgdXBsb2FkIGxvZ2ljIHdpdGggcHJvZ3Jlc3MgdHJhY2tpbmcgKi9cbiAgcHJpdmF0ZSBhc3luYyB1cGxvYWRJbWFnZVdpdGhQcm9ncmVzcyhcbiAgICBlZGl0b3I6IEVkaXRvcixcbiAgICBmaWxlOiBGaWxlLFxuICAgIGluc2VydGlvblN0cmF0ZWd5OiAoZWRpdG9yOiBFZGl0b3IsIHJlc3VsdDogQXRlSW1hZ2VVcGxvYWRSZXN1bHQpID0+IHZvaWQsXG4gICAgYWN0aW9uTWVzc2FnZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEF0ZUltYWdlVXBsb2FkT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgICBzb3VyY2U6IEF0ZUltYWdlU291cmNlXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmN1cnJlbnRFZGl0b3IgPSBlZGl0b3I7XG4gICAgICB0aGlzLmlzVXBsb2FkaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3Muc2V0KDEwKTtcbiAgICAgIHRoaXMudXBsb2FkTWVzc2FnZS5zZXQodGhpcy50KCkudmFsaWRhdGluZyk7XG4gICAgICB0aGlzLmZvcmNlRWRpdG9yVXBkYXRlKCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucHJvY2Vzc0ltYWdlKGZpbGUsIG9wdGlvbnMsIChwcm9ncmVzcywgbWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAocHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3Muc2V0KHByb2dyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy51cGxvYWRNZXNzYWdlLnNldChtZXNzYWdlKTtcbiAgICAgICAgICB0aGlzLmZvcmNlRWRpdG9yVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnVwbG9hZFByb2dyZXNzLnNldCg5MCk7XG4gICAgICB0aGlzLnVwbG9hZE1lc3NhZ2Uuc2V0KGFjdGlvbk1lc3NhZ2UpO1xuICAgICAgdGhpcy5mb3JjZUVkaXRvclVwZGF0ZSgpO1xuXG4gICAgICAvLyBGaW5hbCBpbnNlcnRpb25cbiAgICAgIGluc2VydGlvblN0cmF0ZWd5KGVkaXRvciwgcmVzdWx0KTtcblxuICAgICAgaWYgKHRoaXMub25JbWFnZVVwbG9hZGVkQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5vbkltYWdlVXBsb2FkZWRDYWxsYmFjayhyZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlc2V0VXBsb2FkU3RhdGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5yZXNldFVwbG9hZFN0YXRlKCk7XG4gICAgICBjb25zb2xlLmVycm9yKHRoaXMudCgpLnVwbG9hZEVycm9yLCBlcnJvcik7XG4gICAgICB0aGlzLm9uSW1hZ2VSZWplY3RlZENhbGxiYWNrPy4oe1xuICAgICAgICByZWFzb246IGVycm9yIGluc3RhbmNlb2YgQXRlSW1hZ2VWYWxpZGF0aW9uRXJyb3IgPyBlcnJvci5yZWFzb24gOiBcInVwbG9hZC1mYWlsZWRcIixcbiAgICAgICAgZmlsZSxcbiAgICAgICAgc291cmNlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKiogVmFsaWRhdGUsIGNvbXByZXNzIGFuZCAod2hlbiBjb25maWd1cmVkKSBzZW5kIGFuIGltYWdlIHRvIHRoZSB1cGxvYWQgaGFuZGxlciAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NJbWFnZShcbiAgICBmaWxlOiBGaWxlLFxuICAgIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMsXG4gICAgb25TdGVwPzogKHByb2dyZXNzPzogbnVtYmVyLCBtZXNzYWdlPzogc3RyaW5nKSA9PiB2b2lkXG4gICk6IFByb21pc2U8QXRlSW1hZ2VVcGxvYWRSZXN1bHQ+IHtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpcy52YWxpZGF0ZUltYWdlKGZpbGUsIHtcbiAgICAgIG1heFNpemU6IG9wdGlvbnM/Lm1heFNpemUsXG4gICAgICBhbGxvd2VkVHlwZXM6IG9wdGlvbnM/LmFsbG93ZWRUeXBlcyxcbiAgICB9KTtcbiAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBBdGVJbWFnZVZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgdmFsaWRhdGlvbi5yZWFzb24gPz8gXCJpbnZhbGlkLXR5cGVcIixcbiAgICAgICAgdmFsaWRhdGlvbi5lcnJvciA/PyBcIlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIG9uU3RlcD8uKDMwLCB0aGlzLnQoKS5jb21wcmVzc2luZyk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbXByZXNzSW1hZ2UoXG4gICAgICBmaWxlLFxuICAgICAgb3B0aW9ucz8ucXVhbGl0eSB8fCAwLjgsXG4gICAgICBvcHRpb25zPy5tYXhXaWR0aCB8fCAxOTIwLFxuICAgICAgb3B0aW9ucz8ubWF4SGVpZ2h0IHx8IDEyMDBcbiAgICApO1xuXG4gICAgb25TdGVwPy4oNzApO1xuXG4gICAgLy8gSGFuZGxlIGN1c3RvbSB1cGxvYWQgaWYgaGFuZGxlciBpcyBwcm92aWRlZFxuICAgIGlmICh0aGlzLnVwbG9hZEhhbmRsZXIpIHtcbiAgICAgIG9uU3RlcD8uKHVuZGVmaW5lZCwgdGhpcy50KCkudXBsb2FkaW5nVG9TZXJ2ZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoYW5kbGVyUmVzcG9uc2UgPSB0aGlzLnVwbG9hZEhhbmRsZXIoe1xuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgd2lkdGg6IHJlc3VsdC53aWR0aCB8fCAwLFxuICAgICAgICAgIGhlaWdodDogcmVzdWx0LmhlaWdodCB8fCAwLFxuICAgICAgICAgIHR5cGU6IHJlc3VsdC50eXBlLFxuICAgICAgICAgIGJhc2U2NDogcmVzdWx0LnNyYyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlclJlc3VsdCA9IGlzT2JzZXJ2YWJsZShoYW5kbGVyUmVzcG9uc2UpXG4gICAgICAgICAgPyBhd2FpdCBmaXJzdFZhbHVlRnJvbShoYW5kbGVyUmVzcG9uc2UpXG4gICAgICAgICAgOiBhd2FpdCBoYW5kbGVyUmVzcG9uc2U7XG5cbiAgICAgICAgcmVzdWx0LnNyYyA9IGhhbmRsZXJSZXN1bHQuc3JjO1xuICAgICAgICBpZiAoaGFuZGxlclJlc3VsdC5hbHQpIHtcbiAgICAgICAgICByZXN1bHQubmFtZSA9IGhhbmRsZXJSZXN1bHQuYWx0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChoYW5kbGVyRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcih0aGlzLnQoKS51cGxvYWRFcnJvciwgaGFuZGxlckVycm9yKTtcbiAgICAgICAgdGhyb3cgaGFuZGxlckVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGFuIGltYWdlIHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUgZG9jdW1lbnQgKGUuZy4gYmFzZTY0IGZyb20gcGFzdGVkIEhUTUwpXG4gICAqIHRocm91Z2ggdmFsaWRhdGlvbiwgY29tcHJlc3Npb24gYW5kIHRoZSB1cGxvYWQgaGFuZGxlciwgYW5kIHJlc29sdmUgdG8gaXRzIG5ldyBgc3JjYC5cbiAgICovXG4gIGFzeW5jIHJlaG9zdEltYWdlKGZpbGU6IEZpbGUsIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnByb2Nlc3NJbWFnZShmaWxlLCBvcHRpb25zKTtcbiAgICAgIGlmICh0aGlzLm9uSW1hZ2VVcGxvYWRlZENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMub25JbWFnZVVwbG9hZGVkQ2FsbGJhY2socmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQuc3JjO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKHRoaXMudCgpLnVwbG9hZEVycm9yLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0VXBsb2FkU3RhdGUoKSB7XG4gICAgdGhpcy5pc1VwbG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3Muc2V0KDApO1xuICAgIHRoaXMudXBsb2FkTWVzc2FnZS5zZXQoXCJcIik7XG4gICAgdGhpcy5mb3JjZUVkaXRvclVwZGF0ZSgpO1xuICAgIHRoaXMuY3VycmVudEVkaXRvciA9IG51bGw7XG4gIH1cblxuICAvKiogTWFpbiBlbnRyeSBwb2ludCBmb3IgZmlsZSB1cGxvYWQgYW5kIGluc2VydGlvbiAqL1xuICBhc3luYyB1cGxvYWRBbmRJbnNlcnRJbWFnZShcbiAgICBlZGl0b3I6IEVkaXRvcixcbiAgICBmaWxlOiBGaWxlLFxuICAgIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMsXG4gICAgc291cmNlOiBBdGVJbWFnZVNvdXJjZSA9IFwiYXBpXCJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMudXBsb2FkSW1hZ2VXaXRoUHJvZ3Jlc3MoXG4gICAgICBlZGl0b3IsXG4gICAgICBmaWxlLFxuICAgICAgKGVkLCByZXN1bHQpID0+IHtcbiAgICAgICAgdGhpcy5pbnNlcnRJbWFnZShlZCwge1xuICAgICAgICAgIHNyYzogcmVzdWx0LnNyYyxcbiAgICAgICAgICBhbHQ6IHJlc3VsdC5uYW1lLFxuICAgICAgICAgIHRpdGxlOiBgJHtyZXN1bHQubmFtZX0gKCR7cmVzdWx0LndpZHRofcOXJHtyZXN1bHQuaGVpZ2h0fSlgLFxuICAgICAgICAgIHdpZHRoOiByZXN1bHQud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiByZXN1bHQuaGVpZ2h0LFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB0aGlzLnQoKS5pbnNlcnRpbmdJbWFnZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBzb3VyY2VcbiAgICApO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgYW4gZWRpdG9yIHRyYW5zYWN0aW9uIHRvIGZvcmNlIGRlY29yYXRpb24gdXBkYXRlICovXG4gIHByaXZhdGUgZm9yY2VFZGl0b3JVcGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudEVkaXRvcikge1xuICAgICAgY29uc3QgeyB0ciB9ID0gdGhpcy5jdXJyZW50RWRpdG9yLnN0YXRlO1xuICAgICAgdGhpcy5jdXJyZW50RWRpdG9yLnZpZXcuZGlzcGF0Y2godHIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZW5lcmljIGhlbHBlciB0byBvcGVuIGZpbGUgcGlja2VyIGFuZCBwcm9jZXNzIHNlbGVjdGlvbiAqL1xuICBwcml2YXRlIGFzeW5jIHNlbGVjdEZpbGVBbmRQcm9jZXNzKFxuICAgIGVkaXRvcjogRWRpdG9yLFxuICAgIHVwbG9hZE1ldGhvZDogKFxuICAgICAgZWRpdG9yOiBFZGl0b3IsXG4gICAgICBmaWxlOiBGaWxlLFxuICAgICAgb3B0aW9uczogQXRlSW1hZ2VVcGxvYWRPcHRpb25zIHwgdW5kZWZpbmVkLFxuICAgICAgc291cmNlOiBBdGVJbWFnZVNvdXJjZVxuICAgICkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBvcHRpb25zPzogQXRlSW1hZ2VVcGxvYWRPcHRpb25zXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgIGlucHV0LnR5cGUgPSBcImZpbGVcIjtcblxuICAgICAgLy8gVXNlIGFsbG93ZWRUeXBlcyBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gaW1hZ2UvKlxuICAgICAgaWYgKG9wdGlvbnM/LmFsbG93ZWRUeXBlcyAmJiBvcHRpb25zLmFsbG93ZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlucHV0LmFjY2VwdCA9IG9wdGlvbnMuYWxsb3dlZFR5cGVzLmpvaW4oXCIsXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXQuYWNjZXB0ID0gXCJpbWFnZS8qXCI7XG4gICAgICB9XG5cbiAgICAgIGlucHV0LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblxuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBhc3luYyBlID0+IHtcbiAgICAgICAgY29uc3QgZmlsZSA9IChlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlcz8uWzBdO1xuICAgICAgICBpZiAoZmlsZSAmJiBmaWxlLnR5cGUuc3RhcnRzV2l0aChcImltYWdlL1wiKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB1cGxvYWRNZXRob2QoZWRpdG9yLCBmaWxlLCBvcHRpb25zLCBcInBpY2tlclwiKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLnQoKS5ub0ZpbGVTZWxlY3RlZCkpO1xuICAgICAgICB9XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaW5wdXQpO1xuICAgICAgfSk7XG5cbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJjYW5jZWxcIiwgKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGlucHV0KTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLnQoKS5zZWxlY3Rpb25DYW5jZWxsZWQpKTtcbiAgICAgIH0pO1xuXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlucHV0KTtcbiAgICAgIGlucHV0LmNsaWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VsZWN0IGZpbGUgYW5kIHVwbG9hZCBhcyBuZXcgaW1hZ2UgKi9cbiAgYXN5bmMgc2VsZWN0QW5kVXBsb2FkSW1hZ2UoZWRpdG9yOiBFZGl0b3IsIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RGaWxlQW5kUHJvY2VzcyhlZGl0b3IsIHRoaXMudXBsb2FkQW5kSW5zZXJ0SW1hZ2UuYmluZCh0aGlzKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogU2VsZWN0IGZpbGUgYW5kIHJlcGxhY2UgY3VycmVudGx5IHNlbGVjdGVkIGltYWdlICovXG4gIGFzeW5jIHNlbGVjdEFuZFJlcGxhY2VJbWFnZShlZGl0b3I6IEVkaXRvciwgb3B0aW9ucz86IEF0ZUltYWdlVXBsb2FkT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE5vIG5lZWQgZm9yIGNvbXBsaWNhdGVkIGJhY2t1cC9yZXN0b3JlIG5vdyB0aGF0IHdlIGRvbid0IGRlbGV0ZSBwcmVtYXR1cmVseS5cbiAgICAvLyBUaGUgdXBsb2FkQW5kUmVwbGFjZUltYWdlIHdpbGwgaGFuZGxlIHRoZSBhdG9taWMgcmVwbGFjZW1lbnQuXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0RmlsZUFuZFByb2Nlc3MoZWRpdG9yLCB0aGlzLnVwbG9hZEFuZFJlcGxhY2VJbWFnZS5iaW5kKHRoaXMpLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBJbnRlcm5hbCBoZWxwZXIgdXNlZCBieSByZXBsYWNlbWVudCBsb2dpYyAqL1xuICBhc3luYyB1cGxvYWRBbmRSZXBsYWNlSW1hZ2UoXG4gICAgZWRpdG9yOiBFZGl0b3IsXG4gICAgZmlsZTogRmlsZSxcbiAgICBvcHRpb25zPzogQXRlSW1hZ2VVcGxvYWRPcHRpb25zLFxuICAgIHNvdXJjZTogQXRlSW1hZ2VTb3VyY2UgPSBcImFwaVwiXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFN0b3JlIGN1cnJlbnQgcG9zaXRpb24gdG8gZW5zdXJlIHdlIGNhbiByZS1zZWxlY3QgdGhlIGltYWdlIGV2ZW4gaWYgc2VsZWN0aW9uIGJsdXJzIGR1cmluZyB1cGxvYWRcbiAgICBjb25zdCB3YXNBY3RpdmUgPSBlZGl0b3IuaXNBY3RpdmUoXCJyZXNpemFibGVJbWFnZVwiKTtcblxuICAgIGF3YWl0IHRoaXMudXBsb2FkSW1hZ2VXaXRoUHJvZ3Jlc3MoXG4gICAgICBlZGl0b3IsXG4gICAgICBmaWxlLFxuICAgICAgKGVkLCByZXN1bHQpID0+IHtcbiAgICAgICAgY29uc3QgaW1hZ2VEYXRhID0ge1xuICAgICAgICAgIHNyYzogcmVzdWx0LnNyYyxcbiAgICAgICAgICBhbHQ6IHJlc3VsdC5uYW1lLFxuICAgICAgICAgIHRpdGxlOiBgJHtyZXN1bHQubmFtZX0gKCR7cmVzdWx0LndpZHRofcOXJHtyZXN1bHQuaGVpZ2h0fSlgLFxuICAgICAgICAgIHdpZHRoOiByZXN1bHQud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiByZXN1bHQuaGVpZ2h0LFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIElmIHRoZSBpbWFnZSB3YXMgYWN0aXZlIG9yIGlzIHN0aWxsIGFjdGl2ZSwgdXBkYXRlIGl0IGF0b21pY2FsbHlcbiAgICAgICAgaWYgKHdhc0FjdGl2ZSB8fCBlZC5pc0FjdGl2ZShcInJlc2l6YWJsZUltYWdlXCIpKSB7XG4gICAgICAgICAgZWQuY2hhaW4oKVxuICAgICAgICAgICAgLmZvY3VzKClcbiAgICAgICAgICAgIC51cGRhdGVBdHRyaWJ1dGVzKFwicmVzaXphYmxlSW1hZ2VcIiwgaW1hZ2VEYXRhKVxuICAgICAgICAgICAgLmNvbW1hbmQoKHsgdHIsIGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgeyBmcm9tIH0gPSB0ci5zZWxlY3Rpb247XG4gICAgICAgICAgICAgIC8vIFJlLXNlbGVjdCB0aGUgbm9kZSBhdCBpdHMgbWFwcGVkIHBvc2l0aW9uIG9yIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgICAgICAgIHJldHVybiBjb21tYW5kcy5zZXROb2RlU2VsZWN0aW9uKGZyb20pIHx8IGNvbW1hbmRzLnNldE5vZGVTZWxlY3Rpb24oZnJvbSAtIDEpIHx8IHRydWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnJ1bigpO1xuICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRJbWFnZShpbWFnZURhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyd2lzZSByZXBsYWNlIHdoYXRldmVyIGlzIHNlbGVjdGVkIChvciBpbnNlcnQgYXQgY3Vyc29yKVxuICAgICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2UoZWQsIGltYWdlRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZnRlciByZXBsYWNlbWVudCwgZW5zdXJlIHRoZSBpbWFnZSBpcyB0cmFja2VkIGluIG91ciBzaWduYWxzXG4gICAgICAgIHRoaXMuc2VsZWN0SW1hZ2UoZWQpO1xuICAgICAgfSxcbiAgICAgIHRoaXMudCgpLnJlcGxhY2luZ0ltYWdlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHNvdXJjZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGltYWdlIGRyb3AgZXZlbnQuXG4gICAqIENhbGN1bGF0ZXMgdGhlIHBvc2l0aW9uIGZyb20gY29vcmRpbmF0ZXMgYW5kIHNldHMgdGhlIHNlbGVjdGlvbiBhY2NvcmRpbmdseS5cbiAgICovXG4gIGhhbmRsZURyb3AoZWRpdG9yOiBFZGl0b3IsIGV2ZW50OiBEcmFnRXZlbnQsIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBjb25zdCBmaWxlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXM7XG4gICAgaWYgKCFmaWxlcyB8fCBmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlID0gQXJyYXkuZnJvbShmaWxlcykuZmluZChmID0+IGYudHlwZS5zdGFydHNXaXRoKFwiaW1hZ2UvXCIpKTtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gVHJ5IHRvIGZpbmQgdGhlIGRyb3AgcG9zaXRpb24gZnJvbSBjb29yZGluYXRlc1xuICAgIGNvbnN0IHBvcyA9IGVkaXRvci52aWV3LnBvc0F0Q29vcmRzKHsgbGVmdDogZXZlbnQuY2xpZW50WCwgdG9wOiBldmVudC5jbGllbnRZIH0pO1xuICAgIGlmIChwb3MpIHtcbiAgICAgIGVkaXRvci5jb21tYW5kcy5zZXRUZXh0U2VsZWN0aW9uKHBvcy5wb3MpO1xuICAgIH1cblxuICAgIHRoaXMudXBsb2FkQW5kSW5zZXJ0SW1hZ2UoZWRpdG9yLCBmaWxlLCBvcHRpb25zLCBcImRyb3BcIikuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgaW1hZ2UgcGFzdGUgZXZlbnQuXG4gICAqL1xuICBoYW5kbGVQYXN0ZShlZGl0b3I6IEVkaXRvciwgZXZlbnQ6IENsaXBib2FyZEV2ZW50LCBvcHRpb25zPzogQXRlSW1hZ2VVcGxvYWRPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2xpcGJvYXJkRmlsZXMgPSBldmVudC5jbGlwYm9hcmREYXRhPy5maWxlcztcbiAgICBpZiAoIWNsaXBib2FyZEZpbGVzIHx8IGNsaXBib2FyZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGltYWdlRmlsZSA9IEFycmF5LmZyb20oY2xpcGJvYXJkRmlsZXMpLmZpbmQoZmlsZSA9PiBmaWxlLnR5cGUuc3RhcnRzV2l0aChcImltYWdlL1wiKSk7XG4gICAgaWYgKCFpbWFnZUZpbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMudXBsb2FkQW5kSW5zZXJ0SW1hZ2UoZWRpdG9yLCBpbWFnZUZpbGUsIG9wdGlvbnMsIFwicGFzdGVcIikuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl19
|
|
550
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWltYWdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXRpcHRhcC1lZGl0b3Ivc3JjL2xpYi9zZXJ2aWNlcy9hdGUtaW1hZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3JFLE9BQU8sRUFBRSxhQUFhLEVBQWUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDM0UsT0FBTyxFQVNMLHVCQUF1QixHQUV4QixNQUFNLDJCQUEyQixDQUFDOztBQVNuQyw2RkFBNkY7QUFDN0YsU0FBUyxTQUFTLENBQUMsR0FBVyxFQUFFLEdBQVc7SUFDekMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLENBQUM7QUFDL0YsQ0FBQztBQUdELE1BQU0sT0FBTyxlQUFlO0lBRDVCO1FBS0UsOEJBQThCO1FBQzlCLGtCQUFhLEdBQUcsTUFBTSxDQUFzQixJQUFJLENBQUMsQ0FBQztRQUNsRCxvQkFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7UUFFaEUscUJBQXFCO1FBQ3JCLGVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbkIs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O1FBQ2hGLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDO1FBQ2xELElBQUksQ0FBQyxjQUFjLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOytHQS9wQlUsZUFBZTttSEFBZixlQUFlOzs0RkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsLCBjb21wdXRlZCwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IE5vZGUgYXMgUE1Ob2RlIH0gZnJvbSBcIkB0aXB0YXAvcG0vbW9kZWxcIjtcbmltcG9ydCB7IE5vZGVTZWxlY3Rpb24sIFRyYW5zYWN0aW9uIH0gZnJvbSBcIkB0aXB0YXAvcG0vc3RhdGVcIjtcbmltcG9ydCB7IGlzT2JzZXJ2YWJsZSwgZmlyc3RWYWx1ZUZyb20gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgQXRlRWRpdG9ySTE4biB9IGZyb20gXCIuL2F0ZS1lZGl0b3ItaTE4bi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBhdGVSZXNvbHZlSW1hZ2VTcmMgfSBmcm9tIFwiLi4vdXRpbHMvYXRlLWltYWdlLXNyYy1yZXNvbHZlci51dGlsc1wiO1xuaW1wb3J0IHtcbiAgQXRlUmVzaXplT3B0aW9ucyxcbiAgQXRlSW1hZ2VVcGxvYWRPcHRpb25zLFxuICBBdGVJbWFnZVVwbG9hZEhhbmRsZXIsXG4gIEF0ZUltYWdlU3JjUmVzb2x2ZXIsXG4gIEF0ZUltYWdlVXBsb2FkUmVzdWx0LFxuICBBdGVJbWFnZURhdGEsXG4gIEF0ZUltYWdlUmVqZWN0aW9uLFxuICBBdGVJbWFnZVNvdXJjZSxcbiAgQXRlSW1hZ2VWYWxpZGF0aW9uRXJyb3IsXG4gIEF0ZUltYWdlVmFsaWRhdGlvblJlYXNvbixcbn0gZnJvbSBcIi4uL21vZGVscy9hdGUtaW1hZ2UubW9kZWxcIjtcblxuLyoqIEFuIGltYWdlIHBvc2l0aW9uIGZvbGxvd2VkIHRocm91Z2ggZG9jdW1lbnQgY2hhbmdlcywgc2VlIGB0cmFja1NlbGVjdGVkSW1hZ2VgICovXG5pbnRlcmZhY2UgQXRlVHJhY2tlZEltYWdlIHtcbiAgLyoqIEN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGltYWdlLCBvciBgbnVsbGAgd2hlbiBubyBpbWFnZSB3YXMgc2VsZWN0ZWQgKi9cbiAgcG9zOiAoKSA9PiBudW1iZXIgfCBudWxsO1xuICBzdG9wOiAoKSA9PiB2b2lkO1xufVxuXG4vKiogV2hldGhlciBgcG9zYCBob2xkcyBhbiBpbWFnZSBub2RlIChgTm9kZVNlbGVjdGlvbi5jcmVhdGVgIHRocm93cyBvbiBhbiBlbXB0eSBwb3NpdGlvbikgKi9cbmZ1bmN0aW9uIGlzSW1hZ2VBdChkb2M6IFBNTm9kZSwgcG9zOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBvcyA+PSAwICYmIHBvcyA8IGRvYy5jb250ZW50LnNpemUgJiYgZG9jLm5vZGVBdChwb3MpPy50eXBlLm5hbWUgPT09IFwicmVzaXphYmxlSW1hZ2VcIjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF0ZUltYWdlU2VydmljZSB7XG4gIG9uSW1hZ2VVcGxvYWRlZENhbGxiYWNrPzogKHJlc3VsdDogQXRlSW1hZ2VVcGxvYWRSZXN1bHQpID0+IHZvaWQ7XG4gIG9uSW1hZ2VSZWplY3RlZENhbGxiYWNrPzogKHJlamVjdGlvbjogQXRlSW1hZ2VSZWplY3Rpb24pID0+IHZvaWQ7XG5cbiAgLyoqIFNpZ25hbHMgZm9yIGltYWdlIHN0YXRlICovXG4gIHNlbGVjdGVkSW1hZ2UgPSBzaWduYWw8QXRlSW1hZ2VEYXRhIHwgbnVsbD4obnVsbCk7XG4gIGlzSW1hZ2VTZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0ZWRJbWFnZSgpICE9PSBudWxsKTtcblxuICAvKiogUmVzaXppbmcgc3RhdGUgKi9cbiAgaXNSZXNpemluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEF0ZUVkaXRvckkxOG4pO1xuICBwcml2YXRlIHJlYWRvbmx5IHQgPSB0aGlzLmkxOG4uaW1hZ2VVcGxvYWQ7XG5cbiAgLyoqIFVwbG9hZCBzdGF0ZSBzaWduYWxzICovXG4gIGlzVXBsb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgdXBsb2FkUHJvZ3Jlc3MgPSBzaWduYWwoMCk7XG4gIHVwbG9hZE1lc3NhZ2UgPSBzaWduYWwoXCJcIik7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSB1cGxvYWQgaGFuZGxlci5cbiAgICogSWYgc2V0LCB0aGlzIGhhbmRsZXIgcmVwbGFjZXMgdGhlIGRlZmF1bHQgYmFzZTY0IGNvbnZlcnNpb24uXG4gICAqL1xuICB1cGxvYWRIYW5kbGVyOiBBdGVJbWFnZVVwbG9hZEhhbmRsZXIgfCBudWxsID0gbnVsbDtcblxuICBzcmNSZXNvbHZlcjogQXRlSW1hZ2VTcmNSZXNvbHZlciB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgY3VycmVudEVkaXRvcjogRWRpdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFNlbGVjdCBhbmQgdHJhY2sgYW4gaW1hZ2UgZnJvbSB0aGUgZWRpdG9yICovXG4gIHNlbGVjdEltYWdlKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKGVkaXRvci5pc0FjdGl2ZShcInJlc2l6YWJsZUltYWdlXCIpKSB7XG4gICAgICBjb25zdCBhdHRycyA9IGVkaXRvci5nZXRBdHRyaWJ1dGVzKFwicmVzaXphYmxlSW1hZ2VcIik7XG4gICAgICB0aGlzLnNlbGVjdGVkSW1hZ2Uuc2V0KHtcbiAgICAgICAgc3JjOiBhdHRyc1tcInNyY1wiXSxcbiAgICAgICAgYWx0OiBhdHRyc1tcImFsdFwiXSxcbiAgICAgICAgdGl0bGU6IGF0dHJzW1widGl0bGVcIl0sXG4gICAgICAgIHdpZHRoOiBhdHRyc1tcIndpZHRoXCJdLFxuICAgICAgICBoZWlnaHQ6IGF0dHJzW1wiaGVpZ2h0XCJdLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZS5zZXQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZEltYWdlLnNldChudWxsKTtcbiAgfVxuXG4gIC8qKiBJbnNlcnQgYSBuZXcgaW1hZ2UgYW5kIGVuc3VyZSBpdCdzIHNlbGVjdGVkICovXG4gIGluc2VydEltYWdlKGVkaXRvcjogRWRpdG9yLCBpbWFnZURhdGE6IEF0ZUltYWdlRGF0YSk6IHZvaWQge1xuICAgIGVkaXRvclxuICAgICAgLmNoYWluKClcbiAgICAgIC5mb2N1cygpXG4gICAgICAuc2V0UmVzaXphYmxlSW1hZ2UoaW1hZ2VEYXRhKVxuICAgICAgLmNvbW1hbmQoKHsgdHIgfSkgPT4ge1xuICAgICAgICAvLyBTZWxlY3Rpb24gaXMgdXN1YWxseSBhZnRlciB0aGUgbm9kZS4gTm9kZSBpcyBhdCB0ci5zZWxlY3Rpb24uZnJvbSAtIDEuXG4gICAgICAgIC8vIE9ubHkgc2VsZWN0IGEgcG9zaXRpb24gdGhhdCBob2xkcyBhbiBpbWFnZTogTm9kZVNlbGVjdGlvbiB0aHJvd3Mgb24gYW4gZW1wdHkgcG9zaXRpb24uXG4gICAgICAgIGNvbnN0IHsgZnJvbSB9ID0gdHIuc2VsZWN0aW9uO1xuICAgICAgICBjb25zdCBpbWFnZVBvcyA9IFtmcm9tLCBmcm9tIC0gMV0uZmluZChwb3MgPT4gaXNJbWFnZUF0KHRyLmRvYywgcG9zKSk7XG4gICAgICAgIGlmIChpbWFnZVBvcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKE5vZGVTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgaW1hZ2VQb3MpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pXG4gICAgICAucnVuKCk7XG4gIH1cblxuICAvKiogVXBkYXRlIGF0dHJpYnV0ZXMgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW1hZ2UgKi9cbiAgdXBkYXRlSW1hZ2VBdHRyaWJ1dGVzKGVkaXRvcjogRWRpdG9yLCBhdHRyaWJ1dGVzOiBQYXJ0aWFsPEF0ZUltYWdlRGF0YT4pOiB2b2lkIHtcbiAgICBpZiAoZWRpdG9yLmlzQWN0aXZlKFwicmVzaXphYmxlSW1hZ2VcIikpIHtcbiAgICAgIGNvbnN0IHBvcyA9IGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZnJvbTtcbiAgICAgIGVkaXRvclxuICAgICAgICAuY2hhaW4oKVxuICAgICAgICAuZm9jdXMoKVxuICAgICAgICAudXBkYXRlQXR0cmlidXRlcyhcInJlc2l6YWJsZUltYWdlXCIsIGF0dHJpYnV0ZXMpXG4gICAgICAgIC5zZXROb2RlU2VsZWN0aW9uKHBvcylcbiAgICAgICAgLnJ1bigpO1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEltYWdlKGF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXNpemUgaW1hZ2Ugd2l0aCBvcHRpb25hbCBhc3BlY3QgcmF0aW8gbWFpbnRlbmFuY2UgKi9cbiAgcmVzaXplSW1hZ2UoZWRpdG9yOiBFZGl0b3IsIG9wdGlvbnM6IEF0ZVJlc2l6ZU9wdGlvbnMpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvci5pc0FjdGl2ZShcInJlc2l6YWJsZUltYWdlXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudEF0dHJzID0gZWRpdG9yLmdldEF0dHJpYnV0ZXMoXCJyZXNpemFibGVJbWFnZVwiKTtcbiAgICBsZXQgbmV3V2lkdGggPSBvcHRpb25zLndpZHRoO1xuICAgIGxldCBuZXdIZWlnaHQgPSBvcHRpb25zLmhlaWdodDtcblxuICAgIC8vIE1haW50YWluIGFzcGVjdCByYXRpbyBpZiByZXF1ZXN0ZWRcbiAgICBpZiAob3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvICE9PSBmYWxzZSAmJiBjdXJyZW50QXR0cnNbXCJ3aWR0aFwiXSAmJiBjdXJyZW50QXR0cnNbXCJoZWlnaHRcIl0pIHtcbiAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gY3VycmVudEF0dHJzW1wid2lkdGhcIl0gLyBjdXJyZW50QXR0cnNbXCJoZWlnaHRcIl07XG5cbiAgICAgIGlmIChuZXdXaWR0aCAmJiAhbmV3SGVpZ2h0KSB7XG4gICAgICAgIG5ld0hlaWdodCA9IE1hdGgucm91bmQobmV3V2lkdGggLyBhc3BlY3RSYXRpbyk7XG4gICAgICB9IGVsc2UgaWYgKG5ld0hlaWdodCAmJiAhbmV3V2lkdGgpIHtcbiAgICAgICAgbmV3V2lkdGggPSBNYXRoLnJvdW5kKG5ld0hlaWdodCAqIGFzcGVjdFJhdGlvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBseSBtaW5pbXVtIGxpbWl0c1xuICAgIGlmIChuZXdXaWR0aCkge1xuICAgICAgbmV3V2lkdGggPSBNYXRoLm1heCg1MCwgbmV3V2lkdGgpO1xuICAgIH1cbiAgICBpZiAobmV3SGVpZ2h0KSB7XG4gICAgICBuZXdIZWlnaHQgPSBNYXRoLm1heCg1MCwgbmV3SGVpZ2h0KTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUltYWdlQXR0cmlidXRlcyhlZGl0b3IsIHtcbiAgICAgIHdpZHRoOiBuZXdXaWR0aCxcbiAgICAgIGhlaWdodDogbmV3SGVpZ2h0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFByZWRldGVybWluZWQgcmVzaXplIGhlbHBlcnMgdXNlZCBieSBVSSAqL1xuICByZXNpemVJbWFnZVRvU21hbGwoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZUltYWdlKGVkaXRvciwgeyB3aWR0aDogMzAwLCBoZWlnaHQ6IDIwMCwgbWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSB9KTtcbiAgfVxuXG4gIHJlc2l6ZUltYWdlVG9NZWRpdW0oZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZUltYWdlKGVkaXRvciwgeyB3aWR0aDogNTAwLCBoZWlnaHQ6IDM1MCwgbWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSB9KTtcbiAgfVxuXG4gIHJlc2l6ZUltYWdlVG9MYXJnZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIHRoaXMucmVzaXplSW1hZ2UoZWRpdG9yLCB7IHdpZHRoOiA4MDAsIGhlaWdodDogNjAwLCBtYWludGFpbkFzcGVjdFJhdGlvOiB0cnVlIH0pO1xuICB9XG5cbiAgcmVzaXplSW1hZ2VUb09yaWdpbmFsKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IuaXNBY3RpdmUoXCJyZXNpemFibGVJbWFnZVwiKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgdGhpcy5yZXNpemVJbWFnZShlZGl0b3IsIHsgd2lkdGg6IGltZy5uYXR1cmFsV2lkdGgsIGhlaWdodDogaW1nLm5hdHVyYWxIZWlnaHQgfSk7XG4gICAgfTtcbiAgICBjb25zdCBzdG9yZWRTcmMgPSBlZGl0b3IuZ2V0QXR0cmlidXRlcyhcInJlc2l6YWJsZUltYWdlXCIpW1wic3JjXCJdO1xuICAgIGF0ZVJlc29sdmVJbWFnZVNyYyh0aGlzLnNyY1Jlc29sdmVyLCBzdG9yZWRTcmMpLnRoZW4oc3JjID0+IHtcbiAgICAgIGltZy5zcmMgPSBzcmM7XG4gICAgfSk7XG4gIH1cblxuICAvKiogR2V0IGN1cnJlbnQgaW1hZ2UgZGltZW5zaW9ucyAqL1xuICBnZXRJbWFnZURpbWVuc2lvbnMoZWRpdG9yOiBFZGl0b3IpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBpZiAoIWVkaXRvci5pc0FjdGl2ZShcInJlc2l6YWJsZUltYWdlXCIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSBlZGl0b3IuZ2V0QXR0cmlidXRlcyhcInJlc2l6YWJsZUltYWdlXCIpO1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogYXR0cnNbXCJ3aWR0aFwiXSB8fCAwLFxuICAgICAgaGVpZ2h0OiBhdHRyc1tcImhlaWdodFwiXSB8fCAwLFxuICAgIH07XG4gIH1cblxuICAvKiogUmVtb3ZlIHRoZSBzZWxlY3RlZCBpbWFnZSAqL1xuICBkZWxldGVJbWFnZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGlmIChlZGl0b3IuaXNBY3RpdmUoXCJyZXNpemFibGVJbWFnZVwiKSkge1xuICAgICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5kZWxldGVTZWxlY3Rpb24oKS5ydW4oKTtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICAvKiogRG93bmxvYWQgdGhlIGN1cnJlbnQgaW1hZ2UgKi9cbiAgZG93bmxvYWRJbWFnZShlZGl0b3I6IEVkaXRvcik6IHZvaWQge1xuICAgIGNvbnN0IGF0dHJzID0gZWRpdG9yLmdldEF0dHJpYnV0ZXMoXCJyZXNpemFibGVJbWFnZVwiKTtcbiAgICBpZiAoIWF0dHJzIHx8ICFhdHRyc1tcInNyY1wiXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVOYW1lID0gYXR0cnNbXCJhbHRcIl0gfHwgXCJpbWFnZVwiO1xuXG4gICAgYXRlUmVzb2x2ZUltYWdlU3JjKHRoaXMuc3JjUmVzb2x2ZXIsIGF0dHJzW1wic3JjXCJdKS50aGVuKHNyYyA9PlxuICAgICAgdGhpcy5kb3dubG9hZFJlc29sdmVkSW1hZ2Uoc3JjLCBmaWxlTmFtZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkb3dubG9hZFJlc29sdmVkSW1hZ2Uoc3JjOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBEZXRlY3QgaWYgaXQncyBiYXNlNjQgb3IgcmVtb3RlIFVSTFxuICAgIGlmIChcbiAgICAgIHNyYy5zdGFydHNXaXRoKFwiZGF0YTpcIikgfHxcbiAgICAgIHNyYy5zdGFydHNXaXRoKFwiYmxvYjpcIikgfHxcbiAgICAgICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHNyYy5zdGFydHNXaXRoKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pKVxuICAgICkge1xuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgbGluay5ocmVmID0gc3JjO1xuICAgICAgbGluay5kb3dubG9hZCA9IGZpbGVOYW1lO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciByZW1vdGUgVVJMcywgd2UgdHJ5IHRvIGZldGNoIGl0IHRvIGJ5cGFzcyBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zIG9uICdkb3dubG9hZCcgYXR0cmlidXRlXG4gICAgICBmZXRjaChzcmMpXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmJsb2IoKSlcbiAgICAgICAgLnRoZW4oYmxvYiA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZG93bmxvYWRpbmcgaW1hZ2U6XCIsIGVycik7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gb3BlbmluZyBpbiBuZXcgdGFiXG4gICAgICAgICAgd2luZG93Lm9wZW4oc3JjLCBcIl9ibGFua1wiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3RlZEltYWdlKGF0dHJpYnV0ZXM6IFBhcnRpYWw8QXRlSW1hZ2VEYXRhPik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnNlbGVjdGVkSW1hZ2UoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgdGhpcy5zZWxlY3RlZEltYWdlLnNldCh7IC4uLmN1cnJlbnQsIC4uLmF0dHJpYnV0ZXMgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFZhbGlkYXRlIGZpbGUgdHlwZSBhbmQgc2l6ZSAqL1xuICB2YWxpZGF0ZUltYWdlKFxuICAgIGZpbGU6IEZpbGUsXG4gICAgb3B0aW9ucz86IHsgbWF4U2l6ZT86IG51bWJlcjsgYWxsb3dlZFR5cGVzPzogc3RyaW5nW10gfVxuICApOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZzsgcmVhc29uPzogQXRlSW1hZ2VWYWxpZGF0aW9uUmVhc29uIH0ge1xuICAgIGNvbnN0IG1heFNpemUgPSBvcHRpb25zPy5tYXhTaXplIHx8IDEwICogMTAyNCAqIDEwMjQ7XG4gICAgY29uc3QgYWxsb3dlZFR5cGVzID0gb3B0aW9ucz8uYWxsb3dlZFR5cGVzIHx8IFtdO1xuXG4gICAgaWYgKGFsbG93ZWRUeXBlcy5sZW5ndGggPiAwICYmICFhbGxvd2VkVHlwZXMuaW5jbHVkZXMoZmlsZS50eXBlKSkge1xuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogdGhpcy50KCkuaW52YWxpZEZpbGVUeXBlLCByZWFzb246IFwiaW52YWxpZC10eXBlXCIgfTtcbiAgICB9XG5cbiAgICBpZiAoZmlsZS5zaXplID4gbWF4U2l6ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogYCR7dGhpcy50KCkuaW1hZ2VUb29MYXJnZX0gKG1heCAke01hdGgucm91bmQobWF4U2l6ZSAvIDEwMjQgLyAxMDI0KX1NQilgLFxuICAgICAgICByZWFzb246IFwidG9vLWxhcmdlXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqIENvbXByZXNzIGFuZCBwcm9jZXNzIGltYWdlIG9uIGNsaWVudCBzaWRlICovXG4gIGFzeW5jIGNvbXByZXNzSW1hZ2UoXG4gICAgZmlsZTogRmlsZSxcbiAgICBxdWFsaXR5ID0gMC44LFxuICAgIG1heFdpZHRoID0gMTkyMCxcbiAgICBtYXhIZWlnaHQgPSAxMjAwXG4gICk6IFByb21pc2U8QXRlSW1hZ2VVcGxvYWRSZXN1bHQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcblxuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNVcGxvYWRpbmcoKSkge1xuICAgICAgICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3Muc2V0KDQwKTtcbiAgICAgICAgICB0aGlzLnVwbG9hZE1lc3NhZ2Uuc2V0KHRoaXMudCgpLnJlc2l6aW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB7IHdpZHRoLCBoZWlnaHQgfSA9IGltZztcbiAgICAgICAgaWYgKHdpZHRoID4gbWF4V2lkdGggfHwgaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgICAgY29uc3QgcmF0aW8gPSBNYXRoLm1pbihtYXhXaWR0aCAvIHdpZHRoLCBtYXhIZWlnaHQgLyBoZWlnaHQpO1xuICAgICAgICAgIHdpZHRoICo9IHJhdGlvO1xuICAgICAgICAgIGhlaWdodCAqPSByYXRpbztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBjdHg/LmRyYXdJbWFnZShpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nKCkpIHtcbiAgICAgICAgICB0aGlzLnVwbG9hZFByb2dyZXNzLnNldCg2MCk7XG4gICAgICAgICAgdGhpcy51cGxvYWRNZXNzYWdlLnNldCh0aGlzLnQoKS5jb21wcmVzc2luZyk7XG4gICAgICAgIH1cblxuICAgICAgICBjYW52YXMudG9CbG9iKFxuICAgICAgICAgIGJsb2IgPT4ge1xuICAgICAgICAgICAgaWYgKGJsb2IpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGUudGFyZ2V0Py5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgc3JjOiBiYXNlNjQsXG4gICAgICAgICAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICAgICAgICBzaXplOiBibG9iLnNpemUsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgICAgICAgICB3aWR0aDogTWF0aC5yb3VuZCh3aWR0aCksXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQoaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy50KCkuY29tcHJlc3Npb25FcnJvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmlsZS50eXBlLFxuICAgICAgICAgIHF1YWxpdHlcbiAgICAgICAgKTtcbiAgICAgIH07XG5cbiAgICAgIGltZy5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcih0aGlzLnQoKS5sb2FkRXJyb3IpKTtcbiAgICAgIGltZy5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIENvcmUgdXBsb2FkIGxvZ2ljIHdpdGggcHJvZ3Jlc3MgdHJhY2tpbmcgKi9cbiAgcHJpdmF0ZSBhc3luYyB1cGxvYWRJbWFnZVdpdGhQcm9ncmVzcyhcbiAgICBlZGl0b3I6IEVkaXRvcixcbiAgICBmaWxlOiBGaWxlLFxuICAgIGluc2VydGlvblN0cmF0ZWd5OiAoZWRpdG9yOiBFZGl0b3IsIHJlc3VsdDogQXRlSW1hZ2VVcGxvYWRSZXN1bHQpID0+IHZvaWQsXG4gICAgYWN0aW9uTWVzc2FnZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEF0ZUltYWdlVXBsb2FkT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgICBzb3VyY2U6IEF0ZUltYWdlU291cmNlXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmN1cnJlbnRFZGl0b3IgPSBlZGl0b3I7XG4gICAgICB0aGlzLmlzVXBsb2FkaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3Muc2V0KDEwKTtcbiAgICAgIHRoaXMudXBsb2FkTWVzc2FnZS5zZXQodGhpcy50KCkudmFsaWRhdGluZyk7XG4gICAgICB0aGlzLmZvcmNlRWRpdG9yVXBkYXRlKCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucHJvY2Vzc0ltYWdlKGZpbGUsIG9wdGlvbnMsIChwcm9ncmVzcywgbWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAocHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3Muc2V0KHByb2dyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy51cGxvYWRNZXNzYWdlLnNldChtZXNzYWdlKTtcbiAgICAgICAgICB0aGlzLmZvcmNlRWRpdG9yVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnVwbG9hZFByb2dyZXNzLnNldCg5MCk7XG4gICAgICB0aGlzLnVwbG9hZE1lc3NhZ2Uuc2V0KGFjdGlvbk1lc3NhZ2UpO1xuICAgICAgdGhpcy5mb3JjZUVkaXRvclVwZGF0ZSgpO1xuXG4gICAgICAvLyBGaW5hbCBpbnNlcnRpb25cbiAgICAgIGluc2VydGlvblN0cmF0ZWd5KGVkaXRvciwgcmVzdWx0KTtcblxuICAgICAgaWYgKHRoaXMub25JbWFnZVVwbG9hZGVkQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5vbkltYWdlVXBsb2FkZWRDYWxsYmFjayhyZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlc2V0VXBsb2FkU3RhdGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5yZXNldFVwbG9hZFN0YXRlKCk7XG4gICAgICBjb25zb2xlLmVycm9yKHRoaXMudCgpLnVwbG9hZEVycm9yLCBlcnJvcik7XG4gICAgICB0aGlzLm9uSW1hZ2VSZWplY3RlZENhbGxiYWNrPy4oe1xuICAgICAgICByZWFzb246IGVycm9yIGluc3RhbmNlb2YgQXRlSW1hZ2VWYWxpZGF0aW9uRXJyb3IgPyBlcnJvci5yZWFzb24gOiBcInVwbG9hZC1mYWlsZWRcIixcbiAgICAgICAgZmlsZSxcbiAgICAgICAgc291cmNlLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKiogVmFsaWRhdGUsIGNvbXByZXNzIGFuZCAod2hlbiBjb25maWd1cmVkKSBzZW5kIGFuIGltYWdlIHRvIHRoZSB1cGxvYWQgaGFuZGxlciAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NJbWFnZShcbiAgICBmaWxlOiBGaWxlLFxuICAgIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMsXG4gICAgb25TdGVwPzogKHByb2dyZXNzPzogbnVtYmVyLCBtZXNzYWdlPzogc3RyaW5nKSA9PiB2b2lkXG4gICk6IFByb21pc2U8QXRlSW1hZ2VVcGxvYWRSZXN1bHQ+IHtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpcy52YWxpZGF0ZUltYWdlKGZpbGUsIHtcbiAgICAgIG1heFNpemU6IG9wdGlvbnM/Lm1heFNpemUsXG4gICAgICBhbGxvd2VkVHlwZXM6IG9wdGlvbnM/LmFsbG93ZWRUeXBlcyxcbiAgICB9KTtcbiAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBBdGVJbWFnZVZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgdmFsaWRhdGlvbi5yZWFzb24gPz8gXCJpbnZhbGlkLXR5cGVcIixcbiAgICAgICAgdmFsaWRhdGlvbi5lcnJvciA/PyBcIlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIG9uU3RlcD8uKDMwLCB0aGlzLnQoKS5jb21wcmVzc2luZyk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbXByZXNzSW1hZ2UoXG4gICAgICBmaWxlLFxuICAgICAgb3B0aW9ucz8ucXVhbGl0eSB8fCAwLjgsXG4gICAgICBvcHRpb25zPy5tYXhXaWR0aCB8fCAxOTIwLFxuICAgICAgb3B0aW9ucz8ubWF4SGVpZ2h0IHx8IDEyMDBcbiAgICApO1xuXG4gICAgb25TdGVwPy4oNzApO1xuXG4gICAgLy8gSGFuZGxlIGN1c3RvbSB1cGxvYWQgaWYgaGFuZGxlciBpcyBwcm92aWRlZFxuICAgIGlmICh0aGlzLnVwbG9hZEhhbmRsZXIpIHtcbiAgICAgIG9uU3RlcD8uKHVuZGVmaW5lZCwgdGhpcy50KCkudXBsb2FkaW5nVG9TZXJ2ZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoYW5kbGVyUmVzcG9uc2UgPSB0aGlzLnVwbG9hZEhhbmRsZXIoe1xuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgd2lkdGg6IHJlc3VsdC53aWR0aCB8fCAwLFxuICAgICAgICAgIGhlaWdodDogcmVzdWx0LmhlaWdodCB8fCAwLFxuICAgICAgICAgIHR5cGU6IHJlc3VsdC50eXBlLFxuICAgICAgICAgIGJhc2U2NDogcmVzdWx0LnNyYyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlclJlc3VsdCA9IGlzT2JzZXJ2YWJsZShoYW5kbGVyUmVzcG9uc2UpXG4gICAgICAgICAgPyBhd2FpdCBmaXJzdFZhbHVlRnJvbShoYW5kbGVyUmVzcG9uc2UpXG4gICAgICAgICAgOiBhd2FpdCBoYW5kbGVyUmVzcG9uc2U7XG5cbiAgICAgICAgcmVzdWx0LnNyYyA9IGhhbmRsZXJSZXN1bHQuc3JjO1xuICAgICAgICBpZiAoaGFuZGxlclJlc3VsdC5hbHQpIHtcbiAgICAgICAgICByZXN1bHQubmFtZSA9IGhhbmRsZXJSZXN1bHQuYWx0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChoYW5kbGVyRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcih0aGlzLnQoKS51cGxvYWRFcnJvciwgaGFuZGxlckVycm9yKTtcbiAgICAgICAgdGhyb3cgaGFuZGxlckVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGFuIGltYWdlIHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUgZG9jdW1lbnQgKGUuZy4gYmFzZTY0IGZyb20gcGFzdGVkIEhUTUwpXG4gICAqIHRocm91Z2ggdmFsaWRhdGlvbiwgY29tcHJlc3Npb24gYW5kIHRoZSB1cGxvYWQgaGFuZGxlciwgYW5kIHJlc29sdmUgdG8gaXRzIG5ldyBgc3JjYC5cbiAgICovXG4gIGFzeW5jIHJlaG9zdEltYWdlKGZpbGU6IEZpbGUsIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnByb2Nlc3NJbWFnZShmaWxlLCBvcHRpb25zKTtcbiAgICAgIGlmICh0aGlzLm9uSW1hZ2VVcGxvYWRlZENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMub25JbWFnZVVwbG9hZGVkQ2FsbGJhY2socmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQuc3JjO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKHRoaXMudCgpLnVwbG9hZEVycm9yLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0VXBsb2FkU3RhdGUoKSB7XG4gICAgdGhpcy5pc1VwbG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3Muc2V0KDApO1xuICAgIHRoaXMudXBsb2FkTWVzc2FnZS5zZXQoXCJcIik7XG4gICAgdGhpcy5mb3JjZUVkaXRvclVwZGF0ZSgpO1xuICAgIHRoaXMuY3VycmVudEVkaXRvciA9IG51bGw7XG4gIH1cblxuICAvKiogTWFpbiBlbnRyeSBwb2ludCBmb3IgZmlsZSB1cGxvYWQgYW5kIGluc2VydGlvbiAqL1xuICBhc3luYyB1cGxvYWRBbmRJbnNlcnRJbWFnZShcbiAgICBlZGl0b3I6IEVkaXRvcixcbiAgICBmaWxlOiBGaWxlLFxuICAgIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMsXG4gICAgc291cmNlOiBBdGVJbWFnZVNvdXJjZSA9IFwiYXBpXCJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMudXBsb2FkSW1hZ2VXaXRoUHJvZ3Jlc3MoXG4gICAgICBlZGl0b3IsXG4gICAgICBmaWxlLFxuICAgICAgKGVkLCByZXN1bHQpID0+IHtcbiAgICAgICAgdGhpcy5pbnNlcnRJbWFnZShlZCwge1xuICAgICAgICAgIHNyYzogcmVzdWx0LnNyYyxcbiAgICAgICAgICBhbHQ6IHJlc3VsdC5uYW1lLFxuICAgICAgICAgIHRpdGxlOiBgJHtyZXN1bHQubmFtZX0gKCR7cmVzdWx0LndpZHRofcOXJHtyZXN1bHQuaGVpZ2h0fSlgLFxuICAgICAgICAgIHdpZHRoOiByZXN1bHQud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiByZXN1bHQuaGVpZ2h0LFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB0aGlzLnQoKS5pbnNlcnRpbmdJbWFnZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBzb3VyY2VcbiAgICApO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgYW4gZWRpdG9yIHRyYW5zYWN0aW9uIHRvIGZvcmNlIGRlY29yYXRpb24gdXBkYXRlICovXG4gIHByaXZhdGUgZm9yY2VFZGl0b3JVcGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudEVkaXRvcikge1xuICAgICAgY29uc3QgeyB0ciB9ID0gdGhpcy5jdXJyZW50RWRpdG9yLnN0YXRlO1xuICAgICAgdGhpcy5jdXJyZW50RWRpdG9yLnZpZXcuZGlzcGF0Y2godHIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZW5lcmljIGhlbHBlciB0byBvcGVuIGZpbGUgcGlja2VyIGFuZCBwcm9jZXNzIHNlbGVjdGlvbiAqL1xuICBwcml2YXRlIGFzeW5jIHNlbGVjdEZpbGVBbmRQcm9jZXNzKFxuICAgIGVkaXRvcjogRWRpdG9yLFxuICAgIHVwbG9hZE1ldGhvZDogKFxuICAgICAgZWRpdG9yOiBFZGl0b3IsXG4gICAgICBmaWxlOiBGaWxlLFxuICAgICAgb3B0aW9uczogQXRlSW1hZ2VVcGxvYWRPcHRpb25zIHwgdW5kZWZpbmVkLFxuICAgICAgc291cmNlOiBBdGVJbWFnZVNvdXJjZVxuICAgICkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBvcHRpb25zPzogQXRlSW1hZ2VVcGxvYWRPcHRpb25zXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgIGlucHV0LnR5cGUgPSBcImZpbGVcIjtcblxuICAgICAgLy8gVXNlIGFsbG93ZWRUeXBlcyBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gaW1hZ2UvKlxuICAgICAgaWYgKG9wdGlvbnM/LmFsbG93ZWRUeXBlcyAmJiBvcHRpb25zLmFsbG93ZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlucHV0LmFjY2VwdCA9IG9wdGlvbnMuYWxsb3dlZFR5cGVzLmpvaW4oXCIsXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXQuYWNjZXB0ID0gXCJpbWFnZS8qXCI7XG4gICAgICB9XG5cbiAgICAgIGlucHV0LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblxuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBhc3luYyBlID0+IHtcbiAgICAgICAgY29uc3QgZmlsZSA9IChlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlcz8uWzBdO1xuICAgICAgICBpZiAoZmlsZSAmJiBmaWxlLnR5cGUuc3RhcnRzV2l0aChcImltYWdlL1wiKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB1cGxvYWRNZXRob2QoZWRpdG9yLCBmaWxlLCBvcHRpb25zLCBcInBpY2tlclwiKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLnQoKS5ub0ZpbGVTZWxlY3RlZCkpO1xuICAgICAgICB9XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaW5wdXQpO1xuICAgICAgfSk7XG5cbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJjYW5jZWxcIiwgKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGlucHV0KTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLnQoKS5zZWxlY3Rpb25DYW5jZWxsZWQpKTtcbiAgICAgIH0pO1xuXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlucHV0KTtcbiAgICAgIGlucHV0LmNsaWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VsZWN0IGZpbGUgYW5kIHVwbG9hZCBhcyBuZXcgaW1hZ2UgKi9cbiAgYXN5bmMgc2VsZWN0QW5kVXBsb2FkSW1hZ2UoZWRpdG9yOiBFZGl0b3IsIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RGaWxlQW5kUHJvY2VzcyhlZGl0b3IsIHRoaXMudXBsb2FkQW5kSW5zZXJ0SW1hZ2UuYmluZCh0aGlzKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogU2VsZWN0IGZpbGUgYW5kIHJlcGxhY2UgY3VycmVudGx5IHNlbGVjdGVkIGltYWdlICovXG4gIGFzeW5jIHNlbGVjdEFuZFJlcGxhY2VJbWFnZShlZGl0b3I6IEVkaXRvciwgb3B0aW9ucz86IEF0ZUltYWdlVXBsb2FkT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFJlbWVtYmVyIHRoZSBpbWFnZSBub3c6IG9wZW5pbmcgdGhlIGZpbGUgcGlja2VyIGNhbiBtb3ZlIHRoZSBzZWxlY3Rpb24gKGUuZy4gb24gV2ViS2l0KVxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMudHJhY2tTZWxlY3RlZEltYWdlKGVkaXRvcik7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2VsZWN0RmlsZUFuZFByb2Nlc3MoXG4gICAgICAgIGVkaXRvcixcbiAgICAgICAgKGVkLCBmaWxlLCBvcHRzLCBzb3VyY2UpID0+IHRoaXMudXBsb2FkQW5kUmVwbGFjZUltYWdlKGVkLCBmaWxlLCBvcHRzLCBzb3VyY2UsIHRhcmdldCksXG4gICAgICAgIG9wdGlvbnNcbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRhcmdldC5zdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEludGVybmFsIGhlbHBlciB1c2VkIGJ5IHJlcGxhY2VtZW50IGxvZ2ljICovXG4gIGFzeW5jIHVwbG9hZEFuZFJlcGxhY2VJbWFnZShcbiAgICBlZGl0b3I6IEVkaXRvcixcbiAgICBmaWxlOiBGaWxlLFxuICAgIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMsXG4gICAgc291cmNlOiBBdGVJbWFnZVNvdXJjZSA9IFwiYXBpXCIsXG4gICAgdGFyZ2V0PzogQXRlVHJhY2tlZEltYWdlXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFRoZSBpbWFnZSB0byByZXBsYWNlIGlzIHRoZSBvbmUgc2VsZWN0ZWQgd2hlbiB0aGUgcmVwbGFjZW1lbnQgc3RhcnRlZCwgd2hlcmV2ZXIgdGhlIHNlbGVjdGlvbiBpcyBhZnRlciB0aGUgdXBsb2FkXG4gICAgY29uc3QgdHJhY2tlZCA9IHRhcmdldCA/PyB0aGlzLnRyYWNrU2VsZWN0ZWRJbWFnZShlZGl0b3IpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudXBsb2FkSW1hZ2VXaXRoUHJvZ3Jlc3MoXG4gICAgICAgIGVkaXRvcixcbiAgICAgICAgZmlsZSxcbiAgICAgICAgKGVkLCByZXN1bHQpID0+IHtcbiAgICAgICAgICBjb25zdCBpbWFnZURhdGEgPSB7XG4gICAgICAgICAgICBzcmM6IHJlc3VsdC5zcmMsXG4gICAgICAgICAgICBhbHQ6IHJlc3VsdC5uYW1lLFxuICAgICAgICAgICAgdGl0bGU6IGAke3Jlc3VsdC5uYW1lfSAoJHtyZXN1bHQud2lkdGh9w5cke3Jlc3VsdC5oZWlnaHR9KWAsXG4gICAgICAgICAgICB3aWR0aDogcmVzdWx0LndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiByZXN1bHQuaGVpZ2h0LFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAodGhpcy5yZXBsYWNlSW1hZ2VBdChlZCwgdHJhY2tlZC5wb3MoKSwgaW1hZ2VEYXRhKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEltYWdlKGltYWdlRGF0YSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIGltYWdlIHRvIHJlcGxhY2UgKG5vbmUgd2FzIHNlbGVjdGVkLCBvciBpdCB3YXMgcmVtb3ZlZCBkdXJpbmcgdGhlIHVwbG9hZCk6IGluc2VydCBhdCBjdXJzb3JcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2UoZWQsIGltYWdlRGF0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQWZ0ZXIgcmVwbGFjZW1lbnQsIGVuc3VyZSB0aGUgaW1hZ2UgaXMgdHJhY2tlZCBpbiBvdXIgc2lnbmFsc1xuICAgICAgICAgIHRoaXMuc2VsZWN0SW1hZ2UoZWQpO1xuICAgICAgICB9LFxuICAgICAgICB0aGlzLnQoKS5yZXBsYWNpbmdJbWFnZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgc291cmNlXG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICB0cmFja2VkLnN0b3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtZW1iZXJzIHRoZSBzZWxlY3RlZCBpbWFnZSBhbmQgZm9sbG93cyBpdHMgcG9zaXRpb24gdGhyb3VnaCB0aGUgdHJhbnNhY3Rpb25zXG4gICAqIGRpc3BhdGNoZWQgdW50aWwgYHN0b3AoKWAgKGUuZy4gd2hpbGUgdGhlIGZpbGUgcGlja2VyIGlzIG9wZW4gYW5kIHRoZSBpbWFnZSB1cGxvYWRzKS5cbiAgICovXG4gIHByaXZhdGUgdHJhY2tTZWxlY3RlZEltYWdlKGVkaXRvcjogRWRpdG9yKTogQXRlVHJhY2tlZEltYWdlIHtcbiAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gZWRpdG9yLnN0YXRlO1xuICAgIGxldCBwb3M6IG51bWJlciB8IG51bGwgPVxuICAgICAgc2VsZWN0aW9uIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiAmJiBpc0ltYWdlQXQoZWRpdG9yLnN0YXRlLmRvYywgc2VsZWN0aW9uLmZyb20pXG4gICAgICAgID8gc2VsZWN0aW9uLmZyb21cbiAgICAgICAgOiBudWxsO1xuICAgIGNvbnN0IG9uVHJhbnNhY3Rpb24gPSAoeyB0cmFuc2FjdGlvbiB9OiB7IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiB9KSA9PiB7XG4gICAgICBpZiAocG9zICE9PSBudWxsICYmIHRyYW5zYWN0aW9uLmRvY0NoYW5nZWQpIHtcbiAgICAgICAgcG9zID0gdHJhbnNhY3Rpb24ubWFwcGluZy5tYXAocG9zKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGVkaXRvci5vbihcInRyYW5zYWN0aW9uXCIsIG9uVHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiB7XG4gICAgICBwb3M6ICgpID0+IHBvcyxcbiAgICAgIHN0b3A6ICgpID0+IGVkaXRvci5vZmYoXCJ0cmFuc2FjdGlvblwiLCBvblRyYW5zYWN0aW9uKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFJlcGxhY2VzIHRoZSBpbWFnZSBhdCBgcG9zYCB3aXRoIGBpbWFnZURhdGFgIChrZWVwaW5nIGl0cyBvdGhlciBhdHRyaWJ1dGVzKSBhbmQgc2VsZWN0cyBpdCAqL1xuICBwcml2YXRlIHJlcGxhY2VJbWFnZUF0KGVkaXRvcjogRWRpdG9yLCBwb3M6IG51bWJlciB8IG51bGwsIGltYWdlRGF0YTogQXRlSW1hZ2VEYXRhKTogYm9vbGVhbiB7XG4gICAgaWYgKHBvcyA9PT0gbnVsbCB8fCAhaXNJbWFnZUF0KGVkaXRvci5zdGF0ZS5kb2MsIHBvcykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGVkaXRvclxuICAgICAgLmNoYWluKClcbiAgICAgIC5mb2N1cygpXG4gICAgICAuY29tbWFuZCgoeyB0ciB9KSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0ci5kb2Mubm9kZUF0KHBvcykhO1xuICAgICAgICB0ci5zZXROb2RlTWFya3VwKHBvcywgdW5kZWZpbmVkLCB7IC4uLm5vZGUuYXR0cnMsIC4uLmltYWdlRGF0YSB9KTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKE5vZGVTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgcG9zKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSlcbiAgICAgIC5ydW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgaW1hZ2UgZHJvcCBldmVudC5cbiAgICogQ2FsY3VsYXRlcyB0aGUgcG9zaXRpb24gZnJvbSBjb29yZGluYXRlcyBhbmQgc2V0cyB0aGUgc2VsZWN0aW9uIGFjY29yZGluZ2x5LlxuICAgKi9cbiAgaGFuZGxlRHJvcChlZGl0b3I6IEVkaXRvciwgZXZlbnQ6IERyYWdFdmVudCwgb3B0aW9ucz86IEF0ZUltYWdlVXBsb2FkT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZpbGVzID0gZXZlbnQuZGF0YVRyYW5zZmVyPy5maWxlcztcbiAgICBpZiAoIWZpbGVzIHx8IGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGUgPSBBcnJheS5mcm9tKGZpbGVzKS5maW5kKGYgPT4gZi50eXBlLnN0YXJ0c1dpdGgoXCJpbWFnZS9cIikpO1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBUcnkgdG8gZmluZCB0aGUgZHJvcCBwb3NpdGlvbiBmcm9tIGNvb3JkaW5hdGVzXG4gICAgY29uc3QgcG9zID0gZWRpdG9yLnZpZXcucG9zQXRDb29yZHMoeyBsZWZ0OiBldmVudC5jbGllbnRYLCB0b3A6IGV2ZW50LmNsaWVudFkgfSk7XG4gICAgaWYgKHBvcykge1xuICAgICAgZWRpdG9yLmNvbW1hbmRzLnNldFRleHRTZWxlY3Rpb24ocG9zLnBvcyk7XG4gICAgfVxuXG4gICAgdGhpcy51cGxvYWRBbmRJbnNlcnRJbWFnZShlZGl0b3IsIGZpbGUsIG9wdGlvbnMsIFwiZHJvcFwiKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBpbWFnZSBwYXN0ZSBldmVudC5cbiAgICovXG4gIGhhbmRsZVBhc3RlKGVkaXRvcjogRWRpdG9yLCBldmVudDogQ2xpcGJvYXJkRXZlbnQsIG9wdGlvbnM/OiBBdGVJbWFnZVVwbG9hZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBjb25zdCBjbGlwYm9hcmRGaWxlcyA9IGV2ZW50LmNsaXBib2FyZERhdGE/LmZpbGVzO1xuICAgIGlmICghY2xpcGJvYXJkRmlsZXMgfHwgY2xpcGJvYXJkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW1hZ2VGaWxlID0gQXJyYXkuZnJvbShjbGlwYm9hcmRGaWxlcykuZmluZChmaWxlID0+IGZpbGUudHlwZS5zdGFydHNXaXRoKFwiaW1hZ2UvXCIpKTtcbiAgICBpZiAoIWltYWdlRmlsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy51cGxvYWRBbmRJbnNlcnRJbWFnZShlZGl0b3IsIGltYWdlRmlsZSwgb3B0aW9ucywgXCJwYXN0ZVwiKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=
|