UNPKG

webglimpse

Version:

Webglimpse is a data visualization library for the web.

228 lines 26.4 kB
/* * 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 { OrderedSet } from './ordered_set'; import { getObjectId } from './util'; export class Notification { constructor() { this._listeners = new OrderedSet([], getObjectId, false); this._deferring = false; this._deferred = []; } on(listener) { if (this._deferring) { const self = this; this._deferred.push(function () { self._listeners.add(listener); }); } else { this._listeners.add(listener); } } off(listener) { if (this._deferring) { const self = this; this._deferred.push(function () { self._listeners.removeValue(listener); }); } else { this._listeners.removeValue(listener); } } dispose() { this._listeners.removeAll(); } fire() { this._deferring = true; try { for (let n = 0; n < this._listeners.length; n++) { const consumed = this._listeners.valueAt(n)(); if (consumed) { return consumed; } } return false; } finally { if (this._deferred.length > 0) { for (let n = 0; n < this._deferred.length; n++) { this._deferred[n](); } this._deferred = []; } this._deferring = false; } } } export class Notification1 { constructor() { this._listeners = new OrderedSet([], getObjectId, false); this._deferring = false; this._deferred = []; } on(listener) { if (this._deferring) { const self = this; this._deferred.push(function () { self._listeners.add(listener); }); } else { this._listeners.add(listener); } } off(listener) { if (this._deferring) { const self = this; this._deferred.push(function () { self._listeners.removeValue(listener); }); } else { this._listeners.removeValue(listener); } } dispose() { this._listeners.removeAll(); } fire(a) { this._deferring = true; try { for (let n = 0; n < this._listeners.length; n++) { const consumed = this._listeners.valueAt(n)(a); if (consumed) { return consumed; } } return false; } finally { if (this._deferred.length > 0) { for (let n = 0; n < this._deferred.length; n++) { this._deferred[n](); } this._deferred = []; } this._deferring = false; } } } export class Notification2 { constructor() { this._listeners = new OrderedSet([], getObjectId, false); this._deferring = false; this._deferred = []; } on(listener) { if (this._deferring) { const self = this; this._deferred.push(function () { self._listeners.add(listener); }); } else { this._listeners.add(listener); } } off(listener) { if (this._deferring) { const self = this; this._deferred.push(function () { self._listeners.removeValue(listener); }); } else { this._listeners.removeValue(listener); } } dispose() { this._listeners.removeAll(); } fire(a, b) { this._deferring = true; try { for (let n = 0; n < this._listeners.length; n++) { const consumed = this._listeners.valueAt(n)(a, b); if (consumed) { return consumed; } } return false; } finally { if (this._deferred.length > 0) { for (let n = 0; n < this._deferred.length; n++) { this._deferred[n](); } this._deferred = []; } this._deferring = false; } } } export class Notification3 { constructor() { this._listeners = new OrderedSet([], getObjectId, false); this._deferring = false; this._deferred = []; } on(listener) { if (this._deferring) { const self = this; this._deferred.push(function () { self._listeners.add(listener); }); } else { this._listeners.add(listener); } } off(listener) { if (this._deferring) { const self = this; this._deferred.push(function () { self._listeners.removeValue(listener); }); } else { this._listeners.removeValue(listener); } } dispose() { this._listeners.removeAll(); } fire(a, b, c) { this._deferring = true; try { for (let n = 0; n < this._listeners.length; n++) { const consumed = this._listeners.valueAt(n)(a, b, c); if (consumed) { return consumed; } } return false; } finally { if (this._deferred.length > 0) { for (let n = 0; n < this._deferred.length; n++) { this._deferred[n](); } this._deferred = []; } this._deferring = false; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dlYmdsaW1wc2UvdXRpbC9ub3RpZmljYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFDSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFpQnJDLE1BQU0sT0FBTyxZQUFZO0lBQXpCO1FBQ1ksZUFBVSxHQUF5QixJQUFJLFVBQVUsQ0FBVyxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BGLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsY0FBUyxHQUFhLEVBQUUsQ0FBQztJQStDckMsQ0FBQztJQTdDRyxFQUFFLENBQUMsUUFBa0I7UUFDakIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdkU7YUFDSTtZQUNELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQUVELEdBQUcsQ0FBQyxRQUFrQjtRQUNsQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvRTthQUNJO1lBQ0QsSUFBSSxDQUFDLFVB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QUNyRCxJQUFJLFFBQVEsRUFBRTtvQkFDVixPQUFPLFFBQVEsQ0FBQztpQkFDbkI7YUFDSjtZQUNELE9BQU8sS0FBSyxDQUFDO1NBQ2hCO2dCQUNPO1lBQ0osSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUN2QjtnQkFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQzthQUN2QjtZQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1NBQzNCO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSAyMDE0LCBNZXRyb24sIEluYy5cclxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICpcclxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixcclxuICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxyXG4gKlxyXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcclxuICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXHJcbiAqXHJcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcclxuICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxyXG4gKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cclxuICpcclxuICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcclxuICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXRcclxuICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxyXG4gKlxyXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIiBBTkRcclxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcclxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxyXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUlxyXG4gKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcclxuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xyXG4gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05cclxuICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcclxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVNcclxuICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXHJcbiAqL1xyXG5pbXBvcnQgeyBPcmRlcmVkU2V0IH0gZnJvbSAnLi9vcmRlcmVkX3NldCc7XHJcbmltcG9ydCB7IGdldE9iamVjdElkIH0gZnJvbSAnLi91dGlsJztcclxuXHJcbmV4cG9ydCB0eXBlIExpc3RlbmVyID0gKCkgPT4gYW55O1xyXG5cclxuXHJcbmV4cG9ydCB0eXBlIExpc3RlbmVyMTxBPiA9IChhOiBBKSA9PiBhbnk7XHJcblxyXG5cclxuZXhwb3J0IHR5cGUgTGlzdGVuZXIyPEEsIEI+ID0gKGE6IEEsIGI6IEIpID0+IGFueTtcclxuXHJcblxyXG5leHBvcnQgdHlwZSBMaXN0ZW5lcjM8QSwgQiwgQz4gPSAoYTogQSwgYjogQiwgYzogQykgPT4gYW55O1xyXG5cclxuXHJcbnR5cGUgQWN0aW9uID0gKCkgPT4gdm9pZDtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uIHtcclxuICAgIHByaXZhdGUgX2xpc3RlbmVyczogT3JkZXJlZFNldDxMaXN0ZW5lcj4gPSBuZXcgT3JkZXJlZFNldDxMaXN0ZW5lcj4oW10sIGdldE9iamVjdElkLCBmYWxzZSk7XHJcbiAgICBwcml2YXRlIF9kZWZlcnJpbmcgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2RlZmVycmVkOiBBY3Rpb25bXSA9IFtdO1xyXG5cclxuICAgIG9uKGxpc3RlbmVyOiBMaXN0ZW5lcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWZlcnJpbmcpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkLnB1c2goZnVuY3Rpb24gKCkgeyBzZWxmLl9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb2ZmKGxpc3RlbmVyOiBMaXN0ZW5lcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWZlcnJpbmcpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkLnB1c2goZnVuY3Rpb24gKCkgeyBzZWxmLl9saXN0ZW5lcnMucmVtb3ZlVmFsdWUobGlzdGVuZXIpOyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVycy5yZW1vdmVWYWx1ZShsaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRpc3Bvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnJlbW92ZUFsbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZpcmUoKTogYW55IHtcclxuICAgICAgICB0aGlzLl9kZWZlcnJpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdW1lZCA9IHRoaXMuX2xpc3RlbmVycy52YWx1ZUF0KG4pKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29uc3VtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3VtZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RlZmVycmVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdGhpcy5fZGVmZXJyZWQubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWZlcnJlZFtuXSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWQgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9kZWZlcnJpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uMTxBPiB7XHJcbiAgICBwcml2YXRlIF9saXN0ZW5lcnM6IE9yZGVyZWRTZXQ8TGlzdGVuZXIxPEE+PiA9IG5ldyBPcmRlcmVkU2V0PExpc3RlbmVyMTxBPj4oW10sIGdldE9iamVjdElkLCBmYWxzZSk7XHJcbiAgICBwcml2YXRlIF9kZWZlcnJpbmcgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2RlZmVycmVkOiBBY3Rpb25bXSA9IFtdO1xyXG5cclxuICAgIG9uKGxpc3RlbmVyOiBMaXN0ZW5lcjE8QT4pIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVmZXJyaW5nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICB0aGlzLl9kZWZlcnJlZC5wdXNoKGZ1bmN0aW9uICgpIHsgc2VsZi5fbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9mZihsaXN0ZW5lcjogTGlzdGVuZXIxPEE+KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlZmVycmluZykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWQucHVzaChmdW5jdGlvbiAoKSB7IHNlbGYuX2xpc3RlbmVycy5yZW1vdmVWYWx1ZShsaXN0ZW5lcik7IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnJlbW92ZVZhbHVlKGxpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcG9zZSgpIHtcclxuICAgICAgICB0aGlzLl9saXN0ZW5lcnMucmVtb3ZlQWxsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZmlyZShhOiBBKTogYW55IHtcclxuICAgICAgICB0aGlzLl9kZWZlcnJpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdW1lZCA9IHRoaXMuX2xpc3RlbmVycy52YWx1ZUF0KG4pKGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN1bWVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWZlcnJlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHRoaXMuX2RlZmVycmVkLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWRbbl0oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fZGVmZXJyaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvbjI8QSwgQj4ge1xyXG4gICAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBPcmRlcmVkU2V0PExpc3RlbmVyMjxBLCBCPj4gPSBuZXcgT3JkZXJlZFNldDxMaXN0ZW5lcjI8QSwgQj4+KFtdLCBnZXRPYmplY3RJZCwgZmFsc2UpO1xyXG4gICAgcHJpdmF0ZSBfZGVmZXJyaW5nID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9kZWZlcnJlZDogQWN0aW9uW10gPSBbXTtcclxuXHJcbiAgICBvbihsaXN0ZW5lcjogTGlzdGVuZXIyPEEsIEI+KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlZmVycmluZykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWQucHVzaChmdW5jdGlvbiAoKSB7IHNlbGYuX2xpc3RlbmVycy5hZGQobGlzdGVuZXIpOyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvZmYobGlzdGVuZXI6IExpc3RlbmVyMjxBLCBCPikge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWZlcnJpbmcpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkLnB1c2goZnVuY3Rpb24gKCkgeyBzZWxmLl9saXN0ZW5lcnMucmVtb3ZlVmFsdWUobGlzdGVuZXIpOyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVycy5yZW1vdmVWYWx1ZShsaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRpc3Bvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnJlbW92ZUFsbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZpcmUoYTogQSwgYjogQik6IGFueSB7XHJcbiAgICAgICAgdGhpcy5fZGVmZXJyaW5nID0gdHJ1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3VtZWQgPSB0aGlzLl9saXN0ZW5lcnMudmFsdWVBdChuKShhLCBiKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zdW1lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVmZXJyZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0aGlzLl9kZWZlcnJlZC5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkW25dKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWZlcnJlZCA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2RlZmVycmluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb24zPEEsIEIsIEM+IHtcclxuICAgIHByaXZhdGUgX2xpc3RlbmVyczogT3JkZXJlZFNldDxMaXN0ZW5lcjM8QSwgQiwgQz4+ID0gbmV3IE9yZGVyZWRTZXQ8TGlzdGVuZXIzPEEsIEIsIEM+PihbXSwgZ2V0T2JqZWN0SWQsIGZhbHNlKTtcclxuICAgIHByaXZhdGUgX2RlZmVycmluZyA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfZGVmZXJyZWQ6IEFjdGlvbltdID0gW107XHJcblxyXG4gICAgb24obGlzdGVuZXI6IExpc3RlbmVyMzxBLCBCLCBDPikge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWZlcnJpbmcpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkLnB1c2goZnVuY3Rpb24gKCkgeyBzZWxmLl9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb2ZmKGxpc3RlbmVyOiBMaXN0ZW5lcjM8QSwgQiwgQz4pIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVmZXJyaW5nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICB0aGlzLl9kZWZlcnJlZC5wdXNoKGZ1bmN0aW9uICgpIHsgc2VsZi5fbGlzdGVuZXJzLnJlbW92ZVZhbHVlKGxpc3RlbmVyKTsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMucmVtb3ZlVmFsdWUobGlzdGVuZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkaXNwb3NlKCkge1xyXG4gICAgICAgIHRoaXMuX2xpc3RlbmVycy5yZW1vdmVBbGwoKTtcclxuICAgIH1cclxuXHJcbiAgICBmaXJlKGE6IEEsIGI6IEIsIGM6IEMpOiBhbnkge1xyXG4gICAgICAgIHRoaXMuX2RlZmVycmluZyA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN1bWVkID0gdGhpcy5fbGlzdGVuZXJzLnZhbHVlQXQobikoYSwgYiwgYyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29uc3VtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3VtZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RlZmVycmVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdGhpcy5fZGVmZXJyZWQubGVuZ3RoOyBuKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWZlcnJlZFtuXSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWQgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9kZWZlcnJpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iXX0=