UNPKG

@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
/** * @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