@bitgo/sdk-coin-eth 25.11.3 → 25.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/erc7984Token.d.ts +19 -0
- package/dist/src/erc7984Token.d.ts.map +1 -1
- package/dist/src/erc7984Token.js +108 -3
- package/dist/src/lib/transactionBuilder.d.ts +4 -4
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +7 -3
- package/dist/src/lib/transferBuilders/index.d.ts +2 -2
- package/dist/src/lib/transferBuilders/index.d.ts.map +1 -1
- package/dist/src/lib/transferBuilders/index.js +3 -2
- package/dist/test/unit/erc7984Token.js +347 -7
- package/dist/test/unit/eth.js +149 -3
- package/dist/test/unit/transactionBuilder/sendERC7984Token.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/sendERC7984Token.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/sendERC7984Token.js +361 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendERC7984Token.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/sendERC7984Token.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,361 @@
|
|
|
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 sdk_core_1 = require("@bitgo/sdk-core");
|
|
40
|
+
const statics_1 = require("@bitgo/statics");
|
|
41
|
+
const abstract_eth_1 = require("@bitgo/abstract-eth");
|
|
42
|
+
const testData = __importStar(require("../../resources/eth"));
|
|
43
|
+
const should_1 = __importDefault(require("should"));
|
|
44
|
+
const getBuilder_1 = require("../getBuilder");
|
|
45
|
+
describe('Eth transaction builder sendERC7984Token', () => {
|
|
46
|
+
// dummy wallet contract address (sendMultiSig wrapper)
|
|
47
|
+
const walletContractAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
|
|
48
|
+
// dummy ERC-7984 token contract address
|
|
49
|
+
const tokenContractAddress = '0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85';
|
|
50
|
+
const senderAddress = '0x19645032c7f1533395d44a629462e751084d3e4d';
|
|
51
|
+
const recipientAddress = '0x19645032c7f1533395d44a629462e751084d3e4c';
|
|
52
|
+
// Synthetic 32-byte encrypted handle (all valid hex)
|
|
53
|
+
const encryptedHandle = '0x' + 'ab'.repeat(32); // 66 chars
|
|
54
|
+
// Synthetic input proof (~50 bytes)
|
|
55
|
+
const inputProof = '0x' + 'cd'.repeat(50); // 102 chars
|
|
56
|
+
const expireTime = 1590066728;
|
|
57
|
+
const sequenceId = 42;
|
|
58
|
+
const coin = statics_1.coins.get('hteth');
|
|
59
|
+
let key;
|
|
60
|
+
beforeEach(() => {
|
|
61
|
+
key = testData.KEYPAIR_PRV.getKeys().prv;
|
|
62
|
+
});
|
|
63
|
+
// ───────────────────────────────────────────────────────────
|
|
64
|
+
// 1. TransferBuilderERC7984 — unit tests
|
|
65
|
+
// ───────────────────────────────────────────────────────────
|
|
66
|
+
describe('TransferBuilderERC7984 unit tests', () => {
|
|
67
|
+
it('build() produces correct ABI encoding with expected method ID prefix', () => {
|
|
68
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
69
|
+
builder
|
|
70
|
+
.from(senderAddress)
|
|
71
|
+
.to(recipientAddress)
|
|
72
|
+
.tokenContractAddress(tokenContractAddress)
|
|
73
|
+
.encryptedHandle(encryptedHandle)
|
|
74
|
+
.inputProof(inputProof)
|
|
75
|
+
.contractSequenceId(sequenceId)
|
|
76
|
+
.expirationTime(expireTime);
|
|
77
|
+
const innerCalldata = builder.build();
|
|
78
|
+
// confidentialTransfer(address,bytes32,bytes) method id
|
|
79
|
+
(0, should_1.default)(innerCalldata.slice(0, 10).toLowerCase()).equal('0x2fb74e62');
|
|
80
|
+
});
|
|
81
|
+
it('encryptedHandle setter rejects wrong length', () => {
|
|
82
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
83
|
+
(0, should_1.default)(() => builder.encryptedHandle('0x1234')).throw(/encryptedHandle/);
|
|
84
|
+
});
|
|
85
|
+
it('encryptedHandle setter rejects missing 0x prefix', () => {
|
|
86
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
87
|
+
(0, should_1.default)(() => builder.encryptedHandle('ab'.repeat(32))).throw(/encryptedHandle/);
|
|
88
|
+
});
|
|
89
|
+
it('inputProof setter rejects empty proof', () => {
|
|
90
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
91
|
+
(0, should_1.default)(() => builder.inputProof('0x')).throw(/inputProof/);
|
|
92
|
+
});
|
|
93
|
+
it('inputProof setter rejects non-hex', () => {
|
|
94
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
95
|
+
(0, should_1.default)(() => builder.inputProof('0xzzzz')).throw(/inputProof/);
|
|
96
|
+
});
|
|
97
|
+
it('to setter rejects invalid address', () => {
|
|
98
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
99
|
+
(0, should_1.default)(() => builder.to('not-an-address')).throw(/Invalid address/);
|
|
100
|
+
});
|
|
101
|
+
it('tokenContractAddress setter rejects invalid address', () => {
|
|
102
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
103
|
+
(0, should_1.default)(() => builder.tokenContractAddress('not-an-address')).throw(/Invalid address/);
|
|
104
|
+
});
|
|
105
|
+
it('build() throws without required fields', () => {
|
|
106
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
107
|
+
(0, should_1.default)(() => builder.build()).throw(/Missing mandatory field/);
|
|
108
|
+
});
|
|
109
|
+
it('build() throws without encryptedHandle', () => {
|
|
110
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
111
|
+
builder.to(recipientAddress).tokenContractAddress(tokenContractAddress).inputProof(inputProof);
|
|
112
|
+
(0, should_1.default)(() => builder.build()).throw(/encryptedHandle/);
|
|
113
|
+
});
|
|
114
|
+
it('build() throws without inputProof', () => {
|
|
115
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
116
|
+
builder.to(recipientAddress).tokenContractAddress(tokenContractAddress).encryptedHandle(encryptedHandle);
|
|
117
|
+
(0, should_1.default)(() => builder.build()).throw(/inputProof/);
|
|
118
|
+
});
|
|
119
|
+
it('signAndBuild() throws without contractSequenceId', () => {
|
|
120
|
+
// build() only produces inner calldata and does not require sequenceId.
|
|
121
|
+
// signAndBuild() wraps in sendMultiSig which needs sequenceId — verify it fails early.
|
|
122
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
123
|
+
builder
|
|
124
|
+
.to(recipientAddress)
|
|
125
|
+
.tokenContractAddress(tokenContractAddress)
|
|
126
|
+
.encryptedHandle(encryptedHandle)
|
|
127
|
+
.inputProof(inputProof)
|
|
128
|
+
.expirationTime(expireTime)
|
|
129
|
+
.key(key);
|
|
130
|
+
(0, should_1.default)(() => builder.signAndBuild(`${coin.chainId}`)).throw(/contract sequence id/);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
// ───────────────────────────────────────────────────────────
|
|
134
|
+
// 2. MPC / TSS flow (signing key provided)
|
|
135
|
+
// ───────────────────────────────────────────────────────────
|
|
136
|
+
describe('MPC/TSS flow with signing key', () => {
|
|
137
|
+
it('signAndBuild() returns a well-formed hex string', () => {
|
|
138
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
139
|
+
builder
|
|
140
|
+
.from(senderAddress)
|
|
141
|
+
.to(recipientAddress)
|
|
142
|
+
.tokenContractAddress(tokenContractAddress)
|
|
143
|
+
.encryptedHandle(encryptedHandle)
|
|
144
|
+
.inputProof(inputProof)
|
|
145
|
+
.contractSequenceId(sequenceId)
|
|
146
|
+
.expirationTime(expireTime)
|
|
147
|
+
.key(key);
|
|
148
|
+
const calldata = builder.signAndBuild(`${coin.chainId}`);
|
|
149
|
+
(0, should_1.default)(calldata).be.a.String();
|
|
150
|
+
(0, should_1.default)(calldata.startsWith('0x')).be.true();
|
|
151
|
+
// outer method id: sendMultiSig = 0x39125215
|
|
152
|
+
(0, should_1.default)(calldata.slice(0, 10).toLowerCase()).equal('0x39125215');
|
|
153
|
+
});
|
|
154
|
+
it('decoded inner calldata starts with confidentialTransfer method id and has correct fields', () => {
|
|
155
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
156
|
+
builder
|
|
157
|
+
.from(senderAddress)
|
|
158
|
+
.to(recipientAddress)
|
|
159
|
+
.tokenContractAddress(tokenContractAddress)
|
|
160
|
+
.encryptedHandle(encryptedHandle)
|
|
161
|
+
.inputProof(inputProof)
|
|
162
|
+
.contractSequenceId(sequenceId)
|
|
163
|
+
.expirationTime(expireTime)
|
|
164
|
+
.key(key);
|
|
165
|
+
const calldata = builder.signAndBuild(`${coin.chainId}`);
|
|
166
|
+
const decoded = (0, abstract_eth_1.decodeConfidentialTransferData)(calldata);
|
|
167
|
+
(0, should_1.default)(decoded.toAddress.toLowerCase()).equal(recipientAddress.toLowerCase());
|
|
168
|
+
(0, should_1.default)(decoded.tokenContractAddress.toLowerCase()).equal(tokenContractAddress.toLowerCase());
|
|
169
|
+
(0, should_1.default)(decoded.encryptedHandle.toLowerCase()).equal(encryptedHandle.toLowerCase());
|
|
170
|
+
(0, should_1.default)(decoded.inputProof.toLowerCase()).equal(inputProof.toLowerCase());
|
|
171
|
+
(0, should_1.default)(decoded.expireTime).equal(expireTime.toString());
|
|
172
|
+
(0, should_1.default)(decoded.sequenceId).equal(sequenceId.toString());
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
// ───────────────────────────────────────────────────────────
|
|
176
|
+
// 3. No-key flow (multisig second-signer path)
|
|
177
|
+
// ───────────────────────────────────────────────────────────
|
|
178
|
+
describe('No-key flow (multisig)', () => {
|
|
179
|
+
it('signAndBuild() without key produces calldata with empty signature', () => {
|
|
180
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
181
|
+
builder
|
|
182
|
+
.from(senderAddress)
|
|
183
|
+
.to(recipientAddress)
|
|
184
|
+
.tokenContractAddress(tokenContractAddress)
|
|
185
|
+
.encryptedHandle(encryptedHandle)
|
|
186
|
+
.inputProof(inputProof)
|
|
187
|
+
.contractSequenceId(sequenceId)
|
|
188
|
+
.expirationTime(expireTime);
|
|
189
|
+
const calldata = builder.signAndBuild(`${coin.chainId}`);
|
|
190
|
+
(0, should_1.default)(calldata.startsWith('0x39125215')).be.true();
|
|
191
|
+
// Should still be decodable
|
|
192
|
+
const decoded = (0, abstract_eth_1.decodeConfidentialTransferData)(calldata);
|
|
193
|
+
(0, should_1.default)(decoded.toAddress.toLowerCase()).equal(recipientAddress.toLowerCase());
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
// ───────────────────────────────────────────────────────────
|
|
197
|
+
// 4. Full TransactionBuilder integration test
|
|
198
|
+
// ───────────────────────────────────────────────────────────
|
|
199
|
+
describe('TransactionBuilder integration', () => {
|
|
200
|
+
it('builds a complete SendERC7984 transaction with correct structure', async () => {
|
|
201
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
|
|
202
|
+
txBuilder.fee({
|
|
203
|
+
fee: '1000000000',
|
|
204
|
+
gasLimit: '12100000',
|
|
205
|
+
});
|
|
206
|
+
txBuilder.counter(2);
|
|
207
|
+
txBuilder.contract(walletContractAddress);
|
|
208
|
+
txBuilder.type(sdk_core_1.TransactionType.SendERC7984);
|
|
209
|
+
const transferBuilder = txBuilder.transfer();
|
|
210
|
+
transferBuilder
|
|
211
|
+
.from(senderAddress)
|
|
212
|
+
.to(recipientAddress)
|
|
213
|
+
.tokenContractAddress(tokenContractAddress)
|
|
214
|
+
.encryptedHandle(encryptedHandle)
|
|
215
|
+
.inputProof(inputProof)
|
|
216
|
+
.contractSequenceId(sequenceId)
|
|
217
|
+
.expirationTime(expireTime)
|
|
218
|
+
.key(key);
|
|
219
|
+
txBuilder.sign({ key: testData.PRIVATE_KEY });
|
|
220
|
+
const tx = await txBuilder.build();
|
|
221
|
+
const txJson = tx.toJson();
|
|
222
|
+
(0, should_1.default)(txJson.to.toLowerCase()).equal(walletContractAddress.toLowerCase());
|
|
223
|
+
// Outer data starts with sendMultiSig
|
|
224
|
+
(0, should_1.default)(txJson.data.slice(0, 10).toLowerCase()).equal('0x39125215');
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
// ───────────────────────────────────────────────────────────
|
|
228
|
+
// 5. Round-trip decode test
|
|
229
|
+
// ───────────────────────────────────────────────────────────
|
|
230
|
+
describe('Round-trip decode', () => {
|
|
231
|
+
it('decodeConfidentialTransferData() round-trips all fields', () => {
|
|
232
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
233
|
+
builder
|
|
234
|
+
.from(senderAddress)
|
|
235
|
+
.to(recipientAddress)
|
|
236
|
+
.tokenContractAddress(tokenContractAddress)
|
|
237
|
+
.encryptedHandle(encryptedHandle)
|
|
238
|
+
.inputProof(inputProof)
|
|
239
|
+
.contractSequenceId(sequenceId)
|
|
240
|
+
.expirationTime(expireTime)
|
|
241
|
+
.key(key);
|
|
242
|
+
const calldata = builder.signAndBuild(`${coin.chainId}`);
|
|
243
|
+
const decoded = (0, abstract_eth_1.decodeConfidentialTransferData)(calldata);
|
|
244
|
+
(0, should_1.default)(decoded.toAddress.toLowerCase()).equal(recipientAddress.toLowerCase());
|
|
245
|
+
(0, should_1.default)(decoded.tokenContractAddress.toLowerCase()).equal(tokenContractAddress.toLowerCase());
|
|
246
|
+
(0, should_1.default)(decoded.encryptedHandle.toLowerCase()).equal(encryptedHandle.toLowerCase());
|
|
247
|
+
(0, should_1.default)(decoded.inputProof.toLowerCase()).equal(inputProof.toLowerCase());
|
|
248
|
+
(0, should_1.default)(decoded.expireTime).equal(expireTime.toString());
|
|
249
|
+
(0, should_1.default)(decoded.sequenceId).equal(sequenceId.toString());
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
// ───────────────────────────────────────────────────────────
|
|
253
|
+
// 6. classifyTransaction() test
|
|
254
|
+
// ───────────────────────────────────────────────────────────
|
|
255
|
+
describe('classifyTransaction()', () => {
|
|
256
|
+
it('identifies SendERC7984 transactions correctly', () => {
|
|
257
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
258
|
+
builder
|
|
259
|
+
.from(senderAddress)
|
|
260
|
+
.to(recipientAddress)
|
|
261
|
+
.tokenContractAddress(tokenContractAddress)
|
|
262
|
+
.encryptedHandle(encryptedHandle)
|
|
263
|
+
.inputProof(inputProof)
|
|
264
|
+
.contractSequenceId(sequenceId)
|
|
265
|
+
.expirationTime(expireTime)
|
|
266
|
+
.key(key);
|
|
267
|
+
const calldata = builder.signAndBuild(`${coin.chainId}`);
|
|
268
|
+
const txType = (0, abstract_eth_1.classifyTransaction)(calldata);
|
|
269
|
+
(0, should_1.default)(txType).equal(sdk_core_1.TransactionType.SendERC7984);
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
// ───────────────────────────────────────────────────────────
|
|
273
|
+
// 7. Reconstruction from hex (from() round-trip)
|
|
274
|
+
// ───────────────────────────────────────────────────────────
|
|
275
|
+
describe('Reconstruction from hex', () => {
|
|
276
|
+
it('rebuilds SendERC7984 transaction from serialized hex', async () => {
|
|
277
|
+
// Build original tx
|
|
278
|
+
const txBuilder1 = (0, getBuilder_1.getBuilder)('hteth');
|
|
279
|
+
txBuilder1.fee({ fee: '1000000000', gasLimit: '12100000' });
|
|
280
|
+
txBuilder1.counter(2);
|
|
281
|
+
txBuilder1.contract(walletContractAddress);
|
|
282
|
+
txBuilder1.type(sdk_core_1.TransactionType.SendERC7984);
|
|
283
|
+
const transferBuilder = txBuilder1.transfer();
|
|
284
|
+
transferBuilder
|
|
285
|
+
.from(senderAddress)
|
|
286
|
+
.to(recipientAddress)
|
|
287
|
+
.tokenContractAddress(tokenContractAddress)
|
|
288
|
+
.encryptedHandle(encryptedHandle)
|
|
289
|
+
.inputProof(inputProof)
|
|
290
|
+
.contractSequenceId(sequenceId)
|
|
291
|
+
.expirationTime(expireTime)
|
|
292
|
+
.key(key);
|
|
293
|
+
txBuilder1.sign({ key: testData.PRIVATE_KEY });
|
|
294
|
+
const tx1 = await txBuilder1.build();
|
|
295
|
+
const rawHex = tx1.toBroadcastFormat();
|
|
296
|
+
// Reconstruct from hex
|
|
297
|
+
const txBuilder2 = (0, getBuilder_1.getBuilder)('hteth');
|
|
298
|
+
txBuilder2.from(rawHex);
|
|
299
|
+
const tx2 = await txBuilder2.build();
|
|
300
|
+
const txJson2 = tx2.toJson();
|
|
301
|
+
(0, should_1.default)(txJson2.to.toLowerCase()).equal(walletContractAddress.toLowerCase());
|
|
302
|
+
(0, should_1.default)(txJson2.data.slice(0, 10).toLowerCase()).equal('0x39125215');
|
|
303
|
+
// Verify the type was correctly identified
|
|
304
|
+
(0, should_1.default)(txBuilder2['_type']).equal(sdk_core_1.TransactionType.SendERC7984);
|
|
305
|
+
});
|
|
306
|
+
it('reconstructed _transfer is an instance of TransferBuilderERC7984', async () => {
|
|
307
|
+
const txBuilder1 = (0, getBuilder_1.getBuilder)('hteth');
|
|
308
|
+
txBuilder1.fee({ fee: '1000000000', gasLimit: '12100000' });
|
|
309
|
+
txBuilder1.counter(2);
|
|
310
|
+
txBuilder1.contract(walletContractAddress);
|
|
311
|
+
txBuilder1.type(sdk_core_1.TransactionType.SendERC7984);
|
|
312
|
+
const transferBuilder = txBuilder1.transfer();
|
|
313
|
+
transferBuilder
|
|
314
|
+
.from(senderAddress)
|
|
315
|
+
.to(recipientAddress)
|
|
316
|
+
.tokenContractAddress(tokenContractAddress)
|
|
317
|
+
.encryptedHandle(encryptedHandle)
|
|
318
|
+
.inputProof(inputProof)
|
|
319
|
+
.contractSequenceId(sequenceId)
|
|
320
|
+
.expirationTime(expireTime)
|
|
321
|
+
.key(key);
|
|
322
|
+
txBuilder1.sign({ key: testData.PRIVATE_KEY });
|
|
323
|
+
const tx1 = await txBuilder1.build();
|
|
324
|
+
const rawHex = tx1.toBroadcastFormat();
|
|
325
|
+
const txBuilder2 = (0, getBuilder_1.getBuilder)('hteth');
|
|
326
|
+
txBuilder2.from(rawHex);
|
|
327
|
+
(0, should_1.default)(txBuilder2['_transfer']).be.instanceof(abstract_eth_1.TransferBuilderERC7984);
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
// ───────────────────────────────────────────────────────────
|
|
331
|
+
// 8. Error / edge case tests
|
|
332
|
+
// ───────────────────────────────────────────────────────────
|
|
333
|
+
describe('Error and edge cases', () => {
|
|
334
|
+
it('transfer() returns TransferBuilderERC7984 after setting type to SendERC7984', () => {
|
|
335
|
+
const txBuilder = (0, getBuilder_1.getBuilder)('hteth');
|
|
336
|
+
txBuilder.fee({ fee: '1000000000', gasLimit: '12100000' });
|
|
337
|
+
txBuilder.counter(2);
|
|
338
|
+
txBuilder.contract(walletContractAddress);
|
|
339
|
+
txBuilder.type(sdk_core_1.TransactionType.Send); // native send type, not ERC7984
|
|
340
|
+
// Native transfer() returns a TransferBuilder, not ERC7984
|
|
341
|
+
// Attempting to use the native transfer for a ERC7984 tx should fail at build time
|
|
342
|
+
txBuilder.type(sdk_core_1.TransactionType.SendERC7984);
|
|
343
|
+
// After setting type to ERC7984, calling transfer() should return TransferBuilderERC7984
|
|
344
|
+
const tb = txBuilder.transfer();
|
|
345
|
+
(0, should_1.default)(tb).be.instanceof(abstract_eth_1.TransferBuilderERC7984);
|
|
346
|
+
});
|
|
347
|
+
it('zero-length inputProof throws on setter', () => {
|
|
348
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
349
|
+
(0, should_1.default)(() => builder.inputProof('0x')).throw(/inputProof/);
|
|
350
|
+
});
|
|
351
|
+
it('encryptedHandle with wrong length throws', () => {
|
|
352
|
+
const builder = new abstract_eth_1.TransferBuilderERC7984();
|
|
353
|
+
// 31 bytes instead of 32
|
|
354
|
+
(0, should_1.default)(() => builder.encryptedHandle('0x' + 'ab'.repeat(31))).throw(/encryptedHandle/);
|
|
355
|
+
});
|
|
356
|
+
it('decodeConfidentialTransferData throws on non-sendMultiSig data', () => {
|
|
357
|
+
(0, should_1.default)(() => (0, abstract_eth_1.decodeConfidentialTransferData)('0x12345678')).throw(/Invalid confidential transfer bytecode/);
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZEVSQzc5ODRUb2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvc2VuZEVSQzc5ODRUb2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUFrRDtBQUNsRCw0Q0FBMEU7QUFDMUUsc0RBQWtIO0FBRWxILDhEQUFnRDtBQUNoRCxvREFBNEI7QUFDNUIsOENBQTJDO0FBRTNDLFFBQVEsQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUU7SUFDeEQsdURBQXVEO0lBQ3ZELE1BQU0scUJBQXFCLEdBQUcsNENBQTRDLENBQUM7SUFDM0Usd0NBQXdDO0lBQ3hDLE1BQU0sb0JBQW9CLEdBQUcsNENBQTRDLENBQUM7SUFDMUUsTUFBTSxhQUFhLEdBQUcsNENBQTRDLENBQUM7SUFDbkUsTUFBTSxnQkFBZ0IsR0FBRyw0Q0FBNEMsQ0FBQztJQUV0RSxxREFBcUQ7SUFDckQsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXO0lBQzNELG9DQUFvQztJQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVk7SUFFdkQsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQzlCLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUV0QixNQUFNLElBQUksR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBOEIsQ0FBQztJQUU3RCxJQUFJLEdBQVcsQ0FBQztJQUVoQixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsR0FBRyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBYSxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsOERBQThEO0lBQzlELHlDQUF5QztJQUN6Qyw4REFBOEQ7SUFFOUQsUUFBUSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtRQUNqRCxFQUFFLENBQUMsc0VBQXNFLEVBQUUsR0FBRyxFQUFFO1lBQzlFLE1BQU0sT0FBTyxHQUFHLElBQUkscUNBQXNCLEVBQUUsQ0FBQztZQUM3QyxPQUFPO2lCQUNKLElBQUksQ0FBQyxhQUFhLENBQUM7aUJBQ25CLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDcEIsb0JBQW9CLENBQUMsb0JBQW9CLENBQUM7aUJBQzFDLGVBQWUsQ0FBQyxlQUFlLENBQUM7aUJBQ2hDLFVBQVUsQ0FBQyxVQUFVLENBQUM7aUJBQ3RCLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztpQkFDOUIsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTlCLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0Qyx3REFBd0Q7WUFDeEQsSUFBQSxnQkFBTSxFQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtZQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFJLHFDQUFzQixFQUFFLENBQUM7WUFDN0MsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxHQUFHLEVBQUU7WUFDMUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQ0FBc0IsRUFBRSxDQUFDO1lBQzdDLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xGLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtZQUMvQyxNQUFNLE9BQU8sR0FBRyxJQUFJLHFDQUFzQixFQUFFLENBQUM7WUFDN0MsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUUsR0FBRyxFQUFFO1lBQzNDLE1BQU0sT0FBTyxHQUFHLElBQUkscUNBQXNCLEVBQUUsQ0FBQztZQUM3QyxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7WUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQ0FBc0IsRUFBRSxDQUFDO1lBQzdDLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7WUFDN0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQ0FBc0IsRUFBRSxDQUFDO1lBQzdDLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hGLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtZQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLHFDQUFzQixFQUFFLENBQUM7WUFDN0MsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtZQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLHFDQUFzQixFQUFFLENBQUM7WUFDN0MsT0FBTyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9GLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7WUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQ0FBc0IsRUFBRSxDQUFDO1lBQzdDLE9BQU8sQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN6RyxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtZQUMxRCx3RUFBd0U7WUFDeEUsdUZBQXVGO1lBQ3ZGLE1BQU0sT0FBTyxHQUFHLElBQUkscUNBQXNCLEVBQUUsQ0FBQztZQUM3QyxPQUFPO2lCQUNKLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDcEIsb0JBQW9CLENBQUMsb0JBQW9CLENBQUM7aUJBQzFDLGVBQWUsQ0FBQyxlQUFlLENBQUM7aUJBQ2hDLFVBQVUsQ0FBQyxVQUFVLENBQUM7aUJBQ3RCLGNBQWMsQ0FBQyxVQUFVLENBQUM7aUJBQzFCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUN0RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsOERBQThEO0lBQzlELDJDQUEyQztJQUMzQyw4REFBOEQ7SUFFOUQsUUFBUSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtRQUM3QyxFQUFFLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFO1lBQ3pELE1BQU0sT0FBTyxHQUFHLElBQUkscUNBQXNCLEVBQUUsQ0FBQztZQUM3QyxPQUFPO2lCQUNKLElBQUksQ0FBQyxhQUFhLENBQUM7aUJBQ25CLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDcEIsb0JBQW9CLENBQUMsb0JBQW9CLENBQUM7aUJBQzFDLGVBQWUsQ0FBQyxlQUFlLENBQUM7aUJBQ2hDLFVBQVUsQ0FBQyxVQUFVLENBQUM7aUJBQ3RCLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztpQkFDOUIsY0FBYyxDQUFDLFVBQVUsQ0FBQztpQkFDMUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRVosTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELElBQUEsZ0JBQU0sRUFBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLElBQUEsZ0JBQU0sRUFBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzVDLDZDQUE2QztZQUM3QyxJQUFBLGdCQUFNLEVBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMEZBQTBGLEVBQUUsR0FBRyxFQUFFO1lBQ2xHLE1BQU0sT0FBTyxHQUFHLElBQUkscUNBQXNCLEVBQUUsQ0FBQztZQUM3QyxPQUFPO2lCQUNKLElBQUksQ0FBQyxhQUFhLENBQUM7aUJBQ25CLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDcEIsb0JBQW9CLENBQUMsb0JBQW9CLENBQUM7aUJBQzFDLGVBQWUsQ0FBQyxlQUFlLENBQUM7aUJBQ2hDLFVBQVUsQ0FBQyxVQUFVLENBQUM7aUJBQ3RCLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztpQkFDOUIsY0FBYyxDQUFDLFVBQVUsQ0FBQztpQkFDMUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRVosTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sT0FBTyxHQUFHLElBQUEsNkNBQThCLEVBQUMsUUFBUSxDQUFDLENBQUM7WUFDekQsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM5RSxJQUFBLGdCQUFNLEVBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDN0YsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDbkYsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDekUsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDeEQsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILDhEQUE4RDtJQUM5RCwrQ0FBK0M7SUFDL0MsOERBQThEO0lBRTlELFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7UUFDdEMsRUFBRSxDQUFDLG1FQUFtRSxFQUFFLEdBQUcsRUFBRTtZQUMzRSxNQUFNLE9BQU8sR0FBRyxJQUFJLHFDQUFzQixFQUFFLENBQUM7WUFDN0MsT0FBTztpQkFDSixJQUFJLENBQUMsYUFBYSxDQUFDO2lCQUNuQixFQUFFLENBQUMsZ0JBQWdCLENBQUM7aUJBQ3BCLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDO2lCQUMxQyxlQUFlLENBQUMsZUFBZSxDQUFDO2lCQUNoQyxVQUFVLENBQUMsVUFBVSxDQUFDO2lCQUN0QixrQkFBa0IsQ0FBQyxVQUFVLENBQUM7aUJBQzlCLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUU5QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDekQsSUFBQSxnQkFBTSxFQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFcEQsNEJBQTRCO1lBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUEsNkNBQThCLEVBQUMsUUFBUSxDQUFDLENBQUM7WUFDekQsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNoRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsOERBQThEO0lBQzlELDhDQUE4QztJQUM5Qyw4REFBOEQ7SUFFOUQsUUFBUSxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtRQUM5QyxFQUFFLENBQUMsa0VBQWtFLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEYsTUFBTSxTQUFTLEdBQUcsSUFBQSx1QkFBVSxFQUFDLE9BQU8sQ0FBdUIsQ0FBQztZQUM1RCxTQUFTLENBQUMsR0FBRyxDQUFDO2dCQUNaLEdBQUcsRUFBRSxZQUFZO2dCQUNqQixRQUFRLEVBQUUsVUFBVTthQUNyQixDQUFDLENBQUM7WUFDSCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLFNBQVMsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUMxQyxTQUFTLENBQUMsSUFBSSxDQUFDLDBCQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFNUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLFFBQVEsRUFBNEIsQ0FBQztZQUN2RSxlQUFlO2lCQUNaLElBQUksQ0FBQyxhQUFhLENBQUM7aUJBQ25CLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDcEIsb0JBQW9CLENBQUMsb0JBQW9CLENBQUM7aUJBQzFDLGVBQWUsQ0FBQyxlQUFlLENBQUM7aUJBQ2hDLFVBQVUsQ0FBQyxVQUFVLENBQUM7aUJBQ3RCLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztpQkFDOUIsY0FBYyxDQUFDLFVBQVUsQ0FBQztpQkFDMUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRVosU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM5QyxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFM0IsSUFBQSxnQkFBTSxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUMzRSxzQ0FBc0M7WUFDdEMsSUFBQSxnQkFBTSxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsOERBQThEO0lBQzlELDRCQUE0QjtJQUM1Qiw4REFBOEQ7SUFFOUQsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUNqQyxFQUFFLENBQUMseURBQXlELEVBQUUsR0FBRyxFQUFFO1lBQ2pFLE1BQU0sT0FBTyxHQUFHLElBQUkscUNBQXNCLEVBQUUsQ0FBQztZQUM3QyxPQUFPO2lCQUNKLElBQUksQ0FBQyxhQUFhLENBQUM7aUJBQ25CLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDcEIsb0JBQW9CLENBQUMsb0JBQW9CLENBQUM7aUJBQzFDLGVBQWUsQ0FBQyxlQUFlLENBQUM7aUJBQ2hDLFVBQVUsQ0FBQyxVQUFVLENBQUM7aUJBQ3RCLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztpQkFDOUIsY0FBYyxDQUFDLFVBQVUsQ0FBQztpQkFDMUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRVosTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sT0FBTyxHQUFHLElBQUEsNkNBQThCLEVBQUMsUUFBUSxDQUFDLENBQUM7WUFFekQsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM5RSxJQUFBLGdCQUFNLEVBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDN0YsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDbkYsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDekUsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDeEQsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILDhEQUE4RDtJQUM5RCxnQ0FBZ0M7SUFDaEMsOERBQThEO0lBRTlELFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7UUFDckMsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEdBQUcsRUFBRTtZQUN2RCxNQUFNLE9BQU8sR0FBRyxJQUFJLHFDQUFzQixFQUFFLENBQUM7WUFDN0MsT0FBTztpQkFDSixJQUFJLENBQUMsYUFBYSxDQUFDO2lCQUNuQixFQUFFLENBQUMsZ0JBQWdCLENBQUM7aUJBQ3BCLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDO2lCQUMxQyxlQUFlLENBQUMsZUFBZSxDQUFDO2lCQUNoQyxVQUFVLENBQUMsVUFBVSxDQUFDO2lCQUN0QixrQkFBa0IsQ0FBQyxVQUFVLENBQUM7aUJBQzlCLGNBQWMsQ0FBQyxVQUFVLENBQUM7aUJBQzFCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVaLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFBLGtDQUFtQixFQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLElBQUEsZ0JBQU0sRUFBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsMEJBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsOERBQThEO0lBQzlELGlEQUFpRDtJQUNqRCw4REFBOEQ7SUFFOUQsUUFBUSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtRQUN2QyxFQUFFLENBQUMsc0RBQXNELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDcEUsb0JBQW9CO1lBQ3BCLE1BQU0sVUFBVSxHQUFHLElBQUEsdUJBQVUsRUFBQyxPQUFPLENBQXVCLENBQUM7WUFDN0QsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDNUQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixVQUFVLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDM0MsVUFBVSxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTdDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQTRCLENBQUM7WUFDeEUsZUFBZTtpQkFDWixJQUFJLENBQUMsYUFBYSxDQUFDO2lCQUNuQixFQUFFLENBQUMsZ0JBQWdCLENBQUM7aUJBQ3BCLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDO2lCQUMxQyxlQUFlLENBQUMsZUFBZSxDQUFDO2lCQUNoQyxVQUFVLENBQUMsVUFBVSxDQUFDO2lCQUN0QixrQkFBa0IsQ0FBQyxVQUFVLENBQUM7aUJBQzlCLGNBQWMsQ0FBQyxVQUFVLENBQUM7aUJBQzFCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVaLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDL0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFdkMsdUJBQXVCO1lBQ3ZCLE1BQU0sVUFBVSxHQUFHLElBQUEsdUJBQVUsRUFBQyxPQUFPLENBQXVCLENBQUM7WUFDN0QsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QixNQUFNLEdBQUcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFN0IsSUFBQSxnQkFBTSxFQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM1RSxJQUFBLGdCQUFNLEVBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRXBFLDJDQUEyQztZQUMzQyxJQUFBLGdCQUFNLEVBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLDBCQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0VBQWtFLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEYsTUFBTSxVQUFVLEdBQUcsSUFBQSx1QkFBVSxFQUFDLE9BQU8sQ0FBdUIsQ0FBQztZQUM3RCxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM1RCxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLFVBQVUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUMzQyxVQUFVLENBQUMsSUFBSSxDQUFDLDBCQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFN0MsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBNEIsQ0FBQztZQUN4RSxlQUFlO2lCQUNaLElBQUksQ0FBQyxhQUFhLENBQUM7aUJBQ25CLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDcEIsb0JBQW9CLENBQUMsb0JBQW9CLENBQUM7aUJBQzFDLGVBQWUsQ0FBQyxlQUFlLENBQUM7aUJBQ2hDLFVBQVUsQ0FBQyxVQUFVLENBQUM7aUJBQ3RCLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztpQkFDOUIsY0FBYyxDQUFDLFVBQVUsQ0FBQztpQkFDMUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRVosVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUMvQyxNQUFNLEdBQUcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUV2QyxNQUFNLFVBQVUsR0FBRyxJQUFBLHVCQUFVLEVBQUMsT0FBTyxDQUF1QixDQUFDO1lBQzdELFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFeEIsSUFBQSxnQkFBTSxFQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMscUNBQXNCLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsOERBQThEO0lBQzlELDZCQUE2QjtJQUM3Qiw4REFBOEQ7SUFFOUQsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtRQUNwQyxFQUFFLENBQUMsNkVBQTZFLEVBQUUsR0FBRyxFQUFFO1lBQ3JGLE1BQU0sU0FBUyxHQUFHLElBQUEsdUJBQVUsRUFBQyxPQUFPLENBQXVCLENBQUM7WUFDNUQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDM0QsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixTQUFTLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO1lBQ3RFLDJEQUEyRDtZQUMzRCxtRkFBbUY7WUFDbkYsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVDLHlGQUF5RjtZQUN6RixNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEMsSUFBQSxnQkFBTSxFQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMscUNBQXNCLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxHQUFHLEVBQUU7WUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQ0FBc0IsRUFBRSxDQUFDO1lBQzdDLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtZQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLHFDQUFzQixFQUFFLENBQUM7WUFDN0MseUJBQXlCO1lBQ3pCLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6RixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnRUFBZ0UsRUFBRSxHQUFHLEVBQUU7WUFDeEUsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsNkNBQThCLEVBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUM3RyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMsIEV0aGVyZXVtTmV0d29yayBhcyBFdGhMaWtlTmV0d29yayB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zZmVyQnVpbGRlckVSQzc5ODQsIGNsYXNzaWZ5VHJhbnNhY3Rpb24sIGRlY29kZUNvbmZpZGVudGlhbFRyYW5zZmVyRGF0YSB9IGZyb20gJ0BiaXRnby9hYnN0cmFjdC1ldGgnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9ldGgnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlciB9IGZyb20gJy4uL2dldEJ1aWxkZXInO1xuXG5kZXNjcmliZSgnRXRoIHRyYW5zYWN0aW9uIGJ1aWxkZXIgc2VuZEVSQzc5ODRUb2tlbicsICgpID0+IHtcbiAgLy8gZHVtbXkgd2FsbGV0IGNvbnRyYWN0IGFkZHJlc3MgKHNlbmRNdWx0aVNpZyB3cmFwcGVyKVxuICBjb25zdCB3YWxsZXRDb250cmFjdEFkZHJlc3MgPSAnMHg4Zjk3N2U5MTJlZjUwMDU0OGEwYzNiZTZkZGRlOTg5OWYxMTk5YjgxJztcbiAgLy8gZHVtbXkgRVJDLTc5ODQgdG9rZW4gY29udHJhY3QgYWRkcmVzc1xuICBjb25zdCB0b2tlbkNvbnRyYWN0QWRkcmVzcyA9ICcweDU3ZjE4ODdhOGJmMTliMTRmYzBkZjZmZDliMmFjYzlhZjE0N2VhODUnO1xuICBjb25zdCBzZW5kZXJBZGRyZXNzID0gJzB4MTk2NDUwMzJjN2YxNTMzMzk1ZDQ0YTYyOTQ2MmU3NTEwODRkM2U0ZCc7XG4gIGNvbnN0IHJlY2lwaWVudEFkZHJlc3MgPSAnMHgxOTY0NTAzMmM3ZjE1MzMzOTVkNDRhNjI5NDYyZTc1MTA4NGQzZTRjJztcblxuICAvLyBTeW50aGV0aWMgMzItYnl0ZSBlbmNyeXB0ZWQgaGFuZGxlIChhbGwgdmFsaWQgaGV4KVxuICBjb25zdCBlbmNyeXB0ZWRIYW5kbGUgPSAnMHgnICsgJ2FiJy5yZXBlYXQoMzIpOyAvLyA2NiBjaGFyc1xuICAvLyBTeW50aGV0aWMgaW5wdXQgcHJvb2YgKH41MCBieXRlcylcbiAgY29uc3QgaW5wdXRQcm9vZiA9ICcweCcgKyAnY2QnLnJlcGVhdCg1MCk7IC8vIDEwMiBjaGFyc1xuXG4gIGNvbnN0IGV4cGlyZVRpbWUgPSAxNTkwMDY2NzI4O1xuICBjb25zdCBzZXF1ZW5jZUlkID0gNDI7XG5cbiAgY29uc3QgY29pbiA9IGNvaW5zLmdldCgnaHRldGgnKSBhcyB1bmtub3duIGFzIEV0aExpa2VOZXR3b3JrO1xuXG4gIGxldCBrZXk6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBrZXkgPSB0ZXN0RGF0YS5LRVlQQUlSX1BSVi5nZXRLZXlzKCkucHJ2IGFzIHN0cmluZztcbiAgfSk7XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIDEuIFRyYW5zZmVyQnVpbGRlckVSQzc5ODQg4oCUIHVuaXQgdGVzdHNcbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZGVzY3JpYmUoJ1RyYW5zZmVyQnVpbGRlckVSQzc5ODQgdW5pdCB0ZXN0cycsICgpID0+IHtcbiAgICBpdCgnYnVpbGQoKSBwcm9kdWNlcyBjb3JyZWN0IEFCSSBlbmNvZGluZyB3aXRoIGV4cGVjdGVkIG1ldGhvZCBJRCBwcmVmaXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlckVSQzc5ODQoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmZyb20oc2VuZGVyQWRkcmVzcylcbiAgICAgICAgLnRvKHJlY2lwaWVudEFkZHJlc3MpXG4gICAgICAgIC50b2tlbkNvbnRyYWN0QWRkcmVzcyh0b2tlbkNvbnRyYWN0QWRkcmVzcylcbiAgICAgICAgLmVuY3J5cHRlZEhhbmRsZShlbmNyeXB0ZWRIYW5kbGUpXG4gICAgICAgIC5pbnB1dFByb29mKGlucHV0UHJvb2YpXG4gICAgICAgIC5jb250cmFjdFNlcXVlbmNlSWQoc2VxdWVuY2VJZClcbiAgICAgICAgLmV4cGlyYXRpb25UaW1lKGV4cGlyZVRpbWUpO1xuXG4gICAgICBjb25zdCBpbm5lckNhbGxkYXRhID0gYnVpbGRlci5idWlsZCgpO1xuICAgICAgLy8gY29uZmlkZW50aWFsVHJhbnNmZXIoYWRkcmVzcyxieXRlczMyLGJ5dGVzKSBtZXRob2QgaWRcbiAgICAgIHNob3VsZChpbm5lckNhbGxkYXRhLnNsaWNlKDAsIDEwKS50b0xvd2VyQ2FzZSgpKS5lcXVhbCgnMHgyZmI3NGU2MicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2VuY3J5cHRlZEhhbmRsZSBzZXR0ZXIgcmVqZWN0cyB3cm9uZyBsZW5ndGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlckVSQzc5ODQoKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLmVuY3J5cHRlZEhhbmRsZSgnMHgxMjM0JykpLnRocm93KC9lbmNyeXB0ZWRIYW5kbGUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmNyeXB0ZWRIYW5kbGUgc2V0dGVyIHJlamVjdHMgbWlzc2luZyAweCBwcmVmaXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlckVSQzc5ODQoKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLmVuY3J5cHRlZEhhbmRsZSgnYWInLnJlcGVhdCgzMikpKS50aHJvdygvZW5jcnlwdGVkSGFuZGxlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5wdXRQcm9vZiBzZXR0ZXIgcmVqZWN0cyBlbXB0eSBwcm9vZicsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyRVJDNzk4NCgpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuaW5wdXRQcm9vZignMHgnKSkudGhyb3coL2lucHV0UHJvb2YvKTtcbiAgICB9KTtcblxuICAgIGl0KCdpbnB1dFByb29mIHNldHRlciByZWplY3RzIG5vbi1oZXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlckVSQzc5ODQoKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLmlucHV0UHJvb2YoJzB4enp6eicpKS50aHJvdygvaW5wdXRQcm9vZi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RvIHNldHRlciByZWplY3RzIGludmFsaWQgYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyRVJDNzk4NCgpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIudG8oJ25vdC1hbi1hZGRyZXNzJykpLnRocm93KC9JbnZhbGlkIGFkZHJlc3MvKTtcbiAgICB9KTtcblxuICAgIGl0KCd0b2tlbkNvbnRyYWN0QWRkcmVzcyBzZXR0ZXIgcmVqZWN0cyBpbnZhbGlkIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlckVSQzc5ODQoKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnRva2VuQ29udHJhY3RBZGRyZXNzKCdub3QtYW4tYWRkcmVzcycpKS50aHJvdygvSW52YWxpZCBhZGRyZXNzLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQoKSB0aHJvd3Mgd2l0aG91dCByZXF1aXJlZCBmaWVsZHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlckVSQzc5ODQoKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLmJ1aWxkKCkpLnRocm93KC9NaXNzaW5nIG1hbmRhdG9yeSBmaWVsZC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkKCkgdGhyb3dzIHdpdGhvdXQgZW5jcnlwdGVkSGFuZGxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXJFUkM3OTg0KCk7XG4gICAgICBidWlsZGVyLnRvKHJlY2lwaWVudEFkZHJlc3MpLnRva2VuQ29udHJhY3RBZGRyZXNzKHRva2VuQ29udHJhY3RBZGRyZXNzKS5pbnB1dFByb29mKGlucHV0UHJvb2YpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIuYnVpbGQoKSkudGhyb3coL2VuY3J5cHRlZEhhbmRsZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkKCkgdGhyb3dzIHdpdGhvdXQgaW5wdXRQcm9vZicsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyRVJDNzk4NCgpO1xuICAgICAgYnVpbGRlci50byhyZWNpcGllbnRBZGRyZXNzKS50b2tlbkNvbnRyYWN0QWRkcmVzcyh0b2tlbkNvbnRyYWN0QWRkcmVzcykuZW5jcnlwdGVkSGFuZGxlKGVuY3J5cHRlZEhhbmRsZSk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5idWlsZCgpKS50aHJvdygvaW5wdXRQcm9vZi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ25BbmRCdWlsZCgpIHRocm93cyB3aXRob3V0IGNvbnRyYWN0U2VxdWVuY2VJZCcsICgpID0+IHtcbiAgICAgIC8vIGJ1aWxkKCkgb25seSBwcm9kdWNlcyBpbm5lciBjYWxsZGF0YSBhbmQgZG9lcyBub3QgcmVxdWlyZSBzZXF1ZW5jZUlkLlxuICAgICAgLy8gc2lnbkFuZEJ1aWxkKCkgd3JhcHMgaW4gc2VuZE11bHRpU2lnIHdoaWNoIG5lZWRzIHNlcXVlbmNlSWQg4oCUIHZlcmlmeSBpdCBmYWlscyBlYXJseS5cbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyRVJDNzk4NCgpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAudG8ocmVjaXBpZW50QWRkcmVzcylcbiAgICAgICAgLnRva2VuQ29udHJhY3RBZGRyZXNzKHRva2VuQ29udHJhY3RBZGRyZXNzKVxuICAgICAgICAuZW5jcnlwdGVkSGFuZGxlKGVuY3J5cHRlZEhhbmRsZSlcbiAgICAgICAgLmlucHV0UHJvb2YoaW5wdXRQcm9vZilcbiAgICAgICAgLmV4cGlyYXRpb25UaW1lKGV4cGlyZVRpbWUpXG4gICAgICAgIC5rZXkoa2V5KTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnNpZ25BbmRCdWlsZChgJHtjb2luLmNoYWluSWR9YCkpLnRocm93KC9jb250cmFjdCBzZXF1ZW5jZSBpZC8pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gMi4gTVBDIC8gVFNTIGZsb3cgKHNpZ25pbmcga2V5IHByb3ZpZGVkKVxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBkZXNjcmliZSgnTVBDL1RTUyBmbG93IHdpdGggc2lnbmluZyBrZXknLCAoKSA9PiB7XG4gICAgaXQoJ3NpZ25BbmRCdWlsZCgpIHJldHVybnMgYSB3ZWxsLWZvcm1lZCBoZXggc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXJFUkM3OTg0KCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5mcm9tKHNlbmRlckFkZHJlc3MpXG4gICAgICAgIC50byhyZWNpcGllbnRBZGRyZXNzKVxuICAgICAgICAudG9rZW5Db250cmFjdEFkZHJlc3ModG9rZW5Db250cmFjdEFkZHJlc3MpXG4gICAgICAgIC5lbmNyeXB0ZWRIYW5kbGUoZW5jcnlwdGVkSGFuZGxlKVxuICAgICAgICAuaW5wdXRQcm9vZihpbnB1dFByb29mKVxuICAgICAgICAuY29udHJhY3RTZXF1ZW5jZUlkKHNlcXVlbmNlSWQpXG4gICAgICAgIC5leHBpcmF0aW9uVGltZShleHBpcmVUaW1lKVxuICAgICAgICAua2V5KGtleSk7XG5cbiAgICAgIGNvbnN0IGNhbGxkYXRhID0gYnVpbGRlci5zaWduQW5kQnVpbGQoYCR7Y29pbi5jaGFpbklkfWApO1xuICAgICAgc2hvdWxkKGNhbGxkYXRhKS5iZS5hLlN0cmluZygpO1xuICAgICAgc2hvdWxkKGNhbGxkYXRhLnN0YXJ0c1dpdGgoJzB4JykpLmJlLnRydWUoKTtcbiAgICAgIC8vIG91dGVyIG1ldGhvZCBpZDogc2VuZE11bHRpU2lnID0gMHgzOTEyNTIxNVxuICAgICAgc2hvdWxkKGNhbGxkYXRhLnNsaWNlKDAsIDEwKS50b0xvd2VyQ2FzZSgpKS5lcXVhbCgnMHgzOTEyNTIxNScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RlY29kZWQgaW5uZXIgY2FsbGRhdGEgc3RhcnRzIHdpdGggY29uZmlkZW50aWFsVHJhbnNmZXIgbWV0aG9kIGlkIGFuZCBoYXMgY29ycmVjdCBmaWVsZHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlckVSQzc5ODQoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmZyb20oc2VuZGVyQWRkcmVzcylcbiAgICAgICAgLnRvKHJlY2lwaWVudEFkZHJlc3MpXG4gICAgICAgIC50b2tlbkNvbnRyYWN0QWRkcmVzcyh0b2tlbkNvbnRyYWN0QWRkcmVzcylcbiAgICAgICAgLmVuY3J5cHRlZEhhbmRsZShlbmNyeXB0ZWRIYW5kbGUpXG4gICAgICAgIC5pbnB1dFByb29mKGlucHV0UHJvb2YpXG4gICAgICAgIC5jb250cmFjdFNlcXVlbmNlSWQoc2VxdWVuY2VJZClcbiAgICAgICAgLmV4cGlyYXRpb25UaW1lKGV4cGlyZVRpbWUpXG4gICAgICAgIC5rZXkoa2V5KTtcblxuICAgICAgY29uc3QgY2FsbGRhdGEgPSBidWlsZGVyLnNpZ25BbmRCdWlsZChgJHtjb2luLmNoYWluSWR9YCk7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlQ29uZmlkZW50aWFsVHJhbnNmZXJEYXRhKGNhbGxkYXRhKTtcbiAgICAgIHNob3VsZChkZWNvZGVkLnRvQWRkcmVzcy50b0xvd2VyQ2FzZSgpKS5lcXVhbChyZWNpcGllbnRBZGRyZXNzLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgc2hvdWxkKGRlY29kZWQudG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSkuZXF1YWwodG9rZW5Db250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBzaG91bGQoZGVjb2RlZC5lbmNyeXB0ZWRIYW5kbGUudG9Mb3dlckNhc2UoKSkuZXF1YWwoZW5jcnlwdGVkSGFuZGxlLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgc2hvdWxkKGRlY29kZWQuaW5wdXRQcm9vZi50b0xvd2VyQ2FzZSgpKS5lcXVhbChpbnB1dFByb29mLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgc2hvdWxkKGRlY29kZWQuZXhwaXJlVGltZSkuZXF1YWwoZXhwaXJlVGltZS50b1N0cmluZygpKTtcbiAgICAgIHNob3VsZChkZWNvZGVkLnNlcXVlbmNlSWQpLmVxdWFsKHNlcXVlbmNlSWQudG9TdHJpbmcoKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyAzLiBOby1rZXkgZmxvdyAobXVsdGlzaWcgc2Vjb25kLXNpZ25lciBwYXRoKVxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBkZXNjcmliZSgnTm8ta2V5IGZsb3cgKG11bHRpc2lnKScsICgpID0+IHtcbiAgICBpdCgnc2lnbkFuZEJ1aWxkKCkgd2l0aG91dCBrZXkgcHJvZHVjZXMgY2FsbGRhdGEgd2l0aCBlbXB0eSBzaWduYXR1cmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlckVSQzc5ODQoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmZyb20oc2VuZGVyQWRkcmVzcylcbiAgICAgICAgLnRvKHJlY2lwaWVudEFkZHJlc3MpXG4gICAgICAgIC50b2tlbkNvbnRyYWN0QWRkcmVzcyh0b2tlbkNvbnRyYWN0QWRkcmVzcylcbiAgICAgICAgLmVuY3J5cHRlZEhhbmRsZShlbmNyeXB0ZWRIYW5kbGUpXG4gICAgICAgIC5pbnB1dFByb29mKGlucHV0UHJvb2YpXG4gICAgICAgIC5jb250cmFjdFNlcXVlbmNlSWQoc2VxdWVuY2VJZClcbiAgICAgICAgLmV4cGlyYXRpb25UaW1lKGV4cGlyZVRpbWUpO1xuXG4gICAgICBjb25zdCBjYWxsZGF0YSA9IGJ1aWxkZXIuc2lnbkFuZEJ1aWxkKGAke2NvaW4uY2hhaW5JZH1gKTtcbiAgICAgIHNob3VsZChjYWxsZGF0YS5zdGFydHNXaXRoKCcweDM5MTI1MjE1JykpLmJlLnRydWUoKTtcblxuICAgICAgLy8gU2hvdWxkIHN0aWxsIGJlIGRlY29kYWJsZVxuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUNvbmZpZGVudGlhbFRyYW5zZmVyRGF0YShjYWxsZGF0YSk7XG4gICAgICBzaG91bGQoZGVjb2RlZC50b0FkZHJlc3MudG9Mb3dlckNhc2UoKSkuZXF1YWwocmVjaXBpZW50QWRkcmVzcy50b0xvd2VyQ2FzZSgpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIDQuIEZ1bGwgVHJhbnNhY3Rpb25CdWlsZGVyIGludGVncmF0aW9uIHRlc3RcbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uQnVpbGRlciBpbnRlZ3JhdGlvbicsICgpID0+IHtcbiAgICBpdCgnYnVpbGRzIGEgY29tcGxldGUgU2VuZEVSQzc5ODQgdHJhbnNhY3Rpb24gd2l0aCBjb3JyZWN0IHN0cnVjdHVyZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ2h0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgIGZlZTogJzEwMDAwMDAwMDAnLFxuICAgICAgICBnYXNMaW1pdDogJzEyMTAwMDAwJyxcbiAgICAgIH0pO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoMik7XG4gICAgICB0eEJ1aWxkZXIuY29udHJhY3Qod2FsbGV0Q29udHJhY3RBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kRVJDNzk4NCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zZmVyQnVpbGRlciA9IHR4QnVpbGRlci50cmFuc2ZlcigpIGFzIFRyYW5zZmVyQnVpbGRlckVSQzc5ODQ7XG4gICAgICB0cmFuc2ZlckJ1aWxkZXJcbiAgICAgICAgLmZyb20oc2VuZGVyQWRkcmVzcylcbiAgICAgICAgLnRvKHJlY2lwaWVudEFkZHJlc3MpXG4gICAgICAgIC50b2tlbkNvbnRyYWN0QWRkcmVzcyh0b2tlbkNvbnRyYWN0QWRkcmVzcylcbiAgICAgICAgLmVuY3J5cHRlZEhhbmRsZShlbmNyeXB0ZWRIYW5kbGUpXG4gICAgICAgIC5pbnB1dFByb29mKGlucHV0UHJvb2YpXG4gICAgICAgIC5jb250cmFjdFNlcXVlbmNlSWQoc2VxdWVuY2VJZClcbiAgICAgICAgLmV4cGlyYXRpb25UaW1lKGV4cGlyZVRpbWUpXG4gICAgICAgIC5rZXkoa2V5KTtcblxuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlBSSVZBVEVfS0VZIH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICBzaG91bGQodHhKc29uLnRvLnRvTG93ZXJDYXNlKCkpLmVxdWFsKHdhbGxldENvbnRyYWN0QWRkcmVzcy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIC8vIE91dGVyIGRhdGEgc3RhcnRzIHdpdGggc2VuZE11bHRpU2lnXG4gICAgICBzaG91bGQodHhKc29uLmRhdGEuc2xpY2UoMCwgMTApLnRvTG93ZXJDYXNlKCkpLmVxdWFsKCcweDM5MTI1MjE1Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyA1LiBSb3VuZC10cmlwIGRlY29kZSB0ZXN0XG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGRlc2NyaWJlKCdSb3VuZC10cmlwIGRlY29kZScsICgpID0+IHtcbiAgICBpdCgnZGVjb2RlQ29uZmlkZW50aWFsVHJhbnNmZXJEYXRhKCkgcm91bmQtdHJpcHMgYWxsIGZpZWxkcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyRVJDNzk4NCgpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuZnJvbShzZW5kZXJBZGRyZXNzKVxuICAgICAgICAudG8ocmVjaXBpZW50QWRkcmVzcylcbiAgICAgICAgLnRva2VuQ29udHJhY3RBZGRyZXNzKHRva2VuQ29udHJhY3RBZGRyZXNzKVxuICAgICAgICAuZW5jcnlwdGVkSGFuZGxlKGVuY3J5cHRlZEhhbmRsZSlcbiAgICAgICAgLmlucHV0UHJvb2YoaW5wdXRQcm9vZilcbiAgICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZChzZXF1ZW5jZUlkKVxuICAgICAgICAuZXhwaXJhdGlvblRpbWUoZXhwaXJlVGltZSlcbiAgICAgICAgLmtleShrZXkpO1xuXG4gICAgICBjb25zdCBjYWxsZGF0YSA9IGJ1aWxkZXIuc2lnbkFuZEJ1aWxkKGAke2NvaW4uY2hhaW5JZH1gKTtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVDb25maWRlbnRpYWxUcmFuc2ZlckRhdGEoY2FsbGRhdGEpO1xuXG4gICAgICBzaG91bGQoZGVjb2RlZC50b0FkZHJlc3MudG9Mb3dlckNhc2UoKSkuZXF1YWwocmVjaXBpZW50QWRkcmVzcy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIHNob3VsZChkZWNvZGVkLnRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkpLmVxdWFsKHRva2VuQ29udHJhY3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgc2hvdWxkKGRlY29kZWQuZW5jcnlwdGVkSGFuZGxlLnRvTG93ZXJDYXNlKCkpLmVxdWFsKGVuY3J5cHRlZEhhbmRsZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIHNob3VsZChkZWNvZGVkLmlucHV0UHJvb2YudG9Mb3dlckNhc2UoKSkuZXF1YWwoaW5wdXRQcm9vZi50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIHNob3VsZChkZWNvZGVkLmV4cGlyZVRpbWUpLmVxdWFsKGV4cGlyZVRpbWUudG9TdHJpbmcoKSk7XG4gICAgICBzaG91bGQoZGVjb2RlZC5zZXF1ZW5jZUlkKS5lcXVhbChzZXF1ZW5jZUlkLnRvU3RyaW5nKCkpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gNi4gY2xhc3NpZnlUcmFuc2FjdGlvbigpIHRlc3RcbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZGVzY3JpYmUoJ2NsYXNzaWZ5VHJhbnNhY3Rpb24oKScsICgpID0+IHtcbiAgICBpdCgnaWRlbnRpZmllcyBTZW5kRVJDNzk4NCB0cmFuc2FjdGlvbnMgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXJFUkM3OTg0KCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5mcm9tKHNlbmRlckFkZHJlc3MpXG4gICAgICAgIC50byhyZWNpcGllbnRBZGRyZXNzKVxuICAgICAgICAudG9rZW5Db250cmFjdEFkZHJlc3ModG9rZW5Db250cmFjdEFkZHJlc3MpXG4gICAgICAgIC5lbmNyeXB0ZWRIYW5kbGUoZW5jcnlwdGVkSGFuZGxlKVxuICAgICAgICAuaW5wdXRQcm9vZihpbnB1dFByb29mKVxuICAgICAgICAuY29udHJhY3RTZXF1ZW5jZUlkKHNlcXVlbmNlSWQpXG4gICAgICAgIC5leHBpcmF0aW9uVGltZShleHBpcmVUaW1lKVxuICAgICAgICAua2V5KGtleSk7XG5cbiAgICAgIGNvbnN0IGNhbGxkYXRhID0gYnVpbGRlci5zaWduQW5kQnVpbGQoYCR7Y29pbi5jaGFpbklkfWApO1xuICAgICAgY29uc3QgdHhUeXBlID0gY2xhc3NpZnlUcmFuc2FjdGlvbihjYWxsZGF0YSk7XG4gICAgICBzaG91bGQodHhUeXBlKS5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZEVSQzc5ODQpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gNy4gUmVjb25zdHJ1Y3Rpb24gZnJvbSBoZXggKGZyb20oKSByb3VuZC10cmlwKVxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBkZXNjcmliZSgnUmVjb25zdHJ1Y3Rpb24gZnJvbSBoZXgnLCAoKSA9PiB7XG4gICAgaXQoJ3JlYnVpbGRzIFNlbmRFUkM3OTg0IHRyYW5zYWN0aW9uIGZyb20gc2VyaWFsaXplZCBoZXgnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBCdWlsZCBvcmlnaW5hbCB0eFxuICAgICAgY29uc3QgdHhCdWlsZGVyMSA9IGdldEJ1aWxkZXIoJ2h0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgdHhCdWlsZGVyMS5mZWUoeyBmZWU6ICcxMDAwMDAwMDAwJywgZ2FzTGltaXQ6ICcxMjEwMDAwMCcgfSk7XG4gICAgICB0eEJ1aWxkZXIxLmNvdW50ZXIoMik7XG4gICAgICB0eEJ1aWxkZXIxLmNvbnRyYWN0KHdhbGxldENvbnRyYWN0QWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIxLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmRFUkM3OTg0KTtcblxuICAgICAgY29uc3QgdHJhbnNmZXJCdWlsZGVyID0gdHhCdWlsZGVyMS50cmFuc2ZlcigpIGFzIFRyYW5zZmVyQnVpbGRlckVSQzc5ODQ7XG4gICAgICB0cmFuc2ZlckJ1aWxkZXJcbiAgICAgICAgLmZyb20oc2VuZGVyQWRkcmVzcylcbiAgICAgICAgLnRvKHJlY2lwaWVudEFkZHJlc3MpXG4gICAgICAgIC50b2tlbkNvbnRyYWN0QWRkcmVzcyh0b2tlbkNvbnRyYWN0QWRkcmVzcylcbiAgICAgICAgLmVuY3J5cHRlZEhhbmRsZShlbmNyeXB0ZWRIYW5kbGUpXG4gICAgICAgIC5pbnB1dFByb29mKGlucHV0UHJvb2YpXG4gICAgICAgIC5jb250cmFjdFNlcXVlbmNlSWQoc2VxdWVuY2VJZClcbiAgICAgICAgLmV4cGlyYXRpb25UaW1lKGV4cGlyZVRpbWUpXG4gICAgICAgIC5rZXkoa2V5KTtcblxuICAgICAgdHhCdWlsZGVyMS5zaWduKHsga2V5OiB0ZXN0RGF0YS5QUklWQVRFX0tFWSB9KTtcbiAgICAgIGNvbnN0IHR4MSA9IGF3YWl0IHR4QnVpbGRlcjEuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd0hleCA9IHR4MS50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBSZWNvbnN0cnVjdCBmcm9tIGhleFxuICAgICAgY29uc3QgdHhCdWlsZGVyMiA9IGdldEJ1aWxkZXIoJ2h0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgdHhCdWlsZGVyMi5mcm9tKHJhd0hleCk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24yID0gdHgyLnRvSnNvbigpO1xuXG4gICAgICBzaG91bGQodHhKc29uMi50by50b0xvd2VyQ2FzZSgpKS5lcXVhbCh3YWxsZXRDb250cmFjdEFkZHJlc3MudG9Mb3dlckNhc2UoKSk7XG4gICAgICBzaG91bGQodHhKc29uMi5kYXRhLnNsaWNlKDAsIDEwKS50b0xvd2VyQ2FzZSgpKS5lcXVhbCgnMHgzOTEyNTIxNScpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIHR5cGUgd2FzIGNvcnJlY3RseSBpZGVudGlmaWVkXG4gICAgICBzaG91bGQodHhCdWlsZGVyMlsnX3R5cGUnXSkuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLlNlbmRFUkM3OTg0KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWNvbnN0cnVjdGVkIF90cmFuc2ZlciBpcyBhbiBpbnN0YW5jZSBvZiBUcmFuc2ZlckJ1aWxkZXJFUkM3OTg0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyMSA9IGdldEJ1aWxkZXIoJ2h0ZXRoJykgYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICAgICAgdHhCdWlsZGVyMS5mZWUoeyBmZWU6ICcxMDAwMDAwMDAwJywgZ2FzTGltaXQ6ICcxMjEwMDAwMCcgfSk7XG4gICAgICB0eEJ1aWxkZXIxLmNvdW50ZXIoMik7XG4gICAgICB0eEJ1aWxkZXIxLmNvbnRyYWN0KHdhbGxldENvbnRyYWN0QWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIxLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmRFUkM3OTg0KTtcblxuICAgICAgY29uc3QgdHJhbnNmZXJCdWlsZGVyID0gdHhCdWlsZGVyMS50cmFuc2ZlcigpIGFzIFRyYW5zZmVyQnVpbGRlckVSQzc5ODQ7XG4gICAgICB0cmFuc2ZlckJ1aWxkZXJcbiAgICAgICAgLmZyb20oc2VuZGVyQWRkcmVzcylcbiAgICAgICAgLnRvKHJlY2lwaWVudEFkZHJlc3MpXG4gICAgICAgIC50b2tlbkNvbnRyYWN0QWRkcmVzcyh0b2tlbkNvbnRyYWN0QWRkcmVzcylcbiAgICAgICAgLmVuY3J5cHRlZEhhbmRsZShlbmNyeXB0ZWRIYW5kbGUpXG4gICAgICAgIC5pbnB1dFByb29mKGlucHV0UHJvb2YpXG4gICAgICAgIC5jb250cmFjdFNlcXVlbmNlSWQoc2VxdWVuY2VJZClcbiAgICAgICAgLmV4cGlyYXRpb25UaW1lKGV4cGlyZVRpbWUpXG4gICAgICAgIC5rZXkoa2V5KTtcblxuICAgICAgdHhCdWlsZGVyMS5zaWduKHsga2V5OiB0ZXN0RGF0YS5QUklWQVRFX0tFWSB9KTtcbiAgICAgIGNvbnN0IHR4MSA9IGF3YWl0IHR4QnVpbGRlcjEuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd0hleCA9IHR4MS50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gZ2V0QnVpbGRlcignaHRldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgICB0eEJ1aWxkZXIyLmZyb20ocmF3SGV4KTtcblxuICAgICAgc2hvdWxkKHR4QnVpbGRlcjJbJ190cmFuc2ZlciddKS5iZS5pbnN0YW5jZW9mKFRyYW5zZmVyQnVpbGRlckVSQzc5ODQpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gOC4gRXJyb3IgLyBlZGdlIGNhc2UgdGVzdHNcbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZGVzY3JpYmUoJ0Vycm9yIGFuZCBlZGdlIGNhc2VzJywgKCkgPT4ge1xuICAgIGl0KCd0cmFuc2ZlcigpIHJldHVybnMgVHJhbnNmZXJCdWlsZGVyRVJDNzk4NCBhZnRlciBzZXR0aW5nIHR5cGUgdG8gU2VuZEVSQzc5ODQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBnZXRCdWlsZGVyKCdodGV0aCcpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICAgIHR4QnVpbGRlci5mZWUoeyBmZWU6ICcxMDAwMDAwMDAwJywgZ2FzTGltaXQ6ICcxMjEwMDAwMCcgfSk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcigyKTtcbiAgICAgIHR4QnVpbGRlci5jb250cmFjdCh3YWxsZXRDb250cmFjdEFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpOyAvLyBuYXRpdmUgc2VuZCB0eXBlLCBub3QgRVJDNzk4NFxuICAgICAgLy8gTmF0aXZlIHRyYW5zZmVyKCkgcmV0dXJucyBhIFRyYW5zZmVyQnVpbGRlciwgbm90IEVSQzc5ODRcbiAgICAgIC8vIEF0dGVtcHRpbmcgdG8gdXNlIHRoZSBuYXRpdmUgdHJhbnNmZXIgZm9yIGEgRVJDNzk4NCB0eCBzaG91bGQgZmFpbCBhdCBidWlsZCB0aW1lXG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZEVSQzc5ODQpO1xuICAgICAgLy8gQWZ0ZXIgc2V0dGluZyB0eXBlIHRvIEVSQzc5ODQsIGNhbGxpbmcgdHJhbnNmZXIoKSBzaG91bGQgcmV0dXJuIFRyYW5zZmVyQnVpbGRlckVSQzc5ODRcbiAgICAgIGNvbnN0IHRiID0gdHhCdWlsZGVyLnRyYW5zZmVyKCk7XG4gICAgICBzaG91bGQodGIpLmJlLmluc3RhbmNlb2YoVHJhbnNmZXJCdWlsZGVyRVJDNzk4NCk7XG4gICAgfSk7XG5cbiAgICBpdCgnemVyby1sZW5ndGggaW5wdXRQcm9vZiB0aHJvd3Mgb24gc2V0dGVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXJFUkM3OTg0KCk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5pbnB1dFByb29mKCcweCcpKS50aHJvdygvaW5wdXRQcm9vZi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2VuY3J5cHRlZEhhbmRsZSB3aXRoIHdyb25nIGxlbmd0aCB0aHJvd3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlckVSQzc5ODQoKTtcbiAgICAgIC8vIDMxIGJ5dGVzIGluc3RlYWQgb2YgMzJcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLmVuY3J5cHRlZEhhbmRsZSgnMHgnICsgJ2FiJy5yZXBlYXQoMzEpKSkudGhyb3coL2VuY3J5cHRlZEhhbmRsZS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RlY29kZUNvbmZpZGVudGlhbFRyYW5zZmVyRGF0YSB0aHJvd3Mgb24gbm9uLXNlbmRNdWx0aVNpZyBkYXRhJywgKCkgPT4ge1xuICAgICAgc2hvdWxkKCgpID0+IGRlY29kZUNvbmZpZGVudGlhbFRyYW5zZmVyRGF0YSgnMHgxMjM0NTY3OCcpKS50aHJvdygvSW52YWxpZCBjb25maWRlbnRpYWwgdHJhbnNmZXIgYnl0ZWNvZGUvKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|