@regle/rules 0.1.5 → 0.1.7
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/index.cjs +823 -0
- package/dist/index.d.cts +202 -0
- package/dist/index.d.ts +36 -29
- package/dist/index.js +22 -6
- package/package.json +3 -2
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,823 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@regle/core');
|
|
4
|
+
var vue = require('vue');
|
|
5
|
+
|
|
6
|
+
// src/helpers/withMessage.ts
|
|
7
|
+
function withMessage(rule, newMessage) {
|
|
8
|
+
let _type;
|
|
9
|
+
let validator;
|
|
10
|
+
let _active;
|
|
11
|
+
let _params;
|
|
12
|
+
if (typeof rule === "function" && !("_validator" in rule)) {
|
|
13
|
+
_type = core.InternalRuleType.Inline;
|
|
14
|
+
validator = rule;
|
|
15
|
+
} else {
|
|
16
|
+
({ _type, validator, _active, _params } = rule);
|
|
17
|
+
}
|
|
18
|
+
const newRule = core.createRule({
|
|
19
|
+
type: _type,
|
|
20
|
+
validator,
|
|
21
|
+
active: _active,
|
|
22
|
+
message: newMessage
|
|
23
|
+
});
|
|
24
|
+
newRule._params = _params;
|
|
25
|
+
newRule._patched = true;
|
|
26
|
+
return newRule;
|
|
27
|
+
}
|
|
28
|
+
function withAsync(rule, depsArray) {
|
|
29
|
+
const validator = async (value, ...params) => {
|
|
30
|
+
return rule(value, ...params);
|
|
31
|
+
};
|
|
32
|
+
const newRule = core.createRule({
|
|
33
|
+
type: core.InternalRuleType.Async,
|
|
34
|
+
validator,
|
|
35
|
+
message: ""
|
|
36
|
+
});
|
|
37
|
+
newRule._params = depsArray;
|
|
38
|
+
return newRule;
|
|
39
|
+
}
|
|
40
|
+
function withParams(rule, depsArray) {
|
|
41
|
+
const validator = (value, ...params) => {
|
|
42
|
+
return rule(value, ...params);
|
|
43
|
+
};
|
|
44
|
+
const newRule = core.createRule({
|
|
45
|
+
type: core.InternalRuleType.Inline,
|
|
46
|
+
validator,
|
|
47
|
+
message: ""
|
|
48
|
+
});
|
|
49
|
+
newRule._params = depsArray;
|
|
50
|
+
return newRule;
|
|
51
|
+
}
|
|
52
|
+
function applyIf(_condition, rule) {
|
|
53
|
+
let _type;
|
|
54
|
+
let validator;
|
|
55
|
+
let _params;
|
|
56
|
+
let _message = "";
|
|
57
|
+
if (typeof rule === "function") {
|
|
58
|
+
_type = core.InternalRuleType.Inline;
|
|
59
|
+
validator = rule;
|
|
60
|
+
} else {
|
|
61
|
+
({ _type, validator, _params, _message } = rule);
|
|
62
|
+
_params?.push(_condition);
|
|
63
|
+
}
|
|
64
|
+
function newValidator(value, ...args) {
|
|
65
|
+
const [condition] = core.unwrapRuleParameters([_condition]);
|
|
66
|
+
if (condition) {
|
|
67
|
+
return validator(value, ...args);
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
function newActive(value, metadata) {
|
|
72
|
+
const [condition] = core.unwrapRuleParameters([_condition]);
|
|
73
|
+
return condition;
|
|
74
|
+
}
|
|
75
|
+
const newRule = core.createRule({
|
|
76
|
+
type: _type,
|
|
77
|
+
validator: newValidator,
|
|
78
|
+
active: newActive,
|
|
79
|
+
message: _message
|
|
80
|
+
});
|
|
81
|
+
newRule._params = _params;
|
|
82
|
+
return newRule;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// src/helpers/ruleHelpers/isEmpty.ts
|
|
86
|
+
function isEmpty(value) {
|
|
87
|
+
if (value === void 0 || value === null) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
if (value === false) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
if (value instanceof Date) {
|
|
94
|
+
return isNaN(value.getTime());
|
|
95
|
+
}
|
|
96
|
+
if (Array.isArray(value)) {
|
|
97
|
+
return value.length === 0;
|
|
98
|
+
}
|
|
99
|
+
if (typeof value === "object" && value != null) {
|
|
100
|
+
return Object.keys(value).length === 0;
|
|
101
|
+
}
|
|
102
|
+
return !String(value).length;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// src/helpers/ruleHelpers/isFilled.ts
|
|
106
|
+
function isFilled(value) {
|
|
107
|
+
return !isEmpty(typeof value === "string" ? value.trim() : value);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// src/helpers/ruleHelpers/isNumber.ts
|
|
111
|
+
function isNumber(value) {
|
|
112
|
+
if (value == null) return false;
|
|
113
|
+
else if (typeof value !== "number") {
|
|
114
|
+
return false;
|
|
115
|
+
} else if (isNaN(value)) {
|
|
116
|
+
return false;
|
|
117
|
+
} else {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// src/helpers/ruleHelpers/regex.ts
|
|
123
|
+
function regex(_value, ...expr) {
|
|
124
|
+
if (isEmpty(_value)) {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
const value = typeof _value === "number" ? _value.toString() : _value;
|
|
128
|
+
return expr.every((reg) => {
|
|
129
|
+
reg.lastIndex = 0;
|
|
130
|
+
return reg.test(value);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function size(value) {
|
|
134
|
+
const _value = vue.unref(value);
|
|
135
|
+
if (Array.isArray(_value)) return _value.length;
|
|
136
|
+
if (typeof _value === "object") {
|
|
137
|
+
return Object.keys(_value).length;
|
|
138
|
+
}
|
|
139
|
+
if (typeof _value === "number") {
|
|
140
|
+
if (isNaN(_value)) {
|
|
141
|
+
return 0;
|
|
142
|
+
}
|
|
143
|
+
return _value;
|
|
144
|
+
}
|
|
145
|
+
return String(_value).length;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// src/helpers/ruleHelpers/isDate.ts
|
|
149
|
+
function isDate(value) {
|
|
150
|
+
if (isEmpty(value)) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
let possibleDate = null;
|
|
155
|
+
if (value instanceof Date) {
|
|
156
|
+
possibleDate = value;
|
|
157
|
+
} else if (typeof value === "number" && !isNaN(value)) {
|
|
158
|
+
possibleDate = new Date(value);
|
|
159
|
+
} else if (typeof value === "string") {
|
|
160
|
+
const date = new Date(value);
|
|
161
|
+
if (date.toString() === "Invalid Date") {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
possibleDate = date;
|
|
165
|
+
}
|
|
166
|
+
return !!possibleDate;
|
|
167
|
+
} catch (e) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// src/helpers/ruleHelpers/toDate.ts
|
|
173
|
+
function toDate(argument) {
|
|
174
|
+
const argStr = Object.prototype.toString.call(argument);
|
|
175
|
+
if (argument == null) {
|
|
176
|
+
return /* @__PURE__ */ new Date(NaN);
|
|
177
|
+
} else if (argument instanceof Date || typeof argument === "object" && argStr === "[object Date]") {
|
|
178
|
+
return new Date(argument.getTime());
|
|
179
|
+
} else if (typeof argument === "number" || argStr === "[object Number]") {
|
|
180
|
+
return new Date(argument);
|
|
181
|
+
} else if (typeof argument === "string" || argStr === "[object String]") {
|
|
182
|
+
return new Date(argument);
|
|
183
|
+
} else {
|
|
184
|
+
return /* @__PURE__ */ new Date(NaN);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// src/helpers/ruleHelpers/toNumber.ts
|
|
189
|
+
function toNumber(argument) {
|
|
190
|
+
if (typeof argument === "number") {
|
|
191
|
+
return argument;
|
|
192
|
+
} else if (argument != null) {
|
|
193
|
+
const isPadded = argument.trim() !== argument;
|
|
194
|
+
if (isPadded) {
|
|
195
|
+
return NaN;
|
|
196
|
+
}
|
|
197
|
+
return +argument;
|
|
198
|
+
}
|
|
199
|
+
return NaN;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// src/helpers/ruleHelpers/index.ts
|
|
203
|
+
var ruleHelpers = {
|
|
204
|
+
isEmpty,
|
|
205
|
+
isFilled,
|
|
206
|
+
size,
|
|
207
|
+
regex,
|
|
208
|
+
isNumber,
|
|
209
|
+
isDate,
|
|
210
|
+
toDate,
|
|
211
|
+
toNumber
|
|
212
|
+
};
|
|
213
|
+
function and(...rules) {
|
|
214
|
+
const isAnyRuleAsync = rules.some((rule) => {
|
|
215
|
+
if (typeof rule === "function") {
|
|
216
|
+
return rule.constructor.name === "AsyncFunction";
|
|
217
|
+
} else {
|
|
218
|
+
return rule._async;
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
const _params = rules.map((rule) => {
|
|
222
|
+
if (typeof rule === "function") {
|
|
223
|
+
return null;
|
|
224
|
+
} else {
|
|
225
|
+
const $params = rule._params;
|
|
226
|
+
if (!$params?.length) {
|
|
227
|
+
return [null];
|
|
228
|
+
} else {
|
|
229
|
+
return $params;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}).flat().filter((param) => !!param);
|
|
233
|
+
function computeRules(rules2, value, ...params) {
|
|
234
|
+
const $rules = [];
|
|
235
|
+
let paramIndex = 0;
|
|
236
|
+
for (let rule of rules2) {
|
|
237
|
+
if (typeof rule === "function") {
|
|
238
|
+
$rules.push(rule(value));
|
|
239
|
+
paramIndex++;
|
|
240
|
+
} else {
|
|
241
|
+
const paramsLength = rule._params?.length ?? 0;
|
|
242
|
+
$rules.push(rule.validator(value, ...params.slice(paramIndex, paramsLength)));
|
|
243
|
+
if (paramsLength) {
|
|
244
|
+
paramIndex += paramsLength;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return $rules;
|
|
249
|
+
}
|
|
250
|
+
function computeMetadata(results) {
|
|
251
|
+
const isAnyResultMetaData = results.some((s) => typeof s !== "boolean");
|
|
252
|
+
if (isAnyResultMetaData) {
|
|
253
|
+
return {
|
|
254
|
+
$valid: results.every((result) => {
|
|
255
|
+
if (typeof result === "boolean") {
|
|
256
|
+
return !!result;
|
|
257
|
+
}
|
|
258
|
+
return result.$valid;
|
|
259
|
+
}),
|
|
260
|
+
...results.reduce((acc, result) => {
|
|
261
|
+
if (typeof result === "boolean") {
|
|
262
|
+
return acc;
|
|
263
|
+
}
|
|
264
|
+
const { $valid, ...rest } = result;
|
|
265
|
+
return { ...acc, ...rest };
|
|
266
|
+
}, {})
|
|
267
|
+
};
|
|
268
|
+
} else {
|
|
269
|
+
return results.every((result) => !!result);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
let validator;
|
|
273
|
+
if (!!rules.length) {
|
|
274
|
+
validator = isAnyRuleAsync ? async (value, ...params) => {
|
|
275
|
+
const results = await Promise.all(computeRules(rules, value, ...params));
|
|
276
|
+
return computeMetadata(results);
|
|
277
|
+
} : (value, ...params) => {
|
|
278
|
+
const $rules = computeRules(rules, value, ...params);
|
|
279
|
+
return computeMetadata($rules);
|
|
280
|
+
};
|
|
281
|
+
} else {
|
|
282
|
+
validator = (value) => {
|
|
283
|
+
return false;
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
const newRule = core.createRule({
|
|
287
|
+
type: "and",
|
|
288
|
+
validator,
|
|
289
|
+
message: "The value does not match all of the provided validators"
|
|
290
|
+
});
|
|
291
|
+
newRule._params = _params;
|
|
292
|
+
return newRule;
|
|
293
|
+
}
|
|
294
|
+
function or(...rules) {
|
|
295
|
+
const isAnyRuleAsync = rules.some((rule) => {
|
|
296
|
+
if (typeof rule === "function") {
|
|
297
|
+
return rule.constructor.name === "AsyncFunction";
|
|
298
|
+
} else {
|
|
299
|
+
return rule._async;
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
const params = rules.map((rule) => {
|
|
303
|
+
if (typeof rule === "function") {
|
|
304
|
+
return null;
|
|
305
|
+
} else {
|
|
306
|
+
return rule._params;
|
|
307
|
+
}
|
|
308
|
+
}).flat().filter((param) => !!param);
|
|
309
|
+
function computeRules(rules2, value, ...params2) {
|
|
310
|
+
const $rules = [];
|
|
311
|
+
let paramIndex = 0;
|
|
312
|
+
for (let rule of rules2) {
|
|
313
|
+
if (typeof rule === "function") {
|
|
314
|
+
$rules.push(rule(value));
|
|
315
|
+
paramIndex++;
|
|
316
|
+
} else {
|
|
317
|
+
const paramsLength = rule._params?.length ?? 0;
|
|
318
|
+
$rules.push(rule.validator(value, ...params2.slice(paramIndex, paramsLength)));
|
|
319
|
+
if (paramsLength) {
|
|
320
|
+
paramIndex += paramsLength;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return $rules;
|
|
325
|
+
}
|
|
326
|
+
function computeMetadata(results) {
|
|
327
|
+
const isAnyResultMetaData = results.some((s) => typeof s !== "boolean");
|
|
328
|
+
if (isAnyResultMetaData) {
|
|
329
|
+
return {
|
|
330
|
+
$valid: results.some((result) => {
|
|
331
|
+
if (typeof result === "boolean") {
|
|
332
|
+
return !!result;
|
|
333
|
+
}
|
|
334
|
+
return result.$valid;
|
|
335
|
+
}),
|
|
336
|
+
...results.reduce((acc, result) => {
|
|
337
|
+
if (typeof result === "boolean") {
|
|
338
|
+
return acc;
|
|
339
|
+
}
|
|
340
|
+
const { $valid, ...rest } = result;
|
|
341
|
+
return { ...acc, ...rest };
|
|
342
|
+
}, {})
|
|
343
|
+
};
|
|
344
|
+
} else {
|
|
345
|
+
return results.some((result) => !!result);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
const validator = isAnyRuleAsync ? async (value, ...params2) => {
|
|
349
|
+
const results = await Promise.all(computeRules(rules, value, ...params2));
|
|
350
|
+
return computeMetadata(results);
|
|
351
|
+
} : (value, ...params2) => {
|
|
352
|
+
const $rules = computeRules(rules, value, ...params2);
|
|
353
|
+
return computeMetadata($rules);
|
|
354
|
+
};
|
|
355
|
+
const newRule = core.createRule({
|
|
356
|
+
type: "or",
|
|
357
|
+
validator,
|
|
358
|
+
message: "The value does not match any of the provided validators"
|
|
359
|
+
});
|
|
360
|
+
newRule._params = params;
|
|
361
|
+
return newRule;
|
|
362
|
+
}
|
|
363
|
+
function not(rule, message) {
|
|
364
|
+
let _type;
|
|
365
|
+
let validator;
|
|
366
|
+
let newValidator;
|
|
367
|
+
let _params;
|
|
368
|
+
let _async;
|
|
369
|
+
if (typeof rule === "function") {
|
|
370
|
+
validator = rule;
|
|
371
|
+
_async = rule.constructor.name === "AsyncFunction";
|
|
372
|
+
} else {
|
|
373
|
+
({ _type, validator, _params } = rule);
|
|
374
|
+
_async = rule._async;
|
|
375
|
+
}
|
|
376
|
+
if (_async) {
|
|
377
|
+
newValidator = async (value, ...params) => {
|
|
378
|
+
if (ruleHelpers.isFilled(value)) {
|
|
379
|
+
const result = await validator(value, ...params);
|
|
380
|
+
return !result;
|
|
381
|
+
}
|
|
382
|
+
return true;
|
|
383
|
+
};
|
|
384
|
+
} else {
|
|
385
|
+
newValidator = (value, ...params) => {
|
|
386
|
+
if (ruleHelpers.isFilled(value)) {
|
|
387
|
+
return !validator(value, ...params);
|
|
388
|
+
}
|
|
389
|
+
return true;
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
const newRule = core.createRule({
|
|
393
|
+
type: "not",
|
|
394
|
+
validator: newValidator,
|
|
395
|
+
message: message ?? "Error"
|
|
396
|
+
});
|
|
397
|
+
newRule._params = _params;
|
|
398
|
+
return newRule;
|
|
399
|
+
}
|
|
400
|
+
var required = core.createRule({
|
|
401
|
+
type: "required",
|
|
402
|
+
validator: (value) => {
|
|
403
|
+
return ruleHelpers.isFilled(value);
|
|
404
|
+
},
|
|
405
|
+
message: "This field is required"
|
|
406
|
+
});
|
|
407
|
+
var maxLength = core.createRule({
|
|
408
|
+
type: "maxLength",
|
|
409
|
+
validator: (value, count) => {
|
|
410
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
|
|
411
|
+
if (ruleHelpers.isNumber(count)) {
|
|
412
|
+
return ruleHelpers.size(value) <= count;
|
|
413
|
+
}
|
|
414
|
+
console.warn(
|
|
415
|
+
`[maxLength] Value or parameter isn't a number, got value: ${value}, parameter: ${count}`
|
|
416
|
+
);
|
|
417
|
+
return false;
|
|
418
|
+
}
|
|
419
|
+
return true;
|
|
420
|
+
},
|
|
421
|
+
message: (value, { $params: [count] }) => {
|
|
422
|
+
if (Array.isArray(value)) {
|
|
423
|
+
return `This list should have maximum ${count} items`;
|
|
424
|
+
}
|
|
425
|
+
return `The maximum length allowed is ${count}`;
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
var requiredIf = core.createRule({
|
|
429
|
+
type: "required",
|
|
430
|
+
validator(value, condition) {
|
|
431
|
+
if (condition) {
|
|
432
|
+
return ruleHelpers.isFilled(value);
|
|
433
|
+
}
|
|
434
|
+
return true;
|
|
435
|
+
},
|
|
436
|
+
message: "This field is required",
|
|
437
|
+
active(_, { $params: [condition] }) {
|
|
438
|
+
return condition;
|
|
439
|
+
}
|
|
440
|
+
});
|
|
441
|
+
var alphaRegex = /^[a-zA-Z]*$/;
|
|
442
|
+
var alpha = core.createRule({
|
|
443
|
+
type: "alpha",
|
|
444
|
+
validator(value) {
|
|
445
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
446
|
+
return true;
|
|
447
|
+
}
|
|
448
|
+
return ruleHelpers.regex(value, alphaRegex);
|
|
449
|
+
},
|
|
450
|
+
message: "The value is not alphabetical"
|
|
451
|
+
});
|
|
452
|
+
var alphaNumRegex = /^[a-zA-Z0-9]*$/;
|
|
453
|
+
var alphaNum = core.createRule({
|
|
454
|
+
type: "alpha",
|
|
455
|
+
validator(value) {
|
|
456
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
return ruleHelpers.regex(value, alphaNumRegex);
|
|
460
|
+
},
|
|
461
|
+
message: "The value must be alpha-numeric"
|
|
462
|
+
});
|
|
463
|
+
var between = core.createRule({
|
|
464
|
+
type: "between",
|
|
465
|
+
validator: (value, min, max) => {
|
|
466
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(min) && ruleHelpers.isFilled(max)) {
|
|
467
|
+
const tValue = ruleHelpers.toNumber(value);
|
|
468
|
+
const tMin = ruleHelpers.toNumber(min);
|
|
469
|
+
const tMax = ruleHelpers.toNumber(max);
|
|
470
|
+
if (ruleHelpers.isNumber(tValue) && ruleHelpers.isNumber(tMin) && ruleHelpers.isNumber(tMax)) {
|
|
471
|
+
return tValue >= tMin && tValue <= tMax;
|
|
472
|
+
}
|
|
473
|
+
console.warn(
|
|
474
|
+
`[between] Value or parameters aren't numbers, got value: ${value}, min: ${min}, max: ${max}`
|
|
475
|
+
);
|
|
476
|
+
return false;
|
|
477
|
+
}
|
|
478
|
+
return true;
|
|
479
|
+
},
|
|
480
|
+
message: (_, { $params: [min, max] }) => {
|
|
481
|
+
return `The value must be between ${min} and ${max}`;
|
|
482
|
+
}
|
|
483
|
+
});
|
|
484
|
+
var decimalRegex = /^[-]?\d*(\.\d+)?$/;
|
|
485
|
+
var decimal = core.createRule({
|
|
486
|
+
type: "decimal",
|
|
487
|
+
validator(value) {
|
|
488
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
489
|
+
return true;
|
|
490
|
+
}
|
|
491
|
+
return ruleHelpers.regex(value, decimalRegex);
|
|
492
|
+
},
|
|
493
|
+
message: "Value must be decimal"
|
|
494
|
+
});
|
|
495
|
+
var emailRegex = /^(?:[A-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]{2,}(?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i;
|
|
496
|
+
var email = core.createRule({
|
|
497
|
+
type: "email",
|
|
498
|
+
validator(value) {
|
|
499
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
500
|
+
return true;
|
|
501
|
+
}
|
|
502
|
+
return ruleHelpers.regex(value, emailRegex);
|
|
503
|
+
},
|
|
504
|
+
message: "Value must be an valid email address"
|
|
505
|
+
});
|
|
506
|
+
var integerRegex = /(^[0-9]*$)|(^-[0-9]+$)/;
|
|
507
|
+
var integer = core.createRule({
|
|
508
|
+
type: "integer",
|
|
509
|
+
validator(value) {
|
|
510
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
511
|
+
return true;
|
|
512
|
+
}
|
|
513
|
+
return ruleHelpers.regex(value, integerRegex);
|
|
514
|
+
},
|
|
515
|
+
message: "Value must be an integer"
|
|
516
|
+
});
|
|
517
|
+
var maxValue = core.createRule({
|
|
518
|
+
type: "maxValue",
|
|
519
|
+
validator: (value, count) => {
|
|
520
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
|
|
521
|
+
if (ruleHelpers.isNumber(count) && ruleHelpers.isNumber(value)) {
|
|
522
|
+
return value <= count;
|
|
523
|
+
}
|
|
524
|
+
console.warn(
|
|
525
|
+
`[maxValue] Value or parameter isn't a number, got value: ${value}, parameter: ${count}`
|
|
526
|
+
);
|
|
527
|
+
return false;
|
|
528
|
+
}
|
|
529
|
+
return true;
|
|
530
|
+
},
|
|
531
|
+
message: (_, { $params: [count] }) => {
|
|
532
|
+
return `The maximum value allowed is ${count}`;
|
|
533
|
+
}
|
|
534
|
+
});
|
|
535
|
+
var minLength = core.createRule({
|
|
536
|
+
type: "minLength",
|
|
537
|
+
validator: (value, count) => {
|
|
538
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
|
|
539
|
+
if (ruleHelpers.isNumber(count)) {
|
|
540
|
+
return ruleHelpers.size(value) >= count;
|
|
541
|
+
}
|
|
542
|
+
console.warn(`[minLength] Parameter isn't a number, got parameter: ${count}`);
|
|
543
|
+
return false;
|
|
544
|
+
}
|
|
545
|
+
return true;
|
|
546
|
+
},
|
|
547
|
+
message: (value, { $params: [count] }) => {
|
|
548
|
+
if (Array.isArray(value)) {
|
|
549
|
+
return `This list should have at least ${count} items`;
|
|
550
|
+
}
|
|
551
|
+
return `This field should be at least ${count} characters long`;
|
|
552
|
+
}
|
|
553
|
+
});
|
|
554
|
+
var minValue = core.createRule({
|
|
555
|
+
type: "minValue",
|
|
556
|
+
validator: (value, count) => {
|
|
557
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
|
|
558
|
+
if (ruleHelpers.isNumber(count) && ruleHelpers.isNumber(value)) {
|
|
559
|
+
return value >= count;
|
|
560
|
+
}
|
|
561
|
+
console.warn(
|
|
562
|
+
`[minValue] Value or parameter isn't a number, got value: ${value}, parameter: ${count}`
|
|
563
|
+
);
|
|
564
|
+
return false;
|
|
565
|
+
}
|
|
566
|
+
return true;
|
|
567
|
+
},
|
|
568
|
+
message: (_, { $params: [count] }) => {
|
|
569
|
+
return `The minimum value allowed is ${count}`;
|
|
570
|
+
}
|
|
571
|
+
});
|
|
572
|
+
var exactLength = core.createRule({
|
|
573
|
+
type: "exactLength",
|
|
574
|
+
validator: (value, count) => {
|
|
575
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
|
|
576
|
+
if (ruleHelpers.isNumber(count)) {
|
|
577
|
+
return ruleHelpers.size(value) === count;
|
|
578
|
+
}
|
|
579
|
+
console.warn(`[minLength] Parameter isn't a number, got parameter: ${count}`);
|
|
580
|
+
return false;
|
|
581
|
+
}
|
|
582
|
+
return true;
|
|
583
|
+
},
|
|
584
|
+
message: (_, { $params: [count] }) => {
|
|
585
|
+
return `This field should be exactly ${count} characters long`;
|
|
586
|
+
}
|
|
587
|
+
});
|
|
588
|
+
var numericRegex = /^\d*(\.\d+)?$/;
|
|
589
|
+
var numeric = core.createRule({
|
|
590
|
+
type: "numeric",
|
|
591
|
+
validator(value) {
|
|
592
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
593
|
+
return true;
|
|
594
|
+
}
|
|
595
|
+
return ruleHelpers.regex(value, numericRegex);
|
|
596
|
+
},
|
|
597
|
+
message: "This field must be numeric"
|
|
598
|
+
});
|
|
599
|
+
var requiredUnless = core.createRule({
|
|
600
|
+
type: "required",
|
|
601
|
+
validator(value, condition) {
|
|
602
|
+
if (!condition) {
|
|
603
|
+
return ruleHelpers.isFilled(value);
|
|
604
|
+
}
|
|
605
|
+
return true;
|
|
606
|
+
},
|
|
607
|
+
message: "This field is required",
|
|
608
|
+
active(_, { $params: [condition] }) {
|
|
609
|
+
return !condition;
|
|
610
|
+
}
|
|
611
|
+
});
|
|
612
|
+
var sameAs = core.createRule({
|
|
613
|
+
type: "sameAs",
|
|
614
|
+
validator(value, target) {
|
|
615
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
616
|
+
return true;
|
|
617
|
+
}
|
|
618
|
+
return value === target;
|
|
619
|
+
},
|
|
620
|
+
message(_, { $params: [target] }) {
|
|
621
|
+
return `Value must be equal to "${target}"`;
|
|
622
|
+
}
|
|
623
|
+
});
|
|
624
|
+
var urlRegex = /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i;
|
|
625
|
+
var url = core.createRule({
|
|
626
|
+
type: "url",
|
|
627
|
+
validator(value) {
|
|
628
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
629
|
+
return true;
|
|
630
|
+
}
|
|
631
|
+
return ruleHelpers.regex(value, urlRegex);
|
|
632
|
+
},
|
|
633
|
+
message: "The value is not a valid URL address"
|
|
634
|
+
});
|
|
635
|
+
var dateAfter = core.createRule({
|
|
636
|
+
type: "dateAfter",
|
|
637
|
+
validator: (value, after) => {
|
|
638
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(after)) {
|
|
639
|
+
if (ruleHelpers.isDate(value) && ruleHelpers.isDate(after)) {
|
|
640
|
+
const result = ruleHelpers.toDate(value).getTime() > ruleHelpers.toDate(after).getTime();
|
|
641
|
+
if (result) {
|
|
642
|
+
return true;
|
|
643
|
+
}
|
|
644
|
+
return { $valid: false, error: "date-not-after" };
|
|
645
|
+
}
|
|
646
|
+
return { $valid: false, error: "value-or-paramater-not-a-date" };
|
|
647
|
+
}
|
|
648
|
+
return true;
|
|
649
|
+
},
|
|
650
|
+
message: (_, { $params: [after] }) => {
|
|
651
|
+
return `The date must be after ${after}`;
|
|
652
|
+
}
|
|
653
|
+
});
|
|
654
|
+
var dateBefore = core.createRule({
|
|
655
|
+
type: "dateBefore",
|
|
656
|
+
validator: (value, before) => {
|
|
657
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(before)) {
|
|
658
|
+
if (ruleHelpers.isDate(value) && ruleHelpers.isDate(before)) {
|
|
659
|
+
const result = ruleHelpers.toDate(value).getTime() < ruleHelpers.toDate(before).getTime();
|
|
660
|
+
if (result) {
|
|
661
|
+
return true;
|
|
662
|
+
}
|
|
663
|
+
return { $valid: false, error: "date-not-before" };
|
|
664
|
+
}
|
|
665
|
+
return { $valid: false, error: "value-or-paramater-not-a-date" };
|
|
666
|
+
}
|
|
667
|
+
return true;
|
|
668
|
+
},
|
|
669
|
+
message: (_, { $params: [before], error }) => {
|
|
670
|
+
if (error === "value-or-paramater-not-a-date") {
|
|
671
|
+
return "The fields must be Dates";
|
|
672
|
+
}
|
|
673
|
+
return `The date must be before ${before}`;
|
|
674
|
+
}
|
|
675
|
+
});
|
|
676
|
+
var dateBetween = core.createRule({
|
|
677
|
+
type: "dateBetween",
|
|
678
|
+
validator: (value, before, after) => {
|
|
679
|
+
if (ruleHelpers.isDate(value) && ruleHelpers.isDate(before) && ruleHelpers.isDate(after)) {
|
|
680
|
+
return ruleHelpers.toDate(value).getTime() > ruleHelpers.toDate(before).getTime() && ruleHelpers.toDate(value).getTime() < ruleHelpers.toDate(after).getTime();
|
|
681
|
+
}
|
|
682
|
+
return true;
|
|
683
|
+
},
|
|
684
|
+
message: (_, { $params: [before, after] }) => {
|
|
685
|
+
return `The date must be between ${before} and ${after}`;
|
|
686
|
+
}
|
|
687
|
+
});
|
|
688
|
+
function nibbleValid(nibble) {
|
|
689
|
+
if (nibble.length > 3 || nibble.length === 0) {
|
|
690
|
+
return false;
|
|
691
|
+
}
|
|
692
|
+
if (nibble[0] === "0" && nibble !== "0") {
|
|
693
|
+
return false;
|
|
694
|
+
}
|
|
695
|
+
if (!nibble.match(/^\d+$/)) {
|
|
696
|
+
return false;
|
|
697
|
+
}
|
|
698
|
+
const numeric2 = +nibble | 0;
|
|
699
|
+
return numeric2 >= 0 && numeric2 <= 255;
|
|
700
|
+
}
|
|
701
|
+
var ipAddress = core.createRule({
|
|
702
|
+
type: "ipAddress",
|
|
703
|
+
validator(value) {
|
|
704
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
705
|
+
return true;
|
|
706
|
+
}
|
|
707
|
+
if (typeof value !== "string") {
|
|
708
|
+
return false;
|
|
709
|
+
}
|
|
710
|
+
const nibbles = value.split(".");
|
|
711
|
+
return nibbles.length === 4 && nibbles.every(nibbleValid);
|
|
712
|
+
},
|
|
713
|
+
message: "The value is not a valid IP address"
|
|
714
|
+
});
|
|
715
|
+
var macAddress = core.createRule({
|
|
716
|
+
type: "macAddress",
|
|
717
|
+
validator(value, separator = ":") {
|
|
718
|
+
if (ruleHelpers.isEmpty(value)) {
|
|
719
|
+
return true;
|
|
720
|
+
}
|
|
721
|
+
if (typeof value !== "string") {
|
|
722
|
+
return false;
|
|
723
|
+
}
|
|
724
|
+
const parts = typeof separator === "string" && separator !== "" ? value.split(separator) : value.length === 12 || value.length === 16 ? value.match(/.{2}/g) : null;
|
|
725
|
+
return parts !== null && (parts.length === 6 || parts.length === 8) && parts.every(hexValid);
|
|
726
|
+
},
|
|
727
|
+
message: "The value is not a valid MAC Address"
|
|
728
|
+
});
|
|
729
|
+
var hexValid = (hex) => hex.toLowerCase().match(/^[0-9a-f]{2}$/);
|
|
730
|
+
var checked = core.createRule({
|
|
731
|
+
type: "checked",
|
|
732
|
+
validator: (value) => {
|
|
733
|
+
if (ruleHelpers.isFilled(value)) {
|
|
734
|
+
return value === true;
|
|
735
|
+
}
|
|
736
|
+
return true;
|
|
737
|
+
},
|
|
738
|
+
message: "This field must be checked"
|
|
739
|
+
});
|
|
740
|
+
var contains = core.createRule({
|
|
741
|
+
type: "contains",
|
|
742
|
+
validator(value, part) {
|
|
743
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(part)) {
|
|
744
|
+
return value.includes(part);
|
|
745
|
+
}
|
|
746
|
+
return true;
|
|
747
|
+
},
|
|
748
|
+
message(_, { $params: [part] }) {
|
|
749
|
+
return `Field must contain ${part}`;
|
|
750
|
+
}
|
|
751
|
+
});
|
|
752
|
+
var startsWith = core.createRule({
|
|
753
|
+
type: "startsWith",
|
|
754
|
+
validator(value, part) {
|
|
755
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(part)) {
|
|
756
|
+
return value.startsWith(part);
|
|
757
|
+
}
|
|
758
|
+
return true;
|
|
759
|
+
},
|
|
760
|
+
message(_, { $params: [part] }) {
|
|
761
|
+
return `Field must end with ${part}`;
|
|
762
|
+
}
|
|
763
|
+
});
|
|
764
|
+
var endsWith = core.createRule({
|
|
765
|
+
type: "endsWith",
|
|
766
|
+
validator(value, part) {
|
|
767
|
+
if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(part)) {
|
|
768
|
+
return value.endsWith(part);
|
|
769
|
+
}
|
|
770
|
+
return true;
|
|
771
|
+
},
|
|
772
|
+
message(_, { $params: [part] }) {
|
|
773
|
+
return `Field must end with ${part}`;
|
|
774
|
+
}
|
|
775
|
+
});
|
|
776
|
+
var regex2 = core.createRule({
|
|
777
|
+
type: "regex",
|
|
778
|
+
validator(value, regexp) {
|
|
779
|
+
if (ruleHelpers.isFilled(value)) {
|
|
780
|
+
return ruleHelpers.regex(value, regexp);
|
|
781
|
+
}
|
|
782
|
+
return true;
|
|
783
|
+
},
|
|
784
|
+
message: "This field does not match the required pattern"
|
|
785
|
+
});
|
|
786
|
+
|
|
787
|
+
exports.alpha = alpha;
|
|
788
|
+
exports.alphaNum = alphaNum;
|
|
789
|
+
exports.and = and;
|
|
790
|
+
exports.applyIf = applyIf;
|
|
791
|
+
exports.between = between;
|
|
792
|
+
exports.checked = checked;
|
|
793
|
+
exports.contains = contains;
|
|
794
|
+
exports.dateAfter = dateAfter;
|
|
795
|
+
exports.dateBefore = dateBefore;
|
|
796
|
+
exports.dateBetween = dateBetween;
|
|
797
|
+
exports.decimal = decimal;
|
|
798
|
+
exports.email = email;
|
|
799
|
+
exports.endsWith = endsWith;
|
|
800
|
+
exports.exactLength = exactLength;
|
|
801
|
+
exports.integer = integer;
|
|
802
|
+
exports.ipAddress = ipAddress;
|
|
803
|
+
exports.macAddress = macAddress;
|
|
804
|
+
exports.maxLength = maxLength;
|
|
805
|
+
exports.maxValue = maxValue;
|
|
806
|
+
exports.minLength = minLength;
|
|
807
|
+
exports.minValue = minValue;
|
|
808
|
+
exports.not = not;
|
|
809
|
+
exports.numeric = numeric;
|
|
810
|
+
exports.or = or;
|
|
811
|
+
exports.regex = regex2;
|
|
812
|
+
exports.required = required;
|
|
813
|
+
exports.requiredIf = requiredIf;
|
|
814
|
+
exports.requiredUnless = requiredUnless;
|
|
815
|
+
exports.ruleHelpers = ruleHelpers;
|
|
816
|
+
exports.sameAs = sameAs;
|
|
817
|
+
exports.startsWith = startsWith;
|
|
818
|
+
exports.url = url;
|
|
819
|
+
exports.withAsync = withAsync;
|
|
820
|
+
exports.withMessage = withMessage;
|
|
821
|
+
exports.withParams = withParams;
|
|
822
|
+
//# sourceMappingURL=index.cjs.map
|
|
823
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9oZWxwZXJzL3dpdGhNZXNzYWdlLnRzIiwiLi4vc3JjL2hlbHBlcnMvd2l0aEFzeW5jLnRzIiwiLi4vc3JjL2hlbHBlcnMvd2l0aFBhcmFtcy50cyIsIi4uL3NyYy9oZWxwZXJzL2FwcGx5SWYudHMiLCIuLi9zcmMvaGVscGVycy9ydWxlSGVscGVycy9pc0VtcHR5LnRzIiwiLi4vc3JjL2hlbHBlcnMvcnVsZUhlbHBlcnMvaXNGaWxsZWQudHMiLCIuLi9zcmMvaGVscGVycy9ydWxlSGVscGVycy9pc051bWJlci50cyIsIi4uL3NyYy9oZWxwZXJzL3J1bGVIZWxwZXJzL3JlZ2V4LnRzIiwiLi4vc3JjL2hlbHBlcnMvcnVsZUhlbHBlcnMvc2l6ZS50cyIsIi4uL3NyYy9oZWxwZXJzL3J1bGVIZWxwZXJzL2lzRGF0ZS50cyIsIi4uL3NyYy9oZWxwZXJzL3J1bGVIZWxwZXJzL3RvRGF0ZS50cyIsIi4uL3NyYy9oZWxwZXJzL3J1bGVIZWxwZXJzL3RvTnVtYmVyLnRzIiwiLi4vc3JjL2hlbHBlcnMvcnVsZUhlbHBlcnMvaW5kZXgudHMiLCIuLi9zcmMvaGVscGVycy9hbmQudHMiLCIuLi9zcmMvaGVscGVycy9vci50cyIsIi4uL3NyYy9oZWxwZXJzL25vdC50cyIsIi4uL3NyYy9ydWxlcy9yZXF1aXJlZC50cyIsIi4uL3NyYy9ydWxlcy9tYXhMZW5ndGgudHMiLCIuLi9zcmMvcnVsZXMvcmVxdWlyZWRJZi50cyIsIi4uL3NyYy9ydWxlcy9hbHBoYS50cyIsIi4uL3NyYy9ydWxlcy9hbHBoYU51bS50cyIsIi4uL3NyYy9ydWxlcy9iZXR3ZWVuLnRzIiwiLi4vc3JjL3J1bGVzL2RlY2ltYWwudHMiLCIuLi9zcmMvcnVsZXMvZW1haWwudHMiLCIuLi9zcmMvcnVsZXMvaW50ZWdlci50cyIsIi4uL3NyYy9ydWxlcy9tYXhWYWx1ZS50cyIsIi4uL3NyYy9ydWxlcy9taW5MZW5ndGgudHMiLCIuLi9zcmMvcnVsZXMvbWluVmFsdWUudHMiLCIuLi9zcmMvcnVsZXMvZXhhY3RMZW5ndGgudHMiLCIuLi9zcmMvcnVsZXMvbnVtZXJpYy50cyIsIi4uL3NyYy9ydWxlcy9yZXF1aXJlZFVubGVzcy50cyIsIi4uL3NyYy9ydWxlcy9zYW1lQXMudHMiLCIuLi9zcmMvcnVsZXMvdXJsLnRzIiwiLi4vc3JjL3J1bGVzL2RhdGVBZnRlci50cyIsIi4uL3NyYy9ydWxlcy9kYXRlQmVmb3JlLnRzIiwiLi4vc3JjL3J1bGVzL2RhdGVCZXR3ZWVuLnRzIiwiLi4vc3JjL3J1bGVzL2lwQWRkcmVzcy50cyIsIi4uL3NyYy9ydWxlcy9tYWNBZGRyZXNzLnRzIiwiLi4vc3JjL3J1bGVzL2NoZWNrZWQudHMiLCIuLi9zcmMvcnVsZXMvY29udGFpbnMudHMiLCIuLi9zcmMvcnVsZXMvc3RhcnRzV2l0aC50cyIsIi4uL3NyYy9ydWxlcy9lbmRzV2l0aC50cyIsIi4uL3NyYy9ydWxlcy9yZWdleC50cyJdLCJuYW1lcyI6WyJJbnRlcm5hbFJ1bGVUeXBlIiwiY3JlYXRlUnVsZSIsInVud3JhcFJ1bGVQYXJhbWV0ZXJzIiwidW5yZWYiLCJydWxlcyIsInBhcmFtcyIsIm51bWVyaWMiLCJyZWdleCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBcURPLFNBQVMsV0FBQSxDQUNkLE1BQ0EsVUFLNkYsRUFBQTtBQUM3RixFQUFJLElBQUEsS0FBQTtBQUNKLEVBQUksSUFBQSxTQUFBO0FBQ0osRUFBSSxJQUFBLE9BQUE7QUFJSixFQUFJLElBQUEsT0FBQTtBQUVKLEVBQUEsSUFBSSxPQUFPLElBQUEsS0FBUyxVQUFjLElBQUEsRUFBRSxnQkFBZ0IsSUFBTyxDQUFBLEVBQUE7QUFDekQsSUFBQSxLQUFBLEdBQVFBLHFCQUFpQixDQUFBLE1BQUE7QUFDekIsSUFBWSxTQUFBLEdBQUEsSUFBQTtBQUFBLEdBQ1AsTUFBQTtBQUNMLElBQUEsQ0FBQyxFQUFFLEtBQUEsRUFBTyxTQUFXLEVBQUEsT0FBQSxFQUFTLFNBQVksR0FBQSxJQUFBO0FBQUE7QUFHNUMsRUFBQSxNQUFNLFVBQVVDLGVBQVcsQ0FBQTtBQUFB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LENBQVksUUFBUyxDQUFBLEtBQUssQ0FBRyxFQUFBO0FBQy9CLE1BQU8sT0FBQSxXQUFBLENBQVksS0FBTSxDQUFBLEtBQUEsRUFBTyxNQUFNLENBQUE7QUFBQTtBQUV4QyxJQUFPLE9BQUEsSUFBQTtBQUFBLEdBQ1Q7QUFBQSxFQUNBLE9BQVMsRUFBQTtBQUNYLENBQUMiLCJmaWxlIjoiaW5kZXguY2pzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBJbmxpbmVSdWxlRGVjbGFyYXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb25Qcm9jZXNzb3IsXG4gIFJlZ2xlUnVsZURlZmluaXRpb25XaXRoTWV0YWRhdGFQcm9jZXNzb3IsXG4gIFJlZ2xlUnVsZU1ldGFkYXRhQ29uc3VtZXIsXG4gIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbixcbiAgUmVnbGVSdWxlUmF3LFxuICBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbixcbn0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSwgSW50ZXJuYWxSdWxlVHlwZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhNZXNzYWdlPFxuICBUVmFsdWUgZXh0ZW5kcyBhbnksXG4gIFRQYXJhbXMgZXh0ZW5kcyBhbnlbXSxcbiAgVFJldHVybiBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiB8IFByb21pc2U8UmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uPixcbiAgVEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IFRSZXR1cm4gZXh0ZW5kcyBQcm9taXNlPGFueT4gPyB0cnVlIDogZmFsc2UsXG4+KFxuICBydWxlOiBJbmxpbmVSdWxlRGVjbGFyYXRpb248VFZhbHVlLCBUUGFyYW1zLCBUUmV0dXJuPixcbiAgbmV3TWVzc2FnZTogUmVnbGVSdWxlRGVmaW5pdGlvbldpdGhNZXRhZGF0YVByb2Nlc3NvcjxcbiAgICBUVmFsdWUsXG4gICAgUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcjxUUGFyYW1zLCBUUmV0dXJuIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBNPiA/IE0gOiBUUmV0dXJuPixcbiAgICBzdHJpbmcgfCBzdHJpbmdbXVxuICA+XG4pOiBSZWdsZVJ1bGVEZWZpbml0aW9uPFRWYWx1ZSwgW10sIFRBc3luYywgVFJldHVybiBleHRlbmRzIFByb21pc2U8aW5mZXIgTT4gPyBNIDogVFJldHVybj47XG5leHBvcnQgZnVuY3Rpb24gd2l0aE1lc3NhZ2U8XG4gIFRWYWx1ZSBleHRlbmRzIGFueSxcbiAgVFBhcmFtcyBleHRlbmRzIGFueVtdLFxuICBUTWV0YWRhdGEgZXh0ZW5kcyBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG4gIFRSZXR1cm4gZXh0ZW5kcyBUTWV0YWRhdGEgfCBQcm9taXNlPFRNZXRhZGF0YT4sXG4gIFRBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBUUmV0dXJuIGV4dGVuZHMgUHJvbWlzZTxhbnk+ID8gdHJ1ZSA6IGZhbHNlLFxuPihcbiAgcnVsZTogUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb248VFZhbHVlLCBUUGFyYW1zLCBUQXN5bmMsIFRNZXRhZGF0YT4sXG4gIG5ld01lc3NhZ2U6IFJlZ2xlUnVsZURlZmluaXRpb25XaXRoTWV0YWRhdGFQcm9jZXNzb3I8XG4gICAgVFZhbHVlLFxuICAgIFJlZ2xlUnVsZU1ldGFkYXRhQ29uc3VtZXI8VFBhcmFtcywgVE1ldGFkYXRhPixcbiAgICBzdHJpbmcgfCBzdHJpbmdbXVxuICA+XG4pOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxUVmFsdWUsIFRQYXJhbXMsIFRBc3luYz47XG5leHBvcnQgZnVuY3Rpb24gd2l0aE1lc3NhZ2U8XG4gIFRWYWx1ZSBleHRlbmRzIGFueSxcbiAgVFBhcmFtcyBleHRlbmRzIGFueVtdLFxuICBUTWV0YWRhdGEgZXh0ZW5kcyBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG4gIFRSZXR1cm4gZXh0ZW5kcyBUTWV0YWRhdGEgfCBQcm9taXNlPFRNZXRhZGF0YT4sXG4gIFRBc3luYyBleHRlbmRzIGJvb2xlYW4sXG4+KFxuICBydWxlOiBSZWdsZVJ1bGVEZWZpbml0aW9uPFRWYWx1ZSwgVFBhcmFtcywgVEFzeW5jLCBUTWV0YWRhdGE+LFxuICBuZXdNZXNzYWdlOiBSZWdsZVJ1bGVEZWZpbml0aW9uV2l0aE1ldGFkYXRhUHJvY2Vzc29yPFxuICAgIFRWYWx1ZSxcbiAgICBSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyPFRQYXJhbXMsIFRNZXRhZGF0YT4sXG4gICAgc3RyaW5nIHwgc3RyaW5nW11cbiAgPlxuKTogUmVnbGVSdWxlRGVmaW5pdGlvbjxUVmFsdWUsIFRQYXJhbXMsIFRBc3luYywgVE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiB3aXRoTWVzc2FnZShcbiAgcnVsZTogUmVnbGVSdWxlUmF3PGFueSwgYW55LCBhbnksIGFueT4gfCBJbmxpbmVSdWxlRGVjbGFyYXRpb248YW55LCBhbnk+LFxuICBuZXdNZXNzYWdlOiBSZWdsZVJ1bGVEZWZpbml0aW9uV2l0aE1ldGFkYXRhUHJvY2Vzc29yPFxuICAgIGFueSxcbiAgICBSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyPGFueVtdLCBhbnk+LFxuICAgIHN0cmluZyB8IHN0cmluZ1tdXG4gID5cbik6IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uPGFueSwgYW55LCBhbnksIGFueT4gfCBSZWdsZVJ1bGVEZWZpbml0aW9uPGFueSwgYW55LCBhbnksIGFueT4ge1xuICBsZXQgX3R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHZhbGlkYXRvcjogUmVnbGVSdWxlRGVmaW5pdGlvblByb2Nlc3NvcjxhbnkgfCBQcm9taXNlPGFueT4+O1xuICBsZXQgX2FjdGl2ZTpcbiAgICB8IGJvb2xlYW5cbiAgICB8IFJlZ2xlUnVsZURlZmluaXRpb25XaXRoTWV0YWRhdGFQcm9jZXNzb3I8YW55LCBSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyPGFueSwgYW55PiwgYm9vbGVhbj5cbiAgICB8IHVuZGVmaW5lZDtcbiAgbGV0IF9wYXJhbXM6IGFueVtdIHwgdW5kZWZpbmVkO1xuXG4gIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhKCdfdmFsaWRhdG9yJyBpbiBydWxlKSkge1xuICAgIF90eXBlID0gSW50ZXJuYWxSdWxlVHlwZS5JbmxpbmU7XG4gICAgdmFsaWRhdG9yID0gcnVsZTtcbiAgfSBlbHNlIHtcbiAgICAoeyBfdHlwZSwgdmFsaWRhdG9yLCBfYWN0aXZlLCBfcGFyYW1zIH0gPSBydWxlKTtcbiAgfVxuXG4gIGNvbnN0IG5ld1J1bGUgPSBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiBfdHlwZSBhcyBhbnksXG4gICAgdmFsaWRhdG9yOiB2YWxpZGF0b3IgYXMgYW55LFxuICAgIGFjdGl2ZTogX2FjdGl2ZSBhcyBhbnksXG4gICAgbWVzc2FnZTogbmV3TWVzc2FnZSxcbiAgfSk7XG5cbiAgbmV3UnVsZS5fcGFyYW1zID0gX3BhcmFtcyBhcyBhbnk7XG4gIG5ld1J1bGUuX3BhdGNoZWQgPSB0cnVlO1xuXG4gIHJldHVybiBuZXdSdWxlO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUge1xuICBJbmxpbmVSdWxlRGVjbGFyYXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb24sXG4gIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbixcbiAgVW53cmFwUmVnbGVVbml2ZXJzYWxQYXJhbXMsXG59IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUsIEludGVybmFsUnVsZVR5cGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQXN5bmM8XG4gIFRWYWx1ZSxcbiAgVFBhcmFtcyBleHRlbmRzIChSZWY8dW5rbm93bj4gfCAoKCkgPT4gdW5rbm93bikpW10gPSBbXSxcbiAgVFJldHVybiBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiB8IFByb21pc2U8UmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uPiA9XG4gICAgfCBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb25cbiAgICB8IFByb21pc2U8UmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uPixcbiAgVE1ldGFkYXRhIGV4dGVuZHMgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uID0gVFJldHVybiBleHRlbmRzIFByb21pc2U8aW5mZXIgTT4gPyBNIDogVFJldHVybixcbj4oXG4gIHJ1bGU6IElubGluZVJ1bGVEZWNsYXJhdGlvbjxUVmFsdWUsIFRQYXJhbXMsIFRSZXR1cm4+LFxuICBkZXBzQXJyYXk/OiBbLi4uVFBhcmFtc11cbik6IFJlZ2xlUnVsZURlZmluaXRpb248VFZhbHVlLCBVbndyYXBSZWdsZVVuaXZlcnNhbFBhcmFtczxUUGFyYW1zPiwgdHJ1ZSwgVE1ldGFkYXRhPiB7XG4gIGNvbnN0IHZhbGlkYXRvciA9IGFzeW5jICh2YWx1ZTogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4ucGFyYW1zOiBhbnlbXSkgPT4ge1xuICAgIHJldHVybiBydWxlKHZhbHVlLCAuLi4ocGFyYW1zIGFzIGFueSkpO1xuICB9O1xuXG4gIGNvbnN0IG5ld1J1bGUgPSBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiBJbnRlcm5hbFJ1bGVUeXBlLkFzeW5jLFxuICAgIHZhbGlkYXRvcjogdmFsaWRhdG9yIGFzIGFueSxcbiAgICBtZXNzYWdlOiAnJyxcbiAgfSk7XG5cbiAgbmV3UnVsZS5fcGFyYW1zID0gZGVwc0FycmF5IGFzIGFueTtcblxuICByZXR1cm4gbmV3UnVsZSBhcyBhbnk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7XG4gIElubGluZVJ1bGVEZWNsYXJhdGlvbixcbiAgUmVnbGVSdWxlRGVmaW5pdGlvbixcbiAgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uLFxuICBVbndyYXBSZWdsZVVuaXZlcnNhbFBhcmFtcyxcbn0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSwgSW50ZXJuYWxSdWxlVHlwZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhQYXJhbXM8XG4gIFRWYWx1ZSxcbiAgVFBhcmFtcyBleHRlbmRzIChSZWY8dW5rbm93bj4gfCAoKCkgPT4gdW5rbm93bikpW10gPSBbXSxcbiAgVFJldHVybiBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiA9IFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbixcbiAgVE1ldGFkYXRhIGV4dGVuZHMgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uID0gVFJldHVybiBleHRlbmRzIFByb21pc2U8aW5mZXIgTT4gPyBNIDogVFJldHVybixcbj4oXG4gIHJ1bGU6IElubGluZVJ1bGVEZWNsYXJhdGlvbjxUVmFsdWUsIFRQYXJhbXMsIFRSZXR1cm4+LFxuICBkZXBzQXJyYXk6IFsuLi5UUGFyYW1zXVxuKTogUmVnbGVSdWxlRGVmaW5pdGlvbjxUVmFsdWUsIFVud3JhcFJlZ2xlVW5pdmVyc2FsUGFyYW1zPFRQYXJhbXM+LCB0cnVlLCBUTWV0YWRhdGE+IHtcbiAgY29uc3QgdmFsaWRhdG9yID0gKHZhbHVlOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5wYXJhbXM6IGFueVtdKSA9PiB7XG4gICAgcmV0dXJuIHJ1bGUodmFsdWUsIC4uLihwYXJhbXMgYXMgYW55KSk7XG4gIH07XG5cbiAgY29uc3QgbmV3UnVsZSA9IGNyZWF0ZVJ1bGUoe1xuICAgIHR5cGU6IEludGVybmFsUnVsZVR5cGUuSW5saW5lLFxuICAgIHZhbGlkYXRvcjogdmFsaWRhdG9yIGFzIGFueSxcbiAgICBtZXNzYWdlOiAnJyxcbiAgfSk7XG5cbiAgbmV3UnVsZS5fcGFyYW1zID0gZGVwc0FycmF5IGFzIGFueTtcblxuICByZXR1cm4gbmV3UnVsZSBhcyBhbnk7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIElubGluZVJ1bGVEZWNsYXJhdGlvbixcbiAgUmVnbGVSdWxlRGVmaW5pdGlvbixcbiAgUmVnbGVSdWxlRGVmaW5pdGlvblByb2Nlc3NvcixcbiAgUGFyYW1EZWNsLFxuICBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG4gIFJlZ2xlUnVsZU1ldGFkYXRhQ29uc3VtZXIsXG4gIFJlZ2xlUnVsZURlZmluaXRpb25XaXRoTWV0YWRhdGFQcm9jZXNzb3IsXG59IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUsIEludGVybmFsUnVsZVR5cGUsIHVud3JhcFJ1bGVQYXJhbWV0ZXJzIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlJZjxcbiAgVFZhbHVlIGV4dGVuZHMgYW55LFxuICBUUGFyYW1zIGV4dGVuZHMgYW55W10sXG4gIFRSZXR1cm4gZXh0ZW5kc1xuICAgIHwgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uXG4gICAgfCBQcm9taXNlPFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbj4gPSBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG4gIFRNZXRhZGF0YSBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiA9IFRSZXR1cm4gZXh0ZW5kcyBQcm9taXNlPGluZmVyIE0+ID8gTSA6IFRSZXR1cm4sXG4gIFRBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBUUmV0dXJuIGV4dGVuZHMgUHJvbWlzZTxhbnk+ID8gdHJ1ZSA6IGZhbHNlLFxuPihcbiAgX2NvbmRpdGlvbjogUGFyYW1EZWNsPGJvb2xlYW4+LFxuICBydWxlOlxuICAgIHwgSW5saW5lUnVsZURlY2xhcmF0aW9uPFRWYWx1ZSwgVFBhcmFtcywgVFJldHVybj5cbiAgICB8IFJlZ2xlUnVsZURlZmluaXRpb248VFZhbHVlLCBUUGFyYW1zLCBUQXN5bmMsIFRNZXRhZGF0YT5cbik6IFJlZ2xlUnVsZURlZmluaXRpb248VFZhbHVlLCBbXSwgVEFzeW5jLCBUTWV0YWRhdGE+IHtcbiAgbGV0IF90eXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCB2YWxpZGF0b3I6IFJlZ2xlUnVsZURlZmluaXRpb25Qcm9jZXNzb3I8YW55LCBhbnksIGFueT47XG4gIGxldCBfcGFyYW1zOiBhbnlbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IF9tZXNzYWdlOiBSZWdsZVJ1bGVEZWZpbml0aW9uV2l0aE1ldGFkYXRhUHJvY2Vzc29yPFxuICAgIGFueSxcbiAgICBSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyPGFueSwgYW55PixcbiAgICBzdHJpbmcgfCBzdHJpbmdbXVxuICA+ID0gJyc7XG5cbiAgaWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgX3R5cGUgPSBJbnRlcm5hbFJ1bGVUeXBlLklubGluZTtcbiAgICB2YWxpZGF0b3IgPSBydWxlO1xuICB9IGVsc2Uge1xuICAgICh7IF90eXBlLCB2YWxpZGF0b3IsIF9wYXJhbXMsIF9tZXNzYWdlIH0gPSBydWxlKTtcbiAgICBfcGFyYW1zPy5wdXNoKF9jb25kaXRpb24pO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV3VmFsaWRhdG9yKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgW2NvbmRpdGlvbl0gPSB1bndyYXBSdWxlUGFyYW1ldGVyczxbYm9vbGVhbl0+KFtfY29uZGl0aW9uXSk7XG4gICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIHZhbGlkYXRvcih2YWx1ZSwgLi4uYXJncyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV3QWN0aXZlKHZhbHVlOiBhbnksIG1ldGFkYXRhOiBSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyPGFueVtdLCBhbnk+KSB7XG4gICAgY29uc3QgW2NvbmRpdGlvbl0gPSB1bndyYXBSdWxlUGFyYW1ldGVyczxbYm9vbGVhbl0+KFtfY29uZGl0aW9uXSk7XG4gICAgcmV0dXJuIGNvbmRpdGlvbjtcbiAgfVxuXG4gIGNvbnN0IG5ld1J1bGUgPSBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiBfdHlwZSBhcyBhbnksXG4gICAgdmFsaWRhdG9yOiBuZXdWYWxpZGF0b3IgYXMgYW55LFxuICAgIGFjdGl2ZTogbmV3QWN0aXZlLFxuICAgIG1lc3NhZ2U6IF9tZXNzYWdlLFxuICB9KTtcblxuICBuZXdSdWxlLl9wYXJhbXMgPSBfcGFyYW1zIGFzIGFueTtcblxuICByZXR1cm4gbmV3UnVsZSBhcyBhbnk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEVtcHR5T2JqZWN0IH0gZnJvbSAndHlwZS1mZXN0JztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHwgdW5kZWZpbmVkIHwgW10gfCBFbXB0eU9iamVjdCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIC8vIGludmFsaWQgZGF0ZSB3b24ndCBwYXNzXG4gICAgcmV0dXJuIGlzTmFOKHZhbHVlLmdldFRpbWUoKSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA9PT0gMDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gIH1cbiAgcmV0dXJuICFTdHJpbmcodmFsdWUpLmxlbmd0aDtcbn1cbiIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tICcuL2lzRW1wdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNGaWxsZWQ8VCBleHRlbmRzIHVua25vd24+KHZhbHVlOiBUKTogdmFsdWUgaXMgTm9uTnVsbGFibGU8VD4ge1xuICByZXR1cm4gIWlzRW1wdHkodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnRyaW0oKSA6IHZhbHVlKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bWJlciB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSAnLi9pc0VtcHR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2V4KF92YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4uZXhwcjogUmVnRXhwW10pOiBib29sZWFuIHtcbiAgaWYgKGlzRW1wdHkoX3ZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHZhbHVlID0gdHlwZW9mIF92YWx1ZSA9PT0gJ251bWJlcicgPyBfdmFsdWUudG9TdHJpbmcoKSA6IF92YWx1ZTtcbiAgcmV0dXJuIGV4cHIuZXZlcnkoKHJlZykgPT4ge1xuICAgIHJlZy5sYXN0SW5kZXggPSAwO1xuICAgIHJldHVybiByZWcudGVzdCh2YWx1ZSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBNYXliZVJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyB1bnJlZiB9IGZyb20gJ3Z1ZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaXplKHZhbHVlOiBNYXliZVJlZjxzdHJpbmcgfCBhbnlbXSB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudW1iZXI+KTogbnVtYmVyIHtcbiAgY29uc3QgX3ZhbHVlID0gdW5yZWYodmFsdWUpO1xuICBpZiAoQXJyYXkuaXNBcnJheShfdmFsdWUpKSByZXR1cm4gX3ZhbHVlLmxlbmd0aDtcbiAgaWYgKHR5cGVvZiBfdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKF92YWx1ZSkubGVuZ3RoO1xuICB9XG4gIGlmICh0eXBlb2YgX3ZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIGlmIChpc05hTihfdmFsdWUpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIF92YWx1ZTtcbiAgfVxuICByZXR1cm4gU3RyaW5nKF92YWx1ZSkubGVuZ3RoO1xufVxuIiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gJy4vaXNFbXB0eSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRlIHtcbiAgaWYgKGlzRW1wdHkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHRyeSB7XG4gICAgbGV0IHBvc3NpYmxlRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHBvc3NpYmxlRGF0ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpKSB7XG4gICAgICBwb3NzaWJsZURhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgaWYgKGRhdGUudG9TdHJpbmcoKSA9PT0gJ0ludmFsaWQgRGF0ZScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcG9zc2libGVEYXRlID0gZGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuICEhcG9zc2libGVEYXRlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1heWJlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKGFyZ3VtZW50OiBNYXliZTxEYXRlIHwgbnVtYmVyIHwgc3RyaW5nPik6IERhdGUge1xuICBjb25zdCBhcmdTdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJndW1lbnQpO1xuICBpZiAoYXJndW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICB9IGVsc2UgaWYgKFxuICAgIGFyZ3VtZW50IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICh0eXBlb2YgYXJndW1lbnQgPT09ICdvYmplY3QnICYmIGFyZ1N0ciA9PT0gJ1tvYmplY3QgRGF0ZV0nKVxuICApIHtcbiAgICByZXR1cm4gbmV3IERhdGUoYXJndW1lbnQuZ2V0VGltZSgpKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdudW1iZXInIHx8IGFyZ1N0ciA9PT0gJ1tvYmplY3QgTnVtYmVyXScpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoYXJndW1lbnQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N0cmluZycgfHwgYXJnU3RyID09PSAnW29iamVjdCBTdHJpbmddJykge1xuICAgIHJldHVybiBuZXcgRGF0ZShhcmd1bWVudCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gIH1cbn1cbiIsIi8qKlxuICogQHJldHVybnMg4pqg77iPIFdhcm5pbmcsIHJldHVybmVkIHZhbHVlIGNhbiBiZSBOYU5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyPFQgZXh0ZW5kcyBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQ+KGFyZ3VtZW50OiBUKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gYXJndW1lbnQ7XG4gIH0gZWxzZSBpZiAoYXJndW1lbnQgIT0gbnVsbCkge1xuICAgIGNvbnN0IGlzUGFkZGVkID0gYXJndW1lbnQudHJpbSgpICE9PSBhcmd1bWVudDtcbiAgICBpZiAoaXNQYWRkZWQpIHtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIHJldHVybiArYXJndW1lbnQ7XG4gIH1cbiAgcmV0dXJuIE5hTjtcbn1cbiIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tICcuL2lzRW1wdHknO1xuaW1wb3J0IHsgaXNGaWxsZWQgfSBmcm9tICcuL2lzRmlsbGVkJztcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi9pc051bWJlcic7XG5pbXBvcnQgeyByZWdleCB9IGZyb20gJy4vcmVnZXgnO1xuaW1wb3J0IHsgc2l6ZSB9IGZyb20gJy4vc2l6ZSc7XG5pbXBvcnQgeyBpc0RhdGUgfSBmcm9tICcuL2lzRGF0ZSc7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tICcuL3RvRGF0ZSc7XG5pbXBvcnQgeyB0b051bWJlciB9IGZyb20gJy4vdG9OdW1iZXInO1xuXG5leHBvcnQgY29uc3QgcnVsZUhlbHBlcnMgPSB7XG4gIGlzRW1wdHksXG4gIGlzRmlsbGVkLFxuICBzaXplLFxuICByZWdleCxcbiAgaXNOdW1iZXIsXG4gIGlzRGF0ZSxcbiAgdG9EYXRlLFxuICB0b051bWJlcixcbn07XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEZvcm1SdWxlRGVjbGFyYXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb25Qcm9jZXNzb3IsXG59IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEV4dHJhY3RWYWx1ZUZyb21SdWxlcyxcbiAgRXh0cmFjdFBhcmFtc0Zyb21SdWxlcyxcbiAgVW53cmFwVHVwbGVzLFxuICBHdWVzc0FzeW5jRnJvbVJ1bGVzLFxuICBHdWVzc01ldGFkYXRhRnJvbVJ1bGVzLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhbmQ8VFJ1bGVzIGV4dGVuZHMgRm9ybVJ1bGVEZWNsYXJhdGlvbjxhbnksIGFueT5bXT4oXG4gIC4uLnJ1bGVzOiBbLi4uVFJ1bGVzXVxuKTogUmVnbGVSdWxlRGVmaW5pdGlvbjxcbiAgRXh0cmFjdFZhbHVlRnJvbVJ1bGVzPFRSdWxlcz5bbnVtYmVyXSxcbiAgVW53cmFwVHVwbGVzPEV4dHJhY3RQYXJhbXNGcm9tUnVsZXM8VFJ1bGVzPj4sXG4gIEd1ZXNzQXN5bmNGcm9tUnVsZXM8VFJ1bGVzPixcbiAgR3Vlc3NNZXRhZGF0YUZyb21SdWxlczxUUnVsZXM+XG4+IHtcbiAgY29uc3QgaXNBbnlSdWxlQXN5bmMgPSBydWxlcy5zb21lKChydWxlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcnVsZS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQXN5bmNGdW5jdGlvbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBydWxlLl9hc3luYztcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IF9wYXJhbXMgPSBydWxlc1xuICAgIC5tYXAoKHJ1bGUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0ICRwYXJhbXMgPSBydWxlLl9wYXJhbXM7XG4gICAgICAgIGlmICghJHBhcmFtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIFtudWxsXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJHBhcmFtcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgLmZsYXQoKVxuICAgIC5maWx0ZXIoKHBhcmFtKTogcGFyYW0gaXMgYW55ID0+ICEhcGFyYW0pO1xuXG4gIGZ1bmN0aW9uIGNvbXB1dGVSdWxlcyhydWxlczogWy4uLlRSdWxlc10sIHZhbHVlOiBhbnksIC4uLnBhcmFtczogYW55W10pIHtcbiAgICBjb25zdCAkcnVsZXM6IGFueVtdID0gW107XG4gICAgbGV0IHBhcmFtSW5kZXggPSAwO1xuXG4gICAgZm9yIChsZXQgcnVsZSBvZiBydWxlcykge1xuICAgICAgaWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICRydWxlcy5wdXNoKHJ1bGUodmFsdWUpKTtcbiAgICAgICAgcGFyYW1JbmRleCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGFyYW1zTGVuZ3RoID0gcnVsZS5fcGFyYW1zPy5sZW5ndGggPz8gMDtcbiAgICAgICAgJHJ1bGVzLnB1c2gocnVsZS52YWxpZGF0b3IodmFsdWUsIC4uLnBhcmFtcy5zbGljZShwYXJhbUluZGV4LCBwYXJhbXNMZW5ndGgpKSk7XG4gICAgICAgIGlmIChwYXJhbXNMZW5ndGgpIHtcbiAgICAgICAgICBwYXJhbUluZGV4ICs9IHBhcmFtc0xlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAkcnVsZXM7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wdXRlTWV0YWRhdGEoXG4gICAgcmVzdWx0czogKGJvb2xlYW4gfCB7ICR2YWxpZDogYm9vbGVhbjsgW3g6IHN0cmluZ106IGFueSB9KVtdXG4gICk6IGJvb2xlYW4gfCB7ICR2YWxpZDogYm9vbGVhbjsgW3g6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBpc0FueVJlc3VsdE1ldGFEYXRhID0gcmVzdWx0cy5zb21lKChzKSA9PiB0eXBlb2YgcyAhPT0gJ2Jvb2xlYW4nKTtcbiAgICBpZiAoaXNBbnlSZXN1bHRNZXRhRGF0YSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJHZhbGlkOiByZXN1bHRzLmV2ZXJ5KChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gISFyZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQuJHZhbGlkO1xuICAgICAgICB9KSxcbiAgICAgICAgLi4ucmVzdWx0cy5yZWR1Y2UoKGFjYywgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgeyAkdmFsaWQsIC4uLnJlc3QgfSA9IHJlc3VsdDtcbiAgICAgICAgICByZXR1cm4geyAuLi5hY2MsIC4uLnJlc3QgfTtcbiAgICAgICAgfSwge30pLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdHMuZXZlcnkoKHJlc3VsdCkgPT4gISFyZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIGxldCB2YWxpZGF0b3I6IFJlZ2xlUnVsZURlZmluaXRpb25Qcm9jZXNzb3I7XG5cbiAgaWYgKCEhcnVsZXMubGVuZ3RoKSB7XG4gICAgdmFsaWRhdG9yID0gaXNBbnlSdWxlQXN5bmNcbiAgICAgID8gYXN5bmMgKHZhbHVlOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5wYXJhbXM6IGFueVtdKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNvbXB1dGVSdWxlcyhydWxlcywgdmFsdWUsIC4uLnBhcmFtcykpO1xuICAgICAgICAgIHJldHVybiBjb21wdXRlTWV0YWRhdGEocmVzdWx0cyk7XG4gICAgICAgIH1cbiAgICAgIDogKHZhbHVlOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5wYXJhbXM6IGFueVtdKSA9PiB7XG4gICAgICAgICAgY29uc3QgJHJ1bGVzID0gY29tcHV0ZVJ1bGVzKHJ1bGVzLCB2YWx1ZSwgLi4ucGFyYW1zKTtcbiAgICAgICAgICByZXR1cm4gY29tcHV0ZU1ldGFkYXRhKCRydWxlcyk7XG4gICAgICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFsaWRhdG9yID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbmV3UnVsZSA9IGNyZWF0ZVJ1bGUoe1xuICAgIHR5cGU6ICdhbmQnLFxuICAgIHZhbGlkYXRvcjogdmFsaWRhdG9yIGFzIGFueSxcbiAgICBtZXNzYWdlOiAnVGhlIHZhbHVlIGRvZXMgbm90IG1hdGNoIGFsbCBvZiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9ycycsXG4gIH0pO1xuXG4gIG5ld1J1bGUuX3BhcmFtcyA9IF9wYXJhbXMgYXMgYW55O1xuXG4gIHJldHVybiBuZXdSdWxlIGFzIGFueTtcbn1cbiIsImltcG9ydCB0eXBlIHsgRm9ybVJ1bGVEZWNsYXJhdGlvbiwgUmVnbGVSdWxlRGVmaW5pdGlvbiB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEV4dHJhY3RQYXJhbXNGcm9tUnVsZXMsXG4gIEV4dHJhY3RWYWx1ZUZyb21SdWxlcyxcbiAgR3Vlc3NBc3luY0Zyb21SdWxlcyxcbiAgR3Vlc3NNZXRhZGF0YUZyb21SdWxlcyxcbiAgVW53cmFwVHVwbGVzLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvcjxUUnVsZXMgZXh0ZW5kcyBGb3JtUnVsZURlY2xhcmF0aW9uPGFueSwgYW55PltdPihcbiAgLi4ucnVsZXM6IFsuLi5UUnVsZXNdXG4pOiBSZWdsZVJ1bGVEZWZpbml0aW9uPFxuICBFeHRyYWN0VmFsdWVGcm9tUnVsZXM8VFJ1bGVzPltudW1iZXJdLFxuICBVbndyYXBUdXBsZXM8RXh0cmFjdFBhcmFtc0Zyb21SdWxlczxUUnVsZXM+PixcbiAgR3Vlc3NBc3luY0Zyb21SdWxlczxUUnVsZXM+LFxuICBHdWVzc01ldGFkYXRhRnJvbVJ1bGVzPFRSdWxlcz5cbj4ge1xuICBjb25zdCBpc0FueVJ1bGVBc3luYyA9IHJ1bGVzLnNvbWUoKHJ1bGUpID0+IHtcbiAgICBpZiAodHlwZW9mIHJ1bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBydWxlLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBc3luY0Z1bmN0aW9uJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJ1bGUuX2FzeW5jO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgcGFyYW1zID0gcnVsZXNcbiAgICAubWFwKChydWxlKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHJ1bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcnVsZS5fcGFyYW1zO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmZsYXQoKVxuICAgIC5maWx0ZXIoKHBhcmFtKTogcGFyYW0gaXMgYW55ID0+ICEhcGFyYW0pO1xuXG4gIGZ1bmN0aW9uIGNvbXB1dGVSdWxlcyhydWxlczogWy4uLlRSdWxlc10sIHZhbHVlOiBhbnksIC4uLnBhcmFtczogYW55W10pIHtcbiAgICBjb25zdCAkcnVsZXM6IGFueVtdID0gW107XG4gICAgbGV0IHBhcmFtSW5kZXggPSAwO1xuXG4gICAgZm9yIChsZXQgcnVsZSBvZiBydWxlcykge1xuICAgICAgaWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICRydWxlcy5wdXNoKHJ1bGUodmFsdWUpKTtcbiAgICAgICAgcGFyYW1JbmRleCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGFyYW1zTGVuZ3RoID0gcnVsZS5fcGFyYW1zPy5sZW5ndGggPz8gMDtcbiAgICAgICAgJHJ1bGVzLnB1c2gocnVsZS52YWxpZGF0b3IodmFsdWUsIC4uLnBhcmFtcy5zbGljZShwYXJhbUluZGV4LCBwYXJhbXNMZW5ndGgpKSk7XG4gICAgICAgIGlmIChwYXJhbXNMZW5ndGgpIHtcbiAgICAgICAgICBwYXJhbUluZGV4ICs9IHBhcmFtc0xlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAkcnVsZXM7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wdXRlTWV0YWRhdGEoXG4gICAgcmVzdWx0czogKGJvb2xlYW4gfCB7ICR2YWxpZDogYm9vbGVhbjsgW3g6IHN0cmluZ106IGFueSB9KVtdXG4gICk6IGJvb2xlYW4gfCB7ICR2YWxpZDogYm9vbGVhbjsgW3g6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBpc0FueVJlc3VsdE1ldGFEYXRhID0gcmVzdWx0cy5zb21lKChzKSA9PiB0eXBlb2YgcyAhPT0gJ2Jvb2xlYW4nKTtcbiAgICBpZiAoaXNBbnlSZXN1bHRNZXRhRGF0YSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJHZhbGlkOiByZXN1bHRzLnNvbWUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiAhIXJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC4kdmFsaWQ7XG4gICAgICAgIH0pLFxuICAgICAgICAuLi5yZXN1bHRzLnJlZHVjZSgoYWNjLCByZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7ICR2YWxpZCwgLi4ucmVzdCB9ID0gcmVzdWx0O1xuICAgICAgICAgIHJldHVybiB7IC4uLmFjYywgLi4ucmVzdCB9O1xuICAgICAgICB9LCB7fSksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0cy5zb21lKChyZXN1bHQpID0+ICEhcmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB2YWxpZGF0b3IgPSBpc0FueVJ1bGVBc3luY1xuICAgID8gYXN5bmMgKHZhbHVlOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5wYXJhbXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChjb21wdXRlUnVsZXMocnVsZXMsIHZhbHVlLCAuLi5wYXJhbXMpKTtcbiAgICAgICAgcmV0dXJuIGNvbXB1dGVNZXRhZGF0YShyZXN1bHRzKTtcbiAgICAgIH1cbiAgICA6ICh2YWx1ZTogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4ucGFyYW1zOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCAkcnVsZXMgPSBjb21wdXRlUnVsZXMocnVsZXMsIHZhbHVlLCAuLi5wYXJhbXMpO1xuICAgICAgICByZXR1cm4gY29tcHV0ZU1ldGFkYXRhKCRydWxlcyk7XG4gICAgICB9O1xuXG4gIGNvbnN0IG5ld1J1bGUgPSBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiAnb3InLFxuICAgIHZhbGlkYXRvcjogdmFsaWRhdG9yIGFzIGFueSxcbiAgICBtZXNzYWdlOiAnVGhlIHZhbHVlIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9ycycsXG4gIH0pO1xuXG4gIG5ld1J1bGUuX3BhcmFtcyA9IHBhcmFtcyBhcyBhbnk7XG5cbiAgcmV0dXJuIG5ld1J1bGUgYXMgYW55O1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBJbmxpbmVSdWxlRGVjbGFyYXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb25Qcm9jZXNzb3IsXG4gIFJlZ2xlUnVsZURlZmluaXRpb25XaXRoTWV0YWRhdGFQcm9jZXNzb3IsXG4gIFJlZ2xlUnVsZU1ldGFkYXRhQ29uc3VtZXIsXG4gIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbixcbn0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi9ydWxlSGVscGVycyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3Q8XG4gIFRWYWx1ZSxcbiAgVFBhcmFtcyBleHRlbmRzIGFueVtdID0gW10sXG4gIFRSZXR1cm4gZXh0ZW5kc1xuICAgIHwgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uXG4gICAgfCBQcm9taXNlPFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbj4gPSBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG4gIFRNZXRhZGF0YSBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiA9IFRSZXR1cm4gZXh0ZW5kcyBQcm9taXNlPGluZmVyIE0+ID8gTSA6IFRSZXR1cm4sXG4gIFRBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBUUmV0dXJuIGV4dGVuZHMgUHJvbWlzZTxhbnk+ID8gdHJ1ZSA6IGZhbHNlLFxuPihcbiAgcnVsZTpcbiAgICB8IFJlZ2xlUnVsZURlZmluaXRpb248VFZhbHVlLCBUUGFyYW1zLCBUQXN5bmMsIFRNZXRhZGF0YT5cbiAgICB8IElubGluZVJ1bGVEZWNsYXJhdGlvbjxUVmFsdWUsIFRQYXJhbXMsIFRSZXR1cm4+LFxuICBtZXNzYWdlPzogUmVnbGVSdWxlRGVmaW5pdGlvbldpdGhNZXRhZGF0YVByb2Nlc3NvcjxcbiAgICBUVmFsdWUsXG4gICAgUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcjxUUGFyYW1zLCBUTWV0YWRhdGE+LFxuICAgIHN0cmluZyB8IHN0cmluZ1tdXG4gID5cbik6IFJlZ2xlUnVsZURlZmluaXRpb248VFZhbHVlLCBUUGFyYW1zLCBUQXN5bmMsIFRNZXRhZGF0YT4ge1xuICBsZXQgX3R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHZhbGlkYXRvcjogUmVnbGVSdWxlRGVmaW5pdGlvblByb2Nlc3NvcjxhbnksIGFueSwgYW55PjtcbiAgbGV0IG5ld1ZhbGlkYXRvcjogUmVnbGVSdWxlRGVmaW5pdGlvblByb2Nlc3NvcjxhbnksIGFueSwgYW55PjtcbiAgbGV0IF9wYXJhbXM6IGFueVtdIHwgdW5kZWZpbmVkO1xuXG4gIGxldCBfYXN5bmM6IGJvb2xlYW47XG5cbiAgaWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFsaWRhdG9yID0gcnVsZTtcbiAgICBfYXN5bmMgPSBydWxlLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBc3luY0Z1bmN0aW9uJztcbiAgfSBlbHNlIHtcbiAgICAoeyBfdHlwZSwgdmFsaWRhdG9yLCBfcGFyYW1zIH0gPSBydWxlKTtcbiAgICBfYXN5bmMgPSBydWxlLl9hc3luYztcbiAgfVxuXG4gIGlmIChfYXN5bmMpIHtcbiAgICBuZXdWYWxpZGF0b3IgPSBhc3luYyAodmFsdWU6IGFueSwgLi4ucGFyYW1zOiBhbnlbXSkgPT4ge1xuICAgICAgaWYgKHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHZhbHVlKSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2YWxpZGF0b3IodmFsdWUsIC4uLihwYXJhbXMgYXMgYW55KSk7XG4gICAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBuZXdWYWxpZGF0b3IgPSAodmFsdWU6IGFueSwgLi4ucGFyYW1zOiBhbnlbXSkgPT4ge1xuICAgICAgaWYgKHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gIXZhbGlkYXRvcih2YWx1ZSwgLi4uKHBhcmFtcyBhcyBhbnkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBuZXdSdWxlID0gY3JlYXRlUnVsZSh7XG4gICAgdHlwZTogJ25vdCcsXG4gICAgdmFsaWRhdG9yOiBuZXdWYWxpZGF0b3IgYXMgYW55LFxuICAgIG1lc3NhZ2U6IChtZXNzYWdlIGFzIGFueSkgPz8gJ0Vycm9yJyxcbiAgfSk7XG5cbiAgbmV3UnVsZS5fcGFyYW1zID0gX3BhcmFtcyBhcyBhbnk7XG5cbiAgcmV0dXJuIG5ld1J1bGUgYXMgYW55O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVEZWZpbml0aW9uIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmV4cG9ydCBjb25zdCByZXF1aXJlZDogUmVnbGVSdWxlRGVmaW5pdGlvbjx1bmtub3duLCBbXSwgZmFsc2UsIGJvb2xlYW4sIHVua25vd24+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdyZXF1aXJlZCcsXG4gIHZhbGlkYXRvcjogKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgcmV0dXJuIHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHZhbHVlKTtcbiAgfSxcbiAgbWVzc2FnZTogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnLFxufSk7XG4iLCJpbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiwgTWF5YmUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgbWF4TGVuZ3RoOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxcbiAgc3RyaW5nIHwgYW55W10gfCBSZWNvcmQ8UHJvcGVydHlLZXksIGFueT4sXG4gIFtjb3VudDogbnVtYmVyXSxcbiAgZmFsc2UsXG4gIGJvb2xlYW5cbj4gPSBjcmVhdGVSdWxlKHtcbiAgdHlwZTogJ21heExlbmd0aCcsXG4gIHZhbGlkYXRvcjogKHZhbHVlOiBNYXliZTxzdHJpbmcgfCBSZWNvcmQ8UHJvcGVydHlLZXksIGFueT4gfCBhbnlbXT4sIGNvdW50OiBudW1iZXIpID0+IHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNGaWxsZWQodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRmlsbGVkKGNvdW50KSkge1xuICAgICAgaWYgKHJ1bGVIZWxwZXJzLmlzTnVtYmVyKGNvdW50KSkge1xuICAgICAgICByZXR1cm4gcnVsZUhlbHBlcnMuc2l6ZSh2YWx1ZSkgPD0gY291bnQ7XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbbWF4TGVuZ3RoXSBWYWx1ZSBvciBwYXJhbWV0ZXIgaXNuJ3QgYSBudW1iZXIsIGdvdCB2YWx1ZTogJHt2YWx1ZX0sIHBhcmFtZXRlcjogJHtjb3VudH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgbWVzc2FnZTogKHZhbHVlLCB7ICRwYXJhbXM6IFtjb3VudF0gfSkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGBUaGlzIGxpc3Qgc2hvdWxkIGhhdmUgbWF4aW11bSAke2NvdW50fSBpdGVtc2A7XG4gICAgfVxuICAgIHJldHVybiBgVGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQgaXMgJHtjb3VudH1gO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmV4cG9ydCBjb25zdCByZXF1aXJlZElmOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxcbiAgdW5rbm93bixcbiAgW2NvbmRpdGlvbjogYm9vbGVhbl0sXG4gIGZhbHNlLFxuICBib29sZWFuXG4+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdyZXF1aXJlZCcsXG4gIHZhbGlkYXRvcih2YWx1ZTogdW5rbm93biwgY29uZGl0aW9uOiBib29sZWFuKSB7XG4gICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG1lc3NhZ2U6ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkJyxcbiAgYWN0aXZlKF8sIHsgJHBhcmFtczogW2NvbmRpdGlvbl0gfSkge1xuICAgIHJldHVybiBjb25kaXRpb247XG4gIH0sXG59KTtcbiIsImltcG9ydCB0eXBlIHsgUmVnbGVSdWxlRGVmaW5pdGlvbiwgTWF5YmUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgcnVsZUhlbHBlcnMgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuY29uc3QgYWxwaGFSZWdleCA9IC9eW2EtekEtWl0qJC87XG5cbmV4cG9ydCBjb25zdCBhbHBoYTogUmVnbGVSdWxlRGVmaW5pdGlvbjxzdHJpbmcsIFtdLCBmYWxzZSwgYm9vbGVhbiwgc3RyaW5nPiA9IGNyZWF0ZVJ1bGUoe1xuICB0eXBlOiAnYWxwaGEnLFxuICB2YWxpZGF0b3IodmFsdWU6IE1heWJlPHN0cmluZz4pIHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcnVsZUhlbHBlcnMucmVnZXgodmFsdWUsIGFscGhhUmVnZXgpO1xuICB9LFxuICBtZXNzYWdlOiAnVGhlIHZhbHVlIGlzIG5vdCBhbHBoYWJldGljYWwnLFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZURlZmluaXRpb24sIE1heWJlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmNvbnN0IGFscGhhTnVtUmVnZXggPSAvXlthLXpBLVowLTldKiQvO1xuXG5leHBvcnQgY29uc3QgYWxwaGFOdW06IFJlZ2xlUnVsZURlZmluaXRpb248c3RyaW5nIHwgbnVtYmVyLCBbXSwgZmFsc2UsIGJvb2xlYW4sIHN0cmluZyB8IG51bWJlcj4gPVxuICBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiAnYWxwaGEnLFxuICAgIHZhbGlkYXRvcih2YWx1ZTogTWF5YmU8c3RyaW5nIHwgbnVtYmVyPikge1xuICAgICAgaWYgKHJ1bGVIZWxwZXJzLmlzRW1wdHkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJ1bGVIZWxwZXJzLnJlZ2V4KHZhbHVlLCBhbHBoYU51bVJlZ2V4KTtcbiAgICB9LFxuICAgIG1lc3NhZ2U6ICdUaGUgdmFsdWUgbXVzdCBiZSBhbHBoYS1udW1lcmljJyxcbiAgfSk7XG4iLCJpbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiwgTWF5YmUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgYmV0d2VlbjogUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb248XG4gIG51bWJlcixcbiAgW21pbjogbnVtYmVyLCBtYXg6IG51bWJlcl0sXG4gIGZhbHNlLFxuICBib29sZWFuXG4+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdiZXR3ZWVuJyxcbiAgdmFsaWRhdG9yOiAodmFsdWU6IE1heWJlPG51bWJlcj4sIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikgPT4ge1xuICAgIGlmIChydWxlSGVscGVycy5pc0ZpbGxlZCh2YWx1ZSkgJiYgcnVsZUhlbHBlcnMuaXNGaWxsZWQobWluKSAmJiBydWxlSGVscGVycy5pc0ZpbGxlZChtYXgpKSB7XG4gICAgICBjb25zdCB0VmFsdWUgPSBydWxlSGVscGVycy50b051bWJlcih2YWx1ZSk7XG4gICAgICBjb25zdCB0TWluID0gcnVsZUhlbHBlcnMudG9OdW1iZXIobWluKTtcbiAgICAgIGNvbnN0IHRNYXggPSBydWxlSGVscGVycy50b051bWJlcihtYXgpO1xuICAgICAgaWYgKFxuICAgICAgICBydWxlSGVscGVycy5pc051bWJlcih0VmFsdWUpICYmXG4gICAgICAgIHJ1bGVIZWxwZXJzLmlzTnVtYmVyKHRNaW4pICYmXG4gICAgICAgIHJ1bGVIZWxwZXJzLmlzTnVtYmVyKHRNYXgpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRWYWx1ZSA+PSB0TWluICYmIHRWYWx1ZSA8PSB0TWF4O1xuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2JldHdlZW5dIFZhbHVlIG9yIHBhcmFtZXRlcnMgYXJlbid0IG51bWJlcnMsIGdvdCB2YWx1ZTogJHt2YWx1ZX0sIG1pbjogJHttaW59LCBtYXg6ICR7bWF4fWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBtZXNzYWdlOiAoXywgeyAkcGFyYW1zOiBbbWluLCBtYXhdIH0pID0+IHtcbiAgICByZXR1cm4gYFRoZSB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gJHttaW59IGFuZCAke21heH1gO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZURlZmluaXRpb24sIE1heWJlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmNvbnN0IGRlY2ltYWxSZWdleCA9IC9eWy1dP1xcZCooXFwuXFxkKyk/JC87XG5cbmV4cG9ydCBjb25zdCBkZWNpbWFsOiBSZWdsZVJ1bGVEZWZpbml0aW9uPHN0cmluZyB8IG51bWJlciwgW10sIGZhbHNlLCBib29sZWFuLCBzdHJpbmcgfCBudW1iZXI+ID1cbiAgY3JlYXRlUnVsZSh7XG4gICAgdHlwZTogJ2RlY2ltYWwnLFxuICAgIHZhbGlkYXRvcih2YWx1ZTogTWF5YmU8bnVtYmVyIHwgc3RyaW5nPikge1xuICAgICAgaWYgKHJ1bGVIZWxwZXJzLmlzRW1wdHkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJ1bGVIZWxwZXJzLnJlZ2V4KHZhbHVlLCBkZWNpbWFsUmVnZXgpO1xuICAgIH0sXG4gICAgbWVzc2FnZTogJ1ZhbHVlIG11c3QgYmUgZGVjaW1hbCcsXG4gIH0pO1xuIiwiaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVEZWZpbml0aW9uLCBNYXliZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5jb25zdCBlbWFpbFJlZ2V4ID1cbiAgL14oPzpbQS16MC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKD86XFwuW0EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKykqfFwiKD86W1xceDAxLVxceDA4XFx4MGJcXHgwY1xceDBlLVxceDFmXFx4MjFcXHgyMy1cXHg1YlxceDVkLVxceDdmXXxbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGUtXFx4N2ZdKSpcIilAKD86KD86W2EtejAtOV0oPzpbYS16MC05LV0qW2EtejAtOV0pP1xcLikrW2EtejAtOV17Mix9KD86W2EtejAtOS1dKlthLXowLTldKT98XFxbKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT98W2EtejAtOS1dKlthLXowLTldOig/OltcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDIxLVxceDVhXFx4NTMtXFx4N2ZdfFxcXFxbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGUtXFx4N2ZdKSspXFxdKSQvaTtcblxuZXhwb3J0IGNvbnN0IGVtYWlsOiBSZWdsZVJ1bGVEZWZpbml0aW9uPHN0cmluZywgW10sIGZhbHNlLCBib29sZWFuLCBzdHJpbmc+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdlbWFpbCcsXG4gIHZhbGlkYXRvcih2YWx1ZTogTWF5YmU8c3RyaW5nPikge1xuICAgIGlmIChydWxlSGVscGVycy5pc0VtcHR5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBydWxlSGVscGVycy5yZWdleCh2YWx1ZSwgZW1haWxSZWdleCk7XG4gIH0sXG4gIG1lc3NhZ2U6ICdWYWx1ZSBtdXN0IGJlIGFuIHZhbGlkIGVtYWlsIGFkZHJlc3MnLFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZURlZmluaXRpb24sIE1heWJlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmNvbnN0IGludGVnZXJSZWdleCA9IC8oXlswLTldKiQpfCheLVswLTldKyQpLztcblxuZXhwb3J0IGNvbnN0IGludGVnZXI6IFJlZ2xlUnVsZURlZmluaXRpb248c3RyaW5nIHwgbnVtYmVyLCBbXSwgZmFsc2UsIGJvb2xlYW4sIHN0cmluZyB8IG51bWJlcj4gPVxuICBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiAnaW50ZWdlcicsXG4gICAgdmFsaWRhdG9yKHZhbHVlOiBNYXliZTxudW1iZXIgfCBzdHJpbmc+KSB7XG4gICAgICBpZiAocnVsZUhlbHBlcnMuaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcnVsZUhlbHBlcnMucmVnZXgodmFsdWUsIGludGVnZXJSZWdleCk7XG4gICAgfSxcbiAgICBtZXNzYWdlOiAnVmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyJyxcbiAgfSk7XG4iLCJpbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiwgTWF5YmUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgbWF4VmFsdWU6IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uPG51bWJlciwgW2NvdW50OiBudW1iZXJdLCBmYWxzZSwgYm9vbGVhbj4gPVxuICBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiAnbWF4VmFsdWUnLFxuICAgIHZhbGlkYXRvcjogKHZhbHVlOiBNYXliZTxudW1iZXI+LCBjb3VudDogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAocnVsZUhlbHBlcnMuaXNGaWxsZWQodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRmlsbGVkKGNvdW50KSkge1xuICAgICAgICBpZiAocnVsZUhlbHBlcnMuaXNOdW1iZXIoY291bnQpICYmIHJ1bGVIZWxwZXJzLmlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZSA8PSBjb3VudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFttYXhWYWx1ZV0gVmFsdWUgb3IgcGFyYW1ldGVyIGlzbid0IGEgbnVtYmVyLCBnb3QgdmFsdWU6ICR7dmFsdWV9LCBwYXJhbWV0ZXI6ICR7Y291bnR9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIG1lc3NhZ2U6IChfLCB7ICRwYXJhbXM6IFtjb3VudF0gfSkgPT4ge1xuICAgICAgcmV0dXJuIGBUaGUgbWF4aW11bSB2YWx1ZSBhbGxvd2VkIGlzICR7Y291bnR9YDtcbiAgICB9LFxuICB9KTtcbiIsImltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uLCBNYXliZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBtaW5MZW5ndGg6IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uPFxuICBzdHJpbmcgfCBhbnlbXSB8IFJlY29yZDxQcm9wZXJ0eUtleSwgYW55PixcbiAgW2NvdW50OiBudW1iZXJdLFxuICBmYWxzZSxcbiAgYm9vbGVhblxuPiA9IGNyZWF0ZVJ1bGUoe1xuICB0eXBlOiAnbWluTGVuZ3RoJyxcbiAgdmFsaWRhdG9yOiAodmFsdWU6IE1heWJlPHN0cmluZyB8IFJlY29yZDxQcm9wZXJ0eUtleSwgYW55PiB8IGFueVtdPiwgY291bnQ6IG51bWJlcikgPT4ge1xuICAgIGlmIChydWxlSGVscGVycy5pc0ZpbGxlZCh2YWx1ZSkgJiYgcnVsZUhlbHBlcnMuaXNGaWxsZWQoY291bnQpKSB7XG4gICAgICBpZiAocnVsZUhlbHBlcnMuaXNOdW1iZXIoY291bnQpKSB7XG4gICAgICAgIHJldHVybiBydWxlSGVscGVycy5zaXplKHZhbHVlKSA+PSBjb3VudDtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2FybihgW21pbkxlbmd0aF0gUGFyYW1ldGVyIGlzbid0IGEgbnVtYmVyLCBnb3QgcGFyYW1ldGVyOiAke2NvdW50fWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgbWVzc2FnZTogKHZhbHVlLCB7ICRwYXJhbXM6IFtjb3VudF0gfSkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGBUaGlzIGxpc3Qgc2hvdWxkIGhhdmUgYXQgbGVhc3QgJHtjb3VudH0gaXRlbXNgO1xuICAgIH1cbiAgICByZXR1cm4gYFRoaXMgZmllbGQgc2hvdWxkIGJlIGF0IGxlYXN0ICR7Y291bnR9IGNoYXJhY3RlcnMgbG9uZ2A7XG4gIH0sXG59KTtcbiIsImltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uLCBNYXliZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBtaW5WYWx1ZTogUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb248bnVtYmVyLCBbY291bnQ6IG51bWJlcl0sIGZhbHNlLCBib29sZWFuPiA9XG4gIGNyZWF0ZVJ1bGUoe1xuICAgIHR5cGU6ICdtaW5WYWx1ZScsXG4gICAgdmFsaWRhdG9yOiAodmFsdWU6IE1heWJlPG51bWJlcj4sIGNvdW50OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChydWxlSGVscGVycy5pc0ZpbGxlZCh2YWx1ZSkgJiYgcnVsZUhlbHBlcnMuaXNGaWxsZWQoY291bnQpKSB7XG4gICAgICAgIGlmIChydWxlSGVscGVycy5pc051bWJlcihjb3VudCkgJiYgcnVsZUhlbHBlcnMuaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlID49IGNvdW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW21pblZhbHVlXSBWYWx1ZSBvciBwYXJhbWV0ZXIgaXNuJ3QgYSBudW1iZXIsIGdvdCB2YWx1ZTogJHt2YWx1ZX0sIHBhcmFtZXRlcjogJHtjb3VudH1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgbWVzc2FnZTogKF8sIHsgJHBhcmFtczogW2NvdW50XSB9KSA9PiB7XG4gICAgICByZXR1cm4gYFRoZSBtaW5pbXVtIHZhbHVlIGFsbG93ZWQgaXMgJHtjb3VudH1gO1xuICAgIH0sXG4gIH0pO1xuIiwiaW1wb3J0IHsgcnVsZUhlbHBlcnMgfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgTWF5YmUsIFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcblxuZXhwb3J0IGNvbnN0IGV4YWN0TGVuZ3RoOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxcbiAgc3RyaW5nIHwgYW55W10gfCBSZWNvcmQ8UHJvcGVydHlLZXksIGFueT4sXG4gIFtjb3VudDogbnVtYmVyXSxcbiAgZmFsc2UsXG4gIGJvb2xlYW5cbj4gPSBjcmVhdGVSdWxlKHtcbiAgdHlwZTogJ2V4YWN0TGVuZ3RoJyxcbiAgdmFsaWRhdG9yOiAodmFsdWU6IE1heWJlPHN0cmluZyB8IFJlY29yZDxQcm9wZXJ0eUtleSwgYW55PiB8IGFueVtdPiwgY291bnQ6IG51bWJlcikgPT4ge1xuICAgIGlmIChydWxlSGVscGVycy5pc0ZpbGxlZCh2YWx1ZSkgJiYgcnVsZUhlbHBlcnMuaXNGaWxsZWQoY291bnQpKSB7XG4gICAgICBpZiAocnVsZUhlbHBlcnMuaXNOdW1iZXIoY291bnQpKSB7XG4gICAgICAgIHJldHVybiBydWxlSGVscGVycy5zaXplKHZhbHVlKSA9PT0gY291bnQ7XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oYFttaW5MZW5ndGhdIFBhcmFtZXRlciBpc24ndCBhIG51bWJlciwgZ290IHBhcmFtZXRlcjogJHtjb3VudH1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG1lc3NhZ2U6IChfLCB7ICRwYXJhbXM6IFtjb3VudF0gfSkgPT4ge1xuICAgIHJldHVybiBgVGhpcyBmaWVsZCBzaG91bGQgYmUgZXhhY3RseSAke2NvdW50fSBjaGFyYWN0ZXJzIGxvbmdgO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZURlZmluaXRpb24sIE1heWJlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmNvbnN0IG51bWVyaWNSZWdleCA9IC9eXFxkKihcXC5cXGQrKT8kLztcblxuZXhwb3J0IGNvbnN0IG51bWVyaWM6IFJlZ2xlUnVsZURlZmluaXRpb248c3RyaW5nIHwgbnVtYmVyLCBbXSwgZmFsc2UsIGJvb2xlYW4sIHN0cmluZyB8IG51bWJlcj4gPVxuICBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiAnbnVtZXJpYycsXG4gICAgdmFsaWRhdG9yKHZhbHVlOiBNYXliZTxzdHJpbmcgfCBudW1iZXI+KSB7XG4gICAgICBpZiAocnVsZUhlbHBlcnMuaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcnVsZUhlbHBlcnMucmVnZXgodmFsdWUsIG51bWVyaWNSZWdleCk7XG4gICAgfSxcbiAgICBtZXNzYWdlOiAnVGhpcyBmaWVsZCBtdXN0IGJlIG51bWVyaWMnLFxuICB9KTtcbiIsImltcG9ydCB0eXBlIHsgUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb24gfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgcnVsZUhlbHBlcnMgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuZXhwb3J0IGNvbnN0IHJlcXVpcmVkVW5sZXNzOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxcbiAgdW5rbm93bixcbiAgW2NvbmRpdGlvbjogYm9vbGVhbl0sXG4gIGZhbHNlLFxuICBib29sZWFuXG4+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdyZXF1aXJlZCcsXG4gIHZhbGlkYXRvcih2YWx1ZTogdW5rbm93biwgY29uZGl0aW9uOiBib29sZWFuKSB7XG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBydWxlSGVscGVycy5pc0ZpbGxlZCh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBtZXNzYWdlOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcsXG4gIGFjdGl2ZShfLCB7ICRwYXJhbXM6IFtjb25kaXRpb25dIH0pIHtcbiAgICByZXR1cm4gIWNvbmRpdGlvbjtcbiAgfSxcbn0pO1xuIiwiaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3Qgc2FtZUFzOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjx1bmtub3duLCBbdGFyZ2V0OiB1bmtub3duXSwgZmFsc2UsIGJvb2xlYW4+ID1cbiAgY3JlYXRlUnVsZSh7XG4gICAgdHlwZTogJ3NhbWVBcycsXG4gICAgdmFsaWRhdG9yKHZhbHVlOiB1bmtub3duLCB0YXJnZXQ6IHVua25vd24pIHtcbiAgICAgIGlmIChydWxlSGVscGVycy5pc0VtcHR5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdGFyZ2V0O1xuICAgIH0sXG4gICAgbWVzc2FnZShfLCB7ICRwYXJhbXM6IFt0YXJnZXRdIH0pIHtcbiAgICAgIHJldHVybiBgVmFsdWUgbXVzdCBiZSBlcXVhbCB0byBcIiR7dGFyZ2V0fVwiYDtcbiAgICB9LFxuICB9KTtcbiIsImltcG9ydCB0eXBlIHsgUmVnbGVSdWxlRGVmaW5pdGlvbiwgTWF5YmUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgcnVsZUhlbHBlcnMgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuLyoqXG4gKiBSZWdleCB0YWtlbiBmcm9tIHtAbGluayBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9kcGVyaW5pLzcyOTI5NH1cbiAqL1xuY29uc3QgdXJsUmVnZXggPVxuICAvXig/Oig/Oig/Omh0dHBzP3xmdHApOik/XFwvXFwvKSg/OlxcUysoPzo6XFxTKik/QCk/KD86KD8hKD86MTB8MTI3KSg/OlxcLlxcZHsxLDN9KXszfSkoPyEoPzoxNjlcXC4yNTR8MTkyXFwuMTY4KSg/OlxcLlxcZHsxLDN9KXsyfSkoPyExNzJcXC4oPzoxWzYtOV18MlxcZHwzWzAtMV0pKD86XFwuXFxkezEsM30pezJ9KSg/OlsxLTldXFxkP3wxXFxkXFxkfDJbMDFdXFxkfDIyWzAtM10pKD86XFwuKD86MT9cXGR7MSwyfXwyWzAtNF1cXGR8MjVbMC01XSkpezJ9KD86XFwuKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNF0pKXwoPzooPzpbYS16MC05XFx1MDBhMS1cXHVmZmZmXVthLXowLTlcXHUwMGExLVxcdWZmZmZfLV17MCw2Mn0pP1thLXowLTlcXHUwMGExLVxcdWZmZmZdXFwuKSsoPzpbYS16XFx1MDBhMS1cXHVmZmZmXXsyLH1cXC4/KSkoPzo6XFxkezIsNX0pPyg/OlsvPyNdXFxTKik/JC9pO1xuXG5leHBvcnQgY29uc3QgdXJsOiBSZWdsZVJ1bGVEZWZpbml0aW9uPHN0cmluZywgW10sIGZhbHNlLCBib29sZWFuLCBzdHJpbmc+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICd1cmwnLFxuICB2YWxpZGF0b3IodmFsdWU6IE1heWJlPHN0cmluZz4pIHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcnVsZUhlbHBlcnMucmVnZXgodmFsdWUsIHVybFJlZ2V4KTtcbiAgfSxcbiAgbWVzc2FnZTogJ1RoZSB2YWx1ZSBpcyBub3QgYSB2YWxpZCBVUkwgYWRkcmVzcycsXG59KTtcbiIsImltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IE1heWJlLCBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBkYXRlQWZ0ZXI6IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uPFxuICBzdHJpbmcgfCBEYXRlLFxuICBbYWZ0ZXI6IE1heWJlPHN0cmluZyB8IERhdGU+XSxcbiAgZmFsc2UsXG4gIHwgdHJ1ZVxuICB8IHtcbiAgICAgICR2YWxpZDogZmFsc2U7XG4gICAgICBlcnJvcjogJ2RhdGUtbm90LWFmdGVyJztcbiAgICB9XG4gIHwge1xuICAgICAgJHZhbGlkOiBmYWxzZTtcbiAgICAgIGVycm9yOiAndmFsdWUtb3ItcGFyYW1hdGVyLW5vdC1hLWRhdGUnO1xuICAgIH1cbj4gPSBjcmVhdGVSdWxlKHtcbiAgdHlwZTogJ2RhdGVBZnRlcicsXG4gIHZhbGlkYXRvcjogKHZhbHVlOiBNYXliZTxEYXRlIHwgc3RyaW5nPiwgYWZ0ZXI6IE1heWJlPERhdGUgfCBzdHJpbmc+KSA9PiB7XG4gICAgaWYgKHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHZhbHVlKSAmJiBydWxlSGVscGVycy5pc0ZpbGxlZChhZnRlcikpIHtcbiAgICAgIGlmIChydWxlSGVscGVycy5pc0RhdGUodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRGF0ZShhZnRlcikpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcnVsZUhlbHBlcnMudG9EYXRlKHZhbHVlKS5nZXRUaW1lKCkgPiBydWxlSGVscGVycy50b0RhdGUoYWZ0ZXIpLmdldFRpbWUoKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7ICR2YWxpZDogZmFsc2UsIGVycm9yOiAnZGF0ZS1ub3QtYWZ0ZXInIGFzIGNvbnN0IH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyAkdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ3ZhbHVlLW9yLXBhcmFtYXRlci1ub3QtYS1kYXRlJyBhcyBjb25zdCB9O1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgbWVzc2FnZTogKF8sIHsgJHBhcmFtczogW2FmdGVyXSB9KSA9PiB7XG4gICAgLy8gaWYgKGVycm9yID09PSAndmFsdWUtb3ItcGFyYW1hdGVyLW5vdC1hLWRhdGUnKSB7XG4gICAgLy8gICByZXR1cm4gJ1RoZSBpbnB1dHMgbXVzdCBiZSBEYXRlcyc7XG4gICAgLy8gfVxuICAgIHJldHVybiBgVGhlIGRhdGUgbXVzdCBiZSBhZnRlciAke2FmdGVyfWA7XG4gIH0sXG59KTtcbiIsImltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IE1heWJlLCBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBkYXRlQmVmb3JlOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxcbiAgc3RyaW5nIHwgRGF0ZSxcbiAgW2JlZm9yZTogTWF5YmU8c3RyaW5nIHwgRGF0ZT5dLFxuICBmYWxzZSxcbiAgfCB0cnVlXG4gIHwge1xuICAgICAgJHZhbGlkOiBmYWxzZTtcbiAgICAgIGVycm9yOiAnZGF0ZS1ub3QtYmVmb3JlJztcbiAgICB9XG4gIHwge1xuICAgICAgJHZhbGlkOiBmYWxzZTtcbiAgICAgIGVycm9yOiAndmFsdWUtb3ItcGFyYW1hdGVyLW5vdC1hLWRhdGUnO1xuICAgIH1cbj4gPSBjcmVhdGVSdWxlKHtcbiAgdHlwZTogJ2RhdGVCZWZvcmUnLFxuICB2YWxpZGF0b3I6ICh2YWx1ZTogTWF5YmU8RGF0ZSB8IHN0cmluZz4sIGJlZm9yZTogTWF5YmU8RGF0ZSB8IHN0cmluZz4pID0+IHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNGaWxsZWQodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRmlsbGVkKGJlZm9yZSkpIHtcbiAgICAgIGlmIChydWxlSGVscGVycy5pc0RhdGUodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRGF0ZShiZWZvcmUpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJ1bGVIZWxwZXJzLnRvRGF0ZSh2YWx1ZSkuZ2V0VGltZSgpIDwgcnVsZUhlbHBlcnMudG9EYXRlKGJlZm9yZSkuZ2V0VGltZSgpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgJHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdkYXRlLW5vdC1iZWZvcmUnIGFzIGNvbnN0IH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyAkdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ3ZhbHVlLW9yLXBhcmFtYXRlci1ub3QtYS1kYXRlJyBhcyBjb25zdCB9O1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgbWVzc2FnZTogKF8sIHsgJHBhcmFtczogW2JlZm9yZV0sIGVycm9yIH0pID0+IHtcbiAgICBpZiAoZXJyb3IgPT09ICd2YWx1ZS1vci1wYXJhbWF0ZXItbm90LWEtZGF0ZScpIHtcbiAgICAgIHJldHVybiAnVGhlIGZpZWxkcyBtdXN0IGJlIERhdGVzJztcbiAgICB9XG4gICAgcmV0dXJuIGBUaGUgZGF0ZSBtdXN0IGJlIGJlZm9yZSAke2JlZm9yZX1gO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBNYXliZSwgUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb24gfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgZGF0ZUJldHdlZW46IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uPFxuICBzdHJpbmcgfCBEYXRlLFxuICBbYmVmb3JlOiBNYXliZTxzdHJpbmcgfCBEYXRlPiwgYWZ0ZXI6IE1heWJlPHN0cmluZyB8IERhdGU+XSxcbiAgZmFsc2UsXG4gIGJvb2xlYW5cbj4gPSBjcmVhdGVSdWxlKHtcbiAgdHlwZTogJ2RhdGVCZXR3ZWVuJyxcbiAgdmFsaWRhdG9yOiAoXG4gICAgdmFsdWU6IE1heWJlPERhdGUgfCBzdHJpbmc+LFxuICAgIGJlZm9yZTogTWF5YmU8RGF0ZSB8IHN0cmluZz4sXG4gICAgYWZ0ZXI6IE1heWJlPERhdGUgfCBzdHJpbmc+XG4gICkgPT4ge1xuICAgIGlmIChydWxlSGVscGVycy5pc0RhdGUodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRGF0ZShiZWZvcmUpICYmIHJ1bGVIZWxwZXJzLmlzRGF0ZShhZnRlcikpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHJ1bGVIZWxwZXJzLnRvRGF0ZSh2YWx1ZSkuZ2V0VGltZSgpID4gcnVsZUhlbHBlcnMudG9EYXRlKGJlZm9yZSkuZ2V0VGltZSgpICYmXG4gICAgICAgIHJ1bGVIZWxwZXJzLnRvRGF0ZSh2YWx1ZSkuZ2V0VGltZSgpIDwgcnVsZUhlbHBlcnMudG9EYXRlKGFmdGVyKS5nZXRUaW1lKClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBtZXNzYWdlOiAoXywgeyAkcGFyYW1zOiBbYmVmb3JlLCBhZnRlcl0gfSkgPT4ge1xuICAgIHJldHVybiBgVGhlIGRhdGUgbXVzdCBiZSBiZXR3ZWVuICR7YmVmb3JlfSBhbmQgJHthZnRlcn1gO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZURlZmluaXRpb24sIE1heWJlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmZ1bmN0aW9uIG5pYmJsZVZhbGlkKG5pYmJsZTogc3RyaW5nKSB7XG4gIGlmIChuaWJibGUubGVuZ3RoID4gMyB8fCBuaWJibGUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG5pYmJsZVswXSA9PT0gJzAnICYmIG5pYmJsZSAhPT0gJzAnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFuaWJibGUubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbnVtZXJpYyA9ICtuaWJibGUgfCAwO1xuICByZXR1cm4gbnVtZXJpYyA+PSAwICYmIG51bWVyaWMgPD0gMjU1O1xufVxuXG5leHBvcnQgY29uc3QgaXBBZGRyZXNzOiBSZWdsZVJ1bGVEZWZpbml0aW9uPHN0cmluZywgW10sIGZhbHNlLCBib29sZWFuLCBzdHJpbmc+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdpcEFkZHJlc3MnLFxuICB2YWxpZGF0b3IodmFsdWU6IE1heWJlPHN0cmluZz4pIHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbmliYmxlcyA9IHZhbHVlLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIG5pYmJsZXMubGVuZ3RoID09PSA0ICYmIG5pYmJsZXMuZXZlcnkobmliYmxlVmFsaWQpO1xuICB9LFxuICBtZXNzYWdlOiAnVGhlIHZhbHVlIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MnLFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uLCBNYXliZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3QgbWFjQWRkcmVzczogUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb248XG4gIHN0cmluZyxcbiAgW3NlcGFyYXRvcj86IHN0cmluZyB8IHVuZGVmaW5lZF0sXG4gIGZhbHNlLFxuICBib29sZWFuXG4+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdtYWNBZGRyZXNzJyxcbiAgdmFsaWRhdG9yKHZhbHVlOiBNYXliZTxzdHJpbmc+LCBzZXBhcmF0b3IgPSAnOicpIHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPVxuICAgICAgdHlwZW9mIHNlcGFyYXRvciA9PT0gJ3N0cmluZycgJiYgc2VwYXJhdG9yICE9PSAnJ1xuICAgICAgICA/IHZhbHVlLnNwbGl0KHNlcGFyYXRvcilcbiAgICAgICAgOiB2YWx1ZS5sZW5ndGggPT09IDEyIHx8IHZhbHVlLmxlbmd0aCA9PT0gMTZcbiAgICAgICAgICA/IHZhbHVlLm1hdGNoKC8uezJ9L2cpXG4gICAgICAgICAgOiBudWxsO1xuXG4gICAgcmV0dXJuIHBhcnRzICE9PSBudWxsICYmIChwYXJ0cy5sZW5ndGggPT09IDYgfHwgcGFydHMubGVuZ3RoID09PSA4KSAmJiBwYXJ0cy5ldmVyeShoZXhWYWxpZCk7XG4gIH0sXG4gIG1lc3NhZ2U6ICdUaGUgdmFsdWUgaXMgbm90IGEgdmFsaWQgTUFDIEFkZHJlc3MnLFxufSk7XG5cbmNvbnN0IGhleFZhbGlkID0gKGhleDogc3RyaW5nKSA9PiBoZXgudG9Mb3dlckNhc2UoKS5tYXRjaCgvXlswLTlhLWZdezJ9JC8pO1xuIiwiaW1wb3J0IHR5cGUgeyBNYXliZSwgUmVnbGVSdWxlRGVmaW5pdGlvbiB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3QgY2hlY2tlZDogUmVnbGVSdWxlRGVmaW5pdGlvbjxib29sZWFuLCBbXSwgZmFsc2UsIGJvb2xlYW4sIGJvb2xlYW4+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdjaGVja2VkJyxcbiAgdmFsaWRhdG9yOiAodmFsdWU6IE1heWJlPGJvb2xlYW4+KSA9PiB7XG4gICAgaWYgKHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgbWVzc2FnZTogJ1RoaXMgZmllbGQgbXVzdCBiZSBjaGVja2VkJyxcbn0pO1xuIiwiaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiwgTWF5YmUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgcnVsZUhlbHBlcnMgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxcbiAgc3RyaW5nLFxuICBbcGFydDogTWF5YmU8c3RyaW5nPl0sXG4gIGZhbHNlLFxuICBib29sZWFuXG4+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdjb250YWlucycsXG4gIHZhbGlkYXRvcih2YWx1ZTogTWF5YmU8c3RyaW5nPiwgcGFydDogTWF5YmU8c3RyaW5nPikge1xuICAgIGlmIChydWxlSGVscGVycy5pc0ZpbGxlZCh2YWx1ZSkgJiYgcnVsZUhlbHBlcnMuaXNGaWxsZWQocGFydCkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhwYXJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG1lc3NhZ2UoXywgeyAkcGFyYW1zOiBbcGFydF0gfSkge1xuICAgIHJldHVybiBgRmllbGQgbXVzdCBjb250YWluICR7cGFydH1gO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uLCBNYXliZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3Qgc3RhcnRzV2l0aDogUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb248XG4gIHN0cmluZyxcbiAgW3BhcnQ6IE1heWJlPHN0cmluZz5dLFxuICBmYWxzZSxcbiAgYm9vbGVhblxuPiA9IGNyZWF0ZVJ1bGUoe1xuICB0eXBlOiAnc3RhcnRzV2l0aCcsXG4gIHZhbGlkYXRvcih2YWx1ZTogTWF5YmU8c3RyaW5nPiwgcGFydDogTWF5YmU8c3RyaW5nPikge1xuICAgIGlmIChydWxlSGVscGVycy5pc0ZpbGxlZCh2YWx1ZSkgJiYgcnVsZUhlbHBlcnMuaXNGaWxsZWQocGFydCkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5zdGFydHNXaXRoKHBhcnQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgbWVzc2FnZShfLCB7ICRwYXJhbXM6IFtwYXJ0XSB9KSB7XG4gICAgcmV0dXJuIGBGaWVsZCBtdXN0IGVuZCB3aXRoICR7cGFydH1gO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uLCBNYXliZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3QgZW5kc1dpdGg6IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uPFxuICBzdHJpbmcsXG4gIFtwYXJ0OiBNYXliZTxzdHJpbmc+XSxcbiAgZmFsc2UsXG4gIGJvb2xlYW5cbj4gPSBjcmVhdGVSdWxlKHtcbiAgdHlwZTogJ2VuZHNXaXRoJyxcbiAgdmFsaWRhdG9yKHZhbHVlOiBNYXliZTxzdHJpbmc+LCBwYXJ0OiBNYXliZTxzdHJpbmc+KSB7XG4gICAgaWYgKHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHZhbHVlKSAmJiBydWxlSGVscGVycy5pc0ZpbGxlZChwYXJ0KSkge1xuICAgICAgcmV0dXJuIHZhbHVlLmVuZHNXaXRoKHBhcnQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgbWVzc2FnZShfLCB7ICRwYXJhbXM6IFtwYXJ0XSB9KSB7XG4gICAgcmV0dXJuIGBGaWVsZCBtdXN0IGVuZCB3aXRoICR7cGFydH1gO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IE1heWJlLCBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3QgcmVnZXg6IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uPFxuICBzdHJpbmcgfCBudW1iZXIsXG4gIFtyZWdleHA6IFJlZ0V4cF0sXG4gIGZhbHNlLFxuICBib29sZWFuXG4+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdyZWdleCcsXG4gIHZhbGlkYXRvcih2YWx1ZTogTWF5YmU8c3RyaW5nIHwgbnVtYmVyPiwgcmVnZXhwOiBSZWdFeHApIHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNGaWxsZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4gcnVsZUhlbHBlcnMucmVnZXgodmFsdWUsIHJlZ2V4cCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBtZXNzYWdlOiAnVGhpcyBmaWVsZCBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgcGF0dGVybicsXG59KTtcbiJdfQ==
|