@bitgo-beta/utxo-descriptors 0.0.1-beta.21 → 0.0.1-beta.211
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/dist/cjs/src/sbtc/index.d.ts +1 -0
- package/dist/cjs/src/sbtc/index.d.ts.map +1 -1
- package/dist/cjs/src/sbtc/index.js +2 -1
- package/dist/cjs/src/sbtc/parseDescriptor.d.ts +55 -0
- package/dist/cjs/src/sbtc/parseDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/sbtc/parseDescriptor.js +185 -0
- package/dist/cjs/test/unit/sbtc/parseDescriptor.d.ts +2 -0
- package/dist/cjs/test/unit/sbtc/parseDescriptor.d.ts.map +1 -0
- package/dist/cjs/test/unit/sbtc/parseDescriptor.js +202 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/sbtc/index.d.ts +1 -0
- package/dist/esm/sbtc/index.d.ts.map +1 -1
- package/dist/esm/sbtc/index.js +2 -1
- package/dist/esm/sbtc/parseDescriptor.d.ts +55 -0
- package/dist/esm/sbtc/parseDescriptor.d.ts.map +1 -0
- package/dist/esm/sbtc/parseDescriptor.js +182 -0
- package/package.json +4 -4
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Descriptor, ast } from '@bitgo/wasm-utxo';
|
|
2
|
+
/**
|
|
3
|
+
* Parsed components of an sBTC peg-in deposit descriptor.
|
|
4
|
+
*
|
|
5
|
+
* The parser returns both the high-level
|
|
6
|
+
* fields callers usually need (keys, lockTime, fee, recipient) and the raw
|
|
7
|
+
* miniscript AST nodes so the leaves can be re-compiled into a
|
|
8
|
+
* `Miniscript` via `ast.formatNode` + `Miniscript.fromString`.
|
|
9
|
+
*/
|
|
10
|
+
export type ParsedSbtcDepositDescriptor = {
|
|
11
|
+
/** 32-byte x-only signers aggregate key from the deposit leaf. */
|
|
12
|
+
signersAggregateKey: Buffer;
|
|
13
|
+
/** Max signer fee parsed from the first 8 bytes of the payload_drop value. */
|
|
14
|
+
maxFee: bigint;
|
|
15
|
+
/** 22-byte Stacks recipient parsed from the trailing bytes of the payload. */
|
|
16
|
+
stacksRecipient: Buffer;
|
|
17
|
+
/** Reclaim-leaf relative timelock (number of Bitcoin blocks, OP_CSV argument). */
|
|
18
|
+
lockTime: number;
|
|
19
|
+
/**
|
|
20
|
+
* The three concrete x-only reclaim keys from the reclaim-leaf `multi_a`,
|
|
21
|
+
* in the order they appear inside the leaf (descriptor library sorts by hex).
|
|
22
|
+
* Only present when the descriptor is in its derived/definite form — for
|
|
23
|
+
* derivable descriptors the multi_a entries are xpub strings (e.g.
|
|
24
|
+
* `xpub.../*`), which can't be turned into 32-byte buffers without picking
|
|
25
|
+
* a derivation index. Callers that need raw key bytes MUST pass the
|
|
26
|
+
* derived descriptor (see `deriveReclaimKeys` for derivable inputs).
|
|
27
|
+
*/
|
|
28
|
+
reclaimKeys: [Buffer, Buffer, Buffer] | undefined;
|
|
29
|
+
/** Raw miniscript AST for the deposit leaf (first tap-tree leaf). */
|
|
30
|
+
depositMiniscriptNode: ast.MiniscriptNode;
|
|
31
|
+
/** Raw miniscript AST for the reclaim leaf (second tap-tree leaf). */
|
|
32
|
+
reclaimMiniscriptNode: ast.MiniscriptNode;
|
|
33
|
+
/**
|
|
34
|
+
* The three raw `multi_a` key entries from the reclaim leaf, exactly as
|
|
35
|
+
* they appear in the descriptor — `xpub.../*` for derivable descriptors and
|
|
36
|
+
* 64-hex-char x-only keys for definite descriptors. Useful for callers that
|
|
37
|
+
* need the original xpub form (e.g. to round-trip back to a descriptor
|
|
38
|
+
* builder) and don't want the resolved `reclaimKeys` buffers.
|
|
39
|
+
*/
|
|
40
|
+
reclaimKeyStrings: [string, string, string];
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Parse an sBTC peg-in deposit descriptor and return its components.
|
|
44
|
+
*
|
|
45
|
+
* Returns `null` if the descriptor does not match the expected
|
|
46
|
+
* `tr(<UNSPENDABLE>, {<depositLeaf>, <reclaimLeaf>})` shape — same convention
|
|
47
|
+
* as babylon's `parseStakingDescriptor`. Throws if the shape matches but a
|
|
48
|
+
* sub-field is malformed (e.g. signers key isn't 32 bytes, payload isn't 30
|
|
49
|
+
* bytes, threshold isn't 2).
|
|
50
|
+
*
|
|
51
|
+
* Accepts both the `Descriptor` WASM object (definite or derivable) and a
|
|
52
|
+
* pre-extracted `ast.DescriptorNode`
|
|
53
|
+
*/
|
|
54
|
+
export declare function parseSbtcDepositDescriptor(descriptor: Descriptor | ast.DescriptorNode): ParsedSbtcDepositDescriptor | null;
|
|
55
|
+
//# sourceMappingURL=parseDescriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseDescriptor.d.ts","sourceRoot":"","sources":["../../../src/sbtc/parseDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAK1D;;;;;;;GAOG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC,kEAAkE;IAClE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,eAAe,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;;OAQG;IACH,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAClD,qEAAqE;IACrE,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC;IAC1C,sEAAsE;IACtE,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC;IAC1C;;;;;;OAMG;IACH,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C,CAAC;AAwJF;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,UAAU,GAAG,GAAG,CAAC,cAAc,GAC1C,2BAA2B,GAAG,IAAI,CA8CpC"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { BIP32, Descriptor, ast } from '@bitgo/wasm-utxo';
|
|
2
|
+
import { PatternMatcher } from '@bitgo-beta/utxo-core/descriptor';
|
|
3
|
+
import { MAX_FEE_BYTE_LENGTH, STACKS_RECIPIENT_BYTE_LENGTH, UNSPENDABLE_INTERNAL_KEY } from './constants';
|
|
4
|
+
function asString(v, field) {
|
|
5
|
+
if (typeof v !== 'string') {
|
|
6
|
+
throw new Error(`${field} must be a string`);
|
|
7
|
+
}
|
|
8
|
+
return v;
|
|
9
|
+
}
|
|
10
|
+
function asNumber(v, field) {
|
|
11
|
+
if (typeof v !== 'number') {
|
|
12
|
+
throw new Error(`${field} must be a number`);
|
|
13
|
+
}
|
|
14
|
+
return v;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Pull `[threshold, ...keys]` out of a `multi_a` AST node value, validating
|
|
18
|
+
* each element. The descriptor's `multi_a` is rendered with keys either as
|
|
19
|
+
* concrete hex (definite descriptor) or as xpub strings ending in `/*`
|
|
20
|
+
* (derivable descriptor) — both are strings here, so we don't try to convert
|
|
21
|
+
* to Buffer at this level.
|
|
22
|
+
*/
|
|
23
|
+
function parseMulti(multi) {
|
|
24
|
+
if (!Array.isArray(multi) || multi.length < 1) {
|
|
25
|
+
throw new Error('Invalid multi_a structure: not an array or empty');
|
|
26
|
+
}
|
|
27
|
+
const [threshold, ...keys] = multi;
|
|
28
|
+
if (typeof threshold !== 'number') {
|
|
29
|
+
throw new Error('Invalid multi_a structure: threshold is not a number');
|
|
30
|
+
}
|
|
31
|
+
if (!keys.every((k) => typeof k === 'string')) {
|
|
32
|
+
throw new Error('Invalid multi_a structure: not all keys are strings');
|
|
33
|
+
}
|
|
34
|
+
return [threshold, keys];
|
|
35
|
+
}
|
|
36
|
+
function parseDepositLeaf(depositNode, matcher) {
|
|
37
|
+
const depositPattern = {
|
|
38
|
+
and_v: [{ payload_drop: { $var: 'payloadHex' } }, { pk: { $var: 'signersKey' } }],
|
|
39
|
+
};
|
|
40
|
+
const match = matcher.match(depositNode, depositPattern);
|
|
41
|
+
if (!match) {
|
|
42
|
+
throw new Error('Deposit leaf does not match expected pattern');
|
|
43
|
+
}
|
|
44
|
+
const payloadHex = asString(match.payloadHex, 'payload_drop value');
|
|
45
|
+
const signersKeyHex = asString(match.signersKey, 'pk_k key');
|
|
46
|
+
const expectedPayloadLength = MAX_FEE_BYTE_LENGTH + STACKS_RECIPIENT_BYTE_LENGTH;
|
|
47
|
+
const payload = Buffer.from(payloadHex, 'hex');
|
|
48
|
+
if (payload.length !== expectedPayloadLength) {
|
|
49
|
+
throw new Error(`payload_drop value must be ${expectedPayloadLength} bytes (${expectedPayloadLength * 2} hex chars), got ${payload.length} bytes`);
|
|
50
|
+
}
|
|
51
|
+
const maxFee = payload.readBigUInt64BE(0);
|
|
52
|
+
const stacksRecipient = payload.subarray(MAX_FEE_BYTE_LENGTH);
|
|
53
|
+
const signersAggregateKey = Buffer.from(signersKeyHex, 'hex');
|
|
54
|
+
if (signersAggregateKey.length !== 32) {
|
|
55
|
+
throw new Error(`signersAggregateKey must be 32 bytes x-only, got ${signersAggregateKey.length}`);
|
|
56
|
+
}
|
|
57
|
+
return { signersAggregateKey, maxFee, stacksRecipient };
|
|
58
|
+
}
|
|
59
|
+
function parseReclaimLeaf(reclaimNode, matcher) {
|
|
60
|
+
// and_v(r:older(<lockTime>), multi_a(2, k1, k2, k3))
|
|
61
|
+
const reclaimPattern = {
|
|
62
|
+
and_v: [{ 'r:older': { $var: 'lockTime' } }, { multi_a: { $var: 'reclaimMulti' } }],
|
|
63
|
+
};
|
|
64
|
+
const match = matcher.match(reclaimNode, reclaimPattern);
|
|
65
|
+
if (!match) {
|
|
66
|
+
throw new Error('Reclaim leaf does not match expected pattern');
|
|
67
|
+
}
|
|
68
|
+
const lockTime = asNumber(match.lockTime, 'r:older argument');
|
|
69
|
+
if (lockTime <= 0) {
|
|
70
|
+
throw new Error(`reclaim lockTime must be > 0, got ${lockTime}`);
|
|
71
|
+
}
|
|
72
|
+
const [threshold, reclaimKeyStrings] = parseMulti(match.reclaimMulti);
|
|
73
|
+
if (threshold !== 2) {
|
|
74
|
+
throw new Error(`reclaim multi_a threshold must be 2, got ${threshold}`);
|
|
75
|
+
}
|
|
76
|
+
if (reclaimKeyStrings.length !== 3) {
|
|
77
|
+
throw new Error(`reclaim multi_a must have exactly 3 keys, got ${reclaimKeyStrings.length}`);
|
|
78
|
+
}
|
|
79
|
+
return { lockTime, reclaimKeyStrings };
|
|
80
|
+
}
|
|
81
|
+
const HEX_X_ONLY_KEY = /^[0-9a-fA-F]{64}$/;
|
|
82
|
+
const XPUB_WITH_INDEX = /^([1-9A-HJ-NP-Za-km-z]+)\/(\d+)$/;
|
|
83
|
+
/**
|
|
84
|
+
* Resolve a single `multi_a` key entry to a 32-byte x-only public key.
|
|
85
|
+
*
|
|
86
|
+
* Accepts:
|
|
87
|
+
* - 64-hex-char string → returned as-is (already x-only)
|
|
88
|
+
* - `xpub.../<index>` → BIP32-derive at that index and drop the prefix byte
|
|
89
|
+
*
|
|
90
|
+
* Returns null for any other shape (e.g. wildcard `xpub.../*`, malformed input).
|
|
91
|
+
*/
|
|
92
|
+
function resolveReclaimKey(s) {
|
|
93
|
+
if (HEX_X_ONLY_KEY.test(s)) {
|
|
94
|
+
return Buffer.from(s, 'hex');
|
|
95
|
+
}
|
|
96
|
+
const m = s.match(XPUB_WITH_INDEX);
|
|
97
|
+
if (!m) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const [, xpub, indexStr] = m;
|
|
101
|
+
const index = Number.parseInt(indexStr, 10);
|
|
102
|
+
if (!Number.isFinite(index) || index < 0) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
let node;
|
|
106
|
+
try {
|
|
107
|
+
node = BIP32.fromBase58(xpub);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
// BIP32 public key is 33 bytes (1 prefix + 32 x-only). Drop the prefix.
|
|
113
|
+
return Buffer.from(node.derive(index).publicKey.subarray(1));
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Convert reclaim-leaf key strings into 32-byte x-only buffers. Accepts both
|
|
117
|
+
* the definite/derived form (concrete 64-hex-char x-only keys) and the form
|
|
118
|
+
* produced by `Descriptor.atDerivationIndex(n)` (`xpub.../<n>`). Returns
|
|
119
|
+
* undefined if any entry is still wildcard (`xpub.../*`) or otherwise
|
|
120
|
+
* unresolvable.
|
|
121
|
+
*/
|
|
122
|
+
function reclaimKeysFromStrings(keyStrings) {
|
|
123
|
+
const resolved = keyStrings.map(resolveReclaimKey);
|
|
124
|
+
if (resolved.some((b) => b === null) || resolved.length !== 3) {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
return [resolved[0], resolved[1], resolved[2]];
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Parse an sBTC peg-in deposit descriptor and return its components.
|
|
131
|
+
*
|
|
132
|
+
* Returns `null` if the descriptor does not match the expected
|
|
133
|
+
* `tr(<UNSPENDABLE>, {<depositLeaf>, <reclaimLeaf>})` shape — same convention
|
|
134
|
+
* as babylon's `parseStakingDescriptor`. Throws if the shape matches but a
|
|
135
|
+
* sub-field is malformed (e.g. signers key isn't 32 bytes, payload isn't 30
|
|
136
|
+
* bytes, threshold isn't 2).
|
|
137
|
+
*
|
|
138
|
+
* Accepts both the `Descriptor` WASM object (definite or derivable) and a
|
|
139
|
+
* pre-extracted `ast.DescriptorNode`
|
|
140
|
+
*/
|
|
141
|
+
export function parseSbtcDepositDescriptor(descriptor) {
|
|
142
|
+
const pattern = {
|
|
143
|
+
tr: [UNSPENDABLE_INTERNAL_KEY, [{ $var: 'depositLeaf' }, { $var: 'reclaimLeaf' }]],
|
|
144
|
+
};
|
|
145
|
+
const matcher = new PatternMatcher();
|
|
146
|
+
const descriptorNode = descriptor instanceof Descriptor ? ast.fromDescriptor(descriptor) : descriptor;
|
|
147
|
+
const result = matcher.match(descriptorNode, pattern);
|
|
148
|
+
if (!result) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
const depositMiniscriptNode = result.depositLeaf;
|
|
152
|
+
let reclaimMiniscriptNode = result.reclaimLeaf;
|
|
153
|
+
const { signersAggregateKey, maxFee, stacksRecipient } = parseDepositLeaf(depositMiniscriptNode, matcher);
|
|
154
|
+
const { lockTime, reclaimKeyStrings } = parseReclaimLeaf(reclaimMiniscriptNode, matcher);
|
|
155
|
+
const reclaimKeyStringsTuple = [
|
|
156
|
+
reclaimKeyStrings[0],
|
|
157
|
+
reclaimKeyStrings[1],
|
|
158
|
+
reclaimKeyStrings[2],
|
|
159
|
+
];
|
|
160
|
+
const reclaimKeys = reclaimKeysFromStrings(reclaimKeyStrings);
|
|
161
|
+
if (reclaimKeys) {
|
|
162
|
+
// Rewrite the reclaim leaf with concrete hex keys when we can resolve
|
|
163
|
+
// them — `Miniscript.fromString(..., 'tap')` only accepts x-only hex in
|
|
164
|
+
// `multi_a`, not xpub-form strings. With this rewrite the formatted
|
|
165
|
+
// leaf is directly compilable; without it callers must do the
|
|
166
|
+
// resolution themselves.
|
|
167
|
+
reclaimMiniscriptNode = {
|
|
168
|
+
and_v: [{ 'r:older': lockTime }, { multi_a: [2, ...reclaimKeys.map((k) => k.toString('hex'))] }],
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
signersAggregateKey,
|
|
173
|
+
maxFee,
|
|
174
|
+
stacksRecipient,
|
|
175
|
+
lockTime,
|
|
176
|
+
reclaimKeys,
|
|
177
|
+
reclaimKeyStrings: reclaimKeyStringsTuple,
|
|
178
|
+
depositMiniscriptNode,
|
|
179
|
+
reclaimMiniscriptNode,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NidGMvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQVcsTUFBTSxrQ0FBa0MsQ0FBQztBQUUzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsNEJBQTRCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUEyQzFHLFNBQVMsUUFBUSxDQUFDLENBQVUsRUFBRSxLQUFhO0lBQ3pDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssbUJBQW1CLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FBVSxFQUFFLEtBQWE7SUFDekMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxLQUFjO0lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ25DLElBQUksT0FBTyxTQUFT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QVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNqRyxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU87UUFDTCxtQkFBbUI7UUFDbkIsTUFBTTtRQUNOLGVBQWU7UUFDZixRQUFRO1FBQ1IsV0FBVztRQUNYLGlCQUFpQixFQUFFLHNCQUFzQjtRQUN6QyxxQkFBcUI7UUFDckIscUJBQXFCO0tBQ3RCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQklQMzIsIERlc2NyaXB0b3IsIGFzdCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgUGF0dGVybk1hdGNoZXIsIFBhdHRlcm4gfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWNvcmUvZGVzY3JpcHRvcic7XG5cbmltcG9ydCB7IE1BWF9GRUVfQllURV9MRU5HVEgsIFNUQUNLU19SRUNJUElFTlRfQllURV9MRU5HVEgsIFVOU1BFTkRBQkxFX0lOVEVSTkFMX0tFWSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBQYXJzZWQgY29tcG9uZW50cyBvZiBhbiBzQlRDIHBlZy1pbiBkZXBvc2l0IGRlc2NyaXB0b3IuXG4gKlxuICogVGhlIHBhcnNlciByZXR1cm5zIGJvdGggdGhlIGhpZ2gtbGV2ZWxcbiAqIGZpZWxkcyBjYWxsZXJzIHVzdWFsbHkgbmVlZCAoa2V5cywgbG9ja1RpbWUsIGZlZSwgcmVjaXBpZW50KSBhbmQgdGhlIHJhd1xuICogbWluaXNjcmlwdCBBU1Qgbm9kZXMgc28gdGhlIGxlYXZlcyBjYW4gYmUgcmUtY29tcGlsZWQgaW50byBhXG4gKiBgTWluaXNjcmlwdGAgdmlhIGBhc3QuZm9ybWF0Tm9kZWAgKyBgTWluaXNjcmlwdC5mcm9tU3RyaW5nYC5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyc2VkU2J0Y0RlcG9zaXREZXNjcmlwdG9yID0ge1xuICAvKiogMzItYnl0ZSB4LW9ubHkgc2lnbmVycyBhZ2dyZWdhdGUga2V5IGZyb20gdGhlIGRlcG9zaXQgbGVhZi4gKi9cbiAgc2lnbmVyc0FnZ3JlZ2F0ZUtleTogQnVmZmVyO1xuICAvKiogTWF4IHNpZ25lciBmZWUgcGFyc2VkIGZyb20gdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIHBheWxvYWRfZHJvcCB2YWx1ZS4gKi9cbiAgbWF4RmVlOiBiaWdpbnQ7XG4gIC8qKiAyMi1ieXRlIFN0YWNrcyByZWNpcGllbnQgcGFyc2VkIGZyb20gdGhlIHRyYWlsaW5nIGJ5dGVzIG9mIHRoZSBwYXlsb2FkLiAqL1xuICBzdGFja3NSZWNpcGllbnQ6IEJ1ZmZlcjtcbiAgLyoqIFJlY2xhaW0tbGVhZiByZWxhdGl2ZSB0aW1lbG9jayAobnVtYmVyIG9mIEJpdGNvaW4gYmxvY2tzLCBPUF9DU1YgYXJndW1lbnQpLiAqL1xuICBsb2NrVGltZTogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHRocmVlIGNvbmNyZXRlIHgtb25seSByZWNsYWltIGtleXMgZnJvbSB0aGUgcmVjbGFpbS1sZWFmIGBtdWx0aV9hYCxcbiAgICogaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluc2lkZSB0aGUgbGVhZiAoZGVzY3JpcHRvciBsaWJyYXJ5IHNvcnRzIGJ5IGhleCkuXG4gICAqIE9ubHkgcHJlc2VudCB3aGVuIHRoZSBkZXNjcmlwdG9yIGlzIGluIGl0cyBkZXJpdmVkL2RlZmluaXRlIGZvcm0g4oCUIGZvclxuICAgKiBkZXJpdmFibGUgZGVzY3JpcHRvcnMgdGhlIG11bHRpX2EgZW50cmllcyBhcmUgeHB1YiBzdHJpbmdzIChlLmcuXG4gICAqIGB4cHViLi4uLypgKSwgd2hpY2ggY2FuJ3QgYmUgdHVybmVkIGludG8gMzItYnl0ZSBidWZmZXJzIHdpdGhvdXQgcGlja2luZ1xuICAgKiBhIGRlcml2YXRpb24gaW5kZXguIENhbGxlcnMgdGhhdCBuZWVkIHJhdyBrZXkgYnl0ZXMgTVVTVCBwYXNzIHRoZVxuICAgKiBkZXJpdmVkIGRlc2NyaXB0b3IgKHNlZSBgZGVyaXZlUmVjbGFpbUtleXNgIGZvciBkZXJpdmFibGUgaW5wdXRzKS5cbiAgICovXG4gIHJlY2xhaW1LZXlzOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0gfCB1bmRlZmluZWQ7XG4gIC8qKiBSYXcgbWluaXNjcmlwdCBBU1QgZm9yIHRoZSBkZXBvc2l0IGxlYWYgKGZpcnN0IHRhcC10cmVlIGxlYWYpLiAqL1xuICBkZXBvc2l0TWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgLyoqIFJhdyBtaW5pc2NyaXB0IEFTVCBmb3IgdGhlIHJlY2xhaW0gbGVhZiAoc2Vjb25kIHRhcC10cmVlIGxlYWYpLiAqL1xuICByZWNsYWltTWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSB0aHJlZSByYXcgYG11bHRpX2FgIGtleSBlbnRyaWVzIGZyb20gdGhlIHJlY2xhaW0gbGVhZiwgZXhhY3RseSBhc1xuICAgKiB0aGV5IGFwcGVhciBpbiB0aGUgZGVzY3JpcHRvciDigJQgYHhwdWIuLi4vKmAgZm9yIGRlcml2YWJsZSBkZXNjcmlwdG9ycyBhbmRcbiAgICogNjQtaGV4LWNoYXIgeC1vbmx5IGtleXMgZm9yIGRlZmluaXRlIGRlc2NyaXB0b3JzLiBVc2VmdWwgZm9yIGNhbGxlcnMgdGhhdFxuICAgKiBuZWVkIHRoZSBvcmlnaW5hbCB4cHViIGZvcm0gKGUuZy4gdG8gcm91bmQtdHJpcCBiYWNrIHRvIGEgZGVzY3JpcHRvclxuICAgKiBidWlsZGVyKSBhbmQgZG9uJ3Qgd2FudCB0aGUgcmVzb2x2ZWQgYHJlY2xhaW1LZXlzYCBidWZmZXJzLlxuICAgKi9cbiAgcmVjbGFpbUtleVN0cmluZ3M6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXTtcbn07XG5cbmZ1bmN0aW9uIGFzU3RyaW5nKHY6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHYgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5cbmZ1bmN0aW9uIGFzTnVtYmVyKHY6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHYgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5cbi8qKlxuICogUHVsbCBgW3RocmVzaG9sZCwgLi4ua2V5c11gIG91dCBvZiBhIGBtdWx0aV9hYCBBU1Qgbm9kZSB2YWx1ZSwgdmFsaWRhdGluZ1xuICogZWFjaCBlbGVtZW50LiBUaGUgZGVzY3JpcHRvcidzIGBtdWx0aV9hYCBpcyByZW5kZXJlZCB3aXRoIGtleXMgZWl0aGVyIGFzXG4gKiBjb25jcmV0ZSBoZXggKGRlZmluaXRlIGRlc2NyaXB0b3IpIG9yIGFzIHhwdWIgc3RyaW5ncyBlbmRpbmcgaW4gYC8qYFxuICogKGRlcml2YWJsZSBkZXNjcmlwdG9yKSDigJQgYm90aCBhcmUgc3RyaW5ncyBoZXJlLCBzbyB3ZSBkb24ndCB0cnkgdG8gY29udmVydFxuICogdG8gQnVmZmVyIGF0IHRoaXMgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTXVsdGkobXVsdGk6IHVua25vd24pOiBbbnVtYmVyLCBzdHJpbmdbXV0ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobXVsdGkpIHx8IG11bHRpLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbXVsdGlfYSBzdHJ1Y3R1cmU6IG5vdCBhbiBhcnJheSBvciBlbXB0eScpO1xuICB9XG4gIGNvbnN0IFt0aHJlc2hvbGQsIC4uLmtleXNdID0gbXVsdGk7XG4gIGlmICh0eXBlb2YgdGhyZXNob2xkICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtdWx0aV9hIHN0cnVjdHVyZTogdGhyZXNob2xkIGlzIG5vdCBhIG51bWJlcicpO1xuICB9XG4gIGlmICgha2V5cy5ldmVyeSgoaykgPT4gdHlwZW9mIGsgPT09ICdzdHJpbmcnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtdWx0aV9hIHN0cnVjdHVyZTogbm90IGFsbCBrZXlzIGFyZSBzdHJpbmdzJyk7XG4gIH1cbiAgcmV0dXJuIFt0aHJlc2hvbGQsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBwYXJzZURlcG9zaXRMZWFmKFxuICBkZXBvc2l0Tm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlLFxuICBtYXRjaGVyOiBQYXR0ZXJuTWF0Y2hlclxuKTogeyBzaWduZXJzQWdncmVnYXRlS2V5OiBCdWZmZXI7IG1heEZlZTogYmlnaW50OyBzdGFja3NSZWNpcGllbnQ6IEJ1ZmZlciB9IHtcbiAgY29uc3QgZGVwb3NpdFBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgYW5kX3Y6IFt7IHBheWxvYWRfZHJvcDogeyAkdmFyOiAncGF5bG9hZEhleCcgfSB9LCB7IHBrOiB7ICR2YXI6ICdzaWduZXJzS2V5JyB9IH1dLFxuICB9O1xuICBjb25zdCBtYXRjaCA9IG1hdGNoZXIubWF0Y2goZGVwb3NpdE5vZGUsIGRlcG9zaXRQYXR0ZXJuKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRGVwb3NpdCBsZWFmIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHBhdHRlcm4nKTtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWRIZXggPSBhc1N0cmluZyhtYXRjaC5wYXlsb2FkSGV4LCAncGF5bG9hZF9kcm9wIHZhbHVlJyk7XG4gIGNvbnN0IHNpZ25lcnNLZXlIZXggPSBhc1N0cmluZyhtYXRjaC5zaWduZXJzS2V5LCAncGtfayBrZXknKTtcblxuICBjb25zdCBleHBlY3RlZFBheWxvYWRMZW5ndGggPSBNQVhfRkVFX0JZVEVfTEVOR1RIICsgU1RBQ0tTX1JFQ0lQSUVOVF9CWVRFX0xFTkdUSDtcbiAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHBheWxvYWRIZXgsICdoZXgnKTtcbiAgaWYgKHBheWxvYWQubGVuZ3RoICE9PSBleHBlY3RlZFBheWxvYWRMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcGF5bG9hZF9kcm9wIHZhbHVlIG11c3QgYmUgJHtleHBlY3RlZFBheWxvYWRMZW5ndGh9IGJ5dGVzICgke2V4cGVjdGVkUGF5bG9hZExlbmd0aCAqIDJ9IGhleCBjaGFycyksIGdvdCAke1xuICAgICAgICBwYXlsb2FkLmxlbmd0aFxuICAgICAgfSBieXRlc2BcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbWF4RmVlID0gcGF5bG9hZC5yZWFkQmlnVUludDY0QkUoMCk7XG4gIGNvbnN0IHN0YWNrc1JlY2lwaWVudCA9IHBheWxvYWQuc3ViYXJyYXkoTUFYX0ZFRV9CWVRFX0xFTkdUSCk7XG5cbiAgY29uc3Qgc2lnbmVyc0FnZ3JlZ2F0ZUtleSA9IEJ1ZmZlci5mcm9tKHNpZ25lcnNLZXlIZXgsICdoZXgnKTtcbiAgaWYgKHNpZ25lcnNBZ2dyZWdhdGVLZXkubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgc2lnbmVyc0FnZ3JlZ2F0ZUtleSBtdXN0IGJlIDMyIGJ5dGVzIHgtb25seSwgZ290ICR7c2lnbmVyc0FnZ3JlZ2F0ZUtleS5sZW5ndGh9YCk7XG4gIH1cblxuICByZXR1cm4geyBzaWduZXJzQWdncmVnYXRlS2V5LCBtYXhGZWUsIHN0YWNrc1JlY2lwaWVudCB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVJlY2xhaW1MZWFmKFxuICByZWNsYWltTm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlLFxuICBtYXRjaGVyOiBQYXR0ZXJuTWF0Y2hlclxuKTogeyBsb2NrVGltZTogbnVtYmVyOyByZWNsYWltS2V5U3RyaW5nczogc3RyaW5nW10gfSB7XG4gIC8vIGFuZF92KHI6b2xkZXIoPGxvY2tUaW1lPiksIG11bHRpX2EoMiwgazEsIGsyLCBrMykpXG4gIGNvbnN0IHJlY2xhaW1QYXR0ZXJuOiBQYXR0ZXJuID0ge1xuICAgIGFuZF92OiBbeyAncjpvbGRlcic6IHsgJHZhcjogJ2xvY2tUaW1lJyB9IH0sIHsgbXVsdGlfYTogeyAkdmFyOiAncmVjbGFpbU11bHRpJyB9IH1dLFxuICB9O1xuICBjb25zdCBtYXRjaCA9IG1hdGNoZXIubWF0Y2gocmVjbGFpbU5vZGUsIHJlY2xhaW1QYXR0ZXJuKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVjbGFpbSBsZWFmIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHBhdHRlcm4nKTtcbiAgfVxuXG4gIGNvbnN0IGxvY2tUaW1lID0gYXNOdW1iZXIobWF0Y2gubG9ja1RpbWUsICdyOm9sZGVyIGFyZ3VtZW50Jyk7XG4gIGlmIChsb2NrVGltZSA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGByZWNsYWltIGxvY2tUaW1lIG11c3QgYmUgPiAwLCBnb3QgJHtsb2NrVGltZX1gKTtcbiAgfVxuXG4gIGNvbnN0IFt0aHJlc2hvbGQsIHJlY2xhaW1LZXlTdHJpbmdzXSA9IHBhcnNlTXVsdGkobWF0Y2gucmVjbGFpbU11bHRpKTtcbiAgaWYgKHRocmVzaG9sZCAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmVjbGFpbSBtdWx0aV9hIHRocmVzaG9sZCBtdXN0IGJlIDIsIGdvdCAke3RocmVzaG9sZH1gKTtcbiAgfVxuICBpZiAocmVjbGFpbUtleVN0cmluZ3MubGVuZ3RoICE9PSAzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGByZWNsYWltIG11bHRpX2EgbXVzdCBoYXZlIGV4YWN0bHkgMyBrZXlzLCBnb3QgJHtyZWNsYWltS2V5U3RyaW5ncy5sZW5ndGh9YCk7XG4gIH1cblxuICByZXR1cm4geyBsb2NrVGltZSwgcmVjbGFpbUtleVN0cmluZ3MgfTtcbn1cblxuY29uc3QgSEVYX1hfT05MWV9LRVkgPSAvXlswLTlhLWZBLUZdezY0fSQvO1xuY29uc3QgWFBVQl9XSVRIX0lOREVYID0gL14oWzEtOUEtSEotTlAtWmEta20tel0rKVxcLyhcXGQrKSQvO1xuXG4vKipcbiAqIFJlc29sdmUgYSBzaW5nbGUgYG11bHRpX2FgIGtleSBlbnRyeSB0byBhIDMyLWJ5dGUgeC1vbmx5IHB1YmxpYyBrZXkuXG4gKlxuICogQWNjZXB0czpcbiAqICAgLSA2NC1oZXgtY2hhciBzdHJpbmcg4oaSIHJldHVybmVkIGFzLWlzIChhbHJlYWR5IHgtb25seSlcbiAqICAgLSBgeHB1Yi4uLi88aW5kZXg+YCDihpIgQklQMzItZGVyaXZlIGF0IHRoYXQgaW5kZXggYW5kIGRyb3AgdGhlIHByZWZpeCBieXRlXG4gKlxuICogUmV0dXJucyBudWxsIGZvciBhbnkgb3RoZXIgc2hhcGUgKGUuZy4gd2lsZGNhcmQgYHhwdWIuLi4vKmAsIG1hbGZvcm1lZCBpbnB1dCkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZWNsYWltS2V5KHM6IHN0cmluZyk6IEJ1ZmZlciB8IG51bGwge1xuICBpZiAoSEVYX1hfT05MWV9LRVkudGVzdChzKSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShzLCAnaGV4Jyk7XG4gIH1cbiAgY29uc3QgbSA9IHMubWF0Y2goWFBVQl9XSVRIX0lOREVYKTtcbiAgaWYgKCFtKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgWywgeHB1YiwgaW5kZXhTdHJdID0gbTtcbiAgY29uc3QgaW5kZXggPSBOdW1iZXIucGFyc2VJbnQoaW5kZXhTdHIsIDEwKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaW5kZXgpIHx8IGluZGV4IDwgMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGxldCBub2RlO1xuICB0cnkge1xuICAgIG5vZGUgPSBCSVAzMi5mcm9tQmFzZTU4KHhwdWIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBCSVAzMiBwdWJsaWMga2V5IGlzIDMzIGJ5dGVzICgxIHByZWZpeCArIDMyIHgtb25seSkuIERyb3AgdGhlIHByZWZpeC5cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG5vZGUuZGVyaXZlKGluZGV4KS5wdWJsaWNLZXkuc3ViYXJyYXkoMSkpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgcmVjbGFpbS1sZWFmIGtleSBzdHJpbmdzIGludG8gMzItYnl0ZSB4LW9ubHkgYnVmZmVycy4gQWNjZXB0cyBib3RoXG4gKiB0aGUgZGVmaW5pdGUvZGVyaXZlZCBmb3JtIChjb25jcmV0ZSA2NC1oZXgtY2hhciB4LW9ubHkga2V5cykgYW5kIHRoZSBmb3JtXG4gKiBwcm9kdWNlZCBieSBgRGVzY3JpcHRvci5hdERlcml2YXRpb25JbmRleChuKWAgKGB4cHViLi4uLzxuPmApLiBSZXR1cm5zXG4gKiB1bmRlZmluZWQgaWYgYW55IGVudHJ5IGlzIHN0aWxsIHdpbGRjYXJkIChgeHB1Yi4uLi8qYCkgb3Igb3RoZXJ3aXNlXG4gKiB1bnJlc29sdmFibGUuXG4gKi9cbmZ1bmN0aW9uIHJlY2xhaW1LZXlzRnJvbVN0cmluZ3Moa2V5U3RyaW5nczogc3RyaW5nW10pOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0gfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZCA9IGtleVN0cmluZ3MubWFwKHJlc29sdmVSZWNsYWltS2V5KTtcbiAgaWYgKHJlc29sdmVkLnNvbWUoKGIpID0+IGIgPT09IG51bGwpIHx8IHJlc29sdmVkLmxlbmd0aCAhPT0gMykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIFtyZXNvbHZlZFswXSBhcyBCdWZmZXIsIHJlc29sdmVkWzFdIGFzIEJ1ZmZlciwgcmVzb2x2ZWRbMl0gYXMgQnVmZmVyXTtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBzQlRDIHBlZy1pbiBkZXBvc2l0IGRlc2NyaXB0b3IgYW5kIHJldHVybiBpdHMgY29tcG9uZW50cy5cbiAqXG4gKiBSZXR1cm5zIGBudWxsYCBpZiB0aGUgZGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWRcbiAqIGB0cig8VU5TUEVOREFCTEU+LCB7PGRlcG9zaXRMZWFmPiwgPHJlY2xhaW1MZWFmPn0pYCBzaGFwZSDigJQgc2FtZSBjb252ZW50aW9uXG4gKiBhcyBiYWJ5bG9uJ3MgYHBhcnNlU3Rha2luZ0Rlc2NyaXB0b3JgLiBUaHJvd3MgaWYgdGhlIHNoYXBlIG1hdGNoZXMgYnV0IGFcbiAqIHN1Yi1maWVsZCBpcyBtYWxmb3JtZWQgKGUuZy4gc2lnbmVycyBrZXkgaXNuJ3QgMzIgYnl0ZXMsIHBheWxvYWQgaXNuJ3QgMzBcbiAqIGJ5dGVzLCB0aHJlc2hvbGQgaXNuJ3QgMikuXG4gKlxuICogQWNjZXB0cyBib3RoIHRoZSBgRGVzY3JpcHRvcmAgV0FTTSBvYmplY3QgKGRlZmluaXRlIG9yIGRlcml2YWJsZSkgYW5kIGFcbiAqIHByZS1leHRyYWN0ZWQgYGFzdC5EZXNjcmlwdG9yTm9kZWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2J0Y0RlcG9zaXREZXNjcmlwdG9yKFxuICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yIHwgYXN0LkRlc2NyaXB0b3JOb2RlXG4pOiBQYXJzZWRTYnRjRGVwb3NpdERlc2NyaXB0b3IgfCBudWxsIHtcbiAgY29uc3QgcGF0dGVybjogUGF0dGVybiA9IHtcbiAgICB0cjogW1VOU1BFTkRBQkxFX0lOVEVSTkFMX0tFWSwgW3sgJHZhcjogJ2RlcG9zaXRMZWFmJyB9LCB7ICR2YXI6ICdyZWNsYWltTGVhZicgfV1dLFxuICB9O1xuXG4gIGNvbnN0IG1hdGNoZXIgPSBuZXcgUGF0dGVybk1hdGNoZXIoKTtcbiAgY29uc3QgZGVzY3JpcHRvck5vZGUgPSBkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvciA/IGFzdC5mcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKSA6IGRlc2NyaXB0b3I7XG4gIGNvbnN0IHJlc3VsdCA9IG1hdGNoZXIubWF0Y2goZGVzY3JpcHRvck5vZGUsIHBhdHRlcm4pO1xuXG4gIGlmICghcmVzdWx0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkZXBvc2l0TWluaXNjcmlwdE5vZGUgPSByZXN1bHQuZGVwb3NpdExlYWYgYXMgYXN0Lk1pbmlzY3JpcHROb2RlO1xuICBsZXQgcmVjbGFpbU1pbmlzY3JpcHROb2RlID0gcmVzdWx0LnJlY2xhaW1MZWFmIGFzIGFzdC5NaW5pc2NyaXB0Tm9kZTtcblxuICBjb25zdCB7IHNpZ25lcnNBZ2dyZWdhdGVLZXksIG1heEZlZSwgc3RhY2tzUmVjaXBpZW50IH0gPSBwYXJzZURlcG9zaXRMZWFmKGRlcG9zaXRNaW5pc2NyaXB0Tm9kZSwgbWF0Y2hlcik7XG4gIGNvbnN0IHsgbG9ja1RpbWUsIHJlY2xhaW1LZXlTdHJpbmdzIH0gPSBwYXJzZVJlY2xhaW1MZWFmKHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSwgbWF0Y2hlcik7XG4gIGNvbnN0IHJlY2xhaW1LZXlTdHJpbmdzVHVwbGU6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFtcbiAgICByZWNsYWltS2V5U3RyaW5nc1swXSxcbiAgICByZWNsYWltS2V5U3RyaW5nc1sxXSxcbiAgICByZWNsYWltS2V5U3RyaW5nc1syXSxcbiAgXTtcblxuICBjb25zdCByZWNsYWltS2V5cyA9IHJlY2xhaW1LZXlzRnJvbVN0cmluZ3MocmVjbGFpbUtleVN0cmluZ3MpO1xuICBpZiAocmVjbGFpbUtleXMpIHtcbiAgICAvLyBSZXdyaXRlIHRoZSByZWNsYWltIGxlYWYgd2l0aCBjb25jcmV0ZSBoZXgga2V5cyB3aGVuIHdlIGNhbiByZXNvbHZlXG4gICAgLy8gdGhlbSDigJQgYE1pbmlzY3JpcHQuZnJvbVN0cmluZyguLi4sICd0YXAnKWAgb25seSBhY2NlcHRzIHgtb25seSBoZXggaW5cbiAgICAvLyBgbXVsdGlfYWAsIG5vdCB4cHViLWZvcm0gc3RyaW5ncy4gV2l0aCB0aGlzIHJld3JpdGUgdGhlIGZvcm1hdHRlZFxuICAgIC8vIGxlYWYgaXMgZGlyZWN0bHkgY29tcGlsYWJsZTsgd2l0aG91dCBpdCBjYWxsZXJzIG11c3QgZG8gdGhlXG4gICAgLy8gcmVzb2x1dGlvbiB0aGVtc2VsdmVzLlxuICAgIHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSA9IHtcbiAgICAgIGFuZF92OiBbeyAncjpvbGRlcic6IGxvY2tUaW1lIH0sIHsgbXVsdGlfYTogWzIsIC4uLnJlY2xhaW1LZXlzLm1hcCgoaykgPT4gay50b1N0cmluZygnaGV4JykpXSB9XSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzaWduZXJzQWdncmVnYXRlS2V5LFxuICAgIG1heEZlZSxcbiAgICBzdGFja3NSZWNpcGllbnQsXG4gICAgbG9ja1RpbWUsXG4gICAgcmVjbGFpbUtleXMsXG4gICAgcmVjbGFpbUtleVN0cmluZ3M6IHJlY2xhaW1LZXlTdHJpbmdzVHVwbGUsXG4gICAgZGVwb3NpdE1pbmlzY3JpcHROb2RlLFxuICAgIHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSxcbiAgfTtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo-beta/utxo-descriptors",
|
|
3
|
-
"version": "0.0.1-beta.
|
|
3
|
+
"version": "0.0.1-beta.211",
|
|
4
4
|
"description": "BitGo SDK for building UTXO descriptors",
|
|
5
5
|
"main": "./dist/cjs/src/index.js",
|
|
6
6
|
"module": "./dist/esm/index.js",
|
|
@@ -59,8 +59,8 @@
|
|
|
59
59
|
]
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@bitgo-beta/utxo-core": "1.8.1-beta.
|
|
63
|
-
"@bitgo/wasm-utxo": "^4.
|
|
62
|
+
"@bitgo-beta/utxo-core": "1.8.1-beta.1078",
|
|
63
|
+
"@bitgo/wasm-utxo": "^4.27.0"
|
|
64
64
|
},
|
|
65
|
-
"gitHead": "
|
|
65
|
+
"gitHead": "8cab40f61d0969c828bf8cbc7badcb7714995e9a"
|
|
66
66
|
}
|