@rg-software/angular-archwizard
Version:
A fork of the Angular Arch Wizard adapted for angular versions 17+.
119 lines • 16.7 kB
JavaScript
import { Component } from '@angular/core';
import { WizardCompletionStep } from '../util/wizard-completion-step.interface';
import * as i0 from "@angular/core";
import * as i1 from "../util/wizard.interface";
import * as i2 from "@angular/common";
import * as i3 from "../directives/go-to-step.directive";
/**
* The `aw-wizard-navigation-bar` component contains the navigation bar inside a [[WizardComponent]].
* To correctly display the navigation bar, it's required to set the right css classes for the navigation bar,
* otherwise it will look like a normal `ul` component.
*
* ### Syntax
*
* ```html
* <aw-wizard-navigation-bar></aw-wizard-navigation-bar>
* ```
*
* @author Marc Arndt
*/
export class WizardNavigationBarComponent {
/**
* Constructor
*
* @param wizard The state the wizard currently resides in
*/
constructor(wizard) {
this.wizard = wizard;
}
/**
* Returns all [[WizardStep]]s contained in the wizard
*
* @returns An array containing all [[WizardStep]]s
*/
get wizardSteps() {
switch (this.wizard.navBarDirection) {
case 'right-to-left':
return this.wizard.wizardSteps.slice().reverse();
case 'left-to-right':
default:
return this.wizard.wizardSteps;
}
}
/**
* Returns the number of wizard steps, that need to be displaced in the navigation bar
*
* @returns The number of wizard steps to be displayed
*/
get numberOfWizardSteps() {
return this.wizard.wizardSteps.length;
}
/**
* Checks, whether a [[WizardStep]] can be marked as `current` in the navigation bar
*
* @param wizardStep The wizard step to be checked
* @returns True if the step can be marked as `current`
*/
isCurrent(wizardStep) {
return wizardStep.selected;
}
/**
* Checks, whether a [[WizardStep]] can be marked as `editing` in the navigation bar
*
* @param wizardStep The wizard step to be checked
* @returns True if the step can be marked as `editing`
*/
isEditing(wizardStep) {
return wizardStep.editing;
}
/**
* Checks, whether a [[WizardStep]] can be marked as `done` in the navigation bar
*
* @param wizardStep The wizard step to be checked
* @returns True if the step can be marked as `done`
*/
isDone(wizardStep) {
return wizardStep.completed;
}
/**
* Checks, whether a [[WizardStep]] can be marked as `optional` in the navigation bar
*
* @param wizardStep The wizard step to be checked
* @returns True if the step can be marked as `optional`
*/
isOptional(wizardStep) {
return wizardStep.optional;
}
/**
* Checks, whether a [[WizardStep]] can be marked as `completed` in the navigation bar.
*
* The `completed` class is only applied to completion steps.
*
* @param wizardStep The wizard step to be checked
* @returns True if the step can be marked as `completed`
*/
isCompleted(wizardStep) {
return wizardStep instanceof WizardCompletionStep && this.wizard.completed;
}
/**
* Checks, whether a [[WizardStep]] can be marked as `navigable` in the navigation bar.
* A wizard step can be navigated to if:
* - the step is currently not selected
* - the navigation bar isn't disabled
* - the navigation mode allows navigation to the step
*
* @param wizardStep The wizard step to be checked
* @returns True if the step can be marked as navigable
*/
isNavigable(wizardStep) {
return !wizardStep.selected && !this.wizard.disableNavigationBar &&
this.wizard.isNavigable(this.wizard.getIndexOfStep(wizardStep));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: WizardNavigationBarComponent, deps: [{ token: i1.WizardBase }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.0", type: WizardNavigationBarComponent, selector: "aw-wizard-navigation-bar", ngImport: i0, template: "<ul class=\"steps-indicator steps-{{numberOfWizardSteps}}\">\n <li [attr.id]=\"step.stepId\" *ngFor=\"let step of wizardSteps\" [ngClass]=\"{\n 'current': isCurrent(step),\n 'editing': isEditing(step),\n 'done': isDone(step),\n 'optional': isOptional(step),\n 'completed': isCompleted(step),\n 'navigable': isNavigable(step)\n }\">\n <a [awGoToStep]=\"step\">\n <div class=\"label\">\n <ng-container *ngIf=\"step.stepTitleTemplate\" [ngTemplateOutlet]=\"step.stepTitleTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{wizardStep: step}\"></ng-container>\n <ng-container *ngIf=\"!step.stepTitleTemplate\">{{step.stepTitle}}</ng-container>\n </div>\n <div class=\"step-indicator\"\n [ngStyle]=\"{ 'font-family': step.stepSymbolTemplate ? '' : step.navigationSymbol.fontFamily }\">\n <ng-container *ngIf=\"step.stepSymbolTemplate\" [ngTemplateOutlet]=\"step.stepSymbolTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{wizardStep: step}\"></ng-container>\n <ng-container *ngIf=\"!step.stepSymbolTemplate\">{{step.navigationSymbol.symbol}}</ng-container>\n </div>\n </a>\n </li>\n</ul>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.GoToStepDirective, selector: "[awGoToStep]", inputs: ["awGoToStep"], outputs: ["preFinalize", "postFinalize", "finalize"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: WizardNavigationBarComponent, decorators: [{
type: Component,
args: [{ selector: 'aw-wizard-navigation-bar', template: "<ul class=\"steps-indicator steps-{{numberOfWizardSteps}}\">\n <li [attr.id]=\"step.stepId\" *ngFor=\"let step of wizardSteps\" [ngClass]=\"{\n 'current': isCurrent(step),\n 'editing': isEditing(step),\n 'done': isDone(step),\n 'optional': isOptional(step),\n 'completed': isCompleted(step),\n 'navigable': isNavigable(step)\n }\">\n <a [awGoToStep]=\"step\">\n <div class=\"label\">\n <ng-container *ngIf=\"step.stepTitleTemplate\" [ngTemplateOutlet]=\"step.stepTitleTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{wizardStep: step}\"></ng-container>\n <ng-container *ngIf=\"!step.stepTitleTemplate\">{{step.stepTitle}}</ng-container>\n </div>\n <div class=\"step-indicator\"\n [ngStyle]=\"{ 'font-family': step.stepSymbolTemplate ? '' : step.navigationSymbol.fontFamily }\">\n <ng-container *ngIf=\"step.stepSymbolTemplate\" [ngTemplateOutlet]=\"step.stepSymbolTemplate.templateRef\"\n [ngTemplateOutletContext]=\"{wizardStep: step}\"></ng-container>\n <ng-container *ngIf=\"!step.stepSymbolTemplate\">{{step.navigationSymbol.symbol}}</ng-container>\n </div>\n </a>\n </li>\n</ul>\n" }]
}], ctorParameters: () => [{ type: i1.WizardBase }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLW5hdmlnYXRpb24tYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy93aXphcmQtbmF2aWdhdGlvbi1iYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3dpemFyZC1uYXZpZ2F0aW9uLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7OztBQUloRjs7Ozs7Ozs7Ozs7O0dBWUc7QUFLSCxNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDOzs7O09BSUc7SUFDSCxZQUFtQixNQUFrQjtRQUFsQixXQUFNLEdBQU4sTUFBTSxDQUFZO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxXQUFXO1FBQ2IsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRTtZQUNuQyxLQUFLLGVBQWU7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkQsS0FBSyxlQUFlLENBQUM7WUFDckI7Z0JBQ0UsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztTQUNsQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxtQkFBbUI7UUFDckIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksU0FBUyxDQUFDLFVBQXNCO1FBQ3JDLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxTQUFTLENBQUMsVUFBc0I7UUFDckMsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxVQUFzQjtRQUNsQyxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksVUFBVSxDQUFDLFVBQXNCO1FBQ3RDLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFdBQVcsQ0FBQyxVQUFzQjtRQUN2QyxPQUFPLFVBQVUsWUFBWSxvQkFBb0IsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksV0FBVyxDQUFDLFVBQXNCO1FBQ3ZDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0I7WUFDOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDOzhHQWxHVSw0QkFBNEI7a0dBQTVCLDRCQUE0QixnRUN0QnpDLGdzQ0F3QkE7OzJGREZhLDRCQUE0QjtrQkFKeEMsU0FBUzsrQkFDRSwwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpemFyZENvbXBsZXRpb25TdGVwIH0gZnJvbSAnLi4vdXRpbC93aXphcmQtY29tcGxldGlvbi1zdGVwLmludGVyZmFjZSc7XG5pbXBvcnQgeyBXaXphcmRTdGVwIH0gZnJvbSAnLi4vdXRpbC93aXphcmQtc3RlcC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgV2l6YXJkQmFzZSB9IGZyb20gJy4uL3V0aWwvd2l6YXJkLmludGVyZmFjZSc7XG5cbi8qKlxuICogVGhlIGBhdy13aXphcmQtbmF2aWdhdGlvbi1iYXJgIGNvbXBvbmVudCBjb250YWlucyB0aGUgbmF2aWdhdGlvbiBiYXIgaW5zaWRlIGEgW1tXaXphcmRDb21wb25lbnRdXS5cbiAqIFRvIGNvcnJlY3RseSBkaXNwbGF5IHRoZSBuYXZpZ2F0aW9uIGJhciwgaXQncyByZXF1aXJlZCB0byBzZXQgdGhlIHJpZ2h0IGNzcyBjbGFzc2VzIGZvciB0aGUgbmF2aWdhdGlvbiBiYXIsXG4gKiBvdGhlcndpc2UgaXQgd2lsbCBsb29rIGxpa2UgYSBub3JtYWwgYHVsYCBjb21wb25lbnQuXG4gKlxuICogIyMjIFN5bnRheFxuICpcbiAqIGBgYGh0bWxcbiAqIDxhdy13aXphcmQtbmF2aWdhdGlvbi1iYXI+PC9hdy13aXphcmQtbmF2aWdhdGlvbi1iYXI+XG4gKiBgYGBcbiAqXG4gKiBAYXV0aG9yIE1hcmMgQXJuZHRcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXctd2l6YXJkLW5hdmlnYXRpb24tYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICd3aXphcmQtbmF2aWdhdGlvbi1iYXIuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBXaXphcmROYXZpZ2F0aW9uQmFyQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqXG4gICAqIEBwYXJhbSB3aXphcmQgVGhlIHN0YXRlIHRoZSB3aXphcmQgY3VycmVudGx5IHJlc2lkZXMgaW5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB3aXphcmQ6IFdpemFyZEJhc2UpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBbW1dpemFyZFN0ZXBdXXMgY29udGFpbmVkIGluIHRoZSB3aXphcmRcbiAgICpcbiAgICogQHJldHVybnMgQW4gYXJyYXkgY29udGFpbmluZyBhbGwgW1tXaXphcmRTdGVwXV1zXG4gICAqL1xuICBnZXQgd2l6YXJkU3RlcHMoKTogQXJyYXk8V2l6YXJkU3RlcD4ge1xuICAgIHN3aXRjaCAodGhpcy53aXphcmQubmF2QmFyRGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICdyaWdodC10by1sZWZ0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMud2l6YXJkLndpemFyZFN0ZXBzLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgICAgY2FzZSAnbGVmdC10by1yaWdodCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy53aXphcmQud2l6YXJkU3RlcHM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3aXphcmQgc3RlcHMsIHRoYXQgbmVlZCB0byBiZSBkaXNwbGFjZWQgaW4gdGhlIG5hdmlnYXRpb24gYmFyXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2Ygd2l6YXJkIHN0ZXBzIHRvIGJlIGRpc3BsYXllZFxuICAgKi9cbiAgZ2V0IG51bWJlck9mV2l6YXJkU3RlcHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy53aXphcmQud2l6YXJkU3RlcHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcywgd2hldGhlciBhIFtbV2l6YXJkU3RlcF1dIGNhbiBiZSBtYXJrZWQgYXMgYGN1cnJlbnRgIGluIHRoZSBuYXZpZ2F0aW9uIGJhclxuICAgKlxuICAgKiBAcGFyYW0gd2l6YXJkU3RlcCBUaGUgd2l6YXJkIHN0ZXAgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBzdGVwIGNhbiBiZSBtYXJrZWQgYXMgYGN1cnJlbnRgXG4gICAqL1xuICBwdWJsaWMgaXNDdXJyZW50KHdpemFyZFN0ZXA6IFdpemFyZFN0ZXApOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2l6YXJkU3RlcC5zZWxlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MsIHdoZXRoZXIgYSBbW1dpemFyZFN0ZXBdXSBjYW4gYmUgbWFya2VkIGFzIGBlZGl0aW5nYCBpbiB0aGUgbmF2aWdhdGlvbiBiYXJcbiAgICpcbiAgICogQHBhcmFtIHdpemFyZFN0ZXAgVGhlIHdpemFyZCBzdGVwIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgc3RlcCBjYW4gYmUgbWFya2VkIGFzIGBlZGl0aW5nYFxuICAgKi9cbiAgcHVibGljIGlzRWRpdGluZyh3aXphcmRTdGVwOiBXaXphcmRTdGVwKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpemFyZFN0ZXAuZWRpdGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MsIHdoZXRoZXIgYSBbW1dpemFyZFN0ZXBdXSBjYW4gYmUgbWFya2VkIGFzIGBkb25lYCBpbiB0aGUgbmF2aWdhdGlvbiBiYXJcbiAgICpcbiAgICogQHBhcmFtIHdpemFyZFN0ZXAgVGhlIHdpemFyZCBzdGVwIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgc3RlcCBjYW4gYmUgbWFya2VkIGFzIGBkb25lYFxuICAgKi9cbiAgcHVibGljIGlzRG9uZSh3aXphcmRTdGVwOiBXaXphcmRTdGVwKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpemFyZFN0ZXAuY29tcGxldGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcywgd2hldGhlciBhIFtbV2l6YXJkU3RlcF1dIGNhbiBiZSBtYXJrZWQgYXMgYG9wdGlvbmFsYCBpbiB0aGUgbmF2aWdhdGlvbiBiYXJcbiAgICpcbiAgICogQHBhcmFtIHdpemFyZFN0ZXAgVGhlIHdpemFyZCBzdGVwIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgc3RlcCBjYW4gYmUgbWFya2VkIGFzIGBvcHRpb25hbGBcbiAgICovXG4gIHB1YmxpYyBpc09wdGlvbmFsKHdpemFyZFN0ZXA6IFdpemFyZFN0ZXApOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2l6YXJkU3RlcC5vcHRpb25hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MsIHdoZXRoZXIgYSBbW1dpemFyZFN0ZXBdXSBjYW4gYmUgbWFya2VkIGFzIGBjb21wbGV0ZWRgIGluIHRoZSBuYXZpZ2F0aW9uIGJhci5cbiAgICpcbiAgICogVGhlIGBjb21wbGV0ZWRgIGNsYXNzIGlzIG9ubHkgYXBwbGllZCB0byBjb21wbGV0aW9uIHN0ZXBzLlxuICAgKlxuICAgKiBAcGFyYW0gd2l6YXJkU3RlcCBUaGUgd2l6YXJkIHN0ZXAgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBzdGVwIGNhbiBiZSBtYXJrZWQgYXMgYGNvbXBsZXRlZGBcbiAgICovXG4gIHB1YmxpYyBpc0NvbXBsZXRlZCh3aXphcmRTdGVwOiBXaXphcmRTdGVwKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpemFyZFN0ZXAgaW5zdGFuY2VvZiBXaXphcmRDb21wbGV0aW9uU3RlcCAmJiB0aGlzLndpemFyZC5jb21wbGV0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzLCB3aGV0aGVyIGEgW1tXaXphcmRTdGVwXV0gY2FuIGJlIG1hcmtlZCBhcyBgbmF2aWdhYmxlYCBpbiB0aGUgbmF2aWdhdGlvbiBiYXIuXG4gICAqIEEgd2l6YXJkIHN0ZXAgY2FuIGJlIG5hdmlnYXRlZCB0byBpZjpcbiAgICogLSB0aGUgc3RlcCBpcyBjdXJyZW50bHkgbm90IHNlbGVjdGVkXG4gICAqIC0gdGhlIG5hdmlnYXRpb24gYmFyIGlzbid0IGRpc2FibGVkXG4gICAqIC0gdGhlIG5hdmlnYXRpb24gbW9kZSBhbGxvd3MgbmF2aWdhdGlvbiB0byB0aGUgc3RlcFxuICAgKlxuICAgKiBAcGFyYW0gd2l6YXJkU3RlcCBUaGUgd2l6YXJkIHN0ZXAgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBzdGVwIGNhbiBiZSBtYXJrZWQgYXMgbmF2aWdhYmxlXG4gICAqL1xuICBwdWJsaWMgaXNOYXZpZ2FibGUod2l6YXJkU3RlcDogV2l6YXJkU3RlcCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhd2l6YXJkU3RlcC5zZWxlY3RlZCAmJiAhdGhpcy53aXphcmQuZGlzYWJsZU5hdmlnYXRpb25CYXIgJiZcbiAgICAgIHRoaXMud2l6YXJkLmlzTmF2aWdhYmxlKHRoaXMud2l6YXJkLmdldEluZGV4T2ZTdGVwKHdpemFyZFN0ZXApKTtcbiAgfVxufVxuIiwiPHVsIGNsYXNzPVwic3RlcHMtaW5kaWNhdG9yIHN0ZXBzLXt7bnVtYmVyT2ZXaXphcmRTdGVwc319XCI+XG4gIDxsaSBbYXR0ci5pZF09XCJzdGVwLnN0ZXBJZFwiICpuZ0Zvcj1cImxldCBzdGVwIG9mIHdpemFyZFN0ZXBzXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAnY3VycmVudCc6IGlzQ3VycmVudChzdGVwKSxcbiAgICAgICAgJ2VkaXRpbmcnOiBpc0VkaXRpbmcoc3RlcCksXG4gICAgICAgICdkb25lJzogaXNEb25lKHN0ZXApLFxuICAgICAgICAnb3B0aW9uYWwnOiBpc09wdGlvbmFsKHN0ZXApLFxuICAgICAgICAnY29tcGxldGVkJzogaXNDb21wbGV0ZWQoc3RlcCksXG4gICAgICAgICduYXZpZ2FibGUnOiBpc05hdmlnYWJsZShzdGVwKVxuICB9XCI+XG4gICAgPGEgW2F3R29Ub1N0ZXBdPVwic3RlcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGVwLnN0ZXBUaXRsZVRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwic3RlcC5zdGVwVGl0bGVUZW1wbGF0ZS50ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInt3aXphcmRTdGVwOiBzdGVwfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXN0ZXAuc3RlcFRpdGxlVGVtcGxhdGVcIj57e3N0ZXAuc3RlcFRpdGxlfX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInN0ZXAtaW5kaWNhdG9yXCJcbiAgICAgICAgW25nU3R5bGVdPVwieyAnZm9udC1mYW1pbHknOiBzdGVwLnN0ZXBTeW1ib2xUZW1wbGF0ZSA/ICcnIDogc3RlcC5uYXZpZ2F0aW9uU3ltYm9sLmZvbnRGYW1pbHkgfVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RlcC5zdGVwU3ltYm9sVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJzdGVwLnN0ZXBTeW1ib2xUZW1wbGF0ZS50ZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInt3aXphcmRTdGVwOiBzdGVwfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXN0ZXAuc3RlcFN5bWJvbFRlbXBsYXRlXCI+e3tzdGVwLm5hdmlnYXRpb25TeW1ib2wuc3ltYm9sfX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvYT5cbiAgPC9saT5cbjwvdWw+XG4iXX0=