@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
182 lines • 22.8 kB
JavaScript
var _a;
import { UnsupportedOperationException } from "../util/exception/UnsupportedOperationException";
import { IndexOutOfBoundsException } from "../util/exception/IndexOutOfBoundsException";
import { AbstractList } from "./AbstractList";
import { ListView } from "./view/ListView";
import { Objects } from "../util/Objects";
/**
* Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, including null.
* In addition to implementing the List interface, this class provides methods to manipulate the size of the array that is used internally to store the list.
*/
export class ArrayList extends AbstractList {
/**
* Constructs an empty list with the specified initial capacity (as number), or
* constructs a list containing the elements of the specified collection, in the order
* they are returned by the collection's iterator
* @param capacityOrCollection
*/
constructor(capacityOrCollection) {
super();
this._elems = [];
this._size = 0;
this[_a] = "ArrayList";
capacityOrCollection = capacityOrCollection ?? 10;
if (Objects.isNumber(capacityOrCollection)) {
this._elems = new Array(Math.max(capacityOrCollection, 0)).fill(null);
}
else {
const collection = capacityOrCollection;
this._elems = new Array(Math.max(collection.length, 0)).fill(null);
this.appendAll(collection);
this._modCount = 0;
}
}
_checkRange(index) {
if (index >= 0 && index < this.length) {
// OK!
}
else
throw new IndexOutOfBoundsException(`Index '${index}' is out of range`);
}
*[Symbol.iterator]() {
for (const elem of this._elems) {
yield elem;
}
}
get size() { return this._size; }
append(value) {
this.ensureCapacity(this.length + 1); // Increments modCount!!
this._elems[this._size++] = value;
return true;
}
clear() {
this._modCount++;
this._elems.fill(null);
this._size = 0;
}
clone() {
const aList = new ArrayList(this.size);
aList.appendAll(this);
return aList;
}
contains(value) {
return this.indexOf(value) >= 0;
}
/**
* @throws IndexOutOfBoundsException
*/
get(index) {
this._checkRange(index);
return this._elems[index];
}
/**
* @throws UnsupportedOperationException
*/
getNode(index) {
throw new UnsupportedOperationException("Unsupported operation");
}
indexOf(value, fromIndex = 0) {
fromIndex = Math.max(fromIndex, 0);
const nLen = this.length;
for (let i = 0; i < nLen; i++) {
if (this._elems[i] === value) {
return i;
}
}
return -1;
}
insert(index, value) {
this._checkRange(index);
this.ensureCapacity(this.length + 1);
this._size++;
this._elems.splice(index, 0, value);
return true;
}
lastIndexOf(value, fromIndex = 0) {
fromIndex = Math.max(fromIndex, 0);
const nLen = this.length;
for (let i = nLen - 1; i >= 0; i--) {
if (this._elems[i] === value) {
return i;
}
}
return -1;
}
remove(value) {
let i = -1;
let nLen = this.length;
while (++i < nLen) {
if (this._elems[i] === value) {
this._modCount++;
this._elems.splice(i, 1);
this._elems[--this._size] = null; // Let gc do its work
return true;
}
}
return false;
}
removeAt(index) {
this._checkRange(index);
this._modCount++;
const oldValue = this._elems[index];
this._elems.splice(index, 1);
this._elems[--this._size] = null; // Let gc do its work
return oldValue;
}
removeRange(fromIndex, toIndex) {
this._checkRange(fromIndex);
toIndex = toIndex ?? this.length;
const lastIndex = Math.min(toIndex, this.length);
if (lastIndex > fromIndex) {
this._modCount++;
const oldLen = this._elems.length;
const delCount = lastIndex - fromIndex;
this._elems.splice(fromIndex, delCount);
this._size -= delCount;
this._elems.length = oldLen;
this._elems.fill(null, this._size);
return true;
}
return false;
}
set(index, value) {
this._checkRange(index);
const oldValue = this._elems[index];
this._elems[index] = value;
this._modCount++;
return oldValue;
}
subList(fromIndex, toIndex) {
return new ListView(this, fromIndex, toIndex);
}
/**
* Increases the capacity of this ArrayList instance, if necessary, to ensure that it can hold at least the number of elements specified by the minimum capacity argument
* @param minCapacity The desired minimum capacity
*/
ensureCapacity(minCapacity) {
const oldCapacity = this._elems.length;
if (minCapacity > oldCapacity) {
let newCapacity = Math.ceil((oldCapacity * 3) / 2 + 1);
if (newCapacity < minCapacity)
newCapacity = minCapacity;
this._elems.length = newCapacity;
this._elems.fill(null, this.length);
this._modCount++;
}
}
/**
* Trims the capacity of this ArrayList instance to be the list's current size
*/
trimToSize() {
const oldCap = this._elems.length;
if (this.size < oldCap) {
this._elems.length = this.size;
this._modCount++;
}
}
toArray() {
return this._elems.slice(0, this.size);
}
}
_a = Symbol.toStringTag;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJyYXlMaXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3V0ZS1jb3JlL3NyYy9saWIvY29sbGVjdGlvbnMvQXJyYXlMaXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNoRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN4RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sU0FBYSxTQUFRLFlBQWU7SUFJL0M7Ozs7O09BS0c7SUFDSCxZQUFZLG9CQUFvRDtRQUM5RCxLQUFLLEVBQUUsQ0FBQztRQVZPLFdBQU0sR0FBaUIsRUFBRSxDQUFDO1FBQ25DLFVBQUssR0FBVyxDQUFDLENBQUM7UUFrQ2pCLFFBQW9CLEdBQUcsV0FBVyxDQUFDO1FBeEIxQyxvQkFBb0IsR0FBRyxvQkFBb0IsSUFBSSxFQUFFLENBQUM7UUFDbEQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBYSxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25GO2FBQU07WUFDTCxNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFhLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFD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Q0FBQztTQUNsQjtJQUNILENBQUM7SUFFUSxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FDRjtLQXZKVyxNQUFNLENBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIH0gZnJvbSBcIi4uL3V0aWwvZXhjZXB0aW9uL1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uXCI7XHJcbmltcG9ydCB7IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gfSBmcm9tIFwiLi4vdXRpbC9leGNlcHRpb24vSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblwiO1xyXG5pbXBvcnQgeyBBYnN0cmFjdExpc3QgfSBmcm9tIFwiLi9BYnN0cmFjdExpc3RcIjtcclxuaW1wb3J0IHsgTGlua2VkTGlzdE5vZGUgfSBmcm9tIFwiLi9MaW5rZWRMaXN0XCI7XHJcbmltcG9ydCB7IExpc3QgfSBmcm9tIFwiLi9MaXN0XCI7XHJcbmltcG9ydCB7IExpc3RWaWV3IH0gZnJvbSBcIi4vdmlldy9MaXN0Vmlld1wiO1xyXG5pbXBvcnQgeyBDbG9uZWFibGUgfSBmcm9tIFwiLi4vdXRpbC9pbnRlcmZhY2UvQ2xvbmVhYmxlXCI7XHJcbmltcG9ydCB7IENvbGxlY3Rpb24sIEVsZW1lbnQgfSBmcm9tIFwiLi9Db2xsZWN0aW9uXCI7XHJcbmltcG9ydCB7IE9iamVjdHMgfSBmcm9tIFwiLi4vdXRpbC9PYmplY3RzXCI7XHJcbi8qKlxyXG4gKiBSZXNpemFibGUtYXJyYXkgaW1wbGVtZW50YXRpb24gb2YgdGhlIExpc3QgaW50ZXJmYWNlLiBJbXBsZW1lbnRzIGFsbCBvcHRpb25hbCBsaXN0IG9wZXJhdGlvbnMsIGFuZCBwZXJtaXRzIGFsbCBlbGVtZW50cywgaW5jbHVkaW5nIG51bGwuXHJcbiAqIEluIGFkZGl0aW9uIHRvIGltcGxlbWVudGluZyB0aGUgTGlzdCBpbnRlcmZhY2UsIHRoaXMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0byBtYW5pcHVsYXRlIHRoZSBzaXplIG9mIHRoZSBhcnJheSB0aGF0IGlzIHVzZWQgaW50ZXJuYWxseSB0byBzdG9yZSB0aGUgbGlzdC5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBBcnJheUxpc3Q8VD4gZXh0ZW5kcyBBYnN0cmFjdExpc3Q8VD4gaW1wbGVtZW50cyBDbG9uZWFibGUge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1zOiBFbGVtZW50PFQ+W10gPSBbXTtcclxuICBwcml2YXRlIF9zaXplOiBudW1iZXIgPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IGxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgKGFzIG51bWJlciksIG9yXHJcbiAgICogY29uc3RydWN0cyBhIGxpc3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLCBpbiB0aGUgb3JkZXJcclxuICAgKiB0aGV5IGFyZSByZXR1cm5lZCBieSB0aGUgY29sbGVjdGlvbidzIGl0ZXJhdG9yXHJcbiAgICogQHBhcmFtIGNhcGFjaXR5T3JDb2xsZWN0aW9uXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoY2FwYWNpdHlPckNvbGxlY3Rpb24/OiBDb2xsZWN0aW9uPFQ+fEFycmF5PFQ+fG51bWJlcikge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIGNhcGFjaXR5T3JDb2xsZWN0aW9uID0gY2FwYWNpdHlPckNvbGxlY3Rpb24gPz8gMTA7XHJcbiAgICBpZiAoT2JqZWN0cy5pc051bWJlcihjYXBhY2l0eU9yQ29sbGVjdGlvbikpIHtcclxuICAgICAgdGhpcy5fZWxlbXMgPSBuZXcgQXJyYXk8RWxlbWVudDxUPj4oTWF0aC5tYXgoY2FwYWNpdHlPckNvbGxlY3Rpb24sIDApKS5maWxsKG51bGwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IGNhcGFjaXR5T3JDb2xsZWN0aW9uO1xyXG4gICAgICB0aGlzLl9lbGVtcyA9IG5ldyBBcnJheTxFbGVtZW50PFQ+PihNYXRoLm1heChjb2xsZWN0aW9uLmxlbmd0aCwgMCkpLmZpbGwobnVsbCk7XHJcbiAgICAgIHRoaXMuYXBwZW5kQWxsKGNvbGxlY3Rpb24pO1xyXG4gICAgICB0aGlzLl9tb2RDb3VudCA9IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jaGVja1JhbmdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5sZW5ndGgpIHtcclxuICAgICAgLy8gT0shXHJcbiAgICB9IGVsc2VcclxuICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oYEluZGV4ICcke2luZGV4fScgaXMgb3V0IG9mIHJhbmdlYClcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPEVsZW1lbnQ8VD4+IHtcclxuICAgIGZvciAoY29uc3QgZWxlbSBvZiB0aGlzLl9lbGVtcykge1xyXG4gICAgICB5aWVsZCBlbGVtO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSBcIkFycmF5TGlzdFwiO1xyXG5cclxuICBvdmVycmlkZSBnZXQgc2l6ZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc2l6ZSB9XHJcblxyXG4gIG92ZXJyaWRlIGFwcGVuZCh2YWx1ZTogRWxlbWVudDxUPik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5lbnN1cmVDYXBhY2l0eSh0aGlzLmxlbmd0aCArIDEpOyAvLyBJbmNyZW1lbnRzIG1vZENvdW50ISFcclxuICAgIHRoaXMuX2VsZW1zW3RoaXMuX3NpemUrK10gPSB2YWx1ZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9tb2RDb3VudCsrO1xyXG4gICAgdGhpcy5fZWxlbXMuZmlsbChudWxsKTtcclxuICAgIHRoaXMuX3NpemUgPSAwO1xyXG4gIH1cclxuXHJcbiAgY2xvbmUoKTogQXJyYXlMaXN0PFQ+IHtcclxuICAgIGNvbnN0IGFMaXN0ID0gbmV3IEFycmF5TGlzdDxUPih0aGlzLnNpemUpO1xyXG4gICAgYUxpc3QuYXBwZW5kQWxsKHRoaXMpO1xyXG4gICAgcmV0dXJuIGFMaXN0O1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgY29udGFpbnModmFsdWU6IEVsZW1lbnQ8VD4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmluZGV4T2YodmFsdWUpID49IDA7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvblxyXG4gICAqL1xyXG4gIG92ZXJyaWRlIGdldChpbmRleDogbnVtYmVyKTogRWxlbWVudDxUPiB8IHVuZGVmaW5lZCB7XHJcbiAgICB0aGlzLl9jaGVja1JhbmdlKGluZGV4KTtcclxuICAgIHJldHVybiB0aGlzLl9lbGVtc1tpbmRleF07XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25cclxuICAgKi9cclxuICBvdmVycmlkZSBnZXROb2RlKGluZGV4OiBudW1iZXIpOiBSZWFkb25seTxMaW5rZWRMaXN0Tm9kZTxUPj4gfCBudWxsIHtcclxuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihcIlVuc3VwcG9ydGVkIG9wZXJhdGlvblwiKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGluZGV4T2YodmFsdWU6IEVsZW1lbnQ8VD4sIGZyb21JbmRleDogbnVtYmVyID0gMCk6IG51bWJlciB7XHJcbiAgICBmcm9tSW5kZXggPSBNYXRoLm1heChmcm9tSW5kZXgsIDApO1xyXG4gICAgY29uc3QgbkxlbiA9IHRoaXMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuTGVuOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuX2VsZW1zW2ldID09PSB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBpbnNlcnQoaW5kZXg6IG51bWJlciwgdmFsdWU6IEVsZW1lbnQ8VD4pOiBib29sZWFuIHtcclxuICAgIHRoaXMuX2NoZWNrUmFuZ2UoaW5kZXgpO1xyXG4gICAgdGhpcy5lbnN1cmVDYXBhY2l0eSh0aGlzLmxlbmd0aCArIDEpO1xyXG4gICAgdGhpcy5fc2l6ZSsrO1xyXG4gICAgdGhpcy5fZWxlbXMuc3BsaWNlKGluZGV4LCAwLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGxhc3RJbmRleE9mKHZhbHVlOiBFbGVtZW50PFQ+LCBmcm9tSW5kZXg6IG51bWJlciA9IDApOiBudW1iZXIge1xyXG4gICAgZnJvbUluZGV4ID0gTWF0aC5tYXgoZnJvbUluZGV4LCAwKTtcclxuICAgIGNvbnN0IG5MZW4gPSB0aGlzLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSBuTGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgaWYgKHRoaXMuX2VsZW1zW2ldID09PSB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSByZW1vdmUodmFsdWU6IEVsZW1lbnQ8VD4pOiBib29sZWFuIHtcclxuICAgIGxldCBpID0gLTE7XHJcbiAgICBsZXQgbkxlbiA9IHRoaXMubGVuZ3RoO1xyXG4gICAgd2hpbGUgKCsraSA8IG5MZW4pIHtcclxuICAgICAgaWYgKHRoaXMuX2VsZW1zW2ldID09PSB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX21vZENvdW50Kys7XHJcbiAgICAgICAgdGhpcy5fZWxlbXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1zWy0tdGhpcy5fc2l6ZV0gPSBudWxsOyAvLyBMZXQgZ2MgZG8gaXRzIHdvcmtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgcmVtb3ZlQXQoaW5kZXg6IG51bWJlcik6IEVsZW1lbnQ8VD4gfCB1bmRlZmluZWQge1xyXG4gICAgdGhpcy5fY2hlY2tSYW5nZShpbmRleCk7XHJcblxyXG4gICAgdGhpcy5fbW9kQ291bnQrKztcclxuICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fZWxlbXNbaW5kZXhdO1xyXG4gICAgdGhpcy5fZWxlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIHRoaXMuX2VsZW1zWy0tdGhpcy5fc2l6ZV0gPSBudWxsOyAvLyBMZXQgZ2MgZG8gaXRzIHdvcmtcclxuXHJcbiAgICByZXR1cm4gb2xkVmFsdWU7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSByZW1vdmVSYW5nZShmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleD86IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5fY2hlY2tSYW5nZShmcm9tSW5kZXgpO1xyXG4gICAgdG9JbmRleCA9IHRvSW5kZXggPz8gdGhpcy5sZW5ndGg7XHJcbiAgICBjb25zdCBsYXN0SW5kZXggPSBNYXRoLm1pbih0b0luZGV4LCB0aGlzLmxlbmd0aCk7XHJcbiAgICBpZiAobGFzdEluZGV4ID4gZnJvbUluZGV4KSB7XHJcbiAgICAgIHRoaXMuX21vZENvdW50Kys7XHJcbiAgICAgIGNvbnN0IG9sZExlbiA9IHRoaXMuX2VsZW1zLmxlbmd0aDtcclxuICAgICAgY29uc3QgZGVsQ291bnQgPSBsYXN0SW5kZXggLSBmcm9tSW5kZXg7XHJcbiAgICAgIHRoaXMuX2VsZW1zLnNwbGljZShmcm9tSW5kZXgsIGRlbENvdW50KTtcclxuICAgICAgdGhpcy5fc2l6ZSAtPSBkZWxDb3VudDtcclxuICAgICAgdGhpcy5fZWxlbXMubGVuZ3RoID0gb2xkTGVuO1xyXG4gICAgICB0aGlzLl9lbGVtcy5maWxsKG51bGwsIHRoaXMuX3NpemUpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHNldChpbmRleDogbnVtYmVyLCB2YWx1ZTogRWxlbWVudDxUPik6IEVsZW1lbnQ8VD4gfCB1bmRlZmluZWQge1xyXG4gICAgdGhpcy5fY2hlY2tSYW5nZShpbmRleCk7XHJcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX2VsZW1zW2luZGV4XTtcclxuICAgIHRoaXMuX2VsZW1zW2luZGV4XSA9IHZhbHVlO1xyXG4gICAgdGhpcy5fbW9kQ291bnQrKztcclxuICAgIHJldHVybiBvbGRWYWx1ZTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHN1Ykxpc3QoZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlcik6IExpc3Q8VD4ge1xyXG4gICAgcmV0dXJuIG5ldyBMaXN0Vmlldyh0aGlzLCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBJbmNyZWFzZXMgdGhlIGNhcGFjaXR5IG9mIHRoaXMgQXJyYXlMaXN0IGluc3RhbmNlLCBpZiBuZWNlc3NhcnksIHRvIGVuc3VyZSB0aGF0IGl0IGNhbiBob2xkIGF0IGxlYXN0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgc3BlY2lmaWVkIGJ5IHRoZSBtaW5pbXVtIGNhcGFjaXR5IGFyZ3VtZW50XHJcbiAgICogQHBhcmFtIG1pbkNhcGFjaXR5IFRoZSBkZXNpcmVkIG1pbmltdW0gY2FwYWNpdHlcclxuICAgKi9cclxuICBlbnN1cmVDYXBhY2l0eShtaW5DYXBhY2l0eTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBvbGRDYXBhY2l0eSA9IHRoaXMuX2VsZW1zLmxlbmd0aDtcclxuICAgIGlmIChtaW5DYXBhY2l0eSA+IG9sZENhcGFjaXR5KSB7XHJcbiAgICAgIGxldCBuZXdDYXBhY2l0eSA9IE1hdGguY2VpbCgob2xkQ2FwYWNpdHkgKiAzKSAvIDIgKyAxKTtcclxuICAgICAgaWYgKG5ld0NhcGFjaXR5IDwgbWluQ2FwYWNpdHkpXHJcbiAgICAgICAgbmV3Q2FwYWNpdHkgPSBtaW5DYXBhY2l0eTtcclxuICAgICAgdGhpcy5fZWxlbXMubGVuZ3RoID0gbmV3Q2FwYWNpdHk7XHJcbiAgICAgIHRoaXMuX2VsZW1zLmZpbGwobnVsbCwgdGhpcy5sZW5ndGgpO1xyXG4gICAgICB0aGlzLl9tb2RDb3VudCsrO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBUcmltcyB0aGUgY2FwYWNpdHkgb2YgdGhpcyBBcnJheUxpc3QgaW5zdGFuY2UgdG8gYmUgdGhlIGxpc3QncyBjdXJyZW50IHNpemVcclxuICAgKi9cclxuICB0cmltVG9TaXplKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb2xkQ2FwID0gdGhpcy5fZWxlbXMubGVuZ3RoO1xyXG4gICAgaWYgKHRoaXMuc2l6ZSA8IG9sZENhcCkge1xyXG4gICAgICB0aGlzLl9lbGVtcy5sZW5ndGggPSB0aGlzLnNpemU7XHJcbiAgICAgIHRoaXMuX21vZENvdW50Kys7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSB0b0FycmF5KCk6IEVsZW1lbnQ8VD5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZWxlbXMuc2xpY2UoMCwgdGhpcy5zaXplKTtcclxuICB9XHJcbn1cclxuIl19