com.phloxui
Version:
PhloxUI Ng2+ Framework
329 lines (328 loc) • 28.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, HostListener, 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-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 = {
"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 },],
"field": [{ type: Input },],
"model": [{ type: Input },],
"loadEvent": [{ type: Output, args: ['phxLoad',] },],
"changeEvent": [{ type: Output, args: ['phxChange',] },],
"beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },],
"onmousewheel": [{ type: HostListener, args: ['mousewheel', ['$event'],] },],
};
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Object)
], ScrollPaginationWizardPane.prototype, "help", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ScrollPaginationWizardPane.prototype, "dataParent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollPaginationWizardPane.prototype, "ignoreParentData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ScrollPaginationWizardPane.prototype, "data", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollPaginationWizardPane.prototype, "ignoreParentDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollPaginationWizardPane.prototype, "delegateHistory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ScrollPaginationWizardPane.prototype, "onDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ScrollPaginationWizardPane.prototype, "onEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollPaginationWizardPane.prototype, "loadingEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ScrollPaginationWizardPane.prototype, "i18nKey", void 0);
tslib_1.__decorate([
Option('i18nBypass'),
tslib_1.__metadata("design:type", Boolean)
], ScrollPaginationWizardPane.prototype, "bypass", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollPaginationWizardPane.prototype, "disabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ScrollPaginationWizardPane.prototype, "field", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", WizardModel)
], ScrollPaginationWizardPane.prototype, "model", void 0);
tslib_1.__decorate([
Option('load'),
tslib_1.__metadata("design:type", EventEmitter)
], ScrollPaginationWizardPane.prototype, "loadEvent", void 0);
tslib_1.__decorate([
Option('change'),
tslib_1.__metadata("design:type", EventEmitter)
], ScrollPaginationWizardPane.prototype, "changeEvent", void 0);
tslib_1.__decorate([
Option('beforeChange'),
tslib_1.__metadata("design:type", EventEmitter)
], ScrollPaginationWizardPane.prototype, "beforeChangeEvent", void 0);
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.help;
/** @type {?} */
ScrollPaginationWizardPane.prototype.dataParent;
/** @type {?} */
ScrollPaginationWizardPane.prototype.ignoreParentData;
/** @type {?} */
ScrollPaginationWizardPane.prototype.data;
/** @type {?} */
ScrollPaginationWizardPane.prototype.ignoreParentDisabled;
/** @type {?} */
ScrollPaginationWizardPane.prototype.delegateHistory;
/** @type {?} */
ScrollPaginationWizardPane.prototype.onDisabled;
/** @type {?} */
ScrollPaginationWizardPane.prototype.onEnabled;
/** @type {?} */
ScrollPaginationWizardPane.prototype.loadingEnabled;
/** @type {?} */
ScrollPaginationWizardPane.prototype.i18nKey;
/** @type {?} */
ScrollPaginationWizardPane.prototype.bypass;
/** @type {?} */
ScrollPaginationWizardPane.prototype.options;
/** @type {?} */
ScrollPaginationWizardPane.prototype.disabled;
/** @type {?} */
ScrollPaginationWizardPane.prototype.field;
/** @type {?} */
ScrollPaginationWizardPane.prototype.model;
/** @type {?} */
ScrollPaginationWizardPane.prototype.loadEvent;
/** @type {?} */
ScrollPaginationWizardPane.prototype.changeEvent;
/** @type {?} */
ScrollPaginationWizardPane.prototype.beforeChangeEvent;
/** @type {?} */
ScrollPaginationWizardPane.prototype.delayMouseWheelTimer;
/** @type {?} */
ScrollPaginationWizardPane.prototype.sanitizer;
/** @type {?} */
ScrollPaginationWizardPane.prototype.safeStyle;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Nyb2xsUGFnaW5hdGlvbldpemFyZFBhbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2RhdGF2aWV3L1Njcm9sbFBhZ2luYXRpb25XaXphcmRQYW5lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsWUFBWSxFQUFhLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTFELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSW5ELHVCQUFNLFNBQVMsR0FBVyxtQ0FBbUMsQ0FBQztBQUU5RCx1QkFBTSxTQUFTLEdBQVcsV0FBVyxDQUFDO0FBQ3RDLHVCQUFNLEVBQUUsR0FBUSxJQUFJLENBQUM7QUFDckIsdUJBQU0sSUFBSSxHQUFRLE1BQU0sQ0FBQztBQXlEekIsTUFBTSxpQ0FBa0MsU0FBUSxrQkFBa0I7Ozs7OztJQXdFaEUsWUFBWSxNQUF1QixFQUFFLFNBQXVCLEVBQUUsVUFBc0I7UUFDbEYsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztLQUM1Qjs7OztJQUVNLFFBQVE7UUFDYixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7Ozs7OztJQUlaLFlBQVksQ0FBQyxLQUFVO1FBQzVCLFlBQVksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUV4QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBRWpDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBRTFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztZQUU5QixxQkFBSSxLQUFLLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRW5GLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUNmLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7b0JBRXRCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO3FCQUNwQztvQkFBQyxJQUFJLENBQUMsQ0FBQzt3QkFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQzdCO2lCQUNGO2FBQ0Y7WUFBQyxJQUFJLENBQUMsQ0FBQzs7Z0JBQ04sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckMscUJBQUksVUFBVSxHQUFXLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFFMUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO3dCQUNsQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQzt3QkFDdEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUMvQjtpQkFDRjthQUNGO1lBRUQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3hCLEVBQUUsR0FBRyxDQUFDLENBQUM7Ozs7OztJQUdILGtCQUFrQixDQUFDLFVBQWtCO1FBQzFDLHFCQUFJLENBQU0sQ0FBQztRQUNYLHFCQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRTdCLEVBQUUsQ0FBQyxDQUFDLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7O1lBQzdDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDOztZQUNwQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ1A7UUFBQyxJQUFJLENBQUMsQ0FBQzs7WUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ1A7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDOzs7OztJQUd2RixZQUFZO1FBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDOzs7Ozs7SUFHakIsZUFBZSxDQUFDLEtBQWE7UUFDbEMscUJBQUksQ0FBTSxDQUFDO1FBRVgsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBQ2hCLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUN2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ1A7UUFBQyxJQUFJLENBQUMsQ0FBQzs7WUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ1A7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDOzs7Ozs7SUFHdkYsZUFBZSxDQUFDLEtBQWE7O3VDQXJKTyxTQUFTOztZQXpEckQsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtnQkFDbkIsUUFBUSxFQUFFLG1DQUFtQztnQkFDN0MsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FnRFg7YUFDQTs7OztZQXJFUSxlQUFlO1lBRGYsWUFBWTtZQURxQixVQUFVOzs7cUJBZ0ZqRCxLQUFLOzJCQUtMLEtBQUs7aUNBR0wsS0FBSztxQkFHTCxLQUFLO3FDQUdMLEtBQUs7Z0NBR0wsS0FBSzsyQkFHTCxLQUFLOzBCQUdMLEtBQUs7K0JBR0wsS0FBSzt3QkFHTCxLQUFLO3VCQUdMLEtBQUssU0FBQyxZQUFZO3dCQUdsQixLQUFLO3lCQUVMLEtBQUs7c0JBSUwsS0FBSztzQkFJTCxLQUFLOzBCQU1MLE1BQU0sU0FBQyxTQUFTOzRCQUloQixNQUFNLFNBQUMsV0FBVztrQ0FHbEIsTUFBTSxTQUFDLGlCQUFpQjs2QkFpQnhCLFlBQVksU0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7OztJQTFFckMsSUFBSSxFQUFFO0lBQ04sTUFBTSxFQUFFOzs7O0lBSVIsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFO3NDQUNhLFFBQVE7OztJQUU3QixNQUFNLEVBQUU7c0NBQ1ksUUFBUTs7O0lBRTVCLE1BQU0sRUFBRTs7OztJQUdSLE1BQU0sRUFBRTs7OztJQUdSLE1BQU0sQ0FBQyxZQUFZLENBQUM7Ozs7SUFLcEIsTUFBTSxFQUFFOzs7O0lBSVIsTUFBTSxFQUFFOzs7O0lBSVIsTUFBTSxFQUFFO3NDQUNRLFdBQVc7OztJQUszQixNQUFNLENBQUMsTUFBTSxDQUFDO3NDQUNNLFlBQVk7OztJQUdoQyxNQUFNLENBQUMsUUFBUSxDQUFDO3NDQUNNLFlBQVk7OztJQUVsQyxNQUFNLENBQUMsY0FBYyxDQUFDO3NDQUNNLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlU3R5bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgUGhsb3hBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9QaGxveEFwcFNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4uL0lIYXNNb2RlbCc7XHJcbmltcG9ydCB7IEFic3RyYWN0V2l6YXJkUGFuZSB9IGZyb20gJy4vQWJzdHJhY3RXaXphcmRQYW5lJztcclxuaW1wb3J0IHsgSUNoYW5nZWFibGUgfSBmcm9tICcuLi9JQ2hhbmdlYWJsZSc7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50L0lIYXNEYXRhJztcclxuaW1wb3J0IHsgV2l6YXJkTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9XaXphcmRNb2RlbCc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LXNjcm9sbC1wYWdpbmF0aW9uLXdpemFyZC1wYW5lXCI7XHJcblxyXG5jb25zdCBJTkRFWF9ZXzA6IHN0cmluZyA9IFwiSU5ERVhfWV8wXCI7XHJcbmNvbnN0IFVQOiBhbnkgPSBcIlVQXCI7XHJcbmNvbnN0IERPV046IGFueSA9IFwiRE9XTlwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcclxuICBzZWxlY3RvcjogJ3BoeC1zY3JvbGwtcGFnaW5hdGlvbi13aXphcmQtcGFuZScsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LXNjcm9sbC1wYWdpbmF0aW9uLXdpemFyZC1wYW5lXCI+XHJcblx0PGRpdiBjbGFzcz1cImxlZnRcIiBbc3R5bGUucGFkZGluZy10b3BdPVwiZ2V0SGVhZGVySGVpZ2h0KCkgKyAncHQnXCIgW3N0eWxlLnBhZGRpbmctYm90dG9tXT1cImdldEZvb3RlckhlaWdodCgpICsgJ3B0J1wiPlxyXG5cdFx0PGRpdiBjbGFzcz1cImhlYWRlclwiIFtzdHlsZS5oZWlnaHRdPVwiZ2V0SGVhZGVySGVpZ2h0KCkgKyAncHQnXCI+XHJcblx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpICE9PSBudWxsICYmIGdldE1vZGVsKCkuaGVhZGVyICE9PSBudWxsXCI+XHJcblx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkuaGVhZGVyLnR5cGUgPT09IG51bGxcIj5cclxuXHRcdFx0XHRcdDxkaXYgKm5nSWY9XCJnZXRNb2RlbCgpLmhlYWRlci5pbWFnZVVSTCAhPT0gbnVsbCAmJiBnZXRNb2RlbCgpLmhlYWRlci5pbWFnZVVSTCAhPT0gJydcIiBjbGFzcz1cImhlYWRlci1pbWFnZVwiPlxyXG5cdFx0XHRcdFx0XHQ8aW1nIHNyYz1cInt7Z2V0TW9kZWwoKS5oZWFkZXIuaW1hZ2VVUkx9fVwiPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGVyLWxhYmVsXCI+e3tnZXRNb2RlbCgpLmhlYWRlci5sYWJlbH19PC9kaXY+XHJcblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKS5oZWFkZXIudHlwZSAhPT0gbnVsbFwiPlxyXG5cdFx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciBbdHlwZV09XCJnZXRNb2RlbCgpLmhlYWRlci50eXBlXCIgW2RhdGFdPVwiZ2V0TW9kZWwoKS5oZWFkZXIubW9kZWxcIj48L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cclxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0PC9kaXY+XHJcblx0XHQ8ZGl2IGNsYXNzPVwiYm9keVwiPlxyXG5cdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKSAhPT0gbnVsbCAmJiBnZXRNb2RlbCgpLnN0ZXBzICE9PSBudWxsXCI+XHJcblx0XHRcdFx0PGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRNb2RlbCgpLnN0ZXBzOyBsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwic3RlcFwiIFtjbGFzcy5hY3RpdmVdPVwiaXNTdGVwU2VsZWN0ZWQoaSlcIj5cclxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpdGVtLnR5cGUgPT09IG51bGxcIj5cclxuXHRcdFx0XHRcdFx0PGRpdiAoY2xpY2spPVwic3RlcFNlbGVjdGVkKGkpXCI+IHt7aXRlbS5sYWJlbH19IDwvZGl2PlxyXG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpdGVtLnR5cGUgIT09IG51bGxcIj5cclxuXHRcdFx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciBbdHlwZV09XCJpdGVtLnR5cGVcIiBbZGF0YV09XCJpdGVtLm1vZGVsXCIgKGNsaWNrKT1cInN0ZXBTZWxlY3RlZChpKVwiPjwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxyXG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdDwvZGl2PlxyXG5cdFx0PGRpdiBjbGFzcz1cImZvb3RlclwiIFtzdHlsZS5oZWlnaHRdPVwiZ2V0Rm9vdGVySGVpZ2h0KCkgKyAncHQnXCI+XHJcblx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpICE9PSBudWxsICYmIGdldE1vZGVsKCkuZm9vdGVyICE9PSBudWxsXCI+XHJcblx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkuZm9vdGVyLnR5cGUgPT09IG51bGxcIj5cclxuXHRcdFx0XHRcdHt7Z2V0TW9kZWwoKS5mb290ZXIubGFiZWx9fVxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkuZm9vdGVyLnR5cGUgIT09IG51bGxcIj5cclxuXHRcdFx0XHRcdDxwaHgtY29tcG9uZW50LXdyYXBwZXIgW3R5cGVdPVwiZ2V0TW9kZWwoKS5mb290ZXIudHlwZVwiIFtkYXRhXT1cImdldE1vZGVsKCkuZm9vdGVyLm1vZGVsXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XHJcblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdDwvZGl2PlxyXG5cdDwvZGl2PlxyXG5cdDxkaXYgY2xhc3M9XCJyaWdodFwiPlxyXG5cdFx0PGRpdiBjbGFzcz1cInNjcm9sbHBhZ2VcIiBbc3R5bGUudHJhbnNmb3JtXT1cImdldFNhZmVTdHlsZSgpXCI+XHJcblx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0TW9kZWwoKS5zdGVwczsgbGV0IGkgPSBpbmRleDtcIiBzdHlsZT1cImhlaWdodDogMTAwJTtcIj5cclxuXHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyIFtjbGFzcy5hY3RpdmVdPVwiaXNTdGVwU2VsZWN0ZWQoaSlcIiBbdHlwZV09XCJpdGVtLmNvbXBvbmVudFR5cGVcIlxyXG5cdFx0XHRcdFx0W2RhdGFdPVwiZ2V0RGF0YSgpXCIgW21vZGVsXT1cIml0ZW0uY29tcG9uZW50TW9kZWxcIiBbZGF0YVBhcmVudF09XCJ0aGlzXCIgW2hhbmRsZXJdPVwiZ2V0U3RlcHNDb21wb25lbnRIYW5kbGVyKClcIj5cclxuXHRcdFx0XHQ8L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuPC9kaXY+XHJcbmAsXHJcbn0pXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFNjcm9sbFBhZ2luYXRpb25XaXphcmRQYW5lIGV4dGVuZHMgQWJzdHJhY3RXaXphcmRQYW5lIGltcGxlbWVudHMgT25Jbml0LCBJSGFzTW9kZWwsIElDaGFuZ2VhYmxlIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBJbnB1dC5cclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFIZWxwXHJcbiAgQElucHV0KClcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGhlbHA6IGFueTtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhUGFyZW50OiBJSGFzRGF0YTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREYXRhOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGE6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkZWxlZ2F0ZUhpc3Rvcnk6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgb25EaXNhYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgb25FbmFibGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBsb2FkaW5nRW5hYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpMThuS2V5OiBzdHJpbmc7XHJcbiAgQElucHV0KCdpMThuQnlwYXNzJylcclxuICBAT3B0aW9uKCdpMThuQnlwYXNzJylcclxuICBwcm90ZWN0ZWQgYnlwYXNzOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkaXNhYmxlZDogYm9vbGVhbjtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdERhdGFWaWV3XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZmllbGQ6IHN0cmluZztcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdFdpemFyZFBhbmVcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBtb2RlbDogV2l6YXJkTW9kZWw7XHJcblxyXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBAT3V0cHV0LlxyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxyXG4gIEBPdXRwdXQoJ3BoeExvYWQnKVxyXG4gIEBPcHRpb24oJ2xvYWQnKVxyXG4gIHByb3RlY3RlZCBsb2FkRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0V2l6YXJkUGFuZVxyXG4gIEBPdXRwdXQoJ3BoeENoYW5nZScpXHJcbiAgQE9wdGlvbignY2hhbmdlJylcclxuICBwcm90ZWN0ZWQgY2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYW5nZScpXHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhbmdlJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG5cclxuICBwcml2YXRlIGRlbGF5TW91c2VXaGVlbFRpbWVyOiBhbnk7XHJcbiAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcjtcclxuICBwcml2YXRlIHNhZmVTdHlsZTogU2FmZVN0eWxlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihhcHBTdmM6IFBobG94QXBwU2VydmljZSwgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcclxuICAgIHN1cGVyKGFwcFN2YywgZWxlbWVudFJlZik7XHJcbiAgICB0aGlzLnNhbml0aXplciA9IHNhbml0aXplcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZXdoZWVsJywgWyckZXZlbnQnXSlcclxuICBwdWJsaWMgb25tb3VzZXdoZWVsKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGNsZWFyVGltZW91dCh0aGlzLmRlbGF5TW91c2VXaGVlbFRpbWVyKTtcclxuXHJcbiAgICB0aGlzLmRlbGF5TW91c2VXaGVlbFRpbWVyID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLmRlbGF5TW91c2VXaGVlbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICBldmVudCA9IHdpbmRvdy5ldmVudCB8fCBldmVudDtcclxuXHJcbiAgICAgIGxldCBkZWx0YTogbnVtYmVyID0gTWF0aC5tYXgoLTEsIE1hdGgubWluKDEsIChldmVudC53aGVlbERlbHRhIHx8IC1ldmVudC5kZXRhaWwpKSk7XHJcblxyXG4gICAgICBpZiAoZGVsdGEgPiAtMSkgeyAvLyBtb3VzZVdoZWVsIHVwXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgIT09IDApIHtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXAgLT0gMTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RlcCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFNhZmVTdHlsZUluZGV4WShJTkRFWF9ZXzApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTYWZlU3R5bGVJbmRleFkoVVApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHsgICAvLyBtb3VzZVdoZWVsIGRvd25cclxuICAgICAgICBpZiAodGhpcy5nZXRNb2RlbCgpLnN0ZXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBzdGVwc0luZGV4OiBudW1iZXIgPSB0aGlzLmdldE1vZGVsKCkuc3RlcHMubGVuZ3RoIC0gMTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RlcCA8IHN0ZXBzSW5kZXgpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcCArPSAxO1xyXG4gICAgICAgICAgICB0aGlzLnNldFNhZmVTdHlsZUluZGV4WShET1dOKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9LCAyNTApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNhZmVTdHlsZUluZGV4WShtb3VzZVdoZWVsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCB5OiBhbnk7XHJcbiAgICBsZXQgaW5kZXggPSB0aGlzLmN1cnJlbnRTdGVwO1xyXG5cclxuICAgIGlmIChtb3VzZVdoZWVsID09PSBET1dOIHx8IG1vdXNlV2hlZWwgPT09IFVQKSB7IC8vIHNldCBTdHlsZSB0cmFuc2xhdGUzZCA9ICAoMCwgLShpbmRleCAqIDEwMCksIDApO1xyXG4gICAgICB5ID0gLShpbmRleCAqIDEwMCk7XHJcbiAgICB9IGVsc2UgaWYgKG1vdXNlV2hlZWwgPT09IElOREVYX1lfMCkgeyAvLyBzZXQgU3R5bGUgdHJhbnNsYXRlM2QgPSAgKDAsIDAsIDApO1xyXG4gICAgICB5ID0gMDtcclxuICAgIH0gZWxzZSB7IC8vIGRlZmF1bHQgIHNldCBTdHlsZSB0cmFuc2xhdGUzZCA9ICAoMCwgMCwgMCk7XHJcbiAgICAgIHkgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2FmZVN0eWxlID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFwidHJhbnNsYXRlM2QoIDAsIFwiICsgeSArIFwiJSwgMCApXCIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNhZmVTdHlsZSgpOiBTYWZlU3R5bGUge1xyXG4gICAgcmV0dXJuIHRoaXMuc2FmZVN0eWxlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dTdGVwQ29udGVudChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBsZXQgeTogYW55O1xyXG5cclxuICAgIGlmIChpbmRleCAhPT0gMCkgeyAvLyBzZXQgU3R5bGUgdHJhbnNsYXRlM2QgPSAgKDAsIC0oaW5kZXggKiAxMDApLCAwKTtcclxuICAgICAgeSA9IC0oaW5kZXggKiAxMDApO1xyXG4gICAgfSBlbHNlIGlmIChpbmRleCA9PT0gMCkgeyAvLyBzZXQgU3R5bGUgdHJhbnNsYXRlM2QgPSAgKDAsIDAsIDApO1xyXG4gICAgICB5ID0gMDtcclxuICAgIH0gZWxzZSB7IC8vIGRlZmF1bHQgIHNldCBTdHlsZSB0cmFuc2xhdGUzZCA9ICAoMCwgMCwgMCk7XHJcbiAgICAgIHkgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2FmZVN0eWxlID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFwidHJhbnNsYXRlM2QoIDAsIFwiICsgeSArIFwiJSwgMCApXCIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFN0ZXBJbnN0YW5jZShpbmRleDogbnVtYmVyKTogYW55IHsgfVxyXG59XHJcbiJdfQ==