@bitgo-beta/utxo-lib 8.0.3-beta.182 → 8.0.3-beta.1821
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/address.d.ts +0 -1
- package/dist/src/address.d.ts.map +1 -1
- package/dist/src/address.js +10 -10
- package/dist/src/addressFormat.d.ts +1 -2
- package/dist/src/addressFormat.d.ts.map +1 -1
- package/dist/src/addressFormat.js +21 -26
- package/dist/src/bitgo/Musig2.d.ts +1 -2
- package/dist/src/bitgo/Musig2.d.ts.map +1 -1
- package/dist/src/bitgo/Musig2.js +54 -54
- package/dist/src/bitgo/ProprietaryKeyValUtils.d.ts +27 -0
- package/dist/src/bitgo/ProprietaryKeyValUtils.d.ts.map +1 -0
- package/dist/src/bitgo/ProprietaryKeyValUtils.js +74 -0
- package/dist/src/bitgo/PsbtUtil.d.ts +18 -23
- package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -1
- package/dist/src/bitgo/PsbtUtil.js +63 -24
- package/dist/src/bitgo/Unspent.d.ts +2 -3
- package/dist/src/bitgo/Unspent.d.ts.map +1 -1
- package/dist/src/bitgo/Unspent.js +14 -15
- package/dist/src/bitgo/UtxoPsbt.d.ts +22 -9
- package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoPsbt.js +126 -120
- package/dist/src/bitgo/UtxoTransaction.d.ts +0 -1
- package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoTransaction.js +14 -14
- package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +0 -1
- package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoTransactionBuilder.js +1 -1
- package/dist/src/bitgo/bitcoincash/address.d.ts +0 -1
- package/dist/src/bitgo/bitcoincash/address.d.ts.map +1 -1
- package/dist/src/bitgo/bitcoincash/address.js +11 -12
- package/dist/src/bitgo/bitcoincash/index.js +6 -2
- package/dist/src/bitgo/dash/DashPsbt.d.ts +1 -1
- package/dist/src/bitgo/dash/DashPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/dash/DashPsbt.js +4 -1
- package/dist/src/bitgo/dash/DashTransaction.d.ts +0 -1
- package/dist/src/bitgo/dash/DashTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/dash/DashTransaction.js +3 -3
- package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +0 -1
- package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/dash/DashTransactionBuilder.js +1 -1
- package/dist/src/bitgo/dash/index.js +6 -2
- package/dist/src/bitgo/index.d.ts +3 -1
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +8 -2
- package/dist/src/bitgo/keyutil.d.ts +10 -2
- package/dist/src/bitgo/keyutil.d.ts.map +1 -1
- package/dist/src/bitgo/keyutil.js +27 -6
- package/dist/src/bitgo/legacysafe/index.d.ts +0 -1
- package/dist/src/bitgo/legacysafe/index.d.ts.map +1 -1
- package/dist/src/bitgo/legacysafe/index.js +11 -12
- package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts +1 -1
- package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/litecoin/LitecoinPsbt.js +4 -1
- package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts +1 -2
- package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/litecoin/LitecoinTransaction.js +2 -2
- package/dist/src/bitgo/litecoin/index.js +6 -2
- package/dist/src/bitgo/nonStandardHalfSigned.js +4 -5
- package/dist/src/bitgo/outputScripts.d.ts +11 -8
- package/dist/src/bitgo/outputScripts.d.ts.map +1 -1
- package/dist/src/bitgo/outputScripts.js +47 -44
- package/dist/src/bitgo/parseInput.d.ts +7 -8
- package/dist/src/bitgo/parseInput.d.ts.map +1 -1
- package/dist/src/bitgo/parseInput.js +14 -15
- package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +0 -1
- package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +1 -1
- package/dist/src/bitgo/psbt/fromHalfSigned.js +7 -8
- package/dist/src/bitgo/psbt/scriptTypes.d.ts +0 -1
- package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +1 -1
- package/dist/src/bitgo/psbt/scriptTypes.js +7 -8
- package/dist/src/bitgo/signature.d.ts +3 -4
- package/dist/src/bitgo/signature.d.ts.map +1 -1
- package/dist/src/bitgo/signature.js +22 -23
- package/dist/src/bitgo/tnumber.js +2 -3
- package/dist/src/bitgo/transaction.d.ts +13 -1
- package/dist/src/bitgo/transaction.d.ts.map +1 -1
- package/dist/src/bitgo/transaction.js +53 -23
- package/dist/src/bitgo/transactionAmounts.d.ts +9 -0
- package/dist/src/bitgo/transactionAmounts.d.ts.map +1 -0
- package/dist/src/bitgo/transactionAmounts.js +32 -0
- package/dist/src/bitgo/types.d.ts +8 -2
- package/dist/src/bitgo/types.d.ts.map +1 -1
- package/dist/src/bitgo/types.js +12 -4
- package/dist/src/bitgo/wallet/Psbt.d.ts +37 -21
- package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Psbt.js +88 -58
- package/dist/src/bitgo/wallet/ScriptId.d.ts +14 -0
- package/dist/src/bitgo/wallet/ScriptId.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/ScriptId.js +28 -0
- package/dist/src/bitgo/wallet/Unspent.d.ts +0 -3
- package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Unspent.js +47 -44
- package/dist/src/bitgo/wallet/WalletKeys.d.ts +2 -3
- package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletKeys.js +3 -3
- package/dist/src/bitgo/wallet/WalletOutput.d.ts +62 -8
- package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletOutput.js +160 -63
- package/dist/src/bitgo/wallet/WalletScripts.js +4 -5
- package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts +1 -1
- package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletUnspentSigner.js +7 -7
- package/dist/src/bitgo/wallet/chains.d.ts +2 -2
- package/dist/src/bitgo/wallet/chains.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/chains.js +10 -10
- package/dist/src/bitgo/wallet/index.d.ts +3 -0
- package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/index.js +9 -2
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts +50 -0
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.js +85 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts +32 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.js +122 -0
- package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +1 -2
- package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashBufferutils.js +15 -15
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +4 -5
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.js +24 -15
- package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +7 -2
- package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashTransaction.js +58 -21
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +0 -1
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +10 -4
- package/dist/src/bitgo/zcash/address.d.ts +0 -1
- package/dist/src/bitgo/zcash/address.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/address.js +7 -8
- package/dist/src/bitgo/zcash/hashZip0244.d.ts +1 -2
- package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/hashZip0244.js +9 -10
- package/dist/src/bitgo/zcash/index.js +6 -2
- package/dist/src/classify.d.ts +0 -1
- package/dist/src/classify.d.ts.map +1 -1
- package/dist/src/classify.js +5 -5
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +12 -4
- package/dist/src/networks.d.ts +2 -2
- package/dist/src/networks.d.ts.map +1 -1
- package/dist/src/networks.js +67 -21
- package/dist/src/payments/p2tr.d.ts.map +1 -1
- package/dist/src/payments/p2tr.js +16 -28
- package/dist/src/payments/p2tr_ns.js +3 -5
- package/dist/src/taproot.d.ts +80 -6
- package/dist/src/taproot.d.ts.map +1 -1
- package/dist/src/taproot.js +132 -48
- package/dist/src/templates/multisig/input.d.ts +0 -1
- package/dist/src/templates/multisig/input.d.ts.map +1 -1
- package/dist/src/templates/multisig/input.js +2 -3
- package/dist/src/templates/multisig/output.d.ts +0 -1
- package/dist/src/templates/multisig/output.d.ts.map +1 -1
- package/dist/src/templates/multisig/output.js +2 -3
- package/dist/src/templates/nulldata.d.ts +0 -1
- package/dist/src/templates/nulldata.d.ts.map +1 -1
- package/dist/src/templates/nulldata.js +3 -3
- package/dist/src/templates/pubkey/input.d.ts +0 -1
- package/dist/src/templates/pubkey/input.d.ts.map +1 -1
- package/dist/src/templates/pubkey/input.js +2 -3
- package/dist/src/templates/pubkey/output.d.ts +0 -1
- package/dist/src/templates/pubkey/output.d.ts.map +1 -1
- package/dist/src/templates/pubkey/output.js +2 -3
- package/dist/src/templates/pubkeyhash/input.d.ts +0 -1
- package/dist/src/templates/pubkeyhash/input.d.ts.map +1 -1
- package/dist/src/templates/pubkeyhash/input.js +2 -3
- package/dist/src/templates/pubkeyhash/output.d.ts +0 -1
- package/dist/src/templates/pubkeyhash/output.d.ts.map +1 -1
- package/dist/src/templates/pubkeyhash/output.js +2 -3
- package/dist/src/templates/scripthash/input.d.ts +0 -1
- package/dist/src/templates/scripthash/input.d.ts.map +1 -1
- package/dist/src/templates/scripthash/input.js +2 -3
- package/dist/src/templates/scripthash/output.d.ts +0 -1
- package/dist/src/templates/scripthash/output.d.ts.map +1 -1
- package/dist/src/templates/scripthash/output.js +2 -3
- package/dist/src/templates/taproot/input.d.ts +0 -1
- package/dist/src/templates/taproot/input.d.ts.map +1 -1
- package/dist/src/templates/taproot/input.js +2 -3
- package/dist/src/templates/taproot/output.d.ts +0 -1
- package/dist/src/templates/taproot/output.d.ts.map +1 -1
- package/dist/src/templates/taproot/output.js +2 -3
- package/dist/src/templates/taprootnofn/input.d.ts +0 -1
- package/dist/src/templates/taprootnofn/input.d.ts.map +1 -1
- package/dist/src/templates/taprootnofn/input.js +2 -3
- package/dist/src/templates/taprootnofn/output.d.ts +0 -1
- package/dist/src/templates/taprootnofn/output.d.ts.map +1 -1
- package/dist/src/templates/taprootnofn/output.js +4 -5
- package/dist/src/templates/witnesscommitment/output.d.ts +0 -1
- package/dist/src/templates/witnesscommitment/output.d.ts.map +1 -1
- package/dist/src/templates/witnesscommitment/output.js +4 -5
- package/dist/src/templates/witnesspubkeyhash/input.d.ts +0 -1
- package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +1 -1
- package/dist/src/templates/witnesspubkeyhash/input.js +2 -3
- package/dist/src/templates/witnesspubkeyhash/output.d.ts +0 -1
- package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +1 -1
- package/dist/src/templates/witnesspubkeyhash/output.js +2 -3
- package/dist/src/templates/witnessscripthash/input.d.ts +0 -1
- package/dist/src/templates/witnessscripthash/input.d.ts.map +1 -1
- package/dist/src/templates/witnessscripthash/input.js +2 -3
- package/dist/src/templates/witnessscripthash/output.d.ts +0 -1
- package/dist/src/templates/witnessscripthash/output.d.ts.map +1 -1
- package/dist/src/templates/witnessscripthash/output.js +2 -3
- package/dist/src/testutil/index.js +6 -2
- package/dist/src/testutil/keys.d.ts +6 -6
- package/dist/src/testutil/keys.d.ts.map +1 -1
- package/dist/src/testutil/keys.js +16 -14
- package/dist/src/testutil/mock.d.ts +3 -4
- package/dist/src/testutil/mock.d.ts.map +1 -1
- package/dist/src/testutil/mock.js +33 -31
- package/dist/src/testutil/psbt.d.ts +69 -15
- package/dist/src/testutil/psbt.d.ts.map +1 -1
- package/dist/src/testutil/psbt.js +140 -50
- package/dist/src/testutil/transaction.d.ts +2 -2
- package/dist/src/testutil/transaction.d.ts.map +1 -1
- package/dist/src/testutil/transaction.js +22 -21
- package/dist/src/transaction_builder.d.ts +0 -1
- package/dist/src/transaction_builder.d.ts.map +1 -1
- package/dist/src/transaction_builder.js +27 -32
- package/package.json +9 -16
- package/dist/src/noble_ecc.d.ts +0 -28
- package/dist/src/noble_ecc.d.ts.map +0 -1
- package/dist/src/noble_ecc.js +0 -172
package/dist/src/taproot.js
CHANGED
|
@@ -1,13 +1,60 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
/**
|
|
3
|
+
* This module provides taproot utilities including the legacy MuSig2 key aggregation
|
|
4
|
+
* algorithm used by BitGo's deprecated `p2tr` script type (chains 30, 31).
|
|
5
|
+
*
|
|
6
|
+
* ## Legacy p2tr vs Standard p2trMusig2
|
|
7
|
+
*
|
|
8
|
+
* BitGo supports two taproot address types:
|
|
9
|
+
*
|
|
10
|
+
* 1. **Legacy `p2tr` (chains 30, 31) - DEPRECATED**
|
|
11
|
+
* - Uses the `aggregateMuSigPubkeys()` function in this module
|
|
12
|
+
* - Based on an older MuSig2 variant that predates BIP327
|
|
13
|
+
* - Expects 32-byte x-only pubkeys with even Y coordinates
|
|
14
|
+
* - Sorts keys AFTER x-only conversion
|
|
15
|
+
* - Corresponds to MuSig2 before the 32-byte to 33-byte key change
|
|
16
|
+
* - See: https://github.com/jonasnick/bips/pull/37
|
|
17
|
+
*
|
|
18
|
+
* 2. **Standard `p2trMusig2` (chains 40, 41) - RECOMMENDED**
|
|
19
|
+
* - Uses the `@brandonblack/musig` library (standard BIP327 implementation)
|
|
20
|
+
* - Uses full 33-byte compressed pubkeys throughout aggregation
|
|
21
|
+
* - Key order affects the resulting aggregate key
|
|
22
|
+
* - Fully compatible with the BIP327 specification
|
|
23
|
+
*
|
|
24
|
+
* ## Key Difference
|
|
25
|
+
*
|
|
26
|
+
* The critical difference is **when x-only conversion happens**:
|
|
27
|
+
* - Legacy: Converts to x-only BEFORE sorting (produces order-independent keys)
|
|
28
|
+
* - Standard: Uses 33-byte keys throughout (key order matters)
|
|
29
|
+
*
|
|
30
|
+
* For the same two pubkeys, these methods produce DIFFERENT aggregate keys because
|
|
31
|
+
* the sort order differs between 33-byte and 32-byte representations.
|
|
32
|
+
*
|
|
33
|
+
* See `modules/utxo-lib/bip-0327/README.md` for detailed comparison and test cases.
|
|
34
|
+
*/
|
|
5
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
36
|
+
exports.INITIAL_TAPSCRIPT_VERSION = exports.EVEN_Y_COORD_PREFIX = void 0;
|
|
37
|
+
exports.aggregateMuSigPubkeys = aggregateMuSigPubkeys;
|
|
38
|
+
exports.serializeScriptSize = serializeScriptSize;
|
|
39
|
+
exports.hashTapLeaf = hashTapLeaf;
|
|
40
|
+
exports.hashTapBranch = hashTapBranch;
|
|
41
|
+
exports.calculateTapTweak = calculateTapTweak;
|
|
42
|
+
exports.tapTweakPrivkey = tapTweakPrivkey;
|
|
43
|
+
exports.tapTweakPubkey = tapTweakPubkey;
|
|
44
|
+
exports.getDepthFirstTaptree = getDepthFirstTaptree;
|
|
45
|
+
exports.getHuffmanTaptree = getHuffmanTaptree;
|
|
46
|
+
exports.getControlBlock = getControlBlock;
|
|
47
|
+
exports.parseTaprootWitness = parseTaprootWitness;
|
|
48
|
+
exports.parseControlBlock = parseControlBlock;
|
|
49
|
+
exports.getTapleafHash = getTapleafHash;
|
|
50
|
+
exports.getTaptreeRoot = getTaptreeRoot;
|
|
51
|
+
exports.getTweakedOutputKey = getTweakedOutputKey;
|
|
52
|
+
exports.createTaprootOutputScript = createTaprootOutputScript;
|
|
53
|
+
exports.getTaprootOutputKey = getTaprootOutputKey;
|
|
7
54
|
const assert = require("assert");
|
|
8
55
|
const FastPriorityQueue = require("fastpriorityqueue");
|
|
9
56
|
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
10
|
-
const
|
|
57
|
+
const secp256k1_1 = require("@bitgo-beta/secp256k1");
|
|
11
58
|
const varuint = require('varuint-bitcoin');
|
|
12
59
|
/**
|
|
13
60
|
* The 0x02 prefix indicating an even Y coordinate which is implicitly assumed
|
|
@@ -16,54 +63,108 @@ const varuint = require('varuint-bitcoin');
|
|
|
16
63
|
exports.EVEN_Y_COORD_PREFIX = Buffer.of(0x02);
|
|
17
64
|
exports.INITIAL_TAPSCRIPT_VERSION = 0xc0;
|
|
18
65
|
/**
|
|
19
|
-
* Aggregates a list of public keys into a single
|
|
20
|
-
*
|
|
66
|
+
* Aggregates a list of public keys into a single public key using the legacy MuSig2 algorithm.
|
|
67
|
+
*
|
|
68
|
+
* This implements the deprecated key aggregation method used by BitGo's `p2tr` script type
|
|
69
|
+
* (chains 30, 31). It corresponds to an older variant of MuSig2 that predates the change
|
|
70
|
+
* from 32-byte to 33-byte keys in the BIP327 specification.
|
|
71
|
+
*
|
|
72
|
+
* ## Algorithm
|
|
73
|
+
*
|
|
74
|
+
* The implementation follows the MuSig2 key aggregation scheme:
|
|
75
|
+
*
|
|
76
|
+
* ```
|
|
77
|
+
* P = sum_i (μ_i * P_i)
|
|
78
|
+
* ```
|
|
79
|
+
*
|
|
80
|
+
* where:
|
|
81
|
+
* - `P_i` is the public key of the i-th signer
|
|
82
|
+
* - `μ_i` is the MuSig coefficient computed as:
|
|
83
|
+
* - `L = TaggedHash("KeyAgg list", P_1 || P_2 || ... || P_n)`
|
|
84
|
+
* - `μ_i = TaggedHash("KeyAgg coefficient", L || P_i)` for most keys
|
|
85
|
+
* - `μ_i = 1` for the second unique key (optimization to save an exponentiation)
|
|
86
|
+
*
|
|
87
|
+
* ## Key Characteristics (Legacy Variant)
|
|
88
|
+
*
|
|
89
|
+
* 1. **X-only pubkeys**: Expects 32-byte x-only pubkeys (assumes even Y coordinates)
|
|
90
|
+
* 2. **Pre-aggregation sorting**: Sorts keys in ascending order BEFORE aggregation
|
|
91
|
+
* 3. **Order-independent**: Due to sorting, key order doesn't affect the result
|
|
92
|
+
* 4. **33-byte internal representation**: Internally prepends 0x02 prefix for elliptic curve operations
|
|
93
|
+
*
|
|
94
|
+
* ## Differences from Standard MuSig2 (BIP327)
|
|
95
|
+
*
|
|
96
|
+
* The standard MuSig2 implementation (`@brandonblack/musig` library):
|
|
97
|
+
* - Uses 33-byte compressed pubkeys throughout
|
|
98
|
+
* - Does NOT sort keys before aggregation (key order matters)
|
|
99
|
+
* - Produces different aggregate keys even for the same set of pubkeys
|
|
100
|
+
*
|
|
101
|
+
* ## Reference Implementation
|
|
102
|
+
*
|
|
103
|
+
* This corresponds to `key_agg_bitgo_p2tr_legacy()` in the Python reference implementation
|
|
104
|
+
* at `modules/utxo-lib/bip-0327/reference.py`.
|
|
105
|
+
*
|
|
21
106
|
* @param ecc Elliptic curve implementation
|
|
22
|
-
* @param pubkeys
|
|
23
|
-
* @returns
|
|
107
|
+
* @param pubkeys List of 32-byte x-only public keys to aggregate (must have even Y coordinates)
|
|
108
|
+
* @returns 32-byte Buffer representing the x-only aggregate public key
|
|
109
|
+
* @throws {Error} if fewer than 2 pubkeys provided or elliptic curve operations fail
|
|
110
|
+
*
|
|
111
|
+
* @see modules/utxo-lib/bip-0327/README.md for detailed comparison with standard MuSig2
|
|
112
|
+
* @see https://github.com/jonasnick/bips/pull/37 for the MuSig2 specification change
|
|
24
113
|
*/
|
|
25
114
|
function aggregateMuSigPubkeys(ecc, pubkeys) {
|
|
26
115
|
// TODO: Consider enforcing key uniqueness.
|
|
27
116
|
assert(pubkeys.length > 1, 'at least two pubkeys are required for musig key aggregation');
|
|
28
|
-
// Sort the keys in ascending order
|
|
117
|
+
// LEGACY BEHAVIOR: Sort the keys in ascending order BEFORE aggregation.
|
|
118
|
+
// This makes the aggregate key independent of input order.
|
|
119
|
+
// Standard MuSig2 (BIP327) does NOT sort, making key order significant.
|
|
29
120
|
pubkeys.sort(Buffer.compare);
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
// P = sum_i µ_i * P_i
|
|
34
|
-
//
|
|
35
|
-
// where `P_i` is the public key of the `i`th signer and `µ_i` is a so-called
|
|
36
|
-
// _MuSig coefficient_ computed according to the following equation
|
|
37
|
-
//
|
|
38
|
-
// L = H(P_1 || P_2 || ... || P_n)
|
|
39
|
-
// µ_i = H(L || P_i)
|
|
121
|
+
// Compute the "KeyAgg list" hash L = TaggedHash("KeyAgg list", P_1 || P_2 || ... || P_n)
|
|
122
|
+
// This hash is used to derive the MuSig coefficients for each pubkey.
|
|
123
|
+
// In the reference implementation (reference.py), this is done in hash_keys().
|
|
40
124
|
const L = bitcoinjs_lib_1.crypto.taggedHash('KeyAgg list', Buffer.concat(pubkeys));
|
|
125
|
+
// Find the second unique pubkey in the sorted list.
|
|
126
|
+
// This key (and any keys identical to it) will use coefficient μ = 1 as an optimization.
|
|
127
|
+
// This saves an expensive point multiplication (see MuSig2* appendix in the MuSig2 paper).
|
|
128
|
+
// In the reference implementation, this is get_second_key().
|
|
41
129
|
const secondUniquePubkey = pubkeys.find((pubkey) => !pubkeys[0].equals(pubkey));
|
|
130
|
+
// For each pubkey P_i, compute the tweaked pubkey μ_i * P_i
|
|
131
|
+
// where μ_i is the MuSig coefficient for that key.
|
|
42
132
|
const tweakedPubkeys = pubkeys.map((pubkey) => {
|
|
133
|
+
// Convert 32-byte x-only pubkey to 33-byte compressed format by prepending 0x02.
|
|
134
|
+
// This assumes an even Y coordinate (standard for x-only pubkeys in taproot).
|
|
135
|
+
// In the reference implementation, this is done implicitly in key_agg() via lift_x().
|
|
43
136
|
const xyPubkey = Buffer.concat([exports.EVEN_Y_COORD_PREFIX, pubkey]);
|
|
44
137
|
if (secondUniquePubkey !== undefined && secondUniquePubkey.equals(pubkey)) {
|
|
45
|
-
// The second unique key
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
// in
|
|
138
|
+
// Optimization: The second unique key gets coefficient μ = 1.
|
|
139
|
+
// This means μ_i * P_i = 1 * P_i = P_i (no multiplication needed).
|
|
140
|
+
// This saves an expensive elliptic curve point multiplication operation.
|
|
141
|
+
// See key_agg_coeff_internal() in reference.py where it returns 1 for pk_ == pk2.
|
|
49
142
|
return xyPubkey;
|
|
50
143
|
}
|
|
144
|
+
// Compute the MuSig coefficient: μ_i = TaggedHash("KeyAgg coefficient", L || P_i)
|
|
145
|
+
// In the reference implementation, this is key_agg_coeff_internal().
|
|
51
146
|
const c = bitcoinjs_lib_1.crypto.taggedHash('KeyAgg coefficient', Buffer.concat([L, pubkey]));
|
|
147
|
+
// Compute the tweaked pubkey: μ_i * P_i (elliptic curve point multiplication)
|
|
52
148
|
const tweakedPubkey = ecc.pointMultiply(xyPubkey, c);
|
|
53
149
|
if (!tweakedPubkey) {
|
|
54
150
|
throw new Error('Failed to multiply pubkey by coefficient');
|
|
55
151
|
}
|
|
56
152
|
return tweakedPubkey;
|
|
57
153
|
});
|
|
154
|
+
// Sum all the tweaked pubkeys to get the aggregate pubkey:
|
|
155
|
+
// P = sum_i (μ_i * P_i) = μ_1*P_1 + μ_2*P_2 + ... + μ_n*P_n
|
|
156
|
+
// This is elliptic curve point addition.
|
|
58
157
|
const aggregatePubkey = tweakedPubkeys.reduce((prev, curr) => {
|
|
59
158
|
const next = ecc.pointAdd(prev, curr);
|
|
60
159
|
if (!next)
|
|
61
160
|
throw new Error('Failed to sum pubkeys');
|
|
62
161
|
return next;
|
|
63
162
|
});
|
|
163
|
+
// Convert the aggregate pubkey from 33-byte compressed format back to 32-byte x-only format
|
|
164
|
+
// by removing the first byte (the Y coordinate prefix).
|
|
165
|
+
// In the reference implementation, this is done by get_xonly_pk() which calls xbytes().
|
|
64
166
|
return aggregatePubkey.slice(1);
|
|
65
167
|
}
|
|
66
|
-
exports.aggregateMuSigPubkeys = aggregateMuSigPubkeys;
|
|
67
168
|
/**
|
|
68
169
|
* Encodes the length of a script as a bitcoin variable length integer.
|
|
69
170
|
* @param script
|
|
@@ -72,7 +173,6 @@ exports.aggregateMuSigPubkeys = aggregateMuSigPubkeys;
|
|
|
72
173
|
function serializeScriptSize(script) {
|
|
73
174
|
return varuint.encode(script.length);
|
|
74
175
|
}
|
|
75
|
-
exports.serializeScriptSize = serializeScriptSize;
|
|
76
176
|
/**
|
|
77
177
|
* Gets a tapleaf tagged hash from a script.
|
|
78
178
|
* @param script
|
|
@@ -82,7 +182,6 @@ function hashTapLeaf(script, leafVersion = exports.INITIAL_TAPSCRIPT_VERSION) {
|
|
|
82
182
|
const size = serializeScriptSize(script);
|
|
83
183
|
return bitcoinjs_lib_1.crypto.taggedHash('TapLeaf', Buffer.concat([Buffer.of(leafVersion), size, script]));
|
|
84
184
|
}
|
|
85
|
-
exports.hashTapLeaf = hashTapLeaf;
|
|
86
185
|
/**
|
|
87
186
|
* Creates a lexicographically sorted tapbranch from two child taptree nodes
|
|
88
187
|
* and returns its tagged hash.
|
|
@@ -95,7 +194,6 @@ function hashTapBranch(child1, child2) {
|
|
|
95
194
|
const sortedChildren = [child1, child2].sort(Buffer.compare);
|
|
96
195
|
return bitcoinjs_lib_1.crypto.taggedHash('TapBranch', Buffer.concat(sortedChildren));
|
|
97
196
|
}
|
|
98
|
-
exports.hashTapBranch = hashTapBranch;
|
|
99
197
|
function calculateTapTweak(pubkey, taptreeRoot) {
|
|
100
198
|
if (pubkey.length !== 32) {
|
|
101
199
|
throw new Error(`Invalid pubkey size ${pubkey.length}.`);
|
|
@@ -111,7 +209,6 @@ function calculateTapTweak(pubkey, taptreeRoot) {
|
|
|
111
209
|
// https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki#cite_note-22
|
|
112
210
|
return bitcoinjs_lib_1.crypto.taggedHash('TapTweak', Buffer.from(pubkey));
|
|
113
211
|
}
|
|
114
|
-
exports.calculateTapTweak = calculateTapTweak;
|
|
115
212
|
/**
|
|
116
213
|
* Tweaks a privkey, using the tagged hash of its pubkey, and (optionally) a taptree root
|
|
117
214
|
* @param ecc Elliptic curve implementation
|
|
@@ -132,7 +229,6 @@ function tapTweakPrivkey(ecc, pubkey, privkey, taptreeRoot) {
|
|
|
132
229
|
throw new Error('Invalid private key');
|
|
133
230
|
return result;
|
|
134
231
|
}
|
|
135
|
-
exports.tapTweakPrivkey = tapTweakPrivkey;
|
|
136
232
|
/**
|
|
137
233
|
* Tweaks an internal pubkey, using the tagged hash of itself, and (optionally) a taptree root
|
|
138
234
|
* @param ecc Elliptic curve implementation
|
|
@@ -147,7 +243,6 @@ function tapTweakPubkey(ecc, pubkey, taptreeRoot) {
|
|
|
147
243
|
throw new Error('Invalid pubkey');
|
|
148
244
|
return result;
|
|
149
245
|
}
|
|
150
|
-
exports.tapTweakPubkey = tapTweakPubkey;
|
|
151
246
|
function recurseTaptree(leaves, targetDepth = 0) {
|
|
152
247
|
const { value, done } = leaves.next();
|
|
153
248
|
assert(!done, 'insufficient leaves to reconstruct tap tree');
|
|
@@ -180,7 +275,6 @@ function getDepthFirstTaptree(tree) {
|
|
|
180
275
|
assert(iter.next().done, 'invalid tap tree, no path to some leaves');
|
|
181
276
|
return ret;
|
|
182
277
|
}
|
|
183
|
-
exports.getDepthFirstTaptree = getDepthFirstTaptree;
|
|
184
278
|
/**
|
|
185
279
|
* Gets the root hash of a taptree using a weighted Huffman construction from a
|
|
186
280
|
* list of scripts and corresponding weights.
|
|
@@ -250,12 +344,10 @@ function getHuffmanTaptree(scripts, weights) {
|
|
|
250
344
|
}, Array(scripts.length));
|
|
251
345
|
return { root: rootNode.taggedHash, paths };
|
|
252
346
|
}
|
|
253
|
-
exports.getHuffmanTaptree = getHuffmanTaptree;
|
|
254
347
|
function getControlBlock(parity, pubkey, path, leafVersion = exports.INITIAL_TAPSCRIPT_VERSION) {
|
|
255
348
|
const parityVersion = leafVersion + parity;
|
|
256
349
|
return Buffer.concat([Buffer.of(parityVersion), pubkey, ...path]);
|
|
257
350
|
}
|
|
258
|
-
exports.getControlBlock = getControlBlock;
|
|
259
351
|
/**
|
|
260
352
|
* Parses a taproot witness stack and extracts key data elements.
|
|
261
353
|
* @param witnessStack
|
|
@@ -303,7 +395,6 @@ function parseTaprootWitness(witnessStack) {
|
|
|
303
395
|
annex,
|
|
304
396
|
};
|
|
305
397
|
}
|
|
306
|
-
exports.parseTaprootWitness = parseTaprootWitness;
|
|
307
398
|
/**
|
|
308
399
|
* Parses a taproot control block.
|
|
309
400
|
* @param ecc Elliptic curve implementation
|
|
@@ -338,7 +429,6 @@ function parseControlBlock(ecc, controlBlock) {
|
|
|
338
429
|
path,
|
|
339
430
|
};
|
|
340
431
|
}
|
|
341
|
-
exports.parseControlBlock = parseControlBlock;
|
|
342
432
|
/**
|
|
343
433
|
* Calculates the tapleaf hash from a control block and script.
|
|
344
434
|
* @param ecc Elliptic curve implementation
|
|
@@ -353,7 +443,6 @@ function getTapleafHash(ecc, controlBlock, tapscript) {
|
|
|
353
443
|
const { leafVersion } = controlBlock;
|
|
354
444
|
return bitcoinjs_lib_1.crypto.taggedHash('TapLeaf', Buffer.concat([Buffer.of(leafVersion), serializeScriptSize(tapscript), tapscript]));
|
|
355
445
|
}
|
|
356
|
-
exports.getTapleafHash = getTapleafHash;
|
|
357
446
|
/**
|
|
358
447
|
* Calculates the taptree root hash from a control block and script.
|
|
359
448
|
* @param ecc Elliptic curve implementation
|
|
@@ -379,16 +468,13 @@ function getTaptreeRoot(ecc, controlBlock, tapscript, tapleafHash) {
|
|
|
379
468
|
}
|
|
380
469
|
return taptreeMerkleHash;
|
|
381
470
|
}
|
|
382
|
-
exports.getTaptreeRoot = getTaptreeRoot;
|
|
383
471
|
function getTweakedOutputKey(payment) {
|
|
384
|
-
var _a;
|
|
385
472
|
assert(payment.output);
|
|
386
473
|
if (payment.output.length === 34) {
|
|
387
|
-
return
|
|
474
|
+
return payment.output?.subarray(2);
|
|
388
475
|
}
|
|
389
476
|
throw new Error(`invalid p2tr tweaked output key size ${payment.output.length}`);
|
|
390
477
|
}
|
|
391
|
-
exports.getTweakedOutputKey = getTweakedOutputKey;
|
|
392
478
|
/**
|
|
393
479
|
* @returns output script for either script path input controlBlock
|
|
394
480
|
* & leafScript OR key path input internalPubKey & taptreeRoot
|
|
@@ -401,19 +487,18 @@ function createTaprootOutputScript(p2trArgs) {
|
|
|
401
487
|
taptreeRoot = p2trArgs.taptreeRoot;
|
|
402
488
|
}
|
|
403
489
|
else {
|
|
404
|
-
internalPubKey = parseControlBlock(
|
|
405
|
-
taptreeRoot = getTaptreeRoot(
|
|
490
|
+
internalPubKey = parseControlBlock(secp256k1_1.ecc, p2trArgs.controlBlock).internalPubkey;
|
|
491
|
+
taptreeRoot = getTaptreeRoot(secp256k1_1.ecc, p2trArgs.controlBlock, p2trArgs.leafScript);
|
|
406
492
|
}
|
|
407
|
-
const outputKey = tapTweakPubkey(
|
|
493
|
+
const outputKey = tapTweakPubkey(secp256k1_1.ecc, internalPubKey, taptreeRoot).xOnlyPubkey;
|
|
408
494
|
return bitcoinjs_lib_1.script.compile([bitcoinjs_lib_1.script.OPS.OP_1, Buffer.from(outputKey)]);
|
|
409
495
|
}
|
|
410
|
-
exports.createTaprootOutputScript = createTaprootOutputScript;
|
|
411
496
|
/**
|
|
412
497
|
* @returns x-only taproot output key (tapOutputKey)
|
|
413
498
|
*/
|
|
414
499
|
function getTaprootOutputKey(outputScript) {
|
|
415
500
|
const outputDecompiled = bitcoinjs_lib_1.script.decompile(outputScript);
|
|
416
|
-
if (
|
|
501
|
+
if (outputDecompiled?.length !== 2) {
|
|
417
502
|
throw new Error('invalid taproot output script');
|
|
418
503
|
}
|
|
419
504
|
const [op1, outputKey] = outputDecompiled;
|
|
@@ -422,5 +507,4 @@ function getTaprootOutputKey(outputScript) {
|
|
|
422
507
|
}
|
|
423
508
|
return outputKey;
|
|
424
509
|
}
|
|
425
|
-
exports.getTaprootOutputKey = getTaprootOutputKey;
|
|
426
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwcm9vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXByb290LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvRUFBb0U7QUFDcEUsaUVBQWlFO0FBQ2pFLGlFQUFpRTs7O0FBR2pFLGlDQUFrQztBQUNsQyx1REFBd0Q7QUFDeEQsaURBQTRGO0FBQzVGLDJDQUE0QztBQUM1QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUUzQzs7O0dBR0c7QUFDVSxRQUFBLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEMsUUFBQSx5QkFBeUIsR0FBRyxJQUFJLENBQUM7QUFZOUM7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsR0FBMkIsRUFBRSxPQUFpQjtJQUNsRiwyQ0FBMkM7SUFDM0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLDZEQUE2RCxDQUFDLENBQUM7SUFFMUYsbUNBQW1DO0lBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTdCLHdFQUF3RTtJQUN4RSxxQkFBcUI7SUFDckIsRUFBRTtJQUNGLDBCQUEwQjtJQUMxQixFQUFFO0lBQ0YsNkVBQTZFO0lBQzdFLG1FQUFtRTtJQUNuRSxFQUFFO0lBQ0Ysa0NBQWtDO0lBQ2xDLG9CQUFvQjtJQUVwQixNQUFNLENBQUMsR0FBRyxzQkFBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRXBFLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFaEYsTUFBTSxj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QUFnQixDQUFDO0lBQzFDLElBQUksR0FBRyxLQUFLLHNCQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7UUFDdEYsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0tBQ2xEO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQVZELGtEQVVDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGFwcm9vdC1zcGVjaWZpYyBrZXkgYWdncmVnYXRpb24gYW5kIHRhcHRyZWUgbG9naWMgYXMgZGVmaW5lZCBpbjpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzNDAubWVkaWF3aWtpXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzQxLm1lZGlhd2lraVxuXG5pbXBvcnQgeyBUYXBUcmVlIGFzIFBzYnRUYXBUcmVlLCBUYXBMZWFmIGFzIFBzYnRUYXBMZWFmIH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5pbXBvcnQgRmFzdFByaW9yaXR5UXVldWUgPSByZXF1aXJlKCdmYXN0cHJpb3JpdHlxdWV1ZScpO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQsIGNyeXB0byBhcyBiY3J5cHRvLCBwYXltZW50cyBhcyBicGF5bWVudHMgfSBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCB7IGVjYyBhcyBlY2NMaWIgfSBmcm9tICcuL25vYmxlX2VjYyc7XG5jb25zdCB2YXJ1aW50ID0gcmVxdWlyZSgndmFydWludC1iaXRjb2luJyk7XG5cbi8qKlxuICogVGhlIDB4MDIgcHJlZml4IGluZGljYXRpbmcgYW4gZXZlbiBZIGNvb3JkaW5hdGUgd2hpY2ggaXMgaW1wbGljaXRseSBhc3N1bWVkXG4gKiBvbiBhbGwgMzIgYnl0ZSB4LW9ubHkgcHViIGtleXMgYXMgZGVmaW5lZCBpbiBCSVAzNDAuXG4gKi9cbmV4cG9ydCBjb25zdCBFVkVOX1lfQ09PUkRfUFJFRklYID0gQnVmZmVyLm9mKDB4MDIpO1xuZXhwb3J0IGNvbnN0IElOSVRJQUxfVEFQU0NSSVBUX1ZFUlNJT04gPSAweGMwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbnlTZWNwMjU2azFJbnRlcmZhY2Uge1xuICBpc1hPbmx5UG9pbnQocDogVWludDhBcnJheSk6IGJvb2xlYW47XG4gIHhPbmx5UG9pbnRBZGRUd2VhayhwOiBVaW50OEFycmF5LCB0d2VhazogVWludDhBcnJheSk6IFhPbmx5UG9pbnRBZGRUd2Vha1Jlc3VsdCB8IG51bGw7XG4gIHBvaW50RnJvbVNjYWxhcihzazogVWludDhBcnJheSwgY29tcHJlc3NlZD86IGJvb2xlYW4pOiBVaW50OEFycmF5IHwgbnVsbDtcbiAgcG9pbnRNdWx0aXBseShhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5KTogVWludDhBcnJheSB8IG51bGw7XG4gIHBvaW50QWRkKGE6IFVpbnQ4QXJyYXksIGI6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHwgbnVsbDtcbiAgcHJpdmF0ZUFkZChkOiBVaW50OEFycmF5LCB0d2VhazogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgfCBudWxsO1xuICBwcml2YXRlTmVnYXRlKGQ6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5O1xufVxuXG4vKipcbiAqIEFnZ3JlZ2F0ZXMgYSBsaXN0IG9mIHB1YmxpYyBrZXlzIGludG8gYSBzaW5nbGUgTXVTaWcyKiBwdWJsaWMga2V5XG4gKiBhY2NvcmRpbmcgdG8gdGhlIE11U2lnMiBwYXBlci5cbiAqIEBwYXJhbSBlY2MgRWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBwdWJrZXlzIFRoZSBsaXN0IG9mIHB1YiBrZXlzIHRvIGFnZ3JlZ2F0ZVxuICogQHJldHVybnMgYSAzMiBieXRlIEJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIGFnZ3JlZ2F0ZSBrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0ZU11U2lnUHVia2V5cyhlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsIHB1YmtleXM6IEJ1ZmZlcltdKTogVWludDhBcnJheSB7XG4gIC8vIFRPRE86IENvbnNpZGVyIGVuZm9yY2luZyBrZXkgdW5pcXVlbmVzcy5cbiAgYXNzZXJ0KHB1YmtleXMubGVuZ3RoID4gMSwgJ2F0IGxlYXN0IHR3byBwdWJrZXlzIGFyZSByZXF1aXJlZCBmb3IgbXVzaWcga2V5IGFnZ3JlZ2F0aW9uJyk7XG5cbiAgLy8gU29ydCB0aGUga2V5cyBpbiBhc2NlbmRpbmcgb3JkZXJcbiAgcHVia2V5cy5zb3J0KEJ1ZmZlci5jb21wYXJlKTtcblxuICAvLyBJbiBNdVNpZyBhbGwgc2lnbmVycyBjb250cmlidXRlIGtleSBtYXRlcmlhbCB0byBhIHNpbmdsZSBzaWduaW5nIGtleSxcbiAgLy8gdXNpbmcgdGhlIGVxdWF0aW9uXG4gIC8vXG4gIC8vICAgICBQID0gc3VtX2kgwrVfaSAqIFBfaVxuICAvL1xuICAvLyB3aGVyZSBgUF9pYCBpcyB0aGUgcHVibGljIGtleSBvZiB0aGUgYGlgdGggc2lnbmVyIGFuZCBgwrVfaWAgaXMgYSBzby1jYWxsZWRcbiAgLy8gX011U2lnIGNvZWZmaWNpZW50XyBjb21wdXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBlcXVhdGlvblxuICAvL1xuICAvLyBMID0gSChQXzEgfHwgUF8yIHx8IC4uLiB8fCBQX24pXG4gIC8vIMK1X2kgPSBIKEwgfHwgUF9pKVxuXG4gIGNvbnN0IEwgPSBiY3J5cHRvLnRhZ2dlZEhhc2goJ0tleUFnZyBsaXN0JywgQnVmZmVyLmNvbmNhdChwdWJrZXlzKSk7XG5cbiAgY29uc3Qgc2Vjb25kVW5pcXVlUHVia2V5ID0gcHVia2V5cy5maW5kKChwdWJrZXkpID0+ICFwdWJrZXlzWzBdLmVxdWFscyhwdWJrZXkpKTtcblxuICBjb25zdCB0d2Vha2VkUHVia2V5czogVWludDhBcnJheVtdID0gcHVia2V5cy5tYXAoKHB1YmtleSkgPT4ge1xuICAgIGNvbnN0IHh5UHVia2V5ID0gQnVmZmVyLmNvbmNhdChbRVZFTl9ZX0NPT1JEX1BSRUZJWCwgcHVia2V5XSk7XG5cbiAgICBpZiAoc2Vjb25kVW5pcXVlUHVia2V5ICE9PSB1bmRlZmluZWQgJiYgc2Vjb25kVW5pcXVlUHVia2V5LmVxdWFscyhwdWJrZXkpKSB7XG4gICAgICAvLyBUaGUgc2Vjb25kIHVuaXF1ZSBrZXkgaW4gdGhlIHB1YmtleSBsaXN0IGdpdmVuIHRvICcnS2V5QWdnJycgKGFzIHdlbGxcbiAgICAgIC8vIGFzIGFueSBrZXlzIGlkZW50aWNhbCB0byB0aGlzIGtleSkgZ2V0cyB0aGUgY29uc3RhbnQgS2V5QWdnXG4gICAgICAvLyBjb2VmZmljaWVudCAxIHdoaWNoIHNhdmVzIGFuIGV4cG9uZW50aWF0aW9uIChzZWUgdGhlIE11U2lnMiogYXBwZW5kaXhcbiAgICAgIC8vIGluIHRoZSBNdVNpZzIgcGFwZXIpLlxuICAgICAgcmV0dXJuIHh5UHVia2V5O1xuICAgIH1cblxuICAgIGNvbnN0IGMgPSBiY3J5cHRvLnRhZ2dlZEhhc2goJ0tleUFnZyBjb2VmZmljaWVudCcsIEJ1ZmZlci5jb25jYXQoW0wsIHB1YmtleV0pKTtcblxuICAgIGNvbnN0IHR3ZWFrZWRQdWJrZXkgPSBlY2MucG9pbnRNdWx0aXBseSh4eVB1YmtleSwgYyk7XG4gICAgaWYgKCF0d2Vha2VkUHVia2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBtdWx0aXBseSBwdWJrZXkgYnkgY29lZmZpY2llbnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHR3ZWFrZWRQdWJrZXk7XG4gIH0pO1xuICBjb25zdCBhZ2dyZWdhdGVQdWJrZXkgPSB0d2Vha2VkUHVia2V5cy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICBjb25zdCBuZXh0ID0gZWNjLnBvaW50QWRkKHByZXYsIGN1cnIpO1xuICAgIGlmICghbmV4dCkgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc3VtIHB1YmtleXMnKTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfSk7XG5cbiAgcmV0dXJuIGFnZ3JlZ2F0ZVB1YmtleS5zbGljZSgxKTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIHRoZSBsZW5ndGggb2YgYSBzY3JpcHQgYXMgYSBiaXRjb2luIHZhcmlhYmxlIGxlbmd0aCBpbnRlZ2VyLlxuICogQHBhcmFtIHNjcmlwdFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVNjcmlwdFNpemUoc2NyaXB0OiBCdWZmZXIpOiBCdWZmZXIge1xuICByZXR1cm4gdmFydWludC5lbmNvZGUoc2NyaXB0Lmxlbmd0aCk7XG59XG5cbi8qKlxuICogR2V0cyBhIHRhcGxlYWYgdGFnZ2VkIGhhc2ggZnJvbSBhIHNjcmlwdC5cbiAqIEBwYXJhbSBzY3JpcHRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoVGFwTGVhZihzY3JpcHQ6IEJ1ZmZlciwgbGVhZlZlcnNpb24gPSBJTklUSUFMX1RBUFNDUklQVF9WRVJTSU9OKTogQnVmZmVyIHtcbiAgY29uc3Qgc2l6ZSA9IHNlcmlhbGl6ZVNjcmlwdFNpemUoc2NyaXB0KTtcbiAgcmV0dXJuIGJjcnlwdG8udGFnZ2VkSGFzaCgnVGFwTGVhZicsIEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5vZihsZWFmVmVyc2lvbiksIHNpemUsIHNjcmlwdF0pKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGV4aWNvZ3JhcGhpY2FsbHkgc29ydGVkIHRhcGJyYW5jaCBmcm9tIHR3byBjaGlsZCB0YXB0cmVlIG5vZGVzXG4gKiBhbmQgcmV0dXJucyBpdHMgdGFnZ2VkIGhhc2guXG4gKiBAcGFyYW0gY2hpbGQxXG4gKiBAcGFyYW0gY2hpbGQyXG4gKiBAcmV0dXJucyB0aGUgdGFnZ2VkIHRhcGJyYW5jaCBoYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoVGFwQnJhbmNoKGNoaWxkMTogQnVmZmVyLCBjaGlsZDI6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gIC8vIHNvcnQgdGhlIGNoaWxkcmVuIGxleGljb2dyYXBoaWNhbGx5XG4gIGNvbnN0IHNvcnRlZENoaWxkcmVuID0gW2NoaWxkMSwgY2hpbGQyXS5zb3J0KEJ1ZmZlci5jb21wYXJlKTtcblxuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKCdUYXBCcmFuY2gnLCBCdWZmZXIuY29uY2F0KHNvcnRlZENoaWxkcmVuKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVUYXBUd2VhayhwdWJrZXk6IFVpbnQ4QXJyYXksIHRhcHRyZWVSb290PzogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICBpZiAocHVia2V5Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHVia2V5IHNpemUgJHtwdWJrZXkubGVuZ3RofS5gKTtcbiAgfVxuICBpZiAodGFwdHJlZVJvb3QpIHtcbiAgICBpZiAodGFwdHJlZVJvb3QubGVuZ3RoICE9PSAzMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRhcHRyZWVSb290IHNpemUgJHt0YXB0cmVlUm9vdC5sZW5ndGh9LmApO1xuICAgIH1cbiAgICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKCdUYXBUd2VhaycsIEJ1ZmZlci5jb25jYXQoW3B1YmtleSwgdGFwdHJlZVJvb3RdKSk7XG4gIH1cbiAgLy8gSWYgdGhlIHNwZW5kaW5nIGNvbmRpdGlvbnMgZG8gbm90IHJlcXVpcmUgYSBzY3JpcHQgcGF0aCwgdGhlIG91dHB1dCBrZXkgc2hvdWxkIGNvbW1pdCB0byBhblxuICAvLyB1bnNwZW5kYWJsZSBzY3JpcHQgcGF0aCBpbnN0ZWFkIG9mIGhhdmluZyBubyBzY3JpcHQgcGF0aC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDM0MS5tZWRpYXdpa2kjY2l0ZV9ub3RlLTIyXG4gIHJldHVybiBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcFR3ZWFrJywgQnVmZmVyLmZyb20ocHVia2V5KSk7XG59XG5cbi8qKlxuICogVHdlYWtzIGEgcHJpdmtleSwgdXNpbmcgdGhlIHRhZ2dlZCBoYXNoIG9mIGl0cyBwdWJrZXksIGFuZCAob3B0aW9uYWxseSkgYSB0YXB0cmVlIHJvb3RcbiAqIEBwYXJhbSBlY2MgRWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBwdWJrZXkgcHVibGljIGtleSwgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHR3ZWFrXG4gKiBAcGFyYW0gcHJpdmtleSB0aGUgcHJpdmtleSB0byB0d2Vha1xuICogQHBhcmFtIHRhcHRyZWVSb290IHRoZSB0YXB0cmVlIHJvb3QgdGFnZ2VkIGhhc2hcbiAqIEByZXR1cm5zIHtCdWZmZXJ9IHRoZSB0d2Vha2VkIHByaXZrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhcFR3ZWFrUHJpdmtleShcbiAgZWNjOiBUaW55U2VjcDI1NmsxSW50ZXJmYWNlLFxuICBwdWJrZXk6IFVpbnQ4QXJyYXksXG4gIHByaXZrZXk6IFVpbnQ4QXJyYXksXG4gIHRhcHRyZWVSb290PzogVWludDhBcnJheVxuKTogVWludDhBcnJheSB7XG4gIGNvbnN0IHRhcFR3ZWFrID0gY2FsY3VsYXRlVGFwVHdlYWsocHVia2V5LCB0YXB0cmVlUm9vdCk7XG5cbiAgY29uc3QgcG9pbnQgPSBlY2MucG9pbnRGcm9tU2NhbGFyKHByaXZrZXkpO1xuICBpZiAoIXBvaW50KSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcHJpdmF0ZSBrZXknKTtcbiAgaWYgKHBvaW50WzBdICUgMiA9PT0gMSkgcHJpdmtleSA9IGVjYy5wcml2YXRlTmVnYXRlKHByaXZrZXkpO1xuICBjb25zdCByZXN1bHQgPSBlY2MucHJpdmF0ZUFkZChwcml2a2V5LCB0YXBUd2Vhayk7XG4gIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcHJpdmF0ZSBrZXknKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBYT25seVBvaW50QWRkVHdlYWtSZXN1bHQge1xuICBwYXJpdHk6IDEgfCAwO1xuICB4T25seVB1YmtleTogVWludDhBcnJheTtcbn1cblxuLyoqXG4gKiBUd2Vha3MgYW4gaW50ZXJuYWwgcHVia2V5LCB1c2luZyB0aGUgdGFnZ2VkIGhhc2ggb2YgaXRzZWxmLCBhbmQgKG9wdGlvbmFsbHkpIGEgdGFwdHJlZSByb290XG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gcHVia2V5IHRoZSBpbnRlcm5hbCBwdWJrZXkgdG8gdHdlYWtcbiAqIEBwYXJhbSB0YXB0cmVlUm9vdCB0aGUgdGFwdHJlZSByb290IHRhZ2dlZCBoYXNoXG4gKiBAcmV0dXJucyB7VHdlYWtlZFB1YmtleX0gdGhlIHR3ZWFrZWQgcHVia2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YXBUd2Vha1B1YmtleShcbiAgZWNjOiBUaW55U2VjcDI1NmsxSW50ZXJmYWNlLFxuICBwdWJrZXk6IFVpbnQ4QXJyYXksXG4gIHRhcHRyZWVSb290PzogQnVmZmVyXG4pOiBYT25seVBvaW50QWRkVHdlYWtSZXN1bHQge1xuICBjb25zdCB0YXBUd2VhayA9IGNhbGN1bGF0ZVRhcFR3ZWFrKHB1YmtleSwgdGFwdHJlZVJvb3QpO1xuICBjb25zdCByZXN1bHQgPSBlY2MueE9ubHlQb2ludEFkZFR3ZWFrKHB1YmtleSwgdGFwVHdlYWspO1xuICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHB1YmtleScpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcHRyZWUge1xuICByb290OiBCdWZmZXI7XG4gIHBhdGhzOiBCdWZmZXJbXVtdO1xufVxuXG5pbnRlcmZhY2UgV2VpZ2h0ZWRUYXBTY3JpcHQge1xuICAvKiogQSBUYXBMZWFmIG9yIFRhcEJyYW5jaCB0YWdnZWQgaGFzaCAqL1xuICB0YWdnZWRIYXNoOiBCdWZmZXI7XG4gIHdlaWdodDogbnVtYmVyO1xuICBwYXRoczoge1xuICAgIFtpbmRleDogbnVtYmVyXTogQnVmZmVyW107XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2VUYXB0cmVlKGxlYXZlczogSXRlcmF0b3I8W251bWJlciwgUHNidFRhcExlYWZdPiwgdGFyZ2V0RGVwdGggPSAwKTogVGFwdHJlZSB7XG4gIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGxlYXZlcy5uZXh0KCk7XG4gIGFzc2VydCghZG9uZSwgJ2luc3VmZmljaWVudCBsZWF2ZXMgdG8gcmVjb25zdHJ1Y3QgdGFwIHRyZWUnKTtcbiAgY29uc3QgW2luZGV4LCBsZWFmXSA9IHZhbHVlO1xuICBjb25zdCB0cmVlOiBUYXB0cmVlID0ge1xuICAgIHJvb3Q6IGhhc2hUYXBMZWFmKGxlYWYuc2NyaXB0LCBsZWFmLmxlYWZWZXJzaW9uKSxcbiAgICBwYXRoczogW10sXG4gIH07XG4gIHRyZWUucGF0aHNbaW5kZXhdID0gW107XG4gIGZvciAobGV0IGRlcHRoID0gbGVhZi5kZXB0aDsgZGVwdGggPiB0YXJnZXREZXB0aDsgZGVwdGgtLSkge1xuICAgIGNvbnN0IHNpYmxpbmcgPSByZWN1cnNlVGFwdHJlZShsZWF2ZXMsIGRlcHRoKTtcbiAgICB0cmVlLnBhdGhzLmZvckVhY2goKHBhdGgpID0+IHBhdGgucHVzaChzaWJsaW5nLnJvb3QpKTtcbiAgICBzaWJsaW5nLnBhdGhzLmZvckVhY2goKHBhdGgpID0+IHBhdGgucHVzaCh0cmVlLnJvb3QpKTtcbiAgICB0cmVlLnJvb3QgPSBoYXNoVGFwQnJhbmNoKHRyZWUucm9vdCwgc2libGluZy5yb290KTtcbiAgICAvLyBNZXJnZSBkaXNqb2ludCBzcGFyc2UgYXJyYXlzIG9mIHBhdGhzIGludG8gdHJlZS5wYXRoc1xuICAgIE9iamVjdC5hc3NpZ24odHJlZS5wYXRocywgc2libGluZy5wYXRocyk7XG4gIH1cbiAgcmV0dXJuIHRyZWU7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcm9vdCBoYXNoIGFuZCBoYXNoLXBhdGhzIG9mIGEgdGFwdHJlZSBmcm9tIHRoZSBkZXB0aC1maXJzdFxuICogY29uc3RydWN0aW9uIHVzZWQgaW4gQklQLTAzNzEgUFNCVHNcbiAqIEBwYXJhbSB0cmVlXG4gKiBAcmV0dXJucyB7VGFwdHJlZX0gdGhlIHRyZWUsIHJlcHJlc2VudGVkIGJ5IGl0cyByb290IGhhc2gsIGFuZCB0aGUgcGF0aHMgdG9cbiAqIHRoYXQgcm9vdCBmcm9tIGVhY2ggb2YgdGhlIGlucHV0IHNjcmlwdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlcHRoRmlyc3RUYXB0cmVlKHRyZWU6IFBzYnRUYXBUcmVlKTogVGFwdHJlZSB7XG4gIGNvbnN0IGl0ZXIgPSB0cmVlLmxlYXZlcy5lbnRyaWVzKCk7XG4gIGNvbnN0IHJldCA9IHJlY3Vyc2VUYXB0cmVlKGl0ZXIpO1xuICBhc3NlcnQoaXRlci5uZXh0KCkuZG9uZSwgJ2ludmFsaWQgdGFwIHRyZWUsIG5vIHBhdGggdG8gc29tZSBsZWF2ZXMnKTtcbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSByb290IGhhc2ggb2YgYSB0YXB0cmVlIHVzaW5nIGEgd2VpZ2h0ZWQgSHVmZm1hbiBjb25zdHJ1Y3Rpb24gZnJvbSBhXG4gKiBsaXN0IG9mIHNjcmlwdHMgYW5kIGNvcnJlc3BvbmRpbmcgd2VpZ2h0cy5cbiAqIEBwYXJhbSBzY3JpcHRzXG4gKiBAcGFyYW0gd2VpZ2h0c1xuICogQHJldHVybnMge1RhcHRyZWV9IHRoZSB0cmVlLCByZXByZXNlbnRlZCBieSBpdHMgcm9vdCBoYXNoLCBhbmQgdGhlIHBhdGhzIHRvIHRoYXQgcm9vdCBmcm9tIGVhY2ggb2YgdGhlIGlucHV0IHNjcmlwdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEh1ZmZtYW5UYXB0cmVlKHNjcmlwdHM6IEJ1ZmZlcltdLCB3ZWlnaHRzOiBBcnJheTxudW1iZXIgfCB1bmRlZmluZWQ+KTogVGFwdHJlZSB7XG4gIGFzc2VydChzY3JpcHRzLmxlbmd0aCA+IDAsICdhdCBsZWFzdCBvbmUgc2NyaXB0IGlzIHJlcXVpcmVkIHRvIGNvbnN0cnVjdCBhIHRhcCB0cmVlJyk7XG5cbiAgLy8gQ3JlYXRlIGEgcXVldWUvaGVhcCBvZiB0aGUgcHJvdmlkZWQgc2NyaXB0cyBwcmlvcml0aXplZCBhY2NvcmRpbmcgdG8gdGhlaXJcbiAgLy8gY29ycmVzcG9uZGluZyB3ZWlnaHRzLlxuICBjb25zdCBxdWV1ZSA9IG5ldyBGYXN0UHJpb3JpdHlRdWV1ZTxXZWlnaHRlZFRhcFNjcmlwdD4oKGEsIGIpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gYS53ZWlnaHQgPCBiLndlaWdodDtcbiAgfSk7XG4gIHNjcmlwdHMuZm9yRWFjaCgoc2NyaXB0LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHdlaWdodCA9IHdlaWdodHNbaW5kZXhdIHx8IDE7XG4gICAgYXNzZXJ0KHdlaWdodCA+IDAsICdzY3JpcHQgd2VpZ2h0IG11c3QgYmUgYSBwb3NpdGl2ZSB2YWx1ZScpO1xuXG4gICAgcXVldWUuYWRkKHtcbiAgICAgIHdlaWdodCxcbiAgICAgIHRhZ2dlZEhhc2g6IGhhc2hUYXBMZWFmKHNjcmlwdCksXG4gICAgICBwYXRoczogeyBbaW5kZXhdOiBbXSB9LFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgcXVldWUgb2Ygd2VpZ2h0ZWQgc2NyaXB0cywgd2UgYmVnaW4gYSBsb29wIHdoZXJlYnkgd2VcbiAgLy8gcmVtb3ZlIHRoZSB0d28gbG93ZXN0IHdlaWdodGVkIGl0ZW1zIGZyb20gdGhlIHF1ZXVlLiBXZSBjcmVhdGUgYSB0YXAgYnJhbmNoXG4gIC8vIG5vZGUgZnJvbSB0aGUgdHdvIGl0ZW1zLCBhbmQgYWRkIHRoZSBicmFuY2ggYmFjayB0byB0aGUgcXVldWUgd2l0aCB0aGVcbiAgLy8gY29tYmluZWQgd2VpZ2h0IG9mIGJvdGggaXRzIGNoaWxkcmVuLiBFYWNoIGxvb3AgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGl0ZW1zXG4gIC8vIGluIHRoZSBxdWV1ZSBieSBvbmUsIGFuZCB3ZSByZXBlYXQgdW50aWwgd2UgYXJlIGxlZnQgd2l0aCBvbmx5IG9uZSBpdGVtIC1cbiAgLy8gdGhpcyBiZWNvbWVzIHRoZSB0YXAgdHJlZSByb290LlxuICAvL1xuICAvLyBGb3IgZXhhbXBsZSwgaWYgd2UgYmVnaW4gd2l0aCBzY3JpcHRzIEEsIEIsIEMsIEQgd2l0aCB3ZWlnaHRzIDYsIDMsIDEsIDFcbiAgLy8gQWZ0ZXIgZmlyc3QgbG9vcDogQSg2KSwgQigzKSwgQ0QoMSArIDEpXG4gIC8vIEFmdGVyIHNlY29uZCBsb29wOiBBKDYpLCBCW0NEXSgzICsgMilcbiAgLy8gRmluYWwgbG9vcDogQVtCW0NEXV0oNis1KVxuICAvLyBUaGUgZmluYWwgdHJlZSB3aWxsIGxvb2sgbGlrZTpcbiAgLy9cbiAgLy8gICAgICAgIEFbQltDRF1dXG4gIC8vICAgICAgIC8gICAgICAgIFxcXG4gIC8vICAgICAgQSAgICAgICAgIEJbQ0RdXG4gIC8vICAgICAgICAgICAgICAgLyAgICAgXFxcbiAgLy8gICAgICAgICAgICAgIEIgICAgICBbQ0RdXG4gIC8vICAgICAgICAgICAgICAgICAgICAvICAgIFxcXG4gIC8vICAgICAgICAgICAgICAgICAgIEMgICAgICBEXG4gIC8vXG4gIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBzcGVuZGluZyBjb25kaXRpb25zIHdlIGJlbGlldmUgdG8gaGF2ZSB0aGUgaGlnaGVzdFxuICAvLyBwcm9iYWJpbGl0eSBvZiBiZWluZyB1c2VkIGFyZSBmdXJ0aGVyIHVwIHRoZSB0cmVlIHRoYW4gbGVzcyBsaWtlbHkgc2NyaXB0cyxcbiAgLy8gdGhlcmVieSByZWR1Y2luZyB0aGUgc2l6ZSBvZiB0aGUgbWVya2xlIHByb29mcyBmb3IgdGhlIG1vcmUgbGlrZWx5IHNjcmlwdHMuXG4gIHdoaWxlIChxdWV1ZS5zaXplID4gMSkge1xuICAgIC8vIFdlIGNhbiBzYWZlbHkgZXhwZWN0IHR3byBwb2xscyB0byByZXR1cm4gbm9uLW51bGwgZWxlbWVudHMgc2luY2Ugd2UndmVcbiAgICAvLyBjaGVja2VkIHRoYXQgdGhlIHF1ZXVlIGhhcyBhdCBsZWFzdCB0d28gZWxlbWVudHMgYmVmb3JlIGxvb3BpbmcuXG4gICAgY29uc3QgY2hpbGQxID0gcXVldWUucG9sbCgpIGFzIFdlaWdodGVkVGFwU2NyaXB0O1xuICAgIGNvbnN0IGNoaWxkMiA9IHF1ZXVlLnBvbGwoKSBhcyBXZWlnaHRlZFRhcFNjcmlwdDtcblxuICAgIE9iamVjdC52YWx1ZXMoY2hpbGQxLnBhdGhzKS5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnB1c2goY2hpbGQyLnRhZ2dlZEhhc2gpKTtcbiAgICBPYmplY3QudmFsdWVzKGNoaWxkMi5wYXRocykuZm9yRWFjaCgocGF0aCkgPT4gcGF0aC5wdXNoKGNoaWxkMS50YWdnZWRIYXNoKSk7XG5cbiAgICBxdWV1ZS5hZGQoe1xuICAgICAgdGFnZ2VkSGFzaDogaGFzaFRhcEJyYW5jaChjaGlsZDEudGFnZ2VkSGFzaCwgY2hpbGQyLnRhZ2dlZEhhc2gpLFxuICAgICAgd2VpZ2h0OiBjaGlsZDEud2VpZ2h0ICsgY2hpbGQyLndlaWdodCxcbiAgICAgIHBhdGhzOiB7IC4uLmNoaWxkMS5wYXRocywgLi4uY2hpbGQyLnBhdGhzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyBBZnRlciB0aGUgd2hpbGUgbG9vcCBhYm92ZSBjb21wbGV0ZXMgd2Ugc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgZWxlbWVudFxuICAvLyByZW1haW5pbmcgaW4gdGhlIHF1ZXVlLCB3aGljaCB3ZSBjYW4gc2FmZWx5IGV4dHJhY3QgYmVsb3cuXG4gIGNvbnN0IHJvb3ROb2RlID0gcXVldWUucG9sbCgpIGFzIFdlaWdodGVkVGFwU2NyaXB0O1xuXG4gIGNvbnN0IHBhdGhzID0gT2JqZWN0LmVudHJpZXMocm9vdE5vZGUucGF0aHMpLnJlZHVjZSgoYWNjLCBbaW5kZXgsIHBhdGhdKSA9PiB7XG4gICAgYWNjW051bWJlcihpbmRleCldID0gcGF0aDsgLy8gVE9ETzogV2h5IGRvZXNuJ3QgVFMga25vdyBpdCdzIGEgbnVtYmVyP1xuICAgIHJldHVybiBhY2M7XG4gIH0sIEFycmF5KHNjcmlwdHMubGVuZ3RoKSk7XG4gIHJldHVybiB7IHJvb3Q6IHJvb3ROb2RlLnRhZ2dlZEhhc2gsIHBhdGhzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sQmxvY2soXG4gIHBhcml0eTogMCB8IDEsXG4gIHB1YmtleTogVWludDhBcnJheSxcbiAgcGF0aDogQnVmZmVyW10sXG4gIGxlYWZWZXJzaW9uID0gSU5JVElBTF9UQVBTQ1JJUFRfVkVSU0lPTlxuKTogQnVmZmVyIHtcbiAgY29uc3QgcGFyaXR5VmVyc2lvbiA9IGxlYWZWZXJzaW9uICsgcGFyaXR5O1xuXG4gIHJldHVybiBCdWZmZXIuY29uY2F0KFtCdWZmZXIub2YocGFyaXR5VmVyc2lvbiksIHB1YmtleSwgLi4ucGF0aF0pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtleVBhdGhXaXRuZXNzIHtcbiAgc3BlbmRUeXBlOiAnS2V5JztcbiAgc2lnbmF0dXJlOiBCdWZmZXI7XG4gIGFubmV4PzogQnVmZmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcmlwdFBhdGhXaXRuZXNzIHtcbiAgc3BlbmRUeXBlOiAnU2NyaXB0JztcbiAgc2NyaXB0U2lnOiBCdWZmZXJbXTtcbiAgdGFwc2NyaXB0OiBCdWZmZXI7XG4gIGNvbnRyb2xCbG9jazogQnVmZmVyO1xuICBhbm5leD86IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250cm9sQmxvY2sge1xuICBwYXJpdHk6IG51bWJlcjtcbiAgaW50ZXJuYWxQdWJrZXk6IEJ1ZmZlcjtcbiAgbGVhZlZlcnNpb246IG51bWJlcjtcbiAgcGF0aDogQnVmZmVyW107XG59XG5cbi8qKlxuICogUGFyc2VzIGEgdGFwcm9vdCB3aXRuZXNzIHN0YWNrIGFuZCBleHRyYWN0cyBrZXkgZGF0YSBlbGVtZW50cy5cbiAqIEBwYXJhbSB3aXRuZXNzU3RhY2tcbiAqIEByZXR1cm5zIHtTY3JpcHRQYXRoV2l0bmVzc3xLZXlQYXRoV2l0bmVzc30gYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGVcbiAqIHBhcnNlZCB3aXRuZXNzIGZvciBhIHNjcmlwdCBwYXRoIG9yIGtleSBwYXRoIHNwZW5kLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSB3aXRuZXNzIHN0YWNrIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIEJJUCAzNDEgc2NyaXB0IHZhbGlkYXRpb24gcnVsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGFwcm9vdFdpdG5lc3Mod2l0bmVzc1N0YWNrOiBCdWZmZXJbXSk6IFNjcmlwdFBhdGhXaXRuZXNzIHwgS2V5UGF0aFdpdG5lc3Mge1xuICBsZXQgYW5uZXg7XG4gIGlmICh3aXRuZXNzU3RhY2subGVuZ3RoID49IDIgJiYgd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAxXVswXSA9PT0gMHg1MCkge1xuICAgIC8vIElmIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gd2l0bmVzcyBlbGVtZW50cywgYW5kIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBsYXN0IGVsZW1lbnQgaXNcbiAgICAvLyAweDUwLCB0aGlzIGxhc3QgZWxlbWVudCBpcyBjYWxsZWQgYW5uZXggYSBhbmQgaXMgcmVtb3ZlZCBmcm9tIHRoZSB3aXRuZXNzIHN0YWNrXG4gICAgYW5uZXggPSB3aXRuZXNzU3RhY2tbd2l0bmVzc1N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIHdpdG5lc3NTdGFjayA9IHdpdG5lc3NTdGFjay5zbGljZSgwLCAtMSk7XG4gIH1cblxuICBpZiAod2l0bmVzc1N0YWNrLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3dpdG5lc3Mgc3RhY2sgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50Jyk7XG4gIH0gZWxzZSBpZiAod2l0bmVzc1N0YWNrLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIGtleSBwYXRoIHNwZW5kXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gd2l0bmVzc1N0YWNrWzBdO1xuICAgIGlmICghYnNjcmlwdC5pc0Nhbm9uaWNhbFNjaG5vcnJTaWduYXR1cmUoc2lnbmF0dXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZScpO1xuICAgIH1cbiAgICByZXR1cm4geyBzcGVuZFR5cGU6ICdLZXknLCBzaWduYXR1cmUsIGFubmV4IH07XG4gIH1cblxuICAvLyBzY3JpcHQgcGF0aCBzcGVuZFxuICAvLyBzZWNvbmQgdG8gbGFzdCBlbGVtZW50IGlzIHRoZSB0YXBzY3JpcHRcbiAgY29uc3QgdGFwc2NyaXB0ID0gd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAyXTtcbiAgY29uc3QgdGFwc2NyaXB0Q2h1bmtzID0gYnNjcmlwdC5kZWNvbXBpbGUodGFwc2NyaXB0KTtcblxuICBpZiAoIXRhcHNjcmlwdENodW5rcyB8fCB0YXBzY3JpcHRDaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXBzY3JpcHQgaXMgbm90IGEgdmFsaWQgc2NyaXB0Jyk7XG4gIH1cblxuICAvLyBUaGUgbGFzdCBzdGFjayBlbGVtZW50IGlzIGNhbGxlZCB0aGUgY29udHJvbCBibG9jayBjLCBhbmQgbXVzdCBoYXZlIGxlbmd0aCAzMyArIDMybSxcbiAgLy8gZm9yIGEgdmFsdWUgb2YgbSB0aGF0IGlzIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAxMjgsIGluY2x1c2l2ZVxuICBjb25zdCBjb250cm9sQmxvY2sgPSB3aXRuZXNzU3RhY2tbd2l0bmVzc1N0YWNrLmxlbmd0aCAtIDFdO1xuICBpZiAoY29udHJvbEJsb2NrLmxlbmd0aCA8IDMzIHx8IGNvbnRyb2xCbG9jay5sZW5ndGggPiAzMyArIDMyICogMTI4IHx8IGNvbnRyb2xCbG9jay5sZW5ndGggJSAzMiAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjb250cm9sIGJsb2NrIGxlbmd0aCcpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzcGVuZFR5cGU6ICdTY3JpcHQnLFxuICAgIHNjcmlwdFNpZzogd2l0bmVzc1N0YWNrLnNsaWNlKDAsIC0yKSxcbiAgICB0YXBzY3JpcHQsXG4gICAgY29udHJvbEJsb2NrLFxuICAgIGFubmV4LFxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIHRhcHJvb3QgY29udHJvbCBibG9jay5cbiAqIEBwYXJhbSBlY2MgRWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBjb250cm9sQmxvY2sgdGhlIGNvbnRyb2wgYmxvY2sgdG8gcGFyc2VcbiAqIEByZXR1cm5zIHtDb250cm9sQmxvY2t9IHRoZSBwYXJzZWQgY29udHJvbCBibG9ja1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSB3aXRuZXNzIHN0YWNrIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIEJJUCAzNDEgc2NyaXB0IHZhbGlkYXRpb24gcnVsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29udHJvbEJsb2NrKGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSwgY29udHJvbEJsb2NrOiBCdWZmZXIpOiBDb250cm9sQmxvY2sge1xuICBpZiAoKGNvbnRyb2xCbG9jay5sZW5ndGggLSAxKSAlIDMyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjb250cm9sIGJsb2NrIGxlbmd0aCcpO1xuICB9XG5cbiAgY29uc3QgcGFyaXR5ID0gY29udHJvbEJsb2NrWzBdICYgMHgwMTtcblxuICAvLyBMZXQgcCA9IGNbMTozM10gYW5kIGxldCBQID0gbGlmdF94KGludChwKSkgd2hlcmUgbGlmdF94IGFuZCBbOl0gYXJlIGRlZmluZWQgYXMgaW4gQklQMzQwLlxuICAvLyBGYWlsIGlmIHRoaXMgcG9pbnQgaXMgbm90IG9uIHRoZSBjdXJ2ZVxuICBjb25zdCBpbnRlcm5hbFB1YmtleSA9IGNvbnRyb2xCbG9jay5zbGljZSgxLCAzMyk7XG4gIGlmICghZWNjLmlzWE9ubHlQb2ludChpbnRlcm5hbFB1YmtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludGVybmFsIHB1YmtleSBpcyBub3QgYW4gRUMgcG9pbnQnKTtcbiAgfVxuXG4gIC8vIFRoZSBsZWFmIHZlcnNpb24gY2Fubm90IGJlIDB4NTAgYXMgdGhhdCB3b3VsZCByZXN1bHQgaW4gYW1iaWd1aXR5IHdpdGggdGhlIGFubmV4LlxuICBjb25zdCBsZWFmVmVyc2lvbiA9IGNvbnRyb2xCbG9ja1swXSAmIDB4ZmU7XG4gIGlmIChsZWFmVmVyc2lvbiA9PT0gMHg1MCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsZWFmIHZlcnNpb24nKTtcbiAgfVxuXG4gIGNvbnN0IHBhdGg6IEJ1ZmZlcltdID0gW107XG4gIGZvciAobGV0IGogPSAzMzsgaiA8IGNvbnRyb2xCbG9jay5sZW5ndGg7IGogKz0gMzIpIHtcbiAgICBwYXRoLnB1c2goY29udHJvbEJsb2NrLnNsaWNlKGosIGogKyAzMikpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJpdHksXG4gICAgaW50ZXJuYWxQdWJrZXksXG4gICAgbGVhZlZlcnNpb24sXG4gICAgcGF0aCxcbiAgfTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSB0YXBsZWFmIGhhc2ggZnJvbSBhIGNvbnRyb2wgYmxvY2sgYW5kIHNjcmlwdC5cbiAqIEBwYXJhbSBlY2MgRWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBjb250cm9sQmxvY2sgdGhlIGNvbnRyb2wgYmxvY2ssIGVpdGhlciByYXcgb3IgcGFyc2VkXG4gKiBAcGFyYW0gdGFwc2NyaXB0IHRoZSBsZWFmIHNjcmlwdCBjb3JyZXNkcG9uZGluZyB0byB0aGUgY29udHJvbCBibG9ja1xuICogQHJldHVybnMge0J1ZmZlcn0gdGhlIHRhcGxlYWYgaGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFwbGVhZkhhc2goXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgY29udHJvbEJsb2NrOiBCdWZmZXIgfCBDb250cm9sQmxvY2ssXG4gIHRhcHNjcmlwdDogQnVmZmVyXG4pOiBCdWZmZXIge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNvbnRyb2xCbG9jaykpIHtcbiAgICBjb250cm9sQmxvY2sgPSBwYXJzZUNvbnRyb2xCbG9jayhlY2MsIGNvbnRyb2xCbG9jayk7XG4gIH1cbiAgY29uc3QgeyBsZWFmVmVyc2lvbiB9ID0gY29udHJvbEJsb2NrO1xuXG4gIHJldHVybiBiY3J5cHRvLnRhZ2dlZEhhc2goXG4gICAgJ1RhcExlYWYnLFxuICAgIEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5vZihsZWFmVmVyc2lvbiksIHNlcmlhbGl6ZVNjcmlwdFNpemUodGFwc2NyaXB0KSwgdGFwc2NyaXB0XSlcbiAgKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSB0YXB0cmVlIHJvb3QgaGFzaCBmcm9tIGEgY29udHJvbCBibG9jayBhbmQgc2NyaXB0LlxuICogQHBhcmFtIGVjYyBFbGxpcHRpYyBjdXJ2ZSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIGNvbnRyb2xCbG9jayB0aGUgY29udHJvbCBibG9jaywgZWl0aGVyIHJhdyBvciBwYXJzZWRcbiAqIEBwYXJhbSB0YXBzY3JpcHQgdGhlIGxlYWYgc2NyaXB0IGNvcnJlc2Rwb25kaW5nIHRvIHRoZSBjb250cm9sIGJsb2NrXG4gKiBAcGFyYW0gdGFwbGVhZkhhc2ggdGhlIGxlYWYgaGFzaCBpZiBhbHJlYWR5IGNhbGN1bGF0ZWRcbiAqIEByZXR1cm5zIHtCdWZmZXJ9IHRoZSB0YXB0cmVlIHJvb3QgaGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFwdHJlZVJvb3QoXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgY29udHJvbEJsb2NrOiBCdWZmZXIgfCBDb250cm9sQmxvY2ssXG4gIHRhcHNjcmlwdDogQnVmZmVyLFxuICB0YXBsZWFmSGFzaD86IEJ1ZmZlclxuKTogQnVmZmVyIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250cm9sQmxvY2spKSB7XG4gICAgY29udHJvbEJsb2NrID0gcGFyc2VDb250cm9sQmxvY2soZWNjLCBjb250cm9sQmxvY2spO1xuICB9XG4gIGNvbnN0IHsgcGF0aCB9ID0gY29udHJvbEJsb2NrO1xuXG4gIHRhcGxlYWZIYXNoID0gdGFwbGVhZkhhc2ggfHwgZ2V0VGFwbGVhZkhhc2goZWNjLCBjb250cm9sQmxvY2ssIHRhcHNjcmlwdCk7XG5cbiAgLy8gYHRhcHRyZWVNZXJrbGVIYXNoYCBiZWdpbnMgYXMgb3VyIHRhcHNjcmlwdCB0YXBsZWFmIGhhc2ggYW5kIGl0cyB2YWx1ZSBpdGVyYXRlc1xuICAvLyB0aHJvdWdoIGl0cyBwYXJlbnQgdGFwYnJhbmNoIGhhc2hlcyB1bnRpbCBpdCBlbmRzIHVwIGFzIHRoZSB0YXB0cmVlIHJvb3QgaGFzaFxuICBsZXQgdGFwdHJlZU1lcmtsZUhhc2ggPSB0YXBsZWFmSGFzaDtcbiAgZm9yIChjb25zdCB0YXB0cmVlU2libGluZ0hhc2ggb2YgcGF0aCkge1xuICAgIHRhcHRyZWVNZXJrbGVIYXNoID1cbiAgICAgIEJ1ZmZlci5jb21wYXJlKHRhcHRyZWVNZXJrbGVIYXNoLCB0YXB0cmVlU2libGluZ0hhc2gpID09PSAtMVxuICAgICAgICA/IGJjcnlwdG8udGFnZ2VkSGFzaCgnVGFwQnJhbmNoJywgQnVmZmVyLmNvbmNhdChbdGFwdHJlZU1lcmtsZUhhc2gsIHRhcHRyZWVTaWJsaW5nSGFzaF0pKVxuICAgICAgICA6IGJjcnlwdG8udGFnZ2VkSGFzaCgnVGFwQnJhbmNoJywgQnVmZmVyLmNvbmNhdChbdGFwdHJlZVNpYmxpbmdIYXNoLCB0YXB0cmVlTWVya2xlSGFzaF0pKTtcbiAgfVxuXG4gIHJldHVybiB0YXB0cmVlTWVya2xlSGFzaDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR3ZWFrZWRPdXRwdXRLZXkocGF5bWVudDogYnBheW1lbnRzLlBheW1lbnQpOiBCdWZmZXIge1xuICBhc3NlcnQocGF5bWVudC5vdXRwdXQpO1xuICBpZiAocGF5bWVudC5vdXRwdXQubGVuZ3RoID09PSAzNCkge1xuICAgIHJldHVybiBwYXltZW50Lm91dHB1dD8uc3ViYXJyYXkoMik7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHAydHIgdHdlYWtlZCBvdXRwdXQga2V5IHNpemUgJHtwYXltZW50Lm91dHB1dC5sZW5ndGh9YCk7XG59XG5cbi8qKlxuICogQHJldHVybnMgb3V0cHV0IHNjcmlwdCBmb3IgZWl0aGVyIHNjcmlwdCBwYXRoIGlucHV0IGNvbnRyb2xCbG9ja1xuICogJiBsZWFmU2NyaXB0IE9SIGtleSBwYXRoIGlucHV0IGludGVybmFsUHViS2V5ICYgdGFwdHJlZVJvb3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhcHJvb3RPdXRwdXRTY3JpcHQoXG4gIHAydHJBcmdzOiB7IGludGVybmFsUHViS2V5OiBCdWZmZXI7IHRhcHRyZWVSb290OiBCdWZmZXIgfSB8IHsgY29udHJvbEJsb2NrOiBCdWZmZXI7IGxlYWZTY3JpcHQ6IEJ1ZmZlciB9XG4pOiBCdWZmZXIge1xuICBsZXQgaW50ZXJuYWxQdWJLZXk6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHRhcHRyZWVSb290OiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIGlmICgnaW50ZXJuYWxQdWJLZXknIGluIHAydHJBcmdzKSB7XG4gICAgaW50ZXJuYWxQdWJLZXkgPSBwMnRyQXJncy5pbnRlcm5hbFB1YktleTtcbiAgICB0YXB0cmVlUm9vdCA9IHAydHJBcmdzLnRhcHRyZWVSb290O1xuICB9IGVsc2Uge1xuICAgIGludGVybmFsUHViS2V5ID0gcGFyc2VDb250cm9sQmxvY2soZWNjTGliLCBwMnRyQXJncy5jb250cm9sQmxvY2spLmludGVybmFsUHVia2V5O1xuICAgIHRhcHRyZWVSb290ID0gZ2V0VGFwdHJlZVJvb3QoZWNjTGliLCBwMnRyQXJncy5jb250cm9sQmxvY2ssIHAydHJBcmdzLmxlYWZTY3JpcHQpO1xuICB9XG4gIGNvbnN0IG91dHB1dEtleSA9IHRhcFR3ZWFrUHVia2V5KGVjY0xpYiwgaW50ZXJuYWxQdWJLZXksIHRhcHRyZWVSb290KS54T25seVB1YmtleTtcbiAgcmV0dXJuIGJzY3JpcHQuY29tcGlsZShbYnNjcmlwdC5PUFMuT1BfMSwgQnVmZmVyLmZyb20ob3V0cHV0S2V5KV0pO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHgtb25seSB0YXByb290IG91dHB1dCBrZXkgKHRhcE91dHB1dEtleSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcHJvb3RPdXRwdXRLZXkob3V0cHV0U2NyaXB0OiBCdWZmZXIgfCAobnVtYmVyIHwgQnVmZmVyKVtdKTogQnVmZmVyIHtcbiAgY29uc3Qgb3V0cHV0RGVjb21waWxlZCA9IGJzY3JpcHQuZGVjb21waWxlKG91dHB1dFNjcmlwdCk7XG4gIGlmIChvdXRwdXREZWNvbXBpbGVkPy5sZW5ndGggIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdGFwcm9vdCBvdXRwdXQgc2NyaXB0Jyk7XG4gIH1cbiAgY29uc3QgW29wMSwgb3V0cHV0S2V5XSA9IG91dHB1dERlY29tcGlsZWQ7XG4gIGlmIChvcDEgIT09IGJzY3JpcHQuT1BTLk9QXzEgfHwgIUJ1ZmZlci5pc0J1ZmZlcihvdXRwdXRLZXkpIHx8IG91dHB1dEtleS5sZW5ndGggIT09IDMyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRhcHJvb3Qgb3V0cHV0IHNjcmlwdCcpO1xuICB9XG4gIHJldHVybiBvdXRwdXRLZXk7XG59XG4iXX0=
|
|
510
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwcm9vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXByb290LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7OztBQTJFSCxzREE2REM7QUFPRCxrREFFQztBQU9ELGtDQUdDO0FBU0Qsc0NBS0M7QUFFRCw4Q0FjQztBQVVELDBDQWNDO0FBY0Qsd0NBU0M7QUEyQ0Qsb0RBS0M7QUFTRCw4Q0FvRUM7QUFFRCwwQ0FTQztBQThCRCxrREEyQ0M7QUFTRCw4Q0ErQkM7QUFTRCx3Q0FjQztBQVVELHdDQXdCQztBQUVELGtEQU1DO0FBTUQsOERBY0M7QUFLRCxrREFVQztBQWxrQkQsaUNBQWtDO0FBQ2xDLHVEQUF3RDtBQUN4RCxpREFBNEY7QUFDNUYscURBQXNEO0FBQ3RELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRTNDOzs7R0FHRztBQUNVLFFBQUEsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QyxRQUFBLHlCQUF5QixHQUFHLElBQUksQ0FBQztBQVk5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0RHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQUMsR0FBMkIsRUFBRSxPQUFpQjtJQUNsRiwyQ0FBMkM7SUFDM0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLDZEQUE2RCxDQUFDLENBQUM7SUFFMUYsd0VBQXdFO0lBQ3hFLDJEQUEyRDtJQUMzRCx3RUFBd0U7SUFDeEUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFN0IseUZBQXlGO0lBQ3pGLHNFQUFzRTtJQUN0RSwrRUFBK0U7SUFDL0UsTUFBTSxDQUFDLEdBQUcsc0JBQU8sQ0FBQyxVQUFVLENBQUMsYUFB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TUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLGVBQU0sRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQ2xGLE9BQU8sc0JBQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxzQkFBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsWUFBMEM7SUFDNUUsTUFBTSxnQkFBZ0IsR0FBRyxzQkFBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6RCxJQUFJLGdCQUFnQixFQUFFLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7SUFDMUMsSUFBSSxHQUFHLEtBQUssc0JBQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3ZGLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGFwcm9vdCB1dGlsaXRpZXMgaW5jbHVkaW5nIHRoZSBsZWdhY3kgTXVTaWcyIGtleSBhZ2dyZWdhdGlvblxuICogYWxnb3JpdGhtIHVzZWQgYnkgQml0R28ncyBkZXByZWNhdGVkIGBwMnRyYCBzY3JpcHQgdHlwZSAoY2hhaW5zIDMwLCAzMSkuXG4gKlxuICogIyMgTGVnYWN5IHAydHIgdnMgU3RhbmRhcmQgcDJ0ck11c2lnMlxuICpcbiAqIEJpdEdvIHN1cHBvcnRzIHR3byB0YXByb290IGFkZHJlc3MgdHlwZXM6XG4gKlxuICogMS4gKipMZWdhY3kgYHAydHJgIChjaGFpbnMgMzAsIDMxKSAtIERFUFJFQ0FURUQqKlxuICogICAgLSBVc2VzIHRoZSBgYWdncmVnYXRlTXVTaWdQdWJrZXlzKClgIGZ1bmN0aW9uIGluIHRoaXMgbW9kdWxlXG4gKiAgICAtIEJhc2VkIG9uIGFuIG9sZGVyIE11U2lnMiB2YXJpYW50IHRoYXQgcHJlZGF0ZXMgQklQMzI3XG4gKiAgICAtIEV4cGVjdHMgMzItYnl0ZSB4LW9ubHkgcHVia2V5cyB3aXRoIGV2ZW4gWSBjb29yZGluYXRlc1xuICogICAgLSBTb3J0cyBrZXlzIEFGVEVSIHgtb25seSBjb252ZXJzaW9uXG4gKiAgICAtIENvcnJlc3BvbmRzIHRvIE11U2lnMiBiZWZvcmUgdGhlIDMyLWJ5dGUgdG8gMzMtYnl0ZSBrZXkgY2hhbmdlXG4gKiAgICAtIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pvbmFzbmljay9iaXBzL3B1bGwvMzdcbiAqXG4gKiAyLiAqKlN0YW5kYXJkIGBwMnRyTXVzaWcyYCAoY2hhaW5zIDQwLCA0MSkgLSBSRUNPTU1FTkRFRCoqXG4gKiAgICAtIFVzZXMgdGhlIGBAYnJhbmRvbmJsYWNrL211c2lnYCBsaWJyYXJ5IChzdGFuZGFyZCBCSVAzMjcgaW1wbGVtZW50YXRpb24pXG4gKiAgICAtIFVzZXMgZnVsbCAzMy1ieXRlIGNvbXByZXNzZWQgcHVia2V5cyB0aHJvdWdob3V0IGFnZ3JlZ2F0aW9uXG4gKiAgICAtIEtleSBvcmRlciBhZmZlY3RzIHRoZSByZXN1bHRpbmcgYWdncmVnYXRlIGtleVxuICogICAgLSBGdWxseSBjb21wYXRpYmxlIHdpdGggdGhlIEJJUDMyNyBzcGVjaWZpY2F0aW9uXG4gKlxuICogIyMgS2V5IERpZmZlcmVuY2VcbiAqXG4gKiBUaGUgY3JpdGljYWwgZGlmZmVyZW5jZSBpcyAqKndoZW4geC1vbmx5IGNvbnZlcnNpb24gaGFwcGVucyoqOlxuICogLSBMZWdhY3k6IENvbnZlcnRzIHRvIHgtb25seSBCRUZPUkUgc29ydGluZyAocHJvZHVjZXMgb3JkZXItaW5kZXBlbmRlbnQga2V5cylcbiAqIC0gU3RhbmRhcmQ6IFVzZXMgMzMtYnl0ZSBrZXlzIHRocm91Z2hvdXQgKGtleSBvcmRlciBtYXR0ZXJzKVxuICpcbiAqIEZvciB0aGUgc2FtZSB0d28gcHVia2V5cywgdGhlc2UgbWV0aG9kcyBwcm9kdWNlIERJRkZFUkVOVCBhZ2dyZWdhdGUga2V5cyBiZWNhdXNlXG4gKiB0aGUgc29ydCBvcmRlciBkaWZmZXJzIGJldHdlZW4gMzMtYnl0ZSBhbmQgMzItYnl0ZSByZXByZXNlbnRhdGlvbnMuXG4gKlxuICogU2VlIGBtb2R1bGVzL3V0eG8tbGliL2JpcC0wMzI3L1JFQURNRS5tZGAgZm9yIGRldGFpbGVkIGNvbXBhcmlzb24gYW5kIHRlc3QgY2FzZXMuXG4gKi9cblxuaW1wb3J0IHsgVGFwVHJlZSBhcyBQc2J0VGFwVHJlZSwgVGFwTGVhZiBhcyBQc2J0VGFwTGVhZiB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL2ludGVyZmFjZXMnO1xuaW1wb3J0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuaW1wb3J0IEZhc3RQcmlvcml0eVF1ZXVlID0gcmVxdWlyZSgnZmFzdHByaW9yaXR5cXVldWUnKTtcbmltcG9ydCB7IHNjcmlwdCBhcyBic2NyaXB0LCBjcnlwdG8gYXMgYmNyeXB0bywgcGF5bWVudHMgYXMgYnBheW1lbnRzIH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgeyBlY2MgYXMgZWNjTGliIH0gZnJvbSAnQGJpdGdvLWJldGEvc2VjcDI1NmsxJztcbmNvbnN0IHZhcnVpbnQgPSByZXF1aXJlKCd2YXJ1aW50LWJpdGNvaW4nKTtcblxuLyoqXG4gKiBUaGUgMHgwMiBwcmVmaXggaW5kaWNhdGluZyBhbiBldmVuIFkgY29vcmRpbmF0ZSB3aGljaCBpcyBpbXBsaWNpdGx5IGFzc3VtZWRcbiAqIG9uIGFsbCAzMiBieXRlIHgtb25seSBwdWIga2V5cyBhcyBkZWZpbmVkIGluIEJJUDM0MC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVWRU5fWV9DT09SRF9QUkVGSVggPSBCdWZmZXIub2YoMHgwMik7XG5leHBvcnQgY29uc3QgSU5JVElBTF9UQVBTQ1JJUFRfVkVSU0lPTiA9IDB4YzA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGlueVNlY3AyNTZrMUludGVyZmFjZSB7XG4gIGlzWE9ubHlQb2ludChwOiBVaW50OEFycmF5KTogYm9vbGVhbjtcbiAgeE9ubHlQb2ludEFkZFR3ZWFrKHA6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5KTogWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHwgbnVsbDtcbiAgcG9pbnRGcm9tU2NhbGFyKHNrOiBVaW50OEFycmF5LCBjb21wcmVzc2VkPzogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsO1xuICBwb2ludE11bHRpcGx5KGE6IFVpbnQ4QXJyYXksIGI6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHwgbnVsbDtcbiAgcG9pbnRBZGQoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgfCBudWxsO1xuICBwcml2YXRlQWRkKGQ6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5KTogVWludDhBcnJheSB8IG51bGw7XG4gIHByaXZhdGVOZWdhdGUoZDogVWludDhBcnJheSk6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogQWdncmVnYXRlcyBhIGxpc3Qgb2YgcHVibGljIGtleXMgaW50byBhIHNpbmdsZSBwdWJsaWMga2V5IHVzaW5nIHRoZSBsZWdhY3kgTXVTaWcyIGFsZ29yaXRobS5cbiAqXG4gKiBUaGlzIGltcGxlbWVudHMgdGhlIGRlcHJlY2F0ZWQga2V5IGFnZ3JlZ2F0aW9uIG1ldGhvZCB1c2VkIGJ5IEJpdEdvJ3MgYHAydHJgIHNjcmlwdCB0eXBlXG4gKiAoY2hhaW5zIDMwLCAzMSkuIEl0IGNvcnJlc3BvbmRzIHRvIGFuIG9sZGVyIHZhcmlhbnQgb2YgTXVTaWcyIHRoYXQgcHJlZGF0ZXMgdGhlIGNoYW5nZVxuICogZnJvbSAzMi1ieXRlIHRvIDMzLWJ5dGUga2V5cyBpbiB0aGUgQklQMzI3IHNwZWNpZmljYXRpb24uXG4gKlxuICogIyMgQWxnb3JpdGhtXG4gKlxuICogVGhlIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIE11U2lnMiBrZXkgYWdncmVnYXRpb24gc2NoZW1lOlxuICpcbiAqIGBgYFxuICogUCA9IHN1bV9pICjOvF9pICogUF9pKVxuICogYGBgXG4gKlxuICogd2hlcmU6XG4gKiAtIGBQX2lgIGlzIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBpLXRoIHNpZ25lclxuICogLSBgzrxfaWAgaXMgdGhlIE11U2lnIGNvZWZmaWNpZW50IGNvbXB1dGVkIGFzOlxuICogICAtIGBMID0gVGFnZ2VkSGFzaChcIktleUFnZyBsaXN0XCIsIFBfMSB8fCBQXzIgfHwgLi4uIHx8IFBfbilgXG4gKiAgIC0gYM68X2kgPSBUYWdnZWRIYXNoKFwiS2V5QWdnIGNvZWZmaWNpZW50XCIsIEwgfHwgUF9pKWAgZm9yIG1vc3Qga2V5c1xuICogICAtIGDOvF9pID0gMWAgZm9yIHRoZSBzZWNvbmQgdW5pcXVlIGtleSAob3B0aW1pemF0aW9uIHRvIHNhdmUgYW4gZXhwb25lbnRpYXRpb24pXG4gKlxuICogIyMgS2V5IENoYXJhY3RlcmlzdGljcyAoTGVnYWN5IFZhcmlhbnQpXG4gKlxuICogMS4gKipYLW9ubHkgcHVia2V5cyoqOiBFeHBlY3RzIDMyLWJ5dGUgeC1vbmx5IHB1YmtleXMgKGFzc3VtZXMgZXZlbiBZIGNvb3JkaW5hdGVzKVxuICogMi4gKipQcmUtYWdncmVnYXRpb24gc29ydGluZyoqOiBTb3J0cyBrZXlzIGluIGFzY2VuZGluZyBvcmRlciBCRUZPUkUgYWdncmVnYXRpb25cbiAqIDMuICoqT3JkZXItaW5kZXBlbmRlbnQqKjogRHVlIHRvIHNvcnRpbmcsIGtleSBvcmRlciBkb2Vzbid0IGFmZmVjdCB0aGUgcmVzdWx0XG4gKiA0LiAqKjMzLWJ5dGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24qKjogSW50ZXJuYWxseSBwcmVwZW5kcyAweDAyIHByZWZpeCBmb3IgZWxsaXB0aWMgY3VydmUgb3BlcmF0aW9uc1xuICpcbiAqICMjIERpZmZlcmVuY2VzIGZyb20gU3RhbmRhcmQgTXVTaWcyIChCSVAzMjcpXG4gKlxuICogVGhlIHN0YW5kYXJkIE11U2lnMiBpbXBsZW1lbnRhdGlvbiAoYEBicmFuZG9uYmxhY2svbXVzaWdgIGxpYnJhcnkpOlxuICogLSBVc2VzIDMzLWJ5dGUgY29tcHJlc3NlZCBwdWJrZXlzIHRocm91Z2hvdXRcbiAqIC0gRG9lcyBOT1Qgc29ydCBrZXlzIGJlZm9yZSBhZ2dyZWdhdGlvbiAoa2V5IG9yZGVyIG1hdHRlcnMpXG4gKiAtIFByb2R1Y2VzIGRpZmZlcmVudCBhZ2dyZWdhdGUga2V5cyBldmVuIGZvciB0aGUgc2FtZSBzZXQgb2YgcHVia2V5c1xuICpcbiAqICMjIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvblxuICpcbiAqIFRoaXMgY29ycmVzcG9uZHMgdG8gYGtleV9hZ2dfYml0Z29fcDJ0cl9sZWdhY3koKWAgaW4gdGhlIFB5dGhvbiByZWZlcmVuY2UgaW1wbGVtZW50YXRpb25cbiAqIGF0IGBtb2R1bGVzL3V0eG8tbGliL2JpcC0wMzI3L3JlZmVyZW5jZS5weWAuXG4gKlxuICogQHBhcmFtIGVjYyBFbGxpcHRpYyBjdXJ2ZSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHB1YmtleXMgTGlzdCBvZiAzMi1ieXRlIHgtb25seSBwdWJsaWMga2V5cyB0byBhZ2dyZWdhdGUgKG11c3QgaGF2ZSBldmVuIFkgY29vcmRpbmF0ZXMpXG4gKiBAcmV0dXJucyAzMi1ieXRlIEJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIHgtb25seSBhZ2dyZWdhdGUgcHVibGljIGtleVxuICogQHRocm93cyB7RXJyb3J9IGlmIGZld2VyIHRoYW4gMiBwdWJrZXlzIHByb3ZpZGVkIG9yIGVsbGlwdGljIGN1cnZlIG9wZXJhdGlvbnMgZmFpbFxuICpcbiAqIEBzZWUgbW9kdWxlcy91dHhvLWxpYi9iaXAtMDMyNy9SRUFETUUubWQgZm9yIGRldGFpbGVkIGNvbXBhcmlzb24gd2l0aCBzdGFuZGFyZCBNdVNpZzJcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2pvbmFzbmljay9iaXBzL3B1bGwvMzcgZm9yIHRoZSBNdVNpZzIgc3BlY2lmaWNhdGlvbiBjaGFuZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0ZU11U2lnUHVia2V5cyhlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsIHB1YmtleXM6IEJ1ZmZlcltdKTogVWludDhBcnJheSB7XG4gIC8vIFRPRE86IENvbnNpZGVyIGVuZm9yY2luZyBrZXkgdW5pcXVlbmVzcy5cbiAgYXNzZXJ0KHB1YmtleXMubGVuZ3RoID4gMSwgJ2F0IGxlYXN0IHR3byBwdWJrZXlzIGFyZSByZXF1aXJlZCBmb3IgbXVzaWcga2V5IGFnZ3JlZ2F0aW9uJyk7XG5cbiAgLy8gTEVHQUNZIEJFSEFWSU9SOiBTb3J0IHRoZSBrZXlzIGluIGFzY2VuZGluZyBvcmRlciBCRUZPUkUgYWdncmVnYXRpb24uXG4gIC8vIFRoaXMgbWFrZXMgdGhlIGFnZ3JlZ2F0ZSBrZXkgaW5kZXBlbmRlbnQgb2YgaW5wdXQgb3JkZXIuXG4gIC8vIFN0YW5kYXJkIE11U2lnMiAoQklQMzI3KSBkb2VzIE5PVCBzb3J0LCBtYWtpbmcga2V5IG9yZGVyIHNpZ25pZmljYW50LlxuICBwdWJrZXlzLnNvcnQoQnVmZmVyLmNvbXBhcmUpO1xuXG4gIC8vIENvbXB1dGUgdGhlIFwiS2V5QWdnIGxpc3RcIiBoYXNoIEwgPSBUYWdnZWRIYXNoKFwiS2V5QWdnIGxpc3RcIiwgUF8xIHx8IFBfMiB8fCAuLi4gfHwgUF9uKVxuICAvLyBUaGlzIGhhc2ggaXMgdXNlZCB0byBkZXJpdmUgdGhlIE11U2lnIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBwdWJrZXkuXG4gIC8vIEluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gKHJlZmVyZW5jZS5weSksIHRoaXMgaXMgZG9uZSBpbiBoYXNoX2tleXMoKS5cbiAgY29uc3QgTCA9IGJjcnlwdG8udGFnZ2VkSGFzaCgnS2V5QWdnIGxpc3QnLCBCdWZmZXIuY29uY2F0KHB1YmtleXMpKTtcblxuICAvLyBGaW5kIHRoZSBzZWNvbmQgdW5pcXVlIHB1YmtleSBpbiB0aGUgc29ydGVkIGxpc3QuXG4gIC8vIFRoaXMga2V5IChhbmQgYW55IGtleXMgaWRlbnRpY2FsIHRvIGl0KSB3aWxsIHVzZSBjb2VmZmljaWVudCDOvCA9IDEgYXMgYW4gb3B0aW1pemF0aW9uLlxuICAvLyBUaGlzIHNhdmVzIGFuIGV4cGVuc2l2ZSBwb2ludCBtdWx0aXBsaWNhdGlvbiAoc2VlIE11U2lnMiogYXBwZW5kaXggaW4gdGhlIE11U2lnMiBwYXBlcikuXG4gIC8vIEluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24sIHRoaXMgaXMgZ2V0X3NlY29uZF9rZXkoKS5cbiAgY29uc3Qgc2Vjb25kVW5pcXVlUHVia2V5ID0gcHVia2V5cy5maW5kKChwdWJrZXkpID0+ICFwdWJrZXlzWzBdLmVxdWFscyhwdWJrZXkpKTtcblxuICAvLyBGb3IgZWFjaCBwdWJrZXkgUF9pLCBjb21wdXRlIHRoZSB0d2Vha2VkIHB1YmtleSDOvF9pICogUF9pXG4gIC8vIHdoZXJlIM68X2kgaXMgdGhlIE11U2lnIGNvZWZmaWNpZW50IGZvciB0aGF0IGtleS5cbiAgY29uc3QgdHdlYWtlZFB1YmtleXM6IFVpbnQ4QXJyYXlbXSA9IHB1YmtleXMubWFwKChwdWJrZXkpID0+IHtcbiAgICAvLyBDb252ZXJ0IDMyLWJ5dGUgeC1vbmx5IHB1YmtleSB0byAzMy1ieXRlIGNvbXByZXNzZWQgZm9ybWF0IGJ5IHByZXBlbmRpbmcgMHgwMi5cbiAgICAvLyBUaGlzIGFzc3VtZXMgYW4gZXZlbiBZIGNvb3JkaW5hdGUgKHN0YW5kYXJkIGZvciB4LW9ubHkgcHVia2V5cyBpbiB0YXByb290KS5cbiAgICAvLyBJbiB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLCB0aGlzIGlzIGRvbmUgaW1wbGljaXRseSBpbiBrZXlfYWdnKCkgdmlhIGxpZnRfeCgpLlxuICAgIGNvbnN0IHh5UHVia2V5ID0gQnVmZmVyLmNvbmNhdChbRVZFTl9ZX0NPT1JEX1BSRUZJWCwgcHVia2V5XSk7XG5cbiAgICBpZiAoc2Vjb25kVW5pcXVlUHVia2V5ICE9PSB1bmRlZmluZWQgJiYgc2Vjb25kVW5pcXVlUHVia2V5LmVxdWFscyhwdWJrZXkpKSB7XG4gICAgICAvLyBPcHRpbWl6YXRpb246IFRoZSBzZWNvbmQgdW5pcXVlIGtleSBnZXRzIGNvZWZmaWNpZW50IM68ID0gMS5cbiAgICAgIC8vIFRoaXMgbWVhbnMgzrxfaSAqIFBfaSA9IDEgKiBQX2kgPSBQX2kgKG5vIG11bHRpcGxpY2F0aW9uIG5lZWRlZCkuXG4gICAgICAvLyBUaGlzIHNhdmVzIGFuIGV4cGVuc2l2ZSBlbGxpcHRpYyBjdXJ2ZSBwb2ludCBtdWx0aXBsaWNhdGlvbiBvcGVyYXRpb24uXG4gICAgICAvLyBTZWUga2V5X2FnZ19jb2VmZl9pbnRlcm5hbCgpIGluIHJlZmVyZW5jZS5weSB3aGVyZSBpdCByZXR1cm5zIDEgZm9yIHBrXyA9PSBwazIuXG4gICAgICByZXR1cm4geHlQdWJrZXk7XG4gICAgfVxuXG4gICAgLy8gQ29tcHV0ZSB0aGUgTXVTaWcgY29lZmZpY2llbnQ6IM68X2kgPSBUYWdnZWRIYXNoKFwiS2V5QWdnIGNvZWZmaWNpZW50XCIsIEwgfHwgUF9pKVxuICAgIC8vIEluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24sIHRoaXMgaXMga2V5X2FnZ19jb2VmZl9pbnRlcm5hbCgpLlxuICAgIGNvbnN0IGMgPSBiY3J5cHRvLnRhZ2dlZEhhc2goJ0tleUFnZyBjb2VmZmljaWVudCcsIEJ1ZmZlci5jb25jYXQoW0wsIHB1YmtleV0pKTtcblxuICAgIC8vIENvbXB1dGUgdGhlIHR3ZWFrZWQgcHVia2V5OiDOvF9pICogUF9pIChlbGxpcHRpYyBjdXJ2ZSBwb2ludCBtdWx0aXBsaWNhdGlvbilcbiAgICBjb25zdCB0d2Vha2VkUHVia2V5ID0gZWNjLnBvaW50TXVsdGlwbHkoeHlQdWJrZXksIGMpO1xuICAgIGlmICghdHdlYWtlZFB1YmtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbXVsdGlwbHkgcHVia2V5IGJ5IGNvZWZmaWNpZW50Jyk7XG4gICAgfVxuICAgIHJldHVybiB0d2Vha2VkUHVia2V5O1xuICB9KTtcblxuICAvLyBTdW0gYWxsIHRoZSB0d2Vha2VkIHB1YmtleXMgdG8gZ2V0IHRoZSBhZ2dyZWdhdGUgcHVia2V5OlxuICAvLyBQID0gc3VtX2kgKM68X2kgKiBQX2kpID0gzrxfMSpQXzEgKyDOvF8yKlBfMiArIC4uLiArIM68X24qUF9uXG4gIC8vIFRoaXMgaXMgZWxsaXB0aWMgY3VydmUgcG9pbnQgYWRkaXRpb24uXG4gIGNvbnN0IGFnZ3JlZ2F0ZVB1YmtleSA9IHR3ZWFrZWRQdWJrZXlzLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBlY2MucG9pbnRBZGQocHJldiwgY3Vycik7XG4gICAgaWYgKCFuZXh0KSB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzdW0gcHVia2V5cycpO1xuICAgIHJldHVybiBuZXh0O1xuICB9KTtcblxuICAvLyBDb252ZXJ0IHRoZSBhZ2dyZWdhdGUgcHVia2V5IGZyb20gMzMtYnl0ZSBjb21wcmVzc2VkIGZvcm1hdCBiYWNrIHRvIDMyLWJ5dGUgeC1vbmx5IGZvcm1hdFxuICAvLyBieSByZW1vdmluZyB0aGUgZmlyc3QgYnl0ZSAodGhlIFkgY29vcmRpbmF0ZSBwcmVmaXgpLlxuICAvLyBJbiB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLCB0aGlzIGlzIGRvbmUgYnkgZ2V0X3hvbmx5X3BrKCkgd2hpY2ggY2FsbHMgeGJ5dGVzKCkuXG4gIHJldHVybiBhZ2dyZWdhdGVQdWJrZXkuc2xpY2UoMSk7XG59XG5cbi8qKlxuICogRW5jb2RlcyB0aGUgbGVuZ3RoIG9mIGEgc2NyaXB0IGFzIGEgYml0Y29pbiB2YXJpYWJsZSBsZW5ndGggaW50ZWdlci5cbiAqIEBwYXJhbSBzY3JpcHRcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVTY3JpcHRTaXplKHNjcmlwdDogQnVmZmVyKTogQnVmZmVyIHtcbiAgcmV0dXJuIHZhcnVpbnQuZW5jb2RlKHNjcmlwdC5sZW5ndGgpO1xufVxuXG4vKipcbiAqIEdldHMgYSB0YXBsZWFmIHRhZ2dlZCBoYXNoIGZyb20gYSBzY3JpcHQuXG4gKiBAcGFyYW0gc2NyaXB0XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFRhcExlYWYoc2NyaXB0OiBCdWZmZXIsIGxlYWZWZXJzaW9uID0gSU5JVElBTF9UQVBTQ1JJUFRfVkVSU0lPTik6IEJ1ZmZlciB7XG4gIGNvbnN0IHNpemUgPSBzZXJpYWxpemVTY3JpcHRTaXplKHNjcmlwdCk7XG4gIHJldHVybiBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcExlYWYnLCBCdWZmZXIuY29uY2F0KFtCdWZmZXIub2YobGVhZlZlcnNpb24pLCBzaXplLCBzY3JpcHRdKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxleGljb2dyYXBoaWNhbGx5IHNvcnRlZCB0YXBicmFuY2ggZnJvbSB0d28gY2hpbGQgdGFwdHJlZSBub2Rlc1xuICogYW5kIHJldHVybnMgaXRzIHRhZ2dlZCBoYXNoLlxuICogQHBhcmFtIGNoaWxkMVxuICogQHBhcmFtIGNoaWxkMlxuICogQHJldHVybnMgdGhlIHRhZ2dlZCB0YXBicmFuY2ggaGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFRhcEJyYW5jaChjaGlsZDE6IEJ1ZmZlciwgY2hpbGQyOiBCdWZmZXIpOiBCdWZmZXIge1xuICAvLyBzb3J0IHRoZSBjaGlsZHJlbiBsZXhpY29ncmFwaGljYWxseVxuICBjb25zdCBzb3J0ZWRDaGlsZHJlbiA9IFtjaGlsZDEsIGNoaWxkMl0uc29ydChCdWZmZXIuY29tcGFyZSk7XG5cbiAgcmV0dXJuIGJjcnlwdG8udGFnZ2VkSGFzaCgnVGFwQnJhbmNoJywgQnVmZmVyLmNvbmNhdChzb3J0ZWRDaGlsZHJlbikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlVGFwVHdlYWsocHVia2V5OiBVaW50OEFycmF5LCB0YXB0cmVlUm9vdD86IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgaWYgKHB1YmtleS5sZW5ndGggIT09IDMyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHB1YmtleSBzaXplICR7cHVia2V5Lmxlbmd0aH0uYCk7XG4gIH1cbiAgaWYgKHRhcHRyZWVSb290KSB7XG4gICAgaWYgKHRhcHRyZWVSb290Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YXB0cmVlUm9vdCBzaXplICR7dGFwdHJlZVJvb3QubGVuZ3RofS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGJjcnlwdG8udGFnZ2VkSGFzaCgnVGFwVHdlYWsnLCBCdWZmZXIuY29uY2F0KFtwdWJrZXksIHRhcHRyZWVSb290XSkpO1xuICB9XG4gIC8vIElmIHRoZSBzcGVuZGluZyBjb25kaXRpb25zIGRvIG5vdCByZXF1aXJlIGEgc2NyaXB0IHBhdGgsIHRoZSBvdXRwdXQga2V5IHNob3VsZCBjb21taXQgdG8gYW5cbiAgLy8gdW5zcGVuZGFibGUgc2NyaXB0IHBhdGggaW5zdGVhZCBvZiBoYXZpbmcgbm8gc2NyaXB0IHBhdGguXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzNDEubWVkaWF3aWtpI2NpdGVfbm90ZS0yMlxuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKCdUYXBUd2VhaycsIEJ1ZmZlci5mcm9tKHB1YmtleSkpO1xufVxuXG4vKipcbiAqIFR3ZWFrcyBhIHByaXZrZXksIHVzaW5nIHRoZSB0YWdnZWQgaGFzaCBvZiBpdHMgcHVia2V5LCBhbmQgKG9wdGlvbmFsbHkpIGEgdGFwdHJlZSByb290XG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gcHVia2V5IHB1YmxpYyBrZXksIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB0d2Vha1xuICogQHBhcmFtIHByaXZrZXkgdGhlIHByaXZrZXkgdG8gdHdlYWtcbiAqIEBwYXJhbSB0YXB0cmVlUm9vdCB0aGUgdGFwdHJlZSByb290IHRhZ2dlZCBoYXNoXG4gKiBAcmV0dXJucyB7QnVmZmVyfSB0aGUgdHdlYWtlZCBwcml2a2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YXBUd2Vha1ByaXZrZXkoXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgcHVia2V5OiBVaW50OEFycmF5LFxuICBwcml2a2V5OiBVaW50OEFycmF5LFxuICB0YXB0cmVlUm9vdD86IFVpbnQ4QXJyYXlcbik6IFVpbnQ4QXJyYXkge1xuICBjb25zdCB0YXBUd2VhayA9IGNhbGN1bGF0ZVRhcFR3ZWFrKHB1YmtleSwgdGFwdHJlZVJvb3QpO1xuXG4gIGNvbnN0IHBvaW50ID0gZWNjLnBvaW50RnJvbVNjYWxhcihwcml2a2V5KTtcbiAgaWYgKCFwb2ludCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaXZhdGUga2V5Jyk7XG4gIGlmIChwb2ludFswXSAlIDIgPT09IDEpIHByaXZrZXkgPSBlY2MucHJpdmF0ZU5lZ2F0ZShwcml2a2V5KTtcbiAgY29uc3QgcmVzdWx0ID0gZWNjLnByaXZhdGVBZGQocHJpdmtleSwgdGFwVHdlYWspO1xuICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaXZhdGUga2V5Jyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHtcbiAgcGFyaXR5OiAxIHwgMDtcbiAgeE9ubHlQdWJrZXk6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogVHdlYWtzIGFuIGludGVybmFsIHB1YmtleSwgdXNpbmcgdGhlIHRhZ2dlZCBoYXNoIG9mIGl0c2VsZiwgYW5kIChvcHRpb25hbGx5KSBhIHRhcHRyZWUgcm9vdFxuICogQHBhcmFtIGVjYyBFbGxpcHRpYyBjdXJ2ZSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHB1YmtleSB0aGUgaW50ZXJuYWwgcHVia2V5IHRvIHR3ZWFrXG4gKiBAcGFyYW0gdGFwdHJlZVJvb3QgdGhlIHRhcHRyZWUgcm9vdCB0YWdnZWQgaGFzaFxuICogQHJldHVybnMge1R3ZWFrZWRQdWJrZXl9IHRoZSB0d2Vha2VkIHB1YmtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFwVHdlYWtQdWJrZXkoXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgcHVia2V5OiBVaW50OEFycmF5LFxuICB0YXB0cmVlUm9vdD86IEJ1ZmZlclxuKTogWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHtcbiAgY29uc3QgdGFwVHdlYWsgPSBjYWxjdWxhdGVUYXBUd2VhayhwdWJrZXksIHRhcHRyZWVSb290KTtcbiAgY29uc3QgcmVzdWx0ID0gZWNjLnhPbmx5UG9pbnRBZGRUd2VhayhwdWJrZXksIHRhcFR3ZWFrKTtcbiAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwdWJrZXknKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYXB0cmVlIHtcbiAgcm9vdDogQnVmZmVyO1xuICBwYXRoczogQnVmZmVyW11bXTtcbn1cblxuaW50ZXJmYWNlIFdlaWdodGVkVGFwU2NyaXB0IHtcbiAgLyoqIEEgVGFwTGVhZiBvciBUYXBCcmFuY2ggdGFnZ2VkIGhhc2ggKi9cbiAgdGFnZ2VkSGFzaDogQnVmZmVyO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgcGF0aHM6IHtcbiAgICBbaW5kZXg6IG51bWJlcl06IEJ1ZmZlcltdO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZWN1cnNlVGFwdHJlZShsZWF2ZXM6IEl0ZXJhdG9yPFtudW1iZXIsIFBzYnRUYXBMZWFmXT4sIHRhcmdldERlcHRoID0gMCk6IFRhcHRyZWUge1xuICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBsZWF2ZXMubmV4dCgpO1xuICBhc3NlcnQoIWRvbmUsICdpbnN1ZmZpY2llbnQgbGVhdmVzIHRvIHJlY29uc3RydWN0IHRhcCB0cmVlJyk7XG4gIGNvbnN0IFtpbmRleCwgbGVhZl0gPSB2YWx1ZTtcbiAgY29uc3QgdHJlZTogVGFwdHJlZSA9IHtcbiAgICByb290OiBoYXNoVGFwTGVhZihsZWFmLnNjcmlwdCwgbGVhZi5sZWFmVmVyc2lvbiksXG4gICAgcGF0aHM6IFtdLFxuICB9O1xuICB0cmVlLnBhdGhzW2luZGV4XSA9IFtdO1xuICBmb3IgKGxldCBkZXB0aCA9IGxlYWYuZGVwdGg7IGRlcHRoID4gdGFyZ2V0RGVwdGg7IGRlcHRoLS0pIHtcbiAgICBjb25zdCBzaWJsaW5nID0gcmVjdXJzZVRhcHRyZWUobGVhdmVzLCBkZXB0aCk7XG4gICAgdHJlZS5wYXRocy5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnB1c2goc2libGluZy5yb290KSk7XG4gICAgc2libGluZy5wYXRocy5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnB1c2godHJlZS5yb290KSk7XG4gICAgdHJlZS5yb290ID0gaGFzaFRhcEJyYW5jaCh0cmVlLnJvb3QsIHNpYmxpbmcucm9vdCk7XG4gICAgLy8gTWVyZ2UgZGlzam9pbnQgc3BhcnNlIGFycmF5cyBvZiBwYXRocyBpbnRvIHRyZWUucGF0aHNcbiAgICBPYmplY3QuYXNzaWduKHRyZWUucGF0aHMsIHNpYmxpbmcucGF0aHMpO1xuICB9XG4gIHJldHVybiB0cmVlO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHJvb3QgaGFzaCBhbmQgaGFzaC1wYXRocyBvZiBhIHRhcHRyZWUgZnJvbSB0aGUgZGVwdGgtZmlyc3RcbiAqIGNvbnN0cnVjdGlvbiB1c2VkIGluIEJJUC0wMzcxIFBTQlRzXG4gKiBAcGFyYW0gdHJlZVxuICogQHJldHVybnMge1RhcHRyZWV9IHRoZSB0cmVlLCByZXByZXNlbnRlZCBieSBpdHMgcm9vdCBoYXNoLCBhbmQgdGhlIHBhdGhzIHRvXG4gKiB0aGF0IHJvb3QgZnJvbSBlYWNoIG9mIHRoZSBpbnB1dCBzY3JpcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXB0aEZpcnN0VGFwdHJlZSh0cmVlOiBQc2J0VGFwVHJlZSk6IFRhcHRyZWUge1xuICBjb25zdCBpdGVyID0gdHJlZS5sZWF2ZXMuZW50cmllcygpO1xuICBjb25zdCByZXQgPSByZWN1cnNlVGFwdHJlZShpdGVyKTtcbiAgYXNzZXJ0KGl0ZXIubmV4dCgpLmRvbmUsICdpbnZhbGlkIHRhcCB0cmVlLCBubyBwYXRoIHRvIHNvbWUgbGVhdmVzJyk7XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcm9vdCBoYXNoIG9mIGEgdGFwdHJlZSB1c2luZyBhIHdlaWdodGVkIEh1ZmZtYW4gY29uc3RydWN0aW9uIGZyb20gYVxuICogbGlzdCBvZiBzY3JpcHRzIGFuZCBjb3JyZXNwb25kaW5nIHdlaWdodHMuXG4gKiBAcGFyYW0gc2NyaXB0c1xuICogQHBhcmFtIHdlaWdodHNcbiAqIEByZXR1cm5zIHtUYXB0cmVlfSB0aGUgdHJlZSwgcmVwcmVzZW50ZWQgYnkgaXRzIHJvb3QgaGFzaCwgYW5kIHRoZSBwYXRocyB0byB0aGF0IHJvb3QgZnJvbSBlYWNoIG9mIHRoZSBpbnB1dCBzY3JpcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIdWZmbWFuVGFwdHJlZShzY3JpcHRzOiBCdWZmZXJbXSwgd2VpZ2h0czogQXJyYXk8bnVtYmVyIHwgdW5kZWZpbmVkPik6IFRhcHRyZWUge1xuICBhc3NlcnQoc2NyaXB0cy5sZW5ndGggPiAwLCAnYXQgbGVhc3Qgb25lIHNjcmlwdCBpcyByZXF1aXJlZCB0byBjb25zdHJ1Y3QgYSB0YXAgdHJlZScpO1xuXG4gIC8vIENyZWF0ZSBhIHF1ZXVlL2hlYXAgb2YgdGhlIHByb3ZpZGVkIHNjcmlwdHMgcHJpb3JpdGl6ZWQgYWNjb3JkaW5nIHRvIHRoZWlyXG4gIC8vIGNvcnJlc3BvbmRpbmcgd2VpZ2h0cy5cbiAgY29uc3QgcXVldWUgPSBuZXcgRmFzdFByaW9yaXR5UXVldWU8V2VpZ2h0ZWRUYXBTY3JpcHQ+KChhLCBiKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIGEud2VpZ2h0IDwgYi53ZWlnaHQ7XG4gIH0pO1xuICBzY3JpcHRzLmZvckVhY2goKHNjcmlwdCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB3ZWlnaHQgPSB3ZWlnaHRzW2luZGV4XSB8fCAxO1xuICAgIGFzc2VydCh3ZWlnaHQgPiAwLCAnc2NyaXB0IHdlaWdodCBtdXN0IGJlIGEgcG9zaXRpdmUgdmFsdWUnKTtcblxuICAgIHF1ZXVlLmFkZCh7XG4gICAgICB3ZWlnaHQsXG4gICAgICB0YWdnZWRIYXNoOiBoYXNoVGFwTGVhZihzY3JpcHQpLFxuICAgICAgcGF0aHM6IHsgW2luZGV4XTogW10gfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIHF1ZXVlIG9mIHdlaWdodGVkIHNjcmlwdHMsIHdlIGJlZ2luIGEgbG9vcCB3aGVyZWJ5IHdlXG4gIC8vIHJlbW92ZSB0aGUgdHdvIGxvd2VzdCB3ZWlnaHRlZCBpdGVtcyBmcm9tIHRoZSBxdWV1ZS4gV2UgY3JlYXRlIGEgdGFwIGJyYW5jaFxuICAvLyBub2RlIGZyb20gdGhlIHR3byBpdGVtcywgYW5kIGFkZCB0aGUgYnJhbmNoIGJhY2sgdG8gdGhlIHF1ZXVlIHdpdGggdGhlXG4gIC8vIGNvbWJpbmVkIHdlaWdodCBvZiBib3RoIGl0cyBjaGlsZHJlbi4gRWFjaCBsb29wIHJlZHVjZXMgdGhlIG51bWJlciBvZiBpdGVtc1xuICAvLyBpbiB0aGUgcXVldWUgYnkgb25lLCBhbmQgd2UgcmVwZWF0IHVudGlsIHdlIGFyZSBsZWZ0IHdpdGggb25seSBvbmUgaXRlbSAtXG4gIC8vIHRoaXMgYmVjb21lcyB0aGUgdGFwIHRyZWUgcm9vdC5cbiAgLy9cbiAgLy8gRm9yIGV4YW1wbGUsIGlmIHdlIGJlZ2luIHdpdGggc2NyaXB0cyBBLCBCLCBDLCBEIHdpdGggd2VpZ2h0cyA2LCAzLCAxLCAxXG4gIC8vIEFmdGVyIGZpcnN0IGxvb3A6IEEoNiksIEIoMyksIENEKDEgKyAxKVxuICAvLyBBZnRlciBzZWNvbmQgbG9vcDogQSg2KSwgQltDRF0oMyArIDIpXG4gIC8vIEZpbmFsIGxvb3A6IEFbQltDRF1dKDYrNSlcbiAgLy8gVGhlIGZpbmFsIHRyZWUgd2lsbCBsb29rIGxpa2U6XG4gIC8vXG4gIC8vICAgICAgICBBW0JbQ0RdXVxuICAvLyAgICAgICAvICAgICAgICBcXFxuICAvLyAgICAgIEEgICAgICAgICBCW0NEXVxuICAvLyAgICAgICAgICAgICAgIC8gICAgIFxcXG4gIC8vICAgICAgICAgICAgICBCICAgICAgW0NEXVxuICAvLyAgICAgICAgICAgICAgICAgICAgLyAgICBcXFxuICAvLyAgICAgICAgICAgICAgICAgICBDICAgICAgRFxuICAvL1xuICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgc3BlbmRpbmcgY29uZGl0aW9ucyB3ZSBiZWxpZXZlIHRvIGhhdmUgdGhlIGhpZ2hlc3RcbiAgLy8gcHJvYmFiaWxpdHkgb2YgYmVpbmcgdXNlZCBhcmUgZnVydGhlciB1cCB0aGUgdHJlZSB0aGFuIGxlc3MgbGlrZWx5IHNjcmlwdHMsXG4gIC8vIHRoZXJlYnkgcmVkdWNpbmcgdGhlIHNpemUgb2YgdGhlIG1lcmtsZSBwcm9vZnMgZm9yIHRoZSBtb3JlIGxpa2VseSBzY3JpcHRzLlxuICB3aGlsZSAocXVldWUuc2l6ZSA+IDEpIHtcbiAgICAvLyBXZSBjYW4gc2FmZWx5IGV4cGVjdCB0d28gcG9sbHMgdG8gcmV0dXJuIG5vbi1udWxsIGVsZW1lbnRzIHNpbmNlIHdlJ3ZlXG4gICAgLy8gY2hlY2tlZCB0aGF0IHRoZSBxdWV1ZSBoYXMgYXQgbGVhc3QgdHdvIGVsZW1lbnRzIGJlZm9yZSBsb29waW5nLlxuICAgIGNvbnN0IGNoaWxkMSA9IHF1ZXVlLnBvbGwoKSBhcyBXZWlnaHRlZFRhcFNjcmlwdDtcbiAgICBjb25zdCBjaGlsZDIgPSBxdWV1ZS5wb2xsKCkgYXMgV2VpZ2h0ZWRUYXBTY3JpcHQ7XG5cbiAgICBPYmplY3QudmFsdWVzKGNoaWxkMS5wYXRocykuZm9yRWFjaCgocGF0aCkgPT4gcGF0aC5wdXNoKGNoaWxkMi50YWdnZWRIYXNoKSk7XG4gICAgT2JqZWN0LnZhbHVlcyhjaGlsZDIucGF0aHMpLmZvckVhY2goKHBhdGgpID0+IHBhdGgucHVzaChjaGlsZDEudGFnZ2VkSGFzaCkpO1xuXG4gICAgcXVldWUuYWRkKHtcbiAgICAgIHRhZ2dlZEhhc2g6IGhhc2hUYXBCcmFuY2goY2hpbGQxLnRhZ2dlZEhhc2gsIGNoaWxkMi50YWdnZWRIYXNoKSxcbiAgICAgIHdlaWdodDogY2hpbGQxLndlaWdodCArIGNoaWxkMi53ZWlnaHQsXG4gICAgICBwYXRoczogeyAuLi5jaGlsZDEucGF0aHMsIC4uLmNoaWxkMi5wYXRocyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQWZ0ZXIgdGhlIHdoaWxlIGxvb3AgYWJvdmUgY29tcGxldGVzIHdlIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGVsZW1lbnRcbiAgLy8gcmVtYWluaW5nIGluIHRoZSBxdWV1ZSwgd2hpY2ggd2UgY2FuIHNhZmVseSBleHRyYWN0IGJlbG93LlxuICBjb25zdCByb290Tm9kZSA9IHF1ZXVlLnBvbGwoKSBhcyBXZWlnaHRlZFRhcFNjcmlwdDtcblxuICBjb25zdCBwYXRocyA9IE9iamVjdC5lbnRyaWVzKHJvb3ROb2RlLnBhdGhzKS5yZWR1Y2UoKGFjYywgW2luZGV4LCBwYXRoXSkgPT4ge1xuICAgIGFjY1tOdW1iZXIoaW5kZXgpXSA9IHBhdGg7IC8vIFRPRE86IFdoeSBkb2Vzbid0IFRTIGtub3cgaXQncyBhIG51bWJlcj9cbiAgICByZXR1cm4gYWNjO1xuICB9LCBBcnJheShzY3JpcHRzLmxlbmd0aCkpO1xuICByZXR1cm4geyByb290OiByb290Tm9kZS50YWdnZWRIYXNoLCBwYXRocyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udHJvbEJsb2NrKFxuICBwYXJpdHk6IDAgfCAxLFxuICBwdWJrZXk6IFVpbnQ4QXJyYXksXG4gIHBhdGg6IEJ1ZmZlcltdLFxuICBsZWFmVmVyc2lvbiA9IElOSVRJQUxfVEFQU0NSSVBUX1ZFUlNJT05cbik6IEJ1ZmZlciB7XG4gIGNvbnN0IHBhcml0eVZlcnNpb24gPSBsZWFmVmVyc2lvbiArIHBhcml0eTtcblxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLm9mKHBhcml0eVZlcnNpb24pLCBwdWJrZXksIC4uLnBhdGhdKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLZXlQYXRoV2l0bmVzcyB7XG4gIHNwZW5kVHlwZTogJ0tleSc7XG4gIHNpZ25hdHVyZTogQnVmZmVyO1xuICBhbm5leD86IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JpcHRQYXRoV2l0bmVzcyB7XG4gIHNwZW5kVHlwZTogJ1NjcmlwdCc7XG4gIHNjcmlwdFNpZzogQnVmZmVyW107XG4gIHRhcHNjcmlwdDogQnVmZmVyO1xuICBjb250cm9sQmxvY2s6IEJ1ZmZlcjtcbiAgYW5uZXg/OiBCdWZmZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJvbEJsb2NrIHtcbiAgcGFyaXR5OiBudW1iZXI7XG4gIGludGVybmFsUHVia2V5OiBCdWZmZXI7XG4gIGxlYWZWZXJzaW9uOiBudW1iZXI7XG4gIHBhdGg6IEJ1ZmZlcltdO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIHRhcHJvb3Qgd2l0bmVzcyBzdGFjayBhbmQgZXh0cmFjdHMga2V5IGRhdGEgZWxlbWVudHMuXG4gKiBAcGFyYW0gd2l0bmVzc1N0YWNrXG4gKiBAcmV0dXJucyB7U2NyaXB0UGF0aFdpdG5lc3N8S2V5UGF0aFdpdG5lc3N9IGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlXG4gKiBwYXJzZWQgd2l0bmVzcyBmb3IgYSBzY3JpcHQgcGF0aCBvciBrZXkgcGF0aCBzcGVuZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgd2l0bmVzcyBzdGFjayBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBCSVAgMzQxIHNjcmlwdCB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhcHJvb3RXaXRuZXNzKHdpdG5lc3NTdGFjazogQnVmZmVyW10pOiBTY3JpcHRQYXRoV2l0bmVzcyB8IEtleVBhdGhXaXRuZXNzIHtcbiAgbGV0IGFubmV4O1xuICBpZiAod2l0bmVzc1N0YWNrLmxlbmd0aCA+PSAyICYmIHdpdG5lc3NTdGFja1t3aXRuZXNzU3RhY2subGVuZ3RoIC0gMV1bMF0gPT09IDB4NTApIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIHdpdG5lc3MgZWxlbWVudHMsIGFuZCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbGFzdCBlbGVtZW50IGlzXG4gICAgLy8gMHg1MCwgdGhpcyBsYXN0IGVsZW1lbnQgaXMgY2FsbGVkIGFubmV4IGEgYW5kIGlzIHJlbW92ZWQgZnJvbSB0aGUgd2l0bmVzcyBzdGFja1xuICAgIGFubmV4ID0gd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAxXTtcbiAgICB3aXRuZXNzU3RhY2sgPSB3aXRuZXNzU3RhY2suc2xpY2UoMCwgLTEpO1xuICB9XG5cbiAgaWYgKHdpdG5lc3NTdGFjay5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3aXRuZXNzIHN0YWNrIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudCcpO1xuICB9IGVsc2UgaWYgKHdpdG5lc3NTdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBrZXkgcGF0aCBzcGVuZFxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHdpdG5lc3NTdGFja1swXTtcbiAgICBpZiAoIWJzY3JpcHQuaXNDYW5vbmljYWxTY2hub3JyU2lnbmF0dXJlKHNpZ25hdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduYXR1cmUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3BlbmRUeXBlOiAnS2V5Jywgc2lnbmF0dXJlLCBhbm5leCB9O1xuICB9XG5cbiAgLy8gc2NyaXB0IHBhdGggc3BlbmRcbiAgLy8gc2Vjb25kIHRvIGxhc3QgZWxlbWVudCBpcyB0aGUgdGFwc2NyaXB0XG4gIGNvbnN0IHRhcHNjcmlwdCA9IHdpdG5lc3NTdGFja1t3aXRuZXNzU3RhY2subGVuZ3RoIC0gMl07XG4gIGNvbnN0IHRhcHNjcmlwdENodW5rcyA9IGJzY3JpcHQuZGVjb21waWxlKHRhcHNjcmlwdCk7XG5cbiAgaWYgKCF0YXBzY3JpcHRDaHVua3MgfHwgdGFwc2NyaXB0Q2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFwc2NyaXB0IGlzIG5vdCBhIHZhbGlkIHNjcmlwdCcpO1xuICB9XG5cbiAgLy8gVGhlIGxhc3Qgc3RhY2sgZWxlbWVudCBpcyBjYWxsZWQgdGhlIGNvbnRyb2wgYmxvY2sgYywgYW5kIG11c3QgaGF2ZSBsZW5ndGggMzMgKyAzMm0sXG4gIC8vIGZvciBhIHZhbHVlIG9mIG0gdGhhdCBpcyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTI4LCBpbmNsdXNpdmVcbiAgY29uc3QgY29udHJvbEJsb2NrID0gd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAxXTtcbiAgaWYgKGNvbnRyb2xCbG9jay5sZW5ndGggPCAzMyB8fCBjb250cm9sQmxvY2subGVuZ3RoID4gMzMgKyAzMiAqIDEyOCB8fCBjb250cm9sQmxvY2subGVuZ3RoICUgMzIgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY29udHJvbCBibG9jayBsZW5ndGgnKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3BlbmRUeXBlOiAnU2NyaXB0JyxcbiAgICBzY3JpcHRTaWc6IHdpdG5lc3NTdGFjay5zbGljZSgwLCAtMiksXG4gICAgdGFwc2NyaXB0LFxuICAgIGNvbnRyb2xCbG9jayxcbiAgICBhbm5leCxcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSB0YXByb290IGNvbnRyb2wgYmxvY2suXG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gY29udHJvbEJsb2NrIHRoZSBjb250cm9sIGJsb2NrIHRvIHBhcnNlXG4gKiBAcmV0dXJucyB7Q29udHJvbEJsb2NrfSB0aGUgcGFyc2VkIGNvbnRyb2wgYmxvY2tcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgd2l0bmVzcyBzdGFjayBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBCSVAgMzQxIHNjcmlwdCB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbnRyb2xCbG9jayhlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsIGNvbnRyb2xCbG9jazogQnVmZmVyKTogQ29udHJvbEJsb2NrIHtcbiAgaWYgKChjb250cm9sQmxvY2subGVuZ3RoIC0gMSkgJSAzMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY29udHJvbCBibG9jayBsZW5ndGgnKTtcbiAgfVxuXG4gIGNvbnN0IHBhcml0eSA9IGNvbnRyb2xCbG9ja1swXSAmIDB4MDE7XG5cbiAgLy8gTGV0IHAgPSBjWzE6MzNdIGFuZCBsZXQgUCA9IGxpZnRfeChpbnQocCkpIHdoZXJlIGxpZnRfeCBhbmQgWzpdIGFyZSBkZWZpbmVkIGFzIGluIEJJUDM0MC5cbiAgLy8gRmFpbCBpZiB0aGlzIHBvaW50IGlzIG5vdCBvbiB0aGUgY3VydmVcbiAgY29uc3QgaW50ZXJuYWxQdWJrZXkgPSBjb250cm9sQmxvY2suc2xpY2UoMSwgMzMpO1xuICBpZiAoIWVjYy5pc1hPbmx5UG9pbnQoaW50ZXJuYWxQdWJrZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBwdWJrZXkgaXMgbm90IGFuIEVDIHBvaW50Jyk7XG4gIH1cblxuICAvLyBUaGUgbGVhZiB2ZXJzaW9uIGNhbm5vdCBiZSAweDUwIGFzIHRoYXQgd291bGQgcmVzdWx0IGluIGFtYmlndWl0eSB3aXRoIHRoZSBhbm5leC5cbiAgY29uc3QgbGVhZlZlcnNpb24gPSBjb250cm9sQmxvY2tbMF0gJiAweGZlO1xuICBpZiAobGVhZlZlcnNpb24gPT09IDB4NTApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGVhZiB2ZXJzaW9uJyk7XG4gIH1cblxuICBjb25zdCBwYXRoOiBCdWZmZXJbXSA9IFtdO1xuICBmb3IgKGxldCBqID0gMzM7IGogPCBjb250cm9sQmxvY2subGVuZ3RoOyBqICs9IDMyKSB7XG4gICAgcGF0aC5wdXNoKGNvbnRyb2xCbG9jay5zbGljZShqLCBqICsgMzIpKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFyaXR5LFxuICAgIGludGVybmFsUHVia2V5LFxuICAgIGxlYWZWZXJzaW9uLFxuICAgIHBhdGgsXG4gIH07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgdGFwbGVhZiBoYXNoIGZyb20gYSBjb250cm9sIGJsb2NrIGFuZCBzY3JpcHQuXG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gY29udHJvbEJsb2NrIHRoZSBjb250cm9sIGJsb2NrLCBlaXRoZXIgcmF3IG9yIHBhcnNlZFxuICogQHBhcmFtIHRhcHNjcmlwdCB0aGUgbGVhZiBzY3JpcHQgY29ycmVzZHBvbmRpbmcgdG8gdGhlIGNvbnRyb2wgYmxvY2tcbiAqIEByZXR1cm5zIHtCdWZmZXJ9IHRoZSB0YXBsZWFmIGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcGxlYWZIYXNoKFxuICBlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsXG4gIGNvbnRyb2xCbG9jazogQnVmZmVyIHwgQ29udHJvbEJsb2NrLFxuICB0YXBzY3JpcHQ6IEJ1ZmZlclxuKTogQnVmZmVyIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250cm9sQmxvY2spKSB7XG4gICAgY29udHJvbEJsb2NrID0gcGFyc2VDb250cm9sQmxvY2soZWNjLCBjb250cm9sQmxvY2spO1xuICB9XG4gIGNvbnN0IHsgbGVhZlZlcnNpb24gfSA9IGNvbnRyb2xCbG9jaztcblxuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKFxuICAgICdUYXBMZWFmJyxcbiAgICBCdWZmZXIuY29uY2F0KFtCdWZmZXIub2YobGVhZlZlcnNpb24pLCBzZXJpYWxpemVTY3JpcHRTaXplKHRhcHNjcmlwdCksIHRhcHNjcmlwdF0pXG4gICk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgdGFwdHJlZSByb290IGhhc2ggZnJvbSBhIGNvbnRyb2wgYmxvY2sgYW5kIHNjcmlwdC5cbiAqIEBwYXJhbSBlY2MgRWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBjb250cm9sQmxvY2sgdGhlIGNvbnRyb2wgYmxvY2ssIGVpdGhlciByYXcgb3IgcGFyc2VkXG4gKiBAcGFyYW0gdGFwc2NyaXB0IHRoZSBsZWFmIHNjcmlwdCBjb3JyZXNkcG9uZGluZyB0byB0aGUgY29udHJvbCBibG9ja1xuICogQHBhcmFtIHRhcGxlYWZIYXNoIHRoZSBsZWFmIGhhc2ggaWYgYWxyZWFkeSBjYWxjdWxhdGVkXG4gKiBAcmV0dXJucyB7QnVmZmVyfSB0aGUgdGFwdHJlZSByb290IGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcHRyZWVSb290KFxuICBlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsXG4gIGNvbnRyb2xCbG9jazogQnVmZmVyIHwgQ29udHJvbEJsb2NrLFxuICB0YXBzY3JpcHQ6IEJ1ZmZlcixcbiAgdGFwbGVhZkhhc2g/OiBCdWZmZXJcbik6IEJ1ZmZlciB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY29udHJvbEJsb2NrKSkge1xuICAgIGNvbnRyb2xCbG9jayA9IHBhcnNlQ29udHJvbEJsb2NrKGVjYywgY29udHJvbEJsb2NrKTtcbiAgfVxuICBjb25zdCB7IHBhdGggfSA9IGNvbnRyb2xCbG9jaztcblxuICB0YXBsZWFmSGFzaCA9IHRhcGxlYWZIYXNoIHx8IGdldFRhcGxlYWZIYXNoKGVjYywgY29udHJvbEJsb2NrLCB0YXBzY3JpcHQpO1xuXG4gIC8vIGB0YXB0cmVlTWVya2xlSGFzaGAgYmVnaW5zIGFzIG91ciB0YXBzY3JpcHQgdGFwbGVhZiBoYXNoIGFuZCBpdHMgdmFsdWUgaXRlcmF0ZXNcbiAgLy8gdGhyb3VnaCBpdHMgcGFyZW50IHRhcGJyYW5jaCBoYXNoZXMgdW50aWwgaXQgZW5kcyB1cCBhcyB0aGUgdGFwdHJlZSByb290IGhhc2hcbiAgbGV0IHRhcHRyZWVNZXJrbGVIYXNoID0gdGFwbGVhZkhhc2g7XG4gIGZvciAoY29uc3QgdGFwdHJlZVNpYmxpbmdIYXNoIG9mIHBhdGgpIHtcbiAgICB0YXB0cmVlTWVya2xlSGFzaCA9XG4gICAgICBCdWZmZXIuY29tcGFyZSh0YXB0cmVlTWVya2xlSGFzaCwgdGFwdHJlZVNpYmxpbmdIYXNoKSA9PT0gLTFcbiAgICAgICAgPyBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcEJyYW5jaCcsIEJ1ZmZlci5jb25jYXQoW3RhcHRyZWVNZXJrbGVIYXNoLCB0YXB0cmVlU2libGluZ0hhc2hdKSlcbiAgICAgICAgOiBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcEJyYW5jaCcsIEJ1ZmZlci5jb25jYXQoW3RhcHRyZWVTaWJsaW5nSGFzaCwgdGFwdHJlZU1lcmtsZUhhc2hdKSk7XG4gIH1cblxuICByZXR1cm4gdGFwdHJlZU1lcmtsZUhhc2g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUd2Vha2VkT3V0cHV0S2V5KHBheW1lbnQ6IGJwYXltZW50cy5QYXltZW50KTogQnVmZmVyIHtcbiAgYXNzZXJ0KHBheW1lbnQub3V0cHV0KTtcbiAgaWYgKHBheW1lbnQub3V0cHV0Lmxlbmd0aCA9PT0gMzQpIHtcbiAgICByZXR1cm4gcGF5bWVudC5vdXRwdXQ/LnN1YmFycmF5KDIpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBwMnRyIHR3ZWFrZWQgb3V0cHV0IGtleSBzaXplICR7cGF5bWVudC5vdXRwdXQubGVuZ3RofWApO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIG91dHB1dCBzY3JpcHQgZm9yIGVpdGhlciBzY3JpcHQgcGF0aCBpbnB1dCBjb250cm9sQmxvY2tcbiAqICYgbGVhZlNjcmlwdCBPUiBrZXkgcGF0aCBpbnB1dCBpbnRlcm5hbFB1YktleSAmIHRhcHRyZWVSb290XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYXByb290T3V0cHV0U2NyaXB0KFxuICBwMnRyQXJnczogeyBpbnRlcm5hbFB1YktleTogQnVmZmVyOyB0YXB0cmVlUm9vdDogQnVmZmVyIH0gfCB7IGNvbnRyb2xCbG9jazogQnVmZmVyOyBsZWFmU2NyaXB0OiBCdWZmZXIgfVxuKTogQnVmZmVyIHtcbiAgbGV0IGludGVybmFsUHViS2V5OiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIGxldCB0YXB0cmVlUm9vdDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoJ2ludGVybmFsUHViS2V5JyBpbiBwMnRyQXJncykge1xuICAgIGludGVybmFsUHViS2V5ID0gcDJ0ckFyZ3MuaW50ZXJuYWxQdWJLZXk7XG4gICAgdGFwdHJlZVJvb3QgPSBwMnRyQXJncy50YXB0cmVlUm9vdDtcbiAgfSBlbHNlIHtcbiAgICBpbnRlcm5hbFB1YktleSA9IHBhcnNlQ29udHJvbEJsb2NrKGVjY0xpYiwgcDJ0ckFyZ3MuY29udHJvbEJsb2NrKS5pbnRlcm5hbFB1YmtleTtcbiAgICB0YXB0cmVlUm9vdCA9IGdldFRhcHRyZWVSb290KGVjY0xpYiwgcDJ0ckFyZ3MuY29udHJvbEJsb2NrLCBwMnRyQXJncy5sZWFmU2NyaXB0KTtcbiAgfVxuICBjb25zdCBvdXRwdXRLZXkgPSB0YXBUd2Vha1B1YmtleShlY2NMaWIsIGludGVybmFsUHViS2V5LCB0YXB0cmVlUm9vdCkueE9ubHlQdWJrZXk7XG4gIHJldHVybiBic2NyaXB0LmNvbXBpbGUoW2JzY3JpcHQuT1BTLk9QXzEsIEJ1ZmZlci5mcm9tKG91dHB1dEtleSldKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB4LW9ubHkgdGFwcm9vdCBvdXRwdXQga2V5ICh0YXBPdXRwdXRLZXkpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXByb290T3V0cHV0S2V5KG91dHB1dFNjcmlwdDogQnVmZmVyIHwgKG51bWJlciB8IEJ1ZmZlcilbXSk6IEJ1ZmZlciB7XG4gIGNvbnN0IG91dHB1dERlY29tcGlsZWQgPSBic2NyaXB0LmRlY29tcGlsZShvdXRwdXRTY3JpcHQpO1xuICBpZiAob3V0cHV0RGVjb21waWxlZD8ubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRhcHJvb3Qgb3V0cHV0IHNjcmlwdCcpO1xuICB9XG4gIGNvbnN0IFtvcDEsIG91dHB1dEtleV0gPSBvdXRwdXREZWNvbXBpbGVkO1xuICBpZiAob3AxICE9PSBic2NyaXB0Lk9QUy5PUF8xIHx8ICFCdWZmZXIuaXNCdWZmZXIob3V0cHV0S2V5KSB8fCBvdXRwdXRLZXkubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0YXByb290IG91dHB1dCBzY3JpcHQnKTtcbiAgfVxuICByZXR1cm4gb3V0cHV0S2V5O1xufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/input.ts"],"names":[],"mappings":"
|
|
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;sBAWF,MAAM"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// OP_0 [signatures ...]
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.check =
|
|
4
|
+
exports.check = check;
|
|
5
5
|
const __1 = require("../../");
|
|
6
6
|
const __2 = require("../../");
|
|
7
7
|
function partialSignature(value) {
|
|
@@ -18,8 +18,7 @@ function check(script, allowIncomplete) {
|
|
|
18
18
|
}
|
|
19
19
|
return chunks.slice(1).every(__1.script.isCanonicalScriptSignature);
|
|
20
20
|
}
|
|
21
|
-
exports.check = check;
|
|
22
21
|
check.toJSON = () => {
|
|
23
22
|
return 'multisig input';
|
|
24
23
|
};
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVtcGxhdGVzL211bHRpc2lnL2lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx3QkFBd0I7O0FBVXhCLHNCQVVDO0FBakJELDhCQUEyQztBQUMzQyw4QkFBaUM7QUFFakMsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFzQjtJQUM5QyxPQUFPLEtBQUssS0FBSyxXQUFPLENBQUMsSUFBSSxJQUFJLFVBQU8sQ0FBQywwQkFBMEIsQ0FBQyxLQUFlLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQsU0FBZ0IsS0FBSyxDQUFDLE1BQXNCLEVBQUUsZUFBeUI7SUFDckUsTUFBTSxNQUFNLEdBQUcsVUFBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQVUsQ0FBQztJQUNsRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3BDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQU8sQ0FBQyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFN0MsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELE9BQVEsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQWMsQ0FBQyxLQUFLLENBQUMsVUFBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFDakYsQ0FBQztBQUNELEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBVyxFQUFFO0lBQzFCLE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gT1BfMCBbc2lnbmF0dXJlcyAuLi5dXG5cbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB7IHNjcmlwdCBhcyBic2NyaXB0IH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB7IG9wY29kZXMgfSBmcm9tICcuLi8uLi8nO1xuXG5mdW5jdGlvbiBwYXJ0aWFsU2lnbmF0dXJlKHZhbHVlOiBudW1iZXIgfCBCdWZmZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvcGNvZGVzLk9QXzAgfHwgYnNjcmlwdC5pc0Nhbm9uaWNhbFNjcmlwdFNpZ25hdHVyZSh2YWx1ZSBhcyBCdWZmZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2soc2NyaXB0OiBCdWZmZXIgfCBTdGFjaywgYWxsb3dJbmNvbXBsZXRlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBjaHVua3MgPSBic2NyaXB0LmRlY29tcGlsZShzY3JpcHQpIGFzIFN0YWNrO1xuICBpZiAoY2h1bmtzLmxlbmd0aCA8IDIpIHJldHVybiBmYWxzZTtcbiAgaWYgKGNodW5rc1swXSAhPT0gb3Bjb2Rlcy5PUF8wKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGFsbG93SW5jb21wbGV0ZSkge1xuICAgIHJldHVybiBjaHVua3Muc2xpY2UoMSkuZXZlcnkocGFydGlhbFNpZ25hdHVyZSk7XG4gIH1cblxuICByZXR1cm4gKGNodW5rcy5zbGljZSgxKSBhcyBCdWZmZXJbXSkuZXZlcnkoYnNjcmlwdC5pc0Nhbm9uaWNhbFNjcmlwdFNpZ25hdHVyZSk7XG59XG5jaGVjay50b0pTT04gPSAoKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuICdtdWx0aXNpZyBpbnB1dCc7XG59O1xuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/output.ts"],"names":[],"mappings":"
|
|
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;sBAmBF,MAAM"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// m [pubKeys ...] n OP_CHECKMULTISIG
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.check =
|
|
4
|
+
exports.check = check;
|
|
5
5
|
const __1 = require("../../");
|
|
6
6
|
const __2 = require("../../");
|
|
7
7
|
const types = require("bitcoinjs-lib/src/types");
|
|
@@ -31,8 +31,7 @@ function check(script, allowIncomplete) {
|
|
|
31
31
|
const keys = chunks.slice(1, -2);
|
|
32
32
|
return keys.every(__1.script.isCanonicalPubKey);
|
|
33
33
|
}
|
|
34
|
-
exports.check = check;
|
|
35
34
|
check.toJSON = () => {
|
|
36
35
|
return 'multi-sig output';
|
|
37
36
|
};
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RlbXBsYXRlcy9tdWx0aXNpZy9vdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHFDQUFxQzs7QUFRckMsc0JBa0JDO0FBdkJELDhCQUEyQztBQUMzQyw4QkFBaUM7QUFDakMsaURBQWlEO0FBQ2pELE1BQU0sV0FBVyxHQUFHLFdBQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXO0FBRXBELFNBQWdCLEtBQUssQ0FBQyxNQUFzQixFQUFFLGVBQXlCO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLFVBQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFVLENBQUM7SUFFbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNwQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLFdBQU8sQ0FBQyxnQkFBZ0I7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzNELE1BQU0sQ0FBQyxHQUFJLE1BQU0sQ0FBQyxDQUFDLENBQVksR0FBRyxXQUFXLENBQUM7SUFDOUMsTUFBTSxDQUFDLEdBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFZLEdBQUcsV0FBVyxDQUFDO0lBRTlELElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFDLElBQUksZUFBZTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWpDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFhLENBQUM7SUFDN0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFDRCxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQVcsRUFBRTtJQUMxQixPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIG0gW3B1YktleXMgLi4uXSBuIE9QX0NIRUNLTVVMVElTSUdcblxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHsgb3Bjb2RlcyB9IGZyb20gJy4uLy4uLyc7XG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tICdiaXRjb2luanMtbGliL3NyYy90eXBlcyc7XG5jb25zdCBPUF9JTlRfQkFTRSA9IG9wY29kZXMuT1BfUkVTRVJWRUQ7IC8vIE9QXzEgLSAxXG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVjayhzY3JpcHQ6IEJ1ZmZlciB8IFN0YWNrLCBhbGxvd0luY29tcGxldGU/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNodW5rcyA9IGJzY3JpcHQuZGVjb21waWxlKHNjcmlwdCkgYXMgU3RhY2s7XG5cbiAgaWYgKGNodW5rcy5sZW5ndGggPCA0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdICE9PSBvcGNvZGVzLk9QX0NIRUNLTVVMVElTSUcpIHJldHVybiBmYWxzZTtcbiAgaWYgKCF0eXBlcy5OdW1iZXIoY2h1bmtzWzBdKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIXR5cGVzLk51bWJlcihjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDJdKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBtID0gKGNodW5rc1swXSBhcyBudW1iZXIpIC0gT1BfSU5UX0JBU0U7XG4gIGNvbnN0IG4gPSAoY2h1bmtzW2NodW5rcy5sZW5ndGggLSAyXSBhcyBudW1iZXIpIC0gT1BfSU5UX0JBU0U7XG5cbiAgaWYgKG0gPD0gMCkgcmV0dXJuIGZhbHNlO1xuICBpZiAobiA+IDE2KSByZXR1cm4gZmFsc2U7XG4gIGlmIChtID4gbikgcmV0dXJuIGZhbHNlO1xuICBpZiAobiAhPT0gY2h1bmtzLmxlbmd0aCAtIDMpIHJldHVybiBmYWxzZTtcbiAgaWYgKGFsbG93SW5jb21wbGV0ZSkgcmV0dXJuIHRydWU7XG5cbiAgY29uc3Qga2V5cyA9IGNodW5rcy5zbGljZSgxLCAtMikgYXMgQnVmZmVyW107XG4gIHJldHVybiBrZXlzLmV2ZXJ5KGJzY3JpcHQuaXNDYW5vbmljYWxQdWJLZXkpO1xufVxuY2hlY2sudG9KU09OID0gKCk6IHN0cmluZyA9PiB7XG4gIHJldHVybiAnbXVsdGktc2lnIG91dHB1dCc7XG59O1xuIl19
|