UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

619 lines (618 loc) 46.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, Output, ElementRef, EventEmitter } from '@angular/core'; import { TextArea } from '../../../../../component/dataview/input/TextArea.component'; import { I18N } from '../../../../../decorator/I18N.decorator'; import { Option } from '../../../../../decorator/Option.decorator'; import { NeedFocusService } from '../../../../../service/NeedFocusService.service'; import { FormatterFactory } from '../../../../../service/FormatterFactory.service'; const /** @type {?} */ TYPE_NAME = "material-text-area"; const /** @type {?} */ NORMAL = 'normal'; const /** @type {?} */ SUCCESS = 'success'; const /** @type {?} */ WARNING = 'warning'; const /** @type {?} */ ERROR = 'error'; export class MaterialTextArea extends TextArea { /** * @param {?} elementRef * @param {?} formatterFactory * @param {?} needFocusService */ constructor(elementRef, formatterFactory, needFocusService) { super(elementRef, formatterFactory, needFocusService); this.active = false; } /** * @return {?} */ ngOnInit() { super.ngOnInit(); this.refreshActiveTextArea(); } /** * @return {?} */ refreshActiveTextArea() { let /** @type {?} */ val = this.formattedData; if (val !== null && typeof val !== 'undefined') { if (typeof val === 'string' && val === '') { this.active = false; return; } if (!this.active) { this.active = true; } } else { this.active = false; } } /** * @return {?} */ doExpand() { if (this.elementRef && typeof $(this.elementRef.nativeElement).find('.material-text-area') !== 'undefined') { let /** @type {?} */ ele = $(this.elementRef.nativeElement).find('.material-text-area'); if (typeof $(ele).find('textarea') !== 'undefined') { let /** @type {?} */ textarea = $(ele).find('textarea'); if (textarea[0].clientHeight < textarea[0].scrollHeight) { textarea.height((textarea[0].scrollHeight)); } } } } /** * @return {?} */ getClassMatFocused() { return this.isReadOnly() ? { 'mat-focused': this._isClassFocused() } : {}; } /** * @return {?} */ _hasLabel() { if (this.label !== null && typeof this.label === 'string') { return true; } return false; } /** * @return {?} */ _hasDescription() { if (this.description !== null && typeof this.description === 'string' && this.description !== '') { return true; } return false; } /** * @return {?} */ _displayHelp() { let /** @type {?} */ hasHelp = this.hasHelp(); return hasHelp; } /** * @return {?} */ _isActive() { return this.active; } /** * @return {?} */ _isClassFocused() { return this.classFocused; } /** * @param {?} $event * @return {?} */ onKeyUp($event) { // emit event super.onKeyUp($event); } /** * @param {?} inputValue * @param {?} results * @return {?} */ onValidationEnd(inputValue, results) { } /** * @param {?} data * @param {?} inputVal * @return {?} */ onDataChange(data, inputVal) { super.onDataChange(data, inputVal); this.refreshActiveTextArea(); } /** * @param {?} $event * @return {?} */ doFocus($event) { super.doFocus($event); this.active = true; this.classFocused = true; } /** * @param {?} $event * @return {?} */ doLostFocus($event) { super.doLostFocus($event); this.refreshActiveTextArea(); this.classFocused = false; } /** * @param {?} event * @return {?} */ onFocus(event) { super.onFocus(event); this.active = true; this.classFocused = true; } /** * @param {?} $event * @return {?} */ onFocusing($event) { this.needFocusService.setFocusingComponent(this, $event); } /** * @param {?} $event * @return {?} */ onLostFocusing($event) { this.needFocusService.resetFocusingComponent($event); } /** * @param {?} $event * @return {?} */ onValueChanged($event) { super.onValueChanged($event); this.refreshActiveTextArea(); } /** * @return {?} */ getDescription() { return this.description; } /** * @param {?} description * @return {?} */ setDescription(description) { this.description = description; } /** * @return {?} */ getLabel() { return this.label; } /** * @param {?} label * @return {?} */ setLabel(label) { this.label = label; } /** * @return {?} */ isAutosize() { return this.autosize; } /** * @param {?} autosize * @return {?} */ setAutosize(autosize) { this.autosize = autosize; } /** * @return {?} */ getMatAutosizeMinRows() { return this.matAutosizeMinRows; } /** * @param {?} matAutosizeMinRows * @return {?} */ setMatAutosizeMinRows(matAutosizeMinRows) { this.matAutosizeMinRows = matAutosizeMinRows; } /** * @return {?} */ getMatAutosizeMaxRows() { return this.matAutosizeMaxRows; } /** * @param {?} matAutosizeMaxRows * @return {?} */ setMatAutosizeMaxRows(matAutosizeMaxRows) { this.matAutosizeMaxRows = matAutosizeMaxRows; } } MaterialTextArea.TYPE_NAME = TYPE_NAME; MaterialTextArea.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="material-input material-text-area" [style.width]="getWidth()"> <div class="textarea-wrapper" [class.active]="_isActive()"> <mat-form-field [ngClass]="getClassMatFocused()"> <textarea *ngIf="isAutosize() !== null && isAutosize() !== undefined && isAutosize()" matInput placeholder="{{getLabel() | phx_text}}" [disabled]="isDisabled()" [readonly]="isReadOnly()" [class.dirty]="isDataDirty()" (change)="onValueChanged($event)" (focusin)="onFocusing($event)" (blur)="onLostFocusing($event)" (keyup)="onKeyUp($event)" (keydown)="onKeyDown($event)" [value]="formattedData | phx_text" [class.normal]="isNormal() && !isDisabled()" [class.success]="isSuccess() && !isDisabled()" [class.warning]="isWarning() && !isDisabled()" [class.error]="isError() && !isDisabled()" [mat-autosize]="isAutosize()" [matAutosizeMinRows]="getMatAutosizeMinRows()" [matAutosizeMaxRows]="getMatAutosizeMaxRows()"></textarea> <textarea *ngIf="isAutosize() === null || isAutosize() === undefined || !isAutosize()" matInput placeholder="{{getLabel() | phx_text}}" [disabled]="isDisabled()" [readonly]="isReadOnly()" [class.dirty]="isDataDirty()" (change)="onValueChanged($event)" (focusin)="onFocusing($event)" (blur)="onLostFocusing($event)" (keyup)="onKeyUp($event)" (keydown)="onKeyDown($event)" [value]="formattedData | phx_text" [class.normal]="isNormal() && !isDisabled()" [class.success]="isSuccess() && !isDisabled()" [class.warning]="isWarning() && !isDisabled()" [class.error]="isError() && !isDisabled()"></textarea> </mat-form-field> </div> <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 */ MaterialTextArea.ctorParameters = () => [ { type: ElementRef, }, { type: FormatterFactory, }, { type: NeedFocusService, }, ]; MaterialTextArea.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 },], "formatter": [{ type: Input, args: ['formatter',] },], "formatterName": [{ type: Input, args: ['formatterName',] },], "formatterOptions": [{ type: Input, args: ['formatterOptions',] },], "formatterUsePropertyValue": [{ type: Input, args: ['formatterUsePropertyValue',] },], "type": [{ type: Input },], "width": [{ type: Input },], "cols": [{ type: Input },], "rows": [{ type: Input },], "label": [{ type: Input },], "description": [{ type: Input },], "autosize": [{ type: Input },], "matAutosizeMinRows": [{ type: Input },], "matAutosizeMaxRows": [{ 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',] },], "beforeKeyUpEvent": [{ type: Output, args: ['phxBeforeKeyUp',] },], "keyUpEvent": [{ type: Output, args: ['phxKeyUp',] },], "beforeKeyDownEvent": [{ type: Output, args: ['phxBeforeKeyDown',] },], "keyDownEvent": [{ type: Output, args: ['phxKeyDown',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialTextArea.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTextArea.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialTextArea.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTextArea.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTextArea.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], MaterialTextArea.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], MaterialTextArea.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTextArea.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTextArea.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], MaterialTextArea.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTextArea.prototype, "disabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTextArea.prototype, "field", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTextArea.prototype, "name", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTextArea.prototype, "typeOfData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTextArea.prototype, "readOnly", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], MaterialTextArea.prototype, "help", void 0); tslib_1.__decorate([ Option('formatter.instance'), tslib_1.__metadata("design:type", Object) ], MaterialTextArea.prototype, "formatter", void 0); tslib_1.__decorate([ Option('formatter.name'), tslib_1.__metadata("design:type", String) ], MaterialTextArea.prototype, "formatterName", void 0); tslib_1.__decorate([ Option('formatter.options'), tslib_1.__metadata("design:type", Object) ], MaterialTextArea.prototype, "formatterOptions", void 0); tslib_1.__decorate([ Option('formatter.usePropertyValue'), tslib_1.__metadata("design:type", Boolean) ], MaterialTextArea.prototype, "formatterUsePropertyValue", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTextArea.prototype, "type", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialTextArea.prototype, "width", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Number) ], MaterialTextArea.prototype, "cols", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Number) ], MaterialTextArea.prototype, "rows", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", String) ], MaterialTextArea.prototype, "label", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", String) ], MaterialTextArea.prototype, "description", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialTextArea.prototype, "autosize", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Number) ], MaterialTextArea.prototype, "matAutosizeMinRows", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Number) ], MaterialTextArea.prototype, "matAutosizeMaxRows", void 0); tslib_1.__decorate([ Option('load'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTextArea.prototype, "loadEvent", void 0); tslib_1.__decorate([ Option('startValidate'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTextArea.prototype, "startValidateEvent", void 0); tslib_1.__decorate([ Option('endValidate'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTextArea.prototype, "endValidateEvent", void 0); tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTextArea.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTextArea.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTextArea.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTextArea.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option('beforeChange'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTextArea.prototype, "beforeChangeEvent", void 0); tslib_1.__decorate([ Option('change'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTextArea.prototype, "changeEvent", void 0); tslib_1.__decorate([ Option('beforeKeyUp'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTextArea.prototype, "beforeKeyUpEvent", void 0); tslib_1.__decorate([ Option('keyUp'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTextArea.prototype, "keyUpEvent", void 0); tslib_1.__decorate([ Option('beforeKeyDown'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTextArea.prototype, "beforeKeyDownEvent", void 0); tslib_1.__decorate([ Option('keyDown'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialTextArea.prototype, "keyDownEvent", void 0); function MaterialTextArea_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ MaterialTextArea.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ MaterialTextArea.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ MaterialTextArea.propDecorators; /** @type {?} */ MaterialTextArea.TYPE_NAME; /** @type {?} */ MaterialTextArea.prototype.dataParent; /** @type {?} */ MaterialTextArea.prototype.ignoreParentData; /** @type {?} */ MaterialTextArea.prototype.data; /** @type {?} */ MaterialTextArea.prototype.ignoreParentDisabled; /** @type {?} */ MaterialTextArea.prototype.delegateHistory; /** @type {?} */ MaterialTextArea.prototype.onDisabled; /** @type {?} */ MaterialTextArea.prototype.onEnabled; /** @type {?} */ MaterialTextArea.prototype.loadingEnabled; /** @type {?} */ MaterialTextArea.prototype.i18nKey; /** @type {?} */ MaterialTextArea.prototype.bypass; /** @type {?} */ MaterialTextArea.prototype.options; /** @type {?} */ MaterialTextArea.prototype.disabled; /** @type {?} */ MaterialTextArea.prototype.field; /** @type {?} */ MaterialTextArea.prototype.name; /** @type {?} */ MaterialTextArea.prototype.typeOfData; /** @type {?} */ MaterialTextArea.prototype.readOnly; /** @type {?} */ MaterialTextArea.prototype.help; /** @type {?} */ MaterialTextArea.prototype.formatter; /** @type {?} */ MaterialTextArea.prototype.formatterName; /** @type {?} */ MaterialTextArea.prototype.formatterOptions; /** @type {?} */ MaterialTextArea.prototype.formatterUsePropertyValue; /** @type {?} */ MaterialTextArea.prototype.type; /** @type {?} */ MaterialTextArea.prototype.width; /** @type {?} */ MaterialTextArea.prototype.cols; /** @type {?} */ MaterialTextArea.prototype.rows; /** @type {?} */ MaterialTextArea.prototype.label; /** @type {?} */ MaterialTextArea.prototype.description; /** @type {?} */ MaterialTextArea.prototype.autosize; /** @type {?} */ MaterialTextArea.prototype.matAutosizeMinRows; /** @type {?} */ MaterialTextArea.prototype.matAutosizeMaxRows; /** @type {?} */ MaterialTextArea.prototype.loadEvent; /** @type {?} */ MaterialTextArea.prototype.startValidateEvent; /** @type {?} */ MaterialTextArea.prototype.endValidateEvent; /** @type {?} */ MaterialTextArea.prototype.beforeFocusEvent; /** @type {?} */ MaterialTextArea.prototype.focusEvent; /** @type {?} */ MaterialTextArea.prototype.beforeLostFocusEvent; /** @type {?} */ MaterialTextArea.prototype.lostFocusEvent; /** @type {?} */ MaterialTextArea.prototype.beforeChangeEvent; /** @type {?} */ MaterialTextArea.prototype.changeEvent; /** @type {?} */ MaterialTextArea.prototype.beforeKeyUpEvent; /** @type {?} */ MaterialTextArea.prototype.keyUpEvent; /** @type {?} */ MaterialTextArea.prototype.beforeKeyDownEvent; /** @type {?} */ MaterialTextArea.prototype.keyDownEvent; /** @type {?} */ MaterialTextArea.prototype.active; /** @type {?} */ MaterialTextArea.prototype.classFocused; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF0ZXJpYWxUZXh0QXJlYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi90aGVtZS9tYXRlcmlhbC9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvTWF0ZXJpYWxUZXh0QXJlYS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNERBQTRELENBQUM7QUFJdEYsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNuRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUtuRix1QkFBTSxTQUFTLEdBQVcsb0JBQW9CLENBQUM7QUFFL0MsdUJBQU0sTUFBTSxHQUFXLFFBQVEsQ0FBQztBQUNoQyx1QkFBTSxPQUFPLEdBQVcsU0FBUyxDQUFDO0FBQ2xDLHVCQUFNLE9BQU8sR0FBVyxTQUFTLENBQUM7QUFDbEMsdUJBQU0sS0FBSyxHQUFXLE9BQU8sQ0FBQztBQTRDOUIsTUFBTSx1QkFBd0IsU0FBUSxRQUFROzs7Ozs7SUE0SjVDLFlBQVksVUFBc0IsRUFBRSxnQkFBa0MsRUFBRSxnQkFBa0M7UUFDeEcsS0FBSyxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0tBQ3JCOzs7O0lBRU0sUUFBUTtRQUNiLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVqQixJQUFJLENBQUMscUJBQXFC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OztJQUc1QixNQUFNLENBQUMsZ0JBQWdCLENBQUM7Ozs7SUFHeEIsTUFBTSxDQUFDLG1CQUFtQixDQUFDOzs7O0lBRzNCLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQzs7OztJQUlwQyxNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFJUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFJUixJQUFJLEVBQUU7SUFDTixNQUFNLEVBQUU7Ozs7SUFHUixJQUFJLEVBQUU7SUFDTixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFNUixNQUFNLENBQUMsTUFBTSxDQUFDO3NDQUNNLFlBQVk7OztJQUloQyxNQUFNLENBQUMsZUFBZSxDQUFDO3NDQUNNLFlBQVk7OztJQUV6QyxNQUFNLENBQUMsYUFBYSxDQUFDO3NDQUNNLFlBQVk7OztJQUV2QyxNQUFNLENBQUMsYUFBYSxDQUFDO3NDQUNNLFlBQVk7OztJQUV2QyxNQUFNLENBQUMsT0FBTyxDQUFDO3NDQUNNLFlBQVk7OztJQUVqQyxNQUFNLENBQUMsaUJBQWlCLENBQUM7c0NBQ00sWUFBWTs7O0lBRTNDLE1BQU0sQ0FBQyxXQUFXLENBQUM7c0NBQ00sWUFBWTs7O0lBRXJDLE1BQU0sQ0FBQyxjQUFjLENBQUM7c0NBQ00sWUFBWTs7O0lBRXhDLE1BQU0sQ0FBQyxRQUFRLENBQUM7c0NBQ00sWUFBWTs7O0lBR2xDLE1BQU0sQ0FBQyxhQUFhLENBQUM7c0NBRU0sWUFBWTs7O0lBQ3ZDLE1BQU0sQ0FBQyxPQUFPLENBQUM7c0NBRU0sWUFBWTs7O0lBQ2pDLE1BQU0sQ0FBQyxlQUFlLENBQUM7c0NBRU0sWUFBWTs7O0lBQ3pDLE1BQU0sQ0FBQyxTQUFTLENBQUM7c0NBRU0sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVGV4dEFyZWEgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvVGV4dEFyZWEuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSUhhc0RhdGEgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb21wb25lbnQvSUhhc0RhdGEnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tcG9uZW50L21vZGVsL1ZhbGlkYXRpb25SZXN1bHQnO1xyXG5pbXBvcnQgeyBJSGFzSGVscCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudC9JSGFzSGVscCc7XHJcbmltcG9ydCB7IEkxOE4gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEZvcm1hdHRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zZXJ2aWNlL0Zvcm1hdHRlckZhY3Rvcnkuc2VydmljZSc7XHJcbmltcG9ydCB7IElGb3JtYXR0ZXIgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zaGFyZS9mb3JtYXR0ZXIvSUZvcm1hdHRlcic7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwibWF0ZXJpYWwtdGV4dC1hcmVhXCI7XHJcblxyXG5jb25zdCBOT1JNQUw6IHN0cmluZyA9ICdub3JtYWwnO1xyXG5jb25zdCBTVUNDRVNTOiBzdHJpbmcgPSAnc3VjY2Vzcyc7XHJcbmNvbnN0IFdBUk5JTkc6IHN0cmluZyA9ICd3YXJuaW5nJztcclxuY29uc3QgRVJST1I6IHN0cmluZyA9ICdlcnJvcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxyXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwibWF0ZXJpYWwtaW5wdXQgbWF0ZXJpYWwtdGV4dC1hcmVhXCIgW3N0eWxlLndpZHRoXT1cImdldFdpZHRoKClcIj5cclxuXHQ8ZGl2IGNsYXNzPVwidGV4dGFyZWEtd3JhcHBlclwiIFtjbGFzcy5hY3RpdmVdPVwiX2lzQWN0aXZlKClcIj5cclxuXHRcdDxtYXQtZm9ybS1maWVsZCBbbmdDbGFzc109XCJnZXRDbGFzc01hdEZvY3VzZWQoKVwiPlxyXG5cdFx0XHQ8dGV4dGFyZWEgKm5nSWY9XCJpc0F1dG9zaXplKCkgIT09IG51bGwgJiYgaXNBdXRvc2l6ZSgpICE9PSB1bmRlZmluZWQgJiYgaXNBdXRvc2l6ZSgpXCIgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJ7e2dldExhYmVsKCkgfCBwaHhfdGV4dH19XCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKVwiIFtyZWFkb25seV09XCJpc1JlYWRPbmx5KClcIiBbY2xhc3MuZGlydHldPVwiaXNEYXRhRGlydHkoKVwiIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiXHJcblx0XHRcdCAgKGZvY3VzaW4pPVwib25Gb2N1c2luZygkZXZlbnQpXCIgKGJsdXIpPVwib25Mb3N0Rm9jdXNpbmcoJGV2ZW50KVwiIChrZXl1cCk9XCJvbktleVVwKCRldmVudClcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIFt2YWx1ZV09XCJmb3JtYXR0ZWREYXRhIHwgcGh4X3RleHRcIiBbY2xhc3Mubm9ybWFsXT1cImlzTm9ybWFsKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy5zdWNjZXNzXT1cImlzU3VjY2VzcygpICYmICFpc0Rpc2FibGVkKClcIlxyXG5cdFx0XHQgIFtjbGFzcy53YXJuaW5nXT1cImlzV2FybmluZygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3MuZXJyb3JdPVwiaXNFcnJvcigpICYmICFpc0Rpc2FibGVkKClcIiBbbWF0LWF1dG9zaXplXT1cImlzQXV0b3NpemUoKVwiIFttYXRBdXRvc2l6ZU1pblJvd3NdPVwiZ2V0TWF0QXV0b3NpemVNaW5Sb3dzKClcIiBbbWF0QXV0b3NpemVNYXhSb3dzXT1cImdldE1hdEF1dG9zaXplTWF4Um93cygpXCI+PC90ZXh0YXJlYT5cclxuXHRcdFx0PHRleHRhcmVhICpuZ0lmPVwiaXNBdXRvc2l6ZSgpID09PSBudWxsIHx8IGlzQXV0b3NpemUoKSA9PT0gdW5kZWZpbmVkIHx8ICFpc0F1dG9zaXplKClcIiBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cInt7Z2V0TGFiZWwoKSB8IHBoeF90ZXh0fX1cIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCIgW3JlYWRvbmx5XT1cImlzUmVhZE9ubHkoKVwiIFtjbGFzcy5kaXJ0eV09XCJpc0RhdGFEaXJ0eSgpXCJcclxuXHRcdFx0ICAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIiAoZm9jdXNpbik9XCJvbkZvY3VzaW5nKCRldmVudClcIiAoYmx1cik9XCJvbkxvc3RGb2N1c2luZygkZXZlbnQpXCIgKGtleXVwKT1cIm9uS2V5VXAoJGV2ZW50KVwiIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCIgW3ZhbHVlXT1cImZvcm1hdHRlZERhdGEgfCBwaHhfdGV4dFwiIFtjbGFzcy5ub3JtYWxdPVwiaXNOb3JtYWwoKSAmJiAhaXNEaXNhYmxlZCgpXCJcclxuXHRcdFx0ICBbY2xhc3Muc3VjY2Vzc109XCJpc1N1Y2Nlc3MoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLndhcm5pbmddPVwiaXNXYXJuaW5nKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy5lcnJvcl09XCJpc0Vycm9yKCkgJiYgIWlzRGlzYWJsZWQoKVwiPjwvdGV4dGFyZWE+XHJcblx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdDwvZGl2PlxyXG5cdDxkaXYgY2xhc3M9XCJ2YWxpZGF0aW9uXCIgW3N0eWxlLmRpc3BsYXldPVwiZ2V0VmFsaWRhdGlvblJlc3VsdE1lc3NhZ2UoKSA/IHVuZGVmaW5lZCA6ICdub25lJ1wiIFtjbGFzcy5ub3JtYWxdPVwiaXNOb3JtYWwoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLnN1Y2Nlc3NdPVwiaXNTdWNjZXNzKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy53YXJuaW5nXT1cImlzV2FybmluZygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3MuZXJyb3JdPVwiaXNFcnJvcigpICYmICFpc0Rpc2FibGVkKClcIj5cclxuXHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRWYWxpZGF0aW9uUmVzdWx0TWVzc2FnZSgpXCIgW25nSWZFbHNlXT1cInZhbGlkYXRpb25fZWxzZVwiPlxyXG5cdFx0XHR7e2dldFZhbGlkYXRpb25SZXN1bHRNZXNzYWdlKCkgfCBwaHhfdGV4dH19XHJcblx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0PG5nLXRlbXBsYXRlICN2YWxpZGF0aW9uX2Vsc2U+XHJcblx0XHRcdDwhLS0gV2UndmUgdG8gcHV0IHdoaXRlc3BhY2UgaWYgdGhlcmUgaXMgbm8gdmFsaWRhdGlvbiBtc2cgdG8gcHJldmVudCBlbXB0eSBkb20gLS0+XHJcblx0XHRcdDwhLS0gc2luY2UgaWYgdmFsaWRhdGUgbXNnJ3MgPGRpdj4gZG9tIGlzIGVtcHR5LCB0aGUgY29tcG9uZW50IHBvc2l0aW9uaW5nIC0tPlxyXG5cdFx0XHQ8IS0tIHdpbGwgYmUgbWlzcGxhY2VkLiAtLT5cclxuXHRcdFx0e3sgJyZuYnNwOycgfX1cclxuXHRcdDwvbmctdGVtcGxhdGU+XHJcblx0PC9kaXY+XHJcblx0PGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCIgW3N0eWxlLmRpc3BsYXldPVwiZ2V0VmFsaWRhdGlvblJlc3VsdE1lc3NhZ2UoKSA/ICdub25lJyA6IHVuZGVmaW5lZFwiIFtjbGFzcy5ub3JtYWxdPVwiaXNOb3JtYWwoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLnN1Y2Nlc3NdPVwiaXNTdWNjZXNzKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy53YXJuaW5nXT1cImlzV2FybmluZygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3MuZXJyb3JdPVwiaXNFcnJvcigpICYmICFpc0Rpc2FibGVkKClcIj5cclxuXHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXREZXNjcmlwdGlvbigpXCIgW25nSWZFbHNlXT1cImRlc2NyaXB0aW9uX2Vsc2VcIj5cclxuXHRcdFx0e3sgZ2V0RGVzY3JpcHRpb24oKSB8IHBoeF90ZXh0IH19XHJcblx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0PG5nLXRlbXBsYXRlICNkZXNjcmlwdGlvbl9lbHNlPlxyXG5cdFx0XHQ8IS0tIFdlJ3ZlIHRvIHB1dCB3aGl0ZXNwYWNlIGlmIHRoZXJlIGlzIG5vIGRlc2NyaXB0aW9uIHRvIHByZXZlbnQgZW1wdHkgZG9tIC0tPlxyXG5cdFx0XHQ8IS0tIHNpbmNlIGlmIGRlc2NyaXB0aW9uJ3MgPGRpdj4gZG9tIGlzIGVtcHR5LCB0aGUgY29tcG9uZW50IHBvc2l0aW9uaW5nIC0tPlxyXG5cdFx0XHQ8IS0tIHdpbGwgYmUgbWlzcGxhY2VkLiAtLT5cclxuXHRcdFx0e3sgJyZuYnNwOycgfX1cclxuXHRcdDwvbmctdGVtcGxhdGU+XHJcblx0PC9kaXY+XHJcblx0PGRpdiBjbGFzcz1cImhlbHBcIj5cclxuXHRcdHt7Z2V0SGVscCgpIHwgcGh4X3RleHR9fVxyXG5cdDwvZGl2PlxyXG48L2Rpdj5cclxuYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWF0ZXJpYWxUZXh0QXJlYSBleHRlbmRzIFRleHRBcmVhIGltcGxlbWVudHMgT25Jbml0LCBJSGFzSGVscCB7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XHJcblxyXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBASW5wdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGVsZWdhdGVIaXN0b3J5OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbG9hZGluZ0VuYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaTE4bktleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgnaTE4bkJ5cGFzcycpXHJcbiAgQE9wdGlvbignaTE4bkJ5cGFzcycpXHJcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBvcHRpb25zOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGZpZWxkOiBzdHJpbmc7XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RJbnB1dERhdGFWaWV3XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbmFtZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIHR5cGVPZkRhdGE6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCByZWFkT25seTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBJMThOKClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaGVscDogYW55O1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRm9ybWF0dGVySW5wdXREYXRhVmlld1xyXG4gIEBJbnB1dCgnZm9ybWF0dGVyJylcclxuICBAT3B0aW9uKCdmb3JtYXR0ZXIuaW5zdGFuY2UnKVxyXG4gIHByb3RlY3RlZCBmb3JtYXR0ZXI6IElGb3JtYXR0ZXI7XHJcbiAgQElucHV0KCdmb3JtYXR0ZXJOYW1lJylcclxuICBAT3B0aW9uKCdmb3JtYXR0ZXIubmFtZScpXHJcbiAgcHJvdGVjdGVkIGZvcm1hdHRlck5hbWU6IHN0cmluZztcclxuICBASW5wdXQoJ2Zvcm1hdHRlck9wdGlvbnMnKVxyXG4gIEBPcHRpb24oJ2Zvcm1hdHRlci5vcHRpb25zJylcclxuICBwcm90ZWN0ZWQgZm9ybWF0dGVyT3B0aW9uczogYW55O1xyXG4gIEBJbnB1dCgnZm9ybWF0dGVyVXNlUHJvcGVydHlWYWx1ZScpXHJcbiAgQE9wdGlvbignZm9ybWF0dGVyLnVzZVByb3BlcnR5VmFsdWUnKVxyXG4gIHByb3RlY3RlZCBmb3JtYXR0ZXJVc2VQcm9wZXJ0eVZhbHVlOiBib29sZWFuO1xyXG4gIC8vIC0tLSBmcm9tIFRleHRCb3hcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCB0eXBlOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgd2lkdGg6IHN0cmluZztcclxuICAvLyAtLS0gZnJvbSBUZXh0QXJlYVxyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGNvbHM6IG51bWJlcjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCByb3dzOiBudW1iZXI7XHJcbiAgLy8gLS0tIHNlbGZcclxuICBASW5wdXQoKVxyXG4gIEBJMThOKClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbGFiZWw6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBJMThOKClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGVzY3JpcHRpb246IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBhdXRvc2l6ZTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBtYXRBdXRvc2l6ZU1pblJvd3M6IG51bWJlcjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBtYXRBdXRvc2l6ZU1heFJvd3M6IG51bWJlcjtcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBPdXRwdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXHJcbiAgQE91dHB1dCgncGh4TG9hZCcpXHJcbiAgQE9wdGlvbignbG9hZCcpXHJcbiAgcHJvdGVjdGVkIGxvYWRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xyXG4gIEBPdXRwdXQoJ3BoeFN0YXJ0VmFsaWRhdGUnKVxyXG4gIEBPcHRpb24oJ3N0YXJ0VmFsaWRhdGUnKVxyXG4gIHByb3RlY3RlZCBzdGFydFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEVuZFZhbGlkYXRlJylcclxuICBAT3B0aW9uKCdlbmRWYWxpZGF0ZScpXHJcbiAgcHJvdGVjdGVkIGVuZFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUZvY3VzJylcclxuICBAT3B0aW9uKCdiZWZvcmVGb2N1cycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEZvY3VzJylcclxuICBAT3B0aW9uKCdmb2N1cycpXHJcbiAgcHJvdGVjdGVkIGZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUxvc3RGb2N1cycpXHJcbiAgQE9wdGlvbignYmVmb3JlTG9zdEZvY3VzJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlTG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeExvc3RGb2N1cycpXHJcbiAgQE9wdGlvbignbG9zdEZvY3VzJylcclxuICBwcm90ZWN0ZWQgbG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYW5nZScpXHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhbmdlJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeENoYW5nZScpIFxyXG4gIEBPcHRpb24oJ2NoYW5nZScpXHJcbiAgcHJvdGVjdGVkIGNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0Zvcm1hdHRlcklucHV0RGF0YVZpZXdcclxuICAvLyAtLS0gZnJvbSBUZXh0Qm94XHJcbiAgQE9wdGlvbignYmVmb3JlS2V5VXAnKVxyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUtleVVwJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlS2V5VXBFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbigna2V5VXAnKVxyXG4gIEBPdXRwdXQoJ3BoeEtleVVwJylcclxuICBwcm90ZWN0ZWQga2V5VXBFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlS2V5RG93bicpXHJcbiAgQE91dHB1dCgncGh4QmVmb3JlS2V5RG93bicpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUtleURvd25FdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbigna2V5RG93bicpXHJcbiAgQE91dHB1dCgncGh4S2V5RG93bicpXHJcbiAgcHJvdGVjdGVkIGtleURvd25FdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIC8vIC0tLSBmcm9tIFNlbGZcclxuICBwcml2YXRlIGFjdGl2ZTogYm9vbGVhbjtcclxuICBwcml2YXRlIGNsYXNzRm9jdXNlZDogYm9vbGVhbjtcclxuICAvLyBwcml2YXRlIF9hdXRvRXhwYW5kOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBmb3JtYXR0ZXJGYWN0b3J5OiBGb3JtYXR0ZXJGYWN0b3J5LCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihlbGVtZW50UmVmLCBmb3JtYXR0ZXJGYWN0b3J5LCBuZWVkRm9jdXNTZXJ2aWNlKTtcclxuXHJcbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICB0aGlzLnJlZnJlc2hBY3RpdmVUZXh0QXJlYSgpO1xyXG4gIH0gXHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaEFjdGl2ZVRleHRBcmVhKCk6IHZvaWQge1xyXG4gICAgbGV0IHZhbCA9IHRoaXMuZm9ybWF0dGVkRGF0YTtcclxuXHJcbiAgICBpZiAodmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwgPT09ICcnKSB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmFjdGl2ZSkge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZG9FeHBhbmQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmICYmIHR5cGVvZiAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcubWF0ZXJpYWwtdGV4dC1hcmVhJykgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGxldCBlbGUgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcubWF0ZXJpYWwtdGV4dC1hcmVhJyk7XHJcblxyXG4gICAgICBpZiAodHlwZW9mICQoZWxlKS5maW5kKCd0ZXh0YXJlYScpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGxldCB0ZXh0YXJlYSA9ICQoZWxlKS5maW5kKCd0ZXh0YXJlYScpO1xyXG5cclxuICAgICAgICBpZiAodGV4dGFyZWFbMF0uY2xpZW50SGVpZ2h0IDwgdGV4dGFyZWFbMF0uc2Nyb2xsSGVpZ2h0KSB7XHJcbiAgICAgICAgICB0ZXh0YXJlYS5oZWlnaHQoKHRleHRhcmVhWzBdLnNjcm9sbEhlaWdodCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENsYXNzTWF0Rm9jdXNlZCgpOiBhbnl7XHJcbiAgICByZXR1cm4gdGhpcy5pc1JlYWRPbmx5KCkgPyB7J21hdC1mb2N1c2VkJzogdGhpcy5faXNDbGFzc0ZvY3VzZWQoKX0gOiB7fTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBfaGFzTGFiZWwoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5sYWJlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5sYWJlbCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgX2hhc0Rlc2NyaXB0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24gIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnICYmIHRoaXMuZGVzY3JpcHRpb24gIT09ICcnKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIF9kaXNwbGF5SGVscCgpOiBib29sZWFuIHtcclxuICAgIGxldCBoYXNIZWxwID0gdGhpcy5oYXNIZWxwKCk7XHJcblxyXG4gICAgcmV0dXJuIGhhc0hlbHA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgX2lzQWN0aXZlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIF9pc0NsYXNzRm9jdXNlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNsYXNzRm9jdXNlZDtcclxuICB9XHJcblxyXG4gIC8vIFRvIGF1dG8gZXhwYW5kIHRleHRhcmVhXHJcbiAgcHVibGljIG9uS2V5VXAoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gZW1pdCBldmVudFxyXG4gICAgc3VwZXIub25LZXlVcCgkZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uVmFsaWRhdGlvbkVuZChpbnB1dFZhbHVlOiBhbnksIHJlc3VsdHM6IFZhbGlkYXRpb25SZXN1bHRbXSk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZShkYXRhOiBhbnksIGlucHV0VmFsOiBhbnkpOiB2b2lkIHtcclxuICAgIHN1cGVyLm9uRGF0YUNoYW5nZShkYXRhLCBpbnB1dFZhbCk7XHJcblxyXG4gICAgdGhpcy5yZWZyZXNoQWN0aXZlVGV4dEFyZWEoKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHN1cGVyLmRvRm9jdXMoJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XHJcbiAgICB0aGlzLmNsYXNzRm9jdXNlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZG9Mb3N0Rm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgc3VwZXIuZG9Mb3N0Rm9jdXMoJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLnJlZnJlc2hBY3RpdmVUZXh0QXJlYSgpO1xyXG4gICAgdGhpcy5jbGFzc0ZvY3VzZWQgPSBmYWxzZTtcclxuICB9XHJcbiAgcHVibGljIG9uRm9jdXMoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgc3VwZXIub25Gb2N1cyhldmVudCk7XHJcblxyXG4gICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xyXG4gICAgdGhpcy5jbGFzc0ZvY3VzZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRm9jdXNpbmcoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnNldEZvY3VzaW5nQ29tcG9uZW50KHRoaXMsICRldmVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Mb3N0Rm9jdXNpbmcoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnJlc2V0Rm9jdXNpbmdDb21wb25lbnQoJGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblZhbHVlQ2hhbmdlZCgkZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBzdXBlci5vblZhbHVlQ2hhbmdlZCgkZXZlbnQpO1xyXG5cclxuICAgIHRoaXMucmVmcmVzaEFjdGl2ZVRleHRBcmVhKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGVzY3JpcHRpb24oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubGFiZWw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TGFiZWwobGFiZWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQXV0b3NpemUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdXRvc2l6ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRBdXRvc2l6ZShhdXRvc2l6ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5hdXRvc2l6ZSA9IGF1dG9zaXplO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE1hdEF1dG9zaXplTWluUm93cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0QXV0b3NpemVNaW5Sb3dzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE1hdEF1dG9zaXplTWluUm93cyhtYXRBdXRvc2l6ZU1pblJvd3M6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5tYXRBdXRvc2l6ZU1pblJvd3MgPSBtYXRBdXRvc2l6ZU1pblJvd3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TWF0QXV0b3NpemVNYXhSb3dzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXRBdXRvc2l6ZU1heFJvd3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TWF0QXV0b3NpemVNYXhSb3dzKG1hdEF1dG9zaXplTWF4Um93czogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLm1hdEF1dG9zaXplTWF4Um93cyA9IG1hdEF1dG9zaXplTWF4Um93cztcclxuICB9XHJcbn1cclxuIl19