UNPKG

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.

114 lines 17.9 kB
import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; import { JoyrideError, JoyrideStepOutOfRange } from '../models/joyride-error.class'; import * as i0 from "@angular/core"; import * as i1 from "./joyride-options.service"; import * as i2 from "./logger.service"; const ROUTE_SEPARATOR = '@'; class Step { } export var StepActionType; (function (StepActionType) { StepActionType["NEXT"] = "NEXT"; StepActionType["PREV"] = "PREV"; })(StepActionType || (StepActionType = {})); export class JoyrideStepsContainerService { constructor(stepOptions, logger) { this.stepOptions = stepOptions; this.logger = logger; this.tempSteps = []; this.currentStepIndex = -2; this.stepHasBeenModified = new Subject(); } getFirstStepIndex() { const firstStep = this.stepOptions.getFirstStep(); const stepIds = this.stepOptions.getStepsOrder(); let index = stepIds.indexOf(firstStep); if (index < 0) { index = 0; if (firstStep !== undefined) this.logger.warn(`The step ${firstStep} does not exist. Check in your step list if it's present.`); } return index; } init() { this.logger.info('Initializing the steps array.'); this.steps = []; this.currentStepIndex = this.getFirstStepIndex() - 1; let stepIds = this.stepOptions.getStepsOrder(); stepIds.forEach(stepId => this.steps.push({ id: stepId, step: null })); } addStep(stepToAdd) { let stepExist = this.tempSteps.filter(step => step.name === stepToAdd.name).length > 0; if (!stepExist) { this.logger.info(`Adding step ${stepToAdd.name} to the steps list.`); this.tempSteps.push(stepToAdd); } else { let stepIndexToReplace = this.tempSteps.findIndex(step => step.name === stepToAdd.name); this.tempSteps[stepIndexToReplace] = stepToAdd; } } get(action) { if (action === StepActionType.NEXT) this.currentStepIndex++; else this.currentStepIndex--; if (this.currentStepIndex < 0 || this.currentStepIndex >= this.steps.length) throw new JoyrideStepOutOfRange('The first or last step of the tour cannot be found!'); const stepName = this.getStepName(this.steps[this.currentStepIndex].id); const index = this.tempSteps.findIndex(step => step.name === stepName); let stepFound = this.tempSteps[index]; this.steps[this.currentStepIndex].step = stepFound; if (stepFound == null) { this.logger.warn(`Step ${this.steps[this.currentStepIndex].id} not found in the DOM. Check if it's hidden by *ngIf directive.`); } return stepFound; } getStepRoute(action) { let stepID; if (action === StepActionType.NEXT) { stepID = this.steps[this.currentStepIndex + 1] ? this.steps[this.currentStepIndex + 1].id : null; } else { stepID = this.steps[this.currentStepIndex - 1] ? this.steps[this.currentStepIndex - 1].id : null; } let stepRoute = stepID && stepID.includes(ROUTE_SEPARATOR) ? stepID.split(ROUTE_SEPARATOR)[1] : ''; return stepRoute; } updatePosition(stepName, position) { let index = this.getStepIndex(stepName); if (this.steps[index].step) { this.steps[index].step.position = position; this.stepHasBeenModified.next(this.steps[index].step); } else { this.logger.warn(`Trying to modify the position of ${stepName} to ${position}. Step not found!Is this step located in a different route?`); } } getStepNumber(stepName) { return this.getStepIndex(stepName) + 1; } getStepsCount() { let stepsOrder = this.stepOptions.getStepsOrder(); return stepsOrder.length; } getStepIndex(stepName) { const index = this.steps .map(step => (step.id.includes(ROUTE_SEPARATOR) ? step.id.split(ROUTE_SEPARATOR)[0] : step.id)) .findIndex(name => stepName === name); if (index === -1) throw new JoyrideError(`The step with name: ${stepName} does not exist in the step list.`); return index; } getStepName(stepID) { let stepName = stepID && stepID.includes(ROUTE_SEPARATOR) ? stepID.split(ROUTE_SEPARATOR)[0] : stepID; return stepName; } } JoyrideStepsContainerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: JoyrideStepsContainerService, deps: [{ token: i1.JoyrideOptionsService }, { token: i2.LoggerService }], target: i0.ɵɵFactoryTarget.Injectable }); JoyrideStepsContainerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: JoyrideStepsContainerService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: JoyrideStepsContainerService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.JoyrideOptionsService }, { type: i2.LoggerService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam95cmlkZS1zdGVwcy1jb250YWluZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1qb3lyaWRlL3NyYy9saWIvc2VydmljZXMvam95cmlkZS1zdGVwcy1jb250YWluZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7O0FBRXBGLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQztBQUU1QixNQUFNLElBQUk7Q0FHVDtBQUVELE1BQU0sQ0FBTixJQUFZLGNBR1g7QUFIRCxXQUFZLGNBQWM7SUFDdEIsK0JBQWEsQ0FBQTtJQUNiLCtCQUFhLENBQUE7QUFDakIsQ0FBQyxFQUhXLGNBQWMsS0FBZCxjQUFjLFFBR3pCO0FBR0QsTUFBTSxPQUFPLDRCQUE0QjtJQU1yQyxZQUE2QixXQUFrQyxFQUFtQixNQUFxQjtRQUExRSxnQkFBVyxHQUFYLFdBQVcsQ0FBdUI7UUFBbUIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUovRixjQUFTLEdBQWtCLEVBQUUsQ0FBQztRQUM5QixxQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5Qix3QkFBbUIsR0FBeUIsSUFBSSxPQUFPLEVBQWUsQ0FBQztJQUVtQyxDQUFDO0lBRW5HLGlCQUFpQjtRQUNyQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFakQsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDWCxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxTQUFTLEtBQUssU0FBUztnQkFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLFNBQVMsMkRBQTJELENBQUMsQ0FBQztTQUNuSTtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxJQUFJO1FBQ0EsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDL0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCxPQUFPLENBQUMsU0FBc0I7UUFDMUIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLFNBQVMsQ0FBQyxJQUFJLHFCQUFxQixDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbEM7YUFBTTtZQUNILElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RixJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsU0FBUyxDQUFDO1NBQ2xEO0lBQ0wsQ0FBQztJQUNELEdBQUcsQ0FBQyxNQUFzQjtRQUN0QixJQUFJLE1BQU0sS0FBSyxjQUFjLENBQUMsSUFBSTtZQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztZQUN2RCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUU3QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUN2RSxNQUFNLElBQUkscUJBQXFCLENBQUMscURBQXFELENBQUMsQ0FBQztRQUUzRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBRW5ELElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtZQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxpRUFBaUUsQ0FBQyxDQUFDO1NBQ25JO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUFzQjtRQUMvQixJQUFJLE1BQWMsQ0FBQztRQUNuQixJQUFJLE1BQU0sS0FBSyxjQUFjLENBQUMsSUFBSSxFQUFFO1lBQ2hDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDcEc7YUFBTTtZQUNILE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDcEc7UUFDRCxJQUFJLFNBQVMsR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRW5HLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxjQUFjLENBQUMsUUFBZ0IsRUFBRSxRQUFnQjtRQUM3QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUMzQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekQ7YUFBTTtZQUNILElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNaLG9DQUFvQyxRQUFRLE9BQU8sUUFBUSw2REFBNkQsQ0FDM0gsQ0FBQztTQUNMO0lBQ0wsQ0FBQztJQUNELGFBQWEsQ0FBQyxRQUFnQjtRQUMxQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxhQUFhO1FBQ1QsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNsRCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFDN0IsQ0FBQztJQUVPLFlBQVksQ0FBQyxRQUFnQjtRQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSzthQUNuQixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzlGLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUMxQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7WUFBRSxNQUFNLElBQUksWUFBWSxDQUFDLHVCQUF1QixRQUFRLG1DQUFtQyxDQUFDLENBQUM7UUFDN0csT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxNQUFjO1FBQzlCLElBQUksUUFBUSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDdEcsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQzs7eUhBckdRLDRCQUE0Qjs2SEFBNUIsNEJBQTRCOzJGQUE1Qiw0QkFBNEI7a0JBRHhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBKb3lyaWRlU3RlcCB9IGZyb20gJy4uL21vZGVscy9qb3lyaWRlLXN0ZXAuY2xhc3MnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSm95cmlkZU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9qb3lyaWRlLW9wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBKb3lyaWRlRXJyb3IsIEpveXJpZGVTdGVwT3V0T2ZSYW5nZSB9IGZyb20gJy4uL21vZGVscy9qb3lyaWRlLWVycm9yLmNsYXNzJztcblxuY29uc3QgUk9VVEVfU0VQQVJBVE9SID0gJ0AnO1xuXG5jbGFzcyBTdGVwIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHN0ZXA6IEpveXJpZGVTdGVwO1xufVxuXG5leHBvcnQgZW51bSBTdGVwQWN0aW9uVHlwZSB7XG4gICAgTkVYVCA9ICdORVhUJyxcbiAgICBQUkVWID0gJ1BSRVYnXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKb3lyaWRlU3RlcHNDb250YWluZXJTZXJ2aWNlIHtcbiAgICBwcml2YXRlIHN0ZXBzOiBTdGVwW107XG4gICAgcHJpdmF0ZSB0ZW1wU3RlcHM6IEpveXJpZGVTdGVwW10gPSBbXTtcbiAgICBwcml2YXRlIGN1cnJlbnRTdGVwSW5kZXggPSAtMjtcbiAgICBzdGVwSGFzQmVlbk1vZGlmaWVkOiBTdWJqZWN0PEpveXJpZGVTdGVwPiA9IG5ldyBTdWJqZWN0PEpveXJpZGVTdGVwPigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzdGVwT3B0aW9uczogSm95cmlkZU9wdGlvbnNTZXJ2aWNlLCBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyU2VydmljZSkge31cblxuICAgIHByaXZhdGUgZ2V0Rmlyc3RTdGVwSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgZmlyc3RTdGVwID0gdGhpcy5zdGVwT3B0aW9ucy5nZXRGaXJzdFN0ZXAoKTtcbiAgICAgICAgY29uc3Qgc3RlcElkcyA9IHRoaXMuc3RlcE9wdGlvbnMuZ2V0U3RlcHNPcmRlcigpO1xuXG4gICAgICAgIGxldCBpbmRleCA9IHN0ZXBJZHMuaW5kZXhPZihmaXJzdFN0ZXApO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgICAgICBpZiAoZmlyc3RTdGVwICE9PSB1bmRlZmluZWQpIHRoaXMubG9nZ2VyLndhcm4oYFRoZSBzdGVwICR7Zmlyc3RTdGVwfSBkb2VzIG5vdCBleGlzdC4gQ2hlY2sgaW4geW91ciBzdGVwIGxpc3QgaWYgaXQncyBwcmVzZW50LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ0luaXRpYWxpemluZyB0aGUgc3RlcHMgYXJyYXkuJyk7XG4gICAgICAgIHRoaXMuc3RlcHMgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcEluZGV4ID0gdGhpcy5nZXRGaXJzdFN0ZXBJbmRleCgpIC0gMTtcbiAgICAgICAgbGV0IHN0ZXBJZHMgPSB0aGlzLnN0ZXBPcHRpb25zLmdldFN0ZXBzT3JkZXIoKTtcbiAgICAgICAgc3RlcElkcy5mb3JFYWNoKHN0ZXBJZCA9PiB0aGlzLnN0ZXBzLnB1c2goeyBpZDogc3RlcElkLCBzdGVwOiBudWxsIH0pKTtcbiAgICB9XG5cbiAgICBhZGRTdGVwKHN0ZXBUb0FkZDogSm95cmlkZVN0ZXApIHtcbiAgICAgICAgbGV0IHN0ZXBFeGlzdCA9IHRoaXMudGVtcFN0ZXBzLmZpbHRlcihzdGVwID0+IHN0ZXAubmFtZSA9PT0gc3RlcFRvQWRkLm5hbWUpLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmICghc3RlcEV4aXN0KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGBBZGRpbmcgc3RlcCAke3N0ZXBUb0FkZC5uYW1lfSB0byB0aGUgc3RlcHMgbGlzdC5gKTtcbiAgICAgICAgICAgIHRoaXMudGVtcFN0ZXBzLnB1c2goc3RlcFRvQWRkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBzdGVwSW5kZXhUb1JlcGxhY2UgPSB0aGlzLnRlbXBTdGVwcy5maW5kSW5kZXgoc3RlcCA9PiBzdGVwLm5hbWUgPT09IHN0ZXBUb0FkZC5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMudGVtcFN0ZXBzW3N0ZXBJbmRleFRvUmVwbGFjZV0gPSBzdGVwVG9BZGQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0KGFjdGlvbjogU3RlcEFjdGlvblR5cGUpOiBKb3lyaWRlU3RlcCB7XG4gICAgICAgIGlmIChhY3Rpb24gPT09IFN0ZXBBY3Rpb25UeXBlLk5FWFQpIHRoaXMuY3VycmVudFN0ZXBJbmRleCsrO1xuICAgICAgICBlbHNlIHRoaXMuY3VycmVudFN0ZXBJbmRleC0tO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwSW5kZXggPCAwIHx8IHRoaXMuY3VycmVudFN0ZXBJbmRleCA+PSB0aGlzLnN0ZXBzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBKb3lyaWRlU3RlcE91dE9mUmFuZ2UoJ1RoZSBmaXJzdCBvciBsYXN0IHN0ZXAgb2YgdGhlIHRvdXIgY2Fubm90IGJlIGZvdW5kIScpO1xuXG4gICAgICAgIGNvbnN0IHN0ZXBOYW1lID0gdGhpcy5nZXRTdGVwTmFtZSh0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFN0ZXBJbmRleF0uaWQpO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudGVtcFN0ZXBzLmZpbmRJbmRleChzdGVwID0+IHN0ZXAubmFtZSA9PT0gc3RlcE5hbWUpO1xuICAgICAgICBsZXQgc3RlcEZvdW5kID0gdGhpcy50ZW1wU3RlcHNbaW5kZXhdO1xuICAgICAgICB0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFN0ZXBJbmRleF0uc3RlcCA9IHN0ZXBGb3VuZDtcblxuICAgICAgICBpZiAoc3RlcEZvdW5kID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFN0ZXAgJHt0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFN0ZXBJbmRleF0uaWR9IG5vdCBmb3VuZCBpbiB0aGUgRE9NLiBDaGVjayBpZiBpdCdzIGhpZGRlbiBieSAqbmdJZiBkaXJlY3RpdmUuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RlcEZvdW5kO1xuICAgIH1cblxuICAgIGdldFN0ZXBSb3V0ZShhY3Rpb246IFN0ZXBBY3Rpb25UeXBlKSB7XG4gICAgICAgIGxldCBzdGVwSUQ6IHN0cmluZztcbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gU3RlcEFjdGlvblR5cGUuTkVYVCkge1xuICAgICAgICAgICAgc3RlcElEID0gdGhpcy5zdGVwc1t0aGlzLmN1cnJlbnRTdGVwSW5kZXggKyAxXSA/IHRoaXMuc3RlcHNbdGhpcy5jdXJyZW50U3RlcEluZGV4ICsgMV0uaWQgOiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RlcElEID0gdGhpcy5zdGVwc1t0aGlzLmN1cnJlbnRTdGVwSW5kZXggLSAxXSA/IHRoaXMuc3RlcHNbdGhpcy5jdXJyZW50U3RlcEluZGV4IC0gMV0uaWQgOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGVwUm91dGUgPSBzdGVwSUQgJiYgc3RlcElELmluY2x1ZGVzKFJPVVRFX1NFUEFSQVRPUikgPyBzdGVwSUQuc3BsaXQoUk9VVEVfU0VQQVJBVE9SKVsxXSA6ICcnO1xuXG4gICAgICAgIHJldHVybiBzdGVwUm91dGU7XG4gICAgfVxuXG4gICAgdXBkYXRlUG9zaXRpb24oc3RlcE5hbWU6IHN0cmluZywgcG9zaXRpb246IHN0cmluZykge1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmdldFN0ZXBJbmRleChzdGVwTmFtZSk7XG4gICAgICAgIGlmICh0aGlzLnN0ZXBzW2luZGV4XS5zdGVwKSB7XG4gICAgICAgICAgICB0aGlzLnN0ZXBzW2luZGV4XS5zdGVwLnBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgICAgICAgICB0aGlzLnN0ZXBIYXNCZWVuTW9kaWZpZWQubmV4dCh0aGlzLnN0ZXBzW2luZGV4XS5zdGVwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgYFRyeWluZyB0byBtb2RpZnkgdGhlIHBvc2l0aW9uIG9mICR7c3RlcE5hbWV9IHRvICR7cG9zaXRpb259LiBTdGVwIG5vdCBmb3VuZCFJcyB0aGlzIHN0ZXAgbG9jYXRlZCBpbiBhIGRpZmZlcmVudCByb3V0ZT9gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFN0ZXBOdW1iZXIoc3RlcE5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0ZXBJbmRleChzdGVwTmFtZSkgKyAxO1xuICAgIH1cblxuICAgIGdldFN0ZXBzQ291bnQoKSB7XG4gICAgICAgIGxldCBzdGVwc09yZGVyID0gdGhpcy5zdGVwT3B0aW9ucy5nZXRTdGVwc09yZGVyKCk7XG4gICAgICAgIHJldHVybiBzdGVwc09yZGVyLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFN0ZXBJbmRleChzdGVwTmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnN0ZXBzXG4gICAgICAgICAgICAubWFwKHN0ZXAgPT4gKHN0ZXAuaWQuaW5jbHVkZXMoUk9VVEVfU0VQQVJBVE9SKSA/IHN0ZXAuaWQuc3BsaXQoUk9VVEVfU0VQQVJBVE9SKVswXSA6IHN0ZXAuaWQpKVxuICAgICAgICAgICAgLmZpbmRJbmRleChuYW1lID0+IHN0ZXBOYW1lID09PSBuYW1lKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEpveXJpZGVFcnJvcihgVGhlIHN0ZXAgd2l0aCBuYW1lOiAke3N0ZXBOYW1lfSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgc3RlcCBsaXN0LmApO1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTdGVwTmFtZShzdGVwSUQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBzdGVwTmFtZSA9IHN0ZXBJRCAmJiBzdGVwSUQuaW5jbHVkZXMoUk9VVEVfU0VQQVJBVE9SKSA/IHN0ZXBJRC5zcGxpdChST1VURV9TRVBBUkFUT1IpWzBdIDogc3RlcElEO1xuICAgICAgICByZXR1cm4gc3RlcE5hbWU7XG4gICAgfVxufVxuIl19