utxo-lib 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (249) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/src/address.d.ts +11 -0
  4. package/dist/src/address.d.ts.map +1 -0
  5. package/dist/src/address.js +37 -0
  6. package/dist/src/addressFormat.d.ts +53 -0
  7. package/dist/src/addressFormat.d.ts.map +1 -0
  8. package/dist/src/addressFormat.js +110 -0
  9. package/dist/src/bitgo/Musig2.d.ts +51 -0
  10. package/dist/src/bitgo/Musig2.d.ts.map +1 -0
  11. package/dist/src/bitgo/Musig2.js +175 -0
  12. package/dist/src/bitgo/Unspent.d.ts +95 -0
  13. package/dist/src/bitgo/Unspent.d.ts.map +1 -0
  14. package/dist/src/bitgo/Unspent.js +138 -0
  15. package/dist/src/bitgo/UtxoPsbt.d.ts +132 -0
  16. package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -0
  17. package/dist/src/bitgo/UtxoPsbt.js +469 -0
  18. package/dist/src/bitgo/UtxoTransaction.d.ts +22 -0
  19. package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -0
  20. package/dist/src/bitgo/UtxoTransaction.js +97 -0
  21. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +26 -0
  22. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +1 -0
  23. package/dist/src/bitgo/UtxoTransactionBuilder.js +67 -0
  24. package/dist/src/bitgo/bbc/DashPsbt.d.ts +12 -0
  25. package/dist/src/bitgo/bbc/DashPsbt.d.ts.map +1 -0
  26. package/dist/src/bitgo/bbc/DashPsbt.js +27 -0
  27. package/dist/src/bitgo/bbc/DashTransaction.d.ts +39 -0
  28. package/dist/src/bitgo/bbc/DashTransaction.d.ts.map +1 -0
  29. package/dist/src/bitgo/bbc/DashTransaction.js +109 -0
  30. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts +14 -0
  31. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts.map +1 -0
  32. package/dist/src/bitgo/bbc/DashTransactionBuilder.js +28 -0
  33. package/dist/src/bitgo/bbc/index.d.ts +4 -0
  34. package/dist/src/bitgo/bbc/index.d.ts.map +1 -0
  35. package/dist/src/bitgo/bbc/index.js +16 -0
  36. package/dist/src/bitgo/bitcoincash/address.d.ts +35 -0
  37. package/dist/src/bitgo/bitcoincash/address.d.ts.map +1 -0
  38. package/dist/src/bitgo/bitcoincash/address.js +151 -0
  39. package/dist/src/bitgo/bitcoincash/index.d.ts +2 -0
  40. package/dist/src/bitgo/bitcoincash/index.d.ts.map +1 -0
  41. package/dist/src/bitgo/bitcoincash/index.js +14 -0
  42. package/dist/src/bitgo/dash/DashPsbt.d.ts +12 -0
  43. package/dist/src/bitgo/dash/DashPsbt.d.ts.map +1 -0
  44. package/dist/src/bitgo/dash/DashPsbt.js +27 -0
  45. package/dist/src/bitgo/dash/DashTransaction.d.ts +39 -0
  46. package/dist/src/bitgo/dash/DashTransaction.d.ts.map +1 -0
  47. package/dist/src/bitgo/dash/DashTransaction.js +109 -0
  48. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +14 -0
  49. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +1 -0
  50. package/dist/src/bitgo/dash/DashTransactionBuilder.js +28 -0
  51. package/dist/src/bitgo/dash/index.d.ts +4 -0
  52. package/dist/src/bitgo/dash/index.d.ts.map +1 -0
  53. package/dist/src/bitgo/dash/index.js +16 -0
  54. package/dist/src/bitgo/index.d.ts +17 -0
  55. package/dist/src/bitgo/index.d.ts.map +1 -0
  56. package/dist/src/bitgo/index.js +30 -0
  57. package/dist/src/bitgo/keyutil.d.ts +17 -0
  58. package/dist/src/bitgo/keyutil.d.ts.map +1 -0
  59. package/dist/src/bitgo/keyutil.js +37 -0
  60. package/dist/src/bitgo/nonStandardHalfSigned.d.ts +7 -0
  61. package/dist/src/bitgo/nonStandardHalfSigned.d.ts.map +1 -0
  62. package/dist/src/bitgo/nonStandardHalfSigned.js +56 -0
  63. package/dist/src/bitgo/outputScripts.d.ts +84 -0
  64. package/dist/src/bitgo/outputScripts.d.ts.map +1 -0
  65. package/dist/src/bitgo/outputScripts.js +297 -0
  66. package/dist/src/bitgo/parseInput.d.ts +92 -0
  67. package/dist/src/bitgo/parseInput.d.ts.map +1 -0
  68. package/dist/src/bitgo/parseInput.js +344 -0
  69. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +24 -0
  70. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +1 -0
  71. package/dist/src/bitgo/psbt/fromHalfSigned.js +91 -0
  72. package/dist/src/bitgo/psbt/scriptTypes.d.ts +6 -0
  73. package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +1 -0
  74. package/dist/src/bitgo/psbt/scriptTypes.js +23 -0
  75. package/dist/src/bitgo/signature.d.ts +84 -0
  76. package/dist/src/bitgo/signature.d.ts.map +1 -0
  77. package/dist/src/bitgo/signature.js +222 -0
  78. package/dist/src/bitgo/tnumber.d.ts +9 -0
  79. package/dist/src/bitgo/tnumber.d.ts.map +1 -0
  80. package/dist/src/bitgo/tnumber.js +31 -0
  81. package/dist/src/bitgo/transaction.d.ts +29 -0
  82. package/dist/src/bitgo/transaction.d.ts.map +1 -0
  83. package/dist/src/bitgo/transaction.js +247 -0
  84. package/dist/src/bitgo/types.d.ts +5 -0
  85. package/dist/src/bitgo/types.d.ts.map +1 -0
  86. package/dist/src/bitgo/types.js +12 -0
  87. package/dist/src/bitgo/wallet/Psbt.d.ts +47 -0
  88. package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -0
  89. package/dist/src/bitgo/wallet/Psbt.js +232 -0
  90. package/dist/src/bitgo/wallet/Unspent.d.ts +47 -0
  91. package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -0
  92. package/dist/src/bitgo/wallet/Unspent.js +154 -0
  93. package/dist/src/bitgo/wallet/WalletKeys.d.ts +72 -0
  94. package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +1 -0
  95. package/dist/src/bitgo/wallet/WalletKeys.js +104 -0
  96. package/dist/src/bitgo/wallet/WalletOutput.d.ts +18 -0
  97. package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -0
  98. package/dist/src/bitgo/wallet/WalletOutput.js +69 -0
  99. package/dist/src/bitgo/wallet/WalletScripts.d.ts +7 -0
  100. package/dist/src/bitgo/wallet/WalletScripts.d.ts.map +1 -0
  101. package/dist/src/bitgo/wallet/WalletScripts.js +15 -0
  102. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts +19 -0
  103. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts.map +1 -0
  104. package/dist/src/bitgo/wallet/WalletUnspentSigner.js +47 -0
  105. package/dist/src/bitgo/wallet/chains.d.ts +57 -0
  106. package/dist/src/bitgo/wallet/chains.d.ts.map +1 -0
  107. package/dist/src/bitgo/wallet/chains.js +106 -0
  108. package/dist/src/bitgo/wallet/index.d.ts +8 -0
  109. package/dist/src/bitgo/wallet/index.d.ts.map +1 -0
  110. package/dist/src/bitgo/wallet/index.js +20 -0
  111. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +26 -0
  112. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +1 -0
  113. package/dist/src/bitgo/zcash/ZcashBufferutils.js +157 -0
  114. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +36 -0
  115. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -0
  116. package/dist/src/bitgo/zcash/ZcashPsbt.js +146 -0
  117. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +61 -0
  118. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +1 -0
  119. package/dist/src/bitgo/zcash/ZcashTransaction.js +341 -0
  120. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +21 -0
  121. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +1 -0
  122. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +105 -0
  123. package/dist/src/bitgo/zcash/address.d.ts +8 -0
  124. package/dist/src/bitgo/zcash/address.d.ts.map +1 -0
  125. package/dist/src/bitgo/zcash/address.js +57 -0
  126. package/dist/src/bitgo/zcash/hashZip0244.d.ts +27 -0
  127. package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +1 -0
  128. package/dist/src/bitgo/zcash/hashZip0244.js +184 -0
  129. package/dist/src/bitgo/zcash/index.d.ts +4 -0
  130. package/dist/src/bitgo/zcash/index.d.ts.map +1 -0
  131. package/dist/src/bitgo/zcash/index.js +16 -0
  132. package/dist/src/classify.d.ts +19 -0
  133. package/dist/src/classify.d.ts.map +1 -0
  134. package/dist/src/classify.js +89 -0
  135. package/dist/src/index.d.ts +13 -0
  136. package/dist/src/index.d.ts.map +1 -0
  137. package/dist/src/index.js +36 -0
  138. package/dist/src/networks.d.ts +119 -0
  139. package/dist/src/networks.d.ts.map +1 -0
  140. package/dist/src/networks.js +477 -0
  141. package/dist/src/noble_ecc.d.ts +28 -0
  142. package/dist/src/noble_ecc.d.ts.map +1 -0
  143. package/dist/src/noble_ecc.js +168 -0
  144. package/dist/src/payments/index.d.ts +4 -0
  145. package/dist/src/payments/index.d.ts.map +1 -0
  146. package/dist/src/payments/index.js +8 -0
  147. package/dist/src/payments/p2tr.d.ts +3 -0
  148. package/dist/src/payments/p2tr.d.ts.map +1 -0
  149. package/dist/src/payments/p2tr.js +348 -0
  150. package/dist/src/payments/p2tr_ns.d.ts +3 -0
  151. package/dist/src/payments/p2tr_ns.d.ts.map +1 -0
  152. package/dist/src/payments/p2tr_ns.js +134 -0
  153. package/dist/src/taproot.d.ts +141 -0
  154. package/dist/src/taproot.d.ts.map +1 -0
  155. package/dist/src/taproot.js +384 -0
  156. package/dist/src/templates/multisig/index.d.ts +4 -0
  157. package/dist/src/templates/multisig/index.d.ts.map +1 -0
  158. package/dist/src/templates/multisig/index.js +8 -0
  159. package/dist/src/templates/multisig/input.d.ts +7 -0
  160. package/dist/src/templates/multisig/input.d.ts.map +1 -0
  161. package/dist/src/templates/multisig/input.js +25 -0
  162. package/dist/src/templates/multisig/output.d.ts +7 -0
  163. package/dist/src/templates/multisig/output.d.ts.map +1 -0
  164. package/dist/src/templates/multisig/output.js +38 -0
  165. package/dist/src/templates/nulldata.d.ts +10 -0
  166. package/dist/src/templates/nulldata.d.ts.map +1 -0
  167. package/dist/src/templates/nulldata.js +17 -0
  168. package/dist/src/templates/pubkey/index.d.ts +4 -0
  169. package/dist/src/templates/pubkey/index.d.ts.map +1 -0
  170. package/dist/src/templates/pubkey/index.js +8 -0
  171. package/dist/src/templates/pubkey/input.d.ts +7 -0
  172. package/dist/src/templates/pubkey/input.d.ts.map +1 -0
  173. package/dist/src/templates/pubkey/input.js +14 -0
  174. package/dist/src/templates/pubkey/output.d.ts +7 -0
  175. package/dist/src/templates/pubkey/output.d.ts.map +1 -0
  176. package/dist/src/templates/pubkey/output.js +15 -0
  177. package/dist/src/templates/pubkeyhash/index.d.ts +4 -0
  178. package/dist/src/templates/pubkeyhash/index.d.ts.map +1 -0
  179. package/dist/src/templates/pubkeyhash/index.js +8 -0
  180. package/dist/src/templates/pubkeyhash/input.d.ts +7 -0
  181. package/dist/src/templates/pubkeyhash/input.d.ts.map +1 -0
  182. package/dist/src/templates/pubkeyhash/input.js +16 -0
  183. package/dist/src/templates/pubkeyhash/output.d.ts +6 -0
  184. package/dist/src/templates/pubkeyhash/output.d.ts.map +1 -0
  185. package/dist/src/templates/pubkeyhash/output.js +20 -0
  186. package/dist/src/templates/scripthash/index.d.ts +4 -0
  187. package/dist/src/templates/scripthash/index.d.ts.map +1 -0
  188. package/dist/src/templates/scripthash/index.js +8 -0
  189. package/dist/src/templates/scripthash/input.d.ts +6 -0
  190. package/dist/src/templates/scripthash/input.d.ts.map +1 -0
  191. package/dist/src/templates/scripthash/input.js +43 -0
  192. package/dist/src/templates/scripthash/output.d.ts +6 -0
  193. package/dist/src/templates/scripthash/output.d.ts.map +1 -0
  194. package/dist/src/templates/scripthash/output.js +15 -0
  195. package/dist/src/templates/taproot/index.d.ts +4 -0
  196. package/dist/src/templates/taproot/index.d.ts.map +1 -0
  197. package/dist/src/templates/taproot/index.js +8 -0
  198. package/dist/src/templates/taproot/input.d.ts +6 -0
  199. package/dist/src/templates/taproot/input.d.ts.map +1 -0
  200. package/dist/src/templates/taproot/input.js +23 -0
  201. package/dist/src/templates/taproot/output.d.ts +6 -0
  202. package/dist/src/templates/taproot/output.d.ts.map +1 -0
  203. package/dist/src/templates/taproot/output.js +15 -0
  204. package/dist/src/templates/taprootnofn/index.d.ts +4 -0
  205. package/dist/src/templates/taprootnofn/index.d.ts.map +1 -0
  206. package/dist/src/templates/taprootnofn/index.js +8 -0
  207. package/dist/src/templates/taprootnofn/input.d.ts +7 -0
  208. package/dist/src/templates/taprootnofn/input.d.ts.map +1 -0
  209. package/dist/src/templates/taprootnofn/input.js +24 -0
  210. package/dist/src/templates/taprootnofn/output.d.ts +7 -0
  211. package/dist/src/templates/taprootnofn/output.d.ts.map +1 -0
  212. package/dist/src/templates/taprootnofn/output.js +28 -0
  213. package/dist/src/templates/witnesscommitment/index.d.ts +3 -0
  214. package/dist/src/templates/witnesscommitment/index.d.ts.map +1 -0
  215. package/dist/src/templates/witnesscommitment/index.js +6 -0
  216. package/dist/src/templates/witnesscommitment/output.d.ts +8 -0
  217. package/dist/src/templates/witnesscommitment/output.d.ts.map +1 -0
  218. package/dist/src/templates/witnesscommitment/output.js +31 -0
  219. package/dist/src/templates/witnesspubkeyhash/index.d.ts +4 -0
  220. package/dist/src/templates/witnesspubkeyhash/index.d.ts.map +1 -0
  221. package/dist/src/templates/witnesspubkeyhash/index.js +8 -0
  222. package/dist/src/templates/witnesspubkeyhash/input.d.ts +7 -0
  223. package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +1 -0
  224. package/dist/src/templates/witnesspubkeyhash/input.js +19 -0
  225. package/dist/src/templates/witnesspubkeyhash/output.d.ts +6 -0
  226. package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +1 -0
  227. package/dist/src/templates/witnesspubkeyhash/output.js +15 -0
  228. package/dist/src/templates/witnessscripthash/index.d.ts +4 -0
  229. package/dist/src/templates/witnessscripthash/index.d.ts.map +1 -0
  230. package/dist/src/templates/witnessscripthash/index.js +8 -0
  231. package/dist/src/templates/witnessscripthash/input.d.ts +6 -0
  232. package/dist/src/templates/witnessscripthash/input.d.ts.map +1 -0
  233. package/dist/src/templates/witnessscripthash/input.js +35 -0
  234. package/dist/src/templates/witnessscripthash/output.d.ts +6 -0
  235. package/dist/src/templates/witnessscripthash/output.d.ts.map +1 -0
  236. package/dist/src/templates/witnessscripthash/output.js +15 -0
  237. package/dist/src/testutil/index.d.ts +3 -0
  238. package/dist/src/testutil/index.d.ts.map +1 -0
  239. package/dist/src/testutil/index.js +15 -0
  240. package/dist/src/testutil/keys.d.ts +10 -0
  241. package/dist/src/testutil/keys.d.ts.map +1 -0
  242. package/dist/src/testutil/keys.js +40 -0
  243. package/dist/src/testutil/mock.d.ts +21 -0
  244. package/dist/src/testutil/mock.d.ts.map +1 -0
  245. package/dist/src/testutil/mock.js +86 -0
  246. package/dist/src/transaction_builder.d.ts +47 -0
  247. package/dist/src/transaction_builder.d.ts.map +1 -0
  248. package/dist/src/transaction_builder.js +1084 -0
  249. package/package.json +87 -0
