@bitgo-beta/sdk-coin-stx 1.4.3-alpha.42 → 1.4.3-alpha.420
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/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +24 -9
- package/dist/src/lib/abstractContractBuilder.js +2 -2
- package/dist/src/lib/constants.d.ts +2 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +5 -3
- package/dist/src/lib/contractBuilder.js +10 -10
- package/dist/src/lib/fungibleTokenTransferBuilder.d.ts +62 -0
- package/dist/src/lib/fungibleTokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/fungibleTokenTransferBuilder.js +131 -0
- package/dist/src/lib/iface.d.ts +56 -0
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.js +23 -9
- package/dist/src/lib/keyPair.js +18 -19
- package/dist/src/lib/sendmanyBuilder.js +11 -11
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +31 -15
- package/dist/src/lib/transactionBuilder.js +12 -12
- package/dist/src/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +9 -2
- package/dist/src/lib/transferBuilder.js +4 -4
- package/dist/src/lib/utils.d.ts +25 -2
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +141 -62
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/dist/src/sip10Token.d.ts +22 -0
- package/dist/src/sip10Token.d.ts.map +1 -0
- package/dist/src/sip10Token.js +128 -0
- package/dist/src/stx.d.ts +146 -2
- package/dist/src/stx.d.ts.map +1 -1
- package/dist/src/stx.js +420 -11
- package/dist/src/tstx.js +1 -1
- package/dist/test/fixtures.d.ts +119 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +147 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +144 -0
- package/dist/test/unit/resources.d.ts +97 -0
- package/dist/test/unit/resources.d.ts.map +1 -0
- package/dist/test/unit/resources.js +144 -0
- package/dist/test/unit/sip10Token.d.ts +2 -0
- package/dist/test/unit/sip10Token.d.ts.map +1 -0
- package/dist/test/unit/sip10Token.js +374 -0
- package/dist/test/unit/stx.d.ts +2 -0
- package/dist/test/unit/stx.d.ts.map +1 -0
- package/dist/test/unit/stx.js +470 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +83 -0
- package/dist/test/unit/transactionBuilder/contractBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/contractBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/contractBuilder.js +421 -0
- package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.js +187 -0
- package/dist/test/unit/transactionBuilder/sendmanyBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/sendmanyBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/sendmanyBuilder.js +140 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +347 -0
- package/dist/test/unit/util.d.ts +2 -0
- package/dist/test/unit/util.d.ts.map +1 -0
- package/dist/test/unit/util.js +326 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +13 -11
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -107
|
@@ -0,0 +1,470 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const nock_1 = __importDefault(require("nock"));
|
|
41
|
+
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
42
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
43
|
+
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
44
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
45
|
+
const transactions_1 = require("@stacks/transactions");
|
|
46
|
+
const testData = __importStar(require("../fixtures"));
|
|
47
|
+
const src_1 = require("../../src");
|
|
48
|
+
const { KeyPair } = src_1.StxLib;
|
|
49
|
+
describe('STX:', function () {
|
|
50
|
+
const coinName = 'stx';
|
|
51
|
+
const coinNameTest = 'tstx';
|
|
52
|
+
let bitgo;
|
|
53
|
+
let basecoin;
|
|
54
|
+
const badValidAddresses = [
|
|
55
|
+
'',
|
|
56
|
+
null,
|
|
57
|
+
'abc',
|
|
58
|
+
'SP244HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6',
|
|
59
|
+
'ST1T758K6T2YRKG9Q0TJ16B6FP5QQREWZSESRS0PY',
|
|
60
|
+
];
|
|
61
|
+
const goodAddresses = [
|
|
62
|
+
'STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6',
|
|
63
|
+
'ST11NJTTKGVT6D1HY4NJRVQWMQM7TVAR091EJ8P2Y',
|
|
64
|
+
'SP2T758K6T2YRKG9Q0TJ16B6FP5QQREWZSESRS0PY',
|
|
65
|
+
'SM3W5QFWGPG1JC8R25EVZDEP3BESJZ831JPNNQFTZ',
|
|
66
|
+
'SM3W5QFWGPG1JC8R25EVZDEP3BESJZ831JPNNQFTZ?memoId=1',
|
|
67
|
+
'ST1WVJMS5VS41F0YMH7D2M0VHXRG4CY43ZJZBS60A?memoId=4',
|
|
68
|
+
];
|
|
69
|
+
before(function () {
|
|
70
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, {
|
|
71
|
+
env: 'mock',
|
|
72
|
+
});
|
|
73
|
+
bitgo.initializeTestVars();
|
|
74
|
+
bitgo.safeRegister('stx', src_1.Stx.createInstance);
|
|
75
|
+
bitgo.safeRegister('tstx', src_1.Tstx.createInstance);
|
|
76
|
+
basecoin = bitgo.coin(coinNameTest);
|
|
77
|
+
});
|
|
78
|
+
/**
|
|
79
|
+
* Build an unsigned account-lib signle-signature send transaction
|
|
80
|
+
* @param destination The destination address of the transaction
|
|
81
|
+
* @param amount The amount to send to the recipient
|
|
82
|
+
*/
|
|
83
|
+
const buildUnsignedTransaction = async function ({ destination, amount = '100000', publicKey, memo = '' }) {
|
|
84
|
+
const factory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinName));
|
|
85
|
+
const txBuilder = factory.getTransferBuilder();
|
|
86
|
+
txBuilder.fee({
|
|
87
|
+
fee: '180',
|
|
88
|
+
});
|
|
89
|
+
txBuilder.to(destination);
|
|
90
|
+
txBuilder.amount(amount);
|
|
91
|
+
txBuilder.nonce(1);
|
|
92
|
+
txBuilder.fromPubKey(publicKey);
|
|
93
|
+
txBuilder.memo(memo);
|
|
94
|
+
txBuilder.numberSignatures(1);
|
|
95
|
+
return await txBuilder.build();
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Build an unsigned account-lib multi-signature send transaction
|
|
99
|
+
* @param destination The destination address of the transaction
|
|
100
|
+
* @param amount The amount to send to the recipient
|
|
101
|
+
*/
|
|
102
|
+
const buildmultiSigUnsignedTransaction = async function ({ destination, amount = '100000', publicKeys, memo = '' }) {
|
|
103
|
+
const factory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinName));
|
|
104
|
+
const txBuilder = factory.getTransferBuilder();
|
|
105
|
+
txBuilder.fee({
|
|
106
|
+
fee: '180',
|
|
107
|
+
});
|
|
108
|
+
txBuilder.to(destination);
|
|
109
|
+
txBuilder.amount(amount);
|
|
110
|
+
txBuilder.nonce(1);
|
|
111
|
+
txBuilder.fromPubKey(publicKeys);
|
|
112
|
+
txBuilder.numberSignatures(2);
|
|
113
|
+
txBuilder.memo(memo);
|
|
114
|
+
return await txBuilder.build();
|
|
115
|
+
};
|
|
116
|
+
it('should instantiate the coin', function () {
|
|
117
|
+
let localBasecoin = bitgo.coin('tstx');
|
|
118
|
+
localBasecoin.should.be.an.instanceof(src_1.Tstx);
|
|
119
|
+
localBasecoin = bitgo.coin('stx');
|
|
120
|
+
localBasecoin.should.be.an.instanceof(src_1.Stx);
|
|
121
|
+
});
|
|
122
|
+
it('should check valid addresses', function () {
|
|
123
|
+
badValidAddresses.map((addr) => {
|
|
124
|
+
basecoin.isValidAddress(addr).should.equal(false);
|
|
125
|
+
});
|
|
126
|
+
goodAddresses.map((addr) => {
|
|
127
|
+
basecoin.isValidAddress(addr).should.equal(true);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
it('should verify isWalletAddress', async function () {
|
|
131
|
+
const userKey = {
|
|
132
|
+
pub: 'xpub661MyMwAqRbcGS2HMdvANN7o8ESWqwvr5U4ry5fZdD9VHhymWyfoDQF4vzfKotXgGtJTrwrFRz7XbGFov4FqdKKo6mRYNWvMp7P23DjuJnS',
|
|
133
|
+
};
|
|
134
|
+
const backupKey = {
|
|
135
|
+
pub: 'xpub661MyMwAqRbcFEzr5CcpFzPG45rmPf75DTvDobN5gJimCatbHtzR53SbHzDZ1J56byKSsdc8vSujGuQpyPjb7Lsua2NfADJewPxNzL3N6Tj',
|
|
136
|
+
};
|
|
137
|
+
const bitgoKey = {
|
|
138
|
+
pub: 'xpub661MyMwAqRbcGP1adk34VzRQJEMX25rCxjEyU9YFFWNhWNzwPoqgjLoKfnqotLwrz7kBevWbRZnqTSQrQDuJuYUQaDQ5DDPEzEXMwPS9PEf',
|
|
139
|
+
};
|
|
140
|
+
const keychains = [userKey, backupKey, bitgoKey];
|
|
141
|
+
const validAddress1 = 'SNAYQFZ6EF54D5XWJP3GAE1Y8DPYXKFC7TTMYXFV';
|
|
142
|
+
const validAddress2 = 'SNAYQFZ6EF54D5XWJP3GAE1Y8DPYXKFC7TTMYXFV?memoId=2';
|
|
143
|
+
const unrelatedValidAddress = 'ST11NJTTKGVT6D1HY4NJRVQWMQM7TVAR091EJ8P2Y?memoId=1';
|
|
144
|
+
const invalidAddress = 'ST1T758K6T2YRKG9Q0TJ16B6FP5QQREWZSESRS0PY';
|
|
145
|
+
(await basecoin.isWalletAddress({ address: validAddress1, keychains })).should.true();
|
|
146
|
+
(await basecoin.isWalletAddress({ address: validAddress2, keychains })).should.true();
|
|
147
|
+
(await basecoin.isWalletAddress({ address: unrelatedValidAddress, keychains })).should.false();
|
|
148
|
+
assert_1.default.rejects(async () => basecoin.isWalletAddress({ address: invalidAddress, keychains }), `invalid address ${invalidAddress}`);
|
|
149
|
+
});
|
|
150
|
+
it('should explain a transfer transaction', async function () {
|
|
151
|
+
const explain = await basecoin.explainTransaction({
|
|
152
|
+
txHex: testData.txForExplainTransfer,
|
|
153
|
+
feeInfo: { fee: '' },
|
|
154
|
+
});
|
|
155
|
+
explain.id.should.equal(testData.txExplainedTransfer.id);
|
|
156
|
+
explain.outputAmount.should.equal(testData.txExplainedTransfer.outputAmount);
|
|
157
|
+
explain.outputs[0].amount.should.equal(testData.txExplainedTransfer.outputAmount);
|
|
158
|
+
explain.outputs[0].address.should.equal(testData.txExplainedTransfer.recipient);
|
|
159
|
+
explain.outputs[0].memo.should.equal(testData.txExplainedTransfer.memo);
|
|
160
|
+
explain.fee.should.equal(testData.txExplainedTransfer.fee);
|
|
161
|
+
explain.changeAmount.should.equal('0');
|
|
162
|
+
});
|
|
163
|
+
it('should explain an unsigned transaction', async function () {
|
|
164
|
+
const key = new KeyPair();
|
|
165
|
+
const destination = 'ST11NJTTKGVT6D1HY4NJRVQWMQM7TVAR091EJ8P2Y';
|
|
166
|
+
const amount = '100000';
|
|
167
|
+
const memo = 'i cannot be broadcast';
|
|
168
|
+
const unsignedTransaction = await buildUnsignedTransaction({
|
|
169
|
+
destination,
|
|
170
|
+
amount,
|
|
171
|
+
publicKey: key.getKeys().pub,
|
|
172
|
+
memo: memo,
|
|
173
|
+
});
|
|
174
|
+
const unsignedHex = unsignedTransaction.toBroadcastFormat();
|
|
175
|
+
const explain = await basecoin.explainTransaction({
|
|
176
|
+
txHex: unsignedHex,
|
|
177
|
+
publicKeys: [key.getKeys().pub],
|
|
178
|
+
feeInfo: { fee: '' },
|
|
179
|
+
});
|
|
180
|
+
explain.memo.should.equal(memo);
|
|
181
|
+
explain.outputs[0].amount.should.equal(amount);
|
|
182
|
+
explain.outputs[0].address.should.equal(destination);
|
|
183
|
+
});
|
|
184
|
+
it('should explain unsigned transfer transaction hex', async function () {
|
|
185
|
+
const explain = await basecoin.explainTransaction({
|
|
186
|
+
txHex: testData.unsignedTxForExplainTransfer,
|
|
187
|
+
publicKeys: ['03797dd653040d344fd048c1ad05d4cbcb2178b30c6a0c4276994795f3e833da41'],
|
|
188
|
+
feeInfo: { fee: '' },
|
|
189
|
+
});
|
|
190
|
+
explain.outputAmount.should.equal(testData.unsignedTxExplainedTransfer.outputAmount);
|
|
191
|
+
explain.outputs[0].amount.should.equal(testData.unsignedTxExplainedTransfer.outputAmount);
|
|
192
|
+
explain.outputs[0].address.should.equal(testData.unsignedTxExplainedTransfer.recipient);
|
|
193
|
+
explain.outputs[0].memo.should.equal(testData.unsignedTxExplainedTransfer.memo);
|
|
194
|
+
explain.fee.should.equal(testData.unsignedTxExplainedTransfer.fee);
|
|
195
|
+
explain.changeAmount.should.equal('0');
|
|
196
|
+
});
|
|
197
|
+
it('should explain a contract call transaction', async function () {
|
|
198
|
+
const explain = await basecoin.explainTransaction({
|
|
199
|
+
txHex: testData.txForExplainContract,
|
|
200
|
+
feeInfo: { fee: '' },
|
|
201
|
+
});
|
|
202
|
+
explain.id.should.equal(testData.txExplainedContract.id);
|
|
203
|
+
explain.fee.should.equal(testData.txExplainedContract.fee);
|
|
204
|
+
explain.contractAddress.should.equal(testData.txExplainedContract.contractAddress);
|
|
205
|
+
explain.contractName.should.equal(testData.txExplainedContract.contractName);
|
|
206
|
+
explain.contractFunction.should.equal(testData.txExplainedContract.functionName);
|
|
207
|
+
explain.contractFunctionArgs[0].type.should.equal(testData.txExplainedContract.functionArgs[0].type);
|
|
208
|
+
explain.contractFunctionArgs[0].value.toString().should.equal(testData.txExplainedContract.functionArgs[0].value);
|
|
209
|
+
});
|
|
210
|
+
it('should explain a fungible token transfer transaction with memo', async function () {
|
|
211
|
+
const explain = await basecoin.explainTransaction({
|
|
212
|
+
txHex: testData.txForExplainFungibleTokenTransfer,
|
|
213
|
+
feeInfo: { fee: '' },
|
|
214
|
+
});
|
|
215
|
+
explain.id.should.equal(testData.fungibleTokenTransferTx.id);
|
|
216
|
+
explain.fee.should.equal(testData.fungibleTokenTransferTx.fee);
|
|
217
|
+
explain.memo.should.equal('1');
|
|
218
|
+
explain.outputAmount.should.equal(testData.fungibleTokenTransferTx.functionArgs[2].value);
|
|
219
|
+
explain.outputs[0].amount.should.equal(testData.fungibleTokenTransferTx.functionArgs[2].value);
|
|
220
|
+
explain.outputs[0].address.should.equal((0, transactions_1.cvToString)(testData.fungibleTokenTransferTx.functionArgs[1]));
|
|
221
|
+
explain.outputs[0].memo.should.equal('1');
|
|
222
|
+
explain.outputs[0].tokenName.should.equal(testData.fungibleTokenTransferTx.tokenName);
|
|
223
|
+
});
|
|
224
|
+
it('should explain a fungible token transfer transaction without memo', async function () {
|
|
225
|
+
const explain = await basecoin.explainTransaction({
|
|
226
|
+
txHex: testData.txForExplainFungibleTokenTransferWithoutMemo,
|
|
227
|
+
feeInfo: { fee: '' },
|
|
228
|
+
});
|
|
229
|
+
explain.id.should.equal(testData.hexWithoutMemoTransferId);
|
|
230
|
+
explain.fee.should.equal(testData.fungibleTokenTransferTx.fee);
|
|
231
|
+
assert_1.default.deepEqual(explain.memo, undefined, 'memo should be undefined');
|
|
232
|
+
explain.outputAmount.should.equal(testData.fungibleTokenTransferTx.functionArgs[2].value);
|
|
233
|
+
explain.outputs[0].amount.should.equal(testData.fungibleTokenTransferTx.functionArgs[2].value);
|
|
234
|
+
explain.outputs[0].address.should.equal((0, transactions_1.cvToString)(testData.fungibleTokenTransferTx.functionArgs[1]));
|
|
235
|
+
assert_1.default.deepEqual(explain.outputs[0].memo, undefined, 'memo should be undefined');
|
|
236
|
+
explain.outputs[0].tokenName.should.equal(testData.fungibleTokenTransferTx.tokenName);
|
|
237
|
+
});
|
|
238
|
+
describe('Keypairs:', () => {
|
|
239
|
+
it('should generate a keypair from random seed', function () {
|
|
240
|
+
const keyPair = basecoin.generateKeyPair();
|
|
241
|
+
keyPair.should.have.property('pub');
|
|
242
|
+
keyPair.should.have.property('prv');
|
|
243
|
+
});
|
|
244
|
+
it('should generate a keypair from a seed', function () {
|
|
245
|
+
const seedText = '80350b4208d381fbfe2276a326603049fe500731c46d3c9936b5ce036b51377f24bab7dd0c2af7f107416ef858ff79b0670c72406dad064e72bb17fc0a9038bb';
|
|
246
|
+
const seed = Buffer.from(seedText, 'hex');
|
|
247
|
+
const keyPair = basecoin.generateKeyPair(seed);
|
|
248
|
+
keyPair.pub.should.equal('xpub661MyMwAqRbcFAwqvSGbk35kJf7CQqdN1w4CMUBBTqH5e3ivjU6D8ugv9hRSgRbRenC4w3ahXdLVahwjgjXhSuQKMdNdn55Y9TNSagBktws');
|
|
249
|
+
keyPair.prv.should.equal('xprv9s21ZrQH143K2gsNpQjbNu91kdGi1NuWei8bZ5mZuVk6mFPnBvmxb7NSJQdbZW3FGpK3Ycn7jorAXcEzMvviGtbyBz5tBrjfnWyQp3g75FK');
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
describe('Sign transaction:', () => {
|
|
253
|
+
it('should sign transaction', async function () {
|
|
254
|
+
const key = new KeyPair({
|
|
255
|
+
prv: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601',
|
|
256
|
+
});
|
|
257
|
+
const destination = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0';
|
|
258
|
+
const amount = '100000';
|
|
259
|
+
const unsignedTransaction = await buildUnsignedTransaction({
|
|
260
|
+
destination,
|
|
261
|
+
amount,
|
|
262
|
+
publicKey: key.getKeys().pub,
|
|
263
|
+
});
|
|
264
|
+
const tx = await basecoin.signTransaction({
|
|
265
|
+
prv: key.getKeys().prv.toString(),
|
|
266
|
+
pubKeys: [key.getKeys().pub],
|
|
267
|
+
txPrebuild: {
|
|
268
|
+
txHex: unsignedTransaction.toBroadcastFormat(),
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
const factory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinName));
|
|
272
|
+
const txBuilder = factory.from(tx.halfSigned.txHex);
|
|
273
|
+
const signedTx = await txBuilder.build();
|
|
274
|
+
const txJson = signedTx.toJson();
|
|
275
|
+
txJson.payload.to.should.equal(destination);
|
|
276
|
+
txJson.payload.amount.should.equal(amount);
|
|
277
|
+
signedTx.signature.length.should.equal(1);
|
|
278
|
+
});
|
|
279
|
+
it('should sign multisig transaction', async function () {
|
|
280
|
+
const key1 = new KeyPair({
|
|
281
|
+
prv: '21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601',
|
|
282
|
+
});
|
|
283
|
+
const key2 = new KeyPair({
|
|
284
|
+
prv: 'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01',
|
|
285
|
+
});
|
|
286
|
+
const key3 = new KeyPair({
|
|
287
|
+
prv: 'e75dcb66f84287eaf347955e94fa04337298dbd95aa0dbb985771104ef1913db01',
|
|
288
|
+
});
|
|
289
|
+
const destination = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0';
|
|
290
|
+
const amount = '100000';
|
|
291
|
+
const publicKeys = [key1.getKeys(true).pub, key2.getKeys(true).pub, key3.getKeys(true).pub];
|
|
292
|
+
const unsignedTransaction = await buildmultiSigUnsignedTransaction({
|
|
293
|
+
destination,
|
|
294
|
+
amount,
|
|
295
|
+
publicKeys,
|
|
296
|
+
});
|
|
297
|
+
const tx = await basecoin.signTransaction({
|
|
298
|
+
prv: [
|
|
299
|
+
'21d43d2ae0da1d9d04cfcaac7d397a33733881081f0b2cd038062cf0ccbb752601',
|
|
300
|
+
'c71700b07d520a8c9731e4d0f095aa6efb91e16e25fb27ce2b72e7b698f8127a01',
|
|
301
|
+
],
|
|
302
|
+
pubKeys: [key1.getKeys().pub, key2.getKeys().pub, key3.getKeys().pub],
|
|
303
|
+
numberSignature: 2,
|
|
304
|
+
txPrebuild: {
|
|
305
|
+
txHex: unsignedTransaction.toBroadcastFormat(),
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
const factory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get(coinName));
|
|
309
|
+
const txBuilder = factory.from(tx.txHex);
|
|
310
|
+
const signedTx = await txBuilder.build();
|
|
311
|
+
const txJson = signedTx.toJson();
|
|
312
|
+
txJson.payload.to.should.equal(destination);
|
|
313
|
+
txJson.payload.amount.should.equal(amount);
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
describe('getSigningPayload', function () {
|
|
317
|
+
it('should return the tx as a buffer', async function () {
|
|
318
|
+
const nonTSSCoin = bitgo.coin('tstx');
|
|
319
|
+
const bufferTx = await nonTSSCoin.getSignablePayload(testData.unsignedTxForExplainTransfer);
|
|
320
|
+
bufferTx.should.be.deepEqual(Buffer.from(testData.unsignedTxForExplainTransfer));
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
describe('Verify Transaction', function () {
|
|
324
|
+
const address1 = '0x174cfd823af8ce27ed0afee3fcf3c3ba259116be';
|
|
325
|
+
const address2 = '0x7e85bdc27c050e3905ebf4b8e634d9ad6edd0de6';
|
|
326
|
+
it('should reject a txPrebuild with more than one recipient', async function () {
|
|
327
|
+
const wallet = new sdk_core_1.Wallet(bitgo, basecoin, {});
|
|
328
|
+
const txParams = {
|
|
329
|
+
recipients: [
|
|
330
|
+
{ amount: '1000000000000', address: address1 },
|
|
331
|
+
{ amount: '2500000000000', address: address2 },
|
|
332
|
+
],
|
|
333
|
+
wallet: wallet,
|
|
334
|
+
walletPassphrase: 'fakeWalletPassphrase',
|
|
335
|
+
};
|
|
336
|
+
await basecoin
|
|
337
|
+
.verifyTransaction({ txParams })
|
|
338
|
+
.should.be.rejectedWith(`tstx doesn't support sending to more than 1 destination address within a single transaction. Try again, using only a single recipient.`);
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
describe('Recover Transaction STX', function () {
|
|
342
|
+
before(function () {
|
|
343
|
+
nock_1.default.enableNetConnect();
|
|
344
|
+
});
|
|
345
|
+
beforeEach(function () {
|
|
346
|
+
nock_1.default.cleanAll();
|
|
347
|
+
});
|
|
348
|
+
after(function () {
|
|
349
|
+
nock_1.default.disableNetConnect();
|
|
350
|
+
});
|
|
351
|
+
it('should build a signed recover transaction when private key data is passed', async function () {
|
|
352
|
+
const rootAddress = testData.HOT_WALLET_ROOT_ADDRESS;
|
|
353
|
+
(0, nock_1.default)(`https://api.testnet.hiro.so`)
|
|
354
|
+
.get(`/extended/v2/addresses/${rootAddress}/balances/stx`)
|
|
355
|
+
.reply(200, testData.ACCOUNT_BALANCE_RESPONSE);
|
|
356
|
+
(0, nock_1.default)(`https://api.testnet.hiro.so`)
|
|
357
|
+
.get(`/extended/v1/address/${rootAddress}/nonces`)
|
|
358
|
+
.reply(200, testData.ACCOUNT_NONCE_RESPONSE);
|
|
359
|
+
(0, nock_1.default)(`https://api.testnet.hiro.so`, { allowUnmocked: true })
|
|
360
|
+
.post(`/v2/fees/transaction`, testData.FEE_ESTIMATION_REQUEST)
|
|
361
|
+
.reply(200, testData.FEE_ESTIMATION_RESPONSE);
|
|
362
|
+
const recoveryOptions = {
|
|
363
|
+
backupKey: testData.HOT_WALLET_KEY_CARD_INFO.BACKUP_KEY,
|
|
364
|
+
userKey: testData.HOT_WALLET_KEY_CARD_INFO.USER_KEY,
|
|
365
|
+
rootAddress: rootAddress,
|
|
366
|
+
recoveryDestination: testData.DESTINATION_ADDRESS_WRW,
|
|
367
|
+
bitgoKey: testData.HOT_WALLET_KEY_CARD_INFO.BITGO_PUB_KEY,
|
|
368
|
+
walletPassphrase: testData.HOT_WALLET_KEY_CARD_INFO.WALLET_PASSPHRASE,
|
|
369
|
+
};
|
|
370
|
+
const response = await basecoin.recover(recoveryOptions);
|
|
371
|
+
response.should.have.property('txHex');
|
|
372
|
+
assert_1.default.deepEqual(response.txHex, testData.HOT_WALLET_RECOVERY_TX_HEX, 'tx hex not matching!');
|
|
373
|
+
});
|
|
374
|
+
it('should build an unsigned transaction when public keys are passed', async function () {
|
|
375
|
+
const rootAddress = testData.COLD_WALLET_ROOT_ADDRESS;
|
|
376
|
+
(0, nock_1.default)(`https://api.testnet.hiro.so`)
|
|
377
|
+
.get(`/extended/v2/addresses/${rootAddress}/balances/stx`)
|
|
378
|
+
.reply(200, testData.ACCOUNT_BALANCE_RESPONSE);
|
|
379
|
+
(0, nock_1.default)(`https://api.testnet.hiro.so`)
|
|
380
|
+
.get(`/extended/v1/address/${rootAddress}/nonces`)
|
|
381
|
+
.reply(200, testData.ACCOUNT_NONCE_RESPONSE);
|
|
382
|
+
(0, nock_1.default)(`https://api.testnet.hiro.so`, { allowUnmocked: true })
|
|
383
|
+
.post(`/v2/fees/transaction`, testData.FEE_ESTIMATION_REQUEST)
|
|
384
|
+
.reply(200, testData.FEE_ESTIMATION_RESPONSE);
|
|
385
|
+
const recoveryOptions = {
|
|
386
|
+
backupKey: testData.COLD_WALLET_PUBLIC_KEY_INFO.BACKUP_KEY,
|
|
387
|
+
userKey: testData.COLD_WALLET_PUBLIC_KEY_INFO.USER_KEY,
|
|
388
|
+
rootAddress: rootAddress,
|
|
389
|
+
recoveryDestination: testData.DESTINATION_ADDRESS_WRW,
|
|
390
|
+
bitgoKey: testData.COLD_WALLET_PUBLIC_KEY_INFO.BITGO_PUB_KEY,
|
|
391
|
+
};
|
|
392
|
+
const response = await basecoin.recover(recoveryOptions);
|
|
393
|
+
response.should.have.property('txHex');
|
|
394
|
+
response.should.have.property('coin');
|
|
395
|
+
response.should.have.property('feeInfo');
|
|
396
|
+
assert_1.default.deepEqual(response.txHex, testData.COLD_WALLET_UNSIGNED_SWEEP_TX_HEX, 'tx hex not matching!');
|
|
397
|
+
assert_1.default.deepEqual(response.coin, 'tstx', 'coin not matching!');
|
|
398
|
+
});
|
|
399
|
+
it('should throw invalid root address when root address is missing or invalid', async function () {
|
|
400
|
+
const recoveryOptions = {
|
|
401
|
+
backupKey: testData.COLD_WALLET_PUBLIC_KEY_INFO.BACKUP_KEY,
|
|
402
|
+
userKey: testData.COLD_WALLET_PUBLIC_KEY_INFO.USER_KEY,
|
|
403
|
+
rootAddress: '',
|
|
404
|
+
recoveryDestination: testData.DESTINATION_ADDRESS_WRW,
|
|
405
|
+
bitgoKey: testData.COLD_WALLET_PUBLIC_KEY_INFO.BITGO_PUB_KEY,
|
|
406
|
+
};
|
|
407
|
+
await basecoin.recover(recoveryOptions).should.rejectedWith('invalid root address!');
|
|
408
|
+
});
|
|
409
|
+
it('should throw invalid destination address when destination address is missing or invalid', async function () {
|
|
410
|
+
const recoveryOptions = {
|
|
411
|
+
backupKey: testData.COLD_WALLET_PUBLIC_KEY_INFO.BACKUP_KEY,
|
|
412
|
+
userKey: testData.COLD_WALLET_PUBLIC_KEY_INFO.USER_KEY,
|
|
413
|
+
rootAddress: testData.COLD_WALLET_ROOT_ADDRESS,
|
|
414
|
+
recoveryDestination: '',
|
|
415
|
+
bitgoKey: testData.COLD_WALLET_PUBLIC_KEY_INFO.BITGO_PUB_KEY,
|
|
416
|
+
};
|
|
417
|
+
await basecoin.recover(recoveryOptions).should.rejectedWith('invalid destination address!');
|
|
418
|
+
});
|
|
419
|
+
it("should fail with no balance when root address doesn't have balance", async function () {
|
|
420
|
+
const rootAddress = testData.HOT_WALLET_ROOT_ADDRESS;
|
|
421
|
+
const stxBalance = JSON.parse(JSON.stringify(testData.ACCOUNT_BALANCE_RESPONSE));
|
|
422
|
+
stxBalance.balance = '0';
|
|
423
|
+
(0, nock_1.default)(`https://api.testnet.hiro.so`)
|
|
424
|
+
.get(`/extended/v2/addresses/${rootAddress}/balances/stx`)
|
|
425
|
+
.reply(200, stxBalance);
|
|
426
|
+
(0, nock_1.default)(`https://api.testnet.hiro.so`)
|
|
427
|
+
.get(`/extended/v1/address/${rootAddress}/nonces`)
|
|
428
|
+
.reply(200, testData.ACCOUNT_NONCE_RESPONSE);
|
|
429
|
+
const recoveryOptions = {
|
|
430
|
+
backupKey: testData.HOT_WALLET_KEY_CARD_INFO.BACKUP_KEY,
|
|
431
|
+
userKey: testData.HOT_WALLET_KEY_CARD_INFO.USER_KEY,
|
|
432
|
+
rootAddress: rootAddress,
|
|
433
|
+
recoveryDestination: testData.DESTINATION_ADDRESS_WRW,
|
|
434
|
+
bitgoKey: testData.HOT_WALLET_KEY_CARD_INFO.BITGO_PUB_KEY,
|
|
435
|
+
walletPassphrase: testData.HOT_WALLET_KEY_CARD_INFO.WALLET_PASSPHRASE,
|
|
436
|
+
};
|
|
437
|
+
await basecoin
|
|
438
|
+
.recover(recoveryOptions)
|
|
439
|
+
.should.rejectedWith(`could not find any balance to recover for ${rootAddress}`);
|
|
440
|
+
});
|
|
441
|
+
it('should fail with insufficient balance when stx balance is lower than fee', async function () {
|
|
442
|
+
const rootAddress = testData.HOT_WALLET_ROOT_ADDRESS;
|
|
443
|
+
// deep clone to stop mutation
|
|
444
|
+
const accountBalance = JSON.parse(JSON.stringify(testData.ACCOUNT_BALANCE_RESPONSE));
|
|
445
|
+
accountBalance.balance = '100'; // set balance lower than fee
|
|
446
|
+
(0, nock_1.default)(`https://api.testnet.hiro.so`)
|
|
447
|
+
.get(`/extended/v2/addresses/${rootAddress}/balances/stx`)
|
|
448
|
+
.reply(200, accountBalance);
|
|
449
|
+
(0, nock_1.default)(`https://api.testnet.hiro.so`)
|
|
450
|
+
.get(`/extended/v1/address/${rootAddress}/nonces`)
|
|
451
|
+
.reply(200, testData.ACCOUNT_NONCE_RESPONSE);
|
|
452
|
+
const feeRequestBody = testData.FEE_ESTIMATION_REQUEST;
|
|
453
|
+
feeRequestBody.transaction_payload =
|
|
454
|
+
'00051a1500a1c42f0c11bfe3893f479af18904677685be000000000000006400000000000000000000000000000000000000000000000000000000000000000000';
|
|
455
|
+
(0, nock_1.default)(`https://api.testnet.hiro.so`, { allowUnmocked: true })
|
|
456
|
+
.post(`/v2/fees/transaction`, feeRequestBody)
|
|
457
|
+
.reply(200, testData.FEE_ESTIMATION_RESPONSE);
|
|
458
|
+
const recoveryOptions = {
|
|
459
|
+
backupKey: testData.HOT_WALLET_KEY_CARD_INFO.BACKUP_KEY,
|
|
460
|
+
userKey: testData.HOT_WALLET_KEY_CARD_INFO.USER_KEY,
|
|
461
|
+
rootAddress: rootAddress,
|
|
462
|
+
recoveryDestination: testData.DESTINATION_ADDRESS_WRW,
|
|
463
|
+
bitgoKey: testData.HOT_WALLET_KEY_CARD_INFO.BITGO_PUB_KEY,
|
|
464
|
+
walletPassphrase: testData.HOT_WALLET_KEY_CARD_INFO.WALLET_PASSPHRASE,
|
|
465
|
+
};
|
|
466
|
+
await basecoin.recover(recoveryOptions).should.rejectedWith('insufficient balance to build the transaction');
|
|
467
|
+
});
|
|
468
|
+
});
|
|
469
|
+
});
|
|
470
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3N0eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixnREFBd0I7QUFFeEIsaURBQStDO0FBQy9DLG1EQUE4QztBQUM5QyxtREFBK0Q7QUFDL0QsaURBQTRDO0FBQzVDLHVEQUFrRDtBQUVsRCxzREFBd0M7QUFDeEMsbUNBQThDO0FBRzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxZQUFNLENBQUM7QUFFM0IsUUFBUSxDQUFDLE1BQU0sRUFBRTtJQUNmLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN2QixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUM7SUFDNUIsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLElBQUksUUFBUSxDQUFDO0lBRWIsTUFBTSxpQkFBaUIsR0FBRztRQUN4QixFQUFFO1FBQ0YsSUFBSTtRQUNKLEtBQUs7UUFDTCwwQ0FBMEM7UUFDMUMsMkNBQTJDO0tBQzVDLENBQUM7SUFFRixNQUFNLGFBQWEsR0FBRztRQUNwQiwwQ0FBMEM7UUFDMUMsMkNBQTJDO1FBQzNDLDJDQUEyQztRQUMzQywyQ0FBMkM7UUFDM0Msb0RBQW9EO1FBQ3BELG9EQUFvRDtLQUNyRCxDQUFDO0lBRUYsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUU7WUFDbkMsR0FBRyxFQUFFLE1BQU07U0FDWixDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hELFFBQVEsR0FBRyxL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QUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUM5QixJQUFBLGNBQUksRUFBQyw2QkFBNkIsQ0FBQztpQkFDaEMsR0FBRyxDQUFDLHdCQUF3QixXQUFXLFNBQVMsQ0FBQztpQkFDakQsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUMvQyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUM7WUFDdkQsY0FBYyxDQUFDLG1CQUFtQjtnQkFDaEMsb0lBQW9JLENBQUM7WUFDdkksSUFBQSxjQUFJLEVBQUMsNkJBQTZCLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQ3pELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxjQUFjLENBQUM7aUJBQzVDLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDaEQsTUFBTSxlQUFlLEdBQW9CO2dCQUN2QyxTQUFTLEVBQUUsUUFBUSxDQUFDLHdCQUF3QixDQUFDLFVBQVU7Z0JBQ3ZELE9BQU8sRUFBRSxRQUFRLENBQUMsd0JBQXdCLENBQUMsUUFBUTtnQkFDbkQsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyx1QkFBdUI7Z0JBQ3JELFFBQVEsRUFBRSxRQUFRLENBQUMsd0JBQXdCLENBQUMsYUFBYTtnQkFDekQsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQjthQUN0RSxDQUFDO1lBQ0YsTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUMvRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgbm9jayBmcm9tICdub2NrJztcblxuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstYXBpJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IGN2VG9TdHJpbmcgfSBmcm9tICdAc3RhY2tzL3RyYW5zYWN0aW9ucyc7XG5cbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL2ZpeHR1cmVzJztcbmltcG9ydCB7IFN0eCwgU3R4TGliLCBUc3R4IH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IFJlY292ZXJ5SW5mbywgUmVjb3ZlcnlPcHRpb25zLCBSZWNvdmVyeVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5cbmNvbnN0IHsgS2V5UGFpciB9ID0gU3R4TGliO1xuXG5kZXNjcmliZSgnU1RYOicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbk5hbWUgPSAnc3R4JztcbiAgY29uc3QgY29pbk5hbWVUZXN0ID0gJ3RzdHgnO1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGJhc2Vjb2luO1xuXG4gIGNvbnN0IGJhZFZhbGlkQWRkcmVzc2VzID0gW1xuICAgICcnLFxuICAgIG51bGwsXG4gICAgJ2FiYycsXG4gICAgJ1NQMjQ0SFlQWUFUMkJCMlFFNTEzTlNQODFIVE1ZV0JKUDAySFBHSzYnLFxuICAgICdTVDFUNzU4SzZUMllSS0c5UTBUSjE2QjZGUDVRUVJFV1pTRVNSUzBQWScsXG4gIF07XG5cbiAgY29uc3QgZ29vZEFkZHJlc3NlcyA9IFtcbiAgICAnU1RCNDRIWVBZQVQyQkIyUUU1MTNOU1A4MUhUTVlXQkpQMDJIUEdLNicsXG4gICAgJ1NUMTFOSlRUS0dWVDZEMUhZNE5KUlZRV01RTTdUVkFSMDkxRUo4UDJZJyxcbiAgICAnU1AyVDc1OEs2VDJZUktHOVEwVEoxNkI2RlA1UVFSRVdaU0VTUlMwUFknLFxuICAgICdTTTNXNVFGV0dQRzFKQzhSMjVFVlpERVAzQkVTSlo4MzFKUE5OUUZUWicsXG4gICAgJ1NNM1c1UUZXR1BHMUpDOFIyNUVWWkRFUDNCRVNKWjgzMUpQTk5RRlRaP21lbW9JZD0xJyxcbiAgICAnU1QxV1ZKTVM1VlM0MUYwWU1IN0QyTTBWSFhSRzRDWTQzWkpaQlM2MEE/bWVtb0lkPTQnLFxuICBdO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHtcbiAgICAgIGVudjogJ21vY2snLFxuICAgIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3Rlcignc3R4JywgU3R4LmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RzdHgnLCBUc3R4LmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oY29pbk5hbWVUZXN0KTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIHVuc2lnbmVkIGFjY291bnQtbGliIHNpZ25sZS1zaWduYXR1cmUgc2VuZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gZGVzdGluYXRpb24gVGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCB0byBzZW5kIHRvIHRoZSByZWNpcGllbnRcbiAgICovXG4gIGNvbnN0IGJ1aWxkVW5zaWduZWRUcmFuc2FjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uICh7IGRlc3RpbmF0aW9uLCBhbW91bnQgPSAnMTAwMDAwJywgcHVibGljS2V5LCBtZW1vID0gJycgfSkge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KGNvaW5OYW1lKSk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzE4MCcsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLnRvKGRlc3RpbmF0aW9uKTtcbiAgICB0eEJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKDEpO1xuICAgIHR4QnVpbGRlci5mcm9tUHViS2V5KHB1YmxpY0tleSk7XG4gICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgdHhCdWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMSk7XG4gICAgcmV0dXJuIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiB1bnNpZ25lZCBhY2NvdW50LWxpYiBtdWx0aS1zaWduYXR1cmUgc2VuZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gZGVzdGluYXRpb24gVGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCB0byBzZW5kIHRvIHRoZSByZWNpcGllbnRcbiAgICovXG4gIGNvbnN0IGJ1aWxkbXVsdGlTaWdVbnNpZ25lZFRyYW5zYWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gKHsgZGVzdGluYXRpb24sIGFtb3VudCA9ICcxMDAwMDAnLCBwdWJsaWNLZXlzLCBtZW1vID0gJycgfSkge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KGNvaW5OYW1lKSk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzE4MCcsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLnRvKGRlc3RpbmF0aW9uKTtcbiAgICB0eEJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKDEpO1xuICAgIHR4QnVpbGRlci5mcm9tUHViS2V5KHB1YmxpY0tleXMpO1xuICAgIHR4QnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDIpO1xuICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgIHJldHVybiBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgfTtcblxuICBpdCgnc2hvdWxkIGluc3RhbnRpYXRlIHRoZSBjb2luJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBsb2NhbEJhc2Vjb2luID0gYml0Z28uY29pbigndHN0eCcpO1xuICAgIGxvY2FsQmFzZWNvaW4uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoVHN0eCk7XG5cbiAgICBsb2NhbEJhc2Vjb2luID0gYml0Z28uY29pbignc3R4Jyk7XG4gICAgbG9jYWxCYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihTdHgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNoZWNrIHZhbGlkIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBiYWRWYWxpZEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHIpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gICAgZ29vZEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHIpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2ZXJpZnkgaXNXYWxsZXRBZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHVzZXJLZXkgPSB7XG4gICAgICBwdWI6ICd4cHViNjYxTXlNd0FxUmJjR1MySE1kdkFOTjdvOEVTV3F3dnI1VTRyeTVmWmREOVZIaHltV3lmb0RRRjR2emZLb3RYZ0d0SlRyd3JGUno3WGJHRm92NEZxZEtLbzZtUllOV3ZNcDdQMjNEanVKblMnLFxuICAgIH07XG4gICAgY29uc3QgYmFja3VwS2V5ID0ge1xuICAgICAgcHViOiAneHB1YjY2MU15TXdBcVJiY0ZFenI1Q2NwRnpQRzQ1cm1QZjc1RFR2RG9iTjVnSmltQ2F0Ykh0elI1M1NiSHpEWjFKNTZieUtTc2RjOHZTdWpHdVFweVBqYjdMc3VhMk5mQURKZXdQeE56TDNONlRqJyxcbiAgICB9O1xuICAgIGNvbnN0IGJpdGdvS2V5ID0ge1xuICAgICAgcHViOiAneHB1YjY2MU15TXdBcVJiY0dQMWFkazM0VnpSUUpFTVgyNXJDeGpFeVU5WUZGV05oV056d1BvcWdqTG9LZm5xb3RMd3J6N2tCZXZXYlJabnFUU1FyUUR1SnVZVVFhRFE1RERQRXpFWE13UFM5UEVmJyxcbiAgICB9O1xuICAgIGNvbnN0IGtleWNoYWlucyA9IFt1c2VyS2V5LCBiYWNrdXBLZXksIGJpdGdvS2V5XTtcbiAgICBjb25zdCB2YWxpZEFkZHJlc3MxID0gJ1NOQVlRRlo2RUY1NEQ1WFdKUDNHQUUxWThEUFlYS0ZDN1RUTVlYRlYnO1xuICAgIGNvbnN0IHZhbGlkQWRkcmVzczIgPSAnU05BWVFGWjZFRjU0RDVYV0pQM0dBRTFZOERQWVhLRkM3VFRNWVhGVj9tZW1vSWQ9Mic7XG4gICAgY29uc3QgdW5yZWxhdGVkVmFsaWRBZGRyZXNzID0gJ1NUMTFOSlRUS0dWVDZEMUhZNE5KUlZRV01RTTdUVkFSMDkxRUo4UDJZP21lbW9JZD0xJztcbiAgICBjb25zdCBpbnZhbGlkQWRkcmVzcyA9ICdTVDFUNzU4SzZUMllSS0c5UTBUSjE2QjZGUDVRUVJFV1pTRVNSUzBQWSc7XG4gICAgKGF3YWl0IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyh7IGFkZHJlc3M6IHZhbGlkQWRkcmVzczEsIGtleWNoYWlucyB9KSkuc2hvdWxkLnRydWUoKTtcbiAgICAoYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHsgYWRkcmVzczogdmFsaWRBZGRyZXNzMiwga2V5Y2hhaW5zIH0pKS5zaG91bGQudHJ1ZSgpO1xuICAgIChhd2FpdCBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3MoeyBhZGRyZXNzOiB1bnJlbGF0ZWRWYWxpZEFkZHJlc3MsIGtleWNoYWlucyB9KSkuc2hvdWxkLmZhbHNlKCk7XG5cbiAgICBhc3NlcnQucmVqZWN0cyhcbiAgICAgIGFzeW5jICgpID0+IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyh7IGFkZHJlc3M6IGludmFsaWRBZGRyZXNzLCBrZXljaGFpbnMgfSksXG4gICAgICBgaW52YWxpZCBhZGRyZXNzICR7aW52YWxpZEFkZHJlc3N9YFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZXhwbGFpbiBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGV4cGxhaW4gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgdHhIZXg6IHRlc3REYXRhLnR4Rm9yRXhwbGFpblRyYW5zZmVyLFxuICAgICAgZmVlSW5mbzogeyBmZWU6ICcnIH0sXG4gICAgfSk7XG4gICAgZXhwbGFpbi5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5pZCk7XG4gICAgZXhwbGFpbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkVHJhbnNmZXIub3V0cHV0QW1vdW50KTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLm91dHB1dEFtb3VudCk7XG4gICAgZXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkVHJhbnNmZXIucmVjaXBpZW50KTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0ubWVtby5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5tZW1vKTtcbiAgICBleHBsYWluLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5mZWUpO1xuICAgIGV4cGxhaW4uY2hhbmdlQW1vdW50LnNob3VsZC5lcXVhbCgnMCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGV4cGxhaW4gYW4gdW5zaWduZWQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qga2V5ID0gbmV3IEtleVBhaXIoKTtcbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9ICdTVDExTkpUVEtHVlQ2RDFIWTROSlJWUVdNUU03VFZBUjA5MUVKOFAyWSc7XG4gICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMCc7XG4gICAgY29uc3QgbWVtbyA9ICdpIGNhbm5vdCBiZSBicm9hZGNhc3QnO1xuXG4gICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJ1aWxkVW5zaWduZWRUcmFuc2FjdGlvbih7XG4gICAgICBkZXN0aW5hdGlvbixcbiAgICAgIGFtb3VudCxcbiAgICAgIHB1YmxpY0tleToga2V5LmdldEtleXMoKS5wdWIsXG4gICAgICBtZW1vOiBtZW1vLFxuICAgIH0pO1xuICAgIGNvbnN0IHVuc2lnbmVkSGV4ID0gdW5zaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgY29uc3QgZXhwbGFpbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogdW5zaWduZWRIZXgsXG4gICAgICBwdWJsaWNLZXlzOiBba2V5LmdldEtleXMoKS5wdWJdLFxuICAgICAgZmVlSW5mbzogeyBmZWU6ICcnIH0sXG4gICAgfSk7XG5cbiAgICBleHBsYWluLm1lbW8uc2hvdWxkLmVxdWFsKG1lbW8pO1xuICAgIGV4cGxhaW4ub3V0cHV0c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKGFtb3VudCk7XG4gICAgZXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKGRlc3RpbmF0aW9uKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBleHBsYWluIHVuc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGhleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBleHBsYWluID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4SGV4OiB0ZXN0RGF0YS51bnNpZ25lZFR4Rm9yRXhwbGFpblRyYW5zZmVyLFxuICAgICAgcHVibGljS2V5czogWycwMzc5N2RkNjUzMDQwZDM0NGZkMDQ4YzFhZDA1ZDRjYmNiMjE3OGIzMGM2YTBjNDI3Njk5NDc5NWYzZTgzM2RhNDEnXSxcbiAgICAgIGZlZUluZm86IHsgZmVlOiAnJyB9LFxuICAgIH0pO1xuICAgIGV4cGxhaW4ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS51bnNpZ25lZFR4RXhwbGFpbmVkVHJhbnNmZXIub3V0cHV0QW1vdW50KTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS51bnNpZ25lZFR4RXhwbGFpbmVkVHJhbnNmZXIub3V0cHV0QW1vdW50KTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEudW5zaWduZWRUeEV4cGxhaW5lZFRyYW5zZmVyLnJlY2lwaWVudCk7XG4gICAgZXhwbGFpbi5vdXRwdXRzWzBdLm1lbW8uc2hvdWxkLmVxdWFsKHRlc3REYXRhLnVuc2lnbmVkVHhFeHBsYWluZWRUcmFuc2Zlci5tZW1vKTtcbiAgICBleHBsYWluLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEudW5zaWduZWRUeEV4cGxhaW5lZFRyYW5zZmVyLmZlZSk7XG4gICAgZXhwbGFpbi5jaGFuZ2VBbW91bnQuc2hvdWxkLmVxdWFsKCcwJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZXhwbGFpbiBhIGNvbnRyYWN0IGNhbGwgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwbGFpbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogdGVzdERhdGEudHhGb3JFeHBsYWluQ29udHJhY3QsXG4gICAgICBmZWVJbmZvOiB7IGZlZTogJycgfSxcbiAgICB9KTtcbiAgICBleHBsYWluLmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eEV4cGxhaW5lZENvbnRyYWN0LmlkKTtcbiAgICBleHBsYWluLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRDb250cmFjdC5mZWUpO1xuICAgIGV4cGxhaW4uY29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eEV4cGxhaW5lZENvbnRyYWN0LmNvbnRyYWN0QWRkcmVzcyk7XG4gICAgZXhwbGFpbi5jb250cmFjdE5hbWUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkQ29udHJhY3QuY29udHJhY3ROYW1lKTtcbiAgICBleHBsYWluLmNvbnRyYWN0RnVuY3Rpb24uc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkQ29udHJhY3QuZnVuY3Rpb25OYW1lKTtcbiAgICBleHBsYWluLmNvbnRyYWN0RnVuY3Rpb25BcmdzWzBdLnR5cGUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkQ29udHJhY3QuZnVuY3Rpb25BcmdzWzBdLnR5cGUpO1xuICAgIGV4cGxhaW4uY29udHJhY3RGdW5jdGlvbkFyZ3NbMF0udmFsdWUudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRDb250cmFjdC5mdW5jdGlvbkFyZ3NbMF0udmFsdWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBmdW5naWJsZSB0b2tlbiB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIG1lbW8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwbGFpbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogdGVzdERhdGEudHhGb3JFeHBsYWluRnVuZ2libGVUb2tlblRyYW5zZmVyLFxuICAgICAgZmVlSW5mbzogeyBmZWU6ICcnIH0sXG4gICAgfSk7XG4gICAgZXhwbGFpbi5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEuZnVuZ2libGVUb2tlblRyYW5zZmVyVHguaWQpO1xuICAgIGV4cGxhaW4uZmVlLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuVHJhbnNmZXJUeC5mZWUpO1xuICAgIGV4cGxhaW4ubWVtby5zaG91bGQuZXF1YWwoJzEnKTtcbiAgICBleHBsYWluLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwodGVzdERhdGEuZnVuZ2libGVUb2tlblRyYW5zZmVyVHguZnVuY3Rpb25BcmdzWzJdLnZhbHVlKTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuVHJhbnNmZXJUeC5mdW5jdGlvbkFyZ3NbMl0udmFsdWUpO1xuICAgIGV4cGxhaW4ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChjdlRvU3RyaW5nKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5UcmFuc2ZlclR4LmZ1bmN0aW9uQXJnc1sxXSkpO1xuICAgIGV4cGxhaW4ub3V0cHV0c1swXS5tZW1vLnNob3VsZC5lcXVhbCgnMScpO1xuICAgIGV4cGxhaW4ub3V0cHV0c1swXS50b2tlbk5hbWUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5UcmFuc2ZlclR4LnRva2VuTmFtZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZXhwbGFpbiBhIGZ1bmdpYmxlIHRva2VuIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGhvdXQgbWVtbycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBleHBsYWluID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4SGV4OiB0ZXN0RGF0YS50eEZvckV4cGxhaW5GdW5naWJsZVRva2VuVHJhbnNmZXJXaXRob3V0TWVtbyxcbiAgICAgIGZlZUluZm86IHsgZmVlOiAnJyB9LFxuICAgIH0pO1xuICAgIGV4cGxhaW4uaWQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmhleFdpdGhvdXRNZW1vVHJhbnNmZXJJZCk7XG4gICAgZXhwbGFpbi5mZWUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5UcmFuc2ZlclR4LmZlZSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChleHBsYWluLm1lbW8sIHVuZGVmaW5lZCwgJ21lbW8gc2hvdWxkIGJlIHVuZGVmaW5lZCcpO1xuICAgIGV4cGxhaW4ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuVHJhbnNmZXJUeC5mdW5jdGlvbkFyZ3NbMl0udmFsdWUpO1xuICAgIGV4cGxhaW4ub3V0cHV0c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5UcmFuc2ZlclR4LmZ1bmN0aW9uQXJnc1syXS52YWx1ZSk7XG4gICAgZXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKGN2VG9TdHJpbmcodGVzdERhdGEuZnVuZ2libGVUb2tlblRyYW5zZmVyVHguZnVuY3Rpb25BcmdzWzFdKSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChleHBsYWluLm91dHB1dHNbMF0ubWVtbywgdW5kZWZpbmVkLCAnbWVtbyBzaG91bGQgYmUgdW5kZWZpbmVkJyk7XG4gICAgZXhwbGFpbi5vdXRwdXRzWzBdLnRva2VuTmFtZS5zaG91bGQuZXF1YWwodGVzdERhdGEuZnVuZ2libGVUb2tlblRyYW5zZmVyVHgudG9rZW5OYW1lKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0tleXBhaXJzOicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEga2V5cGFpciBmcm9tIHJhbmRvbSBzZWVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5UGFpciA9IGJhc2Vjb2luLmdlbmVyYXRlS2V5UGFpcigpO1xuICAgICAga2V5UGFpci5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHViJyk7XG4gICAgICBrZXlQYWlyLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwcnYnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBrZXlwYWlyIGZyb20gYSBzZWVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2VlZFRleHQgPVxuICAgICAgICAnODAzNTBiNDIwOGQzODFmYmZlMjI3NmEzMjY2MDMwNDlmZTUwMDczMWM0NmQzYzk5MzZiNWNlMDM2YjUxMzc3ZjI0YmFiN2RkMGMyYWY3ZjEwNzQxNmVmODU4ZmY3OWIwNjcwYzcyNDA2ZGFkMDY0ZTcyYmIxN2ZjMGE5MDM4YmInO1xuICAgICAgY29uc3Qgc2VlZCA9IEJ1ZmZlci5mcm9tKHNlZWRUZXh0LCAnaGV4Jyk7XG4gICAgICBjb25zdCBrZXlQYWlyID0gYmFzZWNvaW4uZ2VuZXJhdGVLZXlQYWlyKHNlZWQpO1xuICAgICAga2V5UGFpci5wdWIuc2hvdWxkLmVxdWFsKFxuICAgICAgICAneHB1YjY2MU15TXdBcVJiY0ZBd3F2U0diazM1a0pmN0NRcWROMXc0Q01VQkJUcUg1ZTNpdmpVNkQ4dWd2OWhSU2dSYlJlbkM0dzNhaFhkTFZhaHdqZ2pYaFN1UUtNZE5kbjU1WTlUTlNhZ0JrdHdzJ1xuICAgICAgKTtcbiAgICAgIGtleVBhaXIucHJ2LnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3hwcnY5czIxWnJRSDE0M0syZ3NOcFFqYk51OTFrZEdpMU51V2VpOGJaNW1adVZrNm1GUG5Cdm14YjdOU0pRZGJaVzNGR3BLM1ljbjdqb3JBWGNFek12dmlHdGJ5Qno1dEJyamZuV3lRcDNnNzVGSydcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTaWduIHRyYW5zYWN0aW9uOicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNpZ24gdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBrZXkgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgIHBydjogJzIxZDQzZDJhZTBkYTFkOWQwNGNmY2FhYzdkMzk3YTMzNzMzODgxMDgxZjBiMmNkMDM4MDYyY2YwY2NiYjc1MjYwMScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gJ1NUREU3WThIVjNSWDhWQk0yVFpWV0pUUzdaQTFYQjBTU0MzTkVWSDAnO1xuICAgICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMCc7XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBidWlsZFVuc2lnbmVkVHJhbnNhY3Rpb24oe1xuICAgICAgICBkZXN0aW5hdGlvbixcbiAgICAgICAgYW1vdW50LFxuICAgICAgICBwdWJsaWNLZXk6IGtleS5nZXRLZXlzKCkucHViLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJhc2Vjb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgIHBydjoga2V5LmdldEtleXMoKS5wcnYhLnRvU3RyaW5nKCksXG4gICAgICAgIHB1YktleXM6IFtrZXkuZ2V0S2V5cygpLnB1Yl0sXG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleDogdW5zaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFN0eExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldChjb2luTmFtZSkpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4LmhhbGZTaWduZWQudHhIZXgpO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHNpZ25lZFR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLnBheWxvYWQudG8uc2hvdWxkLmVxdWFsKGRlc3RpbmF0aW9uKTtcbiAgICAgIHR4SnNvbi5wYXlsb2FkLmFtb3VudC5zaG91bGQuZXF1YWwoYW1vdW50KTtcbiAgICAgIHNpZ25lZFR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIG11bHRpc2lnIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5MSA9IG5ldyBLZXlQYWlyKHtcbiAgICAgICAgcHJ2OiAnMjFkNDNkMmFlMGRhMWQ5ZDA0Y2ZjYWFjN2QzOTdhMzM3MzM4ODEwODFmMGIyY2QwMzgwNjJjZjBjY2JiNzUyNjAxJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qga2V5MiA9IG5ldyBLZXlQYWlyKHtcbiAgICAgICAgcHJ2OiAnYzcxNzAwYjA3ZDUyMGE4Yzk3MzFlNGQwZjA5NWFhNmVmYjkxZTE2ZTI1ZmIyN2NlMmI3MmU3YjY5OGY4MTI3YTAxJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qga2V5MyA9IG5ldyBLZXlQYWlyKHtcbiAgICAgICAgcHJ2OiAnZTc1ZGNiNjZmODQyODdlYWYzNDc5NTVlOTRmYTA0MzM3Mjk4ZGJkOTVhYTBkYmI5ODU3NzExMDRlZjE5MTNkYjAxJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGVzdGluYXRpb24gPSAnU1RERTdZOEhWM1JYOFZCTTJUWlZXSlRTN1pBMVhCMFNTQzNORVZIMCc7XG4gICAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAwJztcbiAgICAgIGNvbnN0IHB1YmxpY0tleXMgPSBba2V5MS5nZXRLZXlzKHRydWUpLnB1Yiwga2V5Mi5nZXRLZXlzKHRydWUpLnB1Yiwga2V5My5nZXRLZXlzKHRydWUpLnB1Yl07XG4gICAgICBjb25zdCB1bnNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgYnVpbGRtdWx0aVNpZ1Vuc2lnbmVkVHJhbnNhY3Rpb24oe1xuICAgICAgICBkZXN0aW5hdGlvbixcbiAgICAgICAgYW1vdW50LFxuICAgICAgICBwdWJsaWNLZXlzLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJhc2Vjb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgIHBydjogW1xuICAgICAgICAgICcyMWQ0M2QyYWUwZGExZDlkMDRjZmNhYWM3ZDM5N2EzMzczMzg4MTA4MWYwYjJjZDAzODA2MmNmMGNjYmI3NTI2MDEnLFxuICAgICAgICAgICdjNzE3MDBiMDdkNTIwYThjOTczMWU0ZDBmMDk1YWE2ZWZiOTFlMTZlMjVmYjI3Y2UyYjcyZTdiNjk4ZjgxMjdhMDEnLFxuICAgICAgICBdLFxuICAgICAgICBwdWJLZXlzOiBba2V5MS5nZXRLZXlzKCkucHViLCBrZXkyLmdldEtleXMoKS5wdWIsIGtleTMuZ2V0S2V5cygpLnB1Yl0sXG4gICAgICAgIG51bWJlclNpZ25hdHVyZTogMixcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHR4SGV4OiB1bnNpZ25lZFRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KGNvaW5OYW1lKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odHgudHhIZXgpO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHNpZ25lZFR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLnBheWxvYWQudG8uc2hvdWxkLmVxdWFsKGRlc3RpbmF0aW9uKTtcbiAgICAgIHR4SnNvbi5wYXlsb2FkLmFtb3VudC5zaG91bGQuZXF1YWwoYW1vdW50KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFNpZ25pbmdQYXlsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSB0eCBhcyBhIGJ1ZmZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG5vblRTU0NvaW4gPSBiaXRnby5jb2luKCd0c3R4Jyk7XG4gICAgICBjb25zdCBidWZmZXJUeCA9IGF3YWl0IG5vblRTU0NvaW4uZ2V0U2lnbmFibGVQYXlsb2FkKHRlc3REYXRhLnVuc2lnbmVkVHhGb3JFeHBsYWluVHJhbnNmZXIpO1xuICAgICAgYnVmZmVyVHguc2hvdWxkLmJlLmRlZXBFcXVhbChCdWZmZXIuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZFR4Rm9yRXhwbGFpblRyYW5zZmVyKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWZXJpZnkgVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYWRkcmVzczEgPSAnMHgxNzRjZmQ4MjNhZjhjZTI3ZWQwYWZlZTNmY2YzYzNiYTI1OTExNmJlJztcbiAgICBjb25zdCBhZGRyZXNzMiA9ICcweDdlODViZGMyN2MwNTBlMzkwNWViZjRiOGU2MzRkOWFkNmVkZDBkZTYnO1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgdHhQcmVidWlsZCB3aXRoIG1vcmUgdGhhbiBvbmUgcmVjaXBpZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIHt9KTtcblxuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7IGFtb3VudDogJzEwMDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMSB9LFxuICAgICAgICAgIHsgYW1vdW50OiAnMjUwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MyIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgYHRzdHggZG9lc24ndCBzdXBwb3J0IHNlbmRpbmcgdG8gbW9yZSB0aGFuIDEgZGVzdGluYXRpb24gYWRkcmVzcyB3aXRoaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uIFRyeSBhZ2FpbiwgdXNpbmcgb25seSBhIHNpbmdsZSByZWNpcGllbnQuYFxuICAgICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBUcmFuc2FjdGlvbiBTVFgnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suZW5hYmxlTmV0Q29ubmVjdCgpO1xuICAgIH0pO1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suZGlzYWJsZU5ldENvbm5lY3QoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzaWduZWQgcmVjb3ZlciB0cmFuc2FjdGlvbiB3aGVuIHByaXZhdGUga2V5IGRhdGEgaXMgcGFzc2VkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgcm9vdEFkZHJlc3MgPSB0ZXN0RGF0YS5IT1RfV0FMTEVUX1JPT1RfQUREUkVTUztcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2ApXG4gICAgICAgIC5nZXQoYC9leHRlbmRlZC92Mi9hZGRyZXNzZXMvJHtyb290QWRkcmVzc30vYmFsYW5jZXMvc3R4YClcbiAgICAgICAgLnJlcGx5KDIwMCwgdGVzdERhdGEuQUNDT1VOVF9CQUxBTkNFX1JFU1BPTlNFKTtcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2ApXG4gICAgICAgIC5nZXQoYC9leHRlbmRlZC92MS9hZGRyZXNzLyR7cm9vdEFkZHJlc3N9L25vbmNlc2ApXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkFDQ09VTlRfTk9OQ0VfUkVTUE9OU0UpO1xuICAgICAgbm9jayhgaHR0cHM6Ly9hcGkudGVzdG5ldC5oaXJvLnNvYCwgeyBhbGxvd1VubW9ja2VkOiB0cnVlIH0pXG4gICAgICAgIC5wb3N0KGAvdjIvZmVlcy90cmFuc2FjdGlvbmAsIHRlc3REYXRhLkZFRV9FU1RJTUFUSU9OX1JFUVVFU1QpXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkZFRV9FU1RJTUFUSU9OX1JFU1BPTlNFKTtcblxuICAgICAgY29uc3QgcmVjb3ZlcnlPcHRpb25zOiBSZWNvdmVyeU9wdGlvbnMgPSB7XG4gICAgICAgIGJhY2t1cEtleTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLkJBQ0tVUF9LRVksXG4gICAgICAgIHVzZXJLZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5VU0VSX0tFWSxcbiAgICAgICAgcm9vdEFkZHJlc3M6IHJvb3RBZGRyZXNzLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiB0ZXN0RGF0YS5ERVNUSU5BVElPTl9BRERSRVNTX1dSVyxcbiAgICAgICAgYml0Z29LZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5CSVRHT19QVUJfS0VZLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uV0FMTEVUX1BBU1NQSFJBU0UsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2U6IFJlY292ZXJ5VHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHJlY292ZXJ5T3B0aW9ucyk7XG4gICAgICByZXNwb25zZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHhIZXgnKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UudHhIZXgsIHRlc3REYXRhLkhPVF9XQUxMRVRfUkVDT1ZFUllfVFhfSEVYLCAndHggaGV4IG5vdCBtYXRjaGluZyEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW4gdW5zaWduZWQgdHJhbnNhY3Rpb24gd2hlbiBwdWJsaWMga2V5cyBhcmUgcGFzc2VkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgcm9vdEFkZHJlc3MgPSB0ZXN0RGF0YS5DT0xEX1dBTExFVF9ST09UX0FERFJFU1M7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gKVxuICAgICAgICAuZ2V0KGAvZXh0ZW5kZWQvdjIvYWRkcmVzc2VzLyR7cm9vdEFkZHJlc3N9L2JhbGFuY2VzL3N0eGApXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkFDQ09VTlRfQkFMQU5DRV9SRVNQT05TRSk7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gKVxuICAgICAgICAuZ2V0KGAvZXh0ZW5kZWQvdjEvYWRkcmVzcy8ke3Jvb3RBZGRyZXNzfS9ub25jZXNgKVxuICAgICAgICAucmVwbHkoMjAwLCB0ZXN0RGF0YS5BQ0NPVU5UX05PTkNFX1JFU1BPTlNFKTtcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2AsIHsgYWxsb3dVbm1vY2tlZDogdHJ1ZSB9KVxuICAgICAgICAucG9zdChgL3YyL2ZlZXMvdHJhbnNhY3Rpb25gLCB0ZXN0RGF0YS5GRUVfRVNUSU1BVElPTl9SRVFVRVNUKVxuICAgICAgICAucmVwbHkoMjAwLCB0ZXN0RGF0YS5GRUVfRVNUSU1BVElPTl9SRVNQT05TRSk7XG5cbiAgICAgIGNvbnN0IHJlY292ZXJ5T3B0aW9uczogUmVjb3ZlcnlPcHRpb25zID0ge1xuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLkNPTERfV0FMTEVUX1BVQkxJQ19LRVlfSU5GTy5CQUNLVVBfS0VZLFxuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5DT0xEX1dBTExFVF9QVUJMSUNfS0VZX0lORk8uVVNFUl9LRVksXG4gICAgICAgIHJvb3RBZGRyZXNzOiByb290QWRkcmVzcyxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEuREVTVElOQVRJT05fQUREUkVTU19XUlcsXG4gICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS5DT0xEX1dBTExFVF9QVUJMSUNfS0VZX0lORk8uQklUR09fUFVCX0tFWSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXNwb25zZTogUmVjb3ZlcnlJbmZvID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcihyZWNvdmVyeU9wdGlvbnMpO1xuICAgICAgcmVzcG9uc2Uuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4SGV4Jyk7XG4gICAgICByZXNwb25zZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY29pbicpO1xuICAgICAgcmVzcG9uc2Uuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2ZlZUluZm8nKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UudHhIZXgsIHRlc3REYXRhLkNPTERfV0FMTEVUX1VOU0lHTkVEX1NXRUVQX1RYX0hFWCwgJ3R4IGhleCBub3QgbWF0Y2hpbmchJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLmNvaW4sICd0c3R4JywgJ2NvaW4gbm90IG1hdGNoaW5nIScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpbnZhbGlkIHJvb3QgYWRkcmVzcyB3aGVuIHJvb3QgYWRkcmVzcyBpcyBtaXNzaW5nIG9yIGludmFsaWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZWNvdmVyeU9wdGlvbnM6IFJlY292ZXJ5T3B0aW9ucyA9IHtcbiAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS5DT0xEX1dBTExFVF9QVUJMSUNfS0VZX0lORk8uQkFDS1VQX0tFWSxcbiAgICAgICAgdXNlcktleTogdGVzdERhdGEuQ09MRF9XQUxMRVRfUFVCTElDX0tFWV9JTkZPLlVTRVJfS0VZLFxuICAgICAgICByb290QWRkcmVzczogJycsXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHRlc3REYXRhLkRFU1RJTkFUSU9OX0FERFJFU1NfV1JXLFxuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEuQ09MRF9XQUxMRVRfUFVCTElDX0tFWV9JTkZPLkJJVEdPX1BVQl9LRVksXG4gICAgICB9O1xuICAgICAgYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcihyZWNvdmVyeU9wdGlvbnMpLnNob3VsZC5yZWplY3RlZFdpdGgoJ2ludmFsaWQgcm9vdCBhZGRyZXNzIScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpbnZhbGlkIGRlc3RpbmF0aW9uIGFkZHJlc3Mgd2hlbiBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIG1pc3Npbmcgb3IgaW52YWxpZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlY292ZXJ5T3B0aW9uczogUmVjb3ZlcnlPcHRpb25zID0ge1xuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLkNPTERfV0FMTEVUX1BVQkxJQ19LRVlfSU5GTy5CQUNLVVBfS0VZLFxuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5DT0xEX1dBTExFVF9QVUJMSUNfS0VZX0lORk8uVVNFUl9LRVksXG4gICAgICAgIHJvb3RBZGRyZXNzOiB0ZXN0RGF0YS5DT0xEX1dBTExFVF9ST09UX0FERFJFU1MsXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246ICcnLFxuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEuQ09MRF9XQUxMRVRfUFVCTElDX0tFWV9JTkZPLkJJVEdPX1BVQl9LRVksXG4gICAgICB9O1xuICAgICAgYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcihyZWNvdmVyeU9wdGlvbnMpLnNob3VsZC5yZWplY3RlZFdpdGgoJ2ludmFsaWQgZGVzdGluYXRpb24gYWRkcmVzcyEnKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGZhaWwgd2l0aCBubyBiYWxhbmNlIHdoZW4gcm9vdCBhZGRyZXNzIGRvZXNuJ3QgaGF2ZSBiYWxhbmNlXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gdGVzdERhdGEuSE9UX1dBTExFVF9ST09UX0FERFJFU1M7XG4gICAgICBjb25zdCBzdHhCYWxhbmNlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0ZXN0RGF0YS5BQ0NPVU5UX0JBTEFOQ0VfUkVTUE9OU0UpKTtcbiAgICAgIHN0eEJhbGFuY2UuYmFsYW5jZSA9ICcwJztcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2ApXG4gICAgICAgIC5nZXQoYC9leHRlbmRlZC92Mi9hZGRyZXNzZXMvJHtyb290QWRkcmVzc30vYmFsYW5jZXMvc3R4YClcbiAgICAgICAgLnJlcGx5KDIwMCwgc3R4QmFsYW5jZSk7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gKVxuICAgICAgICAuZ2V0KGAvZXh0ZW5kZWQvdjEvYWRkcmVzcy8ke3Jvb3RBZGRyZXNzfS9ub25jZXNgKVxuICAgICAgICAucmVwbHkoMjAwLCB0ZXN0RGF0YS5BQ0NPVU5UX05PTkNFX1JFU1BPTlNFKTtcbiAgICAgIGNvbnN0IHJlY292ZXJ5T3B0aW9uczogUmVjb3ZlcnlPcHRpb25zID0ge1xuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5CQUNLVVBfS0VZLFxuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uVVNFUl9LRVksXG4gICAgICAgIHJvb3RBZGRyZXNzOiByb290QWRkcmVzcyxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEuREVTVElOQVRJT05fQUREUkVTU19XUlcsXG4gICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uQklUR09fUFVCX0tFWSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLldBTExFVF9QQVNTUEhSQVNFLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyKHJlY292ZXJ5T3B0aW9ucylcbiAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoYGNvdWxkIG5vdCBmaW5kIGFueSBiYWxhbmNlIHRvIHJlY292ZXIgZm9yICR7cm9vdEFkZHJlc3N9YCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBpbnN1ZmZpY2llbnQgYmFsYW5jZSB3aGVuIHN0eCBiYWxhbmNlIGlzIGxvd2VyIHRoYW4gZmVlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgcm9vdEFkZHJlc3MgPSB0ZXN0RGF0YS5IT1RfV0FMTEVUX1JPT1RfQUREUkVTUztcbiAgICAgIC8vIGRlZXAgY2xvbmUgdG8gc3RvcCBtdXRhdGlvblxuICAgICAgY29uc3QgYWNjb3VudEJhbGFuY2UgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRlc3REYXRhLkFDQ09VTlRfQkFMQU5DRV9SRVNQT05TRSkpO1xuICAgICAgYWNjb3VudEJhbGFuY2UuYmFsYW5jZSA9ICcxMDAnOyAvLyBzZXQgYmFsYW5jZSBsb3dlciB0aGFuIGZlZVxuICAgICAgbm9jayhgaHR0cHM6Ly9hcGkudGVzdG5ldC5oaXJvLnNvYClcbiAgICAgICAgLmdldChgL2V4dGVuZGVkL3YyL2FkZHJlc3Nlcy8ke3Jvb3RBZGRyZXNzfS9iYWxhbmNlcy9zdHhgKVxuICAgICAgICAucmVwbHkoMjAwLCBhY2NvdW50QmFsYW5jZSk7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gKVxuICAgICAgICAuZ2V0KGAvZXh0ZW5kZWQvdjEvYWRkcmVzcy8ke3Jvb3RBZGRyZXNzfS9ub25jZXNgKVxuICAgICAgICAucmVwbHkoMjAwLCB0ZXN0RGF0YS5BQ0NPVU5UX05PTkNFX1JFU1BPTlNFKTtcbiAgICAgIGNvbnN0IGZlZVJlcXVlc3RCb2R5ID0gdGVzdERhdGEuRkVFX0VTVElNQVRJT05fUkVRVUVTVDtcbiAgICAgIGZlZVJlcXVlc3RCb2R5LnRyYW5zYWN0aW9uX3BheWxvYWQgPVxuICAgICAgICAnMDAwNTFhMTUwMGExYzQyZjBjMTFiZmUzODkzZjQ3OWFmMTg5MDQ2Nzc2ODViZTAwMDAwMDAwMDAwMDAwNjQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCc7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gLCB7IGFsbG93VW5tb2NrZWQ6IHRydWUgfSlcbiAgICAgICAgLnBvc3QoYC92Mi9mZWVzL3RyYW5zYWN0aW9uYCwgZmVlUmVxdWVzdEJvZHkpXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkZFRV9FU1RJTUFUSU9OX1JFU1BPTlNFKTtcbiAgICAgIGNvbnN0IHJlY292ZXJ5T3B0aW9uczogUmVjb3ZlcnlPcHRpb25zID0ge1xuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5CQUNLVVBfS0VZLFxuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uVVNFUl9LRVksXG4gICAgICAgIHJvb3RBZGRyZXNzOiByb290QWRkcmVzcyxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEuREVTVElOQVRJT05fQUREUkVTU19XUlcsXG4gICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uQklUR09fUFVCX0tFWSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLldBTExFVF9QQVNTUEhSQVNFLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luLnJlY292ZXIocmVjb3ZlcnlPcHRpb25zKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdpbnN1ZmZpY2llbnQgYmFsYW5jZSB0byBidWlsZCB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../test/unit/transaction.ts"],"names":[],"mappings":""}
|