@bitgo/sdk-coin-stx 4.0.17 → 4.1.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/lib/constants.d.ts +12 -0
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +24 -2
- package/dist/src/lib/contractBuilder.d.ts.map +1 -1
- package/dist/src/lib/contractBuilder.js +36 -4
- package/dist/src/lib/index.d.ts +1 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +2 -1
- package/dist/src/lib/pox5Builder.d.ts +78 -0
- package/dist/src/lib/pox5Builder.d.ts.map +1 -0
- package/dist/src/lib/pox5Builder.js +148 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +8 -1
- package/dist/src/lib/utils.d.ts +5 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +29 -2
- package/dist/test/unit/transactionBuilder/contractBuilder.js +45 -3
- package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.js +5 -1
- package/dist/test/unit/transactionBuilder/pox5Builder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/pox5Builder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/pox5Builder.js +250 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const transactions_1 = require("@stacks/transactions");
|
|
41
|
+
const statics_1 = require("@bitgo/statics");
|
|
42
|
+
const should_1 = __importDefault(require("should"));
|
|
43
|
+
const src_1 = require("../../../src");
|
|
44
|
+
const testData = __importStar(require("../resources"));
|
|
45
|
+
describe('Stacks: PoX-5 Builder', function () {
|
|
46
|
+
const factory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get('tstx'));
|
|
47
|
+
const signerManager = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0.signer-manager';
|
|
48
|
+
const oldSignerManager = 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0.old-signer-manager';
|
|
49
|
+
function configure(builder) {
|
|
50
|
+
builder.fee({ fee: '180' });
|
|
51
|
+
builder.nonce(0);
|
|
52
|
+
builder.fromPubKey(testData.TX_SENDER.pub);
|
|
53
|
+
builder.numberSignatures(1);
|
|
54
|
+
return builder;
|
|
55
|
+
}
|
|
56
|
+
function validLockupOutput() {
|
|
57
|
+
return {
|
|
58
|
+
height: 9231,
|
|
59
|
+
tx: '00',
|
|
60
|
+
outputIndex: 0,
|
|
61
|
+
header: '00'.repeat(80),
|
|
62
|
+
leafHashes: ['00'.repeat(32)],
|
|
63
|
+
txCount: 1,
|
|
64
|
+
txIndex: 0,
|
|
65
|
+
amount: 10000,
|
|
66
|
+
unlockBurnHeight: 9490,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
it('builds and parses register-for-bond with an L1 lockup', async () => {
|
|
70
|
+
const builder = configure(factory.getPox5Builder());
|
|
71
|
+
builder.registerForBond({
|
|
72
|
+
bondIndex: 210,
|
|
73
|
+
signerManager,
|
|
74
|
+
amountUstx: '1005000',
|
|
75
|
+
lockup: {
|
|
76
|
+
kind: 'btc',
|
|
77
|
+
unlockBytes: '00',
|
|
78
|
+
outputs: [
|
|
79
|
+
{
|
|
80
|
+
height: 9231,
|
|
81
|
+
tx: '00',
|
|
82
|
+
outputIndex: 0,
|
|
83
|
+
header: '00'.repeat(80),
|
|
84
|
+
leafHashes: ['00'.repeat(32)],
|
|
85
|
+
txCount: 1,
|
|
86
|
+
txIndex: 0,
|
|
87
|
+
amount: 10000,
|
|
88
|
+
unlockBurnHeight: 9490,
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
signerCalldata: '00',
|
|
93
|
+
});
|
|
94
|
+
const tx = await builder.build();
|
|
95
|
+
const payload = tx.toJson().payload;
|
|
96
|
+
should_1.default.equal(payload.functionName, 'register-for-bond');
|
|
97
|
+
should_1.default.equal(payload.functionArgs.length, 5);
|
|
98
|
+
should_1.default.equal(payload.functionArgs[0].type, transactions_1.ClarityType.UInt);
|
|
99
|
+
should_1.default.equal(payload.functionArgs[1].type, transactions_1.ClarityType.PrincipalContract);
|
|
100
|
+
should_1.default.equal(payload.functionArgs[3].type, transactions_1.ClarityType.ResponseOk);
|
|
101
|
+
should_1.default.equal(payload.functionArgs[4].type, transactions_1.ClarityType.OptionalSome);
|
|
102
|
+
const rebuiltBuilder = factory.from(tx.toBroadcastFormat());
|
|
103
|
+
rebuiltBuilder.fromPubKey(testData.TX_SENDER.pub);
|
|
104
|
+
const rebuilt = await rebuiltBuilder.build();
|
|
105
|
+
should_1.default.equal(rebuilt.toBroadcastFormat(), tx.toBroadcastFormat());
|
|
106
|
+
});
|
|
107
|
+
it('validates the PoX-5 contract address during factory routing', async () => {
|
|
108
|
+
const builder = configure(factory.getPox5Builder());
|
|
109
|
+
builder.registerForBond({
|
|
110
|
+
bondIndex: 210,
|
|
111
|
+
signerManager,
|
|
112
|
+
amountUstx: '1005000',
|
|
113
|
+
lockup: { kind: 'btc', unlockBytes: '00', outputs: [validLockupOutput()] },
|
|
114
|
+
});
|
|
115
|
+
const tx = await builder.build();
|
|
116
|
+
const payload = tx.stxTransaction.payload;
|
|
117
|
+
should_1.default.equal(src_1.StxLib.Pox5Builder.isValidContractCall(statics_1.coins.get('tstx'), payload), true);
|
|
118
|
+
should_1.default.equal(src_1.StxLib.Pox5Builder.isValidContractCall(statics_1.coins.get('tstx'), {
|
|
119
|
+
...payload,
|
|
120
|
+
contractAddress: (0, transactions_1.createAddress)(testData.ACCOUNT_1.address),
|
|
121
|
+
}), false);
|
|
122
|
+
});
|
|
123
|
+
it('builds sBTC registration using response error', async () => {
|
|
124
|
+
const builder = configure(factory.getPox5Builder());
|
|
125
|
+
builder.registerForBond({
|
|
126
|
+
bondIndex: 210,
|
|
127
|
+
signerManager,
|
|
128
|
+
amountUstx: '1005000',
|
|
129
|
+
lockup: { kind: 'sbtc', sbtcSats: 10000 },
|
|
130
|
+
});
|
|
131
|
+
const tx = await builder.build();
|
|
132
|
+
const payload = tx.toJson().payload;
|
|
133
|
+
should_1.default.equal(payload.functionArgs[3].type, transactions_1.ClarityType.ResponseErr);
|
|
134
|
+
should_1.default.equal((0, transactions_1.cvToValue)(payload.functionArgs[3].value).toString(), '10000');
|
|
135
|
+
});
|
|
136
|
+
it('builds validator update, early exit, and reward calls', async () => {
|
|
137
|
+
const update = configure(factory.getPox5Builder()).updateBondRegistration({
|
|
138
|
+
signerManager,
|
|
139
|
+
oldSignerManager,
|
|
140
|
+
signerCalldata: '00',
|
|
141
|
+
});
|
|
142
|
+
should_1.default.equal((await update.build()).toJson().payload.functionName, 'update-bond-registration');
|
|
143
|
+
const earlyExit = configure(factory.getPox5Builder()).announceL1EarlyExit({
|
|
144
|
+
staker: testData.TX_SENDER.address,
|
|
145
|
+
oldSignerManager,
|
|
146
|
+
});
|
|
147
|
+
const earlyExitPayload = (await earlyExit.build()).toJson().payload;
|
|
148
|
+
should_1.default.equal(earlyExitPayload.functionName, 'announce-l1-early-exit');
|
|
149
|
+
should_1.default.equal((0, transactions_1.cvToString)(earlyExitPayload.functionArgs[0]), testData.TX_SENDER.address);
|
|
150
|
+
const claims = configure(factory.getPox5Builder()).claimRewards({
|
|
151
|
+
bondIndices: [210, 226],
|
|
152
|
+
rewardCycle: 391,
|
|
153
|
+
});
|
|
154
|
+
const claimPayload = (await claims.build()).toJson().payload;
|
|
155
|
+
should_1.default.equal(claimPayload.functionName, 'claim-rewards');
|
|
156
|
+
should_1.default.equal(claimPayload.functionArgs[0].type, transactions_1.ClarityType.List);
|
|
157
|
+
should_1.default.equal(claimPayload.functionArgs[1].type, transactions_1.ClarityType.UInt);
|
|
158
|
+
});
|
|
159
|
+
it('accepts every supported PoX-5 function name', () => {
|
|
160
|
+
const functionNames = [
|
|
161
|
+
'stake',
|
|
162
|
+
'stake-update',
|
|
163
|
+
'unstake',
|
|
164
|
+
'register-for-bond',
|
|
165
|
+
'update-bond-registration',
|
|
166
|
+
'announce-l1-early-exit',
|
|
167
|
+
'claim-rewards',
|
|
168
|
+
'claim-staker-rewards-for-signer',
|
|
169
|
+
'calculate-rewards',
|
|
170
|
+
];
|
|
171
|
+
for (const functionName of functionNames) {
|
|
172
|
+
configure(factory.getPox5Builder()).functionName(functionName);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
it('parses response, list, and explicit principal JSON values', async () => {
|
|
176
|
+
const builder = configure(factory.getPox5Builder());
|
|
177
|
+
builder.functionName('calculate-rewards');
|
|
178
|
+
builder.functionArgs([
|
|
179
|
+
{
|
|
180
|
+
type: 'response',
|
|
181
|
+
val: {
|
|
182
|
+
type: 'ok',
|
|
183
|
+
val: {
|
|
184
|
+
type: 'list',
|
|
185
|
+
val: [{ type: 'uint128', val: '210' }],
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
{ type: 'contract-principal', val: oldSignerManager },
|
|
190
|
+
]);
|
|
191
|
+
const args = (await builder.build()).toJson().payload.functionArgs;
|
|
192
|
+
should_1.default.equal(args[0].type, transactions_1.ClarityType.ResponseOk);
|
|
193
|
+
should_1.default.equal(args[0].value.type, transactions_1.ClarityType.List);
|
|
194
|
+
should_1.default.equal(args[1].type, transactions_1.ClarityType.PrincipalContract);
|
|
195
|
+
});
|
|
196
|
+
it('rejects invalid SPV proof byte lengths', () => {
|
|
197
|
+
const lockup = {
|
|
198
|
+
kind: 'btc',
|
|
199
|
+
unlockBytes: '00',
|
|
200
|
+
outputs: [
|
|
201
|
+
{
|
|
202
|
+
height: 9231,
|
|
203
|
+
tx: '00',
|
|
204
|
+
outputIndex: 0,
|
|
205
|
+
header: '00',
|
|
206
|
+
leafHashes: ['00'.repeat(32)],
|
|
207
|
+
txCount: 1,
|
|
208
|
+
txIndex: 0,
|
|
209
|
+
amount: 10000,
|
|
210
|
+
unlockBurnHeight: 9490,
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
};
|
|
214
|
+
assert_1.default.throws(() => configure(factory.getPox5Builder()).registerForBond({
|
|
215
|
+
bondIndex: 210,
|
|
216
|
+
signerManager,
|
|
217
|
+
amountUstx: '1005000',
|
|
218
|
+
lockup,
|
|
219
|
+
}), /header must be exactly 80 bytes/);
|
|
220
|
+
assert_1.default.throws(() => configure(factory.getPox5Builder()).registerForBond({
|
|
221
|
+
bondIndex: 210,
|
|
222
|
+
signerManager,
|
|
223
|
+
amountUstx: '1005000',
|
|
224
|
+
lockup: {
|
|
225
|
+
...lockup,
|
|
226
|
+
outputs: [{ ...lockup.outputs[0], header: '00'.repeat(80), leafHashes: ['00'] }],
|
|
227
|
+
},
|
|
228
|
+
}), /leafHash must be exactly 32 bytes/);
|
|
229
|
+
});
|
|
230
|
+
it('rejects malformed lockup fields and contract principals', () => {
|
|
231
|
+
const validLockup = { kind: 'btc', unlockBytes: '00', outputs: [validLockupOutput()] };
|
|
232
|
+
const register = (lockup, manager = signerManager) => configure(factory.getPox5Builder()).registerForBond({
|
|
233
|
+
bondIndex: 210,
|
|
234
|
+
signerManager: manager,
|
|
235
|
+
amountUstx: '1005000',
|
|
236
|
+
lockup,
|
|
237
|
+
});
|
|
238
|
+
assert_1.default.throws(() => register(validLockup, 'no-dot'), /address.contract-name format/);
|
|
239
|
+
assert_1.default.throws(() => register(validLockup, 'a.b.c'), /address.contract-name format/);
|
|
240
|
+
assert_1.default.throws(() => register(validLockup, 'STDE7Y8HV3RX8VBM2TZVWJTS7ZA1XB0SSC3NEVH0.'), /address.contract-name/);
|
|
241
|
+
assert_1.default.throws(() => register({ ...validLockup, outputs: [{ ...validLockup.outputs[0], tx: '0' }] }), /tx must be an even-length hexadecimal string/);
|
|
242
|
+
assert_1.default.throws(() => register({ ...validLockup, outputs: [{ ...validLockup.outputs[0], tx: 'zz' }] }), /tx must be an even-length hexadecimal string/);
|
|
243
|
+
assert_1.default.throws(() => register({ ...validLockup, outputs: Array.from({ length: 11 }, () => validLockupOutput()) }), /between 1 and 10 outputs/);
|
|
244
|
+
assert_1.default.throws(() => register({
|
|
245
|
+
...validLockup,
|
|
246
|
+
outputs: [{ ...validLockup.outputs[0], leafHashes: Array(15).fill('00'.repeat(32)) }],
|
|
247
|
+
}), /more than 14 merkle siblings/);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG94NUJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3BveDVCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLHVEQUF5RjtBQUN6Riw0Q0FBdUM7QUFDdkMsb0RBQTRCO0FBRTVCLHNDQUFzQztBQUN0Qyx1REFBeUM7QUFFekMsUUFBUSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hDLE1BQU0sT0FBTyxHQUFHLElBQUksWUFBTSxDQUFDLHlCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RSxNQUFNLGFBQWEsR0FBRyx5REFBeUQsQ0FBQztJQUNoRixNQUFNLGdCQUFnQixHQUFHLDZEQUE2RCxDQUFDO0lBRXZGLFNBQVMsU0FBUyxDQUFDLE9BQTJCO1FBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFNBQVMsaUJBQWlCO1FBQ3hCLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSTtZQUNaLEVBQUUsRUFBRSxJQUFJO1lBQ1IsV0FBVyxFQUFFLENBQUM7WUFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdkIsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZ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RSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQ3RGLDhDQUE4QyxDQUMvQyxDQUFDO1FBQ0YsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxXQUFXLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFDbEcsMEJBQTBCLENBQzNCLENBQUM7UUFDRixnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FDSCxRQUFRLENBQUM7WUFDUCxHQUFHLFdBQVc7WUFDZCxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN0RixDQUFDLEVBQ0osOEJBQThCLENBQy9CLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQ2xhcml0eVR5cGUsIGNyZWF0ZUFkZHJlc3MsIGN2VG9TdHJpbmcsIGN2VG9WYWx1ZSB9IGZyb20gJ0BzdGFja3MvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuXG5pbXBvcnQgeyBTdHhMaWIgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzJztcblxuZGVzY3JpYmUoJ1N0YWNrczogUG9YLTUgQnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBTdHhMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RzdHgnKSk7XG4gIGNvbnN0IHNpZ25lck1hbmFnZXIgPSAnU1RERTdZOEhWM1JYOFZCTTJUWlZXSlRTN1pBMVhCMFNTQzNORVZIMC5zaWduZXItbWFuYWdlcic7XG4gIGNvbnN0IG9sZFNpZ25lck1hbmFnZXIgPSAnU1RERTdZOEhWM1JYOFZCTTJUWlZXSlRTN1pBMVhCMFNTQzNORVZIMC5vbGQtc2lnbmVyLW1hbmFnZXInO1xuXG4gIGZ1bmN0aW9uIGNvbmZpZ3VyZShidWlsZGVyOiBTdHhMaWIuUG94NUJ1aWxkZXIpOiBTdHhMaWIuUG94NUJ1aWxkZXIge1xuICAgIGJ1aWxkZXIuZmVlKHsgZmVlOiAnMTgwJyB9KTtcbiAgICBidWlsZGVyLm5vbmNlKDApO1xuICAgIGJ1aWxkZXIuZnJvbVB1YktleSh0ZXN0RGF0YS5UWF9TRU5ERVIucHViKTtcbiAgICBidWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMSk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZExvY2t1cE91dHB1dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVpZ2h0OiA5MjMxLFxuICAgICAgdHg6ICcwMCcsXG4gICAgICBvdXRwdXRJbmRleDogMCxcbiAgICAgIGhlYWRlcjogJzAwJy5yZXBlYXQoODApLFxuICAgICAgbGVhZkhhc2hlczogWycwMCcucmVwZWF0KDMyKV0sXG4gICAgICB0eENvdW50OiAxLFxuICAgICAgdHhJbmRleDogMCxcbiAgICAgIGFtb3VudDogMTAwMDAsXG4gICAgICB1bmxvY2tCdXJuSGVpZ2h0OiA5NDkwLFxuICAgIH07XG4gIH1cblxuICBpdCgnYnVpbGRzIGFuZCBwYXJzZXMgcmVnaXN0ZXItZm9yLWJvbmQgd2l0aCBhbiBMMSBsb2NrdXAnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgIGJ1aWxkZXIucmVnaXN0ZXJGb3JCb25kKHtcbiAgICAgIGJvbmRJbmRleDogMjEwLFxuICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgIGFtb3VudFVzdHg6ICcxMDA1MDAwJyxcbiAgICAgIGxvY2t1cDoge1xuICAgICAgICBraW5kOiAnYnRjJyxcbiAgICAgICAgdW5sb2NrQnl0ZXM6ICcwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoZWlnaHQ6IDkyMzEsXG4gICAgICAgICAgICB0eDogJzAwJyxcbiAgICAgICAgICAgIG91dHB1dEluZGV4OiAwLFxuICAgICAgICAgICAgaGVhZGVyOiAnMDAnLnJlcGVhdCg4MCksXG4gICAgICAgICAgICBsZWFmSGFzaGVzOiBbJzAwJy5yZXBlYXQoMzIpXSxcbiAgICAgICAgICAgIHR4Q291bnQ6IDEsXG4gICAgICAgICAgICB0eEluZGV4OiAwLFxuICAgICAgICAgICAgYW1vdW50OiAxMDAwMCxcbiAgICAgICAgICAgIHVubG9ja0J1cm5IZWlnaHQ6IDk0OTAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBzaWduZXJDYWxsZGF0YTogJzAwJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHBheWxvYWQgPSB0eC50b0pzb24oKS5wYXlsb2FkIGFzIGFueTtcbiAgICBzaG91bGQuZXF1YWwocGF5bG9hZC5mdW5jdGlvbk5hbWUsICdyZWdpc3Rlci1mb3ItYm9uZCcpO1xuICAgIHNob3VsZC5lcXVhbChwYXlsb2FkLmZ1bmN0aW9uQXJncy5sZW5ndGgsIDUpO1xuICAgIHNob3VsZC5lcXVhbChwYXlsb2FkLmZ1bmN0aW9uQXJnc1swXS50eXBlLCBDbGFyaXR5VHlwZS5VSW50KTtcbiAgICBzaG91bGQuZXF1YWwocGF5bG9hZC5mdW5jdGlvbkFyZ3NbMV0udHlwZSwgQ2xhcml0eVR5cGUuUHJpbmNpcGFsQ29udHJhY3QpO1xuICAgIHNob3VsZC5lcXVhbChwYXlsb2FkLmZ1bmN0aW9uQXJnc1szXS50eXBlLCBDbGFyaXR5VHlwZS5SZXNwb25zZU9rKTtcbiAgICBzaG91bGQuZXF1YWwocGF5bG9hZC5mdW5jdGlvbkFyZ3NbNF0udHlwZSwgQ2xhcml0eVR5cGUuT3B0aW9uYWxTb21lKTtcblxuICAgIGNvbnN0IHJlYnVpbHRCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgIHJlYnVpbHRCdWlsZGVyLmZyb21QdWJLZXkodGVzdERhdGEuVFhfU0VOREVSLnB1Yik7XG4gICAgY29uc3QgcmVidWlsdCA9IGF3YWl0IHJlYnVpbHRCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHJlYnVpbHQudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZXMgdGhlIFBvWC01IGNvbnRyYWN0IGFkZHJlc3MgZHVyaW5nIGZhY3Rvcnkgcm91dGluZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgYnVpbGRlci5yZWdpc3RlckZvckJvbmQoe1xuICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICBzaWduZXJNYW5hZ2VyLFxuICAgICAgYW1vdW50VXN0eDogJzEwMDUwMDAnLFxuICAgICAgbG9ja3VwOiB7IGtpbmQ6ICdidGMnLCB1bmxvY2tCeXRlczogJzAwJywgb3V0cHV0czogW3ZhbGlkTG9ja3VwT3V0cHV0KCldIH0sXG4gICAgfSk7XG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgcGF5bG9hZCA9ICh0eCBhcyBTdHhMaWIuVHJhbnNhY3Rpb24pLnN0eFRyYW5zYWN0aW9uLnBheWxvYWQgYXMgYW55O1xuICAgIHNob3VsZC5lcXVhbChTdHhMaWIuUG94NUJ1aWxkZXIuaXNWYWxpZENvbnRyYWN0Q2FsbChjb2lucy5nZXQoJ3RzdHgnKSwgcGF5bG9hZCksIHRydWUpO1xuICAgIHNob3VsZC5lcXVhbChcbiAgICAgIFN0eExpYi5Qb3g1QnVpbGRlci5pc1ZhbGlkQ29udHJhY3RDYWxsKGNvaW5zLmdldCgndHN0eCcpLCB7XG4gICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgIGNvbnRyYWN0QWRkcmVzczogY3JlYXRlQWRkcmVzcyh0ZXN0RGF0YS5BQ0NPVU5UXzEuYWRkcmVzcyksXG4gICAgICB9KSxcbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ2J1aWxkcyBzQlRDIHJlZ2lzdHJhdGlvbiB1c2luZyByZXNwb25zZSBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidWlsZGVyID0gY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSk7XG4gICAgYnVpbGRlci5yZWdpc3RlckZvckJvbmQoe1xuICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICBzaWduZXJNYW5hZ2VyLFxuICAgICAgYW1vdW50VXN0eDogJzEwMDUwMDAnLFxuICAgICAgbG9ja3VwOiB7IGtpbmQ6ICdzYnRjJywgc2J0Y1NhdHM6IDEwMDAwIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBwYXlsb2FkID0gdHgudG9Kc29uKCkucGF5bG9hZCBhcyBhbnk7XG4gICAgc2hvdWxkLmVxdWFsKHBheWxvYWQuZnVuY3Rpb25BcmdzWzNdLnR5cGUsIENsYXJpdHlUeXBlLlJlc3BvbnNlRXJyKTtcbiAgICBzaG91bGQuZXF1YWwoY3ZUb1ZhbHVlKHBheWxvYWQuZnVuY3Rpb25BcmdzWzNdLnZhbHVlKS50b1N0cmluZygpLCAnMTAwMDAnKTtcbiAgfSk7XG5cbiAgaXQoJ2J1aWxkcyB2YWxpZGF0b3IgdXBkYXRlLCBlYXJseSBleGl0LCBhbmQgcmV3YXJkIGNhbGxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZSA9IGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpLnVwZGF0ZUJvbmRSZWdpc3RyYXRpb24oe1xuICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgIG9sZFNpZ25lck1hbmFnZXIsXG4gICAgICBzaWduZXJDYWxsZGF0YTogJzAwJyxcbiAgICB9KTtcbiAgICBzaG91bGQuZXF1YWwoXG4gICAgICAoKGF3YWl0IHVwZGF0ZS5idWlsZCgpKS50b0pzb24oKS5wYXlsb2FkIGFzIHsgZnVuY3Rpb25OYW1lOiBzdHJpbmcgfSkuZnVuY3Rpb25OYW1lLFxuICAgICAgJ3VwZGF0ZS1ib25kLXJlZ2lzdHJhdGlvbidcbiAgICApO1xuXG4gICAgY29uc3QgZWFybHlFeGl0ID0gY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSkuYW5ub3VuY2VMMUVhcmx5RXhpdCh7XG4gICAgICBzdGFrZXI6IHRlc3REYXRhLlRYX1NFTkRFUi5hZGRyZXNzLFxuICAgICAgb2xkU2lnbmVyTWFuYWdlcixcbiAgICB9KTtcbiAgICBjb25zdCBlYXJseUV4aXRQYXlsb2FkID0gKGF3YWl0IGVhcmx5RXhpdC5idWlsZCgpKS50b0pzb24oKS5wYXlsb2FkIGFzIGFueTtcbiAgICBzaG91bGQuZXF1YWwoZWFybHlFeGl0UGF5bG9hZC5mdW5jdGlvbk5hbWUsICdhbm5vdW5jZS1sMS1lYXJseS1leGl0Jyk7XG4gICAgc2hvdWxkLmVxdWFsKGN2VG9TdHJpbmcoZWFybHlFeGl0UGF5bG9hZC5mdW5jdGlvbkFyZ3NbMF0pLCB0ZXN0RGF0YS5UWF9TRU5ERVIuYWRkcmVzcyk7XG5cbiAgICBjb25zdCBjbGFpbXMgPSBjb25maWd1cmUoZmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKS5jbGFpbVJld2FyZHMoe1xuICAgICAgYm9uZEluZGljZXM6IFsyMTAsIDIyNl0sXG4gICAgICByZXdhcmRDeWNsZTogMzkxLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsYWltUGF5bG9hZCA9IChhd2FpdCBjbGFpbXMuYnVpbGQoKSkudG9Kc29uKCkucGF5bG9hZCBhcyBhbnk7XG4gICAgc2hvdWxkLmVxdWFsKGNsYWltUGF5bG9hZC5mdW5jdGlvbk5hbWUsICdjbGFpbS1yZXdhcmRzJyk7XG4gICAgc2hvdWxkLmVxdWFsKGNsYWltUGF5bG9hZC5mdW5jdGlvbkFyZ3NbMF0udHlwZSwgQ2xhcml0eVR5cGUuTGlzdCk7XG4gICAgc2hvdWxkLmVxdWFsKGNsYWltUGF5bG9hZC5mdW5jdGlvbkFyZ3NbMV0udHlwZSwgQ2xhcml0eVR5cGUuVUludCk7XG4gIH0pO1xuXG4gIGl0KCdhY2NlcHRzIGV2ZXJ5IHN1cHBvcnRlZCBQb1gtNSBmdW5jdGlvbiBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZXMgPSBbXG4gICAgICAnc3Rha2UnLFxuICAgICAgJ3N0YWtlLXVwZGF0ZScsXG4gICAgICAndW5zdGFrZScsXG4gICAgICAncmVnaXN0ZXItZm9yLWJvbmQnLFxuICAgICAgJ3VwZGF0ZS1ib25kLXJlZ2lzdHJhdGlvbicsXG4gICAgICAnYW5ub3VuY2UtbDEtZWFybHktZXhpdCcsXG4gICAgICAnY2xhaW0tcmV3YXJkcycsXG4gICAgICAnY2xhaW0tc3Rha2VyLXJld2FyZHMtZm9yLXNpZ25lcicsXG4gICAgICAnY2FsY3VsYXRlLXJld2FyZHMnLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZ1bmN0aW9uTmFtZSBvZiBmdW5jdGlvbk5hbWVzKSB7XG4gICAgICBjb25maWd1cmUoZmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKS5mdW5jdGlvbk5hbWUoZnVuY3Rpb25OYW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdwYXJzZXMgcmVzcG9uc2UsIGxpc3QsIGFuZCBleHBsaWNpdCBwcmluY2lwYWwgSlNPTiB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnVpbGRlciA9IGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpO1xuICAgIGJ1aWxkZXIuZnVuY3Rpb25OYW1lKCdjYWxjdWxhdGUtcmV3YXJkcycpO1xuICAgIGJ1aWxkZXIuZnVuY3Rpb25BcmdzKFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgICAgdmFsOiB7XG4gICAgICAgICAgdHlwZTogJ29rJyxcbiAgICAgICAgICB2YWw6IHtcbiAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgICAgIHZhbDogW3sgdHlwZTogJ3VpbnQxMjgnLCB2YWw6ICcyMTAnIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgeyB0eXBlOiAnY29udHJhY3QtcHJpbmNpcGFsJywgdmFsOiBvbGRTaWduZXJNYW5hZ2VyIH0sXG4gICAgXSk7XG5cbiAgICBjb25zdCBhcmdzID0gKChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpLnRvSnNvbigpLnBheWxvYWQgYXMgYW55KS5mdW5jdGlvbkFyZ3M7XG4gICAgc2hvdWxkLmVxdWFsKGFyZ3NbMF0udHlwZSwgQ2xhcml0eVR5cGUuUmVzcG9uc2VPayk7XG4gICAgc2hvdWxkLmVxdWFsKGFyZ3NbMF0udmFsdWUudHlwZSwgQ2xhcml0eVR5cGUuTGlzdCk7XG4gICAgc2hvdWxkLmVxdWFsKGFyZ3NbMV0udHlwZSwgQ2xhcml0eVR5cGUuUHJpbmNpcGFsQ29udHJhY3QpO1xuICB9KTtcblxuICBpdCgncmVqZWN0cyBpbnZhbGlkIFNQViBwcm9vZiBieXRlIGxlbmd0aHMnLCAoKSA9PiB7XG4gICAgY29uc3QgbG9ja3VwID0ge1xuICAgICAga2luZDogJ2J0YycgYXMgY29uc3QsXG4gICAgICB1bmxvY2tCeXRlczogJzAwJyxcbiAgICAgIG91dHB1dHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGhlaWdodDogOTIzMSxcbiAgICAgICAgICB0eDogJzAwJyxcbiAgICAgICAgICBvdXRwdXRJbmRleDogMCxcbiAgICAgICAgICBoZWFkZXI6ICcwMCcsXG4gICAgICAgICAgbGVhZkhhc2hlczogWycwMCcucmVwZWF0KDMyKV0sXG4gICAgICAgICAgdHhDb3VudDogMSxcbiAgICAgICAgICB0eEluZGV4OiAwLFxuICAgICAgICAgIGFtb3VudDogMTAwMDAsXG4gICAgICAgICAgdW5sb2NrQnVybkhlaWdodDogOTQ5MCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PlxuICAgICAgICBjb25maWd1cmUoZmFjdG9yeS5nZXRQb3g1QnVpbGRlcigpKS5yZWdpc3RlckZvckJvbmQoe1xuICAgICAgICAgIGJvbmRJbmRleDogMjEwLFxuICAgICAgICAgIHNpZ25lck1hbmFnZXIsXG4gICAgICAgICAgYW1vdW50VXN0eDogJzEwMDUwMDAnLFxuICAgICAgICAgIGxvY2t1cCxcbiAgICAgICAgfSksXG4gICAgICAvaGVhZGVyIG11c3QgYmUgZXhhY3RseSA4MCBieXRlcy9cbiAgICApO1xuXG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+XG4gICAgICAgIGNvbmZpZ3VyZShmYWN0b3J5LmdldFBveDVCdWlsZGVyKCkpLnJlZ2lzdGVyRm9yQm9uZCh7XG4gICAgICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICAgICAgc2lnbmVyTWFuYWdlcixcbiAgICAgICAgICBhbW91bnRVc3R4OiAnMTAwNTAwMCcsXG4gICAgICAgICAgbG9ja3VwOiB7XG4gICAgICAgICAgICAuLi5sb2NrdXAsXG4gICAgICAgICAgICBvdXRwdXRzOiBbeyAuLi5sb2NrdXAub3V0cHV0c1swXSwgaGVhZGVyOiAnMDAnLnJlcGVhdCg4MCksIGxlYWZIYXNoZXM6IFsnMDAnXSB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIC9sZWFmSGFzaCBtdXN0IGJlIGV4YWN0bHkgMzIgYnl0ZXMvXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgbWFsZm9ybWVkIGxvY2t1cCBmaWVsZHMgYW5kIGNvbnRyYWN0IHByaW5jaXBhbHMnLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRMb2NrdXAgPSB7IGtpbmQ6ICdidGMnIGFzIGNvbnN0LCB1bmxvY2tCeXRlczogJzAwJywgb3V0cHV0czogW3ZhbGlkTG9ja3VwT3V0cHV0KCldIH07XG4gICAgY29uc3QgcmVnaXN0ZXIgPSAobG9ja3VwOiB0eXBlb2YgdmFsaWRMb2NrdXAsIG1hbmFnZXIgPSBzaWduZXJNYW5hZ2VyKSA9PlxuICAgICAgY29uZmlndXJlKGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKSkucmVnaXN0ZXJGb3JCb25kKHtcbiAgICAgICAgYm9uZEluZGV4OiAyMTAsXG4gICAgICAgIHNpZ25lck1hbmFnZXI6IG1hbmFnZXIsXG4gICAgICAgIGFtb3VudFVzdHg6ICcxMDA1MDAwJyxcbiAgICAgICAgbG9ja3VwLFxuICAgICAgfSk7XG5cbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHJlZ2lzdGVyKHZhbGlkTG9ja3VwLCAnbm8tZG90JyksIC9hZGRyZXNzLmNvbnRyYWN0LW5hbWUgZm9ybWF0Lyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiByZWdpc3Rlcih2YWxpZExvY2t1cCwgJ2EuYi5jJyksIC9hZGRyZXNzLmNvbnRyYWN0LW5hbWUgZm9ybWF0Lyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiByZWdpc3Rlcih2YWxpZExvY2t1cCwgJ1NUREU3WThIVjNSWDhWQk0yVFpWV0pUUzdaQTFYQjBTU0MzTkVWSDAuJyksIC9hZGRyZXNzLmNvbnRyYWN0LW5hbWUvKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gcmVnaXN0ZXIoeyAuLi52YWxpZExvY2t1cCwgb3V0cHV0czogW3sgLi4udmFsaWRMb2NrdXAub3V0cHV0c1swXSwgdHg6ICcwJyB9XSB9KSxcbiAgICAgIC90eCBtdXN0IGJlIGFuIGV2ZW4tbGVuZ3RoIGhleGFkZWNpbWFsIHN0cmluZy9cbiAgICApO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiByZWdpc3Rlcih7IC4uLnZhbGlkTG9ja3VwLCBvdXRwdXRzOiBbeyAuLi52YWxpZExvY2t1cC5vdXRwdXRzWzBdLCB0eDogJ3p6JyB9XSB9KSxcbiAgICAgIC90eCBtdXN0IGJlIGFuIGV2ZW4tbGVuZ3RoIGhleGFkZWNpbWFsIHN0cmluZy9cbiAgICApO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiByZWdpc3Rlcih7IC4uLnZhbGlkTG9ja3VwLCBvdXRwdXRzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMSB9LCAoKSA9PiB2YWxpZExvY2t1cE91dHB1dCgpKSB9KSxcbiAgICAgIC9iZXR3ZWVuIDEgYW5kIDEwIG91dHB1dHMvXG4gICAgKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT5cbiAgICAgICAgcmVnaXN0ZXIoe1xuICAgICAgICAgIC4uLnZhbGlkTG9ja3VwLFxuICAgICAgICAgIG91dHB1dHM6IFt7IC4uLnZhbGlkTG9ja3VwLm91dHB1dHNbMF0sIGxlYWZIYXNoZXM6IEFycmF5KDE1KS5maWxsKCcwMCcucmVwZWF0KDMyKSkgfV0sXG4gICAgICAgIH0pLFxuICAgICAgL21vcmUgdGhhbiAxNCBtZXJrbGUgc2libGluZ3MvXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==
|