UNPKG

@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

448 lines 43 kB
var _a; import { IllegalArgumentException } from '../util/exception/IllegalArgumentException'; import { IndexOutOfBoundsException } from '../util/exception/IndexOutOfBoundsException'; import { Comparator } from '../util/Comparator'; import { AbstractList } from './AbstractList'; import { ListView } from './view/ListView'; //type MutableNode<Type> = {-readonly [Property in keyof LinkedListNode<Type>]: LinkedListNode<Type>[Property]}; /** * Doubly-linked list implementation of the List and Deque interfaces. * Implements all optional list operations, and permits all elements (including null). */ export class LinkedList extends AbstractList { /** * @constructor */ constructor(collection) { super(); this.compare = Comparator.compare; this._size = 0; /** * @override */ this[_a] = "LinkedList"; this.head = null; this.tail = null; if (collection) { this.appendAll(collection); } } /** * Inserts node to the specified position in the list * @param index Ordered number of the node before which we want to insert a new node. To add node to the end of the list set `index` to the `Infinity` or to the value that great or equal to the list's `size` property. * @param newNode Inserted node * @returns _true_ if the node was inserted, else _false_ * @protected */ insertNode(index, newNode) { index = (index ?? 0) < 0 ? 0 : index; let currentNode = null; if (!(index === Infinity)) { let count = -1; currentNode = this.head; while (currentNode) { count++; if (count === index) break; else if (currentNode == this.tail) { currentNode = null; } else currentNode = currentNode.next; } } if (currentNode) { newNode.next = currentNode; newNode.prev = currentNode.prev; currentNode.prev = newNode; if (currentNode == this.head) { this.head = newNode; } } else { if (this.tail) { //newNode.next = this.tail.next; this.tail.next = newNode; newNode.prev = this.tail; this.tail = newNode; } else { this.head = this.tail = newNode; } } this._size++; this._modCount++; this.contentChanged$.next(); return true; } removeNode(node) { if (node) { if (node == this.tail) { this.tail = node.prev; } if (node == this.head) { this.head = node.next; } if (node.next) { node.next.prev = node.prev; } if (node.prev) { node.prev.next = node.next; } node.next = node.prev = null; node.value = null; this._size--; this._modCount++; this.contentChanged$.next(); return true; } return false; } /** * @override */ *[Symbol.iterator]() { let node = this.head; let nextNode; let isTail = false; while (node) { nextNode = node.next; isTail = (node == this.tail); yield node.value; if (isTail) break; else node = nextNode; } } /** * @override */ get size() { return this._size; } /** * @override */ append(value) { if (value === undefined) return false; return this.insertNode(Infinity, new LinkedListNode(value)); } /** * Clones the current collection * @returns New cloned collection */ clone() { return new LinkedList(this); } /** * Retrieves, but does not remove, the head of this queue, or returns _undefined_ if this queue is empty */ element() { return this.peekFirst(); } /** * @override */ getParent() { return null; } /** * Loads an array of the collection items * @param values - Array of values that need to be converted to linked list. */ loadArray(values) { values.forEach((value) => this.append(value)); } /** * @override */ get(index) { const node = this.getNode(index); if (node) { return node.value; } return undefined; } /** * @override * @throws IllegalArgumentException */ set(index, value) { if (value === undefined) { throw new IllegalArgumentException("Undefined value is not allowed"); } const node = this.getNode(index); if (node) { const oldVal = node.value; node.setValue(value); this.contentChanged$.next(); return oldVal; } throw new IndexOutOfBoundsException(); } /** * @override */ clear() { let node; while (this.head) { node = this.head; this.head = node.next; node.next = node.prev = null; node.value = null; } this.head = null; this.tail = null; this._size = 0; this._modCount++; this.contentChanged$.next(); } /** * @override */ contains(value) { return this.indexOf(value) >= 0; } /** * Gets the index of the first item in the collection * @param value Searched value * @param fromIndex Started index to search. Default is 0. * @returns Index number if found, else -1 */ indexOf(value, fromIndex) { let index = -1; let count = -1; fromIndex = fromIndex ?? 0; let node = this.head; while (node) { count++; if (count >= fromIndex && this.compare(node.value, value) == 0) { index = count; break; } if (node == this.tail) break; node = node.next; } return index; } /** * @override */ insert(index, value) { if (value === undefined) return false; return this.insertNode(index, new LinkedListNode(value)); } /** * Gets the index of the last item in the collection * @param value Searched value * @param fromIndex The index to search starting from the end. Default is 0. * @returns Index number if found, else -1 */ lastIndexOf(value, fromIndex) { let index = -1; let count = -1; fromIndex = fromIndex ?? 0; let node = this.tail; while (node) { count++; if (count >= fromIndex && this.compare(node.value, value) == 0) { index = count; break; } else if (node == this.head) { break; } node = node.prev; } return index; } /** * Inserts the specified element into this queue if it is possible */ offer(value) { return this.append(value); } /** * Retrieves, but does not remove, the head of this queue, or returns `undefined` if this queue is empty */ peek() { return this.peekFirst(); } /** * Retrieves and removes the head of this queue, or returns `undefined` if this queue is empty */ poll() { return this.removeFirst(); } /** * Inserts the specified element at the front of this deque * @param value * @returns */ offerFirst(value) { return this.insert(0, value); } /** * Inserts the specified element at the end of this deque * @param value * @returns */ offerLast(value) { return this.offer(value); } /** * Retrieves and removes the first element of this deque, or returns `undefined` if this deque is empty * @returns */ pollFirst() { return this.poll(); } /** * Retrieves and removes the last element of this deque, or returns `undefined` if this deque is empty * @returns */ pollLast() { return this.removeLast(); } /** * Removes a single instance of the specified element from this collection, if it is present * @param {T} value * @return {boolean} */ remove(value) { let node = this.head; while (node) { if (this.compare(node.value, value) == 0) { return this.removeNode(node); } if (node == this.tail) break; node = node.next; } return false; } /** * @override */ removeAt(index) { const node = this.getNode(index); if (node) { let oldVal = node.value; this.removeNode(node); return oldVal; } return undefined; } /** * Retrieves and removes the head of this list, or returns `undefined` if this list object is empty */ removeFirst() { return this.removeAt(0); } /** * Retrieves and removes the tail of this list, or returns `undefined` if this list object is empty */ removeLast() { if (this.tail) { const tailValue = this.tail.value; this.removeNode(this.tail); return tailValue; } return undefined; } /** * @override */ removeRange(fromIndex, toIndex = Infinity) { let nCount = 0; fromIndex = Math.max(fromIndex, 0); toIndex = Math.min(toIndex, this.size); if (fromIndex > toIndex) return false; let ind = toIndex; while (--ind >= fromIndex) { if (this.removeNode(this.getNode(ind))) { nCount++; } } return nCount > 0; } /** * Retrieves, but does not remove, the first element of this list, or returns _undefined_ if this collection is empty * @returns */ peekFirst() { if (this.head) { return this.head.value; } return undefined; } /** * Retrieves, but does not remove, the last element of this list, or returns _undefined_ if this collection is empty * @returns */ peekLast() { if (this.tail) { return this.tail.value; } return undefined; } /** * @override */ subList(fromIndex, toIndex) { return new ListView(this, fromIndex, toIndex); } getHead() { return this.head; } getTail() { return this.tail; } getNode(index) { if (index < 0 || index >= this._size) return null; let count = -1; let node = this.head; while (node) { if (++count == index) { break; } node = node.next; } return node; } /** * @returns {LinkedListNode[]} */ toArray() { const vals = []; let currentNode = this.head; while (currentNode) { vals.push(currentNode.value); if (currentNode == this.tail) break; currentNode = currentNode.next; } return vals; } } _a = Symbol.toStringTag; /** * Linked List's Node */ export class LinkedListNode { constructor(value, next = null, prev = null) { this.next = null; this.prev = null; this.value = value; this.next = next; this.prev = prev; } setValue(value) { this.value = value; } toString(callback) { return callback ? callback(this.value) : `${this.value}`; } toJSON() { return this.value; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGlua2VkTGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2N1dGUtY29yZS9zcmMvbGliL2NvbGxlY3Rpb25zL0xpbmtlZExpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSTNDLGdIQUFnSDtBQUVoSDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sVUFBYyxTQUFRLFlBQWU7SUFNaEQ7O09BRUc7SUFDSCxZQUFZLFVBQXFDO1FBQy9DLEtBQUssRUFBRSxDQUFDO1FBUEYsWUFBTyxHQUFlLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDekMsVUFBSyxHQUFXLENBQUMsQ0FBQztRQXlHMUI7O1dBRUc7UUFDSCxRQUFvQixHQUFHLFlBQVksQ0FBQztRQXJHbEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUNEOzs7Ozs7T0FNRztJQUNPLFVBQVUsQ0FBQyxLQUFhLEVBQUUsT0FBMEI7UUFDNUQsS0FBSyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFckMsSUFBSSxXQUFXLEdBQUcsSUFBSSxD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ckIsQ0FBQztJQUVELFFBQVEsQ0FBQyxRQUE0QjtRQUNuQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIH0gZnJvbSAnLi4vdXRpbC9leGNlcHRpb24vSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uJztcclxuaW1wb3J0IHsgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB9IGZyb20gJy4uL3V0aWwvZXhjZXB0aW9uL0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24nO1xyXG5pbXBvcnQgeyBDb21wYXJhdG9yIH0gZnJvbSAnLi4vdXRpbC9Db21wYXJhdG9yJztcclxuaW1wb3J0IHsgQWJzdHJhY3RMaXN0IH0gZnJvbSAnLi9BYnN0cmFjdExpc3QnO1xyXG5pbXBvcnQgeyBDb2xsZWN0aW9uLCBFbGVtZW50IH0gZnJvbSAnLi9Db2xsZWN0aW9uJztcclxuaW1wb3J0IHsgRGVxdWUgfSBmcm9tICcuL0RlcXVlJztcclxuaW1wb3J0IHsgTGlzdCB9IGZyb20gJy4vTGlzdCc7XHJcbmltcG9ydCB7IExpc3RWaWV3IH0gZnJvbSAnLi92aWV3L0xpc3RWaWV3JztcclxuaW1wb3J0IHsgQ29tcGFyZSB9IGZyb20gJy4uL3V0aWwvZnVuY3Rpb24vQ29tcGFyZSc7XHJcbmltcG9ydCB7IENsb25lYWJsZSB9IGZyb20gJy4uL3V0aWwvaW50ZXJmYWNlL0Nsb25lYWJsZSc7XHJcblxyXG4vL3R5cGUgTXV0YWJsZU5vZGU8VHlwZT4gPSB7LXJlYWRvbmx5IFtQcm9wZXJ0eSBpbiBrZXlvZiBMaW5rZWRMaXN0Tm9kZTxUeXBlPl06IExpbmtlZExpc3ROb2RlPFR5cGU+W1Byb3BlcnR5XX07XHJcblxyXG4vKipcclxuICogRG91Ymx5LWxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBMaXN0IGFuZCBEZXF1ZSBpbnRlcmZhY2VzLlxyXG4gKiBJbXBsZW1lbnRzIGFsbCBvcHRpb25hbCBsaXN0IG9wZXJhdGlvbnMsIGFuZCBwZXJtaXRzIGFsbCBlbGVtZW50cyAoaW5jbHVkaW5nIG51bGwpLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExpbmtlZExpc3Q8VD4gZXh0ZW5kcyBBYnN0cmFjdExpc3Q8VD4gaW1wbGVtZW50cyBEZXF1ZTxUPiwgQ2xvbmVhYmxlIHtcclxuICBwcml2YXRlIGhlYWQ6IExpbmtlZExpc3ROb2RlPFQ+IHwgbnVsbDtcclxuICBwcml2YXRlIHRhaWw6IExpbmtlZExpc3ROb2RlPFQ+IHwgbnVsbDtcclxuICBwcml2YXRlIGNvbXBhcmU6IENvbXBhcmU8VD4gPSBDb21wYXJhdG9yLmNvbXBhcmU7XHJcbiAgcHJpdmF0ZSBfc2l6ZTogbnVtYmVyID0gMDtcclxuXHJcbiAgLyoqXHJcbiAgICogQGNvbnN0cnVjdG9yXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoY29sbGVjdGlvbj86IENvbGxlY3Rpb248VD4gfCBBcnJheTxUPikge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuaGVhZCA9IG51bGw7XHJcbiAgICB0aGlzLnRhaWwgPSBudWxsO1xyXG4gICAgaWYgKGNvbGxlY3Rpb24pIHtcclxuICAgICAgdGhpcy5hcHBlbmRBbGwoY29sbGVjdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEluc2VydHMgbm9kZSB0byB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSBsaXN0XHJcbiAgICogQHBhcmFtIGluZGV4IE9yZGVyZWQgbnVtYmVyIG9mIHRoZSBub2RlIGJlZm9yZSB3aGljaCB3ZSB3YW50IHRvIGluc2VydCBhIG5ldyBub2RlLiBUbyBhZGQgbm9kZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IHNldCBgaW5kZXhgIHRvIHRoZSBgSW5maW5pdHlgIG9yIHRvIHRoZSB2YWx1ZSB0aGF0IGdyZWF0IG9yIGVxdWFsIHRvIHRoZSBsaXN0J3MgYHNpemVgIHByb3BlcnR5LlxyXG4gICAqIEBwYXJhbSBuZXdOb2RlIEluc2VydGVkIG5vZGVcclxuICAgKiBAcmV0dXJucyBfdHJ1ZV8gaWYgdGhlIG5vZGUgd2FzIGluc2VydGVkLCBlbHNlIF9mYWxzZV9cclxuICAgKiBAcHJvdGVjdGVkXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGluc2VydE5vZGUoaW5kZXg6IG51bWJlciwgbmV3Tm9kZTogTGlua2VkTGlzdE5vZGU8VD4pOiBib29sZWFuIHtcclxuICAgIGluZGV4ID0gKGluZGV4ID8/IDApIDwgMCA/IDAgOiBpbmRleDtcclxuXHJcbiAgICBsZXQgY3VycmVudE5vZGUgPSBudWxsO1xyXG4gICAgaWYgKCAhKGluZGV4ID09PSBJbmZpbml0eSkgKSB7XHJcbiAgICAgIGxldCBjb3VudCA9IC0xO1xyXG4gICAgICBjdXJyZW50Tm9kZSA9IHRoaXMuaGVhZDtcclxuICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XHJcbiAgICAgICAgY291bnQrKztcclxuICAgICAgICBpZiAoY291bnQgPT09IGluZGV4KVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZWxzZSBpZiAoY3VycmVudE5vZGUgPT0gdGhpcy50YWlsKSB7XHJcbiAgICAgICAgICBjdXJyZW50Tm9kZSA9IG51bGw7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjdXJyZW50Tm9kZSkge1xyXG4gICAgICBuZXdOb2RlLm5leHQgPSBjdXJyZW50Tm9kZTtcclxuICAgICAgbmV3Tm9kZS5wcmV2ID0gY3VycmVudE5vZGUucHJldjtcclxuICAgICAgY3VycmVudE5vZGUucHJldiA9IG5ld05vZGU7XHJcbiAgICAgIGlmIChjdXJyZW50Tm9kZSA9PSB0aGlzLmhlYWQpIHtcclxuICAgICAgICB0aGlzLmhlYWQgPSBuZXdOb2RlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy50YWlsKSB7XHJcbiAgICAgICAgLy9uZXdOb2RlLm5leHQgPSB0aGlzLnRhaWwubmV4dDtcclxuICAgICAgICB0aGlzLnRhaWwubmV4dCA9IG5ld05vZGU7XHJcbiAgICAgICAgbmV3Tm9kZS5wcmV2ID0gdGhpcy50YWlsO1xyXG4gICAgICAgIHRoaXMudGFpbCA9IG5ld05vZGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbmV3Tm9kZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fc2l6ZSsrO1xyXG4gICAgdGhpcy5fbW9kQ291bnQrKztcclxuICAgIHRoaXMuY29udGVudENoYW5nZWQkLm5leHQoKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlbW92ZU5vZGUobm9kZTogTGlua2VkTGlzdE5vZGU8VD58bnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKG5vZGUpIHtcclxuICAgICAgaWYgKG5vZGUgPT0gdGhpcy50YWlsKSB7XHJcbiAgICAgICAgdGhpcy50YWlsID0gbm9kZS5wcmV2O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlID09IHRoaXMuaGVhZCkge1xyXG4gICAgICAgIHRoaXMuaGVhZCA9IG5vZGUubmV4dDtcclxuICAgICAgfVxyXG4gICAgICBpZiAobm9kZS5uZXh0KSB7XHJcbiAgICAgICAgbm9kZS5uZXh0LnByZXYgPSBub2RlLnByZXY7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUucHJldikge1xyXG4gICAgICAgIG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0O1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUubmV4dCA9IG5vZGUucHJldiA9IG51bGw7XHJcbiAgICAgIG5vZGUudmFsdWUgPSBudWxsO1xyXG5cclxuICAgICAgdGhpcy5fc2l6ZS0tO1xyXG4gICAgICB0aGlzLl9tb2RDb3VudCsrO1xyXG4gICAgICB0aGlzLmNvbnRlbnRDaGFuZ2VkJC5uZXh0KCk7XHJcblxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqL1xyXG4gICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPEVsZW1lbnQ8VD4+IHtcclxuICAgIGxldCBub2RlID0gdGhpcy5oZWFkO1xyXG4gICAgbGV0IG5leHROb2RlO1xyXG4gICAgbGV0IGlzVGFpbCA9IGZhbHNlO1xyXG4gICAgd2hpbGUgKG5vZGUpIHtcclxuICAgICAgbmV4dE5vZGUgPSBub2RlLm5leHQ7XHJcbiAgICAgIGlzVGFpbCA9IChub2RlID09IHRoaXMudGFpbCk7XHJcblxyXG4gICAgICB5aWVsZCBub2RlLnZhbHVlO1xyXG5cclxuICAgICAgaWYgKGlzVGFpbClcclxuICAgICAgICBicmVhaztcclxuICAgICAgZWxzZVxyXG4gICAgICAgIG5vZGUgPSBuZXh0Tm9kZTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSBcIkxpbmtlZExpc3RcIjtcclxuICAvKipcclxuICAgKiBAb3ZlcnJpZGVcclxuICAgKi9cclxuICBvdmVycmlkZSBnZXQgc2l6ZSgpOiBudW1iZXIge3JldHVybiB0aGlzLl9zaXplfVxyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqL1xyXG4gIG92ZXJyaWRlIGFwcGVuZCh2YWx1ZTogRWxlbWVudDxUPik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0Tm9kZShJbmZpbml0eSwgbmV3IExpbmtlZExpc3ROb2RlKHZhbHVlKSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENsb25lcyB0aGUgY3VycmVudCBjb2xsZWN0aW9uXHJcbiAgICogQHJldHVybnMgTmV3IGNsb25lZCBjb2xsZWN0aW9uXHJcbiAgICovXHJcbiAgY2xvbmUoKTogTGlua2VkTGlzdDxUPiB7XHJcbiAgICByZXR1cm4gbmV3IExpbmtlZExpc3Q8VD4odGhpcyk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcywgYnV0IGRvZXMgbm90IHJlbW92ZSwgdGhlIGhlYWQgb2YgdGhpcyBxdWV1ZSwgb3IgcmV0dXJucyBfdW5kZWZpbmVkXyBpZiB0aGlzIHF1ZXVlIGlzIGVtcHR5XHJcbiAgICovXHJcbiAgZWxlbWVudCgpOiBFbGVtZW50PFQ+fHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5wZWVrRmlyc3QoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgb3ZlcnJpZGUgZ2V0UGFyZW50KCk6IExpbmtlZExpc3Q8VD4gfCBudWxsIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIExvYWRzIGFuIGFycmF5IG9mIHRoZSBjb2xsZWN0aW9uIGl0ZW1zXHJcbiAgICogQHBhcmFtIHZhbHVlcyAtIEFycmF5IG9mIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgY29udmVydGVkIHRvIGxpbmtlZCBsaXN0LlxyXG4gICAqL1xyXG4gIGxvYWRBcnJheTxFIGV4dGVuZHMgVD4odmFsdWVzOiBBcnJheTxFbGVtZW50PFQ+Pik6IHZvaWQge1xyXG4gICAgdmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB0aGlzLmFwcGVuZCh2YWx1ZSkpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBAb3ZlcnJpZGVcclxuICAgKi9cclxuICBvdmVycmlkZSBnZXQoaW5kZXg6IG51bWJlcik6IEVsZW1lbnQ8VD4gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZShpbmRleCk7XHJcbiAgICBpZiAobm9kZSkge1xyXG4gICAgICByZXR1cm4gbm9kZS52YWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXHJcbiAgICovXHJcbiAgb3ZlcnJpZGUgc2V0KGluZGV4OiBudW1iZXIsIHZhbHVlOiBFbGVtZW50PFQ+KTogRWxlbWVudDxUPnx1bmRlZmluZWQge1xyXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVuZGVmaW5lZCB2YWx1ZSBpcyBub3QgYWxsb3dlZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlKGluZGV4KTtcclxuICAgIGlmIChub2RlKSB7XHJcbiAgICAgIGNvbnN0IG9sZFZhbCA9IG5vZGUudmFsdWU7XHJcbiAgICAgIG5vZGUuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgICB0aGlzLmNvbnRlbnRDaGFuZ2VkJC5uZXh0KCk7XHJcbiAgICAgIHJldHVybiBvbGRWYWw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgb3ZlcnJpZGUgY2xlYXIoKTogdm9pZCB7XHJcbiAgICBsZXQgbm9kZTogTGlua2VkTGlzdE5vZGU8VD47XHJcbiAgICB3aGlsZSAodGhpcy5oZWFkKSB7XHJcbiAgICAgIG5vZGUgPSB0aGlzLmhlYWQ7XHJcbiAgICAgIHRoaXMuaGVhZCA9IG5vZGUubmV4dDtcclxuICAgICAgbm9kZS5uZXh0ID0gbm9kZS5wcmV2ID0gbnVsbDtcclxuICAgICAgbm9kZS52YWx1ZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5oZWFkID0gbnVsbDtcclxuICAgIHRoaXMudGFpbCA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5fc2l6ZSA9IDA7XHJcbiAgICB0aGlzLl9tb2RDb3VudCsrO1xyXG4gICAgdGhpcy5jb250ZW50Q2hhbmdlZCQubmV4dCgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBAb3ZlcnJpZGVcclxuICAgKi9cclxuICBvdmVycmlkZSBjb250YWlucyh2YWx1ZTogRWxlbWVudDxUPik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWx1ZSkgPj0gMDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb25cclxuICAgKiBAcGFyYW0gdmFsdWUgU2VhcmNoZWQgdmFsdWVcclxuICAgKiBAcGFyYW0gZnJvbUluZGV4IFN0YXJ0ZWQgaW5kZXggdG8gc2VhcmNoLiBEZWZhdWx0IGlzIDAuXHJcbiAgICogQHJldHVybnMgSW5kZXggbnVtYmVyIGlmIGZvdW5kLCBlbHNlIC0xXHJcbiAgICovXHJcbiAgaW5kZXhPZih2YWx1ZTogRWxlbWVudDxUPiwgZnJvbUluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCBpbmRleCA9IC0xO1xyXG4gICAgbGV0IGNvdW50ID0gLTE7XHJcbiAgICBmcm9tSW5kZXggPSBmcm9tSW5kZXggPz8gMDtcclxuICAgIGxldCBub2RlOiBMaW5rZWRMaXN0Tm9kZTxUPiB8IG51bGwgPSB0aGlzLmhlYWQ7XHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICBjb3VudCsrO1xyXG4gICAgICBpZiAoY291bnQgPj0gZnJvbUluZGV4ICYmIHRoaXMuY29tcGFyZShub2RlLnZhbHVlLCB2YWx1ZSk9PTApIHtcclxuICAgICAgICBpbmRleCA9IGNvdW50O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2RlID09IHRoaXMudGFpbCkgYnJlYWs7XHJcbiAgICAgIG5vZGUgPSBub2RlLm5leHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBvdmVycmlkZVxyXG4gICAqL1xyXG4gIG92ZXJyaWRlIGluc2VydChpbmRleDogbnVtYmVyLCB2YWx1ZTogRWxlbWVudDxUPik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0Tm9kZShpbmRleCwgbmV3IExpbmtlZExpc3ROb2RlKHZhbHVlKSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb25cclxuICAgKiBAcGFyYW0gdmFsdWUgU2VhcmNoZWQgdmFsdWVcclxuICAgKiBAcGFyYW0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggc3RhcnRpbmcgZnJvbSB0aGUgZW5kLiBEZWZhdWx0IGlzIDAuXHJcbiAgICogQHJldHVybnMgSW5kZXggbnVtYmVyIGlmIGZvdW5kLCBlbHNlIC0xXHJcbiAgICovXHJcbiAgbGFzdEluZGV4T2YodmFsdWU6IEVsZW1lbnQ8VD4sIGZyb21JbmRleD86IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgaW5kZXggPSAtMTtcclxuICAgIGxldCBjb3VudCA9IC0xO1xyXG4gICAgZnJvbUluZGV4ID0gZnJvbUluZGV4ID8/IDA7XHJcbiAgICBsZXQgbm9kZTogTGlua2VkTGlzdE5vZGU8VD4gfCBudWxsID0gdGhpcy50YWlsO1xyXG4gICAgd2hpbGUgKG5vZGUpIHtcclxuICAgICAgY291bnQrKztcclxuICAgICAgaWYgKGNvdW50ID49IGZyb21JbmRleCAmJiB0aGlzLmNvbXBhcmUobm9kZS52YWx1ZSwgdmFsdWUpPT0wKSB7XHJcbiAgICAgICAgaW5kZXggPSBjb3VudDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfSBlbHNlIGlmIChub2RlID09IHRoaXMuaGVhZCkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUgPSBub2RlLnByZXY7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhpcyBxdWV1ZSBpZiBpdCBpcyBwb3NzaWJsZVxyXG4gICAqL1xyXG4gIG9mZmVyKHZhbHVlOiBFbGVtZW50PFQ+KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hcHBlbmQodmFsdWUpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMsIGJ1dCBkb2VzIG5vdCByZW1vdmUsIHRoZSBoZWFkIG9mIHRoaXMgcXVldWUsIG9yIHJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhpcyBxdWV1ZSBpcyBlbXB0eVxyXG4gICAqL1xyXG4gIHBlZWsoKTogRWxlbWVudDxUPnx1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMucGVla0ZpcnN0KCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgaGVhZCBvZiB0aGlzIHF1ZXVlLCBvciByZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoaXMgcXVldWUgaXMgZW1wdHlcclxuICAgKi9cclxuICBwb2xsKCk6IEVsZW1lbnQ8VD58dW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLnJlbW92ZUZpcnN0KCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGF0IHRoZSBmcm9udCBvZiB0aGlzIGRlcXVlXHJcbiAgICogQHBhcmFtIHZhbHVlXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBvZmZlckZpcnN0KHZhbHVlOiBFbGVtZW50PFQ+KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pbnNlcnQoMCwgdmFsdWUpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhdCB0aGUgZW5kIG9mIHRoaXMgZGVxdWVcclxuICAgKiBAcGFyYW0gdmFsdWVcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIG9mZmVyTGFzdCh2YWx1ZTogRWxlbWVudDxUPik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2ZmZXIodmFsdWUpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyBkZXF1ZSwgb3IgcmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGlzIGRlcXVlIGlzIGVtcHR5XHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwb2xsRmlyc3QoKTogRWxlbWVudDxUPnx1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMucG9sbCgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGlzIGRlcXVlLCBvciByZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoaXMgZGVxdWUgaXMgZW1wdHlcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHBvbGxMYXN0KCk6IEVsZW1lbnQ8VD58dW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLnJlbW92ZUxhc3QoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSB0aGlzIGNvbGxlY3Rpb24sIGlmIGl0IGlzIHByZXNlbnRcclxuICAgKiBAcGFyYW0ge1R9IHZhbHVlXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cclxuICByZW1vdmUodmFsdWU6IEVsZW1lbnQ8VD4pOiBib29sZWFuIHtcclxuICAgIGxldCBub2RlOiBMaW5rZWRMaXN0Tm9kZTxUPiB8IG51bGwgPSB0aGlzLmhlYWQ7XHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICBpZiAodGhpcy5jb21wYXJlKG5vZGUudmFsdWUsIHZhbHVlKT09MCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZU5vZGUobm9kZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUgPT0gdGhpcy50YWlsKSBicmVhaztcclxuICAgICAgbm9kZSA9IG5vZGUubmV4dDtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQG92ZXJyaWRlXHJcbiAgICovXHJcbiAgb3ZlcnJpZGUgcmVtb3ZlQXQoaW5kZXg6IG51bWJlcik6IEVsZW1lbnQ8VD58dW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGUoaW5kZXgpO1xyXG4gICAgaWYgKG5vZGUpIHtcclxuICAgICAgbGV0IG9sZFZhbCA9IG5vZGUudmFsdWU7XHJcbiAgICAgIHRoaXMucmVtb3ZlTm9kZShub2RlKTtcclxuICAgICAgcmV0dXJuIG9sZFZhbDtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgaGVhZCBvZiB0aGlzIGxpc3QsIG9yIHJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhpcyBsaXN0IG9iamVjdCBpcyBlbXB0eVxyXG4gICAqL1xyXG4gIHJlbW92ZUZpcnN0KCk6IEVsZW1lbnQ8VD58dW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMucmVtb3ZlQXQoMCk7IH1cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHRhaWwgb2YgdGhpcyBsaXN0LCBvciByZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoaXMgbGlzdCBvYmplY3QgaXMgZW1wdHlcclxuICAgKi9cclxuICByZW1vdmVMYXN0KCk6IEVsZW1lbnQ8VD58dW5kZWZpbmVkIHtcclxuICAgIGlmICh0aGlzLnRhaWwpIHtcclxuICAgICAgY29uc3QgdGFpbFZhbHVlID0gdGhpcy50YWlsLnZhbHVlO1xyXG4gICAgICB0aGlzLnJlbW92ZU5vZGUodGhpcy50YWlsKTtcclxuICAgICAgcmV0dXJuIHRhaWxWYWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqICBAb3ZlcnJpZGVcclxuICAgKi9cclxuICBvdmVycmlkZSByZW1vdmVSYW5nZShmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyID0gSW5maW5pdHkpOiBib29sZWFuIHtcclxuICAgIGxldCBuQ291bnQgPSAwO1xyXG4gICAgZnJvbUluZGV4ID0gTWF0aC5tYXgoZnJvbUluZGV4LCAwKTtcclxuICAgIHRvSW5kZXggPSBNYXRoLm1pbih0b0luZGV4LCB0aGlzLnNpemUpO1xyXG4gICAgaWYgKGZyb21JbmRleCA+IHRvSW5kZXgpIHJldHVybiBmYWxzZTtcclxuICAgIGxldCBpbmQgPSB0b0luZGV4O1xyXG4gICAgd2hpbGUoLS1pbmQgPj0gZnJvbUluZGV4KSB7XHJcbiAgICAgIGlmICh0aGlzLnJlbW92ZU5vZGUoIHRoaXMuZ2V0Tm9kZShpbmQpICkpIHtcclxuICAgICAgICBuQ291bnQrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5Db3VudCA+IDA7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcywgYnV0IGRvZXMgbm90IHJlbW92ZSwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyBsaXN0LCBvciByZXR1cm5zIF91bmRlZmluZWRfIGlmIHRoaXMgY29sbGVjdGlvbiBpcyBlbXB0eVxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgcGVla0ZpcnN0KCk6IEVsZW1lbnQ8VD58dW5kZWZpbmVkIHtcclxuICAgIGlmICh0aGlzLmhlYWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaGVhZC52YWx1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcywgYnV0IGRvZXMgbm90IHJlbW92ZSwgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGlzIGxpc3QsIG9yIHJldHVybnMgX3VuZGVmaW5lZF8gaWYgdGhpcyBjb2xsZWN0aW9uIGlzIGVtcHR5XHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwZWVrTGFzdCgpOiBFbGVtZW50PFQ+fHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodGhpcy50YWlsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRhaWwudmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBAb3ZlcnJpZGVcclxuICAgKi9cclxuICBvdmVycmlkZSBzdWJMaXN0KGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpOiBMaXN0PFQ+IHtcclxuICAgIHJldHVybiBuZXcgTGlzdFZpZXcodGhpcywgZnJvbUluZGV4LCB0b0luZGV4KTtcclxuICB9XHJcblxyXG4gIGdldEhlYWQoKTogUmVhZG9ubHk8TGlua2VkTGlzdE5vZGU8VD4+IHwgbnVsbCB7IHJldHVybiB0aGlzLmhlYWQgfVxyXG4gIGdldFRhaWwoKTogUmVhZG9ubHk8TGlua2VkTGlzdE5vZGU8VD4+IHwgbnVsbCB7IHJldHVybiB0aGlzLnRhaWwgfVxyXG4gIGdldE5vZGUoaW5kZXg6IG51bWJlcik6IFJlYWRvbmx5PExpbmtlZExpc3ROb2RlPFQ+PiB8IG51bGwge1xyXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9zaXplKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCBjb3VudCA9IC0xO1xyXG4gICAgbGV0IG5vZGUgPSB0aGlzLmhlYWQ7XHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICBpZiAoKytjb3VudCA9PSBpbmRleCkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUgPSBub2RlLm5leHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbm9kZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEByZXR1cm5zIHtMaW5rZWRMaXN0Tm9kZVtdfVxyXG4gICAqL1xyXG4gIHRvQXJyYXkoKTogQXJyYXk8RWxlbWVudDxUPj4gIHtcclxuICAgIGNvbnN0IHZhbHM6IEFycmF5PEVsZW1lbnQ8VD4+ID0gW107XHJcblxyXG4gICAgbGV0IGN1cnJlbnROb2RlID0gdGhpcy5oZWFkO1xyXG4gICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XHJcbiAgICAgIHZhbHMucHVzaChjdXJyZW50Tm9kZS52YWx1ZSk7XHJcbiAgICAgIGlmIChjdXJyZW50Tm9kZSA9PSB0aGlzLnRhaWwpIGJyZWFrO1xyXG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZhbHM7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuLyoqXHJcbiAqIExpbmtlZCBMaXN0J3MgTm9kZVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExpbmtlZExpc3ROb2RlPFQ+IHtcclxuICB2YWx1ZTogRWxlbWVudDxUPjtcclxuICBuZXh0OiBMaW5rZWRMaXN0Tm9kZTxUPiB8IG51bGwgPSBudWxsO1xyXG4gIHByZXY6IExpbmtlZExpc3ROb2RlPFQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZhbHVlOiBFbGVtZW50PFQ+LCBuZXh0OiBMaW5rZWRMaXN0Tm9kZTxUPiB8IG51bGwgPSBudWxsLCBwcmV2OiBMaW5rZWRMaXN0Tm9kZTxUPiB8IG51bGwgPSBudWxsKSB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLm5leHQgPSBuZXh0O1xyXG4gICAgdGhpcy5wcmV2ID0gcHJldjtcclxuICB9XHJcblxyXG4gIHNldFZhbHVlKHZhbHVlOiBFbGVtZW50PFQ+KTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZyhjYWxsYmFjazogKHY6IGFueSkgPT4gc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBjYWxsYmFjayA/IGNhbGxiYWNrKHRoaXMudmFsdWUpIDogYCR7dGhpcy52YWx1ZX1gO1xyXG4gIH1cclxuXHJcbiAgdG9KU09OKCk6IEVsZW1lbnQ8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=