UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

327 lines (326 loc) 33.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, Input, Output, EventEmitter } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { PhloxAppService } from '../../service/PhloxAppService.service'; import { AbstractWizardPane } from './AbstractWizardPane'; import { Option } from '../../decorator/Option.decorator'; import { I18N } from '../../decorator/I18N.decorator'; import { WizardModel } from '../model/WizardModel'; const /** @type {?} */ TYPE_NAME = "phx-scroll-wizard-pane"; const /** @type {?} */ CLASS_NAME = "phx-scroll-wizard-pane-div-"; export class ScrollWizardPane extends AbstractWizardPane { /** * @param {?} appSvc * @param {?} sanitizer * @param {?} elementRef */ constructor(appSvc, sanitizer, elementRef) { super(appSvc, elementRef); this.className = CLASS_NAME; this.sanitizer = sanitizer; } /** * @return {?} */ ngOnInit() { super.ngOnInit(); } /** * @param {?} event * @return {?} */ onScroll(event) { if (this.delayScrollTimer !== null && typeof this.delayScrollTimer !== 'undefined') { clearTimeout(this.delayScrollTimer); this.delayScrollTimer = null; } this.delayScrollTimer = setTimeout(() => { let /** @type {?} */ anchorIndex = this.currentStep; let /** @type {?} */ stepsCount = this.getModel().steps.length; let /** @type {?} */ lastIndex; if (stepsCount === 0) { lastIndex = 0; } else { lastIndex = this.getModel().steps.length - 1; } let /** @type {?} */ rightDom; if (typeof $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane') !== 'undefined') { if (typeof $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right') !== 'undefined') { rightDom = $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right'); } } for (let /** @type {?} */ index = 0; index < stepsCount; index++) { let /** @type {?} */ classNameIndex = this.className + index; let /** @type {?} */ classNameDom; if (rightDom !== null && rightDom !== undefined) { if (typeof $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right').find('.' + classNameIndex) !== undefined) { classNameDom = $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right').find('.' + classNameIndex); if (rightDom.scrollTop() === 0) { //scrolling start anchorIndex = 0; break; } if (Math.ceil(rightDom.scrollTop() + rightDom.innerHeight()) >= rightDom[0].scrollHeight) { //scrolling end anchorIndex = lastIndex; break; } if ((rightDom.scrollTop() + rightDom.offset().top) >= (rightDom.scrollTop() + classNameDom.offset().top)) { // find index of stepMenu scrolling anchorIndex = index; } } } } this.currentStep = anchorIndex; event.preventDefault(); }, 50); } /** * @param {?} index * @return {?} */ getClassName(index) { return this.className + index; } /** * @param {?} index * @return {?} */ showStepContent(index) { if (this.delayScrollClickTimer !== null && typeof this.delayScrollClickTimer !== 'undefined') { clearTimeout(this.delayScrollClickTimer); this.delayScrollClickTimer = null; } let /** @type {?} */ rightDom; let /** @type {?} */ classNameIndex = this.className + index; let /** @type {?} */ classNameDom; if (typeof $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane') !== 'undefined') { if (typeof $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right') !== 'undefined') { rightDom = $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right'); } } if (typeof $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right').find('.' + classNameIndex) !== 'undefined') { classNameDom = $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right').find('.' + classNameIndex); } this.delayScrollClickTimer = setTimeout(() => { if ((rightDom !== null && rightDom !== undefined) && (classNameDom !== null && classNameDom !== undefined)) { if ((classNameDom.offset() !== null && classNameDom.offset() !== undefined) && (rightDom.scrollTop() !== null && rightDom.scrollTop() !== undefined)) { rightDom.stop().animate({ scrollTop: (classNameDom.offset().top - rightDom.offset().top + rightDom.scrollTop()) + 0.7 }, 'slow'); } } }, 5); } } ScrollWizardPane.TYPE_NAME = TYPE_NAME; ScrollWizardPane.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="phx-scroll-wizard-pane"> <div class="left" [style.padding-top]="getHeaderHeight() + 'pt'" [style.padding-bottom]="getFooterHeight() + 'pt'"> <div class="header" [style.height]="getHeaderHeight() + 'pt'"> <ng-template [ngIf]="getModel() !== null && getModel().header !== null"> <ng-template [ngIf]="getModel().header.type === null"> <div *ngIf="getModel().header.imageURL !== null && getModel().header.imageURL !== ''" class="header-image"> <img src="{{getModel().header.imageURL}}"> </div> <div class="header-label">{{getModel().header.label}}</div> </ng-template> <ng-template [ngIf]="getModel().header.type !== null"> <phx-component-wrapper [type]="getModel().header.type" [data]="getModel().header.model"></phx-component-wrapper> </ng-template> </ng-template> </div> <div class="body"> <ng-template [ngIf]="getModel() !== null && getModel().steps !== null"> <div *ngFor="let item of getModel().steps; let i = index;" class="step" [class.active]="isStepSelected(i)"> <ng-template [ngIf]="item.type === null"> <div (click)="stepSelected(i)"> {{item.label}} </div> </ng-template> <ng-template [ngIf]="item.type !== null"> <phx-component-wrapper [type]="item.type" [data]="item.model" (click)="stepSelected(i)"></phx-component-wrapper> </ng-template> </div> </ng-template> </div> <div class="footer" [style.height]="getFooterHeight() + 'pt'"> <ng-template [ngIf]="getModel() !== null && getModel().footer !== null"> <ng-template [ngIf]="getModel().footer.type === null"> {{getModel().footer.label}} </ng-template> <ng-template [ngIf]="getModel().footer.type !== null"> <phx-component-wrapper [type]="getModel().footer.type" [data]="getModel().footer.model"></phx-component-wrapper> </ng-template> </ng-template> </div> </div> <div class="right" (scroll)="onScroll($event)"> <div *ngFor="let item of getModel().steps; let i = index;" [class]="getClassName(i)"> <phx-component-wrapper [class.active]="isStepSelected(i)" [type]="item.componentType" [data]="getData()" [model]="item.componentModel" [dataParent]="this" [handler]="getStepsComponentHandler()"> </phx-component-wrapper> </div> </div> </div> `, },] }, ]; /** @nocollapse */ ScrollWizardPane.ctorParameters = () => [ { type: PhloxAppService, }, { type: DomSanitizer, }, { type: ElementRef, }, ]; ScrollWizardPane.propDecorators = { "help": [{ type: Input },], "dataParent": [{ type: Input },], "ignoreParentData": [{ type: Input },], "data": [{ type: Input },], "ignoreParentDisabled": [{ type: Input },], "delegateHistory": [{ type: Input },], "onDisabled": [{ type: Input },], "onEnabled": [{ type: Input },], "loadingEnabled": [{ type: Input },], "i18nKey": [{ type: Input },], "bypass": [{ type: Input, args: ['i18nBypass',] },], "options": [{ type: Input },], "disabled": [{ type: Input },], "model": [{ type: Input },], "field": [{ type: Input },], "loadEvent": [{ type: Output, args: ['phxLoad',] },], "changeEvent": [{ type: Output, args: ['phxChange',] },], "beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },], }; tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], ScrollWizardPane.prototype, "help", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], ScrollWizardPane.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ScrollWizardPane.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], ScrollWizardPane.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ScrollWizardPane.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ScrollWizardPane.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], ScrollWizardPane.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], ScrollWizardPane.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ScrollWizardPane.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], ScrollWizardPane.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], ScrollWizardPane.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], ScrollWizardPane.prototype, "disabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", WizardModel) ], ScrollWizardPane.prototype, "model", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], ScrollWizardPane.prototype, "field", void 0); tslib_1.__decorate([ Option('load'), tslib_1.__metadata("design:type", EventEmitter) ], ScrollWizardPane.prototype, "loadEvent", void 0); tslib_1.__decorate([ Option('change'), tslib_1.__metadata("design:type", EventEmitter) ], ScrollWizardPane.prototype, "changeEvent", void 0); tslib_1.__decorate([ Option('beforeChange'), tslib_1.__metadata("design:type", EventEmitter) ], ScrollWizardPane.prototype, "beforeChangeEvent", void 0); function ScrollWizardPane_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ ScrollWizardPane.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ ScrollWizardPane.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ ScrollWizardPane.propDecorators; /** @type {?} */ ScrollWizardPane.TYPE_NAME; /** @type {?} */ ScrollWizardPane.prototype.help; /** @type {?} */ ScrollWizardPane.prototype.dataParent; /** @type {?} */ ScrollWizardPane.prototype.ignoreParentData; /** @type {?} */ ScrollWizardPane.prototype.data; /** @type {?} */ ScrollWizardPane.prototype.ignoreParentDisabled; /** @type {?} */ ScrollWizardPane.prototype.delegateHistory; /** @type {?} */ ScrollWizardPane.prototype.onDisabled; /** @type {?} */ ScrollWizardPane.prototype.onEnabled; /** @type {?} */ ScrollWizardPane.prototype.loadingEnabled; /** @type {?} */ ScrollWizardPane.prototype.i18nKey; /** @type {?} */ ScrollWizardPane.prototype.bypass; /** @type {?} */ ScrollWizardPane.prototype.options; /** @type {?} */ ScrollWizardPane.prototype.disabled; /** @type {?} */ ScrollWizardPane.prototype.model; /** @type {?} */ ScrollWizardPane.prototype.field; /** @type {?} */ ScrollWizardPane.prototype.loadEvent; /** @type {?} */ ScrollWizardPane.prototype.changeEvent; /** @type {?} */ ScrollWizardPane.prototype.beforeChangeEvent; /** @type {?} */ ScrollWizardPane.prototype.delayScrollTimer; /** @type {?} */ ScrollWizardPane.prototype.delayScrollClickTimer; /** @type {?} */ ScrollWizardPane.prototype.sanitizer; /** @type {?} */ ScrollWizardPane.prototype.className; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Nyb2xsV2l6YXJkUGFuZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvU2Nyb2xsV2l6YXJkUGFuZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUF3QixVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFlBQVksRUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDMUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXRELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUluRCx1QkFBTSxTQUFTLEdBQVcsd0JBQXdCLENBQUM7QUFFbkQsdUJBQU0sVUFBVSxHQUFRLDZCQUE2QixDQUFDO0FBc0R0RCxNQUFNLHVCQUF3QixTQUFRLGtCQUFrQjs7Ozs7O0lBMEV0RCxZQUFZLE1BQXVCLEVBQUUsU0FBdUIsRUFBRSxVQUFzQjtRQUNsRixLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO3lCQUhBLFVBQVU7UUFLcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7S0FDNUI7Ozs7SUFFTSxRQUFRO1FBQ2IsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDOzs7Ozs7SUFHWixRQUFRLENBQUMsS0FBVTtRQUN4QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLGdCQUFn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Ozs7SUFHM0IsTUFBTSxFQUFFOzs7O0lBTVIsTUFBTSxDQUFDLE1BQU0sQ0FBQztzQ0FDTSxZQUFZOzs7SUFHaEMsTUFBTSxDQUFDLFFBQVEsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFbEMsTUFBTSxDQUFDLGNBQWMsQ0FBQztzQ0FDTSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IFBobG94QXBwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvUGhsb3hBcHBTZXJ2aWNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJSGFzTW9kZWwgfSBmcm9tICcuLi9JSGFzTW9kZWwnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdFdpemFyZFBhbmUgfSBmcm9tICcuL0Fic3RyYWN0V2l6YXJkUGFuZSc7XHJcbmltcG9ydCB7IElDaGFuZ2VhYmxlIH0gZnJvbSAnLi4vSUNoYW5nZWFibGUnO1xyXG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi8uLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IEkxOE4gfSBmcm9tICcuLi8uLi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudC9JSGFzRGF0YSc7XHJcbmltcG9ydCB7IFdpemFyZE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvV2l6YXJkTW9kZWwnO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5cclxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1zY3JvbGwtd2l6YXJkLXBhbmVcIjtcclxuXHJcbmNvbnN0IENMQVNTX05BTUU6IGFueSA9IFwicGh4LXNjcm9sbC13aXphcmQtcGFuZS1kaXYtXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxyXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LXNjcm9sbC13aXphcmQtcGFuZVwiPlxuXHQ8ZGl2IGNsYXNzPVwibGVmdFwiIFtzdHlsZS5wYWRkaW5nLXRvcF09XCJnZXRIZWFkZXJIZWlnaHQoKSArICdwdCdcIiBbc3R5bGUucGFkZGluZy1ib3R0b21dPVwiZ2V0Rm9vdGVySGVpZ2h0KCkgKyAncHQnXCI+XG5cdFx0PGRpdiBjbGFzcz1cImhlYWRlclwiIFtzdHlsZS5oZWlnaHRdPVwiZ2V0SGVhZGVySGVpZ2h0KCkgKyAncHQnXCI+XG5cdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKSAhPT0gbnVsbCAmJiBnZXRNb2RlbCgpLmhlYWRlciAhPT0gbnVsbFwiPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKS5oZWFkZXIudHlwZSA9PT0gbnVsbFwiPlxuXHRcdFx0XHRcdDxkaXYgKm5nSWY9XCJnZXRNb2RlbCgpLmhlYWRlci5pbWFnZVVSTCAhPT0gbnVsbCAmJiBnZXRNb2RlbCgpLmhlYWRlci5pbWFnZVVSTCAhPT0gJydcIiBjbGFzcz1cImhlYWRlci1pbWFnZVwiPlxuXHRcdFx0XHRcdFx0PGltZyBzcmM9XCJ7e2dldE1vZGVsKCkuaGVhZGVyLmltYWdlVVJMfX1cIj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGVyLWxhYmVsXCI+e3tnZXRNb2RlbCgpLmhlYWRlci5sYWJlbH19PC9kaXY+XG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpLmhlYWRlci50eXBlICE9PSBudWxsXCI+XG5cdFx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciBbdHlwZV09XCJnZXRNb2RlbCgpLmhlYWRlci50eXBlXCIgW2RhdGFdPVwiZ2V0TW9kZWwoKS5oZWFkZXIubW9kZWxcIj48L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdiBjbGFzcz1cImJvZHlcIj5cblx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpICE9PSBudWxsICYmIGdldE1vZGVsKCkuc3RlcHMgIT09IG51bGxcIj5cblx0XHRcdFx0PGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRNb2RlbCgpLnN0ZXBzOyBsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwic3RlcFwiIFtjbGFzcy5hY3RpdmVdPVwiaXNTdGVwU2VsZWN0ZWQoaSlcIj5cblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiaXRlbS50eXBlID09PSBudWxsXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IChjbGljayk9XCJzdGVwU2VsZWN0ZWQoaSlcIj4ge3tpdGVtLmxhYmVsfX0gPC9kaXY+XG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiaXRlbS50eXBlICE9PSBudWxsXCI+XG5cdFx0XHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyIFt0eXBlXT1cIml0ZW0udHlwZVwiIFtkYXRhXT1cIml0ZW0ubW9kZWxcIiAoY2xpY2spPVwic3RlcFNlbGVjdGVkKGkpXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdDwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJmb290ZXJcIiBbc3R5bGUuaGVpZ2h0XT1cImdldEZvb3RlckhlaWdodCgpICsgJ3B0J1wiPlxuXHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkgIT09IG51bGwgJiYgZ2V0TW9kZWwoKS5mb290ZXIgIT09IG51bGxcIj5cblx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkuZm9vdGVyLnR5cGUgPT09IG51bGxcIj5cblx0XHRcdFx0XHR7e2dldE1vZGVsKCkuZm9vdGVyLmxhYmVsfX1cblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkuZm9vdGVyLnR5cGUgIT09IG51bGxcIj5cblx0XHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyIFt0eXBlXT1cImdldE1vZGVsKCkuZm9vdGVyLnR5cGVcIiBbZGF0YV09XCJnZXRNb2RlbCgpLmZvb3Rlci5tb2RlbFwiPjwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJyaWdodFwiIChzY3JvbGwpPVwib25TY3JvbGwoJGV2ZW50KVwiPlxuXHRcdFx0PGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRNb2RlbCgpLnN0ZXBzOyBsZXQgaSA9IGluZGV4O1wiIFtjbGFzc109XCJnZXRDbGFzc05hbWUoaSlcIj5cblx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciBbY2xhc3MuYWN0aXZlXT1cImlzU3RlcFNlbGVjdGVkKGkpXCIgW3R5cGVdPVwiaXRlbS5jb21wb25lbnRUeXBlXCJcblx0XHRcdFx0XHRbZGF0YV09XCJnZXREYXRhKClcIiBbbW9kZWxdPVwiaXRlbS5jb21wb25lbnRNb2RlbFwiIFtkYXRhUGFyZW50XT1cInRoaXNcIiBbaGFuZGxlcl09XCJnZXRTdGVwc0NvbXBvbmVudEhhbmRsZXIoKVwiPlxuXHRcdFx0XHQ8L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cblx0XHRcdDwvZGl2PlxuXHQ8L2Rpdj5cbjwvZGl2PlxuYCxcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgU2Nyb2xsV2l6YXJkUGFuZSBleHRlbmRzIEFic3RyYWN0V2l6YXJkUGFuZSBpbXBsZW1lbnRzIE9uSW5pdCwgSUhhc01vZGVsLCBJQ2hhbmdlYWJsZSB7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XHJcblxyXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBASW5wdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhSGVscFxyXG4gIEBJbnB1dCgpXHJcbiAgQEkxOE4oKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWxwOiBhbnk7XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGVsZWdhdGVIaXN0b3J5OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbG9hZGluZ0VuYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaTE4bktleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgnaTE4bkJ5cGFzcycpXHJcbiAgQE9wdGlvbignaTE4bkJ5cGFzcycpXHJcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBvcHRpb25zOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RXaXphcmRQYW5lXHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbW9kZWw6IFdpemFyZE1vZGVsO1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0YVZpZXdcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBmaWVsZDogc3RyaW5nO1xyXG5cclxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQE91dHB1dC5cclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcclxuICBAT3V0cHV0KCdwaHhMb2FkJylcclxuICBAT3B0aW9uKCdsb2FkJylcclxuICBwcm90ZWN0ZWQgbG9hZEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdFdpemFyZFBhbmVcclxuICBAT3V0cHV0KCdwaHhDaGFuZ2UnKVxyXG4gIEBPcHRpb24oJ2NoYW5nZScpXHJcbiAgcHJvdGVjdGVkIGNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVDaGFuZ2UnKVxyXG4gIEBPcHRpb24oJ2JlZm9yZUNoYW5nZScpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgcHJpdmF0ZSBkZWxheVNjcm9sbFRpbWVyOiBhbnk7XHJcbiAgcHJpdmF0ZSBkZWxheVNjcm9sbENsaWNrVGltZXI6IGFueTtcclxuICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyO1xuXG4gIHByaXZhdGUgY2xhc3NOYW1lOiBzdHJpbmcgPSBDTEFTU19OQU1FO1xuXG4gIGNvbnN0cnVjdG9yKGFwcFN2YzogUGhsb3hBcHBTZXJ2aWNlLCBzYW5pdGl6ZXI6IERvbVNhbml0aXplciwgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgc3VwZXIoYXBwU3ZjLCBlbGVtZW50UmVmKTtcclxuXHJcbiAgICB0aGlzLnNhbml0aXplciA9IHNhbml0aXplcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgfVxyXG5cbiAgcHVibGljIG9uU2Nyb2xsKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZWxheVNjcm9sbFRpbWVyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRlbGF5U2Nyb2xsVGltZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWxheVNjcm9sbFRpbWVyKTtcbiAgICAgIHRoaXMuZGVsYXlTY3JvbGxUaW1lciA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kZWxheVNjcm9sbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBsZXQgYW5jaG9ySW5kZXg6IGFueSA9IHRoaXMuY3VycmVudFN0ZXA7XG4gICAgICBsZXQgc3RlcHNDb3VudDogbnVtYmVyID0gdGhpcy5nZXRNb2RlbCgpLnN0ZXBzLmxlbmd0aDtcbiAgICAgIGxldCBsYXN0SW5kZXg6IG51bWJlcjtcblxuICAgICAgaWYgKHN0ZXBzQ291bnQgPT09IDApIHtcbiAgICAgICAgbGFzdEluZGV4ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxhc3RJbmRleCA9IHRoaXMuZ2V0TW9kZWwoKS5zdGVwcy5sZW5ndGggLSAxO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmlnaHREb206IGFueTtcblxuICAgICAgaWYgKHR5cGVvZiAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcucGh4LXNjcm9sbC13aXphcmQtcGFuZScpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodHlwZW9mICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5waHgtc2Nyb2xsLXdpemFyZC1wYW5lJykuZmluZCgnLnJpZ2h0JykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcmlnaHREb20gPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcucGh4LXNjcm9sbC13aXphcmQtcGFuZScpLmZpbmQoJy5yaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzdGVwc0NvdW50OyBpbmRleCsrKSB7XG4gICAgICAgIGxldCBjbGFzc05hbWVJbmRleDogYW55ID0gdGhpcy5jbGFzc05hbWUgKyBpbmRleDtcbiAgICAgICAgbGV0IGNsYXNzTmFtZURvbTogYW55O1xuXG4gICAgICAgIGlmIChyaWdodERvbSAhPT0gbnVsbCAmJiByaWdodERvbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcucGh4LXNjcm9sbC13aXphcmQtcGFuZScpLmZpbmQoJy5yaWdodCcpLmZpbmQoJy4nICsgY2xhc3NOYW1lSW5kZXgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZURvbSA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5waHgtc2Nyb2xsLXdpemFyZC1wYW5lJykuZmluZCgnLnJpZ2h0JykuZmluZCgnLicgKyBjbGFzc05hbWVJbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChyaWdodERvbS5zY3JvbGxUb3AoKSA9PT0gMCkgeyAvL3Njcm9sbGluZyBzdGFydFxuICAgICAgICAgICAgICBhbmNob3JJbmRleCA9IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoTWF0aC5jZWlsKHJpZ2h0RG9tLnNjcm9sbFRvcCgpICsgcmlnaHREb20uaW5uZXJIZWlnaHQoKSkgPj0gcmlnaHREb21bMF0uc2Nyb2xsSGVpZ2h0KSB7IC8vc2Nyb2xsaW5nIGVuZFxuICAgICAgICAgICAgICBhbmNob3JJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgocmlnaHREb20uc2Nyb2xsVG9wKCkgKyByaWdodERvbS5vZmZzZXQoKS50b3ApID49IChyaWdodERvbS5zY3JvbGxUb3AoKSArIGNsYXNzTmFtZURvbS5vZmZzZXQoKS50b3ApKSB7IC8vIGZpbmQgaW5kZXggb2Ygc3RlcE1lbnUgIHNjcm9sbGluZ1xuICAgICAgICAgICAgICBhbmNob3JJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRTdGVwID0gYW5jaG9ySW5kZXg7XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSwgNTApO1xuICB9XG5cbiAgcHVibGljIGdldENsYXNzTmFtZShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc05hbWUgKyBpbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBzaG93U3RlcENvbnRlbnQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGVsYXlTY3JvbGxDbGlja1RpbWVyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRlbGF5U2Nyb2xsQ2xpY2tUaW1lciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZGVsYXlTY3JvbGxDbGlja1RpbWVyKTtcclxuICAgICAgdGhpcy5kZWxheVNjcm9sbENsaWNrVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByaWdodERvbTogYW55O1xyXG4gICAgbGV0IGNsYXNzTmFtZUluZGV4OiBhbnkgPSB0aGlzLmNsYXNzTmFtZSArIGluZGV4O1xyXG4gICAgbGV0IGNsYXNzTmFtZURvbTogYW55O1xyXG5cclxuICAgIGlmICh0eXBlb2YgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLnBoeC1zY3JvbGwtd2l6YXJkLXBhbmUnKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgaWYgKHR5cGVvZiAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcucGh4LXNjcm9sbC13aXphcmQtcGFuZScpLmZpbmQoJy5yaWdodCcpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJpZ2h0RG9tID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLnBoeC1zY3JvbGwtd2l6YXJkLXBhbmUnKS5maW5kKCcucmlnaHQnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLnBoeC1zY3JvbGwtd2l6YXJkLXBhbmUnKS5maW5kKCcucmlnaHQnKS5maW5kKCcuJyArIGNsYXNzTmFtZUluZGV4KSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgY2xhc3NOYW1lRG9tID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLnBoeC1zY3JvbGwtd2l6YXJkLXBhbmUnKS5maW5kKCcucmlnaHQnKS5maW5kKCcuJyArIGNsYXNzTmFtZUluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRlbGF5U2Nyb2xsQ2xpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoKHJpZ2h0RG9tICE9PSBudWxsICYmIHJpZ2h0RG9tICE9PSB1bmRlZmluZWQpICYmIChjbGFzc05hbWVEb20gIT09IG51bGwgJiYgY2xhc3NOYW1lRG9tICE9PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgaWYgKChjbGFzc05hbWVEb20ub2Zmc2V0KCkgIT09IG51bGwgJiYgY2xhc3NOYW1lRG9tLm9mZnNldCgpICE9PSB1bmRlZmluZWQpICYmIChyaWdodERvbS5zY3JvbGxUb3AoKSAhPT0gbnVsbCAmJiByaWdodERvbS5zY3JvbGxUb3AoKSAhPT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgcmlnaHREb20uc3RvcCgpLmFuaW1hdGUoeyBzY3JvbGxUb3A6IChjbGFzc05hbWVEb20ub2Zmc2V0KCkudG9wIC0gcmlnaHREb20ub2Zmc2V0KCkudG9wICsgcmlnaHREb20uc2Nyb2xsVG9wKCkpICsgMC43IH0sICdzbG93Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCA1KTtcclxuICB9XHJcbn1cclxuIl19