@igo2/utils
Version:
208 lines • 24.2 kB
JavaScript
export const TREE_SEPERATOR = '.';
export class Tree {
config;
_data;
getChildren;
getId;
getLevel;
constructor(initialData, config) {
this.config = config;
this.getChildren = config.getChildren;
this.getId = config.getId;
this.getLevel = config.getLevel;
this._data = this.sortDeep(initialData);
}
get data() {
return this._data;
}
get flattened() {
return this.flatten([...this.data]);
}
add(...nodes) {
this.sortDeep(nodes);
this._data.unshift(...nodes);
return nodes;
}
addBefore(beforeId, ...nodes) {
this.sortDeep(nodes);
this._addBefore(beforeId, this._data, ...nodes);
}
remove(...nodes) {
return this._remove(...nodes);
}
clear() {
this._data = [];
}
exist(node) {
const id = this.getId(node);
return this.flattened.some((layer) => this.getId(layer) === id);
}
/**
* Move a node to a different position
* @param node
* @param beforeTo The position of index into the tree. If -1 move at the end
*/
moveTo(beforeTo, ...nodes) {
const clonedBeforeTo = [...beforeTo];
const lastIndex = clonedBeforeTo.pop();
const recipient = this.getAncestorAtPosition(clonedBeforeTo);
const beforeId = lastIndex === -1 || lastIndex >= recipient.length
? null
: this.getId(recipient[lastIndex]);
const nodesToMove = nodes.filter((node) => beforeId !== this.getId(node));
return this.move(beforeId, recipient, ...nodesToMove);
}
getPosition(node) {
const id = this.getId(node);
return this._getPosition(id);
}
_addBefore(beforeId, recipient = this._data, ...nodes) {
if (!beforeId) {
recipient.push(...nodes);
return nodes;
}
const beforeIndex = this.getIndex(beforeId, recipient);
recipient.splice(beforeIndex, 0, ...nodes);
return nodes;
}
_remove(...nodes) {
return nodes.reduce((acc, node) => {
const ancestor = this.getNodeAncestor(node);
if (!ancestor) {
return;
}
const index = this.getIndex(this.getId(node), ancestor);
if (index === -1) {
return;
}
ancestor.splice(index, 1);
return acc.concat(node);
}, []);
}
/**
* Move an node before an id
* @param node Node to be move
* @param recipient
* @param beforeId
*/
move(beforeId, recipient, ...nodes) {
this._remove(...nodes);
return this._addBefore(beforeId, recipient, ...nodes);
}
_getPosition(id, ancestorsIndex = [], values = this._data) {
let indexList;
values.some((value, index) => {
if (this.getId(value) === id) {
indexList = ancestorsIndex.concat(index);
return true;
}
const children = this.getChildren(value);
if (children) {
const groupIndexList = this._getPosition(id, ancestorsIndex.concat(index), children);
if (groupIndexList) {
indexList = groupIndexList;
return true;
}
}
return false;
});
return indexList;
}
getAncestorAtPosition(position) {
if (!position.length) {
return this._data;
}
const node = this.getNodeByPosition(position);
return this.getChildren(node);
}
/** Recursive */
sortDeep(data = this._data) {
data.forEach((node) => {
const children = this.getChildren(node);
if (children) {
this.sortDeep(children);
}
});
return this.sort(data);
}
sort(children) {
const sorted = children.sort((a, b) => this.getLevel(a) - this.getLevel(b));
return this.config.reverse ? sorted.reverse() : sorted;
}
/** Recursive */
_getNodeById(id, data = this._data) {
let node;
data.some((item) => {
if (this.getId(item) === id) {
node = item;
return true;
}
const children = this.getChildren(item);
if (children) {
node = this._getNodeById(id, children);
if (node) {
return true;
}
}
return false;
});
return node;
}
getNodeByPosition(indexes) {
if (indexes.length > 1) {
return indexes.reduce((previousValue, index) => {
const ancestor = previousValue
? this.getChildren(previousValue)
: this._data;
return this._getByIndex(index, ancestor);
}, null);
}
else {
return this._getByIndex(indexes[0]);
}
}
_getByIndex(index, ancestor = this._data) {
return ancestor[index];
}
getNodeAncestor(node) {
const id = this.getId(node);
return this.getAncestorById(id);
}
/** Recursive */
getAncestorById(id, data = this._data) {
let ancestor;
data.some((item) => {
if (this.getId(item) === id) {
ancestor = data;
return true;
}
const children = this.getChildren(item);
if (children) {
ancestor = this.getAncestorById(id, children);
if (ancestor) {
return true;
}
}
return false;
});
return ancestor;
}
/** Recursive */
flatten(nodes) {
return nodes.reduce((list, node) => {
const children = this.getChildren(node);
if (children) {
const flattened = this.flatten(children);
list.push(node, ...flattened);
}
else {
list.push(node);
}
return list;
}, []);
}
getIndex(id, ancestor) {
return ancestor.findIndex((node) => this.getId(node) === id);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3V0aWxzL3NyYy9saWIvdHJlZS90cmVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFFbEMsTUFBTSxPQUFPLElBQUk7SUFTTDtJQVJGLEtBQUssQ0FBTTtJQUVuQixXQUFXLENBQTBDO0lBQ3JELEtBQUssQ0FBMEI7SUFDL0IsUUFBUSxDQUEwQjtJQUVsQyxZQUNFLFdBQWdCLEVBQ1IsTUFBc0I7UUFBdEIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFFOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFFaEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFHLEtBQVU7UUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDN0IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsU0FBUyxDQUFDLFFBQTRCLEVBQUUsR0FBRyxLQUFVO1FBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsS0FB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O1lBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsRUFBRSxFQUFTLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRU8sUUFBUSxDQUFDLEVBQVUsRUFBRSxRQUFhO1FBQ3hDLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbnRlcmZhY2UgSVRyZWVDb25maWc8VD4ge1xuICBnZXRDaGlsZHJlbjogKGRhdGFOb2RlOiBUKSA9PiBUW10gfCB1bmRlZmluZWQgfCBudWxsO1xuICBnZXRJZDogKGRhdGFOb2RlOiBUKSA9PiBzdHJpbmc7XG4gIGdldExldmVsOiAoZGF0YU5vZGU6IFQpID0+IG51bWJlcjtcbiAgcmV2ZXJzZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBUUkVFX1NFUEVSQVRPUiA9ICcuJztcblxuZXhwb3J0IGNsYXNzIFRyZWU8VD4ge1xuICBwcml2YXRlIF9kYXRhOiBUW107XG5cbiAgZ2V0Q2hpbGRyZW46IChkYXRhTm9kZTogVCkgPT4gVFtdIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgZ2V0SWQ6IChkYXRhTm9kZTogVCkgPT4gc3RyaW5nO1xuICBnZXRMZXZlbDogKGRhdGFOb2RlOiBUKSA9PiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5pdGlhbERhdGE6IFRbXSxcbiAgICBwcml2YXRlIGNvbmZpZzogSVRyZWVDb25maWc8VD5cbiAgKSB7XG4gICAgdGhpcy5nZXRDaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbjtcbiAgICB0aGlzLmdldElkID0gY29uZmlnLmdldElkO1xuICAgIHRoaXMuZ2V0TGV2ZWwgPSBjb25maWcuZ2V0TGV2ZWw7XG5cbiAgICB0aGlzLl9kYXRhID0gdGhpcy5zb3J0RGVlcChpbml0aWFsRGF0YSk7XG4gIH1cblxuICBnZXQgZGF0YSgpOiByZWFkb25seSBUW10ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgZ2V0IGZsYXR0ZW5lZCgpOiByZWFkb25seSBUW10ge1xuICAgIHJldHVybiB0aGlzLmZsYXR0ZW4oWy4uLnRoaXMuZGF0YV0pO1xuICB9XG5cbiAgYWRkKC4uLm5vZGVzOiBUW10pOiBUW10ge1xuICAgIHRoaXMuc29ydERlZXAobm9kZXMpO1xuICAgIHRoaXMuX2RhdGEudW5zaGlmdCguLi5ub2Rlcyk7XG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgYWRkQmVmb3JlKGJlZm9yZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsIC4uLm5vZGVzOiBUW10pOiB2b2lkIHtcbiAgICB0aGlzLnNvcnREZWVwKG5vZGVzKTtcbiAgICB0aGlzLl9hZGRCZWZvcmUoYmVmb3JlSWQsIHRoaXMuX2RhdGEsIC4uLm5vZGVzKTtcbiAgfVxuXG4gIHJlbW92ZSguLi5ub2RlczogVFtdKTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy5fcmVtb3ZlKC4uLm5vZGVzKTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEgPSBbXTtcbiAgfVxuXG4gIGV4aXN0KG5vZGU6IFQpOiBib29sZWFuIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuZ2V0SWQobm9kZSk7XG4gICAgcmV0dXJuIHRoaXMuZmxhdHRlbmVkLnNvbWUoKGxheWVyKSA9PiB0aGlzLmdldElkKGxheWVyKSA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgYSBub2RlIHRvIGEgZGlmZmVyZW50IHBvc2l0aW9uXG4gICAqIEBwYXJhbSBub2RlXG4gICAqIEBwYXJhbSBiZWZvcmVUbyBUaGUgcG9zaXRpb24gb2YgaW5kZXggaW50byB0aGUgdHJlZS4gSWYgLTEgbW92ZSBhdCB0aGUgZW5kXG4gICAqL1xuICBtb3ZlVG8oYmVmb3JlVG86IG51bWJlcltdLCAuLi5ub2RlczogVFtdKTogVFtdIHtcbiAgICBjb25zdCBjbG9uZWRCZWZvcmVUbyA9IFsuLi5iZWZvcmVUb107XG4gICAgY29uc3QgbGFzdEluZGV4ID0gY2xvbmVkQmVmb3JlVG8ucG9wKCk7XG4gICAgY29uc3QgcmVjaXBpZW50ID0gdGhpcy5nZXRBbmNlc3RvckF0UG9zaXRpb24oY2xvbmVkQmVmb3JlVG8pO1xuICAgIGNvbnN0IGJlZm9yZUlkID1cbiAgICAgIGxhc3RJbmRleCA9PT0gLTEgfHwgbGFzdEluZGV4ID49IHJlY2lwaWVudC5sZW5ndGhcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogdGhpcy5nZXRJZChyZWNpcGllbnRbbGFzdEluZGV4XSk7XG5cbiAgICBjb25zdCBub2Rlc1RvTW92ZSA9IG5vZGVzLmZpbHRlcigobm9kZSkgPT4gYmVmb3JlSWQgIT09IHRoaXMuZ2V0SWQobm9kZSkpO1xuICAgIHJldHVybiB0aGlzLm1vdmUoYmVmb3JlSWQsIHJlY2lwaWVudCwgLi4ubm9kZXNUb01vdmUpO1xuICB9XG5cbiAgZ2V0UG9zaXRpb24obm9kZTogVCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuZ2V0SWQobm9kZSk7XG4gICAgcmV0dXJuIHRoaXMuX2dldFBvc2l0aW9uKGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZEJlZm9yZShcbiAgICBiZWZvcmVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHJlY2lwaWVudCA9IHRoaXMuX2RhdGEsXG4gICAgLi4ubm9kZXM6IFRbXVxuICApOiBUW10ge1xuICAgIGlmICghYmVmb3JlSWQpIHtcbiAgICAgIHJlY2lwaWVudC5wdXNoKC4uLm5vZGVzKTtcbiAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG5cbiAgICBjb25zdCBiZWZvcmVJbmRleCA9IHRoaXMuZ2V0SW5kZXgoYmVmb3JlSWQsIHJlY2lwaWVudCk7XG4gICAgcmVjaXBpZW50LnNwbGljZShiZWZvcmVJbmRleCwgMCwgLi4ubm9kZXMpO1xuXG4gICAgcmV0dXJuIG5vZGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlKC4uLm5vZGVzOiBUW10pOiBUW10ge1xuICAgIHJldHVybiBub2Rlcy5yZWR1Y2UoKGFjYzogVFtdLCBub2RlKSA9PiB7XG4gICAgICBjb25zdCBhbmNlc3RvciA9IHRoaXMuZ2V0Tm9kZUFuY2VzdG9yKG5vZGUpO1xuICAgICAgaWYgKCFhbmNlc3Rvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRJbmRleCh0aGlzLmdldElkKG5vZGUpLCBhbmNlc3Rvcik7XG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFuY2VzdG9yLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgIHJldHVybiBhY2MuY29uY2F0KG5vZGUpO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGFuIG5vZGUgYmVmb3JlIGFuIGlkXG4gICAqIEBwYXJhbSBub2RlIE5vZGUgdG8gYmUgbW92ZVxuICAgKiBAcGFyYW0gcmVjaXBpZW50XG4gICAqIEBwYXJhbSBiZWZvcmVJZFxuICAgKi9cbiAgcHJpdmF0ZSBtb3ZlKFxuICAgIGJlZm9yZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcmVjaXBpZW50OiBUW10sXG4gICAgLi4ubm9kZXM6IFRbXVxuICApOiBUW10ge1xuICAgIHRoaXMuX3JlbW92ZSguLi5ub2Rlcyk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZEJlZm9yZShiZWZvcmVJZCwgcmVjaXBpZW50LCAuLi5ub2Rlcyk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRQb3NpdGlvbihcbiAgICBpZDogc3RyaW5nLFxuICAgIGFuY2VzdG9yc0luZGV4OiBudW1iZXJbXSA9IFtdLFxuICAgIHZhbHVlcyA9IHRoaXMuX2RhdGFcbiAgKSB7XG4gICAgbGV0IGluZGV4TGlzdDogbnVtYmVyW107XG4gICAgdmFsdWVzLnNvbWUoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZ2V0SWQodmFsdWUpID09PSBpZCkge1xuICAgICAgICBpbmRleExpc3QgPSBhbmNlc3RvcnNJbmRleC5jb25jYXQoaW5kZXgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKHZhbHVlKTtcbiAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICBjb25zdCBncm91cEluZGV4TGlzdCA9IHRoaXMuX2dldFBvc2l0aW9uKFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIGFuY2VzdG9yc0luZGV4LmNvbmNhdChpbmRleCksXG4gICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGdyb3VwSW5kZXhMaXN0KSB7XG4gICAgICAgICAgaW5kZXhMaXN0ID0gZ3JvdXBJbmRleExpc3Q7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIHJldHVybiBpbmRleExpc3Q7XG4gIH1cblxuICBwcml2YXRlIGdldEFuY2VzdG9yQXRQb3NpdGlvbihwb3NpdGlvbjogbnVtYmVyW10pIHtcbiAgICBpZiAoIXBvc2l0aW9uLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGVCeVBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICByZXR1cm4gdGhpcy5nZXRDaGlsZHJlbihub2RlKTtcbiAgfVxuXG4gIC8qKiBSZWN1cnNpdmUgKi9cbiAgcHJpdmF0ZSBzb3J0RGVlcChkYXRhID0gdGhpcy5fZGF0YSk6IFRbXSB7XG4gICAgZGF0YS5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4obm9kZSk7XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5zb3J0RGVlcChjaGlsZHJlbik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuc29ydChkYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgc29ydChjaGlsZHJlbjogVFtdKTogVFtdIHtcbiAgICBjb25zdCBzb3J0ZWQgPSBjaGlsZHJlbi5zb3J0KChhLCBiKSA9PiB0aGlzLmdldExldmVsKGEpIC0gdGhpcy5nZXRMZXZlbChiKSk7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJldmVyc2UgPyBzb3J0ZWQucmV2ZXJzZSgpIDogc29ydGVkO1xuICB9XG5cbiAgLyoqIFJlY3Vyc2l2ZSAqL1xuICBwcml2YXRlIF9nZXROb2RlQnlJZChpZDogc3RyaW5nLCBkYXRhID0gdGhpcy5fZGF0YSk6IFQge1xuICAgIGxldCBub2RlOiBUO1xuICAgIGRhdGEuc29tZSgoaXRlbSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZ2V0SWQoaXRlbSkgPT09IGlkKSB7XG4gICAgICAgIG5vZGUgPSBpdGVtO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKGl0ZW0pO1xuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIG5vZGUgPSB0aGlzLl9nZXROb2RlQnlJZChpZCwgY2hpbGRyZW4pO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGdldE5vZGVCeVBvc2l0aW9uKGluZGV4ZXM6IG51bWJlcltdKTogVCB7XG4gICAgaWYgKGluZGV4ZXMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIGluZGV4ZXMucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBULCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBhbmNlc3RvciA9IHByZXZpb3VzVmFsdWVcbiAgICAgICAgICA/IHRoaXMuZ2V0Q2hpbGRyZW4ocHJldmlvdXNWYWx1ZSlcbiAgICAgICAgICA6IHRoaXMuX2RhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRCeUluZGV4KGluZGV4LCBhbmNlc3Rvcik7XG4gICAgICB9LCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEJ5SW5kZXgoaW5kZXhlc1swXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QnlJbmRleChpbmRleDogbnVtYmVyLCBhbmNlc3RvciA9IHRoaXMuX2RhdGEpIHtcbiAgICByZXR1cm4gYW5jZXN0b3JbaW5kZXhdO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROb2RlQW5jZXN0b3Iobm9kZTogVCk6IFRbXSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmdldElkKG5vZGUpO1xuICAgIHJldHVybiB0aGlzLmdldEFuY2VzdG9yQnlJZChpZCk7XG4gIH1cblxuICAvKiogUmVjdXJzaXZlICovXG4gIHByaXZhdGUgZ2V0QW5jZXN0b3JCeUlkKGlkOiBzdHJpbmcsIGRhdGEgPSB0aGlzLl9kYXRhKTogVFtdIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgYW5jZXN0b3I6IFRbXTtcbiAgICBkYXRhLnNvbWUoKGl0ZW0pID0+IHtcbiAgICAgIGlmICh0aGlzLmdldElkKGl0ZW0pID09PSBpZCkge1xuICAgICAgICBhbmNlc3RvciA9IGRhdGE7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oaXRlbSk7XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgYW5jZXN0b3IgPSB0aGlzLmdldEFuY2VzdG9yQnlJZChpZCwgY2hpbGRyZW4pO1xuICAgICAgICBpZiAoYW5jZXN0b3IpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFuY2VzdG9yO1xuICB9XG5cbiAgLyoqIFJlY3Vyc2l2ZSAqL1xuICBwcml2YXRlIGZsYXR0ZW4obm9kZXM6IFRbXSk6IFRbXSB7XG4gICAgcmV0dXJuIG5vZGVzLnJlZHVjZSgobGlzdCwgbm9kZSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKG5vZGUpO1xuICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGZsYXR0ZW5lZCA9IHRoaXMuZmxhdHRlbihjaGlsZHJlbik7XG4gICAgICAgIGxpc3QucHVzaChub2RlLCAuLi5mbGF0dGVuZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfSwgW10gYXMgVFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5kZXgoaWQ6IHN0cmluZywgYW5jZXN0b3I6IFRbXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFuY2VzdG9yLmZpbmRJbmRleCgobm9kZSkgPT4gdGhpcy5nZXRJZChub2RlKSA9PT0gaWQpO1xuICB9XG59XG4iXX0=