@appium/support 2.55.2 → 2.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/build/lib/env.js +102 -0
  2. package/build/lib/fs.js +74 -56
  3. package/build/lib/image-util.js +4 -332
  4. package/build/lib/index.js +18 -6
  5. package/build/lib/log-internal.js +2 -4
  6. package/build/lib/logger.js +2 -4
  7. package/build/lib/logging.js +2 -4
  8. package/build/lib/mjpeg.js +2 -4
  9. package/build/lib/mkdirp.js +7 -11
  10. package/build/lib/net.js +2 -4
  11. package/build/lib/node.js +99 -2
  12. package/build/lib/npm.js +240 -0
  13. package/build/lib/plist.js +2 -4
  14. package/build/lib/process.js +2 -4
  15. package/build/lib/system.js +2 -4
  16. package/build/lib/tempdir.js +2 -4
  17. package/build/lib/timing.js +2 -4
  18. package/build/lib/util.js +6 -8
  19. package/build/lib/zip.js +4 -8
  20. package/lib/env.js +162 -0
  21. package/lib/fs.js +193 -69
  22. package/lib/image-util.js +3 -570
  23. package/lib/index.js +8 -2
  24. package/lib/log-internal.js +2 -2
  25. package/lib/logging.js +1 -1
  26. package/lib/mkdirp.js +3 -6
  27. package/lib/net.js +4 -4
  28. package/lib/node.js +104 -1
  29. package/lib/npm.js +335 -0
  30. package/lib/tempdir.js +6 -6
  31. package/lib/util.js +28 -24
  32. package/lib/zip.js +7 -8
  33. package/package.json +20 -9
  34. package/build/test/assets/sample_binary.plist +0 -0
  35. package/build/test/assets/sample_text.plist +0 -28
  36. package/build/test/fs-specs.js +0 -264
  37. package/build/test/helpers.js +0 -35
  38. package/build/test/image-util-e2e-specs.js +0 -227
  39. package/build/test/index-specs.js +0 -49
  40. package/build/test/log-internals-specs.js +0 -97
  41. package/build/test/logger/helpers.js +0 -71
  42. package/build/test/logger/logger-force-specs.js +0 -41
  43. package/build/test/logger/logger-normal-specs.js +0 -113
  44. package/build/test/logger/logger-test-specs.js +0 -40
  45. package/build/test/mjpeg-e2e-specs.js +0 -96
  46. package/build/test/net-e2e-specs.js +0 -32
  47. package/build/test/node-e2e-specs.js +0 -22
  48. package/build/test/plist-specs.js +0 -54
  49. package/build/test/process-specs.js +0 -104
  50. package/build/test/system-specs.js +0 -136
  51. package/build/test/tempdir-specs.js +0 -86
  52. package/build/test/timing-specs.js +0 -125
  53. package/build/test/util-e2e-specs.js +0 -136
  54. package/build/test/util-specs.js +0 -537
  55. package/build/test/zip-e2e-specs.js +0 -233
package/lib/zip.js CHANGED
@@ -4,7 +4,6 @@ import yauzl from 'yauzl';
4
4
  import archiver from 'archiver';
5
5
  import { createWriteStream } from 'fs';
6
6
  import path from 'path';
7
- import { mkdirp } from '../lib/mkdirp';
8
7
  import stream from 'stream';
9
8
  import fs from './fs';
10
9
  import { isWindows } from './system';