@@ -0,0 +1,384 @@
1
+ "use strict";
2
+ // Taproot-specific key aggregation and taptree logic as defined in:
3
+ // https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
4
+ // https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getTweakedOutputKey = exports.getTaptreeRoot = exports.getTapleafHash = exports.parseControlBlock = exports.parseTaprootWitness = exports.getControlBlock = exports.getHuffmanTaptree = exports.getDepthFirstTaptree = exports.tapTweakPubkey = exports.tapTweakPrivkey = exports.hashTapBranch = exports.hashTapLeaf = exports.serializeScriptSize = exports.aggregateMuSigPubkeys = exports.INITIAL_TAPSCRIPT_VERSION = exports.EVEN_Y_COORD_PREFIX = void 0;
7
+ const assert = require("assert");
8
+ const FastPriorityQueue = require("fastpriorityqueue");
9
+ const bitcoinjs_lib_1 = require("bitcoinjs-lib");
10
+ const varuint = require('varuint-bitcoin');
11
+ /**
12
+ * The 0x02 prefix indicating an even Y coordinate which is implicitly assumed
13
+ * on all 32 byte x-only pub keys as defined in BIP340.
14
+ */
15
+ exports.EVEN_Y_COORD_PREFIX = Buffer.of(0x02);
16
+ exports.INITIAL_TAPSCRIPT_VERSION = 0xc0;
17
+ /**
18
+ * Aggregates a list of public keys into a single MuSig2* public key
19
+ * according to the MuSig2 paper.
20
+ * @param ecc Elliptic curve implementation
21
+ * @param pubkeys The list of pub keys to aggregate
22
+ * @returns a 32 byte Buffer representing the aggregate key
23
+ */
24
+ function aggregateMuSigPubkeys(ecc, pubkeys) {
25
+ // TODO: Consider enforcing key uniqueness.
26
+ assert(pubkeys.length > 1, 'at least two pubkeys are required for musig key aggregation');
27
+ // Sort the keys in ascending order
28
+ pubkeys.sort(Buffer.compare);
29
+ // In MuSig all signers contribute key material to a single signing key,
30
+ // using the equation
31
+ //
32
+ // P = sum_i µ_i * P_i
33
+ //
34
+ // where `P_i` is the public key of the `i`th signer and `µ_i` is a so-called
35
+ // _MuSig coefficient_ computed according to the following equation
36
+ //
37
+ // L = H(P_1 || P_2 || ... || P_n)
38
+ // µ_i = H(L || P_i)
39
+ const L = bitcoinjs_lib_1.crypto.taggedHash('KeyAgg list', Buffer.concat(pubkeys));
40
+ const secondUniquePubkey = pubkeys.find((pubkey) => !pubkeys[0].equals(pubkey));
41
+ const tweakedPubkeys = pubkeys.map((pubkey) => {
42
+ const xyPubkey = Buffer.concat([exports.EVEN_Y_COORD_PREFIX, pubkey]);
43
+ if (secondUniquePubkey !== undefined && secondUniquePubkey.equals(pubkey)) {
44
+ // The second unique key in the pubkey list given to ''KeyAgg'' (as well
45
+ // as any keys identical to this key) gets the constant KeyAgg
46
+ // coefficient 1 which saves an exponentiation (see the MuSig2* appendix
47
+ // in the MuSig2 paper).
48
+ return xyPubkey;
49
+ }
50
+ const c = bitcoinjs_lib_1.crypto.taggedHash('KeyAgg coefficient', Buffer.concat([L, pubkey]));
51
+ const tweakedPubkey = ecc.pointMultiply(xyPubkey, c);
52
+ if (!tweakedPubkey) {
53
+ throw new Error('Failed to multiply pubkey by coefficient');
54
+ }
55
+ return tweakedPubkey;
56
+ });
57
+ const aggregatePubkey = tweakedPubkeys.reduce((prev, curr) => {
58
+ const next = ecc.pointAdd(prev, curr);
59
+ if (!next)
60
+ throw new Error('Failed to sum pubkeys');
61
+ return next;
62
+ });
63
+ return aggregatePubkey.slice(1);
64
+ }
65
+ exports.aggregateMuSigPubkeys = aggregateMuSigPubkeys;
66
+ /**
67
+ * Encodes the length of a script as a bitcoin variable length integer.
68
+ * @param script
69
+ * @returns
70
+ */
71
+ function serializeScriptSize(script) {
72
+ return varuint.encode(script.length);
73
+ }
74
+ exports.serializeScriptSize = serializeScriptSize;
75
+ /**
76
+ * Gets a tapleaf tagged hash from a script.
77
+ * @param script
78
+ * @returns
79
+ */
80
+ function hashTapLeaf(script, leafVersion = exports.INITIAL_TAPSCRIPT_VERSION) {
81
+ const size = serializeScriptSize(script);
82
+ return bitcoinjs_lib_1.crypto.taggedHash('TapLeaf', Buffer.concat([Buffer.of(leafVersion), size, script]));
83
+ }
84
+ exports.hashTapLeaf = hashTapLeaf;
85
+ /**
86
+ * Creates a lexicographically sorted tapbranch from two child taptree nodes
87
+ * and returns its tagged hash.
88
+ * @param child1
89
+ * @param child2
90
+ * @returns the tagged tapbranch hash
91
+ */
92
+ function hashTapBranch(child1, child2) {
93
+ // sort the children lexicographically
94
+ const sortedChildren = [child1, child2].sort(Buffer.compare);
95
+ return bitcoinjs_lib_1.crypto.taggedHash('TapBranch', Buffer.concat(sortedChildren));
96
+ }
97
+ exports.hashTapBranch = hashTapBranch;
98
+ function calculateTapTweak(pubkey, taptreeRoot) {
99
+ if (taptreeRoot) {
100
+ return bitcoinjs_lib_1.crypto.taggedHash('TapTweak', Buffer.concat([pubkey, taptreeRoot]));
101
+ }
102
+ // If the spending conditions do not require a script path, the output key should commit to an
103
+ // unspendable script path instead of having no script path.
104
+ // https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki#cite_note-22
105
+ return bitcoinjs_lib_1.crypto.taggedHash('TapTweak', Buffer.from(pubkey));
106
+ }
107
+ /**
108
+ * Tweaks a privkey, using the tagged hash of its pubkey, and (optionally) a taptree root
109
+ * @param ecc Elliptic curve implementation
110
+ * @param pubkey public key, used to calculate the tweak
111
+ * @param privkey the privkey to tweak
112
+ * @param taptreeRoot the taptree root tagged hash
113
+ * @returns {Buffer} the tweaked privkey
114
+ */
115
+ function tapTweakPrivkey(ecc, pubkey, privkey, taptreeRoot) {
116
+ const tapTweak = calculateTapTweak(pubkey, taptreeRoot);
117
+ const point = ecc.pointFromScalar(privkey);
118
+ if (!point)
119
+ throw new Error('Invalid private key');
120
+ if (point[0] % 2 === 1)
121
+ privkey = ecc.privateNegate(privkey);
122
+ const result = ecc.privateAdd(privkey, tapTweak);
123
+ if (!result)
124
+ throw new Error('Invalid private key');
125
+ return result;
126
+ }
127
+ exports.tapTweakPrivkey = tapTweakPrivkey;
128
+ /**
129
+ * Tweaks an internal pubkey, using the tagged hash of itself, and (optionally) a taptree root
130
+ * @param ecc Elliptic curve implementation
131
+ * @param pubkey the internal pubkey to tweak
132
+ * @param taptreeRoot the taptree root tagged hash
133
+ * @returns {TweakedPubkey} the tweaked pubkey
134
+ */
135
+ function tapTweakPubkey(ecc, pubkey, taptreeRoot) {
136
+ const tapTweak = calculateTapTweak(pubkey, taptreeRoot);
137
+ const result = ecc.xOnlyPointAddTweak(pubkey, tapTweak);
138
+ if (!result)
139
+ throw new Error('Invalid pubkey');
140
+ return result;
141
+ }
142
+ exports.tapTweakPubkey = tapTweakPubkey;
143
+ function recurseTaptree(leaves, targetDepth = 0) {
144
+ const { value, done } = leaves.next();
145
+ assert(!done, 'insufficient leaves to reconstruct tap tree');
146
+ const [index, leaf] = value;
147
+ const tree = {
148
+ root: hashTapLeaf(leaf.script, leaf.leafVersion),
149
+ paths: [],
150
+ };
151
+ tree.paths[index] = [];
152
+ for (let depth = leaf.depth; depth > targetDepth; depth--) {
153
+ const sibling = recurseTaptree(leaves, depth);
154
+ tree.paths.forEach((path) => path.push(sibling.root));
155
+ sibling.paths.forEach((path) => path.push(tree.root));
156
+ tree.root = hashTapBranch(tree.root, sibling.root);
157
+ // Merge disjoint sparse arrays of paths into tree.paths
158
+ Object.assign(tree.paths, sibling.paths);
159
+ }
160
+ return tree;
161
+ }
162
+ /**
163
+ * Gets the root hash and hash-paths of a taptree from the depth-first
164
+ * construction used in BIP-0371 PSBTs
165
+ * @param tree
166
+ * @returns {Taptree} the tree, represented by its root hash, and the paths to
167
+ * that root from each of the input scripts
168
+ */
169
+ function getDepthFirstTaptree(tree) {
170
+ const iter = tree.leaves.entries();
171
+ const ret = recurseTaptree(iter);
172
+ assert(iter.next().done, 'invalid tap tree, no path to some leaves');
173
+ return ret;
174
+ }
175
+ exports.getDepthFirstTaptree = getDepthFirstTaptree;
176
+ /**
177
+ * Gets the root hash of a taptree using a weighted Huffman construction from a
178
+ * list of scripts and corresponding weights.
179
+ * @param scripts
180
+ * @param weights
181
+ * @returns {Taptree} the tree, represented by its root hash, and the paths to that root from each of the input scripts
182
+ */
183
+ function getHuffmanTaptree(scripts, weights) {
184
+ assert(scripts.length > 0, 'at least one script is required to construct a tap tree');
185
+ // Create a queue/heap of the provided scripts prioritized according to their
186
+ // corresponding weights.
187
+ const queue = new FastPriorityQueue((a, b) => {
188
+ return a.weight < b.weight;
189
+ });
190
+ scripts.forEach((script, index) => {
191
+ const weight = weights[index] || 1;
192
+ assert(weight > 0, 'script weight must be a positive value');
193
+ queue.add({
194
+ weight,
195
+ taggedHash: hashTapLeaf(script),
196
+ paths: { [index]: [] },
197
+ });
198
+ });
199
+ // Now that we have a queue of weighted scripts, we begin a loop whereby we
200
+ // remove the two lowest weighted items from the queue. We create a tap branch
201
+ // node from the two items, and add the branch back to the queue with the
202
+ // combined weight of both its children. Each loop reduces the number of items
203
+ // in the queue by one, and we repeat until we are left with only one item -
204
+ // this becomes the tap tree root.
205
+ //
206
+ // For example, if we begin with scripts A, B, C, D with weights 6, 3, 1, 1
207
+ // After first loop: A(6), B(3), CD(1 + 1)
208
+ // After second loop: A(6), B[CD](3 + 2)
209
+ // Final loop: A[B[CD]](6+5)
210
+ // The final tree will look like:
211
+ //
212
+ // A[B[CD]]
213
+ // / \
214
+ // A B[CD]
215
+ // / \
216
+ // B [CD]
217
+ // / \
218
+ // C D
219
+ //
220
+ // This ensures that the spending conditions we believe to have the highest
221
+ // probability of being used are further up the tree than less likely scripts,
222
+ // thereby reducing the size of the merkle proofs for the more likely scripts.
223
+ while (queue.size > 1) {
224
+ // We can safely expect two polls to return non-null elements since we've
225
+ // checked that the queue has at least two elements before looping.
226
+ const child1 = queue.poll();
227
+ const child2 = queue.poll();
228
+ Object.values(child1.paths).forEach((path) => path.push(child2.taggedHash));
229
+ Object.values(child2.paths).forEach((path) => path.push(child1.taggedHash));
230
+ queue.add({
231
+ taggedHash: hashTapBranch(child1.taggedHash, child2.taggedHash),
232
+ weight: child1.weight + child2.weight,
233
+ paths: { ...child1.paths, ...child2.paths },
234
+ });
235
+ }
236
+ // After the while loop above completes we should have exactly one element
237
+ // remaining in the queue, which we can safely extract below.
238
+ const rootNode = queue.poll();
239
+ const paths = Object.entries(rootNode.paths).reduce((acc, [index, path]) => {
240
+ acc[Number(index)] = path; // TODO: Why doesn't TS know it's a number?
241
+ return acc;
242
+ }, Array(scripts.length));
243
+ return { root: rootNode.taggedHash, paths };
244
+ }
245
+ exports.getHuffmanTaptree = getHuffmanTaptree;
246
+ function getControlBlock(parity, pubkey, path, leafVersion = exports.INITIAL_TAPSCRIPT_VERSION) {
247
+ const parityVersion = leafVersion + parity;
248
+ return Buffer.concat([Buffer.of(parityVersion), pubkey, ...path]);
249
+ }
250
+ exports.getControlBlock = getControlBlock;
251
+ /**
252
+ * Parses a taproot witness stack and extracts key data elements.
253
+ * @param witnessStack
254
+ * @returns {ScriptPathWitness|KeyPathWitness} an object representing the
255
+ * parsed witness for a script path or key path spend.
256
+ * @throws {Error} if the witness stack does not conform to the BIP 341 script validation rules
257
+ */
258
+ function parseTaprootWitness(witnessStack) {
259
+ let annex;
260
+ if (witnessStack.length >= 2 && witnessStack[witnessStack.length - 1][0] === 0x50) {
261
+ // If there are at least two witness elements, and the first byte of the last element is
262
+ // 0x50, this last element is called annex a and is removed from the witness stack
263
+ annex = witnessStack[witnessStack.length - 1];
264
+ witnessStack = witnessStack.slice(0, -1);
265
+ }
266
+ if (witnessStack.length < 1) {
267
+ throw new Error('witness stack must have at least one element');
268
+ }
269
+ else if (witnessStack.length === 1) {
270
+ // key path spend
271
+ const signature = witnessStack[0];
272
+ if (!bitcoinjs_lib_1.script.isCanonicalSchnorrSignature(signature)) {
273
+ throw new Error('invalid signature');
274
+ }
275
+ return { spendType: 'Key', signature, annex };
276
+ }
277
+ // script path spend
278
+ // second to last element is the tapscript
279
+ const tapscript = witnessStack[witnessStack.length - 2];
280
+ const tapscriptChunks = bitcoinjs_lib_1.script.decompile(tapscript);
281
+ if (!tapscriptChunks || tapscriptChunks.length === 0) {
282
+ throw new Error('tapscript is not a valid script');
283
+ }
284
+ // The last stack element is called the control block c, and must have length 33 + 32m,
285
+ // for a value of m that is an integer between 0 and 128, inclusive
286
+ const controlBlock = witnessStack[witnessStack.length - 1];
287
+ if (controlBlock.length < 33 || controlBlock.length > 33 + 32 * 128 || controlBlock.length % 32 !== 1) {
288
+ throw new Error('invalid control block length');
289
+ }
290
+ return {
291
+ spendType: 'Script',
292
+ scriptSig: witnessStack.slice(0, -2),
293
+ tapscript,
294
+ controlBlock,
295
+ annex,
296
+ };
297
+ }
298
+ exports.parseTaprootWitness = parseTaprootWitness;
299
+ /**
300
+ * Parses a taproot control block.
301
+ * @param ecc Elliptic curve implementation
302
+ * @param controlBlock the control block to parse
303
+ * @returns {ControlBlock} the parsed control block
304
+ * @throws {Error} if the witness stack does not conform to the BIP 341 script validation rules
305
+ */
306
+ function parseControlBlock(ecc, controlBlock) {
307
+ if ((controlBlock.length - 1) % 32 !== 0) {
308
+ throw new TypeError('Invalid control block length');
309
+ }
310
+ const parity = controlBlock[0] & 0x01;
311
+ // Let p = c[1:33] and let P = lift_x(int(p)) where lift_x and [:] are defined as in BIP340.
312
+ // Fail if this point is not on the curve
313
+ const internalPubkey = controlBlock.slice(1, 33);
314
+ if (!ecc.isXOnlyPoint(internalPubkey)) {
315
+ throw new Error('internal pubkey is not an EC point');
316
+ }
317
+ // The leaf version cannot be 0x50 as that would result in ambiguity with the annex.
318
+ const leafVersion = controlBlock[0] & 0xfe;
319
+ if (leafVersion === 0x50) {
320
+ throw new Error('invalid leaf version');
321
+ }
322
+ const path = [];
323
+ for (let j = 33; j < controlBlock.length; j += 32) {
324
+ path.push(controlBlock.slice(j, j + 32));
325
+ }
326
+ return {
327
+ parity,
328
+ internalPubkey,
329
+ leafVersion,
330
+ path,
331
+ };
332
+ }
333
+ exports.parseControlBlock = parseControlBlock;
334
+ /**
335
+ * Calculates the tapleaf hash from a control block and script.
336
+ * @param ecc Elliptic curve implementation
337
+ * @param controlBlock the control block, either raw or parsed
338
+ * @param tapscript the leaf script corresdponding to the control block
339
+ * @returns {Buffer} the tapleaf hash
340
+ */
341
+ function getTapleafHash(ecc, controlBlock, tapscript) {
342
+ if (Buffer.isBuffer(controlBlock)) {
343
+ controlBlock = parseControlBlock(ecc, controlBlock);
344
+ }
345
+ const { leafVersion } = controlBlock;
346
+ return bitcoinjs_lib_1.crypto.taggedHash('TapLeaf', Buffer.concat([Buffer.of(leafVersion), serializeScriptSize(tapscript), tapscript]));
347
+ }
348
+ exports.getTapleafHash = getTapleafHash;
349
+ /**
350
+ * Calculates the taptree root hash from a control block and script.
351
+ * @param ecc Elliptic curve implementation
352
+ * @param controlBlock the control block, either raw or parsed
353
+ * @param tapscript the leaf script corresdponding to the control block
354
+ * @param tapleafHash the leaf hash if already calculated
355
+ * @returns {Buffer} the taptree root hash
356
+ */
357
+ function getTaptreeRoot(ecc, controlBlock, tapscript, tapleafHash) {
358
+ if (Buffer.isBuffer(controlBlock)) {
359
+ controlBlock = parseControlBlock(ecc, controlBlock);
360
+ }
361
+ const { path } = controlBlock;
362
+ tapleafHash = tapleafHash || getTapleafHash(ecc, controlBlock, tapscript);
363
+ // `taptreeMerkleHash` begins as our tapscript tapleaf hash and its value iterates
364
+ // through its parent tapbranch hashes until it ends up as the taptree root hash
365
+ let taptreeMerkleHash = tapleafHash;
366
+ for (const taptreeSiblingHash of path) {
367
+ taptreeMerkleHash =
368
+ Buffer.compare(taptreeMerkleHash, taptreeSiblingHash) === -1
369
+ ? bitcoinjs_lib_1.crypto.taggedHash('TapBranch', Buffer.concat([taptreeMerkleHash, taptreeSiblingHash]))
370
+ : bitcoinjs_lib_1.crypto.taggedHash('TapBranch', Buffer.concat([taptreeSiblingHash, taptreeMerkleHash]));
371
+ }
372
+ return taptreeMerkleHash;
373
+ }
374
+ exports.getTaptreeRoot = getTaptreeRoot;
375
+ function getTweakedOutputKey(payment) {
376
+ var _a;
377
+ assert(payment.output);
378
+ if (payment.output.length === 34) {
379
+ return (_a = payment.output) === null || _a === void 0 ? void 0 : _a.subarray(2);
380
+ }
381
+ throw new Error(`invalid p2tr tweaked output key size ${payment.output.length}`);
382
+ }
383
+ exports.getTweakedOutputKey = getTweakedOutputKey;
384
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwcm9vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXByb290LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvRUFBb0U7QUFDcEUsaUVBQWlFO0FBQ2pFLGlFQUFpRTs7O0FBR2pFLGlDQUFrQztBQUNsQyx1REFBd0Q7QUFDeEQsaURBQTRGO0FBQzVGLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRTNDOzs7R0FHRztBQUNVLFFBQUEsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QyxRQUFBLHlCQUF5QixHQUFHLElBQUksQ0FBQztBQVk5Qzs7Ozs7O0dBTUc7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxHQUEyQixFQUFFLE9BQWlCO0lBQ2xGLDJDQUEyQztJQUMzQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsNkRBQTZELENBQUMsQ0FBQztJQUUxRixtQ0FBbUM7SUFDbkMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFN0Isd0VBQXdFO0lBQ3hFLHFCQUFxQjtJQUNyQixFQUFFO0lBQ0YsMEJBQTBCO0lBQzFCLEVBQUU7SUFDRiw2RUFBNkU7SUFDN0UsbUVBQW1FO0lBQ25FLEVBQUU7SUFDRixrQ0FBa0M7SUFDbEMsb0JBQW9CO0lBRXBCLE1BQU0sQ0FBQyxHQUFHLHNCQUFPLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFcEUsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUVoRixNQUFNLGNBQWMsR0FBaUIsT0FB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QUFrRjtJQUNsRixnRkFBZ0Y7SUFDaEYsSUFBSSxpQkFBaUIsR0FBRyxXQUFXLENBQUM7SUFDcEMsS0FBSyxNQUFNLGtCQUFrQixJQUFJLElBQUksRUFBRTtRQUNyQyxpQkFBaUI7WUFDZixNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxRCxDQUFDLENBQUMsc0JBQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLENBQUMsQ0FBQyxzQkFBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9GO0lBRUQsT0FBTyxpQkFBaUIsQ0FBQztBQUMzQixDQUFDO0FBeEJELHdDQXdCQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLE9BQTBCOztJQUM1RCxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQ2hDLE9BQU8sTUFBQSxPQUFPLENBQUMsTUFBTSwwQ0FBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDbkYsQ0FBQztBQU5ELGtEQU1DIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGFwcm9vdC1zcGVjaWZpYyBrZXkgYWdncmVnYXRpb24gYW5kIHRhcHRyZWUgbG9naWMgYXMgZGVmaW5lZCBpbjpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzNDAubWVkaWF3aWtpXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzQxLm1lZGlhd2lraVxuXG5pbXBvcnQgeyBUYXBUcmVlIGFzIFBzYnRUYXBUcmVlLCBUYXBMZWFmIGFzIFBzYnRUYXBMZWFmIH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5pbXBvcnQgRmFzdFByaW9yaXR5UXVldWUgPSByZXF1aXJlKCdmYXN0cHJpb3JpdHlxdWV1ZScpO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQsIGNyeXB0byBhcyBiY3J5cHRvLCBwYXltZW50cyBhcyBicGF5bWVudHMgfSBmcm9tICdiaXRjb2luanMtbGliJztcbmNvbnN0IHZhcnVpbnQgPSByZXF1aXJlKCd2YXJ1aW50LWJpdGNvaW4nKTtcblxuLyoqXG4gKiBUaGUgMHgwMiBwcmVmaXggaW5kaWNhdGluZyBhbiBldmVuIFkgY29vcmRpbmF0ZSB3aGljaCBpcyBpbXBsaWNpdGx5IGFzc3VtZWRcbiAqIG9uIGFsbCAzMiBieXRlIHgtb25seSBwdWIga2V5cyBhcyBkZWZpbmVkIGluIEJJUDM0MC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVWRU5fWV9DT09SRF9QUkVGSVggPSBCdWZmZXIub2YoMHgwMik7XG5leHBvcnQgY29uc3QgSU5JVElBTF9UQVBTQ1JJUFRfVkVSU0lPTiA9IDB4YzA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGlueVNlY3AyNTZrMUludGVyZmFjZSB7XG4gIGlzWE9ubHlQb2ludChwOiBVaW50OEFycmF5KTogYm9vbGVhbjtcbiAgeE9ubHlQb2ludEFkZFR3ZWFrKHA6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5KTogWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHwgbnVsbDtcbiAgcG9pbnRGcm9tU2NhbGFyKHNrOiBVaW50OEFycmF5LCBjb21wcmVzc2VkPzogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsO1xuICBwb2ludE11bHRpcGx5KGE6IFVpbnQ4QXJyYXksIGI6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHwgbnVsbDtcbiAgcG9pbnRBZGQoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgfCBudWxsO1xuICBwcml2YXRlQWRkKGQ6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5KTogVWludDhBcnJheSB8IG51bGw7XG4gIHByaXZhdGVOZWdhdGUoZDogVWludDhBcnJheSk6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogQWdncmVnYXRlcyBhIGxpc3Qgb2YgcHVibGljIGtleXMgaW50byBhIHNpbmdsZSBNdVNpZzIqIHB1YmxpYyBrZXlcbiAqIGFjY29yZGluZyB0byB0aGUgTXVTaWcyIHBhcGVyLlxuICogQHBhcmFtIGVjYyBFbGxpcHRpYyBjdXJ2ZSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHB1YmtleXMgVGhlIGxpc3Qgb2YgcHViIGtleXMgdG8gYWdncmVnYXRlXG4gKiBAcmV0dXJucyBhIDMyIGJ5dGUgQnVmZmVyIHJlcHJlc2VudGluZyB0aGUgYWdncmVnYXRlIGtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRlTXVTaWdQdWJrZXlzKGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSwgcHVia2V5czogQnVmZmVyW10pOiBVaW50OEFycmF5IHtcbiAgLy8gVE9ETzogQ29uc2lkZXIgZW5mb3JjaW5nIGtleSB1bmlxdWVuZXNzLlxuICBhc3NlcnQocHVia2V5cy5sZW5ndGggPiAxLCAnYXQgbGVhc3QgdHdvIHB1YmtleXMgYXJlIHJlcXVpcmVkIGZvciBtdXNpZyBrZXkgYWdncmVnYXRpb24nKTtcblxuICAvLyBTb3J0IHRoZSBrZXlzIGluIGFzY2VuZGluZyBvcmRlclxuICBwdWJrZXlzLnNvcnQoQnVmZmVyLmNvbXBhcmUpO1xuXG4gIC8vIEluIE11U2lnIGFsbCBzaWduZXJzIGNvbnRyaWJ1dGUga2V5IG1hdGVyaWFsIHRvIGEgc2luZ2xlIHNpZ25pbmcga2V5LFxuICAvLyB1c2luZyB0aGUgZXF1YXRpb25cbiAgLy9cbiAgLy8gICAgIFAgPSBzdW1faSDCtV9pICogUF9pXG4gIC8vXG4gIC8vIHdoZXJlIGBQX2lgIGlzIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBgaWB0aCBzaWduZXIgYW5kIGDCtV9pYCBpcyBhIHNvLWNhbGxlZFxuICAvLyBfTXVTaWcgY29lZmZpY2llbnRfIGNvbXB1dGVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGVxdWF0aW9uXG4gIC8vXG4gIC8vIEwgPSBIKFBfMSB8fCBQXzIgfHwgLi4uIHx8IFBfbilcbiAgLy8gwrVfaSA9IEgoTCB8fCBQX2kpXG5cbiAgY29uc3QgTCA9IGJjcnlwdG8udGFnZ2VkSGFzaCgnS2V5QWdnIGxpc3QnLCBCdWZmZXIuY29uY2F0KHB1YmtleXMpKTtcblxuICBjb25zdCBzZWNvbmRVbmlxdWVQdWJrZXkgPSBwdWJrZXlzLmZpbmQoKHB1YmtleSkgPT4gIXB1YmtleXNbMF0uZXF1YWxzKHB1YmtleSkpO1xuXG4gIGNvbnN0IHR3ZWFrZWRQdWJrZXlzOiBVaW50OEFycmF5W10gPSBwdWJrZXlzLm1hcCgocHVia2V5KSA9PiB7XG4gICAgY29uc3QgeHlQdWJrZXkgPSBCdWZmZXIuY29uY2F0KFtFVkVOX1lfQ09PUkRfUFJFRklYLCBwdWJrZXldKTtcblxuICAgIGlmIChzZWNvbmRVbmlxdWVQdWJrZXkgIT09IHVuZGVmaW5lZCAmJiBzZWNvbmRVbmlxdWVQdWJrZXkuZXF1YWxzKHB1YmtleSkpIHtcbiAgICAgIC8vIFRoZSBzZWNvbmQgdW5pcXVlIGtleSBpbiB0aGUgcHVia2V5IGxpc3QgZ2l2ZW4gdG8gJydLZXlBZ2cnJyAoYXMgd2VsbFxuICAgICAgLy8gYXMgYW55IGtleXMgaWRlbnRpY2FsIHRvIHRoaXMga2V5KSBnZXRzIHRoZSBjb25zdGFudCBLZXlBZ2dcbiAgICAgIC8vIGNvZWZmaWNpZW50IDEgd2hpY2ggc2F2ZXMgYW4gZXhwb25lbnRpYXRpb24gKHNlZSB0aGUgTXVTaWcyKiBhcHBlbmRpeFxuICAgICAgLy8gaW4gdGhlIE11U2lnMiBwYXBlcikuXG4gICAgICByZXR1cm4geHlQdWJrZXk7XG4gICAgfVxuXG4gICAgY29uc3QgYyA9IGJjcnlwdG8udGFnZ2VkSGFzaCgnS2V5QWdnIGNvZWZmaWNpZW50JywgQnVmZmVyLmNvbmNhdChbTCwgcHVia2V5XSkpO1xuXG4gICAgY29uc3QgdHdlYWtlZFB1YmtleSA9IGVjYy5wb2ludE11bHRpcGx5KHh5UHVia2V5LCBjKTtcbiAgICBpZiAoIXR3ZWFrZWRQdWJrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIG11bHRpcGx5IHB1YmtleSBieSBjb2VmZmljaWVudCcpO1xuICAgIH1cbiAgICByZXR1cm4gdHdlYWtlZFB1YmtleTtcbiAgfSk7XG4gIGNvbnN0IGFnZ3JlZ2F0ZVB1YmtleSA9IHR3ZWFrZWRQdWJrZXlzLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBlY2MucG9pbnRBZGQocHJldiwgY3Vycik7XG4gICAgaWYgKCFuZXh0KSB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzdW0gcHVia2V5cycpO1xuICAgIHJldHVybiBuZXh0O1xuICB9KTtcblxuICByZXR1cm4gYWdncmVnYXRlUHVia2V5LnNsaWNlKDEpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgdGhlIGxlbmd0aCBvZiBhIHNjcmlwdCBhcyBhIGJpdGNvaW4gdmFyaWFibGUgbGVuZ3RoIGludGVnZXIuXG4gKiBAcGFyYW0gc2NyaXB0XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplU2NyaXB0U2l6ZShzY3JpcHQ6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gIHJldHVybiB2YXJ1aW50LmVuY29kZShzY3JpcHQubGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgdGFwbGVhZiB0YWdnZWQgaGFzaCBmcm9tIGEgc2NyaXB0LlxuICogQHBhcmFtIHNjcmlwdFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hUYXBMZWFmKHNjcmlwdDogQnVmZmVyLCBsZWFmVmVyc2lvbiA9IElOSVRJQUxfVEFQU0NSSVBUX1ZFUlNJT04pOiBCdWZmZXIge1xuICBjb25zdCBzaXplID0gc2VyaWFsaXplU2NyaXB0U2l6ZShzY3JpcHQpO1xuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKCdUYXBMZWFmJywgQnVmZmVyLmNvbmNhdChbQnVmZmVyLm9mKGxlYWZWZXJzaW9uKSwgc2l6ZSwgc2NyaXB0XSkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgdGFwYnJhbmNoIGZyb20gdHdvIGNoaWxkIHRhcHRyZWUgbm9kZXNcbiAqIGFuZCByZXR1cm5zIGl0cyB0YWdnZWQgaGFzaC5cbiAqIEBwYXJhbSBjaGlsZDFcbiAqIEBwYXJhbSBjaGlsZDJcbiAqIEByZXR1cm5zIHRoZSB0YWdnZWQgdGFwYnJhbmNoIGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hUYXBCcmFuY2goY2hpbGQxOiBCdWZmZXIsIGNoaWxkMjogQnVmZmVyKTogQnVmZmVyIHtcbiAgLy8gc29ydCB0aGUgY2hpbGRyZW4gbGV4aWNvZ3JhcGhpY2FsbHlcbiAgY29uc3Qgc29ydGVkQ2hpbGRyZW4gPSBbY2hpbGQxLCBjaGlsZDJdLnNvcnQoQnVmZmVyLmNvbXBhcmUpO1xuXG4gIHJldHVybiBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcEJyYW5jaCcsIEJ1ZmZlci5jb25jYXQoc29ydGVkQ2hpbGRyZW4pKTtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlVGFwVHdlYWsocHVia2V5OiBVaW50OEFycmF5LCB0YXB0cmVlUm9vdD86IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgaWYgKHRhcHRyZWVSb290KSB7XG4gICAgcmV0dXJuIGJjcnlwdG8udGFnZ2VkSGFzaCgnVGFwVHdlYWsnLCBCdWZmZXIuY29uY2F0KFtwdWJrZXksIHRhcHRyZWVSb290XSkpO1xuICB9XG4gIC8vIElmIHRoZSBzcGVuZGluZyBjb25kaXRpb25zIGRvIG5vdCByZXF1aXJlIGEgc2NyaXB0IHBhdGgsIHRoZSBvdXRwdXQga2V5IHNob3VsZCBjb21taXQgdG8gYW5cbiAgLy8gdW5zcGVuZGFibGUgc2NyaXB0IHBhdGggaW5zdGVhZCBvZiBoYXZpbmcgbm8gc2NyaXB0IHBhdGguXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzNDEubWVkaWF3aWtpI2NpdGVfbm90ZS0yMlxuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKCdUYXBUd2VhaycsIEJ1ZmZlci5mcm9tKHB1YmtleSkpO1xufVxuXG4vKipcbiAqIFR3ZWFrcyBhIHByaXZrZXksIHVzaW5nIHRoZSB0YWdnZWQgaGFzaCBvZiBpdHMgcHVia2V5LCBhbmQgKG9wdGlvbmFsbHkpIGEgdGFwdHJlZSByb290XG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gcHVia2V5IHB1YmxpYyBrZXksIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB0d2Vha1xuICogQHBhcmFtIHByaXZrZXkgdGhlIHByaXZrZXkgdG8gdHdlYWtcbiAqIEBwYXJhbSB0YXB0cmVlUm9vdCB0aGUgdGFwdHJlZSByb290IHRhZ2dlZCBoYXNoXG4gKiBAcmV0dXJucyB7QnVmZmVyfSB0aGUgdHdlYWtlZCBwcml2a2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YXBUd2Vha1ByaXZrZXkoXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgcHVia2V5OiBVaW50OEFycmF5LFxuICBwcml2a2V5OiBVaW50OEFycmF5LFxuICB0YXB0cmVlUm9vdD86IFVpbnQ4QXJyYXlcbik6IFVpbnQ4QXJyYXkge1xuICBjb25zdCB0YXBUd2VhayA9IGNhbGN1bGF0ZVRhcFR3ZWFrKHB1YmtleSwgdGFwdHJlZVJvb3QpO1xuXG4gIGNvbnN0IHBvaW50ID0gZWNjLnBvaW50RnJvbVNjYWxhcihwcml2a2V5KTtcbiAgaWYgKCFwb2ludCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaXZhdGUga2V5Jyk7XG4gIGlmIChwb2ludFswXSAlIDIgPT09IDEpIHByaXZrZXkgPSBlY2MucHJpdmF0ZU5lZ2F0ZShwcml2a2V5KTtcbiAgY29uc3QgcmVzdWx0ID0gZWNjLnByaXZhdGVBZGQocHJpdmtleSwgdGFwVHdlYWspO1xuICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaXZhdGUga2V5Jyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHtcbiAgcGFyaXR5OiAxIHwgMDtcbiAgeE9ubHlQdWJrZXk6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogVHdlYWtzIGFuIGludGVybmFsIHB1YmtleSwgdXNpbmcgdGhlIHRhZ2dlZCBoYXNoIG9mIGl0c2VsZiwgYW5kIChvcHRpb25hbGx5KSBhIHRhcHRyZWUgcm9vdFxuICogQHBhcmFtIGVjYyBFbGxpcHRpYyBjdXJ2ZSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHB1YmtleSB0aGUgaW50ZXJuYWwgcHVia2V5IHRvIHR3ZWFrXG4gKiBAcGFyYW0gdGFwdHJlZVJvb3QgdGhlIHRhcHRyZWUgcm9vdCB0YWdnZWQgaGFzaFxuICogQHJldHVybnMge1R3ZWFrZWRQdWJrZXl9IHRoZSB0d2Vha2VkIHB1YmtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFwVHdlYWtQdWJrZXkoXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgcHVia2V5OiBVaW50OEFycmF5LFxuICB0YXB0cmVlUm9vdD86IEJ1ZmZlclxuKTogWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHtcbiAgY29uc3QgdGFwVHdlYWsgPSBjYWxjdWxhdGVUYXBUd2VhayhwdWJrZXksIHRhcHRyZWVSb290KTtcbiAgY29uc3QgcmVzdWx0ID0gZWNjLnhPbmx5UG9pbnRBZGRUd2VhayhwdWJrZXksIHRhcFR3ZWFrKTtcbiAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwdWJrZXknKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYXB0cmVlIHtcbiAgcm9vdDogQnVmZmVyO1xuICBwYXRoczogQnVmZmVyW11bXTtcbn1cblxuaW50ZXJmYWNlIFdlaWdodGVkVGFwU2NyaXB0IHtcbiAgLyoqIEEgVGFwTGVhZiBvciBUYXBCcmFuY2ggdGFnZ2VkIGhhc2ggKi9cbiAgdGFnZ2VkSGFzaDogQnVmZmVyO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgcGF0aHM6IHtcbiAgICBbaW5kZXg6IG51bWJlcl06IEJ1ZmZlcltdO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZWN1cnNlVGFwdHJlZShsZWF2ZXM6IEl0ZXJhdG9yPFtudW1iZXIsIFBzYnRUYXBMZWFmXT4sIHRhcmdldERlcHRoID0gMCk6IFRhcHRyZWUge1xuICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBsZWF2ZXMubmV4dCgpO1xuICBhc3NlcnQoIWRvbmUsICdpbnN1ZmZpY2llbnQgbGVhdmVzIHRvIHJlY29uc3RydWN0IHRhcCB0cmVlJyk7XG4gIGNvbnN0IFtpbmRleCwgbGVhZl0gPSB2YWx1ZTtcbiAgY29uc3QgdHJlZTogVGFwdHJlZSA9IHtcbiAgICByb290OiBoYXNoVGFwTGVhZihsZWFmLnNjcmlwdCwgbGVhZi5sZWFmVmVyc2lvbiksXG4gICAgcGF0aHM6IFtdLFxuICB9O1xuICB0cmVlLnBhdGhzW2luZGV4XSA9IFtdO1xuICBmb3IgKGxldCBkZXB0aCA9IGxlYWYuZGVwdGg7IGRlcHRoID4gdGFyZ2V0RGVwdGg7IGRlcHRoLS0pIHtcbiAgICBjb25zdCBzaWJsaW5nID0gcmVjdXJzZVRhcHRyZWUobGVhdmVzLCBkZXB0aCk7XG4gICAgdHJlZS5wYXRocy5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnB1c2goc2libGluZy5yb290KSk7XG4gICAgc2libGluZy5wYXRocy5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnB1c2godHJlZS5yb290KSk7XG4gICAgdHJlZS5yb290ID0gaGFzaFRhcEJyYW5jaCh0cmVlLnJvb3QsIHNpYmxpbmcucm9vdCk7XG4gICAgLy8gTWVyZ2UgZGlzam9pbnQgc3BhcnNlIGFycmF5cyBvZiBwYXRocyBpbnRvIHRyZWUucGF0aHNcbiAgICBPYmplY3QuYXNzaWduKHRyZWUucGF0aHMsIHNpYmxpbmcucGF0aHMpO1xuICB9XG4gIHJldHVybiB0cmVlO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHJvb3QgaGFzaCBhbmQgaGFzaC1wYXRocyBvZiBhIHRhcHRyZWUgZnJvbSB0aGUgZGVwdGgtZmlyc3RcbiAqIGNvbnN0cnVjdGlvbiB1c2VkIGluIEJJUC0wMzcxIFBTQlRzXG4gKiBAcGFyYW0gdHJlZVxuICogQHJldHVybnMge1RhcHRyZWV9IHRoZSB0cmVlLCByZXByZXNlbnRlZCBieSBpdHMgcm9vdCBoYXNoLCBhbmQgdGhlIHBhdGhzIHRvXG4gKiB0aGF0IHJvb3QgZnJvbSBlYWNoIG9mIHRoZSBpbnB1dCBzY3JpcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXB0aEZpcnN0VGFwdHJlZSh0cmVlOiBQc2J0VGFwVHJlZSk6IFRhcHRyZWUge1xuICBjb25zdCBpdGVyID0gdHJlZS5sZWF2ZXMuZW50cmllcygpO1xuICBjb25zdCByZXQgPSByZWN1cnNlVGFwdHJlZShpdGVyKTtcbiAgYXNzZXJ0KGl0ZXIubmV4dCgpLmRvbmUsICdpbnZhbGlkIHRhcCB0cmVlLCBubyBwYXRoIHRvIHNvbWUgbGVhdmVzJyk7XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcm9vdCBoYXNoIG9mIGEgdGFwdHJlZSB1c2luZyBhIHdlaWdodGVkIEh1ZmZtYW4gY29uc3RydWN0aW9uIGZyb20gYVxuICogbGlzdCBvZiBzY3JpcHRzIGFuZCBjb3JyZXNwb25kaW5nIHdlaWdodHMuXG4gKiBAcGFyYW0gc2NyaXB0c1xuICogQHBhcmFtIHdlaWdodHNcbiAqIEByZXR1cm5zIHtUYXB0cmVlfSB0aGUgdHJlZSwgcmVwcmVzZW50ZWQgYnkgaXRzIHJvb3QgaGFzaCwgYW5kIHRoZSBwYXRocyB0byB0aGF0IHJvb3QgZnJvbSBlYWNoIG9mIHRoZSBpbnB1dCBzY3JpcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIdWZmbWFuVGFwdHJlZShzY3JpcHRzOiBCdWZmZXJbXSwgd2VpZ2h0czogQXJyYXk8bnVtYmVyIHwgdW5kZWZpbmVkPik6IFRhcHRyZWUge1xuICBhc3NlcnQoc2NyaXB0cy5sZW5ndGggPiAwLCAnYXQgbGVhc3Qgb25lIHNjcmlwdCBpcyByZXF1aXJlZCB0byBjb25zdHJ1Y3QgYSB0YXAgdHJlZScpO1xuXG4gIC8vIENyZWF0ZSBhIHF1ZXVlL2hlYXAgb2YgdGhlIHByb3ZpZGVkIHNjcmlwdHMgcHJpb3JpdGl6ZWQgYWNjb3JkaW5nIHRvIHRoZWlyXG4gIC8vIGNvcnJlc3BvbmRpbmcgd2VpZ2h0cy5cbiAgY29uc3QgcXVldWUgPSBuZXcgRmFzdFByaW9yaXR5UXVldWU8V2VpZ2h0ZWRUYXBTY3JpcHQ+KChhLCBiKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIGEud2VpZ2h0IDwgYi53ZWlnaHQ7XG4gIH0pO1xuICBzY3JpcHRzLmZvckVhY2goKHNjcmlwdCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB3ZWlnaHQgPSB3ZWlnaHRzW2luZGV4XSB8fCAxO1xuICAgIGFzc2VydCh3ZWlnaHQgPiAwLCAnc2NyaXB0IHdlaWdodCBtdXN0IGJlIGEgcG9zaXRpdmUgdmFsdWUnKTtcblxuICAgIHF1ZXVlLmFkZCh7XG4gICAgICB3ZWlnaHQsXG4gICAgICB0YWdnZWRIYXNoOiBoYXNoVGFwTGVhZihzY3JpcHQpLFxuICAgICAgcGF0aHM6IHsgW2luZGV4XTogW10gfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIHF1ZXVlIG9mIHdlaWdodGVkIHNjcmlwdHMsIHdlIGJlZ2luIGEgbG9vcCB3aGVyZWJ5IHdlXG4gIC8vIHJlbW92ZSB0aGUgdHdvIGxvd2VzdCB3ZWlnaHRlZCBpdGVtcyBmcm9tIHRoZSBxdWV1ZS4gV2UgY3JlYXRlIGEgdGFwIGJyYW5jaFxuICAvLyBub2RlIGZyb20gdGhlIHR3byBpdGVtcywgYW5kIGFkZCB0aGUgYnJhbmNoIGJhY2sgdG8gdGhlIHF1ZXVlIHdpdGggdGhlXG4gIC8vIGNvbWJpbmVkIHdlaWdodCBvZiBib3RoIGl0cyBjaGlsZHJlbi4gRWFjaCBsb29wIHJlZHVjZXMgdGhlIG51bWJlciBvZiBpdGVtc1xuICAvLyBpbiB0aGUgcXVldWUgYnkgb25lLCBhbmQgd2UgcmVwZWF0IHVudGlsIHdlIGFyZSBsZWZ0IHdpdGggb25seSBvbmUgaXRlbSAtXG4gIC8vIHRoaXMgYmVjb21lcyB0aGUgdGFwIHRyZWUgcm9vdC5cbiAgLy9cbiAgLy8gRm9yIGV4YW1wbGUsIGlmIHdlIGJlZ2luIHdpdGggc2NyaXB0cyBBLCBCLCBDLCBEIHdpdGggd2VpZ2h0cyA2LCAzLCAxLCAxXG4gIC8vIEFmdGVyIGZpcnN0IGxvb3A6IEEoNiksIEIoMyksIENEKDEgKyAxKVxuICAvLyBBZnRlciBzZWNvbmQgbG9vcDogQSg2KSwgQltDRF0oMyArIDIpXG4gIC8vIEZpbmFsIGxvb3A6IEFbQltDRF1dKDYrNSlcbiAgLy8gVGhlIGZpbmFsIHRyZWUgd2lsbCBsb29rIGxpa2U6XG4gIC8vXG4gIC8vICAgICAgICBBW0JbQ0RdXVxuICAvLyAgICAgICAvICAgICAgICBcXFxuICAvLyAgICAgIEEgICAgICAgICBCW0NEXVxuICAvLyAgICAgICAgICAgICAgIC8gICAgIFxcXG4gIC8vICAgICAgICAgICAgICBCICAgICAgW0NEXVxuICAvLyAgICAgICAgICAgICAgICAgICAgLyAgICBcXFxuICAvLyAgICAgICAgICAgICAgICAgICBDICAgICAgRFxuICAvL1xuICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgc3BlbmRpbmcgY29uZGl0aW9ucyB3ZSBiZWxpZXZlIHRvIGhhdmUgdGhlIGhpZ2hlc3RcbiAgLy8gcHJvYmFiaWxpdHkgb2YgYmVpbmcgdXNlZCBhcmUgZnVydGhlciB1cCB0aGUgdHJlZSB0aGFuIGxlc3MgbGlrZWx5IHNjcmlwdHMsXG4gIC8vIHRoZXJlYnkgcmVkdWNpbmcgdGhlIHNpemUgb2YgdGhlIG1lcmtsZSBwcm9vZnMgZm9yIHRoZSBtb3JlIGxpa2VseSBzY3JpcHRzLlxuICB3aGlsZSAocXVldWUuc2l6ZSA+IDEpIHtcbiAgICAvLyBXZSBjYW4gc2FmZWx5IGV4cGVjdCB0d28gcG9sbHMgdG8gcmV0dXJuIG5vbi1udWxsIGVsZW1lbnRzIHNpbmNlIHdlJ3ZlXG4gICAgLy8gY2hlY2tlZCB0aGF0IHRoZSBxdWV1ZSBoYXMgYXQgbGVhc3QgdHdvIGVsZW1lbnRzIGJlZm9yZSBsb29waW5nLlxuICAgIGNvbnN0IGNoaWxkMSA9IHF1ZXVlLnBvbGwoKSBhcyBXZWlnaHRlZFRhcFNjcmlwdDtcbiAgICBjb25zdCBjaGlsZDIgPSBxdWV1ZS5wb2xsKCkgYXMgV2VpZ2h0ZWRUYXBTY3JpcHQ7XG5cbiAgICBPYmplY3QudmFsdWVzKGNoaWxkMS5wYXRocykuZm9yRWFjaCgocGF0aCkgPT4gcGF0aC5wdXNoKGNoaWxkMi50YWdnZWRIYXNoKSk7XG4gICAgT2JqZWN0LnZhbHVlcyhjaGlsZDIucGF0aHMpLmZvckVhY2goKHBhdGgpID0+IHBhdGgucHVzaChjaGlsZDEudGFnZ2VkSGFzaCkpO1xuXG4gICAgcXVldWUuYWRkKHtcbiAgICAgIHRhZ2dlZEhhc2g6IGhhc2hUYXBCcmFuY2goY2hpbGQxLnRhZ2dlZEhhc2gsIGNoaWxkMi50YWdnZWRIYXNoKSxcbiAgICAgIHdlaWdodDogY2hpbGQxLndlaWdodCArIGNoaWxkMi53ZWlnaHQsXG4gICAgICBwYXRoczogeyAuLi5jaGlsZDEucGF0aHMsIC4uLmNoaWxkMi5wYXRocyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQWZ0ZXIgdGhlIHdoaWxlIGxvb3AgYWJvdmUgY29tcGxldGVzIHdlIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGVsZW1lbnRcbiAgLy8gcmVtYWluaW5nIGluIHRoZSBxdWV1ZSwgd2hpY2ggd2UgY2FuIHNhZmVseSBleHRyYWN0IGJlbG93LlxuICBjb25zdCByb290Tm9kZSA9IHF1ZXVlLnBvbGwoKSBhcyBXZWlnaHRlZFRhcFNjcmlwdDtcblxuICBjb25zdCBwYXRocyA9IE9iamVjdC5lbnRyaWVzKHJvb3ROb2RlLnBhdGhzKS5yZWR1Y2UoKGFjYywgW2luZGV4LCBwYXRoXSkgPT4ge1xuICAgIGFjY1tOdW1iZXIoaW5kZXgpXSA9IHBhdGg7IC8vIFRPRE86IFdoeSBkb2Vzbid0IFRTIGtub3cgaXQncyBhIG51bWJlcj9cbiAgICByZXR1cm4gYWNjO1xuICB9LCBBcnJheShzY3JpcHRzLmxlbmd0aCkpO1xuICByZXR1cm4geyByb290OiByb290Tm9kZS50YWdnZWRIYXNoLCBwYXRocyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udHJvbEJsb2NrKFxuICBwYXJpdHk6IDAgfCAxLFxuICBwdWJrZXk6IFVpbnQ4QXJyYXksXG4gIHBhdGg6IEJ1ZmZlcltdLFxuICBsZWFmVmVyc2lvbiA9IElOSVRJQUxfVEFQU0NSSVBUX1ZFUlNJT05cbik6IEJ1ZmZlciB7XG4gIGNvbnN0IHBhcml0eVZlcnNpb24gPSBsZWFmVmVyc2lvbiArIHBhcml0eTtcblxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLm9mKHBhcml0eVZlcnNpb24pLCBwdWJrZXksIC4uLnBhdGhdKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLZXlQYXRoV2l0bmVzcyB7XG4gIHNwZW5kVHlwZTogJ0tleSc7XG4gIHNpZ25hdHVyZTogQnVmZmVyO1xuICBhbm5leD86IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JpcHRQYXRoV2l0bmVzcyB7XG4gIHNwZW5kVHlwZTogJ1NjcmlwdCc7XG4gIHNjcmlwdFNpZzogQnVmZmVyW107XG4gIHRhcHNjcmlwdDogQnVmZmVyO1xuICBjb250cm9sQmxvY2s6IEJ1ZmZlcjtcbiAgYW5uZXg/OiBCdWZmZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJvbEJsb2NrIHtcbiAgcGFyaXR5OiBudW1iZXI7XG4gIGludGVybmFsUHVia2V5OiBCdWZmZXI7XG4gIGxlYWZWZXJzaW9uOiBudW1iZXI7XG4gIHBhdGg6IEJ1ZmZlcltdO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIHRhcHJvb3Qgd2l0bmVzcyBzdGFjayBhbmQgZXh0cmFjdHMga2V5IGRhdGEgZWxlbWVudHMuXG4gKiBAcGFyYW0gd2l0bmVzc1N0YWNrXG4gKiBAcmV0dXJucyB7U2NyaXB0UGF0aFdpdG5lc3N8S2V5UGF0aFdpdG5lc3N9IGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlXG4gKiBwYXJzZWQgd2l0bmVzcyBmb3IgYSBzY3JpcHQgcGF0aCBvciBrZXkgcGF0aCBzcGVuZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgd2l0bmVzcyBzdGFjayBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBCSVAgMzQxIHNjcmlwdCB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhcHJvb3RXaXRuZXNzKHdpdG5lc3NTdGFjazogQnVmZmVyW10pOiBTY3JpcHRQYXRoV2l0bmVzcyB8IEtleVBhdGhXaXRuZXNzIHtcbiAgbGV0IGFubmV4O1xuICBpZiAod2l0bmVzc1N0YWNrLmxlbmd0aCA+PSAyICYmIHdpdG5lc3NTdGFja1t3aXRuZXNzU3RhY2subGVuZ3RoIC0gMV1bMF0gPT09IDB4NTApIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIHdpdG5lc3MgZWxlbWVudHMsIGFuZCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbGFzdCBlbGVtZW50IGlzXG4gICAgLy8gMHg1MCwgdGhpcyBsYXN0IGVsZW1lbnQgaXMgY2FsbGVkIGFubmV4IGEgYW5kIGlzIHJlbW92ZWQgZnJvbSB0aGUgd2l0bmVzcyBzdGFja1xuICAgIGFubmV4ID0gd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAxXTtcbiAgICB3aXRuZXNzU3RhY2sgPSB3aXRuZXNzU3RhY2suc2xpY2UoMCwgLTEpO1xuICB9XG5cbiAgaWYgKHdpdG5lc3NTdGFjay5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3aXRuZXNzIHN0YWNrIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudCcpO1xuICB9IGVsc2UgaWYgKHdpdG5lc3NTdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBrZXkgcGF0aCBzcGVuZFxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHdpdG5lc3NTdGFja1swXTtcbiAgICBpZiAoIWJzY3JpcHQuaXNDYW5vbmljYWxTY2hub3JyU2lnbmF0dXJlKHNpZ25hdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduYXR1cmUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3BlbmRUeXBlOiAnS2V5Jywgc2lnbmF0dXJlLCBhbm5leCB9O1xuICB9XG5cbiAgLy8gc2NyaXB0IHBhdGggc3BlbmRcbiAgLy8gc2Vjb25kIHRvIGxhc3QgZWxlbWVudCBpcyB0aGUgdGFwc2NyaXB0XG4gIGNvbnN0IHRhcHNjcmlwdCA9IHdpdG5lc3NTdGFja1t3aXRuZXNzU3RhY2subGVuZ3RoIC0gMl07XG4gIGNvbnN0IHRhcHNjcmlwdENodW5rcyA9IGJzY3JpcHQuZGVjb21waWxlKHRhcHNjcmlwdCk7XG5cbiAgaWYgKCF0YXBzY3JpcHRDaHVua3MgfHwgdGFwc2NyaXB0Q2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFwc2NyaXB0IGlzIG5vdCBhIHZhbGlkIHNjcmlwdCcpO1xuICB9XG5cbiAgLy8gVGhlIGxhc3Qgc3RhY2sgZWxlbWVudCBpcyBjYWxsZWQgdGhlIGNvbnRyb2wgYmxvY2sgYywgYW5kIG11c3QgaGF2ZSBsZW5ndGggMzMgKyAzMm0sXG4gIC8vIGZvciBhIHZhbHVlIG9mIG0gdGhhdCBpcyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTI4LCBpbmNsdXNpdmVcbiAgY29uc3QgY29udHJvbEJsb2NrID0gd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAxXTtcbiAgaWYgKGNvbnRyb2xCbG9jay5sZW5ndGggPCAzMyB8fCBjb250cm9sQmxvY2subGVuZ3RoID4gMzMgKyAzMiAqIDEyOCB8fCBjb250cm9sQmxvY2subGVuZ3RoICUgMzIgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY29udHJvbCBibG9jayBsZW5ndGgnKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3BlbmRUeXBlOiAnU2NyaXB0JyxcbiAgICBzY3JpcHRTaWc6IHdpdG5lc3NTdGFjay5zbGljZSgwLCAtMiksXG4gICAgdGFwc2NyaXB0LFxuICAgIGNvbnRyb2xCbG9jayxcbiAgICBhbm5leCxcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSB0YXByb290IGNvbnRyb2wgYmxvY2suXG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gY29udHJvbEJsb2NrIHRoZSBjb250cm9sIGJsb2NrIHRvIHBhcnNlXG4gKiBAcmV0dXJucyB7Q29udHJvbEJsb2NrfSB0aGUgcGFyc2VkIGNvbnRyb2wgYmxvY2tcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgd2l0bmVzcyBzdGFjayBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBCSVAgMzQxIHNjcmlwdCB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbnRyb2xCbG9jayhlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsIGNvbnRyb2xCbG9jazogQnVmZmVyKTogQ29udHJvbEJsb2NrIHtcbiAgaWYgKChjb250cm9sQmxvY2subGVuZ3RoIC0gMSkgJSAzMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY29udHJvbCBibG9jayBsZW5ndGgnKTtcbiAgfVxuXG4gIGNvbnN0IHBhcml0eSA9IGNvbnRyb2xCbG9ja1swXSAmIDB4MDE7XG5cbiAgLy8gTGV0IHAgPSBjWzE6MzNdIGFuZCBsZXQgUCA9IGxpZnRfeChpbnQocCkpIHdoZXJlIGxpZnRfeCBhbmQgWzpdIGFyZSBkZWZpbmVkIGFzIGluIEJJUDM0MC5cbiAgLy8gRmFpbCBpZiB0aGlzIHBvaW50IGlzIG5vdCBvbiB0aGUgY3VydmVcbiAgY29uc3QgaW50ZXJuYWxQdWJrZXkgPSBjb250cm9sQmxvY2suc2xpY2UoMSwgMzMpO1xuICBpZiAoIWVjYy5pc1hPbmx5UG9pbnQoaW50ZXJuYWxQdWJrZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBwdWJrZXkgaXMgbm90IGFuIEVDIHBvaW50Jyk7XG4gIH1cblxuICAvLyBUaGUgbGVhZiB2ZXJzaW9uIGNhbm5vdCBiZSAweDUwIGFzIHRoYXQgd291bGQgcmVzdWx0IGluIGFtYmlndWl0eSB3aXRoIHRoZSBhbm5leC5cbiAgY29uc3QgbGVhZlZlcnNpb24gPSBjb250cm9sQmxvY2tbMF0gJiAweGZlO1xuICBpZiAobGVhZlZlcnNpb24gPT09IDB4NTApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGVhZiB2ZXJzaW9uJyk7XG4gIH1cblxuICBjb25zdCBwYXRoOiBCdWZmZXJbXSA9IFtdO1xuICBmb3IgKGxldCBqID0gMzM7IGogPCBjb250cm9sQmxvY2subGVuZ3RoOyBqICs9IDMyKSB7XG4gICAgcGF0aC5wdXNoKGNvbnRyb2xCbG9jay5zbGljZShqLCBqICsgMzIpKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFyaXR5LFxuICAgIGludGVybmFsUHVia2V5LFxuICAgIGxlYWZWZXJzaW9uLFxuICAgIHBhdGgsXG4gIH07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgdGFwbGVhZiBoYXNoIGZyb20gYSBjb250cm9sIGJsb2NrIGFuZCBzY3JpcHQuXG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gY29udHJvbEJsb2NrIHRoZSBjb250cm9sIGJsb2NrLCBlaXRoZXIgcmF3IG9yIHBhcnNlZFxuICogQHBhcmFtIHRhcHNjcmlwdCB0aGUgbGVhZiBzY3JpcHQgY29ycmVzZHBvbmRpbmcgdG8gdGhlIGNvbnRyb2wgYmxvY2tcbiAqIEByZXR1cm5zIHtCdWZmZXJ9IHRoZSB0YXBsZWFmIGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcGxlYWZIYXNoKFxuICBlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsXG4gIGNvbnRyb2xCbG9jazogQnVmZmVyIHwgQ29udHJvbEJsb2NrLFxuICB0YXBzY3JpcHQ6IEJ1ZmZlclxuKTogQnVmZmVyIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250cm9sQmxvY2spKSB7XG4gICAgY29udHJvbEJsb2NrID0gcGFyc2VDb250cm9sQmxvY2soZWNjLCBjb250cm9sQmxvY2spO1xuICB9XG4gIGNvbnN0IHsgbGVhZlZlcnNpb24gfSA9IGNvbnRyb2xCbG9jaztcblxuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKFxuICAgICdUYXBMZWFmJyxcbiAgICBCdWZmZXIuY29uY2F0KFtCdWZmZXIub2YobGVhZlZlcnNpb24pLCBzZXJpYWxpemVTY3JpcHRTaXplKHRhcHNjcmlwdCksIHRhcHNjcmlwdF0pXG4gICk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgdGFwdHJlZSByb290IGhhc2ggZnJvbSBhIGNvbnRyb2wgYmxvY2sgYW5kIHNjcmlwdC5cbiAqIEBwYXJhbSBlY2MgRWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBjb250cm9sQmxvY2sgdGhlIGNvbnRyb2wgYmxvY2ssIGVpdGhlciByYXcgb3IgcGFyc2VkXG4gKiBAcGFyYW0gdGFwc2NyaXB0IHRoZSBsZWFmIHNjcmlwdCBjb3JyZXNkcG9uZGluZyB0byB0aGUgY29udHJvbCBibG9ja1xuICogQHBhcmFtIHRhcGxlYWZIYXNoIHRoZSBsZWFmIGhhc2ggaWYgYWxyZWFkeSBjYWxjdWxhdGVkXG4gKiBAcmV0dXJucyB7QnVmZmVyfSB0aGUgdGFwdHJlZSByb290IGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcHRyZWVSb290KFxuICBlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsXG4gIGNvbnRyb2xCbG9jazogQnVmZmVyIHwgQ29udHJvbEJsb2NrLFxuICB0YXBzY3JpcHQ6IEJ1ZmZlcixcbiAgdGFwbGVhZkhhc2g/OiBCdWZmZXJcbik6IEJ1ZmZlciB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY29udHJvbEJsb2NrKSkge1xuICAgIGNvbnRyb2xCbG9jayA9IHBhcnNlQ29udHJvbEJsb2NrKGVjYywgY29udHJvbEJsb2NrKTtcbiAgfVxuICBjb25zdCB7IHBhdGggfSA9IGNvbnRyb2xCbG9jaztcblxuICB0YXBsZWFmSGFzaCA9IHRhcGxlYWZIYXNoIHx8IGdldFRhcGxlYWZIYXNoKGVjYywgY29udHJvbEJsb2NrLCB0YXBzY3JpcHQpO1xuXG4gIC8vIGB0YXB0cmVlTWVya2xlSGFzaGAgYmVnaW5zIGFzIG91ciB0YXBzY3JpcHQgdGFwbGVhZiBoYXNoIGFuZCBpdHMgdmFsdWUgaXRlcmF0ZXNcbiAgLy8gdGhyb3VnaCBpdHMgcGFyZW50IHRhcGJyYW5jaCBoYXNoZXMgdW50aWwgaXQgZW5kcyB1cCBhcyB0aGUgdGFwdHJlZSByb290IGhhc2hcbiAgbGV0IHRhcHRyZWVNZXJrbGVIYXNoID0gdGFwbGVhZkhhc2g7XG4gIGZvciAoY29uc3QgdGFwdHJlZVNpYmxpbmdIYXNoIG9mIHBhdGgpIHtcbiAgICB0YXB0cmVlTWVya2xlSGFzaCA9XG4gICAgICBCdWZmZXIuY29tcGFyZSh0YXB0cmVlTWVya2xlSGFzaCwgdGFwdHJlZVNpYmxpbmdIYXNoKSA9PT0gLTFcbiAgICAgICAgPyBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcEJyYW5jaCcsIEJ1ZmZlci5jb25jYXQoW3RhcHRyZWVNZXJrbGVIYXNoLCB0YXB0cmVlU2libGluZ0hhc2hdKSlcbiAgICAgICAgOiBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcEJyYW5jaCcsIEJ1ZmZlci5jb25jYXQoW3RhcHRyZWVTaWJsaW5nSGFzaCwgdGFwdHJlZU1lcmtsZUhhc2hdKSk7XG4gIH1cblxuICByZXR1cm4gdGFwdHJlZU1lcmtsZUhhc2g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUd2Vha2VkT3V0cHV0S2V5KHBheW1lbnQ6IGJwYXltZW50cy5QYXltZW50KTogQnVmZmVyIHtcbiAgYXNzZXJ0KHBheW1lbnQub3V0cHV0KTtcbiAgaWYgKHBheW1lbnQub3V0cHV0Lmxlbmd0aCA9PT0gMzQpIHtcbiAgICByZXR1cm4gcGF5bWVudC5vdXRwdXQ/LnN1YmFycmF5KDIpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBwMnRyIHR3ZWFrZWQgb3V0cHV0IGtleSBzaXplICR7cGF5bWVudC5vdXRwdXQubGVuZ3RofWApO1xufVxuIl19
@@ -0,0 +1,4 @@
1
+ import * as input from './input';
2
+ import * as output from './output';
3
+ export { input, output };
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.output = exports.input = void 0;
4
+ const input = require("./input");
5
+ exports.input = input;
6
+ const output = require("./output");
7
+ exports.output = output;
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVtcGxhdGVzL211bHRpc2lnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUFpQztBQUd4QixzQkFBSztBQUZkLG1DQUFtQztBQUVuQix3QkFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGlucHV0IGZyb20gJy4vaW5wdXQnO1xuaW1wb3J0ICogYXMgb3V0cHV0IGZyb20gJy4vb3V0cHV0JztcblxuZXhwb3J0IHsgaW5wdXQsIG91dHB1dCB9O1xuIl19
@@ -0,0 +1,7 @@
1
+ /// <reference types="node" />
2
+ import { Stack } from '../../';
3
+ export declare function check(script: Buffer | Stack, allowIncomplete?: boolean): boolean;
4
+ export declare namespace check {
5
+ var toJSON: () => string;
6
+ }
7
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/input.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAQ/B,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAUhF;yBAVe,KAAK"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ // OP_0 [signatures ...]
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.check = void 0;
5
+ const __1 = require("../../");
6
+ const __2 = require("../../");
7
+ function partialSignature(value) {
8
+ return value === __2.opcodes.OP_0 || __1.script.isCanonicalScriptSignature(value);
9
+ }
10
+ function check(script, allowIncomplete) {
11
+ const chunks = __1.script.decompile(script);
12
+ if (chunks.length < 2)
13
+ return false;
14
+ if (chunks[0] !== __2.opcodes.OP_0)
15
+ return false;
16
+ if (allowIncomplete) {
17
+ return chunks.slice(1).every(partialSignature);
18
+ }
19
+ return chunks.slice(1).every(__1.script.isCanonicalScriptSignature);
20
+ }
21
+ exports.check = check;
22
+ check.toJSON = () => {
23
+ return 'multisig input';
24
+ };
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVtcGxhdGVzL211bHRpc2lnL2lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx3QkFBd0I7OztBQUd4Qiw4QkFBMkM7QUFDM0MsOEJBQWlDO0FBRWpDLFNBQVMsZ0JBQWdCLENBQUMsS0FBc0I7SUFDOUMsT0FBTyxLQUFLLEtBQUssV0FBTyxDQUFDLElBQUksSUFBSSxVQUFPLENBQUMsMEJBQTBCLENBQUMsS0FBZSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUVELFNBQWdCLEtBQUssQ0FBQyxNQUFzQixFQUFFLGVBQXlCO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLFVBQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFVLENBQUM7SUFDbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNwQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFPLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRTdDLElBQUksZUFBZSxFQUFFO1FBQ25CLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUNoRDtJQUVELE9BQVEsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQWMsQ0FBQyxLQUFLLENBQUMsVUFBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFDakYsQ0FBQztBQVZELHNCQVVDO0FBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFXLEVBQUU7SUFDMUIsT0FBTyxnQkFBZ0IsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBPUF8wIFtzaWduYXR1cmVzIC4uLl1cblxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHsgb3Bjb2RlcyB9IGZyb20gJy4uLy4uLyc7XG5cbmZ1bmN0aW9uIHBhcnRpYWxTaWduYXR1cmUodmFsdWU6IG51bWJlciB8IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgPT09IG9wY29kZXMuT1BfMCB8fCBic2NyaXB0LmlzQ2Fub25pY2FsU2NyaXB0U2lnbmF0dXJlKHZhbHVlIGFzIEJ1ZmZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVjayhzY3JpcHQ6IEJ1ZmZlciB8IFN0YWNrLCBhbGxvd0luY29tcGxldGU/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNodW5rcyA9IGJzY3JpcHQuZGVjb21waWxlKHNjcmlwdCkgYXMgU3RhY2s7XG4gIGlmIChjaHVua3MubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuICBpZiAoY2h1bmtzWzBdICE9PSBvcGNvZGVzLk9QXzApIHJldHVybiBmYWxzZTtcblxuICBpZiAoYWxsb3dJbmNvbXBsZXRlKSB7XG4gICAgcmV0dXJuIGNodW5rcy5zbGljZSgxKS5ldmVyeShwYXJ0aWFsU2lnbmF0dXJlKTtcbiAgfVxuXG4gIHJldHVybiAoY2h1bmtzLnNsaWNlKDEpIGFzIEJ1ZmZlcltdKS5ldmVyeShic2NyaXB0LmlzQ2Fub25pY2FsU2NyaXB0U2lnbmF0dXJlKTtcbn1cbmNoZWNrLnRvSlNPTiA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gJ211bHRpc2lnIGlucHV0Jztcbn07XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /// <reference types="node" />
2
+ import { Stack } from '../../';
3
+ export declare function check(script: Buffer | Stack, allowIncomplete?: boolean): boolean;
4
+ export declare namespace check {
5
+ var toJSON: () => string;
6
+ }
7
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/output.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAM/B,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAkBhF;yBAlBe,KAAK"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ // m [pubKeys ...] n OP_CHECKMULTISIG
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.check = void 0;
5
+ const __1 = require("../../");
6
+ const __2 = require("../../");
7
+ const types = require("bitcoinjs-lib/src/types");
8
+ const OP_INT_BASE = __2.opcodes.OP_RESERVED; // OP_1 - 1
9
+ function check(script, allowIncomplete) {
10
+ const chunks = __1.script.decompile(script);
11
+ if (chunks.length < 4)
12
+ return false;
13
+ if (chunks[chunks.length - 1] !== __2.opcodes.OP_CHECKMULTISIG)
14
+ return false;
15
+ if (!types.Number(chunks[0]))
16
+ return false;
17
+ if (!types.Number(chunks[chunks.length - 2]))
18
+ return false;
19
+ const m = chunks[0] - OP_INT_BASE;
20
+ const n = chunks[chunks.length - 2] - OP_INT_BASE;
21
+ if (m <= 0)
22
+ return false;
23
+ if (n > 16)
24
+ return false;
25
+ if (m > n)
26
+ return false;
27
+ if (n !== chunks.length - 3)
28
+ return false;
29
+ if (allowIncomplete)
30
+ return true;
31
+ const keys = chunks.slice(1, -2);
32
+ return keys.every(__1.script.isCanonicalPubKey);
33
+ }
34
+ exports.check = check;
35
+ check.toJSON = () => {
36
+ return 'multi-sig output';
37
+ };
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RlbXBsYXRlcy9tdWx0aXNpZy9vdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHFDQUFxQzs7O0FBR3JDLDhCQUEyQztBQUMzQyw4QkFBaUM7QUFDakMsaURBQWlEO0FBQ2pELE1BQU0sV0FBVyxHQUFHLFdBQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXO0FBRXBELFNBQWdCLEtBQUssQ0FBQyxNQUFzQixFQUFFLGVBQXlCO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLFVBQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFVLENBQUM7SUFFbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNwQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLFdBQU8sQ0FBQyxnQkFBZ0I7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzNELE1BQU0sQ0FBQyxHQUFJLE1BQU0sQ0FBQyxDQUFDLENBQVksR0FBRyxXQUFXLENBQUM7SUFDOUMsTUFBTSxDQUFDLEdBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFZLEdBQUcsV0FBVyxDQUFDO0lBRTlELElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFDLElBQUksZUFBZTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWpDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFhLENBQUM7SUFDN0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFsQkQsc0JBa0JDO0FBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFXLEVBQUU7SUFDMUIsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBtIFtwdWJLZXlzIC4uLl0gbiBPUF9DSEVDS01VTFRJU0lHXG5cbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB7IHNjcmlwdCBhcyBic2NyaXB0IH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB7IG9wY29kZXMgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnYml0Y29pbmpzLWxpYi9zcmMvdHlwZXMnO1xuY29uc3QgT1BfSU5UX0JBU0UgPSBvcGNvZGVzLk9QX1JFU0VSVkVEOyAvLyBPUF8xIC0gMVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2soc2NyaXB0OiBCdWZmZXIgfCBTdGFjaywgYWxsb3dJbmNvbXBsZXRlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBjaHVua3MgPSBic2NyaXB0LmRlY29tcGlsZShzY3JpcHQpIGFzIFN0YWNrO1xuXG4gIGlmIChjaHVua3MubGVuZ3RoIDwgNCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoY2h1bmtzW2NodW5rcy5sZW5ndGggLSAxXSAhPT0gb3Bjb2Rlcy5PUF9DSEVDS01VTFRJU0lHKSByZXR1cm4gZmFsc2U7XG4gIGlmICghdHlwZXMuTnVtYmVyKGNodW5rc1swXSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKCF0eXBlcy5OdW1iZXIoY2h1bmtzW2NodW5rcy5sZW5ndGggLSAyXSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbSA9IChjaHVua3NbMF0gYXMgbnVtYmVyKSAtIE9QX0lOVF9CQVNFO1xuICBjb25zdCBuID0gKGNodW5rc1tjaHVua3MubGVuZ3RoIC0gMl0gYXMgbnVtYmVyKSAtIE9QX0lOVF9CQVNFO1xuXG4gIGlmIChtIDw9IDApIHJldHVybiBmYWxzZTtcbiAgaWYgKG4gPiAxNikgcmV0dXJuIGZhbHNlO1xuICBpZiAobSA+IG4pIHJldHVybiBmYWxzZTtcbiAgaWYgKG4gIT09IGNodW5rcy5sZW5ndGggLSAzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChhbGxvd0luY29tcGxldGUpIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IGtleXMgPSBjaHVua3Muc2xpY2UoMSwgLTIpIGFzIEJ1ZmZlcltdO1xuICByZXR1cm4ga2V5cy5ldmVyeShic2NyaXB0LmlzQ2Fub25pY2FsUHViS2V5KTtcbn1cbmNoZWNrLnRvSlNPTiA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gJ211bHRpLXNpZyBvdXRwdXQnO1xufTtcbiJdfQ==
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ export declare function check(script: Buffer | Array<number | Buffer>): boolean;
3
+ export declare namespace check {
4
+ var toJSON: () => string;
5
+ }
6
+ declare const output: {
7
+ check: typeof check;
8
+ };
9
+ export { output };
10
+ //# sourceMappingURL=nulldata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nulldata.d.ts","sourceRoot":"","sources":["../../../src/templates/nulldata.ts"],"names":[],"mappings":";AAIA,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,OAAO,CAItE;yBAJe,KAAK;;;AASrB,QAAA,MAAM,MAAM;;CAAY,CAAC;AAEzB,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.output = exports.check = void 0;
4
+ // OP_RETURN {data}
5
+ const __1 = require("../");
6
+ const __2 = require("../");
7
+ function check(script) {
8
+ const buffer = __1.script.compile(script);
9
+ return buffer.length > 1 && buffer[0] === __2.opcodes.OP_RETURN;
10
+ }
11
+ exports.check = check;
12
+ check.toJSON = () => {
13
+ return 'null data output';
14
+ };
15
+ const output = { check };
16
+ exports.output = output;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVsbGRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVtcGxhdGVzL251bGxkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1CQUFtQjtBQUNuQiwyQkFBd0M7QUFDeEMsMkJBQThCO0FBRTlCLFNBQWdCLEtBQUssQ0FBQyxNQUF1QztJQUMzRCxNQUFNLE1BQU0sR0FBRyxVQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXZDLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQU8sQ0FBQyxTQUFTLENBQUM7QUFDOUQsQ0FBQztBQUpELHNCQUlDO0FBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFXLEVBQUU7SUFDMUIsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDLENBQUM7QUFFRixNQUFNLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBRWhCLHdCQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gT1BfUkVUVVJOIHtkYXRhfVxuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQgfSBmcm9tICcuLi8nO1xuaW1wb3J0IHsgb3Bjb2RlcyB9IGZyb20gJy4uLyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVjayhzY3JpcHQ6IEJ1ZmZlciB8IEFycmF5PG51bWJlciB8IEJ1ZmZlcj4pOiBib29sZWFuIHtcbiAgY29uc3QgYnVmZmVyID0gYnNjcmlwdC5jb21waWxlKHNjcmlwdCk7XG5cbiAgcmV0dXJuIGJ1ZmZlci5sZW5ndGggPiAxICYmIGJ1ZmZlclswXSA9PT0gb3Bjb2Rlcy5PUF9SRVRVUk47XG59XG5jaGVjay50b0pTT04gPSAoKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuICdudWxsIGRhdGEgb3V0cHV0Jztcbn07XG5cbmNvbnN0IG91dHB1dCA9IHsgY2hlY2sgfTtcblxuZXhwb3J0IHsgb3V0cHV0IH07XG4iXX0=
@@ -0,0 +1,4 @@
1
+ import * as input from './input';
2
+ import * as output from './output';
3
+ export { input, output };
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/templates/pubkey/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.output = exports.input = void 0;
4
+ const input = require("./input");
5
+ exports.input = input;
6
+ const output = require("./output");
7
+ exports.output = output;
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVtcGxhdGVzL3B1YmtleS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpQ0FBaUM7QUFHeEIsc0JBQUs7QUFGZCxtQ0FBbUM7QUFFbkIsd0JBQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBpbnB1dCBmcm9tICcuL2lucHV0JztcbmltcG9ydCAqIGFzIG91dHB1dCBmcm9tICcuL291dHB1dCc7XG5cbmV4cG9ydCB7IGlucHV0LCBvdXRwdXQgfTtcbiJdfQ==
@@ -0,0 +1,7 @@
1
+ /// <reference types="node" />
2
+ import { Stack } from '../../';
3
+ export declare function check(script: Buffer | Stack): boolean;
4
+ export declare namespace check {
5
+ var toJSON: () => string;
6
+ }
7
+ //# sourceMappingURL=input.d.ts.map