@bitgo/sdk-coin-canton 1.20.0 → 1.22.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/canton.d.ts +6 -1
- package/dist/src/canton.d.ts.map +1 -1
- package/dist/src/canton.js +102 -1
- package/dist/src/lib/allocationAllocateBuilder.d.ts +126 -0
- package/dist/src/lib/allocationAllocateBuilder.d.ts.map +1 -0
- package/dist/src/lib/allocationAllocateBuilder.js +250 -0
- package/dist/src/lib/allocationRequestBuilder.d.ts +116 -0
- package/dist/src/lib/allocationRequestBuilder.d.ts.map +1 -0
- package/dist/src/lib/allocationRequestBuilder.js +246 -0
- package/dist/src/lib/cantonCommandBuilder.d.ts +63 -0
- package/dist/src/lib/cantonCommandBuilder.d.ts.map +1 -0
- package/dist/src/lib/cantonCommandBuilder.js +155 -0
- package/dist/src/lib/iface.d.ts +68 -1
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +3 -1
- package/dist/src/lib/index.d.ts +3 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +8 -2
- package/dist/src/lib/resourcesInterface.d.ts +1 -1
- package/dist/src/lib/resourcesInterface.d.ts.map +1 -1
- package/dist/src/lib/resourcesInterface.js +1 -1
- package/dist/src/lib/transaction/transaction.d.ts +7 -1
- package/dist/src/lib/transaction/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction/transaction.js +107 -9
- package/dist/src/lib/transactionBuilderFactory.d.ts +6 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +22 -1
- package/dist/src/lib/utils.d.ts +27 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +245 -1
- package/dist/test/resources.d.ts +10 -0
- package/dist/test/resources.d.ts.map +1 -1
- package/dist/test/resources.js +12 -2
- package/dist/test/unit/builder/allocationAllocate/allocationAllocateBuilder.d.ts +2 -0
- package/dist/test/unit/builder/allocationAllocate/allocationAllocateBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/allocationAllocate/allocationAllocateBuilder.js +309 -0
- package/dist/test/unit/builder/allocationRequest/allocationRequestBuilder.d.ts +2 -0
- package/dist/test/unit/builder/allocationRequest/allocationRequestBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/allocationRequest/allocationRequestBuilder.js +386 -0
- package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.d.ts +2 -0
- package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.js +296 -0
- package/dist/test/unit/canton.js +489 -1
- package/dist/test/unit/utils.js +244 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const should_1 = __importDefault(require("should"));
|
|
8
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
9
|
+
const statics_1 = require("@bitgo/statics");
|
|
10
|
+
const cantonCommandBuilder_1 = require("../../../../src/lib/cantonCommandBuilder");
|
|
11
|
+
const transactionBuilderFactory_1 = require("../../../../src/lib/transactionBuilderFactory");
|
|
12
|
+
const transaction_1 = require("../../../../src/lib/transaction/transaction");
|
|
13
|
+
const resources_1 = require("../../../resources");
|
|
14
|
+
const PARTY_A = 'RegRegistrar::1220508e54fb709dcb1a9b4096408ad415d2217d8881ad9034a9850752933ba88ad5';
|
|
15
|
+
const PARTY_B = 'RegProvider::1220508e54fb709dcb1a9b4096408ad415d2217d8881ad9034a9850752933ba88ad5';
|
|
16
|
+
const TEMPLATE_ID = '7a75ef6e69f69395a4e60919e228528bb8f3881150ccfde3f31bcc73864b18ab:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory';
|
|
17
|
+
const CONTRACT_ID = '00f3afdce846a40c6f3f618c4b584b022a0197010057ecd59458200183ab27de0aca1212204aef7ede37a5f41b674a1d95446d42a404461c5558c4e6d1860b65560120ef18';
|
|
18
|
+
const sampleExerciseCommand = {
|
|
19
|
+
ExerciseCommand: {
|
|
20
|
+
templateId: TEMPLATE_ID,
|
|
21
|
+
contractId: CONTRACT_ID,
|
|
22
|
+
choice: 'AllocationFactory_OfferMint',
|
|
23
|
+
choiceArgument: {
|
|
24
|
+
expectedAdmin: PARTY_A,
|
|
25
|
+
mint: { instrumentId: { admin: PARTY_A, id: 'TESTTOKEN' }, amount: '100', holder: PARTY_A, reference: 'test' },
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
const sampleCreateCommand = {
|
|
30
|
+
CreateCommand: {
|
|
31
|
+
templateId: TEMPLATE_ID,
|
|
32
|
+
createArguments: { provider: PARTY_B, registrar: PARTY_A, operator: PARTY_B },
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
describe('CantonCommandBuilder', () => {
|
|
36
|
+
describe('commandId()', () => {
|
|
37
|
+
it('should set the command ID and transaction ID', function () {
|
|
38
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
39
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
40
|
+
builder.initBuilder(tx);
|
|
41
|
+
builder.commandId('test-cmd-id-123');
|
|
42
|
+
assert_1.default.equal(builder['_commandId'], 'test-cmd-id-123');
|
|
43
|
+
assert_1.default.equal(builder['transaction'].id, 'test-cmd-id-123');
|
|
44
|
+
});
|
|
45
|
+
it('should throw on empty string', function () {
|
|
46
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
47
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
48
|
+
builder.initBuilder(tx);
|
|
49
|
+
assert_1.default.throws(() => builder.commandId(''), /commandId must be a non-empty string/);
|
|
50
|
+
});
|
|
51
|
+
it('should throw on whitespace-only string', function () {
|
|
52
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
53
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
54
|
+
builder.initBuilder(tx);
|
|
55
|
+
assert_1.default.throws(() => builder.commandId(' '), /commandId must be a non-empty string/);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe('actAs()', () => {
|
|
59
|
+
it('should set acting parties and update transaction', function () {
|
|
60
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
61
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
62
|
+
builder.initBuilder(tx);
|
|
63
|
+
builder.actAs([PARTY_A]);
|
|
64
|
+
assert_1.default.deepEqual(builder['_actAs'], [PARTY_A]);
|
|
65
|
+
assert_1.default.deepEqual(builder['transaction'].cantonCommandActAsParties, [PARTY_A]);
|
|
66
|
+
});
|
|
67
|
+
it('should throw on empty array', function () {
|
|
68
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
69
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
70
|
+
builder.initBuilder(tx);
|
|
71
|
+
assert_1.default.throws(() => builder.actAs([]), /actAs must be a non-empty array/);
|
|
72
|
+
});
|
|
73
|
+
it('should throw on array with empty strings', function () {
|
|
74
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
75
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
76
|
+
builder.initBuilder(tx);
|
|
77
|
+
assert_1.default.throws(() => builder.actAs(['']), /actAs parties must be non-empty strings/);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('readAs()', () => {
|
|
81
|
+
it('should set read-only parties', function () {
|
|
82
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
83
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
84
|
+
builder.initBuilder(tx);
|
|
85
|
+
builder.readAs([PARTY_B]);
|
|
86
|
+
assert_1.default.deepEqual(builder['_readAs'], [PARTY_B]);
|
|
87
|
+
});
|
|
88
|
+
it('should default to empty array when passed undefined', function () {
|
|
89
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
90
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
91
|
+
builder.initBuilder(tx);
|
|
92
|
+
builder.readAs(undefined);
|
|
93
|
+
assert_1.default.deepEqual(builder['_readAs'], []);
|
|
94
|
+
});
|
|
95
|
+
it('should default to empty array when passed null', function () {
|
|
96
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
97
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
98
|
+
builder.initBuilder(tx);
|
|
99
|
+
builder.readAs(null);
|
|
100
|
+
assert_1.default.deepEqual(builder['_readAs'], []);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe('command()', () => {
|
|
104
|
+
it('should set an ExerciseCommand', function () {
|
|
105
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
106
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
107
|
+
builder.initBuilder(tx);
|
|
108
|
+
builder.command(sampleExerciseCommand);
|
|
109
|
+
assert_1.default.deepEqual(builder['_command'], sampleExerciseCommand);
|
|
110
|
+
});
|
|
111
|
+
it('should set a CreateCommand', function () {
|
|
112
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
113
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
114
|
+
builder.initBuilder(tx);
|
|
115
|
+
builder.command(sampleCreateCommand);
|
|
116
|
+
assert_1.default.deepEqual(builder['_command'], sampleCreateCommand);
|
|
117
|
+
});
|
|
118
|
+
it('should throw on non-object input', function () {
|
|
119
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
120
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
121
|
+
builder.initBuilder(tx);
|
|
122
|
+
assert_1.default.throws(() => builder.command(null), /command must be a plain object/);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe('resolveContracts()', () => {
|
|
126
|
+
it('should set the spec array', function () {
|
|
127
|
+
const spec = [{ templateId: TEMPLATE_ID, actAs: [PARTY_A], injectAs: 'command.ExerciseCommand.contractId' }];
|
|
128
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
129
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
130
|
+
builder.initBuilder(tx);
|
|
131
|
+
builder.resolveContracts(spec);
|
|
132
|
+
assert_1.default.deepEqual(builder['_resolveContracts'], spec);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
describe('toRequestObject()', () => {
|
|
136
|
+
it('should return correct object with all required fields', function () {
|
|
137
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
138
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
139
|
+
builder.initBuilder(tx);
|
|
140
|
+
builder.commandId('cmd-001').actAs([PARTY_A]).readAs([PARTY_B]).command(sampleExerciseCommand);
|
|
141
|
+
const req = builder.toRequestObject();
|
|
142
|
+
should_1.default.exist(req);
|
|
143
|
+
assert_1.default.equal(req.commandId, 'cmd-001');
|
|
144
|
+
assert_1.default.deepEqual(req.actAs, [PARTY_A]);
|
|
145
|
+
assert_1.default.deepEqual(req.readAs, [PARTY_B]);
|
|
146
|
+
assert_1.default.deepEqual(req.command, sampleExerciseCommand);
|
|
147
|
+
});
|
|
148
|
+
it('should throw when commandId is missing', function () {
|
|
149
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
150
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
151
|
+
builder.initBuilder(tx);
|
|
152
|
+
builder.actAs([PARTY_A]).command(sampleExerciseCommand);
|
|
153
|
+
assert_1.default.throws(() => builder.toRequestObject(), /commandId is missing/);
|
|
154
|
+
});
|
|
155
|
+
it('should throw when actAs is missing', function () {
|
|
156
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
157
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
158
|
+
builder.initBuilder(tx);
|
|
159
|
+
builder.commandId('cmd-001').command(sampleExerciseCommand);
|
|
160
|
+
assert_1.default.throws(() => builder.toRequestObject(), /actAs is missing/);
|
|
161
|
+
});
|
|
162
|
+
it('should throw when command is missing', function () {
|
|
163
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
164
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
165
|
+
builder.initBuilder(tx);
|
|
166
|
+
builder.commandId('cmd-001').actAs([PARTY_A]);
|
|
167
|
+
assert_1.default.throws(() => builder.toRequestObject(), /command is missing/);
|
|
168
|
+
});
|
|
169
|
+
it('should throw when command contains invalid key', function () {
|
|
170
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
171
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
172
|
+
builder.initBuilder(tx);
|
|
173
|
+
builder
|
|
174
|
+
.commandId('cmd-001')
|
|
175
|
+
.actAs([PARTY_A])
|
|
176
|
+
.command({ UnknownCommand: {} });
|
|
177
|
+
assert_1.default.throws(() => builder.toRequestObject(), /command must contain exactly one of/);
|
|
178
|
+
});
|
|
179
|
+
it('should include empty resolveContracts by default', function () {
|
|
180
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
181
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
182
|
+
builder.initBuilder(tx);
|
|
183
|
+
builder.commandId('cmd-002').actAs([PARTY_A]).command(sampleCreateCommand);
|
|
184
|
+
const req = builder.toRequestObject();
|
|
185
|
+
assert_1.default.deepEqual(req.resolveContracts, []);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe('initBuilder()', () => {
|
|
189
|
+
it('should correctly initialize from existing transaction with cantonCommandActAsParties', function () {
|
|
190
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
191
|
+
tx.transactionType = sdk_core_1.TransactionType.CantonCommand;
|
|
192
|
+
tx.cantonCommandActAs = [PARTY_A];
|
|
193
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
194
|
+
builder.initBuilder(tx);
|
|
195
|
+
assert_1.default.deepEqual(builder['_actAs'], [PARTY_A]);
|
|
196
|
+
});
|
|
197
|
+
it('should leave _actAs as empty array when transaction has no parties', function () {
|
|
198
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
199
|
+
tx.transactionType = sdk_core_1.TransactionType.CantonCommand;
|
|
200
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
201
|
+
builder.initBuilder(tx);
|
|
202
|
+
assert_1.default.deepEqual(builder['_actAs'], []);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
describe('transactionType', () => {
|
|
206
|
+
it('should return CantonCommand type', function () {
|
|
207
|
+
const builder = new cantonCommandBuilder_1.CantonCommandBuilder(statics_1.coins.get('tcanton'));
|
|
208
|
+
assert_1.default.equal(builder.transactionType, sdk_core_1.TransactionType.CantonCommand);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
describe('TransactionBuilderFactory - CantonCommand', () => {
|
|
213
|
+
it('should return a CantonCommandBuilder from getCantonCommandBuilder()', function () {
|
|
214
|
+
const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tcanton'));
|
|
215
|
+
const builder = factory.getCantonCommandBuilder();
|
|
216
|
+
should_1.default.exist(builder);
|
|
217
|
+
assert_1.default.ok(builder instanceof cantonCommandBuilder_1.CantonCommandBuilder);
|
|
218
|
+
assert_1.default.equal(builder.transactionType, sdk_core_1.TransactionType.CantonCommand);
|
|
219
|
+
});
|
|
220
|
+
it('should return a CantonCommandBuilder from from() with CantonCommand raw transaction', function () {
|
|
221
|
+
const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tcanton'));
|
|
222
|
+
const tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
223
|
+
tx.transactionType = sdk_core_1.TransactionType.CantonCommand;
|
|
224
|
+
tx.id = 'test-cmd-001';
|
|
225
|
+
tx.prepareCommand = resources_1.CantonExerciseCommandPrepareResponse;
|
|
226
|
+
const rawTx = tx.toBroadcastFormat();
|
|
227
|
+
const builder = factory.from(rawTx);
|
|
228
|
+
should_1.default.exist(builder);
|
|
229
|
+
assert_1.default.ok(builder instanceof cantonCommandBuilder_1.CantonCommandBuilder);
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
describe('Transaction toJson and explainTransaction - CantonCommand', () => {
|
|
233
|
+
let tx;
|
|
234
|
+
beforeEach(() => {
|
|
235
|
+
tx = new transaction_1.Transaction(statics_1.coins.get('tcanton'));
|
|
236
|
+
tx.transactionType = sdk_core_1.TransactionType.CantonCommand;
|
|
237
|
+
tx.id = 'test-cmd-001';
|
|
238
|
+
tx.prepareCommand = resources_1.CantonExerciseCommandPrepareResponse;
|
|
239
|
+
tx.cantonCommandActAs = [PARTY_A];
|
|
240
|
+
});
|
|
241
|
+
describe('toJson()', () => {
|
|
242
|
+
it('should return cantonCommand summary for CantonCommand transactions', function () {
|
|
243
|
+
const json = tx.toJson();
|
|
244
|
+
should_1.default.exist(json);
|
|
245
|
+
should_1.default.exist(json.cantonCommand);
|
|
246
|
+
});
|
|
247
|
+
it('should include kind, templateId, and actAs in summary', function () {
|
|
248
|
+
const json = tx.toJson();
|
|
249
|
+
const cc = json.cantonCommand;
|
|
250
|
+
assert_1.default.ok(['ExerciseCommand', 'CreateCommand'].includes(cc.kind));
|
|
251
|
+
assert_1.default.ok(cc.templateId.includes(':'));
|
|
252
|
+
assert_1.default.deepEqual(cc.actAs, [PARTY_A]);
|
|
253
|
+
});
|
|
254
|
+
it('should include choice for ExerciseCommand', function () {
|
|
255
|
+
const json = tx.toJson();
|
|
256
|
+
const cc = json.cantonCommand;
|
|
257
|
+
if (cc.kind === 'ExerciseCommand') {
|
|
258
|
+
should_1.default.exist(cc.choice);
|
|
259
|
+
assert_1.default.equal(cc.choice, 'AllocationFactory_OfferMint');
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
it('should include contractId for ExerciseCommand when present', function () {
|
|
263
|
+
const json = tx.toJson();
|
|
264
|
+
const cc = json.cantonCommand;
|
|
265
|
+
if (cc.kind === 'ExerciseCommand') {
|
|
266
|
+
should_1.default.exist(cc.contractId);
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
describe('explainTransaction()', () => {
|
|
271
|
+
it('should return explanation with cantonCommand field for CantonCommand type', function () {
|
|
272
|
+
const explanation = tx.explainTransaction();
|
|
273
|
+
should_1.default.exist(explanation);
|
|
274
|
+
should_1.default.exist(explanation.cantonCommand);
|
|
275
|
+
});
|
|
276
|
+
it('should have correct structure (id, displayOrder, outputs, inputs, fee, type)', function () {
|
|
277
|
+
const explanation = tx.explainTransaction();
|
|
278
|
+
assert_1.default.ok('id' in explanation);
|
|
279
|
+
assert_1.default.ok('displayOrder' in explanation);
|
|
280
|
+
assert_1.default.ok('outputs' in explanation);
|
|
281
|
+
assert_1.default.ok('inputs' in explanation);
|
|
282
|
+
assert_1.default.ok('fee' in explanation);
|
|
283
|
+
assert_1.default.ok('type' in explanation);
|
|
284
|
+
});
|
|
285
|
+
it('should have correct cantonCommand summary fields', function () {
|
|
286
|
+
const explanation = tx.explainTransaction();
|
|
287
|
+
const cc = explanation.cantonCommand;
|
|
288
|
+
assert_1.default.equal(cc.kind, 'ExerciseCommand');
|
|
289
|
+
assert_1.default.equal(cc.templateId, '7a75ef6e69f69395a4e60919e228528bb8f3881150ccfde3f31bcc73864b18ab:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory');
|
|
290
|
+
assert_1.default.equal(cc.choice, 'AllocationFactory_OfferMint');
|
|
291
|
+
assert_1.default.ok(cc.contractId && cc.contractId.length > 0);
|
|
292
|
+
assert_1.default.deepEqual(cc.actAs, [PARTY_A]);
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudG9uQ29tbWFuZEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYnVpbGRlci9jYW50b25Db21tYW5kL2NhbnRvbkNvbW1hbmRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUU1Qiw4Q0FBOEY7QUFDOUYsNENBQXVDO0FBRXZDLG1GQUFnRjtBQUNoRiw2RkFBMEY7QUFDMUYsNkVBQTBFO0FBRTFFLGtEQUEwRTtBQUUxRSxNQUFNLE9BQU8sR0FBRyxvRkFBb0YsQ0FBQztBQUNyRyxNQUFNLE9BQU8sR0FBRyxtRkFBbUYsQ0FBQztBQUNwRyxNQUFNLFdBQVcsR0FDZixzSUFBc0ksQ0FBQztBQUN6SSxNQUFNLFdBQVcsR0FDZiw0SUFBNEksQ0FBQztBQUUvSSxNQUFNLHFCQUFxQixHQUEwQjtJQUNuRCxlQUFlLEVBQUU7UUFDZixVQUFVLEVBQUUsV0FBVztRQUN2QixVQUFVLEVBQUUsV0FBVztRQUN2QixNQUFNLEVBQUUsNkJBQTZCO1FBQ3JDLGNBQWMsRUFBRTtZQUNkLGFBQWEsRUFBRSxPQUFPO1lBQ3RCLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFO1NBQy9HO0tBQ0Y7Q0FDRixDQUFDO0FBRUYsTUFBTSxtQkFBbUIsR0FBd0I7SUFDL0MsYUFBYSxFQUFFO1FBQ2IsVUFBVSxFQUFFLFdBQVc7UUFDdkIsZUFBZSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7S0FDOUU7Q0FDRixDQUFDO0FBRUYsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtJQUNwQyxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtRQUMzQixFQUFFLENBQUMsOENBQThDLEVBQUU7WUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQ0FBb0IsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNqRCxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUN2RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUU7WUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQ0FBb0IsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNqRCxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsc0NBQXNDLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLDJDQUFvQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEIsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3hGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixFQUFFLENBQUMsa0RBQWtELEVBQUU7WUFDckQsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQ0FBb0IsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNqRCxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLGdCQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDL0MsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLHlCQUF5QixFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNoRixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtZQUNoQyxNQUFNLE9BQU8sR0FBRyxJQUFJLDJDQUFvQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEIsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFO1lBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksMkNBQW9CLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDakQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRTtRQUN4QixFQUFFLENBQUMsOEJBQThCLEVBQUU7WUFDakMsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQ0FBb0IsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNqRCxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzFCLGdCQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUU7WUFDeEQsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQ0FBb0IsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNqRCxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUIsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGdEQUFnRCxFQUFFO1lBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksMkNBQW9CLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDakQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLGdCQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7UUFDekIsRUFBRSxDQUFDLCtCQUErQixFQUFFO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksMkNBQW9CLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDakQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QixPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDdkMsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNEJBQTRCLEVBQUU7WUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQ0FBb0IsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNqRCxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNyQyxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRTtZQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLDJDQUFvQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEIsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUF3QyxDQUFDLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztRQUNuSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtRQUNsQyxFQUFFLENBQUMsMkJBQTJCLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLG9DQUFvQyxFQUFFLENBQUMsQ0FBQztZQUM3RyxNQUFNLE9BQU8sR0FBRyxJQUFJLDJDQUFvQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEIsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLGdCQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO1FBQ2pDLEVBQUUsQ0FBQyx1REFBdUQsRUFBRTtZQUMxRCxNQUFNLE9BQU8sR0FBRyxJQUFJLDJDQUFvQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDL0YsTUFBTSxHQUFHLEdBQXlCLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM1RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZDLGdCQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLGdCQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLGdCQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLDJDQUFvQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDeEQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUU7WUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQ0FBb0IsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNqRCxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDNUQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUU7WUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSwyQ0FBb0IsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNqRCxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM5QyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRTtZQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFJLDJDQUFvQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEIsT0FBTztpQkFDSixTQUFTLENBQUMsU0FBUyxDQUFDO2lCQUNwQixLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDaEIsT0FBTyxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBc0MsQ0FBQyxDQUFDO1lBQ3ZFLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO1lBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksMkNBQW9CLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDakQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QixPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDM0UsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3RDLGdCQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7UUFDN0IsRUFBRSxDQUFDLHNGQUFzRixFQUFFO1lBQ3pGLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDakQsRUFBRSxDQUFDLGVBQWUsR0FBRywwQkFBZSxDQUFDLGFBQWEsQ0FBQztZQUNuRCxFQUFFLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLDJDQUFvQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvRCxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLGdCQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0VBQW9FLEVBQUU7WUFDdkUsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNqRCxFQUFFLENBQUMsZUFBZSxHQUFHLDBCQUFlLENBQUMsYUFBYSxDQUFDO1lBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksMkNBQW9CLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEIsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO1FBQy9CLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRTtZQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLDJDQUFvQixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLDBCQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRTtJQUN6RCxFQUFFLENBQUMscUVBQXFFLEVBQUU7UUFDeEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxxREFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDbEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEIsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxZQUFZLDJDQUFvQixDQUFDLENBQUM7UUFDbkQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSwwQkFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFGQUFxRixFQUFFO1FBQ3hGLE1BQU0sT0FBTyxHQUFHLElBQUkscURBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDakQsRUFBRSxDQUFDLGVBQWUsR0FBRywwQkFBZSxDQUFDLGFBQWEsQ0FBQztRQUNuRCxFQUFFLENBQUMsRUFBRSxHQUFHLGNBQWMsQ0FBQztRQUN2QixFQUFFLENBQUMsY0FBYyxHQUFHLGdEQUFvQyxDQUFDO1FBQ3pELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEIsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxZQUFZLDJDQUFvQixDQUFDLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQywyREFBMkQsRUFBRSxHQUFHLEVBQUU7SUFDekUsSUFBSSxFQUFlLENBQUM7SUFFcEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzNDLEVBQUUsQ0FBQyxlQUFlLEdBQUcsMEJBQWUsQ0FBQyxhQUFhLENBQUM7UUFDbkQsRUFBRSxDQUFDLEVBQUUsR0FBRyxjQUFjLENBQUM7UUFDdkIsRUFBRSxDQUFDLGNBQWMsR0FBRyxnREFBb0MsQ0FBQztRQUN6RCxFQUFFLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO1FBQ3hCLEVBQUUsQ0FBQyxvRUFBb0UsRUFBRTtZQUN2RSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVEQUF1RCxFQUFFO1lBQzFELE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYyxDQUFDO1lBQy9CLGdCQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLGdCQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkMsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUU7WUFDOUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFjLENBQUM7WUFDL0IsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2xDLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDeEIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1lBQ3pELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRTtZQUMvRCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWMsQ0FBQztZQUMvQixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssaUJBQWlCLEVBQUUsQ0FBQztnQkFDbEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtRQUNwQyxFQUFFLENBQUMsMkVBQTJFLEVBQUU7WUFDOUUsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhFQUE4RSxFQUFFO1lBQ2pGLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVDLGdCQUFNLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsQ0FBQztZQUMvQixnQkFBTSxDQUFDLEVBQUUsQ0FBQyxjQUFjLElBQUksV0FBVyxDQUFDLENBQUM7WUFDekMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQyxDQUFDO1lBQ3BDLGdCQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsQ0FBQztZQUNuQyxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksV0FBVyxDQUFDLENBQUM7WUFDaEMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO1lBQ3JELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxhQUFjLENBQUM7WUFDdEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3pDLGdCQUFNLENBQUMsS0FBSyxDQUNWLEVBQUUsQ0FBQyxVQUFVLEVBQ2Isc0lBQXNJLENBQ3ZJLENBQUM7WUFDRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLDZCQUE2QixDQUFDLENBQUM7WUFDdkQsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNyRCxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7IENhbnRvbkNyZWF0ZUNvbW1hbmQsIENhbnRvbkV4ZXJjaXNlQ29tbWFuZCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBDYW50b25Db21tYW5kQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWIvY2FudG9uQ29tbWFuZEJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgQ2FudG9uQ29tbWFuZFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliL2lmYWNlJztcbmltcG9ydCB7IENhbnRvbkV4ZXJjaXNlQ29tbWFuZFByZXBhcmVSZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uL3Jlc291cmNlcyc7XG5cbmNvbnN0IFBBUlRZX0EgPSAnUmVnUmVnaXN0cmFyOjoxMjIwNTA4ZTU0ZmI3MDlkY2IxYTliNDA5NjQwOGFkNDE1ZDIyMTdkODg4MWFkOTAzNGE5ODUwNzUyOTMzYmE4OGFkNSc7XG5jb25zdCBQQVJUWV9CID0gJ1JlZ1Byb3ZpZGVyOjoxMjIwNTA4ZTU0ZmI3MDlkY2IxYTliNDA5NjQwOGFkNDE1ZDIyMTdkODg4MWFkOTAzNGE5ODUwNzUyOTMzYmE4OGFkNSc7XG5jb25zdCBURU1QTEFURV9JRCA9XG4gICc3YTc1ZWY2ZTY5ZjY5Mzk1YTRlNjA5MTllMjI4NTI4YmI4ZjM4ODExNTBjY2ZkZTNmMzFiY2M3Mzg2NGIxOGFiOlV0aWxpdHkuUmVnaXN0cnkuQXBwLlYwLlNlcnZpY2UuQWxsb2NhdGlvbkZhY3Rvcnk6QWxsb2NhdGlvbkZhY3RvcnknO1xuY29uc3QgQ09OVFJBQ1RfSUQgPVxuICAnMDBmM2FmZGNlODQ2YTQwYzZmM2Y2MThjNGI1ODRiMDIyYTAxOTcwMTAwNTdlY2Q1OTQ1ODIwMDE4M2FiMjdkZTBhY2ExMjEyMjA0YWVmN2VkZTM3YTVmNDFiNjc0YTFkOTU0NDZkNDJhNDA0NDYxYzU1NThjNGU2ZDE4NjBiNjU1NjAxMjBlZjE4JztcblxuY29uc3Qgc2FtcGxlRXhlcmNpc2VDb21tYW5kOiBDYW50b25FeGVyY2lzZUNvbW1hbmQgPSB7XG4gIEV4ZXJjaXNlQ29tbWFuZDoge1xuICAgIHRlbXBsYXRlSWQ6IFRFTVBMQVRFX0lELFxuICAgIGNvbnRyYWN0SWQ6IENPTlRSQUNUX0lELFxuICAgIGNob2ljZTogJ0FsbG9jYXRpb25GYWN0b3J5X09mZmVyTWludCcsXG4gICAgY2hvaWNlQXJndW1lbnQ6IHtcbiAgICAgIGV4cGVjdGVkQWRtaW46IFBBUlRZX0EsXG4gICAgICBtaW50OiB7IGluc3RydW1lbnRJZDogeyBhZG1pbjogUEFSVFlfQSwgaWQ6ICdURVNUVE9LRU4nIH0sIGFtb3VudDogJzEwMCcsIGhvbGRlcjogUEFSVFlfQSwgcmVmZXJlbmNlOiAndGVzdCcgfSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgc2FtcGxlQ3JlYXRlQ29tbWFuZDogQ2FudG9uQ3JlYXRlQ29tbWFuZCA9IHtcbiAgQ3JlYXRlQ29tbWFuZDoge1xuICAgIHRlbXBsYXRlSWQ6IFRFTVBMQVRFX0lELFxuICAgIGNyZWF0ZUFyZ3VtZW50czogeyBwcm92aWRlcjogUEFSVFlfQiwgcmVnaXN0cmFyOiBQQVJUWV9BLCBvcGVyYXRvcjogUEFSVFlfQiB9LFxuICB9LFxufTtcblxuZGVzY3JpYmUoJ0NhbnRvbkNvbW1hbmRCdWlsZGVyJywgKCkgPT4ge1xuICBkZXNjcmliZSgnY29tbWFuZElkKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgdGhlIGNvbW1hbmQgSUQgYW5kIHRyYW5zYWN0aW9uIElEJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGJ1aWxkZXIuY29tbWFuZElkKCd0ZXN0LWNtZC1pZC0xMjMnKTtcbiAgICAgIGFzc2VydC5lcXVhbChidWlsZGVyWydfY29tbWFuZElkJ10sICd0ZXN0LWNtZC1pZC0xMjMnKTtcbiAgICAgIGFzc2VydC5lcXVhbChidWlsZGVyWyd0cmFuc2FjdGlvbiddLmlkLCAndGVzdC1jbWQtaWQtMTIzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuY29tbWFuZElkKCcnKSwgL2NvbW1hbmRJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5jb21tYW5kSWQoJyAgICcpLCAvY29tbWFuZElkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY3RBcygpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2V0IGFjdGluZyBwYXJ0aWVzIGFuZCB1cGRhdGUgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgYnVpbGRlci5hY3RBcyhbUEFSVFlfQV0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChidWlsZGVyWydfYWN0QXMnXSwgW1BBUlRZX0FdKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoYnVpbGRlclsndHJhbnNhY3Rpb24nXS5jYW50b25Db21tYW5kQWN0QXNQYXJ0aWVzLCBbUEFSVFlfQV0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBlbXB0eSBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIuYWN0QXMoW10pLCAvYWN0QXMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBhcnJheSB3aXRoIGVtcHR5IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmFjdEFzKFsnJ10pLCAvYWN0QXMgcGFydGllcyBtdXN0IGJlIG5vbi1lbXB0eSBzdHJpbmdzLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWFkQXMoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNldCByZWFkLW9ubHkgcGFydGllcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBidWlsZGVyLnJlYWRBcyhbUEFSVFlfQl0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChidWlsZGVyWydfcmVhZEFzJ10sIFtQQVJUWV9CXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlZmF1bHQgdG8gZW1wdHkgYXJyYXkgd2hlbiBwYXNzZWQgdW5kZWZpbmVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGJ1aWxkZXIucmVhZEFzKHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGJ1aWxkZXJbJ19yZWFkQXMnXSwgW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWZhdWx0IHRvIGVtcHR5IGFycmF5IHdoZW4gcGFzc2VkIG51bGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgYnVpbGRlci5yZWFkQXMobnVsbCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGJ1aWxkZXJbJ19yZWFkQXMnXSwgW10pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29tbWFuZCgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2V0IGFuIEV4ZXJjaXNlQ29tbWFuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBidWlsZGVyLmNvbW1hbmQoc2FtcGxlRXhlcmNpc2VDb21tYW5kKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoYnVpbGRlclsnX2NvbW1hbmQnXSwgc2FtcGxlRXhlcmNpc2VDb21tYW5kKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGEgQ3JlYXRlQ29tbWFuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBidWlsZGVyLmNvbW1hbmQoc2FtcGxlQ3JlYXRlQ29tbWFuZCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGJ1aWxkZXJbJ19jb21tYW5kJ10sIHNhbXBsZUNyZWF0ZUNvbW1hbmQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBub24tb2JqZWN0IGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci5jb21tYW5kKG51bGwgYXMgdW5rbm93biBhcyBDYW50b25FeGVyY2lzZUNvbW1hbmQpLCAvY29tbWFuZCBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0Lyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXNvbHZlQ29udHJhY3RzKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgdGhlIHNwZWMgYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzcGVjID0gW3sgdGVtcGxhdGVJZDogVEVNUExBVEVfSUQsIGFjdEFzOiBbUEFSVFlfQV0sIGluamVjdEFzOiAnY29tbWFuZC5FeGVyY2lzZUNvbW1hbmQuY29udHJhY3RJZCcgfV07XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgYnVpbGRlci5yZXNvbHZlQ29udHJhY3RzKHNwZWMpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChidWlsZGVyWydfcmVzb2x2ZUNvbnRyYWN0cyddLCBzcGVjKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RvUmVxdWVzdE9iamVjdCgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3Qgb2JqZWN0IHdpdGggYWxsIHJlcXVpcmVkIGZpZWxkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBidWlsZGVyLmNvbW1hbmRJZCgnY21kLTAwMScpLmFjdEFzKFtQQVJUWV9BXSkucmVhZEFzKFtQQVJUWV9CXSkuY29tbWFuZChzYW1wbGVFeGVyY2lzZUNvbW1hbmQpO1xuICAgICAgY29uc3QgcmVxOiBDYW50b25Db21tYW5kUmVxdWVzdCA9IGJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCk7XG4gICAgICBzaG91bGQuZXhpc3QocmVxKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXEuY29tbWFuZElkLCAnY21kLTAwMScpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXEuYWN0QXMsIFtQQVJUWV9BXSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlcS5yZWFkQXMsIFtQQVJUWV9CXSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlcS5jb21tYW5kLCBzYW1wbGVFeGVyY2lzZUNvbW1hbmQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGNvbW1hbmRJZCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGJ1aWxkZXIuYWN0QXMoW1BBUlRZX0FdKS5jb21tYW5kKHNhbXBsZUV4ZXJjaXNlQ29tbWFuZCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9jb21tYW5kSWQgaXMgbWlzc2luZy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGFjdEFzIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgYnVpbGRlci5jb21tYW5kSWQoJ2NtZC0wMDEnKS5jb21tYW5kKHNhbXBsZUV4ZXJjaXNlQ29tbWFuZCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9hY3RBcyBpcyBtaXNzaW5nLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gY29tbWFuZCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGJ1aWxkZXIuY29tbWFuZElkKCdjbWQtMDAxJykuYWN0QXMoW1BBUlRZX0FdKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYnVpbGRlci50b1JlcXVlc3RPYmplY3QoKSwgL2NvbW1hbmQgaXMgbWlzc2luZy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGNvbW1hbmQgY29udGFpbnMgaW52YWxpZCBrZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuY29tbWFuZElkKCdjbWQtMDAxJylcbiAgICAgICAgLmFjdEFzKFtQQVJUWV9BXSlcbiAgICAgICAgLmNvbW1hbmQoeyBVbmtub3duQ29tbWFuZDoge30gfSBhcyB1bmtub3duIGFzIENhbnRvbkV4ZXJjaXNlQ29tbWFuZCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9jb21tYW5kIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBvZi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIGVtcHR5IHJlc29sdmVDb250cmFjdHMgYnkgZGVmYXVsdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBidWlsZGVyLmNvbW1hbmRJZCgnY21kLTAwMicpLmFjdEFzKFtQQVJUWV9BXSkuY29tbWFuZChzYW1wbGVDcmVhdGVDb21tYW5kKTtcbiAgICAgIGNvbnN0IHJlcSA9IGJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlcS5yZXNvbHZlQ29udHJhY3RzLCBbXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbml0QnVpbGRlcigpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGluaXRpYWxpemUgZnJvbSBleGlzdGluZyB0cmFuc2FjdGlvbiB3aXRoIGNhbnRvbkNvbW1hbmRBY3RBc1BhcnRpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICB0eC50cmFuc2FjdGlvblR5cGUgPSBUcmFuc2FjdGlvblR5cGUuQ2FudG9uQ29tbWFuZDtcbiAgICAgIHR4LmNhbnRvbkNvbW1hbmRBY3RBcyA9IFtQQVJUWV9BXTtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2FudG9uQ29tbWFuZEJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGJ1aWxkZXJbJ19hY3RBcyddLCBbUEFSVFlfQV0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBsZWF2ZSBfYWN0QXMgYXMgZW1wdHkgYXJyYXkgd2hlbiB0cmFuc2FjdGlvbiBoYXMgbm8gcGFydGllcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIHR4LnRyYW5zYWN0aW9uVHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5DYW50b25Db21tYW5kO1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBDYW50b25Db21tYW5kQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBidWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoYnVpbGRlclsnX2FjdEFzJ10sIFtdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RyYW5zYWN0aW9uVHlwZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBDYW50b25Db21tYW5kIHR5cGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IENhbnRvbkNvbW1hbmRCdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICAgIGFzc2VydC5lcXVhbChidWlsZGVyLnRyYW5zYWN0aW9uVHlwZSwgVHJhbnNhY3Rpb25UeXBlLkNhbnRvbkNvbW1hbmQpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSAtIENhbnRvbkNvbW1hbmQnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcmV0dXJuIGEgQ2FudG9uQ29tbWFuZEJ1aWxkZXIgZnJvbSBnZXRDYW50b25Db21tYW5kQnVpbGRlcigpJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0Q2FudG9uQ29tbWFuZEJ1aWxkZXIoKTtcbiAgICBzaG91bGQuZXhpc3QoYnVpbGRlcik7XG4gICAgYXNzZXJ0Lm9rKGJ1aWxkZXIgaW5zdGFuY2VvZiBDYW50b25Db21tYW5kQnVpbGRlcik7XG4gICAgYXNzZXJ0LmVxdWFsKGJ1aWxkZXIudHJhbnNhY3Rpb25UeXBlLCBUcmFuc2FjdGlvblR5cGUuQ2FudG9uQ29tbWFuZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGEgQ2FudG9uQ29tbWFuZEJ1aWxkZXIgZnJvbSBmcm9tKCkgd2l0aCBDYW50b25Db21tYW5kIHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eC50cmFuc2FjdGlvblR5cGUgPSBUcmFuc2FjdGlvblR5cGUuQ2FudG9uQ29tbWFuZDtcbiAgICB0eC5pZCA9ICd0ZXN0LWNtZC0wMDEnO1xuICAgIHR4LnByZXBhcmVDb21tYW5kID0gQ2FudG9uRXhlcmNpc2VDb21tYW5kUHJlcGFyZVJlc3BvbnNlO1xuICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICBzaG91bGQuZXhpc3QoYnVpbGRlcik7XG4gICAgYXNzZXJ0Lm9rKGJ1aWxkZXIgaW5zdGFuY2VvZiBDYW50b25Db21tYW5kQnVpbGRlcik7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdUcmFuc2FjdGlvbiB0b0pzb24gYW5kIGV4cGxhaW5UcmFuc2FjdGlvbiAtIENhbnRvbkNvbW1hbmQnLCAoKSA9PiB7XG4gIGxldCB0eDogVHJhbnNhY3Rpb247XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4LnRyYW5zYWN0aW9uVHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5DYW50b25Db21tYW5kO1xuICAgIHR4LmlkID0gJ3Rlc3QtY21kLTAwMSc7XG4gICAgdHgucHJlcGFyZUNvbW1hbmQgPSBDYW50b25FeGVyY2lzZUNvbW1hbmRQcmVwYXJlUmVzcG9uc2U7XG4gICAgdHguY2FudG9uQ29tbWFuZEFjdEFzID0gW1BBUlRZX0FdO1xuICB9KTtcblxuICBkZXNjcmliZSgndG9Kc29uKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY2FudG9uQ29tbWFuZCBzdW1tYXJ5IGZvciBDYW50b25Db21tYW5kIHRyYW5zYWN0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5leGlzdChqc29uKTtcbiAgICAgIHNob3VsZC5leGlzdChqc29uLmNhbnRvbkNvbW1hbmQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIGtpbmQsIHRlbXBsYXRlSWQsIGFuZCBhY3RBcyBpbiBzdW1tYXJ5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgY29uc3QgY2MgPSBqc29uLmNhbnRvbkNvbW1hbmQhO1xuICAgICAgYXNzZXJ0Lm9rKFsnRXhlcmNpc2VDb21tYW5kJywgJ0NyZWF0ZUNvbW1hbmQnXS5pbmNsdWRlcyhjYy5raW5kKSk7XG4gICAgICBhc3NlcnQub2soY2MudGVtcGxhdGVJZC5pbmNsdWRlcygnOicpKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoY2MuYWN0QXMsIFtQQVJUWV9BXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluY2x1ZGUgY2hvaWNlIGZvciBFeGVyY2lzZUNvbW1hbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBjb25zdCBjYyA9IGpzb24uY2FudG9uQ29tbWFuZCE7XG4gICAgICBpZiAoY2Mua2luZCA9PT0gJ0V4ZXJjaXNlQ29tbWFuZCcpIHtcbiAgICAgICAgc2hvdWxkLmV4aXN0KGNjLmNob2ljZSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChjYy5jaG9pY2UsICdBbGxvY2F0aW9uRmFjdG9yeV9PZmZlck1pbnQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5jbHVkZSBjb250cmFjdElkIGZvciBFeGVyY2lzZUNvbW1hbmQgd2hlbiBwcmVzZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgY29uc3QgY2MgPSBqc29uLmNhbnRvbkNvbW1hbmQhO1xuICAgICAgaWYgKGNjLmtpbmQgPT09ICdFeGVyY2lzZUNvbW1hbmQnKSB7XG4gICAgICAgIHNob3VsZC5leGlzdChjYy5jb250cmFjdElkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2V4cGxhaW5UcmFuc2FjdGlvbigpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGV4cGxhbmF0aW9uIHdpdGggY2FudG9uQ29tbWFuZCBmaWVsZCBmb3IgQ2FudG9uQ29tbWFuZCB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIHNob3VsZC5leGlzdChleHBsYW5hdGlvbik7XG4gICAgICBzaG91bGQuZXhpc3QoZXhwbGFuYXRpb24uY2FudG9uQ29tbWFuZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCBzdHJ1Y3R1cmUgKGlkLCBkaXNwbGF5T3JkZXIsIG91dHB1dHMsIGlucHV0cywgZmVlLCB0eXBlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBhc3NlcnQub2soJ2lkJyBpbiBleHBsYW5hdGlvbik7XG4gICAgICBhc3NlcnQub2soJ2Rpc3BsYXlPcmRlcicgaW4gZXhwbGFuYXRpb24pO1xuICAgICAgYXNzZXJ0Lm9rKCdvdXRwdXRzJyBpbiBleHBsYW5hdGlvbik7XG4gICAgICBhc3NlcnQub2soJ2lucHV0cycgaW4gZXhwbGFuYXRpb24pO1xuICAgICAgYXNzZXJ0Lm9rKCdmZWUnIGluIGV4cGxhbmF0aW9uKTtcbiAgICAgIGFzc2VydC5vaygndHlwZScgaW4gZXhwbGFuYXRpb24pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGNvcnJlY3QgY2FudG9uQ29tbWFuZCBzdW1tYXJ5IGZpZWxkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBjb25zdCBjYyA9IGV4cGxhbmF0aW9uLmNhbnRvbkNvbW1hbmQhO1xuICAgICAgYXNzZXJ0LmVxdWFsKGNjLmtpbmQsICdFeGVyY2lzZUNvbW1hbmQnKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgY2MudGVtcGxhdGVJZCxcbiAgICAgICAgJzdhNzVlZjZlNjlmNjkzOTVhNGU2MDkxOWUyMjg1MjhiYjhmMzg4MTE1MGNjZmRlM2YzMWJjYzczODY0YjE4YWI6VXRpbGl0eS5SZWdpc3RyeS5BcHAuVjAuU2VydmljZS5BbGxvY2F0aW9uRmFjdG9yeTpBbGxvY2F0aW9uRmFjdG9yeSdcbiAgICAgICk7XG4gICAgICBhc3NlcnQuZXF1YWwoY2MuY2hvaWNlLCAnQWxsb2NhdGlvbkZhY3RvcnlfT2ZmZXJNaW50Jyk7XG4gICAgICBhc3NlcnQub2soY2MuY29udHJhY3RJZCAmJiBjYy5jb250cmFjdElkLmxlbmd0aCA+IDApO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChjYy5hY3RBcywgW1BBUlRZX0FdKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|