@bitgo-beta/utxo-ord 1.1.3-alpha.412 → 1.1.3-alpha.414

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.
Files changed (57) hide show
  1. package/dist/cjs/src/OrdOutput.d.ts.map +1 -0
  2. package/dist/cjs/src/OrdOutput.js +197 -0
  3. package/dist/cjs/src/OutputLayout.d.ts.map +1 -0
  4. package/dist/cjs/src/OutputLayout.js +246 -0
  5. package/dist/cjs/src/SatPoint.d.ts.map +1 -0
  6. package/dist/cjs/src/SatPoint.js +48 -0
  7. package/dist/cjs/src/SatRange.d.ts.map +1 -0
  8. package/dist/cjs/src/SatRange.js +58 -0
  9. package/dist/cjs/src/combinations.d.ts.map +1 -0
  10. package/dist/cjs/src/combinations.js +13 -0
  11. package/dist/cjs/src/index.d.ts.map +1 -0
  12. package/dist/{src → cjs/src}/index.js +1 -1
  13. package/dist/cjs/src/inscriptions.d.ts.map +1 -0
  14. package/dist/cjs/src/inscriptions.js +202 -0
  15. package/dist/cjs/src/psbt.d.ts.map +1 -0
  16. package/dist/cjs/src/psbt.js +154 -0
  17. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  18. package/dist/esm/OrdOutput.d.ts +65 -0
  19. package/dist/esm/OrdOutput.js +192 -0
  20. package/dist/esm/OutputLayout.d.ts +47 -0
  21. package/dist/esm/OutputLayout.js +240 -0
  22. package/dist/esm/SatPoint.d.ts +13 -0
  23. package/dist/esm/SatPoint.js +43 -0
  24. package/dist/esm/SatRange.d.ts +26 -0
  25. package/dist/esm/SatRange.js +53 -0
  26. package/dist/esm/combinations.d.ts +2 -0
  27. package/dist/esm/combinations.js +10 -0
  28. package/dist/esm/index.d.ts +10 -0
  29. package/dist/esm/index.js +10 -0
  30. package/dist/esm/inscriptions.d.ts +31 -0
  31. package/dist/esm/inscriptions.js +164 -0
  32. package/dist/esm/psbt.d.ts +67 -0
  33. package/dist/{src → esm}/psbt.js +31 -38
  34. package/package.json +26 -9
  35. package/dist/src/OrdOutput.js +0 -197
  36. package/dist/src/OutputLayout.js +0 -246
  37. package/dist/src/SatPoint.js +0 -48
  38. package/dist/src/SatRange.js +0 -58
  39. package/dist/src/combinations.js +0 -13
  40. package/dist/src/inscriptions.js +0 -202
  41. package/dist/tsconfig.tsbuildinfo +0 -1
  42. /package/dist/{src → cjs/src}/OrdOutput.d.ts +0 -0
  43. /package/dist/{src → cjs/src}/OutputLayout.d.ts +0 -0
  44. /package/dist/{src → cjs/src}/SatPoint.d.ts +0 -0
  45. /package/dist/{src → cjs/src}/SatRange.d.ts +0 -0
  46. /package/dist/{src → cjs/src}/combinations.d.ts +0 -0
  47. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  48. /package/dist/{src → cjs/src}/inscriptions.d.ts +0 -0
  49. /package/dist/{src → cjs/src}/psbt.d.ts +0 -0
  50. /package/dist/{src → esm}/OrdOutput.d.ts.map +0 -0
  51. /package/dist/{src → esm}/OutputLayout.d.ts.map +0 -0
  52. /package/dist/{src → esm}/SatPoint.d.ts.map +0 -0
  53. /package/dist/{src → esm}/SatRange.d.ts.map +0 -0
  54. /package/dist/{src → esm}/combinations.d.ts.map +0 -0
  55. /package/dist/{src → esm}/index.d.ts.map +0 -0
  56. /package/dist/{src → esm}/inscriptions.d.ts.map +0 -0
  57. /package/dist/{src → esm}/psbt.d.ts.map +0 -0
