@appium/support 2.55.0 → 2.55.4
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/build/lib/image-util.js +3 -329
- package/build/lib/index.js +98 -0
- package/build/lib/log-internal.js +1 -1
- package/build/lib/logging.js +1 -1
- package/build/test/assets/sample_binary.plist +0 -0
- package/build/test/assets/sample_text.plist +28 -0
- package/build/test/fs-specs.js +264 -0
- package/build/test/helpers.js +35 -0
- package/build/test/image-util-e2e-specs.js +78 -0
- package/build/test/index-specs.js +49 -0
- package/build/test/log-internals-specs.js +97 -0
- package/build/test/logger/helpers.js +71 -0
- package/build/test/logger/logger-force-specs.js +41 -0
- package/build/test/logger/logger-normal-specs.js +113 -0
- package/build/test/logger/logger-test-specs.js +40 -0
- package/build/test/mjpeg-e2e-specs.js +96 -0
- package/build/test/net-e2e-specs.js +32 -0
- package/build/test/node-e2e-specs.js +22 -0
- package/build/test/plist-specs.js +54 -0
- package/build/test/process-specs.js +104 -0
- package/build/test/system-specs.js +136 -0
- package/build/test/tempdir-specs.js +86 -0
- package/build/test/timing-specs.js +125 -0
- package/build/test/util-e2e-specs.js +136 -0
- package/build/test/util-specs.js +537 -0
- package/build/test/zip-e2e-specs.js +233 -0
- package/index.js +1 -28
- package/lib/image-util.js +3 -570
- package/lib/index.js +28 -0
- package/lib/log-internal.js +1 -1
- package/lib/logging.js +1 -1
- package/package.json +7 -12
- package/build/index.js +0 -98
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
require("source-map-support/register");
|
|
6
|
+
|
|
7
|
+
var _lib = require("../lib");
|
|
8
|
+
|
|
9
|
+
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
10
|
+
|
|
11
|
+
var _sinon = _interopRequireDefault(require("sinon"));
|
|
12
|
+
|
|
13
|
+
var _os = _interopRequireDefault(require("os"));
|
|
14
|
+
|
|
15
|
+
var _path = _interopRequireDefault(require("path"));
|
|
16
|
+
|
|
17
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
18
|
+
|
|
19
|
+
const {
|
|
20
|
+
W3C_WEB_ELEMENT_IDENTIFIER
|
|
21
|
+
} = _lib.util;
|
|
22
|
+
describe('util', function () {
|
|
23
|
+
describe('hasValue', function () {
|
|
24
|
+
it('should exist', function () {
|
|
25
|
+
should.exist(_lib.util.hasValue);
|
|
26
|
+
});
|
|
27
|
+
it('should handle undefined', function () {
|
|
28
|
+
_lib.util.hasValue(undefined).should.be.false;
|
|
29
|
+
});
|
|
30
|
+
it('should handle not a number', function () {
|
|
31
|
+
_lib.util.hasValue(NaN).should.be.false;
|
|
32
|
+
});
|
|
33
|
+
it('should handle null', function () {
|
|
34
|
+
_lib.util.hasValue(null).should.be.false;
|
|
35
|
+
});
|
|
36
|
+
it('should handle functions', function () {
|
|
37
|
+
_lib.util.hasValue(function () {}).should.be.true;
|
|
38
|
+
});
|
|
39
|
+
it('should handle empty arrays', function () {
|
|
40
|
+
_lib.util.hasValue({}).should.be.true;
|
|
41
|
+
});
|
|
42
|
+
it('should handle zero', function () {
|
|
43
|
+
_lib.util.hasValue(0).should.be.true;
|
|
44
|
+
});
|
|
45
|
+
it('should handle simple string', function () {
|
|
46
|
+
_lib.util.hasValue('string').should.be.true;
|
|
47
|
+
});
|
|
48
|
+
it('should handle booleans', function () {
|
|
49
|
+
_lib.util.hasValue(false).should.be.true;
|
|
50
|
+
});
|
|
51
|
+
it('should handle empty strings', function () {
|
|
52
|
+
_lib.util.hasValue('').should.be.true;
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('hasContent', function () {
|
|
56
|
+
it('should exist', function () {
|
|
57
|
+
should.exist(_lib.util.hasContent);
|
|
58
|
+
});
|
|
59
|
+
it('should handle undefined', function () {
|
|
60
|
+
_lib.util.hasContent(undefined).should.be.false;
|
|
61
|
+
});
|
|
62
|
+
it('should handle not a number', function () {
|
|
63
|
+
_lib.util.hasContent(NaN).should.be.false;
|
|
64
|
+
});
|
|
65
|
+
it('should handle null', function () {
|
|
66
|
+
_lib.util.hasContent(null).should.be.false;
|
|
67
|
+
});
|
|
68
|
+
it('should handle functions', function () {
|
|
69
|
+
_lib.util.hasContent(function () {}).should.be.false;
|
|
70
|
+
});
|
|
71
|
+
it('should handle empty arrays', function () {
|
|
72
|
+
_lib.util.hasContent({}).should.be.false;
|
|
73
|
+
});
|
|
74
|
+
it('should handle zero', function () {
|
|
75
|
+
_lib.util.hasContent(0).should.be.false;
|
|
76
|
+
});
|
|
77
|
+
it('should handle simple string', function () {
|
|
78
|
+
_lib.util.hasContent('string').should.be.true;
|
|
79
|
+
});
|
|
80
|
+
it('should handle booleans', function () {
|
|
81
|
+
_lib.util.hasContent(false).should.be.false;
|
|
82
|
+
});
|
|
83
|
+
it('should handle empty strings', function () {
|
|
84
|
+
_lib.util.hasContent('').should.be.false;
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('escapeSpace', function () {
|
|
88
|
+
it('should do nothing to a string without space', function () {
|
|
89
|
+
let actual = 'appium';
|
|
90
|
+
let expected = 'appium';
|
|
91
|
+
|
|
92
|
+
_lib.util.escapeSpace(actual).should.equal(expected);
|
|
93
|
+
});
|
|
94
|
+
it('should do escape spaces', function () {
|
|
95
|
+
let actual = '/Applications/ Xcode 6.1.1.app/Contents/Developer';
|
|
96
|
+
let expected = '/Applications/\\ Xcode\\ 6.1.1.app/Contents/Developer';
|
|
97
|
+
|
|
98
|
+
_lib.util.escapeSpace(actual).should.equal(expected);
|
|
99
|
+
});
|
|
100
|
+
it('should escape consecutive spaces', function () {
|
|
101
|
+
let actual = 'appium space';
|
|
102
|
+
let expected = 'appium\\ \\ \\ space';
|
|
103
|
+
|
|
104
|
+
_lib.util.escapeSpace(actual).should.equal(expected);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe('localIp', function () {
|
|
108
|
+
it('should find a local ip address', function () {
|
|
109
|
+
let ifConfigOut = {
|
|
110
|
+
lo0: [{
|
|
111
|
+
address: '::1',
|
|
112
|
+
netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
|
|
113
|
+
family: 'IPv6',
|
|
114
|
+
mac: '00:00:00:00:00:00',
|
|
115
|
+
scopeid: 0,
|
|
116
|
+
internal: true
|
|
117
|
+
}, {
|
|
118
|
+
address: '127.0.0.1',
|
|
119
|
+
netmask: '255.0.0.0',
|
|
120
|
+
family: 'IPv4',
|
|
121
|
+
mac: '00:00:00:00:00:00',
|
|
122
|
+
internal: true
|
|
123
|
+
}, {
|
|
124
|
+
address: 'fe80::1',
|
|
125
|
+
netmask: 'ffff:ffff:ffff:ffff::',
|
|
126
|
+
family: 'IPv6',
|
|
127
|
+
mac: '00:00:00:00:00:00',
|
|
128
|
+
scopeid: 1,
|
|
129
|
+
internal: true
|
|
130
|
+
}],
|
|
131
|
+
en0: [{
|
|
132
|
+
address: 'xxx',
|
|
133
|
+
netmask: 'ffff:ffff:ffff:ffff::',
|
|
134
|
+
family: 'IPv6',
|
|
135
|
+
mac: 'd0:e1:40:93:56:9a',
|
|
136
|
+
scopeid: 4,
|
|
137
|
+
internal: false
|
|
138
|
+
}, {
|
|
139
|
+
address: '123.123.123.123',
|
|
140
|
+
netmask: '255.255.254.0',
|
|
141
|
+
family: 'IPv4',
|
|
142
|
+
mac: 'xxx',
|
|
143
|
+
internal: false
|
|
144
|
+
}],
|
|
145
|
+
awdl0: [{
|
|
146
|
+
address: 'xxx',
|
|
147
|
+
netmask: 'ffff:ffff:ffff:ffff::',
|
|
148
|
+
family: 'IPv6',
|
|
149
|
+
mac: 'xxx',
|
|
150
|
+
scopeid: 7,
|
|
151
|
+
internal: false
|
|
152
|
+
}]
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
let osMock = _sinon.default.mock(_os.default);
|
|
156
|
+
|
|
157
|
+
osMock.expects('networkInterfaces').returns(ifConfigOut);
|
|
158
|
+
ifConfigOut = '';
|
|
159
|
+
|
|
160
|
+
let ip = _lib.util.localIp();
|
|
161
|
+
|
|
162
|
+
ip.should.eql('123.123.123.123');
|
|
163
|
+
osMock.verify();
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
describe('cancellableDelay', function () {
|
|
167
|
+
it('should delay', async function () {
|
|
168
|
+
await _lib.util.cancellableDelay('10');
|
|
169
|
+
});
|
|
170
|
+
it('cancel should work', async function () {
|
|
171
|
+
let delay = _lib.util.cancellableDelay('1000');
|
|
172
|
+
|
|
173
|
+
await _bluebird.default.delay(10);
|
|
174
|
+
delay.cancel();
|
|
175
|
+
await delay.should.eventually.be.rejectedWith(/cancellation error/);
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
describe('safeJsonParse', function () {
|
|
179
|
+
it('should pass object through', function () {
|
|
180
|
+
const obj = {
|
|
181
|
+
a: 'a',
|
|
182
|
+
b: 'b'
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
_lib.util.safeJsonParse(obj).should.equal(obj);
|
|
186
|
+
});
|
|
187
|
+
it('should correctly parse json string', function () {
|
|
188
|
+
const obj = {
|
|
189
|
+
a: 'a',
|
|
190
|
+
b: 'b'
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
_lib.util.safeJsonParse(JSON.stringify(obj)).should.eql(obj);
|
|
194
|
+
});
|
|
195
|
+
it('should pass an array through', function () {
|
|
196
|
+
const arr = ['a', 'b'];
|
|
197
|
+
|
|
198
|
+
_lib.util.safeJsonParse(arr).should.eql(arr);
|
|
199
|
+
});
|
|
200
|
+
it('should correctly parse json array', function () {
|
|
201
|
+
const arr = ['a', 'b'];
|
|
202
|
+
|
|
203
|
+
_lib.util.safeJsonParse(JSON.stringify(arr)).should.eql(arr);
|
|
204
|
+
});
|
|
205
|
+
it('should pass null through', function () {
|
|
206
|
+
const obj = null;
|
|
207
|
+
_lodash.default.isNull(_lib.util.safeJsonParse(obj)).should.be.true;
|
|
208
|
+
});
|
|
209
|
+
it('should pass simple string through', function () {
|
|
210
|
+
const str = 'str';
|
|
211
|
+
|
|
212
|
+
_lib.util.safeJsonParse(str).should.eql(str);
|
|
213
|
+
});
|
|
214
|
+
it('should pass a number through', function () {
|
|
215
|
+
const num = 42;
|
|
216
|
+
|
|
217
|
+
_lib.util.safeJsonParse(num).should.eql(num);
|
|
218
|
+
});
|
|
219
|
+
it('should make a number from a string representation', function () {
|
|
220
|
+
const num = 42;
|
|
221
|
+
|
|
222
|
+
_lib.util.safeJsonParse(String(num)).should.eql(num);
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
describe('jsonStringify', function () {
|
|
226
|
+
it('should use JSON.stringify if no Buffer involved', function () {
|
|
227
|
+
const obj = {
|
|
228
|
+
k1: 'v1',
|
|
229
|
+
k2: 'v2',
|
|
230
|
+
k3: 'v3'
|
|
231
|
+
};
|
|
232
|
+
const jsonString = JSON.stringify(obj, null, 2);
|
|
233
|
+
|
|
234
|
+
_lib.util.jsonStringify(obj).should.eql(jsonString);
|
|
235
|
+
});
|
|
236
|
+
it('should serialize a Buffer', function () {
|
|
237
|
+
const obj = {
|
|
238
|
+
k1: 'v1',
|
|
239
|
+
k2: 'v2',
|
|
240
|
+
k3: Buffer.from('hi how are you today')
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
_lib.util.jsonStringify(obj).should.include('hi how are you today');
|
|
244
|
+
});
|
|
245
|
+
it('should use the replacer function on non-buffer values', function () {
|
|
246
|
+
const obj = {
|
|
247
|
+
k1: 'v1',
|
|
248
|
+
k2: 'v2',
|
|
249
|
+
k3: 'v3'
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
function replacer(key, value) {
|
|
253
|
+
return _lodash.default.isString(value) ? value.toUpperCase() : value;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const jsonString = _lib.util.jsonStringify(obj, replacer);
|
|
257
|
+
|
|
258
|
+
jsonString.should.include('V1');
|
|
259
|
+
jsonString.should.include('V2');
|
|
260
|
+
jsonString.should.include('V3');
|
|
261
|
+
});
|
|
262
|
+
it('should use the replacer function on buffers', function () {
|
|
263
|
+
const obj = {
|
|
264
|
+
k1: 'v1',
|
|
265
|
+
k2: 'v2',
|
|
266
|
+
k3: Buffer.from('hi how are you today')
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
function replacer(key, value) {
|
|
270
|
+
return _lodash.default.isString(value) ? value.toUpperCase() : value;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const jsonString = _lib.util.jsonStringify(obj, replacer);
|
|
274
|
+
|
|
275
|
+
jsonString.should.include('V1');
|
|
276
|
+
jsonString.should.include('V2');
|
|
277
|
+
jsonString.should.include('HI HOW ARE YOU TODAY');
|
|
278
|
+
});
|
|
279
|
+
it('should use the replacer function recursively', function () {
|
|
280
|
+
const obj = {
|
|
281
|
+
k1: 'v1',
|
|
282
|
+
k2: 'v2',
|
|
283
|
+
k3: Buffer.from('hi how are you today'),
|
|
284
|
+
k4: {
|
|
285
|
+
k5: 'v5'
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
function replacer(key, value) {
|
|
290
|
+
return _lodash.default.isString(value) ? value.toUpperCase() : value;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const jsonString = _lib.util.jsonStringify(obj, replacer);
|
|
294
|
+
|
|
295
|
+
jsonString.should.include('V1');
|
|
296
|
+
jsonString.should.include('V2');
|
|
297
|
+
jsonString.should.include('HI HOW ARE YOU TODAY');
|
|
298
|
+
jsonString.should.include('V5');
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
describe('unwrapElement', function () {
|
|
302
|
+
it('should pass through an unwrapped element', function () {
|
|
303
|
+
let el = 4;
|
|
304
|
+
|
|
305
|
+
_lib.util.unwrapElement(el).should.equal(el);
|
|
306
|
+
});
|
|
307
|
+
it('should pass through an element that is an object', function () {
|
|
308
|
+
let el = {
|
|
309
|
+
RANDOM: 4
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
_lib.util.unwrapElement(el).should.equal(el);
|
|
313
|
+
});
|
|
314
|
+
it('should unwrap a wrapped element', function () {
|
|
315
|
+
let el = {
|
|
316
|
+
ELEMENT: 4
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
_lib.util.unwrapElement(el).should.eql(4);
|
|
320
|
+
});
|
|
321
|
+
it('should unwrap a wrapped element that uses W3C element identifier', function () {
|
|
322
|
+
let el = {
|
|
323
|
+
[W3C_WEB_ELEMENT_IDENTIFIER]: 5
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
_lib.util.unwrapElement(el).should.eql(5);
|
|
327
|
+
});
|
|
328
|
+
it('should unwrap a wrapped element and prioritize W3C element identifier', function () {
|
|
329
|
+
let el = {
|
|
330
|
+
ELEMENT: 7,
|
|
331
|
+
[W3C_WEB_ELEMENT_IDENTIFIER]: 6
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
_lib.util.unwrapElement(el).should.eql(6);
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
describe('wrapElement', function () {
|
|
338
|
+
it('should include ELEMENT and w3c element', function () {
|
|
339
|
+
_lib.util.wrapElement(123).should.eql({
|
|
340
|
+
[_lib.util.W3C_WEB_ELEMENT_IDENTIFIER]: 123,
|
|
341
|
+
ELEMENT: 123
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
describe('toReadableSizeString', function () {
|
|
346
|
+
it('should fail if cannot convert to Bytes', function () {
|
|
347
|
+
(() => _lib.util.toReadableSizeString('asdasd')).should.throw(/Cannot convert/);
|
|
348
|
+
});
|
|
349
|
+
it('should properly convert to Bytes', function () {
|
|
350
|
+
_lib.util.toReadableSizeString(0).should.equal('0 B');
|
|
351
|
+
});
|
|
352
|
+
it('should properly convert to KBytes', function () {
|
|
353
|
+
_lib.util.toReadableSizeString(2048 + 12).should.equal('2.01 KB');
|
|
354
|
+
});
|
|
355
|
+
it('should properly convert to MBytes', function () {
|
|
356
|
+
_lib.util.toReadableSizeString(1024 * 1024 * 3 + 1024 * 10).should.equal('3.01 MB');
|
|
357
|
+
});
|
|
358
|
+
it('should properly convert to GBytes', function () {
|
|
359
|
+
_lib.util.toReadableSizeString(1024 * 1024 * 1024 * 5).should.equal('5.00 GB');
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
describe('filterObject', function () {
|
|
363
|
+
describe('with undefined predicate', function () {
|
|
364
|
+
it('should filter out undefineds', function () {
|
|
365
|
+
let obj = {
|
|
366
|
+
a: 'a',
|
|
367
|
+
b: 'b',
|
|
368
|
+
c: undefined
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
_lib.util.filterObject(obj).should.eql({
|
|
372
|
+
a: 'a',
|
|
373
|
+
b: 'b'
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
it('should leave nulls alone', function () {
|
|
377
|
+
let obj = {
|
|
378
|
+
a: 'a',
|
|
379
|
+
b: 'b',
|
|
380
|
+
c: null
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
_lib.util.filterObject(obj).should.eql({
|
|
384
|
+
a: 'a',
|
|
385
|
+
b: 'b',
|
|
386
|
+
c: null
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
describe('with value predicate', function () {
|
|
391
|
+
it('should filter elements by their value', function () {
|
|
392
|
+
let obj = {
|
|
393
|
+
a: 'a',
|
|
394
|
+
b: 'b',
|
|
395
|
+
c: 'c',
|
|
396
|
+
d: 'a'
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
_lib.util.filterObject(obj, 'a').should.eql({
|
|
400
|
+
a: 'a',
|
|
401
|
+
d: 'a'
|
|
402
|
+
});
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
describe('with function predicate', function () {
|
|
406
|
+
it('should filter elements', function () {
|
|
407
|
+
let obj = {
|
|
408
|
+
a: 'a',
|
|
409
|
+
b: 'b',
|
|
410
|
+
c: 'c'
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
_lib.util.filterObject(obj, v => v === 'a' || v === 'c').should.eql({
|
|
414
|
+
a: 'a',
|
|
415
|
+
c: 'c'
|
|
416
|
+
});
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
describe('isSubPath', function () {
|
|
421
|
+
it('should detect simple subpath', function () {
|
|
422
|
+
_lib.util.isSubPath('/root/some', '/root').should.be.true;
|
|
423
|
+
});
|
|
424
|
+
it('should detect complex subpath', function () {
|
|
425
|
+
_lib.util.isSubPath('/root/some/other/../../.', '/root').should.be.true;
|
|
426
|
+
});
|
|
427
|
+
it('should detect subpath ending with a slash', function () {
|
|
428
|
+
_lib.util.isSubPath('/root/some/', '/root').should.be.true;
|
|
429
|
+
});
|
|
430
|
+
it('should detect if a path is not a subpath', function () {
|
|
431
|
+
_lib.util.isSubPath('/root/some//../..', '/root').should.be.false;
|
|
432
|
+
});
|
|
433
|
+
it('should throw if any of the given paths is not absolute', function () {
|
|
434
|
+
should.throw(() => _lib.util.isSubPath('some/..', '/root'), /absolute/);
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
describe('isSameDestination', function () {
|
|
438
|
+
let path1;
|
|
439
|
+
let path2;
|
|
440
|
+
let tmpDir;
|
|
441
|
+
before(async function () {
|
|
442
|
+
tmpDir = await _lib.tempDir.openDir();
|
|
443
|
+
path1 = _path.default.resolve(tmpDir, 'path1.txt');
|
|
444
|
+
path2 = _path.default.resolve(tmpDir, 'path2.txt');
|
|
445
|
+
|
|
446
|
+
for (const p of [path1, path2]) {
|
|
447
|
+
await _lib.fs.writeFile(p, p, 'utf8');
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
after(async function () {
|
|
451
|
+
await _lib.fs.rimraf(tmpDir);
|
|
452
|
+
});
|
|
453
|
+
it('should match paths to the same file/folder', async function () {
|
|
454
|
+
(await _lib.util.isSameDestination(path1, _path.default.resolve(tmpDir, '..', _path.default.basename(tmpDir), _path.default.basename(path1)))).should.be.true;
|
|
455
|
+
});
|
|
456
|
+
it('should not match paths if they point to non existing items', async function () {
|
|
457
|
+
(await _lib.util.isSameDestination(path1, 'blabla')).should.be.false;
|
|
458
|
+
});
|
|
459
|
+
it('should not match paths to different files', async function () {
|
|
460
|
+
(await _lib.util.isSameDestination(path1, path2)).should.be.false;
|
|
461
|
+
});
|
|
462
|
+
});
|
|
463
|
+
describe('compareVersions', function () {
|
|
464
|
+
it('should compare two correct version numbers', function () {
|
|
465
|
+
_lib.util.compareVersions('10.0', '<', '11.0').should.eql(true);
|
|
466
|
+
|
|
467
|
+
_lib.util.compareVersions('11.0', '>=', '11.0').should.eql(true);
|
|
468
|
+
|
|
469
|
+
_lib.util.compareVersions('11.0', '==', '11.0').should.eql(true);
|
|
470
|
+
|
|
471
|
+
_lib.util.compareVersions('13.10', '>', '13.5').should.eql(true);
|
|
472
|
+
|
|
473
|
+
_lib.util.compareVersions('11.1', '!=', '11.10').should.eql(true);
|
|
474
|
+
|
|
475
|
+
_lib.util.compareVersions('12.0', '<', 10).should.eql(false);
|
|
476
|
+
});
|
|
477
|
+
it('should throw if any of version arguments is invalid', function () {
|
|
478
|
+
should.throw(() => _lib.util.compareVersions(undefined, '<', '11.0'));
|
|
479
|
+
should.throw(() => _lib.util.compareVersions('11.0', '==', null));
|
|
480
|
+
});
|
|
481
|
+
it('should throw if comparison operator is unsupported', function () {
|
|
482
|
+
should.throw(() => _lib.util.compareVersions('12.0', 'abc', 10));
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
describe('quote', function () {
|
|
486
|
+
it('should quote a string with a space', function () {
|
|
487
|
+
_lib.util.quote(['a', 'b', 'c d']).should.eql('a b \'c d\'');
|
|
488
|
+
});
|
|
489
|
+
it('should escape double quotes', function () {
|
|
490
|
+
_lib.util.quote(['a', 'b', `it's a "neat thing"`]).should.eql(`a b "it's a \\"neat thing\\""`);
|
|
491
|
+
});
|
|
492
|
+
it("should escape $ ` and '", function () {
|
|
493
|
+
_lib.util.quote(['$', '`', `'`]).should.eql('\\$ \\` "\'"');
|
|
494
|
+
});
|
|
495
|
+
it('should handle empty array', function () {
|
|
496
|
+
_lib.util.quote([]).should.eql('');
|
|
497
|
+
});
|
|
498
|
+
it('should quote a string with newline', function () {
|
|
499
|
+
_lib.util.quote(['a\nb']).should.eql(`'a\nb'`);
|
|
500
|
+
});
|
|
501
|
+
it('should stringify booleans', function () {
|
|
502
|
+
_lib.util.quote(['a', 1, true, false]).should.eql('a 1 true false');
|
|
503
|
+
});
|
|
504
|
+
it('should stringify null and undefined', function () {
|
|
505
|
+
_lib.util.quote(['a', 1, null, undefined]).should.eql('a 1 null undefined');
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
describe('unleakString', function () {
|
|
509
|
+
it('should unleak a string', function () {
|
|
510
|
+
_lib.util.unleakString('yolo').should.eql('yolo');
|
|
511
|
+
});
|
|
512
|
+
it('should unleak a multiline string', function () {
|
|
513
|
+
_lib.util.unleakString(' yolo\nbolo ').should.eql(' yolo\nbolo ');
|
|
514
|
+
});
|
|
515
|
+
it('should convert an object to a string', function () {
|
|
516
|
+
for (const obj of [{}, null, undefined, [], 0]) {
|
|
517
|
+
_lib.util.unleakString(obj).should.eql(`${obj}`);
|
|
518
|
+
}
|
|
519
|
+
});
|
|
520
|
+
});
|
|
521
|
+
describe('pluralize', function () {
|
|
522
|
+
it('should pluralize a string', function () {
|
|
523
|
+
_lib.util.pluralize('word', 2).should.eql('words');
|
|
524
|
+
});
|
|
525
|
+
it('should pluralize a string and prepend the number through boolean', function () {
|
|
526
|
+
_lib.util.pluralize('word', 2, true).should.eql('2 words');
|
|
527
|
+
});
|
|
528
|
+
it('should pluralize a string and prepend the number through options', function () {
|
|
529
|
+
_lib.util.pluralize('word', 2, {
|
|
530
|
+
inclusive: true
|
|
531
|
+
}).should.eql('2 words');
|
|
532
|
+
});
|
|
533
|
+
});
|
|
534
|
+
});require('source-map-support').install();
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvdXRpbC1zcGVjcy5qcyJdLCJuYW1lcyI6WyJXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiIsInV0aWwiLCJkZXNjcmliZSIsIml0Iiwic2hvdWxkIiwiZXhpc3QiLCJoYXNWYWx1ZSIsInVuZGVmaW5lZCIsImJlIiwiZmFsc2UiLCJOYU4iLCJ0cnVlIiwiaGFzQ29udGVudCIsImFjdHVhbCIsImV4cGVjdGVkIiwiZXNjYXBlU3BhY2UiLCJlcXVhbCIsImlmQ29uZmlnT3V0IiwibG8wIiwiYWRkcmVzcyIsIm5ldG1hc2siLCJmYW1pbHkiLCJtYWMiLCJzY29wZWlkIiwiaW50ZXJuYWwiLCJlbjAiLCJhd2RsMCIsIm9zTW9jayIsInNpbm9uIiwibW9jayIsIm9zIiwiZXhwZWN0cyIsInJldHVybnMiLCJpcCIsImxvY2FsSXAiLCJlcWwiLCJ2ZXJpZnkiLCJjYW5jZWxsYWJsZURlbGF5IiwiZGVsYXkiLCJCIiwiY2FuY2VsIiwiZXZlbnR1YWxseSIsInJlamVjdGVkV2l0aCIsIm9iaiIsImEiLCJiIiwic2FmZUpzb25QYXJzZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJhcnIiLCJfIiwiaXNOdWxsIiwic3RyIiwibnVtIiwiU3RyaW5nIiwiazEiLCJrMiIsImszIiwianNvblN0cmluZyIsImpzb25TdHJpbmdpZnkiLCJCdWZmZXIiLCJmcm9tIiwiaW5jbHVkZSIsInJlcGxhY2VyIiwia2V5IiwidmFsdWUiLCJpc1N0cmluZyIsInRvVXBwZXJDYXNlIiwiazQiLCJrNSIsImVsIiwidW53cmFwRWxlbWVudCIsIlJBTkRPTSIsIkVMRU1FTlQiLCJ3cmFwRWxlbWVudCIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwidGhyb3ciLCJjIiwiZmlsdGVyT2JqZWN0IiwiZCIsInYiLCJpc1N1YlBhdGgiLCJwYXRoMSIsInBhdGgyIiwidG1wRGlyIiwiYmVmb3JlIiwidGVtcERpciIsIm9wZW5EaXIiLCJwYXRoIiwicmVzb2x2ZSIsInAiLCJmcyIsIndyaXRlRmlsZSIsImFmdGVyIiwicmltcmFmIiwiaXNTYW1lRGVzdGluYXRpb24iLCJiYXNlbmFtZSIsImNvbXBhcmVWZXJzaW9ucyIsInF1b3RlIiwidW5sZWFrU3RyaW5nIiwicGx1cmFsaXplIiwiaW5jbHVzaXZlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNO0FBQUNBLEVBQUFBO0FBQUQsSUFBK0JDLFNBQXJDO0FBSUFDLFFBQVEsQ0FBQyxNQUFELEVBQVMsWUFBWTtBQUMzQkEsRUFBQUEsUUFBUSxDQUFDLFVBQUQsRUFBYSxZQUFZO0FBQy9CQyxJQUFBQSxFQUFFLENBQUMsY0FBRCxFQUFpQixZQUFZO0FBQzdCQyxNQUFBQSxNQUFNLENBQUNDLEtBQVAsQ0FBYUosVUFBS0ssUUFBbEI7QUFDRCxLQUZDLENBQUY7QUFJQUgsSUFBQUEsRUFBRSxDQUFDLHlCQUFELEVBQTRCLFlBQVk7QUFDeENGLGdCQUFLSyxRQUFMLENBQWNDLFNBQWQsRUFBeUJILE1BQXpCLENBQWdDSSxFQUFoQyxDQUFtQ0MsS0FBbkM7QUFDRCxLQUZDLENBQUY7QUFJQU4sSUFBQUEsRUFBRSxDQUFDLDRCQUFELEVBQStCLFlBQVk7QUFDM0NGLGdCQUFLSyxRQUFMLENBQWNJLEdBQWQsRUFBbUJOLE1BQW5CLENBQTBCSSxFQUExQixDQUE2QkMsS0FBN0I7QUFDRCxLQUZDLENBQUY7QUFJQU4sSUFBQUEsRUFBRSxDQUFDLG9CQUFELEVBQXVCLFlBQVk7QUFDbkNGLGdCQUFLSyxRQUFMLENBQWMsSUFBZCxFQUFvQkYsTUFBcEIsQ0FBMkJJLEVBQTNCLENBQThCQyxLQUE5QjtBQUNELEtBRkMsQ0FBRjtBQUlBTixJQUFBQSxFQUFFLENBQUMseUJBQUQsRUFBNEIsWUFBWTtBQUN4Q0YsZ0JBQUtLLFFBQUwsQ0FBYyxZQUFZLENBQUUsQ0FBNUIsRUFBOEJGLE1BQTlCLENBQXFDSSxFQUFyQyxDQUF3Q0csSUFBeEM7QUFDRCxLQUZDLENBQUY7QUFJQVIsSUFBQUEsRUFBRSxDQUFD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cG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5jb25zdCB7VzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJ9ID0gdXRpbDtcblxuXG5cbmRlc2NyaWJlKCd1dGlsJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnaGFzVmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBleGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5leGlzdCh1dGlsLmhhc1ZhbHVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHVuZGVmaW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzVmFsdWUodW5kZWZpbmVkKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBub3QgYSBudW1iZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKE5hTikuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzVmFsdWUobnVsbCkuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZnVuY3Rpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNWYWx1ZShmdW5jdGlvbiAoKSB7fSkuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBhcnJheXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKHt9KS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHplcm8nLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKDApLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc2ltcGxlIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzVmFsdWUoJ3N0cmluZycpLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYm9vbGVhbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKGZhbHNlKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGVtcHR5IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc1ZhbHVlKCcnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2hhc0NvbnRlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBleGlzdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5leGlzdCh1dGlsLmhhc0NvbnRlbnQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgdW5kZWZpbmVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KHVuZGVmaW5lZCkuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbm90IGEgbnVtYmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KE5hTikuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzQ29udGVudChudWxsKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBmdW5jdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmhhc0NvbnRlbnQoZnVuY3Rpb24gKCkge30pLnNob3VsZC5iZS5mYWxzZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGVtcHR5IGFycmF5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzQ29udGVudCh7fSkuc2hvdWxkLmJlLmZhbHNlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgemVybycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaGFzQ29udGVudCgwKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBzaW1wbGUgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KCdzdHJpbmcnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGJvb2xlYW5zJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KGZhbHNlKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5oYXNDb250ZW50KCcnKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlc2NhcGVTcGFjZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGRvIG5vdGhpbmcgdG8gYSBzdHJpbmcgd2l0aG91dCBzcGFjZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBhY3R1YWwgPSAnYXBwaXVtJztcbiAgICAgIGxldCBleHBlY3RlZCA9ICdhcHBpdW0nO1xuICAgICAgdXRpbC5lc2NhcGVTcGFjZShhY3R1YWwpLnNob3VsZC5lcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRvIGVzY2FwZSBzcGFjZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgYWN0dWFsID0gJy9BcHBsaWNhdGlvbnMvIFhjb2RlIDYuMS4xLmFwcC9Db250ZW50cy9EZXZlbG9wZXInO1xuICAgICAgbGV0IGV4cGVjdGVkID0gJy9BcHBsaWNhdGlvbnMvXFxcXCBYY29kZVxcXFwgNi4xLjEuYXBwL0NvbnRlbnRzL0RldmVsb3Blcic7XG4gICAgICB1dGlsLmVzY2FwZVNwYWNlKGFjdHVhbCkuc2hvdWxkLmVxdWFsKGV4cGVjdGVkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXNjYXBlIGNvbnNlY3V0aXZlIHNwYWNlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBhY3R1YWwgPSAnYXBwaXVtICAgc3BhY2UnO1xuICAgICAgbGV0IGV4cGVjdGVkID0gJ2FwcGl1bVxcXFwgXFxcXCBcXFxcIHNwYWNlJztcbiAgICAgIHV0aWwuZXNjYXBlU3BhY2UoYWN0dWFsKS5zaG91bGQuZXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbG9jYWxJcCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGZpbmQgYSBsb2NhbCBpcCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGlmQ29uZmlnT3V0ID0ge1xuICAgICAgICBsbzA6XG4gICAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnOjoxJyxcbiAgICAgICAgICAgICAgbmV0bWFzazogJ2ZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZicsXG4gICAgICAgICAgICAgIGZhbWlseTogJ0lQdjYnLFxuICAgICAgICAgICAgICBtYWM6ICcwMDowMDowMDowMDowMDowMCcsXG4gICAgICAgICAgICAgIHNjb3BlaWQ6IDAsXG4gICAgICAgICAgICAgIGludGVybmFsOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJzEyNy4wLjAuMScsXG4gICAgICAgICAgICAgIG5ldG1hc2s6ICcyNTUuMC4wLjAnLFxuICAgICAgICAgICAgICBmYW1pbHk6ICdJUHY0JyxcbiAgICAgICAgICAgICAgbWFjOiAnMDA6MDA6MDA6MDA6MDA6MDAnLFxuICAgICAgICAgICAgICBpbnRlcm5hbDogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICdmZTgwOjoxJyxcbiAgICAgICAgICAgICAgbmV0bWFzazogJ2ZmZmY6ZmZmZjpmZmZmOmZmZmY6OicsXG4gICAgICAgICAgICAgIGZhbWlseTogJ0lQdjYnLFxuICAgICAgICAgICAgICBtYWM6ICcwMDowMDowMDowMDowMDowMCcsXG4gICAgICAgICAgICAgIHNjb3BlaWQ6IDEsXG4gICAgICAgICAgICAgIGludGVybmFsOiB0cnVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgIGVuMDpcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICd4eHgnLFxuICAgICAgICAgICAgICBuZXRtYXNrOiAnZmZmZjpmZmZmOmZmZmY6ZmZmZjo6JyxcbiAgICAgICAgICAgICAgZmFtaWx5OiAnSVB2NicsXG4gICAgICAgICAgICAgIG1hYzogJ2QwOmUxOjQwOjkzOjU2OjlhJyxcbiAgICAgICAgICAgICAgc2NvcGVpZDogNCxcbiAgICAgICAgICAgICAgaW50ZXJuYWw6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJzEyMy4xMjMuMTIzLjEyMycsXG4gICAgICAgICAgICAgIG5ldG1hc2s6ICcyNTUuMjU1LjI1NC4wJyxcbiAgICAgICAgICAgICAgZmFtaWx5OiAnSVB2NCcsXG4gICAgICAgICAgICAgIG1hYzogJ3h4eCcsXG4gICAgICAgICAgICAgIGludGVybmFsOiBmYWxzZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICBhd2RsMDpcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICd4eHgnLFxuICAgICAgICAgICAgICBuZXRtYXNrOiAnZmZmZjpmZmZmOmZmZmY6ZmZmZjo6JyxcbiAgICAgICAgICAgICAgZmFtaWx5OiAnSVB2NicsXG4gICAgICAgICAgICAgIG1hYzogJ3h4eCcsXG4gICAgICAgICAgICAgIHNjb3BlaWQ6IDcsXG4gICAgICAgICAgICAgIGludGVybmFsOiBmYWxzZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGxldCBvc01vY2sgPSBzaW5vbi5tb2NrKG9zKTtcbiAgICAgIG9zTW9jay5leHBlY3RzKCduZXR3b3JrSW50ZXJmYWNlcycpLnJldHVybnMoaWZDb25maWdPdXQpO1xuICAgICAgaWZDb25maWdPdXQgPSAnJztcbiAgICAgIGxldCBpcCA9IHV0aWwubG9jYWxJcCgpO1xuICAgICAgaXAuc2hvdWxkLmVxbCgnMTIzLjEyMy4xMjMuMTIzJyk7XG4gICAgICBvc01vY2sudmVyaWZ5KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjYW5jZWxsYWJsZURlbGF5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZGVsYXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB1dGlsLmNhbmNlbGxhYmxlRGVsYXkoJzEwJyk7XG4gICAgfSk7XG4gICAgaXQoJ2NhbmNlbCBzaG91bGQgd29yaycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBkZWxheSA9IHV0aWwuY2FuY2VsbGFibGVEZWxheSgnMTAwMCcpO1xuICAgICAgYXdhaXQgQi5kZWxheSgxMCk7XG4gICAgICBkZWxheS5jYW5jZWwoKTtcbiAgICAgIGF3YWl0IGRlbGF5LnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgvY2FuY2VsbGF0aW9uIGVycm9yLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzYWZlSnNvblBhcnNlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcGFzcyBvYmplY3QgdGhyb3VnaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHthOiAnYScsIGI6ICdiJ307XG4gICAgICB1dGlsLnNhZmVKc29uUGFyc2Uob2JqKS5zaG91bGQuZXF1YWwob2JqKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBwYXJzZSBqc29uIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHthOiAnYScsIGI6ICdiJ307XG4gICAgICB1dGlsLnNhZmVKc29uUGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSkuc2hvdWxkLmVxbChvYmopO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGFzcyBhbiBhcnJheSB0aHJvdWdoJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYXJyID0gWydhJywgJ2InXTtcbiAgICAgIHV0aWwuc2FmZUpzb25QYXJzZShhcnIpLnNob3VsZC5lcWwoYXJyKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBwYXJzZSBqc29uIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYXJyID0gWydhJywgJ2InXTtcbiAgICAgIHV0aWwuc2FmZUpzb25QYXJzZShKU09OLnN0cmluZ2lmeShhcnIpKS5zaG91bGQuZXFsKGFycik7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIG51bGwgdGhyb3VnaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iaiA9IG51bGw7XG4gICAgICBfLmlzTnVsbCh1dGlsLnNhZmVKc29uUGFyc2Uob2JqKSkuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIHNpbXBsZSBzdHJpbmcgdGhyb3VnaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN0ciA9ICdzdHInO1xuICAgICAgdXRpbC5zYWZlSnNvblBhcnNlKHN0cikuc2hvdWxkLmVxbChzdHIpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGFzcyBhIG51bWJlciB0aHJvdWdoJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbnVtID0gNDI7XG4gICAgICB1dGlsLnNhZmVKc29uUGFyc2UobnVtKS5zaG91bGQuZXFsKG51bSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYWtlIGEgbnVtYmVyIGZyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBudW0gPSA0MjtcbiAgICAgIHV0aWwuc2FmZUpzb25QYXJzZShTdHJpbmcobnVtKSkuc2hvdWxkLmVxbChudW0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnanNvblN0cmluZ2lmeScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHVzZSBKU09OLnN0cmluZ2lmeSBpZiBubyBCdWZmZXIgaW52b2x2ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvYmogPSB7XG4gICAgICAgIGsxOiAndjEnLFxuICAgICAgICBrMjogJ3YyJyxcbiAgICAgICAgazM6ICd2MycsXG4gICAgICB9O1xuICAgICAgY29uc3QganNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7XG4gICAgICB1dGlsLmpzb25TdHJpbmdpZnkob2JqKS5zaG91bGQuZXFsKGpzb25TdHJpbmcpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgc2VyaWFsaXplIGEgQnVmZmVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb2JqID0ge1xuICAgICAgICBrMTogJ3YxJyxcbiAgICAgICAgazI6ICd2MicsXG4gICAgICAgIGszOiBCdWZmZXIuZnJvbSgnaGkgaG93IGFyZSB5b3UgdG9kYXknKSxcbiAgICAgIH07XG4gICAgICB1dGlsLmpzb25TdHJpbmdpZnkob2JqKS5zaG91bGQuaW5jbHVkZSgnaGkgaG93IGFyZSB5b3UgdG9kYXknKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgcmVwbGFjZXIgZnVuY3Rpb24gb24gbm9uLWJ1ZmZlciB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvYmogPSB7XG4gICAgICAgIGsxOiAndjEnLFxuICAgICAgICBrMjogJ3YyJyxcbiAgICAgICAgazM6ICd2MycsXG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gcmVwbGFjZXIgKGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUudG9VcHBlckNhc2UoKSA6IHZhbHVlO1xuICAgICAgfVxuICAgICAgY29uc3QganNvblN0cmluZyA9IHV0aWwuanNvblN0cmluZ2lmeShvYmosIHJlcGxhY2VyKTtcbiAgICAgIGpzb25TdHJpbmcuc2hvdWxkLmluY2x1ZGUoJ1YxJyk7XG4gICAgICBqc29uU3RyaW5nLnNob3VsZC5pbmNsdWRlKCdWMicpO1xuICAgICAganNvblN0cmluZy5zaG91bGQuaW5jbHVkZSgnVjMnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgcmVwbGFjZXIgZnVuY3Rpb24gb24gYnVmZmVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgICAgazE6ICd2MScsXG4gICAgICAgIGsyOiAndjInLFxuICAgICAgICBrMzogQnVmZmVyLmZyb20oJ2hpIGhvdyBhcmUgeW91IHRvZGF5JyksXG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gcmVwbGFjZXIgKGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUudG9VcHBlckNhc2UoKSA6IHZhbHVlO1xuICAgICAgfVxuICAgICAgY29uc3QganNvblN0cmluZyA9IHV0aWwuanNvblN0cmluZ2lmeShvYmosIHJlcGxhY2VyKTtcbiAgICAgIGpzb25TdHJpbmcuc2hvdWxkLmluY2x1ZGUoJ1YxJyk7XG4gICAgICBqc29uU3RyaW5nLnNob3VsZC5pbmNsdWRlKCdWMicpO1xuICAgICAganNvblN0cmluZy5zaG91bGQuaW5jbHVkZSgnSEkgSE9XIEFSRSBZT1UgVE9EQVknKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHVzZSB0aGUgcmVwbGFjZXIgZnVuY3Rpb24gcmVjdXJzaXZlbHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvYmogPSB7XG4gICAgICAgIGsxOiAndjEnLFxuICAgICAgICBrMjogJ3YyJyxcbiAgICAgICAgazM6IEJ1ZmZlci5mcm9tKCdoaSBob3cgYXJlIHlvdSB0b2RheScpLFxuICAgICAgICBrNDoge1xuICAgICAgICAgIGs1OiAndjUnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIHJlcGxhY2VyIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfLmlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlLnRvVXBwZXJDYXNlKCkgOiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSB1dGlsLmpzb25TdHJpbmdpZnkob2JqLCByZXBsYWNlcik7XG4gICAgICBqc29uU3RyaW5nLnNob3VsZC5pbmNsdWRlKCdWMScpO1xuICAgICAganNvblN0cmluZy5zaG91bGQuaW5jbHVkZSgnVjInKTtcbiAgICAgIGpzb25TdHJpbmcuc2hvdWxkLmluY2x1ZGUoJ0hJIEhPVyBBUkUgWU9VIFRPREFZJyk7XG4gICAgICBqc29uU3RyaW5nLnNob3VsZC5pbmNsdWRlKCdWNScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndW53cmFwRWxlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHBhc3MgdGhyb3VnaCBhbiB1bndyYXBwZWQgZWxlbWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBlbCA9IDQ7XG4gICAgICB1dGlsLnVud3JhcEVsZW1lbnQoZWwpLnNob3VsZC5lcXVhbChlbCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIHRocm91Z2ggYW4gZWxlbWVudCB0aGF0IGlzIGFuIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBlbCA9IHtSQU5ET006IDR9O1xuICAgICAgdXRpbC51bndyYXBFbGVtZW50KGVsKS5zaG91bGQuZXF1YWwoZWwpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdW53cmFwIGEgd3JhcHBlZCBlbGVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGVsID0ge0VMRU1FTlQ6IDR9O1xuICAgICAgdXRpbC51bndyYXBFbGVtZW50KGVsKS5zaG91bGQuZXFsKDQpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdW53cmFwIGEgd3JhcHBlZCBlbGVtZW50IHRoYXQgdXNlcyBXM0MgZWxlbWVudCBpZGVudGlmaWVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGVsID0ge1xuICAgICAgICBbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJdOiA1XG4gICAgICB9O1xuICAgICAgdXRpbC51bndyYXBFbGVtZW50KGVsKS5zaG91bGQuZXFsKDUpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdW53cmFwIGEgd3JhcHBlZCBlbGVtZW50IGFuZCBwcmlvcml0aXplIFczQyBlbGVtZW50IGlkZW50aWZpZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgZWwgPSB7XG4gICAgICAgIEVMRU1FTlQ6IDcsXG4gICAgICAgIFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl06IDYsXG4gICAgICB9O1xuICAgICAgdXRpbC51bndyYXBFbGVtZW50KGVsKS5zaG91bGQuZXFsKDYpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd3JhcEVsZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIEVMRU1FTlQgYW5kIHczYyBlbGVtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC53cmFwRWxlbWVudCgxMjMpLnNob3VsZC5lcWwoe1xuICAgICAgICBbdXRpbC5XM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUl06IDEyMyxcbiAgICAgICAgRUxFTUVOVDogMTIzLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0b1JlYWRhYmxlU2l6ZVN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgY2Fubm90IGNvbnZlcnQgdG8gQnl0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAoKCkgPT4gdXRpbC50b1JlYWRhYmxlU2l6ZVN0cmluZygnYXNkYXNkJykpLnNob3VsZC50aHJvdygvQ2Fubm90IGNvbnZlcnQvKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHByb3Blcmx5IGNvbnZlcnQgdG8gQnl0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnRvUmVhZGFibGVTaXplU3RyaW5nKDApLnNob3VsZC5lcXVhbCgnMCBCJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwcm9wZXJseSBjb252ZXJ0IHRvIEtCeXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwudG9SZWFkYWJsZVNpemVTdHJpbmcoMjA0OCArIDEyKS5zaG91bGQuZXF1YWwoJzIuMDEgS0InKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHByb3Blcmx5IGNvbnZlcnQgdG8gTUJ5dGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC50b1JlYWRhYmxlU2l6ZVN0cmluZygxMDI0ICogMTAyNCAqIDMgKyAxMDI0ICogMTApLnNob3VsZC5lcXVhbCgnMy4wMSBNQicpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcHJvcGVybHkgY29udmVydCB0byBHQnl0ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnRvUmVhZGFibGVTaXplU3RyaW5nKDEwMjQgKiAxMDI0ICogMTAyNCAqIDUpLnNob3VsZC5lcXVhbCgnNS4wMCBHQicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmlsdGVyT2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgIGRlc2NyaWJlKCd3aXRoIHVuZGVmaW5lZCBwcmVkaWNhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGZpbHRlciBvdXQgdW5kZWZpbmVkcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICBhOiAnYScsXG4gICAgICAgICAgYjogJ2InLFxuICAgICAgICAgIGM6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgdXRpbC5maWx0ZXJPYmplY3Qob2JqKS5zaG91bGQuZXFsKHtcbiAgICAgICAgICBhOiAnYScsXG4gICAgICAgICAgYjogJ2InLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBsZWF2ZSBudWxscyBhbG9uZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICBhOiAnYScsXG4gICAgICAgICAgYjogJ2InLFxuICAgICAgICAgIGM6IG51bGwsXG4gICAgICAgIH07XG4gICAgICAgIHV0aWwuZmlsdGVyT2JqZWN0KG9iaikuc2hvdWxkLmVxbCh7XG4gICAgICAgICAgYTogJ2EnLFxuICAgICAgICAgIGI6ICdiJyxcbiAgICAgICAgICBjOiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCd3aXRoIHZhbHVlIHByZWRpY2F0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgZmlsdGVyIGVsZW1lbnRzIGJ5IHRoZWlyIHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgIGE6ICdhJyxcbiAgICAgICAgICBiOiAnYicsXG4gICAgICAgICAgYzogJ2MnLFxuICAgICAgICAgIGQ6ICdhJyxcbiAgICAgICAgfTtcbiAgICAgICAgdXRpbC5maWx0ZXJPYmplY3Qob2JqLCAnYScpLnNob3VsZC5lcWwoe1xuICAgICAgICAgIGE6ICdhJyxcbiAgICAgICAgICBkOiAnYScsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ3dpdGggZnVuY3Rpb24gcHJlZGljYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBmaWx0ZXIgZWxlbWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgYTogJ2EnLFxuICAgICAgICAgIGI6ICdiJyxcbiAgICAgICAgICBjOiAnYycsXG4gICAgICAgIH07XG4gICAgICAgIHV0aWwuZmlsdGVyT2JqZWN0KG9iaiwgKHYpID0+IHYgPT09ICdhJyB8fCB2ID09PSAnYycpLnNob3VsZC5lcWwoe1xuICAgICAgICAgIGE6ICdhJyxcbiAgICAgICAgICBjOiAnYycsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1N1YlBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBkZXRlY3Qgc2ltcGxlIHN1YnBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmlzU3ViUGF0aCgnL3Jvb3Qvc29tZScsICcvcm9vdCcpLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZGV0ZWN0IGNvbXBsZXggc3VicGF0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaXNTdWJQYXRoKCcvcm9vdC9zb21lL290aGVyLy4uLy4uLy4nLCAnL3Jvb3QnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGRldGVjdCBzdWJwYXRoIGVuZGluZyB3aXRoIGEgc2xhc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLmlzU3ViUGF0aCgnL3Jvb3Qvc29tZS8nLCAnL3Jvb3QnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGRldGVjdCBpZiBhIHBhdGggaXMgbm90IGEgc3VicGF0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuaXNTdWJQYXRoKCcvcm9vdC9zb21lLy8uLi8uLicsICcvcm9vdCcpLnNob3VsZC5iZS5mYWxzZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGFueSBvZiB0aGUgZ2l2ZW4gcGF0aHMgaXMgbm90IGFic29sdXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLnRocm93KCgpID0+IHV0aWwuaXNTdWJQYXRoKCdzb21lLy4uJywgJy9yb290JyksIC9hYnNvbHV0ZS8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNTYW1lRGVzdGluYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHBhdGgxO1xuICAgIGxldCBwYXRoMjtcbiAgICBsZXQgdG1wRGlyO1xuICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0bXBEaXIgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICAgIHBhdGgxID0gcGF0aC5yZXNvbHZlKHRtcERpciwgJ3BhdGgxLnR4dCcpO1xuICAgICAgcGF0aDIgPSBwYXRoLnJlc29sdmUodG1wRGlyLCAncGF0aDIudHh0Jyk7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgW3BhdGgxLCBwYXRoMl0pIHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHAsIHAsICd1dGY4Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcERpcik7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBwYXRocyB0byB0aGUgc2FtZSBmaWxlL2ZvbGRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIChhd2FpdCB1dGlsLmlzU2FtZURlc3RpbmF0aW9uKHBhdGgxLCBwYXRoLnJlc29sdmUodG1wRGlyLCAnLi4nLCBwYXRoLmJhc2VuYW1lKHRtcERpciksIHBhdGguYmFzZW5hbWUocGF0aDEpKSkpXG4gICAgICAgIC5zaG91bGQuYmUudHJ1ZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG5vdCBtYXRjaCBwYXRocyBpZiB0aGV5IHBvaW50IHRvIG5vbiBleGlzdGluZyBpdGVtcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIChhd2FpdCB1dGlsLmlzU2FtZURlc3RpbmF0aW9uKHBhdGgxLCAnYmxhYmxhJykpLnNob3VsZC5iZS5mYWxzZTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG5vdCBtYXRjaCBwYXRocyB0byBkaWZmZXJlbnQgZmlsZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAoYXdhaXQgdXRpbC5pc1NhbWVEZXN0aW5hdGlvbihwYXRoMSwgcGF0aDIpKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb21wYXJlVmVyc2lvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjb21wYXJlIHR3byBjb3JyZWN0IHZlcnNpb24gbnVtYmVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwuY29tcGFyZVZlcnNpb25zKCcxMC4wJywgJzwnLCAnMTEuMCcpLnNob3VsZC5lcWwodHJ1ZSk7XG4gICAgICB1dGlsLmNvbXBhcmVWZXJzaW9ucygnMTEuMCcsICc+PScsICcxMS4wJykuc2hvdWxkLmVxbCh0cnVlKTtcbiAgICAgIHV0aWwuY29tcGFyZVZlcnNpb25zKCcxMS4wJywgJz09JywgJzExLjAnKS5zaG91bGQuZXFsKHRydWUpO1xuICAgICAgdXRpbC5jb21wYXJlVmVyc2lvbnMoJzEzLjEwJywgJz4nLCAnMTMuNScpLnNob3VsZC5lcWwodHJ1ZSk7XG4gICAgICB1dGlsLmNvbXBhcmVWZXJzaW9ucygnMTEuMScsICchPScsICcxMS4xMCcpLnNob3VsZC5lcWwodHJ1ZSk7XG4gICAgICB1dGlsLmNvbXBhcmVWZXJzaW9ucygnMTIuMCcsICc8JywgMTApLnNob3VsZC5lcWwoZmFsc2UpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgYW55IG9mIHZlcnNpb24gYXJndW1lbnRzIGlzIGludmFsaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3coKCkgPT4gdXRpbC5jb21wYXJlVmVyc2lvbnModW5kZWZpbmVkLCAnPCcsICcxMS4wJykpO1xuICAgICAgc2hvdWxkLnRocm93KCgpID0+IHV0aWwuY29tcGFyZVZlcnNpb25zKCcxMS4wJywgJz09JywgbnVsbCkpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1bnN1cHBvcnRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvdygoKSA9PiB1dGlsLmNvbXBhcmVWZXJzaW9ucygnMTIuMCcsICdhYmMnLCAxMCkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncXVvdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBxdW90ZSBhIHN0cmluZyB3aXRoIGEgc3BhY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnF1b3RlKFsnYScsICdiJywgJ2MgZCddKS5zaG91bGQuZXFsKCdhIGIgXFwnYyBkXFwnJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBlc2NhcGUgZG91YmxlIHF1b3RlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwucXVvdGUoWydhJywgJ2InLCBgaXQncyBhIFwibmVhdCB0aGluZ1wiYF0pLnNob3VsZC5lcWwoYGEgYiBcIml0J3MgYSBcXFxcXCJuZWF0IHRoaW5nXFxcXFwiXCJgKTtcbiAgICB9KTtcbiAgICBpdChcInNob3VsZCBlc2NhcGUgJCBgIGFuZCAnXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwucXVvdGUoWyckJywgJ2AnLCBgJ2BdKS5zaG91bGQuZXFsKCdcXFxcJCBcXFxcYCBcIlxcJ1wiJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgZW1wdHkgYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnF1b3RlKFtdKS5zaG91bGQuZXFsKCcnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHF1b3RlIGEgc3RyaW5nIHdpdGggbmV3bGluZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWwucXVvdGUoWydhXFxuYiddKS5zaG91bGQuZXFsKGAnYVxcbmInYCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBzdHJpbmdpZnkgYm9vbGVhbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnF1b3RlKFsnYScsIDEsIHRydWUsIGZhbHNlXSkuc2hvdWxkLmVxbCgnYSAxIHRydWUgZmFsc2UnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHN0cmluZ2lmeSBudWxsIGFuZCB1bmRlZmluZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnF1b3RlKFsnYScsIDEsIG51bGwsIHVuZGVmaW5lZF0pLnNob3VsZC5lcWwoJ2EgMSBudWxsIHVuZGVmaW5lZCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndW5sZWFrU3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdW5sZWFrIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC51bmxlYWtTdHJpbmcoJ3lvbG8nKS5zaG91bGQuZXFsKCd5b2xvJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB1bmxlYWsgYSBtdWx0aWxpbmUgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC51bmxlYWtTdHJpbmcoJyB5b2xvXFxuYm9sbyAnKS5zaG91bGQuZXFsKCcgeW9sb1xcbmJvbG8gJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IGFuIG9iamVjdCB0byBhIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3Qgb2JqIG9mIFt7fSwgbnVsbCwgdW5kZWZpbmVkLCBbXSwgMF0pIHtcbiAgICAgICAgdXRpbC51bmxlYWtTdHJpbmcob2JqKS5zaG91bGQuZXFsKGAke29ian1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3BsdXJhbGl6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAvKlxuICAgICAqIFRoZSBwbHVyYWxpemUgbGlicmFyeSAoaHR0cHM6Ly9naXRodWIuY29tL2JsYWtlZW1icmV5L3BsdXJhbGl6ZSlcbiAgICAgKiBoYXMgYSByb2J1c3Qgc2V0IG9mIHRlc3RzLiBIZXJlIHdlIGp1c3QgbmVlZCB0byB2ZXJpZnkgdGhhdCBpdFxuICAgICAqIGlzIHVzYWJsZSB0aHJvdWdoIHRoZSBleHBvcnRlZCBwYWNrYWdlLCBhbmQgdGhlIGFyZ3VtZW50cyBhcmUgY29ycmVjdFxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgcGx1cmFsaXplIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5wbHVyYWxpemUoJ3dvcmQnLCAyKS5zaG91bGQuZXFsKCd3b3JkcycpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGx1cmFsaXplIGEgc3RyaW5nIGFuZCBwcmVwZW5kIHRoZSBudW1iZXIgdGhyb3VnaCBib29sZWFuJywgZnVuY3Rpb24gKCkge1xuICAgICAgdXRpbC5wbHVyYWxpemUoJ3dvcmQnLCAyLCB0cnVlKS5zaG91bGQuZXFsKCcyIHdvcmRzJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwbHVyYWxpemUgYSBzdHJpbmcgYW5kIHByZXBlbmQgdGhlIG51bWJlciB0aHJvdWdoIG9wdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlsLnBsdXJhbGl6ZSgnd29yZCcsIDIsIHtpbmNsdXNpdmU6IHRydWV9KS5zaG91bGQuZXFsKCcyIHdvcmRzJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvdXRpbC1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|