ftable
Version:
Angular 6/7 Tables
186 lines • 27.5 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';
export class FTableLocalService {
/**
* @param {?} http
*/
constructor(http) {
this.http = http;
this.data = [];
}
/**
* @param {?} data
* @return {?}
*/
setLocalTableData(data) {
this.mode = '';
this.data = data;
}
/**
* @param {?} id
* @return {?}
*/
get(id) {
// console.log('get');
return this.getRowByColumnNameAndValue('id', id);
}
/**
* @param {?} name
* @param {?} value
* @return {?}
*/
getRowByColumnNameAndValue(name, value) {
// console.log('getRowByColumnNameAndValue'+' '+name+' '+value);
// console.log('getRowByColumnNameAndValue'+' '+name+' '+value);
/** @type {?} */
const result = this.data.filter(x => 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 {?}
*/
setData(id, propertyToChange, fn) {
/** @type {?} */
var row = this.data.find(d => d['id'] === id);
row[propertyToChange] = fn(row[propertyToChange]);
return of(row);
}
/**
* @param {?} id
* @return {?}
*/
delete(id) {
// cant modify JSON files frontend
/** @type {?} */
var row = this.data.find(d => d['id'] === id);
return of(row);
}
/**
* @param {?} table
* @return {?}
*/
getData(table) {
/** @type {?} */
let data = this.data;
for (let i = 0; i < table.columns.length; i++) {
if (table.columns[i].type === 'checkbox') {
table.columns[i].filterData = Array.from(new Set(data.map(x => x[table.columns[i].name])));
}
}
/** @type {?} */
var totalRows = data.length;
// Generic Search
if (table.dataModifier.search.value) {
table.dataModifier.currentPage = 1;
if (table.columns.length > 0) {
/** @type {?} */
let temp = [];
for (let i = 0; i < table.columns.length; i++) {
if (table.columns[i].name.length > 0) {
temp = temp.concat(data.filter(x => String(x[table.columns[i].name]).indexOf(table.dataModifier.search.value) !== -1));
data = data.filter(x => String(x[table.columns[i].name]).indexOf(table.dataModifier.search.value) === -1);
}
}
data = temp;
}
}
if (table.dataModifier.filters.length > 0) {
for (let 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 {?} */
let sortBy;
for (let i = 0; i < table.dataModifier.orders.length; i++) {
/** @type {?} */
const 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');
}
}
}
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 = () => [
{ type: HttpClient }
];
if (false) {
/** @type {?} */
FTableLocalService.prototype.data;
/**
* @type {?}
* @private
*/
FTableLocalService.prototype.mode;
/**
* @type {?}
* @private
*/
FTableLocalService.prototype.http;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnRhYmxlbG9jYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Z0YWJsZS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlL2Z0YWJsZWxvY2FsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBS2xELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxFQUFxQyxZQUFZLEVBQXVCLE1BQU0saUJBQWlCLENBQUM7QUFFdkcsT0FBTyxFQUFjLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBS3pCLE1BQU0sT0FBTyxrQkFBa0I7Ozs7SUFFM0IsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUc3QixTQUFJLEdBQUcsRUFBRSxDQUFDO0lBRmpCLENBQUM7Ozs7O0lBS0QsaUJBQWlCLENBQUMsSUFBVztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7Ozs7O0lBR0QsR0FBRyxDQUFDLEVBQU07UUFDTix1QkFBdUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Ozs7OztJQUVELDBCQUEwQixDQUFDLElBQVksRUFBQyxLQUFTO1FBQzdDLGdFQUFnRTs7O2NBRTFELE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBRyxLQUFLLENBQUM7UUFDckQsZ0VBQWdFO1FBRWhFLElBQUcsTUFB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LENBQUMsTUFBTSxDQUFDLFVBQVMsRUFBRSxFQUFFLEVBQUU7NEJBQ2xDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDckcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUNiO3lCQUFNO3dCQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztxQkFDakM7aUJBQ0o7YUFDSjtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckI7Ozs7WUFLRywyQkFBMkIsR0FBRyxJQUFJLENBQUMsTUFBTTs7WUFDekMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUN2SyxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFDLFNBQVMsRUFBQywyQkFBMkIsRUFBQyxJQUFJLENBQUM7UUFDOUUsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEIsQ0FBQzs7O1lBbklGLFVBQVU7Ozs7WUFiRixVQUFVOzs7O0lBbUJmLGtDQUFpQjs7Ozs7SUFDakIsa0NBQXFCOzs7OztJQUpULGtDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBIdHRwSGVhZGVyc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG4vLyBpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL0JlaGF2aW9yU3ViamVjdCc7XG5pbXBvcnQgeyAgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtmaXJzdEJ5fSBmcm9tICd0aGVuYnknO1xuaW1wb3J0IHsgIEZUYWJsZSwgRkNvbHVtbiwgRlNlYXJjaCwgRk9yZGVyLCBGVGFibGVSZXN1bHQsIEZUYWJsZURhdGFNb2RpZmllciAgfSBmcm9tICcuLi9mdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgRlRhYmxlQmFzZVNlcnZpY2UgfSBmcm9tICcuL2Z0YWJsZWJhc2Uuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBlbXB0eSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgb2YgfSBmcm9tICdyeGpzJ1xuXG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZUYWJsZUxvY2FsU2VydmljZSBpbXBsZW1lbnRzIEZUYWJsZUJhc2VTZXJ2aWNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge1xuICAgIH1cblxuICAgIHB1YmxpYyBkYXRhID0gW107XG4gICAgcHJpdmF0ZSBtb2RlOiBzdHJpbmc7XG5cbiAgICBzZXRMb2NhbFRhYmxlRGF0YShkYXRhOiBhbnlbXSl7XG4gICAgICAgIHRoaXMubW9kZSA9ICcnO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cblxuXG4gICAgZ2V0KGlkOmFueSk6IE9ic2VydmFibGU8YW55PntcbiAgICAgICAgLy8gIGNvbnNvbGUubG9nKCdnZXQnKTtcbiAgICAgICAgIHJldHVybiB0aGlzLmdldFJvd0J5Q29sdW1uTmFtZUFuZFZhbHVlKCdpZCcsaWQpO1xuICAgIH1cbiBcbiAgICBnZXRSb3dCeUNvbHVtbk5hbWVBbmRWYWx1ZShuYW1lOiBzdHJpbmcsdmFsdWU6YW55KTogT2JzZXJ2YWJsZTxhbnk+e1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnZ2V0Um93QnlDb2x1bW5OYW1lQW5kVmFsdWUnKycgJytuYW1lKycgJyt2YWx1ZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5kYXRhLmZpbHRlcih4ID0+IHhbbmFtZV09PSB2YWx1ZSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdnZXRSb3dCeUNvbHVtbk5hbWVBbmRWYWx1ZScrJyAnK25hbWUrJyAnK3ZhbHVlKTtcblxuICAgICAgICBpZihyZXN1bHQubGVuZ3RoID4gMCl7XG4gICAgICAgICAgIHJldHVybiBvZihyZXN1bHRbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbXB0eSgpO1xuICAgIH1cblxuICAgIC8qXG4gICAgKlxuICAgICovXG4gICAgc2V0RGF0YShpZDphbnkscHJvcGVydHlUb0NoYW5nZTpzdHJpbmcsZm46IChuOmFueSk9PmFueSk6T2JzZXJ2YWJsZTxhbnk+e1xuICAgICAgIHZhciByb3cgPSB0aGlzLmRhdGEuZmluZChkPT5kWydpZCddID09PSBpZCk7XG4gICAgICAgcm93W3Byb3BlcnR5VG9DaGFuZ2VdID0gZm4ocm93W3Byb3BlcnR5VG9DaGFuZ2VdKTtcbiAgICAgICByZXR1cm4gb2Yocm93KTtcbiAgICB9XG5cbiAgICBkZWxldGUoaWQ6YW55KTpPYnNlcnZhYmxlPGFueT57XG4gICAgICAgIC8vIGNhbnQgbW9kaWZ5IEpTT04gZmlsZXMgZnJvbnRlbmRcbiAgICAgICAgIHZhciByb3cgPSB0aGlzLmRhdGEuZmluZChkPT5kWydpZCddID09PSBpZCk7XG4gICAgICAgIHJldHVybiBvZihyb3cpO1xuICAgIH1cblxuICAgICBnZXREYXRhKHRhYmxlOiBGVGFibGUpOiBPYnNlcnZhYmxlPEZUYWJsZVJlc3VsdD4gIHtcblxuICAgICAgbGV0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgIFxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRhYmxlLmNvbHVtbnNbaV0udHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgdGFibGUuY29sdW1uc1tpXS5maWx0ZXJEYXRhID0gQXJyYXkuZnJvbShuZXcgU2V0KGRhdGEubWFwKHggPT4geFt0YWJsZS5jb2x1bW5zW2ldLm5hbWVdKSkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuXG5cbiAgICAgIHZhciB0b3RhbFJvd3MgPSBkYXRhLmxlbmd0aDtcbiAgICAgIC8vIEdlbmVyaWMgU2VhcmNoXG4gICAgICBpZiAodGFibGUuZGF0YU1vZGlmaWVyLnNlYXJjaC52YWx1ZSkge1xuICAgICAgICB0YWJsZS5kYXRhTW9kaWZpZXIuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgaWYgKHRhYmxlLmNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgdGVtcCA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAodGFibGUuY29sdW1uc1tpXS5uYW1lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wLmNvbmNhdChkYXRhLmZpbHRlcih4ID0+IFN0cmluZyh4W3RhYmxlLmNvbHVtbnNbaV0ubmFtZV0pLmluZGV4T2YodGFibGUuZGF0YU1vZGlmaWVyLnNlYXJjaC52YWx1ZSkgIT09IC0xKSk7XG4gICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5maWx0ZXIoeCA9PiBTdHJpbmcoeFt0YWJsZS5jb2x1bW5zW2ldLm5hbWVdKS5pbmRleE9mKHRhYmxlLmRhdGFNb2RpZmllci5zZWFyY2gudmFsdWUpID09PSAtMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhID0gdGVtcDtcbiAgICAgIH1cbiAgICB9XG5cblxuIGlmICh0YWJsZS5kYXRhTW9kaWZpZXIuZmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5kYXRhTW9kaWZpZXIuZmlsdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZih0YWJsZS5kYXRhTW9kaWZpZXIuZmlsdGVyc1tpXS5hcHBseSlcbiAgICAgICAgICAgZGF0YSA9IHRhYmxlLmRhdGFNb2RpZmllci5maWx0ZXJzW2ldLmFwcGx5KGRhdGEpO1xuICAgIH1cbiB9XG5cbiBcblxuICAgICAgLy8gQ29sdW1uIFByaW9yaXR5IFNvcnRpbmdcbiAgICAgIGlmICh0YWJsZS5kYXRhTW9kaWZpZXIub3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsZXQgc29ydEJ5O1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUuZGF0YU1vZGlmaWVyLm9yZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCBvcmRlciA9ICh0YWJsZS5kYXRhTW9kaWZpZXIub3JkZXJzW2ldLmRpcmVjdGlvbiA9PT0gJ0Rlc2MnKSA/IC0xIDogMTtcbiAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVswXVt0YWJsZS5kYXRhTW9kaWZpZXIub3JkZXJzW2ldLmNvbHVtbk5hbWVdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgY29uc29sZS5sb2coJ1N0cmluZyBmaXJzdEJ5OicgKyB0YWJsZS5jb2x1bW5zW3RhYmxlLm9yZGVyc1tpXS5jb2x1bW5JbmRleF0ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgc29ydEJ5ID0gZmlyc3RCeSh0YWJsZS5kYXRhTW9kaWZpZXIub3JkZXJzW2ldLmNvbHVtbk5hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQ2FzZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBvcmRlclxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVswXVt0YWJsZS5kYXRhTW9kaWZpZXIub3JkZXJzW2ldLmNvbHVtbk5hbWVdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgIHNvcnRCeSA9IGZpcnN0QnkoZnVuY3Rpb24odjEsIHYyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2MVt0YWJsZS5kYXRhTW9kaWZpZXIub3JkZXJzW2ldLmNvbHVtbk5hbWVdIC0gdjJbdGFibGUuZGF0YU1vZGlmaWVyLm9yZGVyc1tpXS5jb2x1bW5OYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICB9LCBvcmRlcik7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKCdvdGhlclR5cGUgc29ydDonICsgdHlwZW9mIGRhdGFbMF1bdGFibGUuY29sdW1uc1t0YWJsZS5kYXRhTW9kaWZpZXIub3JkZXJzW2ldLmNvbHVtbkluZGV4XS5uYW1lXSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbMF1bdGFibGUuZGF0YU1vZGlmaWVyLm9yZGVyc1tpXS5jb2x1bW5OYW1lXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzb3J0QnkgPSBzb3J0QnkudGhlbkJ5KHRhYmxlLmRhdGFNb2RpZmllci5vcmRlcnNbaV0uY29sdW1uTmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IG9yZGVyXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhWzBdW3RhYmxlLmRhdGFNb2RpZmllci5vcmRlcnNbaV0uY29sdW1uTmFtZV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc29ydEJ5ID0gc29ydEJ5LnRoZW5CeShmdW5jdGlvbih2MSwgdjIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYxW3RhYmxlLmRhdGFNb2RpZmllci5vcmRlcnNbaV0uY29sdW1uTmFtZV0gLSB2Mlt0YWJsZS5kYXRhTW9kaWZpZXIub3JkZXJzW2ldLmNvbHVtbk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgIH0sIG9yZGVyKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ290aGVyVHlwZSBzb3J0Jyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZGF0YS5zb3J0KHNvcnRCeSk7XG4gICAgICB9XG5cbi8vIGNvbnNvbGUubG9nKCdTSVpFOicgKyB0YWJsZS5kYXRhTW9kaWZpZXIuY3VycmVudFBhZ2UgKyAnICcgKyB0YWJsZS5wYWdlU2l6ZXNbdGFibGUucGFnZVNpemVJbmRleF0pO1xuLy8gdGhpcy5wYWdlID0gdGhpcy5kYXRhLnNsaWNlKCggdGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSwgIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcblxuICAgICAgdmFyIHRvdGFsUm93c0FmdGVyTW9kaWZpY2F0aW9ucyA9IGRhdGEubGVuZ3RoO1xuICAgICAgdmFyIHBhZ2UgPSBkYXRhLnNsaWNlKCh0YWJsZS5kYXRhTW9kaWZpZXIuY3VycmVudFBhZ2UtMSkgKiB0YWJsZS5wYWdlU2l6ZXNbdGFibGUucGFnZVNpemVJbmRleF0sICh0YWJsZS5kYXRhTW9kaWZpZXIuY3VycmVudFBhZ2UgKiAodGFibGUucGFnZVNpemVzW3RhYmxlLnBhZ2VTaXplSW5kZXhdKSkpO1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBGVGFibGVSZXN1bHQocGFnZSx0b3RhbFJvd3MsdG90YWxSb3dzQWZ0ZXJNb2RpZmljYXRpb25zLG51bGwpO1xuICAgICAgcmV0dXJuIG9mKHJlc3VsdCk7XG4gIH1cblxuXG5cblxuXG5cblxuXG5cbiAgXG4vLyAgICAgZ2V0RGF0YTEodXJsOiBzdHJpbmcsXG4vLyAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVzOiBzdHJpbmdbXSxcbi8vICAgICAgICAgICAgIHByb3BlcnR5VHlwZXM6IHN0cmluZ1tdLFxuLy8gICAgICAgICAgICAgc29ydFN0YXRlczogeyAncHJvcGVydHlOYW1lJzogc3RyaW5nICwgJ29yZGVyJzogc3RyaW5nfVtdLFxuLy8gICAgICAgICAgICAgZmlsdGVyczphbnlbXSxcbi8vICAgICAgICAgICAgIHNlYXJjaFN0cmluZzogc3RyaW5nKSB7XG5cbi8vICAgICAgICAgY29uc29sZS5sb2codXJsKTtcbi8vICAgICAgICAgY29uc29sZS5sb2cocHJvcGVydHlOYW1lcyk7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKHByb3BlcnR5VHlwZXMpO1xuLy8gICAgICAgICBjb25zb2xlLmxvZyhzb3J0U3RhdGVzKTtcbi8vICAgICAgICAgY29uc29sZS5sb2coZmlsdGVycyk7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKHNlYXJjaFN0cmluZyk7XG4gXG4vLyAgICAgICAgIGxldCBkYXRhID0gdGhpcy5kYXRhO1xuXG4vLyAgICAgLy8gR2VuZXJpYyBTZWFyY2hcbi8vICAgICAvLyBUT0RPOiBDYXRlciBmb3IgRm9ybWF0dGVkIERhdGF0eXBlc1xuLy8gICAgIGxldCB0ZW1wID0gW107XG4vLyAgICAgaWYgKHByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkgIHtcbi8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgaWYgKHByb3BlcnR5TmFtZXNbaV0ubGVuZ3RoID4gMCkge1xuLy8gICAgICAgICAgICAgdGVtcCA9IHRlbXAuY29uY2F0KGRhdGEuZmlsdGVyKHggPT4gU3RyaW5nKHhbcHJvcGVydHlOYW1lc1tpXV0pLmluZGV4T2Yoc2VhcmNoU3RyaW5nKSAhPT0gLTEpKTtcbi8vICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcih4ID0+IFN0cmluZyh4W3Byb3BlcnR5TmFtZXNbaV1dKS5pbmRleE9mKHNlYXJjaFN0cmluZykgPT09IC0xKTtcbi8vICAgICAgICAgfVxuLy8gICAgIH1cblxuLy8gICAgIGRhdGEgPSB0ZW1wO1xuLy8gICB9XG5cbi8vICAgY29uc29sZS5sb2coZmlsdGVycy5sZW5ndGgpO1xuLy8gICAgIGlmIChmaWx0ZXJzLmxlbmd0aCA+IDApICB7XG4vLyAgICAgICB0ZW1wID0gW107XG5cbi8vICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgICAvLyBJZiBzdHJpbmdcbi8vICAgICAgICAgaWYocHJvcGVydHlUeXBlc1tmaWx0ZXJzW2ldLmluZGV4XSA9PSAnc3RyaW5nJykge1xuLy8gICAgICAgICAgICAgdGVtcCA9IGRhdGEuZmlsdGVyKHggPT5cbi8vICAgICAgICAgICAgICAgICAgU3RyaW5nKHhbcHJvcGVydHlOYW1lc1tmaWx0ZXJzW2ldLmluZGV4XV0pLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmaWx0ZXJzW2ldLmRhdGEudmFsdWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKTtcbi8vICAgICAgICAgLy8gSWYgbnVtYmVyXG4vLyAgICAgICAgIH0gZWxzZSBpZihwcm9wZXJ0eVR5cGVzW2ZpbHRlcnNbaV0uaW5kZXhdID09ICdudW1iZXInKSB7XG4vLyAgICAgICAgICAgLy8gaWYgYm90aCBtaW4gYW5kIG1heCBzcGVjaWZpZWRcbi8vICAgICAgICAgICBpZihmaWx0ZXJzW2ldLmRhdGEubWF4ICYmIGZpbHRlcnNbaV0uZGF0YS5taW4pe1xuLy8gICAgICAgICAgICAgdGVtcCA9IGRhdGEuZmlsdGVyKHggPT5cbi8vICAgICAgICAgICAgICAgICAoKE51bWJlcih4W3Byb3BlcnR5TmFtZXNbZmlsdGVyc1tpXS5pbmRleF1dKSA+PSBmaWx0ZXJzW2ldLmRhdGEubWluKSAmJlxuLy8gICAgICAgICAgICAgICAgICAoTnVtYmVyKHhbcHJvcGVydHlOYW1lc1tmaWx0ZXJzW2ldLmluZGV4XV0pIDw9IGZpbHRlcnNbaV0uZGF0YS5tYXgpKSk7XG4vLyAgICAgICAgICAgLy8gaWYgbWF4IG9ubHkgc3BlY2lmaWVkXG4vLyAgICAgICAgICAgfSBlbHNlIGlmKGZpbHRlcnNbaV0uZGF0YS5tYXgpIHtcbi8vICAgICAgICAgICAgICB0ZW1wID0gZGF0YS5maWx0ZXIoeCA9PlxuLy8gICAgICAgICAgICAgICAgIE51bWJlcih4W3Byb3BlcnR5TmFtZXNbZmlsdGVyc1tpXS5pbmRleF1dKSA8PSBmaWx0ZXJzW2ldLmRhdGEubWF4KTtcbi8vICAgICAgICAgICAvLyBpZiBvbmx5IG1pbiBzcGVjaWZpZWRcbi8vICAgICAgICAgICB9IGVsc2UgaWYoZmlsdGVyc1tpXS5kYXRhLm1pbikge1xuLy8gICAgICAgICAgICAgIHRlbXAgPSBkYXRhLmZpbHRlcih4ID0+XG4vLyAgICAgICAgICAgICAgICAgTnVtYmVyKHhbcHJvcGVydHlOYW1lc1tmaWx0ZXJzW2ldLmluZGV4XV0pID49IGZpbHRlcnNbaV0uZGF0YS5taW4pO1xuLy8gICAgICAgICAgIC8vIGlmIG5vdGhpbmcgaXMgc3BlY2lmaWVkXG4vLyAgICAgICAgICAgfSBlbHNlICB7XG4vLyAgICAgICAgICAgICB0ZW1wID0gZGF0YTtcbi8vICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgICAgIGRhdGEgPSB0ZW1wO1xuLy8gICAgICAgfVxuLy8gICAgICAgZGF0YSA9IHRlbXA7XG4vLyAgICAgfVxuXG5cbi8vICAgICAvLyBDb2x1bW4gUHJpb3JpdHkgU29ydGluZ1xuLy8gICAgIC8vIFRPRE86IENhdGVyIGZvciBGb3JtYXR0ZWQgRGF0YXR5cGVzXG4vLyAgICAgaWYgKHNvcnRTdGF0ZXMubGVuZ3RoID4gMCkge1xuLy8gICAgICAgICBsZXQgc29ydEJ5O1xuLy8gICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRTdGF0ZXMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgICAgICAgIGNvbnN0IG9yZGVyID0gKHNvcnRTdGF0ZXNbaV0ub3JkZXIgPT09ICdEZXNjJykgPyAtMSA6IDE7XG4vLyAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuLy8gICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVswXVtzb3J0U3RhdGVzW2ldLnByb3BlcnR5TmFtZV0gPT09ICdzdHJpbmcnKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTdHJpbmcgZmlyc3RCeTonICsgc29ydFN0YXRlc1tpXS5wcm9wZXJ0eU5hbWUpO1xuLy8gICAgICAgICAgICAgICAgICAgICBzb3J0QnkgPSBmaXJzdEJ5KHNvcnRTdGF0ZXNbaV0ucHJvcGVydHlOYW1lLCB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiB0cnVlLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBvcmRlclxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhWzBdW3NvcnRTdGF0ZXNbaV0ucHJvcGVydHlOYW1lXSA9PT0gJ251bWJlcicpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgc29ydEJ5ID0gZmlyc3RCeShmdW5jdGlvbih2MSwgdjIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2MVtzb3J0U3RhdGVzW2ldLnByb3BlcnR5TmFtZV0gLSB2Mltzb3J0U3RhdGVzW2ldLnByb3BlcnR5TmFtZV07XG4vLyAgICAgICAgICAgICAgICAgICAgIH0sIG9yZGVyKTtcbi8vICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb3RoZXJUeXBlIHNvcnQ6JyArIHR5cGVvZiBkYXRhWzBdW3NvcnRTdGF0ZXNbaV0ucHJvcGVydHlOYW1lXSk7XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGhlbkJ5OicgKyBzb3J0U3RhdGVzW2ldLnByb3BlcnR5TmFtZSk7XG4vLyAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhWzBdW3NvcnRTdGF0ZXNbaV0ucHJvcGVydHlOYW1lXSA9PT0gJ3N0cmluZycpIHtcblxuLy8gICAgICAgICAgICAgICAgICAgICBzb3J0QnkgPSBzb3J0QnkudGhlbkJ5KHNvcnRTdGF0ZXNbaV0ucHJvcGVydHlOYW1lLCB7XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiB0cnVlLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBvcmRlclxuLy8gICAgICAgICAgICAgICAgICAgICB9KTtcbi8vICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhWzBdW3NvcnRTdGF0ZXNbaV0ucHJvcGVydHlOYW1lXSA9PT0gJ251bWJlcicpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgc29ydEJ5ID0gc29ydEJ5LnRoZW5CeShmdW5jdGlvbih2MSwgdjIpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2MVtzb3J0U3RhdGVzW2ldLnByb3BlcnR5TmFtZV0gLSB2Mltzb3J0U3RhdGVzW2ldLnByb3BlcnR5TmFtZV07XG4vLyAgICAgICAgICAgICAgICAgICAgIH0sIG9yZGVyKTtcbi8vICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb3RoZXJUeXBlIHNvcnQnKTtcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgZGF0YS5zb3J0KHNvcnRCeSk7XG4vLyAgICAgfVxuXG5cbi8vICAgcmV0dXJuIGRhdGE7XG4vLyAgIH1cblxufSJdfQ==