ngy-tutorial
Version:
651 lines (640 loc) • 83.8 kB
JavaScript
import { Injectable, EventEmitter, Component, Input, ViewChild, Inject, NgModule, defineInjectable } from '@angular/core';
import { Observable, BehaviorSubject } from 'rxjs';
import { DomSanitizer } from '@angular/platform-browser';
import { DOCUMENT, CommonModule } from '@angular/common';
import { trigger, transition, animate, keyframes, style, query } from '@angular/animations';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/** @enum {number} */
const StepPromptPlacement = {
Above: 0,
Below: 1,
Left: 2,
Right: 3,
};
StepPromptPlacement[StepPromptPlacement.Above] = 'Above';
StepPromptPlacement[StepPromptPlacement.Below] = 'Below';
StepPromptPlacement[StepPromptPlacement.Left] = 'Left';
StepPromptPlacement[StepPromptPlacement.Right] = 'Right';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
class NgyTutorialService {
constructor() {
this.toShow = new EventEmitter();
this.tutorialInProgress = new Observable();
this.currentStep = new Observable();
this._tutorialInProgress = new BehaviorSubject(false);
this._currentStep = new BehaviorSubject(0);
this.tutorialInProgress = this._tutorialInProgress.asObservable();
this.currentStep = this._currentStep.asObservable();
this.steps = [];
}
/**
* @return {?}
*/
showTutorial() {
this._currentStep.next(0);
this.toShow.emit(this.steps.slice());
this._tutorialInProgress.next(true);
}
/**
* @return {?}
*/
hideTutorial() {
this.toShow.emit([]);
this._tutorialInProgress.next(false);
}
/**
* @param {?} title
* @param {?} prompt
* @param {?=} option
* @return {?}
*/
addStep(title, prompt, option) {
if (option && option.disableNext && option.disableInteraction) {
console.warn(`ngy-tutorial error, step ${title} - ${prompt} has disableNext and disableInteraction set to true.
This step will cause tutorial to be unable to progress forward as such is not added to the tutorial`);
return;
}
this.steps.push(new TutorialStep(title, prompt, option));
}
/**
* @param {?} stepNumber
* @return {?}
*/
removeStep(stepNumber) {
if (stepNumber > this.steps.length - 1 || stepNumber < 0) {
return;
}
else {
this.steps.splice(stepNumber, 1);
}
}
/**
* @return {?}
*/
nextStep() {
this._currentStep.next(this._currentStep.value + 1);
}
/**
* @return {?}
*/
previousStep() {
this._currentStep.next(this._currentStep.value - 1);
}
}
NgyTutorialService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] },
];
NgyTutorialService.ctorParameters = () => [];
/** @nocollapse */ NgyTutorialService.ngInjectableDef = defineInjectable({ factory: function NgyTutorialService_Factory() { return new NgyTutorialService(); }, token: NgyTutorialService, providedIn: "root" });
class TutorialStep {
/**
* @param {?} title
* @param {?} prompt
* @param {?} option
*/
constructor(title, prompt, option) {
this.options = Object.assign({}, TutorialStep.DEFAULT_OPTIONS, option);
this.title = title;
this.prompt = prompt;
}
}
TutorialStep.DEFAULT_OPTIONS = {
placement: StepPromptPlacement.Below
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
class PromptComponent {
/**
* @param {?} svc
* @param {?} sani
* @param {?} document
* @param {?} options
*/
constructor(svc, sani, document, options) {
this.svc = svc;
this.sani = sani;
this.document = document;
this.options = options;
this.stepNumber = 0;
this.totalSteps = 0;
this.overrideButtonDisable = false;
this.margin = 10;
this.appliedClasses = {};
this.appliedTexts = {};
}
/**
* @return {?}
*/
ngOnInit() {
this.appliedClasses = {};
this.appliedTexts = {};
if (this.options.classToAdd) {
this.appliedClasses.container = this.options.classToAdd.container ? this.options.classToAdd.container : [];
this.appliedClasses.title = this.options.classToAdd.title ? this.options.classToAdd.title : [];
this.appliedClasses.prompt = this.options.classToAdd.prompt ? this.options.classToAdd.prompt : [];
this.appliedClasses.nextBtn = this.options.classToAdd.nextBtn ? this.options.classToAdd.nextBtn : [];
this.appliedClasses.previousBtn = this.options.classToAdd.previousBtn ? this.options.classToAdd.previousBtn : [];
this.appliedClasses.finishBtn = this.options.classToAdd.finishBtn ? this.options.classToAdd.finishBtn : [];
this.appliedClasses.skipBtn = this.options.classToAdd.skipBtn ? this.options.classToAdd.skipBtn : [];
this.appliedClasses.nextIcon = this.options.classToAdd.nextIcon ? this.options.classToAdd.nextIcon : '';
this.appliedClasses.previousIcon = this.options.classToAdd.previousIcon ? this.options.classToAdd.previousIcon : '';
this.appliedClasses.finishIcon = this.options.classToAdd.finishIcon ? this.options.classToAdd.finishIcon : '';
this.appliedClasses.skipIcon = this.options.classToAdd.skipIcon ? this.options.classToAdd.skipIcon : '';
}
if (this.step.options && this.step.options.classToAdd) {
// tslint:disable-next-line:max-line-length
this.appliedClasses.container = this.appliedClasses.container.concat(this.step.options.classToAdd.container ? this.step.options.classToAdd.container : []);
// tslint:disable-next-line:max-line-length
this.appliedClasses.title = this.appliedClasses.title.concat(this.step.options.classToAdd.title ? this.step.options.classToAdd.title : []);
// tslint:disable-next-line:max-line-length
this.appliedClasses.prompt = this.appliedClasses.prompt.concat(this.step.options.classToAdd.prompt ? this.step.options.classToAdd.prompt : []);
// tslint:disable-next-line:max-line-length
this.appliedClasses.nextBtn = this.appliedClasses.nextBtn.concat(this.step.options.classToAdd.nextBtn ? this.step.options.classToAdd.nextBtn : []);
// tslint:disable-next-line:max-line-length
this.appliedClasses.previousBtn = this.appliedClasses.previousBtn.concat(this.step.options.classToAdd.previousBtn ? this.step.options.classToAdd.previousBtn : []);
// tslint:disable-next-line:max-line-length
this.appliedClasses.finishBtn = this.appliedClasses.finishBtn.concat(this.step.options.classToAdd.finishBtn ? this.step.options.classToAdd.finishBtn : []);
// tslint:disable-next-line:max-line-length
this.appliedClasses.skipBtn = this.appliedClasses.skipBtn.concat(this.step.options.classToAdd.skipBtn ? this.step.options.classToAdd.skipBtn : []);
// tslint:disable-next-line:max-line-length
this.appliedClasses.nextIcon = this.step.options.classToAdd.nextIcon ? this.step.options.classToAdd.nextIcon : this.appliedClasses.nextIcon;
// tslint:disable-next-line:max-line-length
this.appliedClasses.previousIcon = this.step.options.classToAdd.previousIcon ? this.step.options.classToAdd.previousIcon : this.appliedClasses.previousIcon;
// tslint:disable-next-line:max-line-length
this.appliedClasses.finishIcon = this.step.options.classToAdd.finishIcon ? this.step.options.classToAdd.finishIcon : this.appliedClasses.finishIcon;
// tslint:disable-next-line:max-line-length
this.appliedClasses.skipIcon = this.step.options.classToAdd.skipIcon ? this.step.options.classToAdd.skipIcon : this.appliedClasses.skipIcon;
}
if (this.options.actionTexts) {
this.appliedTexts = Object.assign({}, this.options.actionTexts);
}
if (this.step.options && this.step.options.actionTexts) {
this.appliedTexts = Object.assign({}, this.appliedTexts, this.step.options.actionTexts);
}
if (this.step.title) {
this.titleSafe = this.sani.bypassSecurityTrustHtml(this.step.title);
}
if (this.step.prompt) {
this.promptSafe = this.sani.bypassSecurityTrustHtml(this.step.prompt);
}
}
/**
* @return {?}
*/
finishTutorial() {
this.svc.hideTutorial();
}
/**
* @return {?}
*/
nextStep() {
this.svc.nextStep();
}
/**
* @return {?}
*/
previousStep() {
this.svc.previousStep();
}
/**
* @param {?=} elem
* @param {?=} placement
* @return {?}
*/
setPromptForElement(elem, placement) {
setTimeout(() => {
/** @type {?} */
const promptPositionInfo = this.prompt.nativeElement.getBoundingClientRect();
/** @type {?} */
const viewW = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
/** @type {?} */
const viewH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
/** @type {?} */
const promptH = promptPositionInfo.height;
/** @type {?} */
const promptW = promptPositionInfo.width;
if (!elem || placement === undefined) {
this.setPromptPosition(viewW / 2 - promptW / 2, viewH / 2 - promptH / 2);
}
else {
/** @type {?} */
const positionInfo = elem.getBoundingClientRect();
if (placement === StepPromptPlacement.Right) {
this.setPromptPosition(positionInfo.left + positionInfo.width + 2 * this.margin, positionInfo.top + positionInfo.height / 2 - promptH / 2);
}
else if (placement === StepPromptPlacement.Left) {
this.setPromptPosition(positionInfo.left - promptW - 2 * this.margin, positionInfo.top + positionInfo.height / 2 - promptH / 2);
}
else if (placement === StepPromptPlacement.Above) {
this.setPromptPosition(positionInfo.left + positionInfo.width / 2 - promptW / 2, positionInfo.top - 2 * this.margin - promptH);
}
else {
this.setPromptPosition(positionInfo.left + positionInfo.width / 2 - promptW / 2, positionInfo.top + positionInfo.height + 2 * this.margin);
}
setTimeout(() => {
this.overrideButtonDisable = this.isPromptCoveringElement(elem) || this.isElementOutOfView(elem);
}, 200);
}
});
}
/**
* @private
* @param {?} left
* @param {?} top
* @return {?}
*/
setPromptPosition(left, top) {
/** @type {?} */
const promptPositionInfo = this.prompt.nativeElement.getBoundingClientRect();
/** @type {?} */
const viewW = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
/** @type {?} */
const viewH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
/** @type {?} */
const promptH = promptPositionInfo.height;
/** @type {?} */
const promptW = promptPositionInfo.width;
if (left < this.margin) {
left = this.margin;
}
if (top < this.margin) {
top = this.margin;
}
if (left > viewW - promptW - this.margin) {
left = viewW - promptW - this.margin;
}
if (top > viewH - promptH - this.margin) {
top = viewH - promptH - this.margin;
}
this.prompt.nativeElement.style.left = `${left}px`;
this.prompt.nativeElement.style.top = `${top}px`;
}
/**
* @private
* @param {?} elem
* @return {?}
*/
isPromptCoveringElement(elem) {
if (!elem) {
return false;
}
/** @type {?} */
const promptPositionInfo = this.prompt.nativeElement.getBoundingClientRect();
/** @type {?} */
const promptL = promptPositionInfo.left;
/** @type {?} */
const promptT = promptPositionInfo.top;
/** @type {?} */
const promptLW = promptL + promptPositionInfo.width;
/** @type {?} */
const promptTH = promptT + promptPositionInfo.height;
/** @type {?} */
const positionInfo = elem.getBoundingClientRect();
/** @type {?} */
const elementL = positionInfo.left;
/** @type {?} */
const elementT = positionInfo.top;
/** @type {?} */
const elementCenterX = elementL + positionInfo.width / 2;
/** @type {?} */
const elementCenterY = elementT + positionInfo.height / 2;
if (promptTH < elementCenterY || promptT > elementCenterY || promptLW < elementCenterX || promptL > elementCenterX) {
return false;
}
else {
return true;
}
}
/**
* @private
* @param {?} elem
* @return {?}
*/
isElementOutOfView(elem) {
/** @type {?} */
const positionInfo = elem.getBoundingClientRect();
/** @type {?} */
const viewW = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
/** @type {?} */
const viewH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
if (positionInfo.top + positionInfo.height / 2 > viewH || positionInfo.left + positionInfo.width / 2 > viewW) {
return true;
}
else {
return false;
}
}
}
PromptComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-ngy-tutorial-prompt',
template: `<div class="prompt-container smooth-2 ngy-tutorial-prompt-container" [ngClass]="appliedClasses.container" *ngIf="step"
#prompt>
<h2 class="title ngy-tutorial-title" [ngClass]="appliedClasses.title" *ngIf="step.title" [innerHTML]="titleSafe"></h2>
<p class="prompt ngy-tutorial-prompt" [ngClass]="appliedClasses.prompt" *ngIf="step.prompt" [innerHTML]="promptSafe"></p>
<div class="action-container">
<div class="actions left">
<button id="lib-ngy-tutorial-previous-btn" *ngIf="(stepNumber !== 0) && (!step.options.disablePrevious || overrideButtonDisable)" class="ngy-tutorial-previous-btn"
(click)="previousStep()" [ngClass]="appliedClasses.previousBtn"><i [ngClass]="appliedClasses.previousIcon"
*ngIf="appliedClasses.previousIcon"></i> {{appliedTexts.previous ? appliedTexts.previous : "Previous"}}</button>
<button id="lib-ngy-tutorial-skip-btn" [ngClass]="appliedClasses.skipBtn" *ngIf="stepNumber===0" class="ngy-tutorial-skip-btn"
(click)="finishTutorial()"><i [ngClass]="appliedClasses.skipIcon" *ngIf="appliedClasses.skipIcon"></i>
{{appliedTexts.skip ? appliedTexts.skip : "Skip"}}</button>
</div>
<div class="actions right">
<button id="lib-ngy-tutorial-next-btn" *ngIf="(stepNumber !== totalSteps - 1) && (!step.options.disableNext || overrideButtonDisable)" class="ngy-tutorial-next-btn"
(click)="nextStep()" [ngClass]="appliedClasses.nextBtn"><i [ngClass]="appliedClasses.nextIcon" *ngIf="appliedClasses.nextIcon"></i>
{{appliedTexts.next ? appliedTexts.next : "Next"}}</button>
<button id="lib-ngy-tutorial-finish-btn" *ngIf="(stepNumber === totalSteps - 1) && (!step.options.disableNext || overrideButtonDisable)"
class="ngy-tutorial-finish-btn" (click)="finishTutorial()" [ngClass]="appliedClasses.finishBtn"><i [ngClass]="appliedClasses.finishIcon"
*ngIf="appliedClasses.finishIcon"></i>
{{appliedTexts.finish ? appliedTexts.finish : "Finish"}}</button>
</div>
</div>
</div>`,
styles: [`.prompt-container{max-width:40vw;border-radius:3px;padding:10px;background:#222;box-shadow:0 0 6px rgba(0,0,0,.6);display:flex;flex-direction:column;align-items:center;justify-content:center;position:relative}@media screen and (max-width:768px){.prompt-container{max-width:95vw}}@media screen and (max-width:992px) and (min-width:768px){.prompt-container{max-width:85vw}}.prompt-container .title{margin-bottom:10px}.prompt-container .prompt{text-align:center}.prompt-container .action-container{margin-top:10px;display:flex;width:100%;flex-direction:row}.prompt-container .action-container .actions{width:100%;display:flex;padding:10px}.prompt-container .action-container .actions.left{align-items:flex-start}.prompt-container .action-container .actions.right{justify-content:flex-end}.smooth-2{transition:.2s cubic-bezier(.645,.045,.355,1)}`]
},] },
];
PromptComponent.ctorParameters = () => [
{ type: NgyTutorialService },
{ type: DomSanitizer },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
{ type: undefined, decorators: [{ type: Inject, args: ['ngy-tutorial-options',] }] }
];
PromptComponent.propDecorators = {
stepNumber: [{ type: Input }],
totalSteps: [{ type: Input }],
step: [{ type: Input }],
prompt: [{ type: ViewChild, args: ['prompt',] }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
class NgyTutorialComponent {
/**
* @param {?} svc
* @param {?} document
*/
constructor(svc, document) {
this.svc = svc;
this.document = document;
this.enabled = false;
this.steps = [];
this.currentStep = 0;
this.svc.toShow.subscribe(stps => {
this.steps = stps;
this.currentStep = 0;
if (this.steps.length) {
this.enabled = true;
setTimeout(() => {
this.setupUIForStep();
});
}
else {
this.enabled = false;
}
});
this.svc.currentStep.subscribe(step => {
this.currentStep = step;
if (this.currentStep >= this.steps.length || this.currentStep < 0) {
this.svc.hideTutorial();
}
if (this.enabled) {
setTimeout(() => {
this.setupUIForStep();
});
}
});
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @private
* @return {?}
*/
setupUIForStep() {
/** @type {?} */
const step = this.steps[this.currentStep];
if (step) {
this.resetCovers();
this.prompt.ngOnInit();
if (!step.options.relatedElement) {
this.coverAll();
}
else {
/** @type {?} */
const elem = this.document.body.querySelector(`#${step.options.relatedElement}`);
if (elem) {
this.coverShowElement(elem);
this.prompt.setPromptForElement(elem, step.options.placement);
if (step.options.disableInteraction) {
this.coverElement(elem);
}
}
else {
this.coverAll();
}
}
}
}
/**
* @private
* @param {?} element
* @return {?}
*/
coverElement(element) {
/** @type {?} */
const positionInfo = element.getBoundingClientRect();
/** @type {?} */
const margin = 10;
this.setPosition(this.elementCover.nativeElement, positionInfo.left - margin, positionInfo.top - margin, positionInfo.width + 2 * margin, positionInfo.height + 2 * margin);
}
/**
* @private
* @return {?}
*/
coverAll() {
if (this.topCover) {
this.topCover.nativeElement.style.left = '0';
this.topCover.nativeElement.style.top = '0';
this.topCover.nativeElement.style.height = '100vh';
this.prompt.setPromptForElement();
}
}
/**
* @private
* @param {?} element
* @return {?}
*/
coverShowElement(element) {
/** @type {?} */
const positionInfo = element.getBoundingClientRect();
/** @type {?} */
const margin = 10;
/** @type {?} */
const viewW = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
/** @type {?} */
const viewH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
this.setPosition(this.topCover.nativeElement, 0, 0, viewW, positionInfo.top - margin);
this.setPosition(this.leftCover.nativeElement, 0, positionInfo.top - margin, positionInfo.left - margin, positionInfo.height + 2 * margin);
this.setPosition(this.rightCover.nativeElement, positionInfo.left + positionInfo.width + margin, positionInfo.top - margin, viewW - positionInfo.left - positionInfo.width - margin, positionInfo.height + 2 * margin);
this.setPosition(this.bottomCover.nativeElement, 0, positionInfo.top + positionInfo.height + margin, viewW, viewH - positionInfo.top - positionInfo.height - margin);
}
/**
* @private
* @param {?} element
* @param {?} left
* @param {?} top
* @param {?} width
* @param {?} height
* @return {?}
*/
setPosition(element, left, top, width, height) {
element.style.left = `${left}px`;
element.style.top = `${top}px`;
element.style.width = `${width}px`;
element.style.height = `${height}px`;
}
/**
* @private
* @return {?}
*/
resetCovers() {
if (this.topCover) {
this.topCover.nativeElement.style.removeProperty('height');
this.topCover.nativeElement.style.removeProperty('width');
this.topCover.nativeElement.style.removeProperty('top');
this.topCover.nativeElement.style.removeProperty('left');
}
if (this.leftCover) {
this.leftCover.nativeElement.style.removeProperty('height');
this.leftCover.nativeElement.style.removeProperty('width');
this.leftCover.nativeElement.style.removeProperty('top');
this.leftCover.nativeElement.style.removeProperty('left');
}
if (this.rightCover) {
this.rightCover.nativeElement.style.removeProperty('height');
this.rightCover.nativeElement.style.removeProperty('width');
this.rightCover.nativeElement.style.removeProperty('top');
this.rightCover.nativeElement.style.removeProperty('left');
}
if (this.bottomCover) {
this.bottomCover.nativeElement.style.removeProperty('height');
this.bottomCover.nativeElement.style.removeProperty('width');
this.bottomCover.nativeElement.style.removeProperty('top');
this.bottomCover.nativeElement.style.removeProperty('left');
}
if (this.elementCover) {
this.elementCover.nativeElement.style.removeProperty('height');
this.elementCover.nativeElement.style.removeProperty('width');
this.elementCover.nativeElement.style.removeProperty('top');
this.elementCover.nativeElement.style.removeProperty('left');
}
}
}
NgyTutorialComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-ngy-tutorial',
template: `<lib-ngy-tutorial-prompt *ngIf="enabled" @fadeAnimation [step]="steps[currentStep]" [stepNumber]="currentStep" [totalSteps]="steps.length" #prompt></lib-ngy-tutorial-prompt>
<div class="window-cover full-width" #topCover *ngIf="enabled" @fadeAnimation>
</div>
<div class="window-cover" #leftCover *ngIf="enabled" @fadeAnimation>
</div>
<div class="window-cover" #rightCover *ngIf="enabled" @fadeAnimation>
</div>
<div class="window-cover full-width" #bottomCover *ngIf="enabled" @fadeAnimation>
</div>
<div class="element-cover" #elementCover>
</div>`,
styles: [`:host{position:fixed;left:0;top:0;width:0;height:0}.window-cover{position:fixed;background:rgba(0,0,0,.8);z-index:998}.window-cover.full-width{width:100vw}.element-cover{position:fixed;z-index:998}lib-ngy-tutorial-prompt{top:0;left:0;position:fixed;z-index:999}`],
animations: [
trigger('fadeAnimation', [
transition('void => *', [
query(':self', animate('0.3s ease-in-out', keyframes([
style({ opacity: 0 }),
style({ opacity: 1 }),
])), { optional: true }),
]),
transition('* => void', [
query(':self', animate('0.3s ease-in-out', keyframes([
style({ opacity: 1 }),
style({ opacity: 0 }),
])), { optional: true }),
]),
]),
]
},] },
];
NgyTutorialComponent.ctorParameters = () => [
{ type: NgyTutorialService },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
NgyTutorialComponent.propDecorators = {
topCover: [{ type: ViewChild, args: ['topCover',] }],
leftCover: [{ type: ViewChild, args: ['leftCover',] }],
rightCover: [{ type: ViewChild, args: ['rightCover',] }],
bottomCover: [{ type: ViewChild, args: ['bottomCover',] }],
elementCover: [{ type: ViewChild, args: ['elementCover',] }],
prompt: [{ type: ViewChild, args: ['prompt',] }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
class NgyTutorialModule {
/**
* @param {?=} options
* @return {?}
*/
static forRoot(options = {}) {
return {
ngModule: NgyTutorialModule,
providers: [
NgyTutorialService,
{
provide: 'ngy-tutorial-options',
useValue: options
}
]
};
}
}
NgyTutorialModule.decorators = [
{ type: NgModule, args: [{
imports: [
CommonModule,
BrowserAnimationsModule
],
declarations: [NgyTutorialComponent, PromptComponent],
exports: [NgyTutorialComponent]
},] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
export { NgyTutorialService, NgyTutorialModule, StepPromptPlacement, PromptComponent as ɵb, NgyTutorialComponent as ɵa };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd5LXR1dG9yaWFsLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9uZ3ktdHV0b3JpYWwvbGliL2FwaS9pLW9wdGlvbnMudHMiLCJuZzovL25neS10dXRvcmlhbC9saWIvbmd5LXR1dG9yaWFsLnNlcnZpY2UudHMiLCJuZzovL25neS10dXRvcmlhbC9saWIvcHJvbXB0L3Byb21wdC5jb21wb25lbnQudHMiLCJuZzovL25neS10dXRvcmlhbC9saWIvdHV0b3JpYWwvdHV0b3JpYWwuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3ktdHV0b3JpYWwvbGliL25neS10dXRvcmlhbC5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJSW5pdGlhbGl6YXRpb25PcHRpb25zIHtcclxuICAgIGNsYXNzVG9BZGQ/OiBJU3RlcENsYXNzZXM7XHJcbiAgICBhY3Rpb25UZXh0cz86IElBY3Rpb25UZXh0cztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU3RlcE9wdGlvbiB7XHJcbiAgICBwbGFjZW1lbnQ/OiBTdGVwUHJvbXB0UGxhY2VtZW50O1xyXG4gICAgcmVsYXRlZEVsZW1lbnQ/OiBzdHJpbmc7XHJcbiAgICBkaXNhYmxlSW50ZXJhY3Rpb24/OiBib29sZWFuO1xyXG4gICAgZGlzYWJsZU5leHQ/OiBib29sZWFuO1xyXG4gICAgZGlzYWJsZVByZXZpb3VzPzogYm9vbGVhbjtcclxuICAgIGNsYXNzVG9BZGQ/OiBJU3RlcENsYXNzZXM7XHJcbiAgICBhY3Rpb25UZXh0cz86IElBY3Rpb25UZXh0cztcclxufVxyXG5cclxuZXhwb3J0IGVudW0gU3RlcFByb21wdFBsYWNlbWVudCB7XHJcbiAgICBBYm92ZSxcclxuICAgIEJlbG93LFxyXG4gICAgTGVmdCxcclxuICAgIFJpZ2h0XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVN0ZXBDbGFzc2VzIHtcclxuICAgIGNvbnRhaW5lcj86IHN0cmluZ1tdO1xyXG4gICAgdGl0bGU/OiBzdHJpbmdbXTtcclxuICAgIHByb21wdD86IHN0cmluZ1tdO1xyXG4gICAgcHJldmlvdXNCdG4/OiBzdHJpbmdbXTtcclxuICAgIHByZXZpb3VzSWNvbj86IHN0cmluZztcclxuICAgIG5leHRCdG4/OiBzdHJpbmdbXTtcclxuICAgIG5leHRJY29uPzogc3RyaW5nO1xyXG4gICAgc2tpcEJ0bj86IHN0cmluZ1tdO1xyXG4gICAgc2tpcEljb24/OiBzdHJpbmc7XHJcbiAgICBmaW5pc2hCdG4/OiBzdHJpbmdbXTtcclxuICAgIGZpbmlzaEljb24/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGlvblRleHRzIHtcclxuICAgIG5leHQ/OiBzdHJpbmc7XHJcbiAgICBwcmV2aW91cz86IHN0cmluZztcclxuICAgIHNraXA/OiBzdHJpbmc7XHJcbiAgICBmaW5pc2g/OiBzdHJpbmc7XHJcbn1cclxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJU3RlcE9wdGlvbiwgU3RlcFByb21wdFBsYWNlbWVudCB9IGZyb20gJy4vYXBpL2ktb3B0aW9ucyc7XG5pbXBvcnQgeyBJVHV0b3JpYWxTdGVwIH0gZnJvbSAnLi9hcGkvaS10dXRvcmlhbC1zdGVwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBOZ3lUdXRvcmlhbFNlcnZpY2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgdG9TaG93OiBFdmVudEVtaXR0ZXI8SVR1dG9yaWFsU3RlcFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVR1dG9yaWFsU3RlcFtdPigpO1xuICBwdWJsaWMgcmVhZG9ubHkgdHV0b3JpYWxJblByb2dyZXNzOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gbmV3IE9ic2VydmFibGU8Ym9vbGVhbj4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGN1cnJlbnRTdGVwOiBPYnNlcnZhYmxlPG51bWJlcj4gPSBuZXcgT2JzZXJ2YWJsZTxudW1iZXI+KCk7XG4gIHByaXZhdGUgc3RlcHM6IFR1dG9yaWFsU3RlcFtdO1xuICBwcml2YXRlIF90dXRvcmlhbEluUHJvZ3Jlc3MgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBfY3VycmVudFN0ZXAgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudHV0b3JpYWxJblByb2dyZXNzID0gdGhpcy5fdHV0b3JpYWxJblByb2dyZXNzLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuY3VycmVudFN0ZXAgPSB0aGlzLl9jdXJyZW50U3RlcC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnN0ZXBzID0gW1xuICAgIF07XG4gIH1cbiAgcHVibGljIHNob3dUdXRvcmlhbCgpIHtcbiAgICB0aGlzLl9jdXJyZW50U3RlcC5uZXh0KDApO1xuICAgIHRoaXMudG9TaG93LmVtaXQodGhpcy5zdGVwcy5zbGljZSgpKTtcbiAgICB0aGlzLl90dXRvcmlhbEluUHJvZ3Jlc3MubmV4dCh0cnVlKTtcbiAgfVxuICBwdWJsaWMgaGlkZVR1dG9yaWFsKCkge1xuICAgIHRoaXMudG9TaG93LmVtaXQoW10pO1xuICAgIHRoaXMuX3R1dG9yaWFsSW5Qcm9ncmVzcy5uZXh0KGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgYWRkU3RlcCh0aXRsZTogc3RyaW5nLCBwcm9tcHQ6IHN0cmluZywgb3B0aW9uPzogSVN0ZXBPcHRpb24pIHtcbiAgICBpZiAob3B0aW9uICYmIG9wdGlvbi5kaXNhYmxlTmV4dCAmJiBvcHRpb24uZGlzYWJsZUludGVyYWN0aW9uKSB7XG4gICAgICBjb25zb2xlLndhcm4oYG5neS10dXRvcmlhbCBlcnJvciwgc3RlcCAke3RpdGxlfSAtICR7cHJvbXB0fSBoYXMgZGlzYWJsZU5leHQgYW5kIGRpc2FibGVJbnRlcmFjdGlvbiBzZXQgdG8gdHJ1ZS5cbiAgICAgIFRoaXMgc3RlcCB3aWxsIGNhdXNlIHR1dG9yaWFsIHRvIGJlIHVuYWJsZSB0byBwcm9ncmVzcyBmb3J3YXJkIGFzIHN1Y2ggaXMgbm90IGFkZGVkIHRvIHRoZSB0dXRvcmlhbGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0ZXBzLnB1c2gobmV3IFR1dG9yaWFsU3RlcCh0aXRsZSwgcHJvbXB0LCBvcHRpb24pKTtcbiAgfVxuICBwdWJsaWMgcmVtb3ZlU3RlcChzdGVwTnVtYmVyOiBudW1iZXIpIHtcbiAgICBpZiAoc3RlcE51bWJlciA+IHRoaXMuc3RlcHMubGVuZ3RoIC0gMSB8fCBzdGVwTnVtYmVyIDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0ZXBzLnNwbGljZShzdGVwTnVtYmVyLCAxKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIG5leHRTdGVwKCkge1xuICAgIHRoaXMuX2N1cnJlbnRTdGVwLm5leHQodGhpcy5fY3VycmVudFN0ZXAudmFsdWUgKyAxKTtcbiAgfVxuICBwdWJsaWMgcHJldmlvdXNTdGVwKCkge1xuICAgIHRoaXMuX2N1cnJlbnRTdGVwLm5leHQodGhpcy5fY3VycmVudFN0ZXAudmFsdWUgLSAxKTtcbiAgfVxufVxuXG5jbGFzcyBUdXRvcmlhbFN0ZXAgaW1wbGVtZW50cyBJVHV0b3JpYWxTdGVwIHtcbiAgcHJpdmF0ZSBzdGF0aWMgREVGQVVMVF9PUFRJT05TOiBJU3RlcE9wdGlvbiA9IHtcbiAgICBwbGFjZW1lbnQ6IFN0ZXBQcm9tcHRQbGFjZW1lbnQuQmVsb3dcbiAgfTtcbiAgb3B0aW9uczogSVN0ZXBPcHRpb247XG4gIHByb21wdDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0aXRsZTogc3RyaW5nLCBwcm9tcHQ6IHN0cmluZywgb3B0aW9uOiBJU3RlcE9wdGlvbikge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLlR1dG9yaWFsU3RlcC5ERUZBVUxUX09QVElPTlMsXG4gICAgICAuLi5vcHRpb25cbiAgICB9O1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAgICB0aGlzLnByb21wdCA9IHByb21wdDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJVHV0b3JpYWxTdGVwIH0gZnJvbSAnLi4vYXBpL2ktdHV0b3JpYWwtc3RlcCc7XHJcbmltcG9ydCB7IFN0ZXBQcm9tcHRQbGFjZW1lbnQsIElJbml0aWFsaXphdGlvbk9wdGlvbnMsIElTdGVwQ2xhc3NlcywgSUFjdGlvblRleHRzIH0gZnJvbSAnLi4vYXBpL2ktb3B0aW9ucyc7XHJcbmltcG9ydCB7IE5neVR1dG9yaWFsU2VydmljZSB9IGZyb20gJy4uL25neS10dXRvcmlhbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1uZ3ktdHV0b3JpYWwtcHJvbXB0JyxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwcm9tcHQtY29udGFpbmVyIHNtb290aC0yIG5neS10dXRvcmlhbC1wcm9tcHQtY29udGFpbmVyXCIgW25nQ2xhc3NdPVwiYXBwbGllZENsYXNzZXMuY29udGFpbmVyXCIgKm5nSWY9XCJzdGVwXCJcclxuICAjcHJvbXB0PlxyXG4gIDxoMiBjbGFzcz1cInRpdGxlIG5neS10dXRvcmlhbC10aXRsZVwiIFtuZ0NsYXNzXT1cImFwcGxpZWRDbGFzc2VzLnRpdGxlXCIgKm5nSWY9XCJzdGVwLnRpdGxlXCIgW2lubmVySFRNTF09XCJ0aXRsZVNhZmVcIj48L2gyPlxyXG4gIDxwIGNsYXNzPVwicHJvbXB0IG5neS10dXRvcmlhbC1wcm9tcHRcIiBbbmdDbGFzc109XCJhcHBsaWVkQ2xhc3Nlcy5wcm9tcHRcIiAqbmdJZj1cInN0ZXAucHJvbXB0XCIgW2lubmVySFRNTF09XCJwcm9tcHRTYWZlXCI+PC9wPlxyXG4gIDxkaXYgY2xhc3M9XCJhY3Rpb24tY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucyBsZWZ0XCI+XHJcbiAgICAgIDxidXR0b24gaWQ9XCJsaWItbmd5LXR1dG9yaWFsLXByZXZpb3VzLWJ0blwiICpuZ0lmPVwiKHN0ZXBOdW1iZXIgIT09IDApICYmICghc3RlcC5vcHRpb25zLmRpc2FibGVQcmV2aW91cyB8fCBvdmVycmlkZUJ1dHRvbkRpc2FibGUpXCIgY2xhc3M9XCJuZ3ktdHV0b3JpYWwtcHJldmlvdXMtYnRuXCJcclxuICAgICAgICAoY2xpY2spPVwicHJldmlvdXNTdGVwKClcIiBbbmdDbGFzc109XCJhcHBsaWVkQ2xhc3Nlcy5wcmV2aW91c0J0blwiPjxpIFtuZ0NsYXNzXT1cImFwcGxpZWRDbGFzc2VzLnByZXZpb3VzSWNvblwiXHJcbiAgICAgICAgICAqbmdJZj1cImFwcGxpZWRDbGFzc2VzLnByZXZpb3VzSWNvblwiPjwvaT4ge3thcHBsaWVkVGV4dHMucHJldmlvdXMgPyBhcHBsaWVkVGV4dHMucHJldmlvdXMgOiBcIlByZXZpb3VzXCJ9fTwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIGlkPVwibGliLW5neS10dXRvcmlhbC1za2lwLWJ0blwiIFtuZ0NsYXNzXT1cImFwcGxpZWRDbGFzc2VzLnNraXBCdG5cIiAqbmdJZj1cInN0ZXBOdW1iZXI9PT0wXCIgY2xhc3M9XCJuZ3ktdHV0b3JpYWwtc2tpcC1idG5cIlxyXG4gICAgICAgIChjbGljayk9XCJmaW5pc2hUdXRvcmlhbCgpXCI+PGkgW25nQ2xhc3NdPVwiYXBwbGllZENsYXNzZXMuc2tpcEljb25cIiAqbmdJZj1cImFwcGxpZWRDbGFzc2VzLnNraXBJY29uXCI+PC9pPlxyXG4gICAgICAgIHt7YXBwbGllZFRleHRzLnNraXAgPyBhcHBsaWVkVGV4dHMuc2tpcCA6IFwiU2tpcFwifX08L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbnMgcmlnaHRcIj5cclxuICAgICAgPGJ1dHRvbiBpZD1cImxpYi1uZ3ktdHV0b3JpYWwtbmV4dC1idG5cIiAqbmdJZj1cIihzdGVwTnVtYmVyICE9PSB0b3RhbFN0ZXBzIC0gMSkgJiYgKCFzdGVwLm9wdGlvbnMuZGlzYWJsZU5leHQgfHwgb3ZlcnJpZGVCdXR0b25EaXNhYmxlKVwiIGNsYXNzPVwibmd5LXR1dG9yaWFsLW5leHQtYnRuXCJcclxuICAgICAgICAoY2xpY2spPVwibmV4dFN0ZXAoKVwiIFtuZ0NsYXNzXT1cImFwcGxpZWRDbGFzc2VzLm5leHRCdG5cIj48aSBbbmdDbGFzc109XCJhcHBsaWVkQ2xhc3Nlcy5uZXh0SWNvblwiICpuZ0lmPVwiYXBwbGllZENsYXNzZXMubmV4dEljb25cIj48L2k+XHJcbiAgICAgICAge3thcHBsaWVkVGV4dHMubmV4dCA/IGFwcGxpZWRUZXh0cy5uZXh0IDogXCJOZXh0XCJ9fTwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIGlkPVwibGliLW5neS10dXRvcmlhbC1maW5pc2gtYnRuXCIgKm5nSWY9XCIoc3RlcE51bWJlciA9PT0gdG90YWxTdGVwcyAtIDEpICYmICghc3RlcC5vcHRpb25zLmRpc2FibGVOZXh0IHx8IG92ZXJyaWRlQnV0dG9uRGlzYWJsZSlcIlxyXG4gICAgICAgIGNsYXNzPVwibmd5LXR1dG9yaWFsLWZpbmlzaC1idG5cIiAoY2xpY2spPVwiZmluaXNoVHV0b3JpYWwoKVwiIFtuZ0NsYXNzXT1cImFwcGxpZWRDbGFzc2VzLmZpbmlzaEJ0blwiPjxpIFtuZ0NsYXNzXT1cImFwcGxpZWRDbGFzc2VzLmZpbmlzaEljb25cIlxyXG4gICAgICAgICAgKm5nSWY9XCJhcHBsaWVkQ2xhc3Nlcy5maW5pc2hJY29uXCI+PC9pPlxyXG4gICAgICAgIHt7YXBwbGllZFRleHRzLmZpbmlzaCA/IGFwcGxpZWRUZXh0cy5maW5pc2ggOiBcIkZpbmlzaFwifX08L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5gLFxyXG4gIHN0eWxlczogW2AucHJvbXB0LWNvbnRhaW5lcnttYXgtd2lkdGg6NDB2dztib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjEwcHg7YmFja2dyb3VuZDojMjIyO2JveC1zaGFkb3c6MCAwIDZweCByZ2JhKDAsMCwwLC42KTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3Bvc2l0aW9uOnJlbGF0aXZlfUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY4cHgpey5wcm9tcHQtY29udGFpbmVye21heC13aWR0aDo5NXZ3fX1AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjk5MnB4KSBhbmQgKG1pbi13aWR0aDo3NjhweCl7LnByb21wdC1jb250YWluZXJ7bWF4LXdpZHRoOjg1dnd9fS5wcm9tcHQtY29udGFpbmVyIC50aXRsZXttYXJnaW4tYm90dG9tOjEwcHh9LnByb21wdC1jb250YWluZXIgLnByb21wdHt0ZXh0LWFsaWduOmNlbnRlcn0ucHJvbXB0LWNvbnRhaW5lciAuYWN0aW9uLWNvbnRhaW5lcnttYXJnaW4tdG9wOjEwcHg7ZGlzcGxheTpmbGV4O3dpZHRoOjEwMCU7ZmxleC1kaXJlY3Rpb246cm93fS5wcm9tcHQtY29udGFpbmVyIC5hY3Rpb24tY29udGFpbmVyIC5hY3Rpb25ze3dpZHRoOjEwMCU7ZGlzcGxheTpmbGV4O3BhZGRpbmc6MTBweH0ucHJvbXB0LWNvbnRhaW5lciAuYWN0aW9uLWNvbnRhaW5lciAuYWN0aW9ucy5sZWZ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnR9LnByb21wdC1jb250YWluZXIgLmFjdGlvbi1jb250YWluZXIgLmFjdGlvbnMucmlnaHR7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5zbW9vdGgtMnt0cmFuc2l0aW9uOi4ycyBjdWJpYy1iZXppZXIoLjY0NSwuMDQ1LC4zNTUsMSl9YF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFByb21wdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXIgPSAwO1xyXG4gIEBJbnB1dCgpIHRvdGFsU3RlcHMgPSAwO1xyXG4gIEBJbnB1dCgpIHN0ZXA6IElUdXRvcmlhbFN0ZXA7XHJcbiAgQFZpZXdDaGlsZCgncHJvbXB0JykgcHJvbXB0OiBFbGVtZW50UmVmO1xyXG4gIGFwcGxpZWRDbGFzc2VzOiBJU3RlcENsYXNzZXM7XHJcbiAgYXBwbGllZFRleHRzOiBJQWN0aW9uVGV4dHM7XHJcbiAgdGl0bGVTYWZlOiBTYWZlSHRtbDtcclxuICBwcm9tcHRTYWZlOiBTYWZlSHRtbDtcclxuICBvdmVycmlkZUJ1dHRvbkRpc2FibGUgPSBmYWxzZTtcclxuICBwcml2YXRlIG1hcmdpbiA9IDEwO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzdmM6IE5neVR1dG9yaWFsU2VydmljZSxcclxuICAgIHByaXZhdGUgc2FuaTogRG9tU2FuaXRpemVyLFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogYW55LFxyXG4gICAgQEluamVjdCgnbmd5LXR1dG9yaWFsLW9wdGlvbnMnKSBwcml2YXRlIG9wdGlvbnM6IElJbml0aWFsaXphdGlvbk9wdGlvbnNcclxuICApIHtcclxuICAgIHRoaXMuYXBwbGllZENsYXNzZXMgPSB7fTtcclxuICAgIHRoaXMuYXBwbGllZFRleHRzID0ge307XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuYXBwbGllZENsYXNzZXMgPSB7fTtcclxuICAgIHRoaXMuYXBwbGllZFRleHRzID0ge307XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmNsYXNzVG9BZGQpIHtcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5jb250YWluZXIgPSB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5jb250YWluZXIgPyB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5jb250YWluZXIgOiBbXTtcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy50aXRsZSA9IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLnRpdGxlID8gdGhpcy5vcHRpb25zLmNsYXNzVG9BZGQudGl0bGUgOiBbXTtcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5wcm9tcHQgPSB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5wcm9tcHQgPyB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5wcm9tcHQgOiBbXTtcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5uZXh0QnRuID0gdGhpcy5vcHRpb25zLmNsYXNzVG9BZGQubmV4dEJ0biA/IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLm5leHRCdG4gOiBbXTtcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5wcmV2aW91c0J0biA9IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLnByZXZpb3VzQnRuID8gdGhpcy5vcHRpb25zLmNsYXNzVG9BZGQucHJldmlvdXNCdG4gOiBbXTtcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5maW5pc2hCdG4gPSB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5maW5pc2hCdG4gPyB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5maW5pc2hCdG4gOiBbXTtcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5za2lwQnRuID0gdGhpcy5vcHRpb25zLmNsYXNzVG9BZGQuc2tpcEJ0biA/IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLnNraXBCdG4gOiBbXTtcclxuXHJcbiAgICAgIHRoaXMuYXBwbGllZENsYXNzZXMubmV4dEljb24gPSB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5uZXh0SWNvbiA/IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLm5leHRJY29uIDogJyc7XHJcbiAgICAgIHRoaXMuYXBwbGllZENsYXNzZXMucHJldmlvdXNJY29uID0gdGhpcy5vcHRpb25zLmNsYXNzVG9BZGQucHJldmlvdXNJY29uID8gdGhpcy5vcHRpb25zLmNsYXNzVG9BZGQucHJldmlvdXNJY29uIDogJyc7XHJcbiAgICAgIHRoaXMuYXBwbGllZENsYXNzZXMuZmluaXNoSWNvbiA9IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLmZpbmlzaEljb24gPyB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5maW5pc2hJY29uIDogJyc7XHJcbiAgICAgIHRoaXMuYXBwbGllZENsYXNzZXMuc2tpcEljb24gPSB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5za2lwSWNvbiA/IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLnNraXBJY29uIDogJyc7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zdGVwLm9wdGlvbnMgJiYgdGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZCkge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIHRoaXMuYXBwbGllZENsYXNzZXMuY29udGFpbmVyID0gdGhpcy5hcHBsaWVkQ2xhc3Nlcy5jb250YWluZXIuY29uY2F0KHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQuY29udGFpbmVyID8gdGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZC5jb250YWluZXIgOiBbXSk7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy50aXRsZSA9IHRoaXMuYXBwbGllZENsYXNzZXMudGl0bGUuY29uY2F0KHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQudGl0bGUgPyB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLnRpdGxlIDogW10pO1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIHRoaXMuYXBwbGllZENsYXNzZXMucHJvbXB0ID0gdGhpcy5hcHBsaWVkQ2xhc3Nlcy5wcm9tcHQuY29uY2F0KHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQucHJvbXB0ID8gdGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZC5wcm9tcHQgOiBbXSk7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5uZXh0QnRuID0gdGhpcy5hcHBsaWVkQ2xhc3Nlcy5uZXh0QnRuLmNvbmNhdCh0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLm5leHRCdG4gPyB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLm5leHRCdG4gOiBbXSk7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5wcmV2aW91c0J0biA9IHRoaXMuYXBwbGllZENsYXNzZXMucHJldmlvdXNCdG4uY29uY2F0KHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQucHJldmlvdXNCdG4gPyB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLnByZXZpb3VzQnRuIDogW10pO1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIHRoaXMuYXBwbGllZENsYXNzZXMuZmluaXNoQnRuID0gdGhpcy5hcHBsaWVkQ2xhc3Nlcy5maW5pc2hCdG4uY29uY2F0KHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQuZmluaXNoQnRuID8gdGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZC5maW5pc2hCdG4gOiBbXSk7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5za2lwQnRuID0gdGhpcy5hcHBsaWVkQ2xhc3Nlcy5za2lwQnRuLmNvbmNhdCh0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLnNraXBCdG4gPyB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLnNraXBCdG4gOiBbXSk7XHJcblxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIHRoaXMuYXBwbGllZENsYXNzZXMubmV4dEljb24gPSB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLm5leHRJY29uID8gdGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZC5uZXh0SWNvbiA6IHRoaXMuYXBwbGllZENsYXNzZXMubmV4dEljb247XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5wcmV2aW91c0ljb24gPSB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLnByZXZpb3VzSWNvbiA/IHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQucHJldmlvdXNJY29uIDogdGhpcy5hcHBsaWVkQ2xhc3Nlcy5wcmV2aW91c0ljb247XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5maW5pc2hJY29uID0gdGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZC5maW5pc2hJY29uID8gdGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZC5maW5pc2hJY29uIDogdGhpcy5hcHBsaWVkQ2xhc3Nlcy5maW5pc2hJY29uO1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIHRoaXMuYXBwbGllZENsYXNzZXMuc2tpcEljb24gPSB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLnNraXBJY29uID8gdGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZC5za2lwSWNvbiA6IHRoaXMuYXBwbGllZENsYXNzZXMuc2tpcEljb247XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmFjdGlvblRleHRzKSB7XHJcbiAgICAgIHRoaXMuYXBwbGllZFRleHRzID0ge1xyXG4gICAgICAgIC4uLnRoaXMub3B0aW9ucy5hY3Rpb25UZXh0c1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc3RlcC5vcHRpb25zICYmIHRoaXMuc3RlcC5vcHRpb25zLmFjdGlvblRleHRzKSB7XHJcbiAgICAgIHRoaXMuYXBwbGllZFRleHRzID0ge1xyXG4gICAgICAgIC4uLnRoaXMuYXBwbGllZFRleHRzLFxyXG4gICAgICAgIC4uLnRoaXMuc3RlcC5vcHRpb25zLmFjdGlvblRleHRzXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zdGVwLnRpdGxlKSB7XHJcbiAgICAgIHRoaXMudGl0bGVTYWZlID0gdGhpcy5zYW5pLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHRoaXMuc3RlcC50aXRsZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zdGVwLnByb21wdCkge1xyXG4gICAgICB0aGlzLnByb21wdFNhZmUgPSB0aGlzLnNhbmkuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5zdGVwLnByb21wdCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGZpbmlzaFR1dG9yaWFsKCkge1xyXG4gICAgdGhpcy5zdmMuaGlkZVR1dG9yaWFsKCk7XHJcbiAgfVxyXG4gIG5leHRTdGVwKCkge1xyXG4gICAgdGhpcy5zdmMubmV4dFN0ZXAoKTtcclxuICB9XHJcbiAgcHJldmlvdXNTdGVwKCkge1xyXG4gICAgdGhpcy5zdmMucHJldmlvdXNTdGVwKCk7XHJcbiAgfVxyXG4gIHNldFByb21wdEZvckVsZW1lbnQoZWxlbT86IGFueSwgcGxhY2VtZW50PzogU3RlcFByb21wdFBsYWNlbWVudCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHByb21wdFBvc2l0aW9uSW5mbyA9IHRoaXMucHJvbXB0Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGNvbnN0IHZpZXdXID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcclxuICAgICAgY29uc3Qgdmlld0ggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XHJcbiAgICAgIGNvbnN0IHByb21wdEggPSBwcm9tcHRQb3NpdGlvbkluZm8uaGVpZ2h0O1xyXG4gICAgICBjb25zdCBwcm9tcHRXID0gcHJvbXB0UG9zaXRpb25JbmZvLndpZHRoO1xyXG4gICAgICBpZiAoIWVsZW0gfHwgcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLnNldFByb21wdFBvc2l0aW9uKHZpZXdXIC8gMiAtIHByb21wdFcgLyAyLCB2aWV3SCAvIDIgLSBwcm9tcHRIIC8gMik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25JbmZvID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBpZiAocGxhY2VtZW50ID09PSBTdGVwUHJvbXB0UGxhY2VtZW50LlJpZ2h0KSB7XHJcbiAgICAgICAgICB0aGlzLnNldFByb21wdFBvc2l0aW9uKFxyXG4gICAgICAgICAgICBwb3NpdGlvbkluZm8ubGVmdCArIHBvc2l0aW9uSW5mby53aWR0aCArIDIgKiB0aGlzLm1hcmdpbixcclxuICAgICAgICAgICAgcG9zaXRpb25JbmZvLnRvcCArIHBvc2l0aW9uSW5mby5oZWlnaHQgLyAyIC0gcHJvbXB0SCAvIDIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSBTdGVwUHJvbXB0UGxhY2VtZW50LkxlZnQpIHtcclxuICAgICAgICAgIHRoaXMuc2V0UHJvbXB0UG9zaXRpb24oXHJcbiAgICAgICAgICAgIHBvc2l0aW9uSW5mby5sZWZ0IC0gcHJvbXB0VyAtIDIgKiB0aGlzLm1hcmdpbixcclxuICAgICAgICAgICAgcG9zaXRpb25JbmZvLnRvcCArIHBvc2l0aW9uSW5mby5oZWlnaHQgLyAyIC0gcHJvbXB0SCAvIDIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSBTdGVwUHJvbXB0UGxhY2VtZW50LkFib3ZlKSB7XHJcbiAgICAgICAgICB0aGlzLnNldFByb21wdFBvc2l0aW9uKFxyXG4gICAgICAgICAgICBwb3NpdGlvbkluZm8ubGVmdCArIHBvc2l0aW9uSW5mby53aWR0aCAvIDIgLSBwcm9tcHRXIC8gMixcclxuICAgICAgICAgICAgcG9zaXRpb25JbmZvLnRvcCAtIDIgKiB0aGlzLm1hcmdpbiAtIHByb21wdEhcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2V0UHJvbXB0UG9zaXRpb24oXHJcbiAgICAgICAgICAgIHBvc2l0aW9uSW5mby5sZWZ0ICsgcG9zaXRpb25JbmZvLndpZHRoIC8gMiAtIHByb21wdFcgLyAyLFxyXG4gICAgICAgICAgICBwb3NpdGlvbkluZm8udG9wICsgcG9zaXRpb25JbmZvLmhlaWdodCArIDIgKiB0aGlzLm1hcmdpblxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm92ZXJyaWRlQnV0dG9uRGlzYWJsZSA9IHRoaXMuaXNQcm9tcHRDb3ZlcmluZ0VsZW1lbnQoZWxlbSkgfHwgdGhpcy5pc0VsZW1lbnRPdXRPZlZpZXcoZWxlbSk7XHJcbiAgICAgICAgfSwgMjAwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgc2V0UHJvbXB0UG9zaXRpb24obGVmdDogbnVtYmVyLCB0b3A6IG51bWJlcikge1xyXG4gICAgY29uc3QgcHJvbXB0UG9zaXRpb25JbmZvID0gdGhpcy5wcm9tcHQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHZpZXdXID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcclxuICAgIGNvbnN0IHZpZXdIID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xyXG4gICAgY29uc3QgcHJvbXB0SCA9IHByb21wdFBvc2l0aW9uSW5mby5oZWlnaHQ7XHJcbiAgICBjb25zdCBwcm9tcHRXID0gcHJvbXB0UG9zaXRpb25JbmZvLndpZHRoO1xyXG4gICAgaWYgKGxlZnQgPCB0aGlzLm1hcmdpbikge1xyXG4gICAgICBsZWZ0ID0gdGhpcy5tYXJnaW47XHJcbiAgICB9XHJcbiAgICBpZiAodG9wIDwgdGhpcy5tYXJnaW4pIHtcclxuICAgICAgdG9wID0gdGhpcy5tYXJnaW47XHJcbiAgICB9XHJcbiAgICBpZiAobGVmdCA+IHZpZXdXIC0gcHJvbXB0VyAtIHRoaXMubWFyZ2luKSB7XHJcbiAgICAgIGxlZnQgPSB2aWV3VyAtIHByb21wdFcgLSB0aGlzLm1hcmdpbjtcclxuICAgIH1cclxuICAgIGlmICh0b3AgPiB2aWV3SCAtIHByb21wdEggLSB0aGlzLm1hcmdpbikge1xyXG4gICAgICB0b3AgPSB2aWV3SCAtIHByb21wdEggLSB0aGlzLm1hcmdpbjtcclxuICAgIH1cclxuICAgIHRoaXMucHJvbXB0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgO1xyXG4gICAgdGhpcy5wcm9tcHQubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xyXG4gIH1cclxuICBwcml2YXRlIGlzUHJvbXB0Q292ZXJpbmdFbGVtZW50KGVsZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYoIWVsZW0pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcHJvbXB0UG9zaXRpb25JbmZvID0gdGhpcy5wcm9tcHQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHByb21wdEwgPSBwcm9tcHRQb3NpdGlvbkluZm8ubGVmdDtcclxuICAgIGNvbnN0IHByb21wdFQgPSBwcm9tcHRQb3NpdGlvbkluZm8udG9wO1xyXG4gICAgY29uc3QgcHJvbXB0TFcgPSBwcm9tcHRMICsgcHJvbXB0UG9zaXRpb25JbmZvLndpZHRoO1xyXG4gICAgY29uc3QgcHJvbXB0VEggPSBwcm9tcHRUICsgcHJvbXB0UG9zaXRpb25JbmZvLmhlaWdodDtcclxuICAgIGNvbnN0IHBvc2l0aW9uSW5mbyA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBlbGVtZW50TCA9IHBvc2l0aW9uSW5mby5sZWZ0O1xyXG4gICAgY29uc3QgZWxlbWVudFQgPSBwb3NpdGlvbkluZm8udG9wO1xyXG4gICAgY29uc3QgZWxlbWVudENlbnRlclggPSBlbGVtZW50TCArIHBvc2l0aW9uSW5mby53aWR0aCAvIDI7XHJcbiAgICBjb25zdCBlbGVtZW50Q2VudGVyWSA9IGVsZW1lbnRUICsgcG9zaXRpb25JbmZvLmhlaWdodCAvIDI7XHJcbiAgICBpZihwcm9tcHRUSCA8IGVsZW1lbnRDZW50ZXJZIHx8IHByb21wdFQgPiBlbGVtZW50Q2VudGVyWSB8fCBwcm9tcHRMVyA8IGVsZW1lbnRDZW50ZXJYIHx8IHByb21wdEwgPiBlbGVtZW50Q2VudGVyWCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBpc0VsZW1lbnRPdXRPZlZpZXcoZWxlbTogYW55KTogYm9vbGVhbi