@@ -1,246 +0,0 @@
1
- "use strict";
2
- /*
3
-
4
- This file contains code for creating an output layouts for transactions that pass on inscriptions.
5
-
6
- When passing on an inscription, we want to satisfy a few constraints:
7
-
8
- * All outputs should be larger than a minimal value (dust limit)
9
- * The sum of all output values needs to be less than the input to cover the transaction fee.
10
- * The output containing the inscription should be as small as possible, but large enough to
11
- contain the inscription.
12
-
13
- To keep the inscription output small, we can pad the satoshi range preceding and following the range
14
- with change outputs, which have a minimal size and incur a fee cost.
15
-
16
-
17
- Broadly speaking, there are four scenarios:
18
-
19
- (1) Small inscription input that has just enough value to pay for fee and a single inscription
20
- output (u0). No padding outputs.
21
- ┌────────┬────────┐
22
- │ │ u0 │
23
- │ r ┼ │
24
- │ ├────────┘
25
- │ │ fee
26
- └────────┘
27
-
28
-
29
- (2) Large inscription input with inscription close to start of input.
30
- Inscription output followed by change output (u1) padding the remaining value.
31
-
32
- ┌────────┬────────┐
33
- │ │ u0 │
34
- │ r ┼ │
35
- │ ├────────┤
36
- │ │ u1 │
37
- │ │ │
38
- │ │ │
39
- │ │ │
40
- │ │ │
41
- │ │ │
42
- │ │ │
43
- │ │ │
44
- │ │ │
45
- │ │ │
46
- │ ├────────┘
47
- │ │
48
- │ │ fee
49
- │ │
50
- └────────┘
51
-
52
-
53
- (3) Large inscription input with inscription close to end of input.
54
- Change output padding start followed by inscription output.
55
-
56
- ┌────────┬────────┐
57
- │ │ u0 │
58
- │ │ │
59
- │ │ │
60
- │ │ │
61
- │ │ │
62
- │ │ │
63
- │ │ │
64
- │ │ │
65
- │ │ │
66
- │ ├────────┤
67
- │ r ┼ │
68
- │ │ u1 │
69
- │ ├────────┘
70
- │ │
71
- │ │ fee
72
- │ │
73
- └────────┘
74
-
75
-
76
- (4) Large inscription input with inscription in the middle.
77
- Inscription input (u1) with padding on both sides (u0 and u2)
78
-
79
- ┌────────┬────────┐
80
- │ │ u0 │
81
- │ │ │
82
- │ │ │
83
- │ │ │
84
- │ │ │
85
- │ ├────────┤
86
- │ │ u1 │
87
- │ r ┼ │
88
- │ ├────────┤
89
- │ │ u2 │
90
- │ │ │
91
- │ │ │
92
- │ │ │
93
- │ ├────────┘
94
- │ │
95
- │ │ fee
96
- │ │
97
- └────────┘
98
- */
99
- Object.defineProperty(exports, "__esModule", { value: true });
100
- exports.toArray = toArray;
101
- exports.toParameters = toParameters;
102
- exports.getOrdOutputsForLayout = getOrdOutputsForLayout;
103
- exports.findOutputLayout = findOutputLayout;
104
- const ZERO = BigInt(0);
105
- const ONE = BigInt(1);
106
- function max(a, b) {
107
- return a < b ? b : a;
108
- }
109
- function min(a, b) {
110
- return a < b ? a : b;
111
- }
112
- function sum(arr) {
113
- return arr.reduce((a, b) => a + b, ZERO);
114
- }
115
- /** @return canonical sequence of parameters */
116
- function toArray(p) {
117
- return [p.firstChangeOutput, p.inscriptionOutput, p.secondChangeOutput, p.feeOutput];
118
- }
119
- function toParameters(firstChangeOutput, inscriptionOutput, secondChangeOutput, feeOutput) {
120
- return {
121
- firstChangeOutput,
122
- inscriptionOutput,
123
- secondChangeOutput,
124
- feeOutput,
125
- };
126
- }
127
- /**
128
- * Translates a layout into OrdOutputs. Absent outputs are set to `null`.
129
- *
130
- * @param inscriptionInput
131
- * @param layout
132
- * @return OrdOutputs for layout
133
- */
134
- function getOrdOutputsForLayout(inscriptionInput, layout) {
135
- const outputs = inscriptionInput.splitAllWithParams(toArray(layout), { exact: true, allowZero: true });
136
- if (outputs.length !== 4) {
137
- throw new Error(`unexpected result`);
138
- }
139
- return toParameters(...outputs);
140
- }
141
- /**
142
- * @param constraints
143
- * @param inscriptionInput
144
- * @param layout
145
- * @return true iff layout satisfies constraints
146
- */
147
- function check(constraints, inscriptionInput, layout) {
148
- if ((layout.firstChangeOutput === ZERO || constraints.minChangeOutput <= layout.firstChangeOutput) &&
149
- (layout.secondChangeOutput === ZERO || constraints.minChangeOutput <= layout.secondChangeOutput) &&
150
- constraints.minInscriptionOutput <= layout.inscriptionOutput &&
151
- layout.inscriptionOutput <= constraints.maxInscriptionOutput &&
152
- getFeeForOutputs(constraints, [layout.firstChangeOutput, layout.inscriptionOutput, layout.secondChangeOutput]) <=
153
- layout.feeOutput &&
154
- sum(toArray(layout)) === inscriptionInput.value) {
155
- /* make sure inscription actually lies on the inscriptionOutput */
156
- const outputs = getOrdOutputsForLayout(inscriptionInput, layout);
157
- return outputs.inscriptionOutput?.ordinals.length === 1;
158
- }
159
- return false;
160
- }
161
- function getFeeForOutputs(p, outputs) {
162
- return outputs.reduce((sum, oValue) => sum + (oValue === ZERO ? ZERO : p.feePerOutput), p.feeFixed);
163
- }
164
- function getStartChangeOutput(c) {
165
- // we don't need a change padding output
166
- if (c.satPos < c.maxInscriptionOutput) {
167
- return ZERO;
168
- }
169
- if (c.minChangeOutput <= c.satPos) {
170
- return c.satPos;
171
- }
172
- return null;
173
- }
174
- function getInscriptionOutput(c, startChangeOutput) {
175
- const result = min(c.maxInscriptionOutput, max(c.minInscriptionOutput, c.satPos - startChangeOutput + ONE));
176
- if (c.satPos < startChangeOutput || startChangeOutput + result < c.satPos) {
177
- return null;
178
- }
179
- // if is not worth creating an end change output, let's maximize the inscription output
180
- if (getEndChangeOutput(c, startChangeOutput, result) === ZERO) {
181
- const remainder = c.total - startChangeOutput - getFeeForOutputs(c, [startChangeOutput, result]);
182
- return min(remainder, c.maxInscriptionOutput);
183
- }
184
- return result;
185
- }
186
- function getEndChangeOutput(c, startChangeOutput, inscriptionOutput) {
187
- const remainder = c.total - sum([startChangeOutput, inscriptionOutput]);
188
- const minFeeWithoutSecondOutput = getFeeForOutputs(c, [startChangeOutput, inscriptionOutput]);
189
- const minFeeWithSecondOutput = getFeeForOutputs(c, [startChangeOutput, inscriptionOutput, c.minChangeOutput]);
190
- if (remainder < minFeeWithoutSecondOutput) {
191
- // We cannot even pay the fee for the output(s) we have so far.
192
- return null;
193
- }
194
- if (remainder - minFeeWithSecondOutput < c.minChangeOutput) {
195
- // The remainder is too small to pay for the end change output. Let's skip it and pay a higher fee.
196
- return ZERO;
197
- }
198
- // let's use as much as we can for fee while leaving enough for fee
199
- return remainder - minFeeWithSecondOutput;
200
- }
201
- function getFeeOutput(c, startChangeOutput, inscriptionOutput, endChangeOutput) {
202
- const minFee = getFeeForOutputs(c, [startChangeOutput, inscriptionOutput, endChangeOutput]);
203
- const remainder = c.total - sum([startChangeOutput, inscriptionOutput, endChangeOutput]);
204
- if (remainder < minFee) {
205
- return null;
206
- }
207
- return remainder;
208
- }
209
- /**
210
- * @param inscriptionInput
211
- * @param search
212
- * @return a solution that satisfies constraints. If no solution can be found, return `undefined`.
213
- */
214
- function findOutputLayout(inscriptionInput, search) {
215
- if (inscriptionInput.ordinals.length !== 1) {
216
- throw new Error(`unexpected ordinal count ${inscriptionInput.ordinals.length}`);
217
- }
218
- if (inscriptionInput.ordinals[0].size() !== ONE) {
219
- throw new Error(`only single-satoshi inscriptions are supported`);
220
- }
221
- const satPos = inscriptionInput.ordinals[0].start;
222
- const total = inscriptionInput.value;
223
- const constraints = { ...search, satPos, total };
224
- const startChangeOutput = getStartChangeOutput(constraints);
225
- if (startChangeOutput === null) {
226
- return;
227
- }
228
- const inscriptionOutput = getInscriptionOutput(constraints, startChangeOutput);
229
- if (inscriptionOutput === null) {
230
- return;
231
- }
232
- const endChangeOutput = getEndChangeOutput(constraints, startChangeOutput, inscriptionOutput);
233
- if (endChangeOutput === null) {
234
- return;
235
- }
236
- const feeOutput = getFeeOutput(constraints, startChangeOutput, inscriptionOutput, endChangeOutput);
237
- if (feeOutput === null) {
238
- return;
239
- }
240
- const result = toParameters(startChangeOutput, inscriptionOutput, endChangeOutput, feeOutput);
241
- if (!check(constraints, inscriptionInput, result)) {
242
- throw new Error(`invalid result`);
243
- }
244
- return result;
245
- }
246
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3V0cHV0TGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL091dHB1dExheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdHRzs7QUFrQ0gsMEJBRUM7QUFFRCxvQ0FZQztBQVlELHdEQVVDO0FBcUdELDRDQXFDQztBQTlNRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXRCLFNBQVMsR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTO0lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVELFNBQVMsR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTO0lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVELFNBQVMsR0FBRyxDQUFDLEdBQWE7SUFDeEIsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBZ0JELCtDQUErQztBQUMvQyxTQUFnQixPQUFPLENBQUksQ0FBZ0I7SUFDekMsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQs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LGdCQUFnQixDQUFDLEtBQUssQ0FBQztJQUVyQyxNQUFNLFdBQVcsR0FBZ0IsRUFBRSxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFFOUQsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1RCxJQUFJLGlCQUFpQixLQUFLLElBQUksRUFBRSxDQUFDO1FBQy9CLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUMvRSxJQUFJLGlCQUFpQixLQUFLLElBQUksRUFBRSxDQUFDO1FBQy9CLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDOUYsSUFBSSxlQUFlLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDN0IsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsV0FBVyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ25HLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5RixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5cblRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciBjcmVhdGluZyBhbiBvdXRwdXQgbGF5b3V0cyBmb3IgdHJhbnNhY3Rpb25zIHRoYXQgcGFzcyBvbiBpbnNjcmlwdGlvbnMuXG5cbldoZW4gcGFzc2luZyBvbiBhbiBpbnNjcmlwdGlvbiwgd2Ugd2FudCB0byBzYXRpc2Z5IGEgZmV3IGNvbnN0cmFpbnRzOlxuXG4qIEFsbCBvdXRwdXRzIHNob3VsZCBiZSBsYXJnZXIgdGhhbiBhIG1pbmltYWwgdmFsdWUgKGR1c3QgbGltaXQpXG4qIFRoZSBzdW0gb2YgYWxsIG91dHB1dCB2YWx1ZXMgbmVlZHMgdG8gYmUgbGVzcyB0aGFuIHRoZSBpbnB1dCB0byBjb3ZlciB0aGUgdHJhbnNhY3Rpb24gZmVlLlxuKiBUaGUgb3V0cHV0IGNvbnRhaW5pbmcgdGhlIGluc2NyaXB0aW9uIHNob3VsZCBiZSBhcyBzbWFsbCBhcyBwb3NzaWJsZSwgYnV0IGxhcmdlIGVub3VnaCB0b1xuICBjb250YWluIHRoZSBpbnNjcmlwdGlvbi5cblxuVG8ga2VlcCB0aGUgaW5zY3JpcHRpb24gb3V0cHV0IHNtYWxsLCB3ZSBjYW4gcGFkIHRoZSBzYXRvc2hpIHJhbmdlIHByZWNlZGluZyBhbmQgZm9sbG93aW5nIHRoZSByYW5nZVxud2l0aCBjaGFuZ2Ugb3V0cHV0cywgd2hpY2ggaGF2ZSBhIG1pbmltYWwgc2l6ZSBhbmQgaW5jdXIgYSBmZWUgY29zdC5cblxuXG5Ccm9hZGx5IHNwZWFraW5nLCB0aGVyZSBhcmUgZm91ciBzY2VuYXJpb3M6XG5cbigxKSBTbWFsbCBpbnNjcmlwdGlvbiBpbnB1dCB0aGF0IGhhcyBqdXN0IGVub3VnaCB2YWx1ZSB0byBwYXkgZm9yIGZlZSBhbmQgYSBzaW5nbGUgaW5zY3JpcHRpb25cbiAgICBvdXRwdXQgKHUwKS4gTm8gcGFkZGluZyBvdXRwdXRzLlxuICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgIOKUgiAgICAgICAg4pSCIHUwICAgICDilIJcbiAgICDilIIgICAgICByIOKUvCAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICDilIIgICAgICAgIOKUgiBmZWVcbiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilJhcblxuXG4oMikgTGFyZ2UgaW5zY3JpcHRpb24gaW5wdXQgd2l0aCBpbnNjcmlwdGlvbiBjbG9zZSB0byBzdGFydCBvZiBpbnB1dC5cbiAgICBJbnNjcmlwdGlvbiBvdXRwdXQgZm9sbG93ZWQgYnkgY2hhbmdlIG91dHB1dCAodTEpIHBhZGRpbmcgdGhlIHJlbWFpbmluZyB2YWx1ZS5cblxuICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgIOKUgiAgICAgICAg4pSCIHUwICAgICDilIJcbiAgICDilIIgICAgICByIOKUvCAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilKRcbiAgICDilIIgICAgICAgIOKUgiB1MSAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCIGZlZVxuICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG5cblxuKDMpIExhcmdlIGluc2NyaXB0aW9uIGlucHV0IHdpdGggaW5zY3JpcHRpb24gY2xvc2UgdG8gZW5kIG9mIGlucHV0LlxuICAgIENoYW5nZSBvdXRwdXQgcGFkZGluZyBzdGFydCBmb2xsb3dlZCBieSBpbnNjcmlwdGlvbiBvdXRwdXQuXG5cbiAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgICDilIIgICAgICAgIOKUgiB1MCAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpFxuICAgIOKUgiAgICAgIHIg4pS8ICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiB1MSAgICAg4pSCXG4gICAg4pSCICAgICAgICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCIGZlZVxuICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG5cblxuKDQpIExhcmdlIGluc2NyaXB0aW9uIGlucHV0IHdpdGggaW5zY3JpcHRpb24gaW4gdGhlIG1pZGRsZS5cbiAgICBJbnNjcmlwdGlvbiBpbnB1dCAodTEpIHdpdGggcGFkZGluZyBvbiBib3RoIHNpZGVzICh1MCBhbmQgdTIpXG5cbiAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgICDilIIgICAgICAgIOKUgiB1MCAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkXG4gICAg4pSCICAgICAgICDilIIgdTEgICAgIOKUglxuICAgIOKUgiAgICAgIHIg4pS8ICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpFxuICAgIOKUgiAgICAgICAg4pSCIHUyICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgZmVlXG4gICAg4pSCICAgICAgICDilIJcbiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAqL1xuXG5pbXBvcnQgeyBPcmRPdXRwdXQgfSBmcm9tICcuL09yZE91dHB1dCc7XG5cbmNvbnN0IFpFUk8gPSBCaWdJbnQoMCk7XG5jb25zdCBPTkUgPSBCaWdJbnQoMSk7XG5cbmZ1bmN0aW9uIG1heChhOiBiaWdpbnQsIGI6IGJpZ2ludCk6IGJpZ2ludCB7XG4gIHJldHVybiBhIDwgYiA/IGIgOiBhO1xufVxuXG5mdW5jdGlvbiBtaW4oYTogYmlnaW50LCBiOiBiaWdpbnQpOiBiaWdpbnQge1xuICByZXR1cm4gYSA8IGIgPyBhIDogYjtcbn1cblxuZnVuY3Rpb24gc3VtKGFycjogYmlnaW50W10pOiBiaWdpbnQge1xuICByZXR1cm4gYXJyLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIFpFUk8pO1xufVxuXG4vKipcbiAqIEEgcmFuZ2UgY29uc3RyYWludFxuICovXG50eXBlIFBhcmFtZXRlcnM8VD4gPSB7XG4gIC8qKiBQYWRkaW5nIHByZWNlZGluZyB0aGUgaW5zY3JpcHRpb24gb3V0cHV0ICovXG4gIGZpcnN0Q2hhbmdlT3V0cHV0OiBUO1xuICAvKiogVGhlIGluc2NyaXB0aW9uIG91dHB1dCB0aGF0IHdpbGwgaW5oZXJpdCB0aGUgaW5wdXQgaW5zY3JpcHRpb24gKi9cbiAgaW5zY3JpcHRpb25PdXRwdXQ6IFQ7XG4gIC8qKiBQYWRkaW5nIGZvbGxvd2luZyB0aGUgaW5zY3JpcHRpb24gb3V0cHV0ICovXG4gIHNlY29uZENoYW5nZU91dHB1dDogVDtcbiAgLyoqIE5vdCBhIHJlYWwgb3V0cHV0LCB1c2VkIG9ubHkgdG8gc2ltcGxpZnkgY2FsY3VsYXRpb25zICovXG4gIGZlZU91dHB1dDogVDtcbn07XG5cbi8qKiBAcmV0dXJuIGNhbm9uaWNhbCBzZXF1ZW5jZSBvZiBwYXJhbWV0ZXJzICovXG5leHBvcnQgZnVuY3Rpb24gdG9BcnJheTxUPihwOiBQYXJhbWV0ZXJzPFQ+KTogW1QsIFQsIFQsIFRdIHtcbiAgcmV0dXJuIFtwLmZpcnN0Q2hhbmdlT3V0cHV0LCBwLmluc2NyaXB0aW9uT3V0cHV0LCBwLnNlY29uZENoYW5nZU91dHB1dCwgcC5mZWVPdXRwdXRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9QYXJhbWV0ZXJzPFQ+KFxuICBmaXJzdENoYW5nZU91dHB1dDogVCxcbiAgaW5zY3JpcHRpb25PdXRwdXQ6IFQsXG4gIHNlY29uZENoYW5nZU91dHB1dDogVCxcbiAgZmVlT3V0cHV0OiBUXG4pOiBQYXJhbWV0ZXJzPFQ+IHtcbiAgcmV0dXJuIHtcbiAgICBmaXJzdENoYW5nZU91dHB1dCxcbiAgICBpbnNjcmlwdGlvbk91dHB1dCxcbiAgICBzZWNvbmRDaGFuZ2VPdXRwdXQsXG4gICAgZmVlT3V0cHV0LFxuICB9O1xufVxuXG4vKiogQSBmaW5pc2hlZCBvdXRwdXQgbGF5b3V0ICovXG5leHBvcnQgdHlwZSBPdXRwdXRMYXlvdXQgPSBQYXJhbWV0ZXJzPGJpZ2ludD47XG5cbi8qKlxuICogVHJhbnNsYXRlcyBhIGxheW91dCBpbnRvIE9yZE91dHB1dHMuIEFic2VudCBvdXRwdXRzIGFyZSBzZXQgdG8gYG51bGxgLlxuICpcbiAqIEBwYXJhbSBpbnNjcmlwdGlvbklucHV0XG4gKiBAcGFyYW0gbGF5b3V0XG4gKiBAcmV0dXJuIE9yZE91dHB1dHMgZm9yIGxheW91dFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JkT3V0cHV0c0ZvckxheW91dChcbiAgaW5zY3JpcHRpb25JbnB1dDogT3JkT3V0cHV0LFxuICBsYXlvdXQ6IE91dHB1dExheW91dFxuKTogUGFyYW1ldGVyczxPcmRPdXRwdXQgfCBudWxsPiB7XG4gIGNvbnN0IG91dHB1dHMgPSBpbnNjcmlwdGlvbklucHV0LnNwbGl0QWxsV2l0aFBhcmFtcyh0b0FycmF5KGxheW91dCksIHsgZXhhY3Q6IHRydWUsIGFsbG93WmVybzogdHJ1ZSB9KTtcbiAgaWYgKG91dHB1dHMubGVuZ3RoICE9PSA0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIHJlc3VsdGApO1xuICB9XG4gIHR5cGUgVCA9IE9yZE91dHB1dCB8IG51bGw7XG4gIHJldHVybiB0b1BhcmFtZXRlcnMoLi4uKG91dHB1dHMgYXMgW1QsIFQsIFQsIFRdKSk7XG59XG5cbi8qKlxuICogQHBhcmFtIGNvbnN0cmFpbnRzXG4gKiBAcGFyYW0gaW5zY3JpcHRpb25JbnB1dFxuICogQHBhcmFtIGxheW91dFxuICogQHJldHVybiB0cnVlIGlmZiBsYXlvdXQgc2F0aXNmaWVzIGNvbnN0cmFpbnRzXG4gKi9cbmZ1bmN0aW9uIGNoZWNrKGNvbnN0cmFpbnRzOiBDb25zdHJhaW50cywgaW5zY3JpcHRpb25JbnB1dDogT3JkT3V0cHV0LCBsYXlvdXQ6IE91dHB1dExheW91dCk6IGJvb2xlYW4ge1xuICBpZiAoXG4gICAgKGxheW91dC5maXJzdENoYW5nZU91dHB1dCA9PT0gWkVSTyB8fCBjb25zdHJhaW50cy5taW5DaGFuZ2VPdXRwdXQgPD0gbGF5b3V0LmZpcnN0Q2hhbmdlT3V0cHV0KSAmJlxuICAgIChsYXlvdXQuc2Vjb25kQ2hhbmdlT3V0cHV0ID09PSBaRVJPIHx8IGNvbnN0cmFpbnRzLm1pbkNoYW5nZU91dHB1dCA8PSBsYXlvdXQuc2Vjb25kQ2hhbmdlT3V0cHV0KSAmJlxuICAgIGNvbnN0cmFpbnRzLm1pbkluc2NyaXB0aW9uT3V0cHV0IDw9IGxheW91dC5pbnNjcmlwdGlvbk91dHB1dCAmJlxuICAgIGxheW91dC5pbnNjcmlwdGlvbk91dHB1dCA8PSBjb25zdHJhaW50cy5tYXhJbnNjcmlwdGlvbk91dHB1dCAmJlxuICAgIGdldEZlZUZvck91dHB1dHMoY29uc3RyYWludHMsIFtsYXlvdXQuZmlyc3RDaGFuZ2VPdXRwdXQsIGxheW91dC5pbnNjcmlwdGlvbk91dHB1dCwgbGF5b3V0LnNlY29uZENoYW5nZU91dHB1dF0pIDw9XG4gICAgICBsYXlvdXQuZmVlT3V0cHV0ICYmXG4gICAgc3VtKHRvQXJyYXkobGF5b3V0KSkgPT09IGluc2NyaXB0aW9uSW5wdXQudmFsdWVcbiAgKSB7XG4gICAgLyogbWFrZSBzdXJlIGluc2NyaXB0aW9uIGFjdHVhbGx5IGxpZXMgb24gdGhlIGluc2NyaXB0aW9uT3V0cHV0ICovXG4gICAgY29uc3Qgb3V0cHV0cyA9IGdldE9yZE91dHB1dHNGb3JMYXlvdXQoaW5zY3JpcHRpb25JbnB1dCwgbGF5b3V0KTtcbiAgICByZXR1cm4gb3V0cHV0cy5pbnNjcmlwdGlvbk91dHB1dD8ub3JkaW5hbHMubGVuZ3RoID09PSAxO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEhpZ2gtbGV2ZWwgY29uc3RyYWludHMgZm9yIG91dHB1dCBsYXlvdXRcbiAqL1xuZXhwb3J0IHR5cGUgQ29uc3RyYWludHMgPSB7XG4gIG1pbkNoYW5nZU91dHB1dDogYmlnaW50O1xuICBtaW5JbnNjcmlwdGlvbk91dHB1dDogYmlnaW50O1xuICBtYXhJbnNjcmlwdGlvbk91dHB1dDogYmlnaW50O1xuICBmZWVGaXhlZDogYmlnaW50O1xuICBmZWVQZXJPdXRwdXQ6IGJpZ2ludDtcbiAgc2F0UG9zOiBiaWdpbnQ7XG4gIHRvdGFsOiBiaWdpbnQ7XG59O1xuXG5mdW5jdGlvbiBnZXRGZWVGb3JPdXRwdXRzKHA6IHsgZmVlUGVyT3V0cHV0OiBiaWdpbnQ7IGZlZUZpeGVkOiBiaWdpbnQgfSwgb3V0cHV0czogYmlnaW50W10pOiBiaWdpbnQge1xuICByZXR1cm4gb3V0cHV0cy5yZWR1Y2UoKHN1bSwgb1ZhbHVlKTogYmlnaW50ID0+IHN1bSArIChvVmFsdWUgPT09IFpFUk8gPyBaRVJPIDogcC5mZWVQZXJPdXRwdXQpLCBwLmZlZUZpeGVkKTtcbn1cbmZ1bmN0aW9uIGdldFN0YXJ0Q2hhbmdlT3V0cHV0KGM6IENvbnN0cmFpbnRzKTogYmlnaW50IHwgbnVsbCB7XG4gIC8vIHdlIGRvbid0IG5lZWQgYSBjaGFuZ2UgcGFkZGluZyBvdXRwdXRcbiAgaWYgKGMuc2F0UG9zIDwgYy5tYXhJbnNjcmlwdGlvbk91dHB1dCkge1xuICAgIHJldHVybiBaRVJPO1xuICB9XG4gIGlmIChjLm1pbkNoYW5nZU91dHB1dCA8PSBjLnNhdFBvcykge1xuICAgIHJldHVybiBjLnNhdFBvcztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zY3JpcHRpb25PdXRwdXQoYzogQ29uc3RyYWludHMsIHN0YXJ0Q2hhbmdlT3V0cHV0OiBiaWdpbnQpOiBiaWdpbnQgfCBudWxsIHtcbiAgY29uc3QgcmVzdWx0ID0gbWluKGMubWF4SW5zY3JpcHRpb25PdXRwdXQsIG1heChjLm1pbkluc2NyaXB0aW9uT3V0cHV0LCBjLnNhdFBvcyAtIHN0YXJ0Q2hhbmdlT3V0cHV0ICsgT05FKSk7XG4gIGlmIChjLnNhdFBvcyA8IHN0YXJ0Q2hhbmdlT3V0cHV0IHx8IHN0YXJ0Q2hhbmdlT3V0cHV0ICsgcmVzdWx0IDwgYy5zYXRQb3MpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBpZiBpcyBub3Qgd29ydGggY3JlYXRpbmcgYW4gZW5kIGNoYW5nZSBvdXRwdXQsIGxldCdzIG1heGltaXplIHRoZSBpbnNjcmlwdGlvbiBvdXRwdXRcbiAgaWYgKGdldEVuZENoYW5nZU91dHB1dChjLCBzdGFydENoYW5nZU91dHB1dCwgcmVzdWx0KSA9PT0gWkVSTykge1xuICAgIGNvbnN0IHJlbWFpbmRlciA9IGMudG90YWwgLSBzdGFydENoYW5nZU91dHB1dCAtIGdldEZlZUZvck91dHB1dHMoYywgW3N0YXJ0Q2hhbmdlT3V0cHV0LCByZXN1bHRdKTtcbiAgICByZXR1cm4gbWluKHJlbWFpbmRlciwgYy5tYXhJbnNjcmlwdGlvbk91dHB1dCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZ2V0RW5kQ2hhbmdlT3V0cHV0KGM6IENvbnN0cmFpbnRzLCBzdGFydENoYW5nZU91dHB1dDogYmlnaW50LCBpbnNjcmlwdGlvbk91dHB1dDogYmlnaW50KTogYmlnaW50IHwgbnVsbCB7XG4gIGNvbnN0IHJlbWFpbmRlciA9IGMudG90YWwgLSBzdW0oW3N0YXJ0Q2hhbmdlT3V0cHV0LCBpbnNjcmlwdGlvbk91dHB1dF0pO1xuICBjb25zdCBtaW5GZWVXaXRob3V0U2Vjb25kT3V0cHV0ID0gZ2V0RmVlRm9yT3V0cHV0cyhjLCBbc3RhcnRDaGFuZ2VPdXRwdXQsIGluc2NyaXB0aW9uT3V0cHV0XSk7XG4gIGNvbnN0IG1pbkZlZVdpdGhTZWNvbmRPdXRwdXQgPSBnZXRGZWVGb3JPdXRwdXRzKGMsIFtzdGFydENoYW5nZU91dHB1dCwgaW5zY3JpcHRpb25PdXRwdXQsIGMubWluQ2hhbmdlT3V0cHV0XSk7XG4gIGlmIChyZW1haW5kZXIgPCBtaW5GZWVXaXRob3V0U2Vjb25kT3V0cHV0KSB7XG4gICAgLy8gV2UgY2Fubm90IGV2ZW4gcGF5IHRoZSBmZWUgZm9yIHRoZSBvdXRwdXQocykgd2UgaGF2ZSBzbyBmYXIuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHJlbWFpbmRlciAtIG1pbkZlZVdpdGhTZWNvbmRPdXRwdXQgPCBjLm1pbkNoYW5nZU91dHB1dCkge1xuICAgIC8vIFRoZSByZW1haW5kZXIgaXMgdG9vIHNtYWxsIHRvIHBheSBmb3IgdGhlIGVuZCBjaGFuZ2Ugb3V0cHV0LiBMZXQncyBza2lwIGl0IGFuZCBwYXkgYSBoaWdoZXIgZmVlLlxuICAgIHJldHVybiBaRVJPO1xuICB9XG4gIC8vIGxldCdzIHVzZSBhcyBtdWNoIGFzIHdlIGNhbiBmb3IgZmVlIHdoaWxlIGxlYXZpbmcgZW5vdWdoIGZvciBmZWVcbiAgcmV0dXJuIHJlbWFpbmRlciAtIG1pbkZlZVdpdGhTZWNvbmRPdXRwdXQ7XG59XG5cbmZ1bmN0aW9uIGdldEZlZU91dHB1dChcbiAgYzogQ29uc3RyYWludHMsXG4gIHN0YXJ0Q2hhbmdlT3V0cHV0OiBiaWdpbnQsXG4gIGluc2NyaXB0aW9uT3V0cHV0OiBiaWdpbnQsXG4gIGVuZENoYW5nZU91dHB1dDogYmlnaW50XG4pOiBiaWdpbnQgfCBudWxsIHtcbiAgY29uc3QgbWluRmVlID0gZ2V0RmVlRm9yT3V0cHV0cyhjLCBbc3RhcnRDaGFuZ2VPdXRwdXQsIGluc2NyaXB0aW9uT3V0cHV0LCBlbmRDaGFuZ2VPdXRwdXRdKTtcbiAgY29uc3QgcmVtYWluZGVyID0gYy50b3RhbCAtIHN1bShbc3RhcnRDaGFuZ2VPdXRwdXQsIGluc2NyaXB0aW9uT3V0cHV0LCBlbmRDaGFuZ2VPdXRwdXRdKTtcbiAgaWYgKHJlbWFpbmRlciA8IG1pbkZlZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiByZW1haW5kZXI7XG59XG5cbi8qKlxuICogQHBhcmFtIGluc2NyaXB0aW9uSW5wdXRcbiAqIEBwYXJhbSBzZWFyY2hcbiAqIEByZXR1cm4gYSBzb2x1dGlvbiB0aGF0IHNhdGlzZmllcyBjb25zdHJhaW50cy4gSWYgbm8gc29sdXRpb24gY2FuIGJlIGZvdW5kLCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3V0cHV0TGF5b3V0KFxuICBpbnNjcmlwdGlvbklucHV0OiBPcmRPdXRwdXQsXG4gIHNlYXJjaDogT21pdDxDb25zdHJhaW50cywgJ3NhdFBvcycgfCAndG90YWwnPlxuKTogT3V0cHV0TGF5b3V0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGluc2NyaXB0aW9uSW5wdXQub3JkaW5hbHMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIG9yZGluYWwgY291bnQgJHtpbnNjcmlwdGlvbklucHV0Lm9yZGluYWxzLmxlbmd0aH1gKTtcbiAgfVxuICBpZiAoaW5zY3JpcHRpb25JbnB1dC5vcmRpbmFsc1swXS5zaXplKCkgIT09IE9ORSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgb25seSBzaW5nbGUtc2F0b3NoaSBpbnNjcmlwdGlvbnMgYXJlIHN1cHBvcnRlZGApO1xuICB9XG5cbiAgY29uc3Qgc2F0UG9zID0gaW5zY3JpcHRpb25JbnB1dC5vcmRpbmFsc1swXS5zdGFydDtcbiAgY29uc3QgdG90YWwgPSBpbnNjcmlwdGlvbklucHV0LnZhbHVlO1xuXG4gIGNvbnN0IGNvbnN0cmFpbnRzOiBDb25zdHJhaW50cyA9IHsgLi4uc2VhcmNoLCBzYXRQb3MsIHRvdGFsIH07XG5cbiAgY29uc3Qgc3RhcnRDaGFuZ2VPdXRwdXQgPSBnZXRTdGFydENoYW5nZU91dHB1dChjb25zdHJhaW50cyk7XG4gIGlmIChzdGFydENoYW5nZU91dHB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBpbnNjcmlwdGlvbk91dHB1dCA9IGdldEluc2NyaXB0aW9uT3V0cHV0KGNvbnN0cmFpbnRzLCBzdGFydENoYW5nZU91dHB1dCk7XG4gIGlmIChpbnNjcmlwdGlvbk91dHB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBlbmRDaGFuZ2VPdXRwdXQgPSBnZXRFbmRDaGFuZ2VPdXRwdXQoY29uc3RyYWludHMsIHN0YXJ0Q2hhbmdlT3V0cHV0LCBpbnNjcmlwdGlvbk91dHB1dCk7XG4gIGlmIChlbmRDaGFuZ2VPdXRwdXQgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZmVlT3V0cHV0ID0gZ2V0RmVlT3V0cHV0KGNvbnN0cmFpbnRzLCBzdGFydENoYW5nZU91dHB1dCwgaW5zY3JpcHRpb25PdXRwdXQsIGVuZENoYW5nZU91dHB1dCk7XG4gIGlmIChmZWVPdXRwdXQgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gdG9QYXJhbWV0ZXJzKHN0YXJ0Q2hhbmdlT3V0cHV0LCBpbnNjcmlwdGlvbk91dHB1dCwgZW5kQ2hhbmdlT3V0cHV0LCBmZWVPdXRwdXQpO1xuICBpZiAoIWNoZWNrKGNvbnN0cmFpbnRzLCBpbnNjcmlwdGlvbklucHV0LCByZXN1bHQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHJlc3VsdGApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=
@@ -1,48 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseSatPoint = parseSatPoint;
4
- exports.formatSatPoint = formatSatPoint;
5
- exports.isSatPoint = isSatPoint;
6
- /*
7
-
8
- https://github.com/casey/ord/blob/master/bip.mediawiki#terminology-and-notation
9
-
10
- > A satpoint may be used to indicate the location of a sat within an output.
11
- > A satpoint consists of an outpoint, i.e., a transaction ID and output index, with the addition of
12
- > the offset of the ordinal within that output. For example, if the sat in question is at offset 6
13
- > in the first output of a transaction, its satpoint is:
14
- > `680df1e4d43016571e504b0b142ee43c5c0b83398a97bdcfd94ea6f287322d22:0:6`
15
-
16
- */
17
- const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
18
- function parseSatPoint(p) {
19
- const parts = p.split(':');
20
- if (parts.length !== 3) {
21
- throw new Error(`expected format txid:vout:sat`);
22
- }
23
- const [txid, vout, offsetStr] = parts;
24
- const offset = BigInt(offsetStr);
25
- if (offset.toString() !== offsetStr) {
26
- throw new Error(`SatPoint offset must be base-10`);
27
- }
28
- if (offset < 0) {
29
- throw new Error(`SatPoint offset must be positive`);
30
- }
31
- return {
32
- ...utxo_lib_1.bitgo.parseOutputId([txid, vout].join(':')),
33
- offset,
34
- };
35
- }
36
- function formatSatPoint(p) {
37
- return `${p.txid}:${p.vout}:${p.offset}`;
38
- }
39
- function isSatPoint(v) {
40
- try {
41
- parseSatPoint(v);
42
- return true;
43
- }
44
- catch {
45
- return false;
46
- }
47
- }
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2F0UG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2F0UG9pbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFlQSxzQ0FpQkM7QUFFRCx3Q0FFQztBQUVELGdDQU9DO0FBN0NEOzs7Ozs7Ozs7O0VBVUU7QUFDRixtREFBNkM7QUFJN0MsU0FBZ0IsYUFBYSxDQUFDLENBQVc7SUFDdkMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pDLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELE9BQU87UUFDTCxHQUFHLGdCQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QyxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsQ0FBaUQ7SUFDOUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFXLENBQUM7QUFDcEQsQ0FBQztBQUVELFNBQWdCLFVBQVUsQ0FBQyxDQUFTO0lBQ2xDLElBQUksQ0FBQztRQUNILGFBQWEsQ0FBQyxDQUFhLENBQUMsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcblxuaHR0cHM6Ly9naXRodWIuY29tL2Nhc2V5L29yZC9ibG9iL21hc3Rlci9iaXAubWVkaWF3aWtpI3Rlcm1pbm9sb2d5LWFuZC1ub3RhdGlvblxuXG4+IEEgc2F0cG9pbnQgbWF5IGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGxvY2F0aW9uIG9mIGEgc2F0IHdpdGhpbiBhbiBvdXRwdXQuXG4+IEEgc2F0cG9pbnQgY29uc2lzdHMgb2YgYW4gb3V0cG9pbnQsIGkuZS4sIGEgdHJhbnNhY3Rpb24gSUQgYW5kIG91dHB1dCBpbmRleCwgd2l0aCB0aGUgYWRkaXRpb24gb2Zcbj4gdGhlIG9mZnNldCBvZiB0aGUgb3JkaW5hbCB3aXRoaW4gdGhhdCBvdXRwdXQuIEZvciBleGFtcGxlLCBpZiB0aGUgc2F0IGluIHF1ZXN0aW9uIGlzIGF0IG9mZnNldCA2XG4+IGluIHRoZSBmaXJzdCBvdXRwdXQgb2YgYSB0cmFuc2FjdGlvbiwgaXRzIHNhdHBvaW50IGlzOlxuPiBgNjgwZGYxZTRkNDMwMTY1NzFlNTA0YjBiMTQyZWU0M2M1YzBiODMzOThhOTdiZGNmZDk0ZWE2ZjI4NzMyMmQyMjowOjZgXG5cbiovXG5pbXBvcnQgeyBiaXRnbyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuZXhwb3J0IHR5cGUgU2F0UG9pbnQgPSBgJHtzdHJpbmd9OiR7bnVtYmVyfToke2JpZ2ludH1gO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTYXRQb2ludChwOiBTYXRQb2ludCk6IHsgdHhpZDogc3RyaW5nOyB2b3V0OiBudW1iZXI7IG9mZnNldDogYmlnaW50IH0ge1xuICBjb25zdCBwYXJ0cyA9IHAuc3BsaXQoJzonKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykge1xuICAgIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgZm9ybWF0IHR4aWQ6dm91dDpzYXRgKTtcbiAgfVxuICBjb25zdCBbdHhpZCwgdm91dCwgb2Zmc2V0U3RyXSA9IHBhcnRzO1xuICBjb25zdCBvZmZzZXQgPSBCaWdJbnQob2Zmc2V0U3RyKTtcbiAgaWYgKG9mZnNldC50b1N0cmluZygpICE9PSBvZmZzZXRTdHIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNhdFBvaW50IG9mZnNldCBtdXN0IGJlIGJhc2UtMTBgKTtcbiAgfVxuICBpZiAob2Zmc2V0IDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2F0UG9pbnQgb2Zmc2V0IG11c3QgYmUgcG9zaXRpdmVgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLmJpdGdvLnBhcnNlT3V0cHV0SWQoW3R4aWQsIHZvdXRdLmpvaW4oJzonKSksXG4gICAgb2Zmc2V0LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U2F0UG9pbnQocDogeyB0eGlkOiBzdHJpbmc7IHZvdXQ6IG51bWJlcjsgb2Zmc2V0OiBiaWdpbnQgfSk6IFNhdFBvaW50IHtcbiAgcmV0dXJuIGAke3AudHhpZH06JHtwLnZvdXR9OiR7cC5vZmZzZXR9YCBhcyBjb25zdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2F0UG9pbnQodjogc3RyaW5nKTogdiBpcyBTYXRQb2ludCB7XG4gIHRyeSB7XG4gICAgcGFyc2VTYXRQb2ludCh2IGFzIFNhdFBvaW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SatRange = exports.InvalidSatRange = void 0;
4
- class InvalidSatRange extends Error {
5
- constructor(message, start, end) {
6
- super(message);
7
- this.start = start;
8
- this.end = end;
9
- }
10
- }
11
- exports.InvalidSatRange = InvalidSatRange;
12
- function toRange(v) {
13
- return typeof v === 'bigint' ? new SatRange(v, v) : v;
14
- }
15
- /**
16
- * Range of satoshi, inclusive.
17
- * Inscriptions have start === end.
18
- */
19
- class SatRange {
20
- constructor(start, end) {
21
- this.start = start;
22
- this.end = end;
23
- if (start < 0 || end < 0 || end < start) {
24
- throw new InvalidSatRange(`Invalid SatRange [${start}, ${end}]`, start, end);
25
- }
26
- }
27
- /**
28
- * @param offset
29
- * @return SatRange with start and end shifted by offset
30
- */
31
- shiftedBy(offset) {
32
- return new SatRange(this.start + offset, this.end + offset);
33
- }
34
- /** @return true iff this intersects with _other_ */
35
- intersectsWith(other) {
36
- other = toRange(other);
37
- if (this.start <= other.start) {
38
- return other.start <= this.end;
39
- }
40
- return other.intersectsWith(this);
41
- }
42
- /** @return true iff this is superset of _other_. */
43
- isSupersetOf(other) {
44
- other = toRange(other);
45
- return this.start <= other.start && other.end <= this.end;
46
- }
47
- toString() {
48
- if (this.start === this.end) {
49
- return `[${this.start}]`;
50
- }
51
- return `[${this.start}..${this.end}]`;
52
- }
53
- size() {
54
- return this.end - this.start + BigInt(1);
55
- }
56
- }
57
- exports.SatRange = SatRange;
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2F0UmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvU2F0UmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBYSxlQUFnQixTQUFRLEtBQUs7SUFDeEMsWUFBWSxPQUFlLEVBQVMsS0FBYSxFQUFTLEdBQVc7UUFDbkUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRG1CLFVBQUssR0FBTCxLQUFLLENBQVE7UUFBUyxRQUFHLEdBQUgsR0FBRyxDQUFRO0lBRXJFLENBQUM7Q0FDRjtBQUpELDBDQUlDO0FBRUQsU0FBUyxPQUFPLENBQUMsQ0FBb0I7SUFDbkMsT0FBTyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFhLFFBQVE7SUFDbkIsWUFBbUIsS0FBYSxFQUFTLEdBQVc7UUFBakMsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFTLFFBQUcsR0FBSCxHQUFHLENBQVE7UUFDbEQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxlQUFlLENBQUMscUJBQXFCLEtBQUssS0FBSyxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0UsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsTUFBYztRQUN0QixPQUFPLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxjQUFjLENBQUMsS0FBd0I7UUFDckMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlCLE9BQU8sS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxZQUFZLENBQUMsS0FBd0I7UUFDbkMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDNUQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzVCLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7UUFDM0IsQ0FBQztRQUNELE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBSTtRQUNGLE9BQU8sSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0NBQ0Y7QUF4Q0QsNEJBd0NDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEludmFsaWRTYXRSYW5nZSBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBwdWJsaWMgc3RhcnQ6IGJpZ2ludCwgcHVibGljIGVuZDogYmlnaW50KSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9SYW5nZSh2OiBiaWdpbnQgfCBTYXRSYW5nZSk6IFNhdFJhbmdlIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSAnYmlnaW50JyA/IG5ldyBTYXRSYW5nZSh2LCB2KSA6IHY7XG59XG5cbi8qKlxuICogUmFuZ2Ugb2Ygc2F0b3NoaSwgaW5jbHVzaXZlLlxuICogSW5zY3JpcHRpb25zIGhhdmUgc3RhcnQgPT09IGVuZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNhdFJhbmdlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHN0YXJ0OiBiaWdpbnQsIHB1YmxpYyBlbmQ6IGJpZ2ludCkge1xuICAgIGlmIChzdGFydCA8IDAgfHwgZW5kIDwgMCB8fCBlbmQgPCBzdGFydCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRTYXRSYW5nZShgSW52YWxpZCBTYXRSYW5nZSBbJHtzdGFydH0sICR7ZW5kfV1gLCBzdGFydCwgZW5kKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG9mZnNldFxuICAgKiBAcmV0dXJuIFNhdFJhbmdlIHdpdGggc3RhcnQgYW5kIGVuZCBzaGlmdGVkIGJ5IG9mZnNldFxuICAgKi9cbiAgc2hpZnRlZEJ5KG9mZnNldDogYmlnaW50KTogU2F0UmFuZ2Uge1xuICAgIHJldHVybiBuZXcgU2F0UmFuZ2UodGhpcy5zdGFydCArIG9mZnNldCwgdGhpcy5lbmQgKyBvZmZzZXQpO1xuICB9XG5cbiAgLyoqIEByZXR1cm4gdHJ1ZSBpZmYgdGhpcyBpbnRlcnNlY3RzIHdpdGggX290aGVyXyAqL1xuICBpbnRlcnNlY3RzV2l0aChvdGhlcjogYmlnaW50IHwgU2F0UmFuZ2UpOiBib29sZWFuIHtcbiAgICBvdGhlciA9IHRvUmFuZ2Uob3RoZXIpO1xuICAgIGlmICh0aGlzLnN0YXJ0IDw9IG90aGVyLnN0YXJ0KSB7XG4gICAgICByZXR1cm4gb3RoZXIuc3RhcnQgPD0gdGhpcy5lbmQ7XG4gICAgfVxuICAgIHJldHVybiBvdGhlci5pbnRlcnNlY3RzV2l0aCh0aGlzKTtcbiAgfVxuXG4gIC8qKiBAcmV0dXJuIHRydWUgaWZmIHRoaXMgaXMgc3VwZXJzZXQgb2YgX290aGVyXy4gKi9cbiAgaXNTdXBlcnNldE9mKG90aGVyOiBiaWdpbnQgfCBTYXRSYW5nZSk6IGJvb2xlYW4ge1xuICAgIG90aGVyID0gdG9SYW5nZShvdGhlcik7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnQgPD0gb3RoZXIuc3RhcnQgJiYgb3RoZXIuZW5kIDw9IHRoaXMuZW5kO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5zdGFydCA9PT0gdGhpcy5lbmQpIHtcbiAgICAgIHJldHVybiBgWyR7dGhpcy5zdGFydH1dYDtcbiAgICB9XG4gICAgcmV0dXJuIGBbJHt0aGlzLnN0YXJ0fS4uJHt0aGlzLmVuZH1dYDtcbiAgfVxuXG4gIHNpemUoKTogYmlnaW50IHtcbiAgICByZXR1cm4gdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICsgQmlnSW50KDEpO1xuICB9XG59XG4iXX0=
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.powerset = powerset;
4
- function powerset(arr) {
5
- if (arr.length === 0) {
6
- return [[]];
7
- }
8
- else {
9
- const [a, ...rest] = arr;
10
- return powerset(rest).flatMap((s) => [[a, ...s], s]);
11
- }
12
- }
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYmluYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbWJpbmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDRCQU9DO0FBUEQsU0FBZ0IsUUFBUSxDQUFJLEdBQVE7SUFDbEMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNkLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN6QixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHBvd2Vyc2V0PFQ+KGFycjogVFtdKTogVFtdW10ge1xuICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbW11dO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFthLCAuLi5yZXN0XSA9IGFycjtcbiAgICByZXR1cm4gcG93ZXJzZXQocmVzdCkuZmxhdE1hcCgocykgPT4gW1thLCAuLi5zXSwgc10pO1xuICB9XG59XG4iXX0=
@@ -1,202 +0,0 @@
1
- "use strict";
2
- /*
3
- Functions for dealing with inscriptions.
4
-
5
- See https://docs.ordinals.com/inscriptions.html
6
- */
7
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
- if (k2 === undefined) k2 = k;
9
- var desc = Object.getOwnPropertyDescriptor(m, k);
10
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
- desc = { enumerable: true, get: function() { return m[k]; } };
12
- }
13
- Object.defineProperty(o, k2, desc);
14
- }) : (function(o, m, k, k2) {
15
- if (k2 === undefined) k2 = k;
16
- o[k2] = m[k];
17
- }));
18
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
- Object.defineProperty(o, "default", { enumerable: true, value: v });
20
- }) : function(o, v) {
21
- o["default"] = v;
22
- });
23
- var __importStar = (this && this.__importStar) || (function () {
24
- var ownKeys = function(o) {
25
- ownKeys = Object.getOwnPropertyNames || function (o) {
26
- var ar = [];
27
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
- return ar;
29
- };
30
- return ownKeys(o);
31
- };
32
- return function (mod) {
33
- if (mod && mod.__esModule) return mod;
34
- var result = {};
35
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
- __setModuleDefault(result, mod);
37
- return result;
38
- };
39
- })();
40
- Object.defineProperty(exports, "__esModule", { value: true });
41
- exports.createInscriptionRevealData = createInscriptionRevealData;
42
- exports.createOutputScriptForInscription = createOutputScriptForInscription;
43
- exports.signRevealTransaction = signRevealTransaction;
44
- const assert = __importStar(require("assert"));
45
- const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
46
- const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
47
- const OPS = utxo_lib_1.script.OPS;
48
- const MAX_LENGTH_TAP_DATA_PUSH = 520;
49
- // default "postage" amount
50
- // https://github.com/ordinals/ord/blob/0.24.2/src/lib.rs#L149
51
- const DEFAULT_POSTAGE_AMOUNT = BigInt(10000);
52
- /**
53
- * The max size of an individual OP_PUSH in a Taproot script is 520 bytes. This
54
- * function splits inscriptionData into an array buffer of 520 bytes length.
55
- * https://docs.ordinals.com/inscriptions.html
56
- * @param inscriptionData
57
- * @param chunkSize
58
- */
59
- function splitBuffer(inscriptionData, chunkSize) {
60
- const pushDataBuffers = [];
61
- for (let i = 0; i < inscriptionData.length; i += chunkSize) {
62
- pushDataBuffers.push(inscriptionData.slice(i, i + chunkSize));
63
- }
64
- return pushDataBuffers;
65
- }
66
- /**
67
- *
68
- * @returns inscription payment object
69
- * @param pubkey
70
- * @param contentType
71
- * @param inscriptionData
72
- */
73
- function createPaymentForInscription(pubkey, contentType, inscriptionData) {
74
- const dataPushBuffers = splitBuffer(inscriptionData, MAX_LENGTH_TAP_DATA_PUSH);
75
- const uncompiledScript = [
76
- pubkey,
77
- OPS.OP_CHECKSIG,
78
- OPS.OP_FALSE,
79
- OPS.OP_IF,
80
- Buffer.from('ord', 'ascii'),
81
- 1, // these two lines should be combined as a single OPS.OP_1,
82
- 1, // but `ord`'s decoder has a bug so it has to be like this
83
- Buffer.from(contentType, 'ascii'),
84
- OPS.OP_0,
85
- ...dataPushBuffers,
86
- OPS.OP_ENDIF,
87
- ];
88
- const compiledScript = utxo_lib_1.script.compile(uncompiledScript);
89
- const redeem = {
90
- output: compiledScript,
91
- depth: 0,
92
- };
93
- return utxo_lib_1.p2trPayments.p2tr({ redeems: [redeem], redeemIndex: 0 }, { eccLib: utxo_lib_1.ecc });
94
- }
95
- /**
96
- * @param payment
97
- * @param controlBlock
98
- * @param commitOutput
99
- * @param network
100
- * @return virtual size of a transaction with a single inscription reveal input and a single commitOutput
101
- */
102
- function getInscriptionRevealSize(payment, controlBlock, commitOutput, network) {
103
- const psbt = utxo_lib_1.bitgo.createPsbtForNetwork({ network });
104
- const parsedControlBlock = utxo_lib_1.taproot.parseControlBlock(utxo_lib_1.ecc, controlBlock);
105
- const leafHash = utxo_lib_1.taproot.getTapleafHash(utxo_lib_1.ecc, parsedControlBlock, payment.redeem?.output);
106
- psbt.addInput({
107
- hash: Buffer.alloc(32),
108
- index: 0,
109
- witnessUtxo: { script: commitOutput, value: BigInt(100000) },
110
- tapLeafScript: [
111
- {
112
- controlBlock,
113
- script: payment.redeem?.output,
114
- leafVersion: utxo_lib_1.taproot.INITIAL_TAPSCRIPT_VERSION,
115
- },
116
- ],
117
- });
118
- psbt.addOutput({ script: commitOutput, value: DEFAULT_POSTAGE_AMOUNT });
119
- psbt.signTaprootInput(0, {
120
- publicKey: Buffer.alloc(32),
121
- signSchnorr(hash) {
122
- // dummy schnorr-sized signature
123
- return Buffer.alloc(64);
124
- },
125
- }, [leafHash]);
126
- psbt.finalizeTapInputWithSingleLeafScriptAndSignature(0);
127
- return psbt.extractTransaction(/* disableFeeCheck */ true).virtualSize();
128
- }
129
- /**
130
- * @param pubkey
131
- * @param contentType
132
- * @param inscriptionData
133
- * @param network
134
- * @returns PreparedInscriptionRevealData
135
- */
136
- function createInscriptionRevealData(pubkey, contentType, inscriptionData, network) {
137
- const payment = createPaymentForInscription(pubkey, contentType, inscriptionData);
138
- const { output: commitOutput, controlBlock } = payment;
139
- assert.ok(commitOutput);
140
- assert.ok(controlBlock);
141
- assert.ok(payment.redeem?.output);
142
- const commitAddress = utxo_lib_1.address.fromOutputScript(commitOutput, network);
143
- const tapLeafScript = [
144
- {
145
- controlBlock,
146
- script: payment.redeem?.output,
147
- leafVersion: utxo_lib_1.taproot.INITIAL_TAPSCRIPT_VERSION,
148
- },
149
- ];
150
- const revealTransactionVSize = getInscriptionRevealSize(payment, controlBlock, commitOutput, network);
151
- return {
152
- address: commitAddress,
153
- revealTransactionVSize,
154
- tapLeafScript: tapLeafScript[0],
155
- };
156
- }
157
- /**
158
- * @param pubkey
159
- * @param contentType
160
- * @param inscriptionData
161
- * @returns inscription address
162
- */
163
- function createOutputScriptForInscription(pubkey, contentType, inscriptionData) {
164
- const payment = createPaymentForInscription(pubkey, contentType, inscriptionData);
165
- assert.ok(payment.output, 'Failed to create inscription output script');
166
- return payment.output;
167
- }
168
- /**
169
- *
170
- * @param privateKey
171
- * @param tapLeafScript
172
- * @param commitAddress
173
- * @param recipientAddress
174
- * @param unsignedCommitTx
175
- * @param network
176
- *
177
- * @return a fully signed reveal transaction
178
- */
179
- function signRevealTransaction(privateKey, tapLeafScript, commitAddress, recipientAddress, unsignedCommitTx, network) {
180
- const unserCommitTxn = utxolib.bitgo.createTransactionFromBuffer(unsignedCommitTx, network);
181
- const hash = unserCommitTxn.getHash();
182
- const commitOutput = utxolib.address.toOutputScript(commitAddress, network);
183
- const vout = unserCommitTxn.outs.findIndex((out) => out.script.equals(commitOutput));
184
- if (vout === -1) {
185
- throw new Error('Invalid commit transaction');
186
- }
187
- const psbt = utxo_lib_1.bitgo.createPsbtForNetwork({ network });
188
- psbt.addInput({
189
- hash,
190
- index: vout,
191
- witnessUtxo: { script: commitOutput, value: BigInt(unserCommitTxn.outs[vout].value) },
192
- tapLeafScript: [tapLeafScript],
193
- });
194
- const recipientOutput = utxo_lib_1.address.toOutputScript(recipientAddress, network);
195
- psbt.addOutput({ script: recipientOutput, value: BigInt(10000) });
196
- const signer = utxo_lib_1.ECPair.fromPrivateKey(privateKey);
197
- const parsedControlBlock = utxo_lib_1.taproot.parseControlBlock(utxo_lib_1.ecc, tapLeafScript.controlBlock);
198
- const leafHash = utxo_lib_1.taproot.getTapleafHash(utxo_lib_1.ecc, parsedControlBlock, tapLeafScript.script);
199
- psbt.signTaprootInput(0, signer, [leafHash]);
200
- return psbt;
201
- }
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zY3JpcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luc2NyaXB0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7RUFJRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4SEYsa0VBNEJDO0FBUUQsNEVBS0M7QUFhRCxzREFrQ0M7QUFwTkQsK0NBQWlDO0FBQ2pDLG1EQVU4QjtBQUM5Qiw4REFBZ0Q7QUFHaEQsTUFBTSxHQUFHLEdBQUcsaUJBQU8sQ0FBQyxHQUFHLENBQUM7QUFDeEIsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLENBQUM7QUFDckMsMkJBQTJCO0FBQzNCLDhEQUE4RDtBQUM5RCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxLQUFNLENBQUMsQ0FBQztBQUU5Qzs7Ozs7O0dBTUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxlQUF1QixFQUFFLFNBQWlCO0lBQzdELE1BQU0sZUFBZSxHQUFhLEVBQUUsQ0FBQztJQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDM0QsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsMkJBQTJCLENBQUMsTUFBYyxFQUFFLFdBQW1CLEVBQUUsZUFBdUI7SUFDL0YsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLGVBQWUsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBRS9FLE1BQU0sZ0JBQWdCLEdBQUc7UUFDdkIsTUFBTTtRQUNOLEdBQUcsQ0FBQyxXQUFXO1FBQ2YsR0FBRyxDQUFDLFFBQVE7UUFDWixHQUFHLENB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QUFDO0lBQ3pGLE1BQU0sUUFBUSxHQUFHLGtCQUFPLENBQUMsY0FBYyxDQUFDLGNBQU0sRUFBRSxrQkFBa0IsRUFBRSxhQUFhLENBQUMsTUFBZ0IsQ0FBQyxDQUFDO0lBQ3BHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUU3QyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuRnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggaW5zY3JpcHRpb25zLlxuXG5TZWUgaHR0cHM6Ly9kb2NzLm9yZGluYWxzLmNvbS9pbnNjcmlwdGlvbnMuaHRtbFxuKi9cblxuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1xuICBwMnRyUGF5bWVudHMgYXMgcGF5bWVudHMsXG4gIGVjYyBhcyBlY2NMaWIsXG4gIHNjcmlwdCBhcyBic2NyaXB0LFxuICBQYXltZW50LFxuICBOZXR3b3JrLFxuICBiaXRnbyxcbiAgYWRkcmVzcyxcbiAgdGFwcm9vdCxcbiAgRUNQYWlyLFxufSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IFByZXBhcmVkSW5zY3JpcHRpb25SZXZlYWxEYXRhIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5jb25zdCBPUFMgPSBic2NyaXB0Lk9QUztcbmNvbnN0IE1BWF9MRU5HVEhfVEFQX0RBVEFfUFVTSCA9IDUyMDtcbi8vIGRlZmF1bHQgXCJwb3N0YWdlXCIgYW1vdW50XG4vLyBodHRwczovL2dpdGh1Yi5jb20vb3JkaW5hbHMvb3JkL2Jsb2IvMC4yNC4yL3NyYy9saWIucnMjTDE0OVxuY29uc3QgREVGQVVMVF9QT1NUQUdFX0FNT1VOVCA9IEJpZ0ludCgxMF8wMDApO1xuXG4vKipcbiAqIFRoZSBtYXggc2l6ZSBvZiBhbiBpbmRpdmlkdWFsIE9QX1BVU0ggaW4gYSBUYXByb290IHNjcmlwdCBpcyA1MjAgYnl0ZXMuIFRoaXNcbiAqIGZ1bmN0aW9uIHNwbGl0cyBpbnNjcmlwdGlvbkRhdGEgaW50byBhbiBhcnJheSBidWZmZXIgb2YgNTIwIGJ5dGVzIGxlbmd0aC5cbiAqIGh0dHBzOi8vZG9jcy5vcmRpbmFscy5jb20vaW5zY3JpcHRpb25zLmh0bWxcbiAqIEBwYXJhbSBpbnNjcmlwdGlvbkRhdGFcbiAqIEBwYXJhbSBjaHVua1NpemVcbiAqL1xuZnVuY3Rpb24gc3BsaXRCdWZmZXIoaW5zY3JpcHRpb25EYXRhOiBCdWZmZXIsIGNodW5rU2l6ZTogbnVtYmVyKSB7XG4gIGNvbnN0IHB1c2hEYXRhQnVmZmVyczogQnVmZmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnNjcmlwdGlvbkRhdGEubGVuZ3RoOyBpICs9IGNodW5rU2l6ZSkge1xuICAgIHB1c2hEYXRhQnVmZmVycy5wdXNoKGluc2NyaXB0aW9uRGF0YS5zbGljZShpLCBpICsgY2h1bmtTaXplKSk7XG4gIH1cblxuICByZXR1cm4gcHVzaERhdGFCdWZmZXJzO1xufVxuXG4vKipcbiAqXG4gKiBAcmV0dXJucyBpbnNjcmlwdGlvbiBwYXltZW50IG9iamVjdFxuICogQHBhcmFtIHB1YmtleVxuICogQHBhcmFtIGNvbnRlbnRUeXBlXG4gKiBAcGFyYW0gaW5zY3JpcHRpb25EYXRhXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBheW1lbnRGb3JJbnNjcmlwdGlvbihwdWJrZXk6IEJ1ZmZlciwgY29udGVudFR5cGU6IHN0cmluZywgaW5zY3JpcHRpb25EYXRhOiBCdWZmZXIpOiBQYXltZW50IHtcbiAgY29uc3QgZGF0YVB1c2hCdWZmZXJzID0gc3BsaXRCdWZmZXIoaW5zY3JpcHRpb25EYXRhLCBNQVhfTEVOR1RIX1RBUF9EQVRBX1BVU0gpO1xuXG4gIGNvbnN0IHVuY29tcGlsZWRTY3JpcHQgPSBbXG4gICAgcHVia2V5LFxuICAgIE9QUy5PUF9DSEVDS1NJRyxcbiAgICBPUFMuT1BfRkFMU0UsXG4gICAgT1BTLk9QX0lGLFxuICAgIEJ1ZmZlci5mcm9tKCdvcmQnLCAnYXNjaWknKSxcbiAgICAxLCAvLyB0aGVzZSB0d28gbGluZXMgc2hvdWxkIGJlIGNvbWJpbmVkIGFzIGEgc2luZ2xlIE9QUy5PUF8xLFxuICAgIDEsIC8vIGJ1dCBgb3JkYCdzIGRlY29kZXIgaGFzIGEgYnVnIHNvIGl0IGhhcyB0byBiZSBsaWtlIHRoaXNcbiAgICBCdWZmZXIuZnJvbShjb250ZW50VHlwZSwgJ2FzY2lpJyksXG4gICAgT1BTLk9QXzAsXG4gICAgLi4uZGF0YVB1c2hCdWZmZXJzLFxuICAgIE9QUy5PUF9FTkRJRixcbiAgXTtcblxuICBjb25zdCBjb21waWxlZFNjcmlwdCA9IGJzY3JpcHQuY29tcGlsZSh1bmNvbXBpbGVkU2NyaXB0KTtcbiAgY29uc3QgcmVkZWVtOiBQYXltZW50ID0ge1xuICAgIG91dHB1dDogY29tcGlsZWRTY3JpcHQsXG4gICAgZGVwdGg6IDAsXG4gIH07XG5cbiAgcmV0dXJuIHBheW1lbnRzLnAydHIoeyByZWRlZW1zOiBbcmVkZWVtXSwgcmVkZWVtSW5kZXg6IDAgfSwgeyBlY2NMaWIgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHBheW1lbnRcbiAqIEBwYXJhbSBjb250cm9sQmxvY2tcbiAqIEBwYXJhbSBjb21taXRPdXRwdXRcbiAqIEBwYXJhbSBuZXR3b3JrXG4gKiBAcmV0dXJuIHZpcnR1YWwgc2l6ZSBvZiBhIHRyYW5zYWN0aW9uIHdpdGggYSBzaW5nbGUgaW5zY3JpcHRpb24gcmV2ZWFsIGlucHV0IGFuZCBhIHNpbmdsZSBjb21taXRPdXRwdXRcbiAqL1xuZnVuY3Rpb24gZ2V0SW5zY3JpcHRpb25SZXZlYWxTaXplKFxuICBwYXltZW50OiBQYXltZW50LFxuICBjb250cm9sQmxvY2s6IEJ1ZmZlcixcbiAgY29tbWl0T3V0cHV0OiBCdWZmZXIsXG4gIG5ldHdvcms6IE5ldHdvcmtcbik6IG51bWJlciB7XG4gIGNvbnN0IHBzYnQgPSBiaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7IG5ldHdvcmsgfSk7XG4gIGNvbnN0IHBhcnNlZENvbnRyb2xCbG9jayA9IHRhcHJvb3QucGFyc2VDb250cm9sQmxvY2soZWNjTGliLCBjb250cm9sQmxvY2spO1xuICBjb25zdCBsZWFmSGFzaCA9IHRhcHJvb3QuZ2V0VGFwbGVhZkhhc2goZWNjTGliLCBwYXJzZWRDb250cm9sQmxvY2ssIHBheW1lbnQucmVkZWVtPy5vdXRwdXQgYXMgQnVmZmVyKTtcblxuICBwc2J0LmFkZElucHV0KHtcbiAgICBoYXNoOiBCdWZmZXIuYWxsb2MoMzIpLFxuICAgIGluZGV4OiAwLFxuICAgIHdpdG5lc3NVdHhvOiB7IHNjcmlwdDogY29tbWl0T3V0cHV0LCB2YWx1ZTogQmlnSW50KDEwMF8wMDApIH0sXG4gICAgdGFwTGVhZlNjcmlwdDogW1xuICAgICAge1xuICAgICAgICBjb250cm9sQmxvY2ssXG4gICAgICAgIHNjcmlwdDogcGF5bWVudC5yZWRlZW0/Lm91dHB1dCBhcyBCdWZmZXIsXG4gICAgICAgIGxlYWZWZXJzaW9uOiB0YXByb290LklOSVRJQUxfVEFQU0NSSVBUX1ZFUlNJT04sXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xuICBwc2J0LmFkZE91dHB1dCh7IHNjcmlwdDogY29tbWl0T3V0cHV0LCB2YWx1ZTogREVGQVVMVF9QT1NUQUdFX0FNT1VOVCB9KTtcblxuICBwc2J0LnNpZ25UYXByb290SW5wdXQoXG4gICAgMCxcbiAgICB7XG4gICAgICBwdWJsaWNLZXk6IEJ1ZmZlci5hbGxvYygzMiksXG4gICAgICBzaWduU2Nobm9ycihoYXNoOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgICAgICAvLyBkdW1teSBzY2hub3JyLXNpemVkIHNpZ25hdHVyZVxuICAgICAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDY0KTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBbbGVhZkhhc2hdXG4gICk7XG5cbiAgcHNidC5maW5hbGl6ZVRhcElucHV0V2l0aFNpbmdsZUxlYWZTY3JpcHRBbmRTaWduYXR1cmUoMCk7XG4gIHJldHVybiBwc2J0LmV4dHJhY3RUcmFuc2FjdGlvbigvKiBkaXNhYmxlRmVlQ2hlY2sgKi8gdHJ1ZSkudmlydHVhbFNpemUoKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gcHVia2V5XG4gKiBAcGFyYW0gY29udGVudFR5cGVcbiAqIEBwYXJhbSBpbnNjcmlwdGlvbkRhdGFcbiAqIEBwYXJhbSBuZXR3b3JrXG4gKiBAcmV0dXJucyBQcmVwYXJlZEluc2NyaXB0aW9uUmV2ZWFsRGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5zY3JpcHRpb25SZXZlYWxEYXRhKFxuICBwdWJrZXk6IEJ1ZmZlcixcbiAgY29udGVudFR5cGU6IHN0cmluZyxcbiAgaW5zY3JpcHRpb25EYXRhOiBCdWZmZXIsXG4gIG5ldHdvcms6IE5ldHdvcmtcbik6IFByZXBhcmVkSW5zY3JpcHRpb25SZXZlYWxEYXRhIHtcbiAgY29uc3QgcGF5bWVudCA9IGNyZWF0ZVBheW1lbnRGb3JJbnNjcmlwdGlvbihwdWJrZXksIGNvbnRlbnRUeXBlLCBpbnNjcmlwdGlvbkRhdGEpO1xuXG4gIGNvbnN0IHsgb3V0cHV0OiBjb21taXRPdXRwdXQsIGNvbnRyb2xCbG9jayB9ID0gcGF5bWVudDtcbiAgYXNzZXJ0Lm9rKGNvbW1pdE91dHB1dCk7XG4gIGFzc2VydC5vayhjb250cm9sQmxvY2spO1xuICBhc3NlcnQub2socGF5bWVudC5yZWRlZW0/Lm91dHB1dCk7XG4gIGNvbnN0IGNvbW1pdEFkZHJlc3MgPSBhZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoY29tbWl0T3V0cHV0LCBuZXR3b3JrKTtcblxuICBjb25zdCB0YXBMZWFmU2NyaXB0OiB1dHhvbGliLmJpdGdvLlRhcExlYWZTY3JpcHRbXSA9IFtcbiAgICB7XG4gICAgICBjb250cm9sQmxvY2ssXG4gICAgICBzY3JpcHQ6IHBheW1lbnQucmVkZWVtPy5vdXRwdXQsXG4gICAgICBsZWFmVmVyc2lvbjogdGFwcm9vdC5JTklUSUFMX1RBUFNDUklQVF9WRVJTSU9OLFxuICAgIH0sXG4gIF07XG4gIGNvbnN0IHJldmVhbFRyYW5zYWN0aW9uVlNpemUgPSBnZXRJbnNjcmlwdGlvblJldmVhbFNpemUocGF5bWVudCwgY29udHJvbEJsb2NrLCBjb21taXRPdXRwdXQsIG5ldHdvcmspO1xuXG4gIHJldHVybiB7XG4gICAgYWRkcmVzczogY29tbWl0QWRkcmVzcyxcbiAgICByZXZlYWxUcmFuc2FjdGlvblZTaXplLFxuICAgIHRhcExlYWZTY3JpcHQ6IHRhcExlYWZTY3JpcHRbMF0sXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHB1YmtleVxuICogQHBhcmFtIGNvbnRlbnRUeXBlXG4gKiBAcGFyYW0gaW5zY3JpcHRpb25EYXRhXG4gKiBAcmV0dXJucyBpbnNjcmlwdGlvbiBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPdXRwdXRTY3JpcHRGb3JJbnNjcmlwdGlvbihwdWJrZXk6IEJ1ZmZlciwgY29udGVudFR5cGU6IHN0cmluZywgaW5zY3JpcHRpb25EYXRhOiBCdWZmZXIpOiBCdWZmZXIge1xuICBjb25zdCBwYXltZW50ID0gY3JlYXRlUGF5bWVudEZvckluc2NyaXB0aW9uKHB1YmtleSwgY29udGVudFR5cGUsIGluc2NyaXB0aW9uRGF0YSk7XG5cbiAgYXNzZXJ0Lm9rKHBheW1lbnQub3V0cHV0LCAnRmFpbGVkIHRvIGNyZWF0ZSBpbnNjcmlwdGlvbiBvdXRwdXQgc2NyaXB0Jyk7XG4gIHJldHVybiBwYXltZW50Lm91dHB1dDtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHByaXZhdGVLZXlcbiAqIEBwYXJhbSB0YXBMZWFmU2NyaXB0XG4gKiBAcGFyYW0gY29tbWl0QWRkcmVzc1xuICogQHBhcmFtIHJlY2lwaWVudEFkZHJlc3NcbiAqIEBwYXJhbSB1bnNpZ25lZENvbW1pdFR4XG4gKiBAcGFyYW0gbmV0d29ya1xuICpcbiAqIEByZXR1cm4gYSBmdWxseSBzaWduZWQgcmV2ZWFsIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduUmV2ZWFsVHJhbnNhY3Rpb24oXG4gIHByaXZhdGVLZXk6IEJ1ZmZlcixcbiAgdGFwTGVhZlNjcmlwdDogdXR4b2xpYi5iaXRnby5UYXBMZWFmU2NyaXB0LFxuICBjb21taXRBZGRyZXNzOiBzdHJpbmcsXG4gIHJlY2lwaWVudEFkZHJlc3M6IHN0cmluZyxcbiAgdW5zaWduZWRDb21taXRUeDogQnVmZmVyLFxuICBuZXR3b3JrOiBOZXR3b3JrXG4pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHtcbiAgY29uc3QgdW5zZXJDb21taXRUeG4gPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlcih1bnNpZ25lZENvbW1pdFR4LCBuZXR3b3JrKTtcbiAgY29uc3QgaGFzaCA9IHVuc2VyQ29tbWl0VHhuLmdldEhhc2goKTtcbiAgY29uc3QgY29tbWl0T3V0cHV0ID0gdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGNvbW1pdEFkZHJlc3MsIG5ldHdvcmspO1xuICBjb25zdCB2b3V0ID0gdW5zZXJDb21taXRUeG4ub3V0cy5maW5kSW5kZXgoKG91dCkgPT4gb3V0LnNjcmlwdC5lcXVhbHMoY29tbWl0T3V0cHV0KSk7XG5cbiAgaWYgKHZvdXQgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbW1pdCB0cmFuc2FjdGlvbicpO1xuICB9XG5cbiAgY29uc3QgcHNidCA9IGJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yayB9KTtcbiAgcHNidC5hZGRJbnB1dCh7XG4gICAgaGFzaCxcbiAgICBpbmRleDogdm91dCxcbiAgICB3aXRuZXNzVXR4bzogeyBzY3JpcHQ6IGNvbW1pdE91dHB1dCwgdmFsdWU6IEJpZ0ludCh1bnNlckNvbW1pdFR4bi5vdXRzW3ZvdXRdLnZhbHVlKSB9LFxuICAgIHRhcExlYWZTY3JpcHQ6IFt0YXBMZWFmU2NyaXB0XSxcbiAgfSk7XG5cbiAgY29uc3QgcmVjaXBpZW50T3V0cHV0ID0gYWRkcmVzcy50b091dHB1dFNjcmlwdChyZWNpcGllbnRBZGRyZXNzLCBuZXR3b3JrKTtcbiAgcHNidC5hZGRPdXRwdXQoeyBzY3JpcHQ6IHJlY2lwaWVudE91dHB1dCwgdmFsdWU6IEJpZ0ludCgxMF8wMDApIH0pO1xuXG4gIGNvbnN0IHNpZ25lciA9IEVDUGFpci5mcm9tUHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgY29uc3QgcGFyc2VkQ29udHJvbEJsb2NrID0gdGFwcm9vdC5wYXJzZUNvbnRyb2xCbG9jayhlY2NMaWIsIHRhcExlYWZTY3JpcHQuY29udHJvbEJsb2NrKTtcbiAgY29uc3QgbGVhZkhhc2ggPSB0YXByb290LmdldFRhcGxlYWZIYXNoKGVjY0xpYiwgcGFyc2VkQ29udHJvbEJsb2NrLCB0YXBMZWFmU2NyaXB0LnNjcmlwdCBhcyBCdWZmZXIpO1xuICBwc2J0LnNpZ25UYXByb290SW5wdXQoMCwgc2lnbmVyLCBbbGVhZkhhc2hdKTtcblxuICByZXR1cm4gcHNidDtcbn1cbiJdfQ==