UNPKG

webglimpse

Version:

Webglimpse is a data visualization library for the web.

171 lines 27.9 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. */ class MultiKeyCacheEntry { constructor(keyParts, value) { this.touched = false; this.keyParts = keyParts; this.value = value; } } export class MultiKeyCache { constructor(helper) { this.helper = helper; this.map = {}; } combineKeyParts(keyParts) { const esc = '\\'; const sep = ';'; const escapedEsc = esc + esc; const escapedSep = esc + sep; const escapedParts = []; for (let n = 0; n < keyParts.length; n++) { escapedParts[n] = keyParts[n].replace(esc, escapedEsc).replace(sep, escapedSep); } return escapedParts.join(sep); } value(...keyParts) { const key = this.combineKeyParts(keyParts); if (!this.map.hasOwnProperty(key)) { this.map[key] = new MultiKeyCacheEntry(keyParts, this.helper.create(keyParts)); } const en = this.map[key]; en.touched = true; return en.value; } remove(...keyParts) { const key = this.combineKeyParts(keyParts); if (this.map.hasOwnProperty(key)) { const en = this.map[key]; this.helper.dispose(en.value, en.keyParts); delete this.map[key]; } } retain(...keyParts) { const newMap = {}; const retainKey = this.combineKeyParts(keyParts); if (this.map.hasOwnProperty(retainKey)) { newMap[retainKey] = this.map[retainKey]; delete this.map[retainKey]; } for (const key in this.map) { if (this.map.hasOwnProperty(key)) { const en = this.map[key]; this.helper.dispose(en.value, en.keyParts); } } this.map = newMap; } resetTouches() { for (const key in this.map) { if (this.map.hasOwnProperty(key)) { this.map[key].touched = false; } } } retainTouched() { const newMap = {}; for (const key in this.map) { if (this.map.hasOwnProperty(key)) { const en = this.map[key]; if (en.touched) { newMap[key] = this.map[key]; } else { this.helper.dispose(en.value, en.keyParts); } } } this.map = newMap; } clear() { for (const key in this.map) { if (this.map.hasOwnProperty(key)) { const en = this.map[key]; this.helper.dispose(en.value, en.keyParts); } } this.map = {}; } } export class TwoKeyCache { constructor(helper) { this.cache = new MultiKeyCache({ create: function (keyParts) { return helper.create(keyParts[0], keyParts[1]); }, dispose: function (value, keyParts) { helper.dispose(value, keyParts[0], keyParts[1]); } }); } value(keyPart1, keyPart2) { return this.cache.value(keyPart1, keyPart2); } remove(keyPart1, keyPart2) { this.cache.remove(keyPart1, keyPart2); } retain(keyPart1, keyPart2) { this.cache.retain(keyPart1, keyPart2); } resetTouches() { this.cache.resetTouches(); } retainTouched() { this.cache.retainTouched(); } clear() { this.cache.clear(); } } export class ThreeKeyCache { constructor(helper) { this.cache = new MultiKeyCache({ create: function (keyParts) { return helper.create(keyParts[0], keyParts[1], keyParts[2]); }, dispose: function (value, keyParts) { helper.dispose(value, keyParts[0], keyParts[1], keyParts[2]); } }); } value(keyPart1, keyPart2, keyPart3) { return this.cache.value(keyPart1, keyPart2, keyPart3); } remove(keyPart1, keyPart2, keyPart3) { this.cache.remove(keyPart1, keyPart2, keyPart3); } retain(keyPart1, keyPart2, keyPart3) { this.cache.retain(keyPart1, keyPart2, keyPart3); } resetTouches() { this.cache.resetTouches(); } retainTouched() { this.cache.retainTouched(); } clear() { this.cache.clear(); } } export class SixKeyCache { constructor(helper) { this.cache = new MultiKeyCache({ create: function (keyParts) { return helper.create(keyParts[0], keyParts[1], keyParts[2], keyParts[3], keyParts[4], keyParts[5]); }, dispose: function (value, keyParts) { helper.dispose(value, keyParts[0], keyParts[1], keyParts[2], keyParts[3], keyParts[4], keyParts[5]); } }); } value(keyPart1, keyPart2, keyPart3, keyPart4, keyPart5, keyPart6) { return this.cache.value(keyPart1, keyPart2, keyPart3, keyPart4, keyPart5, keyPart6); } remove(keyPart1, keyPart2, keyPart3, keyPart4, keyPart5, keyPart6) { this.cache.remove(keyPart1, keyPart2, keyPart3, keyPart4, keyPart5, keyPart6); } retain(keyPart1, keyPart2, keyPart3, keyPart4, keyPart5, keyPart6) { this.cache.retain(keyPart1, keyPart2, keyPart3, keyPart4, keyPart5, keyPart6); } resetTouches() { this.cache.resetTouches(); } retainTouched() { this.cache.retainTouched(); } clear() { this.cache.clear(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlrZXlfY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd2ViZ2xpbXBzZS91dGlsL211bHRpa2V5X2NhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBVUgsTUFBTSxrQkFBa0I7SUFLcEIsWUFBWSxRQUFrQixFQUFFLEtBQVE7UUFGeEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUdaLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7Q0FDSjtBQUdELE1BQU0sT0FBTyxhQUFhO0lBSXRCLFlBQVksTUFBOEI7UUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxRQUFrQjtRQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLE1BQU0sVUFBVSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDN0IsTUFBTSxVQUFVLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUU3QixNQUFNLFlBQVksR0FBYSxFQUFFLENBQUM7UUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDbkY7UUFDRCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FB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LENBQUMsQ0FBQztJQUMvQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7Q0FDbEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIE1ldHJvbiwgSW5jLlxyXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKlxyXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxyXG4gKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XHJcbiAqXHJcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xyXG4gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cclxuICpcclxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxyXG4gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXHJcbiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxyXG4gKlxyXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xyXG4gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxyXG4gKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxyXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxyXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXHJcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXHJcbiAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xyXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XHJcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxyXG4gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxyXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xyXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICovXHJcblxyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlLZXlDYWNoZUhlbHBlcjxWPiB7XHJcbiAgICBjcmVhdGUoa2V5UGFydHM6IHN0cmluZ1tdKTogVjtcclxuICAgIGRpc3Bvc2UodmFsdWU6IFYsIGtleVBhcnRzOiBzdHJpbmdbXSk6IHZvaWQ7XHJcbn1cclxuXHJcblxyXG5jbGFzcyBNdWx0aUtleUNhY2hlRW50cnk8Vj4ge1xyXG4gICAga2V5UGFydHM6IHN0cmluZ1tdO1xyXG4gICAgdmFsdWU6IFY7XHJcbiAgICB0b3VjaGVkID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioa2V5UGFydHM6IHN0cmluZ1tdLCB2YWx1ZTogVikge1xyXG4gICAgICAgIHRoaXMua2V5UGFydHMgPSBrZXlQYXJ0cztcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTXVsdGlLZXlDYWNoZTxWPiB7XHJcbiAgICBwcml2YXRlIGhlbHBlcjogTXVsdGlLZXlDYWNoZUhlbHBlcjxWPjtcclxuICAgIHByaXZhdGUgbWFwOiB7IFtrZXk6IHN0cmluZ106IE11bHRpS2V5Q2FjaGVFbnRyeTxWPjsgfTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihoZWxwZXI6IE11bHRpS2V5Q2FjaGVIZWxwZXI8Vj4pIHtcclxuICAgICAgICB0aGlzLmhlbHBlciA9IGhlbHBlcjtcclxuICAgICAgICB0aGlzLm1hcCA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29tYmluZUtleVBhcnRzKGtleVBhcnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZXNjID0gJ1xcXFwnO1xyXG4gICAgICAgIGNvbnN0IHNlcCA9ICc7JztcclxuICAgICAgICBjb25zdCBlc2NhcGVkRXNjID0gZXNjICsgZXNjO1xyXG4gICAgICAgIGNvbnN0IGVzY2FwZWRTZXAgPSBlc2MgKyBzZXA7XHJcblxyXG4gICAgICAgIGNvbnN0IGVzY2FwZWRQYXJ0cyA9IDxzdHJpbmdbXT5bXTtcclxuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGtleVBhcnRzLmxlbmd0aDsgbisrKSB7XHJcbiAgICAgICAgICAgIGVzY2FwZWRQYXJ0c1tuXSA9IGtleVBhcnRzW25dLnJlcGxhY2UoZXNjLCBlc2NhcGVkRXNjKS5yZXBsYWNlKHNlcCwgZXNjYXBlZFNlcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlc2NhcGVkUGFydHMuam9pbihzZXApO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbHVlKC4uLmtleVBhcnRzOiBzdHJpbmdbXSk6IFYge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29tYmluZUtleVBhcnRzKGtleVBhcnRzKTtcclxuICAgICAgICBpZiAoIXRoaXMubWFwLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXBba2V5XSA9IG5ldyBNdWx0aUtleUNhY2hlRW50cnk8Vj4oa2V5UGFydHMsIHRoaXMuaGVscGVyLmNyZWF0ZShrZXlQYXJ0cykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBlbiA9IHRoaXMubWFwW2tleV07XHJcblxyXG4gICAgICAgIGVuLnRvdWNoZWQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBlbi52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmUoLi4ua2V5UGFydHM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb21iaW5lS2V5UGFydHMoa2V5UGFydHMpO1xyXG4gICAgICAgIGlmICh0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuID0gdGhpcy5tYXBba2V5XTtcclxuICAgICAgICAgICAgdGhpcy5oZWxwZXIuZGlzcG9zZShlbi52YWx1ZSwgZW4ua2V5UGFydHMpO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5tYXBba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0YWluKC4uLmtleVBhcnRzOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGNvbnN0IG5ld01hcDogeyBbazogc3RyaW5nXTogTXVsdGlLZXlDYWNoZUVudHJ5PFY+OyB9ID0ge307XHJcbiAgICAgICAgY29uc3QgcmV0YWluS2V5ID0gdGhpcy5jb21iaW5lS2V5UGFydHMoa2V5UGFydHMpO1xyXG4gICAgICAgIGlmICh0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShyZXRhaW5LZXkpKSB7XHJcbiAgICAgICAgICAgIG5ld01hcFtyZXRhaW5LZXldID0gdGhpcy5tYXBbcmV0YWluS2V5XTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMubWFwW3JldGFpbktleV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMubWFwKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbiA9IHRoaXMubWFwW2tleV07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlbHBlci5kaXNwb3NlKGVuLnZhbHVlLCBlbi5rZXlQYXJ0cyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tYXAgPSBuZXdNYXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRUb3VjaGVzKCkge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMubWFwKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hcFtrZXldLnRvdWNoZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXRhaW5Ub3VjaGVkKCkge1xyXG4gICAgICAgIGNvbnN0IG5ld01hcDogeyBba2V5OiBzdHJpbmddOiBNdWx0aUtleUNhY2hlRW50cnk8Vj47IH0gPSB7fTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLm1hcCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tYXAuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW4gPSB0aGlzLm1hcFtrZXldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuLnRvdWNoZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdNYXBba2V5XSA9IHRoaXMubWFwW2tleV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlbHBlci5kaXNwb3NlKGVuLnZhbHVlLCBlbi5rZXlQYXJ0cyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tYXAgPSBuZXdNYXA7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXIoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5tYXApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVuID0gdGhpcy5tYXBba2V5XTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGVscGVyLmRpc3Bvc2UoZW4udmFsdWUsIGVuLmtleVBhcnRzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1hcCA9IHt9O1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUd29LZXlDYWNoZUhlbHBlcjxWPiB7XHJcbiAgICBjcmVhdGUoa2V5UGFydDE6IHN0cmluZywga2V5UGFydDI6IHN0cmluZyk6IFY7XHJcbiAgICBkaXNwb3NlKHZhbHVlOiBWLCBrZXlQYXJ0MTogc3RyaW5nLCBrZXlQYXJ0Mjogc3RyaW5nKTogdm9pZDtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBUd29LZXlDYWNoZTxWPiB7XHJcbiAgICBwcml2YXRlIGNhY2hlOiBNdWx0aUtleUNhY2hlPFY+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGhlbHBlcjogVHdvS2V5Q2FjaGVIZWxwZXI8Vj4pIHtcclxuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IE11bHRpS2V5Q2FjaGU8Vj4oe1xyXG4gICAgICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uIChrZXlQYXJ0czogc3RyaW5nW10pOiBWIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBoZWxwZXIuY3JlYXRlKGtleVBhcnRzWzBdLCBrZXlQYXJ0c1sxXSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGRpc3Bvc2U6IGZ1bmN0aW9uICh2YWx1ZTogViwga2V5UGFydHM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgICAgICAgICBoZWxwZXIuZGlzcG9zZSh2YWx1ZSwga2V5UGFydHNbMF0sIGtleVBhcnRzWzFdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbHVlKGtleVBhcnQxOiBzdHJpbmcsIGtleVBhcnQyOiBzdHJpbmcpOiBWIHsgcmV0dXJuIHRoaXMuY2FjaGUudmFsdWUoa2V5UGFydDEsIGtleVBhcnQyKTsgfVxyXG4gICAgcmVtb3ZlKGtleVBhcnQxOiBzdHJpbmcsIGtleVBhcnQyOiBzdHJpbmcpIHsgdGhpcy5jYWNoZS5yZW1vdmUoa2V5UGFydDEsIGtleVBhcnQyKTsgfVxyXG4gICAgcmV0YWluKGtleVBhcnQxOiBzdHJpbmcsIGtleVBhcnQyOiBzdHJpbmcpIHsgdGhpcy5jYWNoZS5yZXRhaW4oa2V5UGFydDEsIGtleVBhcnQyKTsgfVxyXG4gICAgcmVzZXRUb3VjaGVzKCkgeyB0aGlzLmNhY2hlLnJlc2V0VG91Y2hlcygpOyB9XHJcbiAgICByZXRhaW5Ub3VjaGVkKCkgeyB0aGlzLmNhY2hlLnJldGFpblRvdWNoZWQoKTsgfVxyXG4gICAgY2xlYXIoKSB7IHRoaXMuY2FjaGUuY2xlYXIoKTsgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUaHJlZUtleUNhY2hlSGVscGVyPFY+IHtcclxuICAgIGNyZWF0ZShrZXlQYXJ0MTogc3RyaW5nLCBrZXlQYXJ0Mjogc3RyaW5nLCBrZXlQYXJ0Mzogc3RyaW5nKTogVjtcclxuICAgIGRpc3Bvc2UodmFsdWU6IFYsIGtleVBhcnQxOiBzdHJpbmcsIGtleVBhcnQyOiBzdHJpbmcsIGtleVBhcnQzOiBzdHJpbmcpOiB2b2lkO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFRocmVlS2V5Q2FjaGU8Vj4ge1xyXG4gICAgcHJpdmF0ZSBjYWNoZTogTXVsdGlLZXlDYWNoZTxWPjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihoZWxwZXI6IFRocmVlS2V5Q2FjaGVIZWxwZXI8Vj4pIHtcclxuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IE11bHRpS2V5Q2FjaGU8Vj4oe1xyXG4gICAgICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uIChrZXlQYXJ0czogc3RyaW5nW10pOiBWIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBoZWxwZXIuY3JlYXRlKGtleVBhcnRzWzBdLCBrZXlQYXJ0c1sxXSwga2V5UGFydHNbMl0pO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBkaXNwb3NlOiBmdW5jdGlvbiAodmFsdWU6IFYsIGtleVBhcnRzOiBzdHJpbmdbXSkge1xyXG4gICAgICAgICAgICAgICAgaGVscGVyLmRpc3Bvc2UodmFsdWUsIGtleVBhcnRzWzBdLCBrZXlQYXJ0c1sxXSwga2V5UGFydHNbMl0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsdWUoa2V5UGFydDE6IHN0cmluZywga2V5UGFydDI6IHN0cmluZywga2V5UGFydDM6IHN0cmluZyk6IFYgeyByZXR1cm4gdGhpcy5jYWNoZS52YWx1ZShrZXlQYXJ0MSwga2V5UGFydDIsIGtleVBhcnQzKTsgfVxyXG4gICAgcmVtb3ZlKGtleVBhcnQxOiBzdHJpbmcsIGtleVBhcnQyOiBzdHJpbmcsIGtleVBhcnQzOiBzdHJpbmcpIHsgdGhpcy5jYWNoZS5yZW1vdmUoa2V5UGFydDEsIGtleVBhcnQyLCBrZXlQYXJ0Myk7IH1cclxuICAgIHJldGFpbihrZXlQYXJ0MTogc3RyaW5nLCBrZXlQYXJ0Mjogc3RyaW5nLCBrZXlQYXJ0Mzogc3RyaW5nKSB7IHRoaXMuY2FjaGUucmV0YWluKGtleVBhcnQxLCBrZXlQYXJ0Miwga2V5UGFydDMpOyB9XHJcbiAgICByZXNldFRvdWNoZXMoKSB7IHRoaXMuY2FjaGUucmVzZXRUb3VjaGVzKCk7IH1cclxuICAgIHJldGFpblRvdWNoZWQoKSB7IHRoaXMuY2FjaGUucmV0YWluVG91Y2hlZCgpOyB9XHJcbiAgICBjbGVhcigpIHsgdGhpcy5jYWNoZS5jbGVhcigpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2l4S2V5Q2FjaGVIZWxwZXI8Vj4ge1xyXG4gICAgY3JlYXRlKGtleVBhcnQxOiBzdHJpbmcsIGtleVBhcnQyOiBzdHJpbmcsIGtleVBhcnQzOiBzdHJpbmcsIGtleVBhcnQ0OiBzdHJpbmcsIGtleVBhcnQ1OiBzdHJpbmcsIGtleVBhcnQ2OiBzdHJpbmcpOiBWO1xyXG4gICAgZGlzcG9zZSh2YWx1ZTogViwga2V5UGFydDE6IHN0cmluZywga2V5UGFydDI6IHN0cmluZywga2V5UGFydDM6IHN0cmluZywga2V5UGFydDQ6IHN0cmluZywga2V5UGFydDU6IHN0cmluZywga2V5UGFydDY6IHN0cmluZyk6IHZvaWQ7XHJcbn1cclxuZXhwb3J0IGNsYXNzIFNpeEtleUNhY2hlPFY+IHtcclxuICAgIHByaXZhdGUgY2FjaGU6IE11bHRpS2V5Q2FjaGU8Vj47XHJcblxyXG4gICAgY29uc3RydWN0b3IoaGVscGVyOiBTaXhLZXlDYWNoZUhlbHBlcjxWPikge1xyXG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTXVsdGlLZXlDYWNoZTxWPih7XHJcbiAgICAgICAgICAgIGNyZWF0ZTogZnVuY3Rpb24gKGtleVBhcnRzOiBzdHJpbmdbXSk6IFYge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5jcmVhdGUoa2V5UGFydHNbMF0sIGtleVBhcnRzWzFdLCBrZXlQYXJ0c1syXSwga2V5UGFydHNbM10sIGtleVBhcnRzWzRdLCBrZXlQYXJ0c1s1XSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGRpc3Bvc2U6IGZ1bmN0aW9uICh2YWx1ZTogViwga2V5UGFydHM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgICAgICAgICBoZWxwZXIuZGlzcG9zZSh2YWx1ZSwga2V5UGFydHNbMF0sIGtleVBhcnRzWzFdLCBrZXlQYXJ0c1syXSwga2V5UGFydHNbM10sIGtleVBhcnRzWzRdLCBrZXlQYXJ0c1s1XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB2YWx1ZShrZXlQYXJ0MTogc3RyaW5nLCBrZXlQYXJ0Mjogc3RyaW5nLCBrZXlQYXJ0Mzogc3RyaW5nLCBrZXlQYXJ0NDogc3RyaW5nLCBrZXlQYXJ0NTogc3RyaW5nLCBrZXlQYXJ0Njogc3RyaW5nKTogViB7IHJldHVybiB0aGlzLmNhY2hlLnZhbHVlKGtleVBhcnQxLCBrZXlQYXJ0Miwga2V5UGFydDMsIGtleVBhcnQ0LCBrZXlQYXJ0NSwga2V5UGFydDYpOyB9XHJcbiAgICByZW1vdmUoa2V5UGFydDE6IHN0cmluZywga2V5UGFydDI6IHN0cmluZywga2V5UGFydDM6IHN0cmluZywga2V5UGFydDQ6IHN0cmluZywga2V5UGFydDU6IHN0cmluZywga2V5UGFydDY6IHN0cmluZykgeyB0aGlzLmNhY2hlLnJlbW92ZShrZXlQYXJ0MSwga2V5UGFydDIsIGtleVBhcnQzLCBrZXlQYXJ0NCwga2V5UGFydDUsIGtleVBhcnQ2KTsgfVxyXG4gICAgcmV0YWluKGtleVBhcnQxOiBzdHJpbmcsIGtleVBhcnQyOiBzdHJpbmcsIGtleVBhcnQzOiBzdHJpbmcsIGtleVBhcnQ0OiBzdHJpbmcsIGtleVBhcnQ1OiBzdHJpbmcsIGtleVBhcnQ2OiBzdHJpbmcpIHsgdGhpcy5jYWNoZS5yZXRhaW4oa2V5UGFydDEsIGtleVBhcnQyLCBrZXlQYXJ0Mywga2V5UGFydDQsIGtleVBhcnQ1LCBrZXlQYXJ0Nik7IH1cclxuICAgIHJlc2V0VG91Y2hlcygpIHsgdGhpcy5jYWNoZS5yZXNldFRvdWNoZXMoKTsgfVxyXG4gICAgcmV0YWluVG91Y2hlZCgpIHsgdGhpcy5jYWNoZS5yZXRhaW5Ub3VjaGVkKCk7IH1cclxuICAgIGNsZWFyKCkgeyB0aGlzLmNhY2hlLmNsZWFyKCk7IH1cclxufVxyXG5cclxuXHJcbiJdfQ==