@bitgo/abstract-utxo 10.11.1 → 10.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.isTaprootChain = isTaprootChain;
37
+ exports.toNetworkName = toNetworkName;
38
+ exports.createEmptyWasmPsbt = createEmptyWasmPsbt;
39
+ exports.addWalletInputsToWasmPsbt = addWalletInputsToWasmPsbt;
40
+ exports.addOutputToWasmPsbt = addOutputToWasmPsbt;
41
+ exports.wasmPsbtToUtxolibPsbt = wasmPsbtToUtxolibPsbt;
42
+ exports.createBackupKeyRecoveryPsbt = createBackupKeyRecoveryPsbt;
43
+ exports.getRecoveryAmount = getRecoveryAmount;
44
+ const utxolib = __importStar(require("@bitgo/utxo-lib"));
45
+ const unspents_1 = require("@bitgo/unspents");
46
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
47
+ const { chainCodesP2tr, chainCodesP2trMusig2 } = utxolib.bitgo;
48
+ /**
49
+ * Check if a chain code is for a taproot script type
50
+ */
51
+ function isTaprootChain(chain) {
52
+ return (chainCodesP2tr.includes(chain) || chainCodesP2trMusig2.includes(chain));
53
+ }
54
+ /**
55
+ * Convert utxolib Network to wasm-utxo network name
56
+ */
57
+ function toNetworkName(network) {
58
+ const networkName = utxolib.getNetworkName(network);
59
+ if (!networkName) {
60
+ throw new Error(`Invalid network`);
61
+ }
62
+ return networkName;
63
+ }
64
+ class InsufficientFundsError extends Error {
65
+ constructor(totalInputAmount, approximateFee, krsFee, recoveryAmount) {
66
+ super(`This wallet's balance is too low to pay the fees specified by the KRS provider.` +
67
+ `Existing balance on wallet: ${totalInputAmount.toString()}. ` +
68
+ `Estimated network fee for the recovery transaction: ${approximateFee.toString()}` +
69
+ `KRS fee to pay: ${krsFee.toString()}. ` +
70
+ `After deducting fees, your total recoverable balance is ${recoveryAmount.toString()}`);
71
+ this.totalInputAmount = totalInputAmount;
72
+ this.approximateFee = approximateFee;
73
+ this.krsFee = krsFee;
74
+ this.recoveryAmount = recoveryAmount;
75
+ }
76
+ }
77
+ /**
78
+ * Create a backup key recovery PSBT using utxolib (legacy implementation)
79
+ */
80
+ function createBackupKeyRecoveryPsbtUtxolib(network, rootWalletKeys, unspents, options) {
81
+ const { feeRateSatVB, recoveryDestination, keyRecoveryServiceFee, keyRecoveryServiceFeeAddress } = options;
82
+ const psbt = utxolib.bitgo.createPsbtForNetwork({ network });
83
+ utxolib.bitgo.addXpubsToPsbt(psbt, rootWalletKeys);
84
+ unspents.forEach((unspent) => {
85
+ utxolib.bitgo.addWalletUnspentToPsbt(psbt, unspent, rootWalletKeys, 'user', 'backup');
86
+ });
87
+ let dimensions = unspents_1.Dimensions.fromPsbt(psbt).plus(unspents_1.Dimensions.fromOutput({ script: utxolib.address.toOutputScript(recoveryDestination, network) }));
88
+ if (keyRecoveryServiceFeeAddress) {
89
+ dimensions = dimensions.plus(unspents_1.Dimensions.fromOutput({
90
+ script: utxolib.address.toOutputScript(keyRecoveryServiceFeeAddress, network),
91
+ }));
92
+ }
93
+ const approximateFee = BigInt(dimensions.getVSize() * feeRateSatVB);
94
+ const totalInputAmount = utxolib.bitgo.unspentSum(unspents, 'bigint');
95
+ const recoveryAmount = totalInputAmount - approximateFee - keyRecoveryServiceFee;
96
+ if (recoveryAmount < BigInt(0)) {
97
+ throw new InsufficientFundsError(totalInputAmount, approximateFee, keyRecoveryServiceFee, recoveryAmount);
98
+ }
99
+ psbt.addOutput({ script: utxolib.address.toOutputScript(recoveryDestination, network), value: recoveryAmount });
100
+ if (keyRecoveryServiceFeeAddress) {
101
+ psbt.addOutput({
102
+ script: utxolib.address.toOutputScript(keyRecoveryServiceFeeAddress, network),
103
+ value: keyRecoveryServiceFee,
104
+ });
105
+ }
106
+ return psbt;
107
+ }
108
+ /**
109
+ * Check if the network is a Zcash network
110
+ */
111
+ function isZcashNetwork(networkName) {
112
+ return networkName === 'zcash' || networkName === 'zcashTest';
113
+ }
114
+ /**
115
+ * Default block heights for Zcash networks if not provided.
116
+ * These should be set to a height after the latest network upgrade.
117
+ * TODO(BTC-2901): get the height from blockchair API instead of hardcoding.
118
+ */
119
+ const ZCASH_DEFAULT_BLOCK_HEIGHTS = {
120
+ zcash: 3146400,
121
+ zcashTest: 3536500,
122
+ };
123
+ /**
124
+ * Create an empty wasm-utxo BitGoPsbt for a given network.
125
+ * Handles Zcash networks specially by using ZcashBitGoPsbt.
126
+ *
127
+ * @param network - The network for the PSBT
128
+ * @param rootWalletKeys - The wallet keys
129
+ * @param options - Optional settings (e.g., blockHeight for Zcash)
130
+ * @returns A wasm-utxo BitGoPsbt instance
131
+ */
132
+ function createEmptyWasmPsbt(network, rootWalletKeys, options) {
133
+ const networkName = toNetworkName(network);
134
+ if (isZcashNetwork(networkName)) {
135
+ // For Zcash, use ZcashBitGoPsbt which requires block height to determine consensus branch ID
136
+ const blockHeight = options?.blockHeight ?? ZCASH_DEFAULT_BLOCK_HEIGHTS[networkName];
137
+ return wasm_utxo_1.fixedScriptWallet.ZcashBitGoPsbt.createEmpty(networkName, rootWalletKeys, {
138
+ blockHeight,
139
+ });
140
+ }
141
+ return wasm_utxo_1.fixedScriptWallet.BitGoPsbt.createEmpty(networkName, rootWalletKeys);
142
+ }
143
+ /**
144
+ * Add wallet inputs from unspents to a wasm-utxo BitGoPsbt.
145
+ * Handles taproot inputs by setting the appropriate signPath.
146
+ *
147
+ * @param wasmPsbt - The wasm-utxo BitGoPsbt to add inputs to
148
+ * @param unspents - The wallet unspents to add as inputs
149
+ * @param rootWalletKeys - The wallet keys
150
+ */
151
+ function addWalletInputsToWasmPsbt(wasmPsbt, unspents, rootWalletKeys) {
152
+ unspents.forEach((unspent) => {
153
+ const { txid, vout } = utxolib.bitgo.parseOutputId(unspent.id);
154
+ const signPath = isTaprootChain(unspent.chain)
155
+ ? { signer: 'user', cosigner: 'backup' }
156
+ : undefined;
157
+ // prevTx may be added dynamically in backupKeyRecovery for non-segwit inputs
158
+ const prevTx = unspent.prevTx;
159
+ wasmPsbt.addWalletInput({
160
+ txid,
161
+ vout,
162
+ value: unspent.value,
163
+ prevTx: prevTx,
164
+ }, rootWalletKeys, {
165
+ scriptId: { chain: unspent.chain, index: unspent.index },
166
+ signPath,
167
+ });
168
+ });
169
+ }
170
+ /**
171
+ * Add an output to a wasm-utxo BitGoPsbt.
172
+ *
173
+ * @param wasmPsbt - The wasm-utxo BitGoPsbt to add the output to
174
+ * @param address - The destination address
175
+ * @param value - The output value in satoshis
176
+ * @param network - The network (used to convert address to script)
177
+ * @returns The output index
178
+ */
179
+ function addOutputToWasmPsbt(wasmPsbt, address, value, network) {
180
+ const script = utxolib.address.toOutputScript(address, network);
181
+ return wasmPsbt.addOutput({ script: new Uint8Array(script), value });
182
+ }
183
+ /**
184
+ * Convert a wasm-utxo BitGoPsbt to a utxolib UtxoPsbt.
185
+ *
186
+ * @param wasmPsbt - The wasm-utxo BitGoPsbt to convert
187
+ * @param network - The network
188
+ * @returns A utxolib UtxoPsbt
189
+ */
190
+ function wasmPsbtToUtxolibPsbt(wasmPsbt, network) {
191
+ return utxolib.bitgo.createPsbtFromBuffer(Buffer.from(wasmPsbt.serialize()), network);
192
+ }
193
+ /**
194
+ * Create a backup key recovery PSBT using wasm-utxo
195
+ */
196
+ function createBackupKeyRecoveryPsbtWasm(network, rootWalletKeys, unspents, options) {
197
+ const { feeRateSatVB, recoveryDestination, keyRecoveryServiceFee, keyRecoveryServiceFeeAddress } = options;
198
+ // Create PSBT with wasm-utxo and add wallet inputs using shared utilities
199
+ const wasmPsbt = createEmptyWasmPsbt(network, rootWalletKeys, { blockHeight: options.blockHeight });
200
+ addWalletInputsToWasmPsbt(wasmPsbt, unspents, rootWalletKeys);
201
+ // Convert to utxolib PSBT temporarily for dimension calculation
202
+ const tempPsbt = wasmPsbtToUtxolibPsbt(wasmPsbt, network);
203
+ let dimensions = unspents_1.Dimensions.fromPsbt(tempPsbt).plus(unspents_1.Dimensions.fromOutput({ script: utxolib.address.toOutputScript(recoveryDestination, network) }));
204
+ if (keyRecoveryServiceFeeAddress) {
205
+ dimensions = dimensions.plus(unspents_1.Dimensions.fromOutput({
206
+ script: utxolib.address.toOutputScript(keyRecoveryServiceFeeAddress, network),
207
+ }));
208
+ }
209
+ const approximateFee = BigInt(dimensions.getVSize() * feeRateSatVB);
210
+ const totalInputAmount = utxolib.bitgo.unspentSum(unspents, 'bigint');
211
+ const recoveryAmount = totalInputAmount - approximateFee - keyRecoveryServiceFee;
212
+ if (recoveryAmount < BigInt(0)) {
213
+ throw new InsufficientFundsError(totalInputAmount, approximateFee, keyRecoveryServiceFee, recoveryAmount);
214
+ }
215
+ // Add outputs to wasm PSBT
216
+ addOutputToWasmPsbt(wasmPsbt, recoveryDestination, recoveryAmount, network);
217
+ if (keyRecoveryServiceFeeAddress) {
218
+ addOutputToWasmPsbt(wasmPsbt, keyRecoveryServiceFeeAddress, keyRecoveryServiceFee, network);
219
+ }
220
+ // Convert to utxolib PSBT for signing and return
221
+ return wasmPsbtToUtxolibPsbt(wasmPsbt, network);
222
+ }
223
+ /**
224
+ * Create a backup key recovery PSBT.
225
+ *
226
+ * @param network - The network for the PSBT
227
+ * @param rootWalletKeys - The wallet keys
228
+ * @param unspents - The unspents to include in the PSBT
229
+ * @param options - Options for creating the PSBT
230
+ * @param backend - Which backend to use for PSBT creation (default: 'wasm-utxo')
231
+ */
232
+ function createBackupKeyRecoveryPsbt(network, rootWalletKeys, unspents, options, backend = 'wasm-utxo') {
233
+ if (options.keyRecoveryServiceFee > 0 && !options.keyRecoveryServiceFeeAddress) {
234
+ throw new Error('keyRecoveryServiceFeeAddress is required when keyRecoveryServiceFee is provided');
235
+ }
236
+ if (backend === 'wasm-utxo') {
237
+ return createBackupKeyRecoveryPsbtWasm(network, rootWalletKeys, unspents, options);
238
+ }
239
+ else {
240
+ return createBackupKeyRecoveryPsbtUtxolib(network, rootWalletKeys, unspents, options);
241
+ }
242
+ }
243
+ function getRecoveryAmount(psbt, address) {
244
+ const recoveryOutputScript = utxolib.address.toOutputScript(address, psbt.network);
245
+ const output = psbt.txOutputs.find((o) => o.script.equals(recoveryOutputScript));
246
+ if (!output) {
247
+ throw new Error(`Recovery destination output not found in PSBT: ${address}`);
248
+ }
249
+ return output.value;
250
+ }
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9yZWNvdmVyeS9wc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLHdDQUlDO0FBS0Qsc0NBTUM7QUErR0Qsa0RBZ0JDO0FBVUQsOERBNEJDO0FBV0Qsa0RBUUM7QUFTRCxzREFLQztBQTJERCxrRUFnQkM7QUFFRCw4Q0FPQztBQTlURCx5REFBMkM7QUFDM0MsOENBQTZDO0FBQzdDLGdEQUFvRTtBQUtwRSxNQUFNLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQVcvRDs7R0FFRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxLQUFnQjtJQUM3QyxPQUFPLENBQ0osY0FBb0MsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUssb0JBQTBDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUNySCxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsYUFBYSxDQUFDLE9BQXdCO0lBQ3BELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sc0JBQXVCLFNBQVEsS0FBSztJQUN4QyxZQUNTLGdCQUF3QixFQUN4QixjQUFzQixFQUN0QixNQUFjLEVBQ2QsY0FBc0I7UUFFN0IsS0FBSyxDQUNILGlGQUFpRjtZQUMvRSwrQkFBK0IsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUk7WUFDOUQsdURBQXVELGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNsRixtQkFBbUIsTUFBTSxD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LENBQUMsQ0FBQyxDQUFDO0lBQ2pGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgRGltZW5zaW9ucyB9IGZyb20gJ0BiaXRnby91bnNwZW50cyc7XG5pbXBvcnQgeyBmaXhlZFNjcmlwdFdhbGxldCwgdXR4b2xpYkNvbXBhdCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG50eXBlIFJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cztcbnR5cGUgV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PiA9IHV0eG9saWIuYml0Z28uV2FsbGV0VW5zcGVudDxUTnVtYmVyPjtcblxuY29uc3QgeyBjaGFpbkNvZGVzUDJ0ciwgY2hhaW5Db2Rlc1AydHJNdXNpZzIgfSA9IHV0eG9saWIuYml0Z287XG5cbnR5cGUgQ2hhaW5Db2RlID0gdXR4b2xpYi5iaXRnby5DaGFpbkNvZGU7XG5cbi8qKlxuICogQmFja2VuZCB0byB1c2UgZm9yIFBTQlQgY3JlYXRpb24uXG4gKiAtICd3YXNtLXV0eG8nOiBVc2Ugd2FzbS11dHhvIGZvciBQU0JUIGNyZWF0aW9uIChkZWZhdWx0KVxuICogLSAndXR4b2xpYic6IFVzZSB1dHhvbGliIGZvciBQU0JUIGNyZWF0aW9uIChsZWdhY3kpXG4gKi9cbmV4cG9ydCB0eXBlIFBzYnRCYWNrZW5kID0gJ3dhc20tdXR4bycgfCAndXR4b2xpYic7XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBjaGFpbiBjb2RlIGlzIGZvciBhIHRhcHJvb3Qgc2NyaXB0IHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGFwcm9vdENoYWluKGNoYWluOiBDaGFpbkNvZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAoY2hhaW5Db2Rlc1AydHIgYXMgcmVhZG9ubHkgbnVtYmVyW10pLmluY2x1ZGVzKGNoYWluKSB8fCAoY2hhaW5Db2Rlc1AydHJNdXNpZzIgYXMgcmVhZG9ubHkgbnVtYmVyW10pLmluY2x1ZGVzKGNoYWluKVxuICApO1xufVxuXG4vKipcbiAqIENvbnZlcnQgdXR4b2xpYiBOZXR3b3JrIHRvIHdhc20tdXR4byBuZXR3b3JrIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTmV0d29ya05hbWUobmV0d29yazogdXR4b2xpYi5OZXR3b3JrKTogdXR4b2xpYkNvbXBhdC5VdHhvbGliTmFtZSB7XG4gIGNvbnN0IG5ldHdvcmtOYW1lID0gdXR4b2xpYi5nZXROZXR3b3JrTmFtZShuZXR3b3JrKTtcbiAgaWYgKCFuZXR3b3JrTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuZXR3b3JrYCk7XG4gIH1cbiAgcmV0dXJuIG5ldHdvcmtOYW1lO1xufVxuXG5jbGFzcyBJbnN1ZmZpY2llbnRGdW5kc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdG90YWxJbnB1dEFtb3VudDogYmlnaW50LFxuICAgIHB1YmxpYyBhcHByb3hpbWF0ZUZlZTogYmlnaW50LFxuICAgIHB1YmxpYyBrcnNGZWU6IGJpZ2ludCxcbiAgICBwdWJsaWMgcmVjb3ZlcnlBbW91bnQ6IGJpZ2ludFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIGBUaGlzIHdhbGxldCdzIGJhbGFuY2UgaXMgdG9vIGxvdyB0byBwYXkgdGhlIGZlZXMgc3BlY2lmaWVkIGJ5IHRoZSBLUlMgcHJvdmlkZXIuYCArXG4gICAgICAgIGBFeGlzdGluZyBiYWxhbmNlIG9uIHdhbGxldDogJHt0b3RhbElucHV0QW1vdW50LnRvU3RyaW5nKCl9LiBgICtcbiAgICAgICAgYEVzdGltYXRlZCBuZXR3b3JrIGZlZSBmb3IgdGhlIHJlY292ZXJ5IHRyYW5zYWN0aW9uOiAke2FwcHJveGltYXRlRmVlLnRvU3RyaW5nKCl9YCArXG4gICAgICAgIGBLUlMgZmVlIHRvIHBheTogJHtrcnNGZWUudG9TdHJpbmcoKX0uIGAgK1xuICAgICAgICBgQWZ0ZXIgZGVkdWN0aW5nIGZlZXMsIHlvdXIgdG90YWwgcmVjb3ZlcmFibGUgYmFsYW5jZSBpcyAke3JlY292ZXJ5QW1vdW50LnRvU3RyaW5nKCl9YFxuICAgICk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidE9wdGlvbnMge1xuICBmZWVSYXRlU2F0VkI6IG51bWJlcjtcbiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogc3RyaW5nO1xuICBrZXlSZWNvdmVyeVNlcnZpY2VGZWU6IGJpZ2ludDtcbiAga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogQmxvY2sgaGVpZ2h0IGZvciBaY2FzaCBuZXR3b3JrcyAocmVxdWlyZWQgdG8gZGV0ZXJtaW5lIGNvbnNlbnN1cyBicmFuY2ggSUQpICovXG4gIGJsb2NrSGVpZ2h0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhY2t1cCBrZXkgcmVjb3ZlcnkgUFNCVCB1c2luZyB1dHhvbGliIChsZWdhY3kgaW1wbGVtZW50YXRpb24pXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidFV0eG9saWIoXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10sXG4gIG9wdGlvbnM6IENyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidE9wdGlvbnNcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCB7IGZlZVJhdGVTYXRWQiwgcmVjb3ZlcnlEZXN0aW5hdGlvbiwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yayB9KTtcbiAgdXR4b2xpYi5iaXRnby5hZGRYcHVic1RvUHNidChwc2J0LCByb290V2FsbGV0S2V5cyk7XG4gIHVuc3BlbnRzLmZvckVhY2goKHVuc3BlbnQpID0+IHtcbiAgICB1dHhvbGliLmJpdGdvLmFkZFdhbGxldFVuc3BlbnRUb1BzYnQocHNidCwgdW5zcGVudCwgcm9vdFdhbGxldEtleXMsICd1c2VyJywgJ2JhY2t1cCcpO1xuICB9KTtcblxuICBsZXQgZGltZW5zaW9ucyA9IERpbWVuc2lvbnMuZnJvbVBzYnQocHNidCkucGx1cyhcbiAgICBEaW1lbnNpb25zLmZyb21PdXRwdXQoeyBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChyZWNvdmVyeURlc3RpbmF0aW9uLCBuZXR3b3JrKSB9KVxuICApO1xuXG4gIGlmIChrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzKSB7XG4gICAgZGltZW5zaW9ucyA9IGRpbWVuc2lvbnMucGx1cyhcbiAgICAgIERpbWVuc2lvbnMuZnJvbU91dHB1dCh7XG4gICAgICAgIHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MsIG5ldHdvcmspLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgY29uc3QgYXBwcm94aW1hdGVGZWUgPSBCaWdJbnQoZGltZW5zaW9ucy5nZXRWU2l6ZSgpICogZmVlUmF0ZVNhdFZCKTtcbiAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IHV0eG9saWIuYml0Z28udW5zcGVudFN1bSh1bnNwZW50cywgJ2JpZ2ludCcpO1xuICBjb25zdCByZWNvdmVyeUFtb3VudCA9IHRvdGFsSW5wdXRBbW91bnQgLSBhcHByb3hpbWF0ZUZlZSAtIGtleVJlY292ZXJ5U2VydmljZUZlZTtcblxuICBpZiAocmVjb3ZlcnlBbW91bnQgPCBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgSW5zdWZmaWNpZW50RnVuZHNFcnJvcih0b3RhbElucHV0QW1vdW50LCBhcHByb3hpbWF0ZUZlZSwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLCByZWNvdmVyeUFtb3VudCk7XG4gIH1cblxuICBwc2J0LmFkZE91dHB1dCh7IHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHJlY292ZXJ5RGVzdGluYXRpb24sIG5ldHdvcmspLCB2YWx1ZTogcmVjb3ZlcnlBbW91bnQgfSk7XG5cbiAgaWYgKGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MpIHtcbiAgICBwc2J0LmFkZE91dHB1dCh7XG4gICAgICBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzLCBuZXR3b3JrKSxcbiAgICAgIHZhbHVlOiBrZXlSZWNvdmVyeVNlcnZpY2VGZWUsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHNidDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgbmV0d29yayBpcyBhIFpjYXNoIG5ldHdvcmtcbiAqL1xuZnVuY3Rpb24gaXNaY2FzaE5ldHdvcmsobmV0d29ya05hbWU6IHV0eG9saWJDb21wYXQuVXR4b2xpYk5hbWUpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5ldHdvcmtOYW1lID09PSAnemNhc2gnIHx8IG5ldHdvcmtOYW1lID09PSAnemNhc2hUZXN0Jztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGJsb2NrIGhlaWdodHMgZm9yIFpjYXNoIG5ldHdvcmtzIGlmIG5vdCBwcm92aWRlZC5cbiAqIFRoZXNlIHNob3VsZCBiZSBzZXQgdG8gYSBoZWlnaHQgYWZ0ZXIgdGhlIGxhdGVzdCBuZXR3b3JrIHVwZ3JhZGUuXG4gKiBUT0RPKEJUQy0yOTAxKTogZ2V0IHRoZSBoZWlnaHQgZnJvbSBibG9ja2NoYWlyIEFQSSBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcuXG4gKi9cbmNvbnN0IFpDQVNIX0RFRkFVTFRfQkxPQ0tfSEVJR0hUUzogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgemNhc2g6IDMxNDY0MDAsXG4gIHpjYXNoVGVzdDogMzUzNjUwMCxcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYW4gZW1wdHkgd2FzbS11dHhvIFBTQlRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVFbXB0eVdhc21Qc2J0T3B0aW9ucyB7XG4gIC8qKiBCbG9jayBoZWlnaHQgZm9yIFpjYXNoIG5ldHdvcmtzIChyZXF1aXJlZCB0byBkZXRlcm1pbmUgY29uc2Vuc3VzIGJyYW5jaCBJRCkgKi9cbiAgYmxvY2tIZWlnaHQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGVtcHR5IHdhc20tdXR4byBCaXRHb1BzYnQgZm9yIGEgZ2l2ZW4gbmV0d29yay5cbiAqIEhhbmRsZXMgWmNhc2ggbmV0d29ya3Mgc3BlY2lhbGx5IGJ5IHVzaW5nIFpjYXNoQml0R29Qc2J0LlxuICpcbiAqIEBwYXJhbSBuZXR3b3JrIC0gVGhlIG5ldHdvcmsgZm9yIHRoZSBQU0JUXG4gKiBAcGFyYW0gcm9vdFdhbGxldEtleXMgLSBUaGUgd2FsbGV0IGtleXNcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgKGUuZy4sIGJsb2NrSGVpZ2h0IGZvciBaY2FzaClcbiAqIEByZXR1cm5zIEEgd2FzbS11dHhvIEJpdEdvUHNidCBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW1wdHlXYXNtUHNidChcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrLFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIG9wdGlvbnM/OiBDcmVhdGVFbXB0eVdhc21Qc2J0T3B0aW9uc1xuKTogZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0IHtcbiAgY29uc3QgbmV0d29ya05hbWUgPSB0b05ldHdvcmtOYW1lKG5ldHdvcmspO1xuXG4gIGlmIChpc1pjYXNoTmV0d29yayhuZXR3b3JrTmFtZSkpIHtcbiAgICAvLyBGb3IgWmNhc2gsIHVzZSBaY2FzaEJpdEdvUHNidCB3aGljaCByZXF1aXJlcyBibG9jayBoZWlnaHQgdG8gZGV0ZXJtaW5lIGNvbnNlbnN1cyBicmFuY2ggSURcbiAgICBjb25zdCBibG9ja0hlaWdodCA9IG9wdGlvbnM/LmJsb2NrSGVpZ2h0ID8/IFpDQVNIX0RFRkFVTFRfQkxPQ0tfSEVJR0hUU1tuZXR3b3JrTmFtZV07XG4gICAgcmV0dXJuIGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoQml0R29Qc2J0LmNyZWF0ZUVtcHR5KG5ldHdvcmtOYW1lIGFzICd6Y2FzaCcgfCAnemNhc2hUZXN0Jywgcm9vdFdhbGxldEtleXMsIHtcbiAgICAgIGJsb2NrSGVpZ2h0LFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidC5jcmVhdGVFbXB0eShuZXR3b3JrTmFtZSwgcm9vdFdhbGxldEtleXMpO1xufVxuXG4vKipcbiAqIEFkZCB3YWxsZXQgaW5wdXRzIGZyb20gdW5zcGVudHMgdG8gYSB3YXNtLXV0eG8gQml0R29Qc2J0LlxuICogSGFuZGxlcyB0YXByb290IGlucHV0cyBieSBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSBzaWduUGF0aC5cbiAqXG4gKiBAcGFyYW0gd2FzbVBzYnQgLSBUaGUgd2FzbS11dHhvIEJpdEdvUHNidCB0byBhZGQgaW5wdXRzIHRvXG4gKiBAcGFyYW0gdW5zcGVudHMgLSBUaGUgd2FsbGV0IHVuc3BlbnRzIHRvIGFkZCBhcyBpbnB1dHNcbiAqIEBwYXJhbSByb290V2FsbGV0S2V5cyAtIFRoZSB3YWxsZXQga2V5c1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkV2FsbGV0SW5wdXRzVG9XYXNtUHNidChcbiAgd2FzbVBzYnQ6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCxcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXNcbik6IHZvaWQge1xuICB1bnNwZW50cy5mb3JFYWNoKCh1bnNwZW50KSA9PiB7XG4gICAgY29uc3QgeyB0eGlkLCB2b3V0IH0gPSB1dHhvbGliLmJpdGdvLnBhcnNlT3V0cHV0SWQodW5zcGVudC5pZCk7XG4gICAgY29uc3Qgc2lnblBhdGg6IGZpeGVkU2NyaXB0V2FsbGV0LlNpZ25QYXRoIHwgdW5kZWZpbmVkID0gaXNUYXByb290Q2hhaW4odW5zcGVudC5jaGFpbilcbiAgICAgID8geyBzaWduZXI6ICd1c2VyJywgY29zaWduZXI6ICdiYWNrdXAnIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gcHJldlR4IG1heSBiZSBhZGRlZCBkeW5hbWljYWxseSBpbiBiYWNrdXBLZXlSZWNvdmVyeSBmb3Igbm9uLXNlZ3dpdCBpbnB1dHNcbiAgICBjb25zdCBwcmV2VHggPSAodW5zcGVudCBhcyBXYWxsZXRVbnNwZW50PGJpZ2ludD4gJiB7IHByZXZUeD86IEJ1ZmZlciB9KS5wcmV2VHg7XG5cbiAgICB3YXNtUHNidC5hZGRXYWxsZXRJbnB1dChcbiAgICAgIHtcbiAgICAgICAgdHhpZCxcbiAgICAgICAgdm91dCxcbiAgICAgICAgdmFsdWU6IHVuc3BlbnQudmFsdWUsXG4gICAgICAgIHByZXZUeDogcHJldlR4LFxuICAgICAgfSxcbiAgICAgIHJvb3RXYWxsZXRLZXlzLFxuICAgICAge1xuICAgICAgICBzY3JpcHRJZDogeyBjaGFpbjogdW5zcGVudC5jaGFpbiwgaW5kZXg6IHVuc3BlbnQuaW5kZXggfSxcbiAgICAgICAgc2lnblBhdGgsXG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQWRkIGFuIG91dHB1dCB0byBhIHdhc20tdXR4byBCaXRHb1BzYnQuXG4gKlxuICogQHBhcmFtIHdhc21Qc2J0IC0gVGhlIHdhc20tdXR4byBCaXRHb1BzYnQgdG8gYWRkIHRoZSBvdXRwdXQgdG9cbiAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBvdXRwdXQgdmFsdWUgaW4gc2F0b3NoaXNcbiAqIEBwYXJhbSBuZXR3b3JrIC0gVGhlIG5ldHdvcmsgKHVzZWQgdG8gY29udmVydCBhZGRyZXNzIHRvIHNjcmlwdClcbiAqIEByZXR1cm5zIFRoZSBvdXRwdXQgaW5kZXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZE91dHB1dFRvV2FzbVBzYnQoXG4gIHdhc21Qc2J0OiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQsXG4gIGFkZHJlc3M6IHN0cmluZyxcbiAgdmFsdWU6IGJpZ2ludCxcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrXG4pOiBudW1iZXIge1xuICBjb25zdCBzY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgbmV0d29yayk7XG4gIHJldHVybiB3YXNtUHNidC5hZGRPdXRwdXQoeyBzY3JpcHQ6IG5ldyBVaW50OEFycmF5KHNjcmlwdCksIHZhbHVlIH0pO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSB3YXNtLXV0eG8gQml0R29Qc2J0IHRvIGEgdXR4b2xpYiBVdHhvUHNidC5cbiAqXG4gKiBAcGFyYW0gd2FzbVBzYnQgLSBUaGUgd2FzbS11dHhvIEJpdEdvUHNidCB0byBjb252ZXJ0XG4gKiBAcGFyYW0gbmV0d29yayAtIFRoZSBuZXR3b3JrXG4gKiBAcmV0dXJucyBBIHV0eG9saWIgVXR4b1BzYnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhc21Qc2J0VG9VdHhvbGliUHNidChcbiAgd2FzbVBzYnQ6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCxcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrXG4pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHtcbiAgcmV0dXJuIHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21CdWZmZXIoQnVmZmVyLmZyb20od2FzbVBzYnQuc2VyaWFsaXplKCkpLCBuZXR3b3JrKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBiYWNrdXAga2V5IHJlY292ZXJ5IFBTQlQgdXNpbmcgd2FzbS11dHhvXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidFdhc20oXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10sXG4gIG9wdGlvbnM6IENyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidE9wdGlvbnNcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCB7IGZlZVJhdGVTYXRWQiwgcmVjb3ZlcnlEZXN0aW5hdGlvbiwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzIH0gPSBvcHRpb25zO1xuXG4gIC8vIENyZWF0ZSBQU0JUIHdpdGggd2FzbS11dHhvIGFuZCBhZGQgd2FsbGV0IGlucHV0cyB1c2luZyBzaGFyZWQgdXRpbGl0aWVzXG4gIGNvbnN0IHdhc21Qc2J0ID0gY3JlYXRlRW1wdHlXYXNtUHNidChuZXR3b3JrLCByb290V2FsbGV0S2V5cywgeyBibG9ja0hlaWdodDogb3B0aW9ucy5ibG9ja0hlaWdodCB9KTtcbiAgYWRkV2FsbGV0SW5wdXRzVG9XYXNtUHNidCh3YXNtUHNidCwgdW5zcGVudHMsIHJvb3RXYWxsZXRLZXlzKTtcblxuICAvLyBDb252ZXJ0IHRvIHV0eG9saWIgUFNCVCB0ZW1wb3JhcmlseSBmb3IgZGltZW5zaW9uIGNhbGN1bGF0aW9uXG4gIGNvbnN0IHRlbXBQc2J0ID0gd2FzbVBzYnRUb1V0eG9saWJQc2J0KHdhc21Qc2J0LCBuZXR3b3JrKTtcbiAgbGV0IGRpbWVuc2lvbnMgPSBEaW1lbnNpb25zLmZyb21Qc2J0KHRlbXBQc2J0KS5wbHVzKFxuICAgIERpbWVuc2lvbnMuZnJvbU91dHB1dCh7IHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHJlY292ZXJ5RGVzdGluYXRpb24sIG5ldHdvcmspIH0pXG4gICk7XG5cbiAgaWYgKGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MpIHtcbiAgICBkaW1lbnNpb25zID0gZGltZW5zaW9ucy5wbHVzKFxuICAgICAgRGltZW5zaW9ucy5mcm9tT3V0cHV0KHtcbiAgICAgICAgc2NyaXB0OiB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoa2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcywgbmV0d29yayksXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjb25zdCBhcHByb3hpbWF0ZUZlZSA9IEJpZ0ludChkaW1lbnNpb25zLmdldFZTaXplKCkgKiBmZWVSYXRlU2F0VkIpO1xuICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gdXR4b2xpYi5iaXRnby51bnNwZW50U3VtKHVuc3BlbnRzLCAnYmlnaW50Jyk7XG4gIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdG90YWxJbnB1dEFtb3VudCAtIGFwcHJveGltYXRlRmVlIC0ga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlO1xuXG4gIGlmIChyZWNvdmVyeUFtb3VudCA8IEJpZ0ludCgwKSkge1xuICAgIHRocm93IG5ldyBJbnN1ZmZpY2llbnRGdW5kc0Vycm9yKHRvdGFsSW5wdXRBbW91bnQsIGFwcHJveGltYXRlRmVlLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWUsIHJlY292ZXJ5QW1vdW50KTtcbiAgfVxuXG4gIC8vIEFkZCBvdXRwdXRzIHRvIHdhc20gUFNCVFxuICBhZGRPdXRwdXRUb1dhc21Qc2J0KHdhc21Qc2J0LCByZWNvdmVyeURlc3RpbmF0aW9uLCByZWNvdmVyeUFtb3VudCwgbmV0d29yayk7XG5cbiAgaWYgKGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MpIHtcbiAgICBhZGRPdXRwdXRUb1dhc21Qc2J0KHdhc21Qc2J0LCBrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWUsIG5ldHdvcmspO1xuICB9XG5cbiAgLy8gQ29udmVydCB0byB1dHhvbGliIFBTQlQgZm9yIHNpZ25pbmcgYW5kIHJldHVyblxuICByZXR1cm4gd2FzbVBzYnRUb1V0eG9saWJQc2J0KHdhc21Qc2J0LCBuZXR3b3JrKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBiYWNrdXAga2V5IHJlY292ZXJ5IFBTQlQuXG4gKlxuICogQHBhcmFtIG5ldHdvcmsgLSBUaGUgbmV0d29yayBmb3IgdGhlIFBTQlRcbiAqIEBwYXJhbSByb290V2FsbGV0S2V5cyAtIFRoZSB3YWxsZXQga2V5c1xuICogQHBhcmFtIHVuc3BlbnRzIC0gVGhlIHVuc3BlbnRzIHRvIGluY2x1ZGUgaW4gdGhlIFBTQlRcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgY3JlYXRpbmcgdGhlIFBTQlRcbiAqIEBwYXJhbSBiYWNrZW5kIC0gV2hpY2ggYmFja2VuZCB0byB1c2UgZm9yIFBTQlQgY3JlYXRpb24gKGRlZmF1bHQ6ICd3YXNtLXV0eG8nKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmFja3VwS2V5UmVjb3ZlcnlQc2J0KFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmssXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyxcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICBvcHRpb25zOiBDcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRPcHRpb25zLFxuICBiYWNrZW5kOiBQc2J0QmFja2VuZCA9ICd3YXNtLXV0eG8nXG4pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHtcbiAgaWYgKG9wdGlvbnMua2V5UmVjb3ZlcnlTZXJ2aWNlRmVlID4gMCAmJiAhb3B0aW9ucy5rZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzIGlzIHJlcXVpcmVkIHdoZW4ga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlIGlzIHByb3ZpZGVkJyk7XG4gIH1cblxuICBpZiAoYmFja2VuZCA9PT0gJ3dhc20tdXR4bycpIHtcbiAgICByZXR1cm4gY3JlYXRlQmFja3VwS2V5UmVjb3ZlcnlQc2J0V2FzbShuZXR3b3JrLCByb290V2FsbGV0S2V5cywgdW5zcGVudHMsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRVdHhvbGliKG5ldHdvcmssIHJvb3RXYWxsZXRLZXlzLCB1bnNwZW50cywgb3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlY292ZXJ5QW1vdW50KHBzYnQ6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQsIGFkZHJlc3M6IHN0cmluZyk6IGJpZ2ludCB7XG4gIGNvbnN0IHJlY292ZXJ5T3V0cHV0U2NyaXB0ID0gdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGFkZHJlc3MsIHBzYnQubmV0d29yayk7XG4gIGNvbnN0IG91dHB1dCA9IHBzYnQudHhPdXRwdXRzLmZpbmQoKG8pID0+IG8uc2NyaXB0LmVxdWFscyhyZWNvdmVyeU91dHB1dFNjcmlwdCkpO1xuICBpZiAoIW91dHB1dCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVjb3ZlcnkgZGVzdGluYXRpb24gb3V0cHV0IG5vdCBmb3VuZCBpbiBQU0JUOiAke2FkZHJlc3N9YCk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dC52YWx1ZTtcbn1cbiJdfQ==
@@ -42,6 +42,7 @@ const sinon = __importStar(require("sinon"));
42
42
  const nock = require("nock");
