webglimpse
Version:
Webglimpse is a data visualization library for the web.
513 lines • 67.6 kB
JavaScript
/*
* Copyright (c) 2014, Metron, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import { isString, getObjectId, copyArray, hasval } from './util';
import { Notification2, Notification3 } from './notification';
function requireString(s) {
if (isString(s)) {
return s;
}
else {
throw new Error('Expected a string, but value is ' + s);
}
}
export class OrderedSet {
constructor(values = [], idFn = getObjectId, useNotifications = true) {
this._idOf = idFn;
this._valuesArray = copyArray(values);
this._ids = [];
this._indexes = {};
this._valuesMap = {};
for (let n = 0; n < this._valuesArray.length; n++) {
const value = this._valuesArray[n];
const id = requireString(this._idOf(value));
this._ids[n] = id;
this._indexes[id] = n;
this._valuesMap[id] = value;
}
if (useNotifications) {
this._valueAdded = new Notification2();
this._valueMoved = new Notification3();
this._valueRemoved = new Notification2();
}
}
get valueAdded() {
return this._valueAdded;
}
get valueMoved() {
return this._valueMoved;
}
get valueRemoved() {
return this._valueRemoved;
}
get length() {
return this._valuesArray.length;
}
get isEmpty() {
return (this._valuesArray.length === 0);
}
toArray() {
return copyArray(this._valuesArray);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedSet is undefined.
*/
every(callbackFn, thisArg) {
return this._valuesArray.every(callbackFn, thisArg);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedSet is undefined.
*/
some(callbackFn, thisArg) {
return this._valuesArray.some(callbackFn, thisArg);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedSet is undefined.
*/
forEach(callbackFn, thisArg) {
this._valuesArray.forEach(callbackFn, thisArg);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedSet is undefined.
*/
map(callbackFn, thisArg) {
return this._valuesArray.map(callbackFn, thisArg);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedSet is undefined.
*/
filter(callbackFn, thisArg) {
return this._valuesArray.filter(callbackFn, thisArg);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedSet is undefined.
*/
reduce(callbackFn, initialValue) {
return this._valuesArray.reduce(callbackFn, initialValue);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedSet is undefined.
*/
reduceRight(callbackFn, initialValue) {
return this._valuesArray.reduceRight(callbackFn, initialValue);
}
idAt(index) {
return this._ids[index];
}
valueAt(index) {
return this._valuesArray[index];
}
indexFor(id) {
return (isString(id) ? this._indexes[id] : undefined);
}
valueFor(id) {
return (isString(id) ? this._valuesMap[id] : undefined);
}
idOf(value) {
return requireString(this._idOf(value));
}
indexOf(value) {
return this._indexes[requireString(this._idOf(value))];
}
hasValue(value) {
return this.hasId(requireString(this._idOf(value)));
}
hasValues(values) {
for (let n = 0; n < values.length; n++) {
if (!this.hasValue(values[n])) {
return false;
}
}
return true;
}
hasId(id) {
return (isString(id) && hasval(this._valuesMap[id]));
}
hasIds(ids) {
for (let n = 0; n < ids.length; n++) {
if (!this.hasId(ids[n])) {
return false;
}
}
return true;
}
add(value, index, moveIfExists) {
index = (hasval(index) ? index : this._valuesArray.length);
if (!hasval(moveIfExists)) {
moveIfExists = false;
}
this._add(value, index, moveIfExists);
}
addAll(values, index, moveIfExists) {
index = (hasval(index) ? index : this._valuesArray.length);
if (!hasval(moveIfExists)) {
moveIfExists = false;
}
for (let n = 0; n < values.length; n++) {
const actualIndex = this._add(values[n], index, moveIfExists);
index = actualIndex + 1;
}
}
_add(value, newIndex, moveIfExists) {
const id = requireString(this._idOf(value));
const oldIndex = this._indexes[id];
if (!hasval(oldIndex)) {
this._ids.splice(newIndex, 0, id);
this._valuesArray.splice(newIndex, 0, value);
this._valuesMap[id] = value;
for (let n = newIndex; n < this._ids.length; n++) {
this._indexes[this._ids[n]] = n;
}
if (this._valueAdded) {
this._valueAdded.fire(value, newIndex);
}
}
else if (newIndex !== oldIndex && moveIfExists) {
this._ids.splice(oldIndex, 1);
this._valuesArray.splice(oldIndex, 1);
if (newIndex > oldIndex) {
this._ids.splice(newIndex, 0, id);
this._valuesArray.splice(newIndex, 0, value);
for (let n = oldIndex; n <= newIndex; n++) {
this._indexes[this._ids[n]] = n;
}
}
else {
this._ids.splice(newIndex, 0, id);
this._valuesArray.splice(newIndex, 0, value);
for (let n = newIndex; n <= oldIndex; n++) {
this._indexes[this._ids[n]] = n;
}
}
if (this._valueMoved) {
this._valueMoved.fire(value, oldIndex, newIndex);
}
}
else {
newIndex = oldIndex;
}
// Return the actual insertion index -- may differ from the originally
// requested index if an existing value had to be moved
return newIndex;
}
removeValue(value) {
this.removeId(requireString(this._idOf(value)));
}
removeId(id) {
if (isString(id)) {
const index = this._indexes[id];
if (hasval(index)) {
this._remove(id, index);
}
}
}
removeIndex(index) {
const id = this._ids[index];
if (isString(id)) {
this._remove(id, index);
}
}
removeAll() {
// Remove from last to first, to minimize index shifting
for (let n = this._valuesArray.length - 1; n >= 0; n--) {
const id = this._ids[n];
this._remove(id, n);
}
}
retainValues(values) {
const idsToRetain = {};
for (let n = 0; n < values.length; n++) {
const id = this._idOf(values[n]);
if (isString(id)) {
idsToRetain[id] = true;
}
}
this._retain(idsToRetain);
}
retainIds(ids) {
const idsToRetain = {};
for (let n = 0; n < ids.length; n++) {
const id = ids[n];
if (isString(id)) {
idsToRetain[id] = true;
}
}
this._retain(idsToRetain);
}
retainIndices(indices) {
const idsToRetain = {};
for (let n = 0; n < indices.length; n++) {
const id = this._ids[indices[n]];
idsToRetain[id] = true;
}
this._retain(idsToRetain);
}
_retain(ids) {
// Remove from last to first, to minimize index shifting
for (let n = this._valuesArray.length - 1; n >= 0; n--) {
const id = this._ids[n];
if (!ids.hasOwnProperty(id)) {
this._remove(id, n);
}
}
}
_remove(id, index) {
const value = this._valuesArray[index];
this._ids.splice(index, 1);
this._valuesArray.splice(index, 1);
delete this._indexes[id];
delete this._valuesMap[id];
for (let n = index; n < this._ids.length; n++) {
this._indexes[this._ids[n]] = n;
}
if (this._valueRemoved) {
this._valueRemoved.fire(value, index);
}
}
}
export class OrderedStringSet {
constructor(values = [], useNotifications = true) {
this._valuesArray = [];
this._indexes = {};
for (let n = 0; n < values.length; n++) {
const value = requireString(values[n]);
this._valuesArray[n] = value;
this._indexes[value] = n;
}
if (useNotifications) {
this._valueAdded = new Notification2();
this._valueMoved = new Notification3();
this._valueRemoved = new Notification2();
}
}
get valueAdded() {
return this._valueAdded;
}
get valueMoved() {
return this._valueMoved;
}
get valueRemoved() {
return this._valueRemoved;
}
get length() {
return this._valuesArray.length;
}
get isEmpty() {
return (this._valuesArray.length === 0);
}
toArray() {
return copyArray(this._valuesArray);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedStringSet is undefined.
*/
every(callbackFn, thisArg) {
return this._valuesArray.every(callbackFn, thisArg);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedStringSet is undefined.
*/
some(callbackFn, thisArg) {
return this._valuesArray.some(callbackFn, thisArg);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedStringSet is undefined.
*/
forEach(callbackFn, thisArg) {
this._valuesArray.forEach(callbackFn, thisArg);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedStringSet is undefined.
*/
map(callbackFn, thisArg) {
return this._valuesArray.map(callbackFn, thisArg);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedStringSet is undefined.
*/
filter(callbackFn, thisArg) {
return this._valuesArray.filter(callbackFn, thisArg);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedStringSet is undefined.
*/
reduce(callbackFn, initialValue) {
return this._valuesArray.reduce(callbackFn, initialValue);
}
/**
* The callback should not modify its array arg; if it does, the subsequent behavior
* of this OrderedStringSet is undefined.
*/
reduceRight(callbackFn, initialValue) {
return this._valuesArray.reduceRight(callbackFn, initialValue);
}
valueAt(index) {
return this._valuesArray[index];
}
indexOf(value) {
return (isString(value) ? this._indexes[value] : undefined);
}
hasValue(value) {
return (isString(value) && hasval(this._indexes[value]));
}
hasValues(values) {
for (let n = 0; n < values.length; n++) {
if (!this.hasValue(values[n])) {
return false;
}
}
return true;
}
add(value, index, moveIfExists) {
index = (hasval(index) ? index : this._valuesArray.length);
if (!hasval(moveIfExists)) {
moveIfExists = false;
}
this._add(value, index, moveIfExists);
}
addAll(values, index, moveIfExists) {
index = (hasval(index) ? index : this._valuesArray.length);
if (!hasval(moveIfExists)) {
moveIfExists = false;
}
for (let n = 0; n < values.length; n++) {
const actualIndex = this._add(values[n], index, moveIfExists);
index = actualIndex + 1;
}
}
_add(value, newIndex, moveIfExists) {
requireString(value);
const oldIndex = this._indexes[value];
if (!hasval(oldIndex)) {
this._valuesArray.splice(newIndex, 0, value);
for (let n = newIndex; n < this._valuesArray.length; n++) {
this._indexes[this._valuesArray[n]] = n;
}
if (this._valueAdded) {
this._valueAdded.fire(value, newIndex);
}
}
else if (newIndex !== oldIndex && moveIfExists) {
this._valuesArray.splice(oldIndex, 1);
if (newIndex > oldIndex) {
this._valuesArray.splice(newIndex, 0, value);
for (let n = oldIndex; n <= newIndex; n++) {
this._indexes[this._valuesArray[n]] = n;
}
}
else {
this._valuesArray.splice(newIndex, 0, value);
for (let n = newIndex; n <= oldIndex; n++) {
this._indexes[this._valuesArray[n]] = n;
}
}
if (this._valueMoved) {
this._valueMoved.fire(value, oldIndex, newIndex);
}
}
else {
newIndex = oldIndex;
}
// Return the actual insertion index -- may differ from the originally
// requested index if an existing value had to be moved
return newIndex;
}
removeValue(value) {
if (isString(value)) {
const index = this._indexes[value];
if (hasval(index)) {
this._remove(value, index);
}
}
}
removeIndex(index) {
const value = this._valuesArray[index];
if (isString(value)) {
this._remove(value, index);
}
}
removeAll() {
// Remove from last to first, to minimize index shifting
for (let n = this._valuesArray.length - 1; n >= 0; n--) {
const value = this._valuesArray[n];
this._remove(value, n);
}
}
retainValues(values) {
const valuesToRetain = {};
for (let n = 0; n < values.length; n++) {
const value = values[n];
if (isString(value)) {
valuesToRetain[value] = true;
}
}
this._retain(valuesToRetain);
}
retainIndices(indices) {
const valuesToRetain = {};
for (let n = 0; n < indices.length; n++) {
const value = this._valuesArray[indices[n]];
valuesToRetain[value] = true;
}
this._retain(valuesToRetain);
}
_retain(values) {
// Remove from last to first, to minimize index shifting
for (let n = this._valuesArray.length - 1; n >= 0; n--) {
const value = this._valuesArray[n];
if (!values.hasOwnProperty(value)) {
this._remove(value, n);
}
}
}
_remove(value, index) {
this._valuesArray.splice(index, 1);
delete this._indexes[value];
for (let n = index; n < this._valuesArray.length; n++) {
this._indexes[this._valuesArray[n]] = n;
}
if (this._valueRemoved) {
this._valueRemoved.fire(value, index);
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXJlZF9zZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd2ViZ2xpbXBzZS91dGlsL29yZGVyZWRfc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsT0FBTyxFQUF5QixRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc5RCxTQUFTLGFBQWEsQ0FBQyxDQUFTO0lBQzVCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2IsT0FBTyxDQUFDLENBQUM7S0FDWjtTQUNJO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUMzRDtBQUNMLENBQUM7QUFHRCxNQUFNLE9BQU8sVUFBVTtJQVVuQixZQUFZLFNBQWMsRUFBRSxFQUFFLE9BQXNCLFdBQVcsRUFBRSxtQkFBNEIsSUFBSTtRQUM3RixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sRUFBRSxHQUFHLGFBQWEs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LEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDekM7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIE1ldHJvbiwgSW5jLlxyXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKlxyXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxyXG4gKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XHJcbiAqXHJcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xyXG4gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cclxuICpcclxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxyXG4gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXHJcbiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxyXG4gKlxyXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xyXG4gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxyXG4gKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxyXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxyXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXHJcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXHJcbiAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xyXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XHJcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxyXG4gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxyXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xyXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICovXHJcbmltcG9ydCB7IElkRnVuY3Rpb24sIFN0cmluZ01hcCwgaXNTdHJpbmcsIGdldE9iamVjdElkLCBjb3B5QXJyYXksIGhhc3ZhbCB9IGZyb20gJy4vdXRpbCc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbjIsIE5vdGlmaWNhdGlvbjMgfSBmcm9tICcuL25vdGlmaWNhdGlvbic7XHJcbmltcG9ydCB7IGluZGV4T2YgfSBmcm9tICcuL3NvcnRlZF9hcnJheXMnO1xyXG5cclxuZnVuY3Rpb24gcmVxdWlyZVN0cmluZyhzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKGlzU3RyaW5nKHMpKSB7XHJcbiAgICAgICAgcmV0dXJuIHM7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nLCBidXQgdmFsdWUgaXMgJyArIHMpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE9yZGVyZWRTZXQ8Vj4ge1xyXG4gICAgcHJpdmF0ZSBfaWRPZjogSWRGdW5jdGlvbjxWPjtcclxuICAgIHByaXZhdGUgX2lkczogc3RyaW5nW107XHJcbiAgICBwcml2YXRlIF9pbmRleGVzOiBTdHJpbmdNYXA8bnVtYmVyPjtcclxuICAgIHByaXZhdGUgX3ZhbHVlc0FycmF5OiBWW107XHJcbiAgICBwcml2YXRlIF92YWx1ZXNNYXA6IFN0cmluZ01hcDxWPjtcclxuICAgIHByaXZhdGUgX3ZhbHVlQWRkZWQ6IE5vdGlmaWNhdGlvbjI8ViwgbnVtYmVyPjtcclxuICAgIHByaXZhdGUgX3ZhbHVlTW92ZWQ6IE5vdGlmaWNhdGlvbjM8ViwgbnVtYmVyLCBudW1iZXI+O1xyXG4gICAgcHJpdmF0ZSBfdmFsdWVSZW1vdmVkOiBOb3RpZmljYXRpb24yPFYsIG51bWJlcj47XHJcblxyXG4gICAgY29uc3RydWN0b3IodmFsdWVzOiBWW10gPSBbXSwgaWRGbjogSWRGdW5jdGlvbjxWPiA9IGdldE9iamVjdElkLCB1c2VOb3RpZmljYXRpb25zOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuX2lkT2YgPSBpZEZuO1xyXG4gICAgICAgIHRoaXMuX3ZhbHVlc0FycmF5ID0gY29weUFycmF5KHZhbHVlcyk7XHJcbiAgICAgICAgdGhpcy5faWRzID0gW107XHJcbiAgICAgICAgdGhpcy5faW5kZXhlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX3ZhbHVlc01hcCA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdGhpcy5fdmFsdWVzQXJyYXkubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXNBcnJheVtuXTtcclxuICAgICAgICAgICAgY29uc3QgaWQgPSByZXF1aXJlU3RyaW5nKHRoaXMuX2lkT2YodmFsdWUpKTtcclxuICAgICAgICAgICAgdGhpcy5faWRzW25dID0gaWQ7XHJcbiAgICAgICAgICAgIHRoaXMuX2luZGV4ZXNbaWRdID0gbjtcclxuICAgICAgICAgICAgdGhpcy5fdmFsdWVzTWFwW2lkXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodXNlTm90aWZpY2F0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZUFkZGVkID0gbmV3IE5vdGlmaWNhdGlvbjI8ViwgbnVtYmVyPigpO1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZU1vdmVkID0gbmV3IE5vdGlmaWNhdGlvbjM8ViwgbnVtYmVyLCBudW1iZXI+KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlUmVtb3ZlZCA9IG5ldyBOb3RpZmljYXRpb24yPFYsIG51bWJlcj4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZhbHVlQWRkZWQoKTogTm90aWZpY2F0aW9uMjxWLCBudW1iZXI+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVBZGRlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdmFsdWVNb3ZlZCgpOiBOb3RpZmljYXRpb24zPFYsIG51bWJlciwgbnVtYmVyPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlTW92ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZhbHVlUmVtb3ZlZCgpOiBOb3RpZmljYXRpb24yPFYsIG51bWJlcj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZVJlbW92ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNBcnJheS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLl92YWx1ZXNBcnJheS5sZW5ndGggPT09IDApO1xyXG4gICAgfVxyXG5cclxuICAgIHRvQXJyYXkoKTogVltdIHtcclxuICAgICAgICByZXR1cm4gY29weUFycmF5KHRoaXMuX3ZhbHVlc0FycmF5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjYWxsYmFjayBzaG91bGQgbm90IG1vZGlmeSBpdHMgYXJyYXkgYXJnOyBpZiBpdCBkb2VzLCB0aGUgc3Vic2VxdWVudCBiZWhhdmlvclxyXG4gICAgICogb2YgdGhpcyBPcmRlcmVkU2V0IGlzIHVuZGVmaW5lZC5cclxuICAgICAqL1xyXG4gICAgZXZlcnkoY2FsbGJhY2tGbjogKHZhbHVlOiBWLCBpbmRleDogbnVtYmVyLCBhcnJheTogVltdKSA9PiBib29sZWFuLCB0aGlzQXJnPzogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc0FycmF5LmV2ZXJ5KGNhbGxiYWNrRm4sIHRoaXNBcmcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBub3QgbW9kaWZ5IGl0cyBhcnJheSBhcmc7IGlmIGl0IGRvZXMsIHRoZSBzdWJzZXF1ZW50IGJlaGF2aW9yXHJcbiAgICAgKiBvZiB0aGlzIE9yZGVyZWRTZXQgaXMgdW5kZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBzb21lKGNhbGxiYWNrRm46ICh2YWx1ZTogViwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFZbXSkgPT4gYm9vbGVhbiwgdGhpc0FyZz86IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNBcnJheS5zb21lKGNhbGxiYWNrRm4sIHRoaXNBcmcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBub3QgbW9kaWZ5IGl0cyBhcnJheSBhcmc7IGlmIGl0IGRvZXMsIHRoZSBzdWJzZXF1ZW50IGJlaGF2aW9yXHJcbiAgICAgKiBvZiB0aGlzIE9yZGVyZWRTZXQgaXMgdW5kZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICBmb3JFYWNoKGNhbGxiYWNrRm46ICh2YWx1ZTogViwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFZbXSkgPT4gdm9pZCwgdGhpc0FyZz86IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3ZhbHVlc0FycmF5LmZvckVhY2goY2FsbGJhY2tGbiwgdGhpc0FyZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIG5vdCBtb2RpZnkgaXRzIGFycmF5IGFyZzsgaWYgaXQgZG9lcywgdGhlIHN1YnNlcXVlbnQgYmVoYXZpb3JcclxuICAgICAqIG9mIHRoaXMgT3JkZXJlZFNldCBpcyB1bmRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIG1hcDxVPihjYWxsYmFja0ZuOiAodmFsdWU6IFYsIGluZGV4OiBudW1iZXIsIGFycmF5OiBWW10pID0+IFUsIHRoaXNBcmc/OiBhbnkpOiBVW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNBcnJheS5tYXAoY2FsbGJhY2tGbiwgdGhpc0FyZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIG5vdCBtb2RpZnkgaXRzIGFycmF5IGFyZzsgaWYgaXQgZG9lcywgdGhlIHN1YnNlcXVlbnQgYmVoYXZpb3JcclxuICAgICAqIG9mIHRoaXMgT3JkZXJlZFNldCBpcyB1bmRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIGZpbHRlcihjYWxsYmFja0ZuOiAodmFsdWU6IFYsIGluZGV4OiBudW1iZXIsIGFycmF5OiBWW10pID0+IGJvb2xlYW4sIHRoaXNBcmc/OiBhbnkpOiBWW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNBcnJheS5maWx0ZXIoY2FsbGJhY2tGbiwgdGhpc0FyZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIG5vdCBtb2RpZnkgaXRzIGFycmF5IGFyZzsgaWYgaXQgZG9lcywgdGhlIHN1YnNlcXVlbnQgYmVoYXZpb3JcclxuICAgICAqIG9mIHRoaXMgT3JkZXJlZFNldCBpcyB1bmRlZmluZWQuXHJcbiAgICAgKi9cclxuICAgIHJlZHVjZTxVPihjYWxsYmFja0ZuOiAocHJldmlvdXNWYWx1ZTogVSwgY3VycmVudFZhbHVlOiBWLCBjdXJyZW50SW5kZXg6IG51bWJlciwgYXJyYXk6IFZbXSkgPT4gVSwgaW5pdGlhbFZhbHVlOiBVKTogVSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc0FycmF5LnJlZHVjZShjYWxsYmFja0ZuLCBpbml0aWFsVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBub3QgbW9kaWZ5IGl0cyBhcnJheSBhcmc7IGlmIGl0IGRvZXMsIHRoZSBzdWJzZXF1ZW50IGJlaGF2aW9yXHJcbiAgICAgKiBvZiB0aGlzIE9yZGVyZWRTZXQgaXMgdW5kZWZpbmVkLlxyXG4gICAgICovXHJcbiAgICByZWR1Y2VSaWdodDxVPihjYWxsYmFja0ZuOiAocHJldmlvdXNWYWx1ZTogVSwgY3VycmVudFZhbHVlOiBWLCBjdXJyZW50SW5kZXg6IG51bWJlciwgYXJyYXk6IFZbXSkgPT4gVSwgaW5pdGlhbFZhbHVlOiBVKTogVSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc0FycmF5LnJlZHVjZVJpZ2h0KGNhbGxiYWNrRm4sIGluaXRpYWxWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWRBdChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faWRzW2luZGV4XTtcclxuICAgIH1cclxuXHJcbiAgICB2YWx1ZUF0KGluZGV4OiBudW1iZXIpOiBWIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzQXJyYXlbaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIGluZGV4Rm9yKGlkOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiAoaXNTdHJpbmcoaWQpID8gdGhpcy5faW5kZXhlc1tpZF0gOiB1bmRlZmluZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbHVlRm9yKGlkOiBzdHJpbmcpOiBWIHtcclxuICAgICAgICByZXR1cm4gKGlzU3RyaW5nKGlkKSA/IHRoaXMuX3ZhbHVlc01hcFtpZF0gOiB1bmRlZmluZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlkT2YodmFsdWU6IFYpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiByZXF1aXJlU3RyaW5nKHRoaXMuX2lkT2YodmFsdWUpKTtcclxuICAgIH1cclxuXHJcbiAgICBpbmRleE9mKHZhbHVlOiBWKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXhlc1tyZXF1aXJlU3RyaW5nKHRoaXMuX2lkT2YodmFsdWUpKV07XHJcbiAgICB9XHJcblxyXG4gICAgaGFzVmFsdWUodmFsdWU6IFYpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oYXNJZChyZXF1aXJlU3RyaW5nKHRoaXMuX2lkT2YodmFsdWUpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFzVmFsdWVzKHZhbHVlczogVltdKTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB2YWx1ZXMubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1ZhbHVlKHZhbHVlc1tuXSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNJZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIChpc1N0cmluZyhpZCkgJiYgaGFzdmFsKHRoaXMuX3ZhbHVlc01hcFtpZF0pKTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNJZHMoaWRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgaWRzLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNJZChpZHNbbl0pKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkKHZhbHVlOiBWLCBpbmRleD86IG51bWJlciwgbW92ZUlmRXhpc3RzPzogYm9vbGVhbikge1xyXG4gICAgICAgIGluZGV4ID0gKGhhc3ZhbChpbmRleCkgPyBpbmRleCA6IHRoaXMuX3ZhbHVlc0FycmF5Lmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKCFoYXN2YWwobW92ZUlmRXhpc3RzKSkge1xyXG4gICAgICAgICAgICBtb3ZlSWZFeGlzdHMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fYWRkKHZhbHVlLCBpbmRleCwgbW92ZUlmRXhpc3RzKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRBbGwodmFsdWVzOiBWW10sIGluZGV4PzogbnVtYmVyLCBtb3ZlSWZFeGlzdHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgaW5kZXggPSAoaGFzdmFsKGluZGV4KSA/IGluZGV4IDogdGhpcy5fdmFsdWVzQXJyYXkubGVuZ3RoKTtcclxuICAgICAgICBpZiAoIWhhc3ZhbChtb3ZlSWZFeGlzdHMpKSB7XHJcbiAgICAgICAgICAgIG1vdmVJZkV4aXN0cyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHZhbHVlcy5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxJbmRleCA9IHRoaXMuX2FkZCh2YWx1ZXNbbl0sIGluZGV4LCBtb3ZlSWZFeGlzdHMpO1xyXG4gICAgICAgICAgICBpbmRleCA9IGFjdHVhbEluZGV4ICsgMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfYWRkKHZhbHVlOiBWLCBuZXdJbmRleDogbnVtYmVyLCBtb3ZlSWZFeGlzdHM6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IGlkID0gcmVxdWlyZVN0cmluZyh0aGlzLl9pZE9mKHZhbHVlKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG9sZEluZGV4ID0gdGhpcy5faW5kZXhlc1tpZF07XHJcbiAgICAgICAgaWYgKCFoYXN2YWwob2xkSW5kZXgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lkcy5zcGxpY2UobmV3SW5kZXgsIDAsIGlkKTtcclxuICAgICAgICAgICAgdGhpcy5fdmFsdWVzQXJyYXkuc3BsaWNlKG5ld0luZGV4LCAwLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlc01hcFtpZF0gPSB2YWx1ZTtcclxuICAgICAgICA