@@ -169,7 +168,7 @@ class ZipExtractor {
169
168
 
170
169
 
171
170
  /**
172
- * @typedef {Object} ExtractAllOptions
171
+ * @typedef ExtractAllOptions
173
172
  * @property {?string} fileNamesEncoding The encoding to use for extracted file names.
174
173
  * For ZIP archives created on MacOS it is usually expected to be `utf8`.
175
174
  * By default it is autodetected based on the entry metadata and is only needed to be set explicitly
@@ -261,11 +260,11 @@ async function _extractEntryTo (zipFile, entry, destDir) {
261
260
  // Create dest directory if doesn't exist already
262
261
  if (/\/$/.test(entry.fileName)) {
263
262
  if (!await fs.exists(dstPath)) {
264
- await mkdirp(dstPath);
263
+ await fs.mkdirp(dstPath);
265
264
  }
266
265
  return;
267
266
  } else if (!await fs.exists(path.dirname(dstPath))) {
268
- await mkdirp(path.dirname(dstPath));
267
+ await fs.mkdirp(path.dirname(dstPath));
269
268
  }
270
269
 
271
270
  // Create a write stream
@@ -294,7 +293,7 @@ async function _extractEntryTo (zipFile, entry, destDir) {
294
293
  }
295
294
 
296
295
  /**
297
- * @typedef {Object} ZipEntry
296
+ * @typedef ZipEntry
298
297
  * @property {yauzl.ZipEntry} entry The actual entry instance
299
298
  * @property {function} extractEntryTo An async function, which accepts one parameter.
300
299
  * This parameter contains the destination folder path to which this function is going to extract the entry.
@@ -335,7 +334,7 @@ async function readEntries (zipFilePath, onEntry) {
335
334
  }
336
335
 
337
336
  /**
338
- * @typedef {Object} ZipOptions
337
+ * @typedef ZipOptions
339
338
  * @property {boolean} encodeToBase64 [false] Whether to encode
340
339
  * the resulting archive to a base64-encoded string
341
340
  * @property {boolean} isMetered [true] Whether to log the actual
@@ -475,13 +474,13 @@ async function assertValidZip (filePath) {
475
474
  }
476
475
 
477
476
  /**
478
- * @typedef {Object} ZipCompressionOptions
477
+ * @typedef ZipCompressionOptions
479
478
  * @property {number} level [9] - Compression level in range 0..9
480
479
  * (greater numbers mean better compression, but longer processing time)
481
480
  */
482
481
 
483
482
  /**
484
- * @typedef {Object} ZipSourceOptions
483
+ * @typedef ZipSourceOptions
485
484
  * @property {!string} pattern ['**\/*'] - GLOB pattern for compression
486
485
  * @property {!string} cwd - The source root folder (the parent folder of
487
486
  * the destination file by default)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appium/support",
3
- "version": "2.55.2",
3
+ "version": "2.56.0",
4
4
  "description": "Support libs used across appium packages",
5
5
  "keywords": [
6
6
  "automation",
@@ -12,12 +12,14 @@
12
12
  "firefoxos",
13
13
  "testing"
14
14
  ],
15
+ "homepage": "https://appium.io",
15
16
  "bugs": {
16
17
  "url": "https://github.com/appium/appium/issues"
17
18
  },
18
19
  "repository": {
19
20
  "type": "git",
20
- "url": "https://github.com/appium/appium.git"
21
+ "url": "https://github.com/appium/appium.git",
22
+ "directory": "packages/support"
21
23
  },
22
24
  "license": "Apache-2.0",
23
25
  "author": "https://github.com/appium",
@@ -29,15 +31,23 @@
29
31
  "lib",
30
32
  "build"
31
33
  ],
34
+ "scripts": {
35
+ "build": "babel lib --root-mode=upward --delete-dir-on-start --out-dir=build/lib",
36
+ "dev": "npm run build -- --watch",
37
+ "fix": "npm run lint -- --fix",
38
+ "lint": "eslint -c ../../.eslintrc --ignore-path ../../.eslintignore .",
39
+ "test": "npm run test:unit",
40
+ "test:e2e": "mocha --require ../../test/setup-babel.js --timeout 20s --slow 10s \"./test/e2e/**/*.spec.js\"",
41
+ "test:unit": "mocha --require ../../test/setup-babel.js \"./test/unit/**/*.spec.js\""
42
+ },
32
43
  "dependencies": {
33
- "@babel/runtime": "7.16.3",
44
+ "@babel/runtime": "7.17.8",
34
45
  "archiver": "5.3.0",
35
- "axios": "0.24.0",
46
+ "axios": "0.26.1",
36
47
  "base64-stream": "1.0.0",
37
48
  "bluebird": "3.7.2",
38
49
  "bplist-creator": "0.1.0",
39
50
  "bplist-parser": "0.3.1",
40
- "find-root": "1.1.0",
41
51
  "form-data": "4.0.0",
42
52
  "get-stream": "6.0.1",
43
53
  "glob": "7.2.0",
@@ -46,14 +56,16 @@
46
56
  "klaw": "3.0.0",
47
57
  "lockfile": "1.0.4",
48
58
  "lodash": "4.17.21",
49
- "mkdirp": "1.0.4",
50
59
  "moment": "2.29.1",
51
60
  "mv": "2.1.1",
52
61
  "ncp": "2.0.0",
53
- "npmlog": "5.0.1",
62
+ "npmlog": "6.0.1",
63
+ "opencv-bindings": "4.5.5",
64
+ "pkg-dir": "5.0.0",
54
65
  "plist": "3.0.4",
55
66
  "pluralize": "8.0.0",
56
67
  "pngjs": "6.0.0",
68
+ "read-pkg": "5.2.0",
57
69
  "rimraf": "3.0.2",
58
70
  "sanitize-filename": "1.6.3",
59
71
  "semver": "7.3.5",
@@ -71,6 +83,5 @@
71
83
  "publishConfig": {
72
84
  "access": "public"
73
85
  },
74
- "homepage": "https://appium.io",
75
- "gitHead": "e36a70105880b845e99e2c8a958403f6253f45b6"
86
+ "gitHead": "f5cce0f29d31699decea63ed94c4506f7af469df"
76
87
  }
