UNPKG

@tripetto/runner-autoscroll

Version:

Autoscroll UI for running Tripetto forms and surveys.

449 lines (448 loc) 42.3 kB
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from "@angular/core"; import { isPromise } from "@tripetto/runner"; import { run } from "@tripetto/runner-autoscroll"; import * as i0 from "@angular/core"; export class TripettoAutoscrollComponent { /** Retrieves a reference to the runner instance. */ get controller() { return this.runnerController; } /** Retrieves the running definition. */ get definition() { return this.runnerController?.definition || this.initialDefinition; } /** Specifies the definition to run. */ set definition(definition) { if (this.runnerController && definition) { this.zone.runOutsideAngular(() => { if (isPromise(definition)) { definition.then((value) => { if (value) { this.runnerController.definition = value; } }); } else if (definition) { this.runnerController.l10n = definition; } }); return; } this.initialDefinition = definition; } /** Retrieves the view mode of the runner. */ get view() { return this.runnerController?.view || this.initialView || "live"; } /** Specifies the view mode of the runner. */ set view(view) { if (this.runnerController) { this.zone.runOutsideAngular(() => { this.runnerController.view = view; }); return; } this.initialView = view; } /** Retrieves the styles (colors, font, size, etc.) for the runner. */ get styles() { return this.runnerController?.styles || this.initialStyles; } /** Specifies the styles (colors, font, size, etc.) for the runner. */ set styles(styles) { if (this.runnerController) { this.zone.runOutsideAngular(() => { if (isPromise(styles)) { styles.then((value) => { if (value) { this.runnerController.styles = value; } }); } else if (styles) { this.runnerController.styles = styles; } }); return; } this.initialStyles = styles; } /** Retrieves the localization (locale and translation) information. */ get l10n() { return this.runnerController?.l10n || this.initialL10n; } /** Specifies the localization (locale and translation) information. */ set l10n(l10n) { if (this.runnerController) { this.zone.runOutsideAngular(() => { if (isPromise(l10n)) { l10n.then((value) => { if (value) { this.runnerController.l10n = value; } }); } else if (l10n) { this.runnerController.l10n = l10n; } }); return; } this.initialL10n = l10n; } /** Reference to a builder instance to enable live preview for the builder. */ set builder(ref) { if (!ref) { this.builderController = undefined; } else { new Promise((resolve) => { const fnAwait = () => { if (typeof ref === "function") { const builder = ref(); if (builder) { return resolve(builder.controller); } } else if (ref.controller) { return resolve(ref.controller); } requestAnimationFrame(fnAwait); }; fnAwait(); }).then((controller) => { this.builderController = controller; controller.hook("OnChange", "synchronous", (changeEvent) => { if (this.runnerController) { this.runnerController.definition = changeEvent.definition; } }); controller.hook("OnEdit", "synchronous", (editEvent) => { this.runnerController?.doPreview(editEvent.data); }); }); } } get builder() { return ( this.builderController && { controller: this.builderController, } ); } constructor(element, zone) { this.element = element; this.zone = zone; /** Invoked when the runner is ready. */ this.onReady = new EventEmitter(); /** Invoked when the runner processed a change. */ this.onChange = new EventEmitter(); /** Invoked when data can be imported into the instance. */ this.onImport = new EventEmitter(); /** Invoked when the data in the runner is changed. */ this.onData = new EventEmitter(); /** Specifies a function that is invoked when the user performs an action. */ this.onAction = new EventEmitter(); /** Invoked when the runner is about to end and submits data. */ this.onSubmit = new EventEmitter(); /** Invoked when the runner is completed (after the data is submitted). */ this.onComplete = new EventEmitter(); /** Specifies a function that is invoked when an edit action is requested. */ this.onEdit = new EventEmitter(); /** Specifies a function that is invoked when the runner is "touched" by a user. */ this.onTouch = new EventEmitter(); /** Invoked when the runner is destroyed. */ this.onDestroy = new EventEmitter(); } ngOnInit() { this.zone.runOutsideAngular(async () => { this.runnerController = await run({ element: this.element.nativeElement, definition: this.definition, view: this.initialView, display: this.display, snapshot: this.snapshot, styles: this.styles, persistent: this.persistent, license: this.license, removeBranding: this.removeBranding, attachments: this.attachments, className: this.className, customStyle: this.customStyle, customCSS: this.customCSS, l10n: this.l10n, language: this.language, locale: this.locale, translations: this.translations, onReady: (instance) => this.onReady.emit(instance), onChange: (instance) => this.onChange.emit(instance), onImport: (instance) => this.onImport.emit(instance), onData: (instance) => this.onData.emit(instance), onAction: (type, definition, block) => this.onAction.emit({ type, definition, block, }), onSubmit: (instance, language, locale, namespace) => this.onSubmit.emit({ instance, language, locale, namespace, }), onComplete: (instance, id) => this.onComplete.emit({ instance, id, }), onEdit: (type, id) => { if (this.builderController) { switch (type) { case "prologue": this.builderController.edit("prologue"); break; case "epilogue": this.builderController.edit("epilogue", id); break; case "block": if (id) { this.builderController.edit("node", id); } break; } } this.onEdit.emit({ type, id, }); }, onReload: this.onReload, onPause: this.onPause, onTouch: () => this.onTouch.emit(), onDestroy: () => this.onDestroy.emit(), }); }); } ngOnDestroy() { if (this.runnerController) { this.runnerController.destroy(); this.runnerController = this.builderController = undefined; } } } TripettoAutoscrollComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: TripettoAutoscrollComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component, }); TripettoAutoscrollComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.1", type: TripettoAutoscrollComponent, selector: "tripetto-runner-autoscroll", inputs: { definition: "definition", view: "view", styles: "styles", l10n: "l10n", display: "display", snapshot: "snapshot", persistent: "persistent", license: "license", removeBranding: "removeBranding", attachments: "attachments", className: "className", customStyle: "customStyle", customCSS: "customCSS", language: "language", locale: "locale", translations: "translations", onReload: "onReload", onPause: "onPause", builder: "builder", }, outputs: { onReady: "onReady", onChange: "onChange", onImport: "onImport", onData: "onData", onAction: "onAction", onSubmit: "onSubmit", onComplete: "onComplete", onEdit: "onEdit", onTouch: "onTouch", onDestroy: "onDestroy", }, ngImport: i0, template: "", isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: TripettoAutoscrollComponent, decorators: [ { type: Component, args: [ { selector: "tripetto-runner-autoscroll", template: "", changeDetection: ChangeDetectionStrategy.OnPush, }, ], }, ], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { definition: [ { type: Input, }, ], view: [ { type: Input, }, ], styles: [ { type: Input, }, ], l10n: [ { type: Input, }, ], display: [ { type: Input, }, ], snapshot: [ { type: Input, }, ], persistent: [ { type: Input, }, ], license: [ { type: Input, }, ], removeBranding: [ { type: Input, }, ], attachments: [ { type: Input, }, ], className: [ { type: Input, }, ], customStyle: [ { type: Input, }, ], customCSS: [ { type: Input, }, ], language: [ { type: Input, }, ], locale: [ { type: Input, }, ], translations: [ { type: Input, }, ], onReady: [ { type: Output, }, ], onChange: [ { type: Output, }, ], onImport: [ { type: Output, }, ], onData: [ { type: Output, }, ], onAction: [ { type: Output, }, ], onSubmit: [ { type: Output, }, ], onComplete: [ { type: Output, }, ], onEdit: [ { type: Output, }, ], onTouch: [ { type: Output, }, ], onDestroy: [ { type: Output, }, ], onReload: [ { type: Input, }, ], onPause: [ { type: Input, }, ], builder: [ { type: Input, }, ], }, }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hbmd1bGFyL3Byb2plY3RzL3J1bm5lci9zcmMvbGliL3J1bm5lci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUE2QixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkksT0FBTyxFQUErRCxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRyxPQUFPLEVBT0gsR0FBRyxHQUNOLE1BQU0sNkJBQTZCLENBQUM7O0FBU3JDLE1BQU0sT0FBTywyQkFBMkI7SUFRcEMsb0RBQW9EO0lBQ3BELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUN2RSxDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLElBQWEsVUFBVSxDQUFDLFVBQXNFO1FBQzFGLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLFVBQVUsRUFBRTtZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDN0IsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQ3ZCLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDdEIsSUFBSSxLQUFLLEVBQUU7NEJBQ1AsSUFBSSxDQUFDLGdCQUFpQixDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7eUJBQzdDO29CQUNMLENBQUMsQ0FBQyxDQUFDO2lCQUNOO3FCQUFNLElBQUksVUFBVSxFQUFFO29CQUNuQixJQUFJLENBQUMsZ0JBQWlCLENBQUMsSUFB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c0JBQWhCLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUdPLE9BQU87c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgSURlZmluaXRpb24sIElIb29rUGF5bG9hZCwgSVNuYXBzaG90LCBJbnN0YW5jZSwgTDEwbiwgVEwxMG4sIGlzUHJvbWlzZSB9IGZyb20gXCJAdHJpcGV0dG8vcnVubmVyXCI7XG5pbXBvcnQge1xuICAgIElBdXRvc2Nyb2xsUnVubmVyLFxuICAgIElBdXRvc2Nyb2xsU25hcHNob3QsXG4gICAgSUF1dG9zY3JvbGxTdHlsZXMsXG4gICAgSUJ1aWxkZXJJbnN0YW5jZSxcbiAgICBUQXV0b3Njcm9sbERpc3BsYXksXG4gICAgVEF1dG9zY3JvbGxQYXVzZSxcbiAgICBydW4sXG59IGZyb20gXCJAdHJpcGV0dG8vcnVubmVyLWF1dG9zY3JvbGxcIjtcbmltcG9ydCB7IElSdW5uZXJBdHRhY2htZW50cywgVFJ1bm5lclByZXZpZXdEYXRhLCBUUnVubmVyVmlld3MgfSBmcm9tIFwiQHRyaXBldHRvL3J1bm5lci1yZWFjdC1ob29rXCI7XG5pbXBvcnQgeyBDU1NQcm9wZXJ0aWVzIH0gZnJvbSBcInJlYWN0XCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcInRyaXBldHRvLXJ1bm5lci1hdXRvc2Nyb2xsXCIsXG4gICAgdGVtcGxhdGU6IFwiXCIsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRyaXBldHRvQXV0b3Njcm9sbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJ1bm5lckNvbnRyb2xsZXI/OiBJQXV0b3Njcm9sbFJ1bm5lcjtcbiAgICBwcml2YXRlIGJ1aWxkZXJDb250cm9sbGVyPzogSUJ1aWxkZXJJbnN0YW5jZTtcbiAgICBwcml2YXRlIGluaXRpYWxEZWZpbml0aW9uPzogSURlZmluaXRpb24gfCBQcm9taXNlPElEZWZpbml0aW9uIHwgdW5kZWZpbmVkPjtcbiAgICBwcml2YXRlIGluaXRpYWxWaWV3PzogVFJ1bm5lclZpZXdzIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgaW5pdGlhbFN0eWxlcz86IElBdXRvc2Nyb2xsU3R5bGVzIHwgUHJvbWlzZTxJQXV0b3Njcm9sbFN0eWxlcyB8IHVuZGVmaW5lZD47XG4gICAgcHJpdmF0ZSBpbml0aWFsTDEwbj86IFRMMTBuIHwgUHJvbWlzZTxUTDEwbiB8IHVuZGVmaW5lZD47XG5cbiAgICAvKiogUmV0cmlldmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBydW5uZXIgaW5zdGFuY2UuICovXG4gICAgZ2V0IGNvbnRyb2xsZXIoKTogSUF1dG9zY3JvbGxSdW5uZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW5uZXJDb250cm9sbGVyO1xuICAgIH1cblxuICAgIC8qKiBSZXRyaWV2ZXMgdGhlIHJ1bm5pbmcgZGVmaW5pdGlvbi4gKi9cbiAgICBnZXQgZGVmaW5pdGlvbigpOiBJRGVmaW5pdGlvbiB8IFByb21pc2U8SURlZmluaXRpb24gfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVubmVyQ29udHJvbGxlcj8uZGVmaW5pdGlvbiB8fCB0aGlzLmluaXRpYWxEZWZpbml0aW9uO1xuICAgIH1cblxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIGRlZmluaXRpb24gdG8gcnVuLiAqL1xuICAgIEBJbnB1dCgpIHNldCBkZWZpbml0aW9uKGRlZmluaXRpb246IElEZWZpbml0aW9uIHwgUHJvbWlzZTxJRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVyQ29udHJvbGxlciAmJiBkZWZpbml0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc1Byb21pc2UoZGVmaW5pdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbi50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyIS5kZWZpbml0aW9uID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5lckNvbnRyb2xsZXIhLmwxMG4gPSBkZWZpbml0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxEZWZpbml0aW9uID0gZGVmaW5pdGlvbjtcbiAgICB9XG5cbiAgICAvKiogUmV0cmlldmVzIHRoZSB2aWV3IG1vZGUgb2YgdGhlIHJ1bm5lci4gKi9cbiAgICBnZXQgdmlldygpOiBUUnVubmVyVmlld3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW5uZXJDb250cm9sbGVyPy52aWV3IHx8IHRoaXMuaW5pdGlhbFZpZXcgfHwgXCJsaXZlXCI7XG4gICAgfVxuXG4gICAgLyoqIFNwZWNpZmllcyB0aGUgdmlldyBtb2RlIG9mIHRoZSBydW5uZXIuICovXG4gICAgQElucHV0KCkgc2V0IHZpZXcodmlldzogVFJ1bm5lclZpZXdzKSB7XG4gICAgICAgIGlmICh0aGlzLnJ1bm5lckNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyIS52aWV3ID0gdmlldztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxWaWV3ID0gdmlldztcbiAgICB9XG5cbiAgICAvKiogUmV0cmlldmVzIHRoZSBzdHlsZXMgKGNvbG9ycywgZm9udCwgc2l6ZSwgZXRjLikgZm9yIHRoZSBydW5uZXIuICovXG4gICAgZ2V0IHN0eWxlcygpOiBJQXV0b3Njcm9sbFN0eWxlcyB8IFByb21pc2U8SUF1dG9zY3JvbGxTdHlsZXMgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVubmVyQ29udHJvbGxlcj8uc3R5bGVzIHx8IHRoaXMuaW5pdGlhbFN0eWxlcztcbiAgICB9XG5cbiAgICAvKiogU3BlY2lmaWVzIHRoZSBzdHlsZXMgKGNvbG9ycywgZm9udCwgc2l6ZSwgZXRjLikgZm9yIHRoZSBydW5uZXIuICovXG4gICAgQElucHV0KCkgc2V0IHN0eWxlcyhzdHlsZXM6IElBdXRvc2Nyb2xsU3R5bGVzIHwgUHJvbWlzZTxJQXV0b3Njcm9sbFN0eWxlcyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVyQ29udHJvbGxlcikge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKHN0eWxlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5lckNvbnRyb2xsZXIhLnN0eWxlcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5lckNvbnRyb2xsZXIhLnN0eWxlcyA9IHN0eWxlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsU3R5bGVzID0gc3R5bGVzO1xuICAgIH1cblxuICAgIC8qKiBSZXRyaWV2ZXMgdGhlIGxvY2FsaXphdGlvbiAobG9jYWxlIGFuZCB0cmFuc2xhdGlvbikgaW5mb3JtYXRpb24uICovXG4gICAgZ2V0IGwxMG4oKTogVEwxMG4gfCBQcm9taXNlPFRMMTBuIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1bm5lckNvbnRyb2xsZXI/LmwxMG4gfHwgdGhpcy5pbml0aWFsTDEwbjtcbiAgICB9XG5cbiAgICAvKiogU3BlY2lmaWVzIHRoZSBsb2NhbGl6YXRpb24gKGxvY2FsZSBhbmQgdHJhbnNsYXRpb24pIGluZm9ybWF0aW9uLiAqL1xuICAgIEBJbnB1dCgpIHNldCBsMTBuKGwxMG46IFRMMTBuIHwgUHJvbWlzZTxUTDEwbiB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVyQ29udHJvbGxlcikge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKGwxMG4pKSB7XG4gICAgICAgICAgICAgICAgICAgIGwxMG4udGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnVubmVyQ29udHJvbGxlciEubDEwbiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGwxMG4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyIS5sMTBuID0gbDEwbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsTDEwbiA9IGwxMG47XG4gICAgfVxuXG4gICAgLyoqIFNwZWNpZmllcyB0aGUgZGlzcGxheSBtb2RlIG9mIHRoZSBydW5uZXIuICovXG4gICAgQElucHV0KCkgZGlzcGxheT86IFRBdXRvc2Nyb2xsRGlzcGxheTtcblxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIHNuYXBzaG90IHRoYXQgc2hvdWxkIGJlIHJlc3RvcmVkLiAqL1xuICAgIEBJbnB1dCgpIHNuYXBzaG90PzogSVNuYXBzaG90PElBdXRvc2Nyb2xsU25hcHNob3Q+IHwgUHJvbWlzZTxJU25hcHNob3Q8SUF1dG9zY3JvbGxTbmFwc2hvdD4gfCB1bmRlZmluZWQ+O1xuXG4gICAgLyoqIFRyeSB0byBzdG9yZSBzZXNzaW9ucyBpbiB0aGUgbG9jYWwgc3RvcmUgdG8gcHJlc2VydmUgcGVyc2lzdGVuY3kgb24gbmF2aWdhdGlvbiBiZXR3ZWVuIG11bHRpcGxlIHBhZ2VzIHRoYXQgaG9zdCB0aGUgcnVubmVyLiAqL1xuICAgIEBJbnB1dCgpIHBlcnNpc3RlbnQ/OiBib29sZWFuO1xuXG4gICAgLyoqIFNwZWNpZmllcyBhIGxpY2Vuc2UgY29kZSBmb3IgdGhlIHJ1bm5lci4gKi9cbiAgICBASW5wdXQoKSBsaWNlbnNlPzogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuXG4gICAgLyoqIFJlbW92ZXMgYWxsIFRyaXBldHRvIGJyYW5kaW5nIHdoZW4gYSB2YWxpZCBsaWNlbnNlIGlzIHN1cHBsaWVkLiAqL1xuICAgIEBJbnB1dCgpIHJlbW92ZUJyYW5kaW5nPzogYm9vbGVhbjtcblxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIGF0dGFjaG1lbnRzIGhhbmRsZXIuICovXG4gICAgQElucHV0KCkgYXR0YWNobWVudHM/OiBJUnVubmVyQXR0YWNobWVudHM7XG5cbiAgICAvKiogU3BlY2lmaWVzIGEgY3VzdG9tIGNsYXNzIG5hbWUgZm9yIHRoZSBIVE1MIGVsZW1lbnQgdGhhdCBob2xkcyB0aGUgcnVubmVyLiAqL1xuICAgIEBJbnB1dCgpIGNsYXNzTmFtZT86IHN0cmluZztcblxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIGlubGluZSBzdHlsZSBmb3IgdGhlIEhUTUwgZWxlbWVudCB0aGF0IGhvbGRzIHRoZSBydW5uZXIuICovXG4gICAgQElucHV0KCkgY3VzdG9tU3R5bGU/OiBDU1NQcm9wZXJ0aWVzO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGN1c3RvbSBDU1MgcnVsZXMuXG4gICAgICogVG8gc3BlY2lmeSBydWxlcyBmb3IgYSBzcGVjaWZpYyBibG9jaywgdXNlIHRoaXMgc2VsZWN0b3I6IFtkYXRhLWJsb2NrPVwiPGJsb2NrIGlkZW50aWZpZXI+XCJdIHsgLi4uIH1cbiAgICAgKi9cbiAgICBASW5wdXQoKSBjdXN0b21DU1M/OiBzdHJpbmc7XG5cbiAgICAvKiogU3BlY2lmaWVzIHRoZSBwcmVmZXJyZWQgbGFuZ3VhZ2UgKHdoZW4gbm8gbGFuZ3VhZ2UgaXMgc3BlY2lmaWVkIGluIHRoZSBkZWZpbml0aW9uKS4gKi9cbiAgICBASW5wdXQoKSBsYW5ndWFnZT86IHN0cmluZztcblxuICAgIC8qKiBQcm92aWRlcyBsb2NhbGUgaW5mb3JtYXRpb24uICovXG4gICAgQElucHV0KCkgbG9jYWxlPzogTDEwbi5JTG9jYWxlIHwgKChsb2NhbGU6IHN0cmluZykgPT4gTDEwbi5JTG9jYWxlIHwgUHJvbWlzZTxMMTBuLklMb2NhbGUgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkKTtcblxuICAgIC8qKiBQcm92aWRlcyB0cmFuc2xhdGlvbnMuICovXG4gICAgQElucHV0KCkgdHJhbnNsYXRpb25zPzpcbiAgICAgICAgfCBMMTBuLlRUcmFuc2xhdGlvblxuICAgICAgICB8IEwxMG4uVFRyYW5zbGF0aW9uW11cbiAgICAgICAgfCAoKFxuICAgICAgICAgICAgICBsYW5ndWFnZTogc3RyaW5nLFxuICAgICAgICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgIHZlcnNpb246IHN0cmluZ1xuICAgICAgICAgICkgPT4gTDEwbi5UVHJhbnNsYXRpb24gfCBMMTBuLlRUcmFuc2xhdGlvbltdIHwgUHJvbWlzZTxMMTBuLlRUcmFuc2xhdGlvbiB8IEwxMG4uVFRyYW5zbGF0aW9uW10gfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkKTtcblxuICAgIC8qKiBJbnZva2VkIHdoZW4gdGhlIHJ1bm5lciBpcyByZWFkeS4gKi9cbiAgICBAT3V0cHV0KCkgb25SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8SW5zdGFuY2U+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIHRoZSBydW5uZXIgcHJvY2Vzc2VkIGEgY2hhbmdlLiAqL1xuICAgIEBPdXRwdXQoKSBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SW5zdGFuY2U+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIGRhdGEgY2FuIGJlIGltcG9ydGVkIGludG8gdGhlIGluc3RhbmNlLiAqL1xuICAgIEBPdXRwdXQoKSBvbkltcG9ydCA9IG5ldyBFdmVudEVtaXR0ZXI8SW5zdGFuY2U+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIHRoZSBkYXRhIGluIHRoZSBydW5uZXIgaXMgY2hhbmdlZC4gKi9cbiAgICBAT3V0cHV0KCkgb25EYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxJbnN0YW5jZT4oKTtcblxuICAgIC8qKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24uICovXG4gICAgQE91dHB1dCgpIG9uQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgICAgIHJlYWRvbmx5IHR5cGU6IFwic3RhcnRcIiB8IFwic3RhZ2VcIiB8IFwidW5zdGFnZVwiIHwgXCJmb2N1c1wiIHwgXCJibHVyXCIgfCBcInBhdXNlXCIgfCBcImNvbXBsZXRlXCI7XG4gICAgICAgIHJlYWRvbmx5IGRlZmluaXRpb246IHtcbiAgICAgICAgICAgIHJlYWRvbmx5IGZpbmdlcnByaW50OiBzdHJpbmc7XG4gICAgICAgICAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRvbmx5IGJsb2NrPzoge1xuICAgICAgICAgICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICB9PigpO1xuXG4gICAgLyoqIEludm9rZWQgd2hlbiB0aGUgcnVubmVyIGlzIGFib3V0IHRvIGVuZCBhbmQgc3VibWl0cyBkYXRhLiAqL1xuICAgIEBPdXRwdXQoKSBvblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgICAgICByZWFkb25seSBpbnN0YW5jZTogSW5zdGFuY2U7XG4gICAgICAgIHJlYWRvbmx5IGxhbmd1YWdlOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGxvY2FsZTogc3RyaW5nO1xuICAgICAgICByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB9PigpO1xuXG4gICAgLyoqIEludm9rZWQgd2hlbiB0aGUgcnVubmVyIGlzIGNvbXBsZXRlZCAoYWZ0ZXIgdGhlIGRhdGEgaXMgc3VibWl0dGVkKS4gKi9cbiAgICBAT3V0cHV0KCkgb25Db21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgICAgICByZWFkb25seSBpbnN0YW5jZTogSW5zdGFuY2U7XG4gICAgICAgIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAgIH0+KCk7XG5cbiAgICAvKiogU3BlY2lmaWVzIGEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIHdoZW4gYW4gZWRpdCBhY3Rpb24gaXMgcmVxdWVzdGVkLiAqL1xuICAgIEBPdXRwdXQoKSBvbkVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICAgICAgcmVhZG9ubHkgdHlwZTogXCJwcm9sb2d1ZVwiIHwgXCJlcGlsb2d1ZVwiIHwgXCJzdHlsZXNcIiB8IFwibDEwblwiIHwgXCJibG9ja1wiO1xuICAgICAgICByZWFkb25seSBpZD86IHN0cmluZztcbiAgICB9PigpO1xuXG4gICAgLyoqIFNwZWNpZmllcyBhIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoZSBydW5uZXIgaXMgXCJ0b3VjaGVkXCIgYnkgYSB1c2VyLiAqL1xuICAgIEBPdXRwdXQoKSBvblRvdWNoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEludm9rZWQgd2hlbiB0aGUgcnVubmVyIGlzIGRlc3Ryb3llZC4gKi9cbiAgICBAT3V0cHV0KCkgb25EZXN0cm95ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIFNwZWNpZmllcyBhIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoZSBydW5uZXIgd2FudHMgdG8gcmVsb2FkIHRoZSBkZWZpbml0aW9uLiAqL1xuICAgIEBJbnB1dCgpIG9uUmVsb2FkPzogKCkgPT4gSURlZmluaXRpb24gfCBQcm9taXNlPElEZWZpbml0aW9uPjtcblxuICAgIC8qKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiBvciByZWNpcGUgdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhlIHJ1bm5lciB3YW50cyB0byBwYXVzZS4gKi9cbiAgICBASW5wdXQoKSBvblBhdXNlPzogVEF1dG9zY3JvbGxQYXVzZTtcblxuICAgIC8qKiBSZWZlcmVuY2UgdG8gYSBidWlsZGVyIGluc3RhbmNlIHRvIGVuYWJsZSBsaXZlIHByZXZpZXcgZm9yIHRoZSBidWlsZGVyLiAqL1xuICAgIEBJbnB1dCgpIHNldCBidWlsZGVyKFxuICAgICAgICByZWY6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICAgIHJlYWRvbmx5IGNvbnRyb2xsZXI6IElCdWlsZGVySW5zdGFuY2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHwgKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlYWRvbmx5IGNvbnRyb2xsZXI6IElCdWlsZGVySW5zdGFuY2U7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB8IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgICBpZiAoIXJlZikge1xuICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlOiAoY29udHJvbGxlcjogSUJ1aWxkZXJJbnN0YW5jZSkgPT4gdm9pZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZuQXdhaXQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSByZWYoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShidWlsZGVyLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZi5jb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZWYuY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm5Bd2FpdCk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGZuQXdhaXQoKTtcbiAgICAgICAgICAgIH0pLnRoZW4oKGNvbnRyb2xsZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb250cm9sbGVyID0gY29udHJvbGxlcjtcblxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuaG9vazxcbiAgICAgICAgICAgICAgICAgICAgXCJPbkNoYW5nZVwiLFxuICAgICAgICAgICAgICAgICAgICBJSG9va1BheWxvYWQ8XCJPbkNoYW5nZVwiPiAmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5IGRlZmluaXRpb246IElEZWZpbml0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPihcIk9uQ2hhbmdlXCIsIFwic3luY2hyb25vdXNcIiwgKGNoYW5nZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJ1bm5lckNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnVubmVyQ29udHJvbGxlci5kZWZpbml0aW9uID0gY2hhbmdlRXZlbnQuZGVmaW5pdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5ob29rPFwiT25FZGl0XCIsIElIb29rUGF5bG9hZDxcIk9uRWRpdFwiPiAmIHsgcmVhZG9ubHkgZGF0YTogVFJ1bm5lclByZXZpZXdEYXRhIH0+KFxuICAgICAgICAgICAgICAgICAgICBcIk9uRWRpdFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN5bmNocm9ub3VzXCIsXG4gICAgICAgICAgICAgICAgICAgIChlZGl0RXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnVubmVyQ29udHJvbGxlcj8uZG9QcmV2aWV3KGVkaXRFdmVudC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBidWlsZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29udHJvbGxlciAmJiB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlcjogdGhpcy5idWlsZGVyQ29udHJvbGxlcixcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZVxuICAgICkge31cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyID0gYXdhaXQgcnVuKHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uOiB0aGlzLmRlZmluaXRpb24sXG4gICAgICAgICAgICAgICAgdmlldzogdGhpcy5pbml0aWFsVmlldyxcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiB0aGlzLmRpc3BsYXksXG4gICAgICAgICAgICAgICAgc25hcHNob3Q6IHRoaXMuc25hcHNob3QsXG4gICAgICAgICAgICAgICAgc3R5bGVzOiB0aGlzLnN0eWxlcyxcbiAgICAgICAgICAgICAgICBwZXJzaXN0ZW50OiB0aGlzLnBlcnNpc3RlbnQsXG4gICAgICAgICAgICAgICAgbGljZW5zZTogdGhpcy5saWNlbnNlLFxuICAgICAgICAgICAgICAgIHJlbW92ZUJyYW5kaW5nOiB0aGlzLnJlbW92ZUJyYW5kaW5nLFxuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzOiB0aGlzLmF0dGFjaG1lbnRzLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgY3VzdG9tU3R5bGU6IHRoaXMuY3VzdG9tU3R5bGUsXG4gICAgICAgICAgICAgICAgY3VzdG9tQ1NTOiB0aGlzLmN1c3RvbUNTUyxcbiAgICAgICAgICAgICAgICBsMTBuOiB0aGlzLmwxMG4sXG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnM6IHRoaXMudHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgICAgIG9uUmVhZHk6IChpbnN0YW5jZSkgPT4gdGhpcy5vblJlYWR5LmVtaXQoaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlOiAoaW5zdGFuY2UpID0+IHRoaXMub25DaGFuZ2UuZW1pdChpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgb25JbXBvcnQ6IChpbnN0YW5jZSkgPT4gdGhpcy5vbkltcG9ydC5lbWl0KGluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBvbkRhdGE6IChpbnN0YW5jZSkgPT4gdGhpcy5vbkRhdGEuZW1pdChpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgb25BY3Rpb246ICh0eXBlLCBkZWZpbml0aW9uLCBibG9jaykgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkFjdGlvbi5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG9uU3VibWl0OiAoaW5zdGFuY2UsIGxhbmd1YWdlLCBsb2NhbGUsIG5hbWVzcGFjZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblN1Ym1pdC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG9uQ29tcGxldGU6IChpbnN0YW5jZSwgaWQpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Db21wbGV0ZS5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG9uRWRpdDogKHR5cGUsIGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkZXJDb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicHJvbG9ndWVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29udHJvbGxlci5lZGl0KFwicHJvbG9ndWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlcGlsb2d1ZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb250cm9sbGVyLmVkaXQoXCJlcGlsb2d1ZVwiLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJibG9ja1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbnRyb2xsZXIuZWRpdChcIm5vZGVcIiwgaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVkaXQuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25SZWxvYWQ6IHRoaXMub25SZWxvYWQsXG4gICAgICAgICAgICAgICAgb25QYXVzZTogdGhpcy5vblBhdXNlLFxuICAgICAgICAgICAgICAgIG9uVG91Y2g6ICgpID0+IHRoaXMub25Ub3VjaC5lbWl0KCksXG4gICAgICAgICAgICAgICAgb25EZXN0cm95OiAoKSA9PiB0aGlzLm9uRGVzdHJveS5lbWl0KCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnJ1bm5lckNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIHRoaXMucnVubmVyQ29udHJvbGxlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLnJ1bm5lckNvbnRyb2xsZXIgPSB0aGlzLmJ1aWxkZXJDb250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19