@bitgo-beta/sdk-coin-iota 1.0.1-beta.324 → 1.0.1-beta.325
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/iota.d.ts +123 -27
- package/dist/src/iota.d.ts.map +1 -1
- package/dist/src/iota.js +217 -103
- package/dist/src/lib/constants.d.ts +50 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +68 -4
- package/dist/src/lib/iface.d.ts +141 -1
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/keyPair.d.ts +100 -6
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +103 -10
- package/dist/src/lib/transaction.d.ts +117 -14
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +190 -67
- package/dist/src/lib/transactionBuilder.d.ts +73 -34
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +90 -45
- package/dist/src/lib/transactionBuilderFactory.d.ts +89 -6
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +103 -16
- package/dist/src/lib/transferBuilder.d.ts +43 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +50 -5
- package/dist/src/lib/transferTransaction.d.ts +93 -2
- package/dist/src/lib/transferTransaction.d.ts.map +1 -1
- package/dist/src/lib/transferTransaction.js +180 -51
- package/dist/src/lib/utils.d.ts +107 -8
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +134 -23
- package/dist/test/unit/helpers/testHelpers.d.ts +57 -0
- package/dist/test/unit/helpers/testHelpers.d.ts.map +1 -0
- package/dist/test/unit/helpers/testHelpers.js +176 -0
- package/dist/test/unit/iota.js +47 -152
- package/dist/test/unit/keyPair.js +34 -61
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +137 -255
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +43 -108
- package/dist/test/unit/transactionBuilder/transferBuilder.js +296 -762
- package/dist/test/unit/transferTransaction.js +106 -353
- package/dist/test/unit/utils.js +171 -197
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -1,306 +1,188 @@
|
|
|
1
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
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
4
|
};
|
|
38
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
6
|
const should_1 = __importDefault(require("should"));
|
|
40
|
-
const statics_1 = require("@bitgo-beta/statics");
|
|
41
|
-
const src_1 = require("../../../src");
|
|
42
|
-
const testData = __importStar(require("../../resources/iota"));
|
|
43
7
|
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
|
+
const testHelpers_1 = require("../helpers/testHelpers");
|
|
44
9
|
describe('Iota Transaction Builder', () => {
|
|
45
|
-
const factory =
|
|
46
|
-
describe('Validation
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
should_1.default.doesNotThrow(() => builder.validateAddress({ address
|
|
51
|
-
should_1.default.doesNotThrow(() => builder.validateAddress({ address: testData.addresses.validAddresses[0] }));
|
|
52
|
-
});
|
|
53
|
-
it('should throw error for invalid address', function () {
|
|
54
|
-
const builder = factory.getTransferBuilder();
|
|
55
|
-
(0, should_1.default)(() => builder.validateAddress({ address: 'invalidAddress' })).throwError('Invalid address invalidAddress');
|
|
56
|
-
});
|
|
57
|
-
it('should throw error for empty address', function () {
|
|
58
|
-
const builder = factory.getTransferBuilder();
|
|
59
|
-
(0, should_1.default)(() => builder.validateAddress({ address: '' })).throwError(/Invalid address/);
|
|
60
|
-
});
|
|
61
|
-
it('should validate addresses with 0x prefix', function () {
|
|
62
|
-
const builder = factory.getTransferBuilder();
|
|
63
|
-
testData.addresses.validAddresses.forEach((address) => {
|
|
64
|
-
should_1.default.doesNotThrow(() => builder.validateAddress({ address }));
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
it('should reject addresses without proper format', function () {
|
|
68
|
-
const builder = factory.getTransferBuilder();
|
|
69
|
-
testData.addresses.invalidAddresses.forEach((address) => {
|
|
70
|
-
(0, should_1.default)(() => builder.validateAddress({ address })).throwError();
|
|
71
|
-
});
|
|
10
|
+
const factory = (0, testHelpers_1.getFactory)();
|
|
11
|
+
describe('Address Validation', () => {
|
|
12
|
+
it('should validate correct addresses', function () {
|
|
13
|
+
const builder = factory.getTransferBuilder();
|
|
14
|
+
testHelpers_1.testData.addresses.validAddresses.forEach((address) => {
|
|
15
|
+
should_1.default.doesNotThrow(() => builder.validateAddress({ address }));
|
|
72
16
|
});
|
|
73
17
|
});
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
should_1.default
|
|
78
|
-
should_1.default.doesNotThrow(() => builder.validateValue(new bignumber_js_1.default(1)));
|
|
79
|
-
should_1.default.doesNotThrow(() => builder.validateValue(new bignumber_js_1.default(999999999)));
|
|
80
|
-
});
|
|
81
|
-
it('should validate zero value', function () {
|
|
82
|
-
const builder = factory.getTransferBuilder();
|
|
83
|
-
should_1.default.doesNotThrow(() => builder.validateValue(new bignumber_js_1.default(0)));
|
|
84
|
-
});
|
|
85
|
-
it('should throw error for negative values', function () {
|
|
86
|
-
const builder = factory.getTransferBuilder();
|
|
87
|
-
(0, should_1.default)(() => builder.validateValue(new bignumber_js_1.default(-1))).throwError('Value cannot be less than zero');
|
|
88
|
-
(0, should_1.default)(() => builder.validateValue(new bignumber_js_1.default(-1000))).throwError('Value cannot be less than zero');
|
|
89
|
-
});
|
|
90
|
-
it('should throw error for NaN values', function () {
|
|
91
|
-
const builder = factory.getTransferBuilder();
|
|
92
|
-
(0, should_1.default)(() => builder.validateValue(new bignumber_js_1.default(NaN))).throwError('Invalid amount format');
|
|
93
|
-
});
|
|
94
|
-
it('should validate large values', function () {
|
|
95
|
-
const builder = factory.getTransferBuilder();
|
|
96
|
-
should_1.default.doesNotThrow(() => builder.validateValue(new bignumber_js_1.default('1000000000000000000')));
|
|
97
|
-
});
|
|
98
|
-
it('should validate decimal values', function () {
|
|
99
|
-
const builder = factory.getTransferBuilder();
|
|
100
|
-
should_1.default.doesNotThrow(() => builder.validateValue(new bignumber_js_1.default(100.5)));
|
|
101
|
-
should_1.default.doesNotThrow(() => builder.validateValue(new bignumber_js_1.default(0.001)));
|
|
18
|
+
it('should reject invalid addresses', function () {
|
|
19
|
+
const builder = factory.getTransferBuilder();
|
|
20
|
+
testHelpers_1.testData.addresses.invalidAddresses.forEach((address) => {
|
|
21
|
+
(0, should_1.default)(() => builder.validateAddress({ address })).throwError();
|
|
102
22
|
});
|
|
103
23
|
});
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
txBuilder.sender(testData.sender.address);
|
|
108
|
-
txBuilder.recipients(testData.recipients);
|
|
109
|
-
txBuilder.paymentObjects(testData.paymentObjects);
|
|
110
|
-
txBuilder.gasData(testData.gasData);
|
|
111
|
-
const tx = await txBuilder.build();
|
|
112
|
-
const rawTx = await tx.toBroadcastFormat();
|
|
113
|
-
const newBuilder = factory.getTransferBuilder();
|
|
114
|
-
should_1.default.doesNotThrow(() => newBuilder.validateRawTransaction(rawTx));
|
|
115
|
-
});
|
|
116
|
-
it('should throw error for invalid raw transaction', function () {
|
|
117
|
-
const builder = factory.getTransferBuilder();
|
|
118
|
-
(0, should_1.default)(() => builder.validateRawTransaction('invalidRawTx')).throwError('Invalid raw transaction');
|
|
119
|
-
});
|
|
120
|
-
it('should throw error for empty raw transaction', function () {
|
|
121
|
-
const builder = factory.getTransferBuilder();
|
|
122
|
-
(0, should_1.default)(() => builder.validateRawTransaction('')).throwError('Invalid raw transaction: Undefined');
|
|
123
|
-
});
|
|
124
|
-
it('should throw error for undefined raw transaction', function () {
|
|
125
|
-
const builder = factory.getTransferBuilder();
|
|
126
|
-
(0, should_1.default)(() => builder.validateRawTransaction(undefined)).throwError('Invalid raw transaction: Undefined');
|
|
127
|
-
});
|
|
24
|
+
it('should throw error for empty address', function () {
|
|
25
|
+
const builder = factory.getTransferBuilder();
|
|
26
|
+
(0, should_1.default)(() => builder.validateAddress({ address: '' })).throwError(/Invalid address/);
|
|
128
27
|
});
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
28
|
+
});
|
|
29
|
+
describe('Value Validation', () => {
|
|
30
|
+
const validCases = [
|
|
31
|
+
{ value: new bignumber_js_1.default(0), description: 'zero value' },
|
|
32
|
+
{ value: new bignumber_js_1.default(1000), description: 'positive values' },
|
|
33
|
+
{ value: new bignumber_js_1.default('1000000000000000000'), description: 'large values' },
|
|
34
|
+
{ value: new bignumber_js_1.default(100.5), description: 'decimal values' },
|
|
35
|
+
];
|
|
36
|
+
validCases.forEach(({ value, description }) => {
|
|
37
|
+
it(`should validate ${description}`, function () {
|
|
38
|
+
const builder = factory.getTransferBuilder();
|
|
39
|
+
should_1.default.doesNotThrow(() => builder.validateValue(value));
|
|
139
40
|
});
|
|
140
|
-
|
|
41
|
+
});
|
|
42
|
+
const invalidCases = [
|
|
43
|
+
{ value: new bignumber_js_1.default(-1), error: 'Value cannot be less than zero', description: 'negative values' },
|
|
44
|
+
{ value: new bignumber_js_1.default(NaN), error: 'Invalid amount format', description: 'NaN values' },
|
|
45
|
+
];
|
|
46
|
+
invalidCases.forEach(({ value, error, description }) => {
|
|
47
|
+
it(`should reject ${description}`, function () {
|
|
141
48
|
const builder = factory.getTransferBuilder();
|
|
142
|
-
(0, should_1.default)(() => builder.
|
|
143
|
-
});
|
|
144
|
-
it('should throw error for transaction with invalid sender', async function () {
|
|
145
|
-
const txBuilder = factory.getTransferBuilder();
|
|
146
|
-
txBuilder.sender(testData.sender.address);
|
|
147
|
-
txBuilder.recipients(testData.recipients);
|
|
148
|
-
txBuilder.paymentObjects(testData.paymentObjects);
|
|
149
|
-
txBuilder.gasData(testData.gasData);
|
|
150
|
-
const tx = (await txBuilder.build());
|
|
151
|
-
tx.sender = 'invalidAddress';
|
|
152
|
-
const newBuilder = factory.getTransferBuilder();
|
|
153
|
-
(0, should_1.default)(() => newBuilder.validateTransaction(tx)).throwError();
|
|
49
|
+
(0, should_1.default)(() => builder.validateValue(value)).throwError(error);
|
|
154
50
|
});
|
|
155
51
|
});
|
|
156
52
|
});
|
|
157
|
-
describe('
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
});
|
|
164
|
-
it('should allow changing sender', function () {
|
|
165
|
-
const builder = factory.getTransferBuilder();
|
|
166
|
-
builder.sender(testData.sender.address);
|
|
167
|
-
builder.sender(testData.gasSponsor.address);
|
|
168
|
-
should_1.default.equal(builder.transaction.sender, testData.gasSponsor.address);
|
|
169
|
-
});
|
|
170
|
-
it('should validate sender address', function () {
|
|
171
|
-
const builder = factory.getTransferBuilder();
|
|
172
|
-
(0, should_1.default)(() => builder.sender('invalidAddress')).throwError('Invalid address invalidAddress');
|
|
173
|
-
});
|
|
53
|
+
describe('Raw Transaction Validation', () => {
|
|
54
|
+
it('should validate proper raw transaction', async function () {
|
|
55
|
+
const tx = await (0, testHelpers_1.createTransferBuilderWithGas)().build();
|
|
56
|
+
const rawTx = await tx.toBroadcastFormat();
|
|
57
|
+
const newBuilder = factory.getTransferBuilder();
|
|
58
|
+
should_1.default.doesNotThrow(() => newBuilder.validateRawTransaction(rawTx));
|
|
174
59
|
});
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
});
|
|
183
|
-
it('should validate gas budget', function () {
|
|
60
|
+
const invalidRawTxCases = [
|
|
61
|
+
{ value: 'invalidRawTx', error: 'Invalid raw transaction', description: 'invalid string' },
|
|
62
|
+
{ value: '', error: 'Invalid raw transaction: Undefined', description: 'empty string' },
|
|
63
|
+
{ value: undefined, error: 'Invalid raw transaction: Undefined', description: 'undefined' },
|
|
64
|
+
];
|
|
65
|
+
invalidRawTxCases.forEach(({ value, error, description }) => {
|
|
66
|
+
it(`should reject ${description}`, function () {
|
|
184
67
|
const builder = factory.getTransferBuilder();
|
|
185
|
-
(0, should_1.default)(() => builder.
|
|
186
|
-
gasBudget: -1000,
|
|
187
|
-
gasPrice: testData.GAS_PRICE,
|
|
188
|
-
gasPaymentObjects: testData.gasPaymentObjects,
|
|
189
|
-
})).throwError();
|
|
68
|
+
(0, should_1.default)(() => builder.validateRawTransaction(value)).throwError(error);
|
|
190
69
|
});
|
|
191
|
-
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('Transaction Validation', () => {
|
|
73
|
+
it('should validate complete transaction', async function () {
|
|
74
|
+
const tx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
|
|
75
|
+
const newBuilder = factory.getTransferBuilder();
|
|
76
|
+
should_1.default.doesNotThrow(() => newBuilder.validateTransaction(tx));
|
|
77
|
+
});
|
|
78
|
+
it('should throw error for undefined transaction', function () {
|
|
79
|
+
const builder = factory.getTransferBuilder();
|
|
80
|
+
(0, should_1.default)(() => builder.validateTransaction(undefined)).throwError(/Transaction is required for validation/);
|
|
81
|
+
});
|
|
82
|
+
it('should throw error for transaction with invalid sender', async function () {
|
|
83
|
+
const tx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
|
|
84
|
+
tx.sender = 'invalidAddress';
|
|
85
|
+
const newBuilder = factory.getTransferBuilder();
|
|
86
|
+
(0, should_1.default)(() => newBuilder.validateTransaction(tx)).throwError();
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe('Builder Setter Methods', () => {
|
|
90
|
+
it('should set and change sender correctly', function () {
|
|
91
|
+
const builder = factory.getTransferBuilder();
|
|
92
|
+
builder.sender(testHelpers_1.testData.sender.address);
|
|
93
|
+
should_1.default.equal(builder.transaction.sender, testHelpers_1.testData.sender.address);
|
|
94
|
+
builder.sender(testHelpers_1.testData.gasSponsor.address);
|
|
95
|
+
should_1.default.equal(builder.transaction.sender, testHelpers_1.testData.gasSponsor.address);
|
|
96
|
+
});
|
|
97
|
+
it('should validate sender address when setting', function () {
|
|
98
|
+
const builder = factory.getTransferBuilder();
|
|
99
|
+
(0, should_1.default)(() => builder.sender('invalidAddress')).throwError('Invalid address invalidAddress');
|
|
100
|
+
});
|
|
101
|
+
it('should set all gas parameters', function () {
|
|
102
|
+
const builder = factory.getTransferBuilder();
|
|
103
|
+
builder.gasData(testHelpers_1.testData.gasData);
|
|
104
|
+
should_1.default.equal(builder.transaction.gasBudget, testHelpers_1.testData.GAS_BUDGET);
|
|
105
|
+
should_1.default.equal(builder.transaction.gasPrice, testHelpers_1.testData.GAS_PRICE);
|
|
106
|
+
should_1.default.deepEqual(builder.transaction.gasPaymentObjects, testHelpers_1.testData.gasPaymentObjects);
|
|
107
|
+
});
|
|
108
|
+
const invalidGasDataCases = [
|
|
109
|
+
{ gasBudget: -1000, description: 'negative gas budget' },
|
|
110
|
+
{ gasPrice: -100, description: 'negative gas price' },
|
|
111
|
+
];
|
|
112
|
+
invalidGasDataCases.forEach(({ gasBudget, gasPrice, description }) => {
|
|
113
|
+
it(`should reject ${description}`, function () {
|
|
192
114
|
const builder = factory.getTransferBuilder();
|
|
193
115
|
(0, should_1.default)(() => builder.gasData({
|
|
194
|
-
gasBudget: testData.GAS_BUDGET,
|
|
195
|
-
gasPrice:
|
|
196
|
-
gasPaymentObjects: testData.gasPaymentObjects,
|
|
116
|
+
gasBudget: gasBudget ?? testHelpers_1.testData.GAS_BUDGET,
|
|
117
|
+
gasPrice: gasPrice ?? testHelpers_1.testData.GAS_PRICE,
|
|
118
|
+
gasPaymentObjects: testHelpers_1.testData.gasPaymentObjects,
|
|
197
119
|
})).throwError();
|
|
198
120
|
});
|
|
199
|
-
it('should throw error for empty gas payment objects', function () {
|
|
200
|
-
const builder = factory.getTransferBuilder();
|
|
201
|
-
(0, should_1.default)(() => builder.gasData({
|
|
202
|
-
gasBudget: testData.GAS_BUDGET,
|
|
203
|
-
gasPrice: testData.GAS_PRICE,
|
|
204
|
-
gasPaymentObjects: [],
|
|
205
|
-
})).throwError('Gas input objects list is empty');
|
|
206
|
-
});
|
|
207
121
|
});
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
const builder = factory.getTransferBuilder();
|
|
216
|
-
(0, should_1.default)(() => builder.gasSponsor('invalidAddress')).throwError('Invalid address invalidAddress');
|
|
217
|
-
});
|
|
218
|
-
it('should allow sender to be gas sponsor', function () {
|
|
219
|
-
const builder = factory.getTransferBuilder();
|
|
220
|
-
builder.sender(testData.sender.address);
|
|
221
|
-
builder.gasSponsor(testData.sender.address);
|
|
222
|
-
should_1.default.equal(builder.transaction.gasSponsor, testData.sender.address);
|
|
223
|
-
});
|
|
122
|
+
it('should throw error for empty gas payment objects', function () {
|
|
123
|
+
const builder = factory.getTransferBuilder();
|
|
124
|
+
(0, should_1.default)(() => builder.gasData({
|
|
125
|
+
gasBudget: testHelpers_1.testData.GAS_BUDGET,
|
|
126
|
+
gasPrice: testHelpers_1.testData.GAS_PRICE,
|
|
127
|
+
gasPaymentObjects: [],
|
|
128
|
+
})).throwError('Gas input objects list is empty');
|
|
224
129
|
});
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
130
|
+
it('should set gas sponsor correctly', function () {
|
|
131
|
+
const builder = factory.getTransferBuilder();
|
|
132
|
+
builder.gasSponsor(testHelpers_1.testData.gasSponsor.address);
|
|
133
|
+
should_1.default.equal(builder.transaction.gasSponsor, testHelpers_1.testData.gasSponsor.address);
|
|
134
|
+
});
|
|
135
|
+
it('should validate gas sponsor address', function () {
|
|
136
|
+
const builder = factory.getTransferBuilder();
|
|
137
|
+
(0, should_1.default)(() => builder.gasSponsor('invalidAddress')).throwError('Invalid address invalidAddress');
|
|
138
|
+
});
|
|
139
|
+
it('should allow sender to be gas sponsor', function () {
|
|
140
|
+
const builder = factory.getTransferBuilder();
|
|
141
|
+
builder.sender(testHelpers_1.testData.sender.address);
|
|
142
|
+
builder.gasSponsor(testHelpers_1.testData.sender.address);
|
|
143
|
+
should_1.default.equal(builder.transaction.gasSponsor, testHelpers_1.testData.sender.address);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe('Builder Initialization', () => {
|
|
147
|
+
it('should initialize builder from existing transaction', async function () {
|
|
148
|
+
const originalTx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
|
|
149
|
+
const newBuilder = factory.getTransferBuilder(originalTx);
|
|
150
|
+
should_1.default.equal(newBuilder.transaction.sender, originalTx.sender);
|
|
151
|
+
should_1.default.equal(newBuilder.transaction.gasBudget, originalTx.gasBudget);
|
|
237
152
|
});
|
|
238
153
|
});
|
|
239
154
|
describe('Transaction Building', () => {
|
|
240
155
|
it('should build transaction with all required fields', async function () {
|
|
241
|
-
const
|
|
242
|
-
builder.sender(testData.sender.address);
|
|
243
|
-
builder.recipients(testData.recipients);
|
|
244
|
-
builder.paymentObjects(testData.paymentObjects);
|
|
245
|
-
builder.gasData(testData.gasData);
|
|
246
|
-
const tx = (await builder.build());
|
|
156
|
+
const tx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
|
|
247
157
|
should_1.default.exist(tx);
|
|
248
|
-
should_1.default.equal(tx.sender, testData.sender.address);
|
|
158
|
+
should_1.default.equal(tx.sender, testHelpers_1.testData.sender.address);
|
|
159
|
+
should_1.default.equal(tx.isSimulateTx, false);
|
|
249
160
|
});
|
|
250
161
|
it('should build simulation transaction without gas data', async function () {
|
|
251
|
-
const
|
|
252
|
-
builder.sender(testData.sender.address);
|
|
253
|
-
builder.recipients(testData.recipients);
|
|
254
|
-
builder.paymentObjects(testData.paymentObjects);
|
|
255
|
-
const tx = (await builder.build());
|
|
162
|
+
const tx = (await (0, testHelpers_1.createBasicTransferBuilder)().build());
|
|
256
163
|
should_1.default.exist(tx);
|
|
257
164
|
should_1.default.equal(tx.isSimulateTx, true);
|
|
258
165
|
});
|
|
259
|
-
it('should set isSimulateTx to false when gas data provided', async function () {
|
|
260
|
-
const builder = factory.getTransferBuilder();
|
|
261
|
-
builder.sender(testData.sender.address);
|
|
262
|
-
builder.recipients(testData.recipients);
|
|
263
|
-
builder.paymentObjects(testData.paymentObjects);
|
|
264
|
-
builder.gasData(testData.gasData);
|
|
265
|
-
const tx = (await builder.build());
|
|
266
|
-
should_1.default.equal(tx.isSimulateTx, false);
|
|
267
|
-
});
|
|
268
|
-
});
|
|
269
|
-
describe('Builder Chaining', () => {
|
|
270
166
|
it('should support method chaining', async function () {
|
|
271
167
|
const tx = (await factory
|
|
272
168
|
.getTransferBuilder()
|
|
273
|
-
.sender(testData.sender.address)
|
|
274
|
-
.recipients(testData.recipients)
|
|
275
|
-
.paymentObjects(testData.paymentObjects)
|
|
276
|
-
.gasData(testData.gasData)
|
|
169
|
+
.sender(testHelpers_1.testData.sender.address)
|
|
170
|
+
.recipients(testHelpers_1.testData.recipients)
|
|
171
|
+
.paymentObjects(testHelpers_1.testData.paymentObjects)
|
|
172
|
+
.gasData(testHelpers_1.testData.gasData)
|
|
173
|
+
.gasSponsor(testHelpers_1.testData.gasSponsor.address)
|
|
277
174
|
.build());
|
|
278
175
|
should_1.default.exist(tx);
|
|
279
|
-
should_1.default.equal(tx.sender, testData.sender.address);
|
|
280
|
-
|
|
281
|
-
it('should support chaining with gas sponsor', async function () {
|
|
282
|
-
const tx = (await factory
|
|
283
|
-
.getTransferBuilder()
|
|
284
|
-
.sender(testData.sender.address)
|
|
285
|
-
.recipients(testData.recipients)
|
|
286
|
-
.paymentObjects(testData.paymentObjects)
|
|
287
|
-
.gasData(testData.gasData)
|
|
288
|
-
.gasSponsor(testData.gasSponsor.address)
|
|
289
|
-
.build());
|
|
290
|
-
should_1.default.exist(tx);
|
|
291
|
-
should_1.default.equal(tx.gasSponsor, testData.gasSponsor.address);
|
|
176
|
+
should_1.default.equal(tx.sender, testHelpers_1.testData.sender.address);
|
|
177
|
+
should_1.default.equal(tx.gasSponsor, testHelpers_1.testData.gasSponsor.address);
|
|
292
178
|
});
|
|
293
179
|
});
|
|
294
180
|
describe('Transaction Type', () => {
|
|
295
181
|
it('should return correct transaction type', async function () {
|
|
296
|
-
const builder =
|
|
297
|
-
builder.sender(testData.sender.address);
|
|
298
|
-
builder.recipients(testData.recipients);
|
|
299
|
-
builder.paymentObjects(testData.paymentObjects);
|
|
300
|
-
builder.gasData(testData.gasData);
|
|
182
|
+
const builder = (0, testHelpers_1.createTransferBuilderWithGas)();
|
|
301
183
|
const tx = await builder.build();
|
|
302
184
|
should_1.default.equal(builder.transactionType, tx.type);
|
|
303
185
|
});
|
|
304
186
|
});
|
|
305
187
|
});
|
|
306
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsaURBQTRDO0FBQzVDLHNDQUE4RTtBQUM5RSwrREFBaUQ7QUFDakQsZ0VBQXFDO0FBRXJDLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFbEUsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtRQUNsQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO1lBQy9CLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRTtnQkFDdEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzdDLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEcsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUU7Z0JBQzNDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUM3QyxJQUFB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bEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFRyYW5zZmVyVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2lvdGEnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuXG5kZXNjcmliZSgnSW90YSBUcmFuc2FjdGlvbiBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0aW90YScpKTtcblxuICBkZXNjcmliZSgnVmFsaWRhdGlvbiBNZXRob2RzJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCd2YWxpZGF0ZUFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLnZhbGlkYXRlQWRkcmVzcyh7IGFkZHJlc3M6IHRlc3REYXRhLnNlbmRlci5hZGRyZXNzIH0pKTtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLnZhbGlkYXRlQWRkcmVzcyh7IGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSB9KSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIudmFsaWRhdGVBZGRyZXNzKHsgYWRkcmVzczogJ2ludmFsaWRBZGRyZXNzJyB9KSkudGhyb3dFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBhZGRyZXNzIGludmFsaWRBZGRyZXNzJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGVtcHR5IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzOiAnJyB9KSkudGhyb3dFcnJvcigvSW52YWxpZCBhZGRyZXNzLyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhZGRyZXNzZXMgd2l0aCAweCBwcmVmaXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXMuZm9yRWFjaCgoYWRkcmVzcykgPT4ge1xuICAgICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZWplY3QgYWRkcmVzc2VzIHdpdGhvdXQgcHJvcGVyIGZvcm1hdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHRlc3REYXRhLmFkZHJlc3Nlcy5pbnZhbGlkQWRkcmVzc2VzLmZvckVhY2goKGFkZHJlc3MpID0+IHtcbiAgICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzIH0pKS50aHJvd0Vycm9yKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgndmFsaWRhdGVWYWx1ZScsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgcG9zaXRpdmUgdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcigxMDAwKSkpO1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKDEpKSk7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIoOTk5OTk5OTk5KSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgemVybyB2YWx1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIoMCkpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBuZWdhdGl2ZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIoLTEpKSkudGhyb3dFcnJvcignVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnZhbGlkYXRlVmFsdWUobmV3IEJpZ051bWJlcigtMTAwMCkpKS50aHJvd0Vycm9yKCdWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBOYU4gdmFsdWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKE5hTikpKS50aHJvd0Vycm9yKCdJbnZhbGlkIGFtb3VudCBmb3JtYXQnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGxhcmdlIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52YWxpZGF0ZVZhbHVlKG5ldyBCaWdOdW1iZXIoJzEwMDAwMDAwMDAwMDAwMDAwMDAnKSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgZGVjaW1hbCB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKDEwMC41KSkpO1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudmFsaWRhdGVWYWx1ZShuZXcgQmlnTnVtYmVyKDAuMDAxKSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgndmFsaWRhdGVSYXdUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgcHJvcGVyIHJhdyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCByYXdUeCA9IGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgICAgY29uc3QgbmV3QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gbmV3QnVpbGRlci52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1R4KSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCByYXcgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKCdpbnZhbGlkUmF3VHgnKSkudGhyb3dFcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb24nKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBlbXB0eSByYXcgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKCcnKSkudGhyb3dFcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb246IFVuZGVmaW5lZCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIHVuZGVmaW5lZCByYXcgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHVuZGVmaW5lZCBhcyBhbnkpKS50aHJvd0Vycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbjogVW5kZWZpbmVkJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd2YWxpZGF0ZVRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb21wbGV0ZSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgICBjb25zdCBuZXdCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBuZXdCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24odHgpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciB1bmRlZmluZWQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKHVuZGVmaW5lZCkpLnRocm93RXJyb3IoL1RyYW5zYWN0aW9uIGlzIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uLyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIHNlbmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgICB0eEJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgICAgdHguc2VuZGVyID0gJ2ludmFsaWRBZGRyZXNzJztcblxuICAgICAgICBjb25zdCBuZXdCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IG5ld0J1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbih0eCkpLnRocm93RXJyb3IoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQnVpbGRlciBNZXRob2RzJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdzZW5kZXInLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHNldCBzZW5kZXIgY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgICBzaG91bGQuZXF1YWwoYnVpbGRlci50cmFuc2FjdGlvbi5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGFsbG93IGNoYW5naW5nIHNlbmRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgYnVpbGRlci5zZW5kZXIodGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGJ1aWxkZXIudHJhbnNhY3Rpb24uc2VuZGVyLCB0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgc2VuZGVyIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5zZW5kZXIoJ2ludmFsaWRBZGRyZXNzJykpLnRocm93RXJyb3IoJ0ludmFsaWQgYWRkcmVzcyBpbnZhbGlkQWRkcmVzcycpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2FzRGF0YScsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgc2V0IGFsbCBnYXMgcGFyYW1ldGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoYnVpbGRlci50cmFuc2FjdGlvbi5nYXNCdWRnZXQsIHRlc3REYXRhLkdBU19CVURHRVQpO1xuICAgICAgICBzaG91bGQuZXF1YWwoYnVpbGRlci50cmFuc2FjdGlvbi5nYXNQcmljZSwgdGVzdERhdGEuR0FTX1BSSUNFKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChidWlsZGVyLnRyYW5zYWN0aW9uLmdhc1BheW1lbnRPYmplY3RzLCB0ZXN0RGF0YS5nYXNQYXltZW50T2JqZWN0cyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBnYXMgYnVkZ2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgYnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICAgIGdhc0J1ZGdldDogLTEwMDAsXG4gICAgICAgICAgICBnYXNQcmljZTogdGVzdERhdGEuR0FTX1BSSUNFLFxuICAgICAgICAgICAgZ2FzUGF5bWVudE9iamVjdHM6IHRlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzLFxuICAgICAgICAgIH0pXG4gICAgICAgICkudGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgZ2FzIHByaWNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgYnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICAgIGdhc0J1ZGdldDogdGVzdERhdGEuR0FTX0JVREdFVCxcbiAgICAgICAgICAgIGdhc1ByaWNlOiAtMTAwLFxuICAgICAgICAgICAgZ2FzUGF5bWVudE9iamVjdHM6IHRlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzLFxuICAgICAgICAgIH0pXG4gICAgICAgICkudGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGVtcHR5IGdhcyBwYXltZW50IG9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgICBidWlsZGVyLmdhc0RhdGEoe1xuICAgICAgICAgICAgZ2FzQnVkZ2V0OiB0ZXN0RGF0YS5HQVNfQlVER0VULFxuICAgICAgICAgICAgZ2FzUHJpY2U6IHRlc3REYXRhLkdBU19QUklDRSxcbiAgICAgICAgICAgIGdhc1BheW1lbnRPYmplY3RzOiBbXSxcbiAgICAgICAgICB9KVxuICAgICAgICApLnRocm93RXJyb3IoJ0dhcyBpbnB1dCBvYmplY3RzIGxpc3QgaXMgZW1wdHknKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2dhc1Nwb25zb3InLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIHNldCBnYXMgc3BvbnNvciBjb3JyZWN0bHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLmdhc1Nwb25zb3IodGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGJ1aWxkZXIudHJhbnNhY3Rpb24uZ2FzU3BvbnNvciwgdGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGdhcyBzcG9uc29yIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNTcG9uc29yKCdpbnZhbGlkQWRkcmVzcycpKS50aHJvd0Vycm9yKCdJbnZhbGlkIGFkZHJlc3MgaW52YWxpZEFkZHJlc3MnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGFsbG93IHNlbmRlciB0byBiZSBnYXMgc3BvbnNvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgYnVpbGRlci5nYXNTcG9uc29yKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGJ1aWxkZXIudHJhbnNhY3Rpb24uZ2FzU3BvbnNvciwgdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnaW5pdEJ1aWxkZXInLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgYnVpbGRlciBmcm9tIGV4aXN0aW5nIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvcmlnaW5hbEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBvcmlnaW5hbEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgICAgb3JpZ2luYWxCdWlsZGVyLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICAgIG9yaWdpbmFsQnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICAgIG9yaWdpbmFsQnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVHggPSAoYXdhaXQgb3JpZ2luYWxCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgICAgY29uc3QgbmV3QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKG9yaWdpbmFsVHgpO1xuICAgICAgICBzaG91bGQuZXF1YWwoKG5ld0J1aWxkZXIudHJhbnNhY3Rpb24gYXMgVHJhbnNmZXJUcmFuc2FjdGlvbikuc2VuZGVyLCBvcmlnaW5hbFR4LnNlbmRlcik7XG4gICAgICAgIHNob3VsZC5lcXVhbCgobmV3QnVpbGRlci50cmFuc2FjdGlvbiBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uKS5nYXNCdWRnZXQsIG9yaWdpbmFsVHguZ2FzQnVkZ2V0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gQnVpbGRpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCB0cmFuc2FjdGlvbiB3aXRoIGFsbCByZXF1aXJlZCBmaWVsZHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIGJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgYnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXhpc3QodHgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBzaW11bGF0aW9uIHRyYW5zYWN0aW9uIHdpdGhvdXQgZ2FzIGRhdGEnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIGJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXhpc3QodHgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlzU2ltdWxhdGVUeCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBpc1NpbXVsYXRlVHggdG8gZmFsc2Ugd2hlbiBnYXMgZGF0YSBwcm92aWRlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgYnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgYnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICBidWlsZGVyLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0J1aWxkZXIgQ2hhaW5pbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzdXBwb3J0IG1ldGhvZCBjaGFpbmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpXG4gICAgICAgIC5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpXG4gICAgICAgIC5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cylcbiAgICAgICAgLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSlcbiAgICAgICAgLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5leGlzdCh0eCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgY2hhaW5pbmcgd2l0aCBnYXMgc3BvbnNvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpXG4gICAgICAgIC5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpXG4gICAgICAgIC5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cylcbiAgICAgICAgLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSlcbiAgICAgICAgLmdhc1Nwb25zb3IodGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKVxuICAgICAgICAuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmV4aXN0KHR4KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5nYXNTcG9uc29yLCB0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gVHlwZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IHRyYW5zYWN0aW9uIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIGJ1aWxkZXIucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpO1xuICAgICAgYnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChidWlsZGVyLnRyYW5zYWN0aW9uVHlwZSwgdHgudHlwZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsZ0VBQXFDO0FBQ3JDLHdEQUF3SDtBQUV4SCxRQUFRLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUEsd0JBQVUsR0FBRSxDQUFDO0lBRTdCLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7UUFDbEMsRUFBRSxDQUFDLG1DQUFtQyxFQUFFO1lBQ3RDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzdDLHNCQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDcEQsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlDQUFpQyxFQUFFO1lBQ3BDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzdDLHNCQUFRLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUN0RCxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFD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Q0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLHNCQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsc0JBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUU7UUFDaEMsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEtBQUs7WUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBQSwwQ0FBNEIsR0FBRSxDQUFDO1lBQy9DLE1BQU0sRUFBRSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zZmVyVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlQmFzaWNUcmFuc2ZlckJ1aWxkZXIsIGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMsIGdldEZhY3RvcnksIHRlc3REYXRhIH0gZnJvbSAnLi4vaGVscGVycy90ZXN0SGVscGVycyc7XG5cbmRlc2NyaWJlKCdJb3RhIFRyYW5zYWN0aW9uIEJ1aWxkZXInLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7XG5cbiAgZGVzY3JpYmUoJ0FkZHJlc3MgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXMuZm9yRWFjaCgoYWRkcmVzcykgPT4ge1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIudmFsaWRhdGVBZGRyZXNzKHsgYWRkcmVzcyB9KSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0ZXN0RGF0YS5hZGRyZXNzZXMuaW52YWxpZEFkZHJlc3Nlcy5mb3JFYWNoKChhZGRyZXNzKSA9PiB7XG4gICAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnZhbGlkYXRlQWRkcmVzcyh7IGFkZHJlc3MgfSkpLnRocm93RXJyb3IoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgZW1wdHkgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIudmFsaWRhdGVBZGRyZXNzKHsgYWRkcmVzczogJycgfSkpLnRocm93RXJyb3IoL0ludmFsaWQgYWRkcmVzcy8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmFsdWUgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBjb25zdCB2YWxpZENhc2VzID0gW1xuICAgICAgeyB2YWx1ZTogbmV3IEJpZ051bWJlcigwKSwgZGVzY3JpcHRpb246ICd6ZXJvIHZhbHVlJyB9LFxuICAgICAgeyB2YWx1ZTogbmV3IEJpZ051bWJlcigxMDAwKSwgZGVzY3JpcHRpb246ICdwb3NpdGl2ZSB2YWx1ZXMnIH0sXG4gICAgICB7IHZhbHVlOiBuZXcgQmlnTnVtYmVyKCcxMDAwMDAwMDAwMDAwMDAwMDAwJyksIGRlc2NyaXB0aW9uOiAnbGFyZ2UgdmFsdWVzJyB9LFxuICAgICAgeyB2YWx1ZTogbmV3IEJpZ051bWJlcigxMDAuNSksIGRlc2NyaXB0aW9uOiAnZGVjaW1hbCB2YWx1ZXMnIH0sXG4gICAgXTtcblxuICAgIHZhbGlkQ2FzZXMuZm9yRWFjaCgoeyB2YWx1ZSwgZGVzY3JpcHRpb24gfSkgPT4ge1xuICAgICAgaXQoYHNob3VsZCB2YWxpZGF0ZSAke2Rlc2NyaXB0aW9ufWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYnVpbGRlci52YWxpZGF0ZVZhbHVlKHZhbHVlKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGludmFsaWRDYXNlcyA9IFtcbiAgICAgIHsgdmFsdWU6IG5ldyBCaWdOdW1iZXIoLTEpLCBlcnJvcjogJ1ZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybycsIGRlc2NyaXB0aW9uOiAnbmVnYXRpdmUgdmFsdWVzJyB9LFxuICAgICAgeyB2YWx1ZTogbmV3IEJpZ051bWJlcihOYU4pLCBlcnJvcjogJ0ludmFsaWQgYW1vdW50IGZvcm1hdCcsIGRlc2NyaXB0aW9uOiAnTmFOIHZhbHVlcycgfSxcbiAgICBdO1xuXG4gICAgaW52YWxpZENhc2VzLmZvckVhY2goKHsgdmFsdWUsIGVycm9yLCBkZXNjcmlwdGlvbiB9KSA9PiB7XG4gICAgICBpdChgc2hvdWxkIHJlamVjdCAke2Rlc2NyaXB0aW9ufWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnZhbGlkYXRlVmFsdWUodmFsdWUpKS50aHJvd0Vycm9yKGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmF3IFRyYW5zYWN0aW9uIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBwcm9wZXIgcmF3IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCkuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gYXdhaXQgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3QgbmV3QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IG5ld0J1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUeCkpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaW52YWxpZFJhd1R4Q2FzZXMgPSBbXG4gICAgICB7IHZhbHVlOiAnaW52YWxpZFJhd1R4JywgZXJyb3I6ICdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicsIGRlc2NyaXB0aW9uOiAnaW52YWxpZCBzdHJpbmcnIH0sXG4gICAgICB7IHZhbHVlOiAnJywgZXJyb3I6ICdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbjogVW5kZWZpbmVkJywgZGVzY3JpcHRpb246ICdlbXB0eSBzdHJpbmcnIH0sXG4gICAgICB7IHZhbHVlOiB1bmRlZmluZWQgYXMgYW55LCBlcnJvcjogJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uOiBVbmRlZmluZWQnLCBkZXNjcmlwdGlvbjogJ3VuZGVmaW5lZCcgfSxcbiAgICBdO1xuXG4gICAgaW52YWxpZFJhd1R4Q2FzZXMuZm9yRWFjaCgoeyB2YWx1ZSwgZXJyb3IsIGRlc2NyaXB0aW9uIH0pID0+IHtcbiAgICAgIGl0KGBzaG91bGQgcmVqZWN0ICR7ZGVzY3JpcHRpb259YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbih2YWx1ZSkpLnRocm93RXJyb3IoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29tcGxldGUgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCkuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IG5ld0J1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBuZXdCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24odHgpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIHVuZGVmaW5lZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IGJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbih1bmRlZmluZWQpKS50aHJvd0Vycm9yKC9UcmFuc2FjdGlvbiBpcyByZXF1aXJlZCBmb3IgdmFsaWRhdGlvbi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIHNlbmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgdHguc2VuZGVyID0gJ2ludmFsaWRBZGRyZXNzJztcblxuICAgICAgY29uc3QgbmV3QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gbmV3QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKHR4KSkudGhyb3dFcnJvcigpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQnVpbGRlciBTZXR0ZXIgTWV0aG9kcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNldCBhbmQgY2hhbmdlIHNlbmRlciBjb3JyZWN0bHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbChidWlsZGVyLnRyYW5zYWN0aW9uLnNlbmRlciwgdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuXG4gICAgICBidWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKGJ1aWxkZXIudHJhbnNhY3Rpb24uc2VuZGVyLCB0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBzZW5kZXIgYWRkcmVzcyB3aGVuIHNldHRpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnNlbmRlcignaW52YWxpZEFkZHJlc3MnKSkudGhyb3dFcnJvcignSW52YWxpZCBhZGRyZXNzIGludmFsaWRBZGRyZXNzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBhbGwgZ2FzIHBhcmFtZXRlcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKGJ1aWxkZXIudHJhbnNhY3Rpb24uZ2FzQnVkZ2V0LCB0ZXN0RGF0YS5HQVNfQlVER0VUKTtcbiAgICAgIHNob3VsZC5lcXVhbChidWlsZGVyLnRyYW5zYWN0aW9uLmdhc1ByaWNlLCB0ZXN0RGF0YS5HQVNfUFJJQ0UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChidWlsZGVyLnRyYW5zYWN0aW9uLmdhc1BheW1lbnRPYmplY3RzLCB0ZXN0RGF0YS5nYXNQYXltZW50T2JqZWN0cyk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnZhbGlkR2FzRGF0YUNhc2VzID0gW1xuICAgICAgeyBnYXNCdWRnZXQ6IC0xMDAwLCBkZXNjcmlwdGlvbjogJ25lZ2F0aXZlIGdhcyBidWRnZXQnIH0sXG4gICAgICB7IGdhc1ByaWNlOiAtMTAwLCBkZXNjcmlwdGlvbjogJ25lZ2F0aXZlIGdhcyBwcmljZScgfSxcbiAgICBdO1xuXG4gICAgaW52YWxpZEdhc0RhdGFDYXNlcy5mb3JFYWNoKCh7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGRlc2NyaXB0aW9uIH0pID0+IHtcbiAgICAgIGl0KGBzaG91bGQgcmVqZWN0ICR7ZGVzY3JpcHRpb259YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgYnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICAgIGdhc0J1ZGdldDogZ2FzQnVkZ2V0ID8/IHRlc3REYXRhLkdBU19CVURHRVQsXG4gICAgICAgICAgICBnYXNQcmljZTogZ2FzUHJpY2UgPz8gdGVzdERhdGEuR0FTX1BSSUNFLFxuICAgICAgICAgICAgZ2FzUGF5bWVudE9iamVjdHM6IHRlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzLFxuICAgICAgICAgIH0pXG4gICAgICAgICkudGhyb3dFcnJvcigpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBlbXB0eSBnYXMgcGF5bWVudCBvYmplY3RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgYnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICBnYXNCdWRnZXQ6IHRlc3REYXRhLkdBU19CVURHRVQsXG4gICAgICAgICAgZ2FzUHJpY2U6IHRlc3REYXRhLkdBU19QUklDRSxcbiAgICAgICAgICBnYXNQYXltZW50T2JqZWN0czogW10sXG4gICAgICAgIH0pXG4gICAgICApLnRocm93RXJyb3IoJ0dhcyBpbnB1dCBvYmplY3RzIGxpc3QgaXMgZW1wdHknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGdhcyBzcG9uc29yIGNvcnJlY3RseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5nYXNTcG9uc29yKHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwoYnVpbGRlci50cmFuc2FjdGlvbi5nYXNTcG9uc29yLCB0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBnYXMgc3BvbnNvciBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNTcG9uc29yKCdpbnZhbGlkQWRkcmVzcycpKS50aHJvd0Vycm9yKCdJbnZhbGlkIGFkZHJlc3MgaW52YWxpZEFkZHJlc3MnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgc2VuZGVyIHRvIGJlIGdhcyBzcG9uc29yJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBidWlsZGVyLmdhc1Nwb25zb3IodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKGJ1aWxkZXIudHJhbnNhY3Rpb24uZ2FzU3BvbnNvciwgdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQnVpbGRlciBJbml0aWFsaXphdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgYnVpbGRlciBmcm9tIGV4aXN0aW5nIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxUeCA9IChhd2FpdCBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCkuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IG5ld0J1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcihvcmlnaW5hbFR4KTtcblxuICAgICAgc2hvdWxkLmVxdWFsKChuZXdCdWlsZGVyLnRyYW5zYWN0aW9uIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb24pLnNlbmRlciwgb3JpZ2luYWxUeC5zZW5kZXIpO1xuICAgICAgc2hvdWxkLmVxdWFsKChuZXdCdWlsZGVyLnRyYW5zYWN0aW9uIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb24pLmdhc0J1ZGdldCwgb3JpZ2luYWxUeC5nYXNCdWRnZXQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gQnVpbGRpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCB0cmFuc2FjdGlvbiB3aXRoIGFsbCByZXF1aXJlZCBmaWVsZHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCkuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmV4aXN0KHR4KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgc2ltdWxhdGlvbiB0cmFuc2FjdGlvbiB3aXRob3V0IGdhcyBkYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgY3JlYXRlQmFzaWNUcmFuc2ZlckJ1aWxkZXIoKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlzU2ltdWxhdGVUeCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgbWV0aG9kIGNoYWluaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcylcbiAgICAgICAgLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cylcbiAgICAgICAgLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKVxuICAgICAgICAuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKVxuICAgICAgICAuZ2FzU3BvbnNvcih0ZXN0RGF0YS5nYXNTcG9uc29yLmFkZHJlc3MpXG4gICAgICAgIC5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1Nwb25zb3IsIHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBUeXBlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgdHJhbnNhY3Rpb24gdHlwZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChidWlsZGVyLnRyYW5zYWN0aW9uVHlwZSwgdHgudHlwZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|