@bitgo-beta/sdk-coin-cspr 1.2.19-beta.152 → 1.2.19-beta.1521
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/cspr.d.ts +5 -2
- package/dist/src/cspr.d.ts.map +1 -1
- package/dist/src/cspr.js +36 -14
- package/dist/src/index.js +23 -9
- package/dist/src/lib/constants.d.ts +1 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +2 -2
- package/dist/src/lib/delegateBuilder.js +6 -6
- package/dist/src/lib/ifaces.d.ts +2 -2
- package/dist/src/lib/ifaces.d.ts.map +1 -1
- package/dist/src/lib/index.js +23 -9
- package/dist/src/lib/keyPair.js +9 -10
- package/dist/src/lib/transaction.js +47 -34
- package/dist/src/lib/transactionBuilder.js +3 -3
- package/dist/src/lib/transactionBuilderFactory.js +2 -2
- package/dist/src/lib/transferBuilder.js +9 -9
- package/dist/src/lib/undelegateBuilder.js +6 -6
- package/dist/src/lib/utils.js +58 -45
- package/dist/src/lib/walletInitializationBuilder.js +1 -1
- package/dist/src/tcspr.js +1 -1
- package/dist/test/fixtures/cspr.d.ts +4 -0
- package/dist/test/fixtures/cspr.d.ts.map +1 -0
- package/dist/test/fixtures/cspr.js +7 -0
- package/dist/test/fixtures/resources.d.ts +92 -0
- package/dist/test/fixtures/resources.d.ts.map +1 -0
- package/dist/test/fixtures/resources.js +96 -0
- package/dist/test/integration/index.d.ts +1 -0
- package/dist/test/integration/index.d.ts.map +1 -0
- package/dist/test/integration/index.js +1 -0
- package/dist/test/unit/cspr.d.ts +2 -0
- package/dist/test/unit/cspr.d.ts.map +1 -0
- package/dist/test/unit/cspr.js +680 -0
- package/dist/test/unit/lib/keyPair.d.ts +2 -0
- package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
- package/dist/test/unit/lib/keyPair.js +159 -0
- package/dist/test/unit/lib/signMessage.d.ts +2 -0
- package/dist/test/unit/lib/signMessage.d.ts.map +1 -0
- package/dist/test/unit/lib/signMessage.js +68 -0
- package/dist/test/unit/lib/transaction.d.ts +2 -0
- package/dist/test/unit/lib/transaction.d.ts.map +1 -0
- package/dist/test/unit/lib/transaction.js +271 -0
- package/dist/test/unit/lib/transactionBuilder/delegateBuilder.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilder/delegateBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilder/delegateBuilder.js +191 -0
- package/dist/test/unit/lib/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilder/transactionBuilder.js +315 -0
- package/dist/test/unit/lib/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilder/transferBuilder.js +519 -0
- package/dist/test/unit/lib/transactionBuilder/undelegateBuilder.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilder/undelegateBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilder/undelegateBuilder.js +192 -0
- package/dist/test/unit/lib/transactionBuilder/walletInitialization.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilder/walletInitialization.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilder/walletInitialization.js +338 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilderFactory.js +328 -0
- package/dist/test/unit/lib/util.d.ts +2 -0
- package/dist/test/unit/lib/util.d.ts.map +1 -0
- package/dist/test/unit/lib/util.js +176 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +13 -10
- package/.eslintignore +0 -4
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -272
|
@@ -0,0 +1,338 @@
|
|
|
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 should_1 = __importDefault(require("should"));
|
|
41
|
+
const lib_1 = require("../../../../src/lib");
|
|
42
|
+
const testData = __importStar(require("../../../fixtures/resources"));
|
|
43
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
44
|
+
const utils_1 = require("../../../../src/lib/utils");
|
|
45
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
46
|
+
describe('CSPR Wallet initialization', () => {
|
|
47
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
|
|
48
|
+
const owner1Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress();
|
|
49
|
+
const owner2Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress();
|
|
50
|
+
const owner3Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress();
|
|
51
|
+
const owner4Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_4.publicKey }).getAddress();
|
|
52
|
+
const sourceAddress = new lib_1.KeyPair({ pub: testData.ROOT_ACCOUNT.publicKey }).getAddress();
|
|
53
|
+
const initSignedTxBuilder = () => {
|
|
54
|
+
const txBuilder = initUnsignedTxBuilder();
|
|
55
|
+
txBuilder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
|
|
56
|
+
return txBuilder;
|
|
57
|
+
};
|
|
58
|
+
const initSignedTxBuilderWithExtendedKey = () => {
|
|
59
|
+
const txBuilder = initUnsignedTxBuilder();
|
|
60
|
+
txBuilder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
|
|
61
|
+
return txBuilder;
|
|
62
|
+
};
|
|
63
|
+
const initUnsignedTxBuilder = () => {
|
|
64
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
65
|
+
txBuilder.fee(testData.FEE);
|
|
66
|
+
txBuilder.owner(owner1Address);
|
|
67
|
+
txBuilder.owner(owner2Address);
|
|
68
|
+
txBuilder.owner(owner3Address);
|
|
69
|
+
txBuilder.source({ address: sourceAddress });
|
|
70
|
+
return txBuilder;
|
|
71
|
+
};
|
|
72
|
+
describe('should build ', () => {
|
|
73
|
+
it('an init transaction', async () => {
|
|
74
|
+
const txBuilder = initSignedTxBuilder();
|
|
75
|
+
const tx = await txBuilder.build();
|
|
76
|
+
const txJson = tx.toJson();
|
|
77
|
+
should_1.default.deepEqual(txJson.fee, testData.FEE);
|
|
78
|
+
should_1.default.deepEqual(tx.signature.length, 1);
|
|
79
|
+
should_1.default.doesNotThrow(() => (0, utils_1.verifySignature)(tx.signature[0], txJson.hash, testData.ROOT_ACCOUNT.publicKey));
|
|
80
|
+
should_1.default.equal(txJson.from, sourceAddress);
|
|
81
|
+
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
|
|
82
|
+
});
|
|
83
|
+
it('an init transaction using extended key to sign', async () => {
|
|
84
|
+
const txBuilder = initSignedTxBuilderWithExtendedKey();
|
|
85
|
+
const tx = await txBuilder.build();
|
|
86
|
+
const txJson = tx.toJson();
|
|
87
|
+
should_1.default.deepEqual(txJson.fee, testData.FEE);
|
|
88
|
+
should_1.default.deepEqual(tx.signature.length, 1);
|
|
89
|
+
should_1.default.doesNotThrow(() => (0, utils_1.verifySignature)(tx.signature[0], txJson.hash, testData.ROOT_ACCOUNT.publicKey));
|
|
90
|
+
should_1.default.equal(txJson.from, sourceAddress);
|
|
91
|
+
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
|
|
92
|
+
});
|
|
93
|
+
it('an init transaction with external signature', async () => {
|
|
94
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
95
|
+
txBuilder.fee(testData.FEE);
|
|
96
|
+
txBuilder.owner(owner1Address);
|
|
97
|
+
txBuilder.owner(owner2Address);
|
|
98
|
+
txBuilder.owner(owner3Address);
|
|
99
|
+
txBuilder.source({ address: sourceAddress });
|
|
100
|
+
txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
|
|
101
|
+
const tx = await txBuilder.build();
|
|
102
|
+
const txJson = tx.toJson();
|
|
103
|
+
should_1.default.equal(txJson.from, sourceAddress);
|
|
104
|
+
});
|
|
105
|
+
it('an init transaction with external signature included twice', async () => {
|
|
106
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
107
|
+
txBuilder.fee(testData.FEE);
|
|
108
|
+
txBuilder.owner(owner1Address);
|
|
109
|
+
txBuilder.owner(owner2Address);
|
|
110
|
+
txBuilder.owner(owner3Address);
|
|
111
|
+
txBuilder.source({ address: sourceAddress });
|
|
112
|
+
txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
|
|
113
|
+
txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
|
|
114
|
+
const tx = await txBuilder.build();
|
|
115
|
+
const txJson = tx.toJson();
|
|
116
|
+
should_1.default.equal(txJson.from, sourceAddress);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe('should fail to build', () => {
|
|
120
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
|
|
121
|
+
it('a transaction without fee', async () => {
|
|
122
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
123
|
+
txBuilder.owner(owner1Address);
|
|
124
|
+
txBuilder.owner(owner2Address);
|
|
125
|
+
txBuilder.owner(owner3Address);
|
|
126
|
+
txBuilder.source({ address: sourceAddress });
|
|
127
|
+
await txBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_FEE);
|
|
128
|
+
});
|
|
129
|
+
it('a wallet initialization the wrong number of owners', async () => {
|
|
130
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
131
|
+
txBuilder.fee(testData.FEE);
|
|
132
|
+
txBuilder.owner(owner1Address);
|
|
133
|
+
txBuilder.owner(owner2Address);
|
|
134
|
+
txBuilder.source({ address: sourceAddress });
|
|
135
|
+
await txBuilder.build().should.be.rejectedWith(testData.INVALID_NUMBER_OF_OWNERS_TWO_OF_THREE);
|
|
136
|
+
assert_1.default.throws(() => txBuilder.owner(owner1Address), 'Repeated owner address: ' + owner1Address);
|
|
137
|
+
should_1.default.doesNotThrow(() => txBuilder.owner(owner3Address));
|
|
138
|
+
assert_1.default.throws(() => txBuilder.owner(owner4Address), /A maximum of 3 owners can be set for a multisig wallet/);
|
|
139
|
+
const newTxBuilder = factory.getWalletInitializationBuilder();
|
|
140
|
+
newTxBuilder.fee(testData.FEE);
|
|
141
|
+
txBuilder.source({ address: sourceAddress });
|
|
142
|
+
await newTxBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_OWNERS);
|
|
143
|
+
});
|
|
144
|
+
it('a transaction with invalid source', async () => {
|
|
145
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('thbar'));
|
|
146
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
147
|
+
txBuilder.fee(testData.FEE);
|
|
148
|
+
txBuilder.owner(owner1Address);
|
|
149
|
+
txBuilder.owner(owner2Address);
|
|
150
|
+
txBuilder.owner(owner3Address);
|
|
151
|
+
await txBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_SOURCE);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('should validate', () => {
|
|
155
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
|
|
156
|
+
it('an address', async () => {
|
|
157
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
158
|
+
txBuilder.validateAddress({ address: testData.VALID_ADDRESS });
|
|
159
|
+
assert_1.default.throws(() => txBuilder.validateAddress({ address: testData.INVALID_ADDRESS }), new RegExp('Invalid address ' + testData.INVALID_ADDRESS));
|
|
160
|
+
});
|
|
161
|
+
it('value should be greater than zero', () => {
|
|
162
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
163
|
+
assert_1.default.throws(() => txBuilder.fee({ gasLimit: '-10' }));
|
|
164
|
+
should_1.default.doesNotThrow(() => txBuilder.fee({ gasLimit: '10' }));
|
|
165
|
+
});
|
|
166
|
+
it('a private key', () => {
|
|
167
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
168
|
+
assert_1.default.throws(() => txBuilder.validateKey({ key: 'abc' }), /Unsupported private key/);
|
|
169
|
+
should_1.default.doesNotThrow(() => txBuilder.validateKey({ key: testData.ACCOUNT_1.privateKey }));
|
|
170
|
+
});
|
|
171
|
+
it('a transaction to build', async () => {
|
|
172
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
173
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing wallet owners/);
|
|
174
|
+
txBuilder.fee(testData.FEE);
|
|
175
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing wallet owners/);
|
|
176
|
+
txBuilder.source({ address: testData.VALID_ADDRESS });
|
|
177
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing wallet owners/);
|
|
178
|
+
txBuilder.owner(new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
179
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 1/);
|
|
180
|
+
txBuilder.owner(new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
181
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 2/);
|
|
182
|
+
txBuilder.owner(new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
183
|
+
should_1.default.doesNotThrow(() => txBuilder.validateTransaction());
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe('should build from', () => {
|
|
187
|
+
describe('serialized transactions', () => {
|
|
188
|
+
it('a non signed transfer transaction from serialized', async () => {
|
|
189
|
+
const builder = initUnsignedTxBuilder();
|
|
190
|
+
const tx = (await builder.build());
|
|
191
|
+
const txJson = tx.toJson();
|
|
192
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
193
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
194
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
195
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
196
|
+
const builder2 = factory.getWalletInitializationBuilder();
|
|
197
|
+
builder2.from(tx.toBroadcastFormat());
|
|
198
|
+
const tx2 = (await builder2.build());
|
|
199
|
+
const tx2Json = tx2.toJson();
|
|
200
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
201
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
202
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
203
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
204
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
205
|
+
});
|
|
206
|
+
it('a signed transfer transaction from serialized', async () => {
|
|
207
|
+
const builder = initUnsignedTxBuilder();
|
|
208
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
|
|
209
|
+
const tx = (await builder.build());
|
|
210
|
+
const txJson = tx.toJson();
|
|
211
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
212
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
213
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
214
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
215
|
+
const builder2 = factory.getWalletInitializationBuilder();
|
|
216
|
+
builder2.from(tx.toBroadcastFormat());
|
|
217
|
+
const tx2 = (await builder2.build());
|
|
218
|
+
const tx2Json = tx2.toJson();
|
|
219
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
220
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
221
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
222
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
223
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
224
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
225
|
+
});
|
|
226
|
+
it('a signed transfer transaction with extended key from serialized', async () => {
|
|
227
|
+
const builder = initUnsignedTxBuilder();
|
|
228
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
|
|
229
|
+
const tx = (await builder.build());
|
|
230
|
+
const txJson = tx.toJson();
|
|
231
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
232
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
233
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
234
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
235
|
+
const builder2 = factory.getWalletInitializationBuilder();
|
|
236
|
+
builder2.from(tx.toBroadcastFormat());
|
|
237
|
+
const tx2 = (await builder2.build());
|
|
238
|
+
const tx2Json = tx2.toJson();
|
|
239
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
240
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
241
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
242
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
243
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
244
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
245
|
+
});
|
|
246
|
+
it('an offline multisig transfer transaction', async () => {
|
|
247
|
+
const builder = initUnsignedTxBuilder();
|
|
248
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
|
|
249
|
+
builder.sign({ key: testData.ACCOUNT_1.privateKey });
|
|
250
|
+
const tx = (await builder.build());
|
|
251
|
+
const txJson = tx.toJson();
|
|
252
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
253
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
254
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
255
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
256
|
+
const builder2 = factory.getWalletInitializationBuilder();
|
|
257
|
+
builder2.from(tx.toBroadcastFormat());
|
|
258
|
+
const tx2 = (await builder2.build());
|
|
259
|
+
const tx2Json = tx2.toJson();
|
|
260
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
261
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
262
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
263
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
264
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
265
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
266
|
+
});
|
|
267
|
+
it('an offline multisig transfer transaction using extended keys', async () => {
|
|
268
|
+
const builder = initUnsignedTxBuilder();
|
|
269
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
|
|
270
|
+
builder.sign({ key: testData.ACCOUNT_1.xPrivateKey });
|
|
271
|
+
const tx = (await builder.build());
|
|
272
|
+
const txJson = tx.toJson();
|
|
273
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
274
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
275
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
276
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
277
|
+
const builder2 = factory.getWalletInitializationBuilder();
|
|
278
|
+
builder2.from(tx.toBroadcastFormat());
|
|
279
|
+
const tx2 = (await builder2.build());
|
|
280
|
+
const tx2Json = tx2.toJson();
|
|
281
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
282
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
283
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
284
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
285
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
286
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
287
|
+
});
|
|
288
|
+
it('an offline multisig transfer transaction using one extended key', async () => {
|
|
289
|
+
const builder = initUnsignedTxBuilder();
|
|
290
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
|
|
291
|
+
builder.sign({ key: testData.ACCOUNT_1.privateKey });
|
|
292
|
+
const tx = (await builder.build());
|
|
293
|
+
const txJson = tx.toJson();
|
|
294
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
295
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
296
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
297
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
298
|
+
const builder2 = factory.getWalletInitializationBuilder();
|
|
299
|
+
builder2.from(tx.toBroadcastFormat());
|
|
300
|
+
const tx2 = (await builder2.build());
|
|
301
|
+
const tx2Json = tx2.toJson();
|
|
302
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
303
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
304
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
305
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
306
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
307
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
describe('txJson validation', () => {
|
|
312
|
+
it('contains all required fields for Wallet Initialization', async () => {
|
|
313
|
+
const txBuilder = initSignedTxBuilder();
|
|
314
|
+
const tx = (await txBuilder.build());
|
|
315
|
+
const txJson = tx.toJson();
|
|
316
|
+
should_1.default.deepEqual(txJson.fee, testData.FEE);
|
|
317
|
+
should_1.default.equal(txJson.deployType, 'WalletInitialization');
|
|
318
|
+
should_1.default.equal(txJson.from, '02' + testData.ROOT_ACCOUNT.publicKey);
|
|
319
|
+
should_1.default.equal(txJson.hash, Buffer.from(tx.casperTx.hash).toString('hex'));
|
|
320
|
+
should_1.default.equal(txJson.owner1, new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
321
|
+
should_1.default.equal(txJson.owner2, new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
322
|
+
should_1.default.equal(txJson.owner3, new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
323
|
+
});
|
|
324
|
+
it('contains all required fields for Wallet Initialization using extended key to sign', async () => {
|
|
325
|
+
const txBuilder = initSignedTxBuilderWithExtendedKey();
|
|
326
|
+
const tx = (await txBuilder.build());
|
|
327
|
+
const txJson = tx.toJson();
|
|
328
|
+
should_1.default.deepEqual(txJson.fee, testData.FEE);
|
|
329
|
+
should_1.default.equal(txJson.deployType, 'WalletInitialization');
|
|
330
|
+
should_1.default.equal(txJson.from, '02' + testData.ROOT_ACCOUNT.publicKey);
|
|
331
|
+
should_1.default.equal(txJson.hash, Buffer.from(tx.casperTx.hash).toString('hex'));
|
|
332
|
+
should_1.default.equal(txJson.owner1, new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
333
|
+
should_1.default.equal(txJson.owner2, new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
334
|
+
should_1.default.equal(txJson.owner3, new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0SW5pdGlhbGl6YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3RyYW5zYWN0aW9uQnVpbGRlci93YWxsZXRJbml0aWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsNkNBQXlFO0FBQ3pFLHNFQUF3RDtBQUN4RCxtREFBdUQ7QUFFdkQscURBQTREO0FBRTVELGlEQUE0QztBQUU1QyxRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO0lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0RixNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEYsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RGLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0RixNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMs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QyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRXpFLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDN0YsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM3RixnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IEtleVBhaXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uLy4uL2ZpeHR1cmVzL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgdmVyaWZ5U2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBDTFN0cmluZyB9IGZyb20gJ2Nhc3Blci1qcy1zZGsnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcblxuZGVzY3JpYmUoJ0NTUFIgV2FsbGV0IGluaXRpYWxpemF0aW9uJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0Y3NwcicpKTtcbiAgY29uc3Qgb3duZXIxQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcbiAgY29uc3Qgb3duZXIyQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcbiAgY29uc3Qgb3duZXIzQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcbiAgY29uc3Qgb3duZXI0QWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzQucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcbiAgY29uc3Qgc291cmNlQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcblxuICBjb25zdCBpbml0U2lnbmVkVHhCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRVbnNpZ25lZFR4QnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHJpdmF0ZUtleSB9KTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIGNvbnN0IGluaXRTaWduZWRUeEJ1aWxkZXJXaXRoRXh0ZW5kZWRLZXkgPSAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlJPT1RfQUNDT1VOVC54UHJpdmF0ZUtleSB9KTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIGNvbnN0IGluaXRVbnNpZ25lZFR4QnVpbGRlciA9ICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5mZWUodGVzdERhdGEuRkVFKTtcbiAgICB0eEJ1aWxkZXIub3duZXIob3duZXIxQWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLm93bmVyKG93bmVyMkFkZHJlc3MpO1xuICAgIHR4QnVpbGRlci5vd25lcihvd25lcjNBZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogc291cmNlQWRkcmVzcyB9KTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQgJywgKCkgPT4ge1xuICAgIGl0KCdhbiBpbml0IHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFNpZ25lZFR4QnVpbGRlcigpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmVlLCB0ZXN0RGF0YS5GRUUpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5zaWduYXR1cmUubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdmVyaWZ5U2lnbmF0dXJlKHR4LnNpZ25hdHVyZVswXSwgdHhKc29uLmhhc2gsIHRlc3REYXRhLlJPT1RfQUNDT1VOVC5wdWJsaWNLZXkpKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZnJvbSwgc291cmNlQWRkcmVzcyk7XG4gICAgICB0eC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGluaXQgdHJhbnNhY3Rpb24gdXNpbmcgZXh0ZW5kZWQga2V5IHRvIHNpZ24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0U2lnbmVkVHhCdWlsZGVyV2l0aEV4dGVuZGVkS2V5KCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUsIHRlc3REYXRhLkZFRSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnNpZ25hdHVyZS5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB2ZXJpZnlTaWduYXR1cmUodHguc2lnbmF0dXJlWzBdLCB0eEpzb24uaGFzaCwgdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnB1YmxpY0tleSkpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mcm9tLCBzb3VyY2VBZGRyZXNzKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gaW5pdCB0cmFuc2FjdGlvbiB3aXRoIGV4dGVybmFsIHNpZ25hdHVyZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHRlc3REYXRhLkZFRSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIxQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIyQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIzQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogc291cmNlQWRkcmVzcyB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduYXR1cmUoXG4gICAgICAgIHRlc3REYXRhLkVYVEVSTkFMX1NJR05BVFVSRS5zaWduYXR1cmUsXG4gICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5FWFRFUk5BTF9TSUdOQVRVUkUucHVibGljS2V5IH0pXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZyb20sIHNvdXJjZUFkZHJlc3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuIGluaXQgdHJhbnNhY3Rpb24gd2l0aCBleHRlcm5hbCBzaWduYXR1cmUgaW5jbHVkZWQgdHdpY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmZlZSh0ZXN0RGF0YS5GRUUpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG93bmVyMUFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG93bmVyMkFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG93bmVyM0FkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6IHNvdXJjZUFkZHJlc3MgfSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbmF0dXJlKFxuICAgICAgICB0ZXN0RGF0YS5FWFRFUk5BTF9TSUdOQVRVUkUuc2lnbmF0dXJlLFxuICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuRVhURVJOQUxfU0lHTkFUVVJFLnB1YmxpY0tleSB9KVxuICAgICAgKTtcbiAgICAgIHR4QnVpbGRlci5zaWduYXR1cmUoXG4gICAgICAgIHRlc3REYXRhLkVYVEVSTkFMX1NJR05BVFVSRS5zaWduYXR1cmUsXG4gICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5FWFRFUk5BTF9TSUdOQVRVUkUucHVibGljS2V5IH0pXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZyb20sIHNvdXJjZUFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIGZhaWwgdG8gYnVpbGQnLCAoKSA9PiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGNzcHInKSk7XG5cbiAgICBpdCgnYSB0cmFuc2FjdGlvbiB3aXRob3V0IGZlZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIxQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIyQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIzQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogc291cmNlQWRkcmVzcyB9KTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgodGVzdERhdGEuSU5WQUxJRF9UUkFOU0FDVElPTl9NSVNTSU5HX0ZFRSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB3YWxsZXQgaW5pdGlhbGl6YXRpb24gdGhlIHdyb25nIG51bWJlciBvZiBvd25lcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmZlZSh0ZXN0RGF0YS5GRUUpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG93bmVyMUFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG93bmVyMkFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6IHNvdXJjZUFkZHJlc3MgfSk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKHRlc3REYXRhLklOVkFMSURfTlVNQkVSX09GX09XTkVSU19UV09fT0ZfVEhSRUUpO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5vd25lcihvd25lcjFBZGRyZXNzKSwgJ1JlcGVhdGVkIG93bmVyIGFkZHJlc3M6ICcgKyBvd25lcjFBZGRyZXNzKTtcblxuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB0eEJ1aWxkZXIub3duZXIob3duZXIzQWRkcmVzcykpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIub3duZXIob3duZXI0QWRkcmVzcyksIC9BIG1heGltdW0gb2YgMyBvd25lcnMgY2FuIGJlIHNldCBmb3IgYSBtdWx0aXNpZyB3YWxsZXQvKTtcblxuICAgICAgY29uc3QgbmV3VHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIG5ld1R4QnVpbGRlci5mZWUodGVzdERhdGEuRkVFKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBzb3VyY2VBZGRyZXNzIH0pO1xuICAgICAgYXdhaXQgbmV3VHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCh0ZXN0RGF0YS5JTlZBTElEX1RSQU5TQUNUSU9OX01JU1NJTkdfT1dORVJTKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBzb3VyY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0aGJhcicpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHRlc3REYXRhLkZFRSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIxQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIyQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIzQWRkcmVzcyk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKHRlc3REYXRhLklOVkFMSURfVFJBTlNBQ1RJT05fTUlTU0lOR19TT1VSQ0UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hvdWxkIHZhbGlkYXRlJywgKCkgPT4ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3Rjc3ByJykpO1xuXG4gICAgaXQoJ2FuIGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlQWRkcmVzcyh7IGFkZHJlc3M6IHRlc3REYXRhLlZBTElEX0FERFJFU1MgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVBZGRyZXNzKHsgYWRkcmVzczogdGVzdERhdGEuSU5WQUxJRF9BRERSRVNTIH0pLFxuICAgICAgICBuZXcgUmVnRXhwKCdJbnZhbGlkIGFkZHJlc3MgJyArIHRlc3REYXRhLklOVkFMSURfQUREUkVTUylcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsdWUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLmZlZSh7IGdhc0xpbWl0OiAnLTEwJyB9KSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci5mZWUoeyBnYXNMaW1pdDogJzEwJyB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSBwcml2YXRlIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZUtleSh7IGtleTogJ2FiYycgfSksIC9VbnN1cHBvcnRlZCBwcml2YXRlIGtleS8pO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS5wcml2YXRlS2V5IH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHRyYW5zYWN0aW9uIHRvIGJ1aWxkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgd2FsbGV0IG93bmVycy8pO1xuICAgICAgdHhCdWlsZGVyLmZlZSh0ZXN0RGF0YS5GRUUpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbigpLCAvSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyB3YWxsZXQgb3duZXJzLyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogdGVzdERhdGEuVkFMSURfQUREUkVTUyB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgd2FsbGV0IG93bmVycy8pO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCksIC93cm9uZyBudW1iZXIgb2Ygb3duZXJzIC0tIHJlcXVpcmVkOiAzLCBmb3VuZDogMS8pO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCksIC93cm9uZyBudW1iZXIgb2Ygb3duZXJzIC0tIHJlcXVpcmVkOiAzLCBmb3VuZDogMi8pO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCkpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCBmcm9tJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdzZXJpYWxpemVkIHRyYW5zYWN0aW9ucycsICgpID0+IHtcbiAgICAgIGl0KCdhIG5vbiBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gZnJvbSBzZXJpYWxpemVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlcjIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgY29uc3QgdHgyID0gKGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eDJKc29uID0gdHgyLnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Mkpzb24sIHR4SnNvbiwgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCByZWNyZWF0ZSBvcmlnaW5hbCB0cmFuc2FjdGlvbicpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VW5zaWduZWRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgySnNvbiwgdHhKc29uLCAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIHJlY3JlYXRlIG9yaWdpbmFsIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgICAgdHgyLmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICB0eC5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCBnZXQgYXBwcm92YWxzIGNvcnJlY3RseSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBleHRlbmRlZCBrZXkgZnJvbSBzZXJpYWxpemVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnhQcml2YXRlS2V5IH0pO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8xJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCBidWlsZGVyMi5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHgySnNvbiA9IHR4Mi50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8xJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eDJKc29uLCB0eEpzb24sICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgcmVjcmVhdGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgICB0eDIuY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgIHR4LmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIGdldCBhcHByb3ZhbHMgY29ycmVjdGx5J1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhbiBvZmZsaW5lIG11bHRpc2lnIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnByaXZhdGVLZXkgfSk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUNDT1VOVF8xLnByaXZhdGVLZXkgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlcjIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgY29uc3QgdHgyID0gKGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eDJKc29uID0gdHgyLnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Mkpzb24sIHR4SnNvbiwgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCByZWNyZWF0ZSBvcmlnaW5hbCB0cmFuc2FjdGlvbicpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAgIHR4Mi5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgdHguY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgZ2V0IGFwcHJvdmFscyBjb3JyZWN0bHknXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2FuIG9mZmxpbmUgbXVsdGlzaWcgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdXNpbmcgZXh0ZW5kZWQga2V5cycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRVbnNpZ25lZFR4QnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlJPT1RfQUNDT1VOVC54UHJpdmF0ZUtleSB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEueFByaXZhdGVLZXkgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlcjIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgY29uc3QgdHgyID0gKGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eDJKc29uID0gdHgyLnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Mkpzb24sIHR4SnNvbiwgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCByZWNyZWF0ZSBvcmlnaW5hbCB0cmFuc2FjdGlvbicpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAgIHR4Mi5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgdHguY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgZ2V0IGFwcHJvdmFscyBjb3JyZWN0bHknXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2FuIG9mZmxpbmUgbXVsdGlzaWcgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdXNpbmcgb25lIGV4dGVuZGVkIGtleScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRVbnNpZ25lZFR4QnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlJPT1RfQUNDT1VOVC54UHJpdmF0ZUtleSB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgySnNvbiwgdHhKc29uLCAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIHJlY3JlYXRlIG9yaWdpbmFsIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgICAgdHgyLmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICB0eC5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCBnZXQgYXBwcm92YWxzIGNvcnJlY3RseSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndHhKc29uIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2NvbnRhaW5zIGFsbCByZXF1aXJlZCBmaWVsZHMgZm9yIFdhbGxldCBJbml0aWFsaXphdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRTaWduZWRUeEJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZmVlLCB0ZXN0RGF0YS5GRUUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5kZXBsb3lUeXBlLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZnJvbSwgJzAyJyArIHRlc3REYXRhLlJPT1RfQUNDT1VOVC5wdWJsaWNLZXkpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5oYXNoLCBCdWZmZXIuZnJvbSh0eC5jYXNwZXJUeC5oYXNoKS50b1N0cmluZygnaGV4JykpO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLm93bmVyMSwgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24ub3duZXIyLCBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKCkpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5vd25lcjMsIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY29udGFpbnMgYWxsIHJlcXVpcmVkIGZpZWxkcyBmb3IgV2FsbGV0IEluaXRpYWxpemF0aW9uIHVzaW5nIGV4dGVuZGVkIGtleSB0byBzaWduJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFNpZ25lZFR4QnVpbGRlcldpdGhFeHRlbmRlZEtleSgpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUsIHRlc3REYXRhLkZFRSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmRlcGxveVR5cGUsICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mcm9tLCAnMDInICsgdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmhhc2gsIEJ1ZmZlci5mcm9tKHR4LmNhc3BlclR4Lmhhc2gpLnRvU3RyaW5nKCdoZXgnKSk7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24ub3duZXIxLCBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKCkpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5vd25lcjIsIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLm93bmVyMywgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../../test/unit/lib/transactionBuilderFactory.ts"],"names":[],"mappings":""}
|