43
43
  const utxolib = __importStar(require("@bitgo/utxo-lib"));
44
44
  const sdk_core_1 = require("@bitgo/sdk-core");
45
+ const unspents_1 = require("@bitgo/unspents");
45
46
  const src_1 = require("../../../src");
46
47
  const util_1 = require("../util");
47
48
  const mock_1 = require("./mock");
@@ -91,6 +92,7 @@ const exoticWalletKeys = new utxolib.bitgo.RootWalletKeys(util_1.keychains, [
91
92
  ]);
92
93
  const keysFullSignedRecoveryExotic = getKeysForFullSignedRecovery(exoticWalletKeys.triple, walletPassphrase);
93
94
  function run(coin, scriptTypes, walletKeys, params, tags = []) {
95
+ const defaultFeeRateSatB = 100;
94
96
  describe(`Backup Key Recovery [${[coin.getChain(), ...tags, params.krsProvider].join(',')}]`, function () {
95
97
  const externalWallet = (0, util_1.getWalletKeys)('external');
96
98
  const recoveryDestination = (0, util_1.getWalletAddress)(coin.network, externalWallet);
@@ -138,6 +140,7 @@ function run(coin, scriptTypes, walletKeys, params, tags = []) {
138
140
  krsProvider: params.krsProvider,
139
141
  ...params.keys,
140
142
  recoveryProvider: new mock_1.MockRecoveryProvider(mockedApiUnspents),
143
+ feeRate: defaultFeeRateSatB,
141
144
  });
142
145
  const txHex = recovery.transactionHex ?? recovery.txHex;
143
146
  const isPsbt = utxolib.bitgo.isPsbt(txHex);
@@ -151,6 +154,19 @@ function run(coin, scriptTypes, walletKeys, params, tags = []) {
151
154
  const recoveryProvider = new mock_1.MockRecoveryProvider(mockedApiUnspents);
152
155
  (await recoveryProvider.getUnspentsForAddresses(mockedApiUnspents.map((u) => u.address))).length.should.eql(mockedApiUnspents.length);
153
156
  });
157
+ it('has expected fee rate', function () {
158
+ if (!(recoveryTx instanceof utxolib.bitgo.UtxoPsbt)) {
159
+ this.skip();
160
+ }
161
+ const inputSum = utxolib.bitgo.unspentSum(recoverUnspents, 'bigint');
162
+ const outputSum = recoveryTx.txOutputs.reduce((sum, o) => sum + o.value, BigInt(0));
163
+ const fee = inputSum - outputSum;
164
+ const vsize = unspents_1.Dimensions.fromPsbt(recoveryTx).getVSize();
165
+ const feeRateSatB = Number(fee) / vsize;
166
+ const diff = Math.abs(feeRateSatB - defaultFeeRateSatB) / defaultFeeRateSatB;
167
+ // within 1%
168
+ assert_1.default.strictEqual(diff < 0.01, true, `expected fee rate ${defaultFeeRateSatB} but got ${feeRateSatB}`);
169
+ });
154
170
  it('matches fixture', async function () {
155
171
  const fixtureCoin = (0, util_1.getNormalTestnetCoin)(coin);
156
172
  const fixtureRecovery = { ...recovery };
@@ -261,12 +277,6 @@ function runWithScriptTypes(scriptTypes, { runKeyProviderTests = true } = {}) {
261
277
  hasUserSignature: true,
262
278
  hasBackupSignature: true,
263
279
  }, ['fullSignedRecovery', ...scriptTypes]);
264
- run(coin, scriptTypes, walletKeys, {
265
- keys: keysFullSignedRecovery,
266
- hasUserSignature: true,
267
- hasBackupSignature: true,
268
- feeRate: 2,
269
- }, ['fullSignedRecovery', 'fixedFeeRate', ...scriptTypes]);
270
280
  run(coin, scriptTypes, exoticWalletKeys, {
271
281
  keys: keysFullSignedRecoveryExotic,
272
282
  userKeyPath: exoticUserKeyPath,
@@ -283,4 +293,4 @@ describe('Backup Key Recovery', function () {
283
293
  // taproot compatible coins
284
294
  runWithScriptTypes(['p2tr', 'p2trMusig2'], { runKeyProviderTests: false });
285
295
  });
286
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsa0JBQWdCO0FBRWhCLDZDQUErQjtBQUMvQiw2QkFBOEI7QUFFOUIseURBQTJDO0FBQzNDLDhDQUErRDtBQUUvRCxzQ0FNc0I7QUFDdEIsa0NBWWlCO0FBRWpCLGlDQUE4QztBQUU5QyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUtuQyxNQUFNLE1BQU0sR0FBRyxFQUFFLFlBQVksRUFBWix1QkFBWSxFQUFFLENBQUM7QUFFaEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7QUFFekIsU0FBUyxjQUFjLENBQUMsQ0FBMkI7SUFDakQsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLHVCQUFZLEVBQUUsQ0FBQztJQUNuQyxNQUFNLENBQUM7UUFDTCxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsQ0FBQztJQUNILEtBQUssQ0FBQztRQUNKLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFRL0IsU0FBUyxZQUFZLENBQUMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBeUIsRUFBRSxRQUFnQjtJQUM1RixTQUFTLE1BQU0sQ0FBQyxDQUFpQjtRQUMvQixPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFBLHNCQUFlLEVBQUMsUUFBUSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQ0QsT0FBTztRQUNMLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3hCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQzVCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDO0tBQzNCLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyx1QkFBdUIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUF5QixFQUFFLFFBQWdCO0lBQ3ZHLE9BQU8sWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNqRyxDQUFDO0FBRUQsU0FBUyw0QkFBNEIsQ0FDbkMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBeUIsRUFDdEQsUUFBZ0I7SUFFaEIsT0FBTyxZQUFZLENBQUMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRCxTQUFTLDRCQUE0QixDQUNuQyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUF5QixFQUN0RCxRQUFnQjtJQUVoQixPQUFPLFlBQVksQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUVELE1BQU0sVUFBVSxHQUFHLElBQUEsMkJBQW9CLEdBQUUsQ0FBQztBQUMxQyxNQUFNLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUN2RixNQUFNLHNCQUFzQixHQUFHLDRCQUE0QixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUNqRyxNQUFNLHNCQUFzQixHQUFHLDRCQUE0QixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUVqRyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztBQUNsQyxNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsZ0JBQVMsRUFBRTtJQUNuRSxpQkFBaUI7SUFDakIsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsYUFBYTtJQUMxQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxhQUFhO0NBQzNDLENBQUMsQ0FBQztBQUNILE1BQU0sNEJBQTRCLEdBQUcsNEJBQTRCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFFN0csU0FBUyxHQUFHLENBQ1YsSUFBc0IsRUFDdEIsV0FBNkIsRUFDN0IsVUFBMEIsRUFDMUIsTUFRQyxFQUNELE9BQWlCLEVBQUU7SUFFbkIsUUFBUSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDNUYsTUFBTSxjQUFjLEdBQUcsSUFBQSxvQkFBYSxFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sbUJBQW1CLEdBQUcsSUFBQSx1QkFBZ0IsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRTNFLElBQUkseUJBQWlDLENBQUM7UUFDdEMsSUFBSSxRQUE2RixDQUFDO1FBQ2xHLElBQUksVUFBbUYsQ0FBQztRQUV4Rix1R0FBdUc7UUFDdkcsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDYixLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFZLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFNLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztRQUVILGNBQWMsQ0FBQyxVQUFVLE1BQWM7WUFDckMsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RELGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUMzRCxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsY0FBYyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDakUseUJBQXlCLEdBQUcsSUFBQSx1QkFBZ0IsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkYsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUseUJBQXlCLEVBQUUsQ0FBQztZQUM3RixNQUFNLENBQUMsWUFBWSxHQUFHLGtCQUFrQixDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDO1lBQ0osS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxlQUFnRCxDQUFDO1FBQ3JELElBQUksaUJBQWtELENBQUM7UUFFdkQsTUFBTSxDQUFDLHNCQUFzQixFQUFFLEtBQUs7WUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFNLENBQUMsQ0FBQztZQUNyQixlQUFlLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUMzRCxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQztnQkFDMUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7Z0JBQzFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDO2FBQzNHLENBQUMsQ0FBQztZQUVILHFIQUFxSDtZQUNySCxnREFBZ0Q7WUFDaEQsaUJBQWlCO2dCQUNmLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLE1BQU07b0JBQ3JELENBQUMsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzdHLENBQUMsQ0FBQyxlQUFlLENBQUM7WUFFdEIsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyRSxRQUFRLEdBQUcsTUFBTSxJQUFBLHVCQUFpQixFQUFDLElBQUksRUFBRSxtQkFBWSxFQUFFO2dCQUNyRCxnQkFBZ0I7Z0JBQ2hCLG1CQUFtQjtnQkFDbkIsSUFBSSxFQUFFLENBQUM7Z0JBQ1Asa0JBQWtCLEVBQUUsRUFBRTtnQkFDdEIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7Z0JBQy9CLEdBQUcsTUFBTSxDQUFDLElBQUk7Z0JBQ2QsZ0JBQWdCLEVBQUUsSUFBSSwyQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQzthQUM5RCxDQUFDLENBQUM7WUFDSCxNQUFNLEtBQUssR0FDUixRQUE0QyxDQUFDLGNBQWMsSUFBSyxRQUF3QyxDQUFDLEtBQUssQ0FBQztZQUNsSCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxVQUFVLEdBQUcsTUFBTTtnQkFDakIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ3RELENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLEtBQWUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzRixRQUFRLENBQUMsSUFBSTtnQkFDWCxVQUFVLFlBQVksT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNHLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLEtBQUs7WUFDN0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLDJCQUFvQixDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDckUsQ0FBQyxNQUFNLGdCQUFnQixDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDekcsaUJBQWlCLENBQUMsTUFBTSxDQUN6QixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaUJBQWlCLEVBQUUsS0FBSztZQUN6QixNQUFNLFdBQVcsR0FBRyxJQUFBLDJCQUFvQixFQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxJQUFJLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDekIsZUFBZSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEQsQ0FBQztZQUVELElBQUEsc0JBQWUsRUFDYixlQUFlLEVBQ2YsTUFBTSxJQUFBLGlCQUFVLEVBQ2QsV0FBVyxFQUNYLDhCQUE4QixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQ3pHLFFBQVEsQ0FDVCxDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQkFBMEIsRUFBRTtZQUM3QixDQUFDLFVBQVUsWUFBWSxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDeEcsZUFBZSxDQUFDLE1BQU0sQ0FDdkIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxtQkFBbUIsQ0FDMUIsRUFBMkUsRUFDM0UsT0FBdUIsRUFDdkIsV0FBbUI7WUFFbkIsSUFBSSxFQUFFLFlBQVksT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDekMsU0FBUyxRQUFRLENBQUMsRUFBMEIsRUFBRSxVQUFrQjtvQkFDOUQsSUFBSSxDQUFDO3dCQUNILE9BQU8sRUFBRSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDN0QsQ0FBQztvQkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3dCQUNYLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSywyQkFBMkIsRUFBRSxDQUFDOzRCQUM5QyxPQUFPLEtBQUssQ0FBQzt3QkFDZixDQUFDO3dCQUNELE1BQU0sQ0FBQyxDQUFDO29CQUNWLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7b0JBQzNDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3JELENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sV0FBVyxHQUFHLGVBQWU7cUJBQ2hDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ3JDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDcEYsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7b0JBQ25DLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQWtCLENBQUM7b0JBQzdELE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDOUcsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUs7eUJBQzdCLHlCQUF5QixDQUN4QixFQUFFLEVBQ0YsVUFBVSxFQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUN2RCxFQUFFLFNBQVMsRUFBRSxFQUNiLFdBQVcsQ0FDWjt5QkFDQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUM7b0JBQzNDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDNUMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUVELEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxpQkFBaUIsRUFBRTtZQUNuRSxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsbUJBQW1CLEVBQUU7WUFDdkUsbUJBQW1CLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLElBQUksTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDekQsRUFBRSxDQUFDLCtCQUErQixFQUFFO2dCQUNsQyxJQUFJLFVBQVUsWUFBWSxPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4RCxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO3dCQUMvQixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN6RCxRQUFRLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQzs0QkFDMUIsS0FBSyxNQUFNLENBQUM7NEJBQ1osS0FBSyxXQUFXLENBQUM7NEJBQ2pCLEtBQUssT0FBTyxDQUFDOzRCQUNiLEtBQUssd0JBQXdCO2dDQUMzQixNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQ0FDekMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7d0NBQ3BELE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsRUFBRSxDQUFDLENBQUM7b0NBQ3pELENBQUM7Z0NBQ0gsQ0FBQyxDQUFDLENBQUM7Z0NBQ0gsTUFBTTs0QkFDUjtnQ0FDRSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQzt3QkFDbEUsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLDhCQUE4QixFQUFFO1lBQzVFLE1BQU0sSUFBSSxHQUFHLFVBQVUsWUFBWSxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUM5RyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3hHLGVBQWU7aUJBQ1osUUFBUSxDQUFDLHlCQUF5QixDQUFDO2lCQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUM7WUFDM0UsZUFBZSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUN6QixXQUE2QixFQUM3QixFQUFFLG1CQUFtQixHQUFHLElBQUksS0FBd0MsRUFBRTtJQUV0RSxnQkFBUztTQUNOLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDN0UsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDaEIsR0FBRyxDQUNELElBQUksRUFDSixXQUFXLEVBQ1gsVUFBVSxFQUNWO1lBQ0UsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixnQkFBZ0IsRUFBRSxLQUFLO1lBQ3ZCLGtCQUFrQixFQUFFLEtBQUs7U0FDMUIsRUFDRCxDQUFDLGtCQUFrQixFQUFFLEdBQUcsV0FBVyxDQUFDLENBQ3JDLENBQUM7UUFFRixJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQzNDLEdBQUcsQ0FDRCxJQUFJLEVBQ0osV0FBVyxFQUNYLFVBQVUsRUFDVjtvQkFDRSxJQUFJLEVBQUUsc0JBQXNCO29CQUM1QixXQUFXLEVBQUUsV0FBVztvQkFDeEIsZ0JBQWdCLEVBQUUsSUFBSTtvQkFDdEIsa0JBQWtCLEVBQUUsS0FBSztvQkFDekIsWUFBWSxFQUFFLEtBQUs7aUJBQ3BCLEVBQ0QsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUN2QyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsR0FBRyxDQUNELElBQUksRUFDSixXQUFXLEVBQ1gsVUFBVSxFQUNWO1lBQ0UsSUFBSSxFQUFFLHNCQUFzQjtZQUM1QixnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLGtCQUFrQixFQUFFLElBQUk7U0FDekIsRUFDRCxDQUFDLG9CQUFvQixFQUFFLEdBQUcsV0FBVyxDQUFDLENBQ3ZDLENBQUM7UUFFRixHQUFHLENBQ0QsSUFBSSxFQUNKLFdBQVcsRUFDWCxVQUFVLEVBQ1Y7WUFDRSxJQUFJLEVBQUUsc0JBQXNCO1lBQzVCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixPQUFPLEVBQUUsQ0FBQztTQUNYLEVBQ0QsQ0FBQyxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FDdkQsQ0FBQztRQUVGLEdBQUcsQ0FDRCxJQUFJLEVBQ0osV0FBVyxFQUNYLGdCQUFnQixFQUNoQjtZQUNFLElBQUksRUFBRSw0QkFBNEI7WUFDbEMsV0FBVyxFQUFFLGlCQUFpQjtZQUM5QixnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLGtCQUFrQixFQUFFLElBQUk7U0FDekIsRUFDRCxDQUFDLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLEdBQUcsV0FBVyxDQUFDLENBQzVELENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxRQUFRLENBQUMscUJBQXFCLEVBQUU7SUFDOUIsNEJBQTRCO0lBQzVCLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUU3QiwwQkFBMEI7SUFDMUIsa0JBQWtCLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUUzQywyQkFBMkI7SUFDM0Isa0JBQWtCLENBQUMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzdFLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyBtb2NoYSBmcm9tICdtb2NoYSc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IENvbmZpZywga3JzUHJvdmlkZXJzLCBUcmlwbGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5pbXBvcnQge1xuICBBYnN0cmFjdFV0eG9Db2luLFxuICBiYWNrdXBLZXlSZWNvdmVyeSxcbiAgQmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbixcbiAgQ29pbmdlY2tvQXBpLFxuICBGb3JtYXR0ZWRPZmZsaW5lVmF1bHRUeEluZm8sXG59IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQge1xuICBkZWZhdWx0Qml0R28sXG4gIGVuY3J5cHRLZXljaGFpbixcbiAgZ2V0RGVmYXVsdFdhbGxldEtleXMsXG4gIGdldEZpeHR1cmUsXG4gIGdldE5vcm1hbFRlc3RuZXRDb2luLFxuICBnZXRXYWxsZXRBZGRyZXNzLFxuICBnZXRXYWxsZXRLZXlzLFxuICBrZXljaGFpbnMsXG4gIHNob3VsZEVxdWFsSlNPTixcbiAgdG9LZXljaGFpbkJhc2U1OCxcbiAgdXR4b0NvaW5zLFxufSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHsgTW9ja1JlY292ZXJ5UHJvdmlkZXIgfSBmcm9tICcuL21vY2snO1xuXG5jb25zdCB7IHRvT3V0cHV0IH0gPSB1dHhvbGliLmJpdGdvO1xudHlwZSBXYWxsZXRVbnNwZW50ID0gdXR4b2xpYi5iaXRnby5XYWxsZXRVbnNwZW50PGJpZ2ludD47XG50eXBlIFJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cztcbnR5cGUgU2NyaXB0VHlwZTJPZjMgPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZTJPZjM7XG5cbmNvbnN0IGNvbmZpZyA9IHsga3JzUHJvdmlkZXJzIH07XG5cbm5vY2suZGlzYWJsZU5ldENvbm5lY3QoKTtcblxuZnVuY3Rpb24gY29uZmlnT3ZlcnJpZGUoZjogKGNvbmZpZzogQ29uZmlnKSA9PiB2b2lkKSB7XG4gIGNvbnN0IGJhY2t1cCA9IHsgLi4ua3JzUHJvdmlkZXJzIH07XG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgZihjb25maWcpO1xuICB9KTtcbiAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgIE9iamVjdC5lbnRyaWVzKGJhY2t1cCkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICBjb25maWdba10gPSB2O1xuICAgIH0pO1xuICB9KTtcbn1cblxuY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdsb2wnO1xuXG50eXBlIE5hbWVkS2V5cyA9IHtcbiAgdXNlcktleTogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIGdldE5hbWVkS2V5cyhbdXNlcktleSwgYmFja3VwS2V5LCBiaXRnb0tleV06IFRyaXBsZTxCSVAzMkludGVyZmFjZT4sIHBhc3N3b3JkOiBzdHJpbmcpOiBOYW1lZEtleXMge1xuICBmdW5jdGlvbiBlbmNvZGUoazogQklQMzJJbnRlcmZhY2UpOiBzdHJpbmcge1xuICAgIHJldHVybiBrLmlzTmV1dGVyZWQoKSA/IGsudG9CYXNlNTgoKSA6IGVuY3J5cHRLZXljaGFpbihwYXNzd29yZCwgdG9LZXljaGFpbkJhc2U1OChrKSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB1c2VyS2V5OiBlbmNvZGUodXNlcktleSksXG4gICAgYmFja3VwS2V5OiBlbmNvZGUoYmFja3VwS2V5KSxcbiAgICBiaXRnb0tleTogZW5jb2RlKGJpdGdvS2V5KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5c0ZvclVuc2lnbmVkU3dlZXAoW3VzZXJLZXksIGJhY2t1cEtleSwgYml0Z29LZXldOiBUcmlwbGU8QklQMzJJbnRlcmZhY2U+LCBwYXNzd29yZDogc3RyaW5nKTogTmFtZWRLZXlzIHtcbiAgcmV0dXJuIGdldE5hbWVkS2V5cyhbdXNlcktleS5uZXV0ZXJlZCgpLCBiYWNrdXBLZXkubmV1dGVyZWQoKSwgYml0Z29LZXkubmV1dGVyZWQoKV0sIHBhc3N3b3JkKTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5c0ZvcktleVJlY292ZXJ5U2VydmljZShcbiAgW3VzZXJLZXksIGJhY2t1cEtleSwgYml0Z29LZXldOiBUcmlwbGU8QklQMzJJbnRlcmZhY2U+LFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBOYW1lZEtleXMge1xuICByZXR1cm4gZ2V0TmFtZWRLZXlzKFt1c2VyS2V5LCBiYWNrdXBLZXkubmV1dGVyZWQoKSwgYml0Z29LZXkubmV1dGVyZWQoKV0sIHBhc3N3b3JkKTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5c0ZvckZ1bGxTaWduZWRSZWNvdmVyeShcbiAgW3VzZXJLZXksIGJhY2t1cEtleSwgYml0Z29LZXldOiBUcmlwbGU8QklQMzJJbnRlcmZhY2U+LFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBOYW1lZEtleXMge1xuICByZXR1cm4gZ2V0TmFtZWRLZXlzKFt1c2VyS2V5LCBiYWNrdXBLZXksIGJpdGdvS2V5Lm5ldXRlcmVkKCldLCBwYXNzd29yZCk7XG59XG5cbmNvbnN0IHdhbGxldEtleXMgPSBnZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuY29uc3Qga2V5c1Vuc2lnbmVkU3dlZXAgPSBnZXRLZXlzRm9yVW5zaWduZWRTd2VlcCh3YWxsZXRLZXlzLnRyaXBsZSwgd2FsbGV0UGFzc3BocmFzZSk7XG5jb25zdCBrZXlzS2V5UmVjb3ZlcnlTZXJ2aWNlID0gZ2V0S2V5c0ZvcktleVJlY292ZXJ5U2VydmljZSh3YWxsZXRLZXlzLnRyaXBsZSwgd2FsbGV0UGFzc3BocmFzZSk7XG5jb25zdCBrZXlzRnVsbFNpZ25lZFJlY292ZXJ5ID0gZ2V0S2V5c0ZvckZ1bGxTaWduZWRSZWNvdmVyeSh3YWxsZXRLZXlzLnRyaXBsZSwgd2FsbGV0UGFzc3BocmFzZSk7XG5cbmNvbnN0IGV4b3RpY1VzZXJLZXlQYXRoID0gJzk5Lzk5JztcbmNvbnN0IGV4b3RpY1dhbGxldEtleXMgPSBuZXcgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyhrZXljaGFpbnMsIFtcbiAgZXhvdGljVXNlcktleVBhdGgsXG4gIHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMuZGVmYXVsdFByZWZpeCxcbiAgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cy5kZWZhdWx0UHJlZml4LFxuXSk7XG5jb25zdCBrZXlzRnVsbFNpZ25lZFJlY292ZXJ5RXhvdGljID0gZ2V0S2V5c0ZvckZ1bGxTaWduZWRSZWNvdmVyeShleG90aWNXYWxsZXRLZXlzLnRyaXBsZSwgd2FsbGV0UGFzc3BocmFzZSk7XG5cbmZ1bmN0aW9uIHJ1bihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgc2NyaXB0VHlwZXM6IFNjcmlwdFR5cGUyT2YzW10sXG4gIHdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICBwYXJhbXM6IHtcbiAgICBrZXlzOiBOYW1lZEtleXM7XG4gICAgdXNlcktleVBhdGg/OiBzdHJpbmc7XG4gICAga3JzUHJvdmlkZXI/OiBzdHJpbmc7XG4gICAgaGFzVXNlclNpZ25hdHVyZTogYm9vbGVhbjtcbiAgICBoYXNCYWNrdXBTaWduYXR1cmU6IGJvb2xlYW47XG4gICAgaGFzS3JzT3V0cHV0PzogYm9vbGVhbjtcbiAgICBmZWVSYXRlPzogbnVtYmVyO1xuICB9LFxuICB0YWdzOiBzdHJpbmdbXSA9IFtdXG4pIHtcbiAgZGVzY3JpYmUoYEJhY2t1cCBLZXkgUmVjb3ZlcnkgWyR7W2NvaW4uZ2V0Q2hhaW4oKSwgLi4udGFncywgcGFyYW1zLmtyc1Byb3ZpZGVyXS5qb2luKCcsJyl9XWAsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBleHRlcm5hbFdhbGxldCA9IGdldFdhbGxldEtleXMoJ2V4dGVybmFsJyk7XG4gICAgY29uc3QgcmVjb3ZlcnlEZXN0aW5hdGlvbiA9IGdldFdhbGxldEFkZHJlc3MoY29pbi5uZXR3b3JrLCBleHRlcm5hbFdhbGxldCk7XG5cbiAgICBsZXQga2V5UmVjb3ZlcnlTZXJ2aWNlQWRkcmVzczogc3RyaW5nO1xuICAgIGxldCByZWNvdmVyeTogKEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb24gfCBGb3JtYXR0ZWRPZmZsaW5lVmF1bHRUeEluZm8pICYgeyB0eGlkPzogc3RyaW5nIH07XG4gICAgbGV0IHJlY292ZXJ5VHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPG51bWJlciB8IGJpZ2ludD4gfCB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0O1xuXG4gICAgLy8gMWU4ICogOWU3IDwgOS4wMDdlMTUgYnV0IDJlOCAqIDllNyA+IDkuMDA3ZTE1IHRvIHRlc3QgYm90aCBjb2RlIHBhdGhzIGluIHF1ZXJ5QmxvY2tjaGFpblVuc3BlbnRzUGF0aFxuICAgIGNvbnN0IHZhbHVlTXVsID0gY29pbi5hbW91bnRUeXBlID09PSAnYmlnaW50JyA/IEJpZ0ludCg5ZTcpIDogQmlnSW50KDEpO1xuICAgIGJlZm9yZSgnbW9jaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnN0dWIoQ29pbmdlY2tvQXBpLnByb3RvdHlwZSwgJ2dldFVTRFByaWNlJykucmVzb2x2ZXMoNjlfNDIwKTtcbiAgICB9KTtcblxuICAgIGNvbmZpZ092ZXJyaWRlKGZ1bmN0aW9uIChjb25maWc6IENvbmZpZykge1xuICAgICAgY29uc3QgY29uZmlnS3JzUHJvdmlkZXJzID0geyAuLi5jb25maWcua3JzUHJvdmlkZXJzIH07XG4gICAgICBjb25maWdLcnNQcm92aWRlcnMuZGFpLnN1cHBvcnRlZENvaW5zID0gW2NvaW4uZ2V0RmFtaWx5KCldO1xuICAgICAgY29uZmlnS3JzUHJvdmlkZXJzLmtleXRlcm5hbC5zdXBwb3J0ZWRDb2lucyA9IFtjb2luLmdldEZhbWlseSgpXTtcbiAgICAgIGtleVJlY292ZXJ5U2VydmljZUFkZHJlc3MgPSBnZXRXYWxsZXRBZGRyZXNzKGNvaW4ubmV0d29yaywgZXh0ZXJuYWxXYWxsZXQsIDAsIDEwMCk7XG4gICAgICBjb25maWdLcnNQcm92aWRlcnMua2V5dGVybmFsLmZlZUFkZHJlc3NlcyA9IHsgW2NvaW4uZ2V0Q2hhaW4oKV06IGtleVJlY292ZXJ5U2VydmljZUFkZHJlc3MgfTtcbiAgICAgIGNvbmZpZy5rcnNQcm92aWRlcnMgPSBjb25maWdLcnNQcm92aWRlcnM7XG4gICAgfSk7XG5cbiAgICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBsZXQgcmVjb3ZlclVuc3BlbnRzOiB1dHhvbGliLmJpdGdvLlVuc3BlbnQ8YmlnaW50PltdO1xuICAgIGxldCBtb2NrZWRBcGlVbnNwZW50czogdXR4b2xpYi5iaXRnby5VbnNwZW50PGJpZ2ludD5bXTtcblxuICAgIGJlZm9yZSgnY3JlYXRlIHJlY292ZXJ5IGRhdGEnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnRpbWVvdXQoMTBfMDAwKTtcbiAgICAgIHJlY292ZXJVbnNwZW50cyA9IHNjcmlwdFR5cGVzLmZsYXRNYXAoKHNjcmlwdFR5cGUsIGluZGV4KSA9PiBbXG4gICAgICAgIHV0eG9saWIudGVzdHV0aWwudG9VbnNwZW50KHsgc2NyaXB0VHlwZSwgdmFsdWU6IEJpZ0ludCgxZTgpICogdmFsdWVNdWwgfSwgaW5kZXgsIGNvaW4ubmV0d29yaywgd2FsbGV0S2V5cyksXG4gICAgICAgIHV0eG9saWIudGVzdHV0aWwudG9VbnNwZW50KHsgc2NyaXB0VHlwZSwgdmFsdWU6IEJpZ0ludCgyZTgpICogdmFsdWVNdWwgfSwgaW5kZXgsIGNvaW4ubmV0d29yaywgd2FsbGV0S2V5cyksXG4gICAgICAgIHV0eG9saWIudGVzdHV0aWwudG9VbnNwZW50KHsgc2NyaXB0VHlwZSwgdmFsdWU6IEJpZ0ludCgzZTgpICogdmFsdWVNdWwgfSwgaW5kZXgsIGNvaW4ubmV0d29yaywgd2FsbGV0S2V5cyksXG4gICAgICBdKTtcblxuICAgICAgLy8gSWYgdGhlIGNvaW4gaXMgYmNoLCBjb252ZXJ0IHRoZSBtb2NrZWQgdW5zcGVudCBhZGRyZXNzIHRvIGNhc2hhZGRyIGZvcm1hdCBzaW5jZSB0aGF0IGlzIHRoZSBmb3JtYXQgdGhhdCBibG9ja2NoYWlyXG4gICAgICAvLyByZXR1cm5zIG9uIHRoZSAvZGFzaGJvYXJkcy9hZGRyZXNzZXMgcmVzcG9uc2VcbiAgICAgIG1vY2tlZEFwaVVuc3BlbnRzID1cbiAgICAgICAgY29pbi5nZXRDaGFpbigpID09PSAnYmNoJyB8fCBjb2luLmdldENoYWluKCkgPT09ICdiY2hhJ1xuICAgICAgICAgID8gcmVjb3ZlclVuc3BlbnRzLm1hcCgodSkgPT4gKHsgLi4udSwgYWRkcmVzczogY29pbi5jYW5vbmljYWxBZGRyZXNzKHUuYWRkcmVzcywgJ2Nhc2hhZGRyJykuc3BsaXQoJzonKVsxXSB9KSlcbiAgICAgICAgICA6IHJlY292ZXJVbnNwZW50cztcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tlZEFwaVVuc3BlbnRzLmxlbmd0aCwgcmVjb3ZlclVuc3BlbnRzLmxlbmd0aCk7XG4gICAgICByZWNvdmVyeSA9IGF3YWl0IGJhY2t1cEtleVJlY292ZXJ5KGNvaW4sIGRlZmF1bHRCaXRHbywge1xuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICBzY2FuOiA1LFxuICAgICAgICBpZ25vcmVBZGRyZXNzVHlwZXM6IFtdLFxuICAgICAgICB1c2VyS2V5UGF0aDogcGFyYW1zLnVzZXJLZXlQYXRoLFxuICAgICAgICBrcnNQcm92aWRlcjogcGFyYW1zLmtyc1Byb3ZpZGVyLFxuICAgICAgICAuLi5wYXJhbXMua2V5cyxcbiAgICAgICAgcmVjb3ZlcnlQcm92aWRlcjogbmV3IE1vY2tSZWNvdmVyeVByb3ZpZGVyKG1vY2tlZEFwaVVuc3BlbnRzKSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdHhIZXggPVxuICAgICAgICAocmVjb3ZlcnkgYXMgQmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbikudHJhbnNhY3Rpb25IZXggPz8gKHJlY292ZXJ5IGFzIEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbykudHhIZXg7XG4gICAgICBjb25zdCBpc1BzYnQgPSB1dHhvbGliLmJpdGdvLmlzUHNidCh0eEhleCk7XG4gICAgICByZWNvdmVyeVR4ID0gaXNQc2J0XG4gICAgICAgID8gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0RnJvbUhleCh0eEhleCwgY29pbi5uZXR3b3JrKVxuICAgICAgICA6IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHR4SGV4IGFzIHN0cmluZywgY29pbi5uZXR3b3JrLCBjb2luLmFtb3VudFR5cGUpO1xuICAgICAgcmVjb3ZlcnkudHhpZCA9XG4gICAgICAgIHJlY292ZXJ5VHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0ID8gcmVjb3ZlcnlUeC5nZXRVbnNpZ25lZFR4KCkuZ2V0SWQoKSA6IHJlY292ZXJ5VHguZ2V0SWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXMgY29ycmVjdCByZWNvdmVyeSBwcm92aWRlciBtb2NrcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlY292ZXJ5UHJvdmlkZXIgPSBuZXcgTW9ja1JlY292ZXJ5UHJvdmlkZXIobW9ja2VkQXBpVW5zcGVudHMpO1xuICAgICAgKGF3YWl0IHJlY292ZXJ5UHJvdmlkZXIuZ2V0VW5zcGVudHNGb3JBZGRyZXNzZXMobW9ja2VkQXBpVW5zcGVudHMubWFwKCh1KSA9PiB1LmFkZHJlc3MpKSkubGVuZ3RoLnNob3VsZC5lcWwoXG4gICAgICAgIG1vY2tlZEFwaVVuc3BlbnRzLmxlbmd0aFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdtYXRjaGVzIGZpeHR1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmaXh0dXJlQ29pbiA9IGdldE5vcm1hbFRlc3RuZXRDb2luKGNvaW4pO1xuICAgICAgY29uc3QgZml4dHVyZVJlY292ZXJ5ID0geyAuLi5yZWNvdmVyeSB9O1xuICAgICAgaWYgKGZpeHR1cmVSZWNvdmVyeS5jb2luKSB7XG4gICAgICAgIGZpeHR1cmVSZWNvdmVyeS5jb2luID0gZml4dHVyZUNvaW4uZ2V0Q2hhaW4oKTtcbiAgICAgIH1cblxuICAgICAgc2hvdWxkRXF1YWxKU09OKFxuICAgICAgICBmaXh0dXJlUmVjb3ZlcnksXG4gICAgICAgIGF3YWl0IGdldEZpeHR1cmUoXG4gICAgICAgICAgZml4dHVyZUNvaW4sXG4gICAgICAgICAgYHJlY292ZXJ5L2JhY2t1cEtleVJlY292ZXJ5LSR7KHBhcmFtcy5rcnNQcm92aWRlciA/IHRhZ3MuY29uY2F0KFtwYXJhbXMua3JzUHJvdmlkZXJdKSA6IHRhZ3MpLmpvaW4oJy0nKX1gLFxuICAgICAgICAgIHJlY292ZXJ5XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFzIGV4cGVjdGVkIGlucHV0IGNvdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgKHJlY292ZXJ5VHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0ID8gcmVjb3ZlcnlUeC5kYXRhLmlucHV0cyA6IHJlY292ZXJ5VHguaW5zKS5sZW5ndGguc2hvdWxkLmVxbChcbiAgICAgICAgcmVjb3ZlclVuc3BlbnRzLmxlbmd0aFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGNoZWNrSW5wdXRzU2lnbmVkQnkoXG4gICAgICB0eDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248bnVtYmVyIHwgYmlnaW50PiB8IHV0eG9saWIuYml0Z28uVXR4b1BzYnQsXG4gICAgICByb290S2V5OiBCSVAzMkludGVyZmFjZSxcbiAgICAgIGV4cGVjdENvdW50OiBudW1iZXJcbiAgICApIHtcbiAgICAgIGlmICh0eCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQpIHtcbiAgICAgICAgZnVuY3Rpb24gdmFsaWRhdGUodHg6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQsIGlucHV0SW5kZXg6IG51bWJlcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdHgudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dEhEKGlucHV0SW5kZXgsIHJvb3RLZXkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlLm1lc3NhZ2UgPT09ICdObyBzaWduYXR1cmVzIHRvIHZhbGlkYXRlJykge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0eC5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaW5wdXRJbmRleCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRlKHR4LCBpbnB1dEluZGV4KS5zaG91bGQuZXFsKCEhZXhwZWN0Q291bnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByZXZPdXRwdXRzID0gcmVjb3ZlclVuc3BlbnRzXG4gICAgICAgICAgLm1hcCgodSkgPT4gdG9PdXRwdXQodSwgY29pbi5uZXR3b3JrKSlcbiAgICAgICAgICAubWFwKCh2KSA9PiAoeyAuLi52LCB2YWx1ZTogdXR4b2xpYi5iaXRnby50b1ROdW1iZXIodi52YWx1ZSwgY29pbi5hbW91bnRUeXBlKSB9KSk7XG4gICAgICAgIHR4Lmlucy5mb3JFYWNoKChpbnB1dCwgaW5wdXRJbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVuc3BlbnQgPSByZWNvdmVyVW5zcGVudHNbaW5wdXRJbmRleF0gYXMgV2FsbGV0VW5zcGVudDtcbiAgICAgICAgICBjb25zdCB7IHB1YmxpY0tleSB9ID0gcm9vdEtleS5kZXJpdmVQYXRoKHdhbGxldEtleXMuZ2V0RGVyaXZhdGlvblBhdGgocm9vdEtleSwgdW5zcGVudC5jaGFpbiwgdW5zcGVudC5pbmRleCkpO1xuICAgICAgICAgIGNvbnN0IHNpZ25hdHVyZXMgPSB1dHhvbGliLmJpdGdvXG4gICAgICAgICAgICAuZ2V0U2lnbmF0dXJlVmVyaWZpY2F0aW9ucyhcbiAgICAgICAgICAgICAgdHgsXG4gICAgICAgICAgICAgIGlucHV0SW5kZXgsXG4gICAgICAgICAgICAgIHV0eG9saWIuYml0Z28udG9UTnVtYmVyKHVuc3BlbnQudmFsdWUsIGNvaW4uYW1vdW50VHlwZSksXG4gICAgICAgICAgICAgIHsgcHVibGljS2V5IH0sXG4gICAgICAgICAgICAgIHByZXZPdXRwdXRzXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuZmlsdGVyKChzKSA9PiBzLnNpZ25lZEJ5ICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgIHNpZ25hdHVyZXMubGVuZ3RoLnNob3VsZC5lcWwoZXhwZWN0Q291bnQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpdCgocGFyYW1zLmhhc1VzZXJTaWduYXR1cmUgPyAnaGFzJyA6ICdoYXMgbm8nKSArICcgdXNlciBzaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjaGVja0lucHV0c1NpZ25lZEJ5KHJlY292ZXJ5VHgsIHdhbGxldEtleXMudXNlciwgcGFyYW1zLmhhc1VzZXJTaWduYXR1cmUgPyAxIDogMCk7XG4gICAgfSk7XG5cbiAgICBpdCgocGFyYW1zLmhhc0JhY2t1cFNpZ25hdHVyZSA/ICdoYXMnIDogJ2hhcyBubycpICsgJyBiYWNrdXAgc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY2hlY2tJbnB1dHNTaWduZWRCeShyZWNvdmVyeVR4LCB3YWxsZXRLZXlzLmJhY2t1cCwgcGFyYW1zLmhhc0JhY2t1cFNpZ25hdHVyZSA/IDEgOiAwKTtcbiAgICB9KTtcblxuICAgIGlmIChwYXJhbXMuaGFzVXNlclNpZ25hdHVyZSAmJiBwYXJhbXMuaGFzQmFja3VwU2lnbmF0dXJlKSB7XG4gICAgICBpdCgnaGFzIG5vIHBsYWNlaG9sZGVyIHNpZ25hdHVyZXMnLCBmdW5jdGlvbiAodGhpczogbW9jaGEuQ29udGV4dCkge1xuICAgICAgICBpZiAocmVjb3ZlcnlUeCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgcmVjb3ZlcnlUeC5pbnMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHV0eG9saWIuYml0Z28ucGFyc2VTaWduYXR1cmVTY3JpcHQoaW5wdXQpO1xuICAgICAgICAgICAgc3dpdGNoIChwYXJzZWQuc2NyaXB0VHlwZSkge1xuICAgICAgICAgICAgICBjYXNlICdwMnNoJzpcbiAgICAgICAgICAgICAgY2FzZSAncDJzaFAyd3NoJzpcbiAgICAgICAgICAgICAgY2FzZSAncDJ3c2gnOlxuICAgICAgICAgICAgICBjYXNlICd0YXByb290U2NyaXB0UGF0aFNwZW5kJzpcbiAgICAgICAgICAgICAgICBwYXJzZWQuc2lnbmF0dXJlcy5mb3JFYWNoKChzaWduYXR1cmUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICh1dHhvbGliLmJpdGdvLmlzUGxhY2Vob2xkZXJTaWduYXR1cmUoc2lnbmF0dXJlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHBsYWNlaG9sZGVyIHNpZ25hdHVyZSBhdCBpbmRleCAke2l9YCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIHNjcmlwdFR5cGUgJHtwYXJzZWQuc2NyaXB0VHlwZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNraXAoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXQoKHBhcmFtcy5oYXNLcnNPdXRwdXQgPyAnaGFzJyA6ICdoYXMgbm8nKSArICcga2V5IHJlY292ZXJ5IHNlcnZpY2Ugb3V0cHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3V0cyA9IHJlY292ZXJ5VHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0ID8gcmVjb3ZlcnlUeC5nZXRVbnNpZ25lZFR4KCkub3V0cyA6IHJlY292ZXJ5VHgub3V0cztcbiAgICAgIG91dHMubGVuZ3RoLnNob3VsZC5lcWwoMSk7XG4gICAgICBjb25zdCBvdXRwdXRBZGRyZXNzZXMgPSBvdXRzLm1hcCgobykgPT4gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoby5zY3JpcHQsIHJlY292ZXJ5VHgubmV0d29yaykpO1xuICAgICAgb3V0cHV0QWRkcmVzc2VzXG4gICAgICAgIC5pbmNsdWRlcyhrZXlSZWNvdmVyeVNlcnZpY2VBZGRyZXNzKVxuICAgICAgICAuc2hvdWxkLmVxbCghIXBhcmFtcy5oYXNLcnNPdXRwdXQgJiYgcGFyYW1zLmtyc1Byb3ZpZGVyID09PSAna2V5dGVybmFsJyk7XG4gICAgICBvdXRwdXRBZGRyZXNzZXMuaW5jbHVkZXMocmVjb3ZlcnlEZXN0aW5hdGlvbikuc2hvdWxkLmVxbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bldpdGhTY3JpcHRUeXBlcyhcbiAgc2NyaXB0VHlwZXM6IFNjcmlwdFR5cGUyT2YzW10sXG4gIHsgcnVuS2V5UHJvdmlkZXJUZXN0cyA9IHRydWUgfTogeyBydW5LZXlQcm92aWRlclRlc3RzPzogYm9vbGVhbiB9ID0ge31cbikge1xuICB1dHhvQ29pbnNcbiAgICAuZmlsdGVyKChjb2luKSA9PiBzY3JpcHRUeXBlcy5ldmVyeSgodHlwZSkgPT4gY29pbi5zdXBwb3J0c0FkZHJlc3NUeXBlKHR5cGUpKSlcbiAgICAuZm9yRWFjaCgoY29pbikgPT4ge1xuICAgICAgcnVuKFxuICAgICAgICBjb2luLFxuICAgICAgICBzY3JpcHRUeXBlcyxcbiAgICAgICAgd2FsbGV0S2V5cyxcbiAgICAgICAge1xuICAgICAgICAgIGtleXM6IGtleXNVbnNpZ25lZFN3ZWVwLFxuICAgICAgICAgIGhhc1VzZXJTaWduYXR1cmU6IGZhbHNlLFxuICAgICAgICAgIGhhc0JhY2t1cFNpZ25hdHVyZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIFsndW5zaWduZWRSZWNvdmVyeScsIC4uLnNjcmlwdFR5cGVzXVxuICAgICAgKTtcblxuICAgICAgaWYgKHJ1bktleVByb3ZpZGVyVGVzdHMpIHtcbiAgICAgICAgWydkYWknLCAna2V5dGVybmFsJ10uZm9yRWFjaCgoa3JzUHJvdmlkZXIpID0+IHtcbiAgICAgICAgICBydW4oXG4gICAgICAgICAgICBjb2luLFxuICAgICAgICAgICAgc2NyaXB0VHlwZXMsXG4gICAgICAgICAgICB3YWxsZXRLZXlzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXlzOiBrZXlzS2V5UmVjb3ZlcnlTZXJ2aWNlLFxuICAgICAgICAgICAgICBrcnNQcm92aWRlcjoga3JzUHJvdmlkZXIsXG4gICAgICAgICAgICAgIGhhc1VzZXJTaWduYXR1cmU6IHRydWUsXG4gICAgICAgICAgICAgIGhhc0JhY2t1cFNpZ25hdHVyZTogZmFsc2UsXG4gICAgICAgICAgICAgIGhhc0tyc091dHB1dDogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgWydrZXlSZWNvdmVyeVNlcnZpY2UnLCAuLi5zY3JpcHRUeXBlc11cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcnVuKFxuICAgICAgICBjb2luLFxuICAgICAgICBzY3JpcHRUeXBlcyxcbiAgICAgICAgd2FsbGV0S2V5cyxcbiAgICAgICAge1xuICAgICAgICAgIGtleXM6IGtleXNGdWxsU2lnbmVkUmVjb3ZlcnksXG4gICAgICAgICAgaGFzVXNlclNpZ25hdHVyZTogdHJ1ZSxcbiAgICAgICAgICBoYXNCYWNrdXBTaWduYXR1cmU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIFsnZnVsbFNpZ25lZFJlY292ZXJ5JywgLi4uc2NyaXB0VHlwZXNdXG4gICAgICApO1xuXG4gICAgICBydW4oXG4gICAgICAgIGNvaW4sXG4gICAgICAgIHNjcmlwdFR5cGVzLFxuICAgICAgICB3YWxsZXRLZXlzLFxuICAgICAgICB7XG4gICAgICAgICAga2V5czoga2V5c0Z1bGxTaWduZWRSZWNvdmVyeSxcbiAgICAgICAgICBoYXNVc2VyU2lnbmF0dXJlOiB0cnVlLFxuICAgICAgICAgIGhhc0JhY2t1cFNpZ25hdHVyZTogdHJ1ZSxcbiAgICAgICAgICBmZWVSYXRlOiAyLFxuICAgICAgICB9LFxuICAgICAgICBbJ2Z1bGxTaWduZWRSZWNvdmVyeScsICdmaXhlZEZlZVJhdGUnLCAuLi5zY3JpcHRUeXBlc11cbiAgICAgICk7XG5cbiAgICAgIHJ1bihcbiAgICAgICAgY29pbixcbiAgICAgICAgc2NyaXB0VHlwZXMsXG4gICAgICAgIGV4b3RpY1dhbGxldEtleXMsXG4gICAgICAgIHtcbiAgICAgICAgICBrZXlzOiBrZXlzRnVsbFNpZ25lZFJlY292ZXJ5RXhvdGljLFxuICAgICAgICAgIHVzZXJLZXlQYXRoOiBleG90aWNVc2VyS2V5UGF0aCxcbiAgICAgICAgICBoYXNVc2VyU2lnbmF0dXJlOiB0cnVlLFxuICAgICAgICAgIGhhc0JhY2t1cFNpZ25hdHVyZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgWydmdWxsU2lnbmVkUmVjb3ZlcnknLCAnY3VzdG9tVXNlcktleVBhdGgnLCAuLi5zY3JpcHRUeXBlc11cbiAgICAgICk7XG4gICAgfSk7XG59XG5cbmRlc2NyaWJlKCdCYWNrdXAgS2V5IFJlY292ZXJ5JywgZnVuY3Rpb24gKCkge1xuICAvLyBjb21wYXRpYmxlIHdpdGggYWxsIGNvaW5zXG4gIHJ1bldpdGhTY3JpcHRUeXBlcyhbJ3Ayc2gnXSk7XG5cbiAgLy8gc2Vnd2l0IGNvbXBhdGlibGUgY29pbnNcbiAgcnVuV2l0aFNjcmlwdFR5cGVzKFsncDJzaFAyd3NoJywgJ3Ayd3NoJ10pO1xuXG4gIC8vIHRhcHJvb3QgY29tcGF0aWJsZSBjb2luc1xuICBydW5XaXRoU2NyaXB0VHlwZXMoWydwMnRyJywgJ3AydHJNdXNpZzInXSwgeyBydW5LZXlQcm92aWRlclRlc3RzOiBmYWxzZSB9KTtcbn0pO1xuIl19
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsa0JBQWdCO0FBRWhCLDZDQUErQjtBQUMvQiw2QkFBOEI7QUFFOUIseURBQTJDO0FBQzNDLDhDQUErRDtBQUMvRCw4Q0FBNkM7QUFFN0Msc0NBTXNCO0FBQ3RCLGtDQVlpQjtBQUVqQixpQ0FBOEM7QUFFOUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFLbkMsTUFBTSxNQUFNLEdBQUcsRUFBRSxZQUFZLEVBQVosdUJBQVksRUFBRSxDQUFDO0FBRWhDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0FBRXpCLFNBQVMsY0FBYyxDQUFDLENBQTJCO0lBQ2pELE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyx1QkFBWSxFQUFFLENBQUM7SUFDbkMsTUFBTSxDQUFDO1FBQ0wsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLENBQUM7SUFDSCxLQUFLLENBQUM7UUFDSixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBUS9CLFNBQVMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQXlCLEVBQUUsUUFBZ0I7SUFDNUYsU0FB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b0IsRUFBRSxtQkFBbUIsRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUM1RCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQsUUFBUSxDQUFDLHFCQUFxQixFQUFFO0lBQzlCLDRCQUE0QjtJQUM1QixrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFN0IsMEJBQTBCO0lBQzFCLGtCQUFrQixDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFM0MsMkJBQTJCO0lBQzNCLGtCQUFrQixDQUFDLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUM3RSxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0ICogYXMgbW9jaGEgZnJvbSAnbW9jaGEnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5pbXBvcnQgeyBCSVAzMkludGVyZmFjZSB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBDb25maWcsIGtyc1Byb3ZpZGVycywgVHJpcGxlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IERpbWVuc2lvbnMgfSBmcm9tICdAYml0Z28vdW5zcGVudHMnO1xuXG5pbXBvcnQge1xuICBBYnN0cmFjdFV0eG9Db2luLFxuICBiYWNrdXBLZXlSZWNvdmVyeSxcbiAgQmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbixcbiAgQ29pbmdlY2tvQXBpLFxuICBGb3JtYXR0ZWRPZmZsaW5lVmF1bHRUeEluZm8sXG59IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQge1xuICBkZWZhdWx0Qml0R28sXG4gIGVuY3J5cHRLZXljaGFpbixcbiAgZ2V0RGVmYXVsdFdhbGxldEtleXMsXG4gIGdldEZpeHR1cmUsXG4gIGdldE5vcm1hbFRlc3RuZXRDb2luLFxuICBnZXRXYWxsZXRBZGRyZXNzLFxuICBnZXRXYWxsZXRLZXlzLFxuICBrZXljaGFpbnMsXG4gIHNob3VsZEVxdWFsSlNPTixcbiAgdG9LZXljaGFpbkJhc2U1OCxcbiAgdXR4b0NvaW5zLFxufSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHsgTW9ja1JlY292ZXJ5UHJvdmlkZXIgfSBmcm9tICcuL21vY2snO1xuXG5jb25zdCB7IHRvT3V0cHV0IH0gPSB1dHhvbGliLmJpdGdvO1xudHlwZSBXYWxsZXRVbnNwZW50ID0gdXR4b2xpYi5iaXRnby5XYWxsZXRVbnNwZW50PGJpZ2ludD47XG50eXBlIFJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cztcbnR5cGUgU2NyaXB0VHlwZTJPZjMgPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZTJPZjM7XG5cbmNvbnN0IGNvbmZpZyA9IHsga3JzUHJvdmlkZXJzIH07XG5cbm5vY2suZGlzYWJsZU5ldENvbm5lY3QoKTtcblxuZnVuY3Rpb24gY29uZmlnT3ZlcnJpZGUoZjogKGNvbmZpZzogQ29uZmlnKSA9PiB2b2lkKSB7XG4gIGNvbnN0IGJhY2t1cCA9IHsgLi4ua3JzUHJvdmlkZXJzIH07XG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgZihjb25maWcpO1xuICB9KTtcbiAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgIE9iamVjdC5lbnRyaWVzKGJhY2t1cCkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICBjb25maWdba10gPSB2O1xuICAgIH0pO1xuICB9KTtcbn1cblxuY29uc3Qgd2FsbGV0UGFzc3BocmFzZSA9ICdsb2wnO1xuXG50eXBlIE5hbWVkS2V5cyA9IHtcbiAgdXNlcktleTogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgYml0Z29LZXk6IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIGdldE5hbWVkS2V5cyhbdXNlcktleSwgYmFja3VwS2V5LCBiaXRnb0tleV06IFRyaXBsZTxCSVAzMkludGVyZmFjZT4sIHBhc3N3b3JkOiBzdHJpbmcpOiBOYW1lZEtleXMge1xuICBmdW5jdGlvbiBlbmNvZGUoazogQklQMzJJbnRlcmZhY2UpOiBzdHJpbmcge1xuICAgIHJldHVybiBrLmlzTmV1dGVyZWQoKSA/IGsudG9CYXNlNTgoKSA6IGVuY3J5cHRLZXljaGFpbihwYXNzd29yZCwgdG9LZXljaGFpbkJhc2U1OChrKSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB1c2VyS2V5OiBlbmNvZGUodXNlcktleSksXG4gICAgYmFja3VwS2V5OiBlbmNvZGUoYmFja3VwS2V5KSxcbiAgICBiaXRnb0tleTogZW5jb2RlKGJpdGdvS2V5KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5c0ZvclVuc2lnbmVkU3dlZXAoW3VzZXJLZXksIGJhY2t1cEtleSwgYml0Z29LZXldOiBUcmlwbGU8QklQMzJJbnRlcmZhY2U+LCBwYXNzd29yZDogc3RyaW5nKTogTmFtZWRLZXlzIHtcbiAgcmV0dXJuIGdldE5hbWVkS2V5cyhbdXNlcktleS5uZXV0ZXJlZCgpLCBiYWNrdXBLZXkubmV1dGVyZWQoKSwgYml0Z29LZXkubmV1dGVyZWQoKV0sIHBhc3N3b3JkKTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5c0ZvcktleVJlY292ZXJ5U2VydmljZShcbiAgW3VzZXJLZXksIGJhY2t1cEtleSwgYml0Z29LZXldOiBUcmlwbGU8QklQMzJJbnRlcmZhY2U+LFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBOYW1lZEtleXMge1xuICByZXR1cm4gZ2V0TmFtZWRLZXlzKFt1c2VyS2V5LCBiYWNrdXBLZXkubmV1dGVyZWQoKSwgYml0Z29LZXkubmV1dGVyZWQoKV0sIHBhc3N3b3JkKTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5c0ZvckZ1bGxTaWduZWRSZWNvdmVyeShcbiAgW3VzZXJLZXksIGJhY2t1cEtleSwgYml0Z29LZXldOiBUcmlwbGU8QklQMzJJbnRlcmZhY2U+LFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBOYW1lZEtleXMge1xuICByZXR1cm4gZ2V0TmFtZWRLZXlzKFt1c2VyS2V5LCBiYWNrdXBLZXksIGJpdGdvS2V5Lm5ldXRlcmVkKCldLCBwYXNzd29yZCk7XG59XG5cbmNvbnN0IHdhbGxldEtleXMgPSBnZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuY29uc3Qga2V5c1Vuc2lnbmVkU3dlZXAgPSBnZXRLZXlzRm9yVW5zaWduZWRTd2VlcCh3YWxsZXRLZXlzLnRyaXBsZSwgd2FsbGV0UGFzc3BocmFzZSk7XG5jb25zdCBrZXlzS2V5UmVjb3ZlcnlTZXJ2aWNlID0gZ2V0S2V5c0ZvcktleVJlY292ZXJ5U2VydmljZSh3YWxsZXRLZXlzLnRyaXBsZSwgd2FsbGV0UGFzc3BocmFzZSk7XG5jb25zdCBrZXlzRnVsbFNpZ25lZFJlY292ZXJ5ID0gZ2V0S2V5c0ZvckZ1bGxTaWduZWRSZWNvdmVyeSh3YWxsZXRLZXlzLnRyaXBsZSwgd2FsbGV0UGFzc3BocmFzZSk7XG5cbmNvbnN0IGV4b3RpY1VzZXJLZXlQYXRoID0gJzk5Lzk5JztcbmNvbnN0IGV4b3RpY1dhbGxldEtleXMgPSBuZXcgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyhrZXljaGFpbnMsIFtcbiAgZXhvdGljVXNlcktleVBhdGgsXG4gIHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMuZGVmYXVsdFByZWZpeCxcbiAgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cy5kZWZhdWx0UHJlZml4LFxuXSk7XG5jb25zdCBrZXlzRnVsbFNpZ25lZFJlY292ZXJ5RXhvdGljID0gZ2V0S2V5c0ZvckZ1bGxTaWduZWRSZWNvdmVyeShleG90aWNXYWxsZXRLZXlzLnRyaXBsZSwgd2FsbGV0UGFzc3BocmFzZSk7XG5cbmZ1bmN0aW9uIHJ1bihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgc2NyaXB0VHlwZXM6IFNjcmlwdFR5cGUyT2YzW10sXG4gIHdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICBwYXJhbXM6IHtcbiAgICBrZXlzOiBOYW1lZEtleXM7XG4gICAgdXNlcktleVBhdGg/OiBzdHJpbmc7XG4gICAga3JzUHJvdmlkZXI/OiBzdHJpbmc7XG4gICAgaGFzVXNlclNpZ25hdHVyZTogYm9vbGVhbjtcbiAgICBoYXNCYWNrdXBTaWduYXR1cmU6IGJvb2xlYW47XG4gICAgaGFzS3JzT3V0cHV0PzogYm9vbGVhbjtcbiAgfSxcbiAgdGFnczogc3RyaW5nW10gPSBbXVxuKSB7XG4gIGNvbnN0IGRlZmF1bHRGZWVSYXRlU2F0QiA9IDEwMDtcblxuICBkZXNjcmliZShgQmFja3VwIEtleSBSZWNvdmVyeSBbJHtbY29pbi5nZXRDaGFpbigpLCAuLi50YWdzLCBwYXJhbXMua3JzUHJvdmlkZXJdLmpvaW4oJywnKX1dYCwgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGV4dGVybmFsV2FsbGV0ID0gZ2V0V2FsbGV0S2V5cygnZXh0ZXJuYWwnKTtcbiAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gZ2V0V2FsbGV0QWRkcmVzcyhjb2luLm5ldHdvcmssIGV4dGVybmFsV2FsbGV0KTtcblxuICAgIGxldCBrZXlSZWNvdmVyeVNlcnZpY2VBZGRyZXNzOiBzdHJpbmc7XG4gICAgbGV0IHJlY292ZXJ5OiAoQmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbiB8IEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbykgJiB7IHR4aWQ/OiBzdHJpbmcgfTtcbiAgICBsZXQgcmVjb3ZlcnlUeDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248bnVtYmVyIHwgYmlnaW50PiB8IHV0eG9saWIuYml0Z28uVXR4b1BzYnQ7XG5cbiAgICAvLyAxZTggKiA5ZTcgPCA5LjAwN2UxNSBidXQgMmU4ICogOWU3ID4gOS4wMDdlMTUgdG8gdGVzdCBib3RoIGNvZGUgcGF0aHMgaW4gcXVlcnlCbG9ja2NoYWluVW5zcGVudHNQYXRoXG4gICAgY29uc3QgdmFsdWVNdWwgPSBjb2luLmFtb3VudFR5cGUgPT09ICdiaWdpbnQnID8gQmlnSW50KDllNykgOiBCaWdJbnQoMSk7XG4gICAgYmVmb3JlKCdtb2NrJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2lub24uc3R1YihDb2luZ2Vja29BcGkucHJvdG90eXBlLCAnZ2V0VVNEUHJpY2UnKS5yZXNvbHZlcyg2OV80MjApO1xuICAgIH0pO1xuXG4gICAgY29uZmlnT3ZlcnJpZGUoZnVuY3Rpb24gKGNvbmZpZzogQ29uZmlnKSB7XG4gICAgICBjb25zdCBjb25maWdLcnNQcm92aWRlcnMgPSB7IC4uLmNvbmZpZy5rcnNQcm92aWRlcnMgfTtcbiAgICAgIGNvbmZpZ0tyc1Byb3ZpZGVycy5kYWkuc3VwcG9ydGVkQ29pbnMgPSBbY29pbi5nZXRGYW1pbHkoKV07XG4gICAgICBjb25maWdLcnNQcm92aWRlcnMua2V5dGVybmFsLnN1cHBvcnRlZENvaW5zID0gW2NvaW4uZ2V0RmFtaWx5KCldO1xuICAgICAga2V5UmVjb3ZlcnlTZXJ2aWNlQWRkcmVzcyA9IGdldFdhbGxldEFkZHJlc3MoY29pbi5uZXR3b3JrLCBleHRlcm5hbFdhbGxldCwgMCwgMTAwKTtcbiAgICAgIGNvbmZpZ0tyc1Byb3ZpZGVycy5rZXl0ZXJuYWwuZmVlQWRkcmVzc2VzID0geyBbY29pbi5nZXRDaGFpbigpXToga2V5UmVjb3ZlcnlTZXJ2aWNlQWRkcmVzcyB9O1xuICAgICAgY29uZmlnLmtyc1Byb3ZpZGVycyA9IGNvbmZpZ0tyc1Byb3ZpZGVycztcbiAgICB9KTtcblxuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIGxldCByZWNvdmVyVW5zcGVudHM6IHV0eG9saWIuYml0Z28uVW5zcGVudDxiaWdpbnQ+W107XG4gICAgbGV0IG1vY2tlZEFwaVVuc3BlbnRzOiB1dHhvbGliLmJpdGdvLlVuc3BlbnQ8YmlnaW50PltdO1xuXG4gICAgYmVmb3JlKCdjcmVhdGUgcmVjb3ZlcnkgZGF0YScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMudGltZW91dCgxMF8wMDApO1xuICAgICAgcmVjb3ZlclVuc3BlbnRzID0gc2NyaXB0VHlwZXMuZmxhdE1hcCgoc2NyaXB0VHlwZSwgaW5kZXgpID0+IFtcbiAgICAgICAgdXR4b2xpYi50ZXN0dXRpbC50b1Vuc3BlbnQoeyBzY3JpcHRUeXBlLCB2YWx1ZTogQmlnSW50KDFlOCkgKiB2YWx1ZU11bCB9LCBpbmRleCwgY29pbi5uZXR3b3JrLCB3YWxsZXRLZXlzKSxcbiAgICAgICAgdXR4b2xpYi50ZXN0dXRpbC50b1Vuc3BlbnQoeyBzY3JpcHRUeXBlLCB2YWx1ZTogQmlnSW50KDJlOCkgKiB2YWx1ZU11bCB9LCBpbmRleCwgY29pbi5uZXR3b3JrLCB3YWxsZXRLZXlzKSxcbiAgICAgICAgdXR4b2xpYi50ZXN0dXRpbC50b1Vuc3BlbnQoeyBzY3JpcHRUeXBlLCB2YWx1ZTogQmlnSW50KDNlOCkgKiB2YWx1ZU11bCB9LCBpbmRleCwgY29pbi5uZXR3b3JrLCB3YWxsZXRLZXlzKSxcbiAgICAgIF0pO1xuXG4gICAgICAvLyBJZiB0aGUgY29pbiBpcyBiY2gsIGNvbnZlcnQgdGhlIG1vY2tlZCB1bnNwZW50IGFkZHJlc3MgdG8gY2FzaGFkZHIgZm9ybWF0IHNpbmNlIHRoYXQgaXMgdGhlIGZvcm1hdCB0aGF0IGJsb2NrY2hhaXJcbiAgICAgIC8vIHJldHVybnMgb24gdGhlIC9kYXNoYm9hcmRzL2FkZHJlc3NlcyByZXNwb25zZVxuICAgICAgbW9ja2VkQXBpVW5zcGVudHMgPVxuICAgICAgICBjb2luLmdldENoYWluKCkgPT09ICdiY2gnIHx8IGNvaW4uZ2V0Q2hhaW4oKSA9PT0gJ2JjaGEnXG4gICAgICAgICAgPyByZWNvdmVyVW5zcGVudHMubWFwKCh1KSA9PiAoeyAuLi51LCBhZGRyZXNzOiBjb2luLmNhbm9uaWNhbEFkZHJlc3ModS5hZGRyZXNzLCAnY2FzaGFkZHInKS5zcGxpdCgnOicpWzFdIH0pKVxuICAgICAgICAgIDogcmVjb3ZlclVuc3BlbnRzO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja2VkQXBpVW5zcGVudHMubGVuZ3RoLCByZWNvdmVyVW5zcGVudHMubGVuZ3RoKTtcbiAgICAgIHJlY292ZXJ5ID0gYXdhaXQgYmFja3VwS2V5UmVjb3ZlcnkoY29pbiwgZGVmYXVsdEJpdEdvLCB7XG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHNjYW46IDUsXG4gICAgICAgIGlnbm9yZUFkZHJlc3NUeXBlczogW10sXG4gICAgICAgIHVzZXJLZXlQYXRoOiBwYXJhbXMudXNlcktleVBhdGgsXG4gICAgICAgIGtyc1Byb3ZpZGVyOiBwYXJhbXMua3JzUHJvdmlkZXIsXG4gICAgICAgIC4uLnBhcmFtcy5rZXlzLFxuICAgICAgICByZWNvdmVyeVByb3ZpZGVyOiBuZXcgTW9ja1JlY292ZXJ5UHJvdmlkZXIobW9ja2VkQXBpVW5zcGVudHMpLFxuICAgICAgICBmZWVSYXRlOiBkZWZhdWx0RmVlUmF0ZVNhdEIsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHR4SGV4ID1cbiAgICAgICAgKHJlY292ZXJ5IGFzIEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb24pLnRyYW5zYWN0aW9uSGV4ID8/IChyZWNvdmVyeSBhcyBGb3JtYXR0ZWRPZmZsaW5lVmF1bHRUeEluZm8pLnR4SGV4O1xuICAgICAgY29uc3QgaXNQc2J0ID0gdXR4b2xpYi5iaXRnby5pc1BzYnQodHhIZXgpO1xuICAgICAgcmVjb3ZlcnlUeCA9IGlzUHNidFxuICAgICAgICA/IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21IZXgodHhIZXgsIGNvaW4ubmV0d29yaylcbiAgICAgICAgOiB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleCh0eEhleCBhcyBzdHJpbmcsIGNvaW4ubmV0d29yaywgY29pbi5hbW91bnRUeXBlKTtcbiAgICAgIHJlY292ZXJ5LnR4aWQgPVxuICAgICAgICByZWNvdmVyeVR4IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCA/IHJlY292ZXJ5VHguZ2V0VW5zaWduZWRUeCgpLmdldElkKCkgOiByZWNvdmVyeVR4LmdldElkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFzIGNvcnJlY3QgcmVjb3ZlcnkgcHJvdmlkZXIgbW9ja3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZWNvdmVyeVByb3ZpZGVyID0gbmV3IE1vY2tSZWNvdmVyeVByb3ZpZGVyKG1vY2tlZEFwaVVuc3BlbnRzKTtcbiAgICAgIChhd2FpdCByZWNvdmVyeVByb3ZpZGVyLmdldFVuc3BlbnRzRm9yQWRkcmVzc2VzKG1vY2tlZEFwaVVuc3BlbnRzLm1hcCgodSkgPT4gdS5hZGRyZXNzKSkpLmxlbmd0aC5zaG91bGQuZXFsKFxuICAgICAgICBtb2NrZWRBcGlVbnNwZW50cy5sZW5ndGhcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFzIGV4cGVjdGVkIGZlZSByYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCEocmVjb3ZlcnlUeCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQpKSB7XG4gICAgICAgIHRoaXMuc2tpcCgpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5wdXRTdW0gPSB1dHhvbGliLmJpdGdvLnVuc3BlbnRTdW0ocmVjb3ZlclVuc3BlbnRzLCAnYmlnaW50Jyk7XG4gICAgICBjb25zdCBvdXRwdXRTdW0gPSByZWNvdmVyeVR4LnR4T3V0cHV0cy5yZWR1Y2UoKHN1bSwgbykgPT4gc3VtICsgby52YWx1ZSwgQmlnSW50KDApKTtcbiAgICAgIGNvbnN0IGZlZSA9IGlucHV0U3VtIC0gb3V0cHV0U3VtO1xuICAgICAgY29uc3QgdnNpemUgPSBEaW1lbnNpb25zLmZyb21Qc2J0KHJlY292ZXJ5VHgpLmdldFZTaXplKCk7XG4gICAgICBjb25zdCBmZWVSYXRlU2F0QiA9IE51bWJlcihmZWUpIC8gdnNpemU7XG4gICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoZmVlUmF0ZVNhdEIgLSBkZWZhdWx0RmVlUmF0ZVNhdEIpIC8gZGVmYXVsdEZlZVJhdGVTYXRCO1xuICAgICAgLy8gd2l0aGluIDElXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGlmZiA8IDAuMDEsIHRydWUsIGBleHBlY3RlZCBmZWUgcmF0ZSAke2RlZmF1bHRGZWVSYXRlU2F0Qn0gYnV0IGdvdCAke2ZlZVJhdGVTYXRCfWApO1xuICAgIH0pO1xuXG4gICAgaXQoJ21hdGNoZXMgZml4dHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGZpeHR1cmVDb2luID0gZ2V0Tm9ybWFsVGVzdG5ldENvaW4oY29pbik7XG4gICAgICBjb25zdCBmaXh0dXJlUmVjb3ZlcnkgPSB7IC4uLnJlY292ZXJ5IH07XG4gICAgICBpZiAoZml4dHVyZVJlY292ZXJ5LmNvaW4pIHtcbiAgICAgICAgZml4dHVyZVJlY292ZXJ5LmNvaW4gPSBmaXh0dXJlQ29pbi5nZXRDaGFpbigpO1xuICAgICAgfVxuXG4gICAgICBzaG91bGRFcXVhbEpTT04oXG4gICAgICAgIGZpeHR1cmVSZWNvdmVyeSxcbiAgICAgICAgYXdhaXQgZ2V0Rml4dHVyZShcbiAgICAgICAgICBmaXh0dXJlQ29pbixcbiAgICAgICAgICBgcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnktJHsocGFyYW1zLmtyc1Byb3ZpZGVyID8gdGFncy5jb25jYXQoW3BhcmFtcy5rcnNQcm92aWRlcl0pIDogdGFncykuam9pbignLScpfWAsXG4gICAgICAgICAgcmVjb3ZlcnlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXMgZXhwZWN0ZWQgaW5wdXQgY291bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAocmVjb3ZlcnlUeCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQgPyByZWNvdmVyeVR4LmRhdGEuaW5wdXRzIDogcmVjb3ZlcnlUeC5pbnMpLmxlbmd0aC5zaG91bGQuZXFsKFxuICAgICAgICByZWNvdmVyVW5zcGVudHMubGVuZ3RoXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gY2hlY2tJbnB1dHNTaWduZWRCeShcbiAgICAgIHR4OiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxudW1iZXIgfCBiaWdpbnQ+IHwgdXR4b2xpYi5iaXRnby5VdHhvUHNidCxcbiAgICAgIHJvb3RLZXk6IEJJUDMySW50ZXJmYWNlLFxuICAgICAgZXhwZWN0Q291bnQ6IG51bWJlclxuICAgICkge1xuICAgICAgaWYgKHR4IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCkge1xuICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZSh0eDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCwgaW5wdXRJbmRleDogbnVtYmVyKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0eC52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0SEQoaW5wdXRJbmRleCwgcm9vdEtleSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUubWVzc2FnZSA9PT0gJ05vIHNpZ25hdHVyZXMgdG8gdmFsaWRhdGUnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHR4LmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpbnB1dEluZGV4KSA9PiB7XG4gICAgICAgICAgdmFsaWRhdGUodHgsIGlucHV0SW5kZXgpLnNob3VsZC5lcWwoISFleHBlY3RDb3VudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJldk91dHB1dHMgPSByZWNvdmVyVW5zcGVudHNcbiAgICAgICAgICAubWFwKCh1KSA9PiB0b091dHB1dCh1LCBjb2luLm5ldHdvcmspKVxuICAgICAgICAgIC5tYXAoKHYpID0+ICh7IC4uLnYsIHZhbHVlOiB1dHhvbGliLmJpdGdvLnRvVE51bWJlcih2LnZhbHVlLCBjb2luLmFtb3VudFR5cGUpIH0pKTtcbiAgICAgICAgdHguaW5zLmZvckVhY2goKGlucHV0LCBpbnB1dEluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgdW5zcGVudCA9IHJlY292ZXJVbnNwZW50c1tpbnB1dEluZGV4XSBhcyBXYWxsZXRVbnNwZW50O1xuICAgICAgICAgIGNvbnN0IHsgcHVibGljS2V5IH0gPSByb290S2V5LmRlcml2ZVBhdGgod2FsbGV0S2V5cy5nZXREZXJpdmF0aW9uUGF0aChyb290S2V5LCB1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KSk7XG4gICAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IHV0eG9saWIuYml0Z29cbiAgICAgICAgICAgIC5nZXRTaWduYXR1cmVWZXJpZmljYXRpb25zKFxuICAgICAgICAgICAgICB0eCxcbiAgICAgICAgICAgICAgaW5wdXRJbmRleCxcbiAgICAgICAgICAgICAgdXR4b2xpYi5iaXRnby50b1ROdW1iZXIodW5zcGVudC52YWx1ZSwgY29pbi5hbW91bnRUeXBlKSxcbiAgICAgICAgICAgICAgeyBwdWJsaWNLZXkgfSxcbiAgICAgICAgICAgICAgcHJldk91dHB1dHNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5maWx0ZXIoKHMpID0+IHMuc2lnbmVkQnkgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxbChleHBlY3RDb3VudCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGl0KChwYXJhbXMuaGFzVXNlclNpZ25hdHVyZSA/ICdoYXMnIDogJ2hhcyBubycpICsgJyB1c2VyIHNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNoZWNrSW5wdXRzU2lnbmVkQnkocmVjb3ZlcnlUeCwgd2FsbGV0S2V5cy51c2VyLCBwYXJhbXMuaGFzVXNlclNpZ25hdHVyZSA/IDEgOiAwKTtcbiAgICB9KTtcblxuICAgIGl0KChwYXJhbXMuaGFzQmFja3VwU2lnbmF0dXJlID8gJ2hhcycgOiAnaGFzIG5vJykgKyAnIGJhY2t1cCBzaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjaGVja0lucHV0c1NpZ25lZEJ5KHJlY292ZXJ5VHgsIHdhbGxldEtleXMuYmFja3VwLCBwYXJhbXMuaGFzQmFja3VwU2lnbmF0dXJlID8gMSA6IDApO1xuICAgIH0pO1xuXG4gICAgaWYgKHBhcmFtcy5oYXNVc2VyU2lnbmF0dXJlICYmIHBhcmFtcy5oYXNCYWNrdXBTaWduYXR1cmUpIHtcbiAgICAgIGl0KCdoYXMgbm8gcGxhY2Vob2xkZXIgc2lnbmF0dXJlcycsIGZ1bmN0aW9uICh0aGlzOiBtb2NoYS5Db250ZXh0KSB7XG4gICAgICAgIGlmIChyZWNvdmVyeVR4IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICByZWNvdmVyeVR4Lmlucy5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gdXR4b2xpYi5iaXRnby5wYXJzZVNpZ25hdHVyZVNjcmlwdChpbnB1dCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhcnNlZC5zY3JpcHRUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ3Ayc2gnOlxuICAgICAgICAgICAgICBjYXNlICdwMnNoUDJ3c2gnOlxuICAgICAgICAgICAgICBjYXNlICdwMndzaCc6XG4gICAgICAgICAgICAgIGNhc2UgJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnOlxuICAgICAgICAgICAgICAgIHBhcnNlZC5zaWduYXR1cmVzLmZvckVhY2goKHNpZ25hdHVyZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKHV0eG9saWIuYml0Z28uaXNQbGFjZWhvbGRlclNpZ25hdHVyZShzaWduYXR1cmUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcGxhY2Vob2xkZXIgc2lnbmF0dXJlIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgc2NyaXB0VHlwZSAke3BhcnNlZC5zY3JpcHRUeXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2tpcCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpdCgocGFyYW1zLmhhc0tyc091dHB1dCA/ICdoYXMnIDogJ2hhcyBubycpICsgJyBrZXkgcmVjb3Zlcnkgc2VydmljZSBvdXRwdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvdXRzID0gcmVjb3ZlcnlUeCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQgPyByZWNvdmVyeVR4LmdldFVuc2lnbmVkVHgoKS5vdXRzIDogcmVjb3ZlcnlUeC5vdXRzO1xuICAgICAgb3V0cy5sZW5ndGguc2hvdWxkLmVxbCgxKTtcbiAgICAgIGNvbnN0IG91dHB1dEFkZHJlc3NlcyA9IG91dHMubWFwKChvKSA9PiB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChvLnNjcmlwdCwgcmVjb3ZlcnlUeC5uZXR3b3JrKSk7XG4gICAgICBvdXRwdXRBZGRyZXNzZXNcbiAgICAgICAgLmluY2x1ZGVzKGtleVJlY292ZXJ5U2VydmljZUFkZHJlc3MpXG4gICAgICAgIC5zaG91bGQuZXFsKCEhcGFyYW1zLmhhc0tyc091dHB1dCAmJiBwYXJhbXMua3JzUHJvdmlkZXIgPT09ICdrZXl0ZXJuYWwnKTtcbiAgICAgIG91dHB1dEFkZHJlc3Nlcy5pbmNsdWRlcyhyZWNvdmVyeURlc3RpbmF0aW9uKS5zaG91bGQuZXFsKHRydWUpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuV2l0aFNjcmlwdFR5cGVzKFxuICBzY3JpcHRUeXBlczogU2NyaXB0VHlwZTJPZjNbXSxcbiAgeyBydW5LZXlQcm92aWRlclRlc3RzID0gdHJ1ZSB9OiB7IHJ1bktleVByb3ZpZGVyVGVzdHM/OiBib29sZWFuIH0gPSB7fVxuKSB7XG4gIHV0eG9Db2luc1xuICAgIC5maWx0ZXIoKGNvaW4pID0+IHNjcmlwdFR5cGVzLmV2ZXJ5KCh0eXBlKSA9PiBjb2luLnN1cHBvcnRzQWRkcmVzc1R5cGUodHlwZSkpKVxuICAgIC5mb3JFYWNoKChjb2luKSA9PiB7XG4gICAgICBydW4oXG4gICAgICAgIGNvaW4sXG4gICAgICAgIHNjcmlwdFR5cGVzLFxuICAgICAgICB3YWxsZXRLZXlzLFxuICAgICAgICB7XG4gICAgICAgICAga2V5czoga2V5c1Vuc2lnbmVkU3dlZXAsXG4gICAgICAgICAgaGFzVXNlclNpZ25hdHVyZTogZmFsc2UsXG4gICAgICAgICAgaGFzQmFja3VwU2lnbmF0dXJlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgWyd1bnNpZ25lZFJlY292ZXJ5JywgLi4uc2NyaXB0VHlwZXNdXG4gICAgICApO1xuXG4gICAgICBpZiAocnVuS2V5UHJvdmlkZXJUZXN0cykge1xuICAgICAgICBbJ2RhaScsICdrZXl0ZXJuYWwnXS5mb3JFYWNoKChrcnNQcm92aWRlcikgPT4ge1xuICAgICAgICAgIHJ1bihcbiAgICAgICAgICAgIGNvaW4sXG4gICAgICAgICAgICBzY3JpcHRUeXBlcyxcbiAgICAgICAgICAgIHdhbGxldEtleXMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleXM6IGtleXNLZXlSZWNvdmVyeVNlcnZpY2UsXG4gICAgICAgICAgICAgIGtyc1Byb3ZpZGVyOiBrcnNQcm92aWRlcixcbiAgICAgICAgICAgICAgaGFzVXNlclNpZ25hdHVyZTogdHJ1ZSxcbiAgICAgICAgICAgICAgaGFzQmFja3VwU2lnbmF0dXJlOiBmYWxzZSxcbiAgICAgICAgICAgICAgaGFzS3JzT3V0cHV0OiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbJ2tleVJlY292ZXJ5U2VydmljZScsIC4uLnNjcmlwdFR5cGVzXVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBydW4oXG4gICAgICAgIGNvaW4sXG4gICAgICAgIHNjcmlwdFR5cGVzLFxuICAgICAgICB3YWxsZXRLZXlzLFxuICAgICAgICB7XG4gICAgICAgICAga2V5czoga2V5c0Z1bGxTaWduZWRSZWNvdmVyeSxcbiAgICAgICAgICBoYXNVc2VyU2lnbmF0dXJlOiB0cnVlLFxuICAgICAgICAgIGhhc0JhY2t1cFNpZ25hdHVyZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgWydmdWxsU2lnbmVkUmVjb3ZlcnknLCAuLi5zY3JpcHRUeXBlc11cbiAgICAgICk7XG5cbiAgICAgIHJ1bihcbiAgICAgICAgY29pbixcbiAgICAgICAgc2NyaXB0VHlwZXMsXG4gICAgICAgIGV4b3RpY1dhbGxldEtleXMsXG4gICAgICAgIHtcbiAgICAgICAgICBrZXlzOiBrZXlzRnVsbFNpZ25lZFJlY292ZXJ5RXhvdGljLFxuICAgICAgICAgIHVzZXJLZXlQYXRoOiBleG90aWNVc2VyS2V5UGF0aCxcbiAgICAgICAgICBoYXNVc2VyU2lnbmF0dXJlOiB0cnVlLFxuICAgICAgICAgIGhhc0JhY2t1cFNpZ25hdHVyZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgWydmdWxsU2lnbmVkUmVjb3ZlcnknLCAnY3VzdG9tVXNlcktleVBhdGgnLCAuLi5zY3JpcHRUeXBlc11cbiAgICAgICk7XG4gICAgfSk7XG59XG5cbmRlc2NyaWJlKCdCYWNrdXAgS2V5IFJlY292ZXJ5JywgZnVuY3Rpb24gKCkge1xuICAvLyBjb21wYXRpYmxlIHdpdGggYWxsIGNvaW5zXG4gIHJ1bldpdGhTY3JpcHRUeXBlcyhbJ3Ayc2gnXSk7XG5cbiAgLy8gc2Vnd2l0IGNvbXBhdGlibGUgY29pbnNcbiAgcnVuV2l0aFNjcmlwdFR5cGVzKFsncDJzaFAyd3NoJywgJ3Ayd3NoJ10pO1xuXG4gIC8vIHRhcHJvb3QgY29tcGF0aWJsZSBjb2luc1xuICBydW5XaXRoU2NyaXB0VHlwZXMoWydwMnRyJywgJ3AydHJNdXNpZzInXSwgeyBydW5LZXlQcm92aWRlclRlc3RzOiBmYWxzZSB9KTtcbn0pO1xuIl19