com.phloxui
Version:
PhloxUI Ng2+ Framework
619 lines (618 loc) • 46.8 kB
JavaScript
/**
* @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. -->
{{ ' ' }}
</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. -->
{{ ' ' }}
</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