UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

675 lines (674 loc) 49.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, Input, Output, ViewChild, EventEmitter } from '@angular/core'; import { I18N } from '../../../../../decorator/I18N.decorator'; import { Option } from '../../../../../decorator/Option.decorator'; import { EventUtils } from '../../../../../share/utils/EventUtils'; import { CLICK_EVENT, BEFORE_CLICK_EVENT } from '../../../../../share/CustomEventType'; import { NeedFocusService } from '../../../../../service/NeedFocusService.service'; import { AbstractInputDataView } from '../../../../../component/dataview/input/AbstractInputDataView'; import { MatSlider } from '@angular/material'; const /** @type {?} */ TYPE_NAME = "material-slider"; export class MaterialSlider extends AbstractInputDataView { /** * @param {?} elementRef * @param {?} needFocusService */ constructor(elementRef, needFocusService) { super(elementRef, needFocusService); this.beforeClickEvent = new EventEmitter(); this.clickEvent = new EventEmitter(); this.beforeFocusEvent = new EventEmitter(); this.focusEvent = new EventEmitter(); this.beforeLostFocusEvent = new EventEmitter(); this.lostFocusEvent = new EventEmitter(); this.beforeChangeEvent = new EventEmitter(); this.changeEvent = new EventEmitter(); this.disabled = false; } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { setTimeout(() => { this.initEventHandlers(); this._oldValue = this.slider.value; }, 20); } /** * @return {?} */ initEventHandlers() { $(this.elementRef.nativeElement).find('mat-slider.mat-slider').focus(($event) => { this.onFocusing($event); }); $(this.elementRef.nativeElement).find('mat-slider.mat-slider').blur(($event) => { this.onLostFocusing($event); }); } /** * @return {?} */ isInvert() { return this.invert; } /** * @param {?} invert * @return {?} */ setInvert(invert) { this.invert = invert; } /** * @return {?} */ getMaximum() { return this.max; } /** * @param {?} max * @return {?} */ setMaximum(max) { this.max = max; } /** * @return {?} */ getMinimum() { return this.min; } /** * @param {?} min * @return {?} */ setMinimum(min) { this.min = min; } /** * @return {?} */ getStep() { return this.step; } /** * @param {?} step * @return {?} */ setStep(step) { this.step = step; } /** * @return {?} */ isVertical() { return this.vertical; } /** * @param {?} vertical * @return {?} */ setVertical(vertical) { this.vertical = vertical; } /** * @return {?} */ isThumbLabel() { return this.thumbLabel; } /** * @param {?} thumbLabel * @return {?} */ setThumbLabel(thumbLabel) { this.thumbLabel = thumbLabel; } /** * @return {?} */ getTickInterval() { return this.tickInterval; } /** * @param {?} tickInterval * @return {?} */ setTickInterval(tickInterval) { if (typeof tickInterval === "number") { this.tickInterval = tickInterval; } else { this.tickInterval = 'auto'; } } /** * @return {?} */ getDescription() { return this.description; } /** * @param {?} description * @return {?} */ setDescription(description) { this.description = description; } /** * @return {?} */ hasDescription() { if (this.description !== null && typeof this.description === 'string' && this.description !== '') { return true; } return false; } /** * @param {?} $event * @return {?} */ onChanged($event) { this.slider.value = this._oldValue; this.setInputValue($event.value); } /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ onClicked($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } if (this.isReadOnly()) { $event.preventDefault(); return; } if (this.isDisabled()) { $event.preventDefault(); return; } EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, ($event) => { // doEvent }, ($event) => { // emitBeforeEvent this.emitBeforeClickEvent($event); }, ($event, result) => { // emitAfterEvent this.emitClickEvent($event); }, ($event) => { // doPrevented }); } /** * @param {?} oldValue * @param {?} newValue * @param {?} valueChange * @param {?=} $event * @return {?} */ emitChangeEvent(oldValue, newValue, valueChange, $event) { super.emitChangeEvent(oldValue, newValue, valueChange, $event); this._oldValue = newValue; } /** * @param {?=} $event * @return {?} */ emitBeforeClickEvent($event) { let /** @type {?} */ eventData = null; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event); if (this.beforeClickEvent !== null && this.beforeClickEvent !== undefined) { this.beforeClickEvent.emit(ev); } } /** * @param {?=} $event * @return {?} */ emitClickEvent($event) { let /** @type {?} */ eventData = null; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event); if (this.clickEvent !== null && this.clickEvent !== undefined) { this.clickEvent.emit(ev); } } /** * @param {?} $event * @return {?} */ onFocusing($event) { this.needFocusService.setFocusingComponent(this, $event); } /** * @param {?} $event * @return {?} */ onLostFocusing($event) { this.needFocusService.resetFocusingComponent($event); } /** * @param {?} $event * @return {?} */ doFocus($event) { if ($(this.elementRef.nativeElement).find('mat-slider.mat-slider:focus').length <= 0) { $(this.elementRef.nativeElement).find('mat-slider.mat-slider').focus(); } } /** * @param {?} $event * @return {?} */ doLostFocus($event) { if ($(this.elementRef.nativeElement).find('mat-slider.mat-slider:focus').length > 0) { $(this.elementRef.nativeElement).find('mat-slider.mat-slider').blur(); } } /** * @param {?} $event * @return {?} */ onReadonlyClick($event) { if (this.isReadOnly()) { this.onFocusing($event); $event.preventDefault(); return; } } /** * @return {?} */ getWidth() { return this.width; } /** * @param {?} width * @return {?} */ setWidth(width) { this.width = width; } /** * @return {?} */ getHeight() { return this.height; } /** * @param {?} height * @return {?} */ setHeight(height) { this.height = height; } /** * @param {?} inputValue * @param {?} results * @return {?} */ onValidationEnd(inputValue, results) { } /** * @param {?} data * @param {?} inputVal * @return {?} */ onDataChange(data, inputVal) { } /** * @return {?} */ isSelfDataDirty() { return; } /** * @param {?} data * @return {?} */ selfSaveData(data) { } /** * @return {?} */ selfResetData() { } } MaterialSlider.TYPE_NAME = TYPE_NAME; MaterialSlider.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="material-input material-slider"> <div id="material-slider-readonly" *ngIf="isReadOnly()" style="width: 100%; height: 100%; position: absolute; left: 0; top: 0; z-index: 50;" (click)="onReadonlyClick($event)"></div> <mat-slider #mcomp [disabled]="isDisabled()" *ngIf="!isVertical()" [style.width]="getWidth()" [value]="getInputValue()" [vertical]="isVertical()" [tickInterval]="getTickInterval()" [thumbLabel]="isThumbLabel()" [invert]="isInvert()" [max]="getMaximum()" [min]="getMinimum()" [step]="getStep()" (click)="onClicked($event)" (change)="onChanged($event)"> </mat-slider> <mat-slider #mcomp [disabled]="isDisabled()" *ngIf="isVertical()" [style.height]="getHeight()" [value]="getInputValue()" [vertical]="isVertical()" [tickInterval]="getTickInterval()" [thumbLabel]="isThumbLabel()" [invert]="isInvert()" [max]="getMaximum()" [min]="getMinimum()" [step]="getStep()" (click)="onClicked($event)" (change)="onChanged($event)"> </mat-slider> <div class="validation" [style.display]="getValidationResultMessage() ? undefined : 'none'" [class.normal]="isNormal() && !isDisabled()" [class.success]="isSuccess() && !isDisabled()" [class.warning]="isWarning() && !isDisabled()" [class.error]="isError() && !isDisabled()"> <ng-template [ngIf]="getValidationResultMessage()" [ngIfElse]="validation_else"> {{getValidationResultMessage() | phx_text}} </ng-template> <ng-template #validation_else> <!-- We've to put whitespace if there is no validation msg to prevent empty dom --> <!-- since if validate msg's <div> dom is empty, the component positioning --> <!-- will be misplaced. --> {{ '&nbsp;' }} </ng-template> </div> <div class="description" [style.display]="getValidationResultMessage() ? 'none' : undefined" [class.normal]="isNormal() && !isDisabled()" [class.success]="isSuccess() && !isDisabled()" [class.warning]="isWarning() && !isDisabled()" [class.error]="isError() && !isDisabled()"> <ng-template [ngIf]="getDescription()" [ngIfElse]="description_else"> {{ getDescription() | phx_text }} </ng-template> <ng-template #description_else> <!-- We've to put whitespace if there is no description to prevent empty dom --> <!-- since if description's <div> dom is empty, the component positioning --> <!-- will be misplaced. --> {{ '&nbsp;' }} </ng-template> </div> <div class="help"> {{getHelp() | phx_text}} </div> </div>`, },] }, ]; /** @nocollapse */ MaterialSlider.ctorParameters = () => [ { type: ElementRef, }, { type: NeedFocusService, }, ]; MaterialSlider.propDecorators = { "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 },], "name": [{ type: Input },], "typeOfData": [{ type: Input },], "readOnly": [{ type: Input },], "help": [{ type: Input },], "description": [{ type: Input },], "width": [{ type: Input },], "height": [{ type: Input },], "invert": [{ type: Input },], "max": [{ type: Input },], "min": [{ type: Input },], "step": [{ type: Input },], "thumbLabel": [{ type: Input },], "vertical": [{ type: Input },], "tickInterval": [{ type: Input },], "loadEvent": [{ type: Output, args: ['phxLoad',] },], "startValidateEvent": [{ type: Output, args: ['phxStartValidate',] },], "endValidateEvent": [{ type: Output, args: ['phxEndValidate',] },], "beforeFocusEvent": [{ type: Output, args: ['phxBeforeFocus',] },], "focusEvent": [{ type: Output, args: ['phxFocus',] },], "beforeLostFocusEvent": [{ type: Output, args: ['phxBeforeLostFocus',] },], "lostFocusEvent": [{ type: Output, args: ['phxLostFocus',] },], "beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },], "changeEvent": [{ type: Output, args: ['phxChange',] },], "beforeClickEvent": [{ type: Output, args: ['phxBeforeClick',] },], "clickEvent": [{ type: Output, args: ['phxClick',] },], "slider": [{ type: ViewChild, args: ['mcomp',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialSlider.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialSlider.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialSlider.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialSlider.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialSlider.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], MaterialSlider.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], MaterialSlider.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialSlider.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialSlider.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], MaterialSlider.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialSlider.prototype, "disabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialSlider.prototype, "field", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialSlider.prototype, "name", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialSlider.prototype, "typeOfData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialSlider.prototype, "readOnly", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], MaterialSlider.prototype, "help", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", String) ], MaterialSlider.prototype, "description", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialSlider.prototype, "width", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialSlider.prototype, "height", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialSlider.prototype, "invert", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Number) ], MaterialSlider.prototype, "max", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Number) ], MaterialSlider.prototype, "min", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Number) ], MaterialSlider.prototype, "step", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialSlider.prototype, "thumbLabel", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialSlider.prototype, "vertical", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialSlider.prototype, "tickInterval", void 0); tslib_1.__decorate([ Option('load'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialSlider.prototype, "loadEvent", void 0); tslib_1.__decorate([ Option('startValidate'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialSlider.prototype, "startValidateEvent", void 0); tslib_1.__decorate([ Option('endValidate'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialSlider.prototype, "endValidateEvent", void 0); tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialSlider.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialSlider.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialSlider.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialSlider.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option('beforeChange'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialSlider.prototype, "beforeChangeEvent", void 0); tslib_1.__decorate([ Option('change'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialSlider.prototype, "changeEvent", void 0); tslib_1.__decorate([ Option('beforeClick'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialSlider.prototype, "beforeClickEvent", void 0); tslib_1.__decorate([ Option('click'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialSlider.prototype, "clickEvent", void 0); function MaterialSlider_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ MaterialSlider.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ MaterialSlider.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ MaterialSlider.propDecorators; /** @type {?} */ MaterialSlider.TYPE_NAME; /** @type {?} */ MaterialSlider.prototype.dataParent; /** @type {?} */ MaterialSlider.prototype.ignoreParentData; /** @type {?} */ MaterialSlider.prototype.data; /** @type {?} */ MaterialSlider.prototype.ignoreParentDisabled; /** @type {?} */ MaterialSlider.prototype.delegateHistory; /** @type {?} */ MaterialSlider.prototype.onDisabled; /** @type {?} */ MaterialSlider.prototype.onEnabled; /** @type {?} */ MaterialSlider.prototype.loadingEnabled; /** @type {?} */ MaterialSlider.prototype.i18nKey; /** @type {?} */ MaterialSlider.prototype.bypass; /** @type {?} */ MaterialSlider.prototype.options; /** @type {?} */ MaterialSlider.prototype.disabled; /** @type {?} */ MaterialSlider.prototype.field; /** @type {?} */ MaterialSlider.prototype.name; /** @type {?} */ MaterialSlider.prototype.typeOfData; /** @type {?} */ MaterialSlider.prototype.readOnly; /** @type {?} */ MaterialSlider.prototype.help; /** @type {?} */ MaterialSlider.prototype.description; /** @type {?} */ MaterialSlider.prototype.width; /** @type {?} */ MaterialSlider.prototype.height; /** @type {?} */ MaterialSlider.prototype.invert; /** @type {?} */ MaterialSlider.prototype.max; /** @type {?} */ MaterialSlider.prototype.min; /** @type {?} */ MaterialSlider.prototype.step; /** @type {?} */ MaterialSlider.prototype.thumbLabel; /** @type {?} */ MaterialSlider.prototype.vertical; /** @type {?} */ MaterialSlider.prototype.tickInterval; /** @type {?} */ MaterialSlider.prototype.loadEvent; /** @type {?} */ MaterialSlider.prototype.startValidateEvent; /** @type {?} */ MaterialSlider.prototype.endValidateEvent; /** @type {?} */ MaterialSlider.prototype.beforeFocusEvent; /** @type {?} */ MaterialSlider.prototype.focusEvent; /** @type {?} */ MaterialSlider.prototype.beforeLostFocusEvent; /** @type {?} */ MaterialSlider.prototype.lostFocusEvent; /** @type {?} */ MaterialSlider.prototype.beforeChangeEvent; /** @type {?} */ MaterialSlider.prototype.changeEvent; /** @type {?} */ MaterialSlider.prototype.beforeClickEvent; /** @type {?} */ MaterialSlider.prototype.clickEvent; /** @type {?} */ MaterialSlider.prototype.slider; /** @type {?} */ MaterialSlider.prototype._oldValue; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF0ZXJpYWxTbGlkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvdGhlbWUvbWF0ZXJpYWwvY29tcG9uZW50L2RhdGF2aWV3L2lucHV0L01hdGVyaWFsU2xpZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFpQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckgsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRW5GLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBRXRHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU5Qyx1QkFBTSxTQUFTLEdBQVcsaUJBQWlCLENBQUM7QUFzQzVDLE1BQU0scUJBQXNCLFNBQVEscUJBQXFCOzs7OztJQTBJdkQsWUFBWSxVQUFzQixFQUFFLGdCQUFrQztRQUNwRSxLQUFLLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFFbkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNDLElBQUks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TyxDQUFDO3NDQUNNLFlBQVk7OztJQUVqQyxNQUFNLENBQUMsaUJBQWlCLENBQUM7c0NBQ00sWUFBWTs7O0lBRTNDLE1BQU0sQ0FBQyxXQUFXLENBQUM7c0NBQ00sWUFBWTs7O0lBRXJDLE1BQU0sQ0FBQyxjQUFjLENBQUM7c0NBQ00sWUFBWTs7O0lBRXhDLE1BQU0sQ0FBQyxRQUFRLENBQUM7c0NBQ00sWUFBWTs7O0lBS2xDLE1BQU0sQ0FBQyxhQUFhLENBQUM7c0NBQ00sWUFBWTs7O0lBRXZDLE1BQU0sQ0FBQyxPQUFPLENBQUM7c0NBQ00sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIFNpbXBsZUNoYW5nZXMsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJMThOIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vZGVjb3JhdG9yL0kxOE4uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmUvdXRpbHMvRXZlbnRVdGlscyc7XHJcbmltcG9ydCB7IENMSUNLX0VWRU5ULCBCRUZPUkVfQ0xJQ0tfRVZFTlQgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zaGFyZS9DdXN0b21FdmVudFR5cGUnO1xyXG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudC9JSGFzRGF0YSc7XHJcbmltcG9ydCB7IEFic3RyYWN0SW5wdXREYXRhVmlldyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9BYnN0cmFjdElucHV0RGF0YVZpZXcnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tcG9uZW50L21vZGVsL1ZhbGlkYXRpb25SZXN1bHQnO1xyXG5pbXBvcnQgeyBNYXRTbGlkZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcblxyXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwibWF0ZXJpYWwtc2xpZGVyXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxyXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwibWF0ZXJpYWwtaW5wdXQgbWF0ZXJpYWwtc2xpZGVyXCI+XHJcbiAgICA8ZGl2IGlkPVwibWF0ZXJpYWwtc2xpZGVyLXJlYWRvbmx5XCIgKm5nSWY9XCJpc1JlYWRPbmx5KClcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgdG9wOiAwOyB6LWluZGV4OiA1MDtcIiAoY2xpY2spPVwib25SZWFkb25seUNsaWNrKCRldmVudClcIj48L2Rpdj5cclxuICAgIDxtYXQtc2xpZGVyICNtY29tcCBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCIgKm5nSWY9XCIhaXNWZXJ0aWNhbCgpXCIgW3N0eWxlLndpZHRoXT1cImdldFdpZHRoKClcIiBbdmFsdWVdPVwiZ2V0SW5wdXRWYWx1ZSgpXCIgW3ZlcnRpY2FsXT1cImlzVmVydGljYWwoKVwiIFt0aWNrSW50ZXJ2YWxdPVwiZ2V0VGlja0ludGVydmFsKClcIiBbdGh1bWJMYWJlbF09XCJpc1RodW1iTGFiZWwoKVwiIFtpbnZlcnRdPVwiaXNJbnZlcnQoKVwiIFttYXhdPVwiZ2V0TWF4aW11bSgpXCIgW21pbl09XCJnZXRNaW5pbXVtKClcIiBbc3RlcF09XCJnZXRTdGVwKClcIiAoY2xpY2spPVwib25DbGlja2VkKCRldmVudClcIiAoY2hhbmdlKT1cIm9uQ2hhbmdlZCgkZXZlbnQpXCI+XHJcbiAgICA8L21hdC1zbGlkZXI+XHJcbiAgICA8bWF0LXNsaWRlciAjbWNvbXAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKVwiICpuZ0lmPVwiaXNWZXJ0aWNhbCgpXCIgIFtzdHlsZS5oZWlnaHRdPVwiZ2V0SGVpZ2h0KClcIiBbdmFsdWVdPVwiZ2V0SW5wdXRWYWx1ZSgpXCIgW3ZlcnRpY2FsXT1cImlzVmVydGljYWwoKVwiIFt0aWNrSW50ZXJ2YWxdPVwiZ2V0VGlja0ludGVydmFsKClcIiBbdGh1bWJMYWJlbF09XCJpc1RodW1iTGFiZWwoKVwiIFtpbnZlcnRdPVwiaXNJbnZlcnQoKVwiIFttYXhdPVwiZ2V0TWF4aW11bSgpXCIgW21pbl09XCJnZXRNaW5pbXVtKClcIiBbc3RlcF09XCJnZXRTdGVwKClcIiAoY2xpY2spPVwib25DbGlja2VkKCRldmVudClcIiAoY2hhbmdlKT1cIm9uQ2hhbmdlZCgkZXZlbnQpXCI+XHJcbiAgICA8L21hdC1zbGlkZXI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidmFsaWRhdGlvblwiIFtzdHlsZS5kaXNwbGF5XT1cImdldFZhbGlkYXRpb25SZXN1bHRNZXNzYWdlKCkgPyB1bmRlZmluZWQgOiAnbm9uZSdcIiBbY2xhc3Mubm9ybWFsXT1cImlzTm9ybWFsKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy5zdWNjZXNzXT1cImlzU3VjY2VzcygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3Mud2FybmluZ109XCJpc1dhcm5pbmcoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLmVycm9yXT1cImlzRXJyb3IoKSAmJiAhaXNEaXNhYmxlZCgpXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldFZhbGlkYXRpb25SZXN1bHRNZXNzYWdlKClcIiBbbmdJZkVsc2VdPVwidmFsaWRhdGlvbl9lbHNlXCI+XHJcbiAgICAgICAgICAgIHt7Z2V0VmFsaWRhdGlvblJlc3VsdE1lc3NhZ2UoKSB8IHBoeF90ZXh0fX1cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjdmFsaWRhdGlvbl9lbHNlPlxyXG4gICAgICAgICAgICA8IS0tIFdlJ3ZlIHRvIHB1dCB3aGl0ZXNwYWNlIGlmIHRoZXJlIGlzIG5vIHZhbGlkYXRpb24gbXNnIHRvIHByZXZlbnQgZW1wdHkgZG9tIC0tPlxyXG4gICAgICAgICAgICA8IS0tIHNpbmNlIGlmIHZhbGlkYXRlIG1zZydzIDxkaXY+IGRvbSBpcyBlbXB0eSwgdGhlIGNvbXBvbmVudCBwb3NpdGlvbmluZyAtLT5cclxuICAgICAgICAgICAgPCEtLSB3aWxsIGJlIG1pc3BsYWNlZC4gLS0+XHJcbiAgICAgICAgICAgIHt7ICcmbmJzcDsnIH19XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCIgW3N0eWxlLmRpc3BsYXldPVwiZ2V0VmFsaWRhdGlvblJlc3VsdE1lc3NhZ2UoKSA/ICdub25lJyA6IHVuZGVmaW5lZFwiIFtjbGFzcy5ub3JtYWxdPVwiaXNOb3JtYWwoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLnN1Y2Nlc3NdPVwiaXNTdWNjZXNzKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy53YXJuaW5nXT1cImlzV2FybmluZygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3MuZXJyb3JdPVwiaXNFcnJvcigpICYmICFpc0Rpc2FibGVkKClcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0RGVzY3JpcHRpb24oKVwiIFtuZ0lmRWxzZV09XCJkZXNjcmlwdGlvbl9lbHNlXCI+XHJcbiAgICAgICAgICAgIHt7IGdldERlc2NyaXB0aW9uKCkgfCBwaHhfdGV4dCB9fVxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZXNjcmlwdGlvbl9lbHNlPlxyXG4gICAgICAgICAgICA8IS0tIFdlJ3ZlIHRvIHB1dCB3aGl0ZXNwYWNlIGlmIHRoZXJlIGlzIG5vIGRlc2NyaXB0aW9uIHRvIHByZXZlbnQgZW1wdHkgZG9tIC0tPlxyXG4gICAgICAgICAgICA8IS0tIHNpbmNlIGlmIGRlc2NyaXB0aW9uJ3MgPGRpdj4gZG9tIGlzIGVtcHR5LCB0aGUgY29tcG9uZW50IHBvc2l0aW9uaW5nIC0tPlxyXG4gICAgICAgICAgICA8IS0tIHdpbGwgYmUgbWlzcGxhY2VkLiAtLT5cclxuICAgICAgICAgICAge3sgJyZuYnNwOycgfX1cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaGVscFwiPlxyXG4gICAgICAgIHt7Z2V0SGVscCgpIHwgcGh4X3RleHR9fVxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PmAsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXRlcmlhbFNsaWRlciBleHRlbmRzIEFic3RyYWN0SW5wdXREYXRhVmlldyBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XHJcblxyXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBASW5wdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGVsZWdhdGVIaXN0b3J5OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbG9hZGluZ0VuYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaTE4bktleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgnaTE4bkJ5cGFzcycpXHJcbiAgQE9wdGlvbignaTE4bkJ5cGFzcycpXHJcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjsgXHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRpc2FibGVkOiBib29sZWFuO1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0YVZpZXdcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBmaWVsZDogc3RyaW5nO1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCB0eXBlT2ZEYXRhOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgcmVhZE9ubHk6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGhlbHA6IGFueTtcclxuXHJcbiAgLy8gLS0tIHNlbGZcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgQElucHV0KClcclxuICBwcml2YXRlIGRlc2NyaXB0aW9uOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgd2lkdGg6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWlnaHQ6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpbnZlcnQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbWF4OiBudW1iZXI7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbWluOiBudW1iZXI7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgc3RlcDogbnVtYmVyO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIHRodW1iTGFiZWw6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgdmVydGljYWw6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgdGlja0ludGVydmFsOiAnYXV0bycgfCBudW1iZXI7XHJcblxyXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBAT3V0cHV0LlxyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxyXG4gIEBPdXRwdXQoJ3BoeExvYWQnKVxyXG4gIEBPcHRpb24oJ2xvYWQnKVxyXG4gIHByb3RlY3RlZCBsb2FkRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0YVZpZXdcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdElucHV0RGF0YVZpZXdcclxuICBAT3V0cHV0KCdwaHhTdGFydFZhbGlkYXRlJylcclxuICBAT3B0aW9uKCdzdGFydFZhbGlkYXRlJylcclxuICBwcm90ZWN0ZWQgc3RhcnRWYWxpZGF0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhFbmRWYWxpZGF0ZScpXHJcbiAgQE9wdGlvbignZW5kVmFsaWRhdGUnKVxyXG4gIHByb3RlY3RlZCBlbmRWYWxpZGF0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVGb2N1cycpXHJcbiAgQE9wdGlvbignYmVmb3JlRm9jdXMnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhGb2N1cycpXHJcbiAgQE9wdGlvbignZm9jdXMnKVxyXG4gIHByb3RlY3RlZCBmb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVMb3N0Rm9jdXMnKVxyXG4gIEBPcHRpb24oJ2JlZm9yZUxvc3RGb2N1cycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhMb3N0Rm9jdXMnKVxyXG4gIEBPcHRpb24oJ2xvc3RGb2N1cycpXHJcbiAgcHJvdGVjdGVkIGxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVDaGFuZ2UnKVxyXG4gIEBPcHRpb24oJ2JlZm9yZUNoYW5nZScpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhDaGFuZ2UnKVxyXG4gIEBPcHRpb24oJ2NoYW5nZScpXHJcbiAgcHJvdGVjdGVkIGNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgLy8gLS0tIFNlbGZcclxuXHJcbiAgQE91dHB1dCgncGh4QmVmb3JlQ2xpY2snKVxyXG4gIEBPcHRpb24oJ2JlZm9yZUNsaWNrJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4Q2xpY2snKVxyXG4gIEBPcHRpb24oJ2NsaWNrJylcclxuICBwcm90ZWN0ZWQgY2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ21jb21wJylcclxuICBwcml2YXRlIHNsaWRlcjogTWF0U2xpZGVyO1xyXG4gIHByaXZhdGUgX29sZFZhbHVlOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcclxuICAgIHN1cGVyKGVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2UpXHJcblxyXG4gICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5jbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVGb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5mb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVMb3N0Rm9jdXNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMubG9zdEZvY3VzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmJlZm9yZUNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5jaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaW5pdEV2ZW50SGFuZGxlcnMoKTtcclxuXHJcbiAgICAgIHRoaXMuX29sZFZhbHVlID0gdGhpcy5zbGlkZXIudmFsdWU7XHJcbiAgICB9LCAyMClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEV2ZW50SGFuZGxlcnMoKTogdm9pZCB7XHJcbiAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCdtYXQtc2xpZGVyLm1hdC1zbGlkZXInKS5mb2N1cygoJGV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMub25Gb2N1c2luZygkZXZlbnQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnbWF0LXNsaWRlci5tYXQtc2xpZGVyJykuYmx1cigoJGV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMub25Mb3N0Rm9jdXNpbmcoJGV2ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSW52ZXJ0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaW52ZXJ0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEludmVydChpbnZlcnQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaW52ZXJ0ID0gaW52ZXJ0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE1heGltdW0oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLm1heDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRNYXhpbXVtKG1heDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLm1heCA9IG1heDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRNaW5pbXVtKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5taW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TWluaW11bShtaW46IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5taW4gPSBtaW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U3RlcCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RlcDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTdGVwKHN0ZXA6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5zdGVwID0gc3RlcDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1ZlcnRpY2FsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmVydGljYWw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmVydGljYWwodmVydGljYWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMudmVydGljYWwgPSB2ZXJ0aWNhbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1RodW1iTGFiZWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50aHVtYkxhYmVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFRodW1iTGFiZWwodGh1bWJMYWJlbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy50aHVtYkxhYmVsID0gdGh1bWJMYWJlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUaWNrSW50ZXJ2YWwoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnRpY2tJbnRlcnZhbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRUaWNrSW50ZXJ2YWwodGlja0ludGVydmFsOiAnYXV0bycgfCBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0eXBlb2YgdGlja0ludGVydmFsID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgIHRoaXMudGlja0ludGVydmFsID0gdGlja0ludGVydmFsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50aWNrSW50ZXJ2YWwgPSAnYXV0byc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGVzY3JpcHRpb24oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYXNEZXNjcmlwdGlvbigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRlc2NyaXB0aW9uID09PSAnc3RyaW5nJyAmJiB0aGlzLmRlc2NyaXB0aW9uICE9PSAnJykge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DaGFuZ2VkKCRldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnNsaWRlci52YWx1ZSA9IHRoaXMuX29sZFZhbHVlO1xyXG5cclxuICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSgkZXZlbnQudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2xpY2tlZCgkZXZlbnQ6IEV2ZW50LCBmaXJlRXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNSZWFkT25seSgpKSB7XHJcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpKSB7XHJcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUNsaWNrRXZlbnQnLCAkZXZlbnQsIGZpcmVFdmVudCwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZG9FdmVudFxyXG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdEJlZm9yZUNsaWNrRXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxyXG4gICAgICB0aGlzLmVtaXRDbGlja0V2ZW50KCRldmVudCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb1ByZXZlbnRlZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBPdmVycmlkZTogdG8gc2F2ZSB0aGlzLl9vbGRWYWx1ZVxyXG4gIHByb3RlY3RlZCBlbWl0Q2hhbmdlRXZlbnQob2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSwgdmFsdWVDaGFuZ2U6IGJvb2xlYW4sICRldmVudD86IGFueSk6IHZvaWQge1xyXG4gICAgc3VwZXIuZW1pdENoYW5nZUV2ZW50KG9sZFZhbHVlLCBuZXdWYWx1ZSwgdmFsdWVDaGFuZ2UsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5fb2xkVmFsdWUgPSBuZXdWYWx1ZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlQ2xpY2tFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBldmVudERhdGE6IGFueSA9IG51bGw7XHJcblxyXG4gICAgLy8gZW1pdCBldmVudFxyXG4gICAgbGV0IGRhdGE6IGFueSA9IGV2ZW50RGF0YTtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0NMSUNLX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIGlmICh0aGlzLmJlZm9yZUNsaWNrRXZlbnQgIT09IG51bGwgJiYgdGhpcy5iZWZvcmVDbGlja0V2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50LmVtaXQoZXYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRDbGlja0V2ZW50KCRldmVudD86IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IGV2ZW50RGF0YTogYW55ID0gbnVsbDtcclxuXHJcbiAgICAvLyBlbWl0IGV2ZW50XHJcbiAgICBsZXQgZGF0YTogYW55ID0gZXZlbnREYXRhO1xyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDTElDS19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5jbGlja0V2ZW50ICE9PSBudWxsICYmIHRoaXMuY2xpY2tFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkZvY3VzaW5nKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5zZXRGb2N1c2luZ0NvbXBvbmVudCh0aGlzLCAkZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uTG9zdEZvY3VzaW5nKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5yZXNldEZvY3VzaW5nQ29tcG9uZW50KCRldmVudCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZG9Gb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnbWF0LXNsaWRlci5tYXQtc2xpZGVyOmZvY3VzJykubGVuZ3RoIDw9IDApIHtcclxuICAgICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnbWF0LXNsaWRlci5tYXQtc2xpZGVyJykuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkb0xvc3RGb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnbWF0LXNsaWRlci5tYXQtc2xpZGVyOmZvY3VzJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCdtYXQtc2xpZGVyLm1hdC1zbGlkZXInKS5ibHVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25SZWFkb25seUNsaWNrKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzUmVhZE9ubHkoKSkge1xyXG4gICAgICB0aGlzLm9uRm9jdXNpbmcoJGV2ZW50KTtcclxuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRXaWR0aCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMud2lkdGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0V2lkdGgod2lkdGg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEhlaWdodCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuaGVpZ2h0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEhlaWdodChoZWlnaHQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25WYWxpZGF0aW9uRW5kKGlucHV0VmFsdWU6IGFueSwgcmVzdWx0czogVmFsaWRhdGlvblJlc3VsdFtdKTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZShkYXRhOiBhbnksIGlucHV0VmFsOiBhbnkpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNTZWxmRGF0YURpcnR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZlNhdmVEYXRhKGRhdGE6IGFueSk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxmUmVzZXREYXRhKCk6IHZvaWQge1xyXG5cclxuICB9XHJcbn1cclxuIl19