@cute-dw/core
Version:
This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need
184 lines • 18.6 kB
JavaScript
var _a;
import { IllegalArgumentException } from "../util/exception/IllegalArgumentException";
import { AbstractSet } from "./AbstractSet";
/**
* This class implements the `Set` interface. Set objects are collections of values. You can iterate through the elements of a set in
* insertion order. A value in the `Set` may only occur once; it is unique in the Set's collection.
*/
export class HashSet extends AbstractSet {
/**
* @constructor
* @param initSet If an _iterable_ object is passed, all of its elements will be added to the new HashSet.
* If you don't specify this parameter, or its value is _null_, the new HashSet is empty.
* @throws `IllegalArgumentException` if the initial set includes a key which value is _undefined_
*/
constructor(initSet) {
super();
this[_a] = "HashSet";
if (initSet) {
let bErr = false;
if (initSet instanceof Set) {
bErr = initSet.has(undefined);
}
else {
for (const el of initSet) {
if (el === undefined) {
bErr = true;
break;
}
}
}
if (bErr) {
throw new IllegalArgumentException("Mapped argument has a key with undefined value");
}
}
this._set = new Set(initSet);
}
get size() {
return this._set.size;
}
append(key) {
if (key === undefined) {
throw new IllegalArgumentException("Key has an undefined value");
}
const oldSize = this.size;
this._set.add(key);
return oldSize != this.size;
}
/**
* Gets the copy of the current set object
* @returns A new set object with the same values as this set
*/
clone() {
return new HashSet(this._set);
}
delete(key) {
return this._set.delete(key);
}
has(key) {
return this._set.has(key);
}
*entries() {
yield* this._set.entries();
}
*keys() {
yield* this._set.keys();
}
*values() {
yield* this._set.values();
}
forEach(callbackfn, thisArg) {
this._set.forEach(callbackfn, thisArg);
}
*[Symbol.iterator]() {
yield* this._set.keys();
}
clear() {
this._set.clear();
}
contains(key) {
return this._set.has(key);
}
remove(key) {
return this.delete(key);
}
toArray() {
return [...this._set.keys()];
}
/**
* Checks if the specified set is the sub set for the current set
* @param setB Target set object to check
* @returns _true_ if the target `setB` set is the sub set of this set, _false_ otherwise
*/
isSubSet(setB) {
for (const elem of setB) {
if (!this.has(elem)) {
return false;
}
}
return true;
}
/**
* Checks if the specified set is the super set for the current set
* @param setB Target set object to check
* @returns _true_ if the target `setB` set is the super set of this set, _false_ otherwise
*/
isSuperSet(setB) {
for (const elem of this) {
if (!setB.has(elem)) {
return false;
}
}
return true;
}
/**
* Gets the common values (intersection) with another set
* @param setB Target set object for get the intersection
* @returns New set object with common values
* @see {@link retainAll}
* @see {@link union}
* @see {@link complement}
*/
intersection(setB) {
const iSet = new HashSet();
for (let key of this) {
if (setB.has(key)) {
iSet.add(key);
}
}
return iSet;
}
/**
* Combines values with another set
* @param setB Target set object for get the union
* @returns New set object with combined values
* @see {@link intersection}
* @see {@link complement}
*/
union(setB) {
const uSet = new HashSet(this);
for (let key of setB) {
if (key !== undefined) {
uSet.add(key);
}
}
return uSet;
}
/**
* Retrieves values from `this` set that are missing from another (relative complement)
* @param setB Target set object for get the relative complement
* @returns New set object of the missing values
* @see {@link intersection}
* @see {@link union}
* @see {@link symmetricDifference}
*/
complement(setB) {
const cSet = new HashSet();
for (const key of this) {
if (!setB.has(key)) {
cSet.add(key);
}
}
return cSet;
}
/**
* Extracts values that are a combination of difference values from both sides of the comparison
* @param setB Target set object for get the symmetric difference
* @returns New set object of differences
* @see {@link complement}
*/
symmetricDifference(setB) {
const diffSet = new HashSet(this);
for (const elem of setB) {
if (diffSet.has(elem)) {
diffSet.delete(elem);
}
else if (elem !== undefined) {
diffSet.add(elem);
}
}
return diffSet;
}
}
_a = Symbol.toStringTag;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGFzaFNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2N1dGUtY29yZS9zcmMvbGliL2NvbGxlY3Rpb25zL0hhc2hTZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBR3RGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLE9BQVcsU0FBUSxXQUFjO0lBRzVDOzs7OztPQUtHO0lBQ0gsWUFBWSxPQUFxQztRQUMvQyxLQUFLLEVBQUUsQ0FBQztRQWlMRCxRQUFvQixHQUFXLFNBQVMsQ0FBQztRQWhMaEQsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLElBQUksR0FBRyxLQUFLLENBQUM7WUFDakIsSUFBSSxPQUFPLFlBQVksR0FBRyxFQUFFO2dCQUMxQixJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFVLENBQUMsQ0FBQzthQUNoQztpQkFBTTtnQkFDTCxLQUFLLE1BQU0sRUFBRSxJQUFJLE9BQU8sRUFBRTtvQkFDeEIsSUFBSSxFQUFFLEtBQUssU0FBUyxFQUFFO3dCQUNwQixJQUFJLEdBQUcsSUFBSSxDQUFDO3dCQUNaLE1BQU07cUJBQ1A7aUJBQ0Y7YUFDRjtZQUNELElBQUksSUFBSSxFQUFFO2dCQUNSLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2FBQ3RGO1NBQ0Y7UUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFhLElBQUk7UUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFUSxNQUFNLENBQUMsR0FBTTtRQUNwQixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDckIsTUFBTSxJ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Li91dGlsL2V4Y2VwdGlvbi9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cIjtcclxuaW1wb3J0IHsgQ2xvbmVhYmxlIH0gZnJvbSBcIi4uL3V0aWwvaW50ZXJmYWNlL0Nsb25lYWJsZVwiO1xyXG5pbXBvcnQgeyBFbGVtZW50IH0gZnJvbSBcIi4vQ29sbGVjdGlvblwiO1xyXG5pbXBvcnQgeyBBYnN0cmFjdFNldCB9IGZyb20gXCIuL0Fic3RyYWN0U2V0XCI7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBgU2V0YCBpbnRlcmZhY2UuIFNldCBvYmplY3RzIGFyZSBjb2xsZWN0aW9ucyBvZiB2YWx1ZXMuIFlvdSBjYW4gaXRlcmF0ZSB0aHJvdWdoIHRoZSBlbGVtZW50cyBvZiBhIHNldCBpblxyXG4gKiBpbnNlcnRpb24gb3JkZXIuIEEgdmFsdWUgaW4gdGhlIGBTZXRgIG1heSBvbmx5IG9jY3VyIG9uY2U7IGl0IGlzIHVuaXF1ZSBpbiB0aGUgU2V0J3MgY29sbGVjdGlvbi5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBIYXNoU2V0PEs+IGV4dGVuZHMgQWJzdHJhY3RTZXQ8Sz4gaW1wbGVtZW50cyBDbG9uZWFibGUge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NldDogU2V0PEs+O1xyXG5cclxuICAvKipcclxuICAgKiBAY29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gaW5pdFNldCBJZiBhbiBfaXRlcmFibGVfIG9iamVjdCBpcyBwYXNzZWQsIGFsbCBvZiBpdHMgZWxlbWVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgbmV3IEhhc2hTZXQuXHJcbiAgICogICAgICAgICAgICAgICAgSWYgeW91IGRvbid0IHNwZWNpZnkgdGhpcyBwYXJhbWV0ZXIsIG9yIGl0cyB2YWx1ZSBpcyBfbnVsbF8sIHRoZSBuZXcgSGFzaFNldCBpcyBlbXB0eS5cclxuICAgKiBAdGhyb3dzIGBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25gIGlmIHRoZSBpbml0aWFsIHNldCBpbmNsdWRlcyBhIGtleSB3aGljaCB2YWx1ZSBpcyBfdW5kZWZpbmVkX1xyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKGluaXRTZXQ/OiBTZXQ8Sz4gfCBJdGVyYWJsZTxLPiB8IG51bGwpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBpZiAoaW5pdFNldCkge1xyXG4gICAgICBsZXQgYkVyciA9IGZhbHNlO1xyXG4gICAgICBpZiAoaW5pdFNldCBpbnN0YW5jZW9mIFNldCkge1xyXG4gICAgICAgIGJFcnIgPSBpbml0U2V0Lmhhcyh1bmRlZmluZWQhKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIGluaXRTZXQpIHtcclxuICAgICAgICAgIGlmIChlbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGJFcnIgPSB0cnVlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGJFcnIpIHtcclxuICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiTWFwcGVkIGFyZ3VtZW50IGhhcyBhIGtleSB3aXRoIHVuZGVmaW5lZCB2YWx1ZVwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fc2V0ID0gbmV3IFNldChpbml0U2V0KTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGdldCBzaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2V0LnNpemU7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBhcHBlbmQoa2V5OiBLKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIktleSBoYXMgYW4gdW5kZWZpbmVkIHZhbHVlXCIpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgb2xkU2l6ZSA9IHRoaXMuc2l6ZTtcclxuICAgIHRoaXMuX3NldC5hZGQoa2V5KTtcclxuICAgIHJldHVybiBvbGRTaXplICE9IHRoaXMuc2l6ZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgY29weSBvZiB0aGUgY3VycmVudCBzZXQgb2JqZWN0XHJcbiAgICogQHJldHVybnMgQSBuZXcgc2V0IG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGlzIHNldFxyXG4gICAqL1xyXG4gIGNsb25lKCk6IEhhc2hTZXQ8Sz4ge1xyXG4gICAgcmV0dXJuIG5ldyBIYXNoU2V0PEs+KHRoaXMuX3NldCk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBkZWxldGUoa2V5OiBLKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2V0LmRlbGV0ZShrZXkpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgaGFzKGtleTogSyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoa2V5KTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlICplbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W0ssIEtdPiB7XHJcbiAgICB5aWVsZCogdGhpcy5fc2V0LmVudHJpZXMoKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlICprZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Sz4ge1xyXG4gICAgeWllbGQqIHRoaXMuX3NldC5rZXlzKCk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSAqdmFsdWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8Sz4ge1xyXG4gICAgeWllbGQqIHRoaXMuX3NldC52YWx1ZXMoKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGZvckVhY2goY2FsbGJhY2tmbjogKHZhbHVlOiBLLCB2YWx1ZTI6IEssIHNldDogU2V0PEs+KSA9PiB2b2lkLCB0aGlzQXJnPzogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXQuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPEs+IHtcclxuICAgIHlpZWxkKiB0aGlzLl9zZXQua2V5cygpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZXQuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGNvbnRhaW5zKGtleTogSyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoa2V5KTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHJlbW92ZShrZXk6IEspOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmRlbGV0ZShrZXkpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgdG9BcnJheSgpOiBFbGVtZW50PEs+W10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLl9zZXQua2V5cygpXTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgc2V0IGlzIHRoZSBzdWIgc2V0IGZvciB0aGUgY3VycmVudCBzZXRcclxuICAgKiBAcGFyYW0gc2V0QiBUYXJnZXQgc2V0IG9iamVjdCB0byBjaGVja1xyXG4gICAqIEByZXR1cm5zIF90cnVlXyBpZiB0aGUgdGFyZ2V0IGBzZXRCYCBzZXQgaXMgdGhlIHN1YiBzZXQgb2YgdGhpcyBzZXQsIF9mYWxzZV8gb3RoZXJ3aXNlXHJcbiAgICovXHJcbiAgaXNTdWJTZXQoc2V0QjogU2V0PEs+KTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGVsZW0gb2Ygc2V0Qikge1xyXG4gICAgICBpZiAoIXRoaXMuaGFzKGVsZW0pKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgc2V0IGlzIHRoZSBzdXBlciBzZXQgZm9yIHRoZSBjdXJyZW50IHNldFxyXG4gICAqIEBwYXJhbSBzZXRCIFRhcmdldCBzZXQgb2JqZWN0IHRvIGNoZWNrXHJcbiAgICogQHJldHVybnMgX3RydWVfIGlmIHRoZSB0YXJnZXQgYHNldEJgIHNldCBpcyB0aGUgc3VwZXIgc2V0IG9mIHRoaXMgc2V0LCBfZmFsc2VfIG90aGVyd2lzZVxyXG4gICAqL1xyXG4gIGlzU3VwZXJTZXQoc2V0QjogU2V0PEs+KTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGVsZW0gb2YgdGhpcykge1xyXG4gICAgICBpZiAoIXNldEIuaGFzKGVsZW0pKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgY29tbW9uIHZhbHVlcyAoaW50ZXJzZWN0aW9uKSB3aXRoIGFub3RoZXIgc2V0XHJcbiAgICogQHBhcmFtIHNldEIgVGFyZ2V0IHNldCBvYmplY3QgZm9yIGdldCB0aGUgaW50ZXJzZWN0aW9uXHJcbiAgICogQHJldHVybnMgTmV3IHNldCBvYmplY3Qgd2l0aCBjb21tb24gdmFsdWVzXHJcbiAgICogQHNlZSB7QGxpbmsgcmV0YWluQWxsfVxyXG4gICAqIEBzZWUge0BsaW5rIHVuaW9ufVxyXG4gICAqIEBzZWUge0BsaW5rIGNvbXBsZW1lbnR9XHJcbiAgICovXHJcbiAgaW50ZXJzZWN0aW9uKHNldEI6IFNldDxLPik6IEhhc2hTZXQ8Sz4ge1xyXG4gICAgY29uc3QgaVNldCA9IG5ldyBIYXNoU2V0PEs+KCk7XHJcbiAgICBmb3IgKGxldCBrZXkgb2YgdGhpcykge1xyXG4gICAgICBpZiAoc2V0Qi5oYXMoa2V5KSkge1xyXG4gICAgICAgIGlTZXQuYWRkKGtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpU2V0O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb21iaW5lcyB2YWx1ZXMgd2l0aCBhbm90aGVyIHNldFxyXG4gICAqIEBwYXJhbSBzZXRCIFRhcmdldCBzZXQgb2JqZWN0IGZvciBnZXQgdGhlIHVuaW9uXHJcbiAgICogQHJldHVybnMgTmV3IHNldCBvYmplY3Qgd2l0aCBjb21iaW5lZCB2YWx1ZXNcclxuICAgKiBAc2VlIHtAbGluayBpbnRlcnNlY3Rpb259XHJcbiAgICogQHNlZSB7QGxpbmsgY29tcGxlbWVudH1cclxuICAgKi9cclxuICB1bmlvbihzZXRCOiBTZXQ8Sz4pOiBIYXNoU2V0PEs+IHtcclxuICAgIGNvbnN0IHVTZXQgPSBuZXcgSGFzaFNldDxLPih0aGlzKTtcclxuICAgIGZvciAobGV0IGtleSBvZiBzZXRCKSB7XHJcbiAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHVTZXQuYWRkKGtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB1U2V0O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgdmFsdWVzIGZyb20gYHRoaXNgIHNldCB0aGF0IGFyZSBtaXNzaW5nIGZyb20gYW5vdGhlciAocmVsYXRpdmUgY29tcGxlbWVudClcclxuICAgKiBAcGFyYW0gc2V0QiBUYXJnZXQgc2V0IG9iamVjdCBmb3IgZ2V0IHRoZSByZWxhdGl2ZSBjb21wbGVtZW50XHJcbiAgICogQHJldHVybnMgTmV3IHNldCBvYmplY3Qgb2YgdGhlIG1pc3NpbmcgdmFsdWVzXHJcbiAgICogQHNlZSB7QGxpbmsgaW50ZXJzZWN0aW9ufVxyXG4gICAqIEBzZWUge0BsaW5rIHVuaW9ufVxyXG4gICAqIEBzZWUge0BsaW5rIHN5bW1ldHJpY0RpZmZlcmVuY2V9XHJcbiAgICovXHJcbiAgY29tcGxlbWVudChzZXRCOiBTZXQ8Sz4pOiBIYXNoU2V0PEs+IHtcclxuICAgIGNvbnN0IGNTZXQgPSBuZXcgSGFzaFNldDxLPigpO1xyXG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcykge1xyXG4gICAgICBpZiAoICFzZXRCLmhhcyhrZXkpICkge1xyXG4gICAgICAgIGNTZXQuYWRkKGtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjU2V0O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBFeHRyYWN0cyB2YWx1ZXMgdGhhdCBhcmUgYSBjb21iaW5hdGlvbiBvZiBkaWZmZXJlbmNlIHZhbHVlcyBmcm9tIGJvdGggc2lkZXMgb2YgdGhlIGNvbXBhcmlzb25cclxuICAgKiBAcGFyYW0gc2V0QiBUYXJnZXQgc2V0IG9iamVjdCBmb3IgZ2V0IHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZVxyXG4gICAqIEByZXR1cm5zIE5ldyBzZXQgb2JqZWN0IG9mIGRpZmZlcmVuY2VzXHJcbiAgICogQHNlZSB7QGxpbmsgY29tcGxlbWVudH1cclxuICAgKi9cclxuICBzeW1tZXRyaWNEaWZmZXJlbmNlKHNldEI6IFNldDxLPik6IEhhc2hTZXQ8Sz4ge1xyXG4gICAgY29uc3QgZGlmZlNldCA9IG5ldyBIYXNoU2V0PEs+KHRoaXMpO1xyXG4gICAgZm9yIChjb25zdCBlbGVtIG9mIHNldEIpIHtcclxuICAgICAgaWYgKGRpZmZTZXQuaGFzKGVsZW0pKSB7XHJcbiAgICAgICAgZGlmZlNldC5kZWxldGUoZWxlbSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZWxlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZGlmZlNldC5hZGQoZWxlbSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkaWZmU2V0O1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZyA9IFwiSGFzaFNldFwiO1xyXG5cclxufVxyXG4iXX0=