UNPKG

@bitgo/secp256k1

Version:

Low-level cryptographic methods used in BitGo packages for the secp256k1 curve

172 lines 23.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.musig = exports.bip32 = exports.ECPair = exports.ecc = void 0; const createHmac = require("create-hmac"); const ecpair_1 = require("ecpair"); const necc = require("@noble/secp256k1"); const bip32_1 = require("bip32"); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore base_crypto is exported as a subPath export, ignoring since compiler complains about importing like this const baseCrypto = require("@brandonblack/musig/base_crypto"); const musig_1 = require("@brandonblack/musig"); const createHash = require('create-hash'); necc.utils.sha256Sync = (...messages) => { const sha256 = createHash('sha256'); for (const message of messages) sha256.update(message); return sha256.digest(); }; necc.utils.hmacSha256Sync = (key, ...messages) => { const hash = createHmac('sha256', Buffer.from(key)); messages.forEach((m) => hash.update(m)); return Uint8Array.from(hash.digest()); }; const defaultTrue = (param) => param !== false; function throwToNull(fn) { try { return fn(); } catch (e) { return null; } } function isPoint(p, xOnly) { if ((p.length === 32) !== xOnly) return false; try { return !!necc.Point.fromHex(p); } catch (e) { return false; } } function toBigInt(b) { const buff = Buffer.from(b); if (buff.length !== 32) { throw new Error('Invalid size ${buff.length}'); } return BigInt(`0x${buff.toString('hex')}`); } const ecc = { isPoint: (p) => isPoint(p, false), isPrivate: (d) => necc.utils.isValidPrivateKey(d), isXOnlyPoint: (p) => isPoint(p, true), xOnlyPointAddTweak: (p, tweak) => throwToNull(() => { const P = necc.utils.pointAddScalar(p, tweak, true); const parity = P[0] % 2 === 1 ? 1 : 0; return { parity, xOnlyPubkey: P.slice(1) }; }), pointFromScalar: (sk, compressed) => throwToNull(() => necc.getPublicKey(sk, defaultTrue(compressed))), pointCompress: (p, compressed) => { return necc.Point.fromHex(p).toRawBytes(defaultTrue(compressed)); }, pointMultiply: (a, tweak, compressed) => throwToNull(() => necc.utils.pointMultiply(a, tweak, defaultTrue(compressed))), pointAdd: (a, b, compressed) => throwToNull(() => { const A = necc.Point.fromHex(a); const B = necc.Point.fromHex(b); return A.add(B).toRawBytes(defaultTrue(compressed)); }), pointAddScalar: (p, tweak, compressed) => throwToNull(() => necc.utils.pointAddScalar(p, tweak, defaultTrue(compressed))), privateAdd: (d, tweak) => throwToNull(() => { const res = necc.utils.privateAdd(d, tweak); // tiny-secp256k1 returns null rather than allowing a 0 private key to be returned // ECPair.testEcc() requires that behavior. if (res?.every((i) => i === 0)) return null; return res; }), privateNegate: (d) => necc.utils.privateNegate(d), sign: (h, d, e) => { return necc.signSync(h, d, { der: false, extraEntropy: e }); }, signSchnorr: (h, d, e = Buffer.alloc(32, 0x00)) => { return necc.schnorr.signSync(h, d, e); }, verify: (h, Q, signature, strict) => { return necc.verify(signature, h, Q, { strict }); }, verifySchnorr: (h, Q, signature) => { return necc.schnorr.verifySync(signature, h, Q); }, }; exports.ecc = ecc; const crypto = { ...baseCrypto, pointMultiplyUnsafe(p, a, compress) { try { const product = necc.Point.fromHex(p).multiplyAndAddUnsafe(necc.Point.ZERO, toBigInt(a), BigInt(1)); if (!product) return null; return product.toRawBytes(compress); } catch { return null; } }, pointMultiplyAndAddUnsafe(p1, a, p2, compress) { try { const p2p = necc.Point.fromHex(p2); const p = necc.Point.fromHex(p1).multiplyAndAddUnsafe(p2p, toBigInt(a), BigInt(1)); if (!p) return null; return p.toRawBytes(compress); } catch { return null; } }, pointAdd(a, b, compress) { try { return necc.Point.fromHex(a).add(necc.Point.fromHex(b)).toRawBytes(compress); } catch { return null; } }, pointAddTweak(p, tweak, compress) { try { const P = necc.Point.fromHex(p); const t = baseCrypto.readSecret(tweak); const Q = necc.Point.BASE.multiplyAndAddUnsafe(P, t, BigInt(1)); if (!Q) throw new Error('Tweaked point at infinity'); return Q.toRawBytes(compress); } catch { return null; } }, pointCompress(p, compress = true) { return necc.Point.fromHex(p).toRawBytes(compress); }, liftX(p) { try { return necc.Point.fromHex(p).toRawBytes(false); } catch { return null; } }, getPublicKey(s, compress) { try { return necc.getPublicKey(s, compress); } catch { return null; } }, taggedHash: necc.utils.taggedHashSync, sha256(...messages) { const sha256 = createHash('sha256'); for (const message of messages) sha256.update(message); return sha256.digest(); }, }; const ECPair = (0, ecpair_1.ECPairFactory)(ecc); exports.ECPair = ECPair; const bip32 = (0, bip32_1.BIP32Factory)(ecc); exports.bip32 = bip32; const musig = (0, musig_1.MuSigFactory)(crypto); exports.musig = musig; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMENBQTBDO0FBQzFDLG1DQUFtRTtBQUNuRSx5Q0FBeUM7QUFDekMsaUNBQStEO0FBQy9ELDZEQUE2RDtBQUM3RCxzSEFBc0g7QUFDdEgsOERBQThEO0FBQzlELCtDQUEwRDtBQUUxRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7QUFFMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLFFBQXNCLEVBQWMsRUFBRTtJQUNoRSxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRO1FBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUN6QixDQUFDLENBQUM7QUFFRixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsR0FBRyxDQUFDLEdBQWUsRUFBRSxHQUFHLFFBQXNCLEVBQWMsRUFBRTtJQUNyRixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNwRCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQUVGLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBZSxFQUFXLEVBQUUsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDO0FBRWxFLFNBQVMsV0FBVyxDQUFPLEVBQWM7SUFD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QUFNLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUTtZQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkQsT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDekIsQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLE1BQU0sR0FBYyxJQUFBLHNCQUFhLEVBQUMsR0FBRyxDQUFDLENBQUM7QUFJL0Isd0JBQU07QUFIcEIsTUFBTSxLQUFLLEdBQWEsSUFBQSxvQkFBWSxFQUFDLEdBQUcsQ0FBQyxDQUFDO0FBR1Esc0JBQUs7QUFGdkQsTUFBTSxLQUFLLEdBQVUsSUFBQSxvQkFBWSxFQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRXlDLHNCQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3JlYXRlSG1hYyBmcm9tICdjcmVhdGUtaG1hYyc7XG5pbXBvcnQgeyBFQ1BhaXJBUEksIEVDUGFpckZhY3RvcnksIEVDUGFpckludGVyZmFjZSB9IGZyb20gJ2VjcGFpcic7XG5pbXBvcnQgKiBhcyBuZWNjIGZyb20gJ0Bub2JsZS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgQklQMzJBUEksIEJJUDMyRmFjdG9yeSwgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdiaXAzMic7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlIGJhc2VfY3J5cHRvIGlzIGV4cG9ydGVkIGFzIGEgc3ViUGF0aCBleHBvcnQsIGlnbm9yaW5nIHNpbmNlIGNvbXBpbGVyIGNvbXBsYWlucyBhYm91dCBpbXBvcnRpbmcgbGlrZSB0aGlzXG5pbXBvcnQgKiBhcyBiYXNlQ3J5cHRvIGZyb20gJ0BicmFuZG9uYmxhY2svbXVzaWcvYmFzZV9jcnlwdG8nO1xuaW1wb3J0IHsgTXVTaWcsIE11U2lnRmFjdG9yeSB9IGZyb20gJ0BicmFuZG9uYmxhY2svbXVzaWcnO1xuXG5jb25zdCBjcmVhdGVIYXNoID0gcmVxdWlyZSgnY3JlYXRlLWhhc2gnKTtcblxubmVjYy51dGlscy5zaGEyNTZTeW5jID0gKC4uLm1lc3NhZ2VzOiBVaW50OEFycmF5W10pOiBVaW50OEFycmF5ID0+IHtcbiAgY29uc3Qgc2hhMjU2ID0gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykgc2hhMjU2LnVwZGF0ZShtZXNzYWdlKTtcbiAgcmV0dXJuIHNoYTI1Ni5kaWdlc3QoKTtcbn07XG5cbm5lY2MudXRpbHMuaG1hY1NoYTI1NlN5bmMgPSAoa2V5OiBVaW50OEFycmF5LCAuLi5tZXNzYWdlczogVWludDhBcnJheVtdKTogVWludDhBcnJheSA9PiB7XG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIbWFjKCdzaGEyNTYnLCBCdWZmZXIuZnJvbShrZXkpKTtcbiAgbWVzc2FnZXMuZm9yRWFjaCgobSkgPT4gaGFzaC51cGRhdGUobSkpO1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKGhhc2guZGlnZXN0KCkpO1xufTtcblxuY29uc3QgZGVmYXVsdFRydWUgPSAocGFyYW0/OiBib29sZWFuKTogYm9vbGVhbiA9PiBwYXJhbSAhPT0gZmFsc2U7XG5cbmZ1bmN0aW9uIHRocm93VG9OdWxsPFR5cGU+KGZuOiAoKSA9PiBUeXBlKTogVHlwZSB8IG51bGwge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQb2ludChwOiBVaW50OEFycmF5LCB4T25seTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBpZiAoKHAubGVuZ3RoID09PSAzMikgIT09IHhPbmx5KSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhbmVjYy5Qb2ludC5mcm9tSGV4KHApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQmlnSW50KGI6IFVpbnQ4QXJyYXkgfCBCdWZmZXIpOiBiaWdpbnQge1xuICBjb25zdCBidWZmID0gQnVmZmVyLmZyb20oYik7XG4gIGlmIChidWZmLmxlbmd0aCAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2l6ZSAke2J1ZmYubGVuZ3RofScpO1xuICB9XG4gIHJldHVybiBCaWdJbnQoYDB4JHtidWZmLnRvU3RyaW5nKCdoZXgnKX1gKTtcbn1cblxuY29uc3QgZWNjID0ge1xuICBpc1BvaW50OiAocDogVWludDhBcnJheSk6IGJvb2xlYW4gPT4gaXNQb2ludChwLCBmYWxzZSksXG4gIGlzUHJpdmF0ZTogKGQ6IFVpbnQ4QXJyYXkpOiBib29sZWFuID0+IG5lY2MudXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoZCksXG4gIGlzWE9ubHlQb2ludDogKHA6IFVpbnQ4QXJyYXkpOiBib29sZWFuID0+IGlzUG9pbnQocCwgdHJ1ZSksXG5cbiAgeE9ubHlQb2ludEFkZFR3ZWFrOiAocDogVWludDhBcnJheSwgdHdlYWs6IFVpbnQ4QXJyYXkpOiB7IHBhcml0eTogMCB8IDE7IHhPbmx5UHVia2V5OiBVaW50OEFycmF5IH0gfCBudWxsID0+XG4gICAgdGhyb3dUb051bGwoKCkgPT4ge1xuICAgICAgY29uc3QgUCA9IG5lY2MudXRpbHMucG9pbnRBZGRTY2FsYXIocCwgdHdlYWssIHRydWUpO1xuICAgICAgY29uc3QgcGFyaXR5ID0gUFswXSAlIDIgPT09IDEgPyAxIDogMDtcbiAgICAgIHJldHVybiB7IHBhcml0eSwgeE9ubHlQdWJrZXk6IFAuc2xpY2UoMSkgfTtcbiAgICB9KSxcblxuICBwb2ludEZyb21TY2FsYXI6IChzazogVWludDhBcnJheSwgY29tcHJlc3NlZD86IGJvb2xlYW4pOiBVaW50OEFycmF5IHwgbnVsbCA9PlxuICAgIHRocm93VG9OdWxsKCgpID0+IG5lY2MuZ2V0UHVibGljS2V5KHNrLCBkZWZhdWx0VHJ1ZShjb21wcmVzc2VkKSkpLFxuXG4gIHBvaW50Q29tcHJlc3M6IChwOiBVaW50OEFycmF5LCBjb21wcmVzc2VkPzogYm9vbGVhbik6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBuZWNjLlBvaW50LmZyb21IZXgocCkudG9SYXdCeXRlcyhkZWZhdWx0VHJ1ZShjb21wcmVzc2VkKSk7XG4gIH0sXG5cbiAgcG9pbnRNdWx0aXBseTogKGE6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5LCBjb21wcmVzc2VkPzogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsID0+XG4gICAgdGhyb3dUb051bGwoKCkgPT4gbmVjYy51dGlscy5wb2ludE11bHRpcGx5KGEsIHR3ZWFrLCBkZWZhdWx0VHJ1ZShjb21wcmVzc2VkKSkpLFxuXG4gIHBvaW50QWRkOiAoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSwgY29tcHJlc3NlZD86IGJvb2xlYW4pOiBVaW50OEFycmF5IHwgbnVsbCA9PlxuICAgIHRocm93VG9OdWxsKCgpID0+IHtcbiAgICAgIGNvbnN0IEEgPSBuZWNjLlBvaW50LmZyb21IZXgoYSk7XG4gICAgICBjb25zdCBCID0gbmVjYy5Qb2ludC5mcm9tSGV4KGIpO1xuICAgICAgcmV0dXJuIEEuYWRkKEIpLnRvUmF3Qnl0ZXMoZGVmYXVsdFRydWUoY29tcHJlc3NlZCkpO1xuICAgIH0pLFxuXG4gIHBvaW50QWRkU2NhbGFyOiAocDogVWludDhBcnJheSwgdHdlYWs6IFVpbnQ4QXJyYXksIGNvbXByZXNzZWQ/OiBib29sZWFuKTogVWludDhBcnJheSB8IG51bGwgPT5cbiAgICB0aHJvd1RvTnVsbCgoKSA9PiBuZWNjLnV0aWxzLnBvaW50QWRkU2NhbGFyKHAsIHR3ZWFrLCBkZWZhdWx0VHJ1ZShjb21wcmVzc2VkKSkpLFxuXG4gIHByaXZhdGVBZGQ6IChkOiBVaW50OEFycmF5LCB0d2VhazogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgfCBudWxsID0+XG4gICAgdGhyb3dUb051bGwoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gbmVjYy51dGlscy5wcml2YXRlQWRkKGQsIHR3ZWFrKTtcbiAgICAgIC8vIHRpbnktc2VjcDI1NmsxIHJldHVybnMgbnVsbCByYXRoZXIgdGhhbiBhbGxvd2luZyBhIDAgcHJpdmF0ZSBrZXkgdG8gYmUgcmV0dXJuZWRcbiAgICAgIC8vIEVDUGFpci50ZXN0RWNjKCkgcmVxdWlyZXMgdGhhdCBiZWhhdmlvci5cbiAgICAgIGlmIChyZXM/LmV2ZXJ5KChpKSA9PiBpID09PSAwKSkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pLFxuXG4gIHByaXZhdGVOZWdhdGU6IChkOiBVaW50OEFycmF5KTogVWludDhBcnJheSA9PiBuZWNjLnV0aWxzLnByaXZhdGVOZWdhdGUoZCksXG5cbiAgc2lnbjogKGg6IFVpbnQ4QXJyYXksIGQ6IFVpbnQ4QXJyYXksIGU/OiBVaW50OEFycmF5KTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIG5lY2Muc2lnblN5bmMoaCwgZCwgeyBkZXI6IGZhbHNlLCBleHRyYUVudHJvcHk6IGUgfSk7XG4gIH0sXG5cbiAgc2lnblNjaG5vcnI6IChoOiBVaW50OEFycmF5LCBkOiBVaW50OEFycmF5LCBlOiBVaW50OEFycmF5ID0gQnVmZmVyLmFsbG9jKDMyLCAweDAwKSk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBuZWNjLnNjaG5vcnIuc2lnblN5bmMoaCwgZCwgZSk7XG4gIH0sXG5cbiAgdmVyaWZ5OiAoaDogVWludDhBcnJheSwgUTogVWludDhBcnJheSwgc2lnbmF0dXJlOiBVaW50OEFycmF5LCBzdHJpY3Q/OiBib29sZWFuKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIG5lY2MudmVyaWZ5KHNpZ25hdHVyZSwgaCwgUSwgeyBzdHJpY3QgfSk7XG4gIH0sXG5cbiAgdmVyaWZ5U2Nobm9ycjogKGg6IFVpbnQ4QXJyYXksIFE6IFVpbnQ4QXJyYXksIHNpZ25hdHVyZTogVWludDhBcnJheSk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiBuZWNjLnNjaG5vcnIudmVyaWZ5U3luYyhzaWduYXR1cmUsIGgsIFEpO1xuICB9LFxufTtcblxuY29uc3QgY3J5cHRvID0ge1xuICAuLi5iYXNlQ3J5cHRvLFxuICBwb2ludE11bHRpcGx5VW5zYWZlKHA6IFVpbnQ4QXJyYXksIGE6IFVpbnQ4QXJyYXksIGNvbXByZXNzOiBib29sZWFuKTogVWludDhBcnJheSB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9kdWN0ID0gbmVjYy5Qb2ludC5mcm9tSGV4KHApLm11bHRpcGx5QW5kQWRkVW5zYWZlKG5lY2MuUG9pbnQuWkVSTywgdG9CaWdJbnQoYSksIEJpZ0ludCgxKSk7XG4gICAgICBpZiAoIXByb2R1Y3QpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHByb2R1Y3QudG9SYXdCeXRlcyhjb21wcmVzcyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG4gIHBvaW50TXVsdGlwbHlBbmRBZGRVbnNhZmUocDE6IFVpbnQ4QXJyYXksIGE6IFVpbnQ4QXJyYXksIHAyOiBVaW50OEFycmF5LCBjb21wcmVzczogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcDJwID0gbmVjYy5Qb2ludC5mcm9tSGV4KHAyKTtcbiAgICAgIGNvbnN0IHAgPSBuZWNjLlBvaW50LmZyb21IZXgocDEpLm11bHRpcGx5QW5kQWRkVW5zYWZlKHAycCwgdG9CaWdJbnQoYSksIEJpZ0ludCgxKSk7XG4gICAgICBpZiAoIXApIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHAudG9SYXdCeXRlcyhjb21wcmVzcyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG4gIHBvaW50QWRkKGE6IFVpbnQ4QXJyYXksIGI6IFVpbnQ4QXJyYXksIGNvbXByZXNzOiBib29sZWFuKTogVWludDhBcnJheSB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmVjYy5Qb2ludC5mcm9tSGV4KGEpLmFkZChuZWNjLlBvaW50LmZyb21IZXgoYikpLnRvUmF3Qnl0ZXMoY29tcHJlc3MpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LFxuICBwb2ludEFkZFR3ZWFrKHA6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5LCBjb21wcmVzczogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgUCA9IG5lY2MuUG9pbnQuZnJvbUhleChwKTtcbiAgICAgIGNvbnN0IHQgPSBiYXNlQ3J5cHRvLnJlYWRTZWNyZXQodHdlYWspO1xuICAgICAgY29uc3QgUSA9IG5lY2MuUG9pbnQuQkFTRS5tdWx0aXBseUFuZEFkZFVuc2FmZShQLCB0LCBCaWdJbnQoMSkpO1xuICAgICAgaWYgKCFRKSB0aHJvdyBuZXcgRXJyb3IoJ1R3ZWFrZWQgcG9pbnQgYXQgaW5maW5pdHknKTtcbiAgICAgIHJldHVybiBRLnRvUmF3Qnl0ZXMoY29tcHJlc3MpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LFxuICBwb2ludENvbXByZXNzKHA6IFVpbnQ4QXJyYXksIGNvbXByZXNzID0gdHJ1ZSk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBuZWNjLlBvaW50LmZyb21IZXgocCkudG9SYXdCeXRlcyhjb21wcmVzcyk7XG4gIH0sXG4gIGxpZnRYKHA6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZWNjLlBvaW50LmZyb21IZXgocCkudG9SYXdCeXRlcyhmYWxzZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG4gIGdldFB1YmxpY0tleShzOiBVaW50OEFycmF5LCBjb21wcmVzczogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5lY2MuZ2V0UHVibGljS2V5KHMsIGNvbXByZXNzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSxcbiAgdGFnZ2VkSGFzaDogbmVjYy51dGlscy50YWdnZWRIYXNoU3luYyxcbiAgc2hhMjU2KC4uLm1lc3NhZ2VzOiBVaW50OEFycmF5W10pOiBVaW50OEFycmF5IHtcbiAgICBjb25zdCBzaGEyNTYgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHNoYTI1Ni51cGRhdGUobWVzc2FnZSk7XG4gICAgcmV0dXJuIHNoYTI1Ni5kaWdlc3QoKTtcbiAgfSxcbn07XG5cbmNvbnN0IEVDUGFpcjogRUNQYWlyQVBJID0gRUNQYWlyRmFjdG9yeShlY2MpO1xuY29uc3QgYmlwMzI6IEJJUDMyQVBJID0gQklQMzJGYWN0b3J5KGVjYyk7XG5jb25zdCBtdXNpZzogTXVTaWcgPSBNdVNpZ0ZhY3RvcnkoY3J5cHRvKTtcblxuZXhwb3J0IHsgZWNjLCBFQ1BhaXIsIEVDUGFpckFQSSwgRUNQYWlySW50ZXJmYWNlLCBiaXAzMiwgQklQMzJBUEksIEJJUDMySW50ZXJmYWNlLCBtdXNpZywgTXVTaWcgfTtcbiJdfQ==