ts-generic-collections-linq
Version:
TypeScript library provides strongly-typed, queryable collections.
883 lines • 57.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { List } from './list';
import { Group, objCompare, ITEM_NOT_FOUND_MSG, MULTIPLE_INSTANCES_FOUND_MSG } from './common';
import { Dictionary, KeyValuePair } from './dictionary';
/**
* @template TKey
*/
var /**
* @template TKey
*/
StringComparer = /** @class */ (function () {
function StringComparer() {
}
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
StringComparer.prototype.compare = /**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) {
/** @type {?} */
var xKey = (/** @type {?} */ ((/** @type {?} */ (x))));
/** @type {?} */
var yKey = (/** @type {?} */ ((/** @type {?} */ (y))));
if (xKey > yKey) {
return 1;
}
else if (xKey == yKey) {
return 0;
}
else {
return -1;
}
};
return StringComparer;
}());
/**
* @template TKey
*/
var /**
* @template TKey
*/
NumberComparer = /** @class */ (function () {
function NumberComparer() {
}
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
NumberComparer.prototype.compare = /**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) {
/** @type {?} */
var xKey = (/** @type {?} */ ((/** @type {?} */ (x))));
/** @type {?} */
var yKey = (/** @type {?} */ ((/** @type {?} */ (y))));
if (xKey > yKey) {
return 1;
}
else if (xKey == yKey) {
return 0;
}
else {
return -1;
}
};
return NumberComparer;
}());
/**
* @template TKey, TValue
*/
var /**
* @template TKey, TValue
*/
SortedDictionary = /** @class */ (function () {
function SortedDictionary(comparer, list) {
if (list === void 0) { list = null; }
var _this = this;
this.list = new Array();
if (list) {
this.list = list;
}
this.comparer = comparer;
if (this.list && this.list.length > 0) {
if (this.comparer) {
this.list.sort((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) { return _this.comparer.compare(x.key, y.key); }));
}
else {
/** @type {?} */
var value = this.list[0].key;
if (typeof value === "string") {
this.comparer = new StringComparer();
this.list = this.list.sort((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) { return _this.comparer.compare(x.key, y.key); }));
}
else if (typeof value === "number") {
this.comparer = new NumberComparer();
this.list = this.list.sort((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) { return _this.comparer.compare(x.key, y.key); }));
}
}
}
}
/* IList */
/* IList */
/**
* @param {?} key
* @param {?} value
* @return {?}
*/
SortedDictionary.prototype.add = /* IList */
/**
* @param {?} key
* @param {?} value
* @return {?}
*/
function (key, value) {
var _this = this;
/** @type {?} */
var pair = new KeyValuePair(key, value);
if (this.containsKey(key)) {
throw "Duplicate key. Cannot add.";
}
this.list.push(pair);
if (this.comparer) {
this.list = this.list.sort((/**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) { return _this.comparer.compare(x.key, y.key); }));
}
};
/**
* @param {?} items
* @return {?}
*/
SortedDictionary.prototype.addRange = /**
* @param {?} items
* @return {?}
*/
function (items) {
var _this = this;
items.forEach((/**
* @param {?} x
* @return {?}
*/
function (x) { return _this.add(x.key, x.value); }));
};
/**
* @param {?} index
* @return {?}
*/
SortedDictionary.prototype.removeAt = /**
* @param {?} index
* @return {?}
*/
function (index) {
this.list.splice(index, 1);
};
/**
* @return {?}
*/
SortedDictionary.prototype.clear = /**
* @return {?}
*/
function () {
this.list = new Array();
};
/**
* @param {?} predicate
* @return {?}
*/
SortedDictionary.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 {?} key
* @return {?}
*/
SortedDictionary.prototype.containsKey = /**
* @param {?} key
* @return {?}
*/
function (key) {
return this.any((/**
* @param {?} x
* @return {?}
*/
function (x) { return objCompare(x.key, key); }));
};
/**
* @param {?} value
* @return {?}
*/
SortedDictionary.prototype.containsValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
return this.any((/**
* @param {?} x
* @return {?}
*/
function (x) { return objCompare(x.value, value); }));
};
/**
* @param {?} key
* @return {?}
*/
SortedDictionary.prototype.tryGetValue = /**
* @param {?} key
* @return {?}
*/
function (key) {
/** @type {?} */
var item = this.singleOrDefault((/**
* @param {?} x
* @return {?}
*/
function (x) { return objCompare(x.key, key); }));
if (item) {
return item.value;
}
return null;
};
/* IEnumerable */
/* IEnumerable */
/**
* @return {?}
*/
SortedDictionary.prototype.asEnumerable = /* IEnumerable */
/**
* @return {?}
*/
function () {
return this;
};
Object.defineProperty(SortedDictionary.prototype, "length", {
get: /**
* @return {?}
*/
function () {
return this.list.length;
},
enumerable: true,
configurable: true
});
/**
* @param {?} index
* @return {?}
*/
SortedDictionary.prototype.elementAt = /**
* @param {?} index
* @return {?}
*/
function (index) {
try {
return this.list[index];
}
catch (e) {
return null;
}
};
/**
* @param {?=} predicate
* @return {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.prototype.last = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
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 {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.prototype.where = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
/** @type {?} */
var temp = new Dictionary();
this.list.filter((/**
* @param {?} element
* @return {?}
*/
function (element) {
if (predicate(element)) {
temp.add(element.key, element.value);
}
}));
return temp;
};
/**
* @template TResult
* @param {?} predicate
* @return {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.prototype.forEach = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
this.list.forEach((/**
* @param {?} x
* @return {?}
*/
function (x) { return predicate(x); }));
};
/**
* @return {?}
*/
SortedDictionary.prototype.toArray = /**
* @return {?}
*/
function () {
return this.list.slice();
};
/**
* @template TOuter, TMatch, TResult
* @param {?} outer
* @param {?} conditionInner
* @param {?} conditionOuter
* @param {?} select
* @param {?=} leftJoin
* @return {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.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 {?} comparer
* @return {?}
*/
SortedDictionary.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 {?} list
* @return {?}
*/
SortedDictionary.prototype.union = /**
* @param {?} list
* @return {?}
*/
function (list) {
this.addRange(list.toArray());
return this;
};
/**
* @return {?}
*/
SortedDictionary.prototype.reverse = /**
* @return {?}
*/
function () {
return new List(this.list.slice().reverse());
};
/**
* @param {?} no
* @return {?}
*/
SortedDictionary.prototype.skip = /**
* @param {?} no
* @return {?}
*/
function (no) {
if (no > 0) {
return new Dictionary(this.list.slice(no, this.list.length - 1));
}
return this;
};
/**
* @param {?} no
* @return {?}
*/
SortedDictionary.prototype.take = /**
* @param {?} no
* @return {?}
*/
function (no) {
if (no > 0) {
return new Dictionary(this.list.slice(0, no));
}
return this;
};
/**
* @param {?} predicate
* @return {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.prototype.avg = /**
* @param {?} predicate
* @return {?}
*/
function (predicate) {
return this.sum(predicate) / this.length;
};
/**
* @param {?} predicate
* @return {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.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 {?}
*/
SortedDictionary.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 SortedDictionary;
}());
/**
* @template TKey, TValue
*/
export { SortedDictionary };
if (false) {
/**
* @type {?}
* @private
*/
SortedDictionary.prototype.list;
/**
* @type {?}
* @private
*/
SortedDictionary.prototype.comparer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGVkLmRpY3Rpb25hcnkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90cy1nZW5lcmljLWNvbGxlY3Rpb25zLWxpbnEvIiwic291cmNlcyI6WyJsaWIvc29ydGVkLmRpY3Rpb25hcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDL0YsT0FBTyxFQUFlLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7QUFFckU7Ozs7SUFBQTtJQWVBLENBQUM7Ozs7OztJQWRHLGdDQUFPOzs7OztJQUFQLFVBQVEsQ0FBTyxFQUFFLENBQU87O1lBQ2hCLElBQUksR0FBRyxtQkFBQSxtQkFBQSxDQUFDLEVBQVcsRUFBVTs7WUFDN0IsSUFBSSxHQUFHLG1CQUFBLG1CQUFBLENBQUMsRUFBVyxFQUFVO1FBRWpDLElBQUksSUFBSSxHQUFHLElBQUksRUFBRTtZQUNiLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7YUFDSSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDbkIsT0FBTyxDQUFDLENBQUM7U0FDWjthQUNJO1lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNiO0lBQ0wsQ0FBQztJQUNMLHFCQUFDO0FBQUQsQ0FBQyxBQWZELElBZUM7Ozs7QUFFRDs7OztJQUFBO0lBZUEsQ0FBQzs7Ozs7O0lBZEcsZ0NBQU87Ozs7O0lBQVAsVUFBUSxDQUFPLEVBQUUsQ0FBTzs7WUFDaEIsSUFBSSxHQUFHLG1CQUFBLG1CQUFBLENBQUMsRUFBVyxFQUFVOztZQUM3QixJQUFJLEdBQUcsbUJBQUEsbUJBQUEsQ0FBQyxFQUFXLEVBQVU7UUFFakMsSUFBSSxJQUFJLEdBQUcsSUFBSSxFQUFFO1lBQ2IsT0FBTyxDQUFDLENBQUM7U0FDWjthQUNJLElBQUksSUFB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T0FBTzs7OztRQUFDLFVBQUEsQ0FBQztZQUNmLElBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNiLEtBQUssRUFBRSxDQUFDO2FBQ1g7UUFDTCxDQUFDLEVBQUMsQ0FBQztRQUVILE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDTCx1QkFBQztBQUFELENBQUMsQUEzYUQsSUEyYUM7Ozs7Ozs7Ozs7SUF6YUcsZ0NBQTBGOzs7OztJQUMxRixvQ0FBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRW51bWVyYWJsZSwgSUNvbXBhcmVyLCBJRXF1YWxpdHlDb21wYXJlciB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IExpc3QgfSBmcm9tICcuL2xpc3QnO1xyXG5pbXBvcnQgeyBHcm91cCwgb2JqQ29tcGFyZSwgSVRFTV9OT1RfRk9VTkRfTVNHLCBNVUxUSVBMRV9JTlNUQU5DRVNfRk9VTkRfTVNHIH0gZnJvbSAnLi9jb21tb24nO1xyXG5pbXBvcnQgeyBJRGljdGlvbmFyeSwgRGljdGlvbmFyeSwgS2V5VmFsdWVQYWlyIH0gZnJvbSAnLi9kaWN0aW9uYXJ5JztcclxuXHJcbmNsYXNzIFN0cmluZ0NvbXBhcmVyPFRLZXk+IGltcGxlbWVudHMgSUNvbXBhcmVyPFRLZXk+IHtcclxuICAgIGNvbXBhcmUoeDogVEtleSwgeTogVEtleSkgOiBudW1iZXIge1xyXG4gICAgICAgIHZhciB4S2V5ID0geCBhcyB1bmtub3duIGFzIHN0cmluZztcclxuICAgICAgICB2YXIgeUtleSA9IHkgYXMgdW5rbm93biBhcyBzdHJpbmc7XHJcblxyXG4gICAgICAgIGlmICh4S2V5ID4geUtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoeEtleSA9PSB5S2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBOdW1iZXJDb21wYXJlcjxUS2V5PiBpbXBsZW1lbnRzIElDb21wYXJlcjxUS2V5PiB7XHJcbiAgICBjb21wYXJlKHg6IFRLZXksIHk6IFRLZXkpIDogbnVtYmVyIHtcclxuICAgICAgICB2YXIgeEtleSA9IHggYXMgdW5rbm93biBhcyBudW1iZXI7XHJcbiAgICAgICAgdmFyIHlLZXkgPSB5IGFzIHVua25vd24gYXMgbnVtYmVyO1xyXG5cclxuICAgICAgICBpZiAoeEtleSA+IHlLZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHhLZXkgPT0geUtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9ICAgICAgIFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU29ydGVkRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+IGltcGxlbWVudHMgSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPlxyXG57XHJcbiAgICBwcml2YXRlIGxpc3Q6IEFycmF5PEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+PiA9IG5ldyBBcnJheTxLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPj4oKTtcclxuICAgIHByaXZhdGUgY29tcGFyZXI6IElDb21wYXJlcjxUS2V5PjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihjb21wYXJlcjogSUNvbXBhcmVyPFRLZXk+LCBsaXN0OiBBcnJheTxLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPj4gPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKGxpc3QpIHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ID0gbGlzdDsgICAgICAgICAgICBcclxuICAgICAgICB9ICAgICAgICBcclxuXHJcbiAgICAgICAgdGhpcy5jb21wYXJlciA9IGNvbXBhcmVyO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5saXN0ICYmIHRoaXMubGlzdC5sZW5ndGggPiAwKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFyZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdC5zb3J0KCh4LHkpID0+IHRoaXMuY29tcGFyZXIuY29tcGFyZSh4LmtleSwgeS5rZXkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMubGlzdFswXS5rZXk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBhcmVyID0gbmV3IFN0cmluZ0NvbXBhcmVyPFRLZXk+KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdCA9IHRoaXMubGlzdC5zb3J0KCh4LHkpID0+IHRoaXMuY29tcGFyZXIuY29tcGFyZSh4LmtleSwgeS5rZXkpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGFyZXIgPSBuZXcgTnVtYmVyQ29tcGFyZXI8VEtleT4oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ID0gdGhpcy5saXN0LnNvcnQoKHgseSkgPT4gdGhpcy5jb21wYXJlci5jb21wYXJlKHgua2V5LCB5LmtleSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qIElMaXN0ICovXHJcblxyXG4gICAgYWRkKGtleTogVEtleSwgdmFsdWU6IFRWYWx1ZSkgOiB2b2lkIHtcclxuICAgICAgICBsZXQgcGFpciA9IG5ldyBLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPihrZXksIHZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbnNLZXkoa2V5KSkge1xyXG4gICAgICAgICAgICB0aHJvdyBcIkR1cGxpY2F0ZSBrZXkuIENhbm5vdCBhZGQuXCJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGlzdC5wdXNoKHBhaXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb21wYXJlcikge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3QgPSB0aGlzLmxpc3Quc29ydCgoeCx5KSA9PiB0aGlzLmNvbXBhcmVyLmNvbXBhcmUoeC5rZXksIHkua2V5KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFkZFJhbmdlKGl0ZW1zOiBLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPltdKSA6IHZvaWQge1xyXG4gICAgICAgIGl0ZW1zLmZvckVhY2goeCA9PiB0aGlzLmFkZCh4LmtleSwgeC52YWx1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUF0KGluZGV4OiBudW1iZXIpIDogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5saXN0LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXIoKSA6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGlzdCA9IG5ldyBBcnJheTxLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPj4oKTtcclxuICAgIH0gICAgXHJcblxyXG4gICAgcmVtb3ZlKHByZWRpY2F0ZTogKGl0ZW06S2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4pID0+IGJvb2xlYW4pIDogdm9pZCB7XHJcbiAgICAgICAgbGV0IHRlbXAgPSBuZXcgQXJyYXk8S2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4+KCk7XHJcblxyXG4gICAgICAgIHRoaXMubGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXByZWRpY2F0ZShlbGVtZW50KSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGVtcC5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMubGlzdCA9IHRlbXA7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIGNvbnRhaW5zS2V5KGtleTogVEtleSkgOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hbnkoeCA9PiBvYmpDb21wYXJlKHgua2V5LCBrZXkpKTtcclxuICAgIH1cclxuXHJcbiAgICBjb250YWluc1ZhbHVlKHZhbHVlOiBUVmFsdWUpIDogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYW55KHggPT4gb2JqQ29tcGFyZSh4LnZhbHVlLCB2YWx1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeUdldFZhbHVlKGtleTogVEtleSkgOiBUVmFsdWUge1xyXG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5zaW5nbGVPckRlZmF1bHQoeCA9PiBvYmpDb21wYXJlKHgua2V5LCBrZXkpKTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKiBJRW51bWVyYWJsZSAqL1xyXG5cclxuICAgIGFzRW51bWVyYWJsZSgpIDogSUVudW1lcmFibGU8S2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgZWxlbWVudEF0KGluZGV4OiBudW1iZXIpIDogS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3RbaW5kZXhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIGFueShwcmVkaWNhdGU/OiAoaXRlbTogS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4pPT4gYm9vbGVhbikgOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXByZWRpY2F0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0Lmxlbmd0aCA+IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5saXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUodGhpcy5saXN0W2ldKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFsbChwcmVkaWNhdGU/OiAoaXRlbTogS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4pPT4gYm9vbGVhbikgOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXByZWRpY2F0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0Lmxlbmd0aCA+IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLmxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCFwcmVkaWNhdGUodGhpcy5saXN0W2ldKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBzaW5nbGUocHJlZGljYXRlOiAoaXRlbTogS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4pPT4gYm9vbGVhbiA9IG51bGwpIDogS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmxpc3QubGVuZ3RoIDw9IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgSVRFTV9OT1RfRk9VTkRfTVNHO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByZWRpY2F0ZSkge1xyXG4gICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuc2luZ2xlT3JEZWZhdWx0KHByZWRpY2F0ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHRocm93IElURU1fTk9UX0ZPVU5EX01TRztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RbMF07XHJcbiAgICB9XHJcblxyXG4gICAgZmlyc3QocHJlZGljYXRlOiAoaXRlbTogS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4pPT4gYm9vbGVhbiA9IG51bGwpIDogS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmxpc3QubGVuZ3RoIDw9IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgSVRFTV9OT1RfRk9VTkRfTVNHO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByZWRpY2F0ZSkge1xyXG4gICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuZmlyc3RPckRlZmF1bHQocHJlZGljYXRlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgSVRFTV9OT1RfRk9VTkRfTVNHO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdFswXTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgbGFzdChwcmVkaWNhdGU6IChpdGVtOiBLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPik9PiBib29sZWFuKSA6IEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+IHtcclxuICAgICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IElURU1fTk9UX0ZPVU5EX01TRztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcmVkaWNhdGUpIHtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmxhc3RPckRlZmF1bHQocHJlZGljYXRlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgSVRFTV9OT1RfRk9VTkRfTVNHO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RbdGhpcy5saXN0Lmxlbmd0aCAtIDFdO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBzaW5nbGVPckRlZmF1bHQocHJlZGljYXRlOiAoaXRlbTogS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4pPT4gYm9vbGVhbikgOiBLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPiB7XHJcbiAgICAgICAgbGV0IHRlbXAgPSBuZXcgQXJyYXk8S2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4+KCk7XHJcblxyXG4gICAgICAgIHRoaXMubGlzdC5maWx0ZXIoZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbWVudCkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRlbXAucHVzaChlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGVtcC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IE1VTFRJUExFX0lOU1RBTkNFU19GT1VORF9NU0c7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGVtcC5sZW5ndGggPD0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0ZW1wWzBdO1xyXG4gICAgfSAgICBcclxuXHJcbiAgICBmaXJzdE9yRGVmYXVsdChwcmVkaWNhdGU6IChpdGVtOiBLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPik9PiBib29sZWFuKSA6IEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+IHsgICAgICAgIFxyXG4gICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5saXN0W2ldO1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGl0ZW0pKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgbGFzdE9yRGVmYXVsdChwcmVkaWNhdGU6IChpdGVtOiBLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPik9PiBib29sZWFuKSA6IEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+IHtcclxuICAgICAgICBmb3IgKGxldCBpPXRoaXMubGVuZ3RoOyBpPj0wOyBpLS0pIHtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmxpc3RbaSAtIDFdO1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGl0ZW0pKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9ICAgIFxyXG5cclxuICAgIHdoZXJlKHByZWRpY2F0ZTogKGl0ZW06IEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+KT0+IGJvb2xlYW4pIDogSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiB7XHJcbiAgICAgICAgbGV0IHRlbXAgPSBuZXcgRGljdGlvbmFyeTxUS2V5LCBUVmFsdWU+KCk7XHJcblxyXG4gICAgICAgIHRoaXMubGlzdC5maWx0ZXIoZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbWVudCkpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRlbXAuYWRkKGVsZW1lbnQua2V5LCBlbGVtZW50LnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGVtcDtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3Q8VFJlc3VsdD4ocHJlZGljYXRlOiAoaXRlbTogS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4pPT4gVFJlc3VsdCkgOiBJRW51bWVyYWJsZTxUUmVzdWx0PiB7XHJcbiAgICAgICAgbGV0IHRlbXAgPSBuZXcgTGlzdDxUUmVzdWx0PigpO1xyXG5cclxuICAgICAgICB0aGlzLmZvckVhY2goeCA9PiB0ZW1wLmFkZChwcmVkaWNhdGUoeCkpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRlbXA7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yRWFjaChwcmVkaWNhdGU6IChpdGVtOiBLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPik9PiB2b2lkKSA6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGlzdC5mb3JFYWNoKHggPT4gcHJlZGljYXRlKHgpKTtcclxuICAgIH1cclxuXHJcbiAgICB0b0FycmF5KCkgOiBBcnJheTxLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3Quc2xpY2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBqb2luPFRPdXRlciwgVE1hdGNoLCBUUmVzdWx0PihvdXRlcjogSUVudW