ngx-joyride
Version:
An Angular Tour (Joyride) library built entirely in Angular, without using any heavy external dependencies like Bootstrap or JQuery. From now on you can easily guide your users through your site showing them all the sections and features.
141 lines • 19.8 kB
JavaScript
import { Directive, Input, Output, EventEmitter, Inject, PLATFORM_ID } from '@angular/core';
import { JoyrideStep } from '../models/joyride-step.class';
import { JoyrideError } from '../models/joyride-error.class';
import { isPlatformBrowser } from '@angular/common';
import { Observable } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "../services/joyride-steps-container.service";
import * as i2 from "../services/dom.service";
import * as i3 from "@angular/router";
import * as i4 from "../services/templates.service";
export const NO_POSITION = 'NO_POSITION';
export class JoyrideDirective {
constructor(joyrideStepsContainer, viewContainerRef, domService, router, templateService, platformId) {
this.joyrideStepsContainer = joyrideStepsContainer;
this.viewContainerRef = viewContainerRef;
this.domService = domService;
this.router = router;
this.templateService = templateService;
this.platformId = platformId;
this.stepPosition = NO_POSITION;
this.prev = new EventEmitter();
this.next = new EventEmitter();
this.done = new EventEmitter();
this.subscriptions = [];
this.windowRef = this.domService.getNativeWindow();
this.step = new JoyrideStep();
}
ngAfterViewInit() {
if (!isPlatformBrowser(this.platformId))
return;
if (this.prevTemplate)
this.templateService.setPrevButton(this.prevTemplate);
if (this.nextTemplate)
this.templateService.setNextButton(this.nextTemplate);
if (this.doneTemplate)
this.templateService.setDoneButton(this.doneTemplate);
if (this.counterTemplate)
this.templateService.setCounter(this.counterTemplate);
this.step.position = this.stepPosition;
this.step.targetViewContainer = this.viewContainerRef;
this.setAsyncFields(this.step);
this.step.stepContent = this.stepContent;
this.step.stepContentParams = this.stepContentParams;
this.step.nextClicked = this.next;
this.step.prevCliked = this.prev;
this.step.tourDone = this.done;
if (!this.name)
throw new JoyrideError("All the steps should have the 'joyrideStep' property set with a custom name.");
this.step.name = this.name;
this.step.route = this.router.url.substr(0, 1) === '/' ? this.router.url.substr(1) : this.router.url;
this.step.transformCssStyle = this.windowRef.getComputedStyle(this.viewContainerRef.element.nativeElement).transform;
this.step.isElementOrAncestorFixed =
this.isElementFixed(this.viewContainerRef.element) ||
this.isAncestorsFixed(this.viewContainerRef.element.nativeElement.parentElement);
this.joyrideStepsContainer.addStep(this.step);
}
ngOnChanges(changes) {
if (changes['title'] || changes['text']) {
this.setAsyncFields(this.step);
}
}
isElementFixed(element) {
return this.windowRef.getComputedStyle(element.nativeElement).position === 'fixed';
}
setAsyncFields(step) {
if (this.title instanceof Observable) {
this.subscriptions.push(this.title.subscribe(title => {
step.title.next(title);
}));
}
else {
step.title.next(this.title);
}
if (this.text instanceof Observable) {
this.subscriptions.push(this.text.subscribe(text => {
step.text.next(text);
}));
}
else {
step.text.next(this.text);
}
}
isAncestorsFixed(nativeElement) {
if (!nativeElement || !nativeElement.parentElement)
return false;
let isElementFixed = this.windowRef.getComputedStyle(nativeElement.parentElement).position === 'fixed';
if (nativeElement.nodeName === 'BODY') {
return isElementFixed;
}
if (isElementFixed)
return true;
else
return this.isAncestorsFixed(nativeElement.parentElement);
}
ngOnDestroy() {
this.subscriptions.forEach(sub => {
sub.unsubscribe();
});
}
}
JoyrideDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: JoyrideDirective, deps: [{ token: i1.JoyrideStepsContainerService }, { token: i0.ViewContainerRef }, { token: i2.DomRefService }, { token: i3.Router }, { token: i4.TemplatesService }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Directive });
JoyrideDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: JoyrideDirective, selector: "joyrideStep, [joyrideStep]", inputs: { name: ["joyrideStep", "name"], nextStep: "nextStep", title: "title", text: "text", stepPosition: "stepPosition", stepContent: "stepContent", stepContentParams: "stepContentParams", prevTemplate: "prevTemplate", nextTemplate: "nextTemplate", doneTemplate: "doneTemplate", counterTemplate: "counterTemplate" }, outputs: { prev: "prev", next: "next", done: "done" }, usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: JoyrideDirective, decorators: [{
type: Directive,
args: [{
selector: 'joyrideStep, [joyrideStep]'
}]
}], ctorParameters: function () { return [{ type: i1.JoyrideStepsContainerService }, { type: i0.ViewContainerRef }, { type: i2.DomRefService }, { type: i3.Router }, { type: i4.TemplatesService }, { type: Object, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }]; }, propDecorators: { name: [{
type: Input,
args: ['joyrideStep']
}], nextStep: [{
type: Input
}], title: [{
type: Input
}], text: [{
type: Input
}], stepPosition: [{
type: Input
}], stepContent: [{
type: Input
}], stepContentParams: [{
type: Input
}], prevTemplate: [{
type: Input
}], nextTemplate: [{
type: Input
}], doneTemplate: [{
type: Input
}], counterTemplate: [{
type: Input
}], prev: [{
type: Output
}], next: [{
type: Output
}], done: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam95cmlkZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtam95cmlkZS9zcmMvbGliL2RpcmVjdGl2ZXMvam95cmlkZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFHVCxLQUFLLEVBR0wsTUFBTSxFQUNOLFlBQVksRUFDWixNQUFNLEVBQ04sV0FBVyxFQUlkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7Ozs7OztBQUVoRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDO0FBS3pDLE1BQU0sT0FBTyxnQkFBZ0I7SUErQ3pCLFlBQ3FCLHFCQUFtRCxFQUM1RCxnQkFBa0MsRUFDekIsVUFBeUIsRUFDekIsTUFBYyxFQUNkLGVBQWlDLEVBQ3JCLFVBQWtCO1FBTDlCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBOEI7UUFDNUQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUN6QixlQUFVLEdBQVYsVUFBVSxDQUFlO1FBQ3pCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxvQkFBZSxHQUFmLGVBQWUsQ0FBa0I7UUFDckIsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQXZDbkQsaUJBQVksR0FBWSxXQUFXLENBQUM7UUFxQnBDLFNBQUksR0FBdUIsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUduRCxTQUFJLEdBQXVCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHbkQsU0FBSSxHQUF1QixJQUFJLFlBQVksRUFBTyxDQUFDO1FBSTNDLGtC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LENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUM7UUFDdkcsSUFBSSxhQUFhLENBQUMsUUFBUSxLQUFLLE1BQU0sRUFBRTtZQUNuQyxPQUFPLGNBQWMsQ0FBQztTQUN6QjtRQUNELElBQUksY0FBYztZQUFFLE9BQU8sSUFBSSxDQUFDOztZQUMzQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM3QixHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzs2R0FqSVEsZ0JBQWdCLGlMQXFEYixXQUFXO2lHQXJEZCxnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFINUIsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsNEJBQTRCO2lCQUN6QztvTkFzRGdELE1BQU07MEJBQTlDLE1BQU07MkJBQUMsV0FBVzs0Q0FuRHZCLElBQUk7c0JBREgsS0FBSzt1QkFBQyxhQUFhO2dCQUlwQixRQUFRO3NCQURQLEtBQUs7Z0JBSU4sS0FBSztzQkFESixLQUFLO2dCQUlOLElBQUk7c0JBREgsS0FBSztnQkFJTixZQUFZO3NCQURYLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQUlOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFJTixZQUFZO3NCQURYLEtBQUs7Z0JBSU4sWUFBWTtzQkFEWCxLQUFLO2dCQUlOLFlBQVk7c0JBRFgsS0FBSztnQkFJTixlQUFlO3NCQURkLEtBQUs7Z0JBSU4sSUFBSTtzQkFESCxNQUFNO2dCQUlQLElBQUk7c0JBREgsTUFBTTtnQkFJUCxJQUFJO3NCQURILE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgSW5wdXQsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdCxcbiAgICBQTEFURk9STV9JRCxcbiAgICBPbkNoYW5nZXMsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3lcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBKb3lyaWRlU3RlcCB9IGZyb20gJy4uL21vZGVscy9qb3lyaWRlLXN0ZXAuY2xhc3MnO1xuaW1wb3J0IHsgSm95cmlkZVN0ZXBzQ29udGFpbmVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2pveXJpZGUtc3RlcHMtY29udGFpbmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgSm95cmlkZUVycm9yIH0gZnJvbSAnLi4vbW9kZWxzL2pveXJpZGUtZXJyb3IuY2xhc3MnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IERvbVJlZlNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9kb20uc2VydmljZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBUZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdGVtcGxhdGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBjb25zdCBOT19QT1NJVElPTiA9ICdOT19QT1NJVElPTic7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnam95cmlkZVN0ZXAsIFtqb3lyaWRlU3RlcF0nXG59KVxuZXhwb3J0IGNsYXNzIEpveXJpZGVEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgQElucHV0KCdqb3lyaWRlU3RlcCcpXG4gICAgbmFtZTogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBuZXh0U3RlcD86IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgdGl0bGU/OiBzdHJpbmcgfCBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgICBASW5wdXQoKVxuICAgIHRleHQ/OiBzdHJpbmcgfCBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgICBASW5wdXQoKVxuICAgIHN0ZXBQb3NpdGlvbj86IHN0cmluZyA9IE5PX1BPU0lUSU9OO1xuXG4gICAgQElucHV0KClcbiAgICBzdGVwQ29udGVudD86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBASW5wdXQoKVxuICAgIHN0ZXBDb250ZW50UGFyYW1zPzogT2JqZWN0O1xuXG4gICAgQElucHV0KClcbiAgICBwcmV2VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQElucHV0KClcbiAgICBuZXh0VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQElucHV0KClcbiAgICBkb25lVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQElucHV0KClcbiAgICBjb3VudGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHJldj86IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBuZXh0PzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIGRvbmU/OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgcHJpdmF0ZSB3aW5kb3dSZWY6IFdpbmRvdztcbiAgICBwcml2YXRlIHN0ZXA6IEpveXJpZGVTdGVwO1xuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGpveXJpZGVTdGVwc0NvbnRhaW5lcjogSm95cmlkZVN0ZXBzQ29udGFpbmVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRvbVNlcnZpY2U6IERvbVJlZlNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVTZXJ2aWNlOiBUZW1wbGF0ZXNTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdFxuICAgICkge1xuICAgICAgICB0aGlzLndpbmRvd1JlZiA9IHRoaXMuZG9tU2VydmljZS5nZXROYXRpdmVXaW5kb3coKTtcbiAgICAgICAgdGhpcy5zdGVwID0gbmV3IEpveXJpZGVTdGVwKCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMucHJldlRlbXBsYXRlKSB0aGlzLnRlbXBsYXRlU2VydmljZS5zZXRQcmV2QnV0dG9uKHRoaXMucHJldlRlbXBsYXRlKTtcbiAgICAgICAgaWYgKHRoaXMubmV4dFRlbXBsYXRlKSB0aGlzLnRlbXBsYXRlU2VydmljZS5zZXROZXh0QnV0dG9uKHRoaXMubmV4dFRlbXBsYXRlKTtcbiAgICAgICAgaWYgKHRoaXMuZG9uZVRlbXBsYXRlKSB0aGlzLnRlbXBsYXRlU2VydmljZS5zZXREb25lQnV0dG9uKHRoaXMuZG9uZVRlbXBsYXRlKTtcbiAgICAgICAgaWYgKHRoaXMuY291bnRlclRlbXBsYXRlKSB0aGlzLnRlbXBsYXRlU2VydmljZS5zZXRDb3VudGVyKHRoaXMuY291bnRlclRlbXBsYXRlKTtcbiAgICAgICAgdGhpcy5zdGVwLnBvc2l0aW9uID0gdGhpcy5zdGVwUG9zaXRpb247XG4gICAgICAgIHRoaXMuc3RlcC50YXJnZXRWaWV3Q29udGFpbmVyID0gdGhpcy52aWV3Q29udGFpbmVyUmVmO1xuICAgICAgICB0aGlzLnNldEFzeW5jRmllbGRzKHRoaXMuc3RlcCk7XG4gICAgICAgIHRoaXMuc3RlcC5zdGVwQ29udGVudCA9IHRoaXMuc3RlcENvbnRlbnQ7XG4gICAgICAgIHRoaXMuc3RlcC5zdGVwQ29udGVudFBhcmFtcyA9IHRoaXMuc3RlcENvbnRlbnRQYXJhbXM7XG4gICAgICAgIHRoaXMuc3RlcC5uZXh0Q2xpY2tlZCA9IHRoaXMubmV4dDtcbiAgICAgICAgdGhpcy5zdGVwLnByZXZDbGlrZWQgPSB0aGlzLnByZXY7XG4gICAgICAgIHRoaXMuc3RlcC50b3VyRG9uZSA9IHRoaXMuZG9uZTtcbiAgICAgICAgaWYgKCF0aGlzLm5hbWUpIHRocm93IG5ldyBKb3lyaWRlRXJyb3IoXCJBbGwgdGhlIHN0ZXBzIHNob3VsZCBoYXZlIHRoZSAnam95cmlkZVN0ZXAnIHByb3BlcnR5IHNldCB3aXRoIGEgY3VzdG9tIG5hbWUuXCIpO1xuICAgICAgICB0aGlzLnN0ZXAubmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgdGhpcy5zdGVwLnJvdXRlID0gdGhpcy5yb3V0ZXIudXJsLnN1YnN0cigwLCAxKSA9PT0gJy8nID8gdGhpcy5yb3V0ZXIudXJsLnN1YnN0cigxKSA6IHRoaXMucm91dGVyLnVybDtcbiAgICAgICAgdGhpcy5zdGVwLnRyYW5zZm9ybUNzc1N0eWxlID0gdGhpcy53aW5kb3dSZWYuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnZpZXdDb250YWluZXJSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50KS50cmFuc2Zvcm07XG4gICAgICAgIHRoaXMuc3RlcC5pc0VsZW1lbnRPckFuY2VzdG9yRml4ZWQgPVxuICAgICAgICAgICAgdGhpcy5pc0VsZW1lbnRGaXhlZCh0aGlzLnZpZXdDb250YWluZXJSZWYuZWxlbWVudCkgfHxcbiAgICAgICAgICAgIHRoaXMuaXNBbmNlc3RvcnNGaXhlZCh0aGlzLnZpZXdDb250YWluZXJSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMuam95cmlkZVN0ZXBzQ29udGFpbmVyLmFkZFN0ZXAodGhpcy5zdGVwKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzWyd0aXRsZSddIHx8IGNoYW5nZXNbJ3RleHQnXSkge1xuICAgICAgICAgICAgdGhpcy5zZXRBc3luY0ZpZWxkcyh0aGlzLnN0ZXApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0VsZW1lbnRGaXhlZChlbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndpbmRvd1JlZi5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQubmF0aXZlRWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRBc3luY0ZpZWxkcyhzdGVwOiBKb3lyaWRlU3RlcCkge1xuICAgICAgICBpZiAodGhpcy50aXRsZSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMudGl0bGUuc3Vic2NyaWJlKHRpdGxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcC50aXRsZS5uZXh0KHRpdGxlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ZXAudGl0bGUubmV4dCh0aGlzLnRpdGxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50ZXh0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0LnN1YnNjcmliZSh0ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcC50ZXh0Lm5leHQodGV4dCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGVwLnRleHQubmV4dCh0aGlzLnRleHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0FuY2VzdG9yc0ZpeGVkKG5hdGl2ZUVsZW1lbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5hdGl2ZUVsZW1lbnQgfHwgIW5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgaXNFbGVtZW50Rml4ZWQgPSB0aGlzLndpbmRvd1JlZi5nZXRDb21wdXRlZFN0eWxlKG5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCc7XG4gICAgICAgIGlmIChuYXRpdmVFbGVtZW50Lm5vZGVOYW1lID09PSAnQk9EWScpIHtcbiAgICAgICAgICAgIHJldHVybiBpc0VsZW1lbnRGaXhlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNFbGVtZW50Rml4ZWQpIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlIHJldHVybiB0aGlzLmlzQW5jZXN0b3JzRml4ZWQobmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3ViID0+IHtcbiAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=