ftable
Version:
Angular 6/7 Tables
227 lines • 29.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { firstBy } from 'thenby';
import { FTableResult } from '../ftable.model';
import { empty } from 'rxjs';
import { of } from 'rxjs';
var FTableLocalService = /** @class */ (function () {
function FTableLocalService(http) {
this.http = http;
this.data = [];
}
/**
* @param {?} data
* @return {?}
*/
FTableLocalService.prototype.setLocalTableData = /**
* @param {?} data
* @return {?}
*/
function (data) {
this.mode = '';
this.data = data;
};
/**
* @param {?} id
* @return {?}
*/
FTableLocalService.prototype.get = /**
* @param {?} id
* @return {?}
*/
function (id) {
// console.log('get');
return this.getRowByColumnNameAndValue('id', id);
};
/**
* @param {?} name
* @param {?} value
* @return {?}
*/
FTableLocalService.prototype.getRowByColumnNameAndValue = /**
* @param {?} name
* @param {?} value
* @return {?}
*/
function (name, value) {
// console.log('getRowByColumnNameAndValue'+' '+name+' '+value);
// console.log('getRowByColumnNameAndValue'+' '+name+' '+value);
/** @type {?} */
var result = this.data.filter(function (x) { return x[name] == value; });
// console.log('getRowByColumnNameAndValue'+' '+name+' '+value);
if (result.length > 0) {
return of(result[0]);
}
return empty();
};
/*
*
*/
/*
*
*/
/**
* @param {?} id
* @param {?} propertyToChange
* @param {?} fn
* @return {?}
*/
FTableLocalService.prototype.setData = /*
*
*/
/**
* @param {?} id
* @param {?} propertyToChange
* @param {?} fn
* @return {?}
*/
function (id, propertyToChange, fn) {
/** @type {?} */
var row = this.data.find(function (d) { return d['id'] === id; });
row[propertyToChange] = fn(row[propertyToChange]);
return of(row);
};
/**
* @param {?} id
* @return {?}
*/
FTableLocalService.prototype.delete = /**
* @param {?} id
* @return {?}
*/
function (id) {
// cant modify JSON files frontend
/** @type {?} */
var row = this.data.find(function (d) { return d['id'] === id; });
return of(row);
};
/**
* @param {?} table
* @return {?}
*/
FTableLocalService.prototype.getData = /**
* @param {?} table
* @return {?}
*/
function (table) {
/** @type {?} */
var data = this.data;
var _loop_1 = function (i) {
if (table.columns[i].type === 'checkbox') {
table.columns[i].filterData = Array.from(new Set(data.map(function (x) { return x[table.columns[i].name]; })));
}
};
for (var i = 0; i < table.columns.length; i++) {
_loop_1(i);
}
/** @type {?} */
var totalRows = data.length;
// Generic Search
if (table.dataModifier.search.value) {
table.dataModifier.currentPage = 1;
if (table.columns.length > 0) {
/** @type {?} */
var temp = [];
var _loop_2 = function (i) {
if (table.columns[i].name.length > 0) {
temp = temp.concat(data.filter(function (x) { return String(x[table.columns[i].name]).indexOf(table.dataModifier.search.value) !== -1; }));
data = data.filter(function (x) { return String(x[table.columns[i].name]).indexOf(table.dataModifier.search.value) === -1; });
}
};
for (var i = 0; i < table.columns.length; i++) {
_loop_2(i);
}
data = temp;
}
}
if (table.dataModifier.filters.length > 0) {
for (var i = 0; i < table.dataModifier.filters.length; i++) {
if (table.dataModifier.filters[i].apply)
data = table.dataModifier.filters[i].apply(data);
}
}
// Column Priority Sorting
if (table.dataModifier.orders.length > 0) {
/** @type {?} */
var sortBy = void 0;
var _loop_3 = function (i) {
/** @type {?} */
var order = (table.dataModifier.orders[i].direction === 'Desc') ? -1 : 1;
if (i === 0) {
if (typeof data[0][table.dataModifier.orders[i].columnName] === 'string') {
// console.log('String firstBy:' + table.columns[table.orders[i].columnIndex].name);
sortBy = firstBy(table.dataModifier.orders[i].columnName, {
ignoreCase: true,
direction: order
});
}
else if (typeof data[0][table.dataModifier.orders[i].columnName] === 'number') {
sortBy = firstBy(function (v1, v2) {
return v1[table.dataModifier.orders[i].columnName] - v2[table.dataModifier.orders[i].columnName];
}, order);
}
else {
// console.log('otherType sort:' + typeof data[0][table.columns[table.dataModifier.orders[i].columnIndex].name]);
}
}
else {
if (typeof data[0][table.dataModifier.orders[i].columnName] === 'string') {
sortBy = sortBy.thenBy(table.dataModifier.orders[i].columnName, {
ignoreCase: true,
direction: order
});
}
else if (typeof data[0][table.dataModifier.orders[i].columnName] === 'number') {
sortBy = sortBy.thenBy(function (v1, v2) {
return v1[table.dataModifier.orders[i].columnName] - v2[table.dataModifier.orders[i].columnName];
}, order);
}
else {
console.log('otherType sort');
}
}
};
for (var i = 0; i < table.dataModifier.orders.length; i++) {
_loop_3(i);
}
data.sort(sortBy);
}
// console.log('SIZE:' + table.dataModifier.currentPage + ' ' + table.pageSizes[table.pageSizeIndex]);
// this.page = this.data.slice(( this.currentPage - 1) * this.pageSize, this.currentPage * this.pageSize);
/** @type {?} */
var totalRowsAfterModifications = data.length;
/** @type {?} */
var page = data.slice((table.dataModifier.currentPage - 1) * table.pageSizes[table.pageSizeIndex], (table.dataModifier.currentPage * (table.pageSizes[table.pageSizeIndex])));
/** @type {?} */
var result = new FTableResult(page, totalRows, totalRowsAfterModifications, null);
return of(result);
};
FTableLocalService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
FTableLocalService.ctorParameters = function () { return [
{ type: HttpClient }
]; };
return FTableLocalService;
}());
export { FTableLocalService };
if (false) {
/** @type {?} */
FTableLocalService.prototype.data;
/**
* @type {?}
* @private
*/
FTableLocalService.prototype.mode;
/**
* @type {?}
* @private
*/
FTableLocalService.prototype.http;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnRhYmxlbG9jYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Z0YWJsZS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlL2Z0YWJsZWxvY2FsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBS2xELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxFQUFxQyxZQUFZLEVBQXVCLE1BQU0saUJBQWlCLENBQUM7QUFFdkcsT0FBTyxFQUFjLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBSXpCO0lBR0ksNEJBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFHN0IsU0FBSSxHQUFHLEVBQUUsQ0FBQztJQUZqQixDQUFDOzs7OztJQUtELDhDQUFpQjs7OztJQUFqQixVQUFrQixJQUFXO1FBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQzs7Ozs7SUFHRCxnQ0FBRzs7OztJQUFILFVBQUksRUFBTTtRQUNOLHVCQUF1QjtRQUN0QixPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEVBQUMsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQzs7Ozs7O0lBRUQsdURBQTBCOzs7OztJQUExQixVQUEyQixJQUFZLEVBQUMsS0FBUztRQUM3QyxnRUFBZ0U7OztZQUUxRCxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUcsS0FBSyxFQUFmLENBQWUsQ0FBQztRQUNyRCxn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OztnQkFuSUYsVUFBVTs7OztnQkFiRixVQUFVOztJQXdRbkIseUJBQUM7Q0FBQSxBQTNQRCxJQTJQQztTQTFQWSxrQkFBa0I7OztJQUszQixrQ0FBaUI7Ozs7O0lBQ2pCLGtDQUFxQjs7Ozs7SUFKVCxrQ0FBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSHR0cEhlYWRlcnN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuLy8gaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcy9CZWhhdmlvclN1YmplY3QnO1xuaW1wb3J0IHsgIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7Zmlyc3RCeX0gZnJvbSAndGhlbmJ5JztcbmltcG9ydCB7ICBGVGFibGUsIEZDb2x1bW4sIEZTZWFyY2gsIEZPcmRlciwgRlRhYmxlUmVzdWx0LCBGVGFibGVEYXRhTW9kaWZpZXIgIH0gZnJvbSAnLi4vZnRhYmxlLm1vZGVsJztcbmltcG9ydCB7IEZUYWJsZUJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9mdGFibGViYXNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZW1wdHkgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG9mIH0gZnJvbSAncnhqcydcblxuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGVGFibGVMb2NhbFNlcnZpY2UgaW1wbGVtZW50cyBGVGFibGVCYXNlU2VydmljZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGF0YSA9IFtdO1xuICAgIHByaXZhdGUgbW9kZTogc3RyaW5nO1xuXG4gICAgc2V0TG9jYWxUYWJsZURhdGEoZGF0YTogYW55W10pe1xuICAgICAgICB0aGlzLm1vZGUgPSAnJztcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG5cblxuICAgIGdldChpZDphbnkpOiBPYnNlcnZhYmxlPGFueT57XG4gICAgICAgIC8vICBjb25zb2xlLmxvZygnZ2V0Jyk7XG4gICAgICAgICByZXR1cm4gdGhpcy5nZXRSb3dCeUNvbHVtbk5hbWVBbmRWYWx1ZSgnaWQnLGlkKTtcbiAgICB9XG4gXG4gICAgZ2V0Um93QnlDb2x1bW5OYW1lQW5kVmFsdWUobmFtZTogc3RyaW5nLHZhbHVlOmFueSk6IE9ic2VydmFibGU8YW55PntcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2dldFJvd0J5Q29sdW1uTmFtZUFuZFZhbHVlJysnICcrbmFtZSsnICcrdmFsdWUpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGF0YS5maWx0ZXIoeCA9PiB4W25hbWVdPT0gdmFsdWUpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnZ2V0Um93QnlDb2x1bW5OYW1lQW5kVmFsdWUnKycgJytuYW1lKycgJyt2YWx1ZSk7XG5cbiAgICAgICAgaWYocmVzdWx0Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICByZXR1cm4gb2YocmVzdWx0WzBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW1wdHkoKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICpcbiAgICAqL1xuICAgIHNldERhdGEoaWQ6YW55LHByb3BlcnR5VG9DaGFuZ2U6c3RyaW5nLGZuOiAobjphbnkpPT5hbnkpOk9ic2VydmFibGU8YW55PntcbiAgICAgICB2YXIgcm93ID0gdGhpcy5kYXRhLmZpbmQoZD0+ZFsnaWQnXSA9PT0gaWQpO1xuICAgICAgIHJvd1twcm9wZXJ0eVRvQ2hhbmdlXSA9IGZuKHJvd1twcm9wZXJ0eVRvQ2hhbmdlXSk7XG4gICAgICAgcmV0dXJuIG9mKHJvdyk7XG4gICAgfVxuXG4gICAgZGVsZXRlKGlkOmFueSk6T2JzZXJ2YWJsZTxhbnk+e1xuICAgICAgICAvLyBjYW50IG1vZGlmeSBKU09OIGZpbGVzIGZyb250ZW5kXG4gICAgICAgICB2YXIgcm93ID0gdGhpcy5kYXRhLmZpbmQoZD0+ZFsnaWQnXSA9PT0gaWQpO1xuICAgICAgICByZXR1cm4gb2Yocm93KTtcbiAgICB9XG5cbiAgICAgZ2V0RGF0YSh0YWJsZTogRlRhYmxlKTogT2JzZXJ2YWJsZTxGVGFibGVSZXN1bHQ+ICB7XG5cbiAgICAgIGxldCBkYXRhID0gdGhpcy5kYXRhO1xuICAgICBcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0YWJsZS5jb2x1bW5zW2ldLnR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICAgIHRhYmxlLmNvbHVtbnNbaV0uZmlsdGVyRGF0YSA9IEFycmF5LmZyb20obmV3IFNldChkYXRhLm1hcCh4ID0+IHhbdGFibGUuY29sdW1uc1tpXS5uYW1lXSkpKVxuICAgICAgICB9XG4gICAgICB9XG5cblxuXG4gICAgICB2YXIgdG90YWxSb3dzID0gZGF0YS5sZW5ndGg7XG4gICAgICAvLyBHZW5lcmljIFNlYXJjaFxuICAgICAgaWYgKHRhYmxlLmRhdGFNb2RpZmllci5zZWFyY2gudmFsdWUpIHtcbiAgICAgICAgdGFibGUuZGF0YU1vZGlmaWVyLmN1cnJlbnRQYWdlID0gMTtcbiAgICAgIGlmICh0YWJsZS5jb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IHRlbXAgPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbHVtbnNbaV0ubmFtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC5jb25jYXQoZGF0YS5maWx0ZXIoeCA9PiBTdHJpbmcoeFt0YWJsZS5jb2x1bW5zW2ldLm5hbWVdKS5pbmRleE9mKHRhYmxlLmRhdGFNb2RpZmllci5zZWFyY2gudmFsdWUpICE9PSAtMSkpO1xuICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKHggPT4gU3RyaW5nKHhbdGFibGUuY29sdW1uc1tpXS5uYW1lXSkuaW5kZXhPZih0YWJsZS5kYXRhTW9kaWZpZXIuc2VhcmNoLnZhbHVlKSA9PT0gLTEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YSA9IHRlbXA7XG4gICAgICB9XG4gICAgfVxuXG5cbiBpZiAodGFibGUuZGF0YU1vZGlmaWVyLmZpbHRlcnMubGVuZ3RoID4gMCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUuZGF0YU1vZGlmaWVyLmZpbHRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYodGFibGUuZGF0YU1vZGlmaWVyLmZpbHRlcnNbaV0uYXBwbHkpXG4gICAgICAgICAgIGRhdGEgPSB0YWJsZS5kYXRhTW9kaWZpZXIuZmlsdGVyc1tpXS5hcHBseShkYXRhKTtcbiAgICB9XG4gfVxuXG4gXG5cbiAgICAgIC8vIENvbHVtbiBQcmlvcml0eSBTb3J0aW5nXG4gICAgICBpZiAodGFibGUuZGF0YU1vZGlmaWVyLm9yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbGV0IHNvcnRCeTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLmRhdGFNb2RpZmllci5vcmRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3JkZXIgPSAodGFibGUuZGF0YU1vZGlmaWVyLm9yZGVyc1tpXS5kaXJlY3Rpb24gPT09ICdEZXNjJykgPyAtMSA6IDE7XG4gICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbMF1bdGFibGUuZGF0YU1vZGlmaWVyLm9yZGVyc1tpXS5jb2x1bW5OYW1lXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKCdTdHJpbmcgZmlyc3RCeTonICsgdGFibGUuY29sdW1uc1t0YWJsZS5vcmRlcnNbaV0uY29sdW1uSW5kZXhdLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgIHNvcnRCeSA9IGZpcnN0QnkodGFibGUuZGF0YU1vZGlmaWVyLm9yZGVyc1tpXS5jb2x1bW5OYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUNhc2U6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogb3JkZXJcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGFbMF1bdGFibGUuZGF0YU1vZGlmaWVyLm9yZGVyc1tpXS5jb2x1bW5OYW1lXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzb3J0QnkgPSBmaXJzdEJ5KGZ1bmN0aW9uKHYxLCB2Mikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjFbdGFibGUuZGF0YU1vZGlmaWVyLm9yZGVyc1tpXS5jb2x1bW5OYW1lXSAtIHYyW3RhYmxlLmRhdGFNb2RpZmllci5vcmRlcnNbaV0uY29sdW1uTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgfSwgb3JkZXIpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZygnb3RoZXJUeXBlIHNvcnQ6JyArIHR5cGVvZiBkYXRhWzBdW3RhYmxlLmNvbHVtbnNbdGFibGUuZGF0YU1vZGlmaWVyLm9yZGVyc1tpXS5jb2x1bW5JbmRleF0ubmFtZV0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhWzBdW3RhYmxlLmRhdGFNb2RpZmllci5vcmRlcnNbaV0uY29sdW1uTmFtZV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc29ydEJ5ID0gc29ydEJ5LnRoZW5CeSh0YWJsZS5kYXRhTW9kaWZpZXIub3JkZXJzW2ldLmNvbHVtbk5hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQ2FzZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBvcmRlclxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVswXVt0YWJsZS5kYXRhTW9kaWZpZXIub3JkZXJzW2ldLmNvbHVtbk5hbWVdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgIHNvcnRCeSA9IHNvcnRCeS50aGVuQnkoZnVuY3Rpb24odjEsIHYyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2MVt0YWJsZS5kYXRhTW9kaWZpZXIub3JkZXJzW2ldLmNvbHVtbk5hbWVdIC0gdjJbdGFibGUuZGF0YU1vZGlmaWVyLm9yZGVyc1tpXS5jb2x1bW5OYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICB9LCBvcmRlcik7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvdGhlclR5cGUgc29ydCcpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGRhdGEuc29ydChzb3J0QnkpO1xuICAgICAgfVxuXG4vLyBjb25zb2xlLmxvZygnU0laRTonICsgdGFibGUuZGF0YU1vZGlmaWVyLmN1cnJlbnRQYWdlICsgJyAnICsgdGFibGUucGFnZVNpemVzW3RhYmxlLnBhZ2VTaXplSW5kZXhdKTtcbi8vIHRoaXMucGFnZSA9IHRoaXMuZGF0YS5zbGljZSgoIHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucGFnZVNpemUsICB0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlU2l6ZSk7XG5cbiAgICAgIHZhciB0b3RhbFJvd3NBZnRlck1vZGlmaWNhdGlvbnMgPSBkYXRhLmxlbmd0aDtcbiAgICAgIHZhciBwYWdlID0gZGF0YS5zbGljZSgodGFibGUuZGF0YU1vZGlmaWVyLmN1cnJlbnRQYWdlLTEpICogdGFibGUucGFnZVNpemVzW3RhYmxlLnBhZ2VTaXplSW5kZXhdLCAodGFibGUuZGF0YU1vZGlmaWVyLmN1cnJlbnRQYWdlICogKHRhYmxlLnBhZ2VTaXplc1t0YWJsZS5wYWdlU2l6ZUluZGV4XSkpKTtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgRlRhYmxlUmVzdWx0KHBhZ2UsdG90YWxSb3dzLHRvdGFsUm93c0FmdGVyTW9kaWZpY2F0aW9ucyxudWxsKTtcbiAgICAgIHJldHVybiBvZihyZXN1bHQpO1xuICB9XG5cblxuXG5cblxuXG5cblxuXG4gIFxuLy8gICAgIGdldERhdGExKHVybDogc3RyaW5nLFxuLy8gICAgICAgICAgICAgcHJvcGVydHlOYW1lczogc3RyaW5nW10sXG4vLyAgICAgICAgICAgICBwcm9wZXJ0eVR5cGVzOiBzdHJpbmdbXSxcbi8vICAgICAgICAgICAgIHNvcnRTdGF0ZXM6IHsgJ3Byb3BlcnR5TmFtZSc6IHN0cmluZyAsICdvcmRlcic6IHN0cmluZ31bXSxcbi8vICAgICAgICAgICAgIGZpbHRlcnM6YW55W10sXG4vLyAgICAgICAgICAgICBzZWFyY2hTdHJpbmc6IHN0cmluZykge1xuXG4vLyAgICAgICAgIGNvbnNvbGUubG9nKHVybCk7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKHByb3BlcnR5TmFtZXMpO1xuLy8gICAgICAgICBjb25zb2xlLmxvZyhwcm9wZXJ0eVR5cGVzKTtcbi8vICAgICAgICAgY29uc29sZS5sb2coc29ydFN0YXRlcyk7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKGZpbHRlcnMpO1xuLy8gICAgICAgICBjb25zb2xlLmxvZyhzZWFyY2hTdHJpbmcpO1xuIFxuLy8gICAgICAgICBsZXQgZGF0YSA9IHRoaXMuZGF0YTtcblxuLy8gICAgIC8vIEdlbmVyaWMgU2VhcmNoXG4vLyAgICAgLy8gVE9ETzogQ2F0ZXIgZm9yIEZvcm1hdHRlZCBEYXRhdHlwZXNcbi8vICAgICBsZXQgdGVtcCA9IFtdO1xuLy8gICAgIGlmIChwcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDApICB7XG4vLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWVzW2ldLmxlbmd0aCA+IDApIHtcbi8vICAgICAgICAgICAgIHRlbXAgPSB0ZW1wLmNvbmNhdChkYXRhLmZpbHRlcih4ID0+IFN0cmluZyh4W3Byb3BlcnR5TmFtZXNbaV1dKS5pbmRleE9mKHNlYXJjaFN0cmluZykgIT09IC0xKSk7XG4vLyAgICAgICAgICAgICBkYXRhID0gZGF0YS5maWx0ZXIoeCA9PiBTdHJpbmcoeFtwcm9wZXJ0eU5hbWVzW2ldXSkuaW5kZXhPZihzZWFyY2hTdHJpbmcpID09PSAtMSk7XG4vLyAgICAgICAgIH1cbi8vICAgICB9XG5cbi8vICAgICBkYXRhID0gdGVtcDtcbi8vICAgfVxuXG4vLyAgIGNvbnNvbGUubG9nKGZpbHRlcnMubGVuZ3RoKTtcbi8vICAgICBpZiAoZmlsdGVycy5sZW5ndGggPiAwKSAge1xuLy8gICAgICAgdGVtcCA9IFtdO1xuXG4vLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgLy8gSWYgc3RyaW5nXG4vLyAgICAgICAgIGlmKHByb3BlcnR5VHlwZXNbZmlsdGVyc1tpXS5pbmRleF0gPT0gJ3N0cmluZycpIHtcbi8vICAgICAgICAgICAgIHRlbXAgPSBkYXRhLmZpbHRlcih4ID0+XG4vLyAgICAgICAgICAgICAgICAgIFN0cmluZyh4W3Byb3BlcnR5TmFtZXNbZmlsdGVyc1tpXS5pbmRleF1dKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZmlsdGVyc1tpXS5kYXRhLnZhbHVlLnRvTG93ZXJDYXNlKCkpICE9PSAtMSk7XG4vLyAgICAgICAgIC8vIElmIG51bWJlclxuLy8gICAgICAgICB9IGVsc2UgaWYocHJvcGVydHlUeXBlc1tmaWx0ZXJzW2ldLmluZGV4XSA9PSAnbnVtYmVyJykge1xuLy8gICAgICAgICAgIC8vIGlmIGJvdGggbWluIGFuZCBtYXggc3BlY2lmaWVkXG4vLyAgICAgICAgICAgaWYoZmlsdGVyc1tpXS5kYXRhLm1heCAmJiBmaWx0ZXJzW2ldLmRhdGEubWluKXtcbi8vICAgICAgICAgICAgIHRlbXAgPSBkYXRhLmZpbHRlcih4ID0+XG4vLyAgICAgICAgICAgICAgICAgKChOdW1iZXIoeFtwcm9wZXJ0eU5hbWVzW2ZpbHRlcnNbaV0uaW5kZXhdXSkgPj0gZmlsdGVyc1tpXS5kYXRhLm1pbikgJiZcbi8vICAgICAgICAgICAgICAgICAgKE51bWJlcih4W3Byb3BlcnR5TmFtZXNbZmlsdGVyc1tpXS5pbmRleF1dKSA8PSBmaWx0ZXJzW2ldLmRhdGEubWF4KSkpO1xuLy8gICAgICAgICAgIC8vIGlmIG1heCBvbmx5IHNwZWNpZmllZFxuLy8gICAgICAgICAgIH0gZWxzZSBpZihmaWx0ZXJzW2ldLmRhdGEubWF4KSB7XG4vLyAgICAgICAgICAgICAgdGVtcCA9IGRhdGEuZmlsdGVyKHggPT5cbi8vICAgICAgICAgICAgICAgICBOdW1iZXIoeFtwcm9wZXJ0eU5hbWVzW2ZpbHRlcnNbaV0uaW5kZXhdXSkgPD0gZmlsdGVyc1tpXS5kYXRhLm1heCk7XG4vLyAgICAgICAgICAgLy8gaWYgb25seSBtaW4gc3BlY2lmaWVkXG4vLyAgICAgICAgICAgfSBlbHNlIGlmKGZpbHRlcnNbaV0uZGF0YS5taW4pIHtcbi8vICAgICAgICAgICAgICB0ZW1wID0gZGF0YS5maWx0ZXIoeCA9PlxuLy8gICAgICAgICAgICAgICAgIE51bWJlcih4W3Byb3BlcnR5TmFtZXNbZmlsdGVyc1tpXS5pbmRleF1dKSA+PSBmaWx0ZXJzW2ldLmRhdGEubWluKTtcbi8vICAgICAgICAgICAvLyBpZiBub3RoaW5nIGlzIHNwZWNpZmllZFxuLy8gICAgICAgICAgIH0gZWxzZSAge1xuLy8gICAgICAgICAgICAgdGVtcCA9IGRhdGE7XG4vLyAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgICAgICBkYXRhID0gdGVtcDtcbi8vICAgICAgIH1cbi8vICAgICAgIGRhdGEgPSB0ZW1wO1xuLy8gICAgIH1cblxuXG4vLyAgICAgLy8gQ29sdW1uIFByaW9yaXR5IFNvcnRpbmdcbi8vICAgICAvLyBUT0RPOiBDYXRlciBmb3IgRm9ybWF0dGVkIERhdGF0eXBlc1xuLy8gICAgIGlmIChzb3J0U3RhdGVzLmxlbmd0aCA+IDApIHtcbi8vICAgICAgICAgbGV0IHNvcnRCeTtcbi8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0U3RhdGVzLmxlbmd0aDsgaSsrKSB7XG4vLyAgICAgICAgICAgICBjb25zdCBvcmRlciA9IChzb3J0U3RhdGVzW2ldLm9yZGVyID09PSAnRGVzYycpID8gLTEgOiAxO1xuLy8gICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbi8vICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbMF1bc29ydFN0YXRlc1tpXS5wcm9wZXJ0eU5hbWVdID09PSAnc3RyaW5nJykge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU3RyaW5nIGZpcnN0Qnk6JyArIHNvcnRTdGF0ZXNbaV0ucHJvcGVydHlOYW1lKTtcbi8vICAgICAgICAgICAgICAgICAgICAgc29ydEJ5ID0gZmlyc3RCeShzb3J0U3RhdGVzW2ldLnByb3BlcnR5TmFtZSwge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQ2FzZTogdHJ1ZSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogb3JkZXJcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVswXVtzb3J0U3RhdGVzW2ldLnByb3BlcnR5TmFtZV0gPT09ICdudW1iZXInKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHNvcnRCeSA9IGZpcnN0QnkoZnVuY3Rpb24odjEsIHYyKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjFbc29ydFN0YXRlc1tpXS5wcm9wZXJ0eU5hbWVdIC0gdjJbc29ydFN0YXRlc1tpXS5wcm9wZXJ0eU5hbWVdO1xuLy8gICAgICAgICAgICAgICAgICAgICB9LCBvcmRlcik7XG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ290aGVyVHlwZSBzb3J0OicgKyB0eXBlb2YgZGF0YVswXVtzb3J0U3RhdGVzW2ldLnByb3BlcnR5TmFtZV0pO1xuLy8gICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoZW5CeTonICsgc29ydFN0YXRlc1tpXS5wcm9wZXJ0eU5hbWUpO1xuLy8gICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVswXVtzb3J0U3RhdGVzW2ldLnByb3BlcnR5TmFtZV0gPT09ICdzdHJpbmcnKSB7XG5cbi8vICAgICAgICAgICAgICAgICAgICAgc29ydEJ5ID0gc29ydEJ5LnRoZW5CeShzb3J0U3RhdGVzW2ldLnByb3BlcnR5TmFtZSwge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQ2FzZTogdHJ1ZSxcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogb3JkZXJcbi8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVswXVtzb3J0U3RhdGVzW2ldLnByb3BlcnR5TmFtZV0gPT09ICdudW1iZXInKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHNvcnRCeSA9IHNvcnRCeS50aGVuQnkoZnVuY3Rpb24odjEsIHYyKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjFbc29ydFN0YXRlc1tpXS5wcm9wZXJ0eU5hbWVdIC0gdjJbc29ydFN0YXRlc1tpXS5wcm9wZXJ0eU5hbWVdO1xuLy8gICAgICAgICAgICAgICAgICAgICB9LCBvcmRlcik7XG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ290aGVyVHlwZSBzb3J0Jyk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGRhdGEuc29ydChzb3J0QnkpO1xuLy8gICAgIH1cblxuXG4vLyAgIHJldHVybiBkYXRhO1xuLy8gICB9XG5cbn0iXX0=