ts-generic-collections-linq
Version:
TypeScript library provides strongly-typed, queryable collections.
735 lines • 43.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Group, ITEM_NOT_FOUND_MSG, MULTIPLE_INSTANCES_FOUND_MSG } from './common';
/**
* @record
* @template T
*/
export function IList() { }
if (false) {
/**
* @param {?} item
* @return {?}
*/
IList.prototype.add = function (item) { };
/**
* @param {?} items
* @return {?}
*/
IList.prototype.addRange = function (items) { };
/**
* @param {?} predicate
* @return {?}
*/
IList.prototype.remove = function (predicate) { };
/**
* @param {?} index
* @return {?}
*/
IList.prototype.removeAt = function (index) { };
/**
* @return {?}
*/
IList.prototype.clear = function () { };
}
/**
* @template T
*/
var /**
* @template T
*/
List = /** @class */ (function () {
function List(array) {
if (array === void 0) { array = null; }
this.list = new Array();
if (array)
this.list = array;
}
/* IList */
/* IList */
/**
* @param {?} item
* @return {?}
*/
List.prototype.add = /* IList */
/**
* @param {?} item
* @return {?}
*/
function (item) {
this.list.push(item);
};
/**
* @param {?} items
* @return {?}
*/
List.prototype.addRange = /**
* @param {?} items
* @return {?}
*/
function (items) {
var _this = this;
items.forEach((/**
* @param {?} x
* @return {?}
*/
function (x) { return _this.add(x); }));
};
/**
* @param {?} predicate
* @return {?}
*/
List.prototype.remove = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
/** @type {?} */
var temp = new Array();
this.list.forEach((/**
* @param {?} element
* @return {?}
*/
function (element) {
if (!predicate(element)) {
temp.push(element);
}
}));
this.list = temp;
};
/**
* @param {?} index
* @return {?}
*/
List.prototype.removeAt = /**
* @param {?} index
* @return {?}
*/
function (index) {
this.list.splice(index, 1);
};
/**
* @return {?}
*/
List.prototype.clear = /**
* @return {?}
*/
function () {
this.list = new Array();
};
/* IEnumerable */
/* IEnumerable */
/**
* @return {?}
*/
List.prototype.asEnumerable = /* IEnumerable */
/**
* @return {?}
*/
function () {
return this;
};
Object.defineProperty(List.prototype, "length", {
get: /**
* @return {?}
*/
function () {
return this.list.length;
},
enumerable: true,
configurable: true
});
/**
* @param {?} index
* @return {?}
*/
List.prototype.elementAt = /**
* @param {?} index
* @return {?}
*/
function (index) {
try {
return this.list[index];
}
catch (e) {
return null;
}
};
/**
* @param {?=} predicate
* @return {?}
*/
List.prototype.any = /**
* @param {?=} predicate
* @return {?}
*/
function (predicate) {
if (!predicate) {
return this.list.length > 0;
}
for (var i = 0; i < this.list.length; i++) {
if (predicate(this.list[i])) {
return true;
}
}
return false;
};
/**
* @param {?=} predicate
* @return {?}
*/
List.prototype.all = /**
* @param {?=} predicate
* @return {?}
*/
function (predicate) {
if (!predicate) {
return this.list.length > 0;
}
for (var i = 0; i < this.list.length; i++) {
if (!predicate(this.list[i])) {
return false;
}
}
return true;
};
/**
* @param {?=} predicate
* @return {?}
*/
List.prototype.single = /**
* @param {?=} predicate
* @return {?}
*/
function (predicate) {
if (predicate === void 0) { predicate = null; }
if (this.list.length <= 0) {
throw ITEM_NOT_FOUND_MSG;
}
if (predicate) {
/** @type {?} */
var item = this.singleOrDefault(predicate);
if (!item) {
throw ITEM_NOT_FOUND_MSG;
}
return item;
}
return this.list[0];
};
/**
* @param {?=} predicate
* @return {?}
*/
List.prototype.first = /**
* @param {?=} predicate
* @return {?}
*/
function (predicate) {
if (predicate === void 0) { predicate = null; }
if (this.list.length <= 0) {
throw ITEM_NOT_FOUND_MSG;
}
if (predicate) {
/** @type {?} */
var item = this.firstOrDefault(predicate);
if (!item) {
throw ITEM_NOT_FOUND_MSG;
}
return item;
}
return this.list[0];
};
/**
* @param {?=} predicate
* @return {?}
*/
List.prototype.last = /**
* @param {?=} predicate
* @return {?}
*/
function (predicate) {
if (predicate === void 0) { predicate = null; }
if (this.list.length <= 0) {
throw ITEM_NOT_FOUND_MSG;
}
if (predicate) {
/** @type {?} */
var item = this.lastOrDefault(predicate);
if (!item) {
throw ITEM_NOT_FOUND_MSG;
}
return item;
}
return this.list[this.list.length - 1];
};
/**
* @param {?} predicate
* @return {?}
*/
List.prototype.singleOrDefault = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
/** @type {?} */
var temp = new Array();
this.list.filter((/**
* @param {?} element
* @return {?}
*/
function (element) {
if (predicate(element)) {
temp.push(element);
}
}));
if (temp.length > 1) {
throw MULTIPLE_INSTANCES_FOUND_MSG;
}
if (temp.length <= 0) {
return null;
}
return temp[0];
};
/**
* @param {?} predicate
* @return {?}
*/
List.prototype.firstOrDefault = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
for (var i = 0; i < this.length; i++) {
/** @type {?} */
var item = this.list[i];
if (predicate(item)) {
return item;
}
}
return null;
};
/**
* @param {?} predicate
* @return {?}
*/
List.prototype.lastOrDefault = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
for (var i = this.length; i >= 0; i--) {
/** @type {?} */
var item = this.list[i - 1];
if (predicate(item)) {
return item;
}
}
return null;
};
/**
* @param {?} predicate
* @return {?}
*/
List.prototype.where = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
/** @type {?} */
var temp = new List();
this.list.filter((/**
* @param {?} element
* @return {?}
*/
function (element) {
if (predicate(element)) {
temp.add(element);
}
}));
return temp;
};
/**
* @template TResult
* @param {?} predicate
* @return {?}
*/
List.prototype.select = /**
* @template TResult
* @param {?} predicate
* @return {?}
*/
function (predicate) {
/** @type {?} */
var temp = new List();
this.forEach((/**
* @param {?} x
* @return {?}
*/
function (x) { return temp.add(predicate(x)); }));
return temp;
};
/**
* @param {?} predicate
* @return {?}
*/
List.prototype.forEach = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
function (x) { return predicate(x); }));
};
/**
* @return {?}
*/
List.prototype.toArray = /**
* @return {?}
*/
function () {
return this.list.slice();
};
/**
* @template TOuter, TMatch, TResult
* @param {?} outer
* @param {?} conditionInner
* @param {?} conditionOuter
* @param {?} select
* @param {?=} leftJoin
* @return {?}
*/
List.prototype.join = /**
* @template TOuter, TMatch, TResult
* @param {?} outer
* @param {?} conditionInner
* @param {?} conditionOuter
* @param {?} select
* @param {?=} leftJoin
* @return {?}
*/
function (outer, conditionInner, conditionOuter, select, leftJoin) {
if (leftJoin === void 0) { leftJoin = false; }
/** @type {?} */
var resultList = new List();
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
function (x) {
/** @type {?} */
var outerEntries = outer.toArray().filter((/**
* @param {?} y
* @return {?}
*/
function (y) { return conditionInner(x) === conditionOuter(y); }));
if (leftJoin && outerEntries && outerEntries.length <= 0) {
resultList.add(select(x, null));
}
else {
outerEntries.forEach((/**
* @param {?} z
* @return {?}
*/
function (z) { return resultList.add(select(x, z)); }));
}
}));
return resultList;
};
/**
* @param {?} predicate
* @return {?}
*/
List.prototype.groupBy = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
/** @type {?} */
var groups = {};
this.list.forEach((/**
* @param {?} o
* @return {?}
*/
function (o) {
/** @type {?} */
var group = JSON.stringify(predicate(o));
groups[group] = groups[group] || [];
groups[group].push(o);
}));
/** @type {?} */
var g = Object.keys(groups).map((/**
* @param {?} group
* @return {?}
*/
function (group) {
/** @type {?} */
var a = group.substr(1, group.length - 2);
/** @type {?} */
var grp = new Group(new List(a.split(',')).select((/**
* @param {?} x
* @return {?}
*/
function (x) { return x.replace(/^(")?(.*?)(")?$/ig, "$2"); })).toArray(), groups[group]);
return grp;
}));
return new List(g);
};
/**
* @template TResult
* @param {?} predicate
* @return {?}
*/
List.prototype.selectMany = /**
* @template TResult
* @param {?} predicate
* @return {?}
*/
function (predicate) {
return this.list.reduce((/**
* @param {?} out
* @param {?} inx
* @return {?}
*/
function (out, inx) {
/** @type {?} */
var items = predicate(inx);
out.addRange(items);
return out;
}), new List(new Array()));
};
/**
* @param {?} comparer
* @return {?}
*/
List.prototype.orderBy = /**
* @param {?} comparer
* @return {?}
*/
function (comparer) {
/** @type {?} */
var temp = this.list.sort((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) { return comparer.compare(x, y); }));
return new List(temp);
};
/**
* @param {?} list
* @return {?}
*/
List.prototype.union = /**
* @param {?} list
* @return {?}
*/
function (list) {
this.addRange(list.toArray());
return this;
};
/**
* @return {?}
*/
List.prototype.reverse = /**
* @return {?}
*/
function () {
return new List(this.list.slice().reverse());
};
/**
* @param {?} comparer
* @return {?}
*/
List.prototype.distinct = /**
* @param {?} comparer
* @return {?}
*/
function (comparer) {
/** @type {?} */
var uniques = new List();
this.forEach((/**
* @param {?} x
* @return {?}
*/
function (x) {
if (uniques.length > 0) {
if (!uniques.any((/**
* @param {?} y
* @return {?}
*/
function (y) { return comparer.equals(x, y); }))) {
uniques.add(x);
}
}
else {
uniques.add(x);
}
}));
return uniques;
};
/**
* @param {?} no
* @return {?}
*/
List.prototype.skip = /**
* @param {?} no
* @return {?}
*/
function (no) {
if (no > 0) {
return new List(this.list.slice(no, this.list.length - 1));
}
return this;
};
/**
* @param {?} no
* @return {?}
*/
List.prototype.take = /**
* @param {?} no
* @return {?}
*/
function (no) {
if (no > 0) {
return new List(this.list.slice(0, no));
}
return this;
};
/**
* @param {?} predicate
* @return {?}
*/
List.prototype.sum = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
/** @type {?} */
var sum = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
function (x) { return sum = sum + predicate(x); }));
return sum;
};
/**
* @param {?} predicate
* @return {?}
*/
List.prototype.avg = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
return this.sum(predicate) / this.length;
};
/**
* @param {?} predicate
* @return {?}
*/
List.prototype.min = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
/** @type {?} */
var min = 0;
/** @type {?} */
var i = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
function (x) {
if (i == 0) {
min = predicate(x);
}
else {
/** @type {?} */
var val = predicate(x);
if (val < min) {
min = val;
}
}
i++;
}));
return min;
};
/**
* @param {?} predicate
* @return {?}
*/
List.prototype.max = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
/** @type {?} */
var max = 0;
/** @type {?} */
var i = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
function (x) {
if (i == 0) {
max = predicate(x);
}
else {
/** @type {?} */
var val = predicate(x);
if (val > max) {
max = val;
}
}
i++;
}));
return max;
};
/**
* @param {?=} predicate
* @return {?}
*/
List.prototype.count = /**
* @param {?=} predicate
* @return {?}
*/
function (predicate) {
if (predicate === void 0) { predicate = null; }
if (!predicate) {
return this.length;
}
/** @type {?} */
var count = 0;
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
function (x) {
if (predicate(x)) {
count++;
}
}));
return count;
};
return List;
}());
/**
* @template T
*/
export { List };
if (false) {
/**
* @type {?}
* @private
*/
List.prototype.list;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RzLWdlbmVyaWMtY29sbGVjdGlvbnMtbGlucS8iLCJzb3VyY2VzIjpbImxpYi9saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxPQUFPLEVBQUUsS0FBSyxFQUFjLGtCQUFrQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sVUFBVSxDQUFDOzs7OztBQUUvRiwyQkFNQzs7Ozs7O0lBTEcsMENBQW9COzs7OztJQUNwQixnREFBNEI7Ozs7O0lBQzVCLGtEQUE4Qzs7Ozs7SUFDOUMsZ0RBQStCOzs7O0lBQy9CLHdDQUFlOzs7OztBQUduQjs7OztJQUlJLGNBQVksS0FBc0I7UUFBdEIsc0JBQUEsRUFBQSxZQUFzQjtRQUYxQixTQUFJLEdBQWEsSUFBSSxLQUFLLEVBQUssQ0FBQztRQUdwQyxJQUFJLEtBQUs7WUFDTCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVzs7Ozs7O0lBRVgsa0JBQUc7Ozs7O0lBQUgsVUFBSSxJQUFPO1FBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQzs7Ozs7SUFFRCx1QkFBUTs7OztJQUFSLFVBQVMsS0FBVTtRQUFuQixpQkFFQztRQURHLEtBQUssQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxLQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFYLENBQVcsRUFBQyxDQUFDO0lBQ3BDLENBQUM7Ozs7O0lBRUQscUJBQU07Ozs7SUFBTixVQUFPLFNBQThCOztZQUM3QixJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUs7UUFFekIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQSxPQUFPO1lBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQ3ZCO2dCQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENB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S0FBSyxHQUFXLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQSxDQUFDO1lBQ2YsSUFBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2IsS0FBSyxFQUFFLENBQUM7YUFDWDtRQUNMLENBQUMsRUFBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVMLFdBQUM7QUFBRCxDQUFDLEFBdlhELElBdVhDOzs7Ozs7Ozs7O0lBclhHLG9CQUF3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElFbnVtZXJhYmxlLCBJQ29tcGFyZXIsIElFcXVhbGl0eUNvbXBhcmVyIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgR3JvdXAsIG9iakNvbXBhcmUsIElURU1fTk9UX0ZPVU5EX01TRywgTVVMVElQTEVfSU5TVEFOQ0VTX0ZPVU5EX01TRyB9IGZyb20gJy4vY29tbW9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUxpc3Q8VD4gZXh0ZW5kcyBJRW51bWVyYWJsZTxUPiB7XHJcbiAgICBhZGQoaXRlbTogVCkgOiB2b2lkO1xyXG4gICAgYWRkUmFuZ2UoaXRlbXM6IFRbXSkgOiB2b2lkO1xyXG4gICAgcmVtb3ZlKHByZWRpY2F0ZTogKGl0ZW06VCkgPT4gYm9vbGVhbikgOiB2b2lkO1xyXG4gICAgcmVtb3ZlQXQoaW5kZXg6IG51bWJlcikgOiB2b2lkO1xyXG4gICAgY2xlYXIoKSA6IHZvaWQ7ICAgIFxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTGlzdDxUPiBpbXBsZW1lbnRzIElMaXN0PFQ+IHtcclxuXHJcbiAgICBwcml2YXRlIGxpc3Q6IEFycmF5PFQ+ID0gbmV3IEFycmF5PFQ+KCk7ICAgIFxyXG5cclxuICAgIGNvbnN0cnVjdG9yKGFycmF5OiBBcnJheTxUPiA9IG51bGwpIHtcclxuICAgICAgICBpZiAoYXJyYXkpXHJcbiAgICAgICAgICAgIHRoaXMubGlzdCA9IGFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qIElMaXN0ICovXHJcblxyXG4gICAgYWRkKGl0ZW06IFQpIDogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5saXN0LnB1c2goaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkUmFuZ2UoaXRlbXM6IFRbXSkgOiB2b2lkIHtcclxuICAgICAgICBpdGVtcy5mb3JFYWNoKHggPT4gdGhpcy5hZGQoeCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZShwcmVkaWNhdGU6IChpdGVtOlQpID0+IGJvb2xlYW4pIDogdm9pZCB7XHJcbiAgICAgICAgbGV0IHRlbXAgPSBuZXcgQXJyYXk8VD4oKTtcclxuXHJcbiAgICAgICAgdGhpcy5saXN0LmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcHJlZGljYXRlKGVsZW1lbnQpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5saXN0ID0gdGVtcDtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVBdChpbmRleDogbnVtYmVyKSA6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyKCkgOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxpc3QgPSBuZXcgQXJyYXk8VD4oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBJRW51bWVyYWJsZSAqL1xyXG5cclxuICAgIGFzRW51bWVyYWJsZSgpIDogSUVudW1lcmFibGU8VD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0Lmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBlbGVtZW50QXQoaW5kZXg6IG51bWJlcikgOiBUIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0W2luZGV4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFueShwcmVkaWNhdGU/OiAoaXRlbTogVCk9PiBib29sZWFuKSA6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghcHJlZGljYXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3QubGVuZ3RoID4gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLmxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZSh0aGlzLmxpc3RbaV0pKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYWxsKHByZWRpY2F0ZT86IChpdGVtOiBUKT0+IGJvb2xlYW4pIDogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFwcmVkaWNhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5sZW5ndGggPiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5saXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICghcHJlZGljYXRlKHRoaXMubGlzdFtpXSkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzaW5nbGUocHJlZGljYXRlOiAoaXRlbTogVCk9PiBib29sZWFuID0gbnVsbCkgOiBUIHtcclxuICAgICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IElURU1fTk9UX0ZPVU5EX01TRztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcmVkaWNhdGUpIHtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLnNpbmdsZU9yRGVmYXVsdChwcmVkaWNhdGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBJVEVNX05PVF9GT1VORF9NU0c7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0WzBdO1xyXG4gICAgfVxyXG5cclxuICAgIGZpcnN0KHByZWRpY2F0ZTogKGl0ZW06IFQpPT4gYm9vbGVhbiA9IG51bGwpIDogVCB7XHJcbiAgICAgICAgaWYgKHRoaXMubGlzdC5sZW5ndGggPD0gMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBJVEVNX05PVF9GT1VORF9NU0c7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJlZGljYXRlKSB7XHJcbiAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5maXJzdE9yRGVmYXVsdChwcmVkaWNhdGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBJVEVNX05PVF9GT1VORF9NU0c7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0WzBdO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBsYXN0KHByZWRpY2F0ZTogKGl0ZW06IFQpPT4gYm9vbGVhbiA9IG51bGwpIDogVCB7XHJcbiAgICAgICAgaWYgKHRoaXMubGlzdC5sZW5ndGggPD0gMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBJVEVNX05PVF9GT1VORF9NU0c7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJlZGljYXRlKSB7XHJcbiAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5sYXN0T3JEZWZhdWx0KHByZWRpY2F0ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHRocm93IElURU1fTk9UX0ZPVU5EX01TRztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0W3RoaXMubGlzdC5sZW5ndGggLSAxXTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgc2luZ2xlT3JEZWZhdWx0KHByZWRpY2F0ZTogKGl0ZW06IFQpPT4gYm9vbGVhbikgOiBUIHtcclxuICAgICAgICBsZXQgdGVtcCA9IG5ldyBBcnJheTxUPigpO1xyXG5cclxuICAgICAgICB0aGlzLmxpc3QuZmlsdGVyKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGVsZW1lbnQpKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRlbXAubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBNVUxUSVBMRV9JTlNUQU5DRVNfRk9VTkRfTVNHO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRlbXAubGVuZ3RoIDw9IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGVtcFswXTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgZmlyc3RPckRlZmF1bHQocHJlZGljYXRlOiAoaXRlbTogVCk9PiBib29sZWFuKSA6IFQge1xyXG4gICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5saXN0W2ldO1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGl0ZW0pKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgbGFzdE9yRGVmYXVsdChwcmVkaWNhdGU6IChpdGVtOiBUKT0+IGJvb2xlYW4pIDogVCB7XHJcbiAgICAgICAgZm9yIChsZXQgaT10aGlzLmxlbmd0aDsgaT49MDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5saXN0W2kgLSAxXTtcclxuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShpdGVtKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICB3aGVyZShwcmVkaWNhdGU6IChpdGVtOiBUKT0+IGJvb2xlYW4pIDogSUVudW1lcmFibGU8VD4ge1xyXG4gICAgICAgIGxldCB0ZW1wID0gbmV3IExpc3Q8VD4oKTtcclxuXHJcbiAgICAgICAgdGhpcy5saXN0LmZpbHRlcihlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShlbGVtZW50KSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGVtcC5hZGQoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRlbXA7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0PFRSZXN1bHQ+KHByZWRpY2F0ZTogKGl0ZW06IFQpPT4gVFJlc3VsdCkgOiBJRW51bWVyYWJsZTxUUmVzdWx0PiB7XHJcbiAgICAgICAgbGV0IHRlbXAgPSBuZXcgTGlzdDxUUmVzdWx0PigpO1xyXG5cclxuICAgICAgICB0aGlzLmZvckVhY2goeCA9PiB0ZW1wLmFkZChwcmVkaWNhdGUoeCkpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRlbXA7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yRWFjaChwcmVkaWNhdGU6IChpdGVtOiBUKT0+IHZvaWQpIDogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5saXN0LmZvckVhY2goeCA9PiBwcmVkaWNhdGUoeCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvQXJyYXkoKSA6IEFycmF5PFQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0LnNsaWNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgam9pbjxUT3V0ZXIsIFRNYXRjaCwgVFJlc3VsdD4ob3V0ZXI6IElFbnVtZXJhYmxlPFRPdXRlcj4sIGNvbmRpdGlvbklubmVyOiAoaXRlbTogVCk9PiBUTWF0Y2gsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25PdXRlcjogKGl0ZW06IFRPdXRlcik9PiBUTWF0Y2gsIHNlbGVjdDogKHg6IFQsIHk6VE91dGVyKT0+IFRSZXN1bHQsIGxlZnRKb2luOiBib29sZWFuID0gZmFsc2UpIDogSUVudW1lcmFibGU8VFJlc3VsdD4ge1xyXG4gICAgICAgIGxldCByZXN1bHRMaXN0ID0gbmV3IExpc3Q8VFJlc3VsdD4oKTtcclxuXHJcbiAgICAgICAgdGhpcy5saXN0LmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgIGxldCBvdXRlckVudHJpZXMgPSBvdXRlci50b0FycmF5KCkuZmlsdGVyKHkgPT4gY29uZGl0aW9uSW5uZXIoeCkgPT09IGNvbmRpdGlvbk91dGVyKHkpKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsZWZ0Sm9pbiAmJiBvdXRlckVudHJpZXMgJiYgb3V0ZXJFbnRyaWVzLmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRMaXN0LmFkZChzZWxlY3QoeCwgbnVsbCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb3V0ZXJFbnRyaWVzLmZvckVhY2goeiA9PiByZXN1bHRMaXN0LmFkZChzZWxlY3QoeCwgeikpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHRMaXN0O1xyXG4gICAgfVxyXG5cclxuICAgIGdyb3VwQnkocHJlZGljYXRlOiAoaXRlbTogVCkgPT4gQXJyYXk8YW55PikgOiBJRW51bWVyYWJsZTxHcm91cDxUPj4ge1xyXG4gICAgICAgIGxldCBncm91cHMgPSB7fTtcclxuICAgICAgICB0aGlzLmxpc3QuZm9yRWFjaChmdW5jdGlvbiAobykge1xyXG4gICAgICAgICAgdmFyIGdyb3VwID0gSlNPTi5zdHJpbmdpZnkocHJlZGljYXRlKG8pKTtcclxuICAgICAgICAgIGdyb3Vwc1tncm91cF0gPSBncm91cHNbZ3JvdXBdIHx8IFtdO1xyXG4gICAgICAgICAgZ3JvdXBzW2dyb3VwXS5wdXNoKG8pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCBnID0gT2JqZWN0LmtleXMoZ3JvdXBzKS5tYXAoZnVuY3Rpb24gKGdyb3VwKSB7ICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgYSA9IGdyb3VwLnN1YnN0cigxLCBncm91cC5sZW5ndGggLSAyKTsgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIGxldCBncnA9IG5ldyBHcm91cDxUPihuZXcgTGlzdChhLnNwbGl0KCcsJykpLnNlbGVjdCh4ID0+IHgucmVwbGFjZSgvXihcIik/KC4qPykoXCIpPyQvaWcsIFwiJDJcIikpLnRvQXJyYXkoKSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tncm91cF0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGdycDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBMaXN0PEdyb3VwPFQ+PihnKTsgICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdE1hbnk8VFJlc3VsdD4ocHJlZGljYXRlOiAoaXRlbTogVCk9PiBBcnJheTxUUmVzdWx0PikgOiBJRW51bWVyYWJsZTxUUmVzdWx0PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5yZWR1Y2UoKG91dCwgaW54KSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtcyA9IHByZWRpY2F0ZShpbngpO1xyXG4gICAgICAgICAgICBvdXQuYWRkUmFuZ2UoaXRlbXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gb3V0O1xyXG4gICAgICAgICAgfSwgbmV3IExpc3Q8VFJlc3VsdD4obmV3IEFycmF5PFRSZXN1bHQ+KCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBvcmRlckJ5KGNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pIDogSUVudW1lcmFibGU8VD4ge1xyXG4gICAgICAgIGxldCB0ZW1wID0gdGhpcy5saXN0LnNvcnQoKHgseSkgPT4gY29tcGFyZXIuY29tcGFyZSh4LCB5KSk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgTGlzdDxUPih0ZW1wKTtcclxuICAgIH1cclxuXHJcbiAgICB1bmlvbihsaXN0OiBJRW51bWVyYWJsZTxUPikgOiBJRW51bWVyYWJsZTxUPiB7XHJcbiAgICAgICAgdGhpcy5hZGRSYW5nZShsaXN0LnRvQXJyYXkoKSk7XHJcblxyXG4gICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICByZXZlcnNlKCk6IElFbnVtZXJhYmxlPFQ+IHtcclxuICAgICAgICByZXR1cm4gbmV3IExpc3Q8VD4odGhpcy5saXN0LnNsaWNlKCkucmV2ZXJzZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXN0aW5jdChjb21wYXJlcjogSUVxdWFsaXR5Q29tcGFyZXI8VD4pIDogSUVudW1lcmFibGU8VD4ge1xyXG4gICAgICAgIGxldCB1bmlxdWVzID0gbmV3IExpc3Q8VD4oKTtcclxuICAgICAgICB0aGlzLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1bmlxdWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICghdW5pcXVlcy5hbnkoeSA9PiBjb21wYXJlci5lcXVhbHMoeCwgeSkpKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZXMuYWRkKHgpO1xyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdW5pcXVlcy5hZGQoeCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHVuaXF1ZXM7XHJcbiAgICB9XHJcblxyXG4gICAgc2tpcChubzogbnVtYmVyKSA6IElFbnVtZXJhYmxlPFQ+IHtcclxuICAgICAgICBpZiAobm8gPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdCh0aGlzLmxpc3Quc2xpY2Uobm8sIHRoaXMubGlzdC5sZW5ndGggLSAxKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHRha2Uobm86IG51bWJlcikgOiBJRW51bWVyYWJsZTxUPiB7XHJcbiAgICAgICAgaWYgKG5vID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IExpc3QodGhpcy5saXN0LnNsaWNlKDAsIG5vKSk7XHJcbiAgICAgICAgfSAgICAgICAgXHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHN1bShwcmVkaWNhdGU6IChpdGVtOiBUKT0+IG51bWJlcikgOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBzdW06IG51bWJlciA9IDA7XHJcbiAgICAgICAgdGhpcy5saXN0LmZvckVhY2goeCA9PiBzdW0gPSBzdW0gKyBwcmVkaWNhdGUoeCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gc3VtO1xyXG4gICAgfVxyXG5cclxuICAgIGF2ZyhwcmVkaWNhdGU6IChpdGVtOiBUKT0+IG51bWJlcikgOiBudW1iZXIgeyAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VtKHByZWRpY2F0ZSkgLyB0aGlzLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBtaW4ocHJlZGljYXRlOiAoaXRlbTogVCk9PiBudW1iZXIpIDogbnVtYmVyIHtcclxuICAgICAgICBsZXQgbWluOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICB0aGlzLmxpc3QuZm9yRWFjaCh4ID0+IFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGkgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgbWluID0gcHJlZGljYXRlKHgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IHByZWRpY2F0ZSh4KTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgPCBtaW4pIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW4gPSB2YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbWluO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBtYXgocHJlZGljYXRlOiAoaXRlbTogVCk9PiBudW1iZXIpIDogbnVtYmVyIHtcclxuICAgICAgICBsZXQgbWF4OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICB0aGlzLmxpc3QuZm9yRWFjaCh4ID0+IFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGkgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgbWF4ID0gcHJlZGljYXRlKHgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IHByZWRpY2F0ZSh4KTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgPiBtYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXggPSB2YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbWF4O1xyXG4gICAgfSAgICBcclxuICAgIFxyXG4gICAgY291bnQocHJlZGljYXRlOiAoaXRlbTogVCk9PiBib29sZWFuID0gbnVsbCkgOiBudW1iZXIge1xyXG4gICAgICAgIGlmICghcHJlZGljYXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjb3VudDogbnVtYmVyID0gMDtcclxuICAgICAgICB0aGlzLmxpc3QuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgaWYocHJlZGljYXRlKHgpKSB7XHJcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb3VudDtcclxuICAgIH1cclxuXHJcbn0iXX0=