gw3-web-guid
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.14.
441 lines • 37.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/components/steps/steps.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, QueryList, Directive, ContentChild, ContentChildren, TemplateRef, Output, EventEmitter, } from '@angular/core';
import { slideOfRight } from './animations/slide-of-right.animation';
import { ConfigNames, AppStepConfig } from './step-config';
// import { LambStepConfig, ConfigNames } from '@lamb/steps/step-config';
// import { slideOfRight } from '@lamb/steps/animations/slide-of-right.animation';
var AppStepTitleDirective = /** @class */ (function () {
function AppStepTitleDirective(templateRef) {
this.templateRef = templateRef;
}
AppStepTitleDirective.decorators = [
{ type: Directive, args: [{
selector: 'ng-template[appStepTitle]',
},] }
];
/** @nocollapse */
AppStepTitleDirective.ctorParameters = function () { return [
{ type: TemplateRef }
]; };
return AppStepTitleDirective;
}());
export { AppStepTitleDirective };
if (false) {
/** @type {?} */
AppStepTitleDirective.prototype.templateRef;
}
var AppStepContentDirective = /** @class */ (function () {
function AppStepContentDirective(templateRef) {
this.templateRef = templateRef;
}
AppStepContentDirective.decorators = [
{ type: Directive, args: [{
selector: 'ng-template[appStepContent]',
},] }
];
/** @nocollapse */
AppStepContentDirective.ctorParameters = function () { return [
{ type: TemplateRef }
]; };
return AppStepContentDirective;
}());
export { AppStepContentDirective };
if (false) {
/** @type {?} */
AppStepContentDirective.prototype.templateRef;
}
/** @type {?} */
var nextId = 0;
var AppStepDirective = /** @class */ (function () {
function AppStepDirective() {
this.id = "app-step-" + nextId++;
this.disabled = false;
// @Input() disabled = true;
this.isValidStep = true;
}
Object.defineProperty(AppStepDirective.prototype, "validStep", {
// public isValidStep: boolean = false;
set:
// public isValidStep: boolean = false;
/**
* @param {?} value
* @return {?}
*/
function (value) {
this.isValidStep = (value === 'true' || value === true) ? true : false;
},
enumerable: true,
configurable: true
});
AppStepDirective.decorators = [
{ type: Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: 'gw1-step',
},] }
];
AppStepDirective.propDecorators = {
id: [{ type: Input }],
title: [{ type: Input }],
icon: [{ type: Input }],
data: [{ type: Input }],
disabled: [{ type: Input }],
validStep: [{ type: Input }],
titleTemplate: [{ type: ContentChild, args: [AppStepTitleDirective, { static: false },] }],
contentTemplate: [{ type: ContentChild, args: [AppStepContentDirective, { static: false },] }]
};
return AppStepDirective;
}());
export { AppStepDirective };
if (false) {
/** @type {?} */
AppStepDirective.prototype.id;
/** @type {?} */
AppStepDirective.prototype.title;
/** @type {?} */
AppStepDirective.prototype.icon;
/**
* Guarda Cualquier dato. Creado por el Equipo Lamb.
* @type {?}
*/
AppStepDirective.prototype.data;
/** @type {?} */
AppStepDirective.prototype.disabled;
/** @type {?} */
AppStepDirective.prototype.isValidStep;
/** @type {?} */
AppStepDirective.prototype.titleTemplate;
/** @type {?} */
AppStepDirective.prototype.contentTemplate;
}
/**
* @record
*/
export function AppStepChangeEvent() { }
if (false) {
/**
* Id de la pestaña actualmente activa.
* @type {?}
*/
AppStepChangeEvent.prototype.activeId;
/**
* Id de la pestaña recién seleccionada.
* @type {?}
*/
AppStepChangeEvent.prototype.nextId;
/**
* data guardada en la pestaña actualmente activa.
* @type {?}
*/
AppStepChangeEvent.prototype.activeData;
/**
* Función que evitará el cambio de pertaña si se llama.
* @type {?}
*/
AppStepChangeEvent.prototype.preventDefault;
}
var AppStepGroupComponent = /** @class */ (function () {
function AppStepGroupComponent(config) {
this.config = config;
this.hideContent = false;
/**
* Cuando cambia de step se destruira el contenido anterior o solo se oculatará?
*/
// @Input() destroyOnHide: boolean = true;
this.destroyOnHide = false;
/**
* Emite cuando hay cambios de steps.
*/
this.stepChange = new EventEmitter();
// tslint:disable-next-line: no-output-on-prefix
this.onComplete = new EventEmitter();
this.type = this.config.type;
this.justify = this.config.justify;
this.orientation = this.config.orientation;
this.iConfigNames = this.config.configNames;
}
Object.defineProperty(AppStepGroupComponent.prototype, "configNames", {
set: /**
* @param {?} confign
* @return {?}
*/
function (confign) {
this.iConfigNames.buttonBack = confign.buttonBack || this.iConfigNames.buttonBack;
this.iConfigNames.buttonNext = confign.buttonNext || this.iConfigNames.buttonNext;
this.iConfigNames.buttonFinish = confign.buttonFinish || this.iConfigNames.buttonFinish;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AppStepGroupComponent.prototype, "justify", {
set: /**
* @param {?} className
* @return {?}
*/
function (className) {
if (className === 'fill' || className === 'justified') {
this.justifyClass = "nav-" + className;
}
else {
this.justifyClass = "justify-content-" + className;
}
},
enumerable: true,
configurable: true
});
/**
* @param {?} stepId
* @return {?}
*/
AppStepGroupComponent.prototype.onSelect = /**
* @param {?} stepId
* @return {?}
*/
function (stepId) {
/** @type {?} */
var selectedStep = this.getStepById(stepId);
/** @type {?} */
var selectedActive = this.getStepById(this.activeId);
// console.log('selectedStep');
// console.log(selectedStep);
if (selectedStep && !selectedStep.disabled && this.activeId !== selectedStep.id) {
/** @type {?} */
var defaultPrevented_1 = false;
this.stepChange.emit({
activeId: this.activeId,
activeData: selectedActive.data || null,
nextId: selectedStep.id,
preventDefault: (/**
* @return {?}
*/
function () { defaultPrevented_1 = true; }),
});
if (!defaultPrevented_1) {
this.activeId = selectedStep.id;
}
}
};
/**
* @return {?}
*/
AppStepGroupComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
};
/**
* @return {?}
*/
AppStepGroupComponent.prototype.ngAfterContentChecked = /**
* @return {?}
*/
function () {
/** @type {?} */
var activeStep = this.getStepById(this.activeId);
this.activeId = activeStep ? activeStep.id : (this.steps.length ? this.steps.first.id : null);
};
/**
* @private
* @param {?} id
* @return {?}
*/
AppStepGroupComponent.prototype.getStepById = /**
* @private
* @param {?} id
* @return {?}
*/
function (id) {
/** @type {?} */
var stepsWithId = this.steps.filter((/**
* @param {?} step
* @return {?}
*/
function (step) { return step.id === id; }));
return stepsWithId.length ? stepsWithId[0] : null;
};
/**
* @return {?}
*/
AppStepGroupComponent.prototype.back = /**
* @return {?}
*/
function () {
/** @type {?} */
var back = this.getStepIdSplice(-1);
this.onSelect(back);
};
/**
* @return {?}
*/
AppStepGroupComponent.prototype.next = /**
* @return {?}
*/
function () {
/** @type {?} */
var next = this.getStepIdSplice(+1);
this.onSelect(next);
};
/**
* @return {?}
*/
AppStepGroupComponent.prototype.complete = /**
* @return {?}
*/
function () {
this.onComplete.emit();
};
/**
* @param {?} stepId
* @return {?}
*/
AppStepGroupComponent.prototype.current = /**
* @param {?} stepId
* @return {?}
*/
function (stepId) {
this.onSelect(stepId);
};
/**
* @private
* @param {?} condicion
* @return {?}
*/
AppStepGroupComponent.prototype.getStepIdSplice = /**
* @private
* @param {?} condicion
* @return {?}
*/
function (condicion) {
/** @type {?} */
var actual = this.activeId;
/** @type {?} */
var splice = actual.slice(0, actual.length - 1);
/** @type {?} */
var index = parseInt(actual.slice((actual.length - 1), actual.length), 10);
/** @type {?} */
var next = "" + splice + (index + (condicion));
return next;
};
Object.defineProperty(AppStepGroupComponent.prototype, "hidePrevious", {
get: /**
* @return {?}
*/
function () {
return this.activeId !== 'app-step-0';
},
enumerable: true,
configurable: true
});
Object.defineProperty(AppStepGroupComponent.prototype, "hideNext", {
get: /**
* @return {?}
*/
function () {
/** @type {?} */
var allLength = (this.steps.length - 1);
return this.activeId !== 'app-step-' + allLength;
},
enumerable: true,
configurable: true
});
/**
* @param {?} stepId
* @return {?}
*/
AppStepGroupComponent.prototype.hideLineRight = /**
* @param {?} stepId
* @return {?}
*/
function (stepId) {
/** @type {?} */
var step = parseInt(stepId.slice(stepId.length - 1, stepId.length), 10);
return (this.steps.length !== (step + 1));
};
/**
* @return {?}
*/
AppStepGroupComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
nextId = 0;
};
AppStepGroupComponent.decorators = [
{ type: Component, args: [{
selector: 'gw1-step-group',
template: "<!-- <ul class=\"nav justify-content-center\" id=\"myStep\" role=\"steplist\"> -->\r\n<ul [class]=\"'nav lamb-nav-tabs nav-' + type + (orientation == 'horizontal'? ' ' + justifyClass : ' flex-column' )\" id=\"myStep\"\r\n role=\"steplist\">\r\n\r\n <!-- <ng-template ngFor let-step [ngForOf]=\"steps\" *ngFor=\"let step of steps\"> -->\r\n <ng-template ngFor let-step [ngForOf]=\"steps\">\r\n <li class=\"nav-item\">\r\n <a [id]=\"step.id\" class=\"nav-link\" [class.active]=\"step.id === activeId\" [class.disabled]=\"step.disabled || !step.isValidStep\"\r\n role=\"step\" [attr.stepindex]=\"(step.disabled || !step.isValidStep ? '-1': undefined)\"\r\n [attr.aria-controls]=\"(!destroyOnHide || step.id === activeId ? step.id + '-panel': null)\" [attr.aria-expanded]=\"step.id === activeId\"\r\n [attr.aria-disabled]=\"step.disabled || !step.isValidStep\" (click)=\"current(step.id)\"><!---->\r\n <!-- (click)=\"!!onSelect(step.id)\" | Yo Guido declaro haber modificado el codigo de vitmar jhonson, pero si funciona la cosa...vamos con f\u00E9--> \r\n <!-- data-toggle=\"step\" aria-selected=\"true\" -->\r\n <ng-template [ngIf]=\"step.icon\">\r\n <span class=\"lamb-round-tabs\" [title]=\"step.title\">\r\n <i class=\"{{ step.icon }} lamb-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <br>\r\n <span class=\"lamb-round-text\">\r\n {{ step.title }}\r\n </span>\r\n <ng-template [ngTemplateOutlet]=\"step.titleTemplate?.templateRef\"></ng-template>\r\n </a>\r\n </li>\r\n <li class=\"nav-line\" *ngIf=\"hideLineRight(step.id)\">\r\n <div class=\"lamb-liner\"></div>\r\n </li>\r\n </ng-template>\r\n\r\n <!-- <ng-content select=\"lamb-step-head\"></ng-content> -->\r\n</ul>\r\n<div class=\"tab-content lamb-content\" id=\"myStepContent\">\r\n <!-- <ng-content select=\"lamb-step-body\"></ng-content> -->\r\n <ng-template ngFor let-step [ngForOf]=\"steps\">\r\n <!-- class=\"step-pane fade {{ step.id === activeId ? 'active': null }}\" -->\r\n <!--\r\n <div [@slideOfRight]=\"((step.id === activeId) && (status === 'next')) ? 'next': 'back'\" class=\"tab-pane {{ step.id === activeId ? 'active': 'active' }}\"\r\n *ngIf=\"!destroyOnHide || step.id === activeId\" role=\"steppanel\" [attr.aria-labelledby]=\"step.id\" id=\"{{ step.id }}-panel\"\r\n [attr.aria-expanded]=\"step.id === activeId\"> -->\r\n\r\n <div class=\"tab-pane {{ step.id === activeId ? 'active': null }}\" *ngIf=\"!destroyOnHide || step.id === activeId\" role=\"steppanel\"\r\n [attr.aria-labelledby]=\"step.id\" id=\"{{ step.id }}-panel\" [attr.aria-expanded]=\"step.id === activeId\">\r\n <div class=\"container\">\r\n <!---<div class=\"row\">\r\n <div class=\"col-md-12\">-->\r\n <ng-template [ngTemplateOutlet]=\"step.contentTemplate?.templateRef\"></ng-template>\r\n <!--</div>\r\n </div>-->\r\n </div>\r\n <!-- <div class=\"row lamb-button-manage\">\r\n <div class=\"offset-md-4 col-md-4\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\" *ngIf=\"hidePrevious\">\r\n <div class=\"form-group text-center space-20\">\r\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-secondary\" (click)=\"back()\">\r\n <span style=\"margin-right:10px;\" class=\"fa fa-arrow-left\"></span>\r\n {{ iConfigNames.buttonBack }}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"hideNext\">\r\n <div class=\"form-group text-center space-20\">\r\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-info\" [disabled]=\"!step.isValidStep\" (click)=\"next()\">\r\n {{ iConfigNames.buttonNext }}\r\n <span style=\"margin-left:10px;\" class=\"fa fa-arrow-right\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"hidePrevious && !hideNext\">\r\n <div class=\"form-group text-center space-20\">\r\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-info\" [disabled]=\"!step.isValidStep\" (click)=\"complete()\">\r\n {{ iConfigNames.buttonFinish }}\r\n <span style=\"margin-left:10px;\" class=\"fa fa-check\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </ng-template>\r\n</div>",
// animations: [Animations.slideInOut, Animations.slideOfRight],
animations: [slideOfRight],
styles: [".lamb-liner{height:2px;background:#ececec;position:relative;width:5rem;margin:0 auto;right:0;top:1.8rem;z-index:1;left:.5rem;color:#333}.tab-content{padding-top:.3rem}.nav-link{padding:0 0 5px}.nav-link .lamb-round-text{color:#000;text-transform:uppercase;font-size:.7rem}@media (max-width:550px){.lamb-liner{width:1rem}.nav-link .lamb-round-text{display:none}}.nav-link.active span.lamb-round-tabs{background:#2962ff;color:#fff}.lamb-nav-tabs{border-bottom:transparent;position:relative;margin:0 auto;box-sizing:border-box;text-align:center;padding:0 1.5rem;background-color:#fff;border-radius:1px solid #ccc}.lamb-nav-tabs li.nav-line{padding-left:0;padding-right:0}.lamb-nav-tabs li a{text-decoration:none}.lamb-button-manage{margin-top:1.5rem}span.lamb-round-tabs{width:40px;height:40px;line-height:40px;display:inline-block;border-radius:100px;background:#ececec;z-index:2;left:-1;text-align:center;font-size:1.3rem;position:relative;margin-top:.6rem;margin-bottom:0;color:#333}"]
}] }
];
/** @nocollapse */
AppStepGroupComponent.ctorParameters = function () { return [
{ type: AppStepConfig }
]; };
AppStepGroupComponent.propDecorators = {
steps: [{ type: ContentChildren, args: [AppStepDirective,] }],
activeId: [{ type: Input }],
configNames: [{ type: Input }],
destroyOnHide: [{ type: Input }],
stepChange: [{ type: Output }],
onComplete: [{ type: Output }],
justify: [{ type: Input }],
orientation: [{ type: Input }],
type: [{ type: Input }]
};
return AppStepGroupComponent;
}());
export { AppStepGroupComponent };
if (false) {
/** @type {?} */
AppStepGroupComponent.prototype.justifyClass;
/** @type {?} */
AppStepGroupComponent.prototype.hideContent;
/** @type {?} */
AppStepGroupComponent.prototype.steps;
/**
* Id del step que saldrá activado por defecto.
* @type {?}
*/
AppStepGroupComponent.prototype.activeId;
/**
* Personalizar el nombre 'Anterior | siguiente y Finalizar'
* Formato de variable : objecto
* Ej. configNames: object = {buttonBack: 'Regresar', buttonNext: 'Grabar', buttonFinish: 'Fin'}
* @type {?}
*/
AppStepGroupComponent.prototype.iConfigNames;
/**
* Cuando cambia de step se destruira el contenido anterior o solo se oculatará?
* @type {?}
*/
AppStepGroupComponent.prototype.destroyOnHide;
/**
* Emite cuando hay cambios de steps.
* @type {?}
*/
AppStepGroupComponent.prototype.stepChange;
/** @type {?} */
AppStepGroupComponent.prototype.onComplete;
/** @type {?} */
AppStepGroupComponent.prototype.orientation;
/** @type {?} */
AppStepGroupComponent.prototype.type;
/**
* @type {?}
* @private
*/
AppStepGroupComponent.prototype.config;
}
/** @type {?} */
export var APP_STEPS_COMPONENTS = [
AppStepGroupComponent,
AppStepDirective,
AppStepTitleDirective,
AppStepContentDirective,
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZ3czLXdlYi1ndWlkLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvc3RlcHMvc3RlcHMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUMzQixTQUFTLEVBQUUsWUFBWSxFQUN2QixlQUFlLEVBQUUsV0FBVyxFQUF1QixNQUFNLEVBQUUsWUFBWSxHQUMxRSxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQUkzRDtJQUlJLCtCQUFtQixXQUE2QjtRQUE3QixnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7SUFBSSxDQUFDOztnQkFKeEQsU0FBUyxTQUFDO29CQUNQLFFBQVEsRUFBRSwyQkFBMkI7aUJBQ3hDOzs7O2dCQVRvQixXQUFXOztJQVloQyw0QkFBQztDQUFBLEFBTEQsSUFLQztTQUZZLHFCQUFxQjs7O0lBQ2xCLDRDQUFvQzs7QUFHcEQ7SUFJSSxpQ0FBbUIsV0FBNkI7UUFBN0IsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO0lBQUksQ0FBQzs7Z0JBSnhELFNBQVMsU0FBQztvQkFDUCxRQUFRLEVBQUUsNkJBQTZCO2lCQUMxQzs7OztnQkFoQm9CLFdBQVc7O0lBbUJoQyw4QkFBQztDQUFBLEFBTEQsSUFLQztTQUZZLHVCQUF1Qjs7O0lBQ3BCLDhDQUFvQzs7O0lBR2hELE1BQU0sR0FBRyxDQUFDO0FBRWQ7SUFBQTtRQU1hLE9BQUUsR0FBVyxjQUFZLE1BQU0sRUFBSSxDQUFDO1FBV3BDLGFBQVEsR0FBRyxLQUFLLENBQUM7O1FBR25CLGdCQUFXLEdBQVksSUFBSSxDQUFDO0lBVXZDLENBQUM7SUFQRyxzQkFDSSx1Q0FBUztRQUhiLHVDQUF1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QUNoQyxxQkFBcUI7SUFDckIsZ0JBQWdCO0lBQ2hCLHFCQUFxQjtJQUNyQix1QkFBdUI7Q0FDMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ29tcG9uZW50LCBJbnB1dCwgUXVlcnlMaXN0LFxyXG4gICAgRGlyZWN0aXZlLCBDb250ZW50Q2hpbGQsXHJcbiAgICBDb250ZW50Q2hpbGRyZW4sIFRlbXBsYXRlUmVmLCBBZnRlckNvbnRlbnRDaGVja2VkLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHNsaWRlT2ZSaWdodCB9IGZyb20gJy4vYW5pbWF0aW9ucy9zbGlkZS1vZi1yaWdodC5hbmltYXRpb24nO1xyXG5pbXBvcnQgeyBDb25maWdOYW1lcywgQXBwU3RlcENvbmZpZyB9IGZyb20gJy4vc3RlcC1jb25maWcnO1xyXG4vLyBpbXBvcnQgeyBMYW1iU3RlcENvbmZpZywgQ29uZmlnTmFtZXMgfSBmcm9tICdAbGFtYi9zdGVwcy9zdGVwLWNvbmZpZyc7XHJcbi8vIGltcG9ydCB7IHNsaWRlT2ZSaWdodCB9IGZyb20gJ0BsYW1iL3N0ZXBzL2FuaW1hdGlvbnMvc2xpZGUtb2YtcmlnaHQuYW5pbWF0aW9uJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICduZy10ZW1wbGF0ZVthcHBTdGVwVGl0bGVdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFwcFN0ZXBUaXRsZURpcmVjdGl2ZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4pIHsgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnbmctdGVtcGxhdGVbYXBwU3RlcENvbnRlbnRdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFwcFN0ZXBDb250ZW50RGlyZWN0aXZlIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PikgeyB9XHJcbn1cclxuXHJcbmxldCBuZXh0SWQgPSAwO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogJ2d3MS1zdGVwJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFwcFN0ZXBEaXJlY3RpdmUge1xyXG5cclxuICAgIEBJbnB1dCgpIGlkOiBzdHJpbmcgPSBgYXBwLXN0ZXAtJHtuZXh0SWQrK31gO1xyXG5cclxuICAgIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XHJcblxyXG4gICAgQElucHV0KCkgaWNvbjogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR3VhcmRhIEN1YWxxdWllciBkYXRvLiBDcmVhZG8gcG9yIGVsIEVxdWlwbyBMYW1iLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBkYXRhOiBhbnk7XHJcblxyXG4gICAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIC8vIEBJbnB1dCgpIGRpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICBwdWJsaWMgaXNWYWxpZFN0ZXA6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gcHVibGljIGlzVmFsaWRTdGVwOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCB2YWxpZFN0ZXAodmFsdWU6IHN0cmluZyB8IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmlzVmFsaWRTdGVwID0gKHZhbHVlID09PSAndHJ1ZScgfHwgdmFsdWUgPT09IHRydWUpID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoQXBwU3RlcFRpdGxlRGlyZWN0aXZlLCB7c3RhdGljOiBmYWxzZX0pIHRpdGxlVGVtcGxhdGU6IEFwcFN0ZXBUaXRsZURpcmVjdGl2ZTtcclxuICAgIEBDb250ZW50Q2hpbGQoQXBwU3RlcENvbnRlbnREaXJlY3RpdmUsIHtzdGF0aWM6IGZhbHNlfSkgY29udGVudFRlbXBsYXRlOiBBcHBTdGVwQ29udGVudERpcmVjdGl2ZTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBcHBTdGVwQ2hhbmdlRXZlbnQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJZCBkZSBsYSBwZXN0YcOxYSBhY3R1YWxtZW50ZSBhY3RpdmEuXHJcbiAgICAgKi9cclxuICAgIGFjdGl2ZUlkOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZCBkZSBsYSBwZXN0YcOxYSByZWNpw6luIHNlbGVjY2lvbmFkYS5cclxuICAgICAqL1xyXG4gICAgbmV4dElkOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBkYXRhIGd1YXJkYWRhIGVuIGxhIHBlc3Rhw7FhIGFjdHVhbG1lbnRlIGFjdGl2YS5cclxuICAgICAqL1xyXG4gICAgYWN0aXZlRGF0YTogYW55O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuY2nDs24gcXVlIGV2aXRhcsOhIGVsIGNhbWJpbyBkZSBwZXJ0YcOxYSBzaSBzZSBsbGFtYS5cclxuICAgICAqL1xyXG4gICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHZvaWQ7XHJcblxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZ3cxLXN0ZXAtZ3JvdXAnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3N0ZXBzLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3N0ZXBzLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICAvLyBhbmltYXRpb25zOiBbQW5pbWF0aW9ucy5zbGlkZUluT3V0LCBBbmltYXRpb25zLnNsaWRlT2ZSaWdodF0sXHJcbiAgICBhbmltYXRpb25zOiBbc2xpZGVPZlJpZ2h0XSxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBBcHBTdGVwR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudENoZWNrZWQsIE9uRGVzdHJveSB7XHJcbiAgICBqdXN0aWZ5Q2xhc3M6IHN0cmluZztcclxuICAgIHB1YmxpYyBoaWRlQ29udGVudDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oQXBwU3RlcERpcmVjdGl2ZSkgc3RlcHM6IFF1ZXJ5TGlzdDxBcHBTdGVwRGlyZWN0aXZlPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIElkIGRlbCBzdGVwIHF1ZSBzYWxkcsOhIGFjdGl2YWRvIHBvciBkZWZlY3RvLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBhY3RpdmVJZDogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJzb25hbGl6YXIgZWwgbm9tYnJlICdBbnRlcmlvciB8IHNpZ3VpZW50ZSB5IEZpbmFsaXphcidcclxuICAgICAqIEZvcm1hdG8gZGUgdmFyaWFibGUgOiBvYmplY3RvXHJcbiAgICAgKiBFai4gY29uZmlnTmFtZXM6IG9iamVjdCA9IHtidXR0b25CYWNrOiAnUmVncmVzYXInLCBidXR0b25OZXh0OiAnR3JhYmFyJywgYnV0dG9uRmluaXNoOiAnRmluJ31cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlDb25maWdOYW1lczogQ29uZmlnTmFtZXM7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGNvbmZpZ05hbWVzKGNvbmZpZ246IENvbmZpZ05hbWVzKSB7XHJcbiAgICAgICAgdGhpcy5pQ29uZmlnTmFtZXMuYnV0dG9uQmFjayA9IGNvbmZpZ24uYnV0dG9uQmFjayB8fCB0aGlzLmlDb25maWdOYW1lcy5idXR0b25CYWNrO1xyXG4gICAgICAgIHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbk5leHQgPSBjb25maWduLmJ1dHRvbk5leHQgfHwgdGhpcy5pQ29uZmlnTmFtZXMuYnV0dG9uTmV4dDtcclxuICAgICAgICB0aGlzLmlDb25maWdOYW1lcy5idXR0b25GaW5pc2ggPSBjb25maWduLmJ1dHRvbkZpbmlzaCB8fCB0aGlzLmlDb25maWdOYW1lcy5idXR0b25GaW5pc2g7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDdWFuZG8gY2FtYmlhIGRlIHN0ZXAgc2UgZGVzdHJ1aXJhIGVsIGNvbnRlbmlkbyBhbnRlcmlvciBvIHNvbG8gc2Ugb2N1bGF0YXLDoT9cclxuICAgICAqL1xyXG4gICAgLy8gQElucHV0KCkgZGVzdHJveU9uSGlkZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBkZXN0cm95T25IaWRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0ZSBjdWFuZG8gaGF5IGNhbWJpb3MgZGUgc3RlcHMuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBzdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcHBTdGVwQ2hhbmdlRXZlbnQ+KCk7XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBvbkNvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCBqdXN0aWZ5KGNsYXNzTmFtZTogJ3N0YXJ0JyB8ICdjZW50ZXInIHwgJ2VuZCcgfCAnZmlsbCcgfCAnanVzdGlmaWVkJykge1xyXG4gICAgICAgIGlmIChjbGFzc05hbWUgPT09ICdmaWxsJyB8fCBjbGFzc05hbWUgPT09ICdqdXN0aWZpZWQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuanVzdGlmeUNsYXNzID0gYG5hdi0ke2NsYXNzTmFtZX1gO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuanVzdGlmeUNsYXNzID0gYGp1c3RpZnktY29udGVudC0ke2NsYXNzTmFtZX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblNlbGVjdChzdGVwSWQ6IHN0cmluZykge1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFN0ZXAgPSB0aGlzLmdldFN0ZXBCeUlkKHN0ZXBJZCk7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRBY3RpdmUgPSB0aGlzLmdldFN0ZXBCeUlkKHRoaXMuYWN0aXZlSWQpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZWxlY3RlZFN0ZXAnKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhzZWxlY3RlZFN0ZXApO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWRTdGVwICYmICFzZWxlY3RlZFN0ZXAuZGlzYWJsZWQgJiYgdGhpcy5hY3RpdmVJZCAhPT0gc2VsZWN0ZWRTdGVwLmlkKSB7XHJcbiAgICAgICAgICAgIGxldCBkZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc3RlcENoYW5nZS5lbWl0KFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUlkOiB0aGlzLmFjdGl2ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZURhdGE6IHNlbGVjdGVkQWN0aXZlLmRhdGEgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBuZXh0SWQ6IHNlbGVjdGVkU3RlcC5pZCxcclxuICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4geyBkZWZhdWx0UHJldmVudGVkID0gdHJ1ZTsgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmICghZGVmYXVsdFByZXZlbnRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVJZCA9IHNlbGVjdGVkU3RlcC5pZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiBBcHBTdGVwQ29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy50eXBlID0gdGhpcy5jb25maWcudHlwZTtcclxuICAgICAgICB0aGlzLmp1c3RpZnkgPSB0aGlzLmNvbmZpZy5qdXN0aWZ5O1xyXG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSB0aGlzLmNvbmZpZy5vcmllbnRhdGlvbjtcclxuICAgICAgICB0aGlzLmlDb25maWdOYW1lcyA9IHRoaXMuY29uZmlnLmNvbmZpZ05hbWVzO1xyXG4gICAgfVxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICB9XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1lbWJlci1vcmRlcmluZ1xyXG4gICAgQElucHV0KCkgb3JpZW50YXRpb246ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCc7XHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWVtYmVyLW9yZGVyaW5nXHJcbiAgICBASW5wdXQoKSB0eXBlOiAnc3RlcHNzJyB8ICdwaWxscyc7XHJcblxyXG4gICAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZVN0ZXAgPSB0aGlzLmdldFN0ZXBCeUlkKHRoaXMuYWN0aXZlSWQpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlSWQgPSBhY3RpdmVTdGVwID8gYWN0aXZlU3RlcC5pZCA6ICh0aGlzLnN0ZXBzLmxlbmd0aCA/IHRoaXMuc3RlcHMuZmlyc3QuaWQgOiBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN0ZXBCeUlkKGlkOiBzdHJpbmcpOiBBcHBTdGVwRGlyZWN0aXZlIHtcclxuICAgICAgICBjb25zdCBzdGVwc1dpdGhJZDogQXBwU3RlcERpcmVjdGl2ZVtdID0gdGhpcy5zdGVwcy5maWx0ZXIoc3RlcCA9PiBzdGVwLmlkID09PSBpZCk7XHJcbiAgICAgICAgcmV0dXJuIHN0ZXBzV2l0aElkLmxlbmd0aCA/IHN0ZXBzV2l0aElkWzBdIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYmFjaygpIHtcclxuICAgICAgICBjb25zdCBiYWNrID0gdGhpcy5nZXRTdGVwSWRTcGxpY2UoLTEpO1xyXG4gICAgICAgIHRoaXMub25TZWxlY3QoYmFjayk7XHJcblxyXG4gICAgfVxyXG4gICAgcHVibGljIG5leHQoKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuZ2V0U3RlcElkU3BsaWNlKCsxKTtcclxuXHJcbiAgICAgICAgdGhpcy5vblNlbGVjdChuZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29tcGxldGUoKSB7XHJcbiAgICAgICAgdGhpcy5vbkNvbXBsZXRlLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY3VycmVudChzdGVwSWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub25TZWxlY3Qoc3RlcElkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN0ZXBJZFNwbGljZShjb25kaWNpb246IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IGFjdHVhbCA9IHRoaXMuYWN0aXZlSWQ7XHJcbiAgICAgICAgY29uc3Qgc3BsaWNlID0gYWN0dWFsLnNsaWNlKDAsIGFjdHVhbC5sZW5ndGggLSAxKTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGFjdHVhbC5zbGljZSgoYWN0dWFsLmxlbmd0aCAtIDEpLCBhY3R1YWwubGVuZ3RoKSwgMTApO1xyXG4gICAgICAgIGNvbnN0IG5leHQgPSBgJHtzcGxpY2V9JHsoaW5kZXggKyAoY29uZGljaW9uKSl9YDtcclxuICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaGlkZVByZXZpb3VzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUlkICE9PSAnYXBwLXN0ZXAtMCc7XHJcbiAgICB9XHJcbiAgICBnZXQgaGlkZU5leHQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgYWxsTGVuZ3RoID0gKHRoaXMuc3RlcHMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlSWQgIT09ICdhcHAtc3RlcC0nICsgYWxsTGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoaWRlTGluZVJpZ2h0KHN0ZXBJZCkge1xyXG4gICAgICAgIGNvbnN0IHN0ZXAgPSBwYXJzZUludChzdGVwSWQuc2xpY2Uoc3RlcElkLmxlbmd0aCAtIDEsIHN0ZXBJZC5sZW5ndGgpLCAxMCk7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnN0ZXBzLmxlbmd0aCAhPT0gKHN0ZXAgKyAxKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIG5leHRJZCA9IDA7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBBUFBfU1RFUFNfQ09NUE9ORU5UUyA9IFtcclxuICAgIEFwcFN0ZXBHcm91cENvbXBvbmVudCxcclxuICAgIEFwcFN0ZXBEaXJlY3RpdmUsXHJcbiAgICBBcHBTdGVwVGl0bGVEaXJlY3RpdmUsXHJcbiAgICBBcHBTdGVwQ29udGVudERpcmVjdGl2ZSxcclxuXTtcclxuXHJcbiJdfQ==