@bitgo/sdk-lib-mpc 8.7.0 → 8.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/dist/src/tss/ecdsa/paillierBlumProof.d.ts.map +1 -1
- package/dist/src/tss/ecdsa/paillierBlumProof.js +20 -7
- package/dist/src/tss/ecdsa/{rangeproof.d.ts.map → rangeProof.d.ts.map} +1 -1
- package/dist/src/tss/ecdsa/rangeProof.js +404 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -4
- package/dist/src/curves/baseCurve.d.ts +0 -19
- package/dist/src/curves/baseCurve.d.ts.map +0 -1
- package/dist/src/curves/baseCurve.js +0 -6
- package/dist/src/curves/bip32.d.ts +0 -8
- package/dist/src/curves/bip32.d.ts.map +0 -1
- package/dist/src/curves/bip32.js +0 -54
- package/dist/src/curves/bip32HdTree.d.ts +0 -8
- package/dist/src/curves/bip32HdTree.d.ts.map +0 -1
- package/dist/src/curves/bip32HdTree.js +0 -54
- package/dist/src/curves/hdTree.d.ts +0 -2
- package/dist/src/curves/hdTree.d.ts.map +0 -1
- package/dist/src/curves/hdTree.js +0 -11
- package/dist/src/curves/nobleEcc.d.ts +0 -10
- package/dist/src/curves/nobleEcc.d.ts.map +0 -1
- package/dist/src/curves/nobleEcc.js +0 -194
- package/dist/src/curves/shamir.d.ts +0 -37
- package/dist/src/curves/shamir.d.ts.map +0 -1
- package/dist/src/curves/shamir.js +0 -136
- package/dist/src/tss/ecdsa/mpc.d.ts +0 -129
- package/dist/src/tss/ecdsa/mpc.d.ts.map +0 -1
- package/dist/src/tss/ecdsa/mpc.js +0 -1095
- package/dist/src/tss/ecdsa/rangeproof.js +0 -401
- /package/dist/src/tss/ecdsa/{paillierproof.d.ts → paillierProof.d.ts} +0 -0
- /package/dist/src/tss/ecdsa/{paillierproof.d.ts.map → paillierProof.d.ts.map} +0 -0
- /package/dist/src/tss/ecdsa/{paillierproof.js → paillierProof.js} +0 -0
- /package/dist/src/tss/ecdsa/{rangeproof.d.ts → rangeProof.d.ts} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,21 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [8.8.0](https://github.com/BitGo/BitGoJS/compare/@bitgo/sdk-lib-mpc@8.5.0...@bitgo/sdk-lib-mpc@8.8.0) (2023-09-01)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- **root:** update @types/node ([cedc1a0](https://github.com/BitGo/BitGoJS/commit/cedc1a0035e79bb42fda57bf6ac29d606242f50b))
|
|
11
|
+
- **sdk-lib-mpc:** fix 0 values attack on range proof ([4a689dc](https://github.com/BitGo/BitGoJS/commit/4a689dcfcf0345132e54ddfd3e8a10e2452b0997))
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
- **sdk-core:** add getDerivationPath method for smc wallets ([e0be65f](https://github.com/BitGo/BitGoJS/commit/e0be65f4c8904be313b4f453996f86326d2005e8))
|
|
16
|
+
- **sdk-lib-mpc:** convert interface to type ([e1c1065](https://github.com/BitGo/BitGoJS/commit/e1c1065928691a1f9d43522aeafa8751c2424d3e))
|
|
17
|
+
- **sdk-lib-mpc:** move ecdsa hdtree from core ([f0311a8](https://github.com/BitGo/BitGoJS/commit/f0311a8606b1a6aa82309ef7bb9a349782819c28))
|
|
18
|
+
- **sdk-lib-mpc:** move shamir ([42fc946](https://github.com/BitGo/BitGoJS/commit/42fc946c8a5c4a1f7a09e5a9cb6c64a0b266a2a7))
|
|
19
|
+
- **sdk-lib-mpc:** move types to types.ts ([cf2f482](https://github.com/BitGo/BitGoJS/commit/cf2f4821792172b1657fbcecd8886df5bacd817a))
|
|
20
|
+
|
|
6
21
|
# [8.7.0](https://github.com/BitGo/BitGoJS/compare/@bitgo/sdk-lib-mpc@8.5.0...@bitgo/sdk-lib-mpc@8.7.0) (2023-08-29)
|
|
7
22
|
|
|
8
23
|
### Features
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paillierBlumProof.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa/paillierBlumProof.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"paillierBlumProof.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa/paillierBlumProof.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;AA6ExD;;;;;GAKG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAuBxF;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,6BAA6B,GAAG,OAAO,CAAC,OAAO,CAAC,CA8BpG"}
|
|
@@ -16,14 +16,27 @@ const m = 80;
|
|
|
16
16
|
function generateY(N, w) {
|
|
17
17
|
const NBuf = util_1.bigIntToBufferBE(N);
|
|
18
18
|
const wBuf = util_1.bigIntToBufferBE(w, NBuf.length);
|
|
19
|
+
let counter = 0;
|
|
19
20
|
return Array(m)
|
|
20
21
|
.fill(null)
|
|
21
|
-
.map((_
|
|
22
|
-
|
|
23
|
-
.
|
|
24
|
-
|
|
25
|
-
.
|
|
26
|
-
|
|
22
|
+
.map((_) => {
|
|
23
|
+
while (true) {
|
|
24
|
+
let h = util_1.bigIntFromBufferBE(
|
|
25
|
+
// TypeScript doesn't like us using `outputLength` in the transform options,
|
|
26
|
+
// but it is required for shake256.
|
|
27
|
+
crypto_1.createHash('shake256', { outputLength: Math.floor((bigint_crypto_utils_1.bitLength(N) + 7) / 8) })
|
|
28
|
+
.update(Buffer.from([counter++]))
|
|
29
|
+
.update('$')
|
|
30
|
+
.update(NBuf)
|
|
31
|
+
.update('$')
|
|
32
|
+
.update(wBuf)
|
|
33
|
+
.update('$')
|
|
34
|
+
.digest());
|
|
35
|
+
h = (h * h) % N;
|
|
36
|
+
if (bigint_mod_arith_1.gcd(h, N) === BigInt(1)) {
|
|
37
|
+
return h;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
27
40
|
});
|
|
28
41
|
}
|
|
29
42
|
// https://en.wikipedia.org/wiki/Jacobi_symbol#Implementation_in_C++
|
|
@@ -132,4 +145,4 @@ async function verify(N, { w, x, z }) {
|
|
|
132
145
|
return true;
|
|
133
146
|
}
|
|
134
147
|
exports.verify = verify;
|
|
135
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFpbGxpZXJCbHVtUHJvb2YuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VjZHNhL3BhaWxsaWVyQmx1bVByb29mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFvQztBQUNwQyw2REFBMkU7QUFDM0UsdURBQWtEO0FBQ2xELHFDQUFrRTtBQUdsRSxzQkFBc0I7QUFDdEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBRWI7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNyQixNQUFNLElBQUksR0FBRyx1QkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxNQUFNLElBQUksR0FBRyx1QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNaLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDWixNQUFNLENBQUMsR0FBRyx5QkFBa0IsQ0FDMUIsbUJBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQzthQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUM7YUFDWixNQUFNLEVBQUUsQ0FDWixDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQsb0VBQW9FO0FBQ3BFLFNBQVMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2xCLDhCQUE4QjtJQUM5QixJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0tBQzFDO0lB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MUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQix3Q0FBd0M7UUFDeEMsSUFBSSx5QkFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDNUQ7UUFDRCx3Q0FBd0M7UUFDeEMsSUFBSSx5QkFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDNUQ7S0FDRjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQTlCRCx3QkE4QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIbWFjIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGJpdExlbmd0aCwgcmFuZEJpdHMsIGlzUHJvYmFibHlQcmltZSB9IGZyb20gJ2JpZ2ludC1jcnlwdG8tdXRpbHMnO1xuaW1wb3J0IHsgbW9kSW52LCBtb2RQb3cgfSBmcm9tICdiaWdpbnQtbW9kLWFyaXRoJztcbmltcG9ydCB7IGJpZ0ludEZyb21CdWZmZXJCRSwgYmlnSW50VG9CdWZmZXJCRSB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkUGFpbGxpZXJCbHVtUHJvb2YgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gU2VjdXJpdHkgcGFyYW1ldGVyLlxuY29uc3QgbSA9IDgwO1xuXG4vKipcbiAqIEdlbmVyYXRlIHBzdWVkby1yYW5kb20gcXVhZHJhdGljIHJlc2lkdWUgZm9yIChOLCB3LCBpKS5cbiAqIEBwYXJhbSBOIC0gdGhlIHByaW1lIG51bWJlciB0byB2ZXJpZnkgaXMgYSBwcm9kdWN0IG9mIHR3byBsYXJnZSBwcmltZXMuXG4gKiBAcGFyYW0gdyAtIGEgcmFuZG9tIG51bWJlciB3aXRoIHRoZSBzYW1lIGJpdExlbmd0aCBhcyBOLCB0aGF0IHNhdGlzZmllcyB0aGUgSmFjb2JpIG9mIHcgaXMgLTEgd3J0IE4uXG4gKiBAcmV0dXJucyB7YmlnaW50W119IC0gc2V0IG9mIGNoYWxsZW5nZXMgZm9yIE5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVZKE4sIHcpOiBiaWdpbnRbXSB7XG4gIGNvbnN0IE5CdWYgPSBiaWdJbnRUb0J1ZmZlckJFKE4pO1xuICBjb25zdCB3QnVmID0gYmlnSW50VG9CdWZmZXJCRSh3LCBOQnVmLmxlbmd0aCk7XG4gIHJldHVybiBBcnJheShtKVxuICAgIC5maWxsKG51bGwpXG4gICAgLm1hcCgoXywgaSkgPT4ge1xuICAgICAgY29uc3QgaCA9IGJpZ0ludEZyb21CdWZmZXJCRShcbiAgICAgICAgY3JlYXRlSG1hYygnc2hhMjU2JywgQnVmZmVyLmZyb20oW2ldKSlcbiAgICAgICAgICAudXBkYXRlKE5CdWYpXG4gICAgICAgICAgLnVwZGF0ZSh3QnVmKVxuICAgICAgICAgIC5kaWdlc3QoKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBoICogaDtcbiAgICB9KTtcbn1cblxuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSmFjb2JpX3N5bWJvbCNJbXBsZW1lbnRhdGlvbl9pbl9DKytcbmZ1bmN0aW9uIGphY29iaShhLCBuKTogYmlnaW50IHtcbiAgLy8gYS9uIGlzIHJlcHJlc2VudGVkIGFzIChhLG4pXG4gIGlmIChuIDw9IEJpZ0ludCgwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbiBtdXN0IGdyZWF0ZXIgdGhhbiAwJyk7XG4gIH1cbiAgaWYgKG4gJSBCaWdJbnQoMikgIT09IEJpZ0ludCgxKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbiBtdXN0IGJlIG9kZCcpO1xuICB9XG4gIC8vIHN0ZXAgMVxuICBhID0gYSAlIG47XG4gIGxldCB0ID0gQmlnSW50KDEpO1xuICBsZXQgcjtcbiAgLy8gc3RlcCAzXG4gIHdoaWxlIChhICE9PSBCaWdJbnQoMCkpIHtcbiAgICAvLyBzdGVwIDJcbiAgICB3aGlsZSAoYSAlIEJpZ0ludCgyKSA9PT0gQmlnSW50KDApKSB7XG4gICAgICBhIC89IEJpZ0ludCgyKTtcbiAgICAgIHIgPSBuICUgQmlnSW50KDgpO1xuICAgICAgaWYgKHIgPT09IEJpZ0ludCgzKSB8fCByID09PSBCaWdJbnQoNSkpIHtcbiAgICAgICAgdCA9IC10O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBzdGVwIDRcbiAgICByID0gbjtcbiAgICBuID0gYTtcbiAgICBhID0gcjtcbiAgICBpZiAoYSAlIEJpZ0ludCg0KSA9PT0gQmlnSW50KDMpICYmIG4gJSBCaWdJbnQoNCkgPT09IEJpZ0ludCgzKSkge1xuICAgICAgdCA9IC10O1xuICAgIH1cbiAgICBhID0gYSAlIG47XG4gIH1cbiAgaWYgKG4gPT09IEJpZ0ludCgxKSkge1xuICAgIHJldHVybiB0O1xuICB9XG4gIHJldHVybiBCaWdJbnQoMCk7XG59XG5cbi8qKlxuICogUHJvdmUgdGhhdCBhIG1vZHVsdXMgKHAqcSkgaXMgdGhlIHByb2R1Y3Qgb2YgdHdvIGxhcmdlIHNhZmUgcHJpbWVzIChwIGFuZCBxKS5cbiAqIEBwYXJhbSB7YmlnaW50fSBwIFRoZSBsYXJnZXIgcHJpbWUgZmFjdG9yIG9mIHRoZSBtb2R1bHVzXG4gKiBAcGFyYW0ge2JpZ2ludH0gcSBUaGUgc21hbGxlciBwcmltZSBmYWN0b3Igb2YgdGhlIG1vZHVsdXMuXG4gKiBAcmV0dXJucyB7RGVzZXJpYWxpemVkUGFpbGxpZXJCbHVtUHJvb2Z9IFRoZSBwcm9vZiB0aGF0IHRoZSBtb2R1bHVzIGlzIHRoZSBwcm9kdWN0IG9mIHR3byBsYXJnZSBwcmltZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92ZShwOiBiaWdpbnQsIHE6IGJpZ2ludCk6IFByb21pc2U8RGVzZXJpYWxpemVkUGFpbGxpZXJCbHVtUHJvb2Y+IHtcbiAgLy8gUHJvdmVyIHNlbGVjdHMgcmFuZG9tIHcgd2l0aCBKYWNvYmkgc3ltYm9sIDEgd3J0IE4uXG4gIGNvbnN0IE4gPSBwICogcTtcbiAgY29uc3QgbCA9IChwIC0gQmlnSW50KDEpKSAqIChxIC0gQmlnSW50KDEpKTtcbiAgY29uc3QgZCA9IG1vZEludihOLCBsKTtcbiAgbGV0IHc7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdyA9IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShhd2FpdCByYW5kQml0cyhiaXRMZW5ndGgoTikpKSk7XG4gICAgaWYgKGphY29iaSh3LCBOKSA9PT0gQmlnSW50KC0xKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8vIFRoaXMgaXMgY2FsY3VsYXRpbmcgdGhlIGludmVyc2Ugb2YgdGhlIGZ1bmN0aW9uIHleNCBtb2QgTixcbiAgLy8gaS5lLnkgXiAoMSAvIDQpLCB3aGVyZSBOID0gcHEgaXMgYSBibHVtIGludGVnZXIgdXNpbmcgSE9DIC0gRmFjdCAyLjE2MFxuICAvLyBmcm9tIGNhY3IudXdhdGVybG9vLmNhIC8gaGFjIC8gYWJvdXQgLyBjaGFwMi5wZGZcbiAgLy8gUHJvdmVyIGdlbmVyYXRlcyB5X2kuXG4gIGNvbnN0IHkgPSBnZW5lcmF0ZVkoTiwgdyk7XG4gIC8vIFByb3ZlciBjYWxjdWxhdGVzIHpfaSA9IHlfaSBeIGQgbW9kIE5cbiAgY29uc3QgeiA9IHkubWFwKCh5X2kpID0+IG1vZFBvdyh5X2ksIGQsIE4pKTtcbiAgLy8gUHJvdmVyIGNhbGN1bGF0ZXMgeF9pID0geV9pIF4gMS80IG1vZCBOIHVzaW5nIFtIT0MgLSBGYWN0IDIuMTYwXVxuICBjb25zdCBlID0gKChsICsgQmlnSW50KDQpKSAvIEJpZ0ludCg4KSkgKiogQmlnSW50KDIpO1xuICBjb25zdCB4ID0geS5tYXAoKHlfaSkgPT4gbW9kUG93KHlfaSwgZSwgTikpO1xuICByZXR1cm4geyB3LCB4LCB6IH07XG59XG5cbi8qKlxuICogVmVyaWZ5IHRoYXQgTiBpcyB0aGUgcHJvZHVjdCBvZiB0d28gbGFyZ2UgcHJpbWVzLlxuICogQHBhcmFtIHtiaWdpbnR9IE4gVGhlIHByaW1lIG51bWJlciBiZWluZyB2ZXJpZmllZC5cbiAqIEBwYXJhbSB7RGVzZXJpYWxpemVkUGFpbGxpZXJCbHVtUHJvb2Z9IFRoZSBwcm9vZiB0byB2ZXJpZnkgTiBpcyBhIHByb2R1Y3Qgb2YgdHdvIGxhcmdlIHByaW1lcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIE4gaXMgYSBwcm9kdWN0IG9mIHR3byBsYXJnZSBwcmltZXMsIGFuZCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnkoTjogYmlnaW50LCB7IHcsIHgsIHogfTogRGVzZXJpYWxpemVkUGFpbGxpZXJCbHVtUHJvb2YpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gVmVyaWZpZXIgY2hlY2tzIE4gPiAxLlxuICBpZiAoTiA8PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEnKTtcbiAgfVxuICAvLyBWZXJpZmllciBjaGVja3MgTiBpcyBvZGQuXG4gIGlmIChOICUgQmlnSW50KDIpICE9PSBCaWdJbnQoMSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ04gbXVzdCBiZSBhbiBvZGQgbnVtYmVyJyk7XG4gIH1cbiAgLy8gVmVyaWZpZXIgY2hlY2tzIE4gaXMgbm90IHByaW1lLlxuICBpZiAoYXdhaXQgaXNQcm9iYWJseVByaW1lKE4sIDI0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTiBtdXN0IGJlIGEgY29tcG9zaXRlIG51bWJlcicpO1xuICB9XG4gIC8vIFZlcmlmaWVyIGNoZWNrcyB0aGF0IHRoZSBKYWNvYmkgc3ltYm9sIGZvciB3IGlzIDEgd3J0IE4uXG4gIGlmIChqYWNvYmkodywgTikgIT09IEJpZ0ludCgtMSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0phY29iaSBzeW1ib2wgb2YgdyBtdXN0IGJlIC0xIHdydCB0byBOJyk7XG4gIH1cbiAgLy8gVmVyaWZpZXIgZ2VuZXJhdGVzIHlfaS5cbiAgY29uc3QgeSA9IGdlbmVyYXRlWShOLCB3KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtOyBpKyspIHtcbiAgICAvLyBWZXJpZmllciBjaGVja3Mgel9pIF4gTiBtb2QgTiA9PSB5X2kuXG4gICAgaWYgKG1vZFBvdyh6W2ldLCBOLCBOKSAhPT0geVtpXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYWlsbGllciB2ZXJpZmljYXRpb24gb2Ygelske2l9XSBmYWlsZWRgKTtcbiAgICB9XG4gICAgLy8gVmVyaWZpZXIgY2hlY2tzIHhfaSBeIDQgbW9kIE4gPT0geV9pLlxuICAgIGlmIChtb2RQb3coeFtpXSwgNCwgTikgIT09IHlbaV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGFpbGxpZXIgdmVyaWZpY2F0aW9uIG9mIHhbJHtpfV0gZmFpbGVkYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIl19
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFpbGxpZXJCbHVtUHJvb2YuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VjZHNhL3BhaWxsaWVyQmx1bVByb29mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFvQztBQUNwQyw2REFBMkU7QUFDM0UsdURBQXVEO0FBQ3ZELHFDQUFrRTtBQUdsRSxzQkFBc0I7QUFDdEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBRWI7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNyQixNQUFNLElBQUksR0FBRyx1QkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxNQUFNLElBQUksR0FBRyx1QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDWixJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDVCxPQUFPLElBQUksRUFBRTtZQUNYLElBQUksQ0FBQyxHQUFHLHlCQUFrQjtZQUN4Qiw0RUFBNEU7WUFDNUUsbUNBQW1DO1lBQ25DLG1CQUFVLENBQUMsVUFBVSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQywrQkFBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ3pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNoQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUM7aUJBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQztpQkFDWCxNQUFNLENBQUMsSUFBSSxDQUFD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J2NyeXB0byc7XG5pbXBvcnQgeyBiaXRMZW5ndGgsIHJhbmRCaXRzLCBpc1Byb2JhYmx5UHJpbWUgfSBmcm9tICdiaWdpbnQtY3J5cHRvLXV0aWxzJztcbmltcG9ydCB7IGdjZCwgbW9kSW52LCBtb2RQb3cgfSBmcm9tICdiaWdpbnQtbW9kLWFyaXRoJztcbmltcG9ydCB7IGJpZ0ludEZyb21CdWZmZXJCRSwgYmlnSW50VG9CdWZmZXJCRSB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkUGFpbGxpZXJCbHVtUHJvb2YgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gU2VjdXJpdHkgcGFyYW1ldGVyLlxuY29uc3QgbSA9IDgwO1xuXG4vKipcbiAqIEdlbmVyYXRlIHBzdWVkby1yYW5kb20gcXVhZHJhdGljIHJlc2lkdWUgZm9yIChOLCB3LCBpKS5cbiAqIEBwYXJhbSBOIC0gdGhlIHByaW1lIG51bWJlciB0byB2ZXJpZnkgaXMgYSBwcm9kdWN0IG9mIHR3byBsYXJnZSBwcmltZXMuXG4gKiBAcGFyYW0gdyAtIGEgcmFuZG9tIG51bWJlciB3aXRoIHRoZSBzYW1lIGJpdExlbmd0aCBhcyBOLCB0aGF0IHNhdGlzZmllcyB0aGUgSmFjb2JpIG9mIHcgaXMgLTEgd3J0IE4uXG4gKiBAcmV0dXJucyB7YmlnaW50W119IC0gc2V0IG9mIGNoYWxsZW5nZXMgZm9yIE5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVZKE4sIHcpOiBiaWdpbnRbXSB7XG4gIGNvbnN0IE5CdWYgPSBiaWdJbnRUb0J1ZmZlckJFKE4pO1xuICBjb25zdCB3QnVmID0gYmlnSW50VG9CdWZmZXJCRSh3LCBOQnVmLmxlbmd0aCk7XG4gIGxldCBjb3VudGVyID0gMDtcbiAgcmV0dXJuIEFycmF5KG0pXG4gICAgLmZpbGwobnVsbClcbiAgICAubWFwKChfKSA9PiB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgaCA9IGJpZ0ludEZyb21CdWZmZXJCRShcbiAgICAgICAgICAvLyBUeXBlU2NyaXB0IGRvZXNuJ3QgbGlrZSB1cyB1c2luZyBgb3V0cHV0TGVuZ3RoYCBpbiB0aGUgdHJhbnNmb3JtIG9wdGlvbnMsXG4gICAgICAgICAgLy8gYnV0IGl0IGlzIHJlcXVpcmVkIGZvciBzaGFrZTI1Ni5cbiAgICAgICAgICBjcmVhdGVIYXNoKCdzaGFrZTI1NicsIHsgb3V0cHV0TGVuZ3RoOiBNYXRoLmZsb29yKChiaXRMZW5ndGgoTikgKyA3KSAvIDgpIH0pXG4gICAgICAgICAgICAudXBkYXRlKEJ1ZmZlci5mcm9tKFtjb3VudGVyKytdKSlcbiAgICAgICAgICAgIC51cGRhdGUoJyQnKVxuICAgICAgICAgICAgLnVwZGF0ZShOQnVmKVxuICAgICAgICAgICAgLnVwZGF0ZSgnJCcpXG4gICAgICAgICAgICAudXBkYXRlKHdCdWYpXG4gICAgICAgICAgICAudXBkYXRlKCckJylcbiAgICAgICAgICAgIC5kaWdlc3QoKVxuICAgICAgICApO1xuICAgICAgICBoID0gKGggKiBoKSAlIE47XG4gICAgICAgIGlmIChnY2QoaCwgTikgPT09IEJpZ0ludCgxKSkge1xuICAgICAgICAgIHJldHVybiBoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG59XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0phY29iaV9zeW1ib2wjSW1wbGVtZW50YXRpb25faW5fQysrXG5mdW5jdGlvbiBqYWNvYmkoYSwgbik6IGJpZ2ludCB7XG4gIC8vIGEvbiBpcyByZXByZXNlbnRlZCBhcyAoYSxuKVxuICBpZiAobiA8PSBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ24gbXVzdCBncmVhdGVyIHRoYW4gMCcpO1xuICB9XG4gIGlmIChuICUgQmlnSW50KDIpICE9PSBCaWdJbnQoMSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ24gbXVzdCBiZSBvZGQnKTtcbiAgfVxuICAvLyBzdGVwIDFcbiAgYSA9IGEgJSBuO1xuICBsZXQgdCA9IEJpZ0ludCgxKTtcbiAgbGV0IHI7XG4gIC8vIHN0ZXAgM1xuICB3aGlsZSAoYSAhPT0gQmlnSW50KDApKSB7XG4gICAgLy8gc3RlcCAyXG4gICAgd2hpbGUgKGEgJSBCaWdJbnQoMikgPT09IEJpZ0ludCgwKSkge1xuICAgICAgYSAvPSBCaWdJbnQoMik7XG4gICAgICByID0gbiAlIEJpZ0ludCg4KTtcbiAgICAgIGlmIChyID09PSBCaWdJbnQoMykgfHwgciA9PT0gQmlnSW50KDUpKSB7XG4gICAgICAgIHQgPSAtdDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gc3RlcCA0XG4gICAgciA9IG47XG4gICAgbiA9IGE7XG4gICAgYSA9IHI7XG4gICAgaWYgKGEgJSBCaWdJbnQoNCkgPT09IEJpZ0ludCgzKSAmJiBuICUgQmlnSW50KDQpID09PSBCaWdJbnQoMykpIHtcbiAgICAgIHQgPSAtdDtcbiAgICB9XG4gICAgYSA9IGEgJSBuO1xuICB9XG4gIGlmIChuID09PSBCaWdJbnQoMSkpIHtcbiAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gQmlnSW50KDApO1xufVxuXG4vKipcbiAqIFByb3ZlIHRoYXQgYSBtb2R1bHVzIChwKnEpIGlzIHRoZSBwcm9kdWN0IG9mIHR3byBsYXJnZSBzYWZlIHByaW1lcyAocCBhbmQgcSkuXG4gKiBAcGFyYW0ge2JpZ2ludH0gcCBUaGUgbGFyZ2VyIHByaW1lIGZhY3RvciBvZiB0aGUgbW9kdWx1c1xuICogQHBhcmFtIHtiaWdpbnR9IHEgVGhlIHNtYWxsZXIgcHJpbWUgZmFjdG9yIG9mIHRoZSBtb2R1bHVzLlxuICogQHJldHVybnMge0Rlc2VyaWFsaXplZFBhaWxsaWVyQmx1bVByb29mfSBUaGUgcHJvb2YgdGhhdCB0aGUgbW9kdWx1cyBpcyB0aGUgcHJvZHVjdCBvZiB0d28gbGFyZ2UgcHJpbWVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvdmUocDogYmlnaW50LCBxOiBiaWdpbnQpOiBQcm9taXNlPERlc2VyaWFsaXplZFBhaWxsaWVyQmx1bVByb29mPiB7XG4gIC8vIFByb3ZlciBzZWxlY3RzIHJhbmRvbSB3IHdpdGggSmFjb2JpIHN5bWJvbCAxIHdydCBOLlxuICBjb25zdCBOID0gcCAqIHE7XG4gIGNvbnN0IGwgPSAocCAtIEJpZ0ludCgxKSkgKiAocSAtIEJpZ0ludCgxKSk7XG4gIGNvbnN0IGQgPSBtb2RJbnYoTiwgbCk7XG4gIGxldCB3O1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHcgPSBiaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oYXdhaXQgcmFuZEJpdHMoYml0TGVuZ3RoKE4pKSkpO1xuICAgIGlmIChqYWNvYmkodywgTikgPT09IEJpZ0ludCgtMSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvLyBUaGlzIGlzIGNhbGN1bGF0aW5nIHRoZSBpbnZlcnNlIG9mIHRoZSBmdW5jdGlvbiB5XjQgbW9kIE4sXG4gIC8vIGkuZS55IF4gKDEgLyA0KSwgd2hlcmUgTiA9IHBxIGlzIGEgYmx1bSBpbnRlZ2VyIHVzaW5nIEhPQyAtIEZhY3QgMi4xNjBcbiAgLy8gZnJvbSBjYWNyLnV3YXRlcmxvby5jYSAvIGhhYyAvIGFib3V0IC8gY2hhcDIucGRmXG4gIC8vIFByb3ZlciBnZW5lcmF0ZXMgeV9pLlxuICBjb25zdCB5ID0gZ2VuZXJhdGVZKE4sIHcpO1xuICAvLyBQcm92ZXIgY2FsY3VsYXRlcyB6X2kgPSB5X2kgXiBkIG1vZCBOXG4gIGNvbnN0IHogPSB5Lm1hcCgoeV9pKSA9PiBtb2RQb3coeV9pLCBkLCBOKSk7XG4gIC8vIFByb3ZlciBjYWxjdWxhdGVzIHhfaSA9IHlfaSBeIDEvNCBtb2QgTiB1c2luZyBbSE9DIC0gRmFjdCAyLjE2MF1cbiAgY29uc3QgZSA9ICgobCArIEJpZ0ludCg0KSkgLyBCaWdJbnQoOCkpICoqIEJpZ0ludCgyKTtcbiAgY29uc3QgeCA9IHkubWFwKCh5X2kpID0+IG1vZFBvdyh5X2ksIGUsIE4pKTtcbiAgcmV0dXJuIHsgdywgeCwgeiB9O1xufVxuXG4vKipcbiAqIFZlcmlmeSB0aGF0IE4gaXMgdGhlIHByb2R1Y3Qgb2YgdHdvIGxhcmdlIHByaW1lcy5cbiAqIEBwYXJhbSB7YmlnaW50fSBOIFRoZSBwcmltZSBudW1iZXIgYmVpbmcgdmVyaWZpZWQuXG4gKiBAcGFyYW0ge0Rlc2VyaWFsaXplZFBhaWxsaWVyQmx1bVByb29mfSBUaGUgcHJvb2YgdG8gdmVyaWZ5IE4gaXMgYSBwcm9kdWN0IG9mIHR3byBsYXJnZSBwcmltZXMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBOIGlzIGEgcHJvZHVjdCBvZiB0d28gbGFyZ2UgcHJpbWVzLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5KE46IGJpZ2ludCwgeyB3LCB4LCB6IH06IERlc2VyaWFsaXplZFBhaWxsaWVyQmx1bVByb29mKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIFZlcmlmaWVyIGNoZWNrcyBOID4gMS5cbiAgaWYgKE4gPD0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxJyk7XG4gIH1cbiAgLy8gVmVyaWZpZXIgY2hlY2tzIE4gaXMgb2RkLlxuICBpZiAoTiAlIEJpZ0ludCgyKSAhPT0gQmlnSW50KDEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOIG11c3QgYmUgYW4gb2RkIG51bWJlcicpO1xuICB9XG4gIC8vIFZlcmlmaWVyIGNoZWNrcyBOIGlzIG5vdCBwcmltZS5cbiAgaWYgKGF3YWl0IGlzUHJvYmFibHlQcmltZShOLCAyNCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ04gbXVzdCBiZSBhIGNvbXBvc2l0ZSBudW1iZXInKTtcbiAgfVxuICAvLyBWZXJpZmllciBjaGVja3MgdGhhdCB0aGUgSmFjb2JpIHN5bWJvbCBmb3IgdyBpcyAxIHdydCBOLlxuICBpZiAoamFjb2JpKHcsIE4pICE9PSBCaWdJbnQoLTEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdKYWNvYmkgc3ltYm9sIG9mIHcgbXVzdCBiZSAtMSB3cnQgdG8gTicpO1xuICB9XG4gIC8vIFZlcmlmaWVyIGdlbmVyYXRlcyB5X2kuXG4gIGNvbnN0IHkgPSBnZW5lcmF0ZVkoTiwgdyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbTsgaSsrKSB7XG4gICAgLy8gVmVyaWZpZXIgY2hlY2tzIHpfaSBeIE4gbW9kIE4gPT0geV9pLlxuICAgIGlmIChtb2RQb3coeltpXSwgTiwgTikgIT09IHlbaV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGFpbGxpZXIgdmVyaWZpY2F0aW9uIG9mIHpbJHtpfV0gZmFpbGVkYCk7XG4gICAgfVxuICAgIC8vIFZlcmlmaWVyIGNoZWNrcyB4X2kgXiA0IG1vZCBOID09IHlfaS5cbiAgICBpZiAobW9kUG93KHhbaV0sIDQsIE4pICE9PSB5W2ldKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhaWxsaWVyIHZlcmlmaWNhdGlvbiBvZiB4WyR7aX1dIGZhaWxlZGApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rangeproof.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa/rangeproof.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EAEvB,UAAU,EACV,mBAAmB,EACnB,4BAA4B,EAC7B,MAAM,SAAS,CAAC;AAQjB,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOhF;AAwBD;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,SAAS,SAAsB,GAAG,OAAO,CAAC,4BAA4B,CAAC,CA2C3G;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,kBAAkB,EAC1B,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,uBAAuB,CAAC,CAsBlC;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,uBAAuB,GACnC,OAAO,CAAC,OAAO,CAAC,CA0ClB;AACD;;;;;;;;;;GAUG;AACH,wBAAsB,KAAK,CACzB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,kBAAkB,EAC1B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,OAAO,CAAC,UAAU,CAAC,CAgCrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,UAAU,EACjB,CAAC,EAAE,MAAM,GACR,OAAO,
|
|
1
|
+
{"version":3,"file":"rangeproof.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa/rangeproof.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EAEvB,UAAU,EACV,mBAAmB,EACnB,4BAA4B,EAC7B,MAAM,SAAS,CAAC;AAQjB,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOhF;AAwBD;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,SAAS,SAAsB,GAAG,OAAO,CAAC,4BAA4B,CAAC,CA2C3G;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,kBAAkB,EAC1B,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,uBAAuB,CAAC,CAsBlC;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,uBAAuB,GACnC,OAAO,CAAC,OAAO,CAAC,CA0ClB;AACD;;;;;;;;;;GAUG;AACH,wBAAsB,KAAK,CACzB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,kBAAkB,EAC1B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,OAAO,CAAC,UAAU,CAAC,CAgCrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,UAAU,EACjB,CAAC,EAAE,MAAM,GACR,OAAO,CAmCT;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,kBAAkB,EAC1B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,OAAO,CAAC,mBAAmB,CAAC,CAoD9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,mBAAmB,EAC1B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,CAAC,EAAE,MAAM,GACR,OAAO,CAiET"}
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyWithCheck = exports.proveWithCheck = exports.verify = exports.prove = exports.verifyNtildeProof = exports.generateNtildeProof = exports.generateNtilde = exports.generateSafePrimes = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Zero Knowledge Range Proofs as described in (Two-party generation of DSA signatures)[1].
|
|
6
|
+
* [1]: https://reitermk.github.io/papers/2004/IJIS.pdf
|
|
7
|
+
*/
|
|
8
|
+
const crypto_1 = require("crypto");
|
|
9
|
+
const bigint_crypto_utils_1 = require("bigint-crypto-utils");
|
|
10
|
+
const bigint_mod_arith_1 = require("bigint-mod-arith");
|
|
11
|
+
const util_1 = require("../../util");
|
|
12
|
+
const openssl_1 = require("../../openssl");
|
|
13
|
+
const index_1 = require("./index");
|
|
14
|
+
// 128 as recommend by https://blog.verichains.io/p/vsa-2022-120-multichain-key-extraction.
|
|
15
|
+
const ITERATIONS = 128;
|
|
16
|
+
async function generateSafePrimes(bitLengths) {
|
|
17
|
+
const openSSL = new openssl_1.OpenSSL();
|
|
18
|
+
await openSSL.init();
|
|
19
|
+
const promises = bitLengths.map((bitlength) => {
|
|
20
|
+
return openSSL.generateSafePrime(bitlength);
|
|
21
|
+
});
|
|
22
|
+
return await Promise.all(promises);
|
|
23
|
+
}
|
|
24
|
+
exports.generateSafePrimes = generateSafePrimes;
|
|
25
|
+
async function generateModulus(bitlength = index_1.minModulusBitLength, retry = 10) {
|
|
26
|
+
if (bitlength < index_1.minModulusBitLength) {
|
|
27
|
+
// https://www.keylength.com/en/6/
|
|
28
|
+
// eslint-disable-next-line no-console
|
|
29
|
+
console.warn('Generating a modulus with less than 3072 is not recommended!');
|
|
30
|
+
}
|
|
31
|
+
const bitlengthP = Math.floor(bitlength / 2);
|
|
32
|
+
const bitlengthQ = bitlength - bitlengthP;
|
|
33
|
+
for (let i = 0; i < retry; i++) {
|
|
34
|
+
const [p, q] = await generateSafePrimes([bitlengthP, bitlengthQ]);
|
|
35
|
+
const n = p * q;
|
|
36
|
+
// For large bit lengths, the probability of generating a modulus with the wrong bit length is very low.
|
|
37
|
+
if (bigint_crypto_utils_1.bitLength(n) !== bitlength) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
return { n, q1: (p - BigInt(1)) / BigInt(2), q2: (q - BigInt(1)) / BigInt(2) };
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`Unable to generate modulus with bit length of ${bitlength} after ${retry} tries. Please try again or reach out to support@bitgo.com`);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Generate "challenge" values for range proofs.
|
|
46
|
+
* @param {number} bitlength The bit length of the modulus to generate. This should
|
|
47
|
+
* be the same as the bit length of the paillier public keys used for MtA.
|
|
48
|
+
* @returns {DeserializedNtilde} The generated Ntilde values.
|
|
49
|
+
*/
|
|
50
|
+
async function generateNtilde(bitlength = index_1.minModulusBitLength) {
|
|
51
|
+
const { n: ntilde, q1, q2 } = await generateModulus(bitlength);
|
|
52
|
+
const [f1, f2] = await Promise.all([util_1.randomPositiveCoPrimeTo(ntilde), util_1.randomPositiveCoPrimeTo(ntilde)]);
|
|
53
|
+
const h1 = bigint_mod_arith_1.modPow(f1, BigInt(2), ntilde);
|
|
54
|
+
const h2 = bigint_mod_arith_1.modPow(h1, f2, ntilde);
|
|
55
|
+
const beta = bigint_mod_arith_1.modInv(f2, q1 * q2);
|
|
56
|
+
const [h1wrtH2Proofs, h2wrtH1Proofs] = await Promise.all([
|
|
57
|
+
generateNtildeProof({
|
|
58
|
+
h1: h1,
|
|
59
|
+
h2: h2,
|
|
60
|
+
ntilde: ntilde,
|
|
61
|
+
}, f2, q1, q2),
|
|
62
|
+
generateNtildeProof({
|
|
63
|
+
h1: h2,
|
|
64
|
+
h2: h1,
|
|
65
|
+
ntilde: ntilde,
|
|
66
|
+
}, beta, q1, q2),
|
|
67
|
+
]);
|
|
68
|
+
return {
|
|
69
|
+
ntilde,
|
|
70
|
+
h1,
|
|
71
|
+
h2,
|
|
72
|
+
ntildeProof: {
|
|
73
|
+
h1WrtH2: {
|
|
74
|
+
alpha: h1wrtH2Proofs.alpha,
|
|
75
|
+
t: h1wrtH2Proofs.t,
|
|
76
|
+
},
|
|
77
|
+
h2WrtH1: {
|
|
78
|
+
alpha: h2wrtH1Proofs.alpha,
|
|
79
|
+
t: h2wrtH1Proofs.t,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
exports.generateNtilde = generateNtilde;
|
|
85
|
+
/**
|
|
86
|
+
* Generate iterations of Ntilde, h1, h2 discrete log proofs.
|
|
87
|
+
* @param {DeserializedNtilde} ntilde Ntilde, h1, h2 to generate the proofs for.
|
|
88
|
+
* @param {bigint} x Either alpha or beta depending on whether it is a discrete log proof of
|
|
89
|
+
* h1 w.r.t h2 or h2 w.r.t h1.
|
|
90
|
+
* @param {bigint} q1 The Sophie Germain prime associated with the first safe prime p1 used to generate Ntilde.
|
|
91
|
+
* @param {bigint} q2 The Sophie Germain prime associated with the second safe prime p2 used to generate Ntilde.
|
|
92
|
+
* @returns {NtildeProof} The generated Ntilde Proofs.
|
|
93
|
+
*/
|
|
94
|
+
async function generateNtildeProof(ntilde, x, q1, q2) {
|
|
95
|
+
const q1MulQ2 = q1 * q2;
|
|
96
|
+
const a = [];
|
|
97
|
+
const alpha = [];
|
|
98
|
+
let msgToHash = Buffer.concat([
|
|
99
|
+
util_1.bigIntToBufferBE(ntilde.h1),
|
|
100
|
+
util_1.bigIntToBufferBE(ntilde.h2),
|
|
101
|
+
util_1.bigIntToBufferBE(ntilde.ntilde),
|
|
102
|
+
]);
|
|
103
|
+
for (let i = 0; i < ITERATIONS; i++) {
|
|
104
|
+
a.push(bigint_crypto_utils_1.randBetween(q1MulQ2));
|
|
105
|
+
alpha.push(bigint_mod_arith_1.modPow(ntilde.h1, a[i], ntilde.ntilde));
|
|
106
|
+
msgToHash = Buffer.concat([msgToHash, util_1.bigIntToBufferBE(alpha[i], Math.ceil(bigint_crypto_utils_1.bitLength(ntilde.ntilde) / 8))]);
|
|
107
|
+
}
|
|
108
|
+
const simulatedResponse = crypto_1.createHash('sha256').update(msgToHash).digest();
|
|
109
|
+
const t = [];
|
|
110
|
+
for (let i = 0; i < ITERATIONS; i++) {
|
|
111
|
+
// Get the ith bit from a buffer of bytes.
|
|
112
|
+
const ithBit = (simulatedResponse[Math.floor(i / 8)] >> (7 - (i % 8))) & 1;
|
|
113
|
+
t.push((a[i] + ((BigInt(ithBit) * x) % q1MulQ2)) % q1MulQ2);
|
|
114
|
+
}
|
|
115
|
+
return { alpha, t };
|
|
116
|
+
}
|
|
117
|
+
exports.generateNtildeProof = generateNtildeProof;
|
|
118
|
+
/**
|
|
119
|
+
* Verify discrete log proofs of h1 and h2 mod Ntilde.
|
|
120
|
+
* @param {DeserializedNtilde} ntilde Ntilde, h1, h2 to generate the proofs for.
|
|
121
|
+
* @param {DeserializedNtildeProof} ntildeProof Ntilde Proofs
|
|
122
|
+
* @returns {boolean} true if proof is verified, false otherwise.
|
|
123
|
+
*/
|
|
124
|
+
async function verifyNtildeProof(ntilde, ntildeProof) {
|
|
125
|
+
const h1ModNtilde = ntilde.h1 % ntilde.ntilde;
|
|
126
|
+
const h2ModNtilde = ntilde.h2 % ntilde.ntilde;
|
|
127
|
+
if (h1ModNtilde === BigInt(0) || h2ModNtilde === BigInt(0)) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
if (h1ModNtilde === BigInt(1) || h2ModNtilde === BigInt(1)) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
if (h1ModNtilde === h2ModNtilde) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
if (ntildeProof.alpha.length > 256 ||
|
|
137
|
+
ntildeProof.alpha.length !== ITERATIONS ||
|
|
138
|
+
ntildeProof.t.length !== ITERATIONS) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
let msgToHash = Buffer.concat([
|
|
142
|
+
util_1.bigIntToBufferBE(ntilde.h1),
|
|
143
|
+
util_1.bigIntToBufferBE(ntilde.h2),
|
|
144
|
+
util_1.bigIntToBufferBE(ntilde.ntilde),
|
|
145
|
+
]);
|
|
146
|
+
for (let i = 0; i < ntildeProof.alpha.length; i++) {
|
|
147
|
+
msgToHash = Buffer.concat([
|
|
148
|
+
msgToHash,
|
|
149
|
+
util_1.bigIntToBufferBE(ntildeProof.alpha[i], Math.ceil(bigint_crypto_utils_1.bitLength(ntilde.ntilde) / 8)),
|
|
150
|
+
]);
|
|
151
|
+
}
|
|
152
|
+
const simulatedResponse = crypto_1.createHash('sha256').update(msgToHash).digest();
|
|
153
|
+
for (let i = 0; i < ntildeProof.alpha.length; i++) {
|
|
154
|
+
// Get the ith bit from a buffer of bytes.
|
|
155
|
+
const ithBit = (simulatedResponse[Math.floor(i / 8)] >> (7 - (i % 8))) & 1;
|
|
156
|
+
const h1PowTi = bigint_mod_arith_1.modPow(ntilde.h1, ntildeProof.t[i], ntilde.ntilde);
|
|
157
|
+
const h2PowCi = bigint_mod_arith_1.modPow(ntilde.h2, BigInt(ithBit), ntilde.ntilde);
|
|
158
|
+
const alphaMulh2PowCi = (ntildeProof.alpha[i] * h2PowCi) % ntilde.ntilde;
|
|
159
|
+
if (h1PowTi !== alphaMulh2PowCi) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
exports.verifyNtildeProof = verifyNtildeProof;
|
|
166
|
+
/**
|
|
167
|
+
* Generate a zero-knowledge range proof that an encrypted value is "small".
|
|
168
|
+
* @param {BaseCurve} curve An elliptic curve to use for group operations.
|
|
169
|
+
* @param {number} modulusBits The bit count of the prover's public key.
|
|
170
|
+
* @param {PublicKey} pk The prover's public key.
|
|
171
|
+
* @param {DeserializedNtilde} ntilde The verifier's Ntilde values.
|
|
172
|
+
* @param {bigint} c The ciphertext.
|
|
173
|
+
* @param {bigint} m The plaintext.
|
|
174
|
+
* @param {bigint} r The obfuscation value used to encrypt m.
|
|
175
|
+
* @returns {RangeProof} The generated proof.
|
|
176
|
+
*/
|
|
177
|
+
async function prove(curve, modulusBits, pk, ntilde, c, m, r) {
|
|
178
|
+
const modulusBytes = Math.floor((modulusBits + 7) / 8);
|
|
179
|
+
const q = curve.order();
|
|
180
|
+
const q3 = q ** BigInt(3);
|
|
181
|
+
const qntilde = q * ntilde.ntilde;
|
|
182
|
+
const q3ntilde = q3 * ntilde.ntilde;
|
|
183
|
+
const alpha = bigint_crypto_utils_1.randBetween(q3);
|
|
184
|
+
const beta = await util_1.randomPositiveCoPrimeTo(pk.n);
|
|
185
|
+
const gamma = bigint_crypto_utils_1.randBetween(q3ntilde);
|
|
186
|
+
const rho = bigint_crypto_utils_1.randBetween(qntilde);
|
|
187
|
+
const z = (bigint_mod_arith_1.modPow(ntilde.h1, m, ntilde.ntilde) * bigint_mod_arith_1.modPow(ntilde.h2, rho, ntilde.ntilde)) % ntilde.ntilde;
|
|
188
|
+
const u = (bigint_mod_arith_1.modPow(pk.g, alpha, pk._n2) * bigint_mod_arith_1.modPow(beta, pk.n, pk._n2)) % pk._n2;
|
|
189
|
+
const w = (bigint_mod_arith_1.modPow(ntilde.h1, alpha, ntilde.ntilde) * bigint_mod_arith_1.modPow(ntilde.h2, gamma, ntilde.ntilde)) % ntilde.ntilde;
|
|
190
|
+
const hash = crypto_1.createHash('sha256');
|
|
191
|
+
hash.update('\x06\x00\x00\x00\x00\x00\x00\x00');
|
|
192
|
+
hash.update(util_1.bigIntToBufferBE(pk.n, modulusBytes));
|
|
193
|
+
hash.update('$');
|
|
194
|
+
hash.update(util_1.bigIntToBufferBE(pk.g, modulusBytes));
|
|
195
|
+
hash.update('$');
|
|
196
|
+
hash.update(util_1.bigIntToBufferBE(c, 2 * modulusBytes));
|
|
197
|
+
hash.update('$');
|
|
198
|
+
hash.update(util_1.bigIntToBufferBE(z, modulusBytes));
|
|
199
|
+
hash.update('$');
|
|
200
|
+
hash.update(util_1.bigIntToBufferBE(u, 2 * modulusBytes));
|
|
201
|
+
hash.update('$');
|
|
202
|
+
hash.update(util_1.bigIntToBufferBE(w, modulusBytes));
|
|
203
|
+
hash.update('$');
|
|
204
|
+
const e = util_1.bigIntFromBufferBE(hash.digest()) % q;
|
|
205
|
+
const s = (bigint_mod_arith_1.modPow(r, e, pk.n) * beta) % pk.n;
|
|
206
|
+
const s1 = e * m + alpha;
|
|
207
|
+
const s2 = e * rho + gamma;
|
|
208
|
+
return { z, u, w, s, s1, s2 };
|
|
209
|
+
}
|
|
210
|
+
exports.prove = prove;
|
|
211
|
+
/**
|
|
212
|
+
* Verify a zero-knowledge range proof that an encrypted value is "small".
|
|
213
|
+
* @param {BaseCurve} curve An elliptic curve to use for group operations.
|
|
214
|
+
* @param {number} modulusBits The bit count of the prover's public key.
|
|
215
|
+
* @param {PublicKey} pk The prover's public key.
|
|
216
|
+
* @param {DeserializedNtilde} ntilde The verifier's Ntilde values.
|
|
217
|
+
* @param {RangeProof} proof The range proof.
|
|
218
|
+
* @param {bigint} c The ciphertext.
|
|
219
|
+
* @returns {boolean} True if verification succeeds.
|
|
220
|
+
*/
|
|
221
|
+
function verify(curve, modulusBits, pk, ntilde, proof, c) {
|
|
222
|
+
if (proof.u === BigInt(0) || proof.s === BigInt(0)) {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
const modulusBytes = Math.floor((modulusBits + 7) / 8);
|
|
226
|
+
const q = curve.order();
|
|
227
|
+
const q3 = q ** BigInt(3);
|
|
228
|
+
if (proof.s1 > q3) {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
const hash = crypto_1.createHash('sha256');
|
|
232
|
+
hash.update('\x06\x00\x00\x00\x00\x00\x00\x00');
|
|
233
|
+
hash.update(util_1.bigIntToBufferBE(pk.n, modulusBytes));
|
|
234
|
+
hash.update('$');
|
|
235
|
+
hash.update(util_1.bigIntToBufferBE(pk.g, modulusBytes));
|
|
236
|
+
hash.update('$');
|
|
237
|
+
hash.update(util_1.bigIntToBufferBE(c, 2 * modulusBytes));
|
|
238
|
+
hash.update('$');
|
|
239
|
+
hash.update(util_1.bigIntToBufferBE(proof.z, modulusBytes));
|
|
240
|
+
hash.update('$');
|
|
241
|
+
hash.update(util_1.bigIntToBufferBE(proof.u, 2 * modulusBytes));
|
|
242
|
+
hash.update('$');
|
|
243
|
+
hash.update(util_1.bigIntToBufferBE(proof.w, modulusBytes));
|
|
244
|
+
hash.update('$');
|
|
245
|
+
const e = util_1.bigIntFromBufferBE(hash.digest()) % q;
|
|
246
|
+
let products;
|
|
247
|
+
products = (bigint_mod_arith_1.modPow(pk.g, proof.s1, pk._n2) * bigint_mod_arith_1.modPow(proof.s, pk.n, pk._n2) * bigint_mod_arith_1.modPow(c, -e, pk._n2)) % pk._n2;
|
|
248
|
+
if (proof.u !== products) {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
products =
|
|
252
|
+
(((bigint_mod_arith_1.modPow(ntilde.h1, proof.s1, ntilde.ntilde) * bigint_mod_arith_1.modPow(ntilde.h2, proof.s2, ntilde.ntilde)) % ntilde.ntilde) *
|
|
253
|
+
bigint_mod_arith_1.modPow(proof.z, -e, ntilde.ntilde)) %
|
|
254
|
+
ntilde.ntilde;
|
|
255
|
+
return proof.w === products;
|
|
256
|
+
}
|
|
257
|
+
exports.verify = verify;
|
|
258
|
+
/**
|
|
259
|
+
* Generate a zero-knowledge range proof that a homomorphically manipulated value is "small".
|
|
260
|
+
* @param {BaseCurve} curve An elliptic curve to use for group operations.
|
|
261
|
+
* @param {number} modulusBits The bit count of the prover's public key.
|
|
262
|
+
* @param {PublicKey} pk The prover's public key.
|
|
263
|
+
* @param {DeserializedNtilde} ntilde The verifier's Ntilde values.
|
|
264
|
+
* @param {bigint} c1 The original ciphertext.
|
|
265
|
+
* @param {bigint} c2 The manipulated ciphertext.
|
|
266
|
+
* @param {bigint} x The plaintext value multiplied by the original plaintext.
|
|
267
|
+
* @param {bigint} y The plaintext value that is added to x.
|
|
268
|
+
* @param {bigint} r The obfuscation value used to encrypt x.
|
|
269
|
+
* @param {bigint} X The curve's base point raised to x.
|
|
270
|
+
* @returns {RangeProofWithCheck} The generated proof.
|
|
271
|
+
*/
|
|
272
|
+
async function proveWithCheck(curve, modulusBits, pk, ntilde, c1, c2, x, y, r, X) {
|
|
273
|
+
const modulusBytes = Math.floor((modulusBits + 7) / 8);
|
|
274
|
+
const q = curve.order();
|
|
275
|
+
const q3 = q ** BigInt(3);
|
|
276
|
+
const q7 = q ** BigInt(7);
|
|
277
|
+
const qntilde = q * ntilde.ntilde;
|
|
278
|
+
const q3ntilde = q3 * ntilde.ntilde;
|
|
279
|
+
const alpha = bigint_crypto_utils_1.randBetween(q3);
|
|
280
|
+
const rho = bigint_crypto_utils_1.randBetween(qntilde);
|
|
281
|
+
const sigma = bigint_crypto_utils_1.randBetween(qntilde);
|
|
282
|
+
const tau = bigint_crypto_utils_1.randBetween(q3ntilde);
|
|
283
|
+
const rhoprm = bigint_crypto_utils_1.randBetween(q3ntilde);
|
|
284
|
+
const beta = await util_1.randomPositiveCoPrimeTo(pk.n);
|
|
285
|
+
const gamma = bigint_crypto_utils_1.randBetween(q7);
|
|
286
|
+
const u = curve.basePointMult(curve.scalarReduce(alpha));
|
|
287
|
+
const z = (bigint_mod_arith_1.modPow(ntilde.h1, x, ntilde.ntilde) * bigint_mod_arith_1.modPow(ntilde.h2, rho, ntilde.ntilde)) % ntilde.ntilde;
|
|
288
|
+
const zprm = (bigint_mod_arith_1.modPow(ntilde.h1, alpha, ntilde.ntilde) * bigint_mod_arith_1.modPow(ntilde.h2, rhoprm, ntilde.ntilde)) % ntilde.ntilde;
|
|
289
|
+
const t = (bigint_mod_arith_1.modPow(ntilde.h1, y, ntilde.ntilde) * bigint_mod_arith_1.modPow(ntilde.h2, sigma, ntilde.ntilde)) % ntilde.ntilde;
|
|
290
|
+
const v = (((bigint_mod_arith_1.modPow(c1, alpha, pk._n2) * bigint_mod_arith_1.modPow(pk.g, gamma, pk._n2)) % pk._n2) * bigint_mod_arith_1.modPow(beta, pk.n, pk._n2)) % pk._n2;
|
|
291
|
+
const w = (bigint_mod_arith_1.modPow(ntilde.h1, gamma, ntilde.ntilde) * bigint_mod_arith_1.modPow(ntilde.h2, tau, ntilde.ntilde)) % ntilde.ntilde;
|
|
292
|
+
const hash = crypto_1.createHash('sha256');
|
|
293
|
+
hash.update('\x0d\x00\x00\x00\x00\x00\x00\x00');
|
|
294
|
+
hash.update(util_1.bigIntToBufferBE(pk.n, modulusBytes));
|
|
295
|
+
hash.update('$');
|
|
296
|
+
hash.update(util_1.bigIntToBufferBE(pk.g, modulusBytes));
|
|
297
|
+
hash.update('$');
|
|
298
|
+
hash.update(util_1.bigIntToBufferBE(X, 33));
|
|
299
|
+
hash.update('$');
|
|
300
|
+
hash.update(util_1.bigIntToBufferBE(c1, 2 * modulusBytes));
|
|
301
|
+
hash.update('$');
|
|
302
|
+
hash.update(util_1.bigIntToBufferBE(c2, 2 * modulusBytes));
|
|
303
|
+
hash.update('$');
|
|
304
|
+
hash.update(util_1.bigIntToBufferBE(u, 33));
|
|
305
|
+
hash.update('$');
|
|
306
|
+
hash.update(util_1.bigIntToBufferBE(z, modulusBytes));
|
|
307
|
+
hash.update('$');
|
|
308
|
+
hash.update(util_1.bigIntToBufferBE(zprm, modulusBytes));
|
|
309
|
+
hash.update('$');
|
|
310
|
+
hash.update(util_1.bigIntToBufferBE(t, modulusBytes));
|
|
311
|
+
hash.update('$');
|
|
312
|
+
hash.update(util_1.bigIntToBufferBE(v, 2 * modulusBytes));
|
|
313
|
+
hash.update('$');
|
|
314
|
+
hash.update(util_1.bigIntToBufferBE(w, modulusBytes));
|
|
315
|
+
hash.update('$');
|
|
316
|
+
const e = util_1.bigIntFromBufferBE(hash.digest()) % q;
|
|
317
|
+
const s = (bigint_mod_arith_1.modPow(r, e, pk.n) * beta) % pk.n;
|
|
318
|
+
const s1 = e * x + alpha;
|
|
319
|
+
const s2 = e * rho + rhoprm;
|
|
320
|
+
const t1 = e * y + gamma;
|
|
321
|
+
const t2 = e * sigma + tau;
|
|
322
|
+
return { z, zprm, t, v, w, s, s1, s2, t1, t2, u };
|
|
323
|
+
}
|
|
324
|
+
exports.proveWithCheck = proveWithCheck;
|
|
325
|
+
/**
|
|
326
|
+
* Verify a zero-knowledge range proof that a homomorphically manipulated value is "small".
|
|
327
|
+
* @param {BaseCurve} curve An elliptic curve to use for group operations.
|
|
328
|
+
* @param {number} modulusBits The bit count of the prover's public key.
|
|
329
|
+
* @param {PublicKey} pk The prover's public key.
|
|
330
|
+
* @param {DeserializedNtilde} ntilde The verifier's Ntilde values.
|
|
331
|
+
* @param {RangeProofWithCheck} proof The range proof.
|
|
332
|
+
* @param {bigint} c1 The original ciphertext.
|
|
333
|
+
* @param {bigint} c2 The manipulated ciphertext.
|
|
334
|
+
* @param {bigint} X The curve's base point raised to x.
|
|
335
|
+
* @returns {boolean} True if verification succeeds.
|
|
336
|
+
*/
|
|
337
|
+
function verifyWithCheck(curve, modulusBits, pk, ntilde, proof, c1, c2, X) {
|
|
338
|
+
const modulusBytes = Math.floor((modulusBits + 7) / 8);
|
|
339
|
+
const q = curve.order();
|
|
340
|
+
const q3 = q ** BigInt(3);
|
|
341
|
+
const q7 = q ** BigInt(7);
|
|
342
|
+
if (proof.s1 > q3) {
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
if (proof.t1 > q7) {
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
const hash = crypto_1.createHash('sha256');
|
|
349
|
+
hash.update('\x0d\x00\x00\x00\x00\x00\x00\x00');
|
|
350
|
+
hash.update(util_1.bigIntToBufferBE(pk.n, modulusBytes));
|
|
351
|
+
hash.update('$');
|
|
352
|
+
hash.update(util_1.bigIntToBufferBE(pk.g, modulusBytes));
|
|
353
|
+
hash.update('$');
|
|
354
|
+
hash.update(util_1.bigIntToBufferBE(X, 33));
|
|
355
|
+
hash.update('$');
|
|
356
|
+
hash.update(util_1.bigIntToBufferBE(c1, 2 * modulusBytes));
|
|
357
|
+
hash.update('$');
|
|
358
|
+
hash.update(util_1.bigIntToBufferBE(c2, 2 * modulusBytes));
|
|
359
|
+
hash.update('$');
|
|
360
|
+
hash.update(util_1.bigIntToBufferBE(proof.u, 33));
|
|
361
|
+
hash.update('$');
|
|
362
|
+
hash.update(util_1.bigIntToBufferBE(proof.z, modulusBytes));
|
|
363
|
+
hash.update('$');
|
|
364
|
+
hash.update(util_1.bigIntToBufferBE(proof.zprm, modulusBytes));
|
|
365
|
+
hash.update('$');
|
|
366
|
+
hash.update(util_1.bigIntToBufferBE(proof.t, modulusBytes));
|
|
367
|
+
hash.update('$');
|
|
368
|
+
hash.update(util_1.bigIntToBufferBE(proof.v, 2 * modulusBytes));
|
|
369
|
+
hash.update('$');
|
|
370
|
+
hash.update(util_1.bigIntToBufferBE(proof.w, modulusBytes));
|
|
371
|
+
hash.update('$');
|
|
372
|
+
const e = util_1.bigIntFromBufferBE(hash.digest()) % q;
|
|
373
|
+
const gS1 = curve.basePointMult(curve.scalarReduce(proof.s1));
|
|
374
|
+
const xEU = curve.pointAdd(curve.pointMultiply(X, e), proof.u);
|
|
375
|
+
if (gS1 !== xEU) {
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
let left, right;
|
|
379
|
+
const h1ExpS1 = bigint_mod_arith_1.modPow(ntilde.h1, proof.s1, ntilde.ntilde);
|
|
380
|
+
const h2ExpS2 = bigint_mod_arith_1.modPow(ntilde.h2, proof.s2, ntilde.ntilde);
|
|
381
|
+
left = (h1ExpS1 * h2ExpS2) % ntilde.ntilde;
|
|
382
|
+
const zExpE = bigint_mod_arith_1.modPow(proof.z, e, ntilde.ntilde);
|
|
383
|
+
right = (zExpE * proof.zprm) % ntilde.ntilde;
|
|
384
|
+
if (left !== right) {
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
const h1ExpT1 = bigint_mod_arith_1.modPow(ntilde.h1, proof.t1, ntilde.ntilde);
|
|
388
|
+
const h2ExpT2 = bigint_mod_arith_1.modPow(ntilde.h2, proof.t2, ntilde.ntilde);
|
|
389
|
+
left = (h1ExpT1 * h2ExpT2) % ntilde.ntilde;
|
|
390
|
+
const tExpE = bigint_mod_arith_1.modPow(proof.t, e, ntilde.ntilde);
|
|
391
|
+
right = (tExpE * proof.w) % ntilde.ntilde;
|
|
392
|
+
if (left !== right) {
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
|
+
const c1ExpS1 = bigint_mod_arith_1.modPow(c1, proof.s1, pk._n2);
|
|
396
|
+
const sExpN = bigint_mod_arith_1.modPow(proof.s, pk.n, pk._n2);
|
|
397
|
+
const gammaExpT1 = bigint_mod_arith_1.modPow(pk.g, proof.t1, pk._n2);
|
|
398
|
+
left = (((c1ExpS1 * sExpN) % pk._n2) * gammaExpT1) % pk._n2;
|
|
399
|
+
const c2ExpE = bigint_mod_arith_1.modPow(c2, e, pk._n2);
|
|
400
|
+
right = (c2ExpE * proof.v) % pk._n2;
|
|
401
|
+
return left === right;
|
|
402
|
+
}
|
|
403
|
+
exports.verifyWithCheck = verifyWithCheck;
|
|
404
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2Vwcm9vZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZWNkc2EvcmFuZ2Vwcm9vZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7O0dBR0c7QUFDSCxtQ0FBb0M7QUFHcEMsNkRBQTZEO0FBQzdELHVEQUFrRDtBQVNsRCxxQ0FBMkY7QUFDM0YsMkNBQXdDO0FBQ3hDLG1DQUE4QztBQUU5QywyRkFBMkY7QUFDM0YsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBRWhCLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxVQUFvQjtJQUMzRCxNQUFNLE9BQU8sR0FBRyxJQUFJLGlCQUFPLEVBQUUsQ0FBQztJQUM5QixNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixNQUFNLFFBQVEsR0FBc0IsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQWlCLEVBQUUsRUFBRTtRQUN2RSxPQUFPLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFQRCxnREFPQztBQUVELEtBQUssVUFBVSxlQUFlLENBQUMsU0FBUyxHQUFHLDJCQUFtQixFQUFFLEtBQUssR0FBRyxFQUFFO0lBQ3hFLElBQUksU0FBUyxHQUFHLDJCQUFtQixFQUFFO1FBQ25DLGtDQUFrQztRQUNsQyxzQ0FBc0M7UUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO0tBQzlFO0lBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxVQUFVLEdBQUcsU0FBUyxHQUFHLFVBQVUsQ0FBQztJQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzlCLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsd0dBQXdHO1FBQ3hHLElBQUksK0JBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDOUIsU0FBUztTQUNWO1FBQ0QsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUNoRjtJQUNELE1BQU0sSUFBSSxLQUFLLENBQ2IsaURBQWlELFNBQVMsVUFBVSxLQUFLLDREQUE0RCxDQUN0SSxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLGNBQWMsQ0FBQyxTQUFTLEdBQUcsMkJBQW1CO0lBQ2xFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxNQUFNLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvRCxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLDhCQUF1QixDQUFDLE1BQU0sQ0FBQyxFQUFFLDhCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RyxNQUFNLEVBQUUsR0FBRyx5QkFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekMsTUFBTSxFQUFFLEdBQUcseUJBQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxHQUFHLHlCQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNqQyxNQUFNLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUN2RCxtQkFBbUIsQ0FDakI7WUFDRSxFQUFFLEVBQUUsRUFBRTtZQUNOLEVBQUUsRUFBRSxFQUFFO1lBQ04sTUFBTSxFQUFFLE1BQU07U0FDZixFQUNELEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxDQUNIO1FBQ0QsbUJBQW1CLENBQ2pCO1lBQ0UsRUFBRSxFQUFFLEVBQUU7WUFDTixFQUFFLEVBQUUsRUFBRTtZQUNOLE1BQU0sRUFBRSxNQUFNO1NBQ2YsRUFDRCxJQUFJLEVBQ0osRUFBRSxFQUNGLEVBQUUsQ0FDSDtLQUNGLENBQUMsQ0FBQztJQUNILE9BQU87UUFDTCxNQUFNO1FBQ04sRUFBRTtRQUNGLEVBQUU7UUFDRixXQUFXLEVBQUU7WUFDWCxPQUFPLEVBQUU7Z0JBQ1AsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLO2dCQUMxQixDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7YUFDbkI7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLO2dCQUMxQixDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7YUFDbkI7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDO0FBM0NELHdDQTJDQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0ksS0FBSyxVQUFVLG1CQUFtQixDQUN2QyxNQUEwQixFQUMxQixDQUFTLEVBQ1QsRUFBVSxFQUNWLEVBQVU7SUFFVixNQUFNLE9BQU8sR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLE1BQU0sQ0FBQyxHQUFhLEVBQUUsQ0FBQztJQUN2QixNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDM0IsSUFBSSxTQUFTLEdBQVcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNwQyx1QkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzNCLHVCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDM0IsdUJBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztLQUNoQyxDQUFDLENBQUM7SUFDSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLENBQUMsQ0FBQyxJQUFJLENBQUMsaUNBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzdCLEtBQUssQ0FBQyxJQUFJLENBQUMseUJBQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNuRCxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQywrQkFBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM3RztJQUNELE1BQU0saUJBQWlCLEdBQUcsbUJBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDMUUsTUFBTSxDQUFDLEdBQWEsRUFBRSxDQUFDO0lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsMENBQTBDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO0tBQzdEO0lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUN0QixDQUFDO0FBM0JELGtEQTJCQztBQUVEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxNQUEwQixFQUMxQixXQUFvQztJQUVwQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzlDLElBQUksV0FBVyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzFELE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxJQUFJLFdBQVcsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUMxRCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsSUFBSSxXQUFXLEtBQUssV0FBVyxFQUFFO1FBQy9CLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxJQUNFLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUc7UUFDOUIsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssVUFBVTtRQUN2QyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQ25DO1FBQ0EsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELElBQUksU0FBUyxHQUFXLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDcEMsdUJBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMzQix1QkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzNCLHVCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7S0FDaEMsQ0FBQyxDQUFDO0lBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2pELFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3hCLFNBQVM7WUFDVCx1QkFBZ0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsK0JBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDaEYsQ0FBQyxDQUFDO0tBQ0o7SUFDRCxNQUFNLGlCQUFpQixHQUFHLG1CQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNqRCwwQ0FBMEM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0UsTUFBTSxPQUFPLEdBQUcseUJBQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25FLE1BQU0sT0FBTyxHQUFHLHlCQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sZUFBZSxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3pFLElBQUksT0FBTyxLQUFLLGVBQWUsRUFBRTtZQUMvQixPQUFPLEtBQUssQ0FBQztTQUNkO0tBQ0Y7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUE3Q0QsOENBNkNDO0FBQ0Q7Ozs7Ozs7Ozs7R0FVRztBQUNJLEtBQUssVUFBVSxLQUFLLENBQ3pCLEtBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLEVBQWEsRUFDYixNQUEwQixFQUMxQixDQUFTLEVBQ1QsQ0FBUyxFQUNULENBQVM7SUFFVCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2xDLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3BDLE1BQU0sS0FBSyxHQUFHLGlDQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUIsTUFBTSxJQUFJLEdBQUcsTUFBTSw4QkFBdUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsTUFBTSxLQUFLLEdBQUcsaUNBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxNQUFNLEdBQUcsR0FBRyxpQ0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcseUJBQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3hHLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcseUJBQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzlFLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcseUJBQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzlHLE1BQU0sSUFBSSxHQUFHLG1CQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQWdCLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQWdCLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQixNQUFNLENBQUMsR0FBRyx5QkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDekIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDM0IsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDaEMsQ0FBQztBQXhDRCxzQkF3Q0M7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixNQUFNLENBQ3BCLEtBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLEVBQWEsRUFDYixNQUEwQixFQUMxQixLQUFpQixFQUNqQixDQUFTO0lBRVQsSUFBSSxLQUFLLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNsRCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2RCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixJQUFJLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ2pCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxNQUFNLElBQUksR0FBRyxtQkFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakIsTUFBTSxDQUFDLEdBQUcseUJBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELElBQUksUUFBZ0IsQ0FBQztJQUNyQixRQUFRLEdBQUcsQ0FBQyx5QkFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcseUJBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLHlCQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDN0csSUFBSSxLQUFLLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUN4QixPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsUUFBUTtRQUNOLENBQUMsQ0FBQyxDQUFDLHlCQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyx5QkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzFHLHlCQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixPQUFPLEtBQUssQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDO0FBQzlCLENBQUM7QUExQ0Qsd0JBMENDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNJLEtBQUssVUFBVSxjQUFjLENBQ2xDLEtBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLEVBQWEsRUFDYixNQUEwQixFQUMxQixFQUFVLEVBQ1YsRUFBVSxFQUNWLENBQVMsRUFDVCxDQUFTLEVBQ1QsQ0FBUyxFQUNULENBQVM7SUFFVCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEMsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDcEMsTUFBTSxLQUFLLEdBQUcsaUNBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QixNQUFNLEdBQUcsR0FBRyxpQ0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sS0FBSyxHQUFHLGlDQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsTUFBTSxHQUFHLEdBQUcsaUNBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxNQUFNLE1BQU0sR0FBRyxpQ0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLE1BQU0sOEJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sS0FBSyxHQUFHLGlDQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekQsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyx5QkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDeEcsTUFBTSxJQUFJLEdBQUcsQ0FBQyx5QkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyx5QkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbEgsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyx5QkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDMUcsTUFBTSxDQUFDLEdBQ0wsQ0FBQyxDQUFDLENBQUMseUJBQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyx5QkFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyx5QkFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDL0csTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyx5QkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDNUcsTUFBTSxJQUFJLEdBQUcsbUJBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQWdCLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQWdCLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ25ELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLE1BQU0sQ0FBQyxHQUFHLHlCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRCxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3QyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN6QixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztJQUM1QixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN6QixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztJQUMzQixPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3BELENBQUM7QUEvREQsd0NBK0RDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQixlQUFlLENBQzdCLEtBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLEVBQWEsRUFDYixNQUEwQixFQUMxQixLQUEwQixFQUMxQixFQUFVLEVBQ1YsRUFBVSxFQUNWLENBQVM7SUFFVCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsSUFBSSxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNqQixPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsSUFBSSxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNqQixPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsTUFBTSxJQUFJLEdBQUcsbUJBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQWdCLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLE1BQU0sQ0FBQyxHQUFHLHlCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFO1FBQ2YsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQztJQUNoQixNQUFNLE9BQU8sR0FBRyx5QkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0QsTUFBTSxPQUFPLEdBQUcseUJBQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNELElBQUksR0FBRyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFHLHlCQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM3QyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7UUFDbEIsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELE1BQU0sT0FBTyxHQUFHLHlCQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRCxNQUFNLE9BQU8sR0FBRyx5QkFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0QsSUFBSSxHQUFHLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDM0MsTUFBTSxLQUFLLEdBQUcseUJBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEQsS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzFDLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtRQUNsQixPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsTUFBTSxPQUFPLEdBQUcseUJBQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcseUJBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sVUFBVSxHQUFHLHlCQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsRCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQzVELE1BQU0sTUFBTSxHQUFHLHlCQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsS0FBSyxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ3BDLE9BQU8sSUFBSSxLQUFLLEtBQUssQ0FBQztBQUN4QixDQUFDO0FBMUVELDBDQTBFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogWmVybyBLbm93bGVkZ2UgUmFuZ2UgUHJvb2ZzIGFzIGRlc2NyaWJlZCBpbiAoVHdvLXBhcnR5IGdlbmVyYXRpb24gb2YgRFNBIHNpZ25hdHVyZXMpWzFdLlxuICogWzFdOiBodHRwczovL3JlaXRlcm1rLmdpdGh1Yi5pby9wYXBlcnMvMjAwNC9JSklTLnBkZlxuICovXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IEJhc2VDdXJ2ZSB9IGZyb20gJy4uLy4uL2N1cnZlcyc7XG5pbXBvcnQgeyBQdWJsaWNLZXkgfSBmcm9tICdwYWlsbGllci1iaWdpbnQnO1xuaW1wb3J0IHsgYml0TGVuZ3RoLCByYW5kQmV0d2VlbiB9IGZyb20gJ2JpZ2ludC1jcnlwdG8tdXRpbHMnO1xuaW1wb3J0IHsgbW9kSW52LCBtb2RQb3cgfSBmcm9tICdiaWdpbnQtbW9kLWFyaXRoJztcbmltcG9ydCB7XG4gIERlc2VyaWFsaXplZE50aWxkZSxcbiAgRGVzZXJpYWxpemVkTnRpbGRlUHJvb2YsXG4gIFJTQU1vZHVsdXMsXG4gIFJhbmdlUHJvb2YsXG4gIFJhbmdlUHJvb2ZXaXRoQ2hlY2ssXG4gIERlc2VyaWFsaXplZE50aWxkZVdpdGhQcm9vZnMsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgYmlnSW50RnJvbUJ1ZmZlckJFLCBiaWdJbnRUb0J1ZmZlckJFLCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgT3BlblNTTCB9IGZyb20gJy4uLy4uL29wZW5zc2wnO1xuaW1wb3J0IHsgbWluTW9kdWx1c0JpdExlbmd0aCB9IGZyb20gJy4vaW5kZXgnO1xuXG4vLyAxMjggYXMgcmVjb21tZW5kIGJ5IGh0dHBzOi8vYmxvZy52ZXJpY2hhaW5zLmlvL3AvdnNhLTIwMjItMTIwLW11bHRpY2hhaW4ta2V5LWV4dHJhY3Rpb24uXG5jb25zdCBJVEVSQVRJT05TID0gMTI4O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTYWZlUHJpbWVzKGJpdExlbmd0aHM6IG51bWJlcltdKTogUHJvbWlzZTxiaWdpbnRbXT4ge1xuICBjb25zdCBvcGVuU1NMID0gbmV3IE9wZW5TU0woKTtcbiAgYXdhaXQgb3BlblNTTC5pbml0KCk7XG4gIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPGJpZ2ludD5bXSA9IGJpdExlbmd0aHMubWFwKChiaXRsZW5ndGg6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiBvcGVuU1NMLmdlbmVyYXRlU2FmZVByaW1lKGJpdGxlbmd0aCk7XG4gIH0pO1xuICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1vZHVsdXMoYml0bGVuZ3RoID0gbWluTW9kdWx1c0JpdExlbmd0aCwgcmV0cnkgPSAxMCk6IFByb21pc2U8UlNBTW9kdWx1cz4ge1xuICBpZiAoYml0bGVuZ3RoIDwgbWluTW9kdWx1c0JpdExlbmd0aCkge1xuICAgIC8vIGh0dHBzOi8vd3d3LmtleWxlbmd0aC5jb20vZW4vNi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybignR2VuZXJhdGluZyBhIG1vZHVsdXMgd2l0aCBsZXNzIHRoYW4gMzA3MiBpcyBub3QgcmVjb21tZW5kZWQhJyk7XG4gIH1cbiAgY29uc3QgYml0bGVuZ3RoUCA9IE1hdGguZmxvb3IoYml0bGVuZ3RoIC8gMik7XG4gIGNvbnN0IGJpdGxlbmd0aFEgPSBiaXRsZW5ndGggLSBiaXRsZW5ndGhQO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJldHJ5OyBpKyspIHtcbiAgICBjb25zdCBbcCwgcV0gPSBhd2FpdCBnZW5lcmF0ZVNhZmVQcmltZXMoW2JpdGxlbmd0aFAsIGJpdGxlbmd0aFFdKTtcbiAgICBjb25zdCBuID0gcCAqIHE7XG4gICAgLy8gRm9yIGxhcmdlIGJpdCBsZW5ndGhzLCB0aGUgcHJvYmFiaWxpdHkgb2YgZ2VuZXJhdGluZyBhIG1vZHVsdXMgd2l0aCB0aGUgd3JvbmcgYml0IGxlbmd0aCBpcyB2ZXJ5IGxvdy5cbiAgICBpZiAoYml0TGVuZ3RoKG4pICE9PSBiaXRsZW5ndGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXR1cm4geyBuLCBxMTogKHAgLSBCaWdJbnQoMSkpIC8gQmlnSW50KDIpLCBxMjogKHEgLSBCaWdJbnQoMSkpIC8gQmlnSW50KDIpIH07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBVbmFibGUgdG8gZ2VuZXJhdGUgbW9kdWx1cyB3aXRoIGJpdCBsZW5ndGggb2YgJHtiaXRsZW5ndGh9IGFmdGVyICR7cmV0cnl9IHRyaWVzLiBQbGVhc2UgdHJ5IGFnYWluIG9yIHJlYWNoIG91dCB0byBzdXBwb3J0QGJpdGdvLmNvbWBcbiAgKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBcImNoYWxsZW5nZVwiIHZhbHVlcyBmb3IgcmFuZ2UgcHJvb2ZzLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdGxlbmd0aCBUaGUgYml0IGxlbmd0aCBvZiB0aGUgbW9kdWx1cyB0byBnZW5lcmF0ZS4gVGhpcyBzaG91bGRcbiAqIGJlIHRoZSBzYW1lIGFzIHRoZSBiaXQgbGVuZ3RoIG9mIHRoZSBwYWlsbGllciBwdWJsaWMga2V5cyB1c2VkIGZvciBNdEEuXG4gKiBAcmV0dXJucyB7RGVzZXJpYWxpemVkTnRpbGRlfSBUaGUgZ2VuZXJhdGVkIE50aWxkZSB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU50aWxkZShiaXRsZW5ndGggPSBtaW5Nb2R1bHVzQml0TGVuZ3RoKTogUHJvbWlzZTxEZXNlcmlhbGl6ZWROdGlsZGVXaXRoUHJvb2ZzPiB7XG4gIGNvbnN0IHsgbjogbnRpbGRlLCBxMSwgcTIgfSA9IGF3YWl0IGdlbmVyYXRlTW9kdWx1cyhiaXRsZW5ndGgpO1xuICBjb25zdCBbZjEsIGYyXSA9IGF3YWl0IFByb21pc2UuYWxsKFtyYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhudGlsZGUpLCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhudGlsZGUpXSk7XG4gIGNvbnN0IGgxID0gbW9kUG93KGYxLCBCaWdJbnQoMiksIG50aWxkZSk7XG4gIGNvbnN0IGgyID0gbW9kUG93KGgxLCBmMiwgbnRpbGRlKTtcbiAgY29uc3QgYmV0YSA9IG1vZEludihmMiwgcTEgKiBxMik7XG4gIGNvbnN0IFtoMXdydEgyUHJvb2ZzLCBoMndydEgxUHJvb2ZzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBnZW5lcmF0ZU50aWxkZVByb29mKFxuICAgICAge1xuICAgICAgICBoMTogaDEsXG4gICAgICAgIGgyOiBoMixcbiAgICAgICAgbnRpbGRlOiBudGlsZGUsXG4gICAgICB9LFxuICAgICAgZjIsXG4gICAgICBxMSxcbiAgICAgIHEyXG4gICAgKSxcbiAgICBnZW5lcmF0ZU50aWxkZVByb29mKFxuICAgICAge1xuICAgICAgICBoMTogaDIsXG4gICAgICAgIGgyOiBoMSxcbiAgICAgICAgbnRpbGRlOiBudGlsZGUsXG4gICAgICB9LFxuICAgICAgYmV0YSxcbiAgICAgIHExLFxuICAgICAgcTJcbiAgICApLFxuICBdKTtcbiAgcmV0dXJuIHtcbiAgICBudGlsZGUsXG4gICAgaDEsXG4gICAgaDIsXG4gICAgbnRpbGRlUHJvb2Y6IHtcbiAgICAgIGgxV3J0SDI6IHtcbiAgICAgICAgYWxwaGE6IGgxd3J0SDJQcm9vZnMuYWxwaGEsXG4gICAgICAgIHQ6IGgxd3J0SDJQcm9vZnMudCxcbiAgICAgIH0sXG4gICAgICBoMldydEgxOiB7XG4gICAgICAgIGFscGhhOiBoMndydEgxUHJvb2ZzLmFscGhhLFxuICAgICAgICB0OiBoMndydEgxUHJvb2ZzLnQsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogR2VuZXJhdGUgaXRlcmF0aW9ucyBvZiBOdGlsZGUsIGgxLCBoMiBkaXNjcmV0ZSBsb2cgcHJvb2ZzLlxuICogQHBhcmFtIHtEZXNlcmlhbGl6ZWROdGlsZGV9IG50aWxkZSBOdGlsZGUsIGgxLCBoMiB0byBnZW5lcmF0ZSB0aGUgcHJvb2ZzIGZvci5cbiAqIEBwYXJhbSB7YmlnaW50fSB4IEVpdGhlciBhbHBoYSBvciBiZXRhIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGlzIGEgZGlzY3JldGUgbG9nIHByb29mIG9mXG4gKiBoMSB3LnIudCBoMiBvciBoMiB3LnIudCBoMS5cbiAqIEBwYXJhbSB7YmlnaW50fSBxMSBUaGUgU29waGllIEdlcm1haW4gcHJpbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaXJzdCBzYWZlIHByaW1lIHAxIHVzZWQgdG8gZ2VuZXJhdGUgTnRpbGRlLlxuICogQHBhcmFtIHtiaWdpbnR9IHEyIFRoZSBTb3BoaWUgR2VybWFpbiBwcmltZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY29uZCBzYWZlIHByaW1lIHAyIHVzZWQgdG8gZ2VuZXJhdGUgTnRpbGRlLlxuICogQHJldHVybnMge050aWxkZVByb29mfSBUaGUgZ2VuZXJhdGVkIE50aWxkZSBQcm9vZnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU50aWxkZVByb29mKFxuICBudGlsZGU6IERlc2VyaWFsaXplZE50aWxkZSxcbiAgeDogYmlnaW50LFxuICBxMTogYmlnaW50LFxuICBxMjogYmlnaW50XG4pOiBQcm9taXNlPERlc2VyaWFsaXplZE50aWxkZVByb29mPiB7XG4gIGNvbnN0IHExTXVsUTIgPSBxMSAqIHEyO1xuICBjb25zdCBhOiBiaWdpbnRbXSA9IFtdO1xuICBjb25zdCBhbHBoYTogYmlnaW50W10gPSBbXTtcbiAgbGV0IG1zZ1RvSGFzaDogQnVmZmVyID0gQnVmZmVyLmNvbmNhdChbXG4gICAgYmlnSW50VG9CdWZmZXJCRShudGlsZGUuaDEpLFxuICAgIGJpZ0ludFRvQnVmZmVyQkUobnRpbGRlLmgyKSxcbiAgICBiaWdJbnRUb0J1ZmZlckJFKG50aWxkZS5udGlsZGUpLFxuICBdKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspIHtcbiAgICBhLnB1c2gocmFuZEJldHdlZW4ocTFNdWxRMikpO1xuICAgIGFscGhhLnB1c2gobW9kUG93KG50aWxkZS5oMSwgYVtpXSwgbnRpbGRlLm50aWxkZSkpO1xuICAgIG1zZ1RvSGFzaCA9IEJ1ZmZlci5jb25jYXQoW21zZ1RvSGFzaCwgYmlnSW50VG9CdWZmZXJCRShhbHBoYVtpXSwgTWF0aC5jZWlsKGJpdExlbmd0aChudGlsZGUubnRpbGRlKSAvIDgpKV0pO1xuICB9XG4gIGNvbnN0IHNpbXVsYXRlZFJlc3BvbnNlID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKG1zZ1RvSGFzaCkuZGlnZXN0KCk7XG4gIGNvbnN0IHQ6IGJpZ2ludFtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgSVRFUkFUSU9OUzsgaSsrKSB7XG4gICAgLy8gR2V0IHRoZSBpdGggYml0IGZyb20gYSBidWZmZXIgb2YgYnl0ZXMuXG4gICAgY29uc3QgaXRoQml0ID0gKHNpbXVsYXRlZFJlc3BvbnNlW01hdGguZmxvb3IoaSAvIDgpXSA+PiAoNyAtIChpICUgOCkpKSAmIDE7XG4gICAgdC5wdXNoKChhW2ldICsgKChCaWdJbnQoaXRoQml0KSAqIHgpICUgcTFNdWxRMikpICUgcTFNdWxRMik7XG4gIH1cbiAgcmV0dXJuIHsgYWxwaGEsIHQgfTtcbn1cblxuLyoqXG4gKiBWZXJpZnkgZGlzY3JldGUgbG9nIHByb29mcyBvZiBoMSBhbmQgaDIgbW9kIE50aWxkZS5cbiAqIEBwYXJhbSB7RGVzZXJpYWxpemVkTnRpbGRlfSBudGlsZGUgTnRpbGRlLCBoMSwgaDIgdG8gZ2VuZXJhdGUgdGhlIHByb29mcyBmb3IuXG4gKiBAcGFyYW0ge0Rlc2VyaWFsaXplZE50aWxkZVByb29mfSBudGlsZGVQcm9vZiBOdGlsZGUgUHJvb2ZzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBwcm9vZiBpcyB2ZXJpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5TnRpbGRlUHJvb2YoXG4gIG50aWxkZTogRGVzZXJpYWxpemVkTnRpbGRlLFxuICBudGlsZGVQcm9vZjogRGVzZXJpYWxpemVkTnRpbGRlUHJvb2Zcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBoMU1vZE50aWxkZSA9IG50aWxkZS5oMSAlIG50aWxkZS5udGlsZGU7XG4gIGNvbnN0IGgyTW9kTnRpbGRlID0gbnRpbGRlLmgyICUgbnRpbGRlLm50aWxkZTtcbiAgaWYgKGgxTW9kTnRpbGRlID09PSBCaWdJbnQoMCkgfHwgaDJNb2ROdGlsZGUgPT09IEJpZ0ludCgwKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoaDFNb2ROdGlsZGUgPT09IEJpZ0ludCgxKSB8fCBoMk1vZE50aWxkZSA9PT0gQmlnSW50KDEpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChoMU1vZE50aWxkZSA9PT0gaDJNb2ROdGlsZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKFxuICAgIG50aWxkZVByb29mLmFscGhhLmxlbmd0aCA+IDI1NiB8fFxuICAgIG50aWxkZVByb29mLmFscGhhLmxlbmd0aCAhPT0gSVRFUkFUSU9OUyB8fFxuICAgIG50aWxkZVByb29mLnQubGVuZ3RoICE9PSBJVEVSQVRJT05TXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBsZXQgbXNnVG9IYXNoOiBCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFtcbiAgICBiaWdJbnRUb0J1ZmZlckJFKG50aWxkZS5oMSksXG4gICAgYmlnSW50VG9CdWZmZXJCRShudGlsZGUuaDIpLFxuICAgIGJpZ0ludFRvQnVmZmVyQkUobnRpbGRlLm50aWxkZSksXG4gIF0pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG50aWxkZVByb29mLmFscGhhLmxlbmd0aDsgaSsrKSB7XG4gICAgbXNnVG9IYXNoID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICBtc2dUb0hhc2gsXG4gICAgICBiaWdJbnRUb0J1ZmZlckJFKG50aWxkZVByb29mLmFscGhhW2ldLCBNYXRoLmNlaWwoYml0TGVuZ3RoKG50aWxkZS5udGlsZGUpIC8gOCkpLFxuICAgIF0pO1xuICB9XG4gIGNvbnN0IHNpbXVsYXRlZFJlc3BvbnNlID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKG1zZ1RvSGFzaCkuZGlnZXN0KCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnRpbGRlUHJvb2YuYWxwaGEubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBHZXQgdGhlIGl0aCBiaXQgZnJvbSBhIGJ1ZmZlciBvZiBieXRlcy5cbiAgICBjb25zdCBpdGhCaXQgPSAoc2ltdWxhdGVkUmVzcG9uc2VbTWF0aC5mbG9vcihpIC8gOCldID4+ICg3IC0gKGkgJSA4KSkpICYgMTtcbiAgICBjb25zdCBoMVBvd1RpID0gbW9kUG93KG50aWxkZS5oMSwgbnRpbGRlUHJvb2YudFtpXSwgbnRpbGRlLm50aWxkZSk7XG4gICAgY29uc3QgaDJQb3dDaSA9IG1vZFBvdyhudGlsZGUuaDIsIEJpZ0ludChpdGhCaXQpLCBudGlsZGUubnRpbGRlKTtcbiAgICBjb25zdCBhbHBoYU11bGgyUG93Q2kgPSAobnRpbGRlUHJvb2YuYWxwaGFbaV0gKiBoMlBvd0NpKSAlIG50aWxkZS5udGlsZGU7XG4gICAgaWYgKGgxUG93VGkgIT09IGFscGhhTXVsaDJQb3dDaSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogR2VuZXJhdGUgYSB6ZXJvLWtub3dsZWRnZSByYW5nZSBwcm9vZiB0aGF0IGFuIGVuY3J5cHRlZCB2YWx1ZSBpcyBcInNtYWxsXCIuXG4gKiBAcGFyYW0ge0Jhc2VDdXJ2ZX0gY3VydmUgQW4gZWxsaXB0aWMgY3VydmUgdG8gdXNlIGZvciBncm91cCBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtudW1iZXJ9IG1vZHVsdXNCaXRzIFRoZSBiaXQgY291bnQgb2YgdGhlIHByb3ZlcidzIHB1YmxpYyBrZXkuXG4gKiBAcGFyYW0ge1B1YmxpY0tleX0gcGsgVGhlIHByb3ZlcidzIHB1YmxpYyBrZXkuXG4gKiBAcGFyYW0ge0Rlc2VyaWFsaXplZE50aWxkZX0gbnRpbGRlIFRoZSB2ZXJpZmllcidzIE50aWxkZSB2YWx1ZXMuXG4gKiBAcGFyYW0ge2JpZ2ludH0gYyBUaGUgY2lwaGVydGV4dC5cbiAqIEBwYXJhbSB7YmlnaW50fSBtIFRoZSBwbGFpbnRleHQuXG4gKiBAcGFyYW0ge2JpZ2ludH0gciBUaGUgb2JmdXNjYXRpb24gdmFsdWUgdXNlZCB0byBlbmNyeXB0IG0uXG4gKiBAcmV0dXJucyB7UmFuZ2VQcm9vZn0gVGhlIGdlbmVyYXRlZCBwcm9vZi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3ZlKFxuICBjdXJ2ZTogQmFzZUN1cnZlLFxuICBtb2R1bHVzQml0czogbnVtYmVyLFxuICBwazogUHVibGljS2V5LFxuICBudGlsZGU6IERlc2VyaWFsaXplZE50aWxkZSxcbiAgYzogYmlnaW50LFxuICBtOiBiaWdpbnQsXG4gIHI6IGJpZ2ludFxuKTogUHJvbWlzZTxSYW5nZVByb29mPiB7XG4gIGNvbnN0IG1vZHVsdXNCeXRlcyA9IE1hdGguZmxvb3IoKG1vZHVsdXNCaXRzICsgNykgLyA4KTtcbiAgY29uc3QgcSA9IGN1cnZlLm9yZGVyKCk7XG4gIGNvbnN0IHEzID0gcSAqKiBCaWdJbnQoMyk7XG4gIGNvbnN0IHFudGlsZGUgPSBxICogbnRpbGRlLm50aWxkZTtcbiAgY29uc3QgcTNudGlsZGUgPSBxMyAqIG50aWxkZS5udGlsZGU7XG4gIGNvbnN0IGFscGhhID0gcmFuZEJldHdlZW4ocTMpO1xuICBjb25zdCBiZXRhID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGsubik7XG4gIGNvbnN0IGdhbW1hID0gcmFuZEJldHdlZW4ocTNudGlsZGUpO1xuICBjb25zdCByaG8gPSByYW5kQmV0d2VlbihxbnRpbGRlKTtcbiAgY29uc3QgeiA9IChtb2RQb3cobnRpbGRlLmgxLCBtLCBudGlsZGUubnRpbGRlKSAqIG1vZFBvdyhudGlsZGUuaDIsIHJobywgbnRpbGRlLm50aWxkZSkpICUgbnRpbGRlLm50aWxkZTtcbiAgY29uc3QgdSA9IChtb2RQb3cocGsuZywgYWxwaGEsIHBrLl9uMikgKiBtb2RQb3coYmV0YSwgcGsubiwgcGsuX24yKSkgJSBway5fbjI7XG4gIGNvbnN0IHcgPSAobW9kUG93KG50aWxkZS5oMSwgYWxwaGEsIG50aWxkZS5udGlsZGUpICogbW9kUG93KG50aWxkZS5oMiwgZ2FtbWEsIG50aWxkZS5udGlsZGUpKSAlIG50aWxkZS5udGlsZGU7XG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgaGFzaC51cGRhdGUoJ1xceDA2XFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDAnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShway5uLCBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShway5nLCBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShjLCAyICogbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoeiwgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUodSwgMiAqIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHcsIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBjb25zdCBlID0gYmlnSW50RnJvbUJ1ZmZlckJFKGhhc2guZGlnZXN0KCkpICUgcTtcbiAgY29uc3QgcyA9IChtb2RQb3cociwgZSwgcGsubikgKiBiZXRhKSAlIHBrLm47XG4gIGNvbnN0IHMxID0gZSAqIG0gKyBhbHBoYTtcbiAgY29uc3QgczIgPSBlICogcmhvICsgZ2FtbWE7XG4gIHJldHVybiB7IHosIHUsIHcsIHMsIHMxLCBzMiB9O1xufVxuXG4vKipcbiAqIFZlcmlmeSBhIHplcm8ta25vd2xlZGdlIHJhbmdlIHByb29mIHRoYXQgYW4gZW5jcnlwdGVkIHZhbHVlIGlzIFwic21hbGxcIi5cbiAqIEBwYXJhbSB7QmFzZUN1cnZlfSBjdXJ2ZSBBbiBlbGxpcHRpYyBjdXJ2ZSB0byB1c2UgZm9yIGdyb3VwIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gbW9kdWx1c0JpdHMgVGhlIGJpdCBjb3VudCBvZiB0aGUgcHJvdmVyJ3MgcHVibGljIGtleS5cbiAqIEBwYXJhbSB7UHVibGljS2V5fSBwayBUaGUgcHJvdmVyJ3MgcHVibGljIGtleS5cbiAqIEBwYXJhbSB7RGVzZXJpYWxpemVkTnRpbGRlfSBudGlsZGUgVGhlIHZlcmlmaWVyJ3MgTnRpbGRlIHZhbHVlcy5cbiAqIEBwYXJhbSB7UmFuZ2VQcm9vZn0gcHJvb2YgVGhlIHJhbmdlIHByb29mLlxuICogQHBhcmFtIHtiaWdpbnR9IGMgVGhlIGNpcGhlcnRleHQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2ZXJpZmljYXRpb24gc3VjY2VlZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnkoXG4gIGN1cnZlOiBCYXNlQ3VydmUsXG4gIG1vZHVsdXNCaXRzOiBudW1iZXIsXG4gIHBrOiBQdWJsaWNLZXksXG4gIG50aWxkZTogRGVzZXJpYWxpemVkTnRpbGRlLFxuICBwcm9vZjogUmFuZ2VQcm9vZixcbiAgYzogYmlnaW50XG4pOiBib29sZWFuIHtcbiAgaWYgKHByb29mLnUgPT09IEJpZ0ludCgwKSB8fCBwcm9vZi5zID09PSBCaWdJbnQoMCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgbW9kdWx1c0J5dGVzID0gTWF0aC5mbG9vcigobW9kdWx1c0JpdHMgKyA3KSAvIDgpO1xuICBjb25zdCBxID0gY3VydmUub3JkZXIoKTtcbiAgY29uc3QgcTMgPSBxICoqIEJpZ0ludCgzKTtcbiAgaWYgKHByb29mLnMxID4gcTMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICBoYXNoLnVwZGF0ZSgnXFx4MDZcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHBrLm4sIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHBrLmcsIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKGMsIDIgKiBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAyICogbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGNvbnN0IGUgPSBiaWdJbnRGcm9tQnVmZmVyQkUoaGFzaC5kaWdlc3QoKSkgJSBxO1xuICBsZXQgcHJvZHVjdHM6IGJpZ2ludDtcbiAgcHJvZHVjdHMgPSAobW9kUG93KHBrLmcsIHByb29mLnMxLCBway5fbjIpICogbW9kUG93KHByb29mLnMsIHBrLm4sIHBrLl9uMikgKiBtb2RQb3coYywgLWUsIHBrLl9uMikpICUgcGsuX24yO1xuICBpZiAocHJvb2YudSAhPT0gcHJvZHVjdHMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvZHVjdHMgPVxuICAgICgoKG1vZFBvdyhudGlsZGUuaDEsIHByb29mLnMxLCBudGlsZGUubnRpbGRlKSAqIG1vZFBvdyhudGlsZGUuaDIsIHByb29mLnMyLCBudGlsZGUubnRpbGRlKSkgJSBudGlsZGUubnRpbGRlKSAqXG4gICAgICBtb2RQb3cocHJvb2YueiwgLWUsIG50aWxkZS5udGlsZGUpKSAlXG4gICAgbnRpbGRlLm50aWxkZTtcbiAgcmV0dXJuIHByb29mLncgPT09IHByb2R1Y3RzO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgemVyby1rbm93bGVkZ2UgcmFuZ2UgcHJvb2YgdGhhdCBhIGhvbW9tb3JwaGljYWxseSBtYW5pcHVsYXRlZCB2YWx1ZSBpcyBcInNtYWxsXCIuXG4gKiBAcGFyYW0ge0Jhc2VDdXJ2ZX0gY3VydmUgQW4gZWxsaXB0aWMgY3VydmUgdG8gdXNlIGZvciBncm91cCBvcGVyYXRpb25zLlxuICogQHBhcmFtIHtudW1iZXJ9IG1vZHVsdXNCaXRzIFRoZSBiaXQgY291bnQgb2YgdGhlIHByb3ZlcidzIHB1YmxpYyBrZXkuXG4gKiBAcGFyYW0ge1B1YmxpY0tleX0gcGsgVGhlIHByb3ZlcidzIHB1YmxpYyBrZXkuXG4gKiBAcGFyYW0ge0Rlc2VyaWFsaXplZE50aWxkZX0gbnRpbGRlIFRoZSB2ZXJpZmllcidzIE50aWxkZSB2YWx1ZXMuXG4gKiBAcGFyYW0ge2JpZ2ludH0gYzEgVGhlIG9yaWdpbmFsIGNpcGhlcnRleHQuXG4gKiBAcGFyYW0ge2JpZ2ludH0gYzIgVGhlIG1hbmlwdWxhdGVkIGNpcGhlcnRleHQuXG4gKiBAcGFyYW0ge2JpZ2ludH0geCBUaGUgcGxhaW50ZXh0IHZhbHVlIG11bHRpcGxpZWQgYnkgdGhlIG9yaWdpbmFsIHBsYWludGV4dC5cbiAqIEBwYXJhbSB7YmlnaW50fSB5IFRoZSBwbGFpbnRleHQgdmFsdWUgdGhhdCBpcyBhZGRlZCB0byB4LlxuICogQHBhcmFtIHtiaWdpbnR9IHIgVGhlIG9iZnVzY2F0aW9uIHZhbHVlIHVzZWQgdG8gZW5jcnlwdCB4LlxuICogQHBhcmFtIHtiaWdpbnR9IFggVGhlIGN1cnZlJ3MgYmFzZSBwb2ludCByYWlzZWQgdG8geC5cbiAqIEByZXR1cm5zIHtSYW5nZVByb29mV2l0aENoZWNrfSBUaGUgZ2VuZXJhdGVkIHByb29mLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvdmVXaXRoQ2hlY2soXG4gIGN1cnZlOiBCYXNlQ3VydmUsXG4gIG1vZHVsdXNCaXRzOiBudW1iZXIsXG4gIHBrOiBQdWJsaWNLZXksXG4gIG50aWxkZTogRGVzZXJpYWxpemVkTnRpbGRlLFxuICBjMTogYmlnaW50LFxuICBjMjogYmlnaW50LFxuICB4OiBiaWdpbnQsXG4gIHk6IGJpZ2ludCxcbiAgcjogYmlnaW50LFxuICBYOiBiaWdpbnRcbik6IFByb21pc2U8UmFuZ2VQcm9vZldpdGhDaGVjaz4ge1xuICBjb25zdCBtb2R1bHVzQnl0ZXMgPSBNYXRoLmZsb29yKChtb2R1bHVzQml0cyArIDcpIC8gOCk7XG4gIGNvbnN0IHEgPSBjdXJ2ZS5vcmRlcigpO1xuICBjb25zdCBxMyA9IHEgKiogQmlnSW50KDMpO1xuICBjb25zdCBxNyA9IHEgKiogQmlnSW50KDcpO1xuICBjb25zdCBxbnRpbGRlID0gcSAqIG50aWxkZS5udGlsZGU7XG4gIGNvbnN0IHEzbnRpbGRlID0gcTMgKiBudGlsZGUubnRpbGRlO1xuICBjb25zdCBhbHBoYSA9IHJhbmRCZXR3ZWVuKHEzKTtcbiAgY29uc3QgcmhvID0gcmFuZEJldHdlZW4ocW50aWxkZSk7XG4gIGNvbnN0IHNpZ21hID0gcmFuZEJldHdlZW4ocW50aWxkZSk7XG4gIGNvbnN0IHRhdSA9IHJhbmRCZXR3ZWVuKHEzbnRpbGRlKTtcbiAgY29uc3QgcmhvcHJtID0gcmFuZEJldHdlZW4ocTNudGlsZGUpO1xuICBjb25zdCBiZXRhID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGsubik7XG4gIGNvbnN0IGdhbW1hID0gcmFuZEJldHdlZW4ocTcpO1xuICBjb25zdCB1ID0gY3VydmUuYmFzZVBvaW50TXVsdChjdXJ2ZS5zY2FsYXJSZWR1Y2UoYWxwaGEpKTtcbiAgY29uc3QgeiA9IChtb2RQb3cobnRpbGRlLmgxLCB4LCBudGlsZGUubnRpbGRlKSAqIG1vZFBvdyhudGlsZGUuaDIsIHJobywgbnRpbGRlLm50aWxkZSkpICUgbnRpbGRlLm50aWxkZTtcbiAgY29uc3QgenBybSA9IChtb2RQb3cobnRpbGRlLmgxLCBhbHBoYSwgbnRpbGRlLm50aWxkZSkgKiBtb2RQb3cobnRpbGRlLmgyLCByaG9wcm0sIG50aWxkZS5udGlsZGUpKSAlIG50aWxkZS5udGlsZGU7XG4gIGNvbnN0IHQgPSAobW9kUG93KG50aWxkZS5oMSwgeSwgbnRpbGRlLm50aWxkZSkgKiBtb2RQb3cobnRpbGRlLmgyLCBzaWdtYSwgbnRpbGRlLm50aWxkZSkpICUgbnRpbGRlLm50aWxkZTtcbiAgY29uc3QgdiA9XG4gICAgKCgobW9kUG93KGMxLCBhbHBoYSwgcGsuX24yKSAqIG1vZFBvdyhway5nLCBnYW1tYSwgcGsuX24yKSkgJSBway5fbjIpICogbW9kUG93KGJldGEsIHBrLm4sIHBrLl9uMikpICUgcGsuX24yO1xuICBjb25zdCB3ID0gKG1vZFBvdyhudGlsZGUuaDEsIGdhbW1hLCBudGlsZGUubnRpbGRlKSAqIG1vZFBvdyhudGlsZGUuaDIsIHRhdSwgbnRpbGRlLm50aWxkZSkpICUgbnRpbGRlLm50aWxkZTtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICBoYXNoLnVwZGF0ZSgnXFx4MGRcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHBrLm4sIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHBrLmcsIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKFgsIDMzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoYzEsIDIgKiBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShjMiwgMiAqIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHUsIDMzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoeiwgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoenBybSwgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUodCwgbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUodiwgMiAqIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHcsIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBjb25zdCBlID0gYmlnSW50RnJvbUJ1ZmZlckJFKGhhc2guZGlnZXN0KCkpICUgcTtcbiAgY29uc3QgcyA9IChtb2RQb3cociwgZSwgcGsubikgKiBiZXRhKSAlIHBrLm47XG4gIGNvbnN0IHMxID0gZSAqIHggKyBhbHBoYTtcbiAgY29uc3QgczIgPSBlICogcmhvICsgcmhvcHJtO1xuICBjb25zdCB0MSA9IGUgKiB5ICsgZ2FtbWE7XG4gIGNvbnN0IHQyID0gZSAqIHNpZ21hICsgdGF1O1xuICByZXR1cm4geyB6LCB6cHJtLCB0LCB2LCB3LCBzLCBzMSwgczIsIHQxLCB0MiwgdSB9O1xufVxuXG4vKipcbiAqIFZlcmlmeSBhIHplcm8ta25vd2xlZGdlIHJhbmdlIHByb29mIHRoYXQgYSBob21vbW9ycGhpY2FsbHkgbWFuaXB1bGF0ZWQgdmFsdWUgaXMgXCJzbWFsbFwiLlxuICogQHBhcmFtIHtCYXNlQ3VydmV9IGN1cnZlIEFuIGVsbGlwdGljIGN1cnZlIHRvIHVzZSBmb3IgZ3JvdXAgb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtb2R1bHVzQml0cyBUaGUgYml0IGNvdW50IG9mIHRoZSBwcm92ZXIncyBwdWJsaWMga2V5LlxuICogQHBhcmFtIHtQdWJsaWNLZXl9IHBrIFRoZSBwcm92ZXIncyBwdWJsaWMga2V5LlxuICogQHBhcmFtIHtEZXNlcmlhbGl6ZWROdGlsZGV9IG50aWxkZSBUaGUgdmVyaWZpZXIncyBOdGlsZGUgdmFsdWVzLlxuICogQHBhcmFtIHtSYW5nZVByb29mV2l0aENoZWNrfSBwcm9vZiBUaGUgcmFuZ2UgcHJvb2YuXG4gKiBAcGFyYW0ge2JpZ2ludH0gYzEgVGhlIG9yaWdpbmFsIGNpcGhlcnRleHQuXG4gKiBAcGFyYW0ge2JpZ2ludH0gYzIgVGhlIG1hbmlwdWxhdGVkIGNpcGhlcnRleHQuXG4gKiBAcGFyYW0ge2JpZ2ludH0gWCBUaGUgY3VydmUncyBiYXNlIHBvaW50IHJhaXNlZCB0byB4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmVyaWZpY2F0aW9uIHN1Y2NlZWRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5V2l0aENoZWNrKFxuICBjdXJ2ZTogQmFzZUN1cnZlLFxuICBtb2R1bHVzQml0czogbnVtYmVyLFxuICBwazogUHVibGljS2V5LFxuICBudGlsZGU6IERlc2VyaWFsaXplZE50aWxkZSxcbiAgcHJvb2Y6IFJhbmdlUHJvb2ZXaXRoQ2hlY2ssXG4gIGMxOiBiaWdpbnQsXG4gIGMyOiBiaWdpbnQsXG4gIFg6IGJpZ2ludFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1vZHVsdXNCeXRlcyA9IE1hdGguZmxvb3IoKG1vZHVsdXNCaXRzICsgNykgLyA4KTtcbiAgY29uc3QgcSA9IGN1cnZlLm9yZGVyKCk7XG4gIGNvbnN0IHEzID0gcSAqKiBCaWdJbnQoMyk7XG4gIGNvbnN0IHE3ID0gcSAqKiBCaWdJbnQoNyk7XG4gIGlmIChwcm9vZi5zMSA+IHEzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChwcm9vZi50MSA+IHE3KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgaGFzaC51cGRhdGUoJ1xceDBkXFx4MDBcXHgwMFxceDAwXFx4MDBcXHgwMFxceDAwXFx4MDAnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShway5uLCBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShway5nLCBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShYLCAzMykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKGMxLCAyICogbW9kdWx1c0J5dGVzKSk7XG4gIGhhc2gudXBkYXRlKCckJyk7XG4gIGhhc2gudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoYzIsIDIgKiBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIG1vZHVsdXNCeXRlcykpO1xuICBoYXNoLnVwZGF0ZSgnJCcpO1xuICBoYXNoLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDIgKiBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgaGFzaC51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCBtb2R1bHVzQnl0ZXMpKTtcbiAgaGFzaC51cGRhdGUoJyQnKTtcbiAgY29uc3QgZSA9IGJpZ0ludEZyb21CdWZmZXJCRShoYXNoLmRpZ2VzdCgpKSAlIHE7XG4gIGNvbnN0IGdTMSA9IGN1cnZlLmJhc2VQb2ludE11bHQoY3VydmUuc2NhbGFyUmVkdWNlKHByb29mLnMxKSk7XG4gIGNvbnN0IHhFVSA9IGN1cnZlLnBvaW50QWRkKGN1cnZlLnBvaW50TXVsdGlwbHkoWCwgZSksIHByb29mLnUpO1xuICBpZiAoZ1MxICE9PSB4RVUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGxlZnQsIHJpZ2h0O1xuICBjb25zdCBoMUV4cFMxID0gbW9kUG93KG50aWxkZS5oMSwgcHJvb2YuczEsIG50aWxkZS5udGlsZGUpO1xuICBjb25zdCBoMkV4cFMyID0gbW9kUG93KG50aWxkZS5oMiwgcHJvb2YuczIsIG50aWxkZS5udGlsZGUpO1xuICBsZWZ0ID0gKGgxRXhwUzEgKiBoMkV4cFMyKSAlIG50aWxkZS5udGlsZGU7XG4gIGNvbnN0IHpFeHBFID0gbW9kUG93KHByb29mLnosIGUsIG50aWxkZS5udGlsZGUpO1xuICByaWdodCA9ICh6RXhwRSAqIHByb29mLnpwcm0pICUgbnRpbGRlLm50aWxkZTtcbiAgaWYgKGxlZnQgIT09IHJpZ2h0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGgxRXhwVDEgPSBtb2RQb3cobnRpbGRlLmgxLCBwcm9vZi50MSwgbnRpbGRlLm50aWxkZSk7XG4gIGNvbnN0IGgyRXhwVDIgPSBtb2RQb3cobnRpbGRlLmgyLCBwcm9vZi50MiwgbnRpbGRlLm50aWxkZSk7XG4gIGxlZnQgPSAoaDFFeHBUMSAqIGgyRXhwVDIpICUgbnRpbGRlLm50aWxkZTtcbiAgY29uc3QgdEV4cEUgPSBtb2RQb3cocHJvb2YudCwgZSwgbnRpbGRlLm50aWxkZSk7XG4gIHJpZ2h0ID0gKHRFeHBFICogcHJvb2YudykgJSBudGlsZGUubnRpbGRlO1xuICBpZiAobGVmdCAhPT0gcmlnaHQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgYzFFeHBTMSA9IG1vZFBvdyhjMSwgcHJvb2YuczEsIHBrLl9uMik7XG4gIGNvbnN0IHNFeHBOID0gbW9kUG93KHByb29mLnMsIHBrLm4sIHBrLl9uMik7XG4gIGNvbnN0IGdhbW1hRXhwVDEgPSBtb2RQb3cocGsuZywgcHJvb2YudDEsIHBrLl9uMik7XG4gIGxlZnQgPSAoKChjMUV4cFMxICogc0V4cE4pICUgcGsuX24yKSAqIGdhbW1hRXhwVDEpICUgcGsuX24yO1xuICBjb25zdCBjMkV4cEUgPSBtb2RQb3coYzIsIGUsIHBrLl9uMik7XG4gIHJpZ2h0ID0gKGMyRXhwRSAqIHByb29mLnYpICUgcGsuX24yO1xuICByZXR1cm4gbGVmdCA9PT0gcmlnaHQ7XG59XG4iXX0=
|