@@ -1,28 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
- <plist version="1.0">
4
- <dict>
5
- <key>com.apple.locationd.bundle-/System/Library/PrivateFrameworks/Parsec.framework</key>
6
- <dict>
7
- <key>Whitelisted</key>
8
- <false/>
9
- <key>Executable</key>
10
- <string></string>
11
- <key>BundlePath</key>
12
- <string>/System/Library/PrivateFrameworks/Parsec.framework</string>
13
- <key>Registered</key>
14
- <string></string>
15
- </dict>
16
- <key>com.apple.locationd.bundle-/System/Library/PrivateFrameworks/WirelessDiagnostics.framework</key>
17
- <dict>
18
- <key>Whitelisted</key>
19
- <false/>
20
- <key>Executable</key>
21
- <string></string>
22
- <key>BundlePath</key>
23
- <string>/System/Library/PrivateFrameworks/WirelessDiagnostics.framework</string>
24
- <key>Registered</key>
25
- <string></string>
26
- </dict>
27
- </dict>
28
- </plist>
@@ -1,264 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _index = require("../lib/index.js");
8
-
9
- var _path = _interopRequireDefault(require("path"));
10
-
11
- var _teen_process = require("teen_process");
12
-
13
- var _bluebird = _interopRequireDefault(require("bluebird"));
14
-
15
- var _lodash = _interopRequireDefault(require("lodash"));
16
-
17
- const MOCHA_TIMEOUT = 20000;
18
- describe('fs', function () {
19
- this.timeout(MOCHA_TIMEOUT);
20
-
21
- const existingPath = _path.default.resolve(__dirname, 'fs-specs.js');
22
-
23
- it('should have expected methods', function () {
24
- should.exist(_index.fs.open);
25
- should.exist(_index.fs.close);
26
- should.exist(_index.fs.access);
27
- should.exist(_index.fs.mkdir);
28
- should.exist(_index.fs.readlink);
29
- should.exist(_index.fs.exists);
30
- should.exist(_index.fs.rimraf);
31
- should.exist(_index.fs.rimrafSync);
32
- should.exist(_index.fs.readFile);
33
- should.exist(_index.fs.writeFile);
34
- should.exist(_index.fs.lstat);
35
- should.exist(_index.fs.mv);
36
- });
37
- describe('mkdir', function () {
38
- let dirName = _path.default.resolve(__dirname, 'tmp');
39
-
40
- it('should make a directory that does not exist', async function () {
41
- await _index.fs.rimraf(dirName);
42
- await _index.fs.mkdir(dirName);
43
- let exists = await _index.fs.hasAccess(dirName);
44
- exists.should.be.true;
45
- });
46
- it('should not complain if the dir already exists', async function () {
47
- let exists = await _index.fs.hasAccess(dirName);
48
- exists.should.be.true;
49
- await _index.fs.mkdir(dirName);
50
- });
51
- it('should still throw an error if something else goes wrong', async function () {
52
- await _index.fs.mkdir('/bin/foo').should.be.rejected;
53
- });
54
- });
55
- it('hasAccess', async function () {
56
- (await _index.fs.exists(existingPath)).should.be.ok;
57
-
58
- let nonExistingPath = _path.default.resolve(__dirname, 'wrong-specs.js');
59
-
60
- (await _index.fs.hasAccess(nonExistingPath)).should.not.be.ok;
61
- });
62
- it('exists', async function () {
63
- (await _index.fs.exists(existingPath)).should.be.ok;
64
-
65
- let nonExistingPath = _path.default.resolve(__dirname, 'wrong-specs.js');
66
-
67
- (await _index.fs.exists(nonExistingPath)).should.not.be.ok;
68
- });
69
- it('readFile', async function () {
70
- (await _index.fs.readFile(existingPath, 'utf8')).should.contain('readFile');
71
- });
72
- describe('copyFile', function () {
73
- it('should be able to copy a file', async function () {
74
- let newPath = _path.default.resolve(await _index.tempDir.openDir(), 'fs-specs.js');
75
-
76
- await _index.fs.copyFile(existingPath, newPath);
77
- (await _index.fs.readFile(newPath, 'utf8')).should.contain('readFile');
78
- });
79
- it('should throw an error if the source does not exist', async function () {
80
- await _index.fs.copyFile('/sdfsdfsdfsdf', '/tmp/bla').should.eventually.be.rejected;
81
- });
82
- });
83
- it('rimraf', async function () {
84
- let newPath = _path.default.resolve(await _index.tempDir.openDir(), 'fs-specs.js');
85
-
86
- await _index.fs.copyFile(existingPath, newPath);
87
- (await _index.fs.exists(newPath)).should.be.true;
88
- await _index.fs.rimraf(newPath);
89
- (await _index.fs.exists(newPath)).should.be.false;
90
- });
91
- it('sanitizeName', function () {
92
- _index.fs.sanitizeName(':file?.txt', {
93
- replacement: '-'
94
- }).should.eql('-file-.txt');
95
- });
96
- it('rimrafSync', async function () {
97
- let newPath = _path.default.resolve(await _index.tempDir.openDir(), 'fs-specs.js');
98
-
99
- await _index.fs.copyFile(existingPath, newPath);
100
- (await _index.fs.exists(newPath)).should.be.true;
101
-
102
- _index.fs.rimrafSync(newPath);
103
-
104
- (await _index.fs.exists(newPath)).should.be.false;
105
- });
106
- describe('md5', function () {
107
- this.timeout(1200000);
108
- let smallFilePath;
109
- let bigFilePath;
110
- before(async function () {
111
- smallFilePath = existingPath;
112
- bigFilePath = _path.default.resolve(await _index.tempDir.openDir(), 'enormous.txt');
113
- let file = await _index.fs.open(bigFilePath, 'w');
114
- let fileData = '';
115
-
116
- for (let i = 0; i < 4096; i++) {
117
- fileData += '1';
118
- }
119
-
120
- for (let i = 0; i < 40000; i++) {
121
- await _index.fs.write(file, fileData);
122
- }
123
-
124
- await _index.fs.close(file);
125
- });
126
- after(async function () {
127
- await _index.fs.unlink(bigFilePath);
128
- });
129
- it('should calculate hash of correct length', async function () {
130
- (await _index.fs.md5(smallFilePath)).should.have.length(32);
131
- });
132
- it('should be able to run on huge file', async function () {
133
- (await _index.fs.md5(bigFilePath)).should.have.length(32);
134
- });
135
- });
136
- describe('hash', function () {
137
- it('should calculate sha1 hash', async function () {
138
- (await _index.fs.hash(existingPath, 'sha1')).should.have.length(40);
139
- });
140
- it('should calculate md5 hash', async function () {
141
- (await _index.fs.hash(existingPath, 'md5')).should.have.length(32);
142
- });
143
- });
144
- it('stat', async function () {
145
- let stat = await _index.fs.stat(existingPath);
146
- stat.should.have.property('atime');
147
- });
148
- describe('which', function () {
149
- it('should find correct executable', async function () {
150
- let systemNpmPath = (await (0, _teen_process.exec)('which', ['npm'])).stdout.trim();
151
- let npmPath = await _index.fs.which('npm');
152
- npmPath.should.equal(systemNpmPath);
153
- });
154
- it('should fail gracefully', async function () {
155
- await _index.fs.which('something_that_does_not_exist').should.eventually.be.rejected;
156
- });
157
- });
158
- it('glob', async function () {
159
- let glob = '*-specs.js';
160
- let tests = await _index.fs.glob(glob, {
161
- cwd: __dirname
162
- });
163
- tests.should.be.an('array');
164
- tests.should.have.length.above(2);
165
- });
166
- describe('walkDir', function () {
167
- it('walkDir recursive', async function () {
168
- let inCallback = 0;
169
- const filePath = await _index.fs.walkDir(__dirname, true, async item => {
170
- if (item.endsWith('logger/helpers.js')) {
171
- ++inCallback;
172
- await _bluebird.default.delay(500);
173
- --inCallback;
174
- return true;
175
- }
176
- });
177
- inCallback.should.equal(0);
178
- filePath.should.not.be.null;
179
- });
180
- it('should walk all elements recursive', async function () {
181
- let inCallback = 0;
182
- const filePath = await _index.fs.walkDir(__dirname, true, async () => {
183
- ++inCallback;
184
- await _bluebird.default.delay(500);
185
- --inCallback;
186
- });
187
- inCallback.should.equal(0);
188
- _lodash.default.isNil(filePath).should.be.true;
189
- });
190
- it('should throw error through callback', async function () {
191
- let processed = 0;
192
- await chai.expect(_index.fs.walkDir(__dirname, true, () => {
193
- ++processed;
194
- throw 'Callback error';
195
- })).to.be.rejectedWith('Callback error');
196
- processed.should.equal(1);
197
- });
198
- it('should traverse non-recursively', async function () {
199
- const filePath = await _index.fs.walkDir(__dirname, false, item => item.endsWith('logger/helpers.js'));
200
- _lodash.default.isNil(filePath).should.be.true;
201
- });
202
- });
203
- describe('findRoot()', function () {
204
- describe('when not provided an argument', function () {
205
- it('should throw', function () {
206
- (() => _index.fs.findRoot()).should.throw(TypeError);
207
- });
208
- });
209
- describe('when provided a relative path', function () {
210
- it('should throw', function () {
211
- (() => _index.fs.findRoot('./foo')).should.throw(TypeError);
212
- });
213
- });
214
- describe('when provided an empty string', function () {
215
- it('should throw', function () {
216
- (() => _index.fs.findRoot('')).should.throw(TypeError);
217
- });
218
- });
219
- describe('when provided an absolute path', function () {
220
- describe('when the path has a parent `package.json`', function () {
221
- it('should locate the dir with the closest `package.json`', function () {
222
- _index.fs.findRoot(__dirname).should.be.a('string');
223
- });
224
- });
225
- describe('when the path does not have a parent `package.json`', function () {
226
- it('should throw', function () {
227
- (() => _index.fs.findRoot('/')).should.throw(Error);
228
- });
229
- });
230
- });
231
- });
232
- describe('readPackageJsonFrom()', function () {
233
- describe('when not provided an argument', function () {
234
- it('should throw', function () {
235
- (() => _index.fs.readPackageJsonFrom()).should.throw(TypeError, /non-empty, absolute path/);
236
- });
237
- });
238
- describe('when provided a relative path', function () {
239
- it('should throw', function () {
240
- (() => _index.fs.readPackageJsonFrom('./foo')).should.throw(TypeError);
241
- });
242
- });
243
- describe('when provided an empty string', function () {
244
- it('should throw', function () {
245
- (() => _index.fs.readPackageJsonFrom('')).should.throw(TypeError);
246
- });
247
- });
248
- describe('when provided an absolute path', function () {
249
- describe('when the path does not have a parent `package.json`', function () {
250
- it('should throw', function () {
251
- (() => _index.fs.readPackageJsonFrom('/')).should.throw(Error);
252
- });
253
- });
254
- describe('when the path has a parent `package.json`', function () {
255
- it('should read the `package.json` found in the root dir', function () {
256
- _index.fs.readPackageJsonFrom(__dirname).should.be.an('object');
257
- });
258
- });
259
- });
260
- });
261
- });require('source-map-support').install();
262
-
263
-
264
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZnMtc3BlY3MuanMiXSwibmFtZXMiOlsiTU9DSEFfVElNRU9VVCIsImRlc2NyaWJlIiwidGltZW91dCIsImV4aXN0aW5nUGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiaXQiLCJzaG91bGQiLCJleGlzdCIsImZzIiwib3BlbiIsImNsb3NlIiwiYWNjZXNzIiwibWtkaXIiLCJyZWFkbGluayIsImV4aXN0cyIsInJpbXJhZiIsInJpbXJhZlN5bmMiLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsImxzdGF0IiwibXYiLCJkaXJOYW1lIiwiaGFzQWNjZXNzIiwiYmUiLCJ0cnVlIiwicmVqZWN0ZWQiLCJvayIsIm5vbkV4aXN0aW5nUGF0aCIsIm5vdCIsImNvbnRhaW4iLCJuZXdQYXRoIiwidGVtcERpciIsIm9wZW5EaXIiLCJjb3B5RmlsZSIsImV2ZW50dWFsbHkiLCJmYWxzZSIsInNhbml0aXplTmFtZSIsInJlcGxhY2VtZW50IiwiZXFsIiwic21hbGxGaWxlUGF0aCIsImJpZ0ZpbGVQYXRoIiwiYmVmb3JlIiwiZmlsZSIsImZpbGVEYXRhIiwiaSIsIndyaXRlIiwiYWZ0ZXIiLCJ1bmxpbmsiLCJtZDUiLCJoYXZlIiwibGVuZ3RoIiwiaGFzaCIsInN0YXQiLCJwcm9wZXJ0eSIsInN5c3RlbU5wbVBhdGgiLCJzdGRvdXQiLCJ0cmltIiwibnBtUGF0aCIsIndoaWNoIiwiZXF1YWwiLCJnbG9iIiwidGVzdHMiLCJjd2QiLCJhbiIsImFib3ZlIiwiaW5DYWxsYmFjayIsImZpbGVQYXRoIiwid2Fsa0RpciIsIml0ZW0iLCJlbmRzV2l0aCIsIkIiLCJkZWxheSIsIm51bGwiLCJfIiwiaXNOaWwiLCJwcm9jZXNzZWQiLCJjaGFpIiwiZXhwZWN0IiwidG8iLCJyZWplY3RlZFdpdGgiLCJmaW5kUm9vdCIsInRocm93IiwiVHlwZUVycm9yIiwiYSIsIkVycm9yIiwicmVhZFBhY2thZ2VKc29uRnJvbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FB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Qy9FLE1BQXhDLENBQStDMkUsS0FBL0MsQ0FBcURDLFNBQXJEO0FBQ0QsT0FGQyxDQUFGO0FBR0QsS0FKTyxDQUFSO0FBTUFuRixJQUFBQSxRQUFRLENBQUMsK0JBQUQsRUFBa0MsWUFBWTtBQUNwRE0sTUFBQUEsRUFBRSxDQUFDLGNBQUQsRUFBaUIsWUFBWTtBQUM3QixTQUFDLE1BQU1HLFVBQUc2RSxtQkFBSCxDQUF1QixFQUF2QixDQUFQLEVBQW1DL0UsTUFBbkMsQ0FBMEMyRSxLQUExQyxDQUFnREMsU0FBaEQ7QUFDRCxPQUZDLENBQUY7QUFHRCxLQUpPLENBQVI7QUFNQW5GLElBQUFBLFFBQVEsQ0FBQyxnQ0FBRCxFQUFtQyxZQUFZO0FBQ3JEQSxNQUFBQSxRQUFRLENBQUMscURBQUQsRUFBd0QsWUFBWTtBQUMxRU0sUUFBQUEsRUFBRSxDQUFDLGNBQUQsRUFBaUIsWUFBWTtBQUM3QixXQUFDLE1BQU1HLFVBQUc2RSxtQkFBSCxDQUF1QixHQUF2QixDQUFQLEVBQW9DL0UsTUFBcEMsQ0FBMkMyRSxLQUEzQyxDQUFpREcsS0FBakQ7QUFDRCxTQUZDLENBQUY7QUFHRCxPQUpPLENBQVI7QUFNQXJGLE1BQUFBLFFBQVEsQ0FBQywyQ0FBRCxFQUE4QyxZQUFZO0FBQ2hFTSxRQUFBQSxFQUFFLENBQUMsc0RBQUQsRUFBeUQsWUFBWTtBQUNyRUcsb0JBQUc2RSxtQkFBSCxDQUF1QmpGLFNBQXZCLEVBQWtDRSxNQUFsQyxDQUF5Q2lCLEVBQXpDLENBQTRDd0MsRUFBNUMsQ0FBK0MsUUFBL0M7QUFDRCxTQUZDLENBQUY7QUFHRCxPQUpPLENBQVI7QUFLRCxLQVpPLENBQVI7QUFhRCxHQWhDTyxDQUFSO0FBaUNELENBOVBPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcywgdGVtcERpciB9IGZyb20gJy4uL2xpYi9pbmRleC5qcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuXG5jb25zdCBNT0NIQV9USU1FT1VUID0gMjAwMDA7XG5cbmRlc2NyaWJlKCdmcycsIGZ1bmN0aW9uICgpIHtcbiAgdGhpcy50aW1lb3V0KE1PQ0hBX1RJTUVPVVQpO1xuXG4gIGNvbnN0IGV4aXN0aW5nUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdmcy1zcGVjcy5qcycpO1xuXG4gIGl0KCdzaG91bGQgaGF2ZSBleHBlY3RlZCBtZXRob2RzJywgZnVuY3Rpb24gKCkge1xuICAgIHNob3VsZC5leGlzdChmcy5vcGVuKTtcbiAgICBzaG91bGQuZXhpc3QoZnMuY2xvc2UpO1xuICAgIHNob3VsZC5leGlzdChmcy5hY2Nlc3MpO1xuICAgIHNob3VsZC5leGlzdChmcy5ta2Rpcik7XG4gICAgc2hvdWxkLmV4aXN0KGZzLnJlYWRsaW5rKTtcbiAgICBzaG91bGQuZXhpc3QoZnMuZXhpc3RzKTtcbiAgICBzaG91bGQuZXhpc3QoZnMucmltcmFmKTtcbiAgICBzaG91bGQuZXhpc3QoZnMucmltcmFmU3luYyk7XG4gICAgc2hvdWxkLmV4aXN0KGZzLnJlYWRGaWxlKTtcbiAgICBzaG91bGQuZXhpc3QoZnMud3JpdGVGaWxlKTtcbiAgICBzaG91bGQuZXhpc3QoZnMubHN0YXQpO1xuICAgIHNob3VsZC5leGlzdChmcy5tdik7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdta2RpcicsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgZGlyTmFtZSA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICd0bXAnKTtcblxuICAgIGl0KCdzaG91bGQgbWFrZSBhIGRpcmVjdG9yeSB0aGF0IGRvZXMgbm90IGV4aXN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKGRpck5hbWUpO1xuICAgICAgYXdhaXQgZnMubWtkaXIoZGlyTmFtZSk7XG4gICAgICBsZXQgZXhpc3RzID0gYXdhaXQgZnMuaGFzQWNjZXNzKGRpck5hbWUpO1xuICAgICAgZXhpc3RzLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgY29tcGxhaW4gaWYgdGhlIGRpciBhbHJlYWR5IGV4aXN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBleGlzdHMgPSBhd2FpdCBmcy5oYXNBY2Nlc3MoZGlyTmFtZSk7XG4gICAgICBleGlzdHMuc2hvdWxkLmJlLnRydWU7XG4gICAgICBhd2FpdCBmcy5ta2RpcihkaXJOYW1lKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3RpbGwgdGhyb3cgYW4gZXJyb3IgaWYgc29tZXRoaW5nIGVsc2UgZ29lcyB3cm9uZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKCcvYmluL2ZvbycpLnNob3VsZC5iZS5yZWplY3RlZDtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2hhc0FjY2VzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAoYXdhaXQgZnMuZXhpc3RzKGV4aXN0aW5nUGF0aCkpLnNob3VsZC5iZS5vaztcbiAgICBsZXQgbm9uRXhpc3RpbmdQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3dyb25nLXNwZWNzLmpzJyk7XG4gICAgKGF3YWl0IGZzLmhhc0FjY2Vzcyhub25FeGlzdGluZ1BhdGgpKS5zaG91bGQubm90LmJlLm9rO1xuICB9KTtcbiAgaXQoJ2V4aXN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAoYXdhaXQgZnMuZXhpc3RzKGV4aXN0aW5nUGF0aCkpLnNob3VsZC5iZS5vaztcbiAgICBsZXQgbm9uRXhpc3RpbmdQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3dyb25nLXNwZWNzLmpzJyk7XG4gICAgKGF3YWl0IGZzLmV4aXN0cyhub25FeGlzdGluZ1BhdGgpKS5zaG91bGQubm90LmJlLm9rO1xuICB9KTtcbiAgaXQoJ3JlYWRGaWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIChhd2FpdCBmcy5yZWFkRmlsZShleGlzdGluZ1BhdGgsICd1dGY4JykpLnNob3VsZC5jb250YWluKCdyZWFkRmlsZScpO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29weUZpbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBiZSBhYmxlIHRvIGNvcHkgYSBmaWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IG5ld1BhdGggPSBwYXRoLnJlc29sdmUoYXdhaXQgdGVtcERpci5vcGVuRGlyKCksICdmcy1zcGVjcy5qcycpO1xuICAgICAgYXdhaXQgZnMuY29weUZpbGUoZXhpc3RpbmdQYXRoLCBuZXdQYXRoKTtcbiAgICAgIChhd2FpdCBmcy5yZWFkRmlsZShuZXdQYXRoLCAndXRmOCcpKS5zaG91bGQuY29udGFpbigncmVhZEZpbGUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBleGlzdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKCcvc2Rmc2Rmc2Rmc2RmJywgJy90bXAvYmxhJykuc2hvdWxkLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWQ7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdyaW1yYWYnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IG5ld1BhdGggPSBwYXRoLnJlc29sdmUoYXdhaXQgdGVtcERpci5vcGVuRGlyKCksICdmcy1zcGVjcy5qcycpO1xuICAgIGF3YWl0IGZzLmNvcHlGaWxlKGV4aXN0aW5nUGF0aCwgbmV3UGF0aCk7XG4gICAgKGF3YWl0IGZzLmV4aXN0cyhuZXdQYXRoKSkuc2hvdWxkLmJlLnRydWU7XG4gICAgYXdhaXQgZnMucmltcmFmKG5ld1BhdGgpO1xuICAgIChhd2FpdCBmcy5leGlzdHMobmV3UGF0aCkpLnNob3VsZC5iZS5mYWxzZTtcbiAgfSk7XG4gIGl0KCdzYW5pdGl6ZU5hbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgZnMuc2FuaXRpemVOYW1lKCc6ZmlsZT8udHh0Jywge1xuICAgICAgcmVwbGFjZW1lbnQ6ICctJyxcbiAgICB9KS5zaG91bGQuZXFsKCctZmlsZS0udHh0Jyk7XG4gIH0pO1xuICBpdCgncmltcmFmU3luYycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgbmV3UGF0aCA9IHBhdGgucmVzb2x2ZShhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgJ2ZzLXNwZWNzLmpzJyk7XG4gICAgYXdhaXQgZnMuY29weUZpbGUoZXhpc3RpbmdQYXRoLCBuZXdQYXRoKTtcbiAgICAoYXdhaXQgZnMuZXhpc3RzKG5ld1BhdGgpKS5zaG91bGQuYmUudHJ1ZTtcbiAgICBmcy5yaW1yYWZTeW5jKG5ld1BhdGgpO1xuICAgIChhd2FpdCBmcy5leGlzdHMobmV3UGF0aCkpLnNob3VsZC5iZS5mYWxzZTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdtZDUnLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy50aW1lb3V0KDEyMDAwMDApO1xuICAgIGxldCBzbWFsbEZpbGVQYXRoO1xuICAgIGxldCBiaWdGaWxlUGF0aDtcbiAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZ2V0IHRoZSBwYXRoIG9mIGEgc21hbGwgZmlsZSAodGhpcyBzb3VyY2UgZmlsZSlcbiAgICAgIHNtYWxsRmlsZVBhdGggPSBleGlzdGluZ1BhdGg7XG5cbiAgICAgIC8vIGNyZWF0ZSBhIGxhcmdlIGZpbGUgdG8gdGVzdCwgYWJvdXQgMTYzODQwMDAwIGJ5dGVzXG4gICAgICBiaWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKSwgJ2Vub3Jtb3VzLnR4dCcpO1xuICAgICAgbGV0IGZpbGUgPSBhd2FpdCBmcy5vcGVuKGJpZ0ZpbGVQYXRoLCAndycpO1xuICAgICAgbGV0IGZpbGVEYXRhID0gJyc7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQwOTY7IGkrKykge1xuICAgICAgICBmaWxlRGF0YSArPSAnMSc7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQwMDAwOyBpKyspIHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGUoZmlsZSwgZmlsZURhdGEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZnMuY2xvc2UoZmlsZSk7XG4gICAgfSk7XG4gICAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGJpZ0ZpbGVQYXRoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSBoYXNoIG9mIGNvcnJlY3QgbGVuZ3RoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgKGF3YWl0IGZzLm1kNShzbWFsbEZpbGVQYXRoKSkuc2hvdWxkLmhhdmUubGVuZ3RoKDMyKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGJlIGFibGUgdG8gcnVuIG9uIGh1Z2UgZmlsZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIChhd2FpdCBmcy5tZDUoYmlnRmlsZVBhdGgpKS5zaG91bGQuaGF2ZS5sZW5ndGgoMzIpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ2hhc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgc2hhMSBoYXNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgKGF3YWl0IGZzLmhhc2goZXhpc3RpbmdQYXRoLCAnc2hhMScpKS5zaG91bGQuaGF2ZS5sZW5ndGgoNDApO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgY2FsY3VsYXRlIG1kNSBoYXNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgKGF3YWl0IGZzLmhhc2goZXhpc3RpbmdQYXRoLCAnbWQ1JykpLnNob3VsZC5oYXZlLmxlbmd0aCgzMik7XG4gICAgfSk7XG4gIH0pO1xuICBpdCgnc3RhdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZXhpc3RpbmdQYXRoKTtcbiAgICBzdGF0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdhdGltZScpO1xuICB9KTtcbiAgZGVzY3JpYmUoJ3doaWNoJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZmluZCBjb3JyZWN0IGV4ZWN1dGFibGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgc3lzdGVtTnBtUGF0aCA9IChhd2FpdCBleGVjKCd3aGljaCcsIFsnbnBtJ10pKS5zdGRvdXQudHJpbSgpO1xuICAgICAgbGV0IG5wbVBhdGggPSBhd2FpdCBmcy53aGljaCgnbnBtJyk7XG4gICAgICBucG1QYXRoLnNob3VsZC5lcXVhbChzeXN0ZW1OcG1QYXRoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgZ3JhY2VmdWxseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGZzLndoaWNoKCdzb21ldGhpbmdfdGhhdF9kb2VzX25vdF9leGlzdCcpXG4gICAgICAgIC5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZDtcbiAgICB9KTtcbiAgfSk7XG4gIGl0KCdnbG9iJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGxldCBnbG9iID0gJyotc3BlY3MuanMnO1xuICAgIGxldCB0ZXN0cyA9IGF3YWl0IGZzLmdsb2IoZ2xvYiwge2N3ZDogX19kaXJuYW1lfSk7XG4gICAgdGVzdHMuc2hvdWxkLmJlLmFuKCdhcnJheScpO1xuICAgIHRlc3RzLnNob3VsZC5oYXZlLmxlbmd0aC5hYm92ZSgyKTtcbiAgfSk7XG4gIGRlc2NyaWJlKCd3YWxrRGlyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCd3YWxrRGlyIHJlY3Vyc2l2ZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBpbkNhbGxiYWNrID0gMDtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gYXdhaXQgZnMud2Fsa0RpcihfX2Rpcm5hbWUsIHRydWUsIGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmVuZHNXaXRoKCdsb2dnZXIvaGVscGVycy5qcycpKSB7XG4gICAgICAgICAgKytpbkNhbGxiYWNrO1xuICAgICAgICAgIC8vIFRoaXMgaXMgdG8gdmVyaWZ5IHByb3BlciBhd2FpdCBmdW5jdGlvbmFsaXR5IG9mIHRoZVxuICAgICAgICAgIC8vIGNhbGxiYWNrIGludm9jYXRpb24gaW5zaWRlIHRoZSBmaWxlIHN5c3RlbSB3YWxrZXJcbiAgICAgICAgICBhd2FpdCBCLmRlbGF5KDUwMCk7XG4gICAgICAgICAgLS1pbkNhbGxiYWNrO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGluQ2FsbGJhY2suc2hvdWxkLmVxdWFsKDApO1xuICAgICAgZmlsZVBhdGguc2hvdWxkLm5vdC5iZS5udWxsO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgd2FsayBhbGwgZWxlbWVudHMgcmVjdXJzaXZlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGluQ2FsbGJhY2sgPSAwO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBhd2FpdCBmcy53YWxrRGlyKF9fZGlybmFtZSwgdHJ1ZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICArK2luQ2FsbGJhY2s7XG4gICAgICAgIGF3YWl0IEIuZGVsYXkoNTAwKTtcbiAgICAgICAgLS1pbkNhbGxiYWNrO1xuXG4gICAgICB9KTtcbiAgICAgIGluQ2FsbGJhY2suc2hvdWxkLmVxdWFsKDApO1xuICAgICAgXy5pc05pbChmaWxlUGF0aCkuc2hvdWxkLmJlLnRydWU7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB0aHJvdWdoIGNhbGxiYWNrJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHByb2Nlc3NlZCA9IDA7XG4gICAgICBhd2FpdCBjaGFpLmV4cGVjdChmcy53YWxrRGlyKF9fZGlybmFtZSwgdHJ1ZSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICsrcHJvY2Vzc2VkO1xuICAgICAgICAgIHRocm93ICdDYWxsYmFjayBlcnJvcic7XG4gICAgICAgIH0pKS50by5iZS5yZWplY3RlZFdpdGgoJ0NhbGxiYWNrIGVycm9yJyk7XG4gICAgICBwcm9jZXNzZWQuc2hvdWxkLmVxdWFsKDEpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdHJhdmVyc2Ugbm9uLXJlY3Vyc2l2ZWx5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBhd2FpdCBmcy53YWxrRGlyKF9fZGlybmFtZSwgZmFsc2UsIChpdGVtKSA9PiBpdGVtLmVuZHNXaXRoKCdsb2dnZXIvaGVscGVycy5qcycpKTtcbiAgICAgIF8uaXNOaWwoZmlsZVBhdGgpLnNob3VsZC5iZS50cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmluZFJvb3QoKScsIGZ1bmN0aW9uICgpIHtcbiAgICBkZXNjcmliZSgnd2hlbiBub3QgcHJvdmlkZWQgYW4gYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4gZnMuZmluZFJvb3QoKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGEgcmVsYXRpdmUgcGF0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBmcy5maW5kUm9vdCgnLi9mb28nKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBmcy5maW5kUm9vdCgnJykpLnNob3VsZC50aHJvdyhUeXBlRXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBhbiBhYnNvbHV0ZSBwYXRoJywgZnVuY3Rpb24gKCkge1xuICAgICAgZGVzY3JpYmUoJ3doZW4gdGhlIHBhdGggaGFzIGEgcGFyZW50IGBwYWNrYWdlLmpzb25gJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIGxvY2F0ZSB0aGUgZGlyIHdpdGggdGhlIGNsb3Nlc3QgYHBhY2thZ2UuanNvbmAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZnMuZmluZFJvb3QoX19kaXJuYW1lKS5zaG91bGQuYmUuYSgnc3RyaW5nJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBwYXRoIGRvZXMgbm90IGhhdmUgYSBwYXJlbnQgYHBhY2thZ2UuanNvbmAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgKCgpID0+IGZzLmZpbmRSb290KCcvJykpLnNob3VsZC50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWFkUGFja2FnZUpzb25Gcm9tKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVzY3JpYmUoJ3doZW4gbm90IHByb3ZpZGVkIGFuIGFyZ3VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCB0aHJvdycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IGZzLnJlYWRQYWNrYWdlSnNvbkZyb20oKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvciwgL25vbi1lbXB0eSwgYWJzb2x1dGUgcGF0aC8pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBhIHJlbGF0aXZlIHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4gZnMucmVhZFBhY2thZ2VKc29uRnJvbSgnLi9mb28nKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiBmcy5yZWFkUGFja2FnZUpzb25Gcm9tKCcnKSkuc2hvdWxkLnRocm93KFR5cGVFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGFuIGFic29sdXRlIHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXNjcmliZSgnd2hlbiB0aGUgcGF0aCBkb2VzIG5vdCBoYXZlIGEgcGFyZW50IGBwYWNrYWdlLmpzb25gJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICgoKSA9PiBmcy5yZWFkUGFja2FnZUpzb25Gcm9tKCcvJykpLnNob3VsZC50aHJvdyhFcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBwYXRoIGhhcyBhIHBhcmVudCBgcGFja2FnZS5qc29uYCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZWFkIHRoZSBgcGFja2FnZS5qc29uYCBmb3VuZCBpbiB0aGUgcm9vdCBkaXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZnMucmVhZFBhY2thZ2VKc29uRnJvbShfX2Rpcm5hbWUpLnNob3VsZC5iZS5hbignb2JqZWN0Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvZnMtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
@@ -1,35 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.MockReadWriteStream = void 0;
7
-
8
- require("source-map-support/register");
9
-
10
- var _events = require("events");
11
-
12
- class MockReadWriteStream extends _events.EventEmitter {
13
- resume() {}
14
-
15
- pause() {}
16
-
17
- setEncoding() {}
18
-
19
- flush() {}
20
-
21
- write(msg) {
22
- this.emit('data', msg);
23
- }
24
-
25
- end() {
26
- this.emit('end');
27
- this.emit('finish');
28
- }
29
-
30
- }
31
-
32
- exports.MockReadWriteStream = MockReadWriteStream;require('source-map-support').install();
33
-
34
-
35
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvaGVscGVycy5qcyJdLCJuYW1lcyI6WyJNb2NrUmVhZFdyaXRlU3RyZWFtIiwiRXZlbnRFbWl0dGVyIiwicmVzdW1lIiwicGF1c2UiLCJzZXRFbmNvZGluZyIsImZsdXNoIiwid3JpdGUiLCJtc2ciLCJlbWl0IiwiZW5kIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFFQSxNQUFNQSxtQkFBTixTQUFrQ0Msb0JBQWxDLENBQStDO0FBQzdDQyxFQUFBQSxNQUFNLEdBQUksQ0FBRTs7QUFFWkMsRUFBQUEsS0FBSyxHQUFJLENBQUU7O0FBRVhDLEVBQUFBLFdBQVcsR0FBSSxDQUFFOztBQUVqQkMsRUFBQUEsS0FBSyxHQUFJLENBQUU7O0FBRVhDLEVBQUFBLEtBQUssQ0FBRUMsR0FBRixFQUFPO0FBQ1YsU0FBS0MsSUFBTCxDQUFVLE1BQVYsRUFBa0JELEdBQWxCO0FBQ0Q7O0FBRURFLEVBQUFBLEdBQUcsR0FBSTtBQUNMLFNBQUtELElBQUwsQ0FBVSxLQUFWO0FBQ0EsU0FBS0EsSUFBTCxDQUFVLFFBQVY7QUFDRDs7QUFoQjRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcblxuY2xhc3MgTW9ja1JlYWRXcml0ZVN0cmVhbSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHJlc3VtZSAoKSB7fVxuXG4gIHBhdXNlICgpIHt9XG5cbiAgc2V0RW5jb2RpbmcgKCkge31cblxuICBmbHVzaCAoKSB7fVxuXG4gIHdyaXRlIChtc2cpIHtcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCBtc2cpO1xuICB9XG5cbiAgZW5kICgpIHtcbiAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgIHRoaXMuZW1pdCgnZmluaXNoJyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTW9ja1JlYWRXcml0ZVN0cmVhbSB9O1xuIl0sImZpbGUiOiJ0ZXN0L2hlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==