com.phloxui
Version:
PhloxUI Ng2+ Framework
202 lines (201 loc) • 19.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, HostListener, ElementRef } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { PhloxAppService } from '../service/PhloxAppService.service';
import { AbstractWizardPane } from './AbstractWizardPane';
const /** @type {?} */ TYPE_NAME = "phx-scroll-pagination-wizard-pane";
const /** @type {?} */ INDEX_Y_0 = "INDEX_Y_0";
const /** @type {?} */ UP = "UP";
const /** @type {?} */ DOWN = "DOWN";
export class ScrollPaginationWizardPane extends AbstractWizardPane {
/**
* @param {?} appSvc
* @param {?} sanitizer
* @param {?} elementRef
*/
constructor(appSvc, sanitizer, elementRef) {
super(appSvc, elementRef);
this.sanitizer = sanitizer;
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
}
/**
* @param {?} event
* @return {?}
*/
onmousewheel(event) {
clearTimeout(this.delayMouseWheelTimer);
this.delayMouseWheelTimer = null;
this.delayMouseWheelTimer = setTimeout(() => {
event = window.event || event;
let /** @type {?} */ delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail)));
if (delta > -1) {
// mouseWheel up
if (this.currentStep !== 0) {
this.currentStep -= 1;
if (this.currentStep === 0) {
this.setSafeStyleIndexY(INDEX_Y_0);
}
else {
this.setSafeStyleIndexY(UP);
}
}
}
else {
// mouseWheel down
if (this.getModel().steps.length > 0) {
let /** @type {?} */ stepsIndex = this.getModel().steps.length - 1;
if (this.currentStep < stepsIndex) {
this.currentStep += 1;
this.setSafeStyleIndexY(DOWN);
}
}
}
event.preventDefault();
}, 250);
}
/**
* @param {?} mouseWheel
* @return {?}
*/
setSafeStyleIndexY(mouseWheel) {
let /** @type {?} */ y;
let /** @type {?} */ index = this.currentStep;
if (mouseWheel === DOWN || mouseWheel === UP) {
// set Style translate3d = (0, -(index * 100), 0);
y = -(index * 100);
}
else if (mouseWheel === INDEX_Y_0) {
// set Style translate3d = (0, 0, 0);
y = 0;
}
else {
// default set Style translate3d = (0, 0, 0);
y = 0;
}
this.safeStyle = this.sanitizer.bypassSecurityTrustStyle("translate3d( 0, " + y + "%, 0 )");
}
/**
* @return {?}
*/
getSafeStyle() {
return this.safeStyle;
}
/**
* @param {?} index
* @return {?}
*/
showStepContent(index) {
let /** @type {?} */ y;
if (index !== 0) {
// set Style translate3d = (0, -(index * 100), 0);
y = -(index * 100);
}
else if (index === 0) {
// set Style translate3d = (0, 0, 0);
y = 0;
}
else {
// default set Style translate3d = (0, 0, 0);
y = 0;
}
this.safeStyle = this.sanitizer.bypassSecurityTrustStyle("translate3d( 0, " + y + "%, 0 )");
}
/**
* @param {?} index
* @return {?}
*/
getStepInstance(index) { }
}
ScrollPaginationWizardPane.TYPE_NAME = TYPE_NAME;
ScrollPaginationWizardPane.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: 'phx-scroll-pagination-wizard-pane',
template: `<div class="phx-scroll-pagination-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">
<div class="scrollpage" [style.transform]="getSafeStyle()">
<div *ngFor="let item of getModel().steps; let i = index;" style="height: 100%;">
<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>
</div>
`,
},] },
];
/** @nocollapse */
ScrollPaginationWizardPane.ctorParameters = () => [
{ type: PhloxAppService, },
{ type: DomSanitizer, },
{ type: ElementRef, },
];
ScrollPaginationWizardPane.propDecorators = {
"onmousewheel": [{ type: HostListener, args: ['mousewheel', ['$event'],] },],
};
function ScrollPaginationWizardPane_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
ScrollPaginationWizardPane.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
ScrollPaginationWizardPane.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
ScrollPaginationWizardPane.propDecorators;
/** @type {?} */
ScrollPaginationWizardPane.TYPE_NAME;
/** @type {?} */
ScrollPaginationWizardPane.prototype.delayMouseWheelTimer;
/** @type {?} */
ScrollPaginationWizardPane.prototype.sanitizer;
/** @type {?} */
ScrollPaginationWizardPane.prototype.safeStyle;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Nyb2xsUGFnaW5hdGlvbldpemFyZFBhbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L1Njcm9sbFBhZ2luYXRpb25XaXphcmRQYW5lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQWEsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFLMUQsdUJBQU0sU0FBUyxHQUFXLG1DQUFtQyxDQUFDO0FBRTlELHVCQUFNLFNBQVMsR0FBVyxXQUFXLENBQUM7QUFDdEMsdUJBQU0sRUFBRSxHQUFRLElBQUksQ0FBQztBQUNyQix1QkFBTSxJQUFJLEdBQVEsTUFBTSxDQUFDO0FBeUR6QixNQUFNLGlDQUFrQyxTQUFRLGtCQUFrQjs7Ozs7O0lBUWhFLFlBQVksTUFBdUIsRUFBRSxTQUF1QixFQUFFLFVBQXNCO1FBQ2xGLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7S0FDNUI7Ozs7SUFFTSxRQUFRO1FBQ2IsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDOzs7Ozs7SUFJWixZQUFZLENBQUMsS0FBVTtRQUM1QixZQUFZLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFeEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUVqQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUUxQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFB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RyxRQUFRLENBQUMsQ0FBQzs7Ozs7O0lBR3ZGLGVBQWUsQ0FBQyxLQUFhOzt1Q0FyRk8sU0FBUzs7WUF6RHJELFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ25CLFFBQVEsRUFBRSxtQ0FBbUM7Z0JBQzdDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBZ0RYO2FBQ0E7Ozs7WUFqRVEsZUFBZTtZQURmLFlBQVk7WUFEcUIsVUFBVTs7OzZCQXVGakQsWUFBWSxTQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBIb3N0TGlzdGVuZXIsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlU3R5bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgUGhsb3hBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9QaGxveEFwcFNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4vSUhhc01vZGVsJztcclxuaW1wb3J0IHsgQWJzdHJhY3RXaXphcmRQYW5lIH0gZnJvbSAnLi9BYnN0cmFjdFdpemFyZFBhbmUnO1xyXG5pbXBvcnQgeyBJQ2hhbmdlYWJsZSB9IGZyb20gJy4vSUNoYW5nZWFibGUnO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5cclxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1zY3JvbGwtcGFnaW5hdGlvbi13aXphcmQtcGFuZVwiO1xyXG5cclxuY29uc3QgSU5ERVhfWV8wOiBzdHJpbmcgPSBcIklOREVYX1lfMFwiO1xyXG5jb25zdCBVUDogYW55ID0gXCJVUFwiO1xyXG5jb25zdCBET1dOOiBhbnkgPSBcIkRPV05cIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXHJcbiAgc2VsZWN0b3I6ICdwaHgtc2Nyb2xsLXBhZ2luYXRpb24td2l6YXJkLXBhbmUnLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBoeC1zY3JvbGwtcGFnaW5hdGlvbi13aXphcmQtcGFuZVwiPlxyXG5cdDxkaXYgY2xhc3M9XCJsZWZ0XCIgW3N0eWxlLnBhZGRpbmctdG9wXT1cImdldEhlYWRlckhlaWdodCgpICsgJ3B0J1wiIFtzdHlsZS5wYWRkaW5nLWJvdHRvbV09XCJnZXRGb290ZXJIZWlnaHQoKSArICdwdCdcIj5cclxuXHRcdDxkaXYgY2xhc3M9XCJoZWFkZXJcIiBbc3R5bGUuaGVpZ2h0XT1cImdldEhlYWRlckhlaWdodCgpICsgJ3B0J1wiPlxyXG5cdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKSAhPT0gbnVsbCAmJiBnZXRNb2RlbCgpLmhlYWRlciAhPT0gbnVsbFwiPlxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpLmhlYWRlci50eXBlID09PSBudWxsXCI+XHJcblx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiZ2V0TW9kZWwoKS5oZWFkZXIuaW1hZ2VVUkwgIT09IG51bGwgJiYgZ2V0TW9kZWwoKS5oZWFkZXIuaW1hZ2VVUkwgIT09ICcnXCIgY2xhc3M9XCJoZWFkZXItaW1hZ2VcIj5cclxuXHRcdFx0XHRcdFx0PGltZyBzcmM9XCJ7e2dldE1vZGVsKCkuaGVhZGVyLmltYWdlVVJMfX1cIj5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhlYWRlci1sYWJlbFwiPnt7Z2V0TW9kZWwoKS5oZWFkZXIubGFiZWx9fTwvZGl2PlxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkuaGVhZGVyLnR5cGUgIT09IG51bGxcIj5cclxuXHRcdFx0XHRcdDxwaHgtY29tcG9uZW50LXdyYXBwZXIgW3R5cGVdPVwiZ2V0TW9kZWwoKS5oZWFkZXIudHlwZVwiIFtkYXRhXT1cImdldE1vZGVsKCkuaGVhZGVyLm1vZGVsXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XHJcblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdDwvZGl2PlxyXG5cdFx0PGRpdiBjbGFzcz1cImJvZHlcIj5cclxuXHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkgIT09IG51bGwgJiYgZ2V0TW9kZWwoKS5zdGVwcyAhPT0gbnVsbFwiPlxyXG5cdFx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0TW9kZWwoKS5zdGVwczsgbGV0IGkgPSBpbmRleDtcIiBjbGFzcz1cInN0ZXBcIiBbY2xhc3MuYWN0aXZlXT1cImlzU3RlcFNlbGVjdGVkKGkpXCI+XHJcblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiaXRlbS50eXBlID09PSBudWxsXCI+XHJcblx0XHRcdFx0XHRcdDxkaXYgKGNsaWNrKT1cInN0ZXBTZWxlY3RlZChpKVwiPiB7e2l0ZW0ubGFiZWx9fSA8L2Rpdj5cclxuXHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiaXRlbS50eXBlICE9PSBudWxsXCI+XHJcblx0XHRcdFx0XHRcdDxwaHgtY29tcG9uZW50LXdyYXBwZXIgW3R5cGVdPVwiaXRlbS50eXBlXCIgW2RhdGFdPVwiaXRlbS5tb2RlbFwiIChjbGljayk9XCJzdGVwU2VsZWN0ZWQoaSlcIj48L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cclxuXHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHQ8L2Rpdj5cclxuXHRcdDxkaXYgY2xhc3M9XCJmb290ZXJcIiBbc3R5bGUuaGVpZ2h0XT1cImdldEZvb3RlckhlaWdodCgpICsgJ3B0J1wiPlxyXG5cdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKSAhPT0gbnVsbCAmJiBnZXRNb2RlbCgpLmZvb3RlciAhPT0gbnVsbFwiPlxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpLmZvb3Rlci50eXBlID09PSBudWxsXCI+XHJcblx0XHRcdFx0XHR7e2dldE1vZGVsKCkuZm9vdGVyLmxhYmVsfX1cclxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpLmZvb3Rlci50eXBlICE9PSBudWxsXCI+XHJcblx0XHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyIFt0eXBlXT1cImdldE1vZGVsKCkuZm9vdGVyLnR5cGVcIiBbZGF0YV09XCJnZXRNb2RlbCgpLmZvb3Rlci5tb2RlbFwiPjwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHQ8ZGl2IGNsYXNzPVwicmlnaHRcIj5cclxuXHRcdDxkaXYgY2xhc3M9XCJzY3JvbGxwYWdlXCIgW3N0eWxlLnRyYW5zZm9ybV09XCJnZXRTYWZlU3R5bGUoKVwiPlxyXG5cdFx0XHQ8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldE1vZGVsKCkuc3RlcHM7IGxldCBpID0gaW5kZXg7XCIgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7XCI+XHJcblx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciBbY2xhc3MuYWN0aXZlXT1cImlzU3RlcFNlbGVjdGVkKGkpXCIgW3R5cGVdPVwiaXRlbS5jb21wb25lbnRUeXBlXCJcclxuXHRcdFx0XHRcdFtkYXRhXT1cImdldERhdGEoKVwiIFttb2RlbF09XCJpdGVtLmNvbXBvbmVudE1vZGVsXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiIFtoYW5kbGVyXT1cImdldFN0ZXBzQ29tcG9uZW50SGFuZGxlcigpXCI+XHJcblx0XHRcdFx0PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0PC9kaXY+XHJcblx0PC9kaXY+XHJcbjwvZGl2PlxyXG5gLFxyXG59KVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBTY3JvbGxQYWdpbmF0aW9uV2l6YXJkUGFuZSBleHRlbmRzIEFic3RyYWN0V2l6YXJkUGFuZSBpbXBsZW1lbnRzIE9uSW5pdCwgSUhhc01vZGVsLCBJQ2hhbmdlYWJsZSB7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XHJcblxyXG4gIHByaXZhdGUgZGVsYXlNb3VzZVdoZWVsVGltZXI6IGFueTtcclxuICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyO1xyXG4gIHByaXZhdGUgc2FmZVN0eWxlOiBTYWZlU3R5bGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGFwcFN2YzogUGhsb3hBcHBTZXJ2aWNlLCBzYW5pdGl6ZXI6IERvbVNhbml0aXplciwgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgc3VwZXIoYXBwU3ZjLCBlbGVtZW50UmVmKTtcclxuICAgIHRoaXMuc2FuaXRpemVyID0gc2FuaXRpemVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNld2hlZWwnLCBbJyRldmVudCddKVxyXG4gIHB1YmxpYyBvbm1vdXNld2hlZWwoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZGVsYXlNb3VzZVdoZWVsVGltZXIpO1xyXG5cclxuICAgIHRoaXMuZGVsYXlNb3VzZVdoZWVsVGltZXIgPSBudWxsO1xyXG5cclxuICAgIHRoaXMuZGVsYXlNb3VzZVdoZWVsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgIGV2ZW50ID0gd2luZG93LmV2ZW50IHx8IGV2ZW50O1xyXG5cclxuICAgICAgbGV0IGRlbHRhOiBudW1iZXIgPSBNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgKGV2ZW50LndoZWVsRGVsdGEgfHwgLWV2ZW50LmRldGFpbCkpKTtcclxuXHJcbiAgICAgIGlmIChkZWx0YSA+IC0xKSB7IC8vIG1vdXNlV2hlZWwgdXBcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RlcCAhPT0gMCkge1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50U3RlcCAtPSAxO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2FmZVN0eWxlSW5kZXhZKElOREVYX1lfMCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldFNhZmVTdHlsZUluZGV4WShVUCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgeyAgIC8vIG1vdXNlV2hlZWwgZG93blxyXG4gICAgICAgIGlmICh0aGlzLmdldE1vZGVsKCkuc3RlcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IHN0ZXBzSW5kZXg6IG51bWJlciA9IHRoaXMuZ2V0TW9kZWwoKS5zdGVwcy5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwIDwgc3RlcHNJbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwICs9IDE7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2FmZVN0eWxlSW5kZXhZKERPV04pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH0sIDI1MCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U2FmZVN0eWxlSW5kZXhZKG1vdXNlV2hlZWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHk6IGFueTtcclxuICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudFN0ZXA7XHJcblxyXG4gICAgaWYgKG1vdXNlV2hlZWwgPT09IERPV04gfHwgbW91c2VXaGVlbCA9PT0gVVApIHsgLy8gc2V0IFN0eWxlIHRyYW5zbGF0ZTNkID0gICgwLCAtKGluZGV4ICogMTAwKSwgMCk7XHJcbiAgICAgIHkgPSAtKGluZGV4ICogMTAwKTtcclxuICAgIH0gZWxzZSBpZiAobW91c2VXaGVlbCA9PT0gSU5ERVhfWV8wKSB7IC8vIHNldCBTdHlsZSB0cmFuc2xhdGUzZCA9ICAoMCwgMCwgMCk7XHJcbiAgICAgIHkgPSAwO1xyXG4gICAgfSBlbHNlIHsgLy8gZGVmYXVsdCAgc2V0IFN0eWxlIHRyYW5zbGF0ZTNkID0gICgwLCAwLCAwKTtcclxuICAgICAgeSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zYWZlU3R5bGUgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoXCJ0cmFuc2xhdGUzZCggMCwgXCIgKyB5ICsgXCIlLCAwIClcIik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2FmZVN0eWxlKCk6IFNhZmVTdHlsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5zYWZlU3R5bGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd1N0ZXBDb250ZW50KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB5OiBhbnk7XHJcblxyXG4gICAgaWYgKGluZGV4ICE9PSAwKSB7IC8vIHNldCBTdHlsZSB0cmFuc2xhdGUzZCA9ICAoMCwgLShpbmRleCAqIDEwMCksIDApO1xyXG4gICAgICB5ID0gLShpbmRleCAqIDEwMCk7XHJcbiAgICB9IGVsc2UgaWYgKGluZGV4ID09PSAwKSB7IC8vIHNldCBTdHlsZSB0cmFuc2xhdGUzZCA9ICAoMCwgMCwgMCk7XHJcbiAgICAgIHkgPSAwO1xyXG4gICAgfSBlbHNlIHsgLy8gZGVmYXVsdCAgc2V0IFN0eWxlIHRyYW5zbGF0ZTNkID0gICgwLCAwLCAwKTtcclxuICAgICAgeSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zYWZlU3R5bGUgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoXCJ0cmFuc2xhdGUzZCggMCwgXCIgKyB5ICsgXCIlLCAwIClcIik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U3RlcEluc3RhbmNlKGluZGV4OiBudW1iZXIpOiBhbnkgeyB9XHJcbn1cclxuIl19