@tripetto/runner-autoscroll
Version:
Autoscroll UI for running Tripetto forms and surveys.
449 lines (448 loc) • 42.4 kB
JavaScript
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+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIHRoZSBkYXRhIGluIHRoZSBydW5uZXIgaXMgY2hhbmdlZC4gKi9cbiAgICBAT3V0cHV0KCkgb25EYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxJbnN0YW5jZT4oKTtcblxuICAgIC8qKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24uICovXG4gICAgQE91dHB1dCgpIG9uQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgICAgIHJlYWRvbmx5IHR5cGU6IFwic3RhcnRcIiB8IFwic3RhZ2VcIiB8IFwidW5zdGFnZVwiIHwgXCJmb2N1c1wiIHwgXCJibHVyXCIgfCBcInBhdXNlXCIgfCBcImNvbXBsZXRlXCI7XG4gICAgICAgIHJlYWRvbmx5IGRlZmluaXRpb246IHtcbiAgICAgICAgICAgIHJlYWRvbmx5IGZpbmdlcnByaW50OiBzdHJpbmc7XG4gICAgICAgICAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRvbmx5IGJsb2NrPzoge1xuICAgICAgICAgICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgIH0+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIHRoZSBydW5uZXIgaXMgYWJvdXQgdG8gZW5kIGFuZCBzdWJtaXRzIGRhdGEuICovXG4gICAgQE91dHB1dCgpIG9uU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgICAgIHJlYWRvbmx5IGluc3RhbmNlOiBJbnN0YW5jZTtcbiAgICAgICAgcmVhZG9ubHkgbGFuZ3VhZ2U6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgbG9jYWxlOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIH0+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIHRoZSBydW5uZXIgaXMgY29tcGxldGVkIChhZnRlciB0aGUgZGF0YSBpcyBzdWJtaXR0ZWQpLiAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgICAgIHJlYWRvbmx5IGluc3RhbmNlOiBJbnN0YW5jZTtcbiAgICAgICAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG4gICAgfT4oKTtcblxuICAgIC8qKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgd2hlbiBhbiBlZGl0IGFjdGlvbiBpcyByZXF1ZXN0ZWQuICovXG4gICAgQE91dHB1dCgpIG9uRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgICAgICByZWFkb25seSB0eXBlOiBcInByb2xvZ3VlXCIgfCBcImVwaWxvZ3VlXCIgfCBcInN0eWxlc1wiIHwgXCJsMTBuXCIgfCBcImJsb2NrXCI7XG4gICAgICAgIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAgIH0+KCk7XG5cbiAgICAvKiogU3BlY2lmaWVzIGEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhlIHJ1bm5lciBpcyBcInRvdWNoZWRcIiBieSBhIHVzZXIuICovXG4gICAgQE91dHB1dCgpIG9uVG91Y2ggPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIHRoZSBydW5uZXIgaXMgZGVzdHJveWVkLiAqL1xuICAgIEBPdXRwdXQoKSBvbkRlc3Ryb3kgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKiogU3BlY2lmaWVzIGEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhlIHJ1bm5lciB3YW50cyB0byByZWxvYWQgdGhlIGRlZmluaXRpb24uICovXG4gICAgQElucHV0KCkgb25SZWxvYWQ/OiAoKSA9PiBJRGVmaW5pdGlvbiB8IFByb21pc2U8SURlZmluaXRpb24+O1xuXG4gICAgLyoqIFNwZWNpZmllcyBhIGZ1bmN0aW9uIG9yIHJlY2lwZSB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgcnVubmVyIHdhbnRzIHRvIHBhdXNlLiAqL1xuICAgIEBJbnB1dCgpIG9uUGF1c2U/OiBUQXV0b3Njcm9sbFBhdXNlO1xuXG4gICAgLyoqIFJlZmVyZW5jZSB0byBhIGJ1aWxkZXIgaW5zdGFuY2UgdG8gZW5hYmxlIGxpdmUgcHJldmlldyBmb3IgdGhlIGJ1aWxkZXIuICovXG4gICAgQElucHV0KCkgc2V0IGJ1aWxkZXIoXG4gICAgICAgIHJlZjpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgICAgcmVhZG9ubHkgY29udHJvbGxlcjogSUJ1aWxkZXJJbnN0YW5jZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVhZG9ubHkgY29udHJvbGxlcjogSUJ1aWxkZXJJbnN0YW5jZTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHwgdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICAgIGlmICghcmVmKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmU6IChjb250cm9sbGVyOiBJQnVpbGRlckluc3RhbmNlKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm5Bd2FpdCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVpbGRlciA9IHJlZigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVpbGRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGJ1aWxkZXIuY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVmLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlZi5jb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmbkF3YWl0KTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgZm5Bd2FpdCgpO1xuICAgICAgICAgICAgfSkudGhlbigoY29udHJvbGxlcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuXG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5ob29rPFxuICAgICAgICAgICAgICAgICAgICBcIk9uQ2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgIElIb29rUGF5bG9hZDxcIk9uQ2hhbmdlXCI+ICYge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHkgZGVmaW5pdGlvbjogSURlZmluaXRpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+KFwiT25DaGFuZ2VcIiwgXCJzeW5jaHJvbm91c1wiLCAoY2hhbmdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucnVubmVyQ29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyLmRlZmluaXRpb24gPSBjaGFuZ2VFdmVudC5kZWZpbml0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmhvb2s8XCJPbkVkaXRcIiwgSUhvb2tQYXlsb2FkPFwiT25FZGl0XCI+ICYgeyByZWFkb25seSBkYXRhOiBUUnVubmVyUHJldmlld0RhdGEgfT4oXG4gICAgICAgICAgICAgICAgICAgIFwiT25FZGl0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3luY2hyb25vdXNcIixcbiAgICAgICAgICAgICAgICAgICAgKGVkaXRFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyPy5kb1ByZXZpZXcoZWRpdEV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGJ1aWxkZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb250cm9sbGVyICYmIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB0aGlzLmJ1aWxkZXJDb250cm9sbGVyLFxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgem9uZTogTmdab25lXG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJ1bm5lckNvbnRyb2xsZXIgPSBhd2FpdCBydW4oe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246IHRoaXMuZGVmaW5pdGlvbixcbiAgICAgICAgICAgICAgICB2aWV3OiB0aGlzLmluaXRpYWxWaWV3LFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IHRoaXMuZGlzcGxheSxcbiAgICAgICAgICAgICAgICBzbmFwc2hvdDogdGhpcy5zbmFwc2hvdCxcbiAgICAgICAgICAgICAgICBzdHlsZXM6IHRoaXMuc3R5bGVzLFxuICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQ6IHRoaXMucGVyc2lzdGVudCxcbiAgICAgICAgICAgICAgICBsaWNlbnNlOiB0aGlzLmxpY2Vuc2UsXG4gICAgICAgICAgICAgICAgcmVtb3ZlQnJhbmRpbmc6IHRoaXMucmVtb3ZlQnJhbmRpbmcsXG4gICAgICAgICAgICAgICAgYXR0YWNobWVudHM6IHRoaXMuYXR0YWNobWVudHMsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICBjdXN0b21TdHlsZTogdGhpcy5jdXN0b21TdHlsZSxcbiAgICAgICAgICAgICAgICBjdXN0b21DU1M6IHRoaXMuY3VzdG9tQ1NTLFxuICAgICAgICAgICAgICAgIGwxMG46IHRoaXMubDEwbixcbiAgICAgICAgICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uczogdGhpcy50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgICAgICAgb25SZWFkeTogKGluc3RhbmNlKSA9PiB0aGlzLm9uUmVhZHkuZW1pdChpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IChpbnN0YW5jZSkgPT4gdGhpcy5vbkNoYW5nZS5lbWl0KGluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBvbkltcG9ydDogKGluc3RhbmNlKSA9PiB0aGlzLm9uSW1wb3J0LmVtaXQoaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgIG9uRGF0YTogKGluc3RhbmNlKSA9PiB0aGlzLm9uRGF0YS5lbWl0KGluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBvbkFjdGlvbjogKHR5cGUsIGRlZmluaXRpb24sIGJsb2NrKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQWN0aW9uLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jayxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgb25TdWJtaXQ6IChpbnN0YW5jZSwgbGFuZ3VhZ2UsIGxvY2FsZSwgbmFtZXNwYWNlKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU3VibWl0LmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgb25Db21wbGV0ZTogKGluc3RhbmNlLCBpZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNvbXBsZXRlLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgb25FZGl0OiAodHlwZSwgaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRlckNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJwcm9sb2d1ZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb250cm9sbGVyLmVkaXQoXCJwcm9sb2d1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVwaWxvZ3VlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbnRyb2xsZXIuZWRpdChcImVwaWxvZ3VlXCIsIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImJsb2NrXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29udHJvbGxlci5lZGl0KFwibm9kZVwiLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRWRpdC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvblJlbG9hZDogdGhpcy5vblJlbG9hZCxcbiAgICAgICAgICAgICAgICBvblBhdXNlOiB0aGlzLm9uUGF1c2UsXG4gICAgICAgICAgICAgICAgb25Ub3VjaDogKCkgPT4gdGhpcy5vblRvdWNoLmVtaXQoKSxcbiAgICAgICAgICAgICAgICBvbkRlc3Ryb3k6ICgpID0+IHRoaXMub25EZXN0cm95LmVtaXQoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVyQ29udHJvbGxlcikge1xuICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMucnVubmVyQ29udHJvbGxlciA9IHRoaXMuYnVpbGRlckNvbnRyb2xsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=