@lxlib/seed
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.1.
842 lines • 66.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: st-data-source.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __assign, __read, __spread } from "tslib";
import { DecimalPipe } from '@angular/common';
import { Host, Injectable } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { CNCurrencyPipe, DatePipe, YNPipe, _HttpClient } from '@lxlib/theme';
import { deepCopy, deepGet } from '@lxlib/util';
import { of } from 'rxjs';
import { map } from 'rxjs/operators';
/**
* @record
*/
export function STDataSourceOptions() { }
if (false) {
/** @type {?} */
STDataSourceOptions.prototype.pi;
/** @type {?} */
STDataSourceOptions.prototype.ps;
/** @type {?} */
STDataSourceOptions.prototype.paginator;
/** @type {?} */
STDataSourceOptions.prototype.data;
/** @type {?} */
STDataSourceOptions.prototype.total;
/** @type {?} */
STDataSourceOptions.prototype.req;
/** @type {?} */
STDataSourceOptions.prototype.res;
/** @type {?} */
STDataSourceOptions.prototype.page;
/** @type {?} */
STDataSourceOptions.prototype.columns;
/** @type {?|undefined} */
STDataSourceOptions.prototype.singleSort;
/** @type {?|undefined} */
STDataSourceOptions.prototype.multiSort;
/** @type {?|undefined} */
STDataSourceOptions.prototype.rowClassName;
}
/**
* @record
*/
export function STDataSourceResult() { }
if (false) {
/**
* 是否需要显示分页器
* @type {?}
*/
STDataSourceResult.prototype.pageShow;
/**
* 新 `pi`,若返回 `undefined` 表示用户受控
* @type {?}
*/
STDataSourceResult.prototype.pi;
/**
* 新 `ps`,若返回 `undefined` 表示用户受控
* @type {?}
*/
STDataSourceResult.prototype.ps;
/**
* 新 `total`,若返回 `undefined` 表示用户受控
* @type {?}
*/
STDataSourceResult.prototype.total;
/**
* 数据
* @type {?}
*/
STDataSourceResult.prototype.list;
/**
* 统计数据
* @type {?}
*/
STDataSourceResult.prototype.statistical;
}
var STDataSource = /** @class */ (function () {
function STDataSource(http, currentyPipe, datePipe, ynPipe, numberPipe, dom) {
this.http = http;
this.currentyPipe = currentyPipe;
this.datePipe = datePipe;
this.ynPipe = ynPipe;
this.numberPipe = numberPipe;
this.dom = dom;
this.sortTick = 0;
}
/**
* @param {?} options
* @return {?}
*/
STDataSource.prototype.process = /**
* @param {?} options
* @return {?}
*/
function (options) {
var _this = this;
/** @type {?} */
var data$;
/** @type {?} */
var isRemote = false;
var data = options.data, res = options.res, total = options.total, page = options.page, pi = options.pi, ps = options.ps, paginator = options.paginator, columns = options.columns;
/** @type {?} */
var retTotal;
/** @type {?} */
var retPs;
/** @type {?} */
var retList;
/** @type {?} */
var retPi;
/** @type {?} */
var rawData;
/** @type {?} */
var showPage = page.show;
if (typeof data === 'string') {
isRemote = true;
data$ = this.getByHttp(data, options).pipe(map((/**
* @param {?} result
* @return {?}
*/
function (result) {
rawData = result;
/** @type {?} */
var ret;
if (Array.isArray(result)) {
ret = result;
retTotal = ret.length;
retPs = retTotal;
showPage = false;
}
else {
// list
ret = deepGet(result, (/** @type {?} */ ((/** @type {?} */ (res.reName)).list)), []);
if (ret == null || !Array.isArray(ret)) {
ret = [];
}
// total
/** @type {?} */
var resultTotal = (/** @type {?} */ (res.reName)).total && deepGet(result, (/** @type {?} */ ((/** @type {?} */ (res.reName)).total)), null);
retTotal = resultTotal == null ? total || 0 : +resultTotal;
}
return deepCopy(ret);
})));
}
else if (Array.isArray(data)) {
data$ = of(data);
}
else {
// a cold observable
data$ = data;
}
if (!isRemote) {
data$ = data$.pipe(
// sort
map((/**
* @param {?} result
* @return {?}
*/
function (result) {
rawData = result;
/** @type {?} */
var copyResult = deepCopy(result);
/** @type {?} */
var sorterFn = _this.getSorterFn(columns);
if (sorterFn) {
copyResult = copyResult.sort(sorterFn);
}
return copyResult;
})),
// filter
map((/**
* @param {?} result
* @return {?}
*/
function (result) {
columns
.filter((/**
* @param {?} w
* @return {?}
*/
function (w) { return w.filter; }))
.forEach((/**
* @param {?} c
* @return {?}
*/
function (c) {
/** @type {?} */
var filter = (/** @type {?} */ (c.filter));
/** @type {?} */
var values = _this.getFilteredData(filter);
if (values.length === 0)
return;
/** @type {?} */
var onFilter = filter.fn;
if (typeof onFilter !== 'function') {
console.warn("[st] Muse provide the fn function in filter");
return;
}
result = result.filter((/**
* @param {?} record
* @return {?}
*/
function (record) { return values.some((/**
* @param {?} v
* @return {?}
*/
function (v) { return onFilter(v, record); })); }));
}));
return result;
})),
// paging
map((/**
* @param {?} result
* @return {?}
*/
function (result) {
if (paginator && page.front) {
/** @type {?} */
var maxPageIndex = Math.ceil(result.length / ps);
retPi = Math.max(1, pi > maxPageIndex ? maxPageIndex : pi);
retTotal = result.length;
if (page.show === true) {
return result.slice((retPi - 1) * ps, retPi * ps);
}
}
return result;
})));
}
// pre-process
if (typeof res.process === 'function') {
data$ = data$.pipe(map((/**
* @param {?} result
* @return {?}
*/
function (result) { return (/** @type {?} */ (res.process))(result, rawData); })));
}
data$ = data$.pipe(map((/**
* @param {?} result
* @return {?}
*/
function (result) { return _this.optimizeData({ result: result, columns: columns, rowClassName: options.rowClassName }); })));
return data$.pipe(map((/**
* @param {?} result
* @return {?}
*/
function (result) {
retList = result;
/** @type {?} */
var realTotal = retTotal || total;
/** @type {?} */
var realPs = retPs || ps;
return (/** @type {?} */ ({
pi: retPi,
ps: retPs,
total: retTotal,
list: retList,
statistical: _this.genStatistical(columns, retList, rawData),
pageShow: typeof showPage === 'undefined' ? realTotal > realPs : showPage,
}));
})));
};
/**
* @private
* @param {?} item
* @param {?} col
* @param {?} idx
* @return {?}
*/
STDataSource.prototype.get = /**
* @private
* @param {?} item
* @param {?} col
* @param {?} idx
* @return {?}
*/
function (item, col, idx) {
if (col.format) {
/** @type {?} */
var formatRes = col.format(item, col, idx) || '';
if (formatRes && ~formatRes.indexOf('</')) {
return { text: formatRes, _text: this.dom.bypassSecurityTrustHtml(formatRes), org: formatRes };
}
return { text: formatRes, _text: formatRes, org: formatRes };
}
/** @type {?} */
var value = deepGet(item, (/** @type {?} */ (col.index)), col.default);
/** @type {?} */
var text = value;
/** @type {?} */
var color;
switch (col.type) {
case 'no':
text = this.getNoIndex(item, col, idx);
break;
case 'img':
text = value ? "<img src=\"" + value + "\" class=\"img\">" : '';
break;
case 'number':
text = this.numberPipe.transform(value, col.numberDigits);
break;
case 'currency':
text = this.currentyPipe.transform(value);
break;
case 'date':
text = value === col.default ? col.default : this.datePipe.transform(value, col.dateFormat);
break;
case 'yn':
text = this.ynPipe.transform(value === (/** @type {?} */ (col.yn)).truth, (/** @type {?} */ ((/** @type {?} */ (col.yn)).yes)), (/** @type {?} */ ((/** @type {?} */ (col.yn)).no)), (/** @type {?} */ ((/** @type {?} */ (col.yn)).mode)), false);
break;
case 'tag':
case 'badge':
/** @type {?} */
var data = col.type === 'tag' ? col.tag : col.badge;
if (data && data[text]) {
/** @type {?} */
var dataItem = data[text];
text = dataItem.text;
color = dataItem.color;
}
else {
text = '';
}
break;
}
if (text == null)
text = '';
return { text: text, _text: this.dom.bypassSecurityTrustHtml(text), org: value, color: color };
};
/**
* @private
* @param {?} url
* @param {?} options
* @return {?}
*/
STDataSource.prototype.getByHttp = /**
* @private
* @param {?} url
* @param {?} options
* @return {?}
*/
function (url, options) {
var _a, _b;
var req = options.req, page = options.page, paginator = options.paginator, pi = options.pi, ps = options.ps, singleSort = options.singleSort, multiSort = options.multiSort, columns = options.columns;
/** @type {?} */
var method = (req.method || 'GET').toUpperCase();
/** @type {?} */
var params = {};
/** @type {?} */
var reName = (/** @type {?} */ (req.reName));
if (paginator) {
if (req.type === 'page') {
params = (_a = {},
_a[(/** @type {?} */ (reName.pi))] = page.zeroIndexed ? pi - 1 : pi,
_a[(/** @type {?} */ (reName.ps))] = ps,
_a);
}
else {
params = (_b = {},
_b[(/** @type {?} */ (reName.skip))] = (pi - 1) * ps,
_b[(/** @type {?} */ (reName.limit))] = ps,
_b);
}
}
params = __assign(__assign(__assign(__assign({}, params), req.params), this.getReqSortMap(singleSort, multiSort, columns)), this.getReqFilterMap(columns));
/** @type {?} */
var reqOptions = {
params: params,
body: req.body,
headers: req.headers,
};
if (method === 'POST' && req.allInBody === true) {
reqOptions = {
body: __assign(__assign({}, req.body), params),
headers: req.headers,
};
}
if (typeof req.process === 'function') {
reqOptions = req.process(reqOptions);
}
return this.http.request(method, url, reqOptions);
};
/**
* @param {?} options
* @return {?}
*/
STDataSource.prototype.optimizeData = /**
* @param {?} options
* @return {?}
*/
function (options) {
var _this = this;
var result = options.result, columns = options.columns, rowClassName = options.rowClassName;
var _loop_1 = function (i, len) {
result[i]._values = columns.map((/**
* @param {?} c
* @return {?}
*/
function (c) { return _this.get(result[i], c, i); }));
if (rowClassName) {
result[i]._rowClassName = rowClassName(result[i], i);
}
};
for (var i = 0, len = result.length; i < len; i++) {
_loop_1(i, len);
}
return result;
};
/**
* @param {?} item
* @param {?} col
* @param {?} idx
* @return {?}
*/
STDataSource.prototype.getNoIndex = /**
* @param {?} item
* @param {?} col
* @param {?} idx
* @return {?}
*/
function (item, col, idx) {
return typeof col.noIndex === 'function' ? col.noIndex(item, col, idx) : (/** @type {?} */ (col.noIndex)) + idx;
};
// #region sort
// #region sort
/**
* @private
* @param {?} columns
* @return {?}
*/
STDataSource.prototype.getValidSort =
// #region sort
/**
* @private
* @param {?} columns
* @return {?}
*/
function (columns) {
return columns.filter((/**
* @param {?} item
* @return {?}
*/
function (item) { return item._sort && item._sort.enabled && item._sort.default; })).map((/**
* @param {?} item
* @return {?}
*/
function (item) { return (/** @type {?} */ (item._sort)); }));
};
/**
* @private
* @param {?} columns
* @return {?}
*/
STDataSource.prototype.getSorterFn = /**
* @private
* @param {?} columns
* @return {?}
*/
function (columns) {
/** @type {?} */
var sortList = this.getValidSort(columns);
if (sortList.length === 0) {
return;
}
/** @type {?} */
var sortItem = sortList[0];
if (sortItem.compare === null) {
return;
}
if (typeof sortItem.compare !== 'function') {
console.warn("[st] Muse provide the compare function in sort");
return;
}
return (/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) {
/** @type {?} */
var result = (/** @type {?} */ (sortItem.compare))(a, b);
if (result !== 0) {
return sortItem.default === 'descend' ? -result : result;
}
return 0;
});
};
Object.defineProperty(STDataSource.prototype, "nextSortTick", {
get: /**
* @return {?}
*/
function () {
return ++this.sortTick;
},
enumerable: true,
configurable: true
});
/**
* @param {?} singleSort
* @param {?} multiSort
* @param {?} columns
* @return {?}
*/
STDataSource.prototype.getReqSortMap = /**
* @param {?} singleSort
* @param {?} multiSort
* @param {?} columns
* @return {?}
*/
function (singleSort, multiSort, columns) {
var _a;
/** @type {?} */
var ret = {};
/** @type {?} */
var sortList = this.getValidSort(columns);
if (!multiSort && sortList.length === 0)
return ret;
if (multiSort) {
/** @type {?} */
var ms_1 = __assign({ key: 'sort', separator: '-', nameSeparator: '.' }, multiSort);
ret = (_a = {},
_a[ms_1.key] = sortList
.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return a.tick - b.tick; }))
.map((/**
* @param {?} item
* @return {?}
*/
function (item) { return item.key + ms_1.nameSeparator + ((item.reName || {})[(/** @type {?} */ (item.default))] || item.default); }))
.join(ms_1.separator),
_a);
if (multiSort.keepEmptyKey === false && ret[ms_1.key].length === 0) {
ret = {};
}
}
else {
/** @type {?} */
var mapData = sortList[0];
/** @type {?} */
var sortFiled = mapData.key;
/** @type {?} */
var sortValue = (sortList[0].reName || {})[(/** @type {?} */ (mapData.default))] || mapData.default;
if (singleSort) {
sortValue = sortFiled + (singleSort.nameSeparator || '.') + sortValue;
sortFiled = singleSort.key || 'sort';
}
ret[(/** @type {?} */ (sortFiled))] = (/** @type {?} */ (sortValue));
}
return ret;
};
// #endregion
// #region filter
// #endregion
// #region filter
/**
* @private
* @param {?} filter
* @return {?}
*/
STDataSource.prototype.getFilteredData =
// #endregion
// #region filter
/**
* @private
* @param {?} filter
* @return {?}
*/
function (filter) {
return filter.type === 'default' ? (/** @type {?} */ (filter.menus)).filter((/**
* @param {?} f
* @return {?}
*/
function (f) { return f.checked === true; })) : (/** @type {?} */ (filter.menus)).slice(0, 1);
};
/**
* @private
* @param {?} columns
* @return {?}
*/
STDataSource.prototype.getReqFilterMap = /**
* @private
* @param {?} columns
* @return {?}
*/
function (columns) {
var _this = this;
/** @type {?} */
var ret = {};
columns
.filter((/**
* @param {?} w
* @return {?}
*/
function (w) { return w.filter && w.filter.default === true; }))
.forEach((/**
* @param {?} col
* @return {?}
*/
function (col) {
/** @type {?} */
var filter = (/** @type {?} */ (col.filter));
/** @type {?} */
var values = _this.getFilteredData(filter);
/** @type {?} */
var obj = {};
if (filter.reName) {
obj = (/** @type {?} */ (filter.reName))((/** @type {?} */ (filter.menus)), col);
}
else {
obj[(/** @type {?} */ (filter.key))] = values.map((/**
* @param {?} i
* @return {?}
*/
function (i) { return i.value; })).join(',');
}
ret = __assign(__assign({}, ret), obj);
}));
return ret;
};
// #endregion
// #region statistical
// #endregion
// #region statistical
/**
* @private
* @param {?} columns
* @param {?} list
* @param {?} rawData
* @return {?}
*/
STDataSource.prototype.genStatistical =
// #endregion
// #region statistical
/**
* @private
* @param {?} columns
* @param {?} list
* @param {?} rawData
* @return {?}
*/
function (columns, list, rawData) {
var _this = this;
/** @type {?} */
var res = {};
columns.forEach((/**
* @param {?} col
* @param {?} index
* @return {?}
*/
function (col, index) {
res[col.key ? col.key : index] = col.statistical == null ? {} : _this.getStatistical(col, index, list, rawData);
}));
return res;
};
/**
* @private
* @param {?} col
* @param {?} index
* @param {?} list
* @param {?} rawData
* @return {?}
*/
STDataSource.prototype.getStatistical = /**
* @private
* @param {?} col
* @param {?} index
* @param {?} list
* @param {?} rawData
* @return {?}
*/
function (col, index, list, rawData) {
/** @type {?} */
var val = col.statistical;
/** @type {?} */
var item = __assign({ digits: 2, currency: undefined }, (typeof val === 'string' ? { type: (/** @type {?} */ (val)) } : ((/** @type {?} */ (val)))));
/** @type {?} */
var res = { value: 0 };
/** @type {?} */
var currency = false;
if (typeof item.type === 'function') {
res = item.type(this.getValues(index, list), col, list, rawData);
currency = true;
}
else {
switch (item.type) {
case 'count':
res.value = list.length;
break;
case 'distinctCount':
res.value = this.getValues(index, list).filter((/**
* @param {?} value
* @param {?} idx
* @param {?} self
* @return {?}
*/
function (value, idx, self) { return self.indexOf(value) === idx; })).length;
break;
case 'sum':
res.value = this.toFixed(this.getSum(index, list), (/** @type {?} */ (item.digits)));
currency = true;
break;
case 'average':
res.value = this.toFixed(this.getSum(index, list) / list.length, (/** @type {?} */ (item.digits)));
currency = true;
break;
case 'max':
res.value = Math.max.apply(Math, __spread(this.getValues(index, list)));
currency = true;
break;
case 'min':
res.value = Math.min.apply(Math, __spread(this.getValues(index, list)));
currency = true;
break;
}
}
if (item.currency === true || (item.currency == null && currency === true)) {
res.text = (/** @type {?} */ (this.currentyPipe.transform(res.value)));
}
else {
res.text = String(res.value);
}
return res;
};
/**
* @private
* @param {?} val
* @param {?} digits
* @return {?}
*/
STDataSource.prototype.toFixed = /**
* @private
* @param {?} val
* @param {?} digits
* @return {?}
*/
function (val, digits) {
if (isNaN(val) || !isFinite(val)) {
return 0;
}
return parseFloat(val.toFixed(digits));
};
/**
* @private
* @param {?} index
* @param {?} list
* @return {?}
*/
STDataSource.prototype.getValues = /**
* @private
* @param {?} index
* @param {?} list
* @return {?}
*/
function (index, list) {
return list.map((/**
* @param {?} i
* @return {?}
*/
function (i) { return i._values[index].org; })).map((/**
* @param {?} i
* @return {?}
*/
function (i) { return (i === '' || i == null ? 0 : i); }));
};
/**
* @private
* @param {?} index
* @param {?} list
* @return {?}
*/
STDataSource.prototype.getSum = /**
* @private
* @param {?} index
* @param {?} list
* @return {?}
*/
function (index, list) {
return this.getValues(index, list).reduce((/**
* @param {?} p
* @param {?} i
* @return {?}
*/
function (p, i) { return (p += parseFloat(String(i))); }), 0);
};
STDataSource.decorators = [
{ type: Injectable }
];
/** @nocollapse */
STDataSource.ctorParameters = function () { return [
{ type: _HttpClient },
{ type: CNCurrencyPipe, decorators: [{ type: Host }] },
{ type: DatePipe, decorators: [{ type: Host }] },
{ type: YNPipe, decorators: [{ type: Host }] },
{ type: DecimalPipe, decorators: [{ type: Host }] },
{ type: DomSanitizer }
]; };
return STDataSource;
}());
export { STDataSource };
if (false) {
/**
* @type {?}
* @private
*/
STDataSource.prototype.sortTick;
/**
* @type {?}
* @private
*/
STDataSource.prototype.http;
/**
* @type {?}
* @private
*/
STDataSource.prototype.currentyPipe;
/**
* @type {?}
* @private
*/
STDataSource.prototype.datePipe;
/**
* @type {?}
* @private
*/
STDataSource.prototype.ynPipe;
/**
* @type {?}
* @private
*/
STDataSource.prototype.numberPipe;
/**
* @type {?}
* @private
*/
STDataSource.prototype.dom;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbHhsaWIvc2VlZC9zdC8iLCJzb3VyY2VzIjpbInN0LWRhdGEtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVoRCxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQW9CckMseUNBYUM7OztJQVpDLGlDQUFXOztJQUNYLGlDQUFXOztJQUNYLHdDQUFtQjs7SUFDbkIsbUNBQStDOztJQUMvQyxvQ0FBYzs7SUFDZCxrQ0FBVzs7SUFDWCxrQ0FBVzs7SUFDWCxtQ0FBYTs7SUFDYixzQ0FBb0I7O0lBQ3BCLHlDQUFpQzs7SUFDakMsd0NBQStCOztJQUMvQiwyQ0FBOEI7Ozs7O0FBR2hDLHdDQWFDOzs7Ozs7SUFYQyxzQ0FBa0I7Ozs7O0lBRWxCLGdDQUFXOzs7OztJQUVYLGdDQUFXOzs7OztJQUVYLG1DQUFjOzs7OztJQUVkLGtDQUFlOzs7OztJQUVmLHlDQUFrQzs7QUFHcEM7SUFJRSxzQkFDVSxJQUFpQixFQUNULFlBQTRCLEVBQzVCLFFBQWtCLEVBQ2xCLE1BQWMsRUFDZCxVQUF1QixFQUMvQixHQUFpQjtRQUxqQixTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ1QsaUJBQVksR0FBWixZQUFZLENBQWdCO1FBQzVC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ckIsbUJBQUM7Q0FBQSxBQWpaRCxJQWlaQztTQWhaWSxZQUFZOzs7Ozs7SUFDdkIsZ0NBQXFCOzs7OztJQUduQiw0QkFBeUI7Ozs7O0lBQ3pCLG9DQUE0Qzs7Ozs7SUFDNUMsZ0NBQWtDOzs7OztJQUNsQyw4QkFBOEI7Ozs7O0lBQzlCLGtDQUF1Qzs7Ozs7SUFDdkMsMkJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVjaW1hbFBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSG9zdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgQ05DdXJyZW5jeVBpcGUsIERhdGVQaXBlLCBZTlBpcGUsIF9IdHRwQ2xpZW50IH0gZnJvbSAnQGx4bGliL3RoZW1lJztcbmltcG9ydCB7IGRlZXBDb3B5LCBkZWVwR2V0IH0gZnJvbSAnQGx4bGliL3V0aWwnO1xuaW1wb3J0IHsgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBTVENvbHVtbixcbiAgU1RDb2x1bW5GaWx0ZXIsXG4gIFNURGF0YSxcbiAgU1RNdWx0aVNvcnQsXG4gIFNUUGFnZSxcbiAgU1RSZXEsXG4gIFNUUmVxUmVOYW1lVHlwZSxcbiAgU1RSZXF1ZXN0T3B0aW9ucyxcbiAgU1RSZXMsXG4gIFNUUm93Q2xhc3NOYW1lLFxuICBTVFNpbmdsZVNvcnQsXG4gIFNUU29ydE1hcCxcbiAgU1RTdGF0aXN0aWNhbCxcbiAgU1RTdGF0aXN0aWNhbFJlc3VsdCxcbiAgU1RTdGF0aXN0aWNhbFJlc3VsdHMsXG4gIFNUU3RhdGlzdGljYWxUeXBlLFxufSBmcm9tICcuL3N0LmludGVyZmFjZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNURGF0YVNvdXJjZU9wdGlvbnMge1xuICBwaTogbnVtYmVyO1xuICBwczogbnVtYmVyO1xuICBwYWdpbmF0b3I6IGJvb2xlYW47XG4gIGRhdGE6IHN0cmluZyB8IFNURGF0YVtdIHwgT2JzZXJ2YWJsZTxTVERhdGFbXT47XG4gIHRvdGFsOiBudW1iZXI7XG4gIHJlcTogU1RSZXE7XG4gIHJlczogU1RSZXM7XG4gIHBhZ2U6IFNUUGFnZTtcbiAgY29sdW1uczogU1RDb2x1bW5bXTtcbiAgc2luZ2xlU29ydD86IFNUU2luZ2xlU29ydCB8IG51bGw7XG4gIG11bHRpU29ydD86IFNUTXVsdGlTb3J0IHwgbnVsbDtcbiAgcm93Q2xhc3NOYW1lPzogU1RSb3dDbGFzc05hbWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU1REYXRhU291cmNlUmVzdWx0IHtcbiAgLyoqIOaYr+WQpumcgOimgeaYvuekuuWIhumhteWZqCAqL1xuICBwYWdlU2hvdzogYm9vbGVhbjtcbiAgLyoqIOaWsCBgcGlg77yM6Iul6L+U5ZueIGB1bmRlZmluZWRgIOihqOekuueUqOaIt+WPl+aOpyAqL1xuICBwaTogbnVtYmVyO1xuICAvKiog5pawIGBwc2DvvIzoi6Xov5Tlm54gYHVuZGVmaW5lZGAg6KGo56S655So5oi35Y+X5o6nICovXG4gIHBzOiBudW1iZXI7XG4gIC8qKiDmlrAgYHRvdGFsYO+8jOiLpei/lOWbniBgdW5kZWZpbmVkYCDooajnpLrnlKjmiLflj5fmjqcgKi9cbiAgdG90YWw6IG51bWJlcjtcbiAgLyoqIOaVsOaNriAqL1xuICBsaXN0OiBTVERhdGFbXTtcbiAgLyoqIOe7n+iuoeaVsOaNriAqL1xuICBzdGF0aXN0aWNhbDogU1RTdGF0aXN0aWNhbFJlc3VsdHM7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTVERhdGFTb3VyY2Uge1xuICBwcml2YXRlIHNvcnRUaWNrID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IF9IdHRwQ2xpZW50LFxuICAgIEBIb3N0KCkgcHJpdmF0ZSBjdXJyZW50eVBpcGU6IENOQ3VycmVuY3lQaXBlLFxuICAgIEBIb3N0KCkgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXG4gICAgQEhvc3QoKSBwcml2YXRlIHluUGlwZTogWU5QaXBlLFxuICAgIEBIb3N0KCkgcHJpdmF0ZSBudW1iZXJQaXBlOiBEZWNpbWFsUGlwZSxcbiAgICBwcml2YXRlIGRvbTogRG9tU2FuaXRpemVyLFxuICApIHt9XG5cbiAgcHJvY2VzcyhvcHRpb25zOiBTVERhdGFTb3VyY2VPcHRpb25zKTogT2JzZXJ2YWJsZTxTVERhdGFTb3VyY2VSZXN1bHQ+IHtcbiAgICBsZXQgZGF0YSQ6IE9ic2VydmFibGU8U1REYXRhW10+O1xuICAgIGxldCBpc1JlbW90ZSA9IGZhbHNlO1xuICAgIGNvbnN0IHsgZGF0YSwgcmVzLCB0b3RhbCwgcGFnZSwgcGksIHBzLCBwYWdpbmF0b3IsIGNvbHVtbnMgfSA9IG9wdGlvbnM7XG4gICAgbGV0IHJldFRvdGFsOiBudW1iZXI7XG4gICAgbGV0IHJldFBzOiBudW1iZXI7XG4gICAgbGV0IHJldExpc3Q6IFNURGF0YVtdO1xuICAgIGxldCByZXRQaTogbnVtYmVyO1xuICAgIGxldCByYXdEYXRhOiBhbnk7XG4gICAgbGV0IHNob3dQYWdlID0gcGFnZS5zaG93O1xuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgaXNSZW1vdGUgPSB0cnVlO1xuICAgICAgZGF0YSQgPSB0aGlzLmdldEJ5SHR0cChkYXRhLCBvcHRpb25zKS5waXBlKFxuICAgICAgICBtYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICByYXdEYXRhID0gcmVzdWx0O1xuICAgICAgICAgIGxldCByZXQ6IFNURGF0YVtdO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldCA9IHJlc3VsdDtcbiAgICAgICAgICAgIHJldFRvdG