@true-directive/grid
Version:
Angular Data Grid from Yopsilon.
395 lines • 50.2 kB
JavaScript
import * as tslib_1 from "tslib";
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
import { Component, Input, Output, EventEmitter, Renderer2, ElementRef, ViewChild, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { DropdownBaseComponent } from './dropdown-base.component';
import { GridSettings, GridState } from '@true-directive/base';
import { GridComponent } from '../grid.component';
import { Keys, Utils } from '@true-directive/base';
var SelectComponent = /** @class */ (function (_super) {
tslib_1.__extends(SelectComponent, _super);
function SelectComponent(_elementRef, _renderer) {
var _this = _super.call(this, _elementRef, _renderer) || this;
_this._elementRef = _elementRef;
_this._renderer = _renderer;
/**
* Current text value
*/
_this.displayValue = '';
// Запрос данных
_this.dataQuery = new EventEmitter();
_this._focusedValue = null;
_this._valueField = null;
_this._displayField = null;
_this.columns = [];
_this.parentState = null;
_this._settings = null;
_this.itemSelect = new EventEmitter();
// Выбираем ли мы из грида
_this._onGrid = false;
_this._empty = false;
_this._updating = false;
_this.useAltDown = false;
return _this;
}
SelectComponent_1 = SelectComponent;
Object.defineProperty(SelectComponent.prototype, "value", {
get: function () {
return this._value;
},
/**
* Current value
*/
set: function (v) {
if (v !== this._value) {
this._value = v;
this.writeValue(this._value);
this.onChange(v);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(SelectComponent.prototype, "valueField", {
get: function () {
if (this._valueField === null && this.columns.length > 0) {
return this.columns[0].fieldName;
}
return this._valueField === null ? 'id' : this._valueField;
},
set: function (fieldName) {
this._valueField = fieldName;
if (this._settings) {
// Настройки могут быть еще не созданы
this._settings.keyField = this._valueField;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(SelectComponent.prototype, "displayField", {
get: function () {
if (this._displayField === null && this.columns.length > 0) {
return this.columns[0].fieldName;
}
return this._displayField === null ? 'name' : this._displayField;
},
set: function (fieldName) {
this._displayField = fieldName;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SelectComponent.prototype, "settings", {
get: function () {
if (!this._settings) {
this._settings = GridSettings.minimal();
this._settings.keyField = this.valueField;
this._settings.widthUnit = 'em';
this._settings.showHeader = false;
this._settings.columnAutoWidth = false;
this._settings.enableTouchScroll = false;
this._settings.appearance.enableHoverAppearance = true;
}
return this._settings;
},
set: function (v) {
this._settings = v;
this._settings.enableTouchScroll = false;
},
enumerable: true,
configurable: true
});
SelectComponent.prototype.gridStartProcess = function (e) {
if (this._empty && this.settings.requestData) {
this._empty = false;
this._updating = true;
}
};
SelectComponent.prototype.gridEndProcess = function (e) {
var _this = this;
setTimeout(function () {
if (!_this.popup.visible) {
_this.showByTarget();
}
else {
// Let's update position of popup window. When list reduce, it may move
// up or down regarding input.
_this.popup.updatePosition();
}
});
this._updating = false;
if (this.grid.resultRows.length === 0) {
this._empty = true;
}
else {
this._empty = false;
}
};
SelectComponent.prototype.gridDataQuery = function (e) {
this.dataQuery.emit(e);
};
// Отображаем значение в компоненте. Formatter: Ctrl --> View
SelectComponent.prototype.writeValue = function (v) {
var _this = this;
this._value = v;
var found = this.items.find(function (item) { return item[_this.valueField] === v; });
if (!found) {
this.displayValue = '';
}
else {
this.displayValue = found[this.displayField];
}
};
// За один раз устанавливаем и значение и отображение
SelectComponent.prototype.setValue = function (value, displayValue) {
if (value !== this._value || displayValue !== this.displayValue) {
this._focusedValue = value;
this.displayValue = displayValue;
this.value = value;
}
};
// По введенному тексту ничего не найдено?
SelectComponent.prototype.empty = function () {
return this._empty;
};
// Происходит обновление данных?
SelectComponent.prototype.updating = function () {
return this._updating;
};
// Ответ
SelectComponent.prototype.fetchData = function (dataQuery, data) {
var sel = this.getSelectedRow();
if (sel) {
this._focusedValue = sel[this.valueField];
}
if (this.grid && this.popupVisible) {
this.grid.fetchData(dataQuery, data);
if (this._focusedValue) {
this.grid.locateByKey(this._focusedValue);
}
else {
if (this._value !== null) {
this.grid.locateByKey(this._value);
}
}
}
};
/**
* Общая ширина грида в выпадающем списке
* @return Ширина в заданных единицах измерения
*/
SelectComponent.prototype.gridWidth = function () {
var ww = 0;
this.columns.forEach(function (c) { return ww += c.width; });
return ww + this.settings.widthUnit;
};
/**
* Перекрываем показывание выпадающего окна, чтобы обновить вью грида
* и выделить строку, содержащую текущее значение
* @param e Параметры события
*/
SelectComponent.prototype.popupShow = function (e) {
this._onGrid = false;
if (this._value !== null) {
this.grid.locateByKey(this._value, this.valueField);
}
else {
if (this.shownByKey) {
this.grid.processKey(Keys.generateEvent(null, Keys.DOWN)); // Будет выбрана первая запись
}
}
this.grid.checkSize();
};
/**
* Обработчик клавиш вызывается из родительского класса
* Возвращает false, если клавиша не обработана
*/
SelectComponent.prototype.processKey = function (e) {
if (e.keyCode === Keys.ENTER) {
this.setValueFromGrid();
this.popup.closePopup();
return true;
}
if (!this.popupVisible) {
return false;
}
if (e.keyCode === Keys.ESCAPE) {
this.popup.closePopup();
e.preventDefault();
e.stopPropagation();
return true;
}
if (e.keyCode === Keys.DOWN || e.keyCode === Keys.UP) {
this._onGrid = true;
this.grid.processKey(e);
e.preventDefault();
return true;
}
return false;
};
// Клик по записи в гриде
SelectComponent.prototype.gridRowClick = function (e) {
this._onGrid = true;
this._skipFocusOnPopupClose = false;
this.value = e.row[this.valueField];
this.popup.closePopup();
this.itemSelect.emit(e.row);
};
// Поворот иконки
SelectComponent.prototype.iconClass = function () {
var s = 'true-icon-angle-down true-turnable';
if (this.popupVisible) {
s += ' true-turned';
}
return s;
};
// Ввод текста пользователем
SelectComponent.prototype.inputInput = function (e) {
var _this = this;
if (e === void 0) { e = null; }
// Окошко еще на выпало? показываем
if (!this.popupVisible && this.displayValue !== '') {
this.grid.searchString = this.displayValue;
return;
}
if (this.popupVisible) {
setTimeout(function () {
// Устанавливаем фильтр по тексту
_this.grid.searchString = _this.displayValue;
});
}
if (this.displayValue === '') {
this.setValue(null, '');
return;
}
this._value = null;
};
// Возврат выбранной строки в гриде
SelectComponent.prototype.getSelectedRow = function () {
if (this.grid && this.grid.state.selection.ranges.length > 0) {
var item = this.grid.state.selection.ranges[0].fromCell.row;
return item;
}
return null;
};
SelectComponent.prototype.containsDisplayed = function (s) {
return !this.displayValue || (s !== undefined && s.toLowerCase().indexOf(this.displayValue.toLowerCase()) >= 0);
};
// Установка значения по выделенной в гриде записи
SelectComponent.prototype.setValueFromGrid = function () {
var _this = this;
if (!this.popupVisible && this.grid.state.model) {
var found = this.grid.state.model.find(function (item) { return item[_this.displayField].toLowerCase() === _this.displayValue.toLowerCase(); });
if (found) {
this.setValue(found[this.valueField], found[this.displayField]);
}
else {
this.setValue(null, '');
}
return;
}
var sel = this.getSelectedRow();
if (sel && (this._onGrid || this.containsDisplayed(sel[this.displayField]))) {
this.setValue(sel[this.valueField], sel[this.displayField]);
}
else {
this.setValueFromDisplayed();
}
};
/**
* Установка значения по введенному тексту
*/
SelectComponent.prototype.setValueFromDisplayed = function () {
var _this = this;
// По запросу. Смотрим в гриде. Хотя, если подумать, можно всегда в гриде смотреть..
var f = null;
if (this.grid && this.grid.resultRows) {
f = this.grid.resultRows.find(function (item) { return item[_this.displayField].toLowerCase() === _this.displayValue.toLowerCase(); });
}
if (f) {
this.setValue(f[this.valueField], f[this.displayField]);
}
else {
this.setValue(null, '');
}
return;
};
/**
* Потеря фокуса инпутом
* @param e Параметры события
*/
SelectComponent.prototype.inputBlur = function (e) {
this._skipFocusOnPopupClose = true;
if ((this.value === null || this.value === undefined) && this.displayValue !== '') {
if (e.relatedTarget && Utils.isAncestor(this.popup.elementRef.nativeElement, e.relatedTarget)) {
// Если фокус перешел на...
return;
}
this.closePopup();
this.setValueFromDisplayed();
}
_super.prototype.inputBlur.call(this, e);
};
var SelectComponent_1;
tslib_1.__decorate([
Output('dataQuery'),
tslib_1.__metadata("design:type", EventEmitter)
], SelectComponent.prototype, "dataQuery", void 0);
tslib_1.__decorate([
Input('valueField'),
tslib_1.__metadata("design:type", String),
tslib_1.__metadata("design:paramtypes", [String])
], SelectComponent.prototype, "valueField", null);
tslib_1.__decorate([
Input('displayField'),
tslib_1.__metadata("design:type", String),
tslib_1.__metadata("design:paramtypes", [String])
], SelectComponent.prototype, "displayField", null);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Array)
], SelectComponent.prototype, "columns", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Array)
], SelectComponent.prototype, "items", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", GridState)
], SelectComponent.prototype, "parentState", void 0);
tslib_1.__decorate([
Input('settings'),
tslib_1.__metadata("design:type", Object),
tslib_1.__metadata("design:paramtypes", [Object])
], SelectComponent.prototype, "settings", null);
tslib_1.__decorate([
Output('itemSelect'),
tslib_1.__metadata("design:type", EventEmitter)
], SelectComponent.prototype, "itemSelect", void 0);
tslib_1.__decorate([
ViewChild('grid', { static: true }),
tslib_1.__metadata("design:type", GridComponent)
], SelectComponent.prototype, "grid", void 0);
SelectComponent = SelectComponent_1 = tslib_1.__decorate([
Component({
selector: 'true-select',
template: "\n <true-input-wrapper\n (btnClick)=\"btnClick($event)\"\n [disabled]=\"disabled\"\n class=\"true-select__input\"\n [class.true-input_popup-visible]=\"popupVisible\"\n [icon]=\"iconClass()\">\n <input #input\n [(ngModel)]=\"displayValue\"\n [readonly]=\"disableTextEditor\"\n [attr.disabled]=\"disabled\"\n [class.true-disable-te]=\"disableTextEditor\"\n (input)=\"inputInput($event)\"\n (click)=\"inputClick($event)\"\n (touchstart)=\"inputTouchStart($event)\"\n (touchmove)=\"inputTouchMove($event)\"\n (touchend)=\"inputTouchEnd($event)\"\n (blur)=\"inputBlur($event)\"\n (focus)=\"inputFocus($event)\"\n (keydown)=\"inputKeyDown($event)\"/>\n </true-input-wrapper>\n <true-popup #popup\n (close)=\"popupClose($event)\"\n (show)=\"popupShow($event)\" >\n <true-grid #grid\n [class.true-select__grid_hidden]=\"empty()\"\n class=\"true-select__grid\"\n [maxHeight]=\"maxDropDownHeight\"\n [columns]=\"columns\"\n [data]=\"items\"\n [settings]=\"settings\"\n (dataQuery)=\"gridDataQuery($event)\"\n (startProcess)=\"gridStartProcess($event)\"\n (endProcess)=\"gridEndProcess($event)\"\n (rowClick)=\"gridRowClick($event)\">\n </true-grid>\n <div *ngIf=\"empty()\" class=\"true-select__notfound\" [style.width]=\"gridWidth()\">\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E</div>\n <div *ngIf=\"updating()\" class=\"true-select__updating\">\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430...</div>\n </true-popup>\n ",
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return SelectComponent_1; }),
multi: true
}],
styles: ["\n\n .true-select__input {\n width: 100%;\n }\n\n input {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n }\n\n .true-select__grid_hidden {\n display: none;\n }\n\n .true-select__grid {\n border: none !important;\n cursor: pointer;\n }\n\n .true-select__notfound, .true-select__updating {\n padding: 0.6em;\n box-sizing: border-box;\n color: #aaa;\n }\n "]
}),
tslib_1.__metadata("design:paramtypes", [ElementRef,
Renderer2])
], SelectComponent);
return SelectComponent;
}(DropdownBaseComponent));
export { SelectComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0cnVlLWRpcmVjdGl2ZS9ncmlkLyIsInNvdXJjZXMiOlsic3JjL2NvbnRyb2xzL3NlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0VBSUU7QUFDRixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWUsWUFBWSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBRTFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUErRW5EO0lBQXFDLDJDQUFxQjtJQW1XeEQseUJBQ1ksV0FBdUIsRUFDdkIsU0FBb0I7UUFGaEMsWUFHSSxrQkFBTSxXQUFXLEVBQUUsU0FBUyxDQUFDLFNBRWhDO1FBSlcsaUJBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsZUFBUyxHQUFULFNBQVMsQ0FBVztRQW5XaEM7O1dBRUc7UUFDSSxrQkFBWSxHQUFXLEVBQUUsQ0FBQztRQWlCakMsZ0JBQWdCO1FBRWhCLGVBQVMsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUUvQyxtQkFBYSxHQUFRLElBQUksQ0FBQztRQUMxQixpQkFBVyxHQUFXLElBQUksQ0FBQztRQWtCM0IsbUJBQWEsR0FBVyxJQUFJLENBQUM7UUFjckMsYUFBTyxHQUFrQixFQUFFLENBQUM7UUFNNUIsaUJBQVcsR0FBYyxJQUFJLENBQUM7UUFFdEIsZUFB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QkFBZSxFQUFmLENBQWUsQ0FBQztvQkFDOUMsS0FBSyxFQUFFLElBQUk7aUJBQUMsQ0FBQztxQkE5QlIsZ2NBMEJSO1NBS0EsQ0FBQztpREFxV3VCLFVBQVU7WUFDWixTQUFTO09BcldyQixlQUFlLENBeVczQjtJQUFELHNCQUFDO0NBQUEsQUF6V0QsQ0FBcUMscUJBQXFCLEdBeVd6RDtTQXpXWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEhvc3RCaW5kaW5nLCBFdmVudEVtaXR0ZXIsIFJlbmRlcmVyMiwgRWxlbWVudFJlZixcclxuICAgICAgICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBQb3B1cENvbXBvbmVudCB9IGZyb20gJy4vcG9wdXAuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRHJvcGRvd25CYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9kcm9wZG93bi1iYXNlLmNvbXBvbmVudCc7XHJcblxyXG5pbXBvcnQgeyBHcmlkU2V0dGluZ3MsIEdyaWRTdGF0ZSB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgQ29sdW1uLCBEYXRhUXVlcnkgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcbmltcG9ydCB7IEdyaWRDb21wb25lbnQgfSBmcm9tICcuLi9ncmlkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEtleXMsIFV0aWxzIH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLXNlbGVjdCcsXHJcbiAgdGVtcGxhdGU6YFxyXG4gICAgICA8dHJ1ZS1pbnB1dC13cmFwcGVyXHJcbiAgICAgICAgKGJ0bkNsaWNrKT1cImJ0bkNsaWNrKCRldmVudClcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgY2xhc3M9XCJ0cnVlLXNlbGVjdF9faW5wdXRcIlxyXG4gICAgICAgIFtjbGFzcy50cnVlLWlucHV0X3BvcHVwLXZpc2libGVdPVwicG9wdXBWaXNpYmxlXCJcclxuICAgICAgICBbaWNvbl09XCJpY29uQ2xhc3MoKVwiPlxyXG4gICAgICAgIDxpbnB1dCAjaW5wdXRcclxuICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkaXNwbGF5VmFsdWVcIlxyXG4gICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZGlzYWJsZVRleHRFZGl0b3JcIlxyXG4gICAgICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgIFtjbGFzcy50cnVlLWRpc2FibGUtdGVdPVwiZGlzYWJsZVRleHRFZGl0b3JcIlxyXG4gICAgICAgICAgICAgICAoaW5wdXQpPVwiaW5wdXRJbnB1dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKGNsaWNrKT1cImlucHV0Q2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICh0b3VjaHN0YXJ0KT1cImlucHV0VG91Y2hTdGFydCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKHRvdWNobW92ZSk9XCJpbnB1dFRvdWNoTW92ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKHRvdWNoZW5kKT1cImlucHV0VG91Y2hFbmQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgIChibHVyKT1cImlucHV0Qmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKGZvY3VzKT1cImlucHV0Rm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgIChrZXlkb3duKT1cImlucHV0S2V5RG93bigkZXZlbnQpXCIvPlxyXG4gICAgICA8L3RydWUtaW5wdXQtd3JhcHBlcj5cclxuICAgICAgPHRydWUtcG9wdXAgI3BvcHVwXHJcbiAgICAgICAgKGNsb3NlKT1cInBvcHVwQ2xvc2UoJGV2ZW50KVwiXHJcbiAgICAgICAgKHNob3cpPVwicG9wdXBTaG93KCRldmVudClcIiA+XHJcbiAgICAgICAgPHRydWUtZ3JpZCAjZ3JpZFxyXG4gICAgICAgICAgICAgICAgIFtjbGFzcy50cnVlLXNlbGVjdF9fZ3JpZF9oaWRkZW5dPVwiZW1wdHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0cnVlLXNlbGVjdF9fZ3JpZFwiXHJcbiAgICAgICAgICAgICAgICAgW21heEhlaWdodF09XCJtYXhEcm9wRG93bkhlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgICAgW2RhdGFdPVwiaXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgIFtzZXR0aW5nc109XCJzZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgKGRhdGFRdWVyeSk9XCJncmlkRGF0YVF1ZXJ5KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgIChzdGFydFByb2Nlc3MpPVwiZ3JpZFN0YXJ0UHJvY2VzcygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAoZW5kUHJvY2Vzcyk9XCJncmlkRW5kUHJvY2VzcygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAocm93Q2xpY2spPVwiZ3JpZFJvd0NsaWNrKCRldmVudClcIj5cclxuICAgICAgICA8L3RydWUtZ3JpZD5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZW1wdHkoKVwiIGNsYXNzPVwidHJ1ZS1zZWxlY3RfX25vdGZvdW5kXCIgW3N0eWxlLndpZHRoXT1cImdyaWRXaWR0aCgpXCI+0J3QuNGH0LXQs9C+INC90LUg0L3QsNC50LTQtdC90L48L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwidXBkYXRpbmcoKVwiIGNsYXNzPVwidHJ1ZS1zZWxlY3RfX3VwZGF0aW5nXCI+0JfQsNCz0YDRg9C30LrQsC4uLjwvZGl2PlxyXG4gICAgICA8L3RydWUtcG9wdXA+XHJcbiAgICBgLFxyXG4gICAgLypcclxuICAgICAgUmVtb3ZlZDogOmhvc3QgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IH0gLSBpbnZhbGlkIGlvcyByZW5kZXJpbmcuXHJcbiAgICAgKi9cclxuICBzdHlsZXM6IFtgXHJcblxyXG4gICAgLnRydWUtc2VsZWN0X19pbnB1dCB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0IHtcclxuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIGhlaWdodDogMTAwJTtcclxuICAgIH1cclxuXHJcbiAgICAudHJ1ZS1zZWxlY3RfX2dyaWRfaGlkZGVuIHtcclxuICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAudHJ1ZS1zZWxlY3RfX2dyaWQge1xyXG4gICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC50cnVlLXNlbGVjdF9fbm90Zm91bmQsIC50cnVlLXNlbGVjdF9fdXBkYXRpbmcge1xyXG4gICAgICBwYWRkaW5nOiAwLjZlbTtcclxuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgY29sb3I6ICNhYWE7XHJcbiAgICB9XHJcbiAgYF0sXHJcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0Q29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWV9XVxyXG4gIH0pXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBEcm9wZG93bkJhc2VDb21wb25lbnQge1xyXG5cclxuICAvKipcclxuICAgKiBDdXJyZW50IHRleHQgdmFsdWVcclxuICAgKi9cclxuICBwdWJsaWMgZGlzcGxheVZhbHVlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogQ3VycmVudCB2YWx1ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXQgdmFsdWUodjogYW55KSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy5fdmFsdWUpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2O1xyXG4gICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5fdmFsdWUpO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB2YWx1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vINCX0LDQv9GA0L7RgSDQtNCw0L3QvdGL0YVcclxuICBAT3V0cHV0KCdkYXRhUXVlcnknKVxyXG4gIGRhdGFRdWVyeTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfZm9jdXNlZFZhbHVlOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgX3ZhbHVlRmllbGQ6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgndmFsdWVGaWVsZCcpXHJcbiAgcHVibGljIHNldCB2YWx1ZUZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl92YWx1ZUZpZWxkID0gZmllbGROYW1lO1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzKSB7XHJcbiAgICAgIC8vINCd0LDRgdGC0YDQvtC50LrQuCDQvNC+0LPRg9GCINCx0YvRgtGMINC10YnQtSDQvdC1INGB0L7Qt9C00LDQvdGLXHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLmtleUZpZWxkID0gdGhpcy5fdmFsdWVGaWVsZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdmFsdWVGaWVsZCgpIHtcclxuICAgIGlmICh0aGlzLl92YWx1ZUZpZWxkID09PSBudWxsICYmIHRoaXMuY29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNbMF0uZmllbGROYW1lO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlRmllbGQgPT09IG51bGwgPyAnaWQnIDogdGhpcy5fdmFsdWVGaWVsZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Rpc3BsYXlGaWVsZDogc3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoJ2Rpc3BsYXlGaWVsZCcpXHJcbiAgcHVibGljIHNldCBkaXNwbGF5RmllbGQoZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2Rpc3BsYXlGaWVsZCA9IGZpZWxkTmFtZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGlzcGxheUZpZWxkKCkge1xyXG4gICAgaWYgKHRoaXMuX2Rpc3BsYXlGaWVsZCA9PT0gbnVsbCAmJiB0aGlzLmNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb2x1bW5zWzBdLmZpZWxkTmFtZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5RmllbGQgPT09IG51bGwgPyAnbmFtZScgOiB0aGlzLl9kaXNwbGF5RmllbGQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGNvbHVtbnM6IEFycmF5PENvbHVtbj4gPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBpdGVtczogQXJyYXk8YW55PjtcclxuXHJcbiAgQElucHV0KClcclxuICBwYXJlbnRTdGF0ZTogR3JpZFN0YXRlID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfc2V0dGluZ3M6IEdyaWRTZXR0aW5ncyA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgnc2V0dGluZ3MnKVxyXG4gIHNldCBzZXR0aW5ncyh2KSB7XHJcbiAgICB0aGlzLl9zZXR0aW5ncyA9IHY7XHJcbiAgICB0aGlzLl9zZXR0aW5ncy5lbmFibGVUb3VjaFNjcm9sbCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNldHRpbmdzKCkge1xyXG4gICAgaWYgKCF0aGlzLl9zZXR0aW5ncykge1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncyA9IEdyaWRTZXR0aW5ncy5taW5pbWFsKCk7XHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLmtleUZpZWxkID0gdGhpcy52YWx1ZUZpZWxkO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy53aWR0aFVuaXQgPSAnZW0nO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy5zaG93SGVhZGVyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3NldHRpbmdzLmNvbHVtbkF1dG9XaWR0aCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy5lbmFibGVUb3VjaFNjcm9sbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9zZXR0aW5ncy5hcHBlYXJhbmNlLmVuYWJsZUhvdmVyQXBwZWFyYW5jZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3M7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCdpdGVtU2VsZWN0JylcclxuICBpdGVtU2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZ3JpZCcsIHtzdGF0aWM6IHRydWV9KVxyXG4gIGdyaWQ6IEdyaWRDb21wb25lbnQ7XHJcblxyXG4gIC8vINCS0YvQsdC40YDQsNC10Lwg0LvQuCDQvNGLINC40Lcg0LPRgNC40LTQsFxyXG4gIF9vbkdyaWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBfZW1wdHkgPSBmYWxzZTtcclxuXHJcbiAgZ3JpZFN0YXJ0UHJvY2VzcyhlOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLl9lbXB0eSAmJiB0aGlzLnNldHRpbmdzLnJlcXVlc3REYXRhKSB7XHJcbiAgICAgIHRoaXMuX2VtcHR5ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3VwZGF0aW5nID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF91cGRhdGluZyA9IGZhbHNlO1xyXG4gIGdyaWRFbmRQcm9jZXNzKGU6IGFueSkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5wb3B1cC52aXNpYmxlKSB7XHJcbiAgICAgICAgdGhpcy5zaG93QnlUYXJnZXQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBMZXQncyB1cGRhdGUgcG9zaXRpb24gb2YgcG9wdXAgd2luZG93LiBXaGVuIGxpc3QgcmVkdWNlLCBpdCBtYXkgbW92ZVxyXG4gICAgICAgIC8vIHVwIG9yIGRvd24gcmVnYXJkaW5nIGlucHV0LlxyXG4gICAgICAgIHRoaXMucG9wdXAudXBkYXRlUG9zaXRpb24oKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fdXBkYXRpbmcgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmdyaWQucmVzdWx0Um93cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5fZW1wdHkgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZW1wdHkgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdyaWREYXRhUXVlcnkoZTogYW55KSB7XHJcbiAgICB0aGlzLmRhdGFRdWVyeS5lbWl0KGUpO1xyXG4gIH1cclxuXHJcbiAgLy8g0J7RgtC+0LHRgNCw0LbQsNC10Lwg0LfQvdCw0YfQtdC90LjQtSDQsiDQutC+0LzQv9C+0L3QtdC90YLQtS4gRm9ybWF0dGVyOiBDdHJsIC0tPiBWaWV3XHJcbiAgd3JpdGVWYWx1ZSh2OiBhbnkpIHtcclxuICAgIHRoaXMuX3ZhbHVlID0gdjtcclxuICAgIGxldCBmb3VuZCA9IHRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW1bdGhpcy52YWx1ZUZpZWxkXSA9PT0gdik7XHJcbiAgICBpZiAoIWZvdW5kKSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gJyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IGZvdW5kW3RoaXMuZGlzcGxheUZpZWxkXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vINCX0LAg0L7QtNC40L0g0YDQsNC3INGD0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC8INC4INC30L3QsNGH0LXQvdC40LUg0Lgg0L7RgtC+0LHRgNCw0LbQtdC90LjQtVxyXG4gIHNldFZhbHVlKHZhbHVlOiBhbnksIGRpc3BsYXlWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuX3ZhbHVlIHx8IGRpc3BsYXlWYWx1ZSAhPT0gdGhpcy5kaXNwbGF5VmFsdWUpIHtcclxuICAgICAgdGhpcy5fZm9jdXNlZFZhbHVlID0gdmFsdWU7XHJcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gZGlzcGxheVZhbHVlO1xyXG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDQn9C+INCy0LLQtdC00LXQvdC90L7QvNGDINGC0LXQutGB0YLRgyDQvdC40YfQtdCz0L4g0L3QtSDQvdCw0LnQtNC10L3Qvj9cclxuICBlbXB0eSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9lbXB0eTtcclxuICB9XHJcblxyXG4gIC8vINCf0YDQvtC40YHRhdC+0LTQuNGCINC+0LHQvdC+0LLQu9C10L3QuNC1INC00LDQvdC90YvRhT9cclxuICB1cGRhdGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl91cGRhdGluZztcclxuICB9XHJcblxyXG4gIC8vINCe0YLQstC10YJcclxuICBmZXRjaERhdGEoZGF0YVF1ZXJ5OiBEYXRhUXVlcnksIGRhdGE6IEFycmF5PGFueT4pIHtcclxuICAgIGxldCBzZWwgPSB0aGlzLmdldFNlbGVjdGVkUm93KCk7XHJcbiAgICBpZiAoc2VsKSB7XHJcbiAgICAgIHRoaXMuX2ZvY3VzZWRWYWx1ZSA9IHNlbFt0aGlzLnZhbHVlRmllbGRdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmdyaWQgJiYgdGhpcy5wb3B1cFZpc2libGUpIHtcclxuICAgICAgdGhpcy5ncmlkLmZldGNoRGF0YShkYXRhUXVlcnksIGRhdGEpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5sb2NhdGVCeUtleSh0aGlzLl9mb2N1c2VkVmFsdWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkLmxvY2F0ZUJ5S2V5KHRoaXMuX3ZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCe0LHRidCw0Y8g0YjQuNGA0LjQvdCwINCz0YDQuNC00LAg0LIg0LLRi9C/0LDQtNCw0Y7RidC10Lwg0YHQv9C40YHQutC1XHJcbiAgICogQHJldHVybiDQqNC40YDQuNC90LAg0LIg0LfQsNC00LDQvdC90YvRhSDQtdC00LjQvdC40YbQsNGFINC40LfQvNC10YDQtdC90LjRj1xyXG4gICAqL1xyXG4gIGdyaWRXaWR0aCgpIHtcclxuICAgIGxldCB3dyA9IDA7XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjID0+IHd3ICs9IGMud2lkdGgpO1xyXG4gICAgcmV0dXJuIHd3ICsgdGhpcy5zZXR0aW5ncy53aWR0aFVuaXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDQn9C10YDQtdC60YDRi9Cy0LDQtdC8INC/0L7QutCw0LfRi9Cy0LDQvdC40LUg0LLRi9C/0LDQtNCw0Y7RidC10LPQviDQvtC60L3QsCwg0YfRgtC+0LHRiyDQvtCx0L3QvtCy0LjRgtGMINCy0YzRjiDQs9GA0LjQtNCwXHJcbiAgICog0Lgg0LLRi9C00LXQu9C40YLRjCDRgdGC0YDQvtC60YMsINGB0L7QtNC10YDQttCw0YnRg9GOINGC0LXQutGD0YnQtdC1INC30L3QsNGH0LXQvdC40LVcclxuICAgKiBAcGFyYW0gIGUg0J/QsNGA0LDQvNC10YLRgNGLINGB0L7QsdGL0YLQuNGPXHJcbiAgICovXHJcbiAgcG9wdXBTaG93KGU6IGFueSkge1xyXG4gICAgdGhpcy5fb25HcmlkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkLmxvY2F0ZUJ5S2V5KHRoaXMuX3ZhbHVlLCB0aGlzLnZhbHVlRmllbGQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuc2hvd25CeUtleSkge1xyXG4gICAgICAgIHRoaXMuZ3JpZC5wcm9jZXNzS2V5KEtleXMuZ2VuZXJhdGVFdmVudChudWxsLCBLZXlzLkRPV04pKTsgLy8g0JHRg9C00LXRgiDQstGL0LHRgNCw0L3QsCDQv9C10YDQstCw0Y8g0LfQsNC/0LjRgdGMXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZC5jaGVja1NpemUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqINCe0LHRgNCw0LHQvtGC0YfQuNC6INC60LvQsNCy0LjRiCDQstGL0LfRi9Cy0LDQtdGC0YHRjyDQuNC3INGA0L7QtNC40YLQtdC70YzRgdC60L7Qs9C+INC60LvQsNGB0YHQsFxyXG4gICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCIGZhbHNlLCDQtdGB0LvQuCDQutC70LDQstC40YjQsCDQvdC1INC+0LHRgNCw0LHQvtGC0LDQvdCwXHJcbiAgICovXHJcbiAgcHJvY2Vzc0tleShlOiBhbnkpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkVOVEVSKSB7XHJcbiAgICAgIHRoaXMuc2V0VmFsdWVGcm9tR3JpZCgpO1xyXG4gICAgICB0aGlzLnBvcHVwLmNsb3NlUG9wdXAoKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnBvcHVwVmlzaWJsZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5FU0NBUEUpIHtcclxuICAgICAgdGhpcy5wb3B1cC5jbG9zZVBvcHVwKCk7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5ET1dOIHx8IGUua2V5Q29kZSA9PT0gS2V5cy5VUCkge1xyXG4gICAgICB0aGlzLl9vbkdyaWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmdyaWQucHJvY2Vzc0tleShlKTtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyDQmtC70LjQuiDQv9C+INC30LDQv9C40YHQuCDQsiDQs9GA0LjQtNC1XHJcbiAgcHVibGljIGdyaWRSb3dDbGljayhlOiBhbnkpIHtcclxuICAgIHRoaXMuX29uR3JpZCA9IHRydWU7XHJcbiAgICB0aGlzLl9za2lwRm9jdXNPblBvcHVwQ2xvc2UgPSBmYWxzZTtcclxuICAgIHRoaXMudmFsdWUgPSBlLnJvd1t0aGlzLnZhbHVlRmllbGRdO1xyXG4gICAgdGhpcy5wb3B1cC5jbG9zZVBvcHVwKCk7XHJcbiAgICB0aGlzLml0ZW1TZWxlY3QuZW1pdChlLnJvdyk7XHJcbiAgfVxyXG5cclxuICAvLyDQn9C+0LLQvtGA0L7RgiDQuNC60L7QvdC60LhcclxuICBwdWJsaWMgaWNvbkNsYXNzKCkge1xyXG4gICAgbGV0IHMgPSAndHJ1ZS1pY29uLWFuZ2xlLWRvd24gdHJ1ZS10dXJuYWJsZSc7XHJcbiAgICBpZiAodGhpcy5wb3B1cFZpc2libGUpIHtcclxuICAgICAgcyArPSAnIHRydWUtdHVybmVkJztcclxuICAgIH1cclxuICAgIHJldHVybiBzO1xyXG4gIH1cclxuXHJcbiAgLy8g0JLQstC+0LQg0YLQtdC60YHRgtCwINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvQtdC8XHJcbiAgcHVibGljIGlucHV0SW5wdXQoZTogYW55ID0gbnVsbCkge1xyXG4gICAgLy8g0J7QutC+0YjQutC+INC10YnQtSDQvdCwINCy0YvQv9Cw0LvQvj8g0L/QvtC60LDQt9GL0LLQsNC10LxcclxuICAgIGlmICghdGhpcy5wb3B1cFZpc2libGUgJiYgdGhpcy5kaXNwbGF5VmFsdWUgIT09ICcnKSB7XHJcbiAgICAgIHRoaXMuZ3JpZC5zZWFyY2hTdHJpbmcgPSB0aGlzLmRpc3BsYXlWYWx1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBvcHVwVmlzaWJsZSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCDRhNC40LvRjNGC0YAg0L/QviDRgtC10LrRgdGC0YNcclxuICAgICAgICB0aGlzLmdyaWQuc2VhcmNoU3RyaW5nID0gdGhpcy5kaXNwbGF5VmFsdWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRpc3BsYXlWYWx1ZSA9PT0gJycpIHtcclxuICAgICAgdGhpcy5zZXRWYWx1ZShudWxsLCAnJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl92YWx1ZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDQktC+0LfQstGA0LDRgiDQstGL0LHRgNCw0L3QvdC+0Lkg0YHRgtGA0L7QutC4INCyINCz0YDQuNC00LVcclxuICBwcml2YXRlIGdldFNlbGVjdGVkUm93KCk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5ncmlkICYmIHRoaXMuZ3JpZC5zdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGl0ZW0gPSB0aGlzLmdyaWQuc3RhdGUuc2VsZWN0aW9uLnJhbmdlc1swXS5mcm9tQ2VsbC5yb3c7XHJcbiAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnRhaW5zRGlzcGxheWVkKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLmRpc3BsYXlWYWx1ZSB8fCAocyAhPT0gdW5kZWZpbmVkICYmIHMudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMuZGlzcGxheVZhbHVlLnRvTG93ZXJDYXNlKCkpID49IDApO1xyXG4gIH1cclxuXHJcbiAgLy8g0KPRgdGC0LDQvdC+0LLQutCwINC30L3QsNGH0LXQvdC40Y8g0L/QviDQstGL0LTQtdC70LXQvdC90L7QuSDQsiDQs9GA0LjQtNC1INC30LDQv9C40YHQuFxyXG4gIHByaXZhdGUgc2V0VmFsdWVGcm9tR3JpZCgpIHtcclxuXHJcbiAgICBpZiAoIXRoaXMucG9wdXBWaXNpYmxlICYmIHRoaXMuZ3JpZC5zdGF0ZS5tb2RlbCkge1xyXG5cclxuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmdyaWQuc3RhdGUubW9kZWwuZmluZChcclxuICAgICAgICAgIGl0ZW0gPT4gaXRlbVt0aGlzLmRpc3BsYXlGaWVsZF0udG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5kaXNwbGF5VmFsdWUudG9Mb3dlckNhc2UoKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShmb3VuZFt0aGlzLnZhbHVlRmllbGRdLCBmb3VuZFt0aGlzLmRpc3BsYXlGaWVsZF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUobnVsbCwgJycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWwgPSB0aGlzLmdldFNlbGVjdGVkUm93KCk7XHJcbiAgICBpZiAoc2VsICYmICh0aGlzLl9vbkdyaWQgfHwgdGhpcy5jb250YWluc0Rpc3BsYXllZChzZWxbdGhpcy5kaXNwbGF5RmllbGRdKSkpIHtcclxuICAgICAgdGhpcy5zZXRWYWx1ZShzZWxbdGhpcy52YWx1ZUZpZWxkXSwgc2VsW3RoaXMuZGlzcGxheUZpZWxkXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNldFZhbHVlRnJvbURpc3BsYXllZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog0KPRgdGC0LDQvdC+0LLQutCwINC30L3QsNGH0LXQvdC40Y8g0L/QviDQstCy0LXQtNC10L3QvdC+0LzRgyDRgtC10LrRgdGC0YNcclxuICAgKi9cclxuICBwdWJsaWMgc2V0VmFsdWVGcm9tRGlzcGxheWVkKCkge1xyXG4gICAgLy8g0J/QviDQt9Cw0L/RgNC+0YHRgy4g0KHQvNC+0YLRgNC40Lwg0LIg0LPRgNC40LTQtS4g0KXQvtGC0Y8sINC10YHQu9C4INC/0L7QtNGD0LzQsNGC0YwsINC80L7QttC90L4g0LLRgdC10LPQtNCwINCyINCz0YDQuNC00LUg0YHQvNC+0YLRgNC10YLRjC4uXHJcbiAgICBsZXQgZiA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5ncmlkICYmIHRoaXMuZ3JpZC5yZXN1bHRSb3dzKSB7XHJcbiAgICAgIGYgPSB0aGlzLmdyaWQucmVzdWx0Um93cy5maW5kKGl0ZW0gPT4gaXRlbVt0aGlzLmRpc3BsYXlGaWVsZF0udG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5kaXNwbGF5VmFsdWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZikge1xyXG4gICAgICB0aGlzLnNldFZhbHVlKGZbdGhpcy52YWx1ZUZpZWxkXSwgZlt0aGlzLmRpc3BsYXlGaWVsZF0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXRWYWx1ZShudWxsLCAnJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDQn9C+0YLQtdGA0Y8g0YTQvtC60YPRgdCwINC40L3Qv9GD0YLQvtC8XHJcbiAgICogQHBhcmFtICBlINCf0LDRgNCw0LzQtdGC0YDRiyDRgdC+0LHRi9GC0LjRj1xyXG4gICAqL1xyXG4gIGlucHV0Qmx1cihlOiBGb2N1c0V2ZW50KSB7XHJcbiAgICB0aGlzLl9za2lwRm9jdXNPblBvcHVwQ2xvc2UgPSB0cnVlO1xyXG4gICAgaWYgKCh0aGlzLnZhbHVlID09PSBudWxsIHx8IHRoaXMudmFsdWUgPT09IHVuZGVmaW5lZCkgJiYgdGhpcy5kaXNwbGF5VmFsdWUgIT09ICcnKSB7XHJcblxyXG4gICAgICBpZiAoZS5yZWxhdGVkVGFyZ2V0ICYmIFV0aWxzLmlzQW5jZXN0b3IodGhpcy5wb3B1cC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGUucmVsYXRlZFRhcmdldCkpIHtcclxuICAgICAgICAvLyDQldGB0LvQuCDRhNC+0LrRg9GBINC/0LXRgNC10YjQtdC7INC90LAuLi5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgICB0aGlzLnNldFZhbHVlRnJvbURpc3BsYXllZCgpO1xyXG4gICAgfVxyXG4gICAgc3VwZXIuaW5wdXRCbHVyKGUpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcm90ZWN0ZWQgX3JlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuICAgICAgc3VwZXIoX2VsZW1lbnRSZWYsIF9yZW5kZXJlcik7XHJcbiAgICAgIHRoaXMudXNlQWx0RG93